Repository: keep-starknet-strange/garaga Branch: main Commit: 307c00af4a7f Files: 465 Total size: 12.8 MB Directory structure: gitextract_6da2_nl2/ ├── .cargo/ │ └── config.toml ├── .claude/ │ ├── commands/ │ │ ├── bump-version.md │ │ └── upgrade-cairo.md │ └── skills/ │ ├── benchmarking-cairo/ │ │ ├── SKILL.md │ │ ├── installation.md │ │ └── profile.py │ └── cairo-coding/ │ ├── SKILL.md │ └── bounded_int_calc.py ├── .github/ │ ├── .all-contributorsrc │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── 01_BUG_REPORT.md │ │ ├── 02_FEATURE_REQUEST.md │ │ ├── 03_CODEBASE_IMPROVEMENT.md │ │ └── config.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── labels.yml │ ├── scripts/ │ │ ├── declare_maintained_contracts.py │ │ └── verify_contracts.py │ └── workflows/ │ ├── cairo.yml │ ├── docs-sync.yml │ ├── e2e.yml │ ├── hydra.yml │ ├── labels.yml │ ├── maturin.yml │ ├── node.yml │ ├── setup.yml │ └── wasm.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .secrets.template ├── .tool-versions ├── CLAUDE.md ├── Cargo.toml ├── LICENSE ├── Makefile ├── README.md ├── Scarb.toml ├── docs/ │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── PYPI_README.md │ ├── SECURITY.md │ ├── benchmarks/ │ │ └── test_summary.json │ └── gitbook/ │ ├── README.md │ ├── SUMMARY.md │ ├── building-powerful-applications.md │ ├── developer-setup-and-guides/ │ │ ├── README.md │ │ ├── garaga-rs-crate/ │ │ │ ├── README.md │ │ │ ├── rust-greater-than-python-bindings.md │ │ │ └── rust-greater-than-wasm-bindings.md │ │ └── working-with-auto-generated-cairo-code.md │ ├── installation/ │ │ ├── README.md │ │ ├── cairo-library.md │ │ ├── developer-setup.md │ │ ├── npm-package.md │ │ ├── python-package.md │ │ └── rust-crate.md │ ├── maintained-smart-contracts/ │ │ ├── README.md │ │ ├── drand.md │ │ ├── risczero.md │ │ └── sp1.md │ ├── security.md │ ├── smart-contract-generators/ │ │ ├── README.md │ │ ├── groth16/ │ │ │ ├── README.md │ │ │ ├── generate-and-deploy-your-verifier-contract.md │ │ │ └── generating-calldata-from-a-proof-and-using-your-deployed-contract/ │ │ │ ├── README.md │ │ │ ├── using-python-garaga-cli.md │ │ │ ├── using-rust.md │ │ │ └── using-typescript.md │ │ └── noir.md │ ├── support.md │ ├── updating-these-docs.md │ └── using-garaga-libraries-in-your-cairo-project/ │ ├── README.md │ ├── ec-multi-scalar-multiplication.md │ ├── ec-signatures.md │ ├── hashing-functions.md │ └── rsa-signatures.md ├── hydra/ │ └── garaga/ │ ├── algebra.py │ ├── curves.py │ ├── drand/ │ │ ├── client.py │ │ └── tlock.py │ ├── extension_field_modulo_circuit.py │ ├── hints/ │ │ ├── bls.py │ │ ├── ecip.py │ │ ├── eisenstein.py │ │ ├── extf_mul.py │ │ ├── fake_glv.py │ │ ├── frobenius.py │ │ ├── io.py │ │ ├── keccak256.py │ │ ├── multi_miller_witness.py │ │ ├── neg_3.py │ │ └── tower_backup.py │ ├── modulo_circuit.py │ ├── modulo_circuit_structs.py │ ├── points.py │ ├── poseidon_transcript.py │ ├── precompiled_circuits/ │ │ ├── all_circuits.py │ │ ├── cofactor_clearing.py │ │ ├── compilable_circuits/ │ │ │ ├── apply_isogeny.py │ │ │ ├── base.py │ │ │ ├── cairo1_mpcheck_circuits.py │ │ │ ├── cairo1_tower_pairing.py │ │ │ ├── common_cairo_fustat_circuits.py │ │ │ ├── rsa.py │ │ │ └── ultra_honk.py │ │ ├── ec.py │ │ ├── final_exp.py │ │ ├── fp2.py │ │ ├── isogeny.py │ │ ├── map_to_curve.py │ │ ├── miller_tower.py │ │ ├── multi_miller_loop.py │ │ ├── multi_pairing_check.py │ │ ├── poseidon_bn254.py │ │ └── zk_honk.py │ ├── rsa_rns.py │ ├── signature.py │ └── starknet/ │ ├── cli/ │ │ ├── declare.py │ │ ├── deploy.py │ │ ├── gen.py │ │ ├── smart_contract_project.py │ │ ├── starknet_cli.py │ │ ├── utils.py │ │ └── verify.py │ ├── constants.py │ ├── groth16_contract_generator/ │ │ ├── calldata.py │ │ ├── examples/ │ │ │ ├── gnark_proof_bn254.json │ │ │ ├── gnark_public_bn254.json │ │ │ ├── gnark_vk_bn254.json │ │ │ ├── proof_bls.json │ │ │ ├── proof_bn254.json │ │ │ ├── proof_risc0.json │ │ │ ├── proof_sp1.json │ │ │ ├── snarkjs_proof_bls12381.json │ │ │ ├── snarkjs_proof_bn254.json │ │ │ ├── snarkjs_public_bls12381.json │ │ │ ├── snarkjs_public_bn254.json │ │ │ ├── snarkjs_vk_bls12381.json │ │ │ ├── snarkjs_vk_bn254.json │ │ │ ├── vk_bls.json │ │ │ ├── vk_bn254.json │ │ │ ├── vk_risc0.json │ │ │ └── vk_sp1.json │ │ ├── generator.py │ │ ├── generator_risc0.py │ │ ├── generator_sp1.py │ │ └── parsing_utils.py │ ├── honk_contract_generator/ │ │ ├── calldata.py │ │ └── generator_honk.py │ └── tests_and_calldata_generators/ │ ├── drand_calldata.py │ ├── map_to_curve.py │ ├── mpcheck.py │ ├── msm.py │ ├── signatures.py │ └── test_writer.py ├── pyproject.toml ├── src/ │ ├── .tool-versions │ ├── Scarb.toml │ ├── contracts/ │ │ ├── autogenerated/ │ │ │ ├── groth16_example_bls12_381/ │ │ │ │ ├── .tool-versions │ │ │ │ ├── Scarb.toml │ │ │ │ ├── src/ │ │ │ │ │ ├── groth16_verifier.cairo │ │ │ │ │ ├── groth16_verifier_constants.cairo │ │ │ │ │ └── lib.cairo │ │ │ │ └── tests/ │ │ │ │ ├── proof_calldata.txt │ │ │ │ └── test_contract.cairo │ │ │ ├── groth16_example_bn254/ │ │ │ │ ├── .tool-versions │ │ │ │ ├── Scarb.toml │ │ │ │ ├── src/ │ │ │ │ │ ├── groth16_verifier.cairo │ │ │ │ │ ├── groth16_verifier_constants.cairo │ │ │ │ │ └── lib.cairo │ │ │ │ └── tests/ │ │ │ │ ├── proof_calldata.txt │ │ │ │ └── test_contract.cairo │ │ │ ├── noir_ultra_keccak_zk_honk_example/ │ │ │ │ ├── .tool-versions │ │ │ │ ├── Scarb.toml │ │ │ │ ├── src/ │ │ │ │ │ ├── honk_verifier.cairo │ │ │ │ │ ├── honk_verifier_circuits.cairo │ │ │ │ │ ├── honk_verifier_constants.cairo │ │ │ │ │ └── lib.cairo │ │ │ │ └── tests/ │ │ │ │ ├── proof_calldata.txt │ │ │ │ └── test_contract.cairo │ │ │ ├── risc0_verifier_bn254/ │ │ │ │ ├── .tool-versions │ │ │ │ ├── Scarb.toml │ │ │ │ ├── src/ │ │ │ │ │ ├── groth16_verifier.cairo │ │ │ │ │ ├── groth16_verifier_constants.cairo │ │ │ │ │ └── lib.cairo │ │ │ │ └── tests/ │ │ │ │ ├── proof_calldata.txt │ │ │ │ └── test_contract.cairo │ │ │ └── sp1_verifier_bn254/ │ │ │ ├── .tool-versions │ │ │ ├── Scarb.toml │ │ │ ├── src/ │ │ │ │ ├── groth16_verifier.cairo │ │ │ │ └── lib.cairo │ │ │ └── tests/ │ │ │ ├── proof_calldata.txt │ │ │ └── test_contract.cairo │ │ ├── drand_decrypt_quicknet/ │ │ │ ├── Scarb.toml │ │ │ └── src/ │ │ │ ├── drand_decrypt.cairo │ │ │ ├── drand_decrypt_constants.cairo │ │ │ └── lib.cairo │ │ ├── drand_quicknet/ │ │ │ ├── .tool-versions │ │ │ ├── Scarb.toml │ │ │ └── src/ │ │ │ ├── drand_verifier.cairo │ │ │ ├── drand_verifier_constants.cairo │ │ │ └── lib.cairo │ │ ├── mutator_set/ │ │ │ ├── .tool-versions │ │ │ ├── Makefile │ │ │ ├── Scarb.toml │ │ │ ├── scripts/ │ │ │ │ ├── prover.py │ │ │ │ └── regenerate_verifier.py │ │ │ ├── snfoundry.toml │ │ │ ├── src/ │ │ │ │ ├── lib.cairo │ │ │ │ ├── mutator_set_contract.cairo │ │ │ │ └── zk_verifier/ │ │ │ │ ├── honk_verifier_circuits.cairo │ │ │ │ ├── honk_verifier_constants.cairo │ │ │ │ └── honk_verifier_contract.cairo │ │ │ ├── tests/ │ │ │ │ └── test_contract.cairo │ │ │ └── zk_program/ │ │ │ ├── Nargo.toml │ │ │ ├── Prover.toml │ │ │ └── src/ │ │ │ ├── main.nr │ │ │ ├── mmr.nr │ │ │ └── mmr_tests.nr │ │ ├── risc0_sample_app/ │ │ │ ├── README.md │ │ │ ├── fibonacci_prover/ │ │ │ │ ├── .gitignore │ │ │ │ ├── Cargo.toml │ │ │ │ ├── README.md │ │ │ │ ├── host/ │ │ │ │ │ ├── Cargo.toml │ │ │ │ │ └── src/ │ │ │ │ │ └── main.rs │ │ │ │ ├── methods/ │ │ │ │ │ ├── Cargo.toml │ │ │ │ │ ├── build.rs │ │ │ │ │ ├── guest/ │ │ │ │ │ │ ├── Cargo.toml │ │ │ │ │ │ └── src/ │ │ │ │ │ │ └── main.rs │ │ │ │ │ └── src/ │ │ │ │ │ └── lib.rs │ │ │ │ └── rust-toolchain.toml │ │ │ └── fibonacci_sequencer/ │ │ │ ├── .gitignore │ │ │ ├── Scarb.toml │ │ │ ├── snfoundry.toml │ │ │ ├── src/ │ │ │ │ └── lib.cairo │ │ │ └── tests/ │ │ │ └── test_contract.cairo │ │ └── universal_ecip/ │ │ ├── Scarb.toml │ │ └── src/ │ │ └── lib.cairo │ ├── corelib_imports/ │ │ ├── README.md │ │ ├── Scarb.toml │ │ └── src/ │ │ └── lib.cairo │ └── src/ │ ├── apps/ │ │ ├── drand.cairo │ │ ├── noir/ │ │ │ └── zk_honk_transcript.cairo │ │ ├── noir.cairo │ │ ├── risc0.cairo │ │ ├── sp1.cairo │ │ └── sp1_constants.cairo │ ├── basic_field_ops.cairo │ ├── circuits/ │ │ ├── README.md │ │ ├── dummy.cairo │ │ ├── ec.cairo │ │ ├── extf_mul.cairo │ │ ├── isogeny.cairo │ │ ├── multi_pairing_check.cairo │ │ ├── rsa.cairo │ │ └── tower_circuits.cairo │ ├── core/ │ │ └── circuit.cairo │ ├── crypto/ │ │ └── mmr.cairo │ ├── definitions/ │ │ ├── curves.cairo │ │ └── structs/ │ │ ├── fields.cairo │ │ └── points.cairo │ ├── definitions.cairo │ ├── ec/ │ │ ├── ec_ops.cairo │ │ ├── ec_ops_g2.cairo │ │ ├── generate_selector_code.py │ │ ├── pairing/ │ │ │ ├── groth16.cairo │ │ │ ├── pairing_check.cairo │ │ │ └── single_pairing_tower.cairo │ │ └── selectors.cairo │ ├── hashes/ │ │ ├── poseidon_bn254.cairo │ │ └── sha_512.cairo │ ├── lib.cairo │ ├── signatures/ │ │ ├── ecdsa.cairo │ │ ├── eddsa_25519.cairo │ │ ├── rsa.cairo │ │ └── schnorr.cairo │ ├── tests/ │ │ ├── autogenerated/ │ │ │ ├── ecdsa_tests.cairo │ │ │ ├── eddsa_tests.cairo │ │ │ ├── msm_tests.cairo │ │ │ ├── pairing_tests.cairo │ │ │ ├── rsa_tests.cairo │ │ │ ├── schnorr_tests.cairo │ │ │ └── tower_pairing_tests.cairo │ │ ├── calldata_tests.cairo │ │ ├── proof_calldata.txt │ │ ├── sha512_tests.cairo │ │ └── sp1_groth_16_tests.cairo │ └── utils/ │ ├── calldata.cairo │ ├── hashing.cairo │ └── neg_3.cairo ├── tests/ │ ├── benchmarks_compiled.py │ ├── benchmarks_manual.py │ ├── conftest.py │ ├── contracts_e2e/ │ │ ├── __init__.py │ │ ├── e2e_test.py │ │ ├── fixtures/ │ │ │ ├── __init__.py │ │ │ ├── accounts.py │ │ │ ├── clients.py │ │ │ ├── constants.py │ │ │ └── devnet.py │ │ ├── install_devnet.sh │ │ ├── test-variables.env.template │ │ └── utils.py │ ├── ed25519_test_vectors.json │ └── hydra/ │ ├── algebra/ │ │ ├── test_polynomial.py │ │ ├── test_pyfelt.py │ │ └── test_tower_final_exp.py │ ├── circuits/ │ │ ├── test_ec.py │ │ ├── test_honk.py │ │ └── test_multi_miller_loop.py │ ├── hints/ │ │ ├── test_ecip.py │ │ ├── test_eisenstein.py │ │ ├── test_fake_glv.py │ │ ├── test_final_exp_witness.py │ │ ├── test_frobenius.py │ │ └── test_neg3.py │ ├── starknet/ │ │ ├── test_calldata.py │ │ ├── test_groth16_vk_proof_parsing.py │ │ ├── test_honk_vk_proof_parsing.py │ │ └── test_signatures_calldata.py │ ├── test_bls18_381_map_to_curve.py │ ├── test_cofactor_clearing.py │ ├── test_drand.py │ ├── test_extension_field_modulo_circuit.py │ ├── test_g1_point.py │ ├── test_g2_point.py │ ├── test_isogeny.py │ ├── test_poseidon_hash.py │ └── test_rsa_rns.py └── tools/ ├── addchain/ │ ├── bls12_381_e.acc │ ├── bls12_381_h3_s.acc │ ├── bn254_exp.acc │ ├── bn254_exp0.acc │ ├── bn254_r_m_d_inv.acc │ └── gen_rust_addchain.py ├── garaga_rs/ │ ├── Cargo.toml │ └── src/ │ ├── algebra/ │ │ ├── extf_mul.rs │ │ ├── g1g2pair.rs │ │ ├── g1point.rs │ │ ├── g2point.rs │ │ ├── polynomial.rs │ │ └── rational_function.rs │ ├── calldata/ │ │ ├── drand_calldata.rs │ │ ├── drand_tlock_calldata.rs │ │ ├── full_proof_with_hints/ │ │ │ ├── groth16.rs │ │ │ └── zk_honk.rs │ │ ├── mod.rs │ │ ├── mpc_calldata.rs │ │ ├── msm_calldata.rs │ │ └── signatures.rs │ ├── constants.rs │ ├── crypto/ │ │ ├── digest.rs │ │ ├── merkle_tree.rs │ │ ├── mmr/ │ │ │ ├── mmr_accumulator.rs │ │ │ ├── mmr_membership_proof.rs │ │ │ ├── mmr_successor_proof.rs │ │ │ ├── mmr_trait.rs │ │ │ ├── shared_advanced.rs │ │ │ └── shared_basic.rs │ │ └── poseidon_bn254.rs │ ├── definitions.rs │ ├── ecip/ │ │ ├── core.rs │ │ └── ff.rs │ ├── frobenius.rs │ ├── hints/ │ │ ├── eisenstein.rs │ │ └── fake_glv.rs │ ├── io.rs │ ├── lib.rs │ ├── pairing/ │ │ ├── final_exp_witness/ │ │ │ ├── addchain_pow_generated.rs │ │ │ ├── bls12_381_final_exp_witness.rs │ │ │ ├── bn254_final_exp_witness.rs │ │ │ └── mod.rs │ │ ├── multi_miller_loop.rs │ │ └── multi_pairing_check.rs │ ├── poseidon_transcript.rs │ ├── python_bindings/ │ │ ├── drand_calldata.rs │ │ ├── ecip.rs │ │ ├── extf_mul.rs │ │ ├── final_exp_witness.rs │ │ ├── g2.rs │ │ ├── groth16_calldata.rs │ │ ├── hades_permutation.rs │ │ ├── mod.rs │ │ ├── mpc_calldata.rs │ │ ├── msm.rs │ │ ├── pairing.rs │ │ ├── signatures.rs │ │ └── zk_honk_calldata.rs │ └── wasm_bindings.rs ├── make/ │ ├── bytecode_check.sh │ ├── bytecode_check_max_log_n.sh │ ├── check_sierra_size.py │ ├── ci_cairo.sh │ ├── ci_e2e.sh │ ├── ci_hydra.sh │ ├── ci_wasm.sh │ ├── common.sh │ ├── constants.json │ ├── generate_constants.py │ ├── rewrite.sh │ ├── setup.sh │ ├── steps.sh │ ├── test_contracts.sh │ ├── update_bench_in_readme.py │ ├── update_risc0_class_hash.sh │ ├── wasm-test-gen.sh │ └── wasm.sh ├── noir/ │ ├── Makefile │ ├── hello/ │ │ ├── Nargo.toml │ │ ├── Prover.toml │ │ └── src/ │ │ └── main.nr │ ├── run.sh │ └── transcript.py ├── npm/ │ ├── garaga_ts/ │ │ ├── .gitignore │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── babel.config.cjs │ │ ├── docker-compose.yml │ │ ├── fix-chown.sh │ │ ├── jest.config.ts │ │ ├── patch.wasm.cjs │ │ ├── rollup.config.js │ │ ├── src/ │ │ │ ├── constants.ts │ │ │ ├── node/ │ │ │ │ ├── api.ts │ │ │ │ ├── definitions.ts │ │ │ │ ├── hints/ │ │ │ │ │ └── io.ts │ │ │ │ ├── index.ts │ │ │ │ └── starknet/ │ │ │ │ ├── groth16ContractGenerator/ │ │ │ │ │ └── parsingUtils.ts │ │ │ │ └── honkContractGenerator/ │ │ │ │ └── parsingUtils.ts │ │ │ └── wasm/ │ │ │ └── pkg/ │ │ │ ├── garaga_rs.d.ts │ │ │ ├── garaga_rs.js │ │ │ ├── garaga_rs_bg.wasm.d.ts │ │ │ └── garaga_rs_bg.wasm.js │ │ └── tests/ │ │ └── starknet/ │ │ ├── drandCalldata.test.ts │ │ ├── drandTlockCalldata.test.ts │ │ ├── groth16Calldata.test.ts │ │ ├── groth16VkProofParsing.test.ts │ │ ├── poseidonHash.test.ts │ │ ├── signaturesCalldata.test.ts │ │ └── zkHonkCalldata.test.ts │ └── integration-test-suite/ │ ├── .gitignore │ └── packages/ │ ├── nodejs-ts-cjs-tsc/ │ │ ├── .gitignore │ │ ├── output.txt │ │ └── src/ │ │ ├── examples.ts │ │ └── index.ts │ ├── nodejs-ts-esm-tsc/ │ │ ├── .gitignore │ │ ├── output.txt │ │ └── src/ │ │ ├── examples.ts │ │ └── index.ts │ ├── web-js-esm-react/ │ │ ├── .gitignore │ │ ├── next.config.mjs │ │ ├── output.txt │ │ ├── scrape.cjs │ │ └── src/ │ │ └── app/ │ │ ├── examples.js │ │ ├── layout.js │ │ └── page.js │ └── web-js-esm-webpack/ │ ├── .gitignore │ ├── output.txt │ ├── scrape.cjs │ ├── src/ │ │ ├── bootstrap.js │ │ ├── examples.js │ │ └── index.js │ └── webpack.config.js ├── process_manager.py └── profile_tests.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .cargo/config.toml ================================================ [build] target-dir = ".cargo/garaga_rs/target" ================================================ FILE: .claude/commands/bump-version.md ================================================ # Bump Garaga Version Bump the garaga version across the entire codebase (Python, Rust, Cairo, TypeScript, docs). ## Arguments The user provides: - **NEW_VERSION**: The new garaga version (e.g. `1.0.2`) ## Procedure ### Step 0: Detect current version Read `tools/make/constants.json` and extract `release_info.garaga_version`. This is the OLD version that will be replaced everywhere. Present the current version to the user and confirm the target version before proceeding. If the user already provided an explicit version number as an argument, skip the proposal and use it directly. ### Step 1: Update `tools/make/constants.json` Update `release_info.garaga_version` to the new version. ### Step 2: Run `generate_constants.py` Run `make constants` from the project root. This auto-regenerates the constants files AND updates version references in: - `hydra/garaga/starknet/constants.py` - `tools/garaga_rs/src/constants.rs` - `tools/npm/garaga_ts/src/constants.ts` - `pyproject.toml` (package version) - `tools/garaga_rs/Cargo.toml` (package version) - `tools/npm/garaga_ts/package.json` (package version) - `docs/PYPI_README.md` (pip install version) - `tools/npm/garaga_ts/README.md` (API doc link) - `docs/gitbook/smart-contract-generators/noir.md` (Garaga CLI version line only) If the script fails, fall back to manually editing each of these files. ### Step 3: Update `src/Scarb.toml` Update the `version = "OLD"` field (line near the top, under `[package]`) to the new version. ### Step 4: Update `Cargo.lock` Run `cargo update -p garaga_rs` from the project root to sync the lock file with the new Cargo.toml version. ### Step 5: Run `make rewrite` Run `make rewrite` from the project root. This regenerates all autogenerated contracts under `src/contracts/autogenerated/` which embed the garaga version in comments and Scarb.toml files. This takes a few minutes. The makefile activates the venv automatically. If it fails, report the error. ### Step 6: Update documentation Replace ALL occurrences of the old garaga version with the new one in these documentation files: - `docs/gitbook/README.md` - `docs/gitbook/installation/README.md` - `docs/gitbook/installation/cairo-library.md` - `docs/gitbook/installation/npm-package.md` - `docs/gitbook/installation/python-package.md` - `docs/gitbook/installation/rust-crate.md` - `docs/gitbook/maintained-smart-contracts/README.md` - `docs/gitbook/maintained-smart-contracts/risczero.md` - `docs/gitbook/security.md` - `docs/gitbook/smart-contract-generators/groth16/generate-and-deploy-your-verifier-contract.md` - `docs/gitbook/using-garaga-libraries-in-your-cairo-project/README.md` - `docs/gitbook/using-garaga-libraries-in-your-cairo-project/ec-multi-scalar-multiplication.md` Version appears in several forms that must ALL be updated: - Bare version: `1.0.1` (in Scarb.toml examples, pip install, npm install, class hash headers) - Prefixed with `v`: `v1.0.1` (in git tags, release links, Cargo.toml git tag references) - Prefixed with `==`: `==1.0.1` (pip install commands) - Prefixed with `@`: `@1.0.1` (npm/scarb add commands) Be thorough: read each file, find all old version occurrences, and replace them. Do NOT change version numbers that belong to other tools (Cairo, Scarb, Noir, Barretenberg, RiscZero, SP1, Starknet Foundry). ### Step 7: Verify Run a grep for the old version across the repo: ``` grep -r "OLD_VERSION" --include="*.toml" --include="*.yml" --include="*.json" --include="*.py" --include="*.rs" --include="*.ts" --include="*.md" --include="*.sh" . ``` Report any remaining references. Some may be intentional (e.g. changelogs, historical references). Flag anything that looks like it should have been updated. ## Notes - The `generate_constants.py` script handles: constants files (Python/Rust/TS), `pyproject.toml`, `Cargo.toml`, `package.json`, `PYPI_README.md`, `npm README.md`, and Noir docs version line. Everything else must be updated manually. - `make rewrite` regenerates everything under `src/contracts/autogenerated/`. Never manually edit those files. - The `src/Scarb.toml` version must be updated manually (Step 3) as `generate_constants.py` does not touch it. - Documentation (Step 6) is the most labor-intensive part. Be careful to only replace the garaga version, not versions of other tools. ================================================ FILE: .claude/commands/upgrade-cairo.md ================================================ # Upgrade Cairo Version Upgrade the Cairo/Scarb version (and optionally the Starknet Foundry version) across the entire codebase. ## Arguments The user provides: - **NEW_CAIRO_VERSION**: The new Cairo/Scarb version (e.g. `2.16.0`) - **NEW_FOUNDRY_VERSION** (optional): The new Starknet Foundry version (e.g. `0.58.0`). If not provided, keep the current Foundry version unchanged. ## Procedure ### Step 0: Detect current versions and propose latest available Read `tools/make/constants.json` to extract the current `cairo_version` and `starknet_foundry_version`. These are the OLD versions that will be replaced everywhere. Then query asdf for the latest available versions: - Run `asdf list all scarb` and pick the latest stable version (no `-rc`, `-alpha`, `-beta`, `-nightly` suffixes). - Run `asdf list all starknet-foundry` and pick the latest stable version. Present the current and latest available versions to the user, e.g.: ``` Current: scarb 2.14.0, starknet-foundry 0.53.0 Latest: scarb 2.16.1, starknet-foundry 0.58.0 ``` Ask the user to confirm the target versions before proceeding. If the user already provided explicit version numbers as arguments, skip the proposal and use those directly. ### Step 1: Update `tools/make/constants.json` Update `release_info.cairo_version` to the new Cairo version. If a new Foundry version was provided, also update `release_info.starknet_foundry_version`. ### Step 2: Run `generate_constants.py` Run `make constants` from the project root (the makefile activates the venv automatically). This auto-regenerates: - `hydra/garaga/starknet/constants.py` (CAIRO_VERSION, STARKNET_FOUNDRY_VERSION) - `tools/garaga_rs/src/constants.rs` - `tools/npm/garaga_ts/src/constants.ts` If the script fails (e.g. missing dependencies), fall back to manually editing `hydra/garaga/starknet/constants.py` to update `CAIRO_VERSION` and `STARKNET_FOUNDRY_VERSION`. ### Step 3: Update root `Scarb.toml` Update `[workspace.dependencies]`: - `cairo_test = "OLD"` → `"NEW_CAIRO_VERSION"` - `starknet = "OLD"` → `"NEW_CAIRO_VERSION"` ### Step 4: Update `src/Scarb.toml` Update: - `starknet = "..."` → `"NEW_CAIRO_VERSION"` (in `[dependencies]`) - `assert_macros = "..."` → `"NEW_CAIRO_VERSION"` (in `[dev-dependencies]`) - `cairo_execute = "..."` → `"NEW_CAIRO_VERSION"` (in `[dev-dependencies]`) - If new Foundry version provided: `snforge_std = "..."` → `"NEW_FOUNDRY_VERSION"` (in `[dev-dependencies]`) ### Step 5: Update `src/corelib_imports/Scarb.toml` Update `cairo_test = "..."` → `"NEW_CAIRO_VERSION"` (in `[dev-dependencies]`). ### Step 6: Update `.tool-versions` files Update the root `.tool-versions`: - `scarb OLD` → `scarb NEW_CAIRO_VERSION` - If new Foundry version: `starknet-foundry OLD` → `starknet-foundry NEW_FOUNDRY_VERSION` Update `src/.tool-versions`: - `scarb OLD` → `scarb NEW_CAIRO_VERSION` - If new Foundry version: `starknet-foundry OLD` → `starknet-foundry NEW_FOUNDRY_VERSION` After updating both `.tool-versions` files, run `asdf install` from the project root to install the new tool versions. Report the output to the user. If asdf is not available or fails, tell the user to manually install the required scarb and starknet-foundry versions. ### Step 7: Update manual (non-autogenerated) contract `Scarb.toml` files The following contract directories are NOT auto-generated by `make rewrite` and must be updated manually: - `src/contracts/drand_quicknet/Scarb.toml` - `src/contracts/drand_decrypt_quicknet/Scarb.toml` - `src/contracts/mutator_set/Scarb.toml` - `src/contracts/universal_ecip/Scarb.toml` - `src/contracts/risc0_sample_app/fibonacci_sequencer/Scarb.toml` In each, update: - `starknet = "OLD_CAIRO"` → `"NEW_CAIRO_VERSION"` - `assert_macros = "OLD_CAIRO"` → `"NEW_CAIRO_VERSION"` (if present) - If new Foundry version: `snforge_std = "OLD_FOUNDRY"` → `"NEW_FOUNDRY_VERSION"` (if present) Also update any `.tool-versions` files in these directories (currently only `src/contracts/drand_quicknet/.tool-versions` and `src/contracts/mutator_set/.tool-versions` exist). **DO NOT** manually edit files under `src/contracts/autogenerated/` — those are regenerated by `make rewrite` in the next step. ### Step 8: Run `make rewrite` Run `make rewrite` from the project root. This regenerates: - All `src/contracts/autogenerated/*/Scarb.toml` (using CAIRO_VERSION from constants.py) - All `src/contracts/autogenerated/*/.tool-versions` (using CAIRO_VERSION and STARKNET_FOUNDRY_VERSION from constants.py) - All Cairo circuit files under `src/src/circuits/` - All autogenerated contract source code and tests This takes a few minutes. The makefile activates the venv automatically. If it fails, report the error — the user may need to run `make setup` first. ### Step 9: Update CI workflows Update `scarb-version: "OLD"` → `"NEW_CAIRO_VERSION"` in: - `.github/workflows/e2e.yml` - `.github/workflows/hydra.yml` - `.github/workflows/maturin.yml` - `.github/workflows/wasm.yml` Only update lines that contain `scarb-version:`. ### Step 10: Update `tools/make/setup.sh` Replace all occurrences of the old Cairo version with the new one in the Scarb version check block near the end of the file (the `grep -q` line and the two echo lines that mention the version). ### Step 11: Update documentation Update the old Cairo/Scarb version string to the new one in: - `README.md` - `docs/gitbook/installation/developer-setup.md` - `docs/gitbook/maintained-smart-contracts/risczero.md` - `docs/CONTRIBUTING.md` Only change lines that reference Scarb version numbers. If new Foundry version provided, also update any Foundry version references in these docs. ### Step 12: Update hardcoded class hashes The Cairo compiler version affects compiled Sierra output, so all hardcoded class hashes must be recomputed. **ECIP class hash** — used by all Groth16 verifier contracts: 1. `cd src/contracts/universal_ecip && scarb build` 2. `sncast utils class-hash --contract-name UniversalECIP` → copy the hash (strip leading zeros after `0x`) 3. Update `ECIP_OPS_CLASS_HASH` in `hydra/garaga/starknet/groth16_contract_generator/generator.py` 4. Re-run `make rewrite` to regenerate autogenerated contracts with the new hash **RISC0 verifier class hash** — used by the fibonacci_sequencer sample app: Run `make update-risc0-class-hash` (this builds, computes, and patches automatically). ### Step 13: Verify Run `grep -r "OLD_CAIRO_VERSION" --include="*.toml" --include="*.yml" --include="*.json" --include="*.py" --include="*.sh" --include="*.md" .` to check for any remaining references to the old version. Report any stragglers found (some may be intentional, e.g. changelogs). ### Step 14: Test compilation Run `cd src && scarb build` to verify the new version compiles. If it fails with type errors on `const` declarations (e.g. `E2126: Constant type must not depend on its value`), the Cairo version may require explicit generic type parameters. Update the Python generators in `hydra/garaga/starknet/groth16_contract_generator/` and `hydra/garaga/starknet/honk_contract_generator/` to emit the required generics (e.g. `Groth16VerifyingKey`, `G2Line`), then fix the generated `.cairo` files and re-run `make rewrite`. ### Step 15: Run black formatting check Run `source venv/bin/activate && black --target-version py310 --check hydra/` to verify Python formatting passes. The pre-commit hook and CI both use `--target-version py310` to avoid formatting differences across Python versions. If files need reformatting, run `black --target-version py310 hydra/` and include the changes. ## Notes - This procedure does NOT modify Cairo source code. If the new Cairo version introduces breaking language changes, those must be handled separately. - The `generate_constants.py` script propagates constants from `constants.json` into Python/Rust/TS constants files — it does NOT touch Scarb.toml or .tool-versions files. - `make rewrite` auto-generates everything under `src/contracts/autogenerated/` and `src/src/circuits/`. Never manually edit those — they will be overwritten. - Manual contracts (`drand_quicknet`, `drand_decrypt_quicknet`, `mutator_set`, `universal_ecip`, `fibonacci_sequencer`) must be updated by hand since they are not regenerated. - The pre-commit hook uses black from `.pre-commit-config.yaml` (must match the version in `tools/make/requirements.txt`). If they diverge, formatting will pass locally but fail in CI. ================================================ FILE: .claude/skills/benchmarking-cairo/SKILL.md ================================================ --- name: benchmarking-cairo description: Use when profiling Cairo functions, measuring step counts, analyzing resource usage, generating call-graph PNGs, or launching pprof to visualize Cairo execution traces --- # Benchmarking Cairo ## Overview Profile Cairo function execution to identify hotspots by steps, calls, range checks, and other builtins. Works with both `scarb execute` (standalone programs) and `snforge test` (Starknet Foundry tests). If tools are missing, see `installation.md` in this skill directory. The CLI script is `profile.py` in this skill directory. ## REQUIRED: Use the CLI **Always use `python3 profile.py profile` (from this skill directory) for profiling.** Do NOT run snforge/cairo-profiler/pprof manually — the CLI handles the full pipeline deterministically (trace generation, profile building, PNG export, naming). ### snforge mode (test functions) ```bash python3 profile.py profile \ --mode snforge \ --package falcon \ --test test_ntt_zknox_vs_felt252 \ --name ntt-zknox-reduced \ --metric steps ``` ### scarb mode (standalone executables) ```bash python3 profile.py profile \ --mode scarb \ --package falcon \ --executable bench_ntt \ --args-file tests/data/ntt_input_512.json \ --name ntt-felt252 \ --metric steps ``` ### CLI arguments | Argument | Required | Description | |----------|----------|-------------| | `--mode` | yes | `snforge` or `scarb` | | `--package` | yes | Scarb package name (e.g. `falcon`) | | `--name` | yes | Human-friendly profile label (e.g. `ntt-zknox-reduced`) | | `--test` | snforge | Test filter passed to `snforge test` | | `--executable` | scarb | Executable name for `scarb execute` | | `--args-file` | no | Arguments file for `scarb execute` | | `--metric` | no | `steps` (default), `rc`, `sierra-gas`, `l2-gas` | | `--output` | no | Output directory (default: `profiles/`) | | `--nodefraction` | no | Hide PNG nodes below this fraction of total (default: `0.005`). Use `0` to show all nodes. | | `--edgefraction` | no | Hide PNG edges below this fraction of total (default: `0.001`). Use `0` to show all edges. | ### CLI exit codes — act on errors | Code | Meaning | What to do | |------|---------|------------| | 0 | Success | Read the PNG path from output | | 1 | Argument error | Fix the CLI invocation | | 2 | snforge/scarb failed | Check compilation errors, test failures | | 3 | Trace file not found | Test must PASS to produce a trace. Check test name matches exactly. | | 4 | cairo-profiler failed | Check trace JSON is valid | | 5 | pprof PNG export failed | Check graphviz is installed (`apt install graphviz`) | | 6 | Missing tool | Install the missing tool (see `installation.md`) | ### Output The CLI produces two files in `profiles/`: ``` profiles/YY-MM-DD-HH:MM____.pb.gz profiles/YY-MM-DD-HH:MM____.png ``` After running the CLI, **always read the PNG** to verify the profile shows the expected functions. ## Pitfalls ### Stale trace files `snfoundry_trace/` keeps old traces. If you change code and re-profile, you MUST re-run `snforge test --save-trace-data` (the CLI does this automatically). **Never build a profile from a trace that predates your code change.** ### Missing functions in the PNG If a function doesn't appear in the PNG, it may be below the `--nodefraction` threshold. Use `--nodefraction 0` to show all nodes. You can also check the text output (printed by the CLI) — functions with 0 flat steps but high cumulative steps are wrappers that delegate all work to callees. ### Timestamp mismatch between pb.gz and png When running steps manually, the pb.gz and png may get different timestamps if they cross a minute boundary. The CLI computes the timestamp once so both files always match. ## Manual profiling (advanced) For interactive exploration beyond what the CLI provides: ```bash # Launch web UI for interactive flame graphs pprof -http=:8080 profiles/.pb.gz # View specific sample in terminal cairo-profiler view profiles/.pb.gz --sample steps --limit 20 # List available samples cairo-profiler view profiles/.pb.gz --list-samples ``` ## Metric reference | `--metric` | tracked-resource | Samples in profile | |------------|------------------|--------------------| | `steps` | `cairo-steps` | steps, calls, range check builtin, memory holes, casm size | | `rc` | `cairo-steps` | (same as steps, PNG shows range check builtin) | | `sierra-gas` | `sierra-gas` | sierra gas, calls, casm size | | `l2-gas` | `sierra-gas` | l2 gas (requires `enable-gas = true` + dispatcher pattern) | ## L2 Gas profiling (snforge) L2 gas requires **all three**: 1. `[cairo] enable-gas = true` in Scarb.toml 2. `--metric l2-gas` (uses sierra-gas tracking) 3. **Dispatcher pattern** — profiled code must run inside a deployed contract ```cairo #[starknet::interface] trait IBench { fn my_function(self: @TContractState) -> felt252; } #[starknet::contract] mod bench { /* ... */ } // Test using dispatcher #[test] fn bench_my_function() { let contract = declare("bench").unwrap().contract_class(); let (addr, _) = contract.deploy(@array![]).unwrap(); let dispatcher = IBenchDispatcher { contract_address: addr }; dispatcher.my_function(); } ``` **Known limitation:** Syscall execution costs (secp256r1, keccak, etc.) are not attributed in the l2 gas profile. Use snforge test output for total gas; use profiler for relative hotspot analysis within Cairo code. ================================================ FILE: .claude/skills/benchmarking-cairo/installation.md ================================================ # Tool Installation for Cairo Benchmarking ## Scarb (Cairo build tool & package manager) ```bash # Via asdf (recommended) asdf plugin add scarb asdf install scarb latest asdf global scarb latest # Or via installer curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh ``` Verify: `scarb --version` ## Starknet Foundry (snforge) ```bash # Via snfoundryup installer curl -L https://raw.githubusercontent.com/foundry-rs/starknet-foundry/master/scripts/install.sh | sh snfoundryup # Or via asdf asdf plugin add starknet-foundry asdf install starknet-foundry latest asdf global starknet-foundry latest ``` Verify: `snforge --version` ## cairo-profiler ```bash # Via curl (Linux/macOS) curl -L https://raw.githubusercontent.com/software-mansion/cairo-profiler/main/scripts/install.sh | sh # Or via asdf asdf plugin add cairo-profiler asdf install cairo-profiler latest asdf global cairo-profiler latest ``` Verify: `cairo-profiler --version` GitHub: https://github.com/software-mansion/cairo-profiler ## pprof (Google profiling visualization) Requires Go toolchain: ```bash # Install Go (if not present) # See https://go.dev/doc/install # Install pprof go install github.com/google/pprof@latest ``` Ensure `$(go env GOPATH)/bin` is in your `PATH`. Verify: `pprof -h` ## Graphviz (required by pprof for PNG/SVG/PDF output) ```bash # Debian/Ubuntu sudo apt-get install graphviz # macOS brew install graphviz # Fedora sudo dnf install graphviz ``` Verify: `dot -V` ================================================ FILE: .claude/skills/benchmarking-cairo/profile.py ================================================ #!/usr/bin/env python3 """ Cairo profiling CLI — deterministic pipeline for generating profiles. Usage: # snforge mode (run test, build profile, export PNG) python3 profile.py profile \ --mode snforge \ --package falcon \ --test test_ntt_zknox_vs_felt252 \ --name ntt-zknox-reduced \ --metric steps # scarb execute mode python3 profile.py profile \ --mode scarb \ --package falcon \ --executable bench_ntt \ --args-file tests/data/ntt_input_512.json \ --name ntt-felt252 \ --metric steps Exit codes: 0 Success 1 Argument error 2 snforge/scarb execution failed 3 Trace file not found after execution 4 cairo-profiler build failed 5 pprof PNG export failed 6 Missing external tool (snforge, scarb, cairo-profiler, pprof) """ import argparse import glob import os import subprocess import sys from datetime import datetime from pathlib import Path # --------------------------------------------------------------------------- # Helpers # --------------------------------------------------------------------------- def _check_tool(name: str) -> str: """Return path to tool or exit with code 6.""" import shutil path = shutil.which(name) if path is None: _fail(6, f"Required tool '{name}' not found on PATH. See installation.md.") return path def _fail(code: int, msg: str) -> None: """Print error and exit.""" print(f"ERROR [{code}]: {msg}", file=sys.stderr) sys.exit(code) def _run( cmd: list[str], cwd: str | None = None, timeout: int = 600 ) -> subprocess.CompletedProcess: """Run a command, printing it first. Returns CompletedProcess.""" print(f" $ {' '.join(cmd)}") return subprocess.run(cmd, cwd=cwd, timeout=timeout, capture_output=False) def _git_short_hash(repo_root: str) -> str: """Return short git hash or 'unknown'.""" try: result = subprocess.run( ["git", "rev-parse", "--short", "HEAD"], cwd=repo_root, capture_output=True, text=True, timeout=5, ) return result.stdout.strip() if result.returncode == 0 else "unknown" except Exception: return "unknown" def _profile_filename( output_dir: str, package: str, name: str, metric: str, commit: str, ext: str ) -> str: """Generate deterministic profile filename.""" ts = datetime.now().strftime("%y-%m-%d-%H:%M") return os.path.join(output_dir, f"{ts}_{package}_{name}_{metric}_{commit}.{ext}") # --------------------------------------------------------------------------- # Metric → sample mapping # --------------------------------------------------------------------------- METRIC_CONFIG = { "steps": { "tracked_resource": "cairo-steps", "sample_name": "steps", "pprof_sample_index": "steps", }, "rc": { "tracked_resource": "cairo-steps", "sample_name": "range check builtin", "pprof_sample_index": "range_check_builtin", }, "sierra-gas": { "tracked_resource": "sierra-gas", "sample_name": "sierra gas", "pprof_sample_index": "sierra_gas", }, "l2-gas": { "tracked_resource": "sierra-gas", "sample_name": "l2 gas", "pprof_sample_index": "l2_gas", }, } # --------------------------------------------------------------------------- # Pipeline steps # --------------------------------------------------------------------------- def _find_package_dir(repo_root: str, package: str) -> str: """Resolve package directory from workspace.""" pkg_dir = os.path.join(repo_root, "packages", package) if os.path.isdir(pkg_dir) and os.path.isfile(os.path.join(pkg_dir, "Scarb.toml")): return pkg_dir # Maybe it's a top-level package if os.path.isfile(os.path.join(repo_root, "Scarb.toml")): return repo_root _fail( 1, f"Cannot find package '{package}'. Looked in packages/{package}/ and repo root.", ) return "" # unreachable def _step_snforge(pkg_dir: str, test_filter: str, tracked_resource: str) -> None: """Run snforge test with trace generation.""" _check_tool("snforge") print( f"\n[1/4] Running snforge test (filter: {test_filter}, resource: {tracked_resource})" ) result = _run( [ "snforge", "test", test_filter, "--save-trace-data", "--tracked-resource", tracked_resource, ], cwd=pkg_dir, timeout=600, ) if result.returncode != 0: _fail(2, f"snforge test failed with exit code {result.returncode}") def _step_scarb(pkg_dir: str, executable: str, args_file: str) -> None: """Run scarb execute with trace generation.""" _check_tool("scarb") print(f"\n[1/4] Running scarb execute (executable: {executable})") cmd = [ "scarb", "execute", "--executable-name", executable, "--print-resource-usage", "--save-profiler-trace-data", ] if args_file: cmd.extend(["--arguments-file", args_file]) result = _run(cmd, cwd=pkg_dir, timeout=600) if result.returncode != 0: _fail(2, f"scarb execute failed with exit code {result.returncode}") def _find_trace_snforge(pkg_dir: str, test_filter: str) -> str: """Find the trace JSON generated by snforge.""" trace_dir = os.path.join(pkg_dir, "snfoundry_trace") if not os.path.isdir(trace_dir): # In workspace setups, snforge may create trace in a member subdir. # Search for snfoundry_trace under pkg_dir. for root, dirs, _files in os.walk(pkg_dir): if "snfoundry_trace" in dirs: trace_dir = os.path.join(root, "snfoundry_trace") break else: _fail( 3, f"Trace directory not found: {os.path.join(pkg_dir, 'snfoundry_trace')}\n" f" Also searched subdirectories of {pkg_dir}\n" f" Did snforge run successfully? Check that the test passed.", ) # snforge names traces like: __.json # It replaces "::" with "_" in filenames, so normalize the filter. filter_normalized = test_filter.replace("::", "_") pattern = os.path.join(trace_dir, f"*{filter_normalized}*.json") matches = sorted(glob.glob(pattern), key=os.path.getmtime, reverse=True) if not matches: # Also try the original filter in case naming convention differs pattern = os.path.join(trace_dir, f"*{test_filter}*.json") matches = sorted(glob.glob(pattern), key=os.path.getmtime, reverse=True) if not matches: # List what IS there for debugging all_traces = glob.glob(os.path.join(trace_dir, "*.json")) available = ( "\n ".join(os.path.basename(f) for f in all_traces) if all_traces else "(none)" ) _fail( 3, f"No trace file matching '*{test_filter}*' in {trace_dir}/\n" f" Available traces:\n {available}\n" f" Hint: The test must PASS to generate a trace. Failing/filtered tests produce no trace.", ) if len(matches) > 1: print(f" Warning: Multiple traces match '{test_filter}', using most recent:") for m in matches: print(f" {os.path.basename(m)}") trace = matches[0] print(f" Trace: {os.path.basename(trace)}") return trace def _find_trace_scarb(pkg_dir: str, package: str) -> str: """Find the trace JSON generated by scarb execute.""" # Standard location: target/execute//execution1/cairo_profiler_trace.json trace = os.path.join( pkg_dir, "target", "execute", package, "execution1", "cairo_profiler_trace.json" ) if not os.path.isfile(trace): _fail( 3, f"Trace file not found: {trace}\n" f" Expected at: target/execute/{package}/execution1/cairo_profiler_trace.json\n" f" Did scarb execute succeed? Check --save-profiler-trace-data was used.", ) print(f" Trace: {trace}") return trace def _step_build_profile(trace_path: str, output_path: str) -> None: """Build pprof profile from trace JSON.""" _check_tool("cairo-profiler") print(f"\n[3/4] Building profile: {os.path.basename(output_path)}") result = _run( [ "cairo-profiler", "build-profile", trace_path, "--show-libfuncs", "--output-path", output_path, ] ) if result.returncode != 0: _fail( 4, f"cairo-profiler build-profile failed with exit code {result.returncode}\n" f" Trace: {trace_path}", ) if not os.path.isfile(output_path): _fail(4, f"cairo-profiler completed but output file not found: {output_path}") def _step_view_profile(profile_path: str, sample_name: str) -> None: """Print top-20 functions by the chosen sample.""" print(f"\n Top functions by {sample_name}:") _run( [ "cairo-profiler", "view", profile_path, "--sample", sample_name, "--limit", "20", ] ) def _step_export_png( profile_path: str, png_path: str, pprof_sample_index: str, nodefraction: float = 0.005, edgefraction: float = 0.001, ) -> None: """Export PNG call graph via pprof.""" _check_tool("pprof") print(f"\n[4/4] Exporting PNG: {os.path.basename(png_path)}") result = _run( [ "pprof", "-png", f"-sample_index={pprof_sample_index}", f"-nodefraction={nodefraction}", f"-edgefraction={edgefraction}", "-output", png_path, profile_path, ] ) if result.returncode != 0: _fail( 5, f"pprof PNG export failed with exit code {result.returncode}\n" f" Profile: {profile_path}\n" f" Hint: Is graphviz (dot) installed? Run: apt install graphviz", ) if not os.path.isfile(png_path): _fail(5, f"pprof completed but PNG not found: {png_path}") # --------------------------------------------------------------------------- # Main # --------------------------------------------------------------------------- def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( prog="profile.py", description="Cairo profiling CLI — run tests, build profiles, export PNGs.", ) sub = parser.add_subparsers(dest="command") p = sub.add_parser("profile", help="Full profiling pipeline") p.add_argument( "--mode", required=True, choices=["snforge", "scarb"], help="Execution mode: snforge (test) or scarb (executable)", ) p.add_argument("--package", required=True, help="Scarb package name (e.g. falcon)") p.add_argument( "--name", required=True, help="Human-friendly profile name (e.g. ntt-zknox-reduced)", ) p.add_argument( "--metric", default="steps", choices=list(METRIC_CONFIG.keys()), help="Metric to profile (default: steps)", ) p.add_argument( "--output", default="profiles", help="Output directory (default: profiles/)" ) # snforge-specific p.add_argument( "--test", default=None, help="[snforge] Test filter (e.g. test_ntt_zknox_vs_felt252)", ) # scarb-specific p.add_argument("--executable", default=None, help="[scarb] Executable name") p.add_argument("--args-file", default=None, help="[scarb] Arguments file path") # pprof display options p.add_argument( "--nodefraction", type=float, default=0.005, help="Hide nodes below this fraction of total (default: 0.005). Use 0 to show all.", ) p.add_argument( "--edgefraction", type=float, default=0.001, help="Hide edges below this fraction of total (default: 0.001). Use 0 to show all.", ) return parser def main() -> int: parser = build_parser() args = parser.parse_args() if args.command != "profile": parser.print_help() return 1 # Validate mode-specific args if args.mode == "snforge" and not args.test: _fail( 1, "--test is required for snforge mode.\n" " Example: --test test_ntt_zknox_vs_felt252", ) if args.mode == "scarb" and not args.executable: _fail( 1, "--executable is required for scarb mode.\n" " Example: --executable bench_ntt", ) # Resolve paths repo_root = _find_repo_root() pkg_dir = _find_package_dir(repo_root, args.package) output_dir = os.path.join(repo_root, args.output) os.makedirs(output_dir, exist_ok=True) commit = _git_short_hash(repo_root) metric_cfg = METRIC_CONFIG[args.metric] # Generate output filenames pb_path = _profile_filename( output_dir, args.package, args.name, args.metric, commit, "pb.gz" ) png_path = _profile_filename( output_dir, args.package, args.name, args.metric, commit, "png" ) print(f"Cairo Profiling Pipeline") print(f" Mode: {args.mode}") print(f" Package: {args.package} ({pkg_dir})") print(f" Name: {args.name}") print(f" Metric: {args.metric} (sample: {metric_cfg['sample_name']})") print(f" Commit: {commit}") print(f" Output: {os.path.basename(pb_path)}") sys.stdout.flush() # Step 1: Run test/executable if args.mode == "snforge": _step_snforge(pkg_dir, args.test, metric_cfg["tracked_resource"]) else: _step_scarb(pkg_dir, args.executable, args.args_file) # Step 2: Find trace print(f"\n[2/4] Locating trace file") if args.mode == "snforge": trace_path = _find_trace_snforge(pkg_dir, args.test) else: trace_path = _find_trace_scarb(pkg_dir, args.package) # Step 3: Build profile _step_build_profile(trace_path, pb_path) _step_view_profile(pb_path, metric_cfg["sample_name"]) # Step 4: Export PNG _step_export_png( pb_path, png_path, metric_cfg["pprof_sample_index"], nodefraction=args.nodefraction, edgefraction=args.edgefraction, ) # Summary print(f"\n{'='*60}") print(f"Profile: {pb_path}") print(f"PNG: {png_path}") print(f"{'='*60}") return 0 def _find_repo_root() -> str: """Walk up from cwd to find the git repo root.""" path = Path.cwd() while path != path.parent: if (path / ".git").exists(): return str(path) path = path.parent # Fallback to cwd return str(Path.cwd()) if __name__ == "__main__": sys.exit(main()) ================================================ FILE: .claude/skills/cairo-coding/SKILL.md ================================================ --- name: cairo-coding description: Use when writing or optimizing Cairo functions — fixing slow loops, expensive arithmetic, integer splitting or limb assembly, modular reduction, storage slot packing, or BoundedInt type bounds --- # Coding Cairo Rules and patterns for writing efficient Cairo code. Sourced from audit findings and production profiling. ## When to Use - Implementing arithmetic (modular, parity checks, quotient/remainder) - Optimizing loops (slow iteration, repeated `.len()` calls, index-based access) - Splitting or assembling integer limbs (u256 → u128, u32s → u128, felt252 → u96) - Packing struct fields into storage slots - Using `BoundedInt` for zero-overhead arithmetic with compile-time bounds - Choosing integer types (u128 vs u256, BoundedInt vs native types) **Not for:** Profiling/benchmarking (use benchmarking-cairo) ## Quick Reference — All Rules | # | Rule | Instead of | Use | |---|------|-----------|-----| | 1 | Combined quotient+remainder | `x / m` + `x % m` | `DivRem::div_rem(x, m)` | | 2 | Cheap loop conditions | `while i < n` | `while i != n` | | 3 | Constant powers of 2 | `2_u32.pow(k)` | `match`-based lookup table | | 4 | Pointer-based iteration | `*data.at(i)` in index loop | `pop_front` / `for` / `multi_pop_front` | | 5 | Cache array length | `.len()` in loop condition | `let n = data.len();` before loop | | 6 | Pointer-based slicing | Manual loop extraction | `span.slice(start, length)` | | 7 | Cheap parity/halving | `index & 1`, `index / 2` | `DivRem::div_rem(index, 2)` | | 8 | Smallest integer type | `u256` when range < 2^128 | `u128` (type encodes constraint) | | 9 | Storage slot packing | One slot per field | `StorePacking` trait | | 10 | BoundedInt for limbs | Bitwise ops / raw u128 math | `bounded_int::{div_rem, mul, add}` | | 11 | Fast 2-input Poseidon | `poseidon_hash_span([x,y])` | `hades_permutation(x, y, 2)` | | 12 | Bulk felt252→BoundedInt | `downcast` / `try_into` (4 steps) | `u128s_from_felt252` + `upcast` (2 steps) | ## Always / Never Rules ### 1. Always use `DivRem::div_rem` — never separate `%` and `/` Cairo computes quotient and remainder in a single operation. Using both `%` and `/` on the same value doubles the cost. ```cairo // BAD let q = x / m; let r = x % m; // GOOD let (q, r) = DivRem::div_rem(x, m); ``` ### 2. Never use `<` or `>` in while loop conditions — use `!=` Equality checks are cheaper than comparisons in Cairo. ```cairo // BAD while i < n { ... i += 1; } // GOOD while i != n { ... i += 1; } ``` ### 3. Never compute `2^k` with `pow()` — use a lookup table `u32::pow()` is expensive. Use a `match` lookup for known ranges. ```cairo // BAD let p = 2_u32.pow(depth.into()); // GOOD — match-based lookup fn pow2(n: u32) -> u32 { match n { 0 => 1, 1 => 2, 2 => 4, 3 => 8, 4 => 16, 5 => 32, 6 => 64, 7 => 128, 8 => 256, 9 => 512, 10 => 1024, // extend as needed _ => core::panic_with_felt252('pow2 out of range'), } } ``` ### 4. Always iterate arrays with `pop_front` / `for` / `multi_pop_front` — never index-loop Index-based access (`array.at(i)`) is more expensive than pointer-based iteration. ```cairo // BAD let mut i = 0; while i != data.len() { let val = *data.at(i); i += 1; } // GOOD — pop_front while let Option::Some(val) = data.pop_front() { ... } // GOOD — for loop (equivalent) for val in data { ... } // GOOD — batch iteration while let Option::Some(chunk) = data.multi_pop_front::<4>() { ... } ``` ### 5. Never call `.len()` inside a loop condition — cache it `.len()` recomputes every iteration. Store it once. ```cairo // BAD while i != data.len() { ... i += 1; } // GOOD let n = data.len(); while i != n { ... i += 1; } ``` ### 6. Always use `span.slice()` instead of manual loop extraction `slice()` manipulates pointers directly — no element-by-element copying. ```cairo // BAD let mut result: Array = array![]; let mut i = 0; while i != length { result.append(*data.at(start + i)); i += 1; } // GOOD let result = data.slice(start, length); ``` ### 7. Always use `DivRem` for parity checks — never use bitwise ops Bitwise AND is more expensive than `div_rem` in Cairo. Use `DivRem::div_rem(x, 2)` to get both the halved value and parity in one operation. ```cairo // BAD let is_odd = (index & 1) == 1; index = index / 2; // GOOD let (q, r) = DivRem::div_rem(index, 2); if r == 1 { /* odd branch */ } index = q; ``` ### 8. Always use the smallest integer type that fits the value range `u128` instead of `u256` when the range is known. Adds clarity, prevents intermediate overflow. ```cairo // BAD — u256 for a value known to be < 2^128 fn deposit(value: u256) { assert(value < MAX_U128, '...'); ... } // GOOD — type encodes the constraint fn deposit(value: u128) { ... } ``` ### 9. Always use `StorePacking` to pack small fields into one storage slot Multiple small fields (basis points, flags, bounded amounts) can share a single `felt252` slot. ```cairo use starknet::storage_access::StorePacking; const POW_2_128: felt252 = 0x100000000000000000000000000000000; impl MyStorePacking of StorePacking { fn pack(value: MyStruct) -> felt252 { value.amount.into() + value.fee_bps.into() * POW_2_128 } fn unpack(value: felt252) -> MyStruct { let u256 { low, high } = value.into(); MyStruct { amount: low, fee_bps: high.try_into().unwrap() } } } ``` ### 10. Always use BoundedInt for byte cutting, limb assembly, and type conversions Never use bitwise ops (`&`, `|`, shifts) or raw `u128`/`u256` arithmetic for splitting or combining integer limbs. Use `bounded_int::div_rem` to extract parts and `bounded_int::mul` + `bounded_int::add` to assemble them. BoundedInt tracks bounds at compile time, eliminating overflow checks. **Assembling limbs** (e.g., 4 x u32 → u128): ```cairo // BAD — direct u128 arithmetic (28,340 gas) fn u32s_to_u128(d0: u32, d1: u32, d2: u32, d3: u32) -> u128 { d0.into() + d1.into() * POW_2_32 + d2.into() * POW_2_64 + d3.into() * POW_2_96 } // GOOD — BoundedInt (13,840 gas, 2x faster) fn u32s_to_u128(d0: u32, d1: u32, d2: u32, d3: u32) -> u128 { let d0_bi: u32_bi = upcast(d0); let d1_bi: u32_bi = upcast(d1); let d2_bi: u32_bi = upcast(d2); let d3_bi: u32_bi = upcast(d3); let r: u128_bi = add(add(add(d0_bi, mul(d1_bi, POW_32_UI)), mul(d2_bi, POW_64_UI)), mul(d3_bi, POW_96_UI)); upcast(r) } ``` **Splitting values** (e.g., felt252 → two u96 limbs): ```cairo // GOOD — div_rem to split, mul+add to reassemble fn felt252_to_two_u96(value: felt252) -> (u96, u96) { match u128s_from_felt252(value) { U128sFromFelt252Result::Narrow(low) => { let (hi32, lo96) = bounded_int::div_rem(low, NZ_POW96_TYPED); (lo96, upcast(hi32)) }, U128sFromFelt252Result::Wide((high, low)) => { let (lo_hi32, lo96) = bounded_int::div_rem(low, NZ_POW96_TYPED); let hi64: BoundedInt<0, { POW64 - 1 }> = downcast(high).unwrap(); (lo96, bounded_int::add(bounded_int::mul(hi64, POW32_TYPED), lo_hi32)) }, } } ``` **Extracting bits** (e.g., building a 4-bit selector): ```cairo // GOOD — div_rem by 2 extracts LSB, quotient is right-shifted value let (qu1, bit0) = bounded_int::div_rem(u1, TWO_NZ); // bit0 in {0,1} let (qu2, bit1) = bounded_int::div_rem(u2, TWO_NZ); let selector = add(bit0, mul(bit1, TWO_UI)); // selector in {0..3} ``` See [garaga/selectors.cairo](https://github.com/keep-starknet-strange/garaga/blob/main/src/src/ec/selectors.cairo) and [cairo-perfs-snippets](https://github.com/feltroidprime/cairo-perfs-snippets) for production examples. ## Code Quality - **DRY:** Extract repeated validation into helper functions. If two functions validate-then-write the same struct, extract a shared `_set_config()`. - **`scarb fmt`:** Run before every commit. - **`.tool-versions`:** Pin Scarb and Starknet Foundry versions with ASDF for reproducible builds. - **Keep dependencies updated:** Newer Scarb/Foundry versions include gas optimizations and compiler improvements. --- ## BoundedInt Optimization `BoundedInt` encodes value constraints in the type system, eliminating runtime overflow checks. Use the CLI tool to compute bounds — do NOT calculate manually. ### Critical Architecture Decision: Avoid Downcast **The #1 optimization pitfall:** Converting between `u16`/`u32`/`u64` and `BoundedInt` at function boundaries. #### The Problem If your functions take `u16` and return `u16`, you must: 1. `downcast` input to `BoundedInt` (expensive — requires range check) 2. Do bounded arithmetic (cheap) 3. `upcast` result back to `u16` (cheap but wasteful) The `downcast` operation adds a range check that **dominates the savings** from bounded arithmetic. In profiling: - `downcast`: 161,280 steps (18.86%) - `bounded_int_div_rem`: 204,288 steps (23.89%) - Total bounded approach: worse than original! #### The Solution: BoundedInt Throughout **Use `BoundedInt` types as function inputs AND outputs.** This eliminates downcast entirely. ```cairo // BAD: Converts at every call (downcast overhead kills performance) pub fn add_mod(a: u16, b: u16) -> u16 { let a: Zq = downcast(a).expect('overflow'); // EXPENSIVE let b: Zq = downcast(b).expect('overflow'); // EXPENSIVE let sum: ZqSum = add(a, b); let (_q, rem) = bounded_int_div_rem(sum, nz_q); upcast(rem) } // GOOD: BoundedInt in, BoundedInt out (no downcast) pub fn add_mod(a: Zq, b: Zq) -> Zq { let sum: ZqSum = add(a, b); let (_q, rem) = bounded_int_div_rem(sum, nz_q); rem } ``` #### Refactoring Strategy When optimizing existing code: 1. **Identify the hot path** — profile to find which functions use modular arithmetic heavily 2. **Change signatures** — update function inputs/outputs to use `BoundedInt` types 3. **Propagate types outward** — callers must also use `BoundedInt` 4. **Downcast only at boundaries** — convert from u16/u32 only at system entry points (e.g., deserialization) #### Type Conversion Rules | From | To | Operation | Cost | |------|-----|-----------|------| | `u16` | `BoundedInt<0, 65535>` | `upcast` | Free (superset) | | `u16` | `BoundedInt<0, 12288>` | `downcast` | **Expensive** (range check) | | `BoundedInt<0, 12288>` | `u16` | `upcast` | Free (subset) | | `BoundedInt` | `BoundedInt` where [A,B] ⊆ [C,D] | `upcast` | Free | | `BoundedInt` | `BoundedInt` where [A,B] ⊄ [C,D] | `downcast` | **Expensive** | **Key insight:** `upcast` only works when target range is a **superset** of source range. You cannot upcast `u32` to `BoundedInt<0, 150994944>` because `u32` max (4294967295) > 150994944. ### Prerequisites ```toml # Scarb.toml [dependencies] corelib_imports = "0.1.3" ``` ```cairo // CORRECT imports — copy exactly use corelib_imports::bounded_int::{ BoundedInt, upcast, downcast, bounded_int_div_rem, AddHelper, MulHelper, DivRemHelper, UnitInt, }; use corelib_imports::bounded_int::bounded_int::{SubHelper, add, sub, mul}; ``` ### Copy-Paste Template Working example for modular arithmetic mod 100: ```cairo use corelib_imports::bounded_int::{ BoundedInt, upcast, downcast, bounded_int_div_rem, AddHelper, MulHelper, DivRemHelper, UnitInt, }; use corelib_imports::bounded_int::bounded_int::{SubHelper, add, sub, mul}; type Val = BoundedInt<0, 99>; // [0, 99] type ValSum = BoundedInt<0, 198>; // [0, 198] type ValConst = UnitInt<100>; // singleton {100} impl AddValImpl of AddHelper { type Result = ValSum; } impl DivRemValImpl of DivRemHelper { type DivT = BoundedInt<0, 1>; type RemT = Val; } fn add_mod_100(a: Val, b: Val) -> Val { let sum: ValSum = add(a, b); let nz_100: NonZero = 100; let (_q, rem) = bounded_int_div_rem(sum, nz_100); rem } ``` ### CLI Tool Use `bounded_int_calc.py` in this skill directory. **Always use CLI — never calculate manually.** ```bash # Addition: [a_lo, a_hi] + [b_lo, b_hi] python3 bounded_int_calc.py add 0 12288 0 12288 # -> BoundedInt<0, 24576> # Subtraction: [a_lo, a_hi] - [b_lo, b_hi] python3 bounded_int_calc.py sub 0 12288 0 12288 # -> BoundedInt<-12288, 12288> # Multiplication python3 bounded_int_calc.py mul 0 12288 0 12288 # -> BoundedInt<0, 150994944> # Division: quotient and remainder bounds python3 bounded_int_calc.py div 0 24576 12289 12289 # -> DivT: BoundedInt<0, 1>, RemT: BoundedInt<0, 12288> # Custom impl name python3 bounded_int_calc.py mul 0 12288 0 12288 --name MulZqImpl ``` ### BoundedInt Bounds Quick Reference | Operation | Formula | |-----------|---------| | Add | `[a_lo + b_lo, a_hi + b_hi]` | | Sub | `[a_lo - b_hi, a_hi - b_lo]` | | Mul (unsigned) | `[a_lo * b_lo, a_hi * b_hi]` | | Div quotient | `[a_lo / b_hi, a_hi / b_lo]` | | Div remainder | `[0, b_hi - 1]` | ### Negative Dividends: SHIFT Pattern `bounded_int_div_rem` doesn't support negative lower bounds. When a subtraction produces a negative-bounded result that needs reduction, add a multiple of the modulus first: ```cairo // sub_mod: (a - b) mod Q via SHIFT pub fn sub_mod(a: Zq, b: Zq) -> Zq { let a_plus_q: BoundedInt<12289, 24577> = add(a, Q_CONST); // shift by +Q let diff: BoundedInt<1, 24577> = sub(a_plus_q, b); // now non-negative let (_q, rem) = bounded_int_div_rem(diff, nz_q()); rem } // fused_sub_mul_mod: a - (b*c) mod Q via large SHIFT // OFFSET = 12288 * Q = 151007232 (smallest multiple of Q >= max product) pub fn fused_sub_mul_mod(a: Zq, b: Zq, c: Zq) -> Zq { let prod: ZqProd = mul(b, c); let a_offset: BoundedInt<151007232, 151019520> = add(a, OFFSET_CONST); let diff: BoundedInt<12288, 151019520> = sub(a_offset, prod); let (_q, rem) = bounded_int_div_rem(diff, nz_q()); rem } ``` Rule: SHIFT = `ceil(|min_possible_value| / modulus) * modulus`. Adding SHIFT preserves the result mod Q (since SHIFT ≡ 0 mod Q) while making all values non-negative. ### felt252 → BoundedInt: Prefer u128 Decomposition Over Downcast `u128s_from_felt252` is a native VM operation (2 steps/call). `downcast` (used by `try_into()`) performs a range check (4 steps/call). When converting many felt252 values to BoundedInt, decompose to u128 first, then upcast to `BoundedInt<0, u128_max>`. You lose tight compile-time bounds but save 2 steps per conversion — significant at scale. Benchmarked per-call costs (isolated loop, 512 iterations, varying input): | Libfunc | Steps/call | Source | |---------|-----------|--------| | `u128s_from_felt252` | 2 | 1,024 flat / 512 calls | | `downcast` (try_into) | 4 | 2,048 flat / 512 calls | | `bounded_int_div_rem` | 7 | 3,584 flat / 512 calls (same both) | | Approach | Per-conversion cost | Sierra bloat | Notes | |----------|-------------------|--------------|-------| | `try_into().unwrap()` | 4 steps (downcast) | **O(N^2)** — panic drops all live vars | Never in unrolled code | | `match try_into() { Some/None }` | 4 steps (downcast) | OK | No panic but pays downcast cost | | `u128s_from_felt252` + `upcast` | 2 steps | OK | **Preferred** — native decomposition | End-to-end impact (512-point NTT verify): u128 approach saves 1,024 steps / ~1.6M L2 gas (4.4%) vs match-based downcast. ```cairo use corelib_imports::integer::{U128sFromFelt252Result, u128s_from_felt252}; type U128AsBounded = BoundedInt<0, 340282366920938463463374607431768211455>; #[inline(always)] fn felt252_as_u128(x: felt252) -> u128 { match u128s_from_felt252(x) { U128sFromFelt252Result::Narrow(low) => low, U128sFromFelt252Result::Wide((_, low)) => low, } } // Convert felt252 to BoundedInt via u128 (no range-check overhead) let r: U128AsBounded = upcast(felt252_as_u128(value + SHIFT)); let (_, r) = bounded_int_div_rem(r, NZ_Q); // DivRemHelper ``` **Trade-off:** `U128AsBounded` has max=2^128-1 instead of the tight shifted bound. The `DivRemHelper` quotient type is wider, but `bounded_int_div_rem` cost is the same. Fine for most cases — only matters if downstream code needs tight bounds on the quotient. **When to use which:** - **Bulk conversions (generated/unrolled code):** Always `u128s_from_felt252` + `upcast` - **One-off boundary conversions (deserialization):** `downcast` is fine — per-call overhead negligible - **Never in hot paths:** `try_into().unwrap()` — panic path causes quadratic Sierra bloat ### Common BoundedInt Mistakes - **Downcast at every function call** — the biggest performance killer. Use `BoundedInt` types throughout, not just inside arithmetic functions. - **Trying to upcast to a narrower type** — `upcast(val: u32)` to `BoundedInt<0, 150994944>` fails because u32 max > 150994944. - **Wrong imports** — use exact imports from Prerequisites section above. - **Wrong subtraction bounds** — it's `[a_lo - b_hi, a_hi - b_lo]`, NOT `[a_lo - b_lo, a_hi - b_hi]`. - **Negative dividend in `bounded_int_div_rem`** — div_rem doesn't support negative lower bounds. Add a SHIFT (multiple of modulus) before reducing. See SHIFT pattern above. - **Missing intermediate types** — always annotate: `let sum: ZqSum = add(a, b);` - **Division quotient off-by-one** — integer division floors: `24576 / 12289 = 1`, not 2. - **Using `UnitInt` vs `BoundedInt` for constants** — use `UnitInt` for singleton constants like divisors. - **Using `div_rem` vs `bounded_int_div_rem`** — the function is `bounded_int_div_rem`, not `div_rem`. - **Bounds exceed u128::max** — BoundedInt bounds are hard-capped at 2^128. Larger values crash the Sierra specializer: 'Provided generic argument is unsupported.' - **Using `downcast`/`try_into` for bulk felt252 → BoundedInt** — use `u128s_from_felt252` + `upcast` instead (2 vs 4 steps/call). See "felt252 → BoundedInt" section above. ================================================ FILE: .claude/skills/cairo-coding/bounded_int_calc.py ================================================ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Bounded Integer Implementation Calculator Computes exact type bounds for Cairo BoundedInt helper trait implementations. Outputs ready-to-paste Cairo code. Usage: python3 bounded_int_calc.py add [--name NAME] python3 bounded_int_calc.py sub [--name NAME] python3 bounded_int_calc.py mul [--name NAME] python3 bounded_int_calc.py div [--name NAME] """ import argparse import sys # felt252 prime (for validation) FELT252_PRIME = 0x800000000000011000000000000000000000000000000000000000000000001 def validate_felt252(value: int, name: str) -> None: """Warn if value exceeds felt252 range.""" if value < 0: # Negative values are represented as P - |value| in felt252 if abs(value) >= FELT252_PRIME: print(f"WARNING: {name} = {value} exceeds felt252 range!", file=sys.stderr) elif value >= FELT252_PRIME: print(f"WARNING: {name} = {value} exceeds felt252 range!", file=sys.stderr) def format_bound(value: int) -> str: """Format a bound value, handling negatives.""" if value < 0: return str(value) return str(value) def calc_add(a_lo: int, a_hi: int, b_lo: int, b_hi: int) -> tuple[int, int]: """Calculate addition bounds: [a_lo + b_lo, a_hi + b_hi]""" result_lo = a_lo + b_lo result_hi = a_hi + b_hi return result_lo, result_hi def calc_sub(a_lo: int, a_hi: int, b_lo: int, b_hi: int) -> tuple[int, int]: """Calculate subtraction bounds: [a_lo - b_hi, a_hi - b_lo]""" result_lo = a_lo - b_hi result_hi = a_hi - b_lo return result_lo, result_hi def calc_mul(a_lo: int, a_hi: int, b_lo: int, b_hi: int) -> tuple[int, int]: """ Calculate multiplication bounds. For unsigned: [a_lo * b_lo, a_hi * b_hi] For signed/mixed: evaluate all corners. """ corners = [ a_lo * b_lo, a_lo * b_hi, a_hi * b_lo, a_hi * b_hi, ] return min(corners), max(corners) def calc_div( a_lo: int, a_hi: int, b_lo: int, b_hi: int ) -> tuple[tuple[int, int], tuple[int, int]]: """ Calculate division bounds. Quotient: [a_lo // b_hi, a_hi // b_lo] Remainder: [0, b_hi - 1] Note: Cairo's bounded_int_div_rem requires non-negative dividends. """ if b_lo <= 0: print("ERROR: Divisor lower bound must be positive!", file=sys.stderr) sys.exit(1) if a_lo < 0: print( "ERROR: Dividend lower bound must be non-negative! Cairo's bounded_int_div_rem does not support negative dividends.", file=sys.stderr, ) sys.exit(1) quot_lo = a_lo // b_hi quot_hi = a_hi // b_lo rem_lo = 0 rem_hi = b_hi - 1 return (quot_lo, quot_hi), (rem_lo, rem_hi) def generate_add_impl(a_lo: int, a_hi: int, b_lo: int, b_hi: int, name: str) -> str: result_lo, result_hi = calc_add(a_lo, a_hi, b_lo, b_hi) validate_felt252(result_lo, "Result min") validate_felt252(result_hi, "Result max") return f"""impl {name} of AddHelper, BoundedInt<{format_bound(b_lo)}, {format_bound(b_hi)}>> {{ type Result = BoundedInt<{format_bound(result_lo)}, {format_bound(result_hi)}>; }}""" def generate_sub_impl(a_lo: int, a_hi: int, b_lo: int, b_hi: int, name: str) -> str: result_lo, result_hi = calc_sub(a_lo, a_hi, b_lo, b_hi) validate_felt252(result_lo, "Result min") validate_felt252(result_hi, "Result max") return f"""impl {name} of SubHelper, BoundedInt<{format_bound(b_lo)}, {format_bound(b_hi)}>> {{ type Result = BoundedInt<{format_bound(result_lo)}, {format_bound(result_hi)}>; }}""" def generate_mul_impl(a_lo: int, a_hi: int, b_lo: int, b_hi: int, name: str) -> str: result_lo, result_hi = calc_mul(a_lo, a_hi, b_lo, b_hi) validate_felt252(result_lo, "Result min") validate_felt252(result_hi, "Result max") return f"""impl {name} of MulHelper, BoundedInt<{format_bound(b_lo)}, {format_bound(b_hi)}>> {{ type Result = BoundedInt<{format_bound(result_lo)}, {format_bound(result_hi)}>; }}""" def generate_div_impl(a_lo: int, a_hi: int, b_lo: int, b_hi: int, name: str) -> str: (quot_lo, quot_hi), (rem_lo, rem_hi) = calc_div(a_lo, a_hi, b_lo, b_hi) validate_felt252(quot_lo, "Quotient min") validate_felt252(quot_hi, "Quotient max") validate_felt252(rem_lo, "Remainder min") validate_felt252(rem_hi, "Remainder max") return f"""impl {name} of DivRemHelper, BoundedInt<{format_bound(b_lo)}, {format_bound(b_hi)}>> {{ type DivT = BoundedInt<{format_bound(quot_lo)}, {format_bound(quot_hi)}>; type RemT = BoundedInt<{format_bound(rem_lo)}, {format_bound(rem_hi)}>; }}""" def main(): parser = argparse.ArgumentParser( description="Calculate BoundedInt helper trait implementations", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Examples: # Addition: [0, 12288] + [0, 12288] python3 bounded_int_calc.py add 0 12288 0 12288 # Subtraction: [0, 12288] - [0, 12288] python3 bounded_int_calc.py sub 0 12288 0 12288 # Multiplication: [0, 12288] * [0, 12288] python3 bounded_int_calc.py mul 0 12288 0 12288 # Division: [128, 255] / [3, 8] python3 bounded_int_calc.py div 128 255 3 8 # Custom impl name python3 bounded_int_calc.py mul 0 12288 0 12288 --name Zq12289MulHelper """, ) subparsers = parser.add_subparsers(dest="operation", required=True) # Add command add_parser = subparsers.add_parser( "add", help="Addition: [a_lo, a_hi] + [b_lo, b_hi]" ) add_parser.add_argument("a_lo", type=int, help="Lower bound of first operand") add_parser.add_argument("a_hi", type=int, help="Upper bound of first operand") add_parser.add_argument("b_lo", type=int, help="Lower bound of second operand") add_parser.add_argument("b_hi", type=int, help="Upper bound of second operand") add_parser.add_argument("--name", default="AddImpl", help="Name for the impl") # Sub command sub_parser = subparsers.add_parser( "sub", help="Subtraction: [a_lo, a_hi] - [b_lo, b_hi]" ) sub_parser.add_argument("a_lo", type=int, help="Lower bound of first operand") sub_parser.add_argument("a_hi", type=int, help="Upper bound of first operand") sub_parser.add_argument("b_lo", type=int, help="Lower bound of second operand") sub_parser.add_argument("b_hi", type=int, help="Upper bound of second operand") sub_parser.add_argument("--name", default="SubImpl", help="Name for the impl") # Mul command mul_parser = subparsers.add_parser( "mul", help="Multiplication: [a_lo, a_hi] * [b_lo, b_hi]" ) mul_parser.add_argument("a_lo", type=int, help="Lower bound of first operand") mul_parser.add_argument("a_hi", type=int, help="Upper bound of first operand") mul_parser.add_argument("b_lo", type=int, help="Lower bound of second operand") mul_parser.add_argument("b_hi", type=int, help="Upper bound of second operand") mul_parser.add_argument("--name", default="MulImpl", help="Name for the impl") # Div command div_parser = subparsers.add_parser( "div", help="Division: [a_lo, a_hi] / [b_lo, b_hi]" ) div_parser.add_argument("a_lo", type=int, help="Lower bound of dividend") div_parser.add_argument("a_hi", type=int, help="Upper bound of dividend") div_parser.add_argument( "b_lo", type=int, help="Lower bound of divisor (must be > 0)" ) div_parser.add_argument("b_hi", type=int, help="Upper bound of divisor") div_parser.add_argument("--name", default="DivRemImpl", help="Name for the impl") args = parser.parse_args() if args.operation == "add": print(generate_add_impl(args.a_lo, args.a_hi, args.b_lo, args.b_hi, args.name)) elif args.operation == "sub": print(generate_sub_impl(args.a_lo, args.a_hi, args.b_lo, args.b_hi, args.name)) elif args.operation == "mul": print(generate_mul_impl(args.a_lo, args.a_hi, args.b_lo, args.b_hi, args.name)) elif args.operation == "div": print(generate_div_impl(args.a_lo, args.a_hi, args.b_lo, args.b_hi, args.name)) if __name__ == "__main__": main() ================================================ FILE: .github/.all-contributorsrc ================================================ { "projectName": "garaga", "projectOwner": "keep-starknet-strange", "repoType": "github", "repoHost": "https://github.com", "files": [ "README.md" ], "imageSize": 100, "commit": true, "commitConvention": "gitmoji", "contributors": [ { "login": "feltroidprime", "name": "Feltroid Prime", "avatar_url": "https://avatars.githubusercontent.com/u/96737978?v=4", "profile": "https://github.com/feltroidprime", "contributions": [ "code" ] }, { "login": "abdelhamidbakhta", "name": "Abdel @ StarkWare ", "avatar_url": "https://avatars.githubusercontent.com/u/45264458?v=4", "profile": "https://github.com/abdelhamidbakhta", "contributions": [ "code" ] }, { "login": "tekkac", "name": "Tarik K.", "avatar_url": "https://avatars.githubusercontent.com/u/98529704?v=4", "profile": "https://github.com/tekkac", "contributions": [ "code" ] }, { "login": "bacharif", "name": "Bachir Arif", "avatar_url": "https://avatars.githubusercontent.com/u/22233193?v=4", "profile": "https://github.com/bacharif", "contributions": [ "code" ] }, { "login": "rdubois-crypto", "name": "Renaud Dubois", "avatar_url": "https://avatars.githubusercontent.com/u/103030189?v=4", "profile": "https://github.com/rdubois-crypto", "contributions": [ "code" ] }, { "login": "raugfer", "name": "Rodrigo Ferreira", "avatar_url": "https://avatars.githubusercontent.com/u/725060?v=4", "profile": "https://raugfer.com/", "contributions": [ "code" ] }, { "login": "luiz-lvj", "name": "Luiz Vasconcelos Júnior", "avatar_url": "https://avatars.githubusercontent.com/u/64055364?v=4", "profile": "https://github.com/luiz-lvj", "contributions": [ "code" ] }, { "login": "shramee", "name": "Shramee Srivastav", "avatar_url": "https://avatars.githubusercontent.com/u/11048263?v=4", "profile": "http://shramee.me/", "contributions": [ "code" ] }, { "login": "akinovak", "name": "Andrija Novakovic", "avatar_url": "https://avatars.githubusercontent.com/u/28649205?v=4", "profile": "https://github.com/akinovak", "contributions": [ "code" ] }, { "login": "Liam-Eagen", "name": "Liam Eagen", "avatar_url": "https://avatars.githubusercontent.com/u/5618692?v=4", "profile": "https://github.com/Liam-Eagen", "contributions": [ "code" ] }, { "login": "petscheit", "name": "Paul Etscheit", "avatar_url": "https://avatars.githubusercontent.com/u/10947187?v=4", "profile": "https://github.com/petscheit", "contributions": [ "code" ] }, { "login": "stefanMadzharov", "name": "stefanMadzharov", "avatar_url": "https://avatars.githubusercontent.com/u/83451593?v=4", "profile": "https://github.com/stefanMadzharov", "contributions": [ "code" ] } ], "contributorsPerLine": 7, "linkToUsage": true } ================================================ FILE: .github/CODEOWNERS ================================================ * @abdelhamidbakhta @feltroidprime ================================================ FILE: .github/ISSUE_TEMPLATE/01_BUG_REPORT.md ================================================ --- name: Bug Report about: Create a report to help Garaga to improve title: "bug: " labels: "bug" assignees: "" --- # Bug Report **Garaga version:** **Current behavior:** **Expected behavior:** **Steps to reproduce:** **Related code:** ``` insert short code snippets here ``` **Other information:** ================================================ FILE: .github/ISSUE_TEMPLATE/02_FEATURE_REQUEST.md ================================================ --- name: Feature Request about: Suggest an idea for this project title: "feat: " labels: "enhancement" assignees: "" --- # Feature Request **Describe the Feature Request** **Describe Preferred Solution** **Describe Alternatives** **Related Code** **Additional Context** **If the feature request is approved, would you be willing to submit a PR?** _(Help can be provided if you need assistance submitting a PR)_ - [ ] Yes - [ ] No ================================================ FILE: .github/ISSUE_TEMPLATE/03_CODEBASE_IMPROVEMENT.md ================================================ --- name: Codebase improvement about: Provide your feedback for the existing codebase. Suggest a better solution for algorithms, development tools, etc. title: "dev: " labels: "enhancement" assignees: "" --- ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ --- blank_issues_enabled: false contact_links: - name: Garaga Community Support url: https://github.com/keep-starknet-strange/garaga/discussions about: Please ask and answer questions here. ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ # Pull Request type Please check the type of change your PR introduces: - [ ] Bugfix - [ ] Feature - [ ] Code style update (formatting, renaming) - [ ] Refactoring (no functional changes, no API changes) - [ ] Build-related changes - [ ] Documentation content changes - [ ] Testing - [ ] Other (please describe): # What is the current behavior? Issue Number: N/A # What is the new behavior? - - - # Does this introduce a breaking change? - [ ] Yes - [ ] No # Other information ================================================ FILE: .github/labels.yml ================================================ --- - name: "breaking-change" color: ee0701 description: "A change that changes the API or breaks backward compatibility for users." - name: "bugfix" color: ee0701 description: "Inconsistencies or issues which will cause a problem for users or implementors." - name: "documentation" color: 0052cc description: "Solely about the documentation of the project." - name: "enhancement" color: 1d76db description: "Enhancement of the code, not introducing new features." - name: "refactor" color: 1d76db description: "Updating the code with simpler, easier to understand or more efficient syntax or methods, but not introducing new features." - name: "performance" color: 1d76db description: "Improving performance of the project, not introducing new features." - name: "new-feature" color: 0e8a16 description: "New features or options." - name: "maintenance" color: 2af79e description: "Generic maintenance tasks." - name: "ci" color: 1d76db description: "Work that improves the continuous integration." - name: "dependencies" color: 1d76db description: "Change in project dependencies." - name: "in-progress" color: fbca04 description: "Issue is currently being worked on by a developer." - name: "stale" color: fef2c0 description: "No activity for quite some time." - name: "no-stale" color: fef2c0 description: "This is exempt from the stale bot." - name: "security" color: ee0701 description: "Addressing a vulnerability or security risk in this project." - name: "incomplete" color: fef2c0 description: "Missing information." - name: "invalid" color: fef2c0 description: "This is off-topic, spam, or otherwise doesn't apply to this project." - name: "beginner-friendly" color: 0e8a16 description: "Good first issue for people wanting to contribute to this project." - name: "help-wanted" color: 0e8a16 description: "We need some extra helping hands or expertise in order to resolve this!" - name: "priority-critical" color: ee0701 description: "Must be addressed as soon as possible." - name: "priority-high" color: b60205 description: "After critical issues are fixed, these should be dealt with before any further issues." - name: "priority-medium" color: 0e8a16 description: "This issue may be useful, and needs some attention." - name: "priority-low" color: e4ea8a description: "Nice addition, maybe... someday..." - name: "major" color: b60205 description: "This PR causes a major bump in the version number." - name: "minor" color: 0e8a16 description: "This PR causes a minor bump in the version number." ================================================ FILE: .github/scripts/declare_maintained_contracts.py ================================================ import asyncio import os from enum import Enum from pathlib import Path import dotenv from starknet_py.net.account.account import Account from starknet_py.net.full_node_client import FullNodeClient from starknet_py.net.models import StarknetChainId from starknet_py.net.signer.stark_curve_signer import KeyPair from garaga.hints.io import to_int from garaga.starknet.cli.smart_contract_project import SmartContractProject from garaga.starknet.tests_and_calldata_generators.drand_calldata import ( generate_drand_decrypt_constants, ) dotenv.load_dotenv(".secrets") CONTRACTS_PATH = Path("src/contracts") class Network(Enum): SEPOLIA = "sepolia" MAINNET = "mainnet" def to_starknet_chain_id(self): if self == Network.SEPOLIA: return StarknetChainId.SEPOLIA elif self == Network.MAINNET: return StarknetChainId.MAINNET else: raise ValueError(f"Unknown network: {self}") def get_account(network: Network): rpc_url = os.getenv(f"{network.value.upper()}_RPC_URL") account_address = os.getenv(f"{network.value.upper()}_ACCOUNT_ADDRESS") account_private_key = os.getenv(f"{network.value.upper()}_ACCOUNT_PRIVATE_KEY") client = FullNodeClient(node_url=rpc_url) account = Account( address=account_address, client=client, key_pair=KeyPair.from_private_key(to_int(account_private_key)), chain=network.to_starknet_chain_id(), ) return account async def declare_contract_from_path(path: Path, network: Network): contract = SmartContractProject(smart_contract_folder=path) account = get_account(network) await contract.declare_class_hash(account=account) async def declare_contract_from_path_both_networks(path: Path): await declare_contract_from_path(path, Network.SEPOLIA) await asyncio.sleep(0.3) await declare_contract_from_path(path, Network.MAINNET) async def main(): await declare_contract_from_path_both_networks(CONTRACTS_PATH / "universal_ecip") await asyncio.sleep(0.3) await declare_contract_from_path_both_networks(CONTRACTS_PATH / "drand_quicknet") await asyncio.sleep(0.3) # Generate verifier class hash into decrypt constants, then declare verifier = SmartContractProject( smart_contract_folder=CONTRACTS_PATH / "drand_quicknet" ) generate_drand_decrypt_constants( verifier.get_sierra_class_hash(), CONTRACTS_PATH / "drand_decrypt_quicknet", ) await declare_contract_from_path_both_networks( CONTRACTS_PATH / "drand_decrypt_quicknet" ) await asyncio.sleep(0.3) await declare_contract_from_path_both_networks( CONTRACTS_PATH / "autogenerated" / "risc0_verifier_bn254" ) await asyncio.sleep(0.3) await declare_contract_from_path_both_networks( CONTRACTS_PATH / "autogenerated" / "sp1_verifier_bn254" ) if __name__ == "__main__": asyncio.run(main()) ================================================ FILE: .github/scripts/verify_contracts.py ================================================ import ast import asyncio import os import sys from enum import Enum from pathlib import Path import dotenv from starknet_py.net.full_node_client import FullNodeClient import garaga.hints.io as io from garaga.starknet.cli.smart_contract_project import SmartContractProject dotenv.load_dotenv(".secrets") class Network(Enum): SEPOLIA = "sepolia" MAINNET = "mainnet" def get_rpc_url(self): return os.getenv(f"{self.value.upper()}_RPC_URL") def get_class_hash_from_generator(): try: with open( "hydra/garaga/starknet/groth16_contract_generator/generator.py", "r" ) as f: tree = ast.parse(f.read()) for node in ast.walk(tree): if isinstance(node, ast.Assign) and len(node.targets) == 1: if getattr(node.targets[0], "id", None) == "ECIP_OPS_CLASS_HASH": return hex(node.value.value) raise ValueError("ECIP_OPS_CLASS_HASH not found in generator.py") except Exception as e: print(f"Error parsing generator.py: {str(e)}", file=sys.stderr) sys.exit(1) async def verify_network(network: Network, class_hash: str): class_hash = io.to_hex_str(class_hash) print(f"\nVerifying class hash {class_hash} on {network.value}...") rpc_url = network.get_rpc_url() print(f"Using RPC URL: {rpc_url}") client = FullNodeClient(rpc_url) try: result = await client.get_class_by_hash(class_hash) if not result: print(f"Error: Contract not declared on {network.value}", file=sys.stderr) sys.exit(1) print(f"✓ Contract verified on {network.value}") except Exception as e: print(f"Error checking {network.value}: {str(e)}", file=sys.stderr) sys.exit(1) async def verify_ecip_contract(): class_hash = get_class_hash_from_generator() print(f"Verifying ECIP contract using class hash: {class_hash}") await verify_network(Network.SEPOLIA, class_hash) await verify_network(Network.MAINNET, class_hash) print("\n✓ Contract verified on both networks") async def verify_contract_from_path(path: Path): contract = SmartContractProject(smart_contract_folder=path) class_hash = contract.get_sierra_class_hash() print(f"Verifying contract {path} with class hash {io.to_hex_str(class_hash)}") await verify_network(Network.SEPOLIA, class_hash) await verify_network(Network.MAINNET, class_hash) if __name__ == "__main__": asyncio.run(verify_ecip_contract()) asyncio.run(verify_contract_from_path(Path("src/contracts/drand_quicknet"))) asyncio.run(verify_contract_from_path(Path("src/contracts/drand_decrypt_quicknet"))) asyncio.run( verify_contract_from_path( Path("src/contracts/autogenerated/risc0_verifier_bn254") ) ) asyncio.run( verify_contract_from_path( Path("src/contracts/autogenerated/sp1_verifier_bn254") ) ) ================================================ FILE: .github/workflows/cairo.yml ================================================ name: Cairo Workflow / publish on: push: branches: [main] pull_request: workflow_dispatch: jobs: pre_job: # continue-on-error: true # Uncomment once integration is finished runs-on: ubuntu-latest # Map a step output to a job output outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: 'never' paths: '["src/**", ".github/workflows/cairo.yml"]' test-cairo: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ubuntu-latest steps: # Checkout the repository - name: Checkout uses: actions/checkout@v3 - name: Set up Rust uses: actions-rs/toolchain@v1 with: toolchain: stable override: true profile: minimal components: rustfmt - name: Setup Starknet Foundry uses: foundry-rs/setup-snfoundry@v4 - name: Setup Scarb uses: software-mansion/setup-scarb@v1 with: scarb-lock: ./src/Scarb.lock - name: Run scarb fmt check in src working-directory: src/ run: scarb fmt --check - name: Run scarb test in src working-directory: src/ run: scarb test - name: Run scarb fmt check in mutator_set working-directory: src/contracts/mutator_set run: scarb fmt --check - name: Run snforge test in mutator_set working-directory: src/contracts/mutator_set run: snforge test - name: Run scarb test for all autogenerated contracts run: ./tools/make/test_contracts.sh - name: Run scarb fmt check in risc0_sample_app working-directory: src/contracts/risc0_sample_app/fibonacci_sequencer run: scarb fmt --check # Conflicting with the e2e test : we don't want to dedeploy the verifier at each commit. # - name: Run snforge test in risc0_sample_app # working-directory: src/contracts/risc0_sample_app/fibonacci_sequencer # run: snforge test - name: Publish to Scarb Registry if: startsWith(github.ref, 'refs/tags/') working-directory: src/ env: SCARB_REGISTRY_AUTH_TOKEN: ${{ secrets.SCARB_REGISTRY_AUTH_TOKEN }} run: scarb publish ================================================ FILE: .github/workflows/docs-sync.yml ================================================ # .github/workflows/docs-sync.yml # # Keep GitBook docs (docs/gitbook) and source code in sync. # ├─ create-docs-pr : docs ➜ main (PR auto-merges if docs-only) # └─ sync-main-to-docs : main ➜ docs (keeps non-docs files identical to main) name: Documentation Sync permissions: contents: write # allow pushing branches / squash-merge pull-requests: write # allow opening / merging PRs issues: write # create & apply labels on: push: branches: [ main, docs ] # run on every push to either branch defaults: run: shell: bash # strict mode added in scripts concurrency: group: docs-sync-${{ github.ref }} cancel-in-progress: true jobs: #─────────────────────────────────────────────────────────────────────────────── # A. docs ➜ main – single rolling PR on branch: docs-sync #─────────────────────────────────────────────────────────────────────────────── create-docs-pr: if: >- github.event.ref == 'refs/heads/docs' && ( github.actor == 'gitbook-com[bot]' || github.actor == 'gitbook-io[bot]' || contains(github.event.head_commit.message, '[gitbook]') ) runs-on: ubuntu-latest steps: # 1️⃣ Check out the latest MAIN in a clean worktree - uses: actions/checkout@v4 with: ref: main fetch-depth: 0 persist-credentials: false - run: | git config user.name "GitBook Docs Bot" git config user.email "docs-bot@garaga.dev" # 2️⃣ Overlay docs/gitbook from the docs branch - name: Sync docs/gitbook from docs branch run: | set -euo pipefail git fetch --quiet origin docs git checkout origin/docs -- docs/gitbook # Exit early if nothing changed (check staged changes since git checkout stages them) if git diff --cached --quiet; then echo "No documentation changes — skipping PR." echo "SKIP_PR=true" >>"$GITHUB_ENV" fi # 3️⃣ Commit the changes (only if any) - name: Commit docs update if: env.SKIP_PR != 'true' run: | set -euo pipefail # Changes are already staged by git checkout, just commit them git commit -m "📚 Sync docs/gitbook @ ${{ github.sha }}" # 4️⃣ Create / update the rolling PR on branch docs-sync - uses: peter-evans/create-pull-request@v7 if: env.SKIP_PR != 'true' id: cpr with: token: ${{ secrets.DOCS_SYNC_PAT }} branch: docs-sync # ← single, reusable branch base: main title: "📚 Update documentation from GitBook" commit-message: "📚 docs(branch=docs) → main @ ${{ github.sha }}" labels: documentation,auto-generated delete-branch: true # auto-delete after you squash-merge # 5️⃣ Add an extra label & comment if non-docs files slipped in - name: Flag mixed-content PRs if: env.SKIP_PR != 'true' env: GH_TOKEN: ${{ secrets.DOCS_SYNC_PAT }} run: | set -euo pipefail # If *any* file outside docs/gitbook changed, add label + comment if git diff --name-only origin/main | grep -vqE '^docs/gitbook/'; then gh pr edit "${{ steps.cpr.outputs.pull-request-number }}" \ --add-label "needs-review" gh pr comment "${{ steps.cpr.outputs.pull-request-number }}" \ --body "⚠️ *Mixed content* – this PR touches files outside \`docs/gitbook\`. Please review." fi #─────────────────────────────────────────────────────────────────────────────── # B. main ➜ docs – keep non-docs files identical to main #─────────────────────────────────────────────────────────────────────────────── sync-main-to-docs: if: >- github.event.ref == 'refs/heads/main' && !contains(github.event.head_commit.message, '[gitbook]') && github.actor != 'gitbook-com[bot]' && github.actor != 'gitbook-io[bot]' runs-on: ubuntu-latest steps: # 1) Check out docs branch (create it if it doesn't exist) - uses: actions/checkout@v4 with: ref: docs fetch-depth: 0 token: ${{ secrets.DOCS_SYNC_PAT }} - name: Configure Git run: | git config user.name "GitHub Docs Sync" git config user.email "docs-sync@garaga.dev" git fetch origin main --tags --prune # 2) Bring EVERYTHING (including docs/gitbook) up to date with main - name: Sync repo from main run: | set -euo pipefail git fetch origin main --tags --prune # Overwrite the working tree with the state of main git checkout origin/main -- . # Stage everything and commit only if something changed git add -A if git diff --cached --quiet; then echo "No updates required – docs branch already matches main." exit 0 fi git commit -m "🔄 Sync all files from main @ ${{ github.sha }}" # ─── 3) Open (or update) a PR towards docs ───────────────────────────── - uses: peter-evans/create-pull-request@v7 id: cpr with: token: ${{ secrets.DOCS_SYNC_PAT }} # the current HEAD contains the commit we just made branch: main-sync-${{ github.sha }}-${{ github.run_id }} base: docs commit-message: "🔄 Sync non-docs files from main @ ${{ github.sha }}" title: "🔄 Sync main → docs (non-docs files)" body: | This PR keeps the **docs** branch in sync with **main**. Source commit: ${{ github.sha }} > 🤖 _docs-sync workflow_ labels: documentation,auto-generated,auto-merge delete-branch: true draft: false # open as a normal PR # ─── 4) Enable auto-merge; will complete when checks are green ───────── - name: Enable auto-merge if: steps.cpr.outputs.pull-request-number env: GH_TOKEN: ${{ secrets.DOCS_SYNC_PAT }} run: | gh pr merge ${{ steps.cpr.outputs.pull-request-number }} \ --auto --squash --delete-branch --repo "$GITHUB_REPOSITORY" || \ echo "Auto-merge pending required checks." ================================================ FILE: .github/workflows/e2e.yml ================================================ name: E2E-devnet on: push: branches: [main] pull_request: jobs: pre_job: # continue-on-error: true # Uncomment once integration is finished runs-on: ubuntu-latest # Map a step output to a job output outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: 'never' paths_ignore: '["**/README.md", "**/docs/**"]' devnet-test-matrix: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ubuntu-latest strategy: matrix: python-version: ['3.10', '3.14'] fail-fast: false steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Set up Rust uses: actions-rs/toolchain@v1 with: toolchain: 1.87.0 override: true profile: minimal - name: Setup Scarb uses: software-mansion/setup-scarb@v1 with: scarb-version: "2.16.1" - name: Install dependencies run: make setup env: PYTHON_VERSION: ${{ matrix.python-version }} - name: Install devnet run: ./tests/contracts_e2e/install_devnet.sh - name: Run tests run: source venv/bin/activate && pytest -n auto -s -x tests/contracts_e2e/e2e_test.py # Summary job for branch protection (matrix jobs have version suffix in name) devnet-test: needs: [pre_job, devnet-test-matrix] if: always() runs-on: ubuntu-latest steps: - name: Check matrix job status run: | if [ "${{ needs.pre_job.outputs.should_skip }}" == "true" ]; then echo "Tests skipped" exit 0 fi if [ "${{ needs.devnet-test-matrix.result }}" != "success" ]; then echo "Matrix tests failed" exit 1 fi echo "All tests passed" ================================================ FILE: .github/workflows/hydra.yml ================================================ name: Hydra backend test on: push: branches: [main] pull_request: jobs: pre_job: # continue-on-error: true # Uncomment once integration is finished runs-on: ubuntu-latest # Map a step output to a job output outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: 'never' paths_ignore: '["**/README.md", "**/docs/**"]' test-hydra-matrix: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ubuntu-latest strategy: matrix: python-version: ['3.10', '3.12', '3.14'] fail-fast: false steps: - name: Set up Rust uses: actions-rs/toolchain@v1 with: toolchain: stable override: true profile: minimal components: rustfmt - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: make setup env: PYTHON_VERSION: ${{ matrix.python-version }} - name: Check Black formatting run: source venv/bin/activate && black --check . - name: Test garaga_rs run: | source venv/bin/activate (cd tools/garaga_rs && cargo fmt --check && cargo test) - name: Run pytest run: | source venv/bin/activate pytest -n auto - name: Set up Scarb uses: software-mansion/setup-scarb@v1 with: scarb-version: "2.16.1" - name: Run make rewrite and check for unstaged changes if: matrix.python-version == '3.14' run: | source venv/bin/activate if ! make rewrite; then echo "Error: 'make rewrite' command failed" exit 1 fi if [[ -n $(git status --porcelain) ]]; then echo "Error: Unstaged changes detected after running 'make rewrite'" git status exit 1 fi - name: Check bytecode size limits if: matrix.python-version == '3.14' run: | source venv/bin/activate make check-max-log-n continue-on-error: false # Summary job for branch protection (matrix jobs have version suffix in name) test-hydra: needs: [pre_job, test-hydra-matrix] if: always() runs-on: ubuntu-latest steps: - name: Check matrix job status run: | if [ "${{ needs.pre_job.outputs.should_skip }}" == "true" ]; then echo "Tests skipped" exit 0 fi if [ "${{ needs.test-hydra-matrix.result }}" != "success" ]; then echo "Matrix tests failed" exit 1 fi echo "All tests passed" ================================================ FILE: .github/workflows/labels.yml ================================================ --- name: Sync labels on: push: branches: - main paths: - .github/labels.yml jobs: labels: name: ♻️ Sync labels runs-on: ubuntu-latest steps: - name: ⤵️ Check out code from GitHub uses: actions/checkout@v2 - name: 🚀 Run Label Syncer uses: micnncim/action-label-syncer@v1.2.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .github/workflows/maturin.yml ================================================ name: Maturin on: push: tags: - '*' workflow_dispatch: permissions: contents: read jobs: pre_job: # continue-on-error: true # Uncomment once integration is finished runs-on: ubuntu-latest # Map a step output to a job output outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: 'never' paths_ignore: '["**/README.md", "**/docs/**"]' linux: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-latest target: x86_64 - runner: ubuntu-latest target: x86 - runner: ubuntu-latest target: aarch64 - runner: ubuntu-latest target: armv7 - runner: ubuntu-latest target: s390x - runner: ubuntu-latest target: ppc64le steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: | 3.10 3.11 3.12 3.13 3.14 - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter --features python sccache: 'true' manylinux: auto - name: Upload wheels uses: actions/upload-artifact@v4 with: name: wheels-linux-${{ matrix.platform.target }} path: dist musllinux: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-latest target: x86_64 - runner: ubuntu-latest target: x86 - runner: ubuntu-latest target: aarch64 - runner: ubuntu-latest target: armv7 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: | 3.10 3.11 3.12 3.13 3.14 - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter --features python sccache: 'true' manylinux: musllinux_1_2 - name: Upload wheels uses: actions/upload-artifact@v4 with: name: wheels-musllinux-${{ matrix.platform.target }} path: dist windows: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: windows-latest target: x64 - runner: windows-latest target: x86 python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} architecture: ${{ matrix.platform.target }} - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --features python sccache: 'true' - name: Upload wheels uses: actions/upload-artifact@v4 with: name: wheels-windows-${{ matrix.platform.target }}-py${{ matrix.python-version }} path: dist macos: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: macos-14 target: x86_64 - runner: macos-14 target: aarch64 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: | 3.10 3.11 3.12 3.13 3.14 - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter --features python sccache: 'true' - name: Upload wheels uses: actions/upload-artifact@v4 with: name: wheels-macos-${{ matrix.platform.target }} path: dist sdist: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build sdist uses: PyO3/maturin-action@v1 with: command: sdist args: --out dist - name: Upload sdist uses: actions/upload-artifact@v4 with: name: wheels-sdist path: dist release: name: Release runs-on: ubuntu-latest if: "startsWith(github.ref, 'refs/tags/')" # Only run on tag pushes needs: [linux, musllinux, windows, macos, sdist] steps: - uses: actions/checkout@v4 - name: Set up Rust uses: actions-rs/toolchain@v1 with: toolchain: stable override: true profile: minimal components: rustfmt - uses: software-mansion/setup-scarb@v1 with: scarb-version: "2.16.1" - name: Set up Python 3.10 uses: actions/setup-python@v5 with: python-version: "3.10.x" - name: Install dependencies run: make setup - name: Verify Contract Declaration env: SEPOLIA_RPC_URL: ${{ secrets.SEPOLIA_RPC_URL }} MAINNET_RPC_URL: ${{ secrets.MAINNET_RPC_URL }} run: source venv/bin/activate && python .github/scripts/verify_contracts.py - uses: actions/download-artifact@v4 - name: Publish to PyPI uses: PyO3/maturin-action@v1 env: MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} with: command: upload args: --non-interactive --skip-existing wheels-*/* ================================================ FILE: .github/workflows/node.yml ================================================ name: NODE tests on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: jobs: pre_job: # continue-on-error: true # Uncomment once integration is finished runs-on: ubuntu-latest # Map a step output to a job output outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: 'never' paths: '["tools/**"]' npm-test: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' name: NPM Test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 'lts/*' - name: Run npm test in garaga_ts working-directory: tools/npm/garaga_ts run: | npm ci npm test ================================================ FILE: .github/workflows/setup.yml ================================================ name: Test make setup (cross-platform) on: push: branches: [main] paths: - 'tools/make/setup.sh' - '.github/workflows/setup.yml' pull_request: paths: - 'tools/make/setup.sh' - '.github/workflows/setup.yml' jobs: pre_job: runs-on: ubuntu-latest outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: 'never' shellcheck: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run ShellCheck # SC2016: single-quoted strings intentionally prevent expansion (activate script) # SC1091: sourced files (venv/bin/activate) don't exist at lint time run: shellcheck -s bash -e SC2016,SC1091 tools/make/setup.sh test-setup: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ${{ matrix.os }} strategy: matrix: include: - os: ubuntu-latest name: Linux x86_64 - os: macos-14 name: macOS arm64 fail-fast: false name: setup (${{ matrix.name }}) steps: - uses: actions/checkout@v4 - name: Set up Rust uses: actions-rs/toolchain@v1 with: toolchain: stable override: true profile: minimal - name: Run make setup run: make setup - name: Verify venv run: | source venv/bin/activate python --version test-setup-fedora: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' runs-on: ubuntu-latest container: fedora:latest name: setup (Fedora dnf) steps: - name: Install base tools run: dnf install -y git curl gcc g++ make perl-FindBin - uses: actions/checkout@v4 - name: Mark workspace as safe for git run: git config --global --add safe.directory "$GITHUB_WORKSPACE" - name: Install Rust run: | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - name: Run make setup run: | source "$HOME/.cargo/env" make setup - name: Verify venv run: | source "$HOME/.cargo/env" source venv/bin/activate python --version ================================================ FILE: .github/workflows/wasm.yml ================================================ name: WASM npm publish on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: jobs: pre_job: # continue-on-error: true # Uncomment once integration is finished runs-on: ubuntu-latest # Map a step output to a job output outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: 'never' paths: '["tools/**"]' test-wasm: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' name: test-wasm runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 'lts/*' - uses: dtolnay/rust-toolchain@stable - run: cargo install wasm-pack - name: Run wasm specific tests working-directory: tools/garaga_rs run: RUSTFLAGS='--cfg getrandom_backend="wasm_js"' wasm-pack test --node --release --no-default-features --features wasm build-wasm: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' name: build-wasm runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build and check for changes in generated code working-directory: tools/npm/garaga_ts run: | docker compose up --build --exit-code-from app git status --porcelain [[ -z $(git status --porcelain ) ]] - name: Upload package file as artifact uses: actions/upload-artifact@v4 with: name: npm-package path: tools/npm/garaga_ts/*.tgz if-no-files-found: error test-integration: needs: [pre_job, build-wasm] if: needs.pre_job.outputs.should_skip != 'true' name: test-integration runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 'lts/*' - name: Install Puppeteer dependencies run: | sudo apt-get update sudo apt-get install -y \ libnss3 libxss1 libasound2t64 libatk-bridge2.0-0 libatk1.0-0 \ libcups2 libxcomposite1 libxdamage1 libxrandr2 libgbm1 \ libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libgtk-3-0 - name: Download package file as artifact uses: actions/download-artifact@v4 with: name: npm-package path: tools/npm/garaga_ts - name: Build and tests integration test packages working-directory: tools/npm/integration-test-suite run: | cp ../garaga_ts/garaga-*.tgz garaga.tgz npm i npm run build npx puppeteer browsers install npm run test release: name: Release runs-on: ubuntu-latest if: "startsWith(github.ref, 'refs/tags/')" # Only run on tag pushes needs: [build-wasm, test-wasm, test-integration] steps: - uses: actions/checkout@v4 - name: Set up Rust uses: actions-rs/toolchain@v1 with: toolchain: stable override: true profile: minimal components: rustfmt - uses: software-mansion/setup-scarb@v1 with: scarb-version: "2.16.1" - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.10" - name: Install dependencies run: make setup - name: Verify Contract Declaration env: SEPOLIA_RPC_URL: ${{ secrets.SEPOLIA_RPC_URL }} MAINNET_RPC_URL: ${{ secrets.MAINNET_RPC_URL }} run: source venv/bin/activate && python .github/scripts/verify_contracts.py - uses: actions/setup-node@v4 with: node-version: 'lts/*' registry-url: 'https://registry.npmjs.org' - name: Download package file as artifact uses: actions/download-artifact@v4 with: name: npm-package - name: Publish to npm run: | npm publish --access=public *.tgz env: NODE_AUTH_TOKEN: ${{ secrets.NPM_API_TOKEN }} ================================================ FILE: .gitignore ================================================ *.json !*_input.json !*Proof.json !frobenius_*.json !*test_vectors.json __pycache__ venv *.env *profiling* *.o *.c *.so *.html *.sage.py *.idea *.secrets *.pb.gz .cargo/hypothesis/ *.go tools/garaga_rs/target/ tools/make/requirements.txt .prev_tests_failed src/cairo/target/ *target* Scarb.lock tests/contracts_e2e/devnet/* # Foundry artifacts for Solidity testing tools/noir/hello/lib/ tools/noir/hello/out/ tools/noir/hello/cache/ tools/noir/hello/test/ tools/noir/hello/foundry.toml !hydra/garaga/starknet/groth16_contract_generator/examples/*.json !docs/benchmarks/test_summary.json *snfoundry_cache !tools/npm/garaga_rs/*.json !tools/make/constants.json # Benchmarks and profiling data .cargo/benchmarks/*/ src/profile/ /profiles/ **/.snfoundry_trace/** # Worktrees .worktrees/ .stignore .claude/worktrees/ ================================================ FILE: .pre-commit-config.yaml ================================================ repos: - repo: https://github.com/PyCQA/autoflake rev: v2.3.1 hooks: - id: autoflake args: ["--in-place", "--remove-all-unused-imports"] files: \.py$ - repo: https://github.com/pycqa/isort rev: 5.13.2 hooks: - id: isort args: ["--profile", "black"] files: \.py$ - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: - id: trailing-whitespace exclude: ^tools/npm/garaga_ts/src/wasm/pkg/ - id: end-of-file-fixer exclude: (\.cairo$|^tools/npm/garaga_ts/src/wasm/pkg/) - id: check-yaml - id: check-toml - repo: https://github.com/psf/black rev: 26.1.0 hooks: - id: black args: ["--target-version", "py310"] files: \.py$ - repo: local hooks: - id: scarb-fmt name: scarb fmt entry: bash -c 'cd src && scarb fmt' language: system files: \.cairo$ pass_filenames: false - id: cargo-fmt name: cargo fmt entry: bash -c 'cd tools/garaga_rs && cargo fmt' language: system files: ^tools/garaga_rs/.*\.rs$ pass_filenames: false ================================================ FILE: .secrets.template ================================================ SEPOLIA_RPC_URL="https://rpc.starknet-testnet.lava.build:443" SEPOLIA_ACCOUNT_PRIVATE_KEY=0x1 SEPOLIA_ACCOUNT_ADDRESS=0x2 MAINNET_RPC_URL="https://" MAINNET_ACCOUNT_PRIVATE_KEY=0x3 MAINNET_ACCOUNT_ADDRESS=0x4 ================================================ FILE: .tool-versions ================================================ scarb 2.16.1 starknet-foundry 0.57.0 starknet-devnet 0.5.1 cairo-profiler 0.14.0 ================================================ FILE: CLAUDE.md ================================================ # Garaga ## Project layout - `src/` — Cairo contracts and library (Scarb workspace, `snforge test`) - `tools/garaga_rs/` — Rust core (`cargo test -p garaga_rs`, `cargo clippy`) - `tools/garaga_rs/src/python_bindings/` — PyO3 bindings (`make maturin`) - `tools/garaga_rs/src/wasm_bindings.rs` — WASM bindings (`make wasm`, Docker-based) - `tools/npm/garaga_ts/` — TypeScript wrappers + WASM pkg - `hydra/` — Python calldata builders and helpers - `tests/` — E2E and integration tests ## Build commands | What | Command | |------|---------| | Rust tests | `cargo test -p garaga_rs` | | Rust lint | `cargo clippy --workspace` | | Python bindings | `make maturin` | | WASM + TS + npm | `make wasm` (Docker) | | Cairo tests | `snforge test -p garaga` | | Format | `make fmt` (scarb fmt + cargo fmt) | ## Critical invariants **Rust/Python parity**: Every calldata builder has both a Python and Rust path via `use_rust` flag. Parity is enforced by pytest asserting `calldata_py == calldata_rs` byte-for-byte. Use `fixed_sigma` or equivalent for determinism. **WASM regeneration**: After any change to Rust source in `tools/garaga_rs/src/` (except `python_bindings/`) or `Cargo.toml`, run `make wasm` and commit regenerated files in `tools/npm/garaga_ts/src/wasm/pkg/`. CI will fail if out of sync. **TypeScript coverage**: Every WASM binding needs a typed wrapper in `tools/npm/garaga_ts/src/node/api.ts`, a Jest test, and coverage across all 4 integration suites (Node CJS, Node ESM, Webpack, React). **E2E tests**: Deploy on starknet-devnet via `SmartContractProject.declare_class_hash()`, generate calldata via Python, invoke contract, assert via `wait_for_acceptance()`. **Cairo circuits**: Never include unused values in circuit output tuples (`extend_struct_output`) — each output enlarges the circuit's generic tuple and can trigger CASM `Offset overflow` when the tuple exceeds stdlib `CircuitDefinition` bounds. Prefer `#[inline(always)]` on circuit functions and loops over repeated calls to keep AP offsets scoped per iteration. ================================================ FILE: Cargo.toml ================================================ [workspace] resolver = "2" members = [ "tools/garaga_rs" ] [profile.release] lto = true debug = false opt-level = 3 ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2023 Keep StarkNet Strange 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. ================================================ FILE: Makefile ================================================ SHELL := /bin/bash ACTIVATE := source venv/bin/activate && .PHONY: build test coverage run run-profile generate-constants profile-test benchmarks update-risc0-class-hash constants: $(ACTIVATE) python tools/make/generate_constants.py setup: ./tools/make/setup.sh bytecode-check: ./tools/make/bytecode_check.sh check-max-log-n: ./tools/make/bytecode_check_max_log_n.sh rewrite: $(ACTIVATE) ./tools/make/rewrite.sh rewrite-no-tests: $(ACTIVATE) ./tools/make/rewrite.sh no-tests regen: cd src/contracts/mutator_set && make regen update-risc0-class-hash: ./tools/make/update_risc0_class_hash.sh steps: ./tools/make/steps.sh fmt: scarb fmt && cargo fmt # Profile a specific test and generate performance visualizations # Usage: make profile-test [TEST=] [JOBS=] # Each job takes ~3GB of ram DEFAULT_JOBS := 8 profile-test: @JOBS_VAL=$${JOBS:-$(DEFAULT_JOBS)}; \ if [ -z "$(TEST)" ]; then \ echo "Running all tests with profiling ($$JOBS_VAL jobs)..."; \ $(ACTIVATE) python tools/profile_tests.py --all --parallel-jobs $$JOBS_VAL --generate-benchmarks; \ else \ echo "Running tests with filter: $(TEST) ($$JOBS_VAL jobs)"; \ $(ACTIVATE) python tools/profile_tests.py $(TEST) --parallel-jobs $$JOBS_VAL --generate-benchmarks; \ fi benchmarks: @echo "Generating Cairo benchmarks from existing test data..." $(ACTIVATE) python tools/profile_tests.py --benchmarks-only ci-e2e: ./tools/make/ci_e2e.sh ci-hydra: ./tools/make/ci_hydra.sh ci-cairo: ./tools/make/ci_cairo.sh ci-wasm: ./tools/make/ci_wasm.sh wasm: ./tools/make/wasm.sh wasm-test-gen: ./tools/make/wasm-test-gen.sh maturin: $(ACTIVATE) maturin develop --release --features python clean: sudo rm -rf build/ mkdir -p build/ ================================================ FILE: README.md ================================================

[![CI Status](https://img.shields.io/github/checks-status/keep-starknet-strange/garaga/main?label=All%20Workflows)](https://github.com/keep-starknet-strange/garaga/actions) [![Project license](https://img.shields.io/github/license/keep-starknet-strange/garaga.svg?style=flat-square)](LICENSE) [![Pull Requests welcome](https://img.shields.io/badge/PRs-welcome-ff69b4.svg?style=flat-square)](https://github.com/keep-starknet-strange/garaga/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) [![Exploration_Team](https://img.shields.io/badge/Exploration_Team-29296E.svg?&style=for-the-badge&logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxODEgMTgxIj48ZGVmcz48c3R5bGU+LmJ7ZmlsbDojZmZmO308L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iYiIgZD0iTTE3Ni43Niw4OC4xOGwtMzYtMzcuNDNjLTEuMzMtMS40OC0zLjQxLTIuMDQtNS4zMS0xLjQybC0xMC42MiwyLjk4LTEyLjk1LDMuNjNoLjc4YzUuMTQtNC41Nyw5LjktOS41NSwxNC4yNS0xNC44OSwxLjY4LTEuNjgsMS44MS0yLjcyLDAtNC4yN0w5Mi40NSwuNzZxLTEuOTQtMS4wNC00LjAxLC4xM2MtMTIuMDQsMTIuNDMtMjMuODMsMjQuNzQtMzYsMzcuNjktMS4yLDEuNDUtMS41LDMuNDQtLjc4LDUuMThsNC4yNywxNi41OGMwLDIuNzIsMS40Miw1LjU3LDIuMDcsOC4yOS00LjczLTUuNjEtOS43NC0xMC45Ny0xNS4wMi0xNi4wNi0xLjY4LTEuODEtMi41OS0xLjgxLTQuNCwwTDQuMzksODguMDVjLTEuNjgsMi4zMy0xLjgxLDIuMzMsMCw0LjUzbDM1Ljg3LDM3LjNjMS4zNiwxLjUzLDMuNSwyLjEsNS40NCwxLjQybDExLjQtMy4xMSwxMi45NS0zLjYzdi45MWMtNS4yOSw0LjE3LTEwLjIyLDguNzYtMTQuNzYsMTMuNzNxLTMuNjMsMi45OC0uNzgsNS4zMWwzMy40MSwzNC44NGMyLjIsMi4yLDIuOTgsMi4yLDUuMTgsMGwzNS40OC0zNy4xN2MxLjU5LTEuMzgsMi4xNi0zLjYsMS40Mi01LjU3LTEuNjgtNi4wOS0zLjI0LTEyLjMtNC43OS0xOC4zOS0uNzQtMi4yNy0xLjIyLTQuNjItMS40Mi02Ljk5LDQuMyw1LjkzLDkuMDcsMTEuNTIsMTQuMjUsMTYuNzEsMS42OCwxLjY4LDIuNzIsMS42OCw0LjQsMGwzNC4zMi0zNS43NHExLjU1LTEuODEsMC00LjAxWm0tNzIuMjYsMTUuMTVjLTMuMTEtLjc4LTYuMDktMS41NS05LjE5LTIuNTktMS43OC0uMzQtMy42MSwuMy00Ljc5LDEuNjhsLTEyLjk1LDEzLjg2Yy0uNzYsLjg1LTEuNDUsMS43Ni0yLjA3LDIuNzJoLS42NWMxLjMtNS4zMSwyLjcyLTEwLjYyLDQuMDEtMTUuOGwxLjY4LTYuNzNjLjg0LTIuMTgsLjE1LTQuNjUtMS42OC02LjA5bC0xMi45NS0xNC4xMmMtLjY0LS40NS0xLjE0LTEuMDgtMS40Mi0xLjgxbDE5LjA0LDUuMTgsMi41OSwuNzhjMi4wNCwuNzYsNC4zMywuMTQsNS43LTEuNTVsMTIuOTUtMTQuMzhzLjc4LTEuMDQsMS42OC0xLjE3Yy0xLjgxLDYuNi0yLjk4LDE0LjEyLTUuNDQsMjAuNDYtMS4wOCwyLjk2LS4wOCw2LjI4LDIuNDYsOC4xNiw0LjI3LDQuMTQsOC4yOSw4LjU1LDEyLjk1LDEyLjk1LDAsMCwxLjMsLjkxLDEuNDIsMi4wN2wtMTMuMzQtMy42M1oiLz48L3N2Zz4=)](https://github.com/keep-starknet-strange)
## About > State-of-the-art Elliptic Curve tooling and SNARKS verification for Cairo & Starknet 🐺. Garaga enables efficient elliptic curve operations on Starknet. It achieves state of the art performance by - using a dedicated builtin made by Starkware for emulated modular arithmetic - using a suite of non-deterministic techniques for extension field multiplication, pairings, and multi scalar multiplication to reduce the number of steps to verify results. Garaga currently supports: - Scalar & Multi-scalar multiplication for any Weirstrass curve, including BN254, BLS12_381, SECP256/R1, and ED25519. You can add the one you need by specifying the curve parameters. - Pairing operations for BN254 and BLS12_381. - Groth16 smart contract verifiers generators for BN254 and BLS12_381. - Noir smart contract verifiers generators for ultra keccak honk flavour. ## Architecture overview ![Architecture Overview](docs/images/architecture_overview.svg) Garaga consists of a Pythonic backend with Rust bindings and CairoZero / Cairo libraries. - The Pythonic backend is here to define emulated modular arithmetic circuits that can be compiled to Cairo or Cairo1 code. It also handles witnesses generation for the non-deterministic computations, smart contract contract generation for a given proof system and elliptic curve, and calldata generation from a given proof. - The CairoZero / Starknet interfaces are responsible for composing and calling the circuits, as well as adding all the extra logic needed to make the algorithms work (Fiat-Shamir heuristic, SNARKS verifiers algorithms, etc). ## Quickstart : deploying a SNARK verifier on Starknet Currently, only Groth16 on BN254 and BLS12_381 is supported with automatic support for json files coming from SnarkJS and Gnark. 1. Create a new directory for you project, and bring the jsons files for verification key, proof file and public inputs inside it. 2. Install the garaga pip package with `pip install garaga`. Python 3.10+ is required and a virtual environment is recommended. Enter `garaga` in your terminal to get started. 3. Run the `garaga gen` command in your terminal to generate the code for the SNARK verifier given your verification key. 4. Edit the generated smart contract to fit the needs of your dapp. 5. Create an environment file `.secrets` following the `.secrets.template` file in the root of this repository, containing the Starkner RPC url, your account address, and the private key. 6. Run the `garaga declare` command in your terminal to declare the smart contract on Starknet and obtain its class hash. Note that this is an expensive operation. 7. Run the `garaga deploy` command in your terminal using the class hash obtained in the previous step to get the contract address. 8. Run the `garaga verify-onchain` command in your terminal using the contract address, the verification key, the proof and the public inputs to verify the proof against the SNARK verifier contract. For more details, please refer to the [documentation](https://garaga.gitbook.io/garaga/). ## Developer setup To get started with Garaga, you'll need to have some tools and dependencies installed. Here's everything you need: ### Prerequisites Ensure you have the following installed: - [Rust](https://www.rust-lang.org/tools/install) - Required for building the `garaga_rs` extension. - [Scarb 2.16.1](https://docs.swmansion.com/scarb/download.html) - The Cairo package manager. Comes with Cairo inside. Python 3.10-3.14 is used for development but does **not** need to be installed manually — `make setup` will auto-install it via [uv](https://docs.astral.sh/uv/) if it's not already available. Make sure you have GMP installed for the `fastecdsa` python package. See [here](https://pypi.org/project/fastecdsa/#installing) for linux and [here](https://github.com/AntonKueltz/fastecdsa/issues/74) for macos. ##### Optionally : - [pprof](https://github.com/google/pprof) - A tool for visualization and analysis of profiling data. Requires [Go](https://go.dev/). - [graphviz](https://graphviz.org/download/) - Necessary for generating graphical representations of profiling data. ### Setup Clone the repository and run the setup command from the root: ```bash make setup ``` This will automatically: - Install [uv](https://docs.astral.sh/uv/) if not present - Install Python 3.14 via uv if no compatible version (3.10-3.14) is found - Create a virtual environment and install all dependencies - Build the Rust extension The setup is idempotent — running it again will update dependencies without recreating the virtual environment. Before proceeding, activate the virtual environment by running `source venv/bin/activate`. ## Cairo Benchmarks 📊 **Click on any section below to expand and view detailed benchmark tables with test performance metrics.** **Note:** Click on the test name to view the profiling image. Resources shown in the table for contracts include extra costs due to the foundry logic. Check the profile file for more details.
contracts
└── groth16_example_bls12_381_integrationtest::test_contract | Test Name | Steps | Range Check | Range Check 96 | Poseidon | Add Mod | Mul Mod | Sierra Gas | |------------------------------------------------------------------------------------------------|---------|---------------|------------------|------------|-----------|-----------|--------------| | [test_verify_groth16_proof_bls12_381](docs/benchmarks/test_verify_groth16_proof_bls12_381.png) | 353,527 | 10,972 | 90,280 | 586 | 7,506 | 10,868 | 49,754,798 |
└── groth16_example_bn254_integrationtest::test_contract | Test Name | Steps | Range Check | Range Check 96 | Poseidon | Add Mod | Mul Mod | Sierra Gas | |----------------------------------------------------------------------------------------|---------|---------------|------------------|------------|-----------|-----------|--------------| | [test_verify_groth16_proof_bn254](docs/benchmarks/test_verify_groth16_proof_bn254.png) | 228,557 | 9,785 | 67,149 | 509 | 5,401 | 8,754 | 34,080,559 |
└── noir_ultra_keccak_honk_example_integrationtest::test_contract | Test Name | Steps | Range Check | Range Check 96 | Bitwise | Poseidon | Add Mod | Mul Mod | Sierra Gas | |------------------------------------------------------------------------------------------------|-----------|---------------|------------------|-----------|------------|-----------|-----------|--------------| | [test_verify_ultra_keccak_honk_proof](docs/benchmarks/test_verify_ultra_keccak_honk_proof.png) | 1,213,031 | 65,539 | 412,656 | 3,180 | 461 | 45,756 | 43,585 | 187,929,077 |
└── noir_ultra_keccak_zk_honk_example_integrationtest::test_contract | Test Name | Steps | Range Check | Range Check 96 | Bitwise | Poseidon | Add Mod | Mul Mod | Sierra Gas | |------------------------------------------------------------------------------------------------------|-----------|---------------|------------------|-----------|------------|-----------|-----------|--------------| | [test_verify_ultra_keccak_zk_honk_proof](docs/benchmarks/test_verify_ultra_keccak_zk_honk_proof.png) | 1,306,049 | 70,398 | 451,651 | 3,476 | 461 | 49,914 | 47,993 | 203,546,067 |
└── noir_ultra_starknet_honk_example_integrationtest::test_contract | Test Name | Steps | Range Check | Range Check 96 | Poseidon | Add Mod | Mul Mod | Sierra Gas | |----------------------------------------------------------------------------------------------------|-----------|---------------|------------------|------------|-----------|-----------|--------------| | [test_verify_ultra_starknet_honk_proof](docs/benchmarks/test_verify_ultra_starknet_honk_proof.png) | 1,127,871 | 61,433 | 412,522 | 992 | 45,742 | 43,569 | 177,512,050 |
└── noir_ultra_starknet_zk_honk_example_integrationtest::test_contract | Test Name | Steps | Range Check | Range Check 96 | Poseidon | Add Mod | Mul Mod | Sierra Gas | |----------------------------------------------------------------------------------------------------------|-----------|---------------|------------------|------------|-----------|-----------|--------------| | [test_verify_ultra_starknet_zk_honk_proof](docs/benchmarks/test_verify_ultra_starknet_zk_honk_proof.png) | 1,221,360 | 66,173 | 451,576 | 1,044 | 49,911 | 47,987 | 193,032,648 |
└── risc0_verifier_bn254_integrationtest::test_contract | Test Name | Steps | Range Check | Range Check 96 | Bitwise | Poseidon | Add Mod | Mul Mod | Sierra Gas | |----------------------------------------------------------------------------------------------|---------|---------------|------------------|-----------|------------|-----------|-----------|--------------| | [test_verify_r0_groth16_proof_bn254](docs/benchmarks/test_verify_r0_groth16_proof_bn254.png) | 264,545 | 12,069 | 74,896 | 6,698 | 509 | 6,303 | 9,541 | 42,860,813 |
└── sp1_verifier_bn254_integrationtest::test_contract | Test Name | Steps | Range Check | Range Check 96 | Bitwise | Poseidon | Add Mod | Mul Mod | Sierra Gas | |------------------------------------------------------------------------------------------------|---------|---------------|------------------|-----------|------------|-----------|-----------|--------------| | [test_verify_sp1_groth16_proof_bn254](docs/benchmarks/test_verify_sp1_groth16_proof_bn254.png) | 244,680 | 11,127 | 75,027 | 2,230 | 509 | 6,314 | 9,555 | 38,221,851 |
garaga
└── apps
│ └── drand::tests | Test Name | Steps | Range Check | Range Check 96 | Bitwise | Add Mod | Mul Mod | Sierra Gas | |--------------------------------------------------------------------------------------|---------|---------------|------------------|-----------|-----------|-----------|--------------| | [test_decrypt_at_round](docs/benchmarks/test_decrypt_at_round.png) | 289,447 | 3,919 | 385,790 | 14,506 | 57,320 | 28,871 | 89,901,952 | | [test_hash_to_curve](docs/benchmarks/test_hash_to_curve.png) | 26,526 | 971 | 4,559 | 12,289 | 422 | 602 | 10,601,029 | | [test_hash_to_two_bls_felts](docs/benchmarks/test_hash_to_two_bls_felts.png) | 23,557 | 900 | 74 | 12,289 | 2 | 8 | 9,592,623 | | [test_drand_quicknet_public_key](docs/benchmarks/test_drand_quicknet_public_key.png) | 12,861 | 68 | 14,864 | 0 | 1,490 | 1,674 | 3,477,040 | | [test_isogeny](docs/benchmarks/test_isogeny.png) | 1,844 | 58 | 878 | 0 | 51 | 111 | 316,402 | | [test_map_to_curve](docs/benchmarks/test_map_to_curve.png) | 647 | 11 | 264 | 0 | 6 | 39 | 105,190 |
│ └── noir
│ │ └── honk_transcript::tests | Test Name | Steps | Range Check | Bitwise | Poseidon | Sierra Gas | |--------------------------------------------------------------------------|---------|---------------|-----------|------------|--------------| | [test_transcript_keccak](docs/benchmarks/test_transcript_keccak.png) | 71,084 | 5,035 | 3,180 | 1 | 9,315,281 | | [test_transcript_starknet](docs/benchmarks/test_transcript_starknet.png) | 19,758 | 1,103 | 0 | 532 | 2,314,222 |
│ │ └── zk_honk_transcript::tests | Test Name | Steps | Range Check | Bitwise | Poseidon | Sierra Gas | |--------------------------------------------------------------------------------|---------|---------------|-----------|------------|--------------| | [test_zk_transcript_keccak](docs/benchmarks/test_zk_transcript_keccak.png) | 73,392 | 5,241 | 3,476 | 1 | 9,733,069 | | [test_zk_transcript_starknet](docs/benchmarks/test_zk_transcript_starknet.png) | 21,173 | 1,185 | 0 | 584 | 2,486,994 |
│ └── risc0::risc0_utils_tests | Test Name | Steps | Range Check | Bitwise | Sierra Gas | |--------------------------------------------------------------|---------|---------------|-----------|--------------| | [test_receipt_claim](docs/benchmarks/test_receipt_claim.png) | 11,117 | 433 | 5,591 | 4,401,563 | | [test_output_digest](docs/benchmarks/test_output_digest.png) | 4,424 | 171 | 2,230 | 1,754,460 |
│ └── sp1::tests | Test Name | Steps | Range Check | Sierra Gas | |--------------------------------------------------------------------------|---------|---------------|--------------| | [test_convert_u32_to_u128](docs/benchmarks/test_convert_u32_to_u128.png) | 58 | 3 | 6,010 |
└── crypto::mmr::tests | Test Name | Steps | Range Check | Sierra Gas | |--------------------------------------------------------------|---------|---------------|--------------| | [test_trailing_ones](docs/benchmarks/test_trailing_ones.png) | 441 | 51 | 47,670 |
└── ec::ec_ops_g2::tests | Test Name | Steps | Range Check | Range Check 96 | Add Mod | Mul Mod | Sierra Gas | |------------------------------------------------------|---------|---------------|------------------|-----------|-----------|--------------| | [test_ec_mul_g2](docs/benchmarks/test_ec_mul_g2.png) | 105,060 | 1,074 | 87,664 | 8,551 | 9,755 | 23,349,114 |
└── hashes::poseidon_bn254::tests | Test Name | Steps | Range Check | Range Check 96 | Add Mod | Mul Mod | Sierra Gas | |--------------------------------------------------------------------------------------------------|---------|---------------|------------------|-----------|-----------|--------------| | [test_run_poseidon_grumpkin_circuit_1](docs/benchmarks/test_run_poseidon_grumpkin_circuit_1.png) | 9,913 | 327 | 6,393 | 353 | 919 | 2,008,464 |
└── tests
│ └── autogenerated
│ │ └── ecdsa_tests | Test Name | Steps | Range Check | Range Check 96 | Add Mod | Mul Mod | Sierra Gas | |------------------------------------------------------------------|---------|---------------|------------------|-----------|-----------|--------------| | [test_ecdsa_SECP256R1](docs/benchmarks/test_ecdsa_SECP256R1.png) | 14,099 | 1,072 | 20,022 | 2,367 | 2,184 | 4,469,718 | | [test_ecdsa_SECP256K1](docs/benchmarks/test_ecdsa_SECP256K1.png) | 18,723 | 2,082 | 15,629 | 1,810 | 1,592 | 4,271,132 |
│ │ └── eddsa_tests | Test Name | Steps | Range Check | Range Check 96 | Bitwise | Add Mod | Mul Mod | Sierra Gas | |------------------------------------------------------------|---------|---------------|------------------|-----------|-----------|-----------|--------------| | [test_eddsa_32_64B](docs/benchmarks/test_eddsa_32_64B.png) | 88,025 | 13,786 | 20,762 | 3,288 | 2,412 | 2,276 | 14,776,560 | | [test_eddsa_16_32B](docs/benchmarks/test_eddsa_16_32B.png) | 52,391 | 7,643 | 20,840 | 1,656 | 2,418 | 2,284 | 9,842,274 | | [test_eddsa_0_0B](docs/benchmarks/test_eddsa_0_0B.png) | 51,814 | 7,549 | 20,865 | 1,656 | 2,419 | 2,286 | 9,780,832 |
│ │ └── msm_tests | Test Name | Steps | Range Check | Range Check 96 | Add Mod | Mul Mod | Sierra Gas | |--------------------------------------------------------------------|---------|---------------|------------------|-----------|-----------|--------------| | [test_msm_SECP256R1_3P](docs/benchmarks/test_msm_SECP256R1_3P.png) | 20,115 | 1,576 | 29,835 | 3,546 | 3,252 | 6,572,368 | | [test_msm_SECP256K1_3P](docs/benchmarks/test_msm_SECP256K1_3P.png) | 26,954 | 3,087 | 23,194 | 2,707 | 2,359 | 6,257,800 | | [test_msm_SECP256R1_2P](docs/benchmarks/test_msm_SECP256R1_2P.png) | 13,465 | 1,053 | 19,865 | 2,363 | 2,166 | 4,384,404 | | [test_msm_SECP256K1_2P](docs/benchmarks/test_msm_SECP256K1_2P.png) | 17,919 | 2,061 | 15,369 | 1,799 | 1,564 | 4,155,260 | | [test_msm_SECP256R1_1P](docs/benchmarks/test_msm_SECP256R1_1P.png) | 6,991 | 530 | 9,945 | 1,182 | 1,084 | 2,219,716 | | [test_msm_SECP256K1_1P](docs/benchmarks/test_msm_SECP256K1_1P.png) | 9,221 | 1,037 | 7,697 | 900 | 783 | 2,105,654 |
│ │ └── pairing_tests | Test Name | Steps | Range Check | Range Check 96 | Poseidon | Add Mod | Mul Mod | Sierra Gas | |----------------------------------------------------------------------------------------------------------------------------------------------|---------|---------------|------------------|------------|-----------|-----------|--------------| | [test_BN254_mpcheck_3P_2F_with_extra_miller_loop_result](docs/benchmarks/test_BN254_mpcheck_3P_2F_with_extra_miller_loop_result.png) | 59,916 | 472 | 59,008 | 509 | 4,469 | 7,922 | 15,391,765 | | [test_BLS12_381_mpcheck_3P_2F_with_extra_miller_loop_result](docs/benchmarks/test_BLS12_381_mpcheck_3P_2F_with_extra_miller_loop_result.png) | 54,316 | 356 | 44,885 | 586 | 3,482 | 5,791 | 12,556,430 | | [test_BN254_mpcheck_2P_2F](docs/benchmarks/test_BN254_mpcheck_2P_2F.png) | 47,930 | 393 | 33,047 | 460 | 1,731 | 4,665 | 10,112,792 | | [test_BLS12_381_mpcheck_2P_2F](docs/benchmarks/test_BLS12_381_mpcheck_2P_2F.png) | 45,132 | 308 | 25,250 | 544 | 1,420 | 3,340 | 8,559,824 |
│ │ └── schnorr_tests | Test Name | Steps | Range Check | Range Check 96 | Add Mod | Mul Mod | Sierra Gas | |----------------------------------------------------------------------|---------|---------------|------------------|-----------|-----------|--------------| | [test_schnorr_SECP256K1](docs/benchmarks/test_schnorr_SECP256K1.png) | 18,321 | 2,082 | 15,512 | 1,808 | 1,580 | 4,216,672 |
│ │ └── tower_pairing_tests | Test Name | Steps | Range Check | Range Check 96 | Add Mod | Mul Mod | Sierra Gas | |----------------------------------------------------------------------------------------|---------|---------------|------------------|-----------|-----------|--------------| | [test_tower_pairing_BN254_3P](docs/benchmarks/test_tower_pairing_BN254_3P.png) | 268,869 | 474 | 626,255 | 94,555 | 50,514 | 114,248,466 | | [test_tower_pairing_BLS12_381_3P](docs/benchmarks/test_tower_pairing_BLS12_381_3P.png) | 248,951 | 556 | 538,321 | 86,187 | 37,849 | 97,763,802 | | [test_tower_pairing_BN254_2P](docs/benchmarks/test_tower_pairing_BN254_2P.png) | 219,367 | 398 | 486,548 | 73,494 | 38,661 | 89,466,112 | | [test_tower_pairing_BLS12_381_2P](docs/benchmarks/test_tower_pairing_BLS12_381_2P.png) | 207,121 | 493 | 422,516 | 67,911 | 28,926 | 77,498,340 | | [test_tower_pairing_BN254_1P](docs/benchmarks/test_tower_pairing_BN254_1P.png) | 169,865 | 322 | 346,841 | 52,433 | 26,808 | 64,683,758 | | [test_tower_pairing_BLS12_381_1P](docs/benchmarks/test_tower_pairing_BLS12_381_1P.png) | 165,291 | 430 | 306,711 | 49,635 | 20,003 | 57,232,878 | | [test_tower_final_exp_BN254](docs/benchmarks/test_tower_final_exp_BN254.png) | 120,363 | 246 | 207,134 | 31,372 | 14,955 | 39,901,404 | | [test_tower_final_exp_BLS12_381](docs/benchmarks/test_tower_final_exp_BLS12_381.png) | 123,509 | 367 | 190,906 | 31,359 | 11,080 | 36,972,216 |
│ └── calldata_tests | Test Name | Steps | Range Check | Sierra Gas | |--------------------------------------------------------------------------------------------------------------------------|---------|---------------|--------------| | [test_deserialize_full_proof_with_hints_bls12_381](docs/benchmarks/test_deserialize_full_proof_with_hints_bls12_381.png) | 22,272 | 4,714 | 2,557,180 |
│ └── sha512_tests | Test Name | Steps | Range Check | Bitwise | Sierra Gas | |------------------------------------------------------------------------|---------|---------------|-----------|--------------| | [test_sha512_lorem_ipsum](docs/benchmarks/test_sha512_lorem_ipsum.png) | 102,856 | 18,169 | 4,904 | 14,416,462 | | [test_size_zero](docs/benchmarks/test_size_zero.png) | 37,579 | 6,404 | 1,640 | 5,162,300 | | [test_sha512_size_one](docs/benchmarks/test_sha512_size_one.png) | 37,564 | 6,403 | 1,640 | 5,160,730 |
└── utils::neg_3::tests | Test Name | Steps | Range Check | Sierra Gas | |------------------------------------------------------------------------------|---------|---------------|--------------| | [test_scalar_to_epns](docs/benchmarks/test_scalar_to_epns.png) | 6,103 | 928 | 675,260 | | [test_scalar_to_epns_single](docs/benchmarks/test_scalar_to_epns_single.png) | 1,940 | 297 | 214,790 |
--- 🔄 **To regenerate these benchmarks:** Run `make profile-test` from the project root. ## Support & How to Contribute We warmly welcome contributions and support from the community! Here's how you can help Garaga grow and improve: ### Reporting Issues & Requesting Features - **Spot a bug? Have a feature request?** Check out our [issues page](https://github.com/keep-starknet-strange/garaga/issues) to see if it's already been reported or to open a new issue. ### Contributing to Garaga - **Interested in contributing?** Please take a moment to read our [contribution guidelines](docs/CONTRIBUTING.md) for details on how to get started. Your contributions make the open-source community an incredible place for learning, inspiration, and creation. ### Showing Support - **Love Garaga?** Give us a [star on GitHub](https://github.com/keep-starknet-strange/garaga) to show your support. - **Spread the word:** Share your excitement about Garaga on social platforms like Twitter, [Dev.to](https://dev.to/), [Medium](https://medium.com/), or your personal blog. - **Join the conversation:** Connect with us and other Garaga enthusiasts on our [Telegram group](https://t.me/GaragaPairingCairo). Every contribution, whether it's code, feedback, or spreading the word, greatly benefits everyone and is deeply appreciated. Thank you for being a part of Garaga's journey! ## Security Garaga follows good practices of security, but 100% security cannot be assured. Garaga is provided **"as is"** without any **warranty**. Use at your own risk. _For more information and to report security issues, please refer to our [security documentation](docs/SECURITY.md)._ ## License This project is licensed under the **MIT license**. See [LICENSE](LICENSE) for more information. ## Acknowledgements - Huge props to [tekkac](https://github.com/tekkac) and [feltroidprime](https://github.com/feltroidprime) for their initial work on provable pairing-based cryptography in StarkNet. - Credits to [Nethermind](https://github.com/NethermindEth/) for their [initial work on optimized modular arithmetic](https://github.com/NethermindEth/research-basic-Cairo-operations-big-integers/tree/main/lib). - [Herodotus](https://www.herodotus.dev/) for supporting this project. - [Gnark project](https://github.com/ConsenSys/gnark-crypto) and team, especially [yelhousni](https://github.com/yelhousni) for his amazing knowledge and support. - [OnlyDust](https://www.onlydust.xyz/) and [Starkware](https://starkware.co/). - Liam Eagen and Andrija Novakovic for their support and amazing research. ## Resources - Craig Costello, [Pairing for beginners](https://static1.squarespace.com/static/5fdbb09f31d71c1227082339/t/5ff394720493bd28278889c6/1609798774687/PairingsForBeginners.pdf) - Y. El Housni, "Pairings in Rank-1 Constraint Systems," Cryptology ePrint Archive, Report 2022/1162, 2022. Available: [https://eprint.iacr.org/2022/1162](https://eprint.iacr.org/2022/1162). - feltroidprime. "Faster Extension Field multiplications for Emulated Pairing Circuits." HackMD, [https://hackmd.io/@feltroidprime/B1eyHHXNT](https://hackmd.io/@feltroidprime/B1eyHHXNT). - Liam Eagen, "Zero Knowledge Proofs of Elliptic Curve Inner Products from Principal Divisors and Weil Reciprocity," Cryptology ePrint Archive, Report 2022/596, 2022. Available: [https://eprint.iacr.org/2022/596](https://eprint.iacr.org/2022/596) - Andrija Novakovic and Liam Eagen, "On Proving Pairings," Cryptology ePrint Archive, Paper 2024/640, 2024. Available: [https://eprint.iacr.org/2024/640](https://eprint.iacr.org/2024/640) - Liam Eagen, Youssef El Housni, Simon Masson, and Thomas Piellard, "Fast elliptic curve scalar multiplications in SN(T)ARK circuits," Cryptology ePrint Archive, Paper 2025/933, 2025. Available: [https://eprint.iacr.org/2025/933](https://eprint.iacr.org/2025/933) > **Note:** This list is not exhaustive, and is not intended to be. ## Contributors For a full list of all authors and contributors, see [the contributors page](https://github.com/keep-starknet-strange/garaga/contributors). Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Feltroid Prime
Feltroid Prime

💻
Abdel @ StarkWare
Abdel @ StarkWare

💻
Tarik K.
Tarik K.

💻
Bachir Arif
Bachir Arif

💻
Renaud Dubois
Renaud Dubois

💻
Rodrigo Ferreira
Rodrigo Ferreira

💻
Luiz Vasconcelos Júnior
Luiz Vasconcelos Júnior

💻
Shramee Srivastav
Shramee Srivastav

💻
Andrija Novakovic
Andrija Novakovic

💻
Liam Eagen
Liam Eagen

💻
Paul Etscheit
Paul Etscheit

💻
stefanMadzharov
stefanMadzharov

💻
Add your contributions
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! ================================================ FILE: Scarb.toml ================================================ [workspace] members = [ "src/", "src/corelib_imports", ] [workspace.dependencies] cairo_test = "2.16.1" starknet = "2.16.1" [workspace.scripts] test = "snforge test -p garaga --include-ignored" [cairo] sierra-replace-ids = false ================================================ FILE: docs/CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project maintainer using any of the [private contact addresses](https://github.com/keep-starknet-strange/garaga#support). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4, available at For answers to common questions about this code of conduct, see ================================================ FILE: docs/CONTRIBUTING.md ================================================ # Contributing When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change. Please note we have a [code of conduct](CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. ## Development environment setup > **[?]** > Proceed to describe how to setup local development environment. > e.g: To set up a development environment, please follow these steps: 1. Clone the repo and run setup (Python 3.10-3.14 and [uv](https://docs.astral.sh/uv/) are installed automatically if needed): ```sh git clone https://github.com/keep-starknet-strange/garaga cd garaga make setup source venv/bin/activate ``` 2. You also need [Rust](https://www.rust-lang.org/tools/install) and [Scarb 2.16.1](https://docs.swmansion.com/scarb/download.html) installed. ## Issues and feature requests You've found a bug in the source code, a mistake in the documentation or maybe you'd like a new feature?Take a look at [GitHub Discussions](https://github.com/keep-starknet-strange/garaga/discussions) to see if it's already being discussed. You can help us by [submitting an issue on GitHub](https://github.com/keep-starknet-strange/garaga/issues). Before you create an issue, make sure to search the issue archive -- your issue may have already been addressed! Please try to create bug reports that are: - _Reproducible._ Include steps to reproduce the problem. - _Specific._ Include as much detail as possible: which version, what environment, etc. - _Unique._ Do not duplicate existing opened issues. - _Scoped to a Single Bug._ One bug per report. **Even better: Submit a pull request with a fix or new feature!** ### How to submit a Pull Request 1. Search our repository for open or closed [Pull Requests](https://github.com/keep-starknet-strange/garaga/pulls) that relate to your submission. You don't want to duplicate effort. 2. Fork the project 3. Create your feature branch (`git checkout -b feat/amazing_feature`) 4. Commit your changes (`git commit -m 'feat: add amazing_feature'`) 5. Push to the branch (`git push origin feat/amazing_feature`) 6. [Open a Pull Request](https://github.com/keep-starknet-strange/garaga/compare?expand=1) ================================================ FILE: docs/PYPI_README.md ================================================ # Garaga 🐺 State-of-the-art Elliptic Curve operations and SNARKS verification for Cairo & Starknet. ## Quick Start ```bash pip install garaga ``` **Requirements:** Python 3.10 through 3.14 ## What is Garaga? Garaga provides optimized cryptographic primitives for: - **Elliptic Curve Operations** - High-performance curve arithmetic - **SNARK Verification** - Groth16, Honk, and other proof systems - **Pairing-Based Cryptography** - BN254, BLS12-381 curves - **Cairo/Starknet Integration** - Native integration with Starknet ecosystem ## CLI Usage After installation, access the CLI: ```bash garaga --help ``` Generate SNARK verifier contracts: ```bash garaga gen ``` ## Key Features ✅ **Multi-Curve Support** - BN254, BLS12-381, and more ✅ **SNARK Verifiers** - Groth16, Noir Honk proof verification ✅ **Cairo Integration** - Seamless Starknet development ✅ **Rust Performance** - Optimized core operations ## Documentation & Links - 📖 **Documentation**: [garaga.gitbook.io](https://garaga.gitbook.io/) - 🔧 **GitHub**: [github.com/keep-starknet-strange/garaga](https://github.com/keep-starknet-strange/garaga) - 🐛 **Issues**: [Report bugs](https://github.com/keep-starknet-strange/garaga/issues) ## Version Management Install specific version: ```bash pip install garaga==1.1.0 ``` Install from Git commit: ```bash pip install git+https://github.com/keep-starknet-strange/garaga.git@COMMIT_HASH ``` ## License MIT License - see [LICENSE](https://github.com/keep-starknet-strange/garaga/blob/main/LICENSE) ================================================ FILE: docs/SECURITY.md ================================================ # Security Policy ## Reporting a Vulnerability If there are any vulnerabilities in **Garaga**, don't hesitate to _report them_. 1. Use any of the [private contact addresses](https://github.com/keep-starknet-strange/garaga#support). 2. Describe the vulnerability. If you have a fix, that is most welcome -- please attach or summarize it in your message! 3. We will evaluate the vulnerability and, if necessary, release a fix or mitigating steps to address it. We will contact you to let you know the outcome, and will credit you in the report. Please **do not disclose the vulnerability publicly** until a fix is released! 4. Once we have either a) published a fix, or b) declined to address the vulnerability for whatever reason, you are free to publicly disclose it. ================================================ FILE: docs/benchmarks/test_summary.json ================================================ { "test_trailing_ones": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::crypto::mmr::tests::test_trailing_ones", "test_name": "test_trailing_ones", "steps": 441, "sierra_gas": 47670, "image_path": "docs/benchmarks/test_trailing_ones.png", "category": "garaga", "range_check": 51, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 0, "mul_mod": 0 } }, "test_receipt_claim": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::risc0::risc0_utils_tests::test_receipt_claim", "test_name": "test_receipt_claim", "steps": 11117, "sierra_gas": 4401563, "image_path": "docs/benchmarks/test_receipt_claim.png", "category": "garaga", "range_check": 433, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 5591, "ecop": 0, "poseidon": 0, "add_mod": 0, "mul_mod": 0 } }, "test_zk_transcript_keccak": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::noir::zk_honk_transcript::tests::test_zk_transcript_keccak", "test_name": "test_zk_transcript_keccak", "steps": 73392, "sierra_gas": 9733069, "image_path": "docs/benchmarks/test_zk_transcript_keccak.png", "category": "garaga", "range_check": 5241, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 3476, "ecop": 0, "poseidon": 1, "add_mod": 0, "mul_mod": 0 } }, "test_output_digest": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::risc0::risc0_utils_tests::test_output_digest", "test_name": "test_output_digest", "steps": 4424, "sierra_gas": 1754460, "image_path": "docs/benchmarks/test_output_digest.png", "category": "garaga", "range_check": 171, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 2230, "ecop": 0, "poseidon": 0, "add_mod": 0, "mul_mod": 0 } }, "test_ecdsa_SECP256R1": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::ecdsa_tests::test_ecdsa_SECP256R1", "test_name": "test_ecdsa_SECP256R1", "steps": 14099, "sierra_gas": 4469718, "image_path": "docs/benchmarks/test_ecdsa_SECP256R1.png", "category": "garaga", "range_check": 1072, "range_check96": 20022, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 2367, "mul_mod": 2184 } }, "test_scalar_to_epns": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::utils::neg_3::tests::test_scalar_to_epns", "test_name": "test_scalar_to_epns", "steps": 6103, "sierra_gas": 675260, "image_path": "docs/benchmarks/test_scalar_to_epns.png", "category": "garaga", "range_check": 928, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 0, "mul_mod": 0 } }, "test_run_poseidon_grumpkin_circuit_1": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::hashes::poseidon_bn254::tests::test_run_poseidon_grumpkin_circuit_1", "test_name": "test_run_poseidon_grumpkin_circuit_1", "steps": 9913, "sierra_gas": 2008464, "image_path": "docs/benchmarks/test_run_poseidon_grumpkin_circuit_1.png", "category": "garaga", "range_check": 327, "range_check96": 6393, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 353, "mul_mod": 919 } }, "test_hash_to_curve": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::drand::tests::test_hash_to_curve", "test_name": "test_hash_to_curve", "steps": 26526, "sierra_gas": 10601029, "image_path": "docs/benchmarks/test_hash_to_curve.png", "category": "garaga", "range_check": 971, "range_check96": 4559, "keccak": 0, "pedersen": 0, "bitwise": 12289, "ecop": 0, "poseidon": 0, "add_mod": 422, "mul_mod": 602 } }, "test_transcript_keccak": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::noir::honk_transcript::tests::test_transcript_keccak", "test_name": "test_transcript_keccak", "steps": 71084, "sierra_gas": 9315281, "image_path": "docs/benchmarks/test_transcript_keccak.png", "category": "garaga", "range_check": 5035, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 3180, "ecop": 0, "poseidon": 1, "add_mod": 0, "mul_mod": 0 } }, "test_zk_transcript_starknet": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::noir::zk_honk_transcript::tests::test_zk_transcript_starknet", "test_name": "test_zk_transcript_starknet", "steps": 21173, "sierra_gas": 2486994, "image_path": "docs/benchmarks/test_zk_transcript_starknet.png", "category": "garaga", "range_check": 1185, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 584, "add_mod": 0, "mul_mod": 0 } }, "test_convert_u32_to_u128": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::sp1::tests::test_convert_u32_to_u128", "test_name": "test_convert_u32_to_u128", "steps": 58, "sierra_gas": 6010, "image_path": "docs/benchmarks/test_convert_u32_to_u128.png", "category": "garaga", "range_check": 3, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 0, "mul_mod": 0 } }, "test_ecdsa_SECP256K1": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::ecdsa_tests::test_ecdsa_SECP256K1", "test_name": "test_ecdsa_SECP256K1", "steps": 18723, "sierra_gas": 4271132, "image_path": "docs/benchmarks/test_ecdsa_SECP256K1.png", "category": "garaga", "range_check": 2082, "range_check96": 15629, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 1810, "mul_mod": 1592 } }, "test_drand_quicknet_public_key": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::drand::tests::test_drand_quicknet_public_key", "test_name": "test_drand_quicknet_public_key", "steps": 12861, "sierra_gas": 3477040, "image_path": "docs/benchmarks/test_drand_quicknet_public_key.png", "category": "garaga", "range_check": 68, "range_check96": 14864, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 1490, "mul_mod": 1674 } }, "test_scalar_to_epns_single": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::utils::neg_3::tests::test_scalar_to_epns_single", "test_name": "test_scalar_to_epns_single", "steps": 1940, "sierra_gas": 214790, "image_path": "docs/benchmarks/test_scalar_to_epns_single.png", "category": "garaga", "range_check": 297, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 0, "mul_mod": 0 } }, "test_hash_to_two_bls_felts": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::drand::tests::test_hash_to_two_bls_felts", "test_name": "test_hash_to_two_bls_felts", "steps": 23557, "sierra_gas": 9592623, "image_path": "docs/benchmarks/test_hash_to_two_bls_felts.png", "category": "garaga", "range_check": 900, "range_check96": 74, "keccak": 0, "pedersen": 0, "bitwise": 12289, "ecop": 0, "poseidon": 0, "add_mod": 2, "mul_mod": 8 } }, "test_transcript_starknet": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::noir::honk_transcript::tests::test_transcript_starknet", "test_name": "test_transcript_starknet", "steps": 19758, "sierra_gas": 2314222, "image_path": "docs/benchmarks/test_transcript_starknet.png", "category": "garaga", "range_check": 1103, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 532, "add_mod": 0, "mul_mod": 0 } }, "test_size_zero": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::sha512_tests::test_size_zero", "test_name": "test_size_zero", "steps": 37579, "sierra_gas": 5162300, "image_path": "docs/benchmarks/test_size_zero.png", "category": "garaga", "range_check": 6404, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 1640, "ecop": 0, "poseidon": 0, "add_mod": 0, "mul_mod": 0 } }, "test_isogeny": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::drand::tests::test_isogeny", "test_name": "test_isogeny", "steps": 1844, "sierra_gas": 316402, "image_path": "docs/benchmarks/test_isogeny.png", "category": "garaga", "range_check": 58, "range_check96": 878, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 51, "mul_mod": 111 } }, "test_sha512_lorem_ipsum": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::sha512_tests::test_sha512_lorem_ipsum", "test_name": "test_sha512_lorem_ipsum", "steps": 102856, "sierra_gas": 14416462, "image_path": "docs/benchmarks/test_sha512_lorem_ipsum.png", "category": "garaga", "range_check": 18169, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 4904, "ecop": 0, "poseidon": 0, "add_mod": 0, "mul_mod": 0 } }, "test_sha512_size_one": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::sha512_tests::test_sha512_size_one", "test_name": "test_sha512_size_one", "steps": 37564, "sierra_gas": 5160730, "image_path": "docs/benchmarks/test_sha512_size_one.png", "category": "garaga", "range_check": 6403, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 1640, "ecop": 0, "poseidon": 0, "add_mod": 0, "mul_mod": 0 } }, "test_map_to_curve": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::drand::tests::test_map_to_curve", "test_name": "test_map_to_curve", "steps": 647, "sierra_gas": 105190, "image_path": "docs/benchmarks/test_map_to_curve.png", "category": "garaga", "range_check": 11, "range_check96": 264, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 6, "mul_mod": 39 } }, "test_schnorr_SECP256K1": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::schnorr_tests::test_schnorr_SECP256K1", "test_name": "test_schnorr_SECP256K1", "steps": 18321, "sierra_gas": 4216672, "image_path": "docs/benchmarks/test_schnorr_SECP256K1.png", "category": "garaga", "range_check": 2082, "range_check96": 15512, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 1808, "mul_mod": 1580 } }, "test_ec_mul_g2": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::ec::ec_ops_g2::tests::test_ec_mul_g2", "test_name": "test_ec_mul_g2", "steps": 105060, "sierra_gas": 23349114, "image_path": "docs/benchmarks/test_ec_mul_g2.png", "category": "garaga", "range_check": 1074, "range_check96": 87664, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 8551, "mul_mod": 9755 } }, "test_decrypt_at_round": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::apps::drand::tests::test_decrypt_at_round", "test_name": "test_decrypt_at_round", "steps": 289447, "sierra_gas": 89901952, "image_path": "docs/benchmarks/test_decrypt_at_round.png", "category": "garaga", "range_check": 3919, "range_check96": 385790, "keccak": 0, "pedersen": 0, "bitwise": 14506, "ecop": 0, "poseidon": 0, "add_mod": 57320, "mul_mod": 28871 } }, "test_verify_groth16_proof_bn254": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "groth16_example_bn254_integrationtest::test_contract::test_verify_groth16_proof_bn254", "test_name": "test_verify_groth16_proof_bn254", "steps": 228557, "sierra_gas": 34080559, "image_path": "docs/benchmarks/test_verify_groth16_proof_bn254.png", "category": "contracts", "range_check": 9785, "range_check96": 67149, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 509, "add_mod": 5401, "mul_mod": 8754 } }, "test_verify_ultra_keccak_honk_proof": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "noir_ultra_keccak_honk_example_integrationtest::test_contract::test_verify_ultra_keccak_honk_proof", "test_name": "test_verify_ultra_keccak_honk_proof", "steps": 1213031, "sierra_gas": 187929077, "image_path": "docs/benchmarks/test_verify_ultra_keccak_honk_proof.png", "category": "contracts", "range_check": 65539, "range_check96": 412656, "keccak": 0, "pedersen": 0, "bitwise": 3180, "ecop": 0, "poseidon": 461, "add_mod": 45756, "mul_mod": 43585 } }, "test_msm_SECP256K1_3P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::msm_tests::test_msm_SECP256K1_3P", "test_name": "test_msm_SECP256K1_3P", "steps": 26954, "sierra_gas": 6257800, "image_path": "docs/benchmarks/test_msm_SECP256K1_3P.png", "category": "garaga", "range_check": 3087, "range_check96": 23194, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 2707, "mul_mod": 2359 } }, "test_msm_SECP256R1_2P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::msm_tests::test_msm_SECP256R1_2P", "test_name": "test_msm_SECP256R1_2P", "steps": 13465, "sierra_gas": 4384404, "image_path": "docs/benchmarks/test_msm_SECP256R1_2P.png", "category": "garaga", "range_check": 1053, "range_check96": 19865, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 2363, "mul_mod": 2166 } }, "test_BN254_mpcheck_3P_2F_with_extra_miller_loop_result": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::pairing_tests::test_BN254_mpcheck_3P_2F_with_extra_miller_loop_result", "test_name": "test_BN254_mpcheck_3P_2F_with_extra_miller_loop_result", "steps": 59916, "sierra_gas": 15391765, "image_path": "docs/benchmarks/test_BN254_mpcheck_3P_2F_with_extra_miller_loop_result.png", "category": "garaga", "range_check": 472, "range_check96": 59008, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 509, "add_mod": 4469, "mul_mod": 7922 } }, "test_BLS12_381_mpcheck_2P_2F": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::pairing_tests::test_BLS12_381_mpcheck_2P_2F", "test_name": "test_BLS12_381_mpcheck_2P_2F", "steps": 45132, "sierra_gas": 8559824, "image_path": "docs/benchmarks/test_BLS12_381_mpcheck_2P_2F.png", "category": "garaga", "range_check": 308, "range_check96": 25250, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 544, "add_mod": 1420, "mul_mod": 3340 } }, "test_BLS12_381_mpcheck_3P_2F_with_extra_miller_loop_result": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::pairing_tests::test_BLS12_381_mpcheck_3P_2F_with_extra_miller_loop_result", "test_name": "test_BLS12_381_mpcheck_3P_2F_with_extra_miller_loop_result", "steps": 54316, "sierra_gas": 12556430, "image_path": "docs/benchmarks/test_BLS12_381_mpcheck_3P_2F_with_extra_miller_loop_result.png", "category": "garaga", "range_check": 356, "range_check96": 44885, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 586, "add_mod": 3482, "mul_mod": 5791 } }, "test_eddsa_0_0B": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::eddsa_tests::test_eddsa_0_0B", "test_name": "test_eddsa_0_0B", "steps": 51814, "sierra_gas": 9780832, "image_path": "docs/benchmarks/test_eddsa_0_0B.png", "category": "garaga", "range_check": 7549, "range_check96": 20865, "keccak": 0, "pedersen": 0, "bitwise": 1656, "ecop": 0, "poseidon": 0, "add_mod": 2419, "mul_mod": 2286 } }, "test_tower_final_exp_BN254": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::tower_pairing_tests::test_tower_final_exp_BN254", "test_name": "test_tower_final_exp_BN254", "steps": 120363, "sierra_gas": 39901404, "image_path": "docs/benchmarks/test_tower_final_exp_BN254.png", "category": "garaga", "range_check": 246, "range_check96": 207134, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 31372, "mul_mod": 14955 } }, "test_tower_final_exp_BLS12_381": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::tower_pairing_tests::test_tower_final_exp_BLS12_381", "test_name": "test_tower_final_exp_BLS12_381", "steps": 123509, "sierra_gas": 36972216, "image_path": "docs/benchmarks/test_tower_final_exp_BLS12_381.png", "category": "garaga", "range_check": 367, "range_check96": 190906, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 31359, "mul_mod": 11080 } }, "test_msm_SECP256K1_2P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::msm_tests::test_msm_SECP256K1_2P", "test_name": "test_msm_SECP256K1_2P", "steps": 17919, "sierra_gas": 4155260, "image_path": "docs/benchmarks/test_msm_SECP256K1_2P.png", "category": "garaga", "range_check": 2061, "range_check96": 15369, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 1799, "mul_mod": 1564 } }, "test_BN254_mpcheck_2P_2F": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::pairing_tests::test_BN254_mpcheck_2P_2F", "test_name": "test_BN254_mpcheck_2P_2F", "steps": 47930, "sierra_gas": 10112792, "image_path": "docs/benchmarks/test_BN254_mpcheck_2P_2F.png", "category": "garaga", "range_check": 393, "range_check96": 33047, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 460, "add_mod": 1731, "mul_mod": 4665 } }, "test_msm_SECP256K1_1P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::msm_tests::test_msm_SECP256K1_1P", "test_name": "test_msm_SECP256K1_1P", "steps": 9221, "sierra_gas": 2105654, "image_path": "docs/benchmarks/test_msm_SECP256K1_1P.png", "category": "garaga", "range_check": 1037, "range_check96": 7697, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 900, "mul_mod": 783 } }, "test_deserialize_full_proof_with_hints_bls12_381": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::calldata_tests::test_deserialize_full_proof_with_hints_bls12_381", "test_name": "test_deserialize_full_proof_with_hints_bls12_381", "steps": 22272, "sierra_gas": 2557180, "image_path": "docs/benchmarks/test_deserialize_full_proof_with_hints_bls12_381.png", "category": "garaga", "range_check": 4714, "range_check96": 0, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 0, "mul_mod": 0 } }, "test_eddsa_16_32B": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::eddsa_tests::test_eddsa_16_32B", "test_name": "test_eddsa_16_32B", "steps": 52391, "sierra_gas": 9842274, "image_path": "docs/benchmarks/test_eddsa_16_32B.png", "category": "garaga", "range_check": 7643, "range_check96": 20840, "keccak": 0, "pedersen": 0, "bitwise": 1656, "ecop": 0, "poseidon": 0, "add_mod": 2418, "mul_mod": 2284 } }, "test_eddsa_32_64B": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::eddsa_tests::test_eddsa_32_64B", "test_name": "test_eddsa_32_64B", "steps": 88025, "sierra_gas": 14776560, "image_path": "docs/benchmarks/test_eddsa_32_64B.png", "category": "garaga", "range_check": 13786, "range_check96": 20762, "keccak": 0, "pedersen": 0, "bitwise": 3288, "ecop": 0, "poseidon": 0, "add_mod": 2412, "mul_mod": 2276 } }, "test_msm_SECP256R1_1P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::msm_tests::test_msm_SECP256R1_1P", "test_name": "test_msm_SECP256R1_1P", "steps": 6991, "sierra_gas": 2219716, "image_path": "docs/benchmarks/test_msm_SECP256R1_1P.png", "category": "garaga", "range_check": 530, "range_check96": 9945, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 1182, "mul_mod": 1084 } }, "test_msm_SECP256R1_3P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::msm_tests::test_msm_SECP256R1_3P", "test_name": "test_msm_SECP256R1_3P", "steps": 20115, "sierra_gas": 6572368, "image_path": "docs/benchmarks/test_msm_SECP256R1_3P.png", "category": "garaga", "range_check": 1576, "range_check96": 29835, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 3546, "mul_mod": 3252 } }, "test_verify_groth16_proof_bls12_381": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "groth16_example_bls12_381_integrationtest::test_contract::test_verify_groth16_proof_bls12_381", "test_name": "test_verify_groth16_proof_bls12_381", "steps": 353527, "sierra_gas": 49754798, "image_path": "docs/benchmarks/test_verify_groth16_proof_bls12_381.png", "category": "contracts", "range_check": 10972, "range_check96": 90280, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 586, "add_mod": 7506, "mul_mod": 10868 } }, "test_verify_ultra_keccak_zk_honk_proof": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "noir_ultra_keccak_zk_honk_example_integrationtest::test_contract::test_verify_ultra_keccak_zk_honk_proof", "test_name": "test_verify_ultra_keccak_zk_honk_proof", "steps": 1306049, "sierra_gas": 203546067, "image_path": "docs/benchmarks/test_verify_ultra_keccak_zk_honk_proof.png", "category": "contracts", "range_check": 70398, "range_check96": 451651, "keccak": 0, "pedersen": 0, "bitwise": 3476, "ecop": 0, "poseidon": 461, "add_mod": 49914, "mul_mod": 47993 } }, "test_verify_ultra_starknet_honk_proof": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "noir_ultra_starknet_honk_example_integrationtest::test_contract::test_verify_ultra_starknet_honk_proof", "test_name": "test_verify_ultra_starknet_honk_proof", "steps": 1127871, "sierra_gas": 177512050, "image_path": "docs/benchmarks/test_verify_ultra_starknet_honk_proof.png", "category": "contracts", "range_check": 61433, "range_check96": 412522, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 992, "add_mod": 45742, "mul_mod": 43569 } }, "test_tower_pairing_BN254_1P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::tower_pairing_tests::test_tower_pairing_BN254_1P", "test_name": "test_tower_pairing_BN254_1P", "steps": 169865, "sierra_gas": 64683758, "image_path": "docs/benchmarks/test_tower_pairing_BN254_1P.png", "category": "garaga", "range_check": 322, "range_check96": 346841, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 52433, "mul_mod": 26808 } }, "test_tower_pairing_BLS12_381_1P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::tower_pairing_tests::test_tower_pairing_BLS12_381_1P", "test_name": "test_tower_pairing_BLS12_381_1P", "steps": 165291, "sierra_gas": 57232878, "image_path": "docs/benchmarks/test_tower_pairing_BLS12_381_1P.png", "category": "garaga", "range_check": 430, "range_check96": 306711, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 49635, "mul_mod": 20003 } }, "test_tower_pairing_BLS12_381_3P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::tower_pairing_tests::test_tower_pairing_BLS12_381_3P", "test_name": "test_tower_pairing_BLS12_381_3P", "steps": 248951, "sierra_gas": 97763802, "image_path": "docs/benchmarks/test_tower_pairing_BLS12_381_3P.png", "category": "garaga", "range_check": 556, "range_check96": 538321, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 86187, "mul_mod": 37849 } }, "test_verify_ultra_starknet_zk_honk_proof": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "noir_ultra_starknet_zk_honk_example_integrationtest::test_contract::test_verify_ultra_starknet_zk_honk_proof", "test_name": "test_verify_ultra_starknet_zk_honk_proof", "steps": 1221360, "sierra_gas": 193032648, "image_path": "docs/benchmarks/test_verify_ultra_starknet_zk_honk_proof.png", "category": "contracts", "range_check": 66173, "range_check96": 451576, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 1044, "add_mod": 49911, "mul_mod": 47987 } }, "test_tower_pairing_BLS12_381_2P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::tower_pairing_tests::test_tower_pairing_BLS12_381_2P", "test_name": "test_tower_pairing_BLS12_381_2P", "steps": 207121, "sierra_gas": 77498340, "image_path": "docs/benchmarks/test_tower_pairing_BLS12_381_2P.png", "category": "garaga", "range_check": 493, "range_check96": 422516, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 67911, "mul_mod": 28926 } }, "test_tower_pairing_BN254_3P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::tower_pairing_tests::test_tower_pairing_BN254_3P", "test_name": "test_tower_pairing_BN254_3P", "steps": 268869, "sierra_gas": 114248466, "image_path": "docs/benchmarks/test_tower_pairing_BN254_3P.png", "category": "garaga", "range_check": 474, "range_check96": 626255, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 94555, "mul_mod": 50514 } }, "test_tower_pairing_BN254_2P": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "garaga::tests::autogenerated::tower_pairing_tests::test_tower_pairing_BN254_2P", "test_name": "test_tower_pairing_BN254_2P", "steps": 219367, "sierra_gas": 89466112, "image_path": "docs/benchmarks/test_tower_pairing_BN254_2P.png", "category": "garaga", "range_check": 398, "range_check96": 486548, "keccak": 0, "pedersen": 0, "bitwise": 0, "ecop": 0, "poseidon": 0, "add_mod": 73494, "mul_mod": 38661 } }, "test_verify_r0_groth16_proof_bn254": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "risc0_verifier_bn254_integrationtest::test_contract::test_verify_r0_groth16_proof_bn254", "test_name": "test_verify_r0_groth16_proof_bn254", "steps": 264545, "sierra_gas": 42860813, "image_path": "docs/benchmarks/test_verify_r0_groth16_proof_bn254.png", "category": "contracts", "range_check": 12069, "range_check96": 74896, "keccak": 0, "pedersen": 0, "bitwise": 6698, "ecop": 0, "poseidon": 509, "add_mod": 6303, "mul_mod": 9541 } }, "test_verify_sp1_groth16_proof_bn254": { "last_updated": "2025-10-30T15:26:00.944704", "latest_metrics": { "test_name_hierarchical": "sp1_verifier_bn254_integrationtest::test_contract::test_verify_sp1_groth16_proof_bn254", "test_name": "test_verify_sp1_groth16_proof_bn254", "steps": 244680, "sierra_gas": 38221851, "image_path": "docs/benchmarks/test_verify_sp1_groth16_proof_bn254.png", "category": "contracts", "range_check": 11127, "range_check96": 75027, "keccak": 0, "pedersen": 0, "bitwise": 2230, "ecop": 0, "poseidon": 509, "add_mod": 6314, "mul_mod": 9555 } } } ================================================ FILE: docs/gitbook/README.md ================================================ # Garaga
Garaga Logo
## State-of-the-Art Elliptic Curve Tooling & ZK Proof Verification for Starknet Garaga enables **efficient verification of zero-knowledge proofs** and **cryptographic operations** on Starknet. It achieves state-of-the-art performance through: * A **dedicated builtin** from StarkWare for emulated modular arithmetic * **Non-deterministic techniques** for extension field multiplication, pairings, and multi-scalar multiplication * **Precomputed verification hints** that dramatically reduce on-chain computation *** ## What Can You Build?
🛡️ ZK Proof VerificationVerify Groth16 and Honk proofs on-chain with production-ready verifier contracts.Learn more →
🔗 zkVM IntegrationVerify proofs from RISC Zero and SP1 using maintained, audited contracts.Learn more →
✍️ Signature VerificationECDSA, Schnorr, and EdDSA verification across multiple elliptic curves.Learn more →
🎲 Randomness & Time-Lock EncryptionOn-chain drand verification for provably fair randomness, plus tlock encryption that only decrypts after a future time.Learn more →
🧮 Elliptic Curve OperationsMulti-scalar multiplication on 6 curves, pairing operations for BN254/BLS12-381.Learn more →
🔒 Privacy-Preserving dAppsBuild applications with Noir/Honk circuits for complex privacy logic.Learn more →
*** ## Architecture Overview ``` ┌──────────────────────────────────────────────────────────────────────────────┐ │ YOUR STARKNET DAPP │ ├──────────────────────────────────────────────────────────────────────────────┤ │ │ │ Smart Contract Generators │ Cairo Libraries │ │ ───────────────────────── │ ─────────────── │ │ • Groth16 Verifier (BN254/BLS) │ • EC Operations (MSM) │ │ • Noir/Honk Verifier │ • Signatures (ECDSA/Schnorr) │ │ • Custom circuit verifiers │ • Pairing Checks │ │ │ • Hashing (SHA-512, Poseidon) │ │ │ ├──────────────────────────────────────────────────────────────────────────────┤ │ Maintained Contracts (Declared on Mainnet) │ │ ───────────────────────────────────────────────────────────── │ │ • Universal ECIP (MSM) • RISC Zero • SP1 • Drand Verifier • Drand tlock │ │ │ ├──────────────────────────────────────────────────────────────────────────────┤ │ SDK (Python / Rust / TypeScript) │ │ ───────────────────────────────────────────────────────────── │ │ Calldata generation • Proof preprocessing • Contract generation │ │ │ ├──────────────────────────────────────────────────────────────────────────────┤ │ Supported Curves │ │ ──────────────── │ │ BN254 │ BLS12-381 │ SECP256K1 │ SECP256R1 │ ED25519 │ GRUMPKIN │ │ │ └──────────────────────────────────────────────────────────────────────────────┘ ``` *** ## Performance Garaga achieves remarkable efficiency through optimized Cairo implementations. See the [full benchmark suite](https://github.com/keep-starknet-strange/garaga#cairo-benchmarks) for detailed metrics on all operations including: * Groth16 verification (BN254 & BLS12-381) * Honk/Noir proof verification * RISC Zero & SP1 proof verification * Signature verification (ECDSA, Schnorr, EdDSA) * Multi-scalar multiplication * Pairing operations *** ## Version Compatibility {% hint style="warning" %} **Important:** Garaga SDK versions (Python, Rust, npm) must match across your toolchain to ensure calldata is correctly formatted for on-chain verification. * **For generated contracts** (Groth16, Noir): Use the same SDK version that generated your verifier contract * **For maintained contracts** (RISC Zero, SP1, drand): Use the SDK version matching the Garaga release that declared the contract class hashes All packages are released together with matching version numbers (e.g., `pip install garaga==1.1.0` + `garaga = "1.1.0"` in Scarb.toml + `garaga_rs` tag `v1.1.0` + `npm install garaga@1.1.0`). {% endhint %} *** ## Quick Start ### 1. Install {% tabs %} {% tab title="Python (Recommended)" %} ```bash pip install garaga ``` {% endtab %} {% tab title="Cairo Library" %} ```bash scarb add garaga ``` Or add to `Scarb.toml`: ```toml [dependencies] garaga = "1.1.0" ``` {% endtab %} {% tab title="Rust" %} ```bash cargo add garaga_rs ``` {% endtab %} {% tab title="npm" %} ```bash npm install garaga ``` {% endtab %} {% endtabs %} ### 2. Generate a Verifier Contract ```bash # Generate a Groth16 verifier from your verification key garaga gen --system groth16 --vk your_vk.json # Or generate a Noir/Honk verifier garaga gen --system ultra_keccak_honk --vk target/vk ``` ### 3. Deploy & Verify ```bash # Declare and deploy your contract garaga declare garaga deploy --class-hash # Verify a proof on-chain garaga verify-onchain --address \ --vk your_vk.json --proof proof.json --public-inputs inputs.json ``` *** ## Production Ready Garaga is used in production by teams building: * **Validity rollups** and L2 solutions * **Cross-chain bridges** with ZK verification * **Privacy-preserving applications** * **Verifiable computation** platforms ### Security * ✅ [**Audited**](https://github.com/keep-starknet-strange/garaga/blob/main/docs/Garaga-audit-report-v2.pdf) by [CryptoExperts](https://www.cryptoexperts.com/) * ✅ **Battle-tested** on Starknet mainnet * ✅ **Open source** under MIT license *** ## Resources * **GitHub**: [github.com/keep-starknet-strange/garaga](https://github.com/keep-starknet-strange/garaga) * **Telegram**: [t.me/GaragaPairingCairo](https://t.me/GaragaPairingCairo) * **Academic Papers**: See [References](./#references) below *** ## References Garaga's cryptographic implementations are based on peer-reviewed research: 1. **Groth16**: Groth, J. "On the Size of Pairing-Based Non-interactive Arguments." EUROCRYPT 2016. [ePrint 2016/260](https://eprint.iacr.org/2016/260) 2. **Efficient Pairings**: El Housni, Y. "Pairings in Rank-1 Constraint Systems." [ePrint 2022/1162](https://eprint.iacr.org/2022/1162) 3. **ECIP**: Eagen, L. "Zero Knowledge Proofs of Elliptic Curve Inner Products." [ePrint 2022/596](https://eprint.iacr.org/2022/596) 4. **On Proving Pairings**: Novakovic, A. & Eagen, L. [ePrint 2024/640](https://eprint.iacr.org/2024/640) 5. **Fast EC Scalar Multiplications**: Eagen, L., El Housni, Y., Masson, S., Piellard, T. [ePrint 2025/933](https://eprint.iacr.org/2025/933) ================================================ FILE: docs/gitbook/SUMMARY.md ================================================ # Table of contents * [Garaga](README.md) * [Building Powerful Applications](building-powerful-applications.md) * [Security](security.md) * [Installation](installation/README.md) * [Python package](installation/python-package.md) * [Cairo Library](installation/cairo-library.md) * [Rust Crate](installation/rust-crate.md) * [Npm package](installation/npm-package.md) * [Developer setup & guides](developer-setup-and-guides/README.md) * [Working with auto-generated Cairo Code](developer-setup-and-guides/working-with-auto-generated-cairo-code.md) * [garaga-rs crate](developer-setup-and-guides/garaga-rs-crate/README.md) * [Rust -> Python bindings](developer-setup-and-guides/garaga-rs-crate/rust-greater-than-python-bindings.md) * [Rust -> Wasm bindings](developer-setup-and-guides/garaga-rs-crate/rust-greater-than-wasm-bindings.md) * [Using garaga libraries in your Cairo project](using-garaga-libraries-in-your-cairo-project/README.md) * [EC (Multi)-Scalar Multiplication](using-garaga-libraries-in-your-cairo-project/ec-multi-scalar-multiplication.md) * [ECDSA, Schnorr & EdDSA Signatures](using-garaga-libraries-in-your-cairo-project/ec-signatures.md) * [RSA-2048 Signatures](using-garaga-libraries-in-your-cairo-project/rsa-signatures.md) * [Hashing functions](using-garaga-libraries-in-your-cairo-project/hashing-functions.md) * [Smart Contract Generators](smart-contract-generators/README.md) * [Groth16 Verifier](smart-contract-generators/groth16/README.md) * [Generate and deploy your verifier contract](smart-contract-generators/groth16/generate-and-deploy-your-verifier-contract.md) * [Generating calldata from a proof and using your deployed contract](smart-contract-generators/groth16/generating-calldata-from-a-proof-and-using-your-deployed-contract/README.md) * [Using Python/Garaga CLI](smart-contract-generators/groth16/generating-calldata-from-a-proof-and-using-your-deployed-contract/using-python-garaga-cli.md) * [Using Rust](smart-contract-generators/groth16/generating-calldata-from-a-proof-and-using-your-deployed-contract/using-rust.md) * [Using Typescript](smart-contract-generators/groth16/generating-calldata-from-a-proof-and-using-your-deployed-contract/using-typescript.md) * [Noir Verifier](smart-contract-generators/noir.md) * [Maintained Smart Contracts](maintained-smart-contracts/README.md) * [RiscZero](maintained-smart-contracts/risczero.md) * [SP1](maintained-smart-contracts/sp1.md) * [Drand](maintained-smart-contracts/drand.md) * [Support](support.md) * [Updating these docs](updating-these-docs.md) ================================================ FILE: docs/gitbook/building-powerful-applications.md ================================================ --- icon: rocket --- # Building Powerful Applications Garaga's cryptographic primitives enable a wide range of powerful applications on Starknet. This page showcases what you can build and links to production-ready implementations. *** ## Validity Rollups & L2 Solutions Verify SNARK proofs on Starknet to build trustless bridges and rollup solutions. ### How It Works 1. **Off-chain**: Execute computation and generate a ZK proof (Groth16 or Honk) 2. **On-chain**: Verify the proof using Garaga's optimized verifier contracts 3. **Result**: Trustless verification of arbitrary computation ### Example: Cross-Chain Bridge ```rust use garaga::groth16::{Groth16Proof, verify_groth16_proof}; #[starknet::contract] mod Bridge { #[storage] struct Storage { processed_proofs: LegacyMap, } #[external(v0)] fn process_deposit( ref self: ContractState, proof_with_hints: Span, deposit_hash: felt252, ) -> Result<(), felt252> { // Verify the proof that a deposit occurred on the source chain let public_inputs = verify_groth16_proof(proof_with_hints)?; // Check the deposit hash matches assert(*public_inputs.at(0) == deposit_hash, 'Invalid deposit'); // Process the deposit... Result::Ok(()) } } ``` {% hint style="info" %} **Real-world usage**: Teams use Garaga to verify proofs from RISC Zero and SP1 zkVMs, enabling trustless verification of arbitrary Rust programs on Starknet. {% endhint %} *** ## Privacy-Preserving Applications Build applications where users can prove statements without revealing underlying data. ### Use Cases | Application | What's Proven | What's Hidden | | -------------------------- | ------------------------- | ------------------ | | **Private Voting** | Vote is valid and counted | Who voted for whom | | **Anonymous Credentials** | User meets criteria | User's identity | | **Confidential Transfers** | Balance is sufficient | Transfer amount | | **Private Auctions** | Bid is valid | Bid amount | ### Implementation with Noir Noir makes it easy to write privacy-preserving circuits: ```rust // circuit.nr - Private voting circuit fn main( // Private inputs (not revealed on-chain) private_key: Field, vote_choice: Field, // Public inputs (verified on-chain) public_key_hash: pub Field, merkle_root: pub Field, nullifier: pub Field, ) { // Prove ownership of private key let computed_hash = std::hash::pedersen([private_key]); assert(computed_hash == public_key_hash); // Prove membership in voter set (merkle proof) // ... merkle verification ... // Generate unique nullifier to prevent double voting let computed_nullifier = std::hash::pedersen([private_key, vote_choice]); assert(computed_nullifier == nullifier); } ``` Then verify on Starknet with a single function call. *** ## Verifiable Randomness (drand) Generate provably fair random numbers using the [drand](https://drand.love) distributed randomness beacon. ### Why drand? * **Unpredictable**: Random values can't be known before they're generated * **Unbiasable**: No single party can influence the output * **Publicly verifiable**: Anyone can verify the randomness is legitimate ### Example: On-Chain Lottery Use the maintained drand verifier contract via library call: ```rust use starknet::{SyscallResultTrait, syscalls}; const DRAND_QUICKNET_CLASS_HASH: felt252 = 0x1628f8e2d8ad8c26aea873b13703e4421f2c01a57c0c4974e599490ee30677d; #[starknet::contract] mod Lottery { use starknet::storage::{Map, StorageMapReadAccess, StoragePointerReadAccess}; use super::{DRAND_QUICKNET_CLASS_HASH, SyscallResultTrait, syscalls}; #[storage] struct Storage { participants: Map, participant_count: u32, target_round: u64, } #[external(v0)] fn draw_winner( ref self: ContractState, full_proof_with_hints: Span, ) -> ContractAddress { // Serialize calldata for library call let mut call_data: Array = array![]; Serde::serialize(@full_proof_with_hints, ref call_data); // Verify drand signature via library call to maintained contract let mut result = syscalls::library_call_syscall( DRAND_QUICKNET_CLASS_HASH.try_into().unwrap(), selector!("verify_round"), call_data.span(), ).unwrap_syscall(); let round_result: Result = Serde::deserialize(ref result).unwrap(); let verified_round = round_result.unwrap(); // Ensure we're using the correct round assert!(verified_round == self.target_round.read(), "Wrong round"); // Retrieve randomness for the verified round let mut rand_call_data: Array = array![]; Serde::serialize(@verified_round, ref rand_call_data); let mut rand_result = syscalls::library_call_syscall( DRAND_QUICKNET_CLASS_HASH.try_into().unwrap(), selector!("get_randomness_for_round"), rand_call_data.span(), ).unwrap_syscall(); let randomness: Result = Serde::deserialize(ref rand_result).unwrap(); // Use randomness to select winner let count: u256 = self.participant_count.read().into(); let winner_index: u32 = (randomness.unwrap().into() % count).try_into().unwrap(); self.participants.read(winner_index) } } ``` {% hint style="success" %} **Production contract available**: Use the [maintained drand verifier](maintained-smart-contracts/drand.md) via library call - no deployment needed! {% endhint %} *** ## Signature Verification at Scale Verify signatures from external systems (Bitcoin, Ethereum, Solana) on Starknet. ### Supported Signature Schemes | Scheme | Curves | Use Case | | ----------- | -------------------------------------- | ----------------------------- | | **ECDSA** | SECP256K1, SECP256R1, BN254, BLS12-381 | Bitcoin, Ethereum, WebAuthn | | **Schnorr** | All Weierstrass curves | BIP340 (Taproot), general use | | **EdDSA** | Ed25519 | Solana, general use | ### Example: Multi-Chain Message Verification ```rust use garaga::signatures::ecdsa::{ECDSASignatureWithHint, is_valid_ecdsa_signature_assuming_hash}; use garaga::definitions::G1Point; fn verify_ethereum_message( signature_with_hints: ECDSASignatureWithHint, public_key: G1Point, message_hash: u256, ) -> bool { // curve_id 2 = SECP256K1 (Ethereum's curve) is_valid_ecdsa_signature_assuming_hash(signature_with_hints, public_key, 2) } fn verify_webauthn_signature( signature_with_hints: ECDSASignatureWithHint, public_key: G1Point, message_hash: u256, ) -> bool { // curve_id 3 = SECP256R1 (WebAuthn/Passkeys) is_valid_ecdsa_signature_assuming_hash(signature_with_hints, public_key, 3) } ``` *** ## zkVM Proof Verification Verify proofs from zkVMs like RISC Zero and SP1 to enable trustless execution of arbitrary programs. ### Architecture ``` ┌─────────────────────────────────────────────────────────────┐ │ Off-Chain (zkVM) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Your Rust Program │ │ │ │ - Complex business logic │ │ │ │ - State transitions │ │ │ │ - Any computation you can write in Rust │ │ │ └─────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ zkVM (RISC Zero / SP1) │ │ │ │ - Executes program │ │ │ │ - Generates Groth16 proof │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ↓ proof ┌─────────────────────────────────────────────────────────────┐ │ On-Chain (Starknet) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Garaga Verifier Contract │ │ │ │ - Verifies Groth16 proof │ │ │ │ - Returns public outputs │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ### Getting Started See the maintained contracts: * [RISC Zero Integration](maintained-smart-contracts/risczero.md) * [SP1 Integration](maintained-smart-contracts/sp1.md) *** ## Time-Lock Encryption (tlock) Encrypt data that can only be decrypted at a specific future time, using drand's distributed randomness beacon. Decryption can happen entirely on-chain. ### How It Works 1. **Encrypt** a 16-byte message for a future drand round `N` using the SDK (Python, Rust, or TypeScript) 2. **Wait** for drand to publish round `N` 3. **Decrypt on-chain** by verifying the drand signature and using it to recover the message ### Use Cases * **Sealed-bid auctions**: Bids are encrypted until the auction ends * **Scheduled reveals**: Information released at a predetermined time * **Fair launches**: Token distributions with time-locked claiming * **Commit-reveal schemes**: Players commit encrypted moves, revealed together ### Example: Encrypt Off-Chain, Decrypt On-Chain {% tabs %} {% tab title="Python" %} ```python from garaga.starknet.tests_and_calldata_generators.drand_calldata import ( drand_encrypt_to_calldata, ) # Encrypt a 16-byte message for a future round message = b"secret message!!" # exactly 16 bytes calldata = drand_encrypt_to_calldata(round_number=100000, message=message) # Submit calldata to the decrypt contract once the round is published ``` {% endtab %} {% tab title="TypeScript" %} ```typescript import * as garaga from 'garaga'; await garaga.init(); const message = new Uint8Array(16); message.set(new TextEncoder().encode('secret message!!')); const randomness = crypto.getRandomValues(new Uint8Array(16)); const calldata = garaga.encryptToDrandRoundAndGetCallData(100000, message, randomness); ``` {% endtab %} {% endtabs %} {% hint style="success" %} **Production contracts available**: Use the [maintained drand decrypt contract](maintained-smart-contracts/drand.md) for on-chain tlock decryption. See the [full tlock documentation](maintained-smart-contracts/drand.md#time-lock-encryption-tlock) for details. {% endhint %} *** ## Build Your Own The primitives above can be combined to create novel applications: | Combination | Application | | -------------------------- | ---------------------------------------------- | | Groth16 + Signatures | Cross-chain asset bridges | | Noir + drand | Private lotteries with verifiable randomness | | tlock + Noir | Sealed-bid auctions with private bid amounts | | zkVM + MSM | Verifiable ML inference | | EdDSA + Groth16 | Solana → Starknet bridges | **Need help?** Join our [Telegram community](https://t.me/GaragaPairingCairo) to discuss your use case. ================================================ FILE: docs/gitbook/developer-setup-and-guides/README.md ================================================ --- icon: wrench --- # Developer setup & guides ### Installation To work with Garaga, you need the following dependencies : * [Rust](https://www.rust-lang.org/tools/install) * [Scarb](https://docs.swmansion.com/scarb/download.html) with the version specified in [https://github.com/keep-starknet-strange/garaga/blob/main/src/.tool-versions](https://github.com/keep-starknet-strange/garaga/blob/main/src/.tool-versions) Python 3.10-3.14 is used for development but does **not** need to be installed manually — `make setup` will auto-install it via [uv](https://docs.astral.sh/uv/) if it's not already available. Simply clone the [repository](https://github.com/keep-starknet-strange/garaga) : Using git: ```bash git clone https://github.com/keep-starknet-strange/garaga.git ``` Using [github cli ](https://cli.github.com/): ```bash gh repo clone keep-starknet-strange/garaga ``` After that, go into the root of the directory and run the command : ```bash make setup ``` This will automatically install [uv](https://docs.astral.sh/uv/) and Python 3.14 if needed, create a virtual environment, install all dependencies, and build the Rust extension. The setup is idempotent — running it again updates dependencies without recreating the venv. Pay attention to any message indicating failure. Contact us on Garaga telegram if you have any trouble at this point. If everything succeeded, you're good to go! {% hint style="info" %} Make sure to activate the virtual environment created with this setup, using `source venv/bin/activate` {% endhint %} --- ## Project Architecture Understanding the Garaga codebase structure: ``` garaga/ ├── hydra/garaga/ # Python SDK and circuit generators │ ├── starknet/cli/ # CLI commands (gen, declare, deploy, verify) │ ├── precompiled_circuits/ # Circuit definitions │ └── hints/ # Cryptographic hints for Cairo ├── src/ # Cairo code │ ├── src/ # Main Cairo library (garaga package) │ └── contracts/ # Example smart contracts ├── tools/ │ ├── garaga_rs/ # Rust crate (Python/WASM bindings) │ ├── npm/garaga_ts/ # TypeScript SDK │ └── make/ # Build scripts └── tests/ # Python and E2E tests ``` ### Key Components | Component | Location | Purpose | |-----------|----------|---------| | Python SDK | `hydra/garaga/` | CLI, circuit generation, proof processing | | Rust Crate | `tools/garaga_rs/` | Performance-critical operations | | Cairo Library | `src/src/` | On-chain verification | | TypeScript SDK | `tools/npm/garaga_ts/` | Browser/Node.js integration | --- ## Common Commands ### Development ```bash # Format code make fmt # Regenerate Cairo code from Python circuits make rewrite # Run Python tests pytest -n auto # Run Cairo tests scarb test # Run Rust tests cargo test -p garaga_rs ``` ### Building ```bash # Build Python package with Rust extension maturin develop --release --features python # Build WASM package make wasm ``` ### Profiling ```bash # Profile a specific test make profile-test TEST= # Generate benchmarks make benchmarks ``` --- ## Next Steps - [Working with auto-generated Cairo Code](working-with-auto-generated-cairo-code.md) - [garaga-rs crate](garaga-rs-crate/) — Rust library and bindings ================================================ FILE: docs/gitbook/developer-setup-and-guides/garaga-rs-crate/README.md ================================================ --- icon: crab --- # garaga-rs crate The `garaga_rs` crate is the performance-critical Rust library that powers Garaga's cryptographic operations. It provides high-performance implementations of elliptic curve operations, pairing computations, and proof serialization, with bindings to both Python (via PyO3) and WebAssembly (via wasm-bindgen). ## Overview The crate serves as the computational backend for Garaga, accelerating operations that would be too slow in pure Python: - **Elliptic curve operations**: Point addition, scalar multiplication, multi-scalar multiplication (MSM) - **Pairing computations**: Miller loop, final exponentiation, multi-pairing checks - **Proof serialization**: Calldata generation for Groth16, Honk, and signature verification - **Cryptographic hints**: GLV decomposition, ECIP protocol, Frobenius maps ## Module Structure ``` tools/garaga_rs/src/ ├── lib.rs # Crate entry point ├── definitions.rs # Curve definitions (6 curves) ├── io.rs # Field element serialization ├── algebra/ # EC operations │ ├── g1point.rs # G1 point arithmetic │ ├── g2point.rs # G2 point arithmetic │ ├── polynomial.rs # Polynomial operations │ └── extf_mul.rs # Extension field multiplication ├── calldata/ # Proof serialization │ ├── msm_calldata.rs # MSM calldata generation │ ├── mpc_calldata.rs # Multi-pairing check calldata │ └── full_proof_with_hints/ │ ├── groth16.rs # Groth16 (+ RISC0, SP1) │ └── zk_honk.rs # ZK Honk calldata ├── pairing/ # Pairing operations │ ├── multi_miller_loop.rs │ └── final_exp_witness/ ├── ecip/ # ECIP protocol │ ├── core.rs # ECIP hint generation │ └── ff.rs # Function field arithmetic ├── hints/ # Cryptographic hints │ ├── fake_glv.rs # GLV decomposition │ └── eisenstein.rs # Eisenstein integers ├── crypto/ # Hash functions │ ├── poseidon_bn254.rs # Poseidon hash │ └── mmr/ # Merkle Mountain Range ├── python_bindings/ # PyO3 bindings └── wasm_bindings.rs # WASM bindings ``` ## Supported Curves | ID | Curve | Use Cases | |----|-------|-----------| | 0 | BN254 | Groth16, Honk, RISC0, SP1 | | 1 | BLS12-381 | Groth16, drand signatures | | 2 | SECP256K1 | Bitcoin/Ethereum ECDSA | | 3 | SECP256R1 | NIST P-256, WebAuthn | | 4 | X25519/ED25519 | EdDSA signatures | | 5 | GRUMPKIN | Noir circuits | ## Feature Flags The crate uses feature flags to control which bindings are compiled: ```toml [features] default = [] # Pure Rust library python = ["pyo3"] # Python bindings via PyO3 wasm = ["wasm-bindgen", "js-sys"] # WASM bindings ``` ## Key Exports ### Python Bindings When compiled with `--features python`, the following functions are available: ```python from garaga import garaga_rs # G2 operations garaga_rs.g2_add(...) garaga_rs.g2_scalar_mul(...) # Pairing operations garaga_rs.multi_pairing(...) garaga_rs.multi_miller_loop(...) garaga_rs.final_exp(...) # Hint generation garaga_rs.get_final_exp_witness(...) garaga_rs.zk_ecip_hint(...) # Calldata builders garaga_rs.msm_calldata_builder(...) garaga_rs.mpc_calldata_builder(...) garaga_rs.get_groth16_calldata(...) garaga_rs.get_zk_honk_calldata(...) # Signatures garaga_rs.schnorr_calldata_builder(...) garaga_rs.ecdsa_calldata_builder(...) garaga_rs.eddsa_calldata_builder(...) # Hashing garaga_rs.poseidon_hash_bn254(...) garaga_rs.hades_permutation(...) # Extension field garaga_rs.nondeterministic_extension_field_mul_divmod(...) # drand garaga_rs.drand_calldata_builder(...) ``` ### WASM Bindings When compiled with `--features wasm`, similar functions are exported for JavaScript/TypeScript use via `wasm-bindgen`. ## Building ### For Python (via maturin) ```bash cd tools/garaga_rs maturin develop --release --features python ``` ### For WASM ```bash cd tools/garaga_rs wasm-pack build --target web --release --no-default-features --features wasm ``` ### Docker build (reproducible) ```bash cd tools/npm/garaga_ts docker compose up --build ``` ## Testing ```bash cd tools/garaga_rs cargo test ``` ## Dependencies Key external crates: - **lambdaworks-math/crypto**: Field arithmetic and cryptographic primitives - **num-bigint**: Arbitrary precision integers - **pyo3**: Python bindings (optional) - **wasm-bindgen**: WASM bindings (optional) - **sha2/sha3**: Hash functions - **rayon**: Parallel computation ## Next Steps - [Rust -> Python bindings](rust-greater-than-python-bindings.md) — Adding new Python bindings - [Rust -> WASM bindings](rust-greater-than-wasm-bindings.md) — Adding new WASM bindings ================================================ FILE: docs/gitbook/developer-setup-and-guides/garaga-rs-crate/rust-greater-than-python-bindings.md ================================================ # Rust -> Python bindings This guide explains how to add new Python bindings for Rust functions in the `garaga_rs` crate. ## Overview The Python bindings are implemented using PyO3, which provides a safe and ergonomic way to create Python extensions in Rust. The bindings are located in the `tools/garaga_rs/src/python_bindings` directory. ## Adding a new binding 1. Create a new file in `tools/garaga_rs/src/python_bindings/` for your binding 2. Add the module to `mod.rs` 3. Implement your binding function 4. Register the function in the `garaga_rs` module ## Type Conversions ### Common Type Conversions 1. **Python Int -> Rust BigUint** ```rust let py_int: &Bound<'_, PyInt> = ...; let biguint: BigUint = py_int.extract()?; ``` 2. **Rust BigUint -> Python Int** ```rust let biguint: BigUint = ...; Ok(biguint.into_pyobject(py)?.into()) ``` 3. **Python List -> Rust Vec** ```rust let py_list: &Bound<'_, PyList> = ...; let values: Vec = py_list .into_iter() .map(|x| x.extract()) .collect::, _>>()?; ``` 4. **Python Bytes -> Rust Bytes** ```rust let py_bytes: &Bound<'_, PyBytes> = ...; let bytes = py_bytes.as_bytes(); ``` 5. **Field Elements** ```rust // Python Int -> Field Element let fe = element_from_biguint::(&biguint); // Field Element -> Python Int let biguint = element_to_biguint(&fe); ``` ### Error Handling 1. **Converting Rust Errors to Python** ```rust // For custom errors .map_err(PyErr::new::)?; // For simple error propagation .map_err(|e| PyErr::new::(e.to_string()))? ``` 2. **Enum Conversion** ```rust let value = YourEnum::try_from(py_value) .map_err(PyErr::new::)?; ``` ### Common Patterns 1. **Function Declaration** ```rust #[pyfunction] #[allow(clippy::too_many_arguments)] // If needed for complex functions pub fn your_function( py: Python, // ... parameters ... ) -> PyResult { // Implementation } ``` 2. **Returning Results** ```rust // For single values Ok(result.into_pyobject(py)?.into()) // For lists let py_list = PyList::new(py, result); Ok(py_list?.into()) // For tuples Ok(PyTuple::new(py, &[x, y]).into()) ``` ## Example Implementation Here's a complete example showing common patterns: ```rust use pyo3::prelude::*; use pyo3::types::{PyInt, PyList, PyBytes}; use num_bigint::BigUint; #[pyfunction] pub fn example_function( py: Python, input_int: &Bound<'_, PyInt>, input_list: &Bound<'_, PyList>, input_bytes: &Bound<'_, PyBytes>, ) -> PyResult { // Convert Python int to BigUint let value: BigUint = input_int.extract()?; // Convert Python list to Vec let values: Vec = input_list .into_iter() .map(|x| x.extract()) .collect::, _>>()?; // Get bytes let bytes = input_bytes.as_bytes(); // Do your computation let result = process_data(&value, &values, bytes) .map_err(PyErr::new::)?; // Return as Python list let py_list = PyList::new(py, result); Ok(py_list?.into()) } ``` ## Registering Your Function Add your function to the `garaga_rs` module in `mod.rs`: ```rust #[pymodule] fn garaga_rs(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(your_function, m)?)?; Ok(()) } ``` ## Using the Bindings After implementing and registering your binding, you can use it in Python like this: ```python from garaga import garaga_rs # For simple integer operations result = garaga_rs.example_function( input_int=42, input_list=[1, 2, 3], input_bytes=b"some bytes" ) ``` ## Testing 1. Add Python tests in `tests/hydra/` 2. Test both successful and error cases 3. Test edge cases (empty lists, zero values) ## Common Pitfalls 1. Always use `PyResult` for error handling 2. Remember to propagate errors with `?` 3. Handle edge cases (e.g., zero values, maximum values) 4. Be careful with memory management for large data structures ## Available Utilities The following utilities are available in the codebase: - `element_from_biguint`: Convert BigUint to Field Element - `element_to_biguint`: Convert Field Element to BigUint - `biguint_to_u256`: Convert BigUint to u256 ## Building and Testing 1. Build/Update the Rust extension: ```bash maturin develop --release --features python ``` 2. Run tests: ```bash pytest -xs ``` ## Best Practices 1. Keep bindings simple and focused 2. Use appropriate error handling 3. Test edge cases thoroughly 4. Follow existing patterns in the codebase ================================================ FILE: docs/gitbook/developer-setup-and-guides/garaga-rs-crate/rust-greater-than-wasm-bindings.md ================================================ # Rust -> Wasm bindings This guide explains how to add new WASM bindings for Rust functions in the `garaga_rs` crate. ## Overview The WASM bindings are implemented using `wasm-bindgen`, which provides a way to expose Rust functions to JavaScript/TypeScript. The bindings are located in `tools/garaga_rs/src/wasm_bindings.rs`. ## Adding a New Binding 1. Add your function to `tools/garaga_rs/src/wasm_bindings.rs` 2. Use the `#[wasm_bindgen]` attribute to expose the function 3. Rebuild the WASM package ### Example Implementation ```rust use wasm_bindgen::prelude::*; use num_bigint::BigUint; #[wasm_bindgen] pub fn your_function( input_hex: &str, // Hex string input input_array: Vec, // Array of values ) -> Result { // Parse hex string to BigUint let value = jsvalue_to_biguint(&JsValue::from_str(input_hex))?; // Process array elements let values: Vec = input_array .iter() .map(|v| jsvalue_to_biguint(v)) .collect::, _>>()?; // Perform computation let result = compute_something(&value, &values) .map_err(|e| JsError::new(&e.to_string()))?; // Return result as BigInt string Ok(biguint_to_jsvalue(&result)) } ``` ### Type Conversions Common conversion patterns for WASM bindings: ```rust // JsValue (hex string) -> BigUint let biguint = jsvalue_to_biguint(&js_value)?; // BigUint -> JsValue (string) let js_value = biguint_to_jsvalue(&biguint); // Parse G1 point from JS object let point = parse_g1_point(&js_object)?; // Parse G2 point from JS object let point = parse_g2_point(&js_object)?; ``` ### Error Handling Use `JsError` for errors that should be visible in JavaScript: ```rust .map_err(|e| JsError::new(&e.to_string()))? ``` ## Available Functions The following functions are currently exposed via WASM: | Function | Description | |----------|-------------| | `msm_calldata_builder` | Generate MSM calldata | | `mpc_calldata_builder` | Generate multi-pairing check calldata | | `get_groth16_calldata` | Generate Groth16 proof calldata | | `get_zk_honk_calldata` | Generate ZK Honk proof calldata | | `schnorr_calldata_builder` | Schnorr signature calldata | | `ecdsa_calldata_builder` | ECDSA signature calldata | | `eddsa_calldata_builder` | EdDSA signature calldata | | `drand_calldata_builder` | drand verification calldata | | `poseidon_hash` | Poseidon hash (BN254) | | `to_weirstrass` | Convert Ed25519 to Weierstrass form | | `to_twistededwards` | Convert Weierstrass to Twisted Edwards | ## TypeScript Wrapper The TypeScript API in `tools/npm/garaga_ts/src/node/api.ts` provides a friendlier interface over the raw WASM bindings: ```typescript import { init, msmCalldataBuilder } from 'garaga'; // Initialize WASM module (required once) await init(); // Use the API const calldata = msmCalldataBuilder( points, // Array of {x, y} objects scalars, // Array of bigint or hex strings curveId, // 0=BN254, 1=BLS12-381, etc. { includePointsAndScalars: true } ); ``` ## Development notes The Garaga NPM package is a mixed package. It is implemented in TypeScript but also reuses Rust code targeted to WebAssembly (WASM) with the help of [`wasm-pack`](https://rustwasm.github.io/wasm-pack/). The `src` folder is organized into two subfolders: `node` which contains the implementation in TypeScript; and `wasm` which has the interoperabilty code produced by `wasm-pack`. Changes to the TypeScript library should only be made to files under the `node` subfolder. Changes to the Rust implementation requires regenerating files under the `wasm` subfolder. Onces changes are in place they can be made permanent into the repository by committing the contents of both folders. Here is the bulk of the process: 1. Open your terminal or command prompt. 2. Use `git` to clone the repository: ```bash git clone https://github.com/keep-starknet-strange/garaga.git cd tools/npm/garaga_ts npm ci ``` 3. If you make TypeScript only changes, you can quickly rebuild the package using the `build:node` NPM script: ```bash npm run build:node npm pack ``` 4. If instead you make Rust changes, it is necessary to generate the WASM interoperability code using the `build` NPM script: ```bash npm run build npm pack ``` 5. However, before commiting changes, it is necessary to generate the WASM interoperability code in a reproducible manner using docker: ```bash docker compose up --build git commit . ``` ### How `wasm-pack` is used to achieve interoperability Internaly the `build` NPM script uses `wasm-pack` to produce the WASM interoperability code. This is achieved by running ```` ```bash cd tools/garaga_rs && wasm-pack build --target web --out-dir ../npm/garaga_ts/src/wasm/pkg --release --no-default-features --features wasm cd tools/npm/garaga_ts && node patch.wasm.cjs ``` ```` Let's unpack it. In the Rust source folder we run `wasm-pack` in `--target web` mode. This generates TypeScript code targeting web pages. The `--release` option is required to minimize the size of the WASM module. The `--no-default-features` ensures we start with a clean slate (no bindings), and `--features wasm` explicitly enables only the WASM bindings we need. Once the `wasm-pack` is done, the code is generated under the folder `src/wasm/pkg` of garaga\_ts that houses the TypeScript source code. We then run a custom script `patch.wasm.cjs` which makes minimal changes to the code generated by wasm-pack to facilitate seamless support of the WASM module in both the browser and Node.js. Basically it converts the WASM module to a [Base64](https://en.wikipedia.org/wiki/Base64) string that can be loaded in a portable way in both environments, amongst other minor tweaks. (It is important to note that the use of a custom script is only required so long `wasm-pack` itself does not provide a more portable/universal target mode.) ================================================ FILE: docs/gitbook/developer-setup-and-guides/working-with-auto-generated-cairo-code.md ================================================ --- icon: wand-sparkles --- # Working with auto-generated Cairo Code ### Developer workflow If working with the python - auto generated cairo code, the main script to work with is `make rewrite` \ {% code title="tools/make/rewrite.sh" %} ```bash rm -rf src/src/tests/* rm -rf src/src/circuits/* rm -rf src/contracts/groth16_example_bls12_381/* rm -rf src/contracts/groth16_example_bn254/* rm -rf src/contracts/risc0_verifier_bn254/* set -e # Exit immediately if a command exits with a non-zero status python hydra/garaga/precompiled_circuits/all_circuits.py || { echo "Error in all_circuits.py"; exit 1; } python hydra/garaga/starknet/tests_and_calldata_generators/test_writer.py || { echo "Error in test_writer.py"; exit 1; } python hydra/garaga/starknet/groth16_contract_generator/generator.py || { echo "Error in generator.py"; exit 1; } python hydra/garaga/starknet/groth16_contract_generator/generator_risc0.py || { echo "Error in generator_risc0.py"; exit 1; } ``` {% endcode %} \ As you can see this will : * Rewrite all the auto-generated cairo code in `src/src/circuits/` (with the `all_circuits.py` script) * Rewrite all the auto-generated cairo tests in `src/src/tests/` (with the `test_writer.py` script) * Rewrite the Groth16 verifiers smart contract templates examples in `src/contracts/` (with the `generator.py` and `generator_risc0.py` scripts) ## Creating auto-generated circuits. While it's relatively easy to write Cairo circuits yourself if their size is small, it starts to be quite time consuming if you need to build a large amount of them, parametrize them, and the circuits themselves are quite large. {% hint style="info" %} Examples of small hand-made small circuits can be found in [https://github.com/keep-starknet-strange/garaga/blob/main/src/src/basic\_field\_ops.cairo](https://github.com/keep-starknet-strange/garaga/blob/main/src/src/basic\_field\_ops.cairo) {% endhint %} \ If you want to write a new auto-generated circuit to `src/src/circuits`, you can define them with python code, and register them to the `all_circuits.py` file. \ \ Below we show a basic tutorial for a non-parametrized circuit. ### Simple isolated example
import garaga.modulo_circuit_structs as structs
from garaga.definitions import CurveID, get_base_field
from garaga.modulo_circuit import PyFelt, ModuloCircuit


curve_id = CurveID.BN254 # BN254
field = get_base_field(curve_id) # Use with field(int) or field.random().

COMPILATION_MODE = 1 # 1 for Cairo, 0 for CairoZero.

circuit = ModuloCircuit(
    name=f"dummy_{curve_id.name.lower()},
    curve_id.value,
    generic_circuit=False,
    compilation_mode=COMPILATION_MODE,
)
# All "structs" expect a name (replicated in the signature) and a list of elements.
x, y = circuit.write_struct(structs.u384Span("xy", [field.random(), field.random()]))
# All "structs" written with write_struct will be expected in the Cairo
# function signature of the given type.
z = circuit.write_struct(structs.u384("z", [field(42)]))

# With this configuration,
# the signature will be fn(xy: Span<u384>, z:u384).
# More structs and arbitrary ones are supported as well.

# To write constants, use set_or_get_constant.
one = circuit.set_or_get_constant(1)

# Here happens the core circuit logic.
# The core operations are add, sub, mul, inv.
# However, more high level methods are available that translate to
# a sequence of the core operations (ex: div <=> inv then mul)
a = circuit.add(x, y)
b = circuit.sub(a, one)
c = circuit.mul(b, z)
d = circuit.inv(c)
f = circuit.div(d, z)

# Define the output of the function using structs as well.
circuit.extend_struct_output(structs.u384Span("abc", [a, b, c]))
circuit.extend_struct_output(structs.u384("f", [f]))

# Compile and print the compiled cairo circuit :
header = compilation_mode_to_file_header(1) # Cairo 1
compiled_code, function_name = circuit.compile_circuit()
# Note: some imports are unused in the header,
# we should make the compiler aware of the structs used ;)
print(header)
print(compiled_code)
To obtain the corresponding Cairo code, you can do it like this The obtained Cairo code will be ```rust use core::circuit::{ RangeCheck96, AddMod, MulMod, u384, u96, CircuitElement, CircuitInput, circuit_add, circuit_sub, circuit_mul, circuit_inverse, EvalCircuitResult, EvalCircuitTrait, CircuitOutputsTrait, CircuitModulus, AddInputResultTrait, CircuitInputs, CircuitDefinition, CircuitData, CircuitInputAccumulator }; use garaga::core::circuit::AddInputResultTrait2; use core::circuit::CircuitElement as CE; use core::circuit::CircuitInput as CI; use garaga::definitions::{get_a, get_b, get_p, get_g, get_min_one, G1Point, G2Point, E12D, u288, G1G2Pair, BNProcessedPair, BLSProcessedPair, MillerLoopResultScalingFactor, G2Line, get_BLS12_381_modulus,get_BN254_modulus}; use garaga::ec_ops::{SlopeInterceptOutput, FunctionFeltEvaluations, FunctionFelt}; use core::option::Option; #[inline(always)] fn run_dummy_bn254_circuit(xy: Span, z: u384) -> (Span, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x1 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_add(in1, in2); let t1 = circuit_sub(t0, in0); let t2 = circuit_mul(t1, in3); let t3 = circuit_inverse(t2); let t4 = circuit_inverse(in3); let t5 = circuit_mul(t3, t4); let modulus = get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t0, t1, t2, t5,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in0 // Fill inputs: let mut xy = xy; while let Option::Some(val) = xy.pop_front() { circuit_inputs = circuit_inputs.next_2(*val); }; // in1 - in2 circuit_inputs = circuit_inputs.next_2(z); // in3 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let abc: Span = array![ outputs.get_output(t0), outputs.get_output(t1), outputs.get_output(t2) ] .span(); let f: u384 = outputs.get_output(t5); return (abc, f); } ``` Note that the compiler will adapt the signature of the Cairo function depending on the `generic_circuit` parameter, and retrieve the corresponding modulus inside the function code. {% code title="https://github.com/keep-starknet-strange/garaga/blob/584cad66d067aa6c04447fe06a00c7be99bc2445/hydra/garaga/modulo_circuit.py#L1068-L1071" %} ```python if self.generic_circuit: code = f"#[inline(always)]\nfn {function_name}({signature_input}, curve_index:usize)->{signature_output} {{\n" else: code = f"#[inline(always)]\nfn {function_name}({signature_input})->{signature_output} {{\n" ``` {% endcode %} ### Using parameterization (docs in progress :construction:) #### The base class Currently, the way we deal with parameterization is encapsulating the earlier `ModuloCircuit` class into a [BaseModuloCircuit](https://github.com/keep-starknet-strange/garaga/blob/584cad66d067aa6c04447fe06a00c7be99bc2445/hydra/garaga/precompiled\_circuits/compilable\_circuits/base.py#L12C7-L12C25) class, and adding keyword arguments to the class deriving it. ```python class BaseModuloCircuit(ABC): """ Base class for all modulo circuits that will be compiled to Cairo code. Parameters: - name: str, the name of the circuit - curve_id: int, the id of the curve - auto_run: bool, whether to run the circuit automatically at initialization. When compiling, this flag must be set to true so the ModuloCircuit class inside the ".circuit" member of this class holds the necessary metadata about the operations that will be compiled. For CairoZero, this flag will be set to False in the Python hint, so that BaseModuloCircuit.run_circuit() can be called on a segment parsed from the CairoZero VM. - compilation mode: 0 (CairoZero) or 1 (Cairo) """ def __init__( self, name: str, curve_id: int, auto_run: bool = True, compilation_mode: int = 0, ``` All Cairo function must inherit from the base abstract class \ The abstract methods to implement are : \ * `build_input` ```python def build_input(self) -> list[PyFelt]: """ This method is used to create the necessary inputs that will be written to the ModuloCircuit. It works in pair with the _run_circuit_inner function, where the _run_circuit_inner will use the output of the build_input function to "deserialize" the list of elements and "write" them to the ModuloCircuit class. """ ``` * `_run_circuit_inner` ```python def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: """ This method is responsible for - deserializing the input list of elements, - creating a ModuloCircuit class (or class that derives from ModuloCircuit) - "writing" the inputs to the ModuloCircuit class to obtain ModuloCircuitElements - using the methods add, sub, mul, inv (or higher level methods) of the ModuloCircuit class to define the list of operations on the given inputs. - Returning the ModuloCircuit class in a state where the circuit has been run, and therefore holding the metadata so that its instructions can be compiled to Cairo code. """ ``` At initialization, you must choose a name for the circuit. \ Pay attention to the parameter `generic_circuit` passed to the `ModuloCircuit` class inside `_run_circuit_inner`
import garaga.modulo_circuit_structs as structs
from garaga.definitions import CurveID
from garaga.precompiled_circuits.compilable_circuits.base import BaseModuloCircuit
from garaga.modulo_circuit import PyFelt, ModuloCircuit

class FixedExpCircuit(BaseModuloCircuit):
    def __init__(
        self, curve_id: int, auto_run: bool = True, compilation_mode: int = 1, n:int=1

    ) -> None:
        super().__init__(
            name=f"fixed_exp_circuit_{CurveID(curve_id).name.lower()}_{n}",
            curve_id=curve_id,
            auto_run=auto_run,
            compilation_mode=compilation_mode,
        )
        self.n = n

    def build_input(self) -> list[PyFelt]:
        return [self.field.random()]

    def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit:
        circuit = ModuloCircuit(
            self.name,
            self.curve_id,
            generic_circuit=True,
            compilation_mode=self.compilation_mode,
        )

        z = circuit.write_struct(structs.u384("z", [input[2]]), WriteOps.INPUT)
        res = z
        for i in range(n):
            res = circuit.mul(res, z)
        circuit.extend_struct_output(structs.u384("res", [res]))

        return circuit

================================================ FILE: docs/gitbook/installation/README.md ================================================ --- icon: gear --- # Installation Garaga is available in multiple formats for different use cases: | Package | Use Case | Install Command | |---------|----------|-----------------| | [**Python package**](python-package.md) | CLI for generating verifiers, deployment, calldata generation | `pip install garaga` | | [**Cairo Library**](cairo-library.md) | Use Garaga's Cairo primitives in your smart contracts | `scarb add garaga` | | [**Rust Crate**](rust-crate.md) | Rust applications, calldata generation | `cargo add garaga_rs` | | [**npm package**](npm-package.md) | Browser dApps, frontend integration | `npm install garaga` | ## Quick Start {% tabs %} {% tab title="Python" %} ```bash pip install garaga garaga --help ``` {% endtab %} {% tab title="Cairo" %} ```bash scarb add garaga ``` Or in `Scarb.toml`: ```toml [dependencies] garaga = "1.1.0" ``` {% endtab %} {% tab title="Rust" %} ```toml [dependencies] garaga_rs = { git = "https://github.com/keep-starknet-strange/garaga.git", tag = "v1.1.0" } ``` {% endtab %} {% tab title="npm" %} ```bash npm install garaga ``` {% endtab %} {% endtabs %} ## Version Compatibility All Garaga packages are released together with matching version numbers. When using multiple packages, ensure they all use the same version to guarantee compatibility. For example, when using version 1.1.0: - Python: `pip install garaga==1.1.0` - Cairo: `garaga = "1.1.0"` in Scarb.toml - Rust: `tag = "v1.1.0"` in Cargo.toml - npm: `npm install garaga@1.1.0` ## Developer Setup For contributing to Garaga or advanced development workflows, see the [Developer Setup & Guides](../developer-setup-and-guides/README.md). ================================================ FILE: docs/gitbook/installation/cairo-library.md ================================================ --- icon: sparkles --- # Cairo Library The Garaga Cairo library is available on the [scarbs.xyz registry](https://scarbs.xyz/packages/garaga), the official package registry for Cairo/Scarb projects. ## Quick Install The recommended way to add Garaga to your Cairo project: ```bash scarb add garaga ``` This will add the latest version to your `Scarb.toml`. ## Manual Installation Alternatively, add Garaga directly to your `Scarb.toml`: ```toml [dependencies] garaga = "1.1.0" [cairo] sierra-replace-ids = false # Required for Garaga ``` {% hint style="warning" %} **Important:** The `sierra-replace-ids = false` setting is required for Garaga to compile correctly. {% endhint %} ## Installing a Specific Version To install a specific version: ```bash scarb add garaga@1.1.0 ``` Or in `Scarb.toml`: ```toml [dependencies] garaga = "=1.1.0" # Exact version ``` ## Installing from Git If you need an unreleased version or a specific commit: ```toml [dependencies] garaga = { git = "https://github.com/keep-starknet-strange/garaga.git", tag = "v1.1.0" } ``` Or from a specific branch/commit: ```toml [dependencies] garaga = { git = "https://github.com/keep-starknet-strange/garaga.git", branch = "main" } ``` {% hint style="info" %} For more information on managing dependencies with Scarb, see the [Scarb documentation](https://docs.swmansion.com/scarb/docs/guides/dependencies.html). {% endhint %} ## Version Compatibility {% hint style="warning" %} **Version Matching:** When using Garaga SDKs (Python, Rust, npm) to generate calldata, ensure the Cairo library version matches the SDK version. Mismatched versions may produce incompatible calldata. For example, if using `pip install garaga==1.1.0`, use `garaga = "1.1.0"` in your `Scarb.toml`. {% endhint %} ## Usage After installation, you can import Garaga modules: ```cairo use garaga::definitions::{G1Point, u384}; use garaga::ec_ops::msm_g1; use garaga::signatures::ecdsa::{ECDSASignatureWithHint, is_valid_ecdsa_signature_assuming_hash}; ``` See [Using Garaga Libraries](../using-garaga-libraries-in-your-cairo-project/) for detailed usage documentation. ## Registry Links * **Package Page:** [scarbs.xyz/packages/garaga](https://scarbs.xyz/packages/garaga) * **Source Code:** [github.com/keep-starknet-strange/garaga](https://github.com/keep-starknet-strange/garaga) ================================================ FILE: docs/gitbook/installation/developer-setup.md ================================================ --- icon: wrench --- # Developer setup To work with Garaga, you need the following dependencies : * [Rust](https://www.rust-lang.org/tools/install) * [Scarb](https://docs.swmansion.com/scarb/download.html) v2.16.1 Python 3.10-3.14 is used for development but does **not** need to be installed manually — `make setup` will auto-install it via [uv](https://docs.astral.sh/uv/) if it's not already available. Simply clone the [repository](https://github.com/keep-starknet-strange/garaga) : Using git: ```bash git clone https://github.com/keep-starknet-strange/garaga.git ``` Using [github cli ](https://cli.github.com/) : ```bash gh repo clone keep-starknet-strange/garaga ``` After that, go into the root of the directory and run the command : ```bash make setup ``` This will automatically install [uv](https://docs.astral.sh/uv/) and Python 3.14 if needed, create a virtual environment, install all dependencies, and build the Rust extension. The setup is idempotent — running it again updates dependencies without recreating the venv. Pay attention to any message indicating failure. Contact us on Garaga telegram if you have any trouble at this point. If everything succeeded, you're good to go! {% hint style="info" %} Make sure to activate the virtual environment created with this setup, using `source venv/bin/activate` {% endhint %} ================================================ FILE: docs/gitbook/installation/npm-package.md ================================================ --- icon: js --- # Npm package Garaga is available as an npm package, making it easy to integrate into your Node.js projects. This guide will help you get started with installation and usage. ## Quick Start The recommended way to install Garaga is through the npm registry: ```bash npm install garaga ``` {% hint style="warning" %} **Version Compatibility:** Use the same version as your pip package (`garaga==X.Y.Z` → `garaga@X.Y.Z`) to ensure calldata compatibility with generated verifiers and maintained contracts. {% endhint %} Or if you prefer using Yarn: ```bash yarn add garaga ``` ## Available Functions The package exports several functions that you can use in your project. For a complete list of available functions and their usage, check out the [API Reference](https://github.com/keep-starknet-strange/garaga/blob/v1.1.0/tools/npm/garaga_ts/src/node/api.ts). This file contains all the exported functions and their TypeScript definitions. ## Package Details - **NPM Registry**: [garaga on npmjs.com](https://www.npmjs.com/package/garaga) - **Source Code**: [GitHub Repository](https://github.com/keep-starknet-strange/garaga/tree/main/tools/npm/garaga_ts) ## Building from Source If you need to build the package from source (e.g., for development or custom modifications), follow these steps: ### Prerequisites - [Rust](https://www.rust-lang.org/tools/install) - [Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs) - [wasm-pack](https://drager.github.io/wasm-pack/installer/) ### Manual Build 1. Clone the repository: ```bash git clone https://github.com/keep-starknet-strange/garaga.git cd tools/npm/garaga_ts ``` 2. Install dependencies and build: ```bash npm ci npm run build npm pack ``` 3. Install the generated package: ```bash npm install ./garaga-.tgz ``` ### Docker Build (Recommended) For reproducible builds, use Docker: 1. Clone the repository: ```bash git clone https://github.com/keep-starknet-strange/garaga.git cd tools/npm/garaga_ts ``` 2. Build using Docker: ```bash docker compose up --build ``` 3. Install the generated package: ```bash npm install ./garaga-.tgz ``` ## Troubleshooting If you encounter any issues during installation: 1. Ensure you have the latest version of Node.js installed 2. Clear your npm cache: `npm cache clean --force` 3. Delete `node_modules` and `package-lock.json`, then run `npm install` again 4. For build issues, make sure you have the latest version of Rust and wasm-pack ## Support For additional help or to report issues: See [support.md](../support.md "mention") ================================================ FILE: docs/gitbook/installation/python-package.md ================================================ --- icon: python --- # Python package ## Install the latest released version of the CLI {% hint style="info" %} PyPi link : [https://pypi.org/project/garaga/](https://pypi.org/project/garaga/) {% endhint %} The easiest way to install Garaga is via `pip`, which will fetch and install the pre-built binary wheels for your platform. 1. Open your terminal or command prompt. 2. (Optional) If you're using a [virtual environment (venv)](https://docs.python.org/3/library/venv.html), simply activate your venv. 3. Run the following command to install latest release version: ```bash pip install garaga ``` 4. Once the package is successfully installed, the CLI will be accessible via the command line: ```bash garaga ``` {% hint style="info" %} **Garaga supports Python 3.10 through 3.14.** If you need to install a specific Python version, you can use [uv](https://docs.astral.sh/uv/): ```bash uv python install 3.14 # or 3.13, 3.12, 3.11, 3.10 ``` {% endhint %} {% hint style="info" %} Please, ensure that the directory containing Python's executable files is included in your system's `PATH` environment variable. If you're using a venv, the necessary paths are automatically managed, so simply activate your venv before running the CLI. {% endhint %} {% hint style="info" %} If your Python installation is not supported by one of the pre-built binary wheels, `pip` will attempt to install Garaga from its source distribution. In that case, please make sure to have [Rust installed](https://www.rust-lang.org/tools/install) and available. {% endhint %} ## Install a specific version or from a specific commit / from source To install a specific version, use : ```bash pip install --force-reinstall garaga==1.1.0 ``` To install a version at specific commit, pick a commit hash from the [github history](https://github.com/keep-starknet-strange/garaga/commits/main/) and use : ```bash pip install git+https://github.com/keep-starknet-strange/garaga.git@COMMIT_HASH ``` {% hint style="warning" %} **Version Compatibility:** When installing from a specific commit, ensure all Garaga components match: - The `garaga` Cairo dependency in `Scarb.toml` should use the same version (e.g., `garaga = "1.1.0"` or the same git tag) - If using Rust/npm SDKs, use the same version for those as well See the [main documentation](../README.md#version-compatibility) for details on why version matching matters. {% endhint %} ## Installation troubleshooting You might have some dependencies issues on Linux or MacOs related to some packages that uses C code. Refer to the installations notes of Starknet.py [https://starknetpy.readthedocs.io/en/latest/installation.html](https://starknetpy.readthedocs.io/en/latest/installation.html) to fix those issues. ================================================ FILE: docs/gitbook/installation/rust-crate.md ================================================ --- icon: rust --- # Rust Crate To use the [`garaga_rs`](https://github.com/keep-starknet-strange/garaga/tree/main/tools/garaga_rs) crate in your project, add the following to your `Cargo.toml` ```toml [dependencies] garaga_rs = { git = "https://github.com/keep-starknet-strange/garaga.git"} ``` {% hint style="warning" %} **Version Compatibility:** Use the latest [release tag](https://github.com/keep-starknet-strange/garaga/releases) (e.g., `v1.1.0`) to match the declared [maintained smart contracts](../maintained-smart-contracts/ "mention") and ensure compatibility with the pip package that generated your verifiers. {% endhint %} ```toml [dependencies] garaga_rs = { git = "https://github.com/keep-starknet-strange/garaga.git", tag = "v1.1.0" } ``` ## Features The `garaga_rs` crate provides optional features for different use cases: - **No features (default)**: Pure Rust library without any bindings - **`python` feature**: Enables Python bindings via PyO3 (for use with maturin) - **`wasm` feature**: Enables WebAssembly bindings via wasm-bindgen (for use with wasm-pack) For example, if you're building a Python extension: ```toml [dependencies] garaga_rs = { git = "https://github.com/keep-starknet-strange/garaga.git", tag = "v1.1.0", features = ["python"] } ``` ================================================ FILE: docs/gitbook/maintained-smart-contracts/README.md ================================================ --- icon: file-lock --- # Maintained Smart Contracts We declare & maintain Smart Contracts for the community so they can be used as library calls. \ Those contracts: * Are _declared_ **both** Starknet Sepolia **and** Mainnet. * Those contracts are re-deployed at each release, so their code correspond to the release commit. * The source code is always available in the main garaga repository under `src/contracts` * The contracts are only declared and not deployed, their expected usage is through [library syscalls.](https://book.cairo-lang.org/ch15-03-executing-code-from-another-class.html#library-calls), so their usage is done through their class hashes and not their contract address (which don't exist unless you deploy them yourself) ### Class hashes for Garaga v1.1.0. | Contract | Class hash | Description | | -------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | [Universal ECIP](https://github.com/keep-starknet-strange/garaga/tree/main/src/contracts/universal_ecip) | 0x396d5915ecf475aab117bb25a0272b261e9e25ffe1c0ce05a51a3f77489c89e | A contract allowing to compute elliptic curve multi scalar multiplication for all supported curve identifiers | | [RiscZero Verifier](https://github.com/keep-starknet-strange/garaga/tree/main/src/contracts/autogenerated/risc0_verifier_bn254) | 0x41d5e111b93acbf1afb531253e0bc64d43f90a8a99290361e851ec0c4968ab1 | A verifier for RiscZero Groth16-wrapped proofs. | | [Drand Quicknet Verifier](https://github.com/keep-starknet-strange/garaga/tree/main/src/contracts/drand_quicknet) | 0x86bf4360e082cd786bd785d3345df32777db89cd26b761f3e85b1993addfd0 | A contract to verify Drand BLS signatures and store them on-chain for randomness and tlock decryption. | | [Drand Decrypt Quicknet](https://github.com/keep-starknet-strange/garaga/tree/main/src/contracts/drand_decrypt_quicknet) | 0x68e2381aa99c02aabe2a0fec18d9fb7cde6138b588dc0bcf0135a26d8ae7e22 | A contract for on-chain tlock decryption using drand. Wraps the verifier via library call. | | [SP1 Groth16 Verifier](https://github.com/keep-starknet-strange/garaga/tree/main/src/contracts/autogenerated/sp1_verifier_bn254) | 0x230d8612bd464979000193e4eaa73489da965a6593fb563dd2244e0b6e0443a | A verifier for SP1 Groth16-wrapped proofs. | {% hint style="warning" %} **Version Compatibility:** When generating calldata for these contracts, use the **same Garaga SDK version** as the release that declared the class hashes. For v1.1.0 contracts above, use `garaga==1.1.0` (pip), `garaga_rs` tag `v1.1.0`, or `garaga@1.1.0` (npm). The SDK generates hints that are specific to each contract version. Mismatched versions will cause verification to fail. {% endhint %} {% hint style="info" %} In case you need to obtain class hashes for different versions of Garaga or declare them yourself if they do not exist, you can checkout the Garaga repo at a particular commit and run `python .github/scripts/declare_maintained_contracts.py` or `python .github/scripts/verify_contracts.py`. At each release tag, the CI ensures all contracts are declared before publishing packages. {% endhint %} ================================================ FILE: docs/gitbook/maintained-smart-contracts/drand.md ================================================ --- icon: dice --- # Drand Garaga provides maintained contracts for the [drand](https://drand.love) distributed randomness beacon. These enable: - **On-chain signature verification** of drand rounds for verifiable randomness - **Time-lock encryption (tlock)**: encrypt data that can only be decrypted after a specific drand round is published ## What is drand? drand is a distributed randomness beacon that provides: - **Unpredictable randomness**: Values cannot be known before generation - **Unbiasable output**: No single party can influence results - **Public verifiability**: Anyone can verify the randomness is legitimate - **Regular intervals**: New randomness every 3 seconds (quicknet) ## What is tlock? Time-lock encryption (tlock) leverages drand's BLS threshold signatures to create an identity-based encryption (IBE) scheme where the "identity" is a future drand round number. A message encrypted for round `N` can only be decrypted once drand publishes the signature for round `N`. No single party can decrypt early. ### Use Cases | Application | How tlock helps | |---|---| | **Sealed-bid auctions** | Bids encrypted until auction close (a specific drand round) | | **Scheduled reveals** | Information released at a predetermined time | | **Fair launches** | Token distributions with time-locked claiming | | **Commit-reveal schemes** | Players commit encrypted moves, revealed together after a round | ## Contracts ### Drand Quicknet Verifier Verifies drand BLS signatures and stores them on-chain. | Network | Class Hash | |---------|------------| | **Mainnet** | `0x86bf4360e082cd786bd785d3345df32777db89cd26b761f3e85b1993addfd0` | | **Sepolia** | `0x86bf4360e082cd786bd785d3345df32777db89cd26b761f3e85b1993addfd0` | ```cairo #[starknet::interface] trait IDrandQuicknet { /// Verify a drand round BLS signature and store it on-chain. fn verify_round( ref self: TContractState, full_proof_with_hints: Span, ) -> Result; /// Look up the stored signature for a previously verified round. fn get_signature_for_round( self: @TContractState, round_number: u64, ) -> Result; /// Look up the randomness (poseidon_hash(signature)) for a previously verified round. fn get_randomness_for_round( self: @TContractState, round_number: u64, ) -> Result; } ``` ### Drand Decrypt Quicknet Wraps the verifier to add on-chain tlock decryption. Deploy this contract yourself and point it at the verifier class hash. ```cairo #[starknet::interface] trait IDrandDecryptQuicknet { /// Verify a drand round BLS signature via library_call to the verifier class. fn verify_round( ref self: TContractState, full_proof_with_hints: Span, ) -> Result; /// Read the stored signature for a previously verified round. fn get_signature_for_round( self: @TContractState, round_number: u64, ) -> Result; /// Get poseidon_hash(signature) for a previously verified round. fn get_randomness_for_round( self: @TContractState, round_number: u64, ) -> Result; /// Decrypt a tlock ciphertext for a given round. /// If the round signature is not yet stored, a DrandHint must follow in the calldata. fn decrypt_cipher_text( ref self: TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; } ``` {% hint style="info" %} The verifier contract is designed for **library calls** and does not need to be deployed. The decrypt contract wraps it and **must be deployed** since it stores signatures in its own storage. {% endhint %} ## Quicknet Configuration Both contracts are configured for drand's **quicknet** network: | Parameter | Value | |-----------|-------| | **Chain Hash** | `52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971` | | **Public Key** | G2 point on BLS12-381 (hardcoded in contract) | | **Period** | 3 seconds | | **Genesis** | 1692803367 (Aug 23, 2023) | --- ## Verifiable Randomness ### Fetching drand Randomness First, fetch randomness from drand's HTTP API: ```bash # Get the latest round curl https://api.drand.sh/52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971/public/latest # Get a specific round curl https://api.drand.sh/52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971/public/12345 ``` Response: ```json { "round": 12345, "randomness": "8b9c...", "signature": "a1b2..." } ``` ### Generating Verification Calldata Use the Garaga SDK to generate the `full_proof_with_hints` calldata from the drand response: {% tabs %} {% tab title="Python" %} ```python from garaga.starknet.tests_and_calldata_generators.drand_calldata import ( drand_round_to_calldata, ) # Generate calldata for a specific round (fetches from drand API automatically) calldata = drand_round_to_calldata(round_number=12345) # Returns list[int] ready for on-chain verification # Use the Rust backend for better performance calldata = drand_round_to_calldata(round_number=12345, use_rust=True) ``` {% endtab %} {% tab title="TypeScript" %} ```typescript import * as garaga from 'garaga'; await garaga.init(); // Fetch drand randomness and build calldata const drandData = await garaga.fetchDrandRandomness(12345); const calldata = garaga.getDrandCallData(drandData); ``` {% endtab %} {% endtabs %} ### On-Chain Verification with Library Call Use `library_call_syscall` to call the drand verifier contract: ```cairo use starknet::{SyscallResultTrait, syscalls}; use garaga::definitions::G1Point; const DRAND_QUICKNET_CLASS_HASH: felt252 = 0x86bf4360e082cd786bd785d3345df32777db89cd26b761f3e85b1993addfd0; fn verify_drand_round(full_proof_with_hints: Span) -> u64 { let mut call_data: Array = array![]; Serde::serialize(@full_proof_with_hints, ref call_data); let mut result = syscalls::library_call_syscall( DRAND_QUICKNET_CLASS_HASH.try_into().unwrap(), selector!("verify_round"), call_data.span(), ).unwrap_syscall(); let round: Result = Serde::deserialize(ref result).unwrap(); round.unwrap() } ``` --- ## Time-Lock Encryption (tlock) ### How It Works ``` ┌─────────────────────────────────────────────────────────────────┐ │ ENCRYPTION (off-chain) │ │ │ │ 1. Choose a future drand round number N │ │ 2. Encrypt 16-byte message using drand's public key + round N │ │ 3. Produces CipherText { U: G2Point, V: [u8;16], W: [u8;16] } │ │ 4. Store ciphertext on-chain or off-chain │ │ │ └──────────────────────────────┬──────────────────────────────────┘ │ time passes... │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ drand publishes round N signature │ └──────────────────────────────┬──────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ DECRYPTION (on-chain) │ │ │ │ 1. Verify the drand signature for round N (BLS pairing check) │ │ 2. Use signature to decrypt: e(signature, U) recovers key │ │ 3. XOR-decrypt to recover the original 16-byte message │ │ 4. Verify ciphertext integrity (U = r·G₂ check) │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` {% hint style="info" %} **Message size**: tlock encrypts a 16-byte (128-bit) message. For larger payloads, encrypt a symmetric key with tlock and use it to encrypt the larger data off-chain. {% endhint %} ### Encrypting a Message (Off-Chain) Use the Garaga SDK to encrypt a message for a future drand round: {% tabs %} {% tab title="Python" %} ```python from garaga.starknet.tests_and_calldata_generators.drand_calldata import ( drand_encrypt_to_calldata, ) # Encrypt a 16-byte message for a future round message = b"secret message!!" # exactly 16 bytes round_number = 100000 # a future drand round # Generate calldata containing the encrypted ciphertext calldata = drand_encrypt_to_calldata(round_number, message) # Use the Rust backend for better performance calldata = drand_encrypt_to_calldata(round_number, message, use_rust=True) ``` {% endtab %} {% tab title="TypeScript" %} ```typescript import * as garaga from 'garaga'; await garaga.init(); // Prepare 16-byte message and randomness const message = new Uint8Array(16); message.set(new TextEncoder().encode('secret message!!')); const randomness = crypto.getRandomValues(new Uint8Array(16)); // Encrypt for a specific future round const calldata = garaga.encryptToDrandRoundAndGetCallData( 100000, // round number message, // 16-byte message randomness, // 16-byte randomness ); ``` {% endtab %} {% tab title="Rust" %} ```rust use garaga_rs::calldata::drand_tlock_calldata::drand_tlock_encrypt_calldata_builder; use num_bigint::BigUint; let round_number = 100000u64; let message: [u8; 16] = *b"secret message!!"; let randomness: [u8; 16] = rand::random(); let values = vec![ BigUint::from(round_number), BigUint::from_bytes_be(&message), BigUint::from_bytes_be(&randomness), ]; let calldata = drand_tlock_encrypt_calldata_builder(&values).unwrap(); ``` {% endtab %} {% endtabs %} ### Decrypting On-Chain The `decrypt_cipher_text` function on the decrypt contract handles two scenarios: 1. **Round already verified**: If the drand signature for the round is already stored, only the ciphertext calldata is needed. 2. **Round not yet verified**: The ciphertext calldata is followed by the drand verification hint, and both verification and decryption happen in a single transaction. #### Scenario 1: Verify first, then decrypt ```python from garaga.starknet.tests_and_calldata_generators.drand_calldata import ( drand_round_to_calldata, drand_encrypt_to_calldata, ) # Step 1: Verify the round (stores the signature) verify_calldata = drand_round_to_calldata(round_number=12345) # Call contract.verify_round(verify_calldata) # Step 2: Decrypt (uses stored signature) decrypt_calldata = drand_encrypt_to_calldata(12345, message) # Call contract.decrypt_cipher_text(decrypt_calldata) ``` #### Scenario 2: Verify and decrypt in one transaction ```python # Combine encryption calldata + verification calldata encrypt_cd = drand_encrypt_to_calldata(round_number, message) verify_cd = drand_round_to_calldata(round_number) # Strip the length prefix from each, combine, and add new length prefix. # This works because decrypt_cipher_text deserializes the DrandDecryptHint # (round + ciphertext) first, then passes the remaining bytes to verify_round. combined_data = encrypt_cd[1:] + verify_cd[1:] combined_calldata = [len(combined_data)] + combined_data # Call contract.decrypt_cipher_text(combined_calldata) ``` ### Cairo: CipherText Struct The tlock ciphertext is defined in `garaga::apps::drand`: ```cairo use garaga::apps::drand::CipherText; use garaga::definitions::G2Point; /// The result of a timelock encryption over drand quicknet. struct CipherText { U: G2Point, // r·G₂ — the ephemeral public key V: [u8; 16], // sigma XOR H₂(r·e(H(round), pk)) W: [u8; 16], // message XOR H₄(sigma) } ``` ### Cairo: Direct Decryption in Your Contract If you want to call the `decrypt_at_round` function directly from the garaga library: ```cairo use garaga::apps::drand::{CipherText, decrypt_at_round}; use garaga::definitions::G1Point; fn my_decrypt(signature: G1Point, ciphertext: CipherText) -> [u8; 16] { // Performs: miller loop, final exponentiation, XOR decryption, and U = r·G₂ check decrypt_at_round(signature, ciphertext) } ``` {% hint style="warning" %} `decrypt_at_round` verifies ciphertext integrity (`U = r·G₂`) but does **not** verify that the provided signature is a valid drand BLS signature. You must verify the signature separately via `verify_round` or perform your own pairing check before calling this function. {% endhint %} --- ## Example: On-Chain Lottery ```cairo #[starknet::contract] mod Lottery { use starknet::ContractAddress; use starknet::storage::{ Map, StorageMapReadAccess, StorageMapWriteAccess, StoragePointerReadAccess, StoragePointerWriteAccess, }; use starknet::{SyscallResultTrait, syscalls}; const DRAND_QUICKNET_CLASS_HASH: felt252 = 0x86bf4360e082cd786bd785d3345df32777db89cd26b761f3e85b1993addfd0; #[storage] struct Storage { participants: Map, participant_count: u32, target_round: u64, is_open: bool, } #[external(v0)] fn enter_lottery(ref self: ContractState) { assert!(self.is_open.read(), "Lottery closed"); let count = self.participant_count.read(); self.participants.write(count, starknet::get_caller_address()); self.participant_count.write(count + 1); } #[external(v0)] fn draw_winner( ref self: ContractState, full_proof_with_hints: Span, ) -> ContractAddress { let mut call_data: Array = array![]; Serde::serialize(@full_proof_with_hints, ref call_data); let mut result = syscalls::library_call_syscall( DRAND_QUICKNET_CLASS_HASH.try_into().unwrap(), selector!("verify_round"), call_data.span(), ).unwrap_syscall(); let round_result: Result = Serde::deserialize(ref result).unwrap(); let verified_round = round_result.unwrap(); assert!(verified_round == self.target_round.read(), "Wrong round"); let count: u256 = self.participant_count.read().into(); // Retrieve randomness from the verified round let mut rand_call_data: Array = array![]; Serde::serialize(@verified_round, ref rand_call_data); let mut rand_result = syscalls::library_call_syscall( DRAND_QUICKNET_CLASS_HASH.try_into().unwrap(), selector!("get_randomness_for_round"), rand_call_data.span(), ).unwrap_syscall(); let randomness: Result = Serde::deserialize(ref rand_result).unwrap(); let winner_index: u32 = (randomness.unwrap().into() % count).try_into().unwrap(); self.participants.read(winner_index) } } ``` ## Example: Sealed-Bid Auction with tlock A sketch of how tlock enables sealed-bid auctions. Bids are encrypted for a future reveal round. Once drand publishes that round, bids can be decrypted on-chain. ``` 1. Auction opens — bidders encrypt their bids for reveal_round using tlock 2. Bidders submit a hash of their ciphertext on-chain (commitment) 3. Auction closes — no more bids accepted 4. drand publishes reveal_round signature 5. Anyone calls decrypt_cipher_text to reveal each bid on-chain 6. Contract determines the winner from the decrypted bids ``` The ciphertext itself (a `G2Point` + 32 bytes) can be stored off-chain (e.g., IPFS) with only a commitment hash on-chain, or submitted directly in the decryption transaction. ## Helper Functions The `garaga::apps::drand` module provides utilities for working with drand rounds: ```cairo use garaga::apps::drand::{timestamp_to_round, round_to_timestamp}; // Convert a Unix timestamp to a drand round number let round = timestamp_to_round(1692803370); // returns 2 // Convert a drand round number to a Unix timestamp let timestamp = round_to_timestamp(2); // returns 1692803370 ``` ## Security Considerations - **Round timing**: Ensure you're using the correct round for your application's timing requirements. Use `timestamp_to_round` to map wall-clock time to drand rounds. - **Message size**: tlock encrypts exactly 16 bytes. Use it to encrypt a symmetric key for larger payloads. - **Ciphertext integrity**: The `decrypt_at_round` function verifies `U = r·G₂` to ensure the ciphertext was formed correctly. Tampered ciphertexts will be rejected. - **Finality**: Once a drand round is published, the signature is permanent. The ciphertext becomes decryptable by anyone with the round signature. - **Fallback**: Consider implementing fallback mechanisms if drand becomes unavailable. ## Resources - [drand Website](https://drand.love) - [drand API Documentation](https://drand.love/developer/http-api/) - [Quicknet Information](https://drand.love/blog/2023/07/03/quicknet-is-live/) - [tlock Paper](https://eprint.iacr.org/2023/189) — "tlock: Practical Timelock Encryption from Threshold BLS" - [Verifier Source Code](https://github.com/keep-starknet-strange/garaga/tree/main/src/contracts/drand_quicknet) - [Decrypt Contract Source Code](https://github.com/keep-starknet-strange/garaga/tree/main/src/contracts/drand_decrypt_quicknet) ================================================ FILE: docs/gitbook/maintained-smart-contracts/risczero.md ================================================ --- icon: microchip --- # RiscZero RiscZero is a Zero-Knowledge Proof system designed to enable efficient and scalable construction of computational proofs based on the RISC-V architecture. It is Groth16-based and works over the BN254 elliptic curve. Garaga provides the tools and makes it possible to verify such proofs on-chain in a Starknet/Cairo smart contract. A Zero-Knowledge proof is a mathematical construct that guarantees that a given value is the output of a predefined computation where some of the inputs are private and must not be disclosed. This is achieved in two steps: 1- A Prover performs the computation and constructs the proof artifact. The proof artifact contains the computational journal which is, in simple terms, the list of public inputs and the output value. The proof artifact attests the integrity of the computation, which means the prover ran the computation properly and the output value registered in the journal corresponds to the result of such computation given the public inputs, also registered in the jornal, an some undisclosed private inputs. Here the Prover is a RiscZero user-defined program that implements the desired computation and is augmented to produce the desired proof artifact. 2- Given the proof artifact, a Verifier must check its integrity before processing the output as valid. Here the Verifier is a Starknet smart contract written in Cairo and Garaga acts as a library to which the verification is delegated to. ### Setting up the development environment Before starting development we need to install all the software prerequisites for building either or both the Prover and Verifier components. Below we provide general installation instructions for a Linux-based system. Depending on your setup you may already have some of the software installed, in which case you can skip the associated sections. But if you need additional help for a specific set up, please follow the links provided.\ \ In order to implement the Prover one needs to install the tooling required by RiscZero: 1. Install Rust/Cargo using [`rustup`](https://rustup.rs/) (default version 1.8.3) ```bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y export PATH="$HOME/.cargo/bin:$PATH" ``` 2. Install the RiscZero tool-chain using [`rzup`](https://dev.risczero.com/api/zkvm/install) (default version 1.2.0) ```bash curl -L https://risczero.com/install | bash export PATH="$HOME/.risc0/bin:$PATH" rzup install ``` _Important: Make sure the RiscZero version installed matches the version supported by Garaga. For RiscZero v2.2.2 use Garaga 1.1.0. Check [constants.json](https://github.com/keep-starknet-strange/garaga/blob/main/tools/make/constants.json) for the latest supported versions._ 3. Install RiscZero additional/custom dependencies A C compiler, such as `gcc`, `pkg-config` and OpenSSL development libraries (`libssl-dev)` are necessary to build a RiscZero project. You should refer to your system documentation on how to install those. Here is a quick reference for Debian compatible systems ```bash sudo apt install -y gcc libssl-dev pkg-config ``` Optionally, if you intend to have the Prover generate the contract call data explicitly, Garaga requires that Python is available in your environment. If necessary, check their [documentation](https://docs.python.org/3/using/index.html) for installation instructions for your system. Again, here is a quick reference for Debian compatible systems ```bash sudo apt install -y python3 ``` In order to implement the Verifier one needs to install the tooling for Cairo development and Garaga: 4. Install the Starknet/Cairo bundler tool [`scarb`](https://docs.swmansion.com/scarb/download#install-via-installation-script) (default version 2.16.1) ```bash curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | bash export PATH="$HOME/.local/bin:$PATH" ``` 5. Install Starknet Foundry using [`snfoundryup`](https://foundry-rs.github.io/starknet-foundry/getting-started/installation.html) (default version 0.57.0) ```bash curl -L https://raw.githubusercontent.com/foundry-rs/starknet-foundry/master/scripts/install.sh | bash export PATH="$HOME/.local/bin:$PATH" snfoundryup ``` ### Create or configure the RiscZero project 1. If you are setting up a new RiscZero project, run the command below, it will create a new project folder and define the Guest program name. The Guest program is the program that is compiled to and will run in the RiscZero VM. The project setup also creates a Host program that runs outside the RiscZero VM and interacts with the Guest, providing inputs and collecting outputs, to produce the ZK proof. Here we set up a sample project called `fibonacci_prover` with a Guest called `fibonacci_guest` (for reference, the complete RiscZero app presented here is available in [Garaga's GitHub repository](https://github.com/keep-starknet-strange/garaga/tree/main/src/contracts/risc0_sample_app)) ``` cargo risczero new fibonacci_prover --guest-name fibonacci_guest ``` If you already have a RiscZero project set up, make sure the RiscZero version configured as dependencies is consistent with the RiscZero toolchain installed in the previous steps. 2. Next we need to modify the RiscZero Host program to output the proof artifact in the desired JSON format. Add the following dependencies to `host/Cargo.toml` ```toml [dependencies] risc0-ethereum-contracts = { version = "1.2.0" } hex = "0.4" ... ``` Optionally, if you intend to explicitly generate and handle the call-data, also add the following dependency to `host/Cargo.toml`. Make sure to use a Garaga version tag that is consistent with your setup.
[dependencies]
garaga_rs = { git = "https://github.com/keep-starknet-strange/garaga.git", tag = "v1.1.0" }
...
Then we modify the Host program `host/src/main.rs` to generate the JSON file containing the proof artifact. We start by adding the required imports ```rust use risc0_zkvm::{ compute_image_id, default_prover, ExecutorEnv, ProverOpts, VerifierContext }; use risc0_ethereum_contracts::encode_seal; ``` Optionally, if you intend to generate the call-data explicitly, add the following imports ```rust use garaga_rs::definitions::CurveID; use garaga_rs::calldata::full_proof_with_hints::groth16::{ get_groth16_calldata, Groth16Proof }; use garaga_rs::calldata::full_proof_with_hints::groth16::risc0_utils::get_risc0_vk; ``` Next we need to modify the Host main function. If you are starting a fresh RiscZero project, you will need to setup the environment for the computation. This is basically the set of inputs that will be used by the Guest program to perform the computation. Below is an example for the `fibonacci_prover`. In this example, we want to compute the number at position `n` of the Fibonacci sequence. However we do not want to reveal `n`, but instead show that `n` lies in a given interval defined by a lower bound `l` and an upper bound `u`. ```rust let l: u32 = 3; // public lower bound for n let u: u32 = 8; // public upper bound for n let n: u32 = 6; // private n for which we will compute fibonacci(n) let env = ExecutorEnv::builder() .write(&l) .unwrap() .write(&u) .unwrap() .write(&n) .unwrap() .build() .unwrap(); ``` _As a note, the sample app provided here exists only to demonstrate how to setup a ZK project using Garaga/RiscZero. It is clear that datatype `u32` is not appropriate datatype to host a secret Fibonacci number as it can be easily discovered by brute force checking all possibilities between the bounds._ Next we modify the default Prover setup to explicitly use Groth16 ```rust let prove_info = prover .prove_with_ctx( env, &VerifierContext::default(), FIBONACCI_GUEST_ELF, &ProverOpts::groth16() ) .unwrap(); ``` Finally, as the last step of the Host program, we extract and print the proof artifact JSON to the standard output
let receipt = prove_info.receipt;
let seal = to_bytes(encode_seal(&receipt).unwrap());
let image_id = to_bytes(compute_image_id(&FIBONACCI_GUEST_ELF).unwrap());
let journal = to_bytes(receipt.journal);
println!(
    "{{\"seal\": \"0x{}\", \"image_id\": \"0x{}\", \"journal\": \"0x{}\"}}",
    hex::encode(&seal),
    hex::encode(&image_id),
    hex::encode(&journal)
);

// helper function to convert objects to array of bytes
fn to_bytes<T: AsRef<[u8]>>(obj: T) -> Vec<u8> {
    obj.as_ref().to_vec()
}
Optionally, if you also intend to handle the call-data explicitly, it can be computed and output as a JSON as well. This produces a large array that encodes the full RiscZero proof wih hints ```rust let proof = Groth16Proof::from_risc0(seal, image_id, journal); let calldata = get_groth16_calldata(&proof, &get_risc0_vk(), CurveID::BN254).unwrap(); println!("[{}]", calldata.iter().skip(1).map(|v| format!("\"{}\"", v)).collect::>().join(", ")); ``` Now we need to set up the Guest program that performs the computation required by our use case. If you started a fresh RiscZero project, then you will need to write the Guest program that performs the computation. It is done by modifying the main function of the Guest source file at `methods/guest/src/main.rs` In our example, here is what the Guest code looks like for the `fibonacci_guest` ```rust // reads the public bounds and private n provided by the Host let l: u32 = env::read(); let u: u32 = env::read(); let n: u32 = env::read(); // sanity check for the bounds assert!(l <= n && n < u); // performs the computation let fib_n: u32 = fibonacci(n); fn fibonacci(n: u32) -> u32 { let mut a = 0; let mut b = 1; for _ in 0..n { (a, b) = (b, a + b); } a } // writes the public inputs and output to the journal env::commit(&l); env::commit(&u); env::commit(&fib_n); ``` ### RiscZero Proof Generation RiscZero provides some options when it comes to proof generation. Please refer to their [documentation](https://dev.risczero.com/api/generating-proofs/proving-options) in case you need to in depth information on that. The easiest and most convenient way is to use the provided [Bonsai](https://www.bonsai.xyz/) service, which works fine for many purposes. In that case, an API key for the service is required. _It is important to note that, if your computation has private inputs, you should definitely protect them from being exposed to external services like Bonsai by performing the proof generation locally._ Here is the command to run the Prover via Bonsai ``` BONSAI_API_KEY= BONSAI_API_URL= RISC0_DEV_MODE=0 \ cargo run --release ``` ### Developing the RiscZero Verifier smart contract There are different ways one can choose to develop a Cairo smart contract, we recommend using Staknet Foundry. A fresh new project can be created by issuing the following command ```bash snforge new fibonacci_sequencer ``` This will output a template for a smart contract along with the necessary tooling configuration to build and test it. In this case we are creating a contract called `fibonacci_sequencer`, that will process and update its state with a new number in the Fibonacci sequence that is guaranteed to have an index `n` in the sequence that is higher than the last one currently registered by the contract, although that exact index `n` is never revealed publicly. Garaga already provides a smart contract to verify RiscZero proofs. To make use of that functionality, one just has to call a predefined library function from the client smart contract. In order to do that, one needs to declare the interface of the RiscZero verifying library function in `src/lib.cairo`: ```rust #[starknet::interface] trait IRisc0Groth16VerifierBN254 { fn verify_groth16_proof_bn254( self: @TContractState, full_proof_with_hints: Span, ) -> Option>; } ``` The `verify_groth16_proof_bn254` function takes the call data that encodes the proof with hints as a list of integers of type `felt252` and returns the journal (as a list of bytes) on proof verification success, or nothing if the verification fails. Here is how to verify the RiscZero proof and update the smart contract state for our Fibonacci sequencer example: ```rust fn verify_and_submit_fibonacci_number(ref self: ContractState, full_proof_with_hints: Span) { // sets the class hash for the RiscZero verifier already declared on-chain // by the Garaga team let class_hash: ClassHash = RISC_ZERO_VERIFIER_CLASS_HASH.try_into().unwrap(); // instantiate a library dispatcher to perform the library call // to the RiscZero verifier class, given that verifying a proof is // a read-only operation let dispatcher = IRisc0Groth16VerifierBN254LibraryDispatcher { class_hash }; // calls the RiscZero verifier passing along the proof artifact and // checks whether the proof is valid or not, aborting the transaction if not let optional_journal = dispatcher.verify_groth16_proof_bn254(full_proof_with_hints); assert(optional_journal != Option::None, 'Invalid proof'); // parses the public inputs and output from the journal let mut journal = optional_journal.unwrap(); let l = pop_front_u32_le(ref journal); let u = pop_front_u32_le(ref journal); let fib_n = pop_front_u32_le(ref journal); // performs the necessary state update check, updates the state, // and emits an event with the new fibnoacci number submitted // the smart contract invariant guarantees that every fiboacci number // accepted comes later in the fibonacci sequence without revealing // its index, which is trivial for monotonic sequences like fibnacci, // but would also work as expected also for non-monotonic ones let b = self.lower_bound.read(); assert(l >= b, 'Invalid lower bound'); self.lower_bound.write(u); self.emit(FibonnacciNumberSubmitted { n: fib_n }); self.emit(LowerBoundUpdated { n: u }); } ``` Along with the `verify_and_submit_fibonacci_number` contract method, we need to define the RiscZero Verifier class hash, which can be obtained [here](./) ```rust use core::starknet::ClassHash; pub const RISC_ZERO_VERIFIER_CLASS_HASH: felt252 = 0x41d5e111b93acbf1afb531253e0bc64d43f90a8a99290361e851ec0c4968ab1; ``` The contract state which stores the current lower bound which gets updated whenever a new Fibonacci number is submitted ```rust #[storage] struct Storage { lower_bound: u32, } ``` And also the helper function used to decode the journal values ```rust fn pop_front_u32_le(ref bytes: Span) -> u32 { let [b0, b1, b2, b3] = (*bytes.multi_pop_front::<4>().unwrap()).unbox(); let b0: u32 = b0.into(); let b1: u32 = b1.into(); let b2: u32 = b2.into(); let b3: u32 = b3.into(); b0 + 256 * (b1 + 256 * (b2 + 256 * b3)) } ``` For completeness, we also provide the definition of the events emitted by the operation ```rust #[event] #[derive(Drop, starknet::Event)] enum Event { FibonnacciNumberSubmitted: FibonnacciNumberSubmitted, LowerBoundUpdated: LowerBoundUpdated, } #[derive(Drop, starknet::Event)] struct FibonnacciNumberSubmitted { #[key] n: u32, } #[derive(Drop, starknet::Event)] struct LowerBoundUpdated { #[key] n: u32, } ``` It is important to note that the `verify_and_submit_fibonacci_number` function defined in this sample contract has a signature that takes a single argument: the proof artifact. This is useful because we can then submit the transaction to the blockchain directly, simply using the Garaga CLI passing along the JSON file output by the RiscZero Host program. This avoids the need to encode the proof as a customized call data. It also spares us from dealing with the transaction submission details which is handled internally by the Garaga CLI. This is an approach that makes sense when all the information required to validate and update the smart contract state can be extracted from the journal, exempting us from the need of passing additional parameters to the function which would deem it incompatible with the interface expected by the CLI. The CLI also requires the contract method processing the proof (referred to as endpoint) to have the word `verify` as part of it. Once the Cairo smart contract is ready, it can be deployed in three steps: * Declare ```bash sncast --profile declare --contract-name ``` This will declare the smart contract class and return its hash. * Deploy ```bash sncast --profile deploy --class-hash ``` This will deploy the smart contract instance and return its address. * Verify (Optional) ```bash sncast --profile verify \ --network \ --contract-name \ --contract-address ``` This will match the deployed code with the smart contract source code and make it available on Starknet block explorers. Before running any of the commands above, one has to configure foundry to add the desired profile name. That is achieved by editing the `snfoundry.toml` file. Here is a sample configuration as reference ```toml [sncast.sepolia] account = "deployer" accounts-file = "./accounts.json" url = "https://starknet-sepolia.public.blastapi.io/rpc/v0_7" ``` This requires an `accounts.json` file. One such a way to generate it is using the following command ```bash sncast account import \ --name deployer \ --type \ --address \ --private-key ``` One can setup an [ArgentX](https://www.argent.xyz/) or [Braavos](https://braavos.app/) wallet, fund it, and export its private key. ### Submitting the proof to the blockchain using the Garaga CLI Once the smart contract is published on the blockchain network, users can interact with it. In our case, one such interaction would be to perform a computation off-chain with RiscZero and submit it to the smart contract. As mentioned before, the JSON proof artifact generated by the RiscZero execution can be submitted to the blockchain using Garaga CLI: ```bash garaga verify-onchain \ --system risc0_groth16 \ --network \ --contract-address \ --endpoint \ --proof ``` In order to run the Garaga `verify-onchain` command you will need to provide a .`secrets` file in the current folder, or elsewhere using the `--env-file` option. Here is the format for the `.secrets` file ``` SEPOLIA_RPC_URL="https://starknet-sepolia.public.blastapi.io/rpc/v0_7" SEPOLIA_ACCOUNT_PRIVATE_KEY= SEPOLIA_ACCOUNT_ADDRESS= MAINNET_RPC_URL="https://starknet-mainnet.public.blastapi.io/rpc/v0_7" MAINNET_ACCOUNT_PRIVATE_KEY= MAINNET_ACCOUNT_ADDRESS= ``` Please make sure to provide RPC endpoints that supports version 0.7 of the Starknet JSON API ================================================ FILE: docs/gitbook/maintained-smart-contracts/sp1.md ================================================ --- icon: microchip --- # SP1 To use the SP1 Groth16 verifier on Starknet, you can follow code snippets from the [SP1 documentation](https://docs.succinct.xyz/docs/sp1/introduction) to generate a proof.\ \ The version of SP1 expected by Garaga is defined in the file [constants.json](https://github.com/keep-starknet-strange/garaga/blob/main/tools/make/constants.json) .\ \ A template modeled after [Succinct's official one](https://github.com/succinctlabs/sp1-project-template/) for solidity and EVM is available in [this repository](https://github.com/feltroidprime/SP1-starknet-garaga-template/)\ Please follow the instructions there to get you started. ================================================ FILE: docs/gitbook/security.md ================================================ --- icon: shield-check --- # Security Garaga is designed with security as a primary concern. This page documents our security practices, audit history, and important considerations for users. --- ## Audit Status ### ✅ Audited by CryptoExperts Garaga has undergone a comprehensive security audit: | Audit | Auditor | Date | Report | |-------|---------|------|--------| | **Garaga v1.1.0** | [CryptoExperts](https://www.cryptoexperts.com/) | June 27, 2025 | [View Report (PDF)](https://github.com/keep-starknet-strange/garaga/blob/main/docs/Garaga-audit-report-v2.pdf) | {% hint style="success" %} The audit covered core cryptographic operations including pairing checks, multi-scalar multiplication, and the Groth16 verifier implementation. {% endhint %} --- ## Security Considerations ### Signature Verification {% hint style="warning" %} **Hash Computation Responsibility** The functions `is_valid_ecdsa_signature_assuming_hash` and `is_valid_schnorr_signature_assuming_hash` verify signature equations but **do not hash the message**. The caller is responsible for: 1. Correctly computing the message hash 2. Using the appropriate hash function for the signature scheme 3. Ensuring the hash is computed over the correct message **Incorrect hash computation will result in invalid signatures being accepted or valid signatures being rejected.** {% endhint %} ### EdDSA (Ed25519) Specific The EdDSA implementation includes protections against common attacks: - ✅ **Small-order point rejection**: Explicitly rejects points in small subgroups - ✅ **Cofactor handling**: Properly handles the Ed25519 cofactor - ✅ **Canonical encoding**: Enforces canonical point encoding ### Curve Selection When using Garaga's curve-agnostic APIs, ensure you: 1. Use the correct `curve_id` for your application 2. Understand the security properties of your chosen curve 3. Use appropriate key sizes and parameters | Curve | Security Level | Notes | |-------|----------------|-------| | BN254 | ~100 bits | Widely used in Ethereum ecosystem | | BLS12-381 | ~128 bits | Recommended for new applications | | SECP256K1 | ~128 bits | Bitcoin/Ethereum compatibility | | SECP256R1 | ~128 bits | WebAuthn/TLS compatibility | | ED25519 | ~128 bits | High performance EdDSA | --- ## Responsible Disclosure If you discover a security vulnerability in Garaga: 1. **Do NOT** open a public GitHub issue 2. **DO** email the maintainers privately 3. **DO** provide detailed information about the vulnerability 4. **DO** allow reasonable time for a fix before public disclosure See our [Security Policy](https://github.com/keep-starknet-strange/garaga/blob/main/docs/SECURITY.md) for contact information. --- ## Cryptographic References Garaga's implementations are based on peer-reviewed cryptographic research. We recommend understanding these papers if you're building security-critical applications: ### Zero-Knowledge Proofs | Paper | Authors | Reference | |-------|---------|-----------| | **Groth16** | Jens Groth | "On the Size of Pairing-Based Non-interactive Arguments" EUROCRYPT 2016. [ePrint 2016/260](https://eprint.iacr.org/2016/260) | | **PLONK** | Gabizon, Williamson, Ciobotaru | "PLONK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge" [ePrint 2019/953](https://eprint.iacr.org/2019/953) | ### Elliptic Curves & Pairings | Paper | Authors | Reference | |-------|---------|-----------| | **Efficient Pairings** | Youssef El Housni | "Pairings in Rank-1 Constraint Systems" [ePrint 2022/1162](https://eprint.iacr.org/2022/1162) | | **ECIP** | Liam Eagen | "Zero Knowledge Proofs of Elliptic Curve Inner Products from Principal Divisors and Weil Reciprocity" [ePrint 2022/596](https://eprint.iacr.org/2022/596) | | **On Proving Pairings** | Novakovic & Eagen | [ePrint 2024/640](https://eprint.iacr.org/2024/640) | | **Fast EC Scalar Multiplications** | Eagen, El Housni, Masson, Piellard | [ePrint 2025/933](https://eprint.iacr.org/2025/933) | | **Pairing for Beginners** | Craig Costello | [PDF](https://static1.squarespace.com/static/5fdbb09f31d71c1227082339/t/5ff394720493bd28278889c6/1609798774687/PairingsForBeginners.pdf) | ### Signatures | Paper | Authors | Reference | |-------|---------|-----------| | **EdDSA** | Bernstein et al. | "High-speed high-security signatures" [ed25519.cr.yp.to](https://ed25519.cr.yp.to/) | | **Taming EdDSAs** | Chalkias, Garillot, Nikolaenko | "Taming the Many EdDSAs" SSR 2020. [ACM DL](https://dl.acm.org/doi/abs/10.1007/978-3-030-64357-7_4) | | **BIP340** | Wuille, Nick, Towns | "Schnorr Signatures for secp256k1" [BIP340](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki) | ### Randomness | Paper | Authors | Reference | |-------|---------|-----------| | **drand** | Syta et al. | "Scalable Bias-Resistant Distributed Randomness" IEEE S&P 2017 | | **Time-Lock Encryption** | Gailly, Melissaris, Romailler | "tlock: Practical Timelock Encryption from Threshold BLS" [ePrint 2023/189](https://eprint.iacr.org/2023/189) | --- ## Disclaimer {% hint style="danger" %} **USE AT YOUR OWN RISK** Garaga is provided "as is" without any warranty. While we strive for correctness and security: - 100% security cannot be assured - Cryptographic software is inherently complex - Always perform your own security review for production use - Consider additional audits for high-value applications See the [MIT License](https://github.com/keep-starknet-strange/garaga/blob/main/LICENSE) for full terms. {% endhint %} --- ## Security Checklist Before deploying to production: - [ ] Understand the cryptographic assumptions - [ ] Test thoroughly on testnet first - [ ] Use the latest stable release - [ ] Monitor for security advisories - [ ] Consider additional application-level audits ================================================ FILE: docs/gitbook/smart-contract-generators/README.md ================================================ --- icon: monero --- # Deploy your own SNARK verifier on Starknet Supported verifiers: * [groth16](groth16/ "mention") * [noir.md](noir.md "mention") ================================================ FILE: docs/gitbook/smart-contract-generators/groth16/README.md ================================================ --- icon: bat --- # Groth16 ================================================ FILE: docs/gitbook/smart-contract-generators/groth16/generate-and-deploy-your-verifier-contract.md ================================================ --- icon: file-lock --- # Generate and deploy your verifier contract ## Prepare your Groth16 verifying key {% hint style="info" %} Pairing operations over BLS12-381 are cheaper than BN254 on Garaga, so if possible, prefer using BLS12-381. The security of this curve is also much closer to 128 bits than BN254. {% endhint %} \ To deploy a groth16 verifier, you need the associated verifying key in `.json` format. Both BN254 and BLS12-381 are supported. [Snarkjs](https://github.com/iden3/snarkjs?tab=readme-ov-file#22-export-the-verification-key) and [Gnark](https://docs.gnark.consensys.io/HowTo/serialize) jsons output are supported out of the box. You can find a bunch of example of verifying keys that will work directly in the [`hydra/garaga/starknet/groth16_contract_generator/examples`](https://github.com/keep-starknet-strange/garaga/tree/main/hydra/garaga/starknet/groth16\_contract\_generator/examples) folder. While Snarkjs jsons export are easy and working well, the gnark documentation is a bit outdated. Below we show a quick example on how to export the verifying key from your Gnark circuit .
Gnark export to json example ```go package main import ( "encoding/json" "os" "github.com/consensys/gnark-crypto/ecc" "github.com/consensys/gnark/backend/groth16" "github.com/consensys/gnark/frontend" "github.com/consensys/gnark/frontend/cs/r1cs" ) // CubicCircuit defines a simple circuit // x**3 + x + 5 == y type CubicCircuit struct { // struct tags on a variable is optional // default uses variable name and secret visibility. X frontend.Variable `gnark:"x"` Y frontend.Variable `gnark:",public"` B frontend.Variable A frontend.Variable `gnark:",public"` } // Define declares the circuit constraints // x**3 + x + 5 == y func (circuit *CubicCircuit) Define(api frontend.API) error { x3 := api.Mul(circuit.X, circuit.X, circuit.X) api.AssertIsEqual(circuit.Y, api.Add(x3, circuit.X, 5)) api.AssertIsEqual(circuit.B, circuit.A) return nil } func main() { // compiles our circuit into a R1CS var circuit CubicCircuit ccs, _ := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit) // groth16 zkSNARK: Setup pk, vk, _ := groth16.Setup(ccs) // witness definition assignment := CubicCircuit{X: 3, Y: 35, A: 3, B: 3} witness, _ := frontend.NewWitness(&assignment, ecc.BN254.ScalarField()) publicWitness, _ := witness.Public() // groth16: Prove & Verify proof, _ := groth16.Prove(ccs, pk, witness) groth16.Verify(proof, vk, publicWitness) vk.ExportSolidity(os.Stdout) // Export to JSON: schema, _ := frontend.NewSchema(&circuit) pubWitnessJSON, _ := publicWitness.ToJSON(schema) SaveToJSON("gnark_vk_bn254.json", vk) SaveToJSON("gnark_proof_bn254.json", proof) os.WriteFile("gnark_public_bn254.json", pubWitnessJSON, 0644) } func SaveToJSON(filePath string, v interface{}) error { jsonData, err := json.MarshalIndent(v, "", " ") if err != nil { return err } err = os.WriteFile(filePath, jsonData, 0644) if err != nil { return err } return nil } ```
## Generate the Smart contract code \ Using the [developer-setup-and-guides](../../developer-setup-and-guides/ "mention") or the [python-package.md](../../installation/python-package.md "mention"), you should now have access to the Garaga CLI from your terminal, using the command `garaga` ```bash garaga ``` Once your verifying key is ready, you can use the following command : ``` garaga gen --system groth16 --vk vk.json ``` You should see an output like this : ```bash (venv) :~/garaga-flow garaga gen --system groth16 --vk vk_bls.json Please enter the name of your project. Press enter for default name. [my_project]: Detected curve: CurveID.BLS12_381 ⠧ Generating Smart Contract project for ProofSystem.Groth16 using vk_bls.json... Done! Smart Contract project created: /home/garaga-flow/my_project/ ├── Scarb.lock ├── Scarb.toml ├── src/ │ ├── groth16_verifier.cairo │ ├── groth16_verifier_constants.cairo │ └── lib.cairo └── target/ └── dev/ ├── groth16_example_bls12_381.starknet_artifacts.json ├── groth16_example_bls12_381_Groth16VerifierBLS12_381.compiled_contract │ _class.json └── groth16_example_bls12_381_Groth16VerifierBLS12_381.contract_class.js on You can now modify the groth16_verifier.cairo file to adapt the verifier to your use case. ``` The curve identifier is automatically detected from the content of your verifying key. ## Build your contract {% hint style="info" %} The generated verifier contract only verifies a proof and returns the public inputs on success. You can extend it to add your dapp logic, or use it as a library call from another contract. {% endhint %} The generated template is as follows. The main endpoint is `verify_groth16_proof_[curve_name]`. The function takes a single `full_proof_with_hints: Span` parameter (generated using the `garaga calldata` command or the SDK) and returns: - `Result::Ok(public_inputs)` if the proof is valid - `Result::Err(error)` if the proof is invalid {% code title="groth16_verifier.cairo" %} ```rust // Generated by Garaga version 1.1.0 use super::groth16_verifier_constants::{N_PUBLIC_INPUTS, ic, precomputed_lines, vk}; #[starknet::interface] pub trait IGroth16VerifierBLS12_381 { fn verify_groth16_proof_bls12_381( self: @TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; } #[starknet::contract] mod Groth16VerifierBLS12_381 { use garaga::definitions::{G1G2Pair, G1Point}; use garaga::ec_ops::{G1PointTrait, ec_safe_add}; use garaga::groth16::{ Groth16ProofRawTrait, multi_pairing_check_bls12_381_3P_2F_with_extra_miller_loop_result, }; use garaga::utils::calldata::deserialize_full_proof_with_hints_bls12_381; use starknet::SyscallResultTrait; use super::{N_PUBLIC_INPUTS, ic, precomputed_lines, vk}; const ECIP_OPS_CLASS_HASH: felt252 = 0x312d1dd5f967eaf6f86965e3fa7acbc9d0fbd979066a17721dd913736af2f5e; #[storage] struct Storage {} #[abi(embed_v0)] impl IGroth16VerifierBLS12_381 of super::IGroth16VerifierBLS12_381 { fn verify_groth16_proof_bls12_381( self: @ContractState, full_proof_with_hints: Span, ) -> Result, felt252> { // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok(public_inputs) if the proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given // a proof and a verifying key. let fph = deserialize_full_proof_with_hints_bls12_381(full_proof_with_hints); let groth16_proof = fph.groth16_proof; let mpcheck_hint = fph.mpcheck_hint; let msm_hint = fph.msm_hint; groth16_proof.raw.check_proof_points(1); let ic = ic.span(); let vk_x: G1Point = match ic.len() { 0 => panic!("Malformed VK"), 1 => *ic.at(0), _ => { // Start serialization with the hint array directly to avoid copying it. let mut msm_calldata: Array = array![]; // Add the points from VK and public inputs to the proof. Serde::serialize(@ic.slice(1, N_PUBLIC_INPUTS), ref msm_calldata); Serde::serialize(@groth16_proof.public_inputs, ref msm_calldata); // Complete with the curve indentifier (1 for BLS12_381): msm_calldata.append(1); // Add the hint array. for x in msm_hint { msm_calldata.append(*x); } // Call the multi scalar multiplication endpoint on the Garaga ECIP ops contract // to obtain vk_x. let mut _vx_x_serialized = starknet::syscalls::library_call_syscall( ECIP_OPS_CLASS_HASH.try_into().unwrap(), selector!("msm_g1"), msm_calldata.span(), ) .unwrap_syscall(); ec_safe_add( Serde::::deserialize(ref _vx_x_serialized).unwrap(), *ic.at(0), 1, ) }, }; // Perform the pairing check. let check = multi_pairing_check_bls12_381_3P_2F_with_extra_miller_loop_result( G1G2Pair { p: vk_x, q: vk.gamma_g2 }, G1G2Pair { p: groth16_proof.raw.c, q: vk.delta_g2 }, G1G2Pair { p: groth16_proof.raw.a.negate(1), q: groth16_proof.raw.b }, vk.alpha_beta_miller_loop_result, precomputed_lines.span(), mpcheck_hint, ); match check { Result::Ok(_) => Result::Ok(groth16_proof.public_inputs), Result::Err(error) => Result::Err(error), } } } } ``` {% endcode %} ## Declare and deploy your contract When you are satisfied with your contract it's time to send it to Starknet! The CLI provides utilities to simplify the process. Otherwise, it is a similar process than for every other contracts, please refer to [Starknet documentation](https://docs.starknet.io/quick-start/declare-a-smart-contract/).\ \ You will to create a file containing the following variables, depending on if you want to declare & deploy on Starknet Sepolia or Starknet Mainnet. \ Create the following file and update its content. {% code title=".secrets" %} ``` SEPOLIA_RPC_URL="https://free-rpc.nethermind.io/sepolia-juno" SEPOLIA_ACCOUNT_PRIVATE_KEY=0x1 SEPOLIA_ACCOUNT_ADDRESS=0x2 MAINNET_RPC_URL="https://" MAINNET_ACCOUNT_PRIVATE_KEY=0x3 MAINNET_ACCOUNT_ADDRESS=0x4 ``` {% endcode %} Then, you can run the command `garaga declare`, which will build the contract and declare it to Starknet. If the class hash is already deployed, it will return it as well. Declaring the contract involves sending all its bytecode and it is quite an expensive operation. Make sure you dapp is properly tested before! ```bash Usage: garaga declare [OPTIONS] Declare your smart contract to Starknet. Obtain its class hash and a explorer link. ╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ --project-path DIRECTORY Path to the Cairo project holding the Scarb.toml file to declare │ │ [default: /home/felt/garaga-flow/my_project/] │ │ --env-file FILE Path to the environment file │ │ [default: /home/felt/garaga-flow/my_project/.secrets] │ │ --network [sepolia|mainnet] Starknet network [default: sepolia] │ │ --fee TEXT Fee token type [eth, strk] [default: eth] │ │ --help -h Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` ```bash garaga declare --project-path my_project/ --env-file .secrets --network sepolia --fee strk ``` This command will return the class hash, used in the next step.\ \ Finally, to deploy the contract, a use `garaga deploy` : ```bash Usage: garaga deploy [OPTIONS] Deploy an instance of a smart contract class hash to Starknet. Obtain its address, the available endpoints and a explorer link. ╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ * --class-hash TEXT Contract class hash to deploy. Can be decimal or hex string [default: None] [required] │ │ --env-file FILE Path to the environment file containing rpc, address, private_key │ │ [default: /home/felt/garaga-flow/my_project/.secrets] │ │ --network [sepolia|mainnet] Starknet network [default: sepolia] │ │ --fee TEXT Fee token type [eth, strk] [default: strk] │ │ --help -h Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` The contract address will be prompted. Be sure to save it! \ ================================================ FILE: docs/gitbook/smart-contract-generators/groth16/generating-calldata-from-a-proof-and-using-your-deployed-contract/README.md ================================================ --- icon: microchip --- # Generating calldata from a proof and using your deployed contract {% hint style="warning" %} **Version Compatibility:** Use the same Garaga SDK version (pip/npm/Rust) that generated your verifier contract. Mismatched versions produce incompatible calldata and cause verification to fail. {% endhint %} Once your groth16 contract is deployed and you have its address, you will need to call its main endpoint `verify_groth16_proof_bn254`, or `verify_groth16_proof_bls12_381`. \ \ The Groth16 proof needs pre-processing and extra computation to allow efficient verification. \ \ The Garaga CLI takes care of converting your proof to the correct calldata and calling your contract.\ To do this, use the garaga `verify-onchain` command. ```bash Usage: garaga verify-onchain [OPTIONS] Invoke a SNARK verifier on Starknet given a contract address, a proof and a verification key. ╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ * --system [groth16] Proof system [default: None] [required] │ │ * --contract-address TEXT Starknet contract address [default: None] [required] │ │ * --vk FILE Path to the verification key JSON file [default: None] [required] │ │ * --proof FILE Path to the proof JSON file [default: None] [required] │ │ --public-inputs FILE Path to the public inputs JSON file [default: None] │ │ --endpoint TEXT Smart contract function name. If not provided, the default │ │ 'verify_[proof_system]_proof_[curve_name]' will be used. │ │ --env-file FILE Path to the environment file containing rpc, address, private_key │ │ [default: /home/felt/PycharmProjects/garaga-flow/my_project/target/.secrets] │ │ --network [sepolia|mainnet] Starknet network [default: sepolia] │ │ --help -h Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` As for the verifying key, both Snarkjs and Gnark `proof.json` and `public.json` are supported out of the box. See the example in the [generate-and-deploy-your-verifier-contract.md](../generate-and-deploy-your-verifier-contract.md "mention") for Gnark export. Alternatively, the `--public-inputs` parameter can be omitted if your proof include everything at once, as below.
{
    "eliptic_curve_id": "bn254",
    "proof": {
        "a": {
            "x": "0x2abaae3dd6e4c662f5e071bca525a26d21e2400d01d02c87bce2e8363285990a",
            "y": "0x24211ff0aa742a6dd1651aadce6f72757beb89de2cff83a6162de7c15674c2"
        },
        "b": {
            "x": [
                "0x2335f1564c154d7a2ec5d11faf6d991a205bef2858f1687976d0a46502f5224a",
                "0x223af0bb0912d8ebc535ed489d06cd01fcf4a8ab4596cc28164edf9041d97080"
            ],
            "y": [
                "0x182e8fd86a44983de1d1d9dc4f12f134535b75d39f7aeb21adbf57e1a32ee603",
                "0xecb11668a0dd5d5031b0837e62ba14222b45718dc101c1278f44a9ed823c16b"
            ]
        },
        "c": {
            "x": "0x290243624a4c11868e7cb0c0f7cfd690dac08e4205d19795b0a8f686dddcdfd6",
            "y": "0x15de00cc8af159fbdbdc802592e83e1ac61a8026b97e8889b8c5def59ec50b16"
        }
    },
    "public_inputs": [
        "0x1e17db88c1d2e83e49f692cce4bb8169309de90afb2b141156243106aa34b474"
    ]
}
The command should look like this: {% code overflow="wrap" %} ``` garaga verify-onchain --system groth16 --contract-address 0x1234... --vk vk.json --proof proof.json --public-inputs public.json --env-file .secrets --network sepolia ``` {% endcode %} If everything is good, the command will output the transaction hash along with an explorer link. \ Congrats! ================================================ FILE: docs/gitbook/smart-contract-generators/groth16/generating-calldata-from-a-proof-and-using-your-deployed-contract/using-python-garaga-cli.md ================================================ # Using Python/Garaga CLI Using the `garaga calldata` command from the CLI, you can generate the calldata needed to verify a proof for the `verify_groth16_proof_[curve_name]`. First, ensure that: * Your circuit is compiled and the verification key `verification_key.json` is created * The public input file `public.json` and the associated proof `proof.json` are created The call the following command by replacing the parameters with your data: ```bash garaga calldata --system groth16 --vk verification_key.json --proof proof.json --public-inputs public.json 2789 41983001825546257095993508953 3045291465937026073442547681 1840582864647114302 0 69020349870260156176548317333 16784567729677911275297018120 1865382613176499468 0 51545988015561248414407597558 44248521764831362261757723052 8850086 ... ``` ## `starkli` usage Using the command option `--format starkli`,\ you can directly pipe the generated calldata to `starkli` to invoke a transaction on your deployed contract. The proof must be the last parameter of your contract's method. ```bash garaga calldata --system groth16 --vk verification_key.json --proof proof.json --public-inputs public.json --format starkli | xargs starkli invoke --keystore-password $KEYSTORE_PASSWORD --watch $YOUR_CONTRACT your_verify_method YOUR_PARAMETERS ``` ## Cairo code usage Use the command option `--format array` to generate calldata in array format to be used in your smart-contract tests. ```bash garaga calldata --system groth16 --vk verification_key.json --proof proof.json --public-inputs public.json --format array [2789, 41983001825546257095993508953, 3045291465937026073442547681, 1840582864647114302, 0, 69020349870260156176548317333, 16784567729677911275297018120, 1865382613176499468, 0, 51545988015561248414407597558, 44248521764831362261757723052, 88500861247646845, 0, ... ] ``` ================================================ FILE: docs/gitbook/smart-contract-generators/groth16/generating-calldata-from-a-proof-and-using-your-deployed-contract/using-rust.md ================================================ # Using Rust Add the [rust-crate.md](../../../installation/rust-crate.md "mention") to your project. ```rust // Version must match the pip package that generated the verifier use garaga_rs::calldata::full_proof_with_hints::groth16::{ get_groth16_calldata, Groth16Proof, Groth16VerifyingKey, }; use garaga_rs::definitions::CurveID; use std::fs; fn main() -> Result<(), String> { // 1. Load and parse verification key from JSON let vk_json = fs::read_to_string("verification_key.json").map_err(|e| e.to_string())?; let vk = Groth16VerifyingKey::from_json(&vk_json)?; // 2. Load and parse proof from JSON let proof_json = fs::read_to_string("proof.json").map_err(|e| e.to_string())?; let public_inputs_json = fs::read_to_string("public.json").map_err(|e| e.to_string())?; let proof = Groth16Proof::from_json(&proof_json, &public_inputs_json)?; // 3. Generate calldata (curve is auto-detected from vk) let calldata = get_groth16_calldata(&proof, &vk, CurveID::BN254)?; println!("Calldata length: {}", calldata.len()); // The calldata can now be used to call your deployed verifier contract Ok(()) } ``` {% hint style="info" %} The `CurveID` should match your verifying key's curve: `CurveID::BN254` or `CurveID::BLS12_381`. {% endhint %} ## Alternative: Using JSON files directly If your proof and public inputs are in separate Snarkjs-style JSON files: ```rust use garaga_rs::calldata::full_proof_with_hints::groth16::{ get_groth16_calldata, Groth16Proof, Groth16VerifyingKey, }; use garaga_rs::definitions::CurveID; // Parse verification key let vk = Groth16VerifyingKey::from_json(&vk_json_string)?; // Parse proof with separate public inputs let proof = Groth16Proof::from_json(&proof_json_string, &public_inputs_json_string)?; // Generate calldata let calldata = get_groth16_calldata(&proof, &vk, CurveID::BN254)?; ``` See the [Rust crate documentation](https://github.com/keep-starknet-strange/garaga/tree/main/tools/garaga_rs) for more details. ================================================ FILE: docs/gitbook/smart-contract-generators/groth16/generating-calldata-from-a-proof-and-using-your-deployed-contract/using-typescript.md ================================================ # Using Typescript Using the `garaga` [npm-package.md](../../../installation/npm-package.md "mention") ## Node.js (with file reading) ```typescript import * as garaga from 'garaga'; import { CurveId } from 'garaga'; import { readFileSync } from 'fs'; await garaga.init(); // Parse from file paths (Node.js only) const vk = garaga.parseGroth16VerifyingKeyFromJson('verification_key.json'); const proof = garaga.parseGroth16ProofFromJson('proof.json', 'public.json'); const calldata = garaga.getGroth16CallData(proof, vk, CurveId.BN254); ``` ## From JSON objects (Node.js and Browser) ```typescript import * as garaga from 'garaga'; import { CurveId } from 'garaga'; await garaga.init(); // Parse from already-loaded JSON objects const vkJson = { /* verification key JSON */ }; const proofJson = { /* proof JSON */ }; const publicInputs = [/* public inputs as bigint[] */]; const vk = garaga.parseGroth16VerifyingKeyFromObject(vkJson); const proof = garaga.parseGroth16ProofFromObject(proofJson, publicInputs); const calldata = garaga.getGroth16CallData(proof, vk, CurveId.BN254); ``` {% hint style="info" %} The `CurveId` should match your verifying key's curve: `CurveId.BN254` or `CurveId.BLS12_381`. {% endhint %} ## Browser Usage Use `parseGroth16*FromObject` functions in the browser (no filesystem access): ```typescript import * as garaga from 'garaga'; import { CurveId } from 'garaga'; async function generateCalldata(vkJson: object, proofJson: object, publicInputs?: bigint[]) { await garaga.init(); const vk = garaga.parseGroth16VerifyingKeyFromObject(vkJson); const proof = garaga.parseGroth16ProofFromObject(proofJson, publicInputs); return garaga.getGroth16CallData(proof, vk, CurveId.BN254); } ``` ================================================ FILE: docs/gitbook/smart-contract-generators/noir.md ================================================ --- icon: octopus --- # Noir ## Requirements (read carefully to avoid 99% of issues!) * Garaga CLI [python-package.md](../installation/python-package.md "mention") version 1.1.0 (install with `pip install garaga==1.1.0`) * Noir 1.0.0-beta.16 (install with `noirup --version 1.0.0-beta.16` or `npm i @noir-lang/noir_js@1.0.0-beta.16`) * Barretenberg 3.0.0-nightly.20251104 (install with `bbup --version 3.0.0-nightly.20251104` or `npm i @aztec/bb.js@3.0.0-nightly.20251104`) To install `noirup` and `bbup`, follow the [quickstart guide from aztec](https://noir-lang.org/docs/getting_started/quick_start). ## Generate a Starknet smart contract for your Noir program First, create a new Noir project and compile it with `nargo build`. ```bash nargo new hello cd hello nargo build ``` This will create a json file in `hello/target/hello.json` Now, generate the corresponding verifying key `vk` using barretenberg: ```bash bb write_vk -s ultra_honk --oracle_hash keccak -b target/hello.json -o target/vk ``` {% hint style="info" %} Note: ZK mode is enabled by default in barretenberg. The verification key is the same whether you generate a ZK proof or not. {% endhint %} Finally, generate a smart contract from the verifying key using the garaga CLI. ```bash garaga gen --system ultra_keccak_zk_honk --vk target/vk ``` This will create a smart contract folder with the following structure. ``` Generating Smart Contract project for ProofSystem.UltraKeccakZKHonk using vk... Done! Smart Contract project created: /noir/hello/my_project/ ├── .tools-versions ├── Scarb.toml └── src/ ├── honk_verifier.cairo ├── honk_verifier_circuits.cairo ├── honk_verifier_constants.cairo └── lib.cairo ``` The main function of interest is located in `honk_verifier.cairo` The contract interface will be ```rust #[starknet::interface] pub trait IUltraKeccakZKHonkVerifier { fn verify_ultra_keccak_zk_honk_proof( self: @TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; // Returns Ok(public_inputs) on success, Err on failure. } ``` In order to interact with the endpoint, we need to generate the `full_proof_with_hints` array. To do so, we need a specific proof for your program. But first, Noir requires to specify the inputs of the program in `hello/Prover.toml` ```toml // The "hello" program simply proves that x!=y, with x being private and y public. x = "1" y = "2" ``` Now, generate a proof with barretenberg: ```bash nargo execute witness bb prove -s ultra_honk --oracle_hash keccak -b target/hello.json -w target/witness.gz -o target/ ``` This creates two files in the `target/` directory: - `target/proof` - the ZK proof - `target/public_inputs` - the public inputs {% hint style="info" %} ZK mode is enabled by default. Use `--disable_zk` flag if you want to generate a non-ZK proof (not recommended for production). {% endhint %} ## Generating the calldata (`full_proof_with_hints` array) {% hint style="warning" %} **Version Compatibility:** Use the same Garaga SDK version (pip/npm/Rust) that generated your verifier contract. Mismatched versions produce incompatible calldata and cause verification to fail. {% endhint %} {% tabs %} {% tab title="CLI" %} Finalizing the above CLI example, you can obtain the `full_proof_with_hints` array using the garaga CLI. From within the "hello" directory: ```bash garaga calldata --system ultra_keccak_zk_honk --proof target/proof --vk target/vk --public-inputs target/public_inputs ``` {% hint style="info" %} Using `garaga calldata` with the `--format array` lets you paste this array in cairo code for unit tests by doing `let proof: Array = [...];`. The `--format starkli` has a formatting which is composable with starkli in the command line and also prepends the length of the array so that it can be deserialized by starknet. The `--format snforge` (default) creates a file that can be used with snforge. {% endhint %} {% endtab %} {% tab title="Rust" %} Add the [rust-crate.md](../installation/rust-crate.md "mention") to your project. ```rust // Version must match the pip package that generated the verifier use garaga_rs::calldata::full_proof_with_hints::zk_honk::{ get_zk_honk_calldata, HonkVerificationKey, ZKHonkProof, }; use std::fs; fn main() -> Result<(), String> { // 1. Load your verification key let vk_bytes = fs::read("target/vk").map_err(|e| e.to_string())?; let vk = HonkVerificationKey::from_bytes(&vk_bytes)?; // 2. Load the proof file let proof_bytes = fs::read("target/proof").map_err(|e| e.to_string())?; // 3. Load public inputs file let pub_inputs_bytes = fs::read("target/public_inputs").map_err(|e| e.to_string())?; // 4. Parse the proof (requires log_circuit_size from vk) let proof = ZKHonkProof::from_bytes(&proof_bytes, &pub_inputs_bytes, vk.log_circuit_size)?; // 5. Generate calldata let calldata = get_zk_honk_calldata(&proof, &vk)?; println!("Calldata length: {}", calldata.len()); Ok(()) } ``` {% endtab %} {% tab title="Typescript" %} Using the `garaga` [npm-package.md](../installation/npm-package.md "mention") ```typescript // Version must match the pip package that generated the verifier import * as garaga from 'garaga'; import { readFileSync } from 'fs'; // 1. Initialize the WASM module (required before using any garaga functions) await garaga.init(); // 2. Load your proof, public inputs, and verification key as Uint8Array const vk = new Uint8Array(readFileSync('target/vk')); const proof = new Uint8Array(readFileSync('target/proof')); const publicInputs = new Uint8Array(readFileSync('target/public_inputs')); // 3. Generate calldata for ZK Honk proofs const calldata: bigint[] = garaga.getZKHonkCallData(proof, publicInputs, vk); console.log('Calldata length:', calldata.length); ``` {% endtab %} {% tab title="Python" %} Using the `garaga` [python-package.md](../installation/python-package.md "mention") ```python # Version must match the pip package that generated the verifier from garaga.precompiled_circuits.zk_honk import HonkVk, ZKHonkProof from garaga.starknet.honk_contract_generator.calldata import ( get_ultra_flavor_honk_calldata_from_vk_and_proof ) # 1. Load your verification key vk = HonkVk.from_bytes(open('target/vk', 'rb').read()) # 2. Load proof and public inputs proof_bytes = open('target/proof', 'rb').read() public_inputs_bytes = open('target/public_inputs', 'rb').read() # 3. Parse the proof proof = ZKHonkProof.from_bytes(proof_bytes, public_inputs_bytes, vk) # 4. Generate calldata calldata: list[int] = get_ultra_flavor_honk_calldata_from_vk_and_proof(vk=vk, proof=proof) print(f'Calldata length: {len(calldata)}') ``` {% endtab %} {% endtabs %} ## BB CLI Reference {% hint style="info" %} Use `bb write_vk --help` and `bb prove --help` to see all available options. {% endhint %} **Verification Key Generation:** ```bash bb write_vk -s ultra_honk --oracle_hash keccak -b target/hello.json -o target/vk ``` **Proof Generation (ZK mode is default):** ```bash bb prove -s ultra_honk --oracle_hash keccak -b target/hello.json -w target/witness.gz -o target/ ``` **Proof Verification (optional, for local testing):** ```bash bb verify -s ultra_honk --oracle_hash keccak -p target/proof -k target/vk -i target/public_inputs ``` ## Complete dApp Tutorial Follow the [Scaffold‑Garaga repository](https://github.com/m-kus/scaffold-garaga). This starter kit combines **Noir**, **Garaga**, and **Starknet** with in‑browser proving to help you ship a privacy‑preserving dApp fast. #### What you'll learn 1. **Generate & deploy an UltraHonk proof verifier** to a local Starknet devnet. 2. **Add on‑chain state** to your privacy‑preserving app. 3. **Connect a wallet and deploy to a public testnet**. --- Need [support.md](../support.md "mention") ? ================================================ FILE: docs/gitbook/support.md ================================================ --- icon: message-question --- # Support * Is something unclear ? * Spotted a bug ? * Need help on a specific subject or additional documentation ? Feel free to ask questions on the Garaga telegram [group](https://t.me/GaragaStarknet), or [raise an issue](https://github.com/keep-starknet-strange/garaga/issues/new/choose) on the github repository, it will help us making this documentation better and enhancing Garaga! ================================================ FILE: docs/gitbook/updating-these-docs.md ================================================ --- icon: file-doc --- # Updating these docs ### Overview Gitbook website is synced with the `docs` branch. Documentation updates are handled through an automated bidirectional sync between the `main` and `docs` branches: * **GitBook edits** → `docs` branch → automated PR to `main` * **Code changes** → `main` branch → automated sync to `docs` branch ### Making Documentation Changes #### For Contributors: PR to Main (Recommended) 1. Create a branch from `main` 2. Edit files in `docs/gitbook/` folder 3. PR directly to `main` branch 4. Changes will automatically sync to `docs` branch after merge and reflected on the website. #### For Maintainers: GitBook Interface Repo maintainers and selected contributors can edit directly in GitBook - changes automatically sync to the `docs` branch and create a PR to `main`. ### Automated Workflow * **Documentation-only changes**: Auto-labeled and ready for review * **Mixed changes** (docs + code): Flagged for manual review with `needs-review` label * **Code changes on main**: Non-docs files automatically sync to `docs` branch * All PRs use squash & merge to maintain clean history The GitBook website updates automatically when changes reach the `docs` branch. ================================================ FILE: docs/gitbook/using-garaga-libraries-in-your-cairo-project/README.md ================================================ --- icon: arrow-down-to-bracket --- # Using Garaga Libraries in Your Cairo Project Garaga provides a powerful Cairo library for elliptic curve operations, signature verification, and cryptographic primitives. The library is designed to work **uniformly across all supported curves**—the same functions, the same patterns, just change the curve identifier. ## Installation Garaga is available on the [scarbs.xyz registry](https://scarbs.xyz/packages/garaga). Add it to your project using `scarb add`: ```bash scarb add garaga ``` Or add it manually to your `Scarb.toml`: {% code title="Scarb.toml" %} ```toml [dependencies] garaga = "1.1.0" [cairo] sierra-replace-ids = false # Required to avoid compilation errors ``` {% endcode %} {% hint style="info" %} Using the registry is the recommended approach. For more details on managing dependencies, see the [Scarb documentation](https://docs.swmansion.com/scarb/docs/guides/dependencies.html). {% endhint %} {% hint style="warning" %} **Important**: The `sierra-replace-ids = false` setting is required. See [issue #198](https://github.com/keep-starknet-strange/garaga/issues/198) for details about using Garaga with workspaces. {% endhint %} ### Installing from Git (alternative) If you need a specific commit or unreleased version, you can install from Git: ```toml [dependencies] garaga = { git = "https://github.com/keep-starknet-strange/garaga.git", tag = "v1.1.0" } ``` --- ## Generic Over Any Curve One of Garaga's key architectural decisions is that **all operations work uniformly across any supported curve**. This means: - ✅ The same `msm_g1` function works for BN254, BLS12-381, SECP256K1, and more - ✅ The same signature verification patterns apply to all curves - ✅ Switching curves requires only changing the `curve_id` parameter - ✅ Future curves can be added without changing your code ### Example: Curve-Agnostic MSM ```cairo use garaga::ec_ops::msm_g1; use garaga::definitions::{G1Point, u384}; // This exact same function works for ANY supported curve fn compute_msm( points: Span, scalars: Span, curve_id: usize, // Just change this to switch curves! hints: Span, ) -> G1Point { msm_g1(points, scalars, hints, curve_id) } // Usage: // compute_msm(points, scalars, 0, hints) // BN254 // compute_msm(points, scalars, 2, hints) // SECP256K1 // compute_msm(points, scalars, 3, hints) // SECP256R1 ``` This design enables maximum code reuse and flexibility across your applications. --- ## Supported Elliptic Curves | Curve ID | Curve | Common Use Cases | |----------|-------|------------------| | **0** | BN254 | Ethereum zkSNARKs, Groth16 | | **1** | BLS12-381 | Ethereum 2.0, Zcash, drand | | **2** | SECP256K1 | Bitcoin, Ethereum ECDSA | | **3** | SECP256R1 | WebAuthn, TLS, P-256 | | **4** | ED25519 | Solana, SSH, general EdDSA | | **5** | GRUMPKIN | Noir circuits, Aztec | {% hint style="info" %} These curve identifiers are consistent across **all** Garaga code—Cairo, Python, Rust, and TypeScript. Use the same ID everywhere. {% endhint %} --- ## Available Operations ### Elliptic Curve Operations | Operation | Description | Curves | |-----------|-------------|--------| | **Multi-Scalar Multiplication (MSM)** | Compute `∑ sᵢ·Pᵢ` efficiently | All | | **Scalar Multiplication** | Compute `s·P` for a single point | All | | **Point Addition** | Add two elliptic curve points | All | | **Pairing Check** | Verify pairing equations | BN254, BLS12-381 | [→ EC Operations Documentation](ec-multi-scalar-multiplication.md) ### Signature Verification | Scheme | Description | Curves | |--------|-------------|--------| | **ECDSA** | Standard elliptic curve signatures | SECP256K1, SECP256R1, BN254, BLS12-381 | | **Schnorr** | BIP340-compatible Schnorr signatures | All Weierstrass curves | | **EdDSA** | Edwards-curve signatures | ED25519 | [→ Signatures Documentation](ec-signatures.md) ### Hashing Functions | Function | Description | Use Case | |----------|-------------|----------| | **SHA-512** | Standard SHA-512 | EdDSA, general hashing | | **Poseidon (BN254)** | ZK-friendly hash | Grumpkin circuits | [→ Hashing Documentation](hashing-functions.md) --- ## Performance Characteristics Garaga achieves efficiency through **precomputed hints**. The SDK (Python/Rust/TypeScript) generates these hints off-chain, and the Cairo code verifies them on-chain. This means: 1. **Off-chain**: Complex computations happen in the SDK 2. **On-chain**: Cairo only verifies the results are correct ``` ┌─────────────────────────────────────────────────────────────┐ │ Off-chain (SDK) │ │ - Compute MSM/signature verification │ │ - Generate verification hints │ │ - Serialize as calldata │ └───────────────────────────┬─────────────────────────────────┘ │ calldata with hints ▼ ┌─────────────────────────────────────────────────────────────┐ │ On-chain (Cairo) │ │ - Deserialize calldata │ │ - Verify hints are correct │ │ - Return result (success/failure) │ └─────────────────────────────────────────────────────────────┘ ``` This architecture enables operations that would otherwise be prohibitively expensive on-chain. --- ## Next Steps - [**EC Multi-Scalar Multiplication**](ec-multi-scalar-multiplication.md) — Compute MSMs on any curve - [**Signature Verification**](ec-signatures.md) — ECDSA, Schnorr, and EdDSA - [**Hashing Functions**](hashing-functions.md) — SHA-512 and Poseidon ================================================ FILE: docs/gitbook/using-garaga-libraries-in-your-cairo-project/ec-multi-scalar-multiplication.md ================================================ --- hidden: true icon: florin-sign --- # EC (Multi)-Scalar Multiplication For a given elliptic curve, scalar multiplication consists of adding a point `P` to itself `s` times, where `P` is a point satisfying the curve equation and `s` a scalar.\ \ `k.P = P+P+P+...+P (k times)`\ \ \ Multi scalar multiplication consists of the sum of `n` scalar multiplication with different points and scalars : $$ \sum_{i=1}^{n} k_i \times P_i $$ A single `msm_g1` function in Garaga computes the multi-scalar multiplication for a given set of points and scalars for a given elliptic curve. Since it also works with `n=1`, it is also able to compute a single scalar multiplication. ```toml [package] name = "my_package_that_needs_ec_scalar_mul" version = "0.1.0" edition = "2024_07" [dependencies] garaga = "1.1.0" [cairo] sierra-replace-ids = false ``` {% hint style="info" %} You can also add the dependency using `scarb add garaga`. See the [installation guide](README.md#installation) for more options. {% endhint %} The function will be importable using ```rust use garaga::ec_ops::msm_g1; use garaga::definitions::G1Point; ``` ```rust fn msm_g1( points: Span, scalars: Span, curve_index: usize, msm_hint: Span, ) -> G1Point { ``` As you can see, this function not only needs points and scalars, but also additional information, to perform the computation much more efficiently.\ \ Under `hydra/garaga/starknet/tests_and_calldata_generators/`, you will find in the file [`msm.py`](https://github.com/keep-starknet-strange/garaga/blob/main/hydra/garaga/starknet/tests_and_calldata_generators/msm.py) some tools to generate a cairo test (using `MSMCalldataBuilder.to_cairo_1_test()`) for this function given some points and scalars, or directly the raw calldata for starknet usage (using `MSMCalldataBuilder.serialize_to_calldata()`). ### Generating and using calldata \ An example contract is already [deployed](https://sepolia.voyager.online/contract/0x012686bdb4ca3f22ffc93dfe1e24d72294aac38a4f6b997b456fb4368fb3390b#readContract) on sepolia, solely holding an endpoint to this function.\ The source code to the contract is [here](https://github.com/keep-starknet-strange/garaga/blob/main/src/contracts/universal_ecip/src/lib.cairo) .\ \ You can try this deployed contract on any supported curves modifying the [`msm.py`](https://github.com/keep-starknet-strange/garaga/blob/main/hydra/garaga/starknet/tests_and_calldata_generators/msm.py) script at the end : ```python if __name__ == "__main__": import random c = CurveID.SECP256K1 order = CURVES[c.value].n msm = MSMCalldataBuilder( curve_id=c, points=[G1Point.gen_random_point(c) for _ in range(1)], scalars=[random.randint(0, order) for _ in range(1)], ) cd = msm.serialize_to_calldata( include_points_and_scalars=True, serialize_as_pure_felt252_array=False, ) print(cd) print(len(cd)) ``` The options are : * `include_points_and_scalars` : If set to `False`, the input points, scalars, and `curve_index` will not be part of the calldata. * `serialize_as_pure_felt252_array` : If set to `True`, preprend the total length of the calldata at the beginning. \\ These options are only useful when you want to use points and scalars from another source than the calldata.\ \ For example, checkout the [groth16 verifier contracts](https://github.com/keep-starknet-strange/garaga/blob/main/src/contracts/autogenerated/groth16_example_bn254/src/groth16_verifier.cairo). It makes a delegated call to the endpoint `msm_g1` using the already declared contract's class hash, and pushes the (fixed) points from the hardcoded verifying key, and the scalars from the groth16 proof. : ```rust impl IGroth16VerifierBN254 of super::IGroth16VerifierBN254 { fn verify_groth16_proof_bn254( ref self: ContractState, groth16_proof: Groth16Proof, mpcheck_hint: MPCheckHintBN254, msm_hint: Array, ) -> bool { groth16_proof.a.assert_on_curve(0); groth16_proof.b.assert_on_curve(0); groth16_proof.c.assert_on_curve(0); let ic = ic.span(); let vk_x: G1Point = match ic.len() { 0 => panic!("Malformed VK"), 1 => *ic.at(0), _ => { // Start serialization with the hint array directly to avoid copying it. let mut msm_calldata: Array = msm_hint; // Add the points from VK and public inputs to the proof. Serde::serialize(@ic.slice(1, N_PUBLIC_INPUTS), ref msm_calldata); Serde::serialize(@groth16_proof.public_inputs, ref msm_calldata); // Complete with the curve indentifier (0 for BN254): msm_calldata.append(0); // Call the multi scalar multiplication endpoint on the Garaga ECIP ops contract // to obtain vk_x. let mut _vx_x_serialized = core::starknet::syscalls::library_call_syscall( ECIP_OPS_CLASS_HASH.try_into().unwrap(), selector!("msm_g1"), msm_calldata.span() ) .unwrap_syscall(); ec_safe_add( Serde::::deserialize(ref _vx_x_serialized).unwrap(), *ic.at(0), 0 ) } }; ``` Here the `msm_hint` is used with `include_points_and_scalars=False` and `serialize_as_pure_felt252_array=True`\ \ Then the points from `ic` are pushed to the array, and the scalars from the groth16 proof's public inputs. Finally the curve identifier is pushed as well.\ \ In our example, we'll leave the default parameters that will include everything for a direct endpoint call.\ Simply run : ``` python hydra/garaga/starknet/tests_and_calldata_generators/msm.py ``` And copy paste the array in voyager to see!
================================================ FILE: docs/gitbook/using-garaga-libraries-in-your-cairo-project/ec-signatures.md ================================================ --- icon: pen-field --- # ECDSA, Schnorr & EdDSA Signatures All three signature schemes follow a similar pattern with a Cairo struct containing the signature data and hints for efficient verification. Garaga provides tooling in Python/Rust/JavaScript to generate the full expected Cairo struct given signature information. All signature verification schemes work with all [#supported-elliptic-curves](./#supported-elliptic-curves "mention") in Garaga (except EdDSA which is specific to Ed25519), using the corresponding curve identifier. ## Cairo Verification Functions Verification functions take the public key as a **separate parameter**: - `is_valid_ecdsa_signature_assuming_hash(signature, public_key, curve_id) -> bool` - `is_valid_schnorr_signature_assuming_hash(signature, public_key, curve_id) -> bool` - `is_valid_eddsa_signature(signature, Py_twisted) -> bool` {% hint style="warning" %} **Important:** The ECDSA and Schnorr verification functions assume that the message hash has been correctly computed by the caller. They verify the signature equation but do not hash the message themselves. {% endhint %} ## Public Key Handling The public key is always passed as a **separate parameter** to the verification function. This allows you to: 1. **Hardcode the public key** in your contract if it's known at compile time 2. **Provide the public key dynamically** at runtime When generating calldata with the SDK, use the `prepend_public_key` parameter: - `prepend_public_key=True` (default): The public key is included in the serialized calldata, allowing you to deserialize both the signature and public key from the same array - `prepend_public_key=False`: Only the signature is serialized; you must provide the public key separately (useful when the public key is hardcoded in your contract) --- ## ECDSA Signature Verification ### Cairo Structs ```rust use garaga::signatures::ecdsa::{ECDSASignature, ECDSASignatureWithHint, is_valid_ecdsa_signature_assuming_hash}; use garaga::definitions::{G1Point, u384}; /// Core signature data struct ECDSASignature { rx: u384, // r component (R.x mod n) s: u256, // s component v: bool, // Parity of R.y (false if even, true if odd) z: u256, // Message hash (assumed correctly computed by caller) } /// Signature bundled with verification hints struct ECDSASignatureWithHint { signature: ECDSASignature, msm_hint: Span, } ``` ### Usage Example ```rust use garaga::signatures::ecdsa::{ECDSASignatureWithHint, is_valid_ecdsa_signature_assuming_hash}; use garaga::definitions::{G1Point, u384}; fn verify_ecdsa_signature( serialized_signature: Span, public_key: G1Point, curve_id: usize, ) -> bool { // Deserialize the signature with hints let mut data = serialized_signature; let signature_with_hints = Serde::::deserialize(ref data).unwrap(); // Verify the signature // curve_id: 0=BN254, 1=BLS12_381, 2=SECP256K1, 3=SECP256R1, 5=GRUMPKIN is_valid_ecdsa_signature_assuming_hash(signature_with_hints, public_key, curve_id) } ``` ### Calldata Generation {% tabs %} {% tab title="Python" %} ```python from garaga.starknet.tests_and_calldata_generators.signatures import ECDSASignature from garaga.definitions import CurveID # Create signature object with all required fields sig = ECDSASignature( r=0x..., # r component of signature s=0x..., # s component of signature v=0, # 0 if R.y is even, 1 if odd px=0x..., # Public key x-coordinate py=0x..., # Public key y-coordinate z=0x..., # Message hash curve_id=CurveID.SECP256K1 ) # Generate calldata with public key included (for dynamic public key) calldata = sig.serialize_with_hints(prepend_public_key=True) # Generate calldata without public key (for hardcoded public key in contract) calldata_no_pk = sig.serialize_with_hints(prepend_public_key=False) ``` {% endtab %} {% tab title="Rust" %} ```rust use garaga_rs::calldata::signatures::ecdsa_calldata_builder; use garaga_rs::definitions::CurveID; // Generate calldata with public key included let calldata = ecdsa_calldata_builder( r, // r component s, // s component v, // recovery parameter (0 or 1) px, // public key x py, // public key y z, // message hash true, // prepend_public_key CurveID::SECP256K1 as usize, )?; // Generate calldata without public key (for hardcoded public key) let calldata_no_pk = ecdsa_calldata_builder(r, s, v, px, py, z, false, CurveID::SECP256K1 as usize)?; ``` {% endtab %} {% tab title="TypeScript" %} ```typescript import { ecdsaCalldataBuilder, CurveId } from 'garaga'; // Generate calldata with public key included const calldata = ecdsaCalldataBuilder( r, // r component (bigint) s, // s component (bigint) v, // recovery parameter (0 or 1) px, // public key x (bigint) py, // public key y (bigint) z, // message hash (bigint) true, // prependPublickey CurveId.SECP256K1 ); // Generate calldata without public key (for hardcoded public key) const calldataNoKey = ecdsaCalldataBuilder(r, s, v, px, py, z, false, CurveId.SECP256K1); ``` {% endtab %} {% endtabs %} --- ## Schnorr Signature Verification ### Cairo Structs ```rust use garaga::signatures::schnorr::{SchnorrSignature, SchnorrSignatureWithHint, is_valid_schnorr_signature_assuming_hash}; use garaga::definitions::{G1Point, u384}; /// Core signature data struct SchnorrSignature { rx: u384, // x-coordinate of R point s: u256, // s component e: u256, // Challenge hash (assumed correctly computed by caller) } /// Signature bundled with verification hints struct SchnorrSignatureWithHint { signature: SchnorrSignature, msm_hint: Span, } ``` {% hint style="info" %} **BIP340 Requirement:** The public key's y-coordinate must be even. The verification function will return `false` if the public key has an odd y-coordinate. {% endhint %} ### Usage Example ```rust use garaga::signatures::schnorr::{SchnorrSignatureWithHint, is_valid_schnorr_signature_assuming_hash}; use garaga::definitions::{G1Point, u384}; fn verify_schnorr_signature( serialized_signature: Span, public_key: G1Point, curve_id: usize, ) -> bool { // Deserialize the signature with hints let mut data = serialized_signature; let signature_with_hints = Serde::::deserialize(ref data).unwrap(); // Verify the signature // Note: public_key.y must be even (BIP340 requirement) is_valid_schnorr_signature_assuming_hash(signature_with_hints, public_key, curve_id) } ``` ### Calldata Generation {% tabs %} {% tab title="Python" %} ```python from garaga.starknet.tests_and_calldata_generators.signatures import SchnorrSignature from garaga.definitions import CurveID # Create signature object (py must be even) sig = SchnorrSignature( rx=0x..., # x-coordinate of R point s=0x..., # s component e=0x..., # Challenge hash px=0x..., # Public key x-coordinate py=0x..., # Public key y-coordinate (must be even!) curve_id=CurveID.BN254 ) # Generate calldata with public key included calldata = sig.serialize_with_hints(prepend_public_key=True) # Generate calldata without public key (for hardcoded public key) calldata_no_pk = sig.serialize_with_hints(prepend_public_key=False) ``` {% endtab %} {% tab title="Rust" %} ```rust use garaga_rs::calldata::signatures::schnorr_calldata_builder; use garaga_rs::definitions::CurveID; // Generate calldata with public key included let calldata = schnorr_calldata_builder( rx, // R.x coordinate s, // s component e, // challenge hash px, // public key x py, // public key y (must be even!) true, // prepend_public_key CurveID::BN254 as usize, )?; // Generate calldata without public key let calldata_no_pk = schnorr_calldata_builder(rx, s, e, px, py, false, CurveID::BN254 as usize)?; ``` {% endtab %} {% tab title="TypeScript" %} ```typescript import { schnorrCalldataBuilder, CurveId } from 'garaga'; // Generate calldata with public key included const calldata = schnorrCalldataBuilder( rx, // R.x coordinate (bigint) s, // s component (bigint) e, // challenge hash (bigint) px, // public key x (bigint) py, // public key y (bigint, must be even!) true, // prependPublickey CurveId.BN254 ); // Generate calldata without public key const calldataNoKey = schnorrCalldataBuilder(rx, s, e, px, py, false, CurveId.BN254); ``` {% endtab %} {% endtabs %} --- ## EdDSA Signature Verification (Ed25519) EdDSA signatures use the Ed25519 curve following RFC 8032. The implementation explicitly rejects small-order points to prevent key-compromise and signature-malleability attacks. ### Cairo Structs ```rust use garaga::signatures::eddsa_25519::{EdDSASignature, EdDSASignatureWithHint, is_valid_eddsa_signature}; /// Core signature data struct EdDSASignature { Ry_twisted: u256, // Compressed R point y-coordinate (little-endian) s: u256, // Signature scalar msg: Span, // Original message bytes } /// Signature bundled with verification hints struct EdDSASignatureWithHint { signature: EdDSASignature, msm_hint: Span, sqrt_Rx_hint: u256, // Hint for R point decompression sqrt_Px_hint: u256, // Hint for public key decompression } ``` {% hint style="info" %} **Note:** EdDSA takes the raw message bytes, not a hash. The verification function computes `SHA-512(R || A || msg)` internally as per RFC 8032. {% endhint %} ### Usage Example ```rust use garaga::signatures::eddsa_25519::{EdDSASignatureWithHint, is_valid_eddsa_signature}; fn verify_eddsa_signature( serialized_signature: Span, Py_twisted: u256, // Compressed public key y-coordinate (little-endian) ) -> bool { // Deserialize the signature with hints let mut data = serialized_signature; let signature_with_hints = Serde::::deserialize(ref data).unwrap(); // Verify the signature is_valid_eddsa_signature(signature_with_hints, Py_twisted) } ``` ### Calldata Generation {% tabs %} {% tab title="Python" %} ```python from garaga.starknet.tests_and_calldata_generators.signatures import EdDSA25519Signature # Create signature object sig = EdDSA25519Signature( Ry_twisted=0x..., # Compressed R point (little-endian integer) s=0x..., # Signature scalar Py_twisted=0x..., # Compressed public key (little-endian integer) msg=b"Hello, World!" # Raw message bytes ) # Generate calldata with public key included calldata = sig.serialize_with_hints(prepend_public_key=True) # Generate calldata without public key (for hardcoded public key) calldata_no_pk = sig.serialize_with_hints(prepend_public_key=False) ``` {% endtab %} {% tab title="Rust" %} ```rust use garaga_rs::calldata::signatures::eddsa_calldata_builder; let message = b"Hello, World!".to_vec(); // Generate calldata with public key included let calldata = eddsa_calldata_builder( ry_twisted, // Compressed R point y-coordinate s, // Signature scalar py_twisted, // Compressed public key y-coordinate message.clone(), true, // prepend_public_key )?; // Generate calldata without public key let calldata_no_pk = eddsa_calldata_builder(ry_twisted, s, py_twisted, message, false)?; ``` {% endtab %} {% tab title="TypeScript" %} ```typescript import { eddsaCalldataBuilder } from 'garaga'; const message = new TextEncoder().encode("Hello, World!"); // Generate calldata with public key included const calldata = eddsaCalldataBuilder( ry_twisted_le, // Compressed R point (bigint, little-endian) s, // Signature scalar (bigint) py_twisted_le, // Compressed public key (bigint, little-endian) message, // Uint8Array true // prependPublickey ); // Generate calldata without public key const calldataNoKey = eddsaCalldataBuilder(ry_twisted_le, s, py_twisted_le, message, false); ``` {% endtab %} {% endtabs %} --- ## Curve Identifiers | Curve ID | Value | Notes | |----------|-------|-------| | BN254 | 0 | - | | BLS12_381 | 1 | - | | SECP256K1 | 2 | Bitcoin/Ethereum | | SECP256R1 | 3 | P-256/NIST | | ED25519 | 4 | Only for EdDSA | | GRUMPKIN | 5 | - | ================================================ FILE: docs/gitbook/using-garaga-libraries-in-your-cairo-project/hashing-functions.md ================================================ --- icon: binary-circle-check --- # Hashing functions Garaga provides implementations of common hash functions optimized for Cairo. *** ## SHA-512 A pure Cairo implementation of SHA-512 following [RFC-6234](https://datatracker.ietf.org/doc/html/rfc6234). This is used internally for EdDSA signature verification but is also available for general use. ### Usage ```rust use garaga::hashes::sha_512::sha512; fn hash_message() { // Hash a single byte let input: Array = array![49]; // ASCII '1' let hash: Array = sha512(input); // hash is a 64-byte (512-bit) array assert!(hash.len() == 64); } fn hash_empty() { // Hash empty input let empty: Array = array![]; let hash = sha512(empty); // SHA-512 of empty string assert!( hash.span() == array![ 0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1, 0x54, 0x28, 0x50, 0xd6, 0x6d, 0x80, 0x07, 0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc, 0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce, 0x47, 0xd0, 0xd1, 0x3c, 0x5d, 0x85, 0xf2, 0xb0, 0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f, 0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81, 0xa5, 0x38, 0x32, 0x7a, 0xf9, 0x27, 0xda, 0x3e, ].span() ); } fn hash_text() { // Hash arbitrary text let msg: Array = array![ 0x4C, 0x6F, 0x72, 0x65, 0x6D, 0x20, 0x69, 0x70, 0x73, 0x75, 0x6D // "Lorem ipsum" ]; let hash = sha512(msg); // Returns 64-byte hash } ``` ### Function Signature ```rust pub fn sha512(data: Array) -> Array ``` * **Input**: `Array` - The message bytes to hash * **Output**: `Array` - 64-byte (512-bit) hash result *** ## Poseidon (BN254 Scalar Field) A ZK-friendly hash function operating on the BN254 scalar field. This implementation is compatible with: * [Circom Poseidon](https://github.com/iden3/circomlib/blob/252f8130105a66c8ae8b4a23c7f5662e17458f3f/circuits/poseidon.circom#L198-L208) (`nInputs=2`) * [Noir Poseidon](https://noir-lang.org/docs/noir/standard_library/cryptographic_primitives/hashes#poseidon) (`std::hash::poseidon::hash::hash_2`) ### Cross-Language Example The same hash computed in Noir and Cairo: {% tabs %} {% tab title="Noir" %} ```rust // For nargo < 1.0.0-beta.4: use std::hash::poseidon::bn254::hash_2; // For nargo >= 1.0.0-beta.4: (poseidon has been moved to a separate package) // Add to Nargo.toml: // [dependencies] // poseidon = { tag = "v0.1.1", git = "https://github.com/noir-lang/poseidon" } use poseidon::poseidon::bn254::hash_2; fn main(x: Field, y: pub Field) { let x1 = [x, y]; let z = hash_2(x1); assert(z == 7853200120776062878684798364095072458815029376092732009249414926327459813530); } #[test] fn test_main() { main(1, 2); } ``` {% endtab %} {% tab title="Cairo" %} ```rust use garaga::hashes::poseidon_hash_2_bn254; use garaga::definitions::u384; fn test_poseidon_bn254() { let x: u384 = u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }; let y: u384 = u384 { limb0: 2, limb1: 0, limb2: 0, limb3: 0 }; let expected: u384 = 7853200120776062878684798364095072458815029376092732009249414926327459813530_u256 .into(); assert_eq!(poseidon_hash_2_bn254(x, y), expected); } ``` {% endtab %} {% endtabs %} ### Function Signature ```rust pub fn poseidon_hash_2_bn254(x: u384, y: u384) -> u384 ``` * **Input**: Two `u384` field elements * **Output**: `u384` - The Poseidon hash result {% hint style="info" %} This hash function is particularly useful when building circuits in Noir that need to verify hashes computed on Starknet, or vice versa. {% endhint %} ================================================ FILE: docs/gitbook/using-garaga-libraries-in-your-cairo-project/rsa-signatures.md ================================================ --- icon: key --- # RSA-2048 Signature Verification Garaga provides on-chain RSA-2048 signature verification using multi-channel Residue Number System (RNS) arithmetic. The verifier checks that `s^{65537} ≡ m (mod n)` without native 2048-bit arithmetic by decomposing the exponentiation into 17 certified modular reductions verified through 11 independent RNS channels. {% hint style="warning" %} **Important:** The verification function `is_valid_rsa2048_signature_assuming_encoded_message` assumes the expected message `m` is already in its final encoded form (e.g., PKCS#1 v1.5 padded). The caller is responsible for constructing `m` from the message hash. A helper `pkcs1_v1_5_encode_sha256` is provided in the Python SDK. {% endhint %} ## How It Works 1. **RNS representation**: 2048-bit integers are decomposed into 6 chunks of 384 bits (top chunk: 128 bits), then evaluated modulo 11 pairwise coprime ~384-bit primes. 2. **Square-and-multiply**: For `e = 65537 = 2^16 + 1`, the chain consists of 16 squarings + 1 final multiplication = 17 reductions. 3. **CRT exactness**: Each reduction `a·b = q·n + r` is checked in all 11 RNS channels. Since the product of the channel primes exceeds the maximum deviation, channel congruences imply integer equality. ## Cairo Structs ```rust use garaga::signatures::rsa::{ RSA2048PublicKey, RSA2048SignatureWithHint, is_valid_rsa2048_signature_assuming_encoded_message, }; use garaga::definitions::{RSA2048Chunks, RSA2048ReductionWitness}; /// RSA-2048 public key (the modulus n) struct RSA2048PublicKey { modulus: RSA2048Chunks, // 6 chunks × 4 × u96 = 24 felt252 } /// Core signature data struct RSA2048Signature { signature: RSA2048Chunks, // s: the RSA signature expected_message: RSA2048Chunks, // m: the expected encoded message } /// Signature bundled with 17 reduction witnesses struct RSA2048SignatureWithHint { signature: RSA2048Signature, reductions_hint: Span, // 17 × (quotient + remainder) = 17 × 48 = 816 felt252 } ``` ## Usage Example ```rust use garaga::signatures::rsa::{ RSA2048PublicKey, RSA2048SignatureWithHint, is_valid_rsa2048_signature_assuming_encoded_message, }; fn verify_rsa_signature( serialized: Span, public_key: RSA2048PublicKey, ) -> bool { let mut data = serialized; let sig = Serde::::deserialize(ref data).unwrap(); is_valid_rsa2048_signature_assuming_encoded_message(@sig, @public_key) } ``` ## Calldata Generation {% tabs %} {% tab title="Python" %} ```python from garaga.starknet.tests_and_calldata_generators.signatures import RSA2048Signature from garaga.rsa_rns import generate_rsa2048_witness, generate_rsa2048_sha256_witness # From pre-computed witness (raw expected_message) bundle = generate_rsa2048_witness(seed=0) sig = RSA2048Signature.from_bundle(bundle) # From SHA-256 message digest (PKCS#1 v1.5 encoded) bundle = generate_rsa2048_sha256_witness(b"hello", seed=0) sig = RSA2048Signature.from_bundle(bundle) # Generate calldata (Python path) calldata = sig.serialize_with_hints(prepend_public_key=True) # Generate calldata (Rust path, byte-for-byte identical) calldata = sig.serialize_with_hints(use_rust=True, prepend_public_key=True) # Without public key (when modulus is hardcoded in contract) calldata_no_pk = sig.serialize_with_hints(prepend_public_key=False) ``` {% endtab %} {% tab title="Rust" %} ```rust use garaga_rs::calldata::signatures::rsa_2048_calldata_builder; // signature, expected_message, modulus are BigUint values let calldata = rsa_2048_calldata_builder( signature, // s value expected_message, // m = s^65537 mod n (PKCS#1 v1.5 encoded) modulus, // RSA-2048 modulus n true, // prepend_public_key )?; ``` {% endtab %} {% tab title="TypeScript" %} ```typescript import { rsa2048CalldataBuilder } from 'garaga'; const calldata = rsa2048CalldataBuilder( signature, // RSA signature (bigint) expectedMessage, // PKCS#1 v1.5 encoded message (bigint) modulus, // RSA-2048 modulus (bigint) true // prependPublicKey ); ``` {% endtab %} {% endtabs %} ## Calldata Layout | Section | Elements | Description | |---------|----------|-------------| | Public key (optional) | 24 | Modulus `n` as 6 chunks × 4 words | | Signature | 24 | `s` as 6 chunks × 4 words | | Expected message | 24 | `m` as 6 chunks × 4 words | | Reduction witnesses | 816 | 17 × (quotient 24 + remainder 24) | | **Total** | **888** (with key) / **864** (without) | | ## Full SHA-256 Verification For end-to-end verification where the raw message is provided and SHA-256 + PKCS#1 v1.5 encoding is computed on-chain, use `is_valid_rsa2048_sha256_signature`: ```rust use garaga::signatures::rsa::{ RSA2048PublicKey, RSA2048SignatureWithHint, is_valid_rsa2048_sha256_signature, }; fn verify_rsa_sha256( serialized: Span, public_key: RSA2048PublicKey, ) -> bool { let mut data = serialized; let sig = Serde::::deserialize(ref data).unwrap(); let message = Serde::::deserialize(ref data).unwrap(); is_valid_rsa2048_sha256_signature(@sig, @public_key, @message) } ``` This function: 1. Computes `SHA-256(message)` on-chain 2. Constructs the PKCS#1 v1.5 encoded message 3. Asserts it matches the `expected_message` hint 4. Verifies `s^{65537} ≡ m (mod n)` via RNS arithmetic ### SHA-256 Calldata Generation {% tabs %} {% tab title="Python" %} ```python from garaga.starknet.tests_and_calldata_generators.signatures import RSA2048Signature # Create signature from raw message sig = RSA2048Signature.from_sha256_message(b"hello garaga", seed=0) # Generate calldata (Python path) calldata = sig.serialize_sha256_with_hints( message=b"hello garaga", prepend_public_key=True ) # Generate calldata (Rust path, byte-for-byte identical) calldata = sig.serialize_sha256_with_hints( message=b"hello garaga", use_rust=True, prepend_public_key=True ) ``` {% endtab %} {% tab title="Rust" %} ```rust use garaga_rs::calldata::signatures::rsa_2048_sha256_calldata_builder; let calldata = rsa_2048_sha256_calldata_builder( signature, // RSA signature s b"hello", // raw message bytes modulus, // RSA-2048 modulus n true, // prepend_public_key )?; ``` {% endtab %} {% tab title="TypeScript" %} ```typescript import { rsa2048Sha256CalldataBuilder } from 'garaga'; const message = new TextEncoder().encode("hello garaga"); const calldata = rsa2048Sha256CalldataBuilder( signature, // RSA signature (bigint) message, // raw message (Uint8Array) modulus, // RSA-2048 modulus (bigint) true // prependPublicKey ); ``` {% endtab %} {% endtabs %} ### SHA-256 Calldata Layout | Section | Elements | Description | |---------|----------|-------------| | Public key (optional) | 24 | Modulus `n` as 6 chunks × 4 words | | Signature | 24 | `s` as 6 chunks × 4 words | | Expected message | 24 | `m` (PKCS#1 v1.5 encoded) as 6 chunks × 4 words | | Reduction witnesses | 816 | 17 × (quotient 24 + remainder 24) | | ByteArray message | variable | Cairo ByteArray serde format | | **Total** | **888 + ByteArray** (with key) | | ## PKCS#1 v1.5 Encoding For standard RSA signature verification with SHA-256, the expected message must be PKCS#1 v1.5 encoded (RFC 8017, Section 9.2): ``` 0x00 || 0x01 || PS(0xFF × 202) || 0x00 || DigestInfo(19 bytes) || SHA-256(msg)(32 bytes) ``` The Python SDK provides `pkcs1_v1_5_encode_sha256`: ```python from garaga.rsa_rns import pkcs1_v1_5_encode_sha256 import hashlib message_hash = hashlib.sha256(b"hello").digest() encoded_message = pkcs1_v1_5_encode_sha256(message_hash) # encoded_message is a 2048-bit integer ready for RSA verification ``` ## Performance RSA-2048 verification costs approximately **~11.8M Sierra gas** (L2 gas) on Starknet. For comparison: | Scheme | Sierra Gas | |--------|-----------| | ECDSA (SECP256R1) | ~4.5M | | Schnorr (SECP256K1) | ~4.2M | | EdDSA (Ed25519, short msg) | ~9.8M | | **RSA-2048** | **~11.8M** | ================================================ FILE: hydra/garaga/algebra.py ================================================ from __future__ import annotations import random from dataclasses import dataclass from typing import Generic, TypeVar from sympy import legendre_symbol, sqrt_mod T = TypeVar("T", "PyFelt", "Fp2") @dataclass(slots=True) class PyFelt: """ Represents an element of a finite field. The dataclass decorator automatically provides implementations for __init__, __repr__, __eq__, and __hash__ methods. Supports the following operations through magic methods: - Addition ((PyFelt | int) + (PyFelt | int)) - Subtraction ((PyFelt | int) - (PyFelt | int)) - Multiplication ((PyFelt | int) * (PyFelt | int)) - Division (PyFelt / PyFelt) - Negation (-PyFelt) - Inversion (inv(PyFelt)) - Exponentiation (PyFelt ** int) - Equality (PyFelt == PyFelt) - Inequality (PyFelt != PyFelt) """ value: int p: int @property def felt(self) -> PyFelt: return self def __repr__(self) -> str: p_str = f"0x{self.p:0x}" if len(p_str) > 10: p_str = f"{p_str[:6]}...{p_str[-4:]}" return f"PyFelt({self.value}, {p_str})" def __add__(self, right: PyFelt | int) -> PyFelt: p = self.p if isinstance(right, PyFelt): return PyFelt((self.value + right.value) % p, p) if isinstance(right, int): return PyFelt((self.value + right) % p, p) raise TypeError(f"Cannot add PyFelt and {type(right)}") def __neg__(self) -> PyFelt: p = self.p return PyFelt((-self.value) % p, p) def __sub__(self, right: PyFelt | int) -> PyFelt: p = self.p if isinstance(right, PyFelt): return PyFelt((self.value - right.value) % p, p) if isinstance(right, int): return PyFelt((self.value - right) % p, p) raise TypeError(f"Cannot subtract PyFelt and {type(right)}") def __mul__(self, right: PyFelt | int) -> PyFelt: p = self.p if isinstance(right, PyFelt): return PyFelt((self.value * right.value) % p, p) if isinstance(right, int): return PyFelt((self.value * right) % p, p) raise TypeError(f"Cannot multiply PyFelt and {type(right)}") def __rmul__(self, left: PyFelt | int) -> PyFelt: return self.__mul__(left) def __inv__(self) -> PyFelt: try: inv = pow(self.value, -1, self.p) except ValueError: raise ValueError(f"Cannot invert {self.value} modulo {self.p}") return PyFelt(inv, self.p) def __truediv__(self, right: PyFelt) -> PyFelt: assert isinstance(self, PyFelt) and isinstance( right, PyFelt ), f"Cannot divide {type(self)} by {type(right)}" return self * right.__inv__() def __pow__(self, exponent: int) -> PyFelt: return PyFelt(pow(self.value, exponent, self.p), self.p) def __eq__(self, other: object) -> bool: if isinstance(other, PyFelt): return self.value == other.value if isinstance(other, int): return self.value == other raise TypeError(f"Cannot compare PyFelt and {type(other)}") def __lt__(self, other: PyFelt | int) -> bool: if isinstance(other, PyFelt): return self.value < other.value if isinstance(other, int): return self.value < other raise TypeError(f"Cannot compare PyFelt and {type(other)}") def __le__(self, other: PyFelt | int) -> bool: if isinstance(other, PyFelt): return self.value <= other.value if isinstance(other, int): return self.value <= other raise TypeError(f"Cannot compare PyFelt and {type(other)}") def __gt__(self, other: PyFelt | int) -> bool: if isinstance(other, PyFelt): return self.value > other.value if isinstance(other, int): return self.value > other raise TypeError(f"Cannot compare PyFelt and {type(other)}") def __ge__(self, other: PyFelt | int) -> bool: if isinstance(other, PyFelt): return self.value >= other.value if isinstance(other, int): return self.value >= other raise TypeError(f"Cannot compare PyFelt and {type(other)}") def __rlt__(self, left: int) -> bool: return left < self.value def __rle__(self, left: int) -> bool: return left <= self.value def __rgt__(self, left: int) -> bool: return left > self.value def __rge__(self, left: int) -> bool: return left >= self.value def __ne__(self, other: object) -> bool: return not self.__eq__(other) def __radd__(self, left: PyFelt | int) -> PyFelt: return self.__add__(left) def __rsub__(self, left: PyFelt | int) -> PyFelt: return -self.__sub__(left) def __rtruediv__(self, left: PyFelt | int) -> PyFelt: return self.__inv__().__mul__(left) def is_quad_residue(self) -> bool: if self.value == 0: return True return legendre_symbol(self.value, self.p) == 1 def sqrt(self, min_root: bool = True) -> PyFelt: if not self.is_quad_residue(): raise ValueError("Cannot square root a non-quadratic residue") roots = sqrt_mod(self.value, self.p, all_roots=True) if min_root: return PyFelt(min(roots), self.p) else: return PyFelt(max(roots), self.p) @dataclass(slots=True) class Fp2: a0: PyFelt a1: PyFelt def __post_init__(self): assert self.a0.p == self.a1.p, "Fields must be the same" @property def p(self) -> int: return self.a0.p @property def value(self) -> tuple[int, int]: return self.a0.value, self.a1.value @staticmethod def random(p: int, max_value: int = None) -> Fp2: if max_value is None: max_value = p - 1 rnd1 = random.randint(0, max_value) rnd2 = random.randint(0, max_value) return Fp2( PyFelt(rnd1, p), PyFelt(rnd2, p), ) @staticmethod def one(p: int) -> Fp2: return Fp2(PyFelt(1, p), PyFelt(0, p)) @staticmethod def zero(p: int) -> Fp2: return Fp2(PyFelt(0, p), PyFelt(0, p)) def __repr__(self) -> str: return f"Fp2({self.a0}, {self.a1})" def __add__(self, other: Fp2) -> Fp2: if isinstance(other, Fp2): return Fp2(self.a0 + other.a0, self.a1 + other.a1) else: raise TypeError(f"Cannot add Fp2 and {type(other)}") def __eq__(self, other: object) -> bool: if isinstance(other, Fp2): return self.a0 == other.a0 and self.a1 == other.a1 and self.p == other.p else: raise TypeError(f"Cannot compare Fp2 and {type(other)}") def __neg__(self) -> Fp2: return Fp2(-self.a0, -self.a1) def __sub__(self, other: Fp2) -> Fp2: return self.__add__(-other) def __mul__(self, other: Fp2 | PyFelt | int) -> Fp2: if isinstance(other, PyFelt): assert other.p == self.a0.p, "Fields must be the same" return Fp2(self.a0 * other, self.a1 * other) elif isinstance(other, int): return Fp2(self.a0 * other, self.a1 * other) elif isinstance(other, Fp2): # (a0 + a1 * i) * (b0 + b1 * i) = a0 * b0 - a1 * b1 + (a0 * b1 + a1 * b0) * i return Fp2( self.a0 * other.a0 - self.a1 * other.a1, self.a0 * other.a1 + self.a1 * other.a0, ) else: raise TypeError(f"Cannot multiply Fp2 and {type(other)}") def __rmul__(self, other): return self.__mul__(other) def __truediv__(self, other): if isinstance(other, Fp2): return self * other.__inv__() elif isinstance(other, int): return self * pow(other, -1, self.p) return NotImplemented def __rtruediv__(self, other) -> Fp2: if isinstance(other, Fp2): return other * self.__inv__() elif isinstance(other, int): return other * self.__inv__() return NotImplemented def __inv__(self) -> Fp2: t0, t1 = (self.a0 * self.a0, self.a1 * self.a1) t0 = t0 + t1 t1 = pow(t0.value, -1, self.p) return Fp2(self.a0 * t1, -(self.a1 * t1)) def __pow__(self, p: int) -> Fp2: """ Compute x**p in F_p^2 using square-and-multiply algorithm. Args: p: The exponent, a non-negative integer. Returns: x**p in F_p^2, represented similarly as x. """ assert isinstance(p, int) and p >= 0 # Handle the easy cases. if p == 0: # x**0 = 1, where 1 is the multiplicative identity in F_p^2. return Fp2(PyFelt(1, self.p), PyFelt(0, self.p)) elif p == 1: # x**1 = x. return self # Start the computation. result = self.one( self.p ) # Initialize result as the multiplicative identity in F_p^2. temp = self # Initialize temp as self. # Loop through each bit of the exponent p. for bit in reversed(bin(p)[2:]): # [2:] to strip the "0b" prefix. if bit == "1": result = result * temp temp = temp * temp return result def norm(self) -> PyFelt: return self.a0 * self.a0 + self.a1 * self.a1 def legendre(self) -> int: norm = self.norm() return legendre_symbol(norm.value, self.p) def is_quad_residue(self) -> bool: return self.legendre() == 1 def sqrt(self) -> Fp2: if not self.is_quad_residue(): raise ValueError("Cannot square root a non-quadratic residue") assert self.p % 4 == 3, "p must be 3 mod 4 to use this sqrt" min_one = Fp2(PyFelt(-1 % self.p, self.p), PyFelt(0, self.p)) a = self a1 = a ** ((self.p - 3) // 4) alpha = a1 * a1 * a a0 = alpha**self.p * alpha if a0 == min_one: return ValueError("Cannot square root a non-quadratic residue") x0 = a1 * a if alpha == min_one: i = Fp2(PyFelt(0, self.p), PyFelt(1, self.p)) x = i * x0 else: b = (Fp2.one(self.p) + alpha) ** ((self.p - 1) // 2) x = b * x0 # Return the root as is, without forcing a specific sign return x def lexicographically_largest(self) -> bool: """Check if this Fp2 element is lexicographically largest.""" if self.a1.value > (self.p - 1) // 2: return True if self.a1.value < (self.p - 1) // 2: return False return self.a0.value > (self.p - 1) // 2 @dataclass(slots=True) class BaseField: p: int def __call__(self, integer: int) -> PyFelt: return PyFelt(integer % self.p, self.p) def zero(self) -> PyFelt: return PyFelt(0, self.p) def one(self) -> PyFelt: return PyFelt(1, self.p) def random(self, max_value: int = None) -> PyFelt: if max_value is None: max_value = self.p - 1 return PyFelt(random.randint(0, max_value), self.p) @property def type(self) -> type[PyFelt]: return PyFelt @dataclass(slots=True) class BaseFp2Field: p: int def __call__(self, a: tuple[int, int] | int) -> Fp2: if isinstance(a, tuple): a0, a1 = a else: a0, a1 = a, 0 return Fp2(PyFelt(a0 % self.p, self.p), PyFelt(a1 % self.p, self.p)) def zero(self) -> Fp2: return Fp2(PyFelt(0, self.p), PyFelt(0, self.p)) def one(self) -> Fp2: return Fp2(PyFelt(1, self.p), PyFelt(0, self.p)) def random(self) -> Fp2: return Fp2.random(self.p) @property def type(self) -> type[Fp2]: return Fp2 @dataclass(slots=True) class ModuloCircuitElement: """ Represents an element within a modulo circuit with its associated offset. Attributes: emulated_felt (PyFelt): The emulated field element in the modulo circuit offset (int): The offset in the values segment within the modulo circuit where the element is stored. """ emulated_felt: PyFelt offset: int __repr__ = lambda self: f"ModuloCircuitElement({hex(self.value)}, {self.offset})" @property def value(self) -> int: return self.emulated_felt.value @property def p(self) -> int: return self.emulated_felt.p @property def felt(self) -> PyFelt: return self.emulated_felt class Polynomial(Generic[T]): """ Represents a polynomial with coefficients in a finite field. Parameters : coefficients (list[PyFelt | ModuloCircuitElement]): A list of coefficients for the polynomial. Magic Methods Summary: - __init__: Initializes a polynomial with a list of coefficients. - __add__: (Polynomial + Polynomial) Adds two polynomials. - __neg__: (-Polynomial) Negates the polynomial. - __sub__: (Polynomial - Polynomial) Subtracts one polynomial from another. - __mul__: (Polynomial * PyFelt|Polynomial) Multiplies the polynomial by either a field element or another polynomial. - __truediv__: (Polynomial / Polynomial) Divides one polynomial by another, asserting no remainder. - __floordiv__: (Polynomial // Polynomial) Performs floor division on two polynomials. - __mod__: (Polynomial % Polynomial) Finds the remainder of polynomial division. - __divmod__: Divides one polynomial by another, returning both quotient and remainder. - __eq__: (Polynomial == Polynomial) Checks if two polynomials are equal. - __neq__: (Polynomial != Polynomial) Checks if two polynomials are not equal. - __str__: Returns a string representation of the polynomial. - __pow__: (Polynomial ** int) Raises the polynomial to a power. """ __slots__ = [ "coefficients", "coeff_type", "p", "field", "zero_field", "zero_field_value", ] def __init__(self, coefficients: list[T], raw_init: tuple = None): if raw_init is not None: self._raw_init(coefficients, *raw_init) else: coeffs_types = {type(c) for c in coefficients} if coeffs_types == {PyFelt}: self._initialize(coefficients, PyFelt, BaseField) elif coeffs_types == {ModuloCircuitElement}: self._initialize([c.felt for c in coefficients], PyFelt, BaseField) elif coeffs_types == {Fp2}: self._initialize(coefficients, Fp2, BaseFp2Field) else: raise TypeError( f"All elements in the list must be of the same type, either ModuloCircuitElement, PyFelt or Fp2., got {coeffs_types}" ) def _raw_init( self, coefficients: list[T], coeff_type: type[T], p: int, field, zero_field, zero_field_value, ) -> None: self.coefficients = coefficients self.coeff_type = coeff_type self.p = p self.field = field self.zero_field = zero_field self.zero_field_value = zero_field_value def _initialize( self, coefficients: list[T], coeff_type: type[T], field_class: type ): self.coefficients: list[T] = coefficients self.coeff_type = coeff_type self.p = coefficients[0].p self.field = field_class(self.p) self.zero_field = self.field.zero() self.zero_field_value = self.zero_field.value def __repr__(self) -> str: if self.coeff_type == PyFelt: return f"Polynomial({[x.value for x in self.get_coeffs()]})" elif self.coeff_type == Fp2: return f"Polynomial({[x for x in self.get_coeffs()]})" def print_as_sage_poly(self, var_name: str = "z", as_hex: bool = False) -> str: """ Prints the polynomial ready to be used in SageMath. """ if self.is_zero(): return "" coeffs = self.get_coeffs() string = "" zero = self.zero_field for i, coeff in enumerate(coeffs[::-1]): if coeff == zero: continue else: if self.coeff_type == PyFelt: coeff_str = hex(coeff.value) if as_hex else str(coeff.value) elif self.coeff_type == Fp2: coeff_str = f"({coeff.a1.value} * i + {coeff.a0.value})" if i == len(coeffs) - 1: string += f"{coeff_str}" elif i == len(coeffs) - 2: string += f"{coeff_str}*{var_name} + " else: string += f"{coeff_str}*{var_name}^{len(coeffs) - 1 - i} + " return string def __getitem__(self, i: int) -> PyFelt: try: return self.coefficients[i] except IndexError: return self.zero_field def __len__(self) -> int: return len(self.coefficients) def degree(self) -> int: for i, coeff in enumerate(self.coefficients[::-1]): if coeff.value != self.zero_field_value: return len(self.coefficients) - 1 - i return -1 def get_coeffs(self) -> list[T]: coeffs = self.coefficients[:] while len(coeffs) > 0 and coeffs[-1].value == self.zero_field_value: coeffs.pop() if coeffs == []: return [self.zero_field] return coeffs def get_value_coeffs(self) -> list[int]: if self.coeff_type == PyFelt: return [c.value for c in self.get_coeffs()] elif self.coeff_type == Fp2: raise NotImplementedError("Fp2 not implemented") def differentiate(self) -> "Polynomial": """ Differentiates the polynomial with respect to x. Returns: Polynomial: The derivative of the polynomial. """ if len(self.coefficients) <= 1: return Polynomial([self.zero_field]) derivative_coeffs = [ self.coefficients[i] * i for i in range(1, len(self.coefficients)) ] return Polynomial( derivative_coeffs, raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) def __add__(self, other: Polynomial) -> Polynomial: if self.coeff_type != other.coeff_type: raise TypeError( f"Cannot add Polynomial of type {self.coeff_type} and {other.coeff_type} \n self: {self} \n other: {other}" ) ns, no = len(self.coefficients), len(other.coefficients) if ns >= no: coeffs = self.coefficients[:] for i in range(no): coeffs[i] += other.coefficients[i] else: coeffs = other.coefficients[:] for i in range(ns): coeffs[i] += self.coefficients[i] return Polynomial( coeffs, raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) def __neg__(self) -> "Polynomial": return Polynomial( [-c for c in self.coefficients], raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) def __sub__(self, other: Polynomial) -> Polynomial: if self.coeff_type != other.coeff_type: raise TypeError( f"Cannot add Polynomial of type {self.coeff_type} and {other.coeff_type} \n self: {self} \n other: {other}" ) ns, no = len(self.coefficients), len(other.coefficients) coeffs = self.coefficients[:] if ns >= no: for i in range(no): coeffs[i] -= other.coefficients[i] else: for i in range(ns): coeffs[i] -= other.coefficients[i] for i in range(ns, no): coeffs.append(-other.coefficients[i]) return Polynomial( coeffs, raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) def __mul__( self, other: "Polynomial" | PyFelt | ModuloCircuitElement ) -> "Polynomial": if isinstance(other, (PyFelt, ModuloCircuitElement)): return Polynomial( [c * other.felt for c in self.coefficients], raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) elif isinstance(other, Fp2): return Polynomial( [c * other for c in self.coefficients], raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) if self.coeff_type != other.coeff_type: raise TypeError( f"Cannot multiply polynomial of type {self.coeff_type} by polynomial of type {other.type}" ) len_self = len(self.coefficients) len_other = len(other.coefficients) buf = [self.zero_field] * (len_self + len_other - 1) for i in range(len_self): if self.coefficients[i].value == self.zero_field_value: continue # optimization for sparse polynomials for j in range(len_other): buf[i + j] += self.coefficients[i] * other.coefficients[j] while len(buf) > 0 and buf[-1].value == self.zero_field_value: buf.pop() if buf == []: return Polynomial( [self.zero_field], raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) return Polynomial( buf, raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) def __rmul__( self, other: "Polynomial" | PyFelt | ModuloCircuitElement ) -> "Polynomial": return self.__mul__(other) def __truediv__(self, other): quo, rem = Polynomial.__divmod__(self, other) assert ( rem.is_zero() ), "cannot perform polynomial division because remainder is not zero" return quo def __floordiv__(self, other: "Polynomial") -> "Polynomial": quo, _ = Polynomial.__divmod__(self, other) return quo def __mod__(self, other: "Polynomial") -> "Polynomial": _, rem = Polynomial.__divmod__(self, other) return rem def __divmod__(self, denominator: "Polynomial") -> tuple[Polynomial, Polynomial]: den_deg = denominator.degree() if den_deg == -1: raise ValueError("Cannot divide by zero polynomial") num_deg = self.degree() if num_deg < den_deg: return (Polynomial.zero(self.p, self.coeff_type), self) remainder = Polynomial( self.coefficients[:], raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) quotient_coefficients = [self.zero_field] * (num_deg - den_deg + 1) denom_lead_inv = denominator[den_deg].__inv__() rem_deg = num_deg while rem_deg >= den_deg: shift = rem_deg - den_deg coefficient = remainder[rem_deg] * denom_lead_inv quotient_coefficients[shift] = coefficient subtractee = ( Polynomial( [self.zero_field] * shift + [coefficient], raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) * denominator ) remainder = remainder - subtractee rem_deg = remainder.degree() quotient = Polynomial( quotient_coefficients, raw_init=( self.coeff_type, self.p, self.field, self.zero_field, self.zero_field_value, ), ) return quotient, remainder def __eq__(self, other: object) -> bool: if not isinstance(other, Polynomial): raise TypeError(f"Cannot compare Polynomial with {type(other)}") if self.degree() != other.degree(): return False if self.degree() == -1: return True return self.get_coeffs() == other.get_coeffs() def __neq__(self, other: object) -> bool: return not self.__eq__(other) def leading_coefficient(self) -> PyFelt: return self.coefficients[self.degree()] def is_zero(self) -> bool: if not self.coefficients: return True for c in self.coefficients: if c != self.zero_field: return False return True @staticmethod def zero(p: int, type: type[T] = PyFelt) -> "Polynomial[T]": if type == PyFelt: return Polynomial([PyFelt(0, p)]) elif type == Fp2: return Polynomial([Fp2.zero(p)]) else: raise ValueError(f"Unknown type {type}") @staticmethod def one(p: int, type: type[T] = PyFelt) -> "Polynomial[T]": if type == PyFelt: return Polynomial([PyFelt(1, p)]) elif type == Fp2: return Polynomial([Fp2.one(p)]) else: raise ValueError(f"Unknown type {type}") def evaluate(self, point: PyFelt | Fp2) -> PyFelt | Fp2: assert isinstance( point, self.coeff_type ), f"point type must match polynomial type {self.coeff_type}" xi = self.field.one() value = self.zero_field for c in self.coefficients: value = value + c * xi xi = xi * point return value def __pow__(self, exponent: int) -> "Polynomial": if exponent == 0: return Polynomial([self.field.one()]) acc = Polynomial([self.field.one()]) for i in reversed(range(len(bin(exponent)[2:]))): acc = acc * acc if (1 << i) & exponent != 0: acc = acc * self return acc def pow(self, exponent: int, modulo_poly: "Polynomial") -> "Polynomial": if self.coeff_type != modulo_poly.coeff_type: raise TypeError( f"Cannot pow polynomial of type {self.coeff_type} modulo a polynomial of type {modulo_poly.coeff_type}" ) one = Polynomial.one(self.p, self.coeff_type) if exponent == 0: return one acc = one for i in reversed(range(len(bin(exponent)[2:]))): acc = acc * acc % modulo_poly if (1 << i) & exponent != 0: acc = (acc * self) % modulo_poly return acc % modulo_poly def inv(self, modulo_poly: "Polynomial") -> "Polynomial": """ Inverts a polynomial modulo another polynomial over a finite field. Parameters: modulo_poly Polynomial: The polynomial to invert modulo. Returns: Polynomial: The inverted polynomial. """ if self.is_zero(): raise ValueError("Cannot invert zero polynomial") inv, _, gcd = Polynomial.xgcd(self, modulo_poly) assert ( gcd.degree() == 0 and gcd.coefficients[0] == 1 ), f"Polynomial {self} is not invertible modulo {modulo_poly}" return inv @staticmethod def xgcd(x: Polynomial, y: Polynomial) -> tuple[Polynomial, Polynomial, Polynomial]: """ Extended Euclidean Algorithm for polynomials. This method computes the extended greatest common divisor (GCD) of two polynomials x and y. It returns a tuple of three elements: (a, b, g) such that a * x + b * y = g, where g is the greatest common divisor of x and y. This is particularly useful in contexts like computational algebra or number theory where the coefficients of the polynomials are in a field. Parameters: x (Polynomial): The first polynomial. y (Polynomial): The second polynomial. Returns: tuple: A tuple (a, b, g) where: a (Polynomial): A polynomial such that a * x + b * y = g. b (Polynomial): A polynomial such that a * x + b * y = g. g (Polynomial): The greatest common divisor of x and y. """ one = Polynomial.one(x.p, x.coeff_type) zero = Polynomial.zero(x.p, x.coeff_type) old_r, r = (x, y) old_s, s = (one, zero) old_t, t = (zero, one) while not r.is_zero(): quotient = old_r // r old_r, r = (r, old_r - quotient * r) old_s, s = (s, old_s - quotient * s) old_t, t = (t, old_t - quotient * t) lcinv = old_r.leading_coefficient().__inv__() # a, b, g raw_init = (x.coeff_type, x.p, x.field, x.zero_field, x.zero_field_value) return ( Polynomial([c * lcinv for c in old_s.coefficients], raw_init=raw_init), Polynomial([c * lcinv for c in old_t.coefficients], raw_init=raw_init), Polynomial([c * lcinv for c in old_r.coefficients], raw_init=raw_init), ) @staticmethod def lagrange_interpolation( p: int, domain: list[PyFelt], values: list[PyFelt] ) -> Polynomial: """ Performs Lagrange interpolation on a set of points. Parameters: p (int): The prime modulus for the field. domain (list[PyFelt]): The domain of the interpolation. values (list[PyFelt]): The values corresponding to the domain. Returns: Polynomial: The interpolated polynomial. """ assert len(domain) == len( values ), "number of elements in domain does not match number of values -- cannot interpolate" assert len(domain) > 0, "cannot interpolate between zero points" field = BaseField(p) X = Polynomial([field.zero(), field.one()]) acc = Polynomial([field.zero()]) for i in range(len(domain)): prod = Polynomial([values[i]]) for j in range(len(domain)): if j == i: continue prod = ( prod * (X - Polynomial([domain[j]])) * Polynomial([(domain[i] - domain[j]).__inv__()]) ) acc = acc + prod return acc def sparsity(self) -> list[int]: return get_sparsity(self.coefficients) def get_sparsity(X: list[PyFelt | ModuloCircuitElement]) -> list[int]: """ Determines the sparsity of polynomial coefficients. This function evaluates a list of polynomial coefficients (`X`) and categorizes each based on its value: - 2: The coefficient is 1, indicating a direct representation of a polynomial power. - 1: The coefficient is non-zero but not 1, indicating a contributing non-zero coefficient. - 0: The coefficient is 0, indicating no contribution to the polynomial. Parameters: - X (list[PyFelt | ModuloCircuitElement]): Coefficients to evaluate. Returns: - list[int]: Sparsity categories for each coefficient in `X`. """ return [2 if x.value == 1 else 1 if x.value != 0 else 0 for x in X] @dataclass(slots=True) class RationalFunction(Generic[T]): numerator: Polynomial[T] denominator: Polynomial[T] @property def field(self) -> BaseField | BaseFp2Field: return self.numerator.field @classmethod def zero(cls, p: int, type: type[T] = PyFelt) -> "RationalFunction[T]": return cls(Polynomial.zero(p, type), Polynomial.one(p, type)) @classmethod def one(cls, p: int, type: type[T] = PyFelt) -> "RationalFunction[T]": return cls(Polynomial.one(p, type), Polynomial.one(p, type)) def simplify(self) -> "RationalFunction": _, _, gcd = Polynomial.xgcd(self.numerator, self.denominator) num_simplified = self.numerator // gcd den_simplified = self.denominator // gcd return RationalFunction( num_simplified * self.denominator.leading_coefficient().__inv__(), den_simplified * den_simplified.leading_coefficient().__inv__(), ) def __add__(self, other: "RationalFunction") -> "RationalFunction": return RationalFunction( self.numerator * other.denominator + other.numerator * self.denominator, self.denominator * other.denominator, ).simplify() def __mul__(self, other: int | PyFelt) -> "RationalFunction": if isinstance(other, int): other = self.field(other) elif isinstance(other, PyFelt): other = self.field(other.value) else: raise TypeError(f"Cannot multiply RationalFunction with {type(other)}") return RationalFunction(self.numerator * other, self.denominator) def evaluate(self, x: PyFelt | Fp2) -> PyFelt | Fp2: return self.numerator.evaluate(x) / self.denominator.evaluate(x) def degrees_infos(self) -> dict[str, int]: return { "numerator": self.numerator.degree(), "denominator": self.denominator.degree(), } @dataclass(slots=True) class FunctionFelt(Generic[T]): # f = a(x) + yb(x) a: RationalFunction[T] b: RationalFunction[T] @property def field(self) -> BaseField | BaseFp2Field: return self.a.numerator.field @classmethod def zero(cls, p: int, type: type[T] = PyFelt) -> "FunctionFelt[T]": return cls(RationalFunction.zero(p, type), RationalFunction.zero(p, type)) @classmethod def one(cls, p: int, type: type[T] = PyFelt) -> "FunctionFelt[T]": return cls(RationalFunction.one(p, type), RationalFunction.zero(p, type)) def simplify(self) -> "FunctionFelt": return FunctionFelt(self.a.simplify(), self.b.simplify()) def __add__(self, other: "FunctionFelt") -> "FunctionFelt": return FunctionFelt(self.a + other.a, self.b + other.b) def __mul__(self, other: PyFelt | int) -> "FunctionFelt": return FunctionFelt(self.a * other, self.b * other) def __rmul__(self, other: PyFelt | int) -> "FunctionFelt": return self.__mul__(other) def evaluate(self, x: PyFelt | Fp2, y: PyFelt | Fp2) -> PyFelt | Fp2: assert ( isinstance(x, self.field.type) and x.p == self.field.p ), f"x type must match field {self.field.type}, got {type(x)} over {hex(x.p)}" assert ( isinstance(y, self.field.type) and y.p == self.field.p ), f"y type must match field {self.field.type}, got {type(y)} over {hex(y.p)}" return self.a.evaluate(x) + y * self.b.evaluate(x) def degrees_infos(self) -> dict[str, dict[str, int]]: return { "a": self.a.degrees_infos(), "b": self.b.degrees_infos(), } def validate_degrees(self, msm_size: int, batched: bool = True) -> bool: degrees = self.degrees_infos() if batched: extra = 2 else: extra = 0 assert degrees["a"]["numerator"] <= msm_size + 1 + extra assert degrees["a"]["denominator"] <= msm_size + 2 + extra assert degrees["b"]["numerator"] <= msm_size + 2 + extra assert degrees["b"]["denominator"] <= msm_size + 5 + extra return True def print_as_sage_poly(self, var: str = "x", as_hex: bool = False) -> str: return f"(({self.b.numerator.print_as_sage_poly(var, as_hex)}) / ({self.b.denominator.print_as_sage_poly(var, as_hex)}) * y + ({self.a.numerator.print_as_sage_poly(var, as_hex)} / ({self.a.denominator.print_as_sage_poly(var, as_hex)})" ================================================ FILE: hydra/garaga/curves.py ================================================ from dataclasses import dataclass from enum import Enum from typing import TypeAlias from garaga.algebra import BaseField, BaseFp2Field, Fp2, Polynomial, PyFelt from garaga.hints.io import bigint_split, int_to_u256, int_to_u384 N_LIMBS = 4 BASE = 2**96 STARK = 0x800000000000011000000000000000000000000000000000000000000000001 BN254_ID = 0 BLS12_381_ID = 1 SECP256K1_ID = 2 SECP256R1_ID = 3 ED25519_ID = 4 GRUMPKIN_ID = 5 class ProofSystem(Enum): Groth16 = "groth16" # Works for Generic Groth16 (BN254/BLS12-381), Risc0 Groth16 (BN254), and SP1 Groth16 (BN254) UltraKeccakZKHonk = "ultra_keccak_zk_honk" # UltraStarknetZKHonk = "ultra_starknet_zk_honk" # Disabled. @property def supported_curves(self) -> set[int]: if self == ProofSystem.Groth16: return {BN254_ID, BLS12_381_ID} if self == ProofSystem.UltraKeccakHonk: return {BN254_ID} if self == ProofSystem.UltraStarknetHonk: return {BN254_ID} if self == ProofSystem.UltraKeccakZKHonk: return {BN254_ID} if self == ProofSystem.UltraStarknetZKHonk: return {BN254_ID} return set() class CurveID(Enum): BN254 = 0 BLS12_381 = 1 SECP256K1 = 2 SECP256R1 = 3 ED25519 = 4 GRUMPKIN = 5 @staticmethod def from_str(s: str) -> "CurveID": return CurveID(CurveID.find_value_in_string(s)) @property def p(self) -> int: return CURVES[self.value].p @staticmethod def find_value_in_string(s: str) -> int | None: """ Find the value of the curve ID in the string. """ if s.lower() == "bn128": return CurveID.BN254.value if s.lower() == "bls12381": return CurveID.BLS12_381.value for member in CurveID: if s.lower() in member.name.lower() or member.name.lower() in s.lower(): return member.value return None @staticmethod def get_proving_system_curve( curve_id: int, proving_system: ProofSystem ) -> "CurveID": """ Get the curve ID for proving systems. Only curves supported by the given proving system are valid. """ if curve_id not in CurveID._value2member_map_: raise ValueError( f"Invalid curve ID: {curve_id}. Supported curves are: {', '.join([f'{c.name} (ID: {c.value})' for c in CurveID])}" ) if curve_id not in proving_system.supported_curves: supported_curves = ", ".join( f"{CurveID(c).name} (ID: {c})" for c in proving_system.supported_curves ) raise ValueError( f"Invalid curve ID for {proving_system.name}. Supported curves are: {supported_curves}" ) return CurveID(curve_id) @dataclass class SWUParams: A: int B: int Z: int @dataclass(slots=True, frozen=True) class WeierstrassCurve: cairo_zero_namespace_name: str id: int p: int n: int # order h: int # cofactor a: int # y^2 = x^3 + ax + b b: int fp_generator: int # A generator of the field of the curve. To verify it, use is_generator function. Gx: int # x-coordinate of the generator point Gy: int # y-coordinate of the generator point swu_params: SWUParams eigen_value: int | None # Endomorphism eigenvalue third_root_of_unity: int | None # Endomorphism image def is_endomorphism_available(self) -> bool: return self.eigen_value is not None and self.third_root_of_unity is not None def to_cairo_zero(self) -> str: code = f"namespace {self.cairo_zero_namespace_name} {{\n" code += f"const CURVE_ID = {self.id};\n" p = bigint_split(self.p, N_LIMBS, BASE) n = bigint_split(self.n, N_LIMBS, BASE) a = bigint_split(self.a, N_LIMBS, BASE) b = bigint_split(self.b, N_LIMBS, BASE) g = bigint_split(self.fp_generator, N_LIMBS, BASE) min_one = bigint_split(-1 % self.p, N_LIMBS, BASE) for i, limb in enumerate(p): code += f"const P{i} = {hex(limb)};\n" for i, limb in enumerate(n): code += f"const N{i} = {hex(limb)};\n" for i, limb in enumerate(a): code += f"const A{i} = {hex(limb)};\n" for i, limb in enumerate(b): code += f"const B{i} = {hex(limb)};\n" for i, limb in enumerate(g): code += f"const G{i} = {hex(limb)};\n" for i, limb in enumerate(min_one): code += f"const MIN_ONE_D{i} = {hex(limb)};\n" code += "}\n" return code def to_cairo_one(self) -> str: code = f"const {self.cairo_zero_namespace_name.upper()}:Curve = \n" code += "Curve {\n" code += f"p:{int_to_u384(self.p)},\n" code += f"n:{int_to_u256(self.n)},\n" code += f"a:{int_to_u384(self.a)},\n" code += f"b:{int_to_u384(self.b)},\n" code += f"g:{int_to_u384(self.fp_generator)},\n" code += f"min_one:{int_to_u384(-1%self.p)},\n" code += f"G: {G1Point(self.Gx, self.Gy, CurveID(self.id)).to_cairo_1()},\n" code += "};\n" return code @dataclass(slots=True, frozen=True) class TwistedEdwardsCurve(WeierstrassCurve): """ Twisted Edwards curve is a curve of the form ax^2 + y^2 = 1 + dx^2y^2. Equivalent to a Weierstrass curve of the form y^2 = x^3 + ax + b. Automatic conversion of parameters is done in the constructor. """ a_twisted: int # Twisted Edwards curve parameter d_twisted: int # Twisted Edwards curve parameter def __init__( self, cairo_zero_namespace_name: str, id: int, p: int, n: int, h: int, d_twisted: int, a_twisted: int, fp_generator: int, Gx: int, Gy: int, swu_params: SWUParams, eigen_value: int | None = None, third_root_of_unity: int | None = None, ): assert a_twisted != 0 and d_twisted != 0 and a_twisted != d_twisted # Set attributes object.__setattr__(self, "d_twisted", d_twisted) object.__setattr__(self, "a_twisted", a_twisted) object.__setattr__(self, "p", p) object.__setattr__(self, "swu_params", swu_params) object.__setattr__(self, "eigen_value", eigen_value) object.__setattr__(self, "third_root_of_unity", third_root_of_unity) # Calculate Weierstrass parameters a = ( -1 * pow(48, -1, p) * (a_twisted**2 + 14 * a_twisted * d_twisted + d_twisted**2) % p ) b = ( pow(864, -1, p) * (a_twisted + d_twisted) * (-(a_twisted**2) + 34 * a_twisted * d_twisted - d_twisted**2) % p ) WeierstrassCurve.__init__( self, cairo_zero_namespace_name, id, p, n, h, a, b, fp_generator, *(self.to_weierstrass(Gx, Gy)), swu_params, eigen_value, third_root_of_unity, ) def to_weierstrass(self, x_twisted, y_twisted): a = self.a_twisted d = self.d_twisted return ( (5 * a + a * y_twisted - 5 * d * y_twisted - d) * pow(12 - 12 * y_twisted, -1, self.p) % self.p, (a + a * y_twisted - d * y_twisted - d) * pow(4 * x_twisted - 4 * x_twisted * y_twisted, -1, self.p) % self.p, ) def to_twistededwards(self, x_weirstrass: int, y_weirstrass: int): a = self.a_twisted d = self.d_twisted y = ( (5 * a - 12 * x_weirstrass - d) * pow(-12 * x_weirstrass - a + 5 * d, -1, self.p) % self.p ) x = ( (a + a * y - d * y - d) * pow(4 * y_weirstrass - 4 * y_weirstrass * y, -1, self.p) % self.p ) return (x, y) @dataclass(slots=True, frozen=True) class PairingCurve(WeierstrassCurve): x: int # curve x parameter irreducible_polys: dict[int, list[int]] nr_a0: int # E2 non residue nr_a1: int b20: int b21: int # E2: b is (b20, b21) loop_counter: list[int] line_function_sparsity: list[ int ] # 0: ==0, 1: !=0, 2: ==1.. L(x) = Σ(sparsity[i] * coeff[i] * x^i ) final_exp_cofactor: int G2x: tuple[int, int] G2y: tuple[int, int] def NAF(x): if x == 0: return [] z = 0 if x % 2 == 0 else 2 - (x % 4) return NAF((x - z) // 2) + [z] def jy00(value: int) -> list[int]: """ This is a minimum-Hamming-Weight left-to-right recoding. It outputs signed {-1, 0, 1} bits from MSB to LSB with minimal Hamming Weight to minimize operations in Miller Loops and vartime scalar multiplications - Optimal Left-to-Right Binary Signed-Digit Recoding Joye, Yen, 2000 https://marcjoye.github.io/papers/JY00sd2r.pdf """ def bit(value, index): return (value >> index) & 1 bi, bi1, ri, ri1, ri2 = 0, 0, 0, 0, 0 bits = value.bit_length() recoded = [] for i in range(bits, -1, -1): if i == bits: ri1, ri2 = bit(value, bits - 1), bit(value, bits - 2) else: bi, ri = bi1, ri1 ri1, ri2 = ri2, bit(value, i - 2) if i >= 2 else 0 bi1 = (bi + ri1 + ri2) >> 1 recoded.append(-2 * bi + ri + bi1) return recoded GARAGA_RS_SUPPORTED_CURVES = {BN254_ID, BLS12_381_ID} Curve: TypeAlias = WeierstrassCurve CURVES: dict[int, WeierstrassCurve] = { BN254_ID: PairingCurve( cairo_zero_namespace_name="bn", id=BN254_ID, p=0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47, n=0x30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001, x=0x44E992B44A6909F1, h=1, irreducible_polys={ 6: [82, 0, 0, -18, 0, 0, 1], 12: [82, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0, 0, 1], }, nr_a0=9, nr_a1=1, a=0, b=3, b20=0x2B149D40CEB8AAAE81BE18991BE06AC3B5B4C5E559DBEFA33267E6DC24A138E5, b21=0x9713B03AF0FED4CD2CAFADEED8FDF4A74FA084E52D1852E4A2BD0685C315D2, loop_counter=jy00(6 * 0x44E992B44A6909F1 + 2)[::-1], line_function_sparsity=[ 2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, ], final_exp_cofactor=1469306990098747947464455738335385361638823152381947992820, # cofactor = 2 * x0 * (6 * x0**2 + 3 * x0 + 1) fp_generator=3, Gx=0x1, Gy=0x2, G2x=( 0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED, 0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2, ), G2y=( 0x12C85EA5DB8C6DEB4AAB71808DCB408FE3D1E7690C43D37B4CE6CC0166FA7DAA, 0x90689D0585FF075EC9E99AD690C3395BC4B313370B38EF355ACDADCD122975B, ), swu_params=None, eigen_value=0xB3C4D79D41A917585BFC41088D8DAAA78B17EA66B99C90DD, third_root_of_unity=0x59E26BCEA0D48BACD4F263F1ACDB5C4F5763473177FFFFFE, ), BLS12_381_ID: PairingCurve( cairo_zero_namespace_name="bls", id=BLS12_381_ID, p=0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAB, n=0x73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF00000001, x=-0xD201000000010000, h=0x396C8C005555E1568C00AAAB0000AAAB, irreducible_polys={ 6: [2, 0, 0, -2, 0, 0, 1], 12: [2, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 1], }, nr_a0=1, nr_a1=1, a=0, b=4, b20=4, b21=4, loop_counter=[int(x) for x in bin(0xD201000000010000)[2:][::-1]], line_function_sparsity=[ 1, 0, 1, 2, 0, 0, 1, 0, 1, 0, 0, 0, ], final_exp_cofactor=3, fp_generator=3, Gx=0x17F1D3A73197D7942695638C4FA9AC0FC3688C4F9774B905A14E3A3F171BAC586C55E83FF97A1AEFFB3AF00ADB22C6BB, Gy=0x08B3F481E3AAA0F1A09E30ED741D8AE4FCF5E095D5D00AF600DB18CB2C04B3EDD03CC744A2888AE40CAA232946C5E7E1, G2x=( 0x24AA2B2F08F0A91260805272DC51051C6E47AD4FA403B02B4510B647AE3D1770BAC0326A805BBEFD48056C8C121BDB8, 0x13E02B6052719F607DACD3A088274F65596BD0D09920B61AB5DA61BBDC7F5049334CF11213945D57E5AC7D055D042B7E, ), G2y=( 0xCE5D527727D6E118CC9CDC6DA2E351AADFD9BAA8CBDD3A76D429A695160D12C923AC9CC3BACA289E193548608B82801, 0x606C4A02EA734CC32ACD2B02BC28B99CB3E287E85A763AF267492AB572E99AB3F370D275CEC1DA1AAA9075FF05F79BE, ), swu_params=SWUParams( A=0x144698A3B8E9433D693A02C96D4982B0EA985383EE66A8D8E8981AEFD881AC98936F8DA0E0F97F5CF428082D584C1D, B=0x12E2908D11688030018B12E8753EEE3B2016C1F0F24F4070A0B9C14FCEF35EF55A23215A316CEAA5D1CC48E98E172BE0, Z=11, ), eigen_value=0xAC45A4010001A40200000000FFFFFFFF, third_root_of_unity=0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAC, ), SECP256K1_ID: WeierstrassCurve( cairo_zero_namespace_name="secp256k1", id=SECP256K1_ID, p=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F, n=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141, h=1, a=0, b=7, fp_generator=3, Gx=0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, Gy=0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8, swu_params=None, eigen_value=0x5363AD4CC05C30E0A5261C028812645A122E22EA20816678DF02967C1B23BD72, third_root_of_unity=0x7AE96A2B657C07106E64479EAC3434E99CF0497512F58995C1396C28719501EE, ), SECP256R1_ID: WeierstrassCurve( cairo_zero_namespace_name="secp256r1", id=SECP256R1_ID, p=0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF, n=0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551, h=1, a=0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC, b=0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B, fp_generator=6, Gx=0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296, Gy=0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5, swu_params=None, eigen_value=None, third_root_of_unity=None, ), ED25519_ID: TwistedEdwardsCurve( cairo_zero_namespace_name="ED25519", # See https://neuromancer.sk/std/other/Ed25519 id=ED25519_ID, p=0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED, n=0x1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED, h=8, d_twisted=0x52036CEE2B6FFE738CC740797779E89800700A4D4141D8AB75EB4DCA135978A3, a_twisted=0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC, fp_generator=6, Gx=0x216936D3CD6E53FEC0A4E231FDD6DC5C692CC7609525A7B2C9562D608F25D51A, Gy=0x6666666666666666666666666666666666666666666666666666666666666658, swu_params=None, eigen_value=None, third_root_of_unity=None, ), GRUMPKIN_ID: WeierstrassCurve( cairo_zero_namespace_name="grumpkin", id=GRUMPKIN_ID, p=0x30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001, n=0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47, h=1, a=0, b=-17 % 0x30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001, fp_generator=5, Gx=0x1, Gy=0x2CF135E7506A45D632D270D45F1181294833FC48D823F272C, swu_params=None, eigen_value=None, third_root_of_unity=None, ), } def is_generator(g: int, p: int) -> bool: """ Checks if a given integer g is a generator of the multiplicative group of integers modulo p. Parameters: g (int): The integer to check. p (int): The prime number defining the finite field Fp. Returns: bool: True if g is a generator, False otherwise. Raises: ValueError: If p is not a prime number. Detailed Explanation: 1. The order of an element g in the multiplicative group Fp* must divide p-1. - The multiplicative group Fp* consists of all non-zero elements of the finite field Fp. - The group has p-1 elements because there are p-1 non-zero elements in Fp. - By Lagrange's theorem, the order of any element in a finite group must divide the order of the group. - Therefore, the order of any element g in Fp* must divide p-1. 2. If g is a generator, its order must be exactly p-1. 3. To verify that g has order p-1, we need to ensure that g does not have any smaller order that divides p-1. 4. The prime factorization of p-1 gives us all the possible divisors of p-1. 5. By checking g^((p-1)/q) for each prime factor q of p-1, we ensure that g does not have an order that is a proper divisor of p-1. 6. If g passes all these checks, it must have the full order p-1, making it a generator. 7. This method is efficient because it reduces the problem to checking a few exponentiations rather than testing all possible orders. Example: - Let p = 7, then p-1 = 6. - The prime factors of 6 are 2 and 3. - To check if g is a generator, we test: - g^(6/2) = g^3 - g^(6/3) = g^2 - If neither g^3 ≡ 1 (mod 7) nor g^2 ≡ 1 (mod 7), then g is a generator. - This ensures that g has the full order 6, covering all elements of F7*. """ import sympy # Ensure that p is a prime number if not sympy.isprime(p): raise ValueError("p must be a prime number.") # Calculate p - 1, which is the order of the multiplicative group of integers modulo p p_minus_1 = p - 1 # Factorize p - 1 to get its prime factors and their exponents # This is necessary because we will use these factors to test if g is a generator factors = sympy.factorint(p_minus_1) # Check if g is a generator for q in factors.keys(): # For each prime factor q of p - 1, check if g^((p-1)/q) ≡ 1 (mod p) # If g^((p-1)/q) ≡ 1 (mod p), then g is not a generator because it does not have the full order p-1 # This is based on the fact that if g is a generator, its order must be exactly p-1 # If g^((p-1)/q) ≡ 1 (mod p), it means the order of g divides (p-1)/q, which is less than p-1 if pow(g, p_minus_1 // q, p) == 1: return False # If g^((p-1)/q) ≠ 1 (mod p) for all prime factors q, then g is a generator # This means g has the full order p-1 and can generate all elements of the multiplicative group return True def get_base_field( curve_id: int | CurveID, field_type: type[PyFelt] | type[Fp2] = PyFelt ) -> BaseField | BaseFp2Field: """ Returns the base field for a given elliptic curve. Parameters: curve_id (int | CurveID): The ID of the elliptic curve. field_type (PyFelt | Fp2): The type of the field (default is PyFelt). Returns: BaseField | BaseFp2Field: The base field corresponding to the curve and field type. Raises: ValueError: If the field_type is invalid. """ if isinstance(curve_id, CurveID): curve_id = curve_id.value curve = CURVES[curve_id] if field_type == PyFelt: return BaseField(curve.p) elif field_type == Fp2: assert isinstance(curve, PairingCurve) return BaseFp2Field(curve.p) else: raise ValueError(f"Invalid field type: {field_type}. Expected PyFelt or Fp2.") def get_irreducible_poly(curve_id: int | CurveID, extension_degree: int) -> Polynomial: if isinstance(curve_id, CurveID): curve_id = curve_id.value curve = CURVES[curve_id] assert isinstance(curve, PairingCurve) field = get_base_field(curve_id) return Polynomial( coefficients=[field(x) for x in curve.irreducible_polys[extension_degree]] ) def replace_consecutive_zeros(lst): result = [] i = 0 while i < len(lst): if i < len(lst) - 1 and lst[i] == 0 and lst[i + 1] == 0: result.append(3) # Replace consecutive zeros with 3 i += 2 elif lst[i] == -1: result.append(2) # Replace -1 with 2 i += 1 else: result.append(lst[i]) i += 1 return result def recode_naf_bits(lst): result = [] i = 0 while i < len(lst): if i < len(lst) - 1 and lst[i] == 0 and (lst[i + 1] == 1 or lst[i + 1] == -1): # "01" or "0-1" if lst[i + 1] == 1: result.append(3) # Replace "01" with 3 else: result.append(4) # Replace "0-1" with 4 i += 2 elif i < len(lst) - 1 and (lst[i] == 1 or lst[i] == -1) and lst[i + 1] == 0: # "10" or "-10" if lst[i] == 1: result.append(1) # Replace 10 with 6 else: result.append(2) # Replace -10 with 7 i += 2 elif i < len(lst) - 1 and lst[i] == 0 and lst[i + 1] == 0: result.append(0) # Replace consecutive zeros with 0 i += 2 else: raise ValueError(f"Unexpected bit sequence at index {i}") return result if __name__ == "__main__": from garaga.points import G1Point r = recode_naf_bits(jy00(6 * 0x44E992B44A6909F1 + 2)[2:]) print(r, len(r)) from garaga.hints.io import int_to_u384 # bls = [int(x) for x in bin(0xD201000000010000)[2:]][2:] # recode_naf_bits(bls) def print_nbits_and_nG_glv_fake_glv(): for curve_id in CURVES: curve: WeierstrassCurve = CURVES[curve_id] if curve.is_endomorphism_available(): nbits = curve.n.bit_length() // 4 + 9 print( f"Curve {curve_id}: {nbits}, {G1Point.get_nG(CurveID(curve_id), 2 ** (nbits - 1)).to_cairo_1()}" ) print_nbits_and_nG_glv_fake_glv() def print_min_one_order(): for curve_id in CURVES: curve: WeierstrassCurve = CURVES[curve_id] print(f"Curve {curve_id}: min_one_order: {int_to_u384(-1 % curve.n)}") print_min_one_order() print() def print_third_root_of_unity(): for curve_id in CURVES: curve: WeierstrassCurve = CURVES[curve_id] if curve.is_endomorphism_available(): print( f"Curve {curve_id}: third_root_of_unity: {int_to_u384(curve.third_root_of_unity)}" ) print_third_root_of_unity() ================================================ FILE: hydra/garaga/drand/client.py ================================================ import binascii import functools import hashlib import random from dataclasses import dataclass from enum import Enum from typing import List, Optional, Union import requests from requests.exceptions import RequestException from garaga.curves import CurveID, Fp2, get_base_field from garaga.hints import io from garaga.points import G1Point, G2Point class DrandNetwork(Enum): default = "8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce" quicknet = "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971" def digest_func(round_number: int) -> bytes: assert isinstance(round_number, int) assert 0 <= round_number < 2**64 h = hashlib.sha256() h.update(round_number.to_bytes(8, byteorder="big")) return h.digest() @dataclass class NetworkInfo: public_key: Union[G1Point, G2Point] period: int genesis_time: int hash: str group_hash: str scheme_id: str beacon_id: Optional[str] = None @dataclass class RandomnessBeacon: round_number: int randomness: int signature: str previous_signature: Optional[str] = None @property def signature_point(self) -> G1Point | G2Point: return deserialize_bls_point(bytes.fromhex(self.signature)) BASE_URLS = [ "https://drand.cloudflare.com", "https://api.drand.sh", "https://api2.drand.sh", "https://api3.drand.sh", ] def make_request(endpoint: str) -> requests.Response: # Create a copy and shuffle instead of random.choice for better distribution base_urls = BASE_URLS.copy() random.shuffle(base_urls) last_error = None for url in base_urls: try: response = requests.get(f"{url}{endpoint}", timeout=5) # Add timeout response.raise_for_status() return response except Exception as e: print(f"Request to {url} failed: {str(e)}") last_error = e continue raise RequestException(f"All URLs failed. Last error: {last_error}") def deserialize_bls_point(s_string: bytes) -> Union[G1Point, G2Point]: m_byte = s_string[0] & 0xE0 if m_byte in (0x20, 0x60, 0xE0): raise ValueError("Invalid encoding") C_bit = (m_byte & 0x80) >> 7 # Compression bit I_bit = (m_byte & 0x40) >> 6 # Infinity bit S_bit = (m_byte & 0x20) >> 5 # Sign bit s_string = bytes([s_string[0] & 0x1F]) + s_string[1:] if I_bit == 1: if any(b != 0 for b in s_string): raise ValueError("Invalid encoding for point at infinity") return ( G1Point.infinity(CurveID.BLS12_381) if len(s_string) in (48, 96) else G2Point.infinity(CurveID.BLS12_381) ) if C_bit == 0: if len(s_string) == 96: # G1 point (uncompressed) x = int.from_bytes(s_string[:48], "big") y = int.from_bytes(s_string[48:], "big") return G1Point(x, y, CurveID.BLS12_381) elif len(s_string) == 192: # G2 point (uncompressed) x0 = int.from_bytes(s_string[:48], "big") x1 = int.from_bytes(s_string[48:96], "big") y0 = int.from_bytes(s_string[96:144], "big") y1 = int.from_bytes(s_string[144:], "big") return G2Point((x0, x1), (y0, y1), CurveID.BLS12_381) else: raise ValueError(f"Invalid length for uncompressed point: {len(s_string)}") else: # C_bit == 1 x = int.from_bytes(s_string, "big") if len(s_string) == 48: # G1 point (compressed) field = get_base_field(CurveID.BLS12_381) y2 = field(x**3 + 4) if S_bit == 1: y = y2.sqrt(min_root=False) else: y = y2.sqrt(min_root=True) return G1Point(x, y.value, CurveID.BLS12_381) elif len(s_string) == 96: # G2 point (compressed) field = get_base_field(CurveID.BLS12_381, Fp2) x = field((x & ((1 << 384) - 1), x >> 384)) y2 = x**3 + field((4, 4)) y = y2.sqrt() if S_bit == 1: # Choose largest root # print("choose largest") if not y.lexicographically_largest(): # print("root was not largest, negating") y = -y else: # Choose smallest root # print("choose smallest") if y.lexicographically_largest(): # print("root was largest, negating") y = -y return G2Point( (x.a0.value, x.a1.value), (y.a0.value, y.a1.value), CurveID.BLS12_381, ) else: raise ValueError(f"Invalid length for compressed point: {len(s_string)}") def get_chains() -> List[str]: response = make_request("/chains") all_chains = response.json() # only keep chains present in DrandNetwork enum chains = [ chain for chain in all_chains if chain in [network.value for network in DrandNetwork] ] return chains def get_chain_info(chain_hash: str) -> NetworkInfo: response = make_request(f"/{chain_hash}/info") data = response.json() # Parse the public key public_key_hex = data["public_key"] public_key_bytes = binascii.unhexlify(public_key_hex) try: public_key = deserialize_bls_point(public_key_bytes) except Exception as e: public_key = G2Point.infinity(CurveID.BLS12_381) return NetworkInfo( public_key=public_key, period=data["period"], genesis_time=data["genesis_time"], hash=data["hash"], group_hash=data["groupHash"], scheme_id=data["schemeID"], beacon_id=data.get("metadata", {}).get("beaconID"), ) def get_latest_randomness(chain_hash: str) -> RandomnessBeacon: response = make_request(f"/{chain_hash}/public/latest") return _parse_randomness_beacon(response.json()) def get_randomness(chain_hash: str, round_number: int) -> RandomnessBeacon: response = make_request(f"/{chain_hash}/public/{round_number}") return _parse_randomness_beacon(response.json()) def _parse_randomness_beacon(data: dict) -> RandomnessBeacon: return RandomnessBeacon( round_number=io.to_int(data["round"]), randomness=int(data["randomness"], 16), signature=data["signature"], previous_signature=data.get("previous_signature"), ) @functools.lru_cache(maxsize=None) def print_all_chain_info() -> dict[DrandNetwork, NetworkInfo]: # Try multiple times to get chains max_retries = 3 for attempt in range(max_retries): try: chains = get_chains() if not chains: raise ValueError("No chains returned") print(f"Found {len(chains)} chains: {chains}") print("-" * 40) chain_infos = {} expected_networks = set(DrandNetwork) for chain_hash in chains: try: info = get_chain_info(chain_hash) try: network = DrandNetwork(chain_hash) chain_infos[network] = info expected_networks.remove(network) print(f"Chain: {chain_hash}") print(f" Public Key: {info.public_key}") print(f" Period: {info.period} seconds") print(f" Genesis Time: {info.genesis_time}") print(f" Hash: {info.hash}") print(f" Group Hash: {info.group_hash}") print(f" Scheme ID: {info.scheme_id}") if info.beacon_id: print(f" Beacon ID: {info.beacon_id}") print("-" * 40) except ValueError: print(f"Unknown chain hash: {chain_hash}") continue except Exception as e: print(f"Error fetching info for chain {chain_hash}: {str(e)}") continue # If we found all expected networks, return the results if not expected_networks: return chain_infos print(f"Missing networks: {[n.name for n in expected_networks]}") except Exception as e: print(f"Attempt {attempt + 1}/{max_retries} failed: {str(e)}") if attempt < max_retries - 1: print("Retrying...") continue raise RuntimeError( f"Failed to get complete chain info after {max_retries} attempts" ) # Example usage if __name__ == "__main__": chain_infos = print_all_chain_info() from garaga.modulo_circuit_structs import StructArray from garaga.signature import hash_to_curve # latest_randomness = get_latest_randomness(chain_infos[DrandNetwork.default].hash) # print("Latest randomness:", latest_randomness) network = DrandNetwork.quicknet chain = chain_infos[network] print(chain.public_key) print(-chain.public_key) round = get_randomness(chain.hash, 1000) print("Randomness for round 1000:", round) sha256 = hashlib.sha256() sha256.update(bytes.fromhex(round.signature)) print("randomness", sha256.hexdigest()) print("random beacon", hex(round.randomness)) msg_point = hash_to_curve( digest_func(round.round_number), CurveID.BLS12_381, "sha256" ) print("message", msg_point) from garaga.modulo_circuit_structs import G2Line, StructArray from garaga.points import G1G2Pair from garaga.precompiled_circuits.multi_miller_loop import precompute_lines print( "pairing", G1G2Pair.pair( [ G1G2Pair( p=round.signature_point, q=G2Point.get_nG(CurveID.BLS12_381, 1) ), G1G2Pair(p=msg_point, q=-chain.public_key), ], curve_id=CurveID.BLS12_381, ).value_coeffs, ) lines = precompute_lines([G2Point.get_nG(CurveID.BLS12_381, 1), -chain.public_key]) precomputed_lines = StructArray( name="lines", elmts=[ G2Line(name=f"line{i}", elmts=lines[i : i + 4]) for i in range(0, len(lines), 4) ], ) def generate_precomputed_lines_code(precomputed_lines: StructArray) -> str: return f"pub const precomputed_lines: [G2Line; {len(precomputed_lines)//4}] = {precomputed_lines.serialize(raw=True, const=True)};" # print(generate_precomputed_lines_code(precomputed_lines)) ================================================ FILE: hydra/garaga/drand/tlock.py ================================================ import hashlib import secrets from dataclasses import dataclass from typing import Optional from garaga.curves import CURVES, CurveID from garaga.drand.client import DrandNetwork, digest_func from garaga.hints import io from garaga.hints.tower_backup import E12 from garaga.points import G1G2Pair, G1Point, G2Point from garaga.signature import hash_to_curve @dataclass class CipherText: U: G2Point V: bytes W: bytes def __post_init__(self): assert len(self.V) == len(self.W) == 16 def serialize_to_cairo(self): code = f"""CipherText {{ U: {self.U.serialize_to_cairo(name="U", raw=True)}, V: [{', '.join(f'0x{b:02x}' for b in self.V)}], W: [{', '.join(f'0x{b:02x}' for b in self.W)}], }} """ return code def serialize_to_calldata(self) -> list[int]: cd = [] cd.extend(io.bigint_split(self.U.x[0])) cd.extend(io.bigint_split(self.U.x[1])) cd.extend(io.bigint_split(self.U.y[0])) cd.extend(io.bigint_split(self.U.y[1])) for b in self.V: cd.append(b) for b in self.W: cd.append(b) return cd def encrypt_for_round( drand_public_key: G2Point, round: int, message: bytes, debug: bool = False, fixed_sigma: Optional[bytes] = None, ) -> CipherText: assert len(message) == 16, f"Message should be 16 bytes: {len(message)}" assert ( fixed_sigma is None or len(fixed_sigma) == 16 ), f"Fixed sigma should be 16 bytes: {len(fixed_sigma)}" msg_at_round = digest_func(round) # print(f"msg_at_round list of ints: {list(msg_at_round)}") pt_at_round = hash_to_curve(msg_at_round, CurveID.BLS12_381) gid: E12 = G1G2Pair.pair([G1G2Pair(p=pt_at_round, q=drand_public_key)]) if debug: # Use a fixed sigma for debugging: sigma = b"0000000000000000" if fixed_sigma is None else fixed_sigma else: sigma: bytes = secrets.token_bytes(16) assert len(sigma) == 16 hasher = hashlib.sha256() hasher.update(b"IBE-H3") hasher.update(sigma) hasher.update(message) r = int.from_bytes(expand_message_drand(hasher.digest(), 32), "little") # print(f"r list of ints: {r}") r = r % CURVES[CurveID.BLS12_381.value].n # U = r * G2 U = G2Point.get_nG(CurveID.BLS12_381, r) # print(f"U: {U}") # V = sigma XOR H (rGid) rGid: E12 = gid**r # print(f"rGid: {rGid.value_coeffs}") rgid_serialized = rGid.serialize() # Print bytes as hex strings: # print(f"rGid hex : {rgid_serialized.hex()}") # print(f"rGid serialized: {list(rgid_serialized)} len: {len(rgid_serialized)}") rgid_hash = hashlib.sha256() rgid_hash.update(b"IBE-H2") rgid_hash.update(rgid_serialized) rgid_hash = rgid_hash.digest() # Take first 16 bytes only : rgid_hash = rgid_hash[:16] # print(f"rgid_hash hex: {rgid_hash.hex()}") V = bytes([a ^ b for a, b in zip(sigma, rgid_hash)]) # print(f"V hex: {V.hex()}") # 6. Compute W = M XOR H(sigma) W = bytes([a ^ b for a, b in zip(message, rgid_hash)]) sigma_hash = hashlib.sha256() sigma_hash.update(b"IBE-H4") sigma_hash.update(sigma) sigma_hash = sigma_hash.digest()[:16] # First 16 bytes only # print(f"sigma_hash hex: {sigma_hash.hex()}") W = bytes([a ^ b for a, b in zip(message, sigma_hash)]) # print(f"W hex: {W.hex()}") return CipherText(U, V, W) def decrypt_at_round(signature_at_round: G1Point, c: CipherText): # 1. Compute sigma = V XOR H2(e(rP,Sig)) r_gid: E12 = G1G2Pair.pair([G1G2Pair(p=signature_at_round, q=c.U)]) # for i, v in enumerate(r_gid.value_coeffs): # print(f"rgid_{i}: {io.int_to_u384(v, as_hex=False)}") r_gid_serialized = r_gid.serialize() rgid_hash = hashlib.sha256() pre_image = bytearray(b"IBE-H2") pre_image.extend(r_gid_serialized) rgid_hash.update(pre_image) # for i in range(0, len(pre_image), 4): # print(f"pre_image[{i}:{i+4}]: {pre_image[i:i+4].hex()}") rgid_hash = rgid_hash.digest() rgid_hash = rgid_hash[:16] # First 16 bytes only sigma = bytes([a ^ b for a, b in zip(c.V, rgid_hash)]) # print(f"sigma hex: {sigma.hex()}") # 2. Compute Msg = W XOR H4(sigma) sigma_hash = hashlib.sha256() sigma_hash.update(b"IBE-H4") sigma_hash.update(sigma) sigma_hash = sigma_hash.digest()[:16] # First 16 bytes only message = bytes([a ^ b for a, b in zip(c.W, sigma_hash)]) # print(f"message utf-8: {message.decode('utf-8')}") # 3. Check U = G^r rh = hashlib.sha256() rh.update(b"IBE-H3") rh.update(sigma) rh.update(message) rh = rh.digest() rh = expand_message_drand(rh, 32) r = int.from_bytes(rh, "little") r = r % CURVES[CurveID.BLS12_381.value].n U = G2Point.get_nG(CurveID.BLS12_381, r) assert U == c.U return message def expand_message_drand(msg: bytes, buf_size: int) -> bytes: BITS_TO_MASK_FOR_BLS12381 = 1 order = CURVES[CurveID.BLS12_381.value].n for i in range(1, 65536): # u16::MAX is 65535 # Hash iteratively: H(i || msg) h = hashlib.sha256() pre_image = bytearray(i.to_bytes(2, byteorder="little")) pre_image.extend(msg) h.update(pre_image) hash_result = bytearray(h.digest()) # Mask the first byte hash_result[0] >>= BITS_TO_MASK_FOR_BLS12381 reversed_hash = hash_result[::-1] scalar = int.from_bytes(reversed_hash, "little") % order if scalar != 0: return reversed_hash[:buf_size] raise ValueError( "You are insanely unlucky and should have been hit by a meteor before now" ) def write_cairo1_test(msg: bytes, round: int, network: DrandNetwork): chain_infos = print_all_chain_info() chain = chain_infos[network] master = chain.public_key ciphertext: CipherText = encrypt_for_round(master, round, msg, debug=True) signature_at_round = get_randomness(chain.hash, round).signature_point _ = decrypt_at_round(signature_at_round, ciphertext) comment_with_params_used = f""" // msg: {msg} // round: {round} // network: {network} """ code = f""" #[test] fn test_decrypt_at_round() {{ {comment_with_params_used} {signature_at_round.serialize_to_cairo(name="signature_at_round")} let ciph = {ciphertext.serialize_to_cairo()}; let msg_decrypted = decrypt_at_round(signature_at_round, ciph); assert(msg_decrypted.span() == [{', '.join(f'0x{b:02x}' for b in msg)}].span(), 'wrong msg'); }} """ return code if __name__ == "__main__": from garaga.drand.client import DrandNetwork, get_randomness, print_all_chain_info # chain_infos = print_all_chain_info() network = DrandNetwork.quicknet # chain = chain_infos[network] # master = chain.public_key round = 128 msg = b"hello\x00\x00\x00\x00\x00\x00\x00\x00abc" # ciph = encrypt_for_round(master, round, msg) # # print(f"CipherText: {ciph}") # # print(f"V : {list(ciph.V)}") # # print(f"W : {list(ciph.W)}") # chain = chain_infos[network] # beacon = get_randomness(chain.hash, round) # signature_at_round = beacon.signature_point # print(f"signature_at_round: {signature_at_round}") # msg_decrypted = decrypt_at_round(signature_at_round, ciph) # assert msg_decrypted == msg # print(f"msg utf-8: {msg.decode('utf-8')}") # print(f"msg_decrypted utf-8: {msg_decrypted.decode('utf-8')}") code = write_cairo1_test(msg, round, network) print(code) ================================================ FILE: hydra/garaga/extension_field_modulo_circuit.py ================================================ from dataclasses import dataclass, field from enum import Enum from garaga.algebra import Polynomial, PyFelt from garaga.curves import N_LIMBS, get_irreducible_poly from garaga.hints.extf_mul import ( nondeterministic_extension_field_div, nondeterministic_extension_field_mul_divmod, ) from garaga.modulo_circuit import BATCH_SIZE, ModuloCircuitElement, WriteOps from garaga.poseidon_transcript import CairoPoseidonTranscript from garaga.precompiled_circuits.fp2 import Fp2Circuits POSEIDON_BUILTIN_SIZE = 6 POSEIDON_OUTPUT_S1_INDEX = 4 # Represents the state of the accumulation of the equation # c_i * Π(Pi(z)) = c_i*Q_i*P + c_i*R_i inside the circuit. # Only store ci*Π(Pi(z)) (as Emulated Field Element) and ci*R_i (as Polynomial) @dataclass(slots=True) class EuclideanPolyAccumulator: lhs: ModuloCircuitElement R: list[ModuloCircuitElement] R_evaluated: ModuloCircuitElement class AccPolyInstructionType(Enum): MUL = "MUL" DIV = "DIV" SQUARE_TORUS = "SQUARE_TORUS" @dataclass(slots=True) class AccumulatePolyInstructions: Pis: list[list[list[ModuloCircuitElement]]] = field(default_factory=list) Qis: list[Polynomial] = field(default_factory=list) Ris: list[list[ModuloCircuitElement]] = field(default_factory=list) Ps_sparsities: list[None | list[list[int]]] = field(default_factory=list) r_sparsities: list[None | list[int]] = field(default_factory=list) types: list[AccPolyInstructionType] = field(default_factory=list) n: int = field(default=0) rlc_coeffs: list[ModuloCircuitElement] = field(default_factory=list) Pis_of_Z: list[ModuloCircuitElement] = field(default_factory=list) def append( self, type: AccPolyInstructionType, Pis: list[list[ModuloCircuitElement]], Q: Polynomial, R: list[ModuloCircuitElement], Ps_sparsities: None | list[list[int] | None] = None, r_sparsity: None | list[int] = None, ): if type != AccPolyInstructionType.MUL: assert len(Pis) == 2 self.types.append(type) self.Pis.append(Pis) self.Qis.append(Q) self.Ris.append(R) self.Ps_sparsities.append(Ps_sparsities) self.r_sparsities.append(r_sparsity) self.n += 1 class ExtensionFieldModuloCircuit(Fp2Circuits): def __init__( self, name: str, curve_id: int, extension_degree: int, init_hash: int = None, hash_input: bool = True, compilation_mode: int = 0, generic_circuit: bool = False, ) -> None: super().__init__( name=name, curve_id=curve_id, compilation_mode=compilation_mode, generic_circuit=generic_circuit, ) self.class_name = "ExtensionFieldModuloCircuit" self.extension_degree = extension_degree self.z_powers: list[ModuloCircuitElement] = [] self.acc: list[EuclideanPolyAccumulator] = [ self._init_accumulator(self.extension_degree), self._init_accumulator(self.extension_degree * 2), ] self.hash_input = hash_input self.transcript: CairoPoseidonTranscript = CairoPoseidonTranscript( init_hash=( int.from_bytes(self.name.encode(), "big") if init_hash is None else init_hash ) ) self.z_powers: list[ModuloCircuitElement] = [] self.ops_counter = { "Circuit": self.name, "EXTF_SQUARE": 0, "EXTF_MUL_DENSE": 0, # "EXTF_DIV": 0, } self.accumulate_poly_instructions: list[AccumulatePolyInstructions] = [ AccumulatePolyInstructions(), AccumulatePolyInstructions(), ] def _init_accumulator(self, extension_degree: int = None): extension_degree = extension_degree or self.extension_degree # Todo : Add compilation mode 1 support if self.compilation_mode == 1: return EuclideanPolyAccumulator( lhs=None, R=[None] * extension_degree, R_evaluated=None, ) else: return EuclideanPolyAccumulator( lhs=self.set_or_get_constant(0), R=[None] * extension_degree, R_evaluated=self.set_or_get_constant(0), ) @property def commitments(self): return [ self.values_segment.segment_stacks[WriteOps.COMMIT][offset].felt for offset in sorted(self.values_segment.segment_stacks[WriteOps.COMMIT]) ] @property def circuit_input(self): return [ self.values_segment.segment_stacks[WriteOps.INPUT][offset].felt for offset in sorted(self.values_segment.segment_stacks[WriteOps.INPUT]) ] def create_lines_z_powers(self, z: PyFelt, add_extf_power: bool = False): """ Create powers of z for the evaluation of lines functions and the irreducible polynomial if add_extf_power is True. """ powers = [z] # z^1 at index 0 if self.curve_id == 0: powers.append(self.square(z, "compute z^2")) # z^2 at index 1 powers.append(self.mul(powers[-1], z, "compute z^3")) # z^3 at index 2 powers.append(None) # No z^4 at index 3 powers.append(None) # No z^5 at index 4 powers.append(self.square(powers[2], "compute z^6")) # z^6 at index 5 powers.append(self.mul(powers[5], z, "compute z^7")) # z^7 at index 6 powers.append(None) # No z^8 at index 7 powers.append( self.mul(powers[6], powers[1], "compute z^9") ) # z^9 at index 8 if add_extf_power: # Need to add z^12 : # z^12 = z^9 * z^3 powers.append(None) # No z^10 at index 9 powers.append(None) # No z^11 at index 10 powers.append(self.mul(powers[8], powers[2], "compute z^12")) self.z_powers = powers elif self.curve_id == 1: # Need z^2, z^3, z^6, Z^8: powers.append(self.square(z, "compute z^2")) # z^2 at index 1 powers.append(self.mul(powers[-1], z, "compute z^3")) # z^3 at index 2 powers.append(None) # No z^4 at index 3 powers.append(None) # No z^5 at index 4 powers.append(self.square(powers[2], "compute z^6")) # z^6 at index 5 powers.append(None) # No z^7 at index 6 powers.append( self.mul(powers[5], powers[1], "compute z^8") ) # z^8 at index 7 self.z_powers = powers if add_extf_power: # Need to add z^12 : # z^12 = z^7 * z^5 powers.append(None) # No z^9 at index 8 powers.append(None) # No z^10 at index 9 powers.append(None) # No z^11 at index 10 powers.append(self.mul(powers[7], powers[4], "compute z^12")) else: raise ValueError(f"Invalid curve id: {self.curve_id}") def create_powers_of_Z( self, Z: PyFelt | ModuloCircuitElement, max_degree: int = None, ) -> list[ModuloCircuitElement]: if max_degree is None: max_degree = self.extension_degree if isinstance(Z, PyFelt): Z = self.write_cairo_native_felt(Z) elif isinstance(Z, int): Z = self.write_cairo_native_felt(self.field(Z)) elif isinstance(Z, ModuloCircuitElement): pass else: raise ValueError(f"Invalid type for Z: {type(Z)}") powers = [Z] for i in range(2, max_degree + 1): powers.append(self.mul(powers[-1], powers[0], comment=f"Compute z^{i}")) self.z_powers = powers return powers def eval_poly_in_precomputed_Z( self, X: list[ModuloCircuitElement], sparsity: list[int] = None, poly_name: str = None, ) -> ModuloCircuitElement: """ Evaluates a polynomial with coefficients `X` at precomputed powers of z. X(z) = X_0 + X_1 * z + X_2 * z^2 + ... + X_n * z^n If a `sparsity` list is provided, it is used to optimize the evaluation by skipping zero coefficients and applying special handling based on sparsity values: - A sparsity value of 0 indicates that the corresponding coefficient X_i is zero and should be skipped. - A sparsity value of 1 indicates that the corresponding coefficient X_i is non-zero and should be included in the evaluation. - A sparsity value of 2 indicates a special case where the term is directly a power of z, implying the coefficient X_i is 1 in this case. Parameters: - X: list[ModuloCircuitElement] - The coefficients of the polynomial to be evaluated. - sparsity: list[int] (optional) - A list indicating the sparsity of the polynomial. If None, the polynomial is treated as fully dense. Returns: - ModuloCircuitElement: The result of evaluating the polynomial at the precomputed powers of z. """ if poly_name is None: poly_name = "UnnamedPoly" if sparsity: first_non_zero_idx = next( (i for i, x in enumerate(sparsity) if x != 0), None ) if first_non_zero_idx == 0: match sparsity[0]: case 0: X_of_z = self.set_or_get_constant(0) case 1: X_of_z = X[0] case 2: X_of_z = self.set_or_get_constant(1) case _: raise ValueError(f"Invalid sparsity value: {sparsity[0]}") else: match sparsity[first_non_zero_idx]: case 0: X_of_z = self.set_or_get_constant(0) case 1: X_of_z = self.mul( X[first_non_zero_idx], self.z_powers[first_non_zero_idx - 1], comment=f"Eval sparse poly {poly_name} step coeff_{first_non_zero_idx} * z^{first_non_zero_idx}", ) case 2: X_of_z = self.z_powers[first_non_zero_idx - 1] case _: raise ValueError(f"Invalid sparsity value: {sparsity[0]}") for i in range(first_non_zero_idx + 1, len(X)): match sparsity[i]: case 1: term = self.mul( X[i], self.z_powers[i - 1], comment=f"Eval sparse poly {poly_name} step coeff_{i} * z^{i}", ) add_comment = ( f"Eval sparse poly {poly_name} step + coeff_{i} * z^{i}" ) case 2: term = self.z_powers[ i - 1 ] # In this case, sparsity[i] == 2 => X[i] = 1 add_comment = f"Eval sparse poly {poly_name} step + 1*z^{i}" case 0: continue case _: raise ValueError(f"Invalid sparsity value: {sparsity[i]}") X_of_z = self.add( X_of_z, term, comment=add_comment, ) else: X_of_z = self.eval_poly(X, self.z_powers, poly_name, "z") return X_of_z def extf_mul( self, Ps: list[list[ModuloCircuitElement]], extension_degree: int, Ps_sparsities: list[list[int] | None] = None, r_sparsity: list[int] = None, acc_index: int = 0, ) -> list[ModuloCircuitElement]: """ Multiply in the extension field X * Y mod irreducible_poly Commit to R and add an EvalPolyInstruction to the accumulator. """ assert ( extension_degree > 2 ), f"extension_degree={extension_degree} <= 2. Use self.mul or self.fp2_square instead." if Ps_sparsities is None: Ps_sparsities = [None] * len(Ps) assert len(Ps_sparsities) == len( Ps ), f"len(Ps_sparsities)={len(Ps_sparsities)} != len(Ps)={len(Ps)}" Q, R = nondeterministic_extension_field_mul_divmod( Ps, self.curve_id, extension_degree ) R = self.write_elements(R, WriteOps.COMMIT, r_sparsity) if not any(sparsity for sparsity in Ps_sparsities) or not r_sparsity: self.ops_counter["EXTF_MUL_DENSE"] += 1 self.accumulate_poly_instructions[acc_index].append( AccPolyInstructionType.MUL, Ps, Polynomial(Q), R, Ps_sparsities, r_sparsity, ) return R def extf_div( self, X: list[ModuloCircuitElement], Y: list[ModuloCircuitElement], extension_degree: int, acc_index: int = 0, ) -> list[ModuloCircuitElement]: x_over_y = nondeterministic_extension_field_div( X, Y, self.curve_id, extension_degree ) x_over_y = self.write_elements(x_over_y, WriteOps.COMMIT) Q, _ = nondeterministic_extension_field_mul_divmod( [x_over_y, Y], self.curve_id, extension_degree ) # R should be X Q = Polynomial(Q) self.accumulate_poly_instructions[acc_index].append( AccPolyInstructionType.DIV, Pis=[x_over_y, Y], Q=Q, R=X ) return x_over_y def extf_inv( self, Y: list[ModuloCircuitElement], extension_degree: int, acc_index: int = 0, ) -> list[ModuloCircuitElement]: one = [ModuloCircuitElement(self.field(1), -1)] + [ ModuloCircuitElement(self.field(0), -1) ] * (extension_degree - 1) y_inv = nondeterministic_extension_field_div( one, Y, self.curve_id, extension_degree, ) y_inv = self.write_elements(y_inv, WriteOps.COMMIT) Q, _ = nondeterministic_extension_field_mul_divmod( [y_inv, Y], self.curve_id, extension_degree ) # R should be One. Passed at mocked modulo circuits element since fully determined by its sparsity. Q = Polynomial(Q) self.accumulate_poly_instructions[acc_index].append( AccPolyInstructionType.DIV, Pis=[y_inv, Y], Q=Q, R=one, r_sparsity=[2] + [0] * (extension_degree - 1), ) return y_inv def conjugate_e12d( self, e12d: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: assert len(e12d) == 12 return [ e12d[0], self.neg(e12d[1]), e12d[2], self.neg(e12d[3]), e12d[4], self.neg(e12d[5]), e12d[6], self.neg(e12d[7]), e12d[8], self.neg(e12d[9]), e12d[10], self.neg(e12d[11]), ] def update_LHS_state( self, s1: PyFelt, Ps: list[list[ModuloCircuitElement]], Ps_sparsities: list[list[int] | None] = None, acc_index: int = 0, ): # Sanity checks for sparsities Ps_sparsities = Ps_sparsities or [None] * len(Ps) assert len(Ps_sparsities) == len( Ps ), f"len(Ps_sparsities)={len(Ps_sparsities)} != len(Ps)={len(Ps)}" for i, sparsity in enumerate(Ps_sparsities): if sparsity: assert all( Ps[i][j].value == 0 for j in range(len(Ps[i])) if sparsity[j] == 0 ) assert all( Ps[i][j].value == 1 for j in range(len(Ps[i])) if sparsity[j] == 2 ) # Evaluate LHS = Π(Pi(z)) inside circuit. # i=0 LHS = self.eval_poly_in_precomputed_Z(Ps[0], Ps_sparsities[0]) LHS_current_eval = LHS # Keep P0(z) self.accumulate_poly_instructions[acc_index].Pis_of_Z.append([]) self.accumulate_poly_instructions[acc_index].Pis_of_Z[-1].append(LHS) for i in range(1, len(Ps)): if Ps[i - 1] == Ps[i]: # Consecutives elements are the same : retrieve previous evaluation. LHS_current_eval = self.accumulate_poly_instructions[ acc_index ].Pis_of_Z[-1][-1] # Todo : support smarter analysis to save a few muls else: LHS_current_eval = self.eval_poly_in_precomputed_Z( Ps[i], Ps_sparsities[i] ) # Keep Pi(z) self.accumulate_poly_instructions[acc_index].Pis_of_Z[-1].append( LHS_current_eval ) # Update LHS LHS = self.mul(LHS, LHS_current_eval) ci_XY_of_z = self.mul(s1, LHS, "ci_XY_of_z") LHS_acc = self.add(self.acc[acc_index].lhs, ci_XY_of_z, "LHS_acc") # Update LHS only. self.acc[acc_index] = EuclideanPolyAccumulator( lhs=LHS_acc, R=self.acc[acc_index].R, R_evaluated=self.acc[acc_index].R_evaluated, ) return def update_RHS_state( self, type: AccPolyInstructionType, s1: ModuloCircuitElement, R: list[ModuloCircuitElement], r_sparsity: list[int] = None, acc_index: int = 0, instruction_index: int = 0, ): # Find if R_of_z is already computed in the first Pi of the next instruction. # In this case we avoid accumulating R as polynomial and can use directly R_of_z with the correct s1. if type != AccPolyInstructionType.SQUARE_TORUS: if instruction_index + 1 < self.accumulate_poly_instructions[acc_index].n: if ( self.accumulate_poly_instructions[acc_index].Pis[ instruction_index + 1 ][0] == R ): already_computed_R_of_z = self.accumulate_poly_instructions[ acc_index ].Pis_of_Z[instruction_index + 1][0] # Update direclty Rhs_evaluted self.acc[acc_index] = EuclideanPolyAccumulator( lhs=self.acc[acc_index].lhs, R=self.acc[acc_index].R, R_evaluated=self.add( self.acc[acc_index].R_evaluated, self.mul(s1, already_computed_R_of_z), ), ) return # If not found, computes R_acc = R_acc + s1 * R as a Polynomial inside circuit if r_sparsity: if type != AccPolyInstructionType.SQUARE_TORUS: # Sanity check is already done in square_torus function. # If the instruction is SQUARE_TORUS, then R is fully determined by its sparsity, R(x) = x. # Actual R value here is the SQ TORUS result. # See square torus function for this edge case. assert all(R[i].value == 0 for i in range(len(R)) if r_sparsity[i] == 0) R_acc = [] for i, (r_acc, r) in enumerate(zip(self.acc[acc_index].R, R)): match r_sparsity[i]: case 1: R_acc.append(self.add(r_acc, self.mul(s1, r))) case 2: R_acc.append(self.add(r_acc, s1)) case _: R_acc.append(r_acc) else: # Computes R_acc = R_acc + s1 * R without sparsity info. R_acc = [ self.add(r_acc, self.mul(s1, r)) for r_acc, r in zip(self.acc[acc_index].R, R) ] # Update accumulator state self.acc[acc_index] = EuclideanPolyAccumulator( lhs=self.acc[acc_index].lhs, R=R_acc, R_evaluated=self.acc[acc_index].R_evaluated, ) return def finalize_circuit( self, extension_degree: int = None, ): ######### Flags ######### extension_degree = extension_degree or self.extension_degree double_extension = self.accumulate_poly_instructions[1].n > 0 acc_indexes = [0, 1] if double_extension else [0] ######################### ################ Get base rlc coefficient c0 ################ if self.hash_input: self.transcript.hash_limbs_multi(self.circuit_input) self.transcript.hash_limbs_multi(self.commitments) c0 = self.write_cairo_native_felt(self.field(self.transcript.s1)) ################################################################## ################ Compute Qs ################ Qs = [Polynomial([self.field.zero()]) for _ in range(2)] for acc_index in acc_indexes: self.accumulate_poly_instructions[acc_index].rlc_coeffs.append(c0) # Computes Q = Σ(ci * Qi) Qs[acc_index] = self.accumulate_poly_instructions[acc_index].Qis[0] * c0 for i in range(1, self.accumulate_poly_instructions[acc_index].n): self.accumulate_poly_instructions[acc_index].rlc_coeffs.append( self.mul( self.accumulate_poly_instructions[acc_index].rlc_coeffs[i - 1], c0, ) ) Qs[acc_index] += ( self.accumulate_poly_instructions[acc_index].Qis[i] * self.accumulate_poly_instructions[acc_index].rlc_coeffs[i] ) Qs[acc_index] = Qs[acc_index].get_coeffs() # Extend Q with zeros if needed to match the minimal expected degree. Qs[acc_index] = Qs[acc_index] + [self.field.zero()] * ( (acc_index + 1) * extension_degree - 1 - len(Qs[acc_index]) ) ################################################################## Q = [self.write_elements(Qs[0], WriteOps.COMMIT)] compute_z_up_to = max(max(len(Qs[0]), len(Qs[1])) - 1, extension_degree) self.big_q_len = len(Q[0]) self.transcript.hash_limbs_multi(Q[0]) if double_extension: Q.append(self.write_elements(Qs[1], WriteOps.COMMIT)) self.transcript.hash_limbs_multi(Q[1]) compute_z_up_to = max(compute_z_up_to, extension_degree * 2) self.big_q_len = self.big_q_len + len(Q[1]) z = self.transcript.continuable_hash self.create_powers_of_Z(z, max_degree=compute_z_up_to) for acc_index in acc_indexes: for i in range(self.accumulate_poly_instructions[acc_index].n): self.update_LHS_state( s1=self.accumulate_poly_instructions[acc_index].rlc_coeffs[i], Ps=self.accumulate_poly_instructions[acc_index].Pis[i], Ps_sparsities=self.accumulate_poly_instructions[ acc_index ].Ps_sparsities[i], acc_index=acc_index, ) for i in range(self.accumulate_poly_instructions[acc_index].n): self.update_RHS_state( type=self.accumulate_poly_instructions[acc_index].types[i], s1=self.accumulate_poly_instructions[acc_index].rlc_coeffs[i], R=self.accumulate_poly_instructions[acc_index].Ris[i], r_sparsity=self.accumulate_poly_instructions[ acc_index ].r_sparsities[i], acc_index=acc_index, instruction_index=i, ) Q_of_Z = self.eval_poly_in_precomputed_Z(Q[acc_index]) P, P_sparsity = self.write_sparse_constant_elements( get_irreducible_poly( self.curve_id, (acc_index + 1) * extension_degree ).get_coeffs(), ) P_of_z = self.eval_poly_in_precomputed_Z(P, P_sparsity) R = self.acc[acc_index].R R_of_Z = self.eval_poly_in_precomputed_Z(R) lhs = self.acc[acc_index].lhs rhs = self.add( self.mul(Q_of_Z, P_of_z), self.add(R_of_Z, self.acc[acc_index].R_evaluated), ) assert lhs.value == rhs.value, f"{lhs.value} != {rhs.value}, {acc_index}" if self.compilation_mode == 0: self.sub_and_assert( lhs, rhs, self.set_or_get_constant(self.field.zero()) ) else: eq_check = self.sub(rhs, lhs) self.extend_output([eq_check]) return True def summarize(self): add_count, mul_count, assert_eq_count = self.values_segment.summarize() summary = { "circuit": self.name, "MULMOD": mul_count, "ADDMOD": add_count, "ASSERT_EQ": assert_eq_count, "POSEIDON": ( self.transcript.permutations_count if self.transcript.permutations_count > 1 else 0 ), "RLC": self.accumulate_poly_instructions[0].n + self.accumulate_poly_instructions[1].n, } return summary def compile_circuit_cairo_zero( self, function_name: str = None, returns: dict[str] = { "felt*": [ "constants_ptr", "add_offsets_ptr", "mul_offsets_ptr", "output_offsets_ptr", ], "felt": [ "constants_ptr_len", "input_len", "commitments_len", "big_Q_len", "witnesses_len", "output_len", "continuous_output", "add_mod_n", "mul_mod_n", "n_assert_eq", "N_Euclidean_equations", "name", "curve_id", ], }, ) -> str: dw_arrays = self.values_segment.get_dw_lookups() name = function_name or self.values_segment.name function_name = f"get_{name}_circuit" code = f"func {function_name}()->(circuit:{self.class_name}*)" + "{" + "\n" code += "alloc_locals;\n" code += "let (__fp__, _) = get_fp_and_pc();\n" for dw_array_name in returns["felt*"]: code += f"let ({dw_array_name}:felt*) = get_label_location({dw_array_name}_loc);\n" code += f"let constants_ptr_len = {len(dw_arrays['constants_ptr'])};\n" code += f"let input_len = {len(self.values_segment.segment_stacks[WriteOps.INPUT])*N_LIMBS};\n" code += f"let commitments_len = {len(self.commitments)*N_LIMBS};\n" code += f"let witnesses_len = {len(self.values_segment.segment_stacks[WriteOps.WITNESS])*N_LIMBS};\n" code += f"let big_Q_len = {self.big_q_len*N_LIMBS};\n" code += f"let output_len = {len(self.output)*N_LIMBS};\n" continuous_output = self.continuous_output code += f"let continuous_output = {1 if continuous_output else 0};\n" code += f"let add_mod_n = {len(dw_arrays['add_offsets_ptr'])};\n" code += f"let mul_mod_n = {len(dw_arrays['mul_offsets_ptr'])};\n" code += ( f"let n_assert_eq = {len(self.values_segment.assert_eq_instructions)};\n" ) code += ( f"let N_Euclidean_equations = {len(dw_arrays['poseidon_indexes_ptr'])};\n" ) code += f"let name = '{self.name}';\n" code += f"let curve_id = {self.curve_id};\n" code += f"local circuit:ExtensionFieldModuloCircuit = ExtensionFieldModuloCircuit({', '.join(returns['felt*'])}, {', '.join(returns['felt'])});\n" code += "return (&circuit,);\n" for dw_array_name in returns["felt*"]: dw_values = dw_arrays[dw_array_name] code += f"\t {dw_array_name}_loc:\n" if dw_array_name == "constants_ptr": for bigint in dw_values: for limb in bigint: code += f"\t dw {limb};\n" code += "\n" elif dw_array_name in ["add_offsets_ptr", "mul_offsets_ptr"]: num_instructions = len(dw_values) instructions_needed = ( BATCH_SIZE - (num_instructions % BATCH_SIZE) ) % BATCH_SIZE for left, right, result, comment in dw_values: code += ( f"\t dw {left}; // {comment}\n" + f"\t dw {right};\n" + f"\t dw {result};\n" ) if instructions_needed > 0: first_triplet = dw_values[0] for _ in range(instructions_needed): code += ( f"\t dw {first_triplet[0]};\n" + f"\t dw {first_triplet[1]};\n" + f"\t dw {first_triplet[2]};\n" ) code += "\n" elif dw_array_name in ["output_offsets_ptr"]: if continuous_output: code += f"\t dw {dw_values[0]};\n" else: for val in dw_values: code += f"\t dw {val};\n" code += "\n" code += "}\n" return code if __name__ == "__main__": pass ================================================ FILE: hydra/garaga/hints/bls.py ================================================ from math import gcd from garaga.curves import CURVES, CurveID from garaga.hints.tower_backup import E12 """ The goal of this script is to provide aux witness for efficient proving that Miller loop outputs of BLS12-381 curve are λ residues. Co-factor h = 27 * p * h3 and λ = r * 3 * p^2. We know that when pairings are equal multi Miller loop output is always r-th residue, but it is λ residue only when it is a cube and p-th residue too. This happens with a very small probability (1/3*p), but both 27th and p-th roots of unity are in the subfields of Fp12, Fp3 and Fp respectively. Thus we can simply clear their contribution and not affect he soundness of the method. Note that gcd(27*p, h3) = 1, therefore we do the following: i := inverse_mod(h3, 27*p) s := -i % 27*p Then given the Miller loop output x, computing w = (x^h3)^s gives exactly the inverse of 27*p-th root of unity contribution in x. By computing x_sh = w * x we are left with an element that is of order exactly h3. Since gcd(h1, λ) = 1 computing λ root of x_sh can be simply done by just raising x_sh^e where e = inverse_mod(h3, λ) """ # Bls x = CURVES[CurveID.BLS12_381.value].x k = 12 r = x**4 - x**2 + 1 q = ((x - 1) ** 2) // 3 * r + x h = (q**k - 1) // r lam = -x + q m = lam // r p = 5044125407647214251 h3 = h // (27 * p) e = pow(lam, -1, h3) s = (-1 * pow(h3, -1, p * 27)) % (p * 27) assert h % (27 * p) == 0 assert m == 3 * p**2 assert gcd(3, h3) == 1 assert gcd(p**2, h3) == 1 assert gcd(3, h3) == 1 assert gcd(p, h3) == 1 assert gcd(p, 27 * h3) == 1 assert gcd(27, p * h3) == 1 ONE = E12.one(curve_id=1) assert (q**3 - 1) % 27 == 0 def get_root_and_scaling_factor_bls(mlo: E12) -> tuple[E12, E12]: """ Takes a miller loop output and returns root, shift such that root**lam = shift * mlo, if and only if mlo**h == 1. """ x = mlo**h3 shift = x**s root = (shift * mlo) ** e return root, shift ================================================ FILE: hydra/garaga/hints/ecip.py ================================================ from __future__ import annotations import functools from dataclasses import dataclass from garaga import garaga_rs from garaga.algebra import Fp2, FunctionFelt, Polynomial, PyFelt, RationalFunction, T from garaga.curves import CURVES, CurveID, get_base_field from garaga.hints.neg_3 import ( construct_digit_vectors, neg_3_base_le, positive_negative_multiplicities, ) from garaga.points import G1Point, G2Point from garaga.poseidon_transcript import hades_permutation def get_field_type_from_ec_point(P: G1Point | G2Point) -> type[T]: """ Maps an elliptic curve point to the type of the field it belongs to. G1Point -> PyFelt G2Point -> Fp2 """ if isinstance(P, G1Point): return PyFelt elif isinstance(P, G2Point): return Fp2 else: raise ValueError(f"Invalid point type {type(P)}") def get_ec_group_class_from_ec_point(P: G1Point | G2Point) -> type[G1Point | G2Point]: """ Maps an elliptic curve point to the class of the elliptic curve group it belongs to. G1Point -> G1Point G2Point -> G2Point """ if isinstance(P, G1Point): return G1Point elif isinstance(P, G2Point): return G2Point else: raise ValueError(f"Invalid point type {type(P)}") def derive_ec_point_from_X( x: PyFelt | int | Fp2, curve_id: CurveID ) -> tuple[PyFelt, PyFelt, list[PyFelt]] | tuple[Fp2, Fp2, list[Fp2]]: """ From a "random" x coordinate (in practice obtained via the Cairo Poseidon252 hash), finds via a "try-and-increment" algorithm a point on the curve for a given curveID. Works for curves over base field ("PyFelt") or degree 2 extension field ("Fp2") Returns : - x (PyFelt or Fp2) - x coordinate of the obtained point after the try-and-increment - y (PyFelt or Fp2) - y coordinate of the obtained point after the try-and-increment - g_rhs_roots (list of PyFelt of Fp2). A list of square roots over the given field. At each attempt, if rhs(x) = x^3 + ax + b is not a quad residue (ie: the point is not on the curve), x is updated by hashing it with the attempt : new_x = poseidon(x, attempt) Since in a finite field, if z is not a quad residue, g*z is a quad residue (alternatively), at each attempt, the square root of g*x is stored in the g*rhs_roots array. This is used to verify the existence of the square roots in Cairo. See the derive_ec_point_from_X cairo function in ec_ops.cairo. """ field = get_base_field(curve_id.value) if isinstance(x, int): x = field(x) def rhs_compute(x: PyFelt | Fp2) -> PyFelt | Fp2: """ Compute the right hand side of the Weirstrass equation. rhs(x) = x^3 + ax + b """ if isinstance(x, Fp2): return ( x**3 + x * field(CURVES[curve_id.value].a) + Fp2( field(CURVES[curve_id.value].b20), field(CURVES[curve_id.value].b21) ) ) else: return ( x**3 + field(CURVES[curve_id.value].a) * x + field(CURVES[curve_id.value].b) ) if isinstance(x, Fp2): g = Fp2( field(CURVES[curve_id.value].nr_a0), field(CURVES[curve_id.value].nr_a1), ) else: g = field(CURVES[curve_id.value].fp_generator) rhs = rhs_compute(x) g_rhs_roots = [] attempt = 0 while not rhs.is_quad_residue(): g_rhs = rhs * g g_rhs_roots.append(g_rhs.sqrt()) if isinstance(x, Fp2): _s0, _, _ = hades_permutation(x.a0.value, x.a1.value, 2) _x0, _x1, _ = hades_permutation(_s0, attempt, 2) x = Fp2(field(_x0), field(_x1)) else: _x, _, _ = hades_permutation(x.value, attempt, 2) x = field(_x) rhs = rhs_compute(x) attempt += 1 y = rhs.sqrt() assert y**2 == rhs return x, y, g_rhs_roots def zk_ecip_hint( Bs: list[G1Point] | list[G2Point], scalars: list[int], use_rust: bool = True ) -> tuple[G1Point | G2Point, FunctionFelt[T]]: """ Inputs: - Bs: list of points on the curve - scalars: list of scalars Returns: - Q: MSM of Bs by scalars contained in dss matrix - sum_dlog: sum of the logarithmic derivatives of the functions in Ds Use this to verify equation 3 in https://eprint.iacr.org/2022/596.pdf Partial Ref : https://gist.github.com/Liam-Eagen/666d0771f4968adccd6087465b8c5bd4 Full algo verifying it in the function verify_ecip below. """ assert len(Bs) == len(scalars) ec_group_class = get_ec_group_class_from_ec_point(Bs[0]) if ec_group_class == G1Point and use_rust: pts = [] c_id = Bs[0].curve_id for pt in Bs: pts.extend([pt.x, pt.y]) field_type = get_field_type_from_ec_point(Bs[0]) field = get_base_field(c_id.value, field_type) q, a_num, a_den, b_num, b_den = garaga_rs.zk_ecip_hint( pts, list(scalars), c_id.value ) a_num = [field(f) for f in a_num] if len(a_num) > 0 else [field.zero()] a_den = [field(f) for f in a_den] if len(a_den) > 0 else [field.one()] b_num = [field(f) for f in b_num] if len(b_num) > 0 else [field.zero()] b_den = [field(f) for f in b_den] if len(b_den) > 0 else [field.one()] Q = G1Point(q[0], q[1], c_id) sum_dlog = FunctionFelt( RationalFunction(Polynomial(a_num), Polynomial(a_den)), RationalFunction(Polynomial(b_num), Polynomial(b_den)), ) else: dss = construct_digit_vectors(scalars) Q, Ds = ecip_functions(Bs, dss) dlogs = [dlog(D) for D in Ds] sum_dlog = dlogs[0] field = get_base_field(Q.curve_id.value, PyFelt) for i in range(1, len(dlogs)): sum_dlog = sum_dlog + (-3) ** i * dlogs[i] return Q, sum_dlog def verify_ecip( Bs: list[G1Point] | list[G2Point], scalars: list[int], Q: G1Point | G2Point = None, sum_dlog: FunctionFelt[T] = None, A0: G1Point | G2Point = None, use_rust: bool = True, ) -> bool: """ Verifies the zk-ecip hint. If Q, sum_dlog are not provided from a previous computation of the zk_ecip_hint, it will compute them. If the random point A0 is not provided for verifying the hint, a random one will be sampled. """ # Prover : if Q is None or sum_dlog is None: Q, sum_dlog = zk_ecip_hint(Bs, scalars, use_rust) else: Q = Q sum_dlog = sum_dlog # Verifier : assert sum_dlog.validate_degrees(len(Bs)) epns = [ positive_negative_multiplicities(neg_3_base_le(scalar)) for scalar in scalars ] c_id = Q.curve_id.value ec_group_class = get_ec_group_class_from_ec_point(Q) field_type = get_field_type_from_ec_point(Q) field = get_base_field(Q.curve_id.value, field_type) # Verifier must derive a random point A0. # In non-interactive context, hash public inputs (Bs, scalars) and prover info (Q, sum_dlog) then map the resulting field element to a point. if A0 is None: A0 = ec_group_class.gen_random_point(Q.curve_id) else: A0 = A0 A2 = A0.scalar_mul(-2) xA0 = field(A0.x) yA0 = field(A0.y) xA2 = field(A2.x) yA2 = field(A2.y) mA0, bA0 = slope_intercept(A0, A0) mA0A2, _ = slope_intercept(A2, A0) coeff2 = (2 * yA2 * (xA0 - xA2)) / ( 3 * xA2**2 + field(CURVES[c_id].a) - 2 * mA0A2 * yA2 ) coeff0 = coeff2 + 2 * mA0A2 basis_sum = field.zero() for i, (P, (ep, en)) in enumerate(zip(Bs, epns)): if P.is_infinity(): # print("skipping infinity") continue if ep - en == 0: # print("skipping 0") continue basis_sum += eval_point_challenge_signed(P, xA0, mA0, bA0, ep, en) # print(f"rhs_acc {i}: {basis_sum.value}") if Q.is_infinity(): RHS = basis_sum else: RHS = eval_point_challenge(-Q, xA0, mA0, bA0, 1) + basis_sum LHS = coeff0 * sum_dlog.evaluate(xA0, yA0) - coeff2 * sum_dlog.evaluate(xA2, yA2) # Verifier must check that LHS = RHS. assert LHS == RHS, f"LHS: {LHS}, RHS: {RHS}" ######### assert Q == ec_group_class.msm( Bs, scalars ) # Sanity check. Not part of the verification. ########## return True def slope_intercept( P: G1Point | G2Point, Q: G1Point | G2Point ) -> tuple[PyFelt, PyFelt] | tuple[Fp2, Fp2]: """ Returns the slope and intercept of the line passing through points P and Q. y = mx + b """ field = get_base_field(P.curve_id.value, get_field_type_from_ec_point(P)) if P == Q: px, py = field(P.x), field(P.y) m = (3 * px**2 + field(CURVES[P.curve_id.value].a)) / (2 * py) b = py - m * px return (m, b) else: px, py = field(P.x), field(P.y) qx, qy = field(Q.x), field(Q.y) m = (py - qy) / (px - qx) b = qy - m * qx return (m, b) def eval_point_challenge( P: G1Point | G2Point, xA0, mA0, bA0, multiplicity: int ) -> PyFelt | Fp2: field_type = get_field_type_from_ec_point(P) field = get_base_field(P.curve_id.value, field_type) xP, yP = field(P.x), field(P.y) num = xA0 - xP den = yP - mA0 * xP - bA0 res = multiplicity * num / den assert isinstance(res, field_type), f"Expected {field_type}, got {type(res)}" return res def eval_point_challenge_signed( P: G1Point | G2Point, xA0, mA0, bA0, ep: int, en: int ) -> PyFelt | Fp2: return eval_point_challenge(P, xA0, mA0, bA0, ep) + eval_point_challenge( -P, xA0, mA0, bA0, en ) def line(P: G1Point | G2Point, Q: G1Point | G2Point) -> FF[T]: """ Returns line function passing through points, works for all points and returns 1 for O + O = O """ assert ( P.curve_id == Q.curve_id ), f"Points must be on the same curve, got {P.curve_id} and {Q.curve_id}" assert isinstance( P, type(Q) ), f"Points must be in the same group, got {type(P)} and {type(Q)}" if isinstance(P, G1Point): field_type = PyFelt elif isinstance(P, G2Point): field_type = Fp2 else: raise ValueError(f"Invalid point type {type(P)}") field = get_base_field(P.curve_id.value, field_type) if P.is_infinity(): if Q.is_infinity(): return FF([Polynomial([field.one()])], P.curve_id) else: Qx = field(Q.x) return FF([Polynomial([-Qx, field.one()])], P.curve_id) if Q.is_infinity(): Px = field(P.x) return FF([Polynomial([-Px, field.one()])], P.curve_id) Px, Py = field(P.x), field(P.y) if P == Q: m = (3 * Px**2 + field(CURVES[P.curve_id.value].a)) / (2 * Py) b = Py - m * Px # -m*x + y -b return FF([Polynomial([-b, -m]), Polynomial([field.one()])], P.curve_id) if P == -Q: return FF([Polynomial([-Px, field.one()])], P.curve_id) Qx, Qy = field(Q.x), field(Q.y) m = (Py - Qy) / (Px - Qx) b = Qy - m * Qx return FF([Polynomial([-b, -m]), Polynomial([field.one()])], P.curve_id) @dataclass class FF: """ Represents a polynomial over F_p[x] or F_p^2[x] Example : F(x, y) = c0(x) + c1(x) * y + c2(x) * y^2 + ... where c0, c1, c2, ... are polynomials over F_p[x] or F_p^2[x] Used to represent a subset of the Function Field where coefficients are polynomials instead of rational functions. """ coeffs: list[Polynomial[T]] y2: Polynomial[T] # = x^3 + ax + b, where a, b are the curve parameters p: int curve_id: CurveID type: type[T] # PyFelt or Fp2 def __init__(self, coeffs: list[Polynomial[T]], curve_id: CurveID): self.coeffs = coeffs self.p = coeffs[0][0].p self.field = get_base_field(curve_id.value, type(coeffs[0][0])) self.curve_id = curve_id self.type = type(coeffs[0][0]) a = self.field(CURVES[curve_id.value].a) if self.type == PyFelt: b = self.field(CURVES[curve_id.value].b) else: b = self.field((CURVES[curve_id.value].b20, CURVES[curve_id.value].b21)) # y² = x³ + ax + b self.y2 = Polynomial([b, a, self.field.zero(), self.field.one()]) def degree(self) -> int: return len(self.coeffs) - 1 def __getitem__(self, i: int) -> Polynomial: try: return self.coeffs[i] except IndexError: return Polynomial.zero(self.p, self.type) def __add__(self, other: FF) -> FF: if not isinstance(other, FF): raise TypeError(f"Cannot add FF and {type(other)}") ns, no = len(self.coeffs), len(other.coeffs) if ns >= no: coeffs = self.coeffs[:] for i in range(no): coeffs[i] = coeffs[i] + other.coeffs[i] else: coeffs = other.coeffs[:] for i in range(ns): coeffs[i] = coeffs[i] + self.coeffs[i] return FF(coeffs, self.curve_id) def __mul__(self, other: "FF" | Polynomial | PyFelt) -> "FF": if isinstance(other, (PyFelt, Polynomial)): return FF([c * other for c in self.coeffs], self.curve_id) elif not isinstance(other, FF): raise TypeError( f"Cannot multiply polynomial by type {type(other)}, must be PyFelt, Polynomial, or FF" ) if self.coeffs == [] or other.coeffs == []: return FF([Polynomial([self.field.zero()])], self.curve_id) zero = Polynomial.zero(self.p, self.type) buf = [zero] * (len(self.coeffs) + len(other.coeffs) - 1) for i in range(len(self.coeffs)): if self.coeffs[i].is_zero(): continue # optimization for sparse polynomials for j in range(len(other.coeffs)): buf[i + j] = buf[i + j] + self.coeffs[i] * other.coeffs[j] res = FF(buf, self.curve_id) return res def neg_y(self) -> "FF": """Keeps all the coefficients the same but negate the degree 1 coeff""" if len(self.coeffs) < 2: return self coeffs = self.coeffs[:] coeffs[1] = -coeffs[1] return FF(coeffs, self.curve_id) def reduce(self) -> "FF": """ Reduces the polynomial modulo y² = x³ + ax + b Replaces y² with x³ + ax + b and reduces the degree of the polynomial Always returns a polynomial of at most degree 1. Enforce it has 2 coefficients (padding with zero polynomials if needed) """ if len(self.coeffs) <= 2: while len(self.coeffs) < 2: self.coeffs.append(Polynomial.zero(self.p, self.type)) return self y2 = self.y2 deg_0_coeff = self.coeffs[0] deg_1_coeff = self.coeffs[1] for i, poly in enumerate(self.coeffs): if i == 0 or i == 1: continue if i % 2 == 0: deg_0_coeff = deg_0_coeff + poly * y2 else: deg_1_coeff = deg_1_coeff + poly * y2 y2 = y2 * y2 return FF([deg_0_coeff, deg_1_coeff], self.curve_id) def to_poly(self) -> Polynomial[T]: """ "Downcasts" the FF to a Polynomial iff the FF is of degree 1. """ assert len(self.coeffs) == 1 return self.coeffs[0] def div_by_poly(self, poly: Polynomial[T]) -> "FF": return FF([c // poly for c in self.coeffs], self.curve_id) def normalize(self) -> "FF": """ Normalize the polynomial by dividing all coefficients by the first one """ coeff = self.coeffs[0][0] return FF([c * coeff.__inv__() for c in self.coeffs], self.curve_id) class EmptyListOfPoints(Exception): pass def construct_function(Ps: list[G1Point] | list[G2Point]) -> FF: """ Returns a function field element (class FF) exactly interpolating the points Ps. """ if len(Ps) == 0: raise EmptyListOfPoints( "Cannot construct a function from an empty list of points" ) xs = [(P, line(P, -P)) for P in Ps] while len(xs) != 1: xs2 = [] if len(xs) & 1: x0 = xs[0] xs = xs[1:] else: x0 = None for n in range(0, len(xs) // 2): A, aNum = xs[2 * n] B, bNum = xs[2 * n + 1] aNum_bNum = aNum * bNum line_AB = line(A, B) product = aNum_bNum * line_AB num = product.reduce() den = (line(A, -A) * line(B, -B)).to_poly() D = num.div_by_poly(den) xs2.append((A.add(B), D)) if x0 is not None: xs2.append(x0) xs = xs2 assert xs[0][0].is_infinity() return xs[-1][1].normalize() def row_function( ds: list[int], Ps: list[G1Point] | list[G2Point], Q: G1Point | G2Point ) -> tuple[FF, G1Point | G2Point]: ec_group_class = G1Point if isinstance(Q, G1Point) else G2Point infinity = ec_group_class.infinity(Q.curve_id) digits_points = [ P if d == 1 else -P if d == -1 else infinity for d, P in zip(ds, Ps) ] sum_digits_points = functools.reduce(lambda x, y: x.add(y), digits_points) Q2 = Q.scalar_mul(-3).add(sum_digits_points) Q_neg = -Q div_ = [Q_neg, Q_neg, Q_neg, -Q2] + digits_points div = [P for P in div_ if not P.is_infinity()] try: D = construct_function(div) except EmptyListOfPoints: field_type = get_field_type_from_ec_point(div_[0]) # Returning 1 so that dLog(D) = 0 and doesn't contribute to the sum. D = FF( [Polynomial.one(get_base_field(Q.curve_id, field_type).p, field_type)], Q.curve_id, ) return (D, Q2) def ecip_functions( Bs: list[G1Point] | list[G2Point], dss: list[list[int]] ) -> tuple[G1Point | G2Point, list[FF]]: dss.reverse() ec_group_class = G1Point if isinstance(Bs[0], G1Point) else G2Point Q = ec_group_class.infinity(Bs[0].curve_id) Ds = [] for i, ds in enumerate(dss): D, Q = row_function(ds, Bs, Q) Ds.append(D) Ds.reverse() return (Q, Ds) def dlog(d: FF) -> FunctionFelt: """ Compute the logarithmic derivative of a FunctionFieldElement (class FF), Returns a FunctionFelt such that F = a(x) + b(x) * y with a, b RationalFunctions Ref https://gist.github.com/Liam-Eagen/666d0771f4968adccd6087465b8c5bd4 (cell #12) Example values: D: (3*x + 11)*y + x^2 + x + 1 Dx: 3*y + 2*x + 1 Dy: 3*x + 11 Dz_tmp: (9*x^3 + 33*x^2)/(2*y) Dz: (6*y^2 + (4*x + 2)*y + 9*x^3 + 33*x^2)/(2*y) U=2*y*Dz: 6*y^2 + (4*x + 2)*y + 9*x^3 + 33*x^2 V=2*y*D: (6*x + 22)*y^2 + (2*x^2 + 2*x + 2)*y """ field = d.field d: FF = d.reduce() assert len(d.coeffs) == 2, f"D has {len(d.coeffs)} coeffs: {d.coeffs}" Dx = FF([d[0].differentiate(), d[1].differentiate()], d.curve_id) Dy: Polynomial = d[1] # B(x) TWO_Y: FF = FF( [Polynomial.zero(field.p, d.type), Polynomial([field(2)])], d.curve_id ) U: FF = Dx * TWO_Y + FF( [ Dy * Polynomial( [ field(CURVES[d.curve_id.value].a), field.zero(), field(3), ] # 3x^2 + A ), Polynomial.zero(field.p, d.type), ], d.curve_id, ) V: FF = TWO_Y * d # print(f"U: {print_ff(U)}") # print(f"V: {print_ff(V)}") Num: FF = (U * V.neg_y()).reduce() Den_FF: FF = (V * V.neg_y()).reduce() # print(f"Num: {print_ff(Num)}") # print(f"Den: {print_ff(Den_FF)}") assert Den_FF[ 1 ].is_zero(), f"Den[1] is not zero: {Den_FF[1].print_as_sage_poly('x')}" Den: Polynomial = Den_FF[0] _, _, gcd_0 = Polynomial.xgcd(Num[0], Den) # print(f"GCD_0: {gcd_0.print_as_sage_poly('x')}") _, _, gcd_1 = Polynomial.xgcd(Num[1], Den) # print(f"GCD_1: {gcd_1.print_as_sage_poly('x')}") # Simplify the numerator and denominator by dividing by the gcd a_num = Num[0] // gcd_0 a_den = Den // gcd_0 b_num = Num[1] // gcd_1 b_den = Den // gcd_1 # Normalize to obtain exactly Sage's coeffs. res = FunctionFelt( a=RationalFunction( a_num * Den.leading_coefficient().__inv__(), a_den * a_den.leading_coefficient().__inv__(), ), b=RationalFunction( b_num * Den.leading_coefficient().__inv__(), b_den * b_den.leading_coefficient().__inv__(), ), ) # print(f"res: {res.print_as_sage_poly()}\n") return res def print_ff(ff: FF): string = "" coeffs = ff.coeffs for i, p in enumerate(coeffs[::-1]): coeff_str = p.print_as_sage_poly(var_name="x", as_hex=True) if i == len(coeffs) - 1: if coeff_str == "": string = string[:-2] else: string += f"{coeff_str}" elif i == len(coeffs) - 2: string += f"({coeff_str})*y + " else: string += f"({coeff_str})*y^{len(coeffs) - i - 1} + " # print(string) return string def n_points_from_n_coeffs(n_coeffs: int, batched: bool) -> int: if batched: extra = 4 * 2 else: extra = 0 # n_coeffs = 10 + 4n_points => 4n_points = n_coeffs - 10 assert n_coeffs >= 10 + extra assert (n_coeffs - 10 - extra) % 4 == 0 return (n_coeffs - 10 - extra) // 4 def n_coeffs_from_n_points(n_points: int, batched: bool) -> tuple[int, int, int, int]: if batched: extra = 2 else: extra = 0 return ( 1 + n_points + extra, 1 + n_points + 1 + extra, 1 + n_points + 1 + extra, 1 + n_points + 4 + extra, ) if __name__ == "__main__": import random from garaga.curves import STARK from garaga.hints.io import int_array_to_u384_array, int_to_u384 random.seed(0) def build_cairo1_tests_derive_ec_point_from_X(x: int, curve_id: CurveID, idx: int): x_f, y, roots = derive_ec_point_from_X(x, curve_id) code = f""" #[test] fn derive_ec_point_from_X_{CurveID(curve_id).name}_{idx}() {{ let x: felt252 = {x%STARK}; let y: u384 = {int_to_u384(y)}; let grhs_roots:Array = {int_array_to_u384_array(roots)}; let result = derive_ec_point_from_X(x, y, grhs_roots, {curve_id.value}); assert!(result.x == {int_to_u384(x_f)}); assert!(result.y == y); }} """ return code # codes = "\n".join( # [ # build_cairo1_tests_derive_ec_point_from_X(x, curve_id, idx) # for idx, x in enumerate([random.randint(0, STARK - 1) for _ in range(2)]) # for curve_id in CurveID # ] # ) # print(codes) # average_n_roots = 0 # max_n_roots = 0 # n = 10000 # for i in range(n): # x, y, roots = derive_ec_point_from_X( # Fp2.random(CURVES[0].p, max_value=STARK), CurveID(0) # ) # # print(f"x: {x}, y: {y}, roots: {roots}") # max_n_roots = max(max_n_roots, len(roots)) # average_n_roots += len(roots) # print(f"Average number of roots: {average_n_roots / n}") # print(f"Max number of roots: {max_n_roots}") # verify_ecip([G1Point.gen_random_point(CurveID.SECP256K1)], scalars=[-1]) import time order = CURVES[CurveID.BN254.value].n n = 50 Bs = [G1Point.gen_random_point(CurveID.BN254) for _ in range(n)] ss = [random.randint(1, order) for _ in range(n)] t0 = time.time() ZZ = zk_ecip_hint(Bs, ss, use_rust=False) time_taken_py = time.time() - t0 print(f"Time taken py : {time_taken_py}") t0 = time.time() ZZ_rs = zk_ecip_hint(Bs, ss, use_rust=True) time_taken_rs = time.time() - t0 print(f"Time taken rs : {time_taken_rs}") print(f"Ratio: {time_taken_py / time_taken_rs}") assert ZZ == ZZ_rs ================================================ FILE: hydra/garaga/hints/eisenstein.py ================================================ """ ----------------------------------------------------------------------------- ε – Eisenstein integers in pure Python (fully commented) ----------------------------------------------------------------------------- A **beginner‑friendly walk‑through** ----------------------------------------------------------------------------- This file implements three things: • an *Eisenstein integer* class z = a0 + a1·ω with ω = e^{2πi/3} • an *exact* Euclidean division quo_rem() in the ring ℤ[ω] • the *Half‑GCD* algorithm, one of the fastest ways to compute a greatest common divisor when the inputs are very large """ from __future__ import annotations # ► allow the class to refer to itself in type hints import math from typing import Tuple # --------------------------------------------------------------------------- # 1. Tiny helper for the Euclidean division in ℤ[ω] # --------------------------------------------------------------------------- # The six **unit directions** of the hexagonal lattice. Graphically: # ↑ (0,1) # ↖ ↗ # (-1,1) (1,0) # ↙ ↘ # (-1,0) (1,-1) # ↓ (0,-1) _NEIGHBOURS = ((1, 0), (0, 1), (-1, 1), (-1, 0), (0, -1), (1, -1)) def _round_nearest(z: int, d: int) -> int: """Symmetric integer rounding —— ⌊ (z + d/2) / d ⌋ for *any* sign of *z*. • *d* is strictly positive (we only call this with norms, which are > 0). • For z ≥ 0 the formula above already works. • For z < 0 we cannot add +d/2 (would move us the wrong way), so we flip the sign, apply the positive rule, then flip back. """ half = d >> 1 # bit‑shift right by 1 ⇒ divide by 2 (fast, exact) return (z + half) // d if z >= 0 else -((-z + half) // d) # --------------------------------------------------------------------------- # 2. The EisensteinInteger class # --------------------------------------------------------------------------- class EisensteinInteger: """Eisenstein integers: *hexagonal* analogue of Gaussian integers. Definition ---------- ω (pronounced "omega") is the complex cube‑root of 1 with positive imaginary part: ω = e^{2πi/3} = −½ + i·√3/2. It satisfies ω² + ω + 1 = 0 and |ω| = 1. Every element of ℤ[ω] can be written uniquely as z = a₀ + a₁·ω, with a₀, a₁ ∈ ℤ. The pair (a₀, a₁) are the *hex‑coordinates* in the triangular lattice. In code we store just those two integers. """ # Class‑level constants (created *after* the class body below) ZERO: "EisensteinInteger" # 0 + 0·ω ONE: "EisensteinInteger" # 1 + 0·ω # ──────────────────────────────────────────────────────────────────── # Construction & basic utilities # ──────────────────────────────────────────────────────────────────── def __init__(self, a0: int = 0, a1: int = 0): if not isinstance(a0, int) or not isinstance(a1, int): raise TypeError("Coefficients a0 and a1 must be integers") self.a0 = a0 self.a1 = a1 def copy(self) -> "EisensteinInteger": """Clone *self* (handy for algorithms that mutate a temporary copy).""" return EisensteinInteger(self.a0, self.a1) def is_zero(self) -> bool: return self.a0 == 0 and self.a1 == 0 def __str__(self) -> str: """Pretty print 3 + 2·ω, −ω, 0, …""" if self.a1 == 0: return str(self.a0) a0_part = f"{self.a0}" if self.a0 != 0 else "" # coefficient of ω if self.a1 == 1: a1_part = "ω" elif self.a1 == -1: a1_part = "-ω" else: a1_part = f"{self.a1}*ω" if a0_part == "": return a1_part sign = " + " if self.a1 > 0 else " - " abs_a1_part = "ω" if abs(self.a1) == 1 else f"{abs(self.a1)}*ω" return f"{a0_part}{sign}{abs_a1_part}" def __repr__(self) -> str: """Unambiguous form so that eval(repr(z)) == z (useful in a REPL).""" return f"EisensteinInteger({self.a0}, {self.a1})" # ──────────────────────────────────────────────────────────────────── # Equality & negation # ──────────────────────────────────────────────────────────────────── def __eq__(self, other: object) -> bool: # called by z1 == z2 return ( isinstance(other, EisensteinInteger) and self.a0 == other.a0 and self.a1 == other.a1 ) def __neg__(self) -> "EisensteinInteger": # −z return EisensteinInteger(-self.a0, -self.a1) # ──────────────────────────────────────────────────────────────────── # Conjugation # ──────────────────────────────────────────────────────────────────── def conjugate(self) -> "EisensteinInteger": """Field automorphism ω ↦ ω² (complex conjugation). Algebraically: conj(a₀ + a₁·ω) = (a₀ − a₁) − a₁·ω. """ return EisensteinInteger(self.a0 - self.a1, -self.a1) # ──────────────────────────────────────────────────────────────────── # Addition, subtraction, multiplication # ──────────────────────────────────────────────────────────────────── def __add__(self, other: "EisensteinInteger") -> "EisensteinInteger": return EisensteinInteger(self.a0 + other.a0, self.a1 + other.a1) def __sub__(self, other: "EisensteinInteger") -> "EisensteinInteger": return EisensteinInteger(self.a0 - other.a0, self.a1 - other.a1) def __mul__(self, other: object) -> "EisensteinInteger": """Product formula derived from (x₀ + x₁ω)(y₀ + y₁ω). Expand and use ω² = −1 − ω. """ if isinstance(other, EisensteinInteger): x0, x1, y0, y1 = self.a0, self.a1, other.a0, other.a1 return EisensteinInteger( x0 * y0 - x1 * y1, # coefficient of 1 x0 * y1 + x1 * y0 - x1 * y1, # coefficient of ω ) elif isinstance(other, int): return EisensteinInteger(self.a0 * other, self.a1 * other) return NotImplemented # Support int * EisensteinInteger (commutative) __rmul__ = __mul__ # ──────────────────────────────────────────────────────────────────── # Norm (always a *plain* integer) # ──────────────────────────────────────────────────────────────────── def norm(self) -> int: """N(a₀ + a₁·ω) = a₀² + a₁² − a₀·a₁ ≥ 0 Proof: treat ω as −½ + i·√3/2 and compute |z|². """ return self.a0 * self.a0 + self.a1 * self.a1 - self.a0 * self.a1 # ------------------------------------------------------------------- # Euclidean division —— the heart of arithmetic in ℤ[ω] # ------------------------------------------------------------------- def quo_rem( self, y: "EisensteinInteger" ) -> Tuple["EisensteinInteger", "EisensteinInteger"]: """Return (q, r) such that self = q·y + r with N(r) < N(y). Strategy (all integer‑only): 1. Multiply by the *conjugate* of y to get an element of the lattice that is colinear with y – this is the usual trick to mimic complex division without leaving the ring. 2. Divide the two coordinates by the *positive* norm N(y) and apply symmetric rounding to obtain a *first guess* q. 3. If this guess does not yet satisfy the Euclidean inequality N(r) < N(y), walk at most two unit steps in the hex lattice until it does. Because ℤ[ω] is a Euclidean domain, this procedure is guaranteed to terminate and the while‑loop never needs more than two laps. """ if y.is_zero(): raise ZeroDivisionError("division by zero EisensteinInteger") nrm = y.norm() # denominator of the coordinates ( > 0 ) num = self * y.conjugate() # numerator in the same lattice line # --- 1st approximation by independent rounding ----------------- q0 = _round_nearest(num.a0, nrm) q1 = _round_nearest(num.a1, nrm) q = EisensteinInteger(q0, q1) r = self - q * y # --- Improve the quotient until Euclidean property holds -------- while r.norm() >= nrm: # very rarely true (≈ 1 in 12 cases) best_q, best_r, best_norm = None, None, r.norm() # test the 6 neighbours for dp, dq in _NEIGHBOURS: cand_q = EisensteinInteger(q0 + dp, q1 + dq) cand_r = self - cand_q * y cand_norm = cand_r.norm() if cand_norm < best_norm: best_q, best_r, best_norm = cand_q, cand_r, cand_norm # move to the better neighbour (Euclidean property assures one exists) q, r = best_q, best_r q0, q1 = q.a0, q.a1 # update centre for the *next* neighbour pass return q, r # Allow the syntactic sugar z // y and z % y ------------------------- def __floordiv__(self, other: "EisensteinInteger") -> "EisensteinInteger": return self.quo_rem(other)[0] def __mod__(self, other: "EisensteinInteger") -> "EisensteinInteger": return self.quo_rem(other)[1] # -------- class constants (must be assigned *after* the class is complete) --- EisensteinInteger.ZERO = EisensteinInteger(0, 0) EisensteinInteger.ONE = EisensteinInteger(1, 0) # --------------------------------------------------------------------------- # 3. Half‑GCD —— sub‑quadratic gcd via size halving # --------------------------------------------------------------------------- def half_gcd( a: EisensteinInteger, b: EisensteinInteger, ) -> Tuple[EisensteinInteger, EisensteinInteger, EisensteinInteger]: """Return (w, v, u) with w = a·u + b·v and N(w) < √N(a). Why is that useful? The classical Euclidean gcd repeatedly replaces the *larger* input by its remainder modulo the smaller one – this shrinks one argument at every step, but only by a *constant* factor, so it needs O(log N) iterations. **Half‑GCD** knocks out *half* the size (in bits) at every major step and therefore runs in roughly O(log N / log log N) time. The idea is to run the Euclidean algorithm *just long enough* for the remainder’s norm to dip below √N(a). The output coefficients u, v let us continue assembling the gcd later (the full gcd algorithm calls half_gcd recursively on smaller and smaller inputs). """ if not isinstance(a, EisensteinInteger) or not isinstance(b, EisensteinInteger): raise TypeError("Inputs must be EisensteinInteger instances") # Extended Euclidean bookkeeping matrices a_run, b_run = a.copy(), b.copy() u, v = EisensteinInteger.ONE.copy(), EisensteinInteger.ZERO.copy() u_, v_ = EisensteinInteger.ZERO.copy(), EisensteinInteger.ONE.copy() # Invariants throughout the loop: # a_run = a·u + b·v # b_run = a·u_ + b·v_ limit = math.isqrt(a.norm()) # √N(a) (integer square root) # Safety valve: more than ~2e5 iterations would imply a bug for _ in range(200_000): if b_run.norm() < limit or b_run.is_zero(): break q, r = a_run.quo_rem(b_run) # update (a_run, b_run) and the coefficient matrix simultaneously a_run, b_run = b_run, r u, u_ = u_, u - q * u_ v, v_ = v_, v - q * v_ else: raise RuntimeError("Half‑GCD failed to converge – too many steps") # *Return order* follows the classic Half‑GCD papers: (w, v, u) return b_run, v_, u_ if __name__ == "__main__": z1 = EisensteinInteger(3, 2) # 3 + 2ω z2 = EisensteinInteger(1, -1) # 1 - ω print(f"z1 = {z1}") print(f"z2 = {z2}") print(f"z1 + z2 = {z1 + z2}") print(f"z1 - z2 = {z1 - z2}") print(f"z1 * z2 = {z1 * z2}") print(f"Norm(z1) = {z1.norm()}") print(f"Conj(z1) = {z1.conjugate()}") print(f"-z1 = {-z1}") q, r = z1.quo_rem(z2) print(f"z1 // z2 = {q}") print(f"z1 % z2 = {r}") print(f"Check: z2 * q + r = {z2 * q + r}, Expected: {z1}") # Half GCD example a = EisensteinInteger(10, 3) b = EisensteinInteger(3, 1) print(f"\nHalf GCD for a = {a}, b = {b}") w, v_res, u_res = half_gcd(a, b) print(f" w = {w}") print(f" v = {v_res}") print(f" u = {u_res}") check = a * u_res + b * v_res print(f" Check: a*u + b*v = {check}, Expected w: {w}") print(f" Norm(w) = {w.norm()}, Limit = {math.isqrt(a.norm())}") # a = EisensteinInteger(8+7j * (math.sqrt(3)/2 + 0.5j)) # Approximate large number a_int = EisensteinInteger(13, 14) # Example large int coeffs b_int = EisensteinInteger(5, 3) print(f"\nHalf GCD for a = {a_int}, b = {b_int}") w, v_res, u_res = half_gcd(a_int, b_int) print(f" w = {w}") print(f" v = {v_res}") print(f" u = {u_res}") check = a_int * u_res + b_int * v_res print(f" Check: a*u + b*v = {check}, Expected w: {w}") print(f" Norm(w) = {w.norm()}, Limit = {math.isqrt(a_int.norm())}") ================================================ FILE: hydra/garaga/hints/extf_mul.py ================================================ from garaga import garaga_rs from garaga.algebra import ModuloCircuitElement, Polynomial, PyFelt from garaga.hints.tower_backup import E6, get_tower_object from garaga.points import ( direct_to_tower, get_base_field, get_irreducible_poly, tower_to_direct, ) def nondeterministic_extension_field_mul_divmod( Ps: list[list[PyFelt | ModuloCircuitElement]], curve_id: int, extension_degree: int, ) -> tuple[list[PyFelt], list[PyFelt]]: """ From a list of Polynomials Ps = [P1, ..., Pn] Returns (Q(X), R(X)) such that Π(Pi)(X) = Q(X) * P_irr(X) + R(X), for a given curve and extension degree. R(X) is the result of the multiplication in the extension field. Q(X) is used for verification. """ field = get_base_field(curve_id) ps = [[c.value for c in P] for P in Ps] q, r = garaga_rs.nondeterministic_extension_field_mul_divmod( curve_id, extension_degree, ps ) z_polyq_coeffs = [field(c) for c in q] if len(q) > 0 else [field.zero()] z_polyr_coeffs = [field(c) for c in r] if len(r) > 0 else [field.zero()] return (z_polyq_coeffs, z_polyr_coeffs) def nondeterministic_square_torus( A: list[PyFelt | ModuloCircuitElement], curve_id: int, biject_from_direct: bool = True, ) -> list[PyFelt]: """ Computes 1/2 * (A(x) + x/A(x)) Deprecated usage as Torus based arithmetic is not used anymore with the final exp witness. """ A = direct_to_tower(A, curve_id, 6) if biject_from_direct else A A = E6(A, curve_id) SQ: list[PyFelt] = A.square_torus().felt_coeffs return tower_to_direct(SQ, curve_id, 6) if biject_from_direct else SQ def nondeterministic_extension_field_div( A: list[PyFelt | ModuloCircuitElement], B: list[PyFelt | ModuloCircuitElement], curve_id: int, extension_degree: int = 6, ) -> tuple[list[PyFelt], list[PyFelt]]: """ From two Polynomials A and B Returns (A/B)(X) mod P_irr(X) Converts back and forth to tower representaion for faster inversion. """ A = direct_to_tower(A, curve_id, extension_degree) B = direct_to_tower(B, curve_id, extension_degree) A = get_tower_object(A, curve_id, extension_degree) B = get_tower_object(B, curve_id, extension_degree) DIV = A.div(B).felt_coeffs return tower_to_direct(DIV, curve_id, extension_degree) if __name__ == "__main__": from random import randint as rint from garaga.curves import ( BLS12_381_ID, BN254_ID, get_base_field, get_irreducible_poly, ) field = get_base_field(BN254_ID) p = field.p # ins = [rint(0, p - 1) for _ in range(6)] # sq = nondeterministic_square_torus( # [field_bn254(x) for x in ins], # BN254_ID, # ) # two_e6 = E6([2, 0, 0, 0, 0, 0], BN254_ID) # sq = E6(sq, BN254_ID) # x = E6(ins, BN254_ID) # print(f"Should be V : ", x * (two_e6 * sq - x)) A = [field(rint(0, p - 1)) for _ in range(12)] Q, R = nondeterministic_extension_field_mul_divmod([A, A, A], BN254_ID, 12) Q, R = Polynomial(Q), Polynomial(R) z = field(rint(0, p - 1)) P_irr = get_irreducible_poly(BN254_ID, 12) lhs = Polynomial(A).evaluate(z) lhs = lhs * lhs * lhs rhs = Q.evaluate(z) * P_irr.evaluate(z) + R.evaluate(z) assert lhs == rhs # Test BLS12-381 field = get_base_field(BLS12_381_ID) p = field.p A = [field(rint(0, p - 1)) for _ in range(12)] Q, R = nondeterministic_extension_field_mul_divmod([A, A], BLS12_381_ID, 12) Q, R = Polynomial(Q), Polynomial(R) def print_as_sage_poly(X: Polynomial, var_name="z"): coeffs = X.get_value_coeffs() string = "" for coeff in coeffs[::-1]: string += f"{hex(coeff)}*{var_name}^{coeffs.index(coeff)} + " print(string[:-3]) print_as_sage_poly(Polynomial(A)) print_as_sage_poly(R) ================================================ FILE: hydra/garaga/hints/fake_glv.py ================================================ #!/usr/bin/env python3 import math from dataclasses import dataclass from typing import List, Tuple import garaga.hints.eisenstein as eisenstein from garaga.curves import CURVES, CurveID from garaga.points import G1Point @dataclass class Lattice: """Represents a 2D lattice basis (V1, V2) derived from GLV decomposition. Attributes: V1: First basis vector [v11, v12]. V2: Second basis vector [v21, v22], chosen to be short. Det: Determinant of the lattice basis (v11*v22 - v12*v21). b1: Rounding coefficient derived from V2, used in scalar decomposition. b2: Rounding coefficient derived from V1, used in scalar decomposition. """ V1: Tuple[int, int] V2: Tuple[int, int] Det: int b1: int b2: int def half_gcd(mod: int, input_val: int) -> Tuple[int, int]: """ Computes the first vector of a GLV lattice basis for a given modulus and input. This is a Python adaptation of a Go function likely used for cryptographic scalar multiplication optimizations (GLV method). Args: mod (int): The modulus (often the group order `r`). input_val (int): The input value (often the eigenvalue `lambda`). Returns: Tuple[int, int]: The components (v11, |v12|) of the first basis vector V1. """ lattice = precompute_lattice(mod, input_val) output0 = lattice.V1[0] output1 = lattice.V1[1] # The GLV decomposition often requires the absolute value of the second component. return output0, abs(output1) def precompute_lattice(r: int, lam: int) -> Lattice: """ Computes a short 2D lattice basis related to parameters (r, lambda). Uses a variant of the Extended Euclidean Algorithm to find short vectors (v1, v2) such that v1 = [a, b] and v2 = [c, d] satisfy a + b*lambda = 0 (mod r) and c + d*lambda = 0 (mod r). See https://www.iacr.org/archive/crypto2001/21390189.pdf (Algorithm 3.7) Args: r (int): The modulus. lam (int): The lambda value (e.g., eigenvalue in GLV). Returns: Lattice: An object containing the lattice basis vectors (V1, V2), determinant (Det), and rounding coefficients (b1, b2). Raises: ValueError: If intermediate steps lead to division by zero (e.g., lam=0 mod r) or if the final determinant is zero. """ # Extended Euclidean Algorithm State: [[value, s_coeff, t_coeff], ...] # We maintain two states [ri, si, ti] such that ri = si*r + ti*lambda euclidean_state: List[List[int]] = [ [r, 1, 0], # Corresponds to r = 1*r + 0*lambda [lam, 0, 1], # Corresponds to lam = 0*r + 1*lambda ] # Compute the integer square root of r as the termination threshold sqrt_r: int = int(math.isqrt(r)) # Run Euclidean algorithm until the remainder (state[1][0]) is smaller than sqrt(r) while abs(euclidean_state[1][0]) >= sqrt_r: current_rem, s_curr, t_curr = euclidean_state[1] prev_rem, s_prev, t_prev = euclidean_state[0] if current_rem == 0: # This occurs if lambda is a multiple of r or lambda is 0. raise ValueError( "Division by zero in Euclidean algorithm. Check inputs r and lam." ) quotient: int = prev_rem // current_rem next_rem: int = prev_rem % current_rem # Update coefficients using the identity: R_next = R_prev - q * R_curr # where R represents [rem, s, t] s_next = s_prev - s_curr * quotient t_next = t_prev - t_curr * quotient # Shift states: current becomes previous, new becomes current euclidean_state[0] = [current_rem, s_curr, t_curr] euclidean_state[1] = [next_rem, s_next, t_next] # One final step to potentially find a shorter vector combination current_rem, s_curr, t_curr = euclidean_state[1] prev_rem, s_prev, t_prev = euclidean_state[0] if current_rem == 0: raise ValueError( "Division by zero in Euclidean algorithm final step. Check inputs r and lam." ) quotient = prev_rem // current_rem # Calculate the next potential remainder and t-coefficient final_rem = prev_rem % current_rem final_t = t_prev - t_curr * quotient # First basis vector: V1 = [current_rem, -t_curr] # Satisfies current_rem + (-t_curr)*lambda = 0 mod r (since current_rem = s_curr*r + t_curr*lambda) V1_list: List[int] = [current_rem, -t_curr] # Candidate vectors for the second basis vector V2 # Candidate 1: [prev_rem, -t_prev] cand1 = (prev_rem, -t_prev) # Candidate 2: [final_rem, -final_t] cand2 = (final_rem, -final_t) # Choose the shorter candidate vector based on squared Euclidean norm (||v||^2 = x^2 + y^2) norm1_sq: int = cand1[0] ** 2 + cand1[1] ** 2 norm2_sq: int = cand2[0] ** 2 + cand2[1] ** 2 if norm1_sq > norm2_sq: V2_list: List[int] = list(cand2) else: V2_list = list(cand1) # Calculate the determinant of the chosen basis {V1, V2} det: int = V1_list[0] * V2_list[1] - V1_list[1] * V2_list[0] if det == 0: # Basis vectors are linearly dependent, which shouldn't happen for typical inputs. raise ValueError( "Lattice determinant is zero. Input parameters might be unsuitable." ) def round_half_away_from_zero(a: int, b: int) -> int: """Computes round(a / b), rounding ties away from zero. Equivalent to standard mathematical rounding, differs from Python's default round() which rounds ties to the nearest even number. Needed to potentially match specific Go implementation behavior. """ if b == 0: raise ValueError("Division by zero in rounding.") # Perform division using absolute values quotient, remainder = divmod(abs(a), abs(b)) # Check if the remainder is large enough to round up (away from zero) if remainder * 2 >= abs(b): quotient += 1 # Restore the sign based on the original signs of a and b if (a < 0) != (b < 0): return -quotient # Result is negative else: return quotient # Result is positive # Compute rounding coefficients b1, b2 used in scalar decomposition # n is calculated to ensure 2^n is sufficiently larger than |det|, # potentially matching Go's fixed-size integer/word alignment logic. # The `+ 32 >> 6 << 6` part aligns the bit length to a multiple of 64. n_bit_length = max( 1, det ).bit_length() # Use max(1,...) for robustness if det=0 (though checked above) n: int = 2 * (((n_bit_length + 32) >> 6) << 6) # Calculate b1 = round(2^n * V2[1] / det) b1: int = round_half_away_from_zero(V2_list[1] << n, det) # Calculate b2 = round(2^n * V1[1] / det) b2: int = round_half_away_from_zero(V1_list[1] << n, det) # Return the results structured in the Lattice dataclass return Lattice(V1=tuple(V1_list), V2=tuple(V2_list), Det=det, b1=b1, b2=b2) def split_scalar(s: int, l: Lattice) -> Tuple[int, int]: """Splits a scalar s into components (u, v) using a precomputed GLV lattice. Based on the approach described in https://www.iacr.org/archive/crypto2001/21390189.pdf, this function finds a vector (u, v) such that s = u + v*lambda (mod r), where lambda and r are the parameters used to generate the lattice l. The vector (u, v) is typically chosen such that u and v have smaller magnitudes than s. Args: s: The scalar to split. l: The precomputed Lattice object containing basis V1, V2, determinant Det, and rounding coefficients b1, b2. Returns: A tuple (u, v) representing the scalar decomposition. """ # Calculate intermediate values k1, k2 using the scalar and rounding coefficients k1 = s * l.b1 k2 = -(s * l.b2) # Determine the shift amount 'n' used during lattice precomputation # This should match the logic in precompute_lattice n_bit_length = max(1, l.Det).bit_length() n = 2 * (((n_bit_length + 32) >> 6) << 6) # Right-shift k1 and k2 to effectively divide by 2^n, # approximating division by the determinant Det. # This gives the integer coefficients for the closest lattice vector approximation. k1 >>= n k2 >>= n # Calculate the lattice vector w = k1*V1 + k2*V2 w_vec0 = k1 * l.V1[0] + k2 * l.V2[0] w_vec1 = k1 * l.V1[1] + k2 * l.V2[1] # Calculate the final decomposition (u, v) # u = s - w[0] # v = -w[1] u = s - w_vec0 v = -w_vec1 return u, v def half_gcd_eisenstein_hint( modulus: int, scalar: int, eigen_value: int ) -> Tuple[int, int, int, int]: glv_basis = precompute_lattice(modulus, eigen_value) r = eisenstein.EisensteinInteger(glv_basis.V1[0], glv_basis.V1[1]) if scalar % modulus == modulus - 1: scalar = 1 # print(f"SPLIT SCALAR INPUT: {scalar}") sp = split_scalar(scalar, glv_basis) s = eisenstein.EisensteinInteger(sp[0], sp[1]) # in-circuit we check that Q - [s]P = 0 or equivalently Q + [-s]P = 0 # so here we return -s instead of s. s = -s # print(f"r: {r}, \ns: {s}") w, v_res, _ = eisenstein.half_gcd(r, s) # Note : outputs can be negative. return w.a0, w.a1, v_res.a0, v_res.a1 from garaga.hints.io import bigint_split def split(x): return bigint_split(x, 4, 2**64) def get_glv_fake_glv_hint( point: G1Point, scalar: int ) -> tuple[G1Point, int, int, int, int]: curve = CURVES[point.curve_id.value] assert ( curve.is_endomorphism_available() ), f"Curve {point.curve_id} does not have an endomorphism, use get_fake_glv_hint instead" eigen_value = curve.eigen_value u1, u2, v1, v2 = encode_glv_fake_glv_hint( *half_gcd_eisenstein_hint(curve.n, scalar, eigen_value) ) Q = point.scalar_mul(scalar) return Q, u1, u2, v1, v2 def encode(value: int) -> int: return abs(value) + 2**128 if value < 0 else value def encode_glv_fake_glv_hint( u1: int, u2: int, v1: int, v2: int ) -> tuple[int, int, int, int]: return encode(u1), encode(u2), encode(v1), encode(v2) def get_fake_glv_hint(point: G1Point, scalar: int) -> tuple[G1Point, int, int]: curve = CURVES[point.curve_id.value] if scalar == 0: scalar = 1 assert ( not curve.is_endomorphism_available() ), f"Curve {point.curve_id} has an endomorphism, use get_glv_fake_glv_hint instead" glv_basis = precompute_lattice(curve.n, scalar) s1, s2 = glv_basis.V1[0], glv_basis.V1[1] assert (s1 + scalar * s2) % curve.n == 0 assert 0 < s1 and s2 != 0 Q = point.scalar_mul(scalar) return Q, s1, encode(s2) def scalar_mul_glv_and_fake_glv(point: G1Point, scalar: int) -> G1Point: curve = CURVES[point.curve_id.value] assert scalar % curve.n != 0, f"Scalar is 0 for point {point}" assert point.is_infinity() == False, f"Point is infinity for scalar {scalar}" curve_id = point.curve_id if not curve.is_endomorphism_available(): raise ValueError( "Endomorphism not available for this curve. Use fake GLV instead." ) eigen_value = curve.eigen_value third_root_of_unity = curve.third_root_of_unity # %{ Hint : u1, u2, v1, v2 = half_gcd_eisenstein_hint(curve.n, scalar, eigen_value) Q = point.scalar_mul(scalar) # print(f"Q: {Q}") # %} # if scalar % curve.n == curve.n - 1: _scalar = 1 Q = G1Point.get_nG(curve_id, 2) else: _scalar = scalar # print(f"Q: {split(Q.x)}, {split(Q.y)}") # print(f"u1: {u1}, u2: {u2}, v1: {v1}, v2: {v2}") # print(f"encoded hint: {encode_glv_fake_glv_hint(u1, u2, v1, v2)}") # Verifier : # We need to check that: # s*(v1 + λ*v2) + u1 + λ*u2 = 0 assert ( _scalar * (v1 + eigen_value * v2) + u1 + eigen_value * u2 ) % curve.n == 0, f"Wrong decomposition for scalar {scalar}" # Precompute -P, -Φ(P), Φ(P): table_P = [None, None] if u1 < 0: table_P[1] = -point table_P[0] = point else: table_P[1] = point table_P[0] = -point table_Phi_P = [None, None] if u2 < 0: table_Phi_P[1] = G1Point(point.x * third_root_of_unity, -point.y, curve_id) table_Phi_P[0] = G1Point(point.x * third_root_of_unity, point.y, curve_id) else: table_Phi_P[1] = G1Point(point.x * third_root_of_unity, point.y, curve_id) table_Phi_P[0] = G1Point(point.x * third_root_of_unity, -point.y, curve_id) # precompute -Q, -Φ(Q), Φ(Q) table_Q = [None, None] if v1 < 0: table_Q[1] = -Q table_Q[0] = Q else: table_Q[1] = Q table_Q[0] = -Q table_Phi_Q = [None, None] if v2 < 0: table_Phi_Q[1] = G1Point(Q.x * third_root_of_unity, -Q.y, curve_id) table_Phi_Q[0] = G1Point(Q.x * third_root_of_unity, Q.y, curve_id) else: table_Phi_Q[1] = G1Point(Q.x * third_root_of_unity, Q.y, curve_id) table_Phi_Q[0] = G1Point(Q.x * third_root_of_unity, -Q.y, curve_id) # precompute -P-Q, P+Q, P-Q, -P+Q, -Φ(P)-Φ(Q), Φ(P)+Φ(Q), Φ(P)-Φ(Q), -Φ(P)+Φ(Q) table_S = [None, None, None, None] table_Phi_S = [None, None, None, None] table_S[0] = table_P[0].add(table_Q[0]) # -P-Q table_S[1] = -table_S[0] # P+Q table_S[2] = table_P[1].add(table_Q[0]) # P-Q table_S[3] = -table_S[2] # -P+Q # for i in range(4): # print(f"\nS{i}: {table_S[i].to_cairo_1(as_hex=False)}\n") # print(f"table_Phi_P[0]: {split(table_Phi_P[0].x)}, {split(table_Phi_P[0].y)}") # print(f"table_Phi_Q[0]: {split(table_Phi_Q[0].x)}, {split(table_Phi_Q[0].y)}") table_Phi_S[0] = table_Phi_P[0].add(table_Phi_Q[0]) # -Φ(P)-Φ(Q) table_Phi_S[1] = -table_Phi_S[0] # Φ(P)+Φ(Q) table_Phi_S[2] = table_Phi_P[1].add(table_Phi_Q[0]) # Φ(P)-Φ(Q) table_Phi_S[3] = -table_Phi_S[2] # -Φ(P)+Φ(Q) # we suppose that the first bits of the sub-scalars are 1 and set: # Acc = P + Q + Φ(P) + Φ(Q) Acc = table_S[1].add(table_Phi_S[1]) B1 = Acc # print(f"B1: {B1.to_cairo_1(as_hex=False)}") # print(f"B1: {split(B1.x)}, {split(B1.y)}") # then we add G (the base point) to Acc to avoid incomplete additions in # the loop, because when doing doubleAndAdd(Acc, Bi) as (Acc+Bi)+Acc it # might happen that Acc==Bi or Acc==-Bi. But now we force Acc to be # different than the stored Bi. However, at the end, Acc will not be the # point at infinity but [2^nbits]G. # # N.B.: Acc cannot be equal to G, otherwise this means G = -Φ²([s+1]P) Acc = Acc.add(G1Point.get_nG(point.curve_id, 1)) # // u1, u2, v1, v2 < r^{1/4} (up to a constant factor). # // We prove that the factor is log_(3/sqrt(3)))(r). # // so we need to add 9 bits to r^{1/4}.nbits(). # nbits := st.Modulus().BitLen()>>2 + 9 n_bits = curve.n.bit_length() // 4 + 9 # n_bits = 73 def to_bits_le(x: int) -> List[int]: """ ToBits returns the bit representation of the Element in little-endian (LSB first) order. """ # Convert to binary string, remove '0b' prefix, pad with zeros, and reverse bits_be = bin(x)[2:].zfill(n_bits) # print(bits_be) return [int(b) for b in bits_be[::-1]] u1_bits = to_bits_le(abs(u1)) u2_bits = to_bits_le(abs(u2)) v1_bits = to_bits_le(abs(v1)) v2_bits = to_bits_le(abs(v2)) # print(f"length of u1_bits: {len(u1_bits)}") # // At each iteration we look up the point Bi from: # // B1 = +P + Q + Φ(P) + Φ(Q) # // B2 = +P + Q + Φ(P) - Φ(Q) # At each iteration we look up the point Bi from: # B1 = +P + Q + Φ(P) + Φ(Q) # B2 = +P + Q + Φ(P) - Φ(Q) B2 = table_S[1].add(table_Phi_S[2]) # B3 = +P + Q - Φ(P) + Φ(Q) B3 = table_S[1].add(table_Phi_S[3]) # B4 = +P + Q - Φ(P) - Φ(Q) B4 = table_S[1].add(table_Phi_S[0]) # B5 = +P - Q + Φ(P) + Φ(Q) B5 = table_S[2].add(table_Phi_S[1]) # B6 = +P - Q + Φ(P) - Φ(Q) B6 = table_S[2].add(table_Phi_S[2]) # B7 = +P - Q - Φ(P) + Φ(Q) B7 = table_S[2].add(table_Phi_S[3]) # B8 = +P - Q - Φ(P) - Φ(Q) B8 = table_S[2].add(table_Phi_S[0]) # B9 = -P + Q + Φ(P) + Φ(Q) B9 = -B8 # B10 = -P + Q + Φ(P) - Φ(Q) B10 = -B7 # B11 = -P + Q - Φ(P) + Φ(Q) B11 = -B6 # B12 = -P + Q - Φ(P) - Φ(Q) B12 = -B5 # B13 = -P - Q + Φ(P) + Φ(Q) B13 = -B4 # B14 = -P - Q + Φ(P) - Φ(Q) B14 = -B3 # B15 = -P - Q - Φ(P) + Φ(Q) B15 = -B2 # B16 = -P - Q - Φ(P) - Φ(Q) B16 = -B1 # print(f"B1: {split(B1.x)}, {split(B1.y)}") # print(f"B2: {split(B2.x)}, {split(B2.y)}") # print(f"B3: {split(B3.x)}, {split(B3.y)}") # print(f"B4: {split(B4.x)}, {split(B4.y)}") # print(f"B5: {split(B5.x)}, {split(B5.y)}") # print(f"B6: {split(B6.x)}, {split(B6.y)}") # print(f"B7: {split(B7.x)}, {split(B7.y)}") # print(f"B8: {split(B8.x)}, {split(B8.y)}") # print(f"B9: {split(B9.x)}, {split(B9.y)}") # print(f"B10: {split(B10.x)}, {split(B10.y)}") # print(f"B11: {split(B11.x)}, {split(B11.y)}") # print(f"B12: {split(B12.x)}, {split(B12.y)}") # print(f"B13: {split(B13.x)}, {split(B13.y)}") # print(f"B14: {split(B14.x)}, {split(B14.y)}") # print(f"B15: {split(B15.x)}, {split(B15.y)}") # print(f"B16: {split(B16.x)}, {split(B16.y)}") # note that half the points are negatives of the other half, # hence have the same X coordinates. Bs = [B16, B8, B14, B6, B12, B4, B10, B2, B15, B7, B13, B5, B11, B3, B9, B1] # for i := nbits - 1; i > 0; i-- { # print(f"Acc; {Acc.to_cairo_1(as_hex=False)}") for i in range(n_bits - 1, 0, -1): # // selectorY takes values in [0,15] selector_y = u1_bits[i] + 2 * u2_bits[i] + 4 * v1_bits[i] + 8 * v2_bits[i] # print(f"selector_y_{i}: {selector_y}") # // selectorX takes values in [0,7] s.t.: # - when selectorY < 8: selectorX = selectorY # - when selectorY >= 8: selectorX = 15 - selectorY if selector_y < 8: selector_x = selector_y else: selector_x = 15 - selector_y # print(f"selector_x_{i}: {selector_x}") Bi = G1Point(Bs[selector_x].x, Bs[selector_y].y, point.curve_id) # // Acc = [2]Acc + Bi Acc = Acc.add(Acc) Acc = Acc.add(Bi) # print("Acc final: ", Acc.to_cairo_1(as_hex=False)) # i = 0 # # // i = 0 # // subtract the P, Q, Φ(P), Φ(Q) if the first bits are 0 # tableP[0] = c.Add(tableP[0], Acc) # Acc = c.Select(u1bits[0], Acc, tableP[0]) # tablePhiP[0] = c.Add(tablePhiP[0], Acc) # Acc = c.Select(u2bits[0], Acc, tablePhiP[0]) # tableQ[0] = c.Add(tableQ[0], Acc) # Acc = c.Select(v1bits[0], Acc, tableQ[0]) # tablePhiQ[0] = c.Add(tablePhiQ[0], Acc) # Acc = c.Select(v2bits[0], Acc, tablePhiQ[0]) if u1_bits[0] == 0: Acc = Acc.add(table_P[0]) if u2_bits[0] == 0: Acc = Acc.add(table_Phi_P[0]) if v1_bits[0] == 0: Acc = Acc.add(table_Q[0]) if v2_bits[0] == 0: Acc = Acc.add(table_Phi_Q[0]) # Acc should be now equal to [2^nbits]G gm = G1Point.get_nG(point.curve_id, 2 ** (n_bits - 1)) # print(f"gm: {split(gm.x)}, {split(gm.y)}") if scalar % curve.n == curve.n - 1: gm = Acc assert Acc == gm, f"Acc is not equal to [2^nbits]G, {Acc} != {gm}" return Q def _to_bits_le(value: int, length: int) -> List[int]: if value < 0: raise ValueError("Input value for _to_bits_le must be non-negative.") if length < 0: # zfill requires non-negative width length = 0 return [int(b) for b in bin(value)[2:].zfill(length)][::-1] def scalar_mul_fake_glv(point: G1Point, scalar: int) -> G1Point: curve = CURVES[point.curve_id.value] assert ( not curve.is_endomorphism_available() ), f"Curve {point.curve_id} has an endomorphism; this function is for curves without it." # Handle scalar multiple of curve order n: result is infinity. if scalar % curve.n == 0: return G1Point.infinity(point.curve_id) if point.is_infinity(): return G1Point.infinity(point.curve_id) # === Step 2: Handle Edge Cases & Initial Q_hinted === # Q_hinted is the actual result [scalar]P. We compute it first. # Verification steps below will ensure this computation was correct. # Handles point=infinity correctly via G1Point.scalar_mul. Q_hinted = point.scalar_mul(scalar) # Use scalar for decomposition. scalar=0 is handled above. scalar_for_decomposition = scalar # === Step 3: Scalar Decomposition === # Decompose scalar into s1, s2 such that s1 + scalar*s2 = 0 mod n glv_basis = precompute_lattice(curve.n, scalar_for_decomposition) s1 = glv_basis.V1[0] s2 = glv_basis.V1[1] # Note: s2 can be negative assert ( s1 + scalar_for_decomposition * s2 ) % curve.n == 0, f"Decomposition failed: {(s1 + scalar_for_decomposition * s2)=} % {curve.n=} != 0" assert ( s2 != 0 ), "s2 from decomposition should not be zero (required for verification logic)." # === Step 5: Prepare for Verification Loop === # Target bit length for decomposition components nbits = 128 assert ( nbits >= (curve.n.bit_length() + 1) // 2 ), f"nbits must be at least {(curve.n.bit_length() + 1) // 2}" s1_bits = _to_bits_le(abs(s1), nbits) s2_bits = _to_bits_le(abs(s2), nbits) s2_is_negative = s2 < 0 # === Step 6: Precomputation Tables for Verification === P_verify = point # Use the original input point for verification # Helper for tripling a point P -> P.add(P.add(P)) def _triple(p: G1Point) -> G1Point: if p.is_infinity(): return p p_doubled = p.add(p) return p_doubled.add(p) # Table for P_verify: [-P, P, 3P] table_P_verify = [-P_verify, P_verify, _triple(P_verify)] # Base point for R verification table is Q_hinted, potentially negated if s2 is negative. R_verify_base = Q_hinted R_signed_verify = -R_verify_base if s2_is_negative else R_verify_base # Table for R_signed_verify: [-R_signed, R_signed, 3R_signed] table_R_verify = [-R_signed_verify, R_signed_verify, _triple(R_signed_verify)] # === Step 7: Accumulator Initialization === # Initialize accumulator for the verification loop. # Acc = P_verify + R_signed_verify Acc = table_P_verify[1].add(table_R_verify[1]) # === Step 8: Precompute T_i Points for Merged Window === # These points are combinations of table_P_verify and table_R_verify elements # used in the optimized main loop (4*Acc + T computation). T1 = table_P_verify[2].add(table_R_verify[2]) T2 = Acc # T2 is the initial Accumulator value P + R_signed T3 = table_P_verify[2].add(table_R_verify[1]) T4 = table_P_verify[1].add(table_R_verify[2]) T5 = -T2 T6 = -T1 T7 = -T4 T8 = -T3 T9 = table_P_verify[2].add(table_R_verify[0]) _neg_table_R_verify_2 = -table_R_verify[2] T10 = table_P_verify[1].add(_neg_table_R_verify_2) T11 = table_P_verify[2].add(_neg_table_R_verify_2) T12 = table_R_verify[0].add(table_P_verify[1]) T13 = -T10 T14 = -T9 T15 = -T12 T16 = -T11 # selector_y maps directly to this 16-element list. T_mux_candidates_original = [ "T6", "T10", "T14", "T2", "T7", "T11", "T15", "T3", "T8", "T12", "T16", "T4", "T5", "T9", "T13", "T1", ] T_mux_candidates_new = [ "T6", "T7", "T10", "T11", "T8", "T5", "T12", "T9", "T14", "T15", "T2", "T3", "T16", "T13", "T4", "T1", ] # ['T6', 'T7', 'T10', 'T11', 'T8', 'T5', 'T12', 'T9', 'T14', 'T15', 'T2', 'T3', 'T16', 'T13', 'T4', 'T1'] T_mux_candidates = [ T6, # 0 T7, # 1 T10, # 2 T11, # 3 T8, # 4 T5, # 5 T12, # 6 T9, # 7 T14, # 8 T15, # 9 T2, # 10 T3, # 11 T16, # 12 T13, # 13 T4, # 14 T1, # 15 ] # for i, pt in enumerate(T_mux_candidates): # print(f"{i} {T_mux_candidates_new[i]}: {pt.to_cairo_1(as_hex=False)}") # === Step 9: Main Verification Loop === # Handle first iteration separately if nbits is even. assert nbits % 2 == 0 and nbits >= 2 # Inline the logic of _lookup2_point based on top two bits (MSB) b0 = s1_bits[nbits - 1] b1 = s2_bits[nbits - 1] # print(f"b0: {b0}, b1: {b1}") if not b0 and not b1: # 00 _T_current = T5 elif b0 and not b1: # 10 _T_current = T12 elif not b0 and b1: # 01 _T_current = T15 else: # b0 and b1: # 11 _T_current = T2 # assert _T_current == T12, f"_T_current: {_T_current.to_cairo_1(as_hex=False)} != T2: {T2.to_cairo_1(as_hex=False)}" # Acc = 2*Acc + _T_current # print(f"Acc before first iteration: {Acc.to_cairo_1(as_hex=False)}") # print(f"_T_current: {_T_current.to_cairo_1(as_hex=False)}") Acc = Acc.add(Acc) # Double Acc Acc = Acc.add(_T_current) # print(f"Acc before loop: {Acc.to_cairo_1(as_hex=False)}") _loop_start_idx = nbits - 2 # Start main loop from next lower index pair # Main loop: process bits in pairs using merged additions (4*Acc + T) iteration = 1 for i in range(_loop_start_idx, 2, -2): # Process indices i and i-1 # selector_y (0-15) encodes the 4 bits: (s1[i], s2[i], s1[i-1], s2[i-1]) selector_y = ( s1_bits[i] + (s2_bits[i] << 1) + (s1_bits[i - 1] << 2) + (s2_bits[i - 1] << 3) ) selector_old = T_mux_candidates_original[selector_y] selector_y = ( s1_bits[i - 1] + 2 * s1_bits[i] + 4 * (s2_bits[i - 1] + 2 * s2_bits[i]) ) # print(f"selector_{iteration-1}: {selector_y}") selector_new = T_mux_candidates_new[selector_y] assert ( selector_old == selector_new ), f"selector_old: {selector_old} != selector_new: {selector_new}" # Select the appropriate T point based on the 4 bits using the selectors _T_current = T_mux_candidates[selector_y] # Acc = 4*Acc + _T_current Acc = Acc.add(Acc) # Double Acc Acc = Acc.add(Acc) # Double Acc again Acc = Acc.add(_T_current) # print(f"i: {i}") # if iteration % 9 == 0: # print(f"Acc after iteration {iteration//9}: {Acc.to_cairo_1(as_hex=False)}") iteration += 1 # === Step 10: Last Merged Iteration === # Handles bits 2 and 1, with a final adjustment. if nbits >= 3: selector_y = ( s1_bits[2] + (s2_bits[2] << 1) + (s1_bits[1] << 2) + (s2_bits[1] << 3) ) selector_y = s1_bits[1] + 2 * s1_bits[2] + 4 * (s2_bits[1] + 2 * s2_bits[2]) _T_current = T_mux_candidates[selector_y] # Add the final adjustment term from table_R _T_current = _T_current.add(table_R_verify[2]) # print(f"last_selector_pt_corrected: {_T_current.to_cairo_1(as_hex=False)}") # Acc = 4*Acc + _T_current_adjusted Acc = Acc.add(Acc) # Double Acc Acc = Acc.add(Acc) # Double Acc again Acc = Acc.add(_T_current) # print(f"Acc after loop: {Acc.to_cairo_1(as_hex=False)}") # === Step 11: Final Additions Based on Bit 0 === # Adjust Acc based on the least significant bits s1[0] and s2[0]. if nbits >= 1: if s1_bits[0] == 0: Acc = table_P_verify[0].add(Acc) # Add -P_verify if s2_bits[0] == 0: Acc = table_R_verify[0].add(Acc) # Add -R_signed_verify # === Step 12: Final Assertion === # The final accumulator value should equal table_R_verify[2] (which is [3]R_signed_verify). AccToAssert = Acc # print(f"AccToAssert: {AccToAssert.to_cairo_1(as_hex=False)}") # print(f"R[2]: {table_R_verify[2].to_cairo_1(as_hex=False)}") assert ( AccToAssert == table_R_verify[2] ), f"Verification failed: {AccToAssert} != {table_R_verify[2]}. Scalar: {scalar}, Point Inf: {point.is_infinity()}" # === Step 13: Return Value === # Return the originally computed Q_hinted = [scalar]P return Q_hinted if __name__ == "__main__": pass pt = G1Point( x=41688611208562472964299242833 + 2**96 * 17729154263670546193656586433 + 2 ** (96 * 2) * 573097972700812243, y=17058526127824350916476358273 + 2**96 * 14653894641525928814918228506 + 2 ** (96 * 2) * 711563577730354681, curve_id=CurveID.GRUMPKIN, ) scalar = ( 77864287393115290533831713130 + 2**96 * 47687594959966383440346360609 + 2 ** (96 * 2) * 677739838819293451 ) _res = scalar_mul_fake_glv(pt, scalar) # random.seed(0) # s = 111793196543967404139194827996419963236210979610743141064269745943111491389390 # print(f"scalar: {s}") # g = G1Point.get_nG(CurveID.SECP256K1, 1) # res = scalar_mul_glv_and_fake_glv(g, s) # # print(g.to_cairo_1()) # # print(res.to_cairo_1()) # from garaga.curves import * # for curve_id in CURVES: # curve: WeierstrassCurve = CURVES[curve_id] # if curve.is_endomorphism_available(): # nbits = curve.n.bit_length() // 4 + 9 # used_nbits = 73 # assert ( # used_nbits >= nbits # ), f"Curve {curve_id} has {nbits} bits, but used {used_nbits} bits" # print( # f"Curve {curve_id}: {nbits}, {G1Point.get_nG(CurveID(curve_id), 2 ** (used_nbits -1)).to_cairo_1()}" # ) # T_mux_candidates = [ # "T6", # "T10", # "T14", # "T2", # "T7", # "T11", # "T15", # "T3", # "T8", # "T12", # "T16", # "T4", # "T5", # "T9", # "T13", # "T1", # ] # set_original = [] # set_new = [] # map_original = { # (u, u_min_1, v, v_min_1): "" # for u in [0, 1] # for u_min_1 in [0, 1] # for v in [0, 1] # for v_min_1 in [0, 1] # } # new_T_mux_candidates = [None] * 16 # for bit_u in [0, 1]: # for bit_u_min_1 in [0, 1]: # for bit_v in [0, 1]: # for bit_v_min_1 in [0, 1]: # selector_y = bit_u + 2 * bit_v + 4 * bit_u_min_1 + 8 * bit_v_min_1 # set_original.append(selector_y) # wanted = T_mux_candidates[selector_y] # map_original[(bit_u, bit_u_min_1, bit_v, bit_v_min_1)] = wanted # needed_bit = bit_u_min_1 + 2*bit_u + 4 * (bit_v_min_1 + 2 * bit_v) # new_T_mux_candidates[needed_bit] = wanted # set_new.append(needed_bit) # print( # f"{bit_u}, {bit_u_min_1}, {bit_v}, {bit_v_min_1} -> {selector_y} || {needed_bit} -> {wanted}" # ) # print(f"set_original: {sorted(set_original)}") # print(f"set_new: {sorted(set_new)}") # assert sorted(set_original) == sorted( # set_new # ), "set_original and set_new are not equal" # print(T_mux_candidates) # print(new_T_mux_candidates) ================================================ FILE: hydra/garaga/hints/frobenius.py ================================================ from functools import lru_cache from garaga.algebra import BaseField, Polynomial, PyFelt from garaga.curves import CURVES, CurveID, get_irreducible_poly from garaga.hints.tower_backup import E6, E12 # Cache directory path CACHE_DIR = "build/frobenius_cache" @lru_cache(maxsize=32) def get_p_powers_of_V(curve_id: int, extension_degree: int, k: int) -> list[Polynomial]: """ Computes V^(i*p^k) for i in range(extension_degree), where V is the polynomial V(X) = X. Args: curve_id (int): Identifier for the curve. extension_degree (int): Degree of the field extension. k (int): Exponent in p^k, must be 1, 2, or 3. Returns: list[Polynomial]: List of polynomials representing V^(i*p^k) for i in range(extension_degree). """ assert k in [1, 2, 3], f"Supported k values are 1, 2, 3. Received: {k}" field = BaseField(CURVES[curve_id].p) V = Polynomial( [field.zero() if i != 1 else field.one() for i in range(extension_degree)] ) if extension_degree == 12: V_tower = E12.from_poly(V, curve_id) elif extension_degree == 6: V_tower = E6.from_poly(V, curve_id) else: raise ValueError(f"Unsupported extension degree: {extension_degree}") V_pow_E12 = [V_tower ** (i * field.p**k) for i in range(extension_degree)] V_pow = [v.to_poly() for v in V_pow_E12] return V_pow @lru_cache(maxsize=32) def get_V_torus_powers(curve_id: int, extension_degree: int, k: int) -> Polynomial: """ Computes 1/V^((p^k - 1) // 2) where V is the polynomial V(X) = X. This is used to compute the Frobenius automorphism in the Torus. Usage is deprecated since torus arithmetic is not used anymore with the final exp witness. Args: curve_id (int): Identifier for the curve. extension_degree (int): Degree of the field extension. k (int): Exponent in p^k, must be 1, 2, or 3. Returns: list[Polynomial]: List of polynomials representing V^(i*p^k) for i in range(extension_degree). """ assert k in [1, 2, 3], f"Supported k values are 1, 2, 3. Received: {k}" field = BaseField(CURVES[curve_id].p) irr = get_irreducible_poly(curve_id, extension_degree) V = Polynomial( [field.zero() if i != 1 else field.one() for i in range(extension_degree)] ) V_pow = V.pow((field.p**k - 1) // 2, irr) inverse, _, _ = Polynomial.xgcd(V_pow, irr) return inverse def frobenius( F: list[PyFelt], V_pow: list[Polynomial], p: int, frob_power: int, irr: Polynomial ) -> Polynomial: """ Applies the Frobenius automorphism to a polynomial in a direct extension field. Args: F (list[PyFelt]): Coefficients of the polynomial. V_pow (list[Polynomial]): Precomputed powers of V (using get_p_powers_of_V). p (int): Prime number of the base field. frob_power (int): Power of the Frobenius automorphism. irr (Polynomial): Irreducible polynomial for the field extension. Returns: Polynomial: Result of applying Frobenius automorphism. """ assert len(F) == len(V_pow), "Mismatch in lengths of F and V_pow." acc = Polynomial([PyFelt(0, p)]) for i, f in enumerate(F): acc += V_pow[i] * f assert acc == ( Polynomial(F).pow(p**frob_power, irr) ), "Mismatch in expected result." return acc @lru_cache(maxsize=32) def generate_frobenius_maps( curve_id, extension_degree: int, frob_power: int ) -> tuple[list[str], list[list[tuple[int, int]]]]: """ Generates symbolic expressions for Frobenius map coefficients and a list of tuples with constants. Args: curve_id (CurveID): Identifier for the curve. extension_degree (int): Degree of the field extension. frob_power (int): Power of the Frobenius automorphism. Returns: tuple[list[str], list[list[tuple[int, int]]]]: Symbolic expressions for each coefficient and a list of tuples with constants. """ curve_id = curve_id if isinstance(curve_id, int) else curve_id.value V_pow = get_p_powers_of_V(curve_id, extension_degree, frob_power) k_expressions = ["" for _ in range(extension_degree)] constants_list = [[] for _ in range(extension_degree)] for i in range(extension_degree): for f_index, poly in enumerate(V_pow): if poly[i] != 0: hex_value = f"0x{poly[i].value:x}" compact_hex = ( f"{hex_value[:6]}...{hex_value[-4:]}" if len(hex_value) > 10 else hex_value ) k_expressions[i] += f" + {compact_hex} * f_{f_index}" constants_list[i].append([f_index, poly[i].value]) return k_expressions, constants_list def get_frobenius_maps(curve_id, extension_degree, frob_power): res = FROBENIUS_MAPS[curve_id][extension_degree][frob_power] return res["k_expressions"], res["constants_list"] FROBENIUS_MAPS = { CurveID.BN254.value: { 6: { 1: { "k_expressions": [ " + 0x1 * f_0 + 0x12 * f_3", " + 0x242b...21a7 * f_1 + 0x3598...2536 * f_4", " + 0x2c84...048b * f_2 + 0xc33b...a7b5 * f_5", " + 0x3064...fd46 * f_3", " + 0x16c9...cba2 * f_1 + 0xc38d...dba0 * f_4", " + 0x2c14...8126 * f_2 + 0x3df9...f8bc * f_5", ], "constants_list": [ [[0, 0x1], [3, 0x12]], [ [ 1, 0x242B719062F6737B8481D22C6934CE844D72F250FD28D102C0D147B2F4D521A7, ], [ 4, 0x359809094BD5C8E1B9C22D81246FFC2E794E17643AC198484B8D9094AA82536, ], ], [ [ 2, 0x2C84BBAD27C3671562B7ADEFD44038AB3C0BBAD96FC008E7D6998C82F7FC048B, ], [ 5, 0xC33B1C70E4FD11B6D1EAB6FCD18B99AD4AFD096A8697E0C9C36D8CA3339A7B5, ], ], [ [ 3, 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD46, ] ], [ [ 1, 0x16C9E55061EBAE204BA4CC8BD75A079432AE2A1D0B7C9DCE1665D51C640FCBA2, ], [ 4, 0xC38DCE27E3B2CAE33CE738A184C89D94A0E78406B48F98A7B4F4463E3A7DBA0, ], ], [ [ 2, 0x2C145EDBE7FD8AEE9F3A80B03B0B1C923685D2EA1BDEC763C13B4711CD2B8126, ], [ 5, 0x3DF92C5B96E3914559897C6AD411FB25B75AFB7F8B1C1A56586FF93E080F8BC, ], ], ], }, 2: { "k_expressions": [ " + 0x1 * f_0", " + 0x3064...fd48 * f_1", " + 0x59e2...fffe * f_2", " + 0x1 * f_3", " + 0x3064...fd48 * f_4", " + 0x59e2...fffe * f_5", ], "constants_list": [ [[0, 0x1]], [ [ 1, 0x30644E72E131A0295E6DD9E7E0ACCCB0C28F069FBB966E3DE4BD44E5607CFD48, ] ], [[2, 0x59E26BCEA0D48BACD4F263F1ACDB5C4F5763473177FFFFFE]], [[3, 0x1]], [ [ 4, 0x30644E72E131A0295E6DD9E7E0ACCCB0C28F069FBB966E3DE4BD44E5607CFD48, ] ], [[5, 0x59E26BCEA0D48BACD4F263F1ACDB5C4F5763473177FFFFFE]], ], }, 3: { "k_expressions": [ " + 0x1 * f_0 + 0x12 * f_3", " + 0xc3a5...3ae6 * f_1 + 0x2ce0...77f4 * f_4", " + 0x1bfe...9cc0 * f_2 + 0x697b...2fbd * f_5", " + 0x3064...fd46 * f_3", " + 0x4f1d...86de * f_1 + 0x2429...c261 * f_4", " + 0x23d5...239f * f_2 + 0x1465...6087 * f_5", ], "constants_list": [ [[0, 0x1], [3, 0x12]], [ [ 1, 0xC3A5E9C462A654779C3E050C9CA2A428908A81264E2B5A5BF22F67654883AE6, ], [ 4, 0x2CE02AA5F9BF8CD65BDD2055C255CF9D9E08C1D9345582CC92FD973C74BD77F4, ], ], [ [ 2, 0x1BFE7B214C0294242FB81A8DCCD8A9B4441D64F34150A79753FB0CD31CC99CC0, ], [ 5, 0x697B9C523E0390ED15DA0EC97A9B8346513297B9EFAF0F0F1A228F0D5662FBD, ], ], [ [ 3, 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD46, ] ], [ [ 1, 0x4F1DE41B3D1766FA9F30E6DEC26094F0FDF31BF98FF2631380CAB2BAAA586DE, ], [ 4, 0x2429EFD69B073AE23E8C6565B7B72E1B0E78C27F038F14E77CFD95A083F4C261, ], ], [ [ 2, 0x23D5E999E1910A12FEB0F6EF0CD21D04A44A9E08737F96E55FE3ED9D730C239F, ], [ 5, 0x1465D351952F0C0588982B28B4A8AEA95364059E272122F5E8257F43BBB36087, ], ], ], }, }, 12: { 1: { "k_expressions": [ " + 0x1 * f_0 + 0x12 * f_6", " + 0x1d8c...5955 * f_1 + 0x217e...a71a * f_7", " + 0x242b...21a7 * f_2 + 0x3598...2536 * f_8", " + 0x2143...d5ed * f_3 + 0x1885...f771 * f_9", " + 0x2c84...048b * f_4 + 0xc33b...a7b5 * f_10", " + 0x1b00...cfa8 * f_5 + 0x215d...3977 * f_11", " + 0x3064...fd46 * f_6", " + 0x2469...62ac * f_1 + 0x12d7...a3f2 * f_7", " + 0x16c9...cba2 * f_2 + 0xc38d...dba0 * f_8", " + 0x7c03...b0e3 * f_3 + 0xf20e...275a * f_9", " + 0x2c14...8126 * f_4 + 0x3df9...f8bc * f_10", " + 0x12ac...2c4b * f_5 + 0x1563...2d9f * f_11", ], "constants_list": [ [[0, 0x1], [6, 0x12]], [ [ 1, 0x1D8C8DAEF3EEE1E81B2522EC5EB28DED6895E1CDFDE6A43F5DAA971F3FA65955, ], [ 7, 0x217E400DC9351E774E34E2AC06EAD4000D14D1E242B29C567E9C385CE480A71A, ], ], [ [ 2, 0x242B719062F6737B8481D22C6934CE844D72F250FD28D102C0D147B2F4D521A7, ], [ 8, 0x359809094BD5C8E1B9C22D81246FFC2E794E17643AC198484B8D9094AA82536, ], ], [ [ 3, 0x21436D48FCB50CC60DD4EF1E69A0C1F0DD2949FA6DF7B44CBB259EF7CB58D5ED, ], [ 9, 0x18857A58F3B5BB3038A4311A86919D9C7C6C15F88A4F4F0831364CF35F78F771, ], ], [ [ 4, 0x2C84BBAD27C3671562B7ADEFD44038AB3C0BBAD96FC008E7D6998C82F7FC048B, ], [ 10, 0xC33B1C70E4FD11B6D1EAB6FCD18B99AD4AFD096A8697E0C9C36D8CA3339A7B5, ], ], [ [ 5, 0x1B007294A55ACCCE13FE08BEA73305FF6BDAC77C5371C546D428780A6E3DCFA8, ], [ 11, 0x215D42E7AC7BD17CEFE88DD8E6965B3ADAE92C974F501FE811493D72543A3977, ], ], [ [ 6, 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD46, ] ], [ [ 1, 0x246996F3B4FAE7E6A6327CFE12150B8E747992778EEEC7E5CA5CF05F80F362AC, ], [ 7, 0x12D7C0C3ED42BE419D2B22CA22CECA702EEB88C36A8B264DDE75F4F798D6A3F2, ], ], [ [ 2, 0x16C9E55061EBAE204BA4CC8BD75A079432AE2A1D0B7C9DCE1665D51C640FCBA2, ], [ 8, 0xC38DCE27E3B2CAE33CE738A184C89D94A0E78406B48F98A7B4F4463E3A7DBA0, ], ], [ [ 3, 0x7C03CBCAC41049A0704B5A7EC796F2B21807DC98FA25BD282D37F632623B0E3, ], [ 9, 0xF20E129E47C9363AA7B569817E0966CBA582096FA7A164080FAED1F0D24275A, ], ], [ [ 4, 0x2C145EDBE7FD8AEE9F3A80B03B0B1C923685D2EA1BDEC763C13B4711CD2B8126, ], [ 10, 0x3DF92C5B96E3914559897C6AD411FB25B75AFB7F8B1C1A56586FF93E080F8BC, ], ], [ [ 5, 0x12ACF2CA76FD0675A27FB246C7729F7DB080CB99678E2AC024C6B8EE6E0C2C4B, ], [ 11, 0x1563DBDE3BD6D35BA4523CF7DA4E525E2BA6A3151500054667F8140C6A3F2D9F, ], ], ], }, 2: { "k_expressions": [ " + 0x1 * f_0", " + 0x3064...fd49 * f_1", " + 0x3064...fd48 * f_2", " + 0x3064...fd46 * f_3", " + 0x59e2...fffe * f_4", " + 0x59e2...ffff * f_5", " + 0x1 * f_6", " + 0x3064...fd49 * f_7", " + 0x3064...fd48 * f_8", " + 0x3064...fd46 * f_9", " + 0x59e2...fffe * f_10", " + 0x59e2...ffff * f_11", ], "constants_list": [ [[0, 0x1]], [ [ 1, 0x30644E72E131A0295E6DD9E7E0ACCCB0C28F069FBB966E3DE4BD44E5607CFD49, ] ], [ [ 2, 0x30644E72E131A0295E6DD9E7E0ACCCB0C28F069FBB966E3DE4BD44E5607CFD48, ] ], [ [ 3, 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD46, ] ], [[4, 0x59E26BCEA0D48BACD4F263F1ACDB5C4F5763473177FFFFFE]], [[5, 0x59E26BCEA0D48BACD4F263F1ACDB5C4F5763473177FFFFFF]], [[6, 0x1]], [ [ 7, 0x30644E72E131A0295E6DD9E7E0ACCCB0C28F069FBB966E3DE4BD44E5607CFD49, ] ], [ [ 8, 0x30644E72E131A0295E6DD9E7E0ACCCB0C28F069FBB966E3DE4BD44E5607CFD48, ] ], [ [ 9, 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD46, ] ], [[10, 0x59E26BCEA0D48BACD4F263F1ACDB5C4F5763473177FFFFFE]], [[11, 0x59E26BCEA0D48BACD4F263F1ACDB5C4F5763473177FFFFFF]], ], }, 3: { "k_expressions": [ " + 0x1 * f_0 + 0x12 * f_6", " + 0x13d0...dd76 * f_1 + 0x18a0...7a66 * f_7", " + 0xc3a5...3ae6 * f_2 + 0x2ce0...77f4 * f_8", " + 0xf20e...275a * f_3 + 0x17de...05d6 * f_9", " + 0x1bfe...9cc0 * f_4 + 0x697b...2fbd * f_10", " + 0x7a0e...c6fe * f_5 + 0x1b76...267f * f_11", " + 0x3064...fd46 * f_6", " + 0xabf8...c101 * f_1 + 0x1c93...1fd1 * f_7", " + 0x4f1d...86de * f_2 + 0x2429...c261 * f_8", " + 0x28a4...4c64 * f_3 + 0x2143...d5ed * f_9", " + 0x23d5...239f * f_4 + 0x1465...6087 * f_10", " + 0x16db...2499 * f_5 + 0x28c3...3649 * f_11", ], "constants_list": [ [[0, 0x1], [6, 0x12]], [ [ 1, 0x13D0C369615F7BB0B2BDFA8FEF85FA07122BDE8D67DFC8FABD3581AD840DDD76, ], [ 7, 0x18A0F4219F4FDFF6FC2BF531EB331A053A35744CAC285AF5685D3F90EACF7A66, ], ], [ [ 2, 0xC3A5E9C462A654779C3E050C9CA2A428908A81264E2B5A5BF22F67654883AE6, ], [ 8, 0x2CE02AA5F9BF8CD65BDD2055C255CF9D9E08C1D9345582CC92FD973C74BD77F4, ], ], [ [ 3, 0xF20E129E47C9363AA7B569817E0966CBA582096FA7A164080FAED1F0D24275A, ], [ 9, 0x17DED419ED7BE4F97FAC149BFAEFBAC11B155498DE227B850AEA3F23790405D6, ], ], [ [ 4, 0x1BFE7B214C0294242FB81A8DCCD8A9B4441D64F34150A79753FB0CD31CC99CC0, ], [ 10, 0x697B9C523E0390ED15DA0EC97A9B8346513297B9EFAF0F0F1A228F0D5662FBD, ], ], [ [ 5, 0x7A0E052F2B1C443B5186D6AC4C723B85D3F78A3182D2DB0C413901C32B0C6FE, ], [ 11, 0x1B76A37FBA85F3CD5DC79824A3792597356C892C39C0D06B220500933945267F, ], ], [ [ 6, 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD46, ] ], [ [ 1, 0xABF8B60BE77D7306CBEEE33576139D7F03A5E397D439EC7694AA2BF4C0C101, ], [ 7, 0x1C938B097FD2247905924B2691FB5E5685558C04009201927EEB0A69546F1FD1, ], ], [ [ 2, 0x4F1DE41B3D1766FA9F30E6DEC26094F0FDF31BF98FF2631380CAB2BAAA586DE, ], [ 8, 0x2429EFD69B073AE23E8C6565B7B72E1B0E78C27F038F14E77CFD95A083F4C261, ], ], [ [ 3, 0x28A411B634F09B8FB14B900E9507E9327600ECC7D8CF6EBAB94D0CB3B2594C64, ], [ 9, 0x21436D48FCB50CC60DD4EF1E69A0C1F0DD2949FA6DF7B44CBB259EF7CB58D5ED, ], ], [ [ 4, 0x23D5E999E1910A12FEB0F6EF0CD21D04A44A9E08737F96E55FE3ED9D730C239F, ], [ 10, 0x1465D351952F0C0588982B28B4A8AEA95364059E272122F5E8257F43BBB36087, ], ], [ [ 5, 0x16DB366A59B1DD0B9FB1B2282A48633D3E2DDAEA200280211F25041384282499, ], [ 11, 0x28C36E1FEE7FDBE60337D84BBCBA34A53A41F1EE50449CDC780CFBFAA5CC3649, ], ], ], }, }, }, CurveID.BLS12_381.value: { 6: { 1: { "k_expressions": [ " + 0x1 * f_0 + 0x2 * f_3", " + 0x5f19...ffff * f_1", " + 0x1a01...aaad * f_2 + 0x1a01...aaaf * f_5", " + 0x1a01...aaaa * f_3", " + 0x1a01...aaac * f_1 + 0x1a01...aaac * f_4", " + 0x5f19...fffe * f_5", ], "constants_list": [ [[0x0, 0x1], [0x3, 0x2]], [ [ 0x1, 0x5F19672FDF76CE51BA69C6076A0F77EADDB3A93BE6F89688DE17D813620A00022E01FFFFFFFEFFFF, ] ], [ [ 0x2, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAD, ], [ 0x5, 0x1A0111EA397FE6998CE8D956845E1033EFA3BF761F6622E9ABC9802928BFC912627C4FD7ED3FFFFB5DFB00000001AAAF, ], ], [ [ 0x3, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA, ] ], [ [ 0x1, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAC, ], [ 0x4, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAC, ], ], [ [ 0x5, 0x5F19672FDF76CE51BA69C6076A0F77EADDB3A93BE6F89688DE17D813620A00022E01FFFFFFFEFFFE, ] ], ], }, 2: { "k_expressions": [ " + 0x1 * f_0", " + 0x5f19...fffe * f_1", " + 0x1a01...aaac * f_2", " + 0x1 * f_3", " + 0x5f19...fffe * f_4", " + 0x1a01...aaac * f_5", ], "constants_list": [ [[0x0, 0x1]], [ [ 0x1, 0x5F19672FDF76CE51BA69C6076A0F77EADDB3A93BE6F89688DE17D813620A00022E01FFFFFFFEFFFE, ] ], [ [ 0x2, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAC, ] ], [[0x3, 0x1]], [ [ 0x4, 0x5F19672FDF76CE51BA69C6076A0F77EADDB3A93BE6F89688DE17D813620A00022E01FFFFFFFEFFFE, ] ], [ [ 0x5, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAC, ] ], ], }, 3: { "k_expressions": [ " + 0x1 * f_0 + 0x2 * f_3", " + 0x1a01...aaaa * f_1", " + 0x1a01...aaaa * f_2 + 0x1a01...aaa9 * f_5", " + 0x1a01...aaaa * f_3", " + 0x1 * f_1 + 0x1 * f_4", " + 0x1 * f_5", ], "constants_list": [ [[0, 0x1], [3, 0x2]], [ [ 1, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA, ] ], [ [ 2, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA, ], [ 5, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAA9, ], ], [ [ 3, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA, ] ], [[1, 0x1], [4, 0x1]], [[5, 0x1]], ], }, }, 12: { 1: { "k_expressions": [ " + 0x1 * f_0 + 0x2 * f_6", " + 0x1808...14c5 * f_1 + 0x1808...14c5 * f_7", " + 0x5f19...ffff * f_2", " + 0xd5e1...9812 * f_9", " + 0x1a01...aaad * f_4 + 0x1a01...aaaf * f_10", " + 0xb659...022c * f_5 + 0xb659...022c * f_11", " + 0x1a01...aaaa * f_6", " + 0xfc3e...4af3 * f_1 + 0x1f87...95e6 * f_7", " + 0x1a01...aaac * f_2 + 0x1a01...aaac * f_8", " + 0x6af0...cc09 * f_3", " + 0x5f19...fffe * f_10", " + 0x144e...2995 * f_5 + 0xe9b7...a87f * f_11", ], "constants_list": [ [[0, 0x1], [6, 0x2]], [ [ 1, 0x18089593CBF626353947D5B1FD0C6D66BB34BC7585F5ABDF8F17B50E12C47D65CE514A7C167B027B600FEBDB244714C5, ], [ 7, 0x18089593CBF626353947D5B1FD0C6D66BB34BC7585F5ABDF8F17B50E12C47D65CE514A7C167B027B600FEBDB244714C5, ], ], [ [ 2, 0x5F19672FDF76CE51BA69C6076A0F77EADDB3A93BE6F89688DE17D813620A00022E01FFFFFFFEFFFF, ] ], [ [ 9, 0xD5E1C086FFE8016D063C6DAD7A2FFFC9072BB5785A686BCEFEEDC2E0124838BDCCF325EE5D80BE9902109F7DBC79812, ] ], [ [ 4, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAD, ], [ 10, 0x1A0111EA397FE6998CE8D956845E1033EFA3BF761F6622E9ABC9802928BFC912627C4FD7ED3FFFFB5DFB00000001AAAF, ], ], [ [ 5, 0xB659FB20274BFB1BE8FF4D69163C08BE7302C4818171FDD17D5BE9B1D380ACD8C747CDC4AFF0E653631F5D3000F022C, ], [ 11, 0xB659FB20274BFB1BE8FF4D69163C08BE7302C4818171FDD17D5BE9B1D380ACD8C747CDC4AFF0E653631F5D3000F022C, ], ], [ [ 6, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA, ] ], [ [ 1, 0xFC3E2B36C4E03288E9E902231F9FB854A14787B6C7B36FEC0C8EC971F63C5F282D5AC14D6C7EC22CF78A126DDC4AF3, ], [ 7, 0x1F87C566D89C06511D3D204463F3F70A9428F0F6D8F66DFD8191D92E3EC78BE505AB5829AD8FD8459EF1424DBB895E6, ], ], [ [ 2, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAC, ], [ 8, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAC, ], ], [ [ 3, 0x6AF0E0437FF400B6831E36D6BD17FFE48395DABC2D3435E77F76E17009241C5EE67992F72EC05F4C81084FBEDE3CC09, ] ], [ [ 10, 0x5F19672FDF76CE51BA69C6076A0F77EADDB3A93BE6F89688DE17D813620A00022E01FFFFFFFEFFFE, ] ], [ [ 5, 0x144E4211384586C16BD3AD4AFA99CC9170DF3560E77982D0DB45F3536814F0BD5871C1908BD478CD1EE605167FF82995, ], [ 11, 0xE9B7238370B26E88C8BB2DFB1E7EC4B7D471F3CDB6DF2E24F5B1405D978EB56923783226654F19A83CD0A2CFFF0A87F, ], ], ], }, 2: { "k_expressions": [ " + 0x1 * f_0", " + 0x5f19...ffff * f_1", " + 0x5f19...fffe * f_2", " + 0x1a01...aaaa * f_3", " + 0x1a01...aaac * f_4", " + 0x1a01...aaad * f_5", " + 0x1 * f_6", " + 0x5f19...ffff * f_7", " + 0x5f19...fffe * f_8", " + 0x1a01...aaaa * f_9", " + 0x1a01...aaac * f_10", " + 0x1a01...aaad * f_11", ], "constants_list": [ [[0, 0x1]], [ [ 1, 0x5F19672FDF76CE51BA69C6076A0F77EADDB3A93BE6F89688DE17D813620A00022E01FFFFFFFEFFFF, ] ], [ [ 2, 0x5F19672FDF76CE51BA69C6076A0F77EADDB3A93BE6F89688DE17D813620A00022E01FFFFFFFEFFFE, ] ], [ [ 3, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA, ] ], [ [ 4, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAC, ] ], [ [ 5, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAD, ] ], [[6, 0x1]], [ [ 7, 0x5F19672FDF76CE51BA69C6076A0F77EADDB3A93BE6F89688DE17D813620A00022E01FFFFFFFEFFFF, ] ], [ [ 8, 0x5F19672FDF76CE51BA69C6076A0F77EADDB3A93BE6F89688DE17D813620A00022E01FFFFFFFEFFFE, ] ], [ [ 9, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA, ] ], [ [ 10, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAC, ] ], [ [ 11, 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAD, ] ], ], }, 3: { "k_expressions": [ " + 0x1 * f_0 + 0x2 * f_6", " + 0xca2f...1299 * f_1 + 0xca2f...1299 * f_7", " + 0x1a01...aaaa * f_2", " + 0xca2f...1299 * f_9", " + 0x1a01...aaaa * f_4 + 0x1a01...aaa9 * f_10", " + 0xd5e1...9812 * f_5 + 0xd5e1...9812 * f_11", " + 0x1a01...aaaa * f_6", " + 0x6af0...cc09 * f_1 + 0xd5e1...9812 * f_7", " + 0x1 * f_2 + 0x1 * f_8", " + 0x1352...dea2 * f_3", " + 0x1 * f_10", " + 0x1352...dea2 * f_5 + 0xca2f...1299 * f_11", ], "constants_list": [ [[0, 0x1], [6, 0x2]], [ [ 1, 0xCA2F5E1C98166837AB7E0DB6BA8ACDAD404902D6DDE8C027741F672F58C729841DCCD9FCB7BF41629DDF60824381299, ], [ 7, 0xCA2F5E1C98166837AB7E0DB6BA8ACDAD404902D6DDE8C027741F672F58C729841DCCD9FCB7BF41629DDF60824381299, ], ], [ [ 2, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA, ] ], [ [ 9, 0xCA2F5E1C98166837AB7E0DB6BA8ACDAD404902D6DDE8C027741F672F58C729841DCCD9FCB7BF41629DDF60824381299, ] ], [ [ 4, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA, ], [ 10, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAA9, ], ], [ [ 5, 0xD5E1C086FFE8016D063C6DAD7A2FFFC9072BB5785A686BCEFEEDC2E0124838BDCCF325EE5D80BE9902109F7DBC79812, ], [ 11, 0xD5E1C086FFE8016D063C6DAD7A2FFFC9072BB5785A686BCEFEEDC2E0124838BDCCF325EE5D80BE9902109F7DBC79812, ], ], [ [ 6, 0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA, ] ], [ [ 1, 0x6AF0E0437FF400B6831E36D6BD17FFE48395DABC2D3435E77F76E17009241C5EE67992F72EC05F4C81084FBEDE3CC09, ], [ 7, 0xD5E1C086FFE8016D063C6DAD7A2FFFC9072BB5785A686BCEFEEDC2E0124838BDCCF325EE5D80BE9902109F7DBC79812, ], ], [[2, 0x1], [8, 0x1]], [ [ 3, 0x135203E60180A68EE2E9C448D77A2CD91C3DEDD930B1CF60EF396489F61EB45E304466CF3E67FA0AF1EE7B04121BDEA2, ] ], [[10, 0x1]], [ [ 5, 0x135203E60180A68EE2E9C448D77A2CD91C3DEDD930B1CF60EF396489F61EB45E304466CF3E67FA0AF1EE7B04121BDEA2, ], [ 11, 0xCA2F5E1C98166837AB7E0DB6BA8ACDAD404902D6DDE8C027741F672F58C729841DCCD9FCB7BF41629DDF60824381299, ], ], ], }, }, }, } if __name__ == "__main__": from random import randint # Frobenius maps def test_frobenius_maps(): constants_lists = {} for extension_degree in [6, 12]: for curve_id in [CurveID.BN254, CurveID.BLS12_381]: if curve_id.name not in constants_lists: constants_lists[curve_id.name] = {} if extension_degree not in constants_lists[curve_id.name]: constants_lists[curve_id.name][extension_degree] = {} p = CURVES[curve_id.value].p for frob_power in [1, 2, 3]: print( f"\nFrobenius^{frob_power} for {curve_id.name} Fp{extension_degree}" ) irr = get_irreducible_poly(curve_id.value, extension_degree) V_pow = get_p_powers_of_V( curve_id.value, extension_degree, frob_power ) # print( # f"Torus Inv: {get_V_torus_powers(curve_id.value, extension_degree, frob_power).get_value_coeffs()}" # ) F = [PyFelt(randint(0, p - 1), p) for _ in range(extension_degree)] _ = frobenius(F, V_pow, p, frob_power, irr) k_expressions, constants_list = generate_frobenius_maps( curve_id, extension_degree, frob_power ) print( f"f = f0 + f1v + ... + f{extension_degree-1}v^{extension_degree-1}" ) print( f"Frob(f) = f^p = f0 + f1v^(p^{frob_power}) + f2v^(2p^{frob_power}) + ... + f{extension_degree-1}*v^(({extension_degree-1})p^{frob_power})" ) print( f"Frob(f) = k0 + k1v + ... + k{extension_degree-1}v^{extension_degree-1}" ) for i, expr in enumerate(k_expressions): print(f"k_{i} = {expr}") print(f"Constants: {constants_list[i]}") constants_lists[curve_id.name][extension_degree][ frob_power ] = constants_list return constants_lists frobs = test_frobenius_maps() from garaga.hints.tower_backup import E12 x = E12.random(1) frobenius( x.to_poly().get_coeffs(), get_p_powers_of_V(1, 12, 1), CURVES[1].p, 1, get_irreducible_poly(1, 12), ) ================================================ FILE: hydra/garaga/hints/io.py ================================================ import functools from garaga.algebra import FunctionFelt, ModuloCircuitElement, PyFelt PRIME = 2**251 + 17 * 2**192 + 1 # STARK prime def assert_integer(val): """ Asserts that the input is an integer (and not relocatable value). """ assert isinstance(val, int), f"Expected integer, found: {val}." def as_int(val, prime): """ Returns the lift of the given field element, val, as an integer in the range (-prime/2, prime/2). """ assert_integer(val) return val if val < prime // 2 else val - prime def to_hex_str(value: str | int): if isinstance(value, str): value = value.strip() # Trim whitespaces if value.lower().startswith("0x"): try: # Validate hexadecimal and return in lowercase return "0x" + hex(int(value, 16))[2:].lower() except ValueError: raise ValueError(f"Invalid hexadecimal value: {value}") else: try: # Convert decimal string to int then to hex return hex(int(value)).lower() except ValueError: raise ValueError(f"Invalid decimal value: {value}") elif isinstance(value, int): return hex(value).lower() else: raise TypeError(f"Expected str or int, got {type(value).__name__}") # Split a bigint into its limbs. # Accepts int, ModuloCircuitElement, PyFelt, or bytes. # Returns the limbs in little-endian order. # Ie : x = d0 + d1 * base + d2 * base^2 + ... + dn * base^n # Returns the coefficients [d0, d1, d2, ..., dn] def bigint_split( x: int | ModuloCircuitElement | PyFelt | bytes, n_limbs: int = 4, base: int = 2**96 ) -> list[int]: if isinstance(x, int): pass elif isinstance(x, (ModuloCircuitElement, PyFelt)): x = x.value elif isinstance(x, bytes): x = int.from_bytes(x, byteorder="big") else: raise ValueError(f"Invalid type for bigint_split: {type(x)}") coeffs = [] degree = n_limbs - 1 for n in range(degree, 0, -1): q, r = divmod(x, base**n) coeffs.append(q) x = r coeffs.append(x) return coeffs[::-1] def bytes_to_u32_array(bytes_array: bytes, name: str) -> str: code = f"const {name}: [u32; {((len(bytes_array) + 3) // 4)}] = [" for i in range(0, len(bytes_array), 4): chunk = bytes_array[i : i + 4] u32_value = int.from_bytes(chunk, "big") code += f"{hex(u32_value)}, " code += "];" return code def to_int(value: str | int | bytes) -> int: """ Convert a string or integer to an integer. Supports hexadecimal and decimal strings. """ if isinstance(value, str): value = value.strip() # Trim whitespaces if value.lower().startswith("0x"): try: return int(value, 16) except ValueError: raise ValueError(f"Invalid hexadecimal value: {value}") else: try: return int(value) except ValueError: raise ValueError(f"Invalid decimal value: {value}") elif isinstance(value, int): return value elif isinstance(value, bytes): return int.from_bytes(value, byteorder="big") else: raise TypeError(f"Expected str, int, or bytes, got {type(value).__name__}") def int_to_u2XX(x: int | PyFelt, curve_id: int = 0, as_hex=True) -> str: if curve_id == 1: return int_to_u384(x, as_hex) else: return int_to_u288(x, as_hex) def int_to_u288(x: int | PyFelt, as_hex=True) -> str: limbs = bigint_split(x, 3, 2**96) if as_hex: return f"u288{{limb0:{hex(limbs[0])}, limb1:{hex(limbs[1])}, limb2:{hex(limbs[2])}}}" else: return f"u288{{limb0:{limbs[0]}, limb1:{limbs[1]}, limb2:{limbs[2]}}}" def int_to_u384(x: int | PyFelt, as_hex=True) -> str: limbs = bigint_split(x, 4, 2**96) if as_hex: return f"u384{{limb0:{hex(limbs[0])}, limb1:{hex(limbs[1])}, limb2:{hex(limbs[2])}, limb3:{hex(limbs[3])}}}" else: return f"u384{{limb0:{limbs[0]}, limb1:{limbs[1]}, limb2:{limbs[2]}, limb3:{limbs[3]}}}" def int_to_u256(x: int | PyFelt) -> str: assert 0 <= x < 2**256, f"Value {x} is too large to fit in a u256" limbs = bigint_split(x, 2, 2**128) return f"u256{{low:{hex(limbs[0])}, high:{hex(limbs[1])}}}" def int_to_u128(x: int | PyFelt) -> str: assert 0 <= x < 2**128, f"Value {x} is too large to fit in a u128" return hex(x) def int_array_to_u256_array(x: list[int] | list[PyFelt]) -> str: return f"array![{', '.join([int_to_u256(i) for i in x])}]" def int_array_to_u128_array(x: list[int] | list[PyFelt]) -> str: return f"array![{', '.join([int_to_u128(i) for i in x])}]" def int_array_to_u384_array(x: list[int] | list[PyFelt], const=False) -> str: if const: return f"[{', '.join([int_to_u384(i) for i in x])}]" else: return f"array![{', '.join([int_to_u384(i) for i in x])}]" def int_array_to_u288_array(x: list[int] | list[PyFelt], const=False) -> str: if const: return f"[{', '.join([int_to_u288(i) for i in x])}]" else: return f"array![{', '.join([int_to_u288(i) for i in x])}]" def int_array_to_u2XX_array( x: list[int] | list[PyFelt], curve_id: int, const=False ) -> str: if curve_id == 1: return int_array_to_u384_array(x, const) else: return int_array_to_u288_array(x, const) def bigint_pack(x: object, n_limbs: int, base: int) -> int: val = 0 for i in range(n_limbs): val += as_int(getattr(x, f"d{i}"), PRIME) * base**i return val def bigint_pack_ptr(memory: object, ptr: object, n_limbs: int, base: int) -> int: val = 0 for i in range(n_limbs): val += as_int(memory[ptr + i], PRIME) * base**i return val def pack_e12d(x: object, n_limbs: int, base: int): val = [] for i in range(12): val.append(bigint_pack(getattr(x, f"w{i}"), n_limbs, base)) return val def pack_e6d(x: object, n_limbs, base): val = [] for i in range(6): val.append(bigint_pack(getattr(x, f"v{i}"), n_limbs, base)) return val # ptr : Uint384* def pack_bigint_array( ptr: object, n_limbs: int, base: int, n_elements: int, offset: int = 0 ): val = [] for i in range(n_elements): val.append(bigint_pack(ptr[offset + i], n_limbs, base)) return val def pack_felt_ptr(memory: object, ptr: object, n_elements: int): val = [] for i in range(n_elements): val.append(memory[ptr + i]) return val def pack_bigint_ptr( memory: object, ptr: object, n_limbs: int, base: int, n_elements: int, ): val = [] for i in range(n_elements): val.append(bigint_pack_ptr(memory, ptr + i * n_limbs, n_limbs, base)) return val #### WRITE HINTS def bigint_fill(x: int, ids: object, n_limbs: int, base: int): xs = bigint_split(x, n_limbs, base) for i in range(n_limbs): setattr(ids, f"d{i}", xs[i]) return def fill_felt_ptr(x: list, memory: object, address: int): for i in range(len(x)): memory[address + i] = x[i] def fill_limbs(limbs: list, ids: object): """ limbs: list of integers ids: reference to Cairo object """ for i, limb in enumerate(limbs): setattr(ids, f"d{i}", limb) return def bigint_split_array( x: list[int | PyFelt | ModuloCircuitElement], n_limbs: int = 4, base: int = 2**96, prepend_length=False, ) -> list[int]: xs = [] if prepend_length: xs.append(len(x)) for e in x: xs.extend(bigint_split(e, n_limbs, base)) return xs def fill_bigint_array_into_felt_ptr( x: list, memory: object, address: int, base: int, n_limbs: int ): felts = [] for val in x: felts.extend(bigint_split(val, n_limbs, base)) fill_felt_ptr(felts, memory, address) def fill_e6d(x: list, ids: object, n_limbs: int, base: int): for i in range(6): bigint_fill(x[i], getattr(ids, f"v{i}"), n_limbs, base) return def fill_e12d(x: list, ids: object, n_limbs: int, base: int): for i in range(12): bigint_fill(x[i], getattr(ids, f"w{i}"), n_limbs, base) return def fill_uint256(x: int, ids: object): x0, x1 = split_128(x) setattr(ids, "low", x0) setattr(ids, "high", x1) return def padd_function_felt( f: FunctionFelt, n: int, py_felt: bool = False, batched: bool = False ) -> tuple[list[int], list[int], list[int], list[int]]: a_num = f.a.numerator.get_coeffs() if py_felt else f.a.numerator.get_value_coeffs() a_den = ( f.a.denominator.get_coeffs() if py_felt else f.a.denominator.get_value_coeffs() ) b_num = f.b.numerator.get_coeffs() if py_felt else f.b.numerator.get_value_coeffs() b_den = ( f.b.denominator.get_coeffs() if py_felt else f.b.denominator.get_value_coeffs() ) assert len(a_num) <= n + 1 + ( 2 if batched else 0 ), f"a_num has {len(a_num)} limbs, expected at most {n + 1 + (2 if batched else 0)}" assert len(a_den) <= n + 2 + ( 2 if batched else 0 ), f"a_den has {len(a_den)} limbs, expected at most {n + 2 + (2 if batched else 0)}" assert len(b_num) <= n + 2 + ( 2 if batched else 0 ), f"b_num has {len(b_num)} limbs, expected at most {n + 2 + (2 if batched else 0)}" assert len(b_den) <= n + 5 + ( 2 if batched else 0 ), f"b_den has {len(b_den)} limbs, expected at most {n + 5 + (2 if batched else 0)}" zero = [f.a.numerator.field.zero()] if py_felt else [0] a_num = a_num + zero * (n + 1 + (2 if batched else 0) - len(a_num)) a_den = a_den + zero * (n + 2 + (2 if batched else 0) - len(a_den)) b_num = b_num + zero * (n + 2 + (2 if batched else 0) - len(b_num)) b_den = b_den + zero * (n + 5 + (2 if batched else 0) - len(b_den)) return (a_num, a_den, b_num, b_den) def fill_sum_dlog_div(f: FunctionFelt, n: int, ref: object, segments: object): a_num, a_den, b_num, b_den = padd_function_felt(f, n) ref.a_num = segments.gen_arg(bigint_split_array(a_num, 4, 2**96)) ref.a_den = segments.gen_arg(bigint_split_array(a_den, 4, 2**96)) ref.b_num = segments.gen_arg(bigint_split_array(b_num, 4, 2**96)) ref.b_den = segments.gen_arg(bigint_split_array(b_den, 4, 2**96)) def fill_g1_point(p: tuple[int, int], ref: object): bigint_fill(p[0], ref.x, 4, 2**96) bigint_fill(p[1], ref.y, 4, 2**96) return ### OTHERS def flatten(t): result = [] for item in t: if isinstance(item, (tuple, list)): result.extend(flatten(item)) else: result.append(item) return result def split_128(a: int) -> tuple[int, int]: assert ( 0 <= a < 2**256 ), f"Value {hex(a)} {a.bit_length()}bits is too large to fit in a u256" """Takes in value, returns uint256-ish tuple (low, high).""" return (a & ((1 << 128) - 1), a >> 128) def rgetattr(obj, attr, *args): def _getattr(obj, attr): return getattr(obj, attr, *args) return functools.reduce(_getattr, [obj] + attr.split(".")) def rsetattr(obj, attr, val): pre, _, post = attr.rpartition(".") return setattr(rgetattr(obj, pre) if pre else obj, post, val) ================================================ FILE: hydra/garaga/hints/keccak256.py ================================================ from copy import deepcopy from functools import reduce from math import log from operator import xor # The Keccak-f round constants. RoundConstants = [ 0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000, 0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009, 0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A, 0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A, 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008, ] RotationConstants = [ [0, 1, 62, 28, 27], [36, 44, 6, 55, 20], [3, 10, 43, 25, 39], [41, 45, 15, 21, 8], [18, 2, 61, 56, 14], ] Masks = [(1 << i) - 1 for i in range(65)] def bits2bytes(x): return (int(x) + 7) // 8 def rol(value, left, bits): """ Circularly rotate 'value' to the left, treating it as a quantity of the given size in bits. """ top = value >> (bits - left) bot = (value & Masks[bits - left]) << left return bot | top def multirate_padding(used_bytes, align_bytes): """ The Keccak padding function. """ padlen = align_bytes - used_bytes if padlen == 0: padlen = align_bytes # note: padding done in 'internal bit ordering', wherein LSB is leftmost if padlen == 1: return [0x81] else: return [0x01] + ([0x00] * (padlen - 2)) + [0x80] def keccak_f(state): """ This is Keccak-f permutation. It operates on and mutates the passed-in KeccakState. It returns nothing. """ def keccak_round(a, rc): w, h = state.W, state.H rangew, rangeh = state.rangeW, state.rangeH lanew = state.lanew zero = state.zero # theta c = [reduce(xor, a[x]) for x in rangew] d = [0] * w for x in rangew: d[x] = c[(x - 1) % w] ^ rol(c[(x + 1) % w], 1, lanew) for y in rangeh: a[x][y] ^= d[x] # rho and pi b = zero() for x in rangew: for y in rangeh: b[y % w][(2 * x + 3 * y) % h] = rol( a[x][y], RotationConstants[y][x], lanew ) # chi for x in rangew: for y in rangeh: a[x][y] = b[x][y] ^ ((~b[(x + 1) % w][y]) & b[(x + 2) % w][y]) # iota a[0][0] ^= rc nr = 12 + 2 * int(log(state.lanew, 2)) for ir in range(nr): keccak_round(state.s, RoundConstants[ir]) class KeccakState: """ A keccak state container. The state is stored as a 5x5 table of integers. """ W = 5 H = 5 rangeW = range(W) rangeH = range(H) @staticmethod def zero(): """ Returns an zero state table. """ return [[0] * KeccakState.W for _ in KeccakState.rangeH] @staticmethod def format(st): """ Formats the given state as hex, in natural byte order. """ rows = [] def fmt(stx): return "%016x" % stx for y in KeccakState.rangeH: row = [] for x in KeccakState.rangeW: row.append(fmt(st[x][y])) rows.append(" ".join(row)) return "\n".join(rows) @staticmethod def lane2bytes(s, w): """ Converts the lane s to a sequence of byte values, assuming a lane is w bits. """ o = [] for b in range(0, w, 8): o.append((s >> b) & 0xFF) return o @staticmethod def bytes2lane(bb): """ Converts a sequence of byte values to a lane. """ r = 0 for b in reversed(bb): r = r << 8 | b return r @staticmethod def ilist2bytes(bb): """ Converts a sequence of byte values to a bytestring. """ return bytes(bb) @staticmethod def bytes2ilist(ss): """ Converts a string or bytestring to a sequence of byte values. """ return map(ord, ss) if isinstance(ss, str) else list(ss) def __init__(self, bitrate, b): self.bitrate = bitrate self.b = b # only byte-aligned assert self.bitrate % 8 == 0 self.bitrate_bytes = bits2bytes(self.bitrate) assert self.b % 25 == 0 self.lanew = self.b // 25 self.s = KeccakState.zero() def __str__(self): return KeccakState.format(self.s) def absorb(self, bb): """ Mixes in the given bitrate-length string to the state. """ assert len(bb) == self.bitrate_bytes bb += [0] * bits2bytes(self.b - self.bitrate) i = 0 for y in self.rangeH: for x in self.rangeW: self.s[x][y] ^= KeccakState.bytes2lane(bb[i : i + 8]) i += 8 def squeeze(self): """ Returns the bitrate-length prefix of the state to be output. """ return self.get_bytes()[: self.bitrate_bytes] def get_bytes(self): """ Convert whole state to a byte string. """ out = [0] * bits2bytes(self.b) i = 0 for y in self.rangeH: for x in self.rangeW: v = KeccakState.lane2bytes(self.s[x][y], self.lanew) out[i : i + 8] = v i += 8 return out def set_bytes(self, bb): """ Set whole state from byte string, which is assumed to be the correct length. """ i = 0 for y in self.rangeH: for x in self.rangeW: self.s[x][y] = KeccakState.bytes2lane(bb[i : i + 8]) i += 8 class KeccakSponge: def __init__(self, bitrate, width, padfn, permfn): self.state = KeccakState(bitrate, width) self.padfn = padfn self.permfn = permfn self.buffer = [] def copy(self): return deepcopy(self) def absorb_block(self, bb): assert len(bb) == self.state.bitrate_bytes self.state.absorb(bb) self.permfn(self.state) def absorb(self, s): self.buffer += s while len(self.buffer) >= self.state.bitrate_bytes: self.absorb_block(self.buffer[: self.state.bitrate_bytes]) self.buffer = self.buffer[self.state.bitrate_bytes :] def absorb_final(self): padded = self.buffer + self.padfn(len(self.buffer), self.state.bitrate_bytes) self.absorb_block(padded) self.buffer = [] def squeeze_once(self): rc = self.state.squeeze() self.permfn(self.state) return rc def squeeze(self, l): z = self.squeeze_once() while len(z) < l: z += self.squeeze_once() return z[:l] class KeccakHash: """ The Keccak hash function, with a hashlib-compatible interface. """ def __init__(self, bitrate_bits, capacity_bits, output_bits): # our in-absorption sponge. this is never given padding assert bitrate_bits + capacity_bits in (25, 50, 100, 200, 400, 800, 1600) self.sponge = KeccakSponge( bitrate_bits, bitrate_bits + capacity_bits, multirate_padding, keccak_f ) # hashlib interface members assert output_bits % 8 == 0 self.digest_size = bits2bytes(output_bits) self.block_size = bits2bytes(bitrate_bits) def __repr__(self): inf = ( self.sponge.state.bitrate, self.sponge.state.b - self.sponge.state.bitrate, self.digest_size * 8, ) return "" % inf def copy(self): return deepcopy(self) def update(self, s): self.sponge.absorb(s) def digest(self): finalised = self.sponge.copy() finalised.absorb_final() digest = finalised.squeeze(self.digest_size) return KeccakState.ilist2bytes(digest) def hexdigest(self): return self.digest().hex() @staticmethod def preset(bitrate_bits, capacity_bits, output_bits): """ Returns a factory function for the given bitrate, sponge capacity and output length. The function accepts an optional initial input, ala hashlib. """ def create(initial_input=None): h = KeccakHash(bitrate_bits, capacity_bits, output_bits) if initial_input is not None: h.update(initial_input) return h return create # Keccak parameter presets keccak_256 = KeccakHash.preset(1088, 512, 256) ================================================ FILE: hydra/garaga/hints/multi_miller_witness.py ================================================ import math from garaga import garaga_rs from garaga.algebra import PyFelt from garaga.curves import CURVES, CurveID from garaga.hints.bls import get_root_and_scaling_factor_bls from garaga.hints.tower_backup import E12 from garaga.points import G1G2Pair, G1Point, G2Point def get_final_exp_witness( curve_id: int, f: E12, use_rust: bool = True ) -> tuple[E12, E12]: """ From a miller loop output f of a given curve ID such that f^h == 1, Returns the witnesses c, w for the final exponentiation step, such that - f*w = c^lambda - w lies in a subfield of Fq12. """ if curve_id != CurveID.BN254.value and curve_id != CurveID.BLS12_381.value: raise ValueError(f"Curve ID {curve_id} not supported") curve = CURVES[curve_id] f_values = f.value_coeffs if use_rust: c_values, wi_values = garaga_rs.get_final_exp_witness(curve_id, f_values) c = E12([PyFelt(v, curve.p) for v in c_values], curve_id) wi = E12([PyFelt(v, curve.p) for v in wi_values], curve_id) else: if curve_id == CurveID.BN254.value: c, wi = find_c_e12(f, get_27th_bn254_root()) elif curve_id == CurveID.BLS12_381.value: c, wi = get_root_and_scaling_factor_bls(f) else: raise ValueError(f"Curve ID {curve_id} not supported") return c, wi def get_lambda(curve_id: CurveID) -> int: x = CURVES[curve_id.value].x q = CURVES[curve_id.value].p if curve_id == CurveID.BN254: λ = ( 6 * x + 2 + q - q**2 + q**3 ) # https://eprint.iacr.org/2008/096.pdf See section 4 for BN curves. return λ elif curve_id == CurveID.BLS12_381: λ = -x + q return λ else: raise ValueError(f"Curve ID {curve_id} not supported") def get_m_dash_root(f: E12) -> E12: assert f.curve_id == CurveID.BN254.value q = CURVES[f.curve_id].p x = CURVES[f.curve_id].x r = CURVES[f.curve_id].n h = (q**12 - 1) // r # = 3^3 · l # where gcd(l, 3) = 1 assert math.gcd(r, h) == 1 base = 3 k, l = decompose_scalar_into_b_powers_and_remainder(h, base) assert base**k * l == h, f"{base}^k * l should be h" assert h % (base**k) == 0, f"h should be a multiple of {base}^k" assert math.gcd(l, base) == 1, f"l should be coprime with {base}" λ = ( 6 * x + 2 + q - q**2 + q**3 ) # https://eprint.iacr.org/2008/096.pdf See section 4 for BN curves. assert λ % r == 0, "λ should be a multiple of r. See section 4.2.2" m = λ // r d = math.gcd(m, h) assert m % d == 0, "m should be a multiple of d" m_dash = m // d # m' = m/d assert m_dash % h != 0 "m/d should not divide h. See section 4.2.2 Theorem 2." assert d * r * m_dash == λ, "incorrect parameters" # sanity check assert math.gcd(λ, q**12 - 1) == d * r assert ( math.gcd(m_dash, q**12 - 1) == 1 ), "m_dash should be coprime with q**12 - 1 'by construction'. See 4.3.2 computing m-th root" m_d_inv = pow(m_dash, -1, h) return f**m_d_inv def decompose_scalar_into_b_powers_and_remainder(scalar: int, b: int): """ Decompose scalar into b^k * l, where l is not divisible by b. """ k = 0 l = scalar while l % b == 0: l //= b k += 1 assert l % b != 0, "l should not be divisible by b" assert scalar == b**k * l, "scalar should be the product of b^k * l" return k, l def pow_3_ord(a: E12): t = 0 FP12_ONE = E12.one(a.curve_id) while a != FP12_ONE: t += 1 a = a**3 return t def find_cube_root(a: E12, w: E12, q: int) -> E12: # Algorithm 4: Modified Tonelli-Shanks for cube roots # Input: Cube residue a, cube non residue w and write p − 1 = 3^r · s such that 3 ∤ s # Output: x such that x^3 = a # 1 exp = (s + 1)/3 _, s = decompose_scalar_into_b_powers_and_remainder(q**12 - 1, 3) exp: int = (s + 1) // 3 a_inv = a.__inv__() # 2 x ← a^exp x = a**exp # 3 3^t ← ord((x^3)/a) t = pow_3_ord(x**3 * a_inv) # 4 while t != 0 do while t != 0: # 5 exp = (s + 1)/3 # 6 x ← x · w^exp x = x * w**exp # 7 3^t ← ord(x^3/a) t = pow_3_ord(x**3 * a_inv) # 8 end # 9 return x return x def find_c_e12(f: E12, w: E12) -> tuple[E12, E12]: # Algorithm 5: Algorithm for computing λ residues over BN curve # Input: Output of a Miller loop f and fixed 27-th root of unity w # Output: (c, wi) such that c**λ = f · wi # 1 s = 0 s = 0 q = CURVES[f.curve_id].p exp = (q**12 - 1) // 3 FP12_ONE = E12.one(f.curve_id) # 2 if f**(q**k-1)/3 = 1 then if f**exp == FP12_ONE: # 3 continue # 4 end # 5 else if (f · w)**(q**k-1)/3 = 1 then c = f elif (f * w) ** exp == FP12_ONE: # 6 s = 1 s = 1 # 7 f ← f · w c = f * w # 8 end # 9 else else: # 10 s = 2 s = 2 # 11 f ← f · w**2 c = f * w * w # 12 end # 13 c ← f**r′ c = get_rth_root(c) # 14 c ← c**m′′ c = get_m_dash_root(c) # 15 c ← c**1/3 (by using modified Tonelli-Shanks 4) c = find_cube_root(c, w, q) # 16 return (c, ws) return c, w**s def get_rth_root(f: E12) -> E12: """ Computes x such that x^r = f """ r = CURVES[f.curve_id].n h = (CURVES[f.curve_id].p ** 12 - 1) // r r_inv = pow(r, -1, h) res = f**r_inv # assert res**r == f, "res**r should be f" return res def get_27th_bn254_root(): """ Retrieve a 27th root of unity over BN254 Fp^12 that isn't a 9th root of unity. """ root_27th = E12( [ 0, 0, 0, 0, 8204864362109909869166472767738877274689483185363591877943943203703805152849, 17912368812864921115467448876996876278487602260484145953989158612875588124088, 0, 0, 0, 0, 0, 0, ], CurveID.BN254.value, ) FP12_ONE = E12.one(CurveID.BN254.value) assert root_27th**27 == FP12_ONE, "root_27th**27 should be one" assert root_27th**9 != FP12_ONE, "root_27th**9 should not be one" return root_27th def get_miller_loop_output(curve_id: CurveID, will_be_one: bool = True) -> E12: """ Returns a random miller loop output f such that f**h = 1 """ g1, g2 = G1Point.gen_random_point(curve_id), G2Point.gen_random_point(curve_id) if will_be_one: # Miller (-g1, g2) * Miller (g1, g2) f = G1G2Pair.miller([G1G2Pair(-g1, g2), G1G2Pair(g1, g2)]) h = (CURVES[curve_id.value].p ** 12 - 1) // CURVES[curve_id.value].n assert f**h == E12.one(curve_id.value), "f**h should be one" else: f = G1G2Pair.miller([G1G2Pair(g1, g2)]) return f if __name__ == "__main__": def test_bn254(): f = get_miller_loop_output(CurveID.BN254) x = CURVES[CurveID.BN254.value].x q = CURVES[CurveID.BN254.value].p λ = ( 6 * x + 2 + q - q**2 + q**3 ) # https://eprint.iacr.org/2008/096.pdf See section 4 for BN curves. c, wi = find_c_e12(f, get_27th_bn254_root()) print(f"wi: {wi.value_coeffs}") c_inv = c.__inv__() result = c_inv**λ * f * wi assert result == E12.one(CurveID.BN254.value), "pairing not 1" for i in range(10): test_bn254() print(f"Test {i} passed") ================================================ FILE: hydra/garaga/hints/neg_3.py ================================================ def neg_3_base_le(scalar: int) -> list[int]: """ Decomposes a scalar into base -3 representation. :param scalar: The integer to be decomposed. :return: A list of coefficients in base -3 representation. (Least significant bit first), with digits [-1, 0, 1] such that scalar = sum((-3) ** i * d for (i, d) in enumerate(digits)) """ if scalar == 0: return [0] digits = [] while scalar != 0: remainder = scalar % 3 if ( remainder == 2 ): # if the remainder is 2, we set it to -1 and add 1 to the next digit remainder = -1 scalar += 1 # For remainder 1 and 0, no change is required digits.append(remainder) scalar = -(scalar // 3) # divide by -3 for the next digit return digits def construct_digit_vectors(es: list[int]) -> list[list[int]]: dss_ = [neg_3_base_le(e) for e in es] # Base -3 digits max_len = max(len(ds) for ds in dss_) dss_ = [ds + [0] * (max_len - len(ds)) for ds in dss_] # Transposing the matrix dss = [[dss_[row][col] for row in range(len(dss_))] for col in range(max_len)] return dss def positive_negative_multiplicities(digits: list[int]) -> tuple[int, int]: sum_p = sum((-3) ** i for (i, d) in enumerate(digits) if d == 1) sum_n = sum((-3) ** i for (i, d) in enumerate(digits) if d == -1) return (sum_p, sum_n) def scalar_to_base_neg3_le(u128: int) -> tuple[int, int, int, int]: def sign(felt252: int) -> int: # In cairo, the felt252 : # - is considered positive if it is in [0, STARK//2[ # - is considered negative if it is in ]STARK//2, STARK[ # Where STARK = 2**251+ 17* 2**192 + 1 # Note : value being exactly STARK//2 will not happen in the construction here. if felt252 > 0: return 1 elif felt252 < 0: return -1 else: # Note : the case where the input is 0, the sign does not matter. # Any value could be returned, so choose whatever is more performant in implementation. return 0 digits = neg_3_base_le(u128) # Even if input is u128, both sum_p and sum_n might be larger and negative. Output of positive_negative_multiplicities should be felt252. sum_p, sum_n = positive_negative_multiplicities(digits) # return type : felt252, felt252, felt252, felt252 return (abs(sum_p), abs(sum_n), sign(sum_p), sign(sum_n)) if __name__ == "__main__": print(positive_negative_multiplicities(neg_3_base_le(2**128))) ================================================ FILE: hydra/garaga/hints/tower_backup.py ================================================ """ Tower based arithmetic for BN254 and BLS12-381 on Fq2, Fq6, Fq12. """ import random from dataclasses import dataclass from garaga import garaga_rs from garaga.algebra import ModuloCircuitElement, Polynomial, PyFelt from garaga.curves import CURVES, get_base_field from garaga.points import direct_to_tower, tower_to_direct @dataclass(slots=True) class E2: a0: int a1: int p: int def __str__(self) -> str: return f"({(self.a0)} + {self.a1}*u)" def __eq__(self, other): return self.a0 == other.a0 and self.a1 == other.a1 @staticmethod def zero(p: int): return E2(0, 0, p) @staticmethod def one(p: int): return E2(1, 0, p) @staticmethod def random(p: int): return E2(random.randint(0, p - 1), random.randint(0, p - 1), p) @property def felt_coeffs(self) -> list[PyFelt]: return [PyFelt(self.a0, self.p), PyFelt(self.a1, self.p)] def __add__(self, other): a0 = (self.a0 + other.a0) % self.p a1 = (self.a1 + other.a1) % self.p return E2(a0, a1, self.p) def __radd__(self, other): return self.__add__(other) def __sub__(self, other): if isinstance(other, E2): a0 = (self.a0 - other.a0) % self.p a1 = (self.a1 - other.a1) % self.p return E2(a0, a1, self.p) elif isinstance(other, int): return E2((self.a0 - other) % self.p, (self.a1 - other) % self.p, self.p) return NotImplemented def __rsub__(self, other): return self.__neg__().__add__(other) def __mul__(self, other): if isinstance(other, E2): a = (self.a0 + self.a1) * (other.a0 + other.a1) % self.p b, c = self.a0 * other.a0 % self.p, self.a1 * other.a1 % self.p return E2((b - c) % self.p, (a - b - c) % self.p, self.p) elif isinstance(other, int): return E2(self.a0 * other % self.p, self.a1 * other % self.p, self.p) return NotImplemented def __rmul__(self, other): return self.__mul__(other) def __inv__(self): t0, t1 = (self.a0 * self.a0 % self.p, self.a1 * self.a1 % self.p) t0 = (t0 + t1) % self.p t1 = pow(t0, -1, self.p) return E2(self.a0 * t1 % self.p, -(self.a1 * t1) % self.p, self.p) def div(self, other): if isinstance(other, E2): return self * other.__inv__() return NotImplemented def __pow__(self, p: int): """ Compute x**p in F_p^2 using square-and-multiply algorithm. Args: p: The exponent, a non-negative integer. Returns: x**p in F_p^2, represented similarly as x. """ assert isinstance(p, int) and p >= 0 # Handle the easy cases. if p == 0: # x**0 = 1, where 1 is the multiplicative identity in F_p^2. return E2(1, 0, self.p) elif p == 1: # x**1 = x. return self # Start the computation. result = self.one( self.p ) # Initialize result as the multiplicative identity in F_p^2. temp = self # Initialize temp as self. # Loop through each bit of the exponent p. for bit in reversed(bin(p)[2:]): # [2:] to strip the "0b" prefix. if bit == "1": result = result * temp temp = temp * temp return result def __truediv__(self, other): if isinstance(other, E2): return self * other.__inv__() elif isinstance(other, int): return self * pow(other, -1, self.p) return NotImplemented def __rtruediv__(self, other): if isinstance(other, E2): return other * self.__inv__() elif isinstance(other, int): return other * self.__inv__() return NotImplemented def __neg__(self): return E2(-self.a0 % self.p, -self.a1 % self.p, self.p) def conjugate(self): return E2(self.a0, -self.a1 % self.p, self.p) @dataclass(slots=True, init=False) class E6: b0: E2 b1: E2 b2: E2 curve_id: int non_residue: E2 def __init__(self, x: list[int | PyFelt | E2], curve_id: int): curve = CURVES[curve_id] self.curve_id = curve_id self.non_residue = E2(curve.nr_a0, curve.nr_a1, curve.p) if isinstance(x[0], int): self.b0 = E2(x[0], x[1], curve.p) self.b1 = E2(x[2], x[3], curve.p) self.b2 = E2(x[4], x[5], curve.p) elif isinstance(x[0], E2): self.b0 = x[0] self.b1 = x[1] self.b2 = x[2] elif isinstance(x[0], PyFelt): self.b0 = E2(x[0].value, x[1].value, curve.p) self.b1 = E2(x[2].value, x[3].value, curve.p) self.b2 = E2(x[4].value, x[5].value, curve.p) else: raise ValueError(f"Invalid type {type(x[0])}") @property def coeffs(self) -> list[int]: return [self.b0.a0, self.b0.a1, self.b1.a0, self.b1.a1, self.b2.a0, self.b2.a1] @property def felt_coeffs(self) -> list[PyFelt]: return [PyFelt(c, self.b0.p) for c in self.coeffs] @property def value_coeffs(self) -> list[int]: return [ self.b0.a0, self.b0.a1, self.b1.a0, self.b1.a1, self.b2.a0, self.b2.a1, ] @staticmethod def from_poly(poly: Polynomial, curve_id: int): field = get_base_field(curve_id) coeffs = poly.get_coeffs() coeffs = coeffs + [field(0)] * (6 - len(coeffs)) coeffs = direct_to_tower(coeffs, curve_id, 6) return E6(coeffs, curve_id) def to_poly(self) -> Polynomial: field = get_base_field(self.curve_id) coeffs = [field(c) for c in self.value_coeffs] coeffs = tower_to_direct(coeffs, self.curve_id, 6) return Polynomial(coeffs) @staticmethod def zero(curve_id: int): p = CURVES[curve_id].p return E6([E2.zero(p), E2.zero(p), E2.zero(p)], curve_id) @staticmethod def one(curve_id: int): p = CURVES[curve_id].p return E6([E2.one(p), E2.zero(p), E2.zero(p)], curve_id) @staticmethod def random(curve_id: int): p = CURVES[curve_id].p return E6([E2.random(p), E2.random(p), E2.random(p)], curve_id) def __str__(self) -> str: return f"{self.b0} + {self.b1}*v + {self.b2}*v^2" def __add__(self, other): if isinstance(other, E6): return E6( [self.b0 + other.b0, self.b1 + other.b1, self.b2 + other.b2], self.curve_id, ) raise NotImplementedError def __sub__(self, other): if isinstance(other, E6): return E6( [self.b0 - other.b0, self.b1 - other.b1, self.b2 - other.b2], self.curve_id, ) raise NotImplementedError def __neg__(self): return E6([-self.b0, -self.b1, -self.b2], self.curve_id) def __mul__(self, other): x0, x1, x2 = self.b0, self.b1, self.b2 y0, y1, y2 = other.b0, other.b1, other.b2 t0 = x0 * y0 t1 = x1 * y1 t2 = x2 * y2 c0 = t0 + self.non_residue * ((x1 + x2) * (y1 + y2) - t1 - t2) c1 = (x0 + x1) * (y0 + y1) - t0 - t1 + self.non_residue * t2 c2 = (x0 + x2) * (y0 + y2) - t0 - t2 + t1 return E6([c0, c1, c2], self.curve_id) def __rmul__(self, other): return self.__mul__(other) def __inv__(self): t0, t1, t2 = self.b0 * self.b0, self.b1 * self.b1, self.b2 * self.b2 t3, t4, t5 = self.b0 * self.b1, self.b0 * self.b2, self.b1 * self.b2 c0 = t0 - self.non_residue * t5 c1 = self.non_residue * t2 - t3 c2 = t1 - t4 t6 = self.b0 * c0 d1 = self.b2 * c1 d2 = self.b1 * c2 d1 = self.non_residue * (d1 + d2) t6 = t6 + d1 t6 = t6.__inv__() return E6([c0 * t6, c1 * t6, c2 * t6], self.curve_id) def mul_by_non_residue(self): return E6([self.non_residue * self.b2, self.b0, self.b1], self.curve_id) def square_torus(self): # SQ = 1/2(x+ v/x) <=> v = x (2SQ - x) one_over_2 = E6([pow(2, -1, self.b0.p), 0, 0, 0, 0, 0], self.curve_id) v = E6([0, 0, 1, 0, 0, 0], self.curve_id) x_inv = self.__inv__() v_x_inv = v * x_inv sq = one_over_2 * (self + v_x_inv) return sq def div(self, other): if isinstance(other, E6): return self * other.__inv__() return NotImplementedError def __pow__(self, p: int): """ Compute x**p in F_p^6 using square-and-multiply algorithm. Args: p: The exponent, a non-negative integer. Returns: x**p in F_p^6, represented similarly as x. """ assert isinstance(p, int), f"Invalid exponent {p=}" # Handle the easy cases. if p == 0: # x**0 = 1, where 1 is the multiplicative identity in F_p^2. return self.one(self.curve_id) elif p == 1: # x**1 = x. return self elif p < 0: return self.__inv__() ** (-p) # Start the computation. result = self.one( self.curve_id ) # Initialize result as the multiplicative identity in F_p^2. temp = self # Initialize temp as self. # Loop through each bit of the exponent p. for bit in reversed(bin(p)[2:]): # [2:] to strip the "0b" prefix. if bit == "1": result = result * temp temp = temp * temp return result @dataclass(slots=True, init=False) class E12: c0: E6 c1: E6 curve_id: int def __init__(self, x: list[PyFelt | int | E6], curve_id: int): self.curve_id = curve_id if isinstance(x[0], (PyFelt, int)) and len(x) == 12: self.c0 = E6(x=x[0:6], curve_id=curve_id) self.c1 = E6(x=x[6:12], curve_id=curve_id) elif type(x[0] == E6 and len(x) == 2): self.c0 = x[0] self.c1 = x[1] else: raise ValueError def __hash__(self): return hash((tuple(self.value_coeffs), self.curve_id)) @property def value_coeffs(self) -> list[int]: return [ self.c0.b0.a0, self.c0.b0.a1, self.c0.b1.a0, self.c0.b1.a1, self.c0.b2.a0, self.c0.b2.a1, self.c1.b0.a0, self.c1.b0.a1, self.c1.b1.a0, self.c1.b1.a1, self.c1.b2.a0, self.c1.b2.a1, ] def print_as_sage_poly(self, var_name: str = "x"): field = get_base_field(self.curve_id) coeffs = [field(c) for c in self.value_coeffs] coeffs = tower_to_direct(coeffs, self.curve_id, 12) return Polynomial(coeffs).print_as_sage_poly(var_name) @staticmethod def from_poly(poly: Polynomial, curve_id: int): field = get_base_field(curve_id) coeffs = poly.get_coeffs() coeffs = coeffs + [field(0)] * (12 - len(coeffs)) coeffs = direct_to_tower(coeffs, curve_id, 12) return E12(coeffs, curve_id) @staticmethod def from_direct(coeffs: list[PyFelt | ModuloCircuitElement], curve_id: int): coeffs = direct_to_tower([c.felt for c in coeffs], curve_id, 12) return E12(coeffs, curve_id) def to_poly(self) -> Polynomial: field = get_base_field(self.curve_id) coeffs = [field(c) for c in self.value_coeffs] coeffs = tower_to_direct(coeffs, self.curve_id, 12) return Polynomial(coeffs) def to_direct(self) -> list[PyFelt]: field = get_base_field(self.curve_id) coeffs = [field(c) for c in self.value_coeffs] coeffs = tower_to_direct(coeffs, self.curve_id, 12) return coeffs @property def order(self): return self.c0.b0.p**12 @property def felt_coeffs(self) -> list[PyFelt]: return [PyFelt(c, self.c0.b0.p) for c in self.value_coeffs] @staticmethod def one(curve_id: int): return E12([E6.one(curve_id), E6.zero(curve_id)], curve_id) @staticmethod def zero(curve_id: int): return E12([E6.zero(curve_id), E6.zero(curve_id)], curve_id) @staticmethod def random(curve_id: int): field = get_base_field(curve_id) return E12([field(random.randint(0, field.p - 1)) for _ in range(12)], curve_id) def __mul__(self, other): a = self.c0 + self.c1 b = other.c0 + other.c1 a = a * b b = self.c0 * other.c0 c = self.c1 * other.c1 z1 = a - b - c c = c.mul_by_non_residue() z0 = c + b return E12([z0, z1], self.curve_id) def conjugate(self): return E12([self.c0, -self.c1], self.curve_id) def square(self): c0 = self.c0 - self.c1 c3 = -(self.c1.mul_by_non_residue()) + self.c0 c2 = self.c0 * self.c1 c0 = (c0 * c3) + c2 c1 = c2 + c2 c2 = c2.mul_by_non_residue() c0 = c0 + c2 return E12([c0, c1], self.curve_id) def __inv__(self): t0, t1 = self.c0 * self.c0, self.c1 * self.c1 tmp = t1.mul_by_non_residue() t0 = t0 - tmp t1 = t0.__inv__() c0 = self.c0 * t1 c1 = -self.c1 * t1 return E12([c0, c1], curve_id=self.curve_id) def div(self, other): if isinstance(other, E12): return self * other.__inv__() raise NotImplementedError def __pow__(self, p: int): """ Compute x**p in F_p^12 using square-and-multiply algorithm. Args: p: The exponent, a non-negative integer. Returns: x**p in F_p^12, represented similarly as x. """ assert isinstance(p, int), f"Invalid exponent {p=}" # Handle the easy cases. if p == 0: # x**0 = 1, where 1 is the multiplicative identity in F_p^2. return self.one(self.curve_id) elif p == 1: # x**1 = x. return self elif p < 0: return self.__inv__() ** (-p) # Start the computation. result = self.one( self.curve_id ) # Initialize result as the multiplicative identity in F_p^2. temp = self # Initialize temp as self. # Loop through each bit of the exponent p. for bit in reversed(bin(p)[2:]): # [2:] to strip the "0b" prefix. if bit == "1": result = result * temp temp = temp.square() return result def final_exp(self, use_rust: bool = True): if use_rust: coeffs = garaga_rs.final_exp(self.curve_id, self.value_coeffs) return E12(coeffs, self.curve_id) else: cofactor = CURVES[self.curve_id].final_exp_cofactor h = ( cofactor * (CURVES[self.curve_id].p ** 12 - 1) // CURVES[self.curve_id].n ) return self**h def serialize(self) -> bytes: # Implement serialization like ark-ff: serialized = bytearray() bit_size = CURVES[self.curve_id].p.bit_length() byte_size = (bit_size + 7) // 8 for c in self.value_coeffs[::-1]: serialized.extend(c.to_bytes(byte_size, byteorder="big")) return bytes(serialized) def get_tower_object(x: list[PyFelt], curve_id: int, extension_degree: int): if extension_degree == 2: return E2(x[0].value, x[1].value, x[0].p) if extension_degree == 6: return E6(x, curve_id) elif extension_degree == 12: return E12(x, curve_id) else: raise ValueError ================================================ FILE: hydra/garaga/modulo_circuit.py ================================================ from dataclasses import dataclass, field from enum import Enum, auto from typing import List, Union from garaga.algebra import BaseField, ModuloCircuitElement, PyFelt, get_sparsity from garaga.curves import BASE, CURVES, N_LIMBS, STARK, CurveID from garaga.hints.io import bigint_split from garaga.modulo_circuit_structs import ( Cairo1SerializableStruct, GenericT, u128, u256, u384, ) BATCH_SIZE = 1 # Batch Size, only used in cairo 0 mode. class WriteOps(Enum): """ Enum for the source of a write operation in the value segment. -CONSTANT | INPUT: The value was written by coping N_LIMBS from the allocation pointer to the value segment. -COMMIT: The value was written as a result of a hint value from the prover, and needs to be hashed. -WITNESS: Same as COMMIT, but do not need to be hashed. -FELT: The value was written by coping N_LIMBS from the allocation pointer, as a result of a non-deterministic felt252 to UInt384 decomposition. In CairoZero, the value segment is increased by 1 due to an extra range check needed. -BUILTIN: The value was written by the modulo builtin as result of a ADD or MUL instruction. """ CONSTANT = auto() INPUT = auto() COMMIT = auto() WITNESS = auto() FELT = auto() BUILTIN = auto() class ModBuiltinOps(Enum): """ Enum for the modulo builtin operations. """ ADD = "+" MUL = "*" class CairoVMOps(Enum): ASSERT_EQ = "==" @dataclass(slots=True, frozen=True) class ModuloCircuitInstruction: operation: ModBuiltinOps left_offset: int right_offset: int result_offset: int comment: str | None @dataclass(slots=True, frozen=True) class ValueSegmentItem: emulated_felt: PyFelt write_source: WriteOps instruction: None | ModuloCircuitInstruction @property def value(self) -> int: return self.emulated_felt.value @property def p(self): return self.emulated_felt.p @property def felt(self): return self.emulated_felt @dataclass(slots=True, init=False) class ValueSegment: segment: dict[int, ValueSegmentItem] assert_eq_instructions: list[ModuloCircuitInstruction] offset: int n_limbs: int debug: bool name: str output: list[ModuloCircuitElement] segment_stacks: dict[WriteOps, dict[int, ValueSegmentItem]] output_structs: list[Cairo1SerializableStruct] | None def __init__(self, name: str, debug: bool = False, compilation_mode: int = 0): self.segment: dict[int, ValueSegmentItem] = dict() self.assert_eq_instructions: list[ModuloCircuitInstruction] = [] self.output: list[ModuloCircuitElement] = [] self.offset = 0 self.n_limbs = N_LIMBS self.debug = debug self.name = name self.segment_stacks = {key: dict() for key in WriteOps} self.output_structs = None if compilation_mode == 0 else [] def __len__(self) -> int: return len(self.segment) def __getitem__(self, key: int) -> ValueSegmentItem: return self.segment[key] @property def input(self) -> list[ModuloCircuitElement]: combined_items = [ (offset, item) for stack in [ WriteOps.INPUT, WriteOps.COMMIT, WriteOps.WITNESS, WriteOps.FELT, ] for offset, item in self.segment_stacks[stack].items() ] combined_items.sort(key=lambda x: x[0]) # Sort by offset return [ ModuloCircuitElement(item.emulated_felt, offset) for offset, item in combined_items ] def write_to_segment(self, item: ValueSegmentItem) -> int: offset = self.offset self.segment[offset] = item self.segment_stacks[item.write_source][offset] = item self.offset += N_LIMBS if item.write_source == WriteOps.FELT: self.offset += 1 return offset def non_interactive_transform(self) -> "ValueSegment": """ Rebuild a new ValueSegment by re-ordering the current one in this order: CONSTANT INPUT COMMIT WITNESS FELT BUILTIN Order matters! """ res = ValueSegment(self.name) offset_map = {} for stacks_key in [ WriteOps.CONSTANT, WriteOps.INPUT, WriteOps.COMMIT, WriteOps.WITNESS, WriteOps.FELT, WriteOps.BUILTIN, ]: if self.debug: print(stacks_key, len(self.segment_stacks[stacks_key])) for old_offset, item in self.segment_stacks[stacks_key].items(): # print(offset_map) if item.instruction is None: new_offset = res.write_to_segment(item) else: # print(item.instruction) new_offset = res.write_to_segment( ValueSegmentItem( item.emulated_felt, item.write_source, ModuloCircuitInstruction( operation=item.instruction.operation, left_offset=offset_map.get( item.instruction.left_offset, res.offset ), right_offset=offset_map.get( item.instruction.right_offset, res.offset ), result_offset=offset_map.get( item.instruction.result_offset, res.offset ), comment=item.instruction.comment, ), ) ) offset_map[old_offset] = new_offset # Those are builtins instructions that did not create any new value. for assert_eq_instruction in self.assert_eq_instructions: res.assert_eq_instructions.append( ModuloCircuitInstruction( operation=assert_eq_instruction.operation, left_offset=offset_map[assert_eq_instruction.left_offset], right_offset=offset_map[assert_eq_instruction.right_offset], result_offset=offset_map[assert_eq_instruction.result_offset], comment=assert_eq_instruction.comment, ) ) new_output = [] new_output_structs = None if self.output_structs is None else [] for elmt in self.output: new_output.append(ModuloCircuitElement(elmt.felt, offset_map[elmt.offset])) if self.output_structs is not None: for struct in self.output_structs: new_output_structs.append( struct.__class__( struct.name, [ ModuloCircuitElement(elt.felt, offset_map[elt.offset]) for elt in struct.elmts ], ) ) res.output = new_output res.output_structs = new_output_structs return res def get_dw_lookups(self) -> dict: """ Returns the DW arrays for the compiled circuit. Only relevant in Cairo 0 mode. """ dw_arrays = { "constants_ptr": [], "add_offsets_ptr": [], "mul_offsets_ptr": [], "output_offsets_ptr": [], "poseidon_indexes_ptr": [], } for _, item in self.segment_stacks[WriteOps.CONSTANT].items(): dw_arrays["constants_ptr"].append( bigint_split(item.value, self.n_limbs, BASE) ) for write_op in [WriteOps.BUILTIN, WriteOps.WITNESS]: for result_offset, item in self.segment_stacks[write_op].items(): if not item.instruction: continue # print(item.instruction) dw_arrays[ item.instruction.operation.name.lower() + "_offsets_ptr" ].append( ( item.instruction.left_offset, item.instruction.right_offset, item.instruction.result_offset, item.instruction.comment, ) ) for assert_eq_instruction in self.assert_eq_instructions: dw_arrays[ assert_eq_instruction.operation.name.lower() + "_offsets_ptr" ].append( ( assert_eq_instruction.left_offset, assert_eq_instruction.right_offset, assert_eq_instruction.result_offset, assert_eq_instruction.comment, ) ) for output_elmt in self.output: dw_arrays["output_offsets_ptr"].append(output_elmt.offset) # print("dw_arrays[add_offsets_ptr]", dw_arrays["add_offsets_ptr"]) return dw_arrays def print(self): # ANSI escape codes for some colors RED = "\033[31m" # Red text GREEN = "\033[32m" # Green text BLUE = "\033[34m" # Blue text ORANGE = "\033[33m" # Orange text RESET = "\033[0m" # Reset to default color # print(f"{RED}This will be red!{RESET}") # print(f"{GREEN}This will be green!{RESET}") for i, (offset, val) in enumerate(self.segment.items()): row = "" row += f"{BLUE}{'['+str(i)+']':^7}{RESET}|{ORANGE}{'['+str(offset)+']':^7}{RESET}|" if val.instruction: row += f"{str(val.instruction.left_offset)+str(val.instruction.operation.value)+str(val.instruction.right_offset)+'='+str(val.instruction.result_offset):^9}|" else: row += f"{'_':^9}|" row += f"{val.write_source.name:^8}|" import numpy as np row += f"\t{RED}{np.base_repr(val.emulated_felt.value, base=36)}{RESET} {val.instruction.comment if val.instruction else ''}" print(row) def summarize(self): all_instructions = { item.instruction for item in self.segment.values() if item.instruction } all_assert_eq_instructions = set(self.assert_eq_instructions) all_instructions_except_assert_eq = ( all_instructions - all_assert_eq_instructions ) add_count: int = 0 mul_count: int = 0 for instruction in all_instructions_except_assert_eq: if instruction.operation.name == "ADD": add_count += 1 elif instruction.operation.name == "MUL": mul_count += 1 return add_count, mul_count, len(all_assert_eq_instructions) class ModuloCircuit: """ Represents a modulo circuit capable of performing arithmetic operations on base field elements, storing constants, and caching powers of base field elements. Attributes: circuit_name (str): The name of the circuit. last_offset (int): The last used offset in the circuit's memory. N_LIMBS (int): The number of limbs used in the circuit. values_segment (dict[int, BaseFieldElement]): A dictionary mapping offsets to base field elements. add_offsets (list[tuple]): A list of tuples representing the offsets involved in addition operations. mul_offsets (list[tuple]): A list of tuples representing the offsets involved in multiplication operations. constants (dict[str, ModuloElement]): A dictionary mapping constant names to their ModuloElement representations. """ def __init__( self, name: str, curve_id: int, generic_circuit: bool = False, generic_modulus: bool = False, compilation_mode: int = 0, ) -> None: assert ( len(name) <= 31 ), f"Name '{name}' is too long to fit in a felt252, size is: {len(name)}" self.name = name self.class_name = "ModuloCircuit" self.curve_id = curve_id self.field = BaseField(CURVES[curve_id].p) self.N_LIMBS = 4 self.values_segment: ValueSegment = ValueSegment( name=name, compilation_mode=compilation_mode ) self.constants: dict[int, ModuloCircuitElement] = dict() self.generic_circuit = generic_circuit self.generic_modulus = ( generic_modulus # Generic modulus has precedence over generic_circuit ) self.compilation_mode = compilation_mode self.exact_output_refs_needed = None self.input_structs: list[Cairo1SerializableStruct] = [] self.do_not_inline = False @property def values_offset(self) -> int: return self.values_segment.offset @property def output(self) -> list[ModuloCircuitElement]: return self.values_segment.output @property def input(self) -> list[ModuloCircuitElement]: return self.values_segment.input @property def output_structs(self) -> list[Cairo1SerializableStruct]: return self.values_segment.output_structs @property def continuous_output(self) -> bool: # Only useful in cairo 0 mode. return all( self.output[i + 1].offset - self.output[i].offset == N_LIMBS for i in range(len(self.output) - 1) ) @property def witnesses(self) -> list[PyFelt]: # Only useful in cairo 0 mode. return [ self.values_segment.segment_stacks[WriteOps.WITNESS][offset].felt for offset in sorted(self.values_segment.segment_stacks[WriteOps.WITNESS]) ] def is_empty_circuit(self) -> bool: return len(self.values_segment.segment_stacks[WriteOps.BUILTIN]) == 0 def write_element( self, elmt: PyFelt | int, write_source: WriteOps = WriteOps.INPUT, instruction: ModuloCircuitInstruction | None = None, ) -> ModuloCircuitElement: """ Register an emulated field element to the circuit given its value and the write source. Returns a ModuloCircuitElement representing the written element with its offset as identifier. """ assert isinstance(elmt, PyFelt) or isinstance( elmt, int ), f"Expected PyFelt or int, got {type(elmt)}" if isinstance(elmt, int): elmt = self.field(elmt) value_offset = self.values_segment.write_to_segment( ValueSegmentItem( elmt, write_source, instruction, ) ) res = ModuloCircuitElement(elmt, value_offset) return res def write_struct( self, struct: Cairo1SerializableStruct, write_source: WriteOps = WriteOps.INPUT, ) -> Union[ ModuloCircuitElement, List[ModuloCircuitElement], List[List[Union[ModuloCircuitElement, List[ModuloCircuitElement]]]], ]: all_pyfelt = all(type(elmt) == PyFelt for elmt in struct.elmts) all_cairo1serializablestruct = all( isinstance(elmt, Cairo1SerializableStruct) for elmt in struct.elmts ) assert ( all_pyfelt or all_cairo1serializablestruct ), f"Expected list of PyFelt or Cairo1SerializableStruct, got {[type(elmt) for elmt in struct.elmts]}" if all_pyfelt: self.input_structs.append(struct) if len(struct) == 1 and isinstance(struct, (u384, u256, u128, GenericT)): return self.write_element(struct.elmts[0], write_source) else: return self.write_elements(struct.elmts, write_source) elif all_cairo1serializablestruct: result = [self.write_struct(elmt, write_source) for elmt in struct.elmts] # Ensure only the larger struct is appended self.input_structs = [ s for s in self.input_structs if s not in struct.elmts ] self.input_structs.append(struct) return result def write_elements( self, elmts: list[PyFelt], operation: WriteOps = WriteOps.INPUT, sparsity: list[int] = None, ) -> list[ModuloCircuitElement]: if sparsity is not None: assert len(sparsity) == len( elmts ), f"Expected sparsity of length {len(elmts)}, got {len(sparsity)}" vals = [ ( self.write_element(elmt, operation) if sparsity[i] != 0 else self.set_or_get_constant(0) ) for i, elmt in enumerate(elmts) ] else: vals = [self.write_element(elmt, operation, None) for elmt in elmts] return vals def write_cairo_native_felt(self, native_felt: PyFelt): assert ( self.compilation_mode == 0 ), "write_cairo_native_felt is not supported in cairo 1 mode" assert isinstance( native_felt, PyFelt ), f"Expected PyFelt, got {type(native_felt)}" assert 0 <= native_felt.value < STARK res = self.write_element(elmt=native_felt, write_source=WriteOps.FELT) return res def write_sparse_constant_elements( self, elmts: list[PyFelt] ) -> tuple[list[ModuloCircuitElement], list[int]]: sparsity = get_sparsity(elmts) elements = [] for elmt, s in zip(elmts, sparsity): match s: case 0: # Mocked 0 element not written to the circuit. Be careful to pass sparsity when evaluating. elements.append(ModuloCircuitElement(self.field.zero(), -1)) case 2: # Mocked 1 element not written to the circuit. Be careful to pass sparsity when evaluating. elements.append(ModuloCircuitElement(self.field.one(), -1)) case _: elements.append(self.set_or_get_constant(elmt.value)) return elements, sparsity def set_or_get_constant(self, val: PyFelt | int) -> ModuloCircuitElement: if isinstance(val, int): val = self.field(val) if val.value in self.constants: # print((f"/!\ Constant '{hex(val.value)}' already exists.")) return self.constants[val.value] self.constants[val.value] = self.write_element(val, WriteOps.CONSTANT) return self.constants[val.value] def add( self, a: ModuloCircuitElement, b: ModuloCircuitElement, comment: str | None = None, ) -> ModuloCircuitElement: if a is None and isinstance(b, ModuloCircuitElement): return b elif b is None and isinstance(a, ModuloCircuitElement): return a else: assert isinstance(a, ModuloCircuitElement) and isinstance( b, ModuloCircuitElement ), f"Expected ModuloElement, got {type(a)}, {a} and {type(b)}, {b}" instruction = ModuloCircuitInstruction( ModBuiltinOps.ADD, a.offset, b.offset, self.values_offset, comment ) return self.write_element( a.emulated_felt + b.emulated_felt, WriteOps.BUILTIN, instruction ) def sum(self, args: list[ModuloCircuitElement], comment: str | None = None): if not args: raise ValueError("The 'args' list cannot be empty.") assert all(isinstance(elmt, ModuloCircuitElement) for elmt in args) result = args[0] for elmt in args[1:]: result = self.add(result, elmt, comment) return result def product(self, args: list[ModuloCircuitElement], comment: str | None = None): if not args: raise ValueError("The 'args' list cannot be empty.") assert all(isinstance(elmt, ModuloCircuitElement) for elmt in args) result = args[0] for elmt in args[1:]: result = self.mul(result, elmt, comment) return result def double(self, a: ModuloCircuitElement) -> ModuloCircuitElement: return self.add(a, a) def mul( self, a: ModuloCircuitElement, b: ModuloCircuitElement, comment: str | None = None, ) -> ModuloCircuitElement: if a is None and isinstance(b, ModuloCircuitElement): return self.set_or_get_constant(0) elif b is None and isinstance(a, ModuloCircuitElement): return self.set_or_get_constant(0) assert isinstance(a, ModuloCircuitElement) and isinstance( b, ModuloCircuitElement ), f"Expected ModuloElement, got lhs {type(a)}, {a} and rhs {type(b)}, {b}" instruction = ModuloCircuitInstruction( ModBuiltinOps.MUL, a.offset, b.offset, self.values_offset, comment ) return self.write_element( a.emulated_felt * b.emulated_felt, WriteOps.BUILTIN, instruction ) def square( self, a: ModuloCircuitElement, comment: str | None = None ) -> ModuloCircuitElement: return self.mul(a, a, comment) def neg( self, a: ModuloCircuitElement, comment: str | None = None ) -> ModuloCircuitElement: assert ( type(a) == ModuloCircuitElement ), f"Expected ModuloElement, got {type(a)}, {a}" res = self.sub(self.set_or_get_constant(self.field.zero()), a, comment) return res def sub( self, a: ModuloCircuitElement, b: ModuloCircuitElement, comment: str | None = None, ): assert isinstance(a, ModuloCircuitElement) and isinstance( b, ModuloCircuitElement ), f"Expected ModuloElement, got {type(a)}, {a} and {type(b)}, {b}" instruction = ModuloCircuitInstruction( ModBuiltinOps.ADD, b.offset, self.values_offset, a.offset, comment ) return self.write_element(a.felt - b.felt, WriteOps.BUILTIN, instruction) def inv( self, a: ModuloCircuitElement, comment: str | None = None, ): assert isinstance( a, ModuloCircuitElement ), f"Expected ModuloElement, got {type(a)}, {a}" if self.compilation_mode == 0: one = self.set_or_get_constant( 1 ) # Write one before accessing its offset so self.values_offset is correctly updated. instruction = ModuloCircuitInstruction( ModBuiltinOps.MUL, a.offset, self.values_offset, one.offset, comment, ) elif self.compilation_mode == 1: instruction = ModuloCircuitInstruction( ModBuiltinOps.MUL, a.offset, None, None, comment, ) return self.write_element(a.felt.__inv__(), WriteOps.BUILTIN, instruction) def div( self, a: ModuloCircuitElement, b: ModuloCircuitElement, comment: str | None = None, ): assert isinstance(a, ModuloCircuitElement) and isinstance( b, ModuloCircuitElement ), f"Expected ModuloElement, got {type(a)}, {a} and {type(b)}, {b}" if self.compilation_mode == 0: instruction = ModuloCircuitInstruction( ModBuiltinOps.MUL, b.offset, self.values_offset, a.offset, comment ) return self.write_element( a.felt * b.felt.__inv__(), WriteOps.BUILTIN, instruction ) else: return self.mul(a, self.inv(b)) def fp_sqrt(self, element: ModuloCircuitElement) -> ModuloCircuitElement: """ Computes "a" square root of a field element. /!\ Warning : This circuit is non deterministic /!\ /!\ Two square roots exist for any non-zero element, and no constraint is enforced to select any of them /!\ Raises ValueError if the element is not a quadratic residue. """ assert self.compilation_mode == 0, "fp_sqrt is not supported in cairo 1 mode" root = element.felt.sqrt(min_root=False) # Write the root as a witness and verify it root = self.write_element(root, WriteOps.WITNESS) self.mul_and_assert(root, root, element, comment="Fp sqrt") return root def fp_is_non_zero(self, a: ModuloCircuitElement) -> ModuloCircuitElement: """ Returns 1 if a != 0, 0 if a == 0. Enforces soundness by forcing `flag` to be a true indicator of whether 'a' is non-zero. Main Constraints: 1) flag * (1 - flag) = 0 - Ensures that `flag` ∈ {0,1}, i.e., it's a binary indicator. 2) Prover supplies a_inv as a “would-be” inverse of `a`. - If a != 0, a_inv should be the genuine inverse, i.e. a * a_inv = 1. - If a == 0, a_inv is irrelevant and effectively ignored. 3) flag*(a * a_inv) + (1 - flag)*(a + 1) == 1 - If a == 0 → the only way is flag=0, so: 0 * (0 * a_inv) + 1 * (0 + 1) = 1 which is satisfied. - If a != 0 → the only way is flag=1, so: 1 * (a * a_inv) + 0 * (a + 1) = 1 forcing a_inv to be a true inverse of a. Consequently: • When a == 0, the circuit forces flag=0 and ignores a_inv. • When a != 0, the circuit forces flag=1 and requires a_inv to be the correct inverse. Overall, this design prevents cheating (e.g. claiming a != 0 when it's actually 0, or supplying a bogus inverse) because the single equation in step (3) couples a, a_inv, and flag in a way that only the correct assignments can satisfy all constraints. """ assert ( self.compilation_mode == 0 ), "`fp_is_non_zero_flag` is only supported in cairo 0 mode." # Step 1: Prover declares a boolean-labeled witness: 1 if a != 0, else 0 is_non_zero_python_bool = int(a.value != 0) flag = self.write_element(is_non_zero_python_bool, WriteOps.WITNESS) # Step 2: Force the flag to be a single bit: flag * (1 - flag) == 0 one_minus_flag = self.sub(self.set_or_get_constant(1), flag) self.mul_and_assert( flag, one_minus_flag, self.set_or_get_constant(0), comment="flag ∈ {0,1}", ) # Step 3: The prover supplies a_inv as a witness. # If flag=1 (a != 0), a_inv must be the real inverse: a*a_inv = 1. # If flag=0 (a == 0), a_inv is irrelevant. a_inv_val = 0 if is_non_zero_python_bool: a_inv_val = a.felt.__inv__().value a_inv = self.write_element(a_inv_val, WriteOps.WITNESS) # Step 4: Combine them with the core check: # flag*(a*a_inv) + (1 - flag)*(a+1) == 1 # => forces correct assignments for (flag, a_inv) flag_eq_0_branch = self.add(a, self.set_or_get_constant(1)) flag_eq_1_branch = self.mul(a, a_inv) self.add_and_assert( self.mul(flag, flag_eq_1_branch), self.mul(one_minus_flag, flag_eq_0_branch), self.set_or_get_constant(1), ) # Return the final flag: 1 if a != 0, 0 if a == 0 return flag def vector_sub( self, X: list[ModuloCircuitElement], Y: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: return [ self.sub(x, y, comment=f"Fp{len(X)} sub coeff {i}/{len(X)-1}") for i, (x, y) in enumerate(zip(X, Y)) ] def vector_scale( self, X: list[ModuloCircuitElement], c: ModuloCircuitElement ) -> list[ModuloCircuitElement]: """ Multiplies a polynomial with coefficients `X` by a scalar `c`. Input : I(x) = i0 + i1*x + i2*x^2 + ... + in-1*x^n-1 Output : O(x) = ci0 + ci1*x + ci2*x^2 + ... + cin-1*x^n-1. This is done in the circuit. """ assert isinstance(c, ModuloCircuitElement), "c must be a ModuloCircuitElement" return [ self.mul(x_i, c, comment=f"Fp{len(X)} scalar mul coeff {i}/{len(X)-1}") for i, x_i in enumerate(X) ] def vector_add( self, X: list[ModuloCircuitElement], Y: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: """ Adds two polynomials with coefficients `X` and `Y`. Returns R = [x0 + y0, x1 + y1, x2 + y2, ... + xn-1 + yn-1] mod p """ assert len(X) == len(Y), f"len(X)={len(X)} != len(Y)={len(Y)}" return [ self.add(x_i, y_i, comment=f"Fp{len(X)} add coeff {i}/{len(X)-1}") for i, (x_i, y_i) in enumerate(zip(X, Y)) ] def vector_neg(self, X: list[ModuloCircuitElement]) -> list[ModuloCircuitElement]: """ Negates a polynomial with coefficients `X`. Returns R = [-x0, -x1, -x2, ... -xn-1] mod p """ return [ self.neg(x_i, comment=f"Fp{len(X)} neg coeff {i}/{len(X)-1}") for i, x_i in enumerate(X) ] def sub_and_assert( self, a: ModuloCircuitElement, b: ModuloCircuitElement, c: ModuloCircuitElement, comment: str | None = None, ): """ Subtracts b from a and asserts that the result is equal to c. In practice, it checks that c + b = a [mod p]. All three values are expected to be already in the value segment, no new value is created. Costs 2 Steps. """ assert ( self.compilation_mode == 0 ), "sub_and_assert is not supported in cairo 1 mode" instruction = ModuloCircuitInstruction( ModBuiltinOps.ADD, c.offset, b.offset, a.offset, comment ) self.values_segment.assert_eq_instructions.append(instruction) return c def add_and_assert( self, a: ModuloCircuitElement, b: ModuloCircuitElement, c: ModuloCircuitElement, comment: str | None = None, ): """ Adds a and b and asserts that the result is equal to c. In practice, it only checks that a + b = c [mod p]. All three values are expected to be already in the value segment, no new value is created. Costs 2 Steps. """ assert ( self.compilation_mode == 0 ), "add_and_assert is not supported in cairo 1 mode" instruction = ModuloCircuitInstruction( ModBuiltinOps.ADD, a.offset, b.offset, c.offset, comment ) self.values_segment.assert_eq_instructions.append(instruction) return c def mul_and_assert( self, a: ModuloCircuitElement, b: ModuloCircuitElement, c: ModuloCircuitElement, comment: str | None = None, ): assert ( self.compilation_mode == 0 ), "mul_and_assert is not supported in cairo 1 mode" instruction = ModuloCircuitInstruction( ModBuiltinOps.MUL, a.offset, b.offset, c.offset, comment ) self.values_segment.assert_eq_instructions.append(instruction) return c def eval_horner( self, poly: list[ModuloCircuitElement], z: ModuloCircuitElement, poly_name: str = None, var_name: str = "z", ): """ Evaluates a polynomial at point z using Horner's method. Assumes that the polynomial is in the form a0 + a1*z + a2*z^2 + ... + an*z^n, indexed with the constant coefficient first. """ if poly_name is None: poly_name = "UnnamedPoly" # Regular Horner evaluation acc = poly[-1] # Start with the highest degree coefficient for i in range(len(poly) - 2, -1, -1): acc = self.add( poly[i], self.mul( acc, z, comment=f"Eval {poly_name} Horner step: multiply by {var_name}", ), comment=f"Eval {poly_name} Horner step: add coefficient_{i}", ) return acc def eval_poly( self, poly: list[ModuloCircuitElement], X_powers: list[ModuloCircuitElement], poly_name: str = None, var_name: str = "x", ): """ Evaluates a polynomial at precomputed powers of X. Assumes that the polynomial is in the form a0 + a1*x + a2*x^2 + ... + an*x^n, indexed with the constant coefficient first. Assumes that X_powers is a list of powers of X, such that X_powers[i] = X^(i+1). """ if poly_name is None: poly_name = "UnnamedPoly" assert len(poly) - 1 <= len( X_powers ), f"Expected at least {len(poly) - 1} powers of X to evaluate P, got {len(X_powers)}" acc = poly[0] for i in range(1, len(poly)): acc = self.add( acc, self.mul( poly[i], X_powers[i - 1], comment=f"Eval {poly_name} step coeff_{i} * {var_name}^{i}", ), comment=f"Eval {poly_name} step + (coeff_{i} * {var_name}^{i})", ) return acc def extend_output(self, elmts: list[ModuloCircuitElement]): """ Adds elements to the output of the circuit. """ assert isinstance(elmts, (list, tuple)) assert all(isinstance(x, ModuloCircuitElement) for x in elmts) self.output.extend(elmts) return def extend_struct_output(self, struct: Cairo1SerializableStruct): """ Adds elements to the output of the circuit in struct form. """ assert isinstance(struct, Cairo1SerializableStruct) if self.compilation_mode == 0: self.extend_output(struct.elmts) else: self.values_segment.output_structs.append(struct) self.extend_output(struct.elmts) return def print_value_segment(self): self.values_segment.print() def compile_circuit( self, function_name: str = None, pub: bool = True, inline: bool = True, generic_modulus: bool = False, ): if self.is_empty_circuit(): return "", "" self.values_segment = self.values_segment.non_interactive_transform() inline = inline and not self.do_not_inline if self.compilation_mode == 0: return self.compile_circuit_cairo_zero(function_name), None elif self.compilation_mode == 1: return self.compile_circuit_cairo_1( function_name, pub, inline, generic_modulus ) def compile_circuit_cairo_zero( self, function_name: str = None, returns: dict[str] = { "felt*": [ "constants_ptr", "add_offsets_ptr", "mul_offsets_ptr", "output_offsets_ptr", ], "felt": [ "constants_ptr_len", "input_len", "witnesses_len", "output_len", "continuous_output", "add_mod_n", "mul_mod_n", "n_assert_eq", "name", "curve_id", ], }, ) -> str: dw_arrays = self.values_segment.get_dw_lookups() name = function_name or self.values_segment.name function_name = f"get_{name}_circuit" if self.generic_circuit: code = ( f"func {function_name}(curve_id:felt)->(circuit:{self.class_name}*)" + "{" + "\n" ) else: code = f"func {function_name}()->(circuit:{self.class_name}*)" + "{" + "\n" code += "alloc_locals;\n" code += "let (__fp__, _) = get_fp_and_pc();\n" for dw_array_name in returns["felt*"]: code += f"let ({dw_array_name}:felt*) = get_label_location({dw_array_name}_loc);\n" code += f"let constants_ptr_len = {len(dw_arrays['constants_ptr'])};\n" code += f"let input_len = {len(self.values_segment.segment_stacks[WriteOps.INPUT])*N_LIMBS};\n" code += f"let witnesses_len = {len(self.values_segment.segment_stacks[WriteOps.WITNESS])*N_LIMBS};\n" code += f"let output_len = {len(self.output)*N_LIMBS};\n" continuous_output = self.continuous_output code += f"let continuous_output = {1 if continuous_output else 0};\n" code += f"let add_mod_n = {len(dw_arrays['add_offsets_ptr'])};\n" code += f"let mul_mod_n = {len(dw_arrays['mul_offsets_ptr'])};\n" code += ( f"let n_assert_eq = {len(self.values_segment.assert_eq_instructions)};\n" ) code += f"let name = '{self.name}';\n" code += ( f"let curve_id = {'curve_id' if self.generic_circuit else self.curve_id};\n" ) code += f"local circuit:{self.class_name} = {self.class_name}({', '.join(returns['felt*'])}, {', '.join(returns['felt'])});\n" code += "return (&circuit,);\n" for dw_array_name in returns["felt*"]: dw_values = dw_arrays[dw_array_name] code += f"\t {dw_array_name}_loc:\n" if dw_array_name == "constants_ptr": for bigint in dw_values: for limb in bigint: code += f"\t dw {limb};\n" code += "\n" elif dw_array_name in ["add_offsets_ptr", "mul_offsets_ptr"]: num_instructions = len(dw_values) instructions_needed = ( BATCH_SIZE - (num_instructions % BATCH_SIZE) ) % BATCH_SIZE # Must be a multiple of 8 (currently) for left, right, result, comment in dw_values: code += ( f"\t dw {left}; // {comment}\n" + f"\t dw {right};\n" + f"\t dw {result};\n" ) if instructions_needed > 0: first_triplet = dw_values[0] for _ in range(instructions_needed): code += ( f"\t dw {first_triplet[0]};\n" + f"\t dw {first_triplet[1]};\n" + f"\t dw {first_triplet[2]};\n" ) code += "\n" elif dw_array_name in ["output_offsets_ptr"]: if continuous_output: code += f"\t dw {dw_values[0]};\n" else: for val in dw_values: code += f"\t dw {val};\n" code += "\n" code += "}\n" return code def write_cairo1_input_stack( self, write_ops: WriteOps, code: str, offset_to_reference_map: dict[int, str], start_index: int, ) -> tuple: """ Defines the inputs for the compiled Cairo 1 circuit. """ len_stack = len(self.values_segment.segment_stacks[write_ops]) if len_stack > 0: code += f"\n // {write_ops.name} stack\n" offsets = list(self.values_segment.segment_stacks[write_ops].keys()) i = 0 while i < len_stack: if write_ops == WriteOps.CONSTANT: val = self.values_segment.segment[offsets[i]].value if 0 < -val % self.field.p <= 100: comment = f"// -{hex(-val%self.field.p)} % p" else: comment = f"// {hex(val)}" code += f"\t let in{start_index+i} = CE::> {{}}; {comment}\n" offset_to_reference_map[offsets[i]] = f"in{start_index+i}" i += 1 else: if i + 2 < len_stack: code += f"\t let (in{start_index+i}, in{start_index+i+1}, in{start_index+i+2}) = (CE::> {{}}, CE::> {{}}, CE::> {{}});\n" offset_to_reference_map[offsets[i]] = f"in{start_index+i}" offset_to_reference_map[offsets[i + 1]] = f"in{start_index+i+1}" offset_to_reference_map[offsets[i + 2]] = f"in{start_index+i+2}" i += 3 elif i + 1 < len_stack: code += f"\t let (in{start_index+i}, in{start_index+i+1}) = (CE::> {{}}, CE::> {{}});\n" offset_to_reference_map[offsets[i]] = f"in{start_index+i}" offset_to_reference_map[offsets[i + 1]] = f"in{start_index+i+1}" i += 2 else: code += f"\t let in{start_index+i} = CE::> {{}};\n" offset_to_reference_map[offsets[i]] = f"in{start_index+i}" i += 1 return ( code, offset_to_reference_map, start_index + len_stack, ) else: return code, offset_to_reference_map, start_index def fill_cairo_1_constants(self) -> tuple[str, str]: """ Return the part of the code that fills the constants to the circuit, and the constants array if there are more than 8 constants. In that case, .next_span() is used to save bytecode and the constants are stored in a const array. """ constants_ints = [ self.values_segment.segment[offset].value for offset in self.values_segment.segment_stacks[WriteOps.CONSTANT].keys() ] if len(constants_ints) < 8: constants_split = [bigint_split(x, N_LIMBS, BASE) for x in constants_ints] constants_filled = "\n".join( f"circuit_inputs = circuit_inputs.next_2([{','.join(hex(x) for x in constants_split[i])}]); // in{i}" for i in range(len(constants_ints)) ) return constants_filled, None else: import garaga.hints.io as io const_name = ( self.name.upper() + "_" + CurveID(self.curve_id).name.upper() + "_CONSTANTS" ) constants_filled = f""" circuit_inputs = circuit_inputs.next_span({const_name}.span()); // in{0} - in{len(constants_ints)-1} """ const_array = f"const {const_name}: [u384; {len(constants_ints)}] = {io.int_array_to_u384_array(constants_ints, const=True)};" return constants_filled, const_array def write_cairo1_circuit(self, offset_to_reference_map: dict[int, str]) -> str: """ Defines the arithmetic instructions for the compiled Cairo 1 circuit. """ code = "" for i, (offset, vs_item) in enumerate( self.values_segment.segment_stacks[WriteOps.BUILTIN].items() ): op = vs_item.instruction.operation left_offset = vs_item.instruction.left_offset right_offset = vs_item.instruction.right_offset result_offset = vs_item.instruction.result_offset comment = vs_item.instruction.comment or "" # print(i, op, left_offset, right_offset, result_offset) match op: case ModBuiltinOps.ADD: if right_offset > result_offset: # Case sub code += f"let t{i} = circuit_sub({offset_to_reference_map[result_offset]}, {offset_to_reference_map[left_offset]}); {'// '+comment if comment else ''}\n" offset_to_reference_map[offset] = f"t{i}" assert offset == right_offset else: code += f"let t{i} = circuit_add({offset_to_reference_map[left_offset]}, {offset_to_reference_map[right_offset]}); {'// '+comment if comment else ''}\n" offset_to_reference_map[offset] = f"t{i}" assert offset == result_offset case ModBuiltinOps.MUL: if right_offset == result_offset == offset: # Case inv # print(f"\t INV {left_offset} {right_offset} {result_offset}") code += f"let t{i} = circuit_inverse({offset_to_reference_map[left_offset]}); {'// '+comment if comment else ''}\n" offset_to_reference_map[offset] = f"t{i}" else: # print(f"MUL {left_offset} {right_offset} {result_offset}") code += f"let t{i} = circuit_mul({offset_to_reference_map[left_offset]}, {offset_to_reference_map[right_offset]}); {'// '+comment if comment else ''}\n" offset_to_reference_map[offset] = f"t{i}" assert offset == result_offset return code def compile_circuit_cairo_1( self, function_name: str = None, pub: bool = False, inline: bool = True, generic_modulus: bool = False, ) -> tuple[str, str]: """ Defines the Cairo 1 function code for the compiled circuit. """ name = function_name or self.values_segment.name function_name = f"run_{name}_circuit" curve_index = CurveID.find_value_in_string(name) return_is_struct = False input_is_struct = False if self.output_structs: if sum([len(x.elmts) for x in self.output_structs]) == len(self.output): return_is_struct = True signature_output = ( f"({','.join([x.struct_name for x in self.output_structs])}" ) signature_output += ",)" if len(self.output_structs) == 1 else ")" else: raise ValueError( f"Output structs must have the same number of elements as the output: {len(self.output_structs)=} != {len(self.output)=}" ) else: signature_output = "Array" if self.input_structs: if sum([len(x) for x in self.input_structs]) == len(self.input): input_is_struct = True signature_input = f"{','.join([x.serialize_input_signature() for x in self.input_structs])}" else: raise ValueError( f"Input structs must have the same number of elements as the input: {sum([len(x) for x in self.input_structs])=} != {len(self.input)=}" ) else: signature_input = "mut input: Array" if "" in signature_input or ":T," in signature_input: generic_input = ", +Drop, +Copy>" else: generic_input = "" if pub: prefix = "pub " else: prefix = "" if inline: if generic_input == "": attribute = "#[inline(always)]" else: attribute = "#[inline]" else: attribute = "" generic_modulus = generic_modulus or self.generic_modulus if generic_modulus: code = f"{attribute}\n{prefix}fn {function_name}{generic_input}({signature_input}, modulus:core::circuit::CircuitModulus)->{signature_output} {{\n" elif self.generic_circuit: code = f"{attribute}\n{prefix}fn {function_name}{generic_input}({signature_input}, curve_index:usize)->{signature_output} {{\n" else: code = f"{attribute}\n{prefix}fn {function_name}{generic_input}({signature_input})->{signature_output} {{\n" # Define the input for the circuit. code, offset_to_reference_map, start_index = self.write_cairo1_input_stack( WriteOps.CONSTANT, code, {}, 0 ) ( code, offset_to_reference_map, commit_start_index, ) = self.write_cairo1_input_stack( WriteOps.INPUT, code, offset_to_reference_map, start_index ) code, offset_to_reference_map, commit_end_index = self.write_cairo1_input_stack( WriteOps.COMMIT, code, offset_to_reference_map, commit_start_index ) code, offset_to_reference_map, start_index = self.write_cairo1_input_stack( WriteOps.WITNESS, code, offset_to_reference_map, commit_end_index ) code, offset_to_reference_map, start_index = self.write_cairo1_input_stack( WriteOps.FELT, code, offset_to_reference_map, start_index ) code += self.write_cairo1_circuit(offset_to_reference_map) outputs_refs = [] for out in self.output: if self.values_segment[out.offset].write_source == WriteOps.BUILTIN: outputs_refs.append(offset_to_reference_map[out.offset]) else: continue if self.exact_output_refs_needed: outputs_refs_needed = [ offset_to_reference_map[out.offset] for out in self.exact_output_refs_needed ] else: outputs_refs_needed = outputs_refs if generic_modulus: code += "\nlet modulus = modulus;\n" elif curve_index is not None: code += f""" let modulus = crate::definitions::get_{CurveID(self.curve_id).name}_modulus(); // {CurveID(self.curve_id).name} prime field modulus """ else: code += """ let modulus = crate::definitions::get_modulus(curve_index); """ code += f""" let mut circuit_inputs = ({','.join(outputs_refs_needed)},).new_inputs(); // Prefill constants: """ tmp, const_array = self.fill_cairo_1_constants() code += tmp code += """ // Fill inputs: """ acc_len = len(self.values_segment.segment_stacks[WriteOps.CONSTANT]) if input_is_struct: for struct in self.input_structs: struct_code = struct.dump_to_circuit_input() struct_code_lines = [ line for line in struct_code.split("\n") if line.strip() ] if "while let" not in struct_code and "for val in" not in struct_code: struct_code_with_counter = "\n".join( f"{line} // in{i+acc_len}" for i, line in enumerate(struct_code_lines) ) else: struct_code_with_counter = ( struct_code + f" // in{acc_len} - in{acc_len+len(struct)-1}\n" ) acc_len += len(struct) code += struct_code_with_counter + "\n" else: code += """ let mut input = input; while let Option::Some(val) = input.pop_front() { circuit_inputs = circuit_inputs.next_2(val); }; """ code += """ let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); """ if return_is_struct: code += "\n".join( [ struct.extract_from_circuit_output(offset_to_reference_map) for struct in self.output_structs ] ) code += ( f"return ({','.join([struct.name for struct in self.output_structs])}" ) code += ",);\n}" if len(self.output_structs) == 1 else ");\n}" else: code += f"let res=array![{','.join([f'outputs.get_output({ref})' for ref in outputs_refs])}];\n" code += "return res;\n" code += "}\n" if const_array: # Add the constants outside of the function if they are more than 8. code += "\n" code += const_array return code, function_name def summarize(self): add_count, mul_count, assert_eq_count = self.values_segment.summarize() summary = { "circuit": self.name, "MULMOD": mul_count, "ADDMOD": add_count, "ASSERT_EQ": assert_eq_count, "POSEIDON": 0, "RLC": 0, } return summary if __name__ == "__main__": from garaga.algebra import BaseField field = BaseField(256) circuit = ModuloCircuit("test_circuit", 0) a = circuit.write_element(field(1)) b = circuit.write_element(field(2)) c = circuit.add(a, b) d = circuit.mul(c, b) print(c) print(d) circuit = ModuloCircuit("test_empty_circuit", curve_id=0, compilation_mode=1) print(circuit.compile_circuit()) ================================================ FILE: hydra/garaga/modulo_circuit_structs.py ================================================ from __future__ import annotations from abc import ABC, abstractmethod from dataclasses import dataclass from typing import Generic, TypeVar from garaga.algebra import FunctionFelt, ModuloCircuitElement, PyFelt from garaga.curves import STARK, get_base_field from garaga.hints import io from garaga.hints.io import ( int_array_to_u384_array, int_to_u2XX, int_to_u256, int_to_u384, ) from garaga.points import G1Point, G2Point T = TypeVar("T", bound="Cairo1SerializableStruct") from enum import Enum class CairoOption(Enum): SOME = 0 NONE = 1 VOID = 2 # Special case to serialize nothing at all. @dataclass(slots=True) class Cairo1SerializableStruct(ABC): name: str elmts: list[ModuloCircuitElement | PyFelt | "Cairo1SerializableStruct"] def __post_init__(self): assert type(self.name) == str if isinstance(self.elmts, (list, tuple)): if len(self.elmts) > 0: if isinstance(self.elmts[0], Cairo1SerializableStruct): assert all( isinstance(elmt, self.elmts[0].__class__) for elmt in self.elmts ), f"All elements of {self.name} must be of the same type" else: assert all( isinstance(elmt, (ModuloCircuitElement, PyFelt)) for elmt in self.elmts ), f"All elements of {self.name} must be of type ModuloCircuitElement or PyFelt, got {type(self.elmts[0])}" else: assert self.elmts is None, f"Elmts must be a list or None, got {self.elmts}" @property def struct_name(self) -> str: return self.__class__.__name__ @property def bits(self) -> int: return self.elmts[0].p.bit_length() def serialize_input_signature(self) -> str: return f"{self.name}:{self.struct_name}" @abstractmethod def serialize(self, raw: bool = False) -> str: pass @abstractmethod def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: pass @abstractmethod def dump_to_circuit_input(self) -> str: pass @abstractmethod def __len__(self) -> int: pass def _serialize_to_calldata(self) -> list[int]: pass def serialize_to_calldata(self, *args, **kwargs) -> list[int]: data = self._serialize_to_calldata(*args, **kwargs) # print( # f"\nSerializing {self.name} {self.struct_name} to calldata: {data} {len(data)}" # ) return data class StructArray(Cairo1SerializableStruct, Generic[T]): elmts: list[T] @property def struct_name(self) -> str: return "Array<" + self.elmts[0].struct_name + ">" def dump_to_circuit_input(self) -> str: code = "" for struct in self.elmts: code += struct.dump_to_circuit_input() return code def __len__(self) -> int: return sum(len(struct) for struct in self.elmts) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError def serialize(self, raw: bool = False, const: bool = False) -> str: if const: raw_struct = "[" else: raw_struct = "array![" for struct in self.elmts: raw_struct += struct.serialize(raw=True) + "," raw_struct += "]\n" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def serialize_to_calldata(self) -> list[int]: cd = [len(self)] for elmt in self.elmts: cd.extend(elmt.serialize_to_calldata()) return cd class Struct(Cairo1SerializableStruct): elmts: list[Cairo1SerializableStruct] def __init__( self, struct_name: str, name: str, elmts: list[Cairo1SerializableStruct] ): super().__init__(name, elmts) self._struct_name = struct_name @property def struct_name(self) -> str: return self._struct_name def __post_init__(self): assert all(isinstance(elmt, Cairo1SerializableStruct) for elmt in self.elmts) def dump_to_circuit_input(self) -> str: return NotImplementedError def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError def serialize(self, raw: bool = False) -> str: if raw: code = f"{self.struct_name} {{" else: code = f"let {self.name} = {self.struct_name} {{" for struct in self.elmts: code += f"{struct.name}: {struct.serialize(raw=True)}," if raw: code += "}" else: code += "};" return code def __len__(self) -> int: return sum(len(elmt) for elmt in self.elmts) def _serialize_to_calldata(self) -> list[int]: cd = [] for elmt in self.elmts: cd.extend(elmt.serialize_to_calldata()) return cd class StructSpan(Cairo1SerializableStruct, Generic[T]): elmts: list[T] @property def struct_name(self) -> str: return "Span<" + self.elmts[0].struct_name + ">" def dump_to_circuit_input(self) -> str: code = f"let mut {self.name} = {self.name};\n" code += f"for val in {self.name} {{\n" self.elmts[0].name = "*val" code += self.elmts[0].dump_to_circuit_input() code += "};\n" return code def __len__(self) -> int: return sum(len(struct) for struct in self.elmts) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError def serialize(self, raw: bool = False, is_option: bool = False) -> str: if self.elmts is None: raw_struct = "Option::None" if raw: return raw_struct else: return f"let {self.name} = {raw_struct};\n" else: raw_struct = "array![" for struct in self.elmts: raw_struct += struct.serialize(raw=True) + "," raw_struct += "].span()" if is_option: raw_struct = f"Option::Some({raw_struct})" if raw: return raw_struct else: return f"let {self.name} = {raw_struct};\n" def _serialize_to_calldata( self, option: CairoOption = None, as_pure_felt252_array: bool = False ) -> list[int]: cd = [] if option: if option == CairoOption.SOME: cd.append(0) elif option == CairoOption.NONE: cd.append(1) return cd elif option == CairoOption.VOID: return cd else: raise ValueError(f"Invalid option: {option}") cd.append(len(self.elmts)) for elmt in self.elmts: cd.extend(elmt._serialize_to_calldata()) if as_pure_felt252_array: cd[0] = len(cd) - 1 return cd # class u288(Cairo1SerializableStruct): # def serialize(self, raw: bool = False) -> str: # assert len(self.elmts) == 1 # raw_struct = f"{int_to_u288(self.elmts[0].value)}" # if raw: # return raw_struct # else: # return f"let {self.name}:{self.struct_name} = {raw_struct};\n" # def _serialize_to_calldata(self) -> list[int]: # assert len(self.elmts) == 1 # return io.bigint_split_array(self.elmts, n_limbs=3, prepend_length=False) # def extract_from_circuit_output( # self, offset_to_reference_map: dict[int, str] # ) -> str: # assert len(self.elmts) == 1 # return f"let {self.name}:{self.struct_name} = outputs.get_output({offset_to_reference_map[self.elmts[0].offset]});" # def dump_to_circuit_input(self) -> str: # return f"circuit_inputs = circuit_inputs.next_u288({self.name});\n" # def __len__(self) -> int: # if self.elmts is not None: # assert len(self.elmts) == 1 # return 1 # else: # return 1 class u384(Cairo1SerializableStruct): def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 1 raw_struct = f"{int_to_u384(self.elmts[0].value)}" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: assert len(self.elmts) == 1 return io.bigint_split_array(self.elmts, prepend_length=False) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 1 return f"let {self.name}:{self.struct_name} = outputs.get_output({offset_to_reference_map[self.elmts[0].offset]});" def dump_to_circuit_input(self) -> str: return f"circuit_inputs = circuit_inputs.next_2({self.name});\n" def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 1 return 1 else: return 1 class RSA2048Chunks(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ("w0", "w1", "w2", "w3", "w4", "w5") @property def struct_name(self) -> str: return "RSA2048Chunks" def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 6 raw_struct = ( f"{self.struct_name} {{" + ",".join( f"{self.members_names[i]}: {int_to_u384(self.elmts[i].value)}" for i in range(6) ) + "}" ) if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: assert len(self.elmts) == 6 return io.bigint_split_array(self.elmts, prepend_length=False) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 6 return f"let {self.name}:{self.struct_name} = {self.struct_name} {{ {','.join([f'{self.members_names[i]}: outputs.get_output({offset_to_reference_map[self.elmts[i].offset]})' for i in range(6)])} }};" def dump_to_circuit_input(self) -> str: code = "" for mem_name in self.members_names: code += f"circuit_inputs = circuit_inputs.next_2({self.name}.{mem_name});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 6 return 6 else: return 6 class RSA2048ReductionWitness(Cairo1SerializableStruct): """Composite struct: quotient (6 u384) + remainder (6 u384) = 12 elements.""" def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.chunk_names = ("w0", "w1", "w2", "w3", "w4", "w5") @property def struct_name(self) -> str: return "RSA2048ReductionWitness" def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 12 quot = ", ".join( f"{self.chunk_names[i]}: {int_to_u384(self.elmts[i].value)}" for i in range(6) ) rem = ", ".join( f"{self.chunk_names[i]}: {int_to_u384(self.elmts[6 + i].value)}" for i in range(6) ) raw_struct = f"{self.struct_name} {{ quotient: RSA2048Chunks {{ {quot} }}, remainder: RSA2048Chunks {{ {rem} }} }}" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: assert len(self.elmts) == 12 return io.bigint_split_array(self.elmts, prepend_length=False) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError("RSA2048ReductionWitness is input-only") def dump_to_circuit_input(self) -> str: code = "" for member in ("quotient", "remainder"): for chunk in self.chunk_names: code += f"circuit_inputs = circuit_inputs.next_2({self.name}.{member}.{chunk});\n" return code def __len__(self) -> int: return 12 class GenericT(Cairo1SerializableStruct): # => u384 or u288 @property def struct_name(self) -> str: return "T" def serialize(self, raw: bool = False) -> str: if self.bits <= 288: curve_id = 0 else: curve_id = 1 assert len(self.elmts) == 1 raw_struct = f"{int_to_u2XX(self.elmts[0].value, curve_id)}" if raw: return raw_struct else: return f"let {self.name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: assert len(self.elmts) == 1 if self.bits <= 288: return io.bigint_split_array(self.elmts, prepend_length=False) else: return io.bigint_split_array(self.elmts, n_limbs=3, prepend_length=False) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError def dump_to_circuit_input(self) -> str: return f"circuit_inputs = circuit_inputs.next_2({self.name});\n" def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 1 return 1 else: return 1 class u256(Cairo1SerializableStruct): def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 1 raw_struct = f"{int_to_u256(self.elmts[0].value)}" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: assert len(self.elmts) == 1 return list(io.split_128(self.elmts[0].value)) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError def dump_to_circuit_input(self) -> str: raise NotImplementedError def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 1 return 1 else: return 1 class u256Span(Cairo1SerializableStruct): @property def struct_name(self) -> str: return "Span" def serialize(self, raw: bool = False) -> str: raw_struct = f"{io.int_array_to_u256_array(self.elmts)}.span()" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: return io.bigint_split_array( self.elmts, n_limbs=2, base=2**128, prepend_length=True ) def dump_to_circuit_input(self) -> str: code = f""" for val in {self.name} {{ circuit_inputs = circuit_inputs.next_u256(*val); }};""" return code def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError def __len__(self) -> int: if self.elmts is not None: return len(self.elmts) else: return None class u128(Cairo1SerializableStruct): def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 1 assert 0 <= self.elmts[0].value < 2**128 raw_struct = f"{hex(self.elmts[0].value)}" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: assert len(self.elmts) == 1 assert 0 <= self.elmts[0].value < 2**128 return [self.elmts[0].value] def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError def dump_to_circuit_input(self) -> str: return f"circuit_inputs = circuit_inputs.next_u128({self.name});\n" def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 1 return 1 else: return 1 class u128Span(Cairo1SerializableStruct): @property def struct_name(self) -> str: return "Span" def serialize(self, raw: bool = False) -> str: raw_struct = f"{io.int_array_to_u128_array(self.elmts)}.span()" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: return io.bigint_split_array( self.elmts, n_limbs=1, base=2**128, prepend_length=True ) def dump_to_circuit_input(self) -> str: code = f""" for val in {self.name} {{ circuit_inputs = circuit_inputs.next_u128(*val); }};""" return code def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError def __len__(self) -> int: if self.elmts is not None: return len(self.elmts) else: return None class Tuple(Cairo1SerializableStruct): elmts: list[Cairo1SerializableStruct] def __init__(self, name: str, elmts: list[Cairo1SerializableStruct]): super().__init__(name, elmts) self.members_names = [member.name for member in elmts] @property def struct_name(self) -> str: return f"({','.join([elmt.struct_name for elmt in self.elmts])})" def serialize(self, raw: bool = False) -> str: assert len(self.elmts) > 0 raw_struct = f"({','.join([elmt.serialize(raw=True) for elmt in self.elmts])})" if raw: return raw_struct else: return f"let ({','.join([elmt.name for elmt in self.elmts])}):{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: cd = [] for elmt in self.elmts: cd.extend(elmt._serialize_to_calldata()) return cd def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError def dump_to_circuit_input(self) -> str: code = "" # Need to unpack the tuple : code = f"let ({','.join([self.members_names[i] for i in range(len(self.elmts))])}) = {self.name};\n" # Now call dump_to_circuit_input for each member # Names must correspond to the members names for i, elmt in enumerate(self.elmts): assert ( elmt.name == self.members_names[i] ), f"Tuple member {i} has name {elmt.name} instead of {self.members_names[i]}" code += elmt.dump_to_circuit_input() return code def __len__(self) -> int: return sum(len(elmt) for elmt in self.elmts) class felt252(Cairo1SerializableStruct): def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 1 raw_struct = f"{hex(self.elmts[0].value)}" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: assert len(self.elmts) == 1 return [self.elmts[0].value % STARK] def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError def dump_to_circuit_input(self) -> str: code = f"let {self.name}_384:u384 = {self.name}.into();\n" code += f"circuit_inputs = circuit_inputs.next_2({self.name}_384);\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 1 return 1 else: return 1 class u384Array(Cairo1SerializableStruct): def serialize(self, raw: bool = False) -> str: if len(self.elmts) == 0: raw_struct = "array![]" else: bits = self.bits if self.name == "g_rhs_sqrt": # Temp fix before we change the MSMHint and G1Points to depend on the curve id # Todo : remove this curve_id = 1 else: curve_id = 0 if bits <= 288 else 1 raw_struct = f"{io.int_array_to_u2XX_array(self.elmts, curve_id=curve_id)}" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: if len(self.elmts) == 0: return [0] bits = self.bits if bits <= 288 and self.name != "g_rhs_sqrt": return io.bigint_split_array(self.elmts, n_limbs=3, prepend_length=True) else: return io.bigint_split_array(self.elmts, n_limbs=4, prepend_length=True) @property def struct_name(self) -> str: bits = self.bits if bits <= 288: return "Array" elif bits <= 384: return "Array" else: raise ValueError(f"Unsupported bit length for u384Array: {bits}") def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: return f"let {self.name} = array![{','.join([f'outputs.get_output({offset_to_reference_map[elmt.offset]})' for elmt in self.elmts])}];" def dump_to_circuit_input(self) -> str: next_fn = "next_2" code = f""" for val in {self.name}.span() {{ circuit_inputs = circuit_inputs.{next_fn}(*val); }};""" return code def __len__(self) -> int: if self.elmts is not None: return len(self.elmts) else: return None class FunctionFeltCircuit(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[u384Span]): super().__init__(name, elmts) self.members_names = ("a_num", "a_den", "b_num", "b_den") @property def a_num(self) -> list[ModuloCircuitElement | PyFelt]: return self.elmts[0].elmts @property def a_den(self) -> list[ModuloCircuitElement | PyFelt]: return self.elmts[1].elmts @property def b_num(self) -> list[ModuloCircuitElement | PyFelt]: return self.elmts[2].elmts @property def b_den(self) -> list[ModuloCircuitElement | PyFelt]: return self.elmts[3].elmts @property def struct_name(self) -> str: return "FunctionFelt" @staticmethod def from_FunctionFelt( name: str, f: FunctionFelt, msm_size: int, batched: bool = False ) -> "FunctionFeltCircuit": _a_num, _a_den, _b_num, _b_den = io.padd_function_felt( f, msm_size, py_felt=True, batched=batched ) return FunctionFeltCircuit( name=name, elmts=[ u384Span("a_num", _a_num), u384Span("a_den", _a_den), u384Span("b_num", _b_num), u384Span("b_den", _b_den), ], ) def _serialize_to_calldata(self) -> list[int]: cd = [] assert len(self.elmts) == 4 bits = self.elmts[0].bits if bits <= 288: for elmt in self.elmts: cd.extend( io.bigint_split_array(elmt.elmts, n_limbs=3, prepend_length=True) ) else: for elmt in self.elmts: cd.extend( io.bigint_split_array(elmt.elmts, n_limbs=4, prepend_length=True) ) return cd def serialize_input_signature(self) -> str: return f"{self.name}:FunctionFelt" def serialize(self, raw: bool = False) -> str: raw_struct = f"FunctionFelt {{ {','.join([f'{self.members_names[i]}: {self.elmts[i].serialize(raw=True)}' for i in range(4)])} }}" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def dump_to_circuit_input(self) -> str: code = "" for mem_name in self.members_names: code += f""" for val in {self.name}.{mem_name} {{ circuit_inputs = circuit_inputs.next_2(*val); }}; """ return code def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: return f"let {self.name}:{self.struct_name} = {self.struct_name} {{ {','.join([f'{self.members_names[i]}: {self.elmts[i].extract_from_circuit_output(offset_to_reference_map)}' for i in range(4)])} }};" def __len__(self) -> int: return sum(len(elmt) for elmt in self.elmts) class u384Span(Cairo1SerializableStruct): def serialize(self, raw: bool = False) -> str: raw_struct = f"{int_array_to_u384_array(self.elmts)}.span()" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: return io.bigint_split_array(self.elmts, prepend_length=True) @property def struct_name(self) -> str: return "Span" def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: return f"let {self.name}:{self.struct_name} = array![{','.join([f'outputs.get_output({offset_to_reference_map[elmt.offset]})' for elmt in self.elmts])}].span();" def dump_to_circuit_input(self) -> str: code = f"""let mut {self.name} = {self.name}; for val in {self.name} {{ circuit_inputs = circuit_inputs.next_2(*val); }}; """ return code def __len__(self) -> int: if self.elmts is not None: return len(self.elmts) else: return None class BLSProcessedPair(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ("yInv", "xNegOverY") @property def struct_name(self) -> str: return "BLSProcessedPair" def serialize(self) -> str: assert len(self.elmts) == 2 return f"let {self.name}:{self.struct_name} = {self.struct_name} {{yInv: {int_to_u384(self.elmts[0].value)}, xNegOverY: {int_to_u384(self.elmts[1].value)}}};" def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 2 return f"let {self.name}:{self.struct_name} = {self.struct_name} {{ {','.join([f'{self.members_names[i]}: outputs.get_output({offset_to_reference_map[self.elmts[i].offset]})' for i in range(2)])} }};" def dump_to_circuit_input(self) -> str: code = "" for mem_name in self.members_names: code += f"circuit_inputs = circuit_inputs.next_2({self.name}.{mem_name});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 2 return 2 else: return 2 class BNProcessedPair(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ("yInv", "xNegOverY", "QyNeg0", "QyNeg1") @property def struct_name(self) -> str: return "BNProcessedPair" def serialize(self) -> str: assert len(self.elmts) == 4 members = ", ".join( [ f"{name}: {int_to_u384(self.elmts[i].value)}" for i, name in enumerate(self.members_names) ] ) return ( f"let {self.name}:{self.struct_name} = {self.struct_name} {{{members}}};\n" ) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 4 return f"let {self.name}:{self.struct_name} = {self.struct_name} {{ {','.join([f'{self.members_names[i]}: outputs.get_output({offset_to_reference_map[self.elmts[i].offset]})' for i in range(4)])} }};" def dump_to_circuit_input(self) -> str: code = "" for mem_name in self.members_names: code += f"circuit_inputs = circuit_inputs.next_2({self.name}.{mem_name});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 4 return 4 else: return 4 class G1PointCircuit(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ("x", "y") @staticmethod def from_G1Point(name: str, point: G1Point) -> "G1PointCircuit": field = get_base_field(point.curve_id) return G1PointCircuit(name=name, elmts=[field(point.x), field(point.y)]) @property def struct_name(self) -> str: return "G1Point" def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 2 raw_struct = f"{self.struct_name} {{x: {int_to_u384(self.elmts[0].value)}, y: {int_to_u384(self.elmts[1].value)}}}" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: return io.bigint_split_array(self.elmts, prepend_length=False) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 2 return f"let {self.name}:{self.struct_name} = {self.struct_name} {{ {','.join([f'{self.members_names[i]}: outputs.get_output({offset_to_reference_map[self.elmts[i].offset]})' for i in range(2)])} }};" def dump_to_circuit_input(self) -> str: code = "" for mem_name in self.members_names: code += f"circuit_inputs = circuit_inputs.next_2({self.name}.{mem_name});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 2 return 2 else: return 2 class G2PointCircuit(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ("x0", "x1", "y0", "y1") @staticmethod def from_G2Point(name: str, point: G2Point) -> "G2PointCircuit": field = get_base_field(point.curve_id) return G2PointCircuit( name=name, elmts=[ field(point.x[0]), field(point.x[1]), field(point.y[0]), field(point.y[1]), ], ) @property def struct_name(self) -> str: return "G2Point" def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 4 raw_struct = f"{self.struct_name} {{x0: {int_to_u384(self.elmts[0].value)}, x1: {int_to_u384(self.elmts[1].value)}, y0: {int_to_u384(self.elmts[2].value)}, y1: {int_to_u384(self.elmts[3].value)}}}" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 4 return f"let {self.name}:{self.struct_name} = {self.struct_name} {{ {','.join([f'{self.members_names[i]}: outputs.get_output({offset_to_reference_map[self.elmts[i].offset]})' for i in range(4)])} }};" def dump_to_circuit_input(self) -> str: code = "" for mem_name in self.members_names: code += f"circuit_inputs = circuit_inputs.next_2({self.name}.{mem_name});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 4 return 4 else: return 4 class G2Line(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ("r0a0", "r0a1", "r1a0", "r1a1") def serialize_input_signature(self) -> str: bits = self.bits if bits <= 288: return f"{self.name}:G2Line" else: return f"{self.name}:G2Line" def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 4 bits = self.bits if bits <= 288: curve_id = 0 else: curve_id = 1 raw_struct = f"{self.struct_name} {{r0a0: {int_to_u2XX(self.elmts[0].value, curve_id=curve_id)}, r0a1: {int_to_u2XX(self.elmts[1].value, curve_id=curve_id)}, r1a0: {int_to_u2XX(self.elmts[2].value, curve_id=curve_id)}, r1a1: {int_to_u2XX(self.elmts[3].value, curve_id=curve_id)}}}" if raw: return raw_struct else: return f"let {self.name}:{self.struct_name} = {raw_struct};\n" def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 4 return f"let {self.name}:{self.struct_name} = {self.struct_name} {{ {','.join([f'{self.members_names[i]}: outputs.get_output({offset_to_reference_map[self.elmts[i].offset]})' for i in range(4)])} }};" def dump_to_circuit_input(self) -> str: code = "" next_fn = "next_2" for mem_name in self.members_names: code += ( f"circuit_inputs = circuit_inputs.{next_fn}({self.name}.{mem_name});\n" ) return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 4 return 4 else: return 4 class FunctionFeltEvaluations(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ("a_num", "a_den", "b_num", "b_den") def serialize(self) -> str: assert len(self.elmts) == 4 return f"let {self.name}:{self.struct_name} = {self.struct_name} {{a_num: {int_to_u384(self.elmts[0].value)}, a_den: {int_to_u384(self.elmts[1].value)}, b_num: {int_to_u384(self.elmts[2].value)}, b_den: {int_to_u384(self.elmts[3].value)}}};\n" def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 4 return f"let {self.name}:{self.struct_name} = {self.struct_name} {{ {','.join([f'{self.members_names[i]}: outputs.get_output({offset_to_reference_map[self.elmts[i].offset]})' for i in range(4)])} }};" def dump_to_circuit_input(self) -> str: code = "" for mem_name in self.members_names: code += f"circuit_inputs = circuit_inputs.next_2({self.name}.{mem_name});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 4 return 4 else: return 4 class G1G2PairCircuit(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ("p.x", "p.y", "q.x0", "q.x1", "q.y0", "q.y1") @property def struct_name(self) -> str: return "G1G2Pair" def serialize(self) -> str: return ( f"let {self.name}:{self.struct_name} = {self.struct_name} {{" f"p: G1Point{{ x:{int_to_u384(self.elmts[0].value)}, y: {int_to_u384(self.elmts[1].value)}}}, " f"q: G2Point{{ x0:{int_to_u384(self.elmts[2].value)}, x1: {int_to_u384(self.elmts[3].value)}, y0: {int_to_u384(self.elmts[4].value)}, y1: {int_to_u384(self.elmts[5].value)}}}}};\n" ) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 6 return f"let {self.name}:{self.struct_name} = {self.struct_name} {{ {','.join([f'{self.members_names[i]}: outputs.get_output({offset_to_reference_map[self.elmts[i].offset]})' for i in range(6)])} }};" def dump_to_circuit_input(self) -> str: code = "" for mem_name in self.members_names: code += f"circuit_inputs = circuit_inputs.next_2({self.name}.{mem_name});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 6 return 6 else: return 6 class E12D(Cairo1SerializableStruct): def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 12 code = ( f"let {self.name}:{self.__class__.__name__} = {self.__class__.__name__}{{\n" ) for i, elmt in enumerate(self.elmts): code += ( f"w{i}:outputs.get_output({offset_to_reference_map[elmt.offset]}),\n" ) code += "};" return code @property def struct_name(self) -> str: p = self.elmts[0].p if p.bit_length() <= 288: return "E12D" else: return "E12D" def serialize(self, raw: bool = False, is_option: bool = False) -> str: if self.elmts is None: raw_struct = "Option::None" if raw: return raw_struct else: return f"let {self.name}:Option<{self.__class__.__name__}> = {raw_struct};\n" else: assert len(self.elmts) == 12 bits: int = self.elmts[0].p.bit_length() if bits <= 288: curve_id = 0 else: curve_id = 1 raw_struct = ( f"{self.__class__.__name__}{{" + f"{','.join([f'w{i}: {int_to_u2XX(self.elmts[i].value, curve_id=curve_id)}' for i in range(len(self))])}}}" ) if is_option: raw_struct = f"Option::Some({raw_struct})" if raw: return raw_struct else: return f"let {self.name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: bits: int = self.bits if bits <= 288: return io.bigint_split_array(self.elmts, n_limbs=3, prepend_length=False) elif bits <= 384: return io.bigint_split_array(self.elmts, n_limbs=4, prepend_length=False) else: raise ValueError(f"Unsupported bit length for E12D: {bits}") def dump_to_circuit_input(self) -> str: bits: int = self.elmts[0].p.bit_length() code = "" next_fn = "next_2" for i in range(len(self)): code += f"circuit_inputs = circuit_inputs.{next_fn}({self.name}.w{i});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 12 return 12 else: return 12 class E12T(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ( "c0b0a0", "c0b0a1", "c0b1a0", "c0b1a1", "c0b2a0", "c0b2a1", "c1b0a0", "c1b0a1", "c1b1a0", "c1b1a1", "c1b2a0", "c1b2a1", ) def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 12 code = ( f"let {self.name}:{self.__class__.__name__} = {self.__class__.__name__}{{\n" ) for i, elmt in enumerate(self.elmts): code += f"{self.members_names[i]}:outputs.get_output({offset_to_reference_map[elmt.offset]}),\n" code += "};" return code def serialize(self, raw: bool = False, is_option: bool = False) -> str: if self.elmts is None: raw_struct = "Option::None" if raw: return raw_struct else: return f"let {self.name}:Option<{self.__class__.__name__}> = {raw_struct};\n" else: assert len(self.elmts) == 12 raw_struct = ( f"{self.__class__.__name__}{{" + f"{','.join([f'{self.members_names[i]}: {int_to_u384(self.elmts[i].value)}' for i in range(len(self))])}}}" ) if is_option: raw_struct = f"Option::Some({raw_struct})" if raw: return raw_struct else: return f"let {self.name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: return io.bigint_split_array(self.elmts, n_limbs=4, prepend_length=False) def dump_to_circuit_input(self) -> str: code = "" for i in range(len(self)): code += f"circuit_inputs = circuit_inputs.next_2({self.name}.{self.members_names[i]});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 12 return 12 else: return 12 class E12DMulQuotient(Cairo1SerializableStruct): def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 11 code = ( f"let {self.name}:{self.__class__.__name__} = {self.__class__.__name__}{{\n" ) for i, elmt in enumerate(self.elmts): code += ( f"w{i}:outputs.get_output({offset_to_reference_map[elmt.offset]}),\n" ) code += "};" return code @property def struct_name(self) -> str: p = self.elmts[0].p if p.bit_length() <= 288: return "E12DMulQuotient" else: return "E12DMulQuotient" def serialize(self, raw: bool = False, is_option: bool = False) -> str: if self.elmts is None: raw_struct = "Option::None" if raw: return raw_struct else: return f"let {self.name}:Option<{self.__class__.__name__}> = {raw_struct};\n" else: assert len(self.elmts) == 11 bits: int = self.elmts[0].p.bit_length() if bits <= 288: curve_id = 0 else: curve_id = 1 raw_struct = ( f"{self.__class__.__name__}{{" + f"{','.join([f'w{i}: {int_to_u2XX(self.elmts[i].value, curve_id=curve_id)}' for i in range(len(self))])}}}" ) if is_option: raw_struct = f"Option::Some({raw_struct})" if raw: return raw_struct else: return f"let {self.name} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: bits: int = self.bits if bits <= 288: return io.bigint_split_array(self.elmts, n_limbs=3, prepend_length=False) elif bits <= 384: return io.bigint_split_array(self.elmts, n_limbs=4, prepend_length=False) else: raise ValueError(f"Unsupported bit length for E12D: {bits}") def dump_to_circuit_input(self) -> str: code = "" next_fn = "next_2" for i in range(len(self)): code += f"circuit_inputs = circuit_inputs.{next_fn}({self.name}.w{i});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 11 return 11 else: return 11 class MillerLoopResultScalingFactor(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ("w0", "w2", "w4", "w6", "w8", "w10") def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: raise NotImplementedError("Never used in practice") def serialize_input_signature(self) -> str: bits = self.bits if bits <= 288: return f"{self.name}:MillerLoopResultScalingFactor" else: return f"{self.name}:MillerLoopResultScalingFactor" def dump_to_circuit_input(self) -> str: code = "" next_fn = "next_2" for mem_name in self.members_names: code += ( f"circuit_inputs = circuit_inputs.{next_fn}({self.name}.{mem_name});\n" ) return code def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 6 bits = self.bits if bits <= 288: curve_id = 0 else: curve_id = 1 raw_struct = f"{self.__class__.__name__}{{{','.join([f'{self.members_names[i]}: {int_to_u2XX(self.elmts[i].value, curve_id=curve_id)}' for i in range(len(self))])}}}" if raw: return raw_struct else: return f"let {self.name}:{self.__class__.__name__} = {raw_struct};\n" def _serialize_to_calldata(self) -> list[int]: bits = self.bits if bits <= 288: return io.bigint_split_array(self.elmts, n_limbs=3, prepend_length=False) else: return io.bigint_split_array(self.elmts, n_limbs=4, prepend_length=False) def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 6 return 6 else: return 6 class SlopeInterceptOutput(Cairo1SerializableStruct): def __init__(self, name: str, elmts: list[ModuloCircuitElement]): super().__init__(name, elmts) self.members_names = ("m_A0", "b_A0", "x_A2", "y_A2", "coeff0", "coeff2") def serialize(self, raw: bool = False) -> str: assert len(self.elmts) == 6 raw_struct = f"{self.__class__.__name__}{{{','.join([f'{self.members_names[i]}: {int_to_u384(self.elmts[i].value)}' for i in range(len(self))])}}}" if raw: return raw_struct else: return f"let {self.name}:{self.__class__.__name__} = {raw_struct};\n" def extract_from_circuit_output( self, offset_to_reference_map: dict[int, str] ) -> str: assert len(self.elmts) == 6 code = ( f"let {self.name}:{self.__class__.__name__} = {self.__class__.__name__}{{\n" ) for mem_name, elmt in zip(self.members_names, self.elmts): code += f"{mem_name}: outputs.get_output({offset_to_reference_map[elmt.offset]}),\n" code += "};" return code def dump_to_circuit_input(self) -> str: code = "" for mem_name in self.members_names: code += f"circuit_inputs = circuit_inputs.next_2({self.name}.{mem_name});\n" return code def __len__(self) -> int: if self.elmts is not None: assert len(self.elmts) == 6 return 6 else: return 6 ================================================ FILE: hydra/garaga/points.py ================================================ import functools import random from dataclasses import dataclass from fastecdsa import curvemath from garaga.algebra import Fp2, ModuloCircuitElement, Polynomial, PyFelt, get_sparsity from garaga.curves import ( CURVES, GARAGA_RS_SUPPORTED_CURVES, CurveID, PairingCurve, get_base_field, get_irreducible_poly, ) from garaga.hints.io import int_to_u384 @dataclass(slots=True) class G1Point: """ Represents a point on G1, the group of rational points on an elliptic curve over the base field. Attributes: x (int): The x-coordinate of the point. y (int): The y-coordinate of the point. curve_id (CurveID): The identifier of the elliptic curve. """ x: int y: int curve_id: CurveID iso_point: bool = False def __repr__(self) -> str: return f"G1Point({hex(self.x)}, {hex(self.y)}) on {self.curve_id.value}" def __str__(self) -> str: return f"G1Point({self.x}, {self.y}) on curve {self.curve_id}" def __hash__(self): return hash((self.x, self.y, self.curve_id, self.iso_point)) def __eq__(self, other: object) -> bool: """ Checks if two G1Point instances are equal. Args: other (G1Point): The other point to compare. Returns: bool: True if the points are equal, False otherwise. """ if not isinstance(other, G1Point): raise ValueError(f"Cannot compare G1Point with {type(other)}") return ( self.x == other.x and self.y == other.y and self.curve_id.value == other.curve_id.value and self.iso_point == other.iso_point ) def __post_init__(self): """ Post-initialization checks to ensure the point is valid. """ if self.is_infinity(): return if not self.is_on_curve(): raise ValueError(f"Point {self} is not on the curve {self.curve_id}") @staticmethod def infinity(curve_id: CurveID) -> "G1Point": """ Returns the point at infinity for the given curve. Args: curve_id (CurveID): The identifier of the elliptic curve. Returns: G1Point: The point at infinity. """ return G1Point(0, 0, curve_id) def is_infinity(self) -> bool: """ Checks if the point is the point at infinity. Returns: bool: True if the point is at infinity, False otherwise. """ return self.x == 0 and self.y == 0 def to_cairo_1(self, as_hex: bool = True) -> str: """ Converts the point to a Cairo 1 representation. Returns: str: The Cairo 1 representation of the point. """ return f"G1Point{{x: {int_to_u384(self.x, as_hex)}, y: {int_to_u384(self.y, as_hex)}}}" @staticmethod def gen_random_point_not_in_subgroup( curve_id: CurveID, force_gen: bool = False ) -> "G1Point": """ Generates a random point not in the prime order subgroup. Args: curve_id (CurveID): The identifier of the elliptic curve. force_gen (bool): Force generation even if the cofactor is 1. Returns: G1Point: A random point not in the prime order subgroup. Raises: ValueError: If the cofactor is 1 and force_gen is False. """ curve_idx = curve_id.value if CURVES[curve_idx].h == 1: if force_gen: return G1Point.gen_random_point(curve_id) else: raise ValueError( "Cofactor is 1, cannot generate a point not in the subgroup" ) else: field = get_base_field(curve_idx) while True: x = field.random() y2 = x**3 + CURVES[curve_idx].a * x + CURVES[curve_idx].b try: tentative_point = G1Point(x.value, y2.sqrt().value, curve_id) except ValueError: continue if not tentative_point.is_in_prime_order_subgroup_generic(): return tentative_point def is_in_prime_order_subgroup_generic(self) -> bool: """ Checks if the point is in the prime order subgroup. Returns: bool: True if the point is in the prime order subgroup, False otherwise. """ return self.scalar_mul(CURVES[self.curve_id.value].n).is_infinity() def is_in_prime_order_subgroup(self) -> bool: if CURVES[self.curve_id.value].h == 1: # Cofactor is 1 : points on the curve <=> points in the prime order subgroup return self.is_on_curve() or self.is_infinity() else: if self.curve_id == CurveID.BLS12_381: # we check that p+x²ϕ(p) # is the infinity. third_root_of_unity = 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAC phi_p = G1Point( self.x * third_root_of_unity % CURVES[self.curve_id.value].p, self.y, self.curve_id, ) x_seed_sq = (CURVES[self.curve_id.value].x) ** 2 return phi_p.scalar_mul(x_seed_sq).add(self).is_infinity() else: return self.is_in_prime_order_subgroup_generic() def is_on_curve(self) -> bool: """ Checks if the point is on the curve using the curve equation y^2 = x^3 + ax + b. Returns: bool: True if the point is on the curve, False otherwise. """ if self.iso_point: a = CURVES[self.curve_id.value].swu_params.A b = CURVES[self.curve_id.value].swu_params.B else: a = CURVES[self.curve_id.value].a b = CURVES[self.curve_id.value].b p = CURVES[self.curve_id.value].p lhs = self.y**2 % p rhs = (self.x**3 + a * self.x + b) % p return lhs == rhs @staticmethod def gen_random_point(curve_id: CurveID) -> "G1Point": """ Generates a random point on a given curve. Args: curve_id (CurveID): The identifier of the elliptic curve. Returns: G1Point: A random point on the curve. """ scalar = random.randint(1, CURVES[curve_id.value].n - 1) return G1Point.get_nG(curve_id, scalar) @staticmethod def get_nG(curve_id: CurveID, n: int) -> "G1Point": """ Returns the scalar multiplication of the generator point on a given curve by the scalar n. Args: curve_id (CurveID): The identifier of the elliptic curve. n (int): The scalar to multiply by. Returns: G1Point: The resulting point after scalar multiplication. Raises: AssertionError: If n is not less than the order of the curve. """ assert ( n < CURVES[curve_id.value].n ), "n must be less than the order of the curve" gen = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) return gen.scalar_mul(n) @staticmethod def msm(points: list["G1Point"], scalars: list[int]) -> "G1Point": """ Performs multi-scalar multiplication (MSM) on a list of points and scalars. Args: points (list[G1Point]): The list of points. scalars (list[int]): The list of scalars. Returns: G1Point: The resulting point after MSM. """ assert len(points) == len( scalars ), f"Points and scalar length mismatch: {len(points)} points and {len(scalars)} scalars" muls = [P.scalar_mul(s) for P, s in zip(points, scalars)] scalar_mul = functools.reduce(lambda acc, p: acc.add(p), muls) return scalar_mul def scalar_mul(self, scalar: int) -> "G1Point": """ Performs scalar multiplication on the point. Args: scalar (int): The scalar to multiply by. abs(scalar) should be less than the order of the curve. Returns: G1Point: The resulting point after scalar multiplication. """ if self.is_infinity(): return self if scalar == 0: return G1Point(0, 0, self.curve_id, self.iso_point) if self.iso_point: a = CURVES[self.curve_id.value].swu_params.A b = CURVES[self.curve_id.value].swu_params.B else: a = CURVES[self.curve_id.value].a b = CURVES[self.curve_id.value].b # Fastecdsa C binding. x, y = curvemath.mul( str(self.x), str(self.y), str(abs(scalar)), str(CURVES[self.curve_id.value].p), str(a), str(b), str(CURVES[self.curve_id.value].n), str(CURVES[self.curve_id.value].Gx), str(CURVES[self.curve_id.value].Gy), ) # Fastecdsa already returns (0, 0) for the identity element. if scalar < 0: return -G1Point(int(x), int(y), self.curve_id, self.iso_point) else: return G1Point(int(x), int(y), self.curve_id, self.iso_point) def add(self, other: "G1Point") -> "G1Point": """ Adds two points on the elliptic curve. Args: other (G1Point): The other point to add. Returns: G1Point: The resulting point after addition. Raises: ValueError: If the points are not on the same curve. """ if self.is_infinity(): return other if other.is_infinity(): return self if self.curve_id != other.curve_id: raise ValueError("Points are not on the same curve") if self.iso_point != other.iso_point: raise ValueError("Points are not on the same curve") if self.iso_point: a = CURVES[self.curve_id.value].swu_params.A b = CURVES[self.curve_id.value].swu_params.B else: a = CURVES[self.curve_id.value].a b = CURVES[self.curve_id.value].b x, y = curvemath.add( str(self.x), str(self.y), str(other.x), str(other.y), str(CURVES[self.curve_id.value].p), str(a), str(b), str(CURVES[self.curve_id.value].n), str(CURVES[self.curve_id.value].Gx), str(CURVES[self.curve_id.value].Gy), ) # NB : Fastecdsa returns (0, 0) for the identity element. return G1Point(int(x), int(y), self.curve_id, self.iso_point) def __neg__(self) -> "G1Point": """ Negates the point on the elliptic curve. Returns: G1Point: The negated point. """ return G1Point( self.x, -self.y % CURVES[self.curve_id.value].p, self.curve_id, self.iso_point, ) def to_pyfelt_list(self) -> list[PyFelt]: field = get_base_field(self.curve_id.value) return [field(self.x), field(self.y)] def serialize_to_cairo(self, name: str, raw: bool = False) -> str: import garaga.modulo_circuit_structs as structs return structs.G1PointCircuit(name=name, elmts=self.to_pyfelt_list()).serialize( raw ) @dataclass(frozen=True) class G2Point: """ Represents a point on G2, the group of rational points on an elliptic curve over an extension field. """ x: tuple[int, int] y: tuple[int, int] curve_id: CurveID def __repr__(self): return f"G2Point({hex(self.x[0])}, {hex(self.x[1])}, {hex(self.y[0])}, {hex(self.y[1])}, {self.curve_id})" def __post_init__(self): assert isinstance(CURVES[self.curve_id.value], PairingCurve) if self.is_infinity(): return if not self.is_on_curve(): raise ValueError(f"G2 Point is not on the curve {self.curve_id}") @staticmethod def infinity(curve_id: CurveID) -> "G2Point": return G2Point((0, 0), (0, 0), curve_id) def __eq__(self, other: "G2Point") -> bool: return ( self.x[0] == other.x[0] and self.x[1] == other.x[1] and self.y[0] == other.y[0] and self.y[1] == other.y[1] and self.curve_id == other.curve_id ) def is_infinity(self) -> bool: return self.x == (0, 0) and self.y == (0, 0) def is_on_curve(self) -> bool: """ Check if the point is on the curve using the curve equation y^2 = x^3 + ax + b in the extension field. """ from garaga.hints.tower_backup import E2 curve = CURVES[self.curve_id.value] assert isinstance(curve, PairingCurve) a = curve.a p = curve.p b = E2(curve.b20, curve.b21, p) y = E2(*self.y, p) x = E2(*self.x, p) return y**2 == x**3 + a * x + b @staticmethod def gen_random_point(curve_id: CurveID) -> "G2Point": """ Generates a random point on a given curve. """ from garaga import garaga_rs curve = CURVES[curve_id.value] assert isinstance(curve, PairingCurve) scalar = random.randint(1, curve.n - 1) a = (curve.G2x[0], curve.G2x[1], curve.G2y[0], curve.G2y[1]) b = garaga_rs.g2_scalar_mul(curve_id.value, a, scalar) return G2Point((b[0], b[1]), (b[2], b[3]), curve_id) def is_in_prime_order_subgroup_generic(self) -> bool: return self.scalar_mul(CURVES[self.curve_id.value].n).is_infinity() def is_in_prime_order_subgroup(self) -> bool: if CURVES[self.curve_id.value].h == 1: # Cofactor is 1 : points on the curve <=> points in the prime order subgroup return self.is_on_curve() or self.is_infinity() else: if self.curve_id == CurveID.BLS12_381: # https://github.com/Consensys/gnark/blob/9ed0eab21e8935cb180d1f75713cd2c29c91a3c9/std/algebra/emulated/sw_bls12381/g2.go field = get_base_field(self.curve_id.value) seed_Q = self.scalar_mul( -CURVES[self.curve_id.value].x ) # Note the negative sign. u1 = 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAD v = Fp2( field( 0x135203E60180A68EE2E9C448D77A2CD91C3DEDD930B1CF60EF396489F61EB45E304466CF3E67FA0AF1EE7B04121BDEA2 ), field( 0x6AF0E0437FF400B6831E36D6BD17FFE48395DABC2D3435E77F76E17009241C5EE67992F72EC05F4C81084FBEDE3CC09 ), ) psi_Qx = ( (field(self.x[1]) * u1).value, (field(self.x[0]) * u1).value, ) # Note the reversal of x and y psi_Qy = Fp2(field(self.y[0]), -field(self.y[1])) * v psi_Qy = (psi_Qy.a0.value, psi_Qy.a1.value) psi_Q = G2Point(psi_Qx, psi_Qy, self.curve_id) # [r]Q == 0 <==> ψ(Q) == [x₀]Q <=> ψ(Q) + [-x₀]Q = 0 return psi_Q.add(seed_Q).is_infinity() else: return self.is_in_prime_order_subgroup_generic() @staticmethod def gen_random_point_not_in_subgroup( curve_id: CurveID, force_gen: bool = False ) -> "G2Point": """ Generates a random point not in the prime order subgroup. Args: curve_id (CurveID): The identifier of the elliptic curve. force_gen (bool): Force generation even if the cofactor is 1. Returns: G2Point: A random point not in the prime order subgroup. Raises: ValueError: If the cofactor is 1 and force_gen is False. """ curve_idx = curve_id.value if CURVES[curve_idx].h == 1: if force_gen: return G2Point.gen_random_point(curve_id) else: raise ValueError( "Cofactor is 1, cannot generate a point not in the subgroup" ) else: field = get_base_field(curve_idx) while True: x = field.random() y2 = x**3 + CURVES[curve_idx].a * x + CURVES[curve_idx].b try: tentative_point = G1Point(x.value, y2.sqrt().value, curve_id) except ValueError: continue if not tentative_point.is_in_prime_order_subgroup_generic(): return tentative_point @staticmethod def get_nG(curve_id: CurveID, n: int) -> "G2Point": """ Returns the scalar multiplication of the generator point on a given curve by the scalar n. """ from garaga import garaga_rs assert ( n < CURVES[curve_id.value].n ), "n must be less than the order of the curve" if curve_id.value in GARAGA_RS_SUPPORTED_CURVES: curve = CURVES[curve_id.value] a = (curve.G2x[0], curve.G2x[1], curve.G2y[0], curve.G2y[1]) b = garaga_rs.g2_scalar_mul(curve_id.value, a, n) return G2Point((b[0], b[1]), (b[2], b[3]), curve_id) else: raise NotImplementedError( "G2Point.get_nG is not implemented for this curve" ) def scalar_mul(self, scalar: int) -> "G2Point": if self.is_infinity(): return self if scalar == 0: return G2Point((0, 0), (0, 0), self.curve_id) if scalar < 0: return -self.scalar_mul(-scalar) if self.curve_id.value in GARAGA_RS_SUPPORTED_CURVES: from garaga import garaga_rs a = (self.x[0], self.x[1], self.y[0], self.y[1]) b = garaga_rs.g2_scalar_mul(self.curve_id.value, a, scalar) return G2Point((b[0], b[1]), (b[2], b[3]), self.curve_id) else: raise NotImplementedError( "G2Point.scalar_mul is not implemented for this curve" ) def add(self, other: "G2Point") -> "G2Point": if self.is_infinity(): return other if other.is_infinity(): return self if self.curve_id != other.curve_id: raise ValueError("Points are not on the same curve") if self.curve_id.value in GARAGA_RS_SUPPORTED_CURVES: from garaga import garaga_rs a = (self.x[0], self.x[1], self.y[0], self.y[1]) b = (other.x[0], other.x[1], other.y[0], other.y[1]) c = garaga_rs.g2_add(self.curve_id.value, a, b) return G2Point((c[0], c[1]), (c[2], c[3]), self.curve_id) else: raise NotImplementedError("G2Point.add is not implemented for this curve") def __neg__(self) -> "G2Point": p = CURVES[self.curve_id.value].p return G2Point( (self.x[0], self.x[1]), (-self.y[0] % p, -self.y[1] % p), self.curve_id ) @staticmethod def msm(points: list["G2Point"], scalars: list[int]) -> "G2Point": assert all(isinstance(p, G2Point) for p in points) assert len(points) == len(scalars) muls = [P.scalar_mul(s) for P, s in zip(points, scalars)] scalar_mul = functools.reduce(lambda acc, p: acc.add(p), muls) return scalar_mul def to_pyfelt_list(self) -> list[PyFelt]: field = get_base_field(self.curve_id.value) return [field(x) for x in self.x + self.y] def serialize_to_cairo(self, name: str, raw: bool = False) -> str: import garaga.modulo_circuit_structs as structs return structs.G2PointCircuit(name=name, elmts=self.to_pyfelt_list()).serialize( raw ) @dataclass(slots=True) class G1G2Pair: p: G1Point q: G2Point curve_id: CurveID = None def __hash__(self): return hash((self.p, self.q, self.curve_id)) def __post_init__(self): if self.p.curve_id != self.q.curve_id: raise ValueError("Points are not on the same curve") self.curve_id = self.p.curve_id def to_pyfelt_list(self) -> list[PyFelt]: field = get_base_field(self.curve_id.value) return [ field(x) for x in [ self.p.x, self.p.y, self.q.x[0], self.q.x[1], self.q.y[0], self.q.y[1], ] ] @staticmethod def pair(pairs: list["G1G2Pair"], curve_id: CurveID = None): from garaga.hints.tower_backup import E12 # avoids cycle if curve_id is None: if len(pairs) == 0: raise ValueError("Unspecified curve") curve_id = pairs[0].curve_id if curve_id.value in GARAGA_RS_SUPPORTED_CURVES: from garaga import garaga_rs args = [] for pair in pairs: if pair.curve_id != curve_id: raise ValueError("Pairs are not on the same curve") args.append(pair.p.x) args.append(pair.p.y) args.append(pair.q.x[0]) args.append(pair.q.x[1]) args.append(pair.q.y[0]) args.append(pair.q.y[1]) res = garaga_rs.multi_pairing(curve_id.value, args) return E12(res, curve_id.value) else: raise NotImplementedError("G1G2Pair.pair is not implemented for this curve") @staticmethod def miller(pairs: list["G1G2Pair"], curve_id: CurveID = None): from garaga.hints.tower_backup import E12 # avoids cycle if curve_id is None: if len(pairs) == 0: raise ValueError("Unspecified curve") curve_id = pairs[0].curve_id if curve_id.value in GARAGA_RS_SUPPORTED_CURVES: from garaga import garaga_rs args = [] for pair in pairs: if pair.curve_id != curve_id: raise ValueError("Pairs are not on the same curve") args.append(pair.p.x) args.append(pair.p.y) args.append(pair.q.x[0]) args.append(pair.q.x[1]) args.append(pair.q.y[0]) args.append(pair.q.y[1]) res = garaga_rs.multi_miller_loop(curve_id.value, args) return E12(res, curve_id.value) else: raise NotImplementedError( "G1G2Pair.miller is not implemented for this curve" ) # v^6 - 18v^3 + 82 # w^12 - 18w^6 + 82 # v^6 - 2v^3 + 2 # w^12 - 2w^6 + 2 def tower_to_direct( X: list[PyFelt], curve_id: int, extension_degree: int ) -> list[PyFelt]: """ Convert Tower to Direct extension field representation: T(u,v) = t0+t1u + (t2+t3u)v + (t4+t5u)v^2 D(v) = d0+d1v+d2v^2+d3v^3+d4v^4+d5v^5 Only tested with BN254 and BLS12_381 6th and 12th towers defined in this file. They were computed by hand then abstracted away with no guarantee of genericity under different tower constructions. """ assert len(X) == extension_degree and isinstance( X[0], PyFelt ), f"len(X)={len(X)}, type(X[0])={type(X[0])}" if extension_degree == 2: return X if extension_degree == 6: return TD6(X, curve_id) elif extension_degree == 12: return TD12(X, curve_id) else: raise ValueError(f"Unsupported extension degree {extension_degree}") def direct_to_tower( X: list[PyFelt | ModuloCircuitElement], curve_id: int, extension_degree: int ) -> list[PyFelt]: """ Convert Direct to Tower extension field representation: Input : D(v) = d0+d1v+d2v^2+d3v^3+d4v^4+d5v^5 Output: T(u,v) = t0+t1u + (t2+t3u)v + (t4+t5u)v^2 Only tested with BN254 and BLS12_381 6th and 12th towers defined in this file. They were computed by hand then abstracted away with no guarantee of genericity under different tower constructions. """ assert len(X) == extension_degree and isinstance( X[0], (PyFelt, ModuloCircuitElement) ), f"{type(X[0])}, len(X)={len(X)}" X = [x.felt for x in X] if extension_degree == 2: return X if extension_degree == 6: return DT6(X, curve_id) elif extension_degree == 12: return DT12(X, curve_id) else: raise ValueError(f"Unsupported extension degree {extension_degree}") def TD6(X: list[PyFelt], curve_id: int) -> list[PyFelt]: curve = CURVES[curve_id] assert isinstance(curve, PairingCurve) nr_a0 = curve.nr_a0 return [ X[0] - nr_a0 * X[1], X[2] - nr_a0 * X[3], X[4] - nr_a0 * X[5], X[1], X[3], X[5], ] def DT6(X: list[PyFelt], curve_id: int) -> list[PyFelt]: curve = CURVES[curve_id] assert isinstance(curve, PairingCurve) nr_a0 = curve.nr_a0 return [ X[0] + nr_a0 * X[3], X[3], X[1] + nr_a0 * X[4], X[4], X[2] + nr_a0 * X[5], X[5], ] def TD12(X: list[PyFelt], curve_id: int) -> list[PyFelt]: curve = CURVES[curve_id] assert isinstance(curve, PairingCurve) nr_a0 = curve.nr_a0 return [ X[0] - nr_a0 * X[1], X[6] - nr_a0 * X[7], X[2] - nr_a0 * X[3], X[8] - nr_a0 * X[9], X[4] - nr_a0 * X[5], X[10] - nr_a0 * X[11], X[1], X[7], X[3], X[9], X[5], X[11], ] def DT12(X: list[PyFelt], curve_id: int) -> list[PyFelt]: X += (12 - len(X)) * [0] curve = CURVES[curve_id] assert isinstance(curve, PairingCurve) nr_a0 = curve.nr_a0 return [ X[0] + nr_a0 * X[6], X[6], X[2] + nr_a0 * X[8], X[8], X[4] + nr_a0 * X[10], X[10], X[1] + nr_a0 * X[7], X[7], X[3] + nr_a0 * X[9], X[9], X[5] + nr_a0 * X[11], X[11], ] def precompute_lineline_sparsity(curve_id: int): curve = CURVES[curve_id] assert isinstance(curve, PairingCurve) field = get_base_field(curve_id) line_sparsity = curve.line_function_sparsity line = Polynomial([field(x) for x in line_sparsity]) ll = line * line % get_irreducible_poly(curve_id, 12) ll_sparsity = get_sparsity(ll.coefficients) return ll_sparsity[0:12] ================================================ FILE: hydra/garaga/poseidon_transcript.py ================================================ from typing import Iterable from garaga import garaga_rs from garaga.algebra import ModuloCircuitElement, PyFelt from garaga.curves import BASE, N_LIMBS, STARK from garaga.hints.io import bigint_split def hades_permutation(s0: int, s1: int, s2: int) -> tuple[int, int, int]: r0, r1, r2 = garaga_rs.hades_permutation( (s0 % STARK).to_bytes(32, "big"), (s1 % STARK).to_bytes(32, "big"), (s2 % STARK).to_bytes(32, "big"), ) return ( int.from_bytes(r0, "big"), int.from_bytes(r1, "big"), int.from_bytes(r2, "big"), ) class CairoPoseidonTranscript: """ The CairoPoseidonTranscript class mimics the behaviour of the Cairo functions hashing an array of u384 elements. """ def __init__(self, init_hash: int, three_limbs_only: bool = False) -> None: self.init_hash = init_hash self.s0, self.s1, self.s2 = hades_permutation( 0, 0, init_hash, ) self.permutations_count = 1 self.poseidon_ptr_indexes = [] self.z = None self.three_limbs_only = three_limbs_only @property def continuable_hash(self) -> int: return self.s0 @property def RLC_coeff(self): """ A function to retrieve the random linear combination coefficient after a permutation. Stores the index of the last permutation in the poseidon_ptr_indexes list, to be used to retrieve RLC coefficients later. """ self.poseidon_ptr_indexes.append(self.permutations_count - 1) return self.s1 def update_sponge_state(self, x, y): self.s0, self.s1, self.s2 = hades_permutation(self.s0 + x, self.s1 + y, self.s2) def hash_element(self, x: PyFelt | ModuloCircuitElement, debug: bool = False): # print(f"Will Hash PYTHON {hex(x.value)}") limbs = bigint_split(x, N_LIMBS, BASE) if debug: print(f"limbs : {limbs}") self.s0, self.s1, self.s2 = hades_permutation( self.s0 + limbs[0] + (BASE) * limbs[1], self.s1 + limbs[2] + (BASE) * limbs[3], self.s2, ) self.permutations_count += 1 return self.s0, self.s1 def hash_quadruple_u288( self, x: Iterable[PyFelt | ModuloCircuitElement], debug: bool = False ): assert len(x) == 4 x = [bigint_split(xi, 3, BASE) for xi in x] self.s0, self.s1, self.s2 = hades_permutation( self.s0 + x[0][0] + (BASE) * x[0][1], self.s1 + x[0][2] + (BASE) * x[1][0], self.s2, ) self.s0, self.s1, self.s2 = hades_permutation( self.s0 + x[1][1] + (BASE) * x[1][2], self.s1 + x[2][0] + (BASE) * x[2][1], self.s2, ) self.s0, self.s1, self.s2 = hades_permutation( self.s0 + x[2][2] + (BASE) * x[3][0], self.s1 + x[3][1] + (BASE) * x[3][2], self.s2, ) self.permutations_count += 3 return self.s0, self.s1 def hash_u256(self, x: PyFelt | int): assert isinstance(x, (PyFelt, int)) if isinstance(x, PyFelt): x = x.value assert 0 <= x < 2**256 low, high = bigint_split(x, 2, 2**128) self.s0, self.s1, self.s2 = hades_permutation( self.s0 + low, self.s1 + high, self.s2 ) self.permutations_count += 1 return self.s0 def hash_u128(self, x: PyFelt | int): assert isinstance(x, (PyFelt, int)) if isinstance(x, PyFelt): x = x.value assert 0 <= x < 2**128 self.s0, self.s1, self.s2 = hades_permutation(self.s0 + x, self.s1, self.s2) self.permutations_count += 1 return self.s0 def hash_u256_multi(self, X: list[PyFelt | int]): for x in X: self.hash_u256(x) return self.s0 def hash_limbs_multi( self, X: list[PyFelt | ModuloCircuitElement], sparsity: list[int] | None = None, debug: bool = False, three_limbs_only: bool = None, ): if three_limbs_only in [True, False]: three_limbs_only = three_limbs_only else: three_limbs_only = self.three_limbs_only if sparsity: X = [x for i, x in enumerate(X) if sparsity[i] != 0] if not three_limbs_only: for X_elem in X: if debug: print(f"\t s0 : {self.s0}") self.hash_element(X_elem, debug=debug) else: n_quadruples, rest = divmod(len(X), 4) for i in range(n_quadruples): self.hash_quadruple_u288(X[i * 4 : (i + 1) * 4], debug=debug) for i in range(rest): self.hash_element(X[n_quadruples * 4 + i], debug=debug) return None if __name__ == "__main__": import random random.seed(0) def gen_cairo_test_vectors(n_elmts: int): elmts = [PyFelt(random.randint(0, 2**384 - 1), 2**384) for _ in range(n_elmts)] transcript = CairoPoseidonTranscript(init_hash=0) for elmt in elmts: transcript.hash_element(elmt) expected_res = transcript.continuable_hash code = f""" #[test] fn test_hash_u384_{n_elmts}() {{ """ code += "// Auto-generated from garaga/poseidon_transcript.py\n" code += "let transcript: Array = array![" for elmt in elmts: limbs = bigint_split(elmt.value, N_LIMBS, BASE) code += f"u384 {{ limb0: {limbs[0]}, limb1: {limbs[1]}, limb2: {limbs[2]}, limb3: {limbs[3]} }}," code += "];\n" code += f"let expected_res: felt252 = {expected_res};\n" code += "let res = hash_u384_transcript(transcript.span(), 0);\n" code += "assert_eq!(res, expected_res);\n" code += "}\n\n" return code print(gen_cairo_test_vectors(1)) print(gen_cairo_test_vectors(2)) print(gen_cairo_test_vectors(3)) ================================================ FILE: hydra/garaga/precompiled_circuits/all_circuits.py ================================================ from enum import Enum from pathlib import Path from garaga.curves import CurveID from garaga.precompiled_circuits.compilable_circuits.apply_isogeny import ( ApplyIsogenyCircuit, ) from garaga.precompiled_circuits.compilable_circuits.base import ( cairo1_tests_header, collect_struct_dependencies, compilation_mode_to_file_header, compile_circuit, create_cairo1_test, format_cairo_files_in_parallel, ) from garaga.precompiled_circuits.compilable_circuits.cairo1_mpcheck_circuits import ( EvalE12D, FixedG2MPCheckBit0, FixedG2MPCheckBit00, FixedG2MPCheckBit1, FixedG2MPCheckBit01, FixedG2MPCheckBit10, FixedG2MPCheckInitBit, InitializeMPCheck, MPCheckFinalizeBLS, MPCheckFinalizeBN, MPCheckPreparePairs, ) from garaga.precompiled_circuits.compilable_circuits.cairo1_tower_pairing import ( E12TCyclotomicSquareCircuit, E12TCyclotomicSquareCompressedCircuit, E12TDecompressKarabinaPtIICircuit, E12TDecompressKarabinaPtINZCircuit, E12TDecompressKarabinaPtIZCircuit, E12TFrobeniusCircuit, E12TFrobeniusCubeCircuit, E12TFrobeniusSquareCircuit, E12TInverseCircuit, E12TMulCircuit, FP6NegCircuit, TowerMillerBit0, TowerMillerBit1, TowerMillerFinalizeBN, TowerMillerInitBit, ) from garaga.precompiled_circuits.compilable_circuits.common_cairo_fustat_circuits import ( AddECPointCircuit, AddECPointsG2Circuit, ClearCofactorBLS12_381Circuit, DoubleAndAddECPointsG2Circuit, DoubleECPointCircuit, DoubleECPointG2AEq0Circuit, DummyCircuit, IsOnCurveG1Circuit, IsOnCurveG1G2Circuit, IsOnCurveG2Circuit, PrepareFakeGLVPtsCircuit, PrepareGLVFakeGLVPtsCircuit, PsiG2BLS12_381Circuit, QuadrupleAndAdd9Circuit, ) from garaga.precompiled_circuits.compilable_circuits.rsa import ( RSAFullVerificationCircuit, ) from garaga.starknet.cli.utils import create_directory STARKNET_DIR = Path(__file__).parent.parent / "starknet" class CircuitID(Enum): DUMMY = int.from_bytes(b"dummy", "big") FP12_MUL = int.from_bytes(b"fp12_mul", "big") FP12_SUB = int.from_bytes(b"fp12_sub", "big") FINAL_EXP_PART_1 = int.from_bytes(b"final_exp_part_1", "big") FINAL_EXP_PART_2 = int.from_bytes(b"final_exp_part_2", "big") MULTI_MILLER_LOOP = int.from_bytes(b"multi_miller_loop", "big") MULTI_PAIRING_CHECK = int.from_bytes(b"multi_pairing_check", "big") IS_ON_CURVE_G1_G2 = int.from_bytes(b"is_on_curve_g1_g2", "big") IS_ON_CURVE_G1 = int.from_bytes(b"is_on_curve_g1", "big") IS_ON_CURVE_G2 = int.from_bytes(b"is_on_curve_g2", "big") CLEAR_COFACTOR_BLS12_381 = int.from_bytes(b"clear_cofactor_bls12_381", "big") ADD_EC_POINT = int.from_bytes(b"add_ec_point", "big") DOUBLE_EC_POINT = int.from_bytes(b"double_ec_point", "big") PREPARE_GLV_FAKE_GLV_PTS = int.from_bytes(b"prepare_glv_fake_glv_pts", "big") PREPARE_FAKE_GLV_PTS = int.from_bytes(b"prepare_fake_glv_pts", "big") QUADRUPLE_AND_ADD_9 = int.from_bytes(b"quadruple_and_add_9", "big") MP_CHECK_BIT0_LOOP = int.from_bytes(b"mp_check_bit0_loop", "big") MP_CHECK_BIT00_LOOP = int.from_bytes(b"mp_check_bit00_loop", "big") MP_CHECK_BIT1_LOOP = int.from_bytes(b"mp_check_bit1_loop", "big") MP_CHECK_BIT01_LOOP = int.from_bytes(b"mp_check_bit01_loop", "big") MP_CHECK_BIT10_LOOP = int.from_bytes(b"mp_check_bit10_loop", "big") MP_CHECK_PREPARE_PAIRS = int.from_bytes(b"mp_check_prepare_pairs", "big") MP_CHECK_INITIALIZE = int.from_bytes(b"mp_check_initialize", "big") MP_CHECK_INIT_BIT = int.from_bytes(b"mp_check_init_bit", "big") MP_CHECK_FINALIZE_BN = int.from_bytes(b"mp_check_finalize_bn", "big") MP_CHECK_FINALIZE_BLS = int.from_bytes(b"mp_check_finalize_bls", "big") FP12_MUL_ASSERT_ONE = int.from_bytes(b"fp12_mul_assert_one", "big") EVAL_E12D = int.from_bytes(b"eval_e12d", "big") APPLY_ISOGENY = int.from_bytes(b"apply_isogeny", "big") HONK_SUMCHECK_CIRCUIT = int.from_bytes(b"honk_sumcheck_circuit", "big") HONK_PREPARE_SCALARS_CIRCUIT = int.from_bytes( b"honk_prepare_scalars_circuit", "big" ) TOWER_MILLER_BIT0 = int.from_bytes(b"tower_miller_bit0", "big") TOWER_MILLER_BIT1 = int.from_bytes(b"tower_miller_bit1", "big") TOWER_MILLER_INIT_BIT = int.from_bytes(b"tower_miller_init_bit", "big") TOWER_MILLER_FINALIZE_BN = int.from_bytes(b"tower_miller_finalize_bn", "big") E12T_MUL = int.from_bytes(b"e12t_mul", "big") E12T_CYCLOTOMIC_SQUARE = int.from_bytes(b"e12t_cyclotomic_square", "big") E12T_FROBENIUS_SQUARE = int.from_bytes(b"e12t_frobenius_square", "big") FP6_NEG = int.from_bytes(b"fp6_neg", "big") E12T_INVERSE = int.from_bytes(b"e12t_inverse", "big") E12T_FROBENIUS = int.from_bytes(b"e12t_frobenius", "big") E12T_FROBENIUS_CUBE = int.from_bytes(b"e12t_frobenius_cube", "big") E12T_CYCLOTOMIC_SQUARE_COMPRESSED = int.from_bytes( b"e12t_cyclotomic_square_compressed", "big" ) E12T_DECOMPRESS_KARABINA_PT_INZ = int.from_bytes( b"e12t_decompress_karabina_pt_inz", "big" ) E12T_DECOMPRESS_KARABINA_PT_IZ = int.from_bytes( b"e12t_decompress_karabina_pt_iz", "big" ) E12T_DECOMPRESS_KARABINA_PT_II = int.from_bytes( b"e12t_decompress_karabina_pt_ii", "big" ) ADD_EC_POINT_G2 = int.from_bytes(b"add_ec_point_g2", "big") DOUBLE_EC_POINT_G2 = int.from_bytes(b"double_ec_point_g2", "big") DOUBLE_AND_ADD_EC_POINT_G2 = int.from_bytes(b"double_and_add_ec_point_g2", "big") PSI_G2_BLS12_381 = int.from_bytes(b"psi_g2_bls12_381", "big") FULL_ECIP_BATCHED = int.from_bytes(b"full_ecip__batched", "big") RSA_FULL_VERIFICATION = int.from_bytes(b"rsa_full_verif", "big") ALL_CAIRO_CIRCUITS = { CircuitID.DUMMY: {"class": DummyCircuit, "params": None, "filename": "dummy"}, CircuitID.IS_ON_CURVE_G1_G2: { "class": IsOnCurveG1G2Circuit, "params": None, "filename": "ec", }, CircuitID.IS_ON_CURVE_G1: { "class": IsOnCurveG1Circuit, "params": None, "filename": "ec", }, CircuitID.IS_ON_CURVE_G2: { "class": IsOnCurveG2Circuit, "params": None, "filename": "ec", }, CircuitID.CLEAR_COFACTOR_BLS12_381: { "class": ClearCofactorBLS12_381Circuit, "params": None, "filename": "ec", "curve_ids": [CurveID.BLS12_381], }, CircuitID.ADD_EC_POINT: { "class": AddECPointCircuit, "params": None, "filename": "ec", }, CircuitID.DOUBLE_EC_POINT: { "class": DoubleECPointCircuit, "params": None, "filename": "ec", }, CircuitID.PREPARE_GLV_FAKE_GLV_PTS: { "class": PrepareGLVFakeGLVPtsCircuit, "params": None, "filename": "ec", }, CircuitID.PREPARE_FAKE_GLV_PTS: { "class": PrepareFakeGLVPtsCircuit, "params": None, "filename": "ec", }, CircuitID.QUADRUPLE_AND_ADD_9: { "class": QuadrupleAndAdd9Circuit, "params": None, "filename": "ec", }, CircuitID.ADD_EC_POINT_G2: { "class": AddECPointsG2Circuit, "params": None, "filename": "ec", }, CircuitID.DOUBLE_EC_POINT_G2: { "class": DoubleECPointG2AEq0Circuit, "params": None, "filename": "ec", }, CircuitID.DOUBLE_AND_ADD_EC_POINT_G2: { "class": DoubleAndAddECPointsG2Circuit, "params": None, "filename": "ec", }, CircuitID.PSI_G2_BLS12_381: { "class": PsiG2BLS12_381Circuit, "params": None, "filename": "ec", "curve_ids": [CurveID.BLS12_381], }, CircuitID.RSA_FULL_VERIFICATION: { "class": RSAFullVerificationCircuit, "params": None, "filename": "rsa", "curve_ids": [CurveID.BLS12_381], }, CircuitID.MP_CHECK_BIT0_LOOP: { "class": FixedG2MPCheckBit0, "params": [ {"n_pairs": 2, "n_fixed_g2": 2}, # BLS SIG / KZG Verif {"n_pairs": 3, "n_fixed_g2": 2}, # Groth16 ], "filename": "multi_pairing_check", "curve_ids": [CurveID.BLS12_381], }, CircuitID.MP_CHECK_BIT00_LOOP: { "class": FixedG2MPCheckBit00, "params": [ {"n_pairs": 2, "n_fixed_g2": 2}, # BLS SIG / KZG Verif {"n_pairs": 3, "n_fixed_g2": 2}, # Groth16 ], "filename": "multi_pairing_check", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.MP_CHECK_BIT1_LOOP: { "class": FixedG2MPCheckBit1, "params": [ {"n_pairs": 2, "n_fixed_g2": 2}, # BLS SIG / KZG Verif {"n_pairs": 3, "n_fixed_g2": 2}, # Groth16 ], "filename": "multi_pairing_check", "curve_ids": [CurveID.BLS12_381], }, CircuitID.MP_CHECK_BIT01_LOOP: { "class": FixedG2MPCheckBit01, "params": [ {"n_pairs": 2, "n_fixed_g2": 2}, # BLS SIG / KZG Verif {"n_pairs": 3, "n_fixed_g2": 2}, # Groth16 ], "filename": "multi_pairing_check", "curve_ids": [CurveID.BN254], }, CircuitID.MP_CHECK_BIT10_LOOP: { "class": FixedG2MPCheckBit10, "params": [ {"n_pairs": 2, "n_fixed_g2": 2}, # BLS SIG / KZG Verif {"n_pairs": 3, "n_fixed_g2": 2}, # Groth16 ], "filename": "multi_pairing_check", "curve_ids": [CurveID.BN254], }, CircuitID.MP_CHECK_PREPARE_PAIRS: { "class": MPCheckPreparePairs, "params": [{"n_pairs": k} for k in [1, 2, 3]], "filename": "multi_pairing_check", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.MP_CHECK_INITIALIZE: { "class": InitializeMPCheck, "params": [ {"extra_miller_loop_result": False}, {"extra_miller_loop_result": True}, ], "filename": "multi_pairing_check", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.MP_CHECK_INIT_BIT: { "class": FixedG2MPCheckInitBit, "params": [ {"n_pairs": 2, "n_fixed_g2": 2}, # BLS SIG / KZG Verif {"n_pairs": 3, "n_fixed_g2": 2}, # Groth16 ], "filename": "multi_pairing_check", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.MP_CHECK_FINALIZE_BN: { "class": MPCheckFinalizeBN, "params": [ { "n_pairs": 2, "n_fixed_g2": 2, "extra_miller_loop_result": False, }, # BLS SIG / KZG Verif { "n_pairs": 3, "n_fixed_g2": 2, "extra_miller_loop_result": True, }, # Groth16 ], "filename": "multi_pairing_check", "curve_ids": [CurveID.BN254], }, CircuitID.MP_CHECK_FINALIZE_BLS: { "class": MPCheckFinalizeBLS, "params": [ {"n_pairs": 2, "extra_miller_loop_result": False}, {"n_pairs": 3, "extra_miller_loop_result": True}, ], "filename": "multi_pairing_check", "curve_ids": [CurveID.BLS12_381], }, CircuitID.EVAL_E12D: { "class": EvalE12D, "params": None, "filename": "extf_mul", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.APPLY_ISOGENY: { "class": ApplyIsogenyCircuit, "params": None, "filename": "isogeny", "curve_ids": [CurveID.BLS12_381], }, CircuitID.TOWER_MILLER_BIT0: { "class": TowerMillerBit0, "params": [{"n_pairs": k} for k in [1]], "filename": "tower_circuits", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.TOWER_MILLER_BIT1: { "class": TowerMillerBit1, "params": [{"n_pairs": k} for k in [1]], "filename": "tower_circuits", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.TOWER_MILLER_INIT_BIT: { "class": TowerMillerInitBit, "params": [{"n_pairs": k} for k in [1]], "filename": "tower_circuits", "curve_ids": [CurveID.BLS12_381], }, CircuitID.TOWER_MILLER_FINALIZE_BN: { "class": TowerMillerFinalizeBN, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BN254], }, CircuitID.E12T_MUL: { "class": E12TMulCircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.E12T_CYCLOTOMIC_SQUARE: { "class": E12TCyclotomicSquareCircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.E12T_FROBENIUS_SQUARE: { "class": E12TFrobeniusSquareCircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.FP6_NEG: { "class": FP6NegCircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.E12T_INVERSE: { "class": E12TInverseCircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.E12T_FROBENIUS: { "class": E12TFrobeniusCircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.E12T_FROBENIUS_CUBE: { "class": E12TFrobeniusCubeCircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BN254, CurveID.BLS12_381], }, CircuitID.E12T_CYCLOTOMIC_SQUARE_COMPRESSED: { "class": E12TCyclotomicSquareCompressedCircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BLS12_381], }, CircuitID.E12T_DECOMPRESS_KARABINA_PT_INZ: { "class": E12TDecompressKarabinaPtINZCircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BLS12_381], }, CircuitID.E12T_DECOMPRESS_KARABINA_PT_IZ: { "class": E12TDecompressKarabinaPtIZCircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BLS12_381], }, CircuitID.E12T_DECOMPRESS_KARABINA_PT_II: { "class": E12TDecompressKarabinaPtIICircuit, "params": None, "filename": "tower_circuits", "curve_ids": [CurveID.BLS12_381], }, # CircuitID.HONK_SUMCHECK_CIRCUIT: { # "class": SumCheckCircuit, # "params": [ # { # "vk": HonkVk.from_bytes( # open( # f"{STARKNET_DIR}/honk_contract_generator/examples/vk_ultra_keccak.bin", # "rb", # ).read() # ) # } # ], # "filename": "honk_circuits", # "curve_ids": [CurveID.GRUMPKIN], # }, # CircuitID.HONK_PREPARE_SCALARS_CIRCUIT: { # "class": PrepareScalarsCircuit, # "params": [ # { # "vk": HonkVk.from_bytes( # open( # f"{STARKNET_DIR}/honk_contract_generator/examples/vk_ultra_keccak.bin", # "rb", # ).read() # ) # } # ], # "filename": "honk_circuits", # "curve_ids": [CurveID.GRUMPKIN], # }, # CircuitID.FULL_ECIP_BATCHED: { # "class": FullECIPCircuitBatched, # "params": [{"n_points": k} for k in [1]], # "filename": "ec_batched", # "curve_ids": [CurveID.BN254], # }, } def initialize_compilation( PRECOMPILED_CIRCUITS_DIR: str, CIRCUITS_TO_COMPILE: dict ) -> tuple[ set[str], dict[str, set[str]], dict[str, set[str]], dict[str, set[str]], dict[str, open], ]: """ Initialize the compilation process by creating the necessary directories and files. Returns : - filenames_used: set of all filenames that will be used - codes: dict of sets of strings, where each set contains the compiled circuits for a given filename - cairo1_tests_functions: dict of sets of strings, where each set contains the cairo1 tests for a given filename - cairo1_full_function_names: dict of sets of strings, where each set contains the full function names for a given filename - files: dict of open files, where each file is for a given filename """ create_directory(PRECOMPILED_CIRCUITS_DIR) filenames_used = set([v["filename"] for v in CIRCUITS_TO_COMPILE.values()]) codes = {filename: set() for filename in filenames_used} cairo1_tests_functions = {filename: set() for filename in filenames_used} cairo1_full_function_names = {filename: set() for filename in filenames_used} files = { f: open(f"{PRECOMPILED_CIRCUITS_DIR}{f}.cairo", "w") for f in filenames_used } return ( filenames_used, codes, cairo1_tests_functions, cairo1_full_function_names, files, ) def write_headers( files: dict[str, open], compilation_mode: int, output_sizes_exceeding_limit: dict[str, set[int]], file_curve_ids: dict[str, set[CurveID]], file_struct_dependencies: dict[str, set[str]], ) -> None: """ Write the header to the files. Add a specific header if max output length exceeds the limit. """ for filename, curve_ids in file_curve_ids.items(): required_structs = file_struct_dependencies.get(filename, set()) HEADER = compilation_mode_to_file_header( compilation_mode, curve_ids, required_structs ) files[filename].write(HEADER) TEMPLATE = """ impl CircuitDefinition{num_outputs}< {elements} > of core::circuit::CircuitDefinition< ( {ce_elements} ) > {{ type CircuitType = core::circuit::Circuit< ({elements_tuple},) >; }} impl MyDrp_{num_outputs}< {elements} > of Drop< ( {ce_elements} ) >; """ for filename, file in files.items(): # Then write the template for each unique output size exceeding the limit for num_outputs in sorted(output_sizes_exceeding_limit[filename]): elements = ", ".join(f"E{i}" for i in range(num_outputs)) ce_elements = ", ".join(f"CE" for i in range(num_outputs)) elements_tuple = ", ".join(f"E{i}" for i in range(num_outputs)) file.write( TEMPLATE.format( num_outputs=num_outputs, elements=elements, ce_elements=ce_elements, elements_tuple=elements_tuple, ) ) def compile_circuits( CIRCUITS_TO_COMPILE: dict, compilation_mode: int, codes: dict[str, set[str]], cairo1_full_function_names: dict[str, set[str]], cairo1_tests_functions: dict[str, set[str]], output_sizes_exceeding_limit: dict[str, set[int]], file_struct_dependencies: dict[str, set[str]], limit: int, ) -> None: """ Compile the circuits and write them to the files. """ for circuit_id, circuit_info in CIRCUITS_TO_COMPILE.items(): for curve_id in circuit_info.get( "curve_ids", [CurveID.BN254, CurveID.BLS12_381] ): filename_key = circuit_info["filename"] compiled_circuits, full_function_names, circuit_instances = compile_circuit( curve_id, circuit_info["class"], circuit_info["params"], compilation_mode, ) codes[filename_key].update(compiled_circuits) # Collect struct dependencies for this file if compilation_mode == 1 if compilation_mode == 1: struct_deps = collect_struct_dependencies(circuit_instances) if filename_key not in file_struct_dependencies: file_struct_dependencies[filename_key] = set() file_struct_dependencies[filename_key].update(struct_deps) for circuit_instance in circuit_instances: output_length = len(circuit_instance.circuit.output) if ( output_length > limit and circuit_instance.circuit.exact_output_refs_needed is None ): output_sizes_exceeding_limit[filename_key].add(output_length) if compilation_mode == 1: cairo1_full_function_names[filename_key].update(full_function_names) generate_cairo1_tests( circuit_instances, full_function_names, curve_id, cairo1_tests_functions, filename_key, ) def generate_cairo1_tests( circuit_instances, full_function_names, curve_id, cairo1_tests_functions, filename_key, ): for circuit_instance, full_function_name in zip( circuit_instances, full_function_names ): circuit_input = circuit_instance.full_input_cairo1 circuit_output = ( circuit_instance.circuit.output_structs if sum([len(x.elmts) for x in circuit_instance.circuit.output_structs]) == len(circuit_instance.circuit.output) else circuit_instance.circuit.output ) cairo1_tests_functions[filename_key].add( create_cairo1_test( full_function_name, circuit_input, circuit_output, curve_id.value, ) ) def write_compiled_circuits( files: dict[str, open], codes: dict[str, set[str]], cairo1_full_function_names: dict[str, set[str]], cairo1_tests_functions: dict[str, set[str]], compilation_mode: int, ) -> None: """ Write the compiled circuits and the cairo1 tests to the files. """ print("Writing circuits and selectors to .cairo files...") for filename, file in files.items(): for compiled_circuit in sorted(codes[filename]): file.write(compiled_circuit + "\n") # if compilation_mode == 1: # write_cairo1_tests( # file, filename, cairo1_full_function_names, cairo1_tests_functions # ) def write_cairo1_tests( file: open, filename: str, cairo1_full_function_names: dict[str, set[str]], cairo1_tests_functions: dict[str, set[str]], ) -> None: file.write(cairo1_tests_header() + "\n") fns_to_import = sorted(cairo1_full_function_names[filename]) if "" in fns_to_import: fns_to_import.remove("") file.write(f"use super::{{{','.join(fns_to_import)}}};\n") for cairo1_test in sorted(cairo1_tests_functions[filename]): file.write(cairo1_test + "\n") file.write("}\n") def main( PRECOMPILED_CIRCUITS_DIR: str, CIRCUITS_TO_COMPILE: dict[CircuitID, dict], compilation_mode: int = 1, ): """Compiles and writes all circuits to .cairo files""" filenames_used, codes, cairo1_tests_functions, cairo1_full_function_names, files = ( initialize_compilation(PRECOMPILED_CIRCUITS_DIR, CIRCUITS_TO_COMPILE) ) file_curve_ids = {filename: set() for filename in filenames_used} file_struct_dependencies = {filename: set() for filename in filenames_used} # Populate file_curve_ids with curve IDs for circuit_info in CIRCUITS_TO_COMPILE.values(): filename = circuit_info["filename"] curve_ids = circuit_info.get("curve_ids", [CurveID.BN254, CurveID.BLS12_381]) file_curve_ids[filename].update(curve_ids) output_sizes_exceeding_limit = {filename: set() for filename in filenames_used} limit = 16 compile_circuits( CIRCUITS_TO_COMPILE, compilation_mode, codes, cairo1_full_function_names, cairo1_tests_functions, output_sizes_exceeding_limit, file_struct_dependencies, limit, ) write_headers( files, compilation_mode, output_sizes_exceeding_limit, file_curve_ids, file_struct_dependencies, ) write_compiled_circuits( files, codes, cairo1_full_function_names, cairo1_tests_functions, compilation_mode, ) for file in files.values(): file.close() format_cairo_files_in_parallel( filenames_used, compilation_mode, PRECOMPILED_CIRCUITS_DIR ) return None if __name__ == "__main__": import random random.seed(0) print("Compiling Cairo 1 circuits...") main( PRECOMPILED_CIRCUITS_DIR="src/src/circuits/", CIRCUITS_TO_COMPILE=ALL_CAIRO_CIRCUITS, compilation_mode=1, ) ================================================ FILE: hydra/garaga/precompiled_circuits/cofactor_clearing.py ================================================ from garaga.algebra import ModuloCircuitElement from garaga.curves import CurveID from garaga.precompiled_circuits.ec import BasicEC, BasicECG2 class SlowG2CofactorClearing(BasicECG2): """ Implements cofactor clearing for G2 points on BLS12-381 curve. Based on Teku's implementation of BLS signatures. """ def h2_chain( self, P: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]] ): """ Addition chain for multiplication by the E2 cofactor. Reference implementation: https://github.com/Consensys/teku/blob/55d04f87b422112312f79c1b4d662b3d58e3ca74/bls/src/main/java/tech/pegasys/teku/bls/impl/mikuli/hash2g2/Chains.java#L569 """ assert ( self.curve_id == CurveID.BLS12_381.value ), "This circuit is only supported for BLS12-381" # Initial point is t0 = P t0 = P t1 = self.double_point_a_eq_0(t0) t4 = self.add_points(t1, t0) t2 = self.add_points(t4, t1) t3 = self.add_points(t2, t1) t11 = self.add_points(t3, t1) t9 = self.add_points(t11, t1) t10 = self.add_points(t9, t1) t5 = self.add_points(t10, t1) t7 = self.add_points(t5, t1) t15 = self.add_points(t7, t1) t13 = self.add_points(t15, t1) t6 = self.add_points(t13, t1) t14 = self.add_points(t6, t1) t12 = self.add_points(t14, t1) t8 = self.add_points(t12, t1) # Start the main computation chain t1 = self.double_point_a_eq_0(t6) # t6.dbl() t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t13) # .add(t13) t1 = self.double_n_times(t1, 2) # .dbls(2) t1 = self.add_points(t1, t0) # .add(t0) t1 = self.double_n_times(t1, 9) # .dbls(9) t1 = self.add_points(t1, t8) # .add(t8) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t11) # .add(t11) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t13) # .add(t13) t1 = self.double_n_times(t1, 8) # .dbls(8) t1 = self.add_points(t1, t2) # .add(t2) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t5) # .add(t5) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t0) # .add(t0) t1 = self.double_n_times(t1, 8) # .dbls(8) t1 = self.add_points(t1, t11) # .add(t11) t1 = self.double_n_times(t1, 8) # .dbls(8) t1 = self.add_points(t1, t8) # .add(t8) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t2) # .add(t2) t1 = self.double_n_times(t1, 9) # .dbls(9) t1 = self.add_points(t1, t5) # .add(t5) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t11) # .add(t11) t1 = self.double_n_times(t1, 2) # .dbls(2) t1 = self.add_points(t1, t0) # .add(t0) t1 = self.double_n_times(t1, 9) # .dbls(9) t1 = self.add_points(t1, t8) # .add(t8) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t13) # .add(t13) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t0) # .add(t0) t1 = self.double_n_times(t1, 11) # .dbls(11) t1 = self.add_points(t1, t9) # .add(t9) t1 = self.double_n_times(t1, 7) # .dbls(7) t1 = self.add_points(t1, t12) # .add(t12) t1 = self.double_n_times(t1, 7) # .dbls(7) t1 = self.add_points(t1, t7) # .add(t7) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t12) # .add(t12) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t14) # .add(t14) t1 = self.double_n_times(t1, 8) # .dbls(8) t1 = self.add_points(t1, t13) # .add(t13) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t0) # .add(t0) t1 = self.double_n_times(t1, 8) # .dbls(8) t1 = self.add_points(t1, t9) # .add(t9) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t13) # .add(t13) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t10) # .add(t10) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t2) # .add(t2) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t10) # .add(t10) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t2) # .add(t2) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t0) # .add(t0) t1 = self.double_n_times(t1, 10) # .dbls(10) t1 = self.add_points(t1, t9) # .add(t9) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t14) # .add(t14) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t9) # .add(t9) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t15) # .add(t15) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t8) # .add(t8) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t12) # .add(t12) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t5) # .add(t5) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t15) # .add(t15) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t2) # .add(t2) t1 = self.double_n_times(t1, 7) # .dbls(7) t1 = self.add_points(t1, t5) # .add(t5) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t9) # .add(t9) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t15) # .add(t15) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t14) # .add(t14) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t8) # .add(t8) t1 = self.double_n_times(t1, 10) # .dbls(10) t1 = self.add_points(t1, t6) # .add(t6) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t5) # .add(t5) t1 = self.double_n_times(t1, 3) # .dbls(3) t1 = self.add_points(t1, t0) # .add(t0) t1 = self.double_n_times(t1, 9) # .dbls(9) t1 = self.add_points(t1, t13) # .add(t13) t1 = self.double_n_times(t1, 7) # .dbls(7) t1 = self.add_points(t1, t12) # .add(t12) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t5) # .add(t5) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t2) # .add(t2) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t11) # .add(t11) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t10) # .add(t10) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t4) # .add(t4) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t10) # .add(t10) t1 = self.double_n_times(t1, 7) # .dbls(7) t1 = self.add_points(t1, t7) # .add(t7) t1 = self.double_n_times(t1, 3) # .dbls(3) t1 = self.add_points(t1, t2) # .add(t2) t1 = self.double_n_times(t1, 4) # .dbls(4) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 8) # .dbls(8) t1 = self.add_points(t1, t9) # .add(t9) t1 = self.double_n_times(t1, 8) # .dbls(8) t1 = self.add_points(t1, t9) # .add(t9) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t8) # .add(t8) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t7) # .add(t7) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t6) # .add(t6) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t5) # .add(t5) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t4) # .add(t4) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t5) # .add(t5) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t4) # .add(t4) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t4) # .add(t4) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t5) # .add(t5) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 7) # .dbls(7) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t4) # .add(t4) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 3) # .dbls(3) t1 = self.add_points(t1, t0) # .add(t0) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 6) # .dbls(6) t1 = self.add_points(t1, t3) # .add(t3) t1 = self.double_n_times(t1, 5) # .dbls(5) t1 = self.add_points(t1, t2) # .add(t2) return t1 def mx_chain(self, P): """ Addition chain for multiplication by 0xd201000000010000 == -x, where x is the BLS parameter. """ q = self.double_point_a_eq_0(P) # Sequence of doubles and adds as per Java implementation ndoubles = [2, 3, 9, 32, 16] for n in ndoubles: q = self.add_points(q, P) for _ in range(n): q = self.double_point_a_eq_0(q) return q def clear_cofactor(self, P): """ Complete cofactor clearing implementation following Teku's approach. This implements an optimized cofactor clearing method for BLS12-381 G2 that avoids patent-encumbered endomorphism techniques. Instead of directly multiplying by the G2 cofactor, it uses an efficient addition chain to compute an equivalent operation. The method follows the approach specified in draft-irtf-cfrg-hash-to-curve-05 section 8.9.2, which breaks down the operation into: 1. Apply h2 chain 2. Multiply by 3 3. Apply mx chain twice (z^2) 4. Subtract 3 * h2 result This gives the same result as multiplying by the effective cofactor, but is more computationally efficient due to the optimized addition chain implementation. Args: P: The point to clear the cofactor from Returns: A point in the correct subgroup after cofactor clearing """ assert ( self.curve_id == CurveID.BLS12_381.value ), "This circuit is only supported for BLS12-381" # Step 1: Apply h2 chain work = self.h2_chain(P) # Step 2: Multiply by 3 (add + double) work3 = self.add_points(work, self.double_point_a_eq_0(work)) # Step 3: Apply mx chain twice (z^2) work = self.mx_chain(work3) # First z work = self.mx_chain(work) # Second z # Step 4: Subtract 3 * h2 neg_work3 = self.negate_point(work3) final = self.add_points(work, neg_work3) return final class FastG2CofactorClearing(BasicECG2): """ Implements an efficient cofactor clearing method for G2 points on BLS12-381 curve using endomorphisms. This implementation avoids expensive scalar multiplications by utilizing the Frobenius endomorphism (ψ) and efficient addition chains. The cofactor clearing ensures that points are in the correct order-r subgroup of G2, which is essential for cryptographic operations like BLS signatures. Key operations: - ψ (psi): Frobenius endomorphism - ψ² (psi²): Double application of Frobenius - mul_by_x: Multiplication by BLS parameter x """ def psi( self, P: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]] ) -> tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]: """ Implements the ψ (Frobenius endomorphism) map for BLS12-381 G₂ points. The Frobenius endomorphism ψ is defined as: ψ(P) = π(P) · [1/(u+1)^((p-1)/3), 1/(u+1)^((p-1)/2)] where π is the p-power Frobenius map that conjugates coordinates in Fp2. Args: P: A G2 point represented as ((x0, x1), (y0, y1)) where each coordinate is in Fp and (x0, x1) and (y0, y1) represent elements in Fp2 Returns: A new G2 point after applying the Frobenius endomorphism """ assert ( self.curve_id == CurveID.BLS12_381.value ), "This circuit is only supported for BLS12-381" x, y = P # x and y are lists [x0, x1] representing elements in Fp² # Apply the Frobenius map (conjugation in Fp2) x_frob = self.fp2_frobenius_map(x) y_frob = self.fp2_frobenius_map(y) # Constants for scaling after Frobenius map # PSI_X = 1/(u+1)^((p-1)/3) psi_coeff_x = [ self.set_or_get_constant(self.field(0)), self.set_or_get_constant( self.field( 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAD ) ), ] # PSI_Y = 1/(u+1)^((p-1)/2) psi_coeff_y = [ self.set_or_get_constant( self.field( 0x135203E60180A68EE2E9C448D77A2CD91C3DEDD930B1CF60EF396489F61EB45E304466CF3E67FA0AF1EE7B04121BDEA2 ) ), self.set_or_get_constant( self.field( 0x6AF0E0437FF400B6831E36D6BD17FFE48395DABC2D3435E77F76E17009241C5EE67992F72EC05F4C81084FBEDE3CC09 ) ), ] # Scale the coordinates with the appropriate constants psi_x = self.fp2_mul(x_frob, psi_coeff_x) psi_y = self.fp2_mul(y_frob, psi_coeff_y) return (psi_x, psi_y) def mul_by_x( self, P: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]] ) -> tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]: """ Multiplies a point by x = -0xd201000000010001 (BLS parameter) using double-and-add. The binary representation of x is: 1101 0010 0000 0001 0000 0000 0000 0000 0000 0000 0000 0001 0000 0000 0000 0000 Args: P: A G2 point to be multiplied by x Returns: [-x]P: The point multiplied by the negation of x """ assert ( self.curve_id == CurveID.BLS12_381.value ), "This circuit is only supported for BLS12-381" result = P # 1: Start with P. As a result we skip the first bit. result = self.double_point_a_eq_0(result) # 1: Double and add result = self.add_points(result, P) # 2: Double and add result = self.double_point_a_eq_0(result) # 0: Double result = self.double_point_a_eq_0(result) # 1: Double and add result = self.add_points(result, P) result = self.double_n_times(result, 2) # 2x 0: Double result = self.double_point_a_eq_0(result) # 1: Double and add result = self.add_points(result, P) result = self.double_n_times(result, 8) # 8x 0: Double result = self.double_point_a_eq_0(result) # 1: Double and add result = self.add_points(result, P) result = self.double_n_times(result, 31) # 31x 0: Double result = self.double_point_a_eq_0(result) # 1: Double and add result = self.add_points(result, P) result = self.double_n_times(result, 16) # 16x 0: Double return self.negate_point(result) def double_psi( self, P: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]] ) -> tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]: """ Implements ψ² (double Frobenius endomorphism) by applying psi twice. For BLS12-381, ψ² is a much cheaper operation than scalar multiplication and is used to optimize the cofactor clearing operation. Args: P: A G2 point Returns: ψ²(P): The point after applying the Frobenius endomorphism twice """ return self.psi(self.psi(P)) def clear_cofactor( self, P: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]] ) -> tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]: """ Clears the cofactor of a G2 point using an optimized endomorphism-based method. This implementation follows the efficient approach described in: https://eprint.iacr.org/2017/419.pdf The formula implemented is: [h(ψ)]P = [x²-x-1]P + [x-1]ψ(P) + ψ²(2P) where x is the BLS parameter = -0xd201000000010000 This method is more efficient than the traditional scalar multiplication by the cofactor h, as it uses the efficiently computable endomorphism ψ and optimized multiplication by x. Args: P: A G2 point to clear the cofactor from Returns: A point in the correct order-r subgroup of G2 """ # Calculate [-x]P t1 = self.mul_by_x(P) # Calculate ψ(P) t2 = self.psi(P) # Calculate 2P and ψ²(2P) t3 = self.double_point_a_eq_0(P) # 2P t3 = self.double_psi(t3) # ψ²(2P) # Following steps compute: [x²-x-1]P + [x-1]ψ(P) + ψ²(2P) t3 = self.add_points(t3, self.negate_point(t2)) # ψ²(2P) - ψ(P) t2 = self.add_points(t1, t2) # [-x]P + ψ(P) t2 = self.mul_by_x(t2) # [x²]P - [x]ψ(P) t3 = self.add_points(t3, t2) # ψ²(2P) - ψ(P) + [x²]P - [x]ψ(P) t3 = self.add_points(t3, self.negate_point(t1)) # Add [x]P final = self.add_points(t3, self.negate_point(P)) # Subtract P return final class G1CofactorClearing(BasicEC): def mul_by_x( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement] ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """ Multiplies a point by x = 0xd201000000010000 (BLS parameter) using double-and-add. The binary representation of x is: 1101 0010 0000 0001 0000 0000 0000 0000 0000 0000 0000 0001 0000 0000 0000 0000 Args: P: A G1 point to be multiplied by x Returns: [x]P: The point multiplied by x """ # Todo : Incude automatic addition chain for any number computed at runtime ? assert ( self.curve_id == CurveID.BLS12_381.value ), "This circuit is only supported for BLS12-381" result = P # 1: Start with P. As a result we skip the first bit. result = self.double_point_a_eq_0(result) # 1: Double and add result = self.add_points(result, P) # 2: Double and add result = self.double_point_a_eq_0(result) # 0: Double result = self.double_point_a_eq_0(result) # 1: Double and add result = self.add_points(result, P) result = self.double_n_times(result, 2) # 2x 0: Double result = self.double_point_a_eq_0(result) # 1: Double and add result = self.add_points(result, P) result = self.double_n_times(result, 8) # 8x 0: Double result = self.double_point_a_eq_0(result) # 1: Double and add result = self.add_points(result, P) result = self.double_n_times(result, 31) # 31x 0: Double result = self.double_point_a_eq_0(result) # 1: Double and add result = self.add_points(result, P) return self.double_n_times(result, 16) # 16x 0: Double def clear_cofactor( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement] ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """ Clears the cofactor of a G1 point using an efficient scalar multiplication method. Implementation follows the approach from: https://eprint.iacr.org/2019/403 The formula is: h_eff(P) = P - [-x]P = P + [x]P where x is the BLS parameter = -0xd201000000010000 This method is more efficient than multiplying by the full cofactor h, as it uses an optimized addition chain for multiplication by x. Args: P: A G1 point to clear the cofactor from Returns: A point in the correct order-r subgroup of G1 """ assert ( self.curve_id == CurveID.BLS12_381.value ), "This circuit is only supported for BLS12-381" # Calculate [x]P using the existing mul_by_x method # As shown below, we can save negation xP = self.mul_by_x(P) # Return P - [-x]P = P + [x]P return self.add_points(P, xP) if __name__ == "__main__": circuit = G1CofactorClearing(name="cofactor_clearing", curve_id=1) val_x = circuit.write_element( circuit.field( 3789617024712504402204306620295003375951143917889162928515122476381982967144814366712031831841518399614182231387665 ) ) val_y = circuit.write_element( circuit.field( 1292375129422168617658520396283100687686347104559592203462491249161639006037671760603453326853098986903549775136448 ) ) print(circuit.clear_cofactor((val_x, val_y))) ================================================ FILE: hydra/garaga/precompiled_circuits/compilable_circuits/apply_isogeny.py ================================================ import garaga.modulo_circuit_structs as structs from garaga.curves import CurveID from garaga.precompiled_circuits.compilable_circuits.base import ( BaseModuloCircuit, ModuloCircuit, PyFelt, ) from garaga.precompiled_circuits.isogeny import IsogenyG1 class ApplyIsogenyCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 1 ) -> None: super().__init__( name=f"apply_isogeny_{CurveID(curve_id).name.lower()}", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: return [self.field(44), self.field(4)] def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = IsogenyG1(self.name, self.curve_id, self.compilation_mode) px, py = circuit.write_struct(structs.G1PointCircuit(name="pt", elmts=input)) x_affine, y_affine = circuit.run_isogeny(px, py) circuit.extend_struct_output( structs.G1PointCircuit(name="res", elmts=[x_affine, y_affine]) ) return circuit ================================================ FILE: hydra/garaga/precompiled_circuits/compilable_circuits/base.py ================================================ import re import subprocess from abc import ABC, abstractmethod from concurrent.futures import ProcessPoolExecutor from typing import Type from garaga.curves import CurveID, get_base_field from garaga.hints.io import int_array_to_u384_array from garaga.modulo_circuit import ModuloCircuit, ModuloCircuitElement, PyFelt from garaga.modulo_circuit_structs import Cairo1SerializableStruct def get_circuit_definition_impl_template(num_outputs: int): TEMPLATE = """\n impl CircuitDefinition{num_outputs}< {elements} > of core::circuit::CircuitDefinition< ( {ce_elements} ) > {{ type CircuitType = core::circuit::Circuit< ({elements_tuple},) >; }} impl MyDrp_{num_outputs}< {elements} > of Drop< ( {ce_elements} ) >; """ elements = ", ".join(f"E{i}" for i in range(num_outputs)) ce_elements = ", ".join(f"CE" for i in range(num_outputs)) elements_tuple = ", ".join(f"E{i}" for i in range(num_outputs)) return TEMPLATE.format( num_outputs=num_outputs, elements=elements, ce_elements=ce_elements, elements_tuple=elements_tuple, ) class BaseModuloCircuit(ABC): """ Base class for all modulo circuits that will be compiled to Cairo code. Parameters: - name: str, the name of the circuit - curve_id: int, the id of the curve - auto_run: bool, whether to run the circuit automatically at initialization. When compiling, this flag is set to true so the ModuloCircuit class inside the ".circuit" member of this class holds the necessary metadata about the operations that will be compiled. For CairoZero, this flag will be set to False in the Python hint, so that BaseModuloCircuit.run_circuit() can be called on a segment parsed from the CairoZero VM. - compilation mode: 0 (CairoZero) or 1 (Cairo) """ def __init__( self, name: str, curve_id: int, auto_run: bool = True, compilation_mode: int = 0, ) -> None: self.name = name self.curve_id = curve_id self.field = get_base_field(curve_id) self.init_hash = None self.generic_over_curve = False self.compilation_mode = compilation_mode if auto_run: self.input = self.build_input() self.circuit: ModuloCircuit = self._run_circuit_inner(self.input.copy()) @abstractmethod def build_input(self) -> list[PyFelt]: """ This method is used to create the necessary inputs that will be written to the ModuloCircuit. It works in pair with the _run_circuit_inner function, where the _run_circuit_inner will use the output of the build_input function to "deserialize" the list of elements and write them to the ModuloCircuit class. """ @property def full_input_cairo1(self) -> list[PyFelt] | list[Cairo1SerializableStruct]: if self.circuit is None: raise ValueError("Circuit not run yet") if self.circuit.input_structs: return self.circuit.input_structs else: res = self.input + self.circuit.witnesses return res @abstractmethod def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: """ This method is responsible for - deserializing the input list of elements, - creating a ModuloCircuit class (or class that derives from ModuloCircuit) - "writing" the inputs to the ModuloCircuit class to obtain ModuloCircuitElements - using the methods add, sub, mul, inv (or higher level methods) of the ModuloCircuit class to define the list of operations on the given inputs - Returning the ModuloCircuit class in a state where the circuit has been run, and therefore holding the metadata so that its instructions can be compiled to Cairo code. """ def run_circuit(self, input: list[int]) -> ModuloCircuit: """ A simple wrapper around _run_circuit_inner that converts the input as a list of ints to a list of PyFelt. Used in CairoZero hint. """ # print( # f"Running circuit for {self.name} with CurveID {CurveID(self.curve_id).name}..." # ) circuit_input = [self.field(x) for x in input] return self._run_circuit_inner(circuit_input) class BaseEXTFCircuit(BaseModuloCircuit): """ A extension of the BaseModuloCircuit class that holds an init_hash, used for CairoZero. Not relevant for Cairo1 circuits. """ def __init__( self, name: str, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__(name, curve_id, auto_run, compilation_mode) self.init_hash = init_hash def compilation_mode_to_file_header( mode: int, curve_ids: set[CurveID], required_structs: set[str] = None ) -> str: if mode == 0: return """ from starkware.cairo.common.registers import get_fp_and_pc, get_label_location from modulo_circuit import ExtensionFieldModuloCircuit, ModuloCircuit, get_void_modulo_circuit, get_void_extension_field_modulo_circuit from definitions import bn, bls """ elif mode == 1: # Default structs (always included for backward compatibility if no required_structs specified) default_structs = [ "G1Point", "G2Point", "E12D", "u288", "G1G2Pair", "BNProcessedPair", "BLSProcessedPair", "MillerLoopResultScalingFactor", "G2Line", "E12T", ] # Use required_structs if provided, otherwise use default structs # If required_structs is an empty set, that means no structs are needed if required_structs is not None: structs_to_import = list(sorted(required_structs)) else: structs_to_import = default_structs.copy() # remove u384 from structs_to_import list if it exists if "u384" in structs_to_import: structs_to_import.remove("u384") # Combine all definitions all_definitions = structs_to_import definitions_import = "" if all_definitions: definitions_import = ( f"use garaga::definitions::{{{', '.join(all_definitions)}}};" ) return f""" use core::circuit::{{ u384, circuit_add, circuit_sub, circuit_mul, circuit_inverse, EvalCircuitTrait, CircuitOutputsTrait, CircuitInputs, }}; use garaga::core::circuit::{{AddInputResultTrait2, u288IntoCircuitInputValue}}; use core::circuit::CircuitElement as CE; use core::circuit::CircuitInput as CI; {definitions_import} """ def cairo1_tests_header() -> str: return """ #[cfg(test)] mod tests { use core::traits::TryInto; use core::circuit::{ RangeCheck96, AddMod, MulMod, CircuitElement, CircuitInput, circuit_add, circuit_sub, circuit_mul, circuit_inverse, EvalCircuitResult, EvalCircuitTrait, u384, CircuitOutputsTrait, CircuitModulus, AddInputResultTrait, CircuitInputs }; use garaga::definitions::{G1Point, G2Point, E12D, G1G2Pair, BNProcessedPair, BLSProcessedPair, MillerLoopResultScalingFactor, G2Line}; """ def parse_struct_name(struct_name: str) -> list[str]: """ Parse struct names and extract the types that need to be imported. Rules: - Span or Array -> only add T - Struct -> add Struct and T separately - Other structs -> add as is Returns: list[str]: List of struct names to import """ import re # Handle Span and Array - only add T span_array_match = re.match(r"^(Span|Array)<(.+)>$", struct_name) if span_array_match: inner_type = span_array_match.group(2) return [inner_type] # Handle other generic types like Struct - add both Struct and T generic_match = re.match(r"^([^<]+)<(.+)>$", struct_name) if generic_match: base_struct = generic_match.group(1) inner_type = generic_match.group(2) return [base_struct, inner_type] # Non-generic struct - add as is return [struct_name] def collect_struct_dependencies(circuit_instances: list[BaseModuloCircuit]) -> set[str]: """ Collect all Cairo1SerializableStruct types used in the input_structs and output_structs of the given circuit instances. Returns: set[str]: Set of struct class names that need to be imported """ struct_types = set() def add_struct_types(struct): """Helper function to add struct types recursively""" struct_name = struct.struct_name parsed_types = parse_struct_name(struct_name) struct_types.update(parsed_types) # Also add nested struct types if they exist if hasattr(struct, "elmts") and struct.elmts: for elmt in struct.elmts: if isinstance(elmt, Cairo1SerializableStruct): add_struct_types(elmt) for circuit_instance in circuit_instances: # Collect from input_structs if ( hasattr(circuit_instance.circuit, "input_structs") and circuit_instance.circuit.input_structs ): for struct in circuit_instance.circuit.input_structs: add_struct_types(struct) # Collect from output_structs if ( hasattr(circuit_instance.circuit, "output_structs") and circuit_instance.circuit.output_structs ): for struct in circuit_instance.circuit.output_structs: add_struct_types(struct) return struct_types def to_snake_case(s: str) -> str: return re.sub(r"(?<=[a-z])(?=[A-Z])|[^a-zA-Z0-9]", "_", s).lower() def create_circuit_instances( circuit_class: Type[BaseModuloCircuit], curve_id: CurveID, params: list[dict], compilation_mode: int, ) -> list[BaseModuloCircuit]: """ Create a list of circuit instances from a given circuit class, curve id, params and compilation mode. """ circuits = [] if params is None: circuit_instance = circuit_class( curve_id=curve_id.value, compilation_mode=compilation_mode, auto_run=True ) circuits.append(circuit_instance) else: for param in params: circuit_instance = circuit_class( curve_id=curve_id.value, compilation_mode=compilation_mode, auto_run=True, **param, ) circuits.append(circuit_instance) return circuits def compile_single_circuit( circuit_instance: BaseModuloCircuit, ) -> tuple[ModuloCircuit, str]: """ Compile a single circuit instance to Cairo code. Returns the compiled circuit and the full function name. """ curve_id = CurveID(circuit_instance.curve_id) function_name = ( f"{circuit_instance.name.upper()}" if circuit_instance.circuit.generic_circuit else f"{curve_id.name}_{circuit_instance.name.upper()}" ) compiled_circuit, full_function_name = circuit_instance.circuit.compile_circuit( function_name=function_name ) return compiled_circuit, full_function_name def compile_circuit( curve_id: CurveID, circuit_class: BaseModuloCircuit, params: list[dict], compilation_mode: int, ) -> tuple[list[str], list[str], list[BaseModuloCircuit]]: """ Compile a list of circuit instances to Cairo code. Returns : - compiled_circuits: list of compiled circuits as strings - full_function_names: list of full function names as strings - circuit_instances: list of circuit instances that have been compiled """ circuits = create_circuit_instances( circuit_class, curve_id, params, compilation_mode ) compiled_circuits = [] full_function_names = [] for circuit_instance in circuits: compiled_circuit, full_function_name = compile_single_circuit(circuit_instance) compiled_circuits.append(compiled_circuit) full_function_names.append(full_function_name) return compiled_circuits, full_function_names, circuits def create_cairo1_test(function_name: str, input: list, output: list, curve_id: int): return "" if function_name == "": # print(f"passing test") return "" include_curve_id = CurveID.find_value_in_string(function_name) == None if all(isinstance(i, Cairo1SerializableStruct) for i in input): input_code = "\n".join([i.serialize() for i in input]) input_params = ",".join([f"{i.name}" for i in input]) elif all(isinstance(i, PyFelt) for i in input): input_code = f"let input = {int_array_to_u384_array(input)};" input_params = "input" else: raise ValueError( f"Invalid input type for Cairo1 test : {[type(i) for i in input]}" ) if all(isinstance(i, Cairo1SerializableStruct) for i in output): output_code = f"let ({', '.join([i.name+'_result' for i in output])}) = {function_name}({input_params}{', ' + str(curve_id) if include_curve_id else ''});" output_code += "\n".join([i.serialize() for i in output]) for struct in output: output_code += f"assert_eq!({struct.name}_result, {struct.name});" elif all(isinstance(i, ModuloCircuitElement) for i in output): output_code = f"let got = {function_name}({input_params}{', ' + str(curve_id) if include_curve_id else ''});" output_code += f"let exp = {int_array_to_u384_array(output)};" output_code += "assert_eq!(got.len(), exp.len());" output_code += "assert_eq!(got, exp);" else: raise ValueError( f"Invalid output type for Cairo1 test : {[type(i) for i in output]}" ) code = f""" #[test] fn test_{function_name}_{CurveID(curve_id).name}() {{ {input_code} {output_code} }} """ return code def format_cairo_files_in_parallel( filenames, compilation_mode, precompiled_circuits_dir ): if compilation_mode == 0: print("Formatting .cairo zero files in parallel...") cairo_files = [f"{precompiled_circuits_dir}{f}.cairo" for f in filenames] with ProcessPoolExecutor() as executor: futures = [ executor.submit( subprocess.run, ["cairo-format", file, "-i"], check=True ) for file in cairo_files ] for future in futures: future.result() # Wait for all formatting tasks to complete print("Done!") elif compilation_mode == 1: subprocess.run(["scarb", "fmt", f"{precompiled_circuits_dir}"], check=True) ================================================ FILE: hydra/garaga/precompiled_circuits/compilable_circuits/cairo1_mpcheck_circuits.py ================================================ from abc import ABC, abstractmethod from typing import Dict, List, Optional, Tuple, Type, Union import garaga.modulo_circuit_structs as structs from garaga.curves import BLS12_381_ID, BN254_ID, get_irreducible_poly from garaga.extension_field_modulo_circuit import ExtensionFieldModuloCircuit, PyFelt from garaga.modulo_circuit import ModuloCircuit from garaga.modulo_circuit_structs import ( E12D, BLSProcessedPair, BNProcessedPair, Cairo1SerializableStruct, G1PointCircuit, G2Line, G2PointCircuit, MillerLoopResultScalingFactor, u384, u384Array, ) from garaga.precompiled_circuits import multi_pairing_check from garaga.precompiled_circuits.compilable_circuits.base import BaseEXTFCircuit def split_4_sized_object_into_tuple_of_2_size( input: Union[List[PyFelt], Tuple[PyFelt, PyFelt, PyFelt, PyFelt]], ) -> Optional[Tuple[List[PyFelt], List[PyFelt]]]: if input is None: return None assert len(input) == 4, f"Expected input of length 4, got {len(input)}" return (list(input[0:2]), list(input[2:4])) def parse_precomputed_g1_consts_and_g2_points( circuit: multi_pairing_check.MultiPairingCheckCircuit, vars: dict, n_pairs: int, bit_1: bool = False, ) -> list[tuple[list[PyFelt], list[PyFelt]]]: current_points = [] q_or_q_neg_points = [] if bit_1 else None for i in range(n_pairs): circuit.yInv.append(vars[f"yInv_{i}"]) circuit.xNegOverY.append(vars[f"xNegOverY_{i}"]) current_points.append( split_4_sized_object_into_tuple_of_2_size(vars.get(f"Q_{i}", None)) ) # Return empty list if not present if bit_1: q_or_q_neg_points.append( split_4_sized_object_into_tuple_of_2_size( vars.get(f"Q_or_Q_neg_{i}", None) ) # Return empty list if not present ) return current_points, q_or_q_neg_points class BaseFixedG2PointsMPCheck(BaseEXTFCircuit, ABC): def __init__( self, name, curve_id, n_pairs: int, n_fixed_g2: int, auto_run=True, compilation_mode=1, ): assert compilation_mode == 1, "Compilation mode 1 is required for this circuit" if n_pairs and "mp_check_prepare_pairs" not in name: assert ( 2 <= n_pairs ), f"Multi-pairing check requires at least 2 pairs, got {n_pairs}" if n_fixed_g2: assert ( 0 <= n_fixed_g2 <= n_pairs ), f"Number of fixed G2 points must be between 0 and {n_pairs}, got {n_fixed_g2}" self.n_pairs = n_pairs self.n_fixed_g2 = n_fixed_g2 super().__init__( name=name, curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) self.generic_over_curve = True def _initialize_circuit(self): return multi_pairing_check.MultiPairingCheckCircuit( self.name, self.curve_id, n_pairs=self.n_pairs, hash_input=False, compilation_mode=self.compilation_mode, precompute_lines=True, n_points_precomputed_lines=self.n_fixed_g2, ) @property @abstractmethod def input_map( self, ) -> Dict[ str, Union[ Type[Cairo1SerializableStruct], Tuple[Type[Cairo1SerializableStruct], int] ], ]: """ Define the input map for the circuit in a dict. The key will be the name of the input variable, also used in the signature of the compiled Cairo code. The value will be either a Cairo1SerializableStruct type (which defines the struct in the Cairo code), or a tuple of the type and its size (for Array-like types). The reason behind this is that each Cairo1SerializableStruct defines the __len__ method, but for the array-like structs we need to specify the size in advance. """ def _base_input_map(self, bit_type: str) -> dict: """ Base input map for the bit 0, 1, 00, 01, and 10 cases. """ input_map = {} # Add pair inputs for k in range(self.n_fixed_g2): input_map[f"yInv_{k}"] = u384 input_map[f"xNegOverY_{k}"] = u384 input_map[f"G2_line_dbl_{k}"] = G2Line if bit_type in ("1"): input_map[f"G2_line_add_{k}"] = G2Line if bit_type == "10": input_map[f"G2_line_add_1_{k}"] = G2Line input_map[f"G2_line_dbl_0_{k}"] = G2Line if bit_type == "01": input_map[f"G2_line_dbl_1{k}"] = G2Line input_map[f"G2_line_add_1{k}"] = G2Line if bit_type == "00": input_map[f"G2_line_2nd_0_{k}"] = G2Line for k in range(self.n_fixed_g2, self.n_pairs): input_map[f"yInv_{k}"] = u384 input_map[f"xNegOverY_{k}"] = u384 input_map[f"Q_{k}"] = G2PointCircuit if bit_type in ("1", "01", "10"): input_map[f"Q_or_Q_neg_{k}"] = G2PointCircuit # Add common inputs input_map["lhs_i"] = u384 input_map["f_i_of_z"] = u384 input_map["f_i_plus_one_of_z"] = u384 # Add bit-specific inputs if bit_type in ("1", "01", "10"): input_map["c_or_cinv_of_z"] = u384 input_map["z"] = u384 input_map["c1"] = u384 return input_map def _process_input( self, circuit: multi_pairing_check.MultiPairingCheckCircuit, input: list[PyFelt] ) -> dict: """ Method responsible for deserializing the input list of elements into the variables in the input map, and writing them to the circuit. The input list is expected to be in the same order as the input map. Since we use Python 3.10, the input map dict is ordered. Returns a vars dict with the same keys as the input map, but with the values being the instances of the structs, each struct holding ModuloCircuitElement(s). """ vars = {} for name, struct_info in self.input_map.items(): if isinstance(struct_info, tuple) and struct_info[0] == u384Array: # Handle u384Array with specified size struct_type, size = struct_info vars[name] = circuit.write_struct( struct_type(name, elmts=[input.pop(0) for _ in range(size)]) ) elif struct_info == G2Line: # Internally appended to the precomputed_lines flattened list circuit.precomputed_lines.extend( circuit.write_struct( G2Line(name, elmts=[input.pop(0) for _ in range(4)]) ) ) else: struct_type = struct_info # For other types, create a temporary instance to get its length temp_instance = struct_type( name, None ) # Temporary instance with a dummy element size = len(temp_instance) if size == 1: vars[name] = circuit.write_struct( struct_type(name, elmts=[input.pop(0)]) ) else: # Convert to tuple so that it is Hashable vars[name] = tuple( circuit.write_struct( struct_type(name, elmts=[input.pop(0) for _ in range(size)]) ) ) assert len(input) == 0, f"Expected input of length 0, got {len(input)}" # Create the precomputed lines generator circuit._precomputed_lines_generator = ( circuit._create_precomputed_lines_generator() ) return vars def build_input(self) -> list[PyFelt]: """ Extends the base method of BaseModuloCircuit, by reading the input map and returning a list of random elements of the total expected size. """ total_elements = 0 for name, struct_info in self.input_map.items(): if isinstance(struct_info, tuple): # Array-like case _, size = struct_info total_elements += size else: # For other structs, create a temporary instance to get its length temp_instance = struct_info(name, None) total_elements += len(temp_instance) return [self.field.random() for _ in range(total_elements)] def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = self._initialize_circuit() vars = self._process_input(circuit, input) return self._execute_circuit_logic(circuit, vars) @abstractmethod def _execute_circuit_logic(self, circuit, vars) -> ModuloCircuit: """ Implement the circuit logic using the processed input variables. """ def _execute_circuit_bit_logic_base(self, circuit: ModuloCircuit, vars, bit_type): n_pairs = self.n_pairs assert n_pairs >= 2, f"n_pairs must be >= 2, got {n_pairs}" current_points, q_or_q_neg_points = parse_precomputed_g1_consts_and_g2_points( circuit, vars, n_pairs, bit_1=(bit_type == "1" or bit_type == "01" or bit_type == "10"), ) circuit.create_lines_z_powers(vars["z"]) sum_i_prod_k_P = circuit.mul( vars["f_i_of_z"], vars["f_i_of_z"], "Square f evaluation in Z, the result of previous bit.", ) new_points, sum_i_prod_k_P = self._process_points( circuit, current_points, q_or_q_neg_points, sum_i_prod_k_P, bit_type ) if bit_type in ("1", "01"): sum_i_prod_k_P = circuit.mul(sum_i_prod_k_P, vars["c_or_cinv_of_z"]) elif bit_type == "10": sum_i_prod_k_P = circuit.mul( sum_i_prod_k_P, circuit.square(vars["c_or_cinv_of_z"]) ) f_i_plus_one_of_z = vars["f_i_plus_one_of_z"] new_lhs = circuit.sub( sum_i_prod_k_P, f_i_plus_one_of_z, "(Π(i,k) (Pk(z))) - Ri(z)" ) lhs_i_plus_one = circuit.add( circuit.mul(vars["c1"], vars["lhs_i"]), new_lhs, "LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z))", ) self._extend_output(circuit, new_points, lhs_i_plus_one) return circuit def _process_points( self, circuit: multi_pairing_check.MultiPairingCheckCircuit, current_points, q_or_q_neg_points, sum_i_prod_k_P, bit_type, ): new_points = [] if bit_type == "00": for k in range(self.n_pairs): T1, line_poly_1 = circuit.double_step(current_points[k], k) sum_i_prod_k_P = self._multiply_line_evaluations( circuit, sum_i_prod_k_P, [line_poly_1], k ) new_points.append(T1) sum_i_prod_k_P = circuit.mul( sum_i_prod_k_P, sum_i_prod_k_P, "Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2", ) new_new_points = [] for k in range(self.n_pairs): T, line_poly_2 = circuit.double_step(new_points[k], k) sum_i_prod_k_P = self._multiply_line_evaluations( circuit, sum_i_prod_k_P, [line_poly_2], k ) new_new_points.append(T) return new_new_points, sum_i_prod_k_P elif bit_type == "01": for k in range(self.n_pairs): T, line_poly_1 = circuit.double_step(current_points[k], k) sum_i_prod_k_P = self._multiply_line_evaluations( circuit, sum_i_prod_k_P, [line_poly_1], k ) new_points.append(T) sum_i_prod_k_P = circuit.mul( sum_i_prod_k_P, sum_i_prod_k_P, "Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2", ) new_new_points = [] for k in range(self.n_pairs): T, line_poly_1, line_poly_2 = circuit.double_and_add_step( new_points[k], q_or_q_neg_points[k], k ) sum_i_prod_k_P = self._multiply_line_evaluations( circuit, sum_i_prod_k_P, [line_poly_1, line_poly_2], k ) new_new_points.append(T) return new_new_points, sum_i_prod_k_P elif bit_type == "10": for k in range(self.n_pairs): T, line_poly_1, line_poly_2 = circuit.double_and_add_step( current_points[k], q_or_q_neg_points[k], k ) sum_i_prod_k_P = self._multiply_line_evaluations( circuit, sum_i_prod_k_P, [line_poly_1, line_poly_2], k ) new_points.append(T) sum_i_prod_k_P = circuit.mul( sum_i_prod_k_P, sum_i_prod_k_P, "Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2", ) new_new_points = [] for k in range(self.n_pairs): T, line_poly_1 = circuit.double_step(new_points[k], k) sum_i_prod_k_P = self._multiply_line_evaluations( circuit, sum_i_prod_k_P, [line_poly_1], k ) new_new_points.append(T) return new_new_points, sum_i_prod_k_P elif bit_type == "0": for k in range(self.n_pairs): T, line_poly_1 = circuit.double_step(current_points[k], k) sum_i_prod_k_P = self._multiply_line_evaluations( circuit, sum_i_prod_k_P, [line_poly_1], k ) new_points.append(T) elif bit_type == "1": for k in range(self.n_pairs): T, line_poly_1, line_poly_2 = circuit.double_and_add_step( current_points[k], q_or_q_neg_points[k], k ) sum_i_prod_k_P = self._multiply_line_evaluations( circuit, sum_i_prod_k_P, [line_poly_1, line_poly_2], k ) new_points.append(T) else: raise ValueError(f"Invalid bit type: {bit_type}") return new_points, sum_i_prod_k_P def _multiply_line_evaluations( self, circuit: multi_pairing_check.MultiPairingCheckCircuit, sum_i_prod_k_P, line_polynomials, k, ): for i, line_poly in enumerate(line_polynomials): sum_i_prod_k_P = circuit.mul( sum_i_prod_k_P, circuit.eval_poly_in_precomputed_Z( line_poly, circuit.line_sparsity, f"line_{k}p_{i+1}" ), f"Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_{k}(z)", ) return sum_i_prod_k_P def _extend_output(self, circuit, new_points, lhs_i_plus_one): last_points = ( new_points[-(self.n_pairs - self.n_fixed_g2) :] if self.n_pairs != self.n_fixed_g2 else [] ) for i, point in enumerate(last_points): circuit.extend_struct_output( G2PointCircuit( name=f"Q{i}", elmts=[ point[0][0], point[0][1], point[1][0], point[1][1], ], ) ) circuit.extend_struct_output( u384(name="lhs_i_plus_one", elmts=[lhs_i_plus_one]) ) class FixedG2MPCheckBitBase(BaseFixedG2PointsMPCheck): """Base class for bit checking circuits with default parameters.""" BIT_TYPE = None # Override in subclasses DEFAULT_PAIRS = 3 DEFAULT_FIXED_G2 = 2 def __init__( self, curve_id: int, n_pairs: int = None, n_fixed_g2: int = None, auto_run: bool = True, compilation_mode: int = 1, ): assert compilation_mode == 1, "Compilation mode 1 is required for this circuit" n_pairs = n_pairs if n_pairs is not None else self.DEFAULT_PAIRS n_fixed_g2 = n_fixed_g2 if n_fixed_g2 is not None else self.DEFAULT_FIXED_G2 super().__init__( name=f"mp_check_bit{self.BIT_TYPE}_{n_pairs}P_{n_fixed_g2}F", curve_id=curve_id, n_pairs=n_pairs, n_fixed_g2=n_fixed_g2, auto_run=auto_run, compilation_mode=compilation_mode, ) @property def input_map(self): return self._base_input_map(self.BIT_TYPE) def _execute_circuit_logic(self, circuit, vars) -> ModuloCircuit: return self._execute_circuit_bit_logic_base(circuit, vars, self.BIT_TYPE) class FixedG2MPCheckBit0(FixedG2MPCheckBitBase): BIT_TYPE = "0" class FixedG2MPCheckBit00(FixedG2MPCheckBitBase): BIT_TYPE = "00" class FixedG2MPCheckBit1(FixedG2MPCheckBitBase): BIT_TYPE = "1" class FixedG2MPCheckBit01(FixedG2MPCheckBitBase): BIT_TYPE = "01" class FixedG2MPCheckBit10(FixedG2MPCheckBitBase): BIT_TYPE = "10" class FixedG2MPCheckInitBit(BaseFixedG2PointsMPCheck): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 1, n_pairs: int = 3, n_fixed_g2: int = 2, ): super().__init__( name=f"mp_check_init_bit_{n_pairs}P_{n_fixed_g2}F", curve_id=curve_id, n_pairs=n_pairs, n_fixed_g2=n_fixed_g2, auto_run=auto_run, compilation_mode=compilation_mode, ) @property def input_map(self): input_map = {} for i in range(self.n_fixed_g2): input_map[f"yInv_{i}"] = u384 input_map[f"xNegOverY_{i}"] = u384 input_map[f"G2_line_{i}"] = G2Line if self.curve_id == BLS12_381_ID: input_map[f"G2_line_{i}_2"] = G2Line for i in range(self.n_fixed_g2, self.n_pairs): input_map[f"yInv_{i}"] = u384 input_map[f"xNegOverY_{i}"] = u384 input_map[f"Q_{i}"] = G2PointCircuit input_map.update( { "R_i_of_z": u384, "z": u384, "c_inv_of_z": u384, } ) if self.curve_id == BN254_ID: input_map["c1"] = u384 input_map["previous_lhs"] = u384 return input_map def _execute_circuit_logic(self, circuit, vars) -> ModuloCircuit: n_pairs = self.n_pairs current_points, _ = parse_precomputed_g1_consts_and_g2_points( circuit, vars, n_pairs ) z = vars["z"] c_inv_of_z = vars["c_inv_of_z"] circuit.create_lines_z_powers(z) f_i_plus_one_of_z = vars["R_i_of_z"] sum_i_prod_k_P_of_z = circuit.mul( c_inv_of_z, c_inv_of_z ) # At initialisation, f=1/c so f^2 = 1/c^2 new_points = [] if self.curve_id == BN254_ID: # c_i = circuit.mul( # c0, c0 # ) # Second relation for BN at init bit, need to update c_i. for k in range(n_pairs): T, line_poly_1 = circuit.double_step(current_points[k], k) sum_i_prod_k_P_of_z = circuit.mul( sum_i_prod_k_P_of_z, circuit.eval_poly_in_precomputed_Z( line_poly_1, circuit.line_sparsity, f"line_{k}p_1" ), ) new_points.append(T) elif self.curve_id == BLS12_381_ID: # bit +1: multiply f^2 by 1/c sum_i_prod_k_P_of_z = circuit.mul(c_inv_of_z, sum_i_prod_k_P_of_z) for k in range(n_pairs): T, line_poly_1, line_poly_2 = circuit.triple_step(current_points[k], k) sum_i_prod_k_P_of_z = circuit.mul( sum_i_prod_k_P_of_z, circuit.eval_poly_in_precomputed_Z( line_poly_1, circuit.line_sparsity, f"line_{k}p_1" ), ) sum_i_prod_k_P_of_z = circuit.mul( sum_i_prod_k_P_of_z, circuit.eval_poly_in_precomputed_Z( line_poly_2, circuit.line_sparsity, f"line_{k}p_2" ), ) new_points.append(T) new_lhs = circuit.sub( sum_i_prod_k_P_of_z, f_i_plus_one_of_z, comment="((Π(i,k) (Pk(z)) - Ri(z))" ) if self.curve_id == BLS12_381_ID: pass elif self.curve_id == BN254_ID: c1 = vars["c1"] previous_lhs = vars["previous_lhs"] new_lhs = circuit.add(new_lhs, circuit.mul(c1, previous_lhs)) # OUTPUT last_points = ( new_points[-(self.n_pairs - self.n_fixed_g2) :] if self.n_fixed_g2 != self.n_pairs else [] ) for i, point in enumerate(last_points): circuit.extend_struct_output( G2PointCircuit( name=f"Q{i}", elmts=[ point[0][0], point[0][1], point[1][0], point[1][1], ], ) ) circuit.extend_struct_output(u384("new_lhs", elmts=[new_lhs])) return circuit class MPCheckFinalizeBN(BaseFixedG2PointsMPCheck): def __init__( self, curve_id: int, auto_run: bool = True, n_pairs: int = 3, n_fixed_g2: int = 2, compilation_mode: int = 1, extra_miller_loop_result: bool = False, ): self.max_q_degree = multi_pairing_check.get_max_Q_degree(curve_id, n_pairs) self.extra_miller_loop_result: bool = extra_miller_loop_result if extra_miller_loop_result: name = f"mp_check_finalize_{n_pairs}P_{n_fixed_g2}F_EXT_MLR" else: name = f"mp_check_finalize_{n_pairs}P_{n_fixed_g2}F" super().__init__( name=name, curve_id=curve_id, n_pairs=n_pairs, n_fixed_g2=n_fixed_g2, auto_run=auto_run, compilation_mode=compilation_mode, ) @property def input_map(self): if self.curve_id == BLS12_381_ID: return {} input_map = {} for i in range(self.n_fixed_g2): input_map[f"yInv_{i}"] = u384 input_map[f"xNegOverY_{i}"] = u384 input_map[f"line_1_{i}"] = G2Line input_map[f"line_2_{i}"] = G2Line for i in range(self.n_fixed_g2, self.n_pairs): input_map[f"original_Q{i}"] = G2PointCircuit input_map[f"yInv_{i}"] = u384 input_map[f"xNegOverY_{i}"] = u384 input_map[f"Q_{i}"] = G2PointCircuit input_map.update( { "R_n_minus_2_of_z": u384, "R_n_minus_1_of_z": u384, "c_0": u384, "w_of_z": u384, "z": u384, "c_inv_frob_1_of_z": u384, "c_frob_2_of_z": u384, "c_inv_frob_3_of_z": u384, "previous_lhs": u384, "R_n_minus_3_of_z": u384, "Q": (structs.u384Array, self.max_q_degree + 1), } ) if self.extra_miller_loop_result: input_map["precomputed_miller_loop_result_of_z"] = u384 return input_map def _execute_circuit_logic( self, circuit: multi_pairing_check.MultiPairingCheckCircuit, vars ): if self.curve_id == BLS12_381_ID: return circuit n_pairs = self.n_pairs current_points = [] for k in range(n_pairs): circuit.Q.append( split_4_sized_object_into_tuple_of_2_size( vars.get(f"original_Q{k}", None) ) ) circuit.yInv.append(vars[f"yInv_{k}"]) circuit.xNegOverY.append(vars[f"xNegOverY_{k}"]) current_points.append( split_4_sized_object_into_tuple_of_2_size(vars.get(f"Q_{k}", None)) ) circuit.create_lines_z_powers(vars["z"], add_extf_power=True) c_0 = vars["c_0"] R_n_minus_2_of_z = vars["R_n_minus_2_of_z"] R_n_minus_1_of_z = vars["R_n_minus_1_of_z"] # Relation n-2 : f * line polynomials prod_k_P_of_z_n_minus_2 = vars["R_n_minus_3_of_z"] # Init line_polynomials = circuit.bn254_finalize_step(current_points) for idx, line_poly in enumerate(line_polynomials): prod_k_P_of_z_n_minus_2 = circuit.mul( prod_k_P_of_z_n_minus_2, circuit.eval_poly_in_precomputed_Z( line_poly, circuit.line_sparsity, f"line_{idx}" ), ) lhs_n_minus_2 = circuit.sub( prod_k_P_of_z_n_minus_2, R_n_minus_2_of_z, comment="((Π(n-2,k) (Pk(z)) - R_n_minus_2(z))", ) # Relation n-1 (last one) : f * w * c_inv_frob_1 * c_frob_2 * c_inv_frob_3 # If groth16 mode : * precomputed_miller_loop_result prod_k_P_of_z_n_minus_1 = circuit.product( [ R_n_minus_2_of_z, vars["c_inv_frob_1_of_z"], vars["c_frob_2_of_z"], vars["c_inv_frob_3_of_z"], vars["w_of_z"], ], ) if self.extra_miller_loop_result: prod_k_P_of_z_n_minus_1 = circuit.mul( prod_k_P_of_z_n_minus_1, vars["precomputed_miller_loop_result_of_z"] ) lhs_n_minus_1 = circuit.sub( prod_k_P_of_z_n_minus_1, R_n_minus_1_of_z, comment="((Π(n-1,k) (Pk(z)) - R_n_minus_1(z))", ) _final_lhs = circuit.add(circuit.mul(c_0, vars["previous_lhs"]), lhs_n_minus_2) final_lhs = circuit.add(circuit.mul(c_0, _final_lhs), lhs_n_minus_1) Q_of_z = circuit.eval_horner(vars["Q"], z=vars["z"], poly_name="big_Q") P_irr, P_irr_sparsity = circuit.write_sparse_constant_elements( get_irreducible_poly(self.curve_id, 12).get_coeffs(), ) P_of_z = circuit.eval_poly_in_precomputed_Z( P_irr, P_irr_sparsity, poly_name="P_irr" ) check = circuit.sub(final_lhs, circuit.mul(Q_of_z, P_of_z)) circuit.extend_struct_output(u384("final_check", elmts=[check])) return circuit class MPCheckFinalizeBLS(BaseFixedG2PointsMPCheck): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 1, n_pairs: int = 3, extra_miller_loop_result: bool = False, ): self.max_q_degree = multi_pairing_check.get_max_Q_degree(curve_id, n_pairs) self.extra_miller_loop_result: bool = extra_miller_loop_result if extra_miller_loop_result: name = f"mp_check_finalize_{n_pairs}P_EXT_MLR" else: name = f"mp_check_finalize_{n_pairs}P" super().__init__( name=name, curve_id=curve_id, n_pairs=n_pairs, n_fixed_g2=None, auto_run=auto_run, compilation_mode=compilation_mode, ) @property def input_map(self): input_map = { "R_n_minus_1_of_z": u384, "c_1": u384, "w_of_z": u384, "z": u384, "c_inv_frob_1_of_z": u384, "previous_lhs": u384, "R_n_minus_2": E12D, "Q": (u384Array, self.max_q_degree + 1), } if self.extra_miller_loop_result: input_map["precomputed_miller_loop_result_of_z"] = u384 return input_map def _execute_circuit_logic(self, circuit: ModuloCircuit, vars) -> ModuloCircuit: if self.curve_id == BN254_ID: return circuit circuit.create_powers_of_Z(vars["z"], max_degree=12) c_1 = vars["c_1"] R_n_minus_1_of_z = vars["R_n_minus_1_of_z"] # Relation n-1 (last one) : f * w * c_inv_frob_1 R_n_minus_2 = vars["R_n_minus_2"] R_n_minus_2_conjugate = circuit.conjugate_e12d(R_n_minus_2) R_n_minus_2_conjugate_of_z = circuit.eval_poly_in_precomputed_Z( R_n_minus_2_conjugate, poly_name="R_n_minus_2_conjugate" ) prod_k_P_of_z_n_minus_1 = circuit.product( [R_n_minus_2_conjugate_of_z, vars["c_inv_frob_1_of_z"], vars["w_of_z"]] ) if self.extra_miller_loop_result: prod_k_P_of_z_n_minus_1 = circuit.mul( prod_k_P_of_z_n_minus_1, vars["precomputed_miller_loop_result_of_z"] ) lhs_n_minus_1 = circuit.sub( prod_k_P_of_z_n_minus_1, R_n_minus_1_of_z, comment="(Π(n-1,k) (Pk(z)) - R_n_minus_1(z))", ) final_lhs = circuit.add( circuit.mul(c_1, vars["previous_lhs"]), lhs_n_minus_1, comment="c_1 * previous_lhs + lhs_n_minus_1", ) P_irr, P_irr_sparsity = circuit.write_sparse_constant_elements( get_irreducible_poly(self.curve_id, 12).get_coeffs() ) P_of_z = circuit.eval_poly_in_precomputed_Z( P_irr, P_irr_sparsity, poly_name="P_irr" ) Q_of_z = circuit.eval_horner(vars["Q"], vars["z"], poly_name="big_Q") check = circuit.sub( final_lhs, circuit.mul(Q_of_z, P_of_z, comment="Q(z) * P(z)"), comment="final_lhs - Q(z) * P(z)", ) circuit.extend_struct_output(u384("final_check", elmts=[check])) return circuit class MPCheckPreparePairs(BaseFixedG2PointsMPCheck): """ This circuit is used to prepare points for the multi-pairing check. For BN curve, it will compute yInv and xNegOverY for each point + negate the y of the G2 point. For BLS curve, it will only compute yInv and xNegOverY for each point. """ def __init__( self, curve_id: int, n_pairs: int = 0, auto_run: bool = True, compilation_mode: int = 1, ): assert compilation_mode == 1, "Compilation mode 1 is required for this circuit" self.n_pairs = n_pairs super().__init__( name=f"mp_check_prepare_pairs_{n_pairs}P", curve_id=curve_id, n_pairs=n_pairs, n_fixed_g2=None, auto_run=auto_run, compilation_mode=compilation_mode, ) self.generic_over_curve = True @property def input_map(self): input_map = {} for i in range(self.n_pairs): input_map[f"p_{i}"] = G1PointCircuit if self.curve_id == BN254_ID: input_map[f"Qy0_{i}"] = u384 input_map[f"Qy1_{i}"] = u384 return input_map def _initialize_circuit(self): return multi_pairing_check.MultiMillerLoopCircuit( self.name, self.curve_id, n_pairs=self.n_pairs, compilation_mode=self.compilation_mode, ) def _execute_circuit_logic(self, circuit, vars) -> ModuloCircuit: n_pairs = self.n_pairs for i in range(n_pairs): p = vars[f"p_{i}"] x, y = p yInv = circuit.inv(y) xNegOverY = circuit.neg(circuit.mul(x, yInv)) if self.curve_id == BN254_ID: Qy0 = vars[f"Qy0_{i}"] Qy1 = vars[f"Qy1_{i}"] Qyneg0 = circuit.neg(Qy0) Qyneg1 = circuit.neg(Qy1) circuit.extend_struct_output( BNProcessedPair( name=f"p_{i}", elmts=[yInv, xNegOverY, Qyneg0, Qyneg1] ) ) else: circuit.extend_struct_output( BLSProcessedPair(name=f"p_{i}", elmts=[yInv, xNegOverY]) ) return circuit class InitializeMPCheck(BaseFixedG2PointsMPCheck): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 1, extra_miller_loop_result: bool = False, ): assert compilation_mode == 1, "Compilation mode 1 is required for this circuit" self.extra_miller_loop_result: bool = extra_miller_loop_result if extra_miller_loop_result: name = "initialize_mpcheck_ext_mlr" else: name = "initialize_mpcheck" super().__init__( name=name, curve_id=curve_id, n_pairs=2, # Mocked value, not used in practice. n_fixed_g2=None, auto_run=auto_run, compilation_mode=compilation_mode, ) @property def input_map(self): input_map = { "lambda_root" if self.curve_id == BN254_ID else "lambda_root_inverse": E12D, "z": u384, "scaling_factor": MillerLoopResultScalingFactor, } if self.curve_id == BN254_ID: input_map.update( { "c_inv": E12D, } ) if self.extra_miller_loop_result: input_map["precomputed_miller_loop_result"] = E12D return input_map def _execute_circuit_logic( self, circuit: multi_pairing_check.MultiPairingCheckCircuit, vars ): circuit.create_powers_of_Z(Z=vars["z"], max_degree=11) if self.curve_id == BLS12_381_ID: self._execute_bls12_381_logic(circuit, vars) elif self.curve_id == BN254_ID: self._execute_bn254_logic(circuit, vars) # Handle shared scaling factor computation (always executed after curve-specific c/c_inv logic) self._execute_shared_logic(circuit, vars) # Continue with curve-specific frobenius operations if self.curve_id == BLS12_381_ID: self._execute_bls12_381_frobenius_logic(circuit, vars) elif self.curve_id == BN254_ID: self._execute_bn254_frobenius_logic(circuit, vars) if self.extra_miller_loop_result: precomputed_miller_loop_result = vars["precomputed_miller_loop_result"] precomputed_miller_loop_result_of_z = circuit.eval_poly_in_precomputed_Z( precomputed_miller_loop_result, poly_name="precomputed_miller_loop_result", ) circuit.extend_struct_output( u384( "precomputed_miller_loop_result_of_z", elmts=[precomputed_miller_loop_result_of_z], ) ) return circuit def _execute_bls12_381_logic( self, circuit: multi_pairing_check.MultiPairingCheckCircuit, vars ): """Handle BLS12-381 specific logic with c_inverse - first part.""" # Get lambda_root_inverse (c_inverse for BLS12-381) lambda_root_inverse = vars["lambda_root_inverse"] # Conjugate c_inverse for BLS12-381 self.c_inv = circuit.conjugate_e12d(lambda_root_inverse) # Evaluate c_inverse polynomial at z c_inv_of_z = circuit.eval_poly_in_precomputed_Z(self.c_inv, poly_name="C_inv") circuit.extend_struct_output(u384(name="c_inv_of_z", elmts=[c_inv_of_z])) def _execute_bn254_logic( self, circuit: multi_pairing_check.MultiPairingCheckCircuit, vars ): """Handle BN254 specific logic with c (lambda_root) - first part.""" # Get lambda_root (c for BN254) lambda_root = vars["lambda_root"] self.c = lambda_root # Evaluate c polynomial at z self.c_of_z = circuit.eval_poly_in_precomputed_Z(self.c, poly_name="C") circuit.extend_struct_output(u384(name="c_of_z", elmts=[self.c_of_z])) def _execute_shared_logic( self, circuit: multi_pairing_check.MultiPairingCheckCircuit, vars ): """Handle shared scaling factor computation for both curves.""" scaling_factor_sparsity = [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0] scaling_factor_compressed = vars["scaling_factor"] scaling_factor = [ scaling_factor_compressed[0], None, scaling_factor_compressed[1], None, scaling_factor_compressed[2], None, scaling_factor_compressed[3], None, scaling_factor_compressed[4], None, scaling_factor_compressed[5], None, ] scaling_factor_of_z = circuit.eval_poly_in_precomputed_Z( scaling_factor, sparsity=scaling_factor_sparsity, poly_name="W" ) circuit.extend_struct_output( u384("scaling_factor_of_z", elmts=[scaling_factor_of_z]) ) def _execute_bls12_381_frobenius_logic( self, circuit: multi_pairing_check.MultiPairingCheckCircuit, vars ): """Handle BLS12-381 specific frobenius logic - second part.""" # Compute frobenius of c_inverse c_inv_frob_1 = circuit.frobenius(self.c_inv, 1) c_inv_frob_1_conjugate = circuit.conjugate_e12d(c_inv_frob_1) c_inv_frob_1_conjugate_of_z = circuit.eval_poly_in_precomputed_Z( c_inv_frob_1_conjugate, poly_name="C_inv_frob_1" ) circuit.extend_struct_output( u384("c_inv_frob_1_conjugate_of_z", elmts=[c_inv_frob_1_conjugate_of_z]) ) def _execute_bn254_frobenius_logic( self, circuit: multi_pairing_check.MultiPairingCheckCircuit, vars ): """Handle BN254 specific frobenius logic - second part.""" # Additional BN254-specific variables c_inv = vars["c_inv"] # Evaluate c_inverse polynomial at z c_inv_of_z = circuit.eval_poly_in_precomputed_Z(c_inv, poly_name="C_inv") circuit.extend_struct_output(u384(name="c_inv_of_z", elmts=[c_inv_of_z])) # Compute lhs = c^0 * (c_of_z * c_inv_of_z - 1) (c^0=1) lhs = circuit.sub( circuit.mul(self.c_of_z, c_inv_of_z), circuit.set_or_get_constant(1), comment="c_of_z * c_inv_of_z - 1", ) circuit.extend_struct_output(u384("lhs", elmts=[lhs])) # Compute frobenius operations for BN254 c_inv_frob_1 = circuit.frobenius(c_inv, 1) c_frob_2 = circuit.frobenius(self.c, 2) c_inv_frob_3 = circuit.frobenius(c_inv, 3) c_inv_frob_1_of_z = circuit.eval_poly_in_precomputed_Z( c_inv_frob_1, poly_name="C_inv_frob_1" ) c_frob_2_of_z = circuit.eval_poly_in_precomputed_Z( c_frob_2, poly_name="C_frob_2" ) c_inv_frob_3_of_z = circuit.eval_poly_in_precomputed_Z( c_inv_frob_3, poly_name="C_inv_frob_3" ) circuit.extend_struct_output( u384("c_inv_frob_1_of_z", elmts=[c_inv_frob_1_of_z]) ) circuit.extend_struct_output(u384("c_frob_2_of_z", elmts=[c_frob_2_of_z])) circuit.extend_struct_output( u384("c_inv_frob_3_of_z", elmts=[c_inv_frob_3_of_z]) ) class FP12MulAssertOne(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__( "fp12_mul_assert_one", curve_id, auto_run, init_hash, compilation_mode ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(12)]) # X input.extend([self.field.random() for _ in range(12)]) # Y input.extend([self.field.random() for _ in range(11)]) # Q # R is known to be 1. input.append(self.field.random()) # z return input def _run_circuit_inner(self, input: list[PyFelt]) -> ExtensionFieldModuloCircuit: circuit = ExtensionFieldModuloCircuit( self.name, self.curve_id, extension_degree=12, init_hash=self.init_hash, compilation_mode=self.compilation_mode, ) X = circuit.write_struct(E12D("X", elmts=[input.pop(0) for _ in range(12)])) Y = circuit.write_struct(E12D("Y", elmts=[input.pop(0) for _ in range(12)])) Q = circuit.write_struct( structs.E12DMulQuotient("Q", elmts=[input.pop(0) for _ in range(11)]) ) assert len(input) == 1 z = circuit.write_struct(u384("z", elmts=[input.pop(0)])) assert len(input) == 0 circuit.create_powers_of_Z(z, max_degree=12) P_irr, P_irr_sparsity = circuit.write_sparse_constant_elements( get_irreducible_poly(self.curve_id, 12).get_coeffs(), ) P_of_z = circuit.eval_poly_in_precomputed_Z( P_irr, P_irr_sparsity, poly_name="P_irr" ) Q_of_z = circuit.eval_poly_in_precomputed_Z(Q, poly_name="Q") R_of_z = circuit.set_or_get_constant(1) X_of_z = circuit.eval_poly_in_precomputed_Z(X, poly_name="X") Y_of_z = circuit.eval_poly_in_precomputed_Z(Y, poly_name="Y") check = circuit.sub( circuit.mul(X_of_z, Y_of_z, comment="X(z) * Y(z)"), circuit.mul(Q_of_z, P_of_z, comment="Q(z) * P(z)"), comment="(X(z) * Y(z)) - (Q(z) * P(z))", ) check = circuit.sub(check, R_of_z, comment="(X(z) * Y(z) - Q(z) * P(z)) - 1") circuit.extend_struct_output(u384("check", elmts=[check])) return circuit class EvalE12D(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__("eval_e12d", curve_id, auto_run, init_hash, compilation_mode) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(12)]) # X input.append(self.field.random()) # z return input def _run_circuit_inner(self, input: list[PyFelt]) -> ExtensionFieldModuloCircuit: circuit = ExtensionFieldModuloCircuit( self.name, self.curve_id, extension_degree=12, init_hash=self.init_hash, compilation_mode=self.compilation_mode, ) X = circuit.write_struct(E12D("f", elmts=[input.pop(0) for _ in range(12)])) z = circuit.write_struct(u384("z", elmts=[input.pop(0)])) X_of_z = circuit.eval_horner(X, z, poly_name="X") circuit.extend_struct_output(u384("f_of_z", elmts=[X_of_z])) return circuit ================================================ FILE: hydra/garaga/precompiled_circuits/compilable_circuits/cairo1_tower_pairing.py ================================================ from abc import ABC, abstractmethod from typing import Dict, List, Optional, Tuple, Type, Union import garaga.modulo_circuit_structs as structs from garaga.curves import BLS12_381_ID from garaga.modulo_circuit import ModuloCircuit, PyFelt from garaga.modulo_circuit_structs import ( Cairo1SerializableStruct, G2Line, G2PointCircuit, u384, u384Array, ) from garaga.precompiled_circuits.compilable_circuits.base import ( BaseEXTFCircuit, BaseModuloCircuit, ) from garaga.precompiled_circuits.miller_tower import MillerTowerCircuit def split_4_sized_object_into_tuple_of_2_size( input: Union[List[PyFelt], Tuple[PyFelt, PyFelt, PyFelt, PyFelt]], ) -> Optional[Tuple[List[PyFelt], List[PyFelt]]]: if input is None: return None assert len(input) == 4, f"Expected input of length 4, got {len(input)}" return (list(input[0:2]), list(input[2:4])) def parse_precomputed_g1_consts_and_g2_points( circuit: MillerTowerCircuit, vars: dict, n_pairs: int, bit_1: bool = False, ) -> list[tuple[list[PyFelt], list[PyFelt]]]: current_points = [] q_or_q_neg_points = [] if bit_1 else None for i in range(n_pairs): circuit.yInv.append(vars[f"yInv_{i}"]) circuit.xNegOverY.append(vars[f"xNegOverY_{i}"]) current_points.append( split_4_sized_object_into_tuple_of_2_size(vars.get(f"Q_{i}", None)) ) # Return empty list if not present if bit_1: q_or_q_neg_points.append( split_4_sized_object_into_tuple_of_2_size( vars.get(f"Q_or_Q_neg_{i}", None) ) # Return empty list if not present ) return current_points, q_or_q_neg_points class BaseTowerMillerLoop(BaseEXTFCircuit, ABC): def __init__( self, name, curve_id, auto_run=True, compilation_mode=1, n_pairs: int = 1, ): assert compilation_mode == 1, "Compilation mode 1 is required for this circuit" self.n_pairs = n_pairs super().__init__( name=name, curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) self.generic_over_curve = True def _initialize_circuit(self): return MillerTowerCircuit( self.name, self.curve_id, n_pairs=self.n_pairs, compilation_mode=self.compilation_mode, ) @property @abstractmethod def input_map( self, ) -> Dict[ str, Union[ Type[Cairo1SerializableStruct], Tuple[Type[Cairo1SerializableStruct], int] ], ]: """ Define the input map for the circuit in a dict. The key will be the name of the input variable, also used in the signature of the compiled Cairo code. The value will be either a Cairo1SerializableStruct type (which defines the struct in the Cairo code), or a tuple of the type and its size (for Array-like types). The reason behind this is that each Cairo1SerializableStruct defines the __len__ method, but for the array-like structs we need to specify the size in advance. """ def _base_input_map(self, bit_type: str) -> dict: """ Base input map for the bit 0 and 1 """ input_map = {} for k in range(self.n_pairs): input_map[f"yInv_{k}"] = u384 input_map[f"xNegOverY_{k}"] = u384 input_map[f"Q_{k}"] = G2PointCircuit if bit_type == "1": input_map[f"Q_or_Q_neg_{k}"] = G2PointCircuit # Add common inputs input_map["M_i"] = structs.E12T return input_map def _process_input(self, circuit: MillerTowerCircuit, input: list[PyFelt]) -> dict: """ Method responsible for deserializing the input list of elements into the variables in the input map, and writing them to the circuit. The input list is expected to be in the same order as the input map. Since we use Python 3.10, the input map dict is ordered. Returns a vars dict with the same keys as the input map, but with the values being the instances of the structs, each struct holding ModuloCircuitElement(s). """ vars = {} for name, struct_info in self.input_map.items(): if isinstance(struct_info, tuple) and struct_info[0] == u384Array: # Handle u384Array with specified size struct_type, size = struct_info vars[name] = circuit.write_struct( struct_type(name, elmts=[input.pop(0) for _ in range(size)]) ) elif struct_info == G2Line: # Internally appended to the precomputed_lines flattened list circuit.precomputed_lines.extend( circuit.write_struct( G2Line(name, elmts=[input.pop(0) for _ in range(4)]) ) ) else: struct_type = struct_info # For other types, create a temporary instance to get its length temp_instance = struct_type( name, None ) # Temporary instance with a dummy element size = len(temp_instance) if size == 1: vars[name] = circuit.write_struct( struct_type(name, elmts=[input.pop(0)]) ) else: # Convert to tuple so that it is Hashable vars[name] = tuple( circuit.write_struct( struct_type(name, elmts=[input.pop(0) for _ in range(size)]) ) ) assert len(input) == 0, f"Expected input of length 0, got {len(input)}" # Create the precomputed lines generator circuit._precomputed_lines_generator = ( circuit._create_precomputed_lines_generator() ) return vars def build_input(self) -> list[PyFelt]: """ Extends the base method of BaseModuloCircuit, by reading the input map and returning a list of random elements of the total expected size. """ total_elements = 0 for name, struct_info in self.input_map.items(): if isinstance(struct_info, tuple): # Array-like case _, size = struct_info total_elements += size else: # For other structs, create a temporary instance to get its length temp_instance = struct_info(name, None) total_elements += len(temp_instance) return [self.field.random() for _ in range(total_elements)] def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = self._initialize_circuit() vars = self._process_input(circuit, input) return self._execute_circuit_logic(circuit, vars) @abstractmethod def _execute_circuit_logic(self, circuit, vars) -> ModuloCircuit: """ Implement the circuit logic using the processed input variables. """ def _execute_circuit_bit_logic_base( self, circuit: MillerTowerCircuit, vars, bit_type ): n_pairs = self.n_pairs assert n_pairs >= 1, f"n_pairs must be >= 1, got {n_pairs}" current_points, q_or_q_neg_points = parse_precomputed_g1_consts_and_g2_points( circuit, vars, n_pairs, bit_1=(bit_type == "1") ) Mi_sq = circuit.fp12_square(vars["M_i"]) new_points, Mi_plus_one = self._process_points( circuit, current_points, q_or_q_neg_points, Mi_sq, bit_type ) self._extend_output(circuit, new_points, Mi_plus_one) return circuit def _process_points( self, circuit: MillerTowerCircuit, current_points, q_or_q_neg_points, sum_i_prod_k_P, bit_type, ): new_points = [] if bit_type == "0": for k in range(self.n_pairs): T, (lineR0, lineR1) = circuit._double(current_points[k], k) line = circuit.eval_tower_line( lineR0 + lineR1, circuit.yInv[k], circuit.xNegOverY[k] ) sum_i_prod_k_P = self._multiply_line_evaluations( circuit, sum_i_prod_k_P, [line], k ) new_points.append(T) elif bit_type == "1": for k in range(self.n_pairs): # T, l1, l2 = circuit.double_and_add_step( # current_points[k], q_or_q_neg_points[k], k # ) T, (line1R0, line1R1), (line2R0, line2R1) = circuit._double_and_add( current_points[k], q_or_q_neg_points[k], k ) line1 = circuit.eval_tower_line( line1R0 + line1R1, circuit.yInv[k], circuit.xNegOverY[k] ) line2 = circuit.eval_tower_line( line2R0 + line2R1, circuit.yInv[k], circuit.xNegOverY[k] ) sum_i_prod_k_P = self._multiply_line_evaluations( circuit, sum_i_prod_k_P, [line1, line2], k ) new_points.append(T) return new_points, sum_i_prod_k_P def _multiply_line_evaluations( self, circuit: MillerTowerCircuit, sum_i_prod_k_P, lines, k, ): for i, l in enumerate(lines): sum_i_prod_k_P = circuit.mul_by_line_tower(sum_i_prod_k_P, l) return sum_i_prod_k_P def _extend_output(self, circuit: ModuloCircuit, new_points, Mi_plus_one): circuit.exact_output_refs_needed = [] for i, point in enumerate(new_points): sum_coords = circuit.sum( [point[0][0], point[0][1], point[1][0], point[1][1]] ) circuit.exact_output_refs_needed.append(sum_coords) circuit.extend_struct_output( G2PointCircuit( name=f"Q{i}", elmts=[ point[0][0], point[0][1], point[1][0], point[1][1], ], ) ) circuit.extend_struct_output( structs.E12T(name="Mi_plus_one", elmts=Mi_plus_one) ) circuit.exact_output_refs_needed.extend(Mi_plus_one) class TowerMillerBit0(BaseTowerMillerLoop): def __init__( self, curve_id: int, n_pairs: int, auto_run: bool = True, compilation_mode: int = 1, ): super().__init__( name=f"tower_miller_bit0_{n_pairs}P", curve_id=curve_id, n_pairs=n_pairs, auto_run=auto_run, compilation_mode=compilation_mode, ) @property def input_map(self): return self._base_input_map("0") def _execute_circuit_logic(self, circuit, vars) -> ModuloCircuit: return self._execute_circuit_bit_logic_base(circuit, vars, "0") class TowerMillerBit1(BaseTowerMillerLoop): def __init__( self, curve_id: int, auto_run: bool = True, n_pairs: int = 1, compilation_mode: int = 1, ): assert compilation_mode == 1, "Compilation mode 1 is required for this circuit" super().__init__( name=f"tower_miller_bit1_{n_pairs}P", curve_id=curve_id, n_pairs=n_pairs, auto_run=auto_run, compilation_mode=compilation_mode, ) @property def input_map(self): return self._base_input_map("1") def _execute_circuit_logic(self, circuit, vars) -> ModuloCircuit: return self._execute_circuit_bit_logic_base(circuit, vars, "1") class TowerMillerInitBit(BaseTowerMillerLoop): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 1, n_pairs: int = 3, ): super().__init__( name=f"tower_miller_init_bit_{n_pairs}P", curve_id=curve_id, n_pairs=n_pairs, auto_run=auto_run, compilation_mode=compilation_mode, ) @property def input_map(self): if self.curve_id == BLS12_381_ID: input_map = {} for k in range(self.n_pairs): input_map[f"yInv_{k}"] = u384 input_map[f"xNegOverY_{k}"] = u384 input_map[f"Q_{k}"] = G2PointCircuit return input_map else: raise NotImplementedError(f"Curve {self.curve_id} not implemented") def _execute_circuit_logic( self, circuit: MillerTowerCircuit, vars ) -> ModuloCircuit: n_pairs = self.n_pairs assert n_pairs == 1, f"Only implemented for 1 pair for now, got {n_pairs}" current_points, q_or_q_neg_points = parse_precomputed_g1_consts_and_g2_points( circuit, vars, n_pairs, bit_1=False ) new_points = [] for k in range(self.n_pairs): T, (line1R0, line1R1), (line2R0, line2R1) = circuit._triple( current_points[k], k ) line1 = circuit.eval_tower_line( line1R0 + line1R1, circuit.yInv[k], circuit.xNegOverY[k] ) line2 = circuit.eval_tower_line( line2R0 + line2R1, circuit.yInv[k], circuit.xNegOverY[k] ) # result.C0.B0 = prodLines[0] # result.C0.B1 = prodLines[1] # result.C0.B2 = prodLines[2] # result.C1.B1 = prodLines[3] # result.C1.B2 = prodLines[4] ll = circuit.mul_line_by_line_tower(line1, line2) new_points.append(T) for i, point in enumerate(new_points): circuit.extend_struct_output( G2PointCircuit( name=f"Q{i}", elmts=[ point[0][0], point[0][1], point[1][0], point[1][1], ], ) ) circuit.extend_struct_output(structs.u384(name="c0b0a0", elmts=[ll[0]])) circuit.extend_struct_output(structs.u384(name="c0b0a1", elmts=[ll[1]])) circuit.extend_struct_output(structs.u384(name="c0b1a0", elmts=[ll[2]])) circuit.extend_struct_output(structs.u384(name="c0b1a1", elmts=[ll[3]])) circuit.extend_struct_output(structs.u384(name="c0b2a0", elmts=[ll[4]])) circuit.extend_struct_output(structs.u384(name="c0b2a1", elmts=[ll[5]])) circuit.extend_struct_output(structs.u384(name="c1b1a0", elmts=[ll[6]])) circuit.extend_struct_output(structs.u384(name="c1b1a1", elmts=[ll[7]])) circuit.extend_struct_output(structs.u384(name="c1b2a0", elmts=[ll[8]])) circuit.extend_struct_output(structs.u384(name="c1b2a1", elmts=[ll[9]])) return circuit class TowerMillerFinalizeBN(BaseTowerMillerLoop): def __init__( self, curve_id: int, auto_run: bool = True, n_pairs: int = 1, compilation_mode: int = 1, ): super().__init__( name=f"tower_miller_finalize_bn_{n_pairs}P", curve_id=curve_id, n_pairs=n_pairs, auto_run=auto_run, compilation_mode=compilation_mode, ) @property def input_map(self): if self.curve_id == BLS12_381_ID: return {} input_map = {} for i in range(self.n_pairs): input_map[f"original_Q{i}"] = G2PointCircuit input_map[f"yInv_{i}"] = u384 input_map[f"xNegOverY_{i}"] = u384 input_map[f"Q_{i}"] = G2PointCircuit input_map["Mi"] = structs.E12T return input_map def _execute_circuit_logic(self, circuit: MillerTowerCircuit, vars): if self.curve_id == BLS12_381_ID: return circuit n_pairs = self.n_pairs current_points = [] for k in range(n_pairs): circuit.Q.append( split_4_sized_object_into_tuple_of_2_size( vars.get(f"original_Q{k}", None) ) ) circuit.yInv.append(vars[f"yInv_{k}"]) circuit.xNegOverY.append(vars[f"xNegOverY_{k}"]) current_points.append( split_4_sized_object_into_tuple_of_2_size(vars.get(f"Q_{k}", None)) ) Mi = vars["Mi"] lines = circuit._bn254_finalize_step(current_points) for l in lines: (l1r0, l1r1), (l2r0, l2r1) = l l1_eval = circuit.eval_tower_line( l1r0 + l1r1, circuit.yInv[k], circuit.xNegOverY[k] ) l2_eval = circuit.eval_tower_line( l2r0 + l2r1, circuit.yInv[k], circuit.xNegOverY[k] ) ll = circuit.mul_line_by_line_tower(l1_eval, l2_eval) ll_full = ll + [ circuit.set_or_get_constant(0), circuit.set_or_get_constant(0), ] Mi = circuit.fp12_mul(Mi, ll_full) circuit.extend_struct_output(structs.E12T("Mi", elmts=Mi)) return circuit class E12TMulCircuit(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__("e12t_mul", curve_id, auto_run, init_hash, compilation_mode) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(12)]) # X input.extend([self.field.random() for _ in range(12)]) # Y return input def _run_circuit_inner(self, input: list[PyFelt]) -> MillerTowerCircuit: circuit = MillerTowerCircuit(self.name, self.curve_id, n_pairs=None) X = circuit.write_struct( structs.E12T("X", elmts=[input.pop(0) for _ in range(12)]) ) Y = circuit.write_struct( structs.E12T("Y", elmts=[input.pop(0) for _ in range(12)]) ) res = circuit.fp12_mul(X, Y) circuit.extend_struct_output(structs.E12T("res", elmts=res)) return circuit class FP6NegCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 1, ): super().__init__("fp6_neg", curve_id, auto_run, compilation_mode) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(6)]) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ModuloCircuit( self.name, self.curve_id, generic_circuit=True, compilation_mode=self.compilation_mode, ) fp6 = [ circuit.write_struct(structs.u384(name="b0a0", elmts=[input.pop(0)])), circuit.write_struct(structs.u384(name="b0a1", elmts=[input.pop(0)])), circuit.write_struct(structs.u384(name="b1a0", elmts=[input.pop(0)])), circuit.write_struct(structs.u384(name="b1a1", elmts=[input.pop(0)])), circuit.write_struct(structs.u384(name="b2a0", elmts=[input.pop(0)])), circuit.write_struct(structs.u384(name="b2a1", elmts=[input.pop(0)])), ] res = [circuit.neg(fp6[i]) for i in range(6)] circuit.extend_struct_output(structs.u384(name="r0", elmts=[res[0]])) circuit.extend_struct_output(structs.u384(name="r1", elmts=[res[1]])) circuit.extend_struct_output(structs.u384(name="r2", elmts=[res[2]])) circuit.extend_struct_output(structs.u384(name="r3", elmts=[res[3]])) circuit.extend_struct_output(structs.u384(name="r4", elmts=[res[4]])) circuit.extend_struct_output(structs.u384(name="r5", elmts=[res[5]])) return circuit class E12TInverseCircuit(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__( "e12t_inverse", curve_id, auto_run, init_hash, compilation_mode ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(12)]) # M return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = MillerTowerCircuit(self.name, self.curve_id, n_pairs=None) M = circuit.write_struct( structs.E12T("M", elmts=[input.pop(0) for _ in range(12)]) ) res = circuit.fp12_inverse(M) circuit.extend_struct_output(structs.E12T("res", elmts=res)) return circuit class E12TFrobeniusCircuit(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 1, ): super().__init__( "e12t_frobenius", curve_id, auto_run, init_hash, compilation_mode ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(12)]) # M return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = MillerTowerCircuit(self.name, self.curve_id, n_pairs=None) M = circuit.write_struct( structs.E12T("M", elmts=[input.pop(0) for _ in range(12)]) ) res = circuit.fp12_frob(M) circuit.extend_struct_output(structs.E12T("res", elmts=res)) return circuit class E12TFrobeniusSquareCircuit(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__( "e12t_frobenius_square", curve_id, auto_run, init_hash, compilation_mode ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(12)]) # M return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = MillerTowerCircuit(self.name, self.curve_id, n_pairs=None) M = circuit.write_struct( structs.E12T("M", elmts=[input.pop(0) for _ in range(12)]) ) res = circuit.fp12_frob_square(M) circuit.extend_struct_output(structs.E12T("res", elmts=res)) return circuit class E12TFrobeniusCubeCircuit(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__( "e12t_frobenius_cube", curve_id, auto_run, init_hash, compilation_mode ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(12)]) # M return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = MillerTowerCircuit(self.name, self.curve_id, n_pairs=None) M = circuit.write_struct( structs.E12T("M", elmts=[input.pop(0) for _ in range(12)]) ) res = circuit.fp12_frob_cube(M) circuit.extend_struct_output(structs.E12T("res", elmts=res)) return circuit class E12TCyclotomicSquareCircuit(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__( "e12t_cyclotomic_square", curve_id, auto_run, init_hash, compilation_mode ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(12)]) # M return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = MillerTowerCircuit(self.name, self.curve_id, n_pairs=None) M = circuit.write_struct( structs.E12T("M", elmts=[input.pop(0) for _ in range(12)]) ) res = circuit.fp12_cyclotomic_square(M) circuit.extend_struct_output(structs.E12T("res", elmts=res)) return circuit class E12TCyclotomicSquareCompressedCircuit(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__( "e12t_cyclo_square_compressed", curve_id, auto_run, init_hash, compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(8)]) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = MillerTowerCircuit(self.name, self.curve_id, n_pairs=None) xc0b1a0 = circuit.write_struct( structs.u384(name="xc0b1a0", elmts=[input.pop(0)]) ) xc0b1a1 = circuit.write_struct( structs.u384(name="xc0b1a1", elmts=[input.pop(0)]) ) xc0b2a0 = circuit.write_struct( structs.u384(name="xc0b2a0", elmts=[input.pop(0)]) ) xc0b2a1 = circuit.write_struct( structs.u384(name="xc0b2a1", elmts=[input.pop(0)]) ) xc1b0a0 = circuit.write_struct( structs.u384(name="xc1b0a0", elmts=[input.pop(0)]) ) xc1b0a1 = circuit.write_struct( structs.u384(name="xc1b0a1", elmts=[input.pop(0)]) ) xc1b2a0 = circuit.write_struct( structs.u384(name="xc1b2a0", elmts=[input.pop(0)]) ) xc1b2a1 = circuit.write_struct( structs.u384(name="xc1b2a1", elmts=[input.pop(0)]) ) res = circuit.fp12_cyclotomic_square_compressed( [xc0b1a0, xc0b1a1], [xc0b2a0, xc0b2a1], [xc1b0a0, xc1b0a1], [xc1b2a0, xc1b2a1], ) assert len(res) == 8 circuit.extend_struct_output(structs.u384(name="xc0b1a0", elmts=[res[0]])) circuit.extend_struct_output(structs.u384(name="xc0b1a1", elmts=[res[1]])) circuit.extend_struct_output(structs.u384(name="xc0b2a0", elmts=[res[2]])) circuit.extend_struct_output(structs.u384(name="xc0b2a1", elmts=[res[3]])) circuit.extend_struct_output(structs.u384(name="xc1b0a0", elmts=[res[4]])) circuit.extend_struct_output(structs.u384(name="xc1b0a1", elmts=[res[5]])) circuit.extend_struct_output(structs.u384(name="xc1b2a0", elmts=[res[6]])) circuit.extend_struct_output(structs.u384(name="xc1b2a1", elmts=[res[7]])) return circuit class E12TDecompressKarabinaPtIZCircuit(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__( "e12t_decomp_karabina_I_Z", curve_id, auto_run, init_hash, compilation_mode ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(4)]) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = MillerTowerCircuit(self.name, self.curve_id, n_pairs=None) xc0b1a0 = circuit.write_struct( structs.u384(name="xc0b1a0", elmts=[input.pop(0)]) ) xc0b1a1 = circuit.write_struct( structs.u384(name="xc0b1a1", elmts=[input.pop(0)]) ) xc1b2a0 = circuit.write_struct( structs.u384(name="xc1b2a0", elmts=[input.pop(0)]) ) xc1b2a1 = circuit.write_struct( structs.u384(name="xc1b2a1", elmts=[input.pop(0)]) ) res = circuit.fp12_decompress_karabina_pt_I_c1b2_Z( [xc0b1a0, xc0b1a1], [xc1b2a0, xc1b2a1] ) circuit.extend_struct_output(structs.u384(name="res0", elmts=[res[0]])) circuit.extend_struct_output(structs.u384(name="res1", elmts=[res[1]])) return circuit class E12TDecompressKarabinaPtINZCircuit(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__( "e12t_decomp_karabina_I_NZ", curve_id, auto_run, init_hash, compilation_mode ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(8)]) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = MillerTowerCircuit(self.name, self.curve_id, n_pairs=None) xc0b1a0 = circuit.write_struct( structs.u384(name="xc0b1a0", elmts=[input.pop(0)]) ) xc0b1a1 = circuit.write_struct( structs.u384(name="xc0b1a1", elmts=[input.pop(0)]) ) xc0b2a0 = circuit.write_struct( structs.u384(name="xc0b2a0", elmts=[input.pop(0)]) ) xc0b2a1 = circuit.write_struct( structs.u384(name="xc0b2a1", elmts=[input.pop(0)]) ) xc1b0a0 = circuit.write_struct( structs.u384(name="xc1b0a0", elmts=[input.pop(0)]) ) xc1b0a1 = circuit.write_struct( structs.u384(name="xc1b0a1", elmts=[input.pop(0)]) ) xc1b2a0 = circuit.write_struct( structs.u384(name="xc1b2a0", elmts=[input.pop(0)]) ) xc1b2a1 = circuit.write_struct( structs.u384(name="xc1b2a1", elmts=[input.pop(0)]) ) t0, t1 = circuit.fp12_decompress_karabina_pt_I_c1b2_NZ( [xc0b1a0, xc0b1a1], [xc0b2a0, xc0b2a1], [xc1b0a0, xc1b0a1], [xc1b2a0, xc1b2a1], ) circuit.extend_struct_output(structs.u384(name="t0a0", elmts=[t0[0]])) circuit.extend_struct_output(structs.u384(name="t0a1", elmts=[t0[1]])) circuit.extend_struct_output(structs.u384(name="t1a0", elmts=[t1[0]])) circuit.extend_struct_output(structs.u384(name="t1a1", elmts=[t1[1]])) return circuit class E12TDecompressKarabinaPtIICircuit(BaseEXTFCircuit): def __init__( self, curve_id: int, auto_run: bool = True, init_hash: int = None, compilation_mode: int = 0, ): super().__init__( "e12t_decomp_karabina_II", curve_id, auto_run, init_hash, compilation_mode ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(12)]) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = MillerTowerCircuit(self.name, self.curve_id, n_pairs=None) t0a0 = circuit.write_struct(structs.u384(name="t0a0", elmts=[input.pop(0)])) t0a1 = circuit.write_struct(structs.u384(name="t0a1", elmts=[input.pop(0)])) t1a0 = circuit.write_struct(structs.u384(name="t1a0", elmts=[input.pop(0)])) t1a1 = circuit.write_struct(structs.u384(name="t1a1", elmts=[input.pop(0)])) xc0b1a0 = circuit.write_struct( structs.u384(name="xc0b1a0", elmts=[input.pop(0)]) ) xc0b1a1 = circuit.write_struct( structs.u384(name="xc0b1a1", elmts=[input.pop(0)]) ) xc0b2a0 = circuit.write_struct( structs.u384(name="xc0b2a0", elmts=[input.pop(0)]) ) xc0b2a1 = circuit.write_struct( structs.u384(name="xc0b2a1", elmts=[input.pop(0)]) ) xc1b0a0 = circuit.write_struct( structs.u384(name="xc1b0a0", elmts=[input.pop(0)]) ) xc1b0a1 = circuit.write_struct( structs.u384(name="xc1b0a1", elmts=[input.pop(0)]) ) xc1b2a0 = circuit.write_struct( structs.u384(name="xc1b2a0", elmts=[input.pop(0)]) ) xc1b2a1 = circuit.write_struct( structs.u384(name="xc1b2a1", elmts=[input.pop(0)]) ) zc0b0, zc1b1 = circuit.fp12_decompress_karabina_pt_II( [t0a0, t0a1], [t1a0, t1a1], [xc0b1a0, xc0b1a1], [xc0b2a0, xc0b2a1], [xc1b0a0, xc1b0a1], [xc1b2a0, xc1b2a1], ) circuit.extend_struct_output(structs.u384(name="zc0b0a0", elmts=[zc0b0[0]])) circuit.extend_struct_output(structs.u384(name="zc0b0a1", elmts=[zc0b0[1]])) circuit.extend_struct_output(structs.u384(name="zc1b1a0", elmts=[zc1b1[0]])) circuit.extend_struct_output(structs.u384(name="zc1b1a1", elmts=[zc1b1[1]])) return circuit ================================================ FILE: hydra/garaga/precompiled_circuits/compilable_circuits/common_cairo_fustat_circuits.py ================================================ from random import randint import garaga.modulo_circuit_structs as structs from garaga.curves import CURVES, CurveID from garaga.hints import neg_3 from garaga.hints.ecip import ( n_coeffs_from_n_points, n_points_from_n_coeffs, slope_intercept, ) from garaga.modulo_circuit import WriteOps from garaga.modulo_circuit_structs import G1PointCircuit, G2PointCircuit, u384 from garaga.points import G1Point, G2Point from garaga.precompiled_circuits.cofactor_clearing import G1CofactorClearing from garaga.precompiled_circuits.compilable_circuits.base import ( BaseModuloCircuit, ModuloCircuit, PyFelt, ) from garaga.precompiled_circuits.ec import ( BasicEC, BasicECG2, ECIPCircuits, FakeGLVCircuits, IsOnCurveCircuit, ) class DummyCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0 ) -> None: super().__init__( name="dummy", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: return [self.field(44), self.field(4)] def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ModuloCircuit( self.name, self.curve_id, generic_circuit=True, compilation_mode=self.compilation_mode, ) x, y = circuit.write_elements(input, WriteOps.INPUT) r = circuit.sub(x, y) # 40 z = circuit.div(x, y) # 4 c = circuit.add(r, z) # 44 d = circuit.sub(r, z) # 36 e = circuit.mul(r, z) # 120 f = circuit.div(r, z) # 8 circuit.extend_output([r, z, c, d, e, f]) return circuit class IsOnCurveG1G2Circuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="is_on_curve_g1_g2", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: curve_id = CurveID(self.curve_id) order = CURVES[self.curve_id].n input = [] n1, n2 = randint(1, order), randint(1, order) p1, p2 = G1Point.get_nG(curve_id, n1), G2Point.get_nG(curve_id, n2) pair = [p1.x, p1.y, p2.x[0], p2.x[1], p2.y[0], p2.y[1]] input.extend([self.field(x) for x in pair]) input.append(self.field(CURVES[self.curve_id].a)) input.append(self.field(CURVES[self.curve_id].b)) input.append(self.field(CURVES[self.curve_id].b20)) input.append(self.field(CURVES[self.curve_id].b21)) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit: IsOnCurveCircuit = IsOnCurveCircuit( self.name, self.curve_id, compilation_mode=self.compilation_mode ) assert len(input) == 6 + 4, f"got {input} of len {len(input)}" p = circuit.write_struct(G1PointCircuit("p", input[0:2]), WriteOps.INPUT) q = circuit.write_struct(G2PointCircuit("q", input[2:6]), WriteOps.INPUT) a = circuit.write_struct(u384("a", [input[6]]), WriteOps.INPUT) b = circuit.write_struct(u384("b", [input[7]]), WriteOps.INPUT) b20 = circuit.write_struct(u384("b20", [input[8]]), WriteOps.INPUT) b21 = circuit.write_struct(u384("b21", [input[9]]), WriteOps.INPUT) circuit.set_consts(a, b, b20, b21) lhs, rhs = circuit._is_on_curve_G1(*p) lhs2, rhs2 = circuit._is_on_curve_G2(*q) zero_check = circuit.sub(lhs, rhs) zero_check_2 = [circuit.sub(lhs2[0], rhs2[0]), circuit.sub(lhs2[1], rhs2[1])] circuit.extend_struct_output(u384("zero_check_0", [zero_check])) circuit.extend_struct_output(u384("zero_check_1", [zero_check_2[0]])) circuit.extend_struct_output(u384("zero_check_2", [zero_check_2[1]])) return circuit class IsOnCurveG1Circuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="is_on_curve_g1", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] random_point = G1Point.gen_random_point(CurveID(self.curve_id)) input.append(self.field(random_point.x)) input.append(self.field(random_point.y)) input.append(self.field(CURVES[self.curve_id].a)) input.append(self.field(CURVES[self.curve_id].b)) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = BasicEC( self.name, self.curve_id, compilation_mode=self.compilation_mode ) px, py = circuit.write_struct(G1PointCircuit("p", input[0:2]), WriteOps.INPUT) a = circuit.write_struct(u384("a", [input[2]]), WriteOps.INPUT) b = circuit.write_struct(u384("b", [input[3]]), WriteOps.INPUT) lhs, rhs = circuit._is_on_curve_G1_weirstrass(px, py, a, b) zero_check = circuit.sub(lhs, rhs) circuit.extend_struct_output(u384("zero_check", [zero_check])) return circuit class IsOnCurveG2Circuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="is_on_curve_g2", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] random_point = G2Point.gen_random_point(CurveID(self.curve_id)) input.append(self.field(random_point.x[0])) input.append(self.field(random_point.x[1])) input.append(self.field(random_point.y[0])) input.append(self.field(random_point.y[1])) input.append(self.field(CURVES[self.curve_id].a)) input.append(self.field(CURVES[self.curve_id].b20)) input.append(self.field(CURVES[self.curve_id].b21)) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = BasicECG2( self.name, self.curve_id, compilation_mode=self.compilation_mode ) x0, x1, y0, y1 = circuit.write_struct( G2PointCircuit("p", input[0:4]), WriteOps.INPUT ) a = circuit.write_struct(u384("a", [input[4]]), WriteOps.INPUT) b20 = circuit.write_struct(u384("b20", [input[5]]), WriteOps.INPUT) b21 = circuit.write_struct(u384("b21", [input[6]]), WriteOps.INPUT) lhs, rhs = circuit._is_on_curve_G2_weirstrass(x0, x1, y0, y1, a, b20, b21) zero_check = [circuit.sub(lhs[0], rhs[0]), circuit.sub(lhs[1], rhs[1])] circuit.extend_struct_output(u384("zero_check_0", [zero_check[0]])) circuit.extend_struct_output(u384("zero_check_1", [zero_check[1]])) return circuit class AddECPointsG2Circuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="add_ec_points_g2", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] P = G2Point.gen_random_point(CurveID(self.curve_id)) Q = G2Point.gen_random_point(CurveID(self.curve_id)) input.append(self.field(P.x[0])) input.append(self.field(P.x[1])) input.append(self.field(P.y[0])) input.append(self.field(P.y[1])) input.append(self.field(Q.x[0])) input.append(self.field(Q.x[1])) input.append(self.field(Q.y[0])) input.append(self.field(Q.y[1])) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = BasicECG2( self.name, self.curve_id, compilation_mode=self.compilation_mode ) circuit.generic_modulus = True px0, px1, py0, py1 = circuit.write_struct( G2PointCircuit("p", input[0:4]), WriteOps.INPUT ) qx0, qx1, qy0, qy1 = circuit.write_struct( G2PointCircuit("q", input[4:8]), WriteOps.INPUT ) (nx0, nx1), (ny0, ny1) = circuit.add_points( ((px0, px1), (py0, py1)), ((qx0, qx1), (qy0, qy1)) ) circuit.extend_struct_output(G2PointCircuit("result", [nx0, nx1, ny0, ny1])) return circuit class DoubleECPointG2AEq0Circuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="double_ec_point_g2_a_eq_0", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] P = G2Point.gen_random_point(CurveID(self.curve_id)) input.append(self.field(P.x[0])) input.append(self.field(P.x[1])) input.append(self.field(P.y[0])) input.append(self.field(P.y[1])) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = BasicECG2( self.name, self.curve_id, compilation_mode=self.compilation_mode ) circuit.generic_modulus = True px0, px1, py0, py1 = circuit.write_struct( G2PointCircuit("p", input[0:4]), WriteOps.INPUT ) (nx0, nx1), (ny0, ny1) = circuit.double_point_a_eq_0(((px0, px1), (py0, py1))) circuit.extend_struct_output(G2PointCircuit("result", [nx0, nx1, ny0, ny1])) return circuit class DoubleAndAddECPointsG2Circuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="double_and_add_ec_points_g2", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] P = G2Point.gen_random_point(CurveID(self.curve_id)) Q = G2Point.gen_random_point(CurveID(self.curve_id)) input.append(self.field(P.x[0])) input.append(self.field(P.x[1])) input.append(self.field(P.y[0])) input.append(self.field(P.y[1])) input.append(self.field(Q.x[0])) input.append(self.field(Q.x[1])) input.append(self.field(Q.y[0])) input.append(self.field(Q.y[1])) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = BasicECG2( self.name, self.curve_id, compilation_mode=self.compilation_mode ) circuit.generic_modulus = True px0, px1, py0, py1 = circuit.write_struct( G2PointCircuit("p", input[0:4]), WriteOps.INPUT ) qx0, qx1, qy0, qy1 = circuit.write_struct( G2PointCircuit("q", input[4:8]), WriteOps.INPUT ) (nx0, nx1), (ny0, ny1) = circuit.double_and_add( ((px0, px1), (py0, py1)), ((qx0, qx1), (qy0, qy1)) ) circuit.extend_struct_output(G2PointCircuit("result", [nx0, nx1, ny0, ny1])) return circuit class PsiG2BLS12_381Circuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="psi_g2_bls12_381", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] P = G2Point.gen_random_point(CurveID(self.curve_id)) input.append(self.field(P.x[0])) input.append(self.field(P.x[1])) input.append(self.field(P.y[0])) input.append(self.field(P.y[1])) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = BasicECG2( self.name, self.curve_id, compilation_mode=self.compilation_mode ) circuit.generic_modulus = True px0, px1, py0, py1 = circuit.write_struct( G2PointCircuit("p", input[0:4]), WriteOps.INPUT ) # https://github.com/Consensys/gnark/blob/9ed0eab21e8935cb180d1f75713cd2c29c91a3c9/std/algebra/emulated/sw_bls12381/g2.go u1 = circuit.set_or_get_constant( 0x1A0111EA397FE699EC02408663D4DE85AA0D857D89759AD4897D29650FB85F9B409427EB4F49FFFD8BFD00000000AAAD ) v0 = circuit.set_or_get_constant( 0x135203E60180A68EE2E9C448D77A2CD91C3DEDD930B1CF60EF396489F61EB45E304466CF3E67FA0AF1EE7B04121BDEA2 ) v1 = circuit.set_or_get_constant( 0x6AF0E0437FF400B6831E36D6BD17FFE48395DABC2D3435E77F76E17009241C5EE67992F72EC05F4C81084FBEDE3CC09 ) psi_Qx = (circuit.mul(px1, u1), circuit.mul(px0, u1)) psi_Qy = circuit.fp2_mul([py0, circuit.neg(py1)], [v0, v1]) circuit.extend_struct_output( G2PointCircuit("result", [psi_Qx[0], psi_Qx[1], psi_Qy[0], psi_Qy[1]]) ) return circuit class SlopeInterceptSamePointCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0 ) -> None: super().__init__( name="slope_intercept_same_point", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] random_point = G1Point.gen_random_point(CurveID(self.curve_id)) input.append(self.field(random_point.x)) input.append(self.field(random_point.y)) input.append(self.field(CURVES[self.curve_id].a)) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ECIPCircuits( self.name, self.curve_id, compilation_mode=self.compilation_mode ) px, py = circuit.write_struct(G1PointCircuit("p", input[0:2]), WriteOps.INPUT) a = circuit.write_struct(u384("a", [input[2]]), WriteOps.INPUT) m_A0, b_A0, xA0, yA0, xA2, yA2, coeff0, coeff2 = ( circuit._slope_intercept_same_point((px, py), a) ) if self.compilation_mode == 0: # In Cairo0, xA0 and yA0 are copied from the input circuit.extend_output([m_A0, b_A0, xA0, yA0, xA2, yA2, coeff0, coeff2]) else: # In Cairo1, xA0 and yA0 are not copied from the input circuit.extend_struct_output( structs.SlopeInterceptOutput( "mb", [m_A0, b_A0, xA2, yA2, coeff0, coeff2] ) ) return circuit class AccumulateEvalPointChallengeSignedCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0 ) -> None: super().__init__( name="acc_eval_point_challenge_signed", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: A0 = G1Point.gen_random_point(CurveID(self.curve_id)) m_A0, b_A0 = slope_intercept(A0, A0) input = [] random_point = G1Point.gen_random_point(CurveID(self.curve_id)) scalar = randint(0, 2**127) ep, en = neg_3.positive_negative_multiplicities(neg_3.neg_3_base_le(scalar)) input.append(self.field(randint(0, CURVES[self.curve_id].p - 1))) input.append(self.field(m_A0.value)) input.append(self.field(b_A0.value)) input.append(self.field(A0.x)) input.append(self.field(random_point.x)) input.append(self.field(random_point.y)) input.append(self.field(abs(ep))) input.append(self.field(abs(en))) input.append(self.field(1 if ep >= 0 else -1)) input.append(self.field(1 if en >= 0 else -1)) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ECIPCircuits( self.name, self.curve_id, compilation_mode=self.compilation_mode ) # acc, m, b, xA, px, py, ep, en, sp, sn = circuit.write_elements( # input[0:10], WriteOps.INPUT # ) acc, m, b, xA = ( circuit.write_struct(u384("acc", [input[0]]), WriteOps.INPUT), circuit.write_struct(u384("m", [input[1]]), WriteOps.INPUT), circuit.write_struct(u384("b", [input[2]]), WriteOps.INPUT), circuit.write_struct(u384("xA", [input[3]]), WriteOps.INPUT), ) px, py = circuit.write_struct(G1PointCircuit("p", input[4:6]), WriteOps.INPUT) ep = circuit.write_struct(u384("ep", [input[6]]), WriteOps.INPUT) en = circuit.write_struct(u384("en", [input[7]]), WriteOps.INPUT) sp = circuit.write_struct(u384("sp", [input[8]]), WriteOps.INPUT) sn = circuit.write_struct(u384("sn", [input[9]]), WriteOps.INPUT) res_acc = circuit._accumulate_eval_point_challenge_signed_same_point( acc, (m, b), xA, (px, py), ep, en, sp, sn ) circuit.extend_struct_output(u384("res_acc", [res_acc])) return circuit class RHSFinalizeAccCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0 ) -> None: super().__init__( name="rhs_finalize_acc", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: A0 = G1Point.gen_random_point(CurveID(self.curve_id)) m_A0, b_A0 = slope_intercept(A0, A0) input = [] Q = G1Point.gen_random_point(CurveID(self.curve_id)) input.append(self.field(randint(0, CURVES[self.curve_id].p - 1))) input.append(self.field(m_A0.value)) input.append(self.field(b_A0.value)) input.append(self.field(A0.x)) input.append(self.field(Q.x)) input.append(self.field(Q.y)) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ECIPCircuits( self.name, self.curve_id, compilation_mode=self.compilation_mode ) # acc, m, b, xA, Qx, Qy = circuit.write_elements(input[0:6], WriteOps.INPUT) acc, m, b, xA = ( circuit.write_struct(u384("acc", [input[0]]), WriteOps.INPUT), circuit.write_struct(u384("m", [input[1]]), WriteOps.INPUT), circuit.write_struct(u384("b", [input[2]]), WriteOps.INPUT), circuit.write_struct(u384("xA", [input[3]]), WriteOps.INPUT), ) Qx, Qy = circuit.write_struct( G1PointCircuit("Q_result", input[4:6]), WriteOps.INPUT ) res_acc = circuit._RHS_finalize_acc(acc, (m, b), xA, (Qx, Qy)) circuit.extend_struct_output(u384("rhs", [res_acc])) return circuit class EvalFunctionChallengeSingleCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, n_points: int = 1, auto_run: bool = True, compilation_mode: int = 0, batched: bool = False, generic_circuit: bool = True, ) -> None: self.n_points = n_points self.batched = batched self.generic_circuit = generic_circuit super().__init__( name=f"eval_fn_challenge_sing_{n_points}P" + ("_rlc" if batched else ""), curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] circuit = SlopeInterceptSamePointCircuit(self.curve_id, auto_run=False) xA, _yA, _A = circuit.build_input() m_A0, b_A0, xA0, yA0, xA2, yA2, coeff0, coeff2 = circuit._run_circuit_inner( [xA, _yA, _A] ).output input.extend([xA0.felt, _yA.felt, coeff0.felt]) n_coeffs = n_coeffs_from_n_points(self.n_points, self.batched) for _ in range(sum(n_coeffs)): input.append(self.field(randint(0, CURVES[self.curve_id].p - 1))) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ECIPCircuits( self.name, self.curve_id, compilation_mode=self.compilation_mode, generic_circuit=self.generic_circuit, ) xA0, yA0 = circuit.write_struct( G1PointCircuit("A", [input[0], input[1]]), WriteOps.INPUT ) coeff0 = circuit.write_struct(u384("coeff", [input[2]]), WriteOps.INPUT) all_coeffs = input[3:] def split_list(input_list, lengths): start_idx, result = 0, [] for length in lengths: result.append(input_list[start_idx : start_idx + length]) start_idx += length return result n_points = n_points_from_n_coeffs(len(all_coeffs), self.batched) _log_div_a_num, _log_div_a_den, _log_div_b_num, _log_div_b_den = split_list( all_coeffs, n_coeffs_from_n_points(n_points, self.batched) ) log_div_a_num, log_div_a_den, log_div_b_num, log_div_b_den = ( circuit.write_struct( structs.FunctionFeltCircuit( name="SumDlogDiv" + ("Batched" if self.batched else ""), elmts=[ structs.u384Span("log_div_a_num", _log_div_a_num), structs.u384Span("log_div_a_den", _log_div_a_den), structs.u384Span("log_div_b_num", _log_div_b_num), structs.u384Span("log_div_b_den", _log_div_b_den), ], ), WriteOps.INPUT, ) ) res = circuit._eval_function_challenge_single( (xA0, yA0), coeff0, log_div_a_num, log_div_a_den, log_div_b_num, log_div_b_den, ) circuit.extend_struct_output(u384("res", [res])) return circuit class EvalFunctionChallengeDuplCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, n_points: int = 1, auto_run: bool = True, compilation_mode: int = 0, batched: bool = False, generic_circuit: bool = True, ) -> None: self.n_points = n_points self.batched = batched self.generic_circuit = generic_circuit super().__init__( name=f"eval_fn_challenge_dupl_{n_points}P" + ("_rlc" if batched else ""), curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] circuit = SlopeInterceptSamePointCircuit(self.curve_id, auto_run=False) xA, _yA, _A = circuit.build_input() m_A0, b_A0, xA0, yA0, xA2, yA2, coeff0, coeff2 = circuit._run_circuit_inner( [xA, _yA, _A] ).output input.extend([xA0.felt, _yA.felt, xA2.felt, yA2.felt, coeff0.felt, coeff2.felt]) n_coeffs = n_coeffs_from_n_points(self.n_points, self.batched) for _ in range(sum(n_coeffs)): input.append(self.field(randint(0, CURVES[self.curve_id].p - 1))) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ECIPCircuits( self.name, self.curve_id, compilation_mode=self.compilation_mode, generic_circuit=self.generic_circuit, ) xA0, yA0 = circuit.write_struct( G1PointCircuit("A0", [input[0], input[1]]), WriteOps.INPUT ) xA2, yA2 = circuit.write_struct( G1PointCircuit("A2", [input[2], input[3]]), WriteOps.INPUT ) coeff0 = circuit.write_struct(u384("coeff0", [input[4]]), WriteOps.INPUT) coeff2 = circuit.write_struct(u384("coeff2", [input[5]]), WriteOps.INPUT) all_coeffs = input[6:] def split_list(input_list, lengths): start_idx, result = 0, [] for length in lengths: result.append(input_list[start_idx : start_idx + length]) start_idx += length return result n_points = n_points_from_n_coeffs(len(all_coeffs), self.batched) _log_div_a_num, _log_div_a_den, _log_div_b_num, _log_div_b_den = split_list( all_coeffs, n_coeffs_from_n_points(n_points, self.batched) ) log_div_a_num, log_div_a_den, log_div_b_num, log_div_b_den = ( circuit.write_struct( structs.FunctionFeltCircuit( name="SumDlogDiv" + ("Batched" if self.batched else ""), elmts=[ structs.u384Span("log_div_a_num", _log_div_a_num), structs.u384Span("log_div_a_den", _log_div_a_den), structs.u384Span("log_div_b_num", _log_div_b_num), structs.u384Span("log_div_b_den", _log_div_b_den), ], ), WriteOps.INPUT, ) ) res = circuit._eval_function_challenge_dupl( (xA0, yA0), (xA2, yA2), coeff0, coeff2, log_div_a_num, log_div_a_den, log_div_b_num, log_div_b_den, ) circuit.extend_struct_output(u384("res", [res])) return circuit class InitFunctionChallengeDuplCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, n_points: int = 1, auto_run: bool = True, batched: bool = False, compilation_mode: int = 0, ) -> None: self.n_points = n_points self.batched = batched super().__init__( name=f"init_fn_challenge_dupl_{n_points}P" + ("_rlc" if batched else ""), curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random(), self.field.random()]) # xA0, xA2 n_coeffs = n_coeffs_from_n_points(self.n_points, self.batched) for _ in range(sum(n_coeffs)): input.append(self.field(randint(0, CURVES[self.curve_id].p - 1))) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ECIPCircuits( self.name, self.curve_id, compilation_mode=self.compilation_mode ) xA0 = circuit.write_struct(u384("xA0", [input[0]]), WriteOps.INPUT) xA2 = circuit.write_struct(u384("xA2", [input[1]]), WriteOps.INPUT) all_coeffs = input[2:] def split_list(input_list, lengths): start_idx, result = 0, [] for length in lengths: result.append(input_list[start_idx : start_idx + length]) start_idx += length return result n_points = n_points_from_n_coeffs(len(all_coeffs), self.batched) _log_div_a_num, _log_div_a_den, _log_div_b_num, _log_div_b_den = split_list( all_coeffs, n_coeffs_from_n_points(n_points, self.batched) ) log_div_a_num, log_div_a_den, log_div_b_num, log_div_b_den = ( circuit.write_struct( structs.FunctionFeltCircuit( name="SumDlogDiv", elmts=[ structs.u384Span("log_div_a_num", _log_div_a_num), structs.u384Span("log_div_a_den", _log_div_a_den), structs.u384Span("log_div_b_num", _log_div_b_num), structs.u384Span("log_div_b_den", _log_div_b_den), ], ), WriteOps.INPUT, ) ) res = circuit._init_function_challenge_dupl( xA0, xA2, log_div_a_num, log_div_a_den, log_div_b_num, log_div_b_den ) circuit.extend_struct_output( structs.FunctionFeltEvaluations("A0_evals", res[0:4]) ) circuit.extend_struct_output( structs.FunctionFeltEvaluations("A2_evals", res[4:8]) ) circuit.extend_struct_output(u384("xA0_power", [res[8]])) circuit.extend_struct_output(u384("xA2_power", [res[9]])) return circuit class AccumulateFunctionChallengeDuplCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0, ): super().__init__( name="acc_function_challenge_dupl", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] input.extend( [self.field.random() for _ in range(8)] ) # a_num, a_den, b_num, b_den accumulation evals * 2 input.extend([self.field.random(), self.field.random()]) # xA0, xA2 input.extend( [self.field.random(), self.field.random()] ) # xA0_power, xA2_power, corresponding the max degree of a_den or b_num of the previous accumulator input.extend( [self.field.random() for _ in range(4)] ) # next coefficients of a_num, a_den, b_num, b_den return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ECIPCircuits( self.name, self.curve_id, compilation_mode=self.compilation_mode ) f_a0_accs = circuit.write_struct( structs.FunctionFeltEvaluations("f_a0_accs", input[0:4]), WriteOps.INPUT ) f_a1_accs = circuit.write_struct( structs.FunctionFeltEvaluations("f_a1_accs", input[4:8]), WriteOps.INPUT ) xA0 = circuit.write_struct(u384("xA0", [input[8]]), WriteOps.INPUT) xA2 = circuit.write_struct(u384("xA2", [input[9]]), WriteOps.INPUT) xA0_power = circuit.write_struct(u384("xA0_power", [input[10]]), WriteOps.INPUT) xA2_power = circuit.write_struct(u384("xA2_power", [input[11]]), WriteOps.INPUT) next_a_num_coeff = circuit.write_struct( structs.GenericT("next_a_num_coeff", [input[12]]), WriteOps.INPUT ) next_a_den_coeff = circuit.write_struct( structs.GenericT("next_a_den_coeff", [input[13]]), WriteOps.INPUT ) next_b_num_coeff = circuit.write_struct( structs.GenericT("next_b_num_coeff", [input[14]]), WriteOps.INPUT ) next_b_den_coeff = circuit.write_struct( structs.GenericT("next_b_den_coeff", [input[15]]), WriteOps.INPUT ) res = circuit._accumulate_function_challenge_dupl( *f_a0_accs, *f_a1_accs, xA0, xA2, xA0_power, xA2_power, next_a_num_coeff, next_a_den_coeff, next_b_num_coeff, next_b_den_coeff, ) circuit.extend_struct_output( structs.FunctionFeltEvaluations("next_f_a0_accs", res[0:4]) ) circuit.extend_struct_output( structs.FunctionFeltEvaluations("next_f_a1_accs", res[4:8]) ) circuit.extend_struct_output(u384("next_xA0_power", [res[8]])) circuit.extend_struct_output(u384("next_xA2_power", [res[9]])) return circuit class FinalizeFunctionChallengeDuplCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0, ): super().__init__( name="finalize_fn_challenge_dupl", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] input.extend([self.field.random() for _ in range(8)]) # f_a0_accs, f_a1_accs input.extend([self.field.random() for _ in range(2)]) # yA0, yA2 input.extend([self.field.random() for _ in range(2)]) # coeff_A0, coeff_A2 return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ECIPCircuits( self.name, self.curve_id, compilation_mode=self.compilation_mode ) f_a0_accs = circuit.write_struct( structs.FunctionFeltEvaluations("f_a0_accs", input[0:4]), WriteOps.INPUT ) f_a1_accs = circuit.write_struct( structs.FunctionFeltEvaluations("f_a1_accs", input[4:8]), WriteOps.INPUT ) yA0 = circuit.write_struct(u384("yA0", [input[8]]), WriteOps.INPUT) yA2 = circuit.write_struct(u384("yA2", [input[9]]), WriteOps.INPUT) coeff_A0 = circuit.write_struct(u384("coeff_A0", [input[10]]), WriteOps.INPUT) coeff_A2 = circuit.write_struct(u384("coeff_A2", [input[11]]), WriteOps.INPUT) res = circuit._finalize_function_challenge_dupl( *f_a0_accs, *f_a1_accs, yA0, yA2, coeff_A0, coeff_A2 ) circuit.extend_struct_output(u384("res", [res])) return circuit class AddECPointCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0, ): super().__init__( name="add_ec_point", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] P = G1Point.gen_random_point(CurveID(self.curve_id)) Q = G1Point.gen_random_point(CurveID(self.curve_id)) input.append(self.field(P.x)) input.append(self.field(P.y)) input.append(self.field(Q.x)) input.append(self.field(Q.y)) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = BasicEC( self.name, self.curve_id, compilation_mode=self.compilation_mode ) circuit.generic_modulus = True xP, yP = circuit.write_struct(G1PointCircuit("p", input[0:2]), WriteOps.INPUT) xQ, yQ = circuit.write_struct(G1PointCircuit("q", input[2:4]), WriteOps.INPUT) xR, yR = circuit.add_points((xP, yP), (xQ, yQ)) circuit.extend_struct_output(G1PointCircuit("r", [xR, yR])) return circuit class DoubleECPointCircuit(BaseModuloCircuit): def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0, ): super().__init__( name="double_ec_point", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] P = G1Point.gen_random_point(CurveID(self.curve_id)) input.append(self.field(P.x)) input.append(self.field(P.y)) input.append(self.field(CURVES[self.curve_id].a)) return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = BasicEC( self.name, self.curve_id, compilation_mode=self.compilation_mode ) circuit.generic_modulus = True xP, yP = circuit.write_struct(G1PointCircuit("p", input[0:2]), WriteOps.INPUT) A = circuit.write_struct(u384("A_weirstrass", [input[2]])) xR, yR = circuit.double_point((xP, yP), A) circuit.extend_struct_output(G1PointCircuit("r", [xR, yR])) return circuit class PrepareGLVFakeGLVPtsCircuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="prepare_glv_fake_glv_pts", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] input.append(self.field.random()) # Px input.append(self.field.random()) # P0y input.append(self.field.random()) # P1y input.append(self.field.random()) # Qx input.append(self.field.random()) # Q0y input.append(self.field.random()) # Phi_P0y input.append(self.field.random()) # Phi_P1y input.append(self.field.random()) # Phi_Q0y input.append(self.field.random()) # Gen_x input.append(self.field.random()) # Gen_y input.append(self.field.random()) # third_root return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = FakeGLVCircuits( self.name, self.curve_id, compilation_mode=self.compilation_mode ) circuit.generic_modulus = True Px = circuit.write_struct(u384("Px", [input[0]]), WriteOps.INPUT) P0y = circuit.write_struct(u384("P0y", [input[1]]), WriteOps.INPUT) P1y = circuit.write_struct(u384("P1y", [input[2]]), WriteOps.INPUT) Qx = circuit.write_struct(u384("Qx", [input[3]]), WriteOps.INPUT) Q0y = circuit.write_struct(u384("Q0y", [input[4]]), WriteOps.INPUT) Phi_P0y = circuit.write_struct(u384("Phi_P0y", [input[5]]), WriteOps.INPUT) Phi_P1y = circuit.write_struct(u384("Phi_P1y", [input[6]]), WriteOps.INPUT) Phi_Q0y = circuit.write_struct(u384("Phi_Q0y", [input[7]]), WriteOps.INPUT) Gen = circuit.write_struct( G1PointCircuit("Gen", [input[8], input[9]]), WriteOps.INPUT ) third_root = circuit.write_struct( u384("third_root", [input[10]]), WriteOps.INPUT ) ( B1, B2, B3, B4, B5, B6, B7, B8, B9y, B10y, B11y, B12y, B13y, B14y, B15y, B16y, Phi_P0x, Phi_Q0x, Acc, ) = circuit.prepare_points_glv_fake_glv( Px, P0y, P1y, Qx, Q0y, Phi_P0y, Phi_P1y, Phi_Q0y, Gen, third_root ) # circuit.exact_output_refs_needed = [B2[0], B3[0], B4[0], B5[0], B6[0], B7[0], B8[0], B10y, B11y, B12y, B13y, B14y, B15y, B16y, Acc[0], Acc[1]] circuit.extend_struct_output(G1PointCircuit("B1", [B1[0], B1[1]])) circuit.extend_struct_output(G1PointCircuit("B2", [B2[0], B2[1]])) circuit.extend_struct_output(G1PointCircuit("B3", [B3[0], B3[1]])) circuit.extend_struct_output(G1PointCircuit("B4", [B4[0], B4[1]])) circuit.extend_struct_output(G1PointCircuit("B5", [B5[0], B5[1]])) circuit.extend_struct_output(G1PointCircuit("B6", [B6[0], B6[1]])) circuit.extend_struct_output(G1PointCircuit("B7", [B7[0], B7[1]])) circuit.extend_struct_output(G1PointCircuit("B8", [B8[0], B8[1]])) circuit.extend_struct_output(u384("B9y", [B9y])) circuit.extend_struct_output(u384("B10y", [B10y])) circuit.extend_struct_output(u384("B11y", [B11y])) circuit.extend_struct_output(u384("B12y", [B12y])) circuit.extend_struct_output(u384("B13y", [B13y])) circuit.extend_struct_output(u384("B14y", [B14y])) circuit.extend_struct_output(u384("B15y", [B15y])) circuit.extend_struct_output(u384("B16y", [B16y])) circuit.extend_struct_output(u384("Phi_P0x", [Phi_P0x])) circuit.extend_struct_output(u384("Phi_Q0x", [Phi_Q0x])) circuit.extend_struct_output(G1PointCircuit("Acc", [Acc[0], Acc[1]])) return circuit class PrepareFakeGLVPtsCircuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="prepare_fake_glv_pts", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] input.append(self.field.random()) # Px input.append(self.field.random()) # Py input.append(self.field.random()) # Qx input.append(self.field.random()) # Qy input.append(self.field.random()) # s2_sign input.append(self.field.random()) # A_weirstrass return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = FakeGLVCircuits( self.name, self.curve_id, compilation_mode=self.compilation_mode ) circuit.generic_modulus = True P = circuit.write_struct( G1PointCircuit("P", [input[0], input[1]]), WriteOps.INPUT ) Q = circuit.write_struct( G1PointCircuit("Q", [input[2], input[3]]), WriteOps.INPUT ) s2_sign = circuit.write_struct(u384("s2_sign", [input[4]]), WriteOps.INPUT) A_weirstrass = circuit.write_struct( u384("A_weirstrass", [input[5]]), WriteOps.INPUT ) ( T1, T2, T3, T4, T5y, T6y, T7y, T8y, T9, T10, T11, T12, T13y, T14y, T15y, T16y, R2, R0y, ) = circuit.prepare_points_fake_glv(P, Q, s2_sign, A_weirstrass) # circuit.exact_output_refs_needed = [B2[0], B3[0], B4[0], B5[0], B6[0], B7[0], B8[0], B10y, B11y, B12y, B13y, B14y, B15y, B16y, Acc[0], Acc[1]] circuit.extend_struct_output(G1PointCircuit("T1", [T1[0], T1[1]])) circuit.extend_struct_output(G1PointCircuit("T2", [T2[0], T2[1]])) circuit.extend_struct_output(G1PointCircuit("T3", [T3[0], T3[1]])) circuit.extend_struct_output(G1PointCircuit("T4", [T4[0], T4[1]])) circuit.extend_struct_output(u384("T5y", [T5y])) circuit.extend_struct_output(u384("T6y", [T6y])) circuit.extend_struct_output(u384("T7y", [T7y])) circuit.extend_struct_output(u384("T8y", [T8y])) circuit.extend_struct_output(G1PointCircuit("T9", [T9[0], T9[1]])) circuit.extend_struct_output(G1PointCircuit("T10", [T10[0], T10[1]])) circuit.extend_struct_output(G1PointCircuit("T11", [T11[0], T11[1]])) circuit.extend_struct_output(G1PointCircuit("T12", [T12[0], T12[1]])) circuit.extend_struct_output(u384("T13y", [T13y])) circuit.extend_struct_output(u384("T14y", [T14y])) circuit.extend_struct_output(u384("T15y", [T15y])) circuit.extend_struct_output(u384("T16y", [T16y])) circuit.extend_struct_output(G1PointCircuit("R2", [R2[0], R2[1]])) circuit.extend_struct_output(u384("R0y", [R0y])) return circuit class QuadrupleAndAdd9Circuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="quadruple_and_add_9", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] input.append(self.field.random()) # Px input.append(self.field.random()) # Py for _ in range(9): input.append(self.field.random()) # Qx input.append(self.field.random()) # Qy input.append(self.field.random()) # A_weirstrass return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = BasicEC( self.name, self.curve_id, compilation_mode=self.compilation_mode ) circuit.generic_modulus = True P = circuit.write_struct( G1PointCircuit("P", [input[0], input[1]]), WriteOps.INPUT ) Qs = [] for i in range(2, len(input) - 1, 2): Qs.append( circuit.write_struct( G1PointCircuit(f"Q_{i//2}", [input[i], input[i + 1]]), WriteOps.INPUT, ) ) A_weirstrass = circuit.write_struct( u384("A_weirstrass", [input[len(input) - 1]]), WriteOps.INPUT ) Rx, Ry = circuit.n_quadruple_and_add(P, Qs, A_weirstrass) circuit.extend_struct_output(G1PointCircuit("R", [Rx, Ry])) return circuit class ClearCofactorBLS12_381Circuit(BaseModuloCircuit): def __init__(self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0): super().__init__( name="clear_cofactor_bls12_381", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: input = [] input.append(self.field.random()) # Px input.append(self.field.random()) # Py return input def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = G1CofactorClearing( self.name, self.curve_id, compilation_mode=self.compilation_mode ) circuit.generic_modulus = True P = circuit.write_struct( G1PointCircuit("P", [input[0], input[1]]), WriteOps.INPUT ) res = circuit.clear_cofactor(P) circuit.extend_struct_output(G1PointCircuit("res", [res[0], res[1]])) return circuit ================================================ FILE: hydra/garaga/precompiled_circuits/compilable_circuits/rsa.py ================================================ from random import randrange from garaga.modulo_circuit import ModuloCircuit, WriteOps from garaga.modulo_circuit_structs import RSA2048Chunks, RSA2048ReductionWitness, u384 from garaga.precompiled_circuits.compilable_circuits.base import ( BaseModuloCircuit, PyFelt, ) RSA2048_N_CHUNKS = 6 RSA2048_TOP_CHUNK_BITS = 128 RSA2048_N_STEPS = 17 class RSAFullVerificationCircuit(BaseModuloCircuit): """RNS channel circuit for RSA-2048 modular exponentiation verification. Verifies all 17 reduction steps (16 squarings + 1 final multiply) of the square-and-multiply chain s^{65537} mod n within a single RNS channel. Each step a*b = q*n + r is checked by Horner evaluation of chunk polynomials at the channel's evaluation point alpha, asserting a(alpha)*b(alpha) - q(alpha)*n(alpha) - r(alpha) = 0. Inputs (217): n(6) + s(6) + 17 x (q_i(6) + r_i(6)) + alpha(1) Outputs (17): differences delta_i (zero iff all reductions are valid) """ def __init__( self, curve_id: int, auto_run: bool = True, compilation_mode: int = 0, ) -> None: super().__init__( name="rsa_full_verification", curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def build_input(self) -> list[PyFelt]: # mod_chunks (6) + sig_chunks (6) + 17*(quot(6)+rem(6)) + step(1) = 217 mod_chunks = [self.field.random() for _ in range(RSA2048_N_CHUNKS - 1)] mod_chunks.append(self.field(randrange(1 << RSA2048_TOP_CHUNK_BITS))) sig_chunks = [self.field.random() for _ in range(RSA2048_N_CHUNKS - 1)] sig_chunks.append(self.field(randrange(1 << RSA2048_TOP_CHUNK_BITS))) witness_chunks = [] for _ in range(RSA2048_N_STEPS): quot = [self.field.random() for _ in range(RSA2048_N_CHUNKS - 1)] quot.append(self.field(randrange(1 << RSA2048_TOP_CHUNK_BITS))) rem = [self.field.random() for _ in range(RSA2048_N_CHUNKS - 1)] rem.append(self.field(randrange(1 << RSA2048_TOP_CHUNK_BITS))) witness_chunks.extend(quot + rem) step = [self.field.random()] return mod_chunks + sig_chunks + witness_chunks + step def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = ModuloCircuit( self.name, self.curve_id, generic_circuit=True, generic_modulus=True, compilation_mode=self.compilation_mode, ) mod_chunks = circuit.write_struct( RSA2048Chunks( "mod_chunks", [input.pop(0) for _ in range(RSA2048_N_CHUNKS)], ), WriteOps.INPUT, ) sig_chunks = circuit.write_struct( RSA2048Chunks( "sig_chunks", [input.pop(0) for _ in range(RSA2048_N_CHUNKS)], ), WriteOps.INPUT, ) all_quot_chunks = [] all_rem_chunks = [] for i in range(RSA2048_N_STEPS): witness_elmts = [input.pop(0) for _ in range(2 * RSA2048_N_CHUNKS)] witness = circuit.write_struct( RSA2048ReductionWitness(f"w_{i}", witness_elmts), WriteOps.INPUT, ) all_quot_chunks.append(witness[:RSA2048_N_CHUNKS]) all_rem_chunks.append(witness[RSA2048_N_CHUNKS:]) step = circuit.write_struct(u384("step", [input.pop(0)]), WriteOps.INPUT) assert len(input) == 0, f"Expected empty input, got {len(input)} elements left" mod_res = circuit.eval_horner( mod_chunks, step, poly_name="mod_chunks", var_name="STEP" ) sig_res = circuit.eval_horner( sig_chunks, step, poly_name="sig_chunks", var_name="STEP" ) current = sig_res # first step squares sig_res diffs = [] for i in range(RSA2048_N_STEPS): q_res = circuit.eval_horner( all_quot_chunks[i], step, poly_name=f"quot_{i}", var_name="STEP" ) r_res = circuit.eval_horner( all_rem_chunks[i], step, poly_name=f"rem_{i}", var_name="STEP" ) if i < RSA2048_N_STEPS - 1: ab = circuit.mul(current, current, comment=f"square_{i}") else: ab = circuit.mul(current, sig_res, comment="final_multiply") qn = circuit.mul(q_res, mod_res, comment=f"quot*mod_{i}") diff = circuit.sub(ab, qn, comment=f"ab-qn_{i}") diff = circuit.sub(diff, r_res, comment=f"ab-qn-rem_{i}") diffs.append(diff) current = r_res for i, diff in enumerate(diffs): circuit.extend_struct_output(u384(f"diff_{i}", [diff])) return circuit ================================================ FILE: hydra/garaga/precompiled_circuits/compilable_circuits/ultra_honk.py ================================================ from abc import abstractmethod from typing import Dict, Tuple, Type, Union import garaga.modulo_circuit_structs as structs import garaga.precompiled_circuits.zk_honk as hk from garaga.curves import CurveID from garaga.modulo_circuit import ModuloCircuitElement from garaga.modulo_circuit_structs import u384 from garaga.precompiled_circuits.compilable_circuits.base import ( BaseModuloCircuit, ModuloCircuit, PyFelt, ) from garaga.precompiled_circuits.zk_honk import ( PAIRING_POINT_OBJECT_LENGTH, ZK_BATCHED_RELATION_PARTIAL_LENGTH, HonkVk, Wire, ZKHonkVerifierCircuits, ) from garaga.starknet.honk_contract_generator.calldata import filter_msm_scalars class BaseUltraHonkCircuit(BaseModuloCircuit): def __init__( self, name: str, log_n: int, curve_id: CurveID.GRUMPKIN.value, auto_run: bool = True, compilation_mode: int = 1, ) -> None: self.log_n = log_n super().__init__( name=name, curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def _initialize_circuit(self) -> ZKHonkVerifierCircuits: return ZKHonkVerifierCircuits( name=self.name, log_n=self.log_n, curve_id=self.curve_id, ) def _process_input( self, circuit: ZKHonkVerifierCircuits, input: list[PyFelt] ) -> dict: """ Method responsible for deserializing the input list of elements into the variables in the input map, and writing them to the circuit. The input list is expected to be in the same order as the input map. Since we use Python 3.10, the input map dict is ordered. Returns a vars dict with the same keys as the input map, but with the values being the instances of the structs, each struct holding ModuloCircuitElement(s). """ vars = {} for name, struct_info in self.input_map.items(): if name == "sumcheck_evaluations": # Edge case, TABLE_SHIFTS are not used. Replace with mocked non part of circuit values. struct_type, size = struct_info assert size == len(Wire) - len(Wire.unused_indexes()) elements = circuit.write_struct( struct_type(name, elmts=[input.pop(0) for _ in range(size)]) ) elements = Wire.insert_unused_indexes_with_nones(elements) assert len(elements) == len(Wire) vars[name] = elements elif isinstance(struct_info, tuple) and struct_info[0] in [ structs.u256Span, structs.u384Array, structs.u128Span, ]: # Handle u384Array with specified size struct_type, size = struct_info vars[name] = circuit.write_struct( struct_type(name, elmts=[input.pop(0) for _ in range(size)]) ) else: struct_type = struct_info # For other types, create a temporary instance to get its length temp_instance = struct_type( name, None ) # Temporary instance with a dummy element size = len(temp_instance) if size == 1: vars[name] = circuit.write_struct( struct_type(name, elmts=[input.pop(0)]) ) else: # Convert to tuple so that it is Hashable vars[name] = tuple( circuit.write_struct( struct_type(name, elmts=[input.pop(0) for _ in range(size)]) ) ) assert len(input) == 0, f"Expected input of length 0, got {len(input)}" return vars @property @abstractmethod def input_map( self, ) -> Dict[ str, Union[ Type[structs.Cairo1SerializableStruct], Tuple[Type[structs.Cairo1SerializableStruct], int], ], ]: """ Define the input map for the circuit in a dict. The key will be the name of the input variable, also used in the signature of the compiled Cairo code. The value will be either a Cairo1SerializableStruct type (which defines the struct in the Cairo code), or a tuple of the type and its size (for Array-like types). The reason behind this is that each Cairo1SerializableStruct defines the __len__ method, but for the array-like structs we need to specify the size in advance. """ def build_input(self) -> list[PyFelt]: """ Extends the base method of BaseModuloCircuit, by reading the input map and returning a list of random elements of the total expected size. """ total_elements = 0 for name, struct_info in self.input_map.items(): if isinstance(struct_info, tuple): # Array-like case _, size = struct_info total_elements += size else: # For other structs, create a temporary instance to get its length temp_instance = struct_info(name, None) total_elements += len(temp_instance) # print(f"Total elements: {total_elements}") return [self.field.random() for _ in range(total_elements)] def _run_circuit_inner(self, input: list[PyFelt]) -> ModuloCircuit: circuit = self._initialize_circuit() vars = self._process_input(circuit, input) return self._execute_circuit_logic(circuit, vars) @abstractmethod def _execute_circuit_logic(self, circuit, vars) -> ModuloCircuit: """ Implement the circuit logic using the processed input variables. """ class ZKBaseUltraHonkCircuit(BaseUltraHonkCircuit): def __init__( self, name: str, log_n: int, curve_id: CurveID.GRUMPKIN.value, auto_run: bool = True, compilation_mode: int = 1, ) -> None: super().__init__( name=name, log_n=log_n, curve_id=curve_id, auto_run=auto_run, compilation_mode=compilation_mode, ) def _initialize_circuit(self) -> ZKHonkVerifierCircuits: return ZKHonkVerifierCircuits( name=self.name, log_n=self.log_n, curve_id=self.curve_id, ) class ZKSumCheckCircuit(ZKBaseUltraHonkCircuit): def __init__( self, vk: HonkVk, curve_id: int = CurveID.GRUMPKIN.value, auto_run: bool = True, compilation_mode: int = 1, ) -> None: assert ( vk.public_inputs_size >= PAIRING_POINT_OBJECT_LENGTH ), f"vk.public_inputs_size: {vk.public_inputs_size}, PAIRING_POINT_OBJECT_LENGTH: {PAIRING_POINT_OBJECT_LENGTH}" name = ( f"zk_honk_sumcheck_size_{vk.log_circuit_size}_pub_{vk.public_inputs_size}" ) self.vk = vk super().__init__( name, vk.log_circuit_size, curve_id, auto_run, compilation_mode ) @property def input_map(self) -> dict: imap = {} imap["p_public_inputs"] = ( structs.u256Span, self.vk.public_inputs_size - PAIRING_POINT_OBJECT_LENGTH, ) imap["p_pairing_point_object"] = (structs.u256Span, PAIRING_POINT_OBJECT_LENGTH) imap["libra_sum"] = structs.u384 imap["sumcheck_univariates_flat"] = ( structs.u256Span, self.vk.log_circuit_size * ZK_BATCHED_RELATION_PARTIAL_LENGTH, ) imap["sumcheck_evaluations"] = ( structs.u256Span, hk.NUMBER_OF_ENTITIES - len(Wire.unused_indexes()), ) imap["libra_evaluation"] = structs.u384 imap["tp_sum_check_u_challenges"] = ( structs.u128Span, self.vk.log_circuit_size, ) imap["tp_gate_challenge"] = structs.u128 imap["tp_eta_1"] = structs.u384 imap["tp_eta_2"] = structs.u384 imap["tp_eta_3"] = structs.u384 imap["tp_beta"] = structs.u384 imap["tp_gamma"] = structs.u384 imap["tp_base_rlc"] = structs.u384 imap["tp_alpha"] = structs.u128 imap["tp_libra_challenge"] = structs.u384 return imap def _execute_circuit_logic( self, circuit: ZKHonkVerifierCircuits, vars: dict ) -> ModuloCircuit: tp_delta = circuit.compute_public_input_delta( vars["p_public_inputs"], vars["p_pairing_point_object"], vars["tp_beta"], vars["tp_gamma"], ) sumcheck_univariates_flat = vars["sumcheck_univariates_flat"] sumcheck_univariates = [] for i in range(self.vk.log_circuit_size): sumcheck_univariates.append( sumcheck_univariates_flat[ i * ZK_BATCHED_RELATION_PARTIAL_LENGTH : (i + 1) * ZK_BATCHED_RELATION_PARTIAL_LENGTH ] ) assert len(sumcheck_univariates) == self.vk.log_circuit_size assert len(sumcheck_univariates[0]) == ZK_BATCHED_RELATION_PARTIAL_LENGTH assert len(vars["sumcheck_evaluations"]) == len(Wire) check_rlc, check = circuit.verify_sum_check( vars["libra_sum"], sumcheck_univariates, vars["sumcheck_evaluations"], vars["libra_evaluation"], vars["tp_beta"], vars["tp_gamma"], tp_delta, vars["tp_eta_1"], vars["tp_eta_2"], vars["tp_eta_3"], vars["tp_libra_challenge"], vars["tp_sum_check_u_challenges"], vars["tp_gate_challenge"], vars["tp_alpha"], self.vk.log_circuit_size, vars["tp_base_rlc"], ) assert type(check_rlc) == ModuloCircuitElement assert type(check) == ModuloCircuitElement circuit.extend_struct_output(u384("check_rlc", elmts=[check_rlc])) circuit.extend_struct_output(u384("check", elmts=[check])) return circuit class ZKPrepareScalarsCircuit(ZKBaseUltraHonkCircuit): def __init__( self, vk: HonkVk, curve_id: int = CurveID.GRUMPKIN.value, auto_run: bool = True, compilation_mode: int = 1, ) -> None: name = f"zkhonk_prep_msm_scalars_size_{vk.log_circuit_size}" self.vk = vk self.scalar_indexes = [] super().__init__( name, vk.log_circuit_size, curve_id, auto_run, compilation_mode ) @property def input_map(self) -> dict: imap = {} imap["p_sumcheck_evaluations"] = (structs.u256Span, hk.NUMBER_OF_ENTITIES) imap["p_gemini_masking_eval"] = structs.u384 imap["p_gemini_a_evaluations"] = (structs.u256Span, self.vk.log_circuit_size) imap["p_libra_poly_evals"] = (structs.u256Span, 4) imap["tp_gemini_r"] = structs.u384 imap["tp_rho"] = structs.u384 imap["tp_shplonk_z"] = structs.u384 imap["tp_shplonk_nu"] = structs.u384 imap["tp_sum_check_u_challenges"] = ( structs.u128Span, self.vk.log_circuit_size, ) return imap def _execute_circuit_logic( self, circuit: ZKHonkVerifierCircuits, vars: dict ) -> ModuloCircuit: assert len(vars["p_sumcheck_evaluations"]) == len(Wire) scalars = circuit.compute_shplemini_msm_scalars( vars["p_sumcheck_evaluations"], vars["p_gemini_masking_eval"], vars["p_gemini_a_evaluations"], vars["p_libra_poly_evals"], vars["tp_gemini_r"], vars["tp_rho"], vars["tp_shplonk_z"], vars["tp_shplonk_nu"], vars["tp_sum_check_u_challenges"], ) scalars_filtered_no_nones = filter_msm_scalars( scalars, self.vk.log_circuit_size ) # Remove shplonk_z (last scalar) (included in transcript) scalars_filtered_no_nones = scalars_filtered_no_nones[:-1] self.msm_len = len(scalars_filtered_no_nones) + 1 # For each filtered scalar, find its original index by matching offset self.scalar_indexes = [] for scalar in scalars_filtered_no_nones: original_index = next( i for i, orig_scalar in enumerate(scalars) if orig_scalar is not None and orig_scalar.offset == scalar.offset ) self.scalar_indexes.append(original_index) circuit.extend_struct_output( u384(f"scalar_{original_index}", elmts=[scalar]) ) self.msm_len = len(scalars_filtered_no_nones) + 1 return circuit class ZKEvalsConsistencyCircuit(ZKBaseUltraHonkCircuit): def __init__( self, vk: HonkVk, curve_id: int = CurveID.GRUMPKIN.value, auto_run: bool = True, compilation_mode: int = 1, ) -> None: name = f"zk_honk_evals_consist_size_{vk.log_circuit_size}" self.vk = vk super().__init__( name, vk.log_circuit_size, curve_id, auto_run, compilation_mode ) @property def input_map(self) -> dict: imap = {} imap["p_libra_evaluation"] = structs.u384 imap["p_libra_poly_evals"] = (structs.u256Span, 4) imap["tp_gemini_r"] = structs.u384 imap["tp_sum_check_u_challenges"] = ( structs.u128Span, hk.CONST_PROOF_SIZE_LOG_N, ) return imap def _execute_circuit_logic( self, circuit: ZKHonkVerifierCircuits, vars: dict ) -> ModuloCircuit: vanishing_check, diff_check = circuit.check_evals_consistency( vars["p_libra_evaluation"], vars["p_libra_poly_evals"], vars["tp_gemini_r"], vars["tp_sum_check_u_challenges"], ) assert type(vanishing_check) == ModuloCircuitElement assert type(diff_check) == ModuloCircuitElement circuit.extend_struct_output(u384("vanishing_check", elmts=[vanishing_check])) circuit.extend_struct_output(u384("diff_check", elmts=[diff_check])) return circuit class ZKEvalsConsistencyInitCircuit(ZKBaseUltraHonkCircuit): def __init__( self, vk: HonkVk, curve_id: int = CurveID.GRUMPKIN.value, auto_run: bool = True, compilation_mode: int = 1, ) -> None: name = f"zk_honk_evals_cons_init_size_{vk.log_circuit_size}" self.vk = vk super().__init__( name, vk.log_circuit_size, curve_id, auto_run, compilation_mode ) @property def input_map(self) -> dict: imap = {} imap["tp_gemini_r"] = structs.u384 return imap def _execute_circuit_logic( self, circuit: ZKHonkVerifierCircuits, vars: dict ) -> ModuloCircuit: challenge_poly_eval, root_power_times_tp_gemini_r = ( circuit._check_evals_consistency_init( vars["tp_gemini_r"], ) ) assert type(challenge_poly_eval) == ModuloCircuitElement assert type(root_power_times_tp_gemini_r) == ModuloCircuitElement circuit.extend_struct_output( u384("challenge_poly_eval", elmts=[challenge_poly_eval]) ) circuit.extend_struct_output( u384("root_power_times_tp_gemini_r", elmts=[root_power_times_tp_gemini_r]) ) return circuit class ZKEvalsConsistencyLoopCircuit(ZKBaseUltraHonkCircuit): def __init__( self, vk: HonkVk, curve_id: int = CurveID.GRUMPKIN.value, auto_run: bool = True, compilation_mode: int = 1, ) -> None: name = f"zk_honk_evals_cons_loop_size_{vk.log_circuit_size}" self.vk = vk super().__init__( name, vk.log_circuit_size, curve_id, auto_run, compilation_mode ) @property def input_map(self) -> dict: imap = {} imap["challenge_poly_eval"] = structs.u384 imap["root_power_times_tp_gemini_r"] = structs.u384 imap["tp_sumcheck_u_challenge"] = structs.u384 return imap def _execute_circuit_logic( self, circuit: ZKHonkVerifierCircuits, vars: dict ) -> ModuloCircuit: challenge_poly_eval, root_power_times_tp_gemini_r = ( circuit._check_evals_consistency_loop( vars["challenge_poly_eval"], vars["root_power_times_tp_gemini_r"], vars["tp_sumcheck_u_challenge"], ) ) assert type(challenge_poly_eval) == ModuloCircuitElement assert type(root_power_times_tp_gemini_r) == ModuloCircuitElement circuit.extend_struct_output( u384("challenge_poly_eval", elmts=[challenge_poly_eval]) ) circuit.extend_struct_output( u384("root_power_times_tp_gemini_r", elmts=[root_power_times_tp_gemini_r]) ) return circuit class ZKEvalsConsistencyDoneCircuit(ZKBaseUltraHonkCircuit): def __init__( self, vk: HonkVk, curve_id: int = CurveID.GRUMPKIN.value, auto_run: bool = True, compilation_mode: int = 1, ) -> None: name = f"zk_honk_evals_cons_done_size_{vk.log_circuit_size}" self.vk = vk super().__init__( name, vk.log_circuit_size, curve_id, auto_run, compilation_mode ) @property def input_map(self) -> dict: imap = {} imap["p_libra_evaluation"] = structs.u384 imap["p_libra_poly_evals"] = (structs.u256Span, 4) imap["tp_gemini_r"] = structs.u384 imap["challenge_poly_eval"] = structs.u384 imap["root_power_times_tp_gemini_r"] = structs.u384 return imap def _execute_circuit_logic( self, circuit: ZKHonkVerifierCircuits, vars: dict ) -> ModuloCircuit: vanishing_check, diff_check = circuit._check_evals_consistency_done( vars["p_libra_evaluation"], vars["p_libra_poly_evals"], vars["tp_gemini_r"], vars["challenge_poly_eval"], vars["root_power_times_tp_gemini_r"], ) assert type(vanishing_check) == ModuloCircuitElement assert type(diff_check) == ModuloCircuitElement circuit.extend_struct_output(u384("vanishing_check", elmts=[vanishing_check])) circuit.extend_struct_output(u384("diff_check", elmts=[diff_check])) return circuit ================================================ FILE: hydra/garaga/precompiled_circuits/ec.py ================================================ import sympy from garaga.curves import CURVES from garaga.modulo_circuit import ModuloCircuit, ModuloCircuitElement, PyFelt, WriteOps from garaga.precompiled_circuits.fp2 import Fp2Circuits def is_quad_residue(n, p): """ Returns True if n is a quadratic residue mod p. """ return sympy.ntheory.residue_ntheory.is_quad_residue(n, p) def sqrt_mod_p(n, p): """ Finds the minimum non-negative integer m such that (m*m) % p == n. """ return min(sympy.ntheory.residue_ntheory.sqrt_mod(n, p, all_roots=True)) class IsOnCurveCircuit(Fp2Circuits): def __init__(self, name: str, curve_id: int, compilation_mode: int = 0): super().__init__( name=name, curve_id=curve_id, compilation_mode=compilation_mode, generic_circuit=True, ) self.curve = CURVES[curve_id] def set_consts( self, a: PyFelt | ModuloCircuitElement, b: PyFelt | ModuloCircuitElement, b20: PyFelt | ModuloCircuitElement, b21: PyFelt | ModuloCircuitElement, ): self.a = self.write_element(a) if isinstance(a, PyFelt) else a self.b = self.write_element(b) if isinstance(b, PyFelt) else b self.b20 = self.write_element(b20) if isinstance(b20, PyFelt) else b20 self.b21 = self.write_element(b21) if isinstance(b21, PyFelt) else b21 def _is_on_curve_G1( self, x: ModuloCircuitElement, y: ModuloCircuitElement ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: # y^2 = x^3 + ax + b a = self.a b = self.b y2 = self.mul(y, y) x3 = self.mul(x, self.mul(x, x)) if a.value != 0: ax = self.mul(a, x) x3_ax_b = self.add(x3, self.add(ax, b)) else: x3_ax_b = self.add(x3, b) return y2, x3_ax_b def _is_on_curve_G2( self, x0: ModuloCircuitElement, x1: ModuloCircuitElement, y0: ModuloCircuitElement, y1: ModuloCircuitElement, ): # y^2 = x^3 + ax + b [Fp2] a = self.a b0 = self.b20 b1 = self.b21 y2 = self.fp2_square([y0, y1]) x2 = self.fp2_square([x0, x1]) x3 = self.fp2_mul([x0, x1], x2) ax = [self.mul(a, x0), self.mul(a, x1)] ax_b = [self.add(ax[0], b0), self.add(ax[1], b1)] x3_ax_b = [self.add(x3[0], ax_b[0]), self.add(x3[1], ax_b[1])] return y2, x3_ax_b class DerivePointFromX(ModuloCircuit): def __init__(self, name: str, curve_id: int, compilation_mode: int = 0): super().__init__( name=name, curve_id=curve_id, generic_circuit=True, compilation_mode=compilation_mode, ) self.curve = CURVES[curve_id] def _derive_point_from_x( self, x: ModuloCircuitElement, a: ModuloCircuitElement, b: ModuloCircuitElement, g: ModuloCircuitElement, ) -> list[ModuloCircuitElement]: # y^2 = x^3 + ax + b # Assumes a == 0. x3 = self.mul(x, self.mul(x, x)) rhs = self.add(x3, self.add(self.mul(a, x), b)) grhs = self.mul(g, rhs) # WRITE g*rhs and rhs "square roots" to circuit. # If rhs is a square, write zero to gx and the square root of rhs to x3_ax_b_sqrt. # Otherwise, write the square root of gx to gx_sqrt and zero to x3_ax_b_sqrt. ## %{ if is_quad_residue(rhs.value, self.field.p): rhs_sqrt = self.write_element( self.field(sqrt_mod_p(rhs.value, self.field.p)), WriteOps.WITNESS, ) grhs_sqrt = self.write_element(self.field.zero(), WriteOps.WITNESS) else: assert is_quad_residue(grhs.value, self.field.p) # Sanity check. rhs_sqrt = self.write_element(self.field.zero(), WriteOps.WITNESS) grhs_sqrt = self.write_element( self.field(sqrt_mod_p(grhs.value, self.field.p)), WriteOps.WITNESS, ) ## %} should_be_rhs = self.mul(rhs_sqrt, rhs_sqrt) should_be_grhs = self.mul(grhs_sqrt, grhs_sqrt) return (rhs, grhs, should_be_rhs, should_be_grhs, rhs_sqrt) class DecompressG1Point(ModuloCircuit): """ A class to decompress a G1 point on an elliptic curve given the x-coordinate. This class is a specialized ModuloCircuit that uses the curve parameters to compute the y-coordinate from a given x-coordinate, ensuring that the point lies on the curve. The y-coordinate is determined using the s_bit, which is extracted from the compressed G1 point. The s_bit indicates which of the two possible y-coordinates (positive or negative) should be selected. """ def __init__(self, name: str, curve_id: int, compilation_mode: int = 0): super().__init__( name=name, curve_id=curve_id, generic_circuit=True, compilation_mode=compilation_mode, ) self.curve = CURVES[curve_id] def derive_y_from_x( self, b: ModuloCircuitElement, x: ModuloCircuitElement, ) -> ModuloCircuitElement: """ Derive the two possible y-coordinates from the given x-coordinate on the elliptic curve. Ensures that the point lies on the curve. Assumes that the curve equation is y^2 = x^3 + b. :param x: The x-coordinate as a ModuloCircuitElement. :param b: The curve parameter b as a ModuloCircuitElement. :return: The two possible y-coordinates as a ModuloCircuitElement. No assumption on the order of the two y-coordinates. :raises AssertionError: If the x-coordinate does not lie on the curve. """ assert ( CURVES[self.curve_id].a == 0 ), "This circuit is only supported for curves with a = 0" assert ( self.compilation_mode == 0 ), "This circuit is only supported for CairoZero" # y^2 = x^3 + b x3 = self.mul(x, self.mul(x, x)) rhs = self.add(x3, b) y = self.fp_sqrt(rhs) neg_y = self.neg(y) return (y, neg_y) class ECIPCircuits(ModuloCircuit): def __init__( self, name: str, curve_id: int, compilation_mode: int = 0, generic_circuit: bool = True, ): super().__init__( name=name, curve_id=curve_id, generic_circuit=generic_circuit, compilation_mode=compilation_mode, ) self.curve = CURVES[curve_id] def _slope_intercept_same_point( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], A_weirstrass: ModuloCircuitElement, ): # Compute doubling slope m = (3x^2 + A) / 2y xA0, yA0 = P three = self.set_or_get_constant(self.field(3)) mA0_num = self.add( self.mul(three, self.mul(xA0, xA0)), A_weirstrass, ) mA0_den = self.add(yA0, yA0) m_A0 = self.div(mA0_num, mA0_den) # Compute intercept b = y - x*m b_A0 = self.sub(yA0, self.mul(xA0, m_A0)) # Compute A2 = -(2*P) xA2 = self.sub(self.mul(m_A0, m_A0), self.add(xA0, xA0)) yA2 = self.sub(self.mul(m_A0, self.sub(xA0, xA2)), yA0) yA2 = self.neg(yA2) # Compute slope between A0 and A2 mA0A2_num = self.sub(yA2, yA0) mA0A2_den = self.sub(xA2, xA0) m_A0A2 = self.div(mA0A2_num, mA0A2_den) # coeff2 = (2 * yA2) * (xA0 - xA2) / (3 * xA2^2 + A - 2 * m * yA2) m_yA2 = self.mul(m_A0A2, yA2) coeff2 = self.div( self.mul(self.add(yA2, yA2), self.sub(xA0, xA2)), self.add( self.mul(three, self.mul(xA2, xA2)), self.sub(A_weirstrass, self.add(m_yA2, m_yA2)), ), ) coeff0 = self.add(coeff2, self.add(m_A0A2, m_A0A2)) # Return slope intercept of A0 (for RHS) and coeff0/2 for LHS return ( m_A0, b_A0, xA0, yA0, xA2, yA2, coeff0, coeff2, ) def _accumulate_eval_point_challenge_signed_same_point( self, eval_accumulator: ModuloCircuitElement, slope_intercept: tuple[ModuloCircuitElement, ModuloCircuitElement], xA: ModuloCircuitElement, P: tuple[ModuloCircuitElement, ModuloCircuitElement], ep: ModuloCircuitElement, en: ModuloCircuitElement, sign_ep: ModuloCircuitElement, sign_en: ModuloCircuitElement, ) -> ModuloCircuitElement: assert isinstance(ep, ModuloCircuitElement) and isinstance( en, ModuloCircuitElement ) assert isinstance(sign_ep, ModuloCircuitElement) and isinstance( sign_en, ModuloCircuitElement ) m, b = slope_intercept xP, yP = P num = self.sub(xA, xP) # den_tmp = m*xP + b den_tmp = self.add(self.mul(m, xP), b) # den_pos = yP - (m*xP + b) = yP - m*xP - b den_pos = self.sub(yP, den_tmp) # den_neg = -yP - m*xP -b den_neg = self.sub(self.neg(yP), den_tmp) eval_pos = self.mul(self.mul(sign_ep, ep), self.div(num, den_pos)) eval_neg = self.mul(self.mul(sign_en, en), self.div(num, den_neg)) eval_signed = self.add(eval_pos, eval_neg) res = self.add(eval_accumulator, eval_signed) return res def _RHS_finalize_acc( self, eval_accumulator: ModuloCircuitElement, slope_intercept: tuple[ModuloCircuitElement, ModuloCircuitElement], xA: ModuloCircuitElement, Q: tuple[ModuloCircuitElement, ModuloCircuitElement], ): m, b = slope_intercept xQ, yQ = Q num = self.sub(xA, xQ) # den_tmp = m*xQ + b den_tmp = self.add(self.mul(m, xQ), b) # den_neg = -yQ - m*xQ -b den_neg = self.sub(self.neg(yQ), den_tmp) eval_neg = self.div(num, den_neg) res = self.add(eval_accumulator, eval_neg) return res def _eval_function_challenge_single( self, A: tuple[ModuloCircuitElement, ModuloCircuitElement], coeff: ModuloCircuitElement, log_div_a_num: list[ModuloCircuitElement], log_div_a_den: list[ModuloCircuitElement], log_div_b_num: list[ModuloCircuitElement], log_div_b_den: list[ModuloCircuitElement], var_name: str = "xA", ) -> ModuloCircuitElement: xA, yA = A F_A = self.add( self.div( self.eval_horner( log_div_a_num, xA, poly_name="sumdlogdiv_a_num", var_name=var_name ), self.eval_horner( log_div_a_den, xA, poly_name="sumdlogdiv_a_den", var_name=var_name ), ), self.mul( yA, self.div( self.eval_horner( log_div_b_num, xA, poly_name="sumdlogdiv_b_num", var_name=var_name, ), self.eval_horner( log_div_b_den, xA, poly_name="sumdlogdiv_b_den", var_name=var_name, ), ), ), ) return self.mul(coeff, F_A) def _eval_function_challenge_dupl( self, A0: tuple[ModuloCircuitElement, ModuloCircuitElement], A2: tuple[ModuloCircuitElement, ModuloCircuitElement], coeff0: ModuloCircuitElement, coeff2: ModuloCircuitElement, log_div_a_num: list[ModuloCircuitElement], log_div_a_den: list[ModuloCircuitElement], log_div_b_num: list[ModuloCircuitElement], log_div_b_den: list[ModuloCircuitElement], ) -> ModuloCircuitElement: # F = a(x) + y*b(x), a and b being rational functions. # computes coeff0*F(A0) - coeff2*F(A2) xA0, yA0 = A0 xA2, yA2 = A2 F_A0 = self._eval_function_challenge_single( A0, coeff0, log_div_a_num, log_div_a_den, log_div_b_num, log_div_b_den, var_name="xA0", ) F_A2 = self._eval_function_challenge_single( A2, coeff2, log_div_a_num, log_div_a_den, log_div_b_num, log_div_b_den, var_name="xA2", ) # return coeff0*F(A0) - coeff2*F(A2) res = self.sub(F_A0, F_A2) return res def _init_function_challenge_dupl( self, xA0: ModuloCircuitElement, xA2: ModuloCircuitElement, log_div_a_num: list[ModuloCircuitElement], log_div_a_den: list[ModuloCircuitElement], log_div_b_num: list[ModuloCircuitElement], log_div_b_den: list[ModuloCircuitElement], ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: # F = a(x) + y*b(x), a and b being rational functions. # computes F(A0) and F(A2) # Precompute powers of xA0 and xA2 for evaluating the polynomials. xA0_powers = [xA0] xA2_powers = [xA2] for i in range(len(log_div_b_den) - 2): xA0_powers.append(self.mul(xA0_powers[-1], xA0, comment=f"xA0^{i+2}")) xA2_powers.append(self.mul(xA2_powers[-1], xA2, comment=f"xA2^{i+2}")) A_NUM_A0 = self.eval_poly( log_div_a_num, xA0_powers, poly_name="sumdlogdiv_a_num", var_name="xA0" ) A_DEN_A0 = self.eval_poly( log_div_a_den, xA0_powers, poly_name="sumdlogdiv_a_den", var_name="xA0" ) B_NUM_A0 = self.eval_poly( log_div_b_num, xA0_powers, poly_name="sumdlogdiv_b_num", var_name="xA0" ) B_DEN_A0 = self.eval_poly( log_div_b_den, xA0_powers, poly_name="sumdlogdiv_b_den", var_name="xA0" ) A_NUM_A2 = self.eval_poly( log_div_a_num, xA2_powers, poly_name="sumdlogdiv_a_num", var_name="xA2" ) A_DEN_A2 = self.eval_poly( log_div_a_den, xA2_powers, poly_name="sumdlogdiv_a_den", var_name="xA2" ) B_NUM_A2 = self.eval_poly( log_div_b_num, xA2_powers, poly_name="sumdlogdiv_b_num", var_name="xA2" ) B_DEN_A2 = self.eval_poly( log_div_b_den, xA2_powers, poly_name="sumdlogdiv_b_den", var_name="xA2" ) # return F(A0) and F(A2), and the last power of xA0 and xA2 used in a_den (also equal to b_num) a_den_degree = len(log_div_a_den) - 1 assert a_den_degree == len(log_div_b_num) - 1 return ( A_NUM_A0, A_DEN_A0, B_NUM_A0, B_DEN_A0, A_NUM_A2, A_DEN_A2, B_NUM_A2, B_DEN_A2, xA0_powers[a_den_degree - 1], xA2_powers[a_den_degree - 1], ) def _accumulate_function_challenge_dupl( self, a_num_acc_A0: ModuloCircuitElement, a_den_acc_A0: ModuloCircuitElement, b_num_acc_A0: ModuloCircuitElement, b_den_acc_A0: ModuloCircuitElement, a_num_acc_A2: ModuloCircuitElement, a_den_acc_A2: ModuloCircuitElement, b_num_acc_A2: ModuloCircuitElement, b_den_acc_A2: ModuloCircuitElement, xA0: ModuloCircuitElement, xA2: ModuloCircuitElement, xA0_power: ModuloCircuitElement, xA2_power: ModuloCircuitElement, next_a_num_coeff: ModuloCircuitElement, next_a_den_coeff: ModuloCircuitElement, next_b_num_coeff: ModuloCircuitElement, next_b_den_coeff: ModuloCircuitElement, ): # Update accumulators for A0 new_a_num_acc_A0 = self.add(a_num_acc_A0, self.mul(next_a_num_coeff, xA0_power)) next_xA0_power = self.mul(xA0_power, xA0) new_a_den_acc_A0 = self.add( a_den_acc_A0, self.mul(next_a_den_coeff, next_xA0_power) ) new_b_num_acc_A0 = self.add( b_num_acc_A0, self.mul(next_b_num_coeff, next_xA0_power) ) next_b_den_A0_power = self.mul(next_xA0_power, xA0) for _ in range(2): next_b_den_A0_power = self.mul(next_b_den_A0_power, xA0) new_b_den_acc_A0 = self.add( b_den_acc_A0, self.mul(next_b_den_coeff, next_b_den_A0_power) ) # Update accumulators for A2 new_a_num_acc_A2 = self.add(a_num_acc_A2, self.mul(next_a_num_coeff, xA2_power)) next_xA2_power = self.mul(xA2_power, xA2) new_a_den_acc_A2 = self.add( a_den_acc_A2, self.mul(next_a_den_coeff, next_xA2_power) ) new_b_num_acc_A2 = self.add( b_num_acc_A2, self.mul(next_b_num_coeff, next_xA2_power) ) next_b_den_A2_power = next_xA2_power for _ in range(3): next_b_den_A2_power = self.mul(next_b_den_A2_power, xA2) new_b_den_acc_A2 = self.add( b_den_acc_A2, self.mul(next_b_den_coeff, next_b_den_A2_power) ) return ( new_a_num_acc_A0, new_a_den_acc_A0, new_b_num_acc_A0, new_b_den_acc_A0, new_a_num_acc_A2, new_a_den_acc_A2, new_b_num_acc_A2, new_b_den_acc_A2, next_xA0_power, next_xA2_power, ) def _finalize_function_challenge_dupl( self, a_num_acc_A0: ModuloCircuitElement, a_den_acc_A0: ModuloCircuitElement, b_num_acc_A0: ModuloCircuitElement, b_den_acc_A0: ModuloCircuitElement, a_num_acc_A2: ModuloCircuitElement, a_den_acc_A2: ModuloCircuitElement, b_num_acc_A2: ModuloCircuitElement, b_den_acc_A2: ModuloCircuitElement, yA0: ModuloCircuitElement, yA2: ModuloCircuitElement, coeff_A0: ModuloCircuitElement, coeff_A2: ModuloCircuitElement, ): F_A0 = self.add( self.div(a_num_acc_A0, a_den_acc_A0), self.mul(yA0, self.div(b_num_acc_A0, b_den_acc_A0)), comment="a(x0) + y0 b(x0)", ) F_A2 = self.add( self.div(a_num_acc_A2, a_den_acc_A2), self.mul(yA2, self.div(b_num_acc_A2, b_den_acc_A2)), comment="a(x2) + y2 b(x2)", ) # return coeff0*F(A0) - coeff2*F(A2) res = self.sub(self.mul(coeff_A0, F_A0), self.mul(coeff_A2, F_A2)) return res class BasicEC(ModuloCircuit): def __init__(self, name: str, curve_id: int, compilation_mode: int = 0): super().__init__( name=name, curve_id=curve_id, generic_circuit=True, compilation_mode=compilation_mode, ) self.curve = CURVES[curve_id] def _compute_adding_slope( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], Q: tuple[ModuloCircuitElement, ModuloCircuitElement], ): xP, yP = P xQ, yQ = Q slope = self.div(self.sub(yP, yQ), self.sub(xP, xQ)) return slope def _compute_doubling_slope( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], A: ModuloCircuitElement, ): xP, yP = P # Compute doubling slope m = (3x^2 + A) / 2y three = self.set_or_get_constant(self.field(3)) m_num = self.add( self.mul(three, self.mul(xP, xP)), A, ) m_den = self.add(yP, yP) m = self.div(m_num, m_den) return m def add_points( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], Q: tuple[ModuloCircuitElement, ModuloCircuitElement], ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: xP, yP = P xQ, yQ = Q slope = self._compute_adding_slope(P, Q) slope_sqr = self.mul(slope, slope) nx = self.sub(self.sub(slope_sqr, xP), xQ) ny = self.sub(self.mul(slope, self.sub(xP, nx)), yP) return (nx, ny) def double_point( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], A: ModuloCircuitElement, ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: xP, yP = P slope = self._compute_doubling_slope(P, A) slope_sqr = self.mul(slope, slope) nx = self.sub(self.sub(slope_sqr, xP), xP) ny = self.sub(self.mul(slope, self.sub(xP, nx)), yP) return (nx, ny) def scalar_mul_2_pow_k( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], A: ModuloCircuitElement, k: int, ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: for _ in range(k): P = self.double_point(P, A) return P def _is_on_curve_G1_weirstrass( self, x: ModuloCircuitElement, y: ModuloCircuitElement, A: ModuloCircuitElement, b: ModuloCircuitElement, ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: # y^2 = x^3 + ax + b y2 = self.mul(y, y) x3 = self.mul(x, self.mul(x, x)) ax = self.mul(A, x) x3_ax_b = self.add(x3, self.add(ax, b)) return y2, x3_ax_b def negate_point( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement] ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """Negate a point in G1.""" x, y = P return (x, self.neg(y)) def add_points( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], Q: tuple[ModuloCircuitElement, ModuloCircuitElement], ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """Add two points in G1.""" xP, yP = P xQ, yQ = Q slope = self._compute_adding_slope(P, Q) slope_sqr = self.mul(slope, slope) nx = self.sub(self.sub(slope_sqr, xP), xQ) ny = self.sub(self.mul(slope, self.sub(xP, nx)), yP) return (nx, ny) def double_point_a_eq_0( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """Double a point in G1 when curve parameter a=0.""" xP, yP = P three = self.set_or_get_constant(self.field(3)) slope = self.div( self.mul(three, self.mul(xP, xP)), self.add(yP, yP) # 3x^2 # 2y ) slope_sqr = self.mul(slope, slope) nx = self.sub(self.sub(slope_sqr, xP), xP) ny = self.sub(self.mul(slope, self.sub(xP, nx)), yP) return (nx, ny) def triple_point( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], A: ModuloCircuitElement, ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """Triple a point in G1.""" xP, yP = P # compute λ1 = (3p.x²+a)/2p.y, xx = self.square(xP) three_xx = self.sum([xx, xx, xx]) m_num = self.add(three_xx, A) λ1 = self.div(m_num, self.double(yP)) # xr = λ1²-2p.x x2 = self.sub(self.square(λ1), self.add(xP, xP)) # omit y2 computation, and # compute λ2 = 2p.y/(x2 − p.x) − λ1. x1x2 = self.sub(xP, x2) λ2 = self.div(self.double(yP), x1x2) λ2 = self.sub(λ2, λ1) # xr = λ²-p.x-x2 xr = self.sub(self.square(λ2), self.add(xP, x2)) # yr = λ(p.x-xr) - p.y yr = self.sub(self.mul(λ2, self.sub(xP, xr)), yP) return (xr, yr) def double_n_times( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], n: int ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """Double a point n times in G1.""" Q = P for _ in range(n): Q = self.double_point_a_eq_0(Q) return Q def n_quadruple_and_add( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], adds: list[tuple[ModuloCircuitElement, ModuloCircuitElement]], A_weirstrass: ModuloCircuitElement, ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """Quadruple a point n times and add it to the point.""" Q = P for add in adds: Q = self.double_point(Q, A_weirstrass) Q = self.double_and_add(Q, add) return Q def double_and_add( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], add: tuple[ModuloCircuitElement, ModuloCircuitElement], ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """Double a point and add it to the point.""" Px, Py = P Qx, Qy = add # compute λ1 = (q.y-p.y)/(q.x-p.x) yqyp = self.sub(Qy, Py) xqxp = self.sub(Qx, Px) λ1 = self.div(yqyp, xqxp) # compute x2 = λ1²-p.x-q.x x2 = self.sub(self.square(λ1), self.add(Px, Qx)) # omit y2 computation # compute -λ2 = λ1+2*p.y/(x2-p.x) ypyp = self.double(Py) x2xp = self.sub(x2, Px) λ2 = self.div(ypyp, x2xp) λ2 = self.add(λ1, λ2) # compute x3 = (-λ2)²-p.x-x2 x3 = self.sub(self.square(λ2), self.add(Px, x2)) # compute y3 = -λ2*(x3 - p.x)-p.y y3 = self.sub(self.mul(λ2, self.sub(x3, Px)), Py) return (x3, y3) class BasicECG2(Fp2Circuits): def __init__(self, name: str, curve_id: int, compilation_mode: int = 0): super().__init__( name=name, curve_id=curve_id, generic_circuit=True, compilation_mode=compilation_mode, ) self.curve = CURVES[curve_id] def _is_on_curve_G2_weirstrass( self, x0: ModuloCircuitElement, x1: ModuloCircuitElement, y0: ModuloCircuitElement, y1: ModuloCircuitElement, a: ModuloCircuitElement, b0: ModuloCircuitElement, b1: ModuloCircuitElement, ): # y^2 = x^3 + ax + b [Fp2] y2 = self.fp2_square([y0, y1]) x2 = self.fp2_square([x0, x1]) x3 = self.fp2_mul([x0, x1], x2) ax = [self.mul(a, x0), self.mul(a, x1)] ax_b = [self.add(ax[0], b0), self.add(ax[1], b1)] x3_ax_b = [self.add(x3[0], ax_b[0]), self.add(x3[1], ax_b[1])] return y2, x3_ax_b def _compute_adding_slope( self, P: tuple[ tuple[ModuloCircuitElement, ModuloCircuitElement], tuple[ModuloCircuitElement, ModuloCircuitElement], ], Q: tuple[ tuple[ModuloCircuitElement, ModuloCircuitElement], tuple[ModuloCircuitElement, ModuloCircuitElement], ], ): xP, yP = P xQ, yQ = Q slope = self.fp2_div(self.vector_sub(yP, yQ), self.vector_sub(xP, xQ)) return slope def _compute_doubling_slope_a_eq_0( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], ): xP, yP = P # Compute doubling slope m = (3x^2 + A) / 2y three = self.set_or_get_constant(self.field(3)) m_num = self.vector_scale(self.fp2_square(xP), three) m_den = self.vector_add(yP, yP) m = self.fp2_div(m_num, m_den) return m def add_points( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], Q: tuple[ModuloCircuitElement, ModuloCircuitElement], ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: xP, yP = P xQ, yQ = Q slope = self._compute_adding_slope(P, Q) slope_sqr = self.fp2_square(slope) nx = self.vector_sub(self.vector_sub(slope_sqr, xP), xQ) ny = self.vector_sub(self.fp2_mul(slope, self.vector_sub(xP, nx)), yP) return (nx, ny) def double_point_a_eq_0( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: xP, yP = P slope = self._compute_doubling_slope_a_eq_0(P) slope_sqr = self.fp2_square(slope) nx = self.vector_sub(self.vector_sub(slope_sqr, xP), xP) ny = self.vector_sub(self.fp2_mul(slope, self.vector_sub(xP, nx)), yP) return (nx, ny) def double_n_times(self, P, n): Q = P for _ in range(n): Q = self.double_point_a_eq_0(Q) return Q def negate_point( self, P: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]] ) -> tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]: x, y = P return (x, self.vector_neg(y)) def double_and_add( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], add: tuple[ModuloCircuitElement, ModuloCircuitElement], ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """Double a point and add it to the point.""" Px, Py = P Qx, Qy = add # compute λ1 = (q.y-p.y)/(q.x-p.x) yqyp = self.vector_sub(Qy, Py) xqxp = self.vector_sub(Qx, Px) λ1 = self.fp2_div(yqyp, xqxp) # compute x2 = λ1²-p.x-q.x x2 = self.vector_sub(self.fp2_square(λ1), self.vector_add(Px, Qx)) # omit y2 computation # compute -λ2 = λ1+2*p.y/(x2-p.x) ypyp = self.vector_add(Py, Py) x2xp = self.vector_sub(x2, Px) λ2 = self.fp2_div(ypyp, x2xp) λ2 = self.vector_add(λ1, λ2) # compute x3 = (-λ2)²-p.x-x2 x3 = self.vector_sub(self.fp2_square(λ2), self.vector_add(Px, x2)) # compute y3 = -λ2*(x3 - p.x)-p.y y3 = self.vector_sub(self.fp2_mul(λ2, self.vector_sub(x3, Px)), Py) return (x3, y3) class FakeGLVCircuits(BasicEC): def __init__(self, name: str, curve_id: int, compilation_mode: int = 0): super().__init__(name, curve_id, compilation_mode) def prepare_points_glv_fake_glv( self, Px, P0y, P1y, Qx, Q0y, Phi_P0y, Phi_P1y, Phi_Q0y, Gen, third_root ): P0 = (Px, P0y) P1 = (Px, P1y) Q0 = (Qx, Q0y) S0 = self.add_points(P0, Q0) S1 = (S0[0], self.neg(S0[1])) S2 = self.add_points(P1, Q0) Phi_P0x = self.mul(Px, third_root) Phi_P0 = (Phi_P0x, Phi_P0y) Phi_P1 = (Phi_P0x, Phi_P1y) Phi_Q0x = self.mul(Q0[0], third_root) Phi_Q0 = (Phi_Q0x, Phi_Q0y) Phi_S0 = self.add_points(Phi_P0, Phi_Q0) Phi_S1 = (Phi_S0[0], self.neg(Phi_S0[1])) Phi_S2 = self.add_points(Phi_P1, Phi_Q0) Phi_S3 = (Phi_S2[0], self.neg(Phi_S2[1])) B1 = self.add_points(S1, Phi_S1) # P + Q + Φ(P) + Φ(Q) B2 = self.add_points(S1, Phi_S2) # P + Q + Φ(P) - Φ(Q) B3 = self.add_points(S1, Phi_S3) # P + Q - Φ(P) + Φ(Q) B4 = self.add_points(S1, Phi_S0) # P + Q - Φ(P) - Φ(Q) B5 = self.add_points(S2, Phi_S1) # P - Q + Φ(P) + Φ(Q) B6 = self.add_points(S2, Phi_S2) # P - Q + Φ(P) - Φ(Q) B7 = self.add_points(S2, Phi_S3) # P - Q - Φ(P) + Φ(Q) B8 = self.add_points(S2, Phi_S0) # P - Q - Φ(P) - Φ(Q) B9y = self.neg(B8[1]) # -P + Q + Φ(P) + Φ(Q) B10y = self.neg(B7[1]) # -P + Q + Φ(P) - Φ(Q) B11y = self.neg(B6[1]) # -P + Q - Φ(P) + Φ(Q) B12y = self.neg(B5[1]) # -P + Q - Φ(P) - Φ(Q) B13y = self.neg(B4[1]) # -P - Q + Φ(P) + Φ(Q) B14y = self.neg(B3[1]) # -P - Q + Φ(P) - Φ(Q) B15y = self.neg(B2[1]) # -P - Q - Φ(P) + Φ(Q) B16y = self.neg(B1[1]) # -P - Q - Φ(P) - Φ(Q) Acc = self.add_points(B1, Gen) return ( B1, B2, B3, B4, B5, B6, B7, B8, B9y, B10y, B11y, B12y, B13y, B14y, B15y, B16y, Phi_P0x, Phi_Q0x, Acc, ) def prepare_points_fake_glv( self, P: tuple[ModuloCircuitElement, ModuloCircuitElement], Q: tuple[ModuloCircuitElement, ModuloCircuitElement], s2_sign: ModuloCircuitElement, A_weirstrass: ModuloCircuitElement, ): P = (P[0], P[1]) Q = (Q[0], Q[1]) table_P = [None, None, None] # table_P[0] = (P[0], self.neg(P[0])) # Unused table_P[1] = P table_P[2] = self.triple_point(P, A_weirstrass) table_R = [None, None, None] R_signed = [Q[0], self.mul(s2_sign, Q[1])] table_R[0] = self.negate_point(R_signed) table_R[1] = R_signed table_R[2] = self.triple_point(R_signed, A_weirstrass) T1 = self.add_points(table_P[2], table_R[2]) T2 = Acc = self.add_points(table_P[1], table_R[1]) T3 = self.add_points(table_P[2], table_R[1]) T4 = self.add_points(table_P[1], table_R[2]) T5y = self.neg(T2[1]) T6y = self.neg(T1[1]) T7y = self.neg(T4[1]) T8y = self.neg(T3[1]) T9 = self.add_points(table_P[2], table_R[0]) _neg_table_R_verify_2 = self.negate_point(table_R[2]) T10 = self.add_points(table_P[1], _neg_table_R_verify_2) T11 = self.add_points(table_P[2], _neg_table_R_verify_2) T12 = self.add_points(table_R[0], table_P[1]) T13y = self.neg(T10[1]) T14y = self.neg(T9[1]) T15y = self.neg(T12[1]) T16y = self.neg(T11[1]) # P0y = table_P[0][1] return ( T1, T2, T3, T4, T5y, T6y, T7y, T8y, T9, T10, T11, T12, T13y, T14y, T15y, T16y, table_R[2], table_R[0][1], # R0y ) ================================================ FILE: hydra/garaga/precompiled_circuits/final_exp.py ================================================ """ Deprecated Final Exp Circuits since we now use the final exp witness. Kept for reference/in case we need it in the future. """ import copy from random import randint from garaga.algebra import get_sparsity from garaga.curves import BLS12_381_ID, BN254_ID, CURVES, CurveID from garaga.extension_field_modulo_circuit import ( AccPolyInstructionType, ExtensionFieldModuloCircuit, ModuloCircuitElement, Polynomial, PyFelt, ) from garaga.hints.extf_mul import ( nondeterministic_extension_field_mul_divmod, nondeterministic_square_torus, ) from garaga.hints.frobenius import get_frobenius_maps, get_V_torus_powers from garaga.modulo_circuit import WriteOps from garaga.poseidon_transcript import CairoPoseidonTranscript class FinalExpTorusCircuit(ExtensionFieldModuloCircuit): def __init__( self, name: str, curve_id: int, extension_degree: int, hash_input: bool = True ): super().__init__( name=name, curve_id=curve_id, extension_degree=extension_degree, hash_input=hash_input, ) self.frobenius_maps = {} self.v_torus_powers_inv = {} for i in [1, 2, 3]: _, self.frobenius_maps[i] = get_frobenius_maps( curve_id=curve_id, extension_degree=extension_degree, frob_power=i ) self.v_torus_powers_inv[i] = get_V_torus_powers( curve_id, extension_degree, i ).get_coeffs() # Write to circuit. Note : add_constant will return existing circuit constant if it already exists. self.v_torus_powers_inv[i] = [ self.set_or_get_constant(v) for v in self.v_torus_powers_inv[i] ] self.ops_counter.update({"MUL_TORUS": 0, "SQUARE_TORUS": 0}) self.set_or_get_constant(self.field(-1)) def final_exp_part1(self, X: list[PyFelt]) -> list[ModuloCircuitElement]: return NotImplementedError def square_torus( self: ExtensionFieldModuloCircuit, X: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: """ Computes the square of an element X in Torus Based Arithmetic SQ = 1/2(X+ v/X) <=> v = X (2SQ - X) Use hint to avoid v/X inversion. From SQ and X, compute v = X (2SQ - X). """ self.ops_counter["SQUARE_TORUS"] += 1 SQ: list[PyFelt] = nondeterministic_square_torus( X, self.curve_id, biject_from_direct=True ) SQ = self.write_elements(SQ, WriteOps.COMMIT) two_SQ = self.vector_add(SQ, SQ) two_SQ_min_X = self.vector_sub(two_SQ, X) # %{ Q, V = nondeterministic_extension_field_mul_divmod( [X, two_SQ_min_X], self.curve_id, self.extension_degree ) Q = Polynomial(Q) # Sanity check : ensure V is indeed V(x) = 1*x. assert all([v.value == 0 for i, v in enumerate(V) if i != 1]) assert V[1].value == 1, f"V(x) = {V[1].value}" # %} # Hacky way to pass SQ as R so that it is hashed. # Result is known in advance to be V, and not SQ. # R_sparsity encoded as this bypasses the usage of R coefficients. # Essentially, r_sparsity encodes R=V direcly by its static sparsity. self.accumulate_poly_instructions[0].append( AccPolyInstructionType.SQUARE_TORUS, Pis=[X, two_SQ_min_X], Q=Q, R=SQ, r_sparsity=[0, 2] + [0] * (self.extension_degree - 2), ) return SQ def n_square_torus(self, X: list[PyFelt], n: int) -> list[PyFelt]: result = self.square_torus(X) for _ in range(n - 1): result = self.square_torus(result) return result def mul_torus( self, X: list[ModuloCircuitElement], Y: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: """ Computes Mul(X,Y) = (X*Y + v)/(X+Y) """ self.ops_counter["MUL_TORUS"] += 1 xy = self.extf_mul([X, Y], self.extension_degree) num = copy.deepcopy(xy) num[1] = self.add(xy[1], self.set_or_get_constant(1)) den = self.vector_add(X, Y) return self.extf_div(num, den, self.extension_degree) def inverse_torus(self, X: list[ModuloCircuitElement]): return [self.neg(x) for x in X] def decompress_torus( self, X: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: """ Returns (X + w) / (X - w). Size is doubled. """ zero = self.set_or_get_constant(0) num = [ X[0], self.set_or_get_constant(1), X[1], zero, X[2], zero, X[3], zero, X[4], zero, X[5], zero, ] den = num.copy() den[1] = self.set_or_get_constant(-1) return self.extf_div(num, den, 2 * self.extension_degree, acc_index=1) def frobenius_torus( self, X: list[ModuloCircuitElement], frob_power: int ) -> list[ModuloCircuitElement]: frob = [None] * self.extension_degree for i, list_op in enumerate(self.frobenius_maps[frob_power]): list_op_result = [] for index, constant in list_op: if constant == 1: list_op_result.append(X[index]) else: list_op_result.append( self.mul( X[index], self.set_or_get_constant(self.field(constant)) ) ) frob[i] = list_op_result[0] for op_res in list_op_result[1:]: frob[i] = self.add(frob[i], op_res) if len(self.v_torus_powers_inv[frob_power]) == 1: return self.vector_scale(frob, self.v_torus_powers_inv[frob_power][0]) else: Y = [ self.set_or_get_constant(v) for v in self.v_torus_powers_inv[frob_power] ] return self.extf_mul( Ps=[frob, Y], extension_degree=self.extension_degree, Ps_sparsities=[None, get_sparsity(Y)], ) def easy_part( self, num: list[PyFelt], den: list[PyFelt] ) -> list[ModuloCircuitElement]: """ Computes the easy part of the final exponentiation. """ assert len(num) == 6, f"Expected 6 elements in num, got {len(num)}" assert len(den) == 6, f"Expected 6 elements in den, got {len(den)}" num = self.write_elements(num, operation=WriteOps.INPUT) num = self.vector_neg(num) den = self.write_elements(den, WriteOps.INPUT) c = self.extf_div(num, den, self.extension_degree) t0 = self.frobenius_torus(c, 2) c = self.mul_torus(t0, c) return c def final_exp_finalize(self, t0: list[PyFelt], t2: list[PyFelt]): # Computes Decompress Torus(MulTorus(t0, t2)). # Only valid if (t0 + t2) != 0. t0 = self.write_elements(t0, WriteOps.INPUT) t2 = self.write_elements(t2, WriteOps.INPUT) # for x in t0: # print(f"T0 input {hex(x.value)}") # for x in t2: # print(f"T2 input {hex(x.value)}") mul = self.mul_torus(t0, t2) res = self.decompress_torus(mul) self.finalize_circuit() return res class GaragaBLS12_381FinalExp(FinalExpTorusCircuit): def __init__( self, name: str = None, hash_input: bool = True, init_hash: int = None ): super().__init__( name=name or "Final Exp BLS12_381", curve_id=BLS12_381_ID, extension_degree=6, hash_input=hash_input, ) if init_hash is not None: self.transcript = CairoPoseidonTranscript(init_hash) def expt_half_torus(self, X: list[ModuloCircuitElement]): z = self.square_torus(X) z = self.mul_torus(X, z) z = self.square_torus(z) z = self.square_torus(z) z = self.mul_torus(X, z) z = self.n_square_torus(z, 3) z = self.mul_torus(X, z) z = self.n_square_torus(z, 9) z = self.mul_torus(X, z) z = self.n_square_torus(z, 32) z = self.mul_torus(X, z) z = self.n_square_torus(z, 15) z = self.inverse_torus(z) return z def expt_torus(self, X): z = self.expt_half_torus(X) return self.square_torus(z) def final_exp_part1(self, num: list[PyFelt], den: list[PyFelt]) -> list[PyFelt]: """ X is a list of 12 elements in the tower of extension fields. """ c = self.easy_part(num, den) # 2. Hard part (up to permutation) # 3(p⁴-p²+1)/r # Daiki Hayashida, Kenichiro Hayasaka and Tadanori Teruya # https://eprint.iacr.org/2020/875.pdf # performed in torus compressed form t0_0 = self.square_torus(c) t1 = self.expt_half_torus(t0_0) t2 = self.inverse_torus(c) t1 = self.mul_torus(t1, t2) t2 = self.expt_torus(t1) t1 = self.inverse_torus(t1) t1 = self.mul_torus(t1, t2) t2 = self.expt_torus(t1) t1 = self.frobenius_torus(t1, 1) t1 = self.mul_torus(t1, t2) t0 = self.expt_torus(t1) t2 = self.expt_torus(t0) t0 = self.frobenius_torus(t1, 2) t1 = self.inverse_torus(t1) t1 = self.mul_torus(t1, t2) # Output in fixed order (t0, c, _sum): t1 = self.mul_torus(t1, t0) self.extend_output(t1) c = self.mul_torus(c, t0_0) self.extend_output(c) # The final exp result is DecompressTorus(MulTorus(c, t1) # MulTorus(t1, c) = (t1*c + v)/(t1 + c). # (t1+c = 0) ==> MulTorus(t1, c) is E12.One() in the Torus. _sum = self.vector_add(t1, c) self.extend_output(_sum) # From this case we can conclude the result is 1 or !=1 without decompression. # In case we want to decompress to get the result in GT, # we might need to decompress with another circuit, if the result is not 1 (_sum!=0). return t1, c, _sum class GaragaBN254FinalExp(FinalExpTorusCircuit): def __init__( self, name: str = None, hash_input: bool = True, init_hash: int = None ): super().__init__( name=name or "Final Exp BN254", curve_id=BN254_ID, extension_degree=6, hash_input=hash_input, ) if init_hash is not None: self.transcript = CairoPoseidonTranscript(init_hash) def expt_torus(self, X: list[PyFelt]): t3 = self.square_torus(X) t5 = self.square_torus(t3) result = self.square_torus(t5) t0 = self.square_torus(result) t2 = self.mul_torus(X, t0) t0 = self.mul_torus(t3, t2) t1 = self.mul_torus(X, t0) t4 = self.mul_torus(result, t2) t6 = self.square_torus(t2) t1 = self.mul_torus(t0, t1) t0 = self.mul_torus(t3, t1) t6 = self.n_square_torus(t6, 6) t5 = self.mul_torus(t5, t6) t5 = self.mul_torus(t4, t5) t5 = self.n_square_torus(t5, 7) t4 = self.mul_torus(t4, t5) t4 = self.n_square_torus(t4, 8) t4 = self.mul_torus(t0, t4) t3 = self.mul_torus(t3, t4) t3 = self.n_square_torus(t3, 6) t2 = self.mul_torus(t2, t3) t2 = self.n_square_torus(t2, 8) t2 = self.mul_torus(t0, t2) t2 = self.n_square_torus(t2, 6) t2 = self.mul_torus(t0, t2) t2 = self.n_square_torus(t2, 10) t1 = self.mul_torus(t1, t2) t1 = self.n_square_torus(t1, 6) t0 = self.mul_torus(t0, t1) z = self.mul_torus(result, t0) return z def final_exp_part1( self, num: list[PyFelt], den: list[PyFelt] ) -> list[ModuloCircuitElement]: """ single pairing -> unsafe = True = 1 double pairing -> unsafe = False = 0 """ c = self.easy_part(num, den) # 2. Hard part (up to permutation) # 2x₀(6x₀²+3x₀+1)(p⁴-p²+1)/r # Duquesne and Ghammam # https://eprint.iacr.org/2015/192.pdf # Fuentes et al. (alg. 6) # performed in torus compressed form t0 = self.expt_torus(c) t0 = self.inverse_torus(t0) t0 = self.square_torus(t0) t1 = self.square_torus(t0) t1 = self.mul_torus(t0, t1) t2 = self.expt_torus(t1) t2 = self.inverse_torus(t2) t3 = self.inverse_torus(t1) t1 = self.mul_torus(t2, t3) t3 = self.square_torus(t2) t4 = self.expt_torus(t3) t4 = self.mul_torus(t1, t4) t3 = self.mul_torus(t0, t4) t0 = self.mul_torus(t2, t4) t0 = self.mul_torus(c, t0) t2 = self.frobenius_torus(t3, 1) t0 = self.mul_torus(t2, t0) t2_tmp = self.frobenius_torus(t4, 2) t2 = self.inverse_torus(c) t2 = self.mul_torus(t2, t3) # Output in fixed order (t0, t2, _sum): t0 = self.mul_torus(t0, t2_tmp) self.extend_output(t0) t2 = self.frobenius_torus(t2, 3) self.extend_output(t2) # The final exp result is DecompressTorus(MulTorus(t0, t2)). # MulTorus(t0, t2) = (t0*t2 + v)/(t0 + t2). # (T0+T2 = 0) ==> MulTorus(t0, t2) is one in the Torus. _sum = self.vector_add(t0, t2) self.extend_output(_sum) # From this case we can conclude the result is 1 or !=1 without decompression. # In case we want to decompress to get the result in GT, # we might need to decompress with another circuit, if the result is not 1 (_sum!=0). return t0, t2, _sum GaragaFinalExp = { CurveID.BN254: GaragaBN254FinalExp, CurveID.BLS12_381: GaragaBLS12_381FinalExp, } def test_final_exp(curve_id: CurveID): from garaga.points import G1G2Pair, G1Point, G2Point, tower_to_direct order = CURVES[curve_id.value].n pairs = [] n_pairs = 1 unsafe = True if n_pairs == 1 else False for _ in range(n_pairs): n1, n2 = randint(1, order), randint(1, order) p1, p2 = G1Point.get_nG(curve_id, n1), G2Point.get_nG(curve_id, n2) pairs.append(G1G2Pair(p1, p2)) base_class = GaragaFinalExp[curve_id] part1 = base_class(hash_input=False) field = part1.field XT: list[int] = G1G2Pair.miller(pairs).value_coeffs ET: list[int] = G1G2Pair.pair(pairs).value_coeffs XT = [part1.field(x) for x in XT] ET = [part1.field(x) for x in ET] XD = tower_to_direct(XT, curve_id.value, 12) ED = tower_to_direct(ET, curve_id.value, 12) num_indexes = [0, 2, 4, 6, 8, 10] den_indexes = [1, 3, 5, 7, 9, 11] num = [XD[i] for i in num_indexes] if unsafe: den = [XD[i] for i in den_indexes] else: if [x.value for x in [XD[i] for i in den_indexes]] == [0, 0, 0, 0, 0, 0]: den = [ field.one(), field.zero(), field.zero(), field.zero(), field.zero(), field.zero(), ] else: den = [XD[i] for i in den_indexes] t0, t2, _sum = part1.final_exp_part1(num, den) part1.finalize_circuit() _sum = [x.value for x in _sum] part2 = base_class(hash_input=False) if _sum == [0, 0, 0, 0, 0, 0]: f = [field.one()] + [field.zero] * 11 else: t0 = [x.felt for x in t0] t2 = [x.felt for x in t2] f = part2.final_exp_finalize(t0, t2) assert [f.value for f in f] == [ e.value for e in ED ], f"Final exp in circuit and internal do not match f={[f.value for f in f]}\ne={[e.value for e in ED]}" # print(f"{curve_id} Final Exp random test pass") return part1, part2 if __name__ == "__main__": pass from garaga.curves import CurveID, Polynomial # def test_frobenius_torus(): # from archive_tmp.bn254.pairing_final_exp import frobenius_torus # field = get_base_field(CurveID.BN254.value) # X = [field(random.randint(0, field.p - 1)) for _ in range(6)] # t = FinalExpTorusCircuit("test", CurveID.BN254.value, 6) # t.create_powers_of_Z(field(2)) # X = t.write_elements(X) # XF = t.frobenius_torus(X, 1) # # Xpoly = Polynomial([x.felt for x in X]) # # XFpoly = Xpoly.pow(field.p, get_irreducible_poly(CurveID.BN254.value, )) # # assert t.finalize_circuit() # # t.values_segment = t.values_segment.non_interactive_transform() # TT = frobenius_torus([x.value for x in X]) # assert all(x.value == y for x, y in zip(XF, TT)) # t.print_value_segment() # test_final_exp(CurveID.BN254) # test_final_exp(CurveID.BLS12_381) ================================================ FILE: hydra/garaga/precompiled_circuits/fp2.py ================================================ from garaga.algebra import Fp2, ModuloCircuitElement from garaga.hints.extf_mul import nondeterministic_extension_field_div from garaga.modulo_circuit import ModuloCircuit, WriteOps class Fp2Circuits(ModuloCircuit): """ Implements circuits for Fp2 field operations. """ def __init__( self, name: str, curve_id: int, generic_circuit: bool = False, compilation_mode: int = 0, ): super().__init__( name=name, curve_id=curve_id, generic_circuit=generic_circuit, compilation_mode=compilation_mode, ) def fp2_is_non_zero( self, a: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: """ Returns [1,0] if a ≠ 0, [0,0] if a == 0, working in Fp2. An Fp2 element is non-zero if either its real or imaginary part is non-zero. """ # Check if real part is non-zero real_is_non_zero = self.fp_is_non_zero(a[0]) # Check if imaginary part is non-zero imag_is_non_zero = self.fp_is_non_zero(a[1]) # Either part must be non-zero for the Fp2 element to be non-zero # Using 1-(1-a)(1-b) = a + b - ab to compute OR result = self.sub( self.add(real_is_non_zero, imag_is_non_zero), self.mul(real_is_non_zero, imag_is_non_zero), ) # Return as Fp2 element [result, 0] return [result, self.set_or_get_constant(0)] def fp2_mul(self, X: list[ModuloCircuitElement], Y: list[ModuloCircuitElement]): # Assumes the irreducible poly is X^2 + 1. assert len(X) == len(Y) == 2 and all( isinstance(x, ModuloCircuitElement) and isinstance(y, ModuloCircuitElement) for x, y in zip(X, Y) ) # xy = (x0 + i*x1) * (y0 + i*y1) = (x0*y0 - x1*y1) + i * (x0*y1 + x1*y0) return [ self.sub( self.mul(X[0], Y[0], comment="Fp2 mul start"), self.mul(X[1], Y[1]), comment="Fp2 mul real part end", ), self.add( self.mul(X[0], Y[1]), self.mul(X[1], Y[0]), comment="Fp2 mul imag part end", ), ] def fp2_mul_by_non_residue(self, X: list[ModuloCircuitElement]): assert len(X) == 2 and all(isinstance(x, ModuloCircuitElement) for x in X) if self.curve_id == 1: # Non residue (1,1) # (a0 + i*a1) * (1 + i) a_tmp = self.add(X[0], X[1]) a = self.add(a_tmp, a_tmp) b = X[0] z_a0 = self.sub(b, X[1]) z_a1 = self.sub(self.sub(a, b), X[1]) return [z_a0, z_a1] elif self.curve_id == 0: # Non residue (9, 1) # (a0 + i*a1) * (9 + i) a_tmp = self.add(X[0], X[1]) a = self.mul(a_tmp, self.set_or_get_constant(10)) b = self.mul(X[0], self.set_or_get_constant(9)) z_a0 = self.sub(b, X[1]) z_a1 = self.sub(self.sub(a, b), X[1]) return [z_a0, z_a1] else: raise ValueError( f"Unsupported curve id for fp2 mul by non residue: {self.curve_id}" ) def fp2_square(self, X: list[ModuloCircuitElement]): # Assumes the irreducible poly is X^2 + 1. # x² = (x0 + i x1)² = (x0² - x1²) + 2 * i * x0 * x1 = (x0+x1)(x0-x1) + i * 2 * x0 * x1. # (x0+x1)*(x0-x1) is cheaper than x0² - x1². (2 ADD + 1 MUL) vs (1 ADD + 2 MUL) (16 vs 20 steps) assert len(X) == 2 and all(isinstance(x, ModuloCircuitElement) for x in X) return [ self.mul(self.add(X[0], X[1]), self.sub(X[0], X[1])), self.double(self.mul(X[0], X[1])), ] def fp2_sqrt( self, element: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: """ Computes "a" square root of a field element. /!\ Warning : This circuit is non deterministic /!\ /!\ Two square roots exist for any non-zero element, and no constraint is enforced to select any of them /!\ Raises ValueError if the element is not a quadratic residue. """ assert self.compilation_mode == 0, "fp2_sqrt is not supported in cairo 1 mode" root = Fp2(element[0].felt, element[1].felt).sqrt() if root is None: raise ValueError("No square root found for the given element") if not root.lexicographically_largest: root = Fp2.zero(element[0].p).__sub__(root) root = self.write_elements([root.a0, root.a1], WriteOps.WITNESS) self.fp2_mul_and_assert(root, root, element, comment="Fp2 sqrt") return root def fp2_inv(self, X: list[ModuloCircuitElement]): assert len(X) == 2 and all(isinstance(x, ModuloCircuitElement) for x in X) t0 = self.mul(X[0], X[0], comment="Fp2 Inv start") t1 = self.mul(X[1], X[1]) t0 = self.add(t0, t1) t1 = self.inv(t0) inv0 = self.mul(X[0], t1, comment="Fp2 Inv real part end") inv1 = self.neg(self.mul(X[1], t1), comment="Fp2 Inv imag part end") return [inv0, inv1] def fp2_div(self, X: list[ModuloCircuitElement], Y: list[ModuloCircuitElement]): assert len(X) == len(Y) == 2 and all( isinstance(x, ModuloCircuitElement) and isinstance(y, ModuloCircuitElement) for x, y in zip(X, Y) ) if self.compilation_mode == 0: x_over_y = nondeterministic_extension_field_div(X, Y, self.curve_id, 2) x_over_y = self.write_elements(x_over_y, WriteOps.WITNESS) # x_over_y = d0 + i * d1 # y = y0 + i * y1 # x = x_over_y*y = d0*y0 - d1*y1 + i * (d0*y1 + d1*y0) self.sub_and_assert( a=self.mul(x_over_y[0], Y[0]), b=self.mul(x_over_y[1], Y[1]), c=X[0] ) self.add_and_assert( a=self.mul(x_over_y[0], Y[1]), b=self.mul(x_over_y[1], Y[0]), c=X[1] ) return x_over_y elif self.compilation_mode == 1: # Todo : consider passing as calldata if possible. inv = self.fp2_inv(Y) return self.fp2_mul(X, inv) def fp2_frobenius_map( self, element: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: """ Applies the Frobenius map to an element in F_{p^2}. For an element a + bi, returns a - bi. This is because: (a + bi)^p = a^p + (bi)^p = a^p + b^p * i^p In Fp: a^p = a, b^p = b In Fp2: i^p = -i (p is odd > 2) Therefore: (a + bi)^p = a - bi """ a, b = element # element = a + bi return [a, self.neg(b)] # return a - bi def fp2_add( self, X: list[ModuloCircuitElement], Y: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: # Assumes elements are represented as pairs (a + bi) return self.vector_add(X, Y) def fp2_sub(self, X: list[ModuloCircuitElement], Y: list[ModuloCircuitElement]): # Assumes elements are represented as pairs (a + bi) return self.vector_sub(X, Y) def fp2_mul_and_assert( self, a: list[ModuloCircuitElement], b: list[ModuloCircuitElement], c: list[ModuloCircuitElement], comment: str | None = None, ): """ Multiplies two Fp2 elements a and b and asserts the result equals c. For a = (a0 + i*a1) and b = (b0 + i*b1), asserts: c0 = a0*b0 - a1*b1 c1 = a0*b1 + a1*b0 """ assert ( self.compilation_mode == 0 ), "fp2_mul_and_assert is not supported in cairo 1 mode" assert len(a) == len(b) == len(c) == 2, "Fp2 elements must be length 2" # Calculate intermediate products a0b0 = self.mul(a[0], b[0], comment=f"{comment}: a0*b0" if comment else None) a1b1 = self.mul(a[1], b[1], comment=f"{comment}: a1*b1" if comment else None) a0b1 = self.mul(a[0], b[1], comment=f"{comment}: a0*b1" if comment else None) a1b0 = self.mul(a[1], b[0], comment=f"{comment}: a1*b0" if comment else None) # Assert real part: c0 = a0*b0 - a1*b1 self.add_and_assert( a=a0b0, b=self.neg(a1b1), c=c[0], comment=f"{comment}: assert real part" if comment else None, ) # Assert imaginary part: c1 = a0*b1 + a1*b0 self.add_and_assert( a=a0b1, b=a1b0, c=c[1], comment=f"{comment}: assert imaginary part" if comment else None, ) return c def fp2_eval_horner( self, poly: list[ModuloCircuitElement], # [a0_real, a0_imag, a1_real, a1_imag, ...] z: list[ModuloCircuitElement], # z = [real, imag] poly_name: str = None, var_name: str = "z", ) -> list[ModuloCircuitElement]: """ Evaluates a polynomial with Fp2 coefficients at point z using Horner's method. Assumes that the polynomial is in the form a0 + a1*z + a2*z^2 + ... + an*z^n, indexed with the constant coefficient first. Coefficients are stored in a flat array where each consecutive pair represents the real and imaginary parts of an Fp2 element. Args: poly: Flat list of coefficients [a0_real, a0_imag, a1_real, a1_imag, ...] z: The Fp2 point to evaluate at, represented as [real, imag] poly_name: Optional name for debugging var_name: Optional variable name for debugging Returns: [real, imag] representing the result in Fp2 """ if poly_name is None: poly_name = "UnnamedPoly" assert len(poly) % 2 == 0, "Polynomial coefficients array must have even length" n_coeffs = len(poly) // 2 # Start with the highest degree coefficient acc = [poly[-2], poly[-1]] # Get last pair [real, imag] # Iterate through remaining coefficients in reverse order for i in range(n_coeffs - 2, -1, -1): acc = self.fp2_add( self.fp2_mul( acc, z, ), [poly[2 * i], poly[2 * i + 1]], # Get i-th coefficient pair ) return acc ================================================ FILE: hydra/garaga/precompiled_circuits/isogeny.py ================================================ from garaga.curves import CURVES, CurveID from garaga.extension_field_modulo_circuit import ModuloCircuitElement from garaga.modulo_circuit import ModuloCircuit from garaga.precompiled_circuits.fp2 import Fp2Circuits from garaga.signature import get_isogeny_to_g1_map, get_isogeny_to_g2_map class IsogenyG2(Fp2Circuits): def __init__(self, name: str, curve_id: int, compilation_mode: int = 0): super().__init__( name=name, curve_id=curve_id, compilation_mode=compilation_mode, generic_circuit=False, ) self.curve = CURVES[curve_id] def set_consts(self): x_rational, y_rational = get_isogeny_to_g2_map(CurveID(self.curve_id)) self.x_num = [ self.set_or_get_constant(c) for c in x_rational.numerator.coefficients ] self.x_den = [ self.set_or_get_constant(c) for c in x_rational.denominator.coefficients ] self.y_num = [ self.set_or_get_constant(c) for c in y_rational.numerator.coefficients ] self.y_den = [ self.set_or_get_constant(c) for c in y_rational.denominator.coefficients ] def run_isogeny( self, x: list[ModuloCircuitElement], y: list[ModuloCircuitElement] ) -> tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]: """ Runs the isogeny to G2 map. """ self.set_consts() x_affine_num = self.fp2_eval_horner(self.x_num, x, "x_num") x_affine_den = self.fp2_eval_horner(self.x_den, x, "x_den") x_affine = self.fp2_div(x_affine_num, x_affine_den) y_affine_num = self.fp2_eval_horner(self.y_num, x, "y_num") y_affine_den = self.fp2_eval_horner(self.y_den, x, "y_den") y_affine_eval = self.fp2_div(y_affine_num, y_affine_den) y_affine = self.fp2_mul(y_affine_eval, y) return x_affine, y_affine class IsogenyG1(ModuloCircuit): def __init__(self, name: str, curve_id: int, compilation_mode: int = 0): super().__init__( name=name, curve_id=curve_id, compilation_mode=compilation_mode, generic_circuit=False, ) self.curve = CURVES[curve_id] def set_consts(self): """ Sets the constants for the isogeny to G1 map. """ x_rational, y_rational = get_isogeny_to_g1_map(CurveID(self.curve_id)) self.x_num = [ self.set_or_get_constant(c) for c in x_rational.numerator.coefficients ] self.x_den = [ self.set_or_get_constant(c) for c in x_rational.denominator.coefficients ] self.y_num = [ self.set_or_get_constant(c) for c in y_rational.numerator.coefficients ] self.y_den = [ self.set_or_get_constant(c) for c in y_rational.denominator.coefficients ] def run_isogeny( self, x: ModuloCircuitElement, y: ModuloCircuitElement ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: """ Runs the isogeny to G1 map. """ self.set_consts() x_affine_num = self.eval_horner(self.x_num, x, "x_num") x_affine_den = self.eval_horner(self.x_den, x, "x_den") x_affine = self.div(x_affine_num, x_affine_den) y_affine_num = self.eval_horner(self.y_num, x, "y_num") y_affine_den = self.eval_horner(self.y_den, x, "y_den") y_affine_eval = self.div(y_affine_num, y_affine_den) y_affine = self.mul(y_affine_eval, y) return x_affine, y_affine if __name__ == "__main__": circuit = IsogenyG1("isogeny", 1) # BLS12-381 field_x = circuit.write_element( circuit.field( 1412853964218444964438936699552956047210482383152224645596624291427056376487356261681298103080878386132407858666637 ) ) field_y = circuit.write_element( circuit.field( 752734926215712395741522221355891264404138695398702662135908094550118515106801651502315795564392519475687558113863 ) ) x_affine, y_affine = circuit.run_isogeny(field_x, field_y) ================================================ FILE: hydra/garaga/precompiled_circuits/map_to_curve.py ================================================ from garaga.algebra import PyFelt from garaga.curves import CURVES from garaga.extension_field_modulo_circuit import ModuloCircuitElement from garaga.modulo_circuit import ModuloCircuit, WriteOps from garaga.precompiled_circuits.fp2 import Fp2Circuits class MapToCurveG2(Fp2Circuits): def __init__(self, name: str, curve_id: int, compilation_mode: int = 0): super().__init__( name=name, curve_id=curve_id, compilation_mode=compilation_mode, generic_circuit=True, ) self.curve = CURVES[curve_id] def set_consts(self): # Standard G2 curve parameters for BLS12-381 # ToDo: Derive from definitions.py self.swu_a = [ self.set_or_get_constant(0), # real part self.set_or_get_constant(240), # imaginary part ] self.swu_b = [ self.set_or_get_constant(1012), # real part self.set_or_get_constant(1012), # imaginary part ] self.swu_z = [ self.set_or_get_constant(-2), # real part self.set_or_get_constant(-1), # imaginary part ] self.one = [ self.set_or_get_constant(1), # real part self.set_or_get_constant(0), # imaginary part ] self.zero = [ self.set_or_get_constant(0), # real part self.set_or_get_constant(0), # imaginary part ] def map_to_curve_part_1(self, input_value: list[ModuloCircuitElement]): """ Implements the first part of the Simplified SWU map-to-curve algorithm in G2. This maps a field element to a point on the curve E': y² = x³ + a*x + b. The algorithm follows these steps: 1. Let u be the input field element 2. Calculate intermediate values: - t = z²u⁴ + zu² (where z is the SWU constant) - x₁ = (-b/a) * (1 + 1/(z²u⁴ + zu²)) Args: input_value: Field element u in Fp2 to be mapped to the curve Returns: tuple: (g1x, div) where: - g1x is x³ + ax + b evaluated at the calculated x₁ - div is an intermediate value needed for the full calculation """ # Calculate u² and related terms u2 = self.fp2_square(input_value) # u² zeta_u2 = self.fp2_mul(self.swu_z, u2) # z·u² zeta_u2_square = self.fp2_square(zeta_u2) # z²u⁴ ta = self.fp2_add(zeta_u2_square, zeta_u2) # t = z²u⁴ + zu² neg_ta = self.fp2_sub(self.zero, ta) # -t num_x1 = self.fp2_mul(self.swu_b, self.fp2_add(ta, self.one)) # b(t + 1) # Handle special case when t = 0 is_non_zero = self.fp2_is_non_zero(neg_ta) # 1 if t ≠ 0, 0 if t = 0 neg_ta_or_z = self.fp2_add( self.fp2_mul(self.fp2_sub(self.one, is_non_zero), self.swu_z), # z if t = 0 self.fp2_mul(is_non_zero, neg_ta), # -t if t ≠ 0 ) # Calculate x₁ numerator and denominator div = self.fp2_mul(self.swu_a, neg_ta_or_z) # a·(-t) or a·z num2_x1 = self.fp2_square(num_x1) # (b(t + 1))² div2 = self.fp2_square(div) # (a·(-t))² div3 = self.fp2_mul(div, div2) # (a·(-t))³ # Calculate g(x₁) = x₁³ + ax₁ + b num_gx1 = self.fp2_add( self.fp2_mul( self.fp2_add(num2_x1, self.fp2_mul(self.swu_a, div2)), # x₁² # ax₁ num_x1, # ·x₁ (completing the x₁³ term) ), self.fp2_mul(self.swu_b, div3), # + b ) g1x = self.fp2_mul(num_gx1, self.fp2_inv(div3)) # Final result normalized return [g1x, div, num_x1, zeta_u2] def compute_initial_coordinates_quadratic( self, field: list[ModuloCircuitElement], g1x: list[ModuloCircuitElement], div: list[ModuloCircuitElement], num_x1: list[ModuloCircuitElement], ): """ Computes the initial coordinates for the map-to-curve operation when g1x is a quadratic residue. This function computes the initial y-coordinate before sign adjustment. IMPORTANT: This function should only be called when g1x is a quadratic residue, meaning there exists a y such that y² = g1x in the field Fp2. If g1x is not a quadratic residue, the fp2_sqrt operation will fail. The algorithm follows these steps: 1. Compute y = √(g1x) where g1x = x³ + ax + b (requires g1x to be a quadratic residue) 2. Compute x = num_x1/div to get the x-coordinate in affine form Args: field: The original input field element g1x: The value x³ + ax + b from the first part (must be a quadratic residue) div: The denominator from the first part num_x1: The numerator for x from the first part Returns: list: [x_affine, y_initial, field] where: - x_affine: The final x-coordinate - y_initial: The initial y-coordinate (needs sign adjustment) - field: The original field element (needed for sign adjustment) Note: The returned y_initial needs to be adjusted using adjust_y_sign() to ensure it has the correct sign relative to the input field element. """ # Compute y-coordinate as the square root of g1x # This will only work if g1x is a quadratic residue y = self.fp2_sqrt(g1x) # Convert x to affine coordinates x_affine = self.fp2_div(num_x1, div) return [x_affine, y, field] def compute_initial_coordinates_non_quadratic( self, field: list[ModuloCircuitElement], g1x: list[ModuloCircuitElement], div: list[ModuloCircuitElement], num_x1: list[ModuloCircuitElement], zeta_u2: list[ModuloCircuitElement], ): """ Computes the initial coordinates for the map-to-curve operation when g1x is NOT a quadratic residue. This function uses a clever mathematical property to compute a valid initial y-coordinate when direct square root is impossible. Key Mathematical Insight: When g1x is not a quadratic residue, we use the SWU constant z (which is also not a quadratic residue) to compute the y-coordinate. This works because: 1. If g1x is not a quadratic residue, then z·g1x IS a quadratic residue (product of two non-quadratic residues is a quadratic residue) 2. We can then compute y₁ = √(z·g1x) 3. The initial y is computed as y = zu·field·y₁ The algorithm: 1. Compute y₁ = √(z·g1x) [This is possible because z·g1x is a quadratic residue] 2. Compute initial y = zu·field·y₁ 3. Compute x = (zu·num_x1)/div Args: field: The original input field element g1x: The value x³ + ax + b (known to be a non-quadratic residue) zeta_u2: The value z·u² from the first part num_x1: The x numerator from the first part div: The denominator from the first part Returns: list: [x_affine, y_initial, field] where: - x_affine: The final x-coordinate - y_initial: The initial y-coordinate (needs sign adjustment) - field: The original field element (needed for sign adjustment) Note: The returned y_initial needs to be adjusted using adjust_y_sign() to ensure it has the correct sign relative to the input field element. """ # Since z·g1x is a quadratic residue (product of two non-quadratic residues), # this square root is guaranteed to exist y1 = self.fp2_sqrt(self.fp2_mul(self.swu_z, g1x)) # Compute initial y-coordinate y = self.fp2_mul(zeta_u2, self.fp2_mul(field, y1)) # Compute x-coordinate in affine form num_x = self.fp2_mul(zeta_u2, num_x1) x_affine = self.fp2_div(num_x, div) return [x_affine, y, field] def adjust_y_sign( self, y: list[ModuloCircuitElement], field: list[ModuloCircuitElement], ): # Handle sign adjustment as before qy, y_parity = self.fp2_parity(y) qfield, element_parity = self.fp2_parity(field) # Compute if parities are the same using XNOR (opposite of XOR) # XNOR(a,b) = 1 - (a + b - 2ab) = 2ab - a - b + 1 same_parity = [ self.add( self.sub( self.mul( self.set_or_get_constant(2), self.mul(y_parity[0], element_parity[0]), ), self.add(y_parity[0], element_parity[0]), ), self.set_or_get_constant(1), ), self.zero[0], # imaginary part is 0 ] # Adjust y sign if parities don't match: # y_affine = same_parity ? y : -y y_affine = self.fp2_add( self.fp2_mul([same_parity[0], same_parity[1]], y), # Keep y if same parity self.fp2_mul( [ self.sub(self.one[0], same_parity[0]), self.zero[0], ], # [1 - same_parity, 0] self.fp2_sub(self.zero, y), # -y ), ) return [y_affine, qfield, qy] # ATTENTION: this function is not sound by itself! # Two solutions are possible: # 1. (q, r) # 2. (q+ (p-1)/2, 1-r) # To constraint this properly, we still need assert: q <= (p-1)/2 # This needs to happen in the function wrapping the garaga circuit def fp2_parity( self, element: list[ModuloCircuitElement] ) -> list[ModuloCircuitElement]: """ Computes the parity of the first non-zero coefficient of the Fp2 element (element[0], element[1]) Returns [parity, 0] For an Fp2 element a + bi: 1. If a ≠ 0, returns parity of a 2. If a = 0 and b ≠ 0, returns parity of b 3. If both are 0, returns [0, 0] (even) Implements sgn0_m_eq_2 from RFC9380 using witness variables for validation. """ assert len(element) == 2 and all( isinstance(x, ModuloCircuitElement) for x in element ) two = self.set_or_get_constant(2) one = self.set_or_get_constant(1) zero = self.set_or_get_constant(0) # For element[0] (real part) # Witnesses: q0 (quotient), r0 (remainder) q0 = self.write_element( PyFelt(element[0].value // 2, element[0].p), WriteOps.WITNESS ) # Witness for q0 r0 = self.write_element( PyFelt(element[0].value % 2, element[0].p), WriteOps.WITNESS ) # Witness for r0 (parity of x0) # Enforce that r0 ∈ {0, 1} r0_sub_1 = self.sub(r0, one) r0_times_r0_sub_1 = self.mul(r0, r0_sub_1) self.sub_and_assert(r0_times_r0_sub_1, zero, zero, comment="Ensure r0 ∈ {0,1}") # Enforce x0 = 2 * q0 + r0 two_q0 = self.mul(q0, two) self.add_and_assert(two_q0, r0, element[0], comment="Validate x0 decomposition") # Similarly for element[1] (imaginary part) q1 = self.write_element( PyFelt(element[1].value // 2, element[1].p), WriteOps.WITNESS ) # Witness for q1 r1 = self.write_element( PyFelt((element[1].value % 2), element[1].p), WriteOps.WITNESS ) # Witness for r1 (parity of x1) # Enforce that r1 ∈ {0, 1} r1_sub_1 = self.sub(r1, one) r1_times_r1_sub_1 = self.mul(r1, r1_sub_1) self.sub_and_assert(r1_times_r1_sub_1, zero, zero, comment="Ensure r1 ∈ {0,1}") # Enforce x1 = 2 * q1 + r1 two_q1 = self.mul(q1, two) self.add_and_assert(two_q1, r1, element[1], comment="Validate x1 decomposition") # Compute zero_0 = 1 - fp_is_non_zero(x0) real_is_non_zero = self.fp_is_non_zero( element[0] ) # Returns 1 if x0 ≠ 0, else 0 zero_0 = self.sub(one, real_is_non_zero) # Compute s = r0 OR (zero_0 AND r1) # Implementing logical operations using arithmetic operations # zero_0 AND r1 zero_0_and_r1 = self.mul(zero_0, r1) # r0 OR (zero_0 AND r1) # OR(a, b) = a + b - a * b or_input = self.sub(self.add(r0, zero_0_and_r1), self.mul(r0, zero_0_and_r1)) s = or_input # Since values are in {0,1}, this computes the logical OR # select q based on s q = self.add( self.mul(q0, self.sub(one, zero_0_and_r1)), # q0 when not using r1 self.mul(q1, zero_0_and_r1), # q1 when using r1 ) # Return parity as [s, 0] return q, [s, zero] class MapToCurveG1(ModuloCircuit): def __init__(self, name: str, curve_id: int, compilation_mode: int = 0): super().__init__( name=name, curve_id=curve_id, compilation_mode=compilation_mode, generic_circuit=True, ) self.curve = CURVES[curve_id] def set_consts(self): params = self.curve.swu_params self.swu_a = self.set_or_get_constant(params.A) self.swu_b = self.set_or_get_constant(params.B) self.swu_z = self.set_or_get_constant(params.Z) self.zero = self.set_or_get_constant(0) self.one = self.set_or_get_constant(1) def map_to_curve_part_1(self, input_value: ModuloCircuitElement): """ Implements the first part of the Simplified SWU map-to-curve algorithm for G1. This maps a field element to a point on the curve E': y² = x³ + ax + b. The algorithm follows these steps: 1. Let u be the input field element 2. Calculate t = z²u⁴ + zu² (where z is the SWU constant) 3. Calculate x₁ = (-b/a) * (1 + 1/t) if t ≠ 0, or x₁ = (-b/(az)) if t = 0 4. Calculate g(x₁) = x₁³ + ax₁ + b Args: input_value (ModuloCircuitElement): Field element u to be mapped to the curve Returns: list: [g1x, div, num_x1, zeta_u2] where: - g1x: The value g(x₁) = x₁³ + ax₁ + b - div: The denominator used in x₁ calculation (needed for finalization) - num_x1: The numerator of x₁ (needed for finalization) - zeta_u2: The value z·u² (needed for non-quadratic case) Note: This is part 1 of the map-to-curve operation. The result needs to be finalized using either finalize_map_to_curve_quadratic or finalize_map_to_curve_non_quadratic, depending on whether g1x is a quadratic residue. """ # Calculate u² and related terms u2 = self.square(input_value) # u² zeta_u2 = self.mul(self.swu_z, u2) # z·u² zeta_u2_square = self.square(zeta_u2) # z²u⁴ ta = self.add(zeta_u2_square, zeta_u2) # t = z²u⁴ + zu² neg_ta = self.sub(self.zero, ta) # -t num_x1 = self.mul(self.swu_b, self.add(ta, self.one)) # b(t + 1) # Handle special case when t = 0 is_non_zero = self.fp_is_non_zero(neg_ta) # 1 if t ≠ 0, 0 if t = 0 neg_ta_or_z = self.add( self.mul(self.sub(self.one, is_non_zero), self.swu_z), # z if t = 0 self.mul(is_non_zero, neg_ta), # -t if t ≠ 0 ) # Calculate x₁ numerator and denominator div = self.mul(self.swu_a, neg_ta_or_z) # a·(-t) or a·z num2_x1 = self.square(num_x1) # (b(t + 1))² div2 = self.square(div) # (a·(-t))² div3 = self.mul(div, div2) # (a·(-t))³ # Calculate g(x₁) = x₁³ + ax₁ + b num_gx1 = self.add( self.mul( self.add(num2_x1, self.mul(self.swu_a, div2)), # x₁² # ax₁ num_x1, # ·x₁ (completing the x₁³ term) ), self.mul(self.swu_b, div3), # + b ) g1x = self.mul(num_gx1, self.inv(div3)) # Final result normalized return [g1x, div, num_x1, zeta_u2] def compute_initial_coordinates_quadratic( self, field: ModuloCircuitElement, g1x: ModuloCircuitElement, div: ModuloCircuitElement, num_x1: ModuloCircuitElement, ): """ Computes the x and y coordinates for the map-to-curve operation when g1x is a quadratic residue. This function computes the y-coordinate and ensures the point has the correct sign. IMPORTANT: This function should only be called when g1x is a quadratic residue, meaning there exists a y such that y² = g1x in the field. The algorithm follows these steps: 1. Compute y = √(g1x) where g1x = x³ + ax + b (requires g1x to be a quadratic residue) 2. Compute x = num_x1/div to get the x-coordinate in affine form 3. Adjust the sign of y to match the parity of the input field element The sign adjustment uses: - If sign(y) ≠ sign(field_element): y = -y - For field elements, parity is determined by the real part Args: field: The original input field element g1x: The value x³ + ax + b from the first part (must be a quadratic residue) div: The denominator from the first part num_x1: The numerator for x from the first part Returns: list: [x_affine, y_initial, field] where: - x_affine: The final x-coordinate - y_initial: The initial y-coordinate (needs sign adjustment) - field: The original field element (needed for sign adjustment) Note: When g1x is not a quadratic residue, the alternative function compute_initial_coordinates_non_quadratic should be used instead. """ # Compute y-coordinate as the square root of g1x y_initial = self.fp_sqrt(g1x) # Convert x to affine coordinates x_affine = self.div(num_x1, div) return [x_affine, y_initial, field] def compute_initial_coordinates_non_quadratic( self, field: ModuloCircuitElement, g1x: ModuloCircuitElement, div: ModuloCircuitElement, num_x1: ModuloCircuitElement, zeta_u2: ModuloCircuitElement, ): """ Computes the initial x and y coordinates for the map-to-curve operation when g1x is NOT a quadratic residue. The y-coordinate will need further sign adjustment using adjust_y_sign(). Key Mathematical Insight: When g1x is not a quadratic residue, we use the SWU constant z (which is also not a quadratic residue) to compute the y-coordinate. This works because: 1. If g1x is not a quadratic residue, then z·g1x IS a quadratic residue (product of two non-quadratic residues is a quadratic residue) 2. We can then compute y₁ = √(z·g1x) 3. The initial y is computed as y = zu·field·y₁ The algorithm: 1. Compute y₁ = √(z·g1x) [This is possible because z·g1x is a quadratic residue] 2. Compute initial y = zu·field·y₁ 3. Compute x = (zu·num_x1)/div Args: field: The original input field element g1x: The value x³ + ax + b (known to be a non-quadratic residue) zeta_u2: The value z·u² from the first part num_x1: The x numerator from the first part div: The denominator from the first part Returns: list: [x_affine, y_initial, field] where: - x_affine: The final x-coordinate - y_initial: The initial y-coordinate (needs sign adjustment) - field: The original field element (needed for sign adjustment) Note: The returned y_initial needs to be adjusted using adjust_y_sign() to ensure it has the correct sign relative to the input field element. """ # Since z·g1x is a quadratic residue (product of two non-quadratic residues), # this square root is guaranteed to exist y1 = self.fp_sqrt(self.mul(self.swu_z, g1x)) # Compute initial y-coordinate y_initial = self.mul(zeta_u2, self.mul(field, y1)) # Compute x-coordinate in affine form num_x = self.mul(zeta_u2, num_x1) x_affine = self.div(num_x, div) return [x_affine, y_initial, field] def adjust_y_sign( self, y: ModuloCircuitElement, field: ModuloCircuitElement, ): # Handle sign adjustment as before qy, y_parity = self.fp_parity(y) qfield, element_parity = self.fp_parity(field) # Compute if parities are the same using XNOR (opposite of XOR) # XNOR(a,b) = 1 - (a + b - 2ab) = 2ab - a - b + 1 same_parity = self.add( self.sub( self.mul( self.set_or_get_constant(2), self.mul(y_parity, element_parity), ), self.add(y_parity, element_parity), ), self.set_or_get_constant(1), ) # Adjust y sign if parities don't match: # y_affine = same_parity ? y : -y y_affine = self.add( self.mul(same_parity, y), # Keep y if same parity self.mul( self.sub(self.one, same_parity), self.sub(self.zero, y), # -y ), ) return [y_affine, qy, qfield] # ATTENTION: this function is not sound by itself! # Two solutions are possible: # 1. (q, r) # 2. (q+ (p-1)/2, 1-r) # To constraint this properly, we still need assert: q <= (p-1)/2 # This needs to happen in the function wrapping the garaga circuit def fp_parity(self, element: ModuloCircuitElement) -> ModuloCircuitElement: """ Computes the parity of a field element. Returns 0 if element is even, 1 if odd. Implements sgn0_m_eq_1 from RFC9380 using witness variables for validation. """ assert isinstance(element, ModuloCircuitElement) two = self.set_or_get_constant(2) one = self.set_or_get_constant(1) zero = self.set_or_get_constant(0) # Witnesses: q (quotient), r (remainder) q = self.write_element( PyFelt(element.value // 2, element.p), WriteOps.WITNESS ) # Witness for quotient r = self.write_element( PyFelt(element.value % 2, element.p), WriteOps.WITNESS ) # Witness for remainder (parity) # Enforce that r ∈ {0, 1} r_sub_1 = self.sub(r, one) r_times_r_sub_1 = self.mul(r, r_sub_1) self.sub_and_assert(r_times_r_sub_1, zero, zero, comment="Ensure r ∈ {0,1}") # Enforce element = 2 * q + r two_q = self.mul(q, two) self.add_and_assert(two_q, r, element, comment="Validate element decomposition") return q, r if __name__ == "__main__": circuit = MapToCurveG1("map_to_curve", 1) # BLS12-381 circuit.set_consts() field = circuit.write_element( circuit.field( 2231413721970278425038638834062370180699174210864795385441649994565282274875534254514118105433862522641883533654145 ) ) g1x, div, num_x1, zeta_u2 = circuit.map_to_curve_part_1(field) print("g1x", g1x) print("div", div) print("num_x1", num_x1) print("zeta_u2", zeta_u2) if g1x.felt.is_quad_residue(): print("Quadratic residue") x_affine, y_initial, field = circuit.compute_initial_coordinates_quadratic( field, g1x, div, num_x1 ) else: print("Non quadratic residue") x_affine, y_initial, field = circuit.compute_initial_coordinates_non_quadratic( field, g1x, div, num_x1, zeta_u2 ) # Adjust y sign y_affine, qy, qfield = circuit.adjust_y_sign(field, y_initial) print("x_affine", x_affine) print("y_affine", y_affine) ================================================ FILE: hydra/garaga/precompiled_circuits/miller_tower.py ================================================ from typing import Iterator from garaga.curves import BLS12_381_ID, BN254_ID, CURVES from garaga.extension_field_modulo_circuit import ModuloCircuitElement from garaga.precompiled_circuits.multi_miller_loop import MultiMillerLoopCircuit def tower_line_function_sparsity(curve_id: int) -> list[int]: match curve_id: case 0: return [2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0] case 1: return [1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0] case _: raise ValueError(f"Invalid curve ID: {curve_id}") class MillerTowerCircuit(MultiMillerLoopCircuit): def __init__( self, name: str, curve_id: int, n_pairs: int, compilation_mode: int = 1, ): super().__init__( name=name, curve_id=curve_id, n_pairs=n_pairs, compilation_mode=compilation_mode, ) def eval_tower_line(self, line: Iterator[ModuloCircuitElement], yInv, xNegOverY): assert len(line) == 4 # Input is R0 = slope, R1 = intercept r0 = [line[0], line[1]] r1 = [line[2], line[3]] if self.curve_id == BN254_ID: return [ self.mul(r0[0], xNegOverY), self.mul(r0[1], xNegOverY), self.mul(r1[0], yInv), self.mul(r1[1], yInv), ] elif self.curve_id == BLS12_381_ID: return [ self.mul(r1[0], yInv), self.mul(r1[1], yInv), self.mul(r0[0], xNegOverY), self.mul(r0[1], xNegOverY), ] else: raise NotImplementedError def mul_by_line_tower( self, tower_fp12: list[ModuloCircuitElement], line_evaluated: list[ModuloCircuitElement], ): assert len(tower_fp12) == 12 assert ( len(line_evaluated) == 4 ), f"Expected 4 elements, got {len(line_evaluated)}" c0_fp6, c1_fp6 = tower_fp12[0:6], tower_fp12[6:12] # c0_b0, c0_b1, c0_b2 = c0[0:2], c0[2:4], c0[4:6] # c1_b0, c1_b1, c1_b2 = c1[0:2], c1[2:4], c1[4:6] # MulBy34. multiplication by sparse element (1,0,0,c3,c4,0) if self.curve_id == 0: a = c0_fp6 b = c1_fp6 c3, c4 = line_evaluated[0:2], line_evaluated[2:4] b = self._fp6_by_01(b, c3, c4) d0 = self.vector_add( [self.set_or_get_constant(1), self.set_or_get_constant(0)], c3 ) d = self.vector_add(c0_fp6, c1_fp6) d = self._fp6_by_01(d, d0, c4) z_c1 = self.vector_add(self.vector_neg(self.vector_add(a, b)), d) z_c0 = self.vector_add(self.fp6_mul_by_non_residue(b), a) return z_c0 + z_c1 elif self.curve_id == 1: # Mul By 01 # // MulBy01 multiplication by sparse element (c0, c1, 0, 0, 1) # func (z *E12) MulBy01(c0, c1 *E2) *E12 { # var a, b E6 # var d E2 # a.Set(&z.C0) # a.MulBy01(c0, c1) # b.MulByNonResidue(&z.C1) # d.SetOne().Add(c1, &d) # z.C1.Add(&z.C1, &z.C0) # z.C1.MulBy01(c0, &d) # z.C1.Sub(&z.C1, &a) # z.C1.Sub(&z.C1, &b) # z.C0.MulByNonResidue(&b) # z.C0.Add(&z.C0, &a) # return z # } c0, c1 = line_evaluated[0:2], line_evaluated[2:4] a = c0_fp6 a = self._fp6_by_01(a, c0, c1) b = self.fp6_mul_by_non_residue(c1_fp6) d = [self.add(self.set_or_get_constant(1), c1[0]), c1[1]] z_c1 = self.vector_add(c1_fp6, c0_fp6) z_c1 = self._fp6_by_01(z_c1, c0, d) z_c1 = self.vector_sub(z_c1, a) z_c1 = self.vector_sub(z_c1, b) z_c0 = self.fp6_mul_by_non_residue(b) z_c0 = self.vector_add(z_c0, a) return z_c0 + z_c1 def mul_by_line_line_tower(self, tower_fp12, line_line): assert len(tower_fp12) == 12 assert len(line_line) == 10 c0_fp6, c1_fp6 = tower_fp12[0:6], tower_fp12[6:12] def mul_line_by_line_tower(self, l1, l2): assert len(l1) == 4 assert len(l2) == 4 if self.curve_id == 0: d3, d4 = l1[0:2], l1[2:4] c3, c4 = l2[0:2], l2[2:4] x3 = self.fp2_mul(c3, d3) x4 = self.fp2_mul(c4, d4) x04 = self.vector_add(c4, d4) x03 = self.vector_add(c3, d3) tmp = self.vector_add(c3, c4) x34 = self.vector_sub( self.vector_sub(self.fp2_mul(self.vector_add(d3, d4), tmp), x3), x4 ) z00 = self.fp2_mul_by_non_residue(x4) z00 = [self.add(z00[0], self.set_or_get_constant(1)), z00[1]] return z00 + x3 + x34 + x03 + x04 if self.curve_id == 1: c0, c1 = l2[0:2], l2[2:4] d0, d1 = l1[0:2], l1[2:4] x0 = self.fp2_mul(c0, d0) x1 = self.fp2_mul(c1, d1) x04 = self.vector_add(d0, c0) tmp = self.vector_add(c0, c1) x01 = self.vector_sub( self.vector_sub(self.fp2_mul(self.vector_add(d0, d1), tmp), x0), x1 ) x14 = self.vector_add(d1, c1) z00 = self.fp2_mul_by_non_residue( [self.set_or_get_constant(1), self.set_or_get_constant(0)] ) z00 = self.vector_add(z00, x0) # C0B0 + C0B1 + C0B2 + C1B1 + C1B2 return z00 + x01 + x1 + x04 + x14 def _fp6_by_01(self, e6: list[ModuloCircuitElement], c0, c1): assert len(e6) == 6 assert len(c0) == 2 assert len(c1) == 2 b0, b1, b2 = e6[0:2], e6[2:4], e6[4:6] a = self.fp2_mul(b0, c0) b = self.fp2_mul(b1, c1) tmp = self.vector_add(b1, b2) t0 = self.fp2_mul(c1, tmp) t0 = self.vector_sub(t0, b) t0 = self.fp2_mul_by_non_residue(t0) t0 = self.vector_add(t0, a) tmp = self.vector_add(b0, b2) t2 = self.fp2_mul(c0, tmp) t2 = self.vector_sub(t2, a) t2 = self.vector_add(t2, b) t1 = self.vector_add(c0, c1) tmp = self.vector_add(b0, b1) t1 = self.fp2_mul(t1, tmp) t1 = self.vector_sub(t1, a) t1 = self.vector_sub(t1, b) b0 = t0 b1 = t1 b2 = t2 # flatten lists: return b0 + b1 + b2 def fp6_mul_by_non_residue(self, a: list[ModuloCircuitElement]): assert len(a) == 6 a = list(a) b0, b1, b2 = a[0:2], a[2:4], a[4:6] return self.fp2_mul_by_non_residue(b2) + b0 + b1 def fp12_square(self, a: list[ModuloCircuitElement]): assert len(a) == 12 xc0, xc1 = a[0:6], a[6:12] c0 = self.vector_sub(xc0, xc1) c3 = self.vector_add(xc0, self.vector_neg(self.fp6_mul_by_non_residue(xc1))) c2 = self.fp6_mul(xc0, xc1) c0 = self.vector_add(self.fp6_mul(c0, c3), c2) z_c1 = self.vector_add(c2, c2) z_c0 = self.vector_add(c0, self.fp6_mul_by_non_residue(c2)) return z_c0 + z_c1 def fp12_mul(self, x: list[ModuloCircuitElement], y: list[ModuloCircuitElement]): assert len(x) == 12 assert len(y) == 12 x_c0, x_c1 = x[0:6], x[6:12] y_c0, y_c1 = y[0:6], y[6:12] a = self.vector_add(x_c0, x_c1) b = self.vector_add(y_c0, y_c1) a = self.fp6_mul(a, b) b = self.fp6_mul(x_c0, y_c0) c = self.fp6_mul(x_c1, y_c1) z_c1 = self.vector_sub(a, b) z_c1 = self.vector_sub(z_c1, c) z_c0 = self.fp6_mul_by_non_residue(c) z_c0 = self.vector_add(z_c0, b) return z_c0 + z_c1 def fp6_mul(self, a: list[ModuloCircuitElement], b: list[ModuloCircuitElement]): assert len(a) == 6 assert len(b) == 6 xb0, xb1, xb2 = a[0:2], a[2:4], a[4:6] yb0, yb1, yb2 = b[0:2], b[2:4], b[4:6] t0 = self.fp2_mul(xb0, yb0) t1 = self.fp2_mul(xb1, yb1) t2 = self.fp2_mul(xb2, yb2) c0 = self.vector_add(xb1, xb2) tmp = self.vector_add(yb1, yb2) c0 = self.vector_add( self.fp2_mul_by_non_residue( self.vector_sub(self.vector_sub(self.fp2_mul(c0, tmp), t1), t2) ), t0, ) c1 = self.vector_add(xb0, xb1) tmp = self.vector_add(yb0, yb1) c1 = self.vector_sub(self.vector_sub(self.fp2_mul(c1, tmp), t0), t1) tmp = self.fp2_mul_by_non_residue(t2) c1 = self.vector_add(c1, tmp) tmp = self.vector_add(xb0, xb2) c2 = self.vector_add( self.vector_sub( self.vector_sub(self.fp2_mul(self.vector_add(yb0, yb2), tmp), t0), t2 ), t1, ) return c0 + c1 + c2 def fp12_inverse(self, a: list[ModuloCircuitElement]): assert len(a) == 12 xc0, xc1 = a[0:6], a[6:12] t0 = self.fp6_square(xc0) t1 = self.fp6_square(xc1) tmp = self.fp6_mul_by_non_residue(t1) t0 = self.vector_sub(t0, tmp) t1 = self.fp6_inverse(t0) z_c0 = self.fp6_mul(xc0, t1) z_c1 = self.fp6_mul(xc1, t1) z_c1 = self.vector_neg(z_c1) return z_c0 + z_c1 def fp6_inverse(self, a: list[ModuloCircuitElement]): assert len(a) == 6 # func (z *E6) Inverse(x *E6) *E6 { # // Algorithm 17 from https://eprint.iacr.org/2010/354.pdf # // step 9 is wrong in the paper it's t1-t4 # var t0, t1, t2, t3, t4, t5, t6, c0, c1, c2, d1, d2 E2 # t0.Square(&x.B0) # t1.Square(&x.B1) # t2.Square(&x.B2) # t3.Mul(&x.B0, &x.B1) # t4.Mul(&x.B0, &x.B2) # t5.Mul(&x.B1, &x.B2) # c0.MulByNonResidue(&t5).Neg(&c0).Add(&c0, &t0) # c1.MulByNonResidue(&t2).Sub(&c1, &t3) # c2.Sub(&t1, &t4) # t6.Mul(&x.B0, &c0) # d1.Mul(&x.B2, &c1) # d2.Mul(&x.B1, &c2) # d1.Add(&d1, &d2).MulByNonResidue(&d1) # t6.Add(&t6, &d1) # t6.Inverse(&t6) # z.B0.Mul(&c0, &t6) # z.B1.Mul(&c1, &t6) # z.B2.Mul(&c2, &t6) xb0, xb1, xb2 = a[0:2], a[2:4], a[4:6] t0 = self.fp2_square(xb0) t1 = self.fp2_square(xb1) t2 = self.fp2_square(xb2) t3 = self.fp2_mul(xb0, xb1) t4 = self.fp2_mul(xb0, xb2) t5 = self.fp2_mul(xb1, xb2) c0 = self.vector_add(self.vector_neg(self.fp2_mul_by_non_residue(t5)), t0) c1 = self.vector_sub(self.fp2_mul_by_non_residue(t2), t3) c2 = self.vector_sub(t1, t4) t6 = self.fp2_mul(xb0, c0) d1 = self.fp2_mul(xb2, c1) d2 = self.fp2_mul(xb1, c2) d1 = self.fp2_mul_by_non_residue(self.vector_add(d1, d2)) t6 = self.vector_add(t6, d1) t6 = self.fp2_inv(t6) zb0 = self.fp2_mul(c0, t6) zb1 = self.fp2_mul(c1, t6) zb2 = self.fp2_mul(c2, t6) return zb0 + zb1 + zb2 def fp6_square(self, a: list[ModuloCircuitElement]): assert len(a) == 6 xb0, xb1, xb2 = a[0:2], a[2:4], a[4:6] c4 = self.fp2_mul(xb0, xb1) c4 = self.vector_add(c4, c4) c5 = self.fp2_square(xb2) c1 = self.vector_add(self.fp2_mul_by_non_residue(c5), c4) c2 = self.vector_sub(c4, c5) c3 = self.fp2_square(xb0) c4 = self.vector_add(self.vector_sub(xb0, xb1), xb2) c5 = self.fp2_mul(xb1, xb2) c5 = self.vector_add(c5, c5) c4 = self.fp2_square(c4) c0 = self.vector_add(self.fp2_mul_by_non_residue(c5), c3) zb2 = self.vector_sub(self.vector_add(self.vector_add(c2, c4), c5), c3) zb0 = c0 zb1 = c1 return zb0 + zb1 + zb2 def fp12_conjugate(self, a: list[ModuloCircuitElement]): assert len(a) == 12 raise NotImplementedError("Not implemented") def fp12_cyclotomic_square(self, a: list[ModuloCircuitElement]): assert len(a) == 12 xc0, xc1 = a[0:6], a[6:12] xc0b0 = xc0[0:2] xc0b1 = xc0[2:4] xc0b2 = xc0[4:6] xc1b0 = xc1[0:2] xc1b1 = xc1[2:4] xc1b2 = xc1[4:6] t0 = self.fp2_square(xc1b1) t1 = self.fp2_square(xc0b0) t6 = self.vector_add(xc1b1, xc0b0) t6 = self.fp2_square(t6) t6 = self.vector_sub(t6, t0) t6 = self.vector_sub(t6, t1) t2 = self.fp2_square(xc0b2) t3 = self.fp2_square(xc1b0) t7 = self.vector_add(xc0b2, xc1b0) t7 = self.fp2_square(t7) t7 = self.vector_sub(t7, t2) t7 = self.vector_sub(t7, t3) t4 = self.fp2_square(xc1b2) t5 = self.fp2_square(xc0b1) t8 = self.vector_add(xc1b2, xc0b1) t8 = self.fp2_square(t8) t8 = self.vector_sub(t8, t4) t8 = self.vector_sub(t8, t5) t8 = self.fp2_mul_by_non_residue(t8) t0 = self.fp2_mul_by_non_residue(t0) t0 = self.vector_add(t0, t1) t2 = self.fp2_mul_by_non_residue(t2) t2 = self.vector_add(t2, t3) t4 = self.fp2_mul_by_non_residue(t4) t4 = self.vector_add(t4, t5) zc0b0 = self.vector_sub(t0, xc0b0) zc0b0 = self.vector_add(zc0b0, zc0b0) zc0b0 = self.vector_add(zc0b0, t0) zc0b1 = self.vector_sub(t2, xc0b1) zc0b1 = self.vector_add(zc0b1, zc0b1) zc0b1 = self.vector_add(zc0b1, t2) zc0b2 = self.vector_sub(t4, xc0b2) zc0b2 = self.vector_add(zc0b2, zc0b2) zc0b2 = self.vector_add(zc0b2, t4) zc1b0 = self.vector_add(t8, xc1b0) zc1b0 = self.vector_add(zc1b0, zc1b0) zc1b0 = self.vector_add(zc1b0, t8) zc1b1 = self.vector_add(t6, xc1b1) zc1b1 = self.vector_add(zc1b1, zc1b1) zc1b1 = self.vector_add(zc1b1, t6) zc1b2 = self.vector_add(t7, xc1b2) zc1b2 = self.vector_add(zc1b2, zc1b2) zc1b2 = self.vector_add(zc1b2, t7) return zc0b0 + zc0b1 + zc0b2 + zc1b0 + zc1b1 + zc1b2 def fp2_conjugate(self, a: list[ModuloCircuitElement]): assert len(a) == 2 return [a[0], self.neg(a[1])] def mul_by_non_residue_k_power_n( self, x: list[ModuloCircuitElement], k: int, n: int ): from garaga.hints.tower_backup import E2 assert len(x) == 2 curve = CURVES[self.curve_id] non_residue = E2(curve.nr_a0, curve.nr_a1, curve.p) # nr^(n*(p^k-1)/6) res: E2 = non_residue ** ((n * (curve.p**k - 1) // 6)) if res.a1 != 0: factor = [ self.set_or_get_constant(res.a0), self.set_or_get_constant(res.a1), ] return self.fp2_mul(factor, x) else: factor = self.set_or_get_constant(res.a0) return [self.mul(factor, x[0]), self.mul(factor, x[1])] def fp12_frob(self, a: list[ModuloCircuitElement]): assert len(a) == 12 c0b0 = self.fp2_conjugate(a[0:2]) c0b0[0] = self.add( c0b0[0], self.set_or_get_constant(0) ) # Input cannot be output. # TODO: Make a manual circuit or something better. c0b1 = self.fp2_conjugate(a[2:4]) c0b2 = self.fp2_conjugate(a[4:6]) c1b0 = self.fp2_conjugate(a[6:8]) c1b1 = self.fp2_conjugate(a[8:10]) c1b2 = self.fp2_conjugate(a[10:12]) c0b1 = self.mul_by_non_residue_k_power_n(c0b1, 1, 2) c0b2 = self.mul_by_non_residue_k_power_n(c0b2, 1, 4) c1b0 = self.mul_by_non_residue_k_power_n(c1b0, 1, 1) c1b1 = self.mul_by_non_residue_k_power_n(c1b1, 1, 3) c1b2 = self.mul_by_non_residue_k_power_n(c1b2, 1, 5) return c0b0 + c0b1 + c0b2 + c1b0 + c1b1 + c1b2 def fp12_frob_square(self, a: list[ModuloCircuitElement]): assert len(a) == 12 c0b0 = [ self.add(a[0], self.set_or_get_constant(0)), self.add(a[1], self.set_or_get_constant(0)), ] # Input cannot be output. # TODO: Make a manual circuit or something better. c0b1 = self.mul_by_non_residue_k_power_n(a[2:4], 2, 2) c0b2 = self.mul_by_non_residue_k_power_n(a[4:6], 2, 4) c1b0 = self.mul_by_non_residue_k_power_n(a[6:8], 2, 1) c1b1 = self.mul_by_non_residue_k_power_n(a[8:10], 2, 3) c1b2 = self.mul_by_non_residue_k_power_n(a[10:12], 2, 5) return c0b0 + c0b1 + c0b2 + c1b0 + c1b1 + c1b2 def fp12_frob_cube(self, a: list[ModuloCircuitElement]): assert len(a) == 12 c0b0 = self.fp2_conjugate(a[0:2]) c0b0[0] = self.add( c0b0[0], self.set_or_get_constant(0) ) # Input cannot be output. # TODO: Make a manual circuit or something better. c0b1 = self.fp2_conjugate(a[2:4]) c0b2 = self.fp2_conjugate(a[4:6]) c1b0 = self.fp2_conjugate(a[6:8]) c1b1 = self.fp2_conjugate(a[8:10]) c1b2 = self.fp2_conjugate(a[10:12]) c0b1 = self.mul_by_non_residue_k_power_n(c0b1, 3, 2) c0b2 = self.mul_by_non_residue_k_power_n(c0b2, 3, 4) c1b0 = self.mul_by_non_residue_k_power_n(c1b0, 3, 1) c1b1 = self.mul_by_non_residue_k_power_n(c1b1, 3, 3) c1b2 = self.mul_by_non_residue_k_power_n(c1b2, 3, 5) return c0b0 + c0b1 + c0b2 + c1b0 + c1b1 + c1b2 def fp12_cyclotomic_square_compressed( self, xc0b1: list[ModuloCircuitElement], xc0b2: list[ModuloCircuitElement], xc1b0: list[ModuloCircuitElement], xc1b2: list[ModuloCircuitElement], ): assert len(xc0b1) == len(xc0b2) == len(xc1b0) == len(xc1b2) == 2 t0 = self.fp2_square(xc0b1) t1 = self.fp2_square(xc1b2) t5 = self.vector_add(xc0b1, xc1b2) t2 = self.fp2_square(t5) t3 = self.vector_add(t0, t1) t5 = self.vector_sub(t2, t3) t6 = self.vector_add(xc1b0, xc0b2) t3 = self.fp2_square(t6) t2 = self.fp2_square(xc1b0) t6 = self.fp2_mul_by_non_residue(t5) t5 = self.vector_add(t6, xc1b0) t5 = self.vector_add(t5, t5) zc1b0 = self.vector_add(t5, t6) t4 = self.fp2_mul_by_non_residue(t1) t5 = self.vector_add(t0, t4) t6 = self.vector_sub(t5, xc0b2) t1 = self.fp2_square(xc0b2) t6 = self.vector_add(t6, t6) zc0b2 = self.vector_add(t6, t5) t4 = self.fp2_mul_by_non_residue(t1) t5 = self.vector_add(t2, t4) t6 = self.vector_sub(t5, xc0b1) t6 = self.vector_add(t6, t6) zc0b1 = self.vector_add(t6, t5) t0 = self.vector_add(t2, t1) t5 = self.vector_sub(t3, t0) t6 = self.vector_add(t5, xc1b2) t6 = self.vector_add(t6, t6) zc1b2 = self.vector_add(t5, t6) return zc0b1 + zc0b2 + zc1b0 + zc1b2 def fp12_decompress_karabina_pt_I_c1b2_Z(self, xc0b1, xc1b2): assert len(xc0b1) == len(xc1b2) == 2 t0 = self.fp2_mul(xc0b1, xc1b2) t0 = self.vector_add(t0, t0) # t1 = xc0b2 return t0 def fp12_decompress_karabina_pt_I_c1b2_NZ( self, xc0b1: list[ModuloCircuitElement], xc0b2: list[ModuloCircuitElement], xc1b0: list[ModuloCircuitElement], xc1b2: list[ModuloCircuitElement], ): assert len(xc0b1) == len(xc0b2) == len(xc1b0) == len(xc1b2) == 2 t0 = self.fp2_square(xc0b1) t1 = self.vector_sub(t0, xc0b2) t1 = self.vector_add(t1, t1) t1 = self.vector_add(t1, t0) t2 = self.fp2_square(xc1b2) t0 = self.vector_add(self.fp2_mul_by_non_residue(t2), t1) t1 = self.vector_add(xc1b0, xc1b0) t1 = self.vector_add(t1, t1) return t0, t1 def fp12_decompress_karabina_pt_II( self, t0: list[ModuloCircuitElement], t1: list[ModuloCircuitElement], xc0b1: list[ModuloCircuitElement], xc0b2: list[ModuloCircuitElement], xc1b0: list[ModuloCircuitElement], xc1b2: list[ModuloCircuitElement], ): assert len(t0) == len(t1) == 2 assert len(xc0b1) == len(xc0b2) == len(xc1b0) == len(xc1b2) == 2 zc1b1 = self.fp2_div(t0, t1) t1 = self.fp2_mul(xc0b2, xc0b1) t2 = self.vector_sub(self.fp2_square(zc1b1), t1) t2 = self.vector_add(t2, t2) t2 = self.vector_sub(t2, t1) t1 = self.fp2_mul(xc1b0, xc1b2) t2 = self.vector_add(t2, t1) zc0b0 = self.fp2_mul_by_non_residue(t2) zc0b0 = [ self.add(zc0b0[0], self.set_or_get_constant(1)), zc0b0[1], ] return zc0b0, zc1b1 ================================================ FILE: hydra/garaga/precompiled_circuits/multi_miller_loop.py ================================================ from typing import Iterator, Tuple from garaga.curves import BLS12_381_ID, BN254_ID, CURVES, CurveID from garaga.extension_field_modulo_circuit import ( ExtensionFieldModuloCircuit, ModuloCircuitElement, PyFelt, ) from garaga.hints.io import flatten from garaga.points import G1Point, G2Point, precompute_lineline_sparsity class MultiMillerLoopCircuit(ExtensionFieldModuloCircuit): def __init__( self, name: str, curve_id: int, n_pairs: int, hash_input: bool = True, init_hash: int = None, compilation_mode: int = 0, precompute_lines: bool = False, n_points_precomputed_lines: int = None, tower_mode: bool = False, ): super().__init__( name=name, curve_id=curve_id, extension_degree=12, hash_input=hash_input, init_hash=init_hash, compilation_mode=compilation_mode, ) self.curve = CURVES[curve_id] self.line_sparsity: list[int] = self.curve.line_function_sparsity self.line_line_sparsity: list[int] = precompute_lineline_sparsity(curve_id) self.n_pairs = n_pairs self.P = [] self.Q = [] self.yInv = [] self.xNegOverY = [] self.loop_counter = CURVES[self.curve_id].loop_counter self.ops_counter.update( { "Double Step": 0, "Double-and-Add Step": 0, "Triple Step": 0, "MUL_L_BY_L": 0, "MUL_LL_BY_LL": 0, "MUL_LL_BY_L": 0, "MUL_BY_L": 0, "MUL_BY_LL": 0, } ) self.n_points_precomputed_lines = n_points_precomputed_lines self.precompute_lines: bool = precompute_lines self.precomputed_lines: list[ModuloCircuitElement] = [] self._precomputed_lines_generator = None def _create_precomputed_lines_generator( self, ) -> Iterator[ Tuple[ Tuple[ModuloCircuitElement, ModuloCircuitElement], Tuple[ModuloCircuitElement, ModuloCircuitElement], ] ]: if self.precompute_lines: if len(self.precomputed_lines) % 4 != 0: raise ValueError( "Number of precomputed line elements must be a multiple of 4." ) for i in range(0, len(self.precomputed_lines), 4): yield ( (self.precomputed_lines[i], self.precomputed_lines[i + 1]), (self.precomputed_lines[i + 2], self.precomputed_lines[i + 3]), ) else: while True: yield ((None, None), (None, None)) def get_next_precomputed_line( self, ) -> Tuple[Tuple[PyFelt, PyFelt], Tuple[PyFelt, PyFelt]]: return next(self._precomputed_lines_generator) def write_p_and_q(self, P: list[G1Point], Q: list[G2Point]): assert len(P) == len(Q) == self.n_pairs assert set([P[i].curve_id for i in range(len(P))]) == set( [Q[i].curve_id for i in range(len(Q))] ) raw = [] for P, Q in zip(P, Q): raw.extend([self.field(P.x), self.field(P.y)]) raw.extend([self.field(Q.x[0]), self.field(Q.x[1])]) raw.extend([self.field(Q.y[0]), self.field(Q.y[1])]) self.write_p_and_q_raw(raw) return None def write_p_and_q_raw(self, input: list[PyFelt], precompute_consts: bool = True): assert ( len(input) == 6 * self.n_pairs ), f"Expected {6 * self.n_pairs} inputs, got {len(input)}" for i in range(self.n_pairs): self.P.append( ( self.write_element(input[6 * i]), self.write_element(input[6 * i + 1]), ) ) self.Q.append( ( [ self.write_element(input[6 * i + 2]), self.write_element(input[6 * i + 3]), ], [ self.write_element(input[6 * i + 4]), self.write_element(input[6 * i + 5]), ], ) ) if precompute_consts: self.precompute_consts() return None def precompute_consts(self, n_pairs: int = None, skip_P_precompute: bool = False): n_pairs = n_pairs or self.n_pairs if not skip_P_precompute: self.yInv = [self.inv(self.P[i][1]) for i in range(n_pairs)] self.xNegOverY = [ self.neg(self.div(self.P[i][0], self.P[i][1])) for i in range(n_pairs) ] if -1 in self.loop_counter: self.Qneg = [ (self.Q[i][0], self.vector_neg(self.Q[i][1])) for i in range(n_pairs) ] else: self.Qneg = None return None def compute_doubling_slope( self, Q: tuple[ list[ModuloCircuitElement], list[ModuloCircuitElement], ], ) -> list[ModuloCircuitElement, ModuloCircuitElement]: # num = 3 * x^2 # den = 2 * y x0, x1 = Q[0][0], Q[0][1] # x² = (x0 + i x1)² = (x0² - x1²) + 2 * i * x0 * x1 = (x0+x1)(x0-x1) + i * 2 * x0 * x1. # (x0+x1)*(x0-x1) is cheaper than x0² - x1². (2 ADD + 1 MUL) vs (1 ADD + 2 MUL) (16 vs 20 steps) # Omits mul by 2x for imaginary part to multiply once by 6 instead of doubling and multiplying by 3. num_tmp = [ self.mul( self.add(x0, x1, comment="Doubling slope numerator start"), self.sub(x0, x1), ), self.mul(x0, x1), ] num = [ self.mul(num_tmp[0], self.set_or_get_constant(3)), self.mul( num_tmp[1], self.set_or_get_constant(6), comment="Doubling slope numerator end", ), ] den = self.vector_add(Q[1], Q[1]) return self.fp2_div(num, den) def compute_adding_slope( self, Qa: tuple[ list[ModuloCircuitElement], list[ModuloCircuitElement], ], Qb: tuple[ list[ModuloCircuitElement], list[ModuloCircuitElement], ], ) -> list[ModuloCircuitElement]: # num = ya - yb # den = xa - xb num = self.vector_sub(Qa[1], Qb[1]) den = self.vector_sub(Qa[0], Qb[0]) return self.fp2_div(num, den) def build_sparse_line_eval( self, R0: tuple[ModuloCircuitElement, ModuloCircuitElement], R1: tuple[ModuloCircuitElement, ModuloCircuitElement], yInv: ModuloCircuitElement, xNegOverY: ModuloCircuitElement, ) -> list[ModuloCircuitElement]: # Mocked ModuloCircuitElement for ZERO and ONE. # They are not part of the circuit because only the non-zero or non-ones will be used due do the # known-in-advance sparsity ZERO, ONE = ModuloCircuitElement(self.field(0), -1), ModuloCircuitElement( self.field(1), -1 ) if self.curve_id == BN254_ID: return [ ONE, self.mul( self.add(R0[0], self.mul(self.set_or_get_constant(-9), R0[1])), xNegOverY, comment="eval bn line by xNegOverY", ), ZERO, self.mul( self.add(R1[0], self.mul(self.set_or_get_constant(-9), R1[1])), yInv, comment="eval bn line by yInv", ), ZERO, ZERO, ZERO, self.mul(R0[1], xNegOverY, comment="eval bn line by xNegOverY"), ZERO, self.mul(R1[1], yInv, comment="eval bn line by yInv"), ZERO, ZERO, ] elif self.curve_id == BLS12_381_ID: return [ self.mul( self.sub(R1[0], R1[1]), yInv, comment="eval bls line by yInv" ), # nr=1 ZERO, self.mul( self.sub(R0[0], R0[1]), xNegOverY, comment="eval blsline by xNegOverY", ), # nr=1 ONE, ZERO, ZERO, self.mul(R1[1], yInv, comment="eval bls line by yInv"), ZERO, self.mul(R0[1], xNegOverY, comment="eval bls line by xNegOverY"), ZERO, ZERO, ZERO, ] else: raise NotImplementedError def _add( self, Qa: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], Qb: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], k: int, ): if self.precompute_lines and (k + 1) <= self.n_points_precomputed_lines: return (None, None), self.get_next_precomputed_line() λ = self.compute_adding_slope(Qa, Qb) xr = self.vector_sub(X=self.fp2_square(X=λ), Y=self.vector_add(Qa[0], Qb[0])) yr = self.vector_sub( X=self.fp2_mul(X=λ, Y=self.vector_sub(Qa[0], xr)), Y=Qa[1], ) p = (xr, yr) lineR0 = λ lineR1 = self.vector_sub(self.fp2_mul(λ, Qa[0]), Qa[1]) return p, (lineR0, lineR1) def add_step( self, Qa: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], Qb: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], k: int, ): p, (lineR0, lineR1) = self._add(Qa, Qb, k) line = self.build_sparse_line_eval( R0=lineR0, R1=lineR1, yInv=self.yInv[k], xNegOverY=self.xNegOverY[k], ) return p, line def _line_compute( self, Qa: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], Qb: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], k: int, ): if self.precompute_lines and (k + 1) <= self.n_points_precomputed_lines: return self.get_next_precomputed_line() λ = self.compute_adding_slope(Qa, Qb) lineR0 = λ lineR1 = self.vector_sub(self.fp2_mul(λ, Qa[0]), Qa[1]) return lineR0, lineR1 def line_compute( self, Qa: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], Qb: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], k: int, ): lineR0, lineR1 = self._line_compute(Qa, Qb, k) line = self.build_sparse_line_eval( R0=lineR0, R1=lineR1, yInv=self.yInv[k], xNegOverY=self.xNegOverY[k], ) return line def _double( self, Q: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], k: int ): """ Perform a single doubling of a point on an elliptic curve and store the line evaluation, including computations that involve the y coordinate. :param p1: A tuple representing the point on the curve (x, y) in the extension field. :return: A tuple containing the doubled point and the line evaluation. """ if self.precompute_lines and (k + 1) <= self.n_points_precomputed_lines: return ((None, None), self.get_next_precomputed_line()) self.ops_counter["Double Step"] += 1 λ = self.compute_doubling_slope(Q) # Compute λ = 3x² / 2y # Compute xr = λ² - 2x xr = self.vector_sub(X=self.fp2_square(X=λ), Y=self.vector_add(Q[0], Q[0])) # Compute yr = λ(x - xr) - y yr = self.vector_sub(X=self.fp2_mul(λ, self.vector_sub(Q[0], xr)), Y=Q[1]) p = (xr, yr) lineR0 = λ lineR1 = self.vector_sub(self.fp2_mul(λ, Q[0]), Q[1]) return p, (lineR0, lineR1) def double_step( self, Q: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], k: int, ): p, (lineR0, lineR1) = self._double(Q, k) line = self.build_sparse_line_eval( R0=lineR0, R1=lineR1, yInv=self.yInv[k], xNegOverY=self.xNegOverY[k], ) return p, line def _double_and_add( self, Qa: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], Qb: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], k: int, ) -> list[ModuloCircuitElement]: if self.precompute_lines and (k + 1) <= self.n_points_precomputed_lines: return ( (None, None), self.get_next_precomputed_line(), self.get_next_precomputed_line(), ) self.ops_counter["Double-and-Add Step"] += 1 # Computes 2Qa+Qb as (Qa+Qb)+Qa # https://arxiv.org/pdf/math/0208038.pdf 3.1 λ1 = self.compute_adding_slope(Qa, Qb) # compute x3 = λ1²-x1-x2 x3 = self.vector_sub(X=self.fp2_square(X=λ1), Y=self.vector_add(Qa[0], Qb[0])) # omit y3 computation line1R0 = λ1 line1R1 = self.vector_sub(self.fp2_mul(λ1, Qa[0]), Qa[1]) # compute λ2 = -λ1-2y1/(x3-x1) num = self.vector_add(Qa[1], Qa[1]) den = self.vector_sub(x3, Qa[0]) λ2 = self.vector_neg(self.vector_add(λ1, self.fp2_div(num, den))) # compute xr = λ2²-x1-x3 x4 = self.vector_sub(self.vector_sub(self.fp2_square(λ2), Qa[0]), x3) # compute y4 = λ2(x1 - x4)-y1 y4 = self.vector_sub(self.fp2_mul(λ2, self.vector_sub(Qa[0], x4)), Qa[1]) line2R0 = λ2 line2R1 = self.vector_sub(self.fp2_mul(λ2, Qa[0]), Qa[1]) return (x4, y4), (line1R0, line1R1), (line2R0, line2R1) def double_and_add_step( self, Qa: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], Qb: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], k: int, ): (new_x, new_y), (line1R0, line1R1), (line2R0, line2R1) = self._double_and_add( Qa, Qb, k ) line1 = self.build_sparse_line_eval( R0=line1R0, R1=line1R1, yInv=self.yInv[k], xNegOverY=self.xNegOverY[k], ) line2 = self.build_sparse_line_eval( R0=line2R0, R1=line2R1, yInv=self.yInv[k], xNegOverY=self.xNegOverY[k], ) return (new_x, new_y), line1, line2 def _triple( self, Q: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], k: int ): if self.precompute_lines and (k + 1) <= self.n_points_precomputed_lines: return ( (None, None), self.get_next_precomputed_line(), self.get_next_precomputed_line(), ) self.ops_counter["Triple Step"] += 1 # Compute λ = 3x² / 2y. Manually to keep den = 2y to be re-used for λ2. x0, x1 = Q[0][0], Q[0][1] num_tmp = [ self.mul(self.add(x0, x1), self.sub(x0, x1)), self.mul(x0, x1), ] num = [ self.mul(num_tmp[0], self.set_or_get_constant(3)), self.mul(num_tmp[1], self.set_or_get_constant(6)), ] den = self.vector_add(Q[1], Q[1]) λ1 = self.fp2_div(num, den) line1R0 = λ1 line1R1 = self.vector_sub(self.fp2_mul(λ1, Q[0]), Q[1]) # x2 = λ1^2 - 2x x2 = self.vector_sub(self.fp2_square(λ1), self.vector_add(Q[0], Q[0])) # ommit yr computation, and # compute λ2 = 2y/(x2 − x) − λ1. # However in https://github.com/Consensys/gnark/blob/7cfcd5a723b0726dcfe75a5fc7249a23d690b00b/std/algebra/emulated/sw_bls12381/pairing.go#L548 # It's coded as x - x2. λ2 = self.vector_sub(self.fp2_div(den, self.vector_sub(Q[0], x2)), λ1) line2R0 = λ2 line2R1 = self.vector_sub(self.fp2_mul(λ2, Q[0]), Q[1]) # // xr = λ²-p.x-x2 xr = self.vector_sub(self.fp2_square(λ2), self.vector_add(Q[0], x2)) # // yr = λ(p.x-xr) - p.y yr = self.vector_sub(self.fp2_mul(λ2, self.vector_sub(Q[0], xr)), Q[1]) return (xr, yr), (line1R0, line1R1), (line2R0, line2R1) def triple_step( self, Q: tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]], k: int ): (new_x, new_y), (line1R0, line1R1), (line2R0, line2R1) = self._triple(Q, k) line1 = self.build_sparse_line_eval( R0=line1R0, # Directly store λ as R0 R1=line1R1, # Compute R1 as λ*x - y yInv=self.yInv[k], xNegOverY=self.xNegOverY[k], ) line2 = self.build_sparse_line_eval( R0=line2R0, R1=line2R1, yInv=self.yInv[k], xNegOverY=self.xNegOverY[k], ) return (new_x, new_y), line1, line2 def bit_0_case( self, f: list[ModuloCircuitElement], points: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], n_pairs: int, ): """ Compute the bit 0 case of the Miller loop. params : f : the current miller loop FP12 element points : the list of points to double n_pairs : the number of pairs to double returns : the new miller loop FP12 element and the new points """ assert len(points) == n_pairs new_lines = [] new_points = [] for k in range(n_pairs): T, l1 = self.double_step(points[k], k) new_lines.append(l1) new_points.append(T) # Square f and multiply by lines for all pairs new_f = self.extf_mul( [f, f, *new_lines], 12, Ps_sparsities=[None, None] + [self.line_sparsity] * n_pairs, ) return new_f, new_points def bit_1_init_case( self, f: list[ModuloCircuitElement], points: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], n_pairs: int, ): """ Compute the bit 1 case of the Miller loop when it is the first bit. Uses triple step instead of double and add. """ assert len(points) == n_pairs new_lines = [] new_points = [] for k in range(n_pairs): T, l1, l2 = self.triple_step(points[k], k) new_lines.append(l1) new_lines.append(l2) new_points.append(T) # Square f and multiply by lines for all pairs new_f = self.extf_mul( [f, f, *new_lines], 12, Ps_sparsities=[None, None] + [self.line_sparsity] * n_pairs * 2, ) return new_f, new_points def bit_1_case( self, f: list[ModuloCircuitElement], points: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], Q_select: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], n_pairs: int, ): """ Compute the bit 1 case of the Miller loop. params : f : the current miller loop FP12 element points : the list of points to double Q_select : the list of points to add. Q_select[k] is the point to add if the k-th bit is 1, and the negation of the point if the k-th bit is -1. n_pairs : the number of pairs to double returns : the new miller loop FP12 element and the new points """ assert len(points) == n_pairs == len(Q_select) new_lines = [] new_points = [] for k in range(n_pairs): T, l1, l2 = self.double_and_add_step(points[k], Q_select[k], k) new_lines.append(l1) new_lines.append(l2) new_points.append(T) # Square f and multiply by lines for all pairs new_f = self.extf_mul( [f, f, *new_lines], 12, Ps_sparsities=[None, None] + [self.line_sparsity] * n_pairs * 2, ) return new_f, new_points def _bn254_finalize_step( self, Qs: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], ): def set_or_get_constants(): nr1p2 = [ self.set_or_get_constant( self.field( 21575463638280843010398324269430826099269044274347216827212613867836435027261 ) ), self.set_or_get_constant( self.field( 10307601595873709700152284273816112264069230130616436755625194854815875713954 ) ), ] # Non residue 1 power 2 nr1p3 = [ self.set_or_get_constant( self.field( 2821565182194536844548159561693502659359617185244120367078079554186484126554 ), ), self.set_or_get_constant( self.field( 3505843767911556378687030309984248845540243509899259641013678093033130930403 ), ), ] # Non residue 1 power 3 nr2p2 = self.set_or_get_constant( self.field( 21888242871839275220042445260109153167277707414472061641714758635765020556616 ) # non_residue_2_power_2 ) nr2p3 = self.set_or_get_constant( self.field( -21888242871839275222246405745257275088696311157297823662689037894645226208582 ) ) # (-1) * non_residue_2_power_3 return nr1p2, nr1p3, nr2p2, nr2p3 new_lines = [] for k in range(self.n_pairs): if self.precompute_lines and (k + 1) <= self.n_points_precomputed_lines: new_lines.append( (self.get_next_precomputed_line(), self.get_next_precomputed_line()) ) else: nr1p2, nr1p3, nr2p2, nr2p3 = set_or_get_constants() q1x = [self.Q[k][0][0], self.neg(self.Q[k][0][1])] q1y = [self.Q[k][1][0], self.neg(self.Q[k][1][1])] q1x = self.fp2_mul( q1x, nr1p2, ) q1y = self.fp2_mul( q1y, nr1p3, ) q2x = self.vector_scale( self.Q[k][0], nr2p2, ) q2y = self.vector_scale( self.Q[k][1], nr2p3, ) T, (l1R0, l1R1) = self._add(Qs[k], (q1x, q1y), k) l2R0, l2R1 = self._line_compute(T, (q2x, q2y), k) new_lines.append(((l1R0, l1R1), (l2R0, l2R1))) return new_lines def bn254_finalize_step( self, Qs: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], ): lines = self._bn254_finalize_step(Qs) lines_evaluated = [] for k, (l1, l2) in enumerate(lines): line_eval = self.build_sparse_line_eval( R0=l1[0], R1=l1[1], yInv=self.yInv[k], xNegOverY=self.xNegOverY[k], ) line_eval2 = self.build_sparse_line_eval( R0=l2[0], R1=l2[1], yInv=self.yInv[k], xNegOverY=self.xNegOverY[k], ) lines_evaluated.append(line_eval) lines_evaluated.append(line_eval2) return lines_evaluated def miller_loop(self, n_pairs: int) -> list[ModuloCircuitElement]: f = [self.set_or_get_constant(1)] + [self.set_or_get_constant(0)] * 11 start_index = len(self.loop_counter) - 2 if self.loop_counter[start_index] == 1: # Handle case when first bit is +1, need to triple point instead of double and add. f, Qs = self.bit_1_init_case(f, self.Q, n_pairs) elif self.loop_counter[start_index] == 0: f, Qs = self.bit_0_case(f, self.Q, n_pairs) else: raise NotImplementedError( f"Init bit {self.loop_counter[start_index]} not implemented" ) # Rest of miller loop. for i in range(start_index - 1, -1, -1): if self.loop_counter[i] == 0: f, Qs = self.bit_0_case(f, Qs, n_pairs) elif self.loop_counter[i] == 1 or self.loop_counter[i] == -1: # Choose Q or -Q depending on the bit for the addition. Q_selects = [ self.Q[k] if self.loop_counter[i] == 1 else self.Qneg[k] for k in range(n_pairs) ] f, Qs = self.bit_1_case(f, Qs, Q_selects, n_pairs) else: raise NotImplementedError(f"Bit {self.loop_counter[i]} not implemented") if self.curve_id == CurveID.BN254.value: lines = self.bn254_finalize_step(Qs) f = self.extf_mul( [f, *lines], 12, Ps_sparsities=[None] + [self.line_sparsity] * self.n_pairs * 2, ) elif self.curve_id == CurveID.BLS12_381.value: f = [ f[0], self.neg(f[1]), f[2], self.neg(f[3]), f[4], self.neg(f[5]), f[6], self.neg(f[7]), f[8], self.neg(f[9]), f[10], self.neg(f[11]), ] else: raise NotImplementedError(f"Curve {self.curve_id} not implemented") return f def precompute_lines(Qs: list[G2Point]) -> list[PyFelt]: if len(Qs) == 0: return [] curve_id = Qs[0].curve_id.value loop_counter = CURVES[curve_id].loop_counter start_index = len(loop_counter) - 2 n_pairs = len(Qs) circuit = MultiMillerLoopCircuit( name="precompute_helper", curve_id=curve_id, n_pairs=n_pairs, hash_input=False, precompute_lines=False, ) field = circuit.field for Q in Qs: circuit.Q.append( ( [ circuit.write_element(field(Q.x[0])), circuit.write_element(field(Q.x[1])), ], [ circuit.write_element(field(Q.y[0])), circuit.write_element(field(Q.y[1])), ], ) ) circuit.precompute_consts(skip_P_precompute=True) lines = [] if loop_counter[start_index] == 1: # Handle case when first bit is +1, need to triple point instead of double and add. new_points = [] new_lines = [] for k in range(n_pairs): T, l1, l2 = circuit._triple(circuit.Q[k], k) new_lines.append(l1) new_lines.append(l2) new_points.append(T) elif loop_counter[start_index] == 0: new_lines = [] new_points = [] for k in range(n_pairs): T, l1 = circuit._double(circuit.Q[k], k) new_lines.append(l1) new_points.append(T) else: raise NotImplementedError( f"Init bit {loop_counter[start_index]} not implemented" ) points = new_points lines.append(new_lines) # Rest of miller loop.= for i in range(start_index - 1, -1, -1): new_lines = [] new_points = [] if loop_counter[i] == 0: for k in range(n_pairs): T, l1 = circuit._double(points[k], k) new_lines.append(l1) new_points.append(T) elif loop_counter[i] == 1 or loop_counter[i] == -1: # Choose Q or -Q depending on the bit for the addition. Q_selects = [ circuit.Q[k] if loop_counter[i] == 1 else circuit.Qneg[k] for k in range(n_pairs) ] for k in range(n_pairs): T, l1, l2 = circuit._double_and_add(points[k], Q_selects[k], k) new_lines.append(l1) new_lines.append(l2) new_points.append(T) else: raise NotImplementedError(f"Bit {loop_counter[i]} not implemented") points = new_points lines.append(new_lines) if curve_id == CurveID.BN254.value: final_lines = circuit._bn254_finalize_step(points) for l1, l2 in final_lines: lines.append(l1) lines.append(l2) elif curve_id == CurveID.BLS12_381.value: pass else: raise NotImplementedError(f"Curve {curve_id} not implemented") return [x.felt for x in flatten(lines)] ================================================ FILE: hydra/garaga/precompiled_circuits/multi_pairing_check.py ================================================ from garaga.algebra import get_sparsity from garaga.curves import CURVES, CurveID, get_base_field from garaga.hints.frobenius import get_frobenius_maps from garaga.hints.multi_miller_witness import get_final_exp_witness from garaga.hints.tower_backup import E6, E12 from garaga.modulo_circuit import ModuloCircuitElement, PyFelt, WriteOps from garaga.points import G1G2Pair, G1Point, G2Point from garaga.precompiled_circuits.multi_miller_loop import MultiMillerLoopCircuit def get_root_and_scaling_factor( curve_id: int, P: list[G1Point | tuple[ModuloCircuitElement, ModuloCircuitElement]], Q: list[ G2Point | tuple[ tuple[ModuloCircuitElement, ModuloCircuitElement], tuple[ModuloCircuitElement, ModuloCircuitElement], ] ], m: list[ModuloCircuitElement] = None, ) -> tuple[list[PyFelt], list[PyFelt], list[int]]: assert ( len(P) == len(Q) >= 2 ), f"P and Q must have the same length and >= 2, got {len(P)} and {len(Q)}" field = get_base_field(curve_id) c_input: list[PyFelt] = [] c: MultiMillerLoopCircuit = MultiMillerLoopCircuit( name="mock", curve_id=curve_id, n_pairs=len(P) ) if isinstance(P[0], G1Point): c.write_p_and_q(P, Q) elif isinstance(P[0], tuple) and isinstance(P[0][0], ModuloCircuitElement): for p, q in zip(P, Q): c_input.append(p[0].felt) c_input.append(p[1].felt) c_input.append(q[0][0].felt) c_input.append(q[0][1].felt) c_input.append(q[1][0].felt) c_input.append(q[1][1].felt) c.write_p_and_q_raw(c_input) f = E12.from_direct(c.miller_loop(len(P)), curve_id) if m is not None: M = E12.from_direct(m, curve_id) f = f * M # h = (CURVES[curve_id].p ** 12 - 1) // CURVES[curve_id].n # assert f**h == E12.one(curve_id) lambda_root_e12, scaling_factor_e12 = get_final_exp_witness(curve_id, f) lambda_root: list[PyFelt] scaling_factor: list[PyFelt] lambda_root, scaling_factor = ( ( lambda_root_e12.__inv__().to_direct() if curve_id == CurveID.BLS12_381.value else lambda_root_e12.to_direct() ), # Pass lambda_root inverse directly for BLS. scaling_factor_e12.to_direct(), ) e6_subfield = E12([E6.random(curve_id), E6.zero(curve_id)], curve_id) scaling_factor_sparsity = get_sparsity(e6_subfield.to_direct()) # Assert sparsity is correct: for every index where the sparsity is 0, the coefficient must 0 in scaling factor for i in range(len(scaling_factor_sparsity)): if scaling_factor_sparsity[i] == 0: assert scaling_factor[i].value == 0 # Therefore scaling factor lies in Fp6 return lambda_root, scaling_factor, scaling_factor_sparsity def get_max_Q_degree(curve_id: int, n_pairs: int) -> int: if curve_id == CurveID.BN254.value: line_degree = 9 elif curve_id == CurveID.BLS12_381.value: line_degree = 8 else: raise NotImplementedError(f"Curve {curve_id} not implemented") f_degree = 11 lambda_root_degree = 11 if curve_id == CurveID.BN254.value: # Largest degree happen in bit_10 case where we do (f*f*C * Π_n_pairs(line)^2 * Π_n_pairs(line)) max_q_degree = ( 4 * f_degree + 2 * lambda_root_degree + 4 * line_degree * n_pairs + line_degree * n_pairs - 12 ) else: # Largest Q happens in bit_00 case where we do (f*f* Π_n_pairs(line)^2 * Π_n_pairs(line) max_q_degree = ( 4 * f_degree + 2 * line_degree * n_pairs + line_degree * n_pairs - 12 ) return max_q_degree class MultiPairingCheckCircuit(MultiMillerLoopCircuit): def __init__( self, name: str, curve_id: int, n_pairs: int, hash_input: bool = True, init_hash: int = None, compilation_mode: int = 0, precompute_lines: bool = False, n_points_precomputed_lines: int = None, ): assert n_pairs >= 2, "n_pairs must be >= 2 for pairing checks" super().__init__( name=name, curve_id=curve_id, n_pairs=n_pairs, hash_input=hash_input, init_hash=init_hash, compilation_mode=compilation_mode, precompute_lines=precompute_lines, n_points_precomputed_lines=n_points_precomputed_lines, ) self.frobenius_maps = {} for i in [1, 2, 3]: _, self.frobenius_maps[i] = get_frobenius_maps( curve_id=curve_id, extension_degree=self.extension_degree, frob_power=i ) def frobenius( self, X: list[ModuloCircuitElement], frob_power: int ) -> list[ModuloCircuitElement]: frob = [None] * self.extension_degree for i, list_op in enumerate(self.frobenius_maps[frob_power]): list_op_result = [] for index, constant in list_op: if constant == 1: list_op_result.append(X[index]) else: list_op_result.append( self.mul( X[index], self.set_or_get_constant(self.field(constant)) ) ) frob[i] = list_op_result[0] for op_res in list_op_result[1:]: frob[i] = self.add(frob[i], op_res) return frob def bit_0_case( self, f: list[ModuloCircuitElement], points: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], n_pairs: int, ): """ Compute the bit 0 case of the Miller loop. params : f : the current miller loop FP12 element points : the list of points to double n_pairs : the number of pairs to double returns : the new miller loop FP12 element and the new points """ assert len(points) == n_pairs new_lines = [] new_points = [] for k in range(n_pairs): T, l1 = self.double_step(points[k], k) new_lines.append(l1) new_points.append(T) # Square f and multiply by lines for all pairs new_f = self.extf_mul( [f, f, *new_lines], 12, Ps_sparsities=[None, None] + [self.line_sparsity] * n_pairs, ) return new_f, new_points def bit_00_case( self, f: list[ModuloCircuitElement], points: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], n_pairs: int, ): """ Compute the bit 00 case of the Miller loop. params : f : the current miller loop FP12 element points : the list of points to double n_pairs : the number of pairs to double returns : the new miller loop FP12 element and the new points """ assert len(points) == n_pairs new_lines = [] new_points = [] for k in range(n_pairs): T, l1 = self.double_step(points[k], k) new_lines.append(l1) new_lines.append(l1) # Double since it's going to be squared new_points.append(T) new_new_points = [] new_new_lines = [] for k in range(n_pairs): T, l1 = self.double_step(new_points[k], k) new_new_lines.append(l1) new_new_points.append(T) # (f^2 * Π_(new_lines))^2 * Π_new_new_lines = f^4 * Π_new_lines^2 * Π_new_new_lines new_f = self.extf_mul( [f, f, f, f, *new_lines, *new_new_lines], 12, Ps_sparsities=[None, None, None, None] + [self.line_sparsity] * n_pairs * 2 + [self.line_sparsity] * n_pairs, ) return new_f, new_new_points def bit_01_case( self, f: list[ModuloCircuitElement], points: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], Q_selects: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], c_or_c_inv: list[ModuloCircuitElement], n_pairs: int, ): assert len(points) == n_pairs new_lines = [] new_points = [] for k in range(n_pairs): T, l1 = self.double_step(points[k], k) new_lines.append(l1) new_lines.append(l1) # Double since it's going to be squared new_points.append(T) new_new_points = [] new_new_lines = [] for k in range(n_pairs): T, l1, l2 = self.double_and_add_step(new_points[k], Q_selects[k], k) new_new_lines.append(l1) new_new_lines.append(l2) new_new_points.append(T) # (f^2 * Π_(new_lines))^2 * Π_new_new_lines = f^4 * Π_new_lines^2 * Π_new_new_lines new_f = self.extf_mul( [f, f, f, f, *new_lines, *new_new_lines, c_or_c_inv], 12, Ps_sparsities=[None] * 4 + [self.line_sparsity] * n_pairs * 2 + [self.line_sparsity] * n_pairs * 2 + [None], ) return new_f, new_new_points def bit_10_case( self, f: list[ModuloCircuitElement], points: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], Q_selects: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], c_or_c_inv: list[ModuloCircuitElement], n_pairs: int, ): assert len(points) == n_pairs new_lines = [] new_points = [] for k in range(n_pairs): T, l1, l2 = self.double_and_add_step(points[k], Q_selects[k], k) new_lines.append(l1) new_lines.append(l1) # Double since it's going to be squared new_lines.append(l2) new_lines.append(l2) # Double since it's going to be squared new_points.append(T) new_new_points = [] new_new_lines = [] for k in range(n_pairs): T, l1 = self.double_step(new_points[k], k) new_new_lines.append(l1) new_new_points.append(T) new_f = self.extf_mul( [f, f, f, f, c_or_c_inv, c_or_c_inv, *new_lines, *new_new_lines], 12, Ps_sparsities=[None] * 4 + [None, None] + [self.line_sparsity] * n_pairs * 4 + [self.line_sparsity] * n_pairs, ) return new_f, new_new_points def bit_1_init_case( self, f: list[ModuloCircuitElement], points: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], n_pairs: int, c: list[ModuloCircuitElement], ): """ Compute the bit 1 case of the Miller loop when it is the first bit (positive). Uses triple step instead of double and add. """ assert len(points) == n_pairs new_lines = [] new_points = [] for k in range(n_pairs): T, l1, l2 = self.triple_step(points[k], k) new_lines.append(l1) new_lines.append(l2) new_points.append(T) # Square f and multiply by lines for all pairs new_f = self.extf_mul( [f, f, c, *new_lines], 12, Ps_sparsities=[None, None, None] + [self.line_sparsity] * n_pairs * 2, ) return new_f, new_points def bit_1_case( self, f: list[ModuloCircuitElement], points: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], Q_select: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], n_pairs: int, c_or_c_inv: list[ModuloCircuitElement], ): """ Compute the bit 1 case of the Miller loop. params : f : the current miller loop FP12 element points : the list of points to double Q_select : the list of points to add. Q_select[k] is the point to add if the k-th bit is 1, and the negation of the point if the k-th bit is -1. n_pairs : the number of pairs to double c_or_c_inv : the lambda-th root c or its inverse depending on the bit (c_inv if 1, c if -1) returns : the new miller loop FP12 element and the new points """ assert len(points) == n_pairs == len(Q_select) new_lines = [] new_points = [] for k in range(n_pairs): T, l1, l2 = self.double_and_add_step(points[k], Q_select[k], k) new_lines.append(l1) new_lines.append(l2) new_points.append(T) # Square f and multiply by lines for all pairs new_f = self.extf_mul( [f, f, c_or_c_inv, *new_lines], 12, Ps_sparsities=[None, None, None] + [self.line_sparsity] * n_pairs * 2, ) return new_f, new_points def multi_pairing_check( self, n_pairs: int, m: list[ModuloCircuitElement] | None = None ) -> tuple[ list[ModuloCircuitElement], list[ModuloCircuitElement], list[ModuloCircuitElement], ]: lambda_root, scaling_factor, scaling_factor_sparsity = ( get_root_and_scaling_factor(self.curve_id, self.P, self.Q, m) ) c_or_c_inv = self.write_elements(lambda_root, WriteOps.COMMIT) w = self.write_elements( scaling_factor, WriteOps.COMMIT, scaling_factor_sparsity ) if self.curve_id == CurveID.BLS12_381.value: # Conjugate c so that the final conjugate in BLS loop gives indeed f/c^(-x), as conjugate(f/conjugate(c^(-x))) = conjugate(f)/c^(-x) lambda_root = None lambda_root_inverse = c_or_c_inv c_inv = self.conjugate_e12d(lambda_root_inverse) elif self.curve_id == CurveID.BN254.value: lambda_root = c = c_or_c_inv lambda_root_inverse = c_inv = self.extf_inv(c_or_c_inv, 12) # Init f as 1/c = 1 / (λ-th √(f_output*scaling_factor)), where: # λ = 6 * x + 2 + q - q**2 + q**3 for BN # λ = -x + q for BLS # Miller loop will compute f_output/c^(6*x2) if BN, or f_output/c^(-x) if BLS f = c_inv start_index = len(self.loop_counter) - 2 if self.loop_counter[start_index] == 1: # Handle case when first bit is +1, need to triple point instead of double and add. f, Qs = self.bit_1_init_case(f, self.Q, n_pairs, c_inv) elif self.loop_counter[start_index] == 0: f, Qs = self.bit_0_case(f, self.Q, n_pairs) else: raise NotImplementedError( f"Init bit {self.loop_counter[start_index]} not implemented" ) i = start_index - 1 while i >= 0: if self.loop_counter[i] == 0: # First bit is 0 if i > 0: # Check next bit if it exists next_bit = self.loop_counter[i - 1] if next_bit == 0: # 00 case f, Qs = self.bit_00_case(f, Qs, n_pairs) i -= 1 # Skip next bit elif next_bit in (1, -1) and self.curve_id == CurveID.BN254.value: # 01 or 0(-1) case Q_selects = [ self.Q[k] if next_bit == 1 else self.Qneg[k] for k in range(n_pairs) ] c_or_c_inv = c_inv if next_bit == 1 else c f, Qs = self.bit_01_case(f, Qs, Q_selects, c_or_c_inv, n_pairs) i -= 1 # Skip next bit else: # Single 0 (BLS only) f, Qs = self.bit_0_case(f, Qs, n_pairs) else: # Single 0 at the end f, Qs = self.bit_0_case(f, Qs, n_pairs) elif self.loop_counter[i] in (1, -1): # First bit is ±1 # Calculate Q_selects and c_or_c_inv based on the si Q_selects = [ self.Q[k] if self.loop_counter[i] == 1 else self.Qneg[k] for k in range(n_pairs) ] c_or_c_inv = c_inv if self.loop_counter[i] == 1 else c if ( i > 0 and self.loop_counter[i - 1] == 0 and self.curve_id == CurveID.BN254.value ): # 10 or (-1)0 case f, Qs = self.bit_10_case(f, Qs, Q_selects, c_or_c_inv, n_pairs) i -= 1 # Skip next bit elif i == 0 or self.curve_id == CurveID.BLS12_381.value: # Single ±1 at the end f, Qs = self.bit_1_case(f, Qs, Q_selects, n_pairs, c_or_c_inv) else: raise NotImplementedError( f"Bit {self.loop_counter[i]} not implemented" ) else: raise NotImplementedError(f"Bit {self.loop_counter[i]} not implemented") i -= 1 final_r_sparsity = [1] + [0] * 11 if self.curve_id == CurveID.BN254.value: lines = self.bn254_finalize_step(Qs) f = self.extf_mul( [f, *lines], 12, Ps_sparsities=[None] + [self.line_sparsity] * self.n_pairs * 2, ) # λ = 6 * x + 2 + q - q**2 + q**3 c_inv_frob_1 = self.frobenius(c_inv, 1) c_frob_2 = self.frobenius(c, 2) c_inv_frob_3 = self.frobenius(c_inv, 3) f = self.extf_mul( ( [f, w, c_inv_frob_1, c_frob_2, c_inv_frob_3] + ([m] if m is not None else []) ), 12, Ps_sparsities=( [None, scaling_factor_sparsity, None, None, None] + ([None] if m is not None else []) ), r_sparsity=final_r_sparsity, ) elif self.curve_id == CurveID.BLS12_381.value: # λ = -x + q for BLS c_inv_frob_1 = self.frobenius(c_inv, 1) f = self.conjugate_e12d(f) w = self.conjugate_e12d(w) c_inv_frob_1 = self.conjugate_e12d(c_inv_frob_1) f = self.extf_mul( Ps=[f, w, c_inv_frob_1] + ([m] if m is not None else []), extension_degree=12, Ps_sparsities=[None, scaling_factor_sparsity, None] + ([None] if m is not None else []), r_sparsity=final_r_sparsity, ) else: raise NotImplementedError(f"Curve {self.curve_id} not implemented") assert [fi.value for fi in f] == [1] + [ 0 ] * 11, f"Pairing check failed: {[fi.value for fi in f]}" return ( f, lambda_root, lambda_root_inverse, scaling_factor, scaling_factor_sparsity, ) def get_pairing_check_input( curve_id: CurveID, n_pairs: int, include_m: bool = False, return_pairs: bool = False ) -> tuple[list[PyFelt | G1G2Pair], list[PyFelt] | G1G2Pair | None]: """ Generates test input data for pairing check circuits that satisfy e(P1,Q1) * ... * e(Pn,Qn) = 1. For n_pairs=2: Creates BLS signature verification scenario with (signature, message_hash) and (generator, -public_key). For n_pairs>2: Generates random points where the last pair is adjusted to make the product equal 1. Args: curve_id: The elliptic curve to generate points on n_pairs: Number of pairing pairs (minimum 2) include_m: If True, treats last pair separately and computes its Miller loop result return_pairs: If True, returns G1G2Pair objects; if False, returns flattened field elements Returns: - If return_pairs=True: (list of G1G2Pair objects, optional extra pair) - If return_pairs=False: (flattened field elements, optional Miller loop result) """ n_pairs = n_pairs + include_m assert n_pairs >= 2, "n_pairs must be >= 2 for pairing checks" field = get_base_field(curve_id.value) if n_pairs == 2: # Generate inputs resembling BLS signature verification curve = CURVES[curve_id.value] secret_key = field.random(curve.n).value public_key = G2Point.get_nG(curve_id, secret_key) message_hash = G1Point.gen_random_point(curve_id) signature = message_hash.scalar_mul(secret_key) P = [signature, message_hash] Q = [G2Point.get_nG(curve_id, 1), -public_key] else: p = G1Point.gen_random_point(curve_id) q = G2Point.gen_random_point(curve_id) P = [p] * n_pairs Q = [q] * n_pairs P[-1] = p.scalar_mul(-(n_pairs - 1)) c_input = [] for p, q in zip(P, Q): c_input.append(field(p.x)) c_input.append(field(p.y)) c_input.append(field(q.x[0])) c_input.append(field(q.x[1])) c_input.append(field(q.y[0])) c_input.append(field(q.y[1])) if return_pairs: if include_m: return [G1G2Pair(p, q) for p, q in zip(P[:-1], Q[:-1])], G1G2Pair( P[-1], Q[-1] ) else: return [G1G2Pair(p, q) for p, q in zip(P, Q)], None else: if include_m: mloop_circuit = MultiMillerLoopCircuit( name="mock", curve_id=curve_id.value, n_pairs=1 ) mloop_circuit.write_p_and_q_raw(c_input[-6:]) M = mloop_circuit.miller_loop(n_pairs=1) M = [mi.felt for mi in M] return c_input[:-6], M else: return c_input, None ================================================ FILE: hydra/garaga/precompiled_circuits/poseidon_bn254.py ================================================ from garaga.curves import CurveID, get_base_field from garaga.modulo_circuit import ModuloCircuit, ModuloCircuitElement from garaga.modulo_circuit_structs import u384 # Global circuit definition curve_id = CurveID.GRUMPKIN # BN254 field = get_base_field(curve_id) COMPILATION_MODE = 1 # 1 for Cairo, 0 for CairoZero. circuit = ModuloCircuit( name=f"poseidon_{curve_id.name.lower()}", curve_id=curve_id.value, generic_circuit=False, compilation_mode=COMPILATION_MODE, ) # Define inputs to the circuit x = circuit.write_struct(u384("x", [field(1)])) # Input x = 1 y = circuit.write_struct(u384("y", [field(2)])) # Input y = 2 # Utility functions for Poseidon hash def sigma(value): """Applies the Poseidon sigma function.""" x2 = circuit.mul(value, value) # (value * value) x4 = circuit.mul(x2, x2) # (x2 * x2) return circuit.mul(x4, value) # (x4 * value) def ark(t, C, r, state): """Applies the Ark step of the Poseidon hash.""" return [circuit.add(state[i], C[i + r]) for i in range(t)] def iterated_add(terms): """Performs iterative addition since circuit.add can only take two parameters.""" result = terms[0] for term in terms[1:]: result = circuit.add(result, term) return result def iterated_mul(terms): """Performs iterative multiplication since circuit.mul can only take two parameters.""" result = terms[0] for term in terms[1:]: result = circuit.mul(result, term) return result def mix(t, M, state): """Applies the Mix step of the Poseidon hash.""" return [ iterated_add([circuit.mul(M[j][i], state[j]) for j in range(t)]) for i in range(t) ] def mix_last(t, M, s, state): """Applies the MixLast step of the Poseidon hash.""" return iterated_add([circuit.mul(M[j][s], state[j]) for j in range(t)]) def mix_s(t, S, r, state): """Applies the MixS step of the Poseidon hash.""" result = [ iterated_add([circuit.mul(S[(t * 2 - 1) * r + i], state[i]) for i in range(t)]) ] result.extend( circuit.add(state[i], circuit.mul(state[0], S[(t * 2 - 1) * r + t + i - 1])) for i in range(1, t) ) return result def poseidon_hash( x: ModuloCircuitElement, y: ModuloCircuitElement ) -> ModuloCircuitElement: """Computes the Poseidon hash for two inputs x and y.""" if isinstance(x, int): x = circuit.write_element(x) if isinstance(y, int): y = circuit.write_element(y) if not isinstance(x, ModuloCircuitElement) or not isinstance( y, ModuloCircuitElement ): raise ValueError("x and y must be ModuloCircuitElement instances") t = 3 # 2 inputs + 1 state n_rounds_f = 8 # Full rounds n_rounds_p = 57 # Partial rounds state = [circuit.set_or_get_constant(0), x, y] # Example constants (these should match the specific Poseidon implementation) POSEIDON_C = [ 0xEE9A592BA9A9518D05986D656F40C2114C4993C11BB29938D21D47304CD8E6E, 0xF1445235F2148C5986587169FC1BCD887B08D4D00868DF5696FFF40956E864, 0x8DFF3487E8AC99E1F29A058D0FA80B930C728730B7AB36CE879F3890ECF73F5, 0x84D520E4E5BB469E1F9075CB7C490EFA59565EEDAE2D00CA8EF88CEEA2B0197, 0x2D15D982D99577FA33DA56722416FD734B3E667A2F9F15D8EB3E767AE0FD811E, 0xED2538844ABA161CF1578A43CF0364E91601F6536A5996D0EFBE65632C41B6D, 0x2600C27D879FBCA186E739E6363C71CF804C877D829B735DCC3E3AF02955E60A, 0x28F8BD44A583CBAA475BD15396430E7CCB99A5517440DFD970058558282BF2C5, 0x9CD7D4C380DC5488781AAD012E7EAEF1ED314D7F697A5572D030C55DF153221, 0x11BB6EE1291AABB206120ECAACE460D24B6713FEBE82234951E2BEE7D0F855F5, 0x2D74E8FA0637D9853310F3C0E3FAE1D06F171580F5B8FD05349CADEECFCEB230, 0x2735E4EC9D39BDFFAC9BEF31BACBA338B1A09559A511A18BE4B4D316ED889033, 0xF03C1E9E0895DB1A5DA6312FAA78E971106C33F826E08DCF617E24213132DFD, 0x17094CD297BF827CAF92920205B719C18741090B8F777811848A7E9EAD6778C4, 0xDB8F419C21F92461FC2B3219465798348DF90D4178042C81BA7D4B4D559E2B8, 0x243443613F64FFA417427ED5933FCFBC66809DB60B9CA1724A22709CECEEECE2, 0x22AF49FBFD5D7E9FCD256C25C07D3DD8ECBBAE6DEECD03AA04BB191FADA75411, 0x14FBD37FA8AD6E4E0C78A20D93C7230C4677F797B4327323F7F7C097C19420E0, 0x15A9298BBB882534D4B2C9FBC6E4EF4189420C4EB3F3E1EA22FAA7E18B5AE625, 0x2F7DE75F23DDAAA5221323EBCEB2F2AC83EEF92E854E75434C2F1D90562232BC, 0x36A4432A868283B78A315E84C4AE5AECA216F2FF9E9B2E623584F7479CD5C27, 0x2180D7786A8CF810E277218AB14A11E5E39F3C962F11E860AE1C5682C797DE5C, 0xA268EF870736EEBD0CB55BE640D73EE3778990484CC03CE53572377EEFFF8E4, 0x1EEFEFE11C0BE4664F2999031F15994829E982E8C90E09069DF9BAE16809A5B2, 0x27E87F033BD1E0A89CA596E8CB77FE3A4B8FB93D9A1129946571A3C3CF244C52, 0x1498A3E6599FE243321F57D6C5435889979C4F9D2A3E184D21451809178EE39, 0x27C0A41F4CB9FE67E9DD4D7CE33707F74D5D6BCC235BEF108DEA1BBEBDE507AA, 0x1F75230908B141B46637238B120FC770F4F4AE825D5004C16A7C91FE1DAE280F, 0x25F99A9198E923167BBA831B15FFFD2D7B97B3A089808D4EB1F0A085BEE21656, 0x101BC318E9EA5920D0F6ACDC2BB526593D3D56EC8ED14C67622974228BA900C6, 0x1A175607067D517397C1334ECB019754EBC0C852A3CF091EC1CCC43207A83C76, 0xF02F0E6D25F9EA3DEB245F3E8C381EE6B2EB380BA4AF5C1C4D89770155DF37B, 0x151D757ACC8237AF08D8A6677203EC9692565DE456AE789FF358B3163B393BC9, 0x256CD9577CEA143049E0A1FE0068DD20084980EE5B757890A79D13A3A624FAD4, 0x513ABAFF6195EA48833B13DA50E0884476682C3FBDD195497B8AE86E1937C61, 0x1D9570DC70A205F36F610251EE6E2E8039246E84E4AC448386D19DBAC4E4A655, 0x18F1A5194755B8C5D5D7F1BF8AAA6F56EFFB012DD784CF5E044EEC50B29FC9D4, 0x266B53B615EF73AC866512C091E4A4F2FA4BB0AF966EF420D88163238EEBBCA8, 0x2D63234C9207438AA42B8DE27644C02268304DFEB8C89A1A3F4FD6E8344AE0F7, 0x2AB30FBE51EE49BC7B3ADDE219A6F0B5FBB976205EF8DF7E0021DAEE6F55C693, 0x1AEE6D4B3EBE9366DCB9CCE48969D4DF1DC42ABCD528B270068D9207FA6A45C9, 0x1891AEAB71E34B895A79452E5864AE1D11F57646C60BB34AA211D123F6095219, 0x24492B5F95C0B0876437E94B4101C69118E16B2657771BD3A7CAAB01C818AA4B, 0x1752161B3350F7E1B3B2C8663A0D642964628213D66C10AB2FDDF71BCFDE68F, 0xAB676935722E2F67CFB84938E614C6C2F445B8D148DE54368CFB8F90A00F3A7, 0xB0F72472B9A2F5F45BC730117ED9AE5683FC2E6E227E3D4FE0DA1F7AA348189, 0x16AA6F9273ACD5631C201D1A52FC4F8ACAF2B2152C3AE6DF13A78A513EDCD369, 0x2F60B987E63614EB13C324C1D8716EB0BF62D9B155D23281A45C08D52435CD60, 0x18D24AE01DDE92FD7606BB7884554E9DF1CB89B042F508FD9DB76B7CC1B21212, 0x4FC3BF76FE31E2F8D776373130DF79D18C3185FDF1593960715D4724CFFA586, 0xD18F6B53FC69546CFDD670B41732BDF6DEE9E06B21260C6B5D26270468DBF82, 0xBA4231A918F13ACEC11FBAFA17C5223F1F70B4CDB045036FA5D7045BD10E24, 0x7B458B2E00CD7C6100985301663E7EC33C826DA0635FF1EBEDD0DD86120B4C8, 0x1C35C2D96DB90F4F6058E76F15A0C8286BBA24E2ED40B16CEC39E9FD7BAA5799, 0x1D12BEA3D8C32A5D766568F03DD1ECDB0A4F589ABBEF96945E0DDE688E292050, 0xD953E20022003270525F9A73526E9889C995BB62FDEA94313DB405A61300286, 0x29F053EC388795D786A40BEC4C875047F06FF0B610B4040A760E33506D2671E1, 0x4188E33735F46B14A4952A98463BC12E264D5F446E0C3F64B9679CAAAE44FC2, 0x149EC28846D4F438A84F1D0529431BB9E996A408B7E97EB3BF1735CDBE96F68F, 0xDE20FAE0AF5188BCA24B5F63630BAD47AEAFD98E651922D148CCE1C5FDDDEE8, 0x12D650E8F790B1253EA94350E722AD2F7D836C234B8660EDF449FBA6984C6709, 0x22AB53AA39F34AD30EA96717BA7446AAFDADBC1A8ABE28D78340DFC4BABB8F6C, 0x26503E8D4849BDF5450DABEA7907BC3DE0DE109871DD776904A129DB9149166C, 0x1D5E7A0E2965DFFA00F5454F5003C5C8EC34B23D897E7FC4C8064035B0D33850, 0xEE3D8DAA098BEE012D96B7EC48448C6BC9A6AEFA544615B9CB3C7BBD07104CB, 0x1BF282082A04979955D30754CD4D9056FA9EF7A7175703D91DC232B5F98EAD00, 0x7AE1344ABFC6C2CE3E951BC316BEE49971645F16B693733A0272173EE9AD461, 0x217E3A247827C376EC21B131D511D7DBDC98A36B7A47D97A5C8E89762EE80488, 0x215FFE584B0EB067A003D438E2FBE28BABE1E50EFC2894117509B616ADDC30EE, 0x1E770FC8ECBFDC8692DCEDC597C4CA0FBEC19B84E33DA57412A92D1D3CE3EC20, 0x2F6243CDA919BF4C9F1E3A8A6D66A05742914FC19338B3C0E50E828F69FF6D1F, 0x246EFDDC3117ECD39595D0046F44AB303A195D0E9CC89345D3C03FF87A11B693, 0x53E8D9B3EA5B8ED4FE006F139CBC4E0168B1C89A918DFBE602BC62CEC6ADF1, 0x1B894A2F45CB96647D910F6A710D38B7EB4F261BEEFFF135AEC04C1ABE59427B, 0xAEB1554E266693D8212652479107D5FDC077ABF88651F5A42553D54EC242CC0, 0x16A735F6F7209D24E6888680D1781C7F04BA7D71BD4B7D0E11FAF9DA8D9CA28E, 0x487B8B7FAB5FC8FD7C13B4DF0543CD260E4BCBB615B19374FF549DCF073D41B, 0x1E75B9D2C2006307124BEA26B0772493CFB5D512068C3AD677FDF51C92388793, 0x5120E3D0E28003C253B46D5FF77D272AE46FA1E239D1C6C961DCB02DA3B388F, 0xDA5FEB534576492B822E8763240119AC0900A053B171823F890F5FD55D78372, 0x2E211B39A023031A22ACC1A1F5F3BB6D8C2666A6379D9D2C40CC8F78B7BD9ABE, ] POSEIDON_M = [ [ 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2969F27EED31A480B9C36C764379DBCA2CC8FDD1415C3DDED62940BCDE0BD771, 0x143021EC686A3F330D5F9E654638065CE6CD79E28C5B3753326244EE65A1B1A7, ], [ 0x16ED41E13BB9C0C66AE119424FDDBCBC9314DC9FDBDEEA55D6C64543DC4903E0, 0x2E2419F9EC02EC394C9871C832963DC1B89D743C8C7B964029B2311687B1FE23, 0x176CC029695AD02582A70EFF08A6FD99D057E12E58E7D7B6B16CDFABC8EE2911, ], [ 0x2B90BBA00FCA0589F617E7DCBFE82E0DF706AB640CEB247B791A93B74E36736D, 0x101071F0032379B697315876690F053D148D4E109F5FB065C8AACC55A0F89BFA, 0x19A3FC0A56702BF417BA7FEE3802593FA644470307043F7773279CD71D25D5E0, ], ] POSEIDON_P = [ [ 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x1E6F20A11D1E31E43F83DCEDDDB9A0236203F5F24AE72C925A8A79A66831F51D, 0x1BD8C528472E57BDC722A141F8785694484F426725403AE24084E3027E782467, ], [ 0x16ED41E13BB9C0C66AE119424FDDBCBC9314DC9FDBDEEA55D6C64543DC4903E0, 0x2D51BA82C8073C6D6BACF1AD5E56655B7143625B0A9E9C3190527A1A5F05079A, 0x1B07D6D51E6F7E97E0AB10FC2E51EA83CE0611F940FF0731B5F927FE8D6A77C9, ], [ 0x2B90BBA00FCA0589F617E7DCBFE82E0DF706AB640CEB247B791A93B74E36736D, 0x11E12A40D262AE88E8376F62D19EDF43093CDEF1CCF34D985A3E53F0BC5765A0, 0x221C170E4D02A2479C6F3E47B5FF55781574F980D89038308A3EF37CCE8463BD, ], ] POSEIDON_S = [ 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x3F0815AB463F1B76EE25A9B8768B3231A89752F427F4F063AB718E707576B31, 0x15648BF46F60D82954C7E33029B3617357012A3D3B1D34C8E008859F1DBFB317, 0x127E00C2253DE07818CA7F2EAFDD7564D05EA850CF61F1DAA0CFEFBF7FBFBA85, 0x66365AFD18A41EF9382FC0B1D265CB4D3CE470A8CBBB878F7D48051630747BD, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x219D14F823513140DC69A96F7FE7E086F4FA24C84E57DCF2B099715C4404AAE7, 0x3A30BFBBF2CB86D4A6A63A8050D91F9F14F4D33696D37EBAEFA9AC2302132D5, 0x2121BBCDEAA33A35B0270FB7D5C9F94EDAD5A84D74B06E3385104B0B41935BCC, 0x196B544FBEB0A792CFBB82C289E579B7CD5580C2E338A389D053EF8B3D10E70E, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2809C3A1547C0CEE89C1DB270EF479C26973EC73EDB4BD4E7D907EA0202F560F, 0x11C34446B083EF92CA157585A02B8B342A4C67175B31F4B5D40D4E96DFC5C8F1, 0x253EA0B33A8BF3B2367C030E3289CBE0F6242AD7709D90B86D9D8026E2E39925, 0x30467DC1930F6AFE90C89D4007AD29FC4F5A19C006D1030438C16DF85637BD5F, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2F9D4B55495F7E377E20E6F5A3A88AF7AA6A536458B38BBE13C8EBFBBBA54F44, 0x1D9E9D5C736E3151F11D36D499E7E093D8EE2353BE18AAD54CFD03FF0FEAC4B8, 0x124B617B43E598F9EBF622F7823A3DE7D1BFEDB87E097C315F343DE301E54841, 0x198E7CFC66AE45774055CF073BEDC945A5F9C5B19CAE08D789CC5748FFE199B2, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2EAC25B3498DFADFFD124AB3AAD57789EB945BA57443099C5BB6C27ED977FE24, 0x1EE02C175CDFE1871B378305C1BB9C904E8AF1D4454ED3550B3C6AB5F4F90126, 0x616F8C34C607266B29EA8F9D2DFA47FF6FBB1D9745C48609FA98301D0F679D5, 0x181D68B0A188504958B9F19CBBDB972A853E51ED385E4883A43A42832803370B, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2D5397CE863464A25D6B7F5B015D579181D1CE2F24CBABF6059E9327F5BA7004, 0x15BF817491B94D71E8912940CC0B80277713E7D32DA2B6591724D8DBD4BC2618, 0x2A7CBD11460B177AB76FEAB28B69485AC8CC687740BC910994A3827D29C08714, 0xF7CD5FFA4661730AB56E447FAE5CC1763CB462DA80A85614C237B290DE9D502, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0xE0766004B4C4176EB13273508EB6575F768137D86D305BE644CE04531008100, 0x625FA7145813481F6D148BE6B9C8BB7B54EE3C1AFAC00104E1F763000B9924C, 0x7C5472508B459916EE0F5461AAD2E0B19CD9C7B184F515B65136318CE2C6A5, 0x567375470D189B693AC77AB3FB7557231D53073951D43C54685879CB7A89FCB, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x1D0406BCBEC83F8D5165F56C063E42108AD21F51EA4BFC71601174BA5C7B8BCC, 0xC02B18EEF22332D280A8AA1F86405F3375F06342F8696EE7C73B46C63272CB7, 0x17C1FC174CD9A6EBEAA7ADD2F801A664823509AD4FD1B15AAD053A55AD6DA4CF, 0x5F843C23024EB1DAB7EBBC86709A021AAA6CAF433F7ED258A08638E9584B32D, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x22DF2420697CA28B5CC51C53165E002727B45CCD90A55C87589F792F0AD8CB37, 0x2F1438303A7B49D473400AAEDF0F48009FD3AF804B76BE86417588EFC4D7302A, 0x2323D5FCF2DA8965C6B2B7B4FBF9A24BBAA7F4DCCD35D5CA6155C5463093B23B, 0x26C85B9DFBBE48FE83B753A5E7336B9F40F7B961E9C54F94E37700073D4D26E, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x31511000251EC86FEB38B5AB4E335F070B271DF4C20979528E41D65384C318F, 0x18E588324A9BBAACB42FA69E5D90A0C0E27CD16B941E34A60FF5DF9A26C03AF1, 0x2642B5D8E16B953B070635775C8D3C9498357D6AD9BEF2E7D99F03C10EA1F95F, 0x21FC313BA11C60E8E84FF60DB906A0F031189B0B48335C4221F909AEF836C133, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2D3562E3D4B42BC6890B698CC6AB89F7311298BCBAC6E4E9F2F4D93D06DAE151, 0xA74EF541D360E842E3E0B6FF7E5C7C77934A5F67616F01C189D886DFD2E0808, 0x140564B53E0A812AC3983D6E3B433AFA43F434087D9E754967C2C9B1B02CAF8A, 0x14709E32D98AE4CD18B400181E71AB9759C436C8E83FA6993ADB6F2DB6BBA9D0, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x734B2366C59E394423F179E1266DD392372DB4F2DBA651F4A619A4B52BDC010, 0x11FB2D705C94B08D5AD3E3C5FB6629ABE963ED92913642C7D02D7E71088FD2D4, 0x27D03ABF5C1F290E5D715EBA19371050EF6EB7F78FD84BE834E4CC3618059484, 0x13ED9E9E6B452DF27FB3353CFC2CD63EBE817F212A39C6A8BB9B441AC1395861, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x1319C51CF37AAA10246CDAAA04A12E88795DE4452604263A7C5B79AB99CBD23C, 0xBCA25588D187B7F9DAD839F2C8CB526A4CF444EEBBD0E715B6CEA019AC3F2, 0x1D837EA0341C5964181226874B923CD01A069B493F02F7A3C01BE23CF51D593F, 0x1B41CE9ED3634CBD42C427CE4C5C83774149E2A6DBD25F24012090DB7DE4E7F9, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x671F0E3B674AE7CDDC790ECC4E946F4BCA74B98B78A127C7B56BD6673F1CE1F, 0x19FC073797A39B272E40CD30615F55FEFEB682C1AC14143071D0449A5426E4E, 0x17BEE47D262A497FD1F7C5C6D5A7C70FA4209480BF5D97311C5096619E9FD13, 0x2073CFF92D3141B480763539CFF2978A4C7944721CC937BA00CC8527274471E3, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x3BD7B3E2C1885877F43182A55A91D48F9C58D152E730FE2C7AA46B1FA663BAA, 0x226EBC9A538B5BBAFF128EDFB9BBF5FA0CEB100719A14C8DFED9FFBBBAD9B6B7, 0xD395F0B08B9FEDE0373A06E1552C0E634A49572AF1D830DC6E394E8A5D3B21A, 0x28242439B524540A30D49B68E19E31BA5284BD3BCF1E0F2F41F77D5331F99FFA, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x370D6FA19EAAC142D2DE034801AB85E0B457E129E91F929754B48C6154D4DF6, 0x9A16F573B3280F390762ABF269579EAA37939BC0C753FEB0A2B2E0BCBDE1659, 0x2228E360FB5B162B496AC443F98127EE3C0021A690B71B268D99981368231D97, 0x7E42C2CA633D2C49FABF83991476D209431E34D8032B6A1B97675F3C567F944, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2CE12D7269663770C3CAB85A6215A32EED35FDA1D8E9D753A50FE96097724A9F, 0x3D7427704C61E2009EEB9B1B45A0125084BC4DAF70973A7BA0B2231815B15DE, 0x10F8ABF0764185861C1267FCF4B4B33CA096FB4DDC4626732D86921E553E69C6, 0x17CCAF6F26F7267A025D7CB456E3AEB251A1A620AAF6568A5C95644C7C5914CC, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x63BB306B96310051385C3CE00CA820AD0E3651A6E55754D59DE6DF28CEA4D51, 0x1F761EE5553C5E86F2C304A18095AB7403242E0B65E608BC920CF993A4169974, 0xDC5F00BBFD7C1D9A23C0E666859BA6564BCDE8761B45717CD6BDFC09DE4E8F2, 0x6DE511520E277B7DF07C3536381C13EB44CF790A230ABC391089760BFC40EF2, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2A134348C8660EFCF9EF54863E70528A1FD4481B50A1FE21F24A8C06E10CCA03, 0xAEB5023BBB9A64C4BD80089E99EDF8ED5F6F1FFB63A7DBBA1B33520BCFCE37B, 0x141A6D0810366AE225ECB5F0BFDC9995406C5960AB26155836FC51FB7CB933D1, 0x9D2EA05EF54DADBBE776F404DCA6626CC0B2539990BC0B8BFE87497F1E2C5B7, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x1E56D244A8E41BE5D104D5F8EF70891D22D4A5432441BFE8FF1A16E91719CDDE, 0x1D4F020C57C4F14AEC908B2F99B5C4FD5E09447FA85C2FD68BA4D5C5F50C7B49, 0x763911A3A92A4F0E09F4E14CD03398D8D82A1E09DB80FB0EE1E833764C18FD3, 0x12857275BE2FE6B9BA2EC68F9061643F1FC5D9A2C5E47E55684366E54B302946, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2ED11CCD2E2E2376655FFE9A96C4B81ADC0A60353C5D83D4D0EBF50D1BBF87C0, 0x3E31DE8958E82645B320D5E3E966EF4726D5B1C2CFBB4ACD288A21543C6D594, 0x11E880DFEFDBD08858AE890046533D58DA28A608D7E905366EC2CA4A36E71963, 0x1835B275DEAED2D00704A9C3CC21AB7A44A34662978D53C190DC25E969A507B2, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x68B75315E25ED4ACE5A4A9480E1D82CE5D44F76F1324240419F372FF8D3C3F5, 0x1B7EF7D04AEC73D62B052D2AD12B92A4268FCCD795C839D698AD3B22823274D1, 0x28C0C848022A90606F6193FF5501B57216B670727F4B8EFCC240D30BBAA9F03F, 0x13BDA49296CBCC51686A7BFB1C39F3F254370985A16660EFD6E5D82D4F068E1B, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2E7987EA8204389D11EB10B34265E378A945729F86C3E0E2FD38490D3A594141, 0x826D4A2324AD3AA4B2B45C10A190FEDEF702AEFFDA3226CE5415FFFD03935C8, 0x2DBEEE85EAEAA9FA3675EF541C9DF7BB964A85435C3B59685F93B434036DED, 0x227EE7A945EDAEE6919418ECB3279B11E6FA44F5F5C5ABFB966A4BE599CB86C7, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x1D0A6D1A9519877805AC90D696FAF2A5FFADC23986DE8C698D541471C7244220, 0x2208AABA508AE816DA4F333B7854FBBCD10EEA1DB284EC3E9F4DE02B25F6E9D4, 0x28A58901035B2C99E36A7D29B587A215C9E59268E2F8E01A175720971CCF04EC, 0x112F6D8D42B0A0D123A07865CA1376DF317A2A14FFC0191226F38A8ADFD6238, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x8C6EB19C016D1833174DDA182D266D5C727F97FB4D01F1DAF906B6D3C6E2308, 0x1359D2D6C8B5A116D0B38B95F9C642DF75B1BE9A48C8698ECFEA9103F73F1879, 0x10C5052EC67AB9B6A467C1CC1878D91AAA07AACF7725F8A5ED42B699C4AF3CA7, 0x583C4D292D54F3CDB708803E6338FC6AFDB188D5D4E9F060193823684C96C75, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2D94A1C55BE382151A4054C5B96322E7BCD1FE2B3E076E16EE2C18BFC06F57B4, 0x15E3402FDDE8770FB997369579C1B1703EF77C671927EAD80DBC64DD2211C3EC, 0x185BE98784817F22F7B21E6B867D5A71B5000BEF8BB902EB302677E20A727BE3, 0x18DB4321C721C03666ED8927C89890AA8AAD1B00C054547B5CA14CD94DE467B6, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2A852B6247F5D61F0C390B3F3D799188528849BCD2CD0AFF4EB2134A039B5126, 0x2510AEED51B7F506E65FB9A18EE0124AA5276F6DE1CD771B165930204DA58F22, 0xF2074A32EB8260FB5BD3A236F03A47B47B7FB54DCAD1D7977D6486513BAB5F2, 0x2F4C69297866BD45A8270E19941926CEC3531C9E12C4C2C84971404BFA044090, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x154668727D2DBADF05D083A65093C0D0E92DF5FD5F3FD75E9B792C562A37473F, 0x1E6FFC5D6A1FF5DC4FD77FC5AB5C8C4E8D3E2E375BCD1194A91E5B0F7B13CADF, 0x2CF1A1D7C44309109D75ACBC9395CB8398C8B2D428538571FAFA389DA29990C6, 0x140FB39A89F26F6D87CF76CD5CE8DA47AA5D8A023E24CF016ECF64CF793C9880, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x1289D13D58A17B5BF0712B201FB3CDDFCE2C16DAC159990B8298A93A8589F9E8, 0xF45CF974D2C9EDB5781E8D3D207ADC8370CF56BC5218749610920FE98B2DB2E, 0x11909C81A16518046B79EDFD24F5ABCC585A81D1B333568B8687A1C9ECEB44D4, 0x2990B23C81882F7709F3B891A0E3DA4D6917672F2D5A1041FD7BBD6792330D16, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x609551B14716CA3CD5560E0821E7285E0A083EA9A16DC102ECF461E4AEF7277, 0xC8C1ABDFAB99D03FD93DCED2467354B6175DE1755F4F93DC0880EAA08D03F77, 0x138BD098C4923B9FBD02F33F8BEC6C730DB3FED298EC09F78A7A55D08F2E0B10, 0x2E61E4BC021630114673F0F77161AE55DCD0B45CE07D9AE3F21BB5A3190F14C0, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x124860913E3DF8F65A9C4060CE3297C626ABD1C22401C905DDB408260D8E910, 0x13807F89C394A133EC104804D955CBE125F24C5701D98286C6AC8B7ED052EC8, 0x2E88D1A6938F0788132AA9EEAEC08D2F59AA444050C8F4C4E85578ABB0FC2FE5, 0x1F3D24F17CFC6050A0CBF64E1F1787E2257BE3C3BA607C2E8FCC1F26ABF3104, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x1FE1CB0E2AE169F83B9D4F133D41FB5B3FE6C76A82A916BFD9B62F82F0F8D0BF, 0xEF79351229409CD353329221229827E19946F3D8D1C48BF5E3377F9177071F3, 0x18FB2E46FC1B90FE1C4893EF77A9D111507551883127860E89088608373BEDA9, 0x77AFE2579F42EC14C32EF0761E23A3CC0AD6263A68C5CB61916BD57120D1868, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x79769092DAA5A752642C04CCF8A6EA54E2AC9836FDD65D248B186F1490B7B99, 0x1D8BF229C19968F0254EB6E09C5C8BFD67EB9734606B676B663C76CF76BAB4A5, 0x2A33B7D855E7FE55F93556E49E4B37737664F14236F17256428F29F6EC1BDDAD, 0x25B0331D7E2B15AF4EC161C86E84BA6AB2056077E7AA7536340DC3187CCCA8B2, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x762098F5FE26598CCBF45E4810211B0FFCF8CCBB92C16E2F4F13F22342474E2, 0xE234D720D70B2886D0DA4C007B1BDA42362E144185C70716DECE2B6172C2514, 0x1D82BEDCCD2BC8A06E3742E720B7FEC2EA72182F11C0C60D135C811152AA4B60, 0x480064D4B3EB0ADA5E9A3E7D05930B7C3397FD6B94D481314BD1C690A17C979, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x10A892763B3CCA9EF7593FBB1140EDC8C8E4580568560CF41867F7464FB0C11A, 0xB5EC64548EA841AC921F9B2553680785978B315667AE4714DDE4CD7F4DE8B91, 0x10554ACA4E348E5949761BD7131DFAEBD78010EDD030E1A9CE3C65C9DB931D46, 0x15BE66F38D86B0998B93655462B1F475B9BE9DE306E150D4AC648FAB3DB0CFF6, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x176AD3600FD3491182D182957FFAD01BF6C26E9D4AB0C23CAAF308E427D3DBE8, 0x2B6F355B3DBF65F09335001D705AC125E3BEB20F4FC11BD3CE82B5CF0AF2E6F2, 0x1C85C06A6D5D40D81D7C89EDEFB32D1A8448C51288FA296B6DE9FF788C77451, 0x20E1E876C4746A0CBD9A51D76B2E25F82361C389E43F7D1F51A70AAAC2460D79, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x20E46219F684186D2A024B637BC35A29EE3B08CE737701392D987DDA9217FA08, 0x2EA7279DB9F2AA0F654E987907277C24480766367A8BD90E28BE0F2ED6091367, 0x136BE2A7F18924C9362096D472BC75CA0969DC077C9171B1641BE95091780F74, 0x1CA2033501BAA3F73067C4300FB0F51119ED5736FBC8F1F6C924BAF0DF5A0E9E, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0xA82F199C2505277ECAA75E495F34E3525824F7A4A9D9FA1DA810832B48A50C7, 0xECF10485307B4BAE92FEFB0D7F7782A9F37A2722E7ED9EB7925A2DEA580B7D5, 0x7B642138DFD6A6DD12AA22F08A8296D68615C8478F13AF16AEBBBB339A3936B, 0x1D9DDA43A25593FFD2256D34921FB86ED70E760BA76D61E9CBC3B6DD0F1A2150, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2F1AF228520C8B751DC91136C91C6BCCD5367EB08213D392958CE2FD3D7D2FCE, 0x1FECFE833AD540455C6D6C1AB3DE4ABAE61ADA625A1A2B6B18551A45A6CDE123, 0x18FC8E608C735B2B3B0D7583460227575657FF8A77ABE637BDD3AD28E4A23C88, 0x28F740BC1182E9706EBF03CB3F53ABA8A43CE0B618783A5586388A7547FAA815, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x47998CC0AF5A26B94AD301E4B998D29E960A4851CFD13822BED35B7146966A4, 0x1B5F1525B31DB911DDA43E415E1B9A3A9725C7B52E880EE130A14A692B777B70, 0x275A83FA5D19B4535F65E965A90EAC9BF770AE9BD1D7B1AF945FA57ED5C8DE6E, 0x2E8789257ED2CBCCCB430568E49BC9DC2A563359808C9897CE3E40A6F6A27AA8, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x927F46CFE80FEEFEB2721A4C09E9D17F60C34500DCD6E41E2925A39C8E2C7C1, 0x1F868AE04832A5DBC37619BFE6AB6A97FD8FB2CFBC1ECF9E0E484BBFE7698101, 0x9D7A11E27D2F53109B73F745B2DEFED65D94BA80F308FB19CE6D56C9B45EFF4, 0x282D857CFE8DA3B5104E1C2823FB7C5B9A7B25924FDA5995B0C351AA2B879DFF, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x20BA8A9FCEC815B13F349FF830AE663B27576E135C0744F6987FB0F6FF49C217, 0x11B6AFC91E32F1CA4589FBA12E657D226D57B471DDD2AB1B66A8AE4DCBFB136E, 0x2E666402AC9CC588316E335C7D93DB344788EEC2C72DDF3F908141736CEBC3BE, 0x17522E0E9E64F795A202A110E283FAAD7057AEC5C9ED9A1A74920F2794F18595, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2D2ED17F7A1F3EE9E20B470CAD4CC7319E6ADB40E2FF24B7878CB9878EDBD3B9, 0x1A81EFB19D7E1EDAA96FA276E89E85D08F75E54A8136F4D73C937DA16C7BF9F4, 0x27FF57C1CA847E57210A7B44E52E5630F299C5F451C7A0D515A16BB3BD33E237, 0x1C1A8E22230ABCD13C5BE96031BFA167840D117B3C6A5A0A11BE26A7F5FB1A94, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2A1C3F15D4927C843627A9CD533E4250D81E7774D2C32B59D5836F9C19A5657, 0x2DDBB7239EB904D81C52499B37CB4BE1AF0373A10AC112E185ACB219899357E4, 0xDFF198393085A754E0D6FAEC54BE81D8EDF8BC25EDADAB48A86FAD6DA0AFB60, 0x10D50C2473146BBC76275FCC589D038DEC8DB28728789F28B6D5F504BD1645CA, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x61E8328FB5593F92A53DFD40E1022E6231BA45948506282536B08B4476C1538, 0x1B589243847198DED90B644BEE31AC58067DEBF3F07D3C51CFA5A0DD9F6D9784, 0x4B00C0DA1F851E59863B053BD4C6087190F0BDCCED99D5CE6F67A420A3BD1F7, 0x239941A46C2B93D9126A70163009A7AC27F8A8D42E35018B3BEC8CDCB5DDFD67, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x204F26CA7993B03AC2C35377CB0A3712BFC9BC3EC0BFECB4E87EF6814ACF2EA2, 0x85AFF9C7FDADBA039D832D8BE165A1E5747CF7308D515E348EF117E926D721C, 0x249042A8DC111F27C4AE9DB044C0B0B3F10E57D05E093158EFD375DF00EA2068, 0x6E799BCDF2B4A74542854F3029803E2F84550665203327B3E0825977413E96B, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x1CB3CAED4BFFB6ACA9F4D2C002921BC3FFFED333CAE12085C612496183B87996, 0xB47E9755FAE480128A128BFD4FAA6A3DD6EA03CAB566889DCD99E84D310D51C, 0xC7E4CEA365C2061920A0C9FD2C360A6506293BC024FD1CA3F0BB730DA886A4F, 0x21DA1F701BAC77BCBBAA30D964D6F6F63DBE1B20D9D6988C8DCD7BA4187215DF, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x9AE612E8BA1CA1370905FB67899D10DB86B47BD19965B6EDD1A9486E3C6CC55, 0x262E1E0B56CAC47FC150F284491190E6AAB75445B0C99373FE1F7A0E3B95CF3D, 0x234BF4A7DCE7587C2C87C293E3BB7C9E2A7BFA5F29FD4DDEAA5D3F67491D34BD, 0x2F6CBAC694C886B02D0A527CAC744FB658D2690E213D7432EEE67F6CB69F70C2, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x22ACCB18B7C49B4B7BB8C9FDF78B7ADED52AA1842FFF818D9A3300876DEC3AD9, 0x81E2F0652F898C6D659F22D2C77BE302EABD9182A0B3D3CBF623A1DF7F8F2FC, 0x12C0A25E70D006ECCEA3ADA75D669B8C534B962890F3FFC016B3186AD675B935, 0x10EF9C23848128CC2FD6FC869DF24D7AB56EFD349EDD56F49F8D4F2381DF3259, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x2161CD280772819DD4A81262B71DF1BCC2C1D41B9491E0620BDA347962B240F0, 0x2CEBB0AE5108318EB406590041B5248292533364F799BC41B7F4FDD12CB8D38A, 0x2B2092F86B5979A7FE4F7C22D9561F3BF2852283A656880FB759E08709A0A62F, 0x1566B3402D774B8C08146188425A442450CFC900CF643E7382B2D8507A065FED, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x11A316AA31607F268FB4C56D6C57BA01627C3635FCCF8D3D1A163E601D1A0173, 0xDE7EE069C934256B782648B560E595408A5E8434644609152E353D9C2874E44, 0x2D36F4029245704CC84DF0297708C5E5845C36AE706C72E67128B8949EAB1AF, 0x1B8CC326B5EE160F53198C217FB34E899BDE46CD82DABDC284D7951D546F858, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x27625DA0F73EA07110689FB2187B71694CBF9203FD4DDF8A96ECE85407550EBB, 0x1CD8338A3E5B1AD7CDC0DA581A6950F6DEA349C3EDDA06CB99BA025B94E4790D, 0x5EA02D65B209F6DA763856C94B6438C78A8AED8D3E67E877A10A84072741A56, 0x9F7CB68D4E388F85366CFCF284A895D8B6250CED627E810817743CE03330A55, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x18C6230DDC0F896827B043F5E58DBD1AEC13995A202E4EBCDFEB969E9D5C1212, 0x73A6114B997285E1A91C0A0FDCCDAA8452E4F07BFD2E1A10578232096DB6DCD, 0x2E78746340B2A6D222C6A1FC0838ADF5FE013F39B1660CE7A3E7742B2F37BE7F, 0x7AA27E7150BADDD06303AD8E5E4BF4249B7EA846553DEF28E675259D3E5C851, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0xB66FDEC210EA4EABF623D2712CF4D9FA90273CCB4643F680CBC98345715EAD8, 0x2FB6A29D9F394A589B633B8A4D6BE51C9C0601CE0B140BE641ACEA41C49AA5E3, 0x29025CC66FD041C4FC845E9C1C2CD1288569FB243D049BD675A69DC889B2CE2A, 0x150963F0ACA9BCBE4126214AB9C627A6F7ED731CFA695168B85D534B17BE3F48, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0xED59780302257663F72C1BFC6656EB7B5BCA2E47BEC0D5798A08A32A61A8A65, 0x7E19CB8A893369B3D30AE188C767F391C11888A3000DEBFC8D30C06143CC084, 0x600C7D2B6946345E5F1EEEAFB5EB8EC2B6ECFE528D2C052CD860AFB4A3AA272, 0x596083B6C972BC13022A1F33D6523B4773F2CD0A480E19EA0125119F0385705, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0x210B5C36F27A07D97F98B9D8663D85DB2E64513099A8E1EF6DB21043631E24C4, 0x13BB2764BF1475CFC7BB9F3D563C5CC201C2489874E9159326A8F4930B7883F9, 0x202CF557D625C26080EB082862A76757287872B181E89997219E4B7576E24D30, 0xE561C3F8BD4F76E76D49E97142D220601FBC5A03D905A4728EA1F95FD8824B2, 0x109B7F411BA0E4C9B2B70CAF5C36A7B194BE7C11AD24378BFEDB68592BA8118B, 0xDE20097480E7555471785DE07BD9809D57DD859BBE827307C33AE9ED7890597, 0x72F2A6287FB984BB810DF8C5788EEBCFD2825613CB72BB80CDE8EDD76D2E97D, 0x2969F27EED31A480B9C36C764379DBCA2CC8FDD1415C3DDED62940BCDE0BD771, 0x143021EC686A3F330D5F9E654638065CE6CD79E28C5B3753326244EE65A1B1A7, ] POSEIDON_C = [circuit.set_or_get_constant(x) for x in POSEIDON_C] POSEIDON_M = [[circuit.set_or_get_constant(y) for y in x] for x in POSEIDON_M] POSEIDON_P = [[circuit.set_or_get_constant(y) for y in x] for x in POSEIDON_P] POSEIDON_S = [circuit.set_or_get_constant(x) for x in POSEIDON_S] # Initial Ark state = ark(t, POSEIDON_C, 0, state) # # First half of full rounds for r in range(n_rounds_f // 2 - 1): state = [sigma(val) for val in state] state = ark(t, POSEIDON_C, (r + 1) * t, state) state = mix(t, POSEIDON_M, state) # # Middle round state = [sigma(val) for val in state] state = ark(t, POSEIDON_C, (n_rounds_f // 2) * t, state) state = mix(t, POSEIDON_P, state) # # Partial rounds for r in range(n_rounds_p): state[0] = sigma(state[0]) state = mix_s( t, POSEIDON_S, r, [circuit.add(state[0], POSEIDON_C[(n_rounds_f // 2 + 1) * t + r])] + state[1:], ) # # Second half of full rounds for r in range(n_rounds_f // 2 - 1): state = [sigma(val) for val in state] state = ark( t, POSEIDON_C, (n_rounds_f // 2 + 1) * t + n_rounds_p + r * t, state ) state = mix(t, POSEIDON_M, state) # # Final round state = [sigma(val) for val in state] # Final MixLast return mix_last(t, POSEIDON_M, 0, state) if __name__ == "__main__": # Compute the Poseidon hash z = poseidon_hash(x, y) # Define the output of the circuit circuit.extend_struct_output(u384("z", [z])) # Compile and print the compiled circuit compiled_code, function_name = circuit.compile_circuit() print(compiled_code) ================================================ FILE: hydra/garaga/precompiled_circuits/zk_honk.py ================================================ from abc import ABC, abstractmethod from dataclasses import dataclass, fields from enum import Enum, auto import garaga.hints.io as io import garaga.modulo_circuit_structs as structs from garaga.algebra import ModuloCircuitElement from garaga.curves import CURVES, CurveID, ProofSystem from garaga.hints.keccak256 import keccak_256 from garaga.modulo_circuit import ModuloCircuit from garaga.points import G1Point, G2Point from garaga.poseidon_transcript import hades_permutation NUMBER_OF_SUBRELATIONS = 28 NUMBER_OF_ALPHAS = NUMBER_OF_SUBRELATIONS - 1 NUMBER_OF_ENTITIES = 41 BATCHED_RELATION_PARTIAL_LENGTH = 8 CONST_PROOF_SIZE_LOG_N = 28 NUMBER_UNSHIFTED = 36 NUMBER_TO_BE_SHIFTED = 5 SHIFTED_COMMITMENTS_START = 30 PAIRING_POINT_OBJECT_LENGTH = 16 MAX_LOG_N = 23 # 2^23 = 8388608 MAX_CIRCUIT_SIZE = 1 << MAX_LOG_N G1_PROOF_POINT_SHIFT = 2**136 G1_PROOF_POINT_SIZE = NUM_ELEMENTS_COMM = 2 NUM_ELEMENTS_FR = 1 G2_POINT_KZG_1 = G2Point.get_nG(CurveID.BN254, 1) G2_POINT_KZG_2 = G2Point( x=( 0x0118C4D5B837BCC2BC89B5B398B5974E9F5944073B32078B7E231FEC938883B0, 0x260E01B251F6F1C7E7FF4E580791DEE8EA51D87A358E038B4EFE30FAC09383C1, ), y=( 0x22FEBDA3C0C0632A56475B4214E5615E11E6DD3F96E6CEA2854A87D4DACC5E55, 0x04FC6369F7110FE3D25156C1BB9A72859CF2A04641F99BA4EE413C80DA6A5FE4, ), curve_id=CurveID.BN254, ) NUM_WITNESS_ENTITIES = 8 NUM_LIBRA_EVALUATIONS = 4 ZK_BATCHED_RELATION_PARTIAL_LENGTH = 9 SUBGROUP_SIZE = 256 SUBGROUP_GENERATOR = 0x07B0C561A6148404F086204A9F36FFB0617942546750F230C893619174A57A76 SUBGROUP_GENERATOR_INVERSE = ( 0x204BD3277422FAD364751AD938E2B5E6A54CF8C68712848A692C553D0329F5D6 ) LIBRA_COMMITMENTS = 3 LIBRA_EVALUATIONS = 4 LIBRA_UNIVARIATES_LENGTH = 9 @dataclass class HonkVk: name: str log_circuit_size: int public_inputs_size: int qm: G1Point qc: G1Point ql: G1Point qr: G1Point qo: G1Point q4: G1Point qLookup: G1Point qArith: G1Point qDeltaRange: G1Point qElliptic: G1Point qMemory: G1Point qNnf: G1Point qPoseidon2External: G1Point qPoseidon2Internal: G1Point s1: G1Point s2: G1Point s3: G1Point s4: G1Point id1: G1Point id2: G1Point id3: G1Point id4: G1Point t1: G1Point t2: G1Point t3: G1Point t4: G1Point lagrange_first: G1Point lagrange_last: G1Point vk_hash: int vk_bytes: bytes def __repr__(self) -> str: # Print all fields line by line : return "\n".join( f"{field.name}: {getattr(self, field.name).__repr__()}" for field in fields(self) ) @classmethod def from_bytes(cls, vk_bytes: bytes) -> "HonkVk": vk_hash = ( int.from_bytes(keccak_256(vk_bytes).digest(), "big") % CURVES[CurveID.BN254.value].n ) log_circuit_size = int.from_bytes(vk_bytes[0:32], "big") public_inputs_size = int.from_bytes(vk_bytes[32:64], "big") public_inputs_offset = int.from_bytes(vk_bytes[64:96], "big") assert ( public_inputs_offset == 1 ), f"invalid public inputs offset: {public_inputs_offset}" cursor = 96 rest = vk_bytes[cursor:] assert ( len(rest) % 32 == 0 ), f"invalid vk_bytes length: {len(vk_bytes)}. Make sure you are using the correct version of bb or that the vk is not corrupted." # print(f"circuit_size: {circuit_size}") # print(f"log_circuit_size: {log_circuit_size}") # print(f"public_inputs_size: {public_inputs_size}") # Get all fields that are G1Points from the dataclass g1_fields = [ field.name for field in fields(cls) if field.type == G1Point and field.name != "name" ] # print(f"g1_fields: {g1_fields}") # Parse all G1Points into a dictionary points = {} for field_name in g1_fields: x = int.from_bytes(vk_bytes[cursor : cursor + 32], "big") y = int.from_bytes(vk_bytes[cursor + 32 : cursor + 64], "big") points[field_name] = G1Point(x=x, y=y, curve_id=CurveID.BN254) cursor += 64 # print(f"points: {points}") # Create instance with all parsed values return cls( name="", log_circuit_size=log_circuit_size, public_inputs_size=public_inputs_size, **points, vk_hash=vk_hash, vk_bytes=vk_bytes, ) def to_cairo(self, name: str = "vk") -> str: code = f"pub const {name}: HonkVk = HonkVk {{\n" code += f"vk_hash: {self.vk_hash},\n" code += f"log_circuit_size: {self.log_circuit_size},\n" code += f"public_inputs_size: {self.public_inputs_size},\n" g1_points = [ field.name for field in fields(self) if field.type == G1Point and field.name != "name" ] for field_name in g1_points: code += f"{field_name}: {getattr(self, field_name).serialize_to_cairo(name=field_name, raw=True)},\n" code += "};" return code def to_circuit_elements(self, circuit: ModuloCircuit) -> "HonkVk": return HonkVk( name=self.name, log_circuit_size=self.log_circuit_size, public_inputs_size=self.public_inputs_size, **{ field.name: circuit.write_struct( structs.G1PointCircuit.from_G1Point( field.name, getattr(self, field.name) ) ) for field in fields(self) if field.type == G1Point and field.name != "name" }, vk_hash=self.vk_hash, vk_bytes=self.vk_bytes, ) def flatten(self) -> list[int]: lst = [] lst.append(self.circuit_size) lst.append(self.log_circuit_size) lst.append(self.public_inputs_size) lst.append(self.public_inputs_offset) for field in fields(self): if field.type == G1Point and field.name != "name": point = getattr(self, field.name) lst.extend([point.x, point.y]) return lst class Transcript(ABC): def __init__(self): self.reset() @abstractmethod def reset(self): pass @abstractmethod def update(self, data: bytes): pass @abstractmethod def digest(self) -> bytes: pass def digest_reset(self) -> bytes: res_bytes = self.digest() self.reset() return res_bytes class Sha3Transcript(Transcript): def reset(self): self.hasher = keccak_256() def digest(self) -> bytes: res = self.hasher.digest() res_int = int.from_bytes(res, "big") res_mod = res_int % CURVES[CurveID.GRUMPKIN.value].p res_bytes = res_mod.to_bytes(32, "big") return res_bytes def update(self, data: bytes): self.hasher.update(data) class StarknetPoseidonTranscript(Transcript): def reset(self): self.s0, self.s1, self.s2 = hades_permutation( int.from_bytes(b"StarknetHonk", "big"), 0, 1 ) def digest(self) -> bytes: res_bytes = self.s0.to_bytes(32, "big") return res_bytes def update(self, data: bytes): val = int.from_bytes(data, "big") assert val < 2**256 high, low = divmod(val, 2**128) self.s0, self.s1, self.s2 = hades_permutation( self.s0 + low, self.s1 + high, self.s2 ) @dataclass class ZKHonkProof: log_circuit_size: int # from vk public_inputs: list[int] pairing_point_object: list[int] w1: G1Point w2: G1Point w3: G1Point w4: G1Point z_perm: G1Point lookup_read_counts: G1Point lookup_read_tags: G1Point lookup_inverses: G1Point libra_commitments: list[G1Point] libra_sum: int sumcheck_univariates: list[list[int]] sumcheck_evaluations: list[int] libra_evaluation: int gemini_masking_poly: G1Point gemini_masking_eval: int gemini_fold_comms: list[G1Point] gemini_a_evaluations: list[int] libra_poly_evals: list[int] shplonk_q: G1Point kzg_quotient: G1Point proof_bytes: bytes public_inputs_bytes: bytes def __post_init__(self): assert len(self.pairing_point_object) == PAIRING_POINT_OBJECT_LENGTH assert len(self.libra_commitments) == 3 assert all( len(univariate) == ZK_BATCHED_RELATION_PARTIAL_LENGTH for univariate in self.sumcheck_univariates ) assert len(self.sumcheck_evaluations) == NUMBER_OF_ENTITIES assert len(self.libra_poly_evals) == 4 assert len(self.gemini_fold_comms) == self.log_circuit_size - 1 assert len(self.gemini_a_evaluations) == self.log_circuit_size assert len(self.libra_poly_evals) == 4 @classmethod def from_bytes( cls, proof_bytes: bytes, public_inputs_bytes: bytes, vk: HonkVk ) -> "ZKHonkProof": FIELD_ELEMENT_SIZE = 32 n_elements = len(proof_bytes) // FIELD_ELEMENT_SIZE assert len(proof_bytes) % FIELD_ELEMENT_SIZE == 0 elements = [ int.from_bytes(proof_bytes[i : i + FIELD_ELEMENT_SIZE], "big") for i in range(0, len(proof_bytes), FIELD_ELEMENT_SIZE) ] assert ( len(elements) == n_elements == ZKHonkProof.calculate_proof_size(vk.log_circuit_size) ), f"{len(elements)} == {n_elements} == {ZKHonkProof.calculate_proof_size(vk.log_circuit_size)}" n_public_inputs = len(public_inputs_bytes) // FIELD_ELEMENT_SIZE assert len(public_inputs_bytes) % FIELD_ELEMENT_SIZE == 0 public_inputs = [ int.from_bytes(public_inputs_bytes[i : i + FIELD_ELEMENT_SIZE], "big") for i in range(0, len(public_inputs_bytes), FIELD_ELEMENT_SIZE) ] assert ( len(public_inputs) == n_public_inputs == vk.public_inputs_size - PAIRING_POINT_OBJECT_LENGTH ) pairing_point_object = [] cursor = 0 for i in range(PAIRING_POINT_OBJECT_LENGTH): pairing_point_object.append(elements[cursor + i]) cursor += PAIRING_POINT_OBJECT_LENGTH def parse_g1_proof_point(i: int) -> G1Point: p = CURVES[CurveID.BN254.value].p return G1Point( x=elements[i] % p, y=elements[i + 1] % p, curve_id=CurveID.BN254, ) w1 = parse_g1_proof_point(cursor) w2 = parse_g1_proof_point(cursor + G1_PROOF_POINT_SIZE) w3 = parse_g1_proof_point(cursor + 2 * G1_PROOF_POINT_SIZE) lookup_read_counts = parse_g1_proof_point(cursor + 3 * G1_PROOF_POINT_SIZE) lookup_read_tags = parse_g1_proof_point(cursor + 4 * G1_PROOF_POINT_SIZE) w4 = parse_g1_proof_point(cursor + 5 * G1_PROOF_POINT_SIZE) lookup_inverses = parse_g1_proof_point(cursor + 6 * G1_PROOF_POINT_SIZE) z_perm = parse_g1_proof_point(cursor + 7 * G1_PROOF_POINT_SIZE) libra_commitments = [None] * 3 libra_commitments[0] = parse_g1_proof_point(cursor + 8 * G1_PROOF_POINT_SIZE) cursor += 9 * G1_PROOF_POINT_SIZE libra_sum = elements[cursor] cursor += 1 # Parse sumcheck univariates. sumcheck_univariates = [] for i in range(vk.log_circuit_size): sumcheck_univariates.append( [ elements[cursor + i * ZK_BATCHED_RELATION_PARTIAL_LENGTH + j] for j in range(ZK_BATCHED_RELATION_PARTIAL_LENGTH) ] ) cursor += ZK_BATCHED_RELATION_PARTIAL_LENGTH * vk.log_circuit_size # Parse sumcheck_evaluations sumcheck_evaluations = elements[cursor : cursor + NUMBER_OF_ENTITIES] cursor += NUMBER_OF_ENTITIES libra_evaluation = elements[cursor] cursor += 1 libra_commitments[1] = parse_g1_proof_point(cursor) libra_commitments[2] = parse_g1_proof_point(cursor + G1_PROOF_POINT_SIZE) gemini_masking_poly = parse_g1_proof_point(cursor + 2 * G1_PROOF_POINT_SIZE) cursor += 3 * G1_PROOF_POINT_SIZE gemini_masking_eval = elements[cursor] cursor += 1 # Parse gemini fold comms gemini_fold_comms = [ parse_g1_proof_point(cursor + i * G1_PROOF_POINT_SIZE) for i in range(vk.log_circuit_size - 1) ] cursor += (vk.log_circuit_size - 1) * G1_PROOF_POINT_SIZE # Parse gemini a evaluations gemini_a_evaluations = elements[cursor : cursor + vk.log_circuit_size] cursor += vk.log_circuit_size libra_poly_evals = elements[cursor : cursor + 4] cursor += 4 shplonk_q = parse_g1_proof_point(cursor) kzg_quotient = parse_g1_proof_point(cursor + G1_PROOF_POINT_SIZE) cursor += 2 * G1_PROOF_POINT_SIZE assert cursor == len(elements) return ZKHonkProof( log_circuit_size=vk.log_circuit_size, public_inputs=public_inputs, pairing_point_object=pairing_point_object, w1=w1, w2=w2, w3=w3, w4=w4, z_perm=z_perm, lookup_read_counts=lookup_read_counts, lookup_read_tags=lookup_read_tags, lookup_inverses=lookup_inverses, libra_commitments=libra_commitments, libra_sum=libra_sum, sumcheck_univariates=sumcheck_univariates, sumcheck_evaluations=sumcheck_evaluations, libra_evaluation=libra_evaluation, gemini_masking_poly=gemini_masking_poly, gemini_masking_eval=gemini_masking_eval, gemini_fold_comms=gemini_fold_comms, gemini_a_evaluations=gemini_a_evaluations, libra_poly_evals=libra_poly_evals, shplonk_q=shplonk_q, kzg_quotient=kzg_quotient, proof_bytes=proof_bytes, public_inputs_bytes=public_inputs_bytes, ) def to_circuit_elements(self, circuit: ModuloCircuit) -> "ZKHonkProof": """Convert everything to ModuloCircuitElements given a circuit.""" return ZKHonkProof( log_circuit_size=self.log_circuit_size, public_inputs=circuit.write_elements(self.public_inputs), pairing_point_object=circuit.write_elements(self.pairing_point_object), w1=circuit.write_struct(structs.G1PointCircuit.from_G1Point("w1", self.w1)), w2=circuit.write_struct(structs.G1PointCircuit.from_G1Point("w2", self.w2)), w3=circuit.write_struct(structs.G1PointCircuit.from_G1Point("w3", self.w3)), w4=circuit.write_struct(structs.G1PointCircuit.from_G1Point("w4", self.w4)), z_perm=circuit.write_struct( structs.G1PointCircuit.from_G1Point("z_perm", self.z_perm) ), lookup_read_counts=circuit.write_struct( structs.G1PointCircuit.from_G1Point( "lookup_read_counts", self.lookup_read_counts ) ), lookup_read_tags=circuit.write_struct( structs.G1PointCircuit.from_G1Point( "lookup_read_tags", self.lookup_read_tags ) ), lookup_inverses=circuit.write_struct( structs.G1PointCircuit.from_G1Point( "lookup_inverses", self.lookup_inverses ) ), libra_commitments=[ circuit.write_struct( structs.G1PointCircuit.from_G1Point(f"libra_commitments_{i}", comm) ) for i, comm in enumerate(self.libra_commitments) ], libra_sum=circuit.write_element(self.libra_sum), sumcheck_univariates=[ circuit.write_elements(univariate) for univariate in self.sumcheck_univariates ], sumcheck_evaluations=circuit.write_elements(self.sumcheck_evaluations), libra_evaluation=circuit.write_element(self.libra_evaluation), gemini_masking_poly=circuit.write_struct( structs.G1PointCircuit.from_G1Point( "gemini_masking_poly", self.gemini_masking_poly ) ), gemini_masking_eval=circuit.write_element(self.gemini_masking_eval), gemini_fold_comms=[ circuit.write_struct( structs.G1PointCircuit.from_G1Point(f"gemini_fold_comm_{i}", comm) ) for i, comm in enumerate(self.gemini_fold_comms) ], gemini_a_evaluations=circuit.write_elements(self.gemini_a_evaluations), libra_poly_evals=circuit.write_elements(self.libra_poly_evals), shplonk_q=circuit.write_struct( structs.G1PointCircuit.from_G1Point("shplonk_q", self.shplonk_q) ), kzg_quotient=circuit.write_struct( structs.G1PointCircuit.from_G1Point("kzg_quotient", self.kzg_quotient) ), proof_bytes=self.proof_bytes, public_inputs_bytes=self.public_inputs_bytes, ) def to_cairo(self) -> str: def g1_to_g1point256(g1_point: G1Point) -> str: return f"G1Point256{{x: {hex(g1_point.x)}, y: {hex(g1_point.y)}}}" def format_array(elements: list, span: bool = False) -> str: """Helper function to format arrays with custom element formatting""" formatted_elements = [hex(el) for el in elements] arr = f"array![{', '.join(formatted_elements)}]" if span: return f"{arr}.span()" return arr code = f"ZKHonkProof {{\n" code += f"public_inputs: {format_array(self.public_inputs, span=True)},\n" code += f"pairing_point_object: {format_array(self.pairing_point_object, span=True)},\n" code += f"w1: {g1_to_g1point256(self.w1)},\n" code += f"w2: {g1_to_g1point256(self.w2)},\n" code += f"w3: {g1_to_g1point256(self.w3)},\n" code += f"w4: {g1_to_g1point256(self.w4)},\n" code += f"z_perm: {g1_to_g1point256(self.z_perm)},\n" code += f"lookup_read_counts: {g1_to_g1point256(self.lookup_read_counts)},\n" code += f"lookup_read_tags: {g1_to_g1point256(self.lookup_read_tags)},\n" code += f"lookup_inverses: {g1_to_g1point256(self.lookup_inverses)},\n" code += f"libra_commitments: array![{', '.join(g1_to_g1point256(comm) for comm in self.libra_commitments)}].span(),\n" code += f"libra_sum: {hex(self.libra_sum)},\n" # Flatten sumcheck_univariates array code += f"sumcheck_univariates: {format_array(io.flatten(self.sumcheck_univariates)[:self.log_circuit_size * ZK_BATCHED_RELATION_PARTIAL_LENGTH], span=True)},\n" code += f"sumcheck_evaluations: {format_array(self.sumcheck_evaluations, span=True)},\n" code += f"libra_evaluation: {hex(self.libra_evaluation)},\n" code += f"gemini_masking_poly: {g1_to_g1point256(self.gemini_masking_poly)},\n" code += f"gemini_masking_eval: {hex(self.gemini_masking_eval)},\n" code += f"gemini_fold_comms: array![{', '.join(g1_to_g1point256(comm) for comm in self.gemini_fold_comms[:self.log_circuit_size - 1])}].span(),\n" code += f"gemini_a_evaluations: {format_array(self.gemini_a_evaluations[:self.log_circuit_size], span=True)},\n" code += f"libra_poly_evals: {format_array(self.libra_poly_evals, span=True)},\n" code += f"shplonk_q: {g1_to_g1point256(self.shplonk_q)},\n" code += f"kzg_quotient: {g1_to_g1point256(self.kzg_quotient)},\n" code += "};" return code def serialize_to_calldata(self) -> list[int]: def serialize_G1Point256(g1_point: G1Point) -> list[int]: xl, xh = io.split_128(g1_point.x) yl, yh = io.split_128(g1_point.y) return [xl, xh, yl, yh] cd = [] cd.extend( io.bigint_split_array( x=self.public_inputs, n_limbs=2, base=2**128, prepend_length=True ) ) cd.extend( io.bigint_split_array( x=self.pairing_point_object, n_limbs=2, base=2**128, prepend_length=True, ) ) cd.extend(serialize_G1Point256(self.w1)) cd.extend(serialize_G1Point256(self.w2)) cd.extend(serialize_G1Point256(self.w3)) cd.extend(serialize_G1Point256(self.w4)) cd.extend(serialize_G1Point256(self.z_perm)) cd.extend(serialize_G1Point256(self.lookup_read_counts)) cd.extend(serialize_G1Point256(self.lookup_read_tags)) cd.extend(serialize_G1Point256(self.lookup_inverses)) cd.append(len(self.libra_commitments)) for pt in self.libra_commitments: cd.extend(serialize_G1Point256(pt)) cd.extend(io.bigint_split(self.libra_sum, n_limbs=2, base=2**128)) cd.extend( io.bigint_split_array( x=io.flatten(self.sumcheck_univariates)[ : ZK_BATCHED_RELATION_PARTIAL_LENGTH * self.log_circuit_size ], # The rest is 0. n_limbs=2, base=2**128, prepend_length=True, ) ) cd.extend( io.bigint_split_array( x=self.sumcheck_evaluations, n_limbs=2, base=2**128, prepend_length=True ) ) cd.extend(io.bigint_split(self.libra_evaluation, n_limbs=2, base=2**128)) cd.extend(serialize_G1Point256(self.gemini_masking_poly)) cd.extend(io.bigint_split(self.gemini_masking_eval, n_limbs=2, base=2**128)) cd.append(self.log_circuit_size - 1) for pt in self.gemini_fold_comms[ : self.log_circuit_size - 1 ]: # The rest is G(1, 2) cd.extend(serialize_G1Point256(pt)) cd.extend( io.bigint_split_array( x=self.gemini_a_evaluations[: self.log_circuit_size], n_limbs=2, base=2**128, prepend_length=True, ) ) cd.extend( io.bigint_split_array( x=self.libra_poly_evals, n_limbs=2, base=2**128, prepend_length=True, ) ) cd.extend(serialize_G1Point256(self.shplonk_q)) cd.extend(serialize_G1Point256(self.kzg_quotient)) return cd def flatten(self) -> list[int]: """Used to pass data to Rust""" lst = [] lst.extend(self.public_inputs) lst.extend(self.pairing_point_object) lst.extend(g1_to_g1_proof_point(self.w1)) lst.extend(g1_to_g1_proof_point(self.w2)) lst.extend(g1_to_g1_proof_point(self.w3)) lst.extend(g1_to_g1_proof_point(self.lookup_read_counts)) lst.extend(g1_to_g1_proof_point(self.lookup_read_tags)) lst.extend(g1_to_g1_proof_point(self.w4)) lst.extend(g1_to_g1_proof_point(self.lookup_inverses)) lst.extend(g1_to_g1_proof_point(self.z_perm)) lst.extend(g1_to_g1_proof_point(self.libra_commitments[0])) lst.append(self.libra_sum) for line in self.sumcheck_univariates: lst.extend(line) lst.extend(self.sumcheck_evaluations) lst.append(self.libra_evaluation) lst.extend(g1_to_g1_proof_point(self.libra_commitments[1])) lst.extend(g1_to_g1_proof_point(self.libra_commitments[2])) lst.extend(g1_to_g1_proof_point(self.gemini_masking_poly)) lst.append(self.gemini_masking_eval) for point in self.gemini_fold_comms: lst.extend(g1_to_g1_proof_point(point)) lst.extend(self.gemini_a_evaluations) lst.extend(self.libra_poly_evals) lst.extend(g1_to_g1_proof_point(self.shplonk_q)) lst.extend(g1_to_g1_proof_point(self.kzg_quotient)) return lst @staticmethod def calculate_proof_size(log_circuit_size: int): # Witness and Libra commitments proof_size = NUM_WITNESS_ENTITIES * NUM_ELEMENTS_COMM proof_size += ( NUM_ELEMENTS_COMM * 4 ) # Libra concat, grand sum, quotient comms + Gemini masking # Sumcheck proof_size += ( log_circuit_size * ZK_BATCHED_RELATION_PARTIAL_LENGTH * NUM_ELEMENTS_FR ) # sumcheck univariates proof_size += NUMBER_OF_ENTITIES * NUM_ELEMENTS_FR # sumcheck evaluations # Libra and Gemini proof_size += NUM_ELEMENTS_FR * 3 # Libra sum, claimed eval, Gemini masking eval proof_size += log_circuit_size * NUM_ELEMENTS_FR # Gemini a evaluations proof_size += NUM_LIBRA_EVALUATIONS * NUM_ELEMENTS_FR # libra evaluations # PCS commitments proof_size += (log_circuit_size - 1) * NUM_ELEMENTS_COMM # Gemini Fold commitments proof_size += NUM_ELEMENTS_COMM * 2 # Shplonk Q and KZG W commitments # Pairing points proof_size += PAIRING_POINT_OBJECT_LENGTH # pairing inputs carried on public inputs return proof_size @dataclass class ZKHonkTranscript: eta: int | ModuloCircuitElement etaTwo: int | ModuloCircuitElement etaThree: int | ModuloCircuitElement beta: int | ModuloCircuitElement gamma: int | ModuloCircuitElement alpha: int | ModuloCircuitElement gate_challenge: int | ModuloCircuitElement libra_challenge: int | ModuloCircuitElement sum_check_u_challenges: list[ModuloCircuitElement] rho: int | ModuloCircuitElement gemini_r: int | ModuloCircuitElement shplonk_nu: int | ModuloCircuitElement shplonk_z: int | ModuloCircuitElement last_state: tuple[int, int, int] public_inputs_delta: int | None = None # Derived. @classmethod def from_proof( cls, vk: HonkVk, proof: ZKHonkProof, system: ProofSystem = ProofSystem.UltraKeccakZKHonk, ) -> "ZKHonkTranscript": assert ( len(proof.public_inputs) == vk.public_inputs_size - PAIRING_POINT_OBJECT_LENGTH ) def split_challenge(ch: bytes) -> tuple[int, int]: ch_int = int.from_bytes(ch, "big") high_128, low_128 = divmod(ch_int, 2**128) return (low_128, high_128) FR = CURVES[CurveID.GRUMPKIN.value].p match system: case ProofSystem.UltraKeccakZKHonk: hasher = Sha3Transcript() case ProofSystem.UltraStarknetZKHonk: hasher = StarknetPoseidonTranscript() case _: raise ValueError(f"Proof system {system} not compatible") ## 1. Relation Parameters Challenges ## 1.1 eta_challenges ## 1.2 beta_and_gamma_challenges ## ## struct RelationParameters { # // challenges # Fr eta; # Fr etaTwo; # Fr etaThree; # Fr beta; # Fr gamma; # // derived # Fr publicInputsDelta; # } # Round 0 : circuit_size, public_inputs_size, public_input_offset, [public_inputs], w1, w2, w3 hasher.update(int.to_bytes(vk.vk_hash, 32, "big")) for pub_input in proof.public_inputs: hasher.update(int.to_bytes(pub_input, 32, "big")) for pub_input in proof.pairing_point_object: hasher.update(int.to_bytes(pub_input, 32, "big")) for g1_proof_point in [proof.w1, proof.w2, proof.w3]: # print(f"g1_proof_point: {g1_proof_point.__repr__()}") hasher.update(int.to_bytes(g1_proof_point.x, 32, "big")) hasher.update(int.to_bytes(g1_proof_point.y, 32, "big")) ch0 = hasher.digest_reset() eta, eta_two = split_challenge(ch0) hasher.update(ch0) ch0 = hasher.digest_reset() eta_three, _ = split_challenge(ch0) # print(f"eta: {hex(eta)}") # print(f"eta_two: {hex(eta_two)}") # print(f"eta_three: {hex(eta_three)}") # Round 1 : ch0, lookup_read_counts, lookup_read_tags, w4 hasher.update(ch0) for g1_proof_point in [ proof.lookup_read_counts, proof.lookup_read_tags, proof.w4, ]: hasher.update(int.to_bytes(g1_proof_point.x, 32, "big")) hasher.update(int.to_bytes(g1_proof_point.y, 32, "big")) ch1 = hasher.digest_reset() beta, gamma = split_challenge(ch1) ## 2. Alpha Challenges # Round 2: ch1, lookup_inverses, z_perm hasher.update(ch1) for g1_proof_point in [proof.lookup_inverses, proof.z_perm]: hasher.update(int.to_bytes(g1_proof_point.x, 32, "big")) hasher.update(int.to_bytes(g1_proof_point.y, 32, "big")) ch2 = hasher.digest_reset() alpha, _ = split_challenge(ch2) ## 3. Gate Challenges hasher.update(ch2) ch3 = hasher.digest_reset() gate_challenge, _ = split_challenge(ch3) ## 4. Libra Challenge # print(f"gate_challenges: {[hex(x) for x in gate_challenges]}") # print(f"len(gate_challenges): {len(gate_challenges)}") # Round 3 and 1/2: Libra challenge hasher.update(ch3) hasher.update(int.to_bytes(proof.libra_commitments[0].x, 32, "big")) hasher.update(int.to_bytes(proof.libra_commitments[0].y, 32, "big")) hasher.update(int.to_bytes(proof.libra_sum, 32, "big")) ch3 = hasher.digest_reset() libra_challenge, _ = split_challenge(ch3) ## 5. Sumcheck U Challenges # Round 4: Sumcheck u challenges ch4 = ch3 sum_check_u_challenges = [None] * vk.log_circuit_size # print(f"len(sumcheck_univariates): {len(proof.sumcheck_univariates)}") # print( # f"len(proof.sumcheck_univariates[0]): {len(proof.sumcheck_univariates[0])}" # ) for i in range(vk.log_circuit_size): # Create array of univariate challenges starting with previous challenge univariate_chal = [ch4] # Add the sumcheck univariates for this round for j in range(ZK_BATCHED_RELATION_PARTIAL_LENGTH): univariate_chal.append( int.to_bytes(proof.sumcheck_univariates[i][j], 32, "big") ) # Update hasher with all univariate challenges for chal in univariate_chal: hasher.update(chal) # Get next challenge ch4 = hasher.digest_reset() # Split challenge to get sumcheck challenge sum_check_u_challenges[i], _ = split_challenge(ch4) # print(f"sum_check_u_challenges: {[hex(x) for x in sum_check_u_challenges]}") # print(f"len(sum_check_u_challenges): {len(sum_check_u_challenges)}") ## 6. Rho Challenge # Rho challenge : hasher.update(ch4) for i in range(NUMBER_OF_ENTITIES): hasher.update(int.to_bytes(proof.sumcheck_evaluations[i], 32, "big")) hasher.update(int.to_bytes(proof.libra_evaluation, 32, "big")) for g1_proof_point in [ proof.libra_commitments[1], proof.libra_commitments[2], proof.gemini_masking_poly, ]: hasher.update(int.to_bytes(g1_proof_point.x, 32, "big")) hasher.update(int.to_bytes(g1_proof_point.y, 32, "big")) hasher.update(int.to_bytes(proof.gemini_masking_eval, 32, "big")) c5 = hasher.digest_reset() rho, _ = split_challenge(c5) # print(f"rho: {hex(rho)}") ## 7. Gemini R Challenge # Gemini R : hasher.update(c5) for i in range(vk.log_circuit_size - 1): hasher.update(int.to_bytes(proof.gemini_fold_comms[i].x, 32, "big")) hasher.update(int.to_bytes(proof.gemini_fold_comms[i].y, 32, "big")) c6 = hasher.digest_reset() gemini_r, _ = split_challenge(c6) # print(f"gemini_r: {hex(gemini_r)}") ## 8. Shplonk Nu Challenge # Shplonk Nu : hasher.update(c6) for i in range(vk.log_circuit_size): hasher.update(int.to_bytes(proof.gemini_a_evaluations[i], 32, "big")) for i in range(4): hasher.update(int.to_bytes(proof.libra_poly_evals[i], 32, "big")) c7 = hasher.digest_reset() shplonk_nu, _ = split_challenge(c7) # print(f"shplonk_nu: {hex(shplonk_nu)}") ## 9. Shplonk Z Challenge # Shplonk Z : hasher.update(c7) hasher.update(int.to_bytes(proof.shplonk_q.x, 32, "big")) hasher.update(int.to_bytes(proof.shplonk_q.y, 32, "big")) c8 = hasher.digest_reset() shplonk_z_low, shplonk_z_high = split_challenge(c8) # print(f"shplonk_z: {hex(shplonk_z)}") s0, s1, s2 = hades_permutation(shplonk_z_low, shplonk_z_high, 2) return cls( eta=eta, etaTwo=eta_two, etaThree=eta_three, beta=beta, gamma=gamma, alpha=alpha, gate_challenge=gate_challenge, libra_challenge=libra_challenge, sum_check_u_challenges=sum_check_u_challenges, rho=rho, gemini_r=gemini_r, shplonk_nu=shplonk_nu, shplonk_z=shplonk_z_low, last_state=(s0, s1, s2), public_inputs_delta=None, ) def to_circuit_elements(self, circuit: ModuloCircuit) -> "ZKHonkTranscript": return ZKHonkTranscript( eta=circuit.write_element(self.eta), etaTwo=circuit.write_element(self.etaTwo), etaThree=circuit.write_element(self.etaThree), beta=circuit.write_element(self.beta), gamma=circuit.write_element(self.gamma), alpha=circuit.write_element(self.alpha), gate_challenge=circuit.write_element(self.gate_challenge), libra_challenge=circuit.write_element(self.libra_challenge), sum_check_u_challenges=circuit.write_elements(self.sum_check_u_challenges), rho=circuit.write_element(self.rho), gemini_r=circuit.write_element(self.gemini_r), shplonk_nu=circuit.write_element(self.shplonk_nu), shplonk_z=circuit.write_element(self.shplonk_z), last_state=self.last_state, public_inputs_delta=None, ) def to_cairo(self) -> str: code = "ZKHonkTranscript{\n" code += f" eta: {hex(self.eta)},\n" code += f" eta_two: {hex(self.etaTwo)},\n" code += f" eta_three: {hex(self.etaThree)},\n" code += f" beta: {hex(self.beta)},\n" code += f" gamma: {hex(self.gamma)},\n" code += f" alpha: {hex(self.alpha)},\n" code += f" gate_challenge: {hex(self.gate_challenge)},\n" code += f" libra_challenge: {hex(self.libra_challenge)},\n" code += f" sum_check_u_challenges:array![{', '.join([hex(sum_check_u_challenge) for sum_check_u_challenge in self.sum_check_u_challenges])}],\n" code += f" rho: {hex(self.rho)},\n" code += f" gemini_r: {hex(self.gemini_r)},\n" code += f" shplonk_nu: {hex(self.shplonk_nu)},\n" code += f" shplonk_z: {hex(self.shplonk_z)},\n" code += "}" return code class ZKHonkVerifierCircuits(ModuloCircuit): def __init__( self, name: str, log_n: int, curve_id: int = CurveID.GRUMPKIN.value, compilation_mode: int = 1, ): super().__init__( name=name, curve_id=curve_id, compilation_mode=compilation_mode, ) self.log_n = log_n def compute_public_input_delta( self, public_inputs: list[ModuloCircuitElement], pairing_point_object: list[ModuloCircuitElement], beta: ModuloCircuitElement, gamma: ModuloCircuitElement, ) -> ModuloCircuitElement: assert len(public_inputs) > 0 assert len(pairing_point_object) == PAIRING_POINT_OBJECT_LENGTH offset: ModuloCircuitElement = self.set_or_get_constant(1) num = self.set_or_get_constant(1) den = self.set_or_get_constant(1) PERMUTATION_ARGUMENT_VALUE_SEPARATOR = 1 << 28 num_acc = self.add( gamma, self.mul( beta, self.add( self.set_or_get_constant(PERMUTATION_ARGUMENT_VALUE_SEPARATOR), offset, ), ), ) den_acc = self.sub( gamma, self.mul(beta, self.add(offset, self.set_or_get_constant(1))), ) for i, pub_input in enumerate(public_inputs): num = self.mul(num, self.add(num_acc, pub_input)) den = self.mul(den, self.add(den_acc, pub_input)) num_acc = self.add(num_acc, beta) den_acc = self.sub(den_acc, beta) for i, pub_input in enumerate(pairing_point_object): num = self.mul(num, self.add(num_acc, pub_input)) den = self.mul(den, self.add(den_acc, pub_input)) # skip last round (unused otherwise) if i != len(pairing_point_object) - 1: num_acc = self.add(num_acc, beta) den_acc = self.sub(den_acc, beta) return self.div(num, den) def verify_sum_check( self, libra_sum: ModuloCircuitElement, sumcheck_univariates: list[list[ModuloCircuitElement]], sumcheck_evaluations: list[ModuloCircuitElement], libra_evaluation: ModuloCircuitElement, beta: ModuloCircuitElement, gamma: ModuloCircuitElement, public_inputs_delta: ModuloCircuitElement, eta: ModuloCircuitElement, eta_two: ModuloCircuitElement, eta_three: ModuloCircuitElement, libra_challenge: ModuloCircuitElement, sum_check_u_challenges: list[ModuloCircuitElement], gate_challenge: ModuloCircuitElement, alpha: ModuloCircuitElement, log_n: int, base_rlc: ModuloCircuitElement, ) -> ModuloCircuitElement: """ We will add an extra challenge base_rlc to do a Sumcheck RLC since Cairo1 doesn't support assert_eq inside circuits (unlike Cairo0). """ pow_partial_evaluation = self.set_or_get_constant(1) round_target = self.mul(libra_challenge, libra_sum) check_rlc = None rlc_coeff = base_rlc current_gate_challenge = gate_challenge for i, round in enumerate(range(log_n)): round_univariate: list[ModuloCircuitElement] = sumcheck_univariates[round] total_sum = self.add(round_univariate[0], round_univariate[1]) check_rlc = self.add( check_rlc, self.mul(self.sub(total_sum, round_target), rlc_coeff) ) round_challenge = sum_check_u_challenges[round] round_target = self.compute_next_target_sum( round_univariate, round_challenge ) pow_partial_evaluation = self.partially_evaluate_pow( current_gate_challenge, pow_partial_evaluation, round_challenge, round, ) # Skip at the last round if i != log_n - 1: rlc_coeff = self.mul(rlc_coeff, base_rlc) current_gate_challenge = self.square(current_gate_challenge) # Last Round evaluations = self.accumulate_relation_evaluations( sumcheck_evaluations, beta, gamma, public_inputs_delta, eta, eta_two, eta_three, pow_partial_evaluation, ) assert ( len(evaluations) == NUMBER_OF_SUBRELATIONS ), f"Expected {NUMBER_OF_SUBRELATIONS}, got {len(evaluations)}" grand_honk_relation_sum = evaluations[0] alpha_i = alpha len_evaluations = len(evaluations) - 1 for i, evaluation in enumerate(evaluations[1:]): grand_honk_relation_sum = self.add( grand_honk_relation_sum, self.mul(evaluation, alpha_i), ) # Skip last update of alpha_i if i != len_evaluations - 1: alpha_i = self.mul(alpha_i, alpha) evaluation = sum_check_u_challenges[2] for i in range(3, log_n): evaluation = self.mul(evaluation, sum_check_u_challenges[i]) grand_honk_relation_sum = self.add( self.mul( grand_honk_relation_sum, self.sub(self.set_or_get_constant(1), evaluation), ), self.mul(libra_evaluation, libra_challenge), ) check = self.sub(grand_honk_relation_sum, round_target) return check_rlc, check def compute_next_target_sum( self, round_univariate: list[ModuloCircuitElement], challenge: ModuloCircuitElement, ) -> ModuloCircuitElement: BARYCENTRIC_LAGRANGE_DENOMINATORS = [ self.set_or_get_constant( 0x0000000000000000000000000000000000000000000000000000000000009D80 ), self.set_or_get_constant( 0x30644E72E131A029B85045B68181585D2833E84879B9709143E1F593EFFFEC51 ), self.set_or_get_constant( 0x00000000000000000000000000000000000000000000000000000000000005A0 ), self.set_or_get_constant( 0x30644E72E131A029B85045B68181585D2833E84879B9709143E1F593EFFFFD31 ), self.set_or_get_constant( 0x0000000000000000000000000000000000000000000000000000000000000240 ), self.set_or_get_constant( 0x30644E72E131A029B85045B68181585D2833E84879B9709143E1F593EFFFFD31 ), self.set_or_get_constant( 0x00000000000000000000000000000000000000000000000000000000000005A0 ), self.set_or_get_constant( 0x30644E72E131A029B85045B68181585D2833E84879B9709143E1F593EFFFEC51 ), self.set_or_get_constant( 0x0000000000000000000000000000000000000000000000000000000000009D80 ), ] assert ( len(BARYCENTRIC_LAGRANGE_DENOMINATORS) == ZK_BATCHED_RELATION_PARTIAL_LENGTH ) BARYCENTRIC_DOMAIN = [ self.set_or_get_constant(i) for i in range(ZK_BATCHED_RELATION_PARTIAL_LENGTH) ] numerator = self.set_or_get_constant(1) target_sum = self.set_or_get_constant(0) for i in range(ZK_BATCHED_RELATION_PARTIAL_LENGTH): # Update numerator numerator = self.mul( numerator, self.sub(challenge, self.set_or_get_constant(i)) ) # Calculate inverse of the denominator inv = self.inv( self.mul( BARYCENTRIC_LAGRANGE_DENOMINATORS[i], self.sub(challenge, BARYCENTRIC_DOMAIN[i]), ) ) # Calculate term and update target_sum term = round_univariate[i] term = self.mul(term, inv) target_sum = self.add(target_sum, term) # Scale the sum by the value of B(x) target_sum = self.mul(target_sum, numerator) return target_sum def partially_evaluate_pow( self, gate_challenge: ModuloCircuitElement, current_evaluation: ModuloCircuitElement, challenge: ModuloCircuitElement, round: int, ) -> ModuloCircuitElement: """ Univariate evaluation of the monomial ((1-X_l) + X_l.B_l) at the challenge point X_l=u_l """ univariate_eval = self.add( self.set_or_get_constant(1), self.mul(challenge, self.sub(gate_challenge, self.set_or_get_constant(1))), ) new_evaluation = self.mul(current_evaluation, univariate_eval) return new_evaluation def accumulate_relation_evaluations( self, sumcheck_evaluations: list[list[ModuloCircuitElement]], beta: ModuloCircuitElement, gamma: ModuloCircuitElement, public_inputs_delta: ModuloCircuitElement, eta: ModuloCircuitElement, eta_two: ModuloCircuitElement, eta_three: ModuloCircuitElement, pow_partial_evaluation: ModuloCircuitElement, ) -> list[ModuloCircuitElement]: domain_separator = pow_partial_evaluation assert len(sumcheck_evaluations) == len( Wire ), f"Expected {len(Wire)}, got {len(sumcheck_evaluations)}" evaluations = [self.set_or_get_constant(0)] * NUMBER_OF_SUBRELATIONS evaluations = self.accumulate_arithmetic_relation( sumcheck_evaluations, evaluations, pow_partial_evaluation ) evaluations = self.accumulate_permutation_relation( sumcheck_evaluations, evaluations, beta, gamma, public_inputs_delta, domain_separator, ) evaluations = self.accumulate_log_derivative_lookup_relation( sumcheck_evaluations, evaluations, gamma, eta, eta_two, eta_three, domain_separator, ) evaluations = self.accumulate_delta_range_relation( sumcheck_evaluations, evaluations, domain_separator ) evaluations = self.accumulate_elliptic_relation( sumcheck_evaluations, evaluations, domain_separator ) evaluations = self.accumulate_memory_relation( sumcheck_evaluations, eta, eta_two, eta_three, evaluations, domain_separator, ) evaluations = self.accumulate_nnf_relation( sumcheck_evaluations, evaluations, domain_separator ) evaluations = self.accumulate_poseidon_external_relation( sumcheck_evaluations, evaluations, domain_separator ) evaluations = self.accumulate_poseidon_internal_relation( sumcheck_evaluations, evaluations, domain_separator ) return evaluations def accumulate_arithmetic_relation( self, purported_evaluations: list[ModuloCircuitElement], evaluations: list[ModuloCircuitElement], domain_separator: ModuloCircuitElement, ) -> ModuloCircuitElement: p = purported_evaluations q_arith = p[Wire.Q_ARITH] # Relation 0 neg_half = self.set_or_get_constant(self.field(-2).__inv__()) accum = self.product( [ self.sub(q_arith, self.set_or_get_constant(3)), p[Wire.Q_M], p[Wire.W_R], p[Wire.W_L], neg_half, ] ) accum = self.sum( [ accum, self.mul(p[Wire.Q_L], p[Wire.W_L]), self.mul(p[Wire.Q_R], p[Wire.W_R]), self.mul(p[Wire.Q_O], p[Wire.W_O]), self.mul(p[Wire.Q_4], p[Wire.W_4]), p[Wire.Q_C], ] ) accum = self.add( accum, self.mul(self.sub(q_arith, self.set_or_get_constant(1)), p[Wire.W_4_SHIFT]), ) accum = self.product([accum, q_arith, domain_separator]) evaluations[0] = accum # Relation 1 accum = self.sum([p[Wire.W_L], p[Wire.W_4], p[Wire.Q_M]]) accum = self.sub(accum, p[Wire.W_L_SHIFT]) accum = self.mul(accum, self.sub(q_arith, self.set_or_get_constant(2))) accum = self.mul(accum, self.sub(q_arith, self.set_or_get_constant(1))) accum = self.mul(accum, q_arith) accum = self.mul(accum, domain_separator) evaluations[1] = accum return evaluations def accumulate_permutation_relation( self, purported_evaluations: list[ModuloCircuitElement], evaluations: list[ModuloCircuitElement], beta: ModuloCircuitElement, gamma: ModuloCircuitElement, public_inputs_delta: ModuloCircuitElement, domain_separator: ModuloCircuitElement, ) -> list[ModuloCircuitElement]: p = purported_evaluations # Grand Product Numerator n = self.sum([p[Wire.W_L], self.mul(p[Wire.ID_1], beta), gamma]) n = self.mul(n, self.sum([p[Wire.W_R], self.mul(p[Wire.ID_2], beta), gamma])) n = self.mul(n, self.sum([p[Wire.W_O], self.mul(p[Wire.ID_3], beta), gamma])) n = self.mul(n, self.sum([p[Wire.W_4], self.mul(p[Wire.ID_4], beta), gamma])) # Grand Product Denominator d = self.sum([p[Wire.W_L], self.mul(p[Wire.SIGMA_1], beta), gamma]) d = self.mul(d, self.sum([p[Wire.W_R], self.mul(p[Wire.SIGMA_2], beta), gamma])) d = self.mul(d, self.sum([p[Wire.W_O], self.mul(p[Wire.SIGMA_3], beta), gamma])) d = self.mul(d, self.sum([p[Wire.W_4], self.mul(p[Wire.SIGMA_4], beta), gamma])) acc = self.mul(n, self.add(p[Wire.Z_PERM], p[Wire.LAGRANGE_FIRST])) acc = self.sub( acc, self.mul( d, self.add( p[Wire.Z_PERM_SHIFT], self.mul(p[Wire.LAGRANGE_LAST], public_inputs_delta), ), ), ) evaluations[2] = self.mul(acc, domain_separator) evaluations[3] = self.product( [p[Wire.LAGRANGE_LAST], p[Wire.Z_PERM_SHIFT], domain_separator] ) return evaluations def accumulate_log_derivative_lookup_relation( self, purported_evaluations: list[ModuloCircuitElement], evaluations: list[ModuloCircuitElement], gamma: ModuloCircuitElement, eta: ModuloCircuitElement, eta_two: ModuloCircuitElement, eta_three: ModuloCircuitElement, domain_separator: ModuloCircuitElement, ) -> list[ModuloCircuitElement]: p = purported_evaluations write_term = self.sum( [ p[Wire.TABLE_1], gamma, self.mul(p[Wire.TABLE_2], eta), self.mul(p[Wire.TABLE_3], eta_two), self.mul(p[Wire.TABLE_4], eta_three), ] ) derived_entry_1 = self.sum( [p[Wire.W_L], gamma, self.mul(p[Wire.Q_R], p[Wire.W_L_SHIFT])] ) derived_entry_2 = self.add( p[Wire.W_R], self.mul(p[Wire.Q_M], p[Wire.W_R_SHIFT]) ) derived_entry_3 = self.add( p[Wire.W_O], self.mul(p[Wire.Q_C], p[Wire.W_O_SHIFT]) ) read_term = self.sum( [ derived_entry_1, self.mul(derived_entry_2, eta), self.mul(derived_entry_3, eta_two), self.mul(p[Wire.Q_O], eta_three), ] ) read_inverse = self.mul(p[Wire.LOOKUP_INVERSES], write_term) write_inverse = self.mul(p[Wire.LOOKUP_INVERSES], read_term) inverse_exists_xor = self.sub( self.add(p[Wire.LOOKUP_READ_TAGS], p[Wire.Q_LOOKUP]), self.mul(p[Wire.LOOKUP_READ_TAGS], p[Wire.Q_LOOKUP]), ) accumulator_none = self.product( [read_term, write_term, p[Wire.LOOKUP_INVERSES]] ) accumulator_none = self.sub(accumulator_none, inverse_exists_xor) accumulator_none = self.mul(accumulator_none, domain_separator) accumulator_one = self.mul(p[Wire.Q_LOOKUP], read_inverse) accumulator_one = self.sub( accumulator_one, self.mul(p[Wire.LOOKUP_READ_COUNTS], write_inverse) ) read_tag = p[Wire.LOOKUP_READ_TAGS] read_tag_boolean_relation = self.sub(self.square(read_tag), read_tag) evaluations[4] = accumulator_none evaluations[5] = accumulator_one evaluations[6] = self.mul(read_tag_boolean_relation, domain_separator) return evaluations def accumulate_delta_range_relation( self, purported_evaluations: list[ModuloCircuitElement], evaluations: list[ModuloCircuitElement], domain_separator: ModuloCircuitElement, ) -> list[ModuloCircuitElement]: p = purported_evaluations # Precompute constants minus_one = self.set_or_get_constant(-1) # Precompute common terms q_range = p[Wire.Q_RANGE] q_range_times_domain = self.mul(q_range, domain_separator) # Compute deltas delta_1 = self.sub(p[Wire.W_R], p[Wire.W_L]) delta_2 = self.sub(p[Wire.W_O], p[Wire.W_R]) delta_3 = self.sub(p[Wire.W_4], p[Wire.W_O]) delta_4 = self.sub(p[Wire.W_L_SHIFT], p[Wire.W_4]) # Process each delta for i, delta in enumerate([delta_1, delta_2, delta_3, delta_4]): # Compute delta + (-1), delta + (-2), delta + (-3) efficiently delta_minus_1 = self.add(delta, minus_one) delta_minus_2 = self.add(delta_minus_1, minus_one) # Reuse delta_minus_1 delta_minus_3 = self.add(delta_minus_2, minus_one) # Reuse delta_minus_2 # Compute product efficiently temp = self.mul(delta, delta_minus_1) temp = self.mul(temp, delta_minus_2) temp = self.mul(temp, delta_minus_3) evaluations[7 + i] = self.mul(temp, q_range_times_domain) return evaluations def accumulate_elliptic_relation( self, purported_evaluations: list[ModuloCircuitElement], evaluations: list[ModuloCircuitElement], domain_separator: ModuloCircuitElement, ): p = purported_evaluations # TODO : Do not use arithmetic circuit # Split in two and use Q_is_double as if-else condition in Cairo. x1 = p[Wire.W_R] y1 = p[Wire.W_O] x2 = p[Wire.W_L_SHIFT] y2 = p[Wire.W_4_SHIFT] y3 = p[Wire.W_O_SHIFT] x3 = p[Wire.W_R_SHIFT] q_sign = p[Wire.Q_L] q_is_double = p[Wire.Q_M] x_diff = self.sub(x2, x1) y1_sqr = self.mul(y1, y1) y2_sqr = self.mul(y2, y2) y1y2 = self.product([y1, y2, q_sign]) x_add_identity = self.sum([x3, x2, x1]) x_add_identity = self.product([x_add_identity, x_diff, x_diff]) x_add_identity = self.sub(x_add_identity, y2_sqr) x_add_identity = self.sub(x_add_identity, y1_sqr) x_add_identity = self.add(x_add_identity, y1y2) x_add_identity = self.add(x_add_identity, y1y2) q_is_add = self.sub(self.set_or_get_constant(1), q_is_double) # Point addition, x-coordinate check evaluations[11] = self.product( [ x_add_identity, domain_separator, p[Wire.Q_ELLIPTIC], q_is_add, ] ) # Point addition, y-coordinate check y1_plus_y3 = self.add(y1, y3) y_diff = self.sub(self.mul(y2, q_sign), y1) y_add_identity = self.add( self.mul(y1_plus_y3, x_diff), self.mul(self.sub(x3, x1), y_diff), ) evaluations[12] = self.product( [ y_add_identity, domain_separator, p[Wire.Q_ELLIPTIC], q_is_add, ] ) # Point doubling, x-coordinate check GRUMPKIN_CURVE_B_PARAMETER_NEGATED = self.set_or_get_constant(17) # - (- 17) x_pow_4 = self.mul(self.add(y1_sqr, GRUMPKIN_CURVE_B_PARAMETER_NEGATED), x1) y1_sqr_mul_4 = self.add(y1_sqr, y1_sqr) y1_sqr_mul_4 = self.add(y1_sqr_mul_4, y1_sqr_mul_4) x1_pow_4_mul_9 = self.mul(x_pow_4, self.set_or_get_constant(9)) x_double_identity = self.sub( self.mul(self.sum([x3, x1, x1]), y1_sqr_mul_4), x1_pow_4_mul_9 ) evaluations[11] = self.add( evaluations[11], self.product( [x_double_identity, domain_separator, p[Wire.Q_ELLIPTIC], q_is_double] ), ) # Point doubling, y-coordinate check x1_sqr_mul_3 = self.mul(self.sum([x1, x1, x1]), x1) y_double_identity = self.sub( self.mul(x1_sqr_mul_3, self.sub(x1, x3)), self.mul(self.add(y1, y1), self.add(y1, y3)), ) evaluations[12] = self.add( evaluations[12], self.product( [y_double_identity, domain_separator, p[Wire.Q_ELLIPTIC], q_is_double] ), ) return evaluations def accumulate_memory_relation( self, purported_evaluations: list[ModuloCircuitElement], eta: ModuloCircuitElement, eta_two: ModuloCircuitElement, eta_three: ModuloCircuitElement, evaluations: list[ModuloCircuitElement], domain_separator: ModuloCircuitElement, ) -> list[ModuloCircuitElement]: p = purported_evaluations memory_record_check = self.mul(p[Wire.W_O], eta_three) memory_record_check = self.add( memory_record_check, self.mul(p[Wire.W_R], eta_two) ) memory_record_check = self.add(memory_record_check, self.mul(p[Wire.W_L], eta)) memory_record_check = self.add(memory_record_check, p[Wire.Q_C]) partial_record_check = memory_record_check memory_record_check = self.sub(memory_record_check, p[Wire.W_4]) index_delta = self.sub(p[Wire.W_L_SHIFT], p[Wire.W_L]) record_delta = self.sub(p[Wire.W_4_SHIFT], p[Wire.W_4]) index_is_monotonically_increasing = self.mul( index_delta, self.sub(index_delta, self.set_or_get_constant(1)) ) adjacent_values_match_if_adjacent_indices_match = self.mul( self.add( self.mul(index_delta, self.set_or_get_constant(-1)), self.set_or_get_constant(1), ), record_delta, ) wire_ql_times_qr = self.mul(p[Wire.Q_L], p[Wire.Q_R]) q_memory_times_domain = self.mul(p[Wire.Q_MEMORY], domain_separator) wire_ql_times_qr_times_qmemory_times_domain = self.product( [wire_ql_times_qr, q_memory_times_domain] ) evaluations[14] = self.mul( adjacent_values_match_if_adjacent_indices_match, wire_ql_times_qr_times_qmemory_times_domain, ) evaluations[15] = self.mul( index_is_monotonically_increasing, wire_ql_times_qr_times_qmemory_times_domain, ) ROM_consistency_check_identity = self.mul(memory_record_check, wire_ql_times_qr) access_type = self.sub(p[Wire.W_4], partial_record_check) access_check = self.mul( access_type, self.sub(access_type, self.set_or_get_constant(1)) ) next_gate_access_type = self.sum( [ self.mul(p[Wire.W_O_SHIFT], eta_three), self.mul(p[Wire.W_R_SHIFT], eta_two), self.mul(p[Wire.W_L_SHIFT], eta), ] ) next_gate_access_type = self.sub(p[Wire.W_4_SHIFT], next_gate_access_type) value_delta = self.sub(p[Wire.W_O_SHIFT], p[Wire.W_O]) adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = self.product( [ self.add( self.mul(index_delta, self.set_or_get_constant(-1)), self.set_or_get_constant(1), ), value_delta, self.add( self.mul(next_gate_access_type, self.set_or_get_constant(-1)), self.set_or_get_constant(1), ), ] ) next_gate_access_type_is_boolean = self.sub( self.mul(next_gate_access_type, next_gate_access_type), next_gate_access_type, ) q_o_times_q_memory_times_domain = self.mul(p[Wire.Q_O], q_memory_times_domain) evaluations[16] = self.product( [ adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation, q_o_times_q_memory_times_domain, ] ) evaluations[17] = self.product( [ index_is_monotonically_increasing, q_o_times_q_memory_times_domain, ] ) evaluations[18] = self.product( [ next_gate_access_type_is_boolean, q_o_times_q_memory_times_domain, ] ) RAM_consistency_check_identity = self.mul(access_check, p[Wire.Q_O]) timestamp_delta = self.sub(p[Wire.W_R_SHIFT], p[Wire.W_R]) RAM_timestamp_check_identity = self.mul( self.add( self.mul(index_delta, self.set_or_get_constant(-1)), self.set_or_get_constant(1), ), timestamp_delta, ) RAM_timestamp_check_identity = self.sub( RAM_timestamp_check_identity, p[Wire.W_O] # Fixed: was p[Wire.Q_O] ) memory_identity = self.sum( [ ROM_consistency_check_identity, self.product( [RAM_timestamp_check_identity, self.mul(p[Wire.Q_4], p[Wire.Q_L])] ), self.product([memory_record_check, self.mul(p[Wire.Q_M], p[Wire.Q_L])]), RAM_consistency_check_identity, ] ) memory_identity = self.mul(memory_identity, q_memory_times_domain) evaluations[13] = memory_identity return evaluations def accumulate_nnf_relation( self, purported_evaluations: list[ModuloCircuitElement], evaluations: list[ModuloCircuitElement], domain_separator: ModuloCircuitElement, ) -> list[ModuloCircuitElement]: p = purported_evaluations limb_size = self.set_or_get_constant(2**68) sub_limb_shift = self.set_or_get_constant(2**14) limb_subproduct = self.add( self.mul(p[Wire.W_L], p[Wire.W_R_SHIFT]), self.mul(p[Wire.W_L_SHIFT], p[Wire.W_R]), ) non_native_field_gate_2 = self.sub( self.add( self.mul(p[Wire.W_L], p[Wire.W_4]), self.mul(p[Wire.W_R], p[Wire.W_O]), ), p[Wire.W_O_SHIFT], ) non_native_field_gate_2 = self.mul(non_native_field_gate_2, limb_size) non_native_field_gate_2 = self.sub(non_native_field_gate_2, p[Wire.W_4_SHIFT]) non_native_field_gate_2 = self.add(non_native_field_gate_2, limb_subproduct) non_native_field_gate_2 = self.mul(non_native_field_gate_2, p[Wire.Q_4]) limb_subproduct = self.mul(limb_subproduct, limb_size) limb_subproduct = self.add( limb_subproduct, self.mul(p[Wire.W_L_SHIFT], p[Wire.W_R_SHIFT]), ) non_native_field_gate_1 = limb_subproduct non_native_field_gate_1 = self.sub( non_native_field_gate_1, self.add(p[Wire.W_O], p[Wire.W_4]), ) non_native_field_gate_1 = self.mul(non_native_field_gate_1, p[Wire.Q_O]) non_native_field_gate_3 = limb_subproduct non_native_field_gate_3 = self.add(non_native_field_gate_3, p[Wire.W_4]) non_native_field_gate_3 = self.sub( non_native_field_gate_3, self.add(p[Wire.W_O_SHIFT], p[Wire.W_4_SHIFT]), ) non_native_field_gate_3 = self.mul(non_native_field_gate_3, p[Wire.Q_M]) non_native_field_identity = self.sum( [non_native_field_gate_1, non_native_field_gate_2, non_native_field_gate_3] ) non_native_field_identity = self.mul(non_native_field_identity, p[Wire.Q_R]) limb_accumulator_1 = self.mul(p[Wire.W_R_SHIFT], sub_limb_shift) limb_accumulator_1 = self.add(limb_accumulator_1, p[Wire.W_L_SHIFT]) limb_accumulator_1 = self.mul(limb_accumulator_1, sub_limb_shift) limb_accumulator_1 = self.add(limb_accumulator_1, p[Wire.W_O]) limb_accumulator_1 = self.mul(limb_accumulator_1, sub_limb_shift) limb_accumulator_1 = self.add(limb_accumulator_1, p[Wire.W_R]) limb_accumulator_1 = self.mul(limb_accumulator_1, sub_limb_shift) limb_accumulator_1 = self.add(limb_accumulator_1, p[Wire.W_L]) limb_accumulator_1 = self.sub(limb_accumulator_1, p[Wire.W_4]) limb_accumulator_1 = self.mul(limb_accumulator_1, p[Wire.Q_4]) limb_accumulator_2 = self.mul(p[Wire.W_O_SHIFT], sub_limb_shift) limb_accumulator_2 = self.add(limb_accumulator_2, p[Wire.W_R_SHIFT]) limb_accumulator_2 = self.mul(limb_accumulator_2, sub_limb_shift) limb_accumulator_2 = self.add(limb_accumulator_2, p[Wire.W_L_SHIFT]) limb_accumulator_2 = self.mul(limb_accumulator_2, sub_limb_shift) limb_accumulator_2 = self.add(limb_accumulator_2, p[Wire.W_4]) limb_accumulator_2 = self.mul(limb_accumulator_2, sub_limb_shift) limb_accumulator_2 = self.add(limb_accumulator_2, p[Wire.W_O]) limb_accumulator_2 = self.sub(limb_accumulator_2, p[Wire.W_4_SHIFT]) limb_accumulator_2 = self.mul(limb_accumulator_2, p[Wire.Q_M]) # Fr limb_accumulator_identity = ap.limb_accumulator_1 + ap.limb_accumulator_2; # limb_accumulator_identity = limb_accumulator_identity * wire(p, WIRE.Q_O); // deg 3 limb_accumulator_identity = self.add(limb_accumulator_1, limb_accumulator_2) limb_accumulator_identity = self.mul(limb_accumulator_identity, p[Wire.Q_O]) nnf_identiy = self.add(non_native_field_identity, limb_accumulator_identity) nnf_identiy = self.product([nnf_identiy, p[Wire.Q_NNF], domain_separator]) evaluations[19] = nnf_identiy return evaluations def accumulate_poseidon_external_relation( self, purported_evaluations: list[ModuloCircuitElement], evaluations: list[ModuloCircuitElement], domain_separator: ModuloCircuitElement, ) -> list[ModuloCircuitElement]: p = purported_evaluations s1 = self.add(p[Wire.W_L], p[Wire.Q_L]) s2 = self.add(p[Wire.W_R], p[Wire.Q_R]) s3 = self.add(p[Wire.W_O], p[Wire.Q_O]) s4 = self.add(p[Wire.W_4], p[Wire.Q_4]) u1 = self.pow5(s1) u2 = self.pow5(s2) u3 = self.pow5(s3) u4 = self.pow5(s4) t0 = self.add(u1, u2) t1 = self.add(u3, u4) t2 = self.add(self.add(u2, u2), t1) t3 = self.add(self.add(u4, u4), t0) v4 = self.add(t1, t1) v4 = self.add(self.add(v4, v4), t3) v2 = self.add(t0, t0) v2 = self.add(self.add(v2, v2), t2) v1 = self.add(t3, v2) v3 = self.add(t2, v4) q_pos_by_scaling = self.mul(p[Wire.Q_POSEIDON2_EXTERNAL], domain_separator) evaluations[20] = self.mul(q_pos_by_scaling, self.sub(v1, p[Wire.W_L_SHIFT])) evaluations[21] = self.mul(q_pos_by_scaling, self.sub(v2, p[Wire.W_R_SHIFT])) evaluations[22] = self.mul(q_pos_by_scaling, self.sub(v3, p[Wire.W_O_SHIFT])) evaluations[23] = self.mul(q_pos_by_scaling, self.sub(v4, p[Wire.W_4_SHIFT])) return evaluations def pow5(self, x: ModuloCircuitElement) -> ModuloCircuitElement: x2 = self.mul(x, x) x4 = self.mul(x2, x2) return self.mul(x4, x) def accumulate_poseidon_internal_relation( self, purported_evaluations: list[ModuloCircuitElement], evaluations: list[ModuloCircuitElement], domain_separator: ModuloCircuitElement, ) -> list[ModuloCircuitElement]: p = purported_evaluations INTERNAL_MATRIX_DIAGONAL = [ self.set_or_get_constant( 0x10DC6E9C006EA38B04B1E03B4BD9490C0D03F98929CA1D7FB56821FD19D3B6E7 ), self.set_or_get_constant( 0x0C28145B6A44DF3E0149B3D0A30B3BB599DF9756D4DD9B84A86B38CFB45A740B ), self.set_or_get_constant( 0x00544B8338791518B2C7645A50392798B21F75BB60E3596170067D00141CAC15 ), self.set_or_get_constant( 0x222C01175718386F2E2E82EB122789E352E105A3B8FA852613BC534433EE428B ), ] s1 = self.add(p[Wire.W_L], p[Wire.Q_L]) u1 = self.pow5(s1) u2 = p[Wire.W_R] u3 = p[Wire.W_O] u4 = p[Wire.W_4] u_sum = self.sum([u1, u2, u3, u4]) q_pos_by_scaling = self.mul(p[Wire.Q_POSEIDON2_INTERNAL], domain_separator) v1 = self.add(self.mul(u1, INTERNAL_MATRIX_DIAGONAL[0]), u_sum) evaluations[24] = self.mul(q_pos_by_scaling, self.sub(v1, p[Wire.W_L_SHIFT])) v2 = self.add(self.mul(u2, INTERNAL_MATRIX_DIAGONAL[1]), u_sum) evaluations[25] = self.mul(q_pos_by_scaling, self.sub(v2, p[Wire.W_R_SHIFT])) v3 = self.add(self.mul(u3, INTERNAL_MATRIX_DIAGONAL[2]), u_sum) evaluations[26] = self.mul(q_pos_by_scaling, self.sub(v3, p[Wire.W_O_SHIFT])) v4 = self.add(self.mul(u4, INTERNAL_MATRIX_DIAGONAL[3]), u_sum) evaluations[27] = self.mul(q_pos_by_scaling, self.sub(v4, p[Wire.W_4_SHIFT])) return evaluations def compute_shplemini_msm_scalars( self, p_sumcheck_evaluations: list[ ModuloCircuitElement ], # Full evaluations, not replaced. p_gemini_masking_eval: ModuloCircuitElement, p_gemini_a_evaluations: list[ModuloCircuitElement], p_libra_poly_evals: list[ModuloCircuitElement], tp_gemini_r: ModuloCircuitElement, tp_rho: ModuloCircuitElement, tp_shplonk_z: ModuloCircuitElement, tp_shplonk_nu: ModuloCircuitElement, tp_sumcheck_u_challenges: list[ModuloCircuitElement], ) -> list[ModuloCircuitElement]: assert all(isinstance(i, ModuloCircuitElement) for i in p_sumcheck_evaluations) powers_of_evaluations_challenge = [tp_gemini_r] for i in range(1, self.log_n): powers_of_evaluations_challenge.append( self.square( powers_of_evaluations_challenge[i - 1], ) ) scalars = [self.set_or_get_constant(0)] * ( NUMBER_UNSHIFTED + self.log_n + LIBRA_COMMITMENTS + 3 ) pos_inverted_denominator = self.inv( self.sub(tp_shplonk_z, powers_of_evaluations_challenge[0]) ) neg_inverted_denominator = self.inv( self.add(tp_shplonk_z, powers_of_evaluations_challenge[0]) ) unshifted_scalar = self.add( pos_inverted_denominator, self.mul(tp_shplonk_nu, neg_inverted_denominator), ) shifted_scalar_neg = self.neg( self.mul( self.inv(tp_gemini_r), self.sub( pos_inverted_denominator, self.mul(tp_shplonk_nu, neg_inverted_denominator), ), ) ) scalars[0] = self.set_or_get_constant(1) batching_challenge = tp_rho batched_evaluation = p_gemini_masking_eval unshifted_scalar_neg = self.neg(unshifted_scalar) scalars[1] = unshifted_scalar_neg for i in range(0, NUMBER_UNSHIFTED): scalars[i + 2] = self.mul(unshifted_scalar_neg, batching_challenge) batched_evaluation = self.add( batched_evaluation, self.mul(p_sumcheck_evaluations[i], batching_challenge), ) batching_challenge = self.mul(batching_challenge, tp_rho) for i in range(0, NUMBER_TO_BE_SHIFTED): scalar_offset = i + SHIFTED_COMMITMENTS_START evaluation_offset = i + NUMBER_UNSHIFTED scalars[scalar_offset] = self.add( scalars[scalar_offset], self.mul(shifted_scalar_neg, batching_challenge) ) batched_evaluation = self.add( batched_evaluation, self.mul(p_sumcheck_evaluations[evaluation_offset], batching_challenge), ) # skip last round: if i < NUMBER_TO_BE_SHIFTED - 1: batching_challenge = self.mul(batching_challenge, tp_rho) # computeFoldPosEvaluations def compute_fold_pos_evaluations( tp_sumcheck_u_challenges, batched_eval_accumulator, gemini_evaluations, gemini_eval_challenge_powers, ): fold_pos_evaluations = [self.set_or_get_constant(0)] * self.log_n for i in range(self.log_n, 0, -1): challenge_power = gemini_eval_challenge_powers[i - 1] u = tp_sumcheck_u_challenges[i - 1] eval_neg = gemini_evaluations[i - 1] # (challengePower * batchedEvalAccumulator * Fr.wrap(2)) - evalNeg * (challengePower * (Fr.wrap(1) - u) - u)) # (challengePower * (Fr.wrap(1) - u) term = self.mul( challenge_power, self.sub(self.set_or_get_constant(1), u) ) batched_eval_round_acc = self.sub( self.double(self.mul(challenge_power, batched_eval_accumulator)), self.mul(eval_neg, self.sub(term, u)), ) # (challengePower * (Fr.wrap(1) - u) + u).invert() den = self.add(term, u) batched_eval_round_acc = self.mul(batched_eval_round_acc, self.inv(den)) batched_eval_accumulator = batched_eval_round_acc fold_pos_evaluations[i - 1] = batched_eval_accumulator return fold_pos_evaluations fold_pos_evaluations = compute_fold_pos_evaluations( tp_sumcheck_u_challenges, batched_evaluation, p_gemini_a_evaluations, powers_of_evaluations_challenge, ) constant_term_accumulator = self.mul( fold_pos_evaluations[0], pos_inverted_denominator ) constant_term_accumulator = self.add( constant_term_accumulator, self.product( [ p_gemini_a_evaluations[0], tp_shplonk_nu, neg_inverted_denominator, ] ), ) batching_challenge = self.square(tp_shplonk_nu) boundary = NUMBER_UNSHIFTED + 2 for i in range(self.log_n - 1): dummy_round = i >= (self.log_n - 1) scaling_factor = self.set_or_get_constant(0) if not dummy_round: pos_inverted_denominator = self.inv( self.sub(tp_shplonk_z, powers_of_evaluations_challenge[i + 1]) ) neg_inverted_denominator = self.inv( self.add(tp_shplonk_z, powers_of_evaluations_challenge[i + 1]) ) scaling_factor_pos = self.mul( batching_challenge, pos_inverted_denominator ) scaling_factor_neg = self.mul( batching_challenge, self.mul(tp_shplonk_nu, neg_inverted_denominator), ) scalars[boundary + i] = self.neg( self.add(scaling_factor_neg, scaling_factor_pos) ) accum_contribution = self.mul( scaling_factor_neg, p_gemini_a_evaluations[i + 1] ) accum_contribution = self.add( accum_contribution, self.mul(scaling_factor_pos, fold_pos_evaluations[i + 1]), ) constant_term_accumulator = self.add( constant_term_accumulator, accum_contribution ) else: # print( # f"dummy round {i}, index {NUMBER_OF_ENTITIES + i + 1} is set to 0" # ) pass batching_challenge = self.mul( batching_challenge, self.square(tp_shplonk_nu) ) boundary += self.log_n - 1 denominators = [self.set_or_get_constant(0)] * 4 denominators[0] = self.inv(self.sub(tp_shplonk_z, tp_gemini_r)) denominators[1] = self.inv( self.sub( tp_shplonk_z, self.mul(self.set_or_get_constant(SUBGROUP_GENERATOR), tp_gemini_r), ), ) denominators[2] = denominators[0] denominators[3] = denominators[0] batching_scalars = [self.set_or_get_constant(0)] * 4 batching_challenge = self.mul(batching_challenge, self.square(tp_shplonk_nu)) for i in range(LIBRA_EVALUATIONS): scaling_factor = self.mul(denominators[i], batching_challenge) batching_scalars[i] = self.neg(scaling_factor) # skip last step: if i < LIBRA_EVALUATIONS - 1: batching_challenge = self.mul(batching_challenge, tp_shplonk_nu) constant_term_accumulator = self.add( constant_term_accumulator, self.mul(scaling_factor, p_libra_poly_evals[i]), ) scalars[boundary] = batching_scalars[0] scalars[boundary + 1] = self.add(batching_scalars[1], batching_scalars[2]) scalars[boundary + 2] = batching_scalars[3] scalars[boundary + 3] = constant_term_accumulator scalars[boundary + 4] = tp_shplonk_z return scalars def check_evals_consistency( self, p_libra_evaluation: ModuloCircuitElement, p_libra_poly_evals: list[ModuloCircuitElement], tp_gemini_r: ModuloCircuitElement, tp_sumcheck_u_challenges: list[ModuloCircuitElement], ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: vanishing_poly_eval = self.sub( self.pow(tp_gemini_r, SUBGROUP_SIZE), self.set_or_get_constant(1) ) challenge_poly_lagrange = [self.set_or_get_constant(0)] * SUBGROUP_SIZE challenge_poly_lagrange[0] = self.set_or_get_constant(1) for r in range(self.log_n): curr_idx = 1 + LIBRA_UNIVARIATES_LENGTH * r challenge_poly_lagrange[curr_idx] = self.set_or_get_constant(1) for idx in range(curr_idx + 1, curr_idx + LIBRA_UNIVARIATES_LENGTH): challenge_poly_lagrange[idx] = self.mul( challenge_poly_lagrange[idx - 1], tp_sumcheck_u_challenges[r] ) root_power = self.set_or_get_constant(1) challenge_poly_eval = self.set_or_get_constant(0) denominators = [self.set_or_get_constant(0)] * SUBGROUP_SIZE for idx in range(SUBGROUP_SIZE): denominators[idx] = self.sub( self.mul(root_power, tp_gemini_r), self.set_or_get_constant(1) ) denominators[idx] = self.inv(denominators[idx]) challenge_poly_eval = self.add( challenge_poly_eval, self.mul(challenge_poly_lagrange[idx], denominators[idx]), ) # skip last step: if idx < SUBGROUP_SIZE - 1: root_power = self.mul( root_power, self.set_or_get_constant(SUBGROUP_GENERATOR_INVERSE) ) numerator = self.mul( vanishing_poly_eval, self.set_or_get_constant(pow(SUBGROUP_SIZE, -1, self.field.p)), ) challenge_poly_eval = self.mul(challenge_poly_eval, numerator) lagrange_first = self.mul(denominators[0], numerator) lagrange_last = self.mul(denominators[SUBGROUP_SIZE - 1], numerator) diff = self.mul(lagrange_first, p_libra_poly_evals[2]) diff = self.add( diff, self.mul( self.sub( tp_gemini_r, self.set_or_get_constant(SUBGROUP_GENERATOR_INVERSE) ), self.sub( self.sub(p_libra_poly_evals[1], p_libra_poly_evals[2]), self.mul(p_libra_poly_evals[0], challenge_poly_eval), ), ), ) diff = self.sub( self.add( diff, self.mul( lagrange_last, self.sub(p_libra_poly_evals[2], p_libra_evaluation) ), ), self.mul(vanishing_poly_eval, p_libra_poly_evals[3]), ) return vanishing_poly_eval, diff def check_evals_consistency_split( self, p_libra_evaluation: ModuloCircuitElement, p_libra_poly_evals: list[ModuloCircuitElement], tp_gemini_r: ModuloCircuitElement, tp_sumcheck_u_challenges: list[ModuloCircuitElement], ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: challenge_poly_eval, root_power_times_tp_gemini_r = ( self._check_evals_consistency_init(tp_gemini_r) ) for r in range(self.log_n): challenge_poly_eval, root_power_times_tp_gemini_r = ( self._check_evals_consistency_loop( challenge_poly_eval, root_power_times_tp_gemini_r, tp_sumcheck_u_challenges[r], ) ) vanishing_poly_eval, diff = self._check_evals_consistency_done( p_libra_evaluation, p_libra_poly_evals, tp_gemini_r, challenge_poly_eval, root_power_times_tp_gemini_r, ) return vanishing_poly_eval, diff def _check_evals_consistency_init( self, tp_gemini_r: ModuloCircuitElement, ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: challenge_poly_eval = self.inv( self.sub(tp_gemini_r, self.set_or_get_constant(1)) ) root_power_times_tp_gemini_r = self.mul( self.set_or_get_constant(SUBGROUP_GENERATOR_INVERSE), tp_gemini_r ) return challenge_poly_eval, root_power_times_tp_gemini_r def _check_evals_consistency_loop( self, challenge_poly_eval: ModuloCircuitElement, root_power_times_tp_gemini_r: ModuloCircuitElement, tp_sumcheck_u_challenge: ModuloCircuitElement, ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: challenge_poly_lagrange = self.set_or_get_constant(1) for i in range(LIBRA_UNIVARIATES_LENGTH): denominator = self.inv( self.sub(root_power_times_tp_gemini_r, self.set_or_get_constant(1)) ) challenge_poly_eval = self.add( challenge_poly_eval, self.mul(challenge_poly_lagrange, denominator) ) root_power_times_tp_gemini_r = self.mul( root_power_times_tp_gemini_r, self.set_or_get_constant(SUBGROUP_GENERATOR_INVERSE), ) # skip last step: if i < LIBRA_UNIVARIATES_LENGTH - 1: challenge_poly_lagrange = self.mul( challenge_poly_lagrange, tp_sumcheck_u_challenge ) return challenge_poly_eval, root_power_times_tp_gemini_r def _check_evals_consistency_done( self, p_libra_evaluation: ModuloCircuitElement, p_libra_poly_evals: list[ModuloCircuitElement], tp_gemini_r: ModuloCircuitElement, challenge_poly_eval: ModuloCircuitElement, root_power_times_tp_gemini_r: ModuloCircuitElement, ) -> tuple[ModuloCircuitElement, ModuloCircuitElement]: # We've processed indices 0 to (1 + log_n * 9 - 1) = log_n * 9 # Need to advance root_power for remaining indices up to SUBGROUP_SIZE - 2 # (SUBGROUP_SIZE - 1 is the last index, handled separately for lagrange_last) for _ in range(1 + self.log_n * LIBRA_UNIVARIATES_LENGTH, SUBGROUP_SIZE - 1): root_power_times_tp_gemini_r = self.mul( root_power_times_tp_gemini_r, self.set_or_get_constant(SUBGROUP_GENERATOR_INVERSE), ) denominator_first = self.inv(self.sub(tp_gemini_r, self.set_or_get_constant(1))) denominator_last = self.inv( self.sub(root_power_times_tp_gemini_r, self.set_or_get_constant(1)) ) vanishing_poly_eval = self.sub( self.pow(tp_gemini_r, SUBGROUP_SIZE), self.set_or_get_constant(1) ) numerator = self.mul( vanishing_poly_eval, self.set_or_get_constant(pow(SUBGROUP_SIZE, -1, self.field.p)), ) challenge_poly_eval = self.mul(challenge_poly_eval, numerator) lagrange_first = self.mul(denominator_first, numerator) lagrange_last = self.mul(denominator_last, numerator) diff = self.mul(lagrange_first, p_libra_poly_evals[2]) diff = self.add( diff, self.mul( self.sub( tp_gemini_r, self.set_or_get_constant(SUBGROUP_GENERATOR_INVERSE) ), self.sub( self.sub(p_libra_poly_evals[1], p_libra_poly_evals[2]), self.mul(p_libra_poly_evals[0], challenge_poly_eval), ), ), ) diff = self.sub( self.add( diff, self.mul( lagrange_last, self.sub(p_libra_poly_evals[2], p_libra_evaluation) ), ), self.mul(vanishing_poly_eval, p_libra_poly_evals[3]), ) return vanishing_poly_eval, diff def pow(self, x: ModuloCircuitElement, e: int) -> ModuloCircuitElement: assert e > 0 and ((e - 1) & e) == 0 # supports only powers of 2 shift = e.bit_length() - 1 y = x for i in range(shift): y = self.mul(y, y) return y def get_msm_points_from_vk_and_proof( vk: HonkVk, proof: ZKHonkProof, ) -> list[G1Point]: points = [ proof.shplonk_q, # 0 proof.gemini_masking_poly, # 1 vk.qm, # 2 vk.qc, # 3 vk.ql, # 4 vk.qr, # 5 vk.qo, # 6 vk.q4, # 7 vk.qLookup, # 8 vk.qArith, # 9 vk.qDeltaRange, # 10 vk.qElliptic, # 11 vk.qMemory, # 12 vk.qNnf, # 13 vk.qPoseidon2External, # 14 vk.qPoseidon2Internal, # 15 vk.s1, # 16 vk.s2, # 17 vk.s3, # 18 vk.s4, # 19 vk.id1, # 20 vk.id2, # 21 vk.id3, # 22 vk.id4, # 23 vk.t1, # 24 vk.t2, # 25 vk.t3, # 26 vk.t4, # 27 vk.lagrange_first, # 28 vk.lagrange_last, # 29 proof.w1, # 30 proof.w2, # 31 proof.w3, # 32 proof.w4, # 33 proof.z_perm, # 34 proof.lookup_inverses, # 35 proof.lookup_read_counts, # 36 proof.lookup_read_tags, # 37 ] points.extend(proof.gemini_fold_comms) points.extend(proof.libra_commitments) points.append(G1Point.get_nG(CurveID.BN254, 1)) points.append(proof.kzg_quotient) assert len(points) == NUMBER_UNSHIFTED + vk.log_circuit_size + LIBRA_COMMITMENTS + 3 return points def honk_proof_from_bytes( proof_bytes: bytes, public_inputs_bytes: bytes, vk: HonkVk, system: ProofSystem, ) -> ZKHonkProof: if system == ProofSystem.UltraKeccakZKHonk: return ZKHonkProof.from_bytes(proof_bytes, public_inputs_bytes, vk) else: raise ValueError(f"Invalid system: {system}") def honk_transcript_from_proof( vk: HonkVk, proof: ZKHonkProof, ) -> ZKHonkTranscript: return ZKHonkTranscript.from_proof(vk, proof) class AutoValueEnum(Enum): def __new__(cls, value): obj = object.__new__(cls) obj._value_ = value return obj def __int__(self): return self._value_ def __index__(self): return self._value_ class Wire(AutoValueEnum): Q_M = 0 # Start at 0 for array indexing Q_C = auto() Q_L = auto() Q_R = auto() Q_O = auto() Q_4 = auto() Q_LOOKUP = auto() Q_ARITH = auto() Q_RANGE = auto() Q_ELLIPTIC = auto() Q_MEMORY = auto() Q_NNF = auto() Q_POSEIDON2_EXTERNAL = auto() Q_POSEIDON2_INTERNAL = auto() SIGMA_1 = auto() SIGMA_2 = auto() SIGMA_3 = auto() SIGMA_4 = auto() ID_1 = auto() ID_2 = auto() ID_3 = auto() ID_4 = auto() TABLE_1 = auto() TABLE_2 = auto() TABLE_3 = auto() TABLE_4 = auto() LAGRANGE_FIRST = auto() LAGRANGE_LAST = auto() W_L = auto() W_R = auto() W_O = auto() W_4 = auto() Z_PERM = auto() LOOKUP_INVERSES = auto() LOOKUP_READ_COUNTS = auto() LOOKUP_READ_TAGS = auto() W_L_SHIFT = auto() W_R_SHIFT = auto() W_O_SHIFT = auto() W_4_SHIFT = auto() Z_PERM_SHIFT = auto() @staticmethod def unused_indexes(): return [] @staticmethod def insert_unused_indexes_with_nones(array: list) -> list: assert len(array) == len(Wire) - len(Wire.unused_indexes()) for i in Wire.unused_indexes(): array.insert(i, None) for i in Wire.unused_indexes(): assert array[i] is None assert len(array) == len(Wire) return array @staticmethod def replace_unused_indexes_with_nones(array: list) -> list: for i in Wire.unused_indexes(): array[i] = None return array @staticmethod def remove_unused_indexes(array: list) -> list: for i in Wire.unused_indexes(): array.pop(i) return array if __name__ == "__main__": vk = HonkVk.from_bytes( open( "hydra/garaga/starknet/honk_contract_generator/examples/vk_ultra_keccak.bin", "rb", ).read(), ) proof = honk_proof_from_bytes( open( "hydra/garaga/starknet/honk_contract_generator/examples/proof_ultra_keccak_zk.bin", "rb", ).read(), open( "hydra/garaga/starknet/honk_contract_generator/examples/public_inputs_ultra_keccak.bin", "rb", ).read(), vk, ProofSystem.UltraKeccakZKHonk, ) print(vk.to_cairo()) print(proof.to_cairo()) print(f"\n\n") tp = honk_transcript_from_proof(vk, proof) print(f"\n\n") print(tp.to_cairo()) print(f"\n\n") print(Wire.unused_indexes()) print(tp) ================================================ FILE: hydra/garaga/rsa_rns.py ================================================ """RSA-2048 signature verification via RNS arithmetic and CRT exactness. Implements RSA-2048 modular exponentiation verification suitable for provable computation (Cairo/STARK). Integers in [0, 2^2048) are represented in a Residue Number System (RNS) defined by 11 pairwise coprime ~384-bit primes. A modular product a·b ≡ r (mod n) is witnessed by the Euclidean quotient q satisfying a·b = q·n + r. Correctness is verified through: 1. Channel congruences: for each prime p_i, a·b ≡ q·n + r (mod p_i). 2. CRT exactness: since |a·b - q·n - r| < M = ∏ p_i and the congruences force a·b - q·n - r ≡ 0 (mod M), the relation holds exactly over ℤ. RSA-2048 verification computes s^{65537} mod n via square-and-multiply, yielding 16 squarings + 1 final multiplication = 17 certified reductions. """ from __future__ import annotations import hashlib import math import random from dataclasses import dataclass from typing import Sequence LIMB_BITS = 96 BASE = 1 << LIMB_BITS N_LIMBS = 22 RSA_BITS = 2048 TOP_LIMB_BITS = RSA_BITS - LIMB_BITS * (N_LIMBS - 1) TOP_LIMB_MAX = 1 << TOP_LIMB_BITS MAX_2048 = 1 << RSA_BITS N_CHUNKS = 6 CHUNK_LIMBS = 4 TOP_CHUNK_BITS = 128 RSA_REDUCTION_COUNT = 17 RSA_PUBLIC_EXPONENT = 65537 # Upper bound on |a·b - q·n - r| for a, b, q, n, r < 2^2048. # The CRT modulus M = ∏ p_i must exceed this to guarantee exactness. CRT_EXACTNESS_BOUND = (1 << (2 * RSA_BITS + 1)) + (1 << RSA_BITS) CHANNEL_MODULI = [ 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498787617, 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498787149, 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498785261, 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498784349, 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498783539, 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498782649, 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498782327, 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498781403, 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498781199, 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498780291, 4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498779421, ] def modinv(a: int, m: int) -> int: return pow(a, -1, m) def split_words_96(x: int, n_words: int) -> list[int]: return [(x >> (LIMB_BITS * i)) & (BASE - 1) for i in range(n_words)] def join_words_96(words: Sequence[int]) -> int: out = 0 for i, word in enumerate(words): if not (0 <= word < BASE): raise ValueError(f"96-bit word {i} out of range") out |= word << (LIMB_BITS * i) return out def split_limbs_2048(x: int) -> list[int]: if not (0 <= x < MAX_2048): raise ValueError("value is not a non-negative 2048-bit integer") limbs = split_words_96(x, N_LIMBS) if limbs[-1] >= TOP_LIMB_MAX: raise ValueError("top limb exceeds the 32-bit RSA-2048 bound") return limbs def join_limbs_2048(limbs: Sequence[int]) -> int: if len(limbs) != N_LIMBS: raise ValueError(f"expected {N_LIMBS} limbs, got {len(limbs)}") x = join_words_96(limbs) if x >= MAX_2048: raise ValueError("reconstructed integer exceeds 2048 bits") if limbs[-1] >= TOP_LIMB_MAX: raise ValueError("top limb exceeds the 32-bit RSA-2048 bound") return x def limbs_to_chunks(limbs: Sequence[int]) -> tuple[int, ...]: """Group 22 limbs of 96 bits into 6 chunks of 384 bits (top chunk: 128 bits).""" if len(limbs) != N_LIMBS: raise ValueError(f"expected {N_LIMBS} limbs, got {len(limbs)}") padded_limbs = list(limbs) + [0, 0] chunks = [] for chunk_index in range(N_CHUNKS): start = chunk_index * CHUNK_LIMBS end = start + CHUNK_LIMBS chunks.append(join_words_96(padded_limbs[start:end])) if chunks[-1] >= (1 << TOP_CHUNK_BITS): raise ValueError("top chunk exceeds the 128-bit RSA-2048 bound") return tuple(chunks) def is_probable_prime(n: int, rounds: int = 24) -> bool: if n < 2: return False small_primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37) for p in small_primes: if n % p == 0: return n == p d = n - 1 s = 0 while d % 2 == 0: s += 1 d //= 2 rng = random.Random((n ^ 0x9E3779B97F4A7C15) & ((1 << 64) - 1)) for _ in range(rounds): a = rng.randrange(2, n - 1) x = pow(a, d, n) if x in (1, n - 1): continue for __ in range(s - 1): x = pow(x, 2, n) if x == n - 1: break else: return False return True def random_probable_prime(bits: int, rng: random.Random) -> int: while True: candidate = rng.getrandbits(bits) | (1 << (bits - 1)) | 1 while candidate.bit_length() == bits: if is_probable_prime(candidate): return candidate candidate += 2 @dataclass(frozen=True, slots=True) class RNSInteger: """An integer x in [0, 2^2048) together with its RNS representation. Attributes: value: The integer x. limbs: 96-bit limb decomposition, x = sum(limbs[i] * 2^{96i}). residues: Channel residues, residues[i] = x mod p_i. """ value: int limbs: tuple[int, ...] residues: tuple[int, ...] @staticmethod def from_int(x: int, channel_moduli: Sequence[int]) -> "RNSInteger": limbs = tuple(split_limbs_2048(x)) residues = tuple(x % p for p in channel_moduli) return RNSInteger(value=x, limbs=limbs, residues=residues) @property def chunks(self) -> tuple[int, ...]: return limbs_to_chunks(self.limbs) def serialize_to_calldata(self) -> list[int]: calldata = [] for chunk in self.chunks: calldata.extend(split_words_96(chunk, CHUNK_LIMBS)) return calldata @dataclass(frozen=True, slots=True) class ReductionWitness: """Witness for a modular reduction a * b = q * n + r over Z. Attributes: quotient: q = floor(a*b / n) as an RNS integer. remainder: r = (a*b) mod n as an RNS integer. """ quotient: RNSInteger remainder: RNSInteger def serialize_to_calldata(self) -> list[int]: return ( self.quotient.serialize_to_calldata() + self.remainder.serialize_to_calldata() ) @dataclass(frozen=True, slots=True) class RSA2048ExponentiationWitness: """Complete witness for RSA-2048 verification: s^e = m (mod n). Contains the modulus n, signature s, expected message m, and 17 reduction witnesses certifying the square-and-multiply chain for s^{65537} mod n. """ modulus: RNSInteger signature: RNSInteger expected_message: RNSInteger reductions: tuple[ReductionWitness, ...] def __post_init__(self) -> None: if len(self.reductions) != RSA_REDUCTION_COUNT: raise ValueError( f"expected {RSA_REDUCTION_COUNT} reductions, got {len(self.reductions)}" ) def serialize_public_key(self) -> list[int]: return self.modulus.serialize_to_calldata() def serialize_signature_with_hint(self) -> list[int]: calldata = ( self.signature.serialize_to_calldata() + self.expected_message.serialize_to_calldata() ) for witness in self.reductions: calldata.extend(witness.serialize_to_calldata()) return calldata def serialize(self, prepend_public_key: bool = True) -> list[int]: calldata = [] if prepend_public_key: calldata.extend(self.serialize_public_key()) calldata.extend(self.serialize_signature_with_hint()) return calldata class RNSContext: """RNS arithmetic context for CRT-based exact modular verification. Defines the RNS basis {p_1, ..., p_k} and precomputes CRT reconstruction coefficients. The product M = prod(p_i) must exceed CRT_EXACTNESS_BOUND to guarantee that channel congruences imply integer equality. Attributes: primes: Channel primes p_1, ..., p_k. M: CRT modulus, M = prod(p_i). cofactors: CRT cofactors, M_i = M / p_i. cofactor_inverses: CRT lifting coefficients, M_i^{-1} mod p_i. """ def __init__(self, channel_moduli: Sequence[int]) -> None: self.primes = list(channel_moduli) if not self.primes: raise ValueError("at least one channel modulus is required") if len(set(self.primes)) != len(self.primes): raise ValueError("channel moduli must be distinct") if not all(p < BASE**4 for p in self.primes): raise ValueError("channel moduli must fit in 4 x 96-bit words") if not all(is_probable_prime(p) for p in self.primes): raise ValueError("channel moduli must be prime") if math.prod(self.primes) <= CRT_EXACTNESS_BOUND: raise ValueError("CRT modulus is too small for exactness") self.M = math.prod(self.primes) self.cofactors = [self.M // p for p in self.primes] self.cofactor_inverses = [ pow(M_i, -1, p) for M_i, p in zip(self.cofactors, self.primes) ] def encode(self, x: int) -> RNSInteger: return RNSInteger.from_int(x, self.primes) def residues_from_limbs(self, limbs: Sequence[int]) -> tuple[int, ...]: """Compute channel residues directly from the limb decomposition.""" _ = join_limbs_2048(limbs) out = [] for p in self.primes: acc = 0 for limb in reversed(limbs): acc = (acc * BASE + limb) % p out.append(acc) return tuple(out) def crt_reconstruct(self, residues: Sequence[int]) -> int: """Reconstruct x in [0, M) from its channel residues via the CRT.""" if len(residues) != len(self.primes): raise ValueError("wrong number of residues") x = 0 for r_i, p_i, M_i, M_i_inv in zip( residues, self.primes, self.cofactors, self.cofactor_inverses ): if not (0 <= r_i < p_i): raise ValueError("residue out of range") x = (x + r_i * M_i * M_i_inv) % self.M return x def is_consistent_encoding(self, ev: RNSInteger) -> bool: """Check that limbs and residues are consistent with the integer value.""" try: value_from_limbs = join_limbs_2048(ev.limbs) except ValueError: return False if value_from_limbs != ev.value: return False return ev.residues == self.residues_from_limbs(ev.limbs) def rns_congruences_hold( self, a: RNSInteger, b: RNSInteger, modulus: RNSInteger, quotient: RNSInteger, remainder: RNSInteger, ) -> bool: """Check a*b = q*n + r (mod p_i) in every RNS channel.""" for ev in (a, b, modulus, quotient, remainder): if not self.is_consistent_encoding(ev): return False if not (0 <= remainder.value < modulus.value): return False for idx, p in enumerate(self.primes): lhs = (a.residues[idx] * b.residues[idx]) % p rhs = ( quotient.residues[idx] * modulus.residues[idx] + remainder.residues[idx] ) % p if lhs != rhs: return False return True def crt_exactness_holds( self, a: RNSInteger, b: RNSInteger, modulus: RNSInteger, quotient: RNSInteger, remainder: RNSInteger, ) -> bool: """Check |delta| < M and delta = 0 (mod M) where delta = a*b - q*n - r.""" delta = a.value * b.value - quotient.value * modulus.value - remainder.value return (delta % self.M == 0) and (abs(delta) < self.M) def verify_exact_modular_product( self, a: RNSInteger, b: RNSInteger, modulus: RNSInteger, quotient: RNSInteger, remainder: RNSInteger, ) -> bool: """Verify a*b = q*n + r exactly via RNS congruences and CRT exactness.""" if not self.rns_congruences_hold(a, b, modulus, quotient, remainder): return False if not self.crt_exactness_holds(a, b, modulus, quotient, remainder): return False return a.value * b.value == quotient.value * modulus.value + remainder.value def witness_modular_product( ctx: RNSContext, a: int, b: int, modulus: int ) -> tuple[RNSInteger, RNSInteger, RNSInteger, RNSInteger, RNSInteger]: """Compute the RNS encoding of (a, b, n, q, r) where a*b = q*n + r.""" if not (0 <= a < modulus and 0 <= b < modulus and 1 < modulus < MAX_2048): raise ValueError("require 0 <= a,b < modulus < 2^2048 and modulus > 1") quotient, remainder = divmod(a * b, modulus) return ( ctx.encode(a), ctx.encode(b), ctx.encode(modulus), ctx.encode(quotient), ctx.encode(remainder), ) def build_reduction_witness( ctx: RNSContext, a: int, b: int, modulus: int ) -> ReductionWitness: """Build and verify a reduction witness for a*b mod n.""" a_ev, b_ev, modulus_ev, quotient_ev, remainder_ev = witness_modular_product( ctx, a, b, modulus ) if not ctx.verify_exact_modular_product( a_ev, b_ev, modulus_ev, quotient_ev, remainder_ev ): raise AssertionError("exact RNS/CRT modular multiplication check failed") return ReductionWitness(quotient=quotient_ev, remainder=remainder_ev) def verified_mul_mod(ctx: RNSContext, x: int, y: int, modulus: int) -> int: """Compute x*y mod n with a verified RNS reduction.""" return build_reduction_witness(ctx, x, y, modulus).remainder.value def generate_demo_rsa_key( bits: int = RSA_BITS, e: int = RSA_PUBLIC_EXPONENT, seed: int = 20260305, ) -> tuple[int, int, int]: if bits != RSA_BITS: raise ValueError("this helper is written around RSA-2048") rng = random.Random(seed) half = bits // 2 while True: p = random_probable_prime(half, rng) if math.gcd(p - 1, e) == 1: break while True: q = random_probable_prime(half, rng) if q != p and math.gcd(q - 1, e) == 1: break modulus = p * q if modulus.bit_length() != bits: return generate_demo_rsa_key(bits=bits, e=e, seed=seed + 1) phi = (p - 1) * (q - 1) private_exponent = modinv(e, phi) return modulus, e, private_exponent def build_rsa2048_reductions( ctx: RNSContext, signature: int, expected_message: int, modulus: int, e: int = RSA_PUBLIC_EXPONENT, ) -> tuple[ReductionWitness, ...]: """Compute all reduction witnesses for the square-and-multiply chain s^e mod n. For e = 65537 = 2^16 + 1, the binary representation has 17 bits, yielding 16 squarings and 1 final multiplication = 17 reductions. """ bits = bin(e)[2:] if bits[0] != "1": raise ValueError("public exponent must be positive") acc = signature reductions = [] for bit in bits[1:]: squaring = build_reduction_witness(ctx, acc, acc, modulus) reductions.append(squaring) acc = squaring.remainder.value if bit == "1": multiply = build_reduction_witness(ctx, acc, signature, modulus) reductions.append(multiply) acc = multiply.remainder.value if acc != expected_message: raise AssertionError("witness path does not yield the expected message") if len(reductions) != RSA_REDUCTION_COUNT: raise AssertionError( f"expected {RSA_REDUCTION_COUNT} reductions, got {len(reductions)}" ) return tuple(reductions) def generate_rsa2048_witness(seed: int = 0) -> RSA2048ExponentiationWitness: """Generate a complete RSA-2048 verification witness from a deterministic seed.""" ctx = RNSContext(CHANNEL_MODULI) modulus, e, private_exponent = generate_demo_rsa_key(seed=20260305 + seed) rng = random.Random(0x5253412048 + seed) expected_message = rng.randrange(2, modulus - 1) signature = pow(expected_message, private_exponent, modulus) reductions = build_rsa2048_reductions( ctx, signature, expected_message, modulus, e=e ) return RSA2048ExponentiationWitness( modulus=ctx.encode(modulus), signature=ctx.encode(signature), expected_message=ctx.encode(expected_message), reductions=reductions, ) # PKCS#1 v1.5 SHA-256 DigestInfo prefix (DER-encoded AlgorithmIdentifier + NULL param). # RFC 8017, Section 9.2, Note 1. PKCS1_SHA256_DIGEST_INFO_PREFIX = bytes.fromhex( "3031300d060960864801650304020105000420" ) def pkcs1_v1_5_encode_sha256( message_hash: bytes, modulus_byte_length: int = 256 ) -> int: """Encode a SHA-256 hash as a PKCS#1 v1.5 padded integer. Constructs: 0x00 || 0x01 || PS || 0x00 || DigestInfo || H where PS is (modulus_byte_length - 3 - len(DigestInfo) - 32) bytes of 0xFF. For RSA-2048 (modulus_byte_length=256), PS is 202 bytes of 0xFF. """ if len(message_hash) != 32: raise ValueError("message_hash must be exactly 32 bytes (SHA-256)") digest_info = PKCS1_SHA256_DIGEST_INFO_PREFIX + message_hash ps_len = modulus_byte_length - 3 - len(digest_info) if ps_len < 8: raise ValueError("modulus too short for PKCS#1 v1.5 SHA-256 encoding") encoded = b"\x00\x01" + b"\xff" * ps_len + b"\x00" + digest_info return int.from_bytes(encoded, byteorder="big") def generate_rsa2048_sha256_witness( message: bytes, seed: int = 0 ) -> RSA2048ExponentiationWitness: """Generate an RSA-2048 verification witness for a SHA-256 message digest. Signs the PKCS#1 v1.5 encoding of SHA-256(message) under a deterministic demo key, then builds the full exponentiation witness. """ ctx = RNSContext(CHANNEL_MODULI) modulus, e, private_exponent = generate_demo_rsa_key(seed=20260305 + seed) message_hash = hashlib.sha256(message).digest() expected_message = pkcs1_v1_5_encode_sha256(message_hash) signature = pow(expected_message, private_exponent, modulus) reductions = build_rsa2048_reductions( ctx, signature, expected_message, modulus, e=e ) return RSA2048ExponentiationWitness( modulus=ctx.encode(modulus), signature=ctx.encode(signature), expected_message=ctx.encode(expected_message), reductions=reductions, ) def is_valid_rsa2048_witness( bundle: RSA2048ExponentiationWitness, ctx: RNSContext | None = None, ) -> bool: """Validate an RSA-2048 exponentiation witness. Checks encoding consistency, range constraints, and all 17 modular reduction steps of the square-and-multiply chain. """ ctx = ctx or RNSContext(CHANNEL_MODULI) if not ctx.is_consistent_encoding(bundle.modulus): return False if not ctx.is_consistent_encoding(bundle.signature): return False if not ctx.is_consistent_encoding(bundle.expected_message): return False if bundle.modulus.value <= 1 or bundle.modulus.value % 2 == 0: return False if bundle.signature.value >= bundle.modulus.value: return False if bundle.expected_message.value >= bundle.modulus.value: return False if len(bundle.reductions) != RSA_REDUCTION_COUNT: return False acc = bundle.signature for witness in bundle.reductions[:-1]: if not ctx.verify_exact_modular_product( acc, acc, bundle.modulus, witness.quotient, witness.remainder ): return False acc = witness.remainder last = bundle.reductions[-1] if not ctx.verify_exact_modular_product( acc, bundle.signature, bundle.modulus, last.quotient, last.remainder ): return False return last.remainder.value == bundle.expected_message.value def modular_exponentiation_with_proof( ctx: RNSContext, signature: int, e: int, modulus: int ) -> tuple[int, int]: """Compute s^e mod n via square-and-multiply with verified reductions. Returns (result, reduction_count). """ bits = bin(e)[2:] if bits[0] != "1": raise ValueError("public exponent must be positive") acc = signature reduction_count = 0 for bit in bits[1:]: acc = verified_mul_mod(ctx, acc, acc, modulus) reduction_count += 1 if bit == "1": acc = verified_mul_mod(ctx, acc, signature, modulus) reduction_count += 1 return acc, reduction_count def demo_context_summary(ctx: RNSContext) -> None: print("== RNS context for exact modular arithmetic ==") print(f"Base B = 2^{LIMB_BITS}") print( f"Big-int format = {N_LIMBS} limbs of 96 bits (top limb constrained to {TOP_LIMB_BITS} bits)" ) print(f"Number of CRT channels = {len(ctx.primes)}") print( f"Each channel prime fits in 4 x 96-bit words: {all(p < BASE**4 for p in ctx.primes)}" ) print(f"Channel prime bit lengths = {[p.bit_length() for p in ctx.primes]}") print(f"CRT modulus M bit length = {ctx.M.bit_length()}") print(f"CRT modulus M > exactness bound: {ctx.M > CRT_EXACTNESS_BOUND}") print("First channel prime split into four 96-bit words:") print(f" {split_words_96(ctx.primes[0], 4)}") print() def demo_crt_roundtrip(ctx: RNSContext, rng: random.Random) -> None: print("== CRT roundtrip from limb-consistent residues ==") for idx in range(1, 4): x = rng.getrandbits(RSA_BITS - 1) ev = ctx.encode(x) x_recovered = ctx.crt_reconstruct(ev.residues) assert x_recovered == x print( f" sample {idx}: recovered exact {x.bit_length()}-bit value from residues" ) print() def demo_single_exact_relation( ctx: RNSContext, modulus: int, rng: random.Random ) -> None: print("== One exact modular product witness check ==") a = rng.randrange(0, modulus) b = rng.randrange(0, modulus) a_ev, b_ev, modulus_ev, quotient_ev, remainder_ev = witness_modular_product( ctx, a, b, modulus ) assert ctx.rns_congruences_hold(a_ev, b_ev, modulus_ev, quotient_ev, remainder_ev) assert ctx.crt_exactness_holds(a_ev, b_ev, modulus_ev, quotient_ev, remainder_ev) assert ctx.verify_exact_modular_product( a_ev, b_ev, modulus_ev, quotient_ev, remainder_ev ) print(f" modulus bits = {modulus.bit_length()}") print(f" a bits = {a.bit_length()}") print(f" b bits = {b.bit_length()}") print(f" q bits = {quotient_ev.value.bit_length()}") print(f" r bits = {remainder_ev.value.bit_length()}") print(" All channel congruences passed, 0 <= r < n verified,") print(" and CRT exactness implies a*b = q*n + r over Z.") print() def demo_negative_tests(ctx: RNSContext, modulus: int, rng: random.Random) -> None: print("== Negative tests (tampering is detected) ==") a = rng.randrange(0, modulus) b = rng.randrange(0, modulus) a_ev, b_ev, modulus_ev, quotient_ev, remainder_ev = witness_modular_product( ctx, a, b, modulus ) bad_residues = list(remainder_ev.residues) bad_residues[0] = (bad_residues[0] + 1) % ctx.primes[0] bad_remainder = RNSInteger( remainder_ev.value, remainder_ev.limbs, tuple(bad_residues) ) assert not ctx.rns_congruences_hold( a_ev, b_ev, modulus_ev, quotient_ev, bad_remainder ) bad_limbs = list(quotient_ev.limbs) bad_limbs[1] ^= 1 bad_quotient = RNSInteger(quotient_ev.value, tuple(bad_limbs), quotient_ev.residues) assert not ctx.is_consistent_encoding(bad_quotient) print(" Tampered residue detected: PASS") print(" Tampered limb detected: PASS") print() def demo_full_rsa_verification(ctx: RNSContext) -> None: print("== Full RSA-2048 verification via square-and-multiply ==") modulus, e, private_exponent = generate_demo_rsa_key() rng = random.Random(999) message = rng.randrange(2, modulus - 1) signature = pow(message, private_exponent, modulus) verified_message, reduction_count = modular_exponentiation_with_proof( ctx, signature, e, modulus ) assert verified_message == message assert verified_message == pow(signature, e, modulus) print(f" RSA modulus bits = {modulus.bit_length()}") print(f" public exponent e = {e}") print(f" signature verification succeeded = {verified_message == message}") print(f" verified modular reductions = {reduction_count}") print( " For e = 65537 = 2^16 + 1, the chain uses 16 squarings + 1 multiply = 17 reductions." ) print() def run_self_tests() -> None: ctx = RNSContext(CHANNEL_MODULI) rng = random.Random(123456789) demo_context_summary(ctx) demo_crt_roundtrip(ctx, rng) modulus, _, _ = generate_demo_rsa_key() demo_single_exact_relation(ctx, modulus, rng) demo_negative_tests(ctx, modulus, rng) demo_full_rsa_verification(ctx) bundle = generate_rsa2048_witness() assert is_valid_rsa2048_witness(bundle, ctx) print("All demonstrations and assertions passed.") if __name__ == "__main__": run_self_tests() ================================================ FILE: hydra/garaga/signature.py ================================================ """ Various tools for bls signatures or other signature schemes. """ from __future__ import annotations import hashlib from typing import Protocol, TypeVar from garaga.algebra import Polynomial, PyFelt, RationalFunction from garaga.curves import CURVES, CurveID, get_base_field from garaga.points import G1Point T = TypeVar("T", bound="HashProtocol") class HashProtocol(Protocol): # Attributes block_size: int # digest_size: int # in bytes name: str # Methods def update(self, data: bytes) -> None: ... def digest(self) -> bytes: ... def hexdigest(self) -> str: ... def copy(self: T) -> T: ... import math G1_DOMAIN = DST = b"BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_" MAX_DST_LENGTH = 255 LONG_DST_PREFIX = b"H2C-OVERSIZE-DST-" class ExpanderXmd: def __init__( self, hash_name: str, dst: bytes = DST, curve_id: CurveID = CurveID.BLS12_381, ): self.hash_name = hash_name self.hasher = hashlib.new(hash_name) self.dst = dst self.curve_id = curve_id self.block_size = get_len_per_elem(get_base_field(curve_id).p) def construct_dst_prime(self) -> bytes: if len(self.dst) > MAX_DST_LENGTH: hasher_copy = self.hasher.copy() hasher_copy.update(LONG_DST_PREFIX) hasher_copy.update(self.dst) dst_prime = hasher_copy.digest() else: # print(f"dst len is < {MAX_DST_LENGTH}") dst_prime = self.dst dst_prime += bytes([len(dst_prime)]) return dst_prime def expand_message_xmd(self, msg: bytes, n: int) -> bytes: b_len = self.hasher.digest_size ell = (n + (b_len - 1)) // b_len assert ( ell <= 255 ), "The ratio of desired output to the output size of hash function is too large!" dst_prime = self.construct_dst_prime() # print(f"dst prime {dst_prime}") # print(f"block size {self.block_size}") z_pad = bytes([0] * self.block_size) # print(f"z pad {z_pad.hex()}") # print(f"len(z_pad) (bytes) {len(z_pad)}") assert n < (1 << 16), "Length should be smaller than 2^16" lib_str = n.to_bytes(2, "big") self.hasher.update(z_pad) self.hasher.update(msg) # Print separately lib_str+bytes([0])+dst_prime, in one bytes object lib_str_dst_prime = lib_str + bytes([0]) + dst_prime # print( # f"lib_str_dst_prime {lib_str_dst_prime}, len : {len(lib_str_dst_prime)}\n {bytes_to_u32_array(lib_str_dst_prime, 'lib_str_dst_prime')}" # ) self.hasher.update(lib_str_dst_prime) # self.hasher.update(bytes([0])) # self.hasher.update(dst_prime) b0 = self.hasher.digest() # print(f"b0 {b0.hex()}") hasher = hashlib.new(self.hash_name) hasher.update(b0) one_dst_prime = bytes([1]) + dst_prime hasher.update(one_dst_prime) bi = hasher.digest() uniform_bytes = bi for i in range(2, ell + 1): # print(f"loop: step {i}/{ell}") # print(f"zip {list(zip(b0, bi))}") b0_xor_bi = bytes(x ^ y for x, y in zip(b0, bi)) # print(f"b0_xor_bi {b0_xor_bi.hex()}") # print( # f"direct xor : {hex(int.from_bytes(b0, 'big') ^ int.from_bytes(bi, 'big'))}" # ) hasher = hashlib.new(self.hash_name) hasher.update(b0_xor_bi) bytes_i_dst_prime = bytes([i]) + dst_prime # print( # f"bytes_i_dst_prime {bytes_to_u32_array(bytes_i_dst_prime, f'bytes_{i}_dst_prime')}" # ) hasher.update(bytes_i_dst_prime) bi = hasher.digest() uniform_bytes += bi # print(f"len(uniform_bytes) {len(uniform_bytes)}") # print(f"len(uniform_bytes[:n]) {len(uniform_bytes[:n])}") return uniform_bytes[:n] def get_len_per_elem(p: int, sec_param: int = 128) -> int: """ This function computes the length in bytes that a hash function should output for hashing an element of type `Field`. :param p: The prime modulus of the base field. :param sec_param: The security parameter. :return: The length in bytes. """ # ceil(log2(p)) base_field_size_in_bits = p.bit_length() # ceil(log2(p)) + security_parameter base_field_size_with_security_padding_in_bits = base_field_size_in_bits + sec_param # ceil((ceil(log2(p)) + security_parameter) / 8) bytes_per_base_field_elem = math.ceil( base_field_size_with_security_padding_in_bits / 8 ) return bytes_per_base_field_elem def hash_to_field( message: bytes, count: int, curve_id: int, hash_name: str ) -> list[int]: field = get_base_field(curve_id) expander = ExpanderXmd(hash_name, dst=DST, curve_id=curve_id) len_per_elem = get_len_per_elem(field.p) len_in_bytes = count * len_per_elem # print(f"len per elem {len_per_elem}") # print(f"len in bytes: {len_in_bytes}") # print(f"message {message.hex()}") uniform_bytes = expander.expand_message_xmd(message, len_in_bytes) # print(f"uniform bytes {uniform_bytes.hex()}") output = [] for i in range(0, len_in_bytes, len_per_elem): element = int.from_bytes(uniform_bytes[i : i + len_per_elem], "big") # print(f"element {element.bit_length()}") output.append(element) return [field(x) for x in output] def hash_to_curve( message: bytes, curve_id: CurveID, hash_name: str = "sha256" ) -> G1Point: felt0, felt1 = hash_to_field(message, 2, curve_id, hash_name) pt0 = map_to_curve(felt0, curve_id) # print(f"pt0 {pt0}\n\n") pt1 = map_to_curve(felt1, curve_id) # print(f"pt1 {pt1}") assert pt0.iso_point == True, f"Point {pt0} is not an iso point" assert pt1.iso_point == True, f"Point {pt1} is not an iso point" if curve_id == CurveID.BLS12_381: x = CURVES[curve_id.value].x n = CURVES[curve_id.value].n cofactor = (1 - (x % n)) % n else: cofactor = CURVES[curve_id.value].h # print(f"cofactor {cofactor}") sum = pt0.add(pt1) assert sum.iso_point == True, f"Point {sum} is not an iso point" return apply_isogeny(sum).scalar_mul(cofactor) def map_to_curve(field_element: PyFelt, curve_id: CurveID) -> G1Point: field = get_base_field(curve_id) a = field(CURVES[curve_id.value].swu_params.A) b = field(CURVES[curve_id.value].swu_params.B) z = field(CURVES[curve_id.value].swu_params.Z) u = field_element zeta_u2 = z * u**2 ta = zeta_u2**2 + zeta_u2 num_x1 = b * (ta + field.one()) if ta.value == 0: div = a * z else: div = a * -ta num2_x1 = num_x1**2 div2 = div**2 div3 = div2 * div assert div3.value != 0 num_gx1 = (num2_x1 + a * div2) * num_x1 + b * div3 num_x2 = zeta_u2 * num_x1 gx1 = num_gx1 / div3 gx1_square = gx1.is_quad_residue() if gx1_square: y1 = gx1.sqrt(min_root=False) assert y1 * y1 == gx1 else: y1 = (z * gx1).sqrt(min_root=False) assert y1 * y1 == z * gx1 y2 = zeta_u2 * u * y1 num_x = num_x1 if gx1_square else num_x2 y = y1 if gx1_square else y2 x_affine = num_x / div y_affine = -y if y.value % 2 != u.value % 2 else y point_on_curve = G1Point(x_affine.value, y_affine.value, curve_id, iso_point=True) return point_on_curve # https://github.com/arkworks-rs/algebra/blob/master/curves/bls12_381/src/curves/g1_swu_iso.rs def get_isogeny_to_g1_map( curve_id: CurveID, ) -> tuple[RationalFunction, RationalFunction]: field = get_base_field(curve_id) match curve_id.value: case CurveID.BLS12_381.value: return RationalFunction( numerator=Polynomial( [ field(x) for x in [ 0x11A05F2B1E833340B809101DD99815856B303E88A2D7005FF2627B56CDB4E2C85610C2D5F2E62D6EAEAC1662734649B7, 0x17294ED3E943AB2F0588BAB22147A81C7C17E75B2F6A8417F565E33C70D1E86B4838F2A6F318C356E834EEF1B3CB83BB, 0xD54005DB97678EC1D1048C5D10A9A1BCE032473295983E56878E501EC68E25C958C3E3D2A09729FE0179F9DAC9EDCB0, 0x1778E7166FCC6DB74E0609D307E55412D7F5E4656A8DBF25F1B33289F1B330835336E25CE3107193C5B388641D9B6861, 0xE99726A3199F4436642B4B3E4118E5499DB995A1257FB3F086EEB65982FAC18985A286F301E77C451154CE9AC8895D9, 0x1630C3250D7313FF01D1201BF7A74AB5DB3CB17DD952799B9ED3AB9097E68F90A0870D2DCAE73D19CD13C1C66F652983, 0xD6ED6553FE44D296A3726C38AE652BFB11586264F0F8CE19008E218F9C86B2A8DA25128C1052ECADDD7F225A139ED84, 0x17B81E7701ABDBE2E8743884D1117E53356DE5AB275B4DB1A682C62EF0F2753339B7C8F8C8F475AF9CCB5618E3F0C88E, 0x80D3CF1F9A78FC47B90B33563BE990DC43B756CE79F5574A2C596C928C5D1DE4FA295F296B74E956D71986A8497E317, 0x169B1F8E1BCFA7C42E0C37515D138F22DD2ECB803A0C5C99676314BAF4BB1B7FA3190B2EDC0327797F241067BE390C9E, 0x10321DA079CE07E272D8EC09D2565B0DFA7DCCDDE6787F96D50AF36003B14866F69B771F8C285DECCA67DF3F1605FB7B, 0x6E08C248E260E70BD1E962381EDEE3D31D79D7E22C837BC23C0BF1BC24C6B68C24B1B80B64D391FA9C8BA2E8BA2D229, ] ] ), denominator=Polynomial( [ field(x) for x in [ 0x8CA8D548CFF19AE18B2E62F4BD3FA6F01D5EF4BA35B48BA9C9588617FC8AC62B558D681BE343DF8993CF9FA40D21B1C, 0x12561A5DEB559C4348B4711298E536367041E8CA0CF0800C0126C2588C48BF5713DAA8846CB026E9E5C8276EC82B3BFF, 0xB2962FE57A3225E8137E629BFF2991F6F89416F5A718CD1FCA64E00B11ACEACD6A3D0967C94FEDCFCC239BA5CB83E19, 0x3425581A58AE2FEC83AAFEF7C40EB545B08243F16B1655154CCA8ABC28D6FD04976D5243EECF5C4130DE8938DC62CD8, 0x13A8E162022914A80A6F1D5F43E7A07DFFDFC759A12062BB8D6B44E833B306DA9BD29BA81F35781D539D395B3532A21E, 0xE7355F8E4E667B955390F7F0506C6E9395735E9CE9CAD4D0A43BCEF24B8982F7400D24BC4228F11C02DF9A29F6304A5, 0x772CAACF16936190F3E0C63E0596721570F5799AF53A1894E2E073062AEDE9CEA73B3538F0DE06CEC2574496EE84A3A, 0x14A7AC2A9D64A8B230B3F5B074CF01996E7F63C21BCA68A81996E1CDF9822C580FA5B9489D11E2D311F7D99BBDCC5A5E, 0xA10ECF6ADA54F825E920B3DAFC7A3CCE07F8D1D7161366B74100DA67F39883503826692ABBA43704776EC3A79A1D641, 0x95FC13AB9E92AD4476D6E3EB3A56680F682B4EE96F7D03776DF533978F31C1593174E4B4B7865002D6384D168ECDD0A, 0x1, ] ] ), ), RationalFunction( numerator=Polynomial( [ field(x) for x in [ 1393399195776646641963150658816615410692049723305861307490980409834842911816308830479576739332720113414154429643571, 2968610969752762946134106091152102846225411740689724909058016729455736597929366401532929068084731548131227395540630, 122933100683284845219599644396874530871261396084070222155796123161881094323788483360414289333111221370374027338230, 303251954782077855462083823228569901064301365507057490567314302006681283228886645653148231378803311079384246777035, 1353972356724735644398279028378555627591260676383150667237975415318226973994509601413730187583692624416197017403099, 3443977503653895028417260979421240655844034880950251104724609885224259484262346958661845148165419691583810082940400, 718493410301850496156792713845282235942975872282052335612908458061560958159410402177452633054233549648465863759602, 1466864076415884313141727877156167508644960317046160398342634861648153052436926062434809922037623519108138661903145, 1536886493137106337339531461344158973554574987550750910027365237255347020572858445054025958480906372033954157667719, 2171468288973248519912068884667133903101171670397991979582205855298465414047741472281361964966463442016062407908400, 3915937073730221072189646057898966011292434045388986394373682715266664498392389619761133407846638689998746172899634, 3802409194827407598156407709510350851173404795262202653149767739163117554648574333789388883640862266596657730112910, 1707589313757812493102695021134258021969283151093981498394095062397393499601961942449581422761005023512037430861560, 349697005987545415860583335313370109325490073856352967581197273584891698473628451945217286148025358795756956811571, 885704436476567581377743161796735879083481447641210566405057346859953524538988296201011389016649354976986251207243, 3370924952219000111210625390420697640496067348723987858345031683392215988129398381698161406651860675722373763741188, ] ] ), denominator=Polynomial( [ field(x) for x in [ 3396434800020507717552209507749485772788165484415495716688989613875369612529138640646200921379825018840894888371137, 3907278185868397906991868466757978732688957419873771881240086730384895060595583602347317992689443299391009456758845, 854914566454823955479427412036002165304466268547334760894270240966182605542146252771872707010378658178126128834546, 3496628876382137961119423566187258795236027183112131017519536056628828830323846696121917502443333849318934945158166, 1828256966233331991927609917644344011503610008134915752990581590799656305331275863706710232159635159092657073225757, 1362317127649143894542621413133849052553333099883364300946623208643344298804722863920546222860227051989127113848748, 3443845896188810583748698342858554856823966611538932245284665132724280883115455093457486044009395063504744802318172, 3484671274283470572728732863557945897902920439975203610275006103818288159899345245633896492713412187296754791689945, 3755735109429418587065437067067640634211015783636675372165599470771975919172394156249639331555277748466603540045130, 3459661102222301807083870307127272890283709299202626530836335779816726101522661683404130556379097384249447658110805, 742483168411032072323733249644347333168432665415341249073150659015707795549260947228694495111018381111866512337576, 1662231279858095762833829698537304807741442669992646287950513237989158777254081548205552083108208170765474149568658, 1668238650112823419388205992952852912407572045257706138925379268508860023191233729074751042562151098884528280913356, 369162719928976119195087327055926326601627748362769544198813069133429557026740823593067700396825489145575282378487, 2164195715141237148945939585099633032390257748382945597506236650132835917087090097395995817229686247227784224263055, 1, ] ] ), ) case _: raise NotImplementedError( f"Isogeny for curve {curve_id} is not implemented" ) # https://github.com/arkworks-rs/algebra/blob/master/curves/bls12_381/src/curves/g2_swu_iso.rs def get_isogeny_to_g2_map( curve_id: CurveID, ) -> tuple[RationalFunction, RationalFunction]: field = get_base_field(curve_id) match curve_id.value: case CurveID.BLS12_381.value: return RationalFunction( numerator=Polynomial( [ field(x) for x in [ 889424345604814976315064405719089812568196182208668418962679585805340366775741747653930584250892369786198727235542, 889424345604814976315064405719089812568196182208668418962679585805340366775741747653930584250892369786198727235542, 0, 2668273036814444928945193217157269437704588546626005256888038757416021100327225242961791752752677109358596181706522, 2668273036814444928945193217157269437704588546626005256888038757416021100327225242961791752752677109358596181706526, 1334136518407222464472596608578634718852294273313002628444019378708010550163612621480895876376338554679298090853261, 3557697382419259905260257622876359250272784728834673675850718343221361467102966990615722337003569479144794908942033, 0, ] ] ), denominator=Polynomial( [ field(x) for x in [ 0, 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559715, 12, 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559775, 1, 0, ] ] ), ), RationalFunction( numerator=Polynomial( [ field(x) for x in [ 3261222600550988246488569487636662646083386001431784202863158481286248011511053074731078808919938689216061999863558, 3261222600550988246488569487636662646083386001431784202863158481286248011511053074731078808919938689216061999863558, 0, 889424345604814976315064405719089812568196182208668418962679585805340366775741747653930584250892369786198727235518, 2668273036814444928945193217157269437704588546626005256888038757416021100327225242961791752752677109358596181706524, 1334136518407222464472596608578634718852294273313002628444019378708010550163612621480895876376338554679298090853263, 2816510427748580758331037284777117739799287910327449993381818688383577828123182200904113516794492504322962636245776, 0, ] ] ), denominator=Polynomial( [ field(x) for x in [ 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559355, 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559355, 0, 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559571, 18, 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559769, 1, 0, ] ] ), ) case _: raise NotImplementedError( f"Isogeny for curve {curve_id} is not implemented" ) def apply_isogeny(pt: G1Point) -> G1Point: assert pt.iso_point == True, f"Point {pt} is not an iso point" field = get_base_field(pt.curve_id) x_rational, y_rational = get_isogeny_to_g1_map(pt.curve_id) x_affine = x_rational.evaluate(field(pt.x)) y_affine = y_rational.evaluate(field(pt.x)) * field(pt.y) return G1Point(x_affine.value, y_affine.value, pt.curve_id, iso_point=False) if __name__ == "__main__": from garaga.hints.io import int_to_u384 field = get_base_field(CurveID.BLS12_381) message = b"Hello, World!" sha_message = hashlib.sha256(message).digest() # print(f"sha_message {sha_message.hex()}") message = sha_message def test_hash_to_field(message: bytes): res = hash_to_field( message=message, count=2, curve_id=CurveID.BLS12_381, hash_name="sha256", ) print(f"res {[int_to_u384(x) for x in res]}") expected = [ 2162792105491427725912070356725320455528056118179305300106498860235975843802512462082887053454085287130500476441750, 40368511435268498384669958495624628965655407346873103876018487738713032717501957266398124814691972213333393099218, ] # assert res == expected, f"Expected {expected}, got {res}" def test_map_to_curve(): u = field(42) res = map_to_curve(field_element=u, curve_id=CurveID.BLS12_381) print(f"res {int_to_u384(res.x)} {int_to_u384(res.y)}") def test_isogeny(): pt = G1Point( x=215777581081472667122506794895079133292851844364726904952688478479828790890150439604857229658591641382171852677524, y=1379746801043875097750009912574703067223644203712602673826050484796337984730238282465201134827010880864260517139932, curve_id=CurveID.BLS12_381, iso_point=True, ) expected = G1Point( x=2417697449117523569926871462160078790628278460141221111171958173864939056722835940739506331591809461977867457921129, y=2054645981348311902541581243120273427071170397909163934255295587636136055038499048700096920528935972380584458489355, curve_id=CurveID.BLS12_381, iso_point=False, ) res = apply_isogeny(pt=pt) assert res == expected, f"Expected {expected}, got {res}" # test_isogeny() def test_hash_to_curve(message: bytes): expected = G1Point( x=1427986885250946460144481685485785737438296207533779678983559530346613679756132883977754715392336662418069603153756, y=2665645453955482249178808933038784408956625041285885055194161860684118145927032784752731507519078519455031562783679, curve_id=CurveID.BLS12_381, ) res = hash_to_curve( message=message, curve_id=CurveID.BLS12_381, hash_name="sha256" ) # assert res == expected, f"Expected {expected}, got {res}" print(f"res {int_to_u384(res.x)} {int_to_u384(res.y)}") # test_hash_to_field(message=message) test_map_to_curve() test_hash_to_curve(message=message) ================================================ FILE: hydra/garaga/starknet/cli/declare.py ================================================ import asyncio import os from pathlib import Path from typing import Annotated import rich import typer from dotenv import load_dotenv from starknet_py.net.account.account import Account from starknet_py.net.full_node_client import FullNodeClient from starknet_py.net.models import StarknetChainId from starknet_py.net.signer.stark_curve_signer import KeyPair from garaga.hints.io import to_int from garaga.starknet.cli.smart_contract_project import SmartContractProject from garaga.starknet.cli.utils import Network, voyager_link_class app = typer.Typer() def declare( project_path: Annotated[ Path, typer.Option( help="Path to the Cairo project holding the Scarb.toml file to declare", file_okay=False, dir_okay=True, exists=True, autocompletion=lambda: [], ), ] = Path.cwd(), env_file: Annotated[ Path, typer.Option( help="Path to the environment file", file_okay=True, dir_okay=False, exists=True, autocompletion=lambda: [], ), ] = str(Path.cwd() / ".secrets"), network: Annotated[ Network, typer.Option( help="Starknet network", case_sensitive=False, ), ] = Network.SEPOLIA.value, ): """Declare your smart contract to Starknet. Obtain its class hash and a explorer link.""" if Path(env_file).exists(): load_dotenv(env_file) else: raise FileNotFoundError(f"Environment file {env_file} does not exist") rpc_url = os.getenv(f"{network.name.upper()}_RPC_URL") account_address = os.getenv(f"{network.name.upper()}_ACCOUNT_ADDRESS") account_private_key = os.getenv(f"{network.name.upper()}_ACCOUNT_PRIVATE_KEY") if network == Network.MAINNET: chain = StarknetChainId.MAINNET else: chain = StarknetChainId.SEPOLIA client = FullNodeClient(node_url=rpc_url) account = Account( address=account_address, client=client, key_pair=KeyPair.from_private_key(to_int(account_private_key)), chain=chain, ) rich.print( f"Declaring project [bold cyan] {project_path}[/bold cyan] on [bold]{network.name}[/bold]" ) project = SmartContractProject(project_path) try: class_hash, _ = asyncio.run(project.declare_class_hash(account=account)) rich.print( f"[bold green]Class hash: {hex(class_hash)} [/bold green] is available on [bold]{network.name}[/bold]" ) rich.print( f"[bold green]Check it out on[/bold green] {voyager_link_class(network, class_hash)}" ) except Exception as e: rich.print(f"[bold red]Error during declaration: {e}[/bold red]") ================================================ FILE: hydra/garaga/starknet/cli/deploy.py ================================================ import asyncio from pathlib import Path from typing import Annotated, Optional import rich import typer from dotenv import load_dotenv from starknet_py.contract import Contract from starknet_py.hash.address import compute_address from starknet_py.hash.utils import pedersen_hash from garaga.hints.io import to_hex_str, to_int from garaga.starknet.cli.utils import ( Network, get_contract_if_exists, get_contract_if_exists_async, load_account, ) # Mainnet/Sepolia deployer address DEPLOYER_ADDRESS = 0x41A78E741E5AF2FEC34B695679BC6891742439F7AFB8484ECD7766661AD02BF app = typer.Typer() async def perform_contract_deployment( account, class_hash: str, salt: int, precomputed_address: int ) -> Optional[Contract]: """Attempt to deploy a contract with the given parameters.""" try: deploy_result = await Contract.deploy_contract_v3( account=account, class_hash=class_hash, deployer_address=DEPLOYER_ADDRESS, auto_estimate=True, salt=salt, cairo_version=1, ) deploy_result = await deploy_result.wait_for_acceptance() return deploy_result.deployed_contract except Exception as e: print("Waiting for transaction to be accepted...") await asyncio.sleep(5.5) contract = await get_contract_if_exists_async(account, precomputed_address) if contract: return contract else: rich.print(f"[bold red]Deployment error: {e}[/bold red]") return None def print_contract_info(contract: Contract, network: Network): """Print information about the deployed contract.""" sepolia_prefix = "" if network == Network.MAINNET else "sepolia." rich.print(f"Contract address on {network.name}: {hex(contract.address)}") rich.print( f"Voyager link: https://{sepolia_prefix}voyager.online/contract/{hex(contract.address)}" ) rich.print(f"Available endpoints: {list(contract.functions.keys())}") def deploy( class_hash: Annotated[ str, typer.Option( help="Contract class hash to deploy. Can be decimal or hex string" ), ], env_file: Annotated[ Path, typer.Option( help="Path to the environment file containing rpc, address, private_key", file_okay=True, dir_okay=False, exists=True, autocompletion=lambda: [], ), ] = str(Path.cwd() / ".secrets"), network: Annotated[ Network, typer.Option( help="Starknet network", case_sensitive=False, ), ] = Network.SEPOLIA.value, salt: Annotated[ int, typer.Option( help="Salt value for contract address calculation (default: 1)", ), ] = 1, ): """Deploy an instance of a smart contract class hash to Starknet. Obtain its address, the available endpoints and a explorer link.""" # Validate and load environment if not Path(env_file).exists(): raise FileNotFoundError(f"Environment file {env_file} does not exist") load_dotenv(env_file) # Prepare account and compute address account = load_account(network) class_hash = to_hex_str(class_hash) precomputed_address = compute_address( class_hash=to_int(class_hash), constructor_calldata=[], salt=pedersen_hash(to_int(account.address), salt), deployer_address=DEPLOYER_ADDRESS, ) # Check if contract already exists contract = get_contract_if_exists(account, precomputed_address) if contract: rich.print( f"[bold green]Contract already deployed at {hex(contract.address)}[/bold green]" ) print_contract_info(contract, network) return # Perform deployment rich.print(f"Deploying contract with class hash {class_hash}...") contract = asyncio.run( perform_contract_deployment(account, class_hash, salt, precomputed_address) ) # Handle deployment result if not contract: # Check if the contract exists despite the error (transaction might have completed) contract = get_contract_if_exists(account, precomputed_address) if contract: rich.print( f"[bold green]Contract found at {hex(contract.address)} despite deployment errors.[/bold green]" ) else: rich.print( f"[bold yellow]Contract not deployed. Try running the command again - it might be a temporary network issue.[/bold yellow]" ) return else: rich.print( f"[bold green]Contract successfully deployed at {hex(contract.address)}[/bold green]" ) # Print contract information print_contract_info(contract, network) ================================================ FILE: hydra/garaga/starknet/cli/gen.py ================================================ import subprocess from pathlib import Path from typing import Annotated import typer from rich import print from rich.console import Console from rich.panel import Panel from rich.progress import Progress, SpinnerColumn, TextColumn from rich.tree import Tree from garaga.curves import ProofSystem from garaga.starknet.cli.utils import complete_proof_system, get_package_version from garaga.starknet.constants import BB_VERSION, BBUP_VERSION, NARGO_VERSION from garaga.starknet.groth16_contract_generator.generator import ( ECIP_OPS_CLASS_HASH, gen_groth16_verifier, ) from garaga.starknet.honk_contract_generator.generator_honk import gen_honk_verifier def check_nargo_version(version: str) -> tuple[bool, str]: return check_version("nargo", version) def check_bb_version(version: str) -> tuple[bool, str]: return check_version("bb", version) def check_version(cmd: str, version: str) -> tuple[bool, str]: try: result = subprocess.run([cmd, "--version"], capture_output=True, text=True) result_version = result.stdout.strip() if result.returncode != 0: stderr_msg = result.stderr.strip() error_detail = stderr_msg or result_version or "unknown error" return ( False, f"'{cmd} --version' failed (exit code {result.returncode}): {error_detail}", ) if not result_version: return (False, f"'{cmd} --version' returned empty output") return (version in result_version, result_version) except (FileNotFoundError, OSError): # Command not found or other OS error return (False, f"Command '{cmd}' not found or not executable") def _get_bb_oracle_hash_options() -> list[str]: """Get the available oracle hash options from bb command""" try: result_hash = subprocess.run( ["bb", "prove", "-h"], capture_output=True, text=True ) if result_hash.returncode != 0: return [] # Extract oracle hash options oracle_hash_options = [] lines = result_hash.stdout.splitlines() for i, line in enumerate(lines): if "--oracle_hash" in line: # Look in the next few lines for the options for j in range(i + 1, min(i + 100, len(lines))): if "Options: {" in lines[j]: options_str = lines[j].split("{")[1].split("}")[0] oracle_hash_options = [ opt.strip() for opt in options_str.split(",") ] break break return oracle_hash_options except (FileNotFoundError, OSError): # Command not found or other OS error return [] def check_bb_starknet_support( version: str, with_starknet: bool = False ) -> tuple[bool, str, bool]: """Check if bb supports starknet and meets the version requirement""" version_ok, version_str = check_bb_version(version) oracle_options = _get_bb_oracle_hash_options() has_starknet = "starknet" in oracle_options if with_starknet: return (version_ok and has_starknet, version_str, has_starknet) else: return (version_ok, version_str, has_starknet) def print_bb_warning(soft: bool = False, with_starknet: bool = False): bb_version_ok, bb_version, _ = check_bb_starknet_support(BB_VERSION, with_starknet) nargo_version_ok, nargo_version = check_version("nargo", NARGO_VERSION) if not bb_version_ok or not nargo_version_ok: console = Console() console.print( Panel( f"[bold]Detected versions of bb and nargo are not compatible with the required versions by garaga {get_package_version()}.[/bold]\n" + (f"This is the most likely cause of the error." if not soft else f""), title="[bold red]Warning[/bold red]", border_style="red", ) ) console.print( f"Detected bb version: [bold red]{bb_version}[/bold red]\n" f"Detected nargo version: [bold red]{nargo_version}[/bold red]" ) console.print( Panel( "[bold]Please ensure you have the expected versions of bb and nargo installed for garaga to work correctly.[/bold]\n" + "You can install the required versions using the following commands:\n" + f"[bold yellow]bbup --version {BBUP_VERSION}[/bold yellow]\n" + f"[bold yellow]noirup --version {NARGO_VERSION}[/bold yellow]\n" + ( f"Check [blue]https://noir-lang.org/docs/getting_started/quick_start[/blue] for more information.\n" if not soft else "" ) + f"Please ensure the verifying key was generated with the correct versions of bb and nargo before generating the verifier.", border_style="yellow", title="[bold yellow]Fixing the issue[/bold yellow]", ) ) else: print( f"The detected versions of bb and nargo are correctly aligned with garaga {get_package_version()}. " ) def gen( system: Annotated[ ProofSystem, typer.Option(help="Proof system", autocompletion=complete_proof_system), ], project_name: Annotated[ str, typer.Option( help="The verifer name (used for the folder name, scarb project name, and contract name)", prompt="\033[1;35mPlease enter the name of your project. Press enter for default name.\033[0m", default_factory=lambda: "my_project", ), ], vk: Annotated[ Path, typer.Option( help="Path to the verification key file. Expects a JSON for groth16, binary format for Honk. Must be provided, except when the system supports an universal key (ex: Risc0)", file_okay=True, dir_okay=False, exists=True, autocompletion=lambda: [], # See https://github.com/fastapi/typer/discussions/731 ), ] = None, include_test_sample: Annotated[ bool, typer.Option( help="Include a sample test file in the generated project", ), ] = True, ): """ Generate a Cairo verifier for a given proof system. Automatically detects the curve from the verification key. """ cwd = Path.cwd() with Progress( SpinnerColumn(), TextColumn("[progress.description]{task.description}"), transient=False, console=Console(color_system="truecolor"), ) as progress: progress.add_task( f"[bold cyan]Generating Smart Contract project for [bold yellow]{system}[/bold yellow] using [bold yellow]{Path(vk).name}[/bold yellow]...[/bold cyan]", total=None, ) match system: case ProofSystem.Groth16: gen_groth16_verifier( vk=vk, output_folder_path=cwd, output_folder_name=project_name, ecip_class_hash=ECIP_OPS_CLASS_HASH, cli_mode=True, include_test_sample=include_test_sample, ) case ProofSystem.UltraKeccakZKHonk: try: gen_honk_verifier( vk=vk, output_folder_path=cwd, output_folder_name=project_name, cli_mode=True, include_test_sample=include_test_sample, ) except Exception as e: import traceback print( f"\n[bold red]Error:[/bold red] An error occurred while generating the verifier: \n{traceback.format_exc()}" ) # print_bb_warning( # with_starknet=system == ProofSystem.UltraStarknetHonk # or system == ProofSystem.UltraStarknetZKHonk # ) raise typer.Exit(code=1) case _: raise ValueError(f"Unsupported proof system: {system}") print("[bold green]Done![/bold green]") print("[bold cyan]Smart Contract project created:[/bold cyan]") def generate_tree(path: Path, tree: Tree) -> None: for entry in sorted(path.iterdir(), key=lambda e: e.name): if entry.is_dir(): branch = tree.add(f"[bold blue]{entry.name}/[/bold blue]") generate_tree(entry, branch) else: tree.add(f"[green]{entry.name}[/green]") root = Tree(f"[bold yellow]{cwd}/{project_name}/[/bold yellow]") generate_tree(cwd / project_name, root) print(root) print( f"[bold]You can now test the main endpoint of the verifier using a proof and `garaga calldata` command.[/bold]" ) if system in [ ProofSystem.UltraKeccakZKHonk, ]: print_bb_warning(soft=True, with_starknet=False) ================================================ FILE: hydra/garaga/starknet/cli/smart_contract_project.py ================================================ import functools from dataclasses import dataclass from pathlib import Path import filelock import starknet_py from starknet_py.common import create_casm_class, create_sierra_compiled_contract from starknet_py.contract import Contract, DeclareResult from starknet_py.hash.casm_class_hash import compute_casm_class_hash from starknet_py.hash.sierra_class_hash import compute_sierra_class_hash from starknet_py.net.account.account import Account from garaga.starknet.cli.utils import get_sierra_casm_artifacts from garaga.starknet.groth16_contract_generator.calldata import ( groth16_calldata_from_vk_and_proof, ) from garaga.starknet.groth16_contract_generator.parsing_utils import ( Groth16Proof, Groth16VerifyingKey, ) class EmptyContract(Exception): pass from functools import lru_cache import rich # Add at module level @lru_cache(maxsize=32) def _get_cached_artifacts(folder: Path) -> tuple[str, str]: """Module level cache for scarb build artifacts""" # Create lock file in the target directory of the contract lock_file = folder / "target" / ".build.lock" lock_file.parent.mkdir(parents=True, exist_ok=True) # Use a timeout to prevent deadlocks lock = filelock.FileLock(str(lock_file), timeout=300) # 5 minute timeout with lock: return get_sierra_casm_artifacts(folder) @dataclass class SmartContractProject: smart_contract_folder: Path # The folder which holds Scarb.toml. def __hash__(self) -> int: return hash(self.smart_contract_folder) def get_contract_artifacts(self) -> tuple[str, str]: """ Returns the sierra and casm artifacts for the contract (uses scarb to build the contract folder) """ return _get_cached_artifacts(self.smart_contract_folder) @lru_cache(maxsize=1) def get_casm_class_hash(self) -> int: """ Returns the class hash for the contract (uses scarb to build the contract folder) """ _, casm_artifact = self.get_contract_artifacts() casm_class = create_casm_class(casm_artifact) return compute_casm_class_hash(casm_class) @lru_cache(maxsize=1) def get_sierra_class_hash(self) -> int: """ Returns the class hash for the contract (uses scarb to build the contract folder) """ sierra_artifact, _ = self.get_contract_artifacts() return compute_sierra_class_hash( create_sierra_compiled_contract(sierra_artifact) ) @lru_cache(maxsize=1) def get_abi(self) -> str: """ Returns the abi for the contract (uses scarb to build the contract folder) """ sierra_artifact, _ = self.get_contract_artifacts() return create_sierra_compiled_contract(sierra_artifact).parsed_abi async def _check_class_exists(self, account: Account, class_hash: int) -> bool: """Helper method to check if class exists""" try: await account.client.get_class_by_hash(class_hash) return True except starknet_py.net.client_errors.ClientError as e: if e.code == 28: # Class hash not found return False raise e async def declare_class_hash(self, account: Account) -> tuple[int, str]: """Returns class hash and abi""" rich.print( f"[bold cyan]Contract project: {self.smart_contract_folder}[/bold cyan]" ) # Get artifacts once sierra, casm = self.get_contract_artifacts() if sierra is None or casm is None: raise EmptyContract # Use cached properties that don't trigger new builds class_hash = self.get_sierra_class_hash() abi = self.get_abi() if await self._check_class_exists(account, class_hash): rich.print( f"[bold cyan]Contract class for {self.smart_contract_folder} already exists: {hex(class_hash)}[/bold cyan]" ) return class_hash, abi rich.print( f"[bold cyan]class hash for {self.smart_contract_folder} not found - deploying[/bold cyan]" ) try: declare_result: DeclareResult = await Contract.declare_v3( account=account, compiled_contract=sierra, compiled_contract_casm=casm, auto_estimate=True, ) await declare_result.wait_for_acceptance() rich.print( f"[bold green]Contract class hash declared: {hex(declare_result.class_hash)}[/bold green]" ) except starknet_py.net.client_errors.ClientError as e: raise e except Exception as e: rich.print( f"[bold red]Unexpected error during contract class declaration: {type(e).__name__}: {e}[/bold red]" ) raise e return declare_result.class_hash, abi @dataclass class Groth16SmartContract(SmartContractProject): vk_path: Path # The json file which holds the verification key. def __hash__(self) -> int: return hash((self.smart_contract_folder, self.vk_path)) @functools.lru_cache(maxsize=128) def generate_calldata( self, proof_path: Path, public_inputs_path: Path | None = None ) -> list[int]: """ Generates the raw calldata for the contract. """ return groth16_calldata_from_vk_and_proof( vk=Groth16VerifyingKey.from_json(self.vk_path), proof=Groth16Proof.from_json(proof_path, public_inputs_path), ) ================================================ FILE: hydra/garaga/starknet/cli/starknet_cli.py ================================================ from typing import Optional import typer from garaga.starknet.cli.declare import declare from garaga.starknet.cli.deploy import deploy from garaga.starknet.cli.gen import gen from garaga.starknet.cli.utils import get_package_version from garaga.starknet.cli.verify import calldata, verify_onchain def version_callback(value: bool): if value: print(f"garaga version: {get_package_version()}") raise typer.Exit() app = typer.Typer( no_args_is_help=True, # Show help when no arguments are provided context_settings={"help_option_names": ["-h", "--help"]}, ) # Add version option that will be processed first @app.callback(invoke_without_command=True) def main( version: Optional[bool] = typer.Option( None, "--version", callback=version_callback, is_eager=True, help="Show the version and exit.", ), ): pass app.command(no_args_is_help=True)(gen) app.command(no_args_is_help=True)(declare) app.command(no_args_is_help=True)(deploy) app.command(no_args_is_help=True)(verify_onchain) app.command(no_args_is_help=True)(calldata) if __name__ == "__main__": app() ================================================ FILE: hydra/garaga/starknet/cli/utils.py ================================================ import asyncio import glob import json import os import shutil import subprocess import tempfile import time from enum import Enum from importlib.metadata import PackageNotFoundError, version from pathlib import Path import rich from starknet_py.contract import Contract from starknet_py.net.account.account import Account from starknet_py.net.client_errors import ClientError, ContractNotFoundError from starknet_py.net.full_node_client import FullNodeClient from starknet_py.net.models import StarknetChainId from starknet_py.net.signer.stark_curve_signer import KeyPair from garaga.curves import ProofSystem from garaga.hints.io import to_int def get_package_version(): try: __version__ = version("garaga") except PackageNotFoundError: # package is not installed __version__ = "dev" return __version__ class Network(Enum): SEPOLIA = "sepolia" MAINNET = "mainnet" def load_account(network: Network): rpc_url = os.getenv(f"{network.name.upper()}_RPC_URL") account_address = os.getenv(f"{network.name.upper()}_ACCOUNT_ADDRESS") account_private_key = os.getenv(f"{network.name.upper()}_ACCOUNT_PRIVATE_KEY") if network == Network.MAINNET: chain = StarknetChainId.MAINNET else: chain = StarknetChainId.SEPOLIA client = FullNodeClient(node_url=rpc_url) account = Account( address=account_address, client=client, key_pair=KeyPair.from_private_key(to_int(account_private_key)), chain=chain, ) account.ESTIMATED_AMOUNT_MULTIPLIER = 1.02 account.ESTIMATED_FEE_MULTIPLIER = 1.02 account.ESTIMATED_UNIT_PRICE_MULTIPLIER = 1.02 return account def get_contract_if_exists(account: Account, contract_address: int) -> Contract | None: try: res = asyncio.run(Contract.from_address(contract_address, account)) return res except ContractNotFoundError: return None except ClientError as e: if "no contract with address" in e.message.lower(): return None raise e async def get_contract_if_exists_async( account: Account, contract_address: int ) -> Contract | None: try: res = await Contract.from_address(contract_address, account) return res except ContractNotFoundError: return None except ClientError as e: if "no contract with address" in e.message.lower(): return None raise e def get_contract_iff_exists(account: Account, contract_address: int) -> Contract: contract = get_contract_if_exists(account, contract_address) if contract is None: rich.print( f"[red]Contract {contract_address} does not exists on {account._chain_id.name}[/red]" ) raise ValueError(f"Contract {contract_address} not found") return contract def create_directory(path: str): if not os.path.exists(path): os.makedirs(path) # print(f"Directory created: {path}") def complete_pairing_curve_id(incomplete: str): curve_ids = ["0", "1"] # Corresponding to BN254 and BLS12_381 return [cid for cid in curve_ids if cid.startswith(incomplete)] def complete_proof_system(incomplete: str): systems = [ps.value for ps in ProofSystem] return [system for system in systems if system.startswith(incomplete)] def complete_network(incomplete: str): networks = [network.name for network in StarknetChainId] return [network for network in networks if network.startswith(incomplete)] def get_voyager_network_prefix(network: Network) -> str: return "" if network == Network.MAINNET else "sepolia." def voyager_link_tx(network: Network, tx_hash: int) -> str: voyager_prefix = get_voyager_network_prefix(network) return f"https://{voyager_prefix}voyager.online/tx/{hex(tx_hash)}" def voyager_link_class(network: Network, class_hash: int) -> str: voyager_prefix = get_voyager_network_prefix(network) return f"https://{voyager_prefix}voyager.online/class/{hex(class_hash)}" def scarb_build_contract_folder(contract_folder_path: str): cmd = "scarb build" print(f"Running command: {cmd} in directory: {contract_folder_path}") try: subprocess.run( cmd, cwd=contract_folder_path, check=True, shell=True, capture_output=True, text=True, ) except subprocess.CalledProcessError as e: print(f"Error building contract: {e}") print(f"Command output:\n{e.output}") raise except FileNotFoundError as e: print(f"Error: {e}") raise except Exception as e: print(f"An unexpected error occurred: {e}") raise def _acquire_scarb_lock(): """ Acquire a file-based lock for scarb operations to prevent parallel execution issues. Returns the lock file path that should be released later. """ lock_dir = tempfile.gettempdir() lock_file = os.path.join(lock_dir, "garaga_scarb_metadata.lock") # Try to acquire lock with timeout timeout = 60 # 60 seconds timeout start_time = time.time() while time.time() - start_time < timeout: try: # Try to create lock file exclusively fd = os.open(lock_file, os.O_CREAT | os.O_EXCL | os.O_WRONLY) os.write(fd, str(os.getpid()).encode()) os.close(fd) return lock_file except OSError: # Lock file exists, wait a bit and retry time.sleep(0.1) raise TimeoutError("Could not acquire scarb lock within timeout") def _release_scarb_lock(lock_file: str): """Release the scarb lock by removing the lock file.""" try: os.remove(lock_file) except OSError: # Lock file might have been removed already pass def get_sierra_casm_artifacts( contract_folder_path: str, ) -> tuple[None, None] | tuple[str, str]: """ Get the Sierra and CASM artifacts for a contract. """ lock_file = _acquire_scarb_lock() try: process = subprocess.run( "scarb metadata --format-version 1", shell=True, capture_output=True, text=True, check=True, cwd=contract_folder_path, ) # Clean up any potential scarb warning messages from stdout stdout_lines = process.stdout.strip().split("\n") # Find the first line that starts with '{' (the JSON) json_start_idx = 0 for i, line in enumerate(stdout_lines): if line.strip().startswith("{"): json_start_idx = i break json_content = "\n".join(stdout_lines[json_start_idx:]) metadata = json.loads(json_content) finally: _release_scarb_lock(lock_file) target_dir = os.path.join(contract_folder_path, metadata["target_dir"], "dev") # Clean the target/dev/ folder if it already exists if os.path.exists(target_dir): shutil.rmtree(target_dir) os.makedirs(target_dir) scarb_build_contract_folder(contract_folder_path) artifacts_file = glob.glob(os.path.join(target_dir, "*.starknet_artifacts.json")) assert ( len(artifacts_file) == 1 ), f"Artifacts JSON file not found or multiple files found: {artifacts_file}" with open(artifacts_file[0], "r") as f: artifacts = json.load(f) contracts = artifacts["contracts"] if len(contracts) == 0: return None, None sierra_file = contracts[0]["artifacts"]["sierra"] casm_file = contracts[0]["artifacts"]["casm"] sierra_path = os.path.join(target_dir, sierra_file) casm_path = os.path.join(target_dir, casm_file) assert os.path.exists(sierra_path), f"Sierra file not found: {sierra_path}" assert os.path.exists(casm_path), f"CASM file not found: {casm_path}" with open(sierra_path, "r") as f: sierra = f.read() with open(casm_path, "r") as f: casm = f.read() return sierra, casm def get_default_vk_path(vk_type: str) -> Path: script_path = Path(__file__).resolve() script_folder_path = script_path.parent match vk_type: case "risc0": return ( script_folder_path.parent / "groth16_contract_generator" / "examples" / "vk_risc0.json" ) case "sp1": return ( script_folder_path.parent / "groth16_contract_generator" / "examples" / "vk_sp1.json" ) case _: raise ValueError( f"Unsupported default VK for proof type: {vk_type}. Please specify a vk." ) ================================================ FILE: hydra/garaga/starknet/cli/verify.py ================================================ import asyncio from enum import Enum from pathlib import Path from typing import Annotated import rich import typer from dotenv import load_dotenv from starknet_py.contract import ( ContractFunction, InvokeResult, PreparedFunctionInvokeV3, ) from garaga.curves import ProofSystem from garaga.hints.io import to_int from garaga.precompiled_circuits.zk_honk import honk_proof_from_bytes from garaga.starknet.cli.utils import ( Network, complete_proof_system, get_contract_iff_exists, get_default_vk_path, load_account, voyager_link_tx, ) from garaga.starknet.groth16_contract_generator.calldata import ( groth16_calldata_from_vk_and_proof, ) from garaga.starknet.groth16_contract_generator.parsing_utils import ( Groth16Proof, Groth16VerifyingKey, find_item_from_key_patterns, ) from garaga.starknet.honk_contract_generator.calldata import ( HonkVk, get_ultra_flavor_honk_calldata_from_vk_and_proof, ) app = typer.Typer() def verify_onchain( system: Annotated[ ProofSystem, typer.Option(help="Proof system", autocompletion=complete_proof_system), ], contract_address: Annotated[ str, typer.Option( help="Starknet contract address", ), ], proof: Annotated[ Path, typer.Option( help="Path to the proof JSON file", file_okay=True, dir_okay=False, exists=True, autocompletion=lambda: [], ), ], vk: Annotated[ Path, typer.Option( help="Path to the verification key file. Expects a JSON for groth16, binary format for Honk. Must be provided, except when the system supports an universal key (ex: Risc0)", file_okay=True, dir_okay=False, exists=True, autocompletion=lambda: [], ), ] = None, public_inputs: Annotated[ Path, typer.Option( help="Path to the public inputs file. Expects a JSON for groth16, binary format for Honk.", file_okay=True, dir_okay=False, exists=True, autocompletion=lambda: [], ), ] = None, endpoint: Annotated[ str, typer.Option( help="Smart contract function name. If not provided, the default 'verify_[proof_system]_proof_[curve_name]' will be used.", ), ] = "", env_file: Annotated[ Path, typer.Option( help="Path to the environment file containing rpc, address, private_key", file_okay=True, dir_okay=False, exists=True, autocompletion=lambda: [], ), ] = str(Path.cwd() / ".secrets"), network: Annotated[ Network, typer.Option( help="Starknet network", case_sensitive=False, ), ] = Network.SEPOLIA.value, ): """Invoke a SNARK verifier on Starknet given a contract address, a proof and a verification key.""" load_dotenv(env_file) account = load_account(network) contract = get_contract_iff_exists(account, to_int(contract_address)) try: function_call: ContractFunction = find_item_from_key_patterns( contract.functions, ["verify"] ) except ValueError: rich.print( f"[red]Function {endpoint} not found on contract {contract_address}[/red]" ) raise ValueError( f"Function {endpoint} not found on contract {contract_address}" ) if public_inputs == "": public_inputs = None calldata = get_calldata_generic(system, vk, proof, public_inputs) prepare_invoke = PreparedFunctionInvokeV3( to_addr=function_call.contract_data.address, calldata=calldata, selector=function_call.get_selector(function_call.name), _contract_data=function_call.contract_data, _client=function_call.client, _account=function_call.account, _payload_transformer=function_call._payload_transformer, resource_bounds=None, ) invoke_result: InvokeResult = asyncio.run(prepare_invoke.invoke(auto_estimate=True)) asyncio.run(invoke_result.wait_for_acceptance()) rich.print(f"[bold]Transaction hash : {hex(invoke_result.hash)}[/bold]") rich.print( f"[bold green]Check it out on[/bold green] {voyager_link_tx(network, invoke_result.hash)}" ) class CalldataFormat(str, Enum): starkli = "starkli" array = "array" snforge = "snforge" def get_calldata_generic( system: ProofSystem, vk: Path | None, proof: Path, public_inputs: Path | None ) -> list[int]: match system: case ProofSystem.Groth16: proof_obj = Groth16Proof.from_json(proof, public_inputs) if vk is None: vk_obj = Groth16VerifyingKey.from_json( get_default_vk_path(proof_obj.vk_type) ) else: vk_obj = Groth16VerifyingKey.from_json(vk) return groth16_calldata_from_vk_and_proof(vk_obj, proof_obj) case ProofSystem.UltraKeccakZKHonk: vk_obj = HonkVk.from_bytes(open(vk, "rb").read()) proof_obj = honk_proof_from_bytes( open(proof, "rb").read(), open(public_inputs, "rb").read(), vk_obj, system, ) return get_ultra_flavor_honk_calldata_from_vk_and_proof( vk_obj, proof_obj, system ) case _: raise ValueError(f"Proof system {system} not supported") def calldata( system: Annotated[ ProofSystem, typer.Option(help="Proof system", autocompletion=complete_proof_system), ], proof: Annotated[ Path, typer.Option( help="Path to the proof file", file_okay=True, dir_okay=False, exists=True, autocompletion=lambda: [], ), ], vk: Annotated[ Path, typer.Option( help="Path to the verification key file. Expects a JSON for groth16, binary format for Honk. Must be provided, except when the system supports an universal key (ex: Risc0)", file_okay=True, dir_okay=False, exists=True, autocompletion=lambda: [], ), ] = None, public_inputs: Annotated[ Path, typer.Option( help="Path to the public inputs file. Optional, only used for Groth16 when pub inputs are not in the json proof (ex: SnarkJS)", file_okay=True, dir_okay=False, exists=True, autocompletion=lambda: [], ), ] = None, format: Annotated[ CalldataFormat, typer.Option( help="Format", case_sensitive=False, show_choices=True, ), ] = CalldataFormat.snforge, output_path: Annotated[ Path, typer.Option( help="Output directory path for snforge format (defaults to current directory)", file_okay=False, dir_okay=True, exists=True, autocompletion=lambda: [], ), ] = Path("."), ): """Generate Starknet verifier calldata given a proof and a verification key.""" if vk == None: vk = get_default_vk_path(system) calldata = get_calldata_generic(system, vk, proof, public_inputs) if format == CalldataFormat.starkli: print(" ".join([str(x) for x in calldata])) elif format == CalldataFormat.array: print(calldata[1:]) elif format == CalldataFormat.snforge: # Write the calldata to a file in the specified output path output_file = output_path / "proof_calldata.txt" with open(output_file, "w") as f: for x in calldata[1:]: f.write(f"{hex(x)}\n") print(f"Calldata written to: {output_file}") ================================================ FILE: hydra/garaga/starknet/constants.py ================================================ """ Auto-generated constants file from constants.json. Do not edit manually. """ # RISC0 Constants # https://github.com/risc0/risc0-ethereum/blob/v2.2.2/contracts/src/groth16/ControlID.sol # release v2.2.2 RISC0_CONTROL_ROOT = 0xCE52BF56033842021AF3CF6DB8A50D1B7535C125A34F1A22C6FDCF002C5A1529 RISC0_BN254_CONTROL_ID = ( 0x04446E66D300EB7FB45C9726BB53C793DDA407A62E9601618BB43C5C14657AC0 ) # SP1 Constants # https://github.com/succinctlabs/sp1-contracts/blob/main/contracts/src/v5.0.0/SP1VerifierGroth16.sol SP1_VERIFIER_VERSION = "v5.0.0" SP1_VERIFIER_HASH = bytes.fromhex( "a4594c59bbc142f3b81c3ecb7f50a7c34bc9af7c4c444b5d48b795427e285913" ) # Additional RISC0 constants for internal use RISC0_SYSTEM_STATE_ZERO_DIGEST = ( "0xA3ACC27117418996340B84E5A90F3EF4C49D22C79E44AAD822EC9C313E1EB8E2" ) RISC0_TAG_DIGEST = "0xcb1fefcd1f2d9a64975cbbbf6e161e2914434b0cbb9960b84df5d717e86b48af" RISC0_OUTPUT_TAG = "0x77eafeb366a78b47747de0d7bb176284085ff5564887009a5be63da32d3559d4" RISC0_RELEASE_VERSION = "v2.2.2" # Version info CAIRO_VERSION = "2.16.1" STARKNET_FOUNDRY_VERSION = "0.57.0" BB_VERSION = "3.0.0-nightly.20251104" BBUP_VERSION = "3.0.0-nightly.20251104" NARGO_VERSION = "1.0.0-beta.16" ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/calldata.py ================================================ from garaga import garaga_rs from garaga.points import G1G2Pair, G1Point from garaga.starknet.groth16_contract_generator.parsing_utils import ( Groth16Proof, Groth16VerifyingKey, ) from garaga.starknet.tests_and_calldata_generators.mpcheck import MPCheckCalldataBuilder from garaga.starknet.tests_and_calldata_generators.msm import MSMCalldataBuilder def groth16_calldata_from_vk_and_proof( vk: Groth16VerifyingKey, proof: Groth16Proof, use_rust: bool = False ) -> list[int]: if use_rust: return _groth16_calldata_from_vk_and_proof_rust(vk, proof) assert ( vk.curve_id == proof.curve_id ), f"Curve ID mismatch: {vk.curve_id} != {proof.curve_id}" vk_x = vk.ic[0].add(G1Point.msm(vk.ic[1:], proof.public_inputs)) calldata = [] mpc = MPCheckCalldataBuilder( vk.curve_id, pairs=[ G1G2Pair(p=vk_x, q=vk.gamma, curve_id=vk.curve_id), G1G2Pair(p=proof.c, q=vk.delta, curve_id=vk.curve_id), G1G2Pair(p=-proof.a, q=proof.b, curve_id=vk.curve_id), ], n_fixed_g2=2, public_pair=G1G2Pair(vk.alpha, vk.beta, vk.curve_id), ) calldata.extend(proof.serialize_to_calldata()) calldata.extend(mpc.serialize_to_calldata()) if proof.image_id and proof.journal: # Risc0 mode. print("Risc0 mode") msm = MSMCalldataBuilder( curve_id=vk.curve_id, points=[vk.ic[3], vk.ic[4]], scalars=[proof.public_inputs[2], proof.public_inputs[3]], ) calldata.extend( msm.serialize_to_calldata( include_points_and_scalars=False, serialize_as_pure_felt252_array=True, ) ) else: msm = MSMCalldataBuilder( curve_id=vk.curve_id, points=vk.ic[1:], scalars=proof.public_inputs, ) calldata.extend( msm.serialize_to_calldata( include_points_and_scalars=False, serialize_as_pure_felt252_array=True, ) ) # return calldata return [len(calldata)] + calldata def _groth16_calldata_from_vk_and_proof_rust( vk: Groth16VerifyingKey, proof: Groth16Proof ) -> list[int]: assert ( vk.curve_id == proof.curve_id ), f"Curve ID mismatch: {vk.curve_id} != {proof.curve_id}" # Determine vkey for SP1 proofs - it's embedded in public_inputs[0] vkey = None if proof.public_inputs_sp1 is not None: # For SP1 proofs, the vkey is stored as public_inputs[0] as a big integer # We need to convert it back to bytes (32 bytes, big endian) vkey_int = proof.public_inputs[0] vkey = vkey_int.to_bytes(32, byteorder="big") return garaga_rs.get_groth16_calldata( proof.flatten(), vk.flatten(), proof.curve_id.value, proof.image_id, proof.journal, proof.public_inputs_sp1, vkey, ) if __name__ == "__main__": VK_PATH = "hydra/garaga/starknet/groth16_contract_generator/examples/snarkjs_vk_bn254.json" PROOF_PATH = "hydra/garaga/starknet/groth16_contract_generator/examples/snarkjs_proof_bn254.json" PUBLIC_INPUTS_PATH = "hydra/garaga/starknet/groth16_contract_generator/examples/snarkjs_public_bn254.json" vk = Groth16VerifyingKey.from_json(file_path=VK_PATH) proof = Groth16Proof.from_json( proof_path=PROOF_PATH, public_inputs_path=PUBLIC_INPUTS_PATH ) calldata = groth16_calldata_from_vk_and_proof(vk, proof) print(calldata) print(len(calldata)) ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/gnark_proof_bn254.json ================================================ { "Ar": { "X": "73845398786533896737633575350679623829088256804727703196883312716046720173", "Y": "3929126461430331964775340412981986240468451439560808746926369245425818473094" }, "Krs": { "X": "5190364967715151722457989459269945351663215722120167333837995313677944703903", "Y": "14199563643497455180373217971778460129125995041037663528128314360912908737780" }, "Bs": { "X": { "A0": "16632859667924688464448957536047018456099730057010042618872684676699665576215", "A1": "14449457899836886236886667816357803659057995635857528933270859039361561900603" }, "Y": { "A0": "15421378102072744588763891672780291204950526202368967583474637050334340924705", "A1": "18744416296603152547207457648310909802150662798361439910160964667848224210083" } }, "Commitments": [], "CommitmentPok": { "X": 0, "Y": 0 } } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/gnark_public_bn254.json ================================================ {"Y":35,"A":3} ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/gnark_vk_bn254.json ================================================ { "G1": { "Alpha": { "X": "14022946795448417392013625865802801176898886310466431149831115687134146367641", "Y": "10364344690755581581504644927667063116689644601215049216910271378126570545500" }, "Beta": { "X": "8844875712409095498068897593965025484997931450974590956146408012716228318504", "Y": "2799788420235572891700155740485845467105272280264371678131018641353250818667" }, "Delta": { "X": "16969540828789996554983310544993112744806439019641589585263366845519078966157", "Y": "533649247374421949943697162574730867816408085255507771632248210977552490861" }, "K": [ { "X": "17461779630561271163671852875847592287161079138433606261984180739218927158236", "Y": "10379634765586658134781845471660076557556695748197053518811787395522091586195" }, { "X": "10835021126138156977544265475466469711908478296558124914976718838658441065225", "Y": "10030093532661424195104483506962793636352799423129915749876897937700551580649" }, { "X": "11284277349890495424801427723588943125126072154154310369457878942235288226040", "Y": "583859706624447950864738075374310646363788597670568381405717844223938749900" } ] }, "G2": { "Beta": { "X": { "A0": "10481547531373562520559478972412543701342405400857672305471101625746475821183", "A1": "2967257082438296979278001659301901911044242970229012803760772279597657883732" }, "Y": { "A0": "19876627849961016393990350226622542089131395293920518886528254923761375036253", "A1": "13827411186489088399303139760511808643745791912383443683147505906084566938940" } }, "Delta": { "X": { "A0": "5149303948979298468953341463845133104199563940546569815881922635295745535154", "A1": "16068833659589509967862441597475906062784244243534762226959372043157580352707" }, "Y": { "A0": "11307107059852564583020284602429478846076970197317863084699124775255989413569", "A1": "9672774999948706328422723175215978271740933699519877590038587650998269355729" } }, "Gamma": { "X": { "A0": "17235710036224860132265576392745360975930416986721407959126157047084684503914", "A1": "10041111045436592396830585503619446142387348824875731037061599181978628109810" }, "Y": { "A0": "20362549923344147883138251765806956214949149990089919532858953006220234370443", "A1": "21859478731034917814952666766295622606907908236375380972800568353870634524224" } } }, "CommitmentKey": { "G": { "X": { "A0": "17850908351491469459542288811350755306263562728442401161252065431638373478502", "A1": "6345720694907357159183235849471521595194714244218588817096938735631283758021" }, "Y": { "A0": "247740085647629325077212748946590675785346718359456574172438405532982587562", "A1": "15297256079821508805270557803849437418824372112305425291433043247300204499206" } }, "GRootSigmaNeg": { "X": { "A0": "11310523937834830894925835503791962702834007874257883599676369974748379224003", "A1": "20026537114404308865928088571824808504924367502333717580623093115023599589512" }, "Y": { "A0": "5469526284611008187529134846311473736359253328315372577679469342886253946655", "A1": "6391742303341596133328610316731619670171185501478606894301826934183437782481" } } }, "PublicAndCommitmentCommitted": [] } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/proof_bls.json ================================================ { "elliptic_curve_id": "bls12_381", "proof": { "a": { "x": "0x10d63379d266db8045f5c728dfa7fccf252d7a8b8f12403edd8cfcb8222f03b0e4b380fcfbf04de06661c03aa78411a8", "y": "0x2c0020b06ec1b7724838d62d7f025572d1a11a316e78e08c24b6497af9aeb024f49f8b360db2dd06e62b4a0b82e5152" }, "b": { "x": [ "0x10b361235d431450b05faa03fd4ecc9b868d0661624f2b93bae53a4fad489f850b025cee778400cd07df7ee73c5c448a", "0x18eab8fd69c3bd14a54d2bf078ef2d24565a8c5b9d13494d80f3d1ab2e12a6e550f47425e8a1b9c9dbc220c866998662" ], "y": [ "0x8a16230f79f3dca30dfc204f2eb3aed84a4590f460ad2e04ccbb7c5ac5c9a22450577ac7e68c1949f7002bf79cb928", "0x147986d801bf9ceeec6861f36b089209f570450362b927cfbfba0f9aa884451ed4cd86112db2c8950ddd7f26bd5c25d9" ] }, "c": { "x": "0x16998ff7eba66bfb87e0cd5dc462994ad8c2d05cba4913f2da2d11e16384828748a77c2bf63dde989a27d2f481d98017", "y": "0xed3a43bd7eba2c69dd71d48ef22aacdb044d34ba506b7c00ebe9803383f30df57976c287e5e99dc4dee75af6426b3b5" } }, "public_inputs": [ "0x37ef9cf41c99af8dddaf673a28adfa2d7a0452f8b3d5036d0336b258532659a1" ] } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/proof_bn254.json ================================================ { "elliptic_curve_id": "bn254", "proof": { "a": { "x": "0x2abaae3dd6e4c662f5e071bca525a26d21e2400d01d02c87bce2e8363285990a", "y": "0x24211ff0aa742a6dd1651aadce6f72757beb89de2cff83a6162de7c15674c2" }, "b": { "x": [ "0x2335f1564c154d7a2ec5d11faf6d991a205bef2858f1687976d0a46502f5224a", "0x223af0bb0912d8ebc535ed489d06cd01fcf4a8ab4596cc28164edf9041d97080" ], "y": [ "0x182e8fd86a44983de1d1d9dc4f12f134535b75d39f7aeb21adbf57e1a32ee603", "0xecb11668a0dd5d5031b0837e62ba14222b45718dc101c1278f44a9ed823c16b" ] }, "c": { "x": "0x290243624a4c11868e7cb0c0f7cfd690dac08e4205d19795b0a8f686dddcdfd6", "y": "0x15de00cc8af159fbdbdc802592e83e1ac61a8026b97e8889b8c5def59ec50b16" } }, "public_inputs": [ "0x1e17db88c1d2e83e49f692cce4bb8169309de90afb2b141156243106aa34b474" ] } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/proof_risc0.json ================================================ { "seal": "0xbb001d441cb19c0439e5cb54ab7dd4d4e0cd8c4809abe8e19ba602b4ce8728dc9e2eafbe27eac14be5e561f6cd697429d0567a4f46f62291b58f541c46fbf653dff6725424ade3fdf1cc1014e062fa9e6c2e8e3a785fb2f84af10a44adfe761483b1036a00bea38909a90b4f557b520cc77f01a33000444dd2c5c572d590e03c55c646392b8f7d3f65ab4b05ce2a339f86210a1762d8cae53bafdeaa105949019e5fb72a17506d1c6db5cfbfee339cd9e20abc9871d2d72e6c0e66b9e8f6f5ddce73181022cc8347b8ac33a5ee18bb0cecf4d47225112e90e1c4d0b896b7ab77701a8f4c1391b544bc1d7ba20e6287ff63fded2de08e02db62b0093be54044819071cd65", "image_id": "0x39b8aec425bb4e7eb994a0e4b6e9dbeceba907cf70f463cba7dc9786fe2dfb86", "journal": "0x6a75737420612073696d706c652072656365697074" } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/proof_sp1.json ================================================ { "a": 6765, "b": 10946, "n": 20, "vkey": "0x00e00f8bf845ce217630ab77a3351d3f099d2856198792afcc16af2182c56515", "publicValues": "0x000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000059", "proof": "0xa4594c5903a67b2b92ec80758bd62cf3413ae30ccb5cb124f80739ea729635128f87c9db0d73627973ff2282c89c329c82695448393ef4a1bada4d3959a1d0e421bd861704d40dd04d20f4e136c0fb4ba2bac814885c06d0cfed88053163a2ac94869e180baa720e442de1c19c21c25b35bf74ac737c8c23dd0ccfe5917761ef3d5cee7a0ab9f6dc9b4e5ef495e2f10d7943fa1caf07f9bbd2a77bf9fbcf68c8cdec9b6c009d21063f8f4c605027f40e289a48ce76fa83714bc54e609ca3e5cb25e3afc62745103dee46695a221fafd6e9cb82c03c04bf0cc88a87cbf7023df41fa14c0e158b03356b5595a573292c17bae969c87e752af1ee684a4bbf22a139e56f2b17" } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/snarkjs_proof_bls12381.json ================================================ { "pi_a": [ "3485152954408741741926847089831059591383907630239116784995436738189865955120885556199236406038466836214421991680954", "154860548139734477039420784520046002016510204339418245860838337803315632344536693944277400179443283236943549107802", "1" ], "pi_b": [ [ "1189367959700558605915032782653884912231211486629234350578524664401416658006900616682649282456970345937240392951950", "982972310153498651356609628173968597957580175097204901152956877592722284408961893988898846206769338927010864277897" ], [ "3246777898221659500974166559060565219973325513989979262303831078446971987804400344091345638114129082558119558551753", "2601576460715211741126146217362567970757072503270754030074152635959268934549623874228792250787598248683494341541345" ], [ "1", "0" ] ], "pi_c": [ "1085195810997077937681619424737706995724769918786687525244374537039253071968280399801210562531703830213202372135064", "1856101469241092608639064972061062850713586209905212394983879031529137271988213302924644800680307370920962192472181", "1" ], "protocol": "groth16", "curve": "bls12381" } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/snarkjs_proof_bn254.json ================================================ { "pi_a": [ "16867095230114469303111269582801754677348924111782514818746093562477643731718", "20212722335582718902672982589607764312189339603046913281774669180256203100136", "1" ], "pi_b": [ [ "12758685536372388449510929615906811839459760160946896050208195496890210504448", "17855758041968043219081456864094552349379559551194469443938085607012057050413" ], [ "13955825016276204826390255402887489684619114124020822491524581785493735884723", "4753473547991654414764256423822769241872233406220219643335981552335370273842" ], [ "1", "0" ] ], "pi_c": [ "671762906748438705619751301153263621349258242033442893897067744180576955019", "15774728702167052591009228304182510598553322825902260825229935303814649441886", "1" ], "protocol": "groth16", "curve": "bn128" } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/snarkjs_public_bls12381.json ================================================ [ "33" ] ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/snarkjs_public_bn254.json ================================================ [ "4949495449574848545353525153565755490000" ] ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/snarkjs_vk_bls12381.json ================================================ { "protocol": "groth16", "curve": "bls12381", "nPublic": 1, "vk_alpha_1": [ "617719894357822707200338965866967288645916822989814952192128521680407982056935061292695539424789514436737649020570", "1775573569831396653264686560336309197621289936135046264821117695406799098608560841754755393604030414133628560466572", "1" ], "vk_beta_2": [ [ "3190671720697032579966038958043749082431910320185488438584885357799875666538007862225898857680071255183618784274526", "2109983048617590705863408957465158941209063119456198804564963336478451431685374476111629305482784904783586572857246" ], [ "1307607189905149666129102654072967019627092794077689555202822796396352439021424323347818324960573077183522770267856", "1900404121357448535297505849416920425024592269018282269140428150423889516785732814217546769869760115347972284687857" ], [ "1", "0" ] ], "vk_gamma_2": [ [ "352701069587466618187139116011060144890029952792775240219908644239793785735715026873347600343865175952761926303160", "3059144344244213709971259814753781636986470325476647558659373206291635324768958432433509563104347017837885763365758" ], [ "1985150602287291935568054521177171638300868978215655730859378665066344726373823718423869104263333984641494340347905", "927553665492332455747201965776037880757740193453592970025027978793976877002675564980949289727957565575433344219582" ], [ "1", "0" ] ], "vk_delta_2": [ [ "366852083359495771420573803655070706723887233165902344758249134050725732074986801357894854373787524097680485812160", "1929292879518777463856044488640461740981505725491596027554586896635088707623734426665110797692856487251503397957282" ], [ "2254598519443759139488766131014151518103540652139959875744365134034290926557579834892936284712306438078601592202835", "1579781860493165881746712648978923866265169372051099801148285774757263488928119091040455043002626040812019987523163" ], [ "1", "0" ] ], "vk_alphabeta_12": [ [ [ "1452142021944451817001147821488760980628197809555746492149088759376801558507230381398112130922956796247321861289375", "3589943335445990207300848887279844052457873229678183531370805993048668299080419850906570256571227243962847710761873" ], [ "3903597354592031103308309118871575021632884960350471330510988979702965789330630890059202001609171434068520258153205", "3946350093536016351995160752026495035937348552583156252303497900799349531692051040596420119357283952583443910389762" ], [ "2102282561888264062210801164264241839369117163743635507322118155750136113340405089604922100303091868554501721762249", "2531185738689051206532445179458651900005160607002689799912357857873389589160857097337310452692979772133435166849387" ] ], [ [ "268035266762967876874392987406000236382149655324619726254104233887291204086099445046465766838845123428210938888504", "2284065767947019642521131033343080546417534737660925549949366442700626920713795808783010752157627204943408136876028" ], [ "1076537136017235627643817565337814768374777902297407144864672924447764202619243468694678042650211399863336315675838", "1887009084884823613240596596478048882143219870470500630710509802045379651327808154628725590953166551541512136377769" ], [ "1046436074149317708619564652103131188371298898561346600949516219491937906176848261764926236247040532660408816935149", "2498548906947681374488377175516087586952508282368134324705625079446848595370708686705968001763117178823569586185480" ] ] ], "IC": [ [ "3038675585551733423759427014529506635383300842391718374851632488058684610686018372519161362761589617875149189018434", "3457250587514594213032030450777853834958299643191424041917496003575595361031754963283792975531474621085487370891270", "1" ], [ "2908373117630088213536346041612807972869015198725869057358798292417391140094075526116715756590056301255114140540096", "2978460359983701297569278319168561969577969749822291955720738000037752496066084206945259159825701820797945902273048", "1" ] ] } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/snarkjs_vk_bn254.json ================================================ { "protocol": "groth16", "curve": "bn128", "nPublic": 1, "vk_alpha_1": [ "20491192805390485299153009773594534940189261866228447918068658471970481763042", "9383485363053290200918347156157836566562967994039712273449902621266178545958", "1" ], "vk_beta_2": [ [ "6375614351688725206403948262868962793625744043794305715222011528459656738731", "4252822878758300859123897981450591353533073413197771768651442665752259397132" ], [ "10505242626370262277552901082094356697409835680220590971873171140371331206856", "21847035105528745403288232691147584728191162732299865338377159692350059136679" ], [ "1", "0" ] ], "vk_gamma_2": [ [ "10857046999023057135944570762232829481370756359578518086990519993285655852781", "11559732032986387107991004021392285783925812861821192530917403151452391805634" ], [ "8495653923123431417604973247489272438418190587263600148770280649306958101930", "4082367875863433681332203403145435568316851327593401208105741076214120093531" ], [ "1", "0" ] ], "vk_delta_2": [ [ "10857046999023057135944570762232829481370756359578518086990519993285655852781", "11559732032986387107991004021392285783925812861821192530917403151452391805634" ], [ "8495653923123431417604973247489272438418190587263600148770280649306958101930", "4082367875863433681332203403145435568316851327593401208105741076214120093531" ], [ "1", "0" ] ], "vk_alphabeta_12": [ [ [ "2029413683389138792403550203267699914886160938906632433982220835551125967885", "21072700047562757817161031222997517981543347628379360635925549008442030252106" ], [ "5940354580057074848093997050200682056184807770593307860589430076672439820312", "12156638873931618554171829126792193045421052652279363021382169897324752428276" ], [ "7898200236362823042373859371574133993780991612861777490112507062703164551277", "7074218545237549455313236346927434013100842096812539264420499035217050630853" ] ], [ [ "7077479683546002997211712695946002074877511277312570035766170199895071832130", "10093483419865920389913245021038182291233451549023025229112148274109565435465" ], [ "4595479056700221319381530156280926371456704509942304414423590385166031118820", "19831328484489333784475432780421641293929726139240675179672856274388269393268" ], [ "11934129596455521040620786944827826205713621633706285934057045369193958244500", "8037395052364110730298837004334506829870972346962140206007064471173334027475" ] ] ], "IC": [ [ "3230230166848506278169341429844025995277520944155248223069557471517720414099", "13103770257244981396389858672913686503786254567452595604017418062281627967708", "1" ], [ "19371697418061315618343891460787183627139127309393053314424436252400705071207", "9445383417235588302514232777371752216736256846043789115945856987874292878586", "1" ] ] } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/vk_bls.json ================================================ { "elliptic_curve_id": "bls12_381", "verifying_key": { "alpha_g1": { "x": "0xfda482e4d7d7cfe718413cd03a290e7f48e6d18867caf21e74f594eedeead1ab2ccf6bf0ed52c492f683f27d6c72861", "y": "0x4bd64182ba2f15d84b4d622a67cdbfe1ba25a8a416972129bdc05965421ef89412b831f7e6ddf612f3892b06997e696" }, "beta_g2": { "x": [ "0xa4aafdfdee1356d7089291430753ddc48bbe3dfee5677d9016b14645db6a1a623063b2c2261f53625d3bc80a6839dca", "0x15d2ebb1584d1fc5c7e839cb5a2fdeb0c93da725ab2e89dc9f14d31ec3fd7a54c11b02df84e197ab492c02804b9d68b0" ], "y": [ "0x1064cc36c6f87308d58223eddb809fde1f0f345df537b21bf321187a6b25c03894402fc778584f59aed1223fe87c625b", "0x54c52a9ef6c89facbef0d20c8c4b254403ef22effc3a8dccd06a5ad9e3c7f6a90ab356444f80191850b3fb6cadc64dd" ] }, "gamma_g2": { "x": [ "0xdd0d7c6d60ac00708ff7db2c274f8bcf99c710a010e41a0221d9fa6582f8ab41f299a1daa65cdf007aef54c6f623dde", "0x604b708bc781ae38a361b93451384c060e8865aff71dbefee8326798aab2bfea23775cc734de87c275c5ff8648ec130" ], "y": [ "0x1541ecff208d5a5cd2d552961c77b46d0593da85473e42c41b15cfdecac55c2f6881eaa3a6a2e609a74c6461dbb15b12", "0x108c95049535bcd1117cdbdf6b8b64d4ead6109ba5c739e44c6c5689af7c6b120e3ab986699092f65f774234b7f31840" ] }, "delta_g2": { "x": [ "0x18b219a74108de96a9519a60d0b71d6edfa740f665e34c84d83ce7d5ca555ae1cc54e5306295df8b9ffbb9f638117fb4", "0xe3e7a8c90ba5b5e266fea7105f5d374324ad0e72809aeeda144ffba7defff7d45169d6f7e3c781dba158e67256dc98e" ], "y": [ "0x11b12761f310cbe4ba3e1ded446f45ca171a1edf9abe76b8a5afe44806a147a2c04a80ae04573d43941a95edd7fc0b3c", "0x11ece09d0b6f1a1ea16238a512fe3d86972bfca288dc7d9b08a1e0e97cea1801e094fdc71af32f6be0d4fbaaa3a16480" ] }, "ic": [ { "x": "0x126fbe91d07c71cd11847edc0855a100cf099f57330483371d3926283f7823c830469f8daea925952b1d5dcc848e1107", "y": "0x11d4302c0095dfb2bcb31a448382ca23441bb4a34775829be81081ed3027415c05028dc0dffe1c953fd7a62db3ea0f7d" }, { "x": "0x17eb504b7c7c4fcec2570d705447e4279f17852eabd158fa2f62c85bb229d8c136b83c0846c87cd685c7c1d6fdcd1e9b", "y": "0x682ec2d49889aa39ae6f079620cad3e73faf12d0844d15fed8dc9e752c0f5ec50f0bf391af88a58b9173f40990d461d" } ] } } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/vk_bn254.json ================================================ { "elliptic_curve_id": "bn254", "verifying_key": { "alpha_g1": { "x": "0xef3cb41414ad20b4fc5891f6b41a263d9f0c0509ee5ab16f866ff6a33fb9e73", "y": "0x1b30646c7d96cf7830a42b1f2f7c0527c38601f1030674b0f14cf7c67de5027b" }, "beta_g2": { "x": [ "0x21f7077b68f4faa9dcbfdc868e9a0b5c76eb0d62b919772a83b34a8bc1108489", "0x8693a2418c12721dddb0d4f9f3811645c372de7400061b6c6cebc4b3b799bb2" ], "y": [ "0x3062e0c71d392fb15f33a8d7f87bf689709cb28f87d554e29dc92d92d1b0ce46", "0x4976fda5a1cd2a69e5b4fd77116cf638be2063a3359e40d8f3e8ec0c90ffd90" ] }, "gamma_g2": { "x": [ "0x3541dacedd860ef884359c76cc9c6b81d289d3389e732f5f87195d15a4ce637", "0x2eb7d1fa8416da97272d9cc4aa2e71146c83c13be313e222b376d9a9da02f080" ], "y": [ "0x8dce093ad7f7fe20efcb8bbb160b0f2ecb7cd98a7d48b949e86c8b00eef73f9", "0x29a4b793edc639746eb4af5910b954a713c49174d917839a146ea15cd7493f1d" ] }, "delta_g2": { "x": [ "0x34fc9ba8eba1e49185580c9ee198f6cac8bc78463d786683ef471af4434acdc", "0x17f115a16975c6f261912be284ecae3a3f0899bb161153d19ebc7f594246b9b0" ], "y": [ "0x17fd1ad43bbc8ef931c92abab72ef0ed83a3c195b4dbc7294e1eacf59b3e2054", "0x1bd7d75bf918b6766ff9481052ddb780a4cc43da055b6e98c187b34ca3e7cd1b" ] }, "ic": [ { "x": "0x124e30bf4dff3ae9c9da665a8bebfd01ce6489a462587fa0f6c879156e7390bc", "y": "0x1fdc3a96cea49b085e101dd2383fdc600dcb4a3450c0471724e1b022791c7532" }, { "x": "0x164668f89d9d6c6126a8465790ba44ddb5716750edaa0ed100691cceb974c6a1", "y": "0x1d9c7309625ec7cf153290e7b5c8497412386c61f3d9d0426a702f368be936da" } ] } } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/vk_risc0.json ================================================ { "elliptic_curve_id": "bn254", "verifying_key": { "alpha_g1": { "x": "20491192805390485299153009773594534940189261866228447918068658471970481763042", "y": "9383485363053290200918347156157836566562967994039712273449902621266178545958" }, "beta_g2": { "x": [ "6375614351688725206403948262868962793625744043794305715222011528459656738731", "4252822878758300859123897981450591353533073413197771768651442665752259397132" ], "y": [ "10505242626370262277552901082094356697409835680220590971873171140371331206856", "21847035105528745403288232691147584728191162732299865338377159692350059136679" ] }, "gamma_g2": { "x": [ "10857046999023057135944570762232829481370756359578518086990519993285655852781", "11559732032986387107991004021392285783925812861821192530917403151452391805634" ], "y": [ "8495653923123431417604973247489272438418190587263600148770280649306958101930", "4082367875863433681332203403145435568316851327593401208105741076214120093531" ] }, "delta_g2": { "x": [ "12043754404802191763554326994664886008979042643626290185762540825416902247219", "1668323501672964604911431804142266013250380587483576094566949227275849579036" ], "y": [ "13740680757317479711909903993315946540841369848973133181051452051592786724563", "7710631539206257456743780535472368339139328733484942210876916214502466455394" ] }, "ic": [ { "x": "8446592859352799428420270221449902464741693648963397251242447530457567083492", "y": "1064796367193003797175961162477173481551615790032213185848276823815288302804" }, { "x": "3179835575189816632597428042194253779818690147323192973511715175294048485951", "y": "20895841676865356752879376687052266198216014795822152491318012491767775979074" }, { "x": "5332723250224941161709478398807683311971555792614491788690328996478511465287", "y": "21199491073419440416471372042641226693637837098357067793586556692319371762571" }, { "x": "12457994489566736295787256452575216703923664299075106359829199968023158780583", "y": "19706766271952591897761291684837117091856807401404423804318744964752784280790" }, { "x": "19617808913178163826953378459323299110911217259216006187355745713323154132237", "y": "21663537384585072695701846972542344484111393047775983928357046779215877070466" }, { "x": "6834578911681792552110317589222010969491336870276623105249474534788043166867", "y": "15060583660288623605191393599883223885678013570733629274538391874953353488393" } ] } } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/examples/vk_sp1.json ================================================ { "elliptic_curve_id": "bn254", "verifying_key": { "alpha_g1": { "x": "20491192805390485299153009773594534940189261866228447918068658471970481763042", "y": "9383485363053290200918347156157836566562967994039712273449902621266178545958" }, "beta_g2": { "x": [ "6375614351688725206403948262868962793625744043794305715222011528459656738731", "4252822878758300859123897981450591353533073413197771768651442665752259397132" ], "y": [ "10505242626370262277552901082094356697409835680220590971873171140371331206856", "21847035105528745403288232691147584728191162732299865338377159692350059136679" ] }, "gamma_g2": { "x": [ "10857046999023057135944570762232829481370756359578518086990519993285655852781", "11559732032986387107991004021392285783925812861821192530917403151452391805634" ], "y": [ "8495653923123431417604973247489272438418190587263600148770280649306958101930", "4082367875863433681332203403145435568316851327593401208105741076214120093531" ] }, "delta_g2": { "x": [ "1807939758600928081661535078044266309701426477869595321608690071623627252461", "13017767206419180294867239590191240882490168779777616723978810680471506089190" ], "y": [ "10502989906366911348242388724733295820842209644634809310320863638233510108549", "21180421563366853441821323225017992136002640878057833710059913133125356733516" ] }, "ic": [ { "x": "17203997695518370725253383800612862082040222186834248316724952811913305748878", "y": "282619892079818506885924724237935832196325815176482254129420869757043108110" }, { "x": "2763789253671512309630211343474627955637016507408470052385640371173442321228", "y": "7070003421332099028511324531870215047017050364545890942981741487547942466073" }, { "x": "2223923876691923064813371578678400285087400227347901303400514986210692294428", "y": "3228708299174762375496115493137156328822199374794870011715145604387710550517" } ] } } ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/generator.py ================================================ import os import subprocess from pathlib import Path from garaga.curves import CurveID, ProofSystem from garaga.modulo_circuit_structs import G2Line, StructArray from garaga.precompiled_circuits.multi_miller_loop import precompute_lines from garaga.starknet.cli.utils import create_directory, get_package_version from garaga.starknet.constants import CAIRO_VERSION, STARKNET_FOUNDRY_VERSION from garaga.starknet.groth16_contract_generator.calldata import ( groth16_calldata_from_vk_and_proof, ) from garaga.starknet.groth16_contract_generator.parsing_utils import ( Groth16Proof, Groth16VerifyingKey, ) ECIP_OPS_CLASS_HASH = 0x396D5915ECF475AAB117BB25A0272B261E9E25FFE1C0CE05A51A3F77489C89E def precompute_lines_from_vk(vk: Groth16VerifyingKey) -> StructArray: # Precompute lines for fixed G2 points lines = precompute_lines([vk.gamma, vk.delta]) precomputed_lines = StructArray( name="lines", elmts=[ G2Line(name=f"line{i}", elmts=lines[i : i + 4]) for i in range(0, len(lines), 4) ], ) return precomputed_lines def gen_test_file( contract_name: str, verifier_name: str, system: ProofSystem, verification_function_name: str, package_name: str, rpc_url: str = "https://api.zan.top/public/starknet-sepolia/rpc/v0_10", ): code = f""" //! # Starknet Verification Contract Tests //! //! This module contains comprehensive tests for the proof verification contract. //! The tests use Starknet Foundry's testing features to verify proofs. //! //! ## Test Strategy //! - Use real proof fixtures generated by the garaga CLI //! - Test both positive (valid proof) and negative (invalid proof) cases use snforge_std::fs::{{FileTrait, read_txt}}; use snforge_std::{{DeclareResultTrait, declare}}; use {package_name}::{verifier_name}::{{ I{contract_name}LibraryDispatcher, I{contract_name}DispatcherTrait, }}; use starknet::ClassHash; /// Declare the {contract_name} contract for testing. /// /// This function declares a new instance of the {contract_name} contract /// /// # Arguments /// * `name` - The contract name to declare /// /// # Returns /// * `ClassHash` - The class hash of the declared contract /// /// # Example /// ```cairo /// let class_hash = declare_contract("{contract_name}"); /// let dispatcher = I{contract_name}LibraryDispatcher {{ class_hash }}; /// ``` fn declare_contract(name: ByteArray) -> ClassHash {{ let class_hash = *declare(name).unwrap().contract_class().class_hash; class_hash }} /// Test the verification function {verification_function_name} with a valid proof. /// /// This test demonstrates the complete verification flow: /// 1. Declare the verification contract /// 2. Load a pre-generated proof fixture /// 3. Verify the proof on-chain /// 4. Assert that verification succeeds /// /// ## Test Setup /// - Uses fork testing against Sepolia testnet to access required declared contracts maintained by the garaga team /// - Loads proof calldata from `tests/proof_calldata.txt` /// - To generate the calldata, you can use the garaga CLI: /// ```bash /// garaga calldata /// --system {system.value} /// --vk path/to/vk /// --proof path/to/proof /// --public-inputs path/to/public_inputs /// --format snforge /// --output-path path/to/tests /// ``` /// This will generate a file `proof_calldata.txt` in the specified output path. /// You can then use this file in the test. /// /// ## Expected Behavior /// - The proof should verify successfully /// - The function should return Ok(public_inputs) containing the expected public inputs /// - No panics or assertion failures should occur #[test] #[fork(url: "{rpc_url}", block_tag: latest)] fn test_{verification_function_name}() {{ // Step 1: Declare the verification contract let class_hash = declare_contract("{contract_name}"); let dispatcher = I{contract_name}LibraryDispatcher {{ class_hash }}; // Step 2: Load the proof fixture generated by the script // This file contains the {system.value} proof calldata formatted for Starknet let file = FileTrait::new("tests/proof_calldata.txt"); let calldata = read_txt(@file).span(); // Step 3: Verify the proof on-chain // This calls the contract's {verification_function_name} function with the loaded proof data let result = dispatcher.{verification_function_name}(calldata); // Step 4: Assert that verification succeeded // A valid proof should return Ok(public_inputs), not Err assert(result.is_ok(), 'Proof verification failed'); // Optional: You can also verify the public inputs contain expected values // let public_inputs = result.unwrap(); // assert(public_inputs.len() > 0, 'No public inputs'); // Additional assertions on the public input values can be added here }} """ return code def get_scarb_toml_file(package_name: str, cli_mode: bool, inlining_level: int = 2): version = get_package_version() header = f"# Generated by Garaga version {version}\n" if version == "dev": suffix = "" else: suffix = ', tag = "v' + version + '"' if cli_mode: dep = 'git = "https://github.com/keep-starknet-strange/garaga.git"' + suffix else: dep = 'path = "../../../"' return header + f"""[package] name = "{package_name}" version = "0.1.0" edition = "2024_07" [dependencies] garaga = {{ {dep} }} starknet = "{CAIRO_VERSION}" [cairo] sierra-replace-ids = false inlining-strategy = {inlining_level} [dev-dependencies] snforge_std = "{STARKNET_FOUNDRY_VERSION}" assert_macros = "{CAIRO_VERSION}" [[target.starknet-contract]] casm = true casm-add-pythonic-hints = true """ def write_test_calldata_file( output_folder_path: str, vk: Groth16VerifyingKey, proof: Groth16Proof, ) -> None: """Write the test calldata file for a given verifying key and proof.""" tests_dir = os.path.join(output_folder_path, "tests") cd = groth16_calldata_from_vk_and_proof(vk, proof) with open(os.path.join(tests_dir, "proof_calldata.txt"), "w") as f: for x in cd[1:]: f.write(f"{hex(x)}\n") def create_verifier_directory_structure( output_folder_path: str, include_test_sample: bool = True ) -> tuple[str, str]: """Create the standard directory structure for a verifier contract. Returns: tuple: (src_dir, tests_dir) paths """ create_directory(output_folder_path) src_dir = os.path.join(output_folder_path, "src") tests_dir = ( os.path.join(output_folder_path, "tests") if include_test_sample else None ) create_directory(src_dir) if include_test_sample: create_directory(tests_dir) return src_dir, tests_dir def write_tool_versions_file(output_folder_path: str) -> None: """Write the .tool-versions file.""" with open(os.path.join(output_folder_path, ".tool-versions"), "w") as f: f.write(f"scarb {CAIRO_VERSION}\n") f.write(f"starknet-foundry {STARKNET_FOUNDRY_VERSION}\n") def write_lib_cairo_file(src_dir: str, modules: list[str] = None) -> None: """Write the lib.cairo file with specified modules.""" if modules is None: modules = ["groth16_verifier", "groth16_verifier_constants"] module_imports = "\n".join(f"pub mod {module};" for module in modules) with open(os.path.join(src_dir, "lib.cairo"), "w") as f: version = get_package_version() header = f"// Generated by Garaga version {version}\n" f.write(header + f"\n{module_imports}\n") def write_verifier_files( output_folder_path: str, package_name: str, constants_code: str | None, contract_code: str, contract_cairo_name: str, verification_function_name: str, system: ProofSystem, cli_mode: bool = False, circuits_code: str | None = None, modules: list[str] = None, constants_filename: str = "groth16_verifier_constants.cairo", contract_filename: str = "groth16_verifier.cairo", circuits_filename: str | None = None, include_test_sample: bool = True, constants_output_path: str | None = None, ) -> None: """Write all the standard verifier files (directories, constants, contract, scarb.toml, lib.cairo, test files).""" # Create directory structure src_dir, tests_dir = create_verifier_directory_structure( output_folder_path, include_test_sample ) # Write tool versions write_tool_versions_file(output_folder_path) # Build header once for Cairo files version = get_package_version() header_cairo = f"// Generated by Garaga version {version}\n" # Write Scarb.toml with open(os.path.join(output_folder_path, "Scarb.toml"), "w") as f: f.write(get_scarb_toml_file(package_name, cli_mode)) # Write lib.cairo write_lib_cairo_file(src_dir, modules) # Write constants file (if requested) if constants_code is not None: target_constants_path = constants_output_path or os.path.join( src_dir, constants_filename ) target_constants_dir = os.path.dirname(target_constants_path) os.makedirs(target_constants_dir, exist_ok=True) with open(target_constants_path, "w") as f: f.write(header_cairo + constants_code) subprocess.run(["scarb", "fmt", "."], cwd=target_constants_dir, check=True) # Write contract file with open(os.path.join(src_dir, contract_filename), "w") as f: f.write(header_cairo + contract_code) # Write circuits file if provided if circuits_code and circuits_filename: with open(os.path.join(src_dir, circuits_filename), "w") as f: f.write(header_cairo + circuits_code) # Write test file. if include_test_sample: with open(os.path.join(tests_dir, "test_contract.cairo"), "w") as f: f.write( header_cairo + gen_test_file( contract_cairo_name, contract_filename.removesuffix(".cairo"), system, verification_function_name, package_name, ) ) subprocess.run(["scarb", "fmt", "."], cwd=output_folder_path, check=True) def write_test_calldata_file_generic( output_folder_path: str, system: ProofSystem, vk_path: str, proof_path: str, public_inputs_path: str = None, ) -> None: """Write the test calldata file for any proof system using get_calldata_generic.""" from pathlib import Path as PathType from garaga.starknet.cli.verify import get_calldata_generic tests_dir = os.path.join(output_folder_path, "tests") cd = get_calldata_generic( system, PathType(vk_path), PathType(proof_path), PathType(public_inputs_path) if public_inputs_path else None, ) with open(os.path.join(tests_dir, "proof_calldata.txt"), "w") as f: for x in cd[1:]: f.write(f"{hex(x)}\n") def gen_groth16_verifier( vk: str | Path | Groth16VerifyingKey, output_folder_path: str, output_folder_name: str, ecip_class_hash: int = ECIP_OPS_CLASS_HASH, cli_mode: bool = False, include_test_sample: bool = True, ) -> str: if isinstance(vk, (Path, str)): vk = Groth16VerifyingKey.from_json(vk) else: vk = vk curve_id = vk.curve_id if cli_mode: output_folder_name = output_folder_name else: output_folder_name = output_folder_name + f"_{curve_id.name.lower()}" output_folder_path = os.path.join(output_folder_path, output_folder_name) precomputed_lines = precompute_lines_from_vk(vk) verification_function_name = f"verify_groth16_proof_{curve_id.name.lower()}" contract_cairo_name = f"Groth16Verifier{curve_id.name}" constants_code = f""" use garaga::definitions::{{G1Point, G2Point, E12D, G2Line, u384}}; {f"use garaga::definitions::u288;" if curve_id!=CurveID.BLS12_381 else ""} use garaga::groth16::Groth16VerifyingKey; pub const N_PUBLIC_INPUTS:usize = {len(vk.ic)-1}; {vk.serialize_to_cairo()} pub const precomputed_lines: [G2Line<{"u384" if curve_id==CurveID.BLS12_381 else "u288"}>; {len(precomputed_lines)//4}] = {precomputed_lines.serialize(raw=True, const=True)}; """ contract_code = f""" use super::groth16_verifier_constants::{{N_PUBLIC_INPUTS, vk, ic, precomputed_lines}}; #[starknet::interface] pub trait I{contract_cairo_name} {{ fn {verification_function_name}( self: @TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; }} #[starknet::contract] mod {contract_cairo_name} {{ use starknet::SyscallResultTrait; use garaga::definitions::{{G1Point, G1G2Pair}}; use garaga::groth16::{{multi_pairing_check_{curve_id.name.lower()}_3P_2F_with_extra_miller_loop_result, Groth16ProofRawTrait}}; use garaga::ec_ops::{{G1PointTrait, ec_safe_add}}; use garaga::utils::calldata::{{deserialize_full_proof_with_hints_{curve_id.name.lower()}}}; use super::{{N_PUBLIC_INPUTS, vk, ic, precomputed_lines}}; const ECIP_OPS_CLASS_HASH: felt252 = {hex(ecip_class_hash)}; #[storage] struct Storage {{}} #[abi(embed_v0)] impl IGroth16Verifier{curve_id.name} of super::IGroth16Verifier{curve_id.name} {{ fn {verification_function_name}( self: @ContractState, full_proof_with_hints: Span, ) -> Result, felt252> {{ // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok(public_inputs) if the proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given a proof and a verifying key. let fph = deserialize_full_proof_with_hints_{curve_id.name.lower()}(full_proof_with_hints); let groth16_proof = fph.groth16_proof; let mpcheck_hint = fph.mpcheck_hint; let msm_hint = fph.msm_hint; groth16_proof.raw.check_proof_points({curve_id.value}); let ic = ic.span(); let vk_x: G1Point = match ic.len() {{ 0 => panic!("Malformed VK"), 1 => *ic.at(0), _ => {{ // Start serialization with the hint array directly to avoid copying it. let mut msm_calldata: Array = array![]; // Add the points from VK and public inputs to the proof. Serde::serialize(@ic.slice(1, N_PUBLIC_INPUTS), ref msm_calldata); Serde::serialize(@groth16_proof.public_inputs, ref msm_calldata); // Complete with the curve indentifier ({curve_id.value} for {curve_id.name}): msm_calldata.append({curve_id.value}); // Add the hint array. for x in msm_hint {{ msm_calldata.append(*x); }} // Call the multi scalar multiplication endpoint on the Garaga ECIP ops contract // to obtain vk_x. let mut _vx_x_serialized = starknet::syscalls::library_call_syscall( ECIP_OPS_CLASS_HASH.try_into().unwrap(), selector!("msm_g1"), msm_calldata.span() ) .unwrap_syscall(); ec_safe_add( Serde::::deserialize(ref _vx_x_serialized).unwrap(), *ic.at(0), {curve_id.value} ) }} }}; // Perform the pairing check. let check = multi_pairing_check_{curve_id.name.lower()}_3P_2F_with_extra_miller_loop_result( G1G2Pair {{ p: vk_x, q: vk.gamma_g2 }}, G1G2Pair {{ p: groth16_proof.raw.c, q: vk.delta_g2 }}, G1G2Pair {{ p: groth16_proof.raw.a.negate({curve_id.value}), q: groth16_proof.raw.b }}, vk.alpha_beta_miller_loop_result, precomputed_lines.span(), mpcheck_hint, ); match check {{ Result::Ok(_) => Result::Ok(groth16_proof.public_inputs), Result::Err(error) => Result::Err(error), }} }} }} }} """ # Use the new reusable function to write all files write_verifier_files( output_folder_path, output_folder_name, constants_code, contract_code, contract_cairo_name, verification_function_name, ProofSystem.Groth16, cli_mode, include_test_sample=include_test_sample, ) return constants_code if __name__ == "__main__": EXAMPLES_FOLDER = "hydra/garaga/starknet/groth16_contract_generator/examples" vk_paths = [ os.path.join(EXAMPLES_FOLDER, "vk_bn254.json"), os.path.join(EXAMPLES_FOLDER, "vk_bls.json"), ] proof_paths = [ os.path.join(EXAMPLES_FOLDER, "proof_bn254.json"), os.path.join(EXAMPLES_FOLDER, "proof_bls.json"), ] CONTRACTS_FOLDER = "src/contracts/autogenerated/" # Do not change this FOLDER_NAME = "groth16_example" # '_curve_id' is appended in the end. def _generate_verifier(vk_path): try: gen_groth16_verifier( vk_path, CONTRACTS_FOLDER, FOLDER_NAME, ECIP_OPS_CLASS_HASH ) except Exception as e: print(f"An error occurred: {e}") raise e for vk_path in vk_paths: _generate_verifier(vk_path) FOLDER_NAMES = [f"groth16_example_bn254", "groth16_example_bls12_381"] for contract_name, vk_path, proof_path in zip(FOLDER_NAMES, vk_paths, proof_paths): vk = Groth16VerifyingKey.from_json(vk_path) proof = Groth16Proof.from_json(proof_path=proof_path) output_folder_path = os.path.join(CONTRACTS_FOLDER, contract_name) write_test_calldata_file_generic( output_folder_path, system=ProofSystem.Groth16, vk_path=vk_path, proof_path=proof_path, ) ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/generator_risc0.py ================================================ import os from garaga.curves import ProofSystem from garaga.modulo_circuit_structs import G1PointCircuit from garaga.starknet.constants import RISC0_RELEASE_VERSION from garaga.starknet.groth16_contract_generator.generator import ( ECIP_OPS_CLASS_HASH, precompute_lines_from_vk, write_test_calldata_file_generic, write_verifier_files, ) from garaga.starknet.groth16_contract_generator.parsing_utils import ( RISC0_BN254_CONTROL_ID, RISC0_CONTROL_ROOT, Groth16Proof, Groth16VerifyingKey, split_digest, ) PACKAGE_NAME = "risc0_verifier" def gen_risc0_groth16_verifier( vk_path: str, output_folder_path: str, output_folder_name: str, ecip_class_hash: int = ECIP_OPS_CLASS_HASH, control_root: int = RISC0_CONTROL_ROOT, control_id: int = RISC0_BN254_CONTROL_ID, cli_mode: bool = False, ) -> str: vk = Groth16VerifyingKey.from_json(vk_path) curve_id = vk.curve_id output_folder_name = output_folder_name + f"_{curve_id.name.lower()}" output_folder_path = os.path.join(output_folder_path, output_folder_name) precomputed_lines = precompute_lines_from_vk(vk) CONTROL_ROOT_0, CONTROL_ROOT_1 = split_digest(control_root) T = G1PointCircuit.from_G1Point( name="T", point=(vk.ic[1].scalar_mul(CONTROL_ROOT_0)) .add(vk.ic[2].scalar_mul(CONTROL_ROOT_1)) .add(vk.ic[5].scalar_mul(control_id).add(vk.ic[0])), ) contract_cairo_name = f"Risc0Groth16Verifier{curve_id.name}" constants_code = f""" use garaga::definitions::{{G1Point, G2Point, E12D, G2Line, u384, u288}}; use garaga::groth16::Groth16VerifyingKey; pub const N_FREE_PUBLIC_INPUTS:usize = 2; // RISC0 version tag : {RISC0_RELEASE_VERSION} // CONTROL ROOT USED : {hex(control_root)} // \t CONTROL_ROOT_0 : {hex(CONTROL_ROOT_0)} // \t CONTROL_ROOT_1 : {hex(CONTROL_ROOT_1)} // BN254 CONTROL ID USED : {hex(control_id)} pub const T: G1Point = {T.serialize(raw=True)}; // IC[0] + IC[1] * CONTROL_ROOT_0 + IC[2] * CONTROL_ROOT_1 + IC[5] * BN254_CONTROL_ID {vk.serialize_to_cairo()} pub const precomputed_lines: [G2Line; {len(precomputed_lines)//4}] = {precomputed_lines.serialize(raw=True, const=True)}; """ verification_function_name = f"verify_r0_groth16_proof_{curve_id.name.lower()}" contract_code = f""" use super::groth16_verifier_constants::{{N_FREE_PUBLIC_INPUTS, vk, ic, precomputed_lines, T}}; #[starknet::interface] pub trait IRisc0Groth16Verifier{curve_id.name} {{ fn {verification_function_name}( self: @TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; }} #[starknet::contract] mod Risc0Groth16Verifier{curve_id.name} {{ use starknet::SyscallResultTrait; use garaga::definitions::{{G1Point, G1G2Pair}}; use garaga::groth16::{{multi_pairing_check_{curve_id.name.lower()}_3P_2F_with_extra_miller_loop_result, Groth16ProofRawTrait}}; use garaga::ec_ops::{{G1PointTrait, ec_safe_add}}; use garaga::apps::risc0::{{compute_receipt_claim, journal_sha256, deserialize_full_proof_with_hints_risc0}}; use super::{{N_FREE_PUBLIC_INPUTS, vk, ic, precomputed_lines, T}}; const ECIP_OPS_CLASS_HASH: felt252 = {hex(ecip_class_hash)}; #[storage] struct Storage {{}} #[abi(embed_v0)] impl IRisc0Groth16Verifier{curve_id.name} of super::IRisc0Groth16Verifier{curve_id.name} {{ fn {verification_function_name}( self: @ContractState, full_proof_with_hints: Span, ) -> Result, felt252> {{ // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok(public_inputs) if the proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given a proof and a verifying key. let fph = deserialize_full_proof_with_hints_risc0(full_proof_with_hints); let groth16_proof = fph.groth16_proof; let image_id = fph.image_id; let journal = fph.journal; let mpcheck_hint = fph.mpcheck_hint; let msm_hint = fph.msm_hint; groth16_proof.check_proof_points({curve_id.value}); let ic = ic.span(); let journal_digest = journal_sha256(journal); let claim_digest = compute_receipt_claim(image_id, journal_digest); // Start serialization with the hint array directly to avoid copying it. let mut msm_calldata: Array = array![]; // Add the points from VK relative to the non-constant public inputs. Serde::serialize(@ic.slice(3, N_FREE_PUBLIC_INPUTS), ref msm_calldata); // Add the claim digest as u256 scalars for the msm. msm_calldata.append(2); msm_calldata.append(claim_digest.low.into()); msm_calldata.append(0); msm_calldata.append(claim_digest.high.into()); msm_calldata.append(0); // Complete with the curve indentifier ({curve_id.value} for {curve_id.name}): msm_calldata.append({curve_id.value}); // Add the hint array. for x in msm_hint {{ msm_calldata.append(*x); }} // Call the multi scalar multiplication endpoint on the Garaga ECIP ops contract // to obtain claim0 * IC[3] + claim1 * IC[4]. let mut _msm_result_serialized = starknet::syscalls::library_call_syscall( ECIP_OPS_CLASS_HASH.try_into().unwrap(), selector!("msm_g1"), msm_calldata.span() ) .unwrap_syscall(); // Finalize vk_x computation by adding the precomputed T point. let vk_x = ec_safe_add( T, Serde::::deserialize(ref _msm_result_serialized).unwrap(), {curve_id.value} ); // Perform the pairing check. let check = multi_pairing_check_{curve_id.name.lower()}_3P_2F_with_extra_miller_loop_result( G1G2Pair {{ p: vk_x, q: vk.gamma_g2 }}, G1G2Pair {{ p: groth16_proof.c, q: vk.delta_g2 }}, G1G2Pair {{ p: groth16_proof.a.negate({curve_id.value}), q: groth16_proof.b }}, vk.alpha_beta_miller_loop_result, precomputed_lines.span(), mpcheck_hint, ); match check {{ Result::Ok(_) => Result::Ok(journal), Result::Err(error) => Result::Err(error), }} }} }} }} """ # Use the reusable function to write all files write_verifier_files( output_folder_path, output_folder_name, constants_code, contract_code, contract_cairo_name, verification_function_name, ProofSystem.Groth16, cli_mode, ) return constants_code if __name__ == "__main__": pass RISCO_VK_PATH = ( "hydra/garaga/starknet/groth16_contract_generator/examples/vk_risc0.json" ) PROOF_PATH = ( "hydra/garaga/starknet/groth16_contract_generator/examples/proof_risc0.json" ) CONTRACTS_FOLDER = "src/contracts/autogenerated/" # Do not change this FOLDER_NAME = "risc0_verifier" # '_curve_id' is appended in the end. gen_risc0_groth16_verifier( RISCO_VK_PATH, CONTRACTS_FOLDER, FOLDER_NAME, ECIP_OPS_CLASS_HASH ) vk = Groth16VerifyingKey.from_json(file_path=RISCO_VK_PATH) proof = Groth16Proof.from_json(proof_path=PROOF_PATH) # Generate the calldata and write test calldata file: output_folder_path = os.path.join( CONTRACTS_FOLDER, f"{FOLDER_NAME}_{vk.curve_id.name.lower()}" ) write_test_calldata_file_generic( output_folder_path, system=ProofSystem.Groth16, # RISC0 uses Groth16 vk_path=RISCO_VK_PATH, proof_path=PROOF_PATH, ) ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/generator_sp1.py ================================================ import os from textwrap import dedent from garaga.curves import ProofSystem from garaga.starknet.groth16_contract_generator.generator import ( ECIP_OPS_CLASS_HASH, precompute_lines_from_vk, write_test_calldata_file_generic, write_verifier_files, ) from garaga.starknet.groth16_contract_generator.parsing_utils import ( Groth16Proof, Groth16VerifyingKey, ) def gen_sp1_groth16_verifier( vk_path: str, output_folder_path: str, output_folder_name: str, ecip_class_hash: int = ECIP_OPS_CLASS_HASH, cli_mode: bool = False, ) -> str: vk = Groth16VerifyingKey.from_json(vk_path) curve_id = vk.curve_id output_folder_name = output_folder_name + f"_{curve_id.name.lower()}" output_folder_path = os.path.join(output_folder_path, output_folder_name) precomputed_lines = precompute_lines_from_vk(vk) contract_cairo_name = f"SP1Groth16Verifier{curve_id.name}" constants_code = dedent(f""" use garaga::definitions::{{G1Point, G2Point, E12D, G2Line, u384, u288}}; use garaga::groth16::Groth16VerifyingKey; pub const N_PUBLIC_INPUTS: usize = {len(vk.ic) - 1}; {vk.serialize_to_cairo()} pub const precomputed_lines: [G2Line; {len(precomputed_lines) // 4}] = {precomputed_lines.serialize(raw=True, const=True)}; """).strip() + "\n" verification_function_name = f"verify_sp1_groth16_proof_{curve_id.name.lower()}" verification_function_name_u32 = ( f"verify_sp1_groth16_proof_{curve_id.name.lower()}_u32" ) contract_code = dedent(f""" #[starknet::interface] pub trait ISP1Groth16Verifier{curve_id.name} {{ fn {verification_function_name}( self: @TContractState, full_proof_with_hints: Span, ) -> Result<(u256, Span), felt252>; fn {verification_function_name_u32}( self: @TContractState, full_proof_with_hints: Span, ) -> Result<(u256, Span), felt252>; }} #[starknet::contract] mod SP1Groth16Verifier{curve_id.name} {{ use starknet::SyscallResultTrait; use garaga::definitions::{{G1Point, G1G2Pair}}; use garaga::groth16::{{multi_pairing_check_{curve_id.name.lower()}_3P_2F_with_extra_miller_loop_result, Groth16ProofRawTrait}}; use garaga::ec_ops::{{G1PointTrait, ec_safe_add}}; use garaga::apps::sp1::{{deserialize_full_proof_with_hints_sp1, process_public_inputs_sp1}}; use garaga::apps::sp1_constants::{{vk, ic, precomputed_lines, N_PUBLIC_INPUTS}}; const ECIP_OPS_CLASS_HASH: felt252 = {hex(ecip_class_hash)}; #[storage] struct Storage {{}} /// Internal helper function that performs the core SP1 Groth16 verification. /// Returns (vkey, public_inputs_u256, public_inputs_u32) on success. fn verify_sp1_groth16_proof_inner( full_proof_with_hints: Span, ) -> Result<(u256, Span, Span), felt252> {{ // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok((vkey, public_inputs_u256, public_inputs_u32)) if the proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given a proof and a verifying key. let fph = deserialize_full_proof_with_hints_sp1(full_proof_with_hints); let groth16_proof = fph.groth16_proof; let vkey = fph.vkey; let public_inputs_sp1 = fph.public_inputs_sp1; let mpcheck_hint = fph.mpcheck_hint; let msm_hint = fph.msm_hint; groth16_proof.check_proof_points({curve_id.value}); let ic = ic.span(); let public_inputs_u32 = public_inputs_sp1.span(); let (pub_inputs_256, pub_input_hash): (Span, u256) = process_public_inputs_sp1(public_inputs_sp1); let vk_x: G1Point = match ic.len() {{ 0 => panic!("Malformed VK"), 1 => *ic.at(0), _ => {{ let mut msm_calldata: Array = array![]; // Add the points from VK and public inputs to the proof. Serde::serialize(@ic.slice(1, N_PUBLIC_INPUTS), ref msm_calldata); // Serialize public inputs as u256 array. Serde::serialize(@N_PUBLIC_INPUTS, ref msm_calldata); Serde::serialize(@vkey, ref msm_calldata); Serde::serialize(@pub_input_hash, ref msm_calldata); // Complete with the curve indentifier ({curve_id.value} for {curve_id.name}): msm_calldata.append({curve_id.value}); // Add the hint array. for x in msm_hint {{ msm_calldata.append(*x); }} // Call the multi scalar multiplication endpoint on the Garaga ECIP ops contract // to obtain vk_x. let mut _vx_x_serialized = starknet::syscalls::library_call_syscall( ECIP_OPS_CLASS_HASH.try_into().unwrap(), selector!("msm_g1"), msm_calldata.span() ) .unwrap_syscall(); ec_safe_add( Serde::::deserialize(ref _vx_x_serialized).unwrap(), *ic.at(0), {curve_id.value} ) }} }}; // Perform the pairing check. let check = multi_pairing_check_{curve_id.name.lower()}_3P_2F_with_extra_miller_loop_result( G1G2Pair {{ p: vk_x, q: vk.gamma_g2 }}, G1G2Pair {{ p: groth16_proof.c, q: vk.delta_g2 }}, G1G2Pair {{ p: groth16_proof.a.negate({curve_id.value}), q: groth16_proof.b }}, vk.alpha_beta_miller_loop_result, precomputed_lines.span(), mpcheck_hint, ); match check {{ Result::Ok(_) => Result::Ok((vkey, pub_inputs_256, public_inputs_u32)), Result::Err(error) => Result::Err(error), }} }} #[abi(embed_v0)] impl ISP1Groth16Verifier{curve_id.name} of super::ISP1Groth16Verifier{curve_id.name} {{ fn {verification_function_name}( self: @ContractState, full_proof_with_hints: Span, ) -> Result<(u256, Span), felt252> {{ match verify_sp1_groth16_proof_inner(full_proof_with_hints) {{ Result::Ok((vkey, pub_inputs_256, _)) => Result::Ok((vkey, pub_inputs_256)), Result::Err(error) => Result::Err(error), }} }} fn {verification_function_name_u32}( self: @ContractState, full_proof_with_hints: Span, ) -> Result<(u256, Span), felt252> {{ match verify_sp1_groth16_proof_inner(full_proof_with_hints) {{ Result::Ok((vkey, _, pub_inputs_u32)) => Result::Ok((vkey, pub_inputs_u32)), Result::Err(error) => Result::Err(error), }} }} }} }} """).strip() + "\n" # Use the reusable function to write all files write_verifier_files( output_folder_path, output_folder_name, constants_code, contract_code, contract_cairo_name, verification_function_name, ProofSystem.Groth16, cli_mode, modules=["groth16_verifier"], constants_output_path=os.path.join("src", "src", "apps", "sp1_constants.cairo"), ) return constants_code if __name__ == "__main__": pass SP1_VK_PATH = ( "hydra/garaga/starknet/groth16_contract_generator/examples/vk_sp1.json" ) PROOF_PATH = ( "hydra/garaga/starknet/groth16_contract_generator/examples/proof_sp1.json" ) CONTRACTS_FOLDER = "src/contracts/autogenerated/" # Do not change this FOLDER_NAME = "sp1_verifier" # '_curve_id' is appended in the end. gen_sp1_groth16_verifier( SP1_VK_PATH, CONTRACTS_FOLDER, FOLDER_NAME, ECIP_OPS_CLASS_HASH ) # Check if proof file exists and generate calldata if it does if os.path.exists(PROOF_PATH): vk = Groth16VerifyingKey.from_json(file_path=SP1_VK_PATH) proof = Groth16Proof.from_json(proof_path=PROOF_PATH) # Generate the calldata and write test calldata file: output_folder_path = os.path.join( CONTRACTS_FOLDER, f"{FOLDER_NAME}_{vk.curve_id.name.lower()}" ) write_test_calldata_file_generic( output_folder_path, system=ProofSystem.Groth16, # SP1 uses Groth16 vk_path=SP1_VK_PATH, proof_path=PROOF_PATH, ) else: print( f"Warning: Proof file {PROOF_PATH} not found. Skipping calldata generation." ) ================================================ FILE: hydra/garaga/starknet/groth16_contract_generator/parsing_utils.py ================================================ import codecs import dataclasses import hashlib import json import os from pathlib import Path from typing import Any, List from garaga.curves import CURVES, CurveID from garaga.hints import io from garaga.hints.io import split_128 from garaga.modulo_circuit_structs import ( E12D, G1PointCircuit, G2PointCircuit, StructArray, ) from garaga.points import G1Point, G2Point from garaga.precompiled_circuits.multi_miller_loop import MultiMillerLoopCircuit # Import constants from generated file from garaga.starknet.constants import ( RISC0_BN254_CONTROL_ID, RISC0_CONTROL_ROOT, SP1_VERIFIER_HASH, SP1_VERIFIER_VERSION, ) class KeyPatternNotFound(Exception): def __init__(self, key_patterns): super().__init__(f"No key found with patterns {key_patterns}") self.key_patterns = key_patterns def iterate_nested_dict(d): for key, value in d.items(): if isinstance(value, dict): yield from iterate_nested_dict(value) else: yield value def find_item_from_key_patterns(data: dict, key_patterns: List[str]) -> Any: best_match = None best_score = -1 for key, value in data.items(): for pattern in key_patterns: if key.lower() == pattern.lower(): # Exact match return value elif pattern.lower() in key.lower(): # Partial match score = key.lower().count(pattern.lower()) if score > best_score: best_match = value best_score = score if best_match is not None: return best_match else: raise KeyPatternNotFound(key_patterns) def try_parse_g1_point_from_key( data: dict, key_patterns: List[str], curve_id: CurveID = None ) -> G1Point: point = find_item_from_key_patterns(data, key_patterns) return try_parse_g1_point(point, curve_id) def proj_to_affine(x, y, z, curve_id: CurveID) -> G1Point: x, y, z = io.to_int(x), io.to_int(y), io.to_int(z) p = curve_id.p z = pow(z, -1, p) x = x * z % p y = y * z % p return G1Point(x=x, y=y, curve_id=curve_id) def try_parse_g1_point(point: Any, curve_id: CurveID = None) -> G1Point: if isinstance(point, dict): return G1Point( x=io.to_int(find_item_from_key_patterns(point, ["x"])), y=io.to_int(find_item_from_key_patterns(point, ["y"])), curve_id=curve_id, ) elif isinstance(point, (tuple, list)): if len(point) == 2: return G1Point( x=io.to_int(point[0]), y=io.to_int(point[1]), curve_id=curve_id, ) elif len(point) == 3: return proj_to_affine(point[0], point[1], point[2], curve_id) else: raise ValueError(f"Invalid point: {point}") else: raise ValueError(f"Invalid point: {point}") def try_parse_g2_point_from_key( data: dict, key_patterns: List[str], curve_id: CurveID = None ) -> G2Point: point = find_item_from_key_patterns(data, key_patterns) return try_parse_g2_point(point, curve_id) def try_parse_g2_point(point: Any, curve_id: CurveID = None) -> G2Point: if isinstance(point, dict): x_g2 = find_item_from_key_patterns(point, ["x"]) y_g2 = find_item_from_key_patterns(point, ["y"]) if isinstance(x_g2, dict) and isinstance(y_g2, dict): return G2Point( x=( io.to_int(find_item_from_key_patterns(x_g2, ["a0"])), io.to_int(find_item_from_key_patterns(x_g2, ["a1"])), ), y=( io.to_int(find_item_from_key_patterns(y_g2, ["a0"])), io.to_int(find_item_from_key_patterns(y_g2, ["a1"])), ), curve_id=curve_id, ) elif isinstance(x_g2, (tuple, list)) and isinstance(y_g2, (tuple, list)): return G2Point( x=( io.to_int(x_g2[0]), io.to_int(x_g2[1]), ), y=( io.to_int(y_g2[0]), io.to_int(y_g2[1]), ), curve_id=curve_id, ) elif isinstance(point, (tuple, list)): if len(point) == 2: supposed_x = point[0] supposed_y = point[1] elif len(point) == 3: assert (io.to_int(point[2][0]), io.to_int(point[2][1])) == ( 1, 0, ), "Non standard projective coordinates" supposed_x = point[0] supposed_y = point[1] if isinstance(supposed_x, (tuple, list)): assert len(supposed_x) == 2, f"Invalid fp2 coordinates: {supposed_x}" supposed_x = (io.to_int(supposed_x[0]), io.to_int(supposed_x[1])) if isinstance(supposed_y, (tuple, list)): assert len(supposed_y) == 2, f"Invalid fp2 coordinates: {supposed_y}" supposed_y = (io.to_int(supposed_y[0]), io.to_int(supposed_y[1])) return G2Point(x=supposed_x, y=supposed_y, curve_id=curve_id) else: raise ValueError(f"Invalid point: {point}") def try_guessing_curve_id_from_json(data: dict) -> CurveID: try: curve_id = CurveID.from_str(find_item_from_key_patterns(data, ["curve"])) except (ValueError, KeyError, KeyPatternNotFound): # Try guessing the curve id from the bit size of the first found integer in the json. x = None for value in iterate_nested_dict(data): try: x = io.to_int(value) break except TypeError: continue if x is None: raise ValueError("No integer found in the JSON data.") if x.bit_length() > 256: curve_id = CurveID.BLS12_381 else: curve_id = CurveID.BN254 return curve_id @dataclasses.dataclass(slots=True) class Groth16VerifyingKey: alpha: G1Point beta: G2Point gamma: G2Point delta: G2Point ic: List[G1Point] def __post_init__(self): assert ( len(self.ic) > 1 ), "The verifying key must have at least two points in the ic array (one public input and one private input)" assert len(self.ic) == len( set(self.ic) ), "The ic array must not contain duplicate points." assert ( self.alpha.curve_id == self.beta.curve_id == self.gamma.curve_id == self.delta.curve_id ), "All points must be on the same curve." assert all(point.curve_id == self.alpha.curve_id for point in self.ic) @property def curve_id(self) -> CurveID: return self.alpha.curve_id def from_dict(data: dict) -> "Groth16VerifyingKey": try: curve_id = try_guessing_curve_id_from_json(data) try: verifying_key = find_item_from_key_patterns(data, ["verifying_key"]) except KeyPatternNotFound: verifying_key = data try: return Groth16VerifyingKey( alpha=try_parse_g1_point_from_key( verifying_key, ["alpha"], curve_id ), beta=try_parse_g2_point_from_key(verifying_key, ["beta"], curve_id), gamma=try_parse_g2_point_from_key( verifying_key, ["gamma"], curve_id ), delta=try_parse_g2_point_from_key( verifying_key, ["delta"], curve_id ), ic=[ try_parse_g1_point(point, curve_id) for point in find_item_from_key_patterns(verifying_key, ["ic"]) ], ) except (ValueError, KeyPatternNotFound): # Gnark case. g1_points = find_item_from_key_patterns(verifying_key, ["g1"]) g2_points = find_item_from_key_patterns(verifying_key, ["g2"]) return Groth16VerifyingKey( alpha=try_parse_g1_point_from_key(g1_points, ["alpha"], curve_id), beta=try_parse_g2_point_from_key(g2_points, ["beta"], curve_id), gamma=try_parse_g2_point_from_key(g2_points, ["gamma"], curve_id), delta=try_parse_g2_point_from_key(g2_points, ["delta"], curve_id), ic=[ try_parse_g1_point(point, curve_id) for point in find_item_from_key_patterns(g1_points, ["K"]) ], ) except KeyError as e: raise KeyError(f"The key {e} is missing from the JSON data.") def from_json(file_path: str | Path) -> "Groth16VerifyingKey": path = Path(file_path) try: with path.open("r") as f: data = json.load(f) except FileNotFoundError: cwd = os.getcwd() print(f"Current working directory: {cwd}") print(f"Attempted to access file: {os.path.abspath(file_path)}") raise FileNotFoundError(f"The file {file_path} was not found.") except json.JSONDecodeError: raise ValueError(f"The file {file_path} does not contain valid JSON.") return Groth16VerifyingKey.from_dict(data) def serialize_to_cairo(self) -> str: # Precompute M = miller_loop(public_pair) circuit = MultiMillerLoopCircuit( name="precompute M", curve_id=self.curve_id.value, n_pairs=1 ) circuit.write_p_and_q(P=[self.alpha], Q=[self.beta]) M = E12D("alpha_beta_miller_loop_result", circuit.miller_loop(n_pairs=1)) gamma_g2 = G2PointCircuit.from_G2Point("gamma_g2", self.gamma) delta_g2 = G2PointCircuit.from_G2Point("delta_g2", self.delta) ic = StructArray( name="ic", elmts=[ G1PointCircuit.from_G1Point(f"ic_{i}", point) for i, point in enumerate(self.ic) ], ) field_type = "u384" if self.curve_id == CurveID.BLS12_381 else "u288" code = f""" pub const vk:Groth16VerifyingKey<{field_type}> = Groth16VerifyingKey{{ alpha_beta_miller_loop_result: {M.serialize(raw=True)}, gamma_g2: {gamma_g2.serialize(raw=True)}, delta_g2: {delta_g2.serialize(raw=True)} }}; pub const ic: [G1Point; {len(self.ic)}] = {ic.serialize(raw=True, const=True)}; """ return code def flatten(self) -> list[int]: lst = [] lst.extend([self.alpha.x, self.alpha.y]) lst.extend([self.beta.x[0], self.beta.x[1], self.beta.y[0], self.beta.y[1]]) lst.extend([self.gamma.x[0], self.gamma.x[1], self.gamma.y[0], self.gamma.y[1]]) lst.extend([self.delta.x[0], self.delta.x[1], self.delta.y[0], self.delta.y[1]]) for point in self.ic: lst.extend([point.x, point.y]) return lst def reverse_byte_order_uint256(value: int | bytes) -> int: if isinstance(value, int): value_bytes = value.to_bytes(32, byteorder="big") else: value_bytes = value.ljust( 32, b"\x00" ) # Ensure 32 bytes, pad with zeros if needed return int.from_bytes(value_bytes[::-1], byteorder="big") def split_digest(digest: int | bytes): reversed_digest = reverse_byte_order_uint256(digest) return split_128(reversed_digest) @dataclasses.dataclass(slots=True) class Groth16Proof: a: G1Point b: G2Point c: G1Point public_inputs: List[int] = dataclasses.field(default_factory=list) curve_id: CurveID = None image_id: bytes = None # Only used for risc0 proofs journal: bytes = None # Only used for risc0 proofs public_inputs_sp1: bytes = None # Only used for sp1 proofs def __post_init__(self): assert ( self.a.curve_id == self.b.curve_id == self.c.curve_id ), f"All points must be on the same curve, got {self.a.curve_id}, {self.b.curve_id}, {self.c.curve_id}" self.curve_id = self.a.curve_id for pub in self.public_inputs: assert ( 0 <= pub < CURVES[self.curve_id.value].n ), f"Public input {pub} is out of bounds for curve {self.curve_id}" if self.public_inputs_sp1 is not None: assert isinstance( self.public_inputs_sp1, bytes ), "SP1 public inputs must be a bytes object" assert ( len(self.public_inputs_sp1) % 32 == 0 ), "SP1 public inputs must be a multiple of 32 bytes" @property def is_risc0(self) -> bool: return self.image_id is not None and self.journal is not None @property def is_sp1(self) -> bool: return self.public_inputs_sp1 is not None @property def vk_type(self) -> str: if self.is_risc0: return "risc0" elif self.is_sp1: return "sp1" else: return "groth16_generic" def from_dict( data: dict, public_inputs: None | list | dict = None ) -> "Groth16Proof": curve_id = try_guessing_curve_id_from_json(data) try: proof = find_item_from_key_patterns(data, ["proof"]) except KeyPatternNotFound: proof = data try: seal = find_item_from_key_patterns(data, ["seal"]) image_id = find_item_from_key_patterns(data, ["image_id"]) journal = find_item_from_key_patterns(data, ["journal"]) print("Seal: {}\nImage_id: {}\nJournal: {}".format(seal, image_id, journal)) return Groth16Proof._from_risc0( seal=codecs.decode(seal[2:].replace("\\x", ""), "hex"), image_id=codecs.decode(image_id[2:].replace("\\x", ""), "hex"), journal=codecs.decode(journal[2:].replace("\\x", ""), "hex"), ) except (ValueError, KeyError, KeyPatternNotFound): pass except Exception as e: print(f"Error when attempmting to parse as Risc0 proof: {e}") raise e try: sp1_vkey = find_item_from_key_patterns(data, ["vkey"]) public_inputs = find_item_from_key_patterns(data, ["publicValues"]) sp1_proof = find_item_from_key_patterns(data, ["proof"]) return Groth16Proof._from_sp1( vkey=codecs.decode(sp1_vkey[2:].replace("\\x", ""), "hex"), proof=codecs.decode(sp1_proof[2:].replace("\\x", ""), "hex"), public_inputs=codecs.decode( public_inputs[2:].replace("\\x", ""), "hex" ), ) except KeyPatternNotFound: pass except Exception as e: print(f"Error when attempmting to parse as SP1 proof: {e}") raise e if public_inputs is not None: if isinstance(public_inputs, dict): public_inputs = list(public_inputs.values()) elif isinstance(public_inputs, list): pass else: raise ValueError(f"Invalid public inputs format: {public_inputs}") else: try: public_inputs = find_item_from_key_patterns(data, ["public"]) except KeyPatternNotFound as e: print(f"Error: {e}") raise e return Groth16Proof( a=try_parse_g1_point_from_key(proof, ["a"], curve_id), b=try_parse_g2_point_from_key(proof, ["b"], curve_id), c=try_parse_g1_point_from_key(proof, ["c", "Krs"], curve_id), public_inputs=[io.to_int(pub) for pub in public_inputs], ) def from_json( proof_path: str | Path, public_inputs_path: str | Path = None ) -> "Groth16Proof": path = Path(proof_path) try: with path.open("r") as f: data = json.load(f) except FileNotFoundError: raise FileNotFoundError(f"The file {proof_path} was not found.") except json.JSONDecodeError: raise ValueError(f"The file {proof_path} does not contain valid JSON.") try: if public_inputs_path is not None: with Path(public_inputs_path).open("r") as f: public_inputs = json.load(f) else: public_inputs = None except FileNotFoundError: raise FileNotFoundError(f"The file {public_inputs_path} was not found.") except json.JSONDecodeError: raise ValueError( f"The file {public_inputs_path} does not contain valid JSON." ) return Groth16Proof.from_dict(data, public_inputs) def _from_risc0( seal: bytes, image_id: bytes, journal: bytes, CONTROL_ROOT: int = RISC0_CONTROL_ROOT, BN254_CONTROL_ID: int = RISC0_BN254_CONTROL_ID, ) -> "Groth16Proof": assert len(image_id) <= 32, "image_id must be 32 bytes" CONTROL_ROOT_0, CONTROL_ROOT_1 = split_digest(CONTROL_ROOT) proof = seal[4:] journal_digest = hashlib.sha256(journal).digest() claim_digest = ok(image_id, journal_digest).digest() claim0, claim1 = split_digest(claim_digest) return Groth16Proof( a=G1Point( x=int.from_bytes(proof[0:32], "big"), y=int.from_bytes(proof[32:64], "big"), curve_id=CurveID.BN254, ), b=G2Point( x=( int.from_bytes(proof[96:128], "big"), int.from_bytes(proof[64:96], "big"), ), y=( int.from_bytes(proof[160:192], "big"), int.from_bytes(proof[128:160], "big"), ), curve_id=CurveID.BN254, ), c=G1Point( x=int.from_bytes(proof[192:224], "big"), y=int.from_bytes(proof[224:256], "big"), curve_id=CurveID.BN254, ), public_inputs=[ CONTROL_ROOT_0, CONTROL_ROOT_1, claim0, claim1, BN254_CONTROL_ID, ], image_id=image_id, journal=journal, ) def _from_sp1( vkey: bytes, public_inputs: bytes, proof: bytes, ) -> "Groth16Proof": _selector, proof = proof[:4], proof[4:] assert ( _selector == SP1_VERIFIER_HASH[:4] ), f"Invalid SP1 proof version. Expected {SP1_VERIFIER_HASH[:4]} for version {SP1_VERIFIER_VERSION}, got {_selector}\n Please use SP1 verifier version {SP1_VERIFIER_VERSION} or contact garaga developers to update the SP1 verifier version." pub_input_hash: bytes = hashlib.sha256(public_inputs).digest() pub_input_hash: int = int.from_bytes(pub_input_hash, "big") % ( 2**253 ) # <=> & ((1 << 253) - 1) # print(f"pub_input_hash: {hex(pub_input_hash)}") return Groth16Proof( a=G1Point( x=int.from_bytes(proof[0:32], "big"), y=int.from_bytes(proof[32:64], "big"), curve_id=CurveID.BN254, ), b=G2Point( x=( int.from_bytes(proof[96:128], "big"), int.from_bytes(proof[64:96], "big"), ), y=( int.from_bytes(proof[160:192], "big"), int.from_bytes(proof[128:160], "big"), ), curve_id=CurveID.BN254, ), c=G1Point( x=int.from_bytes(proof[192:224], "big"), y=int.from_bytes(proof[224:256], "big"), curve_id=CurveID.BN254, ), public_inputs=[int.from_bytes(vkey, "big"), pub_input_hash], public_inputs_sp1=public_inputs, ) def serialize_to_calldata(self) -> list[int]: cd = [] cd.extend(io.bigint_split(self.a.x)) cd.extend(io.bigint_split(self.a.y)) cd.extend(io.bigint_split(self.b.x[0])) cd.extend(io.bigint_split(self.b.x[1])) cd.extend(io.bigint_split(self.b.y[0])) cd.extend(io.bigint_split(self.b.y[1])) cd.extend(io.bigint_split(self.c.x)) cd.extend(io.bigint_split(self.c.y)) if self.image_id and self.journal and self.public_inputs_sp1 is None: # Risc0 mode. # Public inputs will be reconstructed from image id and journal. image_id_u256 = io.bigint_split( int.from_bytes(self.image_id, "big"), 8, 2**32 )[::-1] journal = list(self.journal) # Span of u32, length 8. cd.append(8) cd.extend(image_id_u256) # Span of u8, length depends on input cd.append(len(self.journal)) cd.extend(journal) elif self.public_inputs_sp1 is not None: # SP1 mode. # Public inputs 0 is vkey cd.extend(io.bigint_split(self.public_inputs[0], 2, 2**128)) # Public inputs 1 is sha256(public_inputs_sp1) % 2**253 # We serialize pub_inputs_sp1 as u32 array for Cairo sha256. n_bytes = len(self.public_inputs_sp1) assert n_bytes % 32 == 0, "SP1 public inputs must be a multiple of 32 bytes" n_words = n_bytes // 32 cd.append(n_words) # Deserialization 8 by 8 for i in range(0, n_bytes, 4): cd.append(int.from_bytes(self.public_inputs_sp1[i : i + 4], "big")) else: # Normal mode. cd.append(len(self.public_inputs)) for pub in self.public_inputs: cd.extend(io.bigint_split(pub, 2, 2**128)) return cd def flatten(self, include_public_inputs: bool = True) -> list[int]: lst = [] lst.extend([self.a.x, self.a.y]) lst.extend([self.b.x[0], self.b.x[1]]) lst.extend([self.b.y[0], self.b.y[1]]) lst.extend([self.c.x, self.c.y]) if include_public_inputs: lst.extend(self.public_inputs) return lst class ExitCode: def __init__(self, system, user): self.system = system self.user = user class Output: def __init__(self, journal_digest, assumptions_digest): self.journal_digest = journal_digest self.assumptions_digest = assumptions_digest def digest(self): return hashlib.sha256( hashlib.sha256(b"risc0.Output").digest() + self.journal_digest + self.assumptions_digest + (2 << 8).to_bytes(2, byteorder="big") ).digest() class ReceiptClaim: def __init__( self, pre_state_digest, post_state_digest, exit_code, input, output, tag_digest: bytes = hashlib.sha256(b"risc0.ReceiptClaim").digest(), ): self.pre_state_digest = pre_state_digest self.post_state_digest = post_state_digest self.exit_code = exit_code self.input = input self.output = output.digest() self.TAG_DIGEST = tag_digest def digest(self): # print(f"TAG_DIGEST: {self.TAG_DIGEST.hex()}") # print(f"self.input: {self.input.hex()}") # print(f"self.pre_state_digest: {self.pre_state_digest.hex()}") # print(f"self.post_state_digest: {self.post_state_digest.hex()}") # print(f"self.output: {self.output.hex()}") # print(f"self.exit_code.system: {self.exit_code.system}") # print(f"self.exit_code.user: {self.exit_code.user}") return hashlib.sha256( self.TAG_DIGEST + self.input + self.pre_state_digest + self.post_state_digest + self.output + (self.exit_code.system << 24).to_bytes(4, byteorder="big") + (self.exit_code.user << 24).to_bytes(4, byteorder="big") + (4 << 8).to_bytes(2, byteorder="big") ).digest() def ok(image_id, journal_digest): SYSTEM_STATE_ZERO_DIGEST = bytes.fromhex( "A3ACC27117418996340B84E5A90F3EF4C49D22C79E44AAD822EC9C313E1EB8E2" ) # https://github.com/risc0/risc0-ethereum/blob/34d2fee4ca6b5fb354a8a1a00c43f8945097bfe5/contracts/src/IRiscZeroVerifier.sol#L60 return ReceiptClaim( pre_state_digest=image_id, post_state_digest=SYSTEM_STATE_ZERO_DIGEST, exit_code=ExitCode(0, 0), # (Halted, 0) input=bytes(32), # bytes32(0) output=Output(journal_digest, bytes(32)), # Output(journalDigest, bytes32(0)) ) if __name__ == "__main__": # PATH = Path(__file__).parent # print(f"PATH: {PATH}") # proof = Groth16Proof.from_json( # f"{PATH}/examples/gnark_proof_bn254.json", # f"{PATH}/examples/gnark_public_bn254.json", # ) # # print(proof) # vk = Groth16VerifyingKey.from_json(f"{PATH}/examples/gnark_vk_bn254.json") # print(vk) # vk_risc0 = Groth16VerifyingKey.from_json(f"{PATH}/examples/vk_risc0.json") # # print(vk_risc0) # Risc0 proof extracted from https://sepolia.etherscan.io/tx/0x2308aeefef309097aeaf0e3660915d5b80813e693ac72147b651e0196155235d bproof = bytes.fromhex( "310fe5982466f8f1bab4d00a829cafcda46036fb9c5108df341746ab5f7532aa71aee03b0947eaf1af095584de8d5bd0a91a811f071a555c21a113476aa167108dfeb73913c3a1ef6a5baac68cddd25fafdbf660c4e479f7a836cc1b98904610ead5c9ab2c62f6fdf8ca099964080c95beebf5728b41728128ec0c7823f8adf22e5bfeed1110de7c21ed2dc1e2fd8f2c52d68a15129cf68f18a3087131920e8dcb40a81b003f524b6dcbabdc1e270494bc39b190bddfdb13106409350f80b6204d89da4c16842b4139dd02a39829cf1403657ad00080300a32148c31093cb752809cae2e075db0a79893a6d71a4a7d61111fdff741aeb198dd7fb00b4fa23714ddfd8093" ) def parse_proof_and_signals(proof: bytes) -> Groth16Proof: proof = proof[4:] def bytes_32_iterator(data: bytes): for i in range(0, len(data), 32): yield io.to_int(data[i : i + 32]) it = bytes_32_iterator(proof) print(len(proof) / 32) _a = G1Point(x=next(it), y=next(it), curve_id=CurveID.BN254) _b = G2Point( x=[next(it), next(it)][::-1], y=[next(it), next(it)][::-1], curve_id=CurveID.BN254, ) _c = G1Point(x=next(it), y=next(it), curve_id=CurveID.BN254) public_inputs = list(it) print(len(public_inputs)) return Groth16Proof( a=_a, b=_b, c=_c, public_inputs=list(it), ) proof = parse_proof_and_signals(bproof) print(proof) ================================================ FILE: hydra/garaga/starknet/honk_contract_generator/calldata.py ================================================ from garaga import garaga_rs from garaga.curves import ProofSystem from garaga.points import G1G2Pair from garaga.precompiled_circuits.zk_honk import ( G2_POINT_KZG_1, G2_POINT_KZG_2, LIBRA_COMMITMENTS, NUMBER_UNSHIFTED, CurveID, G1Point, HonkVk, ModuloCircuitElement, ZKHonkProof, ZKHonkTranscript, ZKHonkVerifierCircuits, ) from garaga.starknet.tests_and_calldata_generators.mpcheck import MPCheckCalldataBuilder from garaga.starknet.tests_and_calldata_generators.msm import MSMCalldataBuilder def filter_msm_scalars( scalars: list[ModuloCircuitElement], log_n: int ) -> list[ModuloCircuitElement]: assert len(scalars) == NUMBER_UNSHIFTED + log_n + LIBRA_COMMITMENTS + 3 # Remove the first element (== 1) scalars_filtered = scalars[1:] return scalars_filtered def extract_msm_scalars( scalars: list[ModuloCircuitElement], log_n: int ) -> list[ModuloCircuitElement]: scalars_msm = filter_msm_scalars(scalars, log_n) return [s.value for s in scalars_msm] def get_ultra_flavor_honk_calldata_from_vk_and_proof( vk: HonkVk, proof: ZKHonkProof, system: ProofSystem = ProofSystem.UltraKeccakZKHonk, use_rust: bool = False, ) -> list[int]: if use_rust: return _honk_calldata_from_vk_and_proof_rust(vk, proof) assert isinstance(proof, ZKHonkProof) tp = ZKHonkTranscript.from_proof(vk, proof, system) circuit = ZKHonkVerifierCircuits(name="test", log_n=vk.log_circuit_size) vk_circuit = vk.to_circuit_elements(circuit) proof_circuit = proof.to_circuit_elements(circuit) tp = tp.to_circuit_elements(circuit) public_input_delta = circuit.compute_public_input_delta( public_inputs=proof_circuit.public_inputs, pairing_point_object=proof_circuit.pairing_point_object, beta=tp.beta, gamma=tp.gamma, ) rlc_check, check = circuit.verify_sum_check( libra_sum=proof_circuit.libra_sum, sumcheck_univariates=proof_circuit.sumcheck_univariates, sumcheck_evaluations=(proof_circuit.sumcheck_evaluations), libra_evaluation=proof_circuit.libra_evaluation, beta=tp.beta, gamma=tp.gamma, public_inputs_delta=public_input_delta, eta=tp.eta, eta_two=tp.etaTwo, eta_three=tp.etaThree, libra_challenge=tp.libra_challenge, sum_check_u_challenges=tp.sum_check_u_challenges, gate_challenge=tp.gate_challenge, alpha=tp.alpha, log_n=vk.log_circuit_size, base_rlc=circuit.write_element(1234), ) assert rlc_check.value == 0 assert check.value == 0 vanishing_check, diff_check = circuit.check_evals_consistency( proof_circuit.libra_evaluation, proof_circuit.libra_poly_evals, tp.gemini_r, tp.sum_check_u_challenges, ) assert vanishing_check.value != 0 assert diff_check.value == 0 scalars = circuit.compute_shplemini_msm_scalars( proof_circuit.sumcheck_evaluations, proof_circuit.gemini_masking_eval, proof_circuit.gemini_a_evaluations, proof_circuit.libra_poly_evals, tp.gemini_r, tp.rho, tp.shplonk_z, tp.shplonk_nu, tp.sum_check_u_challenges, ) scalars_msm = extract_msm_scalars(scalars, vk.log_circuit_size) # Swap last two scalars : scalars_msm = scalars_msm[:-2] + scalars_msm[-2:][::-1] # Place first scalar just after the vk_lagrange_last point (index 27) first_scalar = scalars_msm.pop(0) scalars_msm.insert(28, first_scalar) points = [ vk.qm, # 0 vk.qc, # 1 vk.ql, # 2 vk.qr, # 3 vk.qo, # 4 vk.q4, # 5 vk.qLookup, # 6 vk.qArith, # 7 vk.qDeltaRange, # 8 vk.qElliptic, # 9 vk.qMemory, # 10 vk.qNnf, # 11 vk.qPoseidon2External, # 12 vk.qPoseidon2Internal, # 13 vk.s1, # 14 vk.s2, # 15 vk.s3, # 16 vk.s4, # 17 vk.id1, # 18 vk.id2, # 19 vk.id3, # 20 vk.id4, # 21 vk.t1, # 22 vk.t2, # 23 vk.t3, # 24 vk.t4, # 25 vk.lagrange_first, # 26 vk.lagrange_last, # 27 proof.gemini_masking_poly, # 28 proof.w1, # 29 proof.w2, # 30 proof.w3, # 31 proof.w4, # 32 proof.z_perm, # 33 proof.lookup_inverses, # 34 proof.lookup_read_counts, # 35 proof.lookup_read_tags, # 36 ] points.extend(proof.gemini_fold_comms[: vk.log_circuit_size - 1]) points.extend(proof.libra_commitments) points.append(proof.kzg_quotient) points.append(G1Point.get_nG(CurveID.BN254, 1)) msm_builder = MSMCalldataBuilder( CurveID.BN254, points=points, scalars=scalars_msm, ) P_0 = G1Point.msm(points=points, scalars=scalars_msm).add(proof.shplonk_q) P_1 = -proof.kzg_quotient pairs = [G1G2Pair(P_0, G2_POINT_KZG_1), G1G2Pair(P_1, G2_POINT_KZG_2)] mpc_builder = MPCheckCalldataBuilder( curve_id=CurveID.BN254, pairs=pairs, n_fixed_g2=2, public_pair=None ) cd = [] cd.extend(proof.serialize_to_calldata()) cd.extend( msm_builder.serialize_to_calldata( include_points_and_scalars=False, serialize_as_pure_felt252_array=True, ) ) cd.extend(mpc_builder.serialize_to_calldata()) res = [len(cd)] + cd # print(f"HONK CALLDATA: {res}") # print(f"HONK CALLDATA LENGTH: {len(res)}") return res def _honk_calldata_from_vk_and_proof_rust( vk: HonkVk, proof: ZKHonkProof, ) -> list[int]: return garaga_rs.get_zk_honk_calldata( proof.proof_bytes, proof.public_inputs_bytes, vk.vk_bytes ) ================================================ FILE: hydra/garaga/starknet/honk_contract_generator/generator_honk.py ================================================ import argparse import os from pathlib import Path from garaga.curves import CurveID, ProofSystem from garaga.modulo_circuit_structs import G2Line, StructArray from garaga.precompiled_circuits.compilable_circuits.base import ( get_circuit_definition_impl_template, ) from garaga.precompiled_circuits.compilable_circuits.ultra_honk import ( ZKEvalsConsistencyDoneCircuit, ZKEvalsConsistencyInitCircuit, ZKEvalsConsistencyLoopCircuit, ZKPrepareScalarsCircuit, ZKSumCheckCircuit, ) from garaga.precompiled_circuits.multi_miller_loop import precompute_lines from garaga.precompiled_circuits.zk_honk import ( G2_POINT_KZG_1, G2_POINT_KZG_2, MAX_LOG_N, PAIRING_POINT_OBJECT_LENGTH, HonkVk, ) from garaga.starknet.groth16_contract_generator.generator import ( write_test_calldata_file_generic, write_verifier_files, ) def gen_honk_verifier( vk: str | Path | HonkVk | bytes, output_folder_path: str, output_folder_name: str, cli_mode: bool = False, include_test_sample: bool = True, ) -> bool: """ Generate the honk verifier files and write them to the output folder. """ output_folder_path_full = os.path.join(output_folder_path, output_folder_name) ( constants_code, circuits_code, contract_code, contract_name, verification_function_name, ) = gen_honk_verifier_files(vk) _write_and_format_project_files( output_folder_path_full, output_folder_name, cli_mode, constants_code, circuits_code, contract_code, contract_name, verification_function_name, include_test_sample, ) return True def gen_honk_verifier_files( vk: str | Path | HonkVk | bytes, ) -> tuple[str, str, str, str, str]: """ Returns in this order: - constants_code - circuits_code - contract_code - contract_name - verification_function_name """ # Parse vk if isinstance(vk, (Path, str)): vk = HonkVk.from_bytes(open(vk, "rb").read()) elif isinstance(vk, bytes): vk = HonkVk.from_bytes(vk) else: assert isinstance( vk, HonkVk ), f"Invalid type for vk: {type(vk)}. Should be str, Path, HonkVk or bytes." constants_code = _gen_constants_code(vk) ( circuits_code, sumcheck_function_name, prepare_scalars_function_name, consistency_function_names, scalar_indexes, msm_len, is_on_curve_function_name, ) = _gen_circuits_code(vk) points_code, (n_vk_points, n_proof_points) = _get_msm_points_array_code( log_n=vk.log_circuit_size ) scalars_tuple = ",\n ".join(f"scalar_{idx}" for idx in scalar_indexes) scalars_tuple_into = [f"scalar_{idx}" for idx in scalar_indexes] scalars_tuple_into.append("transcript.shplonk_z.into()") # Swap position of last two elements of scalars_tuple_into (KZG quotient & BN254 G1 generator) : scalars_tuple_into = scalars_tuple_into[:-2] + scalars_tuple_into[-2:][::-1] # Move first scalar after the first vk points [a, b, c, d, e] -> [b,c,d,a,e] if [b,c,d] are vk points: scalars_tuple_into = ( scalars_tuple_into[1 : n_vk_points + 1] + scalars_tuple_into[:1] + scalars_tuple_into[n_vk_points + 1 :] ) scalars_tuple_into = ",\n ".join(scalars_tuple_into) # Generate contract header contract_name = "UltraKeccakZKHonkVerifier" verification_function_name = "verify_ultra_keccak_zk_honk_proof" contract_header = _gen_contract_header( function_names=[ sumcheck_function_name, prepare_scalars_function_name, consistency_function_names[0], consistency_function_names[1], consistency_function_names[2], is_on_curve_function_name, ], ) contract_code = f"""{contract_header} let (transcript, _, base_rlc) = ZKHonkTranscriptTrait::from_proof::(full_proof.proof, vk.vk_hash, vk.log_circuit_size); let log_n = vk.log_circuit_size; let (sum_check_rlc, honk_check) = {sumcheck_function_name}( p_public_inputs: full_proof.proof.public_inputs, p_pairing_point_object: full_proof.proof.pairing_point_object, libra_sum: u256_to_u384(full_proof.proof.libra_sum), sumcheck_univariates_flat: full_proof.proof.sumcheck_univariates.slice(0, log_n * ZK_BATCHED_RELATION_PARTIAL_LENGTH), sumcheck_evaluations: full_proof.proof.sumcheck_evaluations, libra_evaluation: u256_to_u384(full_proof.proof.libra_evaluation), tp_sum_check_u_challenges: transcript.sum_check_u_challenges.span(), tp_gate_challenge: transcript.gate_challenge, tp_eta_1: transcript.eta.into(), tp_eta_2: transcript.eta_two.into(), tp_eta_3: transcript.eta_three.into(), tp_beta: transcript.beta.into(), tp_gamma: transcript.gamma.into(), tp_base_rlc: base_rlc.into(), tp_alpha: transcript.alpha, tp_libra_challenge: transcript.libra_challenge.into(), modulus: mod_grumpkin, ); let (mut challenge_poly_eval, mut root_power_times_tp_gemini_r) = {consistency_function_names[0]}( tp_gemini_r: transcript.gemini_r.into(), modulus: mod_grumpkin, ); for i in 0..vk.log_circuit_size {{ let (new_challenge_poly_eval, new_root_power_times_tp_gemini_r) = {consistency_function_names[1]}( challenge_poly_eval: challenge_poly_eval, root_power_times_tp_gemini_r: root_power_times_tp_gemini_r, tp_sumcheck_u_challenge: (*transcript.sum_check_u_challenges.at(i)).into(), modulus: mod_grumpkin, ); challenge_poly_eval = new_challenge_poly_eval; root_power_times_tp_gemini_r = new_root_power_times_tp_gemini_r; }}; let (vanishing_check, diff_check) = {consistency_function_names[2]}( p_libra_evaluation: u256_to_u384(full_proof.proof.libra_evaluation), p_libra_poly_evals: full_proof.proof.libra_poly_evals, tp_gemini_r: transcript.gemini_r.into(), challenge_poly_eval: challenge_poly_eval, root_power_times_tp_gemini_r: root_power_times_tp_gemini_r, modulus: mod_grumpkin, ); let ( {scalars_tuple}, ) = {prepare_scalars_function_name}( p_sumcheck_evaluations: full_proof.proof.sumcheck_evaluations, p_gemini_masking_eval: u256_to_u384(full_proof.proof.gemini_masking_eval), p_gemini_a_evaluations: full_proof.proof.gemini_a_evaluations, p_libra_poly_evals: full_proof.proof.libra_poly_evals, tp_gemini_r: transcript.gemini_r.into(), tp_rho: transcript.rho.into(), tp_shplonk_z: transcript.shplonk_z.into(), tp_shplonk_nu: transcript.shplonk_nu.into(), tp_sum_check_u_challenges: transcript.sum_check_u_challenges.span().slice(0, log_n), modulus: mod_grumpkin, ); {points_code} let mut scalars: Span = array![{scalars_tuple_into}].span(); {_get_msm_kzg_template(msm_len, n_vk_points, n_proof_points, is_on_curve_function_name)} if sum_check_rlc.is_zero() && honk_check.is_zero() && !vanishing_check.is_zero() && diff_check.is_zero() && kzg_check.is_ok() {{ return Result::Ok(full_proof.proof.public_inputs); }} else {{ return Result::Err('Proof verification failed'); }} }} }} }} """ return ( constants_code, circuits_code, contract_code, contract_name, verification_function_name, ) def _get_msm_kzg_template( msm_size: int, n_vk_points: int, n_proof_points: int, is_on_curve_function_name: str, ): TEMPLATE = """\n // Check input points are on curve. // Skip the first {n_vk_points} points as they are from VK and keep the last {n_proof_points} proof points for point in points.slice({n_vk_points}, {n_proof_points}) {{ assert({is_on_curve_function_name}(*point, mod_bn), 'proof point not on curve'); }}; // Assert shplonk_q is on curve let shplonk_q_pt:G1Point = full_proof.proof.shplonk_q.into(); assert({is_on_curve_function_name}(shplonk_q_pt, mod_bn), 'shplonk_q not on curve'); let mut msm_hint = full_proof.msm_hint; assert(msm_hint.len() == {msm_len} * 12, 'wrong glv&fakeglv hint size'); let eigen = get_eigenvalue(0); let third_root_of_unity = get_third_root_of_unity(0); let min_one = get_min_one_order(0); let nG = get_nG_glv_fake_glv(0); let mut P_1 = shplonk_q_pt; while msm_hint.len() != 0 {{ let pt = *points.pop_front().unwrap(); let scalar = *scalars.pop_front().unwrap(); // Note : Scalars are below curve order by construction (circuit outputs mod n and transcript output (u128)) let glv_fake_glv_hint: GlvFakeGlvHint = Serde::deserialize(ref msm_hint).unwrap(); let temp = _scalar_mul_glv_and_fake_glv( pt, scalar, mod_grumpkin, mod_bn, glv_fake_glv_hint, eigen, third_root_of_unity, min_one, nG, 0, ); P_1 = _ec_safe_add(P_1, temp, mod_bn, 0); }} let P_2:G1Point = full_proof.proof.kzg_quotient.into(); // Perform the KZG pairing check. let kzg_check = multi_pairing_check_bn254_2P_2F( G1G2Pair {{ p: P_1, q: G2_POINT_KZG_1 }}, G1G2Pair {{ p: P_2.negate(0), q: G2_POINT_KZG_2 }}, precomputed_lines.span(), full_proof.kzg_hint, ); """.format( debug="{:?}", msm_len=msm_size, n_vk_points=n_vk_points, n_proof_points=n_proof_points, is_on_curve_function_name=is_on_curve_function_name, ) return TEMPLATE def _get_circuit_code_header(): header = """ use core::circuit::{ u384, circuit_add, circuit_sub, circuit_mul, circuit_inverse, EvalCircuitTrait, CircuitOutputsTrait, CircuitInputs, CircuitModulus, }; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use core::circuit::CircuitElement as CE; use core::circuit::CircuitInput as CI; use garaga::definitions::{G1Point};\n """ return header def _gen_circuits_code(vk: HonkVk) -> tuple[str, str, str, list[str], str, int, str]: """ Generate the code for the sumcheck circuit and related circuits. Args: vk: The verifying key Returns: Tuple containing: - The generated code - Sumcheck function name - Prepare scalars function name - List of consistency function names - Scalar indexes - MSM length - Is on curve function name """ code = _get_circuit_code_header() curve_id = CurveID.GRUMPKIN # Generate sumcheck circuit sumcheck_circuit = ZKSumCheckCircuit(vk) sumcheck_function_name = f"{curve_id.name}_{sumcheck_circuit.name.upper()}" sumcheck_code, sumcheck_function_name = sumcheck_circuit.circuit.compile_circuit( function_name=sumcheck_function_name, pub=True, generic_modulus=True ) # Generate prepare scalars circuit prepare_scalars_circuit = ZKPrepareScalarsCircuit(vk) scalar_indexes = prepare_scalars_circuit.scalar_indexes msm_len = prepare_scalars_circuit.msm_len prepare_scalars_function_name = ( f"{curve_id.name}_{prepare_scalars_circuit.name.upper()}" ) prepare_scalars_code, prepare_scalars_function_name = ( prepare_scalars_circuit.circuit.compile_circuit( function_name=prepare_scalars_function_name, pub=True, generic_modulus=True ) ) # Generate consistency circuits consistency_circuits = [] for circuit_class in [ ZKEvalsConsistencyInitCircuit, ZKEvalsConsistencyLoopCircuit, ZKEvalsConsistencyDoneCircuit, ]: circuit = circuit_class(vk) function_name = f"{curve_id.name}_{circuit.name.upper()}" circuit_code, function_name = circuit.circuit.compile_circuit( function_name=function_name, pub=True, generic_modulus=True ) consistency_circuits.append((circuit_code, function_name)) # Combine all circuit code code += sumcheck_code + prepare_scalars_code code += "".join(circuit_code for circuit_code, _ in consistency_circuits) code += get_circuit_definition_impl_template(len(scalar_indexes)) is_on_curve_code = """ #[inline(never)] pub fn is_on_curve_excluding_infinity_bn254(p: G1Point, modulus: CircuitModulus) -> bool { // INPUT stack // y^2 = x^3 + 3 let (in0, in1) = (CE::> {}, CE::> {}); let y2 = circuit_mul(in1, in1); let x2 = circuit_mul(in0, in0); let x3 = circuit_mul(in0, x2); let y2_minus_x3 = circuit_sub(y2, x3); let mut circuit_inputs = (y2_minus_x3,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x); // in0 circuit_inputs = circuit_inputs.next_2(p.y); // in1 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let zero_check: u384 = outputs.get_output(y2_minus_x3); return zero_check == u384{limb0: 3, limb1: 0, limb2: 0, limb3: 0}; } """ code += is_on_curve_code is_on_curve_function_name = "is_on_curve_excluding_infinity_bn254" return ( code, sumcheck_function_name, prepare_scalars_function_name, [func_name for _, func_name in consistency_circuits], scalar_indexes, msm_len, is_on_curve_function_name, ) def _gen_contract_header(function_names: list[str]) -> str: """Generate the contract header and imports.""" imports_str = ", ".join(function_names) header = f""" use super::honk_verifier_constants::{{vk, precomputed_lines}}; use super::honk_verifier_circuits::{{{imports_str}}}; #[starknet::interface] pub trait IUltraKeccakZKHonkVerifier {{ fn verify_ultra_keccak_zk_honk_proof( self: @TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; }} #[starknet::contract] mod UltraKeccakZKHonkVerifier {{ use garaga::definitions::{{G1Point, G1G2Pair, BN254, get_BN254_modulus, get_GRUMPKIN_modulus, u384, get_eigenvalue, get_third_root_of_unity, get_min_one_order, get_nG_glv_fake_glv}}; use garaga::pairing_check::{{multi_pairing_check_bn254_2P_2F, MPCheckHintBN254}}; use garaga::ec_ops::{{G1PointTrait, _ec_safe_add, _scalar_mul_glv_and_fake_glv, GlvFakeGlvHint}}; use super::{{vk, precomputed_lines, {imports_str}}}; use garaga::apps::noir::{{ZKHonkProof, G2_POINT_KZG_1, G2_POINT_KZG_2}}; use garaga::apps::noir::zk_honk_transcript::{{Point256IntoCircuitPoint, KeccakHasherState, ZKHonkTranscriptTrait, ZK_BATCHED_RELATION_PARTIAL_LENGTH}}; use garaga::core::circuit::{{U32IntoU384, u288IntoCircuitInputValue, U64IntoU384, u256_to_u384}}; use core::num::traits::Zero; #[storage] struct Storage {{}} #[derive(Drop, Serde)] struct FullProof {{ proof: ZKHonkProof, msm_hint: Span, kzg_hint:MPCheckHintBN254, }} #[abi(embed_v0)] impl IUltraKeccakZKHonkVerifier of super::IUltraKeccakZKHonkVerifier {{ fn verify_ultra_keccak_zk_honk_proof( self: @ContractState, full_proof_with_hints: Span, ) -> Result, felt252> {{ // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok(public_inputs) if the proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given a proof and a verifying key. let mut full_proof_with_hints = full_proof_with_hints; let full_proof = Serde::::deserialize(ref full_proof_with_hints).expect('deserialization failed'); let mod_bn = get_BN254_modulus(); let mod_grumpkin = get_GRUMPKIN_modulus(); """ return header def _gen_constants_code(vk: HonkVk) -> str: """Generate the constants code for the contract.""" lines = precompute_lines([G2_POINT_KZG_1, G2_POINT_KZG_2]) precomputed_lines = StructArray( name="lines", elmts=[ G2Line(name=f"line{i}", elmts=lines[i : i + 4]) for i in range(0, len(lines), 4) ], ) return f""" use garaga::definitions::{{G1Point, G2Line, u384, u288}}; use garaga::apps::noir::HonkVk; {vk.to_cairo()}\n pub const precomputed_lines: [G2Line; {len(precomputed_lines)//4}] = {precomputed_lines.serialize(raw=True, const=True)}; """ def _get_msm_points_array_code(log_n: int) -> tuple[str, tuple[int, int]]: vk_points = [ "vk.qm", "vk.qc", "vk.ql", "vk.qr", "vk.qo", "vk.q4", "vk.qLookup", "vk.qArith", "vk.qDeltaRange", "vk.qElliptic", "vk.qMemory", "vk.qNnf", "vk.qPoseidon2External", "vk.qPoseidon2Internal", "vk.s1", "vk.s2", "vk.s3", "vk.s4", "vk.id1", "vk.id2", "vk.id3", "vk.id4", "vk.t1", "vk.t2", "vk.t3", "vk.t4", "vk.lagrange_first", "vk.lagrange_last", ] next_proof_point_counter = 1 proof_points = [ f"full_proof.proof.gemini_masking_poly.into(), // Proof point {next_proof_point_counter}" ] next_proof_point_counter += 1 proof_points += [ f"full_proof.proof.w1.into(), // Proof point {next_proof_point_counter}", f"full_proof.proof.w2.into(), // Proof point {next_proof_point_counter+1}", f"full_proof.proof.w3.into(), // Proof point {next_proof_point_counter+2}", f"full_proof.proof.w4.into(), // Proof point {next_proof_point_counter+3}", f"full_proof.proof.z_perm.into(), // Proof point {next_proof_point_counter+4}", f"full_proof.proof.lookup_inverses.into(), // Proof point {next_proof_point_counter+5}", f"full_proof.proof.lookup_read_counts.into(), // Proof point {next_proof_point_counter+6}", f"full_proof.proof.lookup_read_tags.into(), // Proof point {next_proof_point_counter+7}", ] next_proof_point_counter += 8 # Combine all points all_points = vk_points + proof_points points_str = ",\n".join(all_points) code = "// Starts with 1 * shplonk_q, not included in msm\n" code += f""" let mut _points: Array = array![{points_str}\n]; for gem_comm in full_proof.proof.gemini_fold_comms {{ _points.append((*gem_comm).into()); }}; // log_n -1 = {log_n-1} points || Proof points {next_proof_point_counter}-{next_proof_point_counter+(log_n-1) - 1}""" next_proof_point_counter += log_n - 1 # Add ZK-specific commitments code += f""" for lib_comm in full_proof.proof.libra_commitments {{ _points.append((*lib_comm).into()); }};// 3 points || Proof points {next_proof_point_counter}-{next_proof_point_counter+3-1}""" next_proof_point_counter += 3 # Add common final points code += f""" _points.append(full_proof.proof.kzg_quotient.into()); // Proof point {next_proof_point_counter} _points.append(BN254.G); let mut points = _points.span();""" proof_point_counter = next_proof_point_counter n_vk_points = len(vk_points) return code, (n_vk_points, proof_point_counter) def _write_and_format_project_files( output_folder_path: str, output_folder_name: str, cli_mode: bool, constants_code: str, circuits_code: str, contract_code: str, contract_name: str, verification_function_name: str, include_test_sample: bool = True, ): # Use the reusable function to write all files write_verifier_files( output_folder_path, output_folder_name, constants_code, contract_code, contract_name, verification_function_name, ProofSystem.UltraKeccakZKHonk, cli_mode, circuits_code=circuits_code, modules=["honk_verifier", "honk_verifier_constants", "honk_verifier_circuits"], constants_filename="honk_verifier_constants.cairo", contract_filename="honk_verifier.cairo", circuits_filename="honk_verifier_circuits.cairo", include_test_sample=include_test_sample, ) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Generate HONK verifier contracts") parser.add_argument( "--max-log-n", action="store_true", help="Generate contracts with maximum log N size", ) args = parser.parse_args() VK_PATH = ( "hydra/garaga/starknet/honk_contract_generator/examples/vk_ultra_keccak.bin" ) CONTRACTS_FOLDER = "src/contracts/autogenerated/" # Do not change this EXAMPLES_FOLDER = "hydra/garaga/starknet/honk_contract_generator/examples" if not args.max_log_n: FOLDER_NAME = "noir_ultra_keccak_zk_honk_example" gen_honk_verifier( VK_PATH, CONTRACTS_FOLDER, FOLDER_NAME, ) # Generate calldata output_folder_path = os.path.join(CONTRACTS_FOLDER, FOLDER_NAME) proof_file = os.path.join(EXAMPLES_FOLDER, "proof_ultra_keccak_zk.bin") public_inputs_file = os.path.join( EXAMPLES_FOLDER, "public_inputs_ultra_keccak.bin" ) if os.path.exists(proof_file) and os.path.exists(public_inputs_file): try: write_test_calldata_file_generic( output_folder_path, ProofSystem.UltraKeccakZKHonk, VK_PATH, proof_file, public_inputs_file, ) print(f"Generated calldata for {FOLDER_NAME}") except Exception as e: print(f"Error generating calldata for {FOLDER_NAME}: {e}") raise e else: print(f"Warning: Proof or public inputs file not found for {FOLDER_NAME}") if args.max_log_n: # NOTE : each additional public input increase bytecode by ~ 21 felts. # each additional circuit size increase bytecode by ~ 372 felts. vk = HonkVk.from_bytes(open(VK_PATH, "rb").read()) vk.log_circuit_size = MAX_LOG_N vk.public_inputs_size = 4 + PAIRING_POINT_OBJECT_LENGTH gen_honk_verifier( vk, CONTRACTS_FOLDER, "ultra_keccak_zk_honk_max_log_n", ) ================================================ FILE: hydra/garaga/starknet/tests_and_calldata_generators/drand_calldata.py ================================================ import secrets from pathlib import Path from typing import Optional import garaga.hints.io as io from garaga import garaga_rs from garaga.drand.client import ( DrandNetwork, G2Point, digest_func, get_chain_info, get_randomness, ) from garaga.drand.tlock import encrypt_for_round from garaga.signature import hash_to_curve from garaga.starknet.tests_and_calldata_generators.map_to_curve import * from garaga.starknet.tests_and_calldata_generators.mpcheck import ( G1G2Pair, MPCheckCalldataBuilder, ) def drand_round_to_calldata(round_number: int, use_rust=False) -> list[int]: if use_rust: return _drand_round_to_calldata_rust(round_number) message = digest_func(round_number) # print(f"round {round_number} message {message}") msg_point = hash_to_curve(message, CurveID.BLS12_381, "sha256") chain = get_chain_info(DrandNetwork.quicknet.value) round = get_randomness(chain.hash, round_number) sig_pt = round.signature_point ################### mpc_builder = MPCheckCalldataBuilder( curve_id=CurveID.BLS12_381, pairs=[ G1G2Pair(p=sig_pt, q=G2Point.get_nG(CurveID.BLS12_381, 1)), G1G2Pair(p=msg_point, q=-chain.public_key), ], n_fixed_g2=2, public_pair=None, ) cd = [] sig_pt: G1Point cd.append(round_number) cd.extend(io.bigint_split(sig_pt.x)) cd.extend(io.bigint_split(sig_pt.y)) cd.extend(build_hash_to_curve_hint(message).to_calldata()) cd.extend(mpc_builder.serialize_to_calldata()) return [len(cd)] + cd def _drand_round_to_calldata_rust( round_number: int, ) -> list[int]: chain = get_chain_info(DrandNetwork.quicknet.value) round = get_randomness(chain.hash, round_number) randomness = round.randomness signature = int(round.signature, 16) data = [ round_number, randomness, signature, ] return garaga_rs.drand_calldata_builder(data) def drand_encrypt_to_calldata( round_number: int, message: bytes, randomness: Optional[bytes] = None, use_rust=False, ) -> list[int]: if use_rust: return _drand_encrypt_to_calldata(round_number, message, randomness) chain = get_chain_info(DrandNetwork.quicknet.value) cipher_text = encrypt_for_round( chain.public_key, round_number, message, randomness is not None, randomness ) cd = [] cd.append(round_number) cd.extend(cipher_text.serialize_to_calldata()) return [len(cd)] + cd def _drand_encrypt_to_calldata( round_number: int, message: bytes, randomness: Optional[bytes] = None, ) -> list[int]: if randomness is None: randomness = secrets.token_bytes(16) data = [ round_number, int.from_bytes(message, "big"), int.from_bytes(randomness, "big"), ] return garaga_rs.drand_tlock_encrypt_calldata_builder(data) def generate_drand_decrypt_constants( verifier_class_hash: int, decrypt_contract_path: Path ): """Write the verifier class hash to the decrypt contract's constants file.""" constants_file = decrypt_contract_path / "src" / "drand_decrypt_constants.cairo" constants_file.write_text( f"// Generated — do not edit manually.\n" f"pub const VERIFIER_CLASS_HASH: felt252 = {hex(verifier_class_hash)};\n" ) if __name__ == "__main__": drand_round_to_calldata(1) drand_round_to_calldata(2) # drand_round_to_calldata(3) ================================================ FILE: hydra/garaga/starknet/tests_and_calldata_generators/map_to_curve.py ================================================ from dataclasses import dataclass from garaga.algebra import PyFelt from garaga.curves import CURVES, CurveID, get_base_field from garaga.hints.io import bigint_split, int_to_u384 from garaga.points import G1Point from garaga.signature import apply_isogeny, hash_to_field @dataclass(slots=True) class MapToCurveHint: gx1_is_square: bool y1: PyFelt y_flag: bool def to_cairo(self) -> str: return f"MapToCurveHint {{ gx1_is_square: {str(self.gx1_is_square).lower()}, y1: {int_to_u384(self.y1.value, as_hex=True)}, y_flag: {str(self.y_flag).lower()} }}" def to_calldata(self) -> list[int]: cd = [] cd.append(int(self.gx1_is_square)) cd.extend(bigint_split(self.y1.value)) cd.append(int(self.y_flag)) return cd @dataclass(slots=True) class HashToCurveHint: f0_hint: MapToCurveHint f1_hint: MapToCurveHint def to_cairo(self) -> str: return f"""HashToCurveHint {{ f0_hint: {self.f0_hint.to_cairo()}, f1_hint: {self.f1_hint.to_cairo()} }}""" def to_calldata(self) -> list[int]: cd = [] cd.extend(self.f0_hint.to_calldata()) cd.extend(self.f1_hint.to_calldata()) return cd def build_map_to_curve_hint(u: PyFelt) -> tuple[G1Point, MapToCurveHint]: field = get_base_field(CurveID.BLS12_381) a = field(CURVES[CurveID.BLS12_381.value].swu_params.A) b = field(CURVES[CurveID.BLS12_381.value].swu_params.B) z = field(CURVES[CurveID.BLS12_381.value].swu_params.Z) zeta_u2 = z * u**2 ta = zeta_u2**2 + zeta_u2 num_x1 = b * (ta + field.one()) if ta.value == 0: div = a * z else: div = a * -ta num2_x1 = num_x1**2 div2 = div**2 div3 = div2 * div assert div3.value != 0 num_gx1 = (num2_x1 + a * div2) * num_x1 + b * div3 num_x2 = zeta_u2 * num_x1 gx1 = num_gx1 / div3 gx1_square = gx1.is_quad_residue() if gx1_square: y1 = gx1.sqrt(min_root=False) assert y1 * y1 == gx1 else: y1 = (z * gx1).sqrt(min_root=False) assert y1 * y1 == z * gx1 y2 = zeta_u2 * u * y1 y = y1 if gx1_square else y2 y_flag = y.value % 2 == u.value % 2 num_x = num_x1 if gx1_square else num_x2 x_affine = num_x / div y_affine = -y if y.value % 2 != u.value % 2 else y point_on_curve = G1Point( x_affine.value, y_affine.value, CurveID.BLS12_381, iso_point=True ) return point_on_curve, MapToCurveHint( gx1_is_square=gx1_square, y1=y1, y_flag=y_flag ) def build_hash_to_curve_hint(message: bytes) -> HashToCurveHint: felt0, felt1 = hash_to_field(message, 2, CurveID.BLS12_381.value, "sha256") pt0, f0_hint = build_map_to_curve_hint(felt0) pt1, f1_hint = build_map_to_curve_hint(felt1) sum_pt = pt0.add(pt1) # print( # f"sum_pt: {int_to_u384(sum_pt.x, as_hex=False)} {int_to_u384(sum_pt.y, as_hex=False)}" # ) sum_pt = apply_isogeny(sum_pt) # print( # f"sum_pt: {int_to_u384(sum_pt.x, as_hex=False)} {int_to_u384(sum_pt.y, as_hex=False)}" # ) x = CURVES[CurveID.BLS12_381.value].x n = CURVES[CurveID.BLS12_381.value].n cofactor = (1 - (x % n)) % n # 15132376222941642753 # print(f"cofactor: {cofactor}, hex :{hex(cofactor)}") return HashToCurveHint( f0_hint=f0_hint, f1_hint=f1_hint, ) if __name__ == "__main__": field = get_base_field(CurveID.BLS12_381) import hashlib hint = build_hash_to_curve_hint(hashlib.sha256(b"Hello, World!").digest()) print(hint.to_cairo()) # print(hint.to_calldata()) ================================================ FILE: hydra/garaga/starknet/tests_and_calldata_generators/mpcheck.py ================================================ import functools from dataclasses import dataclass from functools import lru_cache from garaga import garaga_rs from garaga import modulo_circuit_structs as structs from garaga.algebra import Polynomial, PyFelt from garaga.curves import CurveID, get_base_field, get_irreducible_poly from garaga.points import G1G2Pair from garaga.poseidon_transcript import CairoPoseidonTranscript from garaga.precompiled_circuits.multi_miller_loop import precompute_lines from garaga.precompiled_circuits.multi_pairing_check import ( MultiMillerLoopCircuit, MultiPairingCheckCircuit, WriteOps, get_max_Q_degree, ) @dataclass(slots=True) class MPCheckCalldataBuilder: curve_id: CurveID pairs: list[G1G2Pair] n_fixed_g2: int public_pair: G1G2Pair | None def __hash__(self): return hash( (self.curve_id, tuple(self.pairs), self.n_fixed_g2, self.public_pair) ) def __post_init__(self): # Validate input assert isinstance(self.pairs, (list, tuple)) assert all( isinstance(pair, G1G2Pair) for pair in self.pairs ), f"All pairs must be G1G2Pair, got {[type(pair) for pair in self.pairs]}" assert all( self.curve_id == pair.curve_id == self.pairs[0].curve_id for pair in self.pairs ), f"All pairs must be on the same curve, got {[pair.curve_id for pair in self.pairs]}" assert ( isinstance(self.public_pair, G1G2Pair) or self.public_pair is None ), f"Extra pair must be G1G2Pair or None, got {self.public_pair}" assert len(self.pairs) >= 2 assert 0 <= self.n_fixed_g2 <= len(self.pairs) @property def include_miller_loop_result(self): return self.public_pair is not None @property def field(self): return get_base_field(self.curve_id) @property def big_Q_expected_len(self): return get_max_Q_degree(self.curve_id.value, len(self.pairs)) + 1 @property def three_limbs_only(self): return self.curve_id != CurveID.BLS12_381 @lru_cache(maxsize=1) def extra_miller_loop_result(self) -> list[PyFelt] | None: if self.include_miller_loop_result: circuit = MultiMillerLoopCircuit( name="precompute M", curve_id=self.curve_id.value, n_pairs=1 ) circuit.write_p_and_q_raw(self.public_pair.to_pyfelt_list()) M = circuit.miller_loop(n_pairs=1) return [mi.felt for mi in M] else: return None @lru_cache(maxsize=1) def lines(self) -> list[PyFelt]: lines = precompute_lines([pair.q for pair in self.pairs[0 : self.n_fixed_g2]]) assert len(lines) % 4 == 0, f"Lines must be a multiple of 4, got {len(lines)}" return lines def _init_circuit(self) -> MultiPairingCheckCircuit: mpcheck_circuit = MultiPairingCheckCircuit( name="mpcheck", curve_id=self.curve_id.value, n_pairs=len(self.pairs), precompute_lines=bool(self.n_fixed_g2), n_points_precomputed_lines=self.n_fixed_g2, ) mpcheck_circuit.precomputed_lines = mpcheck_circuit.write_elements( self.lines(), WriteOps.INPUT ) mpcheck_circuit._precomputed_lines_generator = ( mpcheck_circuit._create_precomputed_lines_generator() ) p_q_input = [] for pair in self.pairs: p_q_input.extend(pair.to_pyfelt_list()) mpcheck_circuit.write_p_and_q_raw(p_q_input) return mpcheck_circuit def _retrieve_Pis_Qis_and_Ris_from_circuit( self, mpcheck_circuit: MultiPairingCheckCircuit ) -> tuple[list[list[PyFelt]], list[list[PyFelt]], list[list[PyFelt]]]: relations = mpcheck_circuit.accumulate_poly_instructions[0] Qis = relations.Qis Pis = relations.Pis Ris = relations.Ris return Pis, Qis, Ris def _get_passed_Ris_from_Ris(self, Ris: list[list[PyFelt]]) -> list[list[PyFelt]]: passed_Ris = ( Ris if self.curve_id == CurveID.BLS12_381 else Ris[1:] ) # Skip first Ri for BN254 as it known to be one (lambda_root*lambda_root_inverse) result return passed_Ris def _init_transcript(self) -> CairoPoseidonTranscript: transcript = self._new_transcript() # Hash inputs. for pair in self.pairs: transcript.hash_limbs_multi( pair.to_pyfelt_list(), three_limbs_only=False ) # False because G1Point is holding u384 only. return transcript def _hash_hints_and_get_base_random_rlc_coeff( self, transcript: CairoPoseidonTranscript, lambda_root: list[PyFelt], lambda_root_inverse: list[PyFelt], scaling_factor: list[PyFelt], scaling_factor_sparsity: list[PyFelt], Ris: list[list[PyFelt]], ) -> PyFelt: if self.curve_id == CurveID.BN254: transcript.hash_limbs_multi(lambda_root) transcript.hash_limbs_multi(lambda_root_inverse) transcript.hash_limbs_multi(scaling_factor, sparsity=scaling_factor_sparsity) for Ri in Ris: assert len(Ri) == 12 transcript.hash_limbs_multi(Ri) if self.include_miller_loop_result: transcript.hash_limbs_multi(self.extra_miller_loop_result()) return self.field(transcript.s1) def _hash_big_Q_and_get_z( self, transcript: CairoPoseidonTranscript, big_Q: list[PyFelt] ): # Start a fresh transcript for the second stage and seed it with the base RLC coefficient seeded_transcript = self._seed_transcript_with_base_rlc( self._new_transcript("_II"), transcript.s1 ) seeded_transcript.hash_limbs_multi(big_Q) return self.field(seeded_transcript.s0) def _new_transcript(self, stage_suffix: str = "") -> CairoPoseidonTranscript: init_hash = f"MPCHECK_{self.curve_id.name}_{len(self.pairs)}P_{self.n_fixed_g2}F{stage_suffix}" return CairoPoseidonTranscript( init_hash=int.from_bytes(init_hash.encode(), byteorder="big"), three_limbs_only=self.three_limbs_only, ) def _seed_transcript_with_base_rlc( self, transcript: CairoPoseidonTranscript, base_rlc: PyFelt ) -> CairoPoseidonTranscript: # Hash the base RLC coefficient from _hash_hints_and_get_base_random_rlc_coeff transcript.hash_element(base_rlc) return transcript def _sanity_check_verify_rlc_equation( self, z: PyFelt, c1: PyFelt, n_relations_with_ci: int, Pis: list[list[PyFelt]], big_Q: Polynomial, Ris: list[list[PyFelt]], ): lhs = self.field.zero() ci = self.field.one() k = 0 for i in range(n_relations_with_ci - 1, -1, -1): # if self.public_pair is None: # print(f"{self.curve_id.name} = LHS_{k} : {io.int_to_u384(lhs, False)}") k += 1 Prod_Pis_of_z = functools.reduce( lambda x, y: x * y, [Polynomial(pi).evaluate(z) for pi in Pis[i]] ) Ri_of_z = Polynomial(Ris[i]).evaluate(z) lhs += ci * (Prod_Pis_of_z - Ri_of_z) ci *= c1 # print(f"lhs_{i} : {io.int_to_u384(lhs)}") lhs_print = self.field.zero() k = 0 for i in range(n_relations_with_ci): # if self.public_pair is None: # print( # f"{self.curve_id.name} = LHS_{k} : {io.int_to_u384(lhs_print, False)}" # ) k += 1 Prod_Pis_of_z = functools.reduce( lambda x, y: x * y, [Polynomial(pi).evaluate(z) for pi in Pis[i]] ) Ri_of_z = Polynomial(Ris[i]).evaluate(z) __lhs = Prod_Pis_of_z - Ri_of_z lhs_print = lhs_print * c1 + __lhs P_irr = get_irreducible_poly(curve_id=self.curve_id, extension_degree=12) big_Q_of_z = big_Q.evaluate(z) P_of_z = P_irr.evaluate(z) # print(f"big_Q_of_z : {io.int_to_u384(big_Q_of_z)}") # print(f"P_of_z : {io.int_to_u384(P_of_z)}") assert lhs == big_Q_of_z * P_of_z, "Check failed." @lru_cache(maxsize=1) def build_mpcheck_hint( self, ) -> tuple[ structs.Cairo1SerializableStruct, structs.Cairo1SerializableStruct | None ]: """ Return MPCheckHint struct """ mpcheck_circuit = self._init_circuit() transcript = self._init_transcript() _, lambda_root, lambda_root_inverse, scaling_factor, scaling_factor_sparsity = ( mpcheck_circuit.multi_pairing_check( len(self.pairs), self.extra_miller_loop_result() ) ) Pis, Qis, Ris = self._retrieve_Pis_Qis_and_Ris_from_circuit(mpcheck_circuit) passed_Ris = self._get_passed_Ris_from_Ris(Ris) c1 = self._hash_hints_and_get_base_random_rlc_coeff( transcript, lambda_root, lambda_root_inverse, scaling_factor, scaling_factor_sparsity, passed_Ris, ) n_relations_with_ci = len(passed_Ris) + ( 1 if self.curve_id == CurveID.BN254 else 0 ) ci, big_Q = self.field.one(), Polynomial.zero(self.field.p) for i in range(n_relations_with_ci - 1, -1, -1): # print(f"c_{i} : {io.int_to_u384(ci)}") big_Q += Qis[i] * ci ci *= c1 # print(f"{i=}, {n_relations_with_ci=}") assert ci == c1 ** (n_relations_with_ci - i) big_Q_coeffs = big_Q.get_coeffs() big_Q_coeffs.extend( [self.field.zero()] * (self.big_Q_expected_len - len(big_Q_coeffs)) ) z = self._hash_big_Q_and_get_z(transcript, big_Q_coeffs) self._sanity_check_verify_rlc_equation( z, c1, n_relations_with_ci, Pis, big_Q, Ris ) # Skip last Ri as it is known to be 1 for pairing checks assert [x.value for x in passed_Ris[-1]] == [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], f"Last Ri must be 1_Fp12, got {[x.value for x in passed_Ris[-1]]}" passed_Ris = passed_Ris[:-1] if self.curve_id == CurveID.BN254: hint_struct_list_init = [ structs.E12D(name="lambda_root", elmts=lambda_root) ] else: hint_struct_list_init = [] return structs.Struct( struct_name=f"MPCheckHint{self.curve_id.name}", name="hint", elmts=hint_struct_list_init + [ structs.E12D(name="lambda_root_inverse", elmts=lambda_root_inverse), structs.MillerLoopResultScalingFactor( name="w", elmts=[ wi for wi, si in zip(scaling_factor, scaling_factor_sparsity) if si != 0 ], ), structs.StructSpan( name="Ris", elmts=[ structs.E12D(name=f"R{i}", elmts=[ri.felt for ri in Ri]) for i, Ri in enumerate(passed_Ris) ], ), structs.u384Array(name="big_Q", elmts=big_Q_coeffs), ] + [structs.felt252(name="z", elmts=[z])], ) def _get_input_structs(self) -> list[structs.Cairo1SerializableStruct]: inputs = [] for i, pair in enumerate(self.pairs): inputs.append( structs.G1G2PairCircuit(name=f"pair{i}", elmts=pair.to_pyfelt_list()) ) if self.include_miller_loop_result: inputs.append( structs.E12D( name="precomputed_miller_loop_result", elmts=self.extra_miller_loop_result(), ) ) if self.n_fixed_g2 > 0: lines = self.lines() inputs.append( structs.StructSpan( name="lines", elmts=[ structs.G2Line(name=f"line{i}", elmts=lines[i : i + 4]) for i in range(0, len(lines), 4) ], ) ) mpcheck_hint = self.build_mpcheck_hint() inputs.append(mpcheck_hint) return inputs def to_cairo_1_test(self): # print( # f"Generating MPCheck test for {self.curve_id.name} with {len(self.pairs)} pairs and {self.n_fixed_g2} fixed G2 points, using extra Miller loop result: {self.include_miller_loop_result}" # ) with_extra = ( "_with_extra_miller_loop_result" if self.include_miller_loop_result else "" ) fn_name = f"multi_pairing_check_{self.curve_id.name.lower()}_{len(self.pairs)}P_{self.n_fixed_g2}F{with_extra}" inputs = self._get_input_structs() test_name = f"test_{self.curve_id.name}_mpcheck_{len(self.pairs)}P_{self.n_fixed_g2}F{with_extra}" input_code = "" for struct in inputs: input_code += struct.serialize() code = f""" #[test] fn {test_name}() {{ {input_code} let res = {fn_name}({', '.join([struct.name for struct in inputs])}); assert!(res.is_ok()); }} """ return code def _serialize_to_calldata_rust(self) -> list[int]: return garaga_rs.mpc_calldata_builder( self.curve_id.value, [element.value for pair in self.pairs for element in pair.to_pyfelt_list()], self.n_fixed_g2, ( [element.value for element in self.public_pair.to_pyfelt_list()] if self.public_pair is not None else [] ), ) def serialize_to_calldata( self, use_rust=False, ) -> list[int]: if use_rust: return self._serialize_to_calldata_rust() mpcheck_hint = self.build_mpcheck_hint() call_data: list[int] = [] call_data.extend(mpcheck_hint.serialize_to_calldata()) return call_data if __name__ == "__main__": from garaga.precompiled_circuits.multi_pairing_check import get_pairing_check_input pairs, public_pair = get_pairing_check_input( curve_id=CurveID.BLS12_381, n_pairs=3, include_m=True, return_pairs=True, ) mpc = MPCheckCalldataBuilder( curve_id=CurveID.BLS12_381, pairs=pairs, n_fixed_g2=2, public_pair=public_pair, ) print(mpc.serialize_to_calldata(use_rust=True)) ================================================ FILE: hydra/garaga/starknet/tests_and_calldata_generators/msm.py ================================================ from dataclasses import dataclass from functools import lru_cache from garaga import garaga_rs from garaga import modulo_circuit_structs as structs from garaga.algebra import PyFelt from garaga.curves import CURVES, STARK, CurveID, WeierstrassCurve, get_base_field from garaga.hints import fake_glv from garaga.points import G1Point @dataclass(slots=True) class MSMCalldataBuilder: curve_id: CurveID points: list[G1Point] scalars: list[int] def __post_init__(self): assert all( point.curve_id == self.curve_id for point in self.points ), "All points must be on the same curve." assert len(self.points) == len( self.scalars ), f"Number of points and scalars must be equal, got {len(self.points)} points and {len(self.scalars)} scalars" assert all( 0 <= s <= CURVES[self.curve_id.value].n for s in self.scalars ), f"Scalars must be in [0, {self.curve_id.name}'s order] == [0, {CURVES[self.curve_id.value].n}]." def __hash__(self) -> int: return hash((self.curve_id, tuple(self.points), tuple(self.scalars))) @property def field(self): return get_base_field(self.curve_id) @property def msm_size(self): return len(self.scalars) @property def curve(self) -> WeierstrassCurve: return CURVES[self.curve_id.value] @lru_cache(maxsize=2) def build_msm_hint(self) -> structs.StructArray: """ Returns the MSMHint """ hints_structs = [] for i, (point, scalar) in enumerate(zip(self.points, self.scalars)): if self.curve.is_endomorphism_available(): Q, u1, u2, v1, v2 = fake_glv.get_glv_fake_glv_hint(point, scalar) hints_structs.append( structs.Struct( struct_name=f"GlvFakeGlvHint", name=f"glv_fake_glv_hint_{i}", elmts=[ structs.G1PointCircuit.from_G1Point("Q", Q), structs.felt252(name=f"u1_{i}", elmts=[PyFelt(u1, STARK)]), structs.felt252(name=f"u2_{i}", elmts=[PyFelt(u2, STARK)]), structs.felt252(name=f"v1_{i}", elmts=[PyFelt(v1, STARK)]), structs.felt252(name=f"v2_{i}", elmts=[PyFelt(v2, STARK)]), ], ) ) else: Q, s1, s2 = fake_glv.get_fake_glv_hint(point, scalar) hints_structs.append( structs.Struct( struct_name=f"FakeGlvHint", name=f"fake_glv_hint_{i}", elmts=[ structs.G1PointCircuit.from_G1Point("Q", Q), structs.felt252(name=f"s1_{i}", elmts=[PyFelt(s1, STARK)]), structs.felt252(name=f"s2_{i}", elmts=[PyFelt(s2, STARK)]), ], ) ) return structs.StructSpan(name="msm_hint", elmts=hints_structs) def _get_input_structs( self, ) -> list[structs.Cairo1SerializableStruct]: """ """ inputs = [] inputs.append(self.build_msm_hint()) # msm_hint inputs.append( structs.StructSpan( name="points", elmts=[ structs.G1PointCircuit.from_G1Point(f"point{i}", point) for i, point in enumerate(self.points) ], ) ) inputs.append( structs.StructSpan( name="scalars", elmts=[ structs.u256(name=f"scalar{i}", elmts=[PyFelt(s, 2**256)]) for i, s in enumerate(self.scalars) ], ) ) return inputs def to_cairo_1_test(self, test_name: str = None, ignored=False): # print( # f"Generating MSM test for {self.curve_id.name} with {len(self.scalars)} points" # ) test_name = test_name or f"test_msm_{self.curve_id.name}_{len(self.scalars)}P" inputs = garaga_rs.msm_calldata_builder( [value for point in self.points for value in [point.x, point.y]], self.scalars, self.curve_id.value, True, False, ) Q = structs.G1PointCircuit.from_G1Point( "Q", G1Point.msm(self.points, self.scalars) ) T = "u384" if self.curve_id == CurveID.BLS12_381 else "u288" ignore_str = "\n#[ignore]" if ignored else "" code = f""" #[test]{ignore_str} fn {test_name}() {{ let mut data = array![{','.join([hex(value) for value in inputs])}].span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!(res == {Q.serialize(raw=True)}); }} """ return code def _serialize_to_calldata_rust( self, include_points_and_scalars=True, serialize_as_pure_felt252_array=False, ) -> list[int]: return garaga_rs.msm_calldata_builder( [value for point in self.points for value in [point.x, point.y]], self.scalars, self.curve_id.value, include_points_and_scalars, serialize_as_pure_felt252_array, ) def serialize_to_calldata( self, include_points_and_scalars=True, serialize_as_pure_felt252_array=False, use_rust=False, ) -> list[int]: if use_rust: return self._serialize_to_calldata_rust( include_points_and_scalars, serialize_as_pure_felt252_array, ) msm_hint, points, scalars = self._get_input_structs() call_data: list[int] = [] if include_points_and_scalars: call_data.extend(points.serialize_to_calldata()) call_data.extend(scalars.serialize_to_calldata()) call_data.append(self.curve_id.value) call_data.extend(msm_hint.serialize_to_calldata()[1:]) if serialize_as_pure_felt252_array: return [len(call_data)] + call_data else: return call_data if __name__ == "__main__": import random c = CurveID.SECP256K1 order = CURVES[c.value].n msm = MSMCalldataBuilder( curve_id=c, points=[G1Point.gen_random_point(c) for _ in range(1)], scalars=[random.randint(0, order) for _ in range(1)], ) cd = msm.serialize_to_calldata( include_points_and_scalars=True, serialize_as_pure_felt252_array=False, ) print(cd) print(len(cd)) ================================================ FILE: hydra/garaga/starknet/tests_and_calldata_generators/signatures.py ================================================ import random from dataclasses import dataclass from functools import lru_cache from hashlib import sha512 from garaga import garaga_rs from garaga.curves import BASE, CURVES, N_LIMBS, CurveID, TwistedEdwardsCurve from garaga.hints.io import bigint_split, split_128 from garaga.points import G1Point from garaga.rsa_rns import ( CHANNEL_MODULI, ReductionWitness, RNSContext, RNSInteger, RSA2048ExponentiationWitness, generate_rsa2048_sha256_witness, generate_rsa2048_witness, is_valid_rsa2048_witness, ) @dataclass(slots=True) class SchnorrSignature: """ A Schnorr signature with associated public key and challenge. Fields : rx : int - The x-coordinate of the R point from the signature. s : int - The s-coordinate of the signature. e : int - The challenge hash. px : int - The x-coordinate of the public key. py : int - The y-coordinate of the public key. curve_id : CurveID - The curve id. """ rx: int s: int e: int px: int py: int curve_id: CurveID def __post_init__(self): assert self.py % 2 == 0, "y-coordinate of public key must be even" n = CURVES[self.curve_id.value].n p = CURVES[self.curve_id.value].p assert ( 0 <= self.rx < p ), f"rx must be in range 0 < rx < {hex(p)}, got {hex(self.rx)}" assert 0 < self.s < n, f"s must be in range 0 < s < {hex(n)}, got {hex(self.s)}" assert 0 < self.e < n, f"e must be in range 0 < e < {hex(n)}, got {hex(self.e)}" @classmethod def sample(cls, curve_id: CurveID) -> "SchnorrSignature": """ Generate a valid Schnorr signature for the given curve. The algorithm: 1. Generate private key x 2. Compute public key P = xG 3. Generate random k (nonce) 4. Compute R = kG 5. Compute e (challenge) 6. Compute s = k + ex (mod n) """ curve = CURVES[curve_id.value] n = curve.n G = G1Point.get_nG(curve_id, 1) # Generate private key and compute public key x = random.randint(1, n - 1) Pk = G.scalar_mul(x) # Ensure public key has even y (BIP340 requirement) if Pk.y % 2 == 1: x = (-x) % n # Update the private key accordingly Pk = -Pk # Generate nonce and compute R point k = random.randint(1, n - 1) R = G.scalar_mul(k) # Ensure R has even y (BIP340 requirement) if R.y % 2 == 1: k = (-k) % n # Update the nonce accordingly R = -R # Generate challenge (in real usage this would be H(R.x || P.x || message)) e = random.randint(1, n - 1) # Compute s = k + ex mod n s = (k + e * x) % n res = SchnorrSignature(rx=R.x, s=s, e=e, px=Pk.x, py=Pk.y, curve_id=curve_id) assert res.is_valid(), "generated signature is invalid" return res def is_valid(self) -> bool: Pk = G1Point(self.px, self.py, self.curve_id) n = CURVES[self.curve_id.value].n G = G1Point.get_nG(self.curve_id, 1) res = G.scalar_mul(self.s).add(Pk.scalar_mul(-self.e % n)) return res.x == self.rx def serialize(self, prepend_public_key: bool = True) -> list[int]: cd = [] if prepend_public_key: cd.extend(bigint_split(self.px, N_LIMBS, BASE)) cd.extend(bigint_split(self.py, N_LIMBS, BASE)) cd.extend(bigint_split(self.rx, N_LIMBS, BASE)) cd.extend(split_128(self.s)) cd.extend(split_128(self.e)) return cd def serialize_with_hints( self, use_rust=False, as_str=False, prepend_public_key: bool = True ) -> list[int] | str: """Serialize the signature with hints for verification""" if use_rust: cd = garaga_rs.schnorr_calldata_builder( self.rx, self.s, self.e, self.px, self.py, prepend_public_key, self.curve_id.value, ) if as_str: return "[{}]".format(", ".join(map(hex, cd))) return cd cd = self.serialize(prepend_public_key) e_neg = -self.e % CURVES[self.curve_id.value].n msm_calldata = garaga_rs.msm_calldata_builder( [ CURVES[self.curve_id.value].Gx, CURVES[self.curve_id.value].Gy, self.px, self.py, ], [self.s, e_neg], self.curve_id.value, False, # include_points_and_scalars True, # serialize_as_pure_felt252_array ) cd.extend(msm_calldata) if as_str: return "[{}]".format(", ".join(map(hex, cd))) return cd @dataclass(slots=True) class ECDSASignature: """ An ECDSA signature with recovery parameter and associated public key and message hash. Fields: r : int - r component of the signature (derived from the ephemeral point R.x mod n). s : int - s component of the signature. v : int - Recovery parameter; 0 if R.y is even, otherwise 1. px : int - The x-coordinate of the public key. py : int - The y-coordinate of the public key. z : int - The message hash used in signing (in practice, z = H(message)). curve_id : CurveID - The identifier for the curve being used. """ r: int s: int v: int px: int py: int z: int curve_id: CurveID def __post_init__(self): curve = CURVES[self.curve_id.value] n = curve.n p = curve.p # For ECDSA, r and s must be nonzero and less than n. assert 0 < self.r < n, f"r must be in range 1..n-1, got {hex(self.r)}" assert 0 < self.s < n, f"s must be in range 1..n-1, got {hex(self.s)}" # v should be either 0 or 1. assert self.v in (0, 1), f"v must be 0 or 1, got {self.v}" # Ensure public key coordinates are in the field. assert 0 <= self.px < p, f"px must be in range 0..p-1, got {hex(self.px)}" assert 0 <= self.py < p, f"py must be in range 0..p-1, got {hex(self.py)}" @classmethod def sample(cls, curve_id: CurveID) -> "ECDSASignature": """ Generate a valid ECDSA signature for the given curve. The algorithm: 1. Generate a private key d. 2. Compute the public key Q = d * G. 3. Generate a random message hash z (in practice, z = H(message)). 4. Choose a random nonce k and compute R = k * G. 5. Let r = R.x mod n (with r != 0). 6. Compute s = k^{-1} * (z + r * d) mod n (with s != 0). 7. Set the recovery parameter v = 0 if R.y is even, else 1. """ curve = CURVES[curve_id.value] n = curve.n p = curve.p G = G1Point.get_nG(curve_id, 1) # Generate the private key d and public key Q. d = random.randint(1, n - 1) Q = G.scalar_mul(d) # Generate a random message hash (normally, this is H(message)). z = random.randint(1, n - 1) # Choose a nonce k until we get valid r and s. while True: k = random.randint(1, n - 1) R = G.scalar_mul(k) r = R.x % n # r is computed from the x-coordinate of R. if r == 0: continue try: k_inv = pow(k, -1, n) except ValueError: continue s = (k_inv * (z + r * d)) % n if s == 0: continue v = 0 if R.y % 2 == 0 else 1 break sig = cls(r=r, s=s, v=v, px=Q.x, py=Q.y, z=z, curve_id=curve_id) assert ( sig.is_valid() ), f"generated ECDSA signature on curve {curve_id.name} is invalid" return sig def is_valid(self) -> bool: """ Verify the ECDSA signature using the stored message hash and public key. Standard verification: 1. Compute w = s^{-1} mod n. 2. Compute u1 = z * w mod n and u2 = r * w mod n. 3. Compute R' = u1 * G + u2 * Q. 4. The signature is valid if (R'.x mod n) equals r. """ curve = CURVES[self.curve_id.value] n = curve.n G = G1Point.get_nG(self.curve_id, 1) Q = G1Point(self.px, self.py, self.curve_id) try: s_inv = pow(self.s, -1, n) except ValueError: return False u1 = (self.z * s_inv) % n u2 = (self.r * s_inv) % n R_prime = G.scalar_mul(u1).add(Q.scalar_mul(u2)) return (R_prime.x % n) == self.r def serialize(self, prepend_public_key: bool = True) -> list[int]: cd = [] if prepend_public_key: cd.extend(bigint_split(self.px, N_LIMBS, BASE)) cd.extend(bigint_split(self.py, N_LIMBS, BASE)) cd.extend(bigint_split(self.r, N_LIMBS, BASE)) cd.extend(split_128(self.s)) cd.append(self.v) cd.extend(split_128(self.z)) return cd def serialize_with_hints( self, use_rust=False, as_str=False, prepend_public_key: bool = True ) -> list[int] | str: """Serialize the signature with hints for verification""" if use_rust: cd = garaga_rs.ecdsa_calldata_builder( self.r, self.s, self.v, self.px, self.py, self.z, prepend_public_key, self.curve_id.value, ) if as_str: return "[{}]".format(", ".join(map(hex, cd))) return cd cd = self.serialize(prepend_public_key) n = CURVES[self.curve_id.value].n s_inv = pow(self.s, -1, n) u1 = (self.z * s_inv) % n u2 = (self.r * s_inv) % n msm_calldata = garaga_rs.msm_calldata_builder( [ CURVES[self.curve_id.value].Gx, CURVES[self.curve_id.value].Gy, self.px, self.py, ], [u1, u2], self.curve_id.value, False, # include_points_and_scalars True, # serialize_as_pure_felt252_array ) cd.extend(msm_calldata) if as_str: return "[{}]".format(", ".join(map(hex, cd))) return cd @dataclass(slots=True) class RSA2048Signature: """RSA-2048 signature with reduction witnesses for on-chain verification.""" modulus: RNSInteger signature: RNSInteger expected_message: RNSInteger reductions: tuple[ReductionWitness, ...] @classmethod def from_bundle(cls, bundle: RSA2048ExponentiationWitness) -> "RSA2048Signature": return cls( modulus=bundle.modulus, signature=bundle.signature, expected_message=bundle.expected_message, reductions=bundle.reductions, ) @classmethod def sample(cls, seed: int = 0) -> "RSA2048Signature": return cls.from_bundle(generate_rsa2048_witness(seed=seed)) @classmethod def tampered_residue_sample(cls, seed: int = 0) -> "RSA2048Signature": sample = cls.sample(seed=seed) first = sample.reductions[0] bad_residues = list(first.remainder.residues) bad_residues[0] = (bad_residues[0] + 1) % CHANNEL_MODULI[0] tampered_remainder = RNSInteger( value=first.remainder.value, limbs=first.remainder.limbs, residues=tuple(bad_residues), ) return cls( modulus=sample.modulus, signature=sample.signature, expected_message=sample.expected_message, reductions=( ReductionWitness( quotient=first.quotient, remainder=tampered_remainder, ), *sample.reductions[1:], ), ) @classmethod def tampered_limb_sample(cls, seed: int = 0) -> "RSA2048Signature": sample = cls.sample(seed=seed) first = sample.reductions[0] bad_limbs = list(first.quotient.limbs) bad_limbs[1] ^= 1 tampered_quotient = RNSInteger( value=first.quotient.value, limbs=tuple(bad_limbs), residues=first.quotient.residues, ) return cls( modulus=sample.modulus, signature=sample.signature, expected_message=sample.expected_message, reductions=( ReductionWitness( quotient=tampered_quotient, remainder=first.remainder, ), *sample.reductions[1:], ), ) @classmethod def tampered_expected_message_sample(cls, seed: int = 0) -> "RSA2048Signature": sample = cls.sample(seed=seed) bad_limbs = list(sample.expected_message.limbs) bad_limbs[0] ^= 1 tampered_expected_message = RNSInteger( value=sample.expected_message.value, limbs=tuple(bad_limbs), residues=sample.expected_message.residues, ) return cls( modulus=sample.modulus, signature=sample.signature, expected_message=tampered_expected_message, reductions=sample.reductions, ) def _to_bundle(self) -> RSA2048ExponentiationWitness: return RSA2048ExponentiationWitness( modulus=self.modulus, signature=self.signature, expected_message=self.expected_message, reductions=self.reductions, ) def is_valid(self) -> bool: return is_valid_rsa2048_witness( self._to_bundle(), ctx=RNSContext(CHANNEL_MODULI) ) def serialize_public_key(self) -> list[int]: return self.modulus.serialize_to_calldata() def serialize_signature_with_hints(self) -> list[int]: return self._to_bundle().serialize_signature_with_hint() def serialize(self, prepend_public_key: bool = True) -> list[int]: return self._to_bundle().serialize(prepend_public_key=prepend_public_key) def serialize_with_hints( self, use_rust: bool = False, as_str: bool = False, prepend_public_key: bool = True, ) -> list[int] | str: if use_rust: cd = garaga_rs.rsa_2048_calldata_builder( self.signature.value, self.expected_message.value, self.modulus.value, prepend_public_key, ) if as_str: return "[{}]".format(", ".join(map(hex, cd))) return cd calldata = self.serialize(prepend_public_key=prepend_public_key) if as_str: return "[{}]".format(", ".join(map(hex, calldata))) return calldata @classmethod def from_sha256_message(cls, message: bytes, seed: int = 0) -> "RSA2048Signature": """Create an RSA2048Signature from a raw message using SHA-256.""" return cls.from_bundle(generate_rsa2048_sha256_witness(message, seed=seed)) def serialize_sha256_with_hints( self, message: bytes, use_rust: bool = False, as_str: bool = False, prepend_public_key: bool = True, ) -> list[int] | str: """Serialize the signature with hints for SHA-256 on-chain verification. Appends the ByteArray-serialized message after the RSA calldata. """ if use_rust: cd = garaga_rs.rsa_2048_sha256_calldata_builder( self.signature.value, message, self.modulus.value, prepend_public_key, ) if as_str: return "[{}]".format(", ".join(map(hex, cd))) return cd # Python path: RSA calldata + ByteArray serialization calldata = self.serialize(prepend_public_key=prepend_public_key) calldata.extend(_serialize_byte_array(message)) if as_str: return "[{}]".format(", ".join(map(hex, calldata))) return calldata def _serialize_byte_array(data: bytes) -> list[int]: """Serialize bytes as a Cairo ByteArray in felt252 calldata format. Layout: [num_full_words, word_0, ..., word_{n-1}, pending_word, pending_word_len] Each full word is 31 bytes. The pending word is 0-30 bytes. """ full_word_count = len(data) // 31 pending_len = len(data) % 31 cd = [full_word_count] for i in range(full_word_count): start = i * 31 word = int.from_bytes(data[start : start + 31], byteorder="big") cd.append(word) if pending_len > 0: pending = int.from_bytes(data[full_word_count * 31 :], byteorder="big") cd.append(pending) else: cd.append(0) cd.append(pending_len) return cd @dataclass(slots=True) class EdDSA25519Signature: """ An EdDSA25519 signature with associated public key and message. """ Ry_twisted: int s: int Py_twisted: int msg: bytes def __eq__(self, other) -> bool: if not isinstance(other, EdDSA25519Signature): return NotImplemented return ( self.Ry_twisted == other.Ry_twisted and self.s == other.s and self.Py_twisted == other.Py_twisted and self.msg == other.msg ) def __hash__(self) -> int: return hash((self.Ry_twisted, self.s, self.Py_twisted, self.msg)) def __post_init__(self): assert 0 <= self.Ry_twisted < 2**256 assert 0 <= self.Py_twisted < 2**256 assert 0 <= self.s < 2**256 @property def curve_id(self) -> CurveID: return CurveID.ED25519 @property def curve(self) -> TwistedEdwardsCurve: return CURVES[CurveID.ED25519.value] @classmethod def from_json(cls, json): public_key_bytes = bytes.fromhex(json["public_key"]) message_bytes = bytes.fromhex(json["message"]) signature_bytes = bytes.fromhex(json["signature"]) assert len(public_key_bytes) == 32 assert len(signature_bytes) == 64 return cls( Ry_twisted=int.from_bytes(signature_bytes[:32], "little"), s=int.from_bytes(signature_bytes[32:64], "little"), Py_twisted=int.from_bytes(public_key_bytes, "little"), msg=message_bytes, ) def serialize(self, prepend_public_key: bool = True) -> list[int]: cd = [] if prepend_public_key: cd.extend(split_128(self.Py_twisted)) cd.extend(split_128(self.Ry_twisted)) cd.extend(split_128(self.s)) cd.append(len(self.msg)) cd.extend(list(self.msg)) return cd def xrecover(self, y: int) -> int: p = self.curve.p D = self.curve.d_twisted I = pow(2, (p - 1) // 4, p) xx = (y * y - 1) * pow(D * y * y + 1, -1, p) x = pow(xx, (p + 3) // 8, p) if (x * x - xx) % p != 0: x = (x * I) % p assert (x * x - xx) % p == 0 if x % 2 != 0: x = p - x return x def decode_point(self, compressed_point_le: int) -> G1Point: sign_bit, y_twisted = divmod(compressed_point_le, 2 ** (255)) x_twisted = self.xrecover(y_twisted) if x_twisted % 2 != sign_bit: x_twisted = self.curve.p - x_twisted x_weierstrass, y_weierstrass = self.curve.to_weierstrass(x_twisted, y_twisted) return G1Point(x_weierstrass, y_weierstrass, self.curve_id) @lru_cache(maxsize=None) def deserialize_R_A_h(self) -> tuple[G1Point, G1Point, int]: R = self.decode_point(self.Ry_twisted) A = self.decode_point(self.Py_twisted) preimage = ( self.Ry_twisted.to_bytes(32, "little") + self.Py_twisted.to_bytes(32, "little") + self.msg ) H_bytes = sha512(preimage).digest() H = int.from_bytes(H_bytes, "little") h = H % self.curve.n return R, A, h def is_valid(self) -> bool: s = self.s R, A, h = self.deserialize_R_A_h() G_neg = G1Point.get_nG(self.curve_id, -1) msm_result = G1Point.msm(points=[G_neg, A], scalars=[s, h]) should_be_inf = msm_result.add(R) if R.is_infinity() or A.is_infinity(): return False return should_be_inf.is_infinity() def serialize_with_hints( self, use_rust=False, as_str=False, prepend_public_key: bool = True ) -> list[int] | str: """Serialize the signature with hints for verification""" if use_rust: return garaga_rs.eddsa_calldata_builder( self.Ry_twisted, self.s, self.Py_twisted, self.msg, prepend_public_key, ) cd = self.serialize(prepend_public_key) R, A, h = self.deserialize_R_A_h() msm_calldata = garaga_rs.msm_calldata_builder( [ CURVES[self.curve_id.value].Gx, -CURVES[self.curve_id.value].Gy % self.curve.p, A.x, A.y, ], [self.s, h], self.curve_id.value, False, # include_points_and_scalars True, # serialize_as_pure_felt252_array ) cd.extend(msm_calldata) Rx_twisted, _ = self.curve.to_twistededwards(R.x, R.y) cd.extend(split_128(Rx_twisted)) # sqrt_Rx_hint Px_twisted, _ = self.curve.to_twistededwards(A.x, A.y) cd.extend(split_128(Px_twisted)) # sqrt_Px_hint if as_str: return "[{}]".format(", ".join(map(hex, cd))) return cd def __eq__(self, other) -> bool: if not isinstance(other, EdDSA25519Signature): return NotImplemented return ( self.Ry_twisted == other.Ry_twisted and self.s == other.s and self.Py_twisted == other.Py_twisted and self.msg == other.msg ) def __hash__(self) -> int: return hash((self.Ry_twisted, self.s, self.Py_twisted, self.msg)) if __name__ == "__main__": import json with open("tests/ed25519_test_vectors.json", "r") as f: test_vectors = json.load(f) for i, test_vector in enumerate(test_vectors): signature = EdDSA25519Signature.from_json(test_vector) assert signature.is_valid(), f"Signature {i} is invalid" ================================================ FILE: hydra/garaga/starknet/tests_and_calldata_generators/test_writer.py ================================================ import concurrent.futures import json import random import subprocess import time import garaga.modulo_circuit_structs as structs from garaga.curves import CURVES, CurveID, get_base_field from garaga.points import G1G2Pair, G1Point, G2Point from garaga.precompiled_circuits.multi_pairing_check import get_pairing_check_input from garaga.starknet.cli.utils import create_directory from garaga.starknet.tests_and_calldata_generators.mpcheck import MPCheckCalldataBuilder from garaga.starknet.tests_and_calldata_generators.msm import MSMCalldataBuilder from garaga.starknet.tests_and_calldata_generators.signatures import ( ECDSASignature, EdDSA25519Signature, RSA2048Signature, SchnorrSignature, ) TESTS_DIR = "src/src/tests/autogenerated" IGNORE_STR = "\n#[ignore] // Ignored for auto-benchmarks" def generate_pairing_test(curve_id, n_pairs, n_fixed_g2, include_m, seed): random.seed(seed) pairs, public_pair = get_pairing_check_input( curve_id=curve_id, n_pairs=n_pairs, include_m=include_m, return_pairs=True, ) builder = MPCheckCalldataBuilder( curve_id=curve_id, pairs=pairs, n_fixed_g2=n_fixed_g2, public_pair=public_pair, ) return builder.to_cairo_1_test() def generate_msm_test(curve_id, n_points, seed): random.seed(seed) builder = MSMCalldataBuilder( curve_id=curve_id, points=[G1Point.gen_random_point(curve_id) for _ in range(n_points)], scalars=[random.randint(0, CURVES[curve_id.value].n) for _ in range(n_points)], ) ignored = False if curve_id in [CurveID.SECP256K1, CurveID.SECP256R1] else True ignored = ignored or (False if n_points in [1, 2, 3] else True) return builder.to_cairo_1_test(ignored=ignored) def generate_msm_test_edge_cases(curve_id, n_points, seed): random.seed(seed) points = ( [G1Point.gen_random_point(curve_id) for _ in range(n_points - 1)] + [G1Point.infinity(curve_id)] + [G1Point.get_nG(curve_id, 1)] ) scalars = ( [0] + [random.randint(0, CURVES[curve_id.value].n) for _ in range(n_points - 1)] + [CURVES[curve_id.value].n - 1] ) builder = MSMCalldataBuilder(curve_id=curve_id, points=points, scalars=scalars) return builder.to_cairo_1_test( test_name=f"test_msm_{curve_id.name}_{n_points}P_edge_case", ignored=True ) def generate_tower_pairing_test(curve_id, n_pairs, seed): random.seed(seed) pairs: list[G1G2Pair] if n_pairs == 1: pairs = [ G1G2Pair( p=G1Point.get_nG(curve_id, 1), q=G2Point.get_nG(curve_id, 1), ) ] else: pairs, _ = get_pairing_check_input( curve_id=curve_id, n_pairs=n_pairs, return_pairs=True ) res = G1G2Pair.pair(pairs, curve_id) res = res.felt_coeffs e12t = structs.E12T(name="expected_result", elmts=res) i_s = list(range(n_pairs)) code = f""" #[test] fn test_tower_pairing_{curve_id.name}_{n_pairs}P() {{ let mut res:E12T = One::one(); """ for i, pair in enumerate(pairs): code += f""" {structs.G1PointCircuit.from_G1Point(f"p{i}", pair.p).serialize()} p{i}.assert_on_curve_excluding_infinity({curve_id.value}); {structs.G2PointCircuit.from_G2Point(f"q{i}", pair.q).serialize()} q{i}.assert_on_curve_excluding_infinity({curve_id.value}); let (tmp{i}) = miller_loop_{pair.p.curve_id.name.lower()}_tower(p{i}, q{i}); let (res) = run_{pair.p.curve_id.name.upper()}_E12T_MUL_circuit(tmp{i}, res);""" code += f""" let final = final_exp_{curve_id.name.lower()}_tower(res); assert_eq!(final, {e12t.serialize(raw=True)}); }} """ return code def generate_tower_final_exp_test(curve_id, seed): from garaga.hints.tower_backup import E12 random.seed(seed) field = get_base_field(curve_id) elmts = [field.random() for _ in range(12)] e12 = E12(elmts, curve_id.value) e12t = structs.E12T(name="input", elmts=elmts) expected = structs.E12T(name="expected", elmts=(e12.final_exp()).felt_coeffs) code = f""" #[test] fn test_tower_final_exp_{curve_id.name}() {{ {e12t.serialize()} let res = final_exp_{curve_id.name.lower()}_tower(input); assert_eq!(res, {expected.serialize(raw=True)}); }} """ return code def generate_schnorr_test(curve_id, seed): random.seed(seed) schnorr_sig: SchnorrSignature = SchnorrSignature.sample(curve_id) ignored = False if curve_id in [CurveID.SECP256K1] else True ignored_str = IGNORE_STR if ignored else "" code = f""" #[test]{ignored_str} fn test_schnorr_{curve_id.name}() {{ let mut sch_sig_with_hints_serialized = array!{schnorr_sig.serialize_with_hints(as_str=True)}.span(); let public_key = Serde::::deserialize(ref sch_sig_with_hints_serialized).expect('FailToDeserializePk'); let sch_with_hints = Serde::::deserialize(ref sch_sig_with_hints_serialized).expect('FailToDeserializeSig'); let is_valid = is_valid_schnorr_signature_assuming_hash(sch_with_hints, public_key, {curve_id.value}); assert!(is_valid); }} """ return code def generate_ecdsa_test(curve_id, seed): random.seed(seed) ecdsa_sig: ECDSASignature = ECDSASignature.sample(curve_id) ignored = False if curve_id in [CurveID.SECP256K1, CurveID.SECP256R1] else True ignored_str = IGNORE_STR if ignored else "" code = f""" #[test]{ignored_str} fn test_ecdsa_{curve_id.name}() {{ let mut ecdsa_sig_with_hints_serialized = array!{ecdsa_sig.serialize_with_hints(as_str=True)}.span(); let public_key = Serde::::deserialize(ref ecdsa_sig_with_hints_serialized).expect('FailToDeserializePk'); let ecdsa_with_hints = Serde::::deserialize(ref ecdsa_sig_with_hints_serialized).expect('FailToDeserializeSig'); let is_valid = is_valid_ecdsa_signature_assuming_hash(ecdsa_with_hints, public_key, {curve_id.value}); assert!(is_valid); }} """ return code def write_test_file( file_path: str, header: str, test_generators: list, curve_ids: list, **kwargs ): """Write a test file with the given header and test generators. Args: file_path: Path to write the test file header: Module header with imports test_generators: List of (generator_fn, params) tuples curve_ids: List of curve IDs to generate tests for **kwargs: Additional arguments passed to generators """ create_directory(TESTS_DIR) with open(f"{TESTS_DIR}/{file_path}", "w") as f: f.write(header) with concurrent.futures.ProcessPoolExecutor() as executor: futures = [] for gen_fn, params in test_generators: for curve_id in curve_ids: for param in params: futures.append( executor.submit( gen_fn, curve_id, *param, kwargs.get("seed", 0) ) ) results = [future.result() for future in futures] for result in results: f.write(result) f.write("\n") def get_tower_pairing_config(): """Configuration for tower pairing tests""" header = """ use garaga::single_pairing_tower::{ miller_loop_bls12_381_tower, miller_loop_bn254_tower, final_exp_bls12_381_tower, final_exp_bn254_tower, }; use core::num::traits::One; use garaga::definitions::{u384, G1Point, G2Point, E12T}; use garaga::ec_ops::{G1PointImpl}; use garaga::ec_ops_g2::{G2PointImpl}; use garaga::circuits::tower_circuits::{ run_BN254_E12T_MUL_circuit, run_BLS12_381_E12T_MUL_circuit }; """ test_generators = [ (generate_tower_pairing_test, [(n,) for n in [1, 2, 3]]), (generate_tower_final_exp_test, [()]), ] curve_ids = [CurveID.BN254, CurveID.BLS12_381] return "tower_pairing_tests.cairo", header, test_generators, curve_ids def get_pairing_config(): """Configuration for pairing tests""" header = """ use garaga::pairing_check::{ multi_pairing_check_bn254_2P_2F, multi_pairing_check_bls12_381_2P_2F, MPCheckHintBN254, MPCheckHintBLS12_381, }; use garaga::definitions::{u288, u384, G1Point, G2Point, G2Line, E12D,G1G2Pair, MillerLoopResultScalingFactor}; use garaga::groth16::{ multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result, multi_pairing_check_bls12_381_3P_2F_with_extra_miller_loop_result, }; """ params = [(2, 2, False), (3, 2, True)] test_generators = [(generate_pairing_test, params)] curve_ids = [CurveID.BN254, CurveID.BLS12_381] return "pairing_tests.cairo", header, test_generators, curve_ids def get_msm_config(): """Configuration for MSM tests""" header = """ use garaga::ec_ops::msm_g1; use garaga::definitions::{G1Point, u384}; use garaga::core::circuit::u288IntoCircuitInputValue; """ msm_sizes = [1, 2, 3, 4, 10, 11, 12] edge_cases = [1, 2, 3] test_generators = [ (generate_msm_test, [(n,) for n in msm_sizes]), (generate_msm_test_edge_cases, [(n,) for n in edge_cases]), ] curve_ids = [ CurveID.BN254, CurveID.BLS12_381, CurveID.SECP256R1, CurveID.SECP256K1, CurveID.ED25519, CurveID.GRUMPKIN, ] return "msm_tests.cairo", header, test_generators, curve_ids def get_schnorr_config(): """Configuration for Schnorr signature tests""" header = """ use garaga::definitions::G1Point; use garaga::signatures::schnorr::{ SchnorrSignatureWithHint, is_valid_schnorr_signature_assuming_hash, }; use garaga::core::circuit::u288IntoCircuitInputValue; """ test_generators = [(generate_schnorr_test, [()])] curve_ids = [ CurveID.BN254, CurveID.BLS12_381, CurveID.SECP256R1, CurveID.SECP256K1, CurveID.ED25519, CurveID.GRUMPKIN, ] return "schnorr_tests.cairo", header, test_generators, curve_ids def get_ecdsa_config(): """Configuration for ECDSA signature tests""" header = """ use garaga::definitions::G1Point; use garaga::signatures::ecdsa::{ ECDSASignatureWithHint, is_valid_ecdsa_signature_assuming_hash, }; use garaga::core::circuit::u288IntoCircuitInputValue; """ test_generators = [(generate_ecdsa_test, [()])] curve_ids = [ CurveID.BN254, CurveID.BLS12_381, CurveID.SECP256R1, CurveID.SECP256K1, CurveID.ED25519, CurveID.GRUMPKIN, ] return "ecdsa_tests.cairo", header, test_generators, curve_ids def generate_eddsa_test(sig: EdDSA25519Signature, test_index: int) -> str: assert sig.is_valid() msg_bytes_len = len(sig.msg) ignored = False if msg_bytes_len in [0, 32, 64] else True ignored_str = IGNORE_STR if ignored else "" code = f""" #[test]{ignored_str} fn test_eddsa_{test_index}_{msg_bytes_len}B() {{ let mut eddsa_sig_with_hints_serialized = array!{sig.serialize_with_hints(as_str=True)}.span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized).expect('FailToDeserializePk'); let eddsa_with_hints = Serde::::deserialize(ref eddsa_sig_with_hints_serialized).expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); }} """ return code def generate_test(index, vector): signature = EdDSA25519Signature.from_json(vector) return generate_eddsa_test(signature, index) def generate_eddsa_test_file() -> str: """Configuration for EDDSA signature tests""" code = """ use garaga::signatures::eddsa_25519::{ EdDSASignatureWithHint, is_valid_eddsa_signature, }; """ with open("tests/ed25519_test_vectors.json", "r") as f: test_vectors = json.load(f) test_vectors = test_vectors[0:66:2] with concurrent.futures.ProcessPoolExecutor() as executor: futures = { executor.submit(generate_test, i, vec): i for i, vec in enumerate(test_vectors) } results = [None] * len(test_vectors) for future in concurrent.futures.as_completed(futures): index = futures[future] results[index] = future.result() for result in results: code += result return code def generate_rsa_test( signature: RSA2048Signature, seed: int, suffix: str, should_be_valid: bool ) -> str: assertion = "assert!(is_valid);" if should_be_valid else "assert!(!is_valid);" return f""" #[test] fn test_rsa2048_{suffix}_seed_{seed}() {{ let mut rsa_sig_with_hints_serialized = array!{signature.serialize_with_hints(as_str=True)}.span(); let public_key = Serde::::deserialize(ref rsa_sig_with_hints_serialized).expect('FailToDeserializePk'); let rsa_with_hints = Serde::::deserialize(ref rsa_sig_with_hints_serialized).expect('FailToDeserializeSig'); let is_valid = is_valid_rsa2048_signature_assuming_encoded_message(@rsa_with_hints, @public_key); {assertion} }} """ def generate_rsa_tests(seed: int) -> str: fixtures = [ (RSA2048Signature.sample(seed=seed), "positive", True), ( RSA2048Signature.tampered_expected_message_sample(seed=seed), "tampered_message", False, ), ( RSA2048Signature.tampered_limb_sample(seed=seed), "tampered_limb", False, ), ] code = "" for signature, suffix, should_be_valid in fixtures: code += generate_rsa_test( signature=signature, seed=seed, suffix=suffix, should_be_valid=should_be_valid, ) return code def generate_rsa_sha256_test( signature: "RSA2048Signature", message: bytes, seed: int, suffix: str, ) -> str: calldata_str = signature.serialize_sha256_with_hints( message=message, as_str=True, prepend_public_key=True ) return f""" #[test] fn test_rsa2048_sha256_{suffix}_seed_{seed}() {{ let mut rsa_sha256_serialized = array!{calldata_str}.span(); let public_key = Serde::::deserialize(ref rsa_sha256_serialized).expect('FailToDeserializePk'); let rsa_with_hints = Serde::::deserialize(ref rsa_sha256_serialized).expect('FailToDeserializeSig'); let message = Serde::::deserialize(ref rsa_sha256_serialized).expect('FailToDeserializeMsg'); let is_valid = is_valid_rsa2048_sha256_signature(@rsa_with_hints, @public_key, @message); assert!(is_valid); }} """ def generate_rsa_sha256_tests(seed: int) -> str: message = b"hello garaga" sig = RSA2048Signature.from_sha256_message(message, seed=seed) return generate_rsa_sha256_test(sig, message, seed, "positive") def generate_rsa_test_file() -> str: code = """ use core::serde::Serde; use garaga::signatures::rsa::{ RSA2048PublicKey, RSA2048SignatureWithHint, is_valid_rsa2048_signature_assuming_encoded_message, is_valid_rsa2048_sha256_signature, }; """ code += generate_rsa_tests(seed=0) code += generate_rsa_sha256_tests(seed=0) return code def write_all_tests(): """Generate all test files""" random.seed(0) # Generate each test file for config_fn in [ get_tower_pairing_config, get_pairing_config, get_msm_config, get_schnorr_config, get_ecdsa_config, ]: file_path, header, test_generators, curve_ids = config_fn() write_test_file(file_path, header, test_generators, curve_ids, seed=0) with open("src/src/tests/autogenerated/eddsa_tests.cairo", "w") as f: f.write(generate_eddsa_test_file()) with open("src/src/tests/autogenerated/rsa_tests.cairo", "w") as f: f.write(generate_rsa_test_file()) subprocess.run(["scarb", "fmt", f"{TESTS_DIR}"], check=True) if __name__ == "__main__": import time start = time.time() write_all_tests() end = time.time() print(f"Time taken to write all tests: {end - start} seconds") ================================================ FILE: pyproject.toml ================================================ [build-system] requires = ["maturin>=1.7,<2.0"] build-backend = "maturin" [project] name = "garaga" version = "1.1.0" requires-python = ">=3.10,<3.15" dependencies = [ "fastecdsa>=3.0.0", "sympy", "typer", "python-dotenv", "starknet-py-unbroken==0.29.0rc3", "requests", "filelock", ] description = "State-of-the-art Elliptic Curve operations and SNARKS verification for Cairo & Starknet 🐺." readme = "docs/PYPI_README.md" license = { text = "MIT" } authors = [ { name = "feltroidprime" }, { name = "Keep Starknet Strange Contributors" }, ] keywords = [ "elliptic-curves", "pairing", "zero-knowledge", "zk-snarks", "zero-knowledge-proofs", "zkp", "elliptic-curve-cryptography", "starks", "snarks", "cairo-lang", "starknet", "cryptography", "blockchain", ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Security :: Cryptography", "Topic :: Scientific/Engineering :: Mathematics", "Topic :: Software Development :: Libraries :: Python Modules", "Operating System :: OS Independent", ] [project.urls] Homepage = "https://github.com/keep-starknet-strange/garaga" Repository = "https://github.com/keep-starknet-strange/garaga" Documentation = "https://garaga.gitbook.io/" "Bug Reports" = "https://github.com/keep-starknet-strange/garaga/issues" "Source Code" = "https://github.com/keep-starknet-strange/garaga" [project.optional-dependencies] dev = [ "maturin", "pytest", "pytest-asyncio", "pytest-xdist", "black>=26.3.1", "pre-commit", "inquirer", "pandas", "tabulate", "hypothesis", "rich", ] [project.scripts] garaga = "garaga.starknet.cli.starknet_cli:app" [tool.maturin] features = ["pyo3/extension-module"] manifest-path = "tools/garaga_rs/Cargo.toml" # configures rust package as a module under garaga module-name = "garaga.garaga_rs" # python source root must be under / python-source = "hydra" [tool.uv] # Override ecdsa pinned by crypto-cpp-py to fix high-severity security vulnerability override-dependencies = ["ecdsa>=0.19.0"] [tool.isort] profile = "black" [tool.pytest.ini_options] cache_dir = ".cargo/.pytest_cache" testpaths = ["tests/hydra"] # addopts = "--tb=short --showlocals" asyncio_default_fixture_loop_scope = "function" # Explicitly set the loop scope [tool.black] line-length = 88 target-version = ['py310', 'py311', 'py312', 'py313'] include = '\.pyi?$' extend-exclude = ''' /( # directories \.eggs | \.git | \.hg | \.mypy_cache | \.tox | \.venv | \venv | build | dist )/ ''' ================================================ FILE: src/.tool-versions ================================================ scarb 2.16.1 starknet-foundry 0.57.0 ================================================ FILE: src/Scarb.toml ================================================ [package] name = "garaga" version = "1.1.0" edition = "2024_07" licence = "MIT" keywords = [ "zk", "snarks", "curve", "pairing", "groth16", "plonk", "bls", "elliptic", "signature", ] description = "State-of-the-art Elliptic Curve operations and SNARKS verification for Cairo & Starknet" readme = "../README.md" repository = "https://github.com/keep-starknet-strange/garaga" authors = ["feltroidprime", "Keep Starknet Strange Contributors"] documentation = "https://garaga.gitbook.io/garaga/" # See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest.html [features] full = [] [dependencies] corelib_imports = { path = "corelib_imports", version = "0.1.3" } starknet = "2.16.1" [dev-dependencies] snforge_std = "0.57.0" assert_macros = "2.16.1" #cairo_test = "2.16.1" cairo_execute = "2.16.1" [scripts] test = "snforge test -p garaga --include-ignored" ================================================ FILE: src/contracts/autogenerated/groth16_example_bls12_381/.tool-versions ================================================ scarb 2.16.1 starknet-foundry 0.57.0 ================================================ FILE: src/contracts/autogenerated/groth16_example_bls12_381/Scarb.toml ================================================ # Generated by Garaga version 1.1.0 [package] name = "groth16_example_bls12_381" version = "0.1.0" edition = "2024_07" [dependencies] garaga = { path = "../../../" } starknet = "2.16.1" [cairo] sierra-replace-ids = false inlining-strategy = 2 [dev-dependencies] snforge_std = "0.57.0" assert_macros = "2.16.1" [[target.starknet-contract]] casm = true casm-add-pythonic-hints = true ================================================ FILE: src/contracts/autogenerated/groth16_example_bls12_381/src/groth16_verifier.cairo ================================================ // Generated by Garaga version 1.1.0 use super::groth16_verifier_constants::{N_PUBLIC_INPUTS, ic, precomputed_lines, vk}; #[starknet::interface] pub trait IGroth16VerifierBLS12_381 { fn verify_groth16_proof_bls12_381( self: @TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; } #[starknet::contract] mod Groth16VerifierBLS12_381 { use garaga::definitions::{G1G2Pair, G1Point}; use garaga::ec_ops::{G1PointTrait, ec_safe_add}; use garaga::groth16::{ Groth16ProofRawTrait, multi_pairing_check_bls12_381_3P_2F_with_extra_miller_loop_result, }; use garaga::utils::calldata::deserialize_full_proof_with_hints_bls12_381; use starknet::SyscallResultTrait; use super::{N_PUBLIC_INPUTS, ic, precomputed_lines, vk}; const ECIP_OPS_CLASS_HASH: felt252 = 0x396d5915ecf475aab117bb25a0272b261e9e25ffe1c0ce05a51a3f77489c89e; #[storage] struct Storage {} #[abi(embed_v0)] impl IGroth16VerifierBLS12_381 of super::IGroth16VerifierBLS12_381 { fn verify_groth16_proof_bls12_381( self: @ContractState, full_proof_with_hints: Span, ) -> Result, felt252> { // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok(public_inputs) if the proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given // a proof and a verifying key. let fph = deserialize_full_proof_with_hints_bls12_381(full_proof_with_hints); let groth16_proof = fph.groth16_proof; let mpcheck_hint = fph.mpcheck_hint; let msm_hint = fph.msm_hint; groth16_proof.raw.check_proof_points(1); let ic = ic.span(); let vk_x: G1Point = match ic.len() { 0 => panic!("Malformed VK"), 1 => *ic.at(0), _ => { // Start serialization with the hint array directly to avoid copying it. let mut msm_calldata: Array = array![]; // Add the points from VK and public inputs to the proof. Serde::serialize(@ic.slice(1, N_PUBLIC_INPUTS), ref msm_calldata); Serde::serialize(@groth16_proof.public_inputs, ref msm_calldata); // Complete with the curve indentifier (1 for BLS12_381): msm_calldata.append(1); // Add the hint array. for x in msm_hint { msm_calldata.append(*x); } // Call the multi scalar multiplication endpoint on the Garaga ECIP ops contract // to obtain vk_x. let mut _vx_x_serialized = starknet::syscalls::library_call_syscall( ECIP_OPS_CLASS_HASH.try_into().unwrap(), selector!("msm_g1"), msm_calldata.span(), ) .unwrap_syscall(); ec_safe_add( Serde::::deserialize(ref _vx_x_serialized).unwrap(), *ic.at(0), 1, ) }, }; // Perform the pairing check. let check = multi_pairing_check_bls12_381_3P_2F_with_extra_miller_loop_result( G1G2Pair { p: vk_x, q: vk.gamma_g2 }, G1G2Pair { p: groth16_proof.raw.c, q: vk.delta_g2 }, G1G2Pair { p: groth16_proof.raw.a.negate(1), q: groth16_proof.raw.b }, vk.alpha_beta_miller_loop_result, precomputed_lines.span(), mpcheck_hint, ); match check { Result::Ok(_) => Result::Ok(groth16_proof.public_inputs), Result::Err(error) => Result::Err(error), } } } } ================================================ FILE: src/contracts/autogenerated/groth16_example_bls12_381/src/groth16_verifier_constants.cairo ================================================ // Generated by Garaga version 1.1.0 use garaga::definitions::{E12D, G1Point, G2Line, G2Point, u384}; use garaga::groth16::Groth16VerifyingKey; pub const N_PUBLIC_INPUTS: usize = 1; pub const vk: Groth16VerifyingKey = Groth16VerifyingKey { alpha_beta_miller_loop_result: E12D { w0: u384 { limb0: 0x90d1a47263d9c179e9d6bab3, limb1: 0xc8f52b7ac4908e42515e61a6, limb2: 0x85c60896512fc21fc50ce238, limb3: 0x15bb2157a1b9aab29d66c644, }, w1: u384 { limb0: 0xb3e77acb0d776ee38973b578, limb1: 0x7290c49d0303a7a719325387, limb2: 0x3104f09f1439bbd9b6e47310, limb3: 0x1794c7df23dbcfd21f7c96f5, }, w2: u384 { limb0: 0xd0ccdf6e1de037c5f25dbd53, limb1: 0x254a0c8d3849192e33a21665, limb2: 0xcc0375e474dc85925319c5ad, limb3: 0x59163bc09c3bb5cd5864b34, }, w3: u384 { limb0: 0x42951c5be1c30dd1f90a8da3, limb1: 0xffa3bb5d4cc66b3c5c927fe8, limb2: 0xb2bef79be9fc2df478672961, limb3: 0x13b08e1d6ece19818bc96ea9, }, w4: u384 { limb0: 0x93fd3339f961a2b9c29235bc, limb1: 0xf9bbad7b2c116dfe3ed68c7a, limb2: 0xbd2f1d7614ffe6107af3312d, limb3: 0x565882562afe825ad18d630, }, w5: u384 { limb0: 0xf8e9d91fd573068e500fe8cb, limb1: 0xc02aff1aead5aafc095b5d00, limb2: 0xd46507dd50d8e1e3519eab6d, limb3: 0x13644a50e3d92f7cb2062999, }, w6: u384 { limb0: 0x79f2b3fe166cf2dd0d2edd42, limb1: 0xee1d6de706ac7841d7ad70d1, limb2: 0x8eab5234da247c344e074188, limb3: 0x11a6213d5e5c30e24cbf89bc, }, w7: u384 { limb0: 0x2ce3e653f58dd851f1b19549, limb1: 0x4718d317cb6aa672d98ec0d0, limb2: 0x9ba7f0c53686e01b4ad95d5, limb3: 0x675ea9600256572394eb514, }, w8: u384 { limb0: 0x23db0a4c6695a271a863a4d0, limb1: 0xd6db4129528086db9190b64e, limb2: 0xd130bf6380241b158fecfd71, limb3: 0xa849cb6abd26359866b2ec8, }, w9: u384 { limb0: 0x60b534cf939afce26ebdf812, limb1: 0x8c24d81eb0180ec2a6cf0f34, limb2: 0x82a57803b293e76911f92c72, limb3: 0xc18dabb70953283ac0831cb, }, w10: u384 { limb0: 0xf4e4997640a0e73c8ced7b36, limb1: 0x81b60a120c6ac55184b13431, limb2: 0x12a9b15b12fddd8e7a1c3fa3, limb3: 0x6b3db04d04875ece12b9ff5, }, w11: u384 { limb0: 0x12e51658ef6c7052999e66af, limb1: 0x9549543304b8f59e1248a434, limb2: 0x52afd8a6dd047073d383da00, limb3: 0x4ded7b056b1316dac6713a6, }, }, gamma_g2: G2Point { x0: u384 { limb0: 0xaa65cdf007aef54c6f623dde, limb1: 0x221d9fa6582f8ab41f299a1d, limb2: 0xc274f8bcf99c710a010e41a0, limb3: 0xdd0d7c6d60ac00708ff7db2, }, x1: u384 { limb0: 0x734de87c275c5ff8648ec130, limb1: 0xee8326798aab2bfea23775cc, limb2: 0x451384c060e8865aff71dbef, limb3: 0x604b708bc781ae38a361b93, }, y0: u384 { limb0: 0xa6a2e609a74c6461dbb15b12, limb1: 0x1b15cfdecac55c2f6881eaa3, limb2: 0x1c77b46d0593da85473e42c4, limb3: 0x1541ecff208d5a5cd2d55296, }, y1: u384 { limb0: 0x699092f65f774234b7f31840, limb1: 0x4c6c5689af7c6b120e3ab986, limb2: 0x6b8b64d4ead6109ba5c739e4, limb3: 0x108c95049535bcd1117cdbdf, }, }, delta_g2: G2Point { x0: u384 { limb0: 0x6295df8b9ffbb9f638117fb4, limb1: 0xd83ce7d5ca555ae1cc54e530, limb2: 0xd0b71d6edfa740f665e34c84, limb3: 0x18b219a74108de96a9519a60, }, x1: u384 { limb0: 0x7e3c781dba158e67256dc98e, limb1: 0xa144ffba7defff7d45169d6f, limb2: 0x5f5d374324ad0e72809aeed, limb3: 0xe3e7a8c90ba5b5e266fea71, }, y0: u384 { limb0: 0x4573d43941a95edd7fc0b3c, limb1: 0xa5afe44806a147a2c04a80ae, limb2: 0x446f45ca171a1edf9abe76b8, limb3: 0x11b12761f310cbe4ba3e1ded, }, y1: u384 { limb0: 0x1af32f6be0d4fbaaa3a16480, limb1: 0x8a1e0e97cea1801e094fdc7, limb2: 0x12fe3d86972bfca288dc7d9b, limb3: 0x11ece09d0b6f1a1ea16238a5, }, }, }; pub const ic: [G1Point; 2] = [ G1Point { x: u384 { limb0: 0xaea925952b1d5dcc848e1107, limb1: 0x1d3926283f7823c830469f8d, limb2: 0x855a100cf099f5733048337, limb3: 0x126fbe91d07c71cd11847edc, }, y: u384 { limb0: 0xdffe1c953fd7a62db3ea0f7d, limb1: 0xe81081ed3027415c05028dc0, limb2: 0x8382ca23441bb4a34775829b, limb3: 0x11d4302c0095dfb2bcb31a44, }, }, G1Point { x: u384 { limb0: 0x46c87cd685c7c1d6fdcd1e9b, limb1: 0x2f62c85bb229d8c136b83c08, limb2: 0x5447e4279f17852eabd158fa, limb3: 0x17eb504b7c7c4fcec2570d70, }, y: u384 { limb0: 0x1af88a58b9173f40990d461d, limb1: 0xed8dc9e752c0f5ec50f0bf39, limb2: 0x620cad3e73faf12d0844d15f, limb3: 0x682ec2d49889aa39ae6f079, }, }, ]; pub const precomputed_lines: [G2Line; 136] = [ G2Line { r0a0: u384 { limb0: 0x306be1de1b04d2624e640455, limb1: 0xf2a2185fd41fca781bc97f37, limb2: 0x61bc1a3296c8468ccbfd0f00, limb3: 0xe34ab79b1474233817e576e, }, r0a1: u384 { limb0: 0xb2d501153392bd8774a608d8, limb1: 0x8bf8261f30c2770732ec1803, limb2: 0x54badbe21461d0daf83afabe, limb3: 0xf07ba4034e02ff1891990ed, }, r1a0: u384 { limb0: 0x32ea0796aef63117c6e0e6a1, limb1: 0xa45dad1f58021d08480cc168, limb2: 0xccdc578cc13456d86cd47734, limb3: 0xfd13ef0a99a6b73d52ca7b9, }, r1a1: u384 { limb0: 0xb3a2e4a310abfbef796714, limb1: 0xa555ba99515a0a5e2d59908c, limb2: 0x165b6bdd81d359126278cb48, limb3: 0xb4aa52b7c5b272cbf4fc038, }, }, G2Line { r0a0: u384 { limb0: 0x1b91ee6736aeabe4b5e40ccb, limb1: 0xd1e0bdffe69e623fa4977b7e, limb2: 0x3a38a366dca6ed3ac394edae, limb3: 0x17d86f3a6eadac41e32f85b, }, r0a1: u384 { limb0: 0x85526a142f1b602083c8d0e9, limb1: 0x9de43cde6d77997ea6be8502, limb2: 0x26f9e86d04c4567b4ce35680, limb3: 0x1426d177654bf0d7517048d4, }, r1a0: u384 { limb0: 0x47561557466bbd16edc89e91, limb1: 0xa569496f4dc6bd96e4917912, limb2: 0x8b21592e524eb1bc65bda550, limb3: 0x167eed299c6bd0497e52cbb8, }, r1a1: u384 { limb0: 0xa40e65e562f01cc7e697d44e, limb1: 0xf7e3075bffcb46efc4c7de85, limb2: 0x4837f7e7cd36e2ed7747ed42, limb3: 0x1401c25696479939c853129, }, }, G2Line { r0a0: u384 { limb0: 0xcf09df55ea243c0b5d27ea95, limb1: 0xa5c3c859310e651108ba35f9, limb2: 0xe22d5367257f2b7b07101881, limb3: 0x146fecb4aca9ed26211e6a1c, }, r0a1: u384 { limb0: 0xfb9b1aa00ba2314b499e9ad2, limb1: 0x25885d4aae86a2ee87249374, limb2: 0xebecd6bf5c617aba6840aa01, limb3: 0x463f1553e899e2adf4279f9, }, r1a0: u384 { limb0: 0x1aa0f311fb5027f4834da079, limb1: 0x7b26ff99d902997df1825c8c, limb2: 0xebc6228c9418dc5eebbf53b1, limb3: 0xe10e27eb7e14d9257ef5dc5, }, r1a1: u384 { limb0: 0xc89a8f1c1c6ae8707f8fa8fc, limb1: 0xb45e86fe1c988a090beb870d, limb2: 0x9b645529fd4c880478be7051, limb3: 0x173c6c7f6fa56c3d1f1961b3, }, }, G2Line { r0a0: u384 { limb0: 0xb58b9ab9d1892dd4c5543b36, limb1: 0xe3c36bb4c20608a534fd590b, limb2: 0xed0ee74781e598434a0b96ab, limb3: 0x6b2aa02643ac8ef76d9b262, }, r0a1: u384 { limb0: 0x3a1fbee97340bbd138b8ebb4, limb1: 0xfc724611032db25419c64333, limb2: 0x7b496eddcf55a6c83d880e5b, limb3: 0xdd344cd4cc6c1be8929497a, }, r1a0: u384 { limb0: 0xef38cfa96ccac703a2060cc1, limb1: 0x2f8106247ed8427f6104427, limb2: 0xa2e886264a53734039a28245, limb3: 0xfd9424926115c1f549c9fe6, }, r1a1: u384 { limb0: 0xef853c4c4bccb3964c46149c, limb1: 0x739746bb23813b366d6900e, limb2: 0xd46eb42d09315fa477d9661, limb3: 0x960e39d1824fac5873f1b4b, }, }, G2Line { r0a0: u384 { limb0: 0xd97632f4635a33f78fe45df, limb1: 0xfbd9de73e894c9578b619e6f, limb2: 0x8e3e139782eddc798cfe1cba, limb3: 0x101554d44cb1579300498f0b, }, r0a1: u384 { limb0: 0xe6071e81b13c82607e1504cd, limb1: 0xc90c09fd9d0de2ae2e3b1c7d, limb2: 0xf07085d896ccf916cd0d6c32, limb3: 0x17aa6a97d1dfda923c027163, }, r1a0: u384 { limb0: 0x6442e11f77c962ca849d5ace, limb1: 0x3a02be748e349014afa5ee2b, limb2: 0x870d78ab0321516019929135, limb3: 0xfc7e0bf5ac4481abd4e87c4, }, r1a1: u384 { limb0: 0xbe9a9a875effb23de3d91dd7, limb1: 0x1934ec3159b26c5ff788b5fb, limb2: 0xc82ebc003a434e6082ae9773, limb3: 0xf843e21d950713837ba992e, }, }, G2Line { r0a0: u384 { limb0: 0x28c8425627ed65eb0939cdb4, limb1: 0xc3c6c683bb2f36b229a6067e, limb2: 0x72b2a1af6f1ffa9a7b76ac8, limb3: 0x1812bffcffe098c2f8a4d03a, }, r0a1: u384 { limb0: 0x2f789c72473e628e0daf2579, limb1: 0x43800ef9d613d6c1609105a9, limb2: 0x4a05e73291a8d7f3a6057209, limb3: 0x73a3adbbd19a0c5629c438c, }, r1a0: u384 { limb0: 0xa0991371dae811f65097016e, limb1: 0xa1d3e86721ce69bdd7b30b45, limb2: 0x47f1ab9108f30cc37319c5ec, limb3: 0xd3ac356c647bbe338b60eae, }, r1a1: u384 { limb0: 0x4dc00392cc0f98e602f32889, limb1: 0xe9f026915132182309858a36, limb2: 0xcb6091656a55b6d8dc590657, limb3: 0xdad58900f4739152bbeb372, }, }, G2Line { r0a0: u384 { limb0: 0xa0f3631679cfbb9b21ad0462, limb1: 0x6ee7debde007b92b4b149c44, limb2: 0x55a3e394518675f2e31137b5, limb3: 0xd8a826fe9113b560da09907, }, r0a1: u384 { limb0: 0xed78588c893ceaa0f514558b, limb1: 0x79d83cf3b7023296ec92ba14, limb2: 0x9735f438b5a71d40b70bb0fa, limb3: 0x15aef525c47e22ae57a7f8d5, }, r1a0: u384 { limb0: 0x84b45245e65ce740caff5e5b, limb1: 0xf67e131fa36599b6f341f185, limb2: 0x8788300d6901775782a0560a, limb3: 0x77d9a7e661fdfc46bcf0a96, }, r1a1: u384 { limb0: 0xf1c657418092ff3af9268ad, limb1: 0xfd859ddd59729868785858bf, limb2: 0x74b030a37e9b5229e33eea35, limb3: 0x2ed25e75eafc63b15c99cd8, }, }, G2Line { r0a0: u384 { limb0: 0x828e9d39e6c3882e1c541094, limb1: 0x3e866024d8c0d4511c1d7b04, limb2: 0x82f82c8987fbcd90a7db524e, limb3: 0x115162baf491d6d2c3bb4408, }, r0a1: u384 { limb0: 0x73e00500dbadcb8f72a61794, limb1: 0x2b083cc45cb9b982df2826bb, limb2: 0x38a8b3bfefd4f705093941c9, limb3: 0x1764d08b2b3f48e67da5fca7, }, r1a0: u384 { limb0: 0xb15b36df44312bd1bc6b43c0, limb1: 0x17d11b4de6c29aaee53b828, limb2: 0x4707b434920922fd8726a2ed, limb3: 0x13aab19628ca9aaf0a115e66, }, r1a1: u384 { limb0: 0x45545ee3518b4ad82e08a2e4, limb1: 0x545d12ab8020b0d72105759, limb2: 0x8a1520604f4038d8cfd87db4, limb3: 0x13302bc366771eb73d10200f, }, }, G2Line { r0a0: u384 { limb0: 0x26347d93bfe0c7376637de2a, limb1: 0xa7b2d922d944d44736d75046, limb2: 0x96a8d04f3e2c39be23f934ba, limb3: 0xf68430cc06e72e8cba83abb, }, r0a1: u384 { limb0: 0xd00debef89a0244b8645b45d, limb1: 0xb820cb845456918f3639b0bb, limb2: 0xa32e6daab9f6beb0252d81c3, limb3: 0x138d591ae6b61a704bbcd8d8, }, r1a0: u384 { limb0: 0xdc637c11d0dbeaf0a39536cc, limb1: 0x9660f9ee2827e0e6402067bf, limb2: 0xd91e4cc7d47e0fd9713272d9, limb3: 0x10137873532e35eeec88970d, }, r1a1: u384 { limb0: 0xfcf221d220a35af03650e72d, limb1: 0x616ae54c91ce47ca60763953, limb2: 0xe626d0064ab09e7302b5be30, limb3: 0x1816ead2f891bd024c2985cb, }, }, G2Line { r0a0: u384 { limb0: 0xfb87ceb75ed615c4c057d678, limb1: 0x6582cbf9525b9cefe7b9e804, limb2: 0x4f37e42b8dc3a2ee249e6e37, limb3: 0xf4741cab21cf2769050b0fa, }, r0a1: u384 { limb0: 0x924844c33852d2e23cac984a, limb1: 0xbc556fa45dd32211de3922f9, limb2: 0xb8366a587addf71a58498b14, limb3: 0x13ea637b846fbb373c8f4611, }, r1a0: u384 { limb0: 0xefa45f0548590ffceb314941, limb1: 0xbf9b204a890c30857ba60551, limb2: 0xbdd3f88bd124ac7e0f0af016, limb3: 0x8e95429352e72aba5211967, }, r1a1: u384 { limb0: 0xf8c98157528a959ccac7cc4, limb1: 0x687cb79cd5a81fac75001ca4, limb2: 0x6b68eabcdc9b0ad00d66e086, limb3: 0x140f2cace6f7cab25c97103e, }, }, G2Line { r0a0: u384 { limb0: 0xe7afbce45921cd7b77242135, limb1: 0x5718bd5dc545444c6b641c19, limb2: 0xf512a03bbea424d2672a39a3, limb3: 0x8e393e621680c17993f7bae, }, r0a1: u384 { limb0: 0x8ff19c6a2f49a711cf0739f9, limb1: 0xc3af1820b15abe02eca2754, limb2: 0x53766b612388a245d2d63ffe, limb3: 0x381016961e0f7db87f0cce8, }, r1a0: u384 { limb0: 0x4dda60bd25e6e1347768724b, limb1: 0x1d241291d2da9e52a786e440, limb2: 0xb10bcb7cb6ea42c8a80fa259, limb3: 0x140182d624ca9103b00a1042, }, r1a1: u384 { limb0: 0xc434a31edad1a2430d152c8d, limb1: 0x7bbb7dbdcb98092bfc57c45b, limb2: 0xe5bfd09fb89c9cb9fc2930e8, limb3: 0x149d591ee71b32836829acc5, }, }, G2Line { r0a0: u384 { limb0: 0x6f857b2f9dbf0171c195a52d, limb1: 0x5813a24021c2b05113dd4a96, limb2: 0x2aff27dce98b343fd0f793de, limb3: 0xf2e0145a43aeae640b6969d, }, r0a1: u384 { limb0: 0x29ced55c68a2802ce2609172, limb1: 0x6338f9b36d931b4d67932b9b, limb2: 0x66025aa8eb27d423c0b5bfec, limb3: 0x14fe5e46686326e1f055306, }, r1a0: u384 { limb0: 0xeb52118df562a61042721eca, limb1: 0xee5bdf330b411779cc2881e5, limb2: 0x8fc6336a288b05900b65ae97, limb3: 0x517b226c178ce7caa260f92, }, r1a1: u384 { limb0: 0xe7e7b8db4db2afd3d18383fc, limb1: 0x82b7a186d747be7f434c662, limb2: 0x2a775ab75e722fd93a4da97, limb3: 0xe496d7813827c9e5ffe551c, }, }, G2Line { r0a0: u384 { limb0: 0x627028a8bdee6000c0d845f6, limb1: 0xc9f98f9c37170503138c263e, limb2: 0x49fbcbcd10639a6d007e5879, limb3: 0x131a7572031e8ed7a863b371, }, r0a1: u384 { limb0: 0x7b5f18c205ca348475db5437, limb1: 0x16ca76de607e8ea438b21550, limb2: 0x35c5f60e8c2bd63e2a90fb2c, limb3: 0x13bb76670abc068e45d475c0, }, r1a0: u384 { limb0: 0x239305338201c7b0d260e948, limb1: 0x4cfc220680324a3e5e1fe68d, limb2: 0xb5b8357d92c82b48c50ab1b0, limb3: 0xba4a4c1f10015ff907735c2, }, r1a1: u384 { limb0: 0x5c84bbc1fcf0837749364732, limb1: 0xc66eb6ada5392af863d295b3, limb2: 0x3fca6067b750d18086f41345, limb3: 0x13fbb0a0f6400bfdad8a7193, }, }, G2Line { r0a0: u384 { limb0: 0x249c31d39a8ff1d65e22a789, limb1: 0x6f16f7224fa34e79712f9ff7, limb2: 0x9300f2ba5e2772169f274b95, limb3: 0x150c43a0d3e436e65b20a4be, }, r0a1: u384 { limb0: 0xe3dfcea0f7070a52acf2f549, limb1: 0x4c4b0f06dc150efc46e57fe0, limb2: 0xcff73efac06c1fe6f9d4bfe2, limb3: 0x143df5a491905251d79670d1, }, r1a0: u384 { limb0: 0xe2f782ade4eb4d3d61c1ae2e, limb1: 0x374eac91af81a4be25d5698e, limb2: 0xbea5114dfebd79eb8078b0cd, limb3: 0x3d61f08b0443e34c6871b, }, r1a1: u384 { limb0: 0xe4d40a02691978c7cd5b7c88, limb1: 0x4b39d5b3234be8097a93f261, limb2: 0x263fd7183a07705a066e4b0b, limb3: 0x673d4ac4c490f4da1baad08, }, }, G2Line { r0a0: u384 { limb0: 0x5acdc9c59c94e0d5705d33dc, limb1: 0xddeae8a3def58011f5fff627, limb2: 0x2a560574c9f7f1adf85ac330, limb3: 0x986c2f3fe60390dc3490a7e, }, r0a1: u384 { limb0: 0x3ae8c5c7e6a5b36fbf54ed71, limb1: 0xfca9910fdf6379bb21489fd2, limb2: 0x931ca186c017ce347583a52d, limb3: 0xa800d5ce754e490542d0a63, }, r1a0: u384 { limb0: 0xc757e215e8a482b8d6c1830, limb1: 0x79cdb82276ca8c6d2c853c2a, limb2: 0xdf7e085f46fdd58884c07921, limb3: 0x12c2a50751be2602b79ce60f, }, r1a1: u384 { limb0: 0x4bdd9d25da5b740109e8ba82, limb1: 0x738b43414881a78559812a3, limb2: 0xc45a86a441289ba795f8c844, limb3: 0xc17887e275b98353945d589, }, }, G2Line { r0a0: u384 { limb0: 0x2f25c239eaac738b78124e52, limb1: 0x3b423b7770e03a4290134003, limb2: 0x4e7a673af5f9bb11fa69398a, limb3: 0x5a6af6e0735f0cf58a65190, }, r0a1: u384 { limb0: 0x5465b4df3f574f8ce75115cd, limb1: 0xbbaa17554362320ad4d7dbb7, limb2: 0x7801bed020c4eb0b06b8c3a5, limb3: 0x55dab1ebabc42258823f990, }, r1a0: u384 { limb0: 0x168eff4cfe08a5d2480cd220, limb1: 0xfdfbc5d6539d58ae5fd2f3f0, limb2: 0x730c3716c3f8f093bc196396, limb3: 0x11ec5e41f01d546dc82f14a9, }, r1a1: u384 { limb0: 0x23122e240cc2e876eb1177f4, limb1: 0x2ff2cb0192b8833c39a3f14, limb2: 0x8df40969fdcda1a427931ee3, limb3: 0x10714f2f682bd1dd3f41759, }, }, G2Line { r0a0: u384 { limb0: 0xeb732a6499363c67e23554a3, limb1: 0x4cdd42ecd8a52cdb6f9c934b, limb2: 0x67790eedc23de78c48c1386b, limb3: 0x30d8024f42aed61c2d2748d, }, r0a1: u384 { limb0: 0xfd6de8c461951483834d8358, limb1: 0x1871938e8ba214f3eb03688c, limb2: 0xf09f514cfb1eeede386e9108, limb3: 0x1ae4fa7bbb288f14dcf1905, }, r1a0: u384 { limb0: 0x7e5704e179ddff883226618, limb1: 0x944cd6a7ddc3abe547501924, limb2: 0x65f20918a39b3d50fd554db5, limb3: 0xa5f6ffc447dd34c63d7c7ed, }, r1a1: u384 { limb0: 0xa365a10339a32f4d93f34a24, limb1: 0xc7911352eea0cf23e726f314, limb2: 0xd28cf2c778e3550205e4ba3d, limb3: 0x49718664bcc386426e22fe, }, }, G2Line { r0a0: u384 { limb0: 0x9b4583c7c2eff06ad56a736a, limb1: 0x16aafa467cd25a5256429294, limb2: 0xa4c3b813887ac253e9bc4dd5, limb3: 0x6eee2daf5b60dab9f5eb870, }, r0a1: u384 { limb0: 0x9444bf7e4bfe8944f3411b7e, limb1: 0xaba54fb4de33e741459d8419, limb2: 0xa2327c6e364f8783c0d5e1bb, limb3: 0x838b6cadbc4926ff1e28231, }, r1a0: u384 { limb0: 0xc8b6a45166049617dcea7b54, limb1: 0x4ac49a392e6cf7439bc91ae1, limb2: 0xd74e10a7727f88165c078231, limb3: 0x162f6576adad1b99778999fa, }, r1a1: u384 { limb0: 0x75bd03c5dc8a6db2a547c786, limb1: 0x245ca34042521ea6d83ceda2, limb2: 0xcc92885b1570b94b70d80a05, limb3: 0xb8b49d50bb600ad8d7ce9d0, }, }, G2Line { r0a0: u384 { limb0: 0xe56c10fd708eba4c69c86be9, limb1: 0x47a28ca72cfe6f9c70ca8972, limb2: 0x6933ea5252a1c9ba1a14b029, limb3: 0xad0112a4bbbe78974cf22f, }, r0a1: u384 { limb0: 0xd79653f0250babd6c15550a3, limb1: 0x4fdd97d99b267a100baf5eab, limb2: 0x5dba0919fae69ccc77cc729a, limb3: 0xfbfb0f0ef4a3dfc80f6b10, }, r1a0: u384 { limb0: 0xdc11b768e081943936c71251, limb1: 0x8e402b0cf012643696d54eec, limb2: 0xe3a54b8bea8aa29cc92adfa3, limb3: 0xda8bf357b7ecf5ee7e2935f, }, r1a1: u384 { limb0: 0xcef322bd8fd68dcf8292c80e, limb1: 0x8ae248af5d1c668e58fdcc5, limb2: 0x298acf2638b512874d35b32e, limb3: 0x191d8257aa2319bc39753288, }, }, G2Line { r0a0: u384 { limb0: 0xc83c67c05fbfeaefbbd5790a, limb1: 0x123a1cca4ede316a8294191e, limb2: 0x63fb9483204cb857d7463c, limb3: 0x984ae3c2b6712fcebb6158b, }, r0a1: u384 { limb0: 0xb48a82e26de7b45ccf695c49, limb1: 0xfd69088e6325b4a59e2e3baf, limb2: 0xbc7a001c3fa6f52b1d25697e, limb3: 0x4ff0e60086655cc572e1467, }, r1a0: u384 { limb0: 0x3a0c2b22b46f25e18a89dd01, limb1: 0xa4fb3c83d574db22b6f0f2bd, limb2: 0x2a3bbdb8ad527267238eb4b5, limb3: 0xc1632affc12f7ddc4fe9c05, }, r1a1: u384 { limb0: 0x7a6ccf0765a33ad6a4338e28, limb1: 0xb128bf3f00eadb3e353e99cb, limb2: 0x8345222b6d92f0e8ceffe694, limb3: 0x13021a7c42029ef3b3a03b5b, }, }, G2Line { r0a0: u384 { limb0: 0x8b4b049da5868b96ec5ef16a, limb1: 0x8d5611c25dabe2e1e151b1a7, limb2: 0xddb71096536602ff67aef13e, limb3: 0x195727ea0c31f99d279d2c66, }, r0a1: u384 { limb0: 0xd3e90be23a92f9b2796a042e, limb1: 0x85c1b8abb6a3db2341cbd934, limb2: 0x35f112e2a3bb74ebca814c9, limb3: 0x11608b3602d92cd2961f734a, }, r1a0: u384 { limb0: 0x27ecf3c4fb84afd5ffe30e5, limb1: 0x7d3b6cadde4e3cfc2716482f, limb2: 0xf461db5c14254194af9677ad, limb3: 0x74722715fddd1d8c8facb8e, }, r1a1: u384 { limb0: 0xd794b12dc14b353bfc2efaef, limb1: 0x3ef7de5c1b936e7d05b5772c, limb2: 0x5109cd77e02b955f276af355, limb3: 0x69e276dbbecd216f0aa3d6c, }, }, G2Line { r0a0: u384 { limb0: 0x10bc38abf4dda7f290877811, limb1: 0x90127c55e7589969a91be3ac, limb2: 0x29d96c2444ae7f01e263a0c3, limb3: 0xf495e0c5443cde97f871315, }, r0a1: u384 { limb0: 0x6f2ac18b2680d1e8a605caa1, limb1: 0xb4a46aa677fb81fcbae9dbb9, limb2: 0x54e08bc2869b9a1d9a537c38, limb3: 0x1465dd41a8a184fef79a2c1f, }, r1a0: u384 { limb0: 0x9d53f734e25974abcfa47364, limb1: 0x9df11e087b97d3d542c984af, limb2: 0x25fab041d2456b22ec266690, limb3: 0x495f3d7bdeb35ac71f1edb0, }, r1a1: u384 { limb0: 0x887fd8b50e8827300a60f794, limb1: 0xfa5ba0761639eeb27f30bed9, limb2: 0x3fbae88761ebaedad5ddf541, limb3: 0x55c11188a5ad9e22ab23b49, }, }, G2Line { r0a0: u384 { limb0: 0x7839770100e64978b29b5da1, limb1: 0xd1797b5709b5e941a25bd854, limb2: 0xe380c0aa684a2ef24741f60d, limb3: 0xd793a27db3f49ebe18c4a1e, }, r0a1: u384 { limb0: 0x559bdbe1d7eeb10a2746f1bd, limb1: 0xb9c58c75c214aab2bf45be6a, limb2: 0x9895443b8ceac7617274a4cc, limb3: 0x8f43c50f9fe87ae296cfb2d, }, r1a0: u384 { limb0: 0xdda6f32b4b0b7b32d265129e, limb1: 0xe464575f3e1f24bb18636f8b, limb2: 0xb224edd6479be27e01119c05, limb3: 0xca892cd7b21339a629ec82c, }, r1a1: u384 { limb0: 0xdf94aa2f2ba69324fb2ae4c5, limb1: 0x74d6e4984282ba272947e515, limb2: 0xad622ab52799cf8f5434661, limb3: 0x14b019e003467d8befe14c7c, }, }, G2Line { r0a0: u384 { limb0: 0xb969376bae3c9436802b382d, limb1: 0x4bb02af7cd7b5f2095de8558, limb2: 0x7e915e624ef6b238784c8ee9, limb3: 0x5ad75d07fc6e51553e8446b, }, r0a1: u384 { limb0: 0xf2f3c721941407cd6fc65214, limb1: 0xf96f4682200bf90560f9d7d0, limb2: 0x6ff674edd3cdcebfbc6927c2, limb3: 0x70b924a36d0d0d18d1f86c0, }, r1a0: u384 { limb0: 0xfa5f3d9bae88dd30a37e6ee7, limb1: 0x46acb9ec3468325eebed87f4, limb2: 0x996d6196a4f5ed86336dfe3a, limb3: 0x15aa069b9cb15c0d9e13affd, }, r1a1: u384 { limb0: 0xf57275082d3033d0931cd97e, limb1: 0xb5af04905693380e449363fc, limb2: 0x67cb680f814b147d1c0510c9, limb3: 0x7960dff606f541c7946b9d, }, }, G2Line { r0a0: u384 { limb0: 0xc15b372196a4663350cd2b9, limb1: 0x2753dbf2d814a0dfa80e8275, limb2: 0xf3d176cfd4b31f6947d9bc88, limb3: 0x17c0bb87847c506117e6cd23, }, r0a1: u384 { limb0: 0x76f4129f303039129cc79e0, limb1: 0x7eaf05f9708ca7853218d75, limb2: 0x590ed883b2ed7b5f645ff44c, limb3: 0x1684dfe0af35fe16ba5ba930, }, r1a0: u384 { limb0: 0x277e726e10e54e13daa7f4b8, limb1: 0x1357f42678e08ea031bb2b12, limb2: 0xca1c568eabcf8afe53c814f7, limb3: 0x19bc460f5cd30977d21d9739, }, r1a1: u384 { limb0: 0x33eb94313ab593654dbd54ee, limb1: 0x7c237036496ce5f8f11c17fe, limb2: 0xdfd944729987f793c15e4453, limb3: 0xd63a6276a212ce9a1e58aa7, }, }, G2Line { r0a0: u384 { limb0: 0xf20da79d7dfa037538abd816, limb1: 0x96c0beb5faf5af5df9b8ad6f, limb2: 0x3aa4377fa088a6cf85b99168, limb3: 0x153bee48b03425e71179bfd3, }, r0a1: u384 { limb0: 0xf5a3dc9e621f522295873202, limb1: 0xfd7f4a0f3fae36c0e07bcfb0, limb2: 0x91787b55b90027dfbba4dc47, limb3: 0x602b94eac31f07e247331ce, }, r1a0: u384 { limb0: 0x4d41921c8d757cb2e15c0d98, limb1: 0x3ae914662ef2442249290f10, limb2: 0xa1fb6f06697cc519f0bb38a7, limb3: 0x2f6ddde5351135b578991f0, }, r1a1: u384 { limb0: 0xc87d3c0bd12fb496ed8f5a54, limb1: 0xc3a104d91a2340a8f822da07, limb2: 0x56e3f922970841517593e69, limb3: 0x92b551cd42df98975fce59a, }, }, G2Line { r0a0: u384 { limb0: 0xdb6c7a0774018772e50dafcc, limb1: 0xbde46cf045ab017eac2816e2, limb2: 0x824d39b935708d80ca98241c, limb3: 0xbfabbb42779252feb5d25e5, }, r0a1: u384 { limb0: 0x788ab20840dee69cea429120, limb1: 0xa417d7d1b270d5611c01b727, limb2: 0x2b196689ca63e5a20e13badb, limb3: 0x1091fc7332394b464cc2444c, }, r1a0: u384 { limb0: 0x2e9e2a6964ebf268df4932e5, limb1: 0x77632a4b8d6670e8867982ac, limb2: 0xa854b6cad13eb7b32654a369, limb3: 0x47857d8ec55a7a26b65ed42, }, r1a1: u384 { limb0: 0xe11be4ab63d3f43b4f493247, limb1: 0xdda4441c10bf9c3d1a7045a7, limb2: 0xaecbee2883c54e7a6ed845c9, limb3: 0x184f1f4eb029266cab0f8a9d, }, }, G2Line { r0a0: u384 { limb0: 0xa89a525e63cee0c3dd6dcbdd, limb1: 0x260af65091e1b14cdfcd6a9b, limb2: 0x8674f3d64ab6a0dfa428a734, limb3: 0xd83461b7d229a47477b452f, }, r0a1: u384 { limb0: 0x4ea9d854c2d19cd6c91f75c6, limb1: 0x6faa63eeb0ea28a567141c51, limb2: 0xf32028bf055906e69704c788, limb3: 0x161a2c2d45c521243105d3e, }, r1a0: u384 { limb0: 0xcc932dd5deb1d63753156319, limb1: 0x13f05a2fb2e964c1a8a2e28e, limb2: 0x5cfd3943f10bcad6ecc2ea6b, limb3: 0x10a0f702fead13effc9e9f1c, }, r1a1: u384 { limb0: 0x856d3b6773cabc8ff27af841, limb1: 0xe7990cc9655a8869cc53dc7c, limb2: 0x3dc0945d12fc0d72f4ebd1af, limb3: 0x18e7f2418d2abfce90cf506d, }, }, G2Line { r0a0: u384 { limb0: 0xe99a02683b93ce550ef8951a, limb1: 0xa9abcbc9f1e57aac617d5a71, limb2: 0xfd2264b1427ae649f3a4e1ef, limb3: 0x15ff7a8e11d9ae7d538a8b00, }, r0a1: u384 { limb0: 0x503500bd91432999dba8d5ce, limb1: 0xd95bddb364aa203f3840ebf3, limb2: 0x59e6dfc06d85fbf164cae37a, limb3: 0x1382a254297b2a3c664514d1, }, r1a0: u384 { limb0: 0x9097edb6dbf1b71a8c368587, limb1: 0x532fc71978fa4554bbfdd7ea, limb2: 0x5324ddb0fff76cdd1bef7534, limb3: 0x43fed1dbcdad88e4eae01ee, }, r1a1: u384 { limb0: 0xc635a4270f612344c7c2577c, limb1: 0xe4eb707545e699537d72d73e, limb2: 0x40574795e3c651067e4021ac, limb3: 0x13dbaabb12a73c5d10348fda, }, }, G2Line { r0a0: u384 { limb0: 0x1a2d52c61eb99a17a3be3cd9, limb1: 0x4eecc3591b88b7e445de86a3, limb2: 0xf4864a4ecffedb9825372e24, limb3: 0x6f605dc4849a207692e010d, }, r0a1: u384 { limb0: 0x3acd6290375e15bccbe5b23c, limb1: 0x36c7d38bd9a1a396291b0837, limb2: 0xc0dc84c282cca2fe3d70cc82, limb3: 0x24caee93425f8b557dc23d6, }, r1a0: u384 { limb0: 0x76300db4b9d505a255fff33f, limb1: 0x35af05b45d0477b7367e86c5, limb2: 0xde8815ffa8ad532cf68bd313, limb3: 0x3054d735bb0c22331cee080, }, r1a1: u384 { limb0: 0xf5c2e1a9439c2a46aac504a0, limb1: 0xbb192ed1b6154a8a8759f705, limb2: 0x51314d3bdedfa5d487255b3b, limb3: 0x4b2e182290ab34447644799, }, }, G2Line { r0a0: u384 { limb0: 0x1a96d93e90e2ff176753ab18, limb1: 0xade05825ee054ce9e6aa7652, limb2: 0xd6a9decd70aaa6b4963911ae, limb3: 0xf299b64b98f8cbfef181bb9, }, r0a1: u384 { limb0: 0x1f4b4e96e678e91f5136b57, limb1: 0x38f0a1243e66287b99527276, limb2: 0x35f3c0d6c73a9c5df947c52b, limb3: 0xbd66bc9ceb8ca2f089cd853, }, r1a0: u384 { limb0: 0x83d71050041829043e791eff, limb1: 0xc3e374927bd34a428d5e8b71, limb2: 0xba4af9bfd6eef2f2f46d4ac1, limb3: 0x3f3eed8249fd695c1e30a35, }, r1a1: u384 { limb0: 0x7a118b9c162bdc488e1987d8, limb1: 0x8d7006d37a064b13604cc87f, limb2: 0x9aa2b399b83e8ebe5e4485eb, limb3: 0x9507e154475bf5fa909df2, }, }, G2Line { r0a0: u384 { limb0: 0xaaad16d27f79a631ad790eef, limb1: 0xae1f9bbc2c4ec614b31501a5, limb2: 0x76c9cba7d0b6ea3af8908f54, limb3: 0x8cb7a6a8e9114893f6644ff, }, r0a1: u384 { limb0: 0xb29d1b611350cf14a1ff5b64, limb1: 0xc4447fdb999569b727058ef5, limb2: 0xfda61b5986ff6f5d9f152b51, limb3: 0x23d1e1edcc9d6ebe666be7c, }, r1a0: u384 { limb0: 0x3d4f1112105d01b9b097a930, limb1: 0x1e91e032d07d86e09c81fc2c, limb2: 0xa3f3ef90b2cf32ff4d39187b, limb3: 0xc7030a9f46cddfe8fbe6edb, }, r1a1: u384 { limb0: 0xd5d65ce0b325226fb72dc92b, limb1: 0x6e31b2b7f19c109c18fbd01b, limb2: 0xee8f8e11ae8ac7ab0576e625, limb3: 0x365346e2cd8b13c2139031c, }, }, G2Line { r0a0: u384 { limb0: 0x958c5cbc7b7c5871f23dfcf, limb1: 0x7854e164fda1398cfd8ea3a4, limb2: 0x75c6a007ac2a2dad8ae4fceb, limb3: 0x1366af4f5f203de7130aac6b, }, r0a1: u384 { limb0: 0x735cb088c084a95da948d7b6, limb1: 0xfb4720c591f19db6fa2d240d, limb2: 0x1c1e1ba0f8cb09e9c74012e0, limb3: 0xebcb762ec15441bbe5e90f, }, r1a0: u384 { limb0: 0xfa515cf322fa715c42dd2f41, limb1: 0xd5aa8484650615117c7b96a0, limb2: 0x6a6be8954ff02d512c49b618, limb3: 0x192a8d310a23babfb03ce402, }, r1a1: u384 { limb0: 0x422c26ea60eb07cc4e36501, limb1: 0x517f2958deb48911f0a19c1f, limb2: 0x89112f6559c627eb9b401955, limb3: 0x132d0703aac38ddcd55e349f, }, }, G2Line { r0a0: u384 { limb0: 0x15699baf9687ab96747973ac, limb1: 0x45d8e4b0b8dd9546b5c2160e, limb2: 0x97ef45aa8fc2ea6973fb25f0, limb3: 0xd22da827adc6fd4557cead9, }, r0a1: u384 { limb0: 0x85e49ef128bb2219b1f07ac7, limb1: 0x295e9710438a530329d7e3b, limb2: 0xa3aa3e7050cc9d1b3bdcc481, limb3: 0x95f4b12ee5a15214982e790, }, r1a0: u384 { limb0: 0x8699fce7031397e3b1a37ca4, limb1: 0x43de46654e0285505fd46631, limb2: 0x801c0f81eb7d3e37e2800f96, limb3: 0xf3b98ea40864c154194cf17, }, r1a1: u384 { limb0: 0xf3890e04481b23922bebe93e, limb1: 0x5f4a9113311cf1fa14c46464, limb2: 0xc951bddb7ac353270c243e05, limb3: 0x17fe34cd769864cf6eb82f26, }, }, G2Line { r0a0: u384 { limb0: 0x5b8ddb5ef759c26463a5c2d5, limb1: 0x23dfe2a291f1c6d3e701c5f1, limb2: 0xbde479c12792bc7c7ba6f007, limb3: 0x53d3da343236190fbd3d670, }, r0a1: u384 { limb0: 0x2b975b85fccd8c75e7b35e71, limb1: 0xf35a56815cc0008976b199cf, limb2: 0x9db07692a2a10c279318a5e5, limb3: 0xfefeb9821fedbb7a8d96405, }, r1a0: u384 { limb0: 0x89123d390cc0b45334219d5c, limb1: 0x8580bdc8b5a9431143616a9f, limb2: 0x842a78eb06dea913f0ddc70b, limb3: 0x14c94d04e4c3db61ccc9cb3e, }, r1a1: u384 { limb0: 0xfb325786a902cd41972616cd, limb1: 0xaf06f0ef70a3d64f48f86731, limb2: 0xcfd0ca15c2b367e8c5e13162, limb3: 0x2b733169837e8718b14ad9e, }, }, G2Line { r0a0: u384 { limb0: 0x1060e79efcf4fe162043c999, limb1: 0xf9eb475ab49e172512cb8d8b, limb2: 0x2c62b0aa1a64b223b7de2573, limb3: 0x1021b449fce423340b5d8bff, }, r0a1: u384 { limb0: 0x560013da8e110b1f16208fc7, limb1: 0xb19b49f510c03417ab3a3cc, limb2: 0x93468e27a99ea01b543b9de4, limb3: 0xf5a062536c69ebccb457f7a, }, r1a0: u384 { limb0: 0x7e8393bbf3cbe32958ca97d, limb1: 0x3bd384fe8c76515821397c19, limb2: 0x480d7ef46bbcd067589b513a, limb3: 0x466d9efc0da462be4e956e7, }, r1a1: u384 { limb0: 0xbb73b034d01cd3a7fdb30d5e, limb1: 0x710f1a8bee89f88df336c5b6, limb2: 0x4b51ff95ebc39c295bd392da, limb3: 0x23be92062c2f86a8fe77642, }, }, G2Line { r0a0: u384 { limb0: 0x2c13a83b4df1f9225a2b6ac4, limb1: 0x853239dcc27a4a3006c48823, limb2: 0xb7c61b932f7131b1a9e9cfe9, limb3: 0xc235c22bed928a49c57d91, }, r0a1: u384 { limb0: 0x2ad555d3488695aabbdc2bfa, limb1: 0x36aeaecc0bc432b07fdde898, limb2: 0xc181cebea90ec0398d441027, limb3: 0x2e4624ac3edf8e0004356d2, }, r1a0: u384 { limb0: 0x115f2c7dd57e1f443abdcb76, limb1: 0x2e6ce3e4e2decdc9746d55aa, limb2: 0xf0040696fee584095938d6c3, limb3: 0x97772521a37efc5538534aa, }, r1a1: u384 { limb0: 0xe2910d7b44ed8f54620b8dd5, limb1: 0x9d8b8ef67190e2769539ee1f, limb2: 0xdeb8a208bbe43737d771940d, limb3: 0x1919f1a600fb184dab5ad252, }, }, G2Line { r0a0: u384 { limb0: 0x9d0d7048ae34c4d5fd999612, limb1: 0x3cf823d17229c90d32e33935, limb2: 0xe549cdf7a4a7ecc98e34136d, limb3: 0xedebc96cb4b5187ae9eb3b1, }, r0a1: u384 { limb0: 0x6fa66fc33a35822ad71cd240, limb1: 0x665c350e7ae9ad6ec24f19bc, limb2: 0xb442d0f327ec882e35df22bc, limb3: 0x16252435446b7d36124af764, }, r1a0: u384 { limb0: 0x83640672a553a4cd021ba5b3, limb1: 0x44865aa1ee3d773c912611d2, limb2: 0x740ba61daae6eecae5e97813, limb3: 0x83def394c91369300fe0c8b, }, r1a1: u384 { limb0: 0x3df995f1c2ed04d80229d6b, limb1: 0xa51edc17429362d673cb1982, limb2: 0x5b44377d34824757730568f2, limb3: 0xab03d8687d1f4d4a6ad051d, }, }, G2Line { r0a0: u384 { limb0: 0x6124886478f2cc18ac7a2e2b, limb1: 0xee512c975e35cedc82c7d7ac, limb2: 0xda37b3d1093cef0103927f42, limb3: 0x59bf82d1ceccaf2aace94c, }, r0a1: u384 { limb0: 0x940fedecedd43793654043ca, limb1: 0xe942254619040c18fec28670, limb2: 0x1a38d414bae72d7c18228ee4, limb3: 0x5a0cae960c221324c382272, }, r1a0: u384 { limb0: 0x5243bdae31b236a6db41a014, limb1: 0x446200b5b60cf3a1f7ddecd0, limb2: 0x8199c68b061ab197ff4f291e, limb3: 0x132024182ad8ed489493e7c1, }, r1a1: u384 { limb0: 0x75b6b4b39dfd6310bbe2bbfe, limb1: 0xc24329c463cf2dce4a0f2b1e, limb2: 0x6351f8b4dd6b98d8dd08571f, limb3: 0xb7e166947856100686caba7, }, }, G2Line { r0a0: u384 { limb0: 0x272c89200c794cd147e788e0, limb1: 0x9fb565bb136cbb8045af5f87, limb2: 0x2069950ae2ba4f18fba1f9fc, limb3: 0x177b5c95ff2830d6599abe46, }, r0a1: u384 { limb0: 0xe5c6a8868f65fdb92938a0df, limb1: 0xaf9e901c048eba76cc3ff87e, limb2: 0xbb4bca9f829983ebcf7b0bf7, limb3: 0x10225e60b74938217982949d, }, r1a0: u384 { limb0: 0x59223b55e73462497ab88909, limb1: 0xbf85c496ae8b9fda76002199, limb2: 0x62a031731b66c76791e92203, limb3: 0x171879670265e69690032708, }, r1a1: u384 { limb0: 0x8cf19356fa7fde4256452335, limb1: 0x1b1278bec957e29ee831ae02, limb2: 0x5502af18627227d6b332cbc4, limb3: 0xcdc76b668164420b81016aa, }, }, G2Line { r0a0: u384 { limb0: 0x98b10da09c71a6b94aad296e, limb1: 0x97a8da4b49e9fc2146de78cb, limb2: 0xa2100c253b27bc556c580b05, limb3: 0xe1e69f673f88fb5aa0bc47c, }, r0a1: u384 { limb0: 0xeece167c5aa9aedda2c67b05, limb1: 0x91ffc99bde37b51ebb425d99, limb2: 0x6586a39a7d8e9fd43508c82c, limb3: 0x199a9fb2588fc41c2870dc15, }, r1a0: u384 { limb0: 0x69e49f06891dba8debf248eb, limb1: 0x6ed2813541abd5529f4e3c13, limb2: 0x38db1dcc2959a7e5e9a38356, limb3: 0xe38a613edc814d28ff5c13b, }, r1a1: u384 { limb0: 0x82a33409cbff8d789eed7d49, limb1: 0x25e41243c614be1b6527905, limb2: 0x9440ecdaa3e3636a114ebf8, limb3: 0x188e41337ca6ebcbb51cfbaa, }, }, G2Line { r0a0: u384 { limb0: 0x4fea2f2144c44633b936b99, limb1: 0xdfbe01d451c34a28a5d884ba, limb2: 0x6356b21e2e72b3a569637b53, limb3: 0x17535b31f03f5fa8ce0bbf9e, }, r0a1: u384 { limb0: 0xe0571a3149f69dca26a5436c, limb1: 0x403d0b7768cb8d00af7bcf12, limb2: 0x42f0dfba12b6b3254ec517f, limb3: 0x19795ebfcb47ee3183979c02, }, r1a0: u384 { limb0: 0xf21e9a787a07fbeb68fdd736, limb1: 0xc934d940ba208f191ab26d3c, limb2: 0xaefc28a158eeec24acadaf8b, limb3: 0x14403ea146584a7812452cd8, }, r1a1: u384 { limb0: 0xf2af0115631f55c3a44a5f54, limb1: 0xf9411911e95c09167f70d836, limb2: 0xd44bc506063a460a978a380e, limb3: 0x180d8392357243d607d78851, }, }, G2Line { r0a0: u384 { limb0: 0x9fdd8b5b697f5dd293e1a76b, limb1: 0xa96d6505267352e6f704935c, limb2: 0xe30162de2b8b9f5fba1bd4bb, limb3: 0x8e28439fb40933f21df4125, }, r0a1: u384 { limb0: 0x9f09979d8fc693b5ed13014f, limb1: 0xff6e48f2f458df94eec90781, limb2: 0x19298b6ba3353dca1030a0ca, limb3: 0x1516a205be895cc94ddf856f, }, r1a0: u384 { limb0: 0xc4059e6b093b22c8e1bde28, limb1: 0xb7225ce7a598e40389484960, limb2: 0x9681cc18d063610fa821bc03, limb3: 0xb32e29276eeb86d761513e7, }, r1a1: u384 { limb0: 0xabf2383d22bb76c149aa2ad7, limb1: 0xab677034d9b95445962984ac, limb2: 0x844d69ca653908adca99d46, limb3: 0x1561b679e85c3aab327e6b35, }, }, G2Line { r0a0: u384 { limb0: 0xc6b6d49d468231b1e43957ee, limb1: 0xb2dd14e7a0ef4f763a11ba9e, limb2: 0x607166185e56a158247fb57e, limb3: 0xdaca26b0975b9b16f9dd8e0, }, r0a1: u384 { limb0: 0x755e376bde1d6457dc11a98c, limb1: 0x461e42cfd40b3b4f720f2d6d, limb2: 0xcb98f9df907653951d3552e5, limb3: 0x1622b7062c0ff1f549f2056c, }, r1a0: u384 { limb0: 0xddd74d89af8507950ad474c3, limb1: 0xa0d1d6eab751a63a4741aa67, limb2: 0x809864aa0756c0345ad8f95b, limb3: 0x19ad2fb756ef19d153debbc3, }, r1a1: u384 { limb0: 0xe4c04b7d418da7dc521db68c, limb1: 0xd68db67480f415c5c1f1540, limb2: 0xcc6c3f3571230f97af5fae46, limb3: 0x6a3947541daa68ecc643fb2, }, }, G2Line { r0a0: u384 { limb0: 0xadafaa267f908d69386af731, limb1: 0xde5cd6d7f9c76ebfd7ed1503, limb2: 0xb90709cac4c5e37885268f57, limb3: 0x44c7cae9f5809069081870a, }, r0a1: u384 { limb0: 0x8e2baef46b7310052faa7b62, limb1: 0x1d5ecd4dccacb207952f4c3d, limb2: 0x1c4abff0daf903bac4bea1e9, limb3: 0xe17badea1b419cb261ca9c9, }, r1a0: u384 { limb0: 0xaa232a7c023966b88ef26311, limb1: 0x159b7596772d43113ef71fab, limb2: 0xb113647f7765b991d9915c2a, limb3: 0x17e99f889166a2f7932cf383, }, r1a1: u384 { limb0: 0x6f0711a2f3f758f1c7529ebc, limb1: 0x1af6895cfc3465f18ba190ce, limb2: 0xcf03b4526ccac420123fd885, limb3: 0x16c791f98c5064fad5d87d11, }, }, G2Line { r0a0: u384 { limb0: 0x95bc3acd1dbcd08d20f99a9a, limb1: 0x5e451756a929b6144bc485ba, limb2: 0xae9c055718137232e71b8e7f, limb3: 0x1577307f04a2a6802d0de028, }, r0a1: u384 { limb0: 0x5c8f20f421b04157a09f04c6, limb1: 0x210aa23e578f87e9bbd50108, limb2: 0xfa44a24dba5f661ffe0372c6, limb3: 0xde501b7b4a7c497dbae0723, }, r1a0: u384 { limb0: 0x73ed700382051ae7b1db6bb6, limb1: 0xc50ddff17b0556bd5621aa3c, limb2: 0x122d0c116f51709bdba0a8fe, limb3: 0x138c7cb7c73ceb6fd3b24232, }, r1a1: u384 { limb0: 0x8cec31b5c5ea717895857b08, limb1: 0x7b5be6faf88ac2fb624b9489, limb2: 0x4cde2e36d0606a524b9afcac, limb3: 0xfb04201af23031e937f87da, }, }, G2Line { r0a0: u384 { limb0: 0x7eef546a9a54ed933283dc32, limb1: 0x2f958ff1bd33ae205359ba45, limb2: 0x4beda973ca3e41934d0945d1, limb3: 0x16c93c9ac9718722abaea94f, }, r0a1: u384 { limb0: 0x10b28f7ddeb274f228c31e62, limb1: 0x6223c0a397b6165eab1d4795, limb2: 0xde245ad6269a80313be23b84, limb3: 0x14dad34f376675fa17159b1e, }, r1a0: u384 { limb0: 0x17c7c88c61161d6435c5daa5, limb1: 0xd0aac2f4bc18707213a80c1e, limb2: 0x492ae4a8c44b4a1791fecf07, limb3: 0x9fde416d1ce1461b898b530, }, r1a1: u384 { limb0: 0x5924e09aaff024aad86c2bb3, limb1: 0x45f116cb413b940c0c8ad68a, limb2: 0x3023488276dfbc1577893256, limb3: 0xebcd32018261bf6cee2aa4e, }, }, G2Line { r0a0: u384 { limb0: 0x1f72ae56a82c6deeffd5e12d, limb1: 0x42a8fe11f639f0f4769ca2de, limb2: 0xa839e74b5db0d4d96a9c09d2, limb3: 0x21bb0fe1fde89edd58facdd, }, r0a1: u384 { limb0: 0x9a65ebb34b3cc95b6448d811, limb1: 0xa91267c18e68b973b7c7b595, limb2: 0x92ae1415b493a4822fce651c, limb3: 0x5a83f6968dee7ca53037a22, }, r1a0: u384 { limb0: 0xae4501a657e9e2aa7fb385ce, limb1: 0xdff063e0d0c3db964661e8d2, limb2: 0xd96450190095ea74c7c47860, limb3: 0x18c0ee838f14d716aef67921, }, r1a1: u384 { limb0: 0xcc6fd08a5c7a625108edde7e, limb1: 0x4877444b75cfadc89c7cc80d, limb2: 0x78df79f08842728a8dfe9eef, limb3: 0x179219c982b34ce20d260115, }, }, G2Line { r0a0: u384 { limb0: 0x29ad362978e21398eebf795f, limb1: 0x51fe78412ed406b6e706ff2b, limb2: 0x5397ad462a025210bb36aa2f, limb3: 0xfe9afdf4aef4daac591fa2b, }, r0a1: u384 { limb0: 0x516c76de17f0d6ea63f796b, limb1: 0xda055a6f42a65b6645b58a87, limb2: 0xfca5488873cbdeb4c734ba27, limb3: 0x114d159710178f068e890c2c, }, r1a0: u384 { limb0: 0xb7d1c81e239246bc39e20d97, limb1: 0x1ab04e9938568f66fd85eb85, limb2: 0xf6d44deb3d0a82fd50819060, limb3: 0x104438b881ec394d9fd92cab, }, r1a1: u384 { limb0: 0x80b68cc97de83bd32e36ddd4, limb1: 0xd5f6fa44b2df0779aa536193, limb2: 0xaf629ece4defcbce85510ab6, limb3: 0x84b0d66102fdc2869a09a84, }, }, G2Line { r0a0: u384 { limb0: 0xea8a49cc987d661291e12693, limb1: 0x59b450127a0d913626c58776, limb2: 0xe7f24df1ca086010b7d01105, limb3: 0x867e8ea5e54d79ae2a6d00b, }, r0a1: u384 { limb0: 0xfd112f0bcf025150b41a701a, limb1: 0xbce62d6eb125fc95d7038ee6, limb2: 0x7db90f26f2784e7a8424f024, limb3: 0x1397bf8e16134755bf1d3968, }, r1a0: u384 { limb0: 0x36038d3443ab41bd2af0e3b5, limb1: 0xba741669e71f7b571586f409, limb2: 0x4140f0716ba60a7d7a477004, limb3: 0x16dbd6d7aea80193167b878, }, r1a1: u384 { limb0: 0xc8dd57a935f217809eee1de0, limb1: 0x937aadaa4a4760805e491936, limb2: 0x24c3e76750bb6ac77ca7e209, limb3: 0x30777905eb690b8538c4ac7, }, }, G2Line { r0a0: u384 { limb0: 0x902aac58eb96caaff71b582f, limb1: 0xf52a4771f65469ba56bc0662, limb2: 0x5895a8890090eab8c1f7b798, limb3: 0x8a229ff1c75c7a484fd234, }, r0a1: u384 { limb0: 0xfa7ef9a4ab063b7afbf4d128, limb1: 0x9fb547747056804a9fa54cfc, limb2: 0xc5aac2c5077de8b2bd37f33f, limb3: 0x18d0fc99a4822e514913d06e, }, r1a0: u384 { limb0: 0x2762d0d600884766a5a5a464, limb1: 0x637c81f8258dc8da3a25faa2, limb2: 0x9a70667726b3d5fad2f61ddd, limb3: 0x1632e5528689601952f5c248, }, r1a1: u384 { limb0: 0x41172f827c65f28e7f13f0c5, limb1: 0xc768ca9c3948f7835a9850df, limb2: 0x92f4cc677df919cda4ed58e8, limb3: 0x845e207a60af0762fda45c4, }, }, G2Line { r0a0: u384 { limb0: 0xbd18c8928d23dd0e0f2161e0, limb1: 0x4e33b40902738785b26b6e74, limb2: 0xb623fecc05d23249eb4047dc, limb3: 0x3ff9af12486b7bd8d629796, }, r0a1: u384 { limb0: 0xd0365626609ed6bec907d385, limb1: 0x98b32fc6ce83cc620c19bd88, limb2: 0x2c5c79d2c6332d65dab98ac9, limb3: 0x51da1c5a7d8e3a9787b652c, }, r1a0: u384 { limb0: 0x5f028cc4f94dd08ee4a357de, limb1: 0x4f345e1d7451ef79a178e4fe, limb2: 0x2ca907f6249e45a43f481b5b, limb3: 0xc8244f7e7b0499edd3368be, }, r1a1: u384 { limb0: 0xbff4a6495199c8b9599d7ab7, limb1: 0x2ac3014911235d9c51ffeea0, limb2: 0xfbddc867354278e4e8830de6, limb3: 0x121714d1f2e092c7c5104773, }, }, G2Line { r0a0: u384 { limb0: 0xa6cc97b7a0910742e374ec23, limb1: 0x5301b521491e28115a8e2e0c, limb2: 0x5eeff0173fc99d045f5e5baf, limb3: 0x9aa791c4ecab1333ab9eb68, }, r0a1: u384 { limb0: 0x2b53e7d481a30cc5c1356af6, limb1: 0xa777d9d25aeedc6628e59ef, limb2: 0xca9abd9ce059277e05864570, limb3: 0x178341ebb6ad736c0c8c8c1, }, r1a0: u384 { limb0: 0x493ad16ef3443414c2db3cf1, limb1: 0xa69a0458d57d548043b98070, limb2: 0x54556de9501fab02db7f5670, limb3: 0x6567dbc2c7bbfa7c52b6572, }, r1a1: u384 { limb0: 0x8dac714d502b1c67d8af7a3d, limb1: 0xf8aaedb3552ea20245b3a60a, limb2: 0x1ff0389d849cc39852c42cca, limb3: 0x1047890716eba58cb7b620ec, }, }, G2Line { r0a0: u384 { limb0: 0x62089c2d7ed144e434b6ba3e, limb1: 0x84b118ee4fd2d64ddca1dac0, limb2: 0x4ec4f1cf523c4ce8b58f70df, limb3: 0x53bbf9cfe4e8ff379ea2186, }, r0a1: u384 { limb0: 0xf057ecd0e195b9bdc80eb0af, limb1: 0x780a1465194b6e1eba5abbbb, limb2: 0x78ee79159a58965d1df84893, limb3: 0x19d2a085636fabbb4f34cf2c, }, r1a0: u384 { limb0: 0x53bbfc51a06f387be3a3af04, limb1: 0x3d1a72124a1db427822d3c7a, limb2: 0x569b9d8cfb866f877c80fa49, limb3: 0x1a4182a17dd9e73c7c53e2a, }, r1a1: u384 { limb0: 0x14fcbb338803b8fa47981366, limb1: 0xb291b4889847590e43766734, limb2: 0xc530cb073dc91c0e32ff33f, limb3: 0xfdfbe7ecce4161a97db358a, }, }, G2Line { r0a0: u384 { limb0: 0x1ea761bed489d2e31522504b, limb1: 0xcd1ca1a1223df0206ae0add2, limb2: 0xaf38be32d1a2709bd4ac44fb, limb3: 0x47834fc51a88de93531b9e4, }, r0a1: u384 { limb0: 0x9e440c1d6d856e7a6720316, limb1: 0x9a5d7d5c3c7e8587d4b942c6, limb2: 0xc351ea2e7f4c67106109076b, limb3: 0x9065d13cc71103c6d57aa42, }, r1a0: u384 { limb0: 0x28c6b55678da94c56a6dece4, limb1: 0xb17ca771ad0162f5f5b48ec7, limb2: 0xd80695da0e398b5fcafd78ca, limb3: 0x37d0e245a24e013b08ff5a1, }, r1a1: u384 { limb0: 0x27a8692228777c9cc1d5b2a4, limb1: 0xb9d28ac20ccc9ea55bef7dcf, limb2: 0xd8500eae05a3dee5c9a15c7a, limb3: 0x613266a37ecd23f4cd13600, }, }, G2Line { r0a0: u384 { limb0: 0x4763fa5ed823135887ccad53, limb1: 0xa72b8af90608ac76465daf3e, limb2: 0x26c8021436ce4e7c3dc2aa20, limb3: 0x78b1a8ddbcd83cf99e263e, }, r0a1: u384 { limb0: 0x7d3c32317a31685cfb3fb480, limb1: 0x888167b668356255ef02a522, limb2: 0x1d64fda1200658f6a768b519, limb3: 0xfae2c6af3287eed69729472, }, r1a0: u384 { limb0: 0x1d50b4a53487ce9e33837523, limb1: 0xab36376a39c01aa0bef902ae, limb2: 0xd8c90bd7ba560e674a8b2b1b, limb3: 0x18d5a3016ae6c6d5297778c8, }, r1a1: u384 { limb0: 0xed7b19829e38ebed49ae2b44, limb1: 0x832839564a48e64c2c12b2b9, limb2: 0xc8fa7ef5ecb2e531a2e57171, limb3: 0xf4a1e3eeacc2e423bace47f, }, }, G2Line { r0a0: u384 { limb0: 0x580b8cc14b716134c2410b38, limb1: 0x10eb555a6e55e5d519da0d69, limb2: 0xe6e6910d0d4b80539f2711b6, limb3: 0x47e19418f8c84da6011a6e6, }, r0a1: u384 { limb0: 0xa7613cbb9a679564298d9bae, limb1: 0xb4900e0c9f280703f5f8ea54, limb2: 0x1e08087fc2448bb3da053fc3, limb3: 0x7c31e87bc79d00e9d696b9d, }, r1a0: u384 { limb0: 0x98e919832044c40fac742092, limb1: 0x18bfae31c275cd18fe4a4ea, limb2: 0xdc9125e5ee77ab53aa5fe810, limb3: 0xcc698e873e9ca14fbcff1c8, }, r1a1: u384 { limb0: 0x50e908c95ab9d2feb4dcb224, limb1: 0x4cfe3ce2d54166b89c4f6d8b, limb2: 0xd83d839665b22b27b714b166, limb3: 0x16f25abdf39f32a98af41af6, }, }, G2Line { r0a0: u384 { limb0: 0x28d123bd987516edde7b9220, limb1: 0xd8e4e7ea988137932087a426, limb2: 0xc7f4cd3fd9a8199e129ea3cd, limb3: 0x3900d505d0369cd906b0458, }, r0a1: u384 { limb0: 0x847f555fd20ab0d4b1db5335, limb1: 0x6d65d431aa3b878774d6583e, limb2: 0xca390d2b5120becbe4beb8b2, limb3: 0x11d3a19b84deaab4cc0e6882, }, r1a0: u384 { limb0: 0x9637fa3606d4f84648ecc548, limb1: 0xce153c564c7d59efae1a1dde, limb2: 0xfc93d2bb65e106476e20da9c, limb3: 0x2e22460d6878c49bd53a592, }, r1a1: u384 { limb0: 0x51b01e1ab106d9b94c81ba1e, limb1: 0xbe3d4cec2c136b22814c1e82, limb2: 0x7bb554d64c3153a281cca9bb, limb3: 0xc96ae7112c4fcbbec9b8aa3, }, }, G2Line { r0a0: u384 { limb0: 0x21718b60fc473e716eafc85b, limb1: 0x9d795b3e5f132e6b28bd1420, limb2: 0x230c617a1f1939de5e14916e, limb3: 0xd6e5a17494eef0f6f5292a9, }, r0a1: u384 { limb0: 0x4df092ad3168aa7309a0f840, limb1: 0x3684716b180e99dba33d814b, limb2: 0x8da65bf6335ef5d5334bbcc, limb3: 0x32e9c79961176987a08344a, }, r1a0: u384 { limb0: 0xc1fbf2667c5fa7319ce4a16, limb1: 0x68f6714721cc5ca5b7c73ef1, limb2: 0x83d080569297130b048d4121, limb3: 0x17bc92b9041c97dfaec6b1ab, }, r1a1: u384 { limb0: 0xa79cd7182a1acb1e6f50dc5a, limb1: 0x2c6556f9e127fbcc317c835d, limb2: 0x7999e470d6e66d61ef6794ec, limb3: 0xb0d35668e07a3c21ece5b1f, }, }, G2Line { r0a0: u384 { limb0: 0x5dfbb6733b7bae2cd8fe7e68, limb1: 0xfad07703ac888a36a918449b, limb2: 0xb0dfe86a8eda68e069b4b18d, limb3: 0xff9d3280ea0ae2bc1a16bf9, }, r0a1: u384 { limb0: 0xec78a036f504facd8058f68c, limb1: 0x5c39ce33984b5049e40e9d8c, limb2: 0xfad50ec5061cb2bbf69e1963, limb3: 0x13cb0a312ba23fd491df96fc, }, r1a0: u384 { limb0: 0xc3a4702619055f4a569d9968, limb1: 0xfeda6a11638cea2a1c5e2281, limb2: 0xb75b2fb16398aa452ee48bad, limb3: 0x122a32b337cdbebc26e83cc6, }, r1a1: u384 { limb0: 0xce433a5223f7bb71a1ca8add, limb1: 0x32b85c9ddd3cb79997c8ba1f, limb2: 0xfceca1b93cebc0e4f5a9bb4f, limb3: 0x415d57acc7c6067dcab343e, }, }, G2Line { r0a0: u384 { limb0: 0xb9dbae6102d4e69d8f0c607b, limb1: 0xfb3291d8083f2064c1847106, limb2: 0xe12abb8d6ae364d5e548d2d8, limb3: 0xd13fb257c65b60b84d69dd3, }, r0a1: u384 { limb0: 0x262a76b1f70400d242b037af, limb1: 0xf5ec7855301fada6c7376aff, limb2: 0xdfb032dbd72e3b0f13215bae, limb3: 0x355cd1872bb9b6ceb0d26e7, }, r1a0: u384 { limb0: 0x83e87b560159e417f772dd81, limb1: 0xcc5d152eb1acc8f395b2fbf0, limb2: 0x70f54dbac520fb59a3c0a3f8, limb3: 0x52ea47561eb3650d1ea0c83, }, r1a1: u384 { limb0: 0x38ba107df12dd0465e65a380, limb1: 0x73379dc19d2c9b110da0ef60, limb2: 0xdb2efde4cecd2207393ff551, limb3: 0x80cad1bed6ccfd10035d560, }, }, G2Line { r0a0: u384 { limb0: 0x82a3fc3c6acfa43dacc5385d, limb1: 0x74a6dea3d3d82cb2e7d0809d, limb2: 0xb13b36c9a8887107d9bcbc22, limb3: 0x12bf4764dd43d68b4ee7c590, }, r0a1: u384 { limb0: 0xa3289d5e4c4585384473a183, limb1: 0xe694ef0ceb4b6ce3bab92679, limb2: 0xc99ffcf812e3dfbd6a52420, limb3: 0x2a77fad7fdc79c5bb072153, }, r1a0: u384 { limb0: 0xa0db2fa814dd299768ed728c, limb1: 0xab435115dbe57ffc64c8bd1a, limb2: 0x1525c2e63ea09f54ec46655d, limb3: 0x4b8b5e2ff10023fd75652f, }, r1a1: u384 { limb0: 0xf7ba29be02b325489270749d, limb1: 0x323633723ff44396f6db5174, limb2: 0x5e59d6926ba24f7667e3255c, limb3: 0xbc49cf59ec0c71f768d3fde, }, }, G2Line { r0a0: u384 { limb0: 0x55806a498c4bf79112692a77, limb1: 0xb0e3ca4633d3674fbee6150f, limb2: 0x5f74060f8312ce5e6e7ae2e3, limb3: 0x627a1c0c6d61932ada0e832, }, r0a1: u384 { limb0: 0xf13ce1d6c89f358448ae8fa9, limb1: 0x2bc57ecfdb09522cc85b0ae4, limb2: 0xfca1f39d0523bbe5c335ee04, limb3: 0x100b085007be1ca2b9f6e8de, }, r1a0: u384 { limb0: 0x84a70d5b9caa99650569ad71, limb1: 0x87c6e59e8af90623339f1f3b, limb2: 0xaef7d53bb0b7d5984da19099, limb3: 0xa2289949724906f1ad55b14, }, r1a1: u384 { limb0: 0xf531a6fdd1f0b3b5f8f8e9db, limb1: 0xf34d77973a1456adfb71697e, limb2: 0xdb9f5ebde3d8380fabf4162f, limb3: 0x130da579ba0316f92d4eb58, }, }, G2Line { r0a0: u384 { limb0: 0x51c2086725a295f5da826c, limb1: 0x8e8e5baa4016b523e380ac92, limb2: 0xf8f0a4861e231c3b5075023, limb3: 0x140928f32cb86c6f5c226b84, }, r0a1: u384 { limb0: 0xf0d141ad0b7bc44ef62633e8, limb1: 0x2b6a68f294133ffde01b3622, limb2: 0x13b274b21d5c5cba67cba1aa, limb3: 0xeea5a9094bf616f734320ea, }, r1a0: u384 { limb0: 0xdf51feeca93575d2e24d49bc, limb1: 0x90e0b5a293fdf422b3c448b1, limb2: 0x360839c7ef270b0c5af4a6f0, limb3: 0x5608d87f36ff132d9a254eb, }, r1a1: u384 { limb0: 0x3c26d23f25273548bb7fc3c8, limb1: 0xd42908133adad40dbd5ef506, limb2: 0x316d03c0197cf510485c062f, limb3: 0xb23fbbe4632f9ee97df9c93, }, }, G2Line { r0a0: u384 { limb0: 0x41d73bb66d7139e3b2883865, limb1: 0xef3de396b8ebd92887d6ccc0, limb2: 0x6be980b72b3858425dcce9df, limb3: 0x45121179d8e49e1dd61f734, }, r0a1: u384 { limb0: 0x23508094efe1db2e43b826be, limb1: 0x290222e73653ec8ec2d5bf, limb2: 0xa8309daa11b6981ed784a3ac, limb3: 0x17056c5dd749562ffb9477aa, }, r1a0: u384 { limb0: 0xe16c9dcf214392cd7a09676b, limb1: 0x741b68da9729956259db5e80, limb2: 0x7307e417e88bef6b7886098a, limb3: 0x16fcf0d17700b504f863c6fb, }, r1a1: u384 { limb0: 0x99b0a3f78a184f700178b139, limb1: 0x4d6e3662d7810b3f1054bd01, limb2: 0x29fe9f13eeb06558d12ceb2f, limb3: 0x16aba426597166960c6725bd, }, }, G2Line { r0a0: u384 { limb0: 0x8208b44ee53a9fc7eb288388, limb1: 0x3456d09962a3dda5865a27a8, limb2: 0xe1f3e4e3ed8ef8435cfe3ae, limb3: 0x10a37b4e7c8061faaa5c01a6, }, r0a1: u384 { limb0: 0xf9d6db9a5ac46771b19e3ac9, limb1: 0x42c10987c49132e9a8ab8d39, limb2: 0xd7ad0c0bdd201b0be5e93e0c, limb3: 0x408dae3a4926d4a4ea397a9, }, r1a0: u384 { limb0: 0x653665fed5d98ea9f33e0757, limb1: 0xacfa712330085cde3f722ed4, limb2: 0xbe1fcfda554eb87530bf6559, limb3: 0x5462519ce1e048fbcbb22a4, }, r1a1: u384 { limb0: 0xc6e9de72771ebb73bc382c9c, limb1: 0x2b29a88d36211b1579147a2f, limb2: 0xabbad720f32d8b7ef4e5b528, limb3: 0xf16180bf4a1de636ac8ced8, }, }, G2Line { r0a0: u384 { limb0: 0xbd00656c6a03e40e7a1c96d, limb1: 0xc6ec405888aa450fb0aa26e1, limb2: 0x169143ae2bf37f999e5709e8, limb3: 0xd989153870f4c8ffbb5af7b, }, r0a1: u384 { limb0: 0x40bd6d526b0e08d58fa66010, limb1: 0x127a3c8ea6b5b2cc9f4dd258, limb2: 0x246398565166fcf21abdc99c, limb3: 0x1139b4d60c70c41df89895d0, }, r1a0: u384 { limb0: 0x1e0803443a2e501406221316, limb1: 0xd4ab19eaa32e432f1b5675e9, limb2: 0x550a6da9fb9787a1e690aa43, limb3: 0x38d29d1f1993b9d9e60f603, }, r1a1: u384 { limb0: 0x12c57cbf483c651473b1d989, limb1: 0xc895e14b9897f216e4d9f22b, limb2: 0xd7f570fe66cf3f673abc03c1, limb3: 0x18d84210d9b793e6acd217b4, }, }, G2Line { r0a0: u384 { limb0: 0x8a4878d8e2e133986b8ae1c2, limb1: 0xb9ede196be35fc25ca8764bd, limb2: 0x8926fe5d6d93f96dcd45bff6, limb3: 0xa9af73cd8f02d67fbac7c31, }, r0a1: u384 { limb0: 0xb4ac60395435ab8c101d3f66, limb1: 0x51b5668e81d774a523536aea, limb2: 0xaf6c3902dfe7d93c5cd7e0d4, limb3: 0x7de5b12d21d9cfd4b8f1bd6, }, r1a0: u384 { limb0: 0xdbbd341b7617d7da02f767cb, limb1: 0x390a6cdb0247c8b696f54818, limb2: 0xc5c4d82d35c4a86900b9c108, limb3: 0xcedcdacd1e4bfd4b3ec453d, }, r1a1: u384 { limb0: 0x2e1da9fa7b1e27c2eb90c1db, limb1: 0x1bd463826b9fd44f9af5c53c, limb2: 0x2d55689e4b07965f4b24f4aa, limb3: 0xaf0b738c4875f563f27ca2f, }, }, G2Line { r0a0: u384 { limb0: 0x982c093dd6a1f08c9f98f549, limb1: 0x206794a8b198598b7ce4fa9, limb2: 0xc888c728be45b57e38fb3778, limb3: 0x74283fe50724556c49ef237, }, r0a1: u384 { limb0: 0x96bc29f2bcc0f815c55c409e, limb1: 0xe48119617a07eb33ab893613, limb2: 0x908d162dc06fc4a17d248864, limb3: 0x1aaf38bbd8891856272de1d, }, r1a0: u384 { limb0: 0x858ef2dbf3b0abd9ee6b0dfa, limb1: 0x9b84aea4dc77001de4491c8b, limb2: 0x2fee669cbecc806510e5321, limb3: 0xc2698ef04170dd90fe9040b, }, r1a1: u384 { limb0: 0xf466f3e5f33a4d032ce1d26b, limb1: 0xa2dbc37e685f47b642da17b0, limb2: 0x4fe20a8b997927f5e3c81193, limb3: 0x106497892fbc54848cf8dc2, }, }, G2Line { r0a0: u384 { limb0: 0x20bd93c9da3e81a8eae945b3, limb1: 0x828fee23af9ea75d0a85e148, limb2: 0x4c1a1f1b862331fe27f8d9f4, limb3: 0x63d0d46e0d13c2b4089bfa3, }, r0a1: u384 { limb0: 0x5ec6828def657a6b3620ccea, limb1: 0x94ad61cdb2d72668197acef5, limb2: 0x7baee501930b611a99e46a0c, limb3: 0xddd9e2bdcf6001b73313233, }, r1a0: u384 { limb0: 0xf9278e7727717e399e585d1d, limb1: 0xf9eabf0071885c7038169d31, limb2: 0xd4503f9fa816f9111fbfeef9, limb3: 0x6ccdcbce5dab18378c8e683, }, r1a1: u384 { limb0: 0xcc90a9d15f39ccd673782c6c, limb1: 0x91a54145933733fa6a8282ef, limb2: 0x77a1d8952789f3aab595cf2e, limb3: 0x117809e3864b0f92e6bdfb88, }, }, G2Line { r0a0: u384 { limb0: 0xcfacd8bafe80e34c80895ce2, limb1: 0x405055a8e3556eec6fe19b33, limb2: 0x215e510b0585c12c7aa4b9fc, limb3: 0x166c8a8d92ddb160d84e3dc9, }, r0a1: u384 { limb0: 0xded38c78e1bdce8139c0c49c, limb1: 0x880be26de982752e92c7f3b6, limb2: 0x650ff5ae95115c46cf190034, limb3: 0xd28c9264d7943b90541cde8, }, r1a0: u384 { limb0: 0xa9b4b12b59c157302b9c1e03, limb1: 0xb3d4cbc18ebdbf27e7af3c16, limb2: 0xe0f12acb3615cb9a62039090, limb3: 0x1210b9dab7bac860f54963d7, }, r1a1: u384 { limb0: 0xa492048852bb2ceb97e408f5, limb1: 0x77848eeb1c67a40c581a3235, limb2: 0x8aa45235af23ebd968d454ab, limb3: 0x144d609bbd40cb1a61799523, }, }, G2Line { r0a0: u384 { limb0: 0xae465430a3b879fa609ed588, limb1: 0x5b4441a8cc9f013eb815c1f4, limb2: 0x110619006c872a26d93ba293, limb3: 0xe1c6863a7e22b68f50a2e01, }, r0a1: u384 { limb0: 0xa14cd671deb3cecf066b68ff, limb1: 0x146280483d10683e53e0af, limb2: 0x3ead8592a7548acaf49128b4, limb3: 0x91c35d9b0c4a0cbaa54de18, }, r1a0: u384 { limb0: 0x6f33a2c44245c7019c0c5c67, limb1: 0x5efc92747f401ead3c8cfc2f, limb2: 0x393adb0e0036514a75839cf, limb3: 0x1382a3bc2c35391ea4888358, }, r1a1: u384 { limb0: 0x1163e633ef6eb65ff47fe5f6, limb1: 0x43edbe5def5f4b8cb624def7, limb2: 0xe3d7d6469d9ea3ebd107f34f, limb3: 0x96ac6f3aea62de484fb9f5, }, }, G2Line { r0a0: u384 { limb0: 0xeef462793df87830739b58e9, limb1: 0xae7c8ea1ad71ca6bed2ebe00, limb2: 0x9ae2164a137a064d1df7f02d, limb3: 0x4a9888e14ac3625ff321114, }, r0a1: u384 { limb0: 0xc3c414c0d08ecbf15184e66b, limb1: 0xdde9cfcbdd2e00b615eb8280, limb2: 0x475a2c4bb26b585add37b2db, limb3: 0x91ef361ba4f2ff51c967890, }, r1a0: u384 { limb0: 0xd82fd80a2061263e1fd01764, limb1: 0xe1c1efac8d73b700b4f7624b, limb2: 0x4b66141becce9ed674af6eb8, limb3: 0x14fb9e8021f44b1eb120b9d9, }, r1a1: u384 { limb0: 0x4de7793b20d51e4f8fb8f053, limb1: 0xd7f28ae911fa3e1b6c0e60e4, limb2: 0x9d6970421cbe2f4d5c9c878, limb3: 0x3b7adf46bf35aebc482e388, }, }, G2Line { r0a0: u384 { limb0: 0x12f2b778d5fbab976bc57ada, limb1: 0x76459b21736fbf46a8970d59, limb2: 0xb94be6680c7126ca6efa8aac, limb3: 0x837f3c1bf89ea556baa0f1e, }, r0a1: u384 { limb0: 0xe5a3489fc04cbff07982f68e, limb1: 0xa191417243695b45f476d8bc, limb2: 0xc51a4550afd0e726501933a6, limb3: 0xf44ecd23806ed5e74169f54, }, r1a0: u384 { limb0: 0x6cd53a71fa2d57fc5af7daf, limb1: 0x2b428bc9d14c4baec9df8d4d, limb2: 0xc1cdc7f4f9547699b33a5d3f, limb3: 0x132932753bb6ce9737dd24b1, }, r1a1: u384 { limb0: 0xdc3e579e2d3ef4c042f7356a, limb1: 0xd176af6e739a4172c748084d, limb2: 0xc2d99caaf0cee64b95b74caf, limb3: 0x6c6e6c693605fab377449f9, }, }, G2Line { r0a0: u384 { limb0: 0x8453ae7d36f5618e254ad0d1, limb1: 0x7e8d71e845958e9741385a13, limb2: 0xad311639a622f093066fc3b6, limb3: 0x83a861cfac3d33a177738ee, }, r0a1: u384 { limb0: 0x3ad1bdc48790c12209582975, limb1: 0x8dfd29dcf52774c4f1845b52, limb2: 0xa02ac71b2c0dea50d477db6, limb3: 0x13a1c836ec6af306248cc909, }, r1a0: u384 { limb0: 0x14406ff512e0479dc3c8d, limb1: 0x96cd90daabf66287008c71f, limb2: 0xa60a0e779f3b9ee1551e2bd3, limb3: 0x12f79805baffe96832e3a077, }, r1a1: u384 { limb0: 0x647d4e42f9f13a7c0d7a75cc, limb1: 0x12effbcbf19df432e200c643, limb2: 0x1d18afbec71b6348e0977ada, limb3: 0x2a237cabc4f307c6bba9c62, }, }, G2Line { r0a0: u384 { limb0: 0x4a4ebb65d008e49339423340, limb1: 0xe8af68a1403ac4097334dda5, limb2: 0x60b3a6cae1c54f8ae1bce576, limb3: 0x13011c97e91f386caf2a2972, }, r0a1: u384 { limb0: 0x62af6c1bb245e69512982435, limb1: 0xe06e1b68f65815af7672ef87, limb2: 0x181bfb87298f6dd64c518b25, limb3: 0xc2c69e7df650d02bdb2088b, }, r1a0: u384 { limb0: 0xf21d1538741e50e9a499ac73, limb1: 0xacc6dd8bf4c874e1da1f0ae3, limb2: 0xcacde4e1801b3c95b1705651, limb3: 0x116971bf55359268362fb2c6, }, r1a1: u384 { limb0: 0x6da7f6a48d6e7831a983fefc, limb1: 0x103b747a61ed06984ee35089, limb2: 0x9fc5bf34c0740b9d08b104a3, limb3: 0x9e4768acd9aadafabe1415, }, }, G2Line { r0a0: u384 { limb0: 0x8f61f5ba0fa958bb27b0738d, limb1: 0xf241c01ee89f0223fae54588, limb2: 0xda4e4767658a0ac3abbf2397, limb3: 0x1469bf3b838495c457b871dd, }, r0a1: u384 { limb0: 0x6c26df5b82209295efa30f78, limb1: 0xa6d88fe2c2c7eb127399a8f5, limb2: 0x12a48d65bb7c320195ed2ba1, limb3: 0x2607291048cb4d7c8e364b6, }, r1a0: u384 { limb0: 0x62d61af0924cf04ab435ef0a, limb1: 0x411a7672635a9cb3f011dba9, limb2: 0x311966492e36c204118b8d63, limb3: 0x609e43c5745ab0721e69d08, }, r1a1: u384 { limb0: 0xca4ae7db7b1ef2f2a8338569, limb1: 0x7d8cdadb9652eeff7e0353a4, limb2: 0xc85f6a2486d9cea932ac87a5, limb3: 0x18bd575791b49a042112020c, }, }, G2Line { r0a0: u384 { limb0: 0x64282b3efaf71690d668de0e, limb1: 0x8781d985cfc29d3e8099fff, limb2: 0xb81331cc8b1997d037d2d7ec, limb3: 0x12235a5ac7f1d2ab9ae5b9c5, }, r0a1: u384 { limb0: 0xa29416594a6408df6161b6fa, limb1: 0x223f57279d16c8cceb28c803, limb2: 0x20c74e1a6bb7c6387a749de9, limb3: 0x118595f99d022878c5dfa242, }, r1a0: u384 { limb0: 0x4e37473da8164d9afb454170, limb1: 0x374f98a1cd8e5cb81d5d1588, limb2: 0xb1086185aa14c12e63aac04e, limb3: 0x1838f9c2473fb4633451cc86, }, r1a1: u384 { limb0: 0xd5d6e5aa8ca10362522318e3, limb1: 0x85d25f9b4b9506dc7a20bca9, limb2: 0x9bca10d7d717b218a1128f10, limb3: 0x145af4e6b53d5676e5a8bcc9, }, }, G2Line { r0a0: u384 { limb0: 0xf3c802dee19e24b92e7979fa, limb1: 0x14da8c307396b2b3098cc029, limb2: 0x81ec9801bc5a699e39b50971, limb3: 0xfbdf2094dbd982c4366a295, }, r0a1: u384 { limb0: 0xeea5bd7fc66ac332eef61a9e, limb1: 0x1b86742a4721e1ed6be9d082, limb2: 0xfc5fd3946f0cb7a618e7e452, limb3: 0x19be9789e6a4a595a557c8d5, }, r1a0: u384 { limb0: 0xd7e6895fbf700ae72769736a, limb1: 0x416c1c33622a357d679d913c, limb2: 0x35c8dd89e1eba641557b344b, limb3: 0x677c5a38ff37fdb4605b0bf, }, r1a1: u384 { limb0: 0x59bc57df21c9065dee74fe4f, limb1: 0xe251d5a312068328a96aee57, limb2: 0x20bb5ca4b72b1ae1df0402aa, limb3: 0xdb28c872b29f1111ff063b8, }, }, G2Line { r0a0: u384 { limb0: 0x7266c55e323eb5f523137011, limb1: 0x3fa2140fee350709e12cc602, limb2: 0x2ca6caaba6c036ac2a015fe0, limb3: 0xe6370e66a3639679d1ffaf1, }, r0a1: u384 { limb0: 0x673a512572f43dafc1fb3e60, limb1: 0xf17d9c9e1f0151e37745e09c, limb2: 0xb0231ba928984ff48f7c72ad, limb3: 0x116bc15d70785ac8e3dbaafa, }, r1a0: u384 { limb0: 0x54599fa912c2c83137391fc4, limb1: 0x3024f1a43f73ebb9f356f0c1, limb2: 0x3b1b2662cc9d943f76848e62, limb3: 0x129b0437839946397ba58144, }, r1a1: u384 { limb0: 0xf93d43a03e1c6787dcbd8285, limb1: 0x124a2f604da1317e5610dac6, limb2: 0x64f7cc1679a914abd36770df, limb3: 0x10f2e7649f93b589d8d4acba, }, }, G2Line { r0a0: u384 { limb0: 0xf82b6df19a54e2cf1cf2a926, limb1: 0x3f6e3866481525431265f2dd, limb2: 0x345f14dcadaceb6bd10a7737, limb3: 0xe39d5893debb54d49156924, }, r0a1: u384 { limb0: 0x45be1970d7ccbf809b2067d9, limb1: 0x5960a9502e5dd19b2764e96f, limb2: 0xb8c9075c1ab2fdacb6fc6965, limb3: 0x78f512de963787677e431a4, }, r1a0: u384 { limb0: 0x486d90dee20ae276acefbad, limb1: 0x804cd3f829f2603c900f701f, limb2: 0xe97e5fe9e95da08ce6ad0c9e, limb3: 0xefabe32ca67e113d82a9975, }, r1a1: u384 { limb0: 0x7b00323f1f5d9b1acde52435, limb1: 0xbba8c1970d071fde53462819, limb2: 0xaeb541c1bc202e4247d63d2b, limb3: 0x54e8ff0cede4fcd4bf670a5, }, }, G2Line { r0a0: u384 { limb0: 0x19deb207d5ed377cf6e1fc34, limb1: 0xa450925cc66369d7ac242254, limb2: 0x1c3bdc1e64a941a34fc053cc, limb3: 0x14df45de9151dfb3e06995fb, }, r0a1: u384 { limb0: 0xd1cb0605f648519c51a2896e, limb1: 0xfd5a32cb5433d9d638ce5f44, limb2: 0x22b95ccf2f9f474991447155, limb3: 0x1b6a551862dd5d0d0e23eea, }, r1a0: u384 { limb0: 0x29a5f4f5636af654cf00c5e4, limb1: 0xd06d14134a0604b5670c8754, limb2: 0x4f9397231527c3bf676603a8, limb3: 0x725540566667205b8e18667, }, r1a1: u384 { limb0: 0x4027b710692c5e378612279d, limb1: 0xde69c4a076f5a6558d86111, limb2: 0x3d32f4dcf1e86bbf40210871, limb3: 0x160b4757d533ef30f2094173, }, }, G2Line { r0a0: u384 { limb0: 0x391dda06f57de49c19a39355, limb1: 0x4e737dfa7ab368808331a160, limb2: 0x4861c22221cf946a7bd7ce3f, limb3: 0xbf98d2b99fcb852dee131ab, }, r0a1: u384 { limb0: 0xa908feaefe8603bc57fed5ec, limb1: 0x24ccd521287d21f70525b3f3, limb2: 0xb0c14b45ee675a30a02b03ae, limb3: 0x486ddefa539161f18afb8b3, }, r1a0: u384 { limb0: 0x2b55b06830bb4b7604c06419, limb1: 0xa5521e8fbc7d47ff6cee8649, limb2: 0x19044603e7a7fd14f2ca392f, limb3: 0x100534339fb750d36ddf81c, }, r1a1: u384 { limb0: 0x144ad61af74f6da85031acdb, limb1: 0xc4feb7056df7bd2d6526fdfd, limb2: 0xd35f577108fa47be0bac8535, limb3: 0x159564e4ac7dc0857b9b7f66, }, }, G2Line { r0a0: u384 { limb0: 0xf98d6dbcb3ea133fb4ffcaf2, limb1: 0x6fbf2c7d9fc7cb84bf8a4eff, limb2: 0xe62c313483fc5463bf3ed2bf, limb3: 0x19a9884ea34fe0126dee7e18, }, r0a1: u384 { limb0: 0xe817610114936f7ecee50446, limb1: 0xc04e0c4475092ba5e70435ef, limb2: 0x65469702b18d011ea024ca54, limb3: 0xa3d7efe3405b93e96bfced4, }, r1a0: u384 { limb0: 0x23979b215fbc5eb927025b3c, limb1: 0x7ee7ff729f1a2046dce0f71b, limb2: 0x6c54f503e474ccd1fd2c589b, limb3: 0x881ebefcd5614bf757db21a, }, r1a1: u384 { limb0: 0x8cf989efab414db4ca0337f8, limb1: 0x55fe112a2e13392491c2b191, limb2: 0x13e416c811005d1a3350cb5, limb3: 0x14037e0e1d38e15b73e0ca43, }, }, G2Line { r0a0: u384 { limb0: 0xbdb98a83e5729b997b8d9aa1, limb1: 0xcb52848e21e96dfd84afb236, limb2: 0x4fbaadb89ff456c79d956aea, limb3: 0x1940988caf75778db3d7b20e, }, r0a1: u384 { limb0: 0xcc4b3f78288f83db55b1bb45, limb1: 0xf5d2f34a4f2cbeaa75178684, limb2: 0x1aeaabf273db3651ed9a6ca0, limb3: 0xd1f255ae26606742036a4c6, }, r1a0: u384 { limb0: 0x16674b87da60cca57add5066, limb1: 0xf993170c807c39cb94b60722, limb2: 0x8b42bb6cde71360f572240e9, limb3: 0x5249854c68d1b2761d27c54, }, r1a1: u384 { limb0: 0x4c3ccd4beed240cca6f61f5a, limb1: 0xc68d54b38aa262727e982f1e, limb2: 0x3211c469594dff0cf9486c32, limb3: 0x10faeb3d4ca1e301b47ba93a, }, }, G2Line { r0a0: u384 { limb0: 0x2823c66648f4d481d8e005a7, limb1: 0xe856f0ae7cf3a85a214e662b, limb2: 0xc2dbe57f6a6041f9408548cc, limb3: 0x12cbf8243f62a684ffd117c9, }, r0a1: u384 { limb0: 0xf33c0f25f30965922b7a3d95, limb1: 0xad2490f1a91b92ec63c3a38f, limb2: 0xd9b3254082d06e13ed45ce64, limb3: 0x1599b9de0a9d639c47386266, }, r1a0: u384 { limb0: 0xebcd5f23a4c3dd5b3c831608, limb1: 0x37e0a6835ef506afdf7efa80, limb2: 0x72d6ebdd955d53e4bb3088a6, limb3: 0x1854c3c13966bc0d0b2cde14, }, r1a1: u384 { limb0: 0xe3107baa5208305dd296b362, limb1: 0xf06342a6f9251ee1e2036283, limb2: 0xe6612735f5fd5f25f4a18f0, limb3: 0xcaf6e119c91fc84ef1c1aca, }, }, G2Line { r0a0: u384 { limb0: 0x3b68bb1e9790730752af570b, limb1: 0x1edee4298985741a4c96ff, limb2: 0x2d734e175da7cf84fbafd3c5, limb3: 0x3fb948696ef0e166bebf412, }, r0a1: u384 { limb0: 0xb0b7e8d0f696fbccb5fbb186, limb1: 0x99de7fd4d64e41ad44bf9b5f, limb2: 0x4f51631e336cadb706f3a33, limb3: 0x11bba4f788fb1ded0e221b32, }, r1a0: u384 { limb0: 0x9eff9067ac9e819fc7057ae9, limb1: 0x1e64c6d4089a0fb2425a645d, limb2: 0xf94423c637381bbae316235e, limb3: 0xf2f15e92682cdfa72a52fd2, }, r1a1: u384 { limb0: 0xab9a26b00f30b21765b7547, limb1: 0x28c3c566fb6babb94109fa7e, limb2: 0x7d858033627814454b111d98, limb3: 0x155d1bd5ef23109cbf8c1ccf, }, }, G2Line { r0a0: u384 { limb0: 0x2cde708f0b8cd318fc67bee8, limb1: 0x9a95f572f0429539b3ce328b, limb2: 0x4a5d4d9fd5dcf9f241ecc4d, limb3: 0x19078676070364267ebcc3ab, }, r0a1: u384 { limb0: 0x98bd9f89de920ae0ebfb2406, limb1: 0xd738868806c46f20e861d034, limb2: 0x9b038050debc0edbc1be0e16, limb3: 0x1362dcdc65285d2c8c41f9c2, }, r1a0: u384 { limb0: 0xcd4657e749f4ffcadbb0d9a5, limb1: 0xd63c26d6ba8661d5080379af, limb2: 0xc809cd05f4b7382bc077b1ea, limb3: 0x12864d0dca4b400e2a95102b, }, r1a1: u384 { limb0: 0xd611a29ff543d96cf849bd1, limb1: 0x596407fe121213b4a8cc307d, limb2: 0x92d36061c70feaba71f789af, limb3: 0x499654f872ac06ea4a452bc, }, }, G2Line { r0a0: u384 { limb0: 0xb0962fbcf21139969e8dab25, limb1: 0xb0a19f7ca5f477871be73cbf, limb2: 0x88ad887afd15eae613675e08, limb3: 0x2a7b58589ca7b7e5b344396, }, r0a1: u384 { limb0: 0xf718c3a824df9a4081dd18d, limb1: 0x41e4ef4d528d6c4f5dceb1d1, limb2: 0xddf16e8d62dd032870008ad1, limb3: 0x1507f575d3c90144e8d7f643, }, r1a0: u384 { limb0: 0xfe658024d9e687959a028d31, limb1: 0xd2bb637f753e2d0bd6233ad2, limb2: 0x4ed4d8e0c9a61e71b74e8d50, limb3: 0xe8f6a3795714e66d7f76cb8, }, r1a1: u384 { limb0: 0xc99318a2e53111aa51be227c, limb1: 0xf6251383d887b2d7aa2cfed2, limb2: 0x4d90f6d24972610e5c13a0c1, limb3: 0x1047331dacc8b1a00c020666, }, }, G2Line { r0a0: u384 { limb0: 0x556da7f56ee0c7d62fc2972f, limb1: 0xdfb895df67fa4aee9235305e, limb2: 0x29439ced958130b5388abbca, limb3: 0x323dd9807649f00008b4087, }, r0a1: u384 { limb0: 0x874af1a436b6ade8baca63e4, limb1: 0x6d4f1a7e518069c3d2dd1ddb, limb2: 0x9c80fa9f1c0a2d348ee7b957, limb3: 0xd523391bbe3f0de1019fccb, }, r1a0: u384 { limb0: 0x1be5bbc51b64cf3dd26dd3, limb1: 0x2fa737161f1e1415d3938969, limb2: 0xafa9623233be5134ff59b5b, limb3: 0x28e491d31e52da5ff90caa3, }, r1a1: u384 { limb0: 0x4d3c3323d817ef85ac80e43c, limb1: 0x954d330e18b44f9a52f33c50, limb2: 0x452f1d366708c2dcbf45278d, limb3: 0x1511877d960dad5c4f4aa325, }, }, G2Line { r0a0: u384 { limb0: 0x336b741fc1583b606c65abaf, limb1: 0x73801a000b489b2200db6572, limb2: 0xf94c4519220a8cfc88edc539, limb3: 0x715c050a954cf814d0c7e0a, }, r0a1: u384 { limb0: 0xed5fbf1ab4cc40ac6e7d933, limb1: 0x30ba3c9eab6fe7baec2a6a88, limb2: 0x4afe67182f279cf5cbcb98f5, limb3: 0xad08242f19c0aaec787286a, }, r1a0: u384 { limb0: 0xcde708df2cf8ebba73c7b13e, limb1: 0x32efd2eb6114dcfe39c3fdf9, limb2: 0x81b46d9352a1d3283852dc27, limb3: 0x19ad0267f7bdaaf9986205cd, }, r1a1: u384 { limb0: 0x860109901150c0785eca2431, limb1: 0xa7bf3670dae1ad8a4f40d305, limb2: 0xb9bc1d54935166605ca85485, limb3: 0xde55ad5b86f0179f3a34e6f, }, }, G2Line { r0a0: u384 { limb0: 0x178379b18626f7f480996464, limb1: 0x9905457420bad5a85b9bee90, limb2: 0x1c27977000f53f2a05b4e4a1, limb3: 0x918842c5d9f1da6cf126741, }, r0a1: u384 { limb0: 0x27dd95e2844378ea90ebe5d4, limb1: 0x5af2fd2756e4dab52f5e77f8, limb2: 0xc2ba5de18b0385ce74c77b5f, limb3: 0x3c7fa5727ea8c9d646cae70, }, r1a0: u384 { limb0: 0xf0a44f50005dcf7588f02c02, limb1: 0xd971fd2f991b155467696d20, limb2: 0x699795f7b8975027f1e5c103, limb3: 0xda7f16c23b59fae7c41e66d, }, r1a1: u384 { limb0: 0xd00a3bc91e29ee6504078f25, limb1: 0x37efc549e098e4407c501366, limb2: 0xef8969c8bad5269a563c83e3, limb3: 0x149af36ce061f6aa56ee93af, }, }, G2Line { r0a0: u384 { limb0: 0x8a02b34e776442ba59c167e, limb1: 0x2cd74b2524d97b6dccb82f1b, limb2: 0x813ca4185e38eee5964aed07, limb3: 0x83cc2f404d857d442b3eabb, }, r0a1: u384 { limb0: 0x72463cfd186baad7a018e0cb, limb1: 0xa4cd63570dadb68f7d0309f, limb2: 0x57a086998740b2352d53fccf, limb3: 0x2aa02706d4bdbc65ac03231, }, r1a0: u384 { limb0: 0xe33b9bf1bff90857e4d61f2, limb1: 0x43eb7abde512fe176791dc98, limb2: 0xb4b49b358c9a901e40d5613e, limb3: 0x53d85ae1b55cab87293aa1, }, r1a1: u384 { limb0: 0x547181b3fa66b2639ec8caac, limb1: 0x97a64032085b2c91d1c492b9, limb2: 0xdbd11997d43e3e57e23c4cff, limb3: 0x19e0ef65ce0442faf2567108, }, }, G2Line { r0a0: u384 { limb0: 0x3b4f86ee4171fc73a46c3d5, limb1: 0xa2c3a70144a8b213482fb90d, limb2: 0xfde12864b1671fa86d9e0211, limb3: 0x8488e6d72cc9f99996e3a7c, }, r0a1: u384 { limb0: 0x58bac66145ecf6b1dc4652e9, limb1: 0xa08c279a9dd3f9a27307a28f, limb2: 0xe0480f382a930c0e8da54894, limb3: 0x1093a6faac45157511eda7e0, }, r1a0: u384 { limb0: 0x8fff8e258c6a2d1b179b7217, limb1: 0x3ec2a966483e686b172d6b19, limb2: 0xb696ff28222f0abc8d46a4a2, limb3: 0x1099a36e837c296a95743dee, }, r1a1: u384 { limb0: 0xaddfe6fe51ba3ef44b12dbda, limb1: 0x94ca09358ab5dad1607c1722, limb2: 0x44926a8ffea15646ab1221f9, limb3: 0xeb0d8e1ff3518df3041efbd, }, }, G2Line { r0a0: u384 { limb0: 0x8e63a441663872dab66149bf, limb1: 0xc9c87bf6e55ee4471ecfec00, limb2: 0xce8ba5b12ef7950e530e6751, limb3: 0x19036c37239205542fb77256, }, r0a1: u384 { limb0: 0xc4c23871cf570d2ac86cac95, limb1: 0x3cff66372097c68451261af3, limb2: 0xc6ade94f8c28ebe4007e1343, limb3: 0x19e7ab14be7691a66ed75c31, }, r1a0: u384 { limb0: 0x604f0bcb1b846c57953baa9e, limb1: 0x81dcb277c4e97ebdd4596d05, limb2: 0xae63997c93fabf23479283b7, limb3: 0x1812ad42cfda1a8d608a6116, }, r1a1: u384 { limb0: 0x904a9370cc89b6f966b5aae0, limb1: 0x159ebfaa5d240591de06cb97, limb2: 0x1cc1851722f8ad2cf22893d5, limb3: 0x728ade3923670c3bdd7beb4, }, }, G2Line { r0a0: u384 { limb0: 0xa3dc1ab42d89ae8b325d427b, limb1: 0x1d7c740e46ec4306e2c88619, limb2: 0x31f7d47a027e479d085e880a, limb3: 0x5de6db9ee0cfa85a151a83d, }, r0a1: u384 { limb0: 0x8d9cbdbdeadf4d81f185a381, limb1: 0x580bb622f9f0839c77a2307, limb2: 0x5ccee07b4991bd23a307fa07, limb3: 0x1616ef86618ac2b7bbeddf56, }, r1a0: u384 { limb0: 0x9ae8b66048d7c97f8fab821b, limb1: 0x6b496e9c0cb601604e75d0c7, limb2: 0x5eed49d86cf54de1b281d764, limb3: 0x3d6513d6bc7bfd76157ec98, }, r1a1: u384 { limb0: 0xdcfb80780546b77cc35445a8, limb1: 0x125d7b294e98c0c435a793a2, limb2: 0xeced02d3114a1a1a18ca079, limb3: 0x163a49c9922df63143db81d9, }, }, G2Line { r0a0: u384 { limb0: 0x9c25e08fca582713a30bf8e8, limb1: 0x5498ae20a6a534f378b69831, limb2: 0xdd783a5b0f0ef9a3ecb74589, limb3: 0x117d7480f71ac945bc135958, }, r0a1: u384 { limb0: 0x23f20c0260568db93332cad4, limb1: 0xf9be3edcad2f716ad354398e, limb2: 0x8abd8e1084b21e076745f42d, limb3: 0xd031732c8c7513d0693ced, }, r1a0: u384 { limb0: 0x50ecf31bd9798a48cb2540ef, limb1: 0xe9b082486d639a35ab8978d9, limb2: 0xd12e8e3b5ec44cb1f5af7edd, limb3: 0x138ba5e28dfbae00af4b5c95, }, r1a1: u384 { limb0: 0x393d55e2e0bca3a82c44cf73, limb1: 0xf199ae3baa3ab94c0bf97ab0, limb2: 0xccc3be3d6bd86ddbebf34569, limb3: 0xa562acfc71629deae99dc04, }, }, G2Line { r0a0: u384 { limb0: 0xa32020fc5c26aa2b2c1872a9, limb1: 0x99317d0307ad5ea842fc68c7, limb2: 0x930db91b6ede96bd9c4fdc5d, limb3: 0x102eac12776a8bcf9d8023d5, }, r0a1: u384 { limb0: 0x731ff75a1aba2fa146f52ca7, limb1: 0x284943eff7736f26174d9b1, limb2: 0x1198d0b9e569464a497c9a09, limb3: 0x137f25b5a84c95068af34ad7, }, r1a0: u384 { limb0: 0xe863956a16770c315872a7dc, limb1: 0x436b0e50fa85dcad5cd5a349, limb2: 0x3a801273d99a2fe4d30db9af, limb3: 0x1860701c9eb068113c1ab2b4, }, r1a1: u384 { limb0: 0x8662843a34c684808e361fc8, limb1: 0x5a38428f88ac5961d9f00e31, limb2: 0x6724f856869e9567aac72def, limb3: 0x6bc151d66baf82f909ff2b0, }, }, G2Line { r0a0: u384 { limb0: 0x5527d5630ba777b1fb4ee088, limb1: 0x7e6df03522ab95222d3ffbd7, limb2: 0x307862552a41641cb0ddf50, limb3: 0x12b662fd55c1871cd2294f80, }, r0a1: u384 { limb0: 0x2ee9236fced8ab9415122d9a, limb1: 0xa76214b949312091aa6358f0, limb2: 0x7df6f68f1a8701aea18b9ec, limb3: 0x5befdc841ed311c388e2df2, }, r1a0: u384 { limb0: 0x2b6fe7920b18941913c6655b, limb1: 0x78fd904d62559b1e4759ea15, limb2: 0xd8f1c747d3f90ced746ae347, limb3: 0xa64d1afe8a82475a30e8c7d, }, r1a1: u384 { limb0: 0xff554fd5d64a021bfbc00bf2, limb1: 0xf32efdc99923446fcc7e7ce6, limb2: 0x3d912c666b1ef6b2946fb5a4, limb3: 0x170c583c65e55b93944cec32, }, }, G2Line { r0a0: u384 { limb0: 0x951a4e431316ff50c6482c4b, limb1: 0xfca83ba8d8ac3648492339b3, limb2: 0xe58171dcd987509cb26871b3, limb3: 0xbb9bb5adf70482b97a3bb0, }, r0a1: u384 { limb0: 0xbd34770ae9d9ab5889638f6e, limb1: 0xe560cf49df7557f1fc4789e6, limb2: 0xeaa7805774b72bcb87190c5d, limb3: 0x3cbee01dd125eddb941d5ef, }, r1a0: u384 { limb0: 0x2591fb43af877979ad4813b8, limb1: 0x644b55586a6a840b039947d4, limb2: 0xf8fbb480986ffe538209ee87, limb3: 0x3ad1974c3abfbbda2f04c39, }, r1a1: u384 { limb0: 0x93e4c00d261450378ac274aa, limb1: 0x660682ced30c45a709bb61cb, limb2: 0xd1bf1cf243b7b502956d9c37, limb3: 0x10ba03cfd910b6debea99ca8, }, }, G2Line { r0a0: u384 { limb0: 0xb6c906d97aab5e1a9eb8c32d, limb1: 0x85329037280ec3157df623f7, limb2: 0xd9d95abc41d2db2aad018e4, limb3: 0xe54818adbc0e75e37818e30, }, r0a1: u384 { limb0: 0x94754dd0167e9ff97e8becf2, limb1: 0x670389f4b3b102ef1b751a27, limb2: 0x77799f6977420d487566d73b, limb3: 0x4a016e9a4cb18014c34f16d, }, r1a0: u384 { limb0: 0x410ff00026087c2dbdf2fd58, limb1: 0x9ae51362dd988b2c6ebf5a13, limb2: 0xb13af64f748c9aede0307bb5, limb3: 0x5cd4ab58201d40254203f2, }, r1a1: u384 { limb0: 0x6555f91ee569a8afd438101c, limb1: 0xf3912880056e4067cad1d751, limb2: 0x7a68681bcf4416fbed94065d, limb3: 0x21c29689b9032ed40de3aa7, }, }, G2Line { r0a0: u384 { limb0: 0x9cb6410ea1c244cf91261620, limb1: 0x9a0ec70e2e435659f0b82aab, limb2: 0x6bdf6b76e92e374094dc4bff, limb3: 0x17c071fbb0cd439df25600d4, }, r0a1: u384 { limb0: 0x9306de6711a91e50165883e1, limb1: 0xc18e08efb171501bbdff0cb5, limb2: 0xfd1e6d2d3a2460d3410a52e1, limb3: 0xc2b3cc424e21932b681451b, }, r1a0: u384 { limb0: 0x5d5dd56986bea0e5134b28fe, limb1: 0x18fd0b9680274cb30e18754a, limb2: 0x4aa4b6112cb15d07ef827dfc, limb3: 0x7654a15e3407ca6bab2ceda, }, r1a1: u384 { limb0: 0xee1aef22ef67624ae4234d51, limb1: 0x55866c74019cad949d30560f, limb2: 0x8bf24af5437a7ba1a934e0ff, limb3: 0x16b7dcb84dde31d6d6ab26c9, }, }, G2Line { r0a0: u384 { limb0: 0xdb7c2f40b16d97db7e13c229, limb1: 0xdff1cd4ca577396b6b70b26b, limb2: 0x1cd9cfb3a94fbf15cb93100, limb3: 0xfefdba2cc25f2c9988106fa, }, r0a1: u384 { limb0: 0x62c89065b22acd9971ee6c13, limb1: 0xc625f36141a3b56449a77e6f, limb2: 0xa5493f44e855a7cb66dd8bbf, limb3: 0x12c14460b44cf28ef342f8c5, }, r1a0: u384 { limb0: 0x60b1fdd98b736e288380b2b, limb1: 0x63aff4cef5521d0cdae1528c, limb2: 0xd36d721112740df1889366c, limb3: 0x11495a9a17f547466be11d96, }, r1a1: u384 { limb0: 0x193d4800d3bf3ba99b4873cc, limb1: 0x7f5f89e476bf6b18eb5921b6, limb2: 0x5cb3d8ee744c61fc500e6d7a, limb3: 0x1523763cf6be6e71c2d91f96, }, }, G2Line { r0a0: u384 { limb0: 0x1aa12c881d544bcb37558850, limb1: 0x63144f19ff872a71e030cc70, limb2: 0x48ae38b0e1add101ce20c6f3, limb3: 0x19ff58260aefd123e7ba2a8, }, r0a1: u384 { limb0: 0x7ced7c5b08862b085468314e, limb1: 0xa13dbc7202177828765c874b, limb2: 0xbed3e3698263832c713811d3, limb3: 0x292745a86de12caf184cbee, }, r1a0: u384 { limb0: 0x8c959e86f45c34c2a6916d1b, limb1: 0x9f18192cb102d0ff3966b40e, limb2: 0x52e77aa983872d849ff8d43d, limb3: 0x48e5858a2e8ae6f1bc52341, }, r1a1: u384 { limb0: 0x3ac200354363217e43902841, limb1: 0x171fc3dfcb35d029c4833069, limb2: 0xfcbd684ba325147b59f94274, limb3: 0x730542a2728b9e2dd2070a4, }, }, G2Line { r0a0: u384 { limb0: 0x3bc964d3cbdd70ad2e06f5fa, limb1: 0x9e036ff6ff547b6bff393699, limb2: 0x297502ec4ddf92bd4a493750, limb3: 0x73084817d704764e798e635, }, r0a1: u384 { limb0: 0x31809caa85fd1dee70633314, limb1: 0x6c523cb1d6d1fa98de5a75dd, limb2: 0x1aa4873cc1858c15952ba162, limb3: 0x14849b1aabca26d959441cde, }, r1a0: u384 { limb0: 0xacae5867577225d72b8258bc, limb1: 0x96a4b24a109f241ed9c103e0, limb2: 0xe3442c632f299305679b0bca, limb3: 0x14d7ce3b603d1e7cd7e2361a, }, r1a1: u384 { limb0: 0x5e1f793ad67dd2264e64d9, limb1: 0xadfd0cda9704c46e93b68319, limb2: 0xb34174c0ba3f0e5690b4f12, limb3: 0x7cead3683efbab7c7c3a775, }, }, G2Line { r0a0: u384 { limb0: 0x999071a9101732d492061a90, limb1: 0xe63f37b3174c5f1297e235f6, limb2: 0x95b88eed7507ce097bbe89ca, limb3: 0x163149501da9846df4670d0c, }, r0a1: u384 { limb0: 0x9e9d3eddfe0b0aab2fbec0c, limb1: 0xfea1de933107fff354bc0f3d, limb2: 0xb517bbbc647a7ab824f4e848, limb3: 0x170b612b36fc686c2e694d29, }, r1a0: u384 { limb0: 0x7fc55183f351dd4a9d52c0db, limb1: 0x2912e3b30839b48a933c3e5e, limb2: 0x39262021239a1090055cd429, limb3: 0xec3a57880804fd3f02e825a, }, r1a1: u384 { limb0: 0x99b5fb13fc76d8a2c2cfa88d, limb1: 0x2af93378b2e0d8d194604349, limb2: 0x832ee1f724befe4e41349494, limb3: 0x2a4caaf73deb41cddeb1e20, }, }, G2Line { r0a0: u384 { limb0: 0xb4c0e53b8b85b70fd397ca9, limb1: 0xf81023bcd84336ba486bbb69, limb2: 0x951f292517f80fefb53ce43a, limb3: 0x1854db111892206ddcc7d4f2, }, r0a1: u384 { limb0: 0x7d3f4d9b31edded71452fa4e, limb1: 0x1d7efee57fa90e3a87b5bf30, limb2: 0x98b4bb185fadc2115844beb3, limb3: 0x9323c26174a9528c0078a0c, }, r1a0: u384 { limb0: 0xcae0056d355b9f6761bec260, limb1: 0x761aac0270bdc92cbcffd5c3, limb2: 0x7eeedd0df5c8b1cf9b25033, limb3: 0xdf44e5cb05d7ac7267fca21, }, r1a1: u384 { limb0: 0x2c618c362b029fd18c70f772, limb1: 0x16872fb729361313dff53d74, limb2: 0x83abe31b8bfade90e907f78f, limb3: 0xe38ce80ae574859be5b287e, }, }, G2Line { r0a0: u384 { limb0: 0xc483cab3af32b8cce205e87d, limb1: 0x9d2a45392f78c5e530451785, limb2: 0xdb6c59ed5b82f4de76b7256b, limb3: 0x47c81e4cc5e1c5d2ff3dfb7, }, r0a1: u384 { limb0: 0xf7f0999a8a0c2078daf563ff, limb1: 0xf801e673de7a6681d0ad832c, limb2: 0x6dd8755c6b9fef053dda67f0, limb3: 0x470082fac490f7d8ff83d05, }, r1a0: u384 { limb0: 0x1d9f096b1cdfa9d92f3ecd86, limb1: 0x303cd4299b5599615f34e12, limb2: 0x4d28fad42e2136274fc22ac1, limb3: 0x42ad6e99b972ba7faaccfa, }, r1a1: u384 { limb0: 0x7d9d2503df48b7eb05d6cc13, limb1: 0x6a65472b48aff35a2ae3a9d3, limb2: 0xcbb040de22bd261b17829a93, limb3: 0x2f359c6ff6e984beda9b4e0, }, }, G2Line { r0a0: u384 { limb0: 0x3368b59a608905f593717f6c, limb1: 0x9fadc99f54479421462b44a6, limb2: 0x7ecc879dfa7e889b09cddc25, limb3: 0xafacf2a7a033583c7e9d920, }, r0a1: u384 { limb0: 0x284cfbe8d68936e4fcc5e83, limb1: 0x65a8a02635080d8565116a03, limb2: 0x7a868f131cbcd89142de7559, limb3: 0xcc53ca2497099a56ff098ff, }, r1a0: u384 { limb0: 0xc58cbd4b283cbf3eff21b78a, limb1: 0x67dd7b9f8984e236e1c6b51c, limb2: 0x3e6366a0c97a444c9defec8d, limb3: 0x11132f87bc1acdb72deafe50, }, r1a1: u384 { limb0: 0x538f361d8e86e4617e6a5770, limb1: 0x8538c52255d062c8dd6b6a6e, limb2: 0x3cf6cfda020417393f068a01, limb3: 0x2dcc10794cec979dc66f076, }, }, G2Line { r0a0: u384 { limb0: 0x91346b567f76364e14397802, limb1: 0xe4669ab6c6c801868ea181c9, limb2: 0x69e8ca27aa64f9b9deff6b5e, limb3: 0x1324fcf625329027578f8a1f, }, r0a1: u384 { limb0: 0x1b90c202de3c543db443916c, limb1: 0xa1b60baac0c7858225ee8f4e, limb2: 0xc122c8ac8d01fa4f77561f6d, limb3: 0xbf8ce24ece91062b1fafaa0, }, r1a0: u384 { limb0: 0x349aa436731d52ce8143d7fe, limb1: 0xf01f24c451c7f3cee4523ba9, limb2: 0x95aeaad6f40e28638278856e, limb3: 0x11018272ddb0440784f09552, }, r1a1: u384 { limb0: 0x44f1642d198d8ef7cc740f99, limb1: 0x3fcb198297333fc4f5188eec, limb2: 0xf9355343a13841f641108327, limb3: 0x7ca3e5d510ac999944827d5, }, }, G2Line { r0a0: u384 { limb0: 0x1ae539cd3d5bfd7479374a3a, limb1: 0x99986d947095a5d0e52d8cb4, limb2: 0x85c3a70092a1328677770181, limb3: 0x191626fe1a2306ec9140df49, }, r0a1: u384 { limb0: 0xd60992cc29ba925f57b9aa72, limb1: 0x6f5f37c85cf18ccb3f47bef6, limb2: 0x11dfbc1091ccdc6b21563041, limb3: 0x371c988f9b10c65bd6912, }, r1a0: u384 { limb0: 0x6ab68e6eaa011a274ade6247, limb1: 0x53c650901cf6547029586264, limb2: 0x217b97d310aa75843d576b00, limb3: 0xb34674dd9565502f88c2310, }, r1a1: u384 { limb0: 0xda421691cbe1d6e42d607a17, limb1: 0x41918f135ebf00991f4ea5f, limb2: 0x3b96c0b3672bee4ac88cfe38, limb3: 0xedebecc6bc8087f71261d0b, }, }, G2Line { r0a0: u384 { limb0: 0x5708387c81243d8656ed877b, limb1: 0xe445c9668475e7ee6a220c3c, limb2: 0x9a5616be12b5ca329b1e9351, limb3: 0x98439dacd980beada81f775, }, r0a1: u384 { limb0: 0x24153e1576aac5b27c520a25, limb1: 0x63099212876df906160f0bdc, limb2: 0xacf518d04b54fb97a80223a4, limb3: 0x159baddef0ddc9dbaabfa621, }, r1a0: u384 { limb0: 0xbe25262bec154dfef1428866, limb1: 0xa2c787ef175bc996f0b35f95, limb2: 0x32b960ca398570da22485f90, limb3: 0xa5eda48d9b501ca3e565fdc, }, r1a1: u384 { limb0: 0x575e126dbb7dd3b0bd23eb9d, limb1: 0x1bc5525abae24ad5be772bf9, limb2: 0xe8d0e48a8737f58e7d56d4c1, limb3: 0x1045e77f326c79fb8086ec53, }, }, G2Line { r0a0: u384 { limb0: 0x6d56d1252725e7f5143c8590, limb1: 0x35d67756ade4dee8f8be255e, limb2: 0x303dfcf0cbf0761f5a085ccb, limb3: 0x5ed54990f1521085b462863, }, r0a1: u384 { limb0: 0xd8f454dda993b61de297e66c, limb1: 0xcbfbf6b7b48d4a55bc672a3b, limb2: 0x4ff1328c6462d1fc71f2c955, limb3: 0xe481de1284934419be4f77e, }, r1a0: u384 { limb0: 0x4ae8cd7c0c3d1c169a6bde1, limb1: 0xe5ced7984c11e16ac61e6337, limb2: 0xdf6341c367b3c11a34785533, limb3: 0x66193e648c407cda52b0a86, }, r1a1: u384 { limb0: 0xd5108a1ee2d649a19acb66c8, limb1: 0x360824b595c0ceb4ffa2eef3, limb2: 0xb954a7a4dbd0ba9344fd0c57, limb3: 0xcfb3335779d608b47dbc5c, }, }, G2Line { r0a0: u384 { limb0: 0x1905660330e264ffe1201088, limb1: 0xe77ab0740f1c3b23f0f51f50, limb2: 0x8ef7cee645865d3da96ac0e5, limb3: 0x168ed09f27759e0ce04c9746, }, r0a1: u384 { limb0: 0x55d57a2fd6abd06bdc4937b0, limb1: 0x26e6337a256c5d0b5a1afd47, limb2: 0x3ac49416e71b8427f2562fb1, limb3: 0x2ff671352fc439126c3772a, }, r1a0: u384 { limb0: 0x8fd316a93a09f110e6160238, limb1: 0xdd0daafc6ed6c95aa1b344b2, limb2: 0x210b615efd4970d9dbc58783, limb3: 0xf448d964ca7f8796e644e2d, }, r1a1: u384 { limb0: 0x29b9f2bc42f2ffd5005f5eb4, limb1: 0xc48f2cbd47015150e31a4823, limb2: 0xaba30fd7d93d1e7a0d228fb0, limb3: 0x135a194d7581a97a56598750, }, }, G2Line { r0a0: u384 { limb0: 0x92836260b75c579dbd14b12a, limb1: 0x620b095c36717ab6852efa2, limb2: 0xc1eafa05172755028bd35b2, limb3: 0xe5b66fa93381b5aed7bb46a, }, r0a1: u384 { limb0: 0x73e4e9ac5f5bd83e9aa5959c, limb1: 0x36949ed94590d0197fc158ab, limb2: 0xc2ef7657cfb98405cb7ebeaa, limb3: 0x8445f154af158efd856e68a, }, r1a0: u384 { limb0: 0x581c26803b5b1f3e199f7ab2, limb1: 0x5ae8d3853d0699834c85d670, limb2: 0x8ad634ec4b30b96b6a80383f, limb3: 0xd488f35f949c09cf57164e7, }, r1a1: u384 { limb0: 0x55c31b3cb4484c5bc1ae6cca, limb1: 0x866f2857d1cfd432a2e31087, limb2: 0x5d00ff10ce51b502176df865, limb3: 0x172fe3e278748039822ecdca, }, }, G2Line { r0a0: u384 { limb0: 0x6a6472287dda67068ae6340c, limb1: 0x3cfc2833599fdfa121b9fe7e, limb2: 0x31ff610147c17e23f45b5486, limb3: 0x185130e4f785abb0619abe9, }, r0a1: u384 { limb0: 0x4393bed022a497d9346164ac, limb1: 0x130b9265e6e5ee1c7df031ce, limb2: 0x6715f0b4d6099b750a24d3d9, limb3: 0xe91da3136cb53d96c595b78, }, r1a0: u384 { limb0: 0x55fd3f010688075e5978b14, limb1: 0xff1b2f45c9d48fef7bb2490d, limb2: 0xfada4a38c5e40aff5c0b0c19, limb3: 0xcd1bf218916e21b0b11b7bd, }, r1a1: u384 { limb0: 0x6694ff2e84b88d0b28a86c7, limb1: 0xdbed6debb000097d0d7aed0c, limb2: 0x135d21c4bb6d0ca7d8768c31, limb3: 0x187a63bf7554a98e6d087717, }, }, G2Line { r0a0: u384 { limb0: 0xbf20ae5e2142585ab87496b2, limb1: 0x66dbe973ac92a361793c678e, limb2: 0x34adbc4eee58df2265649a7a, limb3: 0x161986b067ab47313f14f315, }, r0a1: u384 { limb0: 0x5dafd82ea5951b1700b85fd6, limb1: 0xa032df8c5c8b6ff0c82d4335, limb2: 0x5e9d0d2cd37437c605b9ca77, limb3: 0x713edf121dafa633e361a77, }, r1a0: u384 { limb0: 0xf48d3a8c3104532057ca25ca, limb1: 0x6dbf987d3174e477ed32e3dd, limb2: 0xc4a4c6d77d33f0cfd64ea3da, limb3: 0x36c11e29cc4fb647a958057, }, r1a1: u384 { limb0: 0x1fbf942fc96f0157cf750797, limb1: 0x6c1aa4ccb2d753301f746dcd, limb2: 0x4d09e39cd306fe441eea9bc0, limb3: 0x5a5d219af2a34e73631f810, }, }, G2Line { r0a0: u384 { limb0: 0xcc5753fa5f9c2031b7c52b48, limb1: 0xc05b4af7e1a54143e7ade2b7, limb2: 0x7b585f7f4937d5d56ee06a1d, limb3: 0x9c88d19f51226766b5fc7e1, }, r0a1: u384 { limb0: 0xb7e478b01ca956db521aff83, limb1: 0x6a187593d50cc4f027e11347, limb2: 0x462960288c2ed800cb8d93f9, limb3: 0x36e4e0fb04b76c200f8fb8, }, r1a0: u384 { limb0: 0xf9710b97ef78c7473b8a09da, limb1: 0x864cfcbe4725c0b6928f2a56, limb2: 0x6c695406b9c701a19ff65fc9, limb3: 0x79d5669429ce771f3e3dab6, }, r1a1: u384 { limb0: 0x8ec637f338c24ff852fd062c, limb1: 0xdbe45df89124a93faec45927, limb2: 0x7e86298f4efebacdefb4fb7e, limb3: 0xdd88cbee8b074de30e60664, }, }, G2Line { r0a0: u384 { limb0: 0xfcaec442440567fbd524afd3, limb1: 0x8a98d6814b4e1a9d7cc758f5, limb2: 0x2f760e54677f2bfe70729dda, limb3: 0x10d9b23a3b0bed118a63da40, }, r0a1: u384 { limb0: 0xf8ddb0878dacb7f806e628f6, limb1: 0xa92656b5a22485577c56af43, limb2: 0xc1966ef8fd5955d77fe82334, limb3: 0x14241c193aeb87dabd157fcb, }, r1a0: u384 { limb0: 0xe24c327f129ea9cc0c685f56, limb1: 0x2cc19f72e94fdb6bd9c760af, limb2: 0xf2d5c5f0374a2fc038365379, limb3: 0x1878ead2b6e1e7596ec4cfde, }, r1a1: u384 { limb0: 0xbe9a8c83f17d63b11ec592f7, limb1: 0x333dabd959a73409e3af6512, limb2: 0xc6a319cf5c77477ad20fb93b, limb3: 0x702610944a3a8ae2f03176d, }, }, G2Line { r0a0: u384 { limb0: 0xe3f40bb32c0c05422e341419, limb1: 0xf98709366139095ffb68876e, limb2: 0x2674c9dda9d7a090002bc885, limb3: 0x17eae9f6a6302f7703aa443f, }, r0a1: u384 { limb0: 0xe2dd70013040cad06ef5ca86, limb1: 0x42a8d956ad95aea9367a1f5f, limb2: 0x9810ea523e0cf2253013f127, limb3: 0x8bbc56ac77f83287136e63b, }, r1a0: u384 { limb0: 0x9b99afd48e0d94cbff84eece, limb1: 0xe1b581098b2ccd1c8955a1eb, limb2: 0x5f4e293d975fca4259bf4fd7, limb3: 0x5580f5ed24c4fa4f4a1dad5, }, r1a1: u384 { limb0: 0x9576941ab7748b52d007681d, limb1: 0x90a60953d0871a846ab3b1f0, limb2: 0xf79279b4da9f3433f8099425, limb3: 0x195f49ffeb41a4213cda8f46, }, }, G2Line { r0a0: u384 { limb0: 0x90cef5ee61e6df7a454608fe, limb1: 0x88fe96f3b500db97a43de2d1, limb2: 0xa5d6accf5ccaa42fe16a3992, limb3: 0xae32950a755162ce529df78, }, r0a1: u384 { limb0: 0xf3ae985d887f474aa5877b76, limb1: 0xb8547eba672182699a37b51, limb2: 0xb7c251f43cab02164068b78f, limb3: 0x174654a7bb0641d12855a77f, }, r1a0: u384 { limb0: 0xf753460ade95181364d2f3ea, limb1: 0x96a3ec0badb9f7367bde0aab, limb2: 0xff4d25450e90338ada3905d3, limb3: 0xd5c3971a419820ff1b7cccd, }, r1a1: u384 { limb0: 0x3f1ecd361055779f1b53e7b1, limb1: 0x14d20a7dda52d2825dbf9837, limb2: 0x14a64436c97c743580f85855, limb3: 0xdfc88a6d5eac1b6de8191f, }, }, G2Line { r0a0: u384 { limb0: 0xae56b988f4758a522dca5a4d, limb1: 0xae3d0e7e09190f3609c309cd, limb2: 0x47682787ec998873eb9d2407, limb3: 0x1450b662024978043b49dc8d, }, r0a1: u384 { limb0: 0xbb90fcac5a679687e056e1ab, limb1: 0x346bb08e621a7eb5bfb4fac4, limb2: 0xa4f760e0f167e1a1bd40c3f, limb3: 0x14844a685948d595d4670e4d, }, r1a0: u384 { limb0: 0x30be8b4bacb9ba7ed94ecc16, limb1: 0x39660a59eb1229ceac4b77b5, limb2: 0xa7c51a2eb736180af609d139, limb3: 0x3565a224e9d4c23eb077b2f, }, r1a1: u384 { limb0: 0x8439a957b7e57d9a49eebba6, limb1: 0xf61f936d1748fd0836c435f9, limb2: 0xe02f71c8ca4c526df790cfac, limb3: 0xc873450002e03b8fbae2d85, }, }, G2Line { r0a0: u384 { limb0: 0xea2aa2ef798d63dae1ad5987, limb1: 0xc1cc74e5c2033001dbfb3d2a, limb2: 0x84aca7a16c78c31ed8f8ed89, limb3: 0x14dccb954adf43f1f8d66861, }, r0a1: u384 { limb0: 0xc582e31d76536e6079306875, limb1: 0x6b02558893b8f50219b410a2, limb2: 0xbde3edcd153b6a2a637da1d3, limb3: 0xd094e0bb17f9376d4e53419, }, r1a0: u384 { limb0: 0x7cd03ef2cd33db33f6a8ae2c, limb1: 0x5e2f73868b9435622e66abde, limb2: 0x17d48c069f57a0f70ef9b0c3, limb3: 0x14f4eacc84d8d967e9bf296a, }, r1a1: u384 { limb0: 0xc22e92ae4c9bf9dce9693503, limb1: 0xecee5b30a52a97acf85cc7db, limb2: 0x6a40372e261a1a3f795946e3, limb3: 0x108e71b5478085f037d483ca, }, }, G2Line { r0a0: u384 { limb0: 0xfd3f06dc9ab069ab1ce8f8a1, limb1: 0x94eab902643916c93a42725d, limb2: 0x92896eef5c25b54929be81c, limb3: 0xe1231b2187274313b2221ea, }, r0a1: u384 { limb0: 0xe79feb70c92be5b75090280e, limb1: 0xa079b2d01c8fd3c5e91224d5, limb2: 0xc3d6265ffbc67b2935500cb7, limb3: 0xc55e460244e9d7e4724fc08, }, r1a0: u384 { limb0: 0xc2536498b81604b679714431, limb1: 0xfba1e239fe9a2ba2b8434f7d, limb2: 0xfb06ed703e76ad221dd5f099, limb3: 0x179f886a9d4a211471ca742c, }, r1a1: u384 { limb0: 0xc0002d164553ae2136d17389, limb1: 0x9e4c21af2da6e3fa6547209b, limb2: 0xc0d2c1b4544b1ff1f728f42f, limb3: 0x5d028766fec144c63899579, }, }, G2Line { r0a0: u384 { limb0: 0xbc724a32cdf5e686384f9c7a, limb1: 0x392e6cc66a96742b02d99a2d, limb2: 0xeb9b287e3c4d8e9fb1139bdc, limb3: 0x12871a93fbded0050b89a65f, }, r0a1: u384 { limb0: 0xd651768ec377726d1e98bbc3, limb1: 0x161f43ed1fa20484936f2fa3, limb2: 0xc1ac29c81e10ff7a9de14de, limb3: 0x19f6a875998dc4da65846083, }, r1a0: u384 { limb0: 0x9bb0b60d42e6317602bd7ce7, limb1: 0x81349962f265bf955e2764be, limb2: 0x1c169de754e8e91e0db4fa7e, limb3: 0xc08c552ccddf1e5cff0e338, }, r1a1: u384 { limb0: 0xb38dc139b4e54949577b1af0, limb1: 0xa84359dd65e8195ade74119b, limb2: 0x98af04c069558c8ff3c8a988, limb3: 0xd7d61d48c3534a82ef148f9, }, }, G2Line { r0a0: u384 { limb0: 0x295040d451b4f8c10a66f7d7, limb1: 0xf80871061d801c912de9eafb, limb2: 0xed8fba8b831bbb416e5ebee6, limb3: 0x8e430db1b12d579f711d4d0, }, r0a1: u384 { limb0: 0xd164d4b3a22de89a6127a3da, limb1: 0x3179de3a1d34aa2ba893d3bd, limb2: 0xd13dbdaf8082b8707f996dcb, limb3: 0x331baf7d5a95517a04106b9, }, r1a0: u384 { limb0: 0x9c001f3c828430bd90bdc1c7, limb1: 0xb547be2465b75cb89225949e, limb2: 0xb122f0237cfe3b5d08f35577, limb3: 0x11503e8a68740fb9362c9459, }, r1a1: u384 { limb0: 0x65097bf894cc61c85f24f61e, limb1: 0xdf7a3e16965ab9a30895ea0d, limb2: 0x847935d9036676bf5514e7c3, limb3: 0x177430f992f8d04517396f1a, }, }, G2Line { r0a0: u384 { limb0: 0xa0441a4e753643b9355a3f17, limb1: 0x5a5c762a2fd001fa04296621, limb2: 0x8aae9d0aadb27b00bfb42ba7, limb3: 0xc001ec34e10687e40e3fe3a, }, r0a1: u384 { limb0: 0xcf274b3feea0a98a9b78a1f, limb1: 0xeda53e4c0d1b94029825054e, limb2: 0x77bd53e6876b8b4092e9830e, limb3: 0xf544b1f6c1cbceaa8e8a27d, }, r1a0: u384 { limb0: 0x4875b1a7e30d8b356c4b48d5, limb1: 0x793f8bad6545072c701e941e, limb2: 0xdfaae7697d21b2c91f24603b, limb3: 0x173d1e1c4f05bc5b74162c78, }, r1a1: u384 { limb0: 0x1cb3eb9353a1f193fb82307e, limb1: 0x31022b7f3322bddb99c07c3e, limb2: 0x1be773cf729614f209981079, limb3: 0xfba0833bdd7e0106f828369, }, }, G2Line { r0a0: u384 { limb0: 0x8e9e39aea770477dfe41413f, limb1: 0x559b27235633eae55e8ca028, limb2: 0x2e0b31fe51912846733f2096, limb3: 0x119fa86b301bad56082a7a7d, }, r0a1: u384 { limb0: 0x180fe9c5376d245dfcee6c8a, limb1: 0xa8dd4c7ddf1cb669c8641bb8, limb2: 0x7a6d705717e66bb11df0c176, limb3: 0x9ff35d1500f1e43f5865d55, }, r1a0: u384 { limb0: 0xc028e802f19a8ce09f9f23, limb1: 0xce04a4a4f6d5a750653cc7f7, limb2: 0xa6205c0b6fed3d0ae979bc7, limb3: 0x13d44560fc6bb13d20f95fb9, }, r1a1: u384 { limb0: 0x561f8c090b24590a5ee95f0c, limb1: 0x6c79bc6d06256ea89d865cf5, limb2: 0x22d121d8814a3e99fab8b5b1, limb3: 0x4e23c464de2a41f3634339c, }, }, G2Line { r0a0: u384 { limb0: 0xe3570af849f18f7de4fcdcc2, limb1: 0x359d4f295f551f49f4ce0f43, limb2: 0x5fe81d5b454ac7b4d4be42e5, limb3: 0x1827c0c95f19420686366ca1, }, r0a1: u384 { limb0: 0xa80485f524899e0cafdb37ee, limb1: 0xe411dfbadc22a4e279fd320d, limb2: 0x4c187fbb32f9c03e9f8cb503, limb3: 0x4443bb766a082498ba4f82b, }, r1a0: u384 { limb0: 0x9fb076b57d27346b27413dac, limb1: 0x169bffe50985257a033e162c, limb2: 0x847335f827ed1b57015c8125, limb3: 0xa597c1ceea834fc4b9e4175, }, r1a1: u384 { limb0: 0x6ab00cdbb6122cf0abafc5cc, limb1: 0xce164faae38420ccb08012ee, limb2: 0xdcf9b5ad40487bd3f8b80798, limb3: 0x1416a582ca2f516030f48cd4, }, }, G2Line { r0a0: u384 { limb0: 0x262938eb02b0a0ce738b5135, limb1: 0x87081cbabce49821653c349b, limb2: 0x3fcca5c6ffa7a93194552dd4, limb3: 0x5f33058fd7a6f5562daa952, }, r0a1: u384 { limb0: 0xdb76adbd6f126b7e297a2a22, limb1: 0xdc1536a0cc54a2f6012a71fd, limb2: 0x5efc1d4d08e9adb2b0ef7131, limb3: 0xaa29cc910ff93bd714430ce, }, r1a0: u384 { limb0: 0x21aaddfbe26c0076a1332277, limb1: 0x5befc360a7b2df7cb42a9106, limb2: 0x84c8928ec73a7ad664bd4166, limb3: 0x1210a1b9dad92922a760b203, }, r1a1: u384 { limb0: 0x5f784e1ac6fdc4df7afc0fdd, limb1: 0x50db8e7afbc30c4f71fb694e, limb2: 0x63a33182a4d866eaf5174a90, limb3: 0x3f8bf361c208df3e1726f03, }, }, G2Line { r0a0: u384 { limb0: 0x5b64c7ec2aae834addcea0eb, limb1: 0x6f09c230bd77e317eaa5f387, limb2: 0x7adec10bb78aca18464d9c84, limb3: 0x163574a747167dd083db3305, }, r0a1: u384 { limb0: 0x9c2652b4c20bf74024218182, limb1: 0xa2f015e045625953330e76b3, limb2: 0x500283810da9c9a67c2fe8b9, limb3: 0x75023affbdb4b667a21158b, }, r1a0: u384 { limb0: 0xf0773eec0af14322cfed77c3, limb1: 0x268fb48d3bc1f128636687f1, limb2: 0x9fd00e0a5e5f3035244cb7c1, limb3: 0x14f215b62046fce592481ca1, }, r1a1: u384 { limb0: 0xef9be30f50ebea41d28d75c9, limb1: 0x193fa33c3c816bddcc207425, limb2: 0x68976ca00c72e88755f5296, limb3: 0x10ab8afd148808ae0e486da2, }, }, G2Line { r0a0: u384 { limb0: 0xcd513d6ba860c71057206399, limb1: 0x451ecd2c9b96e60e66758dc0, limb2: 0x64ced0ddb512c97bc59cf920, limb3: 0x3f4ac01fe942b1ac9311d3f, }, r0a1: u384 { limb0: 0x2998601d0aca6605631bd0c0, limb1: 0xb8fc0faae442022a0626fe9a, limb2: 0xf661588e85d804f1f2048c6c, limb3: 0x1298ae12dceae383634c5c78, }, r1a0: u384 { limb0: 0xc742ad0b483c6424693da3a4, limb1: 0xdaa35b3d0ba84948c3e058e6, limb2: 0xf2be609830ad79764d4aa3b0, limb3: 0x117d58d6d1a5a32518ed182a, }, r1a1: u384 { limb0: 0x9011dc447abae8f91198a37e, limb1: 0x8286397fef7c1a7a377647d7, limb2: 0x1ccb94f068d152311de445ae, limb3: 0x7dccd16a52f94da768c38bb, }, }, G2Line { r0a0: u384 { limb0: 0x538c083ce4e1deb79fc8d7ae, limb1: 0xcff551314712bb599e99f0b9, limb2: 0x9bf9eb4d01de1579ddd826eb, limb3: 0x2a1ea081d2dbbfb9b85015a, }, r0a1: u384 { limb0: 0xee2ecee8b151574694d17327, limb1: 0x2fe6c87f4670d9b999d3772b, limb2: 0xc0ad5a6e62cf44b446f89a6f, limb3: 0x10f2b18da949e2a50114e551, }, r1a0: u384 { limb0: 0xf9fa9355d7c82720f8e21bd2, limb1: 0xaca9cc30e7371424a78bdc29, limb2: 0x7349b58cc0ae05fb6db5f578, limb3: 0xe36c1e3ac43374add4493ee, }, r1a1: u384 { limb0: 0xa06af78a8ab34c1022f0b846, limb1: 0xb8c3411e193439f11b63b3f4, limb2: 0x513dc683165699443b4ece80, limb3: 0xd2a46af0a089885b4499c38, }, }, G2Line { r0a0: u384 { limb0: 0x307547f29ce0e10a413edb2b, limb1: 0xef4de07379413a2e7d3ac526, limb2: 0xbf4e796dab1d7b8ec71a6c9d, limb3: 0x19a4c8fc8080493b37dad997, }, r0a1: u384 { limb0: 0x2d4b6d98f6a62dc9cb1b3c, limb1: 0x2e820a6c08cc1b1be230cd27, limb2: 0x493e8c672a2898b9a16ac6f8, limb3: 0x5357128dd5f24fd60edc8a8, }, r1a0: u384 { limb0: 0x1063c19a9ad984fffa4dff59, limb1: 0xff2961c84b610248446d01df, limb2: 0x714c88877d87ca828f45a30c, limb3: 0x10c04eacfdbe1ec246a332f, }, r1a1: u384 { limb0: 0xa96deb5431f3e10c1335f460, limb1: 0x585524813f3a8dfec4a25ff5, limb2: 0xf0e4d4bf011411422a77c5f9, limb3: 0x1385dc2aae3bd61dd2d8c122, }, }, G2Line { r0a0: u384 { limb0: 0x7198960d6ea2cafefbb6b9ab, limb1: 0x114183051d9b79fe6adc88a, limb2: 0xa0dfceac911a90a3eb5ca7c1, limb3: 0x3944defa81481b7dd4bdff7, }, r0a1: u384 { limb0: 0xdefd7682db60845ecb47b3cc, limb1: 0x74780a500546ae0a4b8b3dc, limb2: 0x7a9a4ccf67e06300513c5860, limb3: 0x504436c0dba5f93ea9164, }, r1a0: u384 { limb0: 0x119696eda49e51bf553b09da, limb1: 0xe2fdb538f4daf500dbd3c6dd, limb2: 0x744f6bed078959ebb2da574f, limb3: 0x18b9ad2990893e795fd5e4dd, }, r1a1: u384 { limb0: 0xbcb13ccaf69256bd2aa0b3e1, limb1: 0x8d38b8ccd4189be6e119e52d, limb2: 0x13321abc207b3936a4823a29, limb3: 0x265ea0154a5133b534732cb, }, }, G2Line { r0a0: u384 { limb0: 0x5613c020634ff16b44d83f24, limb1: 0x80cd5fc93e3d09662c8c0bc5, limb2: 0xe5a7f64ed33d8e75390b4a2a, limb3: 0x77b5e69dffa452e710da671, }, r0a1: u384 { limb0: 0xfd475bb5cabda2ca66b8a9a2, limb1: 0xa2f483666599b3f38616a265, limb2: 0x2f50c3e13b47f9f013b110ae, limb3: 0xb90546cd4c81153ae816b28, }, r1a0: u384 { limb0: 0x5bb0532b9b631f6226209db4, limb1: 0x8af30847f24064aaea92f634, limb2: 0x63fc234f0211d3a48fd3794a, limb3: 0x186be21ff49b8619293b08a0, }, r1a1: u384 { limb0: 0x7257ceb68e224443379d4f3d, limb1: 0x832ff2fc38659e439e40d450, limb2: 0x2bc2eeb8acd74c13b35c613b, limb3: 0xc40014d71cb257fadad0453, }, }, ]; ================================================ FILE: src/contracts/autogenerated/groth16_example_bls12_381/src/lib.cairo ================================================ // Generated by Garaga version 1.1.0 pub mod groth16_verifier; pub mod groth16_verifier_constants; ================================================ FILE: src/contracts/autogenerated/groth16_example_bls12_381/tests/proof_calldata.txt ================================================ 0xfbf04de06661c03aa78411a8 0xdd8cfcb8222f03b0e4b380fc 0xdfa7fccf252d7a8b8f12403e 0x10d63379d266db8045f5c728 0x60db2dd06e62b4a0b82e5152 0xc24b6497af9aeb024f49f8b3 0xd7f025572d1a11a316e78e08 0x2c0020b06ec1b7724838d62 0x778400cd07df7ee73c5c448a 0xbae53a4fad489f850b025cee 0xfd4ecc9b868d0661624f2b93 0x10b361235d431450b05faa03 0xe8a1b9c9dbc220c866998662 0x80f3d1ab2e12a6e550f47425 0x78ef2d24565a8c5b9d13494d 0x18eab8fd69c3bd14a54d2bf0 0xc7e68c1949f7002bf79cb928 0x4ccbb7c5ac5c9a22450577a 0x4f2eb3aed84a4590f460ad2e 0x8a16230f79f3dca30dfc20 0x2db2c8950ddd7f26bd5c25d9 0xbfba0f9aa884451ed4cd8611 0x6b089209f570450362b927cf 0x147986d801bf9ceeec6861f3 0xf63dde989a27d2f481d98017 0xda2d11e16384828748a77c2b 0xc462994ad8c2d05cba4913f2 0x16998ff7eba66bfb87e0cd5d 0x7e5e99dc4dee75af6426b3b5 0xebe9803383f30df57976c28 0xef22aacdb044d34ba506b7c0 0xed3a43bd7eba2c69dd71d48 0x1 0x7a0452f8b3d5036d0336b258532659a1 0x37ef9cf41c99af8dddaf673a28adfa2d 0x6806d9115129d3c94bf5f207 0x1785ab9a454aaeb2ccecc68a 0x9a295fe348fea02a049b95cd 0x4968e1c417b5cbe5c330147 0xbc96b570e3ec9bce229568b 0xb5fc556206d6566424db1f6b 0x9c93076193e3d9779b981f3a 0xd0839f776e632a7b29ae08b 0x7a1c545101995eebe3f3e890 0xe568a05a3fdf15954b9d4f97 0x80f97823fcfbef09bb40e4ea 0xc4f03f2da3c299e911adca9 0x6d4f846fea58e60fe6917335 0xc7493eccdb722f362b4c459c 0xdd24123ad631b54dfcbc2279 0x941e0d72b3f18e0ccc78c42 0x579ab4d8a1a65c488cab25cf 0xd8301ee44d3f53a88e863121 0x5f5998a3cf683d553fccb07d 0x9819a195c310cc1cd026a2a 0x65dc8874692374c5e89cf4bc 0x306c6bdefef555d986f5986f 0xe88e710e51d8aacfc7624254 0x114487a5436e75adc53864d6 0xf65ef762443c1be093bb38b 0x302c04efcb33ebe0939546ca 0x507be7701bd5350a09d496a5 0xcbe79ffa0a32700d5fed78d 0x1b3cf7fcdbed9e19901f7fad 0x33e2af4af41c3f24968e65fb 0x38383152341794d76dfc294d 0x109bb4328ef88f35f8242674 0xee4fee85b53a0c7aff2a4382 0xee2f083f8c26bbf763468fe7 0x48865ebd70e1195b306ca53c 0x14929156aa7a62c21fd7b429 0xb47b8450dc9d640d177b07e 0xa727cec03403b564c18b9112 0x587df32c6d612fac03f0c21d 0xe2bf14ce3de3ad6a24b508b 0xcce0fba6f4ce3e6d79261621 0x2a1567242713b093eb774fd4 0x1fb9e31b32f1cff946892139 0xcbb699428fa8f02ec31890f 0x1eb12dd0425e3c4d364aab67 0xabcdb96c88aa7b0b5991bac4 0xafc2965877e55cc0f1de4f45 0x42983ba8fd7c62ef0089838 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x8bbe3149222291967f7290ae 0x78f12a9f0bbbab55611f284 0xeec0a090a36cacc84f9a81e5 0x14f38327205b79409760413f 0x0 0x0 0x0 0x0 0x23 0x61067230b7c02c2c5c5f995a 0xaecf6de143193c9d02ea0c46 0x34839933193f03180d55f28e 0x15bef531925fbfdb0bc2e692 0xbf2dbf640e28e3e34f67897f 0x5fae716eef98581d4c17299b 0x1b876d78f2e98c428a1aff57 0x12350c417a154ef8c9dfb062 0x663212da689f936a84c41c63 0x220dbd868fdbac3974e45953 0x2ee26ed83a84d6cc46c970b2 0x5c73ae6648745345da3ccee 0xa34cc3ad361636f7f59a246f 0x4de08dc13ebc6d62338035f9 0x771b3d668010c26120260326 0x6d0f20f448c9f2809088ad8 0xa4c65200055e5be78e573dcf 0x6e3bcba62ac78fc26f26f237 0x80e40fd830142a3ce69dd823 0x17119e415a1689f23a316e70 0x12584e853c7e282fc87e589c 0x9f8f10c04d24ceaf1b9169c2 0x922b04f85adde9929e171879 0x117b0f225d0f2ed892d8af6c 0xaac5a0c2e8f598f6f2a9fb1b 0x571a184654bb32805e73f0dd 0x2235068faac48c52198f8414 0x1113d8a9afbb1429bff4af20 0xea3b341398b5bb23b3b89e5e 0x34da8c91f0ab5dcab17e2c8c 0x8f8851ec37159d43021e8ee 0x18da3818138945debf164dd0 0x5ab37b36b6cbb1eed71ae7a5 0xcf663e2c28a652012125d5a2 0x972e792e9b8c8d753bddaa3f 0xe28bbb62590f081d0951cba 0x19f60d4ff657d7ef71a0d0e1 0xb542233e45f9694528eac8b9 0xdd9ca3430735c4b9f9efe8ae 0xe76c0b70c14ef1172434eb5 0x1007f0fee35610100536ac7 0xc3ddf10750122e09b885de6f 0x7a39512057e4234260488da8 0x344f82c09c0da8983095d8d 0x1f7e733b35dc50dd7a5cbd82 0x5a5d8bc37f6d5c7f31a8af9b 0x44887f779c75f26ac354133a 0xa078162303c22db387fd1c4 0xebaa36cad7ddb2fcf10dda94 0x987ae5c9d57493bf2761715d 0xcc5d35a5058ab8c1e4f4347a 0xd72e707048668a50555a5ce 0x8e8c5e7077c5199b4f17ab49 0x76770f0fced6a241951c0eed 0x454968a72580ca8f605f05dd 0x184a3f2fbcd9675ddcea48 0xdf621344424baa5646a10616 0x12d1e64e19e5a14d71b0cb62 0xdd58e0c804010f93085bc403 0x642f1d1e000b8662c01c33d 0x34ce8c6f163888c090e6046c 0xd5291f5435ebe0f05687e0e3 0x71472fb5b7ce28df5973ca10 0xb27388b3cf46ca23c4479fb 0xdee3a9b0c9fa0bd8a53d5cc 0x1c18ad3ee0cb8085507190a6 0xf95ec9637157753cef19c890 0x13b7012984d657d22152e579 0x5605f6236e81d21e8593ae8d 0xbd5d807a275688a2aff17f91 0x6afec5fd32d920be56f58098 0x337af5799363cea2491f93e 0x6456fff90e5e94e124901cf4 0x838d77ab870368fe4becf31e 0xc9af9fd9e96051f92af40b0a 0x4d3e80925902dac4f87594 0x79db470f183d70f7585b6193 0xa11e8f43cf0dea33befe1c40 0xa399e1b6cbe41069641cc6b6 0xd973ea6aebe05d84d0aacdd 0xccc71be6ec735af9f8238431 0x5eaa9f737ba91feadea5c5ad 0x6d18c8285f53105723ec7040 0x66a9d1341a861111a9013d2 0xd781aafef75b967546068ead 0xf957d9004a22a2dd33cbbee5 0xd23398a9c8726b1646703421 0xec859c4989b36b6e76b5a7 0xedfb47442a0a71172e4f5226 0xe3c0975ff9c1565adc60d72c 0xfbbe2c9cddc2d2b92d3d460f 0x12b8b4ffbf9b344b1eb29d9e 0x2d58909e352f4bab8b999051 0x6b88b6d25ff9c5faf59e9b20 0x9c4c6e3dd38011aa8fe74f6c 0xba4ecd44491c18a37614752 0x72909298773981ce29e425a2 0x357d9a5534367a4c750ee5b2 0x2e4acbb55cd5afb837f1e7c3 0xbf325c470d693e326d5d396 0x3dddaad457804688f77b2df0 0x50d8d46a3b5b8e46bb3a5873 0x47c5354f1dd4b068778dcb9a 0x106cbba48c6d3f2fe6acb783 0x878df1405cad5d85219ac2ad 0xb3dbeb8336546918d7f725c2 0xc37986c3795e8ac0e313ba06 0xde8b2a4d4f05a137154d285 0xa45549fc5f4d60a99da8362f 0xa88e7654494f2a6ff768481b 0x859314867f48abba67bcf3fd 0x152101f68b4e13050fa6ba9f 0xe8d0f35282f61aad0a27b320 0x47984db10b70660521bd7626 0xe29695afa9ea8aefcc24b812 0x9c4774820f9474b026f7c31 0x16681ccbb30f0aa871c009ea 0x98666c68ad88ab661a805448 0x84ac28ca388daa56a7b5399 0x16d5fc2e0451517ea9a6416e 0x726d724c58462c202b924c75 0x268ee23cfc7ecd19b9caf468 0x83b82dc7a2f3dbec1b9930cd 0x17094f764280bd466c40446e 0x5fd815d9510ac071a05a596e 0xd460e8a19d8ef9bee888f9f2 0x89501aab9c4745e78e150a11 0x1908e62f0138e0c958f7e3a4 0x3917c2a0b9491936e995775a 0x836fc1ebcec4581e4d6e42a2 0xbf2bc6d934216e4257733283 0x14d60853ce1160205ea83d87 0x52c7d860f158ae5278c9189e 0x553e49af2bf7fb0386b72d8c 0x2ffbf0d5d45ae27e82b949cd 0x37a83559de043107ecc7af2 0x6a43a25d1f376bd6b8f5cdb0 0x2acfe1b079634b8e8f77fdf9 0x75cbcb2b8c47feb2247d18cc 0x8cbcf7ce6642e120e794bc 0xc78f5b5c827437172c363c93 0xd986454e270b134e50272043 0x1917fd7faf0790a6b1bccd08 0x12c824dc148cdd5b5ea15cbc 0x17723e68719aba196281ba 0x110732d986fa3c6567825bc4 0xae5dba5f4a84c297a6030e0b 0xdaeaa22ff02bcaac992251d 0x42b51be85ea85a91289543ac 0x5419b3c9a7936869e3eeb6df 0xe440d2206e66c5b2400dff 0xb6ed3112bb028c70596a3b0 0x69fcf83713b48dba1f6f34c1 0xead9f277551cc8d7078f50f7 0x256bdf9e1ac38f9417a62d51 0xea5f13e33811e16d00e8911 0x8e5c1b151f9ab21f1012645b 0x1e2835a413d6296fe57a1337 0x6e6a99b0edd57e3c4e6b3d99 0xf7df405e35ccb1d9f120110 0xd860b41f106af41fae761d1b 0x17639cfca5137dcf0bfdc46d 0x1eb9fca60ca837499a695df 0x1da4af271e0b37ce6e42aa5 0x111ee8ab4bc2390f735cf308 0xe9f83519a39257ecb6c3adcc 0xcab8b235558a8f5bc7a69138 0x195ca254c97a42b72ecee453 0x519d5161ca0df6a7556088ad 0xb42da6cf626cda51fe7be7a6 0x6fe2276cb021a13733f1dca8 0xe79fe46439225df1659443c 0x7da446a4a006dd66fe9d9db7 0xc2c723aa66616f7b8d1ef656 0x6a2aa1d7b6b5cda085d899bd 0x7bab933fe165daae93774be 0x7a43ae481c8c6295091806a2 0x787c450c96af098bebd04e36 0x19af9bbd357345bbf0a1f332 0x19f7cca4d6652c420069e4d7 0x2ac245e15611278116658b7 0x2a0c1178f69a9e61bd1de823 0x51576c0736bcf5f47cc3034a 0x638aa4b64248d8c6f4e9fae 0xbd5527309cb202a1cd7e1677 0xc03e6034195eaceb5242588d 0x2cd54fa967bc5aec48dab2b3 0x17d20db88e741e7f58ac6f35 0x3176a806485996f0c15a0777 0x6952b8db65c879dc5a94585b 0xc653daed721ed2c01b3d6c74 0x9ae8b314472589804a0255e 0x97a94797fe6714e1e6062e6f 0xf2d18b7c0b38840535a0c577 0x511f582f6c7bcfebcfbe2c8c 0x1728fdd1fd61e27fbf8611e0 0x5350f4b67ecddb930c3398 0xb424ebf1ede628035272af94 0x2cd29250b112f5be8be08dc8 0xc13e634bc370b9c6ada592a 0xce33889838d9a2c7edff5347 0x394d10658aa19619a081fe50 0xad492afc386e0c8174e90c0 0x9d7e3a690fae39de6490161 0x2a25d4ac95afefebd60ee5a4 0x1dfe96f05d43cbadae7c0168 0x129dda50525364b09117220e 0x1321edd881b500266e1d8631 0x45878dc39c9a9a4d9cf4911b 0x13549554ce47c22e74980f49 0xb8594911b1bb12babd418d7f 0x14553563ff4874458c752e87 0x40def502b284e6565234e996 0xadc615502d2b03140d6662ce 0x76ece3b6e86c7de43a93674b 0x15282e150fff5cb23584145c 0x9985106ef445a6b12c81ffdb 0xb504c019aa03b5a209634f15 0x63b5a6a88dc5ef3a683802a0 0x129ad6d12745ece674e19424 0x32a11c0a231e12bc88470e61 0xd752ffeace8cd4948dabb91e 0x1a1d7e6b8146c5e9c98ef4b4 0xebfc531277e58840b4e1225 0x540a4e96f6b84176c166c158 0xd0a541d7777906ea0f0ee756 0xbf7452d8dcd843cbfdb2ce0d 0x1979213d86913dcf107c78fc 0xb6771961336f271367c82968 0xe88b239a165e7327fd04f92 0x1ad2705c8c3ef7e3ba577b8d 0x114819a927f0971a7ed7cc8a 0xa60aa6f2a17e782ef30976cc 0xb7fcace6007b3a3a9d9d7ed4 0x89b8b259cad8845b9affd179 0x8f43e0ab384307c79b4d49 0x85987935606cdbd3751ac903 0x4602c28ef2faaf4f966ebd34 0x48aa8a4f92c43e4f6570a845 0x8dc60a6ee0f4c49f6f8b78e 0x9867f7e53c55b3c89bfc4319 0x7b56cccb6188e50d20ffcb05 0x9225ce4c5cfad6e117828f8f 0x14009a403b4d0a3cc8b2b524 0x4872f54608966fc7cdbe9bf2 0x4990fe1f90efd5db8f8e787d 0x1abae2766b8a379098c0002a 0x15678e57768d19820853e70e 0x329a9144e2dafd94b3ab2e2a 0xf7407f7d34bee94fa27292be 0x1847a74a128a74167e656d12 0xd723a89aed951fc00a19e08 0xc37c2729d538fe3dfdae0fe2 0x9872cd6de3b2ee00baa18c5c 0xb18bcf72775eda282e0383ab 0xc93a448469c802ecafabf9f 0xa9e4d443c5676d273227e6bc 0x4d0ec3ba4432ac2ca5b46860 0x4ac8563b996093026b182d6c 0x19fa62b2b2d247a0fb741f91 0x60e2a3fc0a86e9e5abfa9608 0xd712e08c6b6cec4b770a822f 0x9fbdc4f66bf3a7bad1ab491e 0x3bc641f0c9539748282919c 0xa2a8e54d39d26afa03f6ba13 0xe75a5a9d5c59dd29cc12407c 0x1909f742e9197f204affa83f 0x3073f7fe9e0b1ee156b7af9 0xc6d1132402a7e78180d8d01e 0x96f48eadd5f0143a9ab9a96f 0xadbb91f39a8a8e1a947524b 0x4036fe7bb537efeddcd0e24 0x52d1cbb6188eae9d026c306f 0x1c0f6f721ae5f24b4b2d0bcc 0xb6a3c9e169620dfd5bd25dda 0x172364766c6c72d78315f20 0x7693bc085a35c89463bda76d 0x66329b5863fc7c21250440cb 0x21f1abcd76b756b9277735e1 0x19c887936c4524b0914af0a4 0x31300cec396998806fe3be66 0x12bbe84b5074a53053f155c 0xf00251b33a361f7346d8c1cd 0x9fe4ccec6ed108022ba7f75 0xe590f4d2afc8bf1180d4d486 0x9d8542c98c38a578051c6a33 0x192bddb013f3bb65ab31bf03 0xbfb67a28e4f5747f41487b1 0xb7aa9d9492743fe5329623a5 0xa42686eb702b2dec569da784 0x78a456c243c746e8ab54f016 0xfd18916ed2aca6fd4aa5a16 0x30d77a6612fcfea60b1e4b5f 0xbb05e614bba4d6e926a4b523 0xfef7d4fc2eb756f4d7ea88df 0x42bba678184aa74800e56a5 0xf43ec692ef89cc5d449d497e 0xfadbbead9e4687ae60373fb5 0x6bc34e20c56bcf955fce79ba 0x3c8325df114b947391524fd 0x21f59891f0d52f05c6100ad8 0x4784c9355b078a75012eb1bf 0x43914eca80745bb9f6bec0e1 0x15722c6307b1628fb975b41a 0xec72ff80525e5c70c9d1bd4a 0x8e42006faf28e2990237dad4 0x2ed6a33846d3552e768932af 0x111c12479881295b814e81ac 0xdbd72c792c082f6747891bb0 0xc2d759dd5ec9235d38e3c5d3 0x6ca6622e82a2fba5ec820f00 0x16c422ceea0f1329f4fe0cd6 0xc19ffd3b63a4ab918b2027b0 0x24563cf633dc6323ceba41e2 0xc892819947f581e0f9183a87 0x14d703f8cbd2af52c968e21b 0x4d00a18f83b71e649196f393 0xb28cc16b3c3bd469952f8fc0 0x8dc75cedc83451555955b0e7 0x2a321acfde421ee4afd976 0x61b338b464a0d5751bcbeaea 0xbc5111e97cce967e0b9aae44 0x890b5ea6b8f72bb1cf7746f 0x13f615596dd85849c99944ce 0x88bfd1fed991e253e5b589a7 0xf28a522933a58841de9a46a4 0x89bf8390998fdb883a197297 0x1946ef4158ba40df22629f4a 0x3157c60e8d78b159a41a59c2 0x5b75132a35e3e5e43d7c4de8 0x310a31c49be4511b0dd43f1b 0xdf823bb6d5cd7de7e54522f 0xcd466f87de258bc073c00698 0x3c5f1e3da79bfb9bb7eead0c 0x66c1380f637c3dbd2c1a26f2 0x13ed4052dbb639229bede5f1 0xdc535f3e6fe2692dac6f52a1 0x6d026d0b9fa25ddb069bb6cf 0x983be3454d4b43d25a76bff3 0x4d99c46c2167963c3efab66 0xa8280d24bf5754f22dde84c2 0xac8b475de2e48ef78f31a47b 0xc3cf1f8f3f5ff0566c8cdce7 0x7fc628ff657e9451d5b1a20 0x6a67cebbab491359c433a612 0xc9d19fece099a64f516cef32 0x43c518642ac750f3adab61e5 0x729aa45df4e851244136155 0x7e6048df16daecc19eef6ad 0x5263520da87c74f11f2fbd9 0x71bd561295051a614b49ee98 0x68b2490217bd4d6e6bf63a0 0x3667be34018fad05d9fe2915 0x1d22bf1e2c723a43b59bd010 0x835b39c0d84dd89a69707096 0x13405611a9d5378602929260 0x7886182dabdd22ae17be7190 0xf54d993ab7e1774faa93d33e 0xe3ea9f8eb38bb4d6206856c0 0x17b837390df6c706a00df6f0 0x23d840c60fa54509b75ec765 0x7cad73825be0cd5f5457542e 0xaf090776ad8afd7cd6d4cdc9 0x45a1c7d90cbf58845b21a2f 0x632f5bfe7ba14cc819383bce 0xb36d7ba1e5bcaaf48cb2ef26 0xa70b28fe57b57fa94d7c85dc 0xe2b7c61ee6ade0f6b60c6ca 0x182a05cbe2dab199655d4f2c 0xb9b23a99776b7d63971274f5 0x8eeccc1bde13aee5737ba9f5 0xef37cd5633188fb170796cb 0x68eae636427081009311edaa 0x3fb484e5f8ec68b4f64d6761 0xbd5956be60f46f8a150abaa9 0x1f91b1310774020f1fdebe 0x1eee657d3fb935a64cc66a85 0xbfecc9b389653a29702f341b 0x9fe5737b4f3c7c6331d5683f 0x4a1f71001db2cfe556ad8ec 0x47c2b26dab551ce6f271dd79 0x56a0cb719da30e857c5c72ec 0xb6acd47e95aa95af8dc9fd88 0x128a9325ce2bea3b1b68c90b 0x7a9962a5e7f5599dce8eab13 0x82aff3bfd0aa6b353b75690 0x6fcb25612903343bd14d029b 0x679eae82c03b57a33bfae22 0xb8c20e6c56f5622acd07568e 0xcb2b888617f23b2a87f2f20c 0xbfc16be6a41239575736a291 0xaf88e06d11af082d2f94215 0x20b0cb51fb09d4ac8f0f6679 0x49b465f7db9c9e21ab16378f 0xb183c0bd89a18613ee12a030 0x140ffa18cf3a3762a45092eb 0x16485dc27568d8342cba1437 0xcbea14d047dd7aa552283518 0x5fc2f229b6f7c087f69f2f1e 0x102de35a054d4c78197b1f5d 0xbd451fe7fffa3dd9d0cad876 0x28038c184c4f72653ecc5302 0x45bcdf6564e33c5cd28b5bbb 0x15cfcd28545da71c477f614 0x4d4fb0bbbe3e261aabad9b3d 0x3e003026e679ba9d1d37cd11 0x82b6b674aad91526c929ccd0 0x88a3d906eaf7c5895b6fc11 0x164d61a54e1720f9a761214c 0xff9e9886df18c8539394608f 0xd5483f1135851bc921a699f2 0xfec80084ff46ad25edbb7cd 0x367818df930217c393d638d 0xdf6e5eef8a2821d4420b759 0x84dc31d6fbcef5af84d3d328 0x119db491f3093e34208b365f 0xfb166fc1492072661da84b14 0xd8159393169d1d691291c9bf 0xb1c3d173b3e6146e2aab4d92 0x181f0ebd5f61e401b8af3d70 0x8de90d02b9bb7cabb5902b57 0xa51172a60e0db6c442dc9456 0xba295f2d33cf946242c324d0 0x8ba3821b4786e0a163603d0 0x7338e6375b19fe823cce0113 0x3e1f0e1a91be1557416ef688 0xf1977e6788419f2d86cce276 0x17ce7f922a9e6666ad76e1d2 0x27d9372d6c64d31fc0f0bfd5 0x6a2f81b2f5630f33ea1b3a85 0x6931a17f07f707fd26a4811b 0xeae050b1babeaae594c9b5d 0x45b282649ab6cf5cc5fda2df 0xc6223e090dd63aa45a149c08 0x173a0dc23c52bb228b3b461d 0x17c2cac59dd30e4f010d4615 0x3dded29f5e3001e34dd222d8 0xbd734d2ddfb0b13241654765 0x2a7e510012cacac6c1bb975b 0x26c13ee502def7d80c23d2b 0x9abd28946c5fd4cced8e1b5f 0x77328440c38816138a459c1a 0x297133572129d1929ea2e8b5 0xd0196882e4725b3775d44d0 0xc75998710fd8db3d6e0fb7cf 0x2d8bf2d5fcea72ac03be90ff 0xb178443d411b77ec8dd8448c 0x563c0069dd480dfbea22f22 0xcb9165c19aa3adea9d160539 0x7788a43a7fff17e2ff4be7cf 0xe2f87a0265130d15712fd4fb 0xc90a3759463911c89a577c9 0x590dda60289b256126b2f42a 0xbb4e2efe860923dd20fcea06 0xdc472d85210d6efda4976916 0x152b5c0beb8e90b462fe5876 0xc218439279361e2bda02b5a2 0x62f0f121a2fc0ac555d8956e 0x476c3bf7a54d471e0dc968e0 0x14124dff608a9a0b03c78ede 0x9885e9d430a07731227a3982 0xfe2a5a3aae43ed63337a7d26 0x4ad82dbec277319f46b3da0d 0xce4caddc20ea1f3170c58ac 0x2dceda9bf09b6814c45e1de3 0x8c1307512718d0836bf8c246 0x683b95728d7166ec55509644 0xe869a808c1c76e5863fad9a 0xa1f08575f7d6cee2cc771693 0xfcfdd139a81d1a57ba8d76f 0x74552ff4b984032604368acd 0x819322c35c7556eb61df2da 0x81874b0c2dc12c4a22cc535d 0xea545153516dff99aad06cbd 0xabfda3517f353aa9d83b8c6f 0x1374586534f02e740e9db897 0x2553b61377987c269bf738aa 0xcb1f83ace3b47a51ebb85ebc 0xa01b03f110920625aaa23eae 0x16cd02c32141d3feb331040 0x735b13df44bc43b4e2102fc6 0xcc67114050b144a0b041d5e6 0xa5824e118d13c0f9ed936b9b 0x140fb885e71f952a0e85f106 0xbfc373f4fd2effdd9c056c9b 0x3405116914cc1f212d89a1cf 0xe292cc51657cd7a42faac802 0xeea654a7e28ec544efb58d 0x5c2b10a91e14b48929e8a4f4 0x139578a901113ac58aea3be7 0xd2847c08c837edeec5a938da 0xe9097f0ef6fcdd48a9b7e26 0xd131d05eaab271e934993875 0x7800b3258f08cd0d2ef77994 0xf49c59a3aa65fd77f18f7b32 0x7355bddbb91f8752d286052 0x361aa6a9abd82b5383ed15f1 0xb280bd6cf573d574d4a95c22 0xd6b0319713737e043f3426e8 0x3037bf4bf601127b3d52bb6 0xa1b6f7060e0d19b42aac33b0 0xabec2460a75a165dccdc5759 0xc11767424240968ceab2057 0x195dba68a2d2713186f35656 0xd0892c47f592ca7374087ddc 0x20e9996997f604c5381d72de 0xe0e11739dc09a768cdc1130f 0xe6d18c9728a6bdfd3e04fe7 0xb273f7fd358e502ffd45eaf3 0x5a0b7e93032c810cc4d41263 0xd672756d49308de97a1cf31 0x6b722d4af6751925e000128 0xff5f587d628f359829b78b61 0x842d96e4266af4c9bada25be 0x1ec7d9699f24448cc5b1be64 0xd17d25d7bc72b5967b7b9bd 0x2853f459fd51d683d20a520a 0xe1ce4e54be97d07a4f156792 0x43d0a72eda991c00f70d3503 0x17092484223866e9b1d1272e 0xa576590157e34e64ab778acc 0xdf855f910a86413f23d6788f 0x4bddf315f5b5b2390288867f 0x11124cf7aabbf15561c94755 0x7f5ebf1ada1ced6839331f9f 0x54a69709d8d70eb780d88c43 0x9f4ced0247e01dad81943144 0x5850d991cfaeaffbc8f9bb 0xc677ea3487b23b9235c99348 0xc64d16719a7d8c0227483d3 0xc910e14d2b8dfbcab89268b2 0xaa62272331d52202302cd50 0x7885bb0c17b11ab86133c566 0xbe2fea0b45e1821a0d231902 0x85c8561413d7d441004982d1 0x263dc5ae3693ad15be57b94 0xdd8d9c3934032bf5504df837 0xa0ad313a34e0da8e9680b86a 0x4e18301e23ed2dddeafcb64a 0x13da6a19137d1c5877e7326f 0xd530c6c71558db8751e1f7d3 0x4db891f20e3dfbe908af75bd 0x2f19b08537f35b0d6614e2d 0x1056894cb73ceafc2670f6f1 0x68c8fd83ab02d98f703084ad 0x42c74bba51921e6924c286c8 0xb2782d1e9d6303a8561284d3 0x148f7c611a6c3530a6e5dcc1 0x76e3bb30d914e6b25fb6bb7d 0x8cb91df9af5fc93f7c556454 0x8f96b616061f0b9d3c92ac65 0x16aa935cd4b0f4786c49c9c8 0x1982daf7efbb6b3d2bcafd78 0xf6959a27f8062237630c5da0 0x9f03b1a07fb2681464243c77 0xd767fb303d3c51d9c4d421f 0x6f8d4761ee59c08b21658165 0x27eea9910be563a875906066 0x9eef5ea7104f9d9aeeba0a99 0x8a089fef759c53e7e9b9035 0xa86a4066920d9f1b912f0f36 0x3ea4c86be7211f0023f39157 0x9e3b85a11d9ea981a99c766 0x18f986add7d1bfd1ab582725 0xa93bc02a0086f716887d90f3 0x193fc99bf3fb243d7f755d28 0x2b940a9be986e4fe0b93f62a 0x3d03e6f585eda74b9fe5733 0x993ba8582127de3d44e86d2f 0x78478a6f4668c867b0719c5b 0xa38fc11d4674b1ab5e8ce257 0xc1ccb51a1cbcac57b5b8c8 0x5034b44744c7a4c59afaf79c 0x1c08c747c2d4642ec35d45fe 0x8f8ab0e2a42c8b1b0cce8853 0x184cac01576df2492ec66f83 0x97f43148263e074299a25c3e 0x9af133cc9cd7beb458a36747 0x70210b6ecdac50d284e19784 0x11093b786d47d434aaa264cc 0x9e560b8eb594323da75fb372 0x2dd94ae09d3b7df94b3d9e83 0x3263b2a9c0c5b8852d5e7555 0xec87353c53d0ac2dff106a1 0xe456d88fb84b2bb2e88f8576 0x9ae005f02234f2b7e0b221ea 0xf2d290e0809cdf6231741e32 0xfef98ed0210fa77e5d15d85 0xae1fdc8c456d713cd9864e96 0x61c217c4bbb61f52fb264dff 0xffaa65d8199441f2595c2433 0xf1320acb0e70b097b042b7b 0x8e1313a8f8b0c3c60c95058d 0xc433f92f53a950c5e6418c6f 0x16141fce26ec25411cc2714c 0x147d332177f02a9082fc84b3 0x99a2774bdfd30d681c754707 0x529299c10af451c16df3cc2 0xe3e4e5cf12063e0553b6cb42 0x144c02a8042e318f53bdddac 0x973bd9158bcd685ea3e4041f 0xa89ae5fca3bc49c79d54c665 0xb573ff4b6f90263a75920b05 0x24e72181b324911d4433dfa 0xcbcdeed5d78b5b06a269d141 0xe52bbf65fcf075d8f55d859f 0x3b8781d1caa8d7c7bd7f7f8a 0xc39800fbaf956b32b81bf1f 0x703535999757643c3ee668a9 0xab684d1f0b83439116c0dbdf 0x9f87223b1c2102f9c892470a 0xcca6386c6b17891d1f01971 0xecf04e59922d94333d1380ab 0xff98bdfa8b8e91203f3f9fed 0x9005825bcc57ebcf24b7da8c 0x16564badf5baeb8c8f4df13f 0xe9ee269931e0202673b37535 0x7539d0141b90c92c714a8b41 0xaf536aa8b31ea7ae483cee38 0x3a721f43a91ebc055b40b78 0x9e2933b407286a33c96ddc6b 0xfe4060cc01b66cbba3442fb8 0x46a63927a8f747f799df0a40 0xc950c6f05d4d7eb612f868d 0x5640b7a9b8d29e27ed626254 0x6da332036e80389efe3984ba 0xed0962ab54c56b2954cc302e 0xf6a85699962897d8794b65d 0x65b65443dd23fa5337b430e4 0xee272a0f0d75131496cbf489 0x3b795dfa68ceca330dbab426 0xe665d6b1434eb8209ee219f 0x4df9662eff0a6f22c0bba681 0xbb7c09429692c1adb54a7281 0x7609e149a48ccc53b506f74d 0xf9fb493c05e4cf1fed29ea2 0x6e7cd4e5ea8a2b0c995bbef3 0x51e1bf0d7452c1cabdc03044 0xcd9be2a26964104b377807cd 0x52446b524fcf2098c8e711c 0x71a77849fb4f01894af7e584 0x3126031da0984bd3457506a5 0xce94a095aa6035aed4f9a05a 0x3fe1b75d6911eedbf4b3b85 0xd7673e301e5e0cc0bcffd462 0x6c474f3ad9110875d3e5c011 0xa66f3361e0c8f1f660146a4d 0x9637208505832942969e4 0xafe8bd0a87c82016f4a2738c 0xa6c8f7f6d274c5808a18d8cf 0x80458c8cb5d1602bf0404d68 0xd4bd9d75ee13f1b75db0855 0xb3dac9642aebb4354d1e71ab 0xb051f341e9db010a4c76a996 0xc2065d49203b8b1eeabf2398 0x60bee19036199a62d66c02c 0x50cef14aae1d7ac975e79af8 0x19b5f35f92177ff406e60294 0x9bed766f87642423ae350533 0x125c8367a07e41ce9db529dd 0x1130956816deb3cc43dc013b 0xd1d3fc983290fa940aa86bbc 0xe6d8dbd5e0967c3476951855 0x147f9c695ae305b463e2b092 0x8f806aebfb7892e9296a8f28 0x4f94f2569136b43b95122d4e 0x202f80239e940815486486e6 0x178dd2d49924da801db8907f 0x2ac5335f791cffbcd9cd5786 0xb8974e1f447eb1bdcf2843c2 0x4c25dfe3ad6046554b8cc754 0xf0ad985e96df2080e19fc98 0xe38b325051dc904654b21ba8 0xd3da5041419d8990b59885b9 0x1cad5a98190052a198cc7d14 0xceebb061a38eb6268282e90 0x4df750d85773e1259b125b6b 0x2f7b1d128ae6707bc1dcb557 0xa754c6aea2e0e43fe54bde78 0x133ef53402d2f4be429b7ab6 0x8592f8f66b3d8dac763f6970 0x8602686a00288ee9868bfddc 0xd7892e4a9a9b8c13eaf1dcfa 0xc6874e7396cd6f057eed1ce 0xdc3545d25d30cb04957ae683 0x66c32eb36cef9a280d07be63 0xecb945258ed9b0785b3048b2 0xc1e5f9c179bd40d62b62f5f 0x26f99f322d08b7d8604ca4e1 0xee4ba03890dee1700ed746c3 0xd805fa892c80c952ba0a449c 0x114499c1b17f0adf92a14b6c 0x7401deea71bf473439c3c062 0x9bbb5a665dc3a0508b268d7c 0x619509c5d8eef42e062417b1 0xaec4a0a3b4325892679278d 0xf807257b7e176f88bffa15d7 0x34458ab238e8d831373d8496 0xa5b75e204c339c76cd049032 0x5376d5c69f3fb2e1b05366b 0x2fb53b2114c34f13ae497d64 0x177b477731d692fd0c742b37 0x9c2e484a829ba8977925669f 0xc04c760591bf05cfcc975a9 0xdca602d806036e0266b318a6 0x22b0785142d747112d3a8e5f 0x40e8c7feffa0d9a3e1512f9b 0x176b522f0c8f5da7038297fb 0xda68079f9f662f0eee82df59 0x739c34cd1a45e645be85fda5 0x8b8a27d1a97f0e20e178d4ea 0x4f744f32135730024448907 0xff8da922a9aa63a3afd9e423 0x3db73494f1a0a183b3159af2 0x9ece22ab479faaa5b1e0cda0 0x170c7f49e4ddeeb79191413e 0x1d311ad39f324fc778759e1a 0x4de7cc8655c6e877d70e7bd4 0xe0fcae84a0abcdbb2a34b03 0xd880991b88a1ae2956a10a5 0x775c1e1199e7c485d8feeed5 0xdbbab2c48cc50f6f5049c97d 0xe53629739a3edd6e618769c4 0x67a3ad2bdbc272fa3e59d57 0xb75284ca964dc9cfd4025a8b 0xc1d8322731bd60defd50db5e 0x5b4c649da01c921eef265b8 0x18a4d30444dbee19c130eab6 0x54855ea89eec3d0daf6d8f2e 0x63dcf72aaf18d6722bcdf565 0xb53d09fd4852c1b61cc0202 0x356d700747ef0e09e3769b 0xc5100b501c60134d5a0fcee9 0x26522e62f1ec0a2ddb8170e4 0x107a67dcdf03fbe05d1819e8 0x10749ad03138f47e5b5f854e 0xf954f89915215d4fc8ecfdc1 0x186b547c3252f094cb0ef7d8 0xb70ded3a1072677e2d276915 0x8c951c8643d52c9382fc303 0x2db675b898634472f901d141 0xf54a7942840fee4c2bbd1b7 0x3e465726ea2c89a440ce0df7 0x96fabe0871918b4b2525db9 0xf2f1f4e3cf9df599b57fbe20 0x261b56781bf3dc9dcdac19c6 0xb385561759e7914a92198ac2 0x78459a57e37d1eb4c76ee22 0xa066c694bc9d585f136941b9 0x5058fd2fdecaa53a1329979 0xaa2222bbd1bdd3a2ce8edbce 0x5ca4f6fa3aa584aa9aae13f 0x97d7bfa8338c3b3c4a7900c 0xd4c8353a4afe7b767254fab1 0x50610b5b175b7174e31378cb 0x771a38f0ab2a499ac0b1bc4 0x7233a1bf5ca64ecb62bf6e1d 0xc0201177f6645bac8a3620a1 0xcc75542bf3dd67ac0ad14352 0x10af9d96d505374fd38b6474 0x6bf5f6014e60f7902dc2a001 0xe058be0de84596eca24faa95 0xf5fdacfdd66b8e8f936cb825 0xac90a0b2f0d3d6450b067be 0xdf06660a7367f8cc5383b7e 0x80b693fb2f868bd2feddfd1a 0x4cfad57db501f40d5561d83a 0x1329a4650fce91b05028545 0x6c533c2b6a686ea43df8c7fd 0xa42a6fc208ff0bb3a8fa87e7 0xd16f331d71a4c2cada57917d 0x14500f61b20750be8532c73f 0x2d8c0afe2355c4b354d8fc84 0xf61d4c52faf00149fcf2a240 0x669bad2fd1361ae4fdf56c31 0x468f3fb92e2571cf10f8d2c 0xa4aead13391667bad3d0f457 0xe90d7ce93dd7545970406b67 0xe08e6999c256a2601ed14adb 0x99b476819a2b650f795014f 0xa5a3b4385350d985696b9bad 0xfa01ab52cf07d367726dbed 0x3c19e7cc4f97d4fca2da2446 0x15c81c9df22a475f648ebfcc 0x12a1e0ab7bdf6e0b50550407 0xd869f497f7a123142b4c255d 0x5cdd374bdb8409d57621a2c 0x12e0f3eeed040ef92637346a 0xfd2a238341f9204ecd90f0c0 0x181a467c8caa22b866002f28 0x8ac7ce17241d275eaff9d203 0x138d014f57607de04923f8e8 0x5728a191a39c640cf7280e2d 0xefed21d0f65a1517116a9fd1 0x684d2d84dfd2f13a3066a055 0x2d801ce72fa6c48a65fdc9f 0x670cff01c61f495dda468b2b 0x32ddfb881b846af560bab0f5 0xdf1d9c24d1946542b6d5d14d 0x8799922cfdc5252dcc35cba 0x9cc68edc89d0f0c00f7be456 0x596611aa6a70d31f5907ff6b 0x25b155b05e98679ea32a1264 0x121f9827f1e1eee1076a56c5 0xb866614291fd98bcf3b0e411 0x37dc94e3f7f3b70da0f48fb4 0xb8e763071fd1e5ab677740ad 0x6c022c569fd06e75cf68b6f 0x2ae3bd06bb5db8de07470694 0x52b334ee4d68005ce9438b6 0xabf16dd031e79080e0321892 0x341f467607a44476ed1e3e4 0xc67f705cfe2de13199899f02 0x3ff20e80a010a4ab5351de27 0xe9cce42d99e50d7de7f30255 0x151ed53572cb8483810d3fb5 0x29bebf19f9ef51ca206365a9 0xbcef70dc016563e8cc9c1063 0x2f06a435fde08403690b1635 0x1352574123d37cb4f2c4d873 0xe4cc9729c5c8176ff03919d2 0x89b881a6d34be6d7cc91f8ef 0x9822ab5cf28cb3b5d08af1f0 0x109174e665c3b9bd31361fac 0xebe82239f11ed64c6eb65107 0x9c1742ea8e2dcb324009f316 0xef4f22bc75d3d52a911a18fe 0x1921b38ff435ade5ad929e04 0xc070ffb529f8865c2e827d44 0x2e6f5141e526d9c055ec14ab 0x8525467151d86f459a12a3bf 0x16afa65d2b27a52eefc8f1d1 0x351606e861fb7a0ec7b87dcd 0x90436bd8e81c2a183a80835d 0x584d2751f04e112f07f80a9b 0x115265de45f148c56aa24207 0xa9847326ffc9b2d5023647dc 0xd0f94be9f2ac9e7d895dcc28 0x71a13051b4d36f1dfb1f1143 0x1620c9f44d72e49383e4913b 0xa103a1025f4ed0fba06a2158 0xc86f8c697d223cd582e68d6a 0xd172dbef2c6e851673b97c0 0x1e710030de2a64b36ac4d4c 0xc4b55b82e4baac09ae5122b7 0xe5dae10d0d46912687b46f58 0xb92492631a29aa8f4b02c2f4 0x1321dcdd8e95f52cf01785d4 0x7a11d24c13176414a736746d 0x2caaed1755e6449486f04970 0xdc38b416eba365f5ec0c8b35 0x67dfafc8988e196d8b0a432 0xb91b03a7b76f60a9e1786e04 0xc84e7432f2f1c9bdd007ceb3 0x9b5b72797ebb5802e6a7f061 0x138d31f385059365c67c2f1a 0x20d874c4c24b32082eeef7da 0x18063996bff896374a4d3921 0xf3b608b5f6cb567aa4e3f6d8 0x15d175c03d5919ea1896c875 0xb8b3bcae2aa4d37a0b41058a 0x1dd5320659db7c1ef2972ddb 0xd0b58c3f9e92cd271e9f63bb 0x4dcaac6112b4e9a843ba04c 0x8ef3a4f414c1d5274f106d7 0x220fd8dce5cb981e063b0645 0xdd9dbd2c110ce0644e055100 0x94af03780afdb5f8d84e57a 0xbedc8ff4a5487eeab5a5f048 0x84b902634c7f46c0c12d8656 0x8702251c15d5ff401dc4dc25 0x808e78d23fa891f03f91abd 0x2002a244d1211db131c09e 0x1fef0384003594172fb3a8c 0x76ede82c53625d6fbda44e11 0x12a6a0fe5253ab9039661fa1 0x8b55dab4abf8e45c95ee63c4 0xcf6a6f6f1fb8e73d64352cbe 0xdef9716794b54402afef4d3f 0xeeb903180b8a2e557a4af4 0x537ec3278f7810b4cefda99e 0xb4132b26b0ed3ca62bda3e75 0x94bf76cda08f6a4b8a574195 0xa17cde4ea283b6ef30d1b71 0x39fd143667433771f7b289ba 0xe1303b0ef3973bd284fdce1e 0xb29708833845054d87e922ba 0xfce3cd740526e3185cfc5c5 0x436e9e05bc0502d03ca363a 0x5a4799eb94cf8b4b4331a202 0x78160a91498f380c69bb6eb0 0x110f69dcffe119fd0875353a 0xf3c6eb4d79deaf0843de9bf 0xcff560901bb829e6e7261abb 0x3127fadf8fbc676a4ee8fd7d 0xe5b554fd519aa322898a4eb 0x884908e6eedc26e373862ae1 0x89bc419a8005f2db0a01be8a 0x6fa2f95b09f9cbdbfe5fff7f 0x5314a63c085e706d2e2202f 0x4fdae04bd3360dea65d73d75 0x70ec334f382394b6b28c79b5 0x41e8e6b823247a3a3e827633 0xe883dd916120c33dfdda695 0xd41a1e2521072515921ca082 0xa7e2ead7dc2eb809fb9ecfde 0xac67201870fffa6be685ef01 0x12b9ee87d415b1662645de71 0xc655452f49a4190ae8a9a013 0xfab22cb8e9d448fd2c7ef248 0xbebced3d7a7f951b11f2243a 0xe943de0458817998f402cf3 0xa4b0198ec9cdfc1a44eafbf5 0x237467765eba67064175eb8a 0xfa2962b06cd8dbdff3757083 0x155cf302dbaf0c2ff0e290a4 0xdad160520bb76d34bc7ac56e 0xc855410352eb70645c14e20a 0x66f3f75e772a417014b2ef42 0x7b32960c0547f45df540f3b 0xcecccd927f17cd0d7e2fd94a 0x7430e5fcc06cbff815685b68 0x241cfbc7b569ba83f51adb03 0x6cf06d0bfdf01ccc1e9923 0xfa480673f3d339d55a0dffab 0xccebb577e7da5ea8afd7f477 0xb363d14772facfd45f0fda67 0xb8c79f10b95c089247d2911 0xe11facc3380e907d1905eb5a 0xa752398a6d6e2b322fbd30eb 0x19215a992f15c77abc7c2443 0x15e6d566e6540ea4036064bc 0x4ca89824862b0fe128878c35 0xabc3be287601c51685948172 0x9ff5adbcbf4a27f8c6f750ee 0x160ad5044014c6d66fc3a031 0xe3873061258ebb44fcc7f959 0x2594534daeed0e02e90b47ba 0xe275f0af0689907bffce9d52 0x5aeba7b852857163c041313 0x8990d72606d06cfb07f39e05 0xccd85231fbbea75fab1a4e6a 0x2cbd27d04a7e9f1351e4a2e5 0xaca6a92ea0a52e6a7d1621e 0x66b0ab70d85ffca67d6c6cf8 0x9360da42861634bd1a4809a3 0x1a20de65749bc5ce672f8907 0x17ef401bab06528e273b6d8a 0xb9532fe5ef4c33ed0ca61660 0x3950b0e59e1f7f552e2d2ada 0x8adf86718b6d46d5bb9fe2bb 0x451fe4ad43a5b0c7ac79fde 0x341618402c7477d82a3e8f7 0xd2d03885bffe9f28a198740c 0xa54c4ab00dee78513e0c7017 0x66934a3c2f3c925cc03d71c 0xb3b535350ea34023aae0c529 0x27e128a6c9c9f0f7f9d6fa5d 0xf53a58a2f7057f569e4d394e 0xd07b87327ed0e75ad3784f1 0x5403c59ece0b141294644094 0xfea6dd2332827003816b9100 0xb2312cde66ec54ba2d87e44 0x200015f7e37f5a7e8a0a67c 0x1d46ccebe54b567bb38e075b 0x3a87178b9cf2359548aa1606 0xf1667e939333308781e2c4e0 0x870807e6cc57d52e3d0eabf 0x5acfcdd9db060e07b9a5477e 0xb0b4257a545f96eeb27a5c86 0xd7ee506751b63cf831539f51 0xe3d0a5e31737e4ada13d5ae 0xb1daccdff9e3b02eb99c9bd2 0xfaf5c851bb84118c8be36734 0xdbc2a8fed85e659710a74254 0x1552dd1a48264a780c527907 0x6d51979690e3d2aa65a251b9 0x9593d12dbe7c43db738d7b4c 0x6dcc1481d14fb2d8266ae789 0x66e46c6cd9446d06df53b48 0x6605eb435c4ebd0a0497e9b1 0x2c0f1485ae55ef77e5c64fd4 0x6b23f4ddc34c92bee932cb91 0xf99e590bb0dcc278d1e92eb 0x38a8a4b2e6130276a8b19dc7 0x40d05a518819b81cadfb3b78 0x3a0c8d21ec5fee368fd79d04 0xb1b9e6e496d6e291f68be98 0x10de27c7b2c14cb5f91c1150 0x8b6c7ac50a1e90048e8be264 0xfb48cf939bf1297aad7e9f1c 0x50aeeafdfc035d1a4c073d6 0xa0d2ba0a3ea03ea7773493fb 0x20ea4171d4d15ed88cf15918 0xf9925a4a7d0d0d870d1b56f4 0xc2d7729b020a8f27ddf3c83 0xc2e276cb6342aa83a7b31d17 0x8d87be19143dfc8cc27b54b 0xe5c8cfb2c78aa242ee72c877 0x120959d37365b9016a945c9a 0x68c891ca823c558703a13eb3 0x28db14a04676856b21a3138b 0x6828db1bd87f1d1675d156d5 0xb90cde6b207f9a48139c002 0x556b5c2476d7731b33667525 0x5bc4663e392cba9b1bcd6dae 0x81789c28a5e5752b4fad3d98 0x13331c4d551df2a83884c401 0xb722b7623aad897957a3a7d5 0x1a1e1de68dc23aec03f59e28 0xe5c3969c335ba25acefd6dc5 0x18b032eb2e80f8f3ecd440ea 0xca5ab8f2e17e99ddcf740364 0x1bb4295ba6e82e2cc02105cf 0x68c54cbb1caa5f10b2ffcf3b 0xd0a465be4b484431f00f290 0xece10fd1ec2526274e15010 0x6c38bbc93bff7bc0bd74cc39 0xd4bddae1344af34c61afa665 0x91a8ac3544b0c8ba0a8ac63 0x2a607087e6bde889cc92c185 0x2c2b0c09c5cde53be312a72f 0x8995dacde103bfe06e9adad1 0x15e385af85bc304e647e1e98 0x1ff945cf1f4e656659401534 0xee3f4543ae273c970801ea35 0x127b4a8c1d1e8bcf4dc7fd88 0x19b6ecdfdffc0df022f91e53 0xef8f08d9a9a3a555186c4082 0xa15420c3c7fbc8f058008eb9 0xbbbae0e5b32afda5cb001417 0x3b493380cc37fed8e407847 0x9de98e8f7eaa20374492687 0x26692ad9779ea3be9203bb9 0xb0b931202f1ae1fe2bd0bb91 0x24d431d61375990f5f62100 0x46c384fd5b5f6d1e6d488e9b 0x704b9ef14ed96d8f9056eeae 0xcb18fd31e9b0222cd838db8d 0xb5fd328065de8d4177b008f 0x4262a18ddd2c1f1502d2eafa 0x3827daa77dcc581a34505a4 0xce3e271ed2a7466e7aae0071 0x73ca2c922710f6659050689 0x21f666482f32bbed57a743df 0xd4d8b0e83f063064c750daaa 0xf0d23172748599e4858fe7f7 0x88f96f80dab15366d1d83d 0xd9ede0bb8860e527d94a1884 0x1d4c8dc71d2d8cf143c8d3bf 0x80eb1bacfbf8787c558c53f6 0x1741af1f725c6363c7c6bcb2 0x4861fe8dec92bd370b7a69f6 0xe827f7f9ceba9e9bf234b042 0x4361d55cecc754bd28244a1c 0x59693f4b92831da4772aad1 0x228aa84bf320963354a0b401 0x5d399f1f448a01e7cdc18e2b 0xa1dcc1d04adae2a9b9f4b07b 0xff43651d43c45f8006ac9b0 0x301f401d0044ca24bb50ac39 0xb094f06bf5f3ba3bbe28a02a 0xa0460a94e4ddf85e29f8b5b5 0xaac48d385c7c3ca094eb988 0xee1c6bd643ccb67d48d7684 0x28df8ee1886b8918add3cfd9 0xd8777029f571eb73fbc16dfb 0x789a883a46cd2e504b9e3bd 0xa1c00a4835a213c072d3cf53 0xeedeaa165713fdfbf4c951b3 0xee2902c9083f95e71b952de9 0xcbda3c0f90e33441a3e988a 0xbd4b7d055184e65bc1b85b3f 0x8df65bcb933091d8bebbe92 0xddbfc3e72041ef386eeb079b 0x6960d39a03f92a588434125 0xf9b598875ee727152ab98e7d 0xe5757841771fb6bea7339d08 0x7781cf2ac78a68b67084542d 0x1219a95bdac7971b15b180d7 0x6ef16a573c5721146d0979ba 0x904a1025c0ff57537b72975e 0x94fdb9eb6e30dba73d3eed0b 0xc338cecfce180b763fb1685 0x45572d56131bfa537024ad45 0x6692f082680d9071fd4182c3 0x4faeb73a1c9624107245e1a3 0xedea3690c207a2ef9c390ce 0x33bfe449643e1d541cbc56b5 0x976b98af4009820fcb8e8a57 0xb798e550dd18aa60556cdc1c 0x201428bea6b74f62b865d6 0xd74b277adc178c83fee45707 0x72d862d7f251be9fecd3a69d 0x68ff37e498a413d27ee6b663 0xca234dc81b158dfd5819618 0x84f225df7e37eb32f03f0509 0xfa3bc3343d4371228ef1113d 0x41903d32d08ceda6fac0a379 0x1172e2624d2b36048913408e 0xa4e3c3fd41ee83fbc0142bc1 0x60f28693295aa48fafd1c1a4 0x76624838875b9549495f45a1 0x1618e35afe3306ee70533431 0x4210f45cc94b46acf78cb3ea 0xb208dec04b525a66290fa42d 0x98cb20aa43fdfa026fb2930f 0x14cf86492091441a28da10f6 0xb6b449e0d806af6997eeac10 0xdd674f17f8e3ca724ac29c79 0x2665e77ddbedbf4f1c645d99 0x1b5ebe85fd62ee54af49fb9 0x8d6cc2549b02d5fbd0f654c6 0xe4d816ab5c24b1704b7cbb6b 0xb0fbc864b4d5daad822e54d5 0xd9e9a2d00b3a55e2e3886f 0x15ad97a7231f9cc5b64a32b 0xaa7fe448d100d812085cd467 0xf2a5628ce8b2946467d313a7 0x11ad19a857da6a8ab56f4a86 0x8c4bdf73df355c01421f8182 0x9dc32eef4cdb9ec98aff144e 0x26922bb4d2865680004c8141 0x2fb02b4b68b5435d65a2efd 0x6825918c431d7a0ffa0d96c1 0xfeac80d119fdcb98567b7ba3 0x583d5ec9aea401431a7c3f31 0xda98424d575ab17c5bfbbb7 0x91e6ed1a36ae326c746eeb21 0x83d32aa99c0b814400cddcc8 0xc7595efb4abb09cd43e07871 0x2a08fcdbef8f6f799d6d0a8 0xe6bcaf5efe34f211e56021c8 0x715435d8838941f125b89d9f 0x4c5dcb275d0e9fd274b8a42d 0x14d9ee7dd39111a000d842c9 0x2473a5d45c98c970517e0c 0xaa590fc6a9fc9403d16ffbd9 0x52b7dc481be04c65a9d5558f 0x14ee7e6ea9835f4a6091304e 0x7b0dcf4de2add82d7df24cde 0x969af8efd70bd3d6ee5e0960 0xae2067dbcc1f75457578f85d 0x1169c7296d7cfc96f63c4cf8 0xea19761673e4cd145bed1c52 0x37ae47a0d4e3ca14d5171e4d 0x4e00902b0f862ce85f15263a 0x3b3e95734339218feff6d93 0x14a7b22a15b8488531d55845 0x6be258f5efa5dfab5202c6ff 0x1755edaff95e1fa193450992 0x111e9296f51336a02237c841 0x490e7fb5269fd240e64b8c52 0xa9a59f806f5e4380f0c7f26d 0xefe838d37e05b64f5dc2ba04 0x32751a69e56429db7e137e9 0xcb4661cedd820a20452acadc 0xc66fc856d884038da48af1aa 0xb4de14fbb0494785c3acab26 0x81e434bac03341a0e9ae4f5 0x20db3855056411522f6e65 0x35aab33ab3bc8f699cef1dc5 0xb890fbcfca8506f8ee5381f5 0x65892c99f46ece1d6b0666a 0xd6627b57b66aaf7540ba996b 0x5435e52f126a40fcf31e4d0d 0xfd31fd727427275b156b0383 0xddf99956e61ffd1ed847cab 0xb97b0b6474aa0ab9a595db84 0x486576cfd713af7e0bce603b 0x4256d4e49994aac133cdfd48 0xaa2d286dbc14dd9d2d009e1 0xe0e9ea5b9821dcfbede3f645 0x200c1353d649c96ca05f3017 0xef78942021efc899e3f2590d 0xc0de0d61359d39dc570380a 0x5956dae8d74c705910412f3a 0x115058d516da3bfccc21cdc7 0xd468a105687cf57f7e27e02 0xb144df142443e8115fe7d76 0x3f7de1171258d8cd75c32919 0x50f779d02bc3e3177829d67c 0x4b467fa3376c12393d57b7cb 0xaa61befb6fc55bf8dcd6cca 0xb70e7d2e97415aaf11539fc4 0x92103c3d7a2556134017626b 0x65b765030eaa8eb97635ec8 0x17268d1468dfcbb736fd1b89 0x74e15cf1cea23e511ff494a0 0xfab1564d9f332b4548c4ef9a 0x956b8784e64e2a6b981a3881 0x54f9ebd3d9e22e492c11b7f 0x4cb892b31de90a5c4796715e 0xcf20afb0f0b3155a3b19f684 0x381f50db5a36e3e37cf4bdf4 0xfe4d276b097b13d9c8f1f4d 0x827cb41a45da891728a3bfa 0x854f58b7ec6e75717a428f58 0xec826b3d2df0550d273ea01a 0x3b23227f029216f88491f9d 0x6807985d4258aad164a85091 0x6443747fad02cfa717e7600c 0x2ba17ab219dd9fef73beff96 0x3097b4aeb88fc57b474dce9 0xaaa4f7150647a2c093e00e9e 0x918c02140d380f339f73495 0x87af6b796193cad19ccdc604 0x5e0366e26ec9047cdc665c9 0x710d23f4c3e16220d1908b14 0x841626ec1f4c5159bd47c06a 0xb1bba595cd1ccce8d4950d7b 0x15db9dd15060f04f82f303b2 0xffb506b05a53b985432b8cfd 0x316d8935c7256a224cb46211 0x4dd46db269b93f4976c72fdd 0x11f3d4511b87a205353ddefc 0x345912c326e9beac55aa1a35 0x63bf4675e314b188e05bc6d9 0x54f7f254ddf6e29ce337b56e 0xafd952170daaeb60e1e1f2d 0x39e348835f112559ed6a932d 0xdafe0a8642e856caddd72f9c 0x312e7e5ccb9a99532dc3ced3 0x787257c282a95567c628768 0x76b90aec4a3ba6966ba3146f 0x177a27be0ff2c774f97e5f99 0x40abbb46aaf92ce54f1e754e 0x181b51de1762c4b98845b00c 0x49a70b4bbcf1b9ca1b9a16b8 0x4c2a7a2e30a00810338f47e8 0xe672df4f2e011ba14d3ed18d 0x19a8c8a013dfbaa736b8c906 0x11c57b0cb7cb1dc5604c0635 0xaac6d0cb278a3ed8cda8dc1a 0x303738158f408b6353cba436 0x4fd74cf09a15485b148a01 0x7264d0ae82087536b36b013d 0x2e9879c37945970a1614f418 0xb7e1126732e3c80a882a52eb 0x2990eb06052254ebbe108cd 0x6f24e6e70b26cd9da28d6b5d 0xfaf3b171eb8bfdd69d980bba 0x85f202d6d482f662a16bdc70 0x10082da093f80e8f61261f0c 0xfa07b5166098d993eb4bb010 0xf585d4f5bb840bea850ae714 0x2bbe46497b3591df52e6c263 0x1607003f4d271afce583cb47 0x1fe697864d831c0d4d5b1c 0x1168f610d4cf81403e963556 0xec21b47047dbb2a7e550fb22 0x701a8e321cf73a48201c860 0x8f3e662cd474adb7dfa61222 0x9223bcbca0abf6ab772ab85e 0x44cc2fae7e9cc48cdc827f43 0x835ef97bc679d80ebd35d3 0xff0f47f72044cbcfa09c1531 0x9a9eeeb2b1f0042338166db7 0xb5b1ff9f1eda8988ba012460 0x322604f60ec53ea6760bb93 0xd799c63a25b90126b838e5ee 0x7e70842a8b5f30e088e28f4d 0x98ddadf005bb577e591a2819 0x5db0e446a877dbb0403ed9 0x873aee87bfd3977f8d82a02 0x6639a3943cdb0f84bd0dbe73 0x3916257b29ba7b32a144097c 0x1165c0cc65114fa54dbbc505 0x975c3b247887a958e08daef 0x949f171688644314a88b79ac 0x788cf3cefb828053604be98f 0xbb2108985e6e161458f2f08 0xa096fa9ae226f4479c116b08 0x64cc587180717b397bb3f172 0x4f396d2c434433766fd69166 0x11d9e00a16020f6cbc7eadd 0xa290c907dbfc8ba90ce646f3 0x3b1775db55f69391710ad15e 0xefa03a25f047852402d04ca4 0x1922505952e2ea65067cb34f 0x149d3e7a4651c189190aba09 0x90fabde93c99ddb9c919385c 0xb78520ac52bec547a4206aaf 0x104961f0e5b211f5340fc3cb 0x3bbc4b620dae4b030bbed27 0xba8406a5e8c01f4aafbd6abd 0xfbd89aec6a906cf0e5b85496 0x890252d0a76300bd8a9b9b0 0x2b42d2192898b83fece843ba 0x27d754e9ef98c389378181f9 0x18d05db84c814f54b3571b4 0x15ba58c23a6fd3d9d40c551 0xc6b920fa6d595941a03e3c9d 0xad814e1b4f292616b730bca9 0xfcb2beb4b49821f8a7beeaad 0x4146fde5e4fec9f8552f5cd 0x3ff3dc2fff02eb07408c3d20 0x71b154c09ddb66480890447c 0xe236133863670595e26716da 0x1632d3e89081354fcfdfdf22 0x4baf8e9244be7caf9f49f09d 0x9e852f0a6a9f9f305c486767 0xc4a74ef9e4d189a7cda359fd 0x1029a3096eeebdd7734fed29 0x4f4b01810198c5587f9b58b5 0xd53df38cd13bd96cf3ab4b21 0x14998c45b9eef288aba04ce7 0x452dcf6b6fe5100b0f7559 0x43ae18704a5d076122f68494 0x20d68fe8f79b38dbd593ddc9 0x432542be643dbda20f412531 0x142014e26bdea94e28582104 0x53012104592122a293c7101b 0xd18efdce911d73dae6bd1ba7 0xa579fe05a8b342099dc9d492 0x19f9f67556f9d578c4c8ba81 0x7d86e110ec32a37523e7b769 0xe379bfa8bb68507d2da76089 0x6a5a1852ccefeae75d6b80e 0xb60e250faa9b601dff6f1ff 0x76d58f3a02c6ec3d07605e39 0x4bb3c4a18abc7cab789b6a15 0xd37b0d0bf7e5bbfaa984792c 0x11b4bfc79421b35cf739a629 0xd58d81606fe6a329c0023a16 0xc2299bea6f23c372065cc2f1 0x23ce179b01af4e7d97be5a27 0xf9c8cb42214ca721f8d7b30 0xcb92327dcc429a816ec1005d 0xa325649e01f25f87b8e26770 0xa78c54199720e4e374a85d72 0x54530c61bdba4b52706d655 0x3190f60b4923d7703f7d8d17 0x466101d8efbe3cbc55001dec 0xe93c50071ea0cd7e8142acef 0x83b8d0ff795072a7cafee15 0xf4548eb78d5973fd8732b895 0xa97794831ddfdc62af2de1d9 0xf5ff54b43972b90b2f752d55 0x68fea1cfd09e3da7a4ff36 0x3ae090961bdb8ae9569e1dd2 0x1ffea4307a7c94251ae03d6b 0xae1e0fe8245b59bd8c660a35 0xa548ffe59a365a9ad8f324d 0x4b79466fb98dbb71bcb5aa81 0x7ca5b21b36ee3d71404a8807 0xf0d48354acf0a2c8183503f 0x747403e028c5a9ece5dcc9c 0x276ef427c20b1d90a472a026 0x29ddf71f8feeade1a5277d4a 0x793b396fb88195e29db20bdc 0xc0b2f691f55cd3b38d18bfb 0xabab1768448bc2dd56315aee 0x62de83fb31a85bdff92789b9 0xf32a05cdb8593f74352fa4cd 0x42fd232ba1719e02685b9df 0xe8a35c9a5380e28a9ec00119 0x8bb9c2871398032b480a78d4 0x6619eb389065087853b2737f 0x109bdd19eaa21b255b49600f 0xb729dda160d3fef7bf6bdb1d 0x22b097e22d52fc379a0c520c 0x71f68f22e44de33692cad282 0x1446f2315fd0400b321792af 0xa52848b24b6c2275dc88e385 0x1d818b6bda9ad00d49738a4e 0x891b6a3c245c5b5126c333e 0x72702eda9ff5131d21511c 0xaeb860513175f55bfcfdc6fa 0x760d280c5957865a68628e69 0x4f2aaf9e238cbf8987d1fdfe 0x16e29390458be723358c373a 0x906faa4c5fc8dbcf10ce8438 0x477fa5361a28748975b3189b 0xa09b6482dfa61331f125c883 0x137ecd16cb71d79ea0530c4b 0xbc0eda07f2798ec81c7fea9e 0xb6e530c0121eed072f230e2e 0xa63a3b521cb38652dde4d176 0xf78833de1d399b9da436527 0x7032383054132ac24378dc5a 0x7448c34ce2c26df07164c6f0 0xbb00353d2e105c1c45443e21 0x17930adbfea68af5666f5ca9 0xf013d7982f05b680a82b8b39 0xf6821535eccfcf4dd4d1c8a2 0xd5e712772bf9340974f45d69 0x102355301f89f363d8d055bd 0x50c68a7f59954b64599edcf3 0xc106322d0789cb04077724ab 0x582929562b1986dc1ca1b9e2 0xf5b9985cfe7d98ad807f708 0x81d5676b01caf38740786fb1 0xee7c8b72f15d12af45986b71 0xb30f9ab1d50553e7050d0301 0x19605197e351c6ba55fead81 0x48f0e44a15020dd5c096dc8e 0x746bf4d345de507852943704 0x770d2694abc4ed1386eed05c 0xc0675f5574e945d3099c955 0x1bb54da002fbd0454363cde6 0x6d3e1ff3b3a5b74434e5594d 0x20e49d45271544d94ae0c254 0xc9590f65c2e90d5a2806471 0x9249ff7888f03dee6b2dc5b 0xb1dd5c8bb823688363efc221 0xc80983c3fae66a6a5f40fc7d 0xbdadef52167fb2c28fb959f 0xb29c0ceb26f1a416c1094cc 0x313066345a336fc6ae724fde 0xa58b2e4eebaaf17c7808da33 0x1116c92c90d044008cc446ff 0x29c5d3ef16e6e2b6964cc51c 0xc7f3dde22689fb0c0d458bc3 0x33cff814b622a9afa86ab702 0x1945927d93cbead4bca47693 0x3feac6c8b4accf0d3acafe89 0x8064a58bd0f9834c37b73629 0x89f9e128873ce697d49cdc98 0x17e104ffc131cdc857d61018 0xba783738396038713d00672d 0x8708363d766c883905e6b213 0xbff6bc1a8b48e8e9e80c379c 0x68d957306c77c34f865ea3e 0x3c2f19d1511b45771a6b29c3 0x551c82500e70b2f92ca2ed0d 0xf07613a5b38c7deb6d42584b 0x18e9663253acc0dc2f409695 0x4b9cf885792986099ee19ecc 0xdc88a5fd1c3f422951345ad3 0x1b0abdbb18065cb4529fdc4b 0xf55171f1639eb2eca07f1be 0x233ce06fe941e748532898f2 0x51a203cf1bd0c73afc6945b2 0x95b7152b55a6e207316776c8 0xb621a1a795cdc8734dd5190 0x70931af96e8c07e3bc265239 0x9816dfd477fb9bbc5fea0b76 0xc195b68bce367199e3444b25 0x5d091b46ed78e4ff1455328 0x9b3b3e9802218183e77d30da 0x1513df569d929f4547db36eb 0x9ce9ffe2c13d22dd6052d3ae 0x68834b6fff8129fbae31f1f 0x9ed6414419393a93e456acf5 0x29ba6f2c425790be8fd16f7f 0x9acdc7a40d6ee272bb29a75c 0x3284f38c16593d561a8c499 0xa96b1ce451cb0a9b35d57443 0x411367e49f5288c94c0a7a67 0x5bbc9cb2a2fb718a8b6ce761 0x631d58446b1e69525ec312c 0xa142cfb7f4bb3ba9ebdb17ef 0xd97c63518f16092cef6820be 0xc863967d04f72a0cb4ccd502 0x117849f55fb51517461c97a9 0xe01049ff331aa25776292d5 0xca9f5597170bb0e030aae17d 0x5b9c04951d2f857dcb3f26cd 0x1553ee33dca3e0898a32193 0x3ba03c82580d9a620c2e8990 0x670d17a79c752713a0e4a226 0x36b48f54921b9b960f4ae66d 0x15e1841ec83832f15a787e18 0x56857e6e54f741178c9c55ef 0xe224fb22bf6cf26106779d0b 0x18c3b9d4f94569f8d6cee7ae 0x52e09054eb5d6bcd79f2d21 0x9debca186d8509580dc1e310 0x5ca75c25aee4dbf1cd1ef6f7 0x91ea7aa4b2227a1bcb9ab7e9 0x5c3947f7a3318974ef5073 0xf7f830bb88c0c1bf155dc67a 0x49ce4ef3c3fce94f0e7dd0c 0xa602600eee0cf50e16a7aa08 0x3d5e6452192e15ca4ec2b86 0x8e2d581fdf01507703e509a7 0x5bec5b0e324673ea2e83feb3 0x5b338e0c14119e52f64e9053 0x147f389b7f75d321255acd76 0x3c436c5b0d90125e012b4b23 0xabc236b338bf7dd63721db8b 0xd46431f1ce8c33457345c376 0x154aee0a92819e264f8b4d20 0xffa33b5e920553aa1274dd02 0x95219b975a112a809d219921 0x53d922b017fdb807d5df9fe 0xf389b90dd9e909ff0f843f6 0x121b6c5dc687ec584cf25f27 0xb7d94539c2f2e21c5d26399a 0x5c28fa7f5882a8a61225a329 0xe3c4a9eb6777f1a31fdcfc3 0xb7d3a57c51b2e40dfd1e0f85 0xfa0e36f56806f6a22ad52e30 0x85f201bd934d8df90fee3e94 0xc1208541bbdd08ab3235a61 0x93d97565c094b09892665cf5 0x670f4b0ad0dc3aac3898bd6 0x4695040a070ddaea203e0539 0x27725339265a5602db4fa1e 0xe87f576e8152664c57a7d0af 0x322df7d6d50c4643cdead442 0x4f32a48dbf341ed2460d40e6 0x63860bec109813f7c578477 0xf8369838cdaa390d1523033f 0xaa82a031d2f971a149b03cd9 0x1854d70b9569c3613427c1ae 0x1955a583ae982d315754b410 0x6234a7dbdc14fc7b270fa04b 0x81e14caf9aa46a68b2a8df5d 0xafdf44cb7ce2ba13b8df4ef0 0x2ba538ad6abc60423bae9f2 0xea6614a5d7f8e38f691e633a 0x1f89920d3c84abb1a1636b58 0xa069094ce1373fa8f012529a 0xe20b2e7e20c44a25f6d4ee1 0x1e8dac5e06f44685fec96a53 0xfa5572051877b714d8e86153 0x6a7f8437445f0a1d0a5aa95e 0x88db8e8c4ac476496eba57a 0xd7c3c2ecb9298f769b6d17e 0x24e219030fcdb8b6e276989c 0xfe1f66d40845e412cf3efaa4 0x719058055f776a2a6c9630 0xeb649f4544a9cd4b9ca4799c 0xa4bfe4ef9b7ea4cf8b2f5211 0xb30de35c9a0ab6a718d6c92f 0x11489c4e97c809c43d65f585 0xe75d279404de8672845776af 0xd2b61d4be076b9551b39344a 0x9713aaf55355b60d4da59415 0x3ff109cb30eef9d72281772 0x3a49cac5f5055836c8928bae 0xc0a4d95777a83cbbb63a591b 0x152ac33e753d503ada178776 0x15f8c6377f271d9b7be54a67 0x77fb22889f7eb15cc7c39e83 0x41f425906f95863914cd67c 0x35e49f877f0ada93efc9c84f 0x138560e98b89cdfca055ab34 0x767ad4f1b4502665e4a052ae 0xb9ac1f2058bd948359c2ead4 0xc7693dfb87a3ed635841f761 0x1023c8a85fbd41d185071802 0x80509b13e048b43a5d9d8588 0xc7a3be423f99afe88ed14537 0x203bbeb566b44d13b2ddf895 0x135ac8f7efa1ebcf07bb82d7 0x42d8fe333cae108a77ca58d0 0xc2eed5e769b0fea49eb4fa47 0xe5e9ee31ea96b6b7ae927bb6 0x22ebe3546e29c97de60fb91 0x6da6873e07a22406d301e452 0xf47045caf01f75b0f3461b17 0x19c7921c4937e96417cd5b9a 0x2daf62bbbeaefccd62caff 0x114245a908973fae6a1b46f4 0xf9a4d2277e72e97154f003a 0x38322e6657d0f2872eb01bef 0x15be0c6c55f1a559b0504ae3 0xde2ca9b44eabf042e2614e3f 0xcdf91038d0bd9bb283da2ce9 0x1548c6ebacf851514436d6f8 0x18467a472a6d9ce79fb1acc0 0xe7a627a95663a07cf81b09cb 0x479b21a0252c00edc59e37ff 0xf0994aa1ad0d11ecba5d3cdf 0x16fa52025eb6ed9fd8fbc0e5 0xd0096e806d59ce1881e98e01 0xaf6c2cb8522e98b7af8fb047 0xbe620cbd9945df809b50c775 0x1262be16005e2055f938ce6e 0xead0da47d5d87aff2bb63c5f 0xca825d7d3d95104cc0091fb 0x63c6c8c59b0269cd257f5810 0xaa9546811b7b1073a41e407 0x6d008a897c45d55af7852b08 0x47e2cc36a88ed657ff6dceb5 0xb8629cd38033b744c9248337 0x18f98d32ea041b43876d4e17 0x3813b20df314805da7303621 0x882ce17f42b8ece26446bf71 0x25a7bb349419cb7db9fdd68a 0x312478e139224bf00ca65b0 0xa67606fc37a69877df67fcaf 0xde1179dc9dabc6b8101de756 0x720f9a17ef9f19ef7131c000 0x16645b7219f80be780f46ca6 0x798b76f1a62b4cf31bc23090 0xe680d9de8ff5c78f8a3042f5 0xc7a859bfb486c6c7fb6f6f86 0xca09d590ec3ad24136601e9 0x45e9a1d20c623de5fcbc084d 0x8b18d2d9aececd37ff2c9e95 0x82fcf5bbc69622ae8c6fd686 0x199b0d9ed7da00fd9aee06ec 0x8d76be7d7392f95864d51d23 0x39637b68a91538500345f10b 0xff447040446992313e0aaaed 0x14ea925283850adef85e6339 0x8e6885f182a0e934650e9169 0xcaa512342220b47ee7ceff92 0x5d160550a8273f00d42dfb11 0x16474e24be27e42cfd4944d2 0x9f084f361ea6804245cf5842 0xf87461fe30c1c3ecf39c64ec 0xcdf716718217f3e74b498b40 0x8e9789bd99cf9625497a679 0x632398b0c8790d309e076416 0xd598b0b96ea0d7319dbd31b4 0x7ff3a4bbc8e4c684703df5c9 0xf42b9bca34dd9ad3d40500b 0x63e8e79c12ce5470d39b1019 0x9496ad5d6511164fa1356163 0x65562df64272da93af495c84 0x8948b2454ad3569487de18a 0x59b1f912c30b719e99b45128 0xb3cb119f8612ca2c044f6ae3 0xff50eff26e95bcea0c863ac8 0xbcd111137f9f8451586fb81 0xd682dcec6e8a4fc16debdc12 0x4d10e7a4f5ca780ecf8e5bea 0x595326692abfe883cedaf4e8 0x176e2d8de056f31328ade3ef 0x3d24bc054109cee227366be1 0xb9aa1bcc072f5cacb96415c8 0x51ce61332687aa4055ad293d 0x996cbd0ea6ae5dc37839ba0 0x7704338c0d79a357476500cc 0x71a89e803feabb196b125cda 0xdd952941434ee33e81e2626d 0xc53d020e269a788ef27cc73 0x68c158d42b0e95c86e2f3728 0xf8b592f13761253de7341622 0x712f7c2a1c0990de5ef9ab76 0x897b8725f1da185c4a50663 0x7b5caf4261aa3c53b4b38a47 0x3549273b0577b4232ab70214 0xb9b31c1c7e2691e87eb3a7e9 0xf0183500b44acabd322b0c9 0x5eecc6b6c23611c2de1703f3 0x11bd67d3bd2994541aa11bc9 0x4ad809c53e00d56e7aedddf8 0x158db651913021903da62bee 0xfbc0d5d0c5648f18bcdc68a2 0x66184a79d58836419b06a2e5 0x95482cd356f2618f01f7db86 0x1629b5be821830972b69f57 0xe46ce45c45a549873eb1f3ad 0x6278664420c9a1bc42222e8c 0x3203ac1b6d7e94f13f719a98 0x193fd209a93f0018108c171f 0x169311f520ff8b23fad2bcc3 0x395798936e40725d185bb969 0x4aec4ea469a4275b58e06dc0 0xe0854cde2a3cf3ea837c560 0xf084f2d9e95fdcc2c2ea11fc 0x1526acc7d6d7d9e2ca5672e6 0xce4c1c42cfa3079796201ad4 0xbf3b0f76aa7c5cd4663d348 0xd0b1bbe32c0ff886d6e3b13 0xe686451efa8b026cda159916 0xb00ec3dc44ce3420b193841c 0x3e3c8b9cae792d7977261e0 0x68b3ca109e3b60c02afbafbe 0xfbbc822a51e927c3e654784b 0x68d7ea78ef1a7ea888ffc6ba 0x77e2055fdd1cc06a503f95 0xfe23f6162f85db68e97e99fa 0x8ddd0f24f28ef2db648217d1 0xf0e4a224607b3639deffd400 0x180578dcf940548d44dd985d 0x1c5e7b418c65d8853f9eceaf 0x1ad40943470fca1d2c94624c 0x83ed5b7fafeb77a14e84ebd4 0xb52400b600a2b293a9c5a6 0x5b103edb697c5aeae6a12725 0x73d9d9cbb9498fe66fe2e1a2 0x35f34b756a4e357cb41ce68e 0xce7d5d1545aac5d1ca1f4cd 0x69 0xba04c0b00a288c2d5170af8a 0x43578ee59a65f9132c6e9922 0xa97d7f14fe97a4d1496bf08b 0xe2fda4db28034299675707a 0x61da6b4f91e061093f004809 0xdbd1bc730a0e6168004f584d 0x30df243628e7d3a07c92195a 0x185ba48f71e1e6373151097d 0x500e95ad08635840013c41eb 0xfa87647d9d34fcc2199a929c 0x253fce933aa62d880d77b1 0xc4e3692af62720137d3c064 0x2f59c537b3b706cb79225189 0x99f51e494a9794615e58e8b1 0x5f78938c6f23ef23cea0f0ed 0xc137274e536a58d1fbeb1a7 0xe644a01b3a56e72220859bef 0xcf7852cc056afcd914743db9 0x36dedc7c4f07d1e4c139639f 0x169e54fad157b01d9b3932c2 0x6fbd70a9998de236ee2cf875 0x65395ca544050358440ffc96 0xf45564337de394f5f50452f0 0x4129b1cd00bb40f6e70eae2 0x5acd5a73b10b236f6b0101fb 0x4964a3be8d606cd7823324ac 0xf4c6e161ec86a9ec5c788614 0x197a0e1e4d2d46056886c41e 0x79ef6d5fd17275ac17958899 0xe76f25ea873eb091fd0e3593 0xaf10c6e95d255b153b54f117 0xf09d7c7e4029a5ebab8c3e4 0xb623534b68b4de2a9e504944 0x5dc42063eb6788be30855104 0x86856aaaf4630fac4cf90088 0x246487b800c4699d6168181 0xb0292472df62b151e74eb404 0x3898aab0433af994d6d8db4d 0xbbc8fd3a5147e34537c398ec 0x19760ac08b09037a54b82d83 0x6882d94bb6e5c5eac327d35c 0xcb2d478f77b53bd0f660a14f 0xf2c6f3d3aef514669d14f5d 0x33443271f9ddae9dfce319b 0x1f0bce45149d1a8b36d7f082 0x5f19d981af2cbcc1e9e33b20 0x9a19392e78e5ce064af43cea 0x3b16dedda745a43251856d3 0x7220d09f5ea13c570d2d4a38 0x878d6e55a8e4132810ff4af3 0x9b1d229a83b6ef4ffeb128e6 0x755ef48289c1f7230f49d18 0x114b9f54fe271f8cb25ad209 0xea24d0d970fb074adb305c67 0x11f5beaedfe0738138a61650 0xf266442b60f47edca36a9c7 0x8d9468dc0dd2fde565deef97 0x3ec8c471bedb07e33afac150 0xd4de2028355b5ad095da2f6 0x11f232156a74821317ba1b41 0x49f6e4d64ff4f72aa8474d22 0xd98900062cde17e11b6ea17b 0xe81e2d9ee36d372ca98e445b 0x14ac8417efa0cb6065194cff 0x387c048406d3b8da6c24d1d4 0x7f9f643368ec98a4ecda1dfb 0x1ee6be52b54bc05a254e6e84 0x104c70053bf478ec4adda4d4 0x175cda6f27e58fece5d32bc8 0x907c30c6632fd19d7ed52cf4 0x7167301f55e073b7de4d4fa7 0x911350ca68a57bcd574f47a 0x18bc3bed7990c0e92ccc44d 0x95743330d9174b76e0fb4b0e 0x8b286d11e2167d8dedc58ea1 0x8cb423221a61069d4ea925 0x41e80c14f782686c1faf8ffd 0x99fdef24e5bdb2baf0ff9af0 0xc9292bedc13a7ff3164550b2 0xc58847b60bb79a6c43ba2c0 0xbbb74d265fa1b99e5c921aae 0x86a831f476ae8cc622c0759b 0xb57fb9f14bfd5338e5dc13e4 0x1c32fb29689fa25d80fea4d 0xd3a3e3ff296edaf39f42f4d5 0xc87ab9831ab8715ca32dac25 0xc9afb68a007cf846b14ea54d 0x5ae40d260caf3a94e4abe7b 0x7813a077f3f706e48e538e99 0xc693c7f7eaf26cd63d304649 0x2cce2942a0bf887969a29169 0x38f879480fafde2ebb9324b 0x887aec197ef015a934f542bb 0x7e50adc245e2cbf8109d9e79 0x31cd584110de02aed1b64ca9 0x10b9bdf9b304d2cad891ef0b 0x4b54b51958a572ffbc06fcb2 0xf03bcded479922556e13edf1 0xae9df97229cb9858aec8c3f8 0x100c29d5ce82b274f39c6bc6 0x3439730d019bf3fa672f92a8 0x152ffbe17616f7a8893aefc0 0x438c04932da4541d07e467fb 0x10a0957ce2b922d3ecf9461b 0xc2524a42365eb87abf551be9 0x17ff70557f76b6ab05098159 0xc855d1d01ea79216b47d6fc0 0x182f9e3de703c00d99a02169 0xd62959105f084ca796e6072f 0xeb8ff6e5edef048a26641f0b 0xed1ffa270313cdf6835379d7 0xd0d58ec45d8de1d3d753af8 0xb2a6e85d40be532c4883115 0x241166cdaab170a8a1b3de8d 0xb5f3a41da85f90b796aa24c4 0x102a088ee67e54a03ed73ec2 0x33cf07673edc387757890161 0x209d25650f94e302c4dd9851 0xa8ab7483fb890abd9cd37208 0xf75669fa44cd5d88004fd6c 0x757cc5134bfffba5bea0f0ef 0xbff11b2a70c5138cce241d40 0x480d43575ded8c76b8d93690 0x2804a8bbfe4906caced599f 0x4a3cd179241f248ca9387acc 0xf7b80f9d2b4cdd522ab93af8 0x6f91727e6cfda09632c838cd 0x144e6717322e297893e00efe 0xb2cdaf56893eb827510ce3c2 0xfd193f5ac4bcedadc6227d8 0x33a344d39bdec56e67d2b154 0x673784895cb9570d355dde4 0x20d66f49ab8a1ac98eb44ed4 0xc6ec14b636450aa7731810fb 0x2a58d55f2f80c2013c01e180 0x1378cb04d20cf2d1a55ca4c1 0x1551740a20171deaf43f6c57 0x17463ff57073f0edfab4d8cc 0x4fc64adcadff851a36027dd7 0x1140c1d43f7ecf85a60a0501 0x5ec04ee709cb0f6cf13188cd 0x34fc68d94b41a24e72d2228b 0x1f1d3b93b42df08b4749e03b 0x7029e233e13483c5d76744f 0x8454a875782804e855339c8b 0xc13fb4c77d7edc0cbb8a8749 0x7d6170277f32010d9ff246c8 0xa3a689c89c0412f990779f4 0x1c1abc4f8da98b1cf48e7c2b 0xc67f1ee8ad490e93fcd5ce7e 0xc8f125ef87399ec35ed915a2 0x53fb8d30aa7e2e8996c4952 0xfc852c6fe4d13b65d77793d7 0x97a6fb84131e03d7bcf9383e 0x997dabeb385ade2445430f44 0x167ebae9a3bcafae95c71 0xd3bf78a9b23ba7d8cdb187c7 0x83b62abf268b8c1689a4ad0d 0xdb3cbdcf0c617cb64c6711ed 0xc9be3ae4e0fcb1b6898277c 0x708cb2108967f692963adc87 0x3045b7e9875696b93c95b7c 0xdf2db1f79927799f519702cf 0x11feac74d655a20118741dc6 0xb091d4f09e82a97a9a3cdcb9 0x699488369cf96bfc34ae02cf 0xa2906a0e409b96bab75153a2 0x131f660295a6f4e4371f9858 0x430c154e72ac9eafac182477 0x5b9b58dbd06e12062f0d8f14 0xa199384bd3dc3b0c6d07631b 0xabdd772fa24fc5aa13cd775 0x97f322c39d2cb0346858130d 0xe63b59f915f9e3fd7373c788 0x6019752229b8f16052ffc49 0x16e8343b926199c9b8c61686 0xc6e34c57cc433b4f9ea4adc 0xcfcd5909573929acf4b17ef1 0x635ffcdfdff3c913c7561517 0x16e6079adca840b1df6c9267 0xa24e6bddbf98ca217c6d03fb 0xf459b544b0cac53cfc475162 0xc602c00481028812d95e7b63 0xba7a3fa1d3b5f05cd9e2a56 0xfdf7e33c3ea61caa008bdfc5 0x952502fd9b648ea240cdd43a 0x9a5fed539c7155ddc4951d78 0x173903663615bcee3698cfbd 0xdfdaa273a5c0d8d523dc383e 0xfcdb3da176ff0ed48f9f3dc6 0xccc828b0e381856fd6f383a8 0xbd7bde8b926b5e0a442ae29 0xad28071430a9e3caec0a5928 0xcc160a58f6f719f79d81faf0 0x5964fe74cc7ad0451cb73bac 0xa35716666d99377187ae89b 0x9aded6b854586f541bf96c58 0x171d3834f32957a5ec5e35d1 0x28536de2b5fe9c969f41fd3d 0x11367055fb122effdaed8a5d 0x1440a3979db61e0b3043bb3e 0x14c6e8e24eeb62f04188603d 0xb3e9c81c42f30cd088ce2f2f 0x68a43a8a3ef9af0af4c0aba 0xc4e5c38f9f20ea3a37166f67 0xe29193a63cd6b343482f8b9d 0x7dca7b3735953698b217500f 0xb4466aa3c83fa32f0adfc53 0x236f126c0cb69408dfbb0490 0x8524e0090651e742dae84cb3 0xef3be04878976c3a01cf4e29 0xcc65ab5f96469d9f7ebc457 0xd2a76858e9eebcdf781da351 0xf94144a713c92e448ae1674f 0x482280cfbe9d2b384ad03455 0x129357a735c9baab14a8fc3e 0xa708b96c8744cc35d5eea5dd 0xe70d538ab470e729388db00a 0x897cf2393881052da649dc85 0x149189286f8a946ca9f77275 0xe69cf9e9eb9ee9dfe316df1c 0x89b7455eb1da5d628eb56bb7 0xdef2c432786bf8a78e434e22 0x187d9506399842930bf2045b 0xfff4a26af25d59761a5bd80d 0x4085a4f84a0c3e254ebba7d5 0x12d5037aeb04284b2ccf4591 0x147a388027cbf5f6e6d9177c 0x2bdabc2b3bffce4b54d253c2 0x6dbce8ed0875bdd19b66bd35 0xdcc240c6d83cd3622446ce12 0xbc8a245c2545127912e659b 0x2d5c72a2567cfd3cb19a8b98 0x23f349233517e7a76d6a758 0xc252aca5aa4b7d841d873399 0xd7ad85e7716185f54d44e55 0xd073cdaf5900287e5232b499 0x6ede5fc19a827f075393a1e4 0x9725c799721612b3bdd67e31 0x2922bacb9d8db3196f481d4 0xd9dd4720b35f4cdd179e6e5 0x1d9ccba15dd23868343f1837 0xc474ff0415204728bd15f449 0x1793a8f3f8b5fe16d95d4e12 0xbb6d047886bf65768376ae55 0xcc1a1162edbdf56b0cd344dc 0x774ef4b9bc65cd1b08119171 0x16251d29cc44973ded38a449 0x9bb8111b59f7178bb29b7847 0xd5edae2c3760d87d4d386a8b 0xcc18b9d0e2040b2aeb49717e 0x7147cd85c3bbd4489dd6daf 0xc5a78b93898c184df3ab5044 0x70154f6baa1f6fc1a5a4b7c6 0x87a7da6c553bd30a7b4142a7 0x2db96ead1d9c825c6795e64 0xb0902e33637feae4c9ba395c 0x285e665882ad5ba18189c200 0x11c396d1eba983f2bb52ed54 0x1d7c0c8296b1c2acb3ea02f 0x5664ec5529ef08311ca06b54 0xe2dd672c1a54d3dd22417326 0x45f31b98b4c48b5b8c12097b 0x15a1d31902e2d9a53287803a 0x5d214f5cff43e3a5d4df64e6 0x46c5ac3182cced428549f7ab 0xc4de4a599098ea8456edc309 0x16f812e9e34484c26a593594 0x8dc9514ee3c9ead6a37ea6 0xe6856835ba0f218ab7f3b2cb 0x5aa2ed99081351616e6b4e3e 0xee93b713d1818f609002ec8 0xef973edcb6c54fab4058e20c 0xd8ecf24cc522d192b4dcf1c2 0x888dd788182185d28393158e 0x18e8913ce1981ba3fe434050 0x4f50b9bc25b810e20b2ccd5a 0xc07ba2efa850e38980a94161 0x31cb9ca338ed86764597a176 0x166293c818b6c2676badc5ea 0x2fd679bdb857564ae23c7a45 0x4581315f52c9d5d5c14a72b4 0x6ae1ba8ead7f2be4839ccd62 0x17731bf6f414ab06824227b8 0xcb8f1d80929c3f57ac9360c 0x59ac2bd1f5a7bc3c335d4c4f 0x7f50d742c2cdd9c3f0202272 0x120c5a22261070318e19e9c 0xca1188f434df42715d5022a3 0xa8f614cabdc4e9464987f938 0x9dfd65b72caf2f773c9c36b8 0x806e9a0cdfe75b4713def7f 0xeebfefbcbcbed23e2e343c06 0x8d58226dbdb9a366f3f86229 0xf2d2f8ab1774e37afb855e74 0x18d30f309b2c0de4c0c34f88 0x7cf1f3d0aa660b65b9beaeac 0xed598065021d1dbee1d4c170 0x186788d4580ba289d33aacbc 0x7685d2ec1e3416177c1a53a 0xfbc87d47e6b724dfe58eb1 0x8ff9a0bb3a3f234b65516f70 0x72d91620805e0bb7087d7ed5 0x2b9f2dfdca63d61bc1095bf 0x9d8864cd46c3585e3151225a 0x8ade56cf1aebebdab1f263 0x390532d97527b27429b8d956 0x73024ec32b8951ed9ce3df9 0xacb32bbd064122d36ce16eab 0xce96b5f7650e053cf6759e74 0xd905fcb797e52dd5011777b0 0x4bd4ac868804461b59b716b 0x345a5034ddbddcc120c9abfd 0xc9488f9e115fce3684ef7bd5 0x2bb252d37f2fe52a84354ead 0x179e57538cf1872bac484902 0x2352df834db2a359cf5ea766 0xcd3245834ccfa49b57bf4ff5 0x771a121222e21c79ff48db55 0x18864752b080057768da3da6 0x430f21a54e0ebf368b036311 0x1290d9a6252bfd3f0a2ef659 0x51ef1607a25988a208dd124c 0x111b5bb503e5d26e221d100 0x312908221bb809e21ea00047 0x7cc3251cc32ae0d199300a 0x4eed95926350e8e52aeabbbd 0xfe922333217e2c86640d75c 0x4bd8f548d1e4b8e8e18a6324 0x90a3564c741ec09093bbed1f 0x1a994a52f0a07e5b77253a58 0x3d049ad4d46d3874193221 0xc91dd3850f7130c40931db2 0x35d742b2489659fa282101cc 0x18e762836e9d1e4979b2b908 0x1c698b5a01da981b382e60 0x89ae288588dfe54aaaf94c01 0x7164a52ea615810420488da1 0x274dfa46431733fa6fd8bb9e 0x1414b6a5ea35a2e269f4bbbc 0x7e6f5a5e7543894555a90fca 0x7fbd93f25cd14e4431aad360 0x9871911b316fb50da4ed7e83 0x1836a6ce4b09ad4f9c06ccb7 0x454c11a9cb291a644cc32d20 0xcdb542878fa179965cc35520 0x315e15084ce844087e049bee 0x55897baf4842987db2963de 0xbae1ca4f6237ca83ed1cdf33 0xc5462e53ea7d0445bcb147f9 0x8cb314d75d75d98475e5fbd1 0x1009ddd6dc1f54b9e16d91f6 0x4b953f93d3bd5a4d32c5cdd0 0x546a59c306baf4b103d15fe 0xabd8d29437b1366fd8e4f480 0x7778ca71768c8d3d269eae3 0xc2acf6716ac13e56991c2c54 0xcd272d89bd480bf4e182dae3 0x9e959bf967f36df9bc60d0b3 0x1d2937a66b93e14850bc2f5 0xee3de5ad527139ebc8c95762 0x37fbb4a1bf1f0ec917c74103 0xea256de3570370f0f5866c3f 0x9b0f1efca1b8ae18a39ea3e 0x735785157495f21290cf31e8 0x5553303465ef4ac83dc8456e 0xa338721e9f1ecac7aee88435 0x96c59dd5835b52a17a52e4d 0xab19adcd06571d8705f787af 0x96479adf1f2a2b63a23f51ff 0x6222563899051e82f45b1679 0x2401f9980f3cb26a75c0e7 0xe9bd49f6974c0ca10d06e9f2 0xa255ce5c4a23670535d4fd65 0x9c3b34fbbeb90225203b5a99 0x10effdbfc94027336605a6f0 0x353182e902287c746bf69cd2 0x89a7b040d5b3197755201de6 0xe6031354a80468aa6d8ff0b0 0x57fbeb5a2be602a8b96b8a1 0x5d2bfd0aa3bbbbe734acdcf8 0xa5ba630865e8ebee97d0c3f0 0xab41d7b1d1bc761b28dc4936 0x7055cd27cde3b14a2fcd7fa 0x274703c8131615f747c290e2 0xe933dc126cb6c2d097743ac 0x39ba715f2960aca115ebf51d 0x77174c0bcfb02a9c3a53edb 0x7f5d45e481f4e95e77973da1 0xf82c70f103345dc82fe6cd6c 0xd1c70dda252c23e5d68b7866 0xacb5edc70f1dcb30666c070 0x90afaeb4788628cac73dee5e 0x245295725fcf2d66f559cc68 0xc4fffc2dd7f5c4fd318dcc 0x1673f940b1625d97685d8d7e 0xd31e73d18c5a6b49b22b8ca6 0x8fe4507cb5ae9abeaaa9d0e7 0x82565193839c7cc8d0f30422 0x134ef2bda01f788c2c1af4a4 0x26d8480fb979962322391c78 0x5702fc72f0ecc6c940a3ebfd 0x1454ecffbf0c44c04528aca7 0x133e261d4f7f1198673cdee 0x75df206bd6a086118153843f 0x6e126b958b7dafc48e89b7f1 0xd6b0e615138fab659904cf1e 0x1195abd285b0d1043b15e0d6 0x4ede788d12a824ac2fb6961e 0x9812febe11899247c63ca52d 0x8c8b94d15e1140bb869d75bb 0x10f54cf4298c5d1400b504be 0x2afb8efe0eff0a495c2f755 0x9f73977a7313534860f603ac 0x1533be839a58149180a81c12 0x160a7d8d9832c16f08b8ea60 0x5fdfbba9f25307249e94beb7 0x4e52f95f59a83567e2e94c4d 0x98c9e626e75dfbe9619b9ba8 0x1669b19cbacfd3d568389242 0x5ffc0d14a5f140e71dd32dde840adccbaa7b219338835c93b6f07ca32e2d8f2 0xc 0xa32ee30c3d029d864507394d 0xc3fd32fb148ef096d056a4cf 0xd6057025fd62f50ff367018b 0x14f5f43eaf8f65a0744c89ef 0x9fd18c27cba0985972317e8f 0xda8029593c35f82b1babf4a5 0x19d691e8ebf33b62a07dcc5e 0xc550a2b8af74ec248ef6142 0x10000000000000000c1ade26beca39798 0x94d2c61646aaca1 0x100000000000000002a7388403897adaf 0x100000000000000005c8fa4951f2ad290 ================================================ FILE: src/contracts/autogenerated/groth16_example_bls12_381/tests/test_contract.cairo ================================================ // Generated by Garaga version 1.1.0 //! # Starknet Verification Contract Tests //! //! This module contains comprehensive tests for the proof verification contract. //! The tests use Starknet Foundry's testing features to verify proofs. //! //! ## Test Strategy //! - Use real proof fixtures generated by the garaga CLI //! - Test both positive (valid proof) and negative (invalid proof) cases use groth16_example_bls12_381::groth16_verifier::{ IGroth16VerifierBLS12_381DispatcherTrait, IGroth16VerifierBLS12_381LibraryDispatcher, }; use snforge_std::fs::{FileTrait, read_txt}; use snforge_std::{DeclareResultTrait, declare}; use starknet::ClassHash; /// Declare the Groth16VerifierBLS12_381 contract for testing. /// /// This function declares a new instance of the Groth16VerifierBLS12_381 contract /// /// # Arguments /// * `name` - The contract name to declare /// /// # Returns /// * `ClassHash` - The class hash of the declared contract /// /// # Example /// ```cairo /// let class_hash = declare_contract("Groth16VerifierBLS12_381"); /// let dispatcher = IGroth16VerifierBLS12_381LibraryDispatcher { class_hash }; /// ``` fn declare_contract(name: ByteArray) -> ClassHash { let class_hash = *declare(name).unwrap().contract_class().class_hash; class_hash } /// Test the verification function verify_groth16_proof_bls12_381 with a valid proof. /// /// This test demonstrates the complete verification flow: /// 1. Declare the verification contract /// 2. Load a pre-generated proof fixture /// 3. Verify the proof on-chain /// 4. Assert that verification succeeds /// /// ## Test Setup /// - Uses fork testing against Sepolia testnet to access required declared contracts maintained by /// the garaga team - Loads proof calldata from `tests/proof_calldata.txt` /// - To generate the calldata, you can use the garaga CLI: /// ```bash /// garaga calldata /// --system groth16 /// --vk path/to/vk /// --proof path/to/proof /// --public-inputs path/to/public_inputs /// --format snforge /// --output-path path/to/tests /// ``` /// This will generate a file `proof_calldata.txt` in the specified output path. /// You can then use this file in the test. /// /// ## Expected Behavior /// - The proof should verify successfully /// - The function should return Ok(public_inputs) containing the expected public inputs /// - No panics or assertion failures should occur #[test] #[fork(url: "https://api.zan.top/public/starknet-sepolia/rpc/v0_10", block_tag: latest)] fn test_verify_groth16_proof_bls12_381() { // Step 1: Declare the verification contract let class_hash = declare_contract("Groth16VerifierBLS12_381"); let dispatcher = IGroth16VerifierBLS12_381LibraryDispatcher { class_hash }; // Step 2: Load the proof fixture generated by the script // This file contains the groth16 proof calldata formatted for Starknet let file = FileTrait::new("tests/proof_calldata.txt"); let calldata = read_txt(@file).span(); // Step 3: Verify the proof on-chain // This calls the contract's verify_groth16_proof_bls12_381 function with the loaded proof data let result = dispatcher.verify_groth16_proof_bls12_381(calldata); // Step 4: Assert that verification succeeded // A valid proof should return Ok(public_inputs), not Err assert(result.is_ok(), 'Proof verification failed'); // Optional: You can also verify the public inputs contain expected values // let public_inputs = result.unwrap(); // assert(public_inputs.len() > 0, 'No public inputs'); // Additional assertions on the public input values can be added here } ================================================ FILE: src/contracts/autogenerated/groth16_example_bn254/.tool-versions ================================================ scarb 2.16.1 starknet-foundry 0.57.0 ================================================ FILE: src/contracts/autogenerated/groth16_example_bn254/Scarb.toml ================================================ # Generated by Garaga version 1.1.0 [package] name = "groth16_example_bn254" version = "0.1.0" edition = "2024_07" [dependencies] garaga = { path = "../../../" } starknet = "2.16.1" [cairo] sierra-replace-ids = false inlining-strategy = 2 [dev-dependencies] snforge_std = "0.57.0" assert_macros = "2.16.1" [[target.starknet-contract]] casm = true casm-add-pythonic-hints = true ================================================ FILE: src/contracts/autogenerated/groth16_example_bn254/src/groth16_verifier.cairo ================================================ // Generated by Garaga version 1.1.0 use super::groth16_verifier_constants::{N_PUBLIC_INPUTS, ic, precomputed_lines, vk}; #[starknet::interface] pub trait IGroth16VerifierBN254 { fn verify_groth16_proof_bn254( self: @TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; } #[starknet::contract] mod Groth16VerifierBN254 { use garaga::definitions::{G1G2Pair, G1Point}; use garaga::ec_ops::{G1PointTrait, ec_safe_add}; use garaga::groth16::{ Groth16ProofRawTrait, multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result, }; use garaga::utils::calldata::deserialize_full_proof_with_hints_bn254; use starknet::SyscallResultTrait; use super::{N_PUBLIC_INPUTS, ic, precomputed_lines, vk}; const ECIP_OPS_CLASS_HASH: felt252 = 0x396d5915ecf475aab117bb25a0272b261e9e25ffe1c0ce05a51a3f77489c89e; #[storage] struct Storage {} #[abi(embed_v0)] impl IGroth16VerifierBN254 of super::IGroth16VerifierBN254 { fn verify_groth16_proof_bn254( self: @ContractState, full_proof_with_hints: Span, ) -> Result, felt252> { // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok(public_inputs) if the proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given // a proof and a verifying key. let fph = deserialize_full_proof_with_hints_bn254(full_proof_with_hints); let groth16_proof = fph.groth16_proof; let mpcheck_hint = fph.mpcheck_hint; let msm_hint = fph.msm_hint; groth16_proof.raw.check_proof_points(0); let ic = ic.span(); let vk_x: G1Point = match ic.len() { 0 => panic!("Malformed VK"), 1 => *ic.at(0), _ => { // Start serialization with the hint array directly to avoid copying it. let mut msm_calldata: Array = array![]; // Add the points from VK and public inputs to the proof. Serde::serialize(@ic.slice(1, N_PUBLIC_INPUTS), ref msm_calldata); Serde::serialize(@groth16_proof.public_inputs, ref msm_calldata); // Complete with the curve indentifier (0 for BN254): msm_calldata.append(0); // Add the hint array. for x in msm_hint { msm_calldata.append(*x); } // Call the multi scalar multiplication endpoint on the Garaga ECIP ops contract // to obtain vk_x. let mut _vx_x_serialized = starknet::syscalls::library_call_syscall( ECIP_OPS_CLASS_HASH.try_into().unwrap(), selector!("msm_g1"), msm_calldata.span(), ) .unwrap_syscall(); ec_safe_add( Serde::::deserialize(ref _vx_x_serialized).unwrap(), *ic.at(0), 0, ) }, }; // Perform the pairing check. let check = multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result( G1G2Pair { p: vk_x, q: vk.gamma_g2 }, G1G2Pair { p: groth16_proof.raw.c, q: vk.delta_g2 }, G1G2Pair { p: groth16_proof.raw.a.negate(0), q: groth16_proof.raw.b }, vk.alpha_beta_miller_loop_result, precomputed_lines.span(), mpcheck_hint, ); match check { Result::Ok(_) => Result::Ok(groth16_proof.public_inputs), Result::Err(error) => Result::Err(error), } } } } ================================================ FILE: src/contracts/autogenerated/groth16_example_bn254/src/groth16_verifier_constants.cairo ================================================ // Generated by Garaga version 1.1.0 use garaga::definitions::{E12D, G1Point, G2Line, G2Point, u288, u384}; use garaga::groth16::Groth16VerifyingKey; pub const N_PUBLIC_INPUTS: usize = 1; pub const vk: Groth16VerifyingKey = Groth16VerifyingKey { alpha_beta_miller_loop_result: E12D { w0: u288 { limb0: 0x11a6ad63c049a0774b1f8d69, limb1: 0xf7fca2c91020c7f53e2beb4c, limb2: 0x2e0acf1407b6b19c, }, w1: u288 { limb0: 0xd4938178efd479c0f958db9a, limb1: 0x84c3c18b6204eec59b85778f, limb2: 0x73ca31ecae7d32e, }, w2: u288 { limb0: 0x72743eb58616c0e417c4aba3, limb1: 0xb4ac27c376d51ed710fba137, limb2: 0x1acbdf1cb7d3466, }, w3: u288 { limb0: 0x93acd00474adbe5d51facd39, limb1: 0xa9189ccc1f5ce888cac4749a, limb2: 0x1ae9e30c3e513da0, }, w4: u288 { limb0: 0x84916f4f6a4f628bdf86d2b1, limb1: 0x77860ba9a989de43f309fc67, limb2: 0x269bcad1c0ce254e, }, w5: u288 { limb0: 0x7138ef04bab92f97355093e0, limb1: 0x66da4e6149cb9e2d53894518, limb2: 0x39d844bb6b441d8, }, w6: u288 { limb0: 0x9e481d49fcbb14d72c8f3700, limb1: 0x582640a337edb441a9237eb0, limb2: 0x6ac2149bd480805, }, w7: u288 { limb0: 0xd952d96fdf1298e24de9a8ec, limb1: 0x6bde8fce1837818c1bb4c7d1, limb2: 0x173e64f406ad3079, }, w8: u288 { limb0: 0x7e3e90ad41525ee5ab604479, limb1: 0xc5868b5aaa79f89f3b0d38c6, limb2: 0xb2c95b493361fb1, }, w9: u288 { limb0: 0xf35cf1f086baf1880d2a6e2b, limb1: 0x500d80de07da8e3ee9d854b7, limb2: 0x59e0bc51eb3a8b1, }, w10: u288 { limb0: 0x84fbc02aadbc9e8ee74e83f7, limb1: 0x57960adc97b6def2fdd0c8a2, limb2: 0x17ef7d97b124dce5, }, w11: u288 { limb0: 0xdd2d75826bf4ec82eba0dcb5, limb1: 0x286e75e7626aa2c71f7ffc8e, limb2: 0xf330011992a685a, }, }, gamma_g2: G2Point { x0: u384 { limb0: 0x89e732f5f87195d15a4ce637, limb1: 0x884359c76cc9c6b81d289d33, limb2: 0x3541dacedd860ef, limb3: 0x0, }, x1: u384 { limb0: 0xe313e222b376d9a9da02f080, limb1: 0x272d9cc4aa2e71146c83c13b, limb2: 0x2eb7d1fa8416da97, limb3: 0x0, }, y0: u384 { limb0: 0xa7d48b949e86c8b00eef73f9, limb1: 0xefcb8bbb160b0f2ecb7cd98, limb2: 0x8dce093ad7f7fe2, limb3: 0x0, }, y1: u384 { limb0: 0xd917839a146ea15cd7493f1d, limb1: 0x6eb4af5910b954a713c49174, limb2: 0x29a4b793edc63974, limb3: 0x0, }, }, delta_g2: G2Point { x0: u384 { limb0: 0x63d786683ef471af4434acdc, limb1: 0x185580c9ee198f6cac8bc784, limb2: 0x34fc9ba8eba1e49, limb3: 0x0, }, x1: u384 { limb0: 0x161153d19ebc7f594246b9b0, limb1: 0x61912be284ecae3a3f0899bb, limb2: 0x17f115a16975c6f2, limb3: 0x0, }, y0: u384 { limb0: 0xb4dbc7294e1eacf59b3e2054, limb1: 0x31c92abab72ef0ed83a3c195, limb2: 0x17fd1ad43bbc8ef9, limb3: 0x0, }, y1: u384 { limb0: 0x55b6e98c187b34ca3e7cd1b, limb1: 0x6ff9481052ddb780a4cc43da, limb2: 0x1bd7d75bf918b676, limb3: 0x0, }, }, }; pub const ic: [G1Point; 2] = [ G1Point { x: u384 { limb0: 0x62587fa0f6c879156e7390bc, limb1: 0xc9da665a8bebfd01ce6489a4, limb2: 0x124e30bf4dff3ae9, limb3: 0x0, }, y: u384 { limb0: 0x50c0471724e1b022791c7532, limb1: 0x5e101dd2383fdc600dcb4a34, limb2: 0x1fdc3a96cea49b08, limb3: 0x0, }, }, G1Point { x: u384 { limb0: 0xedaa0ed100691cceb974c6a1, limb1: 0x26a8465790ba44ddb5716750, limb2: 0x164668f89d9d6c61, limb3: 0x0, }, y: u384 { limb0: 0xf3d9d0426a702f368be936da, limb1: 0x153290e7b5c8497412386c61, limb2: 0x1d9c7309625ec7cf, limb3: 0x0, }, }, ]; pub const precomputed_lines: [G2Line; 176] = [ G2Line { r0a0: u288 { limb0: 0x6262802b3d1fc57f02eb7de7, limb1: 0x90ccab72e89abbdc16280011, limb2: 0x178e51f74b0542e7, }, r0a1: u288 { limb0: 0x12a071ce64f150102f094209, limb1: 0xaaad51a68888c9f4d366eb85, limb2: 0xb854c3062c6dca4, }, r1a0: u288 { limb0: 0x88c793e1f884996295be7f4b, limb1: 0x9801cbb1add70980a565d93, limb2: 0x7f1a23af3e93b10, }, r1a1: u288 { limb0: 0x16b6ccc140737723f6fbf23c, limb1: 0xfaa6476d81d4fb40a38fa84e, limb2: 0x1d370360026ceef, }, }, G2Line { r0a0: u288 { limb0: 0x6768b1b65ac701242d58a4d5, limb1: 0x9a21b14a1117318e6e93346c, limb2: 0x28206643cf01adb6, }, r0a1: u288 { limb0: 0xc733c609365fab81f5bebf8c, limb1: 0xe7dba9325253668b9de809ab, limb2: 0x1e2aed8a72758ae3, }, r1a0: u288 { limb0: 0x95ec7d05aa1f4c5b117cc3df, limb1: 0xc9473775e0fd4d6797d4fe54, limb2: 0x28418cb32e9a4478, }, r1a1: u288 { limb0: 0x2a17416676088b3ed523bc76, limb1: 0xa7a7189cf0cb6f593da6398d, limb2: 0x1646a797175de826, }, }, G2Line { r0a0: u288 { limb0: 0x60f4a61ff00c697d5917f60, limb1: 0x27839a4398e69c8181596a80, limb2: 0x18d5fc7b962c5d42, }, r0a1: u288 { limb0: 0x55d158bed72f3c06a973bb3e, limb1: 0xda2f40ff8f88e68c41a7f0c, limb2: 0x24df02427e6ac385, }, r1a0: u288 { limb0: 0xdfaa36ab439bf2b442be7dfc, limb1: 0xaed028fb66a3e7c58d2b0cfd, limb2: 0x2872ac37ed486519, }, r1a1: u288 { limb0: 0x51bafdcbfbad14f2e1810b0b, limb1: 0xbda9fe48ffac5d1cf3f1c243, limb2: 0x2e90de3ce10ad139, }, }, G2Line { r0a0: u288 { limb0: 0x22f06d243ec31a24265558f6, limb1: 0x144f71a68e6e295284eaa624, limb2: 0xb114d08d4730af8, }, r0a1: u288 { limb0: 0xd3a0ee47077b6225045c67ee, limb1: 0xeec7cbf282c77e03df828f62, limb2: 0xbe64d352adee5f0, }, r1a0: u288 { limb0: 0xc7ec19dad21e785ffc755ad, limb1: 0xd24141743526f183d2654043, limb2: 0x1988f55b31c4faf3, }, r1a1: u288 { limb0: 0x994cab0255bb4272f95c3e23, limb1: 0xd922c9add52c749a87cf7c07, limb2: 0xaa4d57bef928d58, }, }, G2Line { r0a0: u288 { limb0: 0x10918d6e1598af2ab245872, limb1: 0x1e2e946c706a26cf28ee3625, limb2: 0x843e82f122ff273, }, r0a1: u288 { limb0: 0xa13e048405c0e094e2be3dbb, limb1: 0xd0749c842f2df1d1f99960e5, limb2: 0x123960e86ebc1545, }, r1a0: u288 { limb0: 0xd2854d8792013fbbc7003968, limb1: 0xef090e40a0840af5ffac6c3c, limb2: 0x822c1bfb2975bb0, }, r1a1: u288 { limb0: 0x3e5a8926c61800d8035940d1, limb1: 0x10a92d1990b5e90459db3104, limb2: 0x1a1da6dbc9d3b803, }, }, G2Line { r0a0: u288 { limb0: 0xf3c1aff57ebd4252b1ee0a92, limb1: 0x4dbf6eac239e2fd65d64b8f7, limb2: 0x26d1f994835b7b47, }, r0a1: u288 { limb0: 0x345e6aaef5a543714baced, limb1: 0xb490ac8096315947ee617410, limb2: 0x1a09bb8870da1b8a, }, r1a0: u288 { limb0: 0x5ebf58b2e5dd76b36593db9f, limb1: 0x8fa5c6ffbd16bb8a189499b2, limb2: 0xaf4be2ac3e90ead, }, r1a1: u288 { limb0: 0xd4b8cde758e0d235326f7919, limb1: 0xcd650faf49b3ee058023c216, limb2: 0x1c00cc9bd40f552b, }, }, G2Line { r0a0: u288 { limb0: 0xfc81a9267fe02a0e01e5690e, limb1: 0x935b7be9ed04f236f8ccb6d3, limb2: 0xd21be991cebbac7, }, r0a1: u288 { limb0: 0x823e612788adf8af694cadf8, limb1: 0x28ffb411c649c749b8b2ab3f, limb2: 0x29f85195d5ae6cb3, }, r1a0: u288 { limb0: 0xa4e79c63454447ad586868ed, limb1: 0x1d25998e1dee245a7a740dfd, limb2: 0x312f28354b440eb, }, r1a1: u288 { limb0: 0x230c5675e4713e459ecf6ee7, limb1: 0xf23579a5477f2fded9e59a95, limb2: 0x23effe3fb162cfa9, }, }, G2Line { r0a0: u288 { limb0: 0x6938a36b06b59bb433023aa9, limb1: 0x9f733207d38e4c21c5f938d4, limb2: 0xb694e7fb696f425, }, r0a1: u288 { limb0: 0x1fb7151f69662f3282addefa, limb1: 0x73b463adbed2a2c44be9521d, limb2: 0x1ce3d8bc49dd6f3f, }, r1a0: u288 { limb0: 0xcdefacedca9cea69a67218ef, limb1: 0x2a61c39d6c9e8df657e11fa2, limb2: 0x287b08ea40db8edf, }, r1a1: u288 { limb0: 0xf3493b34c974473567e0bfd, limb1: 0x62ec80dec81fe20e56185f3d, limb2: 0x2a9d8912a369f0fc, }, }, G2Line { r0a0: u288 { limb0: 0xb7482cd3a64ad7c6972ce18, limb1: 0xc612ec6a27ef894c2448e7e, limb2: 0xb0a181c0bc5bb35, }, r0a1: u288 { limb0: 0x77fd6133c7186e2a51fdfe8b, limb1: 0xb6d8557c94e885365cd1284f, limb2: 0x2807238c4095ab2e, }, r1a0: u288 { limb0: 0xac2bf429c889f4e4fca7ad87, limb1: 0x4e2138d3a53fab48b9372da0, limb2: 0x661b199c593f990, }, r1a1: u288 { limb0: 0x17ad71412ec95d2e450e4a9a, limb1: 0x5a390094f598fbc1c73ffc6f, limb2: 0x1745ca0ad68deb3c, }, }, G2Line { r0a0: u288 { limb0: 0x792e91102d6015db651264a5, limb1: 0xef1739e0f3140e7dae1b9f26, limb2: 0x2c68c775b43aa438, }, r0a1: u288 { limb0: 0x2d480c09009f63ff03bacd7e, limb1: 0xe49d79a774b60104278749bb, limb2: 0x28dd05053808f291, }, r1a0: u288 { limb0: 0xa4f235af16d6b1aa9cb935e0, limb1: 0x3356bbf421edd3b119a977a, limb2: 0x2c3a3e6fb5bf407a, }, r1a1: u288 { limb0: 0x475304a1c01b032aae98253d, limb1: 0xc07800c8acc177d31257f8a7, limb2: 0x2c17966ecef6d358, }, }, G2Line { r0a0: u288 { limb0: 0xe9cd661691f7215396894f0f, limb1: 0x9e3c0f429f703e40f5baa9bc, limb2: 0x1b94de4f8b072262, }, r0a1: u288 { limb0: 0xb2328b5f060b47983ead044a, limb1: 0x5d6772c45ac19b49a05cbb0b, limb2: 0xf6f282c18f98d7c, }, r1a0: u288 { limb0: 0x10f6b52bee174dc609820448, limb1: 0xa4d84cb409d798e1dc4d0880, limb2: 0x1e5bc83da6436d50, }, r1a1: u288 { limb0: 0xce182a96f56ced121091e41b, limb1: 0x8800263a87f78d7ab82d3e71, limb2: 0x2640778c4c20679b, }, }, G2Line { r0a0: u288 { limb0: 0xb78d8e331f9fde95d8762cbe, limb1: 0xe50fc6532130dcab69ccd2f3, limb2: 0x1c5ad86495e84014, }, r0a1: u288 { limb0: 0xfe7268e3ed4b6b97899984c4, limb1: 0xf2e63f6c60064bc7fb5fd561, limb2: 0x9717b3891610a6b, }, r1a0: u288 { limb0: 0xb6a3d0ad2be4cf8a6d7a4932, limb1: 0xf368ce713db6a7c85ce253e7, limb2: 0x11fb9d13419437db, }, r1a1: u288 { limb0: 0x6c0e91e32102a27c6bc0f117, limb1: 0x1580942374bdb287e34d50e8, limb2: 0x25451806c34da2eb, }, }, G2Line { r0a0: u288 { limb0: 0xecf4b439dcb55cb7cd17c938, limb1: 0xaa30677da06e04007bc10783, limb2: 0x5acf050d824c550, }, r0a1: u288 { limb0: 0xfdadd2fba222755a97b93bd8, limb1: 0xc5f72c5874f13b63850c7e3, limb2: 0x8d6e33876937270, }, r1a0: u288 { limb0: 0x48b70ead9b67d481e7fbac7c, limb1: 0xeea576a4020c901099fb5796, limb2: 0xe89161f969f758d, }, r1a1: u288 { limb0: 0x8081483546fdaca3e803ae13, limb1: 0x7b29b6041c0844fb7bd3c828, limb2: 0x840a11945bdaf61, }, }, G2Line { r0a0: u288 { limb0: 0x5257173c58d9ac477f4e7362, limb1: 0x4ac0a4b0a604dc11701ec7be, limb2: 0x2ced1a344a191870, }, r0a1: u288 { limb0: 0xced9cba631d33b433f4c02b7, limb1: 0xc83a4a272ab8c01b6631fd59, limb2: 0x201561c61f1309c6, }, r1a0: u288 { limb0: 0x6c107fe09b4144f1c2e218b4, limb1: 0x6bedd36ccbfb5eb21e3052b5, limb2: 0x1710d637ed85f3f4, }, r1a1: u288 { limb0: 0x2dbf59bd81c858f20f9a2c22, limb1: 0x538891d36da9558f005eaa18, limb2: 0x2e047a78332f57a7, }, }, G2Line { r0a0: u288 { limb0: 0x87ebd70984bc04919fc9986, limb1: 0x49e5baa3bf84014bbfa4b343, limb2: 0x13c681e8a87b09d5, }, r0a1: u288 { limb0: 0xc7ba9d524130fff410f86354, limb1: 0xe56c32754857a3eadf92430e, limb2: 0x12b61a869a91562d, }, r1a0: u288 { limb0: 0xcf43a1c9be7903f6823856c3, limb1: 0x17aa81a20cb8b6533b7e05ad, limb2: 0x8edd93c88eac470, }, r1a1: u288 { limb0: 0x61527058e2d37f7267e2d55b, limb1: 0x4133bd157d450dc27f32d457, limb2: 0x582ee28eaa58570, }, }, G2Line { r0a0: u288 { limb0: 0x8e35c54e5a8fc51ffe565808, limb1: 0x54a5c4c2ce68417d89a41927, limb2: 0x1bb192a0da69b4bc, }, r0a1: u288 { limb0: 0xb15a23caab89361c695304d, limb1: 0xa21ac5490dcc6ec31e532a00, limb2: 0x2c5d334f664f1db0, }, r1a0: u288 { limb0: 0x1513569aab675cc8a80d83b, limb1: 0x8823f86ca10c614200a888cd, limb2: 0x27e75cf5e6c5decb, }, r1a1: u288 { limb0: 0x7dfe801eafb39580b2591c53, limb1: 0x7ad779d2bc8b8960e97e8369, limb2: 0x2a2e897e4fcb8d03, }, }, G2Line { r0a0: u288 { limb0: 0xba5ea5187f76b5704defef65, limb1: 0x8a7319f0591a44264e9857c7, limb2: 0x2d9dd5412302fd6b, }, r0a1: u288 { limb0: 0xaa7e8dec15610116b7d0b0cf, limb1: 0xe5e0a55405629a2fe14bf3d5, limb2: 0x2dae2582a7c55627, }, r1a0: u288 { limb0: 0x303fd13168b5089e4e0e3fa2, limb1: 0xd1d646954006479380c9f8ab, limb2: 0x1b643b47405a9dd, }, r1a1: u288 { limb0: 0x893d761d04a60dae26f4e064, limb1: 0xf185cfd787972d2bed98ddf7, limb2: 0x27e2db3d67b8caa3, }, }, G2Line { r0a0: u288 { limb0: 0xb1fd301f8de9a4fdaa4a5688, limb1: 0x656432730487dbc9e9e29270, limb2: 0x17df9b19f2918abd, }, r0a1: u288 { limb0: 0x2d5832aab61dab3a5549a92, limb1: 0xe47839d4ca00888bb56afc4a, limb2: 0x3fe4c9d799a3bd1, }, r1a0: u288 { limb0: 0x2810fcc73bea01896cd75a0f, limb1: 0x2c92809424a97db06448759f, limb2: 0x123eff8f7259581a, }, r1a1: u288 { limb0: 0x601fdec3567703d1c3d34df0, limb1: 0x7f03a904345610b15ff1205a, limb2: 0x289705e3e298309a, }, }, G2Line { r0a0: u288 { limb0: 0xc16237e16f04d4855851266c, limb1: 0x216a15737a6b54352caee4fb, limb2: 0x2cb963083fceacfc, }, r0a1: u288 { limb0: 0x1d5728a99fc8a6b1501def7d, limb1: 0xc82efa12901500963bbfdfc1, limb2: 0x29472ad7813d3e51, }, r1a0: u288 { limb0: 0x4bc73fff7a02804f65a8b807, limb1: 0x55d252b720478bafee38f7e0, limb2: 0xb89e5290fecd5c4, }, r1a1: u288 { limb0: 0xcecce3e7e700ddfe8b57d681, limb1: 0x6ffd2dd49f2ff2ecf872f76b, limb2: 0x1834d8633ed7aa5e, }, }, G2Line { r0a0: u288 { limb0: 0x921d0a486c2af8e00aca15cf, limb1: 0xce5e704e01a8381a38da803c, limb2: 0x2a3b10f49d66db73, }, r0a1: u288 { limb0: 0x4d5fe5d5c9f584cffdde9b20, limb1: 0x694bbbada9b90b560fe95a28, limb2: 0x1f9131f7b839f971, }, r1a0: u288 { limb0: 0xb2a323906650185cccdc623c, limb1: 0x8643738b8d13209ced4a8401, limb2: 0x1afc7bd309bd2e6f, }, r1a1: u288 { limb0: 0x66a405a6925c6daf1121bfa8, limb1: 0xae0d46e02b0c767a8311def7, limb2: 0x1eac8613f1b73d0, }, }, G2Line { r0a0: u288 { limb0: 0xc0dc2ee8c1634b43c7c67a36, limb1: 0x44b5cda8cf434ecc7f4c6c75, limb2: 0x17ff23c44b249965, }, r0a1: u288 { limb0: 0x6af3458d6fcb51bce863b3ee, limb1: 0xb4c9cf6033098a5367bc38a0, limb2: 0x16b5fff40c83591f, }, r1a0: u288 { limb0: 0x75584b946a79b88e5bec9dd0, limb1: 0x696fa9bfb38fbd7621f553d2, limb2: 0x1bf248055b1b2f90, }, r1a1: u288 { limb0: 0xd45ae28bb106c9cf5b04a1b5, limb1: 0xefc1e176eab50a80b4506c1b, limb2: 0x2d6a0ffa973804a5, }, }, G2Line { r0a0: u288 { limb0: 0x639121398df650418531ec43, limb1: 0xc0dc106ff32d445f63f8a120, limb2: 0x2db69a72bd084b2f, }, r0a1: u288 { limb0: 0x2efbf5c7bf4d8eee620eb8e1, limb1: 0xbebd2c4b9f9ecc3d77d2c81c, limb2: 0x267a73e3f62a38b5, }, r1a0: u288 { limb0: 0x30674b4201c8f6262cad443b, limb1: 0xc6536f9ebec5d19d59f529c4, limb2: 0x226bae32ed07fa9b, }, r1a1: u288 { limb0: 0x3c71a9fed0157d9b2577984, limb1: 0xb147ab8ccbc129533b491b1, limb2: 0x482a238e334dfe6, }, }, G2Line { r0a0: u288 { limb0: 0xf6c03dcc8bd1379820cb9967, limb1: 0xe8b667570844eddc673b54d8, limb2: 0x19130dc068e65472, }, r0a1: u288 { limb0: 0x90bbf7945a517e331f836592, limb1: 0x2051ba8f0200e210ad28fc3f, limb2: 0x177199e9bca93186, }, r1a0: u288 { limb0: 0xb960ca772d1e6bbaf9338163, limb1: 0xa7f34e9ae435bcd02d2faf69, limb2: 0x26dff0b0b6c2f756, }, r1a1: u288 { limb0: 0xd70ea39bddfa02454849f135, limb1: 0x9aaf0bb16c009e3b28d1bbd2, limb2: 0x581b8dda5c79e1e, }, }, G2Line { r0a0: u288 { limb0: 0x463ce7476e959a1931385237, limb1: 0xf75919c87010d96ac7c94cbe, limb2: 0x24a412978f2c5ecc, }, r0a1: u288 { limb0: 0x4564f0aa378b3a5b8d09788f, limb1: 0xf875d0276495706bc0d09d6d, limb2: 0x1b9fed005e16d2cf, }, r1a0: u288 { limb0: 0x26445be3d3f49fbd01c70d1, limb1: 0xd5378dbee2feb0496e798ec, limb2: 0x1e8739b2b619c238, }, r1a1: u288 { limb0: 0x549556a03524dc61169783b9, limb1: 0xec53665fd27c4865c5367af8, limb2: 0x22dbab3609da89f9, }, }, G2Line { r0a0: u288 { limb0: 0xba161cc9e9cebd75b98e13ed, limb1: 0x2632c1abd01681aa124fcbd9, limb2: 0x1bbdec597979fb4, }, r0a1: u288 { limb0: 0xfa0305a260ea7340c6afa662, limb1: 0x39110a94cdd1c5e8cc0a1d1f, limb2: 0x1e788e28c0103ea6, }, r1a0: u288 { limb0: 0x442b863a5c5f8a2c338a4463, limb1: 0xb9fdab2ef9d33c430dece624, limb2: 0x1d5d4de242b83d54, }, r1a1: u288 { limb0: 0xdfb11e4e76affcbb462154ba, limb1: 0x5704a29b1a8e2703af5c3c48, limb2: 0x2312d417321e92e7, }, }, G2Line { r0a0: u288 { limb0: 0x4b8c4313130de071e5a25b39, limb1: 0xf1b3260f13cabcf328b26362, limb2: 0x116ceab520d16408, }, r0a1: u288 { limb0: 0x10523011df0f3a9767278aa3, limb1: 0x16f3307af4c560a400c90ae2, limb2: 0x2ede49ff73a3a3ae, }, r1a0: u288 { limb0: 0xd6465d87f836c70c2add7bdf, limb1: 0xc7c6c33787b9a4a9f0b6a19f, limb2: 0x3a10546e2951d1a, }, r1a1: u288 { limb0: 0xc4462f508080ee25b195846, limb1: 0xa9d1ee563b4765315d3b2423, limb2: 0x22d6d25e9e134bc5, }, }, G2Line { r0a0: u288 { limb0: 0xa8fdb52a5866ede3c829660e, limb1: 0xa747cc99fe24bbc124e60f83, limb2: 0x77dc0694ce277af, }, r0a1: u288 { limb0: 0x873e405654f06e7e618a0869, limb1: 0x5ce484db4f007368cbf5ef3f, limb2: 0x406b87af902b368, }, r1a0: u288 { limb0: 0x42c090f0d49f3b172899d597, limb1: 0xe282930c7a6ae94172637791, limb2: 0x5ae9317bf562ef3, }, r1a1: u288 { limb0: 0x9d38292f11255137c4072d20, limb1: 0xcbd810babdf368eda51a016e, limb2: 0xe4a9c670bc40cd6, }, }, G2Line { r0a0: u288 { limb0: 0x6402739bdeb3492bb057259f, limb1: 0x26c108432264fab03a9dc8eb, limb2: 0x18ef9553dbba8439, }, r0a1: u288 { limb0: 0xa00d189487a0340fd81cc584, limb1: 0xe346065e533d0311d3a49619, limb2: 0x20adf0a42e6d1031, }, r1a0: u288 { limb0: 0x2f40fa2fabe3889e62434f1c, limb1: 0xf5a60a0a1db35e01c23c4618, limb2: 0xccf2f37e5f9d7f0, }, r1a1: u288 { limb0: 0x8755dc93602da01a9bdbf2fc, limb1: 0x9fe1c22607998504f098c4d5, limb2: 0x18f0f45dc543c0ee, }, }, G2Line { r0a0: u288 { limb0: 0xadf84437d9999eba295275a7, limb1: 0x52543bbddf3fc6be2f32a055, limb2: 0x419797ad7a39dcc, }, r0a1: u288 { limb0: 0xb14ccb344bc7ae03672b7ed3, limb1: 0x32b4f3937b94a54a112ec060, limb2: 0xd511afdf9250855, }, r1a0: u288 { limb0: 0x9b40fa04851da740d91800ad, limb1: 0x3b7477878090da8c8f43a115, limb2: 0xbd0be68b2e101c2, }, r1a1: u288 { limb0: 0x15760dce121076360bd9f792, limb1: 0xf1924f92230e898476d82bc9, limb2: 0x304f65ebb79d2bd0, }, }, G2Line { r0a0: u288 { limb0: 0x5506e07a5fe97fdc5664791b, limb1: 0x7aee4b162d0660d41af388e4, limb2: 0x1bee62627e4c1064, }, r0a1: u288 { limb0: 0xdd3ab4c9ec1954b09595dc4d, limb1: 0xd02053bef44757a04f774eb9, limb2: 0x1f8a410c013ff7fc, }, r1a0: u288 { limb0: 0x8dc98f9b1c2f0319008950ca, limb1: 0x4fb659c41dc5601420cab99b, limb2: 0x15c515af959291b5, }, r1a1: u288 { limb0: 0xba1238b4b4da8ca1dc84dcec, limb1: 0x191a2667a2b4bdc6a8d02874, limb2: 0xbacbf0de8be4aa7, }, }, G2Line { r0a0: u288 { limb0: 0x7818f560d037de6bdd24efde, limb1: 0xda994bd7113ddab6f25bf7f8, limb2: 0x2e7509590341ee, }, r0a1: u288 { limb0: 0xd14d410ebd15ad0e2dbeb005, limb1: 0xeeaef525eb5ca49303b32111, limb2: 0x9952bc1815a0105, }, r1a0: u288 { limb0: 0x40511cd89aa9c76b90afd1fe, limb1: 0xeeebf38560f5818c7794c609, limb2: 0x1e9835676b0e4cad, }, r1a1: u288 { limb0: 0xfc4540bcfa1be23824759eda, limb1: 0x761c0a6caea91ff18df75d87, limb2: 0xf4e6c24c41216b9, }, }, G2Line { r0a0: u288 { limb0: 0x7c95bb4a3045f598ec02ad3e, limb1: 0x69527e98f5b823f054558e44, limb2: 0x21990ad9da9ab486, }, r0a1: u288 { limb0: 0xe76176f500a3b7bb7193cfc5, limb1: 0x85b90669c4270df3ba79b129, limb2: 0x780be9adcae4970, }, r1a0: u288 { limb0: 0x481876a8b44064c05d5246ef, limb1: 0x7dab43eb527bd93d1dc91b07, limb2: 0xd714afad4aeff67, }, r1a1: u288 { limb0: 0x81582d4c64462a522c03d882, limb1: 0x609cde5a3b8e8b404e3faf64, limb2: 0x2abe09a84d32cfe4, }, }, G2Line { r0a0: u288 { limb0: 0x6c6df46abcfe69b84b5cbbe8, limb1: 0x43b46da7c7b2aeec2fa935bd, limb2: 0x2f14336fcc2bdbd, }, r0a1: u288 { limb0: 0x9ece765823cf827cccc87414, limb1: 0xbf5d9992534c6831dd441b95, limb2: 0x6f7e39a016feeaf, }, r1a0: u288 { limb0: 0x1759f088e6a22164845e28b3, limb1: 0x8fc900b0084e661b03277c03, limb2: 0x150fc5685af62748, }, r1a1: u288 { limb0: 0x3f0ff585c16da81d8922130b, limb1: 0x8b2bc20a9fc724a9e26c8a5f, limb2: 0xbbd2c609b0705af, }, }, G2Line { r0a0: u288 { limb0: 0xfd726e0bbbdd73195a7edd4e, limb1: 0x80381316ac4cc1180fe6580b, limb2: 0x1679db00b998286b, }, r0a1: u288 { limb0: 0xf4df1c9e315352cc58418740, limb1: 0x609cfd341eddc85035abe0a, limb2: 0xb0bbbf58076e7c3, }, r1a0: u288 { limb0: 0x7f251d631ef9feedc710cc50, limb1: 0xf240804810ec72c3bd6ea838, limb2: 0x238235c3c9db8b71, }, r1a1: u288 { limb0: 0x1846a54b2774044cc6db6109, limb1: 0x588f586073d6e0294383f78, limb2: 0x1439b6a213dd4c9f, }, }, G2Line { r0a0: u288 { limb0: 0x67e20f1add3f4ebf14209db, limb1: 0xf7f6c97230cb77e31230ed5c, limb2: 0x25e1f1a58ef3989f, }, r0a1: u288 { limb0: 0x70b88d1617d059ceb7d98043, limb1: 0x82f9d5ff0ae1136a457c094c, limb2: 0x1e57f0f235835b64, }, r1a0: u288 { limb0: 0x1b7e989c0aa4fed09c6fb03e, limb1: 0x301d42612ab66120ceb7f821, limb2: 0xa616f1fb22b8093, }, r1a1: u288 { limb0: 0x1309fa41e57e07658617981b, limb1: 0x3f8982bf9c1278956955f68e, limb2: 0x2d2c9739573fee78, }, }, G2Line { r0a0: u288 { limb0: 0xcc24c41f4fa231c9b68ff129, limb1: 0x5440abe8953c426a1d9c839c, limb2: 0x2f827a205f84222c, }, r0a1: u288 { limb0: 0xb7ec4f27a8455ed2e02825c0, limb1: 0xf6214b20f2802f0322bf54de, limb2: 0x7b6c0211a56a7cd, }, r1a0: u288 { limb0: 0x3ddcd17909984999f1d9c0b7, limb1: 0xa88f74be516fa85ef09c0c37, limb2: 0x163a9e06932a7748, }, r1a1: u288 { limb0: 0x2430701222fa1d7df18182ed, limb1: 0x1842ef7d1e749169f69cd7d2, limb2: 0x1cfab3ad0f78b05, }, }, G2Line { r0a0: u288 { limb0: 0x47c22ebfcc3068f8dcf02310, limb1: 0x3b3dd7a1f523872b1116c94d, limb2: 0x227ed969d3c4de16, }, r0a1: u288 { limb0: 0x74588d18e59d5afd7d6333e0, limb1: 0x9f0b0142842948df6eb78b67, limb2: 0x2e0977e3388507ff, }, r1a0: u288 { limb0: 0x9edeb901cfd05d4d62c57891, limb1: 0xf2f44c81706b6c574ef74f27, limb2: 0x21c87948f9829350, }, r1a1: u288 { limb0: 0x8dae1edadcbeb24d1690498e, limb1: 0x64a5a0aefccf74b01c6fa30e, limb2: 0x1bc752ac7ac4cde6, }, }, G2Line { r0a0: u288 { limb0: 0x545af0ef26ace52605983817, limb1: 0xa79fd477f6e4bb7b9ff7ccfd, limb2: 0x1ee6d4735695766c, }, r0a1: u288 { limb0: 0x1f7a45146d34eb09a7598bd9, limb1: 0xefa78e89ed2b184fde732788, limb2: 0x25ec7ae4455d5b79, }, r1a0: u288 { limb0: 0x2b6b735fbce332afa29e90cd, limb1: 0x805bb9f2ebc1c6417b04e9f5, limb2: 0xec616e54a8979c3, }, r1a1: u288 { limb0: 0x709b98b05dd7794bab2d59b4, limb1: 0xf9f45610844c2c81a03a8a65, limb2: 0x148662451cb583aa, }, }, G2Line { r0a0: u288 { limb0: 0x62117d56c64475e6fbdec3af, limb1: 0x583fbbd8939b1e224aa95b0e, limb2: 0x28191a7f22fb1b52, }, r0a1: u288 { limb0: 0x4a365c16e3d6d9018e9edc8e, limb1: 0x2349fc23c3d161ad59f146a4, limb2: 0xcff2c08ca6d70ff, }, r1a0: u288 { limb0: 0x9b0f3727f6c65ae514391775, limb1: 0x66f500fff93b94dc25cd2ef5, limb2: 0x1616cc41a4059848, }, r1a1: u288 { limb0: 0x20020f168e75bd67232897bd, limb1: 0x7538b1621f2aae4a1744a9d2, limb2: 0x6a303d9af7e26b0, }, }, G2Line { r0a0: u288 { limb0: 0xe62cde136820c7533e265423, limb1: 0xf793e2f097203fb2839ec54, limb2: 0x2ecea3bada582558, }, r0a1: u288 { limb0: 0xe91c26cff33b3fca1fdca36b, limb1: 0xc0c7af270a2e684511271132, limb2: 0xe5db537a21ca3cb, }, r1a0: u288 { limb0: 0xc5e97fa982d1fafbbd294014, limb1: 0x9789fec81f07b1dd32691278, limb2: 0xd0841164115e268, }, r1a1: u288 { limb0: 0xefb69f6018971aeb3c7133a, limb1: 0x7edbee9a93563bce2898d463, limb2: 0x2d197bf653525879, }, }, G2Line { r0a0: u288 { limb0: 0x37a161654a55fde81d57e5e5, limb1: 0x1d33e1859f025bbf2f252cb1, limb2: 0x256f03ef2e631950, }, r0a1: u288 { limb0: 0x70b359aa3604bedf42532ed2, limb1: 0x485902c5248f43f89f4d6489, limb2: 0x91f619c2ee45ad5, }, r1a0: u288 { limb0: 0xcc72bdd8ef4bdbdbd5636693, limb1: 0x72d6b70d02a9f6fbc7ca5523, limb2: 0xf88eb096dbbef8e, }, r1a1: u288 { limb0: 0x567bbc86dcfd872c272170b9, limb1: 0x14ad5e1ba548e11ee091146a, limb2: 0x2bde585cff386dc0, }, }, G2Line { r0a0: u288 { limb0: 0xeb79e6b473fadb992c5f83a8, limb1: 0xefe49f26e3970afdfad2cc2e, limb2: 0x168773b099059842, }, r0a1: u288 { limb0: 0x9d3e9750b006a99612167308, limb1: 0x36d359b16e977ed15d4161c2, limb2: 0x1e4c95a1c15caafd, }, r1a0: u288 { limb0: 0xb3c4a79ce63902a10a51e23, limb1: 0xcb207dc605042ccef609394a, limb2: 0x28367f81a785eea9, }, r1a1: u288 { limb0: 0x7f77d67428213715e7e45365, limb1: 0x1e5c92195da5eafb12b14815, limb2: 0x19678fa4bc862330, }, }, G2Line { r0a0: u288 { limb0: 0x1818039df6913206ab2405a2, limb1: 0x5377ab614813a34cfcee8b06, limb2: 0x27c2371869238315, }, r0a1: u288 { limb0: 0x6e3a7b752b93af987513de48, limb1: 0x600847be13708d65af6fd056, limb2: 0x1fb56f957b1c324f, }, r1a0: u288 { limb0: 0xcc16c53c2ef721dc5c8f5e5f, limb1: 0x89e8742919e5d6f87814752a, limb2: 0xca6f6bfb7f426d3, }, r1a1: u288 { limb0: 0x41add8c9133ba30a102a4bb, limb1: 0x660c71c07cd5e4a635871503, limb2: 0x2b0ba37253ca76bd, }, }, G2Line { r0a0: u288 { limb0: 0xb6f9eda2bfae53ca69fd72df, limb1: 0x62429dd41cbb3c31acbada57, limb2: 0x50d343c2ebbfa63, }, r0a1: u288 { limb0: 0xb16441c66be44074686e0873, limb1: 0x72118bf8f92fd93da3f931b1, limb2: 0x2d8c67efcdab2c9f, }, r1a0: u288 { limb0: 0x7c82fdbad97732971dcf82f8, limb1: 0x5905f35e201d9b83b7a1898a, limb2: 0x666471518738295, }, r1a1: u288 { limb0: 0x79a4e035db3f75020f87c4e4, limb1: 0xa6597595a691184e717aa1b7, limb2: 0x1f74dc71d5a002c7, }, }, G2Line { r0a0: u288 { limb0: 0x2eda1e7a3e47f0ceaa9f0137, limb1: 0x903e05a4c7372f902311a7e3, limb2: 0x17ca943a56fba67, }, r0a1: u288 { limb0: 0x9b977b33fe71218fa31100a2, limb1: 0x9985a54c8af99f6f98acb770, limb2: 0x264f4f1ae306ae09, }, r1a0: u288 { limb0: 0x7b5e4fdc6bc84d795d332dd2, limb1: 0xe2676d5d0d2d5bb6a482e391, limb2: 0xf998e906ef11c24, }, r1a1: u288 { limb0: 0xd0215aa04d97800bfe4d2571, limb1: 0x8afbbc923a7161865fcccaf1, limb2: 0x68a922244a1e06c, }, }, G2Line { r0a0: u288 { limb0: 0xfe3e9707bdad783425ab808c, limb1: 0x48bae37f3785f6ac84f1d9f4, limb2: 0x23f7964ac6e85c1f, }, r0a1: u288 { limb0: 0x46389f8eb814620c85b16ace, limb1: 0x90f3fba998699480b75716f3, limb2: 0x1776968a7c554df4, }, r1a0: u288 { limb0: 0xefa070a4d4d1d52d00593451, limb1: 0x2f9abffa4bfb1d259f9e163b, limb2: 0x29367aa8e59832c, }, r1a1: u288 { limb0: 0x82ea5e13b62b054933b28042, limb1: 0x55bec845824984eb488dc154, limb2: 0x2a75ffeff6990ed5, }, }, G2Line { r0a0: u288 { limb0: 0xb1aed4098913b1760bfdef79, limb1: 0xfafca93bae3f4797778a4a3d, limb2: 0x61e99ac907f0b5, }, r0a1: u288 { limb0: 0xb3cfb4bc10c0fd6f52e7741f, limb1: 0x6997070a8b218ce200404bd8, limb2: 0x1e541f2ec16eefb6, }, r1a0: u288 { limb0: 0xc8037c2c08d6b09417f68f4, limb1: 0xc6672a1c3a90ce2db95e8fca, limb2: 0x2faf1762a18f3cf3, }, r1a1: u288 { limb0: 0x6a3151adfb916a8ff290644, limb1: 0xe53f264a1da30cb269399d90, limb2: 0xf020c410d9b4038, }, }, G2Line { r0a0: u288 { limb0: 0xd466ae8b808726024540df45, limb1: 0x106edc6b8bbe95e75c4c8ddb, limb2: 0x11468447a8135b98, }, r0a1: u288 { limb0: 0xd0881b80d847044084035ba3, limb1: 0x120d97c39e7d772df4ea1724, limb2: 0x276d399b6465c9e, }, r1a0: u288 { limb0: 0x7d57a86618737d3d2abaaa4a, limb1: 0xd7e9a1452de00c5e1014e4a7, limb2: 0x1d4294c5a1e71a79, }, r1a1: u288 { limb0: 0x22d506d59afa935528b3209d, limb1: 0x9b3ab29bf3cd5e1e10cc308d, limb2: 0x747bbb31310f22d, }, }, G2Line { r0a0: u288 { limb0: 0x199cc10b709fbc97e010b5a2, limb1: 0xbfaf4107fa51b16129569088, limb2: 0x27e59a950ce88313, }, r0a1: u288 { limb0: 0x6554582e8ebeeaed97477b68, limb1: 0xa21b4ce4041d0db94d82c7c8, limb2: 0x1de018ce87d7bda5, }, r1a0: u288 { limb0: 0xc6420e29ce5455750c024fda, limb1: 0xc98a4b583326b58ef9b26e44, limb2: 0x250ae9ddc80af6e2, }, r1a1: u288 { limb0: 0xb2df135c47abbfec8b28d7a2, limb1: 0x937ccc7b47049c2f3167c9b2, limb2: 0x1eae535d6c58d67d, }, }, G2Line { r0a0: u288 { limb0: 0x5d9402b6b38fd455bf6d41e7, limb1: 0x40762f68405f312ef02f8598, limb2: 0x1f8342cbdceb3506, }, r0a1: u288 { limb0: 0xc72348fb470ab8c04752b5a4, limb1: 0x334d25fa09cf31cca46d0916, limb2: 0x204a36e5e3992a52, }, r1a0: u288 { limb0: 0xd80af7fe0ef47fff92f37a68, limb1: 0x16c4943784e96ba42bf07819, limb2: 0x29504fb758b88d97, }, r1a1: u288 { limb0: 0x73229c759eb01fb63c20288b, limb1: 0x9ac158cfc3f612f54354fa46, limb2: 0x2b076be18044918b, }, }, G2Line { r0a0: u288 { limb0: 0xfb23f67b0c7c277b0fb86dd1, limb1: 0x38ecd10f58fa1a2a35794a92, limb2: 0x37aa0d9abc10a23, }, r0a1: u288 { limb0: 0xa41ca972e4e66a3542219964, limb1: 0x1bd17624ed2ce1e682b4e8f7, limb2: 0x2989444f436f1dd6, }, r1a0: u288 { limb0: 0xd4c30c692a0cd4437bd20830, limb1: 0x3ff4fc96d1e014b335cb4ecb, limb2: 0x1c92a02e4ef43dfa, }, r1a1: u288 { limb0: 0xd920ac36097259643357948, limb1: 0x4a07824bac28e19dfecd3c9b, limb2: 0x2107b2b219b0fce7, }, }, G2Line { r0a0: u288 { limb0: 0xa7506225f160822b273888e9, limb1: 0xd3d14903f7cac6d483c7f486, limb2: 0x1069a304f46fc73d, }, r0a1: u288 { limb0: 0xe09cdad30c6c95ec103b4899, limb1: 0x49e00af66e7a9ee491dae35, limb2: 0x1864d886a088da8a, }, r1a0: u288 { limb0: 0xc1b39342ab05cdf6860d1663, limb1: 0x2d93a67b66068131b4c4da45, limb2: 0x2cf24b680c6c956a, }, r1a1: u288 { limb0: 0x8c080385898b2b724819996, limb1: 0xcba25b471c4db069a8676475, limb2: 0x108fc71b9d6170bd, }, }, G2Line { r0a0: u288 { limb0: 0x572b773de719e0286485c280, limb1: 0x11e06de6ae88abe2dc292d08, limb2: 0x186e96233737a01, }, r0a1: u288 { limb0: 0x847e89ed969849374f7db3c7, limb1: 0xc5b2fb949e49d53bcf33515b, limb2: 0x23b1283aae54fe3b, }, r1a0: u288 { limb0: 0xed5be001209472991a4e75a, limb1: 0x2f5a7a9479f81cff74bda20a, limb2: 0x103224cf323271db, }, r1a1: u288 { limb0: 0xece900cc17ebd9f42d6a706a, limb1: 0x4fcf1446fb08c2ce8fe1f6d9, limb2: 0x305cc1d699ea0794, }, }, G2Line { r0a0: u288 { limb0: 0xf8bfb85cdc86039bb4018125, limb1: 0x7be955c10b0359a7973d8645, limb2: 0x26304c9784e41970, }, r0a1: u288 { limb0: 0x45e2dd0c8c9e99be2d486ab7, limb1: 0x4435e999a3d2eb84952cbfff, limb2: 0x1330c65943a597bf, }, r1a0: u288 { limb0: 0xc3ca87ec812cb9200943aa6c, limb1: 0x240ae8fdf376bf8512aad6bb, limb2: 0x2334035bf7082914, }, r1a1: u288 { limb0: 0x63ede79d89c52d83f35048d8, limb1: 0x73a18b855a63a05716992b7e, limb2: 0x217132215f0cc50f, }, }, G2Line { r0a0: u288 { limb0: 0x76c2c3f4a1f1e9d8af542b7, limb1: 0x8441dca19b660c87b2c24022, limb2: 0xd4fb1ace706aab, }, r0a1: u288 { limb0: 0x6b98b456e4100fa122cd3adf, limb1: 0x9ae10c95907ea280c6754592, limb2: 0x1473f309a21a16eb, }, r1a0: u288 { limb0: 0xf530f6daa1f8c4701334c030, limb1: 0x6fa238391d516b8940b78ac3, limb2: 0x27085bb6119190ab, }, r1a1: u288 { limb0: 0xf6e1318ded506c0fa4a5ca59, limb1: 0xd627f19ca3008cc90d8bbd8e, limb2: 0xe4f8de695c15f15, }, }, G2Line { r0a0: u288 { limb0: 0x3cd25258c14698ad321ce4c1, limb1: 0x5f3e41e0e9abc286750b55ea, limb2: 0x1e7acc78ae40f53c, }, r0a1: u288 { limb0: 0x7fb753e36893e039a913c94f, limb1: 0x71d2b9fcc8c9833d7de96163, limb2: 0x99a73fa44b04d5c, }, r1a0: u288 { limb0: 0xde6ab8423c206004fc0a2e0e, limb1: 0x78d2d32cf9a4d7886551910a, limb2: 0x153d30f1951850ab, }, r1a1: u288 { limb0: 0xe1104a60c9402d05c7369e2e, limb1: 0x692902d053754c3b56e08d58, limb2: 0x13eae4536ba169a3, }, }, G2Line { r0a0: u288 { limb0: 0x1509c5b91b73a75eff1fd9fb, limb1: 0xf3dec59a348b17c7400b86bf, limb2: 0x13db20e7e664f0c0, }, r0a1: u288 { limb0: 0x36dd1839b3a22a5afbd7f7ed, limb1: 0x66b0df244064db38c2bb2556, limb2: 0x2abe1143e1e96ef0, }, r1a0: u288 { limb0: 0xe9a3cf2e38669d402746144e, limb1: 0xf5902b6e357b3171d55c611, limb2: 0x2664b92ca19b7611, }, r1a1: u288 { limb0: 0x9daa58ef595d3b525a479c15, limb1: 0xb8c4e03fb569df7a793ee10c, limb2: 0x5375f321384b046, }, }, G2Line { r0a0: u288 { limb0: 0x8a787397b454b58176837e03, limb1: 0xc5cec0e7f665a2a76114ed3a, limb2: 0x2c78f7b8fba875fd, }, r0a1: u288 { limb0: 0x7928a23938145a58f5d57ab0, limb1: 0xede46e1acbb7d258988f4b3a, limb2: 0xe9e606331057a90, }, r1a0: u288 { limb0: 0x9e19b0f639d02c4e3468d6db, limb1: 0x9fec35cbec423d803671267c, limb2: 0x28477ed79b8d9f1c, }, r1a1: u288 { limb0: 0x9f3f001662c3ddb9542c5b1e, limb1: 0x66630f87ae05a36602688eee, limb2: 0x2e141bd01fbd3896, }, }, G2Line { r0a0: u288 { limb0: 0xcc3035708103ff2f96090b76, limb1: 0xf0cb8a10216eccab8c3b0985, limb2: 0x163aab6dd7da60cc, }, r0a1: u288 { limb0: 0xd33d3548ed9d2cec0c8c3e97, limb1: 0xabc9469b7c56c8da2ce322b, limb2: 0x2e6f16f35be168fd, }, r1a0: u288 { limb0: 0xb89c671c85a0d99ee444f09c, limb1: 0xc3e70b59ad07c869ff35fce, limb2: 0x2d94791bb226fbf5, }, r1a1: u288 { limb0: 0xdd91f5db83ab791b396b15fc, limb1: 0x475f296aa5ec4dcb22e72eaf, limb2: 0x118eb40c1ba0d446, }, }, G2Line { r0a0: u288 { limb0: 0x28ccff4098291ff99db7d015, limb1: 0xbbf223ce77f8bdf1e351f459, limb2: 0x1eb6506d0c7d4aea, }, r0a1: u288 { limb0: 0xe4c907dc1a275aa0cdbd6c2d, limb1: 0x357d8adc7866fcc383178ae9, limb2: 0x18c6082d4b4a59f5, }, r1a0: u288 { limb0: 0xf7ba73f45b1f2c9b8b13b1c1, limb1: 0x754b28de4706d4147a660bf3, limb2: 0x304b461ac8db9efd, }, r1a1: u288 { limb0: 0x7afa3c98b59c12047d082d00, limb1: 0x16b499cba52810fd94e60ac1, limb2: 0x107cc1c9d1ee0ae5, }, }, G2Line { r0a0: u288 { limb0: 0x5473c94e995465f0785b4316, limb1: 0x86e38425ae2faae14a123db7, limb2: 0x236ccf43605631c3, }, r0a1: u288 { limb0: 0x3560440e3b7a50cba31817c4, limb1: 0x94e7415089d9c6a041b95a4e, limb2: 0x17b1e780a1f282b7, }, r1a0: u288 { limb0: 0x34f92afe1a802ef319d629ce, limb1: 0x9b7ae704b85f2ef01618f9ac, limb2: 0x127e7a97519bc45, }, r1a1: u288 { limb0: 0x87fef97f09987ebb7a9d93f3, limb1: 0x6e571f3688a614ddfc482b07, limb2: 0x26d1e21000c12da3, }, }, G2Line { r0a0: u288 { limb0: 0xb292d5bbc1c5800beeca8d15, limb1: 0xb6e3c05aa128d07de2df66e8, limb2: 0x24424145a074ed6b, }, r0a1: u288 { limb0: 0x138b775d1ca3d771fd249d3, limb1: 0x8a2392db8be88b8fa3f04951, limb2: 0x17bc62334cefe39c, }, r1a0: u288 { limb0: 0x8e7371df60a9a5e4cbbc9be9, limb1: 0xb650615a2aa43a3aced9368c, limb2: 0x1a4dc1089e983ca5, }, r1a1: u288 { limb0: 0x18674fa925de769d104bd2a2, limb1: 0x777c884e96e41fdb34f4141a, limb2: 0x4d2dfcf532f463b, }, }, G2Line { r0a0: u288 { limb0: 0xc780881f9c6d8bca3e37aea0, limb1: 0xe9895da94e554ff87a2dfd7, limb2: 0x2f2f37a08cd78298, }, r0a1: u288 { limb0: 0xc54128f3d98d66a205153035, limb1: 0xde9df82c3ef59e5ffeb06262, limb2: 0x12c11f147ed32b02, }, r1a0: u288 { limb0: 0xd779e2290c08b46957f9f81f, limb1: 0xcef48524479ef765998c179e, limb2: 0x62d4fd8696cda6c, }, r1a1: u288 { limb0: 0xf553ff2a36599491c12d51cf, limb1: 0x68f2b7726eab96d19be4f7ad, limb2: 0x1b2e70aad5ff1bde, }, }, G2Line { r0a0: u288 { limb0: 0xf421435fe144055f20b6716a, limb1: 0x8d06d11b62031d272be85bb6, limb2: 0x378648f296513f4, }, r0a1: u288 { limb0: 0xaa516565bc7b4ae51c4a1d57, limb1: 0xd1a3c04fc68cda14c386fd17, limb2: 0x10a17e6b2b05ae5f, }, r1a0: u288 { limb0: 0x5a4fdbaf4101c2e7b0824483, limb1: 0x243d3d5fab841583935cbdbc, limb2: 0x2bdee3f29a271704, }, r1a1: u288 { limb0: 0x75a0bfe5357850025da7dc1e, limb1: 0x7efd8ea95e831ae7b7cb4204, limb2: 0x242d5ff5148e8a24, }, }, G2Line { r0a0: u288 { limb0: 0x13404adaeaee7586ba22a2fd, limb1: 0x37d5f59c1d1a7ead09415ba0, limb2: 0x2d046fbec788a89f, }, r0a1: u288 { limb0: 0x304e12830e0da56473bfd493, limb1: 0xef4257261a4d1e86faddc8a6, limb2: 0x2e2a406604501f28, }, r1a0: u288 { limb0: 0x4df9be0616aa88b0d4cf02a2, limb1: 0xfe4ac5d159b42f097e07c99, limb2: 0x1bfaf8ddf8eadbe0, }, r1a1: u288 { limb0: 0x39cb7475288b5721bd85070f, limb1: 0xbcf9db00ab3740a004be0aa4, limb2: 0x67aa9f57b6254b0, }, }, G2Line { r0a0: u288 { limb0: 0xc35e158b40bec28bc76a5275, limb1: 0xc7155f076ac63ee9c5bc4282, limb2: 0x29db032c04d42b9a, }, r0a1: u288 { limb0: 0xdd6363dfcc7e71cd13c51cf4, limb1: 0x10ffc527e277eaf97c79a492, limb2: 0x22a9e4c447737c96, }, r1a0: u288 { limb0: 0x9705df81acb2749faf48b2e4, limb1: 0x62e438807e2bfc92e2fdb9f6, limb2: 0x138bbb12a9dd92f4, }, r1a1: u288 { limb0: 0x9a675f19eeab63bd0216ce7c, limb1: 0x9a08c702e29a00db40bc334e, limb2: 0xc960c1d7c1c05fb, }, }, G2Line { r0a0: u288 { limb0: 0x7a08cc34c6fcd1f9e74c35b2, limb1: 0x2cc8a7d624b15a0f9bfb2d3e, limb2: 0x22760e0e61e3e208, }, r0a1: u288 { limb0: 0xc27bb24b5b346b44cf7d548f, limb1: 0xf27ea7f3736c8b8168f8c2c1, limb2: 0x295d0b6d3ef18509, }, r1a0: u288 { limb0: 0xc7df1942c9b70ad4983814f, limb1: 0xf66a53554bde327b0ff9c637, limb2: 0x1fe98a3ad4e0774a, }, r1a1: u288 { limb0: 0xa33e765594cc92d0facb00ed, limb1: 0xe35f28bd8fb424b3721d3880, limb2: 0x1735f29046f597b1, }, }, G2Line { r0a0: u288 { limb0: 0xe8cbc94bb8cdf72ff26f38fd, limb1: 0xe0a2179f1a66292497c7a553, limb2: 0x258204cb3308769e, }, r0a1: u288 { limb0: 0x31d262be0ea54e0eed69a03b, limb1: 0x830d5451d02580b33f770099, limb2: 0x1b7c1fa69407bced, }, r1a0: u288 { limb0: 0xeb6c0bbb02f4cf840a51ac39, limb1: 0x30ebd50843b10bfe90d970a0, limb2: 0x2ce27eb8c126350b, }, r1a1: u288 { limb0: 0x4c8c9c51af22d9bf461a9f49, limb1: 0xfb8b4c9ef7b7fc81c52ff1a2, limb2: 0xd39e1c14eea7101, }, }, G2Line { r0a0: u288 { limb0: 0xb02550d130bf712df6d98a57, limb1: 0x8854a229566b7ff22b8ccff3, limb2: 0x12a0631c0924ec70, }, r0a1: u288 { limb0: 0xb59d2598e43244d544a1616e, limb1: 0xf28e9462628066c68e061fc6, limb2: 0x7baccf7063f2981, }, r1a0: u288 { limb0: 0xb1cbf3882570f3d23dbedbc4, limb1: 0x5e8742fe9dc865822e5cae92, limb2: 0x2654f08f566866ac, }, r1a1: u288 { limb0: 0x1287198f6ac726fd6aa6595e, limb1: 0x220b82cf3025285d6b7344af, limb2: 0x1419e0cd4fc9d705, }, }, G2Line { r0a0: u288 { limb0: 0x16da4933b0462809081edbc4, limb1: 0xb2b5cf2a2286026e0bbc4c4, limb2: 0x14490aeefaf4002b, }, r0a1: u288 { limb0: 0x9631e388544a5571edb94366, limb1: 0x4647882204977448d836aae, limb2: 0x1df1cff53ae1660e, }, r1a0: u288 { limb0: 0xce99ac65e9d29dee6ab79293, limb1: 0xb5827a5ff68c42c93f003a3d, limb2: 0x2ff7f220d4e2b15e, }, r1a1: u288 { limb0: 0xfeead92cf9c75dc3dc26ddbe, limb1: 0x73f7035049129b05256f2625, limb2: 0x2f97ef7e0326ae1b, }, }, G2Line { r0a0: u288 { limb0: 0x3557697309324ec7b28f655f, limb1: 0xf990f387e4585977f0c61411, limb2: 0x1f88afaff88f777f, }, r0a1: u288 { limb0: 0xfbd05da9a80d37ee13e654d, limb1: 0xa34586aaab313351d2211c3c, limb2: 0x16f110b250c8f4a7, }, r1a0: u288 { limb0: 0xe7379e88b19d61e01dbb464d, limb1: 0x6ef01d97f74e23a2a2e3954a, limb2: 0x2b1bc8c3cb77b3b4, }, r1a1: u288 { limb0: 0xaefdcb2fc007f2b030adf282, limb1: 0x407cd78e89ca611eeba48b00, limb2: 0x15caeeddb0b65f8e, }, }, G2Line { r0a0: u288 { limb0: 0x25e2464064e839a435c901fd, limb1: 0xc8a250aab01f64653e7b143, limb2: 0x140159960e8bbee6, }, r0a1: u288 { limb0: 0x7cb8f3194d4856b2e37ad147, limb1: 0x79f1a0cbdbe629456ff7fd09, limb2: 0x2e8cc9955ec33b14, }, r1a0: u288 { limb0: 0x3a33e8aae92f696039285ae8, limb1: 0x50e70dff510555f94708ec0e, limb2: 0x107f090bc1746726, }, r1a1: u288 { limb0: 0xebc6d08d9ffc1f811537ae5c, limb1: 0x97116269a7fe2b46ecd07544, limb2: 0x2ed49e8306bb6b53, }, }, G2Line { r0a0: u288 { limb0: 0xf8f6ac38dbd6563a32fe3ee9, limb1: 0xfacb340af38f5dd75813a198, limb2: 0x16bbfa264bbaa255, }, r0a1: u288 { limb0: 0x76a6b03f569b4e99a401edca, limb1: 0xba4469e4fb78a30370beb53, limb2: 0xde76a28c997a85a, }, r1a0: u288 { limb0: 0x9368f4915d1afe49ee098655, limb1: 0x4d6ca82a7c8d3612d1f5d552, limb2: 0xbf0b37fd18b8725, }, r1a1: u288 { limb0: 0xc503c77bc66cf62a998cabd4, limb1: 0x4fe691624059c05c90abec0e, limb2: 0x1b8daabf94ec10a9, }, }, G2Line { r0a0: u288 { limb0: 0x338a05ed9e18ca0c8cbb9ba, limb1: 0xeaed8a5ad1bbfa8ffd7827d0, limb2: 0x229ab6a016d41b8d, }, r0a1: u288 { limb0: 0x6de2e082d93ad5ab82221604, limb1: 0xdbadbca9be15f3e1a6011bef, limb2: 0x17f46739d3798529, }, r1a0: u288 { limb0: 0x556cb2cd13bc608a395ef30a, limb1: 0x5ae57098c69bfdd5e4310a77, limb2: 0x234c308ff816d887, }, r1a1: u288 { limb0: 0xde9e9d4f811bdd153dca9448, limb1: 0x2a5c0dbac52000c678bf9037, limb2: 0x2f74a2c3d53bbf07, }, }, G2Line { r0a0: u288 { limb0: 0x5d5094b09519f9fbc1bf26c7, limb1: 0x60b75c521b5d0d3a8c6c5a57, limb2: 0x1db1a7d363c021fa, }, r0a1: u288 { limb0: 0xda84f6ecfab32ddfc17bb30c, limb1: 0x31f21c63899699ef82e8956, limb2: 0x1bb6484e546389ba, }, r1a0: u288 { limb0: 0x6d03eff42e8a9c1517bf621f, limb1: 0x25e25c77b11cc5006cb39115, limb2: 0x2bab9460edd274f4, }, r1a1: u288 { limb0: 0x6636dd3c7ea7e49e82793062, limb1: 0x45e083ea0fb71779754a40e0, limb2: 0x1b148d5ad236afff, }, }, G2Line { r0a0: u288 { limb0: 0x1bd0d3e64772dd8d6f4eb955, limb1: 0xd551e62b4dc950330f32055e, limb2: 0x2af99115e61ea584, }, r0a1: u288 { limb0: 0xbf68bac9801a05b7d4e5c230, limb1: 0xb2c2415c0237afafa8e24039, limb2: 0x9639d3152ec116d, }, r1a0: u288 { limb0: 0x5470718dfbca1295766112f2, limb1: 0xcdc95e016f5749cd20628ff7, limb2: 0xa073db3f3d4ee7f, }, r1a1: u288 { limb0: 0x59adba4782946b799f2b3f52, limb1: 0x60aac6f24d8307d05aaf156e, limb2: 0x29fa48831a9be4a, }, }, G2Line { r0a0: u288 { limb0: 0xfb944c01e622920643567a03, limb1: 0xb5e410fcce49e44fa6b733e5, limb2: 0x67235bfc45af909, }, r0a1: u288 { limb0: 0x7415228da60f54ef44f0e9e5, limb1: 0x54a974a80cb733a9398a4237, limb2: 0x14742634cb3e88c6, }, r1a0: u288 { limb0: 0xe6117563be5a51a3e45835bb, limb1: 0x5cd22381f024901e8038e534, limb2: 0x9bccc5fd250a4e2, }, r1a1: u288 { limb0: 0xd7e83df65939cb9e0a65506f, limb1: 0x5c0226578531f39df6fbfc47, limb2: 0x24413aaad067b5a2, }, }, G2Line { r0a0: u288 { limb0: 0x1104034e64d27e5ffc63566, limb1: 0x399bd49fa7407a8bdb5203c7, limb2: 0x1832f6474b41c0bf, }, r0a1: u288 { limb0: 0x55803008aa1d71cb5f9941c1, limb1: 0x404a98b2848b86b4af5b57e6, limb2: 0x163abe5942eb31d8, }, r1a0: u288 { limb0: 0x82f5febdbf1aef734e2827ca, limb1: 0x12d2b5ab6f8472e574b9210c, limb2: 0x28eb5172b9c24785, }, r1a1: u288 { limb0: 0xb2fbbca733e95d52f011bf6f, limb1: 0x632c5aacc01d53ce7abc8bae, limb2: 0x750b07eef4315e1, }, }, G2Line { r0a0: u288 { limb0: 0x36e8e6c311534f247b2f522f, limb1: 0x30b52221767eb139a6621af5, limb2: 0xa9472da06a550f6, }, r0a1: u288 { limb0: 0xd54bec3ff6e5c1609841378f, limb1: 0x86779a5fb4e9c376a93fbad, limb2: 0xfe84f7906eda072, }, r1a0: u288 { limb0: 0x4f7564b178d5cb370ab75811, limb1: 0xd054e692a00381045a312b52, limb2: 0x1af83b2d13968385, }, r1a1: u288 { limb0: 0xc3f2584ed4cfcc7213a55c0e, limb1: 0xcf835b28a17db67f23c65108, limb2: 0x15f8038dbb750a89, }, }, G2Line { r0a0: u288 { limb0: 0xb311fac4a46b12a29d9145c5, limb1: 0xf0216ee536a371f5bb9fb55c, limb2: 0x128c4da7ec19e940, }, r0a1: u288 { limb0: 0x40d5ac9c25788920a64397a9, limb1: 0xe61e75b3f5562e0f5bc0039d, limb2: 0xac9a936b0bfff57, }, r1a0: u288 { limb0: 0xf7091e9a7ea3a772b7f006b3, limb1: 0x4541ad07dea41c3ff23f1c1, limb2: 0x73ea3cc79b728c1, }, r1a1: u288 { limb0: 0xcd2b3dcd910e9d600708fe2e, limb1: 0x726ab436201b4de44b9efa4f, limb2: 0x2e6674c1fcf4372e, }, }, G2Line { r0a0: u288 { limb0: 0x9501f9c373c02510420bd774, limb1: 0x34a01a7a11837b54b21d87ad, limb2: 0x13013fa1ad5a2602, }, r0a1: u288 { limb0: 0x4bf8308ce14b6895f625821, limb1: 0xde9402ce107e3b0bb8325032, limb2: 0x221a4b3042ac620f, }, r1a0: u288 { limb0: 0x2b54888ac068e44ac1b5e725, limb1: 0xe2595c1718cf92904f26b388, limb2: 0xc444735a378fc2b, }, r1a1: u288 { limb0: 0xdb79229471d5dfb86ac334e6, limb1: 0x5300c1298d97c7e56a443d9, limb2: 0x290a2ac4e4806224, }, }, G2Line { r0a0: u288 { limb0: 0x68dc34c5837479b6fe1b15f4, limb1: 0x70ffaada5c0d2134dd4b01ff, limb2: 0x12600a475dc719f6, }, r0a1: u288 { limb0: 0xef8f37a1a7c1874aa696b864, limb1: 0xf03831086e97655126735dcc, limb2: 0x29a8f8b90b8db8bd, }, r1a0: u288 { limb0: 0xdaae6d464020690b41135866, limb1: 0xe1a461381c2daafc22ecc6b8, limb2: 0x1be8b437d95ece9a, }, r1a1: u288 { limb0: 0x6ec13263dbf5de6eebbeffc, limb1: 0x7309cff008feb3ebfb9b22e6, limb2: 0x112e6ec0db536bd2, }, }, G2Line { r0a0: u288 { limb0: 0xf85ee56a7931c3a3d7e22b1, limb1: 0xc49e4026d30000ff5ad0ed87, limb2: 0x9a8d4f19347675e, }, r0a1: u288 { limb0: 0x34652599e03489dbca6a04bb, limb1: 0x98f8ba9e9b65abccfdce7169, limb2: 0x153fbd440ef725b5, }, r1a0: u288 { limb0: 0x35111b6f4eacb1fcf5f53f8f, limb1: 0x23545a2bb56c9b2fe222f39c, limb2: 0x1b7822ce0cdc1f2b, }, r1a1: u288 { limb0: 0xe68e164e8c7cdb83224d5ecf, limb1: 0x4900a3f7ed3d0b25d2716b2d, limb2: 0xf1e46e6adac9d5d, }, }, G2Line { r0a0: u288 { limb0: 0x8b2c899639dc5cc9c044490d, limb1: 0x22f86bdfbacd20aeec5d8be9, limb2: 0x19b836ccbb17a7e4, }, r0a1: u288 { limb0: 0x89bae9959824cb3a475e5c49, limb1: 0xc53c6b56b477f0dd0853827b, limb2: 0x22783114b221de87, }, r1a0: u288 { limb0: 0x5c91c9c68702894ffcd0ea24, limb1: 0x5d691537f69a30e7050f98a4, limb2: 0x1bb9cbba6a513842, }, r1a1: u288 { limb0: 0xa9226abf9515bbd281fed4c8, limb1: 0x75b0a0c6355bd2dd020a5c6, limb2: 0x221468ff5248a1e8, }, }, G2Line { r0a0: u288 { limb0: 0xf8820d4aceab306eb783e0a6, limb1: 0xc7d1a20e7942c4d389818908, limb2: 0x2e31d9c48e89b432, }, r0a1: u288 { limb0: 0x85bbebd854eccf7a6c56767, limb1: 0x2d07ae2c3946de9e92f58236, limb2: 0xeb5a4ae8acab71d, }, r1a0: u288 { limb0: 0x4512ff65bb8a0aed640ac4ab, limb1: 0xdd9f660ad3feed3e4510f4c5, limb2: 0x16ba9a8b70ccc71c, }, r1a1: u288 { limb0: 0x9d2c01267d4aeefcf1f78ccc, limb1: 0xdbeb1adcbf7df61b43429ba9, limb2: 0x2c895b99227c31d6, }, }, G2Line { r0a0: u288 { limb0: 0x90e454055b75ead8e2ebac42, limb1: 0xfbabb00c2f3aa9dbd7522417, limb2: 0x5b3e7e4068f790, }, r0a1: u288 { limb0: 0xf85cebc1555abc4d89b337ef, limb1: 0xf4761f79f94babcc24806057, limb2: 0x1b996af0e24e9310, }, r1a0: u288 { limb0: 0xd7206c93b508f78061fe01cd, limb1: 0x742ef1d29a2c692312298778, limb2: 0x151fe23f3bae34a2, }, r1a1: u288 { limb0: 0x87f5668138132b557efd05d6, limb1: 0x94e793d236320a9e3e525285, limb2: 0x1988ca9052857a71, }, }, G2Line { r0a0: u288 { limb0: 0x7c6a269fe06a16627f5ecf5b, limb1: 0x50317e79670fba9583cbc9af, limb2: 0xb20ea22d8b7ef38, }, r0a1: u288 { limb0: 0xcec9cccc31411674ea756b45, limb1: 0x7febf8b5905c4ad47e85f90a, limb2: 0x85dd991fef5f00a, }, r1a0: u288 { limb0: 0xd935f602bec4954512e2a83c, limb1: 0x3d448544bb1a52e6c21568e5, limb2: 0x30253372b426fa93, }, r1a1: u288 { limb0: 0x2321475e1ba3f3775a8df03d, limb1: 0x8ad60a1731370c5148fdd271, limb2: 0x5ac30ab6d4ac94f, }, }, G2Line { r0a0: u288 { limb0: 0x387a543af80110750ef06290, limb1: 0xf82835b4768246d0aaa1d901, limb2: 0x2419af1838a4d116, }, r0a1: u288 { limb0: 0x47251c0c962be9ae66db3d05, limb1: 0x43f64d4ac11d82a21f131c2d, limb2: 0xf896f4ab3e39af0, }, r1a0: u288 { limb0: 0xc5775374fa4d6293b3c2c070, limb1: 0xc1aef05fdcb1bb03a298fe38, limb2: 0x298566e64b1aa9ea, }, r1a1: u288 { limb0: 0xc1973597201173697fe8c018, limb1: 0xc357b15cb9b588bae8abc963, limb2: 0xed371de6f4074ab, }, }, G2Line { r0a0: u288 { limb0: 0x40d9f3f225ebab5380d4b72, limb1: 0x31a46955bff4173ff90907c5, limb2: 0xb56f0074b975741, }, r0a1: u288 { limb0: 0xba705bbb410ae6715e48508, limb1: 0x9baf711d475a978e9c6208e0, limb2: 0x2687a1dd57bbd608, }, r1a0: u288 { limb0: 0x4cdcbddd1555f6a28e4b4633, limb1: 0x5c368f07d906b3dedd347055, limb2: 0x4c585e6b42f1812, }, r1a1: u288 { limb0: 0x2aa6dcbf02a9bfd6a69b9713, limb1: 0xc377411908d06357c9dd7e0d, limb2: 0x1ea404aa6b11edc9, }, }, G2Line { r0a0: u288 { limb0: 0x1ba2d91e528e15b1e971d7bc, limb1: 0xc3d5b13a1a0ed98868b53c49, limb2: 0x58c43b20c6ae43b, }, r0a1: u288 { limb0: 0xad13d1837679166bbc309e9c, limb1: 0xd40862384caeae8d2c50a472, limb2: 0x1333a454fe004635, }, r1a0: u288 { limb0: 0x67824db562428bd89655e374, limb1: 0xbb420615e88b3b3e751019b, limb2: 0x1c8baf2e8cf9c832, }, r1a1: u288 { limb0: 0x6ffe8674ea7d664329d21c4a, limb1: 0x30f2edace39818c4f5d4cd54, limb2: 0x22a7b32f48b0882a, }, }, G2Line { r0a0: u288 { limb0: 0xedd1d0959325376134891630, limb1: 0x1128395a9b57a29073cb0850, limb2: 0xf3743d152d6505f, }, r0a1: u288 { limb0: 0xb982975f8f3754c447048e4d, limb1: 0xa1f5febfa531fb8eda900af5, limb2: 0x9d186ca8c21f49e, }, r1a0: u288 { limb0: 0xae55ad9465da2d347c06d679, limb1: 0xef03eabc82c065f5848ac316, limb2: 0x3048edc721645512, }, r1a1: u288 { limb0: 0xbf3fb43ad7c3bea794a1bd69, limb1: 0xb370c4cc79bacdb996aa7769, limb2: 0x152d882002404123, }, }, G2Line { r0a0: u288 { limb0: 0xb8acde096bd6f573c8807c88, limb1: 0xf9370645c8a230645a4558bd, limb2: 0x11060ebe6c0900e0, }, r0a1: u288 { limb0: 0x6f8b7c4c8c4850fe1b091402, limb1: 0xba7f7d879ddcfc28350fb8e4, limb2: 0x251131fc4797a238, }, r1a0: u288 { limb0: 0xc067941904de6452a702cc36, limb1: 0x36010868f854adcaac243b23, limb2: 0x2be8d5d432d0e622, }, r1a1: u288 { limb0: 0x48bff01c3e0bb1049adc54d6, limb1: 0x5f6636dd538087bb8e95c05e, limb2: 0x1aa24bc4a8d0aca4, }, }, G2Line { r0a0: u288 { limb0: 0xfed7cbe3be258eacb3805c43, limb1: 0x6a6b305ac8710cf771130d6a, limb2: 0x20c5bdfdf73feb71, }, r0a1: u288 { limb0: 0xd8ee10b63f015bcc45e694b3, limb1: 0xde212e60212fd33b5fb07f79, limb2: 0x10406d0c66676419, }, r1a0: u288 { limb0: 0xae6200bbf69b2d8222adc0c9, limb1: 0x5ed8395ab5798779de7855c7, limb2: 0x1306f0dfb9dd1f33, }, r1a1: u288 { limb0: 0x7d3e5564e11b0c0d87ce2fcf, limb1: 0xa011abe1dfaff9533b90024b, limb2: 0x4414840770b8d45, }, }, G2Line { r0a0: u288 { limb0: 0x1abbfaf4636b146d437f0f32, limb1: 0x823aeee9a4d8bec2345f04eb, limb2: 0x474bc80c3969d26, }, r0a1: u288 { limb0: 0x4574559e190f5a9005079834, limb1: 0x1a14b1796aeaf3cac262c90, limb2: 0x2a206e06250d18c9, }, r1a0: u288 { limb0: 0x7c011e64290a2723d04fbb47, limb1: 0x9bf025c6164128c502666a3f, limb2: 0x22056cad12d485a3, }, r1a1: u288 { limb0: 0x2c4a99cfec75332ddeb73d3f, limb1: 0x664ed1b9b659c29a8c5e86db, limb2: 0x1c996a2f464fa6d5, }, }, G2Line { r0a0: u288 { limb0: 0x68cb5b19d04919eb3904b718, limb1: 0x3c200fed008fce871c299fe0, limb2: 0xc82b868b865eaf2, }, r0a1: u288 { limb0: 0x8d319155c9ce9e7023bba44a, limb1: 0xdf6d46a6eafac55cd37588a7, limb2: 0x230891a91d84fb9, }, r1a0: u288 { limb0: 0x6c47fa46ada891b1ad0d4a2d, limb1: 0x896ef732068203aae4835c7f, limb2: 0x13305bfc59ed9f88, }, r1a1: u288 { limb0: 0xdef6d4b1bb52e3ed41f3149, limb1: 0x4d38ba467238b118bd600aaa, limb2: 0x23a7c08a0d34b716, }, }, G2Line { r0a0: u288 { limb0: 0xe65bdf2f0e46c5d14bb2d437, limb1: 0x75d347475ec4f5e5da58702b, limb2: 0x1e813045e86534b1, }, r0a1: u288 { limb0: 0x19aa620481b7ed5be5d86a56, limb1: 0xfe7790488a68214c21b7e599, limb2: 0x60c00e0cb979bbe, }, r1a0: u288 { limb0: 0x681c25373d992243e7bc4316, limb1: 0xdaa79fd2125a52658e4edbdf, limb2: 0x8712013710d9b84, }, r1a1: u288 { limb0: 0x26dbe63cdb5675671894a27c, limb1: 0xe81e4b46a10e510982b660b3, limb2: 0x8c1356b21364b2d, }, }, G2Line { r0a0: u288 { limb0: 0x180ea20e04ff0cfea452b5ef, limb1: 0x33a60d4aedd65598601bb804, limb2: 0xaffd14ad17ead4a, }, r0a1: u288 { limb0: 0x81a910653e6e700bcea6610e, limb1: 0x6d6da92fa688c271dbf2e929, limb2: 0x1c6e6b669bcc47a2, }, r1a0: u288 { limb0: 0x9af3035b52384ba68596606b, limb1: 0x3fa4f17d582ce91fe8ca38fe, limb2: 0x4fe17bae4b30f16, }, r1a1: u288 { limb0: 0x1ab98ebb109073ba1cbc0dbb, limb1: 0xe660bc83caf74b1c8bf3ffb9, limb2: 0xce501ef0be5371c, }, }, G2Line { r0a0: u288 { limb0: 0x9ffe62d6c121725aa3dc36e9, limb1: 0x6737e5cd363c5c11c8bf9ce7, limb2: 0x17c47bea351ac796, }, r0a1: u288 { limb0: 0xf372cf537d3cbd62464f2996, limb1: 0xc2b9f39affb15c1c565820ca, limb2: 0x5574310dc643654, }, r1a0: u288 { limb0: 0xdc8bb75702c703f43630205, limb1: 0x95033f7e1161bb1c84e88163, limb2: 0x46d85f905c3f6b1, }, r1a1: u288 { limb0: 0xa9acb5a9647aa09d829135c8, limb1: 0x4bd37d411bc856d38f320e81, limb2: 0x7896f127bef56fc, }, }, G2Line { r0a0: u288 { limb0: 0xb4ff705d518fd8d507edeaad, limb1: 0xb8d6290591e20c70907b4f50, limb2: 0x13cf6850ed83a8dd, }, r0a1: u288 { limb0: 0x9e8a05fa2a451c111ad1c113, limb1: 0x8db5108125c5cbd78b9da01, limb2: 0x27f247c7aa579dc6, }, r1a0: u288 { limb0: 0x9178a3dddec5c7aae0e06dca, limb1: 0x58c7e0146524cbde6f68e28f, limb2: 0x88e852062e630dd, }, r1a1: u288 { limb0: 0x69f9b02ecec442e37998de01, limb1: 0x5cec46a3b23ea712f31ade1c, limb2: 0x9fb06804e3f2902, }, }, G2Line { r0a0: u288 { limb0: 0xbf97e7024cb4c784db5bb1d2, limb1: 0x885d190dc80200b104734467, limb2: 0x2f8c96b95a4cc609, }, r0a1: u288 { limb0: 0xdbefd57376bacff12dd5bf8d, limb1: 0x725a4a257518c7f89ddc7147, limb2: 0xc764f79ea6d7683, }, r1a0: u288 { limb0: 0xfa3fe08305546a6b3bf2e9cf, limb1: 0x710f3caf9d79a6696b4d972, limb2: 0x12139b7a210ceba1, }, r1a1: u288 { limb0: 0x508cd98936add0253c52a372, limb1: 0x802ab928a43250c71b30e58c, limb2: 0x5fc4912d57a3f0c, }, }, G2Line { r0a0: u288 { limb0: 0xfec54ca77219e3f19676ab7b, limb1: 0x35c7f555865188a018a4da62, limb2: 0x21186a3acc624741, }, r0a1: u288 { limb0: 0x21ddf02f404de3a01207e58a, limb1: 0x23771e91b431f2af1f1ac780, limb2: 0x8e3f5e341b6527a, }, r1a0: u288 { limb0: 0xe4a4409417045e8a52de5c81, limb1: 0x7285bf1777e48aacf83eec1, limb2: 0x20fb9b67bbbd29e1, }, r1a1: u288 { limb0: 0xa48af9d53abedb33c38211a1, limb1: 0xcc79b186b059588232745396, limb2: 0x117cf4e8ab0d8c01, }, }, G2Line { r0a0: u288 { limb0: 0xbf62a89fb0b5572d634e036e, limb1: 0x62a4d7777fbdb30e117e4c96, limb2: 0x1433cd8e6693800d, }, r0a1: u288 { limb0: 0xff6e40d2e595bd4b38b984b5, limb1: 0x10a254dcf6a53cd6a1a536a, limb2: 0x205a86246aa4e70a, }, r1a0: u288 { limb0: 0x6ad13bec3f64b16831ecf3fc, limb1: 0x77e9fac67ceed69e2884e6e2, limb2: 0xacc767288a196f5, }, r1a1: u288 { limb0: 0x212a64c8db6818125f5c9d93, limb1: 0x8572ee34b58bae6edf226f4e, limb2: 0x2948ef466aa9fd42, }, }, G2Line { r0a0: u288 { limb0: 0x866d9dd94cf5c01da1af5b70, limb1: 0x89ec47fb1c069b4a36fa36fd, limb2: 0x2a0587e51228856d, }, r0a1: u288 { limb0: 0x771ffaa3db79c0011aee776f, limb1: 0x40625b6f2ee697202dfd503a, limb2: 0xa81c431cf771fa8, }, r1a0: u288 { limb0: 0x8711b2a55df6bf89af526172, limb1: 0x1eb553b6ff69efe960c7c10b, limb2: 0x1f669ce048bde363, }, r1a1: u288 { limb0: 0xf800397513b7b78bd8083e57, limb1: 0xc4528a9a59670bbb3033b697, limb2: 0x262a51ab0a32bc7, }, }, G2Line { r0a0: u288 { limb0: 0x84c92b9b7085152c191113c9, limb1: 0xea86e4190741f5a1d63fe1a2, limb2: 0x1631d1377040b84d, }, r0a1: u288 { limb0: 0xfc0579707daf96862bc47877, limb1: 0xf0a566778792313273feb448, limb2: 0x5e725ab3a8f04c2, }, r1a0: u288 { limb0: 0x746e1d6337bd29553a1a49d2, limb1: 0xf5e43538015ea9d289aae3bd, limb2: 0x2b858fe696979a0d, }, r1a1: u288 { limb0: 0x5d0468a94a03c5e8fb9b7442, limb1: 0x4bcf854c79dfcd8f93f7b5a2, limb2: 0x235b6ce0b723a15b, }, }, G2Line { r0a0: u288 { limb0: 0x47d3184d435caf4d8ac68218, limb1: 0x5fbeeeccc4f0d2b4b35ff5c1, limb2: 0xc44d4495a9252fb, }, r0a1: u288 { limb0: 0x1920a8fe49e6829c82f62ce8, limb1: 0xacd523669ac89fffaaebdae1, limb2: 0x235b4c0c2409068e, }, r1a0: u288 { limb0: 0x6126477661fb01a2eda1c7e6, limb1: 0x393b5af3da3463a0c92ffad, limb2: 0x302d5c3952fea360, }, r1a1: u288 { limb0: 0xca17079a6b293fc5c658989b, limb1: 0xbb41d630afba0696af3a3407, limb2: 0x1f7d9b481972987, }, }, G2Line { r0a0: u288 { limb0: 0x2226ca676134b1f3a0926460, limb1: 0x826cd143e34fd3745d995e86, limb2: 0x1d54d2aa3c5f7ac7, }, r0a1: u288 { limb0: 0x3515a092edde84420d650907, limb1: 0xc0e550c22584c2319b0a82c, limb2: 0x1dae1ecd1ca07560, }, r1a0: u288 { limb0: 0x7c23169a2d1ed918ab673e29, limb1: 0x5484a8a7a79ea6c754af3cad, limb2: 0x2545e6dc3f9ce4c9, }, r1a1: u288 { limb0: 0xd125d5ce04b20018ad6f85d9, limb1: 0x1525475fb4f94e15acb82f7, limb2: 0x1f82f7bdc16f6382, }, }, G2Line { r0a0: u288 { limb0: 0x51de6ee8db519dfb0aa693eb, limb1: 0x64c7ee0f928747a2f5f0f936, limb2: 0x1202023a3955cdcc, }, r0a1: u288 { limb0: 0xb6ba4af6f923a0d846ce153c, limb1: 0x60fe2184eafa93f4eb996772, limb2: 0x16d57296a4ee3e6c, }, r1a0: u288 { limb0: 0xa60c48290b411ba3f980fe24, limb1: 0xbe6ad7c874855edaa1b65a97, limb2: 0x46ed521f5594ec, }, r1a1: u288 { limb0: 0x45849bc30c4d8430b3c651ff, limb1: 0x2563e767d417bd382197c73, limb2: 0x16709b70a1667419, }, }, G2Line { r0a0: u288 { limb0: 0x2bdced180a9910450908f1a6, limb1: 0x1f4ef7e2d77e9764f537f621, limb2: 0x209b61f43f3290b, }, r0a1: u288 { limb0: 0x3d1fab7bd5a20ee703a3a1ab, limb1: 0x6dd08c68afb95f625c81c7df, limb2: 0x2fceb99f81d59152, }, r1a0: u288 { limb0: 0x61998f00abc817c74677e69c, limb1: 0xd15359c21be66df2e9f763a1, limb2: 0x20acc9fcd918b204, }, r1a1: u288 { limb0: 0x58c54c374dc0b19648206559, limb1: 0xaae9d1fa0b4859284de90438, limb2: 0x18b9cb802e16400, }, }, G2Line { r0a0: u288 { limb0: 0xa8af1d6e69891fd6151f69e5, limb1: 0xc9a0fc4d628c3a9cfb33e957, limb2: 0xc205db4af1bd115, }, r0a1: u288 { limb0: 0xe04de2e204ed323699cbf1d0, limb1: 0xcdad0d6d615cf2efe6486b8f, limb2: 0x24feaffdc4c0f6fb, }, r1a0: u288 { limb0: 0x9a74590fcd5dd32ce4084080, limb1: 0x26eaea5397bec2eddba3b007, limb2: 0x2e171e90cd48c68b, }, r1a1: u288 { limb0: 0xcab514b4d0f8c4de087167f, limb1: 0x4089650224f0df0b55cdbfa5, limb2: 0x20e3e700df023af1, }, }, G2Line { r0a0: u288 { limb0: 0xa952db0b09a1e0a8afa85959, limb1: 0xd31513490bd63f93546b8b44, limb2: 0x2b62974e51c3e808, }, r0a1: u288 { limb0: 0x3082616da438e53047cf7b15, limb1: 0xad132a494322c88251aa940b, limb2: 0x1638631f0b09eb79, }, r1a0: u288 { limb0: 0xe2e5db1f9e9b7d34a466ca2f, limb1: 0x6edbd12f1ef34ed5334cdd54, limb2: 0xc499b73f6f41690, }, r1a1: u288 { limb0: 0xaacf3111e2b20853c931d1c1, limb1: 0xb35ae0c43b79be6e06117404, limb2: 0x2a23dec3816a3c7d, }, }, G2Line { r0a0: u288 { limb0: 0xb6ed55030e8729397efcc145, limb1: 0xaa34addaea010361c02e0306, limb2: 0x2742bd085dc8c143, }, r0a1: u288 { limb0: 0x898d7670f9872d2107b383bb, limb1: 0xc214e84a71a23f180d9eb8d1, limb2: 0x168f2063fe0912a9, }, r1a0: u288 { limb0: 0x578ba288320514edb50b6e8f, limb1: 0x2d290fa04eb58f49066fbc74, limb2: 0x2aa6192fd793ef3f, }, r1a1: u288 { limb0: 0xf67d935533f75f98ccf08227, limb1: 0xeea0611976e71b0aeb4b1b6a, limb2: 0xb73b7adb8c016af, }, }, G2Line { r0a0: u288 { limb0: 0xb3f4d09089d3ed8d435eb8c0, limb1: 0x86f51f3c75097e64c5ab5f62, limb2: 0x1c6317402ee2fe95, }, r0a1: u288 { limb0: 0xa00c59cd149cab75ac1e1263, limb1: 0xdf8f325f8fd713ebe123f6e0, limb2: 0x20135070c6c2f86b, }, r1a0: u288 { limb0: 0x692e693651922c9ed5b55f8b, limb1: 0xdfe74e43af132550435a9d1e, limb2: 0x2b72066a933709f1, }, r1a1: u288 { limb0: 0x5d49b84a4aa6058a6d6e703, limb1: 0xb1f91b7ebceab14216152085, limb2: 0x1967682ee3c18a7a, }, }, G2Line { r0a0: u288 { limb0: 0x33629d96c671a40a62c2da4, limb1: 0xb414918620ae4edc267c0bc9, limb2: 0x1d3961343ac4df2, }, r0a1: u288 { limb0: 0x254d73fe94cdde8ed9890b6b, limb1: 0xb962da0dcb410c53789cc70e, limb2: 0x16e205ec74090889, }, r1a0: u288 { limb0: 0x578ac38bd46442e3921b93f, limb1: 0xca84b0403bce539c78c6e5c3, limb2: 0x204ff9c462bb7f72, }, r1a1: u288 { limb0: 0x87c93d98fcfc7555f15f52ad, limb1: 0xe3263a16c0c8a5a7efe968ff, limb2: 0xf07070bfdb0f99c, }, }, G2Line { r0a0: u288 { limb0: 0x906d9cfd92ee9a42ed2259e4, limb1: 0xfa9a8f287d966d31195be1aa, limb2: 0x1d8e310fc8f947d8, }, r0a1: u288 { limb0: 0x56b93c74493683d4c708212, limb1: 0xb1e5c2fd8c2141c61b48f7e, limb2: 0x54d4690b93bed74, }, r1a0: u288 { limb0: 0xf44f49b074bdf24754dfad0d, limb1: 0x67a90c021637ee954c2a379e, limb2: 0x1b9888615ee2913e, }, r1a1: u288 { limb0: 0xaab23130c5df9453f58c1134, limb1: 0x33731a3fa835e82c50ce2efd, limb2: 0xe51950c67c429a, }, }, G2Line { r0a0: u288 { limb0: 0x278c9c013ae096a555b3ec0f, limb1: 0x610d15043cff6872498a84b8, limb2: 0x2be6b3691c3b1cdd, }, r0a1: u288 { limb0: 0xab1801f4fb51698ffcf4a785, limb1: 0x2c5b0c65e18486f1db2e7b16, limb2: 0xee1c0a5598d8ee5, }, r1a0: u288 { limb0: 0xdccb4b414e4b51403b40c360, limb1: 0x950f6c1774b0a9274543e3f9, limb2: 0x3035735696163c43, }, r1a1: u288 { limb0: 0xb13ffd0306de54e54da63f29, limb1: 0xb0d7c02dd2152dfd24e837b8, limb2: 0x61f242c5aef937a, }, }, G2Line { r0a0: u288 { limb0: 0xbff090424ff64b168abd7ed8, limb1: 0xfbf2b7ff152e680def29cf67, limb2: 0x11631c347b8d5722, }, r0a1: u288 { limb0: 0xa4ffe19971619f52dec586fb, limb1: 0xfadff2ba47b489d5054debee, limb2: 0x21a126d22cb30a3c, }, r1a0: u288 { limb0: 0x75ac1ea03e30d1ee2a7ad65, limb1: 0x37410414baa2eb7017bb5855, limb2: 0x1a51ee35991003f5, }, r1a1: u288 { limb0: 0x455c7935775dc77497e7c89, limb1: 0x2d6c275c5c4ba0a575a19c13, limb2: 0xc0dd9d3ea7a9ade, }, }, G2Line { r0a0: u288 { limb0: 0x4af478bc839dde72d2e8cc92, limb1: 0x39a0acadeb78af4fb5dbe383, limb2: 0x1b446cbeaea59d46, }, r0a1: u288 { limb0: 0x48d371224068708ad6cfc116, limb1: 0xeb6f5c875523671fe6bb1f80, limb2: 0xdba3978f44c9853, }, r1a0: u288 { limb0: 0x4963a814014539613a3e815e, limb1: 0x6245603c8b693d1c28c16e49, limb2: 0xb2ea516ccda6f09, }, r1a1: u288 { limb0: 0xf5ed7ec964654532426b4888, limb1: 0x1a7c82c2b8af5cecbcdca52d, limb2: 0x27f711764b54cee8, }, }, G2Line { r0a0: u288 { limb0: 0xc53cccfdb561e69a52782bb, limb1: 0xeeec6da4d5ebc08df5815014, limb2: 0x1d29e3cafeebc352, }, r0a1: u288 { limb0: 0xc6aa872125f3b220f96a9cd1, limb1: 0xc0e77f6ac66bfd97664139e0, limb2: 0x3741acbda901459, }, r1a0: u288 { limb0: 0x52f1a5f6845306c0defbedd9, limb1: 0x80a6b1b02f80301d3a0dc080, limb2: 0x181a86be5b8f64ec, }, r1a1: u288 { limb0: 0xa249185699b571387abcc094, limb1: 0x1c4b4890cc3addd178e2de3d, limb2: 0x27ac0852aee62087, }, }, G2Line { r0a0: u288 { limb0: 0x35c2f42c8ac8c3e4454917fd, limb1: 0x3bf48982e71153a198e54963, limb2: 0x2a9f396d0d827ead, }, r0a1: u288 { limb0: 0xbea85053b686a4fb31267e68, limb1: 0xbec1d438473d13cefa4b0bd9, limb2: 0x25c2cbb7e7615d3a, }, r1a0: u288 { limb0: 0x4003c5a77762d598d26651ce, limb1: 0x2efe1dd975f92a292079355d, limb2: 0x17d7d17be5145528, }, r1a1: u288 { limb0: 0x7cfd8f75da47da500d6d8c7e, limb1: 0xf63a158f1246fa8382aef748, limb2: 0xce3a2406f7606cf, }, }, G2Line { r0a0: u288 { limb0: 0x71c82502374ad055eee34a70, limb1: 0xbf607dbe6e74c9f06bf0f2f2, limb2: 0x17ad31e67a125bfa, }, r0a1: u288 { limb0: 0x75e0f096ad837bb65e18f5fe, limb1: 0xf57acb24db4e597ad6dfd0c5, limb2: 0x2baed364893718d3, }, r1a0: u288 { limb0: 0x650c59126052997ddebdbf06, limb1: 0xe5694f3d235ba12f4e80e1da, limb2: 0xc3d775c73973d78, }, r1a1: u288 { limb0: 0x86ecc04bb1dda6baba72f110, limb1: 0x26a56fe363233bcba7a6bbc7, limb2: 0xcccdf39db0efceb, }, }, G2Line { r0a0: u288 { limb0: 0xd14af8581af5048d860b42d8, limb1: 0x5983b9a1ab460420aac0e5fa, limb2: 0x2cac8350464e5a46, }, r0a1: u288 { limb0: 0x9852dbbe33a5c81ef2ef28df, limb1: 0xe27bbdc0499c71d8751fa8fd, limb2: 0x2596598d10b8e209, }, r1a0: u288 { limb0: 0x5d640a56b866092cd2ddda67, limb1: 0xbc7c9df1a76876f2af28a37d, limb2: 0x198c4d4be5dfe657, }, r1a1: u288 { limb0: 0xf75e1f774ca4206fa9fcda52, limb1: 0xc094c286837192006d77bf19, limb2: 0xcf2a11e9eea72d4, }, }, G2Line { r0a0: u288 { limb0: 0x3f7d6ff3e3048f3d3b217cb3, limb1: 0x17d29aee9dc30e589c3409ce, limb2: 0x13594ce650eafdb7, }, r0a1: u288 { limb0: 0x56007f7714afee54d813795e, limb1: 0xfbeadbe9e4d223705b6f52b9, limb2: 0x16c1493ccf93baf8, }, r1a0: u288 { limb0: 0xd61ca8fe2027f969c984a06c, limb1: 0xfd681777ceaa7b105f32c686, limb2: 0x89c32a2360185c2, }, r1a1: u288 { limb0: 0xc0be27a2efabaa040fc34bde, limb1: 0x4025016352e1fb49753dc175, limb2: 0xae0f4b4e22bbbdb, }, }, G2Line { r0a0: u288 { limb0: 0xb714a66fd690196097466167, limb1: 0x470b3ea1df7db4f80c0f7c28, limb2: 0xa2b04b84a338d79, }, r0a1: u288 { limb0: 0x99e371187196a0e5e1cf157d, limb1: 0x1c37ecc4a15489ba4d1779c, limb2: 0x2241007f12297498, }, r1a0: u288 { limb0: 0xc2d4196793dc2c1a6195e84c, limb1: 0x84aca2b3cc656ac3aaca479c, limb2: 0x25be01f34c7b0108, }, r1a1: u288 { limb0: 0x6284320ce1e28774e12ac179, limb1: 0xe63f8969b7d4831c0df44b75, limb2: 0x11959f32e56582cd, }, }, G2Line { r0a0: u288 { limb0: 0x12b126126d6a51f864d86b21, limb1: 0x1d0bdb4abac53547bcee2b4d, limb2: 0x2947d69adc1260a9, }, r0a1: u288 { limb0: 0xe7865d832dc76c6f81e52540, limb1: 0xa83bffdb570dac4070b74623, limb2: 0x2f7f591b620ebbf0, }, r1a0: u288 { limb0: 0x8c19ba55fbe3b83ab9a52ce4, limb1: 0xe422487d5d7a55084660e279, limb2: 0x451963810a77462, }, r1a1: u288 { limb0: 0x238470f53902b433c24b5095, limb1: 0x9f92f5a1a4c3dc5f5448ace1, limb2: 0x25b02dd2b4f13ea8, }, }, G2Line { r0a0: u288 { limb0: 0xf8c9c8cec6607f52c0c9a1b4, limb1: 0xe4bf0bcc8b18ef930b8f8498, limb2: 0x2afb9cf3aeeb2bbf, }, r0a1: u288 { limb0: 0x2005f7afc42e1e0c95cb60d1, limb1: 0xc5767bdb11d976e34bda43e2, limb2: 0x29602013060d4ff4, }, r1a0: u288 { limb0: 0x11570e8a2564f4049b9db0ec, limb1: 0x49eb826e6b83eff0404680d5, limb2: 0xcecd3d8af842dcc, }, r1a1: u288 { limb0: 0x4b7116478737ccae251f21d0, limb1: 0x801cc3a4c2973adba6e4ddad, limb2: 0x2b2f6090ab698026, }, }, G2Line { r0a0: u288 { limb0: 0x884df7b9c6266e14cc00d544, limb1: 0xb39ddb5ff70292b139767896, limb2: 0x2dec0cf17a7a9728, }, r0a1: u288 { limb0: 0xbf786f4a5a217fd2fb81a73b, limb1: 0xcfb52addb110bfc90b6aa315, limb2: 0x20acfe4cf1ffb3f4, }, r1a0: u288 { limb0: 0x58fdca71f63cd7f2da6998b9, limb1: 0x979bbe60391be8c8c020eb17, limb2: 0x1d271bcc5d463d8b, }, r1a1: u288 { limb0: 0xb4604fea4e6d2fa87b6546ca, limb1: 0x14ec3cc166da4fa93e7855e, limb2: 0x19eff643e695961, }, }, G2Line { r0a0: u288 { limb0: 0xe3fff14dc344f49a147400af, limb1: 0x552fa30aaf36a28b944068dd, limb2: 0x22f12a7ad2b957a7, }, r0a1: u288 { limb0: 0xff8236c0d8500425ffffe979, limb1: 0xd995e8b2955425eef9effefa, limb2: 0x1008627aeb38039f, }, r1a0: u288 { limb0: 0x761abe6a1a610e88ddb82821, limb1: 0x7f484e89e288b114a86e3104, limb2: 0x571350412cfb043, }, r1a1: u288 { limb0: 0xdbe60b9ed4870dafe4f6b562, limb1: 0xe27c012c5483844720417b27, limb2: 0x287fcf364036279d, }, }, G2Line { r0a0: u288 { limb0: 0x1edeb9e08e49a4cc6d595a6a, limb1: 0x4d749f26fcf5c2d70c0a0826, limb2: 0x537349d42ceec1f, }, r0a1: u288 { limb0: 0x71e75fa5345f7af0598be8fb, limb1: 0x94e35008e8882d98556d4f9, limb2: 0x1e5f86ec7f29e8c0, }, r1a0: u288 { limb0: 0xa59a00e6ef1857c7f37bba17, limb1: 0xaa80466f9ff308394641d17a, limb2: 0x22e8b793fed10566, }, r1a1: u288 { limb0: 0x85cc25707c980abee1603524, limb1: 0xf0a1429f6a9ce800109dd3c6, limb2: 0x439246edfedc6a0, }, }, G2Line { r0a0: u288 { limb0: 0xc3464ca03c070344bc851998, limb1: 0x628900ddf59e8fcab9e544cb, limb2: 0xc46d4de05410eea, }, r0a1: u288 { limb0: 0xc3fcebdd079623bfdfe5b76, limb1: 0x7293b945aea37cb296e5fe79, limb2: 0x1dfc0017bebb3827, }, r1a0: u288 { limb0: 0x8330726aebe0e9005929fbf2, limb1: 0x4aaecb83bd354c28abc709fe, limb2: 0x1db100a3ae9d2796, }, r1a1: u288 { limb0: 0xb769d01c317efe1645b5977, limb1: 0xc531f97ebdd47779587f7f3d, limb2: 0xa69ded3c01e9477, }, }, G2Line { r0a0: u288 { limb0: 0x58d096250a5f996582135298, limb1: 0x8b3a621d056b54ccbe85d4a4, limb2: 0x26de0b6ea20b2417, }, r0a1: u288 { limb0: 0xc0991b57a9e1506cab1180d6, limb1: 0xb77b1f14ad48be33a9a3d3ea, limb2: 0xddedb919473952, }, r1a0: u288 { limb0: 0x50b24127a621793d80986ea8, limb1: 0xd87c2df07cddcdb160e65f00, limb2: 0x1a376e99bcc12456, }, r1a1: u288 { limb0: 0x94e5f9f1ffeb27d8ced55bc4, limb1: 0xe0c8f2e76317d89edbac2b16, limb2: 0xd5c6a5a81f58007, }, }, G2Line { r0a0: u288 { limb0: 0xd9e189bd465323e7ccc5c8d8, limb1: 0xf3854408ae8833a96c0a44a5, limb2: 0x2aa4976b776fe008, }, r0a1: u288 { limb0: 0x6e0592dc622bfba3f3604600, limb1: 0xfaf5659c5bbbef47b9ac96b3, limb2: 0x1f0dc42f72ebc953, }, r1a0: u288 { limb0: 0xbeed1c4160d214aab80de397, limb1: 0xc2db7a1fd04bf557fe496c1a, limb2: 0x2d95453d59d9f447, }, r1a1: u288 { limb0: 0x8034644d710c6dbba13e467b, limb1: 0xf87cf4201f6abf6533e972e, limb2: 0x2e24defab8e33de8, }, }, G2Line { r0a0: u288 { limb0: 0x1694446b59660ec1fed6fb9d, limb1: 0xc0a4cbb8310e198ce8d997e, limb2: 0x2da8657ea7730f4, }, r0a1: u288 { limb0: 0xdd70e38f79be7c342e31044d, limb1: 0x5a8d74ec827b1414b7387287, limb2: 0x61248d0ea9090d5, }, r1a0: u288 { limb0: 0x725a8201bde6223b676c1523, limb1: 0x645238ecfc00a99aeeb4eeb8, limb2: 0x1d1fddea44ab94d0, }, r1a1: u288 { limb0: 0x83839eafce9360837b497639, limb1: 0xcbec9216940c09f042d3153c, limb2: 0x2180c12b34129e84, }, }, G2Line { r0a0: u288 { limb0: 0x5bac5422643e869c95e8758, limb1: 0x75a87d464e85d848733732c6, limb2: 0x17dd4782ba72be36, }, r0a1: u288 { limb0: 0xaee3bfbad5100e0a925100a9, limb1: 0x71d534c3c0a75b458dfcffeb, limb2: 0x6ce2915078a5228, }, r1a0: u288 { limb0: 0x551047c5156391326b3100c8, limb1: 0x6342cb22397195c24b239d2b, limb2: 0x21c7584f2234b2f4, }, r1a1: u288 { limb0: 0xddf561e69f4a85c68a1fbb5f, limb1: 0xe60381a1141b501717848e3c, limb2: 0x18963467c96efe0e, }, }, G2Line { r0a0: u288 { limb0: 0x43c0e893813e89326e6d7292, limb1: 0xa039460fc1ffe8b46a153b1, limb2: 0x27d053716ecb9cd9, }, r0a1: u288 { limb0: 0xf50b97a916e074212516e5b6, limb1: 0xd022b79f1419b1f40ecdf478, limb2: 0x1d1206da817808b7, }, r1a0: u288 { limb0: 0x25a6cedcf5d6ddb32b966856, limb1: 0x2a4e55aedf867fa395c11b66, limb2: 0x185e2c0ebb4ad386, }, r1a1: u288 { limb0: 0x19a943e29773716d15946034, limb1: 0xba20fb1af88682e70de60783, limb2: 0x17d681927b62d229, }, }, G2Line { r0a0: u288 { limb0: 0xf7fa1e079660015140590591, limb1: 0xc30ed30ec9915ab4fc15f7ff, limb2: 0x243a6006b965f61a, }, r0a1: u288 { limb0: 0xf8da46207ede41bd56e50a43, limb1: 0xe04b09702796cd90c2425928, limb2: 0x2e7ae22af53376f2, }, r1a0: u288 { limb0: 0x5af2801c7d933321f9435b9b, limb1: 0xd2318d1258ba0c6c1daee6d2, limb2: 0x23afd2f1a99800e4, }, r1a1: u288 { limb0: 0xe39965536174be4d41378ab2, limb1: 0x86d346ec3ef6a2dfb8319fce, limb2: 0x1da387ce6ce0d298, }, }, G2Line { r0a0: u288 { limb0: 0xe44b9574eb888dee9f4e20dc, limb1: 0xf31eb1efa49ca68cc34081f, limb2: 0xfad1981220113be, }, r0a1: u288 { limb0: 0x9ab7843efd617ddf119164fe, limb1: 0x76cafdac5a293b073ed57ad, limb2: 0xd0e754b42bb068a, }, r1a0: u288 { limb0: 0xe334e2852f757ecc004f2f1e, limb1: 0x402aa243f80d326c17d11b15, limb2: 0x1f6c545d5d39392c, }, r1a1: u288 { limb0: 0x5749b413972936886b183b9f, limb1: 0x7d2a1beec672867c931a8293, limb2: 0x1ccda8ec93a0273b, }, }, G2Line { r0a0: u288 { limb0: 0x9f47ddea4c0b8b40dc986ddc, limb1: 0xa0be8511b87227fadcd76ee8, limb2: 0xfcdf0494a2bc732, }, r0a1: u288 { limb0: 0xdc00663637fde6d5b906e716, limb1: 0x9b2a202f83175ae5c305a611, limb2: 0x5d06f2336099060, }, r1a0: u288 { limb0: 0x1a585c16370b2e72ce762004, limb1: 0x456d73db558a873ad7cff6b2, limb2: 0x1fa965f8f98ca6f5, }, r1a1: u288 { limb0: 0x2d2a8f6911befce21db0812b, limb1: 0x8c0ea802fda5c7080ea50395, limb2: 0x7c5df2dee8313c3, }, }, G2Line { r0a0: u288 { limb0: 0x982a9081f5f8fd9414004f29, limb1: 0x48745d3195d133f3f7eb9cf8, limb2: 0x23d50a6b096134a0, }, r0a1: u288 { limb0: 0x8dd690a16a679f3d3e41fcb1, limb1: 0x2bf5c469d6877f908feb3a87, limb2: 0x2e773e73fb695075, }, r1a0: u288 { limb0: 0xf2ed81b71eeab0cdfc710ae9, limb1: 0x57db9a4270f81dc9bfb64860, limb2: 0x334d7b08732b83e, }, r1a1: u288 { limb0: 0xa8882ec080970eca432a600b, limb1: 0x8d6928f84217558b4b8126f9, limb2: 0x1b67ba76495fa971, }, }, G2Line { r0a0: u288 { limb0: 0x1c3dd7d156d67be9f4aeaa8, limb1: 0xbd90237976f8394378306671, limb2: 0x1d08036915e0dd71, }, r0a1: u288 { limb0: 0x231d2b731b96c51d226edaba, limb1: 0x54f6870a63eb1f65452f2dff, limb2: 0x19a442e5ccf62230, }, r1a0: u288 { limb0: 0x86b0048f2b838a694846ddf2, limb1: 0x8ebdbd6a17deeef0a9e89793, limb2: 0x2c3fd637cc908694, }, r1a1: u288 { limb0: 0x544fe7404b052b92ddd8749f, limb1: 0x856ebabdfc6c86b29d302e7e, limb2: 0x1451419a1600dfa3, }, }, G2Line { r0a0: u288 { limb0: 0x2fe1ebd1e53ec5b0f4268e1f, limb1: 0xa1cc2188de0d3fc7fb34bf66, limb2: 0x182fc2a35b3ef175, }, r0a1: u288 { limb0: 0xfe3f3818077e92dcdf902b05, limb1: 0xa93c77db9fdbd5a79d361028, limb2: 0x26d3c6d6d5a4c130, }, r1a0: u288 { limb0: 0xabef3803fdcbd839e246be11, limb1: 0x72f95ceda7e53263113f8da9, limb2: 0x139aec1203d92ce8, }, r1a1: u288 { limb0: 0x807eb60ed447012f9ad15b4c, limb1: 0x3bd36cefe2ac948e16e9c0a8, limb2: 0x6bee881437b0e5a, }, }, G2Line { r0a0: u288 { limb0: 0x56bcaed9684632a2bfce5bb4, limb1: 0x9e429f5aea1a66eeecfa2a38, limb2: 0x3d76a3ac3d4651e, }, r0a1: u288 { limb0: 0xf318a717ace4c189f90f3f81, limb1: 0xcb324779d5090afc09982055, limb2: 0x305aeff1c47da1d2, }, r1a0: u288 { limb0: 0xe74153062b51dea4abbaa7c2, limb1: 0xb0af9f816b16aa186af3e5df, limb2: 0x159bf9ee77d1b9e2, }, r1a1: u288 { limb0: 0x3e70ac7ef6cf83592cd954eb, limb1: 0xb0a5fbb32a160b0cee7f9034, limb2: 0x2c6199de44cc1f4c, }, }, G2Line { r0a0: u288 { limb0: 0xf158629d155bd7e202c572ee, limb1: 0x6db77b2b4493bcb7586d1246, limb2: 0x2367d2c9cfaed9d3, }, r0a1: u288 { limb0: 0xea4f9b43d0967753e57cdbe0, limb1: 0xc3eacf790d335214d6223e55, limb2: 0x19dad509ae22484c, }, r1a0: u288 { limb0: 0xda40ef1b79f182c340cea093, limb1: 0x2763ae12c9f0cf8668079884, limb2: 0x2bb5813ff3e9ca2d, }, r1a1: u288 { limb0: 0x510f871618c4726ed002cd0e, limb1: 0xf17db1c8beafafa17311becb, limb2: 0x26885d10b141626f, }, }, G2Line { r0a0: u288 { limb0: 0xbdca04cc049ead113f92fdf0, limb1: 0x34a187101f66d212fd60eeb6, limb2: 0x2b1014e453475cff, }, r0a1: u288 { limb0: 0xe444f3c70fad06b4b6fc0bb6, limb1: 0x9f1c3c9ebcbbea9fbb631c54, limb2: 0xb918e8ffbfe8a02, }, r1a0: u288 { limb0: 0x606807fa707dacb60e4f7b53, limb1: 0x4ef1a20b0bc39ff0b4e48514, limb2: 0xf218649f2e73b3c, }, r1a1: u288 { limb0: 0x81fa6d620e45c23cbbf1f622, limb1: 0x38da47f11b383ba1461436a3, limb2: 0x837612c329d697a, }, }, G2Line { r0a0: u288 { limb0: 0xfbeac24075d6f0bd847f505f, limb1: 0x11f0f12ccc004707ce2fcec3, limb2: 0xc310bf45f22489b, }, r0a1: u288 { limb0: 0x184769ff32effb0080bd9282, limb1: 0x94861b6747fc96bbd348eeb5, limb2: 0x1c4daba8fedab142, }, r1a0: u288 { limb0: 0x83488ba56a75bac2444eb9bc, limb1: 0x8b62ed857cf1300abd22eb9c, limb2: 0x135d64f62ca31e90, }, r1a1: u288 { limb0: 0x54eb4787f8e28813b82ec15a, limb1: 0xd07f5859c765fdaabf1f0f80, limb2: 0x2aeeddeb65ef03ad, }, }, G2Line { r0a0: u288 { limb0: 0xab04c28363de86ea6f72de4, limb1: 0x30b8ed32ef343187e688d103, limb2: 0x168605f7c0b37cb5, }, r0a1: u288 { limb0: 0xf62ab1cd395ae609d2f685ed, limb1: 0xada87a28a9d619b144c0b35f, limb2: 0x2eff0a0507e5218d, }, r1a0: u288 { limb0: 0x4ff357d0c6ebed186e1f9c40, limb1: 0x20dd88d263bc52219e2f859c, limb2: 0x24d6d1a731984ce8, }, r1a1: u288 { limb0: 0x1d5151d06ca52aece509cbb3, limb1: 0x46548add3b8e3d3faacd05b1, limb2: 0x199d296e93cf8cbd, }, }, G2Line { r0a0: u288 { limb0: 0x8a033bf6880534fac8cfb54c, limb1: 0x13f208e848910d7bde1192ba, limb2: 0x1423c34f98fdcef6, }, r0a1: u288 { limb0: 0x598d27c08012f40c3d3e9e75, limb1: 0xdc4107a10a7d803199d93086, limb2: 0xc5257edbf918701, }, r1a0: u288 { limb0: 0x4a3400be453d6b3c34e1fb44, limb1: 0xf91d5ac5ae679c33fff36409, limb2: 0x1be98b7749edf072, }, r1a1: u288 { limb0: 0x6680d0e3d2b864d119b827ca, limb1: 0x5aac4bc1b57a2e22ccf58cee, limb2: 0x23b7fc2f9a6ae22f, }, }, G2Line { r0a0: u288 { limb0: 0xf0775979754e902669f0e444, limb1: 0x2e61682c7e17b57130ccbfe0, limb2: 0xf21378dff131bc3, }, r0a1: u288 { limb0: 0x621b48168acdc19dc97ebbf0, limb1: 0x9909fd8847205eb91ae80e2b, limb2: 0x15534e1988bea372, }, r1a0: u288 { limb0: 0x836091f715c8ad2669df0e75, limb1: 0x5b706e57f70b2b69b33c9cdc, limb2: 0x12f7d428e0c8ff0d, }, r1a1: u288 { limb0: 0x306d15fba474fc201a777221, limb1: 0x55cafa050b672c2507126a6b, limb2: 0x1c150bb26372eb1d, }, }, G2Line { r0a0: u288 { limb0: 0xa188e933ee7410d97afdb93c, limb1: 0xd390d4faa3f1ca403fc39b77, limb2: 0x22ba33b8d7641e95, }, r0a1: u288 { limb0: 0x95c3812c2afb2bd2e4b35d5f, limb1: 0x61243c01b924123431702193, limb2: 0x7afc7339fcd4ad3, }, r1a0: u288 { limb0: 0x5234604f03b5a78036f17dec, limb1: 0x3e865fa0fddae6157c361e83, limb2: 0x62802572defde82, }, r1a1: u288 { limb0: 0xb0715990fb0e9c5e3a72b720, limb1: 0xc499138bc22f7a1afee6dc88, limb2: 0x2ce146b6cbc671d, }, }, G2Line { r0a0: u288 { limb0: 0xa51df13c764911013f1d01e4, limb1: 0x452c277faac5af624ed11334, limb2: 0x2f5f956a9879906f, }, r0a1: u288 { limb0: 0x37cd61b56ba0cc6cd3d394e2, limb1: 0xffa51ac2bdd7d1ef07a66bf9, limb2: 0x1778ef73778c3338, }, r1a0: u288 { limb0: 0x958d7ab0ef0acf4b8c860666, limb1: 0xe95e65d08595b6669b49d367, limb2: 0xdd821fce8671817, }, r1a1: u288 { limb0: 0x82613df8271eef94f8216685, limb1: 0xce4517a26e9d1ff8435f6bd3, limb2: 0x2d74a37dda03ec82, }, }, G2Line { r0a0: u288 { limb0: 0x4705fc6add33f6134dda85e8, limb1: 0x87fc37a77f2400df656f807f, limb2: 0x1c160e5ff98f44d9, }, r0a1: u288 { limb0: 0x6a0e358cc09cd9f66a6e2657, limb1: 0xb1a9b2fea93601140e30d66c, limb2: 0x9b506be37020061, }, r1a0: u288 { limb0: 0xb8c0a424d99a217f15aa5ad1, limb1: 0x3ce08d5d3a9f26850abc92bb, limb2: 0xc584793703cab09, }, r1a1: u288 { limb0: 0x7476f45ea5fb77da8b829946, limb1: 0xf7626f5dd86a7edf8028f911, limb2: 0x29f8098dfca1aaac, }, }, G2Line { r0a0: u288 { limb0: 0xaba2d53cda8e2d6c31f500ac, limb1: 0xfdbf88c50f2583b7c516266a, limb2: 0x15dc535aaf20cbdb, }, r0a1: u288 { limb0: 0x66a36c60ce96cd547c9a1755, limb1: 0xcde33ff5707f6c8f3cde3a7e, limb2: 0x73c9a84ae062b7c, }, r1a0: u288 { limb0: 0x4a0c8580eff1de7233d32d9e, limb1: 0xadc83a0d5f1ae9af1ec5e504, limb2: 0x12b12bc2dc726d83, }, r1a1: u288 { limb0: 0xc03b004c2c1449fdf5ec2afd, limb1: 0xa96a5efd4ba92c0a09c6da03, limb2: 0x4ac73284c6f6c78, }, }, G2Line { r0a0: u288 { limb0: 0x988db951df07bcf5167c0d2d, limb1: 0x37634b3bea2719769b35a4b9, limb2: 0x97470cf572bf0e7, }, r0a1: u288 { limb0: 0x93b3a64dfc09d5e6ee158302, limb1: 0x1c6a423bc1919a943f2ba043, limb2: 0x74fa5fb7cb911aa, }, r1a0: u288 { limb0: 0x6e1487ba7aa03f2fb0629047, limb1: 0x776bb4f378ed97e42522c9fb, limb2: 0x2f20cc4b753304cc, }, r1a1: u288 { limb0: 0xf1179e510531e72e2b490f84, limb1: 0xbd187facc02ec1a4ae712e67, limb2: 0x16f789e4d2a597b7, }, }, G2Line { r0a0: u288 { limb0: 0x25e1b3add74afea5c1f33129, limb1: 0x52d850b9b1acf448a43d9a84, limb2: 0x304d693be1b65945, }, r0a1: u288 { limb0: 0xf9c0ebd67e6130dbb8406900, limb1: 0xb385c49a9bd04738cd7b5428, limb2: 0x19a06db1f620a406, }, r1a0: u288 { limb0: 0x907c280d56948af74c060346, limb1: 0xabd4c238326dd19ca7c6381e, limb2: 0x2bdbb1d399cfd3c0, }, r1a1: u288 { limb0: 0x3d4dd4dad15e77d462c7e918, limb1: 0xadf6a96e3863a052cc62a68, limb2: 0x5ff2446f7007039, }, }, G2Line { r0a0: u288 { limb0: 0x138f586293881dd14bc6da3d, limb1: 0xd10a6cfa388f041b092fe446, limb2: 0x134fd296006efe38, }, r0a1: u288 { limb0: 0x7682e421ab596e09d97acaf5, limb1: 0x7bc08e33a9dc88d69a473ccb, limb2: 0x13ebd6e59ab524c4, }, r1a0: u288 { limb0: 0x9a3ab0aeddaf0f216d6f844a, limb1: 0x3126cf30520d8c7ad478476, limb2: 0x2c02338e19519b2d, }, r1a1: u288 { limb0: 0xdabfe2d07ee261d2be63e689, limb1: 0x70a90bbdc35afe2b5f7617c6, limb2: 0x2cf6596b31d7022, }, }, G2Line { r0a0: u288 { limb0: 0x1e7594119e66c328e7e8e2c9, limb1: 0xe9b1488f9e23ba1f0189f9f, limb2: 0x21c596062c16c15d, }, r0a1: u288 { limb0: 0xaa47ae6cab625b71d12923e8, limb1: 0xd5e69f6be21dc70822108b83, limb2: 0x1b50a92feea5d1ed, }, r1a0: u288 { limb0: 0x346c220acdcc3bb153de8aad, limb1: 0x824f54d0187e5b1357938cf8, limb2: 0x26b3a595f145b278, }, r1a1: u288 { limb0: 0x90422ba2c5b5cb7682f9f9a0, limb1: 0xda3b07105624448ee6af699e, limb2: 0x855f3de8d27553, }, }, G2Line { r0a0: u288 { limb0: 0xe734bd8469bb0d6be46b8261, limb1: 0x2b29d6d008357ba8e7a5e184, limb2: 0x1d1346c1f446537b, }, r0a1: u288 { limb0: 0xf8e1d78062ef5b92faf4cddd, limb1: 0xbaf1ca7bacabd5adfc1286a3, limb2: 0x666ba02d5f144fa, }, r1a0: u288 { limb0: 0x46627a668572ccfe69168290, limb1: 0x4191d2df34900702c6390bb9, limb2: 0x14aa1db861175db0, }, r1a1: u288 { limb0: 0xe127a538a4915164644a7383, limb1: 0xa1744671ffcd00e1c4ae838c, limb2: 0x2ff36f7e93de5d6c, }, }, G2Line { r0a0: u288 { limb0: 0xf372aa2d5b25f06383d49055, limb1: 0x9242b717f74d67f9a6407380, limb2: 0x2c8353bdcd31932e, }, r0a1: u288 { limb0: 0x48cee3064e31b233c1ec6bc1, limb1: 0xf2be923df0d2346b067b30e4, limb2: 0x3a8dc9fd9da0f60, }, r1a0: u288 { limb0: 0x8f89065450790649fddc1b3e, limb1: 0xbe5c8a4272361a7828e893ba, limb2: 0x16675f3e6029e5aa, }, r1a1: u288 { limb0: 0x5c9d27ca383d4ca0c63de6a7, limb1: 0xcda897ae6f5e2854dcf2f3d5, limb2: 0x290743df058f8305, }, }, G2Line { r0a0: u288 { limb0: 0xf1f3ab4a71bf063c478bc71, limb1: 0xcfe10cafaa4f16d30470ff11, limb2: 0x2a859743d831d561, }, r0a1: u288 { limb0: 0xda9e879d4da405e3745be46c, limb1: 0x6539bb41fc461e404d661818, limb2: 0x2109fa558b0a8210, }, r1a0: u288 { limb0: 0xe2fab01e8d7359c9120b3d72, limb1: 0x6d799a8db1bf63c665c6c68, limb2: 0x1bedbf111989dd04, }, r1a1: u288 { limb0: 0x6374e057728683e95ef4bded, limb1: 0x592dc554ee2ceccd54e9cbb5, limb2: 0x277996866989d1a8, }, }, G2Line { r0a0: u288 { limb0: 0x2a6a35d687fd3ab5ed444d70, limb1: 0xf30c2c150150716b84c25d9d, limb2: 0x2355381b4775f979, }, r0a1: u288 { limb0: 0xf31d6705cd3f9a1e729f7be8, limb1: 0xcd6d818c3ea8a55fe1601bc6, limb2: 0x2cc715925e8582fb, }, r1a0: u288 { limb0: 0xc34b5e6487ae899450b53ac0, limb1: 0x65a86cf5053c7421f70ec00c, limb2: 0x1c705fa60b0b6e46, }, r1a1: u288 { limb0: 0x1189127468bbdb55f404b7e8, limb1: 0xe0b50dc5855da0d20288ef4c, limb2: 0x2db9ba609c2b1f8b, }, }, G2Line { r0a0: u288 { limb0: 0x58deb5a39dddab04b4bfbe6f, limb1: 0x3d80edfce9162e06afd3fae2, limb2: 0x229b5dd9a090a07d, }, r0a1: u288 { limb0: 0xa2884f95690b37cb555319e8, limb1: 0x431b3224e78b46a35dd8e27b, limb2: 0xd1c9d6a556eff33, }, r1a0: u288 { limb0: 0x7d6f5780f353f4275084bd87, limb1: 0xeff8b298c309ae39ecc99974, limb2: 0x15dabb9a3840c586, }, r1a1: u288 { limb0: 0x6e408f5c601b2c2a42fcd6b4, limb1: 0x5b9c6ffa0ea6344c8f4fa422, limb2: 0x112a7281cd34d37f, }, }, G2Line { r0a0: u288 { limb0: 0x324406d06aab0393e4870b30, limb1: 0x6afe0b4af47ec81111094ea8, limb2: 0x6756b9414a8dba8, }, r0a1: u288 { limb0: 0xae5ba8ea8c9de615c7d2dee9, limb1: 0x335fdd8ee1dad4f3909a727a, limb2: 0x395b21d2c56fe25, }, r1a0: u288 { limb0: 0xe4ad199092e1e151932e0e15, limb1: 0xcc02c6c3d32e2e68c4309ff3, limb2: 0x10245964597e950c, }, r1a1: u288 { limb0: 0xa38e08616b574d86acc3f2bd, limb1: 0x57ca39109d9cca8fa3211d2, limb2: 0xf0f2642a34368c2, }, }, G2Line { r0a0: u288 { limb0: 0x950136cad4283c32b1e14070, limb1: 0x18a70087736a4085ea0d3aef, limb2: 0x161a9e5cef7ee79d, }, r0a1: u288 { limb0: 0xcf31e31a5ab2cf3d7f1287ec, limb1: 0xf07cce8ec28112beeeecf88, limb2: 0x25caba0bbe758c3b, }, r1a0: u288 { limb0: 0x4559351da5cc2c55015769fc, limb1: 0xe80942e51f4b6081a5181e20, limb2: 0x10bb0a027ef12705, }, r1a1: u288 { limb0: 0x6efbe1f1879cdf50c8cc3e50, limb1: 0x405b959e77d96ec753670ba8, limb2: 0x256172f694a90b43, }, }, G2Line { r0a0: u288 { limb0: 0x7a655a088b9e434d956d29b3, limb1: 0xd8968757953325c9fc2bf54b, limb2: 0x248c77d9b9eac25f, }, r0a1: u288 { limb0: 0x520b04dc8045a2e028bec72e, limb1: 0x332013f75629ccab3d881ee, limb2: 0x2d8653581e83e63d, }, r1a0: u288 { limb0: 0x4ba0c6f6e54c61c7f2abfd1f, limb1: 0x641f0ee83c94e5f43cb543e0, limb2: 0x110f1ea1977c63ed, }, r1a1: u288 { limb0: 0xe0689a4e4544b6405bfec89c, limb1: 0x42b073192ea62e7a3d456594, limb2: 0x2b5defab459aa7, }, }, G2Line { r0a0: u288 { limb0: 0xf33925f9b68c26fcdc41ebb5, limb1: 0x2b4e46523eacb7d3d7679ded, limb2: 0xae9b529afa96647, }, r0a1: u288 { limb0: 0xbbf762afa9b7ec494e9919cc, limb1: 0xde01f8208e22254629805591, limb2: 0x2908b2c6aa755795, }, r1a0: u288 { limb0: 0xe719a960b123c63298d4580b, limb1: 0x70fdc5502d31860bf5e24d91, limb2: 0xad07726f92325dd, }, r1a1: u288 { limb0: 0xd501a4cccd1b92251e18acb8, limb1: 0x48d6dbb94067b970de5e8d62, limb2: 0x6582f750a7528e2, }, }, G2Line { r0a0: u288 { limb0: 0x76adc23ad83e917055379e01, limb1: 0xa37a413680cab603c29ef480, limb2: 0x102d265010dc02a8, }, r0a1: u288 { limb0: 0x11ff7fd9aa3b06ea2fb2a3da, limb1: 0x8b4db920b544d2ec8815b4d4, limb2: 0xe3a1eceb3c4e1dd, }, r1a0: u288 { limb0: 0x2975d22f8ff1d893ba17eec5, limb1: 0xc41fa6d39e1bd0088b641e5b, limb2: 0x120c565ce46e6eab, }, r1a1: u288 { limb0: 0xbda9ce34164be7cbcbe4052a, limb1: 0x57c6bbfdcf08664b2014b07b, limb2: 0x2cd9fb3fcb9933d, }, }, G2Line { r0a0: u288 { limb0: 0xf56e86d1ca0cd0542cbc4674, limb1: 0x11018bbc0dc8cd4b8b7ae4f, limb2: 0x22c3cd45600ce3ab, }, r0a1: u288 { limb0: 0x33a111bcf69011ed5dfea95b, limb1: 0x2418d7b1ee6d6f32713cfe7e, limb2: 0xd5b5c6d8c1519ed, }, r1a0: u288 { limb0: 0x2382a6bc543a7027de67c43f, limb1: 0xa38eaf7d59bda8fb4cb3393c, limb2: 0x1a9625a471ac3f3d, }, r1a1: u288 { limb0: 0x31460658c417f30241adaa81, limb1: 0x2d7fbd15ffc0f167b09fb12, limb2: 0x58d2b9e0bd06b5b, }, }, G2Line { r0a0: u288 { limb0: 0x82bfa35b631169ad2f83361f, limb1: 0x99f56b3227f7e254defe5, limb2: 0x1950c5a24028a2aa, }, r0a1: u288 { limb0: 0x1337a344b6ac1fa757c934a4, limb1: 0xe33df35dfde3e6063ab1eb7, limb2: 0x2a3cc47f276a0212, }, r1a0: u288 { limb0: 0x1245820f20882f9139470e7b, limb1: 0x7a1c9e876bf26adb41c64027, limb2: 0xd422a9827cbf457, }, r1a1: u288 { limb0: 0x5f59c344aabe02ee306a7a07, limb1: 0x6ababab105f405239586317d, limb2: 0x1fc81898cef32a96, }, }, G2Line { r0a0: u288 { limb0: 0x437d9858e6b05bca1aa1347d, limb1: 0xf012e5839e7f52c7d1aa4f71, limb2: 0x74167847908a227, }, r0a1: u288 { limb0: 0xa5fc5b1e5d9e423cf693e9a2, limb1: 0xf6cf7b8f14cb8bac89b003ed, limb2: 0x2b2fbdb6f3d2c547, }, r1a0: u288 { limb0: 0x4d27497878a92fcf1bf112ae, limb1: 0x6ed3fab765fd2b78dafba22, limb2: 0x20b6a585415c0f8c, }, r1a1: u288 { limb0: 0xb6046abd25f56c82783877ef, limb1: 0xdeead7b25917e53f6274438a, limb2: 0x1ea62e9f6b9581ae, }, }, G2Line { r0a0: u288 { limb0: 0x4b45c74101e263842de438e2, limb1: 0x1de5d13076e9167da76b5deb, limb2: 0x234a516a4d637634, }, r0a1: u288 { limb0: 0x1a71b588bd25e5c61d88a8f3, limb1: 0x5d278614526c6bfd165be50c, limb2: 0x1ea7a078ebbdfef0, }, r1a0: u288 { limb0: 0x2af591b3a6ce1a91ed970c72, limb1: 0xe2f4ee607563097d22eff760, limb2: 0x1e3db808fe7f4be9, }, r1a1: u288 { limb0: 0x4a65dbea8b249e4bb7d6f89, limb1: 0xb7dd9a218720ff0d1cee04bb, limb2: 0x2ab465a3f689ce40, }, }, G2Line { r0a0: u288 { limb0: 0xfb9bd919cce844113eb51a5d, limb1: 0x2415ec83cd2875963f51ceb7, limb2: 0x262ce736e9819e0a, }, r0a1: u288 { limb0: 0xa007bdfcbfb07d488ef141a5, limb1: 0x7f00d5f63ca999d9a73bc5dc, limb2: 0x25302703fc347c2b, }, r1a0: u288 { limb0: 0x90fb618d2fc0f78331a80790, limb1: 0x37f314c2c3a4f6b372aee4ab, limb2: 0x2254e3aa6d2d018, }, r1a1: u288 { limb0: 0x22aee155084437d36b4673f9, limb1: 0x6e5b1f8b55a312a7fc0d5fce, limb2: 0x13ab6d95ccbcf9d7, }, }, G2Line { r0a0: u288 { limb0: 0x7ecd5ec39e2e9b688d7aeaa4, limb1: 0x77729bf869c5a1dc11f80ae6, limb2: 0xa4ab4cbe035d638, }, r0a1: u288 { limb0: 0xbae7313da7df5088a5f2f220, limb1: 0x1df603e4fb6e3a1a93053fcc, limb2: 0xfc8d5cd9811a4f5, }, r1a0: u288 { limb0: 0xa9643b8b51ba9c1aee411165, limb1: 0xc5eda1d47ceff78eba53c6c5, limb2: 0x67cba27e3af918f, }, r1a1: u288 { limb0: 0xbbdc08c72d30e0bb8b267bef, limb1: 0x9da54c8245f33163fd4c6498, limb2: 0x1ca91c6b163400de, }, }, G2Line { r0a0: u288 { limb0: 0x7767ffa2530e4910bbeb9d6a, limb1: 0x24280b12e75928168db8db17, limb2: 0xda8635b51827e28, }, r0a1: u288 { limb0: 0x9e32f2fa8a95f36f060e121c, limb1: 0xb33bbe64b4fcbc221db72502, limb2: 0x1b3906450d00a8bb, }, r1a0: u288 { limb0: 0x91ffdc9eafa80c31241d1c74, limb1: 0x2660f321f1a657b8945e98e2, limb2: 0x1d456a7c25ac8fe7, }, r1a1: u288 { limb0: 0x9bfea7b3fc76917867b20020, limb1: 0x810fa5065a6b41e77ceec935, limb2: 0x2c8a1c71efdbecbd, }, }, G2Line { r0a0: u288 { limb0: 0x2f85f2108456ccaa53ef65dc, limb1: 0x878b6f9f7563f90c378bc4fc, limb2: 0x4c7d2e26d1b9920, }, r0a1: u288 { limb0: 0x78296cde1a06f23d06745e73, limb1: 0x1395e39fc8ac50fcbf74feb0, limb2: 0x15887f14dfab28b3, }, r1a0: u288 { limb0: 0xf6c96ed03aec71287b573c47, limb1: 0xd82c1129917c88c39187c58, limb2: 0x62e44c99340563e, }, r1a1: u288 { limb0: 0x9f5f8f1fc79fe0c32e31008f, limb1: 0xbdbffb831b3eddb5e2f307c2, limb2: 0x1e47e50cc12f3f3d, }, }, G2Line { r0a0: u288 { limb0: 0x2b99ce250113516077e3138, limb1: 0xf47cd426557dc1a0a644b032, limb2: 0x17798a574bcffa86, }, r0a1: u288 { limb0: 0xf0cd9b8ab6c440e787a8885d, limb1: 0x7500cbb999f2375c0874398, limb2: 0x2507d26d47778d6a, }, r1a0: u288 { limb0: 0xf309174a30444cc45ef9b3ec, limb1: 0xba1c35e5c4366c3e8d630b5d, limb2: 0x206335368b8b0d04, }, r1a1: u288 { limb0: 0xcb7e874047c87f0289676720, limb1: 0x13b09c1bbe23cf641b870815, limb2: 0x2469f344ee173692, }, }, G2Line { r0a0: u288 { limb0: 0xe68e77ebab10145070499de6, limb1: 0xc608aaedf011053bc51e1912, limb2: 0x168c3766afccee98, }, r0a1: u288 { limb0: 0xde0798cd03867a27405533c3, limb1: 0x50d4ef22cc77987c7026e9c3, limb2: 0x297e8506ca525c60, }, r1a0: u288 { limb0: 0x87e6c0226d9bf9796cec7983, limb1: 0x15024a4918324b3cad118318, limb2: 0x102f20badd209d78, }, r1a1: u288 { limb0: 0x7eeb6de8801808a185b01759, limb1: 0x2e8680c6484ec17243e0f2b0, limb2: 0x1d6ca6db6ee3e50d, }, }, G2Line { r0a0: u288 { limb0: 0xc4e37e3305c8e3f4639a8b98, limb1: 0xb9ec4ca4d7d49a9822008dbe, limb2: 0x615661361045cf2, }, r0a1: u288 { limb0: 0xb42d676b3032557533fb7d13, limb1: 0xf3b06bc53cf3ef01a864ee38, limb2: 0x73c33be229ad89, }, r1a0: u288 { limb0: 0x942092185dc6ed03bdf0ab37, limb1: 0x43e304cbc5e653a44f0890b2, limb2: 0xb11bbd65dcfe3bc, }, r1a1: u288 { limb0: 0x9157802e363daff49f64ac5, limb1: 0x75e52d50100499365604decd, limb2: 0x2eb339b99d930ac0, }, }, ]; ================================================ FILE: src/contracts/autogenerated/groth16_example_bn254/src/lib.cairo ================================================ // Generated by Garaga version 1.1.0 pub mod groth16_verifier; pub mod groth16_verifier_constants; ================================================ FILE: src/contracts/autogenerated/groth16_example_bn254/tests/proof_calldata.txt ================================================ 0x1d02c87bce2e8363285990a 0xf5e071bca525a26d21e2400d 0x2abaae3dd6e4c662 0x0 0xde2cff83a6162de7c15674c2 0x6dd1651aadce6f72757beb89 0x24211ff0aa742a 0x0 0x58f1687976d0a46502f5224a 0x2ec5d11faf6d991a205bef28 0x2335f1564c154d7a 0x0 0x4596cc28164edf9041d97080 0xc535ed489d06cd01fcf4a8ab 0x223af0bb0912d8eb 0x0 0x9f7aeb21adbf57e1a32ee603 0xe1d1d9dc4f12f134535b75d3 0x182e8fd86a44983d 0x0 0xdc101c1278f44a9ed823c16b 0x31b0837e62ba14222b45718 0xecb11668a0dd5d5 0x0 0x5d19795b0a8f686dddcdfd6 0x8e7cb0c0f7cfd690dac08e42 0x290243624a4c1186 0x0 0xb97e8889b8c5def59ec50b16 0xdbdc802592e83e1ac61a8026 0x15de00cc8af159fb 0x0 0x1 0x309de90afb2b141156243106aa34b474 0x1e17db88c1d2e83e49f692cce4bb8169 0xd322e3e90d0c9411e80f6d7b 0xcf7e2b0d8749dd020a9795bb 0xdb75d4b2e3e5a7e 0x624aa48a4f88b1930ade3085 0x580b43ffb9c0fd3f8ab4467b 0x2950915690568408 0xd43dad48c0ef773b6dfd872b 0xe4ebcb30de85f23bd7675db6 0x6a167affdd6fec1 0x60e8c0480f6bf1b9e58001da 0x7ef8d891a8c1c1484af532ac 0x27131f19182bc8bf 0x86d0e24f26649e27538a8864 0x36fc50e90f926b63cb199c81 0x61ce94ab281591c 0x21a594bc5fb8ff76d7935d07 0x3ec31f61980ffdc24f7fd382 0x109c16b505834957 0x30347df53a95a381672ab743 0x7b5dd3106444ce733023340 0x1d4855ced06ee4fc 0xd68ffcf5d55d1ac91a0cdf56 0x559834208b3bc8b07b04fc97 0x131bd28c86fe09a4 0x34020a2e60a6c9c918eccc49 0xa4dcbb22f2c9d5dc55045236 0x16599d49ee1ffdf7 0x7ac66a2adee1f0f6b1ae7492 0xf70fd013ee785bb16fb690f3 0xd32e51abaa3c923 0xe664cb687b958b32341f20c2 0xd33f6ff2067f52a4271efb42 0x26d0db3610a879ee 0xd565a6597806becb2701f2a4 0xeacdfd975c13d03d06ee8b40 0x1887244344f3f6eb 0x7033a56a73c7555c16afeff2 0xdb6bd454807e7da0b9cd56e0 0xeeaacabf2a0d8bb 0xbacc7ba04de6c3ebd1069e85 0xd793cc41bf164b302e8a5124 0x897624cab502c3d 0x25f590a1aac31a40a9f05d4b 0x8022477becf802caef46272a 0x2504ee166554cc8d 0xf0defed31315ab0c30504ab8 0x511ae105ba1b56d13c17d1bd 0x166667737ce22446 0xc6b4fc6d21082a17b2c0c00f 0x998c2bcb46296425ee8b9c5d 0x1495219fb1548427 0xc4183e6a3e900a41891ff75e 0x13e2ada44e6d2325535a795d 0x1625756b62202b39 0xd31737d5d81a01e53445bad 0x1a2b2abf4a29b9e74a8ae823 0x5728b94d1f2dee2 0x2e7db36878f4a4596ced39d4 0xc0b789497e1d1d53b1211f4e 0x2954d95f12f32140 0xebe4e82288f629e8a2b0379d 0xcfaee310264159944f5e9e4d 0xb7223f6f43b70d3 0xbe929cc97826c088e4ff37a5 0xa1ab641364e1b2566a6589aa 0xedf01f92df04fd4 0x79567d0f1e1b4a4a84d10c95 0xd75cd83ac57d8665b60283d1 0x193404bd27e1852b 0x9b2971d76116deed73b65d93 0x3ea535b94c255e7738160cec 0xeec84d14c627cb2 0x0 0x0 0x0 0x0 0x0 0x0 0x73692b9376d090b20e5ccfca 0x7bd294b9c757d6f7aa4c6347 0x778f7e113269a6 0x0 0x0 0x0 0x0 0x0 0x0 0xc24790f6d545aed52a2fbdb8 0x184dac0e71909eb223ea52bf 0x279a0a9dbd98089c 0x22 0x440522bc1a1e3b1288549bef 0x32a9b195a82c4d288cad3d12 0x1e0d8c39b20b50df 0x2508bc0781271100a8ede014 0x606e442565cc4bd038ffb2b2 0x14464574b14c566d 0x659a334465701b820be47bcf 0x864da79a7fd703400d4d0802 0x2e095430f32146e0 0xea73fa5b211304cb38e8ce90 0x49f4070e270f929725b6b5fc 0x33e38f3d975baeb 0xa6f2a50dac9d2faa0849b461 0x1acf401eb2d661a3761e6ebf 0x1e72370439f087b3 0xa1b71ff9023b45e98f675e55 0x18a10a31b68513703f9b1e33 0x20ae1e3aa83cbda8 0xa5fddd74bbb0501ef2a68001 0xff624cf783ef4b15fb8cf152 0x2b12d479648c1bba 0xc863cf565c9895dc9a631342 0x3b74dd36b9eb2707adbf5f83 0x12b703004520b4aa 0xdc28a1fd27f9cc838a61adef 0xd6c4db1004fcb425a62d86b3 0x4ded0317473061 0x8d4f4032c544670db2fb0ea4 0x43707f744fcc4bd75c145ba5 0x946839a9845b72d 0xe070fa717213db74a0a966a1 0xd5c8ed35ab40a15a4b257a69 0x1e5ce2adae88f2c3 0x37a42b980ffd80c2bb27d79b 0x35c26036f9362404ebd6eeeb 0x9b692de1639db9b 0xcd2c27bddabeaa3c4c6ec780 0x12d3aa0ee7258bf5a1a4051c 0x1bb2c90cd8d65a5b 0x9289bf1e7360111c14bdb7a2 0x6a0349d29aea67c7e0bd29b9 0x22696e7280d10a2d 0x609e7aed44e05d925e3cdc43 0xe557ff47a8bab8551e1c4e8a 0x2043cd97dfbf63ef 0xe5456d9a8365d0aa63e47b31 0x3cba37ac0bd0dbfb1c5e88c2 0xbd1e432907f8eb2 0x20a10e5521f1ca5c3ecbbd5f 0x4c762042f3de405840d969eb 0x233cd277e258391f 0x2c6a620591382008ca9a7aac 0xe27f28045121da0db536a970 0x141e838270fd352e 0xfb3705d04e86ca68a60d58bd 0x6b3afc81d60ded127069a2ff 0x2aa4b644203b77fb 0xef0b23a683f20c2a96405dc6 0x5b457ac6d9903e2a11bc649 0x1f84688fe86b5ab6 0xd35cb942969ac21b0f5fe2b0 0x9b34af9f439d0d8c02d56fcb 0x6c02370f07a5845 0x57291d1d0f024b7ba256bd3f 0x12107849e498cb4523f8651b 0xb7be87c2753ff7c 0x5dbc5fff791c7eb9006b45d5 0x41f31884d0652c947bf93302 0x1b2010cb302b0960 0xcf3be6e441318afafcec41df 0xb5ca409611057c4c802e4fff 0x1104dd61eb0818b5 0xe81bd74a920815f9dff3965f 0x95731ab2b08ac0ef169b0a64 0x13575d76cf07fcbe 0xe69a42e6cc4d5a82bdbe0f02 0xd5c7ae5e332c1e0208dd649d 0x1c3291865a1629c3 0x4491922e35877155bcc3815c 0xcd9d34161cc3d64faa1a5fdb 0xb66fc611070f419 0x3b8f660804180abf8b2ec050 0x1a9dca3840cc79b6245e7d56 0x2fdd343b5b718468 0xa5a64cec155d425d83b93016 0x6cb03a57626c306d16869dad 0x2ddd97c88b29d6b2 0x7d6eb30b74cd8305449ba40c 0x7e00574d982cf959960c70f8 0x203e4f7ddc6d14c7 0xc4ba6a6f77820286826d45d8 0xc640b01660be8463761f5a3 0xbffb7a9f8abccf4 0x1fd532642130467cb3925753 0x77e18cd513bd7aa7f18a94cb 0x23859ea1df97fabc 0x1505ea8b7982ea6ad165c62 0x90480ef57c4efa857fa2f33a 0x97beb66f5e33ae4 0x417fedcdbefae8f6d6d7f3bf 0x797e434969a45e07fa49c2af 0x6002dfc57e4b539 0xd87bd4d350eb8f7eef80b1c 0x8fe89d8e85854d10082de706 0x2bb269db3cd85947 0x535ea162c0059cbaf7047654 0xa6a36ba44ca6d1325ee73650 0x111238427cd58038 0xa6cf68aa0dc7618ee94c8f5c 0x262d689e1b571a6bfa7e56d1 0x73cc3ed0ce0777d 0x1f2d677134612e77024cd0c7 0x6677c7681cca55b8aef246ca 0x1bb6ddfe9e3aec35 0xd9d1c8a2000f698673837e7b 0xd6f7031ba8fb1d0124c00248 0x2968188fd225355 0xc5f71a2ee96211c5eb6c1234 0x1ba440a1d8dba75c689a0381 0x20f747098f48d961 0x5230982bc908fb975322e77 0x2fee9ef4ad23438c439903d2 0xd5d480ccf62fc26 0x4b1fb3f65c61594e7dca0ec0 0x4314eca36dea9819a9d2d2f1 0x1dd30621f0ce83c5 0xf149041bde38c5c8a44e56e5 0x2ae7699bf240b85ab46cf886 0xdc70eea068cc7ac 0x1c40b2993cbfa315accdd520 0xa63a86ed016dad7c0bfe4912 0x616b11c6b50603e 0xd072c643c810777d9b828af9 0xdd3100c72c5a8a06fb028280 0x109afd4653965df5 0x35ceed418b9cc9097a229393 0x26e74010111e41e9f32c9b 0x1b72ba948be3e855 0x682463d0ddb5d9203328644f 0xa20ccc127ae5e7386d1fc1fe 0x24bdffb7582cf092 0x3245476eac1c131da68efe19 0xf4e3827c9e7b6a5389426213 0x2c66bcf9bffcf9dc 0x4c61e4a40bbf7a0317963b43 0x9ef7bbc11c36019ce8899542 0x29e04fa3619251cf 0x2f48a647a0988d460f9777bb 0x2cb72e742a0c0c50c4894d0f 0x19e3d3e77a04e593 0xcd5aff9554ee1f3c433a997a 0x8d71d3ae8e0ed72d63765cf4 0x1d176ce4a290d2b4 0x7ecbb2bbc9da4916e4105db9 0x26c2e2731e4aa14637f4c930 0x94ada1ad246251b 0xe32ea073632b82f843aea81c 0xe12fb363f586f963cd189700 0xf3c78876012545f 0xfc518b916d877c558e12410 0x1c0e8fdb35d781899966078d 0x17a71443192a1066 0x8b9e699ec5c930d4eca72deb 0xe81f5a10d8fcc54bc207f7e3 0x17dcd759270f8fb8 0x418876c2174c058d30cd73cf 0x194a6d34eddaa56f50f2dfa3 0x1904c95c9121e059 0x97d5b8aabd82a9f499f0f1c5 0x8fcef6f3fe6af5e607ea18a5 0x256256e98912bad 0xeaba348583960f43283bf96b 0x4cb0cc187ecbfb3f39bba329 0x2a8f8df1dcc64f66 0x7412b26cff0572a41c7854c9 0x74da39e12a1c4b5a4fa17803 0x26f25bedca86f833 0x1ee385c09a088d9613e34a08 0x4542f1ea807225d9ccceb6bf 0x1048e451d249a3ce 0x9306a5bfb540daebb861e0bf 0x4436461fe3b13ef3f161fe60 0x1deea1f4c4790dcc 0x304251aa61e836ca72992285 0xa438bf38adcb91f32327d55 0x2614e0b94632c5b0 0xa206626c604038f5ef44ae2b 0xed6a9b91bda1b30b6e8c8ce7 0xfcab569965fcb8f 0x1916e09fbd253cb44dc8a489 0x71b173d7e82d6f57a4b9f34c 0x2412a3076242fd43 0xe5b502dc0aa0837534af2127 0x1710855ec8170ba2e12f19b6 0x230c12a53e63ca67 0xf09c8d6c8c9420cfa8418611 0xd161c4fe491bfeb7c0f4ffae 0x67d68d7af2c9c36 0x727a5a71f0cb382fe35558da 0x677b5870329b8e5c3b7c5a11 0xa2aefd57525b136 0xae6a93e40f7afdb4053b0ac3 0x88a4e8840e996a75bd98f64e 0x23b3fd23dabcb613 0x7062802e74b54a5ce2949fcb 0x58dd5dc2ddfe6ac8793b28a6 0x2d76f138dfed5a3 0xc2d38acb453daff830bd238d 0x50e3440db49a3cd07d4906f7 0x5fa25e928b9534 0xae1b028bcfb29a80b13554e6 0xe6280ce7a415ffe23e709a95 0xf3648f209a495de 0x4c7be1d7399c52d590c3c9c1 0xd5de242b97dd1871969fad1f 0x26b7a13c66eb8ad8 0xf67fd8e0c8c2f8dbe06990c4 0xf7d19d719644d3d472f0df1b 0xfd4f92c9c6a7c64 0xd445cb3c3bf764d3e0eaa990 0xd0aa3f158a49028f75b6e22a 0x12419fd61a7bb4e6 0xfc586b5d199e8ccca97b76a4 0xed48313e2b240a1b42e3754f 0x12d71cc8963ae3a7 0x17c5e2f6ee856b61199d24a8 0x86e751845d814badc9386d23 0x200b87048d9b510c 0xc187236da1687a0996d9f0bf 0xe26b3ce0042bf04a125ccda5 0x2ee6df165034819b 0xcbaf9b2bea2d84ef4e825501 0x4773255f96acaaf8b1f53a69 0xf8ae12a27852c55 0x397b828beaf7bf95a62b9159 0x6783b4761a67bf162b1bd0c4 0x2d8c2e8ce34ed27c 0x5d3b01baf8d3bf09b3fe4cca 0xab5f406194172d9c2a6155f2 0x786614d0616032 0x9aa9ec4eb5b5829b5dedf631 0xd4ebee40f9401b57cceb70c1 0x12d215a06813ecfe 0xe8b9fb1136b192778eae8e15 0x2e2d2fb3d944539d6a8de9dd 0x343ecb31056b5d1 0x36163e29825827402e27478c 0x57bed8de173780dcd6cae7ab 0x1e8c8922e1bee2e1 0xff69f209a2403c8f8d4f342c 0x8662e05af131fe1cac09fdde 0x15b46b7caa070daa 0xbd7d786a369b984ce7b67ba7 0xe71282521b1fd048b47faaa2 0xab4cebf3847cd1e 0xb5f7660f39a33ac35ac2770e 0xd878ffefaba91b5babcb64e2 0x15b6ad55f927a182 0xde1e209f193814e6b2535d43 0x8bc614b5e62eb3f0f7d42dfb 0x273eaa8cab05200a 0xc1e9e7033e23a0272f0f06b2 0x49132492a6717031907132da 0x2690c7dbd390da94 0x61a2db12b9dc64a28e9a73f5 0xd8ce0ddd8dea91f561f7eb63 0xde48f402b2c5f70 0x67020bd7aa036afc5e2da5ea 0xbb239b8b5957f2fa9eef1b43 0x148012f50a35b058 0xcbf13fff23fc4eefce095ab8 0x4f04bedad59bbeebd1981cf9 0x2ba66c3538844ced 0x58df1b616a5b1e4531c31c37 0x3aa50ac9db056c80ee83233f 0x9d9f30a3d245866 0xa57278955814ba891ef0b8ef 0x6a366d2618691f5e2df17cf5 0x1b5fe01a44e52d33 0xffa535e09573e61f74138fa7 0x9dbae112e3b0bc2a442c6f3e 0x26dc3200e4f85be3 0x57885c662fc52cbce365018b 0x37180a180762a37c8909424f 0x11ac9dd2f5f12afc 0xa015c485d9ce47973d653e4c 0x2140353ffa39b4471490588a 0x302499f059afb120 0x87b9d0d5af5c1c297c381604 0xc213f00e79acbb866c4ab075 0x2d0b9476a152f723 0x794761ee31695c4485849288 0x212d5819ac86e8ae4cbb076f 0x1c1b78fc41b2cd2d 0x70a757023b8b19e6cdaea60c 0x9c37c30d1ccbfadb30dca0da 0x25194559a1287bd6 0xf56e2bf952ec9b66179b33bf 0x4d79617c34014ef08a74f501 0xa2a555c98417b0a 0xd0bf67c6ff7ef19f2841a614 0xc7f97d9deadcb846cbb3752 0x1a008ddd37d4f536 0x324fa8f949acd106ed9ac41d 0x2c125e7316f3dfe9ae2030a5 0x2cd293c2d3151e5e 0xe0fa402ede6e5fa88024aaec 0xfa80f0717c20a9a8b5c0b5f4 0x1e9bd704475857bb 0x88dee0355127808801b700cd 0x317ffbbabb2c0e7665f7545e 0x2dc925852639da28 0x2f3d68aba20be602f2a6655 0xe303f358ba5d0309ec7dd2ac 0x2eacc458a4706e8f 0xc049aa5d8a56048a8b687b5 0xae35a94aedcf25f311e5223b 0xe1474194025015b 0xb7064ea956c27d0f7944e4ef 0x119d11236944929bc4ee8085 0x16dbdf49518e2e06 0xef35cae046650890de3b625e 0xd8a34de30d66531fdde547be 0xa23069693df35ff 0xbe195d4f8dbaa598de64e98a 0x8ee2aab195f3aca879a0809d 0x5f30320bbf36263 0x560352bd1dfa19c729fe2891 0xb4db8980662d02dabe312001 0x84aa65e74ea3288 0x4b1896ace2acfb6f13ed82f 0x9b5c8d65cafce80dfda8f624 0xe884066c4e12bda 0x5b64ee6846ff8dc7f99d5ac3 0xb52c3f7ce1f7ed9a7f105659 0x16dc3761232c4f6f 0xd21da22d46aba5127abc31bc 0x28fd15f6a209010aada2305c 0x1376aec48d3e96f7 0x28ef3ec07d813ee5e1de7b69 0xb380929a2d0e13268db6b79d 0x210f4bb7faa07dff 0xa316b8a325d43298f1489bc8 0xa8bb8d23b93587c7a3ba93a9 0x1c2ab961f746ab08 0x183e26534da9c175837b6fdc 0xed4029bf6394ab70f1ed9d4e 0x267710910be953d5 0xefdf84c35ea984c0c7b6465 0x96844a1e60f13fb8c6b4735e 0x245e2bb241fbcaec 0xa751274f82333b1147969cfc 0xf0c7c0e58542575c4eedaef5 0x118dc380bc6d8db 0x234d7a69c8ac83f53be0c1ad 0x269a6002c8a907f39e6827ad 0x9b501a3a74fb4b 0x728e9816bc3475190bfd19e4 0x26d34f9f5433b106758f7093 0x2d7427800f2d22c6 0xe531ce6bc0cc0124970413f5 0x97ffd7a77dcbec1c8f58c0e7 0x116fa26cbf0e6990 0x978741431a8a41fe1760c7aa 0x8217206c7ab82455410a6a36 0x122164d10bf1173c 0xc9e1c0f1869b235cd4b3a28 0x74a885c511ec2cd4298d2f01 0x1272bf93c0fe3d56 0xbaef70d041416294831ce0b9 0xc51b5b7df8cfe5f6bd2092ec 0x1123b790dc7ca17a 0xbda50166d79339cafc7aac56 0x2f2409f6a91f78a9d6991448 0x80666855ae0c5f9 0x7ab8a24b281b556fbbdd66af 0xba688079db718e1ead750c70 0x2be97245e53bf466 0x935672dab5979726269f99c9 0x5dcfd87a211acf64f8785890 0x270700f13c87cc28 0x1f3943250732f95966ef6b39 0x902cf94dfff1cf3d384705e8 0x22c5dc8730365cf0 0x9cb8322d1b0214d4a48159d9 0x1e38037c890e36e0ec2ff08b 0x2e5f05be4a316a4d 0x72bb3d85a7a7a455b679b70a 0xd092ccd3d632fd3dafe2c5b8 0x18484ba133d30a4a 0xeb3c2c646438e98c22f3200e 0xb4ce740ec0b93abc87c44a31 0xc6f3cc78def4a11 0x629a8ffd114f1a186e36105d 0x98e2a538078ee2531f725e0e 0x1344e2933056b225 0x68a1c168c5ad3238d98de805 0xc0e39db5ccf1b3ef0b599e91 0x896d34f0d79e796 0x8276119909bde8718755441f 0xd12b37b51b7521b85b1d6e5d 0x2378fb7da0eaf19f 0xbd85e39333480fd188215ef0 0x2575efe3fe3d4a0af807d34a 0x1d7e561320a0a5e4 0x1a0cba0c7adf760e40da7d6c 0x9b0afa22b12d8216a62a96c6 0xbdf7f96cac0e7ce 0xbef37426361a0424812fdce3 0x18cba0140e48b4d318dab3d2 0x133968abfd78b9f9 0x51e18238f04dc2b5c5038a8f 0x1fa67241c676bc449c90b7ea 0x29ccd57a8af859e4 0x6c23c25d9f6e9565d5d173d8 0x185fc7a7ed68c742a3762983 0x6382729bf729a03 0x49827262f405ecdcf1ef4afa 0x532c19a6dfeeb29bc6da10ea 0xeec0532b43ad27a 0xb609debe6686ac176575ad32 0xc8b7ee54a29ea200fd2c6481 0x10f5ef62c2538714 0x5855bb3c74386c472b9bcb58 0x444fc7ecd6d1e071e4ef26e3 0x669d2e9554b4e09 0x101d6f187d0a9f27708e3a8a 0xbe163c1cb0ef2d2fbcdc4f5b 0x2c18a056adcdede0 0xdf4316f90737b5e5f221a551 0x5f4bb5ea081c9717b56aceed 0x438e0974be2dade 0xd678d15234880f229b0995d5 0x909e6ed8e30b9dde8e9c9d69 0xf71a82be88da00c 0xe267bfe5851dce20f1a04732 0x2917cb9e12817124885954b7 0x287f29b5df24eb43 0x3b3392642ff82b3571de29f0 0xc7bb124aa419d4df41c9a0dd 0x25f47b8b49fbb21c 0xcf812d197d5c690cc6585175 0x1b798aeba15827a1aad0004a 0x2cbd99fa3de340bf 0xcbf079bfe5b312a8c3810242 0x8ea7539d8f6bb64de028705 0xb3df0e0f79f3806 0x32b9a5c2dc59260dba7a6580 0xd47d18fbe9031150911bc698 0x73144724abd21b2 0xbbe53ce7d8f42103d455414d 0xfa4396466a41fad3e5194b09 0x735d8344b660cbc 0xeaaaa7c600ba57b3d1997532 0x7e4499bf8ab64381cf74e8a6 0x1e664e0634cf0990 0x59bb8a4a19fd7f15346f758c 0x86f9e2762213247667779b50 0x279e63172b96d8a3 0x20755894feb9a84ea257c59 0xfbcd149c4d4faaa180ef9d3b 0x49778c14e8d6480 0xab0b4bb9ddbbc2e261ee20a8 0x41431cd7b301c928dbc46042 0x1d7ed4ee7dfc4276 0xb2e1b58bad0562f2ab8125d 0xaaac258e325ed921be511c23 0x2882d4cc06c61e19 0x159211e684a02ea4dac97689 0xd2dcc2b6838772f5d7b60808 0x28f2e44b192bd48d 0x160b4ae48e3aca0da454bae7 0x9cb435047d53d4aebb4b8723 0x2d024449aa1215d7 0xebac83416e5dfe7029ef2658 0x3da21165a8f59bfd7cea395e 0x12016c1cf206fb84 0xf3f68d95b7022a6ce265a147 0x31750c6e47e0e3f6d06949e2 0x2b9fbd125de40779 0xcc128bc589f0eaea0da0c0b 0xca97d621a58e975f186df7ca 0x2ca171037dd357f7 0x922aa23cb56d11ed790788cb 0x86c30abb26cebcbfdad11085 0x2bf9bec85599dc59 0xf342bc3ceefad20e03e68bef 0x422e4904a05f462eb700ff20 0x17508acdb8e3f300 0x9205039cb20ac5cc627ab312 0x9a1dc4927a1e0603871d86ea 0x1cb52e4bf995e13b 0x200a436a7735a9e8df8b6cb5 0x64ae5fb0714f861d638827bf 0x17a7f3820b1eb23d 0xd9951395a7a446e3df669115 0x86dd76c8beb56d4eff430e36 0x1fd5ac7296cd9f87 0x7077ef2b469f9e93fc964457 0xe4c544ebae7734fb2612589e 0x22f390cc60b85614 0xf8315aa6b69d36736bc40b65 0x8d952d1b2bf1572d54c76cfb 0x1c4db89a9d358cd1 0x7c53c929bcb4dcdef2bed161 0x58f1f066b8379baf82eaeb8e 0x1088f1ec665aafac 0x7aeb7b53789ca263689d4790 0xaf6a1daf6e3a8f1bc1fea54c 0xca63a5783e7fe52 0x1012741918e0e6982be7b606 0x5d517c7b2f497a1d16048126 0x2756fc5273dea9c3 0xb339189dd8b6fb3a864e14b4 0x998f68a4a69dcbd3707ccdfa 0x4e099e468bf03bc 0xc9574529c56ee5cdc5f63aea 0xf43b6f2500b49e97155767b1 0x791b17dc08d971c 0xffe9c5941abbdd04f9683236 0xfa7ea8bf2853d64783c05cc0 0x7a9228637ec2a1d 0x2be50fa3b1e66b87d7857852 0xb8778b3773585cf04872b238 0x17847558f267fb33 0x5f71fe93670384c5afbaeafa 0xce74008ca87223888cf0416f 0x54b82d2a64404ee 0x3a6a6675c26f2a604db21f70 0xef1e8281f40cabae1cfb918b 0x9669ca4bb26fe3 0xf7cc1f584a242832df347b61 0xfa55cb6dfb10691f1e608e93 0x52a0408addfb2c9 0x9bb6240a2b7ead5fd1f04d6 0x2d20765c10071e0eb7b5206a 0x6873ed26a23d3c0 0x7f2bcfc2f7ee01107d0678d5 0xe462ea91d6576d19e288cdd3 0x13192ef302e3618d 0x86379ad37731992064278040 0x88885359607711d0a44572d3 0x2f9e7637f842edc0 0x5e761ef28617bc912db67d8f 0x39e4793d09455ddd4f040cef 0x949cccdc8f7ec73 0x6b6f64c1d41ae749b1ec3cba 0x54bafc13ebd7fa07d0f6ad00 0x15e1108a237ed36 0x50d96c1adf2576eb3a5f0839 0x42c665eaccf62c8dfad3b776 0x931478eff49ad38 0xe9a30af2bdbd33ed59e52e4c 0x95ad882b329c2f00472c19d4 0xe75ed31f1c6314b 0x1d0840caf7b3a4ea7e10a2e3 0xf0c4714805675c55e8a13f1d 0x2421553cc86c7cdf 0x31cbcad9df2e8531f4caf9d0 0x59c6bbdb54bde91ca847f60e 0x6411b23b748d074 0x925e45c21c4cc95577df2bb 0x5bb8bfc267405ead9cf5df35 0x13c461db43d0446c 0x64ce9284ffb875e942b8cb54 0x88a9dc9a784e97608bb5b3d4 0x28bdea2a2f11119a 0x6766e84fe3324394b71c2004 0x979562f375f56db8ff45c29d 0x1d091ecd65fba1f7 0xfe271cec7e722706f1e365f7 0x84a8bb84b3960af1ff02f05a 0x1e21e0b6b016227d 0x4537f85e743fbd109c68aab6 0x954cf6556515715e7543bd57 0x1a03c1466e4a2465 0x766522c9da8cae4228e4dc4a 0x9c7e262ed620a3207807b1f0 0x50775ceb9481c90 0x578a802c2239a59a647364ac 0x40f969a0870215aec73cacea 0x1a17c9a4418ec0c5 0x1eff739901b760a73b1303df 0x9b279f89e0951173f441b30a 0x7890884442be25b 0x2fde4f552f19fc948cf011e5 0x6c3b61a25e1c0ea4abdc6f97 0x1f3bbbbdfe9d8f5a 0x90fb40996152ec6027ce16a9 0x870262bf7752c7d8dccf3dd6 0x20c96c7bd744d6bc 0x9806014c8abe05f50d3965c6 0xc38bf9546aaebf9193dd16d6 0x703f027cd6932f1 0xbb7c8b6cf07a6dde6e569966 0xa201fe324c38805e0f8252d4 0x23cd36523fca7ac3 0x1513cb4610ef2ed2f24e5b7e 0x5ba1835520e675624c0a6d3f 0x2ac34497360ba6e8 0x3360547873dfcb6729397dac 0x9cf61773b1d8e14b20bd3dc0 0xb8836a525f89247 0x2132eaf683c4f59b583ffe11 0x547dab0f41c7d1ed6e934187 0x2cb6fdebb861c72 0x24bbb9b34a02389fe95c5a3c 0xd51fff1c97f136c04898a81 0x28b7f230d9a26f6a 0xd82462d91496877ae2ee9453 0xf6cc5e7f79db60915383b35b 0x2ee83d96d77e7642 0xa3e04e1fde8724675e8471c3 0x8fb10c28688301fd525da3a6 0x192a5510d0713964 0x1b83e232f3d1f79f999bb82d 0x6b5885864799a27c1d04d347 0x24bb344bd976ef12 0x23fee795245efedf76e52103 0x8ea8a9de3c0e260050188fa7 0x2c49f81cf0033c21 0x6339b4d95a09040ed40a47f8 0xdb32050ac4dafde2c37610f5 0x2dd0d085ee5585bf 0x23656ec5927345335c4d5498 0x43f39bd70e0fe9a905ac90be 0x196194430cad9b1c 0x54d547813d1692e64fa32aa1 0xf5db9cc6f09f8fc05a74aff7 0xc0e725ccab31591 0xfa8bb9f6ae2bc699dae41076 0x21d82428d72bcd260fe99853 0x171c7f7767c72442 0xf90863092e41f32ac8924b0f 0xf6ea828fb5d38d60d7fcdfb2 0x245bc927f42e66da 0x838d7b12450689ed90a4d385 0xdf840f9918a457fac637403c 0x50ed46373e724df 0xaf334368f59807b83ec3d45 0x96487d8989e51372fd0445b1 0x27d097a9d86e6c70 0x7bb9b30e152520085f4b9066 0xbb62af1842e7c36cec25dce4 0x1db3b23d3a317877 0xf1496abe25259782db09fd92 0xc70d0fdefe38066e055e7475 0x190f855ae4b11188 0x78452ee19a0f89aac4b0b5e1 0xdcb1963c04a1dbc1d131cb57 0x1f0b6c626612c75a 0x24dbe2a2be554a507fad8788 0x51e76c1b82c886c9feb76e2d 0x2b38f4be8e40c911 0xf37da43c52017f5a948af552 0xed73167b85b70a0b13dd2bdb 0x14b04d67904e9cb2 0xaf30e5b8f43155f98943512a 0x42e564865c43542b4e21f32e 0x1e86267e74f71b52 0xf2b26a0ae604888c911a7c82 0xbf6ddb0449463c23d05543fd 0x15f25d77bd0026fc 0xaa2802ef5339e0bc3ce85137 0x9a653d3f1b0f49976f035076 0x13008f85dffdf449 0x75abd0b44bb9a79ae3bf7bbd 0x66d889396fcc2795581db9a1 0x6534579ef2c8ff3 0x366451044ec3fefeaa38d2dd 0xe60ac4810ae5642691485709 0x2c44ae65f7963744 0xd4ccc7edbef49b2ff8f2b052 0x8854497455c2babd21e8bcce 0x93e29610071885a 0x5a33d6714dac1d24bfa6e17b 0x68d07739ae74683d050923aa 0x2fb9443a96182d3f 0x851de87f1b5844a10255c827 0xb22b64cae3f0926de260aae0 0x102382e8a5a977e8 0xbf88a070e8d90574cae48a9d 0xb2d533030cb523db0e361eb9 0x1dada476d8b759eb 0x607d036aa2ae1cd9601bc5ef 0x960a1387592f14df4241e48e 0x26ac8677f3e91f42 0x96ab874c0b07a2471977195 0x98b23dee70810bacc377ea92 0x1800c1d674d896c 0x895e170bc52dfc39359786d7 0x16a65a9df35d2736a7249bf8 0x15c6203eae1582a9 0xf0beb2c60f2e9ecd1f608669 0xf2daa90887145191435be19d 0x2fa22b80b182097 0xfe9cccb6cc0cab8a685658 0xe0197536ab6d37bbc95f95bb 0x17d1457d37d09019 0xbac3b1855f18c8c9d6176e42 0x6d6d0c0ca6bbe91021ad4a5f 0x151d9b55ca06a018 0xc8028ca90dc6d44548e692c2 0x1f3ef320f694a033cdf4ba04 0x9ca6477a6b3615d 0xd44634220fb340339ff76195 0x888b9e3caad2239da50b62e7 0x165b32d560801880 0x94786c6663806d6bd470ef08 0xe6715c760f27f63890086d60 0x13b1f0b5bbbc2695 0x36089891601e971caa9291d2 0xd07a3a3c756d4d152ccedf02 0x12bb4d70489fa750 0x4bc842f110d68fce57a87036 0x43d173df7835bee8e780c8ea 0x25f3885a945804f1 0xb690d4fccd1e5e6b57fc6bb 0xf906bbf928bb303b6b7ce240 0x2c8a65f9260ea573 0x31d5a528dfcf2e387359e232 0xd7042af82daeabc479fcb34d 0x2f6bd2c48e17983c 0x4ba64bff31f1f1f724b02f87 0xaa3bee2fc9068e2ce8973ecc 0x2ad746156e3ab32a 0xc04e970a6ec0d83c3c8684a4 0x48decff9116aa839195c4960 0x61d5210d0c43bec 0x2090691532aa224180c24193 0xabd57c77111242e259aa467c 0x112ff8861bc32e6b 0xd86b9b7935b1902aadb94bed 0xf7167b6ef35be7248b74bf5d 0x250a3f5fe7e8abcb 0x21ce0f0a0ef15c93dd945024 0x429a317122d86c35086d5ba2 0xcac285104257575 0x29abda814c542efb33e7f21e 0xd4fcdcbea65fffdf2de52b24 0x177370dfe380bee2 0x9db91abd7260568cb5636f87 0x4419055d5e2335afe80b9b9d 0x1c1564fc13434dc1 0x975ac8fb51863e776dc8fb37 0x35b8f96674ab27ea062389c0 0x22fa586be94fcbeb 0xd72a80512024fb8b39704715 0x8b62778123c43f3b6b67c55c 0x1a93a57c06ce1ef 0xc05885918d82333538298245 0x13838a655da3a3be2ae059b0 0x13bf91bd3a8fe0ef 0xf0a5ea4e638d61b7e852e055 0xbafe1327985edb482bd9d299 0x18f9f50ba7c08d6d 0xc5a692d8d14c2bcae5eac2f7 0xbd2400b99d005faa553fd8f8 0x96ace6e0f36bf7c 0x602635bd4b43f875d6c76a8d 0x79dd6fae463fbefdbcf0c659 0x19867b5465222c8e 0x1b9cdcd7675c61a0f7bab777 0xece0e02e990d3c12733cdc68 0x28d7f28f62d41559 0xb9bcb75197b6342dc3d0433 0xce0bc120737f50bd3411d1b7 0x2795d19265b66b9e 0xd46646cc8249ac528fbfbf80 0xf4504658b00c3a267480c0ac 0x2ac6559937385798 0x8975f0ef3afba6e926403d32 0x3153e7d7bac421549048f57a 0x29119d1f731a5a25 0xc89b67109f2cdd97a296445d 0x9fda04f67937fcaa95aef84c 0x2a3fad7f57a5fd29 0xaa7faebbaa4f2366aab02a30 0xb9ad53d83b401c924641e123 0x252beac3d70334d3 0xce04fcac97530071311b8388 0x40139d50cd1089b2e7909aa 0x29ca81d9ccac2357 0x112a55d3ac4c9f961375fbe9 0x1bcd77b487f5515bd5da0e76 0x11bd4e71b19d3a7a 0x4ba764746400bf87c201c236 0x798e53c7918fc94eb7cc505 0x2a838c0c6870d933 0x64c9a2cc7362f5e640ace998 0xabf11d3ee073e19378890009 0x2f067edc50bc73c6 0xf64966bedb62bb21b9f0d985 0x1a9a0645a77bb29de1c1437f 0xe05b9dedaf46d55 0x6225a5fcb50b775b87afc8e4 0xf8583e57a3a6b98a9168796d 0x2322e22680a88eb7 0xeb5a8477f28b3fd8196d7d24 0x340bad806444783a456aa3c2 0xb76ad3cd5306360 0xef42eb3e58ca6367041096bb 0xd61185739fc352713e63f3f5 0x726f8ad623964c4 0x9ec7f8debf6c8914feb8b6df 0x7c9192762188ce828be396ce 0x18dd811ec585d893 0x4211d0ae932ee4981b8894b9 0xa9933c877382306006fe2d83 0x5d32b77a23ae23f 0x4206fbe310c7de903381f188 0x4973a69b9cd0581289d749dc 0xa04233e0f52764f 0xcc23f091f22f115ec0d9b304 0xbdef061a8ee1b4dc93d2d948 0x12f55933d9e3098f 0x61efe3ff2a13a5bb3f72a718 0xfb0a8e7163d088d2fee1fa78 0x2192780234bd25da 0xe96a1b26437e616a2dcccdaf 0x8eac69e23db802f12229d8b 0x27d7fe108111b008 0xbc029b0ea95587d22ad84a34 0xebe7f7a6b65210b1d2bf4340 0xfcb9a03e794ee48 0x93f814838fe79fd432ff4445 0xa1cc475846ebb53c852f3e09 0x2cacf1ae2956efc 0x86e9968b56a4f278f74ac03a 0x35cd9897f57ddcfb9775ce70 0xa55f581f30b79f3 0x14abaf12dc6de5f7c2e6448e 0xdad8faf2d5fd157985d6cc9b 0x25cbdbc1451ee7b0 0x41ed4bd4b80ee405516b5154 0x95014fcd7d7276a7d465c9fd 0x1e077e83af9d8dd2 0xcd33cee2e3f2294a42251de5 0x5a0f811eb6475677d9b8dc8f 0x11931a26c3adf024 0x65451bb9bfe27ae1577c5a5c 0xb5d4edaae2fc2a5ad06d182f 0x5fce3eedd114309 0x57b6fa12720587db241afbfc 0x23406211253d185e3985dc4b 0xb6e77a887fd24fc 0xfc8a54200f21a32cef970b87 0x19a3094f1e2fc7fec79fccb6 0x238cb61f783ecb61 0xa81f581427325e988f81224b 0xf4894e6fa60113960e8ccc94 0x1f16feaca2fed2dc 0x73bca21876095ac104e8a377 0xca0dc2e34a5eddc8afe975b5 0x299839cb99a5dacc 0x73ae462e7cbf8707e781a655 0x167eff10270173243a138225 0x68a028524c6e428 0xa663204091d1a6eb6dd2e679 0x5a57415abcff09b913e147ea 0x1c846b9311904b01 0x62674b95f1a32d153340fea 0xbc395c90495e4cb430b7e061 0xc1696af1c44882c 0xc931551769ce94fd3ccd8f50 0x60bfc6517fb1f01ffbfe0d05 0x21db7e7b3a293c8d 0xbe15f944f1afb3d7c953a8ce 0x6c866b82fcf2096aa2648b98 0x19ad5fbc48be98b2 0xb901a63c9f5e392785e9d96f 0x8ddeec7abd2bc6027e3281a9 0x23a0c13287999cc2 0x7888967129666526ef667d67 0x34ed8dbda44d5bafc75d45e 0x293938db3fe7d687 0x15b621e9a9d16e6f052d5434 0xaa46eab60c096cadb775b5a0 0x161269940736a2af 0x1d9ba65799df310afee06eb5 0x1077f66eeb23432c8a716c5a 0x242351c41f76388a 0x491c40e781c3caf8296d3339 0x3f269d150e6ef1826192966 0x1c0f166104a61eba 0x5ed0266514c2e15ffb30348b 0x3746b660729b2b40389e7e03 0x1dba2d2248cf3575 0x1acdd352171558aa91e5f1e3 0x684e72a8cc18badd6efb9bf8 0x1f642808f5d5ce3c 0x3d66f77617c43bcdc569a2a0 0x11692b34237f7b7461864c52 0x2bc671517c14192a 0xba3a8e68955a83d41017b59f 0xb82697d4e5ca40827c3b73c5 0x277347432f3fc38d 0xed1a6f36d8f347fe6153f5bc 0x2b65dc1ba775e72313e5b06 0x2aed215c14c10dcc 0x6bfbeb8328cabb024c0f7f61 0x361742c20dfd003b71a273a3 0x9412a2610c78f05 0x1c6d2e519b340d1a5f3540f3 0xf2691b5fe625069ecf6e451d 0x15a11e2f83d32642 0x3fb2f3ee40ecfb50e98d83a0 0xfd49740a3b4c6365bc24759c 0x5b61c89abcfd373 0xa9fe1fdeb54c4f7313ccc3f3 0xbe45f55b9f178337ea5ec03e 0xad09494843b615c 0x633058ceaa0b0a7f1051794c 0xf845c6c5eb9a1d88f842d594 0xc0d64fd5ec8c2f3 0xe1e4e905be7fb68ae8c629e5 0xa619aaf616d20cafb1a3881f 0x4d9916617e3cb90 0xe654f13ce8048e2a3bdf3eef 0x179b0634b155e6f003976388 0x22ad55570aba9121 0xdb97da9fb0fec66524c685e7 0x53725607dce3588f2abeaf14 0x64d909d9ad6bdf2 0x73ab85fcaad3ef44f532ccda 0x4b90226836d675bfc4f2d0a7 0x1727bb934fe8da5b 0x31ec7da68ab1ed8ab8b34424 0x5234e119f85c41e541727f5 0x2e9da7c6fc202b6 0x91e0458f74cba9a37e37481b 0xe69640e13ba7a8cdb6caa2db 0x2e6980bc7a3f259 0x7a27acd0de0252176c56399e 0x979885c822d8e1d893e9c449 0xbc7ab6a98665e14 0xa86f363c185de562ad693cc1 0xf035987061249077e2399205 0x275d9bf005f4af68 0x450f0263a8822cc1691be0cd 0x982c7868542a6811212a064c 0x24b20baca2b94af9 0x89f58f0d67ebe09356bc3538 0xe6f56ef67c0aad26c55b5d5e 0x80ebfdea0b545e2 0x4e488551f230999a85fb5f48 0x955080abd0d00a1b90c4b7a5 0x1d34bba4ffe3d613 0x7bb641027aba54ef467d239b 0xaaab2cf9e5fa8b5d938810b8 0x2386d834845c895e 0x22e8e674c938749bfcce27c4 0xfda0dcaa7f1ef39f54bed5d3 0x3373561f6a4dc9 0x926cd60ba9f99634a664c698 0x1a1955628805895570c6dcfe 0x2b7f1d28b11a3c03 0xbc2aba2a019a5bfa9bf789d9 0x6947a52939af1bf51471ccc0 0xc6d9518205dd2fc 0xe3f955444605c5346aa6893d 0x81fd45a8786952732e667b58 0x2ce74d7c5d01fd93 0x40c9ad3013f1ec536d35df8c 0xcc10771f476053649f7e9f97 0x67e97f20c8516f0 0x4ab0b061f9595bf4873df15e 0xaf5f9f7e5d793e42e91a53c3 0x17feda11d6c78b44 0x88a6c15810aee906d13fb3f 0xe0874cbe73539925b241208 0x1d0cb81a63138dae 0x55f84840a317f7f5a8e573ff 0x4e0f372813c1e1612c3e4e64 0x55674da474d541b 0xf1fadd869565ba003e0e58ad 0xba638e5006fdca66354ab836 0x100a842166cd8aae 0x82b3351b9dbea0a8d6739512 0x933954ab4a1d4fe70fc104bc 0x14b971711fe23e06 0xabe4ffc995fdbab086200521 0x4b2009627ecb172282dd71e5 0x16e4a906a534cb76 0x66e355b8c62284dbbec1f52e 0xaed11882deeb9dbf224698c4 0x19b7784461ed272b 0xecca634e54dd3a53d4f59996 0xc1e8be8544413c8b5421065a 0x28aec7791fbe59ad 0x621c53687022549aa505b940 0xe17c68938768911694c3d63a 0x257742dbc869d425 0x61666e32dab56b9da4b19f6d 0x4243d41e83eaf3c2deffac38 0x146db93f6868f1f5 0xeadbd83656f8e668c1d65cb4 0x2b91f0f9bc2ee9f5fa1d2448 0x5daf588c2494464 0xbc7ef553f45989c39d6e3b16 0x7a75c1d554c6acd4f1bccd3b 0xb880aab3cc2fb1f 0x50e464606a56fcbd2289a8ef 0x13fd418449669b9e3c3c0d72 0xce1f7fb42c7fb63 0x4cb7bfb5038d041bd8980a7d 0x7cfc9b7b2530b450da3418c3 0xe651db655b45283 0xf514ac890a3329cef1ba065a 0xd3de59d89b87d3b1394fa3d 0x227b0c1d9338839d 0x9224995e88673d066e44c213 0xb3ef21e4072c49713eefd704 0x2947e014d79ec2a2 0x1d4548cd0149edae2ee487c9 0xb4672cda8afe3d8adcc17db 0x1b8e0cb251b137cf 0x2d58f09ad61776a87463e614 0x4764267a49866ad5c22c6691 0x1256adb707ce2c09 0x37a0c1e3bfc9927de0b6c16e 0xd4f5fca18410bdd1b2aa1881 0x56111f201e5cf1a 0x5ff6d9062da9e5c5a406651c 0x8cb9f2ff75609485d922a7a9 0x43d722efbe7f2cb 0xc88dae58dd80d1a8984d51bc 0xd5c8c4f92ae9e33ab155eb99 0x17325270fe81d83d 0x12c2accba9bc5c4f57b84fa9 0x477e815f8affd1ef93ff97f8 0x29427c717ae09379 0x8c958abff66decd8ecf03e77 0x811e39d7b35a2e56ec1215a5 0x29ed8e79efab67e6 0xf56fbee465a6cf7d12c75f4d 0x30307caadc17539b16ff2f6d 0x27ff92408b9d5f46 0x4e525d9d657236b5b0bc98ef 0xe068264e6fb199289fd29db5 0x8be2346fe4a7a53 0x9a2d2e8aea60020c0cfedf44 0xa5d9c3990ca9c435fea62a11 0x1bae9408bfae1e55 0x299d3b953594433d44d5f268 0x1cbbe49af6b646502ea51513 0x1e62e55fccb8dc94 0x39a5f56a5cada6ea7fc522b2 0x4b24bfa104df6ff174b8147f 0x120937ad059e940b 0xe3601dd6007b1a9bfd78c0d7 0x86c053a1c205818fe7e83d97 0x22e81193dc66d18d 0x5ee12b425f479a716f2f4185 0x26962c694cb8576b5774f5ec 0x19dfd6b64a954d41 0x401a5cb506b4a0b2cce2eaa9 0xcd44045f5c6ab29228dc388d 0x133e0e72bc543816 0x7aab214fb79fb800426cc763 0x2ef3cbe558355bcf048d8724 0x16188a8e21442bbc 0x370318030fb4ce80e91622d4 0x12bea30eaea4ae510354249 0x2984bbdc74b60cf 0xf35123212685fb2821547ce0 0xf6b8ace5c80883c044441233 0xdf3ec25a24c68d8 0xbccbc9877386339b48eb147a 0x1c619f619086b0ef498b602a 0x2fdd57d25369c354 0xa961d65c81ebec3c9aa5bc2f 0x76bad85edbc0a27efd895725 0x1be89c35fda478a1 0xa9477cb6e4bdb95c7e79d49b 0x9cd8219a91d5983f313e8a11 0x22db7d37eafb892e 0xcb662ba073a1f5af1ca25ff3 0xfde948cde86458af5a1424be 0x248413c17a3e60bf 0x32bae23461f43f62cb42866c 0x468563c70245b976196808d8 0x683bc8bb29eb142 0x91c2138e678e81df249a3ccd 0x7026d5eb515f8210bd0884b4 0x2ccb18a0b1076586 0xc0483d9e3eb27e01506632d6 0x18a4c6acef3e0a4da606a57c 0x275f8e7bb566c1e7 0xfc88376b8cab89c1610310a3 0x5cc6c9be7b7e6323d26b5790 0x1bd52363dd0479d1 0x3f9448a159f67398b0d55f53 0x457427bb89c82a9a20c04e06 0x1a9c169cb83241d2 0x7237d0ae6dbe53f007fe7667 0xafca3e065e0069dc2a5c6af4 0x13aecc2342463707 0x6bec486f58144ebba0ae5c4 0xb34e40538b683112501c1fad 0x2f67ff110093ef9c 0xfb9fee3a247bbaa2cc4d3cba 0xd10904c0479af62f2546b752 0x6807249b8b95c02 0xa89d3921c21b287c1209edd4 0x554281b1d939f123580908dd 0xbcb90d39c36d4f6 0xc4b6f5b3b1a4a69ccaa13563 0xecc4478c7d2be485d68e1ad6 0x275b458498f55b43 0x97fa6c35ee3b79355c6c0def 0xe7ea843021e42e3416a6ef42 0x290a373af2fb4e6e 0xcbf5283f868738abfe43e887 0x4bd932f95c3f8b19b4f27f0c 0x9d7d3c2d651d4e0 0xda5077a0f629f9baddf4d17f 0x4f167e9da39b497d2ff9b6ef 0x1e7f1702bc157cb4 0xc059896abc0aae6c31cea6cd 0xc98fc3702628bca5ab8c13d5 0x18f2977dc1dec59a 0xd32a6250a810e41f9a71677c 0xae81a3006559141317675853 0x18ecf10972acd945 0x39a55e4c8c9303e780cba050 0x954ad20069c071440ac0ba8c 0x9be3238945f1633 0x13d1adc6a5c9dc52dd69f6db 0xc7b2315f550c1e794eafee63 0x29a6acbcc33d4f52 0x25a4339f23e4000dc0577e29 0x3bb14e3a98308fe4a47d41ea 0x1cf3ec73b6fe7619 0x5a42c32b80f3ca8b70af1cd6 0xf3ac1dfc5bde42b7ed26bff2 0x6683108d035d2e1 0x89844cc9b46bf8b4d62b5dc 0x7b932de490de6ab341395005 0x2ec9ef4b4ffbffef 0x345ca0b87bd125e88e9c618c 0x15117ae6ea8ce73f60fc9216 0x229189b159e5d4a8 0xd55e541dd53a1231f8e0edf7 0x2bb147400d8d992893c852bd 0x2efd93992c44b11 0xa8375c85a0425715d87688be 0xb49a712dee03204ad6a61a6 0x2f1ac072ba1f1e01 0x985163f60f72880e049f8621 0x554f91e7d5067cb934a09ac8 0x28b25e1739cb6fbb 0x86cccc75c49468b01cf60d61 0xea1460547c4f53fdc5ab23bb 0x20e67dbfaa280728 0xce07f840f68f946a358bc573 0xb62f21892fb302e6f8723a36 0x267a49e06ab7384c 0x631c3d4d0e8acbae8f0d6001 0xbe644fc50b8fa50b85181654 0x27387e253aa7ecfd 0x7e045d1417f0d40be078dab 0x2bb2947d3b7adde5be1be0ad 0x1f4c754fc2d8d8ea 0xd7410bef620d7a76bc9127ea 0x2960fe243cfddf3a82e89d4 0x20e0958841639cb8 0xae24177417d3d4610ba6c1e4 0x8cfcafe11338cee6e1dfbbb1 0x1682b57c733cfa28 0x6623ac592fb15172113f2141 0xf27dc3de396363c17187027b 0x232550073b74d5a2 0xd84e1d53565fec0480df1f47 0xcbc00d06e9c3c77967dfafef 0x3828c939f4a5fe4 0x749ff0e4e45f5e86f32d7e2f 0x7f174acc69153c94a6b3cb1 0x27b7c54fa92cc525 0x7328290297b37694d24804f9 0x8a436f5b95389ceb1a5d1904 0x218919ed8c2d3485 0x523efb5c1b843881a3e1772f 0x192d7c5c59744ccd972a6bb2 0x2d310a041792c00a 0x8f9d98a37eb0e38f36906e73 0x6530ab63ea7c019e63d3f1bd 0x2e7763aded1aece0 0x2704c3b48ed0fa5b2117ae57 0x6bb7682af115d78d57a00183 0x18729f0ef03cf1dc 0x7dcf82b84a3f34a4f38196c6 0x83b15916fc0db05727903f21 0x1f14bacefb80c541 0xd5cb6d230d35efef66d65619 0x9482abe830db825d1c976dfb 0x2353317fb8f93070 0x5779608a34b0cede44ef2ebd 0x3641bac09f8586bab1bac6fc 0x12c298941921be78 0x1c3918710de4436b2a56f1db 0x96bc395c03dcc2095e0815e 0x794387b00bde757 0x8419f2a081c22aaf9d4b3e1d 0x94e080af3db09348164bcb0f 0x1c480421ca5321c9 0x5c76fe7bfac845fe1aaeecf 0x4a3ea047cd6e4a509c28f73a 0x1c7c72bc968b2548 0xa952f818000936a526e912f0 0x7880f53eaee1a53bd98fb6d 0x1b1197584ab2376e 0x5728613d387eaf70db562c7e 0xdfc826397232832a99b8356a 0xa2687cee2587485 0x646467fc172c6c3e891153c9 0xd1c63f16e710e21700860940 0x24d5cdedaefffd1d 0x275042a29a77c4f814e8657c 0xbff50094c20a961a022f1b72 0x4ea2f43716b2416 0xf031ddb69b888f0fc41acde3 0x290d06ff46a36bfb952bcc9d 0x1ce7274d15fef3c5 0xbe 0xbbe146965c55e502aaa997e8 0xff87f79ee6d4c0fd4b7f001c 0x1166407408829a35 0xf43b1cec82368f8a043ec4d3 0x3865ab506c096f84a77a4142 0x19c4aeede8e09283 0xb61173f5464e5199da240353 0xaa0b017dda482d1349eb452f 0xf505d5b9fd015df 0x588c35fc88075179063a952a 0x49639ed2520aff23e154540 0x2f9f438653ce06d0 0x2116f5b239b0ce8efbe9c81d 0xe7907f7a66ae653f924707c9 0x2cdd3528ec0a53a2 0x6a5e66ee20b9d4641bb21bbb 0x594af5f66c3ecdb01b72c7c8 0x992849fcb34b4f5 0x31dc8369b91598b70313db24 0xadfc068ef15c619e4baea85d 0x15f81a28773e1b00 0x9a87f812863790d4ccb3c892 0x77570d1c8f2ea617601c43f2 0x1c9d4dc5b0fedc1e 0x1d01db87ec9f55ef339f2263 0xea9d23880d6a8b35ae61549 0x29492534db68ac68 0x679ec556c4510857f8fce004 0x26981770e42c50ac5e0e7719 0x1af50aa410b9e30e 0x347387aac4016e10dbecb363 0x314e5b7491130b573eead11d 0x740b5e65135a733 0x4e550196332efec1c58185bd 0x700b0d2cc0d82a33bb52c591 0x2473df02b91931e8 0xfe6c5883d63cddcf2f46f817 0xd1d866fd72c7d4e4ebfc06d0 0x29ab364882d910b3 0xe6738634b15979960cc376be 0xb885e217f76ac4d09557f639 0x152b5d3f1682d27a 0x6c8ac0ff7ff2b06eab1a8b69 0xd66c06fa65abb67d90315c79 0x2595741f100263c 0xda038888d4292085f9e675f5 0x363ff771b50456aa3310cbdc 0x1d958aa0d2d83eab 0xd74c84ed1127c70f7ced2116 0x9e161a4a920dcff13fe87b57 0x3aac298f131a833 0x4ea779c12d6afbc52de31551 0x8be3ba67d23fede04b4e4098 0x1e50fd00ec5b1bb0 0x1e3af0267720a6852982656d 0x72dfffba6a8a4cf390f03e4e 0x29cfe1dd18524601 0x3fd04bdf8d741033832b30ff 0x1a1a48f915cbb97208354b38 0x6b97613cdd1eb05 0x1db824adb60f7f4ead89cf2d 0xf7c3411f8d79c537c1a573e1 0xdf81de13c7d3def 0x348dba3d97e5c689b06ea627 0xfaee615aacab3516dde7d63a 0x235ffa10e4028870 0x4d865e5d91fb805ec5fa1921 0x316246b4b9b6bac7618adaa2 0xe0604eece22fc25 0x7495bcf7ee055e47217bb04e 0xf1696d150326ddc6fb8f0e95 0x138283aa97177f1 0x321d5e8d83b8508e0e514acb 0xa0b980aeb4b2857deccd147a 0x1c8015f786db06d6 0x4670fbe9a21f43bbcccf0c2c 0xb2ab91dd3871465e0698e3ba 0x2957de85e0ead31f 0x264743e317916b0d9f214e2f 0x9e6e3a9a0493b276710ca5ad 0x2a5eb190947b72d0 0xa123e314e26c153a7be56ca6 0xc3014e68e1beec28d8d4ad64 0xcc0c3358b80ac6 0xa7b73ee05b92dbb28b350998 0x737c9c6a5c13f6c836cd78b4 0xe2e427608167ee5 0x34d4a44bdbf6649dd7c38e78 0x9cde739690234079c22eddd7 0x237c260c852ece36 0x7e3704855fa5d033b36ddd45 0x7dd90185d023fe272da96d0a 0x230b5f15216d4566 0xd29945cb37fb54494765bd4b 0xe3f1ab5fdddeaad19b1ae701 0x16365bac24eca5af 0x6bb2f16d2dfd691883db5380 0x7cab420eb1718001d9b3dc7f 0x1938c1c5722cfc8c 0x8df356213a92d7514bae40a3 0x949ca312740803869bc3624e 0xe11b0f1c905e30e 0x959b288d3e0878c3ced90d66 0xdb90bbc730721a467a7c0459 0x1a24a02548c0496b 0xf1934ae8adbd4ce8e7f54a45 0xed26fbe905561b2d4dd97dfc 0xc270dca1fbe6006 0x4d6bb8315ec1ce7ff748be3c 0x76b4dd8e0284c25d000e019d 0x2607709ee21caf4b 0x79699eec368e995a7a5b06b 0xbf971371fdbebfc4a52d1621 0x1f02335aef1e79e9 0x5ec279a1a70f8bae2f8ebd8c 0x959da6be6b8aba166c13251f 0x1045b8f4c92ef9ad 0x18f9b93d247d43192898d75f 0x1bac718cd895a0a6d9263073 0x14897f19d91eda8c 0x47f808d8a08bfc9db28094c0 0xedff8031381da8bbd399b011 0x200b2bbf94e9e7fc 0x2e65e02e18eb350679bb4ce3 0xe884da2a05dd0a4b7470e57a 0xd31977f8a1cd248 0xe33547508d917f492c9a187e 0x9384dd6f1c9e475dd2d9c04e 0x24c74a4b811ffef5 0x93c9f13fb68b97f6d881e6f1 0x8d750ca5c249910e9b6bc0d2 0x456c1ad34aa6c93 0xc117836bd45a32e815388964 0x9edd87e7296a19e7a87b4717 0x7fdb5bf5b7c65e7 0x84cc52eba5c64c14829252a2 0xda9189de63252a325511fd2e 0x26150991da578ee9 0x11892c5df020b131d211b722 0x59274e26bc4e6545b7378048 0x192d897ad4b1bf41 0x8dd197f52675c90fca7005ec 0x530c48f0a4a0a6d0f3c7553d 0x24fd5f5fdf8c8f93 0x9ee364066c71ba04e57eb73e 0xdfb4bc25ab83e74cb05a643f 0x2944882e30f9915a 0x7f79944d468a15f3b65aad28 0xd314b23ab3af1f2d0a8ee84d 0x204f935f0ccaa92a 0x1738f8e9d61034665e692d6e 0x240db7b44661865301f014e9 0x1a30916ba1a5bc03 0xe8f2bff5fc035d2c75f468f4 0xbff5a85d99ba514aad99bea9 0x1bbdcd500238f342 0x4208ff789bacd9808f8c5726 0x7851b21a6e7c3dc6150106fe 0x29630c1656a800fb 0x93e1378567c2cae1f77ddfe7 0x6b1025c2aeb5d09df5eadd42 0x1f52412be05ed2c3 0xc5689ca54448f9b2ecdf85fd 0x10b168c5f930e448765f58cf 0x1edb09106814b064 0xe3de4505e6324a86b85a9f7 0x5a4689ebfcdcc0b9384a7a01 0xc5948d2fb2b0b7e 0x223488bb34d4b9541f169bf4 0x25c420248ed5f8ab94bc6ab0 0x173ae2684d0a7ae4 0x9ceef123bc306ba6074e1690 0xaeb2c92df05d8255aeedbb4f 0x1173b1c4d2f184c9 0xe392875f88f5271f2de64164 0xd8a72a6fabca856d8dd2da3b 0x235cbcabeaee9ee4 0x8727b2cf74aaebd44774ba1e 0x2e20692cb618b16c77a11a59 0x18c39ecf41ada049 0xc7daca6c015278a5cf3cafc1 0x9c6881d072ab6195aeb6ccf1 0xafcd1072491cf4 0xafdd676e36f6514ec0bb8bf2 0x86dbb57402a7f850e95ceb06 0x1b204cbbf7d10188 0xc4e40f42960ab3764a045261 0xf42fac7e5098f8b271daa6e 0x2d3d4236d05b9a9e 0x3636c0092f511bd1cb53872d 0x2d8894bd9aa9ed086a2329f7 0x12e9cb1a89c557a4 0x43d2acdf2cdad891865dcd62 0x80c3b07dbe5a1eb4810135f5 0x2bda64313e866545 0x49cdd704a7b6439eff6ec873 0x73f2f0319199acb1240f1b1d 0x20322e072f0bed3 0xef11b8efa35f2820af616650 0x522b5cde4d4f2478d24e86f9 0x14f9eca4acb7bbac 0x873f05a36a4cc4b42020f5fd 0xa969c0dc21a926f28ca09093 0x151476ad8c1119be 0x8a3f27952e15b4c438689d95 0xf4691ae8cf7024ee4ca414b4 0x4eba4a1c6323527 0x534ac8ede1e164427ef6cb73 0xa9dcaf8d6478b37768da0b43 0x24ecbb2a3f176a8f 0x7f7d3e65f4054d3443c0703e 0xcf1aa1a4f962f25039d11460 0x1688439d3880a0c2 0x8a5f2ad96f368120e780abe3 0xe4f3bc36627d065d95c05c04 0x2e556cba84f5276d 0x6c5686010e05fd16c536ac8c 0xa895ea32b5ab75287ff15b97 0x2d978da9c8d632b9 0xa022d84e74effe37978c5012 0x724ea88c0299c8d3d0976e2f 0x187542cbc029bf0b 0x1009600c1096389e305d2452 0x3147b6b037f8e492db2e2416 0x2a3bd0c5fbf44c42 0x4ba873f09b37ee12f5ca3ba8 0xbf070d3eb4a390d8009e0c13 0x20aa673f504be6c4 0x723db44d02e767ef681c6a67 0x66541b6da7d075be842a4d50 0xc1d21d4402c8003 0xdf932597004c6f0592744453 0x8a5a784f27de88cb609bed82 0x2cc4b77a72444337 0x490fe38552a62ea822519fa3 0x83d6dd6d7dde06b5941191b7 0x4df05ca29bb2999 0xa1d10ad62c8cedb00ccc53e2 0x796b0fe6009cd15f8843b3e0 0xa586dcd274a9569 0xbb39fac8bad00fc42f2b7c08 0xc1793ac0bdf41e8410f8d6bd 0x13fd5ac5c6262a76 0xef95c1a985e2012c84d224d1 0x5f3d26fd3d49d4a05d4b8ce6 0xad4bbed26c6e199 0xa5c80ad0fd77cbd9538c402b 0xddab2b433695bddf66be89f4 0x2582fa49f3cacdf0 0xcf185fed816812a9d276f889 0x5a5f33765432106ad405c41d 0x2f1d950d77b7eb0d 0xc4c45466828b2dc44ec30c26 0xea173879b2618ff4528c08b6 0x2f24c8563a767372 0xf09d1c525d887f14c337520d 0xdb7e7e7153830b1c10248aa7 0x8c44adeb626fafe 0x701f1e612f5d8e3aa1346e1b 0x662fad460ff79c710042c157 0x93201ff6c8b7089 0x218584acc84d1451b3d45076 0xf1cb31190c186a18d94a143d 0x244a2a1632ff7625 0x93658231414a8b6bbe3522f3 0x8ea0d394ee28fd97dbd52aed 0x10163d6f5482a0a1 0x9a23e209225b1308ab172d0e 0x9754ab272a0eee4316185457 0xcd58a6fc06859b8 0x4b122d906200d38ceba74735 0x2e742fb7bd5dcc0f5080f881 0x2bdf8358e78e2ad0 0xdc6f5c514e2d464e406f5a96 0xe0a25bab777c66d8e83ee427 0x77f8369a44c7849 0x9f904335ce7c8deacbcfbbc2 0xaf5d489f35fafc8fe83923b8 0x1874c1c3eb95e0ec 0xd446070ce2c2ce986503f3b0 0x319f45efcf510074eb0dc706 0x2183dd40091af3a7 0x289cd310b773ffcb75afe560 0x2122fbf2d2ee667cb98a8f4e 0x6c5deb35c9e397f 0xc7b329976b5f66e0e81c85e0 0x246b3371dd9b7840832787be 0x12742ff838aac808 0x19fa7a3a42ebc6fda59d63d1 0x170055534a3510e2257343e8 0x771fe163bf3803c 0xb8dd9dac8392a08f0c1aa106 0x7c0adad338f9d8a6e45d2e32 0x171179a71c19892 0x90e0c8337cedee0319383160 0xa4cd6046f3a08aff1dbc5713 0xea61e3d3534f289 0x758f3bdf92466b9229abba65 0x4cde27edf84d0db01b08d1e2 0x216f60fa7b6f0c9e 0xfa9678d4e0f7653f2f0a90c3 0x67a476189273d4488991ec1d 0x4484d3f60035c7f 0xf2bcf950ba0073bfa2825b4c 0xcd1258ae1f692709f97cd25b 0x15a5ef36db20ebf3 0xd33c4f070ef764ae8d0ae924 0xbff9c6e42f638602073e4506 0xabd109a6815a9ad 0x2376a43d4277c708c0a8b2bf 0x132f939f05f2ca5613e0b8f6 0x21a539089abfaf1e 0xbb90356c721ed5ee187ef6af 0x7c88c797061a2e0a520e1351 0x159753742c0c23b 0x67c46f64ad85f42bc14f0781 0x8b36fb2668c164c783b09446 0xbc6c8326590df2 0x9f4f2a870157d5e01e4bc913 0xe4a0fcddf8379542120cdf86 0xf22d1f2e5a3c5ac 0xdedd2dbdbb07375eb1aae69b 0x46260aeb89307c51071e6ac0 0xc1adcdceae2ab6 0x8225e99c8bec39f7e4c8b96c 0x70e6da11c5c5969641372987 0x13a226ec495b948d 0xc2fbec699db2d9efed3adcbd 0x22cc8ff3cf066e14979d229a 0x1f842fcb2597f80c 0x88e1588b7a6805462c439cc5 0xbbea2d82330bb824a7f48c02 0x271dfcd704b15482 0x6585c9262015d73f0864660a 0x3a2dc53f41bc338a3db8d163 0x2f39ec0672365e7 0x740927a1a5dd22da47811536 0x3963ee4bad87fb687627d3d3 0x1873cce31b2cdd7a 0xa07a683724ee68be171dc354 0x7f0c96ffc5188a1172bc5e2e 0x14b19508f540464f 0x47edb8c693f5de81168d2dca 0x371bfd5f2674775c488b7b70 0x1aacfec5975dc69b 0x2f07f89ff54b37492677ef19 0x9b9698db8c0eb252830a2a82 0x89ecb0643ac178c 0x4a7b5ec769e4a7b71d328992 0x339b8f91750bf323b7426e75 0x1e9bc00c582084ca 0x553ed45290b8c3281cbd2a23 0xfa5f5a137bf808ebe9f200ce 0x2e6b107357b6ac32 0x8476304b22123482120b9e40 0xbbcf2bbcc3528dbe80b3fde1 0x19e8191a6bb54c9c 0x2a9d7e8a06925c47b2e5b138 0xead94c49310b947b9c458faa 0x1430c67fc935a594 0x6cad8321b500bef52c469f18 0xcc33146be790ae11ac0cc561 0x17db8a9d12be651b 0x23e2f1f6ac23f920db256c05 0xbf20762642697c5f60321b83 0x1b8411f22c459e0e 0x50bf4f715b4d02fd1c546b31 0xff1380bfa481148b9f1bffc 0x2cf26df6a4101817 0xebb6326937993c4d9e4ebd0a 0x5c1fccad8d3be4c2c7261053 0x291b38d1d19ccdf9 0xbd87bd5c6b58a1b9069d764d 0x99eb57c1d3616c2c3f3765f4 0x29a2f944e2905db2 0x4e513e438c3c194b2f2a8c6e 0x4ad150b14daf3af358470dd1 0x1bf1d5af3361904c 0x2fe72824766afd603e6e9605 0xaab0971c426b05dad891eb8c 0xdca686a4e81a487 0x1c27f9048ddf1260edce831e 0xbe58f70a12a5464580392051 0x2e95167fa7ebcc73 0x9a6583ab3597c36bb27f2b70 0xe81b4b1b5e48c93018432a77 0x1da154b2df1da5bb 0x2dba870978ae99829469fa3 0xd7e420fe56b3d09ae4d49fa1 0x1f27a8e9344aae6 0x11fef118ee2c63ad8ee8d3e8 0x5e6d876e19829d3e8e2ad4ad 0x165b27b303f2697d 0xa5f44faa841378b2da8b8088 0x9e923b5ed2936fd976bb3fbd 0xb713325e7dbb04a 0x547333dc1719cce4407cae4c 0x516fe15fa937a234c0497013 0x1395e0056e06f142 0xdc9ff33a11c9d856c634e810 0x55990dd9f60e95c22739717c 0x22465bc76eab0c4b 0xee3ff448f2a601242378a1d1 0xdeac236c903ccddb75aa380b 0xbe052707982f30 0xfb4fc16eb18b575f6ee82605 0xd09854785e32cd7c62d8a9af 0x1bb41fb55fa1e912 0x5bf94ed668d6ac1550de72fa 0x4a3fdffb8f7d8b88986b8179 0xf57c2ef31d2761c 0x5a99ae2e86d1782887e63d4b 0x34aa7d496b8e474ba9770a0e 0x21537d4c2479f6a0 0xca5fef55b6de87b5e8eb0fee 0xcee5a00a98dbdbb49ecc3955 0x1e22fa4c8edc5df 0xb55dd846781a7e19af351a0b 0xe6624bdb472de48bda1406d0 0x27230a4de5b969ba 0x41740ab31291029701a9215 0x4b82d9fa0e25a8270245aa47 0x24359146dfa1f6e3 0x94dbfbbaff45aa1f0ab8414c 0xa3a709a18403a75b4ea7339f 0x29ae188f08e779fe 0x2feda44df256b02ef7968f6c 0x7a8e74e69fad511f17e3c58f 0x2b36a7afb731e1a3 0x2d43135506c80e23c536e635 0xf53a5ddc9b530268db772873 0x175da59b8c74ee49 0xcd080ec45f1a01c0d7af213d 0x2a99e09a4cbae208c81820dc 0x2ff57621f6857e40 0x3140634ef710fda3dcd978b0 0x4019bf822e35a9ac83924211 0x1be72548b2234a25 0x632c3fc8e5b1bf93eac847fb 0xc8a4b238936a9fa2afb91f61 0x12b1295ff21ce6c8 0x6f5c275dbacee027509e260a 0xce4c894d755ad14e2cc76eba 0xfcc56971f15f865 0xf17d95baa0347bf0c3204302 0x144e4c384441aae88bfb1104 0x282f8d51fd9eba1 0x7c46dcb38b3e9c480832fdc8 0xf267770b5724251359aaf110 0x443e9b3b80c3e1f 0x8ac0b8d6517c07e08a3baad0 0x5e1b1b6a7196c91e43761241 0x1f57e2c9b9ccec70 0x644e50905011c7e3acdb2285 0xf84e3e526a8c09866f0ceda5 0x25fdaa1048387592 0x168c3998e34197f5a488d37 0x786da9cc0e7ead0bc67b31f4 0x177996820848141e 0x6efdc4f8be601ff4ab8d129b 0x9a96bd7baaff1c6cc6d9c682 0x29cd73933fdc801c 0x1a5ee29f5e7a16a9bab672e9 0x80e2486948d6e08adf67ff34 0x4890be2648682e8 0x9236c58ef1aef04837a1ea36 0xfe552d4c2a39a0a16560da5e 0x1841d163a08be27b 0xef6bba42dc71a1b9c2ac27b9 0x9cb15b4cebe773cc10f24866 0x77a8ac685bff5ce 0xaf702519aeb8ddbddc573870 0x55bce29ca522a73ff646a261 0x2a3f3a42a086bb6f 0xf50afc4992fa918308722966 0xa96b59e2921eb1f9c7fa876a 0x2f24d7697cd17e5e 0xaffc7d1a19777d2a21217e59 0x3ef2472228637796bd7d8dc7 0x1a0506a66e5383ab 0xca12516435db6cc043cc5388 0xa0d79d5f166424bf2ab46600 0x8d2403f722d8bea 0x33b48bf0248bba737a417d8 0xe98647c5115bc78253f93a3f 0x1c2059c254b2737 0x6a25629cf64fc9497c718e32 0x6f7bd19b25b5a768a3ed4e8b 0x4a87988b0d82d52 0xf1fc92c0e56ad1f91320fa7e 0x1999cc965d0094c7027be615 0x1cd84666fd0f83c0 0xd4b961008165306aae6fe868 0x98af327c81bf4a59db0d96cd 0x1421181344804db5 0xfff80cb30ad8f380024a1c5a 0xe4a50df2e0698bad1e848305 0x2810438cf7864a0d 0x70487745dd80b4d6cbaad460 0xefd9c5502b7bbc55a00782b2 0x1451fc7656a8aa5 0x4d35afb3dfa95ee0dfdd475a 0x35aff02f24830e619d5416b2 0x2b87d2e83b36f96a 0x468d7a69f3249cb7e7d52d2c 0xe34c13a36858b0f65cf7664a 0x2ca2c3fbab8b1890 0x2f05275ffaa08fad5adc0198 0x974076ddc1552fc01f7bd2c2 0x1a86f1117f5aad2f 0x616b28a3c95d022021d43b64 0x2dc63d7222ec86db834a9aad 0x204b2abf661e07c2 0x7b95b6f69c65933988bb3eb8 0xba6911fe00e6eca402ae123d 0xbef3d33aabdba2e 0xe7b91f9a8e2c39f67094d1b1 0xed354b237c54e089edf5c763 0x1b65ef29c04e00e0 0xa97715799c334df042bb7939 0x32299f375b88641f3991288 0x169aa6bc89a216a4 0xa4879f27a3357ef39e07aad6 0x7923a64805ae1f8a4bacd8a0 0x29850915d1199ac6 0x689e32ca7ac49268e3292d78 0x80713ceda80109a1322cb243 0x1f6abffa359bcadf 0x38f536d0eff09ca9d87388a1 0xc5ee4a612a9bdf0becc51e5 0x16e9ce6e719c60a3 0xd47039b988dc370908ac5ae8 0x82a2d9697eeb61aff71ce5f8 0x18726df5f7f6487d 0xc86ec2ff4dbd855e0e133d3d 0x6582de6140df1767ca443ed4 0x1694070dd8187efe 0xb5d86616ee808b2c97d3e440 0x836c3fd574e170fdfcd59b6b 0xb564a14cab3d9ed 0x85fcb271a159be6ac275bf95 0xfabf61fa24b2c96fa6c9fbd6 0x1f82032d5139c4ff 0x78741e66f99308935272ad62 0x49204f7404f49cc0e6b9637e 0x11702dff0a25ab81 0x8fd42c24cfed8dd6769cf122 0xf46c44da5639e99294e6d041 0x276955dbb4bb4c7b 0x66772c75d7292f9b77f2c58f 0xff1e8156263bbd5b9ea146aa 0x8b388e703c50c87 0xa329ee06af3d4a3a7ac11640 0xcabf082d5dba56b24824eca4 0x2538fd2d9cf80ac0 0x1bf256a849078dc2b86e56b2 0xbc4f8d815b2773fd5c22a39 0x43b5f5a003fe46e 0xa9265deff4ab2f6202598b6d 0x7b8b865760be4a5dfba6302b 0x7fab709f10cfaf1 0x72a989405ea3494ed54b2564 0xcdc0041b4722845a98eb4157 0x12b1012f185a1925 0x89bbf3a40752d50534b51dd6 0xfe4518b527738171857802db 0x283cbf53bd30c1d7 0xe6e823b4ccec2b1c5cb6691 0xedc84a97c0612a88f1a22253 0xbee7aab3a1fbc76 0x1c087394d1a8efa53168abb874142e7c41239f8c3f4bbf49c89401054a5c15 0xc 0xee91d9c9a198518c670304d5 0xc1507dc82df312cf0b6825a4 0x1992d4e9d7792801 0x0 0x6675ab5a7ce9519d7f1790ca 0x617194577bc67dbe2efb7734 0x241115e9ee74e976 0x0 0x10000000000000000357f6ed9cfc20b18 0x269ff2576b528ed8 0x10000000000000000aa363b63e08441ab 0x100000000000000002b84e0957fd23880 ================================================ FILE: src/contracts/autogenerated/groth16_example_bn254/tests/test_contract.cairo ================================================ // Generated by Garaga version 1.1.0 //! # Starknet Verification Contract Tests //! //! This module contains comprehensive tests for the proof verification contract. //! The tests use Starknet Foundry's testing features to verify proofs. //! //! ## Test Strategy //! - Use real proof fixtures generated by the garaga CLI //! - Test both positive (valid proof) and negative (invalid proof) cases use groth16_example_bn254::groth16_verifier::{ IGroth16VerifierBN254DispatcherTrait, IGroth16VerifierBN254LibraryDispatcher, }; use snforge_std::fs::{FileTrait, read_txt}; use snforge_std::{DeclareResultTrait, declare}; use starknet::ClassHash; /// Declare the Groth16VerifierBN254 contract for testing. /// /// This function declares a new instance of the Groth16VerifierBN254 contract /// /// # Arguments /// * `name` - The contract name to declare /// /// # Returns /// * `ClassHash` - The class hash of the declared contract /// /// # Example /// ```cairo /// let class_hash = declare_contract("Groth16VerifierBN254"); /// let dispatcher = IGroth16VerifierBN254LibraryDispatcher { class_hash }; /// ``` fn declare_contract(name: ByteArray) -> ClassHash { let class_hash = *declare(name).unwrap().contract_class().class_hash; class_hash } /// Test the verification function verify_groth16_proof_bn254 with a valid proof. /// /// This test demonstrates the complete verification flow: /// 1. Declare the verification contract /// 2. Load a pre-generated proof fixture /// 3. Verify the proof on-chain /// 4. Assert that verification succeeds /// /// ## Test Setup /// - Uses fork testing against Sepolia testnet to access required declared contracts maintained by /// the garaga team - Loads proof calldata from `tests/proof_calldata.txt` /// - To generate the calldata, you can use the garaga CLI: /// ```bash /// garaga calldata /// --system groth16 /// --vk path/to/vk /// --proof path/to/proof /// --public-inputs path/to/public_inputs /// --format snforge /// --output-path path/to/tests /// ``` /// This will generate a file `proof_calldata.txt` in the specified output path. /// You can then use this file in the test. /// /// ## Expected Behavior /// - The proof should verify successfully /// - The function should return Ok(public_inputs) containing the expected public inputs /// - No panics or assertion failures should occur #[test] #[fork(url: "https://api.zan.top/public/starknet-sepolia/rpc/v0_10", block_tag: latest)] fn test_verify_groth16_proof_bn254() { // Step 1: Declare the verification contract let class_hash = declare_contract("Groth16VerifierBN254"); let dispatcher = IGroth16VerifierBN254LibraryDispatcher { class_hash }; // Step 2: Load the proof fixture generated by the script // This file contains the groth16 proof calldata formatted for Starknet let file = FileTrait::new("tests/proof_calldata.txt"); let calldata = read_txt(@file).span(); // Step 3: Verify the proof on-chain // This calls the contract's verify_groth16_proof_bn254 function with the loaded proof data let result = dispatcher.verify_groth16_proof_bn254(calldata); // Step 4: Assert that verification succeeded // A valid proof should return Ok(public_inputs), not Err assert(result.is_ok(), 'Proof verification failed'); // Optional: You can also verify the public inputs contain expected values // let public_inputs = result.unwrap(); // assert(public_inputs.len() > 0, 'No public inputs'); // Additional assertions on the public input values can be added here } ================================================ FILE: src/contracts/autogenerated/noir_ultra_keccak_zk_honk_example/.tool-versions ================================================ scarb 2.16.1 starknet-foundry 0.57.0 ================================================ FILE: src/contracts/autogenerated/noir_ultra_keccak_zk_honk_example/Scarb.toml ================================================ # Generated by Garaga version 1.1.0 [package] name = "noir_ultra_keccak_zk_honk_example" version = "0.1.0" edition = "2024_07" [dependencies] garaga = { path = "../../../" } starknet = "2.16.1" [cairo] sierra-replace-ids = false inlining-strategy = 2 [dev-dependencies] snforge_std = "0.57.0" assert_macros = "2.16.1" [[target.starknet-contract]] casm = true casm-add-pythonic-hints = true ================================================ FILE: src/contracts/autogenerated/noir_ultra_keccak_zk_honk_example/src/honk_verifier.cairo ================================================ // Generated by Garaga version 1.1.0 use super::honk_verifier_circuits::{ is_on_curve_excluding_infinity_bn254, run_GRUMPKIN_ZKHONK_PREP_MSM_SCALARS_SIZE_12_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_DONE_SIZE_12_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_INIT_SIZE_12_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_LOOP_SIZE_12_circuit, run_GRUMPKIN_ZK_HONK_SUMCHECK_SIZE_12_PUB_17_circuit, }; use super::honk_verifier_constants::{precomputed_lines, vk}; #[starknet::interface] pub trait IUltraKeccakZKHonkVerifier { fn verify_ultra_keccak_zk_honk_proof( self: @TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; } #[starknet::contract] mod UltraKeccakZKHonkVerifier { use core::num::traits::Zero; use garaga::apps::noir::zk_honk_transcript::{ KeccakHasherState, Point256IntoCircuitPoint, ZKHonkTranscriptTrait, ZK_BATCHED_RELATION_PARTIAL_LENGTH, }; use garaga::apps::noir::{G2_POINT_KZG_1, G2_POINT_KZG_2, ZKHonkProof}; use garaga::core::circuit::{U32IntoU384, U64IntoU384, u256_to_u384, u288IntoCircuitInputValue}; use garaga::definitions::{ BN254, G1G2Pair, G1Point, get_BN254_modulus, get_GRUMPKIN_modulus, get_eigenvalue, get_min_one_order, get_nG_glv_fake_glv, get_third_root_of_unity, u384, }; use garaga::ec_ops::{G1PointTrait, GlvFakeGlvHint, _ec_safe_add, _scalar_mul_glv_and_fake_glv}; use garaga::pairing_check::{MPCheckHintBN254, multi_pairing_check_bn254_2P_2F}; use super::{ is_on_curve_excluding_infinity_bn254, precomputed_lines, run_GRUMPKIN_ZKHONK_PREP_MSM_SCALARS_SIZE_12_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_DONE_SIZE_12_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_INIT_SIZE_12_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_LOOP_SIZE_12_circuit, run_GRUMPKIN_ZK_HONK_SUMCHECK_SIZE_12_PUB_17_circuit, vk, }; #[storage] struct Storage {} #[derive(Drop, Serde)] struct FullProof { proof: ZKHonkProof, msm_hint: Span, kzg_hint: MPCheckHintBN254, } #[abi(embed_v0)] impl IUltraKeccakZKHonkVerifier of super::IUltraKeccakZKHonkVerifier { fn verify_ultra_keccak_zk_honk_proof( self: @ContractState, full_proof_with_hints: Span, ) -> Result, felt252> { // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok(public_inputs) if the proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given // a proof and a verifying key. let mut full_proof_with_hints = full_proof_with_hints; let full_proof = Serde::::deserialize(ref full_proof_with_hints) .expect('deserialization failed'); let mod_bn = get_BN254_modulus(); let mod_grumpkin = get_GRUMPKIN_modulus(); let (transcript, _, base_rlc) = ZKHonkTranscriptTrait::from_proof::< KeccakHasherState, >(full_proof.proof, vk.vk_hash, vk.log_circuit_size); let log_n = vk.log_circuit_size; let (sum_check_rlc, honk_check) = run_GRUMPKIN_ZK_HONK_SUMCHECK_SIZE_12_PUB_17_circuit( p_public_inputs: full_proof.proof.public_inputs, p_pairing_point_object: full_proof.proof.pairing_point_object, libra_sum: u256_to_u384(full_proof.proof.libra_sum), sumcheck_univariates_flat: full_proof .proof .sumcheck_univariates .slice(0, log_n * ZK_BATCHED_RELATION_PARTIAL_LENGTH), sumcheck_evaluations: full_proof.proof.sumcheck_evaluations, libra_evaluation: u256_to_u384(full_proof.proof.libra_evaluation), tp_sum_check_u_challenges: transcript.sum_check_u_challenges.span(), tp_gate_challenge: transcript.gate_challenge, tp_eta_1: transcript.eta.into(), tp_eta_2: transcript.eta_two.into(), tp_eta_3: transcript.eta_three.into(), tp_beta: transcript.beta.into(), tp_gamma: transcript.gamma.into(), tp_base_rlc: base_rlc.into(), tp_alpha: transcript.alpha, tp_libra_challenge: transcript.libra_challenge.into(), modulus: mod_grumpkin, ); let (mut challenge_poly_eval, mut root_power_times_tp_gemini_r) = run_GRUMPKIN_ZK_HONK_EVALS_CONS_INIT_SIZE_12_circuit( tp_gemini_r: transcript.gemini_r.into(), modulus: mod_grumpkin, ); for i in 0..vk.log_circuit_size { let (new_challenge_poly_eval, new_root_power_times_tp_gemini_r) = run_GRUMPKIN_ZK_HONK_EVALS_CONS_LOOP_SIZE_12_circuit( challenge_poly_eval: challenge_poly_eval, root_power_times_tp_gemini_r: root_power_times_tp_gemini_r, tp_sumcheck_u_challenge: (*transcript.sum_check_u_challenges.at(i)).into(), modulus: mod_grumpkin, ); challenge_poly_eval = new_challenge_poly_eval; root_power_times_tp_gemini_r = new_root_power_times_tp_gemini_r; } let (vanishing_check, diff_check) = run_GRUMPKIN_ZK_HONK_EVALS_CONS_DONE_SIZE_12_circuit( p_libra_evaluation: u256_to_u384(full_proof.proof.libra_evaluation), p_libra_poly_evals: full_proof.proof.libra_poly_evals, tp_gemini_r: transcript.gemini_r.into(), challenge_poly_eval: challenge_poly_eval, root_power_times_tp_gemini_r: root_power_times_tp_gemini_r, modulus: mod_grumpkin, ); let ( scalar_1, scalar_2, scalar_3, scalar_4, scalar_5, scalar_6, scalar_7, scalar_8, scalar_9, scalar_10, scalar_11, scalar_12, scalar_13, scalar_14, scalar_15, scalar_16, scalar_17, scalar_18, scalar_19, scalar_20, scalar_21, scalar_22, scalar_23, scalar_24, scalar_25, scalar_26, scalar_27, scalar_28, scalar_29, scalar_30, scalar_31, scalar_32, scalar_33, scalar_34, scalar_35, scalar_36, scalar_37, scalar_38, scalar_39, scalar_40, scalar_41, scalar_42, scalar_43, scalar_44, scalar_45, scalar_46, scalar_47, scalar_48, scalar_49, scalar_50, scalar_51, scalar_52, ) = run_GRUMPKIN_ZKHONK_PREP_MSM_SCALARS_SIZE_12_circuit( p_sumcheck_evaluations: full_proof.proof.sumcheck_evaluations, p_gemini_masking_eval: u256_to_u384(full_proof.proof.gemini_masking_eval), p_gemini_a_evaluations: full_proof.proof.gemini_a_evaluations, p_libra_poly_evals: full_proof.proof.libra_poly_evals, tp_gemini_r: transcript.gemini_r.into(), tp_rho: transcript.rho.into(), tp_shplonk_z: transcript.shplonk_z.into(), tp_shplonk_nu: transcript.shplonk_nu.into(), tp_sum_check_u_challenges: transcript.sum_check_u_challenges.span().slice(0, log_n), modulus: mod_grumpkin, ); // Starts with 1 * shplonk_q, not included in msm let mut _points: Array = array![ vk.qm, vk.qc, vk.ql, vk.qr, vk.qo, vk.q4, vk.qLookup, vk.qArith, vk.qDeltaRange, vk.qElliptic, vk.qMemory, vk.qNnf, vk.qPoseidon2External, vk.qPoseidon2Internal, vk.s1, vk.s2, vk.s3, vk.s4, vk.id1, vk.id2, vk.id3, vk.id4, vk.t1, vk.t2, vk.t3, vk.t4, vk.lagrange_first, vk.lagrange_last, full_proof.proof.gemini_masking_poly.into(), // Proof point 1, full_proof.proof.w1.into(), // Proof point 2, full_proof.proof.w2.into(), // Proof point 3, full_proof.proof.w3.into(), // Proof point 4, full_proof.proof.w4.into(), // Proof point 5, full_proof.proof.z_perm.into(), // Proof point 6, full_proof.proof.lookup_inverses.into(), // Proof point 7, full_proof.proof.lookup_read_counts.into(), // Proof point 8, full_proof.proof.lookup_read_tags.into() // Proof point 9 ]; for gem_comm in full_proof.proof.gemini_fold_comms { _points.append((*gem_comm).into()); } // log_n -1 = 11 points || Proof points 10-20 for lib_comm in full_proof.proof.libra_commitments { _points.append((*lib_comm).into()); } // 3 points || Proof points 21-23 _points.append(full_proof.proof.kzg_quotient.into()); // Proof point 24 _points.append(BN254.G); let mut points = _points.span(); let mut scalars: Span = array![ scalar_2, scalar_3, scalar_4, scalar_5, scalar_6, scalar_7, scalar_8, scalar_9, scalar_10, scalar_11, scalar_12, scalar_13, scalar_14, scalar_15, scalar_16, scalar_17, scalar_18, scalar_19, scalar_20, scalar_21, scalar_22, scalar_23, scalar_24, scalar_25, scalar_26, scalar_27, scalar_28, scalar_29, scalar_1, scalar_30, scalar_31, scalar_32, scalar_33, scalar_34, scalar_35, scalar_36, scalar_37, scalar_38, scalar_39, scalar_40, scalar_41, scalar_42, scalar_43, scalar_44, scalar_45, scalar_46, scalar_47, scalar_48, scalar_49, scalar_50, scalar_51, transcript.shplonk_z.into(), scalar_52, ] .span(); // Check input points are on curve. // Skip the first 28 points as they are from VK and keep the last 24 proof points for point in points.slice(28, 24) { assert( is_on_curve_excluding_infinity_bn254(*point, mod_bn), 'proof point not on curve', ); } // Assert shplonk_q is on curve let shplonk_q_pt: G1Point = full_proof.proof.shplonk_q.into(); assert( is_on_curve_excluding_infinity_bn254(shplonk_q_pt, mod_bn), 'shplonk_q not on curve', ); let mut msm_hint = full_proof.msm_hint; assert(msm_hint.len() == 53 * 12, 'wrong glv&fakeglv hint size'); let eigen = get_eigenvalue(0); let third_root_of_unity = get_third_root_of_unity(0); let min_one = get_min_one_order(0); let nG = get_nG_glv_fake_glv(0); let mut P_1 = shplonk_q_pt; while msm_hint.len() != 0 { let pt = *points.pop_front().unwrap(); let scalar = *scalars.pop_front().unwrap(); // Note : Scalars are below curve order by construction (circuit outputs mod n and // transcript output (u128)) let glv_fake_glv_hint: GlvFakeGlvHint = Serde::deserialize(ref msm_hint).unwrap(); let temp = _scalar_mul_glv_and_fake_glv( pt, scalar, mod_grumpkin, mod_bn, glv_fake_glv_hint, eigen, third_root_of_unity, min_one, nG, 0, ); P_1 = _ec_safe_add(P_1, temp, mod_bn, 0); } let P_2: G1Point = full_proof.proof.kzg_quotient.into(); // Perform the KZG pairing check. let kzg_check = multi_pairing_check_bn254_2P_2F( G1G2Pair { p: P_1, q: G2_POINT_KZG_1 }, G1G2Pair { p: P_2.negate(0), q: G2_POINT_KZG_2 }, precomputed_lines.span(), full_proof.kzg_hint, ); if sum_check_rlc.is_zero() && honk_check.is_zero() && !vanishing_check.is_zero() && diff_check.is_zero() && kzg_check.is_ok() { return Result::Ok(full_proof.proof.public_inputs); } else { return Result::Err('Proof verification failed'); } } } } ================================================ FILE: src/contracts/autogenerated/noir_ultra_keccak_zk_honk_example/src/honk_verifier_circuits.cairo ================================================ // Generated by Garaga version 1.1.0 use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitModulus, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::G1Point; #[inline(always)] pub fn run_GRUMPKIN_ZK_HONK_SUMCHECK_SIZE_12_PUB_17_circuit( p_public_inputs: Span, p_pairing_point_object: Span, libra_sum: u384, sumcheck_univariates_flat: Span, sumcheck_evaluations: Span, libra_evaluation: u384, tp_sum_check_u_challenges: Span, tp_gate_challenge: u128, tp_eta_1: u384, tp_eta_2: u384, tp_eta_3: u384, tp_beta: u384, tp_gamma: u384, tp_base_rlc: u384, tp_alpha: u128, tp_libra_challenge: u384, modulus: core::circuit::CircuitModulus, ) -> (u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x1 let in1 = CE::> {}; // 0x10000000 let in2 = CE::> {}; // 0x9d80 let in3 = CE::> {}; // 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 let in4 = CE::> {}; // 0x5a0 let in5 = CE::> {}; // 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 let in6 = CE::> {}; // 0x240 let in7 = CE::> {}; // 0x0 let in8 = CE::> {}; // 0x2 let in9 = CE::> {}; // 0x3 let in10 = CE::> {}; // 0x4 let in11 = CE::> {}; // 0x5 let in12 = CE::> {}; // 0x6 let in13 = CE::> {}; // 0x7 let in14 = CE::> {}; // 0x8 let in15 = CE::< CI<15>, > {}; // 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000 let in16 = CE::> {}; // -0x1 % p let in17 = CE::> {}; // 0x11 let in18 = CE::> {}; // 0x9 let in19 = CE::> {}; // 0x100000000000000000 let in20 = CE::> {}; // 0x4000 let in21 = CE::< CI<21>, > {}; // 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7 let in22 = CE::> {}; // 0xc28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b let in23 = CE::> {}; // 0x544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15 let in24 = CE::< CI<24>, > {}; // 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b // INPUT stack let (in25, in26, in27) = (CE::> {}, CE::> {}, CE::> {}); let (in28, in29, in30) = (CE::> {}, CE::> {}, CE::> {}); let (in31, in32, in33) = (CE::> {}, CE::> {}, CE::> {}); let (in34, in35, in36) = (CE::> {}, CE::> {}, CE::> {}); let (in37, in38, in39) = (CE::> {}, CE::> {}, CE::> {}); let (in40, in41, in42) = (CE::> {}, CE::> {}, CE::> {}); let (in43, in44, in45) = (CE::> {}, CE::> {}, CE::> {}); let (in46, in47, in48) = (CE::> {}, CE::> {}, CE::> {}); let (in49, in50, in51) = (CE::> {}, CE::> {}, CE::> {}); let (in52, in53, in54) = (CE::> {}, CE::> {}, CE::> {}); let (in55, in56, in57) = (CE::> {}, CE::> {}, CE::> {}); let (in58, in59, in60) = (CE::> {}, CE::> {}, CE::> {}); let (in61, in62, in63) = (CE::> {}, CE::> {}, CE::> {}); let (in64, in65, in66) = (CE::> {}, CE::> {}, CE::> {}); let (in67, in68, in69) = (CE::> {}, CE::> {}, CE::> {}); let (in70, in71, in72) = (CE::> {}, CE::> {}, CE::> {}); let (in73, in74, in75) = (CE::> {}, CE::> {}, CE::> {}); let (in76, in77, in78) = (CE::> {}, CE::> {}, CE::> {}); let (in79, in80, in81) = (CE::> {}, CE::> {}, CE::> {}); let (in82, in83, in84) = (CE::> {}, CE::> {}, CE::> {}); let (in85, in86, in87) = (CE::> {}, CE::> {}, CE::> {}); let (in88, in89, in90) = (CE::> {}, CE::> {}, CE::> {}); let (in91, in92, in93) = (CE::> {}, CE::> {}, CE::> {}); let (in94, in95, in96) = (CE::> {}, CE::> {}, CE::> {}); let (in97, in98, in99) = (CE::> {}, CE::> {}, CE::> {}); let (in100, in101, in102) = (CE::> {}, CE::> {}, CE::> {}); let (in103, in104, in105) = (CE::> {}, CE::> {}, CE::> {}); let (in106, in107, in108) = (CE::> {}, CE::> {}, CE::> {}); let (in109, in110, in111) = (CE::> {}, CE::> {}, CE::> {}); let (in112, in113, in114) = (CE::> {}, CE::> {}, CE::> {}); let (in115, in116, in117) = (CE::> {}, CE::> {}, CE::> {}); let (in118, in119, in120) = (CE::> {}, CE::> {}, CE::> {}); let (in121, in122, in123) = (CE::> {}, CE::> {}, CE::> {}); let (in124, in125, in126) = (CE::> {}, CE::> {}, CE::> {}); let (in127, in128, in129) = (CE::> {}, CE::> {}, CE::> {}); let (in130, in131, in132) = (CE::> {}, CE::> {}, CE::> {}); let (in133, in134, in135) = (CE::> {}, CE::> {}, CE::> {}); let (in136, in137, in138) = (CE::> {}, CE::> {}, CE::> {}); let (in139, in140, in141) = (CE::> {}, CE::> {}, CE::> {}); let (in142, in143, in144) = (CE::> {}, CE::> {}, CE::> {}); let (in145, in146, in147) = (CE::> {}, CE::> {}, CE::> {}); let (in148, in149, in150) = (CE::> {}, CE::> {}, CE::> {}); let (in151, in152, in153) = (CE::> {}, CE::> {}, CE::> {}); let (in154, in155, in156) = (CE::> {}, CE::> {}, CE::> {}); let (in157, in158, in159) = (CE::> {}, CE::> {}, CE::> {}); let (in160, in161, in162) = (CE::> {}, CE::> {}, CE::> {}); let (in163, in164, in165) = (CE::> {}, CE::> {}, CE::> {}); let (in166, in167, in168) = (CE::> {}, CE::> {}, CE::> {}); let (in169, in170, in171) = (CE::> {}, CE::> {}, CE::> {}); let (in172, in173, in174) = (CE::> {}, CE::> {}, CE::> {}); let (in175, in176, in177) = (CE::> {}, CE::> {}, CE::> {}); let (in178, in179, in180) = (CE::> {}, CE::> {}, CE::> {}); let (in181, in182, in183) = (CE::> {}, CE::> {}, CE::> {}); let (in184, in185, in186) = (CE::> {}, CE::> {}, CE::> {}); let (in187, in188, in189) = (CE::> {}, CE::> {}, CE::> {}); let (in190, in191, in192) = (CE::> {}, CE::> {}, CE::> {}); let (in193, in194, in195) = (CE::> {}, CE::> {}, CE::> {}); let (in196, in197, in198) = (CE::> {}, CE::> {}, CE::> {}); let (in199, in200, in201) = (CE::> {}, CE::> {}, CE::> {}); let (in202, in203, in204) = (CE::> {}, CE::> {}, CE::> {}); let (in205, in206, in207) = (CE::> {}, CE::> {}, CE::> {}); let (in208, in209, in210) = (CE::> {}, CE::> {}, CE::> {}); let (in211, in212, in213) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_add(in1, in0); let t1 = circuit_mul(in209, t0); let t2 = circuit_add(in210, t1); let t3 = circuit_add(in0, in0); let t4 = circuit_mul(in209, t3); let t5 = circuit_sub(in210, t4); let t6 = circuit_add(t2, in25); let t7 = circuit_mul(in0, t6); let t8 = circuit_add(t5, in25); let t9 = circuit_mul(in0, t8); let t10 = circuit_add(t2, in209); let t11 = circuit_sub(t5, in209); let t12 = circuit_add(t10, in26); let t13 = circuit_mul(t7, t12); let t14 = circuit_add(t11, in26); let t15 = circuit_mul(t9, t14); let t16 = circuit_add(t10, in209); let t17 = circuit_sub(t11, in209); let t18 = circuit_add(t16, in27); let t19 = circuit_mul(t13, t18); let t20 = circuit_add(t17, in27); let t21 = circuit_mul(t15, t20); let t22 = circuit_add(t16, in209); let t23 = circuit_sub(t17, in209); let t24 = circuit_add(t22, in28); let t25 = circuit_mul(t19, t24); let t26 = circuit_add(t23, in28); let t27 = circuit_mul(t21, t26); let t28 = circuit_add(t22, in209); let t29 = circuit_sub(t23, in209); let t30 = circuit_add(t28, in29); let t31 = circuit_mul(t25, t30); let t32 = circuit_add(t29, in29); let t33 = circuit_mul(t27, t32); let t34 = circuit_add(t28, in209); let t35 = circuit_sub(t29, in209); let t36 = circuit_add(t34, in30); let t37 = circuit_mul(t31, t36); let t38 = circuit_add(t35, in30); let t39 = circuit_mul(t33, t38); let t40 = circuit_add(t34, in209); let t41 = circuit_sub(t35, in209); let t42 = circuit_add(t40, in31); let t43 = circuit_mul(t37, t42); let t44 = circuit_add(t41, in31); let t45 = circuit_mul(t39, t44); let t46 = circuit_add(t40, in209); let t47 = circuit_sub(t41, in209); let t48 = circuit_add(t46, in32); let t49 = circuit_mul(t43, t48); let t50 = circuit_add(t47, in32); let t51 = circuit_mul(t45, t50); let t52 = circuit_add(t46, in209); let t53 = circuit_sub(t47, in209); let t54 = circuit_add(t52, in33); let t55 = circuit_mul(t49, t54); let t56 = circuit_add(t53, in33); let t57 = circuit_mul(t51, t56); let t58 = circuit_add(t52, in209); let t59 = circuit_sub(t53, in209); let t60 = circuit_add(t58, in34); let t61 = circuit_mul(t55, t60); let t62 = circuit_add(t59, in34); let t63 = circuit_mul(t57, t62); let t64 = circuit_add(t58, in209); let t65 = circuit_sub(t59, in209); let t66 = circuit_add(t64, in35); let t67 = circuit_mul(t61, t66); let t68 = circuit_add(t65, in35); let t69 = circuit_mul(t63, t68); let t70 = circuit_add(t64, in209); let t71 = circuit_sub(t65, in209); let t72 = circuit_add(t70, in36); let t73 = circuit_mul(t67, t72); let t74 = circuit_add(t71, in36); let t75 = circuit_mul(t69, t74); let t76 = circuit_add(t70, in209); let t77 = circuit_sub(t71, in209); let t78 = circuit_add(t76, in37); let t79 = circuit_mul(t73, t78); let t80 = circuit_add(t77, in37); let t81 = circuit_mul(t75, t80); let t82 = circuit_add(t76, in209); let t83 = circuit_sub(t77, in209); let t84 = circuit_add(t82, in38); let t85 = circuit_mul(t79, t84); let t86 = circuit_add(t83, in38); let t87 = circuit_mul(t81, t86); let t88 = circuit_add(t82, in209); let t89 = circuit_sub(t83, in209); let t90 = circuit_add(t88, in39); let t91 = circuit_mul(t85, t90); let t92 = circuit_add(t89, in39); let t93 = circuit_mul(t87, t92); let t94 = circuit_add(t88, in209); let t95 = circuit_sub(t89, in209); let t96 = circuit_add(t94, in40); let t97 = circuit_mul(t91, t96); let t98 = circuit_add(t95, in40); let t99 = circuit_mul(t93, t98); let t100 = circuit_add(t94, in209); let t101 = circuit_sub(t95, in209); let t102 = circuit_add(t100, in41); let t103 = circuit_mul(t97, t102); let t104 = circuit_add(t101, in41); let t105 = circuit_mul(t99, t104); let t106 = circuit_inverse(t105); let t107 = circuit_mul(t103, t106); let t108 = circuit_mul(in213, in42); let t109 = circuit_add(in43, in44); let t110 = circuit_sub(t109, t108); let t111 = circuit_mul(t110, in211); let t112 = circuit_sub(in193, in7); let t113 = circuit_mul(in0, t112); let t114 = circuit_sub(in193, in7); let t115 = circuit_mul(in2, t114); let t116 = circuit_inverse(t115); let t117 = circuit_mul(in43, t116); let t118 = circuit_add(in7, t117); let t119 = circuit_sub(in193, in0); let t120 = circuit_mul(t113, t119); let t121 = circuit_sub(in193, in0); let t122 = circuit_mul(in3, t121); let t123 = circuit_inverse(t122); let t124 = circuit_mul(in44, t123); let t125 = circuit_add(t118, t124); let t126 = circuit_sub(in193, in8); let t127 = circuit_mul(t120, t126); let t128 = circuit_sub(in193, in8); let t129 = circuit_mul(in4, t128); let t130 = circuit_inverse(t129); let t131 = circuit_mul(in45, t130); let t132 = circuit_add(t125, t131); let t133 = circuit_sub(in193, in9); let t134 = circuit_mul(t127, t133); let t135 = circuit_sub(in193, in9); let t136 = circuit_mul(in5, t135); let t137 = circuit_inverse(t136); let t138 = circuit_mul(in46, t137); let t139 = circuit_add(t132, t138); let t140 = circuit_sub(in193, in10); let t141 = circuit_mul(t134, t140); let t142 = circuit_sub(in193, in10); let t143 = circuit_mul(in6, t142); let t144 = circuit_inverse(t143); let t145 = circuit_mul(in47, t144); let t146 = circuit_add(t139, t145); let t147 = circuit_sub(in193, in11); let t148 = circuit_mul(t141, t147); let t149 = circuit_sub(in193, in11); let t150 = circuit_mul(in5, t149); let t151 = circuit_inverse(t150); let t152 = circuit_mul(in48, t151); let t153 = circuit_add(t146, t152); let t154 = circuit_sub(in193, in12); let t155 = circuit_mul(t148, t154); let t156 = circuit_sub(in193, in12); let t157 = circuit_mul(in4, t156); let t158 = circuit_inverse(t157); let t159 = circuit_mul(in49, t158); let t160 = circuit_add(t153, t159); let t161 = circuit_sub(in193, in13); let t162 = circuit_mul(t155, t161); let t163 = circuit_sub(in193, in13); let t164 = circuit_mul(in3, t163); let t165 = circuit_inverse(t164); let t166 = circuit_mul(in50, t165); let t167 = circuit_add(t160, t166); let t168 = circuit_sub(in193, in14); let t169 = circuit_mul(t162, t168); let t170 = circuit_sub(in193, in14); let t171 = circuit_mul(in2, t170); let t172 = circuit_inverse(t171); let t173 = circuit_mul(in51, t172); let t174 = circuit_add(t167, t173); let t175 = circuit_mul(t174, t169); let t176 = circuit_sub(in205, in0); let t177 = circuit_mul(in193, t176); let t178 = circuit_add(in0, t177); let t179 = circuit_mul(in0, t178); let t180 = circuit_mul(in211, in211); let t181 = circuit_mul(in205, in205); let t182 = circuit_add(in52, in53); let t183 = circuit_sub(t182, t175); let t184 = circuit_mul(t183, t180); let t185 = circuit_add(t111, t184); let t186 = circuit_sub(in194, in7); let t187 = circuit_mul(in0, t186); let t188 = circuit_sub(in194, in7); let t189 = circuit_mul(in2, t188); let t190 = circuit_inverse(t189); let t191 = circuit_mul(in52, t190); let t192 = circuit_add(in7, t191); let t193 = circuit_sub(in194, in0); let t194 = circuit_mul(t187, t193); let t195 = circuit_sub(in194, in0); let t196 = circuit_mul(in3, t195); let t197 = circuit_inverse(t196); let t198 = circuit_mul(in53, t197); let t199 = circuit_add(t192, t198); let t200 = circuit_sub(in194, in8); let t201 = circuit_mul(t194, t200); let t202 = circuit_sub(in194, in8); let t203 = circuit_mul(in4, t202); let t204 = circuit_inverse(t203); let t205 = circuit_mul(in54, t204); let t206 = circuit_add(t199, t205); let t207 = circuit_sub(in194, in9); let t208 = circuit_mul(t201, t207); let t209 = circuit_sub(in194, in9); let t210 = circuit_mul(in5, t209); let t211 = circuit_inverse(t210); let t212 = circuit_mul(in55, t211); let t213 = circuit_add(t206, t212); let t214 = circuit_sub(in194, in10); let t215 = circuit_mul(t208, t214); let t216 = circuit_sub(in194, in10); let t217 = circuit_mul(in6, t216); let t218 = circuit_inverse(t217); let t219 = circuit_mul(in56, t218); let t220 = circuit_add(t213, t219); let t221 = circuit_sub(in194, in11); let t222 = circuit_mul(t215, t221); let t223 = circuit_sub(in194, in11); let t224 = circuit_mul(in5, t223); let t225 = circuit_inverse(t224); let t226 = circuit_mul(in57, t225); let t227 = circuit_add(t220, t226); let t228 = circuit_sub(in194, in12); let t229 = circuit_mul(t222, t228); let t230 = circuit_sub(in194, in12); let t231 = circuit_mul(in4, t230); let t232 = circuit_inverse(t231); let t233 = circuit_mul(in58, t232); let t234 = circuit_add(t227, t233); let t235 = circuit_sub(in194, in13); let t236 = circuit_mul(t229, t235); let t237 = circuit_sub(in194, in13); let t238 = circuit_mul(in3, t237); let t239 = circuit_inverse(t238); let t240 = circuit_mul(in59, t239); let t241 = circuit_add(t234, t240); let t242 = circuit_sub(in194, in14); let t243 = circuit_mul(t236, t242); let t244 = circuit_sub(in194, in14); let t245 = circuit_mul(in2, t244); let t246 = circuit_inverse(t245); let t247 = circuit_mul(in60, t246); let t248 = circuit_add(t241, t247); let t249 = circuit_mul(t248, t243); let t250 = circuit_sub(t181, in0); let t251 = circuit_mul(in194, t250); let t252 = circuit_add(in0, t251); let t253 = circuit_mul(t179, t252); let t254 = circuit_mul(t180, in211); let t255 = circuit_mul(t181, t181); let t256 = circuit_add(in61, in62); let t257 = circuit_sub(t256, t249); let t258 = circuit_mul(t257, t254); let t259 = circuit_add(t185, t258); let t260 = circuit_sub(in195, in7); let t261 = circuit_mul(in0, t260); let t262 = circuit_sub(in195, in7); let t263 = circuit_mul(in2, t262); let t264 = circuit_inverse(t263); let t265 = circuit_mul(in61, t264); let t266 = circuit_add(in7, t265); let t267 = circuit_sub(in195, in0); let t268 = circuit_mul(t261, t267); let t269 = circuit_sub(in195, in0); let t270 = circuit_mul(in3, t269); let t271 = circuit_inverse(t270); let t272 = circuit_mul(in62, t271); let t273 = circuit_add(t266, t272); let t274 = circuit_sub(in195, in8); let t275 = circuit_mul(t268, t274); let t276 = circuit_sub(in195, in8); let t277 = circuit_mul(in4, t276); let t278 = circuit_inverse(t277); let t279 = circuit_mul(in63, t278); let t280 = circuit_add(t273, t279); let t281 = circuit_sub(in195, in9); let t282 = circuit_mul(t275, t281); let t283 = circuit_sub(in195, in9); let t284 = circuit_mul(in5, t283); let t285 = circuit_inverse(t284); let t286 = circuit_mul(in64, t285); let t287 = circuit_add(t280, t286); let t288 = circuit_sub(in195, in10); let t289 = circuit_mul(t282, t288); let t290 = circuit_sub(in195, in10); let t291 = circuit_mul(in6, t290); let t292 = circuit_inverse(t291); let t293 = circuit_mul(in65, t292); let t294 = circuit_add(t287, t293); let t295 = circuit_sub(in195, in11); let t296 = circuit_mul(t289, t295); let t297 = circuit_sub(in195, in11); let t298 = circuit_mul(in5, t297); let t299 = circuit_inverse(t298); let t300 = circuit_mul(in66, t299); let t301 = circuit_add(t294, t300); let t302 = circuit_sub(in195, in12); let t303 = circuit_mul(t296, t302); let t304 = circuit_sub(in195, in12); let t305 = circuit_mul(in4, t304); let t306 = circuit_inverse(t305); let t307 = circuit_mul(in67, t306); let t308 = circuit_add(t301, t307); let t309 = circuit_sub(in195, in13); let t310 = circuit_mul(t303, t309); let t311 = circuit_sub(in195, in13); let t312 = circuit_mul(in3, t311); let t313 = circuit_inverse(t312); let t314 = circuit_mul(in68, t313); let t315 = circuit_add(t308, t314); let t316 = circuit_sub(in195, in14); let t317 = circuit_mul(t310, t316); let t318 = circuit_sub(in195, in14); let t319 = circuit_mul(in2, t318); let t320 = circuit_inverse(t319); let t321 = circuit_mul(in69, t320); let t322 = circuit_add(t315, t321); let t323 = circuit_mul(t322, t317); let t324 = circuit_sub(t255, in0); let t325 = circuit_mul(in195, t324); let t326 = circuit_add(in0, t325); let t327 = circuit_mul(t253, t326); let t328 = circuit_mul(t254, in211); let t329 = circuit_mul(t255, t255); let t330 = circuit_add(in70, in71); let t331 = circuit_sub(t330, t323); let t332 = circuit_mul(t331, t328); let t333 = circuit_add(t259, t332); let t334 = circuit_sub(in196, in7); let t335 = circuit_mul(in0, t334); let t336 = circuit_sub(in196, in7); let t337 = circuit_mul(in2, t336); let t338 = circuit_inverse(t337); let t339 = circuit_mul(in70, t338); let t340 = circuit_add(in7, t339); let t341 = circuit_sub(in196, in0); let t342 = circuit_mul(t335, t341); let t343 = circuit_sub(in196, in0); let t344 = circuit_mul(in3, t343); let t345 = circuit_inverse(t344); let t346 = circuit_mul(in71, t345); let t347 = circuit_add(t340, t346); let t348 = circuit_sub(in196, in8); let t349 = circuit_mul(t342, t348); let t350 = circuit_sub(in196, in8); let t351 = circuit_mul(in4, t350); let t352 = circuit_inverse(t351); let t353 = circuit_mul(in72, t352); let t354 = circuit_add(t347, t353); let t355 = circuit_sub(in196, in9); let t356 = circuit_mul(t349, t355); let t357 = circuit_sub(in196, in9); let t358 = circuit_mul(in5, t357); let t359 = circuit_inverse(t358); let t360 = circuit_mul(in73, t359); let t361 = circuit_add(t354, t360); let t362 = circuit_sub(in196, in10); let t363 = circuit_mul(t356, t362); let t364 = circuit_sub(in196, in10); let t365 = circuit_mul(in6, t364); let t366 = circuit_inverse(t365); let t367 = circuit_mul(in74, t366); let t368 = circuit_add(t361, t367); let t369 = circuit_sub(in196, in11); let t370 = circuit_mul(t363, t369); let t371 = circuit_sub(in196, in11); let t372 = circuit_mul(in5, t371); let t373 = circuit_inverse(t372); let t374 = circuit_mul(in75, t373); let t375 = circuit_add(t368, t374); let t376 = circuit_sub(in196, in12); let t377 = circuit_mul(t370, t376); let t378 = circuit_sub(in196, in12); let t379 = circuit_mul(in4, t378); let t380 = circuit_inverse(t379); let t381 = circuit_mul(in76, t380); let t382 = circuit_add(t375, t381); let t383 = circuit_sub(in196, in13); let t384 = circuit_mul(t377, t383); let t385 = circuit_sub(in196, in13); let t386 = circuit_mul(in3, t385); let t387 = circuit_inverse(t386); let t388 = circuit_mul(in77, t387); let t389 = circuit_add(t382, t388); let t390 = circuit_sub(in196, in14); let t391 = circuit_mul(t384, t390); let t392 = circuit_sub(in196, in14); let t393 = circuit_mul(in2, t392); let t394 = circuit_inverse(t393); let t395 = circuit_mul(in78, t394); let t396 = circuit_add(t389, t395); let t397 = circuit_mul(t396, t391); let t398 = circuit_sub(t329, in0); let t399 = circuit_mul(in196, t398); let t400 = circuit_add(in0, t399); let t401 = circuit_mul(t327, t400); let t402 = circuit_mul(t328, in211); let t403 = circuit_mul(t329, t329); let t404 = circuit_add(in79, in80); let t405 = circuit_sub(t404, t397); let t406 = circuit_mul(t405, t402); let t407 = circuit_add(t333, t406); let t408 = circuit_sub(in197, in7); let t409 = circuit_mul(in0, t408); let t410 = circuit_sub(in197, in7); let t411 = circuit_mul(in2, t410); let t412 = circuit_inverse(t411); let t413 = circuit_mul(in79, t412); let t414 = circuit_add(in7, t413); let t415 = circuit_sub(in197, in0); let t416 = circuit_mul(t409, t415); let t417 = circuit_sub(in197, in0); let t418 = circuit_mul(in3, t417); let t419 = circuit_inverse(t418); let t420 = circuit_mul(in80, t419); let t421 = circuit_add(t414, t420); let t422 = circuit_sub(in197, in8); let t423 = circuit_mul(t416, t422); let t424 = circuit_sub(in197, in8); let t425 = circuit_mul(in4, t424); let t426 = circuit_inverse(t425); let t427 = circuit_mul(in81, t426); let t428 = circuit_add(t421, t427); let t429 = circuit_sub(in197, in9); let t430 = circuit_mul(t423, t429); let t431 = circuit_sub(in197, in9); let t432 = circuit_mul(in5, t431); let t433 = circuit_inverse(t432); let t434 = circuit_mul(in82, t433); let t435 = circuit_add(t428, t434); let t436 = circuit_sub(in197, in10); let t437 = circuit_mul(t430, t436); let t438 = circuit_sub(in197, in10); let t439 = circuit_mul(in6, t438); let t440 = circuit_inverse(t439); let t441 = circuit_mul(in83, t440); let t442 = circuit_add(t435, t441); let t443 = circuit_sub(in197, in11); let t444 = circuit_mul(t437, t443); let t445 = circuit_sub(in197, in11); let t446 = circuit_mul(in5, t445); let t447 = circuit_inverse(t446); let t448 = circuit_mul(in84, t447); let t449 = circuit_add(t442, t448); let t450 = circuit_sub(in197, in12); let t451 = circuit_mul(t444, t450); let t452 = circuit_sub(in197, in12); let t453 = circuit_mul(in4, t452); let t454 = circuit_inverse(t453); let t455 = circuit_mul(in85, t454); let t456 = circuit_add(t449, t455); let t457 = circuit_sub(in197, in13); let t458 = circuit_mul(t451, t457); let t459 = circuit_sub(in197, in13); let t460 = circuit_mul(in3, t459); let t461 = circuit_inverse(t460); let t462 = circuit_mul(in86, t461); let t463 = circuit_add(t456, t462); let t464 = circuit_sub(in197, in14); let t465 = circuit_mul(t458, t464); let t466 = circuit_sub(in197, in14); let t467 = circuit_mul(in2, t466); let t468 = circuit_inverse(t467); let t469 = circuit_mul(in87, t468); let t470 = circuit_add(t463, t469); let t471 = circuit_mul(t470, t465); let t472 = circuit_sub(t403, in0); let t473 = circuit_mul(in197, t472); let t474 = circuit_add(in0, t473); let t475 = circuit_mul(t401, t474); let t476 = circuit_mul(t402, in211); let t477 = circuit_mul(t403, t403); let t478 = circuit_add(in88, in89); let t479 = circuit_sub(t478, t471); let t480 = circuit_mul(t479, t476); let t481 = circuit_add(t407, t480); let t482 = circuit_sub(in198, in7); let t483 = circuit_mul(in0, t482); let t484 = circuit_sub(in198, in7); let t485 = circuit_mul(in2, t484); let t486 = circuit_inverse(t485); let t487 = circuit_mul(in88, t486); let t488 = circuit_add(in7, t487); let t489 = circuit_sub(in198, in0); let t490 = circuit_mul(t483, t489); let t491 = circuit_sub(in198, in0); let t492 = circuit_mul(in3, t491); let t493 = circuit_inverse(t492); let t494 = circuit_mul(in89, t493); let t495 = circuit_add(t488, t494); let t496 = circuit_sub(in198, in8); let t497 = circuit_mul(t490, t496); let t498 = circuit_sub(in198, in8); let t499 = circuit_mul(in4, t498); let t500 = circuit_inverse(t499); let t501 = circuit_mul(in90, t500); let t502 = circuit_add(t495, t501); let t503 = circuit_sub(in198, in9); let t504 = circuit_mul(t497, t503); let t505 = circuit_sub(in198, in9); let t506 = circuit_mul(in5, t505); let t507 = circuit_inverse(t506); let t508 = circuit_mul(in91, t507); let t509 = circuit_add(t502, t508); let t510 = circuit_sub(in198, in10); let t511 = circuit_mul(t504, t510); let t512 = circuit_sub(in198, in10); let t513 = circuit_mul(in6, t512); let t514 = circuit_inverse(t513); let t515 = circuit_mul(in92, t514); let t516 = circuit_add(t509, t515); let t517 = circuit_sub(in198, in11); let t518 = circuit_mul(t511, t517); let t519 = circuit_sub(in198, in11); let t520 = circuit_mul(in5, t519); let t521 = circuit_inverse(t520); let t522 = circuit_mul(in93, t521); let t523 = circuit_add(t516, t522); let t524 = circuit_sub(in198, in12); let t525 = circuit_mul(t518, t524); let t526 = circuit_sub(in198, in12); let t527 = circuit_mul(in4, t526); let t528 = circuit_inverse(t527); let t529 = circuit_mul(in94, t528); let t530 = circuit_add(t523, t529); let t531 = circuit_sub(in198, in13); let t532 = circuit_mul(t525, t531); let t533 = circuit_sub(in198, in13); let t534 = circuit_mul(in3, t533); let t535 = circuit_inverse(t534); let t536 = circuit_mul(in95, t535); let t537 = circuit_add(t530, t536); let t538 = circuit_sub(in198, in14); let t539 = circuit_mul(t532, t538); let t540 = circuit_sub(in198, in14); let t541 = circuit_mul(in2, t540); let t542 = circuit_inverse(t541); let t543 = circuit_mul(in96, t542); let t544 = circuit_add(t537, t543); let t545 = circuit_mul(t544, t539); let t546 = circuit_sub(t477, in0); let t547 = circuit_mul(in198, t546); let t548 = circuit_add(in0, t547); let t549 = circuit_mul(t475, t548); let t550 = circuit_mul(t476, in211); let t551 = circuit_mul(t477, t477); let t552 = circuit_add(in97, in98); let t553 = circuit_sub(t552, t545); let t554 = circuit_mul(t553, t550); let t555 = circuit_add(t481, t554); let t556 = circuit_sub(in199, in7); let t557 = circuit_mul(in0, t556); let t558 = circuit_sub(in199, in7); let t559 = circuit_mul(in2, t558); let t560 = circuit_inverse(t559); let t561 = circuit_mul(in97, t560); let t562 = circuit_add(in7, t561); let t563 = circuit_sub(in199, in0); let t564 = circuit_mul(t557, t563); let t565 = circuit_sub(in199, in0); let t566 = circuit_mul(in3, t565); let t567 = circuit_inverse(t566); let t568 = circuit_mul(in98, t567); let t569 = circuit_add(t562, t568); let t570 = circuit_sub(in199, in8); let t571 = circuit_mul(t564, t570); let t572 = circuit_sub(in199, in8); let t573 = circuit_mul(in4, t572); let t574 = circuit_inverse(t573); let t575 = circuit_mul(in99, t574); let t576 = circuit_add(t569, t575); let t577 = circuit_sub(in199, in9); let t578 = circuit_mul(t571, t577); let t579 = circuit_sub(in199, in9); let t580 = circuit_mul(in5, t579); let t581 = circuit_inverse(t580); let t582 = circuit_mul(in100, t581); let t583 = circuit_add(t576, t582); let t584 = circuit_sub(in199, in10); let t585 = circuit_mul(t578, t584); let t586 = circuit_sub(in199, in10); let t587 = circuit_mul(in6, t586); let t588 = circuit_inverse(t587); let t589 = circuit_mul(in101, t588); let t590 = circuit_add(t583, t589); let t591 = circuit_sub(in199, in11); let t592 = circuit_mul(t585, t591); let t593 = circuit_sub(in199, in11); let t594 = circuit_mul(in5, t593); let t595 = circuit_inverse(t594); let t596 = circuit_mul(in102, t595); let t597 = circuit_add(t590, t596); let t598 = circuit_sub(in199, in12); let t599 = circuit_mul(t592, t598); let t600 = circuit_sub(in199, in12); let t601 = circuit_mul(in4, t600); let t602 = circuit_inverse(t601); let t603 = circuit_mul(in103, t602); let t604 = circuit_add(t597, t603); let t605 = circuit_sub(in199, in13); let t606 = circuit_mul(t599, t605); let t607 = circuit_sub(in199, in13); let t608 = circuit_mul(in3, t607); let t609 = circuit_inverse(t608); let t610 = circuit_mul(in104, t609); let t611 = circuit_add(t604, t610); let t612 = circuit_sub(in199, in14); let t613 = circuit_mul(t606, t612); let t614 = circuit_sub(in199, in14); let t615 = circuit_mul(in2, t614); let t616 = circuit_inverse(t615); let t617 = circuit_mul(in105, t616); let t618 = circuit_add(t611, t617); let t619 = circuit_mul(t618, t613); let t620 = circuit_sub(t551, in0); let t621 = circuit_mul(in199, t620); let t622 = circuit_add(in0, t621); let t623 = circuit_mul(t549, t622); let t624 = circuit_mul(t550, in211); let t625 = circuit_mul(t551, t551); let t626 = circuit_add(in106, in107); let t627 = circuit_sub(t626, t619); let t628 = circuit_mul(t627, t624); let t629 = circuit_add(t555, t628); let t630 = circuit_sub(in200, in7); let t631 = circuit_mul(in0, t630); let t632 = circuit_sub(in200, in7); let t633 = circuit_mul(in2, t632); let t634 = circuit_inverse(t633); let t635 = circuit_mul(in106, t634); let t636 = circuit_add(in7, t635); let t637 = circuit_sub(in200, in0); let t638 = circuit_mul(t631, t637); let t639 = circuit_sub(in200, in0); let t640 = circuit_mul(in3, t639); let t641 = circuit_inverse(t640); let t642 = circuit_mul(in107, t641); let t643 = circuit_add(t636, t642); let t644 = circuit_sub(in200, in8); let t645 = circuit_mul(t638, t644); let t646 = circuit_sub(in200, in8); let t647 = circuit_mul(in4, t646); let t648 = circuit_inverse(t647); let t649 = circuit_mul(in108, t648); let t650 = circuit_add(t643, t649); let t651 = circuit_sub(in200, in9); let t652 = circuit_mul(t645, t651); let t653 = circuit_sub(in200, in9); let t654 = circuit_mul(in5, t653); let t655 = circuit_inverse(t654); let t656 = circuit_mul(in109, t655); let t657 = circuit_add(t650, t656); let t658 = circuit_sub(in200, in10); let t659 = circuit_mul(t652, t658); let t660 = circuit_sub(in200, in10); let t661 = circuit_mul(in6, t660); let t662 = circuit_inverse(t661); let t663 = circuit_mul(in110, t662); let t664 = circuit_add(t657, t663); let t665 = circuit_sub(in200, in11); let t666 = circuit_mul(t659, t665); let t667 = circuit_sub(in200, in11); let t668 = circuit_mul(in5, t667); let t669 = circuit_inverse(t668); let t670 = circuit_mul(in111, t669); let t671 = circuit_add(t664, t670); let t672 = circuit_sub(in200, in12); let t673 = circuit_mul(t666, t672); let t674 = circuit_sub(in200, in12); let t675 = circuit_mul(in4, t674); let t676 = circuit_inverse(t675); let t677 = circuit_mul(in112, t676); let t678 = circuit_add(t671, t677); let t679 = circuit_sub(in200, in13); let t680 = circuit_mul(t673, t679); let t681 = circuit_sub(in200, in13); let t682 = circuit_mul(in3, t681); let t683 = circuit_inverse(t682); let t684 = circuit_mul(in113, t683); let t685 = circuit_add(t678, t684); let t686 = circuit_sub(in200, in14); let t687 = circuit_mul(t680, t686); let t688 = circuit_sub(in200, in14); let t689 = circuit_mul(in2, t688); let t690 = circuit_inverse(t689); let t691 = circuit_mul(in114, t690); let t692 = circuit_add(t685, t691); let t693 = circuit_mul(t692, t687); let t694 = circuit_sub(t625, in0); let t695 = circuit_mul(in200, t694); let t696 = circuit_add(in0, t695); let t697 = circuit_mul(t623, t696); let t698 = circuit_mul(t624, in211); let t699 = circuit_mul(t625, t625); let t700 = circuit_add(in115, in116); let t701 = circuit_sub(t700, t693); let t702 = circuit_mul(t701, t698); let t703 = circuit_add(t629, t702); let t704 = circuit_sub(in201, in7); let t705 = circuit_mul(in0, t704); let t706 = circuit_sub(in201, in7); let t707 = circuit_mul(in2, t706); let t708 = circuit_inverse(t707); let t709 = circuit_mul(in115, t708); let t710 = circuit_add(in7, t709); let t711 = circuit_sub(in201, in0); let t712 = circuit_mul(t705, t711); let t713 = circuit_sub(in201, in0); let t714 = circuit_mul(in3, t713); let t715 = circuit_inverse(t714); let t716 = circuit_mul(in116, t715); let t717 = circuit_add(t710, t716); let t718 = circuit_sub(in201, in8); let t719 = circuit_mul(t712, t718); let t720 = circuit_sub(in201, in8); let t721 = circuit_mul(in4, t720); let t722 = circuit_inverse(t721); let t723 = circuit_mul(in117, t722); let t724 = circuit_add(t717, t723); let t725 = circuit_sub(in201, in9); let t726 = circuit_mul(t719, t725); let t727 = circuit_sub(in201, in9); let t728 = circuit_mul(in5, t727); let t729 = circuit_inverse(t728); let t730 = circuit_mul(in118, t729); let t731 = circuit_add(t724, t730); let t732 = circuit_sub(in201, in10); let t733 = circuit_mul(t726, t732); let t734 = circuit_sub(in201, in10); let t735 = circuit_mul(in6, t734); let t736 = circuit_inverse(t735); let t737 = circuit_mul(in119, t736); let t738 = circuit_add(t731, t737); let t739 = circuit_sub(in201, in11); let t740 = circuit_mul(t733, t739); let t741 = circuit_sub(in201, in11); let t742 = circuit_mul(in5, t741); let t743 = circuit_inverse(t742); let t744 = circuit_mul(in120, t743); let t745 = circuit_add(t738, t744); let t746 = circuit_sub(in201, in12); let t747 = circuit_mul(t740, t746); let t748 = circuit_sub(in201, in12); let t749 = circuit_mul(in4, t748); let t750 = circuit_inverse(t749); let t751 = circuit_mul(in121, t750); let t752 = circuit_add(t745, t751); let t753 = circuit_sub(in201, in13); let t754 = circuit_mul(t747, t753); let t755 = circuit_sub(in201, in13); let t756 = circuit_mul(in3, t755); let t757 = circuit_inverse(t756); let t758 = circuit_mul(in122, t757); let t759 = circuit_add(t752, t758); let t760 = circuit_sub(in201, in14); let t761 = circuit_mul(t754, t760); let t762 = circuit_sub(in201, in14); let t763 = circuit_mul(in2, t762); let t764 = circuit_inverse(t763); let t765 = circuit_mul(in123, t764); let t766 = circuit_add(t759, t765); let t767 = circuit_mul(t766, t761); let t768 = circuit_sub(t699, in0); let t769 = circuit_mul(in201, t768); let t770 = circuit_add(in0, t769); let t771 = circuit_mul(t697, t770); let t772 = circuit_mul(t698, in211); let t773 = circuit_mul(t699, t699); let t774 = circuit_add(in124, in125); let t775 = circuit_sub(t774, t767); let t776 = circuit_mul(t775, t772); let t777 = circuit_add(t703, t776); let t778 = circuit_sub(in202, in7); let t779 = circuit_mul(in0, t778); let t780 = circuit_sub(in202, in7); let t781 = circuit_mul(in2, t780); let t782 = circuit_inverse(t781); let t783 = circuit_mul(in124, t782); let t784 = circuit_add(in7, t783); let t785 = circuit_sub(in202, in0); let t786 = circuit_mul(t779, t785); let t787 = circuit_sub(in202, in0); let t788 = circuit_mul(in3, t787); let t789 = circuit_inverse(t788); let t790 = circuit_mul(in125, t789); let t791 = circuit_add(t784, t790); let t792 = circuit_sub(in202, in8); let t793 = circuit_mul(t786, t792); let t794 = circuit_sub(in202, in8); let t795 = circuit_mul(in4, t794); let t796 = circuit_inverse(t795); let t797 = circuit_mul(in126, t796); let t798 = circuit_add(t791, t797); let t799 = circuit_sub(in202, in9); let t800 = circuit_mul(t793, t799); let t801 = circuit_sub(in202, in9); let t802 = circuit_mul(in5, t801); let t803 = circuit_inverse(t802); let t804 = circuit_mul(in127, t803); let t805 = circuit_add(t798, t804); let t806 = circuit_sub(in202, in10); let t807 = circuit_mul(t800, t806); let t808 = circuit_sub(in202, in10); let t809 = circuit_mul(in6, t808); let t810 = circuit_inverse(t809); let t811 = circuit_mul(in128, t810); let t812 = circuit_add(t805, t811); let t813 = circuit_sub(in202, in11); let t814 = circuit_mul(t807, t813); let t815 = circuit_sub(in202, in11); let t816 = circuit_mul(in5, t815); let t817 = circuit_inverse(t816); let t818 = circuit_mul(in129, t817); let t819 = circuit_add(t812, t818); let t820 = circuit_sub(in202, in12); let t821 = circuit_mul(t814, t820); let t822 = circuit_sub(in202, in12); let t823 = circuit_mul(in4, t822); let t824 = circuit_inverse(t823); let t825 = circuit_mul(in130, t824); let t826 = circuit_add(t819, t825); let t827 = circuit_sub(in202, in13); let t828 = circuit_mul(t821, t827); let t829 = circuit_sub(in202, in13); let t830 = circuit_mul(in3, t829); let t831 = circuit_inverse(t830); let t832 = circuit_mul(in131, t831); let t833 = circuit_add(t826, t832); let t834 = circuit_sub(in202, in14); let t835 = circuit_mul(t828, t834); let t836 = circuit_sub(in202, in14); let t837 = circuit_mul(in2, t836); let t838 = circuit_inverse(t837); let t839 = circuit_mul(in132, t838); let t840 = circuit_add(t833, t839); let t841 = circuit_mul(t840, t835); let t842 = circuit_sub(t773, in0); let t843 = circuit_mul(in202, t842); let t844 = circuit_add(in0, t843); let t845 = circuit_mul(t771, t844); let t846 = circuit_mul(t772, in211); let t847 = circuit_mul(t773, t773); let t848 = circuit_add(in133, in134); let t849 = circuit_sub(t848, t841); let t850 = circuit_mul(t849, t846); let t851 = circuit_add(t777, t850); let t852 = circuit_sub(in203, in7); let t853 = circuit_mul(in0, t852); let t854 = circuit_sub(in203, in7); let t855 = circuit_mul(in2, t854); let t856 = circuit_inverse(t855); let t857 = circuit_mul(in133, t856); let t858 = circuit_add(in7, t857); let t859 = circuit_sub(in203, in0); let t860 = circuit_mul(t853, t859); let t861 = circuit_sub(in203, in0); let t862 = circuit_mul(in3, t861); let t863 = circuit_inverse(t862); let t864 = circuit_mul(in134, t863); let t865 = circuit_add(t858, t864); let t866 = circuit_sub(in203, in8); let t867 = circuit_mul(t860, t866); let t868 = circuit_sub(in203, in8); let t869 = circuit_mul(in4, t868); let t870 = circuit_inverse(t869); let t871 = circuit_mul(in135, t870); let t872 = circuit_add(t865, t871); let t873 = circuit_sub(in203, in9); let t874 = circuit_mul(t867, t873); let t875 = circuit_sub(in203, in9); let t876 = circuit_mul(in5, t875); let t877 = circuit_inverse(t876); let t878 = circuit_mul(in136, t877); let t879 = circuit_add(t872, t878); let t880 = circuit_sub(in203, in10); let t881 = circuit_mul(t874, t880); let t882 = circuit_sub(in203, in10); let t883 = circuit_mul(in6, t882); let t884 = circuit_inverse(t883); let t885 = circuit_mul(in137, t884); let t886 = circuit_add(t879, t885); let t887 = circuit_sub(in203, in11); let t888 = circuit_mul(t881, t887); let t889 = circuit_sub(in203, in11); let t890 = circuit_mul(in5, t889); let t891 = circuit_inverse(t890); let t892 = circuit_mul(in138, t891); let t893 = circuit_add(t886, t892); let t894 = circuit_sub(in203, in12); let t895 = circuit_mul(t888, t894); let t896 = circuit_sub(in203, in12); let t897 = circuit_mul(in4, t896); let t898 = circuit_inverse(t897); let t899 = circuit_mul(in139, t898); let t900 = circuit_add(t893, t899); let t901 = circuit_sub(in203, in13); let t902 = circuit_mul(t895, t901); let t903 = circuit_sub(in203, in13); let t904 = circuit_mul(in3, t903); let t905 = circuit_inverse(t904); let t906 = circuit_mul(in140, t905); let t907 = circuit_add(t900, t906); let t908 = circuit_sub(in203, in14); let t909 = circuit_mul(t902, t908); let t910 = circuit_sub(in203, in14); let t911 = circuit_mul(in2, t910); let t912 = circuit_inverse(t911); let t913 = circuit_mul(in141, t912); let t914 = circuit_add(t907, t913); let t915 = circuit_mul(t914, t909); let t916 = circuit_sub(t847, in0); let t917 = circuit_mul(in203, t916); let t918 = circuit_add(in0, t917); let t919 = circuit_mul(t845, t918); let t920 = circuit_mul(t846, in211); let t921 = circuit_mul(t847, t847); let t922 = circuit_add(in142, in143); let t923 = circuit_sub(t922, t915); let t924 = circuit_mul(t923, t920); let t925 = circuit_add(t851, t924); let t926 = circuit_sub(in204, in7); let t927 = circuit_mul(in0, t926); let t928 = circuit_sub(in204, in7); let t929 = circuit_mul(in2, t928); let t930 = circuit_inverse(t929); let t931 = circuit_mul(in142, t930); let t932 = circuit_add(in7, t931); let t933 = circuit_sub(in204, in0); let t934 = circuit_mul(t927, t933); let t935 = circuit_sub(in204, in0); let t936 = circuit_mul(in3, t935); let t937 = circuit_inverse(t936); let t938 = circuit_mul(in143, t937); let t939 = circuit_add(t932, t938); let t940 = circuit_sub(in204, in8); let t941 = circuit_mul(t934, t940); let t942 = circuit_sub(in204, in8); let t943 = circuit_mul(in4, t942); let t944 = circuit_inverse(t943); let t945 = circuit_mul(in144, t944); let t946 = circuit_add(t939, t945); let t947 = circuit_sub(in204, in9); let t948 = circuit_mul(t941, t947); let t949 = circuit_sub(in204, in9); let t950 = circuit_mul(in5, t949); let t951 = circuit_inverse(t950); let t952 = circuit_mul(in145, t951); let t953 = circuit_add(t946, t952); let t954 = circuit_sub(in204, in10); let t955 = circuit_mul(t948, t954); let t956 = circuit_sub(in204, in10); let t957 = circuit_mul(in6, t956); let t958 = circuit_inverse(t957); let t959 = circuit_mul(in146, t958); let t960 = circuit_add(t953, t959); let t961 = circuit_sub(in204, in11); let t962 = circuit_mul(t955, t961); let t963 = circuit_sub(in204, in11); let t964 = circuit_mul(in5, t963); let t965 = circuit_inverse(t964); let t966 = circuit_mul(in147, t965); let t967 = circuit_add(t960, t966); let t968 = circuit_sub(in204, in12); let t969 = circuit_mul(t962, t968); let t970 = circuit_sub(in204, in12); let t971 = circuit_mul(in4, t970); let t972 = circuit_inverse(t971); let t973 = circuit_mul(in148, t972); let t974 = circuit_add(t967, t973); let t975 = circuit_sub(in204, in13); let t976 = circuit_mul(t969, t975); let t977 = circuit_sub(in204, in13); let t978 = circuit_mul(in3, t977); let t979 = circuit_inverse(t978); let t980 = circuit_mul(in149, t979); let t981 = circuit_add(t974, t980); let t982 = circuit_sub(in204, in14); let t983 = circuit_mul(t976, t982); let t984 = circuit_sub(in204, in14); let t985 = circuit_mul(in2, t984); let t986 = circuit_inverse(t985); let t987 = circuit_mul(in150, t986); let t988 = circuit_add(t981, t987); let t989 = circuit_mul(t988, t983); let t990 = circuit_sub(t921, in0); let t991 = circuit_mul(in204, t990); let t992 = circuit_add(in0, t991); let t993 = circuit_mul(t919, t992); let t994 = circuit_sub(in158, in9); let t995 = circuit_mul(t994, in151); let t996 = circuit_mul(t995, in180); let t997 = circuit_mul(t996, in179); let t998 = circuit_mul(t997, in15); let t999 = circuit_mul(in153, in179); let t1000 = circuit_mul(in154, in180); let t1001 = circuit_mul(in155, in181); let t1002 = circuit_mul(in156, in182); let t1003 = circuit_add(t998, t999); let t1004 = circuit_add(t1003, t1000); let t1005 = circuit_add(t1004, t1001); let t1006 = circuit_add(t1005, t1002); let t1007 = circuit_add(t1006, in152); let t1008 = circuit_sub(in158, in0); let t1009 = circuit_mul(t1008, in190); let t1010 = circuit_add(t1007, t1009); let t1011 = circuit_mul(t1010, in158); let t1012 = circuit_mul(t1011, t993); let t1013 = circuit_add(in179, in182); let t1014 = circuit_add(t1013, in151); let t1015 = circuit_sub(t1014, in187); let t1016 = circuit_sub(in158, in8); let t1017 = circuit_mul(t1015, t1016); let t1018 = circuit_sub(in158, in0); let t1019 = circuit_mul(t1017, t1018); let t1020 = circuit_mul(t1019, in158); let t1021 = circuit_mul(t1020, t993); let t1022 = circuit_mul(in169, in209); let t1023 = circuit_add(in179, t1022); let t1024 = circuit_add(t1023, in210); let t1025 = circuit_mul(in170, in209); let t1026 = circuit_add(in180, t1025); let t1027 = circuit_add(t1026, in210); let t1028 = circuit_mul(t1024, t1027); let t1029 = circuit_mul(in171, in209); let t1030 = circuit_add(in181, t1029); let t1031 = circuit_add(t1030, in210); let t1032 = circuit_mul(t1028, t1031); let t1033 = circuit_mul(in172, in209); let t1034 = circuit_add(in182, t1033); let t1035 = circuit_add(t1034, in210); let t1036 = circuit_mul(t1032, t1035); let t1037 = circuit_mul(in165, in209); let t1038 = circuit_add(in179, t1037); let t1039 = circuit_add(t1038, in210); let t1040 = circuit_mul(in166, in209); let t1041 = circuit_add(in180, t1040); let t1042 = circuit_add(t1041, in210); let t1043 = circuit_mul(t1039, t1042); let t1044 = circuit_mul(in167, in209); let t1045 = circuit_add(in181, t1044); let t1046 = circuit_add(t1045, in210); let t1047 = circuit_mul(t1043, t1046); let t1048 = circuit_mul(in168, in209); let t1049 = circuit_add(in182, t1048); let t1050 = circuit_add(t1049, in210); let t1051 = circuit_mul(t1047, t1050); let t1052 = circuit_add(in183, in177); let t1053 = circuit_mul(t1036, t1052); let t1054 = circuit_mul(in178, t107); let t1055 = circuit_add(in191, t1054); let t1056 = circuit_mul(t1051, t1055); let t1057 = circuit_sub(t1053, t1056); let t1058 = circuit_mul(t1057, t993); let t1059 = circuit_mul(in178, in191); let t1060 = circuit_mul(t1059, t993); let t1061 = circuit_mul(in174, in206); let t1062 = circuit_mul(in175, in207); let t1063 = circuit_mul(in176, in208); let t1064 = circuit_add(in173, in210); let t1065 = circuit_add(t1064, t1061); let t1066 = circuit_add(t1065, t1062); let t1067 = circuit_add(t1066, t1063); let t1068 = circuit_mul(in154, in187); let t1069 = circuit_add(in179, in210); let t1070 = circuit_add(t1069, t1068); let t1071 = circuit_mul(in151, in188); let t1072 = circuit_add(in180, t1071); let t1073 = circuit_mul(in152, in189); let t1074 = circuit_add(in181, t1073); let t1075 = circuit_mul(t1072, in206); let t1076 = circuit_mul(t1074, in207); let t1077 = circuit_mul(in155, in208); let t1078 = circuit_add(t1070, t1075); let t1079 = circuit_add(t1078, t1076); let t1080 = circuit_add(t1079, t1077); let t1081 = circuit_mul(in184, t1067); let t1082 = circuit_mul(in184, t1080); let t1083 = circuit_add(in186, in157); let t1084 = circuit_mul(in186, in157); let t1085 = circuit_sub(t1083, t1084); let t1086 = circuit_mul(t1080, t1067); let t1087 = circuit_mul(t1086, in184); let t1088 = circuit_sub(t1087, t1085); let t1089 = circuit_mul(t1088, t993); let t1090 = circuit_mul(in157, t1081); let t1091 = circuit_mul(in185, t1082); let t1092 = circuit_sub(t1090, t1091); let t1093 = circuit_mul(in186, in186); let t1094 = circuit_sub(t1093, in186); let t1095 = circuit_mul(t1094, t993); let t1096 = circuit_mul(in159, t993); let t1097 = circuit_sub(in180, in179); let t1098 = circuit_sub(in181, in180); let t1099 = circuit_sub(in182, in181); let t1100 = circuit_sub(in187, in182); let t1101 = circuit_add(t1097, in16); let t1102 = circuit_add(t1101, in16); let t1103 = circuit_add(t1102, in16); let t1104 = circuit_mul(t1097, t1101); let t1105 = circuit_mul(t1104, t1102); let t1106 = circuit_mul(t1105, t1103); let t1107 = circuit_mul(t1106, t1096); let t1108 = circuit_add(t1098, in16); let t1109 = circuit_add(t1108, in16); let t1110 = circuit_add(t1109, in16); let t1111 = circuit_mul(t1098, t1108); let t1112 = circuit_mul(t1111, t1109); let t1113 = circuit_mul(t1112, t1110); let t1114 = circuit_mul(t1113, t1096); let t1115 = circuit_add(t1099, in16); let t1116 = circuit_add(t1115, in16); let t1117 = circuit_add(t1116, in16); let t1118 = circuit_mul(t1099, t1115); let t1119 = circuit_mul(t1118, t1116); let t1120 = circuit_mul(t1119, t1117); let t1121 = circuit_mul(t1120, t1096); let t1122 = circuit_add(t1100, in16); let t1123 = circuit_add(t1122, in16); let t1124 = circuit_add(t1123, in16); let t1125 = circuit_mul(t1100, t1122); let t1126 = circuit_mul(t1125, t1123); let t1127 = circuit_mul(t1126, t1124); let t1128 = circuit_mul(t1127, t1096); let t1129 = circuit_sub(in187, in180); let t1130 = circuit_mul(in181, in181); let t1131 = circuit_mul(in190, in190); let t1132 = circuit_mul(in181, in190); let t1133 = circuit_mul(t1132, in153); let t1134 = circuit_add(in188, in187); let t1135 = circuit_add(t1134, in180); let t1136 = circuit_mul(t1135, t1129); let t1137 = circuit_mul(t1136, t1129); let t1138 = circuit_sub(t1137, t1131); let t1139 = circuit_sub(t1138, t1130); let t1140 = circuit_add(t1139, t1133); let t1141 = circuit_add(t1140, t1133); let t1142 = circuit_sub(in0, in151); let t1143 = circuit_mul(t1141, t993); let t1144 = circuit_mul(t1143, in160); let t1145 = circuit_mul(t1144, t1142); let t1146 = circuit_add(in181, in189); let t1147 = circuit_mul(in190, in153); let t1148 = circuit_sub(t1147, in181); let t1149 = circuit_mul(t1146, t1129); let t1150 = circuit_sub(in188, in180); let t1151 = circuit_mul(t1150, t1148); let t1152 = circuit_add(t1149, t1151); let t1153 = circuit_mul(t1152, t993); let t1154 = circuit_mul(t1153, in160); let t1155 = circuit_mul(t1154, t1142); let t1156 = circuit_add(t1130, in17); let t1157 = circuit_mul(t1156, in180); let t1158 = circuit_add(t1130, t1130); let t1159 = circuit_add(t1158, t1158); let t1160 = circuit_mul(t1157, in18); let t1161 = circuit_add(in188, in180); let t1162 = circuit_add(t1161, in180); let t1163 = circuit_mul(t1162, t1159); let t1164 = circuit_sub(t1163, t1160); let t1165 = circuit_mul(t1164, t993); let t1166 = circuit_mul(t1165, in160); let t1167 = circuit_mul(t1166, in151); let t1168 = circuit_add(t1145, t1167); let t1169 = circuit_add(in180, in180); let t1170 = circuit_add(t1169, in180); let t1171 = circuit_mul(t1170, in180); let t1172 = circuit_sub(in180, in188); let t1173 = circuit_mul(t1171, t1172); let t1174 = circuit_add(in181, in181); let t1175 = circuit_add(in181, in189); let t1176 = circuit_mul(t1174, t1175); let t1177 = circuit_sub(t1173, t1176); let t1178 = circuit_mul(t1177, t993); let t1179 = circuit_mul(t1178, in160); let t1180 = circuit_mul(t1179, in151); let t1181 = circuit_add(t1155, t1180); let t1182 = circuit_mul(in181, in208); let t1183 = circuit_mul(in180, in207); let t1184 = circuit_add(t1182, t1183); let t1185 = circuit_mul(in179, in206); let t1186 = circuit_add(t1184, t1185); let t1187 = circuit_add(t1186, in152); let t1188 = circuit_sub(t1187, in182); let t1189 = circuit_sub(in187, in179); let t1190 = circuit_sub(in190, in182); let t1191 = circuit_sub(t1189, in0); let t1192 = circuit_mul(t1189, t1191); let t1193 = circuit_mul(t1189, in16); let t1194 = circuit_add(t1193, in0); let t1195 = circuit_mul(t1194, t1190); let t1196 = circuit_mul(in153, in154); let t1197 = circuit_mul(in161, t993); let t1198 = circuit_mul(t1196, t1197); let t1199 = circuit_mul(t1195, t1198); let t1200 = circuit_mul(t1192, t1198); let t1201 = circuit_mul(t1188, t1196); let t1202 = circuit_sub(in182, t1187); let t1203 = circuit_sub(t1202, in0); let t1204 = circuit_mul(t1202, t1203); let t1205 = circuit_mul(in189, in208); let t1206 = circuit_mul(in188, in207); let t1207 = circuit_mul(in187, in206); let t1208 = circuit_add(t1205, t1206); let t1209 = circuit_add(t1208, t1207); let t1210 = circuit_sub(in190, t1209); let t1211 = circuit_sub(in189, in181); let t1212 = circuit_mul(t1189, in16); let t1213 = circuit_add(t1212, in0); let t1214 = circuit_mul(t1210, in16); let t1215 = circuit_add(t1214, in0); let t1216 = circuit_mul(t1213, t1211); let t1217 = circuit_mul(t1216, t1215); let t1218 = circuit_mul(t1210, t1210); let t1219 = circuit_sub(t1218, t1210); let t1220 = circuit_mul(in155, t1197); let t1221 = circuit_mul(t1217, t1220); let t1222 = circuit_mul(t1192, t1220); let t1223 = circuit_mul(t1219, t1220); let t1224 = circuit_mul(t1204, in155); let t1225 = circuit_sub(in188, in180); let t1226 = circuit_mul(t1189, in16); let t1227 = circuit_add(t1226, in0); let t1228 = circuit_mul(t1227, t1225); let t1229 = circuit_sub(t1228, in181); let t1230 = circuit_mul(in156, in153); let t1231 = circuit_mul(t1229, t1230); let t1232 = circuit_mul(in151, in153); let t1233 = circuit_mul(t1188, t1232); let t1234 = circuit_add(t1201, t1231); let t1235 = circuit_add(t1234, t1233); let t1236 = circuit_add(t1235, t1224); let t1237 = circuit_mul(t1236, t1197); let t1238 = circuit_mul(in179, in188); let t1239 = circuit_mul(in187, in180); let t1240 = circuit_add(t1238, t1239); let t1241 = circuit_mul(in179, in182); let t1242 = circuit_mul(in180, in181); let t1243 = circuit_add(t1241, t1242); let t1244 = circuit_sub(t1243, in189); let t1245 = circuit_mul(t1244, in19); let t1246 = circuit_sub(t1245, in190); let t1247 = circuit_add(t1246, t1240); let t1248 = circuit_mul(t1247, in156); let t1249 = circuit_mul(t1240, in19); let t1250 = circuit_mul(in187, in188); let t1251 = circuit_add(t1249, t1250); let t1252 = circuit_add(in181, in182); let t1253 = circuit_sub(t1251, t1252); let t1254 = circuit_mul(t1253, in155); let t1255 = circuit_add(t1251, in182); let t1256 = circuit_add(in189, in190); let t1257 = circuit_sub(t1255, t1256); let t1258 = circuit_mul(t1257, in151); let t1259 = circuit_add(t1254, t1248); let t1260 = circuit_add(t1259, t1258); let t1261 = circuit_mul(t1260, in154); let t1262 = circuit_mul(in188, in20); let t1263 = circuit_add(t1262, in187); let t1264 = circuit_mul(t1263, in20); let t1265 = circuit_add(t1264, in181); let t1266 = circuit_mul(t1265, in20); let t1267 = circuit_add(t1266, in180); let t1268 = circuit_mul(t1267, in20); let t1269 = circuit_add(t1268, in179); let t1270 = circuit_sub(t1269, in182); let t1271 = circuit_mul(t1270, in156); let t1272 = circuit_mul(in189, in20); let t1273 = circuit_add(t1272, in188); let t1274 = circuit_mul(t1273, in20); let t1275 = circuit_add(t1274, in187); let t1276 = circuit_mul(t1275, in20); let t1277 = circuit_add(t1276, in182); let t1278 = circuit_mul(t1277, in20); let t1279 = circuit_add(t1278, in181); let t1280 = circuit_sub(t1279, in190); let t1281 = circuit_mul(t1280, in151); let t1282 = circuit_add(t1271, t1281); let t1283 = circuit_mul(t1282, in155); let t1284 = circuit_add(t1261, t1283); let t1285 = circuit_mul(t1284, in162); let t1286 = circuit_mul(t1285, t993); let t1287 = circuit_add(in179, in153); let t1288 = circuit_add(in180, in154); let t1289 = circuit_add(in181, in155); let t1290 = circuit_add(in182, in156); let t1291 = circuit_mul(t1287, t1287); let t1292 = circuit_mul(t1291, t1291); let t1293 = circuit_mul(t1292, t1287); let t1294 = circuit_mul(t1288, t1288); let t1295 = circuit_mul(t1294, t1294); let t1296 = circuit_mul(t1295, t1288); let t1297 = circuit_mul(t1289, t1289); let t1298 = circuit_mul(t1297, t1297); let t1299 = circuit_mul(t1298, t1289); let t1300 = circuit_mul(t1290, t1290); let t1301 = circuit_mul(t1300, t1300); let t1302 = circuit_mul(t1301, t1290); let t1303 = circuit_add(t1293, t1296); let t1304 = circuit_add(t1299, t1302); let t1305 = circuit_add(t1296, t1296); let t1306 = circuit_add(t1305, t1304); let t1307 = circuit_add(t1302, t1302); let t1308 = circuit_add(t1307, t1303); let t1309 = circuit_add(t1304, t1304); let t1310 = circuit_add(t1309, t1309); let t1311 = circuit_add(t1310, t1308); let t1312 = circuit_add(t1303, t1303); let t1313 = circuit_add(t1312, t1312); let t1314 = circuit_add(t1313, t1306); let t1315 = circuit_add(t1308, t1314); let t1316 = circuit_add(t1306, t1311); let t1317 = circuit_mul(in163, t993); let t1318 = circuit_sub(t1315, in187); let t1319 = circuit_mul(t1317, t1318); let t1320 = circuit_sub(t1314, in188); let t1321 = circuit_mul(t1317, t1320); let t1322 = circuit_sub(t1316, in189); let t1323 = circuit_mul(t1317, t1322); let t1324 = circuit_sub(t1311, in190); let t1325 = circuit_mul(t1317, t1324); let t1326 = circuit_add(in179, in153); let t1327 = circuit_mul(t1326, t1326); let t1328 = circuit_mul(t1327, t1327); let t1329 = circuit_mul(t1328, t1326); let t1330 = circuit_add(t1329, in180); let t1331 = circuit_add(t1330, in181); let t1332 = circuit_add(t1331, in182); let t1333 = circuit_mul(in164, t993); let t1334 = circuit_mul(t1329, in21); let t1335 = circuit_add(t1334, t1332); let t1336 = circuit_sub(t1335, in187); let t1337 = circuit_mul(t1333, t1336); let t1338 = circuit_mul(in180, in22); let t1339 = circuit_add(t1338, t1332); let t1340 = circuit_sub(t1339, in188); let t1341 = circuit_mul(t1333, t1340); let t1342 = circuit_mul(in181, in23); let t1343 = circuit_add(t1342, t1332); let t1344 = circuit_sub(t1343, in189); let t1345 = circuit_mul(t1333, t1344); let t1346 = circuit_mul(in182, in24); let t1347 = circuit_add(t1346, t1332); let t1348 = circuit_sub(t1347, in190); let t1349 = circuit_mul(t1333, t1348); let t1350 = circuit_mul(t1021, in212); let t1351 = circuit_add(t1012, t1350); let t1352 = circuit_mul(in212, in212); let t1353 = circuit_mul(t1058, t1352); let t1354 = circuit_add(t1351, t1353); let t1355 = circuit_mul(t1352, in212); let t1356 = circuit_mul(t1060, t1355); let t1357 = circuit_add(t1354, t1356); let t1358 = circuit_mul(t1355, in212); let t1359 = circuit_mul(t1089, t1358); let t1360 = circuit_add(t1357, t1359); let t1361 = circuit_mul(t1358, in212); let t1362 = circuit_mul(t1092, t1361); let t1363 = circuit_add(t1360, t1362); let t1364 = circuit_mul(t1361, in212); let t1365 = circuit_mul(t1095, t1364); let t1366 = circuit_add(t1363, t1365); let t1367 = circuit_mul(t1364, in212); let t1368 = circuit_mul(t1107, t1367); let t1369 = circuit_add(t1366, t1368); let t1370 = circuit_mul(t1367, in212); let t1371 = circuit_mul(t1114, t1370); let t1372 = circuit_add(t1369, t1371); let t1373 = circuit_mul(t1370, in212); let t1374 = circuit_mul(t1121, t1373); let t1375 = circuit_add(t1372, t1374); let t1376 = circuit_mul(t1373, in212); let t1377 = circuit_mul(t1128, t1376); let t1378 = circuit_add(t1375, t1377); let t1379 = circuit_mul(t1376, in212); let t1380 = circuit_mul(t1168, t1379); let t1381 = circuit_add(t1378, t1380); let t1382 = circuit_mul(t1379, in212); let t1383 = circuit_mul(t1181, t1382); let t1384 = circuit_add(t1381, t1383); let t1385 = circuit_mul(t1382, in212); let t1386 = circuit_mul(t1237, t1385); let t1387 = circuit_add(t1384, t1386); let t1388 = circuit_mul(t1385, in212); let t1389 = circuit_mul(t1199, t1388); let t1390 = circuit_add(t1387, t1389); let t1391 = circuit_mul(t1388, in212); let t1392 = circuit_mul(t1200, t1391); let t1393 = circuit_add(t1390, t1392); let t1394 = circuit_mul(t1391, in212); let t1395 = circuit_mul(t1221, t1394); let t1396 = circuit_add(t1393, t1395); let t1397 = circuit_mul(t1394, in212); let t1398 = circuit_mul(t1222, t1397); let t1399 = circuit_add(t1396, t1398); let t1400 = circuit_mul(t1397, in212); let t1401 = circuit_mul(t1223, t1400); let t1402 = circuit_add(t1399, t1401); let t1403 = circuit_mul(t1400, in212); let t1404 = circuit_mul(t1286, t1403); let t1405 = circuit_add(t1402, t1404); let t1406 = circuit_mul(t1403, in212); let t1407 = circuit_mul(t1319, t1406); let t1408 = circuit_add(t1405, t1407); let t1409 = circuit_mul(t1406, in212); let t1410 = circuit_mul(t1321, t1409); let t1411 = circuit_add(t1408, t1410); let t1412 = circuit_mul(t1409, in212); let t1413 = circuit_mul(t1323, t1412); let t1414 = circuit_add(t1411, t1413); let t1415 = circuit_mul(t1412, in212); let t1416 = circuit_mul(t1325, t1415); let t1417 = circuit_add(t1414, t1416); let t1418 = circuit_mul(t1415, in212); let t1419 = circuit_mul(t1337, t1418); let t1420 = circuit_add(t1417, t1419); let t1421 = circuit_mul(t1418, in212); let t1422 = circuit_mul(t1341, t1421); let t1423 = circuit_add(t1420, t1422); let t1424 = circuit_mul(t1421, in212); let t1425 = circuit_mul(t1345, t1424); let t1426 = circuit_add(t1423, t1425); let t1427 = circuit_mul(t1424, in212); let t1428 = circuit_mul(t1349, t1427); let t1429 = circuit_add(t1426, t1428); let t1430 = circuit_mul(in195, in196); let t1431 = circuit_mul(t1430, in197); let t1432 = circuit_mul(t1431, in198); let t1433 = circuit_mul(t1432, in199); let t1434 = circuit_mul(t1433, in200); let t1435 = circuit_mul(t1434, in201); let t1436 = circuit_mul(t1435, in202); let t1437 = circuit_mul(t1436, in203); let t1438 = circuit_mul(t1437, in204); let t1439 = circuit_sub(in0, t1438); let t1440 = circuit_mul(t1429, t1439); let t1441 = circuit_mul(in192, in213); let t1442 = circuit_add(t1440, t1441); let t1443 = circuit_sub(t1442, t989); let modulus = modulus; let mut circuit_inputs = (t925, t1443).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(ZK_HONK_SUMCHECK_SIZE_12_PUB_17_GRUMPKIN_CONSTANTS.span()); // in0 - in24 // Fill inputs: for val in p_public_inputs { circuit_inputs = circuit_inputs.next_u256(*val); } // in25 - in25 for val in p_pairing_point_object { circuit_inputs = circuit_inputs.next_u256(*val); } // in26 - in41 circuit_inputs = circuit_inputs.next_2(libra_sum); // in42 for val in sumcheck_univariates_flat { circuit_inputs = circuit_inputs.next_u256(*val); } // in43 - in150 for val in sumcheck_evaluations { circuit_inputs = circuit_inputs.next_u256(*val); } // in151 - in191 circuit_inputs = circuit_inputs.next_2(libra_evaluation); // in192 for val in tp_sum_check_u_challenges { circuit_inputs = circuit_inputs.next_u128(*val); } // in193 - in204 circuit_inputs = circuit_inputs.next_u128(tp_gate_challenge); // in205 circuit_inputs = circuit_inputs.next_2(tp_eta_1); // in206 circuit_inputs = circuit_inputs.next_2(tp_eta_2); // in207 circuit_inputs = circuit_inputs.next_2(tp_eta_3); // in208 circuit_inputs = circuit_inputs.next_2(tp_beta); // in209 circuit_inputs = circuit_inputs.next_2(tp_gamma); // in210 circuit_inputs = circuit_inputs.next_2(tp_base_rlc); // in211 circuit_inputs = circuit_inputs.next_u128(tp_alpha); // in212 circuit_inputs = circuit_inputs.next_2(tp_libra_challenge); // in213 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let check_rlc: u384 = outputs.get_output(t925); let check: u384 = outputs.get_output(t1443); return (check_rlc, check); } const ZK_HONK_SUMCHECK_SIZE_12_PUB_17_GRUMPKIN_CONSTANTS: [u384; 25] = [ u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x10000000, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x9d80, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x79b9709143e1f593efffec51, limb1: 0xb85045b68181585d2833e848, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x5a0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x79b9709143e1f593effffd31, limb1: 0xb85045b68181585d2833e848, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x240, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x2, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x3, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x4, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x5, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x6, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x7, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x8, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x3cdcb848a1f0fac9f8000000, limb1: 0xdc2822db40c0ac2e9419f424, limb2: 0x183227397098d014, limb3: 0x0, }, u384 { limb0: 0x79b9709143e1f593f0000000, limb1: 0xb85045b68181585d2833e848, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x11, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x9, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x100000000000000000, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x4000, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x29ca1d7fb56821fd19d3b6e7, limb1: 0x4b1e03b4bd9490c0d03f989, limb2: 0x10dc6e9c006ea38b, limb3: 0x0, }, u384 { limb0: 0xd4dd9b84a86b38cfb45a740b, limb1: 0x149b3d0a30b3bb599df9756, limb2: 0xc28145b6a44df3e, limb3: 0x0, }, u384 { limb0: 0x60e3596170067d00141cac15, limb1: 0xb2c7645a50392798b21f75bb, limb2: 0x544b8338791518, limb3: 0x0, }, u384 { limb0: 0xb8fa852613bc534433ee428b, limb1: 0x2e2e82eb122789e352e105a3, limb2: 0x222c01175718386f, limb3: 0x0, }, ]; #[inline(always)] pub fn run_GRUMPKIN_ZKHONK_PREP_MSM_SCALARS_SIZE_12_circuit( p_sumcheck_evaluations: Span, p_gemini_masking_eval: u384, p_gemini_a_evaluations: Span, p_libra_poly_evals: Span, tp_gemini_r: u384, tp_rho: u384, tp_shplonk_z: u384, tp_shplonk_nu: u384, tp_sum_check_u_challenges: Span, modulus: core::circuit::CircuitModulus, ) -> ( u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, ) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x1 let in2 = CE::> {}; // 0x7b0c561a6148404f086204a9f36ffb0617942546750f230c893619174a57a76 // INPUT stack let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let (in24, in25, in26) = (CE::> {}, CE::> {}, CE::> {}); let (in27, in28, in29) = (CE::> {}, CE::> {}, CE::> {}); let (in30, in31, in32) = (CE::> {}, CE::> {}, CE::> {}); let (in33, in34, in35) = (CE::> {}, CE::> {}, CE::> {}); let (in36, in37, in38) = (CE::> {}, CE::> {}, CE::> {}); let (in39, in40, in41) = (CE::> {}, CE::> {}, CE::> {}); let (in42, in43, in44) = (CE::> {}, CE::> {}, CE::> {}); let (in45, in46, in47) = (CE::> {}, CE::> {}, CE::> {}); let (in48, in49, in50) = (CE::> {}, CE::> {}, CE::> {}); let (in51, in52, in53) = (CE::> {}, CE::> {}, CE::> {}); let (in54, in55, in56) = (CE::> {}, CE::> {}, CE::> {}); let (in57, in58, in59) = (CE::> {}, CE::> {}, CE::> {}); let (in60, in61, in62) = (CE::> {}, CE::> {}, CE::> {}); let (in63, in64, in65) = (CE::> {}, CE::> {}, CE::> {}); let (in66, in67, in68) = (CE::> {}, CE::> {}, CE::> {}); let (in69, in70, in71) = (CE::> {}, CE::> {}, CE::> {}); let (in72, in73, in74) = (CE::> {}, CE::> {}, CE::> {}); let (in75, in76) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in61, in61); let t1 = circuit_mul(t0, t0); let t2 = circuit_mul(t1, t1); let t3 = circuit_mul(t2, t2); let t4 = circuit_mul(t3, t3); let t5 = circuit_mul(t4, t4); let t6 = circuit_mul(t5, t5); let t7 = circuit_mul(t6, t6); let t8 = circuit_mul(t7, t7); let t9 = circuit_mul(t8, t8); let t10 = circuit_mul(t9, t9); let t11 = circuit_sub(in63, in61); let t12 = circuit_inverse(t11); let t13 = circuit_add(in63, in61); let t14 = circuit_inverse(t13); let t15 = circuit_mul(in64, t14); let t16 = circuit_add(t12, t15); let t17 = circuit_inverse(in61); let t18 = circuit_mul(in64, t14); let t19 = circuit_sub(t12, t18); let t20 = circuit_mul(t17, t19); let t21 = circuit_sub(in0, t20); let t22 = circuit_sub(in0, t16); let t23 = circuit_mul(t22, in62); let t24 = circuit_mul(in3, in62); let t25 = circuit_add(in44, t24); let t26 = circuit_mul(in62, in62); let t27 = circuit_mul(t22, t26); let t28 = circuit_mul(in4, t26); let t29 = circuit_add(t25, t28); let t30 = circuit_mul(t26, in62); let t31 = circuit_mul(t22, t30); let t32 = circuit_mul(in5, t30); let t33 = circuit_add(t29, t32); let t34 = circuit_mul(t30, in62); let t35 = circuit_mul(t22, t34); let t36 = circuit_mul(in6, t34); let t37 = circuit_add(t33, t36); let t38 = circuit_mul(t34, in62); let t39 = circuit_mul(t22, t38); let t40 = circuit_mul(in7, t38); let t41 = circuit_add(t37, t40); let t42 = circuit_mul(t38, in62); let t43 = circuit_mul(t22, t42); let t44 = circuit_mul(in8, t42); let t45 = circuit_add(t41, t44); let t46 = circuit_mul(t42, in62); let t47 = circuit_mul(t22, t46); let t48 = circuit_mul(in9, t46); let t49 = circuit_add(t45, t48); let t50 = circuit_mul(t46, in62); let t51 = circuit_mul(t22, t50); let t52 = circuit_mul(in10, t50); let t53 = circuit_add(t49, t52); let t54 = circuit_mul(t50, in62); let t55 = circuit_mul(t22, t54); let t56 = circuit_mul(in11, t54); let t57 = circuit_add(t53, t56); let t58 = circuit_mul(t54, in62); let t59 = circuit_mul(t22, t58); let t60 = circuit_mul(in12, t58); let t61 = circuit_add(t57, t60); let t62 = circuit_mul(t58, in62); let t63 = circuit_mul(t22, t62); let t64 = circuit_mul(in13, t62); let t65 = circuit_add(t61, t64); let t66 = circuit_mul(t62, in62); let t67 = circuit_mul(t22, t66); let t68 = circuit_mul(in14, t66); let t69 = circuit_add(t65, t68); let t70 = circuit_mul(t66, in62); let t71 = circuit_mul(t22, t70); let t72 = circuit_mul(in15, t70); let t73 = circuit_add(t69, t72); let t74 = circuit_mul(t70, in62); let t75 = circuit_mul(t22, t74); let t76 = circuit_mul(in16, t74); let t77 = circuit_add(t73, t76); let t78 = circuit_mul(t74, in62); let t79 = circuit_mul(t22, t78); let t80 = circuit_mul(in17, t78); let t81 = circuit_add(t77, t80); let t82 = circuit_mul(t78, in62); let t83 = circuit_mul(t22, t82); let t84 = circuit_mul(in18, t82); let t85 = circuit_add(t81, t84); let t86 = circuit_mul(t82, in62); let t87 = circuit_mul(t22, t86); let t88 = circuit_mul(in19, t86); let t89 = circuit_add(t85, t88); let t90 = circuit_mul(t86, in62); let t91 = circuit_mul(t22, t90); let t92 = circuit_mul(in20, t90); let t93 = circuit_add(t89, t92); let t94 = circuit_mul(t90, in62); let t95 = circuit_mul(t22, t94); let t96 = circuit_mul(in21, t94); let t97 = circuit_add(t93, t96); let t98 = circuit_mul(t94, in62); let t99 = circuit_mul(t22, t98); let t100 = circuit_mul(in22, t98); let t101 = circuit_add(t97, t100); let t102 = circuit_mul(t98, in62); let t103 = circuit_mul(t22, t102); let t104 = circuit_mul(in23, t102); let t105 = circuit_add(t101, t104); let t106 = circuit_mul(t102, in62); let t107 = circuit_mul(t22, t106); let t108 = circuit_mul(in24, t106); let t109 = circuit_add(t105, t108); let t110 = circuit_mul(t106, in62); let t111 = circuit_mul(t22, t110); let t112 = circuit_mul(in25, t110); let t113 = circuit_add(t109, t112); let t114 = circuit_mul(t110, in62); let t115 = circuit_mul(t22, t114); let t116 = circuit_mul(in26, t114); let t117 = circuit_add(t113, t116); let t118 = circuit_mul(t114, in62); let t119 = circuit_mul(t22, t118); let t120 = circuit_mul(in27, t118); let t121 = circuit_add(t117, t120); let t122 = circuit_mul(t118, in62); let t123 = circuit_mul(t22, t122); let t124 = circuit_mul(in28, t122); let t125 = circuit_add(t121, t124); let t126 = circuit_mul(t122, in62); let t127 = circuit_mul(t22, t126); let t128 = circuit_mul(in29, t126); let t129 = circuit_add(t125, t128); let t130 = circuit_mul(t126, in62); let t131 = circuit_mul(t22, t130); let t132 = circuit_mul(in30, t130); let t133 = circuit_add(t129, t132); let t134 = circuit_mul(t130, in62); let t135 = circuit_mul(t22, t134); let t136 = circuit_mul(in31, t134); let t137 = circuit_add(t133, t136); let t138 = circuit_mul(t134, in62); let t139 = circuit_mul(t22, t138); let t140 = circuit_mul(in32, t138); let t141 = circuit_add(t137, t140); let t142 = circuit_mul(t138, in62); let t143 = circuit_mul(t22, t142); let t144 = circuit_mul(in33, t142); let t145 = circuit_add(t141, t144); let t146 = circuit_mul(t142, in62); let t147 = circuit_mul(t22, t146); let t148 = circuit_mul(in34, t146); let t149 = circuit_add(t145, t148); let t150 = circuit_mul(t146, in62); let t151 = circuit_mul(t22, t150); let t152 = circuit_mul(in35, t150); let t153 = circuit_add(t149, t152); let t154 = circuit_mul(t150, in62); let t155 = circuit_mul(t22, t154); let t156 = circuit_mul(in36, t154); let t157 = circuit_add(t153, t156); let t158 = circuit_mul(t154, in62); let t159 = circuit_mul(t22, t158); let t160 = circuit_mul(in37, t158); let t161 = circuit_add(t157, t160); let t162 = circuit_mul(t158, in62); let t163 = circuit_mul(t22, t162); let t164 = circuit_mul(in38, t162); let t165 = circuit_add(t161, t164); let t166 = circuit_mul(t162, in62); let t167 = circuit_mul(t21, t166); let t168 = circuit_add(t135, t167); let t169 = circuit_mul(in39, t166); let t170 = circuit_add(t165, t169); let t171 = circuit_mul(t166, in62); let t172 = circuit_mul(t21, t171); let t173 = circuit_add(t139, t172); let t174 = circuit_mul(in40, t171); let t175 = circuit_add(t170, t174); let t176 = circuit_mul(t171, in62); let t177 = circuit_mul(t21, t176); let t178 = circuit_add(t143, t177); let t179 = circuit_mul(in41, t176); let t180 = circuit_add(t175, t179); let t181 = circuit_mul(t176, in62); let t182 = circuit_mul(t21, t181); let t183 = circuit_add(t147, t182); let t184 = circuit_mul(in42, t181); let t185 = circuit_add(t180, t184); let t186 = circuit_mul(t181, in62); let t187 = circuit_mul(t21, t186); let t188 = circuit_add(t151, t187); let t189 = circuit_mul(in43, t186); let t190 = circuit_add(t185, t189); let t191 = circuit_sub(in1, in76); let t192 = circuit_mul(t10, t191); let t193 = circuit_mul(t10, t190); let t194 = circuit_add(t193, t193); let t195 = circuit_sub(t192, in76); let t196 = circuit_mul(in56, t195); let t197 = circuit_sub(t194, t196); let t198 = circuit_add(t192, in76); let t199 = circuit_inverse(t198); let t200 = circuit_mul(t197, t199); let t201 = circuit_sub(in1, in75); let t202 = circuit_mul(t9, t201); let t203 = circuit_mul(t9, t200); let t204 = circuit_add(t203, t203); let t205 = circuit_sub(t202, in75); let t206 = circuit_mul(in55, t205); let t207 = circuit_sub(t204, t206); let t208 = circuit_add(t202, in75); let t209 = circuit_inverse(t208); let t210 = circuit_mul(t207, t209); let t211 = circuit_sub(in1, in74); let t212 = circuit_mul(t8, t211); let t213 = circuit_mul(t8, t210); let t214 = circuit_add(t213, t213); let t215 = circuit_sub(t212, in74); let t216 = circuit_mul(in54, t215); let t217 = circuit_sub(t214, t216); let t218 = circuit_add(t212, in74); let t219 = circuit_inverse(t218); let t220 = circuit_mul(t217, t219); let t221 = circuit_sub(in1, in73); let t222 = circuit_mul(t7, t221); let t223 = circuit_mul(t7, t220); let t224 = circuit_add(t223, t223); let t225 = circuit_sub(t222, in73); let t226 = circuit_mul(in53, t225); let t227 = circuit_sub(t224, t226); let t228 = circuit_add(t222, in73); let t229 = circuit_inverse(t228); let t230 = circuit_mul(t227, t229); let t231 = circuit_sub(in1, in72); let t232 = circuit_mul(t6, t231); let t233 = circuit_mul(t6, t230); let t234 = circuit_add(t233, t233); let t235 = circuit_sub(t232, in72); let t236 = circuit_mul(in52, t235); let t237 = circuit_sub(t234, t236); let t238 = circuit_add(t232, in72); let t239 = circuit_inverse(t238); let t240 = circuit_mul(t237, t239); let t241 = circuit_sub(in1, in71); let t242 = circuit_mul(t5, t241); let t243 = circuit_mul(t5, t240); let t244 = circuit_add(t243, t243); let t245 = circuit_sub(t242, in71); let t246 = circuit_mul(in51, t245); let t247 = circuit_sub(t244, t246); let t248 = circuit_add(t242, in71); let t249 = circuit_inverse(t248); let t250 = circuit_mul(t247, t249); let t251 = circuit_sub(in1, in70); let t252 = circuit_mul(t4, t251); let t253 = circuit_mul(t4, t250); let t254 = circuit_add(t253, t253); let t255 = circuit_sub(t252, in70); let t256 = circuit_mul(in50, t255); let t257 = circuit_sub(t254, t256); let t258 = circuit_add(t252, in70); let t259 = circuit_inverse(t258); let t260 = circuit_mul(t257, t259); let t261 = circuit_sub(in1, in69); let t262 = circuit_mul(t3, t261); let t263 = circuit_mul(t3, t260); let t264 = circuit_add(t263, t263); let t265 = circuit_sub(t262, in69); let t266 = circuit_mul(in49, t265); let t267 = circuit_sub(t264, t266); let t268 = circuit_add(t262, in69); let t269 = circuit_inverse(t268); let t270 = circuit_mul(t267, t269); let t271 = circuit_sub(in1, in68); let t272 = circuit_mul(t2, t271); let t273 = circuit_mul(t2, t270); let t274 = circuit_add(t273, t273); let t275 = circuit_sub(t272, in68); let t276 = circuit_mul(in48, t275); let t277 = circuit_sub(t274, t276); let t278 = circuit_add(t272, in68); let t279 = circuit_inverse(t278); let t280 = circuit_mul(t277, t279); let t281 = circuit_sub(in1, in67); let t282 = circuit_mul(t1, t281); let t283 = circuit_mul(t1, t280); let t284 = circuit_add(t283, t283); let t285 = circuit_sub(t282, in67); let t286 = circuit_mul(in47, t285); let t287 = circuit_sub(t284, t286); let t288 = circuit_add(t282, in67); let t289 = circuit_inverse(t288); let t290 = circuit_mul(t287, t289); let t291 = circuit_sub(in1, in66); let t292 = circuit_mul(t0, t291); let t293 = circuit_mul(t0, t290); let t294 = circuit_add(t293, t293); let t295 = circuit_sub(t292, in66); let t296 = circuit_mul(in46, t295); let t297 = circuit_sub(t294, t296); let t298 = circuit_add(t292, in66); let t299 = circuit_inverse(t298); let t300 = circuit_mul(t297, t299); let t301 = circuit_sub(in1, in65); let t302 = circuit_mul(in61, t301); let t303 = circuit_mul(in61, t300); let t304 = circuit_add(t303, t303); let t305 = circuit_sub(t302, in65); let t306 = circuit_mul(in45, t305); let t307 = circuit_sub(t304, t306); let t308 = circuit_add(t302, in65); let t309 = circuit_inverse(t308); let t310 = circuit_mul(t307, t309); let t311 = circuit_mul(t310, t12); let t312 = circuit_mul(in45, in64); let t313 = circuit_mul(t312, t14); let t314 = circuit_add(t311, t313); let t315 = circuit_mul(in64, in64); let t316 = circuit_sub(in63, t0); let t317 = circuit_inverse(t316); let t318 = circuit_add(in63, t0); let t319 = circuit_inverse(t318); let t320 = circuit_mul(t315, t317); let t321 = circuit_mul(in64, t319); let t322 = circuit_mul(t315, t321); let t323 = circuit_add(t322, t320); let t324 = circuit_sub(in0, t323); let t325 = circuit_mul(t322, in46); let t326 = circuit_mul(t320, t300); let t327 = circuit_add(t325, t326); let t328 = circuit_add(t314, t327); let t329 = circuit_mul(in64, in64); let t330 = circuit_mul(t315, t329); let t331 = circuit_sub(in63, t1); let t332 = circuit_inverse(t331); let t333 = circuit_add(in63, t1); let t334 = circuit_inverse(t333); let t335 = circuit_mul(t330, t332); let t336 = circuit_mul(in64, t334); let t337 = circuit_mul(t330, t336); let t338 = circuit_add(t337, t335); let t339 = circuit_sub(in0, t338); let t340 = circuit_mul(t337, in47); let t341 = circuit_mul(t335, t290); let t342 = circuit_add(t340, t341); let t343 = circuit_add(t328, t342); let t344 = circuit_mul(in64, in64); let t345 = circuit_mul(t330, t344); let t346 = circuit_sub(in63, t2); let t347 = circuit_inverse(t346); let t348 = circuit_add(in63, t2); let t349 = circuit_inverse(t348); let t350 = circuit_mul(t345, t347); let t351 = circuit_mul(in64, t349); let t352 = circuit_mul(t345, t351); let t353 = circuit_add(t352, t350); let t354 = circuit_sub(in0, t353); let t355 = circuit_mul(t352, in48); let t356 = circuit_mul(t350, t280); let t357 = circuit_add(t355, t356); let t358 = circuit_add(t343, t357); let t359 = circuit_mul(in64, in64); let t360 = circuit_mul(t345, t359); let t361 = circuit_sub(in63, t3); let t362 = circuit_inverse(t361); let t363 = circuit_add(in63, t3); let t364 = circuit_inverse(t363); let t365 = circuit_mul(t360, t362); let t366 = circuit_mul(in64, t364); let t367 = circuit_mul(t360, t366); let t368 = circuit_add(t367, t365); let t369 = circuit_sub(in0, t368); let t370 = circuit_mul(t367, in49); let t371 = circuit_mul(t365, t270); let t372 = circuit_add(t370, t371); let t373 = circuit_add(t358, t372); let t374 = circuit_mul(in64, in64); let t375 = circuit_mul(t360, t374); let t376 = circuit_sub(in63, t4); let t377 = circuit_inverse(t376); let t378 = circuit_add(in63, t4); let t379 = circuit_inverse(t378); let t380 = circuit_mul(t375, t377); let t381 = circuit_mul(in64, t379); let t382 = circuit_mul(t375, t381); let t383 = circuit_add(t382, t380); let t384 = circuit_sub(in0, t383); let t385 = circuit_mul(t382, in50); let t386 = circuit_mul(t380, t260); let t387 = circuit_add(t385, t386); let t388 = circuit_add(t373, t387); let t389 = circuit_mul(in64, in64); let t390 = circuit_mul(t375, t389); let t391 = circuit_sub(in63, t5); let t392 = circuit_inverse(t391); let t393 = circuit_add(in63, t5); let t394 = circuit_inverse(t393); let t395 = circuit_mul(t390, t392); let t396 = circuit_mul(in64, t394); let t397 = circuit_mul(t390, t396); let t398 = circuit_add(t397, t395); let t399 = circuit_sub(in0, t398); let t400 = circuit_mul(t397, in51); let t401 = circuit_mul(t395, t250); let t402 = circuit_add(t400, t401); let t403 = circuit_add(t388, t402); let t404 = circuit_mul(in64, in64); let t405 = circuit_mul(t390, t404); let t406 = circuit_sub(in63, t6); let t407 = circuit_inverse(t406); let t408 = circuit_add(in63, t6); let t409 = circuit_inverse(t408); let t410 = circuit_mul(t405, t407); let t411 = circuit_mul(in64, t409); let t412 = circuit_mul(t405, t411); let t413 = circuit_add(t412, t410); let t414 = circuit_sub(in0, t413); let t415 = circuit_mul(t412, in52); let t416 = circuit_mul(t410, t240); let t417 = circuit_add(t415, t416); let t418 = circuit_add(t403, t417); let t419 = circuit_mul(in64, in64); let t420 = circuit_mul(t405, t419); let t421 = circuit_sub(in63, t7); let t422 = circuit_inverse(t421); let t423 = circuit_add(in63, t7); let t424 = circuit_inverse(t423); let t425 = circuit_mul(t420, t422); let t426 = circuit_mul(in64, t424); let t427 = circuit_mul(t420, t426); let t428 = circuit_add(t427, t425); let t429 = circuit_sub(in0, t428); let t430 = circuit_mul(t427, in53); let t431 = circuit_mul(t425, t230); let t432 = circuit_add(t430, t431); let t433 = circuit_add(t418, t432); let t434 = circuit_mul(in64, in64); let t435 = circuit_mul(t420, t434); let t436 = circuit_sub(in63, t8); let t437 = circuit_inverse(t436); let t438 = circuit_add(in63, t8); let t439 = circuit_inverse(t438); let t440 = circuit_mul(t435, t437); let t441 = circuit_mul(in64, t439); let t442 = circuit_mul(t435, t441); let t443 = circuit_add(t442, t440); let t444 = circuit_sub(in0, t443); let t445 = circuit_mul(t442, in54); let t446 = circuit_mul(t440, t220); let t447 = circuit_add(t445, t446); let t448 = circuit_add(t433, t447); let t449 = circuit_mul(in64, in64); let t450 = circuit_mul(t435, t449); let t451 = circuit_sub(in63, t9); let t452 = circuit_inverse(t451); let t453 = circuit_add(in63, t9); let t454 = circuit_inverse(t453); let t455 = circuit_mul(t450, t452); let t456 = circuit_mul(in64, t454); let t457 = circuit_mul(t450, t456); let t458 = circuit_add(t457, t455); let t459 = circuit_sub(in0, t458); let t460 = circuit_mul(t457, in55); let t461 = circuit_mul(t455, t210); let t462 = circuit_add(t460, t461); let t463 = circuit_add(t448, t462); let t464 = circuit_mul(in64, in64); let t465 = circuit_mul(t450, t464); let t466 = circuit_sub(in63, t10); let t467 = circuit_inverse(t466); let t468 = circuit_add(in63, t10); let t469 = circuit_inverse(t468); let t470 = circuit_mul(t465, t467); let t471 = circuit_mul(in64, t469); let t472 = circuit_mul(t465, t471); let t473 = circuit_add(t472, t470); let t474 = circuit_sub(in0, t473); let t475 = circuit_mul(t472, in56); let t476 = circuit_mul(t470, t200); let t477 = circuit_add(t475, t476); let t478 = circuit_add(t463, t477); let t479 = circuit_mul(in64, in64); let t480 = circuit_mul(t465, t479); let t481 = circuit_sub(in63, in61); let t482 = circuit_inverse(t481); let t483 = circuit_mul(in2, in61); let t484 = circuit_sub(in63, t483); let t485 = circuit_inverse(t484); let t486 = circuit_mul(in64, in64); let t487 = circuit_mul(t480, t486); let t488 = circuit_mul(t482, t487); let t489 = circuit_sub(in0, t488); let t490 = circuit_mul(t487, in64); let t491 = circuit_mul(t488, in57); let t492 = circuit_add(t478, t491); let t493 = circuit_mul(t485, t490); let t494 = circuit_sub(in0, t493); let t495 = circuit_mul(t490, in64); let t496 = circuit_mul(t493, in58); let t497 = circuit_add(t492, t496); let t498 = circuit_mul(t482, t495); let t499 = circuit_sub(in0, t498); let t500 = circuit_mul(t495, in64); let t501 = circuit_mul(t498, in59); let t502 = circuit_add(t497, t501); let t503 = circuit_mul(t482, t500); let t504 = circuit_sub(in0, t503); let t505 = circuit_mul(t503, in60); let t506 = circuit_add(t502, t505); let t507 = circuit_add(t494, t499); let modulus = modulus; let mut circuit_inputs = ( t22, t23, t27, t31, t35, t39, t43, t47, t51, t55, t59, t63, t67, t71, t75, t79, t83, t87, t91, t95, t99, t103, t107, t111, t115, t119, t123, t127, t131, t168, t173, t178, t183, t188, t155, t159, t163, t324, t339, t354, t369, t384, t399, t414, t429, t444, t459, t474, t489, t507, t504, t506, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs .next_2( [0x6750f230c893619174a57a76, 0xf086204a9f36ffb061794254, 0x7b0c561a6148404, 0x0], ); // in2 // Fill inputs: for val in p_sumcheck_evaluations { circuit_inputs = circuit_inputs.next_u256(*val); } // in3 - in43 circuit_inputs = circuit_inputs.next_2(p_gemini_masking_eval); // in44 for val in p_gemini_a_evaluations { circuit_inputs = circuit_inputs.next_u256(*val); } // in45 - in56 for val in p_libra_poly_evals { circuit_inputs = circuit_inputs.next_u256(*val); } // in57 - in60 circuit_inputs = circuit_inputs.next_2(tp_gemini_r); // in61 circuit_inputs = circuit_inputs.next_2(tp_rho); // in62 circuit_inputs = circuit_inputs.next_2(tp_shplonk_z); // in63 circuit_inputs = circuit_inputs.next_2(tp_shplonk_nu); // in64 for val in tp_sum_check_u_challenges { circuit_inputs = circuit_inputs.next_u128(*val); } // in65 - in76 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let scalar_1: u384 = outputs.get_output(t22); let scalar_2: u384 = outputs.get_output(t23); let scalar_3: u384 = outputs.get_output(t27); let scalar_4: u384 = outputs.get_output(t31); let scalar_5: u384 = outputs.get_output(t35); let scalar_6: u384 = outputs.get_output(t39); let scalar_7: u384 = outputs.get_output(t43); let scalar_8: u384 = outputs.get_output(t47); let scalar_9: u384 = outputs.get_output(t51); let scalar_10: u384 = outputs.get_output(t55); let scalar_11: u384 = outputs.get_output(t59); let scalar_12: u384 = outputs.get_output(t63); let scalar_13: u384 = outputs.get_output(t67); let scalar_14: u384 = outputs.get_output(t71); let scalar_15: u384 = outputs.get_output(t75); let scalar_16: u384 = outputs.get_output(t79); let scalar_17: u384 = outputs.get_output(t83); let scalar_18: u384 = outputs.get_output(t87); let scalar_19: u384 = outputs.get_output(t91); let scalar_20: u384 = outputs.get_output(t95); let scalar_21: u384 = outputs.get_output(t99); let scalar_22: u384 = outputs.get_output(t103); let scalar_23: u384 = outputs.get_output(t107); let scalar_24: u384 = outputs.get_output(t111); let scalar_25: u384 = outputs.get_output(t115); let scalar_26: u384 = outputs.get_output(t119); let scalar_27: u384 = outputs.get_output(t123); let scalar_28: u384 = outputs.get_output(t127); let scalar_29: u384 = outputs.get_output(t131); let scalar_30: u384 = outputs.get_output(t168); let scalar_31: u384 = outputs.get_output(t173); let scalar_32: u384 = outputs.get_output(t178); let scalar_33: u384 = outputs.get_output(t183); let scalar_34: u384 = outputs.get_output(t188); let scalar_35: u384 = outputs.get_output(t155); let scalar_36: u384 = outputs.get_output(t159); let scalar_37: u384 = outputs.get_output(t163); let scalar_38: u384 = outputs.get_output(t324); let scalar_39: u384 = outputs.get_output(t339); let scalar_40: u384 = outputs.get_output(t354); let scalar_41: u384 = outputs.get_output(t369); let scalar_42: u384 = outputs.get_output(t384); let scalar_43: u384 = outputs.get_output(t399); let scalar_44: u384 = outputs.get_output(t414); let scalar_45: u384 = outputs.get_output(t429); let scalar_46: u384 = outputs.get_output(t444); let scalar_47: u384 = outputs.get_output(t459); let scalar_48: u384 = outputs.get_output(t474); let scalar_49: u384 = outputs.get_output(t489); let scalar_50: u384 = outputs.get_output(t507); let scalar_51: u384 = outputs.get_output(t504); let scalar_52: u384 = outputs.get_output(t506); return ( scalar_1, scalar_2, scalar_3, scalar_4, scalar_5, scalar_6, scalar_7, scalar_8, scalar_9, scalar_10, scalar_11, scalar_12, scalar_13, scalar_14, scalar_15, scalar_16, scalar_17, scalar_18, scalar_19, scalar_20, scalar_21, scalar_22, scalar_23, scalar_24, scalar_25, scalar_26, scalar_27, scalar_28, scalar_29, scalar_30, scalar_31, scalar_32, scalar_33, scalar_34, scalar_35, scalar_36, scalar_37, scalar_38, scalar_39, scalar_40, scalar_41, scalar_42, scalar_43, scalar_44, scalar_45, scalar_46, scalar_47, scalar_48, scalar_49, scalar_50, scalar_51, scalar_52, ); } #[inline(always)] pub fn run_GRUMPKIN_ZK_HONK_EVALS_CONS_INIT_SIZE_12_circuit( tp_gemini_r: u384, modulus: core::circuit::CircuitModulus, ) -> (u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x1 let in1 = CE::> {}; // 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 // INPUT stack let in2 = CE::> {}; let t0 = circuit_sub(in2, in0); let t1 = circuit_inverse(t0); let t2 = circuit_mul(in1, in2); let modulus = modulus; let mut circuit_inputs = (t1, t2).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs .next_2( [0x8712848a692c553d0329f5d6, 0x64751ad938e2b5e6a54cf8c6, 0x204bd3277422fad3, 0x0], ); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(tp_gemini_r); // in2 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let challenge_poly_eval: u384 = outputs.get_output(t1); let root_power_times_tp_gemini_r: u384 = outputs.get_output(t2); return (challenge_poly_eval, root_power_times_tp_gemini_r); } #[inline(always)] pub fn run_GRUMPKIN_ZK_HONK_EVALS_CONS_LOOP_SIZE_12_circuit( challenge_poly_eval: u384, root_power_times_tp_gemini_r: u384, tp_sumcheck_u_challenge: u384, modulus: core::circuit::CircuitModulus, ) -> (u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x1 let in1 = CE::> {}; // 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_sub(in3, in0); let t1 = circuit_inverse(t0); let t2 = circuit_mul(in0, t1); let t3 = circuit_add(in2, t2); let t4 = circuit_mul(in3, in1); let t5 = circuit_mul(in0, in4); let t6 = circuit_sub(t4, in0); let t7 = circuit_inverse(t6); let t8 = circuit_mul(t5, t7); let t9 = circuit_add(t3, t8); let t10 = circuit_mul(t4, in1); let t11 = circuit_mul(t5, in4); let t12 = circuit_sub(t10, in0); let t13 = circuit_inverse(t12); let t14 = circuit_mul(t11, t13); let t15 = circuit_add(t9, t14); let t16 = circuit_mul(t10, in1); let t17 = circuit_mul(t11, in4); let t18 = circuit_sub(t16, in0); let t19 = circuit_inverse(t18); let t20 = circuit_mul(t17, t19); let t21 = circuit_add(t15, t20); let t22 = circuit_mul(t16, in1); let t23 = circuit_mul(t17, in4); let t24 = circuit_sub(t22, in0); let t25 = circuit_inverse(t24); let t26 = circuit_mul(t23, t25); let t27 = circuit_add(t21, t26); let t28 = circuit_mul(t22, in1); let t29 = circuit_mul(t23, in4); let t30 = circuit_sub(t28, in0); let t31 = circuit_inverse(t30); let t32 = circuit_mul(t29, t31); let t33 = circuit_add(t27, t32); let t34 = circuit_mul(t28, in1); let t35 = circuit_mul(t29, in4); let t36 = circuit_sub(t34, in0); let t37 = circuit_inverse(t36); let t38 = circuit_mul(t35, t37); let t39 = circuit_add(t33, t38); let t40 = circuit_mul(t34, in1); let t41 = circuit_mul(t35, in4); let t42 = circuit_sub(t40, in0); let t43 = circuit_inverse(t42); let t44 = circuit_mul(t41, t43); let t45 = circuit_add(t39, t44); let t46 = circuit_mul(t40, in1); let t47 = circuit_mul(t41, in4); let t48 = circuit_sub(t46, in0); let t49 = circuit_inverse(t48); let t50 = circuit_mul(t47, t49); let t51 = circuit_add(t45, t50); let t52 = circuit_mul(t46, in1); let modulus = modulus; let mut circuit_inputs = (t51, t52).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs .next_2( [0x8712848a692c553d0329f5d6, 0x64751ad938e2b5e6a54cf8c6, 0x204bd3277422fad3, 0x0], ); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(challenge_poly_eval); // in2 circuit_inputs = circuit_inputs.next_2(root_power_times_tp_gemini_r); // in3 circuit_inputs = circuit_inputs.next_2(tp_sumcheck_u_challenge); // in4 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let challenge_poly_eval: u384 = outputs.get_output(t51); let root_power_times_tp_gemini_r: u384 = outputs.get_output(t52); return (challenge_poly_eval, root_power_times_tp_gemini_r); } #[inline(always)] pub fn run_GRUMPKIN_ZK_HONK_EVALS_CONS_DONE_SIZE_12_circuit( p_libra_evaluation: u384, p_libra_poly_evals: Span, tp_gemini_r: u384, challenge_poly_eval: u384, root_power_times_tp_gemini_r: u384, modulus: core::circuit::CircuitModulus, ) -> (u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 let in1 = CE::> {}; // 0x1 let in2 = CE::> {}; // 0x3033ea246e506e898e97f570caffd704cb0bb460313fb720b29e139e5c100001 // INPUT stack let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in10, in0); let t1 = circuit_mul(t0, in0); let t2 = circuit_mul(t1, in0); let t3 = circuit_mul(t2, in0); let t4 = circuit_mul(t3, in0); let t5 = circuit_mul(t4, in0); let t6 = circuit_mul(t5, in0); let t7 = circuit_mul(t6, in0); let t8 = circuit_mul(t7, in0); let t9 = circuit_mul(t8, in0); let t10 = circuit_mul(t9, in0); let t11 = circuit_mul(t10, in0); let t12 = circuit_mul(t11, in0); let t13 = circuit_mul(t12, in0); let t14 = circuit_mul(t13, in0); let t15 = circuit_mul(t14, in0); let t16 = circuit_mul(t15, in0); let t17 = circuit_mul(t16, in0); let t18 = circuit_mul(t17, in0); let t19 = circuit_mul(t18, in0); let t20 = circuit_mul(t19, in0); let t21 = circuit_mul(t20, in0); let t22 = circuit_mul(t21, in0); let t23 = circuit_mul(t22, in0); let t24 = circuit_mul(t23, in0); let t25 = circuit_mul(t24, in0); let t26 = circuit_mul(t25, in0); let t27 = circuit_mul(t26, in0); let t28 = circuit_mul(t27, in0); let t29 = circuit_mul(t28, in0); let t30 = circuit_mul(t29, in0); let t31 = circuit_mul(t30, in0); let t32 = circuit_mul(t31, in0); let t33 = circuit_mul(t32, in0); let t34 = circuit_mul(t33, in0); let t35 = circuit_mul(t34, in0); let t36 = circuit_mul(t35, in0); let t37 = circuit_mul(t36, in0); let t38 = circuit_mul(t37, in0); let t39 = circuit_mul(t38, in0); let t40 = circuit_mul(t39, in0); let t41 = circuit_mul(t40, in0); let t42 = circuit_mul(t41, in0); let t43 = circuit_mul(t42, in0); let t44 = circuit_mul(t43, in0); let t45 = circuit_mul(t44, in0); let t46 = circuit_mul(t45, in0); let t47 = circuit_mul(t46, in0); let t48 = circuit_mul(t47, in0); let t49 = circuit_mul(t48, in0); let t50 = circuit_mul(t49, in0); let t51 = circuit_mul(t50, in0); let t52 = circuit_mul(t51, in0); let t53 = circuit_mul(t52, in0); let t54 = circuit_mul(t53, in0); let t55 = circuit_mul(t54, in0); let t56 = circuit_mul(t55, in0); let t57 = circuit_mul(t56, in0); let t58 = circuit_mul(t57, in0); let t59 = circuit_mul(t58, in0); let t60 = circuit_mul(t59, in0); let t61 = circuit_mul(t60, in0); let t62 = circuit_mul(t61, in0); let t63 = circuit_mul(t62, in0); let t64 = circuit_mul(t63, in0); let t65 = circuit_mul(t64, in0); let t66 = circuit_mul(t65, in0); let t67 = circuit_mul(t66, in0); let t68 = circuit_mul(t67, in0); let t69 = circuit_mul(t68, in0); let t70 = circuit_mul(t69, in0); let t71 = circuit_mul(t70, in0); let t72 = circuit_mul(t71, in0); let t73 = circuit_mul(t72, in0); let t74 = circuit_mul(t73, in0); let t75 = circuit_mul(t74, in0); let t76 = circuit_mul(t75, in0); let t77 = circuit_mul(t76, in0); let t78 = circuit_mul(t77, in0); let t79 = circuit_mul(t78, in0); let t80 = circuit_mul(t79, in0); let t81 = circuit_mul(t80, in0); let t82 = circuit_mul(t81, in0); let t83 = circuit_mul(t82, in0); let t84 = circuit_mul(t83, in0); let t85 = circuit_mul(t84, in0); let t86 = circuit_mul(t85, in0); let t87 = circuit_mul(t86, in0); let t88 = circuit_mul(t87, in0); let t89 = circuit_mul(t88, in0); let t90 = circuit_mul(t89, in0); let t91 = circuit_mul(t90, in0); let t92 = circuit_mul(t91, in0); let t93 = circuit_mul(t92, in0); let t94 = circuit_mul(t93, in0); let t95 = circuit_mul(t94, in0); let t96 = circuit_mul(t95, in0); let t97 = circuit_mul(t96, in0); let t98 = circuit_mul(t97, in0); let t99 = circuit_mul(t98, in0); let t100 = circuit_mul(t99, in0); let t101 = circuit_mul(t100, in0); let t102 = circuit_mul(t101, in0); let t103 = circuit_mul(t102, in0); let t104 = circuit_mul(t103, in0); let t105 = circuit_mul(t104, in0); let t106 = circuit_mul(t105, in0); let t107 = circuit_mul(t106, in0); let t108 = circuit_mul(t107, in0); let t109 = circuit_mul(t108, in0); let t110 = circuit_mul(t109, in0); let t111 = circuit_mul(t110, in0); let t112 = circuit_mul(t111, in0); let t113 = circuit_mul(t112, in0); let t114 = circuit_mul(t113, in0); let t115 = circuit_mul(t114, in0); let t116 = circuit_mul(t115, in0); let t117 = circuit_mul(t116, in0); let t118 = circuit_mul(t117, in0); let t119 = circuit_mul(t118, in0); let t120 = circuit_mul(t119, in0); let t121 = circuit_mul(t120, in0); let t122 = circuit_mul(t121, in0); let t123 = circuit_mul(t122, in0); let t124 = circuit_mul(t123, in0); let t125 = circuit_mul(t124, in0); let t126 = circuit_mul(t125, in0); let t127 = circuit_mul(t126, in0); let t128 = circuit_mul(t127, in0); let t129 = circuit_mul(t128, in0); let t130 = circuit_mul(t129, in0); let t131 = circuit_mul(t130, in0); let t132 = circuit_mul(t131, in0); let t133 = circuit_mul(t132, in0); let t134 = circuit_mul(t133, in0); let t135 = circuit_mul(t134, in0); let t136 = circuit_mul(t135, in0); let t137 = circuit_mul(t136, in0); let t138 = circuit_mul(t137, in0); let t139 = circuit_mul(t138, in0); let t140 = circuit_mul(t139, in0); let t141 = circuit_mul(t140, in0); let t142 = circuit_mul(t141, in0); let t143 = circuit_mul(t142, in0); let t144 = circuit_mul(t143, in0); let t145 = circuit_mul(t144, in0); let t146 = circuit_sub(in8, in1); let t147 = circuit_inverse(t146); let t148 = circuit_sub(t145, in1); let t149 = circuit_inverse(t148); let t150 = circuit_mul(in8, in8); let t151 = circuit_mul(t150, t150); let t152 = circuit_mul(t151, t151); let t153 = circuit_mul(t152, t152); let t154 = circuit_mul(t153, t153); let t155 = circuit_mul(t154, t154); let t156 = circuit_mul(t155, t155); let t157 = circuit_mul(t156, t156); let t158 = circuit_sub(t157, in1); let t159 = circuit_mul(t158, in2); let t160 = circuit_mul(in9, t159); let t161 = circuit_mul(t147, t159); let t162 = circuit_mul(t149, t159); let t163 = circuit_mul(t161, in6); let t164 = circuit_sub(in8, in0); let t165 = circuit_sub(in5, in6); let t166 = circuit_mul(in4, t160); let t167 = circuit_sub(t165, t166); let t168 = circuit_mul(t164, t167); let t169 = circuit_add(t163, t168); let t170 = circuit_sub(in6, in3); let t171 = circuit_mul(t162, t170); let t172 = circuit_add(t169, t171); let t173 = circuit_mul(t158, in7); let t174 = circuit_sub(t172, t173); let modulus = modulus; let mut circuit_inputs = (t158, t174).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x8712848a692c553d0329f5d6, 0x64751ad938e2b5e6a54cf8c6, 0x204bd3277422fad3, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs .next_2( [0x313fb720b29e139e5c100001, 0x8e97f570caffd704cb0bb460, 0x3033ea246e506e89, 0x0], ); // in2 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p_libra_evaluation); // in3 for val in p_libra_poly_evals { circuit_inputs = circuit_inputs.next_u256(*val); } // in4 - in7 circuit_inputs = circuit_inputs.next_2(tp_gemini_r); // in8 circuit_inputs = circuit_inputs.next_2(challenge_poly_eval); // in9 circuit_inputs = circuit_inputs.next_2(root_power_times_tp_gemini_r); // in10 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let vanishing_check: u384 = outputs.get_output(t158); let diff_check: u384 = outputs.get_output(t174); return (vanishing_check, diff_check); } impl CircuitDefinition52< E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, E28, E29, E30, E31, E32, E33, E34, E35, E36, E37, E38, E39, E40, E41, E42, E43, E44, E45, E46, E47, E48, E49, E50, E51, > of core::circuit::CircuitDefinition< ( CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, ), > { type CircuitType = core::circuit::Circuit< ( E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, E28, E29, E30, E31, E32, E33, E34, E35, E36, E37, E38, E39, E40, E41, E42, E43, E44, E45, E46, E47, E48, E49, E50, E51, ), >; } impl MyDrp_52< E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, E28, E29, E30, E31, E32, E33, E34, E35, E36, E37, E38, E39, E40, E41, E42, E43, E44, E45, E46, E47, E48, E49, E50, E51, > of Drop< ( CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, ), >; #[inline(never)] pub fn is_on_curve_excluding_infinity_bn254(p: G1Point, modulus: CircuitModulus) -> bool { // INPUT stack // y^2 = x^3 + 3 let (in0, in1) = (CE::> {}, CE::> {}); let y2 = circuit_mul(in1, in1); let x2 = circuit_mul(in0, in0); let x3 = circuit_mul(in0, x2); let y2_minus_x3 = circuit_sub(y2, x3); let mut circuit_inputs = (y2_minus_x3,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x); // in0 circuit_inputs = circuit_inputs.next_2(p.y); // in1 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let zero_check: u384 = outputs.get_output(y2_minus_x3); return zero_check == u384 { limb0: 3, limb1: 0, limb2: 0, limb3: 0 }; } ================================================ FILE: src/contracts/autogenerated/noir_ultra_keccak_zk_honk_example/src/honk_verifier_constants.cairo ================================================ // Generated by Garaga version 1.1.0 use garaga::apps::noir::HonkVk; use garaga::definitions::{G1Point, G2Line, u288, u384}; pub const vk: HonkVk = HonkVk { vk_hash: 1655602901159187576028713697867454584902070339986579942408953720408510516376, log_circuit_size: 12, public_inputs_size: 17, qm: G1Point { x: u384 { limb0: 0x1a11b55dce82f38413640a64, limb1: 0x25c78e040da5a5cbe6f296ee, limb2: 0x142bd66bdb7a2bc1, limb3: 0x0, }, y: u384 { limb0: 0x3dc8a5d19d0bf85b0fa95ad4, limb1: 0xaa34836fe60428f70dee9285, limb2: 0xd1415082e63c88e, limb3: 0x0, }, }, qc: G1Point { x: u384 { limb0: 0xcd51216bd8c56683467cd704, limb1: 0x7c77ce4f20f0fd5a3a264861, limb2: 0x2deae537974aa569, limb3: 0x0, }, y: u384 { limb0: 0xa1179c7a8ed5c59a1015e784, limb1: 0x714496966bf5f4374fb6087b, limb2: 0x68627460599c3db, limb3: 0x0, }, }, ql: G1Point { x: u384 { limb0: 0x36d34df5c2aab80f85a218f2, limb1: 0x864a67847d46222c9aee090f, limb2: 0x6681df238df2a0f, limb3: 0x0, }, y: u384 { limb0: 0xbc5d11d2d55e4ac8adccae27, limb1: 0xb9c1b8da3c671ec025fe40ee, limb2: 0x18e37167fd19d013, limb3: 0x0, }, }, qr: G1Point { x: u384 { limb0: 0xfe3f9cf39c6f73896b06e821, limb1: 0x3dc4669f3d97f847e96e4bce, limb2: 0x177c7a07701c29d1, limb3: 0x0, }, y: u384 { limb0: 0x7c23cf6fe4a49a8e4f4c5aba, limb1: 0x38f1a638b192ffc9b995fd68, limb2: 0x2d31ea12ba12ee23, limb3: 0x0, }, }, qo: G1Point { x: u384 { limb0: 0xd8b0a3fb6597416a145754e3, limb1: 0xac68b01fa7f3faaa5a881854, limb2: 0x2d623ef9f6f62903, limb3: 0x0, }, y: u384 { limb0: 0x6059e6db24a7e1bfc51be2ac, limb1: 0x52b442fa3ce1643a24c7ac8e, limb2: 0x20b75671e0dd20da, limb3: 0x0, }, }, q4: G1Point { x: u384 { limb0: 0x528aeba6bdb01913c3236ff8, limb1: 0xe2edafe7a56dfd287d677b48, limb2: 0x7ea8dd8b4d3fd18, limb3: 0x0, }, y: u384 { limb0: 0x853ad38b76968342e932d84b, limb1: 0xe23f777f35827a35ea2716bc, limb2: 0x2826602478d64dc4, limb3: 0x0, }, }, qLookup: G1Point { x: u384 { limb0: 0x53f9b24d923d8f404cb0bbc9, limb1: 0x75a8449d3d5ce8bc3661650d, limb2: 0xc4032c3079594eb, limb3: 0x0, }, y: u384 { limb0: 0xa0ca89441369b7c24301f851, limb1: 0xf0158fd6da81f54eb5fe796, limb2: 0x1084d709650356d4, limb3: 0x0, }, }, qArith: G1Point { x: u384 { limb0: 0x1c518c7ea0b38257198a9523, limb1: 0xc2c72a3c00da41d4c7c7b6d0, limb2: 0x3057f9cfd5edb0e7, limb3: 0x0, }, y: u384 { limb0: 0xf647b842154c13fa145167b7, limb1: 0x6a98575cedc65ee5700a7148, limb2: 0x27eb0839ef4980d, limb3: 0x0, }, }, qDeltaRange: G1Point { x: u384 { limb0: 0xbefcd8cd631818993e143702, limb1: 0x3b9a8bc08ae2fdbd8e9dc005, limb2: 0x1775fbd3ba5e4316, limb3: 0x0, }, y: u384 { limb0: 0xbdde06678d3bce4455d2086f, limb1: 0x9e409fcb2e19a72238c07631, limb2: 0x1d8011ee756abfa1, limb3: 0x0, }, }, qElliptic: G1Point { x: u384 { limb0: 0x990b1eaa86226b3574e5c43f, limb1: 0x50fb0eae1d72783faba96bc3, limb2: 0x9c706e73a00d844, limb3: 0x0, }, y: u384 { limb0: 0x9b1f547ec36638d7b5a1ecd9, limb1: 0x68fcae74683a84de1084739f, limb2: 0x276d401f1c0f9a26, limb3: 0x0, }, }, qMemory: G1Point { x: u384 { limb0: 0xc20dedd7ff81c5677d3286ce, limb1: 0x276f3537c64334419e05b13f, limb2: 0x12b12523f7d04a83, limb3: 0x0, }, y: u384 { limb0: 0x4e602d1c13a77a2472f082da, limb1: 0x55a526829445f3fda95e243c, limb2: 0x2e741be4fe42cc11, limb3: 0x0, }, }, qNnf: G1Point { x: u384 { limb0: 0x5526834f93c6db848d56dcb0, limb1: 0xe4e8e364439d0abba02dc62a, limb2: 0x16a1350662e14b4c, limb3: 0x0, }, y: u384 { limb0: 0xb2e746ed0b6e85782c26040e, limb1: 0x9296d71489889503dda143f0, limb2: 0x563b1f480cad906, limb3: 0x0, }, }, qPoseidon2External: G1Point { x: u384 { limb0: 0xe4d88b5517e40b2a0133f401, limb1: 0x42f6c756379f231d5f472088, limb2: 0x20e1bb3056279dc3, limb3: 0x0, }, y: u384 { limb0: 0x2c8d1a5a6b3bd0ec93b42e77, limb1: 0x9eb4da763de77062d23ce01e, limb2: 0x23ee36ecb11b6278, limb3: 0x0, }, }, qPoseidon2Internal: G1Point { x: u384 { limb0: 0x19d18424d0e92f60a31671d9, limb1: 0xfdda50b3205d5aa4486b6325, limb2: 0xd1611c856951969, limb3: 0x0, }, y: u384 { limb0: 0x94aa3cadd7cd42e719521e0f, limb1: 0x30c0b534ea958de4c47e2f4c, limb2: 0xce97ee59d45d762, limb3: 0x0, }, }, s1: G1Point { x: u384 { limb0: 0x1b074244b7337b923c097eaf, limb1: 0xd2ae3eafb3800ee0eaf997cb, limb2: 0x154bdee4123a9946, limb3: 0x0, }, y: u384 { limb0: 0xf34e2352250dd3fb63d6d8c6, limb1: 0x3c0953803a3a34d916eefb5b, limb2: 0xd5f22b8ade2c19f, limb3: 0x0, }, }, s2: G1Point { x: u384 { limb0: 0x111168b4d7ab689558c334db, limb1: 0x7c62cc30718076db1836d9e1, limb2: 0x22d2dd0a34c3a1da, limb3: 0x0, }, y: u384 { limb0: 0x98a26842094b80c6e88321bf, limb1: 0x243059518c261a4137e7f6a6, limb2: 0x262c701396f0e3ae, limb3: 0x0, }, }, s3: G1Point { x: u384 { limb0: 0xe1213cb7ef934c944e4e8374, limb1: 0x84b08b441d010fc2976235c0, limb2: 0x172f8c6455a2bfe2, limb3: 0x0, }, y: u384 { limb0: 0x960773bd1e8b46a6a182239d, limb1: 0x640beab3f563e0a2402c116a, limb2: 0x178afa12bf161e7e, limb3: 0x0, }, }, s4: G1Point { x: u384 { limb0: 0xd14c60e677f8e1897f658057, limb1: 0x33204ad4109fa0fbb54c4fea, limb2: 0x21f45516c16fcb30, limb3: 0x0, }, y: u384 { limb0: 0x52efc7a0ee6a29e06296bb4d, limb1: 0xb82792c925627d7348f0bf11, limb2: 0xa7a5c9f897fd8da, limb3: 0x0, }, }, id1: G1Point { x: u384 { limb0: 0xaa69e812f125d20848fd1c50, limb1: 0x621962d025f0fbb42467ce5c, limb2: 0x1d1934c19b595461, limb3: 0x0, }, y: u384 { limb0: 0x8971dba72882ee742a0b57f4, limb1: 0xdf91438bfa5b19a7bad0f91d, limb2: 0x10e15c437db6ae7e, limb3: 0x0, }, }, id2: G1Point { x: u384 { limb0: 0x3a6957e0c9aa54ec21894a61, limb1: 0x320938baa053cd1f3dccb71, limb2: 0x146dc127b5450502, limb3: 0x0, }, y: u384 { limb0: 0xfd19216bf0829882cdabebe6, limb1: 0x828ba063530a81a329131fb4, limb2: 0x2d5cbdbf9edeff0d, limb3: 0x0, }, }, id3: G1Point { x: u384 { limb0: 0xbe73592b0b543997ac9ec27b, limb1: 0x600ed91fa96cd915db4ed7fd, limb2: 0x1e214a8b0ce35f8e, limb3: 0x0, }, y: u384 { limb0: 0x5eb2130b9c574c4e04e6e477, limb1: 0x7203e26ecee99e2307846f5a, limb2: 0x214375d66b2db2ba, limb3: 0x0, }, }, id4: G1Point { x: u384 { limb0: 0xc0ed29b2c26f8c8cbcbd82cf, limb1: 0x9b46a4cf0acba266c2a9b02, limb2: 0x2825f908ee9357e4, limb3: 0x0, }, y: u384 { limb0: 0xf0bd3cf808a6d1bcd0d63ba, limb1: 0x8100429b213b9140ed25274a, limb2: 0x264ef648e6714012, limb3: 0x0, }, }, t1: G1Point { x: u384 { limb0: 0xa63b05df652b0d10ef146d26, limb1: 0xfe18040105b9b395b5d8b7b4, limb2: 0x99e3bd5a0a00ab7, limb3: 0x0, }, y: u384 { limb0: 0x7f5a622a32440f860d1e2a7f, limb1: 0xccec99dcd194592129af3a63, limb2: 0x15b8d2515d76e2, limb3: 0x0, }, }, t2: G1Point { x: u384 { limb0: 0xdc25d1aa450e0b4bc212c37e, limb1: 0x8bc01c9595092a222b888108, limb2: 0x1b917517920bad3d, limb3: 0x0, }, y: u384 { limb0: 0xe42000a1d58ccb74381f6d19, limb1: 0x22e6e992077a84482141c7eb, limb2: 0x305e8992b148eedb, limb3: 0x0, }, }, t3: G1Point { x: u384 { limb0: 0x400b2bca37e2b1085e924a77, limb1: 0x3ada15236ba5cfa60111b440, limb2: 0x13567e3b915c8101, limb3: 0x0, }, y: u384 { limb0: 0x904b434e748f9713de8cc3d7, limb1: 0x8f4674af5744dedafd63caea, limb2: 0x148d22589b91f0d, limb3: 0x0, }, }, t4: G1Point { x: u384 { limb0: 0x6c840d9c943fdf45521c64ce, limb1: 0x7342af45d0155a28edd1a7e4, limb2: 0x43d063b130adfb3, limb3: 0x0, }, y: u384 { limb0: 0x4c573d1686d9cb4a00733854, limb1: 0x6aff96736194949330952ae7, limb2: 0x261522c408933064, limb3: 0x0, }, }, lagrange_first: G1Point { x: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, y: u384 { limb0: 0x2, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }, lagrange_last: G1Point { x: u384 { limb0: 0xc894b742744cf102a554d06f, limb1: 0x9ed4d186a2debd4bfe72be9b, limb2: 0x6a032e44c27b0ce, limb3: 0x0, }, y: u384 { limb0: 0x26660c8385d13a63d2078399, limb1: 0xad76960162ff0d8c34d25b61, limb2: 0x53396ef4f905183, limb3: 0x0, }, }, }; pub const precomputed_lines: [G2Line; 176] = [ G2Line { r0a0: u288 { limb0: 0x4d347301094edcbfa224d3d5, limb1: 0x98005e68cacde68a193b54e6, limb2: 0x237db2935c4432bc, }, r0a1: u288 { limb0: 0x6b4ba735fba44e801d415637, limb1: 0x707c3ec1809ae9bafafa05dd, limb2: 0x124077e14a7d826a, }, r1a0: u288 { limb0: 0x49a8dc1dd6e067932b6a7e0d, limb1: 0x7676d0000961488f8fbce033, limb2: 0x3b7178c857630da, }, r1a1: u288 { limb0: 0x98c81278efe1e96b86397652, limb1: 0xe3520b9dfa601ead6f0bf9cd, limb2: 0x2b17c2b12c26fdd0, }, }, G2Line { r0a0: u288 { limb0: 0x19f2be813f1a2cc51a251901, limb1: 0xa120afb4bcd07fdae4c4c91b, limb2: 0xcd8c8d94eedaaa5, }, r0a1: u288 { limb0: 0xa3808ba2f25b910b50769d68, limb1: 0xda666e5fa50719fcd79ea2c7, limb2: 0x104262c7ecae13e5, }, r1a0: u288 { limb0: 0xd00c9d5338bfc75cd1fe4002, limb1: 0x25f7441c17b6428fffe6266b, limb2: 0x25d0502e1109204d, }, r1a1: u288 { limb0: 0x4ce60bf635ff0fe14cf89d2, limb1: 0x9ca0af889fc43d4423a03197, limb2: 0x1b323f9be536f345, }, }, G2Line { r0a0: u288 { limb0: 0x1b3d578c32d1af5736582972, limb1: 0x204fe74db6b371d37e4615ab, limb2: 0xce69bdf84ed6d6d, }, r0a1: u288 { limb0: 0xfd262357407c3d96bb3ba710, limb1: 0x47d406f500e66ea29c8764b3, limb2: 0x1e23d69196b41dbf, }, r1a0: u288 { limb0: 0x1ec8ee6f65402483ad127f3a, limb1: 0x41d975b678200fce07c48a5e, limb2: 0x2cad36e65bbb6f4f, }, r1a1: u288 { limb0: 0xcfa9b8144c3ea2ab524386f5, limb1: 0xd4fe3a18872139b0287570c3, limb2: 0x54c8bc1b50aa258, }, }, G2Line { r0a0: u288 { limb0: 0xb5ee22ba52a7ed0c533b7173, limb1: 0xbfa13123614ecf9c4853249b, limb2: 0x6567a7f6972b7bb, }, r0a1: u288 { limb0: 0xcf422f26ac76a450359f819e, limb1: 0xc42d7517ae6f59453eaf32c7, limb2: 0x899cb1e339f7582, }, r1a0: u288 { limb0: 0x9f287f4842d688d7afd9cd67, limb1: 0x30af75417670de33dfa95eda, limb2: 0x1121d4ca1c2cab36, }, r1a1: u288 { limb0: 0x7c4c55c27110f2c9a228f7d8, limb1: 0x8f14f6c3a2e2c9d74b347bfe, limb2: 0x83ef274ba7913a5, }, }, G2Line { r0a0: u288 { limb0: 0x4e7f0c0bfd065f51be57e446, limb1: 0x172f9601c4b0d882b2bca176, limb2: 0x238b85999243f584, }, r0a1: u288 { limb0: 0xc4f13eea49c4fb0b88065fdf, limb1: 0xdde9d756dc7a3e60bfe2c7c9, limb2: 0x2021ebaaf4838c43, }, r1a0: u288 { limb0: 0x98652d3a0360c4ba067ebd45, limb1: 0x9259019a69cb15cd979b4425, limb2: 0xa93fe44d0287fdc, }, r1a1: u288 { limb0: 0x63a369cdd8c09b18c3ad7375, limb1: 0x1baf962de1bd1b1973e138fa, limb2: 0x15320ed6fbfaace4, }, }, G2Line { r0a0: u288 { limb0: 0x1a9ecb5a41abb65787e46934, limb1: 0x28fec59f9911882bd4d50306, limb2: 0x25996b3cd58cce92, }, r0a1: u288 { limb0: 0x56f5cca0fddcae1bfbee4b4d, limb1: 0x4237b58cc71911abcefd1d92, limb2: 0x2d985c4da93484d4, }, r1a0: u288 { limb0: 0x406454881e1f6cab8a9ab13c, limb1: 0x2cdf1a77980edf520cc8f23f, limb2: 0x20ce11ddb649cf18, }, r1a1: u288 { limb0: 0xfe104a8fa2c57b6b94bf56d2, limb1: 0xe2debabd9212070fd38f818, limb2: 0x1c1a2364541a15be, }, }, G2Line { r0a0: u288 { limb0: 0xfc23a674d089e9cfdefb1db8, limb1: 0x9ddfd61d289b65a9b4254476, limb2: 0x1e2f561324ef4447, }, r0a1: u288 { limb0: 0xf67a6a9e31f6975b220642ea, limb1: 0xccd852893796296e4d1ed330, limb2: 0x94ff1987d19b62, }, r1a0: u288 { limb0: 0x360c2a5aca59996d24cc1947, limb1: 0x66c2d7d0d176a3bc53f386e8, limb2: 0x2cfcc62a17fbeecb, }, r1a1: u288 { limb0: 0x2ddc73389dd9a9e34168d8a9, limb1: 0xae9afc57944748b835cbda0f, limb2: 0x12f0a1f8cf564067, }, }, G2Line { r0a0: u288 { limb0: 0xef09c2458cc3abc041e9fa2d, limb1: 0x787c6d7a93e94be14277d18d, limb2: 0xbb1d328b2d75a8a, }, r0a1: u288 { limb0: 0x1911705c689a06b1dfab80c, limb1: 0x72781338c8dfb4eb593e44c, limb2: 0x1405249e47100437, }, r1a0: u288 { limb0: 0x4dca335dcaeaf9d99ab7ad63, limb1: 0xd36f68812432efaedffce9a7, limb2: 0x1131840a72c4fa9, }, r1a1: u288 { limb0: 0x5676dc996dc5b1ce91fd01c1, limb1: 0xbbf4fcfae2062f0031601f40, limb2: 0x2f8f5c5bff703235, }, }, G2Line { r0a0: u288 { limb0: 0x9c963c4bdade6ce3d460b077, limb1: 0x1738311feefc76f565e34e8a, limb2: 0x1aae0d6c9e9888ad, }, r0a1: u288 { limb0: 0x9272581fdf80b045c9c3f0a, limb1: 0x3946807b0756e87666798edb, limb2: 0x2bf6eeda2d8be192, }, r1a0: u288 { limb0: 0x3e957661b35995552fb475de, limb1: 0xd8076fa48f93f09d8128a2a8, limb2: 0xb6f87c3f00a6fcf, }, r1a1: u288 { limb0: 0xcf17d6cd2101301246a8f264, limb1: 0x514d04ad989b91e697aa5a0e, limb2: 0x175f17bbd0ad1219, }, }, G2Line { r0a0: u288 { limb0: 0x894bc18cc70ca1987e3b8f9f, limb1: 0xd4bfa535181f0f8659b063e3, limb2: 0x19168d524164f463, }, r0a1: u288 { limb0: 0x850ee8d0e9b58b82719a6e92, limb1: 0x9fc4eb75cbb027c137d48341, limb2: 0x2b2f8a383d944fa0, }, r1a0: u288 { limb0: 0x5451c8974a709483c2b07fbd, limb1: 0xd7e09837b8a2a3b78e7fe525, limb2: 0x347d96be5e7fa31, }, r1a1: u288 { limb0: 0x823f2ba2743ee254e4c18a1e, limb1: 0x6a61af5db035c443ed0f8172, limb2: 0x1e840eee275d1063, }, }, G2Line { r0a0: u288 { limb0: 0xdd132544fc661724c31c8a08, limb1: 0x287b549c39c0ea0a391cbe18, limb2: 0x29c2742c0ca03d7b, }, r0a1: u288 { limb0: 0xb3076d9218b75e044db009b0, limb1: 0xf0e2da346da73ed6e537273, limb2: 0x16cd48b0b23a5a69, }, r1a0: u288 { limb0: 0x5eeab759aec37540ef3b3200, limb1: 0x90c30b490593b4f0a2750f65, limb2: 0x263476e7a8250501, }, r1a1: u288 { limb0: 0x437a75606a5486770a5c4450, limb1: 0xbb6a0a3aa70be067ddcfdbfc, limb2: 0xc03b2e169fa0cd0, }, }, G2Line { r0a0: u288 { limb0: 0x185a998303998a727a80004d, limb1: 0xb23554df68e88aa4bcb90b09, limb2: 0x293e05c0080aedc, }, r0a1: u288 { limb0: 0xfcd79ce56915d6462fb8a51a, limb1: 0x8c7691de25e8c4b96117b24, limb2: 0xa849fd468442c55, }, r1a0: u288 { limb0: 0xc8661606e6d6b1e5a00268eb, limb1: 0xbe2235d18dd52b903e1858e2, limb2: 0x222c8e6db445fbf7, }, r1a1: u288 { limb0: 0x803355a17297b5f77e52231c, limb1: 0x7927c03bd5d3798208bf7a23, limb2: 0x111b3dbe82eb4f62, }, }, G2Line { r0a0: u288 { limb0: 0x18d630598e58bb5d0102b30e, limb1: 0x9767e27b02a8da37411a2787, limb2: 0x100a541662b9cd7c, }, r0a1: u288 { limb0: 0x4ca7313df2e168e7e5ea70, limb1: 0xd49cce6abd50b574f31c2d72, limb2: 0x78a2afbf72317e7, }, r1a0: u288 { limb0: 0x6d99388b0a1a67d6b48d87e0, limb1: 0x1d8711d321a193be3333bc68, limb2: 0x27e76de53a010ce1, }, r1a1: u288 { limb0: 0x77341bf4e1605e982fa50abd, limb1: 0xc5cf10db170b4feaaf5f8f1b, limb2: 0x762adef02274807, }, }, G2Line { r0a0: u288 { limb0: 0x401adda3a335074256e01cf5, limb1: 0x247f8405ee3a5143b8fc7947, limb2: 0x2c37793269c12835, }, r0a1: u288 { limb0: 0x9ecc215e40764ce6a6db3ce0, limb1: 0x14e8a7b5a57b166edcdfb52, limb2: 0x29e744551489dc3f, }, r1a0: u288 { limb0: 0xee025e7cc0634b8b2fcd88dd, limb1: 0x94b3602ee4867d04d1e549ae, limb2: 0xcce5739cfedc699, }, r1a1: u288 { limb0: 0x2c7318ae1f6db5d41f684334, limb1: 0xd1ba91922e100971bd11dbb5, limb2: 0x1d6c654d5c0913a4, }, }, G2Line { r0a0: u288 { limb0: 0xa137b991ba9048aee9fa0bc7, limb1: 0xf5433785c186cd1100ab6b80, limb2: 0xab519fd7cf8e7f9, }, r0a1: u288 { limb0: 0x90832f45d3398c60aa1a74e2, limb1: 0x17f7ac209532723f22a344b, limb2: 0x23db979f8481c5f, }, r1a0: u288 { limb0: 0x723b0e23c2808a5d1ea6b11d, limb1: 0x3030030d26411f84235c3af5, limb2: 0x122e78da5509eddb, }, r1a1: u288 { limb0: 0xf1718c1e21a9bc3ec822f319, limb1: 0xf5ee6dfa3bd3272b2f09f0c7, limb2: 0x5a29c1e27616b34, }, }, G2Line { r0a0: u288 { limb0: 0x6cf0dc0a1a42af130a792bff, limb1: 0x6eeb4dd41cb8967cd7416c41, limb2: 0x832ca9524375cb4, }, r0a1: u288 { limb0: 0x7e263bdeb1fedd385682b4fc, limb1: 0x3eee92fe8cdb332aeb31d573, limb2: 0x125dc8ce07406159, }, r1a0: u288 { limb0: 0x5fce3aa533d50f8eff589829, limb1: 0x15cefc9330a131dfb10a5ae6, limb2: 0x2fa0a33e98e84220, }, r1a1: u288 { limb0: 0xed6540b1d66bbf1f7bf86da8, limb1: 0x3a5266544635cad0d58d64d6, limb2: 0x149069d5ba2e34da, }, }, G2Line { r0a0: u288 { limb0: 0xbc1ede480873fceb8739511e, limb1: 0xd5a60533bd0ce7869efbc15, limb2: 0x182c17d793eba74d, }, r0a1: u288 { limb0: 0x83bf38d91876ad8999516bc2, limb1: 0x7756322ea3dc079289d51f2d, limb2: 0x1d0f6156a89a4244, }, r1a0: u288 { limb0: 0x6aba652f197be8f99707b88c, limb1: 0xbf94286c245794ea0f562f32, limb2: 0x25a358967a2ca81d, }, r1a1: u288 { limb0: 0xc028cbff48c01433e8b23568, limb1: 0xd2e791f5772ed43b056beba1, limb2: 0x83eb38dff4960e, }, }, G2Line { r0a0: u288 { limb0: 0xf0ea4a2e24640eb0043fa781, limb1: 0x8a5ca14e0ac3b7d4409fcb40, limb2: 0x67b373e8abc5602, }, r0a1: u288 { limb0: 0x7c391162763fc85bf5c94818, limb1: 0xb389e19eb97568e7e7e4617d, limb2: 0x1d3f1c590945ef5c, }, r1a0: u288 { limb0: 0xce60f9534da6a36cda2ebe99, limb1: 0x4a48ecfd6beb4596b2736458, limb2: 0x2a3e1d1f2d7f13e0, }, r1a1: u288 { limb0: 0x8546f7e328bc13d11bb19a65, limb1: 0xb68deedd4c4b131fa83bb2a5, limb2: 0x15f7b8d2c8e7626e, }, }, G2Line { r0a0: u288 { limb0: 0xc2a2b787d8e718e81970db80, limb1: 0x5372abeaf56844dee60d6198, limb2: 0x131210153a2217d6, }, r0a1: u288 { limb0: 0x70421980313e09a8a0e5a82d, limb1: 0xf75ca1f68f4b8deafb1d3b48, limb2: 0x102113c9b6feb035, }, r1a0: u288 { limb0: 0x4654c11d73bda84873de9b86, limb1: 0xa67601bca2e595339833191a, limb2: 0x1c2b76e439adc8cc, }, r1a1: u288 { limb0: 0x9c53a48cc66c1f4d644105f2, limb1: 0xa17a18867557d96fb7c2f849, limb2: 0x1deb99799bd8b63a, }, }, G2Line { r0a0: u288 { limb0: 0xc32026c56341297fa080790c, limb1: 0xe23ad2ff283399133533b31f, limb2: 0xa6860f5c968f7ad, }, r0a1: u288 { limb0: 0x2966cf259dc612c6a4d8957d, limb1: 0xfba87ea86054f3db5774a08f, limb2: 0xc73408b6a646780, }, r1a0: u288 { limb0: 0x6272ce5976d8eeba08f66b48, limb1: 0x7dfbd78fa06509604c0cec8d, limb2: 0x181ec0eaa6660e45, }, r1a1: u288 { limb0: 0x48af37c1a2343555fbf8a357, limb1: 0xa7b5e1e20e64d6a9a9ce8e61, limb2: 0x1147dcea39a47abd, }, }, G2Line { r0a0: u288 { limb0: 0x24892e4246676601de7ff011, limb1: 0x538390fa26e7a81a0d183f27, limb2: 0x3410fd15a886c28, }, r0a1: u288 { limb0: 0x26b21dedab7f4232acbd4ff0, limb1: 0xa3b070b5094882aba51e9b07, limb2: 0xd20955719266e4d, }, r1a0: u288 { limb0: 0xe9495357ddc8fab97186f3fa, limb1: 0x39314e488ba5e56819f2526f, limb2: 0x2319d043c6fac62e, }, r1a1: u288 { limb0: 0x43af9a4d62880cabbd0c0091, limb1: 0x85c4696da0e2107eebe8d213, limb2: 0x15e73634a9b93263, }, }, G2Line { r0a0: u288 { limb0: 0x7225a042235a3e52ed4f3656, limb1: 0x29547006cc96d9af59e981e9, limb2: 0x2bb8d83d86b1948, }, r0a1: u288 { limb0: 0x7aff77100255f01d01e06689, limb1: 0xeafc9593264cb70dd2c5c40a, limb2: 0x16feef8d11db8f6c, }, r1a0: u288 { limb0: 0x38197214c4ec640e68ed7bd6, limb1: 0x6095d2ae38e508122aa0bacd, limb2: 0x15ee15a5c89d28c4, }, r1a1: u288 { limb0: 0x59cc5927de581d2bba41fb39, limb1: 0x9368a6b2bf2630ccd9ee111a, limb2: 0x1d1cd760d41a3053, }, }, G2Line { r0a0: u288 { limb0: 0x4033c51e6e469818521cd2ae, limb1: 0xb71a4629a4696b2759f8e19e, limb2: 0x4f5744e29c1eb30, }, r0a1: u288 { limb0: 0xa4f47bbc60cb0649dca1c772, limb1: 0x835f427106f4a6b897c6cf23, limb2: 0x17ca6ea4855756bb, }, r1a0: u288 { limb0: 0x7f844a35c7eeadf511e67e57, limb1: 0x8bb54fb0b3688cac8860f10, limb2: 0x1c7258499a6bbebf, }, r1a1: u288 { limb0: 0x10d269c1779f96946e518246, limb1: 0xce6fcef6676d0dacd395dc1a, limb2: 0x2cf4c6ae1b55d87d, }, }, G2Line { r0a0: u288 { limb0: 0xb8a97adf87c08c9754a126a3, limb1: 0x75a7ddf60605563f709106d2, limb2: 0x27851c7de29730da, }, r0a1: u288 { limb0: 0x8c5ecd7d4bb18df0499e32c7, limb1: 0x2534a91e249a1d6c311618e6, limb2: 0xc0140c1c13a3493, }, r1a0: u288 { limb0: 0x68d1a39239845ea787e22238, limb1: 0xb5a4c3ee8333093391b6d4cd, limb2: 0x1dc5f5b99d814946, }, r1a1: u288 { limb0: 0x8ef9ff9b9895bbf279c0fa0d, limb1: 0x7d3d2f468c0ac9e19fb7c2d, limb2: 0xac27e05ceb646b5, }, }, G2Line { r0a0: u288 { limb0: 0xab74a6bae36b17b1d2cc1081, limb1: 0x904cf03d9d30b1fe9dc71374, limb2: 0x14ffdd55685b7d82, }, r0a1: u288 { limb0: 0x277f7180b7cf33feded1583c, limb1: 0xc029c3968a75b612303c4298, limb2: 0x20ef4ba03605cdc6, }, r1a0: u288 { limb0: 0xd5a7a27c1baba3791ab18957, limb1: 0x973730213d5d70d3e62d6db, limb2: 0x24ca121c566eb857, }, r1a1: u288 { limb0: 0x9f4c2dea0492f548ae7d9e93, limb1: 0xe584b6b251a5227c70c5188, limb2: 0x22bcecac2bd5e51b, }, }, G2Line { r0a0: u288 { limb0: 0x340c82974f7221a53fc2f3ac, limb1: 0x7146f18cd591d423874996e7, limb2: 0xa6d154791056f46, }, r0a1: u288 { limb0: 0x70894ea6418890d53b5ee12a, limb1: 0x882290cb53b795b0e7c8c208, limb2: 0x1b5777dc18b2899b, }, r1a0: u288 { limb0: 0x99a0e528d582006a626206b6, limb1: 0xb1cf825d80e199c5c9c795b5, limb2: 0x2a97495b032f0542, }, r1a1: u288 { limb0: 0xc7cf5b455d6f3ba73debeba5, limb1: 0xbb0a01235687223b7b71d0e5, limb2: 0x250024ac44c35e3f, }, }, G2Line { r0a0: u288 { limb0: 0xcd61de038885e78d976e417f, limb1: 0x81fe397759fd09af54407334, limb2: 0x28d442dfdc1a2e12, }, r0a1: u288 { limb0: 0x75958d6bff91ac1f4b906a6e, limb1: 0xa9ceae56d3016a7b9be4e8d1, limb2: 0x1eb27b86e4ca4913, }, r1a0: u288 { limb0: 0x9e78d6b4bc7dbeb138bb7110, limb1: 0x8fa9343766858993e6f9769e, limb2: 0x25d95a1cdd51a5b7, }, r1a1: u288 { limb0: 0xd0e3a9be366e1fc7643320e8, limb1: 0xc0ba2c1555ff8ac9ad6f5297, limb2: 0x1d994b7cec2490e8, }, }, G2Line { r0a0: u288 { limb0: 0x1e9cf4d22158dc2de3993ad9, limb1: 0x71f64b04e8e9d545208968bb, limb2: 0x11d02ad0f13cfec0, }, r0a1: u288 { limb0: 0xacbea6d3f08ecb77503f05de, limb1: 0x611d520b74ddcb9f2e5828f0, limb2: 0x26202c3e458eb353, }, r1a0: u288 { limb0: 0xb61d83483ca541f57440987c, limb1: 0xa086532338a5827b1445f1c6, limb2: 0x1f5ebd76b5310b94, }, r1a1: u288 { limb0: 0xcac91c4843a6bad2a7cc91cb, limb1: 0x4fbd17f04d76a1b165fed733, limb2: 0x1e860876cd8963af, }, }, G2Line { r0a0: u288 { limb0: 0xccf841cf5c1cf8f4a0485e28, limb1: 0xb5077662d0ce9d755af1446b, limb2: 0x2b08658e9d5ba5cb, }, r0a1: u288 { limb0: 0x6ce62184a15685babd77f27f, limb1: 0x5ff9bb7d74505b0542578299, limb2: 0x7244563488bab2, }, r1a0: u288 { limb0: 0xec778048d344ac71275d961d, limb1: 0x1273984019753000ad890d33, limb2: 0x27c2855e60d361bd, }, r1a1: u288 { limb0: 0xa7a0071e22af2f3a79a12da, limb1: 0xc84a6fd41c20759ff6ff169a, limb2: 0x23e7ef2a308e49d1, }, }, G2Line { r0a0: u288 { limb0: 0x68a906f2806a6cc426b24994, limb1: 0x784dcf104c1dcf0e8f856da2, limb2: 0xc9654f8fbdf2892, }, r0a1: u288 { limb0: 0x9bea5cd65447a96f85459dd6, limb1: 0x13d9bb083bdab401220475b7, limb2: 0x2bd224747d636b4e, }, r1a0: u288 { limb0: 0xae8a73f18ff26f9d25fc0042, limb1: 0x947f72870798502183924783, limb2: 0xae687f4109514e, }, r1a1: u288 { limb0: 0x3dd221c63901d92fbe7bec24, limb1: 0x803d8cd513a8fe56a98984c2, limb2: 0x11912c747e407b17, }, }, G2Line { r0a0: u288 { limb0: 0x7105024c431a33683d9d0b9d, limb1: 0x12e23637b641ab0e5b322ad8, limb2: 0x2918e9e08c764c28, }, r0a1: u288 { limb0: 0x26384979d1f5417e451aeabf, limb1: 0xacfb499e362291d0b053bbf6, limb2: 0x2a6ad1a1f7b04ef6, }, r1a0: u288 { limb0: 0xba4db515be70c384080fc9f9, limb1: 0x5a983a6afa9cb830fa5b66e6, limb2: 0x8cc1fa494726a0c, }, r1a1: u288 { limb0: 0x59c9af9399ed004284eb6105, limb1: 0xef37f66b058b4c971d9c96b0, limb2: 0x2c1839afde65bafa, }, }, G2Line { r0a0: u288 { limb0: 0xd468740be11c72f0d61b3544, limb1: 0xee4537e6229611d1ee5d08f9, limb2: 0x25f95d481420c22b, }, r0a1: u288 { limb0: 0x1057f10f48392fe4e6a8cbb, limb1: 0x71eaba2ec1ad3c43203ee8b9, limb2: 0x28ebfa58c1c65aa1, }, r1a0: u288 { limb0: 0x7d03e13f07b1eecb5cd01d9d, limb1: 0x4e866746c563214e0043c745, limb2: 0x2cd7dc2b0c6cbb4b, }, r1a1: u288 { limb0: 0x5eabc3fb0a14cc2cb63ecd7c, limb1: 0xcfa5e22677730b5197985457, limb2: 0x3db7ea133dcce6e, }, }, G2Line { r0a0: u288 { limb0: 0x6bf13a27b0f4eb6657abc4b, limb1: 0xf78d57f089bffdf07c676bb3, limb2: 0x228e4aefbdd738df, }, r0a1: u288 { limb0: 0x4f41a40b04ec964619823053, limb1: 0xfa3fb44f4a80641a9bb3bc09, limb2: 0x29bf29a3d071ec4b, }, r1a0: u288 { limb0: 0x83823dcdff02bdc8a0e6aa03, limb1: 0x79ac92f113de29251cd73a98, limb2: 0x1ccdb791718d144, }, r1a1: u288 { limb0: 0xa074add9d066db9a2a6046b6, limb1: 0xef3a70034497456c7d001a5, limb2: 0x27d09562d815b4a6, }, }, G2Line { r0a0: u288 { limb0: 0xbf11dea21cd379f966caa6c2, limb1: 0x4e0f8e4b2b5917c45d535ef, limb2: 0xc735dd71c68e4ca, }, r0a1: u288 { limb0: 0xa605ae0ab6554385d99f6e12, limb1: 0x87cd556340ce9c7cc8a6ac63, limb2: 0x210538d78dc01108, }, r1a0: u288 { limb0: 0xc496c32da98d1ae345266146, limb1: 0x76a57df0969a21af8983781e, limb2: 0x269e9aa6f168324a, }, r1a1: u288 { limb0: 0x820373298d73bb39e9d80644, limb1: 0x987291249714fb863a8353df, limb2: 0x120dfbe3b8b4c9c, }, }, G2Line { r0a0: u288 { limb0: 0x87a44d343cc761056f4f2eae, limb1: 0x18016f16818253360d2c8adf, limb2: 0x1bcd5c6e597d735e, }, r0a1: u288 { limb0: 0x593d7444c376f6d69289660b, limb1: 0x1d6d97020b59cf2e4b38be4f, limb2: 0x17133b62617f63a7, }, r1a0: u288 { limb0: 0x88cac99869bb335ec9553a70, limb1: 0x95bcfa7f7c0b708b4d737afc, limb2: 0x1eec79b9db274c09, }, r1a1: u288 { limb0: 0xe465a53e9fe085eb58a6be75, limb1: 0x868e45cc13e7fd9d34e11839, limb2: 0x2b401ce0f05ee6bb, }, }, G2Line { r0a0: u288 { limb0: 0x83f48fbac5c1b94486c2d037, limb1: 0xf95d9333449543de78c69e75, limb2: 0x7bca8163e842be7, }, r0a1: u288 { limb0: 0x60157b2ff6e4d737e2dac26b, limb1: 0x30ab91893fcf39d9dcf1b89, limb2: 0x29a58a02490d7f53, }, r1a0: u288 { limb0: 0x520f9cb580066bcf2ce872db, limb1: 0x24a6e42c185fd36abb66c4ba, limb2: 0x309b07583317a13, }, r1a1: u288 { limb0: 0x5a4c61efaa3d09a652c72471, limb1: 0xfcb2676d6aa28ca318519d2, limb2: 0x1405483699afa209, }, }, G2Line { r0a0: u288 { limb0: 0x887e3388d815fefbe4de67c7, limb1: 0x39aabdf16d5e820c468f07b4, limb2: 0x1021ded60046ae5d, }, r0a1: u288 { limb0: 0x1ffd3f4a7c51d9b9b426759a, limb1: 0xfdcac9390f248e3358903bef, limb2: 0xc85ed498a09eaa4, }, r1a0: u288 { limb0: 0x2e3d9ddae0fe891656c2ebbd, limb1: 0xdbb3756450184a201ee6f6f4, limb2: 0x1f77f974e15e790c, }, r1a1: u288 { limb0: 0xc94662f8a91d828962406a80, limb1: 0x35b6584b35acc901cd8c124d, limb2: 0x1b6cbe14b354c93c, }, }, G2Line { r0a0: u288 { limb0: 0x4e0b59155b1586438f00d1d0, limb1: 0xe7fce333454bea5e5d19da67, limb2: 0x2286d1f263814635, }, r0a1: u288 { limb0: 0xdb0108b13b264fa9efe313bd, limb1: 0x25a0231213b6afe0cc5ac9, limb2: 0x24a55b37cab9e96f, }, r1a0: u288 { limb0: 0x10568376d2134a925d8224e2, limb1: 0x66ff6c53966243f66701ce36, limb2: 0xf0bab9bbaa38df8, }, r1a1: u288 { limb0: 0x9faf33001f67c41b255de466, limb1: 0x30656441023848f72165541a, limb2: 0x1b964ad8ff7afd21, }, }, G2Line { r0a0: u288 { limb0: 0xbfdfdae86101e29da3e869b8, limb1: 0xf969a9b961a28b872e56aac2, limb2: 0x1afdc719440d90f0, }, r0a1: u288 { limb0: 0xee43c995686f13baa9b07266, limb1: 0xbfa387a694c641cceee4443a, limb2: 0x104d8c02eb7f60c8, }, r1a0: u288 { limb0: 0x8d451602b3593e798aecd7fb, limb1: 0x69ffbefe7c5ac2cf68e8691e, limb2: 0x2ea064a1bc373d28, }, r1a1: u288 { limb0: 0x6e7a663073bfe88a2b02326f, limb1: 0x5faadb36847ca0103793fa4a, limb2: 0x26c09a8ec9303836, }, }, G2Line { r0a0: u288 { limb0: 0xa02ed8b8bea4e6398937e400, limb1: 0xba34c7a8c92f6fb9c7eb1009, limb2: 0x14021afa35038d6f, }, r0a1: u288 { limb0: 0x5fed8893a16fc89c77ab6e69, limb1: 0x341d37d9e774298c8289039e, limb2: 0x14228ddafe44ce59, }, r1a0: u288 { limb0: 0x578a1f7a73e6d177db8ef992, limb1: 0xe0414e8de48555d5e7715a16, limb2: 0x48dd64815f16a0a, }, r1a1: u288 { limb0: 0xf23687d236711b4c0ca8ce76, limb1: 0x50664dd13060c77c5166e7fe, limb2: 0x10090c847a3c2764, }, }, G2Line { r0a0: u288 { limb0: 0x3d038747ebac16adc1c50bdd, limb1: 0xe3706a783e99f73ac742aa1a, limb2: 0x17eac23b00b545ff, }, r0a1: u288 { limb0: 0xdc25ff0bd02abcbe502c4e37, limb1: 0x39b92e6ebb65e5f2d8504f90, limb2: 0x2415b5f61301dff6, }, r1a0: u288 { limb0: 0x9cdcb2146d15f37900db82ac, limb1: 0x96c3940e2f5c5f8198fadee3, limb2: 0x2f662ea79b473fc2, }, r1a1: u288 { limb0: 0xc0fb95686de65e504ed4c57a, limb1: 0xec396c7c4275d4e493b00713, limb2: 0x106d2aab8d90d517, }, }, G2Line { r0a0: u288 { limb0: 0xb836776ba636148782ccc53a, limb1: 0xc85e575c26103c32434b48b3, limb2: 0xbbd5f5df165aeca, }, r0a1: u288 { limb0: 0x75eb6906bb101ea7f525fe68, limb1: 0xa69a82fea7ca9f41fb7f0712, limb2: 0x2d0f62c13f7d525b, }, r1a0: u288 { limb0: 0x94475fc56769da417d920d02, limb1: 0x9bacf6721bad4841a1ead330, limb2: 0x264649c0901fd86, }, r1a1: u288 { limb0: 0x45cddba5ab6cb8d80986a4b5, limb1: 0x8a2735ec64c123d9b1d94e43, limb2: 0x8b8c3087a3fc782, }, }, G2Line { r0a0: u288 { limb0: 0x49bbb4d856921e3177c0b5bf, limb1: 0x76d84d273694e662bdd5d364, limb2: 0xea5dc611bdd369d, }, r0a1: u288 { limb0: 0x9e9fc3adc530fa3c5c6fd7fe, limb1: 0x114bb0c0e8bd247da41b3883, limb2: 0x6044124f85d2ce, }, r1a0: u288 { limb0: 0xa6e604cdb4e40982a97c084, limb1: 0xef485caa56c7820be2f6b11d, limb2: 0x280de6387dcbabe1, }, r1a1: u288 { limb0: 0xcaceaf6df5ca9f8a18bf2e1e, limb1: 0xc5cce932cc6818b53136c142, limb2: 0x12f1cd688682030c, }, }, G2Line { r0a0: u288 { limb0: 0x37497c23dcf629df58a5fa12, limb1: 0x4fcd5534ae47bded76245ac9, limb2: 0x1715ab081e32ac95, }, r0a1: u288 { limb0: 0x856275471989e2c288e3c83, limb1: 0xb42d81a575b89b127a7821a, limb2: 0x5fa75a0e4ae3118, }, r1a0: u288 { limb0: 0xeb22351e8cd345c23c0a3fef, limb1: 0x271feb16d4b47d2267ac9d57, limb2: 0x258f9950b9a2dee5, }, r1a1: u288 { limb0: 0xb5f75468922dc025ba7916fa, limb1: 0x7e24515de90edf1bde4edd9, limb2: 0x289145b3512d4d81, }, }, G2Line { r0a0: u288 { limb0: 0xce1ded2782ddd08e6865ab4, limb1: 0x4583c91a985a438fdac4f4c, limb2: 0x13d595d330502573, }, r0a1: u288 { limb0: 0x595067b65592ac4d6c9b5b5c, limb1: 0x4ef806daef8c02f94ecaf97f, limb2: 0x7869c312062e0a8, }, r1a0: u288 { limb0: 0x38cb6ea081fb30e87015f4c3, limb1: 0xc380b087269e9836e39be81, limb2: 0x7619e66982167dd, }, r1a1: u288 { limb0: 0x84f696893f8cb0e616e335b6, limb1: 0xb7fd749a8812159ce96c3f43, limb2: 0x2b80806bd7eeb0cd, }, }, G2Line { r0a0: u288 { limb0: 0xeed11dd701d662b9bd85fda4, limb1: 0x284c3b305b25ed852d47268e, limb2: 0x37e8aad03f1efa3, }, r0a1: u288 { limb0: 0x1ba355db79739c5b954c99e, limb1: 0xd38db182b11b150b1ac2b6cd, limb2: 0x1b416cf91fe88aa, }, r1a0: u288 { limb0: 0xd8f230276c30350267b5d2e6, limb1: 0x6057c8dd8abc942db7f6e156, limb2: 0x127d2dc576c754d8, }, r1a1: u288 { limb0: 0x3a34d39084d5d8b2204f6632, limb1: 0xe18cb27f7b45639b6cb65d23, limb2: 0xb6cc7185cc1c602, }, }, G2Line { r0a0: u288 { limb0: 0x95b7b32bcc3119c64a62a8de, limb1: 0xe07184496f17bbd59a4b7bbd, limb2: 0x1708c536fd78b531, }, r0a1: u288 { limb0: 0xfa85b5778c77166c1523a75e, limb1: 0x89a00c53309a9e525bef171a, limb2: 0x2d2287dd024e421, }, r1a0: u288 { limb0: 0x31fd0884eaf2208bf8831e72, limb1: 0x537e04ea344beb57ee645026, limb2: 0x23c7f99715257261, }, r1a1: u288 { limb0: 0x8c38b3aeea525f3c2d2fdc22, limb1: 0xf838a99d9ec8ed6dcec6a2a8, limb2: 0x2973d5159ddc479a, }, }, G2Line { r0a0: u288 { limb0: 0x3f058d8c63fd905d3ca29b42, limb1: 0x1f0a90982cc68e4ddcd83e57, limb2: 0x240aeaae0783fbfa, }, r0a1: u288 { limb0: 0xedfee81d80da310fdf0d0d8, limb1: 0xc2208e6de8806cf491bd74d4, limb2: 0xb7318be62a476af, }, r1a0: u288 { limb0: 0x3c6920c8a24454c634f388fe, limb1: 0x23328a006312a722ae09548b, limb2: 0x1d2f1c58b80432e2, }, r1a1: u288 { limb0: 0xb72980574f7a877586de3a63, limb1: 0xcd773b87ef4a29c16784c5ae, limb2: 0x1f812c7e22f339c5, }, }, G2Line { r0a0: u288 { limb0: 0x4ee6eef57f5c866acf77f595, limb1: 0x3aec7154a9f1f285829186a5, limb2: 0x283e9794a30457d, }, r0a1: u288 { limb0: 0xd59a661484d8c376567086d3, limb1: 0x1f9c69bb6fb467cd93899dd2, limb2: 0x25dd4d1be0b765b, }, r1a0: u288 { limb0: 0x5b9c47593dfbd508ab34c7b3, limb1: 0x5cc228830e12085b69b345df, limb2: 0x563a3f38bb17d2d, }, r1a1: u288 { limb0: 0xd13362074a4f1c9ad9063afd, limb1: 0xae0b6ddad1bdbd332e510b50, limb2: 0x6fe176282e9d5fb, }, }, G2Line { r0a0: u288 { limb0: 0x8909147ac871b1dfb1b93dea, limb1: 0x142dbce634570b3004e7fc, limb2: 0x6c20d9db5dd84da, }, r0a1: u288 { limb0: 0x9860d4eddaa4bc238176c6fc, limb1: 0x2b0526a4c3964c89747e80c5, limb2: 0x8fd2f58f97118b6, }, r1a0: u288 { limb0: 0x350f6ba8623173a2b59246f5, limb1: 0xc1b28fd98d68ff68c2905942, limb2: 0x8244875fe9df1c7, }, r1a1: u288 { limb0: 0x57cc1c6a24b662006d9dbe1b, limb1: 0x5ad285ba45ea4be688bff724, limb2: 0x2b07fd32ff344b21, }, }, G2Line { r0a0: u288 { limb0: 0xfeebe92941f95b6ea1d095bb, limb1: 0x9c7962eb8bbeb95a9ca7cf50, limb2: 0x290bdaf3b9a08dc3, }, r0a1: u288 { limb0: 0x686cfa11c9d4b93675495599, limb1: 0xb1d69e17b4b5ebf64f0d51e1, limb2: 0x2c18bb4bdc2e9567, }, r1a0: u288 { limb0: 0x17419b0f6a04bfc98d71527, limb1: 0x80eba6ff02787e3de964a4d1, limb2: 0x26087bb100e7ff9f, }, r1a1: u288 { limb0: 0x17c4ee42c3f612c43a08f689, limb1: 0x7276bdda2df6d51a291dba69, limb2: 0x40a7220ddb393e1, }, }, G2Line { r0a0: u288 { limb0: 0x37349ad9dc3023fc75053e02, limb1: 0x33a3d352f746ab24b3b58b0a, limb2: 0xec4c339b84b811d, }, r0a1: u288 { limb0: 0x7dcfa2460a0ad9b521a47470, limb1: 0xba3ff4b52958f6b7341790da, limb2: 0x24709d3b126eb975, }, r1a0: u288 { limb0: 0xe5167ab2a7c59462398695fe, limb1: 0x639d95ac9180109e9716c52d, limb2: 0x1ad3dd11a73c7763, }, r1a1: u288 { limb0: 0xc4074c8a20ffec99be26ea0d, limb1: 0x33d88e5ff7a03f8fc7673634, limb2: 0x212a99002b140a7c, }, }, G2Line { r0a0: u288 { limb0: 0x830d777c19040571a1d72fd0, limb1: 0x651b2c6b8c292020817a633f, limb2: 0x268af1e285bc59ff, }, r0a1: u288 { limb0: 0xede78baa381c5bce077f443d, limb1: 0x540ff96bae21cd8b9ae5438b, limb2: 0x12a1fa7e3b369242, }, r1a0: u288 { limb0: 0x797c0608e5a535d8736d4bc5, limb1: 0x375faf00f1147656b7c1075f, limb2: 0xda60fab2dc5a639, }, r1a1: u288 { limb0: 0x610d26085cfbebdb30ce476e, limb1: 0x5bc55890ff076827a09e8444, limb2: 0x14272ee2d25f20b7, }, }, G2Line { r0a0: u288 { limb0: 0x430bef5bf19edee76f43f86d, limb1: 0xd0d7e3e70da75944107b2d4a, limb2: 0x1a773d3afca56895, }, r0a1: u288 { limb0: 0xac9908b990c2eba0c566a721, limb1: 0xb5b9dd164b61dc1a46f57bc0, limb2: 0x153897d14189a3e9, }, r1a0: u288 { limb0: 0x873c42f94417c98a18ef8b21, limb1: 0x7fd90a68e925814a5c90c64e, limb2: 0xb43f89cdc102905, }, r1a1: u288 { limb0: 0x6a2633ae3430261a8d930055, limb1: 0xccf2888e7fa1b1be32616fcc, limb2: 0x281f7352c8bd69b4, }, }, G2Line { r0a0: u288 { limb0: 0xd6862e1a4ca3b2baf6f8d8aa, limb1: 0x96f9066dded3a3d899025af4, limb2: 0x1a98af9f0d48fd3, }, r0a1: u288 { limb0: 0x276b417cc61ea259c114314e, limb1: 0x464399e5e0037b159866b246, limb2: 0x12cc97dcf32896b5, }, r1a0: u288 { limb0: 0xef72647f4c2d08fc038c4377, limb1: 0x34883cea19be9a490a93cf2b, limb2: 0x10d01394daa61ed0, }, r1a1: u288 { limb0: 0xdf345239ece3acaa62919643, limb1: 0x914780908ece64e763cca062, limb2: 0xee2a80dbd2012a3, }, }, G2Line { r0a0: u288 { limb0: 0x1d5a31f4d08a0ebf7e071e00, limb1: 0xcd1244dd95dd30005f531f81, limb2: 0xb4cb469a2dcf4f1, }, r0a1: u288 { limb0: 0x7c5938adaf38b355092de1f1, limb1: 0x292ab08995b293abfcba14b, limb2: 0x1fd126a2b9f37c67, }, r1a0: u288 { limb0: 0x6e9d352b02a7cb771fcc33f9, limb1: 0x7754d8536eefda2025a07340, limb2: 0x1840289291c35a72, }, r1a1: u288 { limb0: 0xe85f465417b7bd758c547b2e, limb1: 0xf7f703c3bc55ff8a01fa9365, limb2: 0xfa301227880a841, }, }, G2Line { r0a0: u288 { limb0: 0xb871630bb14808308256993, limb1: 0x5aa6407e90ac7cd9d34c84b1, limb2: 0x1a45d81956be51f9, }, r0a1: u288 { limb0: 0x4e35a5f1c75bc96bbe481d7c, limb1: 0xb461fa7d1b269bf49be0ed7f, limb2: 0x88efe970e8c4e4a, }, r1a0: u288 { limb0: 0xff160df5ead7b7b25d8892e5, limb1: 0xbbbd6b9b216396e83fd6aa70, limb2: 0x2dcf636e87cde612, }, r1a1: u288 { limb0: 0x44d33f7f0dbcaccf59607fcd, limb1: 0xae52f65a36ac4f17e0e213de, limb2: 0x12e6c11148485b9b, }, }, G2Line { r0a0: u288 { limb0: 0xa89926f3c9ed74cf35d8982d, limb1: 0x8e9003f1a42b81a81fe0df1e, limb2: 0x2732162604574861, }, r0a1: u288 { limb0: 0x4ac22d9feb0443ee015b81e1, limb1: 0xd442070c95acaa6a39e85ae9, limb2: 0x1a42773c0ac19a09, }, r1a0: u288 { limb0: 0x7d32a4a55a853c2309cd6f0, limb1: 0x747d1e031aa2229e38cfca1f, limb2: 0x1b6358645f1162ad, }, r1a1: u288 { limb0: 0xd511412ffa32391dda88c29b, limb1: 0x5f57b2aab83993734eb330b0, limb2: 0xc3766c22260b874, }, }, G2Line { r0a0: u288 { limb0: 0xa4058149e82ea51362b79be4, limb1: 0x734eba2621918a820ae44684, limb2: 0x110a314a02272b1, }, r0a1: u288 { limb0: 0xe2b43963ef5055df3c249613, limb1: 0x409c246f762c0126a1b3b7b7, limb2: 0x19aa27f34ab03585, }, r1a0: u288 { limb0: 0x179aad5f620193f228031d62, limb1: 0x6ba32299b05f31b099a3ef0d, limb2: 0x157724be2a0a651f, }, r1a1: u288 { limb0: 0xa33b28d9a50300e4bbc99137, limb1: 0x262a51847049d9b4d8cea297, limb2: 0x189acb4571d50692, }, }, G2Line { r0a0: u288 { limb0: 0xbd50e560f6bb994a2922fa51, limb1: 0x99a1d1b01aa18c7f31e917fc, limb2: 0xd7ef26150626982, }, r0a1: u288 { limb0: 0xf014da7a050c535a40cfc124, limb1: 0x3b1a2e82c4f0fc6379900c54, limb2: 0x1a5cfd9a14902546, }, r1a0: u288 { limb0: 0x9aaa7b13fd8f24f65c93eec5, limb1: 0xab93d53f2815295691702b82, limb2: 0xde083d90578af6f, }, r1a1: u288 { limb0: 0xfbd08ec0a79725a4b6e8b67c, limb1: 0x69946154b610ed695859295b, limb2: 0x277a133a0d6da917, }, }, G2Line { r0a0: u288 { limb0: 0x29bd4381ae4afc677ee37ed6, limb1: 0x29ed43453f9a008d9176f004, limb2: 0x24134eb915104f43, }, r0a1: u288 { limb0: 0x81597f82bb67e90a3e72bdd2, limb1: 0xab3bbde5f7bbb4df6a6b5c19, limb2: 0x19ac61eea40a367c, }, r1a0: u288 { limb0: 0xe30a79342fb3199651aee2fa, limb1: 0xf500f028a73ab7b7db0104a3, limb2: 0x808b50e0ecb5e4d, }, r1a1: u288 { limb0: 0x55f2818453c31d942444d9d6, limb1: 0xf6dd80c71ab6e893f2cf48db, limb2: 0x13c3ac4488abd138, }, }, G2Line { r0a0: u288 { limb0: 0x32bc8a981429b931b50b70e1, limb1: 0x99cffcd897696a0e5c987090, limb2: 0x2663f59204065aeb, }, r0a1: u288 { limb0: 0x6d0d07933c107a489c682134, limb1: 0xb81690a5db81aa6e8c0ef203, limb2: 0x27cb7b6ce66b5225, }, r1a0: u288 { limb0: 0xf6fc5c5aa501cffb8ee75a4b, limb1: 0xf8d08f9383f191384ba8077b, limb2: 0x28b89e3f89c071c1, }, r1a1: u288 { limb0: 0x1bd9021070481b0a40cb6d36, limb1: 0x86562734b4f3fcfb46e39713, limb2: 0x1ec7729185561f74, }, }, G2Line { r0a0: u288 { limb0: 0xd1464269bbeafa546f559b8f, limb1: 0xab7f7dcd1ac32b86979471cf, limb2: 0x6a38256ee96f113, }, r0a1: u288 { limb0: 0xf14d50984e65f9bc41df4e7e, limb1: 0x350aff9be6f9652ad441a3ad, limb2: 0x1b1e60534b0a6aba, }, r1a0: u288 { limb0: 0x9e98507da6cc50a56f023849, limb1: 0xcf8925e03f2bb5c1ba0962dd, limb2: 0x2b18961810a62f87, }, r1a1: u288 { limb0: 0x3a4c61b937d4573e3f2da299, limb1: 0x6f4c6c13fd90f4edc322796f, limb2: 0x13f4e99b6a2f025e, }, }, G2Line { r0a0: u288 { limb0: 0xd7f1137b131005c05a263909, limb1: 0x377579bc2a44238703830641, limb2: 0x1edb40cec982e433, }, r0a1: u288 { limb0: 0xb234350aafc13259037ff7b8, limb1: 0x8ce5fcfc41890347214723f3, limb2: 0x1d5cfe6e2536a23b, }, r1a0: u288 { limb0: 0x8d74f12ae2cdd199736e4db9, limb1: 0xf5835da25b7c74dea8742767, limb2: 0xa4f9baaf2b585aa, }, r1a1: u288 { limb0: 0x6c077e93c1a1bae84d31f2de, limb1: 0xeb24bf9c8e1a11a15952b35f, limb2: 0x182a33beae2d73ac, }, }, G2Line { r0a0: u288 { limb0: 0xe0115a79120ae892a72f3dcb, limb1: 0xec67b5fc9ea414a4020135f, limb2: 0x1ee364e12321904a, }, r0a1: u288 { limb0: 0xa74d09666f9429c1f2041cd9, limb1: 0x57ffe0951f863dd0c1c2e97a, limb2: 0x154877b2d1908995, }, r1a0: u288 { limb0: 0xcbe5e4d2d2c91cdd4ccca0, limb1: 0xe6acea145563a04b2821d120, limb2: 0x18213221f2937afb, }, r1a1: u288 { limb0: 0xfe20afa6f6ddeb2cb768a5ae, limb1: 0x1a3b509131945337c3568fcf, limb2: 0x127b5788263a927e, }, }, G2Line { r0a0: u288 { limb0: 0x23a3796fea17793ca760d4b4, limb1: 0xb4abf7ebb030cb2f1630ed5f, limb2: 0x64ab24ff28d4416, }, r0a1: u288 { limb0: 0x538a1fa509f26d8c8bdeb966, limb1: 0x73f3e2cd56d3c514e4a37c42, limb2: 0x60a236e3776ce68, }, r1a0: u288 { limb0: 0xd80f5ba56c16fe54bda3fa80, limb1: 0xe5f8701be9499623ce8a673d, limb2: 0x18c79fac25052970, }, r1a1: u288 { limb0: 0x8929aad47a81f1378a817ef5, limb1: 0xfadba04c7242b43b5cf39d33, limb2: 0xb3e5f5c3c9fb3b2, }, }, G2Line { r0a0: u288 { limb0: 0xe7c658aecdab4db3c83f7927, limb1: 0xfbf162264ca04ee50c70bde8, limb2: 0x2a20f4565b7ff885, }, r0a1: u288 { limb0: 0x45b1c2f0a1226361f42683c0, limb1: 0x9acdd892c48c08de047296bc, limb2: 0x27836373108925d4, }, r1a0: u288 { limb0: 0xc0ea9294b345e6d4892676a7, limb1: 0xcba74eca77086af245d1606e, limb2: 0xf20edac89053e72, }, r1a1: u288 { limb0: 0x4c92a28f2779a527a68a938c, limb1: 0x3a1c3c55ff9d20eac109fab3, limb2: 0x21c4a8c524b1ee7d, }, }, G2Line { r0a0: u288 { limb0: 0x731f3a1b36de3023901591ff, limb1: 0xe34bb92f321ca5d3092bcbad, limb2: 0x2216559b45dd1c2f, }, r0a1: u288 { limb0: 0x3bac805b2d142e0cc0edeb11, limb1: 0x5d11df064af70b6d83d6ce74, limb2: 0x14c2db65d318303, }, r1a0: u288 { limb0: 0xc3ee59929ecba416af62e06e, limb1: 0xcbdffb49b2c9219cfda57258, limb2: 0x9e92730073f74d7, }, r1a1: u288 { limb0: 0x137f2ce23b788e764203080c, limb1: 0x1340ccaf8101da98864c6b0c, limb2: 0x103ddd7382137938, }, }, G2Line { r0a0: u288 { limb0: 0xa68021d593c46246af22559e, limb1: 0x5c2cfc5bc4cd1b48f4704134, limb2: 0x296066ede1298f8c, }, r0a1: u288 { limb0: 0xfe17dd6765eb9b9625eb6a84, limb1: 0x4e35dd8e8f6088bb14299f8d, limb2: 0x1a380ab2689106e4, }, r1a0: u288 { limb0: 0x82bacf337ca09853df42bc59, limb1: 0xa15de4ef34a30014c5a2e9ae, limb2: 0x243cc0cec53c778b, }, r1a1: u288 { limb0: 0xcb2a1bf18e3ba9349b0a8bf2, limb1: 0x35134b2505cbb5a4c91f0ac4, limb2: 0x25e45206b13f43c4, }, }, G2Line { r0a0: u288 { limb0: 0x8e97b007ffd9891bd0e77650, limb1: 0x77671278ac33f17df6b1db88, limb2: 0x243daddc47f5d5c2, }, r0a1: u288 { limb0: 0x655fe4c8bbe5ee06aaa0054b, limb1: 0xf751450b02c93c7ddea95938, limb2: 0x21aa988e950d563f, }, r1a0: u288 { limb0: 0xb51b3b6b8582de3eb0549518, limb1: 0x84a1031766b7e465f5bbf40c, limb2: 0xd46c2d5b95e5532, }, r1a1: u288 { limb0: 0x50b6ddd8a5eef0067652191e, limb1: 0x298832a0bc46ebed8bff6190, limb2: 0xb568b4fe8311f93, }, }, G2Line { r0a0: u288 { limb0: 0x6ad6cf94fc3bf4bfbd69ba1d, limb1: 0x806961a05ecbb229a267a99d, limb2: 0x1671d0fb2e942009, }, r0a1: u288 { limb0: 0x2e9b86ac823b3213d26fe614, limb1: 0x48a66f0ee2f66e6be68a4eab, limb2: 0x9162eb41435b523, }, r1a0: u288 { limb0: 0xeda3ea2df37c2c19a07e26a6, limb1: 0x96cb3f72bef333861a5f6793, limb2: 0x6e84ee455d519bf, }, r1a1: u288 { limb0: 0x52f50c292b08883fa721dada, limb1: 0x2029cc6ef51b67f2f30e583a, limb2: 0xb289cfc0164b2ed, }, }, G2Line { r0a0: u288 { limb0: 0x6c70c1e14706dbfd33efe75c, limb1: 0xbd47837fd6f0a808a8cac5c3, limb2: 0x1b60ad36bb1e656e, }, r0a1: u288 { limb0: 0x833e70940a681aa43a083ad0, limb1: 0x3ffecc6d09b7a0ea1df06988, limb2: 0x216e7660abbec411, }, r1a0: u288 { limb0: 0xdaddeff80a0eccefcd3726b4, limb1: 0xd7b4c983581d4e9b3f210f17, limb2: 0x26bf9b818756e2b, }, r1a1: u288 { limb0: 0xb32fd7bd9890bbed35311a72, limb1: 0xa30e2587947d85bbece4c62f, limb2: 0x197a3b46e94f9f24, }, }, G2Line { r0a0: u288 { limb0: 0xddb4db99db681d35f71a159c, limb1: 0xf71a330019414e6fdee75700, limb2: 0x14d9838e7d1918bb, }, r0a1: u288 { limb0: 0x203c8bac71951a5f2c653710, limb1: 0x9fc93f8da38ecc2957313982, limb2: 0x7b6d981259cabd9, }, r1a0: u288 { limb0: 0xa7297cdb5be0cc45d48ca6af, limb1: 0xa07b4b025ebe6c960eddfc56, limb2: 0xef2a5c30ef00652, }, r1a1: u288 { limb0: 0xb7f05c76d860e9122b36ecd7, limb1: 0x407d6522e1f9ce2bcbf80eda, limb2: 0x197625a558f32c36, }, }, G2Line { r0a0: u288 { limb0: 0xe6af6774cb7a4b647bc24bc6, limb1: 0x76bea1b00f9735d1977d2636, limb2: 0xc89d9397e87260c, }, r0a1: u288 { limb0: 0x96bf96a3ec6330e2471bedb, limb1: 0xaefe1b80eabbd9aea0986912, limb2: 0x2060760fa91e6007, }, r1a0: u288 { limb0: 0x7bcc695f496777a5639d8e67, limb1: 0x521bb49545544f2017835a37, limb2: 0x23bd13f6824a9c20, }, r1a1: u288 { limb0: 0x2a7663f245635451e8e9395b, limb1: 0x2a618c0e730e827ea1b6c5b8, limb2: 0x4b769d1e5ea2d59, }, }, G2Line { r0a0: u288 { limb0: 0xb0f04df9dec94801e48a6ff7, limb1: 0xdc59d087c627d38334e5b969, limb2: 0x3d36e11420be053, }, r0a1: u288 { limb0: 0xc80f070001aa1586189e0215, limb1: 0xff849fcbbbe7c00c83ab5282, limb2: 0x2a2354b2882706a6, }, r1a0: u288 { limb0: 0x48cf70c80f08b6c7dc78adb2, limb1: 0xc6632efa77b36a4a1551d003, limb2: 0xc2d3533ece75879, }, r1a1: u288 { limb0: 0x63e82ba26617416a0b76ddaa, limb1: 0xdaceb24adda5a049bed29a50, limb2: 0x1a82061a3344043b, }, }, G2Line { r0a0: u288 { limb0: 0x5870b524b1a3550dd400ccc5, limb1: 0x852bc0b37d0f914b8073f12f, limb2: 0x16509ed87eff5a4e, }, r0a1: u288 { limb0: 0x88260fe925feb155aed3786a, limb1: 0x67d1bdd00f0234c2f4bfc1dc, limb2: 0x2d447aa64752d13, }, r1a0: u288 { limb0: 0x61cd38a81ad2ff47aed15d31, limb1: 0xbca0f1fb3a56f9f221477273, limb2: 0x24049dab533565eb, }, r1a1: u288 { limb0: 0x6c2add460f1dc00897d5b5da, limb1: 0x35bb326b6d5280eee3f8c765, limb2: 0x13a4b8025098500, }, }, G2Line { r0a0: u288 { limb0: 0x9152fecf0f523415acc7c7be, limb1: 0xd9632cbfccc4ea5d7bf31177, limb2: 0x2d7288c5f8c83ab1, }, r0a1: u288 { limb0: 0x53144bfe4030f3f9f5efda8, limb1: 0xfeec394fbf392b11c66bae27, limb2: 0x28840813ab8a200b, }, r1a0: u288 { limb0: 0xdec3b11fbc28b305d9996ec7, limb1: 0x5b5f8d9d17199e149c9def6e, limb2: 0x10c1a149b6751bae, }, r1a1: u288 { limb0: 0x665e8eb7e7d376a2d921c889, limb1: 0xfdd76d06e46ee1a943b8788d, limb2: 0x8bb21d9960e837b, }, }, G2Line { r0a0: u288 { limb0: 0x3a67c28a175200e631aa506a, limb1: 0x7397303a34968ff17c06e801, limb2: 0x1b81e0c63123688b, }, r0a1: u288 { limb0: 0x3490cfd4f076c621dac4a12c, limb1: 0xec183578c91b90b72e5887b7, limb2: 0x179fb354f608da00, }, r1a0: u288 { limb0: 0x9322bde2044dde580a78ba33, limb1: 0xfc74821b668d3570cad38f8b, limb2: 0x8cec54a291f5e57, }, r1a1: u288 { limb0: 0xc2818b6a9530ee85d4b2ae49, limb1: 0x8d7b651ad167f2a43d7a2d0a, limb2: 0x7c9ca9bab0ffc7f, }, }, G2Line { r0a0: u288 { limb0: 0x5622114faf115105095ab77f, limb1: 0x54762377d7848bf1c52b1fce, limb2: 0x1f97b82262bcf5d6, }, r0a1: u288 { limb0: 0x6085f868127e9f82a6324ea7, limb1: 0x88a39c58534935bde6a49ab, limb2: 0x7f8a3494505b851, }, r1a0: u288 { limb0: 0xd3eabc17c5e2f4e09171b9dd, limb1: 0x1925fbd52a9cb6a997959648, limb2: 0x21518ac51afc3758, }, r1a1: u288 { limb0: 0x6096ef3f52e60023239e48e4, limb1: 0x865e3876b961acac0b78e525, limb2: 0x860d5900ad68c37, }, }, G2Line { r0a0: u288 { limb0: 0x2ad5fd7aad65b27d37fb015a, limb1: 0x481729d76f6a024e82fb745d, limb2: 0x109a944738eaca6a, }, r0a1: u288 { limb0: 0x3297a180bf2677cff3ccb41f, limb1: 0xa65e1bdf4bb474832f0a5157, limb2: 0x1978ab7a84d8651b, }, r1a0: u288 { limb0: 0x708be8948dd3360c8723e464, limb1: 0xbaed9d16b05c7d52f3e91f9f, limb2: 0x1975a6b856112bc2, }, r1a1: u288 { limb0: 0xdff0a3ede7d8433f08340a93, limb1: 0xd6415eabeb4ddb811aa617b2, limb2: 0xdb9f4e71e973c6, }, }, G2Line { r0a0: u288 { limb0: 0xa576408f8300de3a7714e6ae, limb1: 0xe1072c9a16f202ecf37fbc34, limb2: 0x1b0cb1e2b5871263, }, r0a1: u288 { limb0: 0x2128e2314694b663286e231e, limb1: 0x54bea71957426f002508f715, limb2: 0x36ecc5dbe069dca, }, r1a0: u288 { limb0: 0x17c77cd88f9d5870957850ce, limb1: 0xb7f4ec2bc270ce30538fe9b8, limb2: 0x766279e588592bf, }, r1a1: u288 { limb0: 0x1b6caddf18de2f30fa650122, limb1: 0x40b77237a29cada253c126c6, limb2: 0x74ff1349b1866c8, }, }, G2Line { r0a0: u288 { limb0: 0x1266deaa34cf31d6d118b057, limb1: 0x7eef7892b3efd91c5364259c, limb2: 0x1f4ac5e1bdc33dac, }, r0a1: u288 { limb0: 0x1068831212b6fe1b5aa05f22, limb1: 0xc39adbfe99701ca7671003e3, limb2: 0x1ab8e56b642f5f82, }, r1a0: u288 { limb0: 0xd53d59610ebf7f664c23c080, limb1: 0x3d162ffb5a16aafc8be99bd3, limb2: 0x281e77e14f6bb9c0, }, r1a1: u288 { limb0: 0x4fe123e56c3c2c64a4260c7b, limb1: 0x90c367228a761d9c50be237c, limb2: 0xf07b0465615fe71, }, }, G2Line { r0a0: u288 { limb0: 0x3603266e05560becab36faef, limb1: 0x8c3b88c9390278873dd4b048, limb2: 0x24a715a5d9880f38, }, r0a1: u288 { limb0: 0xe9f595b111cfd00d1dd28891, limb1: 0x75c6a392ab4a627f642303e1, limb2: 0x17b34a30def82ab6, }, r1a0: u288 { limb0: 0xe706de8f35ac8372669fc8d3, limb1: 0x16cc7f4032b3f3ebcecd997d, limb2: 0x166eba592eb1fc78, }, r1a1: u288 { limb0: 0x7d584f102b8e64dcbbd1be9, limb1: 0x2ead4092f009a9c0577f7d3, limb2: 0x2fe2c31ee6b1d41e, }, }, G2Line { r0a0: u288 { limb0: 0x72253d939632f8c28fb5763, limb1: 0x9b943ab13cad451aed1b08a2, limb2: 0xdb9b2068e450f10, }, r0a1: u288 { limb0: 0x80f025dcbce32f6449fa7719, limb1: 0x8a0791d4d1ed60b86e4fe813, limb2: 0x1b1bd5dbce0ea966, }, r1a0: u288 { limb0: 0xaa72a31de7d815ae717165d4, limb1: 0x501c29c7b6aebc4a1b44407f, limb2: 0x464aa89f8631b3a, }, r1a1: u288 { limb0: 0x6b8d137e1ea43cd4b1f616b1, limb1: 0xdd526a510cc84f150cc4d55a, limb2: 0x1da2ed980ebd3f29, }, }, G2Line { r0a0: u288 { limb0: 0x72dfbb2159ade3ca2db9a485, limb1: 0xaf353e749a0b0e126b462bd4, limb2: 0x11a356fc91502fd1, }, r0a1: u288 { limb0: 0xa8da111fc2adcd5b3152926b, limb1: 0x9d2cd58a348021fb039ad1ce, limb2: 0x24a89d0c2aa1a4c, }, r1a0: u288 { limb0: 0xb7eadf0666fe1d5d8e00ddd3, limb1: 0x9fa7fbf853bdf5b9620cae4c, limb2: 0x2b6df7a5b1f6cfa3, }, r1a1: u288 { limb0: 0x30a81454c2cc541ca6ac5028, limb1: 0xd14ccb5778ca0679f43b0042, limb2: 0x2b15bb249061229, }, }, G2Line { r0a0: u288 { limb0: 0xff2a45b22df6665c3f2b3433, limb1: 0x47f06d2821bccb7d4e1442dc, limb2: 0x1d6d005a3a962538, }, r0a1: u288 { limb0: 0xbc3869f85e6c5199ae4d48ae, limb1: 0xf1b658ebf5d88598be4f771c, limb2: 0x10ce0fad17dffce6, }, r1a0: u288 { limb0: 0x9057fbbd4dbd1f42e143f536, limb1: 0xb84a12963d2bdeff0cfb15cc, limb2: 0xf055cbcbcad6397, }, r1a1: u288 { limb0: 0x2b6c8f90506d8c5f45a796c2, limb1: 0x15647362232ed3834e25f304, limb2: 0x10c73cc1383f51b5, }, }, G2Line { r0a0: u288 { limb0: 0x867cced8a010850958f41ff5, limb1: 0x6a37fdb2b8993eed18bafe8e, limb2: 0x21b9f782109e5a7, }, r0a1: u288 { limb0: 0x7307477d650618e66de38d0f, limb1: 0xacb622ce92a7e393dbe10ba1, limb2: 0x236e70838cee0ed5, }, r1a0: u288 { limb0: 0xb564a308aaf5dda0f4af0f0d, limb1: 0x55fc71e2f13d8cb12bd51e74, limb2: 0x294cf115a234a9e9, }, r1a1: u288 { limb0: 0xbd166057df55c135b87f35f3, limb1: 0xf9f29b6c50f1cce9b85ec9b, limb2: 0x2e8448d167f20f96, }, }, G2Line { r0a0: u288 { limb0: 0xfcb1d8cfddd4980727750419, limb1: 0xe57b3100fcf5fcd46e1cff24, limb2: 0x1ea2a9f23e471d2f, }, r0a1: u288 { limb0: 0x8278659319480914a8f915c3, limb1: 0xb9d01b3a1f3df0c8481b47c7, limb2: 0x1dce2891e1df8e91, }, r1a0: u288 { limb0: 0x373890191ad2139b5ac37f5e, limb1: 0x7d00bf061594cf869f26bd35, limb2: 0x263941972f0c5bcc, }, r1a1: u288 { limb0: 0x35d21a939f18acadda6398c4, limb1: 0x2f266751d30024c345fd2f64, limb2: 0x12415712f84fa7c6, }, }, G2Line { r0a0: u288 { limb0: 0xdedaff3205bb953b2c390b8a, limb1: 0xe1a899da21c1dafb485c707e, limb2: 0x1ec897e7a041493e, }, r0a1: u288 { limb0: 0xf52c3c30cd4d3202b34089e0, limb1: 0xc652aa1ff533e1aad7532305, limb2: 0x2a1df766e5e3aa2e, }, r1a0: u288 { limb0: 0x7ac695d3e19d79b234daaf3d, limb1: 0x5ce2f92666aec92a650feee1, limb2: 0x21ab4fe20d978e77, }, r1a1: u288 { limb0: 0xa64a913a29a1aed4e0798664, limb1: 0x66bc208b511503d127ff5ede, limb2: 0x2389ba056de56a8d, }, }, G2Line { r0a0: u288 { limb0: 0x65ab6317a706e3cda223edf8, limb1: 0x9a22ac3ac5e4dd3e9f987fd9, limb2: 0x157637901a8b31a5, }, r0a1: u288 { limb0: 0xc57d325b1af3a13019c15e11, limb1: 0x2812651fd79b5fbbb05cc3d7, limb2: 0x1f1602a02e76536f, }, r1a0: u288 { limb0: 0xdf3ad97a0633d33f5a8cea32, limb1: 0xd15238b33edfeb16cffd44ea, limb2: 0x5a03a044b07b640, }, r1a1: u288 { limb0: 0x58fec495c4c681cf797762a1, limb1: 0xd3ac0af0d5cb5bff7f4fa8e8, limb2: 0x286d6218242eddb4, }, }, G2Line { r0a0: u288 { limb0: 0xd88b16e68600a12e6c1f6006, limb1: 0x333243b43d3b7ff18d0cc671, limb2: 0x2b84b2a9b0f03ed8, }, r0a1: u288 { limb0: 0xf3e2b57ddaac822c4da09991, limb1: 0xd7c894b3fe515296bb054d2f, limb2: 0x10a75e4c6dddb441, }, r1a0: u288 { limb0: 0x73c65fbbb06a7b21b865ac56, limb1: 0x21f4ecd1403bb78729c7e99b, limb2: 0xaf88a160a6b35d4, }, r1a1: u288 { limb0: 0xade61ce10b8492d659ff68d0, limb1: 0x1476e76cf3a8e0df086ad9eb, limb2: 0x2e28cfc65d61e946, }, }, G2Line { r0a0: u288 { limb0: 0xdf8b54b244108008e7f93350, limb1: 0x2ae9a68b9d6b96f392decd6b, limb2: 0x160b19eed152271c, }, r0a1: u288 { limb0: 0xc18a8994cfbb2e8df446e449, limb1: 0x408d51e7e4adedd8f4f94d06, limb2: 0x27661b404fe90162, }, r1a0: u288 { limb0: 0x1390b2a3b27f43f7ac73832c, limb1: 0x14d57301f6002fd328f2d64d, limb2: 0x17f3fa337367dddc, }, r1a1: u288 { limb0: 0x79cab8ff5bf2f762c5372f80, limb1: 0xc979d6f385fae4b5e4785acf, limb2: 0x60c5307a735b00f, }, }, G2Line { r0a0: u288 { limb0: 0x42e951ca7dac29d65a14ab82, limb1: 0x140be62e3d419b811acf5756, limb2: 0x11523c7fc2a37270, }, r0a1: u288 { limb0: 0x593b29e6aad3cadd506d93bd, limb1: 0x59976c08d37982b9c28495c3, limb2: 0xc924925bb5976fe, }, r1a0: u288 { limb0: 0xcb18016afc265e1a5fc80af0, limb1: 0xd830297a058f529ef5e3f97e, limb2: 0x253a39d5462f1882, }, r1a1: u288 { limb0: 0x2b081ad5589d7f1cedb120a9, limb1: 0x956ae1847a5ce3f261e1e1e7, limb2: 0x1afd47a0e8c0dbeb, }, }, G2Line { r0a0: u288 { limb0: 0xb70b988a54003f89b0376a63, limb1: 0xff28c025f2f710e53ac37b9e, limb2: 0x2e441c518d3fe68d, }, r0a1: u288 { limb0: 0x660ddad555982e7994df37fb, limb1: 0x6c04f02c84dc80d8305f0357, limb2: 0x23b41d5762cf7f0f, }, r1a0: u288 { limb0: 0xa2f0ccb1a552683ea3ac0798, limb1: 0xb33b544006bac5a1fd372830, limb2: 0x24afb0cbc42170a7, }, r1a1: u288 { limb0: 0xf93faa0be992488deb617b04, limb1: 0x86fb2bb1f07dfeef85b2886, limb2: 0x189649259453ed83, }, }, G2Line { r0a0: u288 { limb0: 0x386d7b23c6dccb87637018c9, limb1: 0xfed2ea478e9a2210289079e2, limb2: 0x100aa83cb843353e, }, r0a1: u288 { limb0: 0x229c5c285f049d04c3dc5ce7, limb1: 0x28110670fe1d38c53ffcc6f7, limb2: 0x1778918279578f50, }, r1a0: u288 { limb0: 0xe9ad2c7b8a17a1f1627ff09d, limb1: 0xedff5563c3c3e7d2dcc402ec, limb2: 0xa8bd6770b6d5aa8, }, r1a1: u288 { limb0: 0x66c5c1aeed5c04470b4e8a3d, limb1: 0x846e73d11f2d18fe7e1e1aa2, limb2: 0x10a60eabe0ec3d78, }, }, G2Line { r0a0: u288 { limb0: 0x9dafcca7f80fb028e1550b13, limb1: 0x510e07802d526954395ad6d6, limb2: 0x34f031507e71a70, }, r0a1: u288 { limb0: 0xac7b6a137d96e956dd4f2773, limb1: 0x2692998b32154b368c857fee, limb2: 0x2ea30d00a23e6587, }, r1a0: u288 { limb0: 0x69f3776dd7fd4db9bde03967, limb1: 0x16efb004aa3f44e6ac5fdd29, limb2: 0x361dd68590907c0, }, r1a1: u288 { limb0: 0x445681532c126e7c428445b7, limb1: 0xfa2b7d974e59a61f57bcd949, limb2: 0x258ce35529e9f923, }, }, G2Line { r0a0: u288 { limb0: 0x88ca191d85be1f6c205257ef, limb1: 0xd0cecf5c5f80926c77fd4870, limb2: 0x16ec42b5cae83200, }, r0a1: u288 { limb0: 0x154cba82460752b94916186d, limb1: 0x564f6bebac05a4f3fb1353ac, limb2: 0x2d47a47da836d1a7, }, r1a0: u288 { limb0: 0xb39c4d6150bd64b4674f42ba, limb1: 0x93c967a38fe86f0779bf4163, limb2: 0x1a51995a49d50f26, }, r1a1: u288 { limb0: 0xeb7bdec4b7e304bbb0450608, limb1: 0x11fc9a124b8c74b3d5560ea4, limb2: 0xbfa9bd7f55ad8ac, }, }, G2Line { r0a0: u288 { limb0: 0x2cb6407193c4b5c315a00755, limb1: 0x33dcf6b5051abc2c59b801ab, limb2: 0x16f1a436a0abadf6, }, r0a1: u288 { limb0: 0x3398c4073878ea089b0c7b80, limb1: 0x49d08a1ce731c9b194b93e64, limb2: 0x2c1a19007bb6f21c, }, r1a0: u288 { limb0: 0x6b305edfc565d8cb06fa559e, limb1: 0x43ee87287e1f2f15d6631f33, limb2: 0x1cd36451c5666f9c, }, r1a1: u288 { limb0: 0x650c38aae0bd3882a6556860, limb1: 0x8e04c37290ae5a6bb3eb1f91, limb2: 0x12e57f5774525f20, }, }, G2Line { r0a0: u288 { limb0: 0x2fdc574c85cf0c0ce5e07a51, limb1: 0xd2439bf7b00bddc4cfb01b0c, limb2: 0x125c3bbdeb0bd2da, }, r0a1: u288 { limb0: 0x9d664714bae53cafcb5ef55d, limb1: 0x495c01724790853548f5e4de, limb2: 0x2ce5e2e263725941, }, r1a0: u288 { limb0: 0x98071eb7fe88c9124aee3774, limb1: 0xc3f66947a52bd2f6d520579f, limb2: 0x2eaf775dbd52f7d3, }, r1a1: u288 { limb0: 0x23e5594948e21db2061dca92, limb1: 0xd0ffa6f6c77290531c185431, limb2: 0x604c085de03afb1, }, }, G2Line { r0a0: u288 { limb0: 0xf884b2ccf06f8da655d3142, limb1: 0xdece09e25a509a7dd0b73bde, limb2: 0xa6830f44f8a0e0d, }, r0a1: u288 { limb0: 0x36cc33f5e41d078c07a952fe, limb1: 0xa3c7be8095228c58e49910b2, limb2: 0x2d863134dbfbae7f, }, r1a0: u288 { limb0: 0x83786a541018cb79e6baccf6, limb1: 0x9c73f5fa4f111743dfb0b581, limb2: 0x22faefa4bfa9f387, }, r1a1: u288 { limb0: 0x2f25834de3d2ec7bda75abc7, limb1: 0x4526dbfbc8f7d9e1c71c8375, limb2: 0x1f3bb15443413d60, }, }, G2Line { r0a0: u288 { limb0: 0xeec2912e15f6bda39d4e005e, limb1: 0x2b8610c44d27bdbc6ba2aac5, limb2: 0x78ddc4573fc1fed, }, r0a1: u288 { limb0: 0x48099a0da11ea21de015229d, limb1: 0x5fe937100967d5cc544f4af1, limb2: 0x2c9ffe6d7d7e9631, }, r1a0: u288 { limb0: 0xa70d251296ef1ae37ceb7d03, limb1: 0x2adadcb7d219bb1580e6e9c, limb2: 0x180481a57f22fd03, }, r1a1: u288 { limb0: 0xacf46db9631037dd933eb72a, limb1: 0x8a58491815c7656292a77d29, limb2: 0x261e3516c348ae12, }, }, G2Line { r0a0: u288 { limb0: 0x62b45634f0eaf51f5bc4003c, limb1: 0x13ff6a6fc286b5b754548ac3, limb2: 0x1670dac54842d28b, }, r0a1: u288 { limb0: 0x85fe43906582fc736d926df3, limb1: 0xf077151ea6da959af3c290f6, limb2: 0xc8cebcafaa4ae47, }, r1a0: u288 { limb0: 0x7540aff585c27cb2fa15c662, limb1: 0x5cf456bcd4fa0e3bbae0f467, limb2: 0x24a1c8ecb9c907e9, }, r1a1: u288 { limb0: 0x19ba1bf552affd897d561632, limb1: 0x1df4a4d8d77248957809f88e, limb2: 0x1d7484a0c0251cdc, }, }, G2Line { r0a0: u288 { limb0: 0x2bfa32f0a09c3e2cfb8f6a38, limb1: 0x7a24df3ff3c7119a59d49318, limb2: 0x10e42281d64907ba, }, r0a1: u288 { limb0: 0xce42177a66cdeb4207d11e0c, limb1: 0x3322aa425a9ca270152372ad, limb2: 0x2f7fa83db407600c, }, r1a0: u288 { limb0: 0x62a8ff94fd1c7b9035af4446, limb1: 0x3ad500601bbb6e7ed1301377, limb2: 0x254d253ca06928f, }, r1a1: u288 { limb0: 0xf8f1787cd8e730c904b4386d, limb1: 0x7fd3744349918d62c42d24cc, limb2: 0x28a05e105d652eb8, }, }, G2Line { r0a0: u288 { limb0: 0x6ef31e059d602897fa8e80a8, limb1: 0x66a0710847b6609ceda5140, limb2: 0x228c0e568f1eb9c0, }, r0a1: u288 { limb0: 0x7b47b1b133c1297b45cdd79b, limb1: 0x6b4f04ed71b58dafd06b527b, limb2: 0x13ae6db5254df01a, }, r1a0: u288 { limb0: 0xbeca2fccf7d0754dcf23ddda, limb1: 0xe3d0bcd7d9496d1e5afb0a59, limb2: 0x305a0afb142cf442, }, r1a1: u288 { limb0: 0x2d299847431477c899560ecf, limb1: 0xbcd9e6c30bedee116b043d8d, limb2: 0x79473a2a7438353, }, }, G2Line { r0a0: u288 { limb0: 0xae3712a6ef6034d7fcbc318c, limb1: 0xedba25c96439aeb3954ccff7, limb2: 0x1a0d73e3d8d90330, }, r0a1: u288 { limb0: 0xff6fb0e919bd80f29065244, limb1: 0xfdcac02f3dd2e9268271021f, limb2: 0x202e92badc53f790, }, r1a0: u288 { limb0: 0xec674cc5d55fcd80ab9fc167, limb1: 0xb9f7f1fd7f1e4936802c19d1, limb2: 0x27ac3aca37743af5, }, r1a1: u288 { limb0: 0xe49dfebb538630697c09c39d, limb1: 0x56732676796d1f91ecab12ad, limb2: 0xb010d1b0f285dbd, }, }, G2Line { r0a0: u288 { limb0: 0xb431b974a13b9d75e11033b8, limb1: 0xa4b7192e2b5f3730bd216f73, limb2: 0x53cf4b349760f42, }, r0a1: u288 { limb0: 0x3c87efcabaa8e22835e19e2, limb1: 0xfc9cf42672502f3fb7917c8f, limb2: 0x11123549a68499c8, }, r1a0: u288 { limb0: 0xf91da96d0c078dea22787ecb, limb1: 0xd165ceed6f64338e6288e1d3, limb2: 0x23490db5de27b468, }, r1a1: u288 { limb0: 0x419e0eafdcf6226512a9ec6a, limb1: 0x1c6fb8110315ae80c4bf92ec, limb2: 0x2ad5f86e5d3bc1c3, }, }, G2Line { r0a0: u288 { limb0: 0x65b71fe695e7ccd4b460dace, limb1: 0xa6ceba62ef334e6fe91301d5, limb2: 0x299f578d0f3554e6, }, r0a1: u288 { limb0: 0xaf781dd030a274e7ecf0cfa4, limb1: 0x2095020d373a14d7967797aa, limb2: 0x6a7f9df6f185bf8, }, r1a0: u288 { limb0: 0x8e91e2dba67d130a0b274df3, limb1: 0xe192a19fce285c12c6770089, limb2: 0x6e9acf4205c2e22, }, r1a1: u288 { limb0: 0xbcd5c206b5f9c77d667189bf, limb1: 0x656a7e2ebc78255d5242ca9, limb2: 0x25f43fec41d2b245, }, }, G2Line { r0a0: u288 { limb0: 0xd6c95bb06c0e9a55a56a85c0, limb1: 0xf5d3c4d860aee402df7d0cd6, limb2: 0xa90fbb3a7bcfb07, }, r0a1: u288 { limb0: 0xbfca0761240adb98fdf8e23d, limb1: 0xe6052ca38781d13cf53921cb, limb2: 0x780debeee0578b2, }, r1a0: u288 { limb0: 0xbe285fa3e37b0222a1c65921, limb1: 0xb9fbb60c587b00d8ecf22359, limb2: 0x284f4ced8b0b28f5, }, r1a1: u288 { limb0: 0x34e69be4d8eea470c08f07e8, limb1: 0x651617bebb0020b71bf6a8a7, limb2: 0xde62a1da13dfd78, }, }, G2Line { r0a0: u288 { limb0: 0x4e56e6733cce20d9c5b16d96, limb1: 0xc7ef260535fb75b9d3e089f, limb2: 0x292dd4aa636e7729, }, r0a1: u288 { limb0: 0x6e7e1038b336f36519c9faaf, limb1: 0x3c66bd609510309485e225c7, limb2: 0x10cacac137411eb, }, r1a0: u288 { limb0: 0x4a3e8b96278ac092fe4f3b15, limb1: 0xba47e583e2750b42f93c9631, limb2: 0x125da6bd69495bb9, }, r1a1: u288 { limb0: 0xae7a56ab4b959a5f6060d529, limb1: 0xc3c263bfd58c0030c063a48e, limb2: 0x2f4d15f13fae788c, }, }, G2Line { r0a0: u288 { limb0: 0x301e0885c84d273b6d323124, limb1: 0x11fd5c75e269f7a30fa4154f, limb2: 0x19afdcfdcce2fc0d, }, r0a1: u288 { limb0: 0x3d13519f934526be815c38b0, limb1: 0xd43735909547da73838874fc, limb2: 0x255d8aca30f4e0f6, }, r1a0: u288 { limb0: 0x90a505b76f25a3396e2cea79, limb1: 0x3957a2d0848c54b9079fc114, limb2: 0x1ba0cd3a9fe6d4bb, }, r1a1: u288 { limb0: 0xc47930fba77a46ebb1db30a9, limb1: 0x993a1cb166e9d40bebab02b2, limb2: 0x1deb16166d48118b, }, }, G2Line { r0a0: u288 { limb0: 0xb8cf2af23a2795446a3a73f1, limb1: 0x13715e2237eeb02ee6666cee, limb2: 0xa85c6edf4e39ba5, }, r0a1: u288 { limb0: 0x1f36efdd6931269960bdf4de, limb1: 0xfe9eff4c19216c4ae441fee1, limb2: 0x25db1c938c941000, }, r1a0: u288 { limb0: 0xe13bf721634b56a80c6fb0a8, limb1: 0xda0b9ea6704efbd8451cfd41, limb2: 0x279768e0c2762893, }, r1a1: u288 { limb0: 0x2dc5403124b8b2766caf51c7, limb1: 0xb9ed0b96060674c35d818388, limb2: 0x6f9a41b549839dd, }, }, G2Line { r0a0: u288 { limb0: 0xbd4aa4e5ed3e0c30bf730048, limb1: 0x80e73a7e12b5104f4ec40460, limb2: 0x13db913428ce629c, }, r0a1: u288 { limb0: 0xa90e04c07af34a3af7b9ae23, limb1: 0xf939d213913f9c4b23910d94, limb2: 0xff8ab1b303ea87a, }, r1a0: u288 { limb0: 0x38c7e37660597198162fa157, limb1: 0xa81284a580d040713c0531af, limb2: 0x110351898a488800, }, r1a1: u288 { limb0: 0x2c97092cce4fdaa715b6afde, limb1: 0x1a698f4e2982c281c0c42464, limb2: 0x1bd1c4a7975a22f5, }, }, G2Line { r0a0: u288 { limb0: 0xb15bbaec50ff49d30e49f74a, limb1: 0xc90a8c79fb045c5468f14151, limb2: 0x25e47927e92df0e3, }, r0a1: u288 { limb0: 0x57f66909d5d40dfb8c7b4d5c, limb1: 0xea5265282e2139c48c1953f2, limb2: 0x2d7f5e6aff2381f6, }, r1a0: u288 { limb0: 0x2a2f573b189a3c8832231394, limb1: 0x738abc15844895ffd4733587, limb2: 0x20aa11739c4b9bb4, }, r1a1: u288 { limb0: 0x51695ec614f1ff4cce2f65d1, limb1: 0x6765aae6cb895a2406a6dd7e, limb2: 0x1126ee431c522da0, }, }, G2Line { r0a0: u288 { limb0: 0xe7f01d9086cd6bea2f41aa99, limb1: 0x704bab1c6c11f635823c0730, limb2: 0x1aa5e3110773f18e, }, r0a1: u288 { limb0: 0x85c070793b8763c74570e65c, limb1: 0x2af5c8f295dafb150ffb4b8b, limb2: 0xda734f5191394b9, }, r1a0: u288 { limb0: 0x4875f74e54ce34f890a6c795, limb1: 0x9ae6a24d7c63f7240996ac21, limb2: 0x2a7c9cc67d33db65, }, r1a1: u288 { limb0: 0xb014ee4eda66723db93d7d9a, limb1: 0x7d3eb5638239c427a57ce71f, limb2: 0x1b0456063dc2a87c, }, }, G2Line { r0a0: u288 { limb0: 0x9214fc3209f1518b05fd21c6, limb1: 0x9bc8ce4f56423009710770e8, limb2: 0x32445cc6972799c, }, r0a1: u288 { limb0: 0x93ef401ecd9cfae3644d22e6, limb1: 0xce5a741a9847a144cfaf8c96, limb2: 0xf7a814d5726da4a, }, r1a0: u288 { limb0: 0xd19264d986f163b133a91c0c, limb1: 0x529dc5ce4b193c0f672c6a32, limb2: 0x2e9a118959353374, }, r1a1: u288 { limb0: 0x3d97d6e8f45072cc9e85e412, limb1: 0x4dafecb04c3bb23c374f0486, limb2: 0xa174dd4ac8ee628, }, }, G2Line { r0a0: u288 { limb0: 0xfa6e20eaa5b8acce6161c367, limb1: 0x3d8d035c6953305cfb8065a4, limb2: 0x40bb50e482935b, }, r0a1: u288 { limb0: 0x4c506a8e01c5144fa535163b, limb1: 0x61030d954c1196c840ee7931, limb2: 0x2f221fa9c7e3b5ae, }, r1a0: u288 { limb0: 0x2613b98211a31e101b009375, limb1: 0xe4cfbf39bf10d39059fcec56, limb2: 0x196add035e14330e, }, r1a1: u288 { limb0: 0xcc093368ee2558dabe10c7be, limb1: 0x206a20357ce007c45165fee6, limb2: 0xd4fb39f4b1fde10, }, }, G2Line { r0a0: u288 { limb0: 0x98d8b0c4adcf27bceb305c2c, limb1: 0x859afa9c7668ed6152d8cba3, limb2: 0x29e7694f46e3a272, }, r0a1: u288 { limb0: 0x1d970845365594307ba97556, limb1: 0xd002d93ad793e154afe5b49b, limb2: 0x12ca77d3fb8eee63, }, r1a0: u288 { limb0: 0x9f2934faefb8268e20d0e337, limb1: 0xbc4b5e1ec056881319f08766, limb2: 0x2e103461759a9ee4, }, r1a1: u288 { limb0: 0x7adc6cb87d6b43000e2466b6, limb1: 0x65e5cefa42b25a7ee8925fa6, limb2: 0x2560115898d7362a, }, }, G2Line { r0a0: u288 { limb0: 0x823969b5ec0f79a94f88d36b, limb1: 0x3512d9e09a8b4a8e1084dc32, limb2: 0x1af1156b9c8d06e6, }, r0a1: u288 { limb0: 0xafd7dd0f120256e11800dee8, limb1: 0x3a317cae149063c44cf7fa8c, limb2: 0x2bd8ea8b2474d1e5, }, r1a0: u288 { limb0: 0xe1772b865b838d58dd129624, limb1: 0xbe9458968158c433742dbcd0, limb2: 0x22b6d697a5a3b888, }, r1a1: u288 { limb0: 0xbff3b00a55f411bbc1dad2fe, limb1: 0x7ae09ac6313e3c00759461ae, limb2: 0x558601ecf31c85, }, }, G2Line { r0a0: u288 { limb0: 0x64d864643668392c0e357cc4, limb1: 0x4c9bf66853f1b287015ab84c, limb2: 0x2f5f1b92ad7ee4d4, }, r0a1: u288 { limb0: 0xdc33c8da5c575eef6987a0e1, limb1: 0x51cc07c7ef28e1b8d934bc32, limb2: 0x2358d94a17ec2a44, }, r1a0: u288 { limb0: 0xf659845b829bbba363a2497b, limb1: 0x440f348e4e7bed1fb1eb47b2, limb2: 0x1ad0eaab0fb0bdab, }, r1a1: u288 { limb0: 0x1944bb6901a1af6ea9afa6fc, limb1: 0x132319df135dedddf5baae67, limb2: 0x52598294643a4aa, }, }, G2Line { r0a0: u288 { limb0: 0x76fd94c5e6f17fa6741bd7de, limb1: 0xc2e0831024f67d21013e0bdd, limb2: 0x21e2af6a43119665, }, r0a1: u288 { limb0: 0xad290eab38c64c0d8b13879b, limb1: 0xdd67f881be32b09d9a6c76a0, limb2: 0x8000712ce0392f2, }, r1a0: u288 { limb0: 0xd30a46f4ba2dee3c7ace0a37, limb1: 0x3914314f4ec56ff61e2c29e, limb2: 0x22ae1ba6cd84d822, }, r1a1: u288 { limb0: 0x5d888a78f6dfce9e7544f142, limb1: 0x9439156de974d3fb6d6bda6e, limb2: 0x106c8f9a27d41a4f, }, }, G2Line { r0a0: u288 { limb0: 0x6092d1d633b2160a27266d5b, limb1: 0x80d00c798b74744e2d6c9897, limb2: 0x6aca1e5b3d6e760, }, r0a1: u288 { limb0: 0x3f695b0e7bf0e735a060a1fc, limb1: 0x21c516331ac46f6f1940a79c, limb2: 0x9fb99bd56e3cfd0, }, r1a0: u288 { limb0: 0x125cd061734e6d82260bff31, limb1: 0x7b1fb56a17f3832fd3c026f3, limb2: 0xdafb0c1b7a07131, }, r1a1: u288 { limb0: 0x449a0a17221fac459caf049a, limb1: 0x4bbd5645024fe09ba86f662d, limb2: 0x295e6b43830d7473, }, }, G2Line { r0a0: u288 { limb0: 0x138792ff5a46d835c3927fde, limb1: 0x498899eff0ddfb1e2a6a2a63, limb2: 0xfaff0a267eddd92, }, r0a1: u288 { limb0: 0xfffeb2ff28064301c583286, limb1: 0x223c9e6d3ae5d55a899db5e2, limb2: 0x1a88e4cac54f8190, }, r1a0: u288 { limb0: 0xcfbe06117f1f6dea20f8379f, limb1: 0x6b831cd38c1741b394a2f18d, limb2: 0xd44868b638ab5cd, }, r1a1: u288 { limb0: 0x21a8bd3280686ca4d3c4a764, limb1: 0x3b3576220bbc08abcec8478b, limb2: 0x29b73d7c0c8ff4ce, }, }, G2Line { r0a0: u288 { limb0: 0x92c09e4796207b802168341b, limb1: 0xd2d9d6acffd7829066cc49ce, limb2: 0xc89c2d0a7b2c81e, }, r0a1: u288 { limb0: 0x47e3c1cf6cdb6f3efe778c7f, limb1: 0x66b347099b6436794cf062eb, limb2: 0x18b4ccc64ae0a857, }, r1a0: u288 { limb0: 0x7d5793606a73b2740c71484a, limb1: 0xa0070135ca2dc571b28e3c9c, limb2: 0x1bc03576e04b94cf, }, r1a1: u288 { limb0: 0x1ba85b29875e638c10f16c99, limb1: 0x158f2f2acc3c2300bb9f9225, limb2: 0x42d8a8c36ea97c6, }, }, G2Line { r0a0: u288 { limb0: 0x491a2a2eb92babf14d2c70ed, limb1: 0x88adfa10d27cbf95efc87ca9, limb2: 0x1ea367cb9628819e, }, r0a1: u288 { limb0: 0xf832704f9fde600131526e2, limb1: 0x943da98740594bc8573bc424, limb2: 0x225058a1522f4c77, }, r1a0: u288 { limb0: 0xf43027c8e85927d41ef51aa6, limb1: 0x6d6d7aa318f97e5043973413, limb2: 0x11a037a0589e5f86, }, r1a1: u288 { limb0: 0x45f2d483ce8e645ed19421cb, limb1: 0x6363b56540ef0ea0331819ca, limb2: 0x2b5c9bfcfb64a95f, }, }, G2Line { r0a0: u288 { limb0: 0x9440ad13408319cecb07087b, limb1: 0x537afc0c0cfe8ff761c24e08, limb2: 0x48e4ac10081048d, }, r0a1: u288 { limb0: 0xa37fb82b03a2c0bb2aa50c4f, limb1: 0xd3797f05c8fb84f6b630dfb, limb2: 0x2dffde2d6c7e43ff, }, r1a0: u288 { limb0: 0xc55d2eb1ea953275e780e65b, limb1: 0xe141cf680cab57483c02e4c7, limb2: 0x1b71395ce5ce20ae, }, r1a1: u288 { limb0: 0xe4fab521f1212a1d301065de, limb1: 0x4f8d31c78df3dbe4ab721ef2, limb2: 0x2828f21554706a0e, }, }, G2Line { r0a0: u288 { limb0: 0x8cefc2f2af2a3082b790784e, limb1: 0x97ac13b37c6fbfc736a3d456, limb2: 0x683b1cdffd60acd, }, r0a1: u288 { limb0: 0xa266a8188a8c933dcffe2d02, limb1: 0x18d3934c1838d7bce81b2eeb, limb2: 0x206ac5cdda42377, }, r1a0: u288 { limb0: 0x90332652437f6e177dc3b28c, limb1: 0x75bd8199433d607735414ee8, limb2: 0x29d6842d8298cf7e, }, r1a1: u288 { limb0: 0xadedf46d8ea11932db0018e1, limb1: 0xbc7239ae9d1453258037befb, limb2: 0x22e7ebdd72c6f7a1, }, }, G2Line { r0a0: u288 { limb0: 0x3a7dc5b45b0cd09dd75ff780, limb1: 0x2902bd9bd8ba8605b3662044, limb2: 0x1ec042f89cec2f4a, }, r0a1: u288 { limb0: 0x3e484c01e1c71dad604b6e00, limb1: 0x63cd271538443abcbe242bee, limb2: 0x10c38586e25d160e, }, r1a0: u288 { limb0: 0xc406f3abf9503a06bdeb2eef, limb1: 0x8653c7da6db9ab8b17639151, limb2: 0xad22e688ec88604, }, r1a1: u288 { limb0: 0x50fc42dbc609f56f660d8b86, limb1: 0x56a81c62935f53a8194e5d90, limb2: 0x2b27bb15c58ff0c3, }, }, G2Line { r0a0: u288 { limb0: 0xacc013a37118e98a394f1114, limb1: 0x97e3d97d841f62677ad653b1, limb2: 0xfa27c5f03ef3e74, }, r0a1: u288 { limb0: 0x9599de7b6e6a8aeef6b63e52, limb1: 0x73e39f958d986d83148d8c8a, limb2: 0x208d43519f69f381, }, r1a0: u288 { limb0: 0x898b0f8615e3cf94474d7196, limb1: 0x82213cada178b34ae97fdb67, limb2: 0x11a8f2b07229c348, }, r1a1: u288 { limb0: 0x8a100eb3750e818962602ec3, limb1: 0xdca2571e9fc5588275e810fd, limb2: 0x290c599d240303ec, }, }, G2Line { r0a0: u288 { limb0: 0x348e15357d9299e582033136, limb1: 0x53578c46b15abb39da35a56e, limb2: 0x1043b711f86bb33f, }, r0a1: u288 { limb0: 0x9fa230a629b75217f0518e7c, limb1: 0x77012a4bb8751322a406024d, limb2: 0x121e2d845d972695, }, r1a0: u288 { limb0: 0x5600f2d51f21d9dfac35eb10, limb1: 0x6fde61f876fb76611fb86c1a, limb2: 0x2bf4fbaf5bd0d0df, }, r1a1: u288 { limb0: 0xd732aa0b6161aaffdae95324, limb1: 0xb3c4f8c3770402d245692464, limb2: 0x2a0f1740a293e6f0, }, }, G2Line { r0a0: u288 { limb0: 0x481b93066804d8e4a43ea2f5, limb1: 0x29399b4d554a5731966efdf4, limb2: 0x100692df233dfccb, }, r0a1: u288 { limb0: 0xa03028f9394d39e5aff150c2, limb1: 0x82b1b27285e7d875b1cc49e8, limb2: 0x1aa360e1848acc84, }, r1a0: u288 { limb0: 0xc358787d7c823681590988f, limb1: 0xa3e33a227d61efc5734e48e4, limb2: 0x15e7e41317f696d9, }, r1a1: u288 { limb0: 0x73141ff9e75e2761d8d99b93, limb1: 0x48b8fbe75ec09c4496c9652f, limb2: 0x1edc83253b7ac568, }, }, G2Line { r0a0: u288 { limb0: 0xa9e2efa41aaa98ab59728940, limb1: 0x163c0425f66ce72daef2f53e, limb2: 0x2feaf1b1770aa7d8, }, r0a1: u288 { limb0: 0x3bb7afd3c0a79b6ac2c4c063, limb1: 0xee5cb42e8b2bc999e312e032, limb2: 0x1af2071ae77151c3, }, r1a0: u288 { limb0: 0x1cef1c0d8956d7ceb2b162e7, limb1: 0x202b4af9e51edfc81a943ded, limb2: 0xc9e943ffbdcfdcb, }, r1a1: u288 { limb0: 0xe18b1b34798b0a18d5ad43dd, limb1: 0x55e8237731941007099af6b8, limb2: 0x1472c0290db54042, }, }, G2Line { r0a0: u288 { limb0: 0xe6100d19eaef8d37a80e60df, limb1: 0x4ef3e1a2b34daa1c2be28701, limb2: 0x92500ae61c29ded, }, r0a1: u288 { limb0: 0xcb5fe102a0a2aeb5f2b1d8b5, limb1: 0x48c7bc91c8b114893d8b23cd, limb2: 0x21268b5f3137e05e, }, r1a0: u288 { limb0: 0x67b383adbc235c125e89ac73, limb1: 0xf140e37cce399681b4f96b6c, limb2: 0x29da1de8b7c2764b, }, r1a1: u288 { limb0: 0x3a20a1e0817f5af4c383af92, limb1: 0xb6447b112ca3c55500553bae, limb2: 0xad54da1adb037ab, }, }, G2Line { r0a0: u288 { limb0: 0xb4c7963e0d1dc082de0725e, limb1: 0x375a7a3d765918de24804223, limb2: 0xf177b77b031596d, }, r0a1: u288 { limb0: 0x87a7b9c5f10500b0b40d7a1e, limb1: 0x6f234d1dc7f1394b55858810, limb2: 0x26288146660a3914, }, r1a0: u288 { limb0: 0xa6308c89cebe40447abf4a9a, limb1: 0x657f0fdda13b1f8ee314c22, limb2: 0x1701aabc250a9cc7, }, r1a1: u288 { limb0: 0x9db9bf660dc77cbe2788a755, limb1: 0xbdf9c1c15a4bd502a119fb98, limb2: 0x14b4de3d26bd66e1, }, }, G2Line { r0a0: u288 { limb0: 0x53c49c62ca96007e14435295, limb1: 0x85aeb885e4123ca8d3232fdf, limb2: 0x750017ce108abf3, }, r0a1: u288 { limb0: 0xba6bf3e25d370182e4821239, limb1: 0x39de83bf370bd2ba116e8405, limb2: 0x2b8417a72ba6d940, }, r1a0: u288 { limb0: 0xa922f50550d349849b14307b, limb1: 0x569766b6feca6143a5ddde9d, limb2: 0x2c3c6765b25a01d, }, r1a1: u288 { limb0: 0x6016011bdc3b506563b0f117, limb1: 0xbab4932beab93dde9b5b8a5c, limb2: 0x1bf3f698de0ace60, }, }, G2Line { r0a0: u288 { limb0: 0x6cd6d068630c95ff7923dace, limb1: 0x327c95abb26719a3e4f307d4, limb2: 0x1622ee5d85fd5915, }, r0a1: u288 { limb0: 0x3b0cab292557116e4a91297c, limb1: 0x73e3c8e25063487150b2b475, limb2: 0x10b9c1c61e8b6478, }, r1a0: u288 { limb0: 0xd5edff0ce6e33bb98c43f4a5, limb1: 0xdefbbd27923dd717a2029ccd, limb2: 0x1dde221b1cae459, }, r1a1: u288 { limb0: 0xf582a6716fc11b9594c7cda2, limb1: 0x4b375f530154fbdd63e5feb, limb2: 0xb49455f93935ab, }, }, G2Line { r0a0: u288 { limb0: 0x54fcd4a24d259b46df23323f, limb1: 0x47e6fdfb9c428d378a40ff4e, limb2: 0x1df34ff52254dff6, }, r0a1: u288 { limb0: 0xe0c10735495ed8f5cd2e4be0, limb1: 0xc86bc1fb1f401ef4df3b1cd0, limb2: 0x28c43896b60b6285, }, r1a0: u288 { limb0: 0x1c96043ad27370916cb891b4, limb1: 0x87329ba866d1b2e138d8c107, limb2: 0x2969b2c3e19a125a, }, r1a1: u288 { limb0: 0x439d38ff3bfb073cf2b5661f, limb1: 0x40fd99e28d8fb2f2ff6a20e7, limb2: 0x182bde6af8c937b7, }, }, G2Line { r0a0: u288 { limb0: 0xb9f05ffda3ee208f990ff3a8, limb1: 0x6201d08440b28ea672b9ea93, limb2: 0x1ed60e5a5e778b42, }, r0a1: u288 { limb0: 0x8e8468b937854c9c00582d36, limb1: 0x7888fa8b2850a0c555adb743, limb2: 0xd1342bd01402f29, }, r1a0: u288 { limb0: 0xf5c4c66a974d45ec754b3873, limb1: 0x34322544ed59f01c835dd28b, limb2: 0x10fe4487a871a419, }, r1a1: u288 { limb0: 0xedf4af2df7c13d6340069716, limb1: 0x8592eea593ece446e8b2c83b, limb2: 0x12f9280ce8248724, }, }, G2Line { r0a0: u288 { limb0: 0x2ddf82dac5876ef85cbd9209, limb1: 0x589fcd0afc56475897b6712f, limb2: 0xbd4b3348385e23b, }, r0a1: u288 { limb0: 0x1c3aa02855ddee9cd40d4eae, limb1: 0xf6ed3e19ac13cbd2012f796a, limb2: 0x1dc1b58676a8f698, }, r1a0: u288 { limb0: 0xc4830930ba2848c2f39f43da, limb1: 0xa0fc7164985c553cef876d41, limb2: 0x18fce7cada9deef8, }, r1a1: u288 { limb0: 0xedb28e73d7e312b0bfe1fa45, limb1: 0xed4ae4b37915b6888b40ee88, limb2: 0x5cf09de42e4f82a, }, }, G2Line { r0a0: u288 { limb0: 0xe67f72c6d45f1bb04403139f, limb1: 0x9233e2a95d3f3c3ff2f7e5b8, limb2: 0x1f931e8e4343b028, }, r0a1: u288 { limb0: 0x20ef53907af71803ce3ca5ca, limb1: 0xd99b6637ee9c73150b503ea4, limb2: 0x1c9759def8a98ea8, }, r1a0: u288 { limb0: 0xa0a3b24c9089d224822fad53, limb1: 0xdfa2081342a7a895062f3e50, limb2: 0x185e8cf6b3e494e6, }, r1a1: u288 { limb0: 0x8752a12394b29d0ba799e476, limb1: 0x1493421da067a42e7f3d0f8f, limb2: 0x67e7fa3e3035edf, }, }, G2Line { r0a0: u288 { limb0: 0x125ce6d868f59b6805a98a6e, limb1: 0x9229c7ee5700f2429eadaecb, limb2: 0x292c838c4deb5f8d, }, r0a1: u288 { limb0: 0x5325a1514f8ee43d2ed16153, limb1: 0x63c33b5123f4ecb9e010da3c, limb2: 0x1e0f5d09063cd187, }, r1a0: u288 { limb0: 0x605cc50180814223b30419fe, limb1: 0xb08ee4b45c98923764c3c996, limb2: 0x2e496c94d4ce61d7, }, r1a1: u288 { limb0: 0x7f916e4957b0d0a9c5aa8e89, limb1: 0x1b4099fb9348cb6604b6644d, limb2: 0x2fa7202e6e45ebd0, }, }, G2Line { r0a0: u288 { limb0: 0x6d6138c95464e5e774ae7ba0, limb1: 0xe6ca73a5498e4ccd4bb68fc7, limb2: 0x15bf8aa8ed1beff6, }, r0a1: u288 { limb0: 0xabd7c55a134ed405b4966d3c, limb1: 0xe69dd725ccc4f9dd537fe558, limb2: 0x2df4a03e2588a8f1, }, r1a0: u288 { limb0: 0x7cf42890de0355ffc2480d46, limb1: 0xe33c2ad9627bcb4b028c2358, limb2: 0x2a18767b40de20bd, }, r1a1: u288 { limb0: 0x79737d4a87fab560f3d811c6, limb1: 0xa88fee5629b91721f2ccdcf7, limb2: 0x2b51c831d3404d5e, }, }, G2Line { r0a0: u288 { limb0: 0x16a889bc98dbba30d0e85f7c, limb1: 0xfcada96c42f00ced918d942e, limb2: 0x2cc9b3197de097a5, }, r0a1: u288 { limb0: 0x66b312469ce97517a7e5f585, limb1: 0x320485962e1cd1ce5609b3ad, limb2: 0x2f5ed56d2b372567, }, r1a0: u288 { limb0: 0x50a883556bfbb1f8d5f9d8a3, limb1: 0x4aa6753d1fea97e3b8aac1f1, limb2: 0x301980e220bb49ed, }, r1a1: u288 { limb0: 0xe7614ace25bd3a3830b64ecf, limb1: 0x38dedb346af32c21784b968c, limb2: 0x101dfcee3c535929, }, }, G2Line { r0a0: u288 { limb0: 0x9812f6145cf7e949fa207f20, limb1: 0x4061c36b08d5bcd408b14f19, limb2: 0x8332e08b2eb51ed, }, r0a1: u288 { limb0: 0xa4a7ae8f65ba180c523cb33, limb1: 0xb71fabbdc78b1128712d32a5, limb2: 0x2acd1052fd0fefa7, }, r1a0: u288 { limb0: 0x6ea5598e221f25bf27efc618, limb1: 0xa2c2521a6dd8f306f86d6db7, limb2: 0x13af144288655944, }, r1a1: u288 { limb0: 0xea469c4b390716a6810fff5d, limb1: 0xf8052694d0fdd3f40b596c20, limb2: 0x24d0ea6c86e48c5c, }, }, G2Line { r0a0: u288 { limb0: 0x2e39be614d904bafea58a8cd, limb1: 0xf53f0a6a20a1f1783b0ea2d0, limb2: 0x99c451b7bb726d7, }, r0a1: u288 { limb0: 0x28ec54a4ca8da838800c573d, limb1: 0xb78365fa47b5e192307b7b87, limb2: 0x2df87aa88e012fec, }, r1a0: u288 { limb0: 0xfb7022881c6a6fdfb18de4aa, limb1: 0xb9bd30f0e93c5b93ad333bab, limb2: 0x1dd20cbccdeb9924, }, r1a1: u288 { limb0: 0x16d8dfdf790a6be16a0e55ba, limb1: 0x90ab884395509b9a264472d4, limb2: 0xeaec571657b6e9d, }, }, G2Line { r0a0: u288 { limb0: 0xdf8d520c2fd45b16da910ca7, limb1: 0x2023ab59c06742c107d21389, limb2: 0x474f8d201c2003a, }, r0a1: u288 { limb0: 0xc46ba70245e0d604d975ec09, limb1: 0x921be51a6779f8abc213a42b, limb2: 0x737865d13506920, }, r1a0: u288 { limb0: 0xebde3248ae4a49e4ca67667c, limb1: 0x55021936a806c18771a5b497, limb2: 0xeddf62dee5cd01d, }, r1a1: u288 { limb0: 0x840eb64075057d76ec783626, limb1: 0xd09ec083f029b05d8cf747e8, limb2: 0x29923f4182ebbd77, }, }, G2Line { r0a0: u288 { limb0: 0x797d2ef5c1d08447d0723c47, limb1: 0x5e3d0a3367a49356be559196, limb2: 0x1ac7d70481f3e230, }, r0a1: u288 { limb0: 0xec5fd0d82c9efcda61aec42a, limb1: 0xd18c0e943f37d7060aebd361, limb2: 0x11985d67f47debff, }, r1a0: u288 { limb0: 0x71ec5d0ede447fc2d2b8d30a, limb1: 0x6d732f49bca172dde108d14e, limb2: 0xa187b54b3aa09fe, }, r1a1: u288 { limb0: 0x366c39d4f024f7ffcc1f190d, limb1: 0xb25354b8c4a9a95e3c632091, limb2: 0x94ede742a6d279b, }, }, G2Line { r0a0: u288 { limb0: 0xce78fc6505db036c10fac771, limb1: 0x61f8c0bc7f60ad6415d5e419, limb2: 0x59009c5cf9ea663, }, r0a1: u288 { limb0: 0xb3b3f697fc34d64ba053b914, limb1: 0x317af5815ce5bfffc5a6bc97, limb2: 0x23f97fee4deda847, }, r1a0: u288 { limb0: 0xf559e09cf7a02674ac2fa642, limb1: 0x4fa7548b79cdd054e203689c, limb2: 0x2173b379d546fb47, }, r1a1: u288 { limb0: 0x758feb5b51caccff9da0f78f, limb1: 0xd7f37a1008233b74c4894f55, limb2: 0x917c640b4b9627e, }, }, G2Line { r0a0: u288 { limb0: 0xdfce680eeda9dab9f624300d, limb1: 0x3332e1bcaad5d683961ea721, limb2: 0x428540bb4a391d0, }, r0a1: u288 { limb0: 0x3f654faa3518ed9595db752b, limb1: 0xebecb7527a9c9bc0e35974f2, limb2: 0x14bcaa1d4c941ce0, }, r1a0: u288 { limb0: 0x332ed31f8babcb1fb1902637, limb1: 0xa3d0543357fc3e835fe62d46, limb2: 0x1ba5e26829d040d8, }, r1a1: u288 { limb0: 0x26ad9a6548dbeda3a0cb37ac, limb1: 0xe2ddec0f5eb83e84b3af4a3e, limb2: 0x2f95fb7eb636c829, }, }, G2Line { r0a0: u288 { limb0: 0x72548e0d946b796842cfecd8, limb1: 0x78b54b355e3c26476b0fab82, limb2: 0x2dc9f32c90b6ba31, }, r0a1: u288 { limb0: 0xa943be83a6fc90414320753b, limb1: 0xd708fde97241095833ce5a08, limb2: 0x142111e6a73d2e82, }, r1a0: u288 { limb0: 0xc79e8d5465ec5f28781e30a2, limb1: 0x697fb9430b9ad050ced6cce, limb2: 0x1a9d647149842c53, }, r1a1: u288 { limb0: 0x9bab496952559362586725cd, limb1: 0xbe78e5a416d9665be64806de, limb2: 0x147b550afb4b8b84, }, }, G2Line { r0a0: u288 { limb0: 0xde3f0cc8eb9d8bc0524ffa31, limb1: 0xa29420171bca522f8e0d0ab4, limb2: 0x1c527b5683d4814d, }, r0a1: u288 { limb0: 0xb831225213716dec94efc1de, limb1: 0x970dd107965ba3923ab9d17a, limb2: 0x2bfb03ab5ab6d7e9, }, r1a0: u288 { limb0: 0x41fa2c98128b2070cbf6c33d, limb1: 0xde4def6e8343cd45841c0890, limb2: 0x12f1cede76e2b8d7, }, r1a1: u288 { limb0: 0x2aadf4029e19b185f59187a, limb1: 0xb4e7dd0e3b5c1a62be0f0e48, limb2: 0x2029ea04d9e4c426, }, }, G2Line { r0a0: u288 { limb0: 0x1422e11013fe6cdd7f843391, limb1: 0xfb96092ab69fc530e27d8d8e, limb2: 0xe39e04564fedd0, }, r0a1: u288 { limb0: 0xbd4e81e3b4db192e11192788, limb1: 0x805257d3c2bdbc344a15ce0d, limb2: 0x10ddd4f47445106b, }, r1a0: u288 { limb0: 0x87ab7f750b693ec75bce04e1, limb1: 0x128ba38ebed26d74d26e4d69, limb2: 0x2f1d22a64c983ab8, }, r1a1: u288 { limb0: 0x74207c17f5c8335183649f77, limb1: 0x7144cd3520ac2e1be3204133, limb2: 0xb38d0645ab3499d, }, }, G2Line { r0a0: u288 { limb0: 0x5daa65d81efa0ef1b3b5406, limb1: 0x759ff07b1035fc39169a31ee, limb2: 0x101ca4f03f0629e, }, r0a1: u288 { limb0: 0x10cdf0ef882fb24b6a44bbd3, limb1: 0x580b99e84dc07e055656849b, limb2: 0x253201b38848e657, }, r1a0: u288 { limb0: 0x8fbd353430e804cbac89ec28, limb1: 0xdaee431fd72f78e22a236faa, limb2: 0x48b73245c4dad79, }, r1a1: u288 { limb0: 0xd98cc2ed22a85b0f8c63206e, limb1: 0xd2aec0400ab5850c7f0fa8cf, limb2: 0x649735015bf42af, }, }, G2Line { r0a0: u288 { limb0: 0x49173a889c697b0ab07f35bc, limb1: 0xdcffb65f4b4c21ced6b623af, limb2: 0x1366d12ee6022f7b, }, r0a1: u288 { limb0: 0x285fdce362f7a79b89c49b5c, limb1: 0xae9358c8eaf26e2fed7353f5, limb2: 0x21c91fefaf522b5f, }, r1a0: u288 { limb0: 0x748798f96436e3b18c64964a, limb1: 0xfc3bb221103d3966d0510599, limb2: 0x167859ae2ebc5e27, }, r1a1: u288 { limb0: 0xe3b55b05bb30e23fa7eba05b, limb1: 0xa5fc8b7f7bc6abe91c90ddd5, limb2: 0xe0da83c6cdebb5a, }, }, G2Line { r0a0: u288 { limb0: 0x30a4abff5957209783681bfb, limb1: 0x82d868d5ca421e4f1a0daf79, limb2: 0x1ba96ef98093d510, }, r0a1: u288 { limb0: 0xd9132c7f206a6c036a39e432, limb1: 0x8a2dfb94aba29a87046110b8, limb2: 0x1fad2fd5e5e37395, }, r1a0: u288 { limb0: 0x76b136dc82b82e411b2c44f6, limb1: 0xe405f12052823a54abb9ea95, limb2: 0xf125ba508c26ddc, }, r1a1: u288 { limb0: 0x1bae07f5f0cc48e5f7aac169, limb1: 0x47d1288d741496a960e1a979, limb2: 0xa0911f6cc5eb84e, }, }, G2Line { r0a0: u288 { limb0: 0x9f79430d5ef315d742ba7cc2, limb1: 0x20aacc886043783d85b20292, limb2: 0x1323cd0f26d8101a, }, r0a1: u288 { limb0: 0x10b2ac6faa0f2c6d21dd1a46, limb1: 0x692a71ed6ead0995c1dd5f06, limb2: 0x38e5099a87e0acb, }, r1a0: u288 { limb0: 0x47ae74d8002447773c1ed5c6, limb1: 0xbeefb67ce6653bc31410cc77, limb2: 0x38bcbf510e04693, }, r1a1: u288 { limb0: 0x87f7dfe2a9704d878a43c43a, limb1: 0x388417c8c9596caee4b8f3c8, limb2: 0x2231862dd6ea5377, }, }, G2Line { r0a0: u288 { limb0: 0x8824ae4e52f07175b229f86c, limb1: 0xea266c73c6740dc7206d703e, limb2: 0xa0bcd21da42425d, }, r0a1: u288 { limb0: 0x91c8d9f501c8c2411d65a5b2, limb1: 0x6f693a3cbab19d3ac5acf696, limb2: 0x2cb77ffe6050fd13, }, r1a0: u288 { limb0: 0x127d86621c661371e92e5fd, limb1: 0x5a334ed75d208520e997f2e3, limb2: 0x3e78ee48b36d52b, }, r1a1: u288 { limb0: 0x640d7cc8a8916f3987fcc33c, limb1: 0x82738853adee48da240f6b1c, limb2: 0x1a0013b7fe68edfa, }, }, G2Line { r0a0: u288 { limb0: 0x2e7b3a5a35456f42e87968e6, limb1: 0xb4303f5093c3a460674a2fcd, limb2: 0x2b5331f03b8fa15f, }, r0a1: u288 { limb0: 0x7cea371d64d8bd0fc5b9427e, limb1: 0x76208e15fc175e352c274fbe, limb2: 0x5ceb46647d41234, }, r1a0: u288 { limb0: 0x6cdac06bfcf041a30435a560, limb1: 0x15a7ab7ed1df6d7ed12616a6, limb2: 0x2520b0f462ad4724, }, r1a1: u288 { limb0: 0xe8b65c5fff04e6a19310802f, limb1: 0xc96324a563d5dab3cd304c64, limb2: 0x230de25606159b1e, }, }, G2Line { r0a0: u288 { limb0: 0x65202a838e48a9d934e11db8, limb1: 0xeb46c664339ef677558bbb71, limb2: 0x132ac06128a0a57b, }, r0a1: u288 { limb0: 0xbc21baf183836fa8dc9de81c, limb1: 0x806b66e601e4ff52a20e891a, limb2: 0x12e535eb6ae922c1, }, r1a0: u288 { limb0: 0xc0b103b1723019de05b304a3, limb1: 0xff8f7760a660a16df500b596, limb2: 0x8db75dc6535f297, }, r1a1: u288 { limb0: 0x3a686dcde09afac7da57832c, limb1: 0xa5947df796243b62fa4da442, limb2: 0x259924e4a773bef0, }, }, G2Line { r0a0: u288 { limb0: 0xb2236e5462d1e11842039bb5, limb1: 0x8d746dd0bb8bb2a455d505c1, limb2: 0x2fd3f4a905e027ce, }, r0a1: u288 { limb0: 0x3d6d9836d71ddf8e3b741b09, limb1: 0x443f16e368feb4cb20a5a1ab, limb2: 0xb5f19dda13bdfad, }, r1a0: u288 { limb0: 0x4e5612c2b64a1045a590a938, limb1: 0xbca215d075ce5769db2a29d7, limb2: 0x161e651ebdfb5065, }, r1a1: u288 { limb0: 0xc02a55b6685351f24e4bf9c7, limb1: 0x4134240119050f22bc4991c8, limb2: 0x300bd9f8d76bbc11, }, }, G2Line { r0a0: u288 { limb0: 0xe9296a3a3aed4c4143d2e0ba, limb1: 0x7de973514b499b2da739b3e6, limb2: 0x1b4b807986fcdee0, }, r0a1: u288 { limb0: 0xb9295fecce961afe0c5e6dad, limb1: 0xc4e30c322bcae6d526c4de95, limb2: 0x1fee592f513ed6b2, }, r1a0: u288 { limb0: 0x7245f5e5e803d0d448fafe21, limb1: 0xcbdc032ecb3b7a63899c53d0, limb2: 0x1fde9ffc17accfc3, }, r1a1: u288 { limb0: 0x8edcc1b2fdd35c87a7814a87, limb1: 0x99d54b5c2fe171c49aa9cb08, limb2: 0x130ef740e416a6fe, }, }, G2Line { r0a0: u288 { limb0: 0x38f941f3820c4025d48597c4, limb1: 0x4270c36c42111e8a83bed2ed, limb2: 0x2d0d91a20b75cbb9, }, r0a1: u288 { limb0: 0x5ac829defc8a29c4e18ec184, limb1: 0x3ad0a15a0dd4df948ef5ff02, limb2: 0xf618f631c37e868, }, r1a0: u288 { limb0: 0xf96e4555f7a83c01c2b1d33f, limb1: 0x74ee4e7ee57979aed686387d, limb2: 0x1c3d7a9c3d45957f, }, r1a1: u288 { limb0: 0x210a733628cff21f964acf38, limb1: 0x58addf725f511f5c0f3c4c48, limb2: 0x25c47d2540c2db11, }, }, G2Line { r0a0: u288 { limb0: 0x40675e9847f925e0cd58ff84, limb1: 0x19a957ff534718c419e1b3a6, limb2: 0xbb2e95d559fbe61, }, r0a1: u288 { limb0: 0x70bd9ffbe4ec1ca028fc7d77, limb1: 0x12b76b14785c6e62da580b73, limb2: 0x15b1b31fd06f755f, }, r1a0: u288 { limb0: 0x92dd2c2444d613dfaa53a1e3, limb1: 0xec043691d9b8376ef4c32dbb, limb2: 0x1804f2db8a7b3a55, }, r1a1: u288 { limb0: 0xe8ad6e24b323fdb6cc8189a9, limb1: 0x501fc22cd9d6c75bfcfe658e, limb2: 0x4669f457c82b8e1, }, }, G2Line { r0a0: u288 { limb0: 0x537ecf0916b38aeea21d4e47, limb1: 0x181a00de27ba4be1b380d6c8, limb2: 0x8c2fe2799316543, }, r0a1: u288 { limb0: 0xe68fff5ee73364fff3fe403b, limb1: 0x7b8685c8a725ae79cfac8f99, limb2: 0x7b4be349766aba4, }, r1a0: u288 { limb0: 0xdf7c93c0095545ad5e5361ea, limb1: 0xce316c76191f1e7cd7d03f3, limb2: 0x22ea21f18ddec947, }, r1a1: u288 { limb0: 0xa19620b4c32db68cc1c2ef0c, limb1: 0xffa1e4be3bed5faba2ccbbf4, limb2: 0x16fc78a64c45f518, }, }, G2Line { r0a0: u288 { limb0: 0x2b6af476f520b4bf804415bc, limb1: 0xd949ee7f9e8874698b090fca, limb2: 0x34db5e5ec2180cf, }, r0a1: u288 { limb0: 0x3e06a324f038ac8abcfb28d7, limb1: 0xc2e6375b7a83c0a0145f8942, limb2: 0x2247e79161483763, }, r1a0: u288 { limb0: 0x708773d8ae3a13918382fb9d, limb1: 0xaf83f409556e32aa85ae92bf, limb2: 0x9af0a924ae43ba, }, r1a1: u288 { limb0: 0xa6fded212ff5b2ce79755af7, limb1: 0x55a2adfb2699ef5de6581b21, limb2: 0x2476e83cfe8daa5c, }, }, G2Line { r0a0: u288 { limb0: 0x9ab1f3d5a481c50cff61b4ab, limb1: 0x11f4705a4954e6a036be2ad2, limb2: 0x308f243a8a83264, }, r0a1: u288 { limb0: 0x5f19b29c09416b2fd501f695, limb1: 0xd0a5c0a568ca5e38f82b2f7a, limb2: 0x8abaf41ba2b92f5, }, r1a0: u288 { limb0: 0x6cc5a6aa31c75bfb717c7828, limb1: 0x96fe9ee8789208c41d57d3b8, limb2: 0x1ff348bb7825845a, }, r1a1: u288 { limb0: 0x23e6063e1cca25fa4a6e992e, limb1: 0xe94e827315d1667557cbe7de, limb2: 0x2cc27fe4c068e1df, }, }, G2Line { r0a0: u288 { limb0: 0x5de7a643e301caa63b685021, limb1: 0x933a277a93f708227c90f768, limb2: 0x426809a902d5047, }, r0a1: u288 { limb0: 0xbb25fb66cb4bf4c7ec50bdbd, limb1: 0x52a75a0facd2b7bf0ea93bec, limb2: 0x1f265ce4dbe1a42b, }, r1a0: u288 { limb0: 0xc5717cea7518c3550b4d5f4, limb1: 0xc95394cb07fdfc22e63d990a, limb2: 0x2b4bcc47347e8eb5, }, r1a1: u288 { limb0: 0xc5a6f1284ee2bdd4922c2508, limb1: 0xcd55e1d8ff43e6dd59224505, limb2: 0x2c376da2c4c11de5, }, }, G2Line { r0a0: u288 { limb0: 0x1c4759bcf7c607fe3f839d4d, limb1: 0xea91f311da73327e2ed40785, limb2: 0x2017052c72360f42, }, r0a1: u288 { limb0: 0x38cf8a4368c0709980199fc3, limb1: 0xfc9047885996c19e84d7d4ea, limb2: 0x1795549eb0b97783, }, r1a0: u288 { limb0: 0xb70f7ecfbec0eaf46845e8cc, limb1: 0x9ddf274c2a9f89ea3bc4d66f, limb2: 0xcc6f106abfcf377, }, r1a1: u288 { limb0: 0xf6ff11ce29186237468c2698, limb1: 0x5c629ad27bb61e4826bb1313, limb2: 0x2014c6623f1fb55e, }, }, G2Line { r0a0: u288 { limb0: 0xc403ea5ad65aadd602c8c76f, limb1: 0x7a8d2727cd7fa40d97615b39, limb2: 0x14bd9b9bc6c2c1c1, }, r0a1: u288 { limb0: 0xcd28af7919b01761c69bd246, limb1: 0x8a1a211a81094740e2cc984e, limb2: 0x2766e09571dc194c, }, r1a0: u288 { limb0: 0xa24dbe5f1fb539a5d9d39db7, limb1: 0xd7eef78019e82d7e1f77d2f5, limb2: 0x6d7b6e70105c87d, }, r1a1: u288 { limb0: 0x30836b87e6e8553c665ffbe0, limb1: 0xb0474bb94febd802f9049ad0, limb2: 0x2774e72d0844eea4, }, }, G2Line { r0a0: u288 { limb0: 0xc648054e4b6134bbfd68487f, limb1: 0xdf0506dad3f3d098c13a6386, limb2: 0x26bebeb6f46c2e8c, }, r0a1: u288 { limb0: 0x9d0cdb28a94204776c6e6ba6, limb1: 0x303f02dfe619752b1607951d, limb2: 0x1127d8b17ef2c064, }, r1a0: u288 { limb0: 0xe34ca1188b8db4e4694a696c, limb1: 0x243553602481d9b88ca1211, limb2: 0x1f8ef034831d0132, }, r1a1: u288 { limb0: 0xe3a5dfb1785690dad89ad10c, limb1: 0xd690b583ace24ba033dd23e0, limb2: 0x405d0709e110c03, }, }, G2Line { r0a0: u288 { limb0: 0x3b5aa24fe300f5bef5aefca, limb1: 0x5d5566dc41ca40c4af2bf978, limb2: 0x39a42540cb68ab8, }, r0a1: u288 { limb0: 0xe21ea63fac2d99bf899d8353, limb1: 0xecdf87c89dafc1f9be69379b, limb2: 0x1c75e3d0966038ad, }, r1a0: u288 { limb0: 0x7c9f991de50f505a8dc707e7, limb1: 0x259d423172d9927ffb0e98d1, limb2: 0x15fb83693066d1ff, }, r1a1: u288 { limb0: 0x72c144b5e7d364d572576db6, limb1: 0x5d75c50c43614aea3e81a99b, limb2: 0x1ef4651860019554, }, }, G2Line { r0a0: u288 { limb0: 0x72cc2cef2785ce4ff4e9b7af, limb1: 0x60ed5b9c207d7f31fb6234ab, limb2: 0x1bb17a4bc7b643ed, }, r0a1: u288 { limb0: 0x9424eb15b502cde7927c7530, limb1: 0xa0e33edbbaa9de8e9c206059, limb2: 0x2b9a3a63bbf4af99, }, r1a0: u288 { limb0: 0x423811cb6386e606cf274a3c, limb1: 0x8adcc0e471ecfe526f56dc39, limb2: 0x9169a8660d14368, }, r1a1: u288 { limb0: 0xf616c863890c3c8e33127931, limb1: 0xcc9414078a6da6989dae6b91, limb2: 0x594d6a7e6b34ab2, }, }, G2Line { r0a0: u288 { limb0: 0x4617750de3208c0a42bf7c07, limb1: 0x7e2d94e31538522d38df8b23, limb2: 0x23954455da7aef56, }, r0a1: u288 { limb0: 0x6fef0ba4bbf6577133bdc9ae, limb1: 0xcab064e22aaf2ceec03f1b77, limb2: 0x274369683ff67155, }, r1a0: u288 { limb0: 0x5dce7b13d41ff1b90727094f, limb1: 0x426ef23f29c4df03dc8edf8, limb2: 0x313b4cdbf3d9c5e, }, r1a1: u288 { limb0: 0x62c5ac5fd0d7b3ef591e828, limb1: 0x650f8fc6b0fe55eb28d0fca8, limb2: 0xf5bb0abe931a208, }, }, G2Line { r0a0: u288 { limb0: 0xf2d619ae78049bf9141c35cf, limb1: 0x717f8b10d469a1ee2d91f191, limb2: 0x2c72c82fa8afe345, }, r0a1: u288 { limb0: 0xb89321223b82a2dc793c0185, limb1: 0x71506a0cf4adb8e51bb7b759, limb2: 0x2c13b92a98651492, }, r1a0: u288 { limb0: 0x4947ef2c89276f77f9d20942, limb1: 0xb454d68685ab6b6976e71ec5, limb2: 0x19a938d0e78a3593, }, r1a1: u288 { limb0: 0xbe883eb119609b489c01c905, limb1: 0xaa06779922047f52feac5ce6, limb2: 0x76977a3015dc164, }, }, G2Line { r0a0: u288 { limb0: 0x43a96a588005043a46aadf2c, limb1: 0xa37b89d8a1784582f0c52126, limb2: 0x22e9ef3f5d4b2297, }, r0a1: u288 { limb0: 0x8c6f6d8474cf6e5a58468a31, limb1: 0xeb1ce6ac75930ef1c79b07e5, limb2: 0xf49839a756c7230, }, r1a0: u288 { limb0: 0x82b84693a656c8e8c1f962fd, limb1: 0x2c1c8918ae80282208b6b23d, limb2: 0x14d3504b5c8d428f, }, r1a1: u288 { limb0: 0x60ef4f4324d5619b60a3bb84, limb1: 0x6d3090caefeedbc33638c77a, limb2: 0x159264c370c89fec, }, }, G2Line { r0a0: u288 { limb0: 0xa3343aa671fa957f64383174, limb1: 0x5d0fbca92791fb10ca8bfba7, limb2: 0x114f2c6ae3a67df6, }, r0a1: u288 { limb0: 0x50f6b86be16e52076b114eac, limb1: 0x780e63533112887af8e1b20a, limb2: 0x63e07909f8e5150, }, r1a0: u288 { limb0: 0xf4d68bdb295f81fb688b56c9, limb1: 0xabc9867b1aae2bca05251e19, limb2: 0x1a4d8e8bbc5dc905, }, r1a1: u288 { limb0: 0x1072bd332617ade1aa5f283e, limb1: 0x50dc088ed02b4ee5c8114042, limb2: 0x92f0fffce502d7c, }, }, G2Line { r0a0: u288 { limb0: 0xf21ea2700d86757c9edc60fc, limb1: 0x4ed3a4f31b13fbb9fdabfe54, limb2: 0xefdc83e2cd29ae1, }, r0a1: u288 { limb0: 0x36771d39b743a658ed812080, limb1: 0x506453f18d56ef30476706cd, limb2: 0x2658fa02d8abf7ce, }, r1a0: u288 { limb0: 0x4aad4f76dd2af32ff8a6f388, limb1: 0x6aebd448524150ae6bb57548, limb2: 0x2702b8c1fb9a5bfb, }, r1a1: u288 { limb0: 0xe1462da76f807e5e73062316, limb1: 0x244b002de9ef9e9d65b40718, limb2: 0x2672d0c637a3cc19, }, }, ]; ================================================ FILE: src/contracts/autogenerated/noir_ultra_keccak_zk_honk_example/src/lib.cairo ================================================ // Generated by Garaga version 1.1.0 pub mod honk_verifier; pub mod honk_verifier_circuits; pub mod honk_verifier_constants; ================================================ FILE: src/contracts/autogenerated/noir_ultra_keccak_zk_honk_example/tests/proof_calldata.txt ================================================ 0x1 0x2 0x0 0x10 0x42ab5d6d1986846cf 0x0 0xb75c020998797da78 0x0 0x5a107acb64952eca 0x0 0x31e97a575e9d 0x0 0xb5666547acf8bd5a4 0x0 0xc410db10a01750aeb 0x0 0xd722669117f9758a4 0x0 0x178cbf4206471 0x0 0xe91b8a11e7842c38 0x0 0x7fd51009034b3357f 0x0 0x9889939f81e9c7402 0x0 0xf94656a2ca48 0x0 0x6fb128b46c1ddb67f 0x0 0x93fe27776f50224bd 0x0 0x4a0c80c0da527a081 0x0 0x1b52c2020d746 0x0 0x72ab88d983cee099575165c83abb803f 0x52448006a17e03ba3bbe63d5b47ff32 0xfa07266d5585575615ca0daf763e781c 0xc96573e847bc03378aaf19a8bd6c6ed 0x6b111a358e7b9fdce64cb86c8b1fb52a 0x1b69f0aa1eea2bb7d8cb583033c2195f 0x9fd4142701a07133931e2c1d26e66efc 0x9d6f7b8da7a7f037105f9482658bbfa 0x87666fe06b552e6f8f4c215b3df1f9f4 0x2fdddc4da9ebdc2d20a9ad1a77e9f6ac 0xd5be63dc611e974fcdf11fbc3d7489f0 0x583d337a428760fb802a6f99f8c1d5e 0x1258ce2285d167037f38bafc71b5f3ef 0xfb6f88a1066aa22db0f75cbe7abcf8b 0xdc3d0951dd20df6957b6de3d84a26b7c 0x231ca2cacf2b7584590eab6abcc37fbc 0x33132599ff8d951c6480d023176d2e5c 0x2d849894995d544374e87788b4c48e6 0xe0b7851e78aa53e6d105323591ad7655 0x8218db22ba568bbdab7ee8f62367714 0xf2b663bf761ec96ffe79254867c0ad36 0x32694c772dec94ce53da7542ab09b00 0xfb846507acca876a9e0cd0f41d614c16 0xff627f7414810f063ca652aabaeaf51 0x46543e6a2b9b43ba70602c5ad5aace9b 0x1e7949ab5b9823a0c4573541be9d423f 0xbad70a140647157440ad88d2e4a3950b 0x2cf856aec06236f1495fe35b94c8d9cb 0xfc622d53158a5478a8123eae0b36c049 0x1d4a2cfa7b13031f3bc22ab08c337ae7 0x7172af45a4684d5cca71192c40fc67a2 0x278c2b9ef48e583c37d267a46ad8a92 0x3 0x2c9e2f2958a2bb0e9530369a66ce312 0x1ae90767314145391e819f65e7a061f5 0xccc7d4a4e2dd2b199ab44a58a1ebaade 0x1327f12ac25cd85456fe8009fb6383c3 0x391ba38188d34b7c4ec84b1927c4bbd8 0x11bc51d7524ba359920c204713aa9ca4 0x2656051221a04f13b82dc67fb0f716d2 0x202a95508dbcdc3d1f31391632d77083 0xbc88c6c36b302b7cb605003d99a523df 0xd41cb868ee9cc05d52ad9ed3bc756ce 0xa277c152d490bd7585938f45b1894ab1 0x2b2a35acd7bbaeee98ed86332a4d552d 0x29a680d6c153afc852391ecaade90d79 0x18739d773a54fe1c4fb56e8d5343fe01 0x6c 0xcc0b26e7c47b88b61300f6a714203978 0x21a4363611dcb36505a77906db203850 0xd9e9822dfd6af2b3ab7b1dfd29f422b4 0x108228bb473a359ee2b9d4e5509b9f99 0x82e3a5c013757144195f82258a79b5d1 0x2eb5aa6dcc3b3987a133cde7ce94a8f2 0x6bfaca2df8b3074cb923d3403d98354b 0x2f221cd4207b8dc4ebeef7dd01d3b027 0xaec375b33cda91c8229839143d3d9ee4 0x38a8fd1e98d020c71b767362a1247b1 0xb970a86e283211052205ae42a24f2a60 0x26f368b71a62e9472c6d4b7cb9cbd241 0x1df61c241b887595b5c198ccad82e02 0x46cef1bc75114160b262490afa4e782 0xb1bf162dab3228a77682467d72a9a41 0x28b47ec355137cca90c1dc8a7d66cd19 0xafabb5c7a08c76713032d92ed920f2da 0x273f710dc0174bb3fcb74b70bee6fed4 0x9caf249aaf83d6daf164c38bdd57f553 0x51cfe239d2d6a396d2c228a56fae151 0xbaf082e51fa705f23b14d8b22125e42 0x1821a4cd4cfc564d92f471a32da3d8e 0x884be311533e27a2766b4a6f57ba1433 0x2d40a4de0139e40168366b6e5c0c7368 0xd5a69dab774dbec40d2771d749330cc5 0xb00e1f39d30a682ab8f13fad231c574 0x89bbf5dfea0e66f00b3da61d44f37306 0x2d7cf7fd5b7d5703ee122e9b52f0dc3d 0xa93437f3bc1b0f596b7f77642dc240b1 0x2123c7b52bb5d9eb1d21f3231f12dc97 0x7c12923633e015111649175e47ded675 0x19a41dcfb537ab032c15b2ee1e7cb755 0xc8176ec7ca8ee13f072c8e1d76393eab 0x1e98bb22b539ca6712c6bf388513a659 0x789bbbec5f0e88df5b33ab5c292d9454 0x1cc7ab62bd87f861adf2f1ed20af9e8 0x88d1f8a3ce231f9bc582995fb6a474ea 0x1e8281a7e709f42b44de3a7c338c7109 0x60d0f13045f92b5152a49b5644f1a25d 0x2dfcd2878cfc070dde9161d39ed5988 0x5e24fa26bfdfbba94f9d5a8ac32d4f5d 0x13bf8cfc3be083e84f9ce122bc88ce56 0x307ce7a8680432359ada1b4d23c7cd0f 0x25bd94e17691b170a16c350566860df 0xfda2ec7f0ded110be200306cf95690f 0x8258c010a6333bf6d1bdace683e9ae9 0xca4cb1d5122de98671d08543593eb774 0x2fadad86d31089295cce763681a76487 0xba1527dcc96fda093ea9b874e739093c 0x232d2497ea760c8d66688404cd8c56a 0x2f68730495166ad0eb5624f71f8be36f 0x161ee15d439ed0352ea813f9c0ae32ec 0xe0e2ad30b6b8eafb8ccec4cecc63c376 0x1b2550b72de1597ebd406bf12635283f 0x478636e93794b1ae092ff88783690c44 0x2c0f935c834e2c4ddea9621f04b4abd1 0x78fb1aa27bd934c469316578eacb118e 0x2e552a6dddeff257e8965dbb8cf6731 0x9cccb5fabb643dca142f7e8da11bb34c 0xe16b89009360d70bbed299308f0cf0d 0xb71299bdfe1ab64b0f8602cdd14498a4 0x22d2e9b5a18d679e15ed7825e637fa93 0x90c4988ac70e718d9fd4e84ddf9abc9c 0x1849927a2e213775792b7c71b9fd1e80 0xb1d90d16853334c7238a2d658fb0b946 0xba6d423e8bcd65e5a76e40bc2c7c1e3 0xd107a7ce7f67e6672342f43549dabe7f 0x1e5217ddbc7f2b999506bd3e8946ec79 0x1be22389a3e22a4f0781946979dfb917 0x1fdcde298d3519ed776ef232ec4c9911 0x9bbe85d36e6c96d3feaf96e820334cfa 0xf466353dfdf6ba4b8029f0a89ec74d0 0xe458e488a96352a50c6c7dfe8e0bdcc6 0x270fd5ccc9623c83682086f7beab0eef 0x6a4bf71ed3ed20541b25b454f450e05b 0x28a4e0c28a54e73b235d79c465f69ffd 0x2b6219841632a5c066212e86d8684d5f 0x1649cd4f45b63a1874479b35957430a3 0x8e20d7226125961292f139dd5d09ad4e 0x1fa60b8f65e3c55620d06599f609aa76 0xc90f0bbb8dc62e79582da94bdf4e876 0x27dc780c65156f316ce9cfda32a26589 0xd7bdc19647254b8d6a7147cd9b7fbd2e 0x25b692e193186f842b3bbbe87942d4ef 0x840d712f1081b774d701702af9fdb2e3 0x15f516c84c42b417b355a57c9524580 0xb42b3479a5ee331245a55f1796f3b774 0x164d2259b79875ff6d4a7ae314962f19 0xb3c8313ba6240b749023cde3de8d5c3c 0x10111bcb41adb28f4ebf10a9895ecc31 0xa7c2730903c7b061917dc47464dbf 0x1fba242634de9c29faf950a87cd22aa1 0x9ac2096bfb0bdac76f56b8560002e265 0xffae1f6aee59dd14f1d7b607ffdd13a 0x9d003c257c0d3af83dd8569d7c60693c 0x655b659f21ae211c9ea722ad0584155 0xa9d0212991fc3d8e66b1ff6b06db9f0 0x45303cd130176514d50f368289c815 0x2c775709380afa893836d6879345cd93 0x1dfd30e386b38843e1165d490041a915 0xfa477c897ab2411eca8aea872df599ed 0x163760d050b89655979f8e9c85bbe55e 0x4e51ac031667fa04263332ff010a641c 0x13fdde734f80b43007aed286b83d3c1d 0x786e38ff793bf676a9e81c7e8722779c 0x224f1db561ac33580d6e5f09935f9c51 0x13330fd426358525f3f11e185494063b 0x30405c6757f3252cac49f047252a756c 0xbca5e47a11f717c325b2d4df9a709e12 0x1cfb6601a73078b8e2a36937ddeba5d4 0xd72316ca31e1b56c2f21cf6bb95c417a 0x4c99d996a9f4beb1ad8368c623b7b32 0x6bae38e872ef0bad755f739c33b99b54 0x26c16e50c8d88a31b23f3700ba26052 0x216947b087f0ae5eccd2ddeeff60a780 0xf9a0f594ce0628f09d6195cbf29fa57 0xf80ae4c549a83475ce8d0326ca822fbc 0x298585de68bf9430a83103bc90debc6 0x97113c64e7d166da1412419cadacaf51 0x162a7c32c9a495575a2c10542522d18a 0xf243c7fb9595f93bffa5b3b914c6e606 0xf7a850acde6e20167b5cbd8c2ed1571 0x8db3be85de1c940c7140f5aae833dda 0x281c5a2adaf1754f096ff30e01f56ccc 0xd665375ac50f8321d33e33739b64d0f7 0x1621641e97bc505c7e2457c8e91adea9 0x52183af9be2ac2c85eda2423582b5ad3 0x193efac585526daa985346ce67900cd8 0xae85c676342b0b9631f168d7dd7f7083 0x1a85e32f7ca06d68b26db3b400fedc71 0x8113c731a9d7b4ea73d60b53edd05bf6 0x2003047244e7948945d9dc9940701f48 0xe87d35125feb28d04f69ba647381d146 0x3b3db96cc492108706e1ca99f852ae9 0x2216dcc8ed42d61cfe85fec72fd7c715 0xd0ab716ac7bdfff74d7913ad4fc9f2e 0x3e429ba84ba1058876b52b794134f489 0x19fa59649571387acc5035e39ec5579a 0x3f687b7e5389a7249d411ec165b4df4e 0x2118d28f0b13b9c1cb87327a0b135ec5 0x4a1d61a2d0a5f4ccfb6bc192bd85c173 0x2597c00db579a17147123f0da739fbc9 0x79f078174941c7996fe05b0e5bf97075 0x2144736508aad5502ca14648305a29b2 0x42d87a591a2fde1e7675cb5670329cb4 0x291a02892f5c6d4750d1661f4653c99d 0xd8e5497a5187ef31541d9a897e3946f4 0x1163555ba28cab90ecf66f3238429571 0x238006b7bc6b6dafd69e7edfcf829d54 0x7cd2f7e0ff4ffd4b5359d56aa205c76 0x71df1ae49662ca8f37ba269aecfb0af5 0x2e06e9eb3020bfb01b9ca2a5394a22ec 0x8babef6f5ba652fcc03d99684ecc39d9 0x2a262390a56d9b1b3ca712a697083b53 0x81b1d2b3229c72e9887cc9daf09c5d83 0x283e8db78c1d6a40c7540bb9586f56a8 0xb2c31e07d12d8bf158242ccc71bf8bac 0x8cdab44e40eed469adbbcb56a38c1e9 0x53addeac218841718ad6b2e7741aefd7 0x470824a5a849739d80100191b372fc2 0x2b954c27f8c2d427d5fd7192e2f7e88e 0x582ef20304a993d6896d430b0a8a003 0x6b4a3998c3f87a1d2660260b50a88f75 0x18c20c67e27c359886656607c28ad10c 0xebe49a376c2fad2920d8525542a8d9ca 0x1717c4a944d453d2d2800f5772bad68e 0x4da19a92f3f4a469ee431c0c6cadd414 0x230bd6a574f8e2649413a45307ef1b20 0xfda4ab6004a2dc64cbf86a775c0eba27 0x2cc18fb958c512519bfb67b92f93192e 0x1c15f30e06fe227a167808b9dd795d96 0x29435c7456f378a60516ea36e9a787e7 0x65b4a473d67d0dd91afb632bb0c201a 0x23755840784797464b9139732a10c28 0x2228c18c11a93e23f790379024ecd81b 0x67d14943ff0e5ad1307f1ff9de461ce 0x9fac3dd69eb96e10685c4841ef7df7bb 0x2a113aad0087d70470c885f23778e194 0xcd8ebfae9a3d666bd4c814414f366370 0x1ecc5357363e8c7a80043ae43b48c531 0xd8f2057e30af2f40fc8bed5369ba2ba4 0x12d106e5bca905d644cc4433db4178c4 0x7f07a0830d0993a67ad44361de332c5b 0x2e97b7f851abbc5f8439cd660d7cef6a 0xfe737d734ebf8445f23180d212ac1eec 0x19dfdd77565db43ca1b121b1f607d8ec 0x44d96932613fcd48d72939b646e2a298 0xf27950f8c7361c63eb2077b4a0842f5 0x2f33bbb67654d3daf36ba0f9b208b24f 0x2554853464c8c9e7f6dc921cb0b8ec9 0x8d208c1714797ab2b0311b9751f3ebeb 0x169d6fbefbdbff2221980753bc81acb6 0x2f19c6b5cc51a788442bdd4ab028629c 0x1eaa503ca61fca8fdb8146d8b8317b23 0x7b787e41013b5ff0383d2d6d46c7aa35 0x14a2626a400d98300915902a9085d37a 0x26fb8c4d0efdaf7776508d68dc879bfc 0x211c25850c612b4d500d66742668e669 0x80b8f6cf876fe1417e46141036bbdf52 0x2c7a9f7ac31bc682f566bc8fa6f2835 0xdf23f539e0558b12b01a46d6946f5f76 0x28316a7d304e19a1ff251c0ee00729bc 0x95f3a1231bd8773f45a35949d3a9dd23 0x1d99c34ce5638e749f59a48e8d0983cc 0xa24a050d0782ee290ae83a9cfa6673d6 0x14ca971bbb001fb82476ca77001f005a 0xc285b1a03318f1587645872d065e76e4 0x2eedb579674f894ca34b68f8a98a66e9 0xc84f7be2a74c3d9cbb402276309c377d 0x12e66d029e1436fba743cce476d609f3 0xcaf47b38ae472b9b6da709680db9041c 0x24a6cfa38d649696d9e55d056c05423d 0xbd1168207431c06e3fe6aa70bf335767 0x20046e5d2d49cdf7f561571b4c260e35 0x5e19b5d2930889a7a583cebc48a8f6d6 0x256228d62e03936dec97e93c47335d32 0x29 0xf851d5eaea335bdbc78b8801b6dff2d3 0x1a0519c73c5b93fb7c61915047e02843 0x426d423072f29338edbadddb5a302733 0x1fb9563356aaf4c5ab3c504a9b5f6955 0xf69fe8da17bd9f70cc43dcf95ce3422e 0x328a0565e15de5b95f7c8c6535434cd 0x582fa0d3f347c2035eaf187e51a832ee 0x13b2eda682af01b53b511a59a03c37eb 0x6488213b8903abf45f620c83a020c23a 0x20515bed009cda31abd1d52426853d1d 0xbffac6f10bf7c891b82bc7172bd669f7 0x91caa9d42752483eea29d91b47e069d 0x3360f1e387da343fae283b7f6afe20cf 0x2cae39b62d22e16c442a7f9949d0bbda 0xdc1b80fde8f8d9b78f0ac9147d01563c 0x108c196c1df03a923d64a38ac7808509 0xa02f5ad9cdb504e60c6ac11cb7d85fea 0x107792ead89c1e7a2e0ac93126b25900 0xfac037614f20f1a2156c8d804f412f84 0x1068b35e2e310a1ea2171bc70c19da3 0xb26f5a03ff79d76c18115927a548c903 0x21420e427a7cebd2d61a04a6b7320855 0xa7607130f8a308a825c4cfc0038eb35e 0x2f11842b0d4c2b77786c0ae1831eff99 0xc3899ac1372fddfb3b3748bed7597b05 0x166a449dd17c250da2640f724eb079d1 0x5b3420a0cba6f79f02c9c29963c2318f 0x7e9578fcb8676019922d0acac008a01 0x63e84a0ed75adb648e7bce553a37fec3 0x1e76dfb25985d50e8dea70e8c67e94f8 0x7e6edbb3b340b318b73c062c889589e6 0x2a8902e1aa1556d8c8c0f0032891304c 0xdb4d6d167dd226096e3f48b28f586de5 0x2dc1809f1ca02838192fecb3aa118e98 0x1bc49be8e95abc33ba0e706d0a34c724 0x170366597f3dd87acd518ab78748cd8b 0x9f9e2a454d858e908a7b69b8dc3eb50a 0x12dbbe252aebd6b6e45b72e02c85b011 0x1af08efd59ee2eece56855dbf108e443 0x583a342477636c754360ba284c59cf5 0x1caf4afb1e0ca2c11604f997bd0e4c52 0x23c0fef46399a7be2c7237148a351855 0x66765a237401d8ccee6c2462f9c95a65 0x22a038e174ba63daf6d720e193e1fd82 0x7f3858e7649fa0bf18828125c413a67b 0xeda22f81366f6f2d81df8004e83760c 0xfdc353ee280a7f63a9897698e42d8b82 0x1d8ac3d57fca24230b4b0bb732ff9153 0x923431bd0aa21322f4cac85b6e682afd 0x2248fd0098babd35ba6e73567dfe664e 0x18e29967cef2264ccd715bf1929fa613 0xdc9e7b4f82d30af56c30b4258c2f0ee 0x99e3d4da0ffdcea04c9b7539209b1225 0x10c8907c83ebb3cc137764a09ba87715 0xb684c8c315bdb351eac5a22584d85ff6 0x107add948cf832681f5e9029cd0640c 0xbcc39e165c17a645780fe9f7751673a9 0x15d269b27b91fc124cb8625a67613435 0x1876911bbe95a9886099e6aa72c51924 0x180d6ac0bbd67b4aca90c667a660d736 0xccaba7272b99a63513e54bb171284c40 0x48be863d9df6467f4a0233f621cdcfb 0x29025ac46529b7b579a8976dd70f91fc 0x1a491941a6745a11d9497fc68850065d 0xf29b288b5e765724baaeb9696444240e 0x9cd9113bc9c5ef81fa62f17ac1a0321 0x5bfee095ff50a39341b2db85203f59b1 0x139eab4193005cd82fc7e745dc73c8c4 0xdad0c43fd64b2256ccd4da8b8d5d0a1b 0x2b4a38b97e1f31c327d95b7ab3c6a4ed 0x1e5c70415b475e36edb5492a25d26ba3 0x1768f1bed7a6757250eaa8506dd01446 0xd5e3a57ae0ecec13652475e929755e78 0x1e62c206c6dc784e2d9d0f9f2e2122de 0xe7b6a69b56156803dbd99c8a1850c931 0x1cdd1bca862a68efbe06187c41d7e852 0x6e39eec930fa8bff3a8f3ef488b81bc7 0x126b00fdcf60b33f2ffd7b2848c1588a 0x71807a72e9cd8caed041e789a08d999d 0x127a71feced54528889aa322d7a355b5 0x52796bd37627cd6bc14dc9f9751a55e2 0x1956003b4b270389911ab733f6d918ba 0x17985155438be3a065293851bc39c66 0x2479043f7a52410e613d3cca2724fe43 0x9c649cc215ed11b8d4477c1ec78e6165 0x2711daafce61e5f736697c2b971b7095 0xcd1b62db5b7cb422558d516ced4a920f 0x23000d223301e007217c6381298e6d16 0xbd1034856dde009a63d8ec9d0326e7e1 0x1487363bd21aeeaf9ef93383d346c62e 0xb 0x9ae81468f7f0eac005e476125741b30d 0x227d79a7ccd1edf90ad9c7e1ac54f41b 0x5dfd595f422629a3a753d489fff8a5b0 0x30529f0e37769ee70dd4753515e7b725 0x990fa36eb686c361e3e5f1e2a53f289a 0x30f2e3692eb952d94718c615f0d5db9 0x41ff48cf0baa5eddfb1f42adac49a3ea 0x2305abfd6f73ce6d8ac697f1a83952f1 0x23b29abe6dbce7258ab3179633407d0b 0x2b909b0c6c2d700a12f074245c1482d9 0x9b01577a0defccdbaeb9ea8ee64baa3e 0x277f87a6885177e4d070c738b7675374 0xc62e866eefd2e057ea2f246a5f51e624 0x43c2ecba2e597419b8b00525a40f827 0xe30c69bccf1b16f6c999f0f2adcc4872 0x2571f8e58fe4ef904e6264ee592d553d 0xbdfe06d3fb0c383b6e21baf552d53ce5 0x229a88762e7b7d745545d97c8968dd2e 0xfdd9a8aa8ad9c885d3e8c4c6defb2f75 0x2eca41ebe23a3609cf5a182d4548ff6f 0xfc92d770fc041a40fbb6aefca7454bb5 0xcca5f3510fcb1c76c73449aefd70f5a 0x3528015d211f9056f08d4405ed45e3be 0x815b51d0fad82e2bf58dea47a5c5c9e 0x464762af23a10506407a56b41060842e 0x268020bf9d29c8fb9b3fceeb7d6a59f0 0x956f6c363b1bdd19aa7abc027296c252 0x21dcf2dd1fb746460bcec6abcb55b22c 0x2f2a04f31b661d5e3601042d5e572d85 0x15c2404609182409096c9ab0b9edc575 0x214c0f536698e0e61c517ae4a9934590 0x1f4d839ca0eea47db0c72198326a467a 0xec4286167c4f912c7a0f6ab6e901791d 0x24a3c929713924f58941c78e7f45bd8d 0xccd394dd3bd9d97af416486720cbb47c 0x2c0ccc2b2decab521c9de92d17ead8db 0xdc2b32ff9f7320deefc8c73b4a11a0d3 0x2e5bdf94f1f74e2c5ecfe6ca6032714c 0x2ab7301d5eb5ff09ba1e98a8fb8319a9 0xf992225aba2adc596c0d79c4ce907f8 0x5da835cf84745a5dd3c225f546a0e2d1 0x2938ea18e4f2d46b0c8ebd575119a2cd 0x8e2b37c7901aa87e6e24c17a94926c9f 0x61815dc37954d2af9f7c9e514e8a6c9 0xc 0x96970e7bc1e76a8700187c84e24f9c63 0x1067f0c7f08a0dcdbcc1cc0cc3bfee5d 0x4cdc1a0a3788e194d6f9f5e68a308a2c 0x1ee5130c7cddd7503bfa70ecab8960a4 0xb69b349ef5723bc98374fe182be4f38f 0x27fd7985819c2d0f69dbe5c0450de888 0x7e04416174b643b8d005b59eda49fcd9 0x19043d2f7a8ca0048e7e3ecec36167cc 0xafc14413d0348b839ae6df0880c5d176 0x9bda7fca527a75190ba0ed75efbe52e 0xc72039dc239e501c53d64fb73683bb5a 0x2b3fdb5bb15dedc6bee09b982b7d283e 0xafe1a848c51b43599876c342103ac10a 0x13554d446517fe9c7a91e7ec6860f557 0x933ec06501bba4c4d8935f8e93983b7b 0x1f812efe34bf7f830ef2dfc3836bb90f 0xcaba36d464cd6d52e010bfcc6b50e8b8 0x9829c8d031ed6f62d60ca8ffd35af8 0x76474be0aec4333a562274ff7ff35249 0x2cf07eaa5be46114248a47fee74fea04 0xc9396879901c7dd924e56ca24a376acf 0xc436cb5d6ebf5ea702b0ba1eb6a388a 0xfa0669aa79c0b4c2b3fb74e6e5053e72 0x1015bd4cf50121459e258218bd2674f3 0x4 0xa1f10a6cc49dcf111d90896304a69994 0x20f705efbe5757f96bdff174af9c842b 0x7d17d0be5c0eeaf7879c8a5cb9c199c5 0x23e9d2e3fcafd0b6b2f068263901d519 0xa04640f25bf83609feaf96c53415ba7 0xca0fc19610a516bc29fc31d755f2cf4 0x7c1ba9ea627ce366afba080d00d9ed02 0x1e52a5f81cd198ce503a52ca28c50b58 0x9cab369c1e50e666eb13767588023db2 0x1d923974b4c54ff5722c741d3b8ca06 0x34df50f781a87dd6e614f2ef298cf76b 0x2a1d6fbdf272ce2a4bb5dc5dd1efe3c 0x4a2c2f9efc37ecc7e2da14a1e5e7d781 0x1df0cd2eee881085955492226fc8f8bd 0xcc50fa61b20119aea99f688220063b6c 0x228a7613d97c2df8a4932d736fbbb413 0x27c 0x1a16b2bfe14b2e6019a59971 0x24ed2b110c79d5c92e010b16 0x1ec247379c6405e8 0x0 0xe8f1f014dbbab2842fea47b9 0x7bacd083188a7cc6fe3a1dec 0x162654e2d1942b55 0x0 0x51862d9defbe867b 0x1000000000000000058fa82a26abaf927 0x21df15d1f7b9eac3 0x37159dceadc5073f 0xf4e2a426d8fb38d71d1abdb9 0x2e30d5e351c5320e177a1c4 0x2568667991cbb67c 0x0 0x39a660ff938f9d05c6c23283 0x3741ae35e6f91e9c7f4c3cab 0x27f59a3b2e94787a 0x0 0x100000000000000008828035a3b4be3e0 0x100000000000000008c4999be2da0c69f 0x100000000000000003bb00e99764faf67 0x100000000000000006ab0644a07e72915 0xe5ce33412cdcaaa3b94dddbb 0x6009d73b39bd788cbce9b6b7 0x9021ff582fb8621 0x0 0x16c90793dcfd9e968feac437 0x345097e5b87a9398ad9809ae 0xa9c8f4cbc2d8eda 0x0 0x73734449eec8d93b 0x100000000000000004b969342c9cdf749 0x1000000000000000001caffa7050f2671 0x55c84a1312e847e1 0xe04cb6e5c0640851a524ab65 0x3c46cb323e77fc6781f22767 0x110b4edea3a012c2 0x0 0xcf05d99b438a9be418b2f2a5 0x697cf6c75660ca50adef75dd 0x2f1a3a37ca39adb8 0x0 0x6a97ca9799f2837 0x678ea1ba08b5e48 0x100000000000000008ad9b3e61b404b3b 0x100000000000000007273ae3d4e6d08d0 0x3026598cdbe60ccfc5a4353b 0x2633c174bcd387be205b6399 0x183f440fad085d79 0x0 0xa6fad5d3291a67ff205de888 0xe40c78c45e7173ecff1eb50b 0x26af36bafef99f22 0x0 0x100000000000000006f5fa6d8d03a4f70 0x10000000000000000635741cc29fb2c91 0x10000000000000000689bd6f7b6161e20 0x1c2212e95043c36a 0x5eeb272bae6eb1b79f205d8f 0x76786a7e7eb365fcfcf78141 0x183279bace5856ce 0x0 0x717ecbbd8b4d46af91ceb05 0x4b330797c40c3a9ec017c778 0x2feda3bc36448df6 0x0 0x252152a1038fb5c9 0x2aec4c6fe5c0f7d0 0x45d3d5a95110b79a 0x10179efb5205029f 0x345d7bc53c686e32fc3fd50e 0x62ef32b7aaa8fd97df5ab30c 0x2a6babb7e4e63e9 0x0 0x6580006fe70f48de94bf1ec5 0xedae6cf0243e83449f06b302 0x21ab1c3d0e6bd7b8 0x0 0x176db843ce69cc45 0x299c4eaf2db7b03b 0x10000000000000000300efe44005363b0 0x10000000000000000511eb68f6ac52f63 0x26055195084c443a78eee85f 0x19c89c97adfced3a3de87cb7 0xb9d2fa858ba259f 0x0 0x1624fecc6c9f25f7f8d66351 0x1d386fb1bc5dc8615d6ec443 0x1a619648698561ca 0x0 0x100000000000000005adc03b1b50c9b3f 0x100000000000000005033beb2c42c4012 0x81eab08943a9db40 0x1793c002d915a10e 0x1e9810d8cd01778ba8f46c04 0x9548f4e5fabb4690eea39abb 0xdec7ab798c5558c 0x0 0x17a709275f5799309bd55fbd 0xa4a503d4d6844f14d1120ef 0x139f9473d1246b95 0x0 0x4617854db2159e4a 0x10000000000000000544353ebe59137a8 0x9d170e30a44d433 0x21b6bc5395816243 0xf30fe47fe985d834ca224b2e 0x10434006ecc32fbc094265c5 0x1e0fd1b9b2cd4415 0x0 0xd4c10d8fe3d086ac7a3d648c 0x8d1e28513ba65c3f413c14bb 0xb1906d635029ef3 0x0 0x135c2b4afd09141a 0x8d3e2731ef663f92 0x2788322359ee4247 0x1c577f45e18d8879 0x67eafd8c3ee6181ff153657 0x830a5d3392ad22184afe2102 0x183f233705df42b0 0x0 0x715de70b0c6ce0ab2fc6f883 0x8f443d3c8250e1beaa563306 0x7d738c20d5ec853 0x0 0x18b8ea2d3964f359 0x5623a312b77e64ce 0x10000000000000000433bc5fdaa56fbfa 0x1000000000000000021e825caac67208a 0xa6000b4980f3516b3df3a56 0xb70ca6dda62d13403624b04c 0x2b8e85d0848690b1 0x0 0x31b91075cb5614a3a16bb729 0x22769c7553d732a2caef07a3 0x2f653f32da561bc6 0x0 0x38668ec60d3ffa31 0x83a6da0ae86390b8 0x1000000000000000026bdbdcc6601a411 0x1cf763664fa3878b 0xa7fb16f26c66079bc26264e7 0xd3dab57882d3c1234ab36288 0xce4b75f1fcfe887 0x0 0xb9e9138e33bade6496c2da16 0x332fbffe555f16c9d61f0c5d 0x1a1bea2d23296449 0x0 0x10000000000000000aa5e32f671f7c430 0x100000000000000009a2a422db6108a65 0x1000000000000000044137858e77b6e21 0x1000000000000000008de6f0345f982e3 0x6acd00c747446f6c6d23c083 0x4f7fb1d845ad15b638b12ec9 0x1b705a23004db57b 0x0 0xf1dc207509bedff8a6094f02 0x8d304dd7b8c56a3c24b6fc5 0x6514db784f46508 0x0 0x10000000000000000117ab90bd788da25 0x100000000000000007e32bb8e1a62d8ae 0x94f3ae4900e5088 0x100000000000000004f666c48ce43bdf9 0x1f9dab72ca293a8ccb310eef 0x25a205c00a5255cdbd09a0b6 0x42349edd8121cef 0x0 0x303efbe8afd40bfa28dd702e 0xe8a9c2cf728eb142a67dc9cc 0xc8a1fd6cec0415f 0x0 0x91a8a94c4c7323b3 0x6502e6727b712f20 0x100000000000000002e89fca700df6a9e 0x100000000000000004a78aae362fcb391 0x803119e5be3fa1bba22af9fe 0x1873eda45207a266e7e09056 0x21cd1828230873a7 0x0 0xfc0538c102f6ed6c34549036 0xec0c6fe1165e17e7221b70df 0xd401c9991f54959 0x0 0x1000000000000000015de1acf660c3be5 0x51e1efcfad5cbe8d 0x100000000000000002112d6ff0df801fa 0x96bbff2d7758f4c5 0x8d2994a9dbc9267da1e0b559 0x2882c862143454763970582b 0x2cbffeb5e04238d4 0x0 0x7bf985cffd571cc7b3e8d001 0x4478f2ef43102532ac73213 0x18456b9586efc452 0x0 0x10000000000000000b12b3643b1dab6ee 0x100000000000000004ee941b61904184a 0x10000000000000000533b6fce2d4a58c6 0x100000000000000003b217186d9684629 0xae9386f511ff130a041345b9 0x8641dfc589a8b80a48d02d64 0x1242cbf035f9a4b 0x0 0x96d3614cc1ac044b365cb9cc 0x3c6ed9a26cdf5a7ec1e17007 0xd18ca8b1b027cf1 0x0 0x10000000000000000678931265d1407db 0x100000000000000008ad2fd74ac31b0c3 0x10000000000000000bad4decbfa3030cb 0x100000000000000002b71e17e39c01b2f 0x60508381fc2b848e48fd11d7 0x4c7401040559dbb7b73a0baf 0x8df45a9b3c27e7f 0x0 0x81b77d411023e3a0c6982bd7 0x46ef6cb6a6d1bab0fffc1a77 0x2284b4b406d5b5f3 0x0 0x1000000000000000067c1e28df889b4d8 0x1000000000000000078bd2be0c35ada01 0x10000000000000000ae320c88924b8c20 0x1000000000000000042a6bc322e825ecf 0x2e4eefa37ef162fe04989ca4 0x594de9902fe67f3aed214009 0xa76854dfd2da432 0x0 0x6c45f9a0509d062982a06e5e 0xeae286a0531902f1f32e3fc2 0x619d1b718451e6c 0x0 0x40392352abbdbfc4 0x82d1204f6d373d48 0x4c72440b4d2f51df 0x100000000000000000dbf848d73011b94 0x6d3cb8d9204854b29684b309 0x37e9fd8c04eedc6a5a993b37 0x1db3fb4367633fb5 0x0 0x9beafc56e80faec81d940c3a 0xff334f9cefbc09dc905e9773 0x129df96bb8179b91 0x0 0x100000000000000003c2ee5d4445b4986 0x100000000000000003d2ecec47dc6b286 0x100000000000000007cd64b69b086a209 0x10000000000000000729b2b4226c5b43e 0xdc9167b08a4c83247d944358 0x83e33c6460b171071600ae75 0x1fb9e21509a49137 0x0 0xcd5bac7819f7ad609bb08648 0xf3cb59ee2024e93e38974552 0x5d63b20570b2600 0x0 0x100000000000000003999bab15c3eec55 0x100000000000000001e5b6d729889c73a 0x17b0018e2cdd79ef 0x1000000000000000079804407be1a7821 0x8d0658ada3d52390eb8aa265 0x3e08620790af237588665b10 0x16e2ae4579ab488e 0x0 0xf45b0b2dc671103c98259916 0xb6d2bf4b12f624648bdf9073 0x1462d5a4b5029c48 0x0 0x25ac8c9d540bde5f 0x30f2b22e38a2f39b 0x100000000000000008bdaf7fed972ed4c 0x8e9c8f0baf0e5e0 0xb0e44969500d0a2579b3b387 0x14f72882942f4ec789e0619e 0x24b78a0b14372e48 0x0 0x942ffb395d7b066b601d6abd 0x5272255c660a82845df38096 0x241594a3bf405d01 0x0 0x3c3a3b683ba91782 0x6d1d17cbfe13c405 0x10000000000000000029c353f5d63d5ed 0x615fd4b1080dc249 0xff17337afc626ae953f5626f 0xa8c34092429445fff1f88252 0x22fc3c03db0de0e5 0x0 0x491924acde8c3d25ea2ab490 0xbc919f52638e2efd4d55359 0x27b15dda86188a17 0x0 0xb06ae8ea175cdbd6 0x9cc064951d09be63 0x100000000000000007cbc98dd441b45f9 0x1000000000000000032d2455797b63830 0x5252cd75278c75eeb8526e45 0xe75e8d936631709a7e790194 0x29b9f20cfa89a53f 0x0 0x1da055b2c3209600e7ebe794 0xcebecd76e1c3e35b6df61a03 0x22ce85600d611dde 0x0 0x100000000000000000152ad334db248dc 0x1000000000000000069498d62edefa1a2 0x9aca7a5ace8b3e0a 0x100000000000000004b1a5b476d7df163 0xebdbebb7d4074a6fd329256a 0x65fab8667f348947617a36f6 0x20da88d3dc65f55 0x0 0x93351cb758d8ce9147b4d2bf 0xb5c40a816c020d04d6de6d27 0xae13c476736952f 0x0 0x465cca8bbec235cd 0x100000000000000001f66c0a771ce4489 0x95be3a6cdb8f62bd 0x100000000000000000286400c69da711f 0x7ea094f1db72f4075914310b 0x1f10d5c0d93fac492ed68879 0x23195bb94cb2bbd3 0x0 0xc27bcfde51376c63ccc9cf5b 0xebd2105f002819a3d914deae 0x161d939d246abebe 0x0 0x1c8e1c41087f942e 0x68eeb93aad68d0ad 0x15d99570bd9365eb 0x990d583edb4df79 0x86132f318d8c3f40f3b7a2ac 0x11f876c4e557c4116f55daa3 0x163cdc438fc63f9c 0x0 0x3091d92f220a95249c2054c4 0xcf48dd2ae53fcc3819c886ca 0x26f6d24bc6516ddb 0x0 0x352c6492164fadc3 0x3ce954283a77cf9a 0x2d00649a9ec6a31a 0x69da09c148fd896 0x7884e540c5f811093700b736 0xdea19a138fe61cf23401284f 0x1e3554f35c7ad08e 0x0 0xb5cd1574cb16e32e5f65627 0xe3ad73c43797f9887a95a990 0x619d8a393db39f6 0x0 0xad32fc6b8618a05a 0x48010700e632cb73 0x1000000000000000052ef0b74519d742c 0x100000000000000005b65aea2a0f5f9a6 0xe9657fa21402659512454e31 0x46befc9dcf170bc7b17a70ed 0xe5e806d26b15b12 0x0 0x8b24e3152bcd4b2cac6553cb 0x6e5e265d8dd40564ce75d058 0x2389f150ff932c16 0x0 0x533900219a4faa6a 0xa79f5f286d3c5d13 0x1000000000000000045532e9aa69f92de 0x100000000000000002f8bf6df53288930 0xa14d79a9789ee5d65d715b81 0xc05ed37a8a6d48721f2b9364 0x2cd9cea8c696efab 0x0 0xe90b6f3c1567f5e382b40727 0x66372c66fef3020404a48144 0x661035d1d2de49e 0x0 0x1000000000000000080bc5dcf28240d18 0x100000000000000009b27d40715c5adf2 0x6dd5bb50f765ad61 0x1827ac9f9816d92a 0xf11fe6946c18d9d9853493fb 0x60fc89cb2a9f1e9cee83f212 0x6544cb38385ac2b 0x0 0xf961f4222e9993de5366b974 0x26b975b27a079598c9bd72bd 0x23e126fd24819404 0x0 0x5347fdd6adbdea80 0x87b22f02ab28e575 0x1000000000000000062bf75b1a92a6af6 0x1000000000000000002faf611db16ac1e 0xb88391580f5b71efcb9a13af 0x7ed5841e21c365c253507cf9 0x167970b4fea14da1 0x0 0x92967af06ad6c576aed22a64 0x51055b335db0d1eb86c38f2 0x1a31e57d3b5da2a 0x0 0x100000000000000001e5aca8a13a363ef 0x1000000000000000050546cc577057378 0x100000000000000003f69ca79b40e5e9d 0x630e74ea170997e 0xf74933291e06e8ed71d368cb 0x233e9298066849f4053d3cc9 0x880e566bc93ef75 0x0 0x67efa02c7101c1f3b26de789 0x23a6c4e70958c036a4ea7174 0xa91620d91b455c5 0x0 0x100000000000000004a531e4033199a54 0x100000000000000000534c74a401d676d 0x8857a25bb1b12479 0x100000000000000001059aef9499d234b 0x7ce6456a8a2f5477339d1b55 0x2a89726ee93ebf36df7dba5a 0x2aa62c4d97274c80 0x0 0xa042097258b7da7d4c98ef67 0x2ab96c4b822a7e96293ec2d3 0x23a7b23ed4080b5b 0x0 0x10000000000000000473bd16762c6d46b 0x100000000000000000522a001c523bbcf 0x100000000000000005950d61bce203cf5 0x10000000000000000a36405c841fff36c 0x9c76a149fc85d142bbbc7094 0x4fa6f0f9ba65eab5a7a468a4 0xec56d6ef2239781 0x0 0x98df019a8f3a7595f61f643c 0x43279d99b8a7970fd5a683e7 0x2c4bed9453fc6f7a 0x0 0x1000000000000000046fd08ec6490b558 0x100000000000000005a9427a3d47911f5 0x100000000000000004a986ca069c28378 0x100000000000000008143d37728d9ed92 0xc758acb10641f2c48522738b 0x48d2a8d3a9d98aa3f244cde0 0x26c93e5557a1930 0x0 0xd6f4b4012a2b7e8a0d54647d 0x84d188f02d8669c31355e481 0x1136a8ab40e91e6c 0x0 0x9ba4c5338ea6f62 0x2a5fc3153c202bd7 0x32e5695773a7ab06 0x10000000000000000542ec41f093e41c4 0x159df4ab0488cf54f2b34c5 0x8f912a3d548eae17357a8fd 0xced1c30bd5693ee 0x0 0x6a96b678338d9bde99da55d3 0xb659c49044306c97cbe20891 0x143528b6ffc8543a 0x0 0x1327619cb7e23b70 0x678be898737f8641 0x100000000000000009fa8e15679d11ebc 0x10000000000000000698f3fe5976da707 0x10253d00b789d633b3c2c6a0 0x73a13491c785145e3e3b9fa3 0x232ed65e603c7ab7 0x0 0x58683e0e6f82685a85e51bd5 0xad707c5e8d6dff18d91b05d1 0x244a1b35dbacf41f 0x0 0x100000000000000002a2867f3fdcbcc99 0x100000000000000000ec5439d70e896a7 0x100000000000000002c3ed32846006d89 0x100000000000000006a179ec97e7c7eab 0x44d15f353c32dd31e019ec66 0xb606fff99fd27e55aaac4a45 0x2a95ae7897068a7 0x0 0x78801bfa049de2b1bfed4c97 0x2dda8658b7583f6e27598a65 0x1849a69da376ce5b 0x0 0x10000000000000000a4ec0b9cf4c37417 0x100000000000000009ae5b9f6145aead4 0x100000000000000005eca037272c614af 0x100000000000000003e6398c908983db5 0x8554f6b79c38c1b4509fc483 0x53cfe6b8d6514643a01f3627 0x22576bcf1631d3e6 0x0 0x4b8604b7ef00944ffbcf9a25 0x51997a6baf560abba5ddd864 0x12b88f73abc34885 0x0 0x413a7e01e10eaffb 0x4a221f216398d075 0x3e015452396564fe 0x4f94659bfd3db898 0x4a06edf545a3d36ddc1eca5e 0x84224aff14266fde1fa88c5 0x2a9bf8dd0c1fc25a 0x0 0xdc3de8d221e422a28bdbf0af 0xf4148c8ef1a60c297a33dbbe 0x21deefa5c73bfd20 0x0 0x31dbf2077f8aeb96 0x100000000000000001f907d98d8edfdc5 0x100000000000000002907a8c37e53a7ad 0x1000000000000000082a77efe46ac5268 0xe5539178ea703868515eea46 0xc9286ece1bbcc045bdf39342 0x2d1a33f14d36e98 0x0 0xc861a59d22ca08cf9d55bb7b 0xf369d236a0fbe56621dd6e9f 0xe6b9676b5265928 0x0 0x5bbf8e01d35a133d 0x61c4e3862de56f24 0x8e82c7cea6792f0 0x62d66e48158d047 0xbec4c892efc37fc594a2fcb5 0xe215cef922243f221256db5a 0x1aa7f063ccaf7d34 0x0 0x74197b3943f1e44278dd97d0 0x52355f6c543ee7afdb09fbc6 0x19f8517eed05ab99 0x0 0x1000000000000000057290579ac571901 0x14d4089af6832713 0x100000000000000004bcb7673ed293ad5 0x100000000000000001649c2f12605f940 0x507866b5811ca099c6475493 0xf185907c52a89070c9ecdc4b 0x872320907fbfe90 0x0 0xe0a09cd10116950fb57c07e4 0xe12fa4ee8cf44262904c2a0f 0x244c5fec38069dd4 0x0 0x100000000000000005a9b2185cd4d3491 0x7dfde8f555ca496 0x300af0a04ea07505 0x1000000000000000067489360f4cd12f0 0x450b1e0c9cc3f16397cc0bc3 0x7043d74bdad1ed03599ae00f 0x13fe8195545ff4f4 0x0 0xf41c08591d0399156cabf0f 0x4bd8a4ef70f00b09045ed957 0x14b828f5c7828672 0x0 0x1000000000000000083b7abe087bbb671 0x13e526fc00cbe7f 0x3e428aaaf0282cd3 0x6df61d148f287c48 0x5da20b78e4834ca6ea0f22da 0x968a03c12fd42f73d4faad7 0x246bcffb9190b707 0x0 0x212a17140ca40b3e2632208f 0x990a567169dc4a4fe76da8b7 0x2a1b975b6db63a50 0x0 0x100000000000000008293606955aceaf6 0x100000000000000003b59c577cf828f86 0x3ec1dd3c42ea562e 0x100000000000000003d354137fbed93bd 0x2cb53b1d011b68a2116792b1 0x565e8fa7ba688505c842d21a 0x232483f22eadc859 0x0 0x968f60de8171bde5601d2786 0xfa8ae87a0ca736f86318c1c5 0x3f4fd42e29d5c7b 0x0 0x860789caab32c4b7 0x47a0318ec30831b3 0x68683c97aa3325a0 0x15240ab05c644282 0x35f2e4b3d45348763ad4d187 0x3c08e4d805d9e33b42311831 0x4827bf2603dcca3 0x0 0xe6cb0747de3eb85a8816d17 0x8afb0db09c93bd0d19e3afba 0x5f6c94660d99f88 0x0 0x10000000000000000a7b76b6ae10727fc 0x1000000000000000061fc505ebd3daa28 0x100000000000000004eeb3886db151350 0x100000000000000002881ad65a1a28295 0xbd9f0b5f49f03a7916c7cdec 0xd9907c654e6d32b8fdc9865c 0x9aab662c7ca153e 0x0 0x1bc88ebba14c7bdcc514ef2e 0x5222da2e5bc31fca80720b01 0x829ea7f13a4e647 0x0 0x14aacef3f9f0f2e8 0x6ff2c7117142b0b 0xbda739e452d693d3 0x54467e2ec395b0e0 0xead68d76aa7105bed8fcbc33 0x3ec39873154746cf9145b438 0x2e334c969486be9a 0x0 0xbc6927337f023991c020c789 0x62ee8bda185cd35deb9440f7 0x221ad5cfe58fb0f3 0x0 0x11577c9aeb19349 0xb5e28a3b2c8d3fb 0x10000000000000000389cc4b15323020f 0x10000000000000000918e1652b3ae7d90 0x57bf224bdb30873084939772 0x7286ee973ff3d1a55b78f2df 0xc018a8036d0ee7c 0x0 0x1da4e68e808694f3645413f7 0x48595d6d631b33f45609bbc4 0xded5db78f2d0648 0x0 0x56275458d82c498c 0xa6ce78e83e06274e 0x571454dbb3044e0c 0x61b0c530e28c2e9 0xb2c21f9249792f5ef3fe6b83 0xef05326f1e0a8b3cefd3a275 0x3e5b4ed142e8c81 0xbd512bad4f41c8e92708c60e 0x4f8d704e36dceb51bdee08f0 0x80875b9a39b0926 0xb4d5c5ae96a85cd149f365bc 0xfb41cc15f9dfd5880a4ba7f4 0x104b262b105abb0c 0xba7f7e15d2ad4a16c15f9d8 0xdeb7bb9fc37ff453a880979 0xf0128e20b78eb 0xcf79d0e5ffb360ffa1b88c29 0xe3e88ce4b79c6f7f57aadbab 0x1a907efb9ae3f22c 0xfbee0ba3da98d83f16ebce90 0xa88250e893014ea4969577bd 0x3005c043320c5e62 0x97b920c832f015c1786d1bc5 0xfbf991be78b7bfbf08459ffa 0x1cd307183fb0cbfa 0x5a593880de05b8a83010932d 0x54dedd3a88f61dfe48b0bc98 0x2474371b5da4852c 0x83edc880b2d9fb2b09f58a56 0xad840a4f51d9549d2c1e2c72 0x6266fd6e8602172 0xaebe96160273b732faef9e5d 0xa12950844e0391104a1b666a 0xea66e5a4f0a36a3 0xadd2099e33a23656fc338f80 0xe7019de0a7fd4eacc7ec7f10 0x7e169d6a0f00b4c 0xdedaa5489c9b108d4e0b5a0d 0x2d182674659f1ef653283346 0x156e404245235fd0 0xc5b64a27de3111a93db5baf9 0x6150fc390c535a3033bfc528 0x2ec5b829dd0f5420 0x75a7bc1038267006d6b4b714 0x3e4ddee64aa6ae808fb93665 0x1e0127f0fc8c1c50 0x1b574152b510d0027b9e5406 0xa40bda69aec577ce7802efd3 0x28aa5c8f141f0b40 0xf6bb720ce3480edd33a2d35f 0xabc8bba9a02b068910241a79 0x15e391b1debec606 0xd8fdcf6fdfeb03afe8d20a5d 0xd872d1efe88578cb776f0c9c 0x2ffdede895ca2c32 0x36e91aec4ac6a1a215838de1 0xfaa65e4d2aae7e49357ad870 0x27220fed558c0a75 0xa7e892011aacd816d84a08ed 0x5bc7c4f7bb553b7e0463d078 0x2dab20ad930562f2 0x68cf4df49eb94b16adcf31cc 0xb626aa0dc31e27db6b6ad51 0x2c70f33b1fa6023c 0x38f9912dc6714df4c2f94ed6 0xb9de3f788faced971d063450 0x949af2e8f6c5c8a 0x410a14277259c803f624a771 0x4d5364ce2bb9574855d6cd4e 0x248db74be94150f2 0xb1824487d8b1a3ec3abcc25e 0xa770953f1147432a910f4802 0x33769fae77fbdc 0x1be3bd7a5fbbf30a7e494aa2 0x6993a0d02e973c322a17d4ef 0x29632aa18d41dd11 0x0 0x0 0x0 0xc2778d80388a54eae80e565b 0xf25dc130d86b34cb0fbe750e 0x2d47bdc1ad79a2d8 0x0 0x0 0x0 0x0 0x0 0x0 0xa228aa43fdb7f215226ece12 0x22463bd8b6519b59af036109 0x10bd041a04b54229 0x0 0x0 0x0 0x22 0x6b8f9fb2b5d3eb6dae090e14 0x8a74b6a9517551aacf6a5591 0x2304b5c2e99ea1cc 0xaa9fda7beb896f57d28fd4cf 0xfbf08f217efc4dc69c3ab0e6 0x19d88f95ac2690fd 0x59f98d75787c1257d71a627a 0xb744cb70e0b6464234e73632 0x32eda9e246c8565 0x80b188243b104c9011c97cc2 0x9688a0f84394af4a7e49ddc2 0xf8408e0c5e58aa6 0xf74ffaa34a12ce24bcdfb8e1 0xf0e66ff110a307fd7d8ba03a 0x35ce4a705b86c1e 0x5a0afd2c14c328c5e6906700 0xd8681f6baa0a5ddd76b94c0 0x18325cadcf67dc69 0x2be9577d2bc9bf68ca516019 0xa337c865234891e5fa77fd6 0x23961fda95843468 0xb0bf102ae094554a9fe35fd2 0xe06641d1edcfeeac6a12d926 0x1930c7b29038af48 0xc2c04bcf86f036c023a84bb3 0xa29bb67cd459b31ebb4924cf 0x2b45fd7faa7255d 0x6b461d195fee2bd387131b8c 0x345a71848021024e217a26fe 0x16b44b262ae536a3 0x94662f69e6d58e98988fb758 0xe5b289a69683ef0103fad76a 0x186a12232454e082 0x5092014dca413af352af11d7 0xae3b66499b5ab508c0299e81 0x2ff5e033e7c787ed 0xcf8d5ea7f67f449f5b4edab7 0x53453a38455535dabc9fd932 0x147dbf3373fbbe2c 0x48cc8c79f5abbc0e3c69cc56 0xc89590f84c7bbc8b9de4ff3a 0x2dad62f88c881c11 0x67c24808c26a99dbaa2c1f10 0xfc1effaaf9d15247bd00c285 0x22001e8276ce6e08 0xd073d4dc2757b56ab992475d 0xa41af060be8742f044570a9e 0x2fa9a62acf2874f 0x51ddee517f5cb237696c8f42 0x7fd4a364a038045a121f1573 0x1bbd1d623393d6d8 0xfc170a7b41bfd26c3a7adfaf 0xccd6841db127c41b00e61116 0x2f5708f83d3c7fe3 0xd2133a295b9d8e531d5775d2 0xf2d35303b2b489f7fddba246 0x1d10dd7a0d0a43d7 0xd287013627e376de007c0507 0xb4df935d960b159de305f30 0x18142fd02a7a19b 0xda503c530f7921f52b632f71 0xe7a2d12eb9063a0b8b78c444 0xe6106a1c9a572e3 0xadbc73228396ede89466e96f 0x3ad88e06d0743d8208355b9b 0x293174e28d4a6724 0x7120226654f964431f3a27ab 0x77e185c4bc10b4e99fc2469d 0x252a3e31bdf3de51 0xe15d19708a420ba1fd8f3dfc 0xbb37a03fa481682c1c5a3077 0x2a95b420a4331f24 0x33cd6c048e62f9db24242bfc 0xbac78949cea4a26b8fc25d59 0x131d2fc487914470 0x457926c415a60d5fcd7c31d3 0x49fbb3c3c0bf22fc1adf22c7 0x2942ffe038622e22 0x84dad997dc478c2ea6ece39a 0x33e1a89641536a51ad9407ad 0x2277a47760cc016e 0x66b3293599d6c64ba81ee4fe 0x128151ed7703770a7f0de72f 0x20c5a2865e2ef49c 0xc6d69d0bf1f8878f6c931ee1 0xa54badec75d1e1983c07c867 0x1eb84d7d85a2f655 0x6e286c2a3eff79391c45c62e 0x5a3e04ed66e84e562147cade 0x2ade1f4077ccfa8a 0x79495719d378e3e1485c7ee7 0x6da4118a0cc00f40d1bf22d 0x16c7e1fd6e4abd01 0x84476c15bac150b9bfdff977 0x9f5dbd1978a902b359692a69 0x2a338b7b584e3614 0x4aa1a3229d994cd7b9898525 0x91fc93e08fd8d14d70553693 0x2f6119c438eac066 0xfd3011a101e45502571a6981 0x8cd2e7c1897e3c6b36fcef55 0x150fec39e1ebd8b 0xc6aff42672ab28ac0d48c22d 0x8e1147e4224fe345dd8869cd 0x3b793b5335db3d8 0xed282cac2f16506f63be59cb 0x6c93b2bcbf0c2d21f58ba58a 0x3028b100944e448 0x91f2a85e86fa258afde63912 0xc33b5abfa9b899907339b46d 0x575d1b1c5602a8 0xf39ab2160cc9df43507127b 0x5f431da11cca470c6b69f944 0x2e843cf58f885e21 0xd7297395e3c5ebdf69685c8 0x1766d65d3fc724f17d24f0d4 0x201f557f6bb83109 0x4954485a2901a3a45406bfed 0x6e8e28ad78fdfcf1fda6c4d8 0x1540565dac6be4cd 0xa5fea732c7db07fda2f18376 0x61b23a920084968cc854660d 0x232c9864b71c01c9 0x62c02788af3cbe5f7303b41e 0xaab3fbcc228c9021b565ff5c 0x1493516497564fd1 0x3d742ec024f2b3e8218d5a08 0x2f4b788a9178f8dcf557b050 0x1ec001bd37cfa372 0xbec36feff19b889e35629373 0x415bc07db3d223891a03adc2 0xd2fe15b50704639 0xab41627e9d1d0caaf86bc60a 0xd9a9778c86dc7c441a3918eb 0x538e974f6f58f48 0x18285b6cc9fa1fb53d74d9f0 0x9a43ef6aa107b9339171ecac 0x10e8621421715486 0x79c7f7fbd6e59557095821f5 0xbec7ca4a941f0de1d9ff465b 0xd64ef6be87ab5f7 0x3ebdf3cafac1c20887255663 0xff192c62d42c3502a09221ab 0x2f412ae1d99f57fe 0xcf449d269daa152efc1418d0 0xc06727873d75f97c88895ada 0x18d8e062c531077c 0xb374a2b00512bba954d6ffb3 0x71e930c9a940d5bc428b580 0x25bc92893763a0c8 0x5809a4a55f5c045b74aa96b0 0xe7a38b85ecc453653c4c8b64 0x21e6c6d27595c10e 0xe36c3cdc58ca3c5e5f692a5 0xf108ec35546e44fc9da58452 0x14f3b91747419307 0x4c9c315b284127d2f149d7db 0x2f97cfce5f06c1b8a41f822d 0x2305be5d3de20665 0xc864f57352b25f7cb615c19b 0xa35fe3a980404beb22239d20 0x1159956f46618d3c 0x7546609bb56a31673da71452 0x6adf2a514886bb38a1c7e34e 0x1d6ad0c9f7faeb79 0x4f2a5152dd80b3b7eb68e4d8 0x2bb4a2ee46ee7b0c006506d3 0x296e98a5c07cb43f 0x3cd6c4b9bd3c83cbca21f908 0x9bd89ba0771be347fa153e8c 0x2adbc5fcbb77055e 0x2e260903cc6c16e133be22cc 0xed92cb3f7ef5c48d037f02ca 0xf5c3d57a951a2ea 0xd7fbf99f1e22761880ae7ec7 0x3f640aa5c3daf3cb40522ccb 0x219333ab4485c51f 0x9c94e0ecab4b98879bf1bc27 0x83c8ae19285b7031ceac467d 0x570ef6c0b170c0 0x38d3da2acc27c448bae0ba10 0x6864bafeaafad3dde60296bb 0x24b7e86b97adec2f 0xabb216c9f90586650a55542c 0x8ec170fd6320d8b6ac005005 0x204c8cb4340bd341 0xed65ffe87381e0796df67234 0x7b0693a8c71b858fa0b644cb 0xc34e9384a2b444e 0x284c4b9dc2bfc428af598f12 0xd3e2182e0ccf87ffcf7a3cb9 0x1da46448fe8d337a 0xc180029d10dfaaf53d9649e0 0xc6da3e45b72cba0a843b398f 0x95444afce745f3 0xcf18e69aeb49d2e530202946 0x29ae172474a18901e30af8cc 0x1a86dd050739f937 0xd48afd77452fc42962167a4e 0x22b44e12869fa928279a1d1f 0x2d20cf7bab50df59 0x73b786c73879024dd3e3c07a 0xb58cef0d7a750c5b1e15d4f8 0x1eb8b9695926fde4 0x30268108cacaa5555cfc62e3 0x772d33ff7eb296a6967eaf67 0x3697ebf9a7d5768 0x7f83c9af846cc10c40d1b5ff 0x72badebba1c5123ce1b44595 0x11036cbecf48335 0xd323f4e49eb496d98b600860 0x48b4802e5a3d222ca8e5beb3 0x20245ceee8740c84 0xca65fc878b8992014992b727 0xa69cf0132d64bdd3bb79006b 0x220c3374665b5069 0xc4c4fb6ecb65fb9dd3538964 0x668109faf72f502af3422f5 0x1e8619d8fec2575b 0x2ec6cee61010227a9d25c1ef 0x72bdec03c7fb15de4ca0e254 0x1d38c5a0cb79fc2e 0x51a278a92d1e876f9b8e73dd 0x6f38c9eac0cf4c37bfe6d37b 0x2f8883b3e54ae34b 0xee0ae46b6239c26fad86d524 0xa6a7a69900dc01566a1837ca 0xba96b873371ab8a 0x3048eca2963b5a7c1193a976 0xe8737d3238cd508d8010c9c4 0x2938d6b04764315b 0xf7843f02bd3ac1c54fe3fb40 0xbeb612d555054fb7e25a3620 0x2f75968d2262f435 0xb22262b15979e0a27b5eeb 0x311ccabfb76fd82fd982c471 0x2163070e62af2d69 0xd8c9800dc7ab8dc226088b98 0x3f6e8dd35ae5260a7c061852 0x1253a61b3c3c119b 0xf6319193455e0e1e23b54e5e 0x7549afc0ce836aadc3c463be 0x12dada2aa94089d7 0x6aaf9732074965c64c6a509c 0xbcfdaa834300d9b9c1885651 0x2a4f5592c09dc5c8 0xaa7d39802f183849bf9d9a53 0xb0eb2f09a70c2e8220534350 0x1b8f4ef48f963198 0x28cc0fc57fe0cc3563877801 0x561bab03a8555fdf4131f5f9 0x42128c9075d9932 0x44aeca4c6429720f65fd00e0 0xd51338655c67c8f8b63abce 0xd0d29a09a6b84ae 0x6499a0357ea4ef1dafbfeff3 0x69ca31baf733dea5343699e1 0x1c89819af636b77a 0xab73e23b8973b51dd81acbc1 0xe638513138a4372a80d76810 0x283d6ca2ae7c9c6a 0xda14eefa10629e1e3183cf73 0xd3a03cc155bbe96744c6a70 0x247369122a1d210f 0x112f6d8c0db738bebb1f3c9a 0x5b696d2985311ea5a0a84eca 0x32786d42382432d 0x541666c1fba0d2953a475412 0x708a12d3e5d52b230fdae6ff 0x14e45006498f42fb 0xd14e0f2461dfe602afe36da3 0xc3587cf8689513c25a2c2f33 0x1f2cc007bf2d1b54 0x6a985260c027a3552528e09a 0x6bff0b90d350d5330ce9cbc4 0xe5b4b707ae9d036 0x39debd80832d94d36ad01d65 0xa83918ae9acf91e496ac248e 0x1d58b14cdbccb4e7 0xee29f4e81e407e8c4c4227b4 0x457afd7c8bb5b6d51f9f7df4 0x2a722c33560488fa 0x9961eafd4228cea03fd41276 0x4183adddc4f97a2a398962ed 0x555f1bb664bf421 0xed106461eb8a81ad96489d26 0x4e5cfeaa0775ae75cb8184b 0x1c4597a7bd75fe1d 0xb873d7f5ce49f3f2523c1133 0x64c7ffe813f7ab8f6991dc16 0x1952365f787327b 0x6f5fe35d88b8330d3921d689 0xc32db8db7fe8a6ec961175e9 0x2ef9ecaa424d2978 0xa7db1cdbbf04e3aae2b6ccef 0x61d12c61507feebc60b16670 0x2b2dbb3ca6f4ad5d 0x2e2106bf5081e5ce5e952bae 0x95da1c62962527fc98ab2d35 0xf8f9da05b8c46b2 0x5e4e19f549098c943d79b580 0xa3aff659ccf6b35dfff97404 0x2c505b1859666bab 0xce95d8cc888a6432575e7c0d 0x1c3fcb4046df4e36c9575ecc 0xf62981008a4676a 0x80b2d5b36b2400f9e334701a 0x6cc60c33b364b5d82590a2ea 0x293f10beb4a23857 0x7f001ea5e0fe2add9648e11b 0x9e4b36bcee65c051a3aa3262 0x23155cf3684f2d0a 0x48ff988feca8aab45ab5e69b 0xc86966a410626bbe6cd38671 0x148b7babcefb7369 0x224bec7bd01fe2e0e5e2b37 0xd736bab6f18b67efc348ef00 0x83d27b396c41934 0x1b978fb44c2fb1b923a6fe2c 0x6379e9b788ffd8f57b211836 0x166502aa58f8424b 0x33a2d1fbd7b612285909d95c 0xd8073621e1b66466e9e3d976 0xb95d22dd8762e19 0xd6d47a4a52f525c4ed9f6371 0x15a5fcf8242f3d8822f4c5a0 0x18f113d3a8a92d66 0xdd2997b15199196875aaeaf0 0x7b460d66270374a24905ff4c 0x20c719baf550dfd7 0x2623b688f43af63aa680cdcf 0x97a25b089ed4024006166b49 0x1ff71ec131448b3 0x69f4719223919101cfc71f9e 0xca276aed20592213391687c1 0x1cf15d771a1e269b 0xc6ca893fb470e4c8db94cded 0xc40686529c17a747dd5c52f2 0x19bba9a83124532e 0xaf36cb3ad81b4a68f3077ee4 0xd970a8558908f0e209e9f112 0x1b3d6c2f21713691 0x1d62d185b1933db2fdaeea5d 0xe964ab54b0c6ba613339af69 0x248f507d295e8e52 0x28f6ed863564379a2465a495 0xc27a751c3efd1a9cf6f295a6 0x7487e714ea5f886 0x34c7934b3b12e613b787cb60 0xf0915cc0f9907576bd76a4d4 0x108bf84bfe7b2734 0xd4ba2f4c32cd18e950791001 0xb1fa7d7793fa8d5edcc4f157 0x1fd4b6cd97c00e37 0x36ff05c88b6b38963b2eb49d 0xf2359cd01168a320cc740c28 0x11e27297fa06ef59 0xdff4475d8bd903111a655e68 0xca5142084e2576871f7c5e3 0x1f35176e83bf0441 0x98777538d88948dcb6bee06a 0xb0d4e2ea45cca5a825c5188b 0xd1c275e12e93c7 0x33a7490cdcee4228533003d2 0xbc70393bffdfdc3ddcf4445a 0x2508908f2493ce8a 0x975f5cac63c0599ba19175eb 0x2a4b3ec6d4d6f29844ac1500 0xe0dec2f3447324a 0x2f5f4823b2ec105a69946081 0xc0326d0b2962fdd742ea1f74 0xbd5be75be1b12cf 0x9c9767bd4be806b2277b85b1 0xf75fb8b9908723ec4f8dd377 0x2a2a30ab78df4493 0x670ef71339c73356afa81499 0x24fc4245f98bf911ed7cd5bc 0x8791dd00532162c 0x7f33c6c7447d94ac9fbe53fa 0x37a7674330c42faea463995b 0x19e35a1b2dcf6b0a 0x9914f45ee66a3c3179212cad 0x65ffd2e545dced88e0ba3c7b 0xe8125e4ca79839a 0x45d42e79f1a77e245d19f516 0x193085f51d70d9db13fcd9b9 0x2b5a3620219cbe3d 0xdf09b6c1e6de6ff287e18c5a 0x811a0e8203e624558127fc84 0x16631b7af7450cd9 0x3a20d51f5a3f7b3688a8cd79 0x21ab605fadac620828b0e641 0x1a65bf78a0e48a22 0x94ada974392c51722939a194 0x54b18a060d99928beb69a093 0x4dd061483fe9410 0x5a8f529840f0b485f4a7b567 0x4afd3c2c4feb304600c48049 0x1da177beffebd74f 0xd945fc90deefb30352d333d3 0xd65c1d8e2041072e5098c4b0 0x7f89b66b2b2416c 0xf992e7f45fbe736608ff8042 0xbfc8a452fe87aee149fffc98 0x2fe66667cf446002 0x79aa4acf022b3d5fdfcba8b3 0xc2f2ee0f45fe70951c8192bd 0x23030c14c73861e5 0x3cbf681829f0d23d0922bd05 0xf7bf1a9d03c99ac69f1b5b2b 0x20c68b759e267caa 0x92bdf0e898140fdbff5de26d 0xe2f7a2144693c0280d2d200 0x3f425aaf2e6c9f7 0x1f7d4b7dea932042413a16e8 0x9dad7bcad231ad36a6da855f 0x1ec749f424d63570 0x8f0381b4e78854419d5a813e 0x631286788dc670b8c49294de 0x6f49813f5ae3e1a 0xae7188ed88fd0f75c0d9b8bd 0x7ae7be9f61145abc32290ce8 0x31d33c4fdcc2fa5 0x333424db3a502986e487ea04 0x16ec84242ad8e35fc2819e40 0x305f30511bfa09f5 0x1dd245f50553dea0f7ae5acf 0xe4b1dc320f7d6b0f218165a5 0x1a45f93b5929bf9b 0x2190c6443901071c3b3aec13 0xf4114064c6f3982be3ab2589 0x96e224ad8ecff53 0xc33494e5203b160ca2d5ea61 0xeb2cccd886c99eb5c228d66a 0x25ee7bd4fb0d3a3d 0x5ea04f1a4a7c2ef6b110f7ed 0x7596ea6e00a4721d8b896f78 0x1916d039a1215153 0xb7a867c67789761a8eb99125 0xe099a9af768b9f9290a7b896 0x178a673f611abf74 0x3a298a9f12e9428ce01f8af 0x803c6ea771af3aa1f87e28ab 0x20d9f01205b1aad4 0xc9e5fcf22794ff15e5f94532 0x2c921dd0bbafb00a744869c5 0x1a2a2201cef5078b 0xdc71aa4b1274ba1dfd9b0c21 0x5539098f7023217af7935e93 0x2145fc2bde968661 0x70587179d1efdc6ed725da4a 0xaaa2e00b2236486914afe065 0x11c4d88dbd53bd30 0x3e1ba5887c3b1641bc452fd9 0x213d21c085fb711f6f680676 0x29ed3fbe044ca40b 0x8e2dcea91c1bff6fdbec42bf 0xc635c99523c2a85cd1a486d5 0x179c0639f3541920 0x2a637bf21cc36f679bfab2b1 0x601eb325072c9dc6177cdb5d 0x20b521b588872208 0xb3d61cd3303acb921faaace5 0xf86214a8ff6ed3b19ca0a92e 0x2ea1063f265db1da 0x65501a7a5868f7454303d257 0x25bf1f23f2406336a7daef51 0x285f5ddffb5d22ad 0xabc1671d471ae3df3f16a0bb 0xa33cad079d9447465eda5420 0x2f8081af62672f76 0x4a962b6446aa36e077fb4ba 0x795c837601461fc720be7dc7 0x208ea7102ea18d10 0xe4f6bce8a88ebf1ab4d7c4a2 0xa31425890f224e7141e226f3 0x20a7aaa0ba0ca015 0x164d2f8492eec0dbb852a7cd 0x3b1fd799f778cc197c5b0abe 0x2ac76cce781dce6b 0xd74f47298953032c4f6f6b72 0x77edfa8c4e6d3704a758b641 0x16a7dc2f776e300e 0xb890980cfadb8dc83acc550a 0xb8ff4fe55855f3ea769f980f 0x23b54907fa09c632 0x8bba65534e41d9704f82c49e 0xcd4a11720f504ced22c49822 0x590c9cf471856ae 0x4fb159e61003110719a15da7 0x336b66c33fa184e8141d0f46 0x591fbad11f67096 0x2a6fc5f4c998a2ab0d556896 0x3ce44d1dbdc0d1d4263736ce 0x1b338ba52db11e0d 0x52239d8a752da36c629d57b 0xdddabeef14407c7d5036d4a 0x197ea4cb135badf4 0x106d0f29fd6d4ac9ab83e811 0xd8707a965abe82f2c512a4fa 0x2388e04181f30f 0x150b534ac6e7d0f694178eb2 0x37133edcd19f9c3188657a17 0x241f3c7256f4270 0xa19a7310fab33519231a2f9 0x99afe6e3160f59c2f37c69c5 0x156ba8d687afcda2 0x1110f16c94a29358889c6ef2 0xcfb232f163953c0a512b687a 0x11beef03d76b6834 0x91f89912b698a0b4a18501c5 0xd16eecbe5bec42b1018f6cf1 0xfdd0034c9b263ba 0x94aa3c4dfd0a290d78b6d7a4 0xa58730076bb4b3a85f89010c 0x2c653ad2eb121751 0xc8815a1359e1bc15a3e3b84b 0xef5353dc904727a6d7afb082 0xbff53a4c07648 0x1d9f5d84a4d7a689249ac37d 0x6b5d3f46450c98f3992cd8d4 0x1828af2dd4e18060 0x89842e3ab39e5dff7b952696 0x4d96820a12dfc3ff4847003b 0x14d5633d5335b704 0x5ea4bb391262bc6b2ad7417 0xadb6386a7433f26eed767204 0xf6396e78d6b389b 0x78adfb01c24083563b5d021c 0x8268536cf6f0289404b892fe 0x10873e4f75e44098 0x5a079b74041503a143259239 0xb163b9256366b5cea238a91a 0x2cc05607202b64a3 0xa533055159b0bc197699c2b8 0x8956ef05af670b375fae471e 0x74c5b4a391e4953 0x973a776b9b8aadab89fd8bb0 0x47bf37a239ce3e5db8e33c72 0x1ae856a65d9f97d6 0xdfaaf532a05541a2c26a18c5 0x2dc20e5284b636ee0fcad3db 0x11f24bbaf6a339f0 0x58c91f8b5b1626d27bdfa34 0x5f911d34ff2e330333a10283 0x20cb11c652f8d7a0 0xc9dff7bb1d6e1efb89e0a03d 0xe2c0bc4e6f64f4290241d526 0x276f9b1c3304be56 0xef47423dd0879966c4edc5e8 0xdf5c9ecda9ab8c0b9191d690 0x1d81a8d619002b1c 0x5e12eebd0ae3595212dad9b 0x63b2336882ec3eb241e90181 0x2152055056dc98b4 0xa0e812be78250c7d28bfb292 0xfce8bca4e00989ef245661ae 0x876b81d2a11d85a 0x7dcdacbf86432b6360b50589 0x29a479c6a57a48923285d7da 0x10d650b43885f6f0 0x8d6d55893174ed787eb6bf9c 0x24306eadf917c4ea7c968b7f 0x12cf4b38a144ec32 0x7cf7da115815c2aba1c5e409 0x57661354189331dd068334e4 0x17799ab0c247d767 0x1e8712da4de8ca39c3b55e21 0x64fc115963d6a7144234216 0x771648f124091a4 0x4db19633abd89d6296fa777a 0x1cec501d2db4c34bd9d5baef 0xfb32f60a39d5339 0x6286430214c1226b19d3ace8 0x36b41e8e9b27e6cbcd563294 0x24f7d80b024919e4 0x4011bee1d0b0b5aafd2e9cbc 0x2c611af6f2971e0c4d238a66 0x2c27ebad52699c69 0x8ead81ac6c9bebd08fa8a76b 0x2238ba1d0b2358e6ccde7627 0x2400fb7de0aaeaa2 0xb6955b2d96884238c6925d8b 0x410cf50d0a1ab880ada0aa7b 0x3c9855bc5fd9440 0x4c6b07c389542eeb3a10724b 0x6d9c8b84b83b766f4b03a240 0x50b9bc07e4fa7ff 0xda5bdb35b905f4843054be43 0xb37b803a80d1a6eb298b962e 0x107b8113021fa1f0 0x377be21a1401b0bd72445b45 0x6624e7dccf89388ebe0f9c05 0x1fe2351a684741f9 0xae80bcb71af29fbcdeee2141 0x42dc924a64435e216feb4c08 0x5629efef60c16b6 0x8762243b813b27fc0eab4eed 0x32ba18e074989a285a66d9ff 0x2ffbefe492dbe6d7 0xeb1e2cde83264e4af7e535c3 0x3dd98a61bde5a28f02b55745 0x23959093983e97dd 0x8c76a2d75faddf46f86db5ba 0x43c6ee46ab39173813c1e8a3 0x1e8dceae53bdeb2d 0x8d5ddd9c94e2d8e9bb7af5fd 0x15a0ccaee530fa54ce06fec3 0x477073004c76d55 0x868030ff69e184b4087a9b5d 0x4e2fec6096d9ef8e13bfef1a 0x2ae3080cedd6985c 0x5c675c5d59faa6bc760b089d 0x38fbd9a5fd0c2b892e71106d 0x36279af5903226f 0xe4f57dc2a5941cce267495a7 0xd51fd2dd65d1aba1f7599639 0x10162e2ea26c4bb1 0x200a7736f395cf2eb751ca38 0x3f7dc99620a2a981eb6d7a80 0x862d48d12b6ec13 0x39df494f61db4de450d62e97 0x4b86d42f68cb0347aeffdf7c 0x1ac075560872e526 0x6df131c840995d51a37927bd 0xc883d747e0c0155af0698e16 0xdbe047b3d9838ee 0x246c4272e93f130442a9dfd2 0x3109cf471b059f87d0732c1e 0x1013a7dfcb967d1e 0x43db6ff008db82481f6f41af 0xaa09185713f8bc3dc1a8972a 0xcedd60651a81f73 0x751d6973ed6e7c2f4a20f655 0x56d0ba43f6ce8231426ce7a3 0x183164be89874bcf 0x16dd6dc3cb627dc234ab123f 0xca3170a44760d577d19a90df 0x2d565a8bb54e179a 0x70f7ffafe68be32e285c9ff 0xa04938ffa0731f2b6e455aa 0xa75bb250338b9f6 0xa4f114ef5820ae6cbf6132e3 0x2b581f5e1f33db0b3dfb9495 0x2aa05a712c0fa262 0xcad4ad278a78f32821cd6be5 0x80564dde2462b8e9a665e72b 0x9632b6bca6e5696 0xf80661855070a4ec6f1e9179 0x69d05e32ce4abfd82ad9c880 0x123c4c4090a045c 0x5eb4063d5cd3f74eedde583 0x19c51ef33b289ef512da7931 0x4d559d997dd82b7 0xe7e5f8fae69b6187905ca51 0x9afe347aff7554f6db7229eb 0x1d2a245fe0acbeb9 0x50fddf1c2b5cc143a3c6264 0x54e3ec7ed5a557aaaaa6188a 0x1f2ea9cec76a5851 0xf19fa63931db904812309f58 0x6377c970816a41c1ee0bb3ba 0x1bfbf287ad85dad5 0x8375d1b636cb52ce3d80170f 0xc1b493c422fe2b567aab901e 0xc218c74795669e6 0x275430df1a8f66feecfd68d4 0x791ec851d9487012501d44d8 0x78b58827d01f8c 0x710a92675815be14cc5fadde 0x886d823d4912e400227677ae 0x2fb59032c5ecac05 0x705c181ea6533814a8136ea5 0x82078be318fa4f269b245e14 0x4b1bbe58607b081 0xfea7aab5c91159508453513f 0xf41f37e83d2511e99a4fcf45 0x199762440f828e7f 0x8a3ad64c2de19663df4498ea 0x1e1d76f0cf82446b352c7b97 0x46e0a67c147fda7 0x610d300eb1368b99575a029e 0xcb5f1af2e8f28d169c566162 0x18fdfd2e9a02192d 0xb95483db2631fa6b8bb35fca 0x968cdf88acd9eaff9d75070f 0x2987a18183b4ac6e 0x348b1c4fa19ae9bb17711b1a 0x7fc556d17b98f148bb7b92e0 0x2523514e6edb13d7 0xf4bb736b995ba7d906878b19 0xb3b97023036e1d992a5e2301 0x2b51e0d0afad0ade 0x383b9de1b51d9b30548b5c66 0x212db3c03299afedb2b85b07 0x92af7fce4448c4a 0xe5c71e463edc6bd729dbaf07 0xf8689ef1b46317871426ba1c 0x2ec7efc82ee4e8ea 0x36418f4906002ec3ea904c74 0xac5e87da60bd26902c8f7a3 0x1db97170371e321c 0x61c34b8dd7dfe0a77331adc3 0xc899ae497fa22f64c9e21baf 0x2e1ad39c371f7072 0xc44a26510efa24c481818ae2 0x2e19151df6095aa540251c6e 0x1b4c2d2ead37ca00 0x2b51e13a6c8c3d0fb4b4fadb 0xa13ee77c3da473d36c4380a5 0x2f39a1bedeb48bc4 0xe0aaa2bef6db1104dcf8e3d5 0x7a7ea74e2afdc2dda9e229be 0x7cfc2aa184ee422 0x67c1caaa7a8d3dd6547037b4 0xaaa6837282b2cca22ee008b0 0x2da12d4ae27e1abe 0xf0b217da0c9ad62dff20ae2c 0xae275a6cd9f1b4d51e3d83ef 0x1d00f5e485d9b512 0x95399ee52f8f532c725fc424 0xf5d90b2a0e1856dd6b7e1391 0x1c35a6e1d47d147e 0x2fddca3131fd9afcce08d343 0xec225f4963785f235ca1769d 0x2c291b4f6eaed2b6 0x266d4063c3f50d7ff00ddff9 0x5b420b4102246c31cce27d63 0x2fca061b4bc5df4e 0x11897ca44a299a79883150df 0xeabb48f80a99abc99ef4b4a6 0x388a419a49a6b69 0xc5e74704fec5b48924161f2e 0x725b81a0e18a156922b1c852 0x35d38f9a8fdc7d8 0x5748a51e53ee21f883028c05 0x2b648b48be5aae8d3e67d653 0x220550d9e23253be 0x33fbc397e029cd25164b05a7 0x65acf5445d6780f2596cb61a 0x2a2f7eec35f8dd90 0x4ddfde3957ee6b4d9189c2cf 0xdf3a58f53074125ba9ea7962 0xbe1910c38930aec 0x51f6d6c995e7750bee727c14 0xac8953d2f80049e0cfff7223 0x288d28857449ba88 0x86de8ccde59bdae1fa8294b6 0x52ebe4c712145cfec30f1a80 0x113abbe956df6ccc 0xf286f603db6c0beff139e8c5 0xf5696fb0589b011d710881a3 0x2b69a7d02d63956f 0xea1e21d3d84acc050a0f3dd5 0x52aa693880ebf78cdae5149a 0x2594147532e1c60b 0xffc16b18bc8a005aab89909d 0x2ee8f50471bd6a1904c0fd4c 0x1a66b64000ec41ff 0x20db8535a8ba2b7518c366ea 0x165efb2ab42f0356b3e2675e 0x294d984ffcbe63a1 0xc7f1eca19e3808bdaecc74d8 0x1dd5e41ad5fd62b353e50ca9 0x2cf73ae5ce0060b8 0x580b4e94f2f16838b3e5c156 0x2c019f1374e6441fe528ece4 0x2387cd174a9cbfd4 0x57f923f8e5917c4f524e59e7 0x501afac0b6bf2f221feb9599 0x121a74204433235a 0xed00c2ff1b9b05081ba06667 0x13b2916ddbd3ee146e623762 0xf9c72762766d761 0x44c860425a9f168eb58d0db2 0xe99876a95334f186d0fcc7e9 0x267e3bd14f7f14d3 0x9a911450df6fedb03d95c449 0x4fde5dd66c11fb7f009a0051 0x2173103add5543ae 0x46a8df7f8951ac72f9857809 0xcf95852b9755b0910ccd6f9a 0x53d34c8de47f314 0x6b4fc956778cea0e2a76b51f 0xb4550d5d265ad15fca268dd5 0x2c74ed91d9ba099e 0x741e5b2fd878820e8ac048e9 0x67b73f67c3d8f8c38fc837d5 0xf6ab3016587ef5 0xe399b5983bc6601ff55dd8aa 0x403b90ee7b1711649f606271 0x11339ef9c5c07382 0x8be4ebcbe73191655df1c452 0x7bbe76a30ccbf6f0e8a2934c 0x1d10ac07945e9c5a 0xab3b4f5e1478f12e8316b903 0x7b9d5dbef091626dc4bd81e 0x1164b940079ba738 0x5392e81f58375b41503706ed 0x9f6c376a8e02b71b9d2f848e 0x1c168ac9e1be84de 0x90d202e36d4722b24129631d 0x2f1ddf959e0b976f66a32b44 0xfc637f2f344b5ef 0xf8ec1c8728568953fe5b7a01 0x92328ec0e0262ba3bf73ad87 0x5d63d80465720d2 0x6a978d4cc41a4e5e7e7c2fff 0xe19f3383790847cadca717cf 0x2a36aa3ebf306b99 0x134001ecd5e5096c44e7f6f3 0x33da84040eb5426cc88984d6 0x185ebc77e0de8004 0xf81399a7157c5c1e45d847e1 0x51d14bc7c3de1d37fc785252 0x80e1823c5bab7e2 0xe6d96ad0750af3e0c78bf5f 0xa78931e62254b1bb2fbe8cf8 0xfa1b3dddef12533 0x6d50d1ce4e76e3cda1438fb8 0x80b80aff2f3b610fc427043a 0x1e095309ab925a8f 0x7e7ab14c04874c099481596f 0x5067bce67d8e7a165afa13d2 0x185d54c0120d2734 0x9d2c11c6599c23c4896d9fc7 0x22a9c8caa716bfe41d57663f 0x1453d388d9cbb0ec 0xd9ee359394c165f72dfd25d2 0xe918edda98f83566580baad0 0x292d020b454c5c98 0x242dc74cac555346beea7607 0xc282d1f1ee17fd3638f33fc5 0x16b985bfd31f4cd2 0xda773c3fae5a73c7c63ef37f 0x73e8309daf349a824eabca93 0x2d40c600f3e56878 0xda775e7137d951f676b6622a 0xd9744ad55aa3ddde3191305c 0x12ade5543942e139 0x748e61de7425ea9717359858 0x8db5d6584e49701bc15b04b9 0x11cc73959a314867 0xcb273233b26e4ca536623142 0xe9856f53918734acb4da963d 0xf410f7ba129c173 0x177603866886291f3c38fc0 0xe3c1bbc9a87eff1d8fe636f6 0x1771a27e70bcfe7f 0x26ea2fa9527105107623112f 0x34f919cfb6364f28348f949d 0x2b1020aaa0fc2103 0xe384f3d9f9e8dba84937f06d 0xaef3e71878a7923aaaa0c046 0x13698e82eb14f42a 0x33a328f960e980d1be8ac6f9 0x8854fd2a0a64440b41b7be29 0x22ad52df0ef7b546 0x3dd8490f4ab078d16483ddf 0xc224515e7c1becc6fcd82d5f 0xf394a9156e7ff3b 0x4a6482741c503d2bf0c1779f 0x278ecc75e3d3cfacbd337a9c 0x2fcdb6d358ae149e 0xba436b382351b59aa3b42e5d 0xe2d4b4ed79bced7db65b185 0x263d67c6d7e2ba24 0x40494c8c91156505ee5cf5e9 0xdd96d3d79aaaefddfd7e666c 0xf452548023ec2d5 0x16d034316a54eb758757f872 0x41939a88b56132e960e0323a 0x17f1fcfd8aa001c8 0x720bda86859e92b952b8b27c 0xfd26def236dc570c00e9ed38 0x7d93545ee854ac1 0x1b120942f2802764e67d8391 0xf876d50995d2b1b2864b741a 0x2d0f28e5f8240bca 0xb3e9732a6bbc04b5038597c0 0xcc7657d81db0a99a5711a959 0xa9f90d6e2740926 0x5e800c824bebb694b5a1a6c6 0x26a9d5d94d068755ef970f0b 0xe7e5ef00b7d608 0x5a0d32831b8c685344642e15 0xcdb34e42c13dd4afbd7db6d0 0x2796b8a232350e93 0x9eb81765fd9533a625b30648 0x35e8e0a5e9f166016b29e6c 0x2c894f01c9cbd096 0x14aa05470f288f8abd05137b 0x31dcad5d15d3dabb35c88eb 0xb5785e691539bdf 0xa8d4a6ec19003ce76926678 0x8a62c1aa5556b0e7f5d503b7 0x2cd28bdaebf0ac7d 0xb7ac9dd5aed422547b1346b6 0x6668cd63191b8e83054c60d4 0x1da2cee0c0643b9b 0x3569bca22a11e9e542069aea 0xf61482f7b993aadaf83b1e38 0x10e5801166fb3fb9 0xe042cc9a4dbd033f9d9e92f5 0x17780f2bf205bcb17694314c 0x3d928bb645b658f 0x39a960c4cacdad776ff60177 0xf69f31bd2304066363098d6d 0x23f9a9fddab270ff 0xde000312f11dee0d0957b477 0x3bdbe7c6d8a3fc7eb6e0b6d3 0x2719acf883cccdc2 0x8bfa17fe56c783e26ace362e 0x2c9b4a8b24873cbadf49ec63 0x724ef3837c9c5c6 0xdc55956ef18c8c8fd38ca7a4 0x98a17a15d878a4de6bf52dfc 0x1dafcee201e24f3f 0xce425da534ae1decf6d79cec 0x1fa0a46bbda0c3cc5079db5a 0x15eec1ac7d01b1a2 0x150fa87781696d2d61de1622 0xcebec91b917052debde2f286 0xfff3479e3e5677e 0x5e3ccfa58486f23ce9d81e38 0xbc0c39d855774ce3544a8357 0x1777e34640f1ecca 0xd80b35f7a6bec59124356ed1 0xfba295cfb02a8245d5d46f4b 0x15acca2661b26fe7 0xe31dc010901157503a79aec8 0x21be2d21c3f3115044414e76 0x22ee9b18d92c77be 0x4555ecac6cfe3494084e3cc7 0xe54d085599934d895bd6b73d 0x2fa7d45e4a838c39 0xc1b0911c0d20087af5e3721 0x262d0dc2da1619d81fe56fe9 0x12caff9276667069 0x1dba195bd45878c724a4c359 0x8f75e767a4103c8ed4f22e06 0x82d854466d60b10 0x942214e7cab052bbb1c6bcd4 0xd031fb3ec30eac93e7327fc4 0x302fd1ef0d852b97 0x42d64a82e4372108e4df2b55 0xf6141f1647c6971507ac4503 0x49ffad1006dc181 0xffc5675bba65c2a5848f25af 0x3ca4dbbd382cb9aa9b1882f6 0x2535578d528273a0 0xb94cedeae6190ecb267ca2f 0xbb870325c9a0348c5a4a489a 0x8315ce219eda2c6 0x28c3a3a88031af61db3dbb2 0x1bdc49de8a52d56934aa0532 0x100c5c56801ba842 0x87884df223b47b62e9821ff3 0xaff2b3242d78fae7e4c57884 0x1fe5dcd03cddc472 0xf867b004c9831e93d6ac71d8 0xcecb013d10611c3c37ea0cdd 0xb54df1943aff935 0xd3819988754e2b9c6333c775 0x234faa129a7f116d39316967 0x23215a3a099cd45b 0xe82174e4be38ecc0cf55ab0 0xb97d1df44da8e016cc3de066 0x12f2ef709a398276 0x47dba0a71b7aef9af8ce4e17 0xaad377c2a7a81efef27523a7 0x2f4f7ca8ca1555f0 0xb6141db3c673b0dafb318e7f 0xb084a17c1f8de98de2bb9d8e 0x18c6f246fc5805a 0x1301b76872e42db00730dc7c 0x929cdfbda9c3d862ded76608 0x254cd181e425cd93 0x5ecb7fd30ec60751cd59231f 0x58c602f0f3349cd604b337cb 0x61d292bff44a02 0x95566a13a36cf640fcd84e66 0x5e046fe853f7ac5b1360d144 0x2bcc2c7ed47f76df 0x3b6e339d1c327617f3838232 0xb4f471704ed06925cbf758c2 0x2199f1d0b634b2d2 0x2db4aedaac8a2d9625064267 0xdc26fac10f375f2dc01746e6 0x123b2e9360850fc9 0x9b377366b35b38461c1d9cb7 0xe38d6a5cef222cb6c2399c3b 0x1f58482120d1ba50 0xa3ed2c9c46e37bf0110dd0ed 0x85a623e4dabc26d92556fba8 0x2aefb3454696a2a0 0x1e8ed3981bbf70fb8851f7fa 0x1f26d3061a0cc01dc15b80e6 0x2e670d46641ed285 0x935b5cb42c155185abfbb15d 0xa445982d313fdc9d7a605bf3 0x278a330a8be2f77e 0x54d7df252398a6f153f8832b 0x1150a2f11221c1df8867fa21 0x26be737156e1c5f7 0x245e53e0471964c1c97ccac4 0x21a09d49a82b1352c4b1e1a 0x21357907dca35d01 0xf4c8e0e1af17cda403de61ae 0x5749d8bb5996a9ec03798cf0 0x158fb3eb5c58983d 0x6e90c6085a0eff61ac56ff1f 0x14b9b49aa60e40a9336333c5 0x47679bcd1bf95de 0xa8f05e511b7a6486d72b8b7 0x6eea3b338f7e904c925d5917 0x6e7456187160a4d 0x1250aa6ecbf37d41158f0ccc 0x5f7aa55dddee04c6a63ead97 0x11a828cb435ef87d 0x48b18b7fd97bb19bad65d126 0x5209189ebb8bc8f9884f512 0x17a1ec6422f5332 0x6d296f3a5423c04e2717a864 0xf40c6b0707633413464c5a56 0x61846b83dbaab50 0x9579dc6699ef3286200b8a22 0x21a5a310218209d3da00594b 0x2c481838b6a1877b 0xa706a5012f31067f619c27d7 0xef445189fc3c8e656ad4cfc8 0x1ca5ece0598b89b 0xd6d4e67dd271b706dbe547ba 0x3402fc5b9134deeb306153f1 0xb63cbf3cd46308 0x3c31c81403f8249ae615671b 0x97c3891131312e899e1484ff 0x9a672a288835f9e 0x38ab26267231472b670a388c 0x5b40010c310cf2aa0aca9871 0x1981222140b19458 0x8c2fbec4258a259305de92e1 0xd86f4345e26c069a519c953c 0x1c20bed91e29cac7 0x1ee0b0544cab9be0a47a3b6f 0xae03a3526fd168f7f97fc6fb 0xf714c07ec5ba53e 0x6b5e3f09e9a256247dd9344b 0xa050cfe4dce5d43ae8a3861b 0x2e986a75e53b43ec 0x7c7d31d777b946e117c4f5df 0xd3c9510a8f8bf77668d48498 0x2f48a855ee30d50b 0x7c58048156c06422eef8a26 0xc0b757d8faabc58f81271428 0x2df6ebd67157fa80 0xee932f58f98d0779f13cf0f9 0x3cde472656cfed22103b62d 0x677180cca08a35d 0xb3775ff9e45bf99e169c0a22 0xcc93402ec833d328055ba51a 0x123e05a92036bcd1 0xc23735d4c0194182c92eb839 0xa31bb9737df59def51b3dbef 0x2adc84fc51268539 0x8ec6545f39d327c5d8fd090c 0x5684f43d0b49d7313435bb9c 0x2320b0abfbed97c5 0x1c44ea3283c55d10058e5aa5 0xb8f6b851c480b8daa739e0d3 0x63bebf92a041b39 0xca9963dd0827b570fbb3710b 0xe1299c2d5440b743375cb15c 0x4c6aaab1e92629d 0xb64a9f9bd8431e90ac5cd69 0xd5b886a8d7c22269aacf7fa9 0x9f2f9113b69c677 0xe97b1d55f86f16b7debdbbe5 0x12755f0fe3990a1d35658463 0x30117af27ea4f05e 0x912a95444a585bb49e1c862e 0x6deac787b721fd80efe1bcd3 0x14fdcfb3f8b23a37 0xa6f9c684de344747161e7626 0xea80858f047037f40cf00838 0x1904c84e6b7ee3c7 0xc75d4fb73f4e80a90b01c17 0x2021626f8f5ae01019c10eea 0x262c1dcf061121f9 0x6d13aec000c2930f0f6f1917 0x1251f9e4b7983560cc113ffd 0x230972f31c21f365 0x10664538711fad97f33bc9c0 0x60b8d94077deba918d4c310 0x216d3f5ec29ec007 0x548a32f9e49524acdc17f138 0xb33c8b8fabf73e3c8b40131f 0x82fd9eb7d355646 0xec12b023a502a0886ca8b2dc 0xfb273a89c7ffc054ce3d7193 0x2449ac8136639c40 0xbdaac789e9526173b733b259 0xa7d2a7f29f8a92d3932e161d 0x7cea4ff6fc7b801 0x6f2cd4d81c405fcd737185fa 0x77c0f2562efc332b7b249b88 0x2f6cf9683ec9bbcb 0x5563721cacbff356f2010c34 0xc2c690e65906b47160ab7523 0x7d6255d46e4c88b 0xb6f11522651fbf16066f0871 0x465ee9518b9aebce1c63eec1 0x5cebd9c238a376a 0xfb1be5f2aa191069e7ae099b 0x5e0c6f4720cbffef334ad027 0x2dfd121207ec8393 0xd39fb4436b5e87fb2d6acb0c 0xdac17d4d3db5487a815cf066 0x1777935807a94b22 0x5761511b8ec36c12e5854ece 0x43fdfeb6353e8442dd06320b 0x11c015cd51658c58 0xfb54aecbafc98739941a64e 0x720222943fc0e39e5e793dba 0x22648dc0c9eecfb3 0x56cab0cee20aa19b9100206d 0x63e5a2634360141c84514b8e 0x21815110aee95857 0x2b2d4d7a1e22290547e73787 0x568674108fe0514a8232cb94 0x1d0b9b0d22db3b6c 0xfd2130d0529b900ae0e3a4b9 0x2c1e3fa0eaa300ff2207062d 0x28419939906b2b9f 0x7e228e459da02b9c1803a506 0x46f16d0fa76dc6bab437faec 0x20b6ad10ac9a7301 0x247d38030eff53ae1b65fd03 0x45a1addf6cb0a8cd381f773f 0x16a06762b0e80ed1 0xb57565068251ef97b42cd469 0x730aa604cec7359ebc0a7ff 0x4ee673b5e925dad 0x23319338122cddbb4f88cdf1 0x69b14d0c42552a55b62737ec 0x109ff2ccb5d72b7 0x1b7d0606f8e5e7fd24143208 0x6d3992a8a4d46ca2d83386fc 0x2070bd31200acaec 0x8e766044e6b3b3b49771fcf 0xebefacc2c47cafefc1b2232c 0x122af2c8860cf50d 0x78cf4ec22b76875e4fc6b6ba 0x750d759432c8d34cdd841f92 0x1c6426c6e5a25f81 0x88db679103f772adceed6976 0x5d0aa7d3e1399daf676afcf9 0x2bac618a5e06bdb 0x85fae2c9e6e1d78e30a62187 0x6d6303281100554cc3d012ee 0x268c4cb864f09d89 0xbc64e7edac0c702a0463c87c 0xad7605ee243755fd50aa2198 0x1bfb73f48937159a 0xc4d07b603d33ae8e5b871e1 0x5345f605914134d1a6e3c61e 0x16c254c6b7f1cd6e 0xad2c151274de8bfc17905c15 0xd2f3033a27c777b49c538ae1 0x28459e1d1d0be721 0xe79d06ed1eef6dc5dae84ce2 0xab861dd564fd6ae03c31fab6 0x2f40e358d089117e 0x5b8cf11784bc90a37a0d9f18 0x3f1bc2eda9ba645c9ce7748c 0x20ed6b668a47437e 0x89be7471ad0472ba44330b85 0xef24934b50113d95d90d3b0f 0xb2950c56529d666 0x458d39a1ffaab88cc7c2b8b7 0x6c466bdc46efeb375928d462 0x1ccf24df1ec94b51 0xd15bc29ee364e2bd16a9f2c3 0xb3fbf12660a80416bda5de1b 0x2067a32a2b1e1989 0x24c6ee8f876293d05a0af836 0x7e3c006e86bd02e929f49308 0x2a61ea194f0bdd23 0x3ade1272c0585c5c0ca3ee69 0xc91cd86295c15f0fea2b3e70 0x1b9471893c73c684 0x2cb2fa1c98c5cbccce71d53e 0xc61ed18b3b780caaa8255c27 0xa4ba10c281217cd 0xd8536f9c54732d0e6bfa5edf 0x50da799d50596570ea5b7b2e 0xae55352eabf264f 0x62fa60b732ca6b05e83c719e 0xcbfa14d7fd4a47157b86c330 0x26d1fb8d9bc2dc72 0x87cf1274f70e8ef900baf05f 0xea54aa4a36d106baf076f794 0x6dbdd4d33a1bc6f 0x3c3456b4fd1e2de9dd5d3d54 0xece5a990b39cd1af65c74e14 0x21ce0b22e7366d54 0x8c715f638fc208ae7268303d 0x53fef6e9a22a3c0ea6ff25e4 0x8c008534e046b5 0x5f9c321080580a34317e15ed 0x454cd2e1c51b66ae94c7b06d 0x26a0a3ce5fa3c913 0x13d30c56cf88f0e998eb81f8 0xf112901cc2ff964f75d351b2 0x273c8582c17fcb24 0x90bfa645fb859a37373b8858 0xb7ee2b76955bd10ed8a90fc9 0x1bfa205a3b9dccd7 0xafb92c3c7e7c25b958ad0c7d 0x9bf4f59e8540bc5a9d71f997 0x4701b0c91e5c3df 0xf225e30f13e061f3088b0275 0xd6f050166393a9f91af6624f 0x14c7cbd57a924bf5 0x91 0xf820dbb9856c83e361b5c1bf 0xb2efeabfa31e0500107f12e1 0x23c20d5ad9ebc46c 0xbfa3da05f13f57c924f78acb 0x4c999615af9a0eb67c59f64 0x171debbceb549d41 0x667e1042fbaad88a770e9b39 0xb4f31836e9f4211c4aeaa198 0xfd9aa6568d6becb 0x8a581ea788996c19881f4f31 0xd1744d6930da4d8bc6a51632 0x29e060ceaf003e49 0x971b0b6369876efafa71960 0x1773489e1909b23aab8ee4e0 0x249192d51e06654d 0x8121192ba458a44cc854d541 0xfa477fb01a8131627992855e 0xf4a99fe7c50c245 0x93409c38bba26fb0e43e8964 0x9007e809a696c33eec4a992a 0x2d83e4ce42cdca57 0xfa5ee122773b45a2e62f0036 0xc9718ed06e9cab9b28cabea 0x202cca514b6ad3fa 0x84122493ab9dd538fd45937f 0x242a41ae375ac3dbfde64133 0xc588a9bad83f1ce 0x4c27c2680a262fc584f7c276 0xe8886c6e91d29d90cd081484 0xbd1dacb19ed2dba 0x7e59ba891adf3ea548736f03 0x43d7dc988cca8bac2f115162 0x13a18ceebf77e541 0x92796d576879f45036f02527 0xfccd39247b62f58154107afb 0x69e6ba8f2f3ef34 0x50f840b72432ee9d366836a8 0xde8bbc090c1e0f13c938e507 0x154562367ab4c3f8 0xe80552231493ba34822a2bc6 0xb6c7140cb2eb44b61a25a459 0x1ed5700cb4f0c6f3 0xfb92fdb0a35800ee9350479b 0xd60822e36cde1c7c7b20b226 0x1c4c01779d2c92a7 0x1687b4cdfb4359a6ec9920b 0xdbbf95d4f1e6a8609fd6ca65 0x1920b1a75b335e66 0x59f74b4ae5986109ae86f7c3 0x9ea53ec48b92a7258eadf1ab 0x259a2d5d640b4c9e 0xe12fe3f440fc1124837dc66 0xc4f9d79f1b6f4b42cf6189e5 0xf82feda1e98b585 0x9390037b7bf5b685001f4269 0x4c97cca165e1765314f142ed 0x2d01f4aa935bbd8e 0xd58011a1ab0177920597d970 0x7e8514877aa73868f2f3d4b2 0xf6139cb039c88ad 0x2b0a3132b4e91906795cb223 0x9c47e8b920e0ab97cd7d387a 0x85d4db0db7d95b4 0xd92d118d2c530ee32440f9e 0x3ad32b0b055d69f7e461caab 0x5b431c6768b2667 0x48994cc7096a6109fee868a3 0x33f419e95c122121eb2b8f9 0x2e1c7c68316bff66 0x2697cfcfb9c21acddd50d1cf 0x7ca9ce99565b5f979df698b1 0x4f24a14e90f050a 0xa43853278c6e9a8b597b65c5 0x13e41f33f290159926024092 0x260732890dbeab82 0xb546a1341be003ddb53e575d 0x3a482d08f3d1a466011afd40 0x2fc0f7d2942b389 0xabc7cf588481f950d2b5e354 0x2557ca278a210e3fad8a865b 0x5813e597e461019 0x80874b7b2ada9c00b820dbd 0xa6bed8aedd7a2667e27a29eb 0x2a4129a4328e0034 0x8d9091fea1a73cdd8c2f75 0x269dec229a762634f24fd316 0x16a4631ba8d51e59 0xb3cd6670a276a82864ff5963 0xd19927059d8862e94a9ea4c2 0x1564f9c83a73c501 0x36b993e65a7cb96a3317f190 0x9fa12abba943ab5eb2d9ed48 0x22570b0bb6a7c8ba 0x7229a8b164d5b8d08300afba 0xee1873ed9f51e060dbd6eb11 0x17ecbe1058bf46f2 0xfeb21034cbe7407d058073e6 0x9f92c12211a3b310d489aa8b 0x1407bc3c39d09521 0xfa5086ebefaba68c230d38a1 0x2f47b44857a74799f52a5431 0x257d7686e3e77f52 0x28dd61254d2e15ed1ab69cb3 0xd2c1935a5e420399c22b51e6 0x2dcadd0c7e37f22c 0xcc6db1d921d6e3aa1e5c3f4c 0xd8c8a64bb8ee52871c59555e 0x300d168d1046b326 0xb52852bba7ece27be3482ae3 0x9c9c72aeabee86f389081e3b 0x71599c4d8965008 0xaa83d46500e58e13ceab3040 0x35d022167dde7f2228ee8206 0x2694cdd20889b6f3 0x7b11132711eec3248d15f010 0x5b5564df75651a2f96821d42 0x1c50275df7c0937e 0xcbb2c5444da5096b34e490f1 0x10f4b6adcea95f0eda538ba3 0x2e584fc47115ba72 0x1cbfe84467d73fb6c738c66 0x61fb46b5f4478b41be670af2 0x17c57e50906c54df 0x1500004fe7a9c8ccae6f0250 0x35f0b7927c2d192f23c9ba3d 0xc6c800c4ef5831d 0xec794560e08cec278d9859f4 0xa37bd3bbd95f8fd2b1725660 0x22f0fea34d6ea60e 0xe9ca2798a6da195c57305932 0x9fd406869a8299246aae9204 0xdc27ff0d2ee2037 0xdcae717881d662df6c9a588f 0xef0a4cc68ec4bd7129c5e14c 0x115b5394a715be7c 0xead26ab3c0b9cd16b39397c3 0xde9f856611f44972e252713a 0x7917128ac7a68fc 0xd524ac1ed6e8729409055df1 0x6135c7fb5a4711b9bd6c26ba 0xd1b0ef7bf49c10c 0xef88c837356f8ba2f145c757 0xa5a6df24628951048245d020 0x7a084516fe54270 0x53e66addf4508b68d3d8a5c 0x691d62fa50442493349e404f 0x2151514e93ca4ba7 0xab549e76a008d0d7de33bc79 0x85ce80b186783ccec208b7ba 0x1d62c2bf65414ede 0x418bf640c9fff784d276353c 0xd0ee8d078f1b60164650bf0f 0x287ffb93107afa6 0x66f3a6e5325cba6a8f29033d 0xdde222155fb60c59c4f2f6e8 0x10e9e7cff06d3da6 0x84f1e5dff705ed2a70f62541 0x912a25d20bac2dfcf7767ec2 0x11e97db1b6b417ab 0xa56fbd44cdd266cd18ce5aa6 0x706e4defa0f1f07059a31f85 0xceb0668fa6d9c0f 0xe24f2c05b10b0fde1d85b823 0x8c456b4b190c05a74e7c6a59 0x3ba7e394e4c2670 0xd60d7b967e12f6954d2ed9c8 0x111db205f8ae5cc8098dd046 0xf4d965f68c14591 0xe18504c29db9f5292cb7032e 0x2f81de07865ea1eb0f5333c4 0x2a6048b4ae45e8cd 0x252500a0c0e1ca1bb71c8df1 0xf41f286bb7011d28bcd69f16 0x172ee718eab786b1 0x11de2039479a4fcc10f41547 0x2cde1434196f2a23557b8529 0x2d53110cabaa662 0x9e1edb2ddcd39127896eab68 0x2bbaf0d4e5b0e5d7465d23f9 0x2b0c56cdc1dc3211 0xc4ae5d3d107c235683255d8d 0xf581d37f1cfb0c50addcbd1 0x324eb30ec991a7 0x1ef2ae93dea6546d0ea0b8f3 0xf46553474681f676cd30bccf 0x17b9865744436f30 0x343a4dadb4f128fb82aac674 0x2a77bb1e506e07a56b0cc3d6 0x192eec85310d014a 0xf4727916b238b0fd62bc14b1 0xd8a7a7e76184ee4fe07efc56 0x1a19df3310244682 0xa8d9ec365f2c7b45006cf1a9 0xd340c2d4df9a1752959c6236 0x9845105686c7a18 0xa543d304dbe8d5301b8e5d26 0x6b29b620f809136309a4e272 0xb4360763460470c 0xb376df3fc882b9733d39f867 0xe6a8acc64687cbcb557d21f6 0x1aa658d0193668f3 0xc1d2e8090a8fa68c2ef22450 0xffff4184f29905cd5a3f63a9 0x20febe908c1c6eb5 0x2d734fd2766c597b292d19e3 0x7b7a7354534ebdc75b848684 0x177474be2601d787 0x9e1e8f63272b1b15dd2c89ac 0x8d8b2d1aaea6829d1e4d3fe6 0x166b2aabf0780e53 0xdbf4b6bfee45ce1148bb0a83 0xf19865aa260b7d049574c071 0xdc9c2442d2e901d 0x55240d496c11e3558d465fb3 0xfaa4bf2d9023627cef8c31a8 0x291c6f78ed552f48 0x9a08a1200d83235ea73e3dd6 0x551b607d38b82da14fc2a1d9 0x28315c9a8d94c45e 0xd98d63299d7c7445a4af992 0x364a55d7d94274c160db2542 0x15d76c2073092754 0x35ca49b639a9c59ee57ce197 0x19ad4bed3b7161478da5a1df 0x24686096115b31c5 0xa88dc6d23f8a837e5bb67a4a 0x8c25557878972bb73a836d5e 0xf8c49d4fe8e8b87 0x55557e4dd31cd8f22925d61f 0x2e8cf4e19f1ec18b1d25edb7 0x154ecf52741de06e 0xacd462999ae48c212af112d2 0xc648c2aa7404454a237a78a 0x104e14de0a22f546 0xf00b8f0fc868702c71b7471a 0x6733c08d213c79972f4a6727 0x37ac8ea8a97bbae 0xbba359b51949f6c51429af4a 0xfdbe6c507ea025a89dbe8e85 0x2f472a4acc1aded 0xc499eb665a3b8e04ab1d019b 0x6aefef77a528a46df6ecae80 0x29416a8d91e05c8b 0x77de0cc3541637a1632742a 0x2876f1d00190fa9043847b49 0x27692c031bb58220 0x911e63821dd771abfdb288e1 0x8a54b8260678a3371cd1d667 0x1608f7a63027e893 0x93300555577a3c095b1dd26f 0xd4082a941ca8120261a1ff13 0x4781bddd5a3f99b 0xc234b97d5638285927139a40 0x7efe21444bc818a0c0e3f9b3 0x1e7eb0d498fd294b 0x622d0e5fdeea6c85a65c3525 0x480a70bcb18c68a7726e3691 0x5bb99073c5c4f3d 0xfd35da7bb3276aecb9a8634 0xf11841487e1ceb1ff530b367 0x8b83aee6cb642f0 0x807089096af88079ecd9f67d 0xdd8650d322b138e3faa6b112 0x2c6ffb847cb778c 0xcaaca82a7d534d639b7dac2a 0xbffda6e9066ddbe68bc4d9e8 0x302c216336fb22d8 0x77efb4d00645a63f3153a9be 0x70aaf0e654a54183fd552ca6 0x12c2d5babaaad1d 0x554e9196c67773b979727f4f 0x31ded1eca1f319fba9db314c 0x97b21a3d4b20c77 0x3c47da156d58d5d56d540665 0xff0c914f841fbfae6e2af0b6 0xc4755a2f2502ca9 0x83388b6bf5906b4afe3e86a5 0x3f9054c1071a1ec1954e2141 0x26ba14a10d7ad837 0x2309e51a041ab62275edfab6 0xfeff6218fef8a4d6d21effc 0x9d1018b31bbdf3e 0x20844688f55d334ffb1ec437 0x1e7042484e477db4c862feec 0x1da290cf8c6a8251 0xe409686ce396c0fc9a743898 0x6aa2ac3a253c1147cd893795 0x27e68a119777a324 0xe9d050362b0fd38966808c2d 0x91beede8eed78f8f5f151fb4 0xc293aab3ba1d6be 0x6523d5ee620199d7f075d6b7 0x68c0313ee49558730e392186 0x1b78508c8740a8e5 0xf49d57c6744406905d923228 0xef9c40fe6fa587c1e9e60cee 0xe1700039b2da9b4 0xf7a1fd4e27afe53fca5a57a0 0x4224378c9c302202c9a0433a 0x129eac7bc0fcd757 0x55b20c85657e3009711d8e5 0x61eb40f872abf1f02d77b37e 0x1c37ba677685b871 0x89eb067e4e661cb54d3f9ae1 0xdec34983d924181eb54ea323 0xc31a6a8cefa91c1 0x97ba674b6239b1be7bf262ca 0x539c985ed7545c777a361417 0x1c887d676452b0e1 0x53b778ccc05c5a536995b813 0x132eb25f303e963a53ca9573 0x17c7f49a2fef461b 0xa0eddc85d5cedae477ba9c98 0x381db4b1ecd5bdb612467fcc 0x1aff17a0895020e4 0x529f09ca9d352c3d809fb26f 0xe44bc6dbd805afa53df5bf1 0xa2e809fdb19b15d 0xde61ffc6db42090655b1e489 0xf6f1cd3956ac160bd402fcae 0x21b014ed418c371d 0xdf8bdf63079209b81781839b 0x84c01ba6a58e4d5c49303dba 0x228a04aee3f6368 0xb7d44ec3ca29a24b6b69820e 0x49afddc139e62f86c9483c55 0x1719d2b2aaad143a 0xfdfc725a3e8caa91aabac5ab 0x78aa9c375670f0798320104c 0x1e11d440d7a9b8f8 0x2f3e245ea38a8dbee85d272e 0x5006e5c2cc5ca68e7a660fee 0xf51a3260c534a4e 0x80a72f8500ec6b5658e9300d 0x29bc268a593dd6c0d2aed05d 0x15964390b6764d0 0x82826448f711ba516ee401bf 0x59826eb6eb6405d4d38d6368 0xa4df9eb0704a335 0x66096e2f55c7828c1d0a06ce 0x37470583d45d9c59b64ed782 0x248cf1a3fb85ba63 0xbb68f4c950d989a16a4a14ba 0xfa139c134816a4965d92590d 0xf02665787f9e305 0xaff8df0a95f1f50a23a4573b 0xbe0e51dbb1157f4161bcc1f5 0x2693d61ac092e3be 0x6ad7983b8d605dd6e1018984 0xb115c7cea875d85597275568 0x3ee90abb980183c 0x8001af869cd14dfee5e6100f 0x4d98b5d0f41734c05d51e95f 0x1567b325cf9eb3a2 0x340f51b5a5f8629cf082d02c 0x8034656519ebd377b399d76 0x1a9acb3463e198b7 0xe01c3e7f3bb3b3a20825e19d 0x5bdcc5e57edb307a7d482154 0x2847ca99c3725f22 0x2e92c791faf01268772a499e 0x8b639b6515e5bf1ccd86f555 0xc3bc75c87226e01 0xa780611b2e841211e613907a 0x9d94bf127d4adaf511fe5d27 0x72cc46376fd255b 0x39a5f202f38edcffd3bf2cff 0x9911e63f6d40a84b633667ae 0x3c061ca7bd96278 0x22134732df14b11bed5dee27 0x89463f646d3997cbc2a9011 0x22ed4c26257dd194 0x60aadc0605e7f49d054c0179 0x430def48a50dcd9bda682790 0x1ba5940bf1cff49a 0xcc244a3a4eccdfd04a897be8 0xba94e3e11a122fe65aefb7e9 0xc541f3d632cfee8 0xfb9d0970edc067f3362f4371 0x4a4d6697e81c52db121a99dd 0xf0c07578996ccf 0x938d9d0d14e3b65b085da694 0xcce285b486a03c9cd20b18d6 0x24b4f063e50bfaf6 0x83a808fdac914f655e81c2e 0xd2133b326801da008ca6ceba 0xb2c089cefb5520e 0x784f9122b518a46d916de58c 0x4fbbb45333a354baa5e140af 0x2b2c6ec8ec1f49fc 0x9215c3829364f747ffdf5a3b 0xd12b22dbbf651f850e1e0438 0x64a7d83a95e4d4e 0xedd492d9cc0106818fba975a 0x4b84020ae18bfb93b481f242 0x16b00065602ff950 0xc7970e68a8b0491545dc1b82 0xb9e0334cfff17b87b4861b1 0x4a1d2fce02748f0 0xed5aa2b3cf973c45b4fb0bce 0x4ff39a6a2dc96cd176ca0861 0x12b9be9997b27ce8 0x86728957bfd9941f73a41976 0xfd02b455a06e95968f71693e 0xa647f29b7d18a1b 0x513ff75ae845ec9fb377b091 0x5145408e95a0c13d8ac91a57 0x273feb651aa2b439 0x2383f81ef55a3480bc110acb 0xde0ca0b533e74614da09b143 0x34326478c5d9e7a 0xf5abbb68767e7a5b13e42f09 0xe51865d32afb19ba93069ec7 0xcad0a892c4baeec 0x88a55fbaf7fa5b6a4a0b83fb 0x1beeb58faecfcbf153d2d17f 0xd365826eaefa95c 0x6bae68f1e5998215bac2e790 0x118cc5a7ff22893002d401 0x2c9edcd67aba0031 0xda5db968b2e246c5a6a3ba78 0x3061578aa3da51ed5eb6b4dc 0x2f8a70016e099752 0x632166ac43572e640846724f 0x5dd9ce1441478f2d3cf15834 0x26f82bf35706f05d 0x84a11661b702bdfebd635ac4 0xaf699222f674c91580d09a1e 0xe74476d1cad37ea 0x2ec3b555114b77c19970202e 0x189944678eb335b13e0ae638 0x2dec55cd2f7b34fe 0xd812cf51757e64a9d8abb1a0 0x22d75169141019f56a9bc595 0xffb2d6eecc53c83 0x310a155bfac3ac0b0eeba0b2393d0415934710824640a529afb2da0901e680 ================================================ FILE: src/contracts/autogenerated/noir_ultra_keccak_zk_honk_example/tests/test_contract.cairo ================================================ // Generated by Garaga version 1.1.0 //! # Starknet Verification Contract Tests //! //! This module contains comprehensive tests for the proof verification contract. //! The tests use Starknet Foundry's testing features to verify proofs. //! //! ## Test Strategy //! - Use real proof fixtures generated by the garaga CLI //! - Test both positive (valid proof) and negative (invalid proof) cases use noir_ultra_keccak_zk_honk_example::honk_verifier::{ IUltraKeccakZKHonkVerifierDispatcherTrait, IUltraKeccakZKHonkVerifierLibraryDispatcher, }; use snforge_std::fs::{FileTrait, read_txt}; use snforge_std::{DeclareResultTrait, declare}; use starknet::ClassHash; /// Declare the UltraKeccakZKHonkVerifier contract for testing. /// /// This function declares a new instance of the UltraKeccakZKHonkVerifier contract /// /// # Arguments /// * `name` - The contract name to declare /// /// # Returns /// * `ClassHash` - The class hash of the declared contract /// /// # Example /// ```cairo /// let class_hash = declare_contract("UltraKeccakZKHonkVerifier"); /// let dispatcher = IUltraKeccakZKHonkVerifierLibraryDispatcher { class_hash }; /// ``` fn declare_contract(name: ByteArray) -> ClassHash { let class_hash = *declare(name).unwrap().contract_class().class_hash; class_hash } /// Test the verification function verify_ultra_keccak_zk_honk_proof with a valid proof. /// /// This test demonstrates the complete verification flow: /// 1. Declare the verification contract /// 2. Load a pre-generated proof fixture /// 3. Verify the proof on-chain /// 4. Assert that verification succeeds /// /// ## Test Setup /// - Uses fork testing against Sepolia testnet to access required declared contracts maintained by /// the garaga team - Loads proof calldata from `tests/proof_calldata.txt` /// - To generate the calldata, you can use the garaga CLI: /// ```bash /// garaga calldata /// --system ultra_keccak_zk_honk /// --vk path/to/vk /// --proof path/to/proof /// --public-inputs path/to/public_inputs /// --format snforge /// --output-path path/to/tests /// ``` /// This will generate a file `proof_calldata.txt` in the specified output path. /// You can then use this file in the test. /// /// ## Expected Behavior /// - The proof should verify successfully /// - The function should return Ok(public_inputs) containing the expected public inputs /// - No panics or assertion failures should occur #[test] #[fork(url: "https://api.zan.top/public/starknet-sepolia/rpc/v0_10", block_tag: latest)] fn test_verify_ultra_keccak_zk_honk_proof() { // Step 1: Declare the verification contract let class_hash = declare_contract("UltraKeccakZKHonkVerifier"); let dispatcher = IUltraKeccakZKHonkVerifierLibraryDispatcher { class_hash }; // Step 2: Load the proof fixture generated by the script // This file contains the ultra_keccak_zk_honk proof calldata formatted for Starknet let file = FileTrait::new("tests/proof_calldata.txt"); let calldata = read_txt(@file).span(); // Step 3: Verify the proof on-chain // This calls the contract's verify_ultra_keccak_zk_honk_proof function with the loaded proof // data let result = dispatcher.verify_ultra_keccak_zk_honk_proof(calldata); // Step 4: Assert that verification succeeded // A valid proof should return Ok(public_inputs), not Err assert(result.is_ok(), 'Proof verification failed'); // Optional: You can also verify the public inputs contain expected values // let public_inputs = result.unwrap(); // assert(public_inputs.len() > 0, 'No public inputs'); // Additional assertions on the public input values can be added here } ================================================ FILE: src/contracts/autogenerated/risc0_verifier_bn254/.tool-versions ================================================ scarb 2.16.1 starknet-foundry 0.57.0 ================================================ FILE: src/contracts/autogenerated/risc0_verifier_bn254/Scarb.toml ================================================ # Generated by Garaga version 1.1.0 [package] name = "risc0_verifier_bn254" version = "0.1.0" edition = "2024_07" [dependencies] garaga = { path = "../../../" } starknet = "2.16.1" [cairo] sierra-replace-ids = false inlining-strategy = 2 [dev-dependencies] snforge_std = "0.57.0" assert_macros = "2.16.1" [[target.starknet-contract]] casm = true casm-add-pythonic-hints = true ================================================ FILE: src/contracts/autogenerated/risc0_verifier_bn254/src/groth16_verifier.cairo ================================================ // Generated by Garaga version 1.1.0 use super::groth16_verifier_constants::{N_FREE_PUBLIC_INPUTS, T, ic, precomputed_lines, vk}; #[starknet::interface] pub trait IRisc0Groth16VerifierBN254 { fn verify_r0_groth16_proof_bn254( self: @TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; } #[starknet::contract] mod Risc0Groth16VerifierBN254 { use garaga::apps::risc0::{ compute_receipt_claim, deserialize_full_proof_with_hints_risc0, journal_sha256, }; use garaga::definitions::{G1G2Pair, G1Point}; use garaga::ec_ops::{G1PointTrait, ec_safe_add}; use garaga::groth16::{ Groth16ProofRawTrait, multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result, }; use starknet::SyscallResultTrait; use super::{N_FREE_PUBLIC_INPUTS, T, ic, precomputed_lines, vk}; const ECIP_OPS_CLASS_HASH: felt252 = 0x396d5915ecf475aab117bb25a0272b261e9e25ffe1c0ce05a51a3f77489c89e; #[storage] struct Storage {} #[abi(embed_v0)] impl IRisc0Groth16VerifierBN254 of super::IRisc0Groth16VerifierBN254 { fn verify_r0_groth16_proof_bn254( self: @ContractState, full_proof_with_hints: Span, ) -> Result, felt252> { // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok(public_inputs) if the proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given // a proof and a verifying key. let fph = deserialize_full_proof_with_hints_risc0(full_proof_with_hints); let groth16_proof = fph.groth16_proof; let image_id = fph.image_id; let journal = fph.journal; let mpcheck_hint = fph.mpcheck_hint; let msm_hint = fph.msm_hint; groth16_proof.check_proof_points(0); let ic = ic.span(); let journal_digest = journal_sha256(journal); let claim_digest = compute_receipt_claim(image_id, journal_digest); // Start serialization with the hint array directly to avoid copying it. let mut msm_calldata: Array = array![]; // Add the points from VK relative to the non-constant public inputs. Serde::serialize(@ic.slice(3, N_FREE_PUBLIC_INPUTS), ref msm_calldata); // Add the claim digest as u256 scalars for the msm. msm_calldata.append(2); msm_calldata.append(claim_digest.low.into()); msm_calldata.append(0); msm_calldata.append(claim_digest.high.into()); msm_calldata.append(0); // Complete with the curve indentifier (0 for BN254): msm_calldata.append(0); // Add the hint array. for x in msm_hint { msm_calldata.append(*x); } // Call the multi scalar multiplication endpoint on the Garaga ECIP ops contract // to obtain claim0 * IC[3] + claim1 * IC[4]. let mut _msm_result_serialized = starknet::syscalls::library_call_syscall( ECIP_OPS_CLASS_HASH.try_into().unwrap(), selector!("msm_g1"), msm_calldata.span(), ) .unwrap_syscall(); // Finalize vk_x computation by adding the precomputed T point. let vk_x = ec_safe_add( T, Serde::::deserialize(ref _msm_result_serialized).unwrap(), 0, ); // Perform the pairing check. let check = multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result( G1G2Pair { p: vk_x, q: vk.gamma_g2 }, G1G2Pair { p: groth16_proof.c, q: vk.delta_g2 }, G1G2Pair { p: groth16_proof.a.negate(0), q: groth16_proof.b }, vk.alpha_beta_miller_loop_result, precomputed_lines.span(), mpcheck_hint, ); match check { Result::Ok(_) => Result::Ok(journal), Result::Err(error) => Result::Err(error), } } } } ================================================ FILE: src/contracts/autogenerated/risc0_verifier_bn254/src/groth16_verifier_constants.cairo ================================================ // Generated by Garaga version 1.1.0 use garaga::definitions::{E12D, G1Point, G2Line, G2Point, u288, u384}; use garaga::groth16::Groth16VerifyingKey; pub const N_FREE_PUBLIC_INPUTS: usize = 2; // RISC0 version tag : v2.2.2 // CONTROL ROOT USED : 0xce52bf56033842021af3cf6db8a50d1b7535c125a34f1a22c6fdcf002c5a1529 // CONTROL_ROOT_0 : 0x1b0da5b86dcff31a0242380356bf52ce // CONTROL_ROOT_1 : 0x29155a2c00cffdc6221a4fa325c13575 // BN254 CONTROL ID USED : 0x4446e66d300eb7fb45c9726bb53c793dda407a62e9601618bb43c5c14657ac0 pub const T: G1Point = G1Point { x: u384 { limb0: 0x2612e4e2e1c0b9d602b7aa52, limb1: 0x4d5d3394a95b09366b3abb5e, limb2: 0x1f550d0d6161a44a, limb3: 0x0, }, y: u384 { limb0: 0x34475b4928c630e3330db9cb, limb1: 0x1d6305d30e66d5a8ce067302, limb2: 0x12a023f9110563f6, limb3: 0x0, }, }; // IC[0] + IC[1] * CONTROL_ROOT_0 + IC[2] * CONTROL_ROOT_1 + IC[5] * BN254_CONTROL_ID pub const vk: Groth16VerifyingKey = Groth16VerifyingKey { alpha_beta_miller_loop_result: E12D { w0: u288 { limb0: 0x38febe9f87f730fa3e5bd174, limb1: 0xf763950637a776ef9e248435, limb2: 0x29dc2d37c63acbda, }, w1: u288 { limb0: 0xa31610a97aa4e4539be919ff, limb1: 0xfa4d4bfb72b6a3c002018e97, limb2: 0x1968ab971e610fce, }, w2: u288 { limb0: 0xee6c1ce3a15313c6f9d57f7e, limb1: 0xd37e28396640fcfe5f122aae, limb2: 0x210d3763f7a27517, }, w3: u288 { limb0: 0x7746ddac185562e756b1b92f, limb1: 0x44f8b75638ef5a373f319cd8, limb2: 0x51e9605db4edac6, }, w4: u288 { limb0: 0xc29e0c2ac434301d671ffa56, limb1: 0xa06f1db2d4ca4dd88f979102, limb2: 0x1d0126fb7d721e02, }, w5: u288 { limb0: 0xed2e022e10acbeb35084dc1, limb1: 0xf9de514baee870f114669060, limb2: 0x10889a0f300ce96c, }, w6: u288 { limb0: 0xeec23aadde92d2dd00e4568e, limb1: 0x6d5b4b63667db8f10bd851ab, limb2: 0x18f1dd15d2e64c69, }, w7: u288 { limb0: 0x2131bad24ea07a033d0bf397, limb1: 0xb6312a7f2622146be93b5950, limb2: 0x227e61ca055f0ac3, }, w8: u288 { limb0: 0xb896f30b06350f012274ebcd, limb1: 0xd14298f13a76183170aafe08, limb2: 0x302bfd90358d23a0, }, w9: u288 { limb0: 0x679d91263798da428fa5ea62, limb1: 0x806797d163f4df8b55ec774c, limb2: 0x29b72d4ec063face, }, w10: u288 { limb0: 0x4dbef45fe0c5a14bef7c4a90, limb1: 0xd4ae215c443d0f0768198bc6, limb2: 0x2fcc02633e427272, }, w11: u288 { limb0: 0x7308cad65773475443cfbd80, limb1: 0x972f90a77f1a8aeece6571ff, limb2: 0x2d3a570362a9fd7f, }, }, gamma_g2: G2Point { x0: u384 { limb0: 0xf75edadd46debd5cd992f6ed, limb1: 0x426a00665e5c4479674322d4, limb2: 0x1800deef121f1e76, limb3: 0x0, }, x1: u384 { limb0: 0x35a9e71297e485b7aef312c2, limb1: 0x7260bfb731fb5d25f1aa4933, limb2: 0x198e9393920d483a, limb3: 0x0, }, y0: u384 { limb0: 0xc43d37b4ce6cc0166fa7daa, limb1: 0x4aab71808dcb408fe3d1e769, limb2: 0x12c85ea5db8c6deb, limb3: 0x0, }, y1: u384 { limb0: 0x70b38ef355acdadcd122975b, limb1: 0xec9e99ad690c3395bc4b3133, limb2: 0x90689d0585ff075, limb3: 0x0, }, }, delta_g2: G2Point { x0: u384 { limb0: 0x69cfaa4e60401fea7f3e0333, limb1: 0xd922dba0547057ccaae94b9d, limb2: 0x1aa085ff28179a12, limb3: 0x0, }, x1: u384 { limb0: 0x2ccf0b4c91f42bb629f83a1c, limb1: 0x9bee94f1f5ef907157bda481, limb2: 0x3b03cd5effa95ac, limb3: 0x0, }, y0: u384 { limb0: 0x9e2fea1c7142df187d3fc6d3, limb1: 0x37e867178318832d0b2d74d5, limb2: 0x1e60f31fcbf757e8, limb3: 0x0, }, y1: u384 { limb0: 0xfb7228ca5c91d2940d030762, limb1: 0xf6490846d518c9aea868366e, limb2: 0x110c10134f200b19, limb3: 0x0, }, }, }; pub const ic: [G1Point; 6] = [ G1Point { x: u384 { limb0: 0x4d553505739d0f5d65dc3be4, limb1: 0x32a9061a082c15dd1d61aa9c, limb2: 0x12ac9a25dcd5e1a8, limb3: 0x0, }, y: u384 { limb0: 0xd30f3eee2b23c60ee980acd4, limb1: 0xd91731911c898569106ff5a2, limb2: 0x25aa744581ebe7a, limb3: 0x0, }, }, G1Point { x: u384 { limb0: 0x4ccc3c8769d883f688a1423f, limb1: 0xf292fae2036e057be5429411, limb2: 0x707b920bc978c02, limb3: 0x0, }, y: u384 { limb0: 0xc203383782a4650787ff6642, limb1: 0xf7bc357bf63481acd2d55555, limb2: 0x2e32a094b7589554, limb3: 0x0, }, }, G1Point { x: u384 { limb0: 0x48e336f4fd974644850fc347, limb1: 0x3e249751853f961511011c71, limb2: 0xbca36e2cbe6394b, limb3: 0x0, }, y: u384 { limb0: 0x6db8f7f409c153b1fcdf9b8b, limb1: 0x3729fa3d68714e2a8435d4fa, limb2: 0x2ede7c9acf48cf3a, limb3: 0x0, }, }, G1Point { x: u384 { limb0: 0xe2c6b6fb5a25f9112e04f2a7, limb1: 0x7c091cc2aaf201e488cbacc3, limb2: 0x1b8af999dbfbb392, limb3: 0x0, }, y: u384 { limb0: 0x1a60157f3e9cf04f679cccd6, limb1: 0x5722949f192a81c850d586d8, limb2: 0x2b91a26aa92e1b6f, limb3: 0x0, }, }, G1Point { x: u384 { limb0: 0x1dcefeddd06eda5a076ccd0d, limb1: 0x8ac1750bdfd5a7615f002d4a, limb2: 0x2b5f494ed674235b, limb3: 0x0, }, y: u384 { limb0: 0x8f14f912c5e71665b2ad5e82, limb1: 0xcbba817fcbb9a863b8a76ff8, limb2: 0x2fe520ad2020aab9, limb3: 0x0, }, }, G1Point { x: u384 { limb0: 0x2fce3c25d5940320b1c4d493, limb1: 0x3666843cde4e82e869ba525, limb2: 0xf1c3c0d5d9da0fa, limb3: 0x0, }, y: u384 { limb0: 0x3608f68287aa01bd0b69e809, limb1: 0xfe8c0d07b307482d8bc8bb2f, limb2: 0x214bfcff74f425f6, limb3: 0x0, }, }, ]; pub const precomputed_lines: [G2Line; 176] = [ G2Line { r0a0: u288 { limb0: 0x4d347301094edcbfa224d3d5, limb1: 0x98005e68cacde68a193b54e6, limb2: 0x237db2935c4432bc, }, r0a1: u288 { limb0: 0x6b4ba735fba44e801d415637, limb1: 0x707c3ec1809ae9bafafa05dd, limb2: 0x124077e14a7d826a, }, r1a0: u288 { limb0: 0x49a8dc1dd6e067932b6a7e0d, limb1: 0x7676d0000961488f8fbce033, limb2: 0x3b7178c857630da, }, r1a1: u288 { limb0: 0x98c81278efe1e96b86397652, limb1: 0xe3520b9dfa601ead6f0bf9cd, limb2: 0x2b17c2b12c26fdd0, }, }, G2Line { r0a0: u288 { limb0: 0xc1a48e9e12ff1dbf61883912, limb1: 0xaee1724a5332ee74b8ed9451, limb2: 0xfbb1e993e3695f0, }, r0a1: u288 { limb0: 0x7acaee831d920baf2a1bfde0, limb1: 0x4cf9ef8c77ec7a0195bee19d, limb2: 0x25757a99d16aa21c, }, r1a0: u288 { limb0: 0xe5847602f3a9790bf049b947, limb1: 0x934e2813cdc5d033f879cf93, limb2: 0x21249e515f664d4c, }, r1a1: u288 { limb0: 0xf19496daaae3309c391d0383, limb1: 0x408eeae0c5d549305a377fd8, limb2: 0x21282298fede4ac4, }, }, G2Line { r0a0: u288 { limb0: 0x1b3d578c32d1af5736582972, limb1: 0x204fe74db6b371d37e4615ab, limb2: 0xce69bdf84ed6d6d, }, r0a1: u288 { limb0: 0xfd262357407c3d96bb3ba710, limb1: 0x47d406f500e66ea29c8764b3, limb2: 0x1e23d69196b41dbf, }, r1a0: u288 { limb0: 0x1ec8ee6f65402483ad127f3a, limb1: 0x41d975b678200fce07c48a5e, limb2: 0x2cad36e65bbb6f4f, }, r1a1: u288 { limb0: 0xcfa9b8144c3ea2ab524386f5, limb1: 0xd4fe3a18872139b0287570c3, limb2: 0x54c8bc1b50aa258, }, }, G2Line { r0a0: u288 { limb0: 0xb5ee22ba52a7ed0c533b7173, limb1: 0xbfa13123614ecf9c4853249b, limb2: 0x6567a7f6972b7bb, }, r0a1: u288 { limb0: 0xcf422f26ac76a450359f819e, limb1: 0xc42d7517ae6f59453eaf32c7, limb2: 0x899cb1e339f7582, }, r1a0: u288 { limb0: 0x9f287f4842d688d7afd9cd67, limb1: 0x30af75417670de33dfa95eda, limb2: 0x1121d4ca1c2cab36, }, r1a1: u288 { limb0: 0x7c4c55c27110f2c9a228f7d8, limb1: 0x8f14f6c3a2e2c9d74b347bfe, limb2: 0x83ef274ba7913a5, }, }, G2Line { r0a0: u288 { limb0: 0xa6cd3bef29216e5776f4c435, limb1: 0x96ed36c2e4e69e8de93d63f, limb2: 0x20a92fd9a2fb0a39, }, r0a1: u288 { limb0: 0xeda6dc0a1e8e8067ae60ff67, limb1: 0x6b56562a0994de5c01c288f3, limb2: 0xaeed3d90fc6fe0d, }, r1a0: u288 { limb0: 0x82ed548a4877130ae8334400, limb1: 0x25021da2b3bb88299f079afd, limb2: 0xf3fb02181cb52dd, }, r1a1: u288 { limb0: 0x76dd33b2913d5b7a9f5ff9c4, limb1: 0x77c15ad5bbac0f2d3d49eab8, limb2: 0xf3c2bd9e2535565, }, }, G2Line { r0a0: u288 { limb0: 0xf9c98b4467592a57fca1c44f, limb1: 0x22c8464befc62af74bd7e13e, limb2: 0xf6fe51a099cedd, }, r0a1: u288 { limb0: 0x424a207247f0e4c27f38a1ae, limb1: 0xc0d1158c6df8f6ffa8d6a76e, limb2: 0xe16f63bee6733e5, }, r1a0: u288 { limb0: 0x747d2a41af96d81fb2585f8f, limb1: 0x1bedd2f049ce086610aca319, limb2: 0x18e887f968ab29d1, }, r1a1: u288 { limb0: 0x6f6eae477c15633e163e3366, limb1: 0x3d0cca9a15ddc9f899d906bf, limb2: 0x1a5066113f22d767, }, }, G2Line { r0a0: u288 { limb0: 0xfc23a674d089e9cfdefb1db8, limb1: 0x9ddfd61d289b65a9b4254476, limb2: 0x1e2f561324ef4447, }, r0a1: u288 { limb0: 0xf67a6a9e31f6975b220642ea, limb1: 0xccd852893796296e4d1ed330, limb2: 0x94ff1987d19b62, }, r1a0: u288 { limb0: 0x360c2a5aca59996d24cc1947, limb1: 0x66c2d7d0d176a3bc53f386e8, limb2: 0x2cfcc62a17fbeecb, }, r1a1: u288 { limb0: 0x2ddc73389dd9a9e34168d8a9, limb1: 0xae9afc57944748b835cbda0f, limb2: 0x12f0a1f8cf564067, }, }, G2Line { r0a0: u288 { limb0: 0x963c90609635263045a730, limb1: 0x25987316828b8c528c8dc05b, limb2: 0x1a52af70953e2d93, }, r0a1: u288 { limb0: 0x5cb801def7d800e0a2dcdc65, limb1: 0x7f06086a5846b035d7144e65, limb2: 0x264229f1b248db7a, }, r1a0: u288 { limb0: 0x1c8fe795c6a55dfe7abf119e, limb1: 0x98b10fc53fdbfce11d7827a0, limb2: 0x13551fa74e7af913, }, r1a1: u288 { limb0: 0xdde6f69885b07fe44d932a52, limb1: 0x9819b585503c5540fa115b13, limb2: 0x1f4507e84f016add, }, }, G2Line { r0a0: u288 { limb0: 0x9c963c4bdade6ce3d460b077, limb1: 0x1738311feefc76f565e34e8a, limb2: 0x1aae0d6c9e9888ad, }, r0a1: u288 { limb0: 0x9272581fdf80b045c9c3f0a, limb1: 0x3946807b0756e87666798edb, limb2: 0x2bf6eeda2d8be192, }, r1a0: u288 { limb0: 0x3e957661b35995552fb475de, limb1: 0xd8076fa48f93f09d8128a2a8, limb2: 0xb6f87c3f00a6fcf, }, r1a1: u288 { limb0: 0xcf17d6cd2101301246a8f264, limb1: 0x514d04ad989b91e697aa5a0e, limb2: 0x175f17bbd0ad1219, }, }, G2Line { r0a0: u288 { limb0: 0x894bc18cc70ca1987e3b8f9f, limb1: 0xd4bfa535181f0f8659b063e3, limb2: 0x19168d524164f463, }, r0a1: u288 { limb0: 0x850ee8d0e9b58b82719a6e92, limb1: 0x9fc4eb75cbb027c137d48341, limb2: 0x2b2f8a383d944fa0, }, r1a0: u288 { limb0: 0x5451c8974a709483c2b07fbd, limb1: 0xd7e09837b8a2a3b78e7fe525, limb2: 0x347d96be5e7fa31, }, r1a1: u288 { limb0: 0x823f2ba2743ee254e4c18a1e, limb1: 0x6a61af5db035c443ed0f8172, limb2: 0x1e840eee275d1063, }, }, G2Line { r0a0: u288 { limb0: 0x9cdb3f1da9cc795a6dd71925, limb1: 0xa6b72d99ea73e7ec479df7de, limb2: 0x2a0d16e5af0f972a, }, r0a1: u288 { limb0: 0x185981f7439b3abe06b2f010, limb1: 0x4afb801363c27041866471a0, limb2: 0x21a33b58bc0ebc30, }, r1a0: u288 { limb0: 0xd9c7c736ca2b67b6189ccfb9, limb1: 0x8dd913714e0c8c9468564883, limb2: 0x25e9300604680744, }, r1a1: u288 { limb0: 0xd2f83c58abf29fed21f8ac20, limb1: 0xf99df3b0aafc57db31256a85, limb2: 0x2ecdc1f4735da2e6, }, }, G2Line { r0a0: u288 { limb0: 0x3890eaf1d657d63d18eac82d, limb1: 0x962ede9002cf9e7fead8ac71, limb2: 0xa41c746d7a471e2, }, r0a1: u288 { limb0: 0xdd8017fb853f2df76c7dad20, limb1: 0x8ee50f79d3a8abfd3ccd4c1a, limb2: 0x7f77df5036f64d2, }, r1a0: u288 { limb0: 0x251f40aedb747d8748c907aa, limb1: 0xaff11c216293b73b2d2a53aa, limb2: 0x2f94413282c71d76, }, r1a1: u288 { limb0: 0x255cffb680c8482747fe7934, limb1: 0xc9b47382882ce9a2171f615c, limb2: 0x1e12dbcbfacba1a9, }, }, G2Line { r0a0: u288 { limb0: 0x18d630598e58bb5d0102b30e, limb1: 0x9767e27b02a8da37411a2787, limb2: 0x100a541662b9cd7c, }, r0a1: u288 { limb0: 0x4ca7313df2e168e7e5ea70, limb1: 0xd49cce6abd50b574f31c2d72, limb2: 0x78a2afbf72317e7, }, r1a0: u288 { limb0: 0x6d99388b0a1a67d6b48d87e0, limb1: 0x1d8711d321a193be3333bc68, limb2: 0x27e76de53a010ce1, }, r1a1: u288 { limb0: 0x77341bf4e1605e982fa50abd, limb1: 0xc5cf10db170b4feaaf5f8f1b, limb2: 0x762adef02274807, }, }, G2Line { r0a0: u288 { limb0: 0x7645fffb343e10e1e8748cb8, limb1: 0xb7ee813d501408d841ec8e65, limb2: 0xe90c74a2dd6516e, }, r0a1: u288 { limb0: 0x1491337b6e2af58a979eff05, limb1: 0x41a56da5e78ec6d2aedcfb3c, limb2: 0x234444f637b1fd1a, }, r1a0: u288 { limb0: 0x7f6df98a0ef48fea6a90a86d, limb1: 0x67fe1fde059c8fcc5f4d2e06, limb2: 0x2ba05dbf310dbde7, }, r1a1: u288 { limb0: 0xa0c862d762e402c3454d02b2, limb1: 0x1b96d5c6695fe143c37a671e, limb2: 0x24af700c84c87b54, }, }, G2Line { r0a0: u288 { limb0: 0xa137b991ba9048aee9fa0bc7, limb1: 0xf5433785c186cd1100ab6b80, limb2: 0xab519fd7cf8e7f9, }, r0a1: u288 { limb0: 0x90832f45d3398c60aa1a74e2, limb1: 0x17f7ac209532723f22a344b, limb2: 0x23db979f8481c5f, }, r1a0: u288 { limb0: 0x723b0e23c2808a5d1ea6b11d, limb1: 0x3030030d26411f84235c3af5, limb2: 0x122e78da5509eddb, }, r1a1: u288 { limb0: 0xf1718c1e21a9bc3ec822f319, limb1: 0xf5ee6dfa3bd3272b2f09f0c7, limb2: 0x5a29c1e27616b34, }, }, G2Line { r0a0: u288 { limb0: 0x1af83b0d07aaec86d9134a28, limb1: 0x77bdb3e9aa87662797059a9c, limb2: 0x273c84364e3713d2, }, r0a1: u288 { limb0: 0xcaf5ba9785faf45cfc296a4a, limb1: 0x3163afd1009dbadd9c5a70bd, limb2: 0x1aaea45eb51c82ce, }, r1a0: u288 { limb0: 0x5aba52ae705ce1af25e673aa, limb1: 0x2dc8896c9ff279f6655024ef, limb2: 0x300f0500b7b0b0d3, }, r1a1: u288 { limb0: 0x67f1e1afa662ba8900d60c26, limb1: 0xf93114d70a2a3321729a7d2c, limb2: 0x1cc57b64b47a626d, }, }, G2Line { r0a0: u288 { limb0: 0xbc1ede480873fceb8739511e, limb1: 0xd5a60533bd0ce7869efbc15, limb2: 0x182c17d793eba74d, }, r0a1: u288 { limb0: 0x83bf38d91876ad8999516bc2, limb1: 0x7756322ea3dc079289d51f2d, limb2: 0x1d0f6156a89a4244, }, r1a0: u288 { limb0: 0x6aba652f197be8f99707b88c, limb1: 0xbf94286c245794ea0f562f32, limb2: 0x25a358967a2ca81d, }, r1a1: u288 { limb0: 0xc028cbff48c01433e8b23568, limb1: 0xd2e791f5772ed43b056beba1, limb2: 0x83eb38dff4960e, }, }, G2Line { r0a0: u288 { limb0: 0x5fa7b4cb5791e57c2cf9780e, limb1: 0xf5062eb2c532788091de2118, limb2: 0xc38262afe4f4eac, }, r0a1: u288 { limb0: 0x6560785dd69d5a9a4917aa3b, limb1: 0x6240334397d0134760854bb1, limb2: 0x2d7c0dd3e38d8926, }, r1a0: u288 { limb0: 0xf3c91f209577810e63cbdf2f, limb1: 0xa8acef680c1be04d12d702c8, limb2: 0xa312088d3b32c07, }, r1a1: u288 { limb0: 0x96aa4853754a05becdc1bf51, limb1: 0xa6cc53c2c1b1d383517e44b4, limb2: 0x1f03c17658e08a24, }, }, G2Line { r0a0: u288 { limb0: 0xc2a2b787d8e718e81970db80, limb1: 0x5372abeaf56844dee60d6198, limb2: 0x131210153a2217d6, }, r0a1: u288 { limb0: 0x70421980313e09a8a0e5a82d, limb1: 0xf75ca1f68f4b8deafb1d3b48, limb2: 0x102113c9b6feb035, }, r1a0: u288 { limb0: 0x4654c11d73bda84873de9b86, limb1: 0xa67601bca2e595339833191a, limb2: 0x1c2b76e439adc8cc, }, r1a1: u288 { limb0: 0x9c53a48cc66c1f4d644105f2, limb1: 0xa17a18867557d96fb7c2f849, limb2: 0x1deb99799bd8b63a, }, }, G2Line { r0a0: u288 { limb0: 0xc32026c56341297fa080790c, limb1: 0xe23ad2ff283399133533b31f, limb2: 0xa6860f5c968f7ad, }, r0a1: u288 { limb0: 0x2966cf259dc612c6a4d8957d, limb1: 0xfba87ea86054f3db5774a08f, limb2: 0xc73408b6a646780, }, r1a0: u288 { limb0: 0x6272ce5976d8eeba08f66b48, limb1: 0x7dfbd78fa06509604c0cec8d, limb2: 0x181ec0eaa6660e45, }, r1a1: u288 { limb0: 0x48af37c1a2343555fbf8a357, limb1: 0xa7b5e1e20e64d6a9a9ce8e61, limb2: 0x1147dcea39a47abd, }, }, G2Line { r0a0: u288 { limb0: 0x489a41fc4c066a737acf2b80, limb1: 0x51199b4ef477e0976b9b663d, limb2: 0x104f756144a01a99, }, r0a1: u288 { limb0: 0xce50cee9668a849dfec24567, limb1: 0x932eabf096a077bd22814967, limb2: 0x16210f0edb8ae837, }, r1a0: u288 { limb0: 0xb1ea43eab76757bea3ee7e67, limb1: 0x859be02d0e28899de38a8bbb, limb2: 0x69978ccc2f4f110, }, r1a1: u288 { limb0: 0xdfe4fd2c66e7f65bd840d459, limb1: 0xf950d096dbee0e978b146cce, limb2: 0x2960c5fa3fb2a10, }, }, G2Line { r0a0: u288 { limb0: 0xb58f6d75132f93ba48631e07, limb1: 0xe8ae893990c83c6e393d1303, limb2: 0x88809ba75ebe6c8, }, r0a1: u288 { limb0: 0xc3a2f92df3e3ae5fe1783de6, limb1: 0x2778c4ec8a8c11311a178bd, limb2: 0x24f1ee4b51cbf5fd, }, r1a0: u288 { limb0: 0xfbef4674342d73fb2363ab57, limb1: 0x840f6f7c0db4f93e82f3523, limb2: 0x1101e37593b6ed96, }, r1a1: u288 { limb0: 0xd263a20f18fd8a530227c627, limb1: 0x7bf28bc9f5fc2d0b2585cac4, limb2: 0x2e273774ae1e6e0c, }, }, G2Line { r0a0: u288 { limb0: 0x4033c51e6e469818521cd2ae, limb1: 0xb71a4629a4696b2759f8e19e, limb2: 0x4f5744e29c1eb30, }, r0a1: u288 { limb0: 0xa4f47bbc60cb0649dca1c772, limb1: 0x835f427106f4a6b897c6cf23, limb2: 0x17ca6ea4855756bb, }, r1a0: u288 { limb0: 0x7f844a35c7eeadf511e67e57, limb1: 0x8bb54fb0b3688cac8860f10, limb2: 0x1c7258499a6bbebf, }, r1a1: u288 { limb0: 0x10d269c1779f96946e518246, limb1: 0xce6fcef6676d0dacd395dc1a, limb2: 0x2cf4c6ae1b55d87d, }, }, G2Line { r0a0: u288 { limb0: 0x59726c9960acdae933f6c2e, limb1: 0xcb27824cfdc7f2a2953a7b46, limb2: 0xab09e310409c7dc, }, r0a1: u288 { limb0: 0xda7641d0a2b62e75f06e7a4b, limb1: 0xbdae979156600097567aeb5b, limb2: 0x2811e7f67e12b969, }, r1a0: u288 { limb0: 0x57d4f4acd0d896441365692d, limb1: 0x26d8fccbf118b66792fd5f15, limb2: 0x552fe6247735d8b, }, r1a1: u288 { limb0: 0x94b8e030cbd114193e677c50, limb1: 0x372b06a0c3c60fb7d11b850e, limb2: 0x16f002c5d6018b19, }, }, G2Line { r0a0: u288 { limb0: 0xab74a6bae36b17b1d2cc1081, limb1: 0x904cf03d9d30b1fe9dc71374, limb2: 0x14ffdd55685b7d82, }, r0a1: u288 { limb0: 0x277f7180b7cf33feded1583c, limb1: 0xc029c3968a75b612303c4298, limb2: 0x20ef4ba03605cdc6, }, r1a0: u288 { limb0: 0xd5a7a27c1baba3791ab18957, limb1: 0x973730213d5d70d3e62d6db, limb2: 0x24ca121c566eb857, }, r1a1: u288 { limb0: 0x9f4c2dea0492f548ae7d9e93, limb1: 0xe584b6b251a5227c70c5188, limb2: 0x22bcecac2bd5e51b, }, }, G2Line { r0a0: u288 { limb0: 0x340c82974f7221a53fc2f3ac, limb1: 0x7146f18cd591d423874996e7, limb2: 0xa6d154791056f46, }, r0a1: u288 { limb0: 0x70894ea6418890d53b5ee12a, limb1: 0x882290cb53b795b0e7c8c208, limb2: 0x1b5777dc18b2899b, }, r1a0: u288 { limb0: 0x99a0e528d582006a626206b6, limb1: 0xb1cf825d80e199c5c9c795b5, limb2: 0x2a97495b032f0542, }, r1a1: u288 { limb0: 0xc7cf5b455d6f3ba73debeba5, limb1: 0xbb0a01235687223b7b71d0e5, limb2: 0x250024ac44c35e3f, }, }, G2Line { r0a0: u288 { limb0: 0x265d8d504786c9a9d2c2dd1d, limb1: 0xcddddab1a3af6fa901f267d3, limb2: 0x1d5b892bac643be1, }, r0a1: u288 { limb0: 0xd200f75804e773fd94a69bff, limb1: 0x5dcaa5c6bfcc08323700dd54, limb2: 0x3b045d584b9e34e, }, r1a0: u288 { limb0: 0x364fc9381fdcfc87f48025fd, limb1: 0x65d53f242d37bf7d6a422db4, limb2: 0x5fc799e0624fbc5, }, r1a1: u288 { limb0: 0x40494a8cfe5af05b211a65c8, limb1: 0x436bd2d7c12a4599cd65d28c, limb2: 0x14329c50f1378c82, }, }, G2Line { r0a0: u288 { limb0: 0xa97c95148b4c5d08de3552aa, limb1: 0x74fd19a4764ed2db2b947c9b, limb2: 0x1f6645462132403f, }, r0a1: u288 { limb0: 0xcccb21d1679b6f037f5c6862, limb1: 0x3796ff849627eae6d1373566, limb2: 0xf569739c4b0bf20, }, r1a0: u288 { limb0: 0x3a69197d08132714a2d8cde9, limb1: 0xae3e914eb52fc9f866335adb, limb2: 0x22d97cabaecd8977, }, r1a1: u288 { limb0: 0x59a5a98b2a4b546d9fdf220d, limb1: 0x8158806a0c4d6fc1bfc00dac, limb2: 0x1e8455c351c421dc, }, }, G2Line { r0a0: u288 { limb0: 0xccf841cf5c1cf8f4a0485e28, limb1: 0xb5077662d0ce9d755af1446b, limb2: 0x2b08658e9d5ba5cb, }, r0a1: u288 { limb0: 0x6ce62184a15685babd77f27f, limb1: 0x5ff9bb7d74505b0542578299, limb2: 0x7244563488bab2, }, r1a0: u288 { limb0: 0xec778048d344ac71275d961d, limb1: 0x1273984019753000ad890d33, limb2: 0x27c2855e60d361bd, }, r1a1: u288 { limb0: 0xa7a0071e22af2f3a79a12da, limb1: 0xc84a6fd41c20759ff6ff169a, limb2: 0x23e7ef2a308e49d1, }, }, G2Line { r0a0: u288 { limb0: 0xd85b572f6e94368559bc9922, limb1: 0x806d660df4c09f298ca99a8c, limb2: 0xb5295ba1e28bea6, }, r0a1: u288 { limb0: 0x3309d566a80c2e9fe64a9417, limb1: 0x5cb56c0e22896cf7b425f4f3, limb2: 0x2194637a888395df, }, r1a0: u288 { limb0: 0x71882225419d48d5cdfd106f, limb1: 0x83e49ccde853b0d80d85954f, limb2: 0x95abeffbab1f6f1, }, r1a1: u288 { limb0: 0xa56f499db7c21d64a6f4cde4, limb1: 0xfa807931f439377fded2c667, limb2: 0x722a1ecfd5f676a, }, }, G2Line { r0a0: u288 { limb0: 0x7105024c431a33683d9d0b9d, limb1: 0x12e23637b641ab0e5b322ad8, limb2: 0x2918e9e08c764c28, }, r0a1: u288 { limb0: 0x26384979d1f5417e451aeabf, limb1: 0xacfb499e362291d0b053bbf6, limb2: 0x2a6ad1a1f7b04ef6, }, r1a0: u288 { limb0: 0xba4db515be70c384080fc9f9, limb1: 0x5a983a6afa9cb830fa5b66e6, limb2: 0x8cc1fa494726a0c, }, r1a1: u288 { limb0: 0x59c9af9399ed004284eb6105, limb1: 0xef37f66b058b4c971d9c96b0, limb2: 0x2c1839afde65bafa, }, }, G2Line { r0a0: u288 { limb0: 0x3b40bc013ebda1f6759eb1c5, limb1: 0x41b1c4994f7006c3bfc44225, limb2: 0x1104e881eeac0f26, }, r0a1: u288 { limb0: 0x1a0a3837d2925b22b29de16, limb1: 0x7f161412b67cb737308ee1e4, limb2: 0x2eca703d4f685eca, }, r1a0: u288 { limb0: 0x791ea927b5f79fedbd63a830, limb1: 0xa43daf5bad2feef86dc7c3e5, limb2: 0x11f25ca14404e535, }, r1a1: u288 { limb0: 0xf1b3aada072d4891b5de1aae, limb1: 0x2f78e8d48428027439b02564, limb2: 0x6a400f4c3b5b6fa, }, }, G2Line { r0a0: u288 { limb0: 0x6bf13a27b0f4eb6657abc4b, limb1: 0xf78d57f089bffdf07c676bb3, limb2: 0x228e4aefbdd738df, }, r0a1: u288 { limb0: 0x4f41a40b04ec964619823053, limb1: 0xfa3fb44f4a80641a9bb3bc09, limb2: 0x29bf29a3d071ec4b, }, r1a0: u288 { limb0: 0x83823dcdff02bdc8a0e6aa03, limb1: 0x79ac92f113de29251cd73a98, limb2: 0x1ccdb791718d144, }, r1a1: u288 { limb0: 0xa074add9d066db9a2a6046b6, limb1: 0xef3a70034497456c7d001a5, limb2: 0x27d09562d815b4a6, }, }, G2Line { r0a0: u288 { limb0: 0x3c8b4b05cbef623055ab9631, limb1: 0xa357807ba01b50955f01beb1, limb2: 0xd8e8272150b392, }, r0a1: u288 { limb0: 0xc69a03b91fd115f482bc7aa1, limb1: 0xa175d02bfd1daa28271cc421, limb2: 0x2c5e890fe1b00b05, }, r1a0: u288 { limb0: 0xe363626ab202f75cc610f018, limb1: 0x46e37dbd0719e9c1b4951c4a, limb2: 0x1873157667707b3f, }, r1a1: u288 { limb0: 0xd42f65f398d2c703199689b3, limb1: 0x39ec231de4b4bd3adf1feeee, limb2: 0x67fb3d358e060f0, }, }, G2Line { r0a0: u288 { limb0: 0x87a44d343cc761056f4f2eae, limb1: 0x18016f16818253360d2c8adf, limb2: 0x1bcd5c6e597d735e, }, r0a1: u288 { limb0: 0x593d7444c376f6d69289660b, limb1: 0x1d6d97020b59cf2e4b38be4f, limb2: 0x17133b62617f63a7, }, r1a0: u288 { limb0: 0x88cac99869bb335ec9553a70, limb1: 0x95bcfa7f7c0b708b4d737afc, limb2: 0x1eec79b9db274c09, }, r1a1: u288 { limb0: 0xe465a53e9fe085eb58a6be75, limb1: 0x868e45cc13e7fd9d34e11839, limb2: 0x2b401ce0f05ee6bb, }, }, G2Line { r0a0: u288 { limb0: 0x83f48fbac5c1b94486c2d037, limb1: 0xf95d9333449543de78c69e75, limb2: 0x7bca8163e842be7, }, r0a1: u288 { limb0: 0x60157b2ff6e4d737e2dac26b, limb1: 0x30ab91893fcf39d9dcf1b89, limb2: 0x29a58a02490d7f53, }, r1a0: u288 { limb0: 0x520f9cb580066bcf2ce872db, limb1: 0x24a6e42c185fd36abb66c4ba, limb2: 0x309b07583317a13, }, r1a1: u288 { limb0: 0x5a4c61efaa3d09a652c72471, limb1: 0xfcb2676d6aa28ca318519d2, limb2: 0x1405483699afa209, }, }, G2Line { r0a0: u288 { limb0: 0xc208b17fbf164d6b7c4c87ef, limb1: 0xe5ef2141a5e0ed8d7880adc2, limb2: 0x1fbb587de0172d44, }, r0a1: u288 { limb0: 0x5ecc8bd2960195067936331e, limb1: 0x302d49c4538f5a4b41fffa, limb2: 0x2dd8166b425b4bdb, }, r1a0: u288 { limb0: 0x6dda8e93ab2dad36a7a26d98, limb1: 0x1a832cbd0bdfb31ca9670821, limb2: 0x5e16617c8f62852, }, r1a1: u288 { limb0: 0xf9cba326c8ccbf69a8c7f8fb, limb1: 0x6b295295947987bb33e9961b, limb2: 0x186db8004776c0ea, }, }, G2Line { r0a0: u288 { limb0: 0x241ca305ac4ceab57c4bc375, limb1: 0xdada9084d8f73edb881a22fa, limb2: 0xd143f30c17c29c7, }, r0a1: u288 { limb0: 0x352a5664ad09ed22111ef209, limb1: 0xc2fe0792a993bfa1771d64ac, limb2: 0x26f89bc07398c259, }, r1a0: u288 { limb0: 0x2c78925418a3651b7b9f3260, limb1: 0xfe8414788b2aa8f5ac23d954, limb2: 0x72ae0678e079f6d, }, r1a1: u288 { limb0: 0x2ae6e01f9e31fe942d84d61e, limb1: 0x394dc28fbdae226870dad015, limb2: 0x26a4bf5e924cec01, }, }, G2Line { r0a0: u288 { limb0: 0xbfdfdae86101e29da3e869b8, limb1: 0xf969a9b961a28b872e56aac2, limb2: 0x1afdc719440d90f0, }, r0a1: u288 { limb0: 0xee43c995686f13baa9b07266, limb1: 0xbfa387a694c641cceee4443a, limb2: 0x104d8c02eb7f60c8, }, r1a0: u288 { limb0: 0x8d451602b3593e798aecd7fb, limb1: 0x69ffbefe7c5ac2cf68e8691e, limb2: 0x2ea064a1bc373d28, }, r1a1: u288 { limb0: 0x6e7a663073bfe88a2b02326f, limb1: 0x5faadb36847ca0103793fa4a, limb2: 0x26c09a8ec9303836, }, }, G2Line { r0a0: u288 { limb0: 0x824428c8f1355395a5d9ba68, limb1: 0x376f82056ab1a3d451926ebc, limb2: 0x1651053bdebca358, }, r0a1: u288 { limb0: 0xf5739b050710bb99609328bb, limb1: 0x101222612f31bc7d1c0bd8e5, limb2: 0x13b46682b3ffd5da, }, r1a0: u288 { limb0: 0xce3778bd830f3b8fcbc8fd80, limb1: 0x8b28ab5db321c956a216239f, limb2: 0x12e9fa0b5b37656, }, r1a1: u288 { limb0: 0x11d47326796ba49f7372575c, limb1: 0x5439890841ee14932fdab241, limb2: 0x20ae02265c066cc9, }, }, G2Line { r0a0: u288 { limb0: 0x3d038747ebac16adc1c50bdd, limb1: 0xe3706a783e99f73ac742aa1a, limb2: 0x17eac23b00b545ff, }, r0a1: u288 { limb0: 0xdc25ff0bd02abcbe502c4e37, limb1: 0x39b92e6ebb65e5f2d8504f90, limb2: 0x2415b5f61301dff6, }, r1a0: u288 { limb0: 0x9cdcb2146d15f37900db82ac, limb1: 0x96c3940e2f5c5f8198fadee3, limb2: 0x2f662ea79b473fc2, }, r1a1: u288 { limb0: 0xc0fb95686de65e504ed4c57a, limb1: 0xec396c7c4275d4e493b00713, limb2: 0x106d2aab8d90d517, }, }, G2Line { r0a0: u288 { limb0: 0x54e4b692d0b04b114badd438, limb1: 0x89b0bcf5ed2033f3629f3c6d, limb2: 0x4ac1c520f363442, }, r0a1: u288 { limb0: 0x6e33ec73c0d5ed30e3079388, limb1: 0x2cb4a77b53c17c54cb9dfd10, limb2: 0x2968a3d8c2554718, }, r1a0: u288 { limb0: 0xe97a72fab0a46c6d08aa91e0, limb1: 0xe6c0929ee3cd8208fefa545a, limb2: 0x1bb29a0c8606c9f5, }, r1a1: u288 { limb0: 0x9a8644995c03499317a8e45c, limb1: 0x11f6d94c94096a8d5b5d7e16, limb2: 0x3ca2bfbaea0bdba, }, }, G2Line { r0a0: u288 { limb0: 0x49bbb4d856921e3177c0b5bf, limb1: 0x76d84d273694e662bdd5d364, limb2: 0xea5dc611bdd369d, }, r0a1: u288 { limb0: 0x9e9fc3adc530fa3c5c6fd7fe, limb1: 0x114bb0c0e8bd247da41b3883, limb2: 0x6044124f85d2ce, }, r1a0: u288 { limb0: 0xa6e604cdb4e40982a97c084, limb1: 0xef485caa56c7820be2f6b11d, limb2: 0x280de6387dcbabe1, }, r1a1: u288 { limb0: 0xcaceaf6df5ca9f8a18bf2e1e, limb1: 0xc5cce932cc6818b53136c142, limb2: 0x12f1cd688682030c, }, }, G2Line { r0a0: u288 { limb0: 0x37497c23dcf629df58a5fa12, limb1: 0x4fcd5534ae47bded76245ac9, limb2: 0x1715ab081e32ac95, }, r0a1: u288 { limb0: 0x856275471989e2c288e3c83, limb1: 0xb42d81a575b89b127a7821a, limb2: 0x5fa75a0e4ae3118, }, r1a0: u288 { limb0: 0xeb22351e8cd345c23c0a3fef, limb1: 0x271feb16d4b47d2267ac9d57, limb2: 0x258f9950b9a2dee5, }, r1a1: u288 { limb0: 0xb5f75468922dc025ba7916fa, limb1: 0x7e24515de90edf1bde4edd9, limb2: 0x289145b3512d4d81, }, }, G2Line { r0a0: u288 { limb0: 0x969615d01c0ea4dfb1e1a6b2, limb1: 0xd77dd0fbf1448a668095626c, limb2: 0x17bb395ada2e0445, }, r0a1: u288 { limb0: 0x8c49c2dd43d51285a7943c57, limb1: 0xf5f9285614403018a99984aa, limb2: 0x2cb65c9a5ac3782d, }, r1a0: u288 { limb0: 0x3791dc91878eee9614a543b7, limb1: 0x808b3206de074f61c1014e23, limb2: 0x2f63f37a727e6056, }, r1a1: u288 { limb0: 0x6f1ce5115bca50bfffd5af23, limb1: 0xc20d51c6b761c502ff9afc29, limb2: 0xd8674e970c4dfe4, }, }, G2Line { r0a0: u288 { limb0: 0x44091526974134aced04c6bb, limb1: 0x20cef822214008ec6c938cbc, limb2: 0x1369e9effc4a35e, }, r0a1: u288 { limb0: 0x52b595de3bb429b75d8dfa0b, limb1: 0xc90240ebeed8793217853473, limb2: 0x605405f1532ac21, }, r1a0: u288 { limb0: 0x47af4457f3ac9976bf779dea, limb1: 0x832936741d545aaead5647cb, limb2: 0x14cd80d3394a1b3, }, r1a1: u288 { limb0: 0xd7d82811675d7a5104cfef4, limb1: 0x838c6ad9a0bf10cfc4e6b80c, limb2: 0x129d3f962801867d, }, }, G2Line { r0a0: u288 { limb0: 0x95b7b32bcc3119c64a62a8de, limb1: 0xe07184496f17bbd59a4b7bbd, limb2: 0x1708c536fd78b531, }, r0a1: u288 { limb0: 0xfa85b5778c77166c1523a75e, limb1: 0x89a00c53309a9e525bef171a, limb2: 0x2d2287dd024e421, }, r1a0: u288 { limb0: 0x31fd0884eaf2208bf8831e72, limb1: 0x537e04ea344beb57ee645026, limb2: 0x23c7f99715257261, }, r1a1: u288 { limb0: 0x8c38b3aeea525f3c2d2fdc22, limb1: 0xf838a99d9ec8ed6dcec6a2a8, limb2: 0x2973d5159ddc479a, }, }, G2Line { r0a0: u288 { limb0: 0x3f058d8c63fd905d3ca29b42, limb1: 0x1f0a90982cc68e4ddcd83e57, limb2: 0x240aeaae0783fbfa, }, r0a1: u288 { limb0: 0xedfee81d80da310fdf0d0d8, limb1: 0xc2208e6de8806cf491bd74d4, limb2: 0xb7318be62a476af, }, r1a0: u288 { limb0: 0x3c6920c8a24454c634f388fe, limb1: 0x23328a006312a722ae09548b, limb2: 0x1d2f1c58b80432e2, }, r1a1: u288 { limb0: 0xb72980574f7a877586de3a63, limb1: 0xcd773b87ef4a29c16784c5ae, limb2: 0x1f812c7e22f339c5, }, }, G2Line { r0a0: u288 { limb0: 0x5502b81d15f7c7544bfe0e5b, limb1: 0x313d44b9cbb6b1db3c2e19e1, limb2: 0x3de8450efb34ca6, }, r0a1: u288 { limb0: 0x4c5017047d6babdf471554da, limb1: 0xb48b8025f177b936503d1018, limb2: 0x1663b50793893d61, }, r1a0: u288 { limb0: 0x547308fdb041d15648a5204e, limb1: 0xd30b5b0cf7e71b06e163ca37, limb2: 0xf12e11a9da90df6, }, r1a1: u288 { limb0: 0xb6893b6d66dc4cc63ef77caa, limb1: 0xe00d12ef10c3485ae8afd77a, limb2: 0x129ce385f3aee936, }, }, G2Line { r0a0: u288 { limb0: 0x219a140154109ee7653b47d8, limb1: 0xd87fa178daffefe3dc339320, limb2: 0x1b64d217daf233d4, }, r0a1: u288 { limb0: 0xb3b2902c23a1e297afc723f1, limb1: 0xec8c0334a6a16fb184bdead, limb2: 0x194ee26f950ec5f, }, r1a0: u288 { limb0: 0xea0b18b28d70a0af43f81ec5, limb1: 0x1ec1efd748ba4d8687c22bb3, limb2: 0x1e98470402747e1, }, r1a1: u288 { limb0: 0x32ebb96106cdebef00b5f079, limb1: 0x29e0caf709d34430343bf4fe, limb2: 0x5d405f60a473bfc, }, }, G2Line { r0a0: u288 { limb0: 0xfeebe92941f95b6ea1d095bb, limb1: 0x9c7962eb8bbeb95a9ca7cf50, limb2: 0x290bdaf3b9a08dc3, }, r0a1: u288 { limb0: 0x686cfa11c9d4b93675495599, limb1: 0xb1d69e17b4b5ebf64f0d51e1, limb2: 0x2c18bb4bdc2e9567, }, r1a0: u288 { limb0: 0x17419b0f6a04bfc98d71527, limb1: 0x80eba6ff02787e3de964a4d1, limb2: 0x26087bb100e7ff9f, }, r1a1: u288 { limb0: 0x17c4ee42c3f612c43a08f689, limb1: 0x7276bdda2df6d51a291dba69, limb2: 0x40a7220ddb393e1, }, }, G2Line { r0a0: u288 { limb0: 0xfcbba4528085627c1a57561e, limb1: 0x1077be1789bfa914646ecc48, limb2: 0x1daf99b543be0c2, }, r0a1: u288 { limb0: 0x73889773fb3e9955a83f6371, limb1: 0x65e8a51749a2070ca7d04fe3, limb2: 0x193e02f206b649b5, }, r1a0: u288 { limb0: 0x4bcdb53209d1e271c3981a53, limb1: 0xcd0c66c9c62656f385896b9a, limb2: 0x4fae5ec45196d1f, }, r1a1: u288 { limb0: 0xff4b9fb7c654595edbc25c37, limb1: 0x9fb627a4ff2fd8e4aeb9855f, limb2: 0x14f93e3bc9bb22dd, }, }, G2Line { r0a0: u288 { limb0: 0x830d777c19040571a1d72fd0, limb1: 0x651b2c6b8c292020817a633f, limb2: 0x268af1e285bc59ff, }, r0a1: u288 { limb0: 0xede78baa381c5bce077f443d, limb1: 0x540ff96bae21cd8b9ae5438b, limb2: 0x12a1fa7e3b369242, }, r1a0: u288 { limb0: 0x797c0608e5a535d8736d4bc5, limb1: 0x375faf00f1147656b7c1075f, limb2: 0xda60fab2dc5a639, }, r1a1: u288 { limb0: 0x610d26085cfbebdb30ce476e, limb1: 0x5bc55890ff076827a09e8444, limb2: 0x14272ee2d25f20b7, }, }, G2Line { r0a0: u288 { limb0: 0x4df45d410833e4569501b62, limb1: 0x5699ff1c49fc63f8f017a20e, limb2: 0x1c2b4976da64f44e, }, r0a1: u288 { limb0: 0xa371e6c9dc1278d9b692f5c0, limb1: 0xe2818a89c204727bbb77e230, limb2: 0x2524c5673fb891de, }, r1a0: u288 { limb0: 0x8b35f28524701efaaa2f36e9, limb1: 0x7d0defb1afd7565b6ca0969, limb2: 0x3138ffe86fc3f3c, }, r1a1: u288 { limb0: 0xbf20ec1ddaebd714888b9623, limb1: 0x16edc17da676619889e1f93f, limb2: 0x2895535d6bfd83ad, }, }, G2Line { r0a0: u288 { limb0: 0xd6862e1a4ca3b2baf6f8d8aa, limb1: 0x96f9066dded3a3d899025af4, limb2: 0x1a98af9f0d48fd3, }, r0a1: u288 { limb0: 0x276b417cc61ea259c114314e, limb1: 0x464399e5e0037b159866b246, limb2: 0x12cc97dcf32896b5, }, r1a0: u288 { limb0: 0xef72647f4c2d08fc038c4377, limb1: 0x34883cea19be9a490a93cf2b, limb2: 0x10d01394daa61ed0, }, r1a1: u288 { limb0: 0xdf345239ece3acaa62919643, limb1: 0x914780908ece64e763cca062, limb2: 0xee2a80dbd2012a3, }, }, G2Line { r0a0: u288 { limb0: 0x1d5a31f4d08a0ebf7e071e00, limb1: 0xcd1244dd95dd30005f531f81, limb2: 0xb4cb469a2dcf4f1, }, r0a1: u288 { limb0: 0x7c5938adaf38b355092de1f1, limb1: 0x292ab08995b293abfcba14b, limb2: 0x1fd126a2b9f37c67, }, r1a0: u288 { limb0: 0x6e9d352b02a7cb771fcc33f9, limb1: 0x7754d8536eefda2025a07340, limb2: 0x1840289291c35a72, }, r1a1: u288 { limb0: 0xe85f465417b7bd758c547b2e, limb1: 0xf7f703c3bc55ff8a01fa9365, limb2: 0xfa301227880a841, }, }, G2Line { r0a0: u288 { limb0: 0x2f943bcffafbec474e14056, limb1: 0xe36cbbcaa047d892ce518c06, limb2: 0x28e9edc7ec764cec, }, r0a1: u288 { limb0: 0xa4e5768f524886ccd57ef67f, limb1: 0x846c3c4a1b3d610c6598a6ca, limb2: 0x26c1dd1c6cef5230, }, r1a0: u288 { limb0: 0x646a7a17c9c2d11cf18ce24c, limb1: 0x9c3bc28ac69dc0fa40709bc3, limb2: 0x22355c8b8f9caf41, }, r1a1: u288 { limb0: 0x532978b7044846c302ea39dc, limb1: 0xb3b1a62ec6c95c12a8ee1c3c, limb2: 0x1b9cf068f2f7f74, }, }, G2Line { r0a0: u288 { limb0: 0xae2e80376c9eb92d7fdf62f4, limb1: 0xc8987db182a167029720321d, limb2: 0x32dd5c4a5ead22e, }, r0a1: u288 { limb0: 0xed934df95403f36e080370c1, limb1: 0x82991943f3810cb571dd5476, limb2: 0x1c8835c07868aab0, }, r1a0: u288 { limb0: 0xe69df9d36c3ef19b14ac3256, limb1: 0xeffc663918d000a46b1308f3, limb2: 0x2d3d6a3aa18904ea, }, r1a1: u288 { limb0: 0x49fd82b2c5900a89f4e3e03, limb1: 0x4b4cedd7d8bab16a1290e7a7, limb2: 0x13c64649ca8e5620, }, }, G2Line { r0a0: u288 { limb0: 0xa4058149e82ea51362b79be4, limb1: 0x734eba2621918a820ae44684, limb2: 0x110a314a02272b1, }, r0a1: u288 { limb0: 0xe2b43963ef5055df3c249613, limb1: 0x409c246f762c0126a1b3b7b7, limb2: 0x19aa27f34ab03585, }, r1a0: u288 { limb0: 0x179aad5f620193f228031d62, limb1: 0x6ba32299b05f31b099a3ef0d, limb2: 0x157724be2a0a651f, }, r1a1: u288 { limb0: 0xa33b28d9a50300e4bbc99137, limb1: 0x262a51847049d9b4d8cea297, limb2: 0x189acb4571d50692, }, }, G2Line { r0a0: u288 { limb0: 0x958cb28384b32ba53919aad6, limb1: 0x7cb6afd288225969b3ed04a7, limb2: 0x1f6c88c19f868c64, }, r0a1: u288 { limb0: 0x1f9383d92c96e715fa8a0e4, limb1: 0x185e1f31310dcf1342282c7f, limb2: 0x9d2bbb84bf8c8a, }, r1a0: u288 { limb0: 0x2ebb25e92c5e5775f24e5f43, limb1: 0x5a0dd9406740da093e0e9df9, limb2: 0x20542767fe53e03a, }, r1a1: u288 { limb0: 0xfc3d9b88c92d661c9f2e49d4, limb1: 0xd5c675a3022548b290b637dc, limb2: 0x6fc49e7ff4bc3, }, }, G2Line { r0a0: u288 { limb0: 0x29bd4381ae4afc677ee37ed6, limb1: 0x29ed43453f9a008d9176f004, limb2: 0x24134eb915104f43, }, r0a1: u288 { limb0: 0x81597f82bb67e90a3e72bdd2, limb1: 0xab3bbde5f7bbb4df6a6b5c19, limb2: 0x19ac61eea40a367c, }, r1a0: u288 { limb0: 0xe30a79342fb3199651aee2fa, limb1: 0xf500f028a73ab7b7db0104a3, limb2: 0x808b50e0ecb5e4d, }, r1a1: u288 { limb0: 0x55f2818453c31d942444d9d6, limb1: 0xf6dd80c71ab6e893f2cf48db, limb2: 0x13c3ac4488abd138, }, }, G2Line { r0a0: u288 { limb0: 0x5c0c3c2206b28bed76db5fb9, limb1: 0xa81f45c675f24fab51c8325a, limb2: 0xd27686198826ba2, }, r0a1: u288 { limb0: 0x9ce02274becdc697b91bdc82, limb1: 0x193674102a7fa372f1e3864, limb2: 0x1ad17052d923f3ab, }, r1a0: u288 { limb0: 0x2ab1b4cab08b97770060cd95, limb1: 0x5b7cae55f9b2ef94b80bc0fc, limb2: 0x4319d424bab41a3, }, r1a1: u288 { limb0: 0xd80167cf68050f7988b0d7b, limb1: 0x4177064bd3572a973e0afd8, limb2: 0xa5c5ddbd56184d6, }, }, G2Line { r0a0: u288 { limb0: 0xd1464269bbeafa546f559b8f, limb1: 0xab7f7dcd1ac32b86979471cf, limb2: 0x6a38256ee96f113, }, r0a1: u288 { limb0: 0xf14d50984e65f9bc41df4e7e, limb1: 0x350aff9be6f9652ad441a3ad, limb2: 0x1b1e60534b0a6aba, }, r1a0: u288 { limb0: 0x9e98507da6cc50a56f023849, limb1: 0xcf8925e03f2bb5c1ba0962dd, limb2: 0x2b18961810a62f87, }, r1a1: u288 { limb0: 0x3a4c61b937d4573e3f2da299, limb1: 0x6f4c6c13fd90f4edc322796f, limb2: 0x13f4e99b6a2f025e, }, }, G2Line { r0a0: u288 { limb0: 0xf86c13c653367f48043babc5, limb1: 0x52798720b6abfea4f78e8755, limb2: 0x2a08b546b9a04e01, }, r0a1: u288 { limb0: 0x3a3897216778c8d89c902498, limb1: 0xe9e85640d8cfb88eac53d7a4, limb2: 0x22ed91f0b0f7b0a7, }, r1a0: u288 { limb0: 0xa1e20caf4a06b7069c5fcade, limb1: 0xce1ab9c14ede733440fe4d4f, limb2: 0x29511f7e24afbc7a, }, r1a1: u288 { limb0: 0x2cb71e6fb0c40ed481c482d2, limb1: 0xb4a3dfc3f1f8bf08f18b9963, limb2: 0x20cc0deb8bc5808a, }, }, G2Line { r0a0: u288 { limb0: 0xe0115a79120ae892a72f3dcb, limb1: 0xec67b5fc9ea414a4020135f, limb2: 0x1ee364e12321904a, }, r0a1: u288 { limb0: 0xa74d09666f9429c1f2041cd9, limb1: 0x57ffe0951f863dd0c1c2e97a, limb2: 0x154877b2d1908995, }, r1a0: u288 { limb0: 0xcbe5e4d2d2c91cdd4ccca0, limb1: 0xe6acea145563a04b2821d120, limb2: 0x18213221f2937afb, }, r1a1: u288 { limb0: 0xfe20afa6f6ddeb2cb768a5ae, limb1: 0x1a3b509131945337c3568fcf, limb2: 0x127b5788263a927e, }, }, G2Line { r0a0: u288 { limb0: 0x1682a38c2b0f08b940585776, limb1: 0x4bcfdd206314bf8fb7bbd3d9, limb2: 0x72478229fdf9b3e, }, r0a1: u288 { limb0: 0x7655cf8178fd96eab34ed64c, limb1: 0xa8a410386256daf6f497a426, limb2: 0x24a563cb3fd6a97c, }, r1a0: u288 { limb0: 0xcc3e2f74f61e4ad3dd0ec353, limb1: 0xd8d2eed02ef01ce6c895d54b, limb2: 0x2f0b5abbb25e5201, }, r1a1: u288 { limb0: 0x6ca200200f72fc879747d649, limb1: 0xfe2a8dfce46aa04cc6cac8bf, limb2: 0x2538761bcc075511, }, }, G2Line { r0a0: u288 { limb0: 0xe7c658aecdab4db3c83f7927, limb1: 0xfbf162264ca04ee50c70bde8, limb2: 0x2a20f4565b7ff885, }, r0a1: u288 { limb0: 0x45b1c2f0a1226361f42683c0, limb1: 0x9acdd892c48c08de047296bc, limb2: 0x27836373108925d4, }, r1a0: u288 { limb0: 0xc0ea9294b345e6d4892676a7, limb1: 0xcba74eca77086af245d1606e, limb2: 0xf20edac89053e72, }, r1a1: u288 { limb0: 0x4c92a28f2779a527a68a938c, limb1: 0x3a1c3c55ff9d20eac109fab3, limb2: 0x21c4a8c524b1ee7d, }, }, G2Line { r0a0: u288 { limb0: 0xb4a2a27e2287cfee7a9682c4, limb1: 0x1ce9a7e33aac888cfff41045, limb2: 0x15862361b72f510c, }, r0a1: u288 { limb0: 0xf2ad35e6e2883182aa6b4fd1, limb1: 0xe770aff5925910a31f0953c9, limb2: 0x2620607848308ab0, }, r1a0: u288 { limb0: 0xd96d83a873e922ac6356c949, limb1: 0xd55163234b216b61b10f5648, limb2: 0xde3b9a35927e127, }, r1a1: u288 { limb0: 0xab124d1d7268f0e796dbe62c, limb1: 0x2853f3ef7aa34d7a0e228ce2, limb2: 0x13beaa5c47f7b339, }, }, G2Line { r0a0: u288 { limb0: 0xa68021d593c46246af22559e, limb1: 0x5c2cfc5bc4cd1b48f4704134, limb2: 0x296066ede1298f8c, }, r0a1: u288 { limb0: 0xfe17dd6765eb9b9625eb6a84, limb1: 0x4e35dd8e8f6088bb14299f8d, limb2: 0x1a380ab2689106e4, }, r1a0: u288 { limb0: 0x82bacf337ca09853df42bc59, limb1: 0xa15de4ef34a30014c5a2e9ae, limb2: 0x243cc0cec53c778b, }, r1a1: u288 { limb0: 0xcb2a1bf18e3ba9349b0a8bf2, limb1: 0x35134b2505cbb5a4c91f0ac4, limb2: 0x25e45206b13f43c4, }, }, G2Line { r0a0: u288 { limb0: 0x8e97b007ffd9891bd0e77650, limb1: 0x77671278ac33f17df6b1db88, limb2: 0x243daddc47f5d5c2, }, r0a1: u288 { limb0: 0x655fe4c8bbe5ee06aaa0054b, limb1: 0xf751450b02c93c7ddea95938, limb2: 0x21aa988e950d563f, }, r1a0: u288 { limb0: 0xb51b3b6b8582de3eb0549518, limb1: 0x84a1031766b7e465f5bbf40c, limb2: 0xd46c2d5b95e5532, }, r1a1: u288 { limb0: 0x50b6ddd8a5eef0067652191e, limb1: 0x298832a0bc46ebed8bff6190, limb2: 0xb568b4fe8311f93, }, }, G2Line { r0a0: u288 { limb0: 0x95142735dac6534042d2d05e, limb1: 0x7403f0a3b4d2a49a7009872f, limb2: 0x2b5ce066c5012949, }, r0a1: u288 { limb0: 0xfb9dd943bee0316b632fd1fc, limb1: 0xe28dc017ad7c82d573ca64d4, limb2: 0x1d814d88b3e026ce, }, r1a0: u288 { limb0: 0x1722d6e82c213b5f5bb54b06, limb1: 0xe97b4fa087e0ac0ade7e9fb3, limb2: 0x117a4f1562cdc338, }, r1a1: u288 { limb0: 0x16204b8c2a7d006220778fc4, limb1: 0x23ebf70a7d3687322b0a559b, limb2: 0x117d1eaacfcf39d0, }, }, G2Line { r0a0: u288 { limb0: 0xac3a5cf29dd67034cce999d8, limb1: 0xabf7913b1ad3df78f63ec920, limb2: 0x10e5e9415124c78a, }, r0a1: u288 { limb0: 0xfe328b7478a7b96b0521d32d, limb1: 0x486efcf8db262be440c2f384, limb2: 0x118851b013a7a2f6, }, r1a0: u288 { limb0: 0xfcea8d918c9420959fc131c1, limb1: 0x2c76ec0524a5b61c91661734, limb2: 0xbfe2e9e02621600, }, r1a1: u288 { limb0: 0xc55d8e0d7ac126b8e0dfa148, limb1: 0x178dd414d941be3cb70299bb, limb2: 0x15b52c5f3e3c78fe, }, }, G2Line { r0a0: u288 { limb0: 0xddb4db99db681d35f71a159c, limb1: 0xf71a330019414e6fdee75700, limb2: 0x14d9838e7d1918bb, }, r0a1: u288 { limb0: 0x203c8bac71951a5f2c653710, limb1: 0x9fc93f8da38ecc2957313982, limb2: 0x7b6d981259cabd9, }, r1a0: u288 { limb0: 0xa7297cdb5be0cc45d48ca6af, limb1: 0xa07b4b025ebe6c960eddfc56, limb2: 0xef2a5c30ef00652, }, r1a1: u288 { limb0: 0xb7f05c76d860e9122b36ecd7, limb1: 0x407d6522e1f9ce2bcbf80eda, limb2: 0x197625a558f32c36, }, }, G2Line { r0a0: u288 { limb0: 0x4e67d839c8646de27691dae2, limb1: 0xa113e037559795425b1ca935, limb2: 0xe0f8316d3adace6, }, r0a1: u288 { limb0: 0xac5484d96d5e16708aa20635, limb1: 0x3cf76c0c779c04ac350707d7, limb2: 0x189022b6900c47, }, r1a0: u288 { limb0: 0x4c4cf7790d369d15fe931a4e, limb1: 0xeccffa7915f2d1fb735abf95, limb2: 0x18f28ca407bde4a, }, r1a1: u288 { limb0: 0x2b7dcc570e7213f9c18015d3, limb1: 0x8196ba5914d477135145617, limb2: 0x1d11ba6a93642a1d, }, }, G2Line { r0a0: u288 { limb0: 0xb0f04df9dec94801e48a6ff7, limb1: 0xdc59d087c627d38334e5b969, limb2: 0x3d36e11420be053, }, r0a1: u288 { limb0: 0xc80f070001aa1586189e0215, limb1: 0xff849fcbbbe7c00c83ab5282, limb2: 0x2a2354b2882706a6, }, r1a0: u288 { limb0: 0x48cf70c80f08b6c7dc78adb2, limb1: 0xc6632efa77b36a4a1551d003, limb2: 0xc2d3533ece75879, }, r1a1: u288 { limb0: 0x63e82ba26617416a0b76ddaa, limb1: 0xdaceb24adda5a049bed29a50, limb2: 0x1a82061a3344043b, }, }, G2Line { r0a0: u288 { limb0: 0xbd69421a5b200ff9b38f831f, limb1: 0x3fe4fe938fccbaeeea650793, limb2: 0x19df4f325f19d790, }, r0a1: u288 { limb0: 0x460ec10fdc20f258517b0ede, limb1: 0xed5f65a9e2470b25df5fef70, limb2: 0x1b61c823ebf0b10a, }, r1a0: u288 { limb0: 0x658cfa5631cd4889f4c5faf1, limb1: 0x7fc4136b63b1f54e46d634cb, limb2: 0xb2cdd6f5da71516, }, r1a1: u288 { limb0: 0xf29e04c6192dd039241e5573, limb1: 0xaed4fb46d1273a5895ee2308, limb2: 0x291ea193f947c5dc, }, }, G2Line { r0a0: u288 { limb0: 0x9152fecf0f523415acc7c7be, limb1: 0xd9632cbfccc4ea5d7bf31177, limb2: 0x2d7288c5f8c83ab1, }, r0a1: u288 { limb0: 0x53144bfe4030f3f9f5efda8, limb1: 0xfeec394fbf392b11c66bae27, limb2: 0x28840813ab8a200b, }, r1a0: u288 { limb0: 0xdec3b11fbc28b305d9996ec7, limb1: 0x5b5f8d9d17199e149c9def6e, limb2: 0x10c1a149b6751bae, }, r1a1: u288 { limb0: 0x665e8eb7e7d376a2d921c889, limb1: 0xfdd76d06e46ee1a943b8788d, limb2: 0x8bb21d9960e837b, }, }, G2Line { r0a0: u288 { limb0: 0x3a67c28a175200e631aa506a, limb1: 0x7397303a34968ff17c06e801, limb2: 0x1b81e0c63123688b, }, r0a1: u288 { limb0: 0x3490cfd4f076c621dac4a12c, limb1: 0xec183578c91b90b72e5887b7, limb2: 0x179fb354f608da00, }, r1a0: u288 { limb0: 0x9322bde2044dde580a78ba33, limb1: 0xfc74821b668d3570cad38f8b, limb2: 0x8cec54a291f5e57, }, r1a1: u288 { limb0: 0xc2818b6a9530ee85d4b2ae49, limb1: 0x8d7b651ad167f2a43d7a2d0a, limb2: 0x7c9ca9bab0ffc7f, }, }, G2Line { r0a0: u288 { limb0: 0xb3b784e642887a8476f572e, limb1: 0xed02f127df5eed0cb36a3bf8, limb2: 0xba1df3a2dfa44, }, r0a1: u288 { limb0: 0x42c8ddcabfe9a7ad125d0ca9, limb1: 0x7893651eea284a367016e3f4, limb2: 0x169246616ba43650, }, r1a0: u288 { limb0: 0x1c64d4f3656e04d1a72b8d48, limb1: 0xab4d9597432f9192baa38fde, limb2: 0x166f0057c0435ce, }, r1a1: u288 { limb0: 0xff9760ba5717ba174df6f8f8, limb1: 0x426768d82386947c5babfd7f, limb2: 0x7ca1e1a5d1a0c5e, }, }, G2Line { r0a0: u288 { limb0: 0xd5f536bc65864831172f42a0, limb1: 0x26dcfa4e457220eb911294ce, limb2: 0x105261c2c69ce433, }, r0a1: u288 { limb0: 0x6e00517fac26565662abb1ad, limb1: 0xa14626f27b8158a553767216, limb2: 0x22d2abd4602c1c6b, }, r1a0: u288 { limb0: 0x92f008ec8c7f2dc8a8571a28, limb1: 0x856f48547c31d1368fb8c686, limb2: 0x2ed469b49fa7d7ea, }, r1a1: u288 { limb0: 0xf50c1feb101e5ceb3b16ec4e, limb1: 0x3a230af636b80f192ec0e399, limb2: 0x1764922866d60a5e, }, }, G2Line { r0a0: u288 { limb0: 0xa576408f8300de3a7714e6ae, limb1: 0xe1072c9a16f202ecf37fbc34, limb2: 0x1b0cb1e2b5871263, }, r0a1: u288 { limb0: 0x2128e2314694b663286e231e, limb1: 0x54bea71957426f002508f715, limb2: 0x36ecc5dbe069dca, }, r1a0: u288 { limb0: 0x17c77cd88f9d5870957850ce, limb1: 0xb7f4ec2bc270ce30538fe9b8, limb2: 0x766279e588592bf, }, r1a1: u288 { limb0: 0x1b6caddf18de2f30fa650122, limb1: 0x40b77237a29cada253c126c6, limb2: 0x74ff1349b1866c8, }, }, G2Line { r0a0: u288 { limb0: 0xbb540898cf8935c1b1173cb4, limb1: 0xc1418f5298a4a4bf6f2e3bd3, limb2: 0xc988fb564cf08d8, }, r0a1: u288 { limb0: 0xf09b861d7134a245b7e364b4, limb1: 0xa92280b0deb7fe5180ed4b7a, limb2: 0x7aa813cc9c85d7b, }, r1a0: u288 { limb0: 0xed06ae875b1fc56f5d1c3f8e, limb1: 0xc41bdd2f5b4150a210b33d70, limb2: 0x2cea2b050d19c785, }, r1a1: u288 { limb0: 0x9790a2fc143b9afb8a56de04, limb1: 0xe74dd4109ce475db08d477a2, limb2: 0x19dba5858fcd648f, }, }, G2Line { r0a0: u288 { limb0: 0x3603266e05560becab36faef, limb1: 0x8c3b88c9390278873dd4b048, limb2: 0x24a715a5d9880f38, }, r0a1: u288 { limb0: 0xe9f595b111cfd00d1dd28891, limb1: 0x75c6a392ab4a627f642303e1, limb2: 0x17b34a30def82ab6, }, r1a0: u288 { limb0: 0xe706de8f35ac8372669fc8d3, limb1: 0x16cc7f4032b3f3ebcecd997d, limb2: 0x166eba592eb1fc78, }, r1a1: u288 { limb0: 0x7d584f102b8e64dcbbd1be9, limb1: 0x2ead4092f009a9c0577f7d3, limb2: 0x2fe2c31ee6b1d41e, }, }, G2Line { r0a0: u288 { limb0: 0x72253d939632f8c28fb5763, limb1: 0x9b943ab13cad451aed1b08a2, limb2: 0xdb9b2068e450f10, }, r0a1: u288 { limb0: 0x80f025dcbce32f6449fa7719, limb1: 0x8a0791d4d1ed60b86e4fe813, limb2: 0x1b1bd5dbce0ea966, }, r1a0: u288 { limb0: 0xaa72a31de7d815ae717165d4, limb1: 0x501c29c7b6aebc4a1b44407f, limb2: 0x464aa89f8631b3a, }, r1a1: u288 { limb0: 0x6b8d137e1ea43cd4b1f616b1, limb1: 0xdd526a510cc84f150cc4d55a, limb2: 0x1da2ed980ebd3f29, }, }, G2Line { r0a0: u288 { limb0: 0x2990abd5a415b597653aecc7, limb1: 0xf6d59e5d9f2735e0b5196522, limb2: 0x12cfd626116f3e90, }, r0a1: u288 { limb0: 0x85ff23da49c13991049c2a30, limb1: 0x29ea9dc0564c06318ee970c6, limb2: 0x2f579deeac8b19a, }, r1a0: u288 { limb0: 0x458c505570a4bc6cd8751128, limb1: 0xcff5c9e1d1d4c1f64e37982c, limb2: 0x1bfc56f58e4e33f5, }, r1a1: u288 { limb0: 0x364b1be00e65d893a9fabb7, limb1: 0xfa38e20e90619e224b054d86, limb2: 0x1d3724ff58e69e9d, }, }, G2Line { r0a0: u288 { limb0: 0x604234358fe8a608e232b055, limb1: 0x81bf97d1a0380fa64ffab70d, limb2: 0x2fe1c2c2521704f2, }, r0a1: u288 { limb0: 0x49746a3559cdc3031fd62abe, limb1: 0xc0676e4a367566526115e5d5, limb2: 0x793d580a7f8d698, }, r1a0: u288 { limb0: 0x434be9b6d4f5097159fe303b, limb1: 0x1eff6c60a4c52f744e8e2276, limb2: 0x210a1915eaab4b20, }, r1a1: u288 { limb0: 0x4e6f7e9d87f16fc7601cc783, limb1: 0xd4bec91933ea7c5f9518ea04, limb2: 0x1c45a57b0c8d62d7, }, }, G2Line { r0a0: u288 { limb0: 0x867cced8a010850958f41ff5, limb1: 0x6a37fdb2b8993eed18bafe8e, limb2: 0x21b9f782109e5a7, }, r0a1: u288 { limb0: 0x7307477d650618e66de38d0f, limb1: 0xacb622ce92a7e393dbe10ba1, limb2: 0x236e70838cee0ed5, }, r1a0: u288 { limb0: 0xb564a308aaf5dda0f4af0f0d, limb1: 0x55fc71e2f13d8cb12bd51e74, limb2: 0x294cf115a234a9e9, }, r1a1: u288 { limb0: 0xbd166057df55c135b87f35f3, limb1: 0xf9f29b6c50f1cce9b85ec9b, limb2: 0x2e8448d167f20f96, }, }, G2Line { r0a0: u288 { limb0: 0x8af780d4f3611de614224cf4, limb1: 0xb3411d6969eed4b8286c7185, limb2: 0x13f31915350d79e7, }, r0a1: u288 { limb0: 0xefebdf46e1c80e1bbfc388c4, limb1: 0xbab06fd5263cc18fb57d9e95, limb2: 0xe1c884a026d918e, }, r1a0: u288 { limb0: 0x845caa8c849832ee6cfe63b1, limb1: 0xaedd1db275061decc9cd7b3a, limb2: 0x23787e28f22f3546, }, r1a1: u288 { limb0: 0x28e41c19ff26092ec696db3f, limb1: 0x90f1244e5140a5df661d05f9, limb2: 0x2f61a80ac4d65725, }, }, G2Line { r0a0: u288 { limb0: 0xdedaff3205bb953b2c390b8a, limb1: 0xe1a899da21c1dafb485c707e, limb2: 0x1ec897e7a041493e, }, r0a1: u288 { limb0: 0xf52c3c30cd4d3202b34089e0, limb1: 0xc652aa1ff533e1aad7532305, limb2: 0x2a1df766e5e3aa2e, }, r1a0: u288 { limb0: 0x7ac695d3e19d79b234daaf3d, limb1: 0x5ce2f92666aec92a650feee1, limb2: 0x21ab4fe20d978e77, }, r1a1: u288 { limb0: 0xa64a913a29a1aed4e0798664, limb1: 0x66bc208b511503d127ff5ede, limb2: 0x2389ba056de56a8d, }, }, G2Line { r0a0: u288 { limb0: 0x5fa9f3d6ba2e33d9df261501, limb1: 0x14ce648819a9c46d64d2ad7a, limb2: 0x200d58896e8e5649, }, r0a1: u288 { limb0: 0xd961390ca5e5c1a18c8258f0, limb1: 0xe2e869b5cf4982ab8e3b203a, limb2: 0x269258fa79102f56, }, r1a0: u288 { limb0: 0x68cdab4015c2a73a65068b85, limb1: 0x89d0b1abc07351c7a379bd7c, limb2: 0x257b6794021bc2db, }, r1a1: u288 { limb0: 0xc75c452e6d369e6a87b6e1e, limb1: 0xdaabd301cafb7edba76274ef, limb2: 0x3bde99bf58a92c2, }, }, G2Line { r0a0: u288 { limb0: 0xd88b16e68600a12e6c1f6006, limb1: 0x333243b43d3b7ff18d0cc671, limb2: 0x2b84b2a9b0f03ed8, }, r0a1: u288 { limb0: 0xf3e2b57ddaac822c4da09991, limb1: 0xd7c894b3fe515296bb054d2f, limb2: 0x10a75e4c6dddb441, }, r1a0: u288 { limb0: 0x73c65fbbb06a7b21b865ac56, limb1: 0x21f4ecd1403bb78729c7e99b, limb2: 0xaf88a160a6b35d4, }, r1a1: u288 { limb0: 0xade61ce10b8492d659ff68d0, limb1: 0x1476e76cf3a8e0df086ad9eb, limb2: 0x2e28cfc65d61e946, }, }, G2Line { r0a0: u288 { limb0: 0xdf8b54b244108008e7f93350, limb1: 0x2ae9a68b9d6b96f392decd6b, limb2: 0x160b19eed152271c, }, r0a1: u288 { limb0: 0xc18a8994cfbb2e8df446e449, limb1: 0x408d51e7e4adedd8f4f94d06, limb2: 0x27661b404fe90162, }, r1a0: u288 { limb0: 0x1390b2a3b27f43f7ac73832c, limb1: 0x14d57301f6002fd328f2d64d, limb2: 0x17f3fa337367dddc, }, r1a1: u288 { limb0: 0x79cab8ff5bf2f762c5372f80, limb1: 0xc979d6f385fae4b5e4785acf, limb2: 0x60c5307a735b00f, }, }, G2Line { r0a0: u288 { limb0: 0x94336f2c5c03b2ad5dfd59a2, limb1: 0x3ee02119f9d3e985e9859470, limb2: 0x11a897fc6f4ac878, }, r0a1: u288 { limb0: 0x8fbbe337bcd3b3926dfd5a7b, limb1: 0x6a45f1a06ee96d69024430db, limb2: 0x14e51a458ccb2d83, }, r1a0: u288 { limb0: 0xbb2657ff1a311ddd38278308, limb1: 0x776a992cfacbf2c03314a11, limb2: 0x58d65fdae6e48e1, }, r1a1: u288 { limb0: 0x12a32aecc832311454a1c546, limb1: 0x2fe303fbc237d54289547719, limb2: 0x3668aec6f11f21e, }, }, G2Line { r0a0: u288 { limb0: 0xb0aa6695235ffd66d5f3c609, limb1: 0x318302a2be41d2dacdbc374d, limb2: 0x1eeaf97b389d7e8e, }, r0a1: u288 { limb0: 0x10bf93e11b2746d13bb58a38, limb1: 0xd1b4adad34ee3f10a1482bc0, limb2: 0x177de2cef1432bb6, }, r1a0: u288 { limb0: 0x83b01a1debda734692f242b9, limb1: 0xff64a01021e721460650bba4, limb2: 0x23fc5e8c9a462660, }, r1a1: u288 { limb0: 0xf56122ef42ec57584ae1e554, limb1: 0x1be67e0ec4b5b9cf2540e9a7, limb2: 0x15e2a1a3f49ec180, }, }, G2Line { r0a0: u288 { limb0: 0x386d7b23c6dccb87637018c9, limb1: 0xfed2ea478e9a2210289079e2, limb2: 0x100aa83cb843353e, }, r0a1: u288 { limb0: 0x229c5c285f049d04c3dc5ce7, limb1: 0x28110670fe1d38c53ffcc6f7, limb2: 0x1778918279578f50, }, r1a0: u288 { limb0: 0xe9ad2c7b8a17a1f1627ff09d, limb1: 0xedff5563c3c3e7d2dcc402ec, limb2: 0xa8bd6770b6d5aa8, }, r1a1: u288 { limb0: 0x66c5c1aeed5c04470b4e8a3d, limb1: 0x846e73d11f2d18fe7e1e1aa2, limb2: 0x10a60eabe0ec3d78, }, }, G2Line { r0a0: u288 { limb0: 0x1699deb0ead59ed63109c05b, limb1: 0xb325da3842cebabbec003fc1, limb2: 0xc0de846c16e6112, }, r0a1: u288 { limb0: 0x99309402eca08241dae4e273, limb1: 0xaa16e86224c3178f60d03bb7, limb2: 0x24cde0d47b2dcef1, }, r1a0: u288 { limb0: 0x7d47f9f43dd62a2f56442e26, limb1: 0x9d3fd5f2224d5f9a10b5bf3e, limb2: 0x1ea21619d0ac4ca7, }, r1a1: u288 { limb0: 0x945a4528b5a37c8fdf0cc9af, limb1: 0x7ad4fbe1529463b319293c35, limb2: 0xa55c48b621e6341, }, }, G2Line { r0a0: u288 { limb0: 0x88ca191d85be1f6c205257ef, limb1: 0xd0cecf5c5f80926c77fd4870, limb2: 0x16ec42b5cae83200, }, r0a1: u288 { limb0: 0x154cba82460752b94916186d, limb1: 0x564f6bebac05a4f3fb1353ac, limb2: 0x2d47a47da836d1a7, }, r1a0: u288 { limb0: 0xb39c4d6150bd64b4674f42ba, limb1: 0x93c967a38fe86f0779bf4163, limb2: 0x1a51995a49d50f26, }, r1a1: u288 { limb0: 0xeb7bdec4b7e304bbb0450608, limb1: 0x11fc9a124b8c74b3d5560ea4, limb2: 0xbfa9bd7f55ad8ac, }, }, G2Line { r0a0: u288 { limb0: 0x4f28d4247eb0e0a53f03f444, limb1: 0xe8f36708d074dd12e311c7aa, limb2: 0x1d92749e4fc01c06, }, r0a1: u288 { limb0: 0x250166cbdf943b8f355f3863, limb1: 0xc5fb4230bafe5e79ca84b40c, limb2: 0xd5d8ec40858dc7b, }, r1a0: u288 { limb0: 0xab518924ec9867879e25582a, limb1: 0x2d3857a7fcba7b3149f2102e, limb2: 0x524fec03876938c, }, r1a1: u288 { limb0: 0xf56af23dcb095ed80aa220e7, limb1: 0xb67dbb76fc439aae6b2dd36a, limb2: 0x2b6f640edeaa501d, }, }, G2Line { r0a0: u288 { limb0: 0x2fdc574c85cf0c0ce5e07a51, limb1: 0xd2439bf7b00bddc4cfb01b0c, limb2: 0x125c3bbdeb0bd2da, }, r0a1: u288 { limb0: 0x9d664714bae53cafcb5ef55d, limb1: 0x495c01724790853548f5e4de, limb2: 0x2ce5e2e263725941, }, r1a0: u288 { limb0: 0x98071eb7fe88c9124aee3774, limb1: 0xc3f66947a52bd2f6d520579f, limb2: 0x2eaf775dbd52f7d3, }, r1a1: u288 { limb0: 0x23e5594948e21db2061dca92, limb1: 0xd0ffa6f6c77290531c185431, limb2: 0x604c085de03afb1, }, }, G2Line { r0a0: u288 { limb0: 0xccbab5c7a0c5742ffa48733a, limb1: 0x23ef71f3d85c3bcf13168107, limb2: 0x2ddb1f0a6d652587, }, r0a1: u288 { limb0: 0xc28304e1eab794df6c6e2292, limb1: 0x7ec85b63501012b9d7b45342, limb2: 0x1b2d2e2c38abb2e, }, r1a0: u288 { limb0: 0xea706451e63a0b21024ffdf1, limb1: 0x138461dd2f2d3f164edfa0a3, limb2: 0x1ca4c45bdf45ca1f, }, r1a1: u288 { limb0: 0x52cb07c8413f40678dac95f1, limb1: 0xff127a91385511589a9f1879, limb2: 0x25e33c022d25bf1f, }, }, G2Line { r0a0: u288 { limb0: 0xeec2912e15f6bda39d4e005e, limb1: 0x2b8610c44d27bdbc6ba2aac5, limb2: 0x78ddc4573fc1fed, }, r0a1: u288 { limb0: 0x48099a0da11ea21de015229d, limb1: 0x5fe937100967d5cc544f4af1, limb2: 0x2c9ffe6d7d7e9631, }, r1a0: u288 { limb0: 0xa70d251296ef1ae37ceb7d03, limb1: 0x2adadcb7d219bb1580e6e9c, limb2: 0x180481a57f22fd03, }, r1a1: u288 { limb0: 0xacf46db9631037dd933eb72a, limb1: 0x8a58491815c7656292a77d29, limb2: 0x261e3516c348ae12, }, }, G2Line { r0a0: u288 { limb0: 0xccb3ff79c694e37dfd96245c, limb1: 0x22190f1ae73883eea23de9ef, limb2: 0x20a63d2ddd9170cb, }, r0a1: u288 { limb0: 0xc2d93202f4bc4125b32a040f, limb1: 0x878fad8024db67f55bb868ad, limb2: 0x19f19dfc985e42b4, }, r1a0: u288 { limb0: 0xeed43376f2c4880094eb048b, limb1: 0x8c113b83e273d1c9e467294, limb2: 0x14c7cf40ca1595d1, }, r1a1: u288 { limb0: 0x3a25b6562577b927dce53ee6, limb1: 0xd87119330d4005ed54acb4c5, limb2: 0x2eda2b2bb0c37f0e, }, }, G2Line { r0a0: u288 { limb0: 0x2bfa32f0a09c3e2cfb8f6a38, limb1: 0x7a24df3ff3c7119a59d49318, limb2: 0x10e42281d64907ba, }, r0a1: u288 { limb0: 0xce42177a66cdeb4207d11e0c, limb1: 0x3322aa425a9ca270152372ad, limb2: 0x2f7fa83db407600c, }, r1a0: u288 { limb0: 0x62a8ff94fd1c7b9035af4446, limb1: 0x3ad500601bbb6e7ed1301377, limb2: 0x254d253ca06928f, }, r1a1: u288 { limb0: 0xf8f1787cd8e730c904b4386d, limb1: 0x7fd3744349918d62c42d24cc, limb2: 0x28a05e105d652eb8, }, }, G2Line { r0a0: u288 { limb0: 0x6ef31e059d602897fa8e80a8, limb1: 0x66a0710847b6609ceda5140, limb2: 0x228c0e568f1eb9c0, }, r0a1: u288 { limb0: 0x7b47b1b133c1297b45cdd79b, limb1: 0x6b4f04ed71b58dafd06b527b, limb2: 0x13ae6db5254df01a, }, r1a0: u288 { limb0: 0xbeca2fccf7d0754dcf23ddda, limb1: 0xe3d0bcd7d9496d1e5afb0a59, limb2: 0x305a0afb142cf442, }, r1a1: u288 { limb0: 0x2d299847431477c899560ecf, limb1: 0xbcd9e6c30bedee116b043d8d, limb2: 0x79473a2a7438353, }, }, G2Line { r0a0: u288 { limb0: 0x600b4b9519e953b3ee0e8c95, limb1: 0x5521bdd3beeb7377b82d285d, limb2: 0x18d5f5e49adfcbc7, }, r0a1: u288 { limb0: 0xd5da0bb68787af76cb5c5d9f, limb1: 0x75637ba2a835852f330b73c9, limb2: 0x547e04907fd564d, }, r1a0: u288 { limb0: 0x2ee91610a62eaa46e2df5e41, limb1: 0x4326c823b5fdae59ff826534, limb2: 0x2f7f8d90704505d2, }, r1a1: u288 { limb0: 0x603491072f5e6e9336e946e6, limb1: 0xf60cf3ac408aed3af2d2e97b, limb2: 0x2eb99a813ff2d8c2, }, }, G2Line { r0a0: u288 { limb0: 0x350da7c3e0673cf3f43b36a2, limb1: 0x538deac84e666e5410d11977, limb2: 0x12cd3b832ded258, }, r0a1: u288 { limb0: 0x48f25dd2ac7a858423fb6067, limb1: 0xd065e44fc48bf19dd02adc4d, limb2: 0xb645848420703f3, }, r1a0: u288 { limb0: 0x195a790100143ea9110ceda1, limb1: 0x20b1e1e4a731d94efa584cc5, limb2: 0xf8b3a6618e4d7ce, }, r1a1: u288 { limb0: 0x614c9b88c1a7229f818fec48, limb1: 0x4c165313932d060fee7871d7, limb2: 0x2e152a41f78cb225, }, }, G2Line { r0a0: u288 { limb0: 0x65b71fe695e7ccd4b460dace, limb1: 0xa6ceba62ef334e6fe91301d5, limb2: 0x299f578d0f3554e6, }, r0a1: u288 { limb0: 0xaf781dd030a274e7ecf0cfa4, limb1: 0x2095020d373a14d7967797aa, limb2: 0x6a7f9df6f185bf8, }, r1a0: u288 { limb0: 0x8e91e2dba67d130a0b274df3, limb1: 0xe192a19fce285c12c6770089, limb2: 0x6e9acf4205c2e22, }, r1a1: u288 { limb0: 0xbcd5c206b5f9c77d667189bf, limb1: 0x656a7e2ebc78255d5242ca9, limb2: 0x25f43fec41d2b245, }, }, G2Line { r0a0: u288 { limb0: 0xb1640d670c5c42ea39c8645c, limb1: 0xa18224b68a1319ba86f825f4, limb2: 0x17d223ba44cd11d8, }, r0a1: u288 { limb0: 0x375310f6e347ed50ecfdb77f, limb1: 0x6e63ffec719272c6a7aee308, limb2: 0x12641a4735391a7d, }, r1a0: u288 { limb0: 0x5e6ca7022b2145d736b05d42, limb1: 0xf3e3c6f9b543e2e50981a13d, limb2: 0x1c6256a011a7141d, }, r1a1: u288 { limb0: 0xf19cf9a30aba1b73475bd2e1, limb1: 0xdad570fd4dfe617364253c2e, limb2: 0x1887c3b2804d9969, }, }, G2Line { r0a0: u288 { limb0: 0x4e56e6733cce20d9c5b16d96, limb1: 0xc7ef260535fb75b9d3e089f, limb2: 0x292dd4aa636e7729, }, r0a1: u288 { limb0: 0x6e7e1038b336f36519c9faaf, limb1: 0x3c66bd609510309485e225c7, limb2: 0x10cacac137411eb, }, r1a0: u288 { limb0: 0x4a3e8b96278ac092fe4f3b15, limb1: 0xba47e583e2750b42f93c9631, limb2: 0x125da6bd69495bb9, }, r1a1: u288 { limb0: 0xae7a56ab4b959a5f6060d529, limb1: 0xc3c263bfd58c0030c063a48e, limb2: 0x2f4d15f13fae788c, }, }, G2Line { r0a0: u288 { limb0: 0x301e0885c84d273b6d323124, limb1: 0x11fd5c75e269f7a30fa4154f, limb2: 0x19afdcfdcce2fc0d, }, r0a1: u288 { limb0: 0x3d13519f934526be815c38b0, limb1: 0xd43735909547da73838874fc, limb2: 0x255d8aca30f4e0f6, }, r1a0: u288 { limb0: 0x90a505b76f25a3396e2cea79, limb1: 0x3957a2d0848c54b9079fc114, limb2: 0x1ba0cd3a9fe6d4bb, }, r1a1: u288 { limb0: 0xc47930fba77a46ebb1db30a9, limb1: 0x993a1cb166e9d40bebab02b2, limb2: 0x1deb16166d48118b, }, }, G2Line { r0a0: u288 { limb0: 0x4cd552da29fd9e651de0c8e2, limb1: 0xcc66e31a0c0f35da5393e234, limb2: 0x42aae7aba0de5d3, }, r0a1: u288 { limb0: 0x4ec69646eae3453b41574b3d, limb1: 0x3600bbee129f0eb4a09e5097, limb2: 0xd759ae3f0b2e8e, }, r1a0: u288 { limb0: 0xa098f16a71c8341329b1faad, limb1: 0xb3eab89ea27edf122016c983, limb2: 0x180cc8977130fe33, }, r1a1: u288 { limb0: 0xf8c7bee62fa29f3dcd7d52e, limb1: 0xe43d14e1cb4f03890d983fc9, limb2: 0x1bbf95afef389b1c, }, }, G2Line { r0a0: u288 { limb0: 0x44e4b10ad926a88d371adac0, limb1: 0xb3b1d13d9118e162063df933, limb2: 0x21f73fdf31a07aab, }, r0a1: u288 { limb0: 0xd14093e583f58b3af5ae4db5, limb1: 0x827dd1bbff5a346179ad72b6, limb2: 0x2ebf5e6b9398b99, }, r1a0: u288 { limb0: 0x29134bd0139058c474b7afa2, limb1: 0xdca7021954756e1ac4eac6cc, limb2: 0x26f440512341e287, }, r1a1: u288 { limb0: 0x6c1e14e15abb23010dc1e33a, limb1: 0xe96c50d655a06866163356cd, limb2: 0x1f4a622ecad37469, }, }, G2Line { r0a0: u288 { limb0: 0xb15bbaec50ff49d30e49f74a, limb1: 0xc90a8c79fb045c5468f14151, limb2: 0x25e47927e92df0e3, }, r0a1: u288 { limb0: 0x57f66909d5d40dfb8c7b4d5c, limb1: 0xea5265282e2139c48c1953f2, limb2: 0x2d7f5e6aff2381f6, }, r1a0: u288 { limb0: 0x2a2f573b189a3c8832231394, limb1: 0x738abc15844895ffd4733587, limb2: 0x20aa11739c4b9bb4, }, r1a1: u288 { limb0: 0x51695ec614f1ff4cce2f65d1, limb1: 0x6765aae6cb895a2406a6dd7e, limb2: 0x1126ee431c522da0, }, }, G2Line { r0a0: u288 { limb0: 0x789cfeffdbc8dab4651b6a26, limb1: 0x9709af4c379fbf84608e067b, limb2: 0xdbc2e8191a825bf, }, r0a1: u288 { limb0: 0x86c0cc51d698fc12702f534f, limb1: 0x6888fbb5d2f53711495f5bd2, limb2: 0x2c192d6229821616, }, r1a0: u288 { limb0: 0x51c5533eb07345679f648982, limb1: 0xa08ae72cfd598899b1cfc8ac, limb2: 0x26557347bd8f0ef8, }, r1a1: u288 { limb0: 0x749300bfda23c67cefec814a, limb1: 0x8bfdcaf7b0e1774c2238299c, limb2: 0x5b310a47c2757be, }, }, G2Line { r0a0: u288 { limb0: 0x9214fc3209f1518b05fd21c6, limb1: 0x9bc8ce4f56423009710770e8, limb2: 0x32445cc6972799c, }, r0a1: u288 { limb0: 0x93ef401ecd9cfae3644d22e6, limb1: 0xce5a741a9847a144cfaf8c96, limb2: 0xf7a814d5726da4a, }, r1a0: u288 { limb0: 0xd19264d986f163b133a91c0c, limb1: 0x529dc5ce4b193c0f672c6a32, limb2: 0x2e9a118959353374, }, r1a1: u288 { limb0: 0x3d97d6e8f45072cc9e85e412, limb1: 0x4dafecb04c3bb23c374f0486, limb2: 0xa174dd4ac8ee628, }, }, G2Line { r0a0: u288 { limb0: 0xe0decaadc4a6f0ba8f9bef29, limb1: 0xedcb07e1177fa819f638157b, limb2: 0x250c15a64da6f7e5, }, r0a1: u288 { limb0: 0x95f4d7c766ce8f325a768fc6, limb1: 0x470a0797ad6c0afcfeb285a5, limb2: 0x283e4ee1041ce0ef, }, r1a0: u288 { limb0: 0x8b4de3ce49b6e957c99abaa3, limb1: 0xb3f53ce50c860f9232a19797, limb2: 0x178ba1cb5c741f25, }, r1a1: u288 { limb0: 0xd0665772d47dcae22fac6c39, limb1: 0x904d57afdd91e177f3f871fb, limb2: 0x15a3517d026d204a, }, }, G2Line { r0a0: u288 { limb0: 0x98d8b0c4adcf27bceb305c2c, limb1: 0x859afa9c7668ed6152d8cba3, limb2: 0x29e7694f46e3a272, }, r0a1: u288 { limb0: 0x1d970845365594307ba97556, limb1: 0xd002d93ad793e154afe5b49b, limb2: 0x12ca77d3fb8eee63, }, r1a0: u288 { limb0: 0x9f2934faefb8268e20d0e337, limb1: 0xbc4b5e1ec056881319f08766, limb2: 0x2e103461759a9ee4, }, r1a1: u288 { limb0: 0x7adc6cb87d6b43000e2466b6, limb1: 0x65e5cefa42b25a7ee8925fa6, limb2: 0x2560115898d7362a, }, }, G2Line { r0a0: u288 { limb0: 0xe27a38a6ce9cdfb13f9c8286, limb1: 0xeb63852dd134515d2d71cca4, limb2: 0xfc2f00d7f215816, }, r0a1: u288 { limb0: 0xfc16f37b3bc5798c84900f79, limb1: 0x83e431402739fa2dec80fe3a, limb2: 0x282a3a6c64efd070, }, r1a0: u288 { limb0: 0xa16f756a6c64bced06a5309, limb1: 0x363b474c08a16450efe71ff0, limb2: 0xa6d4ebe758d6f36, }, r1a1: u288 { limb0: 0x3982faffb05ae6b720c25980, limb1: 0xf3343c79e7656f32b7fcd2c2, limb2: 0x131f7ba1d69acc0, }, }, G2Line { r0a0: u288 { limb0: 0x64d864643668392c0e357cc4, limb1: 0x4c9bf66853f1b287015ab84c, limb2: 0x2f5f1b92ad7ee4d4, }, r0a1: u288 { limb0: 0xdc33c8da5c575eef6987a0e1, limb1: 0x51cc07c7ef28e1b8d934bc32, limb2: 0x2358d94a17ec2a44, }, r1a0: u288 { limb0: 0xf659845b829bbba363a2497b, limb1: 0x440f348e4e7bed1fb1eb47b2, limb2: 0x1ad0eaab0fb0bdab, }, r1a1: u288 { limb0: 0x1944bb6901a1af6ea9afa6fc, limb1: 0x132319df135dedddf5baae67, limb2: 0x52598294643a4aa, }, }, G2Line { r0a0: u288 { limb0: 0x76fd94c5e6f17fa6741bd7de, limb1: 0xc2e0831024f67d21013e0bdd, limb2: 0x21e2af6a43119665, }, r0a1: u288 { limb0: 0xad290eab38c64c0d8b13879b, limb1: 0xdd67f881be32b09d9a6c76a0, limb2: 0x8000712ce0392f2, }, r1a0: u288 { limb0: 0xd30a46f4ba2dee3c7ace0a37, limb1: 0x3914314f4ec56ff61e2c29e, limb2: 0x22ae1ba6cd84d822, }, r1a1: u288 { limb0: 0x5d888a78f6dfce9e7544f142, limb1: 0x9439156de974d3fb6d6bda6e, limb2: 0x106c8f9a27d41a4f, }, }, G2Line { r0a0: u288 { limb0: 0xef94f7e14e43d05d5dc2a5db, limb1: 0x4e730ef91962d53d5c144d45, limb2: 0x20c9f09ee430fc34, }, r0a1: u288 { limb0: 0xa26d6c5d462131f93142d52e, limb1: 0xddc49643f51ee6cabe8581db, limb2: 0x13752caf1cbc8d5c, }, r1a0: u288 { limb0: 0xf8c77031a63d9e67f9cc1728, limb1: 0x40ecf28120f0408a120e9543, limb2: 0x53bc5d43cd08518, }, r1a1: u288 { limb0: 0x2ff127952b99119f98242817, limb1: 0xe63c504a65debdba3a64a2a3, limb2: 0xfbcb43f42a22fa6, }, }, G2Line { r0a0: u288 { limb0: 0x630d73532bae9432978d34ff, limb1: 0xe4a093616a16f8e01725dacf, limb2: 0xd61e1e87abe2d12, }, r0a1: u288 { limb0: 0x3d565745a48f3955ef821005, limb1: 0x7cdb83651ff9aa4ef947961d, limb2: 0x7d5b56b1d0a908f, }, r1a0: u288 { limb0: 0xf25332dd3bf9a4dab863f549, limb1: 0xf99418f7ce25f482560b7701, limb2: 0x17bd8e06468f8145, }, r1a1: u288 { limb0: 0x4b0de83ffea0e589fc53d3a3, limb1: 0x96bde86047edd08f7d63568b, limb2: 0x30d5ab74cb92f3, }, }, G2Line { r0a0: u288 { limb0: 0x92c09e4796207b802168341b, limb1: 0xd2d9d6acffd7829066cc49ce, limb2: 0xc89c2d0a7b2c81e, }, r0a1: u288 { limb0: 0x47e3c1cf6cdb6f3efe778c7f, limb1: 0x66b347099b6436794cf062eb, limb2: 0x18b4ccc64ae0a857, }, r1a0: u288 { limb0: 0x7d5793606a73b2740c71484a, limb1: 0xa0070135ca2dc571b28e3c9c, limb2: 0x1bc03576e04b94cf, }, r1a1: u288 { limb0: 0x1ba85b29875e638c10f16c99, limb1: 0x158f2f2acc3c2300bb9f9225, limb2: 0x42d8a8c36ea97c6, }, }, G2Line { r0a0: u288 { limb0: 0xd97e0326411cc47c8ddf6cc0, limb1: 0xedd2060bcddeab614c518345, limb2: 0x239a5cadf3237a4c, }, r0a1: u288 { limb0: 0xcf2af0314a2d2a3bf1547087, limb1: 0x7b7e846df9427bc1372f694e, limb2: 0x8af0c75ccf976e1, }, r1a0: u288 { limb0: 0x6b595ad762f8b423178a5193, limb1: 0x878023a4a74f60fa4c38551d, limb2: 0xfe35f515dd9c4b0, }, r1a1: u288 { limb0: 0x42ef091d46c538aacf95bd37, limb1: 0xe51c322ac17cc06c2da7a4ef, limb2: 0x145b8ddb9dd19415, }, }, G2Line { r0a0: u288 { limb0: 0x9440ad13408319cecb07087b, limb1: 0x537afc0c0cfe8ff761c24e08, limb2: 0x48e4ac10081048d, }, r0a1: u288 { limb0: 0xa37fb82b03a2c0bb2aa50c4f, limb1: 0xd3797f05c8fb84f6b630dfb, limb2: 0x2dffde2d6c7e43ff, }, r1a0: u288 { limb0: 0xc55d2eb1ea953275e780e65b, limb1: 0xe141cf680cab57483c02e4c7, limb2: 0x1b71395ce5ce20ae, }, r1a1: u288 { limb0: 0xe4fab521f1212a1d301065de, limb1: 0x4f8d31c78df3dbe4ab721ef2, limb2: 0x2828f21554706a0e, }, }, G2Line { r0a0: u288 { limb0: 0x8cefc2f2af2a3082b790784e, limb1: 0x97ac13b37c6fbfc736a3d456, limb2: 0x683b1cdffd60acd, }, r0a1: u288 { limb0: 0xa266a8188a8c933dcffe2d02, limb1: 0x18d3934c1838d7bce81b2eeb, limb2: 0x206ac5cdda42377, }, r1a0: u288 { limb0: 0x90332652437f6e177dc3b28c, limb1: 0x75bd8199433d607735414ee8, limb2: 0x29d6842d8298cf7e, }, r1a1: u288 { limb0: 0xadedf46d8ea11932db0018e1, limb1: 0xbc7239ae9d1453258037befb, limb2: 0x22e7ebdd72c6f7a1, }, }, G2Line { r0a0: u288 { limb0: 0x66c7ba638481b515f47a47c, limb1: 0x65816eb626f569ff9a70086, limb2: 0x1c76016adf110695, }, r0a1: u288 { limb0: 0x199bb5ce01eed8832bffe868, limb1: 0xebc07bcbec47e8dacaccaa61, limb2: 0x300f40e8fb08f35b, }, r1a0: u288 { limb0: 0x1117803a9b699abce47fc1a8, limb1: 0x9f777c5f5e1fc6e3669c18fb, limb2: 0x1daa971b94559380, }, r1a1: u288 { limb0: 0x5eaa67a030b5bca05aa5fb15, limb1: 0x5c3219862943bebd194b2f50, limb2: 0x2adfacb421dcf6a7, }, }, G2Line { r0a0: u288 { limb0: 0x74939dcacb9e9e2b711e8447, limb1: 0xf9ad27eef11cbbc8b3ab249e, limb2: 0x11aab57aeb6656ce, }, r0a1: u288 { limb0: 0xa9f5cb1a26ce6c0257dd7da9, limb1: 0x8e135e3fac96755521af3f2c, limb2: 0x276dbb0ae508576b, }, r1a0: u288 { limb0: 0xc3cb26994a44bc35fe3619ba, limb1: 0xec35244c6c46a69c781e84ed, limb2: 0xc9c12355c7afba0, }, r1a1: u288 { limb0: 0x886847b97e3bc0b7dec24b8e, limb1: 0x3ef24e4c1bd0f2a40ec42a4f, limb2: 0x4f303d145c4a8e1, }, }, G2Line { r0a0: u288 { limb0: 0x348e15357d9299e582033136, limb1: 0x53578c46b15abb39da35a56e, limb2: 0x1043b711f86bb33f, }, r0a1: u288 { limb0: 0x9fa230a629b75217f0518e7c, limb1: 0x77012a4bb8751322a406024d, limb2: 0x121e2d845d972695, }, r1a0: u288 { limb0: 0x5600f2d51f21d9dfac35eb10, limb1: 0x6fde61f876fb76611fb86c1a, limb2: 0x2bf4fbaf5bd0d0df, }, r1a1: u288 { limb0: 0xd732aa0b6161aaffdae95324, limb1: 0xb3c4f8c3770402d245692464, limb2: 0x2a0f1740a293e6f0, }, }, G2Line { r0a0: u288 { limb0: 0x5ee47e2aec7d88c58896ef36, limb1: 0x894bd20abe674c0208e35a93, limb2: 0x1a42417dc0038755, }, r0a1: u288 { limb0: 0x8bba265a6ba9c5bd6c17788d, limb1: 0x43709c02f70bc99b6d6927cb, limb2: 0xb456dc8d4bbbd49, }, r1a0: u288 { limb0: 0x368d2f5f3940fe781a54de5c, limb1: 0x611afd760bcdd16d7e5098fd, limb2: 0x2602a5e773cb12a0, }, r1a1: u288 { limb0: 0x70b8eaf8db4b85dec76261af, limb1: 0xd8b6dbb7ad62764263175efc, limb2: 0x27797f327aa59ac1, }, }, G2Line { r0a0: u288 { limb0: 0xa9e2efa41aaa98ab59728940, limb1: 0x163c0425f66ce72daef2f53e, limb2: 0x2feaf1b1770aa7d8, }, r0a1: u288 { limb0: 0x3bb7afd3c0a79b6ac2c4c063, limb1: 0xee5cb42e8b2bc999e312e032, limb2: 0x1af2071ae77151c3, }, r1a0: u288 { limb0: 0x1cef1c0d8956d7ceb2b162e7, limb1: 0x202b4af9e51edfc81a943ded, limb2: 0xc9e943ffbdcfdcb, }, r1a1: u288 { limb0: 0xe18b1b34798b0a18d5ad43dd, limb1: 0x55e8237731941007099af6b8, limb2: 0x1472c0290db54042, }, }, G2Line { r0a0: u288 { limb0: 0x91080fd5aaedc517d9cd2fa, limb1: 0x3edc290fc4568f8f972c94a6, limb2: 0x2535859135a1ab3a, }, r0a1: u288 { limb0: 0x626ef15bd0158b028321fabc, limb1: 0x511811c5a645349dc6e8c96, limb2: 0x5ea2a954421df52, }, r1a0: u288 { limb0: 0x532b1df5972f804688da2382, limb1: 0x1eb61d485a40951340c80738, limb2: 0x2a8354857d28abef, }, r1a1: u288 { limb0: 0x9b597bfbeec11cc3e137309f, limb1: 0xe36ae879e4cd9dd54c6daee4, limb2: 0x1408ffb495b57485, }, }, G2Line { r0a0: u288 { limb0: 0xb4c7963e0d1dc082de0725e, limb1: 0x375a7a3d765918de24804223, limb2: 0xf177b77b031596d, }, r0a1: u288 { limb0: 0x87a7b9c5f10500b0b40d7a1e, limb1: 0x6f234d1dc7f1394b55858810, limb2: 0x26288146660a3914, }, r1a0: u288 { limb0: 0xa6308c89cebe40447abf4a9a, limb1: 0x657f0fdda13b1f8ee314c22, limb2: 0x1701aabc250a9cc7, }, r1a1: u288 { limb0: 0x9db9bf660dc77cbe2788a755, limb1: 0xbdf9c1c15a4bd502a119fb98, limb2: 0x14b4de3d26bd66e1, }, }, G2Line { r0a0: u288 { limb0: 0x53c49c62ca96007e14435295, limb1: 0x85aeb885e4123ca8d3232fdf, limb2: 0x750017ce108abf3, }, r0a1: u288 { limb0: 0xba6bf3e25d370182e4821239, limb1: 0x39de83bf370bd2ba116e8405, limb2: 0x2b8417a72ba6d940, }, r1a0: u288 { limb0: 0xa922f50550d349849b14307b, limb1: 0x569766b6feca6143a5ddde9d, limb2: 0x2c3c6765b25a01d, }, r1a1: u288 { limb0: 0x6016011bdc3b506563b0f117, limb1: 0xbab4932beab93dde9b5b8a5c, limb2: 0x1bf3f698de0ace60, }, }, G2Line { r0a0: u288 { limb0: 0x11925aacbbb5a16eea984791, limb1: 0xbd44a32451e02b8dd9f93e3e, limb2: 0x283613cb34ee08bc, }, r0a1: u288 { limb0: 0x3bcfcf29d56dda88972d2e0d, limb1: 0x6378f8cff10778665c7e0431, limb2: 0x252094f8a37eb910, }, r1a0: u288 { limb0: 0x3953dbc38e645187bfc5ddab, limb1: 0xfe6c4a8af9eeb0cffcd42f62, limb2: 0x298a4e0b8e41a39e, }, r1a1: u288 { limb0: 0x50df906117b055421a37fee6, limb1: 0x1bcce56c872adfa5e9664632, limb2: 0x26a263c500419a69, }, }, G2Line { r0a0: u288 { limb0: 0xe1aad2fb2c3aa84b9a6beede, limb1: 0x656ebc5334eace7fe81e6f1, limb2: 0xe5a68ce75fd9809, }, r0a1: u288 { limb0: 0x6e38dd74d56cc193ab28c18d, limb1: 0x489b415a49586e4213e4cab4, limb2: 0x4b5ae00bb5fb138, }, r1a0: u288 { limb0: 0x710bb610c2843aa686ba9adb, limb1: 0x4035dfa11017ac938fb7892d, limb2: 0x457e16957861fe5, }, r1a1: u288 { limb0: 0x61849b4cb86ead8d7c3d94f1, limb1: 0x518f095dd852d4beac73d260, limb2: 0x1d7fa08317c2a29, }, }, G2Line { r0a0: u288 { limb0: 0xb9f05ffda3ee208f990ff3a8, limb1: 0x6201d08440b28ea672b9ea93, limb2: 0x1ed60e5a5e778b42, }, r0a1: u288 { limb0: 0x8e8468b937854c9c00582d36, limb1: 0x7888fa8b2850a0c555adb743, limb2: 0xd1342bd01402f29, }, r1a0: u288 { limb0: 0xf5c4c66a974d45ec754b3873, limb1: 0x34322544ed59f01c835dd28b, limb2: 0x10fe4487a871a419, }, r1a1: u288 { limb0: 0xedf4af2df7c13d6340069716, limb1: 0x8592eea593ece446e8b2c83b, limb2: 0x12f9280ce8248724, }, }, G2Line { r0a0: u288 { limb0: 0x560d1b6e56d813240424b220, limb1: 0x78cb46b213324960bc655587, limb2: 0x179c996c56c57046, }, r0a1: u288 { limb0: 0x83a2ba9b9558fad3cde16856, limb1: 0x391e9dc2ffb59f519ae1d2b3, limb2: 0x121abd4bd4ae70f1, }, r1a0: u288 { limb0: 0x90bb5fac7393b89ce8774706, limb1: 0xe528a21777490d65bbb2a59, limb2: 0x17649453b4e6f63f, }, r1a1: u288 { limb0: 0xa19760f6b2fff23302d184b9, limb1: 0x4a5200e9c1f545101ae7368f, limb2: 0x8a9b7df65fb2553, }, }, G2Line { r0a0: u288 { limb0: 0xe67f72c6d45f1bb04403139f, limb1: 0x9233e2a95d3f3c3ff2f7e5b8, limb2: 0x1f931e8e4343b028, }, r0a1: u288 { limb0: 0x20ef53907af71803ce3ca5ca, limb1: 0xd99b6637ee9c73150b503ea4, limb2: 0x1c9759def8a98ea8, }, r1a0: u288 { limb0: 0xa0a3b24c9089d224822fad53, limb1: 0xdfa2081342a7a895062f3e50, limb2: 0x185e8cf6b3e494e6, }, r1a1: u288 { limb0: 0x8752a12394b29d0ba799e476, limb1: 0x1493421da067a42e7f3d0f8f, limb2: 0x67e7fa3e3035edf, }, }, G2Line { r0a0: u288 { limb0: 0x9d2e2392b2116806c3c64bea, limb1: 0xbc4c1ea53ab2140ee4675a09, limb2: 0x10ce261919b09742, }, r0a1: u288 { limb0: 0xf14f468e5ab675c5fc2db1de, limb1: 0x75de3f46adfc7aba3ce6f8f6, limb2: 0x2bfcacc6c8f0370a, }, r1a0: u288 { limb0: 0xa138d127e5eb4d3aa9e483f7, limb1: 0x44836fa24f3f8db5aa663f2f, limb2: 0x12a4a7236c8b0338, }, r1a1: u288 { limb0: 0xd6fdaced0679398f5aefc808, limb1: 0x41971bc9ddff0109a6d83fb3, limb2: 0x1a11d202adb75ba9, }, }, G2Line { r0a0: u288 { limb0: 0x6d6138c95464e5e774ae7ba0, limb1: 0xe6ca73a5498e4ccd4bb68fc7, limb2: 0x15bf8aa8ed1beff6, }, r0a1: u288 { limb0: 0xabd7c55a134ed405b4966d3c, limb1: 0xe69dd725ccc4f9dd537fe558, limb2: 0x2df4a03e2588a8f1, }, r1a0: u288 { limb0: 0x7cf42890de0355ffc2480d46, limb1: 0xe33c2ad9627bcb4b028c2358, limb2: 0x2a18767b40de20bd, }, r1a1: u288 { limb0: 0x79737d4a87fab560f3d811c6, limb1: 0xa88fee5629b91721f2ccdcf7, limb2: 0x2b51c831d3404d5e, }, }, G2Line { r0a0: u288 { limb0: 0x9c6a908d0b5cceccb463a4e5, limb1: 0xde65283103f2cb5e00e981d0, limb2: 0x2e94465a4f7f92d5, }, r0a1: u288 { limb0: 0x1ce77bed9f2198292f766f43, limb1: 0x8a65ff87da43dd4b4620ff1, limb2: 0xa93dc2061770b84, }, r1a0: u288 { limb0: 0xd4fee00640a18279b3b99d6d, limb1: 0xcbfac423ce971d800796de34, limb2: 0x69fab7bbec03f8d, }, r1a1: u288 { limb0: 0xdb42c8aa3f576a04e6740b62, limb1: 0xc6c8a94fd3bf4e501d88ab20, limb2: 0x1b918d10cac3a421, }, }, G2Line { r0a0: u288 { limb0: 0x9812f6145cf7e949fa207f20, limb1: 0x4061c36b08d5bcd408b14f19, limb2: 0x8332e08b2eb51ed, }, r0a1: u288 { limb0: 0xa4a7ae8f65ba180c523cb33, limb1: 0xb71fabbdc78b1128712d32a5, limb2: 0x2acd1052fd0fefa7, }, r1a0: u288 { limb0: 0x6ea5598e221f25bf27efc618, limb1: 0xa2c2521a6dd8f306f86d6db7, limb2: 0x13af144288655944, }, r1a1: u288 { limb0: 0xea469c4b390716a6810fff5d, limb1: 0xf8052694d0fdd3f40b596c20, limb2: 0x24d0ea6c86e48c5c, }, }, G2Line { r0a0: u288 { limb0: 0x2e39be614d904bafea58a8cd, limb1: 0xf53f0a6a20a1f1783b0ea2d0, limb2: 0x99c451b7bb726d7, }, r0a1: u288 { limb0: 0x28ec54a4ca8da838800c573d, limb1: 0xb78365fa47b5e192307b7b87, limb2: 0x2df87aa88e012fec, }, r1a0: u288 { limb0: 0xfb7022881c6a6fdfb18de4aa, limb1: 0xb9bd30f0e93c5b93ad333bab, limb2: 0x1dd20cbccdeb9924, }, r1a1: u288 { limb0: 0x16d8dfdf790a6be16a0e55ba, limb1: 0x90ab884395509b9a264472d4, limb2: 0xeaec571657b6e9d, }, }, G2Line { r0a0: u288 { limb0: 0xaf4fdd1b70eabcd772d77aa1, limb1: 0xc88a9826c1e8212a26e0430d, limb2: 0x203f7c97e4a936aa, }, r0a1: u288 { limb0: 0xe2f0c2ac8588b3fa35eb69db, limb1: 0x9bdff7e3611ef6dbded516b4, limb2: 0x301305ee3abf1df8, }, r1a0: u288 { limb0: 0xdc0fa9fcb28f71f07f9f23ee, limb1: 0x1145e7453873b8c7d35aa6c2, limb2: 0x6031f980cdf1d85, }, r1a1: u288 { limb0: 0x3050ba620d13a3ad894b2ce8, limb1: 0xe82eaab452c4c0a973f4d11d, limb2: 0x66de04fb2119c6f, }, }, G2Line { r0a0: u288 { limb0: 0x6c5b064e3183ed4bd22126b0, limb1: 0x207825012a83cbe1cf0ece60, limb2: 0x20721baaf24053f9, }, r0a1: u288 { limb0: 0x1142829a0afaf2b457220e6, limb1: 0x9bd5bf8bdeccec5ad7930329, limb2: 0x48227f6b84c3faa, }, r1a0: u288 { limb0: 0xba19284d0535c775b1bcc0bf, limb1: 0xcb888ba30fb7151496773d0d, limb2: 0x198d7753b2b23cab, }, r1a1: u288 { limb0: 0x5c4ec7550d765e8206535706, limb1: 0x56764841e2adda1dacf343c2, limb2: 0x190bf2077e521671, }, }, G2Line { r0a0: u288 { limb0: 0xce78fc6505db036c10fac771, limb1: 0x61f8c0bc7f60ad6415d5e419, limb2: 0x59009c5cf9ea663, }, r0a1: u288 { limb0: 0xb3b3f697fc34d64ba053b914, limb1: 0x317af5815ce5bfffc5a6bc97, limb2: 0x23f97fee4deda847, }, r1a0: u288 { limb0: 0xf559e09cf7a02674ac2fa642, limb1: 0x4fa7548b79cdd054e203689c, limb2: 0x2173b379d546fb47, }, r1a1: u288 { limb0: 0x758feb5b51caccff9da0f78f, limb1: 0xd7f37a1008233b74c4894f55, limb2: 0x917c640b4b9627e, }, }, G2Line { r0a0: u288 { limb0: 0x44238d6942472eaaaa3c0148, limb1: 0x423cad960738a7343451af0a, limb2: 0x6d7ac995669fbe6, }, r0a1: u288 { limb0: 0x21d741021875ef3da0560516, limb1: 0x3680532e586a90e40215d90e, limb2: 0x1b91e2d44c10969a, }, r1a0: u288 { limb0: 0x35753f4be838d08ac282e162, limb1: 0x9cc59d882fa9d2c39d2ac29d, limb2: 0x68249cbe65852ed, }, r1a1: u288 { limb0: 0x33f63b6378843d4aa5d24138, limb1: 0xc55953e8ba9dda553c73f3ba, limb2: 0x17f2ff3634a5ca7, }, }, G2Line { r0a0: u288 { limb0: 0x72548e0d946b796842cfecd8, limb1: 0x78b54b355e3c26476b0fab82, limb2: 0x2dc9f32c90b6ba31, }, r0a1: u288 { limb0: 0xa943be83a6fc90414320753b, limb1: 0xd708fde97241095833ce5a08, limb2: 0x142111e6a73d2e82, }, r1a0: u288 { limb0: 0xc79e8d5465ec5f28781e30a2, limb1: 0x697fb9430b9ad050ced6cce, limb2: 0x1a9d647149842c53, }, r1a1: u288 { limb0: 0x9bab496952559362586725cd, limb1: 0xbe78e5a416d9665be64806de, limb2: 0x147b550afb4b8b84, }, }, G2Line { r0a0: u288 { limb0: 0x9e86dd914a2f547b23018fed, limb1: 0xf7705b16ccf6e1f5eb2c0ab3, limb2: 0x393f6b3257d8b29, }, r0a1: u288 { limb0: 0x501fcdb81a813fe07121b423, limb1: 0x87f73c02d3918e27053880f5, limb2: 0x5250523c8eefc8e, }, r1a0: u288 { limb0: 0xb92c92400b5ff996ac4cb9d8, limb1: 0xa121f8c7742792c161dc87fa, limb2: 0x1ee9797cbb430d7f, }, r1a1: u288 { limb0: 0x4db126149d0e1ee2fe5cb1b6, limb1: 0x7e31c6486612929a0807aa58, limb2: 0x5fa8f994639085b, }, }, G2Line { r0a0: u288 { limb0: 0x1422e11013fe6cdd7f843391, limb1: 0xfb96092ab69fc530e27d8d8e, limb2: 0xe39e04564fedd0, }, r0a1: u288 { limb0: 0xbd4e81e3b4db192e11192788, limb1: 0x805257d3c2bdbc344a15ce0d, limb2: 0x10ddd4f47445106b, }, r1a0: u288 { limb0: 0x87ab7f750b693ec75bce04e1, limb1: 0x128ba38ebed26d74d26e4d69, limb2: 0x2f1d22a64c983ab8, }, r1a1: u288 { limb0: 0x74207c17f5c8335183649f77, limb1: 0x7144cd3520ac2e1be3204133, limb2: 0xb38d0645ab3499d, }, }, G2Line { r0a0: u288 { limb0: 0xcceab2ae34bc8360cb9c77f0, limb1: 0xebd0f65b0fe57d753fcf82c0, limb2: 0x27251ea468d295d5, }, r0a1: u288 { limb0: 0xd384a0823772729f248e788b, limb1: 0xbb40fc3eea3543a92de84fd2, limb2: 0x28d3f25248c1dad, }, r1a0: u288 { limb0: 0xddf52b578bca93a0312499e, limb1: 0x31354bfce389ece001a328fb, limb2: 0xa6e91740fcee43f, }, r1a1: u288 { limb0: 0x8aa8d994bf9d2cdbdcee738, limb1: 0x1989e823e5c2ae514e38943a, limb2: 0x255d5d5428a217eb, }, }, G2Line { r0a0: u288 { limb0: 0x49173a889c697b0ab07f35bc, limb1: 0xdcffb65f4b4c21ced6b623af, limb2: 0x1366d12ee6022f7b, }, r0a1: u288 { limb0: 0x285fdce362f7a79b89c49b5c, limb1: 0xae9358c8eaf26e2fed7353f5, limb2: 0x21c91fefaf522b5f, }, r1a0: u288 { limb0: 0x748798f96436e3b18c64964a, limb1: 0xfc3bb221103d3966d0510599, limb2: 0x167859ae2ebc5e27, }, r1a1: u288 { limb0: 0xe3b55b05bb30e23fa7eba05b, limb1: 0xa5fc8b7f7bc6abe91c90ddd5, limb2: 0xe0da83c6cdebb5a, }, }, G2Line { r0a0: u288 { limb0: 0x30a4abff5957209783681bfb, limb1: 0x82d868d5ca421e4f1a0daf79, limb2: 0x1ba96ef98093d510, }, r0a1: u288 { limb0: 0xd9132c7f206a6c036a39e432, limb1: 0x8a2dfb94aba29a87046110b8, limb2: 0x1fad2fd5e5e37395, }, r1a0: u288 { limb0: 0x76b136dc82b82e411b2c44f6, limb1: 0xe405f12052823a54abb9ea95, limb2: 0xf125ba508c26ddc, }, r1a1: u288 { limb0: 0x1bae07f5f0cc48e5f7aac169, limb1: 0x47d1288d741496a960e1a979, limb2: 0xa0911f6cc5eb84e, }, }, G2Line { r0a0: u288 { limb0: 0x2cedd7b822bb6d72c59dfa7a, limb1: 0x84c3a618db0cf89ec14e5fb5, limb2: 0x2a032b4f9f60bfc7, }, r0a1: u288 { limb0: 0x250e463f1e3d31dce9c37bf, limb1: 0x69d332c194b3ce930a4150e2, limb2: 0x2347156daafd5e1a, }, r1a0: u288 { limb0: 0x4e97ff927721598da12e31ec, limb1: 0x8042e8a2b014700940b5264e, limb2: 0x183c0e81cc372ab3, }, r1a1: u288 { limb0: 0x83eba063918614c4121b187, limb1: 0x75f40ab2be04a52fb200b36f, limb2: 0x5f483746bdaece2, }, }, G2Line { r0a0: u288 { limb0: 0xfe150b2512bf45c64901f12, limb1: 0xdd621a49d53caad574afcf5a, limb2: 0x1ec7fbdca257edad, }, r0a1: u288 { limb0: 0xa3468b881959338092d60e19, limb1: 0xc9d96474e9832f464a4115c4, limb2: 0x1dd7fd2ab01107b4, }, r1a0: u288 { limb0: 0x28bfd0fc73f328af71c3b254, limb1: 0x74bd6697ffcf7920a2c9b1a5, limb2: 0x2001688da3f94c7e, }, r1a1: u288 { limb0: 0x8c3527564c0a00f1f16fb0c2, limb1: 0xed1d021d7a4787e888cb997b, limb2: 0xd9e4de1708c9a91, }, }, G2Line { r0a0: u288 { limb0: 0x2e7b3a5a35456f42e87968e6, limb1: 0xb4303f5093c3a460674a2fcd, limb2: 0x2b5331f03b8fa15f, }, r0a1: u288 { limb0: 0x7cea371d64d8bd0fc5b9427e, limb1: 0x76208e15fc175e352c274fbe, limb2: 0x5ceb46647d41234, }, r1a0: u288 { limb0: 0x6cdac06bfcf041a30435a560, limb1: 0x15a7ab7ed1df6d7ed12616a6, limb2: 0x2520b0f462ad4724, }, r1a1: u288 { limb0: 0xe8b65c5fff04e6a19310802f, limb1: 0xc96324a563d5dab3cd304c64, limb2: 0x230de25606159b1e, }, }, G2Line { r0a0: u288 { limb0: 0xf953e7f8e47ce2feb7e3331c, limb1: 0xbb5cbf05aeba907f3a605f71, limb2: 0x73d64f13e358043, }, r0a1: u288 { limb0: 0xdf7e97bb7b23c267a9715500, limb1: 0x14a6f0edaf642eac5e0cbcd2, limb2: 0x21b655eb924818ce, }, r1a0: u288 { limb0: 0x4de920901bce2e75be780d7a, limb1: 0x887987f8923a8866847f7dcc, limb2: 0x1e427aaef5e99b1, }, r1a1: u288 { limb0: 0x407881b650e281edadf6da62, limb1: 0x4e126117bdced59d7ecc3971, limb2: 0x212f38388dc96cc2, }, }, G2Line { r0a0: u288 { limb0: 0xb2236e5462d1e11842039bb5, limb1: 0x8d746dd0bb8bb2a455d505c1, limb2: 0x2fd3f4a905e027ce, }, r0a1: u288 { limb0: 0x3d6d9836d71ddf8e3b741b09, limb1: 0x443f16e368feb4cb20a5a1ab, limb2: 0xb5f19dda13bdfad, }, r1a0: u288 { limb0: 0x4e5612c2b64a1045a590a938, limb1: 0xbca215d075ce5769db2a29d7, limb2: 0x161e651ebdfb5065, }, r1a1: u288 { limb0: 0xc02a55b6685351f24e4bf9c7, limb1: 0x4134240119050f22bc4991c8, limb2: 0x300bd9f8d76bbc11, }, }, G2Line { r0a0: u288 { limb0: 0xe9296a3a3aed4c4143d2e0ba, limb1: 0x7de973514b499b2da739b3e6, limb2: 0x1b4b807986fcdee0, }, r0a1: u288 { limb0: 0xb9295fecce961afe0c5e6dad, limb1: 0xc4e30c322bcae6d526c4de95, limb2: 0x1fee592f513ed6b2, }, r1a0: u288 { limb0: 0x7245f5e5e803d0d448fafe21, limb1: 0xcbdc032ecb3b7a63899c53d0, limb2: 0x1fde9ffc17accfc3, }, r1a1: u288 { limb0: 0x8edcc1b2fdd35c87a7814a87, limb1: 0x99d54b5c2fe171c49aa9cb08, limb2: 0x130ef740e416a6fe, }, }, G2Line { r0a0: u288 { limb0: 0xf75ee16c01ae962ee2ba9a3, limb1: 0x2035c9157b0caf951219f921, limb2: 0x713e4b2a45dc294, }, r0a1: u288 { limb0: 0xbf4694f5ae7772c7305a7859, limb1: 0xf3c0d398bd086f2459e692d, limb2: 0x2866975b159e1ca4, }, r1a0: u288 { limb0: 0xedc381f2352b0c387c45f492, limb1: 0x9023cfa067a8b300149e0b81, limb2: 0x1d2ded23f6b7f2ad, }, r1a1: u288 { limb0: 0x316a42f51539cd79f7d118aa, limb1: 0x84ab6dd38b05c1b031210896, limb2: 0x2258ebc39bd5474a, }, }, G2Line { r0a0: u288 { limb0: 0x7c2064c324eb0e930d764c1d, limb1: 0x99228fa2e629a94bfdf42f3f, limb2: 0x272dd78d94c01250, }, r0a1: u288 { limb0: 0x4ee36a1f37c4689c1996029e, limb1: 0x9f03d366c3af0d7d8b7e94be, limb2: 0x1099dace57e00d7a, }, r1a0: u288 { limb0: 0xe67ce9c7f6c61221b32698cc, limb1: 0xbfa5ff997788d812a83ff6f3, limb2: 0xc8a9303dbb80ebd, }, r1a1: u288 { limb0: 0x65f9ae631279f79bf59a3c46, limb1: 0xc5dd2a6c8a8b6bbb78abd671, limb2: 0x1a40c95acd75de89, }, }, G2Line { r0a0: u288 { limb0: 0x537ecf0916b38aeea21d4e47, limb1: 0x181a00de27ba4be1b380d6c8, limb2: 0x8c2fe2799316543, }, r0a1: u288 { limb0: 0xe68fff5ee73364fff3fe403b, limb1: 0x7b8685c8a725ae79cfac8f99, limb2: 0x7b4be349766aba4, }, r1a0: u288 { limb0: 0xdf7c93c0095545ad5e5361ea, limb1: 0xce316c76191f1e7cd7d03f3, limb2: 0x22ea21f18ddec947, }, r1a1: u288 { limb0: 0xa19620b4c32db68cc1c2ef0c, limb1: 0xffa1e4be3bed5faba2ccbbf4, limb2: 0x16fc78a64c45f518, }, }, G2Line { r0a0: u288 { limb0: 0x2b6af476f520b4bf804415bc, limb1: 0xd949ee7f9e8874698b090fca, limb2: 0x34db5e5ec2180cf, }, r0a1: u288 { limb0: 0x3e06a324f038ac8abcfb28d7, limb1: 0xc2e6375b7a83c0a0145f8942, limb2: 0x2247e79161483763, }, r1a0: u288 { limb0: 0x708773d8ae3a13918382fb9d, limb1: 0xaf83f409556e32aa85ae92bf, limb2: 0x9af0a924ae43ba, }, r1a1: u288 { limb0: 0xa6fded212ff5b2ce79755af7, limb1: 0x55a2adfb2699ef5de6581b21, limb2: 0x2476e83cfe8daa5c, }, }, G2Line { r0a0: u288 { limb0: 0x5492a3af17b50935147c96c3, limb1: 0xdb9e5016a9bf37e1d190de7f, limb2: 0x118c52b66aa91af5, }, r0a1: u288 { limb0: 0x383ff10030da0a1de2b199ff, limb1: 0x87473c4982f35e30348edcd8, limb2: 0x7b7841e2d12de72, }, r1a0: u288 { limb0: 0x5becb840142c3a612e4e9fb5, limb1: 0x395ed9a8e637d790717ea70a, limb2: 0x3075d6374c8e247, }, r1a1: u288 { limb0: 0x18d5882f3227369868fb1c0d, limb1: 0x8d839bdccca10b584bd1cfb8, limb2: 0x1d3ed3be5b633848, }, }, G2Line { r0a0: u288 { limb0: 0x2c12ab2f338cca45640fedfb, limb1: 0x41502b84b9a66e10102be299, limb2: 0x19dbe91c50592fb, }, r0a1: u288 { limb0: 0x343be7cac3ad44182acb33fa, limb1: 0xf3aa251c1a310cd439e988c, limb2: 0x1138da1418252cd, }, r1a0: u288 { limb0: 0xe7a3c13336a3bd1ce8bb3bb7, limb1: 0x502e66f432b52caca3602ad5, limb2: 0x17e6f3b7bc285d9, }, r1a1: u288 { limb0: 0x2b93c79b052f469f471affd1, limb1: 0xeaf5be1f527545bbb7a3adb3, limb2: 0x8ce6d14105d6914, }, }, G2Line { r0a0: u288 { limb0: 0x1c4759bcf7c607fe3f839d4d, limb1: 0xea91f311da73327e2ed40785, limb2: 0x2017052c72360f42, }, r0a1: u288 { limb0: 0x38cf8a4368c0709980199fc3, limb1: 0xfc9047885996c19e84d7d4ea, limb2: 0x1795549eb0b97783, }, r1a0: u288 { limb0: 0xb70f7ecfbec0eaf46845e8cc, limb1: 0x9ddf274c2a9f89ea3bc4d66f, limb2: 0xcc6f106abfcf377, }, r1a1: u288 { limb0: 0xf6ff11ce29186237468c2698, limb1: 0x5c629ad27bb61e4826bb1313, limb2: 0x2014c6623f1fb55e, }, }, G2Line { r0a0: u288 { limb0: 0xd1656f114bf3af72715dce80, limb1: 0x3924b0610de00ad47aab618b, limb2: 0xdaf00e1541db71b, }, r0a1: u288 { limb0: 0xb3da842bd6ed2cea6a87db4, limb1: 0x58009f786c9b9e946837049b, limb2: 0x10ec13144c9e560e, }, r1a0: u288 { limb0: 0x9a584d0f409607603126ee10, limb1: 0x1fa1a9bc1885cf6833992a19, limb2: 0x2c1aa3312c27750f, }, r1a1: u288 { limb0: 0x5f0eefa5064d95ff567b056e, limb1: 0xc9e066a9811570706974d0e2, limb2: 0x51ad56ec3cb6b21, }, }, G2Line { r0a0: u288 { limb0: 0xc648054e4b6134bbfd68487f, limb1: 0xdf0506dad3f3d098c13a6386, limb2: 0x26bebeb6f46c2e8c, }, r0a1: u288 { limb0: 0x9d0cdb28a94204776c6e6ba6, limb1: 0x303f02dfe619752b1607951d, limb2: 0x1127d8b17ef2c064, }, r1a0: u288 { limb0: 0xe34ca1188b8db4e4694a696c, limb1: 0x243553602481d9b88ca1211, limb2: 0x1f8ef034831d0132, }, r1a1: u288 { limb0: 0xe3a5dfb1785690dad89ad10c, limb1: 0xd690b583ace24ba033dd23e0, limb2: 0x405d0709e110c03, }, }, G2Line { r0a0: u288 { limb0: 0x464e5f2bfc2c82c54b03961, limb1: 0x951289dda0d75515cf27d76f, limb2: 0x18624def97e8d755, }, r0a1: u288 { limb0: 0x5f34b49ccba30273ef5b21d3, limb1: 0x2a5284c7f0a2edbd91cffc38, limb2: 0x152ee08fed176eb9, }, r1a0: u288 { limb0: 0x754bde9c6963db1bd70f1b6c, limb1: 0xdcd8ae0734741dc7f4c0963d, limb2: 0x1bdcdd889e8b7986, }, r1a1: u288 { limb0: 0xc256707edf7a02779c5570dd, limb1: 0x4e462d0c425dc89184d0d1e, limb2: 0x10a877ec918e3670, }, }, G2Line { r0a0: u288 { limb0: 0x72cc2cef2785ce4ff4e9b7af, limb1: 0x60ed5b9c207d7f31fb6234ab, limb2: 0x1bb17a4bc7b643ed, }, r0a1: u288 { limb0: 0x9424eb15b502cde7927c7530, limb1: 0xa0e33edbbaa9de8e9c206059, limb2: 0x2b9a3a63bbf4af99, }, r1a0: u288 { limb0: 0x423811cb6386e606cf274a3c, limb1: 0x8adcc0e471ecfe526f56dc39, limb2: 0x9169a8660d14368, }, r1a1: u288 { limb0: 0xf616c863890c3c8e33127931, limb1: 0xcc9414078a6da6989dae6b91, limb2: 0x594d6a7e6b34ab2, }, }, G2Line { r0a0: u288 { limb0: 0x6a5715d35321ab7e2303801a, limb1: 0xb3a10a033b8af85876120d84, limb2: 0x12a279df5f1f2e80, }, r0a1: u288 { limb0: 0x280110399cdfd7e0a95aaf62, limb1: 0xeaa755ebaf7edec0629ff916, limb2: 0x50373a52da2ad5f, }, r1a0: u288 { limb0: 0x835e28ff4627911ddd0ba983, limb1: 0x975aef2b304e4200963bd7e3, limb2: 0x2cfb54689f69ce06, }, r1a1: u288 { limb0: 0xf3002234938e41787edf31bd, limb1: 0x596978afc835ba1b55a81785, limb2: 0x6bd7658f61e8020, }, }, G2Line { r0a0: u288 { limb0: 0xf2d619ae78049bf9141c35cf, limb1: 0x717f8b10d469a1ee2d91f191, limb2: 0x2c72c82fa8afe345, }, r0a1: u288 { limb0: 0xb89321223b82a2dc793c0185, limb1: 0x71506a0cf4adb8e51bb7b759, limb2: 0x2c13b92a98651492, }, r1a0: u288 { limb0: 0x4947ef2c89276f77f9d20942, limb1: 0xb454d68685ab6b6976e71ec5, limb2: 0x19a938d0e78a3593, }, r1a1: u288 { limb0: 0xbe883eb119609b489c01c905, limb1: 0xaa06779922047f52feac5ce6, limb2: 0x76977a3015dc164, }, }, G2Line { r0a0: u288 { limb0: 0x43a96a588005043a46aadf2c, limb1: 0xa37b89d8a1784582f0c52126, limb2: 0x22e9ef3f5d4b2297, }, r0a1: u288 { limb0: 0x8c6f6d8474cf6e5a58468a31, limb1: 0xeb1ce6ac75930ef1c79b07e5, limb2: 0xf49839a756c7230, }, r1a0: u288 { limb0: 0x82b84693a656c8e8c1f962fd, limb1: 0x2c1c8918ae80282208b6b23d, limb2: 0x14d3504b5c8d428f, }, r1a1: u288 { limb0: 0x60ef4f4324d5619b60a3bb84, limb1: 0x6d3090caefeedbc33638c77a, limb2: 0x159264c370c89fec, }, }, G2Line { r0a0: u288 { limb0: 0x9b53ea01ae2d6587ef6469bf, limb1: 0x51d2d907815a064277b460d3, limb2: 0x130bfb2966bccfcf, }, r0a1: u288 { limb0: 0x628e9808d554d47dd88c80f5, limb1: 0xc7b44de52f919e749a8af471, limb2: 0xf6a26faf4aee11a, }, r1a0: u288 { limb0: 0x73ce5d8301bbc53ee6e8239f, limb1: 0x31b030a8af445bd7d8e95c79, limb2: 0x295f54e9eb9fba58, }, r1a1: u288 { limb0: 0x535dbb6d10b88b2fd30f0c23, limb1: 0xa016d54da5f9a46174614196, limb2: 0x10dfe73e58fcb4bd, }, }, G2Line { r0a0: u288 { limb0: 0x652eaf09821887db0de1f147, limb1: 0x75229b9972e31ba2e226bbcf, limb2: 0x161e5e72bf925c6d, }, r0a1: u288 { limb0: 0x856aa774394ef561669d1eab, limb1: 0xdd46a5dd8e6c4d775d36356d, limb2: 0x2d287f12b2a6700d, }, r1a0: u288 { limb0: 0x67ffd864a18bb2d4488c5d6a, limb1: 0x8d0ea9ad86d841741fe1d284, limb2: 0x43189ddb2f1e1cd, }, r1a1: u288 { limb0: 0xf42602a91d620c7003644ce4, limb1: 0x7d9f27e32a63153af2c65415, limb2: 0x1ee85832249a6300, }, }, ]; ================================================ FILE: src/contracts/autogenerated/risc0_verifier_bn254/src/lib.cairo ================================================ // Generated by Garaga version 1.1.0 pub mod groth16_verifier; pub mod groth16_verifier_constants; ================================================ FILE: src/contracts/autogenerated/risc0_verifier_bn254/tests/proof_calldata.txt ================================================ 0x9ba602b4ce8728dc9e2eafbe 0xab7dd4d4e0cd8c4809abe8e1 0x1cb19c0439e5cb54 0x0 0xb58f541c46fbf653dff67254 0xcd697429d0567a4f46f62291 0x27eac14be5e561f6 0x0 0xd2c5c572d590e03c55c64639 0x557b520cc77f01a33000444d 0xbea38909a90b4f 0x0 0x4af10a44adfe761483b1036a 0xe062fa9e6c2e8e3a785fb2f8 0x24ade3fdf1cc1014 0x0 0x6c0e66b9e8f6f5ddce731810 0xee339cd9e20abc9871d2d72e 0x17506d1c6db5cfbf 0x0 0x3bafdeaa105949019e5fb72a 0xce2a339f86210a1762d8cae5 0x2b8f7d3f65ab4b05 0x0 0xe1c4d0b896b7ab77701a8f4c 0xee18bb0cecf4d47225112e90 0x22cc8347b8ac33a5 0x0 0x62b0093be54044819071cd65 0xe6287ff63fded2de08e02db 0x1391b544bc1d7ba2 0x0 0x8 0x39b8aec4 0x25bb4e7e 0xb994a0e4 0xb6e9dbec 0xeba907cf 0x70f463cb 0xa7dc9786 0xfe2dfb86 0x15 0x6a 0x75 0x73 0x74 0x20 0x61 0x20 0x73 0x69 0x6d 0x70 0x6c 0x65 0x20 0x72 0x65 0x63 0x65 0x69 0x70 0x74 0x89f59395d7d156c762a9b232 0x51f0c4b00a4aff1775527adf 0x2bc6d06799052cf1 0x2e0131da3e4e0a15f8b3806a 0x93d99052938d5030681c44cd 0x1297883c927ff0c 0x51aac88428a9213c410e0052 0xfde9f418f9b4b2fb47687d42 0x2950f2e9dcc68245 0xbe0d4233c6d97c7cc63dbac5 0x83f0c74c67249816694309ce 0xf9224f7ba4415f7 0xc9e57c05852d589ad035117c 0xa22485d15567a8b75ce46519 0x1134d2a7b517d457 0xd3581538958c132a24f052b0 0xca4e08ae290cb33e91bc1ad2 0xd9758de6636aebd 0x30918ce53b7e733ac594b21a 0x10983a361bbfce651934f95f 0x1dc157bf2ef8028b 0xac7a069326ac38fc61d7ce73 0xe6d5bc3ea5230d4dbbeb40df 0x1aad08b7f7a7eeb6 0x914e68c4c83e413b8fba0665 0xf2668ac3c3fa847fb7062f79 0x207bcde016355f25 0xe3a823e97168517c76ad41f6 0x829aff2e625a2f715276127b 0x1edaf5799a844609 0xbb5a5828feafef6289cca375 0x1099bfccefdb479278d6c8cb 0x1b5b380f657f8126 0x6c2863c823af990d59c4fc9b 0xa8307e32c261c3d13d029762 0x2e4d1a0b0f23aa74 0x1c994e24705807ef729481f6 0x5ef161f6aa07080282c65ee8 0x1768ea6ba1205f64 0x9abf8bed153b1318df061315 0xa9513c6b80265b99c1257b0f 0x23ce37b2e9b8ab40 0xe1c1967385c65a97fe92c956 0x18f06b5e00c91cd7ef8a2f2a 0x2bf6f161fe4de458 0x26d54dbc888667266d0882d 0x38f6421518978b3991e85ed2 0x2b396878a50e02ca 0xff12323b72269a1003361f00 0x4c68cb29d5d003be45c999f3 0x2ef1d8f69cc80e21 0x1645d308e8e28628773d9472 0x990448db4a5ee05202e76139 0x154a5aaf1f8005a 0xa1c7fa4be3a35ebdf2c84bbc 0xadb249a25ff1e0ae7eb2346 0x509df68a5d8ca89 0x38ff76ba1ad8666f1209c3a7 0x4485b930182fb989e2bd96fc 0x1b65724ffd42cc68 0x106e202294195db750514293 0xf5b36811d98b5404c3e7dd3b 0x38586acabf6cd7b 0xa52ccedd4fb7d80759c83eac 0xac5a95af4813b0d7815de146 0x1cd5e6557277b850 0x1c6a26d7afd9cdc820e55c4e 0xdfc15de07b3ddfcfe094853b 0x2da45b0e69f7d4d8 0xf1001926e629d24f44e15adb 0xa757a15b0a3d23dd8b49954a 0x23913b3b9375cbe4 0x1 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x22 0xc493ee6f604bc17e4f734ac0 0x9a0fa0da8e56efc6b23fa786 0x17511e3e8615874a 0x9a1d282ed730f25e4fce86ed 0x9305ae306edf6170b714798 0x2c14c9cc71007409 0xfa57797a388afe3dd3807bea 0xf4f27f8b92db87e749f3c222 0xd0f8b4d9188023f 0x16b24f569bed5752fd3868c3 0x26810a317e452397211feeff 0x1033edb401268050 0x3301da7a153b27639a16b36a 0xcab03c9942b6c15f8cd0bd8 0x1bbc641ffa7e32c6 0xcd82880f3fc3eb8ab79e87a8 0xf55f53f61088f54920fe5f15 0x60d6e7d44626ec2 0xb24a04dde5cab56d82f8c4e9 0xcd6d2e210061dea8d7204745 0x126a96b9d81b611b 0xa27fb6049f9c8f0248a0f04d 0x8d431583ecbdc29879dc0d73 0x13785593cabd8089 0x85c0cbd523817dc58ad3823e 0xfa07fb845e9b03ddb140bdbd 0x1e7c26a6227d8ad0 0xfe59c51575c6f5653abad8f9 0x1b920e81dfcbce1c621503e7 0x29171d0a6be17908 0x8f7602524d3a833f3ac2f0f3 0x9bdaac53cc59a7feeacb524a 0x6e87be76808a4d2 0xcf16316abd5d242db5bfb0a8 0x9ada9dce12de752f9c21c6b4 0x305dedd6ecdbb7c2 0x1b54d5ffbd3e1832fa560399 0xa95f76a640f6b48a7170fe63 0x67877a7eed621dc 0x8c382cd3ee0509a1e5fe0a47 0xd6b50700774b9929761cea0a 0x142e0970ac3348cf 0xe7e260ddf31651c3a3e61b96 0x58d0124365958f79d949581b 0x2dcf8eaaba6eff3b 0xe88d657b354b400847f1faf7 0xb8aa143fefd94d15dd662c8 0xa8c3199af6c9060 0x80b860e99119dad592809aa1 0x1bebd9a9dfc4e48905e21ac1 0xb35ee6649b4885d 0xd77b7d3ffe76b430543b47bf 0x10a5b85b9e6063a66253e864 0x2df1c93acc872ad6 0x36314fc2740749738367963d 0x5cf14cce100011ba9753e8bf 0x3a3f7ac26facaeb 0xfab5ec029f5c6e1e0b4fa46a 0x7faeb8c4d98ab24a4723632b 0x1bd9b11ba5c192b7 0xa61deebf17c3262d6710be33 0x65be959ceab786271d4013a5 0x2ee6a8ee35d8cda9 0x2dfe484e0b8f15ed33765b42 0xf54f9d85a97f02c3883677d4 0x2ec0d0aa98423a98 0xdced53c92322489b7d85d87c 0x2a2b385c82af3cd9d4d401c2 0x265d09d3c01c8c72 0x62dd0958d2476b0a173e0e1 0xec7ae4dac0c000015b5d67f9 0x1439f777be5ac0ff 0x8d2969b815ac0d9d61073ba0 0xbaa75596875070542534edbb 0x9df7989fc9b28bd 0x466339c4a8ea4507f8628b6f 0x206147ea407a0e84b2fce4a1 0xdaa2987bb741d0c 0x5b4f8f0631893b91abf87745 0xaaefcb778e8398cd3eee291 0x2ca30d0e7dd1450b 0xc0431373f21a1a6eae51af1d 0xc7c8d9676a20e42cdc9bc2df 0x146b51baadebf723 0x878c3e3b7d9785a1e3e7dae0 0xe526a3c0d481534e3e3b112f 0x64984db21e606cb 0xfe6348f3eb6789b9a0434d9f 0x1a99cd483fe36e4112aef7d3 0x5a8dfde2322bcd8 0x2ffe27cd700b62f887bd2131 0x6ef300aac5b8f211a94427d8 0x2a14cab5ff9db0f7 0x618c3931c0983ef103411914 0x1ccee8bc03d5e64ad454797f 0x2ad13e942aaf9a5a 0x525c3e8f430eae40602ecd3e 0xf681e280ea19fb2332419fa2 0x1cbf5261d49ec2d2 0x343832c515380875f53131e 0xda0639090530896ff933e030 0x1e213d69e760cc3f 0x9cd8718c628897e9eeda627a 0x35e703452cebea4fce1b0782 0x2c7be6018d27a247 0x2b00c84a639576ac62cd676e 0xd3e9ad72349d281d080b13c9 0x12c42099a5fe1148 0xab1beee70edf9f9bd844f99a 0x6d056b15d4929b8a5b46f32 0x10a9da617a8f1f81 0x2e0f34975523bb89087a5035 0xe5f8279459d0b5cef30b0793 0x2448167d4bf19b54 0xcd8ce78fd127f0b846644ea1 0xfdc011fa5074b8c484276989 0x1d16b9cd8d4b0d7b 0x7ba0ffae38d3ec4027130cd7 0x6bc8ca85a90b29b4961f45d 0xdfaa0d07ec0a9f8 0x64008a98ae6b63920cfa76a5 0xd41a44640ddd6e56b165ef16 0x22913486e1e4cd35 0x1d34703549ddc3324ad2773b 0x8fd1b19d79e8ff12c3e25707 0xadc12e6af4e57a0 0xc4d54e9854f69a7b2bed02d4 0x8dabadc597e3b5c9ad65cce3 0xbc4c8af45c3d453 0x60906d595ca1ec951fb9b824 0xe857bc957e299c15ab2cf8cc 0x1ed44921339ffe5d 0xf6aca9e3812b5d0a5595463 0x73c0a5c9e6f70b2d95c21fec 0x28196873dbe45a6 0x63f689f31dab9b038e823bfa 0xe6e3f889e88b9639e92874fb 0x8aadf6d66ef6fd7 0x5235aa8cec07d423e72f8e5a 0x6e5762b6f2d80c89004c5241 0x27dbc7ee7f699e9f 0xce4aa0b23944d0f48fe9ac4b 0x3205fc547b1e5dbecf76c291 0x262691a18bf5f30b 0xded6e7da396818426f61650 0x6397d99a08ab7436fbf37e4d 0x809dc37b70c6e7 0x4c97b74c9155ace3310076c6 0x272fd4cfdb56be451044d6f2 0x205679cb65f8a6ef 0x86bd346e3a0e4fa9e713ee27 0x8c999aaaa21065bccce9b891 0x203191b22d56497a 0xa2dcdaefc6cc3af258b6ad70 0x18659eaf0c4db76a94f10ff5 0x25f11d5b35310079 0x13e7e4c83a489d98f484ea3b 0x16e1ce51c6f52e34fe596ff 0x12f45b06b7741d6f 0xbd198072327528c59c3645d 0x2f97106fcdfcf5a26a80a861 0x1a49363ae6006a1b 0x65a1ee1713228ba1b21d5286 0x4ae296a4a6b044936c65899d 0x792bc1ebb65dcbe 0xdc6dc004d234d30cf4a71b8a 0x7dd0ba472ffc6d1a6a61162f 0x16e61e831363bdbc 0xe742fed51f47da2bddc644d8 0x45ff4d918d3ba0dea88ab2e1 0x2a9c736742adb820 0x7e8b173b4535611aa821ec2e 0x3ee5e8c3943b1a26c61966c6 0x448590c4d4acd8a 0x850740cb714a2eeaf5c9cfb5 0x4fca94e9ea2242a734126e4a 0x128a84a5d40693e1 0xd719f84cbb7a466f3dbe7790 0x8012731ca983d2548445c9e8 0x2f60bbb77443d343 0x97854fb01d9cee50b7d4a 0xad59ed6c54a5aa56d3d9af9e 0x2e44118794857fd1 0x6cfc2dc2f8667eb436b9d95c 0xa59afd48967a58b0973c0ebe 0x2b88fd43356e0aaa 0x2dac93f7fbf01c5ac45dd3b5 0xcaaa48e8c37c66ffba07b1dd 0x1b124658797747be 0x384dc242d941e23aa7dbb725 0x908c5018677f1895839abe2d 0x136a03e800169f01 0x253fae2881c429712895bdbd 0x813b0a1516e623148f14a3fa 0x263b3c7a8236182d 0x3b1437f5633a0ef931949900 0xb1a6ba8983fec6b2f3c97250 0x1f45aa0b2cba39e5 0x11d5b0e4876eaf9242a52c1e 0x1abc5b24f0f3c6de1b0ab541 0x113547e0c615a40a 0xdc6a3dca88fa85db2161ae95 0xe3476aefd5c030f44a2f97f 0x199f7fc4b897f61b 0x1e5d67367ac32736a4d81ab1 0x51dd3107e002b5a0f029d16e 0x16d0cb788a1e88ac 0xa671ca171532b40fcf33ba01 0x1dc0ae2764f21257d0144a7 0x26dbaeff53c47fb3 0x7e1ca25126de3002687baba1 0x929cd71b686cf319b0d5ec8a 0x6deeba1eaa44cce 0xbb89e882371ef34a44202322 0xd899e0a7fb249f4d0ca46fc2 0x121ee7083f69cfd7 0xc211a157b8a4b059c0555ddf 0xc85b3249fb22ced663795bc7 0x302a09860705d97f 0xb13e9858dd2145c705b1856d 0x5a4232e15ff3ba45541be710 0x12b6aa3e2d90932a 0x4afcc7f366191e8fce81ec06 0x5808e459d8ccddc22e6fa6bf 0xbf38f453d5b7c0e 0x62b95593e60a52bfee69192f 0xe263402b89fb6700f86eea96 0x1b993e4c65147a89 0xd719678b344ca82c845901 0x673983c1dd7924d038f69b7e 0x2be03fc914e88e9c 0xf686020471a763f23bf21f7f 0x5bb449fd7a728308fec03cff 0x1b676d1b68e8fab9 0xf8f1d634e918d83e6ed3fd12 0xd5a7ea3e1ea7a0944814852b 0x1ca1d5a116eee6f2 0x91e728800f3dff719e332862 0xe74b9ffded3f8fb039cfa733 0x23e5599a4a8c35fa 0x53522d10ab25b08f69788aa8 0x34420d1485f2dcac26dbc273 0x12a999940cf275a7 0xf281812d4a7eba90fe927b0e 0x1c4407ded37626158ce68b4 0x284ae99a5b3f1b80 0x5d9dec12c969c052cd55c379 0xc8942994d9f27778f858bf3a 0xbf424b189ac8870 0x52388453bb8989bc807c1fd9 0xa43b9b64c214afc3fecbe9c5 0x29e1d7acf225bc5d 0x6f40f12ed219ebd5eef77ac4 0x8cfa2ab95a095af9e9076a1c 0x28b5e8a3a5e82f6 0xb5c1714ada3e3244ade33f2 0x4db26373915673c47285e49b 0x25dbec54db5694ae 0xb0fffe9318b44473239e2f34 0xa363511f868e0fe1df51a579 0x2907fd91764f3a87 0x10033089afbeed528edb2429 0xe98d1accfba72acbf21ba557 0x16c10d2c78be45a9 0xc30a158b9e16c7e12fac97e4 0x9c01efc120a5f828cda11d44 0x280283cb2e5aeb23 0xa4a47176b124988338ec3f23 0x182b213f1399ab995492a777 0x21f220a0c6255bf2 0x44004b32701eb580ffafb15c 0xa55ad348efba8eb4a434d295 0x27b9cec0f084e59c 0x276b221486651500cb2f4b8c 0x695a03d23711c0db8016e476 0x2bf3267351183029 0xf42b3a1290ee1e2867573fcc 0xfc8c86988c5d448451a726b4 0x238531a538de2044 0x853e414b56e7f889d0a02f75 0x7fa2157c50b103f4e68c094f 0x20581824c8722421 0xe80c3cd512a779a5ca53e107 0xea9b37fbbc2161de14d231a3 0x278a27779c6b70f6 0xd3475d691fba30c0da9a9709 0xebe400545adc26457279c76f 0x1889ff9d60c4f14d 0xd863ee0c04a010586f1e9254 0x7b8f2f69d54807f46f10f8c1 0x911ecd81b1a419d 0xe7b8ff85d6c2921ab3249643 0x7d07cfe8398f2998e838a9cc 0xad16876d67117fa 0xebbfd2ea8a2f6862e3dec1e7 0x372a3fe3443b1b1480ada6 0x6c2609807e449e2 0x3074ab185e887a096710eff1 0x454b4549b4fb709280680a8 0xfb82bbf23ebefe9 0x45a7c208c11cb7d77438b974 0x8e02e6218de41b7f094bc114 0xbd6e5bc812d6f7d 0xd8e24f5dd9b4cc862261ff1a 0xcc79ccc1235f7b7a0cb369ef 0x76c8e755ab1de1f 0x30b94f5a4e6479d72ee5c01a 0x9920ad0995a2555bb4985806 0x18560a1b58f6483d 0xc671a618bde94814da85af0f 0x61b63a70097f90902e1e3058 0x2958c89a47a53d55 0x6935ad40e12f1cee4a1e1342 0x39b7a42a6b280ba5c02a3de7 0x22f34fe43831623f 0x381d1a69e743b67b08250a96 0x6b50f67eb78e4eb914b99fe 0x239e6c67d5969029 0x8243bbbf32a024a963c0544b 0xc5bf477ce6ab7d82d7ec886e 0x2e523fc455a612ff 0xa1385f068309fc65feba3e40 0x837f004b94bbaa210305b912 0x11367f49f654c222 0x11f3328478d426da9f9df7f7 0x908fef5d0db143fc39c4759d 0x403645cae0e5d2c 0x45d698e8c2c090f1e608cec5 0x536927eb96351d57cb973c12 0x73eae144f394f3 0xae774e07bbc01cd957f5cd7 0x33569710958e2a57327a2e4d 0x1385ad85caee5582 0x7b9cf34c3afb5f3c471b30f6 0xeeac91352a5486d79410ca1 0x2b596bae2c11c2e6 0xa2f0602e29aa4cf0c4200cd 0x3dfd82161948ba7254eb6379 0x2fdd12bad84f4406 0x55cfc8dc0d13e25eb8d5d7dc 0x3645be049cce9ce01ff4123d 0x15d936c5b90cb846 0xa19b77dcb47891fa946bf564 0xdc2dd5389b8aac5c30901020 0x17719197a7e63467 0x2e6b15e70070692b72b3dad5 0xd3912d325680e0c0600f56a3 0x214cac4dc56dfb8b 0xac3157509d1051da015f4f7d 0x74c194a8e314d3bf39a6dcdb 0x27b2dfa49928ccb0 0x3741cc7dc0f399b98ebe3168 0x3512ab5a04cd5caf27b7390 0x23335a8fb7b527ae 0x6ab27971ed1a385596691bb3 0xad82db9fd83befc4e129fe28 0x19118808dbe87e78 0x2775046e42e3622658cbed5d 0xfe4d2c41aa721e62ddbfe56d 0xb715d1d1010b2df 0x5118e39bfd1e9e14503496ec 0xadf610586cb0f84c9dbb6fba 0x9cf161e5ef86c3c 0x8c6fb38b71c88a0227f062de 0x86e19f2b5ab597476ea742df 0x2ea6a046e0292905 0xc1ee3c922e7e6171390c0143 0x31b48cf6855ba54a7ac2a40f 0x2f9c660bc1f300f 0x420069a2147a94d15d6def8 0x65c43504a8d674720b80fa18 0xc8195900e6f05b8 0xe5420431e0588cfa5fe631e2 0xd911ecfb3613a8ca25ae804c 0x180b3154de689f85 0x2509c8ac7f05e31af0a24f06 0x70ad88426e792f8ee4db7431 0x2bed934ff1606c9a 0x7b82ea71a4f7e05866430c00 0xf25846ae3812ba811295a9d6 0x1e534b378b28513f 0x713e934e459d23786d8ed751 0x3cfc532aaff10473c3fb7be0 0x177ef99bee0f9b2b 0xf9284e452668f57160a7d9be 0xb79bf3ae19bc2e5137e3831c 0x1dba796f80aa6fd 0xb9088daaa7962bacce1c392f 0x58672df0188c983fa81f2f8f 0x1f7d0ffbe3cae734 0x928736deba5dc36673fa2646 0xac410ba57e3b3af2f819e967 0x94df580d4982f05 0x161d41fad903433f85bfd0d3 0xe01265c47832761ee275fdc7 0xef1fbc5f28e4fb4 0xc978065041e12ad144a26ea0 0xf3fcb349e8ca90f04c367efc 0x20e9823114e7bbab 0xdedf90261f931275fea224e3 0x19597e8c2c41265f2ecd9bbf 0x291df4c226fd9b3b 0x705d2443fbd2d2fc81db888 0xf5f3ba5fdfc047e134dba7e1 0x146bc6b91c6ae931 0x1e74ba8f7229c95a6e098266 0xa1fe9d80ac52570b5c1feb91 0x184575e43310082c 0x2f29d43b9316e44b7ae4d51c 0x2d2e752b374e911f59a73c66 0x1f537826dd3512d0 0xb1582cfc02cc62c874d82a9d 0x3dbe194949196dbdb8b0e2c9 0x8e8d39bd0cf9904 0x71b8dfa1d5f6116221bd5187 0xd53b31e0a3fe6dc54cc5c211 0x17a3b9582dfeb68d 0x3e08aba239e3c8c780849053 0xe1ed9286e6e523a90c5d1b2d 0x102593e1f5c2fb04 0xb664dd27ce009ad8e25b0950 0x1d4afa4f6e938eddae4e2e89 0x2ed867206c51e7e8 0x439e5c61f8e5c55b0cb8a6d3 0x89b1ea3dcc70fa8e176b0bab 0x2a7b6e74926139c0 0x1bb1c08381b6a2101af36cff 0x18725387c48873a9a5cffa84 0x19d269e9eee0cfde 0x2a5c1b32612e98b012537b12 0xb79a12c006d50b29f870e45f 0x2068d1d5c3f80010 0x3fcb46038dd8616bd4dc9703 0x693d7a46f7c082c30f944973 0x143dff8ff3b1f1cd 0x6f98633816986a209ad2354f 0xd914ffa16c6c265c0e82c025 0x265a729d6a419db2 0x435ca8e59e78aacce1502cf1 0x232a5d2f00e2443ae526ba86 0xc554a76a1a56974 0xd0955640531c947ce313ce0f 0x7a5aa4a5f4990703cfc91d33 0x15a758e399e679bd 0xd3aef609031c588aad7834d3 0x5a3d6c65b6c861ab80e771d0 0x10adaf062b39fade 0x6bbf4da3089e4023ed9f2bc4 0x293af9a81ebc4ed4373d9e3 0x1215e247662028da 0xcb90218d145e9107c844a641 0xe0bda08222af0a990139ee96 0x2069d8a3af572848 0x8e5193f7bf0c18614268863a 0x70d5916b43071d5c8ad5e5b4 0x1bfd4500503ff2b3 0xda9a9d96e80e628beffd7556 0x8584b1df014e0e2eaf5c1eaf 0x3f1e75b8503a1e4 0x5c94f2b99449b89081b280bf 0x4716041108e202d127a9dbc5 0x195c66d17a5e6df7 0x82e2136965a5fd40d399d621 0x7f0d4911f85778cf47716aa0 0x17ec49fad5824c23 0xd56daa9fc14369655a2ec4b1 0xbcbb8b6f8bb6c0c589510bf 0x2a7f303a774fcef5 0x12174a62e77b831a96ef1690 0xdfc621e5e31961bee8908efc 0x2d78eae91928c012 0x50b6496f83bc505158c2e6d5 0x116c23b60ecddb8c8a6d3da9 0x2153baba33c44790 0xd12977850a2413a4e63fb433 0x61d8906abadf863733bdc3b5 0x11328f425b0fbad2 0xcde9fef37c0d143d78400a77 0xe3ca694b8da5e29ba14e2948 0x1177896533fdff75 0xac9603502fc20db79b5b57e2 0x6d717c43702c3b4849d030ae 0x25f428981b23d396 0x499f891796c63dcfce7a0528 0x2ece8ae7207cd54876da5caf 0x2f23125ce62dbf9 0xf31fa54d5893f60d605494d8 0x83a61f1a7d2d27eaf9b4c658 0x16430c9681a86efb 0xbc8ed462bb844d394f565808 0x65aa1f69c767bb6dceef6909 0xc4485738f43e36e 0xb9ac78d89a236efca20bd82a 0x7cf50279df4790191874dca4 0x110602508f41a307 0xa61333011b385d989973abb0 0x982c2eac84286b827403c9c3 0x1bdae935e2bd6848 0xcfdc7e0ef775227888bef82b 0xb09f5cface16cea23634584 0x2576aebb36d247e8 0x7cc1d22ed3440a271a433a1c 0xa780c95081228d9b6fa89d69 0x2f30cff8a40fcbcb 0x1b68785859001d238fa89118 0xefc7b4181d9d45f07830f96a 0x24eaec3304de5933 0x796f26ead7568bbbad907d60 0x466f05486f1ad97aca3d35c6 0xe7870758f17a373 0x39662befc8ea68481329f754 0x21e2d3df1dc4e29859b78a7e 0x1d989e0d0e57349b 0x7c6b30606644eff7a8f5716c 0x38da741d2b7d8257da9871c0 0x72f0fde06e1874b 0x4ce3d964be2d1ff1bef6e93a 0x17a49456f9de7a950c4cd225 0x243e0ce1b9d197dd 0xfd85c5d9de1f4d2858802c25 0x7bd9bd394e43d3d79ae34034 0xdfbb11d14d608a7 0x6b4d287e940f0e3d9a20d325 0xc0893b4e3c943af2c895c78c 0x144301380592e437 0xd5da05519e9e055bca4800a8 0xaa515a0cad8ad46678c1c705 0x2d87f60acef306cf 0xb583744f02e924489bb21532 0xa35be2aa2e918584ce6795f8 0xdc08a5f33696727 0x63ad3444e40e0d1b50b86fa7 0x9f311b5358cd05b88df78199 0x20b59b422afacb24 0xe97e930b4f19a7184a3c54e5 0xe22dbf1cac36e220b0f1c24f 0xa32c7b3ea1c7e30 0x14545662f52e5f4a4477ce8b 0x3d9500eb6e572f4daa23c5da 0x57f6b9b09a546ef 0xa3292389bed8e82f453ad3be 0xb7710d3acaebe9723df67c9e 0x2203039aa28efe25 0x186c3498fb2604f314611f37 0xf4a0aaa2c0e58887468031f 0x1dd523e02c4fbb87 0xe3bad12602d4fbf154e166a3 0xb215ca731a9850e53a42f5b6 0x1b3f0e1dcaec26db 0xe2f2643b449bc67740f10b34 0xf0331d4b6797c7dcc36f2e84 0x1d98ee9db70ca2b2 0x7e8d5aa28ee3bdcf8378c99f 0xd25d9860fff3955ef0315aec 0x19e942f3b1fb3f85 0x9d41311383857210cf440c70 0xaed24ffc1a67d935fd430a27 0x7997166de29279e 0xe61b3acc4cb80cf75f485672 0x36a8e5113329b37e3c656be1 0x20e210f9fb8f4097 0x1b46f32ec0bbf531467a0bf6 0xbbc29db5edfd84b8f1913673 0xfe530a28e9f366d 0xe4c90815ac82856aea825272 0x608871c6833327108445c7ee 0x1648ed8034284eff 0x1d36ab66c0f61a56f790a754 0x85d2990bd059cef232ad5f19 0x13508a0f2c2fa59 0x5d74aa6ef6d951affbb76687 0xf4a2a1dc5537e2fdd0016645 0x2dff65492dacdf83 0xc2864323077f21b4b7dd93a1 0xa173c5cb6a9842022e020b0f 0x4329e48f26acdb8 0x40a5a46e255fc740e6fcbc79 0x510e66089fce6348ccc362c6 0x436bf1d4e9a91c2 0x2953d0f4c478ec0c754a737e 0x28fa344709c4dfb64b34e360 0x12094416b1e37b52 0xd494c8b1ef5610d469d665d3 0xf00e5162f19dd5202e1239ef 0x19e8ee772be08bec 0xe5a1c91f8d3c01e163b4631a 0x533a097b7f3dbe27f39fdcb 0x2e4bd5aa0aa1f48a 0x8287aba5718ecbd4fc83008 0xec25cae9c02048c8fae22916 0x13fa897404bcace5 0x63969c3dc937d7e6ea4f5616 0x6e1a7be9bd8d88c165b3f49d 0x16d77407f8657ac 0xd8a6c6e21c7f0d6dfee40d23 0x344c03a4bbbe976a4ee2780b 0x23790de14c60bbeb 0x41dccde5172cb5f0a1844b0 0x58f5515a7802b07cb0867315 0x2e02c443f0951f73 0x3a56341a3f37b5720e1c5b8d 0x6432eb1baf1bd41cfb7d6127 0xc70be5475703864 0x44e7c5979f332d310d2c67e2 0xcab0ec36e8c6e3f80c8af07d 0x196002f83b6a9de1 0x22565ecaf6d4db00acf6a084 0xbc204f9156ce0c0fd0595725 0xef9e2b290a17491 0x93557dba573d929e377c30bd 0x56749ec00ae06ccc924a48d6 0x1b5f6d655261cca7 0x68c7f4e9e666109ad91b058d 0xc9995c39508eaf178dffc9b8 0xb3f17dd83b2ad76 0xbf05c9d50ac472b5009b391f 0xe932a538d1695ff91c9a5e94 0x157a8a23940c5128 0xbe59d81fd7aa01464c5af4ee 0x85c312446ee63795435bda77 0x23397bc83c07fa02 0x6f517a51ad758e20c82875c7 0xd5fac2fe92e01ad5c2ff9ef2 0xa997b8b1e9c8999 0xc1068a9fae799d89bbdb428d 0x12bc95d25f5011a979174c83 0x90d99d741587cb5 0x1d2b31dd0cd570fcaf153737 0x6fe3ba86ab80904a45c46bc1 0xd72e6bd9032decc 0x41994a76d6f18ed8b904b0b4 0xfc427afe5683a15033a6e7e1 0x2d7c2a84f6fbe06d 0x3d325126a2b69c8e81260b7b 0x78e910837f3aa960d8b300f4 0xa282f2f0174df86 0xa706854237fd1109df55e3af 0x6660da83cb77e6676f82de7f 0x23cac3e7fb609987 0xef06503b5e424d5ee587664b 0x514bbc7d6069535971cfb308 0x1961c65cbd29e66f 0x1dbcccc05f88c399cfe54d70 0xf272d8f9544abc2600af2658 0x57635dcb356d785 0x9f3a83bce61897646cec8c70 0x274febb5d1d6d1513eca329c 0x18f09d9fb8cc03 0x3fefacf350b4470179d60e97 0xf80c07cc0254a1dcd6dee30b 0x27f2179939c4a13e 0xe6d494d647d0191b2c8509b6 0x625187050a0dc6213dd7f8b0 0xda768792d8f2bd2 0x2c0766075e28555670dda143 0x98eab1dea4be2c86b91e1fb2 0x300c7738751ba423 0x77f942fafff95a38e5d3a7d2 0x1ebf81b77cde740a72de591d 0xec1c367fd42529e 0x2efd7e14932ec71b42565ae1 0x438d439423d3fd04c5c43280 0xb86df3bceffd24d 0x1bbde37fd5c978e76d1ca7a6 0xcb8f4d666afd9237d24ab76d 0x4ee38c1ae9b23d 0x680d37c01b9f2dba1f137591 0xb8fb29f4d2d7dfe60aed6a87 0x7a6e5a6848e0f 0x5a75e6a14c8045568e5376db 0x4a9ada3d6fe3e8d45b126dcb 0x6380084e48f9fd0 0xd97d5050f4529c2ba2d143cb 0xe34bf9fe97b294ef50324e24 0x16911ecd39741ef7 0x9f89ad7cb31ee4a91a3d2f4b 0xf30b8a34736bdac514dd6f7d 0x2e7b825880a53089 0xe5681d242777bdd33ca18a25 0xee0420e03d86be958299d5ef 0x2e0a575f9f26efa 0x83c0345e44c5e989257c1ee3 0x21b613be912c668f418422bb 0x76a58c2dcd3052 0xdf5a5668d918baa4bd4127ba 0x100b1ac8782e7035bbe79dd4 0x255135ff78695d16 0x68a98e8eae8acd0e6b4e3dfe 0x67d3cec028c42eb1a3f5fc44 0xfbd13a9fdfccd50 0x725b433302fc6da4b0865060 0x9e712ee1edb39a1fa0be531b 0x2473c7c91b1d0623 0x725b0476e41b66b65e8f66ed 0x4cb111e768fa9d8b05eab90a 0x1a7b2636ee317e7a 0x53fe12374e1eb8e6cc66b117 0xe9bf38d9d5fac690833d1a20 0x1d26ed63b2efa498 0x8c6f34c7ef5d1a304d2bc9b7 0x82835006a5f8f7a3e3133e32 0xc64a1da542c0e39 0x1440423dcb73568015aad1b1 0xec1bf515ed956dc4f260c1dc 0x2aa0bb5f4c299f07 0xbbb36963f698184945e34365 0xee65a4ed03040941327342ec 0x2e5f72a05a00c3d8 0x4b5d25253180ef59a9b39f6b 0xa0912195d4a0be8412ce7a38 0x6bd499318a3b28 0xd60ae5e2360fa2fdcafa1ba9 0x4c53fc938fdbbe892e61c536 0x1777424902120b4b 0x9935ad3c373e58729d26ed9b 0x4dff3d1859caf0c8bfbff405 0x121c14ced021ebbe 0x7121ec8344570a2ef776c030 0x6cc052db77cf819245610f12 0x2e62c0c833536761 0xd063eb57702aed7b2d4be40d 0x903bd1a2a94b38bcac003e1a 0x29e58ea701025c03 0xb18b5453404fd8e094893e6a 0xc6710259672ce2755efb43e3 0x2a3d5d7a84a8be9a 0xb46400a378894f4975539fb9 0xcf2c7201461cb893f2892a3a 0x258393e027e59915 0xe7ab26669b7a086ca5496dea 0x6285d36a7a9dbefa17f86f24 0xa4363e7eec5cf35 0x562fc52e69bafcb82be3a3f3 0x68f0f5448a25b6ed91512c94 0x1d17bb637cdf8be2 0x1e75d91b4aacbaece7230c0e 0x45fdc13107eac9e43bce38af 0x1e9189093ad4a1cb 0x6e880504c885490ed907aed7 0xe179d4a4d7d1d3f40f05c53b 0x4b6573d20bcd32b 0xd4c48f60ccdd1df2b160fefe 0x4b52fd911afcfd4a12b154cc 0x2116ec520db244c7 0xaf10f9b6a4e8f899d8efee47 0xca6a1eeec195862f76632ca7 0x23d9f4946abd722e 0x89e705c61dc38cb056400493 0x75ce3e0b9a0850a8e079497 0x23f70dfa4c211ea3 0xb8e3a60ce06b64e3ad4342f6 0x495a44e3c05da2dd27811a74 0x2ca1420d234c4847 0x7aecb496cd6df23cd4f9a499 0xd6149cdc78ee2216874df1bd 0x204dbed164d0a8bc 0x26475d4383ccc73ac74ee7bc 0x5761518d84b93f15e5bfe41 0xbf5661960b013bf 0x81f6ced96bb5fc357a656115 0x1e2fc3153770b8643ff9d05e 0x152a3493a886f1fa 0x8c2417445d2c445ce34277e6 0xb11f223458fb7ab86d48d46e 0x4dcf4ba54008469 0xa52abe26570def4a2188f24e 0x818e65238aee223a78f07b17 0x133583fc13df1207 0xc234be9afe86a1a8d10101cb 0xe35d8937d582bd73f81bd150 0x18acee2f162a6774 0x27d9a143b392ecbebd43f5 0x42f22b2baee270707cafeb34 0x15c82c783aa77835 0x5ba87195383074669d565cf0 0xe2254288c4cc2e5884ef4a73 0x2c1df7c40d383700 0x7ef0795dcfbf59a7777279b 0x6c65289922556ac87fb791da 0x286e23dc6378c2b7 0x3ff2cef8d7757a51d6316a35 0xf20c3390e916d6416b18f334 0xf219cc0111d2bc0 0x1221b94e639e13f3aef1420b 0xa042ea06fad01d8d45b1a983 0xd82d421bfe47275 0xd8cb649fe39f5937a08862f3 0x67a083058c1b0f57f89e09c 0x2d104ce43cdce614 0x5e87871bd9bff4ab12dc6d5d 0x933434a061a7c0b1eda6a2c2 0x1d920bb01e86c3db 0xaa249070e60e6b858efb7da9 0x35774a214814956b419b066a 0x26b295c79812321e 0xc21181abd3393895daaa654a 0x4fc6453b312874485fa55182 0x2c0be109fcff4fb7 0xb1d9dfcbafefe685e7ae7842 0xdf0003b41489ae0a369b80 0x182595aa6a396b47 0xca4d5fb8e3600df1942dda39 0xd33ed3931d59d63bed2ee124 0xd9315c2b653284b 0x49a92a3bb18746caa68a79c 0xe144297b69571557335b8164 0x12b35847c7df26b4 0x3b5cdfb09bde9bca4920b8c9 0xff920c193a6c40725d3e29a2 0xd6a1b8cc631ef21 0xa918a62f0c4d51fad0c96705 0xf4e36a4440de96f3d4c1ec0 0x1038c77640f7d798 0x614b798725756ab6ced4796e 0xe0deebf5d30db67edc3efa60 0x2f5208f11a86418a 0x3025db06b8e5dc15296f9859 0x825bd550b4434e8bda4be2fa 0x2984ff1f66d75794 0x22598d266d0d5111f077f1e2 0x94c5ccbdd7c472b436867b91 0x161a3ccf1a90359f 0xdf39eedc6fd5cb5350fd59f3 0xb18c893f577992ed06bb3835 0x376cb167843017e 0x9484140aea7c76bdc8816a9d 0xcd5ba65f7081bf8b4d771cad 0x2c5ca0a9cfa6c224 0xfea3b9a92aa08d159db75bb 0x46e8ae617f41dcdc8fb11b2e 0x2b1d41701817e206 0xa1728ebdb838baeb4920c2df 0x683b6712575b3a171a50d7ab 0xa561e7d25b90b3f 0x9d15d8459e3a837f8e9bfe4d 0x9f8edc4feca10e7c5d542267 0x2e17bd8de486344f 0xc193fd2b4a2c893f370cf042 0xad5aba4bf218ab0ce59382aa 0x152aedcf6843822b 0x143cdfb4f041a24b6d13d1d3 0x87018e5973c7124c4643c806 0x22363a16916ccfb6 0xa48a256058be7b8a3829fe80 0x4e3cfc376e388a7dad82225 0x7f4b90c8608d9 0xf6dacf91233f81a6ae88ccb1 0x91a2c772d53afa73e4234347 0xcfd9e68618b99bc 0x9e415967514b1d0f76353b07 0x3c7fd9ce00cf579e763fad9d 0x187765224303bb2d 0x8055d41f2f452b58ad00d1c7 0xf50ce67ac5ca52ff789aa86a 0x30382dfd11761ab9 0x4efe56fa697974f5a01454f6 0x9741cda4f71db04548d3f656 0x9491b0e03062767 0x2971dd421a0bfedde6f5c4f9 0xadc3b3c5d95ccc18b1c4054f 0x252a58bf2fe1f62e 0xde340dbcd6430f981981e393 0x175f1c6fa1e83be581a3d23b 0x2d165df513128cd8 0xfbab8d7ba9ff102fa2cb29ce 0x9d714709082ef848b06714f6 0xe4c3c1c7921be6d 0x4c7b21945fa47a9f79b5b9a5 0x7568520589fd71a88f72a453 0x19611f30ab68b939 0x5ff074ecfc553587ac27fb09 0xb148ab9368bdebcdd72fe746 0x25c6e78bc5b58f05 0xab2481e31d1fa9fbafdc1106 0xc8d8dd5bff0915c040c06e42 0x27b6c970c9258e4b 0x62e9ecec0b06cfcc14e38d07 0x96be6cb3eb766cfd7852ca48 0x2e81d3fc43719f81 0x2d535f6d05802a4d8347e6b9 0x18579eee3760828c48af8c32 0xc68c3de1021be25 0xbe7a44719e62591fd6343e01 0x132835bc2de6dc02cad3ab01 0x55117449e7d83c6 0xbd5bc07b6a97618fb7b17a13 0x470beb8bb5d3d378757f60ab 0x7aeafcb136c6df5 0xb132a6a411eabd6a9892b9c9 0xeb586c6686e866ac00dfd5aa 0x10598ec1d4ae6047 0x13a6a48808e93274fd8d3104 0x43bf6a5b4f92450fbdd2799b 0x1cb0c4f2671292cf 0x6312687d6599b84b38bd86fe 0x296977a06710df9d9ca02d21 0x242c72dad56957ba 0x221921234ff75544d8baf329 0x3b65754a8116d4eb7b6ab859 0x24e289725ef3e0c0 0xb5a535b15ea39c9a44f63737 0x25bb9df47224e4084afd6b88 0xff24043297b174 0xac4d4321966d65fd53dc6a6e 0x9599cc3c86c3e05044b78245 0x1ccca4326058419b 0x15d3ba6a8f84a67020e2a952 0x1bd99fbd824b460105167d19 0x215894192319f46 0xdbb0be03f86c07111d3aae42 0x662b31954d0841289e2f4b18 0x146a0ec98b206701 0xba76c36a42f4f8708f6dd0e6 0x95b3de668d9c46d69d212b7 0x2d7db2ea9e3d454e 0x70fd7a590aba95ff168b04ee 0xc47b2977921775053969fd89 0x260fec8589983b3a 0xbda04c666cee19c6514e06e0 0x34005670bbd36866ba972787 0x117754e92c46ba90 0x56e95179b76edf59871a76d1 0x404171f722de5d8ddbdab291 0x2bca3a067ea159ea 0x25d437e6fe6e4178d0bb21fd 0xdc2e302918e5f7b54588bd85 0x11f2f4fbdbc17ecf 0x2799633211c1527971327f2a 0x802cf17f184fe60ddd150166 0x86ce563695e3e95 0x8e0cc93df54570962091a825 0xa101797006961bb2fd770c55 0x4426789376d1db3 0x8f72867dd99fc5350fe791a2 0xbe7e418ffdf0128949a30b4c 0xcf8114f241f2620 0x41a340550d6801e319bddc45 0xdf9056562d5bed6fdba1f8fb 0x44f622bf3a67624 0x9c681d4926edf382d1f9a97a 0x2f2801b71b3d79122f9f92 0x10112a9157fb5cbf 0x15c6cc6a4ebdf304e842dcc8 0xded8574bea9cc7513c498597 0x9a3f450305c67fc 0x50e543a40d9abc3f11d1bd26 0x15bfdb77633347a2f8183e9d 0x172a1782578b8bf3 0x94f86259a7bdc7fb326f7740 0xf21f56b2fcbf2160f5621d18 0x199a25e838c33474 0xe88b11d9476afe9d59c0af60 0xda90b7739a02eeecd4f9e71c 0x17505979bb62654 0x69708392fdc4bd4e3de30d19 0xf4526b1d095e8e38131826e0 0x2a57883b54f1b601 0xe04b1cc20e92fe5bdee8acc6 0x46bbb4e096d15196f8503d75 0x97bbe6fc6fedcab 0xa736984281e17e5d96bc8fb7 0xf30bd069ad4ab73d07ee78e0 0x1d012b600f98b76a 0x9d5c8c71fec2cee32c414ee7 0xc764aff5015a45a3cc2e235b 0x1b12941bea6e6012 0x9102ff8db2887254aa35de05 0xae584551173bcb1076d0da3e 0x166911911dbbae7d 0x46d31313c55738bcb14536c1 0x13db4923c3fdea9304f219fe 0x4a39b69be327fc1 0x1c842d392db073058ff0074 0xe13386a07be01c47d6a33391 0xcde7329eef105e1 0x73448cbc6bb91b1b68e1c4b2 0x802155ce58ab3b3462e1998f 0x294b84921c5e87d0 0xcf938c53e669b243c6163357 0x5437060a43cce837a7d782ce 0x2bec9ed66710354c 0x275d691810259001c58d6c23 0xa35561acda786ad7fae3a13a 0x1b5f73edbfc3835a 0xd527896afc8cc9e5dc4c78e8 0xd9ce90d4d056f0751dbf6691 0x2798aefeb49487cb 0x7b73a30f2d95499435ba1651 0xf16c46f3e703acc27b2141a5 0x13286d1749e679ac 0xe3742ccc51491ac20ee0fb2c 0xf793583ff4906f953556138c 0x286fd5b02b9c0a26 0xe634a8ccc537a19acfc6b7d4 0x12842e4ea45174057674657b 0x2593bbd93b16e77f 0xd028e9a77fcc6b0ac1163f3 0xa0e8ea714e55b3fe67f5be7 0x2aa705ede5af9ee0 0xa80a410d226338b30d7102fe 0xa7c2e8783e937ccf5e954ee 0x30069193347ab852 0x9702128cead7e06a35d6460 0xef61c4f626a67f304e63c802 0x1b984fab00a84424 0x3ebf7e51495f6561865766ac 0x9acfea5531fad515f594732b 0xc414ccbdfade775 0x42918990c26bf26206801959 0xa86e8ce1222df31ce83892ff 0x16aea15456865c56 0x4122c86ed0c94024aa18558c 0xdf00a67ac1912c3718627a07 0x181692ac7af9ec8a 0x313135f1e4ad147a57dcf57d 0xdb8873ea6e0fbd042d211917 0x13e5560ab060a73c 0xe23a62b956ea3afe612b08eb 0x5383e1819b630d1062d2e6dc 0x105da59f0080f6eb 0x149bbea9d9c0e3f79c2010b7 0xd5a93dc4b3d0cee72581f51c 0x1369b07937165a40 0xfa29063af3976e05122f3936 0xdbbcadcad16f9509e23f5dc9 0x1803ea6c62f77d28 0x797b6c81f0ec90ec696160c0 0x43d3e995f304f0509ec7c269 0x1b20b858db1051c 0x6f9ecad91ac522d1d464aa86 0x300e8e1df52a533e677db8ae 0x100653279f3d9f5c 0xc44c61166ff3b4b7f7d26e29 0x5b25f24dc308f5f7f82365cd 0x2ac7de1dda2b4f61 0xb44b3ba1ce8a5aef524b016c 0x9bd54f7021351accdf9d9906 0x197b81973cd315f2 0xbbd6b644286d51bbeea38a0d 0xc67e04bacb1d02e23354e337 0x1bf0017c555ea534 0xf320775c835e15ec7c367239 0x706518cce905ef32bf398856 0x275a7c4e7635b7ae 0xfb13e488aa2eba227c25fd1e 0x562e16a9c4ad258ea1706e55 0x15f64d6e30a58c50 0x89ddb873645f30d64e3de231 0xe0fb73e389ff8932d7c85cbe 0x215493591155b90 0x3998fe40b38f1c5852db4f9a 0xdc869b563b37817962efb5b0 0xcc8672568357718 0xc7f5adc3cad45cce4112d933 0xa8352d4bf8d4e6a14f6f06f8 0xe5bd383c9149aed 0xd42581aed5f9344522ce243d 0x1706b294afd7c75e97d0968a 0x1f98de447a5750bf 0x31280db5cdb60fda76576adb 0x96667e8ced5e7e4b75d943d5 0xec6677829f93b1c 0x2d6e5b0853fc1799e5e7c273 0xd4784bc484140bca9922a88d 0x26c083362c740645 0x9e962174191db74bad1b6188 0xd86ab90a99c1c3da2abf7d6c 0x152066a2adc86cc7 0x477158b5f00c0d8652542365 0x45f380c24af5d96a67baddd3 0x5a1d554332fd15f 0x9ea71711d707502146afef6a 0x1de588ce8b091e8d0a658438 0x302cc3da88a7b8bf 0xa5d3f8704b85b4eecddcbf62 0xa987b080f5a4dbbc6b167035 0x1e8d3650fe9f6de6 0x7cefd3251039087184c6a0dc 0x763b044c6961b7a56224b12 0x5ffc2b61fe0df29 0xf03ba70c18010ed10e1c6623 0xdfd78797344f70e37ea60adb 0x555d75191e527ca 0x84ff1e24e085d099de8ebe6d 0xcca4e19cfd660312fc6e14ce 0x1ef62a347e8423b3 0xfe715ee21c5f16a3acc2fb0f 0x2a0d9a8bbce1e8390e21e3df 0x1ad338ee1258ad76 0xf7ff673a80dabe7cac60827b 0x742af4cec249e71158adc585 0xc5262d48f29dcb7 0x5b88e2eba4f9a964cd3eb770 0x74c14182b4e8896e4d6ac31d 0x104a17f7a62e5b72 0xce3185d53d2a090fca7fe738 0xa48e84655f47dbcb632ccc9a 0x1612d4aaa8c0b3 0x9840f59f40e610ba7ca91ff6 0x2e5b42d0cbd31aac4bd26663 0x1a86ff8a278324c0 0xd5085363ca669b847d71f389 0xca060baa4442cae66ded0eaf 0x56fb158097b2a14 0xe28bf161c9a4865e11ee32ae 0x1e1f63d389b04389d7455d12 0x2d02ea2c95658380 0x4b784e980906564e8633e15f 0x2c0d5fe96026179560cbb995 0x9d858b6210feecf 0x9c63d1f2fee4f57485fa6de7 0xe66d7b55a75c52bb1fa0185e 0x1591281156049ac8 0xb6e388a9db53c9e0ec286be3 0xe8b1758c8f90c4c1233e9e2 0xb21517556047f3a 0xe21a124c7dcf473ef3ded0ed 0xc33657ca358e905c8019c1b6 0x25e1e5d948543079 0x60279973531c0ad9a4e3e7b0 0xd0248f1f0ea8f0f13705156d 0x2d957ab4cfec3c16 0x9932192157b06cba8be2e956 0x1f25523c9271876a84b9d653 0xcdba0361c1fabe 0xcce55c803093a203a6e7b547 0x2ad9fecc5bd0f6776430136b 0x2f853a8a5e7328e1 0xb24b18288280d326da8c4004 0x44ead88e18160602b65fd14c 0x1b0fdb82fd854694 0x1833e7e555b899f3a5ec5e31 0x32bdcf9f86f03958a8370079 0xce927b1db471fd9 0x1605c5de6b3705be95e2e7cc 0x7c76824d6686da8f21a2ba06 0x2ae39619b870fb5d 0x68e112744fe8f7be5466bd4b 0x8d9966f0ccbda8d1da098428 0xb287cd7b5e5f382 0xe6fcda01bc726c2df489b035 0x8d6d390b75455a80413d09a2 0x2cd599eac2da0cf1 0x57329ff8787de4dfca784b50 0xca1ec6575d7b8e999916afd5 0x2ee59d1cd206d6b 0xa02b9e015b83a30d9f9bc6a9 0xd001362936a3b648c158d46 0xdd04249ec52fffd 0x3db1f9e8c242e59026a099ca 0x106fba5f04b4abd5dc65c85a 0x1c8ebd7bb97a8e88 0x62645eab93c484406daecba8 0xca3ab7b9fa3441eeb29c3742 0x17dc5afd8d4212ed 0xe4d20cad10ac9c65397a6afc 0xe9891a5dde0d6e13da8a86d0 0x176134981c263819 0x732252b2d462b8ea5c91e8da 0x8c9842be1f1f5cfb287d2906 0x10bb5018605c6d52 0x847cc6d601eea88451039679 0xbafae76ee6fd999592e7514 0x1fee75aa9e27cd11 0x528c7f8a2bdadbd1b30db8d3 0x8244935ba1201d1f99b237a6 0x2a8a4cbdae8b12bc 0xb205abc60e1e869df3eb5370 0xdbec22c882786e1ee74608e1 0x20d10f3dafc6452e 0x4517372c18a39e39691738c8 0x52ebef905c9c6649fd1cdd67 0x1bf860fcce053551 0xea626c0f3887f9f6680cc33a 0xa1c9fb57bfceacacebc4e76e 0x141f47ca8ab406b5 0x6dc57b6f595e707de2b25df4 0x34a1f79e1dad063f5a5709f0 0x24f65a9f4568ae30 0x9bc6d8ddbac82038bf39f2e2 0x102c74c63d0547aa51e9997b 0x11516abcc4a8093d 0x255a63a11ceb25b01a9ee386 0x727dc72a8a903ffd8993f6fc 0x2ba65e83c5977e41 0xa09369c9263d5525a364a78d 0x40324bfa0051b61415c1e3e7 0x2d264c780ac0bd8a 0x9244479cc88744ee6f142ed8 0x122013bfadbe5d604c35dce3 0x67881d44b3ec0bb 0x7a65013de942bf5cefd9124c 0xe162d37736a26933661d8aff 0x21baf23bd54a7241 0xee32b9f64d1b666c1bcfb9f6 0xe70e7e5692553a7aa44aabca 0x17092a83e8a221ca 0x72252f9674815c0e4341e9ce 0x624108e2a6022b5ab965ac89 0x1617477792872f41 0x675704f8b3a7b20f60633aae 0x411d1d1a5d90d3b9fb94585e 0x2dbe2046c842d1e9 0xcbf99be51121db5960bdf3b1 0xb250a00eec6f9be91299e18b 0x1a8f56bab1dc1089 0x672c45a67fbad97f3602a27f 0xf377d85b70db5554230812ac 0x2e5ec59d0bfd7b30 0x75b873e896ac630f25be86e7 0xd2a9bbb74ca89bd102ae7fc2 0x2c65b670c524479b 0x66910820fffe62ee3c21793f 0xad25f8de47155b710782114a 0x8b9031697957671 0xb131861b2bd99f0d18e2bf59 0xb2bd5acb02e3867f37a67e06 0x2e7ca74eeb61903 0x9f11dfd89af8bc90d82ad476 0x8f9c7b39115f716edd53dafa 0x2bcadcb3ae8697e6 0x7eda13ce4e86cf5ee073b241 0x87ba39faca5ae897c8e82866 0x7dc05af910cbb54 0xbe 0x4e05e34a6c6b0d7ad95b03cb 0x8b1fbdba3d3339f745612dd5 0x5361ce2dabffd53 0xf05d643782c3dfa92c905c32 0x3b81d442c8b444c7de7cf159 0x2104b3e5886b91d7 0x29f2dbad7c390cd160473126 0x318ed621c36d1894033cc514 0x1798c010e6dc7f2c 0x607bd8ec54fb06e3e8273876 0x2cfcf568e4dc319a54eab39 0x27f0c62ff0ffe7f1 0x75600493d1824faba7c6cf09 0x20c2951c8629a68235e9b9f1 0x14a446f71198ff4 0x37dc9e833216886a280f5419 0x339775a0cd4acf410d579f85 0x2c80384936df2305 0xf2e012a9fa3faab2696e9267 0xc0d30a58bd9be0bd5e8801db 0x20cb5cb4dbe9a6d 0xf890b43baa99916a3e4dfa82 0xdcb1e06bed52f33eb7278090 0xa4adef119dedea5 0x8a7c58a4875dcfe6a221603b 0xc70c7af2734b9474400ae005 0x2fe0c123c5c050b4 0xcc7e8ab2464ed53bf935aa8a 0x28e1cd3be7b8313e9fc06af8 0x90646defb02133e 0x17b71149edd2142cfeee10fc 0x6734ea4a7c134a1b72cb06be 0x125fa9d11f21aea6 0xe221d1ecbed61df46c2bc27f 0xf7fc5640edc7922de02a9b9d 0x1e25f673a1134db2 0x15ba1ce8ac271181b8b82078 0x891cab674a6cd8d506c2e141 0x2300333c2e0f8a8 0x71f3c719db9e65797175f24d 0xc7b8c0243bb5cb694f81e12d 0x10f21361d0b34c28 0xf0a264c8fb4109ed5ac02b33 0x39ac2ba29226369b783d8b88 0x1eb01280be9839c2 0x34c57d1fa297a5a92c166269 0xc6edb79d6d8257eabd43bb70 0x11671e94cc07844b 0xdf30c014014c3443e3663cac 0xd12ba876deed84c3eef8c23c 0x107c3ffb7a210e58 0xc8b38631cdd34381efc3d593 0x8297f551ca2779d3a2c0d02f 0x26166c8411d32e77 0x271f3e236949697729d91763 0x26ef4079f58c48524ad7f283 0x25b87616b076e021 0x52ddcb0d80a4dbfc5bd9d7b2 0xca0022c2f55df66981a20ee9 0x1fe760a1e0efe782 0x9a7aecfc08d1dbb530e25481 0x7e5f127dbac797124d754c00 0x27bd782822502833 0xb5c7bee8e94a6a12c7bfce10 0x8553b21d1ebfe26205f551b2 0x1edd98f2b73516cc 0x1e56be94339e2506978fb680 0x18163945089932f3b802be44 0x4e794bb0459075a 0xb2d5c30b2b48a6dd131da5a4 0x7e4e96c6201077e047842414 0x27ff43c8817aa332 0x311d6076729df8a38283f866 0x52cdad0847a713767deceb34 0x470712b2b2e1696 0xf594241b582c36e4f42c746c 0x15d61544ef51d3915ab0a8df 0x23e974c1e3c4c0b0 0x52bb91da809fe251b2066aba 0xf684b8f470c3b3b8bc73bbf9 0x2b094d10dbfce3a0 0xbc825bf9601183ea0e1a96f8 0x2566e913bbd157dc879f479a 0x101fcd81762d078b 0x89a8ac9a759179c0032329de 0x25b456748ed1d94cd149dc17 0x10511c508eb86e09 0x7ac20c4b58cb0e474c2b41eb 0x91104f7f31d452821de1b3e9 0x1679360c47b4dce0 0x190bfcfeeb8909e15169ef26 0xe7750368e00f858821ceec51 0x1217c45d2f64587 0x5c821a269d37feda3b542d44 0x496a07f876143cbf0b313e9c 0x22a3db673f958e9d 0xd61facf54eaae66613a36640 0x40dfc419f1ef84d7047eb221 0x61fb2ae2ab9c0e 0x25321e6370808914bad666d8 0xb08cefc9c2c2edacf013c1a 0x14a72384186b08bb 0xd2db7b559ece8ef572b0cb5a 0x369ff0fad73177db0f08fe77 0xf3920d38093f9e9 0x2c3e6fc2aed25cf4b0bb513c 0x7325d5ce0d9c7f5275000d2e 0x1a1b9730364415f 0x19c5b9d99470b7d971445742 0x7ab17baba53b6494e4e1d93c 0x17311e8324bb55dd 0x234b435923fc86aa6c1501fd 0x8b2d8fed39dd18d648abfd12 0x28a45254f04f0d59 0xab7ef402f29e85b3ec5f1840 0x7e79cf65d4b357ec3adad1ca 0x2e2bef0556e50df0 0x22dfd5bfecc054e6e3b3dffc 0x70f51432cf65c6ab396b2ab5 0x2f0179310518dd6a 0x73aa207ad292e51d8c56f0f7 0xcae6b0473b37c76f7b569fa 0x2bf64e537d8ff5eb 0x78b5d352af2543e296f5a80f 0xa5195db93c888ab02e894304 0x8d8b2c9c0c25e72 0x4409adc4b9ee6bb08024cf76 0xde6c4893eb59ce8b5de0c34b 0x9cc4c1fbd833e18 0x232cfe3e044cd527f72b1925 0x855e03636439e189391c07d 0x47bd18f9d23c910 0xa3a728db952e49d4ba8f527d 0x4ba95d33f2e0a233e790029f 0x95f19b7b14f3083 0xe032dff7ecd29e670f97bedf 0xd5e950d0c17cad74fd98cd32 0x2275dfc6836c5f12 0x2fa2c9dc1c7c590eda1baf3f 0x430e2ebe8234cb31db86737a 0xcbb7392222a427d 0xae12bce7c33c6fc3cfc60864 0xb6d171b6cf0e0f3df1afcfbc 0x2c6575a6d3edbc8b 0xfeca27fccff5d20a66ca1835 0x14570911901c1517b8864d35 0xe95f4f4e9611b57 0x531139517e7f4136d45819c8 0xf5901ecabba2566609bff1a 0x2fe973ab43641e1 0xbedfe2739a59092b41d2557c 0x31c57e78536efd165dac4b89 0x2781d05d0db7b7a3 0x9eb47c108a54bbb5c91029b7 0xe10494e320070b3b230fd04b 0x2136a5aba6d93e78 0x51d06a275393ed4dd24c467b 0xfbbe0daad44bfda6c9100038 0x2d8abc5600344404 0x6a05b6cb24ce8419f6c3becc 0x24f41731d90ef18f570770 0x155dd279dd37138f 0xad78db312e02096cf402ba09 0x54720d3e3ad5145fcce44aef 0x1efefaf861fcdd64 0xc29e398dbb86f2b227b3a922 0x3ac545f9e137f960340f9f03 0x187a649581a285d4 0x83f3fdce0e5e89a4087f368e 0x28a6b1f2c20cdc26de06660e 0x3226f211a740760 0xc7439a422799041fc18d5232 0x5ccb26094dc6f9b67f4a876c 0x13f1a352aeed460d 0x74dd54588f17430347f15f14 0xd64387e0cc5ce9da45d46c7e 0x23dd3168f2cc9f34 0x24a772659a39ebc4c5ef8028 0xb1335a118eb4b83b73943f65 0x1001fe55bc9e98fb 0xae9bc51b39457496de220b49 0xee158e31389eef0f6de865ee 0xf6d3142be2ec4b5 0x39110c64539631a979e6c9e8 0x1d6119cb1ccecf95d66e64af 0x233381c6013dba6a 0xa3b36a5c0be0e119d323bb97 0x43309ef3aa2374a4c8345343 0x2a90777c358a516f 0x85937ab66d7a73d556628987 0xb31538708e72ba7863fad36d 0x13a3aa5435855050 0x5be45a5128809f17770ba2d4 0x8fa9038b89a413f56c05bd03 0x10936ba077c57e96 0xb68f2822b71c21abc7d0421 0xd2d166e6f183b2c2d888dd01 0x235d12f96d1c8195 0x1f5212c923ba42786f41b566 0x3fb7cd398819dd6c1463a786 0x2183f221f49f5de0 0x8d090cbb4d5b11441ed8c6fd 0xea9b2711321c1c47cecd81ba 0x1e7937eceba9769e 0xfce140a02f319d4fceac81af 0x895337d0c0162fed74cb983a 0x19d73a31b79ec856 0x7e43bc0709daaf566e2b45e4 0xd9451d459f318c95a86c68b0 0xe1029228cc52318 0xa579af770ebdd425b6e4eaea 0x9c9b2b7f5a5fdaa98f249f90 0xb18c26151b77b20 0xe7338ac38acf6064eac17f7d 0xba6f41ead7d38e9f59d1273c 0x257f5044fda7890a 0x6b9a76080e58470f14125002 0x8fb71bb6536993faf8ceb165 0x56de6885d87008d 0x402b391a3ff2d18292b901a9 0xe6d48d4147ff2248fc4e0ea6 0xe096eb296f98d18 0x24df1748c5bc475c30ecae27 0xa39bda74f30fc5941e250995 0x50e3ca438b576fe 0x95bacb5c65e5c6141f9e222c 0x3feb4cdd500ae8a636b2c701 0x2e26a611542b1c12 0x9aeb3829c6e2bc3f72afda37 0x5d4ea032d03da168f539544a 0x2bf87948cad85bbc 0x97daff3ae6166826451dd70c 0xbefc512e6fd7bad4a4bfa4b2 0x27ec632714fab5bc 0x116bd6aebe8a932c689f0d96 0x6e9ae5357bd4d1150604666b 0x109303611b3b57ec 0xadea62bb498f46415cf434b1 0x905711e5051d685a96726fad 0xd90af8d89721327 0x32d93c5ba95f8eebdc9b2f66 0x2819e6e6c5bed10b8e6e3ae8 0x13e998c9e20e4921 0x23d79a5e3ca299af96a66962 0xab6d6bd2981f4da1c9ec691e 0x22659cbdbf250359 0x112908a831f921e88303baa5 0x6e02777962be3532887f581b 0x23cfae3f9db08c08 0x2df7231bc2cfb7975d1fedfb 0x3a20b3cf719cbbfcd22e2c87 0x183d121b0b27f687 0x8c5e07f9f2f3d62fb55bc8c7 0xd5b3a72093c970f460168de3 0x2b87db54c64c39c7 0x5c67c0952704df5e8f082322 0xd7815b904922bab3be387c16 0x13b1fd05388ca6a 0xa3db557daff4087589765cf1 0x5202efb2dddd11d69364631f 0x15a169bc8fb62d6a 0x127eb31481c78110cf170451 0xe4f8e4e7bac12c8e4dcc41b0 0x144d3414e8d8efa6 0xb67921f73ee9d0ae4c2e1715 0x1f4cb7e9ecd06154694ec548 0xfcbc05bb018bcc 0x90c68de2c70d1c9d246c6698 0x6ce4eaf2c46c844161cb32e8 0x641749a91418695 0x83e70dcf99f1da503150aa39 0x5b2f5bdbe16b89ae5cd0fa04 0x1bdafd57cf0e9bf8 0x5796925411256f955ed5d16b 0xac37eae5f0ee0f2d197cff8c 0xfed2d97c767e8ab 0x9811bae7ac3406d1ef88322d 0x8551d702957c5386348b352d 0x146c8595ef86e214 0x3ee0aa96a8a62f2823b95cda 0x38d6b914481532547269979f 0x1fb1cf7226930f05 0x9009d290907f2df542e3bce4 0xe6316915b7c2bdaa79cc9054 0x2de4b20a1bec3f42 0x4a0d646e9db97350c2037d48 0x2ab996f4c67d9ea3da4887b3 0x2e407737df3e44bc 0x75f08e3bd23fd3ce4ceab83 0xb5f73c22ca287771c2e1f8c 0x2c60a283156e66cc 0x35f9e99c8b726f4782633dc4 0xcdecec0ee2476e022feb2650 0x1d8aa46b33d5ff5b 0x9093d13e2085a62115fc1258 0xbe5ed722ea1505c9fca90992 0x2cd88eab8462d2c5 0xce754619b2d1953d39f44c85 0xc9c5fafbc79a63728c95b25e 0x187fa5df1fd66e6d 0xd09a8a253f3f7328c15fc1f4 0xcb7d1fe12369c53de8f5e935 0x1376670667dc7098 0x41560edefdeccc6c86e6de73 0x6ffbe2844809114cab081424 0x20db8570d1c13e16 0x13901e7d4cd42267e6fded7e 0x6bc36438d8c81e631f42dbc1 0x2cea8b4cbcfcbe3f 0x2ff9c1e75e57f1310104c871 0xcd19a5395b4f98749e021f3d 0xfe87ebe175036bb 0xe55a8111fa2d94b8db45ab41 0x637e45decaee410a005eef6d 0x147154cfbcf8709c 0xa5021d5a6f7eb7e0f5d81fae 0x7f8e1e6d4a4641b7aad164b4 0xbfa037ce608a81 0xaa363fa0d2e390c05bc64b58 0x6d72a8469f5a36fc5e436bc6 0x80592e212e52f9e 0xcd258e8e5df11544fbbf59a 0x1133c9d9b40011e8e7da3e71 0x5f6c48eef47e4c0 0x3edae314d5a334533feb846e 0xa49289341c36c1205b186372 0x2e78bcbe3c4df7f6 0xbf0b9bbea4776393e1b3b639 0xbe391012a51786fd5de21e4f 0x25d2cb6f22c4ae9a 0x22b281fe0746f5c38bc9f121 0xf7592e2ee100e2662105f9de 0x191fb6259b069763 0xb6b6b963c9db72c1c8b3ee40 0x2752d51ff8abdbd9ce1742eb 0x1f8f6149cb34d1d 0xafe4449927a9f1c0c0933566 0xca65613a0ee022fdcc8bce25 0x17a042a9d3b40bc7 0xbbab374ae65060db5b28aee7 0x209b9b5c84e8d9743442aff 0x1e62f9ca25515372 0x4fdcd96034719b21470e9d66 0x260a4cb4ef49803425c4c33d 0x28370b262bfbfa4b 0xf25554aae4a364883333129a 0x28228d6813b2ab0b26068a7a 0x19fc292474e225fa 0x707cba4a00568d7255c23f99 0xb5365e6e88633789c545df3e 0xbc728a3acba4f0a 0x3c0c85416443c86c40be20a4 0x4a7b1a97b980e0c7ce2646c0 0x54238aaef3324cf 0xd6938ae19a962260006ed514 0x7b782a3f01d79507132e9a52 0x254ad815fbc06f86 0xb4d0df128254740d5d6a358e 0x26f6ed50956bd0d598858627 0xa6c598fd63b9f2e 0x6a71c6fd5ab69f9c958d2a6d 0x18a03e7302cf0d31b3807890 0x25c9a867f7b98df5 0x83dab2941f484237618553e1 0xe8a0a13a52e680a8bfb4d995 0x1823ada36b21d4a4 0x5e0318005d7b314b5b420762 0x13675e36992e45460027ddf2 0x2d5903e2a240f903 0x4208b0c83405c772af16b5c3 0x1611fe29051a3ebc25abbefa 0x13ed1ad45317bd4b 0x3823c2fc4d73e07c04b05ee8 0xf8f36220235c9112908accae 0xcb104966b70adc5 0xd8dd21a6f1b6dc7c4c40b099 0x1a33290acbe62b63666a197d 0x22af10be6abc5ad 0xa8ecd4584fe07fb2971b41d1 0x3ce86e186fc13626e6487767 0x1dab3edbfcbe3963 0x998434716ecc30d38cdffe33 0x1953fa38d81488bc6aed3e4e 0x2536deb5ed88dcdf 0xb4bbc9edba8d0c81dbcd50ad 0xa2d00657b6c84d6e7e5812f8 0x246d788189bcf0c 0x3a24d0064451712f5e168a5f 0xb5415a66ed47aff677fa30df 0x6ddbfdbfc7bc53d 0x350e69b1d085a6169f3f1f08 0xc273d31d5d7c2eb56233a3a5 0xfee4362dc6cc61c 0xc937e9951e17b7660391ebd9 0xe87abc50507ceb17bc5c22d4 0x28ad0f686e9d1bba 0x5bb83a6a4f769197f66b3d93 0xcaac43fb8de579b4ee695143 0x18177b343814a7b4 0x76c046620ae66e189a5387ee 0xa095520b979d814fc5274adc 0x11fbf8e024c250a6 0xac948602f43c60653510f5d7 0x9aefc1231a9ace1e7780375c 0x4e731ef87c64375 0x4f2a76cd939d4e38f204c97 0xa9d52e9142c57bda5d1bc56f 0xecf138d4446b2a8 0x3382e383bedc619fe4ef0f06 0x568a97fa53b751de7764c0a6 0x29b6c3ea5e6cf845 0xff7e4a1a65f16cd89a86d5e2 0x47f408591cc1e26d4c430ae3 0x1c21d1b3a363ff03 0x77294041b597a020c2e21000 0x3be4ffb21f1435c605090bf8 0x5a87e92a37992f4 0x3e808b867f1d9948fb421196 0xfa155c2c12464865eb497883 0x2b02b43d7ad6516d 0x6d106d8459c3d27eebd02ffc 0x729fde7673ce424e350fbaab 0x3010ca65f1210384 0x9492dafa4cb837967155496f 0xc55311dd51cf5444dddefab0 0x7653abdb3a753cb 0x941af921e1d2a444c81305e 0xfad9ff21b1d1ed40945159a6 0x2770b0437a313906 0x3c7c4534ad8d70de96f59461 0xa7e1976341817c5177d138eb 0x2e7a4eb5a6a7e3cd 0x475898d38ad53be26af77851 0x2fe1e200422e7fa189dfcf50 0xda0119cbe506365 0x4cc8f6bbd575619daba37e97 0xe92ec8923c04e24383831546 0x17b0338206f9d21b 0x84dcd1d684910029b63de73 0x667f9f322d8eccf3b23f784a 0x1a984fc11e8b42f4 0xd314956dd3c371f3e2e2dd24 0x68f5db327a3904a4704d5ae6 0x17f47c14129a3240 0x2ab9689c5ecd391e0392f156 0x438c2e97befc02fa59b60ee4 0x2d6cf74c583e7378 0xb24ab5c3b9b5151f28e9bbd9 0x82ccd98e9a03b35edc80d97f 0x1d5cf2b227ad51b1 0x80cb79f633b00d8c1a7eb801 0x949ce57d5daa53933e27277b 0x16b241ac6cbb1813 0xb26bbf85acf3cdf17c198a2e 0x7c99cc2562575853cc9fec88 0x127e693759fddae3 0x7c5d1d6715ec46431fed2289 0x5cc537a55447a95c3cb07499 0x1f36a73a73390656 0x430b730850e8d1a9fb739406 0x5ff43e8ae65c637a2afb0d9d 0x1866225b0674780 0xc4a053edece61cb1c3dca43a 0xe5ad5221eb4e1cdee321ef39 0x1ed0883e180ab253 0x819cc4c2979c4f40c056cef 0x479adcd36c3f9e2cef58af14 0x1564a8a60d8e02e5 0xac33e73fe9a45ccbfe7bf3e4 0x84435d34b25119c74b3568aa 0x18e9c4b5ffa4621f 0x9c695aa2da9e91ffa68d457a 0x2e179225021058e355c5a2c3 0x2c80c7adcac41cee 0x11c3a4fe920002045ab3b2b8 0xa9909b6d94b0b37ebc5d1301 0x26770e479ff5645b 0xbdd6426fdfdd1ee5b5e11c5e 0xe8cb769707f0c1587d45ae04 0x2b5cd3afdb6c41da 0x72037b3b431da6865ff4893a 0xc2b6f474ffc01d8f8a6b4482 0x2d7fadb4aab84a46 0xe19a538649b23d5b24ac3c70 0x99b17921568e5d694965328e 0x3d68d0e35d67ab5 0x9d474dabfa6cb37ccfa45f93 0x9935c0aa085c1853b9683c26 0x5330a868391dd3d 0x943c92b5ddb449ecb267ed53 0x5d2ef2da636b2e81afa0fc61 0xf84ea50b74d5be4 0x94135fda07c1acc2e68b4195 0xc3352670b4fc23569dc149d4 0xb3212acdda38aec 0x314393125486cb949fda784e 0x88f78d0e1924e21657a48804 0xd4fc88f04b262c 0x5fc36a1707724f8569dcee82 0xd5be601ed6b6b67d8555fad2 0xc1c5c2c34958977 0xb65606da06c56c7fd28762dc 0xa8d08f80dc7661bed46e08d2 0x2a3b7bbad5c7dd69 0x86b2e48009c68477d9d335d5 0xc52abdb8a0a617c9588d019d 0xfd132eae457a8be 0xb02153db2f4a79f48c34da57 0x4b5eb0034d2628356d915214 0x281a2e3c848381e5 0x8dec777d88374dad80d6f978 0x7675c46fd4c1e63714fc837e 0x8a994be88060fef 0x62222e4f3c7785e9b2318fdd 0x8d88317df4876a999c3f4812 0xab5ea064dc0d90f 0x5c2eae797169d52d179dc842 0xa122c6722968f2eeb561132a 0x128390518bb754c9 0x33f1f68185ee718c293433e6 0x2d8aabead7477eceb62ca54c 0x2a3ed5a805254d23 0x70f5b8ddfe7db1130a5c0cce 0xcc728c0d183c441bb215d50d 0x14a7c40996a3fc33 0xf0cc9976b1e10800fc32512a 0x6bbc00f44b6f153babc99063 0x2f3ddf3b4f827bbc 0x34ce165a720c838e4ba9e3a6 0xb4b2dcd3c49a1fe1042a551a 0x2ff6f2e2512805b1 0xaebc630055f131035aac9b8c 0x8873175b8f2eff433e6419cc 0x9cd4ba40ca4ffc 0xa5b53c9846748885c461f7cb 0x1236c1a469ced6db3c3a8c66 0x2be28891165b730e 0xfd52154d28e834d8d1a2fc5e 0xb44764d8e55862d3112aa939 0x1de0104519d3c914 0x968169033bad143db07ceebd 0x493f8420cb1866efac213ef9 0x57a01c9ff6fd28d 0x74831d2e832cc20e228e6e3d 0x277c13e1114ceb6d61258aba 0xf26b289d517b84d 0x636a59706e3ddceefb416459 0xb7d41de29d6835b44c20f9aa 0x69b5f17f5a4ddd6 0x9daf1c8fbec39e88e42e3325 0xdf287b859f58ceeaf53ee17a 0x175c1ef3a1d2e0f2 0x4eb879c3cd072d82d04a619b 0x2b8f5d0685634e402c826799 0x17bffe4ff9578bcf 0x48e01dbd21bcdcfddbe2ad50 0xd157f131a2a2082441c2ff63 0x1681e2ebdc4d3c8a 0x81e6b6e58c8fd57f23cdd775 0x71961637285d8d9a75ba1fb2 0x10504e0581e1ce4b 0x772f906a8adb7fd93d2f5f0f 0x87a379fd2f54db45b8d8da24 0xf12653d4a01d6b9 0x8b9cfd1423eae79325451fbf 0x963d6e8397b84e01cd759078 0xf46798e748f47b7 0x98d461cca8acf2027f321159 0x16d2e91b84c8b3c05cebe3e0 0xc4b02d18dc9e661 0x238c8a95882d9f264487ca00349e313022608d69281d0dbd26bbcd4011bedc0 0x18 0xb714fe4adeb7275798704c12 0x43d543cefc60fea3d529e086 0x1402469c3e3069ed 0x0 0x9a80b660e9c1c32997c44be2 0x2d20f2566c8cb2ba29a565f2 0x6d34fc045094f49 0x0 0x10000000000000000806d684870360dd3 0x100000000000000004076d6fa35976228 0x2ed8bc4a716d92e0 0x79daa35db491de3b 0xf40265992689d433d9a61c88 0xeb68a574bc013dc65099192d 0x23ecd2e86cc4c14a 0x0 0xa4d74452f79ef87abb681f49 0x4400b6a2280d46210b6bbbb0 0x11c93733bb043e26 0x0 0x555bb8b09dc33676 0x14d8dcd5b8292d07 0x16f3026d21529fe5 0x1000000000000000011f5f7ea29c705fe ================================================ FILE: src/contracts/autogenerated/risc0_verifier_bn254/tests/test_contract.cairo ================================================ // Generated by Garaga version 1.1.0 //! # Starknet Verification Contract Tests //! //! This module contains comprehensive tests for the proof verification contract. //! The tests use Starknet Foundry's testing features to verify proofs. //! //! ## Test Strategy //! - Use real proof fixtures generated by the garaga CLI //! - Test both positive (valid proof) and negative (invalid proof) cases use risc0_verifier_bn254::groth16_verifier::{ IRisc0Groth16VerifierBN254DispatcherTrait, IRisc0Groth16VerifierBN254LibraryDispatcher, }; use snforge_std::fs::{FileTrait, read_txt}; use snforge_std::{DeclareResultTrait, declare}; use starknet::ClassHash; /// Declare the Risc0Groth16VerifierBN254 contract for testing. /// /// This function declares a new instance of the Risc0Groth16VerifierBN254 contract /// /// # Arguments /// * `name` - The contract name to declare /// /// # Returns /// * `ClassHash` - The class hash of the declared contract /// /// # Example /// ```cairo /// let class_hash = declare_contract("Risc0Groth16VerifierBN254"); /// let dispatcher = IRisc0Groth16VerifierBN254LibraryDispatcher { class_hash }; /// ``` fn declare_contract(name: ByteArray) -> ClassHash { let class_hash = *declare(name).unwrap().contract_class().class_hash; class_hash } /// Test the verification function verify_r0_groth16_proof_bn254 with a valid proof. /// /// This test demonstrates the complete verification flow: /// 1. Declare the verification contract /// 2. Load a pre-generated proof fixture /// 3. Verify the proof on-chain /// 4. Assert that verification succeeds /// /// ## Test Setup /// - Uses fork testing against Sepolia testnet to access required declared contracts maintained by /// the garaga team - Loads proof calldata from `tests/proof_calldata.txt` /// - To generate the calldata, you can use the garaga CLI: /// ```bash /// garaga calldata /// --system groth16 /// --vk path/to/vk /// --proof path/to/proof /// --public-inputs path/to/public_inputs /// --format snforge /// --output-path path/to/tests /// ``` /// This will generate a file `proof_calldata.txt` in the specified output path. /// You can then use this file in the test. /// /// ## Expected Behavior /// - The proof should verify successfully /// - The function should return Ok(public_inputs) containing the expected public inputs /// - No panics or assertion failures should occur #[test] #[fork(url: "https://api.zan.top/public/starknet-sepolia/rpc/v0_10", block_tag: latest)] fn test_verify_r0_groth16_proof_bn254() { // Step 1: Declare the verification contract let class_hash = declare_contract("Risc0Groth16VerifierBN254"); let dispatcher = IRisc0Groth16VerifierBN254LibraryDispatcher { class_hash }; // Step 2: Load the proof fixture generated by the script // This file contains the groth16 proof calldata formatted for Starknet let file = FileTrait::new("tests/proof_calldata.txt"); let calldata = read_txt(@file).span(); // Step 3: Verify the proof on-chain // This calls the contract's verify_r0_groth16_proof_bn254 function with the loaded proof data let result = dispatcher.verify_r0_groth16_proof_bn254(calldata); // Step 4: Assert that verification succeeded // A valid proof should return Ok(public_inputs), not Err assert(result.is_ok(), 'Proof verification failed'); // Optional: You can also verify the public inputs contain expected values // let public_inputs = result.unwrap(); // assert(public_inputs.len() > 0, 'No public inputs'); // Additional assertions on the public input values can be added here } ================================================ FILE: src/contracts/autogenerated/sp1_verifier_bn254/.tool-versions ================================================ scarb 2.16.1 starknet-foundry 0.57.0 ================================================ FILE: src/contracts/autogenerated/sp1_verifier_bn254/Scarb.toml ================================================ # Generated by Garaga version 1.1.0 [package] name = "sp1_verifier_bn254" version = "0.1.0" edition = "2024_07" [dependencies] garaga = { path = "../../../" } starknet = "2.16.1" [cairo] sierra-replace-ids = false inlining-strategy = 2 [dev-dependencies] snforge_std = "0.57.0" assert_macros = "2.16.1" [[target.starknet-contract]] casm = true casm-add-pythonic-hints = true ================================================ FILE: src/contracts/autogenerated/sp1_verifier_bn254/src/groth16_verifier.cairo ================================================ // Generated by Garaga version 1.1.0 #[starknet::interface] pub trait ISP1Groth16VerifierBN254 { fn verify_sp1_groth16_proof_bn254( self: @TContractState, full_proof_with_hints: Span, ) -> Result<(u256, Span), felt252>; fn verify_sp1_groth16_proof_bn254_u32( self: @TContractState, full_proof_with_hints: Span, ) -> Result<(u256, Span), felt252>; } #[starknet::contract] mod SP1Groth16VerifierBN254 { use garaga::apps::sp1::{deserialize_full_proof_with_hints_sp1, process_public_inputs_sp1}; use garaga::apps::sp1_constants::{N_PUBLIC_INPUTS, ic, precomputed_lines, vk}; use garaga::definitions::{G1G2Pair, G1Point}; use garaga::ec_ops::{G1PointTrait, ec_safe_add}; use garaga::groth16::{ Groth16ProofRawTrait, multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result, }; use starknet::SyscallResultTrait; const ECIP_OPS_CLASS_HASH: felt252 = 0x396d5915ecf475aab117bb25a0272b261e9e25ffe1c0ce05a51a3f77489c89e; #[storage] struct Storage {} /// Internal helper function that performs the core SP1 Groth16 verification. /// Returns (vkey, public_inputs_u256, public_inputs_u32) on success. fn verify_sp1_groth16_proof_inner( full_proof_with_hints: Span, ) -> Result<(u256, Span, Span), felt252> { // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok((vkey, public_inputs_u256, public_inputs_u32)) if the // proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given a // proof and a verifying key. let fph = deserialize_full_proof_with_hints_sp1(full_proof_with_hints); let groth16_proof = fph.groth16_proof; let vkey = fph.vkey; let public_inputs_sp1 = fph.public_inputs_sp1; let mpcheck_hint = fph.mpcheck_hint; let msm_hint = fph.msm_hint; groth16_proof.check_proof_points(0); let ic = ic.span(); let public_inputs_u32 = public_inputs_sp1.span(); let (pub_inputs_256, pub_input_hash): (Span, u256) = process_public_inputs_sp1( public_inputs_sp1, ); let vk_x: G1Point = match ic.len() { 0 => panic!("Malformed VK"), 1 => *ic.at(0), _ => { let mut msm_calldata: Array = array![]; // Add the points from VK and public inputs to the proof. Serde::serialize(@ic.slice(1, N_PUBLIC_INPUTS), ref msm_calldata); // Serialize public inputs as u256 array. Serde::serialize(@N_PUBLIC_INPUTS, ref msm_calldata); Serde::serialize(@vkey, ref msm_calldata); Serde::serialize(@pub_input_hash, ref msm_calldata); // Complete with the curve indentifier (0 for BN254): msm_calldata.append(0); // Add the hint array. for x in msm_hint { msm_calldata.append(*x); } // Call the multi scalar multiplication endpoint on the Garaga ECIP ops contract // to obtain vk_x. let mut _vx_x_serialized = starknet::syscalls::library_call_syscall( ECIP_OPS_CLASS_HASH.try_into().unwrap(), selector!("msm_g1"), msm_calldata.span(), ) .unwrap_syscall(); ec_safe_add( Serde::::deserialize(ref _vx_x_serialized).unwrap(), *ic.at(0), 0, ) }, }; // Perform the pairing check. let check = multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result( G1G2Pair { p: vk_x, q: vk.gamma_g2 }, G1G2Pair { p: groth16_proof.c, q: vk.delta_g2 }, G1G2Pair { p: groth16_proof.a.negate(0), q: groth16_proof.b }, vk.alpha_beta_miller_loop_result, precomputed_lines.span(), mpcheck_hint, ); match check { Result::Ok(_) => Result::Ok((vkey, pub_inputs_256, public_inputs_u32)), Result::Err(error) => Result::Err(error), } } #[abi(embed_v0)] impl ISP1Groth16VerifierBN254 of super::ISP1Groth16VerifierBN254 { fn verify_sp1_groth16_proof_bn254( self: @ContractState, full_proof_with_hints: Span, ) -> Result<(u256, Span), felt252> { match verify_sp1_groth16_proof_inner(full_proof_with_hints) { Result::Ok((vkey, pub_inputs_256, _)) => Result::Ok((vkey, pub_inputs_256)), Result::Err(error) => Result::Err(error), } } fn verify_sp1_groth16_proof_bn254_u32( self: @ContractState, full_proof_with_hints: Span, ) -> Result<(u256, Span), felt252> { match verify_sp1_groth16_proof_inner(full_proof_with_hints) { Result::Ok((vkey, _, pub_inputs_u32)) => Result::Ok((vkey, pub_inputs_u32)), Result::Err(error) => Result::Err(error), } } } } ================================================ FILE: src/contracts/autogenerated/sp1_verifier_bn254/src/lib.cairo ================================================ // Generated by Garaga version 1.1.0 pub mod groth16_verifier; ================================================ FILE: src/contracts/autogenerated/sp1_verifier_bn254/tests/proof_calldata.txt ================================================ 0xf80739ea729635128f87c9db 0x8bd62cf3413ae30ccb5cb124 0x3a67b2b92ec8075 0x0 0xbada4d3959a1d0e421bd8617 0xc89c329c82695448393ef4a1 0xd73627973ff2282 0x0 0xdd0ccfe5917761ef3d5cee7a 0x9c21c25b35bf74ac737c8c23 0xbaa720e442de1c1 0x0 0xcfed88053163a2ac94869e18 0x36c0fb4ba2bac814885c06d0 0x4d40dd04d20f4e1 0x0 0x4bc54e609ca3e5cb25e3afc6 0x5027f40e289a48ce76fa8371 0x9d21063f8f4c60 0x0 0xd2a77bf9fbcf68c8cdec9b6c 0x95e2f10d7943fa1caf07f9bb 0xab9f6dc9b4e5ef4 0x0 0xc88a87cbf7023df41fa14c0e 0x221fafd6e9cb82c03c04bf0c 0x2745103dee46695a 0x0 0xee684a4bbf22a139e56f2b17 0x73292c17bae969c87e752af1 0x158b03356b5595a5 0x0 0x99d2856198792afcc16af2182c56515 0xe00f8bf845ce217630ab77a3351d3f 0x3 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0xa 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x37 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x59 0x722eb85ba595ee4a5653d198 0x93fe6e1d18c33c34e96bc4cf 0x13de8cf3b7f90a4a 0xd7ed6e3bb7e8ed4b796ab5b0 0xe8dbeccb00ea189954d32682 0x2b4151c4fe6f8709 0x41e1961c729c2f10319d41b1 0xfa72fa5bca35d172179c34d6 0x1861229c1fd50a13 0x72057ba2bc6fe43049b3d305 0x96f0233c2a944df5f0a9650c 0x25c663fc11975f31 0xa63a3350751315476c2fb401 0xb135be310271eff0d8fde8de 0xf0af755e989ede4 0xfe4bd9e9f2889230409280e0 0x96dffc3684889560085bfed 0x344cee4acb08a9 0xc695823e6e83d3096e236a9c 0x695eb72c8dc80dd7b9edcc6e 0xc2c3eb404b4659f 0xaf037e0208896f5e9f98f116 0xcf92a7f6b11b3876c22e2f34 0x15d17a7d1ff495d2 0xfc915071a01eda9c0f0162a 0x3e97caaec2e42a8018031a9d 0x176cd09f53add701 0x13d313c7ad7d5b744f4dca27 0xd8cee2412a1c68754169322a 0x723ea6b9d6dcd9c 0x831c33c4b18ec243cee69300 0xf39157f7826c5efafe344373 0x157fde2c65713426 0x7fb81be436ced44825c8beda 0xc3347df75f7ea57a4b08cb9d 0x9805414cbec7f00 0xfe5f88429f733a5c29ef76a6 0x3c7620f86d49b62b47497d2f 0x146bdc58364967f1 0xceca5a22b2301be7079d6da2 0x845a7d2d53ec0b6398611002 0x2f6fef0717bae93a 0x1c2fe7659bbaf32af4d4a289 0xf58c851287415ff970ea1023 0x2b329329d4d1fdac 0xd5ba07de90ba5ae2a654113f 0xff114b8d2ffc83fa5b1d8ab8 0x43d9e5ad0ba80f8 0xcd02c79cf4794fc934733285 0xe2606ba3b42204c9a79c6cca 0xd78088291f2194e 0x23971fc0976965130ab9fa09 0x18f434f521b4f14660db42f1 0x5b7a1f4483dac54 0x23772d9fafe650a5f0769aea 0x53f4c017797bea0f3f756d1f 0x2d7f9bb9603f8ad4 0x516bf66b5c72092ca1531b81 0x7e4a2de688e3b63de724050b 0x19edf89a0e062ef4 0x6caaf8c108277c1cf82c4d6f 0x4a7477e833ad44eb8a53586 0x1d2c22701f6deb4b 0x9686a854f8305703c2968011 0x6b3f8cf3f643cef8e53c7fe2 0x4d848f76289cd30 0xb531d669bf24ad0daea89bb8 0xb47334a823714044f6819b26 0x1c9da3a885502b19 0x1e16ef52cca23d9719d90a6b 0x8a720ca0043f7a41cf63ab0e 0x20cac68e1b9a5427 0x1 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x22 0x899f96c818ac403a0eea08ff 0x4612678c14001edab0a2283a 0x1608fe4d3f110f38 0xf276c0ef6bdb1c5f18bd88ea 0xd372ad96ab02e51d8fac5089 0x1e4da800f74aa5a1 0x237c71a842df80e4ae92d536 0x989da96f2fd2c33a75549111 0x2a1bb484bddb021e 0x67d59d7a0eb0d9110f8a4d11 0x3eaedb500a0a3cc79b67156 0x21c0a7203cf660c8 0xe32d2bf92aecb60f3bf997da 0xef0960fa4713cb57d808ce5e 0x2221c072912b2421 0xb1aa8945e3d4112df5139ddb 0xfd13eb75d45fd4f36a5632df 0x2e71922a84e4ffd5 0xb7058d32b4743d1067ea67fd 0xda59a5a1cd290f9a74246939 0xad2d9eb98c7cf07 0xcf7433be69fe9284ca6f1c84 0x546d2e640083e4d37fa407f9 0x1c4217a24775cfe0 0xc0aeaeac5efa2b7e93e81bf2 0x1b7a06cd2b85e00e54f60def 0x90c4716824967a 0x206926270cc804f7b3d80d6f 0xf3c6a2ca8205175bc3516ff 0x1e5a76eacaea5c78 0xe8ed69b1a18d75a3b02789bc 0xa42519fa8be45e6e67a78ebe 0x30a32f24e37c538 0x47bdff9b2034f6ea0897fb6a 0x5a3c5f9de776fc99364dd86e 0x28eaee212f62dece 0xe8c25e968ae2a22dff93d638 0xedb7d4ae1f1129eba574bdc 0x26d7ad2e1618b573 0xc0127bbca3d571e0dcec54fa 0x9e23e31aad3906a3a468152c 0xd3c9da60bef18c 0xbee3e8e626283ae85f136a 0x52c41e6e4521301d9cd1ce3a 0x532fc80b14887c8 0xe19b85f3fc091152b64278b 0x9866806a6e92d1864ad6c19b 0x71418d935c98815 0xb9573ea3907be3c0cc2e8da 0x985e757f7c58b10b32e6cb41 0x2cbc76b5842cafcf 0x4517ebf3bda6f74c07976fa7 0xa55f969bcb80139f5cc61a87 0x15744f5627fd8603 0xc40cff2e678ff7054556a986 0x559e28a0a270a94d69c69a3b 0xaf3e46064dd3a24 0xd8629b812542e77bdb8abe2c 0xff70cc97946349457e59db1c 0x2edf6bcd3005a0b2 0xaaa652cb3986f89357ca2b8e 0x1196f2c81ea1138debab00b2 0x1da1250d000c756e 0xfff3f23fd6ec6bb7b5bcf975 0x2382bbfa1883abf27f95343e 0x170d7fec766c11aa 0x4a475e6f2d59f7af2601149a 0xb35e18fce0380b9e9a268080 0x1c77c6b1d0d29488 0xeb7cc28be61636214fe6d034 0x3e6b7ffc307884efd9039657 0x147f4dcf0da1df88 0xf123a8fb61d453f457ba102d 0xa1d566d9cf749657164b282c 0x1f8fafbc70fe5c25 0xc70dca82225b4a1416e1024a 0xfa61fd6f0d1c52e57b5cd186 0x1e5d6c4cd413a9ae 0x3cf67c128cab7a4b8295c2ba 0x9eb55fe22a57dec38727bfed 0x16df456d8ed02937 0xa9f76a5f29744dbe699ffe03 0x9afd0d9f14be821fa04299ca 0x23cc6746fe097a54 0xe811a025108cad439f8bec7f 0x3105f366aea4a9a06f69b87a 0x1436e4e2b9eb072c 0x21fb73d34adc475bf3e9d237 0x5bf29b79076d6576f2bc0b26 0x75140d15ffc302e 0x31a8fb1c07b22ec88bcc2f4 0x736948de3a66884c8600ae2e 0x2538a773eba2fded 0xedd0f29c5bb9d35e57e52540 0x33b1a86d2f0a7c2a96721837 0x12ec69e6d85a75f 0xea5f2dd2229b2b57688fd156 0x23c45650d708b828fe479e71 0x1b6c1a075d4dcd18 0x82bfa2719566106791c37da8 0x4b992b52e994beb5eaa2aab5 0x1cde51590a621851 0x8aa5c70e30936567cf59cb5c 0xd8457831d0d903625d5845ca 0x284597b9cd2d9adb 0x7b0b09377318013cfad7da79 0xfc2b52907dd2beb7f316167e 0x1c0c62a48ef5d551 0xa0d1aca5ecc18769ced60cbf 0xea549c80f0e07d47f54fb4e0 0x1e501a2dd31d9444 0x91b4c6c859fd94d2e077cf93 0x41199218d8f749007871412 0x19cfa3917d5e0359 0xcd3f86e757d4aa535f959fdb 0x161bc39ffbf028b906bf5f61 0x1375195249b7f051 0xc4f623f948e0aa5dd5d6929 0x68bdff335b0cca459de37ac4 0xb5a131868345af9 0x4bb0b947dee1825c0bb108fb 0x8cf9a47ea942fcc600bfaca8 0x2c026828ade7dfa8 0x15d6b482c1023197253e7e1a 0xb2537c5396aceec626b63f02 0x2f18df721137c9bf 0x640214f7013afb31e0bdab63 0xc643538f55b38f3cbff0354 0x2b391aed098e6ce0 0x993fd6a74059cd2cc9d2e06b 0x18e00062ef908b856b8a9bca 0x431a5b174dc0326 0xd94a5c873c7aad7596aa65eb 0xdff93e1d4497383737f6df4e 0x24d8dbb2b146e438 0x696d2a2a17cb460915be7cba 0xbaccf943804e927ad666cceb 0x163ba394cc43cf91 0xb74f2e6f3f6f018cfd7d5bca 0xe5427aca317baff75d2f9f7e 0x225efe1e7d1c833 0x8de98cb20848d7f66b9eed77 0x50bd297812bee675b6c1819 0x2656c1096f6b9ab9 0xae77b1e75b5a0f7a7642b32 0xb3c24d54f4edb5710d719f0a 0x1b4b45963c363e4 0xe0ba1bf61dce8dd5d329dc01 0x957fc3e7c35c766e8361673b 0x8a56d77f79ee088 0x7fd5d24cbc990b8a9bcfbb13 0x4867dc9789f0c46d6e7d884 0x1129ad24b450cb41 0x678484ffde0521034191f186 0xd62fbe112a529424ab45f93c 0x2966825289f74409 0x73c35cc9f59af6de638c5bc 0xd1a2ae7bd5c68c073eb6475c 0x2678734594e23df8 0x609d037843c4542ef411f05b 0xb62e6b352be8ef6f59608396 0x7bbc722e2c0057e 0x718e2c6dcc1a131dcb7ff8a9 0x343d635e263f5533943e038b 0x2e15cc7c276791e1 0xaf70094d05924eb44ccc972a 0xe2305b6b40e39c5ac32e2418 0xea868b3fa750b92 0xc27db91f7f14ba30a04772f4 0xcef52cdfc9fa9f4cb688fc78 0x2453a69d3d875fbe 0xed9834e28c1e5e6600fd9d45 0x62ebdfb861269c4ed8344896 0x16bc13ba7b402ca7 0xc6f0a10c9c7ab7d73b336e1 0x3733fc46abd68ceab848079a 0x198fbfb653d4f214 0x265b172d4cb50f6ce5e43271 0xdf9c550d1c7df6a7efa184d8 0xced263da575209a 0x686a5cd5edf3dbee8ba290a 0xbafee505d302ca0b9736bcbc 0x2faf4e066b0f299d 0xbea264e301b0d73c4f14a880 0x8b14cfdaf988859edfbc0845 0x2b877e3930d66443 0xc65cf2020dd51d1acd35dc56 0x712bbf43c098d915acc9adcd 0x228b3c57c78fe6c8 0x3a9f27c3f8ea3671676faea6 0x2f35074ff6f6c30a8e0bd4a9 0x2c4e0ee110697f25 0x17c9c8e6a743ba87226e6b0a 0x55d2967e82a536795c57cd47 0x1d88d669fdf058f5 0x903d34aaca87a3a5856282aa 0x84375e9139ba261a44d853b 0x19898994470db313 0xe97c9a7356212c024fa245da 0x379e8c74b26e040d9d39edbe 0x2c91a6a570bc0b4b 0x8a73b6c68c1d9ae58acb21b5 0x611b70c069c563e67ff41373 0x2edfcc446cafac1c 0xe145cad2675d653ff4228db7 0x1e1596ec3208aa709731ebdf 0xcff4fc63cba1162 0x31655928805b085a5c349a68 0x71dbbbc7caff1d373d145041 0x290ca8cadadfa760 0x367128a4d2c59c333393d53a 0x9d3428463cc8773b39d36fe 0x1cf4bd0b1f0873ce 0xe14a381ffda69240bb20f4d7 0xcc3ae4d6eab12c4ac47258b0 0x2e028e13a3c776fe 0x16b9d220bda66d7f39a53bd9 0xae704908bfe5dde1379a30eb 0xe8bfc3d658559f7 0xf5525a9d15717b048416f77a 0x177c1d6ceac11ddd763cd999 0x2d026a2be17e15a2 0xfe41ab70c728df169f53b4aa 0x44b62b4a000774d319165bbd 0x17e21b07c2c93d3d 0x990b7aaca84eb5b53a578cbf 0xb15394cde47df013bbe7aa44 0x192d1f968026cb7d 0x22adcc1c517f64262c7c4f24 0xc3eb90a368efffa8afe65969 0x24ab842108d98c44 0xb050aa0e75fce4c0d4c4cb51 0x163f5720a8e720053fbff6d7 0x251b9a13eb6410ea 0xef10402a6fa8df96dff5e4b5 0x37103aa8251e6298f38e5672 0x2fba38a05a666245 0x49d8f5909e924b20c2ff45c0 0xfde01f585366083dfeef111d 0x7965352b7384e79 0x60195359a2cd5d4649468db0 0x6c60e667e0fa405ad3a9f82a 0xd0a242ac096b5fe 0x81fc1570c5b9454eee71e297 0x4cd01dace91180a6753eb951 0xe4f6816980e76f4 0x43a2b93b448a3c6c0a0c125d 0xf8dcc724da05d1c6387c8be8 0xcf05f6b0dda23f9 0xc72ec170a7b958cdfb44ad6d 0x89fe02bf6d3fb3d3a0ecde60 0x39daa9c34386935 0x579077636d557340cb5e382d 0xbb7d5ab032a1c23d990168be 0x1598b0bba0073ba1 0xf1ea522ca4f4eaecdaae14d9 0x573d20d09124cb5ed418fdb1 0x10ae5cb62763d1a 0xcbffb5d2bd865703108c1c07 0xa6d75cf8045f2f3dbfc4fc9a 0x1c3f437caefbaa55 0x7cc163cabebe795d001836a 0xf1e26d6e828923d6198e06a2 0x1d6eeefdfe21276f 0x8c9e835a5724dae55017b7a8 0xfe5a5456d10395f482f29015 0x3855cdde54606b9 0xf62fbf77b268e83c2b3a031c 0x8f80e99ef13a631a67b917e9 0x616b3b10a32d31b 0x2f97d43837cc24ebfad0f37b 0x82149dad8bcd5bf8a6c80bd 0xed804eb36802ba2 0x807315006f4d57ae0bc1e23d 0xbe47112e5d2343610117935a 0x1647184f2954768c 0x4e4edf65dd72abe6d3ce11c4 0x1032a9352976a46d9d0926b9 0x2c1828c81959f006 0x4b894fbfb7a79662d25da13 0xcd74233f3e68b96f1ee69a9c 0x18b2d969379328df 0x97aa6b296d138b59ea43e543 0x4b54e388cb0f6f2c97c110cf 0x4adc7ed0e6ccbe8 0x7645fcf6f89a43bf706798f9 0xdced018326dc665006813b52 0x2c65dc9b3b3fecec 0xb407a9b59f8520741d48a863 0xd9d8ca2ec62047158a8f484c 0x20fd292afd18238c 0x3c5592f184a4d6c0dad8620a 0x9d6bbb8823683fdbfd5b8268 0x29d59da2627aacc4 0x76b7409170f9ad694f997067 0xbf2171a60d3e044b05f8925b 0x5f26d82e0c97521 0xa34b126c402dfc992551e029 0x3939d7178989118b59c761a5 0x1812f58277cdd348 0x43bd3130e9e2692cfb839980 0xd0bf613e380b4d0123268b00 0xe5395aeb3b4580e 0xe31c940941ad463c0488747e 0x8de3002883f66792a235acb2 0x12c1893d70aab237 0xf96b11060bbe1b6330c866e1 0x236dbc1b990d70f89801f2f1 0xc800fd953cfd23d 0x1a1e40df4ec2febe0d7aa08c 0xae1ea99ece01cb0f03d10d52 0x122cc804195df92 0xfdd3fe027645ff4a266df359 0xac78684e8a91bbdd4a13c19e 0x22e918fcc1822531 0x3fc1cf1ae95a7023041fbc98 0xb810c8b8a4439d086c52c4c2 0x1cce950f07cd49ca 0x8208234f570da172edcba043 0xc45c875972f7e2fb154cb1c 0x1653b9cbe0a6b6ff 0xe081ea0d72e8e68564485110 0x6e201ce6e3d99d83686d1d0f 0xe304a2188060bf0 0xedf366ed6a90e7bdfc8275c 0xe6e0b44480a0b5b88ed3d222 0x20744034b46b848c 0x512ea166de2a0d30491b3616 0xf11f499b0ce1a73fa659f918 0x25af2b04ad9852b6 0xc73a891fb15e7e756c015c10 0xc967309fbde7c7df49e2393f 0x621fda63242329d 0x9ffada851de4411116872085 0x90058ddb651c3d96ff7b0e8c 0x58a5ef17789b73a 0xc165c96062a899f5d92859bf 0xc08dcbbdbd79575ac1dbdc44 0x1c4d509281e0102e 0x89efdf3f9b0fc52a187b0147 0x1f68bcb1f9210c3f95bf3125 0xa4b0399fa5b5b61 0xdca72dd925a41ed7198d1f38 0xf8c2faf05ea0823dd3f1064b 0x270733c9dad76420 0x612b006fff2faeec0a2d7248 0x8a5eb4349d1e4922896712fb 0x273cec4e6308f5a5 0x5d19c579e42748c160125218 0x668e00641a2aa8edaf2de293 0x2482335395750ece 0x8c70cabfd031645fb3b6acf2 0x43a9863a0e6c32b306b8ffa8 0x2a06d620f1bbe8e1 0xca6fa3e323826e3d7e9995a3 0xfd3e01109a20c2f81f030588 0x1b657605ea22d422 0xb405e6392bcf4e5f8eef6689 0xb0956028b6f44c32639e7ed4 0x29c661490fe6e13f 0x9b4e1418b86c6ac60b9a6e7e 0xa91614e993ad36faf52efa36 0x39cff397df3f9c7 0x2ea0d1c6fce5417747201c46 0xd071e99bff9d7b19aedb5dad 0x27b592ecb0d3fa67 0x989e62a700a17a499f9dc30f 0xc46ec56c7e343568b1efc15a 0x2f506fa533746c29 0x104ed06b6cab1581945397a3 0xd0c1e65c0c677eb9d430e4bb 0xb3fddf55b72b817 0xeeabbe91ab1ddb6e9b13a57d 0x55ac257409d21598d4143464 0x2002ba34651a82c4 0xf688ac401fb5aa1270a2342b 0x9557250595ea1d3de4d63931 0x2a054a62077b16ef 0x9946f8f5ea70b41d9a6ebcc5 0x5e39fc62260d47ed671e3929 0x131102025bf8dfa2 0xdea36b81b9bbcc87169642a1 0x3b6f8832b932d7064e2e379c 0x100197149579f7b0 0x44c2eed475abd3af1f8c787 0x5dd37f8b5f1aed2edf5dbf0f 0x6e368bc2faf8847 0x6d0be0de8b690332a0a90b3a 0x924f6e2c99e15f9d474b311d 0x2bf0bdfd4f4db9ff 0xc35a3d261dab1e12d57045bf 0xe4960927e056a8d9a261a040 0xfa2222feaaae1c5 0x7ba2978ea62f71b12291d0a5 0x76d98b6ea773ef1849719d5e 0x16f4de07484d8737 0x9cfefc70c1b8f7b418c3d39c 0x884d482af9c008f25f17583d 0x1dddc0c35b1476f1 0xe493836538c6bfd27b38910b 0x57280417108953863c898753 0x2edcfd52c9324e15 0x74a86f278a1136542a0ff1ff 0xce4c8bb59ce9d03aea7e645d 0x112d75db5c4f29fd 0xb8ffa255ccc2b61ebd7b6bc3 0xc8efc77e902bc6a315667786 0xcf4723cc3e7012b 0xa22c2f05fdc5c4f3da7332dd 0x7a817c8e967493806674a973 0x118a5ce561aa21af 0xa02c862db92a7038b0581975 0x18fd1ab7c4e38c1eea7b1949 0x1a2210e469ebcba6 0x7e5408aeecdcead7b9b9d89d 0xc5210931ec51a818dc7d4b79 0x97c126391df727 0xa92ae086447d0237e6b065b0 0x9019f9a361162bf66ee5630a 0xca6d960085e1031 0xa5349f651d1635d4104c8717 0xcdda4a07863829cf5f21d5b4 0xa3a5c2ca87fcd65 0xc137370e728fbf79edc5fb97 0x87a2e081933e0ff3451e2230 0x186d2ad5dd9a7a02 0xe684f4dd204232e0b3db7243 0x4dd9b992fd13b27c89f06c90 0x11d9b9faf7e7fcca 0x2953cd3526857c2ec60b406 0xafb4f73ec710aca029f476d7 0xd61f6a1aed4bb79 0x72325823bf7a466f2fab2f4f 0xbcba2142f345dff3530245ff 0x19ed75c425caa3ae 0xd333ee25a3049a73239fdaa2 0xa65360fec31886da5edd6c98 0x1ab54213832c02b 0x757a779503f52ce05040eb20 0x6d78a51f36be4581ad7a589d 0x273677d970845959 0x196de6c5621eb15721d45038 0x811b8cc0c0981be925e4ab0 0x111281cb83813039 0xca21bde88b9e1f9045fea2f8 0xfaa1c535b61903cb77c59815 0x130b61c8bff9124a 0xc1b6d4048fe956b84b50daf2 0xc8e6fa2184e4f32fa573cbd4 0x28d693c7c1c21116 0xfd60ed2372e2084a4d4af9c6 0xd8f3363039a7cdbcc5869598 0x5bd9e106aae104c 0xde0233c7afed414d0be0f658 0x2c4f578b11fd9ce3b2df914b 0x85f148cad3e119 0x848d7282bb37a09d0dc6d6f1 0x5cfb52d8ba06e1449f15f956 0x247cadb8a17b182e 0xc131bcdde35f0e048fa6b050 0x84f22229e00682e8f9959bc6 0x243c2123487b8109 0x887947cf0d2c74c79662e6f0 0xd09fd14ab371badd309d987e 0xd64e162ca979f6b 0x6def6a7d6a1f97a6eac17898 0x3fcee63459462ab71fbd50a7 0x77ced2302cea795 0x3ce80865574a0ac894fe67f0 0xc147a8869bb9993037a3175e 0x25a384e430d8d66 0xef10dbf874449062778a2a67 0x56c850bbecc848ca096d4f0 0xa2b6baa0f5c0067 0xd08c7fff71e191b5bf4c5618 0xa86a508100d0e11217200db3 0x1d15d7e3098242cc 0xf3897745221b33a6975aa18c 0xeb419c2bd629c305aafc0da9 0x28481b994e774e99 0x55b30ae9545a26d41a60941 0x5bfb93342169bd939f538e69 0x1cbc7a6778b5168b 0xedfbc1c8b33430c90444b894 0x92b034ae625357ecd2acea0 0x2ed0e273469fdb70 0x4714af33077172eb839a1ba7 0x8f3d52c634fba83070c5d07 0x9ddb2c219a4978e 0xb9680f1799b45e150afecd93 0x6089e118a2cf7f2028d4cce8 0x8caecb0e4513e6f 0xc0130cdccb9b36bb3bd7f39c 0x533cf7ecaef4da99c5c78f1 0x217edc48ed8be519 0xe8a35534af48ae63208d4b7f 0xcef6bf025c532b2256706697 0x126a9ec58c625061 0xb7de0a7ba3ee337a76adb78b 0x2bfd43b48a3c3543f4f6a2bc 0x1a32096355c7e1d3 0xc31a614fd9a48fc474d63753 0x868c276abc6e4a027a8b8009 0x192361c679be3429 0xfbcfcbbc85d6259f284bb529 0xc83d14faaf080e66dcb7c147 0x29c1fa8fdbc0e8de 0x5889afbc6690df78ad0e10c8 0xd5e1cf6c4d6b6a5d922a0cc9 0x2ee9628dda46db5d 0x6768a79f3ecb36a7f51c16e2 0x28011fd46670778b45019867 0xa26c6be06a77a99 0x1aa8180e672d30fcbd791a01 0x321dc60a6b314f15424acf09 0x52098e7616279bc 0x7d07183d759a4bf20e7dfb69 0x2f348c12af7899cbeb2aef53 0x724a487c702fc67 0xde35accf42d29f796b7fbe6e 0xce54e4dec438e9e390abbc45 0x2a131a2d991d9218 0xbbbd5aef61b25f7a2916dd11 0xa2f6d3270daf3b452c077639 0x2d8b2bb64de3513f 0x67e967a991e04f1830ffc518 0x8027af404094c1220c50ab8c 0xcccba1e004153fb 0x27a28d5bc4f0444586079c72 0xa2c9dbe4a2ebe45322e762a9 0x2341181eb21fa521 0x84c8378248825ed26da3d385 0x344cc6971136e567995aed7e 0x2b91ed7ec7342d55 0x5e57def4e27f10d04b050129 0x7ba6446829ce29864342aefc 0x10037325ed9a36d2 0xc78b901bc423ab046d77b209 0xfb6a80ca7440fb59b9248e24 0xa97edb9c6c05b1e 0x5ca43f21eb994c062587605d 0x1cb0b82801609fc50985666 0xdcebc89c0ed6cd7 0xd30c5f266d4c31e82b5188c9 0xee74a67ed51970b8288b17c4 0xc4a667ceebea976 0xfbc6a91a3b3792e0ae615988 0x31b0a52429b550d3f2796a2a 0x25e2fc9d0bda2f12 0x6fae3acc78f7beb46f8ff26 0xdb2149e7e413730bf4989c91 0xbfe8345a1822ee 0xb29973aafa428b7af5420743 0x470b56f6d6f708b16462ee84 0x22c8eeee81515ac 0x2338cd552ef00a8c37238ecf 0xb41bc418ca5d7b5af2bbf5f4 0x1d088c091bb0785f 0xadb84a430613666d323cedae 0x671bf042a6262f93391b689c 0x1389e46a0d08d6a7 0xf4b5fc67ef4899edca0cb81c 0x9539ee0a07570a47c21e014f 0x19c89fe28f4f5992 0x8ebb79cd4044d7f4f4e3083f 0x470d31ba83170166a04527a2 0x1371a783cac91ab2 0xb2c4d70abe37744838467725 0xe506a9656fd6a4b9eb3cae94 0x2196a1ee1d26802a 0x7d5c92cabaf1fe2086f93e6 0xf0880388490a9d251d0da3d2 0x268ea94b49f0acab 0x183e7a5769e14afcd0828ae9 0x642ed41000331c4a1f22015f 0x105a635ef54687b2 0xf5c106f27dc72d21ac4adcba 0x9628560defaae8b312862b4c 0x12def98b8967708f 0xa7932947493ab0600d70e3d9 0x74d94f5e29c708d430847132 0x281c4a75c88fff7a 0xf1e3d1da393a1222feaa59cf 0x31e56034818fc6196aec575a 0x99056270b7575e0 0x24152a9b82318904fd6fc751 0x695753cac34b3b3305656622 0x17a56b921b40b334 0x5189030aa6e499745f8318a3 0x312c2d594c2ad4312e827563 0xf4397377a9fea83 0x2ccd5168473a73643cf3c781 0xbf52dc07c3cac2192171ba68 0x261bc025608bd4a3 0x1679f8646851790a3f69aa19 0x4e80550f555efa2191f792d8 0x17433555e0985d13 0x912414a09ee06a153822d38e 0xf5f6b3fbcf0ff3c53b7acf17 0x7c5d58f8511e650 0x69f88a30f8e7d99b5ec815c0 0xe5235407cf1faff1db2b8b30 0x6db6485eb892335 0x2da464efef2c1fc9a35bceb6 0x68055a937b607a665830b148 0x144c334a9643585a 0x1be7261a3fca6648bb819b74 0x5bf3881892b9e70660472534 0x949bf01b05b54c0 0x5375ca73fb2432dc642ff267 0x46035ad5dffc3c279e618494 0x17957e8aecd4b872 0x6704db1b062889383b273356 0x6004db19f5d997dea7ee9655 0x65c9e90ee078172 0x7e806e5d549b8309709acc00 0xb6919212213c939e4a5f2dbe 0x2940c7fc992a1929 0x5b22a68aa123a504def7876c 0xd9e2d34b769b942ef6eebd6c 0x23bcd34e0b372330 0xd5ccd186bfcbf63b4d51e741 0x79ae5611bc1a7e7507cb8078 0x51b989a016fe267 0xc4454c62ffb407b1740e73a1 0xf51be8124d8587de942e1d4 0x19002ee92e783a6d 0xa1eb00f79986de1c14674d27 0x86215fd4433817724e8987e 0x1f3d64de237593d 0x283ae7d7bdb2751213873a76 0xede9af6f345769d843b3d3a5 0x221b62dbc4779393 0xae455db401f4de2f990f2225 0x43c171f6fdd109342c354605 0x162c996715afb38f 0xcf537c11f4b0716789d43f10 0x6ff540f2e4ac08f04c4353f7 0x27ff4a20cac58f18 0xa49c8e1a2d4fa32384de3a36 0x2eb2bd5dbc7065314bb68189 0x1b969a0633423e6 0x2dbd2169007fdacbc2384c2c 0x2bc72b8e9c7adf3f21f41ed0 0xfbead7960c857d9 0xb3e05191ae500caa04f1033f 0x717984e06e5b10555b4a8cdc 0x1547e3fa47dee36d 0x6a81da4ffc7d398413f19ded 0x401a256e0854c04050152073 0x2267f1c12ad8cf3c 0xc7bff013fdee93752cc2ca9f 0x400d59d1113e3c06220eee5a 0x1609a0ddb68761d 0x3a8f88cc8750b5cbed8a7fca 0x5b7efcd3764341c61959f764 0x13a4e013af8e3885 0x1704c8053c3ec164154f3442 0xa0928f712cb9af363f14665d 0x2c30b42e76ebaa32 0xbe3677221041f957c027a327 0xbf1e1f05be077695c723fdb4 0xe260e5bfc4fdde9 0x7b1f81983bb326a72722d926 0x9779cc0c0c388fb633855040 0x1c0a6002422d51e8 0xb7f722a61b64593289f231a3 0x89c1e26ccae5d33f4ef6cda1 0x20984f632348231e 0x9ab69b21d54f7116a6c92ef2 0x8dcd788a37c32585a6a89695 0x2b83e25d2944c223 0x7a26dba3db81220259b6e766 0x8b0181ce01411894b5c6c041 0x2034301a3c912af5 0x24dc7a2865665209f4bd74c0 0x21ae016438a2cb65e77707e2 0x1d3be23470fafad4 0x6ef57b548e848493fc24f0af 0xad5f50801058656bd0db4a66 0x1ef86ec97ff23215 0x2a9a21c8d59afcf1e02b6cec 0x240cc89f76ada418e87f1ca7 0x6c0418eea2786c7 0x288bbca31d5b6d14a95b067d 0x86bd5e20565a28b11b1d836e 0x11d668866fec65f0 0x5b8f3eae665ae81878f22b8 0x7811b33a4d64ffcf1bf96d25 0x2542d88c9c5608f4 0x9e01917430efbfc17fe90c7e 0x637f569a49dc573939722bf5 0x1d4761a0ca0eaf8a 0x3bd04c09f1dbcaabf00479bf 0x308abbfde0fda94c811d160 0x1a14923c9c1fe249 0xbf1622313debedfaa72f6b85 0xb72ffbc2c3f4a0bf6452393c 0x2317d7ea98b006e2 0x8f064709acb61eeae10cc45d 0x8d091f21145a6c47231fe0f6 0x1d17a1053fa6554c 0x6183336f72fd9c58436a9932 0x73f0aaaca97575bd48b69773 0x2ba812d0a34b84f3 0x8f3a9c7bc9e27c1476c2c852 0x7f7960fc437785039e7554a9 0x29142258ddf5c09f 0xf06844acd69ba713a6982bbd 0xf04f28bb9eb42ab47f9bf628 0x2864a1cbbffcfa31 0xfef4b46a1e34929bec8f0a3b 0x38205fa508f4f577b8ed1cb9 0x2e846ddccb4605ae 0x7e11c2a573979331e6070e2c 0x567e039a0a2784fc989bddb1 0x13cdd838fb3858b5 0xb42ae7da57191801a0debe3f 0x1e1564ef05bcbc41caf9f0ea 0x1ded154d16804cb1 0x1ddf1a9e8fe3cd4a9b5605b9 0x16718979dbdb88e349681aec 0x14ef6160079c68d4 0xb6ec468611f383558c1f7909 0x336950d272f6c63bc26e4279 0x1b3f7b8d803a53f5 0x2fdc81b4dc65ba42c43dadc 0x3e59d5ae9c22e958ba00831 0x1b7408466df74781 0x488c417f89bee60fd58198de 0x5ae8aae42c54c8062e0cf537 0x25a85b6fd0dfbde0 0xbce10ac393f56398e447f1d 0x90943f6af4d7e45fcfc67d50 0x1899b9ac2f78817d 0xc24e0e268981b78942e84ec6 0xa3e003154c3e7d96be5df7fb 0x1aa4b7d55ee56ab 0x65172348b4c24c53d2fd4da4 0x82ad7b612fa165a4b80830d 0x1e3929646dd4dbcc 0x6e941bc3335d9c0d91b72c 0x3262ef3b429cccdbb3697f8a 0x1d4396ba7cf59137 0x3bad2642b6b18b66a69d2d42 0xc3e43c8d079c0e401c02dd18 0x28b37445a14f5790 0xc259b53b28eb11dfe8d0ec6f 0xf709c3ca09de11d0166a9784 0x1d2a2fa81699be1b 0xcc5a6d6d9f807af2fbc048d3 0xe97ef4f3fc6b85af3b84c42b 0x1af954cf211c7cb 0x97ecce00da988041769fd8e8 0x78165f49a657855397920aa4 0x530a7b08d8157d0 0xa5017f7d923b376355ab52f8 0x4e61da80790c217c382a70b9 0xea63416221fa7d2 0x4a587bc08aa15377afd06467 0xe88d572857738fdc07604a3c 0x2bbfdf03cda5ff9b 0xaca4a8b7012f473564a24cb6 0x15da6ea54c89a717e9831620 0x185b3b746bedab7e 0x2c5ab4a8da80685b0d49ad30 0x3ac8ac13cebaefb57ccd74b3 0x279f44f570d29e6d 0x801b0f03f2160d86b5063e2a 0x4df5e6cbc3e7eadbdf255318 0xc234ffc20382722 0x4ae8014ec6b10f7e1e53716a 0x813276b8e614ad9ed24bee44 0x2801c04903bfd5f1 0xb11132fdb6970def145af512 0xb5c34bb9956e15ee3f782e0c 0x1f3c382f6f535fa2 0x5e1da39d8fe2a2bffc1f1b56 0xf7de7072e5487eee300d7f0f 0x2c538b427a36287e 0x1cebb5bfe6b3d75547092810 0x8750c27f9a48c32b2fa096d6 0x129702ff58cccd64 0x783ed1ba8636522e6c4d7eba 0x3f6dc8f246dae0f83aeced17 0x8217b5743e92cfb 0x8df55a5bbab8863989556ab8 0xd5debed19451b25e31695365 0x17ac76c824b1d6ac 0x4a14f367cf1e041bf486e412 0xb3766cc489e7e0d88689af 0xac9b6abe7d58653 0x23f203c844d8e112794dcf0e 0x5392969676a28db4d1c55198 0x7fa4d2ed16a4471 0x315cfb24de5a8449b4bc2eed 0x131f9b76bc663dd8b1c0e443 0x1552acd863cd7d5c 0x8dc6082e16bd97600b81f248 0x91c05deb215d5af4e250b572 0x24f74b92e0284861 0x9c5584452a429436ff1068ba 0xd0411e5f9655ede680d2ebb 0x84d4c13c6bf6b31 0x5caa82d907a23dbe8e3b743c 0x7ee6e722664098690011e681 0x2e114d5aacd431c6 0x8beb8286185b24dafc9eb019 0x5cb03a79bf1394c93c6e3539 0x2aa2dd9b0229859 0xf02cc88ec1bd9dd7a7e72594 0x7c9915828bdb184d57d2cf2b 0x15c680c55ab2aac6 0x93fe87bdb385f9ab0482d6ee 0x9edd130d1d34b7ae1f01f613 0x1eff76f8e78973f7 0xdab7b4a10cb750257277648 0xcaf6d957a30cbbbe532a8c12 0x312630bfb2c6c28 0xb414a644ab865a4424602e9 0x4e43c89e87d83d4834d6424b 0xde5875e886d945 0x607fb784b0f65bfb723be3d3 0xc0a54b2414a264cf91a848f4 0x2818746ff3058edd 0x9d74ac5e24757b5791234d18 0x2fc9be67eec1012d92dc12c5 0x189c1bde64fae37a 0x740f42486fb6f770abfd1e2 0x22e84dcb2e96aea7d84533ad 0x247da657d6bb9d21 0xd724d0ada9aeeb98cc575db4 0x393ea029a46e01be02936d41 0x267ffa4b3db51695 0x8f1d5152ac05f71ecb65768e 0x31ab915cb54078f10cf72421 0x13128ccc8969675b 0xad2da25e0a748725b5e9828e 0xd8c268b6f799d6eb4f939753 0x31f64168fb6221c 0x3849c7b67c25210b3d47e181 0xa45bbcbca4a9b2fd199c55b 0x3b149a318d0e31b 0xc5fcdf2c91c2cc29cbead35e 0xe7bb966938e5c0495befd8da 0x2ba912ffd280de44 0xe0e7d84fc171425e523a2d3 0x9e0b0644774b98a085d80ebd 0xdbeee035875fb89 0x9555a3d8987157b6871ecafe 0x97cf53c6ff274a5a8d9ef931 0x24f04e899895bb87 0xaacc52aa3213484c145381c9 0x4db74b2c41335f35c4598556 0x2b1c332747b7f2ec 0x2e22af926b2e056d070e1f0c 0x69e5c4ec6559c8690997ba52 0x20e462cd4ab31249 0x94b4f169560e8ff91f6e85ed 0xf80fe6f2ea96ace8925fe10b 0xfcfffc4d9d32ded 0x3b5827d20dbd464c64728b33 0x178c90cf3a5e75e3cbc72a93 0x2d8ce391f092fe2b 0xed2eda335d938146e6ce4f29 0x459f4323c1ca6d043a2c1971 0x27743ff7caea6101 0xf0322141de03fe236a25bb03 0x8c3a62f9a1ff90db90fe06ab 0x228d3bae3c2c1630 0x7cfe5085bb7d3b65aec99fc3 0x32522c5a20211ab4c4cadd0b 0x14fddf1df5704350 0x89a9e45783e29f8e9371f17f 0x582ec1311b37deac6ae82842 0x2f9a591f329684ed 0x3bb94877c61dffa1bf778cc5 0xb5146ff42c9c7307846d1e5f 0x85597b478313589 0xb7b954ada5ae823395131f3d 0x943a042957d8f0cf0d7e7d74 0x1ab94002b4272940 0x5e2ec92d5557a8a497466fed 0x8955323d70cad9abd6a8d6b3 0x26d6c63d7bd39531 0x4841cb047fc9b1dbfd1d85c4 0xd72496add337e78973db46fb 0xedbacae16247e9d 0xd7e6c5572d02a96938438f84 0x42cc2050148d481e7587878a 0x209048e571ea55ea 0xa5e0345c4300eb3e632720de 0x46d4e1678adfd0b1c52b3f8 0x11bd0523263dc8be 0xe878f1242eb9c9331bff664c 0x1c09a240da01a443e60a9b85 0xf9a759cfe3b71cf 0x55f57708115a1ea4d27ef44e 0xeeda9c1a044f4b864fef072e 0x1c05a44abaa91dc6 0x6e42a673bf10a09d17179819 0xf68337f5157221bf30d92874 0x813b2b831a7dc2c 0xfa46032b3829b6c53bfca212 0xa49904296095be35cfe72f67 0x2639f45cc6577e86 0xbea4597d8b05074ce2425818 0xcaba97e086a1f0267355ef90 0x2e2b19d78c7294d6 0xdc10af95812eb400d76bbaed 0xf966b5b1861fb3824dc9a739 0x2b182d0a55c0eb4a 0x9d57d6211ccf51e3a4a841cc 0xb9a04e1e316c990e4e5874bc 0x2621c7463b2e5dc4 0x57b9f879ed8903f8799ddff1 0xb8671a65c6d38cedec4ea1d2 0x199efe09ba018c2d 0xc3187c4591d98a971c0c059d 0xa3ae351051466d76033d7210 0x32e02bb63abe0db 0x9126af1857fe5ca8c664d684 0x2fcda9e260bece5becb61438 0x2f0b3a05592c3ff6 0x10850b0149e031cdcafb1a8b 0xba9c6cf959d3451e4e10c397 0xa6953fe001c512 0x79332fbfb16397af2b5440d6 0xaa3913817479db7e180b036f 0xbde229d827dae78 0x1c3c8076ad0a700f19f36a08 0x147bbd40344a904884bdc822 0xc3a374c5f86bc4a 0x5cf63c2bb60644ad5615a821 0xdc9e07ee1fde97376e9690eb 0xcfef261178358b4 0x3bd13ac6a9a555b679682ab5 0x338187fcfc3a56f6a08ad949 0x1c224f124d6cd6fa 0x72695ddd8d05d28af117c8e0 0x784a66b23b7fadbc14d524f7 0x1d2348e7a9d64418 0x85cc8cffa5504bbe4415a076 0x57927b36cd32935eb3a2d688 0x2bedd8289c48f616 0xafcd7ad59fe90c6c2a581bec 0xf589c73393d771874cc62dbd 0xd81036daa0bd7b3 0x734e674c490678e48c2590ef 0xd4b962dae92b0883059b0136 0x215dae8917ca2cf9 0x950476cc7c54d9c80c11c753 0xc6807bdff946e86408549518 0x25242d06d2b50c91 0x358e4a5513223683b09fa55 0x65925c7f4f57eae4d8d86c1e 0xedcaa900b79fe4f 0x665ed16fdfacd61e588e9850 0xbaa114a46f354c0e338f0f4a 0x1ef99bc6a5d6bc58 0xe36840d69b21202d191528dd 0x16dffe4fc610ae03ab7cb5e 0xc101b76b698836 0x26c2a06b7e86c1eccc4cce0b 0x5aeab217427adfff179dd966 0x17ae4d419cdfc968 0x761b6576ef526213d6f4f8df 0x371edd0e1f1e49b5758c8e4c 0x203845e57573ba21 0x8c7df991457e06b12b6aa814 0xc696b893f1ac91c1321ee60e 0x1fece27b81f7ae5f 0xded0914fe7db94eb9588f8a6 0xe369074b93bcd2d71f72ee62 0x1e03877f03d90413 0x8fb01b06fa1c2655ae57d185 0x4091630061c56250367ed10 0x25bbcc77100ffb77 0x11c9647760fc6144fdfe9112 0x9c47303a455232c14618fc1f 0xe00ac5871a29e27 0x1f97525859af535f915259da 0x9d1ac403c41514282f162979 0x280ff4108194889d 0x3c3a850755e1b57bb620c9e7 0x320c90661e186770ab810b46 0x1f27a585641a6fa 0x3c9b727b050c515a4716c1fd 0x8445f3449a8e2246f0156f45 0x7a6d8a7c20b2504 0x40983304063d49ea6aff0cd9 0x9a9b237d18104faa4320c3ef 0x1c9649abb745878d 0x623b2f2c1d20024ebe205240 0xaaccd602a40f769b7731280d 0x29c4407d098125ed 0x9bba89b933217f950a4da736 0xcc9c61a00e91168e545f0df8 0x125a34f9ff08c637 0x36bd45a2bf84aea1d8a9795e 0x3b1d3d0b449614a122769f4e 0x232ac6080a75f09d 0x81a015e6c0b1b0ca9895c8da 0x55ee3b739b61f2d9ab51dec9 0x2b7e549999ad844a 0xa0ff12f798bcc48218d3138b 0x63334053a94db9a94b4163fb 0x2c5c1df3ef8cac3f 0x7738a1472561d6573d1fc4da 0x10f00f9c240982772730fefd 0x1d71cd17987c7d60 0x44cb61785b134fd33802a26d 0xe7d350e990859bdf7977032a 0x14329903439280fa 0x49eec0d4bfaf77580b5924d7 0xff7123a5a8974320928a792f 0x2aa793accd2f8882 0x893d4e71b776435fe3b3c5d4 0xe55ec6aaad9cbc7660241ef6 0x26870e3428da1554 0xefaac0b02c700f362e2227ff 0xc338f0040dc47aaf465981ab 0x132115432cb86f40 0x68cdebce41d60087fa5fd98c 0x44b38a56e685ddb44b598584 0x2b80f095f3ad33d2 0xb6a669ba36387bc94f5c4586 0xa7f733dc381f34f63f1aef74 0x304781252960882a 0xe2bcbc20ef0d2698590edafa 0x59df5b21ceb704ff1f81ab08 0x691df3ef70e4c68 0x6859787674d56fa1f279683a 0xa6dde101487c8d3d4ef27aff 0x2d37984c87cf2993 0xd01bf7832a5fa8e39da576b8 0x7152ca583c2b0c6331a67ee4 0x25996b84e8b8164d 0x69fbc1b478cf571076963dfe 0x82ebf6cd223ef57d10db8404 0x1f0e24d3a0e03fed 0x3639e8cedcbe61638cbd2eae 0x89581f998205186f5e120242 0x4014ba767175617 0x6ce16184f687054c016e9798 0x3a9dddad43ae8521ee90f063 0x1e4cce27b86e8a8a 0xecb53f23d247a8673c85ce67 0x39f224726d34d6a5d8be92bd 0x23dec6a0bf17079b 0x67829d5c95509bc701ed8e31 0xa5ce64b51f0b3f957b599a91 0x1055e299ca971f0b 0xf87944623325a5fcf0c0750a 0x8fc3642971a490c061bcab3b 0x19cd3d838710bd3 0xe8dd30e98c2f99a2e7310a36 0x9c1d96ef0a1322964798a8e5 0xf085168e8f773eb 0xfbe7d58789c96830e4ac640c 0x7016112502832eed0ed0096c 0x2d6d5007439f9d97 0x134dbd278fa0a0d95bbf592b 0x879e248f11f855957bb2b194 0xcd66e35c09aea79 0x99df7e97033200844c071ab1 0x1d1ee8f7fb674ebe685bdb2d 0x24f5c744aa0a131a 0x85f8c1c0930be32f88117596 0x7c95e8b1db3fb30abef6fb26 0x96d8a5f03a54b09 0x808e85ac20267965b75bcffa 0x82cbd81df1399af668609688 0x14224ae99184541c 0xf7fe82f1432ba2575962935a 0x6580ddbb6a2b6e2d5c8263e7 0xe82df38a8bae887 0x6992c6d0b53eb105bfdf5179 0x9a24e1c948113ff672baa83f 0x28bda09af7ad28d8 0x3a16bbd39848da8396c116ec 0x9687e58af9bc7aaf3eb185fb 0x16bf096d88fa2c7 0x2fe377c3070a70a6b8405f46 0x4db52166ee3c9a86d8f5bb98 0x1a9581dc1e7dc478 0x962b9ae5414d0952107262c6 0x92be066a538b616850bf0c8b 0x1f268529727f9ced 0x785de58d7d65850ab1a67f4f 0x6f26a391259de6171b157f8f 0x836fe6173cebce3 0xf694d63000bc4774ae6a421b 0x5be1747085a01b52844f539e 0x1aa51ed5071168e0 0xd260cbfa5d22806f37ce740a 0x24c6b1057922340739abf774 0x176232f9e5f013bb 0xe9b7571e383ff47fb09add39 0xaf4420a8d73dd5dbe0ecfdee 0x3f49ea506d56749 0xcd2167431f21a02e22e7ea6 0x1d0457d350e8a33fb8e3322e 0x2721b33bf2de3ec8 0x8e618476a9602b8b724b1d0b 0xdd23b0b566848b52587bb601 0x1c28ccb53ba82319 0x3a162e02bebd26eabdabbad0 0x904e7b96f67faff25f8b8182 0xe4ba702a3bd3518 0xaf446eeb21cbd75867d8ab0b 0xf857ed65a14893fe063622e4 0x3ceec7fb4107619 0x7a0b5002b69a9cff60db1bf1 0xde1ca28733e763c0a2257c60 0xcc26495aedda7e3 0x7dc08152689d72bd29aa1bc3 0x918dace64c1ac126bc4be2ac 0x36ecbf90d70c8b3 0x4a829f5dca00bf5b53ce32ea 0x32285165f0770f1cb522f94b 0x28d832cf7123c742 0x4c4d4a223eeff05c647e9753 0xfdc59aab9f9b22c3deabf819 0x12b56baf284df18a 0x82925cb29e7fd70da6666d12 0xdef73a6032b5b962c7a475d9 0x13ecd18e2d3dd4d1 0x5c6b3b642f6984f7d8314eaa 0xa374aca2cd9d868069e926ad 0x407df336d23501b 0x5a1773bf1f8aa7b497d00b4e 0x4219d81ee475e43842fc5fe0 0x1479bad1ba5c13d7 0x3dba9cb83fa6d249e2b350f1 0xd169df072d10dab404c1f9bb 0x2345f61f97a2b2a6 0x631f8592fad0ef5a56b5ad24 0xe6481289b9585d6f16d3d9da 0xe4edf1d289e2022 0x464605440b200f65d95ed837 0x46e65bf42304c063c8f15b94 0x16a10296f33ef73e 0xb042fdaee355a6b893f738da 0x1fd39a155850789440e003a7 0x2b3d4573f08f84ec 0x3233a8a13de8825eac4a9ae2 0x9fe57847387e651d4885374b 0x2db5e13315c86603 0x457f10a07cc4846a5753fe7d 0x90ff323c9c98cdac6c2108a9 0x27c3b81298af5557 0x108f7010e5f2c71a6a65166b 0xecac05acb9ec29235d367471 0xdb3069a79dfb67e 0x215dd9e074d4f42cd554f625 0x22c0d60a9347784a79198be3 0x245ceaa355b40370 0x879dc30e3229c5ecb30c80a8 0x441d4907e3afd914aa660b6d 0x32869537e4ba43c 0x84a64842d7592d98a90087fc 0xe96d9754d6b9259412d9a8a4 0x19c04a58bb729898 0x1a99f5f667582a8cd1c8e622 0xae3bc938dc68c438865282ac 0x15b37df75cf88b3b 0x9e682a2cdcd21d5b89d76ad3 0x221b131e7dfe00e18ca94e8a 0x75f107f7d34b703 0xbf26c4cdb4009452df2660d7 0xc07d30f48b619765d81eb2e4 0x25ac8efa3d6226e2 0xc9a4a6bb6c4b566a4f8c9a70 0x7df5fd630d6b548cbcf73f4a 0x6c6ada69107e50e 0xde90504eed3ef46bbbf5285b 0x75b4b1694e001edbd165a9e0 0x20a3664e01ca877f 0xc1bc16a7dd7df2195401f344 0xc86897b3ded28770a8c26913 0x26a99eb7d0dfea28 0xb0ebb4304a0735b4a5b8432 0x839a687b8ca279512edbaea8 0x15ed2943bcb5a067 0x1aaacb51418bdb0fdf7a2dbf 0x4d26120382c6ae4e42f5d745 0x286780475a68cba0 0x61d0d9b8fe4578cd7b59ce48 0x851b7352155e2723c7f4e979 0xd6d4f74564c0b78 0x90ae6e88c152f0cf9e6e9719 0x4fa10e5cf7ceec3c01a7a983 0x1af0d8e0d2fe7441 0x40310bdf2e1c36843424c4d9 0xd571481ae42176264fc0c4d 0x949c7387b5a03ce 0x889dc625aeb982be4e0905ab 0x88e5ea7055abc4d11ef35df 0x2d63f0dbaf73313 0xd4f6b873eb3791972cf80e81 0xfc8e09bafb3a24aa0ae2afb7 0x6b2cb7776f95fc6 0x73b66ba15956713210538ab1 0xce98a490bd41331bd01767ff 0x12bb56a5bd167902 0xaab97d4ef2fe0e653cd4db4f 0x7d58276b9a7931fa939eb2c 0x8a4ab1543939f83 0x15d46cd1982d465c94f3cace 0xaf3364c56f88efd69fa68ef6 0x1fc56209c60d69b9 0x17bebcee6f60ea826280fe81 0xd4c85995cf2c350c84168c53 0x270f38fe74462990 0x53b5f30eeff5f44a120a2e81 0x85c53f285b5770bd950d195e 0x2c03292c76a439cd 0xa200272423cfb2890c16fef3 0x17aafbbc105cb92da904fd56 0x2ae3f14102d27c3 0x9b5ef8fe7a12c7002f8cb0bc 0xbdf2add7d81f44e714e4bdb0 0x3014b6636c18185e 0xbe 0xf470b5a840e53edc7b7fe7bf 0xd03fc86552fe5f6c7049e527 0x1ffa3b3b7d027f27 0x5d65e18cd1a19d22e037c1b9 0xb2d2392531237936b1cf4a82 0x1cdc43984dda8137 0x407faf8f4e769815d734c48 0x51c12e9f92b1a26dec2a386d 0x2baa55e6f96e544c 0x861937d3564b7b6855e00f27 0xa33a3930c7ef9d1fa85688ff 0x29370d3e73fd48f1 0xb52c170fb2887cc3b858cb48 0xe1b3f67b4287365a78cb0b3 0x234766f2460abfc0 0xc0618429dc34b1d9ab218736 0x2044a50d5fc7f906d83936e2 0x1e063226b8aed800 0xac4bb04fb4c670e797dacd55 0xb472d9b02e5dc9975b6edcc2 0x29b19fab8807d8d0 0x46b9e755767fd6c69bde1468 0xd423bfb71daa47cc7afd2182 0x1e5e5103e6971574 0xd6058a0ceff2ba1192e8ed23 0xffb36c7ccb391f4296c3ca3e 0x23a958d148e68acb 0x35e74e6fcd2809ce8b563090 0x1969659221ff4fcaa7f521fb 0x1f6ba8eb4a232f40 0xf37b2228fc0ba7e9f1bfc611 0x10c8955e052cb0e5c791ad72 0x18e3c1b0db1d1ea2 0x8be4634bdc8b1aaa60622393 0xf60839d02b912390202e5a50 0x2c8d205159dee1b 0x697cb2ba1717027e9959223c 0x86bd5a91e38a2f3c13593f19 0x2c0cb959d187b996 0xb22efe7699ccafda14124ae 0xa17a008f2a565fae6b904854 0x14009f26f8557e5 0x2a31a28b1b718460e68894c 0x72c03ef081e5754c9ebc8d7f 0x2a47892f7ac0f6c0 0x422013274584cb774ccef21e 0xb46a2199295f1ac83e852f51 0x1b1c2ea00512b225 0x5f883c0d3737dc672e5b1200 0xebce4d4d207090298eab8137 0x67eb673edc70bd6 0xbea765872117f3501ac0949f 0x25cf00e246cbec82ff5b5f75 0x9e2ba76487b9d1f 0xfe8011d81334218f1abc304d 0x50f6c9549bc7ddb61daa993a 0x1b21997403112dc4 0x9692ab9cd391f5ae03b17c2 0x4be6a364e751d9973f2f42e4 0xd8571172c1cc0e5 0x58b31858f294ad4ef0a8261e 0xd82a6dda36cbfba1ceee5df1 0xcc8155be30b1d3b 0x31009dfe4878216d5d9c62ea 0x23d50f0e7e27dfe69a6f130c 0x15e6ea6528811799 0x3f8d606d63cfb9bc2b7e1b31 0xe6df5f9893ee193cf1acc1cd 0x15c9e05458716f1a 0x796af64a9c13971a6845add3 0xe8cfae955dd17bdb8583f0ae 0x163e6f39093ef8a1 0x4c360e0e96d7fe250eb35a8b 0xff32fc8a83ecf3b211c51de 0x28079af20595672e 0x7db765b45a3202b8171b2c8c 0x5bb3f16a9f62e657f56f9adf 0x10e2a4acc97eb125 0x97ff2eb45b2384c2fbcc7476 0x111cca274772bcdae061ac7d 0x19bd496c6eeaf10a 0x5a6ae0d284e820a945c61760 0xa357835a31baa944fd79b388 0x2d0629966da3aeaa 0xfb9b2c8df95a44faef22b228 0xdd21a031e564cd29ccb092dd 0x2bf4b110f5a16239 0xe0d6d8b43552c9f4a674ddea 0xe319bd156b7010ca77374e30 0x12fbd6bca06e6455 0x7bb5275a45047c2ed8bfb06e 0x7e87bdada507bc4972b2eca7 0x2c65e565a9c1190a 0xc56b450f32a15b93ce874be3 0xd4b2606427f4b51405ae0787 0x11343b3173b0e724 0xb5467e42aef4eff709decd1e 0xa9d73ec61fc34b313a4cffc9 0x285fa5070a8d516b 0xac65359a0633f1fd7a41ea87 0x6b6919c8f8d677cc53766c0b 0x1abd8bea5f8c68ad 0xb6435d41cac408ee2a8a9521 0x86965ed350dd3ea91c56bb30 0xceb0dd2b3d7b7b6 0x4236412bce75f2042fe7f9b2 0xdf192cba0c3aa1682aa1f79f 0x6f6848c47029e62 0x1dd1fc5416b0675a2a9b8309 0x257fac8977dd826e10d9a690 0x9aefeb6837c0e3a 0x9a42eb8d9e13dc00d109d688 0x2c8f7a2e8139f5dddbb05a5c 0x3b45156b4bde0c0 0x6589eaa166da56bf788c68e3 0x133a767524b8a1eceb9cc96e 0x7fa469e89867c46 0x8bcce6c0b36bf4cd7ed6d22b 0x1b367f9243cae1b0874ae26c 0x2b920081cb333081 0xe18f90596086bf9fd0de9544 0xa97c40432125ddab558e370a 0xae702b61ede4f83 0x6297e7bf21daebbf3f2e4911 0x37a4ccf8a80a56ceeac9d390 0x1f90b2521a7bae49 0xc6a746498655b71a6860996c 0x313aa25afa40ecbbc0fde520 0x14d043c9834e3885 0xa437dc48ebaf674f4ef058b3 0x94f7fac798127edaa6870608 0x1345e0ab5d9c4b7a 0x48adb73db63f2438d18079d9 0x89ca8b521a2fabf1610a83a2 0x16d2774a5acc5558 0x8f3e6d9e6cbb50dd32518590 0x415e5d5a31358cb7d0aff02b 0x21b85d4eca7b34b9 0x2fcdaf92e74a10b7b38d6008 0xb018b3cfd5eebd707994002d 0x210395ff3c92c2eb 0xc713162a32e0ee938eb72f13 0x790ed0aa7c1600ba4b84c625 0x8c9a4a49462c7ca 0x755d59c67ac5eb3c9ea1bd8d 0xfea82335621244d346d9f8bf 0x2a065d2aab28df13 0x3d8178ec8320ba573a433e18 0x1fb9e7dc8635b21435f9da9b 0x2c28da8cc47fdca 0xaa48d08260bdc4b6ab2eec15 0x44060d93d8b6e2987b975393 0x151566663eeff36f 0x711fbcad6367050c55df9144 0x970c2a4548b985bd0d517537 0x2cbd8f5967ac91cf 0x4dc1628424273b9441a0f559 0x2f34c1dfe4984b2cb25c3097 0x19efc9317e805e05 0x7e53cc1ac917977b235f2914 0x6a45c9440336bee473a130ca 0x213771203aed2b15 0xc4646c86117fb7860e9945f7 0xf84372e2e922f7c042352eb1 0x23d5e89244eb035e 0x78a3ed4c0ede18f0f186ae13 0x774a4cc9adfccbdfb8a843e3 0x30312d2b5ca9186b 0x5fbc954e96b526320a875010 0xe53533acc8f9f807b5b84927 0x2cb4ae99766ccb51 0xdefe31b08ff6d18ea6df83f8 0x34a3743cbe7e47c91186e757 0x2c742915f70ad8b4 0xbf792b6ddaf718aa3d445b0c 0x297c820b52b3a8052f8660d2 0x1a81e3eeacf3f1d9 0x882206ca505a215590106d81 0xedfd38b2e63038783a526c12 0x26d5706e8f10e914 0xb99d5177de8a116dfd1ebeae 0x30fb7a4fac7704142929890f 0x8557fb7e96c916e 0x38baebf50050ad7e785da0a9 0x251f03e026b72806a002a5e3 0x11eff1b2f7ab72af 0xf6e58b58d257b4dd34409df2 0x7db07056f744040ea27d11fa 0x14d8a19ee3ae90ac 0xbbf70e34dd9cc6cb915394e 0xeac3f337b01d1a9dec6b2ffb 0x2fbc7c263356b017 0xa2a3488ee53a49565db5154f 0x94a744e7e4afde39562c4905 0xc80f41a269bfe8a 0xd19639cfe34292ef497191d4 0x87e2ca0e07fad504e063814c 0x303d0a4228f627e1 0x7b7b4626f06a2b0c3f740483 0x4544c2a1641b48c8df41dc9d 0x54c4cb94fe71fb8 0x1e682fa8a53949ade33f5885 0x2c1f46f84fa329f810ec9659 0x14a724ab1850f68a 0x1662d1b16910280aee82412c 0xbe4cb9dbc8220f2d6ae15c0 0xa32ed9fa2b38a55 0xc37b4073da276ef0808e336d 0x7a6ff6026b128f3820ee3ac6 0x20628628465b28e4 0x781a62c95ad5916c4895fa0f 0x1acfc8b9f93c3e36d8af2dd5 0x13671a91e3338a39 0xd5c874039402d5e95277c5af 0x6dc909a7755e8e7d64ecb574 0x2c28d760d412cd21 0x6ec9f68223e26c3894b66131 0x5db7cd8e925f27ba18ab0e12 0x2efca34fe528442d 0xc21e68d7555c840b43c76f11 0xf094b109e9345cf60db2d395 0xb5f25c313d7a1e2 0x848f9079fdcf4742cc97081f 0x247411f954779cef6474c370 0x1da7b3db01436cf2 0xd3deaff8a59b896349f9634 0xac30f7c31e7eefbd7ab5d1e3 0x167c9aca3dcfbf71 0x1c13f78525bd5c5883492251 0x3ff7cf50e203332a9a48edc 0x1d14defe30453e33 0xbd26776b2438522bc2fb7bc5 0x16c38ddb25608a1646049a65 0x248bb157197a2a18 0x787ceb1b528e1521d944e6fc 0x82a114d50b2a9702290f5f50 0x255d4c367b902449 0xcd905c26d107b415378c208 0x9b76013379cbbef88920d0d9 0x396c5b405bc4736 0xfb43f9e5ef990e75a303b374 0xf63b9b4b7977402fd0a23751 0x1230224b725fd5ee 0xfa7a5fcf11912db0be52cf1f 0x7f02f266825bac8c3452fda6 0x303260e4f06a89ac 0x46c82b69353402cd1fd49329 0xa49addbfc889c238948b9fbe 0x1f411a8b9fb84b93 0xf9069012654d17c7e0d5160a 0xaebd2cf0260e5ee0b190d26c 0x24b0c79ce5bf9e07 0x595a902149fdaeea343e3502 0xe8729dfff844ea89a783df06 0x224ac3c19ee6df45 0xa9ba6d412f5eb905bdd03b85 0x7664025ef70118bf822fc2f 0x1b0f633d74983dd6 0x251e84992c4434e6dea326d6 0xcdd859dcc9ffd480f1aa3927 0x157a9aaaa67a88e0 0x705e0ce60bd43b52857675f7 0x5634b19e69e196061473baf2 0x20edee5bc0d966cb 0x7edde2f4b5dc15102295b041 0x25479423df9cc1f4c4da2a6d 0x1d536c0f2d592251 0xe0e58e26102a1efd481fa427 0x47c056fcfa8345ddb395b181 0x41463579b410649 0x8671c276c337f0d67fd4b767 0xa390f4e34273481042abcfa9 0x19082adb22a76785 0x48f2f66d70c49948254fcada 0x18a7b26cdb8cfcd29a5af574 0xd385dfc1725db8a 0x9731a3524738fb2a2ade94 0xf18a0f2be181c0e2d5799772 0xa9a508d149df77 0x2cac25654f6f3520d41f51bc 0xae1e97a02a8c207a2362d5ef 0x2854822a831df60 0xb3a273493fc56f969d02689d 0xda944401898f74137792a47e 0xbe5ecba66570e8a 0x47ded35e5fd09eaaae983289 0x3be3c65ad326be966f5b3bdf 0x9b73fec43d95360 0xa9c94e9eb1e01eab1738ec93 0x1ac99cab2f7f8a7610f4c6bb 0x78789fdabaafef1 0x13810136a81289c29b48b095 0xd0d069eb9e68c67777f7091a 0x1fca0d795ecfa7e0 0x22d7af31cf897ad63c5f5213 0x47c7030cee042059b6e3577b 0x1c8c21105f7cd6ff 0xd4414517bb1b22c4a83284bc 0x28908dde3ae29858a27f895a 0xb2d6655a08012dd 0xcea0bc1ab656b46fc243392d 0xa0456c77a73015926f7288d3 0x1c362fc86f8c1d0f 0x2e565ee8af739e4bbd5e38db 0xbce29a4d55d14a24f4129745 0xd3c12d9d9d739c7 0x7d97750dc38f3abfd3d95cf7 0x989aaf3ea9ceda9955020b38 0xae8e94f9a303122 0x1067f352610a5f0a8359abb8 0xf9ad807f6761d7c81c4847e2 0x24c07d9328ac93a7 0x2ef3565be909a8969147aec4 0xbc3e2434900f2c41623aae66 0x198795b30a138234 0xef23931e156aff3085ffa169 0x4a2768ef7cac473b0a7675e5 0x2ae2aec518df716e 0x23fdf80d710a58367fced932 0x4b3110f77861b2235b13938f 0x22b3451e2aba5fa4 0x489f16ab0f6615b7c0d19f73 0x74974a86ef5fc0bc57aff13 0x1cd61166b6ccb3ec 0x30dc186ddcb7aef6adaa8674 0xf8d1438e18cb683bd92427a4 0x1fbccc2ab592ed23 0x5d7738ec9f55c1f7643f66f5 0xfd42f4cf748188230b046ca7 0x24ce5c478d90b4f1 0xbace1eca3d4eedee40223e0c 0x97063b3d2a16f38bd39c2164 0x295c982feff17dd5 0xebb080a465c9384cc9a14706 0x3c085a42d48e4b5ab4e6e451 0x17f3b5c5fa4b6067 0xc39d3a58152588cf25e876d 0x3fbecb7fde8c8dde6be615d9 0x1fb8449a8c0ddbe6 0x78b44711a98a3f7009635c04 0x58f519c3e9c701820dde1e46 0x326955c70081484 0x308a812b0d52741fb86e6e36 0xdc2c0f279347d4ffa4b66b94 0x18bbcc3129b8f07e 0xe939b4923f0f4cad3cc8bab9 0x42aa047c4599f8c097081310 0x14637f70dfd9744c 0x12c7d7250728f78b7c6ae4fc 0xf52054abda265b632548f41 0xd4400c7e62b2e17 0xbd07a8c650163a134c9dcd21 0xee43185686c4140abae3c04f 0xfa5bda5f5845a30 0xf12af166986aa927d3bee4fa 0x64946727a0147461cd2fbbae 0x28eff8b0dd117cdd 0x625e1ebb0a467d2fa3e160f2 0x5d9bc850a4c1ace51b330faa 0x274890368da93ec7 0x262e259ade4489612ab93dfe 0xebba03f70326e4f8866942c0 0xeae132e1272d51b 0xd779f287f4a7e8bc6af4fe21 0xa0944d836d4948e34522a7f1 0x901e46c5763df96 0x2fee4d9e836a0b206611e20b 0xf9aa57aec56c665085871187 0x6e5c856bec75f11 0x9052dda690ce2b0b5e035adb 0x6774eba392a4bf969f69c092 0x168d77fe201f9d8e 0x1912d68caf290a5619283e2c 0x33d2feeded410bfcdadf368a 0x7370e0483bcf693 0x559e6057b3343663f5d100c0 0x314e98ffbf39d185a406f2da 0x1d6356ef82b6ef58 0x4eda86f5a76b4ec05d118838 0x4564ccaff026990f3fdf2514 0xfe99d9b2692ba5 0x3cd06c15e90bdcb9f7108c8f 0x5f5edb0776fc6741a4c9e1cc 0x72691274c56ff9b 0xd7bb60005edd4b46c84915e2 0xa5f6dadb8bd2473bf8109b9d 0x2c85db152ac96a94 0xca504f5b903ca6c7be8f3e41 0x2cd2faec6e2d119b70e8a76f 0x1e289334b44620e2 0x80c7c03cba28c8a5de7537e5 0xa0bf9053f68500eec3a5e445 0x7dd3a63e1689f58 0x32a6e0f5726cc4862bcd3115 0xef4dde28bfa4777eaea30e28 0x5d51ee1fea2599d 0x2f917c0e966f4d66bf9c409d 0x41ed268e84f09ee650f8dba7 0x1cd82511b8140c50 0x14011024f00040a44f515220 0xfc037721b586c8e64ec3f4bb 0x9e6f577b268e123 0x33f3b6f4c03e2f9675225200 0x5eb48a3d8a0c6ae9de530884 0x1802f58b01f0f9df 0xb33c0a8df8425f666dc4a325 0x1fd604a845d97b9d1a6abfb1 0x10d0263aa3966f27 0x47647f8d8cda848cc561ee70 0x504552e8bcd10aac1d22c5de 0xecf446ccf8f2507 0x14e4e90342ae39a37239bcec 0x9c591b8b49c877601edaaf34 0x184d75f770ddfd6a 0x7bd5d8ae454f82eef8f784ca 0x3136eb38d4d6f42c2709ba07 0x4a631f41a61899a 0x12d3ecd8ce3de9235f6db4d6 0x8a385bde7951bdad96522d83 0x118fcc33fcd8f29 0x8fa37cac496982e16c3f3d1c 0x2a4775dbbedb9aa90c5ca0c9 0xfeeb07d13d4d072 0x87d4967981eaebab0c1848b9 0x34dbf89140716d3cb59d1178 0xfd17f7470bed0b2 0x438964daee329d9d4f25635e 0xe6b8fecbfc3b43ca353a4d85 0x1f6454550d171aec 0x86bd256783731516e12d841 0xf3a598073bf43db491a7ca3b 0xb8d0fd39c29ad34 0xc322648f1f8fc1b0b11f16c2 0xd462aba8b2e1061e934ada71 0x8cd28f07fbfe3b3 0x371992bb4d9396c9b2cee390 0xe37d5a103d9ac2a543195846 0x20a1dfe540458fa7 0x42ea5e8dadd6a35ab38d7dc6 0xb5695e750bd6e42c94448842 0x18aea7fbd858d7a2 0xd22e5fb9111c7a4e515fd735 0xbcc80764c54f3f43444f8596 0x1c9781b871a806e3 0xa819835f4834271f322968d 0x4c385d52da43811c2246627f 0x1e5ff805517fb116 0x794fa21a1f5ac6ca184ea627 0x595a6a323af35cca759c3022 0x28efa74764481358 0x944f97f4d2ba4fd0fe09bc2f 0x3346308efa509373a3ae1b9c 0x29489bda26dc69aa 0x92848583e6fa55d983f09f18 0x4b4c7be1024b959816864a15 0x1f1ab8c96a6318ff 0x7a90edcec14e5366e19b9250 0xedafa59eca62897f3b575240 0x55913467a8c2d8 0x5595f7da741a6503432db33f 0xc782ef6c0294a8c48bd8da0d 0x4aaca22a142e7fa 0xa2ecc10ae40d2a3ae2694ab3 0x1dc61a1e67fb10cc2c256d87 0x28556a88b4cb9d27 0x3755f77f66f035f10a4c4a01 0x77dc2f78fd85d999768dd34d 0xb0ebb5c09d4a7ab 0xba7e4177c34a7041ce32ab87 0x3a82f6fdb9d328cedbee81a8 0x28e44212b76c8e7a 0xaefc515320ad28e6e4f50b5e 0x96e6277fab17d4ed41b99141 0x290842a16b803039 0xac7b0a68c88913a1a6f1f7b3 0x68271e5e6619548927764e7 0x9a11b9fc9cfc754 0x9a81714765462ecba535da3f 0xb89b810842412e0cc586b937 0x5b5d02efc51ef81 0xfb97b4b0992aaebb846c6fdb 0xb86d2ca524bbc80fb3c1d943 0x16b5c4b6b4933781 0xd972323f473dddbcd8df4f4d 0x18ab92ec7e9eef9a159ca19f 0x27014ac03ab89e14 0x65f36423ab5df1f1e1fc1fad 0x88674a98287a5b2a1d6493e 0x2e7c3173d63d41b5 0xf871297b6d892ea871e53557 0x2d8f695465ded4e336fec31f 0x268c4dcf343a92f3 0xf036ccbbf28d705dd9fe9076 0x1672dd197835b11387aebdb4 0x3dd3a39ac3a495e 0xe568ba118f673c080e058705 0xd2e6a20ecec0853f945ad9b1 0x16ff71f399a0ce1c 0x1136522a60e986a1a4d4ed42 0xb982a6539a0de41eca4683bf 0x1207b96faae43d8b 0x520494130f3a3e1abb6a86f4 0x635fb9cc241c4f4213358c58 0xf4c2021b1a24b4d 0x6c152bd72142c5eb9660c538 0xd54b21f3d7500b5a1c7cc8ec 0x14ba01b0d4b40025 0xd7fa7ba63bcadedb1376e198 0x1a1eef38199512c00b0c15e5 0x2b7421ac7df102a2 0x5adce44194063b3ed83e489e 0x4b2341d78ad8a2ec6c894a44 0x127b49eb604a949d 0xa7cdfb61a1dde38f2de5ed 0xa7d86489ee8e6e4d52b95aa9 0x1ae739c94714210 0x94fcfbe072d4728e6c94a8f3 0xc3e2f291c7ecf69cf872a0bb 0x2b0b42733730fa9a 0xfc08e38fd67c2ad89ec0ae77 0xc6c0450a50b5f23b52e9d60c 0xafed6a937030032 0xf5b21edeb8e9b0ef2f2dd9ab 0x75851ae62a77710331623683 0x1f27587d48a0456e 0xbf901a94eefdc040906cb24c 0xb55d40312466f8da61007aac 0x1adc712e34758e00 0x3a2c084122861c501124eef5 0x30726fc80ea80e4bb353974c 0x26ecf462327a7e8 0x24224013052382ced90c0d0c 0x8c516df74309ad6dc958e6e7 0x714b668ffe2762a 0x65d34a86ca1ae8cd1830cdcc 0x1dcca70d674776424611e81 0x206bd9adf1f75c97 0x65f06d57efed4a19c0a2bbf7 0xc69f4aed70b9ce639b29056a 0x246ca03381f4edab 0x903c8a1eb37dd63ba43d3946 0x3defe3d0f3c682012e000a95 0x178b3c81a4bc29a7 0xdc1434ea6fc2f75323ff89f3 0xa5bbf0df6d19f9521e915bab 0xd9d8984228ce313 0xb7024ea8308e553bad8cc9ae 0xaf6d832a4f2eef3cb50589bf 0x22be7b5b5e64063b 0xfa162854b71a190b2e84f641 0x7e122ea55ed555664c35abf4 0x2c7604dadfbdd847 0x7d49177e77ba789d67779320 0x236d372954f47d635192158a 0xf3331a562103059 0x81b7ba4b5d4b33bdfebed111 0x662a8ed34d3e3de1332d04e4 0x192771d71469b6d0 0xa47332ac89e859511fb66294 0x1fd9c5112304c42740e9f46a 0x520322f3ba7f38a 0xb907e30e19d48cffb09fbcf7 0x2b59e7d4dafc891f08a24416 0x1e71e1c05c6e4a55 0x7839ecfb6b9e94ff4c3e9bb1 0xd36a7eae912afdfce4d6d262 0x1d6a1da9a2327b0b 0x1cb355493739dedb1ef42d51 0xe01e5c211a1f46f2e4094597 0x269bce40e53ea050 0x59da2615d5a3b91e937d89159f7380b9669858cc437cebe74adc09d93c99329 0x18 0x2a683c7d878585763f8267ea 0xead8f10ef81f7901ed274b24 0x25ec385810beaa87 0x0 0xf28f9a5faaa6546f997e0949 0xcd3ecab431257f8b80b8dc77 0x154e8dd3aac3d42c 0x0 0x100000000000000005c19a465cc7cbb28 0x3378cd034f0d9ebb 0x24df6021ce19cb18 0x9c6a591e71b87b32 0x970e2d83fd3ed91e6df39f2c 0x85294ea4088b8c3ca50dcf1e 0x3a237bdbf87287c 0x0 0xd13f9298545a1d77942e20d7 0xa85510aa9d5e7b357755b5d6 0x15c764c1c5380102 0x0 0x100000000000000003aa0eb9486eaea7c 0x100000000000000003ed064b9068afd7b 0x100000000000000004e76be5e17f551d8 0x100000000000000008d717becec440328 ================================================ FILE: src/contracts/autogenerated/sp1_verifier_bn254/tests/test_contract.cairo ================================================ // Generated by Garaga version 1.1.0 //! # Starknet Verification Contract Tests //! //! This module contains comprehensive tests for the proof verification contract. //! The tests use Starknet Foundry's testing features to verify proofs. //! //! ## Test Strategy //! - Use real proof fixtures generated by the garaga CLI //! - Test both positive (valid proof) and negative (invalid proof) cases use snforge_std::fs::{FileTrait, read_txt}; use snforge_std::{DeclareResultTrait, declare}; use sp1_verifier_bn254::groth16_verifier::{ ISP1Groth16VerifierBN254DispatcherTrait, ISP1Groth16VerifierBN254LibraryDispatcher, }; use starknet::ClassHash; /// Declare the SP1Groth16VerifierBN254 contract for testing. /// /// This function declares a new instance of the SP1Groth16VerifierBN254 contract /// /// # Arguments /// * `name` - The contract name to declare /// /// # Returns /// * `ClassHash` - The class hash of the declared contract /// /// # Example /// ```cairo /// let class_hash = declare_contract("SP1Groth16VerifierBN254"); /// let dispatcher = ISP1Groth16VerifierBN254LibraryDispatcher { class_hash }; /// ``` fn declare_contract(name: ByteArray) -> ClassHash { let class_hash = *declare(name).unwrap().contract_class().class_hash; class_hash } /// Test the verification function verify_sp1_groth16_proof_bn254 with a valid proof. /// /// This test demonstrates the complete verification flow: /// 1. Declare the verification contract /// 2. Load a pre-generated proof fixture /// 3. Verify the proof on-chain /// 4. Assert that verification succeeds /// /// ## Test Setup /// - Uses fork testing against Sepolia testnet to access required declared contracts maintained by /// the garaga team - Loads proof calldata from `tests/proof_calldata.txt` /// - To generate the calldata, you can use the garaga CLI: /// ```bash /// garaga calldata /// --system groth16 /// --vk path/to/vk /// --proof path/to/proof /// --public-inputs path/to/public_inputs /// --format snforge /// --output-path path/to/tests /// ``` /// This will generate a file `proof_calldata.txt` in the specified output path. /// You can then use this file in the test. /// /// ## Expected Behavior /// - The proof should verify successfully /// - The function should return Ok(public_inputs) containing the expected public inputs /// - No panics or assertion failures should occur #[test] #[fork(url: "https://api.zan.top/public/starknet-sepolia/rpc/v0_10", block_tag: latest)] fn test_verify_sp1_groth16_proof_bn254() { // Step 1: Declare the verification contract let class_hash = declare_contract("SP1Groth16VerifierBN254"); let dispatcher = ISP1Groth16VerifierBN254LibraryDispatcher { class_hash }; // Step 2: Load the proof fixture generated by the script // This file contains the groth16 proof calldata formatted for Starknet let file = FileTrait::new("tests/proof_calldata.txt"); let calldata = read_txt(@file).span(); // Step 3: Verify the proof on-chain // This calls the contract's verify_sp1_groth16_proof_bn254 function with the loaded proof data let result = dispatcher.verify_sp1_groth16_proof_bn254(calldata); // Step 4: Assert that verification succeeded // A valid proof should return Ok(public_inputs), not Err assert(result.is_ok(), 'Proof verification failed'); // Optional: You can also verify the public inputs contain expected values // let public_inputs = result.unwrap(); // assert(public_inputs.len() > 0, 'No public inputs'); // Additional assertions on the public input values can be added here } ================================================ FILE: src/contracts/drand_decrypt_quicknet/Scarb.toml ================================================ [package] name = "drand_decrypt_quicknet" version = "0.1.0" edition = "2024_07" [dependencies] garaga = { path = "../.." } drand_quicknet = { path = "../drand_quicknet" } starknet = "2.16.1" [cairo] sierra-replace-ids = false [[target.starknet-contract]] casm = true casm-add-pythonic-hints = true ================================================ FILE: src/contracts/drand_decrypt_quicknet/src/drand_decrypt.cairo ================================================ use garaga::definitions::G1Point; #[starknet::interface] trait IDrandDecryptQuicknet { /// Verify a drand round BLS signature via library_call to the verifier class, /// which stores the signature in this contract's storage. fn verify_round( ref self: TContractState, full_proof_with_hints: Span, ) -> Result; /// Read the stored signature for a previously verified round. fn get_signature_for_round( self: @TContractState, round_number: u64, ) -> Result; /// Get poseidon_hash(signature) for a previously verified round. fn get_randomness_for_round( self: @TContractState, round_number: u64, ) -> Result; /// Decrypt a tlock ciphertext for a given round. /// If the round is not yet verified, a DrandHint must follow in the calldata. fn decrypt_cipher_text( ref self: TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; } #[starknet::contract] mod DrandDecryptQuicknet { use drand_quicknet::drand_verifier::{ IDrandQuicknetDispatcherTrait, IDrandQuicknetLibraryDispatcher, }; use garaga::apps::drand::{CipherText, decrypt_at_round}; use garaga::definitions::{G1Point, G1PointStorePacking, G1PointZero}; use starknet::storage::{Map, StoragePathEntry, StoragePointerReadAccess}; use super::super::drand_decrypt_constants::VERIFIER_CLASS_HASH; #[storage] struct Storage { signatures: Map, } #[derive(Drop, Serde)] struct DrandDecryptHint { round_number: u64, cipher_text: CipherText, } fn verifier() -> IDrandQuicknetLibraryDispatcher { IDrandQuicknetLibraryDispatcher { class_hash: VERIFIER_CLASS_HASH.try_into().unwrap() } } #[abi(embed_v0)] impl IDrandDecryptQuicknetImpl of super::IDrandDecryptQuicknet { fn verify_round( ref self: ContractState, full_proof_with_hints: Span, ) -> Result { let mut v = verifier(); v.verify_round(full_proof_with_hints) } fn get_signature_for_round( self: @ContractState, round_number: u64, ) -> Result { verifier().get_signature_for_round(round_number) } fn get_randomness_for_round( self: @ContractState, round_number: u64, ) -> Result { verifier().get_randomness_for_round(round_number) } fn decrypt_cipher_text( ref self: ContractState, mut full_proof_with_hints: Span, ) -> Result, felt252> { let hint = Serde::::deserialize(ref full_proof_with_hints) .ok_or('Bad calldata: DecryptHint')?; let signature = self.signatures.entry(hint.round_number).read(); let signature = if signature.is_zero() { let mut v = verifier(); v.verify_round(full_proof_with_hints)?; let sig = self.signatures.entry(hint.round_number).read(); if sig.is_zero() { return Result::Err('Verification did not store sig'); } sig } else { signature }; Result::Ok(decrypt_at_round(signature, hint.cipher_text).span()) } } } ================================================ FILE: src/contracts/drand_decrypt_quicknet/src/drand_decrypt_constants.cairo ================================================ // Generated — do not edit manually. pub const VERIFIER_CLASS_HASH: felt252 = 0x86bf4360e082cd786bd785d3345df32777db89cd26b761f3e85b1993addfd0; ================================================ FILE: src/contracts/drand_decrypt_quicknet/src/lib.cairo ================================================ mod drand_decrypt; mod drand_decrypt_constants; ================================================ FILE: src/contracts/drand_quicknet/.tool-versions ================================================ scarb 2.16.1 starknet-foundry 0.57.0 ================================================ FILE: src/contracts/drand_quicknet/Scarb.toml ================================================ [package] name = "drand_quicknet" version = "0.1.0" edition = "2024_07" [dependencies] garaga = { path = "../.." } starknet = "2.16.1" [lib] [cairo] sierra-replace-ids = false [[target.starknet-contract]] casm = true casm-add-pythonic-hints = true ================================================ FILE: src/contracts/drand_quicknet/src/drand_verifier.cairo ================================================ use super::drand_verifier_constants::{G2_GEN, precomputed_lines}; #[starknet::interface] pub trait IDrandQuicknet { /// Verify a drand round BLS signature and store it on-chain. /// Returns the round number on success. fn verify_round( ref self: TContractState, full_proof_with_hints: Span, ) -> Result; /// Look up the stored signature for a previously verified round. fn get_signature_for_round( self: @TContractState, round_number: u64, ) -> Result; /// Look up the randomness for a previously verified round. /// Randomness = poseidon_hash(signature). fn get_randomness_for_round( self: @TContractState, round_number: u64, ) -> Result; } use garaga::definitions::G1Point; #[starknet::contract] mod DrandQuicknet { use garaga::apps::drand::{DRAND_QUICKNET_PUBLIC_KEY, HashToCurveHint, round_to_curve_bls12_381}; use garaga::definitions::{G1G2Pair, G1Point, G1PointStorePacking, G1PointZero}; use garaga::pairing_check::{MPCheckHintBLS12_381, multi_pairing_check_bls12_381_2P_2F}; use garaga::utils::calldata::deserialize_mpcheck_hint_bls12_381; use garaga::utils::hashing::hash_G1Point; use starknet::storage::{ Map, StoragePathEntry, StoragePointerReadAccess, StoragePointerWriteAccess, }; use super::{G2_GEN, precomputed_lines}; #[storage] struct Storage { signatures: Map, } #[derive(Drop)] struct DrandHint { round_number: u64, signature: G1Point, hash_to_curve_hint: HashToCurveHint, mpcheck_hint: MPCheckHintBLS12_381, } impl DrandHintSerde of Serde { fn serialize(self: @DrandHint, ref output: Array) {} fn deserialize(ref serialized: Span) -> Option { let round_number = Serde::::deserialize(ref serialized)?; let signature = Serde::::deserialize(ref serialized)?; let hash_to_curve_hint = Serde::::deserialize(ref serialized)?; let mpcheck_hint = deserialize_mpcheck_hint_bls12_381(ref serialized); Option::Some(DrandHint { round_number, signature, hash_to_curve_hint, mpcheck_hint }) } } #[abi(embed_v0)] impl IDrandQuicknet of super::IDrandQuicknet { fn verify_round( ref self: ContractState, mut full_proof_with_hints: Span, ) -> Result { let hint = Serde::::deserialize(ref full_proof_with_hints) .ok_or('Bad calldata: DrandHint')?; let round_number = hint.round_number; let message = round_to_curve_bls12_381(hint.round_number, hint.hash_to_curve_hint); multi_pairing_check_bls12_381_2P_2F( pair0: G1G2Pair { p: hint.signature, q: G2_GEN }, pair1: G1G2Pair { p: message, q: DRAND_QUICKNET_PUBLIC_KEY }, lines: precomputed_lines.span(), hint: hint.mpcheck_hint, ) .map_err(|_e| 'BLS signature invalid')?; self.signatures.entry(round_number).write(hint.signature); Result::Ok(round_number) } fn get_signature_for_round( self: @ContractState, round_number: u64, ) -> Result { let signature = self.signatures.entry(round_number).read(); if signature.is_zero() { Result::Err('Round not verified yet') } else { Result::Ok(signature) } } fn get_randomness_for_round( self: @ContractState, round_number: u64, ) -> Result { let signature = self.signatures.entry(round_number).read(); if signature.is_zero() { Result::Err('Round not verified yet') } else { Result::Ok(hash_G1Point(signature)) } } } } ================================================ FILE: src/contracts/drand_quicknet/src/drand_verifier_constants.cairo ================================================ use garaga::definitions::{G2Line, G2Point, u384}; pub const G2_GEN: G2Point = G2Point { x0: u384 { limb0: 0xa805bbefd48056c8c121bdb8, limb1: 0xb4510b647ae3d1770bac0326, limb2: 0x2dc51051c6e47ad4fa403b02, limb3: 0x24aa2b2f08f0a9126080527, }, x1: u384 { limb0: 0x13945d57e5ac7d055d042b7e, limb1: 0xb5da61bbdc7f5049334cf112, limb2: 0x88274f65596bd0d09920b61a, limb3: 0x13e02b6052719f607dacd3a0, }, y0: u384 { limb0: 0x3baca289e193548608b82801, limb1: 0x6d429a695160d12c923ac9cc, limb2: 0xda2e351aadfd9baa8cbdd3a7, limb3: 0xce5d527727d6e118cc9cdc6, }, y1: u384 { limb0: 0x5cec1da1aaa9075ff05f79be, limb1: 0x267492ab572e99ab3f370d27, limb2: 0x2bc28b99cb3e287e85a763af, limb3: 0x606c4a02ea734cc32acd2b0, }, }; pub const precomputed_lines: [G2Line; 136] = [ G2Line { r0a0: u384 { limb0: 0x36701a5831c9fb39250e2ea9, limb1: 0x26ad0ec05ad6440f1df034cf, limb2: 0x67cd27cf7598a85f81c23cd9, limb3: 0x15a76ee3d8d1c3451005d560, }, r0a1: u384 { limb0: 0x9009367bbf6e6aa19488df66, limb1: 0xce5cd2ccda4704dc0e4b92b6, limb2: 0xd7656829a6a71c42deb7dd, limb3: 0x16d96e785c797fb5d6afcb14, }, r1a0: u384 { limb0: 0x9d68b0bdf431a2f53189c109, limb1: 0x70e39167384e44fdaf716fa4, limb2: 0x3768099390a3f9d581d88280, limb3: 0x4c208bdb300097927393e96, }, r1a1: u384 { limb0: 0x68ab4b88cf058f147ba2cda9, limb1: 0xce3b4d4da03cbdac75933b54, limb2: 0x1be2f7e6eaa0f1474cb64c53, limb3: 0x546ca700477f9c2f9def969, }, }, G2Line { r0a0: u384 { limb0: 0x96e0f84058018a4538d64e8b, limb1: 0xdb7b84172cb1e68ddd09eb12, limb2: 0xcf3aaa45c2b370e810ea9361, limb3: 0x14b92565b748c30f253912c6, }, r0a1: u384 { limb0: 0x9cdcddf4728a38086aebcd7, limb1: 0x7b8d9115b96656327dd79780, limb2: 0xbf914addbdcbe307142bf7cc, limb3: 0x3c50d0829bdc305ff694cc9, }, r1a0: u384 { limb0: 0xcc0dbe864e35231bdec2ef76, limb1: 0x4efa339ef551d8f751da95ba, limb2: 0xfde5910a13d5c428549ed3f5, limb3: 0x105e4803f5b8472a138e00b, }, r1a1: u384 { limb0: 0x584879d210eb30bfd6518cf2, limb1: 0xa7c4af01b40d0e68243b050c, limb2: 0xade596dd94a41e4aedec2196, limb3: 0x162a46f819eba8e3b9d215f9, }, }, G2Line { r0a0: u384 { limb0: 0xaa37b5f455262931a4a4b667, limb1: 0xd63d75f6f171228540731ca7, limb2: 0x1855073ef14fe67beee9ec53, limb3: 0x703f29e5b69ff1dd1441781, }, r0a1: u384 { limb0: 0x310c4b87c8dca9036f6be0c0, limb1: 0x4b940b400d665d605ca8924b, limb2: 0x6d53ff2907765e3888b9709e, limb3: 0x166de077ba25fe21aafb8d8, }, r1a0: u384 { limb0: 0xa28a55b43c534d6caa724f82, limb1: 0x5f55bbeb19616aec79892386, limb2: 0x3aacfc3b6bd889cf57af9e40, limb3: 0x72ff7d1d3328dbb7c821e1, }, r1a1: u384 { limb0: 0xd5e91f70851719038228e756, limb1: 0xb4f970b567fc2d6738d65700, limb2: 0x8c886fe7294c08b41dc5dcbe, limb3: 0x782b1bf6e81fef26d367768, }, }, G2Line { r0a0: u384 { limb0: 0x8d8ec958debf40520de5d867, limb1: 0x57bad55eb06d937414e80cc9, limb2: 0xcb178ebae0f48eb14ad4fba0, limb3: 0x13aa75258cc1d54eb767a47e, }, r0a1: u384 { limb0: 0x7aec4216b9f9e33aa4f5af6, limb1: 0x607eabc6cb65b9f4b850a042, limb2: 0x1d93b61b06f4e64902410902, limb3: 0x1860921bbe145ede9350b867, }, r1a0: u384 { limb0: 0xe104b73f6d12d90e3c339c6c, limb1: 0x27bab1ac67f3132355d4c1a0, limb2: 0x63ecc80d6bd96b3d592f63d9, limb3: 0xdcb608c9ce643f854507b05, }, r1a1: u384 { limb0: 0xe3895865374c9b06b8d02a7f, limb1: 0x8c09a76a05340ce642b99a1a, limb2: 0x4a4afdbe107c0182cfe2e6e7, limb3: 0x1056de76a10fe55b2659ea44, }, }, G2Line { r0a0: u384 { limb0: 0x6a72f085ee4e78bd4c2aef8e, limb1: 0xdec05cffe4a869aed2a64ee8, limb2: 0xd41aa908b1a833b94e768d2, limb3: 0x56ceab5d5d994dee0ca07fc, }, r0a1: u384 { limb0: 0xd23aad6cd3e84e398a4e7bc8, limb1: 0xb343a6878db6ec20bcac1275, limb2: 0x3111e14b674a67295a242cf3, limb3: 0x39b596a976f556e5ea4016a, }, r1a0: u384 { limb0: 0x19fcdcac7feb1f0edbefdbf8, limb1: 0x71bc60f1a68459eb52df6a92, limb2: 0x2827dbba9d5d8516fb557dfb, limb3: 0x4786cc02b147d13e701c1f5, }, r1a1: u384 { limb0: 0xcb7555c0db86510eb99cfadd, limb1: 0x43387d10f8329296e43e6610, limb2: 0xbf6789475132950c583823a, limb3: 0x145f508c63c10d270e027b2b, }, }, G2Line { r0a0: u384 { limb0: 0x411944418a1e44d0fbd8a4bd, limb1: 0xfa3933a100d5d920bb158196, limb2: 0xaf6096a850d10c6ee57b7d3f, limb3: 0x7bc245f0c719ec216f4f7e7, }, r0a1: u384 { limb0: 0xd5f88a09ab7912a54504534a, limb1: 0x6c7b84068e05767f3ac72003, limb2: 0x2e783a6cd8933e5ce254ff56, limb3: 0x648a93088ef22f73be5e1d5, }, r1a0: u384 { limb0: 0x72f4d88bd20cecc4c1d57b8f, limb1: 0x2164d957d0e784aca77a27b6, limb2: 0xe45f0a865306a8c7ccf8e465, limb3: 0x182e7e79c81e19c5e6dba3b8, }, r1a1: u384 { limb0: 0xf2b21292475b313a8591d232, limb1: 0x31975a79dd261ef9304ae69f, limb2: 0x3fca7e570497ea425d166e3f, limb3: 0xb1e493cae679afa3aeeb48e, }, }, G2Line { r0a0: u384 { limb0: 0x7bd212f8f60967471e995a8e, limb1: 0xec76fa31d0fd358f36ee756e, limb2: 0xa63e06c40964532a724817c3, limb3: 0xd860767952ed2b694b64eea, }, r0a1: u384 { limb0: 0xd18f8b1de21e64c50d3c6fc2, limb1: 0x456cec057d45521c48d0b547, limb2: 0x23fb8276293fac77c9a38c1b, limb3: 0x1469d7cf50d58855fa523aa8, }, r1a0: u384 { limb0: 0x52f1d22ea6bfc23435bf7e3b, limb1: 0x3e2d5122467bf39f2573a57b, limb2: 0x378db9e77f53b5b1e38981da, limb3: 0x1015deb442db265529d8948, }, r1a1: u384 { limb0: 0x73c44618fb7917b2596bd460, limb1: 0x598ee13313073cf3232e1b37, limb2: 0xbd63e58ae4aa477bcd459ef2, limb3: 0x272bfde06aa8302ab8c70d6, }, }, G2Line { r0a0: u384 { limb0: 0x84d7880d9c5ad98d07f1b961, limb1: 0xd5be4b6e58ad745353113073, limb2: 0x592ecc7534e44983a06d755c, limb3: 0x15d60a0d6d8a2e4543194737, }, r0a1: u384 { limb0: 0x9ba63990e4f1ea4875173006, limb1: 0xf84fa98d5f3742b3c571f427, limb2: 0xdd28189a4a2e3a70f78a170e, limb3: 0x1ad5bc82425c66f655a75db, }, r1a0: u384 { limb0: 0x49306522c22ca321950bf155, limb1: 0x369a747f27aa6472ebc5d290, limb2: 0x20d8977cbe5acf112574c70a, limb3: 0xcdc103da1aac9ec5f855b64, }, r1a1: u384 { limb0: 0x74517cbd651af3940075c057, limb1: 0x94d3802d81c93d69eb13518b, limb2: 0x76411c393dd03e5381661629, limb3: 0x16e57b05faef24ef64868a07, }, }, G2Line { r0a0: u384 { limb0: 0x1a30592d98290c72cccd458b, limb1: 0x140a621ff20376f808a589fd, limb2: 0x49ba32b20969590620d93359, limb3: 0x8505a11bd1aa7d53fffa788, }, r0a1: u384 { limb0: 0xbedeeea8460644391170d35f, limb1: 0xcfc8f5f9f7606a79990e9242, limb2: 0x2747fe157739059a9b528ae0, limb3: 0x13386caa378815cd519166ec, }, r1a0: u384 { limb0: 0x2adf79c700fc3a5a36c5ec26, limb1: 0x4f168c2853c5ec65b71b40ca, limb2: 0x7e0c13754f775e73a9419653, limb3: 0x10616cc67745c7887ca4898e, }, r1a1: u384 { limb0: 0xde84fc636c0a8697ac4d8960, limb1: 0xdd66e4fac060783909cc83c4, limb2: 0x86edc8b2faa981346da2237c, limb3: 0x11c912ed6ea0e8f7768ac884, }, }, G2Line { r0a0: u384 { limb0: 0x6b6c23b2b461087f63e2fd50, limb1: 0x8454a8c69f81cfea8edb19ba, limb2: 0x2133ca31f8dd40f674513fd8, limb3: 0x171663bdebf2ef26dc306e13, }, r0a1: u384 { limb0: 0x6b95f25b75fe9a8aa69ae917, limb1: 0x2f15c87206b024c108e4f4d4, limb2: 0xc4e3e65f02f2e19326083300, limb3: 0x16172a9e775f111d4bf432bf, }, r1a0: u384 { limb0: 0xc4289527cdf4e1662f27e1f9, limb1: 0x7f6c52aaea1458a5388d10eb, limb2: 0x4f6130d75d26097d0a4fa02a, limb3: 0x16f8a911b684b408bbd72650, }, r1a1: u384 { limb0: 0x648a1498ebbbd0e225db1ffc, limb1: 0xa36cfb4b46195b619bb220bf, limb2: 0xe327926a1726c7e5bb70bc97, limb3: 0xfcef666ce7ecc2915258730, }, }, G2Line { r0a0: u384 { limb0: 0xb5abe92a46d0ff04a4205803, limb1: 0xdb760c98b7aad959e5dfc28d, limb2: 0xbea9b6e4adf41fa1060713ee, limb3: 0x75707a467e7543c28370330, }, r0a1: u384 { limb0: 0x8b0715d2f6a16be8d5828197, limb1: 0x598a8a6da7ed2bcc091f594d, limb2: 0x18cfc9c1ee8960c06ff2c240, limb3: 0x14061839f139644bb20e8647, }, r1a0: u384 { limb0: 0xd529f0561fff46258f565dec, limb1: 0x80402f61ae7ce96272aff23b, limb2: 0x883367465c3a4bde2507377a, limb3: 0x14fc234296369891318c6245, }, r1a1: u384 { limb0: 0x9fdc0242b4d20c44b72c8d49, limb1: 0x37e047238dd417acab9ea0c2, limb2: 0xc424c8845919fe27ac23e9, limb3: 0x151e87d65d95c3b1cc9b1de6, }, }, G2Line { r0a0: u384 { limb0: 0xf5a9a8a9d8ecd9df033bb53b, limb1: 0x6f13c1f15ca3c43bd8dc862c, limb2: 0xaf9fffe39ed8b6f589e47e4f, limb3: 0x1355d3f3bda0ba53c342406b, }, r0a1: u384 { limb0: 0x13c7baebedc25cd07fa0b8ea, limb1: 0x4e29e5e7fd865c69feb81131, limb2: 0xdcf94191f24d657ae6fc8c5c, limb3: 0x162398b0a01eff8f7149ab6c, }, r1a0: u384 { limb0: 0x8cf50d2f7aa3da376e8317d5, limb1: 0x490a7502e8f6bc788f715c7a, limb2: 0xe6db018fa6b084ae40896c2b, limb3: 0x184f93ce89fff4893629db4d, }, r1a1: u384 { limb0: 0x53e941ac4d20f05b66f3b0ec, limb1: 0x82b8a8efafffe40798a1d5da, limb2: 0xd08e35da426abf3dd1ce8bb, limb3: 0xd49095a9c436bd86f9d4736, }, }, G2Line { r0a0: u384 { limb0: 0x9bd8fa7a943e0e3a924e7492, limb1: 0xad948685eedfe9d3ac7315ff, limb2: 0x8148910d6004895792caa88d, limb3: 0x1deabfaeb3374b50119ecb9, }, r0a1: u384 { limb0: 0xfedf28954ae85d6e9f58c709, limb1: 0x7c01f5d8a4b9368fc9cbb8eb, limb2: 0xbe98bf07cbd25fe6f4ac154f, limb3: 0x7c9b05e8adef4de506459f7, }, r1a0: u384 { limb0: 0x71812aeba8c33457117bfb0, limb1: 0xaf1a11b5a7571775ec17c1, limb2: 0x721e08542ff85e7037b2c02f, limb3: 0x991d1db86230da71efb4475, }, r1a1: u384 { limb0: 0x4122fa433f37c5e6888de07c, limb1: 0x144d977681671d8cd0854c34, limb2: 0x93981673fae1df08d18161aa, limb3: 0x145eae6a49c250f2435d1ec8, }, }, G2Line { r0a0: u384 { limb0: 0x3ab208ad049d8dbf41ab2d8c, limb1: 0xe8d0eafc04fe7a37f53901c8, limb2: 0xbffd6b641b6f6961476d4a1b, limb3: 0x16c1d585f68dee202ea9a988, }, r0a1: u384 { limb0: 0x3eba0d6e9e3751e7d1b4533f, limb1: 0x8e4692d56ab832e68469328a, limb2: 0x9d03908cf037ee8faf6dac32, limb3: 0x2ef973d44d5dfe1f52b48e7, }, r1a0: u384 { limb0: 0x6cd551023179a5ffe150ae4b, limb1: 0xd48575f40677168193ee4571, limb2: 0x81320f4ef3fa7936f5865695, limb3: 0x37748234157e4931a4f54d7, }, r1a1: u384 { limb0: 0x73847e2fc69aee5b6a51756, limb1: 0x1cfd76b51ee2e57b733742b9, limb2: 0xe02551761eba32bebc8413bb, limb3: 0x3136b909d615d39094ab565, }, }, G2Line { r0a0: u384 { limb0: 0xa8af53d78f2fa38c6e213a84, limb1: 0xc908fd45d36e147e8a3449ea, limb2: 0x9224181cd573d3836b141129, limb3: 0x140090a04158ea562a90ed5, }, r0a1: u384 { limb0: 0x95e6526648a96a5a43488327, limb1: 0x5f5e4c24465495ee0dcb3055, limb2: 0x49f0985811804cda4142ca8c, limb3: 0x9619ac570f151f7baaa7ae, }, r1a0: u384 { limb0: 0xc2ef8275baa5e3b836a847d7, limb1: 0x9835333ce4136fda57f9c31e, limb2: 0x8392d675aba184475007124a, limb3: 0x10f9170d8f4e3130ef5a354e, }, r1a1: u384 { limb0: 0x4db131e9b2a50df6253da27e, limb1: 0x3210503344192c1a1d83234c, limb2: 0xb84a1ae100e6602d2a3eaa1d, limb3: 0x146401ace26dcc76ec7cb805, }, }, G2Line { r0a0: u384 { limb0: 0x9a29bb6c54b018b4ed75888b, limb1: 0x1437b2d93b1ecc564157059c, limb2: 0xf0add7baf8cfe1ddc30f0754, limb3: 0x86553ec1cc3cc6a38436fbb, }, r0a1: u384 { limb0: 0x516be99929795e7ae5112f30, limb1: 0xb182ffdb6110024a0018e3e7, limb2: 0x8e468869d60b7ae7fc6004bd, limb3: 0x4916e8c2d5820861e32013a, }, r1a0: u384 { limb0: 0x78554bdd8568c0e9686a510e, limb1: 0x97bc0c8b458fe7d5dcf2264c, limb2: 0xfcc4906709b359120a9e0158, limb3: 0x193f60f20d1cc7f2b1bf553c, }, r1a1: u384 { limb0: 0x2713699297ab49a2d9bf4f6d, limb1: 0xb396d1c4590471bf032b959c, limb2: 0x350113633de03c6e721c7597, limb3: 0x79ef6c98d71e95eb13fae02, }, }, G2Line { r0a0: u384 { limb0: 0xb3bbccb4893a93d20a147b98, limb1: 0x5c46a12e68c1dcaf7d45545, limb2: 0xe1d3e9970b998f9ee1bfcc60, limb3: 0xe0e611221166a37eaca4699, }, r0a1: u384 { limb0: 0x255f666baafad4929f87c34d, limb1: 0x1a1554e683a36d8c5359c91d, limb2: 0xb351c7146573abdf82d32baf, limb3: 0x14bc0381e2ada56e42a08f14, }, r1a0: u384 { limb0: 0x84b1b1e77e26467b905fa496, limb1: 0x28fdfc19e13b0752aba34749, limb2: 0xeee8045d6526734c1f95307d, limb3: 0x1e4f12f75a3db50a60aa03e, }, r1a1: u384 { limb0: 0xcd8114dc6e6775890632c756, limb1: 0x3c477ef68ef5ed0c85ca0a58, limb2: 0x706f9cac1acb2b71feb8358, limb3: 0xeded7ab6bb655672cde9835, }, }, G2Line { r0a0: u384 { limb0: 0x6016ea652473b7f107a77710, limb1: 0xeb4242895460db86f361eac8, limb2: 0x5fe77df899b1ff5607b38de2, limb3: 0x10efb35680805c93c2bab2ca, }, r0a1: u384 { limb0: 0x9107262e5bb66980954e1a0f, limb1: 0x57ab274a8a9565abc99387cb, limb2: 0xbcd4f18d8a7e65b964541f5e, limb3: 0xaf8d03faf1efb9183c00a2c, }, r1a0: u384 { limb0: 0x751a66b007c730df74908a8, limb1: 0xf41cc4578874d56d020638c5, limb2: 0x5230861fde86bb685b68c62f, limb3: 0xb5d973cfd5090cd49182b06, }, r1a1: u384 { limb0: 0x283597c889dd32a98401459a, limb1: 0xb44d0ac2827551860df4a510, limb2: 0x399fc7f05e1000db1a41c1a4, limb3: 0xe3944c673891658df0e2ba3, }, }, G2Line { r0a0: u384 { limb0: 0x4396189ffbd89d01fe27fa5b, limb1: 0xe81217db1696daa3753ccd84, limb2: 0x55c6ad903c2a3e4b9f14a8da, limb3: 0x15f5f0afe4eeb7545fb13eb0, }, r0a1: u384 { limb0: 0xd3da9931ffbf361f326b7282, limb1: 0xc9d2464eda778b0051c1027e, limb2: 0xb8f5f46e2bd5fc15d81b368a, limb3: 0x1040f087e9a0b6633fa13692, }, r1a0: u384 { limb0: 0xf986f1a7ae6234649c858e8a, limb1: 0x4644ba4e2b6b06ac11907477, limb2: 0x95bcd96412c2b77c798589bf, limb3: 0x122a0d20337a4865af008b55, }, r1a1: u384 { limb0: 0x201ad08d1e12f22740a2d61f, limb1: 0x4ec7ca2abf73f04dd4d3c1cc, limb2: 0xbe2da8c0b44af69f8c08bbe5, limb3: 0x3bac9dd093b57980816b067, }, }, G2Line { r0a0: u384 { limb0: 0xa91fa22e8afc80abea221520, limb1: 0x5bc71539a636bbf8ebbe74f6, limb2: 0x2922894d551b50829ba322fc, limb3: 0x14e8b48d18e449e691aaf792, }, r0a1: u384 { limb0: 0xd260160df53ab2df298a0d4c, limb1: 0x854978d64707004860c8ebf6, limb2: 0x20a4348de1a9dd2d5347eb55, limb3: 0x243d4a3903c17c3cc51c2e8, }, r1a0: u384 { limb0: 0xcd7b87ec09c28073ba10e0d1, limb1: 0xa5ab4f79373898318a3e146d, limb2: 0xe648aeb5fef1cf65d3fbd74b, limb3: 0x2fa5e6b46df2191aabe0bef, }, r1a1: u384 { limb0: 0x11b43fce26bc49795004ca02, limb1: 0x437fe31017f62de97ffc3e35, limb2: 0x97d41632c4cd7bb50f450ba6, limb3: 0x9b7e59a28684bed532da137, }, }, G2Line { r0a0: u384 { limb0: 0x4527a34a70ec377ccd63a5b2, limb1: 0x351c7771105a0a1096dd87f0, limb2: 0x57630dce3b4db45cbad696a6, limb3: 0xf10733fed03fc5b7ae27fc4, }, r0a1: u384 { limb0: 0x53a208df401e3d6bf657857c, limb1: 0x306991a8af53fac94e1e9b52, limb2: 0x324634590aee6093dd239d9, limb3: 0x855b8b1eedbf578f7498f37, }, r1a0: u384 { limb0: 0x71e5471ff515d0d4982815b6, limb1: 0x9a63281835ec15935519deca, limb2: 0x17a64faa9e7e4ab574a3f785, limb3: 0x134b4a48f53fff9361e1952c, }, r1a1: u384 { limb0: 0x56dc56f73bd268799b824fa3, limb1: 0x4180514d6004cf446a366719, limb2: 0x193a82567b226e738b11a0af, limb3: 0x1498d7e7ad2a68346f7d2199, }, }, G2Line { r0a0: u384 { limb0: 0x81e4894bdfaf54d49cb0c4d8, limb1: 0xeb9bf46cb3dcd89325b39d09, limb2: 0x5a8e743db320615a5a0c40cd, limb3: 0x1850f244c5272718a19a040d, }, r0a1: u384 { limb0: 0x857b482a44483bf0457331c7, limb1: 0xa67cfb7a4ea236dcedf6137a, limb2: 0x639d1a584ec879083798355d, limb3: 0x14240af1c0466562ca4e24f5, }, r1a0: u384 { limb0: 0xb525edd6feb5970219a6995c, limb1: 0xb1205b041c3e38e20d2fe204, limb2: 0x8caed9ba4365ffbc1589b563, limb3: 0xfdfce3b6d0c90f89ff5b6ff, }, r1a1: u384 { limb0: 0xf04c7ee058045bf0c52bcca9, limb1: 0x25da9c7e03f90300aa977fed, limb2: 0x5388457b2d4593b62df4c077, limb3: 0x16cde52858fd178529b49d60, }, }, G2Line { r0a0: u384 { limb0: 0x6c92af226aa27e2cbe8fae21, limb1: 0xbc299acce5e8da96b6b932d, limb2: 0xec46a86181ef1ff2f8317201, limb3: 0x17900cb270764782b3eca3d2, }, r0a1: u384 { limb0: 0x82358801a5440afa7826f03e, limb1: 0xd09104615d27b1dba405157c, limb2: 0xda33c37fe337917d32826e1b, limb3: 0x1be7df7094ce56532653ce2, }, r1a0: u384 { limb0: 0xd33c9c433bdeabd28a276748, limb1: 0x5dd445f6fe3bb3070cd0d395, limb2: 0x8b092b49f4fdf2a38337a44c, limb3: 0x4e047a80a74764555b1ea3d, }, r1a1: u384 { limb0: 0xd83bc84b011c607d97684972, limb1: 0x2b14aae22370badd22ec77ba, limb2: 0xd29b9c7b77c3f08055bb8a9, limb3: 0x125b416bddff21db8d6f42ed, }, }, G2Line { r0a0: u384 { limb0: 0x1f7265a2588028a739940ca5, limb1: 0x1e3d7315d69b4f1540ef139b, limb2: 0xa239c997bf8c622c1716408, limb3: 0xd9744d0ac86db4218e7e96d, }, r0a1: u384 { limb0: 0x90541dda73208a1d1eda111e, limb1: 0xd5a4dd2c69e927e6a84d8487, limb2: 0xbba86a67c752a3ce780b84ff, limb3: 0x9a35294d76f0d15a59ad03e, }, r1a0: u384 { limb0: 0xaeae8c21bae747ea58e4eb2b, limb1: 0x22bee27e94b3df2f9e30496a, limb2: 0x3c490f390a6a3762549bdbf9, limb3: 0x1777cd7c3048d009f9f72bea, }, r1a1: u384 { limb0: 0xec21f8b948e62cded22a7d58, limb1: 0xb8041010b7270992a963f6df, limb2: 0xbddd05cca8941058f062d094, limb3: 0x10ad979954bdd8983ce4dfc2, }, }, G2Line { r0a0: u384 { limb0: 0x6cf96397e7b79f2fc8c8275d, limb1: 0xfc7cd3706f331af3de61fabf, limb2: 0x78630a1ca624fae6d5770503, limb3: 0x15ed1256df8e5e5ca95b56c8, }, r0a1: u384 { limb0: 0xee76aa06cc2a711c9ed0f30e, limb1: 0xffa3eb442aaeb1342a8a3887, limb2: 0xcd5194bd83d804f9da8e5cda, limb3: 0xf5886abb33616f07cfac605, }, r1a0: u384 { limb0: 0x3e0ff1e7d1f926d905c0e89f, limb1: 0x3fff1943b59d697a741845cd, limb2: 0x4e362d7df69aa3269ea5a418, limb3: 0x13a520fad90f72497a67b697, }, r1a1: u384 { limb0: 0xce7bf1da23ccce53d8e13b8, limb1: 0x56957fccf1163143404a68dd, limb2: 0xd26ebbc9548a9897d0383b14, limb3: 0x329392268b1afdd087dd27b, }, }, G2Line { r0a0: u384 { limb0: 0x8f61e98d8c6cfb102fc12599, limb1: 0x3b581910d31b036fd00d6cd, limb2: 0x960c67926f53a7c4400c36fe, limb3: 0x1437622871bdaa8aa8f1620b, }, r0a1: u384 { limb0: 0xc06e7440dac5dc6345811f4c, limb1: 0xcfdd60e51cc453252af4fcc6, limb2: 0x756f2c0839d3582469c0b8c6, limb3: 0x12d66e992019751bc4b8c1bb, }, r1a0: u384 { limb0: 0xb0f08516779af407c735061a, limb1: 0xaf9b916f38282785c75beb83, limb2: 0xb386d3a1dd1445469d29c602, limb3: 0x24dbe829c015491a29896d1, }, r1a1: u384 { limb0: 0xac0f9105a6d03cc8551b7c70, limb1: 0x4f4b9b10e54191aae0271be0, limb2: 0x6bd62b1dce1efa964448250a, limb3: 0x121963e40701951c40d3ccd2, }, }, G2Line { r0a0: u384 { limb0: 0x765ce308dd13ea9ec917f81d, limb1: 0x4c2cdefe8611811647fac337, limb2: 0x9e01fde22386755f816c125f, limb3: 0x249a870907df1494e56fc21, }, r0a1: u384 { limb0: 0xc3cd52b28123518842661348, limb1: 0x6678659f6f9ca9e64f594e30, limb2: 0xbdde01f23d77cc2219a64e1, limb3: 0xa59546d0d9d0d18614e9879, }, r1a0: u384 { limb0: 0x7e7be141202ac55eb1d4a8b8, limb1: 0x22ee295a285099a1bdc85200, limb2: 0x7d274b729c40bb351c2bdd3c, limb3: 0x105edf80625508ee7473afc3, }, r1a1: u384 { limb0: 0x8d19d95e92eb2f4d361b91e, limb1: 0xf6cc461a1b4bd0202cc3590b, limb2: 0x87ebac45146065b2dc8d4bde, limb3: 0x1375f5a114849a9f8e0c3d37, }, }, G2Line { r0a0: u384 { limb0: 0xf3f6022a346335909994d26b, limb1: 0xa2e674d9be45c130702c8393, limb2: 0xda934834c7f1f4550986c5, limb3: 0x17170963f6200ba02d7f36db, }, r0a1: u384 { limb0: 0xc6bd88f8f5883c00bacb7319, limb1: 0x2865832a25d7695c70d60852, limb2: 0xd63579f3b9eb855ce78f80e0, limb3: 0x16f67362c8cbffc3e300d83b, }, r1a0: u384 { limb0: 0xd5bef1e76085837868d52daa, limb1: 0xe17818fa8f87a1a29495c6f0, limb2: 0x33702bc5001cd8e3bab9709c, limb3: 0x3ee9300c2e7d74b5e5774d, }, r1a1: u384 { limb0: 0x79515359f6e9ac46c2da8b44, limb1: 0x8b1d7830cfb661bc910fe5b5, limb2: 0xa6f740bc62a497d501d49790, limb3: 0x106645c420742d2fc191def9, }, }, G2Line { r0a0: u384 { limb0: 0x58f86bbd730aa1df76e95257, limb1: 0x3832640fbf5ff16fd5c86613, limb2: 0xaf56bfc4d589fd5479b90e9a, limb3: 0x3ca74026cf32fba56ec4ff, }, r0a1: u384 { limb0: 0x577775e0ba37cd47da598900, limb1: 0xf402fb94e1c54fc0073a49b0, limb2: 0x2e06dce324741a7e96cd8fcc, limb3: 0x16f491b5bd383da7e70c001, }, r1a0: u384 { limb0: 0xf906737c542dde2e8b5d7bf7, limb1: 0x93d207424c8f01f866d09071, limb2: 0x7a8dc05cf5ae45304b21d8d, limb3: 0x1d432a9b400dc09515479f5, }, r1a1: u384 { limb0: 0x533a88fd57c73a7a668d47a8, limb1: 0x11cd23f02ff6e7610e1522a9, limb2: 0xbb9e0293df841db5d616e680, limb3: 0x19f2811473fbfa9dddb16249, }, }, G2Line { r0a0: u384 { limb0: 0xb84433d5bb94067c8083df37, limb1: 0x4a1c6dead6b06daaef49a331, limb2: 0xf045631520d7fcf91cd6d5bc, limb3: 0x171679be9cc2fb7fca2ffb4b, }, r0a1: u384 { limb0: 0xbff0ab7bce5a89764c470c2b, limb1: 0x7c275c7485dd37e467e28e07, limb2: 0x976153708a70bd4353e49415, limb3: 0x137b63810a42885e3d12973a, }, r1a0: u384 { limb0: 0x33aaf9966841141dd4aeed0, limb1: 0xe937c580cfbd8a3936590a47, limb2: 0x7e2948f3ac9443871d29a3b0, limb3: 0x17ae57245137f902685ea5f, }, r1a1: u384 { limb0: 0xae14ce204d876228a369b45, limb1: 0x6e8aa97e94af3b53715ed047, limb2: 0x346c278c809a30daf1d01b7, limb3: 0x22e054e6e6d8bf998a85e43, }, }, G2Line { r0a0: u384 { limb0: 0x453bf5d35812bbf0123c972a, limb1: 0x3a9bcdec2fe60921bf629abd, limb2: 0x8d4d0d00c4d2739ae3a0b176, limb3: 0x9a76bae205af60fb63330d3, }, r0a1: u384 { limb0: 0xa5e2fc320bd337a5e6bf6e59, limb1: 0x649bf53444907381a7d0f976, limb2: 0x57cfc1f1da9301aff5ef309c, limb3: 0x79042a88c84c694ffd3fa12, }, r1a0: u384 { limb0: 0x8149e3cbfdcb7c4749e0ba73, limb1: 0x72f87f4ff2d25e09a5eae7db, limb2: 0x1d01fadf84a7202ce4489428, limb3: 0x15652f54b134df28e3b93c7, }, r1a1: u384 { limb0: 0xa1b43fd866b4d217c50e744a, limb1: 0xce197f05b592d754e8f84093, limb2: 0xbc7dc9245b7e2113d675abe4, limb3: 0x2f8afc77fac6bc37b0c7667, }, }, G2Line { r0a0: u384 { limb0: 0x5f799d84974b34b214204be7, limb1: 0x7e577069bef682a54f78cc32, limb2: 0x43803af2b35c7987d12eac96, limb3: 0x3570c7ba557421c82cfaa6c, }, r0a1: u384 { limb0: 0x2aa9d33a1acddb979d7c2d2f, limb1: 0x2bb926928f20a965a10a6d22, limb2: 0x1d650b759bafd7750c78aa91, limb3: 0xac21b07f22d3d31ceef607b, }, r1a0: u384 { limb0: 0xa188a2df22f2cac6ae25fcff, limb1: 0x15f7af3ae3fe3ab80fcbf44b, limb2: 0x3cc65299b3a990d0b8f2dc21, limb3: 0x720671ab41e616ac46a4d4, }, r1a1: u384 { limb0: 0x8d5ce83450ecd58d21821d04, limb1: 0x600fb56fcdc4198005433d16, limb2: 0x60f583b87d52b7e7eae71b15, limb3: 0xfb05f7038ebbb06ca53b3fd, }, }, G2Line { r0a0: u384 { limb0: 0xa36890bfc74afe64e9f3840c, limb1: 0x8eeaf2f380047dfe3a21b11b, limb2: 0xeb84e8fad6b7625c837aa272, limb3: 0x135ff64b4d73a3a2d0f886b2, }, r0a1: u384 { limb0: 0x6fa3e40ac2853a97b01176dd, limb1: 0xcd16a519987e4aabf6bd8d1, limb2: 0xe4ee3c4f4c650fbfe5a0a370, limb3: 0xcc7efdc19164223dbcb0b43, }, r1a0: u384 { limb0: 0x9ed5597f7236b21674d039f4, limb1: 0x5cce2f4074bfb9593d07dcab, limb2: 0x1467dedd98c377f9f9b46e75, limb3: 0x89f8ba7d879e18afda115ac, }, r1a1: u384 { limb0: 0xce1eb5fb3e129849b7af9b61, limb1: 0xbb388e5edcc82d67d7e505d1, limb2: 0x37f0c598b86ce85a7ccc5e90, limb3: 0xf3dfe35088599f2eeb97849, }, }, G2Line { r0a0: u384 { limb0: 0xb1dad5dc4b347aa8cdea64f6, limb1: 0xcc2058c63fba33421acef87, limb2: 0x6671bbd574e8f23a8c33a473, limb3: 0x173c0d3a77be26a04dc370a, }, r0a1: u384 { limb0: 0x89c7ef66c7e6d4c7a5f1ee7b, limb1: 0xfa29a5dde6a8d29efb1b12b3, limb2: 0xc0f4a5b6342df0adc3da765b, limb3: 0x154e74a84c92a5ff794fca30, }, r1a0: u384 { limb0: 0x3baf5745ddfc03d1be36473, limb1: 0x41fbbc02d24948d8a3c0efa1, limb2: 0xeba542193a176f39572880b7, limb3: 0xba18efa42d34eea1333f2cd, }, r1a1: u384 { limb0: 0x77fee73ea8d2cae877fc09bc, limb1: 0x4b28c7e9ba63b4a2a16dc3e3, limb2: 0x5ef0ade97bcf1bbd542b74c2, limb3: 0x60c323e8930e93d6a8a8b53, }, }, G2Line { r0a0: u384 { limb0: 0xb9289920fc29c178a0728467, limb1: 0xf35e17ec8a43244f4e0efb63, limb2: 0xa46135ade487bf1a95a36590, limb3: 0x4597ae1f4cfcdaacff3f6, }, r0a1: u384 { limb0: 0xe926fdfcdb55d8651b029bb7, limb1: 0x741390b7035f30b98e2dcd27, limb2: 0x697fa3901ef0c0d6f4f0693b, limb3: 0xcc420802c358e2dedfc71d4, }, r1a0: u384 { limb0: 0x404a03b34791ba0f3fa9761, limb1: 0x50d30e7876bb541f3ef689f6, limb2: 0x7eca4b1c1a04fdc1c58f3065, limb3: 0xa9e0b8c0194468d35c05fbd, }, r1a1: u384 { limb0: 0xb370e739ea46b6699276bb50, limb1: 0x39805df77c609ca4cb80f044, limb2: 0x1f93a5fc91ea7ec7048f46d8, limb3: 0x109841b0d6d23c644d831b58, }, }, G2Line { r0a0: u384 { limb0: 0x696c2443a8baa527eef5ec6e, limb1: 0x7c385a900f4614f62a38d2e7, limb2: 0xecef959f527ae42bb1b2a0ed, limb3: 0x7fac72373dec09eeaf6db37, }, r0a1: u384 { limb0: 0xc84aa165d81984cbd1d40498, limb1: 0x7ef2f6d8a1b0b82a86a8aea1, limb2: 0x9f04cb828903af563a7ce955, limb3: 0x1260f88b57dddd5bf01540db, }, r1a0: u384 { limb0: 0x7d666c3a74212ecb676ee24e, limb1: 0x8ddff061953f45de2460c7ee, limb2: 0xb69a343af7532ec4af3c8894, limb3: 0x213c5dddce502302ac58fec, }, r1a1: u384 { limb0: 0x9b68c470206e0a6b23d993d7, limb1: 0x8e64f45ab3906177fca690b, limb2: 0x6b3ba9665c9e8cdb62669c9b, limb3: 0x4535c1e41f9fe732b7c4780, }, }, G2Line { r0a0: u384 { limb0: 0x47796752c668f86cda3eea09, limb1: 0xabe85392bfe45c509b21188a, limb2: 0x17747fdbb10299befbd5f562, limb3: 0x10f206ff106da3cd9621d6a7, }, r0a1: u384 { limb0: 0x19e850771140dd110fd5f601, limb1: 0x49e65a215ab2cb29f8e19340, limb2: 0x7c583039a8252df0d94325d4, limb3: 0xfdd46f3792b92d70b7938c8, }, r1a0: u384 { limb0: 0x2973fb308f21f4591c6768bc, limb1: 0x7c10b3f79cbbfc0069738f2c, limb2: 0x227581522b2559c9557982fc, limb3: 0x146f0ce0cb299800bb8186ed, }, r1a1: u384 { limb0: 0x7e45c08de7497185100c82e7, limb1: 0xf873456c3b1257743a548919, limb2: 0x4e414c1420aa0674960bf9f, limb3: 0x12b9b73bea8424ee57b2038, }, }, G2Line { r0a0: u384 { limb0: 0xf52c3a9e1924d9731f45159d, limb1: 0xb552aaa0c17ebf07b9461b81, limb2: 0x9e0e2d36095165665a56c844, limb3: 0xdc948cfb597299725a35f46, }, r0a1: u384 { limb0: 0x37804446f6495b7f0eb8afe, limb1: 0x8290cde2fc690a09b1e27c3a, limb2: 0xac5737e20aed8460e392261b, limb3: 0xcffa82f91cfb6f276a79a6, }, r1a0: u384 { limb0: 0x13dd968a1b3c381b4b53e494, limb1: 0x231f8610c0c788da31f6a767, limb2: 0x1d90cef9842373ab0ed2113f, limb3: 0xab763befb660bb27aeefea1, }, r1a1: u384 { limb0: 0xfb0924f8b0c0076931026ead, limb1: 0xc2303d081337f2117f9edd47, limb2: 0xbb530c1bf25042e905ef49b5, limb3: 0x13cf2176e8c30a76d82031ff, }, }, G2Line { r0a0: u384 { limb0: 0x14e4f467f4709129c1d6d6d7, limb1: 0x33e67ed9f2b5e1802523571, limb2: 0x3e76ea8acb143c96671cbc65, limb3: 0x1137f470c8f7d00baa56e5c0, }, r0a1: u384 { limb0: 0xa2a95cfa92d0088ab1308e85, limb1: 0x85a5304db0b3422f71d7ac93, limb2: 0xbc8572953d8f42a55fe99700, limb3: 0xf23701cea5719c6d8b0d3f3, }, r1a0: u384 { limb0: 0x380e418e3c32756e123587f9, limb1: 0x8a39d6b5872d774c57af0ba1, limb2: 0x11473256ad05f9eaac305647, limb3: 0xa642f0b83f002f2b82a1d3f, }, r1a1: u384 { limb0: 0xd5b5c903360b3614bde608b6, limb1: 0x407e2bf83df10c320c4ddafa, limb2: 0x3771cad615e4d7b5de69e962, limb3: 0x105334af5850345d42c10c17, }, }, G2Line { r0a0: u384 { limb0: 0xcdb8e16f1b850432af115daf, limb1: 0x494ac8b75720d50e9d866f3a, limb2: 0xda7586ede3b806d6a6384fd, limb3: 0xb859f60d04e4ff66fdfc85f, }, r0a1: u384 { limb0: 0xe11de01127cbc1a326afb2b9, limb1: 0x6eebbbb38d51a71d3170ccd7, limb2: 0xd5cd24d22fecda4fe96bae46, limb3: 0x101e2ac25b02edda9728dcd0, }, r1a0: u384 { limb0: 0x71b27a86fd074f148f733377, limb1: 0x6ec32a4c65f5682adf1bb4da, limb2: 0xe8a268ef501888b89065c8ef, limb3: 0x12f6fae4a11b2f7bae3b371a, }, r1a1: u384 { limb0: 0x925f04ea98dc22979ea69c0c, limb1: 0x7778ab2882af9fc10adda60f, limb2: 0x31b791ebfc10de4e0843db89, limb3: 0x1884eaeeb4127c15465bd473, }, }, G2Line { r0a0: u384 { limb0: 0xe8ab375f9e79671f77c33b38, limb1: 0x32c9317a9c538a1808d10350, limb2: 0x39b7c7695d2524211d5341f3, limb3: 0x373d7203575fda92e7b4b02, }, r0a1: u384 { limb0: 0x54a74ef22bb2c45a0f0992be, limb1: 0xe9d5746328bce07da2a04f41, limb2: 0xf657d148ed56fbf731787b28, limb3: 0x7b03ee28e327f04166f5075, }, r1a0: u384 { limb0: 0x754ae620f48dd7de6afcbb5b, limb1: 0x488b7b5de47bfe76c7d7f1ce, limb2: 0x5a2e05b269b38310ba8b4159, limb3: 0x41965ba496910c39d2c8167, }, r1a1: u384 { limb0: 0xe544c97bb363e3619c50c630, limb1: 0x7fec53ec738123389016bbf, limb2: 0xb12f6ffb0998373cb04be875, limb3: 0x4bf5cef5067781b9809ec64, }, }, G2Line { r0a0: u384 { limb0: 0xee52fdd902c0488821edf979, limb1: 0x895d9ff17f5d04d1515dbb15, limb2: 0xda20231af600be908c9165c9, limb3: 0xa88fa0e247a85049196ed0e, }, r0a1: u384 { limb0: 0x1014f46d465b15781593a14d, limb1: 0xfde315a447ebeb1e31f0c737, limb2: 0xc264e73bcfcf21a95860cb90, limb3: 0xa404fe10b300ee8062a4278, }, r1a0: u384 { limb0: 0xde6e165032d17e0a1dd355b, limb1: 0x9ece35a48b0dac3133bcb2ed, limb2: 0x1dd3ea819651f9fffd805b91, limb3: 0x2c3ab75a45f0062b01b25b5, }, r1a1: u384 { limb0: 0x1d435750c14e60fcffc44b18, limb1: 0x781f841326b5c6cd532ff483, limb2: 0x5bdc193e27d8e3050ed4a070, limb3: 0x5865e1a9f5de7c0a57062e0, }, }, G2Line { r0a0: u384 { limb0: 0x4d2b6e4cdcfd83a0692003b0, limb1: 0x41629374ff0d1ac17362c794, limb2: 0x18b16faf0521c1c5a11c3523, limb3: 0x18b70eb629a79ff3f9834985, }, r0a1: u384 { limb0: 0xf6dd615a649c30b33d8b88ac, limb1: 0x526f609b923d7ba3b37b63c, limb2: 0x4289133e7279c670978cd569, limb3: 0x11fa0abe9f21dc673b14d917, }, r1a0: u384 { limb0: 0x7f14d726cf9a27a8c970bb68, limb1: 0xe380e6b07cde1eb0fffd95e6, limb2: 0x2c5722bd0e114b506bddd89a, limb3: 0xd3fb948d9f8e2c898c1b3c, }, r1a1: u384 { limb0: 0x86aed9389c52f71bde01a5e0, limb1: 0x4c6baca3b4494d3a4a88343a, limb2: 0xe1083c4faf04588a29999bbc, limb3: 0xcddd31531e910375fb212ff, }, }, G2Line { r0a0: u384 { limb0: 0x203fe85e2836c465e4db22af, limb1: 0xe308a1ed6dee139d030e8922, limb2: 0xc7908b59711d8544aa16934d, limb3: 0xf2b561c5d125edf292a426b, }, r0a1: u384 { limb0: 0xdb11824ffa56d8b1596236ef, limb1: 0x2dba53ae227809d06646c213, limb2: 0xeb2f93a64e027c5e4973d8ae, limb3: 0x70e748d64796b96d4704120, }, r1a0: u384 { limb0: 0x651d82f84f2464b4da2dfaa5, limb1: 0x122eee1f6190b4da0deaaec, limb2: 0xa3f6869c83d36b0ad97eb0d3, limb3: 0xc58ccf6806e87f189fcbb0a, }, r1a1: u384 { limb0: 0x648157de5d81daa67c476971, limb1: 0x2845a24d3190c4fecbde2fa4, limb2: 0x72f924eac3a8d2c228a8b082, limb3: 0x13673079ebcf601a5d5fae92, }, }, G2Line { r0a0: u384 { limb0: 0x2d6310ed50636162786d1b75, limb1: 0x5cac54906e73bae3b4359998, limb2: 0xbd428c9c44f9a83980265ddd, limb3: 0x2fc21e36ad4d0da0a00add9, }, r0a1: u384 { limb0: 0x80e8a4f63bb295c1f909c9f8, limb1: 0x76045a0b6f715c18ef69c37a, limb2: 0x8e2d6c8495568d22744ab3f3, limb3: 0x2b70c4ecc512e5b7a263f20, }, r1a0: u384 { limb0: 0x74f73dffd0f8db5344a575d1, limb1: 0x8e6d3150c6b50fb0f30b8d42, limb2: 0x1caf7885c868849e8e700707, limb3: 0x130fa43ef7b10a6b7c72a4af, }, r1a1: u384 { limb0: 0x1cd953b2a94a0b0460118689, limb1: 0x5c361d5ff78164edfe007331, limb2: 0x61315250d28c9b99d174dab6, limb3: 0x252277581829378760d4033, }, }, G2Line { r0a0: u384 { limb0: 0xf48b3d5c545dde843e9509d9, limb1: 0xec087b6dc32d167683bbc860, limb2: 0xecfa5e40ea40c9452bcaf0c9, limb3: 0x1040fd02b48b11b85d471c89, }, r0a1: u384 { limb0: 0x4fcc4443458e23010506f346, limb1: 0x6c4848e26b5d994f5bc3e72e, limb2: 0xfe88288f9e882ff4e9a375b9, limb3: 0x164597b0f78ad70a7b4bc1be, }, r1a0: u384 { limb0: 0x755828105bc1eba4198f7dd7, limb1: 0x6eae5a58a81935ddf455bd6, limb2: 0x6240aac72233651a6dfb3db5, limb3: 0xb4497d73d44dff355f96fc3, }, r1a1: u384 { limb0: 0xe9e516384450aed995eae178, limb1: 0xb13053f758b857a1479bef06, limb2: 0xb18ba337770920df12a72642, limb3: 0x121a732dec2700ebe307b235, }, }, G2Line { r0a0: u384 { limb0: 0xf313b674fee5c83040549617, limb1: 0x864b49b4b96dc11dcb31a6b2, limb2: 0x7afa88358fa085d4db1d9e6f, limb3: 0x10b916005fc2476498beed41, }, r0a1: u384 { limb0: 0xa5f1bacd2bc2f38d4e1a34d, limb1: 0x45d1d4d76b0b03b8d7da125b, limb2: 0x74a0ba0ae49290dd243bdc61, limb3: 0x185827ff9e3c833ac46e1e16, }, r1a0: u384 { limb0: 0xffae650825626bdffd8ed424, limb1: 0x126a57866536ac1d0b34b17b, limb2: 0x517ba3e3b50188d25dc23dc8, limb3: 0x1276dc74f1b2a7173802ff0f, }, r1a1: u384 { limb0: 0xa73951cadbaab9fe957c0fed, limb1: 0xa232a5178de78c8f681635e5, limb2: 0x30adf5deb8ee4da1fcc053b2, limb3: 0xd840dfc0aae66492a176a2e, }, }, G2Line { r0a0: u384 { limb0: 0xbec850cf3cae0ae894430855, limb1: 0x471169ffbfc02b7ee8b53c48, limb2: 0xf24c8150520d1054b6fc8530, limb3: 0x2627371854bd7fa799b809f, }, r0a1: u384 { limb0: 0xbdc8b09d11fbd315b7aa7980, limb1: 0x2f2fcf7338f1747f606b3a25, limb2: 0x27fb2eb96b07297a58fabfe6, limb3: 0x111b90bded70421c6543f89a, }, r1a0: u384 { limb0: 0xfdb1c553460611b281b896a7, limb1: 0x9e417f1af210f3a016ad9c83, limb2: 0x5908b9614188572d05b39a67, limb3: 0x16f5fc4c7d6ca25189a5da6, }, r1a1: u384 { limb0: 0xf515c6bd1b302886cb3cb5fb, limb1: 0x6357aa94ce3eecae26fc87a3, limb2: 0x66f86efa4a89422f8fa42672, limb3: 0x131a1613cd2ea3831b5cdcfe, }, }, G2Line { r0a0: u384 { limb0: 0x3ce32e18da41a2016fbf41b1, limb1: 0xda3e0d01e0bbb52a301585cf, limb2: 0xaf508b2248a1fe6ffc5d18d0, limb3: 0x1274aa625858db0bb675b3bf, }, r0a1: u384 { limb0: 0x4cbc0be362614fff6f6d4898, limb1: 0xdf8603dfa938bc22d0aa98e, limb2: 0xaf3784151a3a1a7585c177cf, limb3: 0xcd9b76612194b440cbd9c67, }, r1a0: u384 { limb0: 0x93de5b0d4ce155335ed8a6ff, limb1: 0x9dc6c21cddb15edd7f401cc4, limb2: 0x2601d5b08d144c3608181a8f, limb3: 0x872d334a6e81b6937f7580f, }, r1a1: u384 { limb0: 0xa90ea56305b0b457ffd7dfd9, limb1: 0x3fd7486324393fe073a67746, limb2: 0x22aaac8be67217e0e49366ff, limb3: 0xdc78f4f3c40b0984ec316e, }, }, G2Line { r0a0: u384 { limb0: 0x32410e4bdcd6030081ee0117, limb1: 0x9711111255797439f6866cb6, limb2: 0x8a1650034dda2434eadb9c77, limb3: 0x13f6a882a25deeaef4bbe62d, }, r0a1: u384 { limb0: 0xcc47fc627ad939824b8320f1, limb1: 0x3f1cb2532c6db9d1abc737e4, limb2: 0x4883356c3277f2df6283a2ab, limb3: 0x11e02397acfe9612a98a14f9, }, r1a0: u384 { limb0: 0x1588bd50c2f4f5c5ebbe62bd, limb1: 0x87a259e41ba48ccad1a07c48, limb2: 0xb22b4f666071523b8a172736, limb3: 0x96f9baf300ca7342721fd8e, }, r1a1: u384 { limb0: 0xf0c2d5fba2f156c3f26673ef, limb1: 0x71558132bb663713ad20817f, limb2: 0xb07619c97cbceccc4c0fb256, limb3: 0x13ed85faec0618c507d395a1, }, }, G2Line { r0a0: u384 { limb0: 0x35a50965750c7716c237772d, limb1: 0xe96b0c22d39fbbbe7f55d6bc, limb2: 0x40864a9ec51fc3fceddf7498, limb3: 0x232f7c41bf2d0ca9a4a6560, }, r0a1: u384 { limb0: 0xebd5d6880bc93e525c5283bd, limb1: 0x911e6efcf7cc8f0983f3a122, limb2: 0xeb2d53ffa24eaa0527809305, limb3: 0x126b7366a9ba4cdc1648b905, }, r1a0: u384 { limb0: 0xd7789f5359bb3bd4b674719b, limb1: 0xecaa3bff242dc5a63ed57279, limb2: 0x85e8faaf82c119cc47bdfe4d, limb3: 0x1042198c5b912b48953f03ee, }, r1a1: u384 { limb0: 0x52c926fe4d73775c8dcc54b9, limb1: 0x56410c723b730b245d2639ae, limb2: 0xe6b9bc3d2b2a15155d82e48f, limb3: 0x11772d7a9fa0b3530a88bfa, }, }, G2Line { r0a0: u384 { limb0: 0x62a31df1dfbbec432d547277, limb1: 0xafbad67ab615bf2d350b1688, limb2: 0x1f5843187c62f057fcb3c202, limb3: 0x2cd9ff07b37d472a54a7189, }, r0a1: u384 { limb0: 0xfd689866343571218470d805, limb1: 0x94b9219861e6e367cfd9d27b, limb2: 0x5937c015c497d2c235302c66, limb3: 0xfdf7276579ca6fa0076c8a9, }, r1a0: u384 { limb0: 0xcc39c0acfde5d2338853dbb6, limb1: 0x4d33a9fe71565a4342df96fd, limb2: 0xf1c085869a954cb4994a6d7a, limb3: 0x993491756f5c241452a5dd8, }, r1a1: u384 { limb0: 0x59049f9dae7a7044e79531ad, limb1: 0x1b01d078a53d321ef18d7b49, limb2: 0x81acaa38fb3196010e594ce1, limb3: 0x12c347a131f6b1191d4b563f, }, }, G2Line { r0a0: u384 { limb0: 0x90b1d3aaedd7ae3ae5ef62ec, limb1: 0x9c2237332a12d63f617991e0, limb2: 0x88f758a89df448c1dd45282d, limb3: 0x3c52126f27d2dd758ab0770, }, r0a1: u384 { limb0: 0x8bf85f2a28b11ffbcc48f29d, limb1: 0xb79fc38b4398e2af5a4ac3f4, limb2: 0x877b0d7e053d12f91fa49c91, limb3: 0x19ee364564c01cbdf0bd4257, }, r1a0: u384 { limb0: 0xfbe824718174525ae3cbf681, limb1: 0xb434f93ab3f012e5c5fab625, limb2: 0xfaaa0bb2878017e90fb07ac6, limb3: 0x616944a1484a78b2946360a, }, r1a1: u384 { limb0: 0x84c489abf936bfadd293c732, limb1: 0xaa7ca8e76a07f14d2a712245, limb2: 0xef338c44111cd8f2538f16e0, limb3: 0x2f06c9cef716ae3e32a1bd1, }, }, G2Line { r0a0: u384 { limb0: 0xa31fe2909d2e70ef0eed8a97, limb1: 0x7cd66cae105a1a65a0469bb5, limb2: 0x57c0d04a99e4fdd24818d48d, limb3: 0xf143a86d061937bfc43197a, }, r0a1: u384 { limb0: 0xef3417fc2e604cb1afd28f22, limb1: 0xc03449a2171f0466673fe015, limb2: 0xb9e650989501677fe2bf4b6c, limb3: 0x1a45a939634b50313d5b551, }, r1a0: u384 { limb0: 0xc7a854c7a9f5c64683ace9b0, limb1: 0xc0d2319347b83f932d66c058, limb2: 0x7a12cc7266442611728385d8, limb3: 0xfc3c7544bdb8ce9030892a9, }, r1a1: u384 { limb0: 0x9adf18823ca540f0e6bf7f36, limb1: 0xa5a5ea82ecc4affdc735afce, limb2: 0x84c176ba131be177ad7d141b, limb3: 0xbb932dd6da950ed35007f86, }, }, G2Line { r0a0: u384 { limb0: 0x49369971c3fc33245bb7b9cb, limb1: 0xce9896e5addb637375420be1, limb2: 0x7d4c97a8e9d64c41cf2dffa1, limb3: 0x287b1e39767a3c2d102a825, }, r0a1: u384 { limb0: 0x6f6e6c10c2da68b535025ac5, limb1: 0x9b6128f5e000427659557e1, limb2: 0xba4e1537236425a49e10a76b, limb3: 0xdccc3a8b263abdc2c1112a2, }, r1a0: u384 { limb0: 0xf0f26fb9d99f34211c52ec21, limb1: 0xb091a74cf88bb5563ee29bd1, limb2: 0xb1a3c0e6479e60ec2bf5e312, limb3: 0x6ea612bf02bd6df77f7af9a, }, r1a1: u384 { limb0: 0x773745b51d209d3643ac70f3, limb1: 0xb837418d0188d5d41911d38c, limb2: 0xae750841ca68ec61dd2fac9a, limb3: 0x9b4aec971d45aee69870aa6, }, }, G2Line { r0a0: u384 { limb0: 0x34fc38759fef61effd88d5eb, limb1: 0x145b73bdd49f8b9841131ec5, limb2: 0x5b032e13495cad2de8fc511d, limb3: 0x14a5c34da7fefd80bfd917bf, }, r0a1: u384 { limb0: 0x7289910ae15b593b5d0fe9ef, limb1: 0x321eb1200e5c9d49765ad730, limb2: 0x7fbf84b5e04d1a87072209ff, limb3: 0x120c78a1a8543136a69d721f, }, r1a0: u384 { limb0: 0x7b91d266ea9310fa2b902bf3, limb1: 0xc3c6f100aa36d1105c43d928, limb2: 0xcd92532364b0794355ab6fc5, limb3: 0x3e83fd62b6b3aecc9dee3cb, }, r1a1: u384 { limb0: 0xdbfa72bf64242d0e4130bab1, limb1: 0xbba2b4aa87acd80bda65c1ff, limb2: 0x53c0d1281064d6d42f3ca6e5, limb3: 0x7538323c443e424ba2139a2, }, }, G2Line { r0a0: u384 { limb0: 0x9658e94dff575b044fd12535, limb1: 0x9e633711f24267eeff96b84c, limb2: 0xd09be055097f3f4285b74b29, limb3: 0xeba32ca0fdf04b16e700d02, }, r0a1: u384 { limb0: 0xdac31a776bf2f2a7eb8d07b1, limb1: 0x99ff3b68fe53867aeee330e, limb2: 0xfc016b0e19f5a9dafe6150af, limb3: 0x1853f7c388088cef95618ee7, }, r1a0: u384 { limb0: 0x25afd3c9e43a6bd85d8f83da, limb1: 0x6636bcf8f7c4ffb03262b3ad, limb2: 0xfab2ea835f15ffa64289aee0, limb3: 0x19a40512a2bc92b145d4a15f, }, r1a1: u384 { limb0: 0x457e5f8262a3fb1f68e2ee64, limb1: 0x2c8e29f8273ba32411548171, limb2: 0x6b7ec622d4cf5c7605c02c7f, limb3: 0x16d592d1bda21aa16790c116, }, }, G2Line { r0a0: u384 { limb0: 0x418f88c2ec9095086a11212, limb1: 0x9bbb92abebe257d874d88812, limb2: 0xef0f443e07ba39689c54a875, limb3: 0x15190f05d2854f4f23244780, }, r0a1: u384 { limb0: 0x73562c95a5ced7285783ea44, limb1: 0xebc6a876c7f862dd940990a4, limb2: 0x806ab610b9ba3826809481f9, limb3: 0xd738e6b4748294d2ef71b46, }, r1a0: u384 { limb0: 0x2f88f9cb9b43366fca45401c, limb1: 0x981bc3797c4e9ed2343a8465, limb2: 0x10f951c9ceda971d01120a50, limb3: 0x197593f4646346745cba98ce, }, r1a1: u384 { limb0: 0x6352dd6f1f276ebd12e36438, limb1: 0xbc94e96354513cd65cbb7831, limb2: 0x63f9809778a9e5a3a14bd9c6, limb3: 0x12399967b752e1ae762754b4, }, }, G2Line { r0a0: u384 { limb0: 0x1393c1940f25665663934fc8, limb1: 0xea7d0b2339e762ea1d7417bc, limb2: 0x38e8c939bcfc597914fa0bc4, limb3: 0x10e5f821e745ef290f773399, }, r0a1: u384 { limb0: 0x3fb68057499c7406aa1ace48, limb1: 0x41257c93b17f3e38108e6f37, limb2: 0x6e97eb8687dab2a2a640c57f, limb3: 0x14df29fafe098da44c7fd33, }, r1a0: u384 { limb0: 0x59456b76c2b8257a9ee80887, limb1: 0xb92657cb2cd74cfb0e2e2af8, limb2: 0x74366a9ca17b733790bace94, limb3: 0x18a62b6be3320f12ef9121ed, }, r1a1: u384 { limb0: 0xd05f8b04255c124be737ddfb, limb1: 0xcaf73bd136dd217b40f1b669, limb2: 0xda811888424a2ec800ca2f97, limb3: 0x157c5205e1188acb79fbef71, }, }, G2Line { r0a0: u384 { limb0: 0x8b374dcb293da523769439f3, limb1: 0x2fa24f2a394fefc00be6551e, limb2: 0x5b56b235703e81f9581fb812, limb3: 0xa510fba0090ee3f2da90e03, }, r0a1: u384 { limb0: 0x4c287e611b512a841d227d6c, limb1: 0xb311b662d2c9a4106ab64890, limb2: 0x3f74ad8a1056c7ee37f181a, limb3: 0x387ccbb5fd44513ebd1364a, }, r1a0: u384 { limb0: 0x238250f751fe359ea48e6612, limb1: 0x48d78fe66c255cda27a7797a, limb2: 0x270135167f0b9910bbe997c5, limb3: 0x13f053dabc35bea274b5dac0, }, r1a1: u384 { limb0: 0xb7350395e2c37b4d15be0abf, limb1: 0x578ec20dcde4919879af4f9, limb2: 0xebdad8f8ae78030cf33a9584, limb3: 0x214f9275dbd80c3514f9cad, }, }, G2Line { r0a0: u384 { limb0: 0x54863ab6d50bc9ff4874b6e6, limb1: 0x937c0d4560eae2eee4b7ce1e, limb2: 0x337805ebca15d19f40277942, limb3: 0x10ff70c91cbb8869a0659bf2, }, r0a1: u384 { limb0: 0x7b3cfe640c29faece9a85e53, limb1: 0xcddbe3decddda92adfd9039a, limb2: 0x42f145b0f85554ee195ae299, limb3: 0x1951ff3142b9a208e5e69e59, }, r1a0: u384 { limb0: 0x94a7ee20add6c18015e26733, limb1: 0xd0f2a6ab15fefff1caa7366a, limb2: 0x9c055a1d93c3f27e46d0b3da, limb3: 0x60f554e35125b7f5d7aac8b, }, r1a1: u384 { limb0: 0xd92e5b001022ee7874cbebeb, limb1: 0x4aed0fd23b92aebc139f77db, limb2: 0xd2bca1fe5ad39a274c9dfeec, limb3: 0xcfab0e5b8e8d7c7a8765b15, }, }, G2Line { r0a0: u384 { limb0: 0x13f5a17e28b8aeda870323da, limb1: 0x337d2b7adfbf1364a8611853, limb2: 0xa8dd9b2b05f3350a8569d92c, limb3: 0xddc998d17c49e6381aa6256, }, r0a1: u384 { limb0: 0xde207fd9d271001c6efb9576, limb1: 0x6c856b0c104190652dfdd937, limb2: 0x80feca357961f12e69a3a05d, limb3: 0x2595adff1024c23c63dec73, }, r1a0: u384 { limb0: 0xd7040b7ee5b45a1422495780, limb1: 0x13f3e065ea119be3775d97ed, limb2: 0xeecf7ac81f371c5e390f85ec, limb3: 0x1047da85dc9dba631527134c, }, r1a1: u384 { limb0: 0x7017211aee3c7150478d96ee, limb1: 0x8c7564a3a9ef6bfd96289765, limb2: 0x6df1f2b21ce6b08419e214c, limb3: 0xa4e778d427042d100d7ae3e, }, }, G2Line { r0a0: u384 { limb0: 0x21805f763874894483dc214c, limb1: 0x2c02b4ccd505fbbb8d8bd064, limb2: 0xe32a1465866e01898f1f3b14, limb3: 0x15d2f6b35415870ddc7054f2, }, r0a1: u384 { limb0: 0xf6749d4bc9865ee9e261110a, limb1: 0x81c4e72fdd8802ef73ab15ef, limb2: 0xb89ca852d2ba8b3590cd5301, limb3: 0x183abed5b2d1d128fa596426, }, r1a0: u384 { limb0: 0xf71ebb04aab85e83aec862c0, limb1: 0xf473b3e5a56fd96d60f8a264, limb2: 0x3e4b66f8493911a4a00afa1e, limb3: 0x12be1dc90541ee9c7cb4fa59, }, r1a1: u384 { limb0: 0xba5f7a9ccd0748c2fa4e54c8, limb1: 0x1640f7800984bafe7fa1a76d, limb2: 0x48e76aab062b19911f92bcd, limb3: 0x72cecd9e5c7c437cbbc1e4a, }, }, G2Line { r0a0: u384 { limb0: 0xdf166caff55624c628e9c39d, limb1: 0x375583a43ba61cf4f2aadb7, limb2: 0xf0d0784be04235e91497af3a, limb3: 0x144cf709d68b63a9939bcd7f, }, r0a1: u384 { limb0: 0x9b47104ec1159ac61ff360a, limb1: 0xfa833b0d43df77cd013e21cb, limb2: 0xcad1fb67c8db4e6c39d8bd59, limb3: 0x10e847c87beb83adb8a5feb, }, r1a0: u384 { limb0: 0xb1fd17f45af8d452043abc61, limb1: 0xcae758a71dc8e5d49f433bca, limb2: 0xf97f2de839369b6c827e9eeb, limb3: 0x2e3050a5cb33641e4b5f617, }, r1a1: u384 { limb0: 0x71666e0e514a3e5352f26d8a, limb1: 0x46273d30eb76103fb756a8fe, limb2: 0x8bdb306ed674d669da0ac3b8, limb3: 0xf6c2f57d5d282ff86ccd9a6, }, }, G2Line { r0a0: u384 { limb0: 0x1f078a90be515d55a39025dd, limb1: 0xa69e73a9a0f2894ad32c28d8, limb2: 0x406d92af351a91a43b294110, limb3: 0xab36c91eeeaabb24820b390, }, r0a1: u384 { limb0: 0x873b5a72e8ea0e7d255b970a, limb1: 0xf64973cbec18695bfc945495, limb2: 0x533e34319846e866ad7ddd36, limb3: 0x1029fa62305109a4d20176b9, }, r1a0: u384 { limb0: 0x429cba0cb76b0c492577722a, limb1: 0x771bc089fee5e3632dbffa1a, limb2: 0xa7c64b6f38e532de16959d0d, limb3: 0xf38b71fb4269dd2e038223a, }, r1a1: u384 { limb0: 0xddc796c5033428b0b8111c4f, limb1: 0x60ad337fb316c52ef8de0b21, limb2: 0x951808daa18d3ec520bd6279, limb3: 0x3455cf600b5f6c549f38f14, }, }, G2Line { r0a0: u384 { limb0: 0x3c9e33deec176793b8c762c5, limb1: 0xcdd0e402436d39a6117033db, limb2: 0x30c585d12e787c8be912d406, limb3: 0xf298f9a8c4459a08f210e47, }, r0a1: u384 { limb0: 0x170c6ad3a877e65fe91c69db, limb1: 0xa41f211a3763ffcdb9eb1e9b, limb2: 0xb84a114f23f1978d9ebd06a4, limb3: 0x60bac8f5945907e791dfcda, }, r1a0: u384 { limb0: 0x354e5a1eec75069b04ac0541, limb1: 0x91be6e4159dcb28c19a4e3e2, limb2: 0xfd452118a540f6f88b01e089, limb3: 0x12b2b6a5dda55d157e1f8b, }, r1a1: u384 { limb0: 0xe47f5498f54067daeffa00b8, limb1: 0xbccfe6edd60b7ef921ce57a1, limb2: 0xd917099499398bfacccaba05, limb3: 0xbb67b42bd655fa485081a90, }, }, G2Line { r0a0: u384 { limb0: 0x8deb02d48f2ee3be7ae899ed, limb1: 0x4b66f01a40c86e83fded6847, limb2: 0x9c08bb4fe0abcaefc921a40, limb3: 0x8bda1d762c986632aeaca1e, }, r0a1: u384 { limb0: 0x72be08cacb4795f5ddd8497f, limb1: 0xfaddee2a55b5154b35e26966, limb2: 0x7c67f5884f061f219cb8ff55, limb3: 0x6d4fe75b0153bdec12dba82, }, r1a0: u384 { limb0: 0xc235fffbfefdf8e9ef54d2bc, limb1: 0x6581ebd151a1e73c53b163cb, limb2: 0xf60ffd0dd3608c742fba7902, limb3: 0xe9437af3be8b35cbae1f171, }, r1a1: u384 { limb0: 0xdb98cff46b3033365ae5b731, limb1: 0x19f3ec2adf9517d4533cdf7c, limb2: 0xa60fbca3376090bf8f17f4b9, limb3: 0x169bff5211482ee5e64f50ae, }, }, G2Line { r0a0: u384 { limb0: 0x2dac7db08633bccae086b486, limb1: 0x89b8e12695d31ec21d7bc0f0, limb2: 0xb6b895ef82cd3e31f6f0cc3f, limb3: 0x2785eedc1bcd70ba4ebd308, }, r0a1: u384 { limb0: 0x8a0217a58db8f5cb124445ec, limb1: 0xae392df0fd76493bd2ded923, limb2: 0x73881097a5c82a443ee9e130, limb3: 0x145337977ac0a11a17f3345, }, r1a0: u384 { limb0: 0x82060ee8ae4f3cb6db6ad231, limb1: 0x90e8ec63f2e39f1218f21605, limb2: 0x4ff00df2e2cc6da42f40ca0b, limb3: 0x96b5a0e4cf36d245f2a2213, }, r1a1: u384 { limb0: 0x183bfac0d6d302cda44cc090, limb1: 0xb8bab9cdf785cfc48b82cde3, limb2: 0x2b99c1ff7e44f0267431fbc2, limb3: 0x9253c3d3a7875099bb7116b, }, }, G2Line { r0a0: u384 { limb0: 0x89eec90cedffb5559d9f7cd6, limb1: 0x838145c7842da8419fcaba0e, limb2: 0xa322ce58631513aed92ce0df, limb3: 0x5a79df85b0a96adf6e2dab8, }, r0a1: u384 { limb0: 0xf36133a552f9211634fe2feb, limb1: 0x712f911d31ea73387b467687, limb2: 0xfb3d98acbbe375c161f9d2a8, limb3: 0x11b7c924610a8268c34b8259, }, r1a0: u384 { limb0: 0x50e7cae27aa8b11d0d2bfe43, limb1: 0xf88979ed0a59e7daa98895c9, limb2: 0xdf00ec512e87f5862a699c22, limb3: 0xcad7fd28c40cc541a820fe4, }, r1a1: u384 { limb0: 0x936b0157ffd80fabb32930f9, limb1: 0xc6bffa14bca99e467c671b75, limb2: 0x609410c23cb1d2ce4e5e9242, limb3: 0x5aeec94c1d7d2fb257ce4f7, }, }, G2Line { r0a0: u384 { limb0: 0xc41d067c71069998cf8843d1, limb1: 0xb14da36d1c97315bd61ba35, limb2: 0x8aa0d451828d59a5f72d09dd, limb3: 0x6032c39bd848710bcb60e49, }, r0a1: u384 { limb0: 0xed46bd973c771a1b363a7d4c, limb1: 0xf133793366e26684ef2f32b3, limb2: 0x12ff177280c137134c3f25c4, limb3: 0x127cf801e7f2dd085ba1a751, }, r1a0: u384 { limb0: 0xdc817a66a6c7d907bae27871, limb1: 0x7ba4fed3737fceac11ec899b, limb2: 0x90e031e803e3d6cbe2868427, limb3: 0x12ea6c6e770758121970dfd, }, r1a1: u384 { limb0: 0x70cc7c1f3299456ae1e20184, limb1: 0xb40d30be5118767fa201dfec, limb2: 0xccc12af1cb317ea89224e94a, limb3: 0xdab488f3ca14571f8255bf5, }, }, G2Line { r0a0: u384 { limb0: 0xa05df784a5a683833d2e1464, limb1: 0x544aef13d7757e76ac4a6a2c, limb2: 0x337b308d7d37a5e715e2c6a7, limb3: 0x1971f0b4a71e609b35922e78, }, r0a1: u384 { limb0: 0x9afd8643829c2749745e919d, limb1: 0x3fe5162dcc95efeedb645acb, limb2: 0x771a45a92c45f43bb070b7fd, limb3: 0x503aa962b29d72a5d9f6cf2, }, r1a0: u384 { limb0: 0x8e80c44f884a20fe7070ea42, limb1: 0x78c55b9104f9b5b599cf0cf7, limb2: 0x6aa9312bbcf5dad8ca58d47c, limb3: 0xa42156c0b189a8b23065b2c, }, r1a1: u384 { limb0: 0x507ea5597266a41fa17c0e3e, limb1: 0x61ca6c9ff959cacbd2e0502f, limb2: 0xe921d3d10d8336d32c718050, limb3: 0x15bd96df3160aaf601255ae2, }, }, G2Line { r0a0: u384 { limb0: 0x5e4b2d8014672689adf74c5e, limb1: 0xa727aa7b0714aee11ce04e22, limb2: 0x2b8081578ba7e36449332477, limb3: 0x136517c5cbf60d7fd893217d, }, r0a1: u384 { limb0: 0x1e6b6dce21e6c8fbc8c3059, limb1: 0xd40eaed17a285915e6dd5328, limb2: 0x84bb3dc7596ffeecac6c017c, limb3: 0xe145b9da771dcb825de00b8, }, r1a0: u384 { limb0: 0x73b866053fe5eda748e0cabb, limb1: 0x402fac191721abee446bc895, limb2: 0x4b03c3a6b6268986ca81d9ac, limb3: 0x6b4c9aac6eed89d9f0a6121, }, r1a1: u384 { limb0: 0x2af39075f96b16e132587e7, limb1: 0x13bcad0b04e3dd70f7c5f56, limb2: 0xda8eba78634610f509f07778, limb3: 0x110e70b034d243106e204662, }, }, G2Line { r0a0: u384 { limb0: 0xbb42fc51b2f0d50a3d7a6796, limb1: 0xfcbc9d2df3136cbd1a372ac4, limb2: 0xea313e60d4b8240679b0175e, limb3: 0x1657a4b33e1400ef6e296282, }, r0a1: u384 { limb0: 0xaf91b402ecc6cf1a742796cf, limb1: 0xab44b72c1fc2f89b5eaa0345, limb2: 0x9f6a20404576105e15a4930c, limb3: 0x10992497f5f8bf4451121322, }, r1a0: u384 { limb0: 0xd9355bfe72d92c6a0950eafd, limb1: 0x89de0bfbfd06c9911cb2d6fb, limb2: 0xe2092d1e99ab65a7a33ba1cd, limb3: 0x1c317a68eeef4d833e396de, }, r1a1: u384 { limb0: 0x631d3efa10e591b7ebcb8dbc, limb1: 0x6a4a0815d19cf339e4663ba9, limb2: 0xe2fb7d9878d26c7c97299a01, limb3: 0x4c4dc455aad226b744ebdd4, }, }, G2Line { r0a0: u384 { limb0: 0x656bbea0391d35835dc24b51, limb1: 0x3d5a46760e1d5b5be2d560bb, limb2: 0x8ab4befe76903930bf03b6cc, limb3: 0xde3dfb225e924a4e1dd60a6, }, r0a1: u384 { limb0: 0xbf76b6d5dcffe10f806efc9c, limb1: 0x89c3bf595b72110cd64c7807, limb2: 0xad1b9df71cca0f160ddb2c6a, limb3: 0xe1ae8d30b5cac8a9a485f95, }, r1a0: u384 { limb0: 0xfcef3581dc552b239364bb18, limb1: 0x1785b2ccd39c6ea191ba4ad7, limb2: 0xb26676ceebabd25d429a9122, limb3: 0x20c29df3088771981853b6e, }, r1a1: u384 { limb0: 0xe1d699d9ac66a9464fbdc974, limb1: 0xd53858123c2581584cab83ef, limb2: 0x8e59c936d52fd331132acf92, limb3: 0x42a7ceaf3c3cc116eb1a41a, }, }, G2Line { r0a0: u384 { limb0: 0xe51e461db9c85f42519fea6, limb1: 0x234a9695204bd44f55ea4de6, limb2: 0xc8d34c6b4580edfc55e023b1, limb3: 0x16691c1bdf57ba041abb3d97, }, r0a1: u384 { limb0: 0xa81022cb0b3b0c523ae71819, limb1: 0x47f7df16fff0877b21676607, limb2: 0xdee4fe1d3c64b3fedec56326, limb3: 0xcfbf5ccb325675b1a3becef, }, r1a0: u384 { limb0: 0x6d42b9d9e765f92b0817551, limb1: 0x352adc09dd7760a5f4208a1e, limb2: 0x5397846e3fff77f500da6dbc, limb3: 0xe26d685c4365e342109d0ba, }, r1a1: u384 { limb0: 0x9bc1051782d84793806d878b, limb1: 0x1642edf27f040ad57feb6f89, limb2: 0x11a5d3523a88580869d28ca2, limb3: 0xd22ff50c5a9bd729115a889, }, }, G2Line { r0a0: u384 { limb0: 0x1974fc785431be1e90b76cf1, limb1: 0x5523616ad31f45b5acbb41f0, limb2: 0x4db84aa19ed0d09fdfd72a39, limb3: 0x4bee7a1546e6a96b8c65312, }, r0a1: u384 { limb0: 0x1fff8fc0e33c70b81adce7d, limb1: 0x5503816c20ef23cb62024c84, limb2: 0x1d58103be6d430043405b3ef, limb3: 0x107fb3faa9b9af026c550cd7, }, r1a0: u384 { limb0: 0xed84d2bc957cddd0e6e4ad25, limb1: 0x1800d9d9c9bdeeb05cada676, limb2: 0x6bc88f0ada5bbcfb48988f0b, limb3: 0x177faefe6e97b317f26d47c2, }, r1a1: u384 { limb0: 0xe487165be396059ee48112a2, limb1: 0x57fae5a95d9b810b370239e, limb2: 0x9959f70caa80a4c337de8fdf, limb3: 0x744e597435d3317bd2d3cee, }, }, G2Line { r0a0: u384 { limb0: 0x30d36077b6d0262e218111c1, limb1: 0xc74774ca1af660eaed4d8329, limb2: 0x6448cecfde912a7d2029dbc, limb3: 0xe743528ce0c94e1a76f2f60, }, r0a1: u384 { limb0: 0xe1f8a574cee0dad622d6fead, limb1: 0xcd681358d077b827cc148be2, limb2: 0xc8fb346621601764fa91b40a, limb3: 0x133d21c52017365921207d63, }, r1a0: u384 { limb0: 0x5cb088f57e1e3f6a62571b37, limb1: 0x4089cdf0fb67a7b1d79838b3, limb2: 0x62401a2e57abb0652e0fee81, limb3: 0xcc83c46ac38241e1c33aca2, }, r1a1: u384 { limb0: 0xfd94f04ec006d63b4825ecfa, limb1: 0x96ef1f9240c32fdc393b81e2, limb2: 0x6d46c2685a1a1c50e84c8b24, limb3: 0x1528bf72bee83f2c80884dd2, }, }, G2Line { r0a0: u384 { limb0: 0xf1675d98caa0e86774bc637, limb1: 0x601f3b88148d94ab340ad0d7, limb2: 0x38be976c910e6b1d767b2184, limb3: 0x3e03977cdee4d24405e656d, }, r0a1: u384 { limb0: 0xe1a8086a67acf571c0af95cf, limb1: 0x1eda39e1440a2e311c78ae41, limb2: 0x3bacbf4628f20f0353dc2a71, limb3: 0x12bbfc96114eb5f664d2f89c, }, r1a0: u384 { limb0: 0x301cba8607d6747f45a6ac34, limb1: 0xe736ba1686c2c9873cf10893, limb2: 0xa0aa0fae3c9f8cab4f768c4, limb3: 0x15a9608ffbe07f61ed31b819, }, r1a1: u384 { limb0: 0x89bef3c7071d9d77cfc34894, limb1: 0xb492c854b864451bd42b6f8d, limb2: 0x90d08dba8607ae67e7ffe8f2, limb3: 0x3df2c581fd145f7d0c76401, }, }, G2Line { r0a0: u384 { limb0: 0x8f8bf2310745715d8e60675, limb1: 0xe7983befc104f7bd4886ad3a, limb2: 0xd6b5d3a93563b2103c29cec1, limb3: 0x1902b1e10713c8d95829b014, }, r0a1: u384 { limb0: 0x392c934ad398e9471a2a3e6f, limb1: 0xc81c0dc22eff61dca36ea27f, limb2: 0x4605027ef09f9b7d03fcc1c2, limb3: 0x142c2105c569b0e7aee457f1, }, r1a0: u384 { limb0: 0x86fc12d4ddb34349e58e0713, limb1: 0x9a132e3db41060771e480d9f, limb2: 0x6e00f3b7a9cbdf6ba01f3694, limb3: 0xf3f4843686de973131d67ee, }, r1a1: u384 { limb0: 0xf7b6328930ed21138fcd8f92, limb1: 0x354fd9f9ec8f828426279c4c, limb2: 0x3df938a725947d029e1edf6f, limb3: 0x1143440784148d84b5ae0952, }, }, G2Line { r0a0: u384 { limb0: 0x186d09647ff0bba5d26ed28e, limb1: 0x623c8f44caa6f18538e106b2, limb2: 0x6ee87df7083a561d754b41d6, limb3: 0x8a8a90d75fab6a61d0509a1, }, r0a1: u384 { limb0: 0x6adbd952167baf9618d42d4f, limb1: 0x321d82100a434b5583df9a0, limb2: 0x24f6e8a30ab01f51c1f581b1, limb3: 0x3fbeeb4073b163b3a283631, }, r1a0: u384 { limb0: 0x3cbe311d6bab02eedeee8686, limb1: 0xa954bca129b7bbed1f638f3e, limb2: 0x256baa5a7b0901b1c39a2060, limb3: 0xd44f3bb3b9ac2f6050e276, }, r1a1: u384 { limb0: 0xbc701985313f4fd60a02502a, limb1: 0x879d4ed1464b95cc93907b88, limb2: 0x95c12c7e24be41f785419bee, limb3: 0x8e3562c02b89b593503d443, }, }, G2Line { r0a0: u384 { limb0: 0x8acd42eff277e12a1c665cd8, limb1: 0xc8dd9dfb56ea54ca5c9d26e6, limb2: 0x803b24ff12a9cd7524a26b87, limb3: 0x27b1b3c904791e3fa942dcd, }, r0a1: u384 { limb0: 0x7a880435688221e820d4164e, limb1: 0x9754d630e027f9217dd0fba6, limb2: 0xee6cbf6da2000115b0cca0d8, limb3: 0x162f5c264c2d2728aaa1f652, }, r1a0: u384 { limb0: 0x314a0d54f7db63dcd3d6c0e0, limb1: 0x793c614f53a688375ca369e8, limb2: 0x296c4ccd5f785e294abeb492, limb3: 0x20d58632925a8df2d3d48bd, }, r1a1: u384 { limb0: 0x82c581e26e2e612aceaca787, limb1: 0xe02d73cc25449c92dfd7f088, limb2: 0x732270a5ec065ff678b3666e, limb3: 0x17e813008da019a1fab544c, }, }, G2Line { r0a0: u384 { limb0: 0x272c29aa11aed8e43cc6141d, limb1: 0x71ace08186410aa341601ace, limb2: 0xb9a9aa2f3050b27084ffbc22, limb3: 0xcbec164f80a90014457abc4, }, r0a1: u384 { limb0: 0x84565ab9fffcd0062808ee35, limb1: 0xef87eb1f3b09214ee1c6bcf7, limb2: 0x1ac3de549632346de8521585, limb3: 0x302f3ebfd6939b7a5be7a5, }, r1a0: u384 { limb0: 0x9615b19b27deb1c37635e038, limb1: 0x71949c2c6bb3f43004b870d9, limb2: 0x1795921be995a5d68845a590, limb3: 0x17c275a0f8dd134ff6e6ab1e, }, r1a1: u384 { limb0: 0x8b1d7f267653c440de637b02, limb1: 0x3a5e2de261d557e994157f3c, limb2: 0x35f5a3781402a1227675829f, limb3: 0x18c4e5eb81e38ada34f8ab67, }, }, G2Line { r0a0: u384 { limb0: 0x4a074239eac7dc93b8113ddd, limb1: 0x64192efc9a09299ad173b34e, limb2: 0x3e86b7943ceda2cc678e6719, limb3: 0x13a3cf500109646aac4d69e3, }, r0a1: u384 { limb0: 0x89c20af4b5a694d4d6d9d45d, limb1: 0x76071bd0d45623a4cfe9647, limb2: 0xbaeda04445ec73fe1fd859d6, limb3: 0x12f734fc3463dc7adb90dccb, }, r1a0: u384 { limb0: 0xa12928a1d5d6408853a05ae7, limb1: 0xa8fc3f1aa38f3d6554357b31, limb2: 0xbb5e7127cb9669d52daff069, limb3: 0x525a9e909f39cb2e32cb71a, }, r1a1: u384 { limb0: 0x2bf733d3a23d1446da39720e, limb1: 0x69c363f32dc0ed3a22acc728, limb2: 0x3eb64a364ee2cb63222dc046, limb3: 0x1e78c4855ad25e4e08ba1eb, }, }, G2Line { r0a0: u384 { limb0: 0x7116c638544720919ba1141f, limb1: 0x38d3486b5a4d7d2b1cc7a81, limb2: 0x9b0ce563be273a4ed3481a1d, limb3: 0x373ac3e05382518aa76323c, }, r0a1: u384 { limb0: 0xf667b74f8f4e3f484c4ae08b, limb1: 0x2206d95b2b7a7ca7e2aecdc2, limb2: 0x64ca11d3eb4448d39f8e7009, limb3: 0x2585d7ccdfb9e2246f24d05, }, r1a0: u384 { limb0: 0xf03edce3835efea888f2bd2a, limb1: 0x992d9468044e686d3d07216d, limb2: 0x98d781d756b874d0bd7a7451, limb3: 0xe44d0964d322c8cb9cbcf18, }, r1a1: u384 { limb0: 0x6fc3182d07a38a7f0fca843b, limb1: 0x551df1a531a45713e9e8c1aa, limb2: 0xde4e92d1f38c48c0f9587009, limb3: 0x1072fb6b01d871f8150e2fb1, }, }, G2Line { r0a0: u384 { limb0: 0x1ed40e3c2cfcc055cd4958d6, limb1: 0xd1453a4587d6c2ca2341043e, limb2: 0xf79c2172e21b91ba79a5ea2d, limb3: 0x65c82633f9d4d20c07f6ad4, }, r0a1: u384 { limb0: 0xc8398341fc07277f183c17d5, limb1: 0x86bc2e62775af5eae61d9aa, limb2: 0x403276e7635ed1cd34473d3d, limb3: 0x18a18bd0be954bbff600c7c1, }, r1a0: u384 { limb0: 0x8b17fbda26b7133b0600c51e, limb1: 0x48147de60df80344b55d8fb8, limb2: 0xa0e018e36cfa14e2a39e57fe, limb3: 0x70aed2d475ad180844d7587, }, r1a1: u384 { limb0: 0xf1d8e65deba9a3605b50946b, limb1: 0x3677c5769dea1762e0a3a25d, limb2: 0x5d4399ba6a9742e8f2aa1928, limb3: 0x2d57160d6c66d1e0c2f0c0, }, }, G2Line { r0a0: u384 { limb0: 0x8477b2ca00b2aeca6e32a3c2, limb1: 0xc6f29b461233bd0ebc643442, limb2: 0x84af7efb348b61e615b2333d, limb3: 0x1533c0ad4f3bdc8c8d26cea4, }, r0a1: u384 { limb0: 0xc1c642702f7caf535b06e0f2, limb1: 0xe5245d45b1adaa7c89f0db9c, limb2: 0xfdaf6276d41ae24845843a0a, limb3: 0xb6f912c27d4179d1cb5e992, }, r1a0: u384 { limb0: 0x7338a41d8d41ba28d96db37b, limb1: 0x51a10fe0cfd8c6d045839897, limb2: 0xdb73279246e7073586ebb14, limb3: 0x180e0a6b2de7e0540e582783, }, r1a1: u384 { limb0: 0x4d8f0878c0af851ea8d0cff5, limb1: 0xe24443b84e3d452bac74c32f, limb2: 0x4e4f3f08f29048e7d791c0, limb3: 0x107fba05f68214c93b0d00d3, }, }, G2Line { r0a0: u384 { limb0: 0xe6882416d7bc0be138e4eeb2, limb1: 0x1ffc8c27a2046327376e250, limb2: 0xf96a7955cf8a3345e89477c1, limb3: 0x31ae02e34d7d21957899dbe, }, r0a1: u384 { limb0: 0x148232d34a8da37b7adc99a7, limb1: 0xd0a0095db108dfd24e92848f, limb2: 0x89fb49e1a36591a6b189f964, limb3: 0x1900bee131450e7d7a914ea4, }, r1a0: u384 { limb0: 0x97018429f16d24bc1e7f8af0, limb1: 0x1f68aaf8291a6decfb708b43, limb2: 0x1f700e88b537bffef39907e4, limb3: 0x9cb633f82c6e595f1785e5e, }, r1a1: u384 { limb0: 0xd8d9d3a12a0dd7b129ffda0, limb1: 0x7a94e9da792505fe4fbdb0da, limb2: 0xf16eaac379266d5a4210e839, limb3: 0xc24197c1ceaa3dd3de58b21, }, }, G2Line { r0a0: u384 { limb0: 0x3e3cc1b08d8d1fda723658bb, limb1: 0x1cf952b752fb9ef1e82f5094, limb2: 0xcd52c2cfed361eab29f2026, limb3: 0x59d1335947ab746801c0537, }, r0a1: u384 { limb0: 0x34f187a454a321b866885648, limb1: 0x26461aa4e35660f0dce08465, limb2: 0x7540c65dddc34d56adebea12, limb3: 0x1417edadd46132f1155c1f, }, r1a0: u384 { limb0: 0x716255bec8b8a867659f8ec1, limb1: 0x728375c8a3a566ce58f184ab, limb2: 0xf3c4e74ba75e0f526ebea027, limb3: 0x130e1557b595456ac14c74b, }, r1a1: u384 { limb0: 0x956347dad0355d5e6b5af3c4, limb1: 0xef43db3b9c396c251944db86, limb2: 0x6ee505074759d3fe9876542d, limb3: 0x4097c38f547306cd4f3b276, }, }, G2Line { r0a0: u384 { limb0: 0x6231a3597b09b6d5fda5c712, limb1: 0x3f3bd12ca9ef48ef6199a7f4, limb2: 0x6883383b5a445ca79fc407ee, limb3: 0x141accc8970ace156fe95a36, }, r0a1: u384 { limb0: 0xe0c805067330b20430c585c8, limb1: 0x8ff3e0c3028ea8f24ee6fb30, limb2: 0xa368fc9a21efabd91ace37d9, limb3: 0x18b35a8fd65ba4cbd734a0ee, }, r1a0: u384 { limb0: 0xf4e1f73d2ed7ccded6c419de, limb1: 0xf379cd28811f89aeea7aee67, limb2: 0x727c64c0e714ab6ea82391e8, limb3: 0xf454aa00efef9460f382b49, }, r1a1: u384 { limb0: 0x952793660f1fe4300657022a, limb1: 0xe8fa6c2b1aa542384940d1ec, limb2: 0x5a1f19c729b4b225b1501e31, limb3: 0xa5b1272b68436f9433d112f, }, }, G2Line { r0a0: u384 { limb0: 0x990dd2f78bf76d63c8a1579d, limb1: 0x324c14f20ab56d3dc480653d, limb2: 0x21bbedea5a0b817b568c1995, limb3: 0x127c86bb9f80d6468a5a0787, }, r0a1: u384 { limb0: 0x5b66a3f1affc43619038b84d, limb1: 0xd61e9a91a30e1c4606116992, limb2: 0x8a3bb65c955e0ff1e2749335, limb3: 0x18094793f6e93a6fbbe88c78, }, r1a0: u384 { limb0: 0xf16deb47fddb712ce639140, limb1: 0x6ce4afbf91551ea8bf91543e, limb2: 0x1576ceb94ed691afe037a797, limb3: 0x89f45701d0959ae8869f16, }, r1a1: u384 { limb0: 0xd1d903d8caaa0032b50eabbb, limb1: 0x4f16d1eedd24943ef87959c4, limb2: 0xc2729c35e8f641933cc2b080, limb3: 0x12a0bc7d5fef85e9964e5dd, }, }, G2Line { r0a0: u384 { limb0: 0x7ee6a5f3ce669de80b52ba42, limb1: 0xa7d66db543d3c6a626f79dea, limb2: 0x135c684f9ac0e0a34315e044, limb3: 0xaaafef3c4298542248b3a58, }, r0a1: u384 { limb0: 0xe0b267ea1f8e8dc2b83d62e, limb1: 0xabac56946f0699334fa765e6, limb2: 0xee0060a937926e9b6d6adb90, limb3: 0x13d96385b510deff2f4d1d32, }, r1a0: u384 { limb0: 0x1271c3349afe8fbfd4d7ee54, limb1: 0xc4df31a1a0ae89c5728ee819, limb2: 0xa0de891b771af1ba8a67f8db, limb3: 0xf69200f56879e50a92ecd6e, }, r1a1: u384 { limb0: 0x3260bde1e37542b8b8465e10, limb1: 0x7c3420aa9e48318a6606ee07, limb2: 0x126b5e1ded963ffbb6adb4e2, limb3: 0x18d1f7ae28741bb590bb39a6, }, }, G2Line { r0a0: u384 { limb0: 0x269fe662be1952669b367916, limb1: 0x444dc78864cd61df2552517c, limb2: 0x28be12e26f4b32f0652ab84d, limb3: 0x19a30428e98bf9b0a2c79ff7, }, r0a1: u384 { limb0: 0x21df9689e2fe058639581b7d, limb1: 0x12a80b9a201864b6f46ebab1, limb2: 0xd09d200c1fe4354e796b9b48, limb3: 0x6bec03fbfbca091da930b62, }, r1a0: u384 { limb0: 0x28188947a47cf18c9d40e8da, limb1: 0x7bcabfacb5b01ab3628aaff2, limb2: 0x76a7b58adfbb924378e8220d, limb3: 0x89da3830e68cf0f2c7a55ed, }, r1a1: u384 { limb0: 0x16d6797ce84cbee04811bb4f, limb1: 0xeec191427178e5b1c9c7dbb2, limb2: 0xe59d267e616c978d17fd98d0, limb3: 0xd301c0973bbf180e6fc4134, }, }, G2Line { r0a0: u384 { limb0: 0x95db0469c00d953ee476c048, limb1: 0xa412df73ae5febbec296a5fb, limb2: 0x16b9fdec9340c8f3aefa561c, limb3: 0xfc955cb99bde258d8760197, }, r0a1: u384 { limb0: 0x83c7d7a804031b10c844d0cb, limb1: 0xfb88180286d20648b40806c0, limb2: 0x31368cfad1bcb8ef19b9d382, limb3: 0x8fd02881a5331dfb0922a3b, }, r1a0: u384 { limb0: 0x2513b777e720406cfba171f4, limb1: 0x9d9da48be5e4bae3bd3e8c84, limb2: 0x8d75547712fc62f6f651762d, limb3: 0x5f0f52ede58374df52c0643, }, r1a1: u384 { limb0: 0x13d6b4aa8d9a46d5720e1b74, limb1: 0x5b93ebf4000945ce87c9dcf1, limb2: 0xffe34203a0c826e972d857bd, limb3: 0x1870c14dc5ad5a661156fd61, }, }, G2Line { r0a0: u384 { limb0: 0x13a8138427c111d431036213, limb1: 0xc177e00de5b7215a863e9c0, limb2: 0x97a203171990cbbb0e5ab2e5, limb3: 0x8a0a3f26b8d3bcefb78c724, }, r0a1: u384 { limb0: 0x9d1740ea8f388b69c175f646, limb1: 0xbf6f5d96d616051ae3572d4, limb2: 0x9bc542122a140e5461a88c52, limb3: 0x510159112f2d409afcdecdf, }, r1a0: u384 { limb0: 0xf6335307702c1329032a46bc, limb1: 0xf975ad40eedeac981c916520, limb2: 0xc367b7993d6243a4984974d2, limb3: 0x54b5cdb776381cc145be730, }, r1a1: u384 { limb0: 0x29d26ba47472791689263678, limb1: 0x6f7b1f34b002954f5506eae0, limb2: 0x2f9ecd635cd4d5f6e7f08ab7, limb3: 0xd547c2cb31b79da87b93b04, }, }, G2Line { r0a0: u384 { limb0: 0x31f476324f857ca9daa71d3f, limb1: 0x5b64b681867d0f5505b9f139, limb2: 0xb89e509fc5decaef9cb221f1, limb3: 0x5b8f08ef767ca4cf5f36622, }, r0a1: u384 { limb0: 0x8f44b24a23750c8f0fa6270d, limb1: 0x554f99004f5b1f2a21b02609, limb2: 0x3710c6daa7cac50a8ca6de8, limb3: 0xa3b4aea7c32a8fc4d9a662b, }, r1a0: u384 { limb0: 0x93f0fbf4c4d931c3a733902b, limb1: 0x3a038220fa2da3a7087689cd, limb2: 0x5bc677d1583979bda5797f17, limb3: 0x11996e8759ccb1bda7042160, }, r1a1: u384 { limb0: 0x1ee1d1db6f033786016fd46, limb1: 0x2d4942546551a7b5afb1ee11, limb2: 0x5c0b006bc71d7e27359f5f02, limb3: 0x35c97a7e460075f4d915117, }, }, G2Line { r0a0: u384 { limb0: 0x7a6d6eabfb0034d1a702f683, limb1: 0x7d0e2455c9a35664ebcfb47b, limb2: 0x32cbd0245fbdf1e7636a4217, limb3: 0x19c09fc88eb1b1a3d18741a8, }, r0a1: u384 { limb0: 0x533b4770f929349a30d265d1, limb1: 0x2a2bd55c9677f8858218607, limb2: 0xfdc3daccd568a7f098f996b7, limb3: 0xda029aea876b619425b5a9b, }, r1a0: u384 { limb0: 0xe5b827de5b5a8d55c3f84090, limb1: 0xd80c5371f403010197d4f105, limb2: 0xe577025df13d2871b00bc8dc, limb3: 0x16414390859fdc9dba5dbd65, }, r1a1: u384 { limb0: 0xaa1076a6910862d36bbb1a19, limb1: 0xcd4b0a7e1356a4c6467e7843, limb2: 0x88f035fb25750a88b3937cc0, limb3: 0x92167f2a0715c9e9d74c7a9, }, }, G2Line { r0a0: u384 { limb0: 0x813cf8d46ec722731cb2e790, limb1: 0x3ae401e3a2c43950dd3e14a5, limb2: 0x7f1e2595a7bf3cb9644dc3a2, limb3: 0x9a64184b516425353d3342b, }, r0a1: u384 { limb0: 0x1be4ad4c913b7f23ef8afc45, limb1: 0x4b9c5ee3da9ae172d5612c39, limb2: 0x362a12402d4cd3c50c5a5bc1, limb3: 0xaf426e78303a8cf5a43520e, }, r1a0: u384 { limb0: 0x1a1fbd631479e96bc85c9b39, limb1: 0x755e043e52470551dc47fa77, limb2: 0x2fd80441adcf386b79dfadce, limb3: 0x15cdd2f908202480bb0f56fb, }, r1a1: u384 { limb0: 0x493a7937f956ab6960bb1a74, limb1: 0xec402c0b38b6cc4d5094363, limb2: 0x3d52461743a5dfe63d2e7a33, limb3: 0x92150697852cb2d08c3521b, }, }, G2Line { r0a0: u384 { limb0: 0xb34c26f3f693dd84f80a2827, limb1: 0x3a5bad99a295b14daa58eaf3, limb2: 0x294c30f60635aa35b08a22d6, limb3: 0x7b4843ff0c2694d4281b82b, }, r0a1: u384 { limb0: 0xf601429d3a9a15e87d6c6a9c, limb1: 0x9ad779f2762b9393eaba8c6e, limb2: 0x887c88bf51c15df955aac60, limb3: 0x858d73304a934b9aae3be02, }, r1a0: u384 { limb0: 0xb8b2d232a5e28fd350087039, limb1: 0x72a42652def490cf16cc1d6d, limb2: 0x225b45d85fa199dffd69ffd0, limb3: 0x11aab051de4d3b03d63fd9c6, }, r1a1: u384 { limb0: 0xe973e3abcfc1a8b46e3622d1, limb1: 0x1da2831de5c376f4315553ec, limb2: 0xbceaf398ecd71f612f704c01, limb3: 0x3bdf213c9512ed9e6961848, }, }, G2Line { r0a0: u384 { limb0: 0x3c31209a4897e0f66a542078, limb1: 0xaca6cfb5457ca1adc99138fe, limb2: 0x72bf4739ae7b1a8652c823a2, limb3: 0xdd9144f8c45e6091a6714d7, }, r0a1: u384 { limb0: 0xc8942e9d5abaeec4938f2308, limb1: 0x30ff4bdf679bd4a2b87fa34c, limb2: 0x21acf101ca7ff6cd9129e67a, limb3: 0xda6ef8b0ede3a09d1a5c00b, }, r1a0: u384 { limb0: 0x2c5038a7eeaa757c15d205e, limb1: 0xe9d28bbd2c18d52e1b9024f2, limb2: 0x959d4240dbbc46a2c5bbb5b, limb3: 0x9cd8b42cb440fc77607b954, }, r1a1: u384 { limb0: 0xd35f7d36be1bf213c01aba98, limb1: 0x655bc51b43c6394245778244, limb2: 0xd626d74e22844c1a8e2cc950, limb3: 0x28c4b291b492ca43266277d, }, }, G2Line { r0a0: u384 { limb0: 0xde11ef8702d534dcae97f4d1, limb1: 0xb7e1313492ee7c957d7c08b1, limb2: 0x94685a26959aaaf145f46c06, limb3: 0xbd77d859d62dfada48bdca9, }, r0a1: u384 { limb0: 0xd50523e1ef354e160696adcb, limb1: 0x4ae2fa0fb50e711c936a065f, limb2: 0xaeb883cf2c5a9ad32ce94798, limb3: 0x6cc3bf5598846ca25341da5, }, r1a0: u384 { limb0: 0xcc6dd0380e5398c3264b9bbc, limb1: 0xdfe3641a4969d3d49718e00e, limb2: 0xd7b59b3160334de5eacebeed, limb3: 0x35c0cdaf5e759016dec572e, }, r1a1: u384 { limb0: 0xc2d2dbc06bdb8ff543ebcea0, limb1: 0xea4c9e638f95e42cea458d85, limb2: 0x9aa2cb9c51ba076dd941d7c7, limb3: 0x8052da2e0dd2dec3a95d9f2, }, }, G2Line { r0a0: u384 { limb0: 0xabb764ac8036eb503e39861f, limb1: 0x22e8fa738389a0378352e2d2, limb2: 0xab10fb803ca53103ce99fc28, limb3: 0x831ad8b93ffed9245877b44, }, r0a1: u384 { limb0: 0xf721e83ab0eb9fa28b5d9349, limb1: 0x71c18646ef565689efc545c0, limb2: 0x590ec1d6f3abfbdb3f9f8b0d, limb3: 0x17707d0e47e7a1044a4fd9c6, }, r1a0: u384 { limb0: 0x16d0a838f9b0fc16504dd27, limb1: 0x5ad87ce7ad12ae830368b776, limb2: 0x62490899b4f397e09c44152f, limb3: 0x15528a389da1580f43d95ade, }, r1a1: u384 { limb0: 0xa715dcbb03bc2faac9d64bc7, limb1: 0xbd9b3ab159baa441a3ff56ad, limb2: 0x257f876f487a6dab4fa17c81, limb3: 0xecfcaeb005ca1b7f92bf862, }, }, G2Line { r0a0: u384 { limb0: 0x84bef2ae28f4fb378ec1eeb6, limb1: 0x1189e835406150f7fbe047cd, limb2: 0x8d7fa056d5bff703455219b9, limb3: 0x17b55cffc9c559918a9ffbca, }, r0a1: u384 { limb0: 0xbcd55d1a045238c11947faae, limb1: 0xfddd35b7f062ea97fa82612f, limb2: 0x73dbd0a4863e8634338c4c3, limb3: 0xfd6b167fe3d1476b5da9dfe, }, r1a0: u384 { limb0: 0xbcf99cf3772f639491c9a228, limb1: 0x1f8ca8645ecbeb98bb9ff5ae, limb2: 0x82f62cc92f240ff8bc4fca5, limb3: 0x6b4211c4d1b18ea0c5a5e4c, }, r1a1: u384 { limb0: 0xe60a226e7c7d83e720ce3f23, limb1: 0xe357a6f93412eb508cc034c3, limb2: 0x532ca9a4ca346dd2e0913328, limb3: 0xae125a2c4b74ea5caf9317f, }, }, G2Line { r0a0: u384 { limb0: 0x9ea0eee8a358bedf9bb306c6, limb1: 0x27cbc0c2d576ed81b376df3a, limb2: 0x284d8131858da400101172fe, limb3: 0x6f01c5d4ccee41765be5896, }, r0a1: u384 { limb0: 0xc9cca6ba98560a0a14f61b11, limb1: 0xd4eef97cebdd8ef2a73732a, limb2: 0x64b605444de34fc8002b43cd, limb3: 0x16cb65875e7c30e951cccd8, }, r1a0: u384 { limb0: 0x1202ef010c0cded8ddce59aa, limb1: 0x7268537e1c67cc008bb9ba6a, limb2: 0x34ab03d803da94a85a2a1f91, limb3: 0xffbdd8dbe035b9aa6fa5cba, }, r1a1: u384 { limb0: 0x624339d3f2fb4299150fea00, limb1: 0xf8999090b0c3b02d48cde0a1, limb2: 0xb9c9ee775d38075030edfed8, limb3: 0x4962ca75250846083ca0a66, }, }, G2Line { r0a0: u384 { limb0: 0x5a6db269a838098829edba6d, limb1: 0x67230edf9666dd5326fdd901, limb2: 0x4faf83c8878cbaa298052a07, limb3: 0x112b346339b3c5902a46ac8, }, r0a1: u384 { limb0: 0x21277b8157638b119fcc31e4, limb1: 0x58677ee1ee7f46f77ebafdd, limb2: 0xd954201344c8653340beaf5, limb3: 0x1540de56dfb2f896102f649f, }, r1a0: u384 { limb0: 0x7542a639e101035b31163743, limb1: 0x16d5957af1c5d36ad26581ce, limb2: 0xa42f7046622fa8f1537fcbb9, limb3: 0x3173bcc714029b198352b15, }, r1a1: u384 { limb0: 0xb1d8c4b69f2dd6531b317ba0, limb1: 0xecfb946f37008a59694b6c1d, limb2: 0x45a75c06aee99914e7ea7797, limb3: 0x5a1008ab79da1541477a2bd, }, }, G2Line { r0a0: u384 { limb0: 0x9c4a4d3c7bb2576aeac0337b, limb1: 0x8b9250b2bed82359a757e126, limb2: 0x2d7dd2e4d3d0945ac3d9cb88, limb3: 0xa0bad126c265d46d51689b7, }, r0a1: u384 { limb0: 0xf65a98dff64d2a0fc947454f, limb1: 0xa50259b7484098611c2cb9fd, limb2: 0x5a51b1c4671888accdca74af, limb3: 0x133a4335f59c0259f1a3ff19, }, r1a0: u384 { limb0: 0xdde88be699f516d731c68610, limb1: 0xce004ded1806688e8e7c458a, limb2: 0x932f3c1c8e56d4b9f19eb7e9, limb3: 0x124f291f47d76455477102fe, }, r1a1: u384 { limb0: 0xa97c633609d63d754d4a2692, limb1: 0x3c5ba5df2f9bb1cdcfb55e97, limb2: 0x19aa69b7f4751e5e39459c7e, limb3: 0x3f5780b2dcaccad745e1d15, }, }, G2Line { r0a0: u384 { limb0: 0x6b810adc509554ded3ef3b95, limb1: 0x95284597042e1ecd0726081e, limb2: 0x120e66352bbc0746f23c9af9, limb3: 0x14407db8291afdcc6767f0d6, }, r0a1: u384 { limb0: 0x9736d40090182b75e8148929, limb1: 0x3b4a1acb2265372a95f14a8b, limb2: 0x688f573f43a95022122a84f8, limb3: 0x6ee3cecdb39eeaa72352bea, }, r1a0: u384 { limb0: 0x86a4ae1d79fed79fda04bb3e, limb1: 0xdbe8a4d79312a8b7bca3137, limb2: 0xb002871665722703632ca373, limb3: 0x6dad85068365251a3070c46, }, r1a1: u384 { limb0: 0xe811cc9a481723566332af5c, limb1: 0x5995536393d8252711fa1719, limb2: 0x4b8d398526d9d7803e5e35d0, limb3: 0x9c613e006352ea575d7f10c, }, }, G2Line { r0a0: u384 { limb0: 0xdd3830612c58d544327ca0f0, limb1: 0x1142cd575c788d8d19a24ba9, limb2: 0x45ea7f0421cb2dd4e5b4ed7b, limb3: 0xfb69c6a2cbfc9dfb9b01427, }, r0a1: u384 { limb0: 0x875ab3c75d3a4e43d10b2503, limb1: 0xf7cee1313a095fe9e31b7072, limb2: 0xe85be88d689d67e6e9835268, limb3: 0x10635d3a601f92ab21801ab8, }, r1a0: u384 { limb0: 0x9eb9ef4ae7e0f7713d97450c, limb1: 0x8dfc81038830750d79da8b26, limb2: 0xc17475937901d8cadba451ca, limb3: 0x6f9f723841ae3e1a88c34f4, }, r1a1: u384 { limb0: 0x71e84e872166781dda7182bc, limb1: 0x9dde7059d6c002a7f762da96, limb2: 0x2b9353ca4892a788389ca0fd, limb3: 0xd413552182113308d1bf463, }, }, G2Line { r0a0: u384 { limb0: 0x44db5f922ec99665b26634e5, limb1: 0xac41b74d5483c597704eaaac, limb2: 0x550e72e8ac0309c515e3799, limb3: 0x1952ab876a19a0773ce3962, }, r0a1: u384 { limb0: 0xf574202e10923244624559cb, limb1: 0xc0f8318a3d481320d441ef0a, limb2: 0xde67bbfe352326e4915e12b3, limb3: 0x961a1762c6fe08878fc48ab, }, r1a0: u384 { limb0: 0xf69e2ab32451ecc443146d68, limb1: 0x2d1bd9f71192795f2433de38, limb2: 0x32cd169947d915590eceb231, limb3: 0x5a7c915f44cbc571061b333, }, r1a1: u384 { limb0: 0x448a7247da14616d79b68e7e, limb1: 0xec3301200e41cfe8a1eca52c, limb2: 0xdadc3af8cfa96ac54608c965, limb3: 0x17fe1a7c7ee57b63cc748535, }, }, G2Line { r0a0: u384 { limb0: 0xcc1f58585e1d7b5bd45c4c1f, limb1: 0x745110cbba12e028cd54150c, limb2: 0x2ce6cbed2508c5d828082677, limb3: 0x28a36f542a28f6997a811fc, }, r0a1: u384 { limb0: 0x541d567dcc7fbea97520cd94, limb1: 0x65d407bf06f076619981fe2e, limb2: 0xd583e9bfd967becef21bf75f, limb3: 0xac2c40f46751f043fe2833b, }, r1a0: u384 { limb0: 0x92c58aae975c98038f79305, limb1: 0x7d1ce0079826b8902c5d46d3, limb2: 0xf99d7ba5cb12513a32fb5eec, limb3: 0x7cc8363ce478f6d8f184c26, }, r1a1: u384 { limb0: 0x8397c406c8e69df7b1cea699, limb1: 0x4a543e21f4fd830fab085fcf, limb2: 0x25a94f2ddc7a920fd1361d5b, limb3: 0x16a2f7057acf7d7df785557d, }, }, G2Line { r0a0: u384 { limb0: 0xd795ec8c32c9ebd1bf9f74d6, limb1: 0x7f585c54a0e235a718bb6927, limb2: 0xdbb23b0ee0a160580fc4c61d, limb3: 0x18cc0bda792f81e333e2b374, }, r0a1: u384 { limb0: 0xc46a2a7c259ebd088ce10740, limb1: 0xe6a830b64d605c010a76076e, limb2: 0xb1a119cfe08d1632021fc196, limb3: 0xb9b519b9c1bb0eb41e2ce4e, }, r1a0: u384 { limb0: 0x345bf7846f464a931457dfde, limb1: 0xc8fc5238edd2d7260a066bbf, limb2: 0x2523af32173eba316f128bd7, limb3: 0x32a68698a38598bd123d251, }, r1a1: u384 { limb0: 0x2224558439f158cbcf42da7c, limb1: 0x387b507d6f0320a9a2e44e6f, limb2: 0xb29b2f37752d24d3fed9a8ea, limb3: 0x168e24551680276e33346c1b, }, }, G2Line { r0a0: u384 { limb0: 0xf8c9e8b4405badfa94226735, limb1: 0xe35370c03766b0439ba9bc0c, limb2: 0xefd8d2d0063990aea5570748, limb3: 0x125e8f976f7536a2e85ea3cf, }, r0a1: u384 { limb0: 0x8f2d3d1bd687824c71ce27fa, limb1: 0xd5946aef2f36a4cb42aee9b, limb2: 0xce15918bb8dbd901b9685864, limb3: 0xc0299d504b8b7bb5ff23b7f, }, r1a0: u384 { limb0: 0x9a63e8f36e7127f93b5fab1e, limb1: 0x52d9ab603e72bca7b8fc5284, limb2: 0x8f734c44e7ba040f4a30952b, limb3: 0x1478222c63826742286f720, }, r1a1: u384 { limb0: 0x57fd0e62234f512c20e97da2, limb1: 0x876dd44c8838d26ecfad71b0, limb2: 0x9c591e15eb6492035916a674, limb3: 0x13830268b58006ff03775156, }, }, G2Line { r0a0: u384 { limb0: 0xb2877a8ff989a065c386a33e, limb1: 0x13d2429550f4e9f72e2e2cec, limb2: 0xbcf8cd1b0cbec3511e153d8a, limb3: 0xcd008fe35f202ded141f6f0, }, r0a1: u384 { limb0: 0xcc3d9d00a942a5ab992f4ac8, limb1: 0xf81023268498efbea7a1843f, limb2: 0x561d9f10a4eaf5e417d1ccda, limb3: 0x10ab00007abd04f36507cb22, }, r1a0: u384 { limb0: 0x9b8b1ab2cc4aee0c67d4c474, limb1: 0x9840dfe76cc0dc415191c5c, limb2: 0x91cbd5473dbc72261d57d8f6, limb3: 0xd47a27fa79ac6ddfb973c4b, }, r1a1: u384 { limb0: 0x827056816dae6b0f4c06657b, limb1: 0x8112aa8d965353f81dd65054, limb2: 0x8c1382e0bed39f3950578dc3, limb3: 0x135456e60f547393ecee80e, }, }, G2Line { r0a0: u384 { limb0: 0x5863cf017f4f31c0054a3612, limb1: 0x5a1ef8d1d2c315dd8bc6212, limb2: 0xe33ed175b6d1a029dda7c9aa, limb3: 0x182115eb42220d34f08e487d, }, r0a1: u384 { limb0: 0xb90bfad204b39a3cbcac7b4, limb1: 0x73b8d9e10bc6022a0994e39a, limb2: 0x7f5daebc21a409de8913242d, limb3: 0xfc2db9cb25d08faf7c832, }, r1a0: u384 { limb0: 0x26d0221ad0d5ae39d7d33a8, limb1: 0xbae8e0d584ccaa52aeab179, limb2: 0x59de453ae38340185debc29f, limb3: 0xc5a021a1d3134aa31cb39ed, }, r1a1: u384 { limb0: 0x7472a64d3fccc64229059166, limb1: 0x361a6711e93f12f3d1cb0320, limb2: 0x6bf192bb96314516f10b7449, limb3: 0xcaf028327c4bc3f8af13387, }, }, G2Line { r0a0: u384 { limb0: 0x9fbb07d0355fee63ff3debeb, limb1: 0x91896030dd9d9080099fb74, limb2: 0x26da14875766e45e86646226, limb3: 0x107179b36f3ec30ed0344ffb, }, r0a1: u384 { limb0: 0x749309e43489bf57b329ac54, limb1: 0x88c5acfe2820fe65ec92ff05, limb2: 0xef5d77580008d71e56cfd7c2, limb3: 0x8347995c6bfa9cbd21c0831, }, r1a0: u384 { limb0: 0x3348804de4e8c0987c6280f3, limb1: 0xcfc8dd305e856fb4f80eda08, limb2: 0xb7eda62f28c44f9b55da9809, limb3: 0x6c1e0756ca916fe6d0f1453, }, r1a1: u384 { limb0: 0xecb36186ff6abf0ccb74caa, limb1: 0xee68730c0709c13875980d99, limb2: 0xdfb34758f87146c601b8e8df, limb3: 0x1179b833f2d1129d7dd26307, }, }, G2Line { r0a0: u384 { limb0: 0xd53473f5ac7b5e99de412ea4, limb1: 0xf6c216059e7a2a6b1a09d23c, limb2: 0x5de59d8956f5a84da299063e, limb3: 0x159ff2806d40ff15099d5204, }, r0a1: u384 { limb0: 0xfdccb0d7c9716c23df3ced8f, limb1: 0x14e4ca22ebdbc559a20177, limb2: 0x5b60b25f325eb68e4cbd45d, limb3: 0x69a7d5ac5a38cce584e0b0f, }, r1a0: u384 { limb0: 0x903bac45b703185c327d9669, limb1: 0xe524dad4130c677c5a3b0f31, limb2: 0x11518ec180b31fd2f516e8b1, limb3: 0x29448dd80ce3c75c8b0d685, }, r1a1: u384 { limb0: 0x134286c732f95142935a2a98, limb1: 0xc493200ca6cd119550bafdd3, limb2: 0x7008cba4cae32054d22edea4, limb3: 0x15da5ffa50e36869f0f2ac43, }, }, G2Line { r0a0: u384 { limb0: 0x699dddd0ce8eee874e7798d1, limb1: 0x5c3572d1a0e33576c5f95af6, limb2: 0x71a239e87768b6642c64c2d5, limb3: 0x193a4a988589350e15df6be4, }, r0a1: u384 { limb0: 0xa05a3143096e2700aaf1ae18, limb1: 0xdaee1baed61a3dc26f6005fc, limb2: 0xed7d52756e553a1adfd2b266, limb3: 0x1839757d13d8b73a5c23e083, }, r1a0: u384 { limb0: 0x94b6d2f8ced6ba40bea83ca, limb1: 0xfe22edaeb3c651a53c333676, limb2: 0xb7a1df3d2dcc34ad47dfbaf0, limb3: 0x81b823ad97ad3e98bcb93c8, }, r1a1: u384 { limb0: 0xef6f0e083b916a69a01c63e9, limb1: 0x8aedc8c1d6429b10db98ac62, limb2: 0xe6834dcabb9dccf40dbf34db, limb3: 0x15b856909992c27268ce5b40, }, }, G2Line { r0a0: u384 { limb0: 0x5edf9450f71e9104f1c374e9, limb1: 0xcfd112580006deba5077fd8a, limb2: 0x289c80bcf75761bc030bda9d, limb3: 0x142182d337d4bdd0a9dc0152, }, r0a1: u384 { limb0: 0xe3f1affdcbbd3809a6881f8e, limb1: 0x55f40359611c687f96c91dbe, limb2: 0xb90435a9e7260873c34a0cd4, limb3: 0x113f465ca312058e0cd541d6, }, r1a0: u384 { limb0: 0x85f3a8c5d4928087f1ef8229, limb1: 0x62e48188da4d79f1a88f24ba, limb2: 0x58691c7e87e7ecb6e855a469, limb3: 0x25bacfd7256f159ca3eb0e5, }, r1a1: u384 { limb0: 0xfc830160c50a4b17a2dde63b, limb1: 0x1bf46813a25e8e58ff928d53, limb2: 0xe63b74e85e2032c28808627d, limb3: 0x9e218f143196d00fadb36c6, }, }, G2Line { r0a0: u384 { limb0: 0x4f15d4ea3546d4dd322abb1, limb1: 0x46cffe5c562a996207d85447, limb2: 0x127c1b2c8327db270f3fc752, limb3: 0x5b1382a51a78623e84b171c, }, r0a1: u384 { limb0: 0x8dbc701d130e40ed21a9da2c, limb1: 0xadd725634588d75b24dd8c16, limb2: 0x80337504d4d5f8357c9b9979, limb3: 0x9c23058c09980827954110a, }, r1a0: u384 { limb0: 0xe1d3592b03a3a53ee550de4a, limb1: 0x34de8376defeb78769a53926, limb2: 0x4a37ac77bdc2eb742a373cf1, limb3: 0x152f467c23ef37b4010839bf, }, r1a1: u384 { limb0: 0xcb4d3b94794186d8bfb77400, limb1: 0x7fd7599edba1d571d111a2d0, limb2: 0x3a0264b8ec2890555793b361, limb3: 0x17f63a07328a47cdf24b7754, }, }, G2Line { r0a0: u384 { limb0: 0x2639eca99f5b1f6e6d095faa, limb1: 0x7322d2c5cd33e33d6fd2e0ca, limb2: 0x1c7bca0054ff60c0db156676, limb3: 0x10933118bcf1940615957a6c, }, r0a1: u384 { limb0: 0x43e0d74cf14359d83cc60326, limb1: 0x3d49af8c8914a76283667614, limb2: 0xc090bf9a071c2af83528b361, limb3: 0x14ef91f0b47d2bf1313ba159, }, r1a0: u384 { limb0: 0xe45466ca7f8b6f5920570127, limb1: 0x1554654b09b57871c2ba8a9b, limb2: 0xf66b8bb3a005585c18db86b0, limb3: 0xd28c63f8635e2ca59c7dc45, }, r1a1: u384 { limb0: 0xdc559ff81728e932b3c79d12, limb1: 0xec4893ef0a2c9367a4d736d6, limb2: 0x8b0a21bcded904e222dbf14b, limb3: 0x8c51553f23145b85ca33fbe, }, }, G2Line { r0a0: u384 { limb0: 0xf5058204afaec6f2464c5a13, limb1: 0x515da6bfc23ebf6f53f6b55b, limb2: 0xe97a11e04bb36b2059446a4c, limb3: 0x12fc97a16defdc7adc7476f9, }, r0a1: u384 { limb0: 0x980b9772f15c2485344735fc, limb1: 0xe64c7342b28e77acf36d03da, limb2: 0xefd0a557cd8909bc5c9e7baf, limb3: 0xbee5b30e2c4af8e16809197, }, r1a0: u384 { limb0: 0x5fe61e5a5909262f7cad99ed, limb1: 0xccf8e0ad8f3dba3dbeb8ec43, limb2: 0x10378ef14243abc565883a1b, limb3: 0x209e28d5551008fd8c913d6, }, r1a1: u384 { limb0: 0x31bad5bcd6808dcb2e85caf, limb1: 0xd37414833b060119d1f174a3, limb2: 0xd4f73e90a51a3acc4ae687fd, limb3: 0x18dc062c90db3cd1d20a7de1, }, }, G2Line { r0a0: u384 { limb0: 0x7a3deb7872768f839060087e, limb1: 0xae5017af4c09ed67c5c2e525, limb2: 0xef2bbb3e118498031e2471f, limb3: 0x5cf357e8473bba00386d238, }, r0a1: u384 { limb0: 0x3b373a0d0a649113f5c7b2fe, limb1: 0xa3913baa2c3f8f7499ac76a6, limb2: 0x425aed5972aa5f4b4d21ffc7, limb3: 0x82938f41814229b1224b32b, }, r1a0: u384 { limb0: 0x5b130ec9295aaeb79868e7d6, limb1: 0xda6c9ffb04ff597a83b36114, limb2: 0xc09586dc17dbca59627bbce4, limb3: 0xd8431f93c66d78cf5b81228, }, r1a1: u384 { limb0: 0xe35d56023ffa020c373e6d85, limb1: 0x22972df9b6181d6397c5ee58, limb2: 0x933a967160fc487717775d67, limb3: 0x19c24474e43b997ab5364a65, }, }, G2Line { r0a0: u384 { limb0: 0x39d9f0ce211a75081a35cffc, limb1: 0xd3f3a394f77ca3a98e93c5df, limb2: 0x85eb00d07fe02bd29ac2a3c6, limb3: 0xb7b0d2db2cffcae60d0ecf6, }, r0a1: u384 { limb0: 0x6117d9f54ded251ed87dcdbd, limb1: 0x1eb6b7f8ce40fd2cfe030d6a, limb2: 0xeed76c5b0d292777e93e9282, limb3: 0xdcf9ee4e619ac48372a1fd5, }, r1a0: u384 { limb0: 0xa9e439e749d4fc1bea4f893f, limb1: 0x3a33e93d4e73b675790a1df8, limb2: 0xdfc3e8f4f8f506c7c6669428, limb3: 0x11adba6387d459f7f991ac32, }, r1a1: u384 { limb0: 0x35efe895ea1509c6b6db31f1, limb1: 0xeba2f9e1733b61d399cbe43d, limb2: 0xe0ca6d0d6d5e4e234334bc4b, limb3: 0x1641a68f159d661c924ca1ca, }, }, G2Line { r0a0: u384 { limb0: 0x6acbdd11b2e3bf3c4e9a8fc7, limb1: 0xa65c7c83d9e863106be2e6e, limb2: 0xba622ef466154b88c6206dc0, limb3: 0x13847679c97ef8978b3f64c9, }, r0a1: u384 { limb0: 0xa29270a27fe8eff7ff52747, limb1: 0x1b86d1ea5e2cb0e565695293, limb2: 0x5d46595304e94133e1524dc4, limb3: 0x5c65be3c6a8b37e95aaa472, }, r1a0: u384 { limb0: 0x4c113034a2b4e8c08494656, limb1: 0x113bdfa06dc6105f0cee337c, limb2: 0x5ab2297e7c609e4044c01f70, limb3: 0xe5ba46e7903db0416c5e85d, }, r1a1: u384 { limb0: 0x1af25f25f85e2fe5769d4db0, limb1: 0xc25dd758f010619bdce139cb, limb2: 0x539682ada1e9af81af49cbb4, limb3: 0x63c25d8d6ffab7a17da8252, }, }, G2Line { r0a0: u384 { limb0: 0x2afd7a503f72962b8035ef56, limb1: 0x741a2724c626c073fcb7cb01, limb2: 0xa954f9a9959cbbcf41765c4c, limb3: 0xd255d019186fe50bbb4abdb, }, r0a1: u384 { limb0: 0xe1247719764debd50fb297b1, limb1: 0x1c85bc8240e9013aa086e724, limb2: 0x2bac98861c64cbbfaf10dfe5, limb3: 0x17887473079a17d6114873ff, }, r1a0: u384 { limb0: 0xb40da2a4cd71fa1185ef523a, limb1: 0xb9b730fd2eea88566c9d4152, limb2: 0x3c384a7436df1edb029d3aed, limb3: 0x89d99706a83aba945d7b48a, }, r1a1: u384 { limb0: 0x6576e31328774ef164f99920, limb1: 0x3e722659df78ce6e6d049703, limb2: 0xc5d56c8d8e6603bf62c90b81, limb3: 0xf58e0aa466c88aa025b6401, }, }, G2Line { r0a0: u384 { limb0: 0xee48f089c7a4594a201092eb, limb1: 0xc9d8a7b7d87389e25b856b97, limb2: 0x74d54bf4748e38d3b2c782b3, limb3: 0x78af2f8549231aa92bba1b3, }, r0a1: u384 { limb0: 0x61acc46ca422be84be4fee75, limb1: 0xf425406455688e07fe496eb2, limb2: 0x1151b627d67176b268c6b18b, limb3: 0x157a7e87571314c4eeffcc64, }, r1a0: u384 { limb0: 0xd95d245c747804a8f3bd59ab, limb1: 0xb3c7108b5d8ce6d797a8ab29, limb2: 0x452fc047d47ec02830b1b9c1, limb3: 0x12ea35020ddc17232447b57c, }, r1a1: u384 { limb0: 0xb027d5b2037b8170fb63b93a, limb1: 0xf317c06fee2a5ef8113fd9d3, limb2: 0xdd1a58fc8de1d70f065c435c, limb3: 0x11d55ce218987319447cc925, }, }, G2Line { r0a0: u384 { limb0: 0xbda20eba312f5ae4b8188dd6, limb1: 0xed6b03a1b59cdf81e337466, limb2: 0x13f52774d5df8f2b53b3f9a3, limb3: 0xa84369f18ef0ea7ea78978b, }, r0a1: u384 { limb0: 0xd89f88c20cdd1be266384948, limb1: 0xb260d5b59d68bd6ce061618b, limb2: 0xc706ec3e85485a7d5d2746c8, limb3: 0x3610ae9e586990c2332a60b, }, r1a0: u384 { limb0: 0xaa640e2e801a15e4d8aa9343, limb1: 0xce786976554ab6ed66b66295, limb2: 0x1dbbe2c4c4a66f2fef9f4df, limb3: 0x1599a1020ad879a8517215c8, }, r1a1: u384 { limb0: 0x68f8ce25afd5a01fa9437698, limb1: 0xf218ff065be19aa212e05aa2, limb2: 0xa0d7125cba24d5c3b3426602, limb3: 0x1f4d34e061c1928106f603, }, }, G2Line { r0a0: u384 { limb0: 0x1b9ff207335fcb7b28f48654, limb1: 0xaa059fc26f53a4b15d861e5d, limb2: 0x7409e84a31ef57e217e3d45d, limb3: 0x8f022244af0b719146e8cfb, }, r0a1: u384 { limb0: 0x1fa9d79eb0320e586c2d096a, limb1: 0x8fde2d5c9ef41c1612865896, limb2: 0xec88b9f86c99799b380ebac9, limb3: 0x72c117c18b8dfa89321c27c, }, r1a0: u384 { limb0: 0x4570eb295684cad19e7cfded, limb1: 0x2e204f8114c805f866cca868, limb2: 0xba0509fc0eea7cc65c8b3dee, limb3: 0xc7c1e717bb7b078054d3851, }, r1a1: u384 { limb0: 0x25eb9fba51d76d2292c1e2bf, limb1: 0xa43de47dba6db4c3e5c3d8b8, limb2: 0x365ea08af8998db774b8b61e, limb3: 0x6367ffd71d3c44095424fc7, }, }, G2Line { r0a0: u384 { limb0: 0x2ad35ec942a6dc10be32da05, limb1: 0xb889a7f8c178610e41752e60, limb2: 0x130ac19123ef4bc5eff163aa, limb3: 0xc1c8933b8eca116c8c32c9e, }, r0a1: u384 { limb0: 0x9b46883056c4f426647a0d1f, limb1: 0x2bc81e6550613b15475cad1f, limb2: 0x5c12a15bc536b16c6c8b1118, limb3: 0x1116e31db9a099b5941e7fe9, }, r1a0: u384 { limb0: 0x1b8184a1d9bad5d268b10d3e, limb1: 0xc8196d57732ebf89f6ce1ee6, limb2: 0xd34c8b394f605c9bc52280cd, limb3: 0x14b9a6056022227937d6c4ee, }, r1a1: u384 { limb0: 0xbcbfa6c19991f2a6202faa84, limb1: 0xf3a30cde404074949784fb8a, limb2: 0x6bd69539f118c993bb469b75, limb3: 0x3c8a54c44f16bc3e22144e4, }, }, G2Line { r0a0: u384 { limb0: 0xd8934218abbe5eda42e0374, limb1: 0x4efa70797ab04d5777f18cae, limb2: 0x657bd72dc32622552c01c3a1, limb3: 0x86675ec3781ecc255b9b8f, }, r0a1: u384 { limb0: 0xdb3cdd784259d6f00a05188, limb1: 0x4d7d18f24dc5139d8829c6be, limb2: 0x9067fb6cb2810aa19e5e838d, limb3: 0x99b7b955ea60c02306dd019, }, r1a0: u384 { limb0: 0x9569e6a9a6dfc936dc66c37d, limb1: 0x8ce5600bf62265cce1600d14, limb2: 0xe437be1358f94ae1da7ba693, limb3: 0x26001dbd81fb98024703f0a, }, r1a1: u384 { limb0: 0x38347efb475ef26461922ce8, limb1: 0x434f13930fd2a42336fc5a71, limb2: 0xa611a973d0bf99e3535651af, limb3: 0xf623d241cf8d903d2d48305, }, }, G2Line { r0a0: u384 { limb0: 0x721021ae8a4f50730c3d67dc, limb1: 0x879473ae153c9a3634074832, limb2: 0x37c1a1dc9eb1835b698836b1, limb3: 0x103fc06c9853a3f7112aab36, }, r0a1: u384 { limb0: 0xabcfe33c5665f550278d61b4, limb1: 0x9225061eb88a19059c6a5f6b, limb2: 0xfea771c15b736bb9dfd64611, limb3: 0x115d2632ad3a29006e1392bf, }, r1a0: u384 { limb0: 0x656457e64c7777c11b84156b, limb1: 0xead830ab7644411a1795ddf3, limb2: 0xbd12c37bb1cbd056fc94cd13, limb3: 0x1698578bd5388b5de2eb808f, }, r1a1: u384 { limb0: 0xa3f77a7e2e3af21dabc4871, limb1: 0x170f78723c727fb4bbc4b4a9, limb2: 0x7090ee848cbc35a8f11b2354, limb3: 0xc8b6a3068cd96500af13493, }, }, G2Line { r0a0: u384 { limb0: 0x7464425eeb75a1d3a3486fba, limb1: 0xd4f0931c31459109811008d1, limb2: 0x5aac0cfc9b43343826136afb, limb3: 0xf16056dd2e8b5f8240d4ac7, }, r0a1: u384 { limb0: 0xee0993ef125a22747400b5ea, limb1: 0x438805278ea9e18b001cf7da, limb2: 0x11c5cbb3ae17332e06f5b415, limb3: 0x134957b7abe963c5d074abc9, }, r1a0: u384 { limb0: 0xacf8eb684fdd044dd83f813e, limb1: 0xcb5dae51f81a4969f0370c67, limb2: 0x491fc4a63ef64f17b8aa0d30, limb3: 0x188b4199d41c95a7991f2d89, }, r1a1: u384 { limb0: 0x1f69582489be9a39cb94c326, limb1: 0xdfa20ef759cc430ed060c20b, limb2: 0xeab00aeca148c6a408bcd34a, limb3: 0xd6a605bcb73c8061942fb57, }, }, G2Line { r0a0: u384 { limb0: 0x6773468ba72e40777baeb8f0, limb1: 0x570d2473b46fc08824285612, limb2: 0xd6ad952f46006fb353d86e0b, limb3: 0xa08d2c3726cf2aff2c088d6, }, r0a1: u384 { limb0: 0xa416cc264e8202431a4e991d, limb1: 0xf5a5787c840a815dfa522b31, limb2: 0xe711bc925aba1a74b7b4d4aa, limb3: 0x868f9c19f9d55b3b7ccd898, }, r1a0: u384 { limb0: 0x7baf6a74c7f41953cea5e439, limb1: 0xcb2fed5cedcf58101434abc1, limb2: 0x7393a96a373c39a66a6c8834, limb3: 0xb23fcd989611b241a4105b, }, r1a1: u384 { limb0: 0x555b817d72aebd2464a2d59b, limb1: 0xe7fd327dcbec3232500cda76, limb2: 0x10b589891b97aaf0c7a54d85, limb3: 0xbd9efb2a7eedeb7323cb190, }, }, G2Line { r0a0: u384 { limb0: 0xed72eccb4e30eeaf3b992446, limb1: 0x14e0585cd696c72e9adb4736, limb2: 0x7df5eabb84672fab4d4a6e10, limb3: 0x2d6c8112234d7f18ea478ea, }, r0a1: u384 { limb0: 0x95586dac212579b39f39df97, limb1: 0xff0488c63a739029f85aec22, limb2: 0x38ce286aeea4511ddcb23d59, limb3: 0x444323d14c7a3549b9f6b27, }, r1a0: u384 { limb0: 0xac929d1bb6bfa0df5bd0b951, limb1: 0x9a5e39e018083d89aeeaee3d, limb2: 0xc84698d95675ba2c1b93662e, limb3: 0xa82a23fd9338c15ba09139b, }, r1a1: u384 { limb0: 0x8a89d4ebf46cc78b9a67add2, limb1: 0x1761e578b693547ecbf4817f, limb2: 0xbd9d23d081864a636a27dce, limb3: 0x40d68a72ee4363db50d3c92, }, }, G2Line { r0a0: u384 { limb0: 0x9cdba5cfbe0205d55df33685, limb1: 0x8a416e1681ead82ad2711fef, limb2: 0xd94faace2b1209807fbb9edd, limb3: 0xd1755cae5ede1642897673f, }, r0a1: u384 { limb0: 0x352a420344ca83dd4e252c7, limb1: 0xcbcde81ff301c244dc5e006, limb2: 0xa54df6ee2561e110ee674e3e, limb3: 0x18ad276363a6d2c576fc7d75, }, r1a0: u384 { limb0: 0x17901b259f213203281dfa4e, limb1: 0xdca6f358c344dba951e904f0, limb2: 0x68be1f2f4a49c00264212bb, limb3: 0xf39b5af5b74e8e45b8940b, }, r1a1: u384 { limb0: 0xe2032cd4d375921e86fdc082, limb1: 0x90f0cda4fe6f4bedd1c3872d, limb2: 0x9236c612070666c5139ec1cf, limb3: 0x16eecd9e2f41fc13c0b1678d, }, }, G2Line { r0a0: u384 { limb0: 0xbdda2d3c31051f4071ae2945, limb1: 0xbc66726ddee31b37d058d7e5, limb2: 0x9f4eb741ac78b510ccf452ab, limb3: 0x65fb0c0d47de8795557bd2f, }, r0a1: u384 { limb0: 0xb9c37518dd4a05df7a4d6dc1, limb1: 0xd4ee64da91ea67b8a4525b4, limb2: 0x73a813ffff40ee810a12214b, limb3: 0x7f9fda3fa03c5295720441d, }, r1a0: u384 { limb0: 0xaa6d391bd6b4113145484e4f, limb1: 0x86d3fa56727d8879496d1827, limb2: 0x71223351a13a9577646c0ec3, limb3: 0x5c4513dff602b8ec227f711, }, r1a1: u384 { limb0: 0xb9b127f0cbfc3172bba7a933, limb1: 0x10d730ec07d1e0f84c5c6c34, limb2: 0x693e354e2246bf96f3ebf563, limb3: 0x1163f7e15fbd10f4086aad86, }, }, G2Line { r0a0: u384 { limb0: 0x95151ea18c775b54deb3d8d2, limb1: 0x12d5d14c1a1e5e441f80f7f0, limb2: 0x441e9ed1c76ca5b0a9a2c673, limb3: 0x5ed345d22ce7a2820a566a6, }, r0a1: u384 { limb0: 0x85f7fcc07f1acb58e2b2b71d, limb1: 0xf54880edf6b069d9be9739e7, limb2: 0xb25f1683eedccd9cddb2592e, limb3: 0x1287330ba9caab2bef8676e5, }, r1a0: u384 { limb0: 0x418096781d6bdd8438f7d0fa, limb1: 0xde2b0883a520a29780fe7f9, limb2: 0x858acb343f8b338095664988, limb3: 0x1213109d451b7b62be0e7837, }, r1a1: u384 { limb0: 0x13c30921c6ad44eef236dc4e, limb1: 0x97d1525a1c3fa2dfe5f32aa7, limb2: 0x7071a595e981dc71b225c544, limb3: 0x6f31cf2562cca8a820178ab, }, }, ]; ================================================ FILE: src/contracts/drand_quicknet/src/lib.cairo ================================================ pub mod drand_verifier; mod drand_verifier_constants; ================================================ FILE: src/contracts/mutator_set/.tool-versions ================================================ starknet-foundry 0.57.0 scarb 2.16.1 ================================================ FILE: src/contracts/mutator_set/Makefile ================================================ regen: python3 ./scripts/regenerate_verifier.py NOIR_FOLDER = "zk_program" build: cd ${NOIR_FOLDER} && nargo build && nargo execute witness prove: cd ${NOIR_FOLDER} && bb prove -s ultra_honk --oracle_hash keccak -b ./target/zk_program.json -w ./target/witness.gz -o ./target/ verify: cd ${NOIR_FOLDER} && bb verify -s ultra_honk -p ./target/proof -k ./target/vk --oracle_hash keccak ================================================ FILE: src/contracts/mutator_set/Scarb.toml ================================================ [package] name = "mutator_set" version = "0.1.0" edition = "2024_07" # See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest.html [dependencies] starknet = "2.16.1" garaga = { path = "../../" } [dev-dependencies] snforge_std = "0.57.0" assert_macros = "2.16.1" [cairo] sierra-replace-ids = false [[target.starknet-contract]] sierra = true [scripts] test = "snforge test" [tool.scarb] allow-prebuilt-plugins = ["snforge_std"] # Visit https://foundry-rs.github.io/starknet-foundry/appendix/scarb-toml.html for more information # [tool.snforge] # Define `snforge` tool section # exit_first = true # Stop tests execution immediately upon the first failure # fuzzer_runs = 1234 # Number of runs of the random fuzzer # fuzzer_seed = 1111 # Seed for the random fuzzer # [[tool.snforge.fork]] # Used for fork testing # name = "SOME_NAME" # Fork name # url = "http://your.rpc.url" # Url of the RPC provider # block_id.tag = "latest" # Block to fork from (block tag) # [[tool.snforge.fork]] # name = "SOME_SECOND_NAME" # url = "http://your.second.rpc.url" # block_id.number = "123" # Block to fork from (block number) # [[tool.snforge.fork]] # name = "SOME_THIRD_NAME" # url = "http://your.third.rpc.url" # block_id.hash = "0x123" # Block to fork from (block hash) # [profile.dev.cairo] # Configure Cairo compiler # unstable-add-statements-code-locations-debug-info = true # Should be used if you want to use coverage # unstable-add-statements-functions-debug-info = true # Should be used if you want to use coverage/profiler # inlining-strategy = "avoid" # Should be used if you want to use coverage # [features] # Used for conditional compilation # enable_for_tests = [] # Feature name and list of other features that should be enabled with it ================================================ FILE: src/contracts/mutator_set/scripts/prover.py ================================================ import os from dataclasses import dataclass from typing import List import toml MAX_PEAKS = 32 MAX_PROOF_DEPTH = 32 @dataclass class StorageElement: hash: str @dataclass class Proof: len: str storage: List[StorageElement] @dataclass class ProverConfig: leaf_index: str leaf_premiage: str num_leafs: str peaks: List[str] root_hash: str proof: Proof def to_dict(self) -> dict: """Convert the dataclass to a dictionary format suitable for TOML serialization.""" return { "leaf_index": self.leaf_index, "leaf_premiage": self.leaf_premiage, "num_leafs": self.num_leafs, "peaks": self.peaks, "root_hash": self.root_hash, "proof": { "len": self.proof.len, "storage": [{"hash": s.hash} for s in self.proof.storage], }, } def save_to_toml(self, filepath: str) -> None: """Save the configuration to a TOML file.""" config_dict = self.to_dict() with open(filepath, "w") as f: toml.dump(config_dict, f) @classmethod def load_from_toml(cls, filepath: str) -> "ProverConfig": """Load configuration from a TOML file.""" with open(filepath, "r") as f: config_dict = toml.load(f) # Convert the dictionary back to ProverConfig proof_dict = config_dict["proof"] storage = [StorageElement(hash=s["hash"]) for s in proof_dict["storage"]] proof = Proof(len=proof_dict["len"], storage=storage) return cls( leaf_index=config_dict["leaf_index"], leaf_premiage=config_dict["leaf_premiage"], num_leafs=config_dict["num_leafs"], peaks=config_dict["peaks"], root_hash=config_dict["root_hash"], proof=proof, ) def create_default_config() -> ProverConfig: """Create a default configuration matching the example Prover.toml.""" storage_elements = [StorageElement(hash="0") for _ in range(MAX_PROOF_DEPTH)] storage_elements[1] = StorageElement( hash="0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864" ) peaks = ( ["0x1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1"] + ["0x0"] + ["0x0"] * (MAX_PEAKS - 2) ) return ProverConfig( leaf_index=hex(2), leaf_premiage=hex(0), num_leafs=hex(5), peaks=peaks, root_hash="0x1ba30aaf15c7694786a1f118ca39fcc6c997b48da9dfa62e9ec3e83ac7d6304d", proof=Proof(len=hex(2), storage=storage_elements), ) if __name__ == "__main__": # Example usage config = create_default_config() # Save to TOML output_path = os.path.join( os.path.dirname(os.path.dirname(__file__)), "zk_program", "Prover.toml" ) config.save_to_toml(output_path) print(f"Saved configuration to {output_path}") # Load from TOML loaded_config = ProverConfig.load_from_toml(output_path) print("Successfully loaded configuration from TOML") ================================================ FILE: src/contracts/mutator_set/scripts/regenerate_verifier.py ================================================ import logging import os import subprocess from dataclasses import dataclass from pathlib import Path from typing import Optional from garaga.starknet.cli.utils import create_directory from garaga.starknet.honk_contract_generator.generator_honk import ( HonkVk, ProofSystem, gen_honk_verifier_files, ) # Configure logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" ) logger = logging.getLogger(__name__) @dataclass class VerifierConfig: """Configuration for verifier generation.""" program_name: str = "zk_program" bb_path: str = "bb" scheme: str = "ultra_honk" oracle_hash: str = "keccak" proof_system: ProofSystem = ProofSystem.UltraKeccakZKHonk @property def paths(self) -> dict: """Get all relevant paths based on the script location.""" script_dir = Path(__file__).parent project_root = script_dir.parent return { "noir_program_dir": project_root / self.program_name, "target_dir": project_root / self.program_name / "target", "verifier_dir": project_root / "src" / f"zk_verifier", "lib_cairo": project_root / "src" / "lib.cairo", "contract_class": project_root / "target" / "dev" / "mutator_set_UltraKeccakZKHonkVerifier.contract_class.json", } class VerifierGenerator: """Handles the generation of verifier files for the ZK program.""" def __init__(self, config: VerifierConfig): self.config = config self.paths = config.paths def run_command(self, cmd: list, cwd: Optional[Path] = None) -> str: logger.info(f"Running: {' '.join(cmd)}") try: result = subprocess.run( cmd, cwd=cwd, check=True, text=True, capture_output=True ) return result.stdout.strip() except subprocess.CalledProcessError as e: error_msg = f"Command failed with output:\nstdout: {e.stdout.strip()}\nstderr: {e.stderr.strip()}" logger.error(error_msg) raise def update_class_hash(self, class_hash: str): """Update the class hash in lib.cairo.""" try: content = f"""pub mod mutator_set_contract; pub mod zk_verifier {{ pub mod honk_verifier_circuits; pub mod honk_verifier_constants; pub mod honk_verifier_contract; }} const VERIFIER_CLASS_HASH: felt252 = {class_hash}; """ with open(self.paths["lib_cairo"], "w") as f: f.write(content) logger.info(f"Updated class hash in {self.paths['lib_cairo']}") except Exception as e: logger.error(f"Failed to update class hash: {str(e)}") raise def generate(self) -> bool: """Generate verifier files for the ZK program.""" try: original_dir = os.getcwd() os.chdir(self.paths["noir_program_dir"]) # Build project and generate verification key os.makedirs(self.paths["target_dir"], exist_ok=True) self.run_command(["nargo", "build"]) self.run_command( [ self.config.bb_path, "write_vk", "--scheme", self.config.scheme, "--oracle_hash", self.config.oracle_hash, "-b", str(self.paths["target_dir"] / f"{self.config.program_name}.json"), "-o", str(self.paths["target_dir"]), ] ) # Generate and write verifier files with open(self.paths["target_dir"] / "vk", "rb") as f: vk = HonkVk.from_bytes(f.read()) ( constants_code, circuits_code, contract_code, contract_name, verification_function_name, ) = gen_honk_verifier_files(vk) # Write files create_directory(self.paths["verifier_dir"]) # Remove existing files for filename in os.listdir(self.paths["verifier_dir"]): os.remove(self.paths["verifier_dir"] / filename) for filename, content in { "honk_verifier_constants.cairo": constants_code, "honk_verifier_circuits.cairo": circuits_code, "honk_verifier_contract.cairo": contract_code, }.items(): with open(self.paths["verifier_dir"] / filename, "w") as f: f.write(content) self.run_command(["scarb", "fmt", str(self.paths["verifier_dir"])]) # Change to project root and run scarb build os.chdir(self.paths["noir_program_dir"].parent) self.run_command(["scarb", "build"]) # Get class hash class_hash = self.run_command( ["starkli", "class-hash", str(self.paths["contract_class"])] ) logger.info(f"Generated class hash: {class_hash}") # Update class hash in lib.cairo self.update_class_hash(class_hash) # Format lib.cairo self.run_command(["scarb", "fmt", str(self.paths["lib_cairo"])]) os.chdir(original_dir) return True except Exception as e: logger.error(f"Verifier generation failed: {str(e)}") raise def main(): """Main function to build project and generate verifiers.""" try: generator = VerifierGenerator(VerifierConfig()) generator.generate() logger.info("Verifier generation completed successfully") except Exception as e: logger.error(f"Failed to generate verifier: {str(e)}") raise if __name__ == "__main__": main() ================================================ FILE: src/contracts/mutator_set/snfoundry.toml ================================================ # Visit https://foundry-rs.github.io/starknet-foundry/appendix/snfoundry-toml.html # and https://foundry-rs.github.io/starknet-foundry/projects/configuration.html for more information # [sncast.default] # Define a profile name # url = "https://free-rpc.nethermind.io/sepolia-juno/v0_7" # Url of the RPC provider # accounts-file = "../account-file" # Path to the file with the account data # account = "mainuser" # Account from `accounts_file` or default account file that will be used for the transactions # keystore = "~/keystore" # Path to the keystore file # wait-params = { timeout = 300, retry-interval = 10 } # Wait for submitted transaction parameters # block-explorer = "StarkScan" # Block explorer service used to display links to transaction details # show-explorer-links = true # Print links pointing to pages with transaction details in the chosen block explorer ================================================ FILE: src/contracts/mutator_set/src/lib.cairo ================================================ pub mod mutator_set_contract; pub mod zk_verifier { pub mod honk_verifier_circuits; pub mod honk_verifier_constants; pub mod honk_verifier_contract; } const VERIFIER_CLASS_HASH: felt252 = 0x05afe47f53c8833bae809202f397c3beeae83b912928c10f2c6db517fc3b8463; ================================================ FILE: src/contracts/mutator_set/src/mutator_set_contract.cairo ================================================ use mutator_set::zk_verifier::honk_verifier_contract::IUltraKeccakZKHonkVerifier; #[starknet::interface] pub trait IMutatorSetContract { fn get_n_leaves_aocl(self: @TContractState) -> u64; fn get_n_peaks_aocl(self: @TContractState) -> u64; fn append_leaf_aocl(ref self: TContractState, leaf: u256); fn get_peaks_aocl(self: @TContractState) -> Array; fn verify_inclusion_proof_aocl( ref self: TContractState, full_proof_with_hints: Span, ) -> bool; } #[starknet::contract] mod MutatorSetContract { use garaga::crypto::mmr::trailing_ones; use garaga::hashes::poseidon_bn254::poseidon_hash_2 as hash_2; use mutator_set::VERIFIER_CLASS_HASH; use starknet::SyscallResultTrait; use starknet::storage::{ MutableVecTrait, StoragePointerReadAccess, StoragePointerWriteAccess, Vec, VecTrait, }; const BN254_CURVE_ORDER: u256 = u256 { low: 0x2833e84879b9709143e1f593f0000001, high: 0x30644e72e131a029b85045b68181585d, }; const AOCL_INIT_VALUE: u256 = 0; // Append-only commitment list #[starknet::storage_node] struct AOCL { n_leaves: u64, peaks: Vec, last_peak_index: u64, } #[starknet::storage_node] struct AOCLState { n_leaves: u64, root: u256, } #[storage] struct Storage { aocl: AOCL, aocl_state: AOCL, } #[constructor] fn constructor(ref self: ContractState) { // Init both AOCLs self.aocl.peaks.push(AOCL_INIT_VALUE); self.aocl.n_leaves.write(1); self.aocl.last_peak_index.write(0); self.aocl_state.peaks.push(AOCL_INIT_VALUE); self.aocl_state.n_leaves.write(1); self.aocl_state.last_peak_index.write(0); } #[event] #[derive(Drop, starknet::Event)] pub enum Event { LeafAppended: LeafAppended, } #[derive(Drop, starknet::Event)] struct LeafAppended { leaf: u256, n_leaves: u64, } #[abi(embed_v0)] impl MutatorSetContractImpl of super::IMutatorSetContract { fn get_n_leaves_aocl(self: @ContractState) -> u64 { self.aocl.n_leaves.read() } fn get_peaks_aocl(self: @ContractState) -> Array { let n_peaks = self.aocl.last_peak_index.read() + 1; let mut peaks = array![]; for i in 0..n_peaks { peaks.append(self.aocl.peaks.get(i).expect('Invalid peak index').read()); } peaks } fn get_n_peaks_aocl(self: @ContractState) -> u64 { self.aocl.last_peak_index.read() + 1 } fn append_leaf_aocl(ref self: ContractState, leaf: u256) { assert(leaf < BN254_CURVE_ORDER, 'Invalid leaf value'); let n_leaves = self.aocl.n_leaves.read(); let n_parents = trailing_ones(n_leaves); let mut last_peak_idx = self.aocl.last_peak_index.read(); match n_parents { 0 => { let peaks_vec_last_idx = self.aocl.peaks.len() - 1; let new_peak_idx = last_peak_idx + 1; match new_peak_idx <= peaks_vec_last_idx { true => { self.aocl.peaks.get(new_peak_idx).unwrap().write(leaf); self.aocl.last_peak_index.write(new_peak_idx); }, false => { self.aocl.peaks.push(leaf); self.aocl.last_peak_index.write(new_peak_idx); }, } }, 1 => { let mut last_peak_ptr = self .aocl .peaks .get(last_peak_idx) .expect('Invalid last peak index'); let last_peak = last_peak_ptr.read(); let parent: u256 = hash_2(last_peak, leaf); last_peak_ptr.write(parent); // No change on last_peak_idx. (It was a single leaf that got merged into a // peak) }, _ => { let mut last_peak_ptr = self .aocl .peaks .get(last_peak_idx) .expect('Invalid last peak index'); let last_peak: u256 = last_peak_ptr.read(); let parent: u256 = hash_2(last_peak, leaf); last_peak_ptr.write(parent); for _ in 0..n_parents - 1 { let in_progress_peak = self.aocl.peaks.get(last_peak_idx).unwrap().read(); let previous_peak = self.aocl.peaks.get(last_peak_idx - 1).unwrap().read(); let parent: u256 = hash_2(previous_peak, in_progress_peak); last_peak_idx -= 1; let mut last_peak_ptr = self.aocl.peaks.get(last_peak_idx).unwrap(); last_peak_ptr.write(parent); } self.aocl.last_peak_index.write(last_peak_idx); }, } let new_n_leaves = n_leaves + 1; self.aocl.n_leaves.write(new_n_leaves); self.emit(LeafAppended { leaf: leaf, n_leaves: new_n_leaves }); } fn verify_inclusion_proof_aocl( ref self: ContractState, full_proof_with_hints: Span, ) -> bool { let mut res = starknet::syscalls::library_call_syscall( VERIFIER_CLASS_HASH.try_into().unwrap(), selector!("verify_ultra_keccak_zk_honk_proof"), full_proof_with_hints, ) .unwrap_syscall(); Serde::::deserialize(ref res).unwrap() } } // Private function fn _update_aocl_state( ref self: ContractState, peaks: Array, n_leaves: u64, last_peak_index: u64, ) { // Copy the AOCL into the AOCL state for i in 0..peaks.len() { self.aocl_state.peaks.get(i.into()).unwrap().write(*peaks[i]); } self.aocl_state.n_leaves.write(n_leaves); self.aocl_state.last_peak_index.write(last_peak_index); } } ================================================ FILE: src/contracts/mutator_set/src/zk_verifier/honk_verifier_circuits.cairo ================================================ use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitModulus, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::G1Point; #[inline(always)] pub fn run_GRUMPKIN_ZK_HONK_SUMCHECK_SIZE_17_PUB_19_circuit( p_public_inputs: Span, p_pairing_point_object: Span, libra_sum: u384, sumcheck_univariates_flat: Span, sumcheck_evaluations: Span, libra_evaluation: u384, tp_sum_check_u_challenges: Span, tp_gate_challenge: u128, tp_eta_1: u384, tp_eta_2: u384, tp_eta_3: u384, tp_beta: u384, tp_gamma: u384, tp_base_rlc: u384, tp_alpha: u128, tp_libra_challenge: u384, modulus: core::circuit::CircuitModulus, ) -> (u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x1 let in1 = CE::> {}; // 0x10000000 let in2 = CE::> {}; // 0x9d80 let in3 = CE::> {}; // 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 let in4 = CE::> {}; // 0x5a0 let in5 = CE::> {}; // 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 let in6 = CE::> {}; // 0x240 let in7 = CE::> {}; // 0x0 let in8 = CE::> {}; // 0x2 let in9 = CE::> {}; // 0x3 let in10 = CE::> {}; // 0x4 let in11 = CE::> {}; // 0x5 let in12 = CE::> {}; // 0x6 let in13 = CE::> {}; // 0x7 let in14 = CE::> {}; // 0x8 let in15 = CE::< CI<15>, > {}; // 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000 let in16 = CE::> {}; // -0x1 % p let in17 = CE::> {}; // 0x11 let in18 = CE::> {}; // 0x9 let in19 = CE::> {}; // 0x100000000000000000 let in20 = CE::> {}; // 0x4000 let in21 = CE::< CI<21>, > {}; // 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7 let in22 = CE::> {}; // 0xc28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b let in23 = CE::> {}; // 0x544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15 let in24 = CE::< CI<24>, > {}; // 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b // INPUT stack let (in25, in26, in27) = (CE::> {}, CE::> {}, CE::> {}); let (in28, in29, in30) = (CE::> {}, CE::> {}, CE::> {}); let (in31, in32, in33) = (CE::> {}, CE::> {}, CE::> {}); let (in34, in35, in36) = (CE::> {}, CE::> {}, CE::> {}); let (in37, in38, in39) = (CE::> {}, CE::> {}, CE::> {}); let (in40, in41, in42) = (CE::> {}, CE::> {}, CE::> {}); let (in43, in44, in45) = (CE::> {}, CE::> {}, CE::> {}); let (in46, in47, in48) = (CE::> {}, CE::> {}, CE::> {}); let (in49, in50, in51) = (CE::> {}, CE::> {}, CE::> {}); let (in52, in53, in54) = (CE::> {}, CE::> {}, CE::> {}); let (in55, in56, in57) = (CE::> {}, CE::> {}, CE::> {}); let (in58, in59, in60) = (CE::> {}, CE::> {}, CE::> {}); let (in61, in62, in63) = (CE::> {}, CE::> {}, CE::> {}); let (in64, in65, in66) = (CE::> {}, CE::> {}, CE::> {}); let (in67, in68, in69) = (CE::> {}, CE::> {}, CE::> {}); let (in70, in71, in72) = (CE::> {}, CE::> {}, CE::> {}); let (in73, in74, in75) = (CE::> {}, CE::> {}, CE::> {}); let (in76, in77, in78) = (CE::> {}, CE::> {}, CE::> {}); let (in79, in80, in81) = (CE::> {}, CE::> {}, CE::> {}); let (in82, in83, in84) = (CE::> {}, CE::> {}, CE::> {}); let (in85, in86, in87) = (CE::> {}, CE::> {}, CE::> {}); let (in88, in89, in90) = (CE::> {}, CE::> {}, CE::> {}); let (in91, in92, in93) = (CE::> {}, CE::> {}, CE::> {}); let (in94, in95, in96) = (CE::> {}, CE::> {}, CE::> {}); let (in97, in98, in99) = (CE::> {}, CE::> {}, CE::> {}); let (in100, in101, in102) = (CE::> {}, CE::> {}, CE::> {}); let (in103, in104, in105) = (CE::> {}, CE::> {}, CE::> {}); let (in106, in107, in108) = (CE::> {}, CE::> {}, CE::> {}); let (in109, in110, in111) = (CE::> {}, CE::> {}, CE::> {}); let (in112, in113, in114) = (CE::> {}, CE::> {}, CE::> {}); let (in115, in116, in117) = (CE::> {}, CE::> {}, CE::> {}); let (in118, in119, in120) = (CE::> {}, CE::> {}, CE::> {}); let (in121, in122, in123) = (CE::> {}, CE::> {}, CE::> {}); let (in124, in125, in126) = (CE::> {}, CE::> {}, CE::> {}); let (in127, in128, in129) = (CE::> {}, CE::> {}, CE::> {}); let (in130, in131, in132) = (CE::> {}, CE::> {}, CE::> {}); let (in133, in134, in135) = (CE::> {}, CE::> {}, CE::> {}); let (in136, in137, in138) = (CE::> {}, CE::> {}, CE::> {}); let (in139, in140, in141) = (CE::> {}, CE::> {}, CE::> {}); let (in142, in143, in144) = (CE::> {}, CE::> {}, CE::> {}); let (in145, in146, in147) = (CE::> {}, CE::> {}, CE::> {}); let (in148, in149, in150) = (CE::> {}, CE::> {}, CE::> {}); let (in151, in152, in153) = (CE::> {}, CE::> {}, CE::> {}); let (in154, in155, in156) = (CE::> {}, CE::> {}, CE::> {}); let (in157, in158, in159) = (CE::> {}, CE::> {}, CE::> {}); let (in160, in161, in162) = (CE::> {}, CE::> {}, CE::> {}); let (in163, in164, in165) = (CE::> {}, CE::> {}, CE::> {}); let (in166, in167, in168) = (CE::> {}, CE::> {}, CE::> {}); let (in169, in170, in171) = (CE::> {}, CE::> {}, CE::> {}); let (in172, in173, in174) = (CE::> {}, CE::> {}, CE::> {}); let (in175, in176, in177) = (CE::> {}, CE::> {}, CE::> {}); let (in178, in179, in180) = (CE::> {}, CE::> {}, CE::> {}); let (in181, in182, in183) = (CE::> {}, CE::> {}, CE::> {}); let (in184, in185, in186) = (CE::> {}, CE::> {}, CE::> {}); let (in187, in188, in189) = (CE::> {}, CE::> {}, CE::> {}); let (in190, in191, in192) = (CE::> {}, CE::> {}, CE::> {}); let (in193, in194, in195) = (CE::> {}, CE::> {}, CE::> {}); let (in196, in197, in198) = (CE::> {}, CE::> {}, CE::> {}); let (in199, in200, in201) = (CE::> {}, CE::> {}, CE::> {}); let (in202, in203, in204) = (CE::> {}, CE::> {}, CE::> {}); let (in205, in206, in207) = (CE::> {}, CE::> {}, CE::> {}); let (in208, in209, in210) = (CE::> {}, CE::> {}, CE::> {}); let (in211, in212, in213) = (CE::> {}, CE::> {}, CE::> {}); let (in214, in215, in216) = (CE::> {}, CE::> {}, CE::> {}); let (in217, in218, in219) = (CE::> {}, CE::> {}, CE::> {}); let (in220, in221, in222) = (CE::> {}, CE::> {}, CE::> {}); let (in223, in224, in225) = (CE::> {}, CE::> {}, CE::> {}); let (in226, in227, in228) = (CE::> {}, CE::> {}, CE::> {}); let (in229, in230, in231) = (CE::> {}, CE::> {}, CE::> {}); let (in232, in233, in234) = (CE::> {}, CE::> {}, CE::> {}); let (in235, in236, in237) = (CE::> {}, CE::> {}, CE::> {}); let (in238, in239, in240) = (CE::> {}, CE::> {}, CE::> {}); let (in241, in242, in243) = (CE::> {}, CE::> {}, CE::> {}); let (in244, in245, in246) = (CE::> {}, CE::> {}, CE::> {}); let (in247, in248, in249) = (CE::> {}, CE::> {}, CE::> {}); let (in250, in251, in252) = (CE::> {}, CE::> {}, CE::> {}); let (in253, in254, in255) = (CE::> {}, CE::> {}, CE::> {}); let (in256, in257, in258) = (CE::> {}, CE::> {}, CE::> {}); let (in259, in260, in261) = (CE::> {}, CE::> {}, CE::> {}); let (in262, in263, in264) = (CE::> {}, CE::> {}, CE::> {}); let in265 = CE::> {}; let t0 = circuit_add(in1, in0); let t1 = circuit_mul(in261, t0); let t2 = circuit_add(in262, t1); let t3 = circuit_add(in0, in0); let t4 = circuit_mul(in261, t3); let t5 = circuit_sub(in262, t4); let t6 = circuit_add(t2, in25); let t7 = circuit_mul(in0, t6); let t8 = circuit_add(t5, in25); let t9 = circuit_mul(in0, t8); let t10 = circuit_add(t2, in261); let t11 = circuit_sub(t5, in261); let t12 = circuit_add(t10, in26); let t13 = circuit_mul(t7, t12); let t14 = circuit_add(t11, in26); let t15 = circuit_mul(t9, t14); let t16 = circuit_add(t10, in261); let t17 = circuit_sub(t11, in261); let t18 = circuit_add(t16, in27); let t19 = circuit_mul(t13, t18); let t20 = circuit_add(t17, in27); let t21 = circuit_mul(t15, t20); let t22 = circuit_add(t16, in261); let t23 = circuit_sub(t17, in261); let t24 = circuit_add(t22, in28); let t25 = circuit_mul(t19, t24); let t26 = circuit_add(t23, in28); let t27 = circuit_mul(t21, t26); let t28 = circuit_add(t22, in261); let t29 = circuit_sub(t23, in261); let t30 = circuit_add(t28, in29); let t31 = circuit_mul(t25, t30); let t32 = circuit_add(t29, in29); let t33 = circuit_mul(t27, t32); let t34 = circuit_add(t28, in261); let t35 = circuit_sub(t29, in261); let t36 = circuit_add(t34, in30); let t37 = circuit_mul(t31, t36); let t38 = circuit_add(t35, in30); let t39 = circuit_mul(t33, t38); let t40 = circuit_add(t34, in261); let t41 = circuit_sub(t35, in261); let t42 = circuit_add(t40, in31); let t43 = circuit_mul(t37, t42); let t44 = circuit_add(t41, in31); let t45 = circuit_mul(t39, t44); let t46 = circuit_add(t40, in261); let t47 = circuit_sub(t41, in261); let t48 = circuit_add(t46, in32); let t49 = circuit_mul(t43, t48); let t50 = circuit_add(t47, in32); let t51 = circuit_mul(t45, t50); let t52 = circuit_add(t46, in261); let t53 = circuit_sub(t47, in261); let t54 = circuit_add(t52, in33); let t55 = circuit_mul(t49, t54); let t56 = circuit_add(t53, in33); let t57 = circuit_mul(t51, t56); let t58 = circuit_add(t52, in261); let t59 = circuit_sub(t53, in261); let t60 = circuit_add(t58, in34); let t61 = circuit_mul(t55, t60); let t62 = circuit_add(t59, in34); let t63 = circuit_mul(t57, t62); let t64 = circuit_add(t58, in261); let t65 = circuit_sub(t59, in261); let t66 = circuit_add(t64, in35); let t67 = circuit_mul(t61, t66); let t68 = circuit_add(t65, in35); let t69 = circuit_mul(t63, t68); let t70 = circuit_add(t64, in261); let t71 = circuit_sub(t65, in261); let t72 = circuit_add(t70, in36); let t73 = circuit_mul(t67, t72); let t74 = circuit_add(t71, in36); let t75 = circuit_mul(t69, t74); let t76 = circuit_add(t70, in261); let t77 = circuit_sub(t71, in261); let t78 = circuit_add(t76, in37); let t79 = circuit_mul(t73, t78); let t80 = circuit_add(t77, in37); let t81 = circuit_mul(t75, t80); let t82 = circuit_add(t76, in261); let t83 = circuit_sub(t77, in261); let t84 = circuit_add(t82, in38); let t85 = circuit_mul(t79, t84); let t86 = circuit_add(t83, in38); let t87 = circuit_mul(t81, t86); let t88 = circuit_add(t82, in261); let t89 = circuit_sub(t83, in261); let t90 = circuit_add(t88, in39); let t91 = circuit_mul(t85, t90); let t92 = circuit_add(t89, in39); let t93 = circuit_mul(t87, t92); let t94 = circuit_add(t88, in261); let t95 = circuit_sub(t89, in261); let t96 = circuit_add(t94, in40); let t97 = circuit_mul(t91, t96); let t98 = circuit_add(t95, in40); let t99 = circuit_mul(t93, t98); let t100 = circuit_add(t94, in261); let t101 = circuit_sub(t95, in261); let t102 = circuit_add(t100, in41); let t103 = circuit_mul(t97, t102); let t104 = circuit_add(t101, in41); let t105 = circuit_mul(t99, t104); let t106 = circuit_add(t100, in261); let t107 = circuit_sub(t101, in261); let t108 = circuit_add(t106, in42); let t109 = circuit_mul(t103, t108); let t110 = circuit_add(t107, in42); let t111 = circuit_mul(t105, t110); let t112 = circuit_add(t106, in261); let t113 = circuit_sub(t107, in261); let t114 = circuit_add(t112, in43); let t115 = circuit_mul(t109, t114); let t116 = circuit_add(t113, in43); let t117 = circuit_mul(t111, t116); let t118 = circuit_inverse(t117); let t119 = circuit_mul(t115, t118); let t120 = circuit_mul(in265, in44); let t121 = circuit_add(in45, in46); let t122 = circuit_sub(t121, t120); let t123 = circuit_mul(t122, in263); let t124 = circuit_sub(in240, in7); let t125 = circuit_mul(in0, t124); let t126 = circuit_sub(in240, in7); let t127 = circuit_mul(in2, t126); let t128 = circuit_inverse(t127); let t129 = circuit_mul(in45, t128); let t130 = circuit_add(in7, t129); let t131 = circuit_sub(in240, in0); let t132 = circuit_mul(t125, t131); let t133 = circuit_sub(in240, in0); let t134 = circuit_mul(in3, t133); let t135 = circuit_inverse(t134); let t136 = circuit_mul(in46, t135); let t137 = circuit_add(t130, t136); let t138 = circuit_sub(in240, in8); let t139 = circuit_mul(t132, t138); let t140 = circuit_sub(in240, in8); let t141 = circuit_mul(in4, t140); let t142 = circuit_inverse(t141); let t143 = circuit_mul(in47, t142); let t144 = circuit_add(t137, t143); let t145 = circuit_sub(in240, in9); let t146 = circuit_mul(t139, t145); let t147 = circuit_sub(in240, in9); let t148 = circuit_mul(in5, t147); let t149 = circuit_inverse(t148); let t150 = circuit_mul(in48, t149); let t151 = circuit_add(t144, t150); let t152 = circuit_sub(in240, in10); let t153 = circuit_mul(t146, t152); let t154 = circuit_sub(in240, in10); let t155 = circuit_mul(in6, t154); let t156 = circuit_inverse(t155); let t157 = circuit_mul(in49, t156); let t158 = circuit_add(t151, t157); let t159 = circuit_sub(in240, in11); let t160 = circuit_mul(t153, t159); let t161 = circuit_sub(in240, in11); let t162 = circuit_mul(in5, t161); let t163 = circuit_inverse(t162); let t164 = circuit_mul(in50, t163); let t165 = circuit_add(t158, t164); let t166 = circuit_sub(in240, in12); let t167 = circuit_mul(t160, t166); let t168 = circuit_sub(in240, in12); let t169 = circuit_mul(in4, t168); let t170 = circuit_inverse(t169); let t171 = circuit_mul(in51, t170); let t172 = circuit_add(t165, t171); let t173 = circuit_sub(in240, in13); let t174 = circuit_mul(t167, t173); let t175 = circuit_sub(in240, in13); let t176 = circuit_mul(in3, t175); let t177 = circuit_inverse(t176); let t178 = circuit_mul(in52, t177); let t179 = circuit_add(t172, t178); let t180 = circuit_sub(in240, in14); let t181 = circuit_mul(t174, t180); let t182 = circuit_sub(in240, in14); let t183 = circuit_mul(in2, t182); let t184 = circuit_inverse(t183); let t185 = circuit_mul(in53, t184); let t186 = circuit_add(t179, t185); let t187 = circuit_mul(t186, t181); let t188 = circuit_sub(in257, in0); let t189 = circuit_mul(in240, t188); let t190 = circuit_add(in0, t189); let t191 = circuit_mul(in0, t190); let t192 = circuit_mul(in263, in263); let t193 = circuit_mul(in257, in257); let t194 = circuit_add(in54, in55); let t195 = circuit_sub(t194, t187); let t196 = circuit_mul(t195, t192); let t197 = circuit_add(t123, t196); let t198 = circuit_sub(in241, in7); let t199 = circuit_mul(in0, t198); let t200 = circuit_sub(in241, in7); let t201 = circuit_mul(in2, t200); let t202 = circuit_inverse(t201); let t203 = circuit_mul(in54, t202); let t204 = circuit_add(in7, t203); let t205 = circuit_sub(in241, in0); let t206 = circuit_mul(t199, t205); let t207 = circuit_sub(in241, in0); let t208 = circuit_mul(in3, t207); let t209 = circuit_inverse(t208); let t210 = circuit_mul(in55, t209); let t211 = circuit_add(t204, t210); let t212 = circuit_sub(in241, in8); let t213 = circuit_mul(t206, t212); let t214 = circuit_sub(in241, in8); let t215 = circuit_mul(in4, t214); let t216 = circuit_inverse(t215); let t217 = circuit_mul(in56, t216); let t218 = circuit_add(t211, t217); let t219 = circuit_sub(in241, in9); let t220 = circuit_mul(t213, t219); let t221 = circuit_sub(in241, in9); let t222 = circuit_mul(in5, t221); let t223 = circuit_inverse(t222); let t224 = circuit_mul(in57, t223); let t225 = circuit_add(t218, t224); let t226 = circuit_sub(in241, in10); let t227 = circuit_mul(t220, t226); let t228 = circuit_sub(in241, in10); let t229 = circuit_mul(in6, t228); let t230 = circuit_inverse(t229); let t231 = circuit_mul(in58, t230); let t232 = circuit_add(t225, t231); let t233 = circuit_sub(in241, in11); let t234 = circuit_mul(t227, t233); let t235 = circuit_sub(in241, in11); let t236 = circuit_mul(in5, t235); let t237 = circuit_inverse(t236); let t238 = circuit_mul(in59, t237); let t239 = circuit_add(t232, t238); let t240 = circuit_sub(in241, in12); let t241 = circuit_mul(t234, t240); let t242 = circuit_sub(in241, in12); let t243 = circuit_mul(in4, t242); let t244 = circuit_inverse(t243); let t245 = circuit_mul(in60, t244); let t246 = circuit_add(t239, t245); let t247 = circuit_sub(in241, in13); let t248 = circuit_mul(t241, t247); let t249 = circuit_sub(in241, in13); let t250 = circuit_mul(in3, t249); let t251 = circuit_inverse(t250); let t252 = circuit_mul(in61, t251); let t253 = circuit_add(t246, t252); let t254 = circuit_sub(in241, in14); let t255 = circuit_mul(t248, t254); let t256 = circuit_sub(in241, in14); let t257 = circuit_mul(in2, t256); let t258 = circuit_inverse(t257); let t259 = circuit_mul(in62, t258); let t260 = circuit_add(t253, t259); let t261 = circuit_mul(t260, t255); let t262 = circuit_sub(t193, in0); let t263 = circuit_mul(in241, t262); let t264 = circuit_add(in0, t263); let t265 = circuit_mul(t191, t264); let t266 = circuit_mul(t192, in263); let t267 = circuit_mul(t193, t193); let t268 = circuit_add(in63, in64); let t269 = circuit_sub(t268, t261); let t270 = circuit_mul(t269, t266); let t271 = circuit_add(t197, t270); let t272 = circuit_sub(in242, in7); let t273 = circuit_mul(in0, t272); let t274 = circuit_sub(in242, in7); let t275 = circuit_mul(in2, t274); let t276 = circuit_inverse(t275); let t277 = circuit_mul(in63, t276); let t278 = circuit_add(in7, t277); let t279 = circuit_sub(in242, in0); let t280 = circuit_mul(t273, t279); let t281 = circuit_sub(in242, in0); let t282 = circuit_mul(in3, t281); let t283 = circuit_inverse(t282); let t284 = circuit_mul(in64, t283); let t285 = circuit_add(t278, t284); let t286 = circuit_sub(in242, in8); let t287 = circuit_mul(t280, t286); let t288 = circuit_sub(in242, in8); let t289 = circuit_mul(in4, t288); let t290 = circuit_inverse(t289); let t291 = circuit_mul(in65, t290); let t292 = circuit_add(t285, t291); let t293 = circuit_sub(in242, in9); let t294 = circuit_mul(t287, t293); let t295 = circuit_sub(in242, in9); let t296 = circuit_mul(in5, t295); let t297 = circuit_inverse(t296); let t298 = circuit_mul(in66, t297); let t299 = circuit_add(t292, t298); let t300 = circuit_sub(in242, in10); let t301 = circuit_mul(t294, t300); let t302 = circuit_sub(in242, in10); let t303 = circuit_mul(in6, t302); let t304 = circuit_inverse(t303); let t305 = circuit_mul(in67, t304); let t306 = circuit_add(t299, t305); let t307 = circuit_sub(in242, in11); let t308 = circuit_mul(t301, t307); let t309 = circuit_sub(in242, in11); let t310 = circuit_mul(in5, t309); let t311 = circuit_inverse(t310); let t312 = circuit_mul(in68, t311); let t313 = circuit_add(t306, t312); let t314 = circuit_sub(in242, in12); let t315 = circuit_mul(t308, t314); let t316 = circuit_sub(in242, in12); let t317 = circuit_mul(in4, t316); let t318 = circuit_inverse(t317); let t319 = circuit_mul(in69, t318); let t320 = circuit_add(t313, t319); let t321 = circuit_sub(in242, in13); let t322 = circuit_mul(t315, t321); let t323 = circuit_sub(in242, in13); let t324 = circuit_mul(in3, t323); let t325 = circuit_inverse(t324); let t326 = circuit_mul(in70, t325); let t327 = circuit_add(t320, t326); let t328 = circuit_sub(in242, in14); let t329 = circuit_mul(t322, t328); let t330 = circuit_sub(in242, in14); let t331 = circuit_mul(in2, t330); let t332 = circuit_inverse(t331); let t333 = circuit_mul(in71, t332); let t334 = circuit_add(t327, t333); let t335 = circuit_mul(t334, t329); let t336 = circuit_sub(t267, in0); let t337 = circuit_mul(in242, t336); let t338 = circuit_add(in0, t337); let t339 = circuit_mul(t265, t338); let t340 = circuit_mul(t266, in263); let t341 = circuit_mul(t267, t267); let t342 = circuit_add(in72, in73); let t343 = circuit_sub(t342, t335); let t344 = circuit_mul(t343, t340); let t345 = circuit_add(t271, t344); let t346 = circuit_sub(in243, in7); let t347 = circuit_mul(in0, t346); let t348 = circuit_sub(in243, in7); let t349 = circuit_mul(in2, t348); let t350 = circuit_inverse(t349); let t351 = circuit_mul(in72, t350); let t352 = circuit_add(in7, t351); let t353 = circuit_sub(in243, in0); let t354 = circuit_mul(t347, t353); let t355 = circuit_sub(in243, in0); let t356 = circuit_mul(in3, t355); let t357 = circuit_inverse(t356); let t358 = circuit_mul(in73, t357); let t359 = circuit_add(t352, t358); let t360 = circuit_sub(in243, in8); let t361 = circuit_mul(t354, t360); let t362 = circuit_sub(in243, in8); let t363 = circuit_mul(in4, t362); let t364 = circuit_inverse(t363); let t365 = circuit_mul(in74, t364); let t366 = circuit_add(t359, t365); let t367 = circuit_sub(in243, in9); let t368 = circuit_mul(t361, t367); let t369 = circuit_sub(in243, in9); let t370 = circuit_mul(in5, t369); let t371 = circuit_inverse(t370); let t372 = circuit_mul(in75, t371); let t373 = circuit_add(t366, t372); let t374 = circuit_sub(in243, in10); let t375 = circuit_mul(t368, t374); let t376 = circuit_sub(in243, in10); let t377 = circuit_mul(in6, t376); let t378 = circuit_inverse(t377); let t379 = circuit_mul(in76, t378); let t380 = circuit_add(t373, t379); let t381 = circuit_sub(in243, in11); let t382 = circuit_mul(t375, t381); let t383 = circuit_sub(in243, in11); let t384 = circuit_mul(in5, t383); let t385 = circuit_inverse(t384); let t386 = circuit_mul(in77, t385); let t387 = circuit_add(t380, t386); let t388 = circuit_sub(in243, in12); let t389 = circuit_mul(t382, t388); let t390 = circuit_sub(in243, in12); let t391 = circuit_mul(in4, t390); let t392 = circuit_inverse(t391); let t393 = circuit_mul(in78, t392); let t394 = circuit_add(t387, t393); let t395 = circuit_sub(in243, in13); let t396 = circuit_mul(t389, t395); let t397 = circuit_sub(in243, in13); let t398 = circuit_mul(in3, t397); let t399 = circuit_inverse(t398); let t400 = circuit_mul(in79, t399); let t401 = circuit_add(t394, t400); let t402 = circuit_sub(in243, in14); let t403 = circuit_mul(t396, t402); let t404 = circuit_sub(in243, in14); let t405 = circuit_mul(in2, t404); let t406 = circuit_inverse(t405); let t407 = circuit_mul(in80, t406); let t408 = circuit_add(t401, t407); let t409 = circuit_mul(t408, t403); let t410 = circuit_sub(t341, in0); let t411 = circuit_mul(in243, t410); let t412 = circuit_add(in0, t411); let t413 = circuit_mul(t339, t412); let t414 = circuit_mul(t340, in263); let t415 = circuit_mul(t341, t341); let t416 = circuit_add(in81, in82); let t417 = circuit_sub(t416, t409); let t418 = circuit_mul(t417, t414); let t419 = circuit_add(t345, t418); let t420 = circuit_sub(in244, in7); let t421 = circuit_mul(in0, t420); let t422 = circuit_sub(in244, in7); let t423 = circuit_mul(in2, t422); let t424 = circuit_inverse(t423); let t425 = circuit_mul(in81, t424); let t426 = circuit_add(in7, t425); let t427 = circuit_sub(in244, in0); let t428 = circuit_mul(t421, t427); let t429 = circuit_sub(in244, in0); let t430 = circuit_mul(in3, t429); let t431 = circuit_inverse(t430); let t432 = circuit_mul(in82, t431); let t433 = circuit_add(t426, t432); let t434 = circuit_sub(in244, in8); let t435 = circuit_mul(t428, t434); let t436 = circuit_sub(in244, in8); let t437 = circuit_mul(in4, t436); let t438 = circuit_inverse(t437); let t439 = circuit_mul(in83, t438); let t440 = circuit_add(t433, t439); let t441 = circuit_sub(in244, in9); let t442 = circuit_mul(t435, t441); let t443 = circuit_sub(in244, in9); let t444 = circuit_mul(in5, t443); let t445 = circuit_inverse(t444); let t446 = circuit_mul(in84, t445); let t447 = circuit_add(t440, t446); let t448 = circuit_sub(in244, in10); let t449 = circuit_mul(t442, t448); let t450 = circuit_sub(in244, in10); let t451 = circuit_mul(in6, t450); let t452 = circuit_inverse(t451); let t453 = circuit_mul(in85, t452); let t454 = circuit_add(t447, t453); let t455 = circuit_sub(in244, in11); let t456 = circuit_mul(t449, t455); let t457 = circuit_sub(in244, in11); let t458 = circuit_mul(in5, t457); let t459 = circuit_inverse(t458); let t460 = circuit_mul(in86, t459); let t461 = circuit_add(t454, t460); let t462 = circuit_sub(in244, in12); let t463 = circuit_mul(t456, t462); let t464 = circuit_sub(in244, in12); let t465 = circuit_mul(in4, t464); let t466 = circuit_inverse(t465); let t467 = circuit_mul(in87, t466); let t468 = circuit_add(t461, t467); let t469 = circuit_sub(in244, in13); let t470 = circuit_mul(t463, t469); let t471 = circuit_sub(in244, in13); let t472 = circuit_mul(in3, t471); let t473 = circuit_inverse(t472); let t474 = circuit_mul(in88, t473); let t475 = circuit_add(t468, t474); let t476 = circuit_sub(in244, in14); let t477 = circuit_mul(t470, t476); let t478 = circuit_sub(in244, in14); let t479 = circuit_mul(in2, t478); let t480 = circuit_inverse(t479); let t481 = circuit_mul(in89, t480); let t482 = circuit_add(t475, t481); let t483 = circuit_mul(t482, t477); let t484 = circuit_sub(t415, in0); let t485 = circuit_mul(in244, t484); let t486 = circuit_add(in0, t485); let t487 = circuit_mul(t413, t486); let t488 = circuit_mul(t414, in263); let t489 = circuit_mul(t415, t415); let t490 = circuit_add(in90, in91); let t491 = circuit_sub(t490, t483); let t492 = circuit_mul(t491, t488); let t493 = circuit_add(t419, t492); let t494 = circuit_sub(in245, in7); let t495 = circuit_mul(in0, t494); let t496 = circuit_sub(in245, in7); let t497 = circuit_mul(in2, t496); let t498 = circuit_inverse(t497); let t499 = circuit_mul(in90, t498); let t500 = circuit_add(in7, t499); let t501 = circuit_sub(in245, in0); let t502 = circuit_mul(t495, t501); let t503 = circuit_sub(in245, in0); let t504 = circuit_mul(in3, t503); let t505 = circuit_inverse(t504); let t506 = circuit_mul(in91, t505); let t507 = circuit_add(t500, t506); let t508 = circuit_sub(in245, in8); let t509 = circuit_mul(t502, t508); let t510 = circuit_sub(in245, in8); let t511 = circuit_mul(in4, t510); let t512 = circuit_inverse(t511); let t513 = circuit_mul(in92, t512); let t514 = circuit_add(t507, t513); let t515 = circuit_sub(in245, in9); let t516 = circuit_mul(t509, t515); let t517 = circuit_sub(in245, in9); let t518 = circuit_mul(in5, t517); let t519 = circuit_inverse(t518); let t520 = circuit_mul(in93, t519); let t521 = circuit_add(t514, t520); let t522 = circuit_sub(in245, in10); let t523 = circuit_mul(t516, t522); let t524 = circuit_sub(in245, in10); let t525 = circuit_mul(in6, t524); let t526 = circuit_inverse(t525); let t527 = circuit_mul(in94, t526); let t528 = circuit_add(t521, t527); let t529 = circuit_sub(in245, in11); let t530 = circuit_mul(t523, t529); let t531 = circuit_sub(in245, in11); let t532 = circuit_mul(in5, t531); let t533 = circuit_inverse(t532); let t534 = circuit_mul(in95, t533); let t535 = circuit_add(t528, t534); let t536 = circuit_sub(in245, in12); let t537 = circuit_mul(t530, t536); let t538 = circuit_sub(in245, in12); let t539 = circuit_mul(in4, t538); let t540 = circuit_inverse(t539); let t541 = circuit_mul(in96, t540); let t542 = circuit_add(t535, t541); let t543 = circuit_sub(in245, in13); let t544 = circuit_mul(t537, t543); let t545 = circuit_sub(in245, in13); let t546 = circuit_mul(in3, t545); let t547 = circuit_inverse(t546); let t548 = circuit_mul(in97, t547); let t549 = circuit_add(t542, t548); let t550 = circuit_sub(in245, in14); let t551 = circuit_mul(t544, t550); let t552 = circuit_sub(in245, in14); let t553 = circuit_mul(in2, t552); let t554 = circuit_inverse(t553); let t555 = circuit_mul(in98, t554); let t556 = circuit_add(t549, t555); let t557 = circuit_mul(t556, t551); let t558 = circuit_sub(t489, in0); let t559 = circuit_mul(in245, t558); let t560 = circuit_add(in0, t559); let t561 = circuit_mul(t487, t560); let t562 = circuit_mul(t488, in263); let t563 = circuit_mul(t489, t489); let t564 = circuit_add(in99, in100); let t565 = circuit_sub(t564, t557); let t566 = circuit_mul(t565, t562); let t567 = circuit_add(t493, t566); let t568 = circuit_sub(in246, in7); let t569 = circuit_mul(in0, t568); let t570 = circuit_sub(in246, in7); let t571 = circuit_mul(in2, t570); let t572 = circuit_inverse(t571); let t573 = circuit_mul(in99, t572); let t574 = circuit_add(in7, t573); let t575 = circuit_sub(in246, in0); let t576 = circuit_mul(t569, t575); let t577 = circuit_sub(in246, in0); let t578 = circuit_mul(in3, t577); let t579 = circuit_inverse(t578); let t580 = circuit_mul(in100, t579); let t581 = circuit_add(t574, t580); let t582 = circuit_sub(in246, in8); let t583 = circuit_mul(t576, t582); let t584 = circuit_sub(in246, in8); let t585 = circuit_mul(in4, t584); let t586 = circuit_inverse(t585); let t587 = circuit_mul(in101, t586); let t588 = circuit_add(t581, t587); let t589 = circuit_sub(in246, in9); let t590 = circuit_mul(t583, t589); let t591 = circuit_sub(in246, in9); let t592 = circuit_mul(in5, t591); let t593 = circuit_inverse(t592); let t594 = circuit_mul(in102, t593); let t595 = circuit_add(t588, t594); let t596 = circuit_sub(in246, in10); let t597 = circuit_mul(t590, t596); let t598 = circuit_sub(in246, in10); let t599 = circuit_mul(in6, t598); let t600 = circuit_inverse(t599); let t601 = circuit_mul(in103, t600); let t602 = circuit_add(t595, t601); let t603 = circuit_sub(in246, in11); let t604 = circuit_mul(t597, t603); let t605 = circuit_sub(in246, in11); let t606 = circuit_mul(in5, t605); let t607 = circuit_inverse(t606); let t608 = circuit_mul(in104, t607); let t609 = circuit_add(t602, t608); let t610 = circuit_sub(in246, in12); let t611 = circuit_mul(t604, t610); let t612 = circuit_sub(in246, in12); let t613 = circuit_mul(in4, t612); let t614 = circuit_inverse(t613); let t615 = circuit_mul(in105, t614); let t616 = circuit_add(t609, t615); let t617 = circuit_sub(in246, in13); let t618 = circuit_mul(t611, t617); let t619 = circuit_sub(in246, in13); let t620 = circuit_mul(in3, t619); let t621 = circuit_inverse(t620); let t622 = circuit_mul(in106, t621); let t623 = circuit_add(t616, t622); let t624 = circuit_sub(in246, in14); let t625 = circuit_mul(t618, t624); let t626 = circuit_sub(in246, in14); let t627 = circuit_mul(in2, t626); let t628 = circuit_inverse(t627); let t629 = circuit_mul(in107, t628); let t630 = circuit_add(t623, t629); let t631 = circuit_mul(t630, t625); let t632 = circuit_sub(t563, in0); let t633 = circuit_mul(in246, t632); let t634 = circuit_add(in0, t633); let t635 = circuit_mul(t561, t634); let t636 = circuit_mul(t562, in263); let t637 = circuit_mul(t563, t563); let t638 = circuit_add(in108, in109); let t639 = circuit_sub(t638, t631); let t640 = circuit_mul(t639, t636); let t641 = circuit_add(t567, t640); let t642 = circuit_sub(in247, in7); let t643 = circuit_mul(in0, t642); let t644 = circuit_sub(in247, in7); let t645 = circuit_mul(in2, t644); let t646 = circuit_inverse(t645); let t647 = circuit_mul(in108, t646); let t648 = circuit_add(in7, t647); let t649 = circuit_sub(in247, in0); let t650 = circuit_mul(t643, t649); let t651 = circuit_sub(in247, in0); let t652 = circuit_mul(in3, t651); let t653 = circuit_inverse(t652); let t654 = circuit_mul(in109, t653); let t655 = circuit_add(t648, t654); let t656 = circuit_sub(in247, in8); let t657 = circuit_mul(t650, t656); let t658 = circuit_sub(in247, in8); let t659 = circuit_mul(in4, t658); let t660 = circuit_inverse(t659); let t661 = circuit_mul(in110, t660); let t662 = circuit_add(t655, t661); let t663 = circuit_sub(in247, in9); let t664 = circuit_mul(t657, t663); let t665 = circuit_sub(in247, in9); let t666 = circuit_mul(in5, t665); let t667 = circuit_inverse(t666); let t668 = circuit_mul(in111, t667); let t669 = circuit_add(t662, t668); let t670 = circuit_sub(in247, in10); let t671 = circuit_mul(t664, t670); let t672 = circuit_sub(in247, in10); let t673 = circuit_mul(in6, t672); let t674 = circuit_inverse(t673); let t675 = circuit_mul(in112, t674); let t676 = circuit_add(t669, t675); let t677 = circuit_sub(in247, in11); let t678 = circuit_mul(t671, t677); let t679 = circuit_sub(in247, in11); let t680 = circuit_mul(in5, t679); let t681 = circuit_inverse(t680); let t682 = circuit_mul(in113, t681); let t683 = circuit_add(t676, t682); let t684 = circuit_sub(in247, in12); let t685 = circuit_mul(t678, t684); let t686 = circuit_sub(in247, in12); let t687 = circuit_mul(in4, t686); let t688 = circuit_inverse(t687); let t689 = circuit_mul(in114, t688); let t690 = circuit_add(t683, t689); let t691 = circuit_sub(in247, in13); let t692 = circuit_mul(t685, t691); let t693 = circuit_sub(in247, in13); let t694 = circuit_mul(in3, t693); let t695 = circuit_inverse(t694); let t696 = circuit_mul(in115, t695); let t697 = circuit_add(t690, t696); let t698 = circuit_sub(in247, in14); let t699 = circuit_mul(t692, t698); let t700 = circuit_sub(in247, in14); let t701 = circuit_mul(in2, t700); let t702 = circuit_inverse(t701); let t703 = circuit_mul(in116, t702); let t704 = circuit_add(t697, t703); let t705 = circuit_mul(t704, t699); let t706 = circuit_sub(t637, in0); let t707 = circuit_mul(in247, t706); let t708 = circuit_add(in0, t707); let t709 = circuit_mul(t635, t708); let t710 = circuit_mul(t636, in263); let t711 = circuit_mul(t637, t637); let t712 = circuit_add(in117, in118); let t713 = circuit_sub(t712, t705); let t714 = circuit_mul(t713, t710); let t715 = circuit_add(t641, t714); let t716 = circuit_sub(in248, in7); let t717 = circuit_mul(in0, t716); let t718 = circuit_sub(in248, in7); let t719 = circuit_mul(in2, t718); let t720 = circuit_inverse(t719); let t721 = circuit_mul(in117, t720); let t722 = circuit_add(in7, t721); let t723 = circuit_sub(in248, in0); let t724 = circuit_mul(t717, t723); let t725 = circuit_sub(in248, in0); let t726 = circuit_mul(in3, t725); let t727 = circuit_inverse(t726); let t728 = circuit_mul(in118, t727); let t729 = circuit_add(t722, t728); let t730 = circuit_sub(in248, in8); let t731 = circuit_mul(t724, t730); let t732 = circuit_sub(in248, in8); let t733 = circuit_mul(in4, t732); let t734 = circuit_inverse(t733); let t735 = circuit_mul(in119, t734); let t736 = circuit_add(t729, t735); let t737 = circuit_sub(in248, in9); let t738 = circuit_mul(t731, t737); let t739 = circuit_sub(in248, in9); let t740 = circuit_mul(in5, t739); let t741 = circuit_inverse(t740); let t742 = circuit_mul(in120, t741); let t743 = circuit_add(t736, t742); let t744 = circuit_sub(in248, in10); let t745 = circuit_mul(t738, t744); let t746 = circuit_sub(in248, in10); let t747 = circuit_mul(in6, t746); let t748 = circuit_inverse(t747); let t749 = circuit_mul(in121, t748); let t750 = circuit_add(t743, t749); let t751 = circuit_sub(in248, in11); let t752 = circuit_mul(t745, t751); let t753 = circuit_sub(in248, in11); let t754 = circuit_mul(in5, t753); let t755 = circuit_inverse(t754); let t756 = circuit_mul(in122, t755); let t757 = circuit_add(t750, t756); let t758 = circuit_sub(in248, in12); let t759 = circuit_mul(t752, t758); let t760 = circuit_sub(in248, in12); let t761 = circuit_mul(in4, t760); let t762 = circuit_inverse(t761); let t763 = circuit_mul(in123, t762); let t764 = circuit_add(t757, t763); let t765 = circuit_sub(in248, in13); let t766 = circuit_mul(t759, t765); let t767 = circuit_sub(in248, in13); let t768 = circuit_mul(in3, t767); let t769 = circuit_inverse(t768); let t770 = circuit_mul(in124, t769); let t771 = circuit_add(t764, t770); let t772 = circuit_sub(in248, in14); let t773 = circuit_mul(t766, t772); let t774 = circuit_sub(in248, in14); let t775 = circuit_mul(in2, t774); let t776 = circuit_inverse(t775); let t777 = circuit_mul(in125, t776); let t778 = circuit_add(t771, t777); let t779 = circuit_mul(t778, t773); let t780 = circuit_sub(t711, in0); let t781 = circuit_mul(in248, t780); let t782 = circuit_add(in0, t781); let t783 = circuit_mul(t709, t782); let t784 = circuit_mul(t710, in263); let t785 = circuit_mul(t711, t711); let t786 = circuit_add(in126, in127); let t787 = circuit_sub(t786, t779); let t788 = circuit_mul(t787, t784); let t789 = circuit_add(t715, t788); let t790 = circuit_sub(in249, in7); let t791 = circuit_mul(in0, t790); let t792 = circuit_sub(in249, in7); let t793 = circuit_mul(in2, t792); let t794 = circuit_inverse(t793); let t795 = circuit_mul(in126, t794); let t796 = circuit_add(in7, t795); let t797 = circuit_sub(in249, in0); let t798 = circuit_mul(t791, t797); let t799 = circuit_sub(in249, in0); let t800 = circuit_mul(in3, t799); let t801 = circuit_inverse(t800); let t802 = circuit_mul(in127, t801); let t803 = circuit_add(t796, t802); let t804 = circuit_sub(in249, in8); let t805 = circuit_mul(t798, t804); let t806 = circuit_sub(in249, in8); let t807 = circuit_mul(in4, t806); let t808 = circuit_inverse(t807); let t809 = circuit_mul(in128, t808); let t810 = circuit_add(t803, t809); let t811 = circuit_sub(in249, in9); let t812 = circuit_mul(t805, t811); let t813 = circuit_sub(in249, in9); let t814 = circuit_mul(in5, t813); let t815 = circuit_inverse(t814); let t816 = circuit_mul(in129, t815); let t817 = circuit_add(t810, t816); let t818 = circuit_sub(in249, in10); let t819 = circuit_mul(t812, t818); let t820 = circuit_sub(in249, in10); let t821 = circuit_mul(in6, t820); let t822 = circuit_inverse(t821); let t823 = circuit_mul(in130, t822); let t824 = circuit_add(t817, t823); let t825 = circuit_sub(in249, in11); let t826 = circuit_mul(t819, t825); let t827 = circuit_sub(in249, in11); let t828 = circuit_mul(in5, t827); let t829 = circuit_inverse(t828); let t830 = circuit_mul(in131, t829); let t831 = circuit_add(t824, t830); let t832 = circuit_sub(in249, in12); let t833 = circuit_mul(t826, t832); let t834 = circuit_sub(in249, in12); let t835 = circuit_mul(in4, t834); let t836 = circuit_inverse(t835); let t837 = circuit_mul(in132, t836); let t838 = circuit_add(t831, t837); let t839 = circuit_sub(in249, in13); let t840 = circuit_mul(t833, t839); let t841 = circuit_sub(in249, in13); let t842 = circuit_mul(in3, t841); let t843 = circuit_inverse(t842); let t844 = circuit_mul(in133, t843); let t845 = circuit_add(t838, t844); let t846 = circuit_sub(in249, in14); let t847 = circuit_mul(t840, t846); let t848 = circuit_sub(in249, in14); let t849 = circuit_mul(in2, t848); let t850 = circuit_inverse(t849); let t851 = circuit_mul(in134, t850); let t852 = circuit_add(t845, t851); let t853 = circuit_mul(t852, t847); let t854 = circuit_sub(t785, in0); let t855 = circuit_mul(in249, t854); let t856 = circuit_add(in0, t855); let t857 = circuit_mul(t783, t856); let t858 = circuit_mul(t784, in263); let t859 = circuit_mul(t785, t785); let t860 = circuit_add(in135, in136); let t861 = circuit_sub(t860, t853); let t862 = circuit_mul(t861, t858); let t863 = circuit_add(t789, t862); let t864 = circuit_sub(in250, in7); let t865 = circuit_mul(in0, t864); let t866 = circuit_sub(in250, in7); let t867 = circuit_mul(in2, t866); let t868 = circuit_inverse(t867); let t869 = circuit_mul(in135, t868); let t870 = circuit_add(in7, t869); let t871 = circuit_sub(in250, in0); let t872 = circuit_mul(t865, t871); let t873 = circuit_sub(in250, in0); let t874 = circuit_mul(in3, t873); let t875 = circuit_inverse(t874); let t876 = circuit_mul(in136, t875); let t877 = circuit_add(t870, t876); let t878 = circuit_sub(in250, in8); let t879 = circuit_mul(t872, t878); let t880 = circuit_sub(in250, in8); let t881 = circuit_mul(in4, t880); let t882 = circuit_inverse(t881); let t883 = circuit_mul(in137, t882); let t884 = circuit_add(t877, t883); let t885 = circuit_sub(in250, in9); let t886 = circuit_mul(t879, t885); let t887 = circuit_sub(in250, in9); let t888 = circuit_mul(in5, t887); let t889 = circuit_inverse(t888); let t890 = circuit_mul(in138, t889); let t891 = circuit_add(t884, t890); let t892 = circuit_sub(in250, in10); let t893 = circuit_mul(t886, t892); let t894 = circuit_sub(in250, in10); let t895 = circuit_mul(in6, t894); let t896 = circuit_inverse(t895); let t897 = circuit_mul(in139, t896); let t898 = circuit_add(t891, t897); let t899 = circuit_sub(in250, in11); let t900 = circuit_mul(t893, t899); let t901 = circuit_sub(in250, in11); let t902 = circuit_mul(in5, t901); let t903 = circuit_inverse(t902); let t904 = circuit_mul(in140, t903); let t905 = circuit_add(t898, t904); let t906 = circuit_sub(in250, in12); let t907 = circuit_mul(t900, t906); let t908 = circuit_sub(in250, in12); let t909 = circuit_mul(in4, t908); let t910 = circuit_inverse(t909); let t911 = circuit_mul(in141, t910); let t912 = circuit_add(t905, t911); let t913 = circuit_sub(in250, in13); let t914 = circuit_mul(t907, t913); let t915 = circuit_sub(in250, in13); let t916 = circuit_mul(in3, t915); let t917 = circuit_inverse(t916); let t918 = circuit_mul(in142, t917); let t919 = circuit_add(t912, t918); let t920 = circuit_sub(in250, in14); let t921 = circuit_mul(t914, t920); let t922 = circuit_sub(in250, in14); let t923 = circuit_mul(in2, t922); let t924 = circuit_inverse(t923); let t925 = circuit_mul(in143, t924); let t926 = circuit_add(t919, t925); let t927 = circuit_mul(t926, t921); let t928 = circuit_sub(t859, in0); let t929 = circuit_mul(in250, t928); let t930 = circuit_add(in0, t929); let t931 = circuit_mul(t857, t930); let t932 = circuit_mul(t858, in263); let t933 = circuit_mul(t859, t859); let t934 = circuit_add(in144, in145); let t935 = circuit_sub(t934, t927); let t936 = circuit_mul(t935, t932); let t937 = circuit_add(t863, t936); let t938 = circuit_sub(in251, in7); let t939 = circuit_mul(in0, t938); let t940 = circuit_sub(in251, in7); let t941 = circuit_mul(in2, t940); let t942 = circuit_inverse(t941); let t943 = circuit_mul(in144, t942); let t944 = circuit_add(in7, t943); let t945 = circuit_sub(in251, in0); let t946 = circuit_mul(t939, t945); let t947 = circuit_sub(in251, in0); let t948 = circuit_mul(in3, t947); let t949 = circuit_inverse(t948); let t950 = circuit_mul(in145, t949); let t951 = circuit_add(t944, t950); let t952 = circuit_sub(in251, in8); let t953 = circuit_mul(t946, t952); let t954 = circuit_sub(in251, in8); let t955 = circuit_mul(in4, t954); let t956 = circuit_inverse(t955); let t957 = circuit_mul(in146, t956); let t958 = circuit_add(t951, t957); let t959 = circuit_sub(in251, in9); let t960 = circuit_mul(t953, t959); let t961 = circuit_sub(in251, in9); let t962 = circuit_mul(in5, t961); let t963 = circuit_inverse(t962); let t964 = circuit_mul(in147, t963); let t965 = circuit_add(t958, t964); let t966 = circuit_sub(in251, in10); let t967 = circuit_mul(t960, t966); let t968 = circuit_sub(in251, in10); let t969 = circuit_mul(in6, t968); let t970 = circuit_inverse(t969); let t971 = circuit_mul(in148, t970); let t972 = circuit_add(t965, t971); let t973 = circuit_sub(in251, in11); let t974 = circuit_mul(t967, t973); let t975 = circuit_sub(in251, in11); let t976 = circuit_mul(in5, t975); let t977 = circuit_inverse(t976); let t978 = circuit_mul(in149, t977); let t979 = circuit_add(t972, t978); let t980 = circuit_sub(in251, in12); let t981 = circuit_mul(t974, t980); let t982 = circuit_sub(in251, in12); let t983 = circuit_mul(in4, t982); let t984 = circuit_inverse(t983); let t985 = circuit_mul(in150, t984); let t986 = circuit_add(t979, t985); let t987 = circuit_sub(in251, in13); let t988 = circuit_mul(t981, t987); let t989 = circuit_sub(in251, in13); let t990 = circuit_mul(in3, t989); let t991 = circuit_inverse(t990); let t992 = circuit_mul(in151, t991); let t993 = circuit_add(t986, t992); let t994 = circuit_sub(in251, in14); let t995 = circuit_mul(t988, t994); let t996 = circuit_sub(in251, in14); let t997 = circuit_mul(in2, t996); let t998 = circuit_inverse(t997); let t999 = circuit_mul(in152, t998); let t1000 = circuit_add(t993, t999); let t1001 = circuit_mul(t1000, t995); let t1002 = circuit_sub(t933, in0); let t1003 = circuit_mul(in251, t1002); let t1004 = circuit_add(in0, t1003); let t1005 = circuit_mul(t931, t1004); let t1006 = circuit_mul(t932, in263); let t1007 = circuit_mul(t933, t933); let t1008 = circuit_add(in153, in154); let t1009 = circuit_sub(t1008, t1001); let t1010 = circuit_mul(t1009, t1006); let t1011 = circuit_add(t937, t1010); let t1012 = circuit_sub(in252, in7); let t1013 = circuit_mul(in0, t1012); let t1014 = circuit_sub(in252, in7); let t1015 = circuit_mul(in2, t1014); let t1016 = circuit_inverse(t1015); let t1017 = circuit_mul(in153, t1016); let t1018 = circuit_add(in7, t1017); let t1019 = circuit_sub(in252, in0); let t1020 = circuit_mul(t1013, t1019); let t1021 = circuit_sub(in252, in0); let t1022 = circuit_mul(in3, t1021); let t1023 = circuit_inverse(t1022); let t1024 = circuit_mul(in154, t1023); let t1025 = circuit_add(t1018, t1024); let t1026 = circuit_sub(in252, in8); let t1027 = circuit_mul(t1020, t1026); let t1028 = circuit_sub(in252, in8); let t1029 = circuit_mul(in4, t1028); let t1030 = circuit_inverse(t1029); let t1031 = circuit_mul(in155, t1030); let t1032 = circuit_add(t1025, t1031); let t1033 = circuit_sub(in252, in9); let t1034 = circuit_mul(t1027, t1033); let t1035 = circuit_sub(in252, in9); let t1036 = circuit_mul(in5, t1035); let t1037 = circuit_inverse(t1036); let t1038 = circuit_mul(in156, t1037); let t1039 = circuit_add(t1032, t1038); let t1040 = circuit_sub(in252, in10); let t1041 = circuit_mul(t1034, t1040); let t1042 = circuit_sub(in252, in10); let t1043 = circuit_mul(in6, t1042); let t1044 = circuit_inverse(t1043); let t1045 = circuit_mul(in157, t1044); let t1046 = circuit_add(t1039, t1045); let t1047 = circuit_sub(in252, in11); let t1048 = circuit_mul(t1041, t1047); let t1049 = circuit_sub(in252, in11); let t1050 = circuit_mul(in5, t1049); let t1051 = circuit_inverse(t1050); let t1052 = circuit_mul(in158, t1051); let t1053 = circuit_add(t1046, t1052); let t1054 = circuit_sub(in252, in12); let t1055 = circuit_mul(t1048, t1054); let t1056 = circuit_sub(in252, in12); let t1057 = circuit_mul(in4, t1056); let t1058 = circuit_inverse(t1057); let t1059 = circuit_mul(in159, t1058); let t1060 = circuit_add(t1053, t1059); let t1061 = circuit_sub(in252, in13); let t1062 = circuit_mul(t1055, t1061); let t1063 = circuit_sub(in252, in13); let t1064 = circuit_mul(in3, t1063); let t1065 = circuit_inverse(t1064); let t1066 = circuit_mul(in160, t1065); let t1067 = circuit_add(t1060, t1066); let t1068 = circuit_sub(in252, in14); let t1069 = circuit_mul(t1062, t1068); let t1070 = circuit_sub(in252, in14); let t1071 = circuit_mul(in2, t1070); let t1072 = circuit_inverse(t1071); let t1073 = circuit_mul(in161, t1072); let t1074 = circuit_add(t1067, t1073); let t1075 = circuit_mul(t1074, t1069); let t1076 = circuit_sub(t1007, in0); let t1077 = circuit_mul(in252, t1076); let t1078 = circuit_add(in0, t1077); let t1079 = circuit_mul(t1005, t1078); let t1080 = circuit_mul(t1006, in263); let t1081 = circuit_mul(t1007, t1007); let t1082 = circuit_add(in162, in163); let t1083 = circuit_sub(t1082, t1075); let t1084 = circuit_mul(t1083, t1080); let t1085 = circuit_add(t1011, t1084); let t1086 = circuit_sub(in253, in7); let t1087 = circuit_mul(in0, t1086); let t1088 = circuit_sub(in253, in7); let t1089 = circuit_mul(in2, t1088); let t1090 = circuit_inverse(t1089); let t1091 = circuit_mul(in162, t1090); let t1092 = circuit_add(in7, t1091); let t1093 = circuit_sub(in253, in0); let t1094 = circuit_mul(t1087, t1093); let t1095 = circuit_sub(in253, in0); let t1096 = circuit_mul(in3, t1095); let t1097 = circuit_inverse(t1096); let t1098 = circuit_mul(in163, t1097); let t1099 = circuit_add(t1092, t1098); let t1100 = circuit_sub(in253, in8); let t1101 = circuit_mul(t1094, t1100); let t1102 = circuit_sub(in253, in8); let t1103 = circuit_mul(in4, t1102); let t1104 = circuit_inverse(t1103); let t1105 = circuit_mul(in164, t1104); let t1106 = circuit_add(t1099, t1105); let t1107 = circuit_sub(in253, in9); let t1108 = circuit_mul(t1101, t1107); let t1109 = circuit_sub(in253, in9); let t1110 = circuit_mul(in5, t1109); let t1111 = circuit_inverse(t1110); let t1112 = circuit_mul(in165, t1111); let t1113 = circuit_add(t1106, t1112); let t1114 = circuit_sub(in253, in10); let t1115 = circuit_mul(t1108, t1114); let t1116 = circuit_sub(in253, in10); let t1117 = circuit_mul(in6, t1116); let t1118 = circuit_inverse(t1117); let t1119 = circuit_mul(in166, t1118); let t1120 = circuit_add(t1113, t1119); let t1121 = circuit_sub(in253, in11); let t1122 = circuit_mul(t1115, t1121); let t1123 = circuit_sub(in253, in11); let t1124 = circuit_mul(in5, t1123); let t1125 = circuit_inverse(t1124); let t1126 = circuit_mul(in167, t1125); let t1127 = circuit_add(t1120, t1126); let t1128 = circuit_sub(in253, in12); let t1129 = circuit_mul(t1122, t1128); let t1130 = circuit_sub(in253, in12); let t1131 = circuit_mul(in4, t1130); let t1132 = circuit_inverse(t1131); let t1133 = circuit_mul(in168, t1132); let t1134 = circuit_add(t1127, t1133); let t1135 = circuit_sub(in253, in13); let t1136 = circuit_mul(t1129, t1135); let t1137 = circuit_sub(in253, in13); let t1138 = circuit_mul(in3, t1137); let t1139 = circuit_inverse(t1138); let t1140 = circuit_mul(in169, t1139); let t1141 = circuit_add(t1134, t1140); let t1142 = circuit_sub(in253, in14); let t1143 = circuit_mul(t1136, t1142); let t1144 = circuit_sub(in253, in14); let t1145 = circuit_mul(in2, t1144); let t1146 = circuit_inverse(t1145); let t1147 = circuit_mul(in170, t1146); let t1148 = circuit_add(t1141, t1147); let t1149 = circuit_mul(t1148, t1143); let t1150 = circuit_sub(t1081, in0); let t1151 = circuit_mul(in253, t1150); let t1152 = circuit_add(in0, t1151); let t1153 = circuit_mul(t1079, t1152); let t1154 = circuit_mul(t1080, in263); let t1155 = circuit_mul(t1081, t1081); let t1156 = circuit_add(in171, in172); let t1157 = circuit_sub(t1156, t1149); let t1158 = circuit_mul(t1157, t1154); let t1159 = circuit_add(t1085, t1158); let t1160 = circuit_sub(in254, in7); let t1161 = circuit_mul(in0, t1160); let t1162 = circuit_sub(in254, in7); let t1163 = circuit_mul(in2, t1162); let t1164 = circuit_inverse(t1163); let t1165 = circuit_mul(in171, t1164); let t1166 = circuit_add(in7, t1165); let t1167 = circuit_sub(in254, in0); let t1168 = circuit_mul(t1161, t1167); let t1169 = circuit_sub(in254, in0); let t1170 = circuit_mul(in3, t1169); let t1171 = circuit_inverse(t1170); let t1172 = circuit_mul(in172, t1171); let t1173 = circuit_add(t1166, t1172); let t1174 = circuit_sub(in254, in8); let t1175 = circuit_mul(t1168, t1174); let t1176 = circuit_sub(in254, in8); let t1177 = circuit_mul(in4, t1176); let t1178 = circuit_inverse(t1177); let t1179 = circuit_mul(in173, t1178); let t1180 = circuit_add(t1173, t1179); let t1181 = circuit_sub(in254, in9); let t1182 = circuit_mul(t1175, t1181); let t1183 = circuit_sub(in254, in9); let t1184 = circuit_mul(in5, t1183); let t1185 = circuit_inverse(t1184); let t1186 = circuit_mul(in174, t1185); let t1187 = circuit_add(t1180, t1186); let t1188 = circuit_sub(in254, in10); let t1189 = circuit_mul(t1182, t1188); let t1190 = circuit_sub(in254, in10); let t1191 = circuit_mul(in6, t1190); let t1192 = circuit_inverse(t1191); let t1193 = circuit_mul(in175, t1192); let t1194 = circuit_add(t1187, t1193); let t1195 = circuit_sub(in254, in11); let t1196 = circuit_mul(t1189, t1195); let t1197 = circuit_sub(in254, in11); let t1198 = circuit_mul(in5, t1197); let t1199 = circuit_inverse(t1198); let t1200 = circuit_mul(in176, t1199); let t1201 = circuit_add(t1194, t1200); let t1202 = circuit_sub(in254, in12); let t1203 = circuit_mul(t1196, t1202); let t1204 = circuit_sub(in254, in12); let t1205 = circuit_mul(in4, t1204); let t1206 = circuit_inverse(t1205); let t1207 = circuit_mul(in177, t1206); let t1208 = circuit_add(t1201, t1207); let t1209 = circuit_sub(in254, in13); let t1210 = circuit_mul(t1203, t1209); let t1211 = circuit_sub(in254, in13); let t1212 = circuit_mul(in3, t1211); let t1213 = circuit_inverse(t1212); let t1214 = circuit_mul(in178, t1213); let t1215 = circuit_add(t1208, t1214); let t1216 = circuit_sub(in254, in14); let t1217 = circuit_mul(t1210, t1216); let t1218 = circuit_sub(in254, in14); let t1219 = circuit_mul(in2, t1218); let t1220 = circuit_inverse(t1219); let t1221 = circuit_mul(in179, t1220); let t1222 = circuit_add(t1215, t1221); let t1223 = circuit_mul(t1222, t1217); let t1224 = circuit_sub(t1155, in0); let t1225 = circuit_mul(in254, t1224); let t1226 = circuit_add(in0, t1225); let t1227 = circuit_mul(t1153, t1226); let t1228 = circuit_mul(t1154, in263); let t1229 = circuit_mul(t1155, t1155); let t1230 = circuit_add(in180, in181); let t1231 = circuit_sub(t1230, t1223); let t1232 = circuit_mul(t1231, t1228); let t1233 = circuit_add(t1159, t1232); let t1234 = circuit_sub(in255, in7); let t1235 = circuit_mul(in0, t1234); let t1236 = circuit_sub(in255, in7); let t1237 = circuit_mul(in2, t1236); let t1238 = circuit_inverse(t1237); let t1239 = circuit_mul(in180, t1238); let t1240 = circuit_add(in7, t1239); let t1241 = circuit_sub(in255, in0); let t1242 = circuit_mul(t1235, t1241); let t1243 = circuit_sub(in255, in0); let t1244 = circuit_mul(in3, t1243); let t1245 = circuit_inverse(t1244); let t1246 = circuit_mul(in181, t1245); let t1247 = circuit_add(t1240, t1246); let t1248 = circuit_sub(in255, in8); let t1249 = circuit_mul(t1242, t1248); let t1250 = circuit_sub(in255, in8); let t1251 = circuit_mul(in4, t1250); let t1252 = circuit_inverse(t1251); let t1253 = circuit_mul(in182, t1252); let t1254 = circuit_add(t1247, t1253); let t1255 = circuit_sub(in255, in9); let t1256 = circuit_mul(t1249, t1255); let t1257 = circuit_sub(in255, in9); let t1258 = circuit_mul(in5, t1257); let t1259 = circuit_inverse(t1258); let t1260 = circuit_mul(in183, t1259); let t1261 = circuit_add(t1254, t1260); let t1262 = circuit_sub(in255, in10); let t1263 = circuit_mul(t1256, t1262); let t1264 = circuit_sub(in255, in10); let t1265 = circuit_mul(in6, t1264); let t1266 = circuit_inverse(t1265); let t1267 = circuit_mul(in184, t1266); let t1268 = circuit_add(t1261, t1267); let t1269 = circuit_sub(in255, in11); let t1270 = circuit_mul(t1263, t1269); let t1271 = circuit_sub(in255, in11); let t1272 = circuit_mul(in5, t1271); let t1273 = circuit_inverse(t1272); let t1274 = circuit_mul(in185, t1273); let t1275 = circuit_add(t1268, t1274); let t1276 = circuit_sub(in255, in12); let t1277 = circuit_mul(t1270, t1276); let t1278 = circuit_sub(in255, in12); let t1279 = circuit_mul(in4, t1278); let t1280 = circuit_inverse(t1279); let t1281 = circuit_mul(in186, t1280); let t1282 = circuit_add(t1275, t1281); let t1283 = circuit_sub(in255, in13); let t1284 = circuit_mul(t1277, t1283); let t1285 = circuit_sub(in255, in13); let t1286 = circuit_mul(in3, t1285); let t1287 = circuit_inverse(t1286); let t1288 = circuit_mul(in187, t1287); let t1289 = circuit_add(t1282, t1288); let t1290 = circuit_sub(in255, in14); let t1291 = circuit_mul(t1284, t1290); let t1292 = circuit_sub(in255, in14); let t1293 = circuit_mul(in2, t1292); let t1294 = circuit_inverse(t1293); let t1295 = circuit_mul(in188, t1294); let t1296 = circuit_add(t1289, t1295); let t1297 = circuit_mul(t1296, t1291); let t1298 = circuit_sub(t1229, in0); let t1299 = circuit_mul(in255, t1298); let t1300 = circuit_add(in0, t1299); let t1301 = circuit_mul(t1227, t1300); let t1302 = circuit_mul(t1228, in263); let t1303 = circuit_mul(t1229, t1229); let t1304 = circuit_add(in189, in190); let t1305 = circuit_sub(t1304, t1297); let t1306 = circuit_mul(t1305, t1302); let t1307 = circuit_add(t1233, t1306); let t1308 = circuit_sub(in256, in7); let t1309 = circuit_mul(in0, t1308); let t1310 = circuit_sub(in256, in7); let t1311 = circuit_mul(in2, t1310); let t1312 = circuit_inverse(t1311); let t1313 = circuit_mul(in189, t1312); let t1314 = circuit_add(in7, t1313); let t1315 = circuit_sub(in256, in0); let t1316 = circuit_mul(t1309, t1315); let t1317 = circuit_sub(in256, in0); let t1318 = circuit_mul(in3, t1317); let t1319 = circuit_inverse(t1318); let t1320 = circuit_mul(in190, t1319); let t1321 = circuit_add(t1314, t1320); let t1322 = circuit_sub(in256, in8); let t1323 = circuit_mul(t1316, t1322); let t1324 = circuit_sub(in256, in8); let t1325 = circuit_mul(in4, t1324); let t1326 = circuit_inverse(t1325); let t1327 = circuit_mul(in191, t1326); let t1328 = circuit_add(t1321, t1327); let t1329 = circuit_sub(in256, in9); let t1330 = circuit_mul(t1323, t1329); let t1331 = circuit_sub(in256, in9); let t1332 = circuit_mul(in5, t1331); let t1333 = circuit_inverse(t1332); let t1334 = circuit_mul(in192, t1333); let t1335 = circuit_add(t1328, t1334); let t1336 = circuit_sub(in256, in10); let t1337 = circuit_mul(t1330, t1336); let t1338 = circuit_sub(in256, in10); let t1339 = circuit_mul(in6, t1338); let t1340 = circuit_inverse(t1339); let t1341 = circuit_mul(in193, t1340); let t1342 = circuit_add(t1335, t1341); let t1343 = circuit_sub(in256, in11); let t1344 = circuit_mul(t1337, t1343); let t1345 = circuit_sub(in256, in11); let t1346 = circuit_mul(in5, t1345); let t1347 = circuit_inverse(t1346); let t1348 = circuit_mul(in194, t1347); let t1349 = circuit_add(t1342, t1348); let t1350 = circuit_sub(in256, in12); let t1351 = circuit_mul(t1344, t1350); let t1352 = circuit_sub(in256, in12); let t1353 = circuit_mul(in4, t1352); let t1354 = circuit_inverse(t1353); let t1355 = circuit_mul(in195, t1354); let t1356 = circuit_add(t1349, t1355); let t1357 = circuit_sub(in256, in13); let t1358 = circuit_mul(t1351, t1357); let t1359 = circuit_sub(in256, in13); let t1360 = circuit_mul(in3, t1359); let t1361 = circuit_inverse(t1360); let t1362 = circuit_mul(in196, t1361); let t1363 = circuit_add(t1356, t1362); let t1364 = circuit_sub(in256, in14); let t1365 = circuit_mul(t1358, t1364); let t1366 = circuit_sub(in256, in14); let t1367 = circuit_mul(in2, t1366); let t1368 = circuit_inverse(t1367); let t1369 = circuit_mul(in197, t1368); let t1370 = circuit_add(t1363, t1369); let t1371 = circuit_mul(t1370, t1365); let t1372 = circuit_sub(t1303, in0); let t1373 = circuit_mul(in256, t1372); let t1374 = circuit_add(in0, t1373); let t1375 = circuit_mul(t1301, t1374); let t1376 = circuit_sub(in205, in9); let t1377 = circuit_mul(t1376, in198); let t1378 = circuit_mul(t1377, in227); let t1379 = circuit_mul(t1378, in226); let t1380 = circuit_mul(t1379, in15); let t1381 = circuit_mul(in200, in226); let t1382 = circuit_mul(in201, in227); let t1383 = circuit_mul(in202, in228); let t1384 = circuit_mul(in203, in229); let t1385 = circuit_add(t1380, t1381); let t1386 = circuit_add(t1385, t1382); let t1387 = circuit_add(t1386, t1383); let t1388 = circuit_add(t1387, t1384); let t1389 = circuit_add(t1388, in199); let t1390 = circuit_sub(in205, in0); let t1391 = circuit_mul(t1390, in237); let t1392 = circuit_add(t1389, t1391); let t1393 = circuit_mul(t1392, in205); let t1394 = circuit_mul(t1393, t1375); let t1395 = circuit_add(in226, in229); let t1396 = circuit_add(t1395, in198); let t1397 = circuit_sub(t1396, in234); let t1398 = circuit_sub(in205, in8); let t1399 = circuit_mul(t1397, t1398); let t1400 = circuit_sub(in205, in0); let t1401 = circuit_mul(t1399, t1400); let t1402 = circuit_mul(t1401, in205); let t1403 = circuit_mul(t1402, t1375); let t1404 = circuit_mul(in216, in261); let t1405 = circuit_add(in226, t1404); let t1406 = circuit_add(t1405, in262); let t1407 = circuit_mul(in217, in261); let t1408 = circuit_add(in227, t1407); let t1409 = circuit_add(t1408, in262); let t1410 = circuit_mul(t1406, t1409); let t1411 = circuit_mul(in218, in261); let t1412 = circuit_add(in228, t1411); let t1413 = circuit_add(t1412, in262); let t1414 = circuit_mul(t1410, t1413); let t1415 = circuit_mul(in219, in261); let t1416 = circuit_add(in229, t1415); let t1417 = circuit_add(t1416, in262); let t1418 = circuit_mul(t1414, t1417); let t1419 = circuit_mul(in212, in261); let t1420 = circuit_add(in226, t1419); let t1421 = circuit_add(t1420, in262); let t1422 = circuit_mul(in213, in261); let t1423 = circuit_add(in227, t1422); let t1424 = circuit_add(t1423, in262); let t1425 = circuit_mul(t1421, t1424); let t1426 = circuit_mul(in214, in261); let t1427 = circuit_add(in228, t1426); let t1428 = circuit_add(t1427, in262); let t1429 = circuit_mul(t1425, t1428); let t1430 = circuit_mul(in215, in261); let t1431 = circuit_add(in229, t1430); let t1432 = circuit_add(t1431, in262); let t1433 = circuit_mul(t1429, t1432); let t1434 = circuit_add(in230, in224); let t1435 = circuit_mul(t1418, t1434); let t1436 = circuit_mul(in225, t119); let t1437 = circuit_add(in238, t1436); let t1438 = circuit_mul(t1433, t1437); let t1439 = circuit_sub(t1435, t1438); let t1440 = circuit_mul(t1439, t1375); let t1441 = circuit_mul(in225, in238); let t1442 = circuit_mul(t1441, t1375); let t1443 = circuit_mul(in221, in258); let t1444 = circuit_mul(in222, in259); let t1445 = circuit_mul(in223, in260); let t1446 = circuit_add(in220, in262); let t1447 = circuit_add(t1446, t1443); let t1448 = circuit_add(t1447, t1444); let t1449 = circuit_add(t1448, t1445); let t1450 = circuit_mul(in201, in234); let t1451 = circuit_add(in226, in262); let t1452 = circuit_add(t1451, t1450); let t1453 = circuit_mul(in198, in235); let t1454 = circuit_add(in227, t1453); let t1455 = circuit_mul(in199, in236); let t1456 = circuit_add(in228, t1455); let t1457 = circuit_mul(t1454, in258); let t1458 = circuit_mul(t1456, in259); let t1459 = circuit_mul(in202, in260); let t1460 = circuit_add(t1452, t1457); let t1461 = circuit_add(t1460, t1458); let t1462 = circuit_add(t1461, t1459); let t1463 = circuit_mul(in231, t1449); let t1464 = circuit_mul(in231, t1462); let t1465 = circuit_add(in233, in204); let t1466 = circuit_mul(in233, in204); let t1467 = circuit_sub(t1465, t1466); let t1468 = circuit_mul(t1462, t1449); let t1469 = circuit_mul(t1468, in231); let t1470 = circuit_sub(t1469, t1467); let t1471 = circuit_mul(t1470, t1375); let t1472 = circuit_mul(in204, t1463); let t1473 = circuit_mul(in232, t1464); let t1474 = circuit_sub(t1472, t1473); let t1475 = circuit_mul(in233, in233); let t1476 = circuit_sub(t1475, in233); let t1477 = circuit_mul(t1476, t1375); let t1478 = circuit_mul(in206, t1375); let t1479 = circuit_sub(in227, in226); let t1480 = circuit_sub(in228, in227); let t1481 = circuit_sub(in229, in228); let t1482 = circuit_sub(in234, in229); let t1483 = circuit_add(t1479, in16); let t1484 = circuit_add(t1483, in16); let t1485 = circuit_add(t1484, in16); let t1486 = circuit_mul(t1479, t1483); let t1487 = circuit_mul(t1486, t1484); let t1488 = circuit_mul(t1487, t1485); let t1489 = circuit_mul(t1488, t1478); let t1490 = circuit_add(t1480, in16); let t1491 = circuit_add(t1490, in16); let t1492 = circuit_add(t1491, in16); let t1493 = circuit_mul(t1480, t1490); let t1494 = circuit_mul(t1493, t1491); let t1495 = circuit_mul(t1494, t1492); let t1496 = circuit_mul(t1495, t1478); let t1497 = circuit_add(t1481, in16); let t1498 = circuit_add(t1497, in16); let t1499 = circuit_add(t1498, in16); let t1500 = circuit_mul(t1481, t1497); let t1501 = circuit_mul(t1500, t1498); let t1502 = circuit_mul(t1501, t1499); let t1503 = circuit_mul(t1502, t1478); let t1504 = circuit_add(t1482, in16); let t1505 = circuit_add(t1504, in16); let t1506 = circuit_add(t1505, in16); let t1507 = circuit_mul(t1482, t1504); let t1508 = circuit_mul(t1507, t1505); let t1509 = circuit_mul(t1508, t1506); let t1510 = circuit_mul(t1509, t1478); let t1511 = circuit_sub(in234, in227); let t1512 = circuit_mul(in228, in228); let t1513 = circuit_mul(in237, in237); let t1514 = circuit_mul(in228, in237); let t1515 = circuit_mul(t1514, in200); let t1516 = circuit_add(in235, in234); let t1517 = circuit_add(t1516, in227); let t1518 = circuit_mul(t1517, t1511); let t1519 = circuit_mul(t1518, t1511); let t1520 = circuit_sub(t1519, t1513); let t1521 = circuit_sub(t1520, t1512); let t1522 = circuit_add(t1521, t1515); let t1523 = circuit_add(t1522, t1515); let t1524 = circuit_sub(in0, in198); let t1525 = circuit_mul(t1523, t1375); let t1526 = circuit_mul(t1525, in207); let t1527 = circuit_mul(t1526, t1524); let t1528 = circuit_add(in228, in236); let t1529 = circuit_mul(in237, in200); let t1530 = circuit_sub(t1529, in228); let t1531 = circuit_mul(t1528, t1511); let t1532 = circuit_sub(in235, in227); let t1533 = circuit_mul(t1532, t1530); let t1534 = circuit_add(t1531, t1533); let t1535 = circuit_mul(t1534, t1375); let t1536 = circuit_mul(t1535, in207); let t1537 = circuit_mul(t1536, t1524); let t1538 = circuit_add(t1512, in17); let t1539 = circuit_mul(t1538, in227); let t1540 = circuit_add(t1512, t1512); let t1541 = circuit_add(t1540, t1540); let t1542 = circuit_mul(t1539, in18); let t1543 = circuit_add(in235, in227); let t1544 = circuit_add(t1543, in227); let t1545 = circuit_mul(t1544, t1541); let t1546 = circuit_sub(t1545, t1542); let t1547 = circuit_mul(t1546, t1375); let t1548 = circuit_mul(t1547, in207); let t1549 = circuit_mul(t1548, in198); let t1550 = circuit_add(t1527, t1549); let t1551 = circuit_add(in227, in227); let t1552 = circuit_add(t1551, in227); let t1553 = circuit_mul(t1552, in227); let t1554 = circuit_sub(in227, in235); let t1555 = circuit_mul(t1553, t1554); let t1556 = circuit_add(in228, in228); let t1557 = circuit_add(in228, in236); let t1558 = circuit_mul(t1556, t1557); let t1559 = circuit_sub(t1555, t1558); let t1560 = circuit_mul(t1559, t1375); let t1561 = circuit_mul(t1560, in207); let t1562 = circuit_mul(t1561, in198); let t1563 = circuit_add(t1537, t1562); let t1564 = circuit_mul(in228, in260); let t1565 = circuit_mul(in227, in259); let t1566 = circuit_add(t1564, t1565); let t1567 = circuit_mul(in226, in258); let t1568 = circuit_add(t1566, t1567); let t1569 = circuit_add(t1568, in199); let t1570 = circuit_sub(t1569, in229); let t1571 = circuit_sub(in234, in226); let t1572 = circuit_sub(in237, in229); let t1573 = circuit_sub(t1571, in0); let t1574 = circuit_mul(t1571, t1573); let t1575 = circuit_mul(t1571, in16); let t1576 = circuit_add(t1575, in0); let t1577 = circuit_mul(t1576, t1572); let t1578 = circuit_mul(in200, in201); let t1579 = circuit_mul(in208, t1375); let t1580 = circuit_mul(t1578, t1579); let t1581 = circuit_mul(t1577, t1580); let t1582 = circuit_mul(t1574, t1580); let t1583 = circuit_mul(t1570, t1578); let t1584 = circuit_sub(in229, t1569); let t1585 = circuit_sub(t1584, in0); let t1586 = circuit_mul(t1584, t1585); let t1587 = circuit_mul(in236, in260); let t1588 = circuit_mul(in235, in259); let t1589 = circuit_mul(in234, in258); let t1590 = circuit_add(t1587, t1588); let t1591 = circuit_add(t1590, t1589); let t1592 = circuit_sub(in237, t1591); let t1593 = circuit_sub(in236, in228); let t1594 = circuit_mul(t1571, in16); let t1595 = circuit_add(t1594, in0); let t1596 = circuit_mul(t1592, in16); let t1597 = circuit_add(t1596, in0); let t1598 = circuit_mul(t1595, t1593); let t1599 = circuit_mul(t1598, t1597); let t1600 = circuit_mul(t1592, t1592); let t1601 = circuit_sub(t1600, t1592); let t1602 = circuit_mul(in202, t1579); let t1603 = circuit_mul(t1599, t1602); let t1604 = circuit_mul(t1574, t1602); let t1605 = circuit_mul(t1601, t1602); let t1606 = circuit_mul(t1586, in202); let t1607 = circuit_sub(in235, in227); let t1608 = circuit_mul(t1571, in16); let t1609 = circuit_add(t1608, in0); let t1610 = circuit_mul(t1609, t1607); let t1611 = circuit_sub(t1610, in228); let t1612 = circuit_mul(in203, in200); let t1613 = circuit_mul(t1611, t1612); let t1614 = circuit_mul(in198, in200); let t1615 = circuit_mul(t1570, t1614); let t1616 = circuit_add(t1583, t1613); let t1617 = circuit_add(t1616, t1615); let t1618 = circuit_add(t1617, t1606); let t1619 = circuit_mul(t1618, t1579); let t1620 = circuit_mul(in226, in235); let t1621 = circuit_mul(in234, in227); let t1622 = circuit_add(t1620, t1621); let t1623 = circuit_mul(in226, in229); let t1624 = circuit_mul(in227, in228); let t1625 = circuit_add(t1623, t1624); let t1626 = circuit_sub(t1625, in236); let t1627 = circuit_mul(t1626, in19); let t1628 = circuit_sub(t1627, in237); let t1629 = circuit_add(t1628, t1622); let t1630 = circuit_mul(t1629, in203); let t1631 = circuit_mul(t1622, in19); let t1632 = circuit_mul(in234, in235); let t1633 = circuit_add(t1631, t1632); let t1634 = circuit_add(in228, in229); let t1635 = circuit_sub(t1633, t1634); let t1636 = circuit_mul(t1635, in202); let t1637 = circuit_add(t1633, in229); let t1638 = circuit_add(in236, in237); let t1639 = circuit_sub(t1637, t1638); let t1640 = circuit_mul(t1639, in198); let t1641 = circuit_add(t1636, t1630); let t1642 = circuit_add(t1641, t1640); let t1643 = circuit_mul(t1642, in201); let t1644 = circuit_mul(in235, in20); let t1645 = circuit_add(t1644, in234); let t1646 = circuit_mul(t1645, in20); let t1647 = circuit_add(t1646, in228); let t1648 = circuit_mul(t1647, in20); let t1649 = circuit_add(t1648, in227); let t1650 = circuit_mul(t1649, in20); let t1651 = circuit_add(t1650, in226); let t1652 = circuit_sub(t1651, in229); let t1653 = circuit_mul(t1652, in203); let t1654 = circuit_mul(in236, in20); let t1655 = circuit_add(t1654, in235); let t1656 = circuit_mul(t1655, in20); let t1657 = circuit_add(t1656, in234); let t1658 = circuit_mul(t1657, in20); let t1659 = circuit_add(t1658, in229); let t1660 = circuit_mul(t1659, in20); let t1661 = circuit_add(t1660, in228); let t1662 = circuit_sub(t1661, in237); let t1663 = circuit_mul(t1662, in198); let t1664 = circuit_add(t1653, t1663); let t1665 = circuit_mul(t1664, in202); let t1666 = circuit_add(t1643, t1665); let t1667 = circuit_mul(t1666, in209); let t1668 = circuit_mul(t1667, t1375); let t1669 = circuit_add(in226, in200); let t1670 = circuit_add(in227, in201); let t1671 = circuit_add(in228, in202); let t1672 = circuit_add(in229, in203); let t1673 = circuit_mul(t1669, t1669); let t1674 = circuit_mul(t1673, t1673); let t1675 = circuit_mul(t1674, t1669); let t1676 = circuit_mul(t1670, t1670); let t1677 = circuit_mul(t1676, t1676); let t1678 = circuit_mul(t1677, t1670); let t1679 = circuit_mul(t1671, t1671); let t1680 = circuit_mul(t1679, t1679); let t1681 = circuit_mul(t1680, t1671); let t1682 = circuit_mul(t1672, t1672); let t1683 = circuit_mul(t1682, t1682); let t1684 = circuit_mul(t1683, t1672); let t1685 = circuit_add(t1675, t1678); let t1686 = circuit_add(t1681, t1684); let t1687 = circuit_add(t1678, t1678); let t1688 = circuit_add(t1687, t1686); let t1689 = circuit_add(t1684, t1684); let t1690 = circuit_add(t1689, t1685); let t1691 = circuit_add(t1686, t1686); let t1692 = circuit_add(t1691, t1691); let t1693 = circuit_add(t1692, t1690); let t1694 = circuit_add(t1685, t1685); let t1695 = circuit_add(t1694, t1694); let t1696 = circuit_add(t1695, t1688); let t1697 = circuit_add(t1690, t1696); let t1698 = circuit_add(t1688, t1693); let t1699 = circuit_mul(in210, t1375); let t1700 = circuit_sub(t1697, in234); let t1701 = circuit_mul(t1699, t1700); let t1702 = circuit_sub(t1696, in235); let t1703 = circuit_mul(t1699, t1702); let t1704 = circuit_sub(t1698, in236); let t1705 = circuit_mul(t1699, t1704); let t1706 = circuit_sub(t1693, in237); let t1707 = circuit_mul(t1699, t1706); let t1708 = circuit_add(in226, in200); let t1709 = circuit_mul(t1708, t1708); let t1710 = circuit_mul(t1709, t1709); let t1711 = circuit_mul(t1710, t1708); let t1712 = circuit_add(t1711, in227); let t1713 = circuit_add(t1712, in228); let t1714 = circuit_add(t1713, in229); let t1715 = circuit_mul(in211, t1375); let t1716 = circuit_mul(t1711, in21); let t1717 = circuit_add(t1716, t1714); let t1718 = circuit_sub(t1717, in234); let t1719 = circuit_mul(t1715, t1718); let t1720 = circuit_mul(in227, in22); let t1721 = circuit_add(t1720, t1714); let t1722 = circuit_sub(t1721, in235); let t1723 = circuit_mul(t1715, t1722); let t1724 = circuit_mul(in228, in23); let t1725 = circuit_add(t1724, t1714); let t1726 = circuit_sub(t1725, in236); let t1727 = circuit_mul(t1715, t1726); let t1728 = circuit_mul(in229, in24); let t1729 = circuit_add(t1728, t1714); let t1730 = circuit_sub(t1729, in237); let t1731 = circuit_mul(t1715, t1730); let t1732 = circuit_mul(t1403, in264); let t1733 = circuit_add(t1394, t1732); let t1734 = circuit_mul(in264, in264); let t1735 = circuit_mul(t1440, t1734); let t1736 = circuit_add(t1733, t1735); let t1737 = circuit_mul(t1734, in264); let t1738 = circuit_mul(t1442, t1737); let t1739 = circuit_add(t1736, t1738); let t1740 = circuit_mul(t1737, in264); let t1741 = circuit_mul(t1471, t1740); let t1742 = circuit_add(t1739, t1741); let t1743 = circuit_mul(t1740, in264); let t1744 = circuit_mul(t1474, t1743); let t1745 = circuit_add(t1742, t1744); let t1746 = circuit_mul(t1743, in264); let t1747 = circuit_mul(t1477, t1746); let t1748 = circuit_add(t1745, t1747); let t1749 = circuit_mul(t1746, in264); let t1750 = circuit_mul(t1489, t1749); let t1751 = circuit_add(t1748, t1750); let t1752 = circuit_mul(t1749, in264); let t1753 = circuit_mul(t1496, t1752); let t1754 = circuit_add(t1751, t1753); let t1755 = circuit_mul(t1752, in264); let t1756 = circuit_mul(t1503, t1755); let t1757 = circuit_add(t1754, t1756); let t1758 = circuit_mul(t1755, in264); let t1759 = circuit_mul(t1510, t1758); let t1760 = circuit_add(t1757, t1759); let t1761 = circuit_mul(t1758, in264); let t1762 = circuit_mul(t1550, t1761); let t1763 = circuit_add(t1760, t1762); let t1764 = circuit_mul(t1761, in264); let t1765 = circuit_mul(t1563, t1764); let t1766 = circuit_add(t1763, t1765); let t1767 = circuit_mul(t1764, in264); let t1768 = circuit_mul(t1619, t1767); let t1769 = circuit_add(t1766, t1768); let t1770 = circuit_mul(t1767, in264); let t1771 = circuit_mul(t1581, t1770); let t1772 = circuit_add(t1769, t1771); let t1773 = circuit_mul(t1770, in264); let t1774 = circuit_mul(t1582, t1773); let t1775 = circuit_add(t1772, t1774); let t1776 = circuit_mul(t1773, in264); let t1777 = circuit_mul(t1603, t1776); let t1778 = circuit_add(t1775, t1777); let t1779 = circuit_mul(t1776, in264); let t1780 = circuit_mul(t1604, t1779); let t1781 = circuit_add(t1778, t1780); let t1782 = circuit_mul(t1779, in264); let t1783 = circuit_mul(t1605, t1782); let t1784 = circuit_add(t1781, t1783); let t1785 = circuit_mul(t1782, in264); let t1786 = circuit_mul(t1668, t1785); let t1787 = circuit_add(t1784, t1786); let t1788 = circuit_mul(t1785, in264); let t1789 = circuit_mul(t1701, t1788); let t1790 = circuit_add(t1787, t1789); let t1791 = circuit_mul(t1788, in264); let t1792 = circuit_mul(t1703, t1791); let t1793 = circuit_add(t1790, t1792); let t1794 = circuit_mul(t1791, in264); let t1795 = circuit_mul(t1705, t1794); let t1796 = circuit_add(t1793, t1795); let t1797 = circuit_mul(t1794, in264); let t1798 = circuit_mul(t1707, t1797); let t1799 = circuit_add(t1796, t1798); let t1800 = circuit_mul(t1797, in264); let t1801 = circuit_mul(t1719, t1800); let t1802 = circuit_add(t1799, t1801); let t1803 = circuit_mul(t1800, in264); let t1804 = circuit_mul(t1723, t1803); let t1805 = circuit_add(t1802, t1804); let t1806 = circuit_mul(t1803, in264); let t1807 = circuit_mul(t1727, t1806); let t1808 = circuit_add(t1805, t1807); let t1809 = circuit_mul(t1806, in264); let t1810 = circuit_mul(t1731, t1809); let t1811 = circuit_add(t1808, t1810); let t1812 = circuit_mul(in242, in243); let t1813 = circuit_mul(t1812, in244); let t1814 = circuit_mul(t1813, in245); let t1815 = circuit_mul(t1814, in246); let t1816 = circuit_mul(t1815, in247); let t1817 = circuit_mul(t1816, in248); let t1818 = circuit_mul(t1817, in249); let t1819 = circuit_mul(t1818, in250); let t1820 = circuit_mul(t1819, in251); let t1821 = circuit_mul(t1820, in252); let t1822 = circuit_mul(t1821, in253); let t1823 = circuit_mul(t1822, in254); let t1824 = circuit_mul(t1823, in255); let t1825 = circuit_mul(t1824, in256); let t1826 = circuit_sub(in0, t1825); let t1827 = circuit_mul(t1811, t1826); let t1828 = circuit_mul(in239, in265); let t1829 = circuit_add(t1827, t1828); let t1830 = circuit_sub(t1829, t1371); let modulus = modulus; let mut circuit_inputs = (t1307, t1830).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(ZK_HONK_SUMCHECK_SIZE_17_PUB_19_GRUMPKIN_CONSTANTS.span()); // in0 - in24 // Fill inputs: for val in p_public_inputs { circuit_inputs = circuit_inputs.next_u256(*val); } // in25 - in27 for val in p_pairing_point_object { circuit_inputs = circuit_inputs.next_u256(*val); } // in28 - in43 circuit_inputs = circuit_inputs.next_2(libra_sum); // in44 for val in sumcheck_univariates_flat { circuit_inputs = circuit_inputs.next_u256(*val); } // in45 - in197 for val in sumcheck_evaluations { circuit_inputs = circuit_inputs.next_u256(*val); } // in198 - in238 circuit_inputs = circuit_inputs.next_2(libra_evaluation); // in239 for val in tp_sum_check_u_challenges { circuit_inputs = circuit_inputs.next_u128(*val); } // in240 - in256 circuit_inputs = circuit_inputs.next_u128(tp_gate_challenge); // in257 circuit_inputs = circuit_inputs.next_2(tp_eta_1); // in258 circuit_inputs = circuit_inputs.next_2(tp_eta_2); // in259 circuit_inputs = circuit_inputs.next_2(tp_eta_3); // in260 circuit_inputs = circuit_inputs.next_2(tp_beta); // in261 circuit_inputs = circuit_inputs.next_2(tp_gamma); // in262 circuit_inputs = circuit_inputs.next_2(tp_base_rlc); // in263 circuit_inputs = circuit_inputs.next_u128(tp_alpha); // in264 circuit_inputs = circuit_inputs.next_2(tp_libra_challenge); // in265 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let check_rlc: u384 = outputs.get_output(t1307); let check: u384 = outputs.get_output(t1830); return (check_rlc, check); } const ZK_HONK_SUMCHECK_SIZE_17_PUB_19_GRUMPKIN_CONSTANTS: [u384; 25] = [ u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x10000000, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x9d80, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x79b9709143e1f593efffec51, limb1: 0xb85045b68181585d2833e848, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x5a0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x79b9709143e1f593effffd31, limb1: 0xb85045b68181585d2833e848, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x240, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x2, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x3, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x4, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x5, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x6, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x7, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x8, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x3cdcb848a1f0fac9f8000000, limb1: 0xdc2822db40c0ac2e9419f424, limb2: 0x183227397098d014, limb3: 0x0, }, u384 { limb0: 0x79b9709143e1f593f0000000, limb1: 0xb85045b68181585d2833e848, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x11, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x9, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x100000000000000000, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x4000, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x29ca1d7fb56821fd19d3b6e7, limb1: 0x4b1e03b4bd9490c0d03f989, limb2: 0x10dc6e9c006ea38b, limb3: 0x0, }, u384 { limb0: 0xd4dd9b84a86b38cfb45a740b, limb1: 0x149b3d0a30b3bb599df9756, limb2: 0xc28145b6a44df3e, limb3: 0x0, }, u384 { limb0: 0x60e3596170067d00141cac15, limb1: 0xb2c7645a50392798b21f75bb, limb2: 0x544b8338791518, limb3: 0x0, }, u384 { limb0: 0xb8fa852613bc534433ee428b, limb1: 0x2e2e82eb122789e352e105a3, limb2: 0x222c01175718386f, limb3: 0x0, }, ]; #[inline(always)] pub fn run_GRUMPKIN_ZKHONK_PREP_MSM_SCALARS_SIZE_17_circuit( p_sumcheck_evaluations: Span, p_gemini_masking_eval: u384, p_gemini_a_evaluations: Span, p_libra_poly_evals: Span, tp_gemini_r: u384, tp_rho: u384, tp_shplonk_z: u384, tp_shplonk_nu: u384, tp_sum_check_u_challenges: Span, modulus: core::circuit::CircuitModulus, ) -> ( u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, ) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x1 let in2 = CE::> {}; // 0x7b0c561a6148404f086204a9f36ffb0617942546750f230c893619174a57a76 // INPUT stack let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let (in24, in25, in26) = (CE::> {}, CE::> {}, CE::> {}); let (in27, in28, in29) = (CE::> {}, CE::> {}, CE::> {}); let (in30, in31, in32) = (CE::> {}, CE::> {}, CE::> {}); let (in33, in34, in35) = (CE::> {}, CE::> {}, CE::> {}); let (in36, in37, in38) = (CE::> {}, CE::> {}, CE::> {}); let (in39, in40, in41) = (CE::> {}, CE::> {}, CE::> {}); let (in42, in43, in44) = (CE::> {}, CE::> {}, CE::> {}); let (in45, in46, in47) = (CE::> {}, CE::> {}, CE::> {}); let (in48, in49, in50) = (CE::> {}, CE::> {}, CE::> {}); let (in51, in52, in53) = (CE::> {}, CE::> {}, CE::> {}); let (in54, in55, in56) = (CE::> {}, CE::> {}, CE::> {}); let (in57, in58, in59) = (CE::> {}, CE::> {}, CE::> {}); let (in60, in61, in62) = (CE::> {}, CE::> {}, CE::> {}); let (in63, in64, in65) = (CE::> {}, CE::> {}, CE::> {}); let (in66, in67, in68) = (CE::> {}, CE::> {}, CE::> {}); let (in69, in70, in71) = (CE::> {}, CE::> {}, CE::> {}); let (in72, in73, in74) = (CE::> {}, CE::> {}, CE::> {}); let (in75, in76, in77) = (CE::> {}, CE::> {}, CE::> {}); let (in78, in79, in80) = (CE::> {}, CE::> {}, CE::> {}); let (in81, in82, in83) = (CE::> {}, CE::> {}, CE::> {}); let (in84, in85, in86) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_mul(in66, in66); let t1 = circuit_mul(t0, t0); let t2 = circuit_mul(t1, t1); let t3 = circuit_mul(t2, t2); let t4 = circuit_mul(t3, t3); let t5 = circuit_mul(t4, t4); let t6 = circuit_mul(t5, t5); let t7 = circuit_mul(t6, t6); let t8 = circuit_mul(t7, t7); let t9 = circuit_mul(t8, t8); let t10 = circuit_mul(t9, t9); let t11 = circuit_mul(t10, t10); let t12 = circuit_mul(t11, t11); let t13 = circuit_mul(t12, t12); let t14 = circuit_mul(t13, t13); let t15 = circuit_mul(t14, t14); let t16 = circuit_sub(in68, in66); let t17 = circuit_inverse(t16); let t18 = circuit_add(in68, in66); let t19 = circuit_inverse(t18); let t20 = circuit_mul(in69, t19); let t21 = circuit_add(t17, t20); let t22 = circuit_inverse(in66); let t23 = circuit_mul(in69, t19); let t24 = circuit_sub(t17, t23); let t25 = circuit_mul(t22, t24); let t26 = circuit_sub(in0, t25); let t27 = circuit_sub(in0, t21); let t28 = circuit_mul(t27, in67); let t29 = circuit_mul(in3, in67); let t30 = circuit_add(in44, t29); let t31 = circuit_mul(in67, in67); let t32 = circuit_mul(t27, t31); let t33 = circuit_mul(in4, t31); let t34 = circuit_add(t30, t33); let t35 = circuit_mul(t31, in67); let t36 = circuit_mul(t27, t35); let t37 = circuit_mul(in5, t35); let t38 = circuit_add(t34, t37); let t39 = circuit_mul(t35, in67); let t40 = circuit_mul(t27, t39); let t41 = circuit_mul(in6, t39); let t42 = circuit_add(t38, t41); let t43 = circuit_mul(t39, in67); let t44 = circuit_mul(t27, t43); let t45 = circuit_mul(in7, t43); let t46 = circuit_add(t42, t45); let t47 = circuit_mul(t43, in67); let t48 = circuit_mul(t27, t47); let t49 = circuit_mul(in8, t47); let t50 = circuit_add(t46, t49); let t51 = circuit_mul(t47, in67); let t52 = circuit_mul(t27, t51); let t53 = circuit_mul(in9, t51); let t54 = circuit_add(t50, t53); let t55 = circuit_mul(t51, in67); let t56 = circuit_mul(t27, t55); let t57 = circuit_mul(in10, t55); let t58 = circuit_add(t54, t57); let t59 = circuit_mul(t55, in67); let t60 = circuit_mul(t27, t59); let t61 = circuit_mul(in11, t59); let t62 = circuit_add(t58, t61); let t63 = circuit_mul(t59, in67); let t64 = circuit_mul(t27, t63); let t65 = circuit_mul(in12, t63); let t66 = circuit_add(t62, t65); let t67 = circuit_mul(t63, in67); let t68 = circuit_mul(t27, t67); let t69 = circuit_mul(in13, t67); let t70 = circuit_add(t66, t69); let t71 = circuit_mul(t67, in67); let t72 = circuit_mul(t27, t71); let t73 = circuit_mul(in14, t71); let t74 = circuit_add(t70, t73); let t75 = circuit_mul(t71, in67); let t76 = circuit_mul(t27, t75); let t77 = circuit_mul(in15, t75); let t78 = circuit_add(t74, t77); let t79 = circuit_mul(t75, in67); let t80 = circuit_mul(t27, t79); let t81 = circuit_mul(in16, t79); let t82 = circuit_add(t78, t81); let t83 = circuit_mul(t79, in67); let t84 = circuit_mul(t27, t83); let t85 = circuit_mul(in17, t83); let t86 = circuit_add(t82, t85); let t87 = circuit_mul(t83, in67); let t88 = circuit_mul(t27, t87); let t89 = circuit_mul(in18, t87); let t90 = circuit_add(t86, t89); let t91 = circuit_mul(t87, in67); let t92 = circuit_mul(t27, t91); let t93 = circuit_mul(in19, t91); let t94 = circuit_add(t90, t93); let t95 = circuit_mul(t91, in67); let t96 = circuit_mul(t27, t95); let t97 = circuit_mul(in20, t95); let t98 = circuit_add(t94, t97); let t99 = circuit_mul(t95, in67); let t100 = circuit_mul(t27, t99); let t101 = circuit_mul(in21, t99); let t102 = circuit_add(t98, t101); let t103 = circuit_mul(t99, in67); let t104 = circuit_mul(t27, t103); let t105 = circuit_mul(in22, t103); let t106 = circuit_add(t102, t105); let t107 = circuit_mul(t103, in67); let t108 = circuit_mul(t27, t107); let t109 = circuit_mul(in23, t107); let t110 = circuit_add(t106, t109); let t111 = circuit_mul(t107, in67); let t112 = circuit_mul(t27, t111); let t113 = circuit_mul(in24, t111); let t114 = circuit_add(t110, t113); let t115 = circuit_mul(t111, in67); let t116 = circuit_mul(t27, t115); let t117 = circuit_mul(in25, t115); let t118 = circuit_add(t114, t117); let t119 = circuit_mul(t115, in67); let t120 = circuit_mul(t27, t119); let t121 = circuit_mul(in26, t119); let t122 = circuit_add(t118, t121); let t123 = circuit_mul(t119, in67); let t124 = circuit_mul(t27, t123); let t125 = circuit_mul(in27, t123); let t126 = circuit_add(t122, t125); let t127 = circuit_mul(t123, in67); let t128 = circuit_mul(t27, t127); let t129 = circuit_mul(in28, t127); let t130 = circuit_add(t126, t129); let t131 = circuit_mul(t127, in67); let t132 = circuit_mul(t27, t131); let t133 = circuit_mul(in29, t131); let t134 = circuit_add(t130, t133); let t135 = circuit_mul(t131, in67); let t136 = circuit_mul(t27, t135); let t137 = circuit_mul(in30, t135); let t138 = circuit_add(t134, t137); let t139 = circuit_mul(t135, in67); let t140 = circuit_mul(t27, t139); let t141 = circuit_mul(in31, t139); let t142 = circuit_add(t138, t141); let t143 = circuit_mul(t139, in67); let t144 = circuit_mul(t27, t143); let t145 = circuit_mul(in32, t143); let t146 = circuit_add(t142, t145); let t147 = circuit_mul(t143, in67); let t148 = circuit_mul(t27, t147); let t149 = circuit_mul(in33, t147); let t150 = circuit_add(t146, t149); let t151 = circuit_mul(t147, in67); let t152 = circuit_mul(t27, t151); let t153 = circuit_mul(in34, t151); let t154 = circuit_add(t150, t153); let t155 = circuit_mul(t151, in67); let t156 = circuit_mul(t27, t155); let t157 = circuit_mul(in35, t155); let t158 = circuit_add(t154, t157); let t159 = circuit_mul(t155, in67); let t160 = circuit_mul(t27, t159); let t161 = circuit_mul(in36, t159); let t162 = circuit_add(t158, t161); let t163 = circuit_mul(t159, in67); let t164 = circuit_mul(t27, t163); let t165 = circuit_mul(in37, t163); let t166 = circuit_add(t162, t165); let t167 = circuit_mul(t163, in67); let t168 = circuit_mul(t27, t167); let t169 = circuit_mul(in38, t167); let t170 = circuit_add(t166, t169); let t171 = circuit_mul(t167, in67); let t172 = circuit_mul(t26, t171); let t173 = circuit_add(t140, t172); let t174 = circuit_mul(in39, t171); let t175 = circuit_add(t170, t174); let t176 = circuit_mul(t171, in67); let t177 = circuit_mul(t26, t176); let t178 = circuit_add(t144, t177); let t179 = circuit_mul(in40, t176); let t180 = circuit_add(t175, t179); let t181 = circuit_mul(t176, in67); let t182 = circuit_mul(t26, t181); let t183 = circuit_add(t148, t182); let t184 = circuit_mul(in41, t181); let t185 = circuit_add(t180, t184); let t186 = circuit_mul(t181, in67); let t187 = circuit_mul(t26, t186); let t188 = circuit_add(t152, t187); let t189 = circuit_mul(in42, t186); let t190 = circuit_add(t185, t189); let t191 = circuit_mul(t186, in67); let t192 = circuit_mul(t26, t191); let t193 = circuit_add(t156, t192); let t194 = circuit_mul(in43, t191); let t195 = circuit_add(t190, t194); let t196 = circuit_sub(in1, in86); let t197 = circuit_mul(t15, t196); let t198 = circuit_mul(t15, t195); let t199 = circuit_add(t198, t198); let t200 = circuit_sub(t197, in86); let t201 = circuit_mul(in61, t200); let t202 = circuit_sub(t199, t201); let t203 = circuit_add(t197, in86); let t204 = circuit_inverse(t203); let t205 = circuit_mul(t202, t204); let t206 = circuit_sub(in1, in85); let t207 = circuit_mul(t14, t206); let t208 = circuit_mul(t14, t205); let t209 = circuit_add(t208, t208); let t210 = circuit_sub(t207, in85); let t211 = circuit_mul(in60, t210); let t212 = circuit_sub(t209, t211); let t213 = circuit_add(t207, in85); let t214 = circuit_inverse(t213); let t215 = circuit_mul(t212, t214); let t216 = circuit_sub(in1, in84); let t217 = circuit_mul(t13, t216); let t218 = circuit_mul(t13, t215); let t219 = circuit_add(t218, t218); let t220 = circuit_sub(t217, in84); let t221 = circuit_mul(in59, t220); let t222 = circuit_sub(t219, t221); let t223 = circuit_add(t217, in84); let t224 = circuit_inverse(t223); let t225 = circuit_mul(t222, t224); let t226 = circuit_sub(in1, in83); let t227 = circuit_mul(t12, t226); let t228 = circuit_mul(t12, t225); let t229 = circuit_add(t228, t228); let t230 = circuit_sub(t227, in83); let t231 = circuit_mul(in58, t230); let t232 = circuit_sub(t229, t231); let t233 = circuit_add(t227, in83); let t234 = circuit_inverse(t233); let t235 = circuit_mul(t232, t234); let t236 = circuit_sub(in1, in82); let t237 = circuit_mul(t11, t236); let t238 = circuit_mul(t11, t235); let t239 = circuit_add(t238, t238); let t240 = circuit_sub(t237, in82); let t241 = circuit_mul(in57, t240); let t242 = circuit_sub(t239, t241); let t243 = circuit_add(t237, in82); let t244 = circuit_inverse(t243); let t245 = circuit_mul(t242, t244); let t246 = circuit_sub(in1, in81); let t247 = circuit_mul(t10, t246); let t248 = circuit_mul(t10, t245); let t249 = circuit_add(t248, t248); let t250 = circuit_sub(t247, in81); let t251 = circuit_mul(in56, t250); let t252 = circuit_sub(t249, t251); let t253 = circuit_add(t247, in81); let t254 = circuit_inverse(t253); let t255 = circuit_mul(t252, t254); let t256 = circuit_sub(in1, in80); let t257 = circuit_mul(t9, t256); let t258 = circuit_mul(t9, t255); let t259 = circuit_add(t258, t258); let t260 = circuit_sub(t257, in80); let t261 = circuit_mul(in55, t260); let t262 = circuit_sub(t259, t261); let t263 = circuit_add(t257, in80); let t264 = circuit_inverse(t263); let t265 = circuit_mul(t262, t264); let t266 = circuit_sub(in1, in79); let t267 = circuit_mul(t8, t266); let t268 = circuit_mul(t8, t265); let t269 = circuit_add(t268, t268); let t270 = circuit_sub(t267, in79); let t271 = circuit_mul(in54, t270); let t272 = circuit_sub(t269, t271); let t273 = circuit_add(t267, in79); let t274 = circuit_inverse(t273); let t275 = circuit_mul(t272, t274); let t276 = circuit_sub(in1, in78); let t277 = circuit_mul(t7, t276); let t278 = circuit_mul(t7, t275); let t279 = circuit_add(t278, t278); let t280 = circuit_sub(t277, in78); let t281 = circuit_mul(in53, t280); let t282 = circuit_sub(t279, t281); let t283 = circuit_add(t277, in78); let t284 = circuit_inverse(t283); let t285 = circuit_mul(t282, t284); let t286 = circuit_sub(in1, in77); let t287 = circuit_mul(t6, t286); let t288 = circuit_mul(t6, t285); let t289 = circuit_add(t288, t288); let t290 = circuit_sub(t287, in77); let t291 = circuit_mul(in52, t290); let t292 = circuit_sub(t289, t291); let t293 = circuit_add(t287, in77); let t294 = circuit_inverse(t293); let t295 = circuit_mul(t292, t294); let t296 = circuit_sub(in1, in76); let t297 = circuit_mul(t5, t296); let t298 = circuit_mul(t5, t295); let t299 = circuit_add(t298, t298); let t300 = circuit_sub(t297, in76); let t301 = circuit_mul(in51, t300); let t302 = circuit_sub(t299, t301); let t303 = circuit_add(t297, in76); let t304 = circuit_inverse(t303); let t305 = circuit_mul(t302, t304); let t306 = circuit_sub(in1, in75); let t307 = circuit_mul(t4, t306); let t308 = circuit_mul(t4, t305); let t309 = circuit_add(t308, t308); let t310 = circuit_sub(t307, in75); let t311 = circuit_mul(in50, t310); let t312 = circuit_sub(t309, t311); let t313 = circuit_add(t307, in75); let t314 = circuit_inverse(t313); let t315 = circuit_mul(t312, t314); let t316 = circuit_sub(in1, in74); let t317 = circuit_mul(t3, t316); let t318 = circuit_mul(t3, t315); let t319 = circuit_add(t318, t318); let t320 = circuit_sub(t317, in74); let t321 = circuit_mul(in49, t320); let t322 = circuit_sub(t319, t321); let t323 = circuit_add(t317, in74); let t324 = circuit_inverse(t323); let t325 = circuit_mul(t322, t324); let t326 = circuit_sub(in1, in73); let t327 = circuit_mul(t2, t326); let t328 = circuit_mul(t2, t325); let t329 = circuit_add(t328, t328); let t330 = circuit_sub(t327, in73); let t331 = circuit_mul(in48, t330); let t332 = circuit_sub(t329, t331); let t333 = circuit_add(t327, in73); let t334 = circuit_inverse(t333); let t335 = circuit_mul(t332, t334); let t336 = circuit_sub(in1, in72); let t337 = circuit_mul(t1, t336); let t338 = circuit_mul(t1, t335); let t339 = circuit_add(t338, t338); let t340 = circuit_sub(t337, in72); let t341 = circuit_mul(in47, t340); let t342 = circuit_sub(t339, t341); let t343 = circuit_add(t337, in72); let t344 = circuit_inverse(t343); let t345 = circuit_mul(t342, t344); let t346 = circuit_sub(in1, in71); let t347 = circuit_mul(t0, t346); let t348 = circuit_mul(t0, t345); let t349 = circuit_add(t348, t348); let t350 = circuit_sub(t347, in71); let t351 = circuit_mul(in46, t350); let t352 = circuit_sub(t349, t351); let t353 = circuit_add(t347, in71); let t354 = circuit_inverse(t353); let t355 = circuit_mul(t352, t354); let t356 = circuit_sub(in1, in70); let t357 = circuit_mul(in66, t356); let t358 = circuit_mul(in66, t355); let t359 = circuit_add(t358, t358); let t360 = circuit_sub(t357, in70); let t361 = circuit_mul(in45, t360); let t362 = circuit_sub(t359, t361); let t363 = circuit_add(t357, in70); let t364 = circuit_inverse(t363); let t365 = circuit_mul(t362, t364); let t366 = circuit_mul(t365, t17); let t367 = circuit_mul(in45, in69); let t368 = circuit_mul(t367, t19); let t369 = circuit_add(t366, t368); let t370 = circuit_mul(in69, in69); let t371 = circuit_sub(in68, t0); let t372 = circuit_inverse(t371); let t373 = circuit_add(in68, t0); let t374 = circuit_inverse(t373); let t375 = circuit_mul(t370, t372); let t376 = circuit_mul(in69, t374); let t377 = circuit_mul(t370, t376); let t378 = circuit_add(t377, t375); let t379 = circuit_sub(in0, t378); let t380 = circuit_mul(t377, in46); let t381 = circuit_mul(t375, t355); let t382 = circuit_add(t380, t381); let t383 = circuit_add(t369, t382); let t384 = circuit_mul(in69, in69); let t385 = circuit_mul(t370, t384); let t386 = circuit_sub(in68, t1); let t387 = circuit_inverse(t386); let t388 = circuit_add(in68, t1); let t389 = circuit_inverse(t388); let t390 = circuit_mul(t385, t387); let t391 = circuit_mul(in69, t389); let t392 = circuit_mul(t385, t391); let t393 = circuit_add(t392, t390); let t394 = circuit_sub(in0, t393); let t395 = circuit_mul(t392, in47); let t396 = circuit_mul(t390, t345); let t397 = circuit_add(t395, t396); let t398 = circuit_add(t383, t397); let t399 = circuit_mul(in69, in69); let t400 = circuit_mul(t385, t399); let t401 = circuit_sub(in68, t2); let t402 = circuit_inverse(t401); let t403 = circuit_add(in68, t2); let t404 = circuit_inverse(t403); let t405 = circuit_mul(t400, t402); let t406 = circuit_mul(in69, t404); let t407 = circuit_mul(t400, t406); let t408 = circuit_add(t407, t405); let t409 = circuit_sub(in0, t408); let t410 = circuit_mul(t407, in48); let t411 = circuit_mul(t405, t335); let t412 = circuit_add(t410, t411); let t413 = circuit_add(t398, t412); let t414 = circuit_mul(in69, in69); let t415 = circuit_mul(t400, t414); let t416 = circuit_sub(in68, t3); let t417 = circuit_inverse(t416); let t418 = circuit_add(in68, t3); let t419 = circuit_inverse(t418); let t420 = circuit_mul(t415, t417); let t421 = circuit_mul(in69, t419); let t422 = circuit_mul(t415, t421); let t423 = circuit_add(t422, t420); let t424 = circuit_sub(in0, t423); let t425 = circuit_mul(t422, in49); let t426 = circuit_mul(t420, t325); let t427 = circuit_add(t425, t426); let t428 = circuit_add(t413, t427); let t429 = circuit_mul(in69, in69); let t430 = circuit_mul(t415, t429); let t431 = circuit_sub(in68, t4); let t432 = circuit_inverse(t431); let t433 = circuit_add(in68, t4); let t434 = circuit_inverse(t433); let t435 = circuit_mul(t430, t432); let t436 = circuit_mul(in69, t434); let t437 = circuit_mul(t430, t436); let t438 = circuit_add(t437, t435); let t439 = circuit_sub(in0, t438); let t440 = circuit_mul(t437, in50); let t441 = circuit_mul(t435, t315); let t442 = circuit_add(t440, t441); let t443 = circuit_add(t428, t442); let t444 = circuit_mul(in69, in69); let t445 = circuit_mul(t430, t444); let t446 = circuit_sub(in68, t5); let t447 = circuit_inverse(t446); let t448 = circuit_add(in68, t5); let t449 = circuit_inverse(t448); let t450 = circuit_mul(t445, t447); let t451 = circuit_mul(in69, t449); let t452 = circuit_mul(t445, t451); let t453 = circuit_add(t452, t450); let t454 = circuit_sub(in0, t453); let t455 = circuit_mul(t452, in51); let t456 = circuit_mul(t450, t305); let t457 = circuit_add(t455, t456); let t458 = circuit_add(t443, t457); let t459 = circuit_mul(in69, in69); let t460 = circuit_mul(t445, t459); let t461 = circuit_sub(in68, t6); let t462 = circuit_inverse(t461); let t463 = circuit_add(in68, t6); let t464 = circuit_inverse(t463); let t465 = circuit_mul(t460, t462); let t466 = circuit_mul(in69, t464); let t467 = circuit_mul(t460, t466); let t468 = circuit_add(t467, t465); let t469 = circuit_sub(in0, t468); let t470 = circuit_mul(t467, in52); let t471 = circuit_mul(t465, t295); let t472 = circuit_add(t470, t471); let t473 = circuit_add(t458, t472); let t474 = circuit_mul(in69, in69); let t475 = circuit_mul(t460, t474); let t476 = circuit_sub(in68, t7); let t477 = circuit_inverse(t476); let t478 = circuit_add(in68, t7); let t479 = circuit_inverse(t478); let t480 = circuit_mul(t475, t477); let t481 = circuit_mul(in69, t479); let t482 = circuit_mul(t475, t481); let t483 = circuit_add(t482, t480); let t484 = circuit_sub(in0, t483); let t485 = circuit_mul(t482, in53); let t486 = circuit_mul(t480, t285); let t487 = circuit_add(t485, t486); let t488 = circuit_add(t473, t487); let t489 = circuit_mul(in69, in69); let t490 = circuit_mul(t475, t489); let t491 = circuit_sub(in68, t8); let t492 = circuit_inverse(t491); let t493 = circuit_add(in68, t8); let t494 = circuit_inverse(t493); let t495 = circuit_mul(t490, t492); let t496 = circuit_mul(in69, t494); let t497 = circuit_mul(t490, t496); let t498 = circuit_add(t497, t495); let t499 = circuit_sub(in0, t498); let t500 = circuit_mul(t497, in54); let t501 = circuit_mul(t495, t275); let t502 = circuit_add(t500, t501); let t503 = circuit_add(t488, t502); let t504 = circuit_mul(in69, in69); let t505 = circuit_mul(t490, t504); let t506 = circuit_sub(in68, t9); let t507 = circuit_inverse(t506); let t508 = circuit_add(in68, t9); let t509 = circuit_inverse(t508); let t510 = circuit_mul(t505, t507); let t511 = circuit_mul(in69, t509); let t512 = circuit_mul(t505, t511); let t513 = circuit_add(t512, t510); let t514 = circuit_sub(in0, t513); let t515 = circuit_mul(t512, in55); let t516 = circuit_mul(t510, t265); let t517 = circuit_add(t515, t516); let t518 = circuit_add(t503, t517); let t519 = circuit_mul(in69, in69); let t520 = circuit_mul(t505, t519); let t521 = circuit_sub(in68, t10); let t522 = circuit_inverse(t521); let t523 = circuit_add(in68, t10); let t524 = circuit_inverse(t523); let t525 = circuit_mul(t520, t522); let t526 = circuit_mul(in69, t524); let t527 = circuit_mul(t520, t526); let t528 = circuit_add(t527, t525); let t529 = circuit_sub(in0, t528); let t530 = circuit_mul(t527, in56); let t531 = circuit_mul(t525, t255); let t532 = circuit_add(t530, t531); let t533 = circuit_add(t518, t532); let t534 = circuit_mul(in69, in69); let t535 = circuit_mul(t520, t534); let t536 = circuit_sub(in68, t11); let t537 = circuit_inverse(t536); let t538 = circuit_add(in68, t11); let t539 = circuit_inverse(t538); let t540 = circuit_mul(t535, t537); let t541 = circuit_mul(in69, t539); let t542 = circuit_mul(t535, t541); let t543 = circuit_add(t542, t540); let t544 = circuit_sub(in0, t543); let t545 = circuit_mul(t542, in57); let t546 = circuit_mul(t540, t245); let t547 = circuit_add(t545, t546); let t548 = circuit_add(t533, t547); let t549 = circuit_mul(in69, in69); let t550 = circuit_mul(t535, t549); let t551 = circuit_sub(in68, t12); let t552 = circuit_inverse(t551); let t553 = circuit_add(in68, t12); let t554 = circuit_inverse(t553); let t555 = circuit_mul(t550, t552); let t556 = circuit_mul(in69, t554); let t557 = circuit_mul(t550, t556); let t558 = circuit_add(t557, t555); let t559 = circuit_sub(in0, t558); let t560 = circuit_mul(t557, in58); let t561 = circuit_mul(t555, t235); let t562 = circuit_add(t560, t561); let t563 = circuit_add(t548, t562); let t564 = circuit_mul(in69, in69); let t565 = circuit_mul(t550, t564); let t566 = circuit_sub(in68, t13); let t567 = circuit_inverse(t566); let t568 = circuit_add(in68, t13); let t569 = circuit_inverse(t568); let t570 = circuit_mul(t565, t567); let t571 = circuit_mul(in69, t569); let t572 = circuit_mul(t565, t571); let t573 = circuit_add(t572, t570); let t574 = circuit_sub(in0, t573); let t575 = circuit_mul(t572, in59); let t576 = circuit_mul(t570, t225); let t577 = circuit_add(t575, t576); let t578 = circuit_add(t563, t577); let t579 = circuit_mul(in69, in69); let t580 = circuit_mul(t565, t579); let t581 = circuit_sub(in68, t14); let t582 = circuit_inverse(t581); let t583 = circuit_add(in68, t14); let t584 = circuit_inverse(t583); let t585 = circuit_mul(t580, t582); let t586 = circuit_mul(in69, t584); let t587 = circuit_mul(t580, t586); let t588 = circuit_add(t587, t585); let t589 = circuit_sub(in0, t588); let t590 = circuit_mul(t587, in60); let t591 = circuit_mul(t585, t215); let t592 = circuit_add(t590, t591); let t593 = circuit_add(t578, t592); let t594 = circuit_mul(in69, in69); let t595 = circuit_mul(t580, t594); let t596 = circuit_sub(in68, t15); let t597 = circuit_inverse(t596); let t598 = circuit_add(in68, t15); let t599 = circuit_inverse(t598); let t600 = circuit_mul(t595, t597); let t601 = circuit_mul(in69, t599); let t602 = circuit_mul(t595, t601); let t603 = circuit_add(t602, t600); let t604 = circuit_sub(in0, t603); let t605 = circuit_mul(t602, in61); let t606 = circuit_mul(t600, t205); let t607 = circuit_add(t605, t606); let t608 = circuit_add(t593, t607); let t609 = circuit_mul(in69, in69); let t610 = circuit_mul(t595, t609); let t611 = circuit_sub(in68, in66); let t612 = circuit_inverse(t611); let t613 = circuit_mul(in2, in66); let t614 = circuit_sub(in68, t613); let t615 = circuit_inverse(t614); let t616 = circuit_mul(in69, in69); let t617 = circuit_mul(t610, t616); let t618 = circuit_mul(t612, t617); let t619 = circuit_sub(in0, t618); let t620 = circuit_mul(t617, in69); let t621 = circuit_mul(t618, in62); let t622 = circuit_add(t608, t621); let t623 = circuit_mul(t615, t620); let t624 = circuit_sub(in0, t623); let t625 = circuit_mul(t620, in69); let t626 = circuit_mul(t623, in63); let t627 = circuit_add(t622, t626); let t628 = circuit_mul(t612, t625); let t629 = circuit_sub(in0, t628); let t630 = circuit_mul(t625, in69); let t631 = circuit_mul(t628, in64); let t632 = circuit_add(t627, t631); let t633 = circuit_mul(t612, t630); let t634 = circuit_sub(in0, t633); let t635 = circuit_mul(t633, in65); let t636 = circuit_add(t632, t635); let t637 = circuit_add(t624, t629); let modulus = modulus; let mut circuit_inputs = ( t27, t28, t32, t36, t40, t44, t48, t52, t56, t60, t64, t68, t72, t76, t80, t84, t88, t92, t96, t100, t104, t108, t112, t116, t120, t124, t128, t132, t136, t173, t178, t183, t188, t193, t160, t164, t168, t379, t394, t409, t424, t439, t454, t469, t484, t499, t514, t529, t544, t559, t574, t589, t604, t619, t637, t634, t636, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs .next_2( [0x6750f230c893619174a57a76, 0xf086204a9f36ffb061794254, 0x7b0c561a6148404, 0x0], ); // in2 // Fill inputs: for val in p_sumcheck_evaluations { circuit_inputs = circuit_inputs.next_u256(*val); } // in3 - in43 circuit_inputs = circuit_inputs.next_2(p_gemini_masking_eval); // in44 for val in p_gemini_a_evaluations { circuit_inputs = circuit_inputs.next_u256(*val); } // in45 - in61 for val in p_libra_poly_evals { circuit_inputs = circuit_inputs.next_u256(*val); } // in62 - in65 circuit_inputs = circuit_inputs.next_2(tp_gemini_r); // in66 circuit_inputs = circuit_inputs.next_2(tp_rho); // in67 circuit_inputs = circuit_inputs.next_2(tp_shplonk_z); // in68 circuit_inputs = circuit_inputs.next_2(tp_shplonk_nu); // in69 for val in tp_sum_check_u_challenges { circuit_inputs = circuit_inputs.next_u128(*val); } // in70 - in86 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let scalar_1: u384 = outputs.get_output(t27); let scalar_2: u384 = outputs.get_output(t28); let scalar_3: u384 = outputs.get_output(t32); let scalar_4: u384 = outputs.get_output(t36); let scalar_5: u384 = outputs.get_output(t40); let scalar_6: u384 = outputs.get_output(t44); let scalar_7: u384 = outputs.get_output(t48); let scalar_8: u384 = outputs.get_output(t52); let scalar_9: u384 = outputs.get_output(t56); let scalar_10: u384 = outputs.get_output(t60); let scalar_11: u384 = outputs.get_output(t64); let scalar_12: u384 = outputs.get_output(t68); let scalar_13: u384 = outputs.get_output(t72); let scalar_14: u384 = outputs.get_output(t76); let scalar_15: u384 = outputs.get_output(t80); let scalar_16: u384 = outputs.get_output(t84); let scalar_17: u384 = outputs.get_output(t88); let scalar_18: u384 = outputs.get_output(t92); let scalar_19: u384 = outputs.get_output(t96); let scalar_20: u384 = outputs.get_output(t100); let scalar_21: u384 = outputs.get_output(t104); let scalar_22: u384 = outputs.get_output(t108); let scalar_23: u384 = outputs.get_output(t112); let scalar_24: u384 = outputs.get_output(t116); let scalar_25: u384 = outputs.get_output(t120); let scalar_26: u384 = outputs.get_output(t124); let scalar_27: u384 = outputs.get_output(t128); let scalar_28: u384 = outputs.get_output(t132); let scalar_29: u384 = outputs.get_output(t136); let scalar_30: u384 = outputs.get_output(t173); let scalar_31: u384 = outputs.get_output(t178); let scalar_32: u384 = outputs.get_output(t183); let scalar_33: u384 = outputs.get_output(t188); let scalar_34: u384 = outputs.get_output(t193); let scalar_35: u384 = outputs.get_output(t160); let scalar_36: u384 = outputs.get_output(t164); let scalar_37: u384 = outputs.get_output(t168); let scalar_38: u384 = outputs.get_output(t379); let scalar_39: u384 = outputs.get_output(t394); let scalar_40: u384 = outputs.get_output(t409); let scalar_41: u384 = outputs.get_output(t424); let scalar_42: u384 = outputs.get_output(t439); let scalar_43: u384 = outputs.get_output(t454); let scalar_44: u384 = outputs.get_output(t469); let scalar_45: u384 = outputs.get_output(t484); let scalar_46: u384 = outputs.get_output(t499); let scalar_47: u384 = outputs.get_output(t514); let scalar_48: u384 = outputs.get_output(t529); let scalar_49: u384 = outputs.get_output(t544); let scalar_50: u384 = outputs.get_output(t559); let scalar_51: u384 = outputs.get_output(t574); let scalar_52: u384 = outputs.get_output(t589); let scalar_53: u384 = outputs.get_output(t604); let scalar_54: u384 = outputs.get_output(t619); let scalar_55: u384 = outputs.get_output(t637); let scalar_56: u384 = outputs.get_output(t634); let scalar_57: u384 = outputs.get_output(t636); return ( scalar_1, scalar_2, scalar_3, scalar_4, scalar_5, scalar_6, scalar_7, scalar_8, scalar_9, scalar_10, scalar_11, scalar_12, scalar_13, scalar_14, scalar_15, scalar_16, scalar_17, scalar_18, scalar_19, scalar_20, scalar_21, scalar_22, scalar_23, scalar_24, scalar_25, scalar_26, scalar_27, scalar_28, scalar_29, scalar_30, scalar_31, scalar_32, scalar_33, scalar_34, scalar_35, scalar_36, scalar_37, scalar_38, scalar_39, scalar_40, scalar_41, scalar_42, scalar_43, scalar_44, scalar_45, scalar_46, scalar_47, scalar_48, scalar_49, scalar_50, scalar_51, scalar_52, scalar_53, scalar_54, scalar_55, scalar_56, scalar_57, ); } #[inline(always)] pub fn run_GRUMPKIN_ZK_HONK_EVALS_CONS_INIT_SIZE_17_circuit( tp_gemini_r: u384, modulus: core::circuit::CircuitModulus, ) -> (u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x1 let in1 = CE::> {}; // 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 // INPUT stack let in2 = CE::> {}; let t0 = circuit_sub(in2, in0); let t1 = circuit_inverse(t0); let t2 = circuit_mul(in1, in2); let modulus = modulus; let mut circuit_inputs = (t1, t2).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs .next_2( [0x8712848a692c553d0329f5d6, 0x64751ad938e2b5e6a54cf8c6, 0x204bd3277422fad3, 0x0], ); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(tp_gemini_r); // in2 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let challenge_poly_eval: u384 = outputs.get_output(t1); let root_power_times_tp_gemini_r: u384 = outputs.get_output(t2); return (challenge_poly_eval, root_power_times_tp_gemini_r); } #[inline(always)] pub fn run_GRUMPKIN_ZK_HONK_EVALS_CONS_LOOP_SIZE_17_circuit( challenge_poly_eval: u384, root_power_times_tp_gemini_r: u384, tp_sumcheck_u_challenge: u384, modulus: core::circuit::CircuitModulus, ) -> (u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x1 let in1 = CE::> {}; // 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_sub(in3, in0); let t1 = circuit_inverse(t0); let t2 = circuit_mul(in0, t1); let t3 = circuit_add(in2, t2); let t4 = circuit_mul(in3, in1); let t5 = circuit_mul(in0, in4); let t6 = circuit_sub(t4, in0); let t7 = circuit_inverse(t6); let t8 = circuit_mul(t5, t7); let t9 = circuit_add(t3, t8); let t10 = circuit_mul(t4, in1); let t11 = circuit_mul(t5, in4); let t12 = circuit_sub(t10, in0); let t13 = circuit_inverse(t12); let t14 = circuit_mul(t11, t13); let t15 = circuit_add(t9, t14); let t16 = circuit_mul(t10, in1); let t17 = circuit_mul(t11, in4); let t18 = circuit_sub(t16, in0); let t19 = circuit_inverse(t18); let t20 = circuit_mul(t17, t19); let t21 = circuit_add(t15, t20); let t22 = circuit_mul(t16, in1); let t23 = circuit_mul(t17, in4); let t24 = circuit_sub(t22, in0); let t25 = circuit_inverse(t24); let t26 = circuit_mul(t23, t25); let t27 = circuit_add(t21, t26); let t28 = circuit_mul(t22, in1); let t29 = circuit_mul(t23, in4); let t30 = circuit_sub(t28, in0); let t31 = circuit_inverse(t30); let t32 = circuit_mul(t29, t31); let t33 = circuit_add(t27, t32); let t34 = circuit_mul(t28, in1); let t35 = circuit_mul(t29, in4); let t36 = circuit_sub(t34, in0); let t37 = circuit_inverse(t36); let t38 = circuit_mul(t35, t37); let t39 = circuit_add(t33, t38); let t40 = circuit_mul(t34, in1); let t41 = circuit_mul(t35, in4); let t42 = circuit_sub(t40, in0); let t43 = circuit_inverse(t42); let t44 = circuit_mul(t41, t43); let t45 = circuit_add(t39, t44); let t46 = circuit_mul(t40, in1); let t47 = circuit_mul(t41, in4); let t48 = circuit_sub(t46, in0); let t49 = circuit_inverse(t48); let t50 = circuit_mul(t47, t49); let t51 = circuit_add(t45, t50); let t52 = circuit_mul(t46, in1); let modulus = modulus; let mut circuit_inputs = (t51, t52).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs .next_2( [0x8712848a692c553d0329f5d6, 0x64751ad938e2b5e6a54cf8c6, 0x204bd3277422fad3, 0x0], ); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(challenge_poly_eval); // in2 circuit_inputs = circuit_inputs.next_2(root_power_times_tp_gemini_r); // in3 circuit_inputs = circuit_inputs.next_2(tp_sumcheck_u_challenge); // in4 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let challenge_poly_eval: u384 = outputs.get_output(t51); let root_power_times_tp_gemini_r: u384 = outputs.get_output(t52); return (challenge_poly_eval, root_power_times_tp_gemini_r); } #[inline(always)] pub fn run_GRUMPKIN_ZK_HONK_EVALS_CONS_DONE_SIZE_17_circuit( p_libra_evaluation: u384, p_libra_poly_evals: Span, tp_gemini_r: u384, challenge_poly_eval: u384, root_power_times_tp_gemini_r: u384, modulus: core::circuit::CircuitModulus, ) -> (u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 let in1 = CE::> {}; // 0x1 let in2 = CE::> {}; // 0x3033ea246e506e898e97f570caffd704cb0bb460313fb720b29e139e5c100001 // INPUT stack let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in10, in0); let t1 = circuit_mul(t0, in0); let t2 = circuit_mul(t1, in0); let t3 = circuit_mul(t2, in0); let t4 = circuit_mul(t3, in0); let t5 = circuit_mul(t4, in0); let t6 = circuit_mul(t5, in0); let t7 = circuit_mul(t6, in0); let t8 = circuit_mul(t7, in0); let t9 = circuit_mul(t8, in0); let t10 = circuit_mul(t9, in0); let t11 = circuit_mul(t10, in0); let t12 = circuit_mul(t11, in0); let t13 = circuit_mul(t12, in0); let t14 = circuit_mul(t13, in0); let t15 = circuit_mul(t14, in0); let t16 = circuit_mul(t15, in0); let t17 = circuit_mul(t16, in0); let t18 = circuit_mul(t17, in0); let t19 = circuit_mul(t18, in0); let t20 = circuit_mul(t19, in0); let t21 = circuit_mul(t20, in0); let t22 = circuit_mul(t21, in0); let t23 = circuit_mul(t22, in0); let t24 = circuit_mul(t23, in0); let t25 = circuit_mul(t24, in0); let t26 = circuit_mul(t25, in0); let t27 = circuit_mul(t26, in0); let t28 = circuit_mul(t27, in0); let t29 = circuit_mul(t28, in0); let t30 = circuit_mul(t29, in0); let t31 = circuit_mul(t30, in0); let t32 = circuit_mul(t31, in0); let t33 = circuit_mul(t32, in0); let t34 = circuit_mul(t33, in0); let t35 = circuit_mul(t34, in0); let t36 = circuit_mul(t35, in0); let t37 = circuit_mul(t36, in0); let t38 = circuit_mul(t37, in0); let t39 = circuit_mul(t38, in0); let t40 = circuit_mul(t39, in0); let t41 = circuit_mul(t40, in0); let t42 = circuit_mul(t41, in0); let t43 = circuit_mul(t42, in0); let t44 = circuit_mul(t43, in0); let t45 = circuit_mul(t44, in0); let t46 = circuit_mul(t45, in0); let t47 = circuit_mul(t46, in0); let t48 = circuit_mul(t47, in0); let t49 = circuit_mul(t48, in0); let t50 = circuit_mul(t49, in0); let t51 = circuit_mul(t50, in0); let t52 = circuit_mul(t51, in0); let t53 = circuit_mul(t52, in0); let t54 = circuit_mul(t53, in0); let t55 = circuit_mul(t54, in0); let t56 = circuit_mul(t55, in0); let t57 = circuit_mul(t56, in0); let t58 = circuit_mul(t57, in0); let t59 = circuit_mul(t58, in0); let t60 = circuit_mul(t59, in0); let t61 = circuit_mul(t60, in0); let t62 = circuit_mul(t61, in0); let t63 = circuit_mul(t62, in0); let t64 = circuit_mul(t63, in0); let t65 = circuit_mul(t64, in0); let t66 = circuit_mul(t65, in0); let t67 = circuit_mul(t66, in0); let t68 = circuit_mul(t67, in0); let t69 = circuit_mul(t68, in0); let t70 = circuit_mul(t69, in0); let t71 = circuit_mul(t70, in0); let t72 = circuit_mul(t71, in0); let t73 = circuit_mul(t72, in0); let t74 = circuit_mul(t73, in0); let t75 = circuit_mul(t74, in0); let t76 = circuit_mul(t75, in0); let t77 = circuit_mul(t76, in0); let t78 = circuit_mul(t77, in0); let t79 = circuit_mul(t78, in0); let t80 = circuit_mul(t79, in0); let t81 = circuit_mul(t80, in0); let t82 = circuit_mul(t81, in0); let t83 = circuit_mul(t82, in0); let t84 = circuit_mul(t83, in0); let t85 = circuit_mul(t84, in0); let t86 = circuit_mul(t85, in0); let t87 = circuit_mul(t86, in0); let t88 = circuit_mul(t87, in0); let t89 = circuit_mul(t88, in0); let t90 = circuit_mul(t89, in0); let t91 = circuit_mul(t90, in0); let t92 = circuit_mul(t91, in0); let t93 = circuit_mul(t92, in0); let t94 = circuit_mul(t93, in0); let t95 = circuit_mul(t94, in0); let t96 = circuit_mul(t95, in0); let t97 = circuit_mul(t96, in0); let t98 = circuit_mul(t97, in0); let t99 = circuit_mul(t98, in0); let t100 = circuit_mul(t99, in0); let t101 = circuit_sub(in8, in1); let t102 = circuit_inverse(t101); let t103 = circuit_sub(t100, in1); let t104 = circuit_inverse(t103); let t105 = circuit_mul(in8, in8); let t106 = circuit_mul(t105, t105); let t107 = circuit_mul(t106, t106); let t108 = circuit_mul(t107, t107); let t109 = circuit_mul(t108, t108); let t110 = circuit_mul(t109, t109); let t111 = circuit_mul(t110, t110); let t112 = circuit_mul(t111, t111); let t113 = circuit_sub(t112, in1); let t114 = circuit_mul(t113, in2); let t115 = circuit_mul(in9, t114); let t116 = circuit_mul(t102, t114); let t117 = circuit_mul(t104, t114); let t118 = circuit_mul(t116, in6); let t119 = circuit_sub(in8, in0); let t120 = circuit_sub(in5, in6); let t121 = circuit_mul(in4, t115); let t122 = circuit_sub(t120, t121); let t123 = circuit_mul(t119, t122); let t124 = circuit_add(t118, t123); let t125 = circuit_sub(in6, in3); let t126 = circuit_mul(t117, t125); let t127 = circuit_add(t124, t126); let t128 = circuit_mul(t113, in7); let t129 = circuit_sub(t127, t128); let modulus = modulus; let mut circuit_inputs = (t113, t129).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x8712848a692c553d0329f5d6, 0x64751ad938e2b5e6a54cf8c6, 0x204bd3277422fad3, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs .next_2( [0x313fb720b29e139e5c100001, 0x8e97f570caffd704cb0bb460, 0x3033ea246e506e89, 0x0], ); // in2 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p_libra_evaluation); // in3 for val in p_libra_poly_evals { circuit_inputs = circuit_inputs.next_u256(*val); } // in4 - in7 circuit_inputs = circuit_inputs.next_2(tp_gemini_r); // in8 circuit_inputs = circuit_inputs.next_2(challenge_poly_eval); // in9 circuit_inputs = circuit_inputs.next_2(root_power_times_tp_gemini_r); // in10 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let vanishing_check: u384 = outputs.get_output(t113); let diff_check: u384 = outputs.get_output(t129); return (vanishing_check, diff_check); } impl CircuitDefinition57< E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, E28, E29, E30, E31, E32, E33, E34, E35, E36, E37, E38, E39, E40, E41, E42, E43, E44, E45, E46, E47, E48, E49, E50, E51, E52, E53, E54, E55, E56, > of core::circuit::CircuitDefinition< ( CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, ), > { type CircuitType = core::circuit::Circuit< ( E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, E28, E29, E30, E31, E32, E33, E34, E35, E36, E37, E38, E39, E40, E41, E42, E43, E44, E45, E46, E47, E48, E49, E50, E51, E52, E53, E54, E55, E56, ), >; } impl MyDrp_57< E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, E28, E29, E30, E31, E32, E33, E34, E35, E36, E37, E38, E39, E40, E41, E42, E43, E44, E45, E46, E47, E48, E49, E50, E51, E52, E53, E54, E55, E56, > of Drop< ( CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, ), >; #[inline(never)] pub fn is_on_curve_excluding_infinity_bn254(p: G1Point, modulus: CircuitModulus) -> bool { // INPUT stack // y^2 = x^3 + 3 let (in0, in1) = (CE::> {}, CE::> {}); let y2 = circuit_mul(in1, in1); let x2 = circuit_mul(in0, in0); let x3 = circuit_mul(in0, x2); let y2_minus_x3 = circuit_sub(y2, x3); let mut circuit_inputs = (y2_minus_x3,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x); // in0 circuit_inputs = circuit_inputs.next_2(p.y); // in1 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let zero_check: u384 = outputs.get_output(y2_minus_x3); return zero_check == u384 { limb0: 3, limb1: 0, limb2: 0, limb3: 0 }; } ================================================ FILE: src/contracts/mutator_set/src/zk_verifier/honk_verifier_constants.cairo ================================================ use garaga::apps::noir::HonkVk; use garaga::definitions::{G1Point, G2Line, u288, u384}; pub const vk: HonkVk = HonkVk { vk_hash: 8648913451078603841425108107713111136913298359786830997742829131199771092709, log_circuit_size: 17, public_inputs_size: 19, qm: G1Point { x: u384 { limb0: 0xc9879d00a38708b38625ac44, limb1: 0x9ef7e0ada113660b7c7c1bfa, limb2: 0x1aad08a358acb08f, limb3: 0x0, }, y: u384 { limb0: 0xf724d70bdd99cca8b136516c, limb1: 0x4c788cf832602e3b7d33776e, limb2: 0x1cb6cf3305414863, limb3: 0x0, }, }, qc: G1Point { x: u384 { limb0: 0x9d9bcd021c055bb75dbd4512, limb1: 0x780d1d84481443889feb0344, limb2: 0x2f48f208bf2113ca, limb3: 0x0, }, y: u384 { limb0: 0xa7b307a6772179f94fa5ea6, limb1: 0x2bdd28321b8d24a9a4d68b3, limb2: 0x12131ffca858a35f, limb3: 0x0, }, }, ql: G1Point { x: u384 { limb0: 0xf28a408137475eb81810aa81, limb1: 0x1d00fedbbea4d1bf591decfc, limb2: 0x7dd8d544fca06cf, limb3: 0x0, }, y: u384 { limb0: 0x87f6900c2c82a1370469ae4e, limb1: 0xb26862eaa22ad4f564f16dc3, limb2: 0x19fa88ac971a9dce, limb3: 0x0, }, }, qr: G1Point { x: u384 { limb0: 0x73f3ba3bbf8ca96e672cbce2, limb1: 0xa3e373bcc21f45c528485515, limb2: 0x563be38b959ef47, limb3: 0x0, }, y: u384 { limb0: 0xd8efd2f9a41938ceb32b5a39, limb1: 0xf5e89041fec12a15a7e5555e, limb2: 0x205321350b7fb55, limb3: 0x0, }, }, qo: G1Point { x: u384 { limb0: 0xaebeeca06b6691fa3251b8c3, limb1: 0xc58f419fb4d44301670d2c95, limb2: 0x17aec007ff309cae, limb3: 0x0, }, y: u384 { limb0: 0xcb6122bfb69b5d6f0f10c45a, limb1: 0xce5407747e1e0b4831fa6971, limb2: 0x2ca94e49d53e2bfb, limb3: 0x0, }, }, q4: G1Point { x: u384 { limb0: 0x16a58f20d203d6998bedca0e, limb1: 0xf4749c68dc18379ed2cfd90f, limb2: 0x11e16a6d0f456496, limb3: 0x0, }, y: u384 { limb0: 0x7109c3364d8d5386f7834314, limb1: 0xa19192358f604f5e132e1134, limb2: 0x1dfb10789425f1c1, limb3: 0x0, }, }, qLookup: G1Point { x: u384 { limb0: 0xbf2ed757ab4abba92c67c48b, limb1: 0x3f63d5ad361a9fbf5fb92f0a, limb2: 0x140da9d775b7988a, limb3: 0x0, }, y: u384 { limb0: 0x72bc367b61bd04386c012fd8, limb1: 0x7aa1ab7396853dec5c74fb1e, limb2: 0x13ce9d2c1b64cd99, limb3: 0x0, }, }, qArith: G1Point { x: u384 { limb0: 0x3aa740bd1a5e8a47b3d2de10, limb1: 0xcc88c141090121fd92f68a6c, limb2: 0x8a2516f74638847, limb3: 0x0, }, y: u384 { limb0: 0xc710b72ff8cc890a46f57a90, limb1: 0x5a58c14222b39cfb1feb5292, limb2: 0xe38ae4e93ca3eae, limb3: 0x0, }, }, qDeltaRange: G1Point { x: u384 { limb0: 0x70ae35f1b8a0695b260e2feb, limb1: 0x105e723f90f620c9a957fc8d, limb2: 0x2c5de9a00448559, limb3: 0x0, }, y: u384 { limb0: 0xdaa421b8aa8ae3979076f0c3, limb1: 0x1358e1c210c87f84f65bba4b, limb2: 0x2d1012a20c0ca795, limb3: 0x0, }, }, qElliptic: G1Point { x: u384 { limb0: 0x4d27199ae4f48a5583fee4f3, limb1: 0x3e0bc0150e688f6c46f25745, limb2: 0x1c24be1be708f683, limb3: 0x0, }, y: u384 { limb0: 0x2187718a0f48380b39fac203, limb1: 0x418bf428f1c8e4cc01de2fa0, limb2: 0x215490b46e1ff77d, limb3: 0x0, }, }, qMemory: G1Point { x: u384 { limb0: 0x46fd0721214ab6dc7d78a012, limb1: 0xb3b50980deb6ce9bc88da500, limb2: 0x245ea5b6146dcc90, limb3: 0x0, }, y: u384 { limb0: 0xd5a93e279c05327d08d7e9e8, limb1: 0xf5adc6210b0399467c54c042, limb2: 0x1e727f815c7221f2, limb3: 0x0, }, }, qNnf: G1Point { x: u384 { limb0: 0xc8169df9b9fe24d1db0c6c37, limb1: 0x394f6d05c4a634eebc93546e, limb2: 0x2787a029626f7fef, limb3: 0x0, }, y: u384 { limb0: 0x125331ed5965e81567c35fef, limb1: 0x28f728f64243bc3eda44264f, limb2: 0x1c65ceb8bd2d3ba1, limb3: 0x0, }, }, qPoseidon2External: G1Point { x: u384 { limb0: 0x80c77770decd9af8eb397e9f, limb1: 0xa7f054ed839373c32380a122, limb2: 0x3bb5f8c665e6222, limb3: 0x0, }, y: u384 { limb0: 0x6cf73a911a7669454e742240, limb1: 0x22ce0664fd72c62b3fef3c52, limb2: 0x5ffe72ea68db37e, limb3: 0x0, }, }, qPoseidon2Internal: G1Point { x: u384 { limb0: 0x599f75e13d5fc1ddd625af3d, limb1: 0x35e95eb75dbcfb94576425e3, limb2: 0x21cf4a0b4ded78c8, limb3: 0x0, }, y: u384 { limb0: 0xf4e804d55eef280e63845a98, limb1: 0xa4391af391b562982739f5fd, limb2: 0x2d80057bb2d0ac54, limb3: 0x0, }, }, s1: G1Point { x: u384 { limb0: 0x2735a6945bfcc575b47b551b, limb1: 0x90e9781e87dc298bdef34482, limb2: 0x2ecd5089375735ff, limb3: 0x0, }, y: u384 { limb0: 0xd6c5b651258d085fb2c08479, limb1: 0xf55b1a28766f224e0198d9bc, limb2: 0xfcf4a0af691f887, limb3: 0x0, }, }, s2: G1Point { x: u384 { limb0: 0xc4ed539d45106213d9773e23, limb1: 0x8eaee56ac89019dfe6c61608, limb2: 0x6bb671b009b334, limb3: 0x0, }, y: u384 { limb0: 0xee3d4e41cd48e1f504ec8725, limb1: 0xbedb6b6c7414fb432ea7fbb1, limb2: 0x18ef92eff8a8214b, limb3: 0x0, }, }, s3: G1Point { x: u384 { limb0: 0xfd4c9cbb70bd5ed33e7f6230, limb1: 0x98500ef521527b9fd37b98aa, limb2: 0x9d18733c6d2ec15, limb3: 0x0, }, y: u384 { limb0: 0x82098b38d2b8548f15b51bc5, limb1: 0x8c9b3875390b26c889aec49b, limb2: 0x237aeb3aad51315e, limb3: 0x0, }, }, s4: G1Point { x: u384 { limb0: 0xc2e3448b290ed14332d835ff, limb1: 0x4261b7b47a679659e0db8b2, limb2: 0x68805c74a3e3341, limb3: 0x0, }, y: u384 { limb0: 0x638d679a090054c17b55a21e, limb1: 0x913b0e7f906efd58e885e853, limb2: 0x2e6fd1d72edcd21c, limb3: 0x0, }, }, id1: G1Point { x: u384 { limb0: 0xb5aecd13170ddb4422f04935, limb1: 0x9a078c7623842ce27367584a, limb2: 0x8dda9400ce64482, limb3: 0x0, }, y: u384 { limb0: 0xfb78f4f8f69ff971bfc5f06f, limb1: 0x26a42b2a150848b6a4e0dbc5, limb2: 0x1beb83b38357031c, limb3: 0x0, }, }, id2: G1Point { x: u384 { limb0: 0xf043d40b7003a5d6c3e897b6, limb1: 0x7473a63e06067d5ae07bda16, limb2: 0x1587ae4d0e40d580, limb3: 0x0, }, y: u384 { limb0: 0x7bd7d4e411e65490f5a7cc07, limb1: 0xaa52483c8b51cdeaada6c3ad, limb2: 0x23c966fe09c0b750, limb3: 0x0, }, }, id3: G1Point { x: u384 { limb0: 0x6a5f8b839f79f6632b3d3846, limb1: 0x7dceb6e16ac96a826af16b8e, limb2: 0x8e59de8c7ec9d1e, limb3: 0x0, }, y: u384 { limb0: 0x39070ff6fc023aa36aa560d6, limb1: 0x65d334abfd3a999331625437, limb2: 0x1540433e1d162232, limb3: 0x0, }, }, id4: G1Point { x: u384 { limb0: 0x8dcb81e2267c6ce0ec1d3808, limb1: 0xf0e2b4fce3bb28d444920fed, limb2: 0x1e00fc5b0e46caaf, limb3: 0x0, }, y: u384 { limb0: 0x189add7063bc6235eb050d20, limb1: 0x974d5b407537f937ff12471a, limb2: 0x2a65e90c138645af, limb3: 0x0, }, }, t1: G1Point { x: u384 { limb0: 0x338b2ec7a36993e51f217041, limb1: 0xc5578d44a19745a2e9b4fa73, limb2: 0x19bbebad91acf7e2, limb3: 0x0, }, y: u384 { limb0: 0xe8cc18957e5ca1c759a71e0, limb1: 0x485b4fc1723a3cf89dbb3d3, limb2: 0xb703659ad78da28, limb3: 0x0, }, }, t2: G1Point { x: u384 { limb0: 0xbc74c15287eb0b5691d6aedc, limb1: 0x80ee61926466bd391e8401c4, limb2: 0x229b0caf7eefd786, limb3: 0x0, }, y: u384 { limb0: 0x1d439725611f90819c503377, limb1: 0x4f97d5cc218ce5cad2724ee, limb2: 0x1e12a50561bcdc89, limb3: 0x0, }, }, t3: G1Point { x: u384 { limb0: 0x301aa9412c245623efa87a56, limb1: 0x26de6abc9119742c54b6ee25, limb2: 0x2d54532863a43d99, limb3: 0x0, }, y: u384 { limb0: 0xc90c9b882e9a231ae7f1a121, limb1: 0xac98d5fd202605b1d25cb91b, limb2: 0x103edb2d7d28f820, limb3: 0x0, }, }, t4: G1Point { x: u384 { limb0: 0x7f4e1e5d9273e820fac64728, limb1: 0xb6838f56e2b805cc06a79522, limb2: 0x155bba2e9214537c, limb3: 0x0, }, y: u384 { limb0: 0x69eeff16b7218dc48ef412b4, limb1: 0x48bff8d843d20fe5ec0702db, limb2: 0x26ba44b80af446f0, limb3: 0x0, }, }, lagrange_first: G1Point { x: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, y: u384 { limb0: 0x2, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }, lagrange_last: G1Point { x: u384 { limb0: 0x5fa2f3b50f0d5494f99668f8, limb1: 0x2b3d28853349f2b74055496e, limb2: 0x14c89754aed58171, limb3: 0x0, }, y: u384 { limb0: 0x24ce342a89643205b5c346fe, limb1: 0x6336e9f9001bd4a7f22da775, limb2: 0x13c5b1bd3f802852, limb3: 0x0, }, }, }; pub const precomputed_lines: [G2Line; 176] = [ G2Line { r0a0: u288 { limb0: 0x4d347301094edcbfa224d3d5, limb1: 0x98005e68cacde68a193b54e6, limb2: 0x237db2935c4432bc, }, r0a1: u288 { limb0: 0x6b4ba735fba44e801d415637, limb1: 0x707c3ec1809ae9bafafa05dd, limb2: 0x124077e14a7d826a, }, r1a0: u288 { limb0: 0x49a8dc1dd6e067932b6a7e0d, limb1: 0x7676d0000961488f8fbce033, limb2: 0x3b7178c857630da, }, r1a1: u288 { limb0: 0x98c81278efe1e96b86397652, limb1: 0xe3520b9dfa601ead6f0bf9cd, limb2: 0x2b17c2b12c26fdd0, }, }, G2Line { r0a0: u288 { limb0: 0x19f2be813f1a2cc51a251901, limb1: 0xa120afb4bcd07fdae4c4c91b, limb2: 0xcd8c8d94eedaaa5, }, r0a1: u288 { limb0: 0xa3808ba2f25b910b50769d68, limb1: 0xda666e5fa50719fcd79ea2c7, limb2: 0x104262c7ecae13e5, }, r1a0: u288 { limb0: 0xd00c9d5338bfc75cd1fe4002, limb1: 0x25f7441c17b6428fffe6266b, limb2: 0x25d0502e1109204d, }, r1a1: u288 { limb0: 0x4ce60bf635ff0fe14cf89d2, limb1: 0x9ca0af889fc43d4423a03197, limb2: 0x1b323f9be536f345, }, }, G2Line { r0a0: u288 { limb0: 0x1b3d578c32d1af5736582972, limb1: 0x204fe74db6b371d37e4615ab, limb2: 0xce69bdf84ed6d6d, }, r0a1: u288 { limb0: 0xfd262357407c3d96bb3ba710, limb1: 0x47d406f500e66ea29c8764b3, limb2: 0x1e23d69196b41dbf, }, r1a0: u288 { limb0: 0x1ec8ee6f65402483ad127f3a, limb1: 0x41d975b678200fce07c48a5e, limb2: 0x2cad36e65bbb6f4f, }, r1a1: u288 { limb0: 0xcfa9b8144c3ea2ab524386f5, limb1: 0xd4fe3a18872139b0287570c3, limb2: 0x54c8bc1b50aa258, }, }, G2Line { r0a0: u288 { limb0: 0xb5ee22ba52a7ed0c533b7173, limb1: 0xbfa13123614ecf9c4853249b, limb2: 0x6567a7f6972b7bb, }, r0a1: u288 { limb0: 0xcf422f26ac76a450359f819e, limb1: 0xc42d7517ae6f59453eaf32c7, limb2: 0x899cb1e339f7582, }, r1a0: u288 { limb0: 0x9f287f4842d688d7afd9cd67, limb1: 0x30af75417670de33dfa95eda, limb2: 0x1121d4ca1c2cab36, }, r1a1: u288 { limb0: 0x7c4c55c27110f2c9a228f7d8, limb1: 0x8f14f6c3a2e2c9d74b347bfe, limb2: 0x83ef274ba7913a5, }, }, G2Line { r0a0: u288 { limb0: 0x4e7f0c0bfd065f51be57e446, limb1: 0x172f9601c4b0d882b2bca176, limb2: 0x238b85999243f584, }, r0a1: u288 { limb0: 0xc4f13eea49c4fb0b88065fdf, limb1: 0xdde9d756dc7a3e60bfe2c7c9, limb2: 0x2021ebaaf4838c43, }, r1a0: u288 { limb0: 0x98652d3a0360c4ba067ebd45, limb1: 0x9259019a69cb15cd979b4425, limb2: 0xa93fe44d0287fdc, }, r1a1: u288 { limb0: 0x63a369cdd8c09b18c3ad7375, limb1: 0x1baf962de1bd1b1973e138fa, limb2: 0x15320ed6fbfaace4, }, }, G2Line { r0a0: u288 { limb0: 0x1a9ecb5a41abb65787e46934, limb1: 0x28fec59f9911882bd4d50306, limb2: 0x25996b3cd58cce92, }, r0a1: u288 { limb0: 0x56f5cca0fddcae1bfbee4b4d, limb1: 0x4237b58cc71911abcefd1d92, limb2: 0x2d985c4da93484d4, }, r1a0: u288 { limb0: 0x406454881e1f6cab8a9ab13c, limb1: 0x2cdf1a77980edf520cc8f23f, limb2: 0x20ce11ddb649cf18, }, r1a1: u288 { limb0: 0xfe104a8fa2c57b6b94bf56d2, limb1: 0xe2debabd9212070fd38f818, limb2: 0x1c1a2364541a15be, }, }, G2Line { r0a0: u288 { limb0: 0xfc23a674d089e9cfdefb1db8, limb1: 0x9ddfd61d289b65a9b4254476, limb2: 0x1e2f561324ef4447, }, r0a1: u288 { limb0: 0xf67a6a9e31f6975b220642ea, limb1: 0xccd852893796296e4d1ed330, limb2: 0x94ff1987d19b62, }, r1a0: u288 { limb0: 0x360c2a5aca59996d24cc1947, limb1: 0x66c2d7d0d176a3bc53f386e8, limb2: 0x2cfcc62a17fbeecb, }, r1a1: u288 { limb0: 0x2ddc73389dd9a9e34168d8a9, limb1: 0xae9afc57944748b835cbda0f, limb2: 0x12f0a1f8cf564067, }, }, G2Line { r0a0: u288 { limb0: 0xef09c2458cc3abc041e9fa2d, limb1: 0x787c6d7a93e94be14277d18d, limb2: 0xbb1d328b2d75a8a, }, r0a1: u288 { limb0: 0x1911705c689a06b1dfab80c, limb1: 0x72781338c8dfb4eb593e44c, limb2: 0x1405249e47100437, }, r1a0: u288 { limb0: 0x4dca335dcaeaf9d99ab7ad63, limb1: 0xd36f68812432efaedffce9a7, limb2: 0x1131840a72c4fa9, }, r1a1: u288 { limb0: 0x5676dc996dc5b1ce91fd01c1, limb1: 0xbbf4fcfae2062f0031601f40, limb2: 0x2f8f5c5bff703235, }, }, G2Line { r0a0: u288 { limb0: 0x9c963c4bdade6ce3d460b077, limb1: 0x1738311feefc76f565e34e8a, limb2: 0x1aae0d6c9e9888ad, }, r0a1: u288 { limb0: 0x9272581fdf80b045c9c3f0a, limb1: 0x3946807b0756e87666798edb, limb2: 0x2bf6eeda2d8be192, }, r1a0: u288 { limb0: 0x3e957661b35995552fb475de, limb1: 0xd8076fa48f93f09d8128a2a8, limb2: 0xb6f87c3f00a6fcf, }, r1a1: u288 { limb0: 0xcf17d6cd2101301246a8f264, limb1: 0x514d04ad989b91e697aa5a0e, limb2: 0x175f17bbd0ad1219, }, }, G2Line { r0a0: u288 { limb0: 0x894bc18cc70ca1987e3b8f9f, limb1: 0xd4bfa535181f0f8659b063e3, limb2: 0x19168d524164f463, }, r0a1: u288 { limb0: 0x850ee8d0e9b58b82719a6e92, limb1: 0x9fc4eb75cbb027c137d48341, limb2: 0x2b2f8a383d944fa0, }, r1a0: u288 { limb0: 0x5451c8974a709483c2b07fbd, limb1: 0xd7e09837b8a2a3b78e7fe525, limb2: 0x347d96be5e7fa31, }, r1a1: u288 { limb0: 0x823f2ba2743ee254e4c18a1e, limb1: 0x6a61af5db035c443ed0f8172, limb2: 0x1e840eee275d1063, }, }, G2Line { r0a0: u288 { limb0: 0xdd132544fc661724c31c8a08, limb1: 0x287b549c39c0ea0a391cbe18, limb2: 0x29c2742c0ca03d7b, }, r0a1: u288 { limb0: 0xb3076d9218b75e044db009b0, limb1: 0xf0e2da346da73ed6e537273, limb2: 0x16cd48b0b23a5a69, }, r1a0: u288 { limb0: 0x5eeab759aec37540ef3b3200, limb1: 0x90c30b490593b4f0a2750f65, limb2: 0x263476e7a8250501, }, r1a1: u288 { limb0: 0x437a75606a5486770a5c4450, limb1: 0xbb6a0a3aa70be067ddcfdbfc, limb2: 0xc03b2e169fa0cd0, }, }, G2Line { r0a0: u288 { limb0: 0x185a998303998a727a80004d, limb1: 0xb23554df68e88aa4bcb90b09, limb2: 0x293e05c0080aedc, }, r0a1: u288 { limb0: 0xfcd79ce56915d6462fb8a51a, limb1: 0x8c7691de25e8c4b96117b24, limb2: 0xa849fd468442c55, }, r1a0: u288 { limb0: 0xc8661606e6d6b1e5a00268eb, limb1: 0xbe2235d18dd52b903e1858e2, limb2: 0x222c8e6db445fbf7, }, r1a1: u288 { limb0: 0x803355a17297b5f77e52231c, limb1: 0x7927c03bd5d3798208bf7a23, limb2: 0x111b3dbe82eb4f62, }, }, G2Line { r0a0: u288 { limb0: 0x18d630598e58bb5d0102b30e, limb1: 0x9767e27b02a8da37411a2787, limb2: 0x100a541662b9cd7c, }, r0a1: u288 { limb0: 0x4ca7313df2e168e7e5ea70, limb1: 0xd49cce6abd50b574f31c2d72, limb2: 0x78a2afbf72317e7, }, r1a0: u288 { limb0: 0x6d99388b0a1a67d6b48d87e0, limb1: 0x1d8711d321a193be3333bc68, limb2: 0x27e76de53a010ce1, }, r1a1: u288 { limb0: 0x77341bf4e1605e982fa50abd, limb1: 0xc5cf10db170b4feaaf5f8f1b, limb2: 0x762adef02274807, }, }, G2Line { r0a0: u288 { limb0: 0x401adda3a335074256e01cf5, limb1: 0x247f8405ee3a5143b8fc7947, limb2: 0x2c37793269c12835, }, r0a1: u288 { limb0: 0x9ecc215e40764ce6a6db3ce0, limb1: 0x14e8a7b5a57b166edcdfb52, limb2: 0x29e744551489dc3f, }, r1a0: u288 { limb0: 0xee025e7cc0634b8b2fcd88dd, limb1: 0x94b3602ee4867d04d1e549ae, limb2: 0xcce5739cfedc699, }, r1a1: u288 { limb0: 0x2c7318ae1f6db5d41f684334, limb1: 0xd1ba91922e100971bd11dbb5, limb2: 0x1d6c654d5c0913a4, }, }, G2Line { r0a0: u288 { limb0: 0xa137b991ba9048aee9fa0bc7, limb1: 0xf5433785c186cd1100ab6b80, limb2: 0xab519fd7cf8e7f9, }, r0a1: u288 { limb0: 0x90832f45d3398c60aa1a74e2, limb1: 0x17f7ac209532723f22a344b, limb2: 0x23db979f8481c5f, }, r1a0: u288 { limb0: 0x723b0e23c2808a5d1ea6b11d, limb1: 0x3030030d26411f84235c3af5, limb2: 0x122e78da5509eddb, }, r1a1: u288 { limb0: 0xf1718c1e21a9bc3ec822f319, limb1: 0xf5ee6dfa3bd3272b2f09f0c7, limb2: 0x5a29c1e27616b34, }, }, G2Line { r0a0: u288 { limb0: 0x6cf0dc0a1a42af130a792bff, limb1: 0x6eeb4dd41cb8967cd7416c41, limb2: 0x832ca9524375cb4, }, r0a1: u288 { limb0: 0x7e263bdeb1fedd385682b4fc, limb1: 0x3eee92fe8cdb332aeb31d573, limb2: 0x125dc8ce07406159, }, r1a0: u288 { limb0: 0x5fce3aa533d50f8eff589829, limb1: 0x15cefc9330a131dfb10a5ae6, limb2: 0x2fa0a33e98e84220, }, r1a1: u288 { limb0: 0xed6540b1d66bbf1f7bf86da8, limb1: 0x3a5266544635cad0d58d64d6, limb2: 0x149069d5ba2e34da, }, }, G2Line { r0a0: u288 { limb0: 0xbc1ede480873fceb8739511e, limb1: 0xd5a60533bd0ce7869efbc15, limb2: 0x182c17d793eba74d, }, r0a1: u288 { limb0: 0x83bf38d91876ad8999516bc2, limb1: 0x7756322ea3dc079289d51f2d, limb2: 0x1d0f6156a89a4244, }, r1a0: u288 { limb0: 0x6aba652f197be8f99707b88c, limb1: 0xbf94286c245794ea0f562f32, limb2: 0x25a358967a2ca81d, }, r1a1: u288 { limb0: 0xc028cbff48c01433e8b23568, limb1: 0xd2e791f5772ed43b056beba1, limb2: 0x83eb38dff4960e, }, }, G2Line { r0a0: u288 { limb0: 0xf0ea4a2e24640eb0043fa781, limb1: 0x8a5ca14e0ac3b7d4409fcb40, limb2: 0x67b373e8abc5602, }, r0a1: u288 { limb0: 0x7c391162763fc85bf5c94818, limb1: 0xb389e19eb97568e7e7e4617d, limb2: 0x1d3f1c590945ef5c, }, r1a0: u288 { limb0: 0xce60f9534da6a36cda2ebe99, limb1: 0x4a48ecfd6beb4596b2736458, limb2: 0x2a3e1d1f2d7f13e0, }, r1a1: u288 { limb0: 0x8546f7e328bc13d11bb19a65, limb1: 0xb68deedd4c4b131fa83bb2a5, limb2: 0x15f7b8d2c8e7626e, }, }, G2Line { r0a0: u288 { limb0: 0xc2a2b787d8e718e81970db80, limb1: 0x5372abeaf56844dee60d6198, limb2: 0x131210153a2217d6, }, r0a1: u288 { limb0: 0x70421980313e09a8a0e5a82d, limb1: 0xf75ca1f68f4b8deafb1d3b48, limb2: 0x102113c9b6feb035, }, r1a0: u288 { limb0: 0x4654c11d73bda84873de9b86, limb1: 0xa67601bca2e595339833191a, limb2: 0x1c2b76e439adc8cc, }, r1a1: u288 { limb0: 0x9c53a48cc66c1f4d644105f2, limb1: 0xa17a18867557d96fb7c2f849, limb2: 0x1deb99799bd8b63a, }, }, G2Line { r0a0: u288 { limb0: 0xc32026c56341297fa080790c, limb1: 0xe23ad2ff283399133533b31f, limb2: 0xa6860f5c968f7ad, }, r0a1: u288 { limb0: 0x2966cf259dc612c6a4d8957d, limb1: 0xfba87ea86054f3db5774a08f, limb2: 0xc73408b6a646780, }, r1a0: u288 { limb0: 0x6272ce5976d8eeba08f66b48, limb1: 0x7dfbd78fa06509604c0cec8d, limb2: 0x181ec0eaa6660e45, }, r1a1: u288 { limb0: 0x48af37c1a2343555fbf8a357, limb1: 0xa7b5e1e20e64d6a9a9ce8e61, limb2: 0x1147dcea39a47abd, }, }, G2Line { r0a0: u288 { limb0: 0x24892e4246676601de7ff011, limb1: 0x538390fa26e7a81a0d183f27, limb2: 0x3410fd15a886c28, }, r0a1: u288 { limb0: 0x26b21dedab7f4232acbd4ff0, limb1: 0xa3b070b5094882aba51e9b07, limb2: 0xd20955719266e4d, }, r1a0: u288 { limb0: 0xe9495357ddc8fab97186f3fa, limb1: 0x39314e488ba5e56819f2526f, limb2: 0x2319d043c6fac62e, }, r1a1: u288 { limb0: 0x43af9a4d62880cabbd0c0091, limb1: 0x85c4696da0e2107eebe8d213, limb2: 0x15e73634a9b93263, }, }, G2Line { r0a0: u288 { limb0: 0x7225a042235a3e52ed4f3656, limb1: 0x29547006cc96d9af59e981e9, limb2: 0x2bb8d83d86b1948, }, r0a1: u288 { limb0: 0x7aff77100255f01d01e06689, limb1: 0xeafc9593264cb70dd2c5c40a, limb2: 0x16feef8d11db8f6c, }, r1a0: u288 { limb0: 0x38197214c4ec640e68ed7bd6, limb1: 0x6095d2ae38e508122aa0bacd, limb2: 0x15ee15a5c89d28c4, }, r1a1: u288 { limb0: 0x59cc5927de581d2bba41fb39, limb1: 0x9368a6b2bf2630ccd9ee111a, limb2: 0x1d1cd760d41a3053, }, }, G2Line { r0a0: u288 { limb0: 0x4033c51e6e469818521cd2ae, limb1: 0xb71a4629a4696b2759f8e19e, limb2: 0x4f5744e29c1eb30, }, r0a1: u288 { limb0: 0xa4f47bbc60cb0649dca1c772, limb1: 0x835f427106f4a6b897c6cf23, limb2: 0x17ca6ea4855756bb, }, r1a0: u288 { limb0: 0x7f844a35c7eeadf511e67e57, limb1: 0x8bb54fb0b3688cac8860f10, limb2: 0x1c7258499a6bbebf, }, r1a1: u288 { limb0: 0x10d269c1779f96946e518246, limb1: 0xce6fcef6676d0dacd395dc1a, limb2: 0x2cf4c6ae1b55d87d, }, }, G2Line { r0a0: u288 { limb0: 0xb8a97adf87c08c9754a126a3, limb1: 0x75a7ddf60605563f709106d2, limb2: 0x27851c7de29730da, }, r0a1: u288 { limb0: 0x8c5ecd7d4bb18df0499e32c7, limb1: 0x2534a91e249a1d6c311618e6, limb2: 0xc0140c1c13a3493, }, r1a0: u288 { limb0: 0x68d1a39239845ea787e22238, limb1: 0xb5a4c3ee8333093391b6d4cd, limb2: 0x1dc5f5b99d814946, }, r1a1: u288 { limb0: 0x8ef9ff9b9895bbf279c0fa0d, limb1: 0x7d3d2f468c0ac9e19fb7c2d, limb2: 0xac27e05ceb646b5, }, }, G2Line { r0a0: u288 { limb0: 0xab74a6bae36b17b1d2cc1081, limb1: 0x904cf03d9d30b1fe9dc71374, limb2: 0x14ffdd55685b7d82, }, r0a1: u288 { limb0: 0x277f7180b7cf33feded1583c, limb1: 0xc029c3968a75b612303c4298, limb2: 0x20ef4ba03605cdc6, }, r1a0: u288 { limb0: 0xd5a7a27c1baba3791ab18957, limb1: 0x973730213d5d70d3e62d6db, limb2: 0x24ca121c566eb857, }, r1a1: u288 { limb0: 0x9f4c2dea0492f548ae7d9e93, limb1: 0xe584b6b251a5227c70c5188, limb2: 0x22bcecac2bd5e51b, }, }, G2Line { r0a0: u288 { limb0: 0x340c82974f7221a53fc2f3ac, limb1: 0x7146f18cd591d423874996e7, limb2: 0xa6d154791056f46, }, r0a1: u288 { limb0: 0x70894ea6418890d53b5ee12a, limb1: 0x882290cb53b795b0e7c8c208, limb2: 0x1b5777dc18b2899b, }, r1a0: u288 { limb0: 0x99a0e528d582006a626206b6, limb1: 0xb1cf825d80e199c5c9c795b5, limb2: 0x2a97495b032f0542, }, r1a1: u288 { limb0: 0xc7cf5b455d6f3ba73debeba5, limb1: 0xbb0a01235687223b7b71d0e5, limb2: 0x250024ac44c35e3f, }, }, G2Line { r0a0: u288 { limb0: 0xcd61de038885e78d976e417f, limb1: 0x81fe397759fd09af54407334, limb2: 0x28d442dfdc1a2e12, }, r0a1: u288 { limb0: 0x75958d6bff91ac1f4b906a6e, limb1: 0xa9ceae56d3016a7b9be4e8d1, limb2: 0x1eb27b86e4ca4913, }, r1a0: u288 { limb0: 0x9e78d6b4bc7dbeb138bb7110, limb1: 0x8fa9343766858993e6f9769e, limb2: 0x25d95a1cdd51a5b7, }, r1a1: u288 { limb0: 0xd0e3a9be366e1fc7643320e8, limb1: 0xc0ba2c1555ff8ac9ad6f5297, limb2: 0x1d994b7cec2490e8, }, }, G2Line { r0a0: u288 { limb0: 0x1e9cf4d22158dc2de3993ad9, limb1: 0x71f64b04e8e9d545208968bb, limb2: 0x11d02ad0f13cfec0, }, r0a1: u288 { limb0: 0xacbea6d3f08ecb77503f05de, limb1: 0x611d520b74ddcb9f2e5828f0, limb2: 0x26202c3e458eb353, }, r1a0: u288 { limb0: 0xb61d83483ca541f57440987c, limb1: 0xa086532338a5827b1445f1c6, limb2: 0x1f5ebd76b5310b94, }, r1a1: u288 { limb0: 0xcac91c4843a6bad2a7cc91cb, limb1: 0x4fbd17f04d76a1b165fed733, limb2: 0x1e860876cd8963af, }, }, G2Line { r0a0: u288 { limb0: 0xccf841cf5c1cf8f4a0485e28, limb1: 0xb5077662d0ce9d755af1446b, limb2: 0x2b08658e9d5ba5cb, }, r0a1: u288 { limb0: 0x6ce62184a15685babd77f27f, limb1: 0x5ff9bb7d74505b0542578299, limb2: 0x7244563488bab2, }, r1a0: u288 { limb0: 0xec778048d344ac71275d961d, limb1: 0x1273984019753000ad890d33, limb2: 0x27c2855e60d361bd, }, r1a1: u288 { limb0: 0xa7a0071e22af2f3a79a12da, limb1: 0xc84a6fd41c20759ff6ff169a, limb2: 0x23e7ef2a308e49d1, }, }, G2Line { r0a0: u288 { limb0: 0x68a906f2806a6cc426b24994, limb1: 0x784dcf104c1dcf0e8f856da2, limb2: 0xc9654f8fbdf2892, }, r0a1: u288 { limb0: 0x9bea5cd65447a96f85459dd6, limb1: 0x13d9bb083bdab401220475b7, limb2: 0x2bd224747d636b4e, }, r1a0: u288 { limb0: 0xae8a73f18ff26f9d25fc0042, limb1: 0x947f72870798502183924783, limb2: 0xae687f4109514e, }, r1a1: u288 { limb0: 0x3dd221c63901d92fbe7bec24, limb1: 0x803d8cd513a8fe56a98984c2, limb2: 0x11912c747e407b17, }, }, G2Line { r0a0: u288 { limb0: 0x7105024c431a33683d9d0b9d, limb1: 0x12e23637b641ab0e5b322ad8, limb2: 0x2918e9e08c764c28, }, r0a1: u288 { limb0: 0x26384979d1f5417e451aeabf, limb1: 0xacfb499e362291d0b053bbf6, limb2: 0x2a6ad1a1f7b04ef6, }, r1a0: u288 { limb0: 0xba4db515be70c384080fc9f9, limb1: 0x5a983a6afa9cb830fa5b66e6, limb2: 0x8cc1fa494726a0c, }, r1a1: u288 { limb0: 0x59c9af9399ed004284eb6105, limb1: 0xef37f66b058b4c971d9c96b0, limb2: 0x2c1839afde65bafa, }, }, G2Line { r0a0: u288 { limb0: 0xd468740be11c72f0d61b3544, limb1: 0xee4537e6229611d1ee5d08f9, limb2: 0x25f95d481420c22b, }, r0a1: u288 { limb0: 0x1057f10f48392fe4e6a8cbb, limb1: 0x71eaba2ec1ad3c43203ee8b9, limb2: 0x28ebfa58c1c65aa1, }, r1a0: u288 { limb0: 0x7d03e13f07b1eecb5cd01d9d, limb1: 0x4e866746c563214e0043c745, limb2: 0x2cd7dc2b0c6cbb4b, }, r1a1: u288 { limb0: 0x5eabc3fb0a14cc2cb63ecd7c, limb1: 0xcfa5e22677730b5197985457, limb2: 0x3db7ea133dcce6e, }, }, G2Line { r0a0: u288 { limb0: 0x6bf13a27b0f4eb6657abc4b, limb1: 0xf78d57f089bffdf07c676bb3, limb2: 0x228e4aefbdd738df, }, r0a1: u288 { limb0: 0x4f41a40b04ec964619823053, limb1: 0xfa3fb44f4a80641a9bb3bc09, limb2: 0x29bf29a3d071ec4b, }, r1a0: u288 { limb0: 0x83823dcdff02bdc8a0e6aa03, limb1: 0x79ac92f113de29251cd73a98, limb2: 0x1ccdb791718d144, }, r1a1: u288 { limb0: 0xa074add9d066db9a2a6046b6, limb1: 0xef3a70034497456c7d001a5, limb2: 0x27d09562d815b4a6, }, }, G2Line { r0a0: u288 { limb0: 0xbf11dea21cd379f966caa6c2, limb1: 0x4e0f8e4b2b5917c45d535ef, limb2: 0xc735dd71c68e4ca, }, r0a1: u288 { limb0: 0xa605ae0ab6554385d99f6e12, limb1: 0x87cd556340ce9c7cc8a6ac63, limb2: 0x210538d78dc01108, }, r1a0: u288 { limb0: 0xc496c32da98d1ae345266146, limb1: 0x76a57df0969a21af8983781e, limb2: 0x269e9aa6f168324a, }, r1a1: u288 { limb0: 0x820373298d73bb39e9d80644, limb1: 0x987291249714fb863a8353df, limb2: 0x120dfbe3b8b4c9c, }, }, G2Line { r0a0: u288 { limb0: 0x87a44d343cc761056f4f2eae, limb1: 0x18016f16818253360d2c8adf, limb2: 0x1bcd5c6e597d735e, }, r0a1: u288 { limb0: 0x593d7444c376f6d69289660b, limb1: 0x1d6d97020b59cf2e4b38be4f, limb2: 0x17133b62617f63a7, }, r1a0: u288 { limb0: 0x88cac99869bb335ec9553a70, limb1: 0x95bcfa7f7c0b708b4d737afc, limb2: 0x1eec79b9db274c09, }, r1a1: u288 { limb0: 0xe465a53e9fe085eb58a6be75, limb1: 0x868e45cc13e7fd9d34e11839, limb2: 0x2b401ce0f05ee6bb, }, }, G2Line { r0a0: u288 { limb0: 0x83f48fbac5c1b94486c2d037, limb1: 0xf95d9333449543de78c69e75, limb2: 0x7bca8163e842be7, }, r0a1: u288 { limb0: 0x60157b2ff6e4d737e2dac26b, limb1: 0x30ab91893fcf39d9dcf1b89, limb2: 0x29a58a02490d7f53, }, r1a0: u288 { limb0: 0x520f9cb580066bcf2ce872db, limb1: 0x24a6e42c185fd36abb66c4ba, limb2: 0x309b07583317a13, }, r1a1: u288 { limb0: 0x5a4c61efaa3d09a652c72471, limb1: 0xfcb2676d6aa28ca318519d2, limb2: 0x1405483699afa209, }, }, G2Line { r0a0: u288 { limb0: 0x887e3388d815fefbe4de67c7, limb1: 0x39aabdf16d5e820c468f07b4, limb2: 0x1021ded60046ae5d, }, r0a1: u288 { limb0: 0x1ffd3f4a7c51d9b9b426759a, limb1: 0xfdcac9390f248e3358903bef, limb2: 0xc85ed498a09eaa4, }, r1a0: u288 { limb0: 0x2e3d9ddae0fe891656c2ebbd, limb1: 0xdbb3756450184a201ee6f6f4, limb2: 0x1f77f974e15e790c, }, r1a1: u288 { limb0: 0xc94662f8a91d828962406a80, limb1: 0x35b6584b35acc901cd8c124d, limb2: 0x1b6cbe14b354c93c, }, }, G2Line { r0a0: u288 { limb0: 0x4e0b59155b1586438f00d1d0, limb1: 0xe7fce333454bea5e5d19da67, limb2: 0x2286d1f263814635, }, r0a1: u288 { limb0: 0xdb0108b13b264fa9efe313bd, limb1: 0x25a0231213b6afe0cc5ac9, limb2: 0x24a55b37cab9e96f, }, r1a0: u288 { limb0: 0x10568376d2134a925d8224e2, limb1: 0x66ff6c53966243f66701ce36, limb2: 0xf0bab9bbaa38df8, }, r1a1: u288 { limb0: 0x9faf33001f67c41b255de466, limb1: 0x30656441023848f72165541a, limb2: 0x1b964ad8ff7afd21, }, }, G2Line { r0a0: u288 { limb0: 0xbfdfdae86101e29da3e869b8, limb1: 0xf969a9b961a28b872e56aac2, limb2: 0x1afdc719440d90f0, }, r0a1: u288 { limb0: 0xee43c995686f13baa9b07266, limb1: 0xbfa387a694c641cceee4443a, limb2: 0x104d8c02eb7f60c8, }, r1a0: u288 { limb0: 0x8d451602b3593e798aecd7fb, limb1: 0x69ffbefe7c5ac2cf68e8691e, limb2: 0x2ea064a1bc373d28, }, r1a1: u288 { limb0: 0x6e7a663073bfe88a2b02326f, limb1: 0x5faadb36847ca0103793fa4a, limb2: 0x26c09a8ec9303836, }, }, G2Line { r0a0: u288 { limb0: 0xa02ed8b8bea4e6398937e400, limb1: 0xba34c7a8c92f6fb9c7eb1009, limb2: 0x14021afa35038d6f, }, r0a1: u288 { limb0: 0x5fed8893a16fc89c77ab6e69, limb1: 0x341d37d9e774298c8289039e, limb2: 0x14228ddafe44ce59, }, r1a0: u288 { limb0: 0x578a1f7a73e6d177db8ef992, limb1: 0xe0414e8de48555d5e7715a16, limb2: 0x48dd64815f16a0a, }, r1a1: u288 { limb0: 0xf23687d236711b4c0ca8ce76, limb1: 0x50664dd13060c77c5166e7fe, limb2: 0x10090c847a3c2764, }, }, G2Line { r0a0: u288 { limb0: 0x3d038747ebac16adc1c50bdd, limb1: 0xe3706a783e99f73ac742aa1a, limb2: 0x17eac23b00b545ff, }, r0a1: u288 { limb0: 0xdc25ff0bd02abcbe502c4e37, limb1: 0x39b92e6ebb65e5f2d8504f90, limb2: 0x2415b5f61301dff6, }, r1a0: u288 { limb0: 0x9cdcb2146d15f37900db82ac, limb1: 0x96c3940e2f5c5f8198fadee3, limb2: 0x2f662ea79b473fc2, }, r1a1: u288 { limb0: 0xc0fb95686de65e504ed4c57a, limb1: 0xec396c7c4275d4e493b00713, limb2: 0x106d2aab8d90d517, }, }, G2Line { r0a0: u288 { limb0: 0xb836776ba636148782ccc53a, limb1: 0xc85e575c26103c32434b48b3, limb2: 0xbbd5f5df165aeca, }, r0a1: u288 { limb0: 0x75eb6906bb101ea7f525fe68, limb1: 0xa69a82fea7ca9f41fb7f0712, limb2: 0x2d0f62c13f7d525b, }, r1a0: u288 { limb0: 0x94475fc56769da417d920d02, limb1: 0x9bacf6721bad4841a1ead330, limb2: 0x264649c0901fd86, }, r1a1: u288 { limb0: 0x45cddba5ab6cb8d80986a4b5, limb1: 0x8a2735ec64c123d9b1d94e43, limb2: 0x8b8c3087a3fc782, }, }, G2Line { r0a0: u288 { limb0: 0x49bbb4d856921e3177c0b5bf, limb1: 0x76d84d273694e662bdd5d364, limb2: 0xea5dc611bdd369d, }, r0a1: u288 { limb0: 0x9e9fc3adc530fa3c5c6fd7fe, limb1: 0x114bb0c0e8bd247da41b3883, limb2: 0x6044124f85d2ce, }, r1a0: u288 { limb0: 0xa6e604cdb4e40982a97c084, limb1: 0xef485caa56c7820be2f6b11d, limb2: 0x280de6387dcbabe1, }, r1a1: u288 { limb0: 0xcaceaf6df5ca9f8a18bf2e1e, limb1: 0xc5cce932cc6818b53136c142, limb2: 0x12f1cd688682030c, }, }, G2Line { r0a0: u288 { limb0: 0x37497c23dcf629df58a5fa12, limb1: 0x4fcd5534ae47bded76245ac9, limb2: 0x1715ab081e32ac95, }, r0a1: u288 { limb0: 0x856275471989e2c288e3c83, limb1: 0xb42d81a575b89b127a7821a, limb2: 0x5fa75a0e4ae3118, }, r1a0: u288 { limb0: 0xeb22351e8cd345c23c0a3fef, limb1: 0x271feb16d4b47d2267ac9d57, limb2: 0x258f9950b9a2dee5, }, r1a1: u288 { limb0: 0xb5f75468922dc025ba7916fa, limb1: 0x7e24515de90edf1bde4edd9, limb2: 0x289145b3512d4d81, }, }, G2Line { r0a0: u288 { limb0: 0xce1ded2782ddd08e6865ab4, limb1: 0x4583c91a985a438fdac4f4c, limb2: 0x13d595d330502573, }, r0a1: u288 { limb0: 0x595067b65592ac4d6c9b5b5c, limb1: 0x4ef806daef8c02f94ecaf97f, limb2: 0x7869c312062e0a8, }, r1a0: u288 { limb0: 0x38cb6ea081fb30e87015f4c3, limb1: 0xc380b087269e9836e39be81, limb2: 0x7619e66982167dd, }, r1a1: u288 { limb0: 0x84f696893f8cb0e616e335b6, limb1: 0xb7fd749a8812159ce96c3f43, limb2: 0x2b80806bd7eeb0cd, }, }, G2Line { r0a0: u288 { limb0: 0xeed11dd701d662b9bd85fda4, limb1: 0x284c3b305b25ed852d47268e, limb2: 0x37e8aad03f1efa3, }, r0a1: u288 { limb0: 0x1ba355db79739c5b954c99e, limb1: 0xd38db182b11b150b1ac2b6cd, limb2: 0x1b416cf91fe88aa, }, r1a0: u288 { limb0: 0xd8f230276c30350267b5d2e6, limb1: 0x6057c8dd8abc942db7f6e156, limb2: 0x127d2dc576c754d8, }, r1a1: u288 { limb0: 0x3a34d39084d5d8b2204f6632, limb1: 0xe18cb27f7b45639b6cb65d23, limb2: 0xb6cc7185cc1c602, }, }, G2Line { r0a0: u288 { limb0: 0x95b7b32bcc3119c64a62a8de, limb1: 0xe07184496f17bbd59a4b7bbd, limb2: 0x1708c536fd78b531, }, r0a1: u288 { limb0: 0xfa85b5778c77166c1523a75e, limb1: 0x89a00c53309a9e525bef171a, limb2: 0x2d2287dd024e421, }, r1a0: u288 { limb0: 0x31fd0884eaf2208bf8831e72, limb1: 0x537e04ea344beb57ee645026, limb2: 0x23c7f99715257261, }, r1a1: u288 { limb0: 0x8c38b3aeea525f3c2d2fdc22, limb1: 0xf838a99d9ec8ed6dcec6a2a8, limb2: 0x2973d5159ddc479a, }, }, G2Line { r0a0: u288 { limb0: 0x3f058d8c63fd905d3ca29b42, limb1: 0x1f0a90982cc68e4ddcd83e57, limb2: 0x240aeaae0783fbfa, }, r0a1: u288 { limb0: 0xedfee81d80da310fdf0d0d8, limb1: 0xc2208e6de8806cf491bd74d4, limb2: 0xb7318be62a476af, }, r1a0: u288 { limb0: 0x3c6920c8a24454c634f388fe, limb1: 0x23328a006312a722ae09548b, limb2: 0x1d2f1c58b80432e2, }, r1a1: u288 { limb0: 0xb72980574f7a877586de3a63, limb1: 0xcd773b87ef4a29c16784c5ae, limb2: 0x1f812c7e22f339c5, }, }, G2Line { r0a0: u288 { limb0: 0x4ee6eef57f5c866acf77f595, limb1: 0x3aec7154a9f1f285829186a5, limb2: 0x283e9794a30457d, }, r0a1: u288 { limb0: 0xd59a661484d8c376567086d3, limb1: 0x1f9c69bb6fb467cd93899dd2, limb2: 0x25dd4d1be0b765b, }, r1a0: u288 { limb0: 0x5b9c47593dfbd508ab34c7b3, limb1: 0x5cc228830e12085b69b345df, limb2: 0x563a3f38bb17d2d, }, r1a1: u288 { limb0: 0xd13362074a4f1c9ad9063afd, limb1: 0xae0b6ddad1bdbd332e510b50, limb2: 0x6fe176282e9d5fb, }, }, G2Line { r0a0: u288 { limb0: 0x8909147ac871b1dfb1b93dea, limb1: 0x142dbce634570b3004e7fc, limb2: 0x6c20d9db5dd84da, }, r0a1: u288 { limb0: 0x9860d4eddaa4bc238176c6fc, limb1: 0x2b0526a4c3964c89747e80c5, limb2: 0x8fd2f58f97118b6, }, r1a0: u288 { limb0: 0x350f6ba8623173a2b59246f5, limb1: 0xc1b28fd98d68ff68c2905942, limb2: 0x8244875fe9df1c7, }, r1a1: u288 { limb0: 0x57cc1c6a24b662006d9dbe1b, limb1: 0x5ad285ba45ea4be688bff724, limb2: 0x2b07fd32ff344b21, }, }, G2Line { r0a0: u288 { limb0: 0xfeebe92941f95b6ea1d095bb, limb1: 0x9c7962eb8bbeb95a9ca7cf50, limb2: 0x290bdaf3b9a08dc3, }, r0a1: u288 { limb0: 0x686cfa11c9d4b93675495599, limb1: 0xb1d69e17b4b5ebf64f0d51e1, limb2: 0x2c18bb4bdc2e9567, }, r1a0: u288 { limb0: 0x17419b0f6a04bfc98d71527, limb1: 0x80eba6ff02787e3de964a4d1, limb2: 0x26087bb100e7ff9f, }, r1a1: u288 { limb0: 0x17c4ee42c3f612c43a08f689, limb1: 0x7276bdda2df6d51a291dba69, limb2: 0x40a7220ddb393e1, }, }, G2Line { r0a0: u288 { limb0: 0x37349ad9dc3023fc75053e02, limb1: 0x33a3d352f746ab24b3b58b0a, limb2: 0xec4c339b84b811d, }, r0a1: u288 { limb0: 0x7dcfa2460a0ad9b521a47470, limb1: 0xba3ff4b52958f6b7341790da, limb2: 0x24709d3b126eb975, }, r1a0: u288 { limb0: 0xe5167ab2a7c59462398695fe, limb1: 0x639d95ac9180109e9716c52d, limb2: 0x1ad3dd11a73c7763, }, r1a1: u288 { limb0: 0xc4074c8a20ffec99be26ea0d, limb1: 0x33d88e5ff7a03f8fc7673634, limb2: 0x212a99002b140a7c, }, }, G2Line { r0a0: u288 { limb0: 0x830d777c19040571a1d72fd0, limb1: 0x651b2c6b8c292020817a633f, limb2: 0x268af1e285bc59ff, }, r0a1: u288 { limb0: 0xede78baa381c5bce077f443d, limb1: 0x540ff96bae21cd8b9ae5438b, limb2: 0x12a1fa7e3b369242, }, r1a0: u288 { limb0: 0x797c0608e5a535d8736d4bc5, limb1: 0x375faf00f1147656b7c1075f, limb2: 0xda60fab2dc5a639, }, r1a1: u288 { limb0: 0x610d26085cfbebdb30ce476e, limb1: 0x5bc55890ff076827a09e8444, limb2: 0x14272ee2d25f20b7, }, }, G2Line { r0a0: u288 { limb0: 0x430bef5bf19edee76f43f86d, limb1: 0xd0d7e3e70da75944107b2d4a, limb2: 0x1a773d3afca56895, }, r0a1: u288 { limb0: 0xac9908b990c2eba0c566a721, limb1: 0xb5b9dd164b61dc1a46f57bc0, limb2: 0x153897d14189a3e9, }, r1a0: u288 { limb0: 0x873c42f94417c98a18ef8b21, limb1: 0x7fd90a68e925814a5c90c64e, limb2: 0xb43f89cdc102905, }, r1a1: u288 { limb0: 0x6a2633ae3430261a8d930055, limb1: 0xccf2888e7fa1b1be32616fcc, limb2: 0x281f7352c8bd69b4, }, }, G2Line { r0a0: u288 { limb0: 0xd6862e1a4ca3b2baf6f8d8aa, limb1: 0x96f9066dded3a3d899025af4, limb2: 0x1a98af9f0d48fd3, }, r0a1: u288 { limb0: 0x276b417cc61ea259c114314e, limb1: 0x464399e5e0037b159866b246, limb2: 0x12cc97dcf32896b5, }, r1a0: u288 { limb0: 0xef72647f4c2d08fc038c4377, limb1: 0x34883cea19be9a490a93cf2b, limb2: 0x10d01394daa61ed0, }, r1a1: u288 { limb0: 0xdf345239ece3acaa62919643, limb1: 0x914780908ece64e763cca062, limb2: 0xee2a80dbd2012a3, }, }, G2Line { r0a0: u288 { limb0: 0x1d5a31f4d08a0ebf7e071e00, limb1: 0xcd1244dd95dd30005f531f81, limb2: 0xb4cb469a2dcf4f1, }, r0a1: u288 { limb0: 0x7c5938adaf38b355092de1f1, limb1: 0x292ab08995b293abfcba14b, limb2: 0x1fd126a2b9f37c67, }, r1a0: u288 { limb0: 0x6e9d352b02a7cb771fcc33f9, limb1: 0x7754d8536eefda2025a07340, limb2: 0x1840289291c35a72, }, r1a1: u288 { limb0: 0xe85f465417b7bd758c547b2e, limb1: 0xf7f703c3bc55ff8a01fa9365, limb2: 0xfa301227880a841, }, }, G2Line { r0a0: u288 { limb0: 0xb871630bb14808308256993, limb1: 0x5aa6407e90ac7cd9d34c84b1, limb2: 0x1a45d81956be51f9, }, r0a1: u288 { limb0: 0x4e35a5f1c75bc96bbe481d7c, limb1: 0xb461fa7d1b269bf49be0ed7f, limb2: 0x88efe970e8c4e4a, }, r1a0: u288 { limb0: 0xff160df5ead7b7b25d8892e5, limb1: 0xbbbd6b9b216396e83fd6aa70, limb2: 0x2dcf636e87cde612, }, r1a1: u288 { limb0: 0x44d33f7f0dbcaccf59607fcd, limb1: 0xae52f65a36ac4f17e0e213de, limb2: 0x12e6c11148485b9b, }, }, G2Line { r0a0: u288 { limb0: 0xa89926f3c9ed74cf35d8982d, limb1: 0x8e9003f1a42b81a81fe0df1e, limb2: 0x2732162604574861, }, r0a1: u288 { limb0: 0x4ac22d9feb0443ee015b81e1, limb1: 0xd442070c95acaa6a39e85ae9, limb2: 0x1a42773c0ac19a09, }, r1a0: u288 { limb0: 0x7d32a4a55a853c2309cd6f0, limb1: 0x747d1e031aa2229e38cfca1f, limb2: 0x1b6358645f1162ad, }, r1a1: u288 { limb0: 0xd511412ffa32391dda88c29b, limb1: 0x5f57b2aab83993734eb330b0, limb2: 0xc3766c22260b874, }, }, G2Line { r0a0: u288 { limb0: 0xa4058149e82ea51362b79be4, limb1: 0x734eba2621918a820ae44684, limb2: 0x110a314a02272b1, }, r0a1: u288 { limb0: 0xe2b43963ef5055df3c249613, limb1: 0x409c246f762c0126a1b3b7b7, limb2: 0x19aa27f34ab03585, }, r1a0: u288 { limb0: 0x179aad5f620193f228031d62, limb1: 0x6ba32299b05f31b099a3ef0d, limb2: 0x157724be2a0a651f, }, r1a1: u288 { limb0: 0xa33b28d9a50300e4bbc99137, limb1: 0x262a51847049d9b4d8cea297, limb2: 0x189acb4571d50692, }, }, G2Line { r0a0: u288 { limb0: 0xbd50e560f6bb994a2922fa51, limb1: 0x99a1d1b01aa18c7f31e917fc, limb2: 0xd7ef26150626982, }, r0a1: u288 { limb0: 0xf014da7a050c535a40cfc124, limb1: 0x3b1a2e82c4f0fc6379900c54, limb2: 0x1a5cfd9a14902546, }, r1a0: u288 { limb0: 0x9aaa7b13fd8f24f65c93eec5, limb1: 0xab93d53f2815295691702b82, limb2: 0xde083d90578af6f, }, r1a1: u288 { limb0: 0xfbd08ec0a79725a4b6e8b67c, limb1: 0x69946154b610ed695859295b, limb2: 0x277a133a0d6da917, }, }, G2Line { r0a0: u288 { limb0: 0x29bd4381ae4afc677ee37ed6, limb1: 0x29ed43453f9a008d9176f004, limb2: 0x24134eb915104f43, }, r0a1: u288 { limb0: 0x81597f82bb67e90a3e72bdd2, limb1: 0xab3bbde5f7bbb4df6a6b5c19, limb2: 0x19ac61eea40a367c, }, r1a0: u288 { limb0: 0xe30a79342fb3199651aee2fa, limb1: 0xf500f028a73ab7b7db0104a3, limb2: 0x808b50e0ecb5e4d, }, r1a1: u288 { limb0: 0x55f2818453c31d942444d9d6, limb1: 0xf6dd80c71ab6e893f2cf48db, limb2: 0x13c3ac4488abd138, }, }, G2Line { r0a0: u288 { limb0: 0x32bc8a981429b931b50b70e1, limb1: 0x99cffcd897696a0e5c987090, limb2: 0x2663f59204065aeb, }, r0a1: u288 { limb0: 0x6d0d07933c107a489c682134, limb1: 0xb81690a5db81aa6e8c0ef203, limb2: 0x27cb7b6ce66b5225, }, r1a0: u288 { limb0: 0xf6fc5c5aa501cffb8ee75a4b, limb1: 0xf8d08f9383f191384ba8077b, limb2: 0x28b89e3f89c071c1, }, r1a1: u288 { limb0: 0x1bd9021070481b0a40cb6d36, limb1: 0x86562734b4f3fcfb46e39713, limb2: 0x1ec7729185561f74, }, }, G2Line { r0a0: u288 { limb0: 0xd1464269bbeafa546f559b8f, limb1: 0xab7f7dcd1ac32b86979471cf, limb2: 0x6a38256ee96f113, }, r0a1: u288 { limb0: 0xf14d50984e65f9bc41df4e7e, limb1: 0x350aff9be6f9652ad441a3ad, limb2: 0x1b1e60534b0a6aba, }, r1a0: u288 { limb0: 0x9e98507da6cc50a56f023849, limb1: 0xcf8925e03f2bb5c1ba0962dd, limb2: 0x2b18961810a62f87, }, r1a1: u288 { limb0: 0x3a4c61b937d4573e3f2da299, limb1: 0x6f4c6c13fd90f4edc322796f, limb2: 0x13f4e99b6a2f025e, }, }, G2Line { r0a0: u288 { limb0: 0xd7f1137b131005c05a263909, limb1: 0x377579bc2a44238703830641, limb2: 0x1edb40cec982e433, }, r0a1: u288 { limb0: 0xb234350aafc13259037ff7b8, limb1: 0x8ce5fcfc41890347214723f3, limb2: 0x1d5cfe6e2536a23b, }, r1a0: u288 { limb0: 0x8d74f12ae2cdd199736e4db9, limb1: 0xf5835da25b7c74dea8742767, limb2: 0xa4f9baaf2b585aa, }, r1a1: u288 { limb0: 0x6c077e93c1a1bae84d31f2de, limb1: 0xeb24bf9c8e1a11a15952b35f, limb2: 0x182a33beae2d73ac, }, }, G2Line { r0a0: u288 { limb0: 0xe0115a79120ae892a72f3dcb, limb1: 0xec67b5fc9ea414a4020135f, limb2: 0x1ee364e12321904a, }, r0a1: u288 { limb0: 0xa74d09666f9429c1f2041cd9, limb1: 0x57ffe0951f863dd0c1c2e97a, limb2: 0x154877b2d1908995, }, r1a0: u288 { limb0: 0xcbe5e4d2d2c91cdd4ccca0, limb1: 0xe6acea145563a04b2821d120, limb2: 0x18213221f2937afb, }, r1a1: u288 { limb0: 0xfe20afa6f6ddeb2cb768a5ae, limb1: 0x1a3b509131945337c3568fcf, limb2: 0x127b5788263a927e, }, }, G2Line { r0a0: u288 { limb0: 0x23a3796fea17793ca760d4b4, limb1: 0xb4abf7ebb030cb2f1630ed5f, limb2: 0x64ab24ff28d4416, }, r0a1: u288 { limb0: 0x538a1fa509f26d8c8bdeb966, limb1: 0x73f3e2cd56d3c514e4a37c42, limb2: 0x60a236e3776ce68, }, r1a0: u288 { limb0: 0xd80f5ba56c16fe54bda3fa80, limb1: 0xe5f8701be9499623ce8a673d, limb2: 0x18c79fac25052970, }, r1a1: u288 { limb0: 0x8929aad47a81f1378a817ef5, limb1: 0xfadba04c7242b43b5cf39d33, limb2: 0xb3e5f5c3c9fb3b2, }, }, G2Line { r0a0: u288 { limb0: 0xe7c658aecdab4db3c83f7927, limb1: 0xfbf162264ca04ee50c70bde8, limb2: 0x2a20f4565b7ff885, }, r0a1: u288 { limb0: 0x45b1c2f0a1226361f42683c0, limb1: 0x9acdd892c48c08de047296bc, limb2: 0x27836373108925d4, }, r1a0: u288 { limb0: 0xc0ea9294b345e6d4892676a7, limb1: 0xcba74eca77086af245d1606e, limb2: 0xf20edac89053e72, }, r1a1: u288 { limb0: 0x4c92a28f2779a527a68a938c, limb1: 0x3a1c3c55ff9d20eac109fab3, limb2: 0x21c4a8c524b1ee7d, }, }, G2Line { r0a0: u288 { limb0: 0x731f3a1b36de3023901591ff, limb1: 0xe34bb92f321ca5d3092bcbad, limb2: 0x2216559b45dd1c2f, }, r0a1: u288 { limb0: 0x3bac805b2d142e0cc0edeb11, limb1: 0x5d11df064af70b6d83d6ce74, limb2: 0x14c2db65d318303, }, r1a0: u288 { limb0: 0xc3ee59929ecba416af62e06e, limb1: 0xcbdffb49b2c9219cfda57258, limb2: 0x9e92730073f74d7, }, r1a1: u288 { limb0: 0x137f2ce23b788e764203080c, limb1: 0x1340ccaf8101da98864c6b0c, limb2: 0x103ddd7382137938, }, }, G2Line { r0a0: u288 { limb0: 0xa68021d593c46246af22559e, limb1: 0x5c2cfc5bc4cd1b48f4704134, limb2: 0x296066ede1298f8c, }, r0a1: u288 { limb0: 0xfe17dd6765eb9b9625eb6a84, limb1: 0x4e35dd8e8f6088bb14299f8d, limb2: 0x1a380ab2689106e4, }, r1a0: u288 { limb0: 0x82bacf337ca09853df42bc59, limb1: 0xa15de4ef34a30014c5a2e9ae, limb2: 0x243cc0cec53c778b, }, r1a1: u288 { limb0: 0xcb2a1bf18e3ba9349b0a8bf2, limb1: 0x35134b2505cbb5a4c91f0ac4, limb2: 0x25e45206b13f43c4, }, }, G2Line { r0a0: u288 { limb0: 0x8e97b007ffd9891bd0e77650, limb1: 0x77671278ac33f17df6b1db88, limb2: 0x243daddc47f5d5c2, }, r0a1: u288 { limb0: 0x655fe4c8bbe5ee06aaa0054b, limb1: 0xf751450b02c93c7ddea95938, limb2: 0x21aa988e950d563f, }, r1a0: u288 { limb0: 0xb51b3b6b8582de3eb0549518, limb1: 0x84a1031766b7e465f5bbf40c, limb2: 0xd46c2d5b95e5532, }, r1a1: u288 { limb0: 0x50b6ddd8a5eef0067652191e, limb1: 0x298832a0bc46ebed8bff6190, limb2: 0xb568b4fe8311f93, }, }, G2Line { r0a0: u288 { limb0: 0x6ad6cf94fc3bf4bfbd69ba1d, limb1: 0x806961a05ecbb229a267a99d, limb2: 0x1671d0fb2e942009, }, r0a1: u288 { limb0: 0x2e9b86ac823b3213d26fe614, limb1: 0x48a66f0ee2f66e6be68a4eab, limb2: 0x9162eb41435b523, }, r1a0: u288 { limb0: 0xeda3ea2df37c2c19a07e26a6, limb1: 0x96cb3f72bef333861a5f6793, limb2: 0x6e84ee455d519bf, }, r1a1: u288 { limb0: 0x52f50c292b08883fa721dada, limb1: 0x2029cc6ef51b67f2f30e583a, limb2: 0xb289cfc0164b2ed, }, }, G2Line { r0a0: u288 { limb0: 0x6c70c1e14706dbfd33efe75c, limb1: 0xbd47837fd6f0a808a8cac5c3, limb2: 0x1b60ad36bb1e656e, }, r0a1: u288 { limb0: 0x833e70940a681aa43a083ad0, limb1: 0x3ffecc6d09b7a0ea1df06988, limb2: 0x216e7660abbec411, }, r1a0: u288 { limb0: 0xdaddeff80a0eccefcd3726b4, limb1: 0xd7b4c983581d4e9b3f210f17, limb2: 0x26bf9b818756e2b, }, r1a1: u288 { limb0: 0xb32fd7bd9890bbed35311a72, limb1: 0xa30e2587947d85bbece4c62f, limb2: 0x197a3b46e94f9f24, }, }, G2Line { r0a0: u288 { limb0: 0xddb4db99db681d35f71a159c, limb1: 0xf71a330019414e6fdee75700, limb2: 0x14d9838e7d1918bb, }, r0a1: u288 { limb0: 0x203c8bac71951a5f2c653710, limb1: 0x9fc93f8da38ecc2957313982, limb2: 0x7b6d981259cabd9, }, r1a0: u288 { limb0: 0xa7297cdb5be0cc45d48ca6af, limb1: 0xa07b4b025ebe6c960eddfc56, limb2: 0xef2a5c30ef00652, }, r1a1: u288 { limb0: 0xb7f05c76d860e9122b36ecd7, limb1: 0x407d6522e1f9ce2bcbf80eda, limb2: 0x197625a558f32c36, }, }, G2Line { r0a0: u288 { limb0: 0xe6af6774cb7a4b647bc24bc6, limb1: 0x76bea1b00f9735d1977d2636, limb2: 0xc89d9397e87260c, }, r0a1: u288 { limb0: 0x96bf96a3ec6330e2471bedb, limb1: 0xaefe1b80eabbd9aea0986912, limb2: 0x2060760fa91e6007, }, r1a0: u288 { limb0: 0x7bcc695f496777a5639d8e67, limb1: 0x521bb49545544f2017835a37, limb2: 0x23bd13f6824a9c20, }, r1a1: u288 { limb0: 0x2a7663f245635451e8e9395b, limb1: 0x2a618c0e730e827ea1b6c5b8, limb2: 0x4b769d1e5ea2d59, }, }, G2Line { r0a0: u288 { limb0: 0xb0f04df9dec94801e48a6ff7, limb1: 0xdc59d087c627d38334e5b969, limb2: 0x3d36e11420be053, }, r0a1: u288 { limb0: 0xc80f070001aa1586189e0215, limb1: 0xff849fcbbbe7c00c83ab5282, limb2: 0x2a2354b2882706a6, }, r1a0: u288 { limb0: 0x48cf70c80f08b6c7dc78adb2, limb1: 0xc6632efa77b36a4a1551d003, limb2: 0xc2d3533ece75879, }, r1a1: u288 { limb0: 0x63e82ba26617416a0b76ddaa, limb1: 0xdaceb24adda5a049bed29a50, limb2: 0x1a82061a3344043b, }, }, G2Line { r0a0: u288 { limb0: 0x5870b524b1a3550dd400ccc5, limb1: 0x852bc0b37d0f914b8073f12f, limb2: 0x16509ed87eff5a4e, }, r0a1: u288 { limb0: 0x88260fe925feb155aed3786a, limb1: 0x67d1bdd00f0234c2f4bfc1dc, limb2: 0x2d447aa64752d13, }, r1a0: u288 { limb0: 0x61cd38a81ad2ff47aed15d31, limb1: 0xbca0f1fb3a56f9f221477273, limb2: 0x24049dab533565eb, }, r1a1: u288 { limb0: 0x6c2add460f1dc00897d5b5da, limb1: 0x35bb326b6d5280eee3f8c765, limb2: 0x13a4b8025098500, }, }, G2Line { r0a0: u288 { limb0: 0x9152fecf0f523415acc7c7be, limb1: 0xd9632cbfccc4ea5d7bf31177, limb2: 0x2d7288c5f8c83ab1, }, r0a1: u288 { limb0: 0x53144bfe4030f3f9f5efda8, limb1: 0xfeec394fbf392b11c66bae27, limb2: 0x28840813ab8a200b, }, r1a0: u288 { limb0: 0xdec3b11fbc28b305d9996ec7, limb1: 0x5b5f8d9d17199e149c9def6e, limb2: 0x10c1a149b6751bae, }, r1a1: u288 { limb0: 0x665e8eb7e7d376a2d921c889, limb1: 0xfdd76d06e46ee1a943b8788d, limb2: 0x8bb21d9960e837b, }, }, G2Line { r0a0: u288 { limb0: 0x3a67c28a175200e631aa506a, limb1: 0x7397303a34968ff17c06e801, limb2: 0x1b81e0c63123688b, }, r0a1: u288 { limb0: 0x3490cfd4f076c621dac4a12c, limb1: 0xec183578c91b90b72e5887b7, limb2: 0x179fb354f608da00, }, r1a0: u288 { limb0: 0x9322bde2044dde580a78ba33, limb1: 0xfc74821b668d3570cad38f8b, limb2: 0x8cec54a291f5e57, }, r1a1: u288 { limb0: 0xc2818b6a9530ee85d4b2ae49, limb1: 0x8d7b651ad167f2a43d7a2d0a, limb2: 0x7c9ca9bab0ffc7f, }, }, G2Line { r0a0: u288 { limb0: 0x5622114faf115105095ab77f, limb1: 0x54762377d7848bf1c52b1fce, limb2: 0x1f97b82262bcf5d6, }, r0a1: u288 { limb0: 0x6085f868127e9f82a6324ea7, limb1: 0x88a39c58534935bde6a49ab, limb2: 0x7f8a3494505b851, }, r1a0: u288 { limb0: 0xd3eabc17c5e2f4e09171b9dd, limb1: 0x1925fbd52a9cb6a997959648, limb2: 0x21518ac51afc3758, }, r1a1: u288 { limb0: 0x6096ef3f52e60023239e48e4, limb1: 0x865e3876b961acac0b78e525, limb2: 0x860d5900ad68c37, }, }, G2Line { r0a0: u288 { limb0: 0x2ad5fd7aad65b27d37fb015a, limb1: 0x481729d76f6a024e82fb745d, limb2: 0x109a944738eaca6a, }, r0a1: u288 { limb0: 0x3297a180bf2677cff3ccb41f, limb1: 0xa65e1bdf4bb474832f0a5157, limb2: 0x1978ab7a84d8651b, }, r1a0: u288 { limb0: 0x708be8948dd3360c8723e464, limb1: 0xbaed9d16b05c7d52f3e91f9f, limb2: 0x1975a6b856112bc2, }, r1a1: u288 { limb0: 0xdff0a3ede7d8433f08340a93, limb1: 0xd6415eabeb4ddb811aa617b2, limb2: 0xdb9f4e71e973c6, }, }, G2Line { r0a0: u288 { limb0: 0xa576408f8300de3a7714e6ae, limb1: 0xe1072c9a16f202ecf37fbc34, limb2: 0x1b0cb1e2b5871263, }, r0a1: u288 { limb0: 0x2128e2314694b663286e231e, limb1: 0x54bea71957426f002508f715, limb2: 0x36ecc5dbe069dca, }, r1a0: u288 { limb0: 0x17c77cd88f9d5870957850ce, limb1: 0xb7f4ec2bc270ce30538fe9b8, limb2: 0x766279e588592bf, }, r1a1: u288 { limb0: 0x1b6caddf18de2f30fa650122, limb1: 0x40b77237a29cada253c126c6, limb2: 0x74ff1349b1866c8, }, }, G2Line { r0a0: u288 { limb0: 0x1266deaa34cf31d6d118b057, limb1: 0x7eef7892b3efd91c5364259c, limb2: 0x1f4ac5e1bdc33dac, }, r0a1: u288 { limb0: 0x1068831212b6fe1b5aa05f22, limb1: 0xc39adbfe99701ca7671003e3, limb2: 0x1ab8e56b642f5f82, }, r1a0: u288 { limb0: 0xd53d59610ebf7f664c23c080, limb1: 0x3d162ffb5a16aafc8be99bd3, limb2: 0x281e77e14f6bb9c0, }, r1a1: u288 { limb0: 0x4fe123e56c3c2c64a4260c7b, limb1: 0x90c367228a761d9c50be237c, limb2: 0xf07b0465615fe71, }, }, G2Line { r0a0: u288 { limb0: 0x3603266e05560becab36faef, limb1: 0x8c3b88c9390278873dd4b048, limb2: 0x24a715a5d9880f38, }, r0a1: u288 { limb0: 0xe9f595b111cfd00d1dd28891, limb1: 0x75c6a392ab4a627f642303e1, limb2: 0x17b34a30def82ab6, }, r1a0: u288 { limb0: 0xe706de8f35ac8372669fc8d3, limb1: 0x16cc7f4032b3f3ebcecd997d, limb2: 0x166eba592eb1fc78, }, r1a1: u288 { limb0: 0x7d584f102b8e64dcbbd1be9, limb1: 0x2ead4092f009a9c0577f7d3, limb2: 0x2fe2c31ee6b1d41e, }, }, G2Line { r0a0: u288 { limb0: 0x72253d939632f8c28fb5763, limb1: 0x9b943ab13cad451aed1b08a2, limb2: 0xdb9b2068e450f10, }, r0a1: u288 { limb0: 0x80f025dcbce32f6449fa7719, limb1: 0x8a0791d4d1ed60b86e4fe813, limb2: 0x1b1bd5dbce0ea966, }, r1a0: u288 { limb0: 0xaa72a31de7d815ae717165d4, limb1: 0x501c29c7b6aebc4a1b44407f, limb2: 0x464aa89f8631b3a, }, r1a1: u288 { limb0: 0x6b8d137e1ea43cd4b1f616b1, limb1: 0xdd526a510cc84f150cc4d55a, limb2: 0x1da2ed980ebd3f29, }, }, G2Line { r0a0: u288 { limb0: 0x72dfbb2159ade3ca2db9a485, limb1: 0xaf353e749a0b0e126b462bd4, limb2: 0x11a356fc91502fd1, }, r0a1: u288 { limb0: 0xa8da111fc2adcd5b3152926b, limb1: 0x9d2cd58a348021fb039ad1ce, limb2: 0x24a89d0c2aa1a4c, }, r1a0: u288 { limb0: 0xb7eadf0666fe1d5d8e00ddd3, limb1: 0x9fa7fbf853bdf5b9620cae4c, limb2: 0x2b6df7a5b1f6cfa3, }, r1a1: u288 { limb0: 0x30a81454c2cc541ca6ac5028, limb1: 0xd14ccb5778ca0679f43b0042, limb2: 0x2b15bb249061229, }, }, G2Line { r0a0: u288 { limb0: 0xff2a45b22df6665c3f2b3433, limb1: 0x47f06d2821bccb7d4e1442dc, limb2: 0x1d6d005a3a962538, }, r0a1: u288 { limb0: 0xbc3869f85e6c5199ae4d48ae, limb1: 0xf1b658ebf5d88598be4f771c, limb2: 0x10ce0fad17dffce6, }, r1a0: u288 { limb0: 0x9057fbbd4dbd1f42e143f536, limb1: 0xb84a12963d2bdeff0cfb15cc, limb2: 0xf055cbcbcad6397, }, r1a1: u288 { limb0: 0x2b6c8f90506d8c5f45a796c2, limb1: 0x15647362232ed3834e25f304, limb2: 0x10c73cc1383f51b5, }, }, G2Line { r0a0: u288 { limb0: 0x867cced8a010850958f41ff5, limb1: 0x6a37fdb2b8993eed18bafe8e, limb2: 0x21b9f782109e5a7, }, r0a1: u288 { limb0: 0x7307477d650618e66de38d0f, limb1: 0xacb622ce92a7e393dbe10ba1, limb2: 0x236e70838cee0ed5, }, r1a0: u288 { limb0: 0xb564a308aaf5dda0f4af0f0d, limb1: 0x55fc71e2f13d8cb12bd51e74, limb2: 0x294cf115a234a9e9, }, r1a1: u288 { limb0: 0xbd166057df55c135b87f35f3, limb1: 0xf9f29b6c50f1cce9b85ec9b, limb2: 0x2e8448d167f20f96, }, }, G2Line { r0a0: u288 { limb0: 0xfcb1d8cfddd4980727750419, limb1: 0xe57b3100fcf5fcd46e1cff24, limb2: 0x1ea2a9f23e471d2f, }, r0a1: u288 { limb0: 0x8278659319480914a8f915c3, limb1: 0xb9d01b3a1f3df0c8481b47c7, limb2: 0x1dce2891e1df8e91, }, r1a0: u288 { limb0: 0x373890191ad2139b5ac37f5e, limb1: 0x7d00bf061594cf869f26bd35, limb2: 0x263941972f0c5bcc, }, r1a1: u288 { limb0: 0x35d21a939f18acadda6398c4, limb1: 0x2f266751d30024c345fd2f64, limb2: 0x12415712f84fa7c6, }, }, G2Line { r0a0: u288 { limb0: 0xdedaff3205bb953b2c390b8a, limb1: 0xe1a899da21c1dafb485c707e, limb2: 0x1ec897e7a041493e, }, r0a1: u288 { limb0: 0xf52c3c30cd4d3202b34089e0, limb1: 0xc652aa1ff533e1aad7532305, limb2: 0x2a1df766e5e3aa2e, }, r1a0: u288 { limb0: 0x7ac695d3e19d79b234daaf3d, limb1: 0x5ce2f92666aec92a650feee1, limb2: 0x21ab4fe20d978e77, }, r1a1: u288 { limb0: 0xa64a913a29a1aed4e0798664, limb1: 0x66bc208b511503d127ff5ede, limb2: 0x2389ba056de56a8d, }, }, G2Line { r0a0: u288 { limb0: 0x65ab6317a706e3cda223edf8, limb1: 0x9a22ac3ac5e4dd3e9f987fd9, limb2: 0x157637901a8b31a5, }, r0a1: u288 { limb0: 0xc57d325b1af3a13019c15e11, limb1: 0x2812651fd79b5fbbb05cc3d7, limb2: 0x1f1602a02e76536f, }, r1a0: u288 { limb0: 0xdf3ad97a0633d33f5a8cea32, limb1: 0xd15238b33edfeb16cffd44ea, limb2: 0x5a03a044b07b640, }, r1a1: u288 { limb0: 0x58fec495c4c681cf797762a1, limb1: 0xd3ac0af0d5cb5bff7f4fa8e8, limb2: 0x286d6218242eddb4, }, }, G2Line { r0a0: u288 { limb0: 0xd88b16e68600a12e6c1f6006, limb1: 0x333243b43d3b7ff18d0cc671, limb2: 0x2b84b2a9b0f03ed8, }, r0a1: u288 { limb0: 0xf3e2b57ddaac822c4da09991, limb1: 0xd7c894b3fe515296bb054d2f, limb2: 0x10a75e4c6dddb441, }, r1a0: u288 { limb0: 0x73c65fbbb06a7b21b865ac56, limb1: 0x21f4ecd1403bb78729c7e99b, limb2: 0xaf88a160a6b35d4, }, r1a1: u288 { limb0: 0xade61ce10b8492d659ff68d0, limb1: 0x1476e76cf3a8e0df086ad9eb, limb2: 0x2e28cfc65d61e946, }, }, G2Line { r0a0: u288 { limb0: 0xdf8b54b244108008e7f93350, limb1: 0x2ae9a68b9d6b96f392decd6b, limb2: 0x160b19eed152271c, }, r0a1: u288 { limb0: 0xc18a8994cfbb2e8df446e449, limb1: 0x408d51e7e4adedd8f4f94d06, limb2: 0x27661b404fe90162, }, r1a0: u288 { limb0: 0x1390b2a3b27f43f7ac73832c, limb1: 0x14d57301f6002fd328f2d64d, limb2: 0x17f3fa337367dddc, }, r1a1: u288 { limb0: 0x79cab8ff5bf2f762c5372f80, limb1: 0xc979d6f385fae4b5e4785acf, limb2: 0x60c5307a735b00f, }, }, G2Line { r0a0: u288 { limb0: 0x42e951ca7dac29d65a14ab82, limb1: 0x140be62e3d419b811acf5756, limb2: 0x11523c7fc2a37270, }, r0a1: u288 { limb0: 0x593b29e6aad3cadd506d93bd, limb1: 0x59976c08d37982b9c28495c3, limb2: 0xc924925bb5976fe, }, r1a0: u288 { limb0: 0xcb18016afc265e1a5fc80af0, limb1: 0xd830297a058f529ef5e3f97e, limb2: 0x253a39d5462f1882, }, r1a1: u288 { limb0: 0x2b081ad5589d7f1cedb120a9, limb1: 0x956ae1847a5ce3f261e1e1e7, limb2: 0x1afd47a0e8c0dbeb, }, }, G2Line { r0a0: u288 { limb0: 0xb70b988a54003f89b0376a63, limb1: 0xff28c025f2f710e53ac37b9e, limb2: 0x2e441c518d3fe68d, }, r0a1: u288 { limb0: 0x660ddad555982e7994df37fb, limb1: 0x6c04f02c84dc80d8305f0357, limb2: 0x23b41d5762cf7f0f, }, r1a0: u288 { limb0: 0xa2f0ccb1a552683ea3ac0798, limb1: 0xb33b544006bac5a1fd372830, limb2: 0x24afb0cbc42170a7, }, r1a1: u288 { limb0: 0xf93faa0be992488deb617b04, limb1: 0x86fb2bb1f07dfeef85b2886, limb2: 0x189649259453ed83, }, }, G2Line { r0a0: u288 { limb0: 0x386d7b23c6dccb87637018c9, limb1: 0xfed2ea478e9a2210289079e2, limb2: 0x100aa83cb843353e, }, r0a1: u288 { limb0: 0x229c5c285f049d04c3dc5ce7, limb1: 0x28110670fe1d38c53ffcc6f7, limb2: 0x1778918279578f50, }, r1a0: u288 { limb0: 0xe9ad2c7b8a17a1f1627ff09d, limb1: 0xedff5563c3c3e7d2dcc402ec, limb2: 0xa8bd6770b6d5aa8, }, r1a1: u288 { limb0: 0x66c5c1aeed5c04470b4e8a3d, limb1: 0x846e73d11f2d18fe7e1e1aa2, limb2: 0x10a60eabe0ec3d78, }, }, G2Line { r0a0: u288 { limb0: 0x9dafcca7f80fb028e1550b13, limb1: 0x510e07802d526954395ad6d6, limb2: 0x34f031507e71a70, }, r0a1: u288 { limb0: 0xac7b6a137d96e956dd4f2773, limb1: 0x2692998b32154b368c857fee, limb2: 0x2ea30d00a23e6587, }, r1a0: u288 { limb0: 0x69f3776dd7fd4db9bde03967, limb1: 0x16efb004aa3f44e6ac5fdd29, limb2: 0x361dd68590907c0, }, r1a1: u288 { limb0: 0x445681532c126e7c428445b7, limb1: 0xfa2b7d974e59a61f57bcd949, limb2: 0x258ce35529e9f923, }, }, G2Line { r0a0: u288 { limb0: 0x88ca191d85be1f6c205257ef, limb1: 0xd0cecf5c5f80926c77fd4870, limb2: 0x16ec42b5cae83200, }, r0a1: u288 { limb0: 0x154cba82460752b94916186d, limb1: 0x564f6bebac05a4f3fb1353ac, limb2: 0x2d47a47da836d1a7, }, r1a0: u288 { limb0: 0xb39c4d6150bd64b4674f42ba, limb1: 0x93c967a38fe86f0779bf4163, limb2: 0x1a51995a49d50f26, }, r1a1: u288 { limb0: 0xeb7bdec4b7e304bbb0450608, limb1: 0x11fc9a124b8c74b3d5560ea4, limb2: 0xbfa9bd7f55ad8ac, }, }, G2Line { r0a0: u288 { limb0: 0x2cb6407193c4b5c315a00755, limb1: 0x33dcf6b5051abc2c59b801ab, limb2: 0x16f1a436a0abadf6, }, r0a1: u288 { limb0: 0x3398c4073878ea089b0c7b80, limb1: 0x49d08a1ce731c9b194b93e64, limb2: 0x2c1a19007bb6f21c, }, r1a0: u288 { limb0: 0x6b305edfc565d8cb06fa559e, limb1: 0x43ee87287e1f2f15d6631f33, limb2: 0x1cd36451c5666f9c, }, r1a1: u288 { limb0: 0x650c38aae0bd3882a6556860, limb1: 0x8e04c37290ae5a6bb3eb1f91, limb2: 0x12e57f5774525f20, }, }, G2Line { r0a0: u288 { limb0: 0x2fdc574c85cf0c0ce5e07a51, limb1: 0xd2439bf7b00bddc4cfb01b0c, limb2: 0x125c3bbdeb0bd2da, }, r0a1: u288 { limb0: 0x9d664714bae53cafcb5ef55d, limb1: 0x495c01724790853548f5e4de, limb2: 0x2ce5e2e263725941, }, r1a0: u288 { limb0: 0x98071eb7fe88c9124aee3774, limb1: 0xc3f66947a52bd2f6d520579f, limb2: 0x2eaf775dbd52f7d3, }, r1a1: u288 { limb0: 0x23e5594948e21db2061dca92, limb1: 0xd0ffa6f6c77290531c185431, limb2: 0x604c085de03afb1, }, }, G2Line { r0a0: u288 { limb0: 0xf884b2ccf06f8da655d3142, limb1: 0xdece09e25a509a7dd0b73bde, limb2: 0xa6830f44f8a0e0d, }, r0a1: u288 { limb0: 0x36cc33f5e41d078c07a952fe, limb1: 0xa3c7be8095228c58e49910b2, limb2: 0x2d863134dbfbae7f, }, r1a0: u288 { limb0: 0x83786a541018cb79e6baccf6, limb1: 0x9c73f5fa4f111743dfb0b581, limb2: 0x22faefa4bfa9f387, }, r1a1: u288 { limb0: 0x2f25834de3d2ec7bda75abc7, limb1: 0x4526dbfbc8f7d9e1c71c8375, limb2: 0x1f3bb15443413d60, }, }, G2Line { r0a0: u288 { limb0: 0xeec2912e15f6bda39d4e005e, limb1: 0x2b8610c44d27bdbc6ba2aac5, limb2: 0x78ddc4573fc1fed, }, r0a1: u288 { limb0: 0x48099a0da11ea21de015229d, limb1: 0x5fe937100967d5cc544f4af1, limb2: 0x2c9ffe6d7d7e9631, }, r1a0: u288 { limb0: 0xa70d251296ef1ae37ceb7d03, limb1: 0x2adadcb7d219bb1580e6e9c, limb2: 0x180481a57f22fd03, }, r1a1: u288 { limb0: 0xacf46db9631037dd933eb72a, limb1: 0x8a58491815c7656292a77d29, limb2: 0x261e3516c348ae12, }, }, G2Line { r0a0: u288 { limb0: 0x62b45634f0eaf51f5bc4003c, limb1: 0x13ff6a6fc286b5b754548ac3, limb2: 0x1670dac54842d28b, }, r0a1: u288 { limb0: 0x85fe43906582fc736d926df3, limb1: 0xf077151ea6da959af3c290f6, limb2: 0xc8cebcafaa4ae47, }, r1a0: u288 { limb0: 0x7540aff585c27cb2fa15c662, limb1: 0x5cf456bcd4fa0e3bbae0f467, limb2: 0x24a1c8ecb9c907e9, }, r1a1: u288 { limb0: 0x19ba1bf552affd897d561632, limb1: 0x1df4a4d8d77248957809f88e, limb2: 0x1d7484a0c0251cdc, }, }, G2Line { r0a0: u288 { limb0: 0x2bfa32f0a09c3e2cfb8f6a38, limb1: 0x7a24df3ff3c7119a59d49318, limb2: 0x10e42281d64907ba, }, r0a1: u288 { limb0: 0xce42177a66cdeb4207d11e0c, limb1: 0x3322aa425a9ca270152372ad, limb2: 0x2f7fa83db407600c, }, r1a0: u288 { limb0: 0x62a8ff94fd1c7b9035af4446, limb1: 0x3ad500601bbb6e7ed1301377, limb2: 0x254d253ca06928f, }, r1a1: u288 { limb0: 0xf8f1787cd8e730c904b4386d, limb1: 0x7fd3744349918d62c42d24cc, limb2: 0x28a05e105d652eb8, }, }, G2Line { r0a0: u288 { limb0: 0x6ef31e059d602897fa8e80a8, limb1: 0x66a0710847b6609ceda5140, limb2: 0x228c0e568f1eb9c0, }, r0a1: u288 { limb0: 0x7b47b1b133c1297b45cdd79b, limb1: 0x6b4f04ed71b58dafd06b527b, limb2: 0x13ae6db5254df01a, }, r1a0: u288 { limb0: 0xbeca2fccf7d0754dcf23ddda, limb1: 0xe3d0bcd7d9496d1e5afb0a59, limb2: 0x305a0afb142cf442, }, r1a1: u288 { limb0: 0x2d299847431477c899560ecf, limb1: 0xbcd9e6c30bedee116b043d8d, limb2: 0x79473a2a7438353, }, }, G2Line { r0a0: u288 { limb0: 0xae3712a6ef6034d7fcbc318c, limb1: 0xedba25c96439aeb3954ccff7, limb2: 0x1a0d73e3d8d90330, }, r0a1: u288 { limb0: 0xff6fb0e919bd80f29065244, limb1: 0xfdcac02f3dd2e9268271021f, limb2: 0x202e92badc53f790, }, r1a0: u288 { limb0: 0xec674cc5d55fcd80ab9fc167, limb1: 0xb9f7f1fd7f1e4936802c19d1, limb2: 0x27ac3aca37743af5, }, r1a1: u288 { limb0: 0xe49dfebb538630697c09c39d, limb1: 0x56732676796d1f91ecab12ad, limb2: 0xb010d1b0f285dbd, }, }, G2Line { r0a0: u288 { limb0: 0xb431b974a13b9d75e11033b8, limb1: 0xa4b7192e2b5f3730bd216f73, limb2: 0x53cf4b349760f42, }, r0a1: u288 { limb0: 0x3c87efcabaa8e22835e19e2, limb1: 0xfc9cf42672502f3fb7917c8f, limb2: 0x11123549a68499c8, }, r1a0: u288 { limb0: 0xf91da96d0c078dea22787ecb, limb1: 0xd165ceed6f64338e6288e1d3, limb2: 0x23490db5de27b468, }, r1a1: u288 { limb0: 0x419e0eafdcf6226512a9ec6a, limb1: 0x1c6fb8110315ae80c4bf92ec, limb2: 0x2ad5f86e5d3bc1c3, }, }, G2Line { r0a0: u288 { limb0: 0x65b71fe695e7ccd4b460dace, limb1: 0xa6ceba62ef334e6fe91301d5, limb2: 0x299f578d0f3554e6, }, r0a1: u288 { limb0: 0xaf781dd030a274e7ecf0cfa4, limb1: 0x2095020d373a14d7967797aa, limb2: 0x6a7f9df6f185bf8, }, r1a0: u288 { limb0: 0x8e91e2dba67d130a0b274df3, limb1: 0xe192a19fce285c12c6770089, limb2: 0x6e9acf4205c2e22, }, r1a1: u288 { limb0: 0xbcd5c206b5f9c77d667189bf, limb1: 0x656a7e2ebc78255d5242ca9, limb2: 0x25f43fec41d2b245, }, }, G2Line { r0a0: u288 { limb0: 0xd6c95bb06c0e9a55a56a85c0, limb1: 0xf5d3c4d860aee402df7d0cd6, limb2: 0xa90fbb3a7bcfb07, }, r0a1: u288 { limb0: 0xbfca0761240adb98fdf8e23d, limb1: 0xe6052ca38781d13cf53921cb, limb2: 0x780debeee0578b2, }, r1a0: u288 { limb0: 0xbe285fa3e37b0222a1c65921, limb1: 0xb9fbb60c587b00d8ecf22359, limb2: 0x284f4ced8b0b28f5, }, r1a1: u288 { limb0: 0x34e69be4d8eea470c08f07e8, limb1: 0x651617bebb0020b71bf6a8a7, limb2: 0xde62a1da13dfd78, }, }, G2Line { r0a0: u288 { limb0: 0x4e56e6733cce20d9c5b16d96, limb1: 0xc7ef260535fb75b9d3e089f, limb2: 0x292dd4aa636e7729, }, r0a1: u288 { limb0: 0x6e7e1038b336f36519c9faaf, limb1: 0x3c66bd609510309485e225c7, limb2: 0x10cacac137411eb, }, r1a0: u288 { limb0: 0x4a3e8b96278ac092fe4f3b15, limb1: 0xba47e583e2750b42f93c9631, limb2: 0x125da6bd69495bb9, }, r1a1: u288 { limb0: 0xae7a56ab4b959a5f6060d529, limb1: 0xc3c263bfd58c0030c063a48e, limb2: 0x2f4d15f13fae788c, }, }, G2Line { r0a0: u288 { limb0: 0x301e0885c84d273b6d323124, limb1: 0x11fd5c75e269f7a30fa4154f, limb2: 0x19afdcfdcce2fc0d, }, r0a1: u288 { limb0: 0x3d13519f934526be815c38b0, limb1: 0xd43735909547da73838874fc, limb2: 0x255d8aca30f4e0f6, }, r1a0: u288 { limb0: 0x90a505b76f25a3396e2cea79, limb1: 0x3957a2d0848c54b9079fc114, limb2: 0x1ba0cd3a9fe6d4bb, }, r1a1: u288 { limb0: 0xc47930fba77a46ebb1db30a9, limb1: 0x993a1cb166e9d40bebab02b2, limb2: 0x1deb16166d48118b, }, }, G2Line { r0a0: u288 { limb0: 0xb8cf2af23a2795446a3a73f1, limb1: 0x13715e2237eeb02ee6666cee, limb2: 0xa85c6edf4e39ba5, }, r0a1: u288 { limb0: 0x1f36efdd6931269960bdf4de, limb1: 0xfe9eff4c19216c4ae441fee1, limb2: 0x25db1c938c941000, }, r1a0: u288 { limb0: 0xe13bf721634b56a80c6fb0a8, limb1: 0xda0b9ea6704efbd8451cfd41, limb2: 0x279768e0c2762893, }, r1a1: u288 { limb0: 0x2dc5403124b8b2766caf51c7, limb1: 0xb9ed0b96060674c35d818388, limb2: 0x6f9a41b549839dd, }, }, G2Line { r0a0: u288 { limb0: 0xbd4aa4e5ed3e0c30bf730048, limb1: 0x80e73a7e12b5104f4ec40460, limb2: 0x13db913428ce629c, }, r0a1: u288 { limb0: 0xa90e04c07af34a3af7b9ae23, limb1: 0xf939d213913f9c4b23910d94, limb2: 0xff8ab1b303ea87a, }, r1a0: u288 { limb0: 0x38c7e37660597198162fa157, limb1: 0xa81284a580d040713c0531af, limb2: 0x110351898a488800, }, r1a1: u288 { limb0: 0x2c97092cce4fdaa715b6afde, limb1: 0x1a698f4e2982c281c0c42464, limb2: 0x1bd1c4a7975a22f5, }, }, G2Line { r0a0: u288 { limb0: 0xb15bbaec50ff49d30e49f74a, limb1: 0xc90a8c79fb045c5468f14151, limb2: 0x25e47927e92df0e3, }, r0a1: u288 { limb0: 0x57f66909d5d40dfb8c7b4d5c, limb1: 0xea5265282e2139c48c1953f2, limb2: 0x2d7f5e6aff2381f6, }, r1a0: u288 { limb0: 0x2a2f573b189a3c8832231394, limb1: 0x738abc15844895ffd4733587, limb2: 0x20aa11739c4b9bb4, }, r1a1: u288 { limb0: 0x51695ec614f1ff4cce2f65d1, limb1: 0x6765aae6cb895a2406a6dd7e, limb2: 0x1126ee431c522da0, }, }, G2Line { r0a0: u288 { limb0: 0xe7f01d9086cd6bea2f41aa99, limb1: 0x704bab1c6c11f635823c0730, limb2: 0x1aa5e3110773f18e, }, r0a1: u288 { limb0: 0x85c070793b8763c74570e65c, limb1: 0x2af5c8f295dafb150ffb4b8b, limb2: 0xda734f5191394b9, }, r1a0: u288 { limb0: 0x4875f74e54ce34f890a6c795, limb1: 0x9ae6a24d7c63f7240996ac21, limb2: 0x2a7c9cc67d33db65, }, r1a1: u288 { limb0: 0xb014ee4eda66723db93d7d9a, limb1: 0x7d3eb5638239c427a57ce71f, limb2: 0x1b0456063dc2a87c, }, }, G2Line { r0a0: u288 { limb0: 0x9214fc3209f1518b05fd21c6, limb1: 0x9bc8ce4f56423009710770e8, limb2: 0x32445cc6972799c, }, r0a1: u288 { limb0: 0x93ef401ecd9cfae3644d22e6, limb1: 0xce5a741a9847a144cfaf8c96, limb2: 0xf7a814d5726da4a, }, r1a0: u288 { limb0: 0xd19264d986f163b133a91c0c, limb1: 0x529dc5ce4b193c0f672c6a32, limb2: 0x2e9a118959353374, }, r1a1: u288 { limb0: 0x3d97d6e8f45072cc9e85e412, limb1: 0x4dafecb04c3bb23c374f0486, limb2: 0xa174dd4ac8ee628, }, }, G2Line { r0a0: u288 { limb0: 0xfa6e20eaa5b8acce6161c367, limb1: 0x3d8d035c6953305cfb8065a4, limb2: 0x40bb50e482935b, }, r0a1: u288 { limb0: 0x4c506a8e01c5144fa535163b, limb1: 0x61030d954c1196c840ee7931, limb2: 0x2f221fa9c7e3b5ae, }, r1a0: u288 { limb0: 0x2613b98211a31e101b009375, limb1: 0xe4cfbf39bf10d39059fcec56, limb2: 0x196add035e14330e, }, r1a1: u288 { limb0: 0xcc093368ee2558dabe10c7be, limb1: 0x206a20357ce007c45165fee6, limb2: 0xd4fb39f4b1fde10, }, }, G2Line { r0a0: u288 { limb0: 0x98d8b0c4adcf27bceb305c2c, limb1: 0x859afa9c7668ed6152d8cba3, limb2: 0x29e7694f46e3a272, }, r0a1: u288 { limb0: 0x1d970845365594307ba97556, limb1: 0xd002d93ad793e154afe5b49b, limb2: 0x12ca77d3fb8eee63, }, r1a0: u288 { limb0: 0x9f2934faefb8268e20d0e337, limb1: 0xbc4b5e1ec056881319f08766, limb2: 0x2e103461759a9ee4, }, r1a1: u288 { limb0: 0x7adc6cb87d6b43000e2466b6, limb1: 0x65e5cefa42b25a7ee8925fa6, limb2: 0x2560115898d7362a, }, }, G2Line { r0a0: u288 { limb0: 0x823969b5ec0f79a94f88d36b, limb1: 0x3512d9e09a8b4a8e1084dc32, limb2: 0x1af1156b9c8d06e6, }, r0a1: u288 { limb0: 0xafd7dd0f120256e11800dee8, limb1: 0x3a317cae149063c44cf7fa8c, limb2: 0x2bd8ea8b2474d1e5, }, r1a0: u288 { limb0: 0xe1772b865b838d58dd129624, limb1: 0xbe9458968158c433742dbcd0, limb2: 0x22b6d697a5a3b888, }, r1a1: u288 { limb0: 0xbff3b00a55f411bbc1dad2fe, limb1: 0x7ae09ac6313e3c00759461ae, limb2: 0x558601ecf31c85, }, }, G2Line { r0a0: u288 { limb0: 0x64d864643668392c0e357cc4, limb1: 0x4c9bf66853f1b287015ab84c, limb2: 0x2f5f1b92ad7ee4d4, }, r0a1: u288 { limb0: 0xdc33c8da5c575eef6987a0e1, limb1: 0x51cc07c7ef28e1b8d934bc32, limb2: 0x2358d94a17ec2a44, }, r1a0: u288 { limb0: 0xf659845b829bbba363a2497b, limb1: 0x440f348e4e7bed1fb1eb47b2, limb2: 0x1ad0eaab0fb0bdab, }, r1a1: u288 { limb0: 0x1944bb6901a1af6ea9afa6fc, limb1: 0x132319df135dedddf5baae67, limb2: 0x52598294643a4aa, }, }, G2Line { r0a0: u288 { limb0: 0x76fd94c5e6f17fa6741bd7de, limb1: 0xc2e0831024f67d21013e0bdd, limb2: 0x21e2af6a43119665, }, r0a1: u288 { limb0: 0xad290eab38c64c0d8b13879b, limb1: 0xdd67f881be32b09d9a6c76a0, limb2: 0x8000712ce0392f2, }, r1a0: u288 { limb0: 0xd30a46f4ba2dee3c7ace0a37, limb1: 0x3914314f4ec56ff61e2c29e, limb2: 0x22ae1ba6cd84d822, }, r1a1: u288 { limb0: 0x5d888a78f6dfce9e7544f142, limb1: 0x9439156de974d3fb6d6bda6e, limb2: 0x106c8f9a27d41a4f, }, }, G2Line { r0a0: u288 { limb0: 0x6092d1d633b2160a27266d5b, limb1: 0x80d00c798b74744e2d6c9897, limb2: 0x6aca1e5b3d6e760, }, r0a1: u288 { limb0: 0x3f695b0e7bf0e735a060a1fc, limb1: 0x21c516331ac46f6f1940a79c, limb2: 0x9fb99bd56e3cfd0, }, r1a0: u288 { limb0: 0x125cd061734e6d82260bff31, limb1: 0x7b1fb56a17f3832fd3c026f3, limb2: 0xdafb0c1b7a07131, }, r1a1: u288 { limb0: 0x449a0a17221fac459caf049a, limb1: 0x4bbd5645024fe09ba86f662d, limb2: 0x295e6b43830d7473, }, }, G2Line { r0a0: u288 { limb0: 0x138792ff5a46d835c3927fde, limb1: 0x498899eff0ddfb1e2a6a2a63, limb2: 0xfaff0a267eddd92, }, r0a1: u288 { limb0: 0xfffeb2ff28064301c583286, limb1: 0x223c9e6d3ae5d55a899db5e2, limb2: 0x1a88e4cac54f8190, }, r1a0: u288 { limb0: 0xcfbe06117f1f6dea20f8379f, limb1: 0x6b831cd38c1741b394a2f18d, limb2: 0xd44868b638ab5cd, }, r1a1: u288 { limb0: 0x21a8bd3280686ca4d3c4a764, limb1: 0x3b3576220bbc08abcec8478b, limb2: 0x29b73d7c0c8ff4ce, }, }, G2Line { r0a0: u288 { limb0: 0x92c09e4796207b802168341b, limb1: 0xd2d9d6acffd7829066cc49ce, limb2: 0xc89c2d0a7b2c81e, }, r0a1: u288 { limb0: 0x47e3c1cf6cdb6f3efe778c7f, limb1: 0x66b347099b6436794cf062eb, limb2: 0x18b4ccc64ae0a857, }, r1a0: u288 { limb0: 0x7d5793606a73b2740c71484a, limb1: 0xa0070135ca2dc571b28e3c9c, limb2: 0x1bc03576e04b94cf, }, r1a1: u288 { limb0: 0x1ba85b29875e638c10f16c99, limb1: 0x158f2f2acc3c2300bb9f9225, limb2: 0x42d8a8c36ea97c6, }, }, G2Line { r0a0: u288 { limb0: 0x491a2a2eb92babf14d2c70ed, limb1: 0x88adfa10d27cbf95efc87ca9, limb2: 0x1ea367cb9628819e, }, r0a1: u288 { limb0: 0xf832704f9fde600131526e2, limb1: 0x943da98740594bc8573bc424, limb2: 0x225058a1522f4c77, }, r1a0: u288 { limb0: 0xf43027c8e85927d41ef51aa6, limb1: 0x6d6d7aa318f97e5043973413, limb2: 0x11a037a0589e5f86, }, r1a1: u288 { limb0: 0x45f2d483ce8e645ed19421cb, limb1: 0x6363b56540ef0ea0331819ca, limb2: 0x2b5c9bfcfb64a95f, }, }, G2Line { r0a0: u288 { limb0: 0x9440ad13408319cecb07087b, limb1: 0x537afc0c0cfe8ff761c24e08, limb2: 0x48e4ac10081048d, }, r0a1: u288 { limb0: 0xa37fb82b03a2c0bb2aa50c4f, limb1: 0xd3797f05c8fb84f6b630dfb, limb2: 0x2dffde2d6c7e43ff, }, r1a0: u288 { limb0: 0xc55d2eb1ea953275e780e65b, limb1: 0xe141cf680cab57483c02e4c7, limb2: 0x1b71395ce5ce20ae, }, r1a1: u288 { limb0: 0xe4fab521f1212a1d301065de, limb1: 0x4f8d31c78df3dbe4ab721ef2, limb2: 0x2828f21554706a0e, }, }, G2Line { r0a0: u288 { limb0: 0x8cefc2f2af2a3082b790784e, limb1: 0x97ac13b37c6fbfc736a3d456, limb2: 0x683b1cdffd60acd, }, r0a1: u288 { limb0: 0xa266a8188a8c933dcffe2d02, limb1: 0x18d3934c1838d7bce81b2eeb, limb2: 0x206ac5cdda42377, }, r1a0: u288 { limb0: 0x90332652437f6e177dc3b28c, limb1: 0x75bd8199433d607735414ee8, limb2: 0x29d6842d8298cf7e, }, r1a1: u288 { limb0: 0xadedf46d8ea11932db0018e1, limb1: 0xbc7239ae9d1453258037befb, limb2: 0x22e7ebdd72c6f7a1, }, }, G2Line { r0a0: u288 { limb0: 0x3a7dc5b45b0cd09dd75ff780, limb1: 0x2902bd9bd8ba8605b3662044, limb2: 0x1ec042f89cec2f4a, }, r0a1: u288 { limb0: 0x3e484c01e1c71dad604b6e00, limb1: 0x63cd271538443abcbe242bee, limb2: 0x10c38586e25d160e, }, r1a0: u288 { limb0: 0xc406f3abf9503a06bdeb2eef, limb1: 0x8653c7da6db9ab8b17639151, limb2: 0xad22e688ec88604, }, r1a1: u288 { limb0: 0x50fc42dbc609f56f660d8b86, limb1: 0x56a81c62935f53a8194e5d90, limb2: 0x2b27bb15c58ff0c3, }, }, G2Line { r0a0: u288 { limb0: 0xacc013a37118e98a394f1114, limb1: 0x97e3d97d841f62677ad653b1, limb2: 0xfa27c5f03ef3e74, }, r0a1: u288 { limb0: 0x9599de7b6e6a8aeef6b63e52, limb1: 0x73e39f958d986d83148d8c8a, limb2: 0x208d43519f69f381, }, r1a0: u288 { limb0: 0x898b0f8615e3cf94474d7196, limb1: 0x82213cada178b34ae97fdb67, limb2: 0x11a8f2b07229c348, }, r1a1: u288 { limb0: 0x8a100eb3750e818962602ec3, limb1: 0xdca2571e9fc5588275e810fd, limb2: 0x290c599d240303ec, }, }, G2Line { r0a0: u288 { limb0: 0x348e15357d9299e582033136, limb1: 0x53578c46b15abb39da35a56e, limb2: 0x1043b711f86bb33f, }, r0a1: u288 { limb0: 0x9fa230a629b75217f0518e7c, limb1: 0x77012a4bb8751322a406024d, limb2: 0x121e2d845d972695, }, r1a0: u288 { limb0: 0x5600f2d51f21d9dfac35eb10, limb1: 0x6fde61f876fb76611fb86c1a, limb2: 0x2bf4fbaf5bd0d0df, }, r1a1: u288 { limb0: 0xd732aa0b6161aaffdae95324, limb1: 0xb3c4f8c3770402d245692464, limb2: 0x2a0f1740a293e6f0, }, }, G2Line { r0a0: u288 { limb0: 0x481b93066804d8e4a43ea2f5, limb1: 0x29399b4d554a5731966efdf4, limb2: 0x100692df233dfccb, }, r0a1: u288 { limb0: 0xa03028f9394d39e5aff150c2, limb1: 0x82b1b27285e7d875b1cc49e8, limb2: 0x1aa360e1848acc84, }, r1a0: u288 { limb0: 0xc358787d7c823681590988f, limb1: 0xa3e33a227d61efc5734e48e4, limb2: 0x15e7e41317f696d9, }, r1a1: u288 { limb0: 0x73141ff9e75e2761d8d99b93, limb1: 0x48b8fbe75ec09c4496c9652f, limb2: 0x1edc83253b7ac568, }, }, G2Line { r0a0: u288 { limb0: 0xa9e2efa41aaa98ab59728940, limb1: 0x163c0425f66ce72daef2f53e, limb2: 0x2feaf1b1770aa7d8, }, r0a1: u288 { limb0: 0x3bb7afd3c0a79b6ac2c4c063, limb1: 0xee5cb42e8b2bc999e312e032, limb2: 0x1af2071ae77151c3, }, r1a0: u288 { limb0: 0x1cef1c0d8956d7ceb2b162e7, limb1: 0x202b4af9e51edfc81a943ded, limb2: 0xc9e943ffbdcfdcb, }, r1a1: u288 { limb0: 0xe18b1b34798b0a18d5ad43dd, limb1: 0x55e8237731941007099af6b8, limb2: 0x1472c0290db54042, }, }, G2Line { r0a0: u288 { limb0: 0xe6100d19eaef8d37a80e60df, limb1: 0x4ef3e1a2b34daa1c2be28701, limb2: 0x92500ae61c29ded, }, r0a1: u288 { limb0: 0xcb5fe102a0a2aeb5f2b1d8b5, limb1: 0x48c7bc91c8b114893d8b23cd, limb2: 0x21268b5f3137e05e, }, r1a0: u288 { limb0: 0x67b383adbc235c125e89ac73, limb1: 0xf140e37cce399681b4f96b6c, limb2: 0x29da1de8b7c2764b, }, r1a1: u288 { limb0: 0x3a20a1e0817f5af4c383af92, limb1: 0xb6447b112ca3c55500553bae, limb2: 0xad54da1adb037ab, }, }, G2Line { r0a0: u288 { limb0: 0xb4c7963e0d1dc082de0725e, limb1: 0x375a7a3d765918de24804223, limb2: 0xf177b77b031596d, }, r0a1: u288 { limb0: 0x87a7b9c5f10500b0b40d7a1e, limb1: 0x6f234d1dc7f1394b55858810, limb2: 0x26288146660a3914, }, r1a0: u288 { limb0: 0xa6308c89cebe40447abf4a9a, limb1: 0x657f0fdda13b1f8ee314c22, limb2: 0x1701aabc250a9cc7, }, r1a1: u288 { limb0: 0x9db9bf660dc77cbe2788a755, limb1: 0xbdf9c1c15a4bd502a119fb98, limb2: 0x14b4de3d26bd66e1, }, }, G2Line { r0a0: u288 { limb0: 0x53c49c62ca96007e14435295, limb1: 0x85aeb885e4123ca8d3232fdf, limb2: 0x750017ce108abf3, }, r0a1: u288 { limb0: 0xba6bf3e25d370182e4821239, limb1: 0x39de83bf370bd2ba116e8405, limb2: 0x2b8417a72ba6d940, }, r1a0: u288 { limb0: 0xa922f50550d349849b14307b, limb1: 0x569766b6feca6143a5ddde9d, limb2: 0x2c3c6765b25a01d, }, r1a1: u288 { limb0: 0x6016011bdc3b506563b0f117, limb1: 0xbab4932beab93dde9b5b8a5c, limb2: 0x1bf3f698de0ace60, }, }, G2Line { r0a0: u288 { limb0: 0x6cd6d068630c95ff7923dace, limb1: 0x327c95abb26719a3e4f307d4, limb2: 0x1622ee5d85fd5915, }, r0a1: u288 { limb0: 0x3b0cab292557116e4a91297c, limb1: 0x73e3c8e25063487150b2b475, limb2: 0x10b9c1c61e8b6478, }, r1a0: u288 { limb0: 0xd5edff0ce6e33bb98c43f4a5, limb1: 0xdefbbd27923dd717a2029ccd, limb2: 0x1dde221b1cae459, }, r1a1: u288 { limb0: 0xf582a6716fc11b9594c7cda2, limb1: 0x4b375f530154fbdd63e5feb, limb2: 0xb49455f93935ab, }, }, G2Line { r0a0: u288 { limb0: 0x54fcd4a24d259b46df23323f, limb1: 0x47e6fdfb9c428d378a40ff4e, limb2: 0x1df34ff52254dff6, }, r0a1: u288 { limb0: 0xe0c10735495ed8f5cd2e4be0, limb1: 0xc86bc1fb1f401ef4df3b1cd0, limb2: 0x28c43896b60b6285, }, r1a0: u288 { limb0: 0x1c96043ad27370916cb891b4, limb1: 0x87329ba866d1b2e138d8c107, limb2: 0x2969b2c3e19a125a, }, r1a1: u288 { limb0: 0x439d38ff3bfb073cf2b5661f, limb1: 0x40fd99e28d8fb2f2ff6a20e7, limb2: 0x182bde6af8c937b7, }, }, G2Line { r0a0: u288 { limb0: 0xb9f05ffda3ee208f990ff3a8, limb1: 0x6201d08440b28ea672b9ea93, limb2: 0x1ed60e5a5e778b42, }, r0a1: u288 { limb0: 0x8e8468b937854c9c00582d36, limb1: 0x7888fa8b2850a0c555adb743, limb2: 0xd1342bd01402f29, }, r1a0: u288 { limb0: 0xf5c4c66a974d45ec754b3873, limb1: 0x34322544ed59f01c835dd28b, limb2: 0x10fe4487a871a419, }, r1a1: u288 { limb0: 0xedf4af2df7c13d6340069716, limb1: 0x8592eea593ece446e8b2c83b, limb2: 0x12f9280ce8248724, }, }, G2Line { r0a0: u288 { limb0: 0x2ddf82dac5876ef85cbd9209, limb1: 0x589fcd0afc56475897b6712f, limb2: 0xbd4b3348385e23b, }, r0a1: u288 { limb0: 0x1c3aa02855ddee9cd40d4eae, limb1: 0xf6ed3e19ac13cbd2012f796a, limb2: 0x1dc1b58676a8f698, }, r1a0: u288 { limb0: 0xc4830930ba2848c2f39f43da, limb1: 0xa0fc7164985c553cef876d41, limb2: 0x18fce7cada9deef8, }, r1a1: u288 { limb0: 0xedb28e73d7e312b0bfe1fa45, limb1: 0xed4ae4b37915b6888b40ee88, limb2: 0x5cf09de42e4f82a, }, }, G2Line { r0a0: u288 { limb0: 0xe67f72c6d45f1bb04403139f, limb1: 0x9233e2a95d3f3c3ff2f7e5b8, limb2: 0x1f931e8e4343b028, }, r0a1: u288 { limb0: 0x20ef53907af71803ce3ca5ca, limb1: 0xd99b6637ee9c73150b503ea4, limb2: 0x1c9759def8a98ea8, }, r1a0: u288 { limb0: 0xa0a3b24c9089d224822fad53, limb1: 0xdfa2081342a7a895062f3e50, limb2: 0x185e8cf6b3e494e6, }, r1a1: u288 { limb0: 0x8752a12394b29d0ba799e476, limb1: 0x1493421da067a42e7f3d0f8f, limb2: 0x67e7fa3e3035edf, }, }, G2Line { r0a0: u288 { limb0: 0x125ce6d868f59b6805a98a6e, limb1: 0x9229c7ee5700f2429eadaecb, limb2: 0x292c838c4deb5f8d, }, r0a1: u288 { limb0: 0x5325a1514f8ee43d2ed16153, limb1: 0x63c33b5123f4ecb9e010da3c, limb2: 0x1e0f5d09063cd187, }, r1a0: u288 { limb0: 0x605cc50180814223b30419fe, limb1: 0xb08ee4b45c98923764c3c996, limb2: 0x2e496c94d4ce61d7, }, r1a1: u288 { limb0: 0x7f916e4957b0d0a9c5aa8e89, limb1: 0x1b4099fb9348cb6604b6644d, limb2: 0x2fa7202e6e45ebd0, }, }, G2Line { r0a0: u288 { limb0: 0x6d6138c95464e5e774ae7ba0, limb1: 0xe6ca73a5498e4ccd4bb68fc7, limb2: 0x15bf8aa8ed1beff6, }, r0a1: u288 { limb0: 0xabd7c55a134ed405b4966d3c, limb1: 0xe69dd725ccc4f9dd537fe558, limb2: 0x2df4a03e2588a8f1, }, r1a0: u288 { limb0: 0x7cf42890de0355ffc2480d46, limb1: 0xe33c2ad9627bcb4b028c2358, limb2: 0x2a18767b40de20bd, }, r1a1: u288 { limb0: 0x79737d4a87fab560f3d811c6, limb1: 0xa88fee5629b91721f2ccdcf7, limb2: 0x2b51c831d3404d5e, }, }, G2Line { r0a0: u288 { limb0: 0x16a889bc98dbba30d0e85f7c, limb1: 0xfcada96c42f00ced918d942e, limb2: 0x2cc9b3197de097a5, }, r0a1: u288 { limb0: 0x66b312469ce97517a7e5f585, limb1: 0x320485962e1cd1ce5609b3ad, limb2: 0x2f5ed56d2b372567, }, r1a0: u288 { limb0: 0x50a883556bfbb1f8d5f9d8a3, limb1: 0x4aa6753d1fea97e3b8aac1f1, limb2: 0x301980e220bb49ed, }, r1a1: u288 { limb0: 0xe7614ace25bd3a3830b64ecf, limb1: 0x38dedb346af32c21784b968c, limb2: 0x101dfcee3c535929, }, }, G2Line { r0a0: u288 { limb0: 0x9812f6145cf7e949fa207f20, limb1: 0x4061c36b08d5bcd408b14f19, limb2: 0x8332e08b2eb51ed, }, r0a1: u288 { limb0: 0xa4a7ae8f65ba180c523cb33, limb1: 0xb71fabbdc78b1128712d32a5, limb2: 0x2acd1052fd0fefa7, }, r1a0: u288 { limb0: 0x6ea5598e221f25bf27efc618, limb1: 0xa2c2521a6dd8f306f86d6db7, limb2: 0x13af144288655944, }, r1a1: u288 { limb0: 0xea469c4b390716a6810fff5d, limb1: 0xf8052694d0fdd3f40b596c20, limb2: 0x24d0ea6c86e48c5c, }, }, G2Line { r0a0: u288 { limb0: 0x2e39be614d904bafea58a8cd, limb1: 0xf53f0a6a20a1f1783b0ea2d0, limb2: 0x99c451b7bb726d7, }, r0a1: u288 { limb0: 0x28ec54a4ca8da838800c573d, limb1: 0xb78365fa47b5e192307b7b87, limb2: 0x2df87aa88e012fec, }, r1a0: u288 { limb0: 0xfb7022881c6a6fdfb18de4aa, limb1: 0xb9bd30f0e93c5b93ad333bab, limb2: 0x1dd20cbccdeb9924, }, r1a1: u288 { limb0: 0x16d8dfdf790a6be16a0e55ba, limb1: 0x90ab884395509b9a264472d4, limb2: 0xeaec571657b6e9d, }, }, G2Line { r0a0: u288 { limb0: 0xdf8d520c2fd45b16da910ca7, limb1: 0x2023ab59c06742c107d21389, limb2: 0x474f8d201c2003a, }, r0a1: u288 { limb0: 0xc46ba70245e0d604d975ec09, limb1: 0x921be51a6779f8abc213a42b, limb2: 0x737865d13506920, }, r1a0: u288 { limb0: 0xebde3248ae4a49e4ca67667c, limb1: 0x55021936a806c18771a5b497, limb2: 0xeddf62dee5cd01d, }, r1a1: u288 { limb0: 0x840eb64075057d76ec783626, limb1: 0xd09ec083f029b05d8cf747e8, limb2: 0x29923f4182ebbd77, }, }, G2Line { r0a0: u288 { limb0: 0x797d2ef5c1d08447d0723c47, limb1: 0x5e3d0a3367a49356be559196, limb2: 0x1ac7d70481f3e230, }, r0a1: u288 { limb0: 0xec5fd0d82c9efcda61aec42a, limb1: 0xd18c0e943f37d7060aebd361, limb2: 0x11985d67f47debff, }, r1a0: u288 { limb0: 0x71ec5d0ede447fc2d2b8d30a, limb1: 0x6d732f49bca172dde108d14e, limb2: 0xa187b54b3aa09fe, }, r1a1: u288 { limb0: 0x366c39d4f024f7ffcc1f190d, limb1: 0xb25354b8c4a9a95e3c632091, limb2: 0x94ede742a6d279b, }, }, G2Line { r0a0: u288 { limb0: 0xce78fc6505db036c10fac771, limb1: 0x61f8c0bc7f60ad6415d5e419, limb2: 0x59009c5cf9ea663, }, r0a1: u288 { limb0: 0xb3b3f697fc34d64ba053b914, limb1: 0x317af5815ce5bfffc5a6bc97, limb2: 0x23f97fee4deda847, }, r1a0: u288 { limb0: 0xf559e09cf7a02674ac2fa642, limb1: 0x4fa7548b79cdd054e203689c, limb2: 0x2173b379d546fb47, }, r1a1: u288 { limb0: 0x758feb5b51caccff9da0f78f, limb1: 0xd7f37a1008233b74c4894f55, limb2: 0x917c640b4b9627e, }, }, G2Line { r0a0: u288 { limb0: 0xdfce680eeda9dab9f624300d, limb1: 0x3332e1bcaad5d683961ea721, limb2: 0x428540bb4a391d0, }, r0a1: u288 { limb0: 0x3f654faa3518ed9595db752b, limb1: 0xebecb7527a9c9bc0e35974f2, limb2: 0x14bcaa1d4c941ce0, }, r1a0: u288 { limb0: 0x332ed31f8babcb1fb1902637, limb1: 0xa3d0543357fc3e835fe62d46, limb2: 0x1ba5e26829d040d8, }, r1a1: u288 { limb0: 0x26ad9a6548dbeda3a0cb37ac, limb1: 0xe2ddec0f5eb83e84b3af4a3e, limb2: 0x2f95fb7eb636c829, }, }, G2Line { r0a0: u288 { limb0: 0x72548e0d946b796842cfecd8, limb1: 0x78b54b355e3c26476b0fab82, limb2: 0x2dc9f32c90b6ba31, }, r0a1: u288 { limb0: 0xa943be83a6fc90414320753b, limb1: 0xd708fde97241095833ce5a08, limb2: 0x142111e6a73d2e82, }, r1a0: u288 { limb0: 0xc79e8d5465ec5f28781e30a2, limb1: 0x697fb9430b9ad050ced6cce, limb2: 0x1a9d647149842c53, }, r1a1: u288 { limb0: 0x9bab496952559362586725cd, limb1: 0xbe78e5a416d9665be64806de, limb2: 0x147b550afb4b8b84, }, }, G2Line { r0a0: u288 { limb0: 0xde3f0cc8eb9d8bc0524ffa31, limb1: 0xa29420171bca522f8e0d0ab4, limb2: 0x1c527b5683d4814d, }, r0a1: u288 { limb0: 0xb831225213716dec94efc1de, limb1: 0x970dd107965ba3923ab9d17a, limb2: 0x2bfb03ab5ab6d7e9, }, r1a0: u288 { limb0: 0x41fa2c98128b2070cbf6c33d, limb1: 0xde4def6e8343cd45841c0890, limb2: 0x12f1cede76e2b8d7, }, r1a1: u288 { limb0: 0x2aadf4029e19b185f59187a, limb1: 0xb4e7dd0e3b5c1a62be0f0e48, limb2: 0x2029ea04d9e4c426, }, }, G2Line { r0a0: u288 { limb0: 0x1422e11013fe6cdd7f843391, limb1: 0xfb96092ab69fc530e27d8d8e, limb2: 0xe39e04564fedd0, }, r0a1: u288 { limb0: 0xbd4e81e3b4db192e11192788, limb1: 0x805257d3c2bdbc344a15ce0d, limb2: 0x10ddd4f47445106b, }, r1a0: u288 { limb0: 0x87ab7f750b693ec75bce04e1, limb1: 0x128ba38ebed26d74d26e4d69, limb2: 0x2f1d22a64c983ab8, }, r1a1: u288 { limb0: 0x74207c17f5c8335183649f77, limb1: 0x7144cd3520ac2e1be3204133, limb2: 0xb38d0645ab3499d, }, }, G2Line { r0a0: u288 { limb0: 0x5daa65d81efa0ef1b3b5406, limb1: 0x759ff07b1035fc39169a31ee, limb2: 0x101ca4f03f0629e, }, r0a1: u288 { limb0: 0x10cdf0ef882fb24b6a44bbd3, limb1: 0x580b99e84dc07e055656849b, limb2: 0x253201b38848e657, }, r1a0: u288 { limb0: 0x8fbd353430e804cbac89ec28, limb1: 0xdaee431fd72f78e22a236faa, limb2: 0x48b73245c4dad79, }, r1a1: u288 { limb0: 0xd98cc2ed22a85b0f8c63206e, limb1: 0xd2aec0400ab5850c7f0fa8cf, limb2: 0x649735015bf42af, }, }, G2Line { r0a0: u288 { limb0: 0x49173a889c697b0ab07f35bc, limb1: 0xdcffb65f4b4c21ced6b623af, limb2: 0x1366d12ee6022f7b, }, r0a1: u288 { limb0: 0x285fdce362f7a79b89c49b5c, limb1: 0xae9358c8eaf26e2fed7353f5, limb2: 0x21c91fefaf522b5f, }, r1a0: u288 { limb0: 0x748798f96436e3b18c64964a, limb1: 0xfc3bb221103d3966d0510599, limb2: 0x167859ae2ebc5e27, }, r1a1: u288 { limb0: 0xe3b55b05bb30e23fa7eba05b, limb1: 0xa5fc8b7f7bc6abe91c90ddd5, limb2: 0xe0da83c6cdebb5a, }, }, G2Line { r0a0: u288 { limb0: 0x30a4abff5957209783681bfb, limb1: 0x82d868d5ca421e4f1a0daf79, limb2: 0x1ba96ef98093d510, }, r0a1: u288 { limb0: 0xd9132c7f206a6c036a39e432, limb1: 0x8a2dfb94aba29a87046110b8, limb2: 0x1fad2fd5e5e37395, }, r1a0: u288 { limb0: 0x76b136dc82b82e411b2c44f6, limb1: 0xe405f12052823a54abb9ea95, limb2: 0xf125ba508c26ddc, }, r1a1: u288 { limb0: 0x1bae07f5f0cc48e5f7aac169, limb1: 0x47d1288d741496a960e1a979, limb2: 0xa0911f6cc5eb84e, }, }, G2Line { r0a0: u288 { limb0: 0x9f79430d5ef315d742ba7cc2, limb1: 0x20aacc886043783d85b20292, limb2: 0x1323cd0f26d8101a, }, r0a1: u288 { limb0: 0x10b2ac6faa0f2c6d21dd1a46, limb1: 0x692a71ed6ead0995c1dd5f06, limb2: 0x38e5099a87e0acb, }, r1a0: u288 { limb0: 0x47ae74d8002447773c1ed5c6, limb1: 0xbeefb67ce6653bc31410cc77, limb2: 0x38bcbf510e04693, }, r1a1: u288 { limb0: 0x87f7dfe2a9704d878a43c43a, limb1: 0x388417c8c9596caee4b8f3c8, limb2: 0x2231862dd6ea5377, }, }, G2Line { r0a0: u288 { limb0: 0x8824ae4e52f07175b229f86c, limb1: 0xea266c73c6740dc7206d703e, limb2: 0xa0bcd21da42425d, }, r0a1: u288 { limb0: 0x91c8d9f501c8c2411d65a5b2, limb1: 0x6f693a3cbab19d3ac5acf696, limb2: 0x2cb77ffe6050fd13, }, r1a0: u288 { limb0: 0x127d86621c661371e92e5fd, limb1: 0x5a334ed75d208520e997f2e3, limb2: 0x3e78ee48b36d52b, }, r1a1: u288 { limb0: 0x640d7cc8a8916f3987fcc33c, limb1: 0x82738853adee48da240f6b1c, limb2: 0x1a0013b7fe68edfa, }, }, G2Line { r0a0: u288 { limb0: 0x2e7b3a5a35456f42e87968e6, limb1: 0xb4303f5093c3a460674a2fcd, limb2: 0x2b5331f03b8fa15f, }, r0a1: u288 { limb0: 0x7cea371d64d8bd0fc5b9427e, limb1: 0x76208e15fc175e352c274fbe, limb2: 0x5ceb46647d41234, }, r1a0: u288 { limb0: 0x6cdac06bfcf041a30435a560, limb1: 0x15a7ab7ed1df6d7ed12616a6, limb2: 0x2520b0f462ad4724, }, r1a1: u288 { limb0: 0xe8b65c5fff04e6a19310802f, limb1: 0xc96324a563d5dab3cd304c64, limb2: 0x230de25606159b1e, }, }, G2Line { r0a0: u288 { limb0: 0x65202a838e48a9d934e11db8, limb1: 0xeb46c664339ef677558bbb71, limb2: 0x132ac06128a0a57b, }, r0a1: u288 { limb0: 0xbc21baf183836fa8dc9de81c, limb1: 0x806b66e601e4ff52a20e891a, limb2: 0x12e535eb6ae922c1, }, r1a0: u288 { limb0: 0xc0b103b1723019de05b304a3, limb1: 0xff8f7760a660a16df500b596, limb2: 0x8db75dc6535f297, }, r1a1: u288 { limb0: 0x3a686dcde09afac7da57832c, limb1: 0xa5947df796243b62fa4da442, limb2: 0x259924e4a773bef0, }, }, G2Line { r0a0: u288 { limb0: 0xb2236e5462d1e11842039bb5, limb1: 0x8d746dd0bb8bb2a455d505c1, limb2: 0x2fd3f4a905e027ce, }, r0a1: u288 { limb0: 0x3d6d9836d71ddf8e3b741b09, limb1: 0x443f16e368feb4cb20a5a1ab, limb2: 0xb5f19dda13bdfad, }, r1a0: u288 { limb0: 0x4e5612c2b64a1045a590a938, limb1: 0xbca215d075ce5769db2a29d7, limb2: 0x161e651ebdfb5065, }, r1a1: u288 { limb0: 0xc02a55b6685351f24e4bf9c7, limb1: 0x4134240119050f22bc4991c8, limb2: 0x300bd9f8d76bbc11, }, }, G2Line { r0a0: u288 { limb0: 0xe9296a3a3aed4c4143d2e0ba, limb1: 0x7de973514b499b2da739b3e6, limb2: 0x1b4b807986fcdee0, }, r0a1: u288 { limb0: 0xb9295fecce961afe0c5e6dad, limb1: 0xc4e30c322bcae6d526c4de95, limb2: 0x1fee592f513ed6b2, }, r1a0: u288 { limb0: 0x7245f5e5e803d0d448fafe21, limb1: 0xcbdc032ecb3b7a63899c53d0, limb2: 0x1fde9ffc17accfc3, }, r1a1: u288 { limb0: 0x8edcc1b2fdd35c87a7814a87, limb1: 0x99d54b5c2fe171c49aa9cb08, limb2: 0x130ef740e416a6fe, }, }, G2Line { r0a0: u288 { limb0: 0x38f941f3820c4025d48597c4, limb1: 0x4270c36c42111e8a83bed2ed, limb2: 0x2d0d91a20b75cbb9, }, r0a1: u288 { limb0: 0x5ac829defc8a29c4e18ec184, limb1: 0x3ad0a15a0dd4df948ef5ff02, limb2: 0xf618f631c37e868, }, r1a0: u288 { limb0: 0xf96e4555f7a83c01c2b1d33f, limb1: 0x74ee4e7ee57979aed686387d, limb2: 0x1c3d7a9c3d45957f, }, r1a1: u288 { limb0: 0x210a733628cff21f964acf38, limb1: 0x58addf725f511f5c0f3c4c48, limb2: 0x25c47d2540c2db11, }, }, G2Line { r0a0: u288 { limb0: 0x40675e9847f925e0cd58ff84, limb1: 0x19a957ff534718c419e1b3a6, limb2: 0xbb2e95d559fbe61, }, r0a1: u288 { limb0: 0x70bd9ffbe4ec1ca028fc7d77, limb1: 0x12b76b14785c6e62da580b73, limb2: 0x15b1b31fd06f755f, }, r1a0: u288 { limb0: 0x92dd2c2444d613dfaa53a1e3, limb1: 0xec043691d9b8376ef4c32dbb, limb2: 0x1804f2db8a7b3a55, }, r1a1: u288 { limb0: 0xe8ad6e24b323fdb6cc8189a9, limb1: 0x501fc22cd9d6c75bfcfe658e, limb2: 0x4669f457c82b8e1, }, }, G2Line { r0a0: u288 { limb0: 0x537ecf0916b38aeea21d4e47, limb1: 0x181a00de27ba4be1b380d6c8, limb2: 0x8c2fe2799316543, }, r0a1: u288 { limb0: 0xe68fff5ee73364fff3fe403b, limb1: 0x7b8685c8a725ae79cfac8f99, limb2: 0x7b4be349766aba4, }, r1a0: u288 { limb0: 0xdf7c93c0095545ad5e5361ea, limb1: 0xce316c76191f1e7cd7d03f3, limb2: 0x22ea21f18ddec947, }, r1a1: u288 { limb0: 0xa19620b4c32db68cc1c2ef0c, limb1: 0xffa1e4be3bed5faba2ccbbf4, limb2: 0x16fc78a64c45f518, }, }, G2Line { r0a0: u288 { limb0: 0x2b6af476f520b4bf804415bc, limb1: 0xd949ee7f9e8874698b090fca, limb2: 0x34db5e5ec2180cf, }, r0a1: u288 { limb0: 0x3e06a324f038ac8abcfb28d7, limb1: 0xc2e6375b7a83c0a0145f8942, limb2: 0x2247e79161483763, }, r1a0: u288 { limb0: 0x708773d8ae3a13918382fb9d, limb1: 0xaf83f409556e32aa85ae92bf, limb2: 0x9af0a924ae43ba, }, r1a1: u288 { limb0: 0xa6fded212ff5b2ce79755af7, limb1: 0x55a2adfb2699ef5de6581b21, limb2: 0x2476e83cfe8daa5c, }, }, G2Line { r0a0: u288 { limb0: 0x9ab1f3d5a481c50cff61b4ab, limb1: 0x11f4705a4954e6a036be2ad2, limb2: 0x308f243a8a83264, }, r0a1: u288 { limb0: 0x5f19b29c09416b2fd501f695, limb1: 0xd0a5c0a568ca5e38f82b2f7a, limb2: 0x8abaf41ba2b92f5, }, r1a0: u288 { limb0: 0x6cc5a6aa31c75bfb717c7828, limb1: 0x96fe9ee8789208c41d57d3b8, limb2: 0x1ff348bb7825845a, }, r1a1: u288 { limb0: 0x23e6063e1cca25fa4a6e992e, limb1: 0xe94e827315d1667557cbe7de, limb2: 0x2cc27fe4c068e1df, }, }, G2Line { r0a0: u288 { limb0: 0x5de7a643e301caa63b685021, limb1: 0x933a277a93f708227c90f768, limb2: 0x426809a902d5047, }, r0a1: u288 { limb0: 0xbb25fb66cb4bf4c7ec50bdbd, limb1: 0x52a75a0facd2b7bf0ea93bec, limb2: 0x1f265ce4dbe1a42b, }, r1a0: u288 { limb0: 0xc5717cea7518c3550b4d5f4, limb1: 0xc95394cb07fdfc22e63d990a, limb2: 0x2b4bcc47347e8eb5, }, r1a1: u288 { limb0: 0xc5a6f1284ee2bdd4922c2508, limb1: 0xcd55e1d8ff43e6dd59224505, limb2: 0x2c376da2c4c11de5, }, }, G2Line { r0a0: u288 { limb0: 0x1c4759bcf7c607fe3f839d4d, limb1: 0xea91f311da73327e2ed40785, limb2: 0x2017052c72360f42, }, r0a1: u288 { limb0: 0x38cf8a4368c0709980199fc3, limb1: 0xfc9047885996c19e84d7d4ea, limb2: 0x1795549eb0b97783, }, r1a0: u288 { limb0: 0xb70f7ecfbec0eaf46845e8cc, limb1: 0x9ddf274c2a9f89ea3bc4d66f, limb2: 0xcc6f106abfcf377, }, r1a1: u288 { limb0: 0xf6ff11ce29186237468c2698, limb1: 0x5c629ad27bb61e4826bb1313, limb2: 0x2014c6623f1fb55e, }, }, G2Line { r0a0: u288 { limb0: 0xc403ea5ad65aadd602c8c76f, limb1: 0x7a8d2727cd7fa40d97615b39, limb2: 0x14bd9b9bc6c2c1c1, }, r0a1: u288 { limb0: 0xcd28af7919b01761c69bd246, limb1: 0x8a1a211a81094740e2cc984e, limb2: 0x2766e09571dc194c, }, r1a0: u288 { limb0: 0xa24dbe5f1fb539a5d9d39db7, limb1: 0xd7eef78019e82d7e1f77d2f5, limb2: 0x6d7b6e70105c87d, }, r1a1: u288 { limb0: 0x30836b87e6e8553c665ffbe0, limb1: 0xb0474bb94febd802f9049ad0, limb2: 0x2774e72d0844eea4, }, }, G2Line { r0a0: u288 { limb0: 0xc648054e4b6134bbfd68487f, limb1: 0xdf0506dad3f3d098c13a6386, limb2: 0x26bebeb6f46c2e8c, }, r0a1: u288 { limb0: 0x9d0cdb28a94204776c6e6ba6, limb1: 0x303f02dfe619752b1607951d, limb2: 0x1127d8b17ef2c064, }, r1a0: u288 { limb0: 0xe34ca1188b8db4e4694a696c, limb1: 0x243553602481d9b88ca1211, limb2: 0x1f8ef034831d0132, }, r1a1: u288 { limb0: 0xe3a5dfb1785690dad89ad10c, limb1: 0xd690b583ace24ba033dd23e0, limb2: 0x405d0709e110c03, }, }, G2Line { r0a0: u288 { limb0: 0x3b5aa24fe300f5bef5aefca, limb1: 0x5d5566dc41ca40c4af2bf978, limb2: 0x39a42540cb68ab8, }, r0a1: u288 { limb0: 0xe21ea63fac2d99bf899d8353, limb1: 0xecdf87c89dafc1f9be69379b, limb2: 0x1c75e3d0966038ad, }, r1a0: u288 { limb0: 0x7c9f991de50f505a8dc707e7, limb1: 0x259d423172d9927ffb0e98d1, limb2: 0x15fb83693066d1ff, }, r1a1: u288 { limb0: 0x72c144b5e7d364d572576db6, limb1: 0x5d75c50c43614aea3e81a99b, limb2: 0x1ef4651860019554, }, }, G2Line { r0a0: u288 { limb0: 0x72cc2cef2785ce4ff4e9b7af, limb1: 0x60ed5b9c207d7f31fb6234ab, limb2: 0x1bb17a4bc7b643ed, }, r0a1: u288 { limb0: 0x9424eb15b502cde7927c7530, limb1: 0xa0e33edbbaa9de8e9c206059, limb2: 0x2b9a3a63bbf4af99, }, r1a0: u288 { limb0: 0x423811cb6386e606cf274a3c, limb1: 0x8adcc0e471ecfe526f56dc39, limb2: 0x9169a8660d14368, }, r1a1: u288 { limb0: 0xf616c863890c3c8e33127931, limb1: 0xcc9414078a6da6989dae6b91, limb2: 0x594d6a7e6b34ab2, }, }, G2Line { r0a0: u288 { limb0: 0x4617750de3208c0a42bf7c07, limb1: 0x7e2d94e31538522d38df8b23, limb2: 0x23954455da7aef56, }, r0a1: u288 { limb0: 0x6fef0ba4bbf6577133bdc9ae, limb1: 0xcab064e22aaf2ceec03f1b77, limb2: 0x274369683ff67155, }, r1a0: u288 { limb0: 0x5dce7b13d41ff1b90727094f, limb1: 0x426ef23f29c4df03dc8edf8, limb2: 0x313b4cdbf3d9c5e, }, r1a1: u288 { limb0: 0x62c5ac5fd0d7b3ef591e828, limb1: 0x650f8fc6b0fe55eb28d0fca8, limb2: 0xf5bb0abe931a208, }, }, G2Line { r0a0: u288 { limb0: 0xf2d619ae78049bf9141c35cf, limb1: 0x717f8b10d469a1ee2d91f191, limb2: 0x2c72c82fa8afe345, }, r0a1: u288 { limb0: 0xb89321223b82a2dc793c0185, limb1: 0x71506a0cf4adb8e51bb7b759, limb2: 0x2c13b92a98651492, }, r1a0: u288 { limb0: 0x4947ef2c89276f77f9d20942, limb1: 0xb454d68685ab6b6976e71ec5, limb2: 0x19a938d0e78a3593, }, r1a1: u288 { limb0: 0xbe883eb119609b489c01c905, limb1: 0xaa06779922047f52feac5ce6, limb2: 0x76977a3015dc164, }, }, G2Line { r0a0: u288 { limb0: 0x43a96a588005043a46aadf2c, limb1: 0xa37b89d8a1784582f0c52126, limb2: 0x22e9ef3f5d4b2297, }, r0a1: u288 { limb0: 0x8c6f6d8474cf6e5a58468a31, limb1: 0xeb1ce6ac75930ef1c79b07e5, limb2: 0xf49839a756c7230, }, r1a0: u288 { limb0: 0x82b84693a656c8e8c1f962fd, limb1: 0x2c1c8918ae80282208b6b23d, limb2: 0x14d3504b5c8d428f, }, r1a1: u288 { limb0: 0x60ef4f4324d5619b60a3bb84, limb1: 0x6d3090caefeedbc33638c77a, limb2: 0x159264c370c89fec, }, }, G2Line { r0a0: u288 { limb0: 0xa3343aa671fa957f64383174, limb1: 0x5d0fbca92791fb10ca8bfba7, limb2: 0x114f2c6ae3a67df6, }, r0a1: u288 { limb0: 0x50f6b86be16e52076b114eac, limb1: 0x780e63533112887af8e1b20a, limb2: 0x63e07909f8e5150, }, r1a0: u288 { limb0: 0xf4d68bdb295f81fb688b56c9, limb1: 0xabc9867b1aae2bca05251e19, limb2: 0x1a4d8e8bbc5dc905, }, r1a1: u288 { limb0: 0x1072bd332617ade1aa5f283e, limb1: 0x50dc088ed02b4ee5c8114042, limb2: 0x92f0fffce502d7c, }, }, G2Line { r0a0: u288 { limb0: 0xf21ea2700d86757c9edc60fc, limb1: 0x4ed3a4f31b13fbb9fdabfe54, limb2: 0xefdc83e2cd29ae1, }, r0a1: u288 { limb0: 0x36771d39b743a658ed812080, limb1: 0x506453f18d56ef30476706cd, limb2: 0x2658fa02d8abf7ce, }, r1a0: u288 { limb0: 0x4aad4f76dd2af32ff8a6f388, limb1: 0x6aebd448524150ae6bb57548, limb2: 0x2702b8c1fb9a5bfb, }, r1a1: u288 { limb0: 0xe1462da76f807e5e73062316, limb1: 0x244b002de9ef9e9d65b40718, limb2: 0x2672d0c637a3cc19, }, }, ]; ================================================ FILE: src/contracts/mutator_set/src/zk_verifier/honk_verifier_contract.cairo ================================================ use super::honk_verifier_circuits::{ is_on_curve_excluding_infinity_bn254, run_GRUMPKIN_ZKHONK_PREP_MSM_SCALARS_SIZE_17_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_DONE_SIZE_17_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_INIT_SIZE_17_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_LOOP_SIZE_17_circuit, run_GRUMPKIN_ZK_HONK_SUMCHECK_SIZE_17_PUB_19_circuit, }; use super::honk_verifier_constants::{precomputed_lines, vk}; #[starknet::interface] pub trait IUltraKeccakZKHonkVerifier { fn verify_ultra_keccak_zk_honk_proof( self: @TContractState, full_proof_with_hints: Span, ) -> Result, felt252>; } #[starknet::contract] mod UltraKeccakZKHonkVerifier { use core::num::traits::Zero; use garaga::apps::noir::zk_honk_transcript::{ KeccakHasherState, Point256IntoCircuitPoint, ZKHonkTranscriptTrait, ZK_BATCHED_RELATION_PARTIAL_LENGTH, }; use garaga::apps::noir::{G2_POINT_KZG_1, G2_POINT_KZG_2, ZKHonkProof}; use garaga::core::circuit::{U32IntoU384, U64IntoU384, u256_to_u384, u288IntoCircuitInputValue}; use garaga::definitions::{ BN254, G1G2Pair, G1Point, get_BN254_modulus, get_GRUMPKIN_modulus, get_eigenvalue, get_min_one_order, get_nG_glv_fake_glv, get_third_root_of_unity, u384, }; use garaga::ec_ops::{G1PointTrait, GlvFakeGlvHint, _ec_safe_add, _scalar_mul_glv_and_fake_glv}; use garaga::pairing_check::{MPCheckHintBN254, multi_pairing_check_bn254_2P_2F}; use super::{ is_on_curve_excluding_infinity_bn254, precomputed_lines, run_GRUMPKIN_ZKHONK_PREP_MSM_SCALARS_SIZE_17_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_DONE_SIZE_17_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_INIT_SIZE_17_circuit, run_GRUMPKIN_ZK_HONK_EVALS_CONS_LOOP_SIZE_17_circuit, run_GRUMPKIN_ZK_HONK_SUMCHECK_SIZE_17_PUB_19_circuit, vk, }; #[storage] struct Storage {} #[derive(Drop, Serde)] struct FullProof { proof: ZKHonkProof, msm_hint: Span, kzg_hint: MPCheckHintBN254, } #[abi(embed_v0)] impl IUltraKeccakZKHonkVerifier of super::IUltraKeccakZKHonkVerifier { fn verify_ultra_keccak_zk_honk_proof( self: @ContractState, full_proof_with_hints: Span, ) -> Result, felt252> { // DO NOT EDIT THIS FUNCTION UNLESS YOU KNOW WHAT YOU ARE DOING. // This function returns Result::Ok(public_inputs) if the proof is valid. // If the proof is invalid, it returns Result::Err(error). // Read the documentation to learn how to generate the full_proof_with_hints array given // a proof and a verifying key. let mut full_proof_with_hints = full_proof_with_hints; let full_proof = Serde::::deserialize(ref full_proof_with_hints) .expect('deserialization failed'); let mod_bn = get_BN254_modulus(); let mod_grumpkin = get_GRUMPKIN_modulus(); let (transcript, _, base_rlc) = ZKHonkTranscriptTrait::from_proof::< KeccakHasherState, >(full_proof.proof, vk.vk_hash, vk.log_circuit_size); let log_n = vk.log_circuit_size; let (sum_check_rlc, honk_check) = run_GRUMPKIN_ZK_HONK_SUMCHECK_SIZE_17_PUB_19_circuit( p_public_inputs: full_proof.proof.public_inputs, p_pairing_point_object: full_proof.proof.pairing_point_object, libra_sum: u256_to_u384(full_proof.proof.libra_sum), sumcheck_univariates_flat: full_proof .proof .sumcheck_univariates .slice(0, log_n * ZK_BATCHED_RELATION_PARTIAL_LENGTH), sumcheck_evaluations: full_proof.proof.sumcheck_evaluations, libra_evaluation: u256_to_u384(full_proof.proof.libra_evaluation), tp_sum_check_u_challenges: transcript.sum_check_u_challenges.span(), tp_gate_challenge: transcript.gate_challenge, tp_eta_1: transcript.eta.into(), tp_eta_2: transcript.eta_two.into(), tp_eta_3: transcript.eta_three.into(), tp_beta: transcript.beta.into(), tp_gamma: transcript.gamma.into(), tp_base_rlc: base_rlc.into(), tp_alpha: transcript.alpha, tp_libra_challenge: transcript.libra_challenge.into(), modulus: mod_grumpkin, ); let (mut challenge_poly_eval, mut root_power_times_tp_gemini_r) = run_GRUMPKIN_ZK_HONK_EVALS_CONS_INIT_SIZE_17_circuit( tp_gemini_r: transcript.gemini_r.into(), modulus: mod_grumpkin, ); for i in 0..vk.log_circuit_size { let (new_challenge_poly_eval, new_root_power_times_tp_gemini_r) = run_GRUMPKIN_ZK_HONK_EVALS_CONS_LOOP_SIZE_17_circuit( challenge_poly_eval: challenge_poly_eval, root_power_times_tp_gemini_r: root_power_times_tp_gemini_r, tp_sumcheck_u_challenge: (*transcript.sum_check_u_challenges.at(i)).into(), modulus: mod_grumpkin, ); challenge_poly_eval = new_challenge_poly_eval; root_power_times_tp_gemini_r = new_root_power_times_tp_gemini_r; } let (vanishing_check, diff_check) = run_GRUMPKIN_ZK_HONK_EVALS_CONS_DONE_SIZE_17_circuit( p_libra_evaluation: u256_to_u384(full_proof.proof.libra_evaluation), p_libra_poly_evals: full_proof.proof.libra_poly_evals, tp_gemini_r: transcript.gemini_r.into(), challenge_poly_eval: challenge_poly_eval, root_power_times_tp_gemini_r: root_power_times_tp_gemini_r, modulus: mod_grumpkin, ); let ( scalar_1, scalar_2, scalar_3, scalar_4, scalar_5, scalar_6, scalar_7, scalar_8, scalar_9, scalar_10, scalar_11, scalar_12, scalar_13, scalar_14, scalar_15, scalar_16, scalar_17, scalar_18, scalar_19, scalar_20, scalar_21, scalar_22, scalar_23, scalar_24, scalar_25, scalar_26, scalar_27, scalar_28, scalar_29, scalar_30, scalar_31, scalar_32, scalar_33, scalar_34, scalar_35, scalar_36, scalar_37, scalar_38, scalar_39, scalar_40, scalar_41, scalar_42, scalar_43, scalar_44, scalar_45, scalar_46, scalar_47, scalar_48, scalar_49, scalar_50, scalar_51, scalar_52, scalar_53, scalar_54, scalar_55, scalar_56, scalar_57, ) = run_GRUMPKIN_ZKHONK_PREP_MSM_SCALARS_SIZE_17_circuit( p_sumcheck_evaluations: full_proof.proof.sumcheck_evaluations, p_gemini_masking_eval: u256_to_u384(full_proof.proof.gemini_masking_eval), p_gemini_a_evaluations: full_proof.proof.gemini_a_evaluations, p_libra_poly_evals: full_proof.proof.libra_poly_evals, tp_gemini_r: transcript.gemini_r.into(), tp_rho: transcript.rho.into(), tp_shplonk_z: transcript.shplonk_z.into(), tp_shplonk_nu: transcript.shplonk_nu.into(), tp_sum_check_u_challenges: transcript.sum_check_u_challenges.span().slice(0, log_n), modulus: mod_grumpkin, ); // Starts with 1 * shplonk_q, not included in msm let mut _points: Array = array![ vk.qm, vk.qc, vk.ql, vk.qr, vk.qo, vk.q4, vk.qLookup, vk.qArith, vk.qDeltaRange, vk.qElliptic, vk.qMemory, vk.qNnf, vk.qPoseidon2External, vk.qPoseidon2Internal, vk.s1, vk.s2, vk.s3, vk.s4, vk.id1, vk.id2, vk.id3, vk.id4, vk.t1, vk.t2, vk.t3, vk.t4, vk.lagrange_first, vk.lagrange_last, full_proof.proof.gemini_masking_poly.into(), // Proof point 1, full_proof.proof.w1.into(), // Proof point 2, full_proof.proof.w2.into(), // Proof point 3, full_proof.proof.w3.into(), // Proof point 4, full_proof.proof.w4.into(), // Proof point 5, full_proof.proof.z_perm.into(), // Proof point 6, full_proof.proof.lookup_inverses.into(), // Proof point 7, full_proof.proof.lookup_read_counts.into(), // Proof point 8, full_proof.proof.lookup_read_tags.into() // Proof point 9 ]; for gem_comm in full_proof.proof.gemini_fold_comms { _points.append((*gem_comm).into()); } // log_n -1 = 16 points || Proof points 10-25 for lib_comm in full_proof.proof.libra_commitments { _points.append((*lib_comm).into()); } // 3 points || Proof points 26-28 _points.append(full_proof.proof.kzg_quotient.into()); // Proof point 29 _points.append(BN254.G); let mut points = _points.span(); let mut scalars: Span = array![ scalar_2, scalar_3, scalar_4, scalar_5, scalar_6, scalar_7, scalar_8, scalar_9, scalar_10, scalar_11, scalar_12, scalar_13, scalar_14, scalar_15, scalar_16, scalar_17, scalar_18, scalar_19, scalar_20, scalar_21, scalar_22, scalar_23, scalar_24, scalar_25, scalar_26, scalar_27, scalar_28, scalar_29, scalar_1, scalar_30, scalar_31, scalar_32, scalar_33, scalar_34, scalar_35, scalar_36, scalar_37, scalar_38, scalar_39, scalar_40, scalar_41, scalar_42, scalar_43, scalar_44, scalar_45, scalar_46, scalar_47, scalar_48, scalar_49, scalar_50, scalar_51, scalar_52, scalar_53, scalar_54, scalar_55, scalar_56, transcript.shplonk_z.into(), scalar_57, ] .span(); // Check input points are on curve. // Skip the first 28 points as they are from VK and keep the last 29 proof points for point in points.slice(28, 29) { assert( is_on_curve_excluding_infinity_bn254(*point, mod_bn), 'proof point not on curve', ); } // Assert shplonk_q is on curve let shplonk_q_pt: G1Point = full_proof.proof.shplonk_q.into(); assert( is_on_curve_excluding_infinity_bn254(shplonk_q_pt, mod_bn), 'shplonk_q not on curve', ); let mut msm_hint = full_proof.msm_hint; assert(msm_hint.len() == 58 * 12, 'wrong glv&fakeglv hint size'); let eigen = get_eigenvalue(0); let third_root_of_unity = get_third_root_of_unity(0); let min_one = get_min_one_order(0); let nG = get_nG_glv_fake_glv(0); let mut P_1 = shplonk_q_pt; while msm_hint.len() != 0 { let pt = *points.pop_front().unwrap(); let scalar = *scalars.pop_front().unwrap(); // Note : Scalars are below curve order by construction (circuit outputs mod n and // transcript output (u128)) let glv_fake_glv_hint: GlvFakeGlvHint = Serde::deserialize(ref msm_hint).unwrap(); let temp = _scalar_mul_glv_and_fake_glv( pt, scalar, mod_grumpkin, mod_bn, glv_fake_glv_hint, eigen, third_root_of_unity, min_one, nG, 0, ); P_1 = _ec_safe_add(P_1, temp, mod_bn, 0); } let P_2: G1Point = full_proof.proof.kzg_quotient.into(); // Perform the KZG pairing check. let kzg_check = multi_pairing_check_bn254_2P_2F( G1G2Pair { p: P_1, q: G2_POINT_KZG_1 }, G1G2Pair { p: P_2.negate(0), q: G2_POINT_KZG_2 }, precomputed_lines.span(), full_proof.kzg_hint, ); if sum_check_rlc.is_zero() && honk_check.is_zero() && !vanishing_check.is_zero() && diff_check.is_zero() && kzg_check.is_ok() { return Result::Ok(full_proof.proof.public_inputs); } else { return Result::Err('Proof verification failed'); } } } } ================================================ FILE: src/contracts/mutator_set/tests/test_contract.cairo ================================================ use garaga::definitions::u384; use garaga::hashes::poseidon_hash_2_bn254; use mutator_set::mutator_set_contract::{ IMutatorSetContractDispatcher, IMutatorSetContractDispatcherTrait, }; // use mutator_set::IMutatorSetContractSafeDispatcher; use snforge_std::{ContractClassTrait, DeclareResultTrait, declare}; use starknet::ContractAddress; fn deploy_contract(name: ByteArray) -> ContractAddress { let contract = declare(name).unwrap().contract_class(); let (contract_address, _) = contract.deploy(@ArrayTrait::new()).unwrap(); contract_address } #[test] fn test_poseidon_hash_2_bn254() { let first_leaf: u256 = 'hello_world'; let first_leaf_u384: u384 = first_leaf.into(); let _ = poseidon_hash_2_bn254( first_leaf_u384, u384 { limb0: 42, limb1: 0, limb2: 0, limb3: 0 }, ); } #[test] fn test_append_leaf_aocl() { let contract_address = deploy_contract("MutatorSetContract"); let dispatcher = IMutatorSetContractDispatcher { contract_address }; // Initial state (1 leaf) let n_leaves_aocl_before = dispatcher.get_n_leaves_aocl(); let peaks_before = dispatcher.get_peaks_aocl(); let n_peaks_before = dispatcher.get_n_peaks_aocl(); assert(n_leaves_aocl_before == 1, 'Invalid n_leaves_aocl'); assert(n_peaks_before == 1, 'Invalid n_peaks'); assert(peaks_before == array![0], 'Invalid peaks_before'); // Append second leaf dispatcher.append_leaf_aocl(0); // println!("Appended second leaf"); let n_leaves_aocl_after = dispatcher.get_n_leaves_aocl(); let n_peaks_after = dispatcher.get_n_peaks_aocl(); assert(n_leaves_aocl_after == 2, 'Invalid n_leaves_aocl'); assert(n_peaks_after == 1, 'Invalid n_peaks'); let peaks_after = dispatcher.get_peaks_aocl(); assert( peaks_after == array![0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864], 'Invalid peaks_after', ); // Append third leaf dispatcher.append_leaf_aocl(0); // println!("Appended third leaf"); let n_leaves_aocl_after = dispatcher.get_n_leaves_aocl(); let n_peaks_after = dispatcher.get_n_peaks_aocl(); assert(n_leaves_aocl_after == 3, 'Invalid n_leaves_aocl'); assert(n_peaks_after == 2, 'Invalid n_peaks'); let peaks_after = dispatcher.get_peaks_aocl(); assert( peaks_after == array![ 0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864, 0, ], 'Invalid peaks_after', ); // Append 4th leaf : // println!("---Appending leaf {}----", 4); dispatcher.append_leaf_aocl(0); let n_leaves_aocl_after = dispatcher.get_n_leaves_aocl(); assert(n_leaves_aocl_after == 4, 'Invalid n_leaves_aocl'); let n_peaks_after = dispatcher.get_n_peaks_aocl(); assert(n_peaks_after == 1, 'Invalid n_peaks_4'); let peaks_after = dispatcher.get_peaks_aocl(); assert( peaks_after == array![0x1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1], 'Invalid peaks_after_4', ); // println!("---Appending leaf 5----"); dispatcher.append_leaf_aocl(0); let n_leaves_aocl_after = dispatcher.get_n_leaves_aocl(); assert(n_leaves_aocl_after == 5, 'Invalid n_leaves_aocl'); let n_peaks_after = dispatcher.get_n_peaks_aocl(); assert(n_peaks_after == 2, 'Invalid n_peaks_5'); let peaks_after = dispatcher.get_peaks_aocl(); assert_eq!( peaks_after, array![0x1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1, 0], ); for _ in 6..14_usize { // println!("Appending leaf {}", i); dispatcher.append_leaf_aocl(0); // let n_leaves_aocl_after = dispatcher.get_n_leaves_aocl(); // println!(" LOOP: n_leaves_aocl: {}", n_leaves_aocl_after); } let n_leaves_aocl_after = dispatcher.get_n_leaves_aocl(); let n_peaks_after = dispatcher.get_n_peaks_aocl(); assert(n_leaves_aocl_after == 13, 'Invalid n_leaves_aocl'); assert(n_peaks_after == 3, 'Invalid n_peaks'); let peaks_after = dispatcher.get_peaks_aocl(); assert( peaks_after == array![ 0x18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238, 0x1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1, 0, ], 'Invalid peaks_after', ); } // #[test] // #[feature("safe_dispatcher")] // fn test_cannot_increase_balance_with_zero_value() { // let contract_address = deploy_contract("HelloStarknet"); // let safe_dispatcher = IHelloStarknetSafeDispatcher { contract_address }; // let balance_before = safe_dispatcher.get_balance().unwrap(); // assert(balance_before == 0, 'Invalid balance'); // match safe_dispatcher.increase_balance(0) { // Result::Ok(_) => core::panic_with_felt252('Should have panicked'), // Result::Err(panic_data) => { // assert(*panic_data.at(0) == 'Amount cannot be 0', *panic_data.at(0)); // }, // }; // } ================================================ FILE: src/contracts/mutator_set/zk_program/Nargo.toml ================================================ [package] name = "zk_program" type = "bin" authors = [""] [dependencies] poseidon = { tag = "v0.1.1", git = "https://github.com/noir-lang/poseidon" } ================================================ FILE: src/contracts/mutator_set/zk_program/Prover.toml ================================================ leaf_index = "0x2" leaf_premiage = "0x0" num_leafs = "0x5" peaks = [ "0x1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0",] root_hash = "0x1ba30aaf15c7694786a1f118ca39fcc6c997b48da9dfa62e9ec3e83ac7d6304d" [proof] len = "0x2" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" [[proof.storage]] hash = "0" ================================================ FILE: src/contracts/mutator_set/zk_program/src/main.nr ================================================ pub mod mmr; pub mod mmr_tests; // use dep::std::hash::poseidon::bn254::hash_2; use mmr::{MMRProofElement, verify_mmr_inclusion}; fn main( // MMR verification inputs leaf_premiage: Field, root_hash: pub Field, num_leafs: pub u64, leaf_index: pub u64, proof: BoundedVec, peaks: [Field; 32], ) { // Prove knowledge of pre-image // let leaf_hash = hash_2([leaf_premiage, 0]); let leaf_hash = leaf_premiage; // Verify MMR inclusion verify_mmr_inclusion(leaf_hash, root_hash, leaf_index, num_leafs, proof, peaks); // Todo derive bloom filter bits from pre-image. } #[test] fn test_main() { // Test data for MMR verification let leaf1 = 0; // Create proof for leaf1 (padding with empty elements to match size 32) let mut proof = BoundedVec::new(); proof.push(MMRProofElement { hash: 0 }); // Sibling of leaf1 proof.push( MMRProofElement { hash: 0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864, }, ); // Sibling of hash12 let mut peaks = [0; 32]; peaks[0] = 0x1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1; peaks[1] = 0; let root = 0x1ba30aaf15c7694786a1f118ca39fcc6c997b48da9dfa62e9ec3e83ac7d6304d; // Test the main function main(leaf1, root, 5, 2, proof, peaks); } ================================================ FILE: src/contracts/mutator_set/zk_program/src/mmr.nr ================================================ use poseidon::poseidon::bn254::hash_2; // Represents a Merkle Mountain Range proof element pub struct MMRProofElement { // The sibling hash at this level pub hash: Field, } // Helper function to calculate the number of ones in a Field value fn count_ones(value: u64) -> u32 { let mut count = 0; let mut v = value; for _ in 0..64 { let bit = (v & 1) as u32; count = count + bit; v = v / 2; } count } // Helper function to calculate log2 of a Field value fn log2(value: u64) -> u32 { let mut result = 0; let mut v = value; for _ in 0..64 { let should_continue = v > 1; result = if should_continue { result + 1 } else { result }; v = if should_continue { v / 2 } else { v }; } result } // Helper function to calculate leaf_index_to_mt_index_and_peak_index pub fn leaf_index_to_mt_index_and_peak_index(leaf_index: u64, num_leafs: u64) -> (u64, u32) { // Check if leaf_index is out of bounds let is_valid = leaf_index < num_leafs; assert(is_valid, "Leaf index must be strictly smaller than the number of leafs"); // Calculate discrepancies to find local Merkle tree height let discrepancies = leaf_index ^ num_leafs; let local_mt_height = log2(discrepancies); let local_mt_num_leafs = 1 << (local_mt_height as u8); let remainder_bitmask = (local_mt_num_leafs - 1) as u64; let local_leaf_index = leaf_index & (remainder_bitmask as u64); let mt_node_index = local_leaf_index + (local_mt_num_leafs as u64); // Calculate peak index let num_peaks = count_ones(num_leafs); let num_peaks_smaller_or_equal_own_peak = count_ones(((num_leafs as u64) & remainder_bitmask) as u64); let peak_index = num_peaks - num_peaks_smaller_or_equal_own_peak - 1; (mt_node_index, peak_index) } // Verifies that a leaf exists in an MMR using an inclusion proof pub fn verify_mmr_inclusion( // The leaf hash to verify leaf_hash: Field, // The MMR root hash root_hash: Field, // The position of the leaf in the MMR (0-based) leaf_index: u64, // The number of leafs in the MMR num_leafs: u64, // The array of proof elements authentication_path: BoundedVec, // peaks of the MMR peaks: [Field; 32], ) { // Check if leaf index is out of bounds assert(leaf_index < num_leafs, "Leaf index must be strictly smaller than the number of leafs"); // Get Merkle tree index and peak index let (mut mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(leaf_index, num_leafs); // Verify peak count matches let expected_peak_count = count_ones(num_leafs); // assert(peaks.len() == expected_peak_count, "Invalid peaks length"); // Verify authentication path length matches Merkle tree height let merkle_tree_height = log2(mt_index); assert(authentication_path.len() == merkle_tree_height, "Invalid authentication path length"); // Process the authentication path let mut current_node = leaf_hash; for i in 0..32 { // print(i); // Compute the hash of the current node with its sibling if i < merkle_tree_height { let proof_element = authentication_path.get(i); let current_node_is_left_sibling = ((mt_index as u64) % 2) == 0; if current_node_is_left_sibling { // println("current_node_is_left_sibling"); current_node = hash_2([current_node, proof_element.hash]); } else { // println("current_node_is_right_sibling"); current_node = hash_2([proof_element.hash, current_node]); } // Move up one level in the tree mt_index = mt_index / 2; } } assert(mt_index == 1, "Invalid mt_index"); // Verify against the root hash assert(peaks[peak_index] == current_node, "Invalid inclusion proof"); let bag = bag_peaks(peaks, expected_peak_count); assert(bag == root_hash, "Invalid root hash"); } pub fn bag_peaks(mut peaks: [Field; 32], n_peaks: u32) -> Field { let mut bag = peaks[n_peaks - 1]; for i in 1..31 { if i < n_peaks { bag = hash_2([peaks[n_peaks - i - 1], bag]); } } bag } ================================================ FILE: src/contracts/mutator_set/zk_program/src/mmr_tests.nr ================================================ use super::mmr::leaf_index_to_mt_index_and_peak_index; #[test] fn test_leaf_index_to_mt_index_and_peak_index() { // 1 leaf let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(0, 1); assert(mt_index == 1, "1 leaf mt_index should be 1"); assert(peak_index == 0, "1 leaf peak_index should be 0"); // 2 leafs let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(0, 2); assert(mt_index == 2, "2 leafs - first leaf mt_index should be 2"); assert(peak_index == 0, "2 leafs - first leaf peak_index should be 0"); let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(1, 2); assert(mt_index == 3, "2 leafs - second leaf mt_index should be 3"); assert(peak_index == 0, "2 leafs - second leaf peak_index should be 0"); // 3 leafs let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(0, 3); assert(mt_index == 2, "3 leafs - first leaf mt_index should be 2"); assert(peak_index == 0, "3 leafs - first leaf peak_index should be 0"); let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(1, 3); assert(mt_index == 3, "3 leafs - second leaf mt_index should be 3"); assert(peak_index == 0, "3 leafs - second leaf peak_index should be 0"); let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(2, 3); assert(mt_index == 1, "3 leafs - third leaf mt_index should be 1"); assert(peak_index == 1, "3 leafs - third leaf peak_index should be 1"); // 4 leafs let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(0, 4); assert(mt_index == 4, "4 leafs - first leaf mt_index should be 4"); assert(peak_index == 0, "4 leafs - first leaf peak_index should be 0"); let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(1, 4); assert(mt_index == 5, "4 leafs - second leaf mt_index should be 5"); assert(peak_index == 0, "4 leafs - second leaf peak_index should be 0"); let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(2, 4); assert(mt_index == 6, "4 leafs - third leaf mt_index should be 6"); assert(peak_index == 0, "4 leafs - third leaf peak_index should be 0"); let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(3, 4); assert(mt_index == 7, "4 leafs - fourth leaf mt_index should be 7"); assert(peak_index == 0, "4 leafs - fourth leaf peak_index should be 0"); // 14 leafs let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(0, 14); assert(mt_index == 8, "14 leafs - first leaf mt_index should be 8"); assert(peak_index == 0, "14 leafs - first leaf peak_index should be 0"); let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(7, 14); assert(mt_index == 15, "14 leafs - eighth leaf mt_index should be 15"); assert(peak_index == 0, "14 leafs - eighth leaf peak_index should be 0"); let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(8, 14); assert(mt_index == 4, "14 leafs - ninth leaf mt_index should be 4"); assert(peak_index == 1, "14 leafs - ninth leaf peak_index should be 1"); // 32 leafs for i in 0..32 { let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(i, 32); assert(mt_index == 32 + i, "32 leafs - mt_index should be 32 + i"); assert(peak_index == 0, "32 leafs - peak_index should be 0"); } // 33 leafs for i in 0..32 { let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(i, 33); assert(mt_index == 32 + i, "33 leafs - first 32 leaves mt_index should be 32 + i"); assert(peak_index == 0, "33 leafs - first 32 leaves peak_index should be 0"); } let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(32, 33); assert(mt_index == 1, "33 leafs - last leaf mt_index should be 1"); assert(peak_index == 1, "33 leafs - last leaf peak_index should be 1"); // 34 leafs for i in 0..32 { let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(i, 34); assert(mt_index == 32 + i, "34 leafs - first 32 leaves mt_index should be 32 + i"); assert(peak_index == 0, "34 leafs - first 32 leaves peak_index should be 0"); } let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(32, 34); assert(mt_index == 2, "34 leafs - 33rd leaf mt_index should be 2"); assert(peak_index == 1, "34 leafs - 33rd leaf peak_index should be 1"); let (mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(33, 34); assert(mt_index == 3, "34 leafs - 34th leaf mt_index should be 3"); assert(peak_index == 1, "34 leafs - 34th leaf peak_index should be 1"); } ================================================ FILE: src/contracts/risc0_sample_app/README.md ================================================ # RiscZero Sample App For details on how to use Garaga to run this **RiscZero** sample application, please refer to the [GitBook documentation](https://garaga.gitbook.io/garaga/maintained-smart-contracts/risczero). ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/.gitignore ================================================ Cargo.lock methods/guest/Cargo.lock target/ ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/Cargo.toml ================================================ [workspace] resolver = "2" members = ["host", "methods"] # Always optimize; building and running the guest takes much longer without optimization. [profile.dev] opt-level = 3 [profile.release] debug = 1 lto = true ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/README.md ================================================ # RISC Zero Rust Starter Template Welcome to the RISC Zero Rust Starter Template! This template is intended to give you a starting point for building a project using the RISC Zero zkVM. Throughout the template (including in this README), you'll find comments labelled `TODO` in places where you'll need to make changes. To better understand the concepts behind this template, check out the [zkVM Overview][zkvm-overview]. ## Quick Start First, make sure [rustup] is installed. The [`rust-toolchain.toml`][rust-toolchain] file will be used by `cargo` to automatically install the correct version. To build all methods and execute the method within the zkVM, run the following command: ```bash cargo run ``` This is an empty template, and so there is no expected output (until you modify the code). ### Executing the Project Locally in Development Mode During development, faster iteration upon code changes can be achieved by leveraging [dev-mode], we strongly suggest activating it during your early development phase. Furthermore, you might want to get insights into the execution statistics of your project, and this can be achieved by specifying the environment variable `RUST_LOG="[executor]=info"` before running your project. Put together, the command to run your project in development mode while getting execution statistics is: ```bash RUST_LOG="[executor]=info" RISC0_DEV_MODE=1 cargo run ``` ### Running Proofs Remotely on Bonsai _Note: The Bonsai proving service is still in early Alpha; an API key is required for access. [Click here to request access][bonsai access]._ If you have access to the URL and API key to Bonsai you can run your proofs remotely. To prove in Bonsai mode, invoke `cargo run` with two additional environment variables: ```bash BONSAI_API_KEY="YOUR_API_KEY" BONSAI_API_URL="BONSAI_URL" cargo run ``` ## How to Create a Project Based on This Template Search this template for the string `TODO`, and make the necessary changes to implement the required feature described by the `TODO` comment. Some of these changes will be complex, and so we have a number of instructional resources to assist you in learning how to write your own code for the RISC Zero zkVM: - The [RISC Zero Developer Docs][dev-docs] is a great place to get started. - Example projects are available in the [examples folder][examples] of [`risc0`][risc0-repo] repository. - Reference documentation is available at [https://docs.rs][docs.rs], including [`risc0-zkvm`][risc0-zkvm], [`cargo-risczero`][cargo-risczero], [`risc0-build`][risc0-build], and [others][crates]. ## Directory Structure It is possible to organize the files for these components in various ways. However, in this starter template we use a standard directory structure for zkVM applications, which we think is a good starting point for your applications. ```text project_name ├── Cargo.toml ├── host │ ├── Cargo.toml │ └── src │ └── main.rs <-- [Host code goes here] └── methods ├── Cargo.toml ├── build.rs ├── guest │ ├── Cargo.toml │ └── src │ └── method_name.rs <-- [Guest code goes here] └── src └── lib.rs ``` ## Video Tutorial For a walk-through of how to build with this template, check out this [excerpt from our workshop at ZK HACK III][zkhack-iii]. ## Questions, Feedback, and Collaborations We'd love to hear from you on [Discord][discord] or [Twitter][twitter]. [bonsai access]: https://bonsai.xyz/apply [cargo-risczero]: https://docs.rs/cargo-risczero [crates]: https://github.com/risc0/risc0/blob/main/README.md#rust-binaries [dev-docs]: https://dev.risczero.com [dev-mode]: https://dev.risczero.com/api/generating-proofs/dev-mode [discord]: https://discord.gg/risczero [docs.rs]: https://docs.rs/releases/search?query=risc0 [examples]: https://github.com/risc0/risc0/tree/main/examples [risc0-build]: https://docs.rs/risc0-build [risc0-repo]: https://www.github.com/risc0/risc0 [risc0-zkvm]: https://docs.rs/risc0-zkvm [rust-toolchain]: rust-toolchain.toml [rustup]: https://rustup.rs [twitter]: https://twitter.com/risczero [zkhack-iii]: https://www.youtube.com/watch?v=Yg_BGqj_6lg&list=PLcPzhUaCxlCgig7ofeARMPwQ8vbuD6hC5&index=5 [zkvm-overview]: https://dev.risczero.com/zkvm ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/host/Cargo.toml ================================================ [package] name = "host" version = "0.1.0" edition = "2021" [dependencies] methods = { path = "../methods" } risc0-zkvm = { version = "2.3.1" } risc0-ethereum-contracts = { version = "2.2.2" } garaga_rs = { path = "../../../../../tools/garaga_rs" } hex = "0.4" tracing-subscriber = { version = "0.3", features = ["env-filter"] } serde = "1.0" ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/host/src/main.rs ================================================ // These constants represent the RISC-V ELF and the image ID generated by risc0-build. // The ELF is used for proving and the ID is used for verification. use garaga_rs::calldata::full_proof_with_hints::groth16::risc0_utils::get_risc0_vk; use garaga_rs::calldata::full_proof_with_hints::groth16::{get_groth16_calldata, Groth16Proof}; use garaga_rs::definitions::CurveID; use methods::FIBONACCI_GUEST_ELF; use risc0_ethereum_contracts::encode_seal; use risc0_zkvm::{compute_image_id, default_prover, ExecutorEnv, ProverOpts, VerifierContext}; fn main() { // Initialize tracing. In order to view logs, run `RUST_LOG=info cargo run` tracing_subscriber::fmt() .with_env_filter(tracing_subscriber::filter::EnvFilter::from_default_env()) .init(); // An executor environment describes the configurations for the zkVM // including program inputs. // A default ExecutorEnv can be created like so: // `let env = ExecutorEnv::builder().build().unwrap();` // However, this `env` does not have any inputs. // // To add guest input to the executor environment, use // ExecutorEnvBuilder::write(). // To access this method, you'll need to use ExecutorEnv::builder(), which // creates an ExecutorEnvBuilder. When you're done adding input, call // ExecutorEnvBuilder::build(). // For example: let l: u32 = 3; // public lower bound for n let u: u32 = 8; // public upper bound for n let n: u32 = 6; // private n for which we will compute fibonacci(n) let env = ExecutorEnv::builder() .write(&l) .unwrap() .write(&u) .unwrap() .write(&n) .unwrap() .build() .unwrap(); // Obtain the default prover. let prover = default_prover(); // Proof information by proving the specified ELF binary. // This struct contains the receipt along with statistics about execution of the guest let prove_info = prover .prove_with_ctx( env, &VerifierContext::default(), FIBONACCI_GUEST_ELF, &ProverOpts::groth16(), ) .unwrap(); // extract the receipt. let receipt = prove_info.receipt; let seal = to_bytes(encode_seal(&receipt).unwrap()); let image_id = to_bytes(compute_image_id(&FIBONACCI_GUEST_ELF).unwrap()); let journal = to_bytes(receipt.journal); // prints the proof artifact as JSON println!( "{{\"seal\": \"0x{}\", \"image_id\": \"0x{}\", \"journal\": \"0x{}\"}}", hex::encode(&seal), hex::encode(&image_id), hex::encode(&journal) ); // helper function to convert objects to array of bytes fn to_bytes>(obj: T) -> Vec { obj.as_ref().to_vec() } // prints the calldata as JSON let proof = Groth16Proof::from_risc0(seal, image_id, journal); let calldata = get_groth16_calldata(&proof, &get_risc0_vk(), CurveID::BN254).unwrap(); println!( "[{}]", calldata .iter() .skip(1) .map(|v| format!("\"{}\"", v)) .collect::>() .join(", ") ); } ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/methods/Cargo.toml ================================================ [package] name = "methods" version = "0.1.0" edition = "2021" [build-dependencies] risc0-build = { version = "2.3.1" } [package.metadata.risc0] methods = ["guest"] ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/methods/build.rs ================================================ fn main() { risc0_build::embed_methods(); } ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/methods/guest/Cargo.toml ================================================ [package] name = "fibonacci_guest" version = "0.1.0" edition = "2021" [workspace] [dependencies] risc0-zkvm = { version = "2.3.1", default-features = false, features = ['std'] } ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/methods/guest/src/main.rs ================================================ use risc0_zkvm::guest::env; fn main() { // reads the public bounds and private n provided by the Host let l: u32 = env::read(); let u: u32 = env::read(); let n: u32 = env::read(); // sanity check for the bounds assert!(l <= n && n < u); // performs the computation let fib_n: u32 = fibonacci(n); fn fibonacci(n: u32) -> u32 { let mut a = 0; let mut b = 1; for _ in 0..n { (a, b) = (b, a + b); } a } // writes the public inputs and output to the journal env::commit(&l); env::commit(&u); env::commit(&fib_n); } ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/methods/src/lib.rs ================================================ include!(concat!(env!("OUT_DIR"), "/methods.rs")); ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_prover/rust-toolchain.toml ================================================ [toolchain] channel = "stable" components = ["rustfmt", "rust-src"] profile = "minimal" ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_sequencer/.gitignore ================================================ target .snfoundry_cache/ ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_sequencer/Scarb.toml ================================================ [package] name = "fibonacci_sequencer" version = "0.1.0" edition = "2024_07" # See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest.html [dependencies] starknet = "2.16.1" [dev-dependencies] snforge_std = "0.57.0" assert_macros = "2.16.1" [[target.starknet-contract]] sierra = true casm = true casm-add-pythonic-hints = true [scripts] test = "snforge test" # Visit https://foundry-rs.github.io/starknet-foundry/appendix/scarb-toml.html for more information # [tool.snforge] # Define `snforge` tool section # exit_first = true # Stop tests execution immediately upon the first failure # fuzzer_runs = 1234 # Number of runs of the random fuzzer # fuzzer_seed = 1111 # Seed for the random fuzzer # [[tool.snforge.fork]] # Used for fork testing # name = "SOME_NAME" # Fork name # url = "http://your.rpc.url" # Url of the RPC provider # block_id.tag = "latest" # Block to fork from (block tag) # [[tool.snforge.fork]] # name = "SOME_SECOND_NAME" # url = "http://your.second.rpc.url" # block_id.number = "123" # Block to fork from (block number) # [[tool.snforge.fork]] # name = "SOME_THIRD_NAME" # url = "http://your.third.rpc.url" # block_id.hash = "0x123" # Block to fork from (block hash) # [profile.dev.cairo] # Configure Cairo compiler # unstable-add-statements-code-locations-debug-info = true # Should be used if you want to use coverage # unstable-add-statements-functions-debug-info = true # Should be used if you want to use coverage/profiler # inlining-strategy = "avoid" # Should be used if you want to use coverage # [features] # Used for conditional compilation # enable_for_tests = [] # Feature name and list of other features that should be enabled with it ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_sequencer/snfoundry.toml ================================================ # Visit https://foundry-rs.github.io/starknet-foundry/appendix/snfoundry-toml.html # and https://foundry-rs.github.io/starknet-foundry/projects/configuration.html for more information # [sncast.default] # Define a profile name # url = "https://free-rpc.nethermind.io/sepolia-juno/v0_7" # Url of the RPC provider # accounts-file = "../account-file" # Path to the file with the account data # account = "mainuser" # Account from `accounts_file` or default account file that will be used for the transactions # keystore = "~/keystore" # Path to the keystore file # wait-params = { timeout = 300, retry-interval = 10 } # Wait for submitted transaction parameters # block-explorer = "StarkScan" # Block explorer service used to display links to transaction details # show-explorer-links = true # Print links pointing to pages with transaction details in the chosen block explorer [sncast.sepolia] account = "deployer" accounts-file = "./accounts.json" url = "https://starknet-sepolia.public.blastapi.io/rpc/v0_7" ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_sequencer/src/lib.cairo ================================================ #[starknet::interface] pub trait IFibonacciSequencer { fn verify_and_submit_fibonacci_number( ref self: TContractState, full_proof_with_hints: Span, ); } #[starknet::contract] mod FibonacciSequencer { use starknet::ClassHash; use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; pub const RISC_ZERO_VERIFIER_CLASS_HASH: felt252 = 0x41d5e111b93acbf1afb531253e0bc64d43f90a8a99290361e851ec0c4968ab1; #[storage] struct Storage { lower_bound: u32, } #[abi(embed_v0)] impl FibonacciSequencerImpl of super::IFibonacciSequencer { fn verify_and_submit_fibonacci_number( ref self: ContractState, full_proof_with_hints: Span, ) { // sets the class hash for the RiscZero verifier already declared on-chain // by the Garaga team let class_hash: ClassHash = RISC_ZERO_VERIFIER_CLASS_HASH.try_into().unwrap(); // instantiate a library dispatcher to perform the library call // to the RiscZero verifier class, given that verifying a proof is // a read-only operation let dispatcher = IRisc0Groth16VerifierBN254LibraryDispatcher { class_hash }; // calls the RiscZero verifier passing along the proof artifact and // checks whether the proof is valid or not, aborting the transaction if not let optional_journal = dispatcher.verify_r0_groth16_proof_bn254(full_proof_with_hints); assert(optional_journal != Option::None, 'Invalid proof'); // parses the public inputs and output from the journal let mut journal = optional_journal.unwrap(); let l = pop_front_u32_le(ref journal); let u = pop_front_u32_le(ref journal); let fib_n = pop_front_u32_le(ref journal); // performs the necessary state update check, updates the state, // and emits an event with the new fibnoacci number submitted // the smart contract invariant guarantees that every fiboacci number // accepted comes later in the fibonacci sequence without revealing // its index, which is trivial for monotonic sequences like fibnacci, // but would also work as expected also for non-monotonic ones let b = self.lower_bound.read(); assert(l >= b, 'Invalid lower bound'); self.lower_bound.write(u); self.emit(FibonnacciNumberSubmitted { n: fib_n }); self.emit(LowerBoundUpdated { n: u }); } } fn pop_front_u32_le(ref bytes: Span) -> u32 { let [b0, b1, b2, b3] = (*bytes.multi_pop_front::<4>().unwrap()).unbox(); let b0: u32 = b0.into(); let b1: u32 = b1.into(); let b2: u32 = b2.into(); let b3: u32 = b3.into(); b0 + 256 * (b1 + 256 * (b2 + 256 * b3)) } #[event] #[derive(Drop, starknet::Event)] enum Event { FibonnacciNumberSubmitted: FibonnacciNumberSubmitted, LowerBoundUpdated: LowerBoundUpdated, } #[derive(Drop, starknet::Event)] struct FibonnacciNumberSubmitted { #[key] n: u32, } #[derive(Drop, starknet::Event)] struct LowerBoundUpdated { #[key] n: u32, } #[starknet::interface] trait IRisc0Groth16VerifierBN254 { fn verify_r0_groth16_proof_bn254( self: @TContractState, full_proof_with_hints: Span, ) -> Option>; } } ================================================ FILE: src/contracts/risc0_sample_app/fibonacci_sequencer/tests/test_contract.cairo ================================================ use fibonacci_sequencer::{IFibonacciSequencerDispatcher, IFibonacciSequencerDispatcherTrait}; use snforge_std::{ContractClassTrait, DeclareResultTrait, declare}; use starknet::ContractAddress; fn deploy_contract(name: ByteArray) -> ContractAddress { let contract = declare(name).unwrap().contract_class(); let (contract_address, _) = contract.deploy(@ArrayTrait::new()).unwrap(); contract_address } #[test] #[fork(url: "https://starknet-sepolia.public.blastapi.io/rpc/v0_8", block_tag: latest)] fn test_using_forked_state() { let contract_address = deploy_contract("FibonacciSequencer"); let dispatcher = IFibonacciSequencerDispatcher { contract_address }; // Generated with // garaga calldata // --system groth16 // --proof src/contracts/risc0_sample_app/fibonacci_prover/proof.json // --vk hydra/garaga/starknet/groth16_contract_generator/examples/vk_risc0.json // --format array let calldata: Array = array![ 10313708969354158917967222113, 50267649714470381823581225990, 68921961243555163, 0, 46290583222980871151183921591, 4301093058224347754247855122, 1162760382227106560, 0, 24819230280640842784327799227, 29215605766976866277419122168, 1808142039149740796, 0, 39970134346975989818674078489, 3936215012720214372783898310, 2755310503244839950, 0, 10008210460600043468605009819, 5134088462908765651216846940, 548621717748290851, 0, 52073651593444857523464173785, 76173007636674752150960882367, 1989852830911987504, 0, 37843478955940902971626538675, 51487780532431296010323197290, 224964057096925175, 0, 52769853187791807058501612138, 18499899756995874154999451581, 2652790000201915092, 0, 8, 2053329358, 2206211296, 38805000, 4116461829, 1020971636, 3479402811, 2149017453, 1885829375, 12, 3, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 67110097341386670036774239297, 13427688709271065544749007076, 61998020686717975, 24950728289913553492905070844, 41338110835098902024801133866, 1926599594904525212, 49180962753194629969032522397, 18683289622619758709651796328, 2322548236816591081, 13777997333488195788972438786, 38195864551149721700102291303, 2096871835550112999, 57461822935248779146096669748, 63868881672888503510396685863, 2927643925868048643, 57882494364401687532204184645, 77064301337750944900057687182, 267580645098775586, 63832900139379554772626768003, 29079614675932695500868920547, 1697338607874777837, 13820245196087287279705420328, 45300240058713116745673941050, 2294499228727579498, 21764563697118840926227639154, 25188648591388018983369960932, 2953390198513702930, 7498684187777915752213167858, 55228804274201371180030455309, 2847354578579959092, 15435568331327776497941779773, 28893295361569522918496417700, 863647595501061687, 35302451000412228734699052367, 22457850952863143233325656339, 1401767062286425255, 51476042181496768465160915178, 10138610283257573438879144688, 1935188165376748165, 2607974614136254198207269069, 65923379203933185953178362077, 1736442677132969807, 28998805280904070766222869461, 71739253543289788494168851923, 1666168593466061290, 11598394446893917972904765463, 38368876867378744049854307764, 357609731026298670, 18381959417766430591221349706, 56568223146963862145607563003, 1653316243217612846, 1532011105146822016900691973, 49853661497349396119734430336, 128223370870951394, 74269898268093533317708905191, 6064542112071456493775622576, 897376613914460874, 65999414010440756273816590021, 31351058327199593499861985845, 2647438822048910788, 48205353039842416879228228410, 39166874119798698748815259789, 1963948305806486212, 78171073915930823358190752912, 42432726154597990157661008330, 502888311305518184, 71268398440539498978585013972, 13496144499382435728441052893, 1228680712056379000, 6744502773106524459562211501, 26234470583206688250660206108, 1869453274075343125, 0, 0, 0, 60184622296806572439997666907, 75008714795759192705677030670, 3262785094589981400, 0, 0, 0, 0, 0, 0, 50185732680358774463548804626, 10607397758555418006709821705, 1206124784999809577, 0, 0, 0, 35, 12360594968262131338834950053, 29157813032367243817624618064, 1249176918977039501, 4295852892538527433181634157, 32408611964222354943894990211, 3081069739022633520, 48008414502801231336586977304, 10695353845533787710119952480, 2461284468148709923, 41424670137457659138316034002, 22704208483523527472760209687, 366988915687364039, 17390414117185975115314456765, 19899765771554787204557749565, 2426644609974225253, 39168384437801305002828652709, 63995845102202908056262969347, 1231262696770817384, 79001875949392935046839734146, 67858923451040823945953945772, 1475081209791838033, 10449387844431475556675852647, 23115748550791645591068351732, 1715421325480013368, 44721182901846674225538961665, 64638199388846426866197918856, 898421411213295026, 55621973480014006124115532829, 13012389169361599871153984529, 3160472654674284962, 55508613442680258763935969213, 34746301440097605805226636186, 734918348439328496, 55736029307188839838515311861, 13731812987259286528859095281, 2282641966194969923, 20791395889687384125688119756, 6989397587960164917946580933, 1765451686580892148, 52406674109961525801961192114, 35821500349487483240557623463, 32470852909215135, 3953835811560950536563745592, 65737295267830154570147278118, 3230583914443581448, 55596875411839172693842327129, 94443789363036885006823824, 3336417763008413204, 52907783319647596216035183513, 54114917331759988367183704291, 1078863918351929539, 9743733652522201172278700788, 52747862860772113517684171279, 2106505140994262297, 54138378922280519909387645902, 59006165532860325511159562688, 2733912037122560096, 24830989612348935007812695331, 23111235460663267971948348557, 480020646269586667, 65561583184371514519437135483, 10855304295069896300987376868, 637290028443393757, 53593402770083338856380373435, 68128000340724951096820458371, 2302249138431258780, 16155562814866536950816994055, 72258525721371945091688503494, 2892100359634228581, 42374679426173693502262079158, 21383406139360631296896177113, 985003147339755831, 38723502353311254286018909030, 20933468737936183741558800065, 3247241243536938593, 30181607942484300660683207736, 74863731242715433465989805287, 2714053954725946874, 57163700248720041301046065461, 45216960822001951269446520500, 3066891704198872221, 17451329542461221237869321613, 24503838682660438368525032328, 562576764894612382, 14585158156452265635731184191, 2773607317537226113943697406, 1319602802690463829, 24861472214491976856336178533, 72291441918894561223831991640, 2944671567702358518, 54916250575730657360102360406, 51803695865780597071494164610, 543061999436242010, 36436437402110229572837838194, 62139406963300433254696434903, 2327770858119618782, 73103594065542722620598918658, 44243971186390802668927786916, 142089896095996329, 21436822252945051741299657273, 46801472146233891090208622390, 3411786869524333922, 72312168924187718460575840349, 42552130630662034788449122958, 530399508347139813, 11481059118653940954162707235, 26919925452697455698502619019, 1946684416952150705, 70449828641132601851144928179, 6396432980500358628406384425, 1142492913372652538, 56314812782974212647939770855, 12167727556165366211988067345, 1903290185871975252, 73747573353900962924882745156, 49656272196777479082055909039, 2865371041810319894, 20172090510775745939621270277, 25654122589521917887969987805, 1676053585976553883, 8977267769221663823931008106, 77250837361365609853695133269, 186358667315816194, 25972767478532206471029814990, 12943967821641419197615069846, 3229756313671944335, 46300450854999856460637670919, 35161017020064083840617623040, 328624250660014565, 4036507852346655706246921055, 12537993711452530936696186196, 880041771093384090, 65448068356225382511538574926, 51037579448757576064966034417, 1223525822436876055, 2176773890406377825986227808, 77682993031444986363979296598, 2583115246777786513, 71059891490091380033561270696, 31012048167373832483903286373, 159444355772919561, 23741828148656098204388481068, 28085683769479374081599602201, 1662193400928783177, 31323786616635205101063643380, 34433468358707147475954472166, 1731240402366613290, 70436277977450903286635934036, 47492361363997243201167972869, 1678817997334649766, 36538059548569101915578987343, 17093451572793640673633279256, 1656454134442109871, 19522617980390066529084379719, 66071216995959820899898734312, 2706716354199088522, 34325223142358355896809101012, 40108858423160321683378922406, 944066692697007193, 44418177383437416506220402012, 60946636953935107420000496495, 1369783441616627069, 56507264480446406103143746283, 17931840114876941924111226396, 918399982031994895, 76433642328292557657336881741, 51675426428487132097635878097, 1403561418752869199, 70400682656873442697957021787, 53781171275514296852367132522, 2181400749995012927, 68774380051963208133605618277, 76588338880129041082286505683, 2845578501371003899, 72067303437008212367905859826, 21374779452973024402313765336, 2221195904458477059, 69080683511470571676101038395, 38856630317623007480108646099, 3479028906745315174, 61046384739204442678938295938, 39744432488476164961303843738, 3382369175973954267, 9680044342387623809448148953, 20237505575599160873044318717, 902104188216742217, 13361533255414867365689649279, 78000816342547229526471376059, 2280342331400302461, 74660887713847091615457925301, 15423093058645697596093548298, 1601296156474024072, 31452512886444604811939624123, 14871595841574266684389825361, 2230286318840132064, 19868052490303730500625915950, 71823867883673493732887072099, 1186105274387324866, 14953365779947513122062389422, 45400645634907224203421549036, 2154472056286953549, 42535465039425903780242556383, 16399825038753280636007219865, 1932651611880407695, 40782525251885548061400438672, 78511543707154212541702321212, 292166688899042362, 51693191686141744318110632830, 61102170322613590312665018129, 1169943378705208961, 31611556388944035654087791382, 48793342848637071505811808513, 1007785636034395556, 13245912111600165083475847640, 35645277117504594250330598630, 1441365651392587419, 73202388964070610103986717709, 25338500400731290694141554538, 1228991475364208588, 22161819515775086818840675923, 1755718896744977051436633999, 1274848588256343605, 5060074426792132649963601505, 72760648500446465766205294002, 597512319846127711, 20017271135461380398104350434, 53616078439302030060876692901, 1348454741361925129, 61526526525087518328077601388, 40483299090308702798294659121, 1301024912456818047, 73362281651948330040634414845, 53973817690807489230029327785, 2722309560099000645, 25599239656689429003294277029, 48919070935250398775431078497, 1086700020893486575, 63164932524954652354608775000, 67382720736917245548778025133, 1232550285833740777, 12240211311651913602354521009, 45863397608782781468428422606, 486150435427238698, 68158250486432470147265310834, 51943349739820715335008866060, 1206124594856817746, 29392112059669502866776124005, 73570525303323265027194931277, 1294311512342118339, 73536761633818650102107357146, 43396852776159692489319842645, 3100664928565186489, 69173834052021715348487569952, 12963657117124037069748544175, 595969749979773741, 23846657396113804068494726709, 28459237038467792010025830266, 1588706236730013730, 65844828269036915917122666085, 8763838515273385936571926148, 806538396399929711, 70303560432873316109169701786, 39849503450796555439080418992, 2691448543597771881, 19977565294104150226046294007, 23037870310861238275750145511, 2774819424805492031, 5542989083971712322889052480, 48069908884929666167953865993, 2617169289886535695, 555550733618393652533555156, 60702575584742818060788272928, 1461743199604348465, 59276182258207350804200259975, 31387182037341373939338116846, 1068102798609979768, 44184702854344105802937877632, 37321138902750485113935410207, 2854933811583699565, 22767357387740906218666795516, 6366191246177779881456742516, 3195384445698138206, 37872998675613702081528008657, 28840574403232847345031061065, 83910503402164928, 19755391149815350468335395114, 39043332308194420648157422125, 1654228368548997930, 70947376749147558063167188631, 24201334106019745301723246466, 1670583641056305059, 71809556624811378573541740308, 19157141666058607925293062313, 788233207177409918, 51121444321675109855274275776, 52160798994900902472949726737, 898362639405526294, 30613730652815226468507282667, 7897680665819472931381712776, 1302127816289765463, 63280509565215594481159079396, 13096110961057793460350790241, 1444299871117494140, 49521672423035916340216260847, 23829786225911508217482614500, 658783852287867243, 79194464295132867012799283903, 54613184063390672578212050582, 2402561193352151379, 70992398180682326001128409859, 77837924754578017979352295535, 364046467776749919, 40902535605905920275276330915, 7081283242415479144989370261, 1150838178599168977, 41706584932086192525773345724, 734561825688999894556227338, 338250869364858795, 46410082837237624653278290828, 3382235453358846691373790062, 792185139979883753, 57157497549008555576513636801, 4150468179856581125077738018, 2366680748996326578, 77517408721910404766888807259, 39612192336508772422964932709, 3231256460430934357, 7219802939464090449637646684, 19788415902984832852694111534, 3038128947884502812, 62536678601484129584648595154, 63996452901180750168291789676, 1269553517982397303, 26810328477878916320917617369, 9157299788584675576337227844, 1807127961076227910, 63513954145219307774161123236, 59065739004437351267127302919, 1973610681660339654, 15509781709481541920234414079, 32449083186905685239263295878, 1866094211887665808, 42716628158800467615103861259, 9055167045081328991542855030, 1311146885080819224, 68890409438010957313616677601, 26634194028956222931522165526, 2312620439392163368, 53167947698368744564969970576, 57885523176959822209833785487, 291128117845638353, 75016381644872929623135838736, 18234094862966041847214268914, 612395162345349787, 20808881965849394472888338931, 7576226573611803551030369101, 3130991424160491589, 33215212914519613834371704957, 64415689101996113098755363802, 784582772961501468, 59286038259052583609265340497, 21358526240558865371079365199, 467246556292168442, 39006627020133026080795930696, 59686384036968521453511344583, 2028065872919113466, 27381200533226195854800982805, 17660416940592767438770229492, 2060952945843040168, 12047188718568932683343306362, 15320362999272004816590408765, 3452590417410471535, 39276660293739602215611979618, 56857776653913802138804505468, 1889050380696524501, 45591025293636010875426378772, 53845282365601895662067154892, 1465077297329299327, 39282007010090895625492443209, 1397026320340957538827542876, 352452643109848467, 56762667303754160556231704265, 34873144120595081756175108707, 2206107338873836102, 29787085551360123908237557496, 65276204933253820887876685777, 3472614008765285227, 8285705568888552908164512328, 18282269653027083460815024739, 2597482920391131424, 12004345832346124878099008070, 63810061854938712583870602977, 2430500331810142702, 50615034453375480844728341483, 58938459324118519316915361732, 1369093538768206433, 18756667534570017649031417933, 26835004170404446313710060823, 2668617026001542062, 55812243561770533973639847274, 46535234061346018674382610060, 2836219761499145928, 36417973710461402196270013142, 41339617472930917280444983630, 3048363223608713626, 1414423293921297695200883247, 58857194106124633397123497605, 933710062019667730, 49567595886422953595325698362, 67692849653219337050969464857, 633223786370850622, 6422318417922863651306301782, 6901616566551472596509363237, 2369819796401842405, 18586282301777790901570413325, 6760832975727168518435953404, 2997419980038085672, 24469696180446228880787063250, 12755595652282209055540741878, 3280251541576367810, 8552173119037413094872376538, 68208957182519582139577001549, 2441251372953548848, 25324990390700479412930141078, 21287732917187170393310412256, 2114258446759461724, 49757266740843539134024636242, 49575311345913687585099725440, 1099246661026065611, 32480368808912361139253789553, 34951105221861692578234492394, 1657152050201264582, 69679608898103536322368242556, 48254540319204976779524492793, 2317487136137111116, 70638171400518887330037802809, 4723937625862605471934130067, 984557145573098466, 53509954335773856915050382704, 30300080256997340937370522323, 2693573074547818883, 19235680928582996445440577565, 19393747551092038096914724900, 1877350455626116554, 68483079724230979186674614207, 40736552533889744054453705437, 3227095818480080519, 36230183044335825425903748134, 60629017340000271495031837652, 3224136541008590539, 24889650842150663885796632378, 28660833049262166662990738189, 2929304313376636312, 65707267602623235131117651926, 13132469621825747346593741126, 1771451502865582104, 63551177849075344072515169704, 18269172192185533710385849613, 2405932508258244690, 63560518351415187852333743581, 6635151746317543440468350115, 645103596563583738, 61597399764603570416824065795, 3202006815778063297638437037, 1477071878089573690, 43662754262816955983521202862, 15446366592645031858726415916, 511770311978133629, 48728514394114242793285299024, 36612201223777798020543610144, 2158620811431525101, 32852744344020173393816731925, 24914930053510242348436439112, 699855715560608018, 40053035629514932758912392418, 1759185183771930619551600850, 3155567357130212691, 56225110389550058730628348999, 58522120934375039846189965795, 808525106298283731, 37945744006205033978713224967, 66194792325901859132143780442, 1160295806573153841, 13562138725696632773490331024, 64683039012452684187062248417, 1966384118836531052, 5941445202703654091346865638, 60270065394606367704075363648, 2089987198759293685, 7130161187160818190365869595, 22185928642572927032943238776, 2219481701665247586, 72019304025246384554435987701, 58300827728277110310217128728, 1366618832132245269, 62649388975178761928839076059, 46390409004212351030853267760, 718108665329602310, 51170343786044524300925372799, 56770774823195651803252124734, 2130438264611612541, 62687805637594227266491738016, 4329813804331493919814059430, 513804069582160830, 57382132430326145958952522763, 63197400619238955635612934893, 2698514039593901587, 17775808424361182940062035309, 68782184337607781179952225558, 1197638400588288899, 49969484371751899737299639573, 25012020106675188891376016648, 2254539279807536924, 66140088999914123440548999375, 3681859845418156983396536869, 1319200523316846748, 23438254376116039509853580989, 35431220680425611742876733467, 994427736593413884, 62441578701683841203003565731, 30512760545463326493605403872, 1502800631166663193, 51651308687090986962610133549, 53136950095585196401371475750, 2156300188861369067, 14387446790107833490452851440, 21324075486146894436590502483, 1596359753595804567, 75212556738894857359379146502, 4092253092526033452456505948, 3021748565657141698, 50236173466735729480835680003, 45529558091969274330187927765, 2401387880839620069, 68520480938175902959654084815, 47403843292206438031677593381, 1671904745999304019, 60096465285179141794233104502, 73957182508689715153377083878, 505681790095624145, 10618523090695408293326189163, 68512315694854836057340538345, 2720010744430068617, 43168430664357147159638123275, 59122314094264220471042292059, 3188359126080131874, 66211240039482086869039720325, 21065528036485542574217517355, 377981874178235853, 52170588851677982782362311194, 38376551116136329155241434374, 2385195882736354955, 34977245071790342238156931830, 777791359661978810430081478, 928875965411645186, 13650112852818976652159700982, 2692500972540596674642582224, 2357745959014588216, 34169072164020198595663253764, 78021225865079274701434579336, 813403944471069695, 76088778939975537331795789042, 43645304217750680719729501084, 288202029667042008, 1891402838873668544086710169, 57213089231617852140981110266, 3381574457480393910, 39921818220487516031932784739, 39944508709767440041151733125, 1649168221033982257, 45530383567361630684482039493, 53081511060100232502213219917, 1802073361282048098, 23334811549628507921007123344, 16596970303365577954871713785, 1665583805872937258, 53753965168022602504497453157, 41054807205271495364287110762, 1927990876064870406, 76407769675323420814414067213, 48511134731003110085594145578, 1347801163765193669, 8214323711330657090309369976, 71913269055292906685092897848, 1915846453994594156, 43489420228624929154806514503, 16764809873758550412189946994, 214362375989094646, 9368638340277015320220580450, 16619335858468917913702445087, 3140790252292613391, 60394356614714152369087039902, 45960505603592523096513440310, 2298512572978201847, 17351239657615002292878417096, 64714223964630226856969959605, 290820912776475336, 1378655495801781847406151981, 24175453864471233944128026598, 910842328001829906, 19563940703767528486622530035, 43991422954119864953815840933, 750998496984971129, 60530038184241887438252296880, 34486968179760578736275184755, 1619507507896564262, 10933512123595416531844917641, 7277503973587905363400227299, 2443983425829751695, 54223295339633963698017555089, 66384853908133827564321289131, 838720885427564632, 75593558855158051658747745369, 51227306780896804084925966821, 2926976053789927147, 15714169090582077975038678195, 24387512584420275478278879267, 727527209987614159, 65654825514483349703080760494, 1450198418115100636602774467, 2076611581342042775, 41184248004268170901317119305, 33105343018989636806743588598, 159902686522476638, 56189098057504423521222277022, 25361643859401103967207715795, 2138787884566491196, 7959128533613988213330273744, 72421303642716385603572949125, 1864202360502401900, 57603287535191824800065148860, 52704721295417160291548777234, 2539337788977486760, 4528390757470862989297491781, 20791354199780548166926483288, 2869715200257578462, 49345435824931755978386255991, 55815517556695453312993213054, 2078712830649358232, 63471805478741514745975784454, 7645342861159746691248700192, 1927218767113218753, 7565779579818441149365783963, 32912314373416274940201055275, 2365469671721138168, 64020238005382136466712769190, 24710325986999920956029295148, 1282637434286509597, 22328720009306627715958117511, 51742849179706169980466035548, 1813949387751935986, 34070087493301935626682058191, 23909779084562840535692707539, 736980951870439975, 40481955466800114264039701063, 69370391691065754014233208331, 2867290022214351459, 48024851676482779845864046511, 35247739779074136861386770229, 235504803957090400, 56894818091604261046318624081, 66726851918014204319555869851, 1764079797523907226, 78179394170464515677357337220, 51297432309277891863209735472, 2297693142827233042, 27220520593784338330937316020, 16811467849648494458068492242, 2243355613398159218, 47877327790908945690526912426, 51337327831124610938798990587, 609572673539016568, 23223638736775700938961639109, 56345321137068066343132496765, 565189699728463216, 33232197980023913396286327547, 60421976195008333982542310073, 2993154648010376876, 25174955140399525595788004876, 39677747769294329177955099031, 1137388471515559778, 14584207576698227520601433648, 2953442929564072104975205089, 3470793463112397469, 57826527928562064108433526669, 33297538101764253667554352401, 2070057851167030306, 66360055742458450297591562882, 56384904176371454974152476691, 695049392446797371, 57734735562478292182446476630, 20364624426515368929386243095, 1850636793433414180, 63754010127947788938213519408, 63366821162168284844837188891, 906700593053585160, 57785983016076181172576994916, 58334561584194548557193256223, 2828396685685053812, 28118557883986728551693400390, 8031345872674205223159203766, 3269453791600652560, 68679255114224425843678879021, 75442849224625740638356045015, 3168728166013790515, 26005912895946385915693671979, 15056694708217923896782876727, 1731029315694470335, 9153726456166024408128637558, 60239353510353801747354713715, 3384798280555547463, 44088396921215296504957088568, 12470268842798264384903751929, 2376393590914332725, 49101701083589128573867555229, 75954735786564838308641335021, 2176920682836734214, 56872096707866299774052943888, 72596487640301717485063952269, 3166469221513986642, 10495533692396620193601404798, 1587802954654622110285734076, 1567420294216174858, 18639917474561386379268595010, 78028584762510007195883250909, 865473261187221669, 8654320051993024153350382393, 37633951244076580764649362550, 2523825383143967561, 23917853011219949860566249405, 33202933028529591587411354323, 1133338740234506442, 28714075332319622107042951077, 54750014304167292063638133528, 384106444426518304, 23084661769313146089741531633, 13938917813624902978874347269, 842589493867949583, 46457720666183163914302312830, 41660587051924699657853269699, 274874945568396211, 68832224678881095497560215003, 17961636598701259352357327436, 1838914652967022062, 48222666315932247354705285930, 23814315324514321593695074138, 3325279688406053156, 72579748564309020972780779535, 63502971343208282462081421162, 457118053269853985, 56981994172253633256881908872, 20395403774715972186411317668, 1623407104072816381, 13166861402066342481956307168, 10578447457300681437082468003, 3438358221696296048, 16072216899989299940206449419, 46994624182223840754205531485, 173239320879187431, 6880738571538237288817989177, 75429468230294313088855851029, 1660609573017825721, 12647676101673675317725170133, 20612858364283165701092984647, 2891821326064687979, 56682787996190631716573834401, 41218816251003082564663760407, 1187437447549729597, 26695537027136574492333542521, 53898200427588270609757074458, 2351185528428431313, 69102693341453927420989881114, 46331126326548708885066024296, 3101122197653628416, 33561649878910471660465047572, 77825735610056023063865125011, 1863551082665096865, 63167341205854928914710724572, 58838939911343791897872614058, 1370963640544898100, 26624739533172080187542710128, 54380823222080608748627573701, 2207579974912156470, 28292260237532856060310227135, 59918556477228566124979003690, 1157735280153529510, 10713903256537061684333606528, 12398091338334893808959708714, 15345429367535875, 11221181644696095167573116055, 23899998262859162223011399579, 3192238746592839382, 11980761694230391148201638651, 23569934923493959596280991306, 355517480385008649, 34460485941863443153968240079, 31824140534725759416771313463, 2977829986416800801, 20508279748183144271335979700, 31740382337567245982038785144, 2295646801000199617, 38858265566991215781801217890, 8795926322550838431388851901, 126926901943481093, 65280934319906532891481827124, 26766101597326437928450261999, 544497752271307188, 75185942731947342912106485494, 24241400534391757741873562269, 3325115855230756797, 55476547813091184908702162235, 19564787459959114380118288240, 2739976261611503893, 73257589853214795329658811252, 51984593862036119750328010251, 1273554794369443929, 13039027237524171772345623713, 27754056260575838197903136319, 1853765518746846924, 60774245847878985251202165977, 35338804768540750360592420110, 816029153899129996, 69907701450637567702814751183, 5228059520895343220628521766, 1988075497993395669, 31106969954390789531993990763, 67279803207812837137790814598, 1319698001776426842, 18930394062633790946986268404, 74816436343128134886222723160, 816844160300622915, 37802662357677011297314038862, 16197793751395278360760836790, 3040948654737808344, 18928312109164763663915885415, 1432170116678275990951676484, 1435093674620133678, 54284393225618397589057510323, 63485852146911808464015825649, 220449588952678379, 31146744168849482060174933651, 38444285841367829329469821257, 2744475881531753989, 20466416515976734441400577824, 56879870617739838057513148320, 1392789450474542176, 48124200899788250781830454083, 23643882557163479393615772203, 1279088570123184093, 45365329839520888201922079925, 26320234002886364401254195636, 2120088479307698664, 74539752454273587220350078649, 22399845860632186162530143309, 37245264265765378, 23954978264532560014785589792, 7309888089993385859224590177, 1479766753474052435, 24160837030413745606134101296, 6650692578554060479517401788, 603099674861214124, 17235793200288650341775326864, 43057799560550285651858178390, 1606515366817521244, 21906500603249911406676284988, 46818914328676379165672007795, 1968598934827876988, 11641418877354143832821048726, 30736355783871154366947383824, 2764386528059347579, 65532526753402684229546588488, 66451103210062438555589536320, 1747038298582082050, 59170768144497514519130056116, 58819983132691454652135828886, 2046149785090547838, 76589712831818603432973820091, 20318715360343403399645839521, 2605691801708651227, 30079718650927927837308671324, 78646499786491934002348928021, 3358855409771345355, 62403935237327005558004813272, 1498258601919652317151742763, 1927640518909939005, 12355978941039385676385889576, 15880541915680587368208369733, 2836291315732758347, 12840598252405114259846548555, 28108571845219274986979081178, 392808519252852368, 76217760202121763326831094952, 8806094240764787868700985819, 2423154669097033918, 44165158981699199378202945178, 66027346146886652659628882237, 2554749702967302582, 10543228991417219155779707386, 53268365217410877246273461022, 2880225001813708394, 78434450809125079873787195394, 22358649183172381392315248470, 162877726419308197, 53565366577724194770421491751, 33613517871656043405870150554, 2762489320327238880, 23613698792485001008875505397, 559140230909356490053603091, 143109013267937575, 55845257587300621609590557524, 32544146768539939067707785331, 562509308946774778, 56380170038998558542850458097, 77548399580711282499195023925, 2922829692555625338, 73562668898720238839248017576, 48743415581970534813386387230, 732057410313346376, 19019530277107572603694422369, 32882244855340603778375325616, 1565560370837204892, 3016428641028221478999533268, 8424161134196647517001698954, 2026869935539031588, 19199945445905144254694453608, 64238295857231151560328251004, 1007721700117531836, 2699202767883643031676817224, 30686804140737889132276350182, 2111634361350025782, 68767546759930475014289850157, 28474063620159128456330661132, 3472004214203644693, 6967395891738383155039118650, 36174720084709358685542585287, 800820261868853870, 63061690424896287575302749984, 78652390992856568038588410678, 1558022294564583821, 17520066667417073861021395079, 40138638372685969206071914397, 3087716691478547731, 70937885704990443958383612402, 63636097720244163839380793323, 3393390080272489840, 10732413930192345022175277098, 62879335634917889174161945310, 234148431230809716, 47443933963104308440476885789, 24172167401339323817534694619, 2110963351919843744, 42572691129308029435117937229, 57884164055134546712775788068, 2170087946029539384, 13726223624440371938663865698, 14907576373210676289221162148, 3313530803119381760, 53029184934906244359225147849, 69135503838310518293216775809, 760222265325749174, 38404380099011386367450115559, 20265966706173273094773107341, 1476272904567684535, 70810145571656497243867263295, 7928774570886743163451168563, 1816396121616785633, 29042745261622481198857457192, 27143161660926327552853391674, 498640460354912373, 10280989373834907879722360908, 42329937166670135576758783598, 2101261933281334839, 16521873869726722507627298412, 36939049602320465141860494415, 1620465377295740171, 79214650873147195771895202612, 42562638946461078554991475473, 1552320458126419367, 32229909181470868470637750867, 19222685243114110314021393212, 1489355770999370819, 39041252969998039615405479308, 53693333731202887990336345210, 1287429159902162733, 19554246207431295823531343041, 28971542169381011635686663903, 1520637876336823618, 9151648019586098515950422111, 78075267439710694262564852921, 3194762383097050716, 45815191553035672383674146055, 8669504624347990523300918693, 1036525664730090400, 52781487553992020099170819787, 43385052899589070539741597385, 1411883722347725388, 25251579752221622433118463610, 11259611865123405949688556786, 961366560240297714, 43751125719382889715641791807, 37373631396771190629085953492, 2746015254499819553, 79030510786303522531648505174, 59606510103739057375354192918, 3211605294511853720, 12705642381573187079529885327, 21140311384769105373469482554, 3158232076416063760, 42732494848117041910241111771, 46990413162046063841260018252, 101884095564631349, 20885908215045176468217849638, 49911433879619217728326160947, 34206783477452843, 30449071293689711214608878995, 56467398869854130850211689179, 1063003907960831341, 57363712255768108632945703445, 9194931447986642000255006779, 3170459824581101842, 50289813764635481990698481272, 45530779432018979153954870585, 1677415574486577255, 42896744661287389681624807210, 42475991580187164382547037333, 488310794782871321, 8494316283848923281617077113, 55252344138391898265693231428, 3099030973906915991, 59477135345580700633451321325, 42017993741978780871639946740, 430068007738004889, 34577566952833081721023553181, 26189855408887708920438942265, 2871193194474558219, 47674232115844516603274599733, 30553904351815630711156369010, 1477538677812102774, 1388442041955870235380138915, 57930576884521216128297914725, 3460657932207238008, 11398155336530186720519117498, 2727546074176088253624052404, 1317761197101014491, 70366981422484011085854326549, 22759832727072828855591128939, 2705520319196787213, 4375440069235403455537113325, 59828777682142784201380163911, 831349612971453978, 72128105932282571191896763091, 42625904603603114536718460933, 1688033610232261002, 49971711412961872284305489868, 5685428844085838491393612868, 2902463386883616478, 1462011676261636348649713392, 75521045069512340168174165638, 3410201587853261875, 31584359112500635408632454678, 40883664075236085448644612360, 43325408261224117, 5273530322633768323473504750, 27533883131629754636095392079, 2087261957914540782, 59977476519681194484731094446, 76649314853893272332803756443, 1400628399536918208, 25353351508592832633162265887, 40525116055585294477831908329, 2344597267676558662, 53703560057879096905767946721, 25138770781070927540985423264, 2259998040712605822, 47473081165148425433419997974, 73868886471277136678823328729, 176787416926667436, 75377031055594200543079668919, 52770558709340920285787794058, 1518281164737047172, 77124129457115143209742331763, 78645003391616503141741225273, 2019277237935035954, 7587574192302951137905933566, 28628294458473019077671316865, 550290136177164371, 19074226762717232426179058340, 22758396594225057945875204983, 2498936233621134610, 76999530490750558239103676398, 65135669949048155211363326580, 1423991043962355154, 37335805626741583741656449995, 40593097814210745136182474626, 2966390142789588885, 30223242399796682892004587810, 78376816113582815829638932892, 1463656971896746348, 41383580407920968403351164001, 24969714932760667846823306071, 956999381826496853, 49256232049752948217228127185, 51540182059134980854837097482, 1647684462989382307, 57426499468828957424640320922, 62730659340792357646956961245, 3071657156577134464, 63335879907556537554563041432, 62498612818877950917983002162, 1436003249532053683, 11349255839677542268150482591, 41279394671324034357977478578, 826557451313155989, 66004385696655303385182767894, 52359099815756042989967228380, 22235608497277658, 28286541052666040917625762704, 32592851150331888321069412349, 1184017278293566963, 72973409518859306576512426565, 3486799749018560900746806815, 299190235574712701, 711612458398067916342142816, 9259249670028500020555307872, 609158142159552812, 67220763941589636441426083171, 16760843895098336992442126606, 1345795364493008133, 15296513942594919135016645287, 68608463236766558304606827028, 1381371550665668897, 20064196578923546129640989536, 69425573526241457511242798806, 2228506017463751465, 18582306081405399159684879561, 63116516347908000146205298679, 535219140171530884, 52613986159444494557862458702, 39594704801686273276643245904, 2751734549937881318, 5893993830705760600977469912, 74907562132226434847663685323, 3023820070251708344, 21316015224503445615252564178, 23269109635902779527011062895, 104761184999182672, 28261716630361088164901976724, 20574628043432417196412502878, 719711668185856350, 40910180381813073981177671387, 18944547205738993209583490603, 2493383880037953227, 73114149365069440421856075881, 43120946582787586476163644621, 328434080024373030, 48898635605819020603930551874, 12784126734511948911926721533, 3124222755205233948, 77742924820311165010545430381, 72580673866559170925157026378, 566634811342461053, 57099182637839379442208053708, 3589830420645934620828669934, 2295727074747015810, 32439541647203410390711723847, 42663810148357093195954811571, 2680524866872859716, 21526926401550567056406469766, 7959376829106786548423917048, 653911900900829613, 15063944045348161730828239552, 9722385057102325056836033474, 2803404462864903717, 42080170588070914165892103089, 44454875409140775796537985476, 2530456863580389708, 5819198215186178302955456649, 15135567007784550629666288132, 3384246539453657417, 925622447146604032733129445, 4333057264792887411953055738, 3002541994424164039, 41754428439554501855922107514, 39288407810070401834339274846, 1286279039640895489, 33734643951307860419083827268, 22370326849513164917373853158, 762863385297287464, 69040530271856862743081755942, 75380867755744849077594324875, 3395257765244974193, 66060843203110160605181136702, 15257450503032391528378966200, 328440883177033847, 28655689741490002616482645282, 49069661140716827965924957056, 1656640295720477279, 1559583184028945344888969013, 78889485336654774286314428915, 3203828680185371681, 8609068398587374641578662851, 43726248997139037922827482198, 1072236507202330065, 24508606437206072170038754477, 28611599477493973960843217950, 802107800901185541, 46924169090897477333550480023, 68873042784199988197747944484, 299108082756982437, 52444851075795511514874013276, 14041505305840510210935739050, 148956891209173515, 9658600866831505875318150915, 31365038341462602900154531639, 2625336040404158377, 18601602762762226836645000341, 68549672495909230679157610073, 2989810208420269546, 36322762014733472601033619544, 11605676835801910864336761087, 2264126358707655645, 67479471936348092540079294654, 59924145860746578356488179420, 438395056415274978, 51985987787315271347346410522, 76218650819106409779401833822, 2860598278579002594, 33368482403360105492443624910, 32627666692975476221496504116, 134351033756353159, 42637767374710217715725564617, 37662683545083330701330266176, 2920851140149804794, 51220562565779487679808365925, 61840430076341765362472220915, 3130717076166602545, 72698992475438072361326585769, 17571404778930631031816176765, 687149634289267880, 48253111731548845666093066270, 78489311270015979883772936470, 3091234157935605260, 6643591456939672230073175614, 19328867139022525441466371579, 2791040674737353861, 53597100727319218513181160809, 19900126526673340526438458011, 1865006918866626297, 20804175463693861209149216946, 22317467263603610818193484429, 2768683994026745772, 35320464100547784411390522810, 38524188073725156328258609649, 1227520630882832221, 11538782110964158304096064403, 69152043779236561057355340250, 1744914323183998132, 14691035928443344411718951674, 57547122548161467944531035548, 1631908803510662474, 190, 40450921824533867279167895562, 70946022133127283760824617630, 3000664270972961191, 48093245999772234903610269372, 44327997312253948884062132289, 1737294483489341914, 37084992138137494274744036176, 23760511347025827583666263994, 1042981253087507877, 23666095820386996468292075360, 77349519162803921981677766998, 2958953845781332681, 42384668075843039795122023298, 37315978469465001087236804993, 2200404290198461043, 38124844949181170272263974543, 54631981709179182160134198735, 2609812324125764769, 53985827194114556253479368246, 5629177962567747268834968197, 1325886919465633915, 2346868964245518014115485215, 4385693852638225491156681164, 1951588988088179938, 56531965585098796493588133698, 43213180128744062444068433176, 934549163870333457, 34161227989005076716462597146, 79026088180251029470217355435, 2757253601891572138, 33591144150500210944928654266, 42614246106693704831516872897, 1909560593659972241, 52371010295087468046775789585, 42919532749688600533139636397, 3057453994091700571, 41317809308105370359956637657, 2717505775487926074347408688, 2063022015356633869, 41203100516700130895419472106, 57631296198651102574368873428, 1656781199967893165, 32064579297754445132228596644, 45192157079857776817575062910, 1525086473247660872, 26008865053856329144201702868, 21443185296810742386785560423, 3451429801692953445, 61685176779204050524135945527, 54361112495010627728615893671, 2651925382084867101, 75469865207926262728266125500, 56278135408240755100131738284, 1594498783156814316, 63946950067890444902081492109, 49564071122998942814371329923, 3415867282928246151, 64830489359722993398411465591, 29968570339659999124851054175, 2326824669450131684, 46937752650077434727332316986, 69842036748928349056107689193, 3035041410464344234, 11144509122417114977342474085, 39825118755195259923230586837, 2705336335576573562, 49174264139075068568325550423, 60080763137806416690791096939, 3355628720370484190, 18302965224293898701088697907, 49038316049628516950305433775, 3255761958123742009, 72873523332801335113289087713, 52000290047171732515255905345, 2950440489291530664, 47309146375316716999515864438, 68980555010863521943730473952, 1316240002196414548, 64050947567240109315720014094, 33341815292081434973571287882, 3055580051435088035, 34094437713854689246900740048, 7882430329816156068076421023, 2560927115277878432, 39948055491908819847104337486, 64486623735137532322095960536, 978597342104334756, 46132542404104916292682747422, 1413104207471146591855219273, 2347193288389929512, 54795402034798186403322526324, 78116261599045207628575392412, 2189773419775238105, 67796362078761577778525381104, 10905733328357963119747535086, 2600351097942332062, 74558970493466027521719499995, 47586998550115835506294375512, 2421604727956088143, 78139130272615308513143004388, 61610803105595740996349724691, 283553907036967928, 66376123114034916197197530892, 46735813450433107391769974428, 1399646963079338271, 49775606409878583450825630515, 38811538617455577080670837314, 3367599932402806400, 19580123427887904955465089373, 36660445822145026916973547925, 811986103396393512, 63994035106029029796535378596, 19159021825422706612566414640, 3307871774421619419, 37975600923174955886943302745, 28842694125225326918454185432, 35384780461017678, 26944976866446999991659387557, 15631361734014548874412341813, 3156341289904847581, 29738561002017587143265588332, 34494367464962963553968282600, 2288855317933984112, 3343465119193814337114506361, 76093997351545472219719880882, 293625360639159605, 57519280192453541667431713829, 58036458144457507945086870168, 2374602797288119360, 40180399071045313537513112301, 45545070263237577349101079224, 900713183572833927, 47833389293115922424244518395, 66982703105739823928616888581, 2654366660999562313, 10065000221312775070191266319, 72809789671095580032614161678, 802172040561293693, 55368020234227431980737115907, 76643845572545175002263276682, 708503903748134526, 65628898383037856436414820668, 44987690109166392822480750776, 3210405199827369831, 51324094763595357094247773895, 42390569315456882242888210088, 2944190347284502071, 68267891968676317655362193380, 52805756681285775730959367576, 2949416035652831442, 73832266040296569072647313247, 11677242953417999458586013286, 1047826440739515703, 71819481911464365837771571445, 70023410957568017485024613984, 2919761773381184068, 14288692677127157862741800601, 68614669904545932974862673421, 3192069934694634236, 40911143146951363652948679819, 36726340213652165777148450109, 1134186923017082678, 39288195491353244459983197743, 17887004850575494809668255219, 1531128498427138948, 64165476640540843706670205475, 13702244181383034389655248257, 817834689673160984, 52267338902683651354759035856, 42857200156150037235118651312, 3009153052539239897, 34320922125363455722479497405, 18968439930517864980082046244, 2673940587962061873, 58383773892828556703200586141, 56341206223802976680038334024, 1381294659878719620, 25972187965986496556105338612, 57597724818149580282170272741, 718249950847620143, 10030162654640603824430617792, 24012910938650168201548701895, 332905499918561779, 28881928374714801333028252505, 59826687165903310449258896525, 1463408266661312830, 29696478604593663938654649536, 3154875466397226531712866545, 2165811029588820454, 6773031306704665486417309052, 33915282316478439483191818718, 2513200990560639573, 51444272716787176934038291458, 19603969718274004677777093801, 2816445388795899107, 58663956475578564938056774152, 75449916049465729970048375994, 1850582220984507067, 2717063265636734738816943516, 5698933408460981195609108916, 2887271073278166226, 9450308594527386485673632232, 63115518759824791635903443670, 971194038177272123, 68812427525427462885622219316, 8744069172828040174922999115, 2797585720787820469, 23026826461844490209531848498, 50474193491258401638735456515, 1002340271538933100, 41049130144932077069155659068, 15466607953410033055991738708, 2519210478390532931, 11290073692338294074276578698, 72014254367499130813772405748, 1686800809336729803, 30278926732454437732479619976, 50881336802818476709618628137, 573021287041488439, 45690577968118725375870194475, 31185194364113358765545311536, 907930853161247845, 77964061362037061551457386497, 54376254396829110557541923200, 3239802174012859802, 65473302861737894714138164986, 64581938164450969473913721652, 3275516943282373663, 30846904531727405349453690550, 63583558412573828948017764851, 2163989542870436852, 2400792803007918424012318271, 30639803631876702815321483746, 3189111146390237937, 10145568605744146423520976852, 40382598576055813767839358907, 1234887122629588772, 47498387938009547707017086754, 23565852563105217674555472498, 768277014272407291, 59110732999475123036601052485, 1763111872969717290304917834, 728482575993746853, 56374031960614756724135237003, 61575344650894680756052640348, 710325870438485678, 58260694524249208164889033602, 25732939095705340562123325091, 595123417830690515, 37306601038994061542511366795, 9230859104606648356829461415, 2875367619268290987, 12811523822783507855333992414, 11392189622774025858679475022, 1627100875721826955, 42599258235523529689355855640, 16954806916159126406110456588, 1599894895476406066, 71075381214477574781590766901, 58241455774089003078852091727, 1228104457241813003, 65868997142393073349415639739, 64892676944490778005107025183, 648617402067600869, 78993800308025407355823171383, 6282667670757310084489733446, 3377108116009550520, 57243501871268406486830572023, 28115904634379882985078300532, 1708922084415865576, 67949321587323242732403584306, 76239957837194242460534311090, 2694214351716774280, 610215543453610198523091342, 71811630049524701304274053525, 2937442692040545629, 69655254321434305710032875419, 66375425410483544999552319669, 96178716183830070, 59900767723474347501249672755, 65216079946570975781322466089, 2129695576777302915, 20888767033089281923565347389, 15191454241863216364031415000, 531878622784736208, 28583836985073814316831373616, 45572523653553757103301200665, 1757568523662200238, 57174118983155650019938820916, 64643768165700705077606332345, 1009148897373611501, 48414438075484767271630846112, 61716851731198590526996659578, 474703924760261253, 25704698898827313900249977971, 5855768232653670629052990762, 2276916810698933109, 1845567769716814629579566922, 64365890960252195832803714828, 3257319080358699593, 31200193754301667797189026765, 356573141297944541261179963, 1205371430851820941, 76350244083872037317208263288, 44412494090008158984247804183, 1800399223062766370, 76942069098092294285105876801, 56987594268472601376982425007, 1252977617893570080, 14134849625381870675217544560, 52168435515647142488672310467, 2392534556309902186, 8364470284806251379580318450, 30538927308023667059082629355, 630663140336518709, 16669076987864704728035434274, 13917050745780341503599435561, 443278579763178457, 3481439263323923521465245504, 6368610287627734637639958833, 2416403693596720245, 48686794994636533464272046155, 35989859826590642406561642869, 2464399153154317688, 27281643795020090517360702094, 18221594513003313269996680998, 3135507817793870767, 78029181939216112352894006028, 31456712406712519764387086446, 1698472082935352978, 62851348691087913852519318189, 55530853993194893039314688188, 1814731885053608693, 77603560310902460330908742219, 65323690490322269352952677069, 3099941160781535654, 73328133662212199616256790133, 14463004166121823492610304208, 1880864478789824775, 64467782513351306320827279376, 40329123215640406006526076535, 1701173573885234257, 60716057144133861243434405831, 77516722546855896633586491216, 2436026252307240886, 8468454843892732271916855455, 50085312834581473044611759105, 3192618969433926709, 52354122485981876971957712527, 10352736900234222455983351630, 2796765909296179783, 6063115632921483122585128487, 58811872058831807843880128742, 2266885237296667860, 28906452775876389261372286224, 78780473187024917695692898318, 2638659076824709371, 66564428223870535242436925466, 38139656967163073775253876904, 2442002648386197800, 1868880194916917938297864415, 6693566199902538337603100988, 2073716230601886001, 52327843935935087276737070124, 17657898286209760093091253499, 2687166738940243648, 9148148819988784633602318552, 70801490411025605432623689395, 3455634332459219324, 8947829447285469941102576470, 20400335818096918747940462266, 3321208247002273232, 73614561565682797886739874522, 6795959193403179504933747913, 642560154013769769, 18239189921553779402477276564, 45816773764077854412950912282, 2793171078500981037, 18619271780158473742643005633, 77228827430936573647950351324, 1757731373848649799, 53034983761133153425825273076, 68294603354397515461302385260, 2083456314745840520, 30600052974422633541329848552, 77128630459639085585665103913, 1050603454662243296, 75652056904078538160508456464, 53162468377873426525793530854, 2719603707242388330, 34855230677560572059745116029, 21085025146958618662509016660, 987605033399877191, 11963089017296646672411867150, 62971626447790295154618645447, 456840443392288024, 11869191755671958723549052278, 40128284653413220430128104716, 189563440540870114, 9695561268106378447088971203, 21823487054626441130383931656, 2734293447743021711, 69609104519056677181390490157, 71200889546199560210155541845, 246167865466193786, 37905809896767389150422606878, 57470301451749710442347427760, 2796922383183859544, 45208377051423299680856621334, 67841910357089895415568137410, 2546718327086965079, 42942814645786059091477811959, 7345525297644785709341907045, 1864695073847346538, 68550373647586273901127222745, 7595984495463234775997722540, 539019582118948018, 21229106240971577430173959872, 355489099096982696983360314, 1423417193732822044, 63375445249134291642283759803, 17872228753910589593408633601, 2555291599511166225, 60003527446132210367842941097, 38833062985798517570737565874, 3276168081630761699, 53843079696879119595082698850, 14741529842688195319319583353, 907245791992998526, 26038879843109784017590191621, 52870021862292282946299950738, 2551874415987501137, 21322892280957701084225453366, 75661114205061545844586553503, 117796863738671812, 24398753863288847069364597381, 21684915865026077946696284264, 135583255326742356, 2655588879687354604673227322, 79039201237393058879423153631, 3317024129879014016, 23746954150282692730061785234, 60027140930927383635796507471, 3355648802066345288, 68947465546109296063720184403, 31455814437857417274841826234, 1519536043682109665, 30435322080793497982418328756, 9873726247019571115887459992, 1420261351751878633, 8585886436263245602317198450, 32540229230424385962836906794, 2745738913484719809, 7982801416975554910797438755, 30243096961240548806330274467, 2503488470089940122, 29353559884074671348821657410, 46717729834754386306503503543, 2105360788965822685, 50465840821240474641910604607, 15040977196294653353595904649, 810398228078955692, 36586090966527583193432941521, 32527175793542169050006907744, 3455947091008935733, 44074008444014778795777359545, 7456569852554753527152213083, 949162702954113477, 57832034254825399001095793755, 13246746327064119823164384091, 611867871464721223, 36537303992371088725124959830, 69857744090199184577151809812, 206457374462666528, 6013455380406219799669645497, 20448402513472264526836914471, 325092807320212227, 63160082731405578355167573987, 36564014311121114059105963647, 1814313817880089370, 17005118345357106768558634492, 53085072710424741174912676715, 1619571968892417470, 19138461106192599655481154848, 19687745769458599990486996638, 227750207136530302, 41840715303892328405419792549, 75091246731323848562281673856, 2788315296471857334, 29025762131864386432094011918, 15791231239437877140622617758, 1397826517640649643, 72635188711829501440099099620, 75318800340551682707664358685, 2740741096141989738, 4869127616709023482114488328, 3283108917519645249691922910, 865142527842900682, 79068146410754304112630559679, 29375635809771785283237165407, 432958718679290532, 67559076361367519178953294978, 67038253456412197251507470684, 1004802196401525191, 67228025707572955057913543358, 17852216699527548833916842366, 1910372761441328295, 56957555065398727322088968760, 53191601204729005381639778844, 1103590222166366118, 24100256211167092537239064279, 73807086702256985672123205004, 2306025827411644748, 64792211448080522297171362290, 36706906402755562273141864291, 1065008427413751571, 13463340504647469475951896803, 59947338296219741713228977241, 2173882008540311631, 4862253014510218097117696054, 11607936691081186610750713918, 1352109173894748794, 16420085930869379924008206077, 29182151126437541095578546416, 623105004098517689, 67119851516068086960310048535, 51322151618996056679294697368, 1574983744056110755, 41390101113760352683192758772, 8967911802370657983422789330, 840354419638281185, 71915557106300755083401266600, 77107430853219681720775737957, 3439700714207088817, 1146682033918837697324964368, 36880472216783202890543251211, 899175063033217790, 42361394560697623902477934876, 70332408898655902640766774594, 1333997318766615187, 23642424959739633709165327414, 17009251402196439892496588089, 1593159218823761418, 49454645403236994066018055536, 51820936777381802535321800249, 2549241518396596710, 22461854435533900729564787495, 44017272258907963598913965734, 1945511523774940466, 44157409491419897843892091791, 14298779472580729896379647791, 733835864005545116, 9597260824514711237960317250, 8350731294023158969467432777, 261753821612704415, 73032685205373754311610951955, 33537093124336234947344166476, 2521616476748679810, 67154218799253490003673403096, 68502421051006686285017907444, 2462108649374530883, 69994932413577605250455248207, 14388271860579248178608808979, 1527716660089777953, 19228548636015502423608118313, 27152949131129296746050631558, 2690497165435118984, 884466935258971873076949310, 76399258817262437267755420200, 3439485509091611651, 2013654784442386105262905202201186439758378444822205495631232048445674224483, 39158007757412093876313608663, 65407360820854140004948361048, 2284908109112677969, 4447613452168483181370820769, 15508094737828025397988454114, 698461499747732182, 25417214924745512131112372302, 70755921431737572898561593666, 4897646118225797, 75962679284224210182109670378, 34232834934904182714446079712, 2440956735466924032, 27960883735167344498496207750, 56701112460009051457339735423, 3019426709056655079, 12157750687307034187807607968, 73052116249315680545653975018, 1408336660070536790, 76361516533972882448109586258, 34360466092510705333064523338, 415539299738748454, 73199682285624051964267904115, 56566393082933685752558478277, 2602514150991862089, 71208685306944557890999666300, 37489821753500538193888670168, 3478701521232935226, 63713383854207756411214621476, 57650535883389580879738476613, 2951687960965023188, 1123233161966257160519764136, 20027680707029316142401222460, 3115267703405796066, 24, 72829490910025941028874027023, 60294702729134876255836990091, 587406458043897774, 0, 29278821361638737694503336775, 62044136809265621035498672362, 454824414591434487, 0, 340282366920938463475250044745131196184, 340282366920938463471381874204636563585, 4196216913619740352, 1972319070739588101, 66443987468193530372417098085, 37119323691166654757308615853, 963990182193152437, 0, 52362201687457778066111457517, 51359002383685408033875559137, 674930317098375997, 0, 340282366920938463472573628320122907480, 2921978634228650880, 340282366920938463466160822491329246447, 1332489572289759370, ]; dispatcher.verify_and_submit_fibonacci_number(calldata.span()); } ================================================ FILE: src/contracts/universal_ecip/Scarb.toml ================================================ [package] name = "universal_ecip" version = "0.1.0" edition = "2024_07" [dependencies] garaga = { path = "../.." } starknet = "2.16.1" [cairo] sierra-replace-ids = false [[target.starknet-contract]] casm = true casm-add-pythonic-hints = true ================================================ FILE: src/contracts/universal_ecip/src/lib.cairo ================================================ use garaga::definitions::G1Point; #[starknet::interface] trait IUniversalECIP { fn msm_g1( self: @TContractState, points: Span, scalars: Span, curve_index: usize, msm_hint: Span, ) -> G1Point; } #[starknet::contract] mod UniversalECIP { use garaga::definitions::G1Point; use garaga::ec_ops::msm_g1; #[storage] struct Storage {} #[abi(embed_v0)] impl IUniversalECIP of super::IUniversalECIP { fn msm_g1( self: @ContractState, points: Span, scalars: Span, curve_index: usize, msm_hint: Span, ) -> G1Point { msm_g1(points, scalars, curve_index, msm_hint) } } } ================================================ FILE: src/corelib_imports/README.md ================================================ # Corelib Imports This package provides controlled access to non-public functions, structs, and traits from the Cairo Corelib library through selective re-exports. ## Overview The package leverages Cairo edition 2023_10 to access internal Cairo Corelib components that are not part of the standard public API. These utilities expose performance-critical operations for cryptographic computations, particularly optimized bounded integer arithmetic and circuit operations used throughout the Garaga ecosystem. ## Visibility Rules and Architecture Cairo's visibility system restricts access to internal modules by default. This package uses feature flags (e.g., `#[feature("bounded-int-utils")]`) to expose specific internal APIs that would otherwise be inaccessible. The approach follows established patterns in the Cairo ecosystem, similar to the [Stwo Cairo verifier's bounded integer utilities](https://github.com/starkware-libs/stwo-cairo/blob/a9cc98cc78f39e30a5aea71af7421a09f764df0a/stwo_cairo_verifier/crates/bounded_int/src/lib.cairo). ## Exported Modules ### `bounded_int` Re-exports core bounded integer utilities with compile-time guarantees: - `BoundedInt`: Type-safe integer arithmetic with compile-time bounds - `AddHelper`, `MulHelper`, `DivRemHelper`: Optimized arithmetic operations - `upcast`, `downcast`: Safe type conversions between integer bounds - `bounded_int_div_rem`: Efficient division with remainder operations ### `circuit` Circuit construction and optimization utilities: - `CircuitData`, `CircuitDefinition`: Circuit representation types - `u384`, `u96`: Extended precision integer types for cryptographic operations - `AddInputResult`: Circuit input accumulation - `conversions`: Specialized arithmetic helpers for multi-precision operations ### `integer` Extended integer operations: - `u128s_from_felt252`: Efficient felt252 to u128 conversion utilities - `U128sFromFelt252Result`: Result type for safe conversions ### `array` & `keccak` Utility functions: - `array_slice`: Efficient array slicing operations - `cairo_keccak`, `keccak_add_u256_be`: Keccak hash operations ## Usage Examples ### Bounded Integer Arithmetic ```cairo use corelib_imports::bounded_int::{BoundedInt, DivRemHelper, bounded_int_div_rem}; // Efficient division with compile-time bounds checking let result = bounded_int_div_rem(dividend, divisor); ``` ### Circuit Operations ```cairo use corelib_imports::circuit::conversions::{ DivRemU96By32, NZ_POW64_TYPED, POW32, UnitInt }; // High-precision arithmetic for cryptographic circuits let quotient = DivRemU96By32::div_rem(value, NZ_POW32_TYPED); ``` ### Type Conversions ```cairo use corelib_imports::bounded_int::{downcast, upcast}; use corelib_imports::integer::{u128s_from_felt252}; // Safe conversions between integer types let converted = upcast(bounded_value); let (low, high) = u128s_from_felt252(felt_value); ``` These utilities are extensively used across Garaga's elliptic curve operations, finite field arithmetic, and cryptographic circuit implementations for optimal performance. ================================================ FILE: src/corelib_imports/Scarb.toml ================================================ [package] name = "corelib_imports" version = "0.1.3" edition = "2023_10" description = "Useful Corelib non-public functions, structs, and traits made public and re-exported through 2023_10 edition" readme = "README.md" repository = "https://github.com/keep-starknet-strange/garaga/tree/main/src/corelib_imports" authors = ["feltroidprime"] [lib] [dependencies] [dev-dependencies] cairo_test = "2.16.1" ================================================ FILE: src/corelib_imports/src/lib.cairo ================================================ pub mod array { pub use core::array::array_slice; } pub mod integer { pub use core::integer::{U128sFromFelt252Result, u128s_from_felt252}; } pub mod keccak { pub use core::keccak::{cairo_keccak, keccak_add_u256_be}; } pub mod bounded_int { #[feature("bounded-int-utils")] pub use core::internal::bounded_int; #[feature("bounded-int-utils")] pub use core::internal::bounded_int::{ AddHelper, BoundedInt, DivRemHelper, MulHelper, UnitInt, bounded_int_div_rem, downcast, upcast, }; } pub mod circuit { pub use core::circuit::{ AddInputResult, CircuitData, CircuitDefinition, CircuitInputAccumulator, IntoCircuitInputValue, U96Guarantee, add_circuit_input, init_circuit_data, into_u96_guarantee, u384, u96, }; pub mod conversions { pub use core::circuit::conversions::{ AddHelperTo128By64Impl, AddHelperTo128By96Impl, AddHelperTo96By32Impl, DivRemU128By64, DivRemU128By96, DivRemU96By32, DivRemU96By64, MulHelper32By96Impl, MulHelper64By32Impl, MulHelper64By64Impl, NZ_POW32_TYPED, NZ_POW64_TYPED, NZ_POW96_TYPED, POW32, POW32_TYPED, POW64, POW64_TYPED, POW96_TYPED, UnitInt, felt252_try_into_two_u96, two_u96_into_felt252, upcast, }; } } ================================================ FILE: src/src/apps/drand.cairo ================================================ use core::circuit::{ CircuitElement, CircuitInput, CircuitInputs, CircuitModulus, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, u96, }; use core::num::traits::Zero; use core::sha256::compute_sha256_u32_array; use garaga::basic_field_ops::{is_even_u384, u32_8_to_u384, u512_mod_p}; use garaga::circuits::ec::{run_ADD_EC_POINT_circuit, run_CLEAR_COFACTOR_BLS12_381_circuit}; use garaga::circuits::isogeny::run_BLS12_381_APPLY_ISOGENY_BLS12_381_circuit; use garaga::core::circuit::AddInputResultTrait2; use garaga::definitions::{ BLS_G2_GENERATOR, G1Point, G2Point, deserialize_u384, get_BLS12_381_modulus, serialize_u384, }; use garaga::ec_ops_g2; use garaga::single_pairing_tower::{final_exp_bls12_381_tower, miller_loop_bls12_381_tower}; // Chain: 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971 // Public Key: // G2Point(x=(2020076495541918814736776030432697997716141464538799718886374996015782362070437455929656164150586936230283253179482, // 586231829158603972936263795113906716025771067144631327612230935308837823978471744132589153452744931590357767971921), // y=(1791278522428100783277199431487181031376873968689022069271761201187685493801088467849610331824611383166297460070456, // 3748041376541174045371877684805027382480271890984968787916314231755985669195299696440090936404461850913289003455520), // curve_id=) // Period: 3 seconds // Genesis Time: 1692803367 // Hash: 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971 // Group Hash: f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e // Scheme ID: bls-unchained-g1-rfc9380 // Beacon ID: quicknet // ---------------------------------------- // Note : Negated to use in pairing check. pub const DRAND_QUICKNET_PUBLIC_KEY: G2Point = G2Point { x0: u384 { limb0: 0x4bc09e76eae8991ef5ece45a, limb1: 0xbd274ca73bab4af5a6e9c76a, limb2: 0x3aaf4bcb5ed66304de9cf809, limb3: 0xd1fec758c921cc22b0e17e6, }, x1: u384 { limb0: 0x6a0a6c3ac6a5776a2d106451, limb1: 0xb90022d3e760183c8c4b450b, limb2: 0xcad3912212c437e0073e911f, limb3: 0x3cf0f2896adee7eb8b5f01f, }, y0: u384 { limb0: 0xdfd038b83dbad4e0fbae5838, limb1: 0x942ea644bed4152aa6d85248, limb2: 0x43812423f8525883c7e472fa, limb3: 0xba35f3379c4e4d1e3a70b08, }, y1: u384 { limb0: 0xd9aa8e74b5823224c149d420, limb1: 0x1851f5129301fe6603fc716a, limb2: 0x9b84512e61a5e814e923569d, limb3: 0x1859fcf74bc8a580a828f6e0, }, }; pub const DRAND_QUICKNET_GENESIS_TIME: u64 = 1692803367; pub const DRAND_QUICKNET_PERIOD: u64 = 3; const a_iso_swu: u384 = u384 { limb0: 0xa0e0f97f5cf428082d584c1d, limb1: 0xd8e8981aefd881ac98936f8d, limb2: 0xc96d4982b0ea985383ee66a8, limb3: 0x144698a3b8e9433d693a02, }; const b_iso_swu: u384 = u384 { limb0: 0x316ceaa5d1cc48e98e172be0, limb1: 0xa0b9c14fcef35ef55a23215a, limb2: 0x753eee3b2016c1f0f24f4070, limb3: 0x12e2908d11688030018b12e8, }; const z_iso_swu: u384 = u384 { limb0: 11, limb1: 0, limb2: 0, limb3: 0 }; const NZ_POW2_32_64: NonZero = 0x100000000; // lib_str + bytes([0]) + dst_prime // LIB_DST = b'\x00\x80\x00BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_+' // bytes len : 47. const LIB_DST: [u32; 11] = [ 0x800042, 0x4c535f53, 0x49475f42, 0x4c533132, 0x33383147, 0x315f584d, 0x443a5348, 0x412d3235, 0x365f5353, 0x57555f52, 0x4f5f4e55, ]; const LIB_DST_LAST_WORD: u32 = 0x4c5f2b; const I_DST_PRIME: [u32; 10] = [ 0x5f534947, 0x5f424c53, 0x31323338, 0x3147315f, 0x584d443a, 0x5348412d, 0x3235365f, 0x53535755, 0x5f524f5f, 0x4e554c5f, ]; const I_DST_PRIME_LAST_WORD: u32 = 0x2b; fn get_i_dst_prime_first_word(i: usize) -> u32 { return i.into() * 0x1000000 + 0x424c53; } // Used in drand verifier contract. #[derive(Drop, Serde)] pub struct DrandResult { pub round_number: u64, pub randomness: felt252, } #[derive(Drop)] pub struct MapToCurveHint { pub gx1_is_square: bool, pub y1: u384, pub y_flag: bool // true if y and u have same parity, false otherwise } pub impl MapToCurveHintSerde of Serde { fn serialize(self: @MapToCurveHint, ref output: Array) { Serde::::serialize(self.gx1_is_square, ref output); serialize_u384(self.y1, ref output); Serde::::serialize(self.y_flag, ref output); } fn deserialize(ref serialized: Span) -> Option { let gx1_is_square = Serde::::deserialize(ref serialized); let y1 = deserialize_u384(ref serialized); let y_flag = Serde::::deserialize(ref serialized); return Option::Some( MapToCurveHint { gx1_is_square: gx1_is_square.unwrap(), y1: y1, y_flag: y_flag.unwrap(), }, ); } } #[derive(Drop, Serde)] pub struct HashToCurveHint { pub f0_hint: MapToCurveHint, pub f1_hint: MapToCurveHint, } // Like hash to curve but we start with the drand round number for simplicity. pub fn round_to_curve_bls12_381(round: u64, hash_to_curve_hint: HashToCurveHint) -> G1Point { let message = round_to_message(round); return hash_to_curve_bls12_381(message, hash_to_curve_hint); } #[inline] pub fn hash_to_curve_bls12_381(message: [u32; 8], hash_to_curve_hint: HashToCurveHint) -> G1Point { let (felt0, felt1) = hash_to_two_bls_felts(message); let pt0 = map_to_curve(felt0, hash_to_curve_hint.f0_hint); let pt1 = map_to_curve(felt1, hash_to_curve_hint.f1_hint); let modulus = get_BLS12_381_modulus(); let (sum) = run_ADD_EC_POINT_circuit(pt0, pt1, modulus); let (sum) = run_BLS12_381_APPLY_ISOGENY_BLS12_381_circuit(sum); // clear cofactor : let (res) = run_CLEAR_COFACTOR_BLS12_381_circuit(sum, modulus); return res; } // x = BLS seed // n = BLS12_381 EC prime order subgroup // cofactor = (1 - (x % n)) % n // const bls_cofactor: u128 = 0xd201000000010001; pub const BLS_COFACTOR_EPNS: (felt252, felt252, felt252, felt252) = ( 12124305939094075449, 3008070283847567304, 1, -1, ); pub const BLS_COFACTOR: u128 = 0xd201000000010001; // "digest function" pub fn round_to_message(round: u64) -> [u32; 8] { let (high, low) = DivRem::div_rem(round, NZ_POW2_32_64); let mut array: Array = array![]; array.append(high.try_into().unwrap()); array.append(low.try_into().unwrap()); return compute_sha256_u32_array(input: array, last_input_word: 0, last_input_num_bytes: 0); } #[inline] fn xor_u32_array_8(a: [u32; 8], b: [u32; 8]) -> [u32; 8] { let [a0, a1, a2, a3, a4, a5, a6, a7] = a; let [b0, b1, b2, b3, b4, b5, b6, b7] = b; return [a0 ^ b0, a1 ^ b1, a2 ^ b2, a3 ^ b3, a4 ^ b4, a5 ^ b5, a6 ^ b6, a7 ^ b7]; } #[inline] fn xor_u32_array_4(a: [u32; 4], b: [u32; 4]) -> [u32; 4] { let [a0, a1, a2, a3] = a; let [b0, b1, b2, b3] = b; return [a0 ^ b0, a1 ^ b1, a2 ^ b2, a3 ^ b3]; } const POW_2_32: u128 = 0x100000000; const POW_2_64: u128 = 0x10000000000000000; const POW_2_96: u128 = 0x1000000000000000000000000; fn u32_array_to_u256(d: [u32; 8]) -> u256 { let [d0, d1, d2, d3, d4, d5, d6, d7] = d; let high: felt252 = d0.into() * POW_2_96.into() + d1.into() * POW_2_64.into() + d2.into() * POW_2_32.into() + d3.into(); let low: felt252 = d4.into() * POW_2_96.into() + d5.into() * POW_2_64.into() + d6.into() * POW_2_32.into() + d7.into(); return u256 { low: low.try_into().unwrap(), high: high.try_into().unwrap() }; } fn hash_to_two_bls_felts(message: [u32; 8]) -> (u384, u384) { let mut array: Array = array![]; // Pad with 64 0-bytes. In u32, this is 64 / 4 = 16 elements. // "Z_padd" array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); array.append(0); // msg. 8*4 = 32 bytes for v in message.span() { array.append(*v); } // LIB_DST 47 bytes for v in LIB_DST.span() { array.append(*v); } // Total : 64 + 32 + 47 = 143 bytes = 1144 bits. let b0 = compute_sha256_u32_array( input: array, last_input_word: LIB_DST_LAST_WORD, last_input_num_bytes: 3, ); let mut array: Array = array![]; for v in b0.span() { array.append(*v); } array.append(get_i_dst_prime_first_word(1)); for v in I_DST_PRIME.span() { array.append(*v); } let bi = compute_sha256_u32_array( input: array, last_input_word: I_DST_PRIME_LAST_WORD, last_input_num_bytes: 1, ); let bi_xor_b0 = xor_u32_array_8(bi, b0); let mut array: Array = array![]; for v in bi_xor_b0.span() { array.append(*v); } array.append(get_i_dst_prime_first_word(2)); for v in I_DST_PRIME.span() { array.append(*v); } let bi_1 = compute_sha256_u32_array(array, I_DST_PRIME_LAST_WORD, 1); let bi1_xor_b0 = xor_u32_array_8(bi_1, b0); let mut array: Array = array![]; for v in bi1_xor_b0.span() { array.append(*v); } array.append(get_i_dst_prime_first_word(3)); for v in I_DST_PRIME.span() { array.append(*v); } let bi_2 = compute_sha256_u32_array(array, I_DST_PRIME_LAST_WORD, 1); let bi2_xor_b0 = xor_u32_array_8(bi_2, b0); let mut array: Array = array![]; for v in bi2_xor_b0.span() { array.append(*v); } array.append(get_i_dst_prime_first_word(4)); for v in I_DST_PRIME.span() { array.append(*v); } let bi_3 = compute_sha256_u32_array(array, I_DST_PRIME_LAST_WORD, 1); let modulus = get_BLS12_381_modulus(); return ( u512_mod_p(u32_8_to_u384(bi), u32_8_to_u384(bi_1), modulus), u512_mod_p(u32_8_to_u384(bi_2), u32_8_to_u384(bi_3), modulus), ); } fn map_to_curve(_u: u384, hint: MapToCurveHint) -> G1Point { let (neg_ta, num_x1) = map_to_curve_inner_1(_u); let (gx1, div) = map_to_curve_inner_2(neg_ta, num_x1); match hint.gx1_is_square { true => map_to_curve_inner_final_quad_res(num_x1, gx1, hint.y1, hint.y_flag, div, _u), false => map_to_curve_inner_final_not_quad_res(num_x1, hint.y1, hint.y_flag, div, _u, gx1), } } fn map_to_curve_inner_1(_u: u384) -> (u384, u384) { let z = CircuitElement::> {}; let u = CircuitElement::> {}; let zero = CircuitElement::> {}; let one = CircuitElement::> {}; let b = CircuitElement::> {}; let u2 = circuit_mul(u, u); let zeta_u2 = circuit_mul(z, u2); let zeta_u2_square = circuit_mul(zeta_u2, zeta_u2); let ta = circuit_add(zeta_u2_square, zeta_u2); let neg_ta = circuit_sub(zero, ta); let num_x1 = circuit_mul(b, circuit_add(ta, one)); let modulus = TryInto::< _, CircuitModulus, >::try_into( [ 0xb153ffffb9feffffffffaaab, 0x6730d2a0f6b0f6241eabfffe, 0x434bacd764774b84f38512bf, 0x1a0111ea397fe69a4b1ba7b6, ], ) .unwrap(); // BLS12_381 prime field modulus let outputs = (neg_ta, num_x1) .new_inputs() .next_2(z_iso_swu) .next_2(_u) .next_2([0, 0, 0, 0]) .next_2([1, 0, 0, 0]) .next_2(b_iso_swu) .done_2() .eval(modulus) .unwrap(); return (outputs.get_output(neg_ta), outputs.get_output(num_x1)); } fn map_to_curve_inner_2(_neg_ta: u384, _num_x1: u384) -> (u384, u384) { let neg_ta_or_z = CircuitElement::> {}; let a = CircuitElement::> {}; let b = CircuitElement::> {}; // let quad_res_correction = CircuitElement::> {}; // let y1_hint = CircuitElement::> {}; let num_x1 = CircuitElement::> {}; // let zeta_u2 = CircuitElement::> {}; // let u = CircuitElement::> {}; let div = circuit_mul(a, neg_ta_or_z); let num2_x1 = circuit_mul(num_x1, num_x1); let div2 = circuit_mul(div, div); let div3 = circuit_mul(div2, div); // num_gx1 = (num2_x1 + a * div2) * num_x1 + b * div3 let num_gx1 = circuit_add( circuit_mul(circuit_add(num2_x1, circuit_mul(a, div2)), num_x1), circuit_mul(b, div3), ); // let num_x2 = circuit_mul(zeta_u2, num_x1); let gx1 = circuit_mul(num_gx1, circuit_inverse(div3)); // let gx1_quad_res = circuit_mul(gx1, quad_res_correction); // let check = circuit_sub(gx1_quad_res, circuit_mul(y1_hint, y1_hint)); // let y2 = circuit_mul(zeta_u2, circuit_mul(u, y1_hint)); let _neg_ta_or_z = match _neg_ta.is_zero() { true => z_iso_swu, false => _neg_ta, }; // let _quad_res_correction = match hint.gx1_is_square { // true => u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0, }, // false => z_iso_swu, // }; let modulus = TryInto::< _, CircuitModulus, >::try_into( [ 0xb153ffffb9feffffffffaaab, 0x6730d2a0f6b0f6241eabfffe, 0x434bacd764774b84f38512bf, 0x1a0111ea397fe69a4b1ba7b6, ], ) .unwrap(); // BLS12_381 prime field modulus let outputs = (gx1, div) .new_inputs() .next_2(_neg_ta_or_z) .next_2(a_iso_swu) .next_2(b_iso_swu) .next_2(_num_x1) .done_2() .eval(modulus) .unwrap(); return (outputs.get_output(gx1), outputs.get_output(div)); } fn map_to_curve_inner_final_quad_res( _num_x1: u384, _gx1: u384, _y1_hint: u384, __parity_flag: bool, _div: u384, u: u384, ) -> G1Point { let num_x1 = CircuitElement::> {}; let gx1 = CircuitElement::> {}; let y1_hint = CircuitElement::> {}; let parity_flag = CircuitElement::> {}; let div = CircuitElement::> {}; let check = circuit_sub(gx1, circuit_mul(y1_hint, y1_hint)); let x_affine = circuit_mul(num_x1, circuit_inverse(div)); let y_affine = circuit_mul(parity_flag, y1_hint); let modulus = TryInto::< _, CircuitModulus, >::try_into( [ 0xb153ffffb9feffffffffaaab, 0x6730d2a0f6b0f6241eabfffe, 0x434bacd764774b84f38512bf, 0x1a0111ea397fe69a4b1ba7b6, ], ) .unwrap(); // BLS12_381 prime field modulus // Flag = -1 if y%2 !=u%1 ; 1 if y%2 == u%2. let _parity_flag: u384 = match __parity_flag { true => u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, false => crate::definitions::get_min_one(curve_index: 1), }; let outputs = (x_affine, y_affine, check) .new_inputs() .next_2(_num_x1) .next_2(_gx1) .next_2(_y1_hint) .next_2(_parity_flag) .next_2(_div) .done_2() .eval(modulus) .unwrap(); let chk = outputs.get_output(check); assert(chk == Zero::zero(), 'm2cI wrong square root'); // Verify parity. base is even so high parts doesn't affect parity. // (l0 + l1*2^b + l2*2^2b + l3*2^3b % 2 // l0 % 2 + (l1 % 2)*2^b % 2 + (l2 % 2)*2^2b % 2 + (l3 % 2)*2^3b % 2 // 2^b = 0 for all b>=1 // so u384 % 2 = limb0 % 2. match __parity_flag { true => assert(is_even_u384(_y1_hint) == is_even_u384(u), 'm2cI wrong parity'), false => assert(is_even_u384(_y1_hint) != is_even_u384(u), 'm2cI wrong parity'), } return G1Point { x: outputs.get_output(x_affine), y: outputs.get_output(y_affine) }; } fn map_to_curve_inner_final_not_quad_res( _num_x1: u384, _y1_hint: u384, __parity_flag: bool, _div: u384, _u: u384, _gx1: u384, ) -> G1Point { let num_x1 = CircuitElement::> {}; let y1_hint = CircuitElement::> {}; let parity_flag = CircuitElement::> {}; let div = CircuitElement::> {}; let u = CircuitElement::> {}; let gx1 = CircuitElement::> {}; let z = CircuitElement::> {}; let u2 = circuit_mul(u, u); let zeta_u2 = circuit_mul(z, u2); let gx1_quad_res = circuit_mul(gx1, z); let check = circuit_sub(gx1_quad_res, circuit_mul(y1_hint, y1_hint)); let y2 = circuit_mul(zeta_u2, circuit_mul(u, y1_hint)); let num_x = circuit_mul(zeta_u2, num_x1); let x_affine = circuit_mul(num_x, circuit_inverse(div)); let y_affine = circuit_mul(parity_flag, y2); // Flag = -1 if y%2 !=u%1 ; 1 if y%2 == u%2. let _parity_flag: u384 = match __parity_flag { true => u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, false => crate::definitions::get_min_one(curve_index: 1), }; let modulus = TryInto::< _, CircuitModulus, >::try_into( [ 0xb153ffffb9feffffffffaaab, 0x6730d2a0f6b0f6241eabfffe, 0x434bacd764774b84f38512bf, 0x1a0111ea397fe69a4b1ba7b6, ], ) .unwrap(); // BLS12_381 prime field modulus let outputs = (x_affine, y_affine, check) .new_inputs() .next_2(_num_x1) .next_2(_y1_hint) .next_2(_parity_flag) .next_2(_div) .next_2(_u) .next_2(_gx1) .next_2(z_iso_swu) .done_2() .eval(modulus) .unwrap(); let chk = outputs.get_output(check); assert(chk == Zero::zero(), 'm2cII wrong square root'); // Verify parity. base is even so high parts doesn't affect parity. match __parity_flag { true => assert( is_even_u384(outputs.get_output(y2)) == is_even_u384(_u), 'm2cI wrong parity', ), false => assert( is_even_u384(outputs.get_output(y2)) != is_even_u384(_u), 'm2cI wrong parity', ), } return G1Point { x: outputs.get_output(x_affine), y: outputs.get_output(y_affine) }; } // The result of a timelock encryption over drand quicknet. #[derive(Drop, Serde)] pub struct CipherText { pub U: G2Point, pub V: [u8; 16], pub W: [u8; 16], } // bytes("IBE-H2") (4 + 2 bytes) const IBE_H2: [u32; 2] = [0x4942452d, 0x4832]; // bytes("IBE-H4") (4 + 2 bytes) const IBE_H4: [u32; 2] = [0x4942452d, 0x4834]; const IBE_H3: [u32; 2] = [0x4942452d, 0x4833]; use corelib_imports::bounded_int::{BoundedInt, DivRemHelper, bounded_int_div_rem}; use corelib_imports::circuit::conversions::{ DivRemU96By32, DivRemU96By64, NZ_POW32_TYPED, NZ_POW64_TYPED, POW32, POW64, UnitInt, }; const POW80: felt252 = 0x100000000000000000000; const NZ_POW80_TYPED: NonZero> = 0x100000000000000000000; const POW16: felt252 = 0x10000; const NZ_POW16_TYPED: NonZero> = 0x10000; const POW48: felt252 = 0x1000000000000; const NZ_POW48_TYPED: NonZero> = 0x1000000000000; const POW24: felt252 = 0x1000000; const POW8: felt252 = 0x100; type u64_bi = BoundedInt<0, { POW64 - 1 }>; type u80_bi = BoundedInt<0, { POW80 - 1 }>; type u48_bi = BoundedInt<0, { POW48 - 1 }>; type u32_bi = BoundedInt<0, { POW32 - 1 }>; impl DivRemU64By32 of DivRemHelper> { type DivT = BoundedInt<0, { POW32 - 1 }>; type RemT = BoundedInt<0, { POW32 - 1 }>; } impl DivRemU96By80 of DivRemHelper> { type DivT = BoundedInt<0, { POW16 - 1 }>; type RemT = BoundedInt<0, { POW80 - 1 }>; } impl DivRemU80By48 of DivRemHelper> { type DivT = BoundedInt<0, { POW32 - 1 }>; type RemT = BoundedInt<0, { POW48 - 1 }>; } impl DivRemU48By16 of DivRemHelper> { type DivT = BoundedInt<0, { POW32 - 1 }>; type RemT = BoundedInt<0, { POW16 - 1 }>; } impl DivRemU32By16 of DivRemHelper> { type DivT = BoundedInt<0, { POW16 - 1 }>; type RemT = BoundedInt<0, { POW16 - 1 }>; } #[inline(always)] pub fn append_u96_to_u32_array(ref array: Array, u: u96) { let (u32_h, u64_l): (DivRemU96By64::DivT, DivRemU96By64::RemT) = bounded_int_div_rem( u, NZ_POW64_TYPED, ); let (u32_mid, u32_low): (DivRemU64By32::DivT, DivRemU64By32::RemT) = bounded_int_div_rem( u64_l, NZ_POW32_TYPED, ); let u32_hf: felt252 = u32_h.into(); let u32_mf: felt252 = u32_mid.into(); let u32_lf: felt252 = u32_low.into(); array.append(u32_hf.try_into().unwrap()); array.append(u32_mf.try_into().unwrap()); array.append(u32_lf.try_into().unwrap()); } #[inline] pub fn append_u384_be_to_u32_array(ref array: Array, u: u384) { append_u96_to_u32_array(ref array, u.limb3); append_u96_to_u32_array(ref array, u.limb2); append_u96_to_u32_array(ref array, u.limb1); append_u96_to_u32_array(ref array, u.limb0); } const NZ_POW24_32: NonZero = 0x1000000; const NZ_POW16_32: NonZero = 0x10000; const NZ_POW8_32: NonZero = 0x100; #[inline(always)] pub fn u32_to_u8_4(a: u32) -> [u8; 4] { let (b3, r) = DivRem::div_rem(a, NZ_POW24_32); let (b2, r) = DivRem::div_rem(r, NZ_POW16_32); let (b1, b0) = DivRem::div_rem(r, NZ_POW8_32); return [ b3.try_into().unwrap(), b2.try_into().unwrap(), b1.try_into().unwrap(), b0.try_into().unwrap(), ]; } #[inline(always)] pub fn u32_4_to_u8_16(a: [u32; 4]) -> [u8; 16] { let [a3, a2, a1, a0] = a; let [b15, b14, b13, b12] = u32_to_u8_4(a3); let [b11, b10, b9, b8] = u32_to_u8_4(a2); let [b7, b6, b5, b4] = u32_to_u8_4(a1); let [b3, b2, b1, b0] = u32_to_u8_4(a0); return [b15, b14, b13, b12, b11, b10, b9, b8, b7, b6, b5, b4, b3, b2, b1, b0]; } #[inline(always)] pub fn append_u96_with_pending_u16(ref array: Array, pending_u16: u32, u: u96) -> u32 { let (u16_h, u80_l): (DivRemU96By80::DivT, DivRemU96By80::RemT) = bounded_int_div_rem( u, NZ_POW80_TYPED, ); let (u32_mid, u48_low): (DivRemU80By48::DivT, DivRemU80By48::RemT) = bounded_int_div_rem( u80_l, NZ_POW48_TYPED, ); let (u32_low, u16_low): (DivRemU48By16::DivT, DivRemU48By16::RemT) = bounded_int_div_rem( u48_low, NZ_POW16_TYPED, ); let u16_hf: felt252 = u16_h.into(); let u32_mf: felt252 = u32_mid.into(); let u32_lf: felt252 = u32_low.into(); let next_u16_pending: felt252 = u16_low.into(); array.append((pending_u16.into() * POW16 + u16_hf).try_into().unwrap()); array.append(u32_mf.try_into().unwrap()); array.append(u32_lf.try_into().unwrap()); return next_u16_pending.try_into().unwrap(); } #[inline(always)] pub fn append_u32_with_pending_u16(ref array: Array, pending_u16: u32, u: u32) -> u32 { let (u16_h, next_pending) = DivRem::div_rem(u, NZ_POW16_32); let u16_hf: felt252 = u16_h.into(); array.append((pending_u16.into() * POW16 + u16_hf).try_into().unwrap()); return next_pending; } pub fn append_u384_with_pending_u16(ref array: Array, pending_u16: u32, u: u384) -> u32 { let pending_u16 = append_u96_with_pending_u16(ref array, pending_u16, u.limb3); let pending_u16 = append_u96_with_pending_u16(ref array, pending_u16, u.limb2); let pending_u16 = append_u96_with_pending_u16(ref array, pending_u16, u.limb1); let pending_u16 = append_u96_with_pending_u16(ref array, pending_u16, u.limb0); return pending_u16; } pub fn u8_16_to_u32_4(a: [u8; 16]) -> [u32; 4] { let [a15, a14, a13, a12, a11, a10, a9, a8, a7, a6, a5, a4, a3, a2, a1, a0] = a; let w3: felt252 = a15.into() * POW24 + a14.into() * POW16 + a13.into() * POW8 + a12.into(); let w2: felt252 = a11.into() * POW24 + a10.into() * POW16 + a9.into() * POW8 + a8.into(); let w1: felt252 = a7.into() * POW24 + a6.into() * POW16 + a5.into() * POW8 + a4.into(); let w0: felt252 = a3.into() * POW24 + a2.into() * POW16 + a1.into() * POW8 + a0.into(); return [ w3.try_into().unwrap(), w2.try_into().unwrap(), w1.try_into().unwrap(), w0.try_into().unwrap(), ]; } pub fn decrypt_at_round(signature_at_round: G1Point, ciphertext: CipherText) -> [u8; 16] { let (M) = miller_loop_bls12_381_tower(signature_at_round, ciphertext.U); let rgid = final_exp_bls12_381_tower(M); let mut array: Array = array![]; let [ibe_h2_0, ibe_h2_1] = IBE_H2; array.append(ibe_h2_0); let pending = append_u384_with_pending_u16(ref array, ibe_h2_1, rgid.c1b2a1); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c1b2a0); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c1b1a1); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c1b1a0); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c1b0a1); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c1b0a0); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c0b2a1); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c0b2a0); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c0b1a1); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c0b1a0); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c0b0a1); let pending = append_u384_with_pending_u16(ref array, pending, rgid.c0b0a0); let [r7, r6, r5, r4, _, _, _, _] = compute_sha256_u32_array( input: array, last_input_word: pending, last_input_num_bytes: 2, ); let v: [u32; 4] = u8_16_to_u32_4(ciphertext.V); let sigma: [u32; 4] = xor_u32_array_4([r7, r6, r5, r4], v); let mut array: Array = array![]; let [ibe_h4_0, ibe_h4_1] = IBE_H4; array.append(ibe_h4_0); let [s3, s2, s1, s0] = sigma; let pending = append_u32_with_pending_u16(ref array, ibe_h4_1, s3); let pending = append_u32_with_pending_u16(ref array, pending, s2); let pending = append_u32_with_pending_u16(ref array, pending, s1); let pending = append_u32_with_pending_u16(ref array, pending, s0); let [sh7, sh6, sh5, sh4, _, _, _, _] = compute_sha256_u32_array( input: array, last_input_word: pending, last_input_num_bytes: 2, ); let w = u8_16_to_u32_4(ciphertext.W); let message: [u32; 4] = xor_u32_array_4([sh7, sh6, sh5, sh4], w); let [m3, m2, m1, m0] = message; // Convert to bytes : let message_bytes = u32_4_to_u8_16(message); // Verify U = G^R let mut array: Array = array![]; let [ibe_h3_0, ibe_h3_1] = IBE_H3; array.append(ibe_h3_0); // Append sigma let pending = append_u32_with_pending_u16(ref array, ibe_h3_1, s3); let pending = append_u32_with_pending_u16(ref array, pending, s2); let pending = append_u32_with_pending_u16(ref array, pending, s1); let pending = append_u32_with_pending_u16(ref array, pending, s0); // Append message : let pending = append_u32_with_pending_u16(ref array, pending, m3); let pending = append_u32_with_pending_u16(ref array, pending, m2); let pending = append_u32_with_pending_u16(ref array, pending, m1); let pending = append_u32_with_pending_u16(ref array, pending, m0); // Little endian let rh = compute_sha256_u32_array( input: array, last_input_word: pending, last_input_num_bytes: 2, ); let mut i = 1; let mut r = expand_message_drand(rh, i); // r must be non-zero: while r == 0 { i += 1; let _r = expand_message_drand(rh, i); r = _r; } let U = ec_ops_g2::ec_mul(BLS_G2_GENERATOR, r, 1).unwrap(); assert(U == ciphertext.U, 'Incorrect ciphertext proof.'); return message_bytes; } pub fn expand_message_drand(msg: [u32; 8], i: u8) -> u256 { let mut array: Array = array![]; let [m7, m6, m5, m4, m3, m2, m1, m0] = msg; // i.to_bytes(2, byteorder="little") let pending = append_u32_with_pending_u16(ref array, i.into() * 0x100, m7); let pending = append_u32_with_pending_u16(ref array, pending, m6); let pending = append_u32_with_pending_u16(ref array, pending, m5); let pending = append_u32_with_pending_u16(ref array, pending, m4); let pending = append_u32_with_pending_u16(ref array, pending, m3); let pending = append_u32_with_pending_u16(ref array, pending, m2); let pending = append_u32_with_pending_u16(ref array, pending, m1); let pending = append_u32_with_pending_u16(ref array, pending, m0); let hash_result = compute_sha256_u32_array( input: array, last_input_word: pending, last_input_num_bytes: 2, ); let [r0, r1, r2, r3, r4, r5, r6, r7] = hash_result; // Mask the first byte of r0 // Extract the leftmost byte let first_byte = r0 & 0xFF000000; // Right shift the first byte by 1 bit let shifted_byte = first_byte / 2; // Combine the shifted byte back with the rest of r0 let r0 = shifted_byte | (r0 & 0x00FFFFFF); return hash_to_u256([r0, r1, r2, r3, r4, r5, r6, r7]); } pub fn hash_to_u256(msg: [u32; 8]) -> u256 { let [a, b, c, d, e, f, g, h] = msg; let low: u128 = h.into() + g.into() * POW_2_32 + f.into() * POW_2_64 + e.into() * POW_2_96; let high: u128 = d.into() + c.into() * POW_2_32 + b.into() * POW_2_64 + a.into() * POW_2_96; u256 { low: low, high: high } } pub fn timestamp_to_round(timestamp: u64) -> u64 { // If timestamp is before genesis, return 0 (no round has started yet) if timestamp < DRAND_QUICKNET_GENESIS_TIME { return 0; } let elapsed_time: u64 = timestamp - DRAND_QUICKNET_GENESIS_TIME; return (elapsed_time / DRAND_QUICKNET_PERIOD) + 1; } pub fn round_to_timestamp(round: u64) -> u64 { // Round 0 is invalid if round == 0 { return 0; } // Calculate timestamp: genesis + (round-1) * period // We subtract 1 from the round because round 1 starts at genesis return DRAND_QUICKNET_GENESIS_TIME + ((round - 1) * DRAND_QUICKNET_PERIOD); } #[cfg(test)] mod tests { use garaga::ec_ops_g2::G2PointTrait; use super::{ CipherText, DRAND_QUICKNET_PUBLIC_KEY, G1Point, G2Point, HashToCurveHint, MapToCurveHint, decrypt_at_round, hash_to_curve_bls12_381, hash_to_two_bls_felts, map_to_curve, run_BLS12_381_APPLY_ISOGENY_BLS12_381_circuit, u384, }; #[test] fn test_drand_quicknet_public_key() { DRAND_QUICKNET_PUBLIC_KEY.assert_in_subgroup_excluding_infinity(1); } #[test] fn test_hash_to_two_bls_felts() { // sha256("Hello, World!") let message: [u32; 8] = [ 0xdffd6021, 0xbb2bd5b0, 0xaf676290, 0x809ec3a5, 0x3191dd81, 0xc7f70a4b, 0x28688a36, 0x2182986f, ]; let (a, b) = hash_to_two_bls_felts(message); assert_eq!( a, u384 { limb0: 0x3424dff585d947fedf210456, limb1: 0xd67576428da87a9356340b2e, limb2: 0x135e368f3927494b3933a985, limb3: 0x85a31dc6b81af709df9ba4e, }, ); assert_eq!( b, u384 { limb0: 0xdb509060a0293b7d9e20ae9, limb1: 0x189ad7a1508b89604e165848, limb2: 0x74a42a64a63d7c9dd6bfec2c, limb3: 0x1049922d5dcd716806ccfa3e, }, ); } #[test] fn test_map_to_curve() { let u = u384 { limb0: 42, limb1: 0x0, limb2: 0x0, limb3: 0x0 }; let expected = G1Point { x: u384 { limb0: 0x1c94f3121ca3e1454e60bded, limb1: 0xe09a5f66977f922ae74baf50, limb2: 0xa471b958de9a5099a84aca44, limb3: 0x923f1e3115dc78a457fffa1, }, y: u384 { limb0: 0xaa8806e6b469554a91758ec, limb1: 0xdbfb03df4a53a534ac80def7, limb2: 0xb81c6297bbac342050bff567, limb3: 0xfb9022e050807db4b155d87, }, }; let hint = MapToCurveHint { gx1_is_square: false, y1: u384 { limb0: 0x8c74c126c6351052ebf1965, limb1: 0x979aba6acb3e5dfca5581a51, limb2: 0x49e43c123f4e034706485bde, limb3: 0x152ffaf0e2cd3fbbb102b5e1, }, y_flag: false, }; let res = map_to_curve(u, hint); assert_eq!(res, expected); } #[test] fn test_isogeny() { let pt = G1Point { x: u384 { limb0: 0xfe95b6d6dc4c28b03aa82194, limb1: 0xc06a9cdc69f9d39a1cb3c132, limb2: 0xc0637d447baf4f55d4658b59, limb3: 0x166e53a3af1733961f92e08, }, y: u384 { limb0: 0x5dc860b68c76e432263e15dc, limb1: 0x8c9990a0f89eadd580f71395, limb2: 0xaf300dff12d93cfe32b45c5d, limb3: 0x8f6e2a59628049aecb84109, }, }; let expected = G1Point { x: u384 { limb0: 0x5fad5b4abf0d9b5a5500069, limb1: 0x88e3293255d2172755b29514, limb2: 0x2562887a0b9a729cf8f6f807, limb3: 0xfb545dd46e90e6f6bd679a1, }, y: u384 { limb0: 0xbea8d03c186753a97b5e8e0b, limb1: 0xbe3e7a1eb25cf6d7fa6f686d, limb2: 0x72026b41a862ff1fa8508191, limb3: 0xd596c01e510faf25030e9a5, }, }; let (res) = run_BLS12_381_APPLY_ISOGENY_BLS12_381_circuit(pt); assert_eq!(res, expected); } #[test] fn test_hash_to_curve() { let message: [u32; 8] = [ 0xdffd6021, 0xbb2bd5b0, 0xaf676290, 0x809ec3a5, 0x3191dd81, 0xc7f70a4b, 0x28688a36, 0x2182986f, ]; let hint = HashToCurveHint { f0_hint: MapToCurveHint { gx1_is_square: true, y1: u384 { limb0: 0xf26e7fd3c2733a0413db4463, limb1: 0xa1562d011f360461be8e36dd, limb2: 0x84a83147a7e7a1311a712501, limb3: 0x1290f63f6daa85ad6bf7088a, }, y_flag: false, }, f1_hint: MapToCurveHint { gx1_is_square: false, y1: u384 { limb0: 0xb88f6c46cebe267f9e2afa6c, limb1: 0xa845982734193f6f44e49212, limb2: 0x63e1f53f7553752da88fb12c, limb3: 0xd613d3f488be39870f05a5c, }, y_flag: false, }, }; let expected = G1Point { x: u384 { limb0: 0x931f614913b4e856c2a5dd1b, limb1: 0xce68eade0d43210615956b1d, limb2: 0x4f2c8c74301387552679068d, limb3: 0xcc12bfa116dae0017adb178, }, y: u384 { limb0: 0x6b02cc408fda040be6918d1e, limb1: 0x325a198e22c4131c6fed473b, limb2: 0xf0bbbddfea59e5a96a11bd20, limb3: 0xeb05659d43180b59cee2ea0, }, }; let res = hash_to_curve_bls12_381(message, hint); assert_eq!(res, expected); } #[test] fn test_decrypt_at_round() { // msg: b'hello\x00\x00\x00\x00\x00\x00\x00\x00abc' // round: 128 // network: DrandNetwork.quicknet let signature_at_round: G1Point = G1Point { x: u384 { limb0: 0xc0bcbd3576ff11f14722cf6c, limb1: 0xd452247305c00e921bd480d6, limb2: 0x8b9980255afbf088406ce2e9, limb3: 0x3783c94f8000028fa31f457, }, y: u384 { limb0: 0x2b4d36d607cf825974c364b4, limb1: 0x44cd6938390204bd3a17bf08, limb2: 0x92d3ea3afc64bf69e6c4cf27, limb3: 0x9ee7907fd3b11fa8ec81ccc, }, }; let ciph = CipherText { U: G2Point { x0: u384 { limb0: 0x340fdd978d12a78af62a4938, limb1: 0xf70620e8446a28e3d2071039, limb2: 0xe08fd6ca0d6e9bdcb5dbf048, limb3: 0x14fb6e4f383578999fe9250, }, x1: u384 { limb0: 0x25a2b053807bd5aa950143b1, limb1: 0x845c1664a97d715be868b2d2, limb2: 0x5c1891819cbeaf9241827325, limb3: 0x1db774cee6dd8860aad23b7, }, y0: u384 { limb0: 0x941e76c3d4243c3a29eb37b6, limb1: 0xeb7d54ef8c76445a546aa67e, limb2: 0x945908b037be402a146d92cc, limb3: 0x51401dcca71a5b8e961858, }, y1: u384 { limb0: 0x83136ccccc82c994f1c19abe, limb1: 0x638557d8f6ba3dbceffb0d86, limb2: 0xd81843d33e29bd92ca715eca, limb3: 0x12d802c5957e9cab6e1e8c82, }, }, V: [ 0xa7, 0x35, 0xd6, 0x12, 0x47, 0x88, 0xc9, 0x3f, 0x2c, 0xc4, 0xdd, 0xe5, 0x5d, 0x54, 0x31, 0x15, ], W: [ 0x7f, 0x10, 0x1c, 0x52, 0x8b, 0xf7, 0x63, 0x15, 0x57, 0x8d, 0x77, 0x2e, 0x79, 0x3f, 0x01, 0x29, ], }; let msg_decrypted = decrypt_at_round(signature_at_round, ciph); assert( msg_decrypted .span() == [ 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x62, 0x63, ] .span(), 'wrong msg', ); } } ================================================ FILE: src/src/apps/noir/zk_honk_transcript.cairo ================================================ use core::poseidon::hades_permutation; use core::traits::Into; use corelib_imports::keccak; use garaga::apps::noir::{G1Point256, ZKHonkProof}; use garaga::definitions::G1Point; pub const POW2_136: u256 = 0x10000000000000000000000000000000000; pub const POW2_136_NZ: NonZero = 0x10000000000000000000000000000000000; pub const POW2_8: NonZero = 0x100; pub const Fr: u256 = 21888242871839275222246405745257275088548364400416034343698204186575808495617; pub const ZK_BATCHED_RELATION_PARTIAL_LENGTH: usize = 9; pub const NUMBER_OF_SUBRELATIONS: usize = 26; pub const NUMBER_OF_ALPHAS: usize = NUMBER_OF_SUBRELATIONS - 1; pub const CONST_PROOF_SIZE_LOG_N: usize = 28; pub const NUMBER_OF_ENTITIES: usize = 41; pub impl Point256IntoCircuitPoint of Into { fn into(self: G1Point256) -> G1Point { G1Point { x: self.x.into(), y: self.y.into() } } } pub trait IHasher { fn new() -> T; fn update_u64_as_u256(ref self: T, v: u64); fn update_0_256(ref self: T); fn update(ref self: T, v: u256); fn digest(ref self: T) -> u256; } #[derive(Drop, Debug)] pub struct KeccakHasherState { pub arr: Array, } pub impl KeccakHasher of IHasher { #[inline] fn new() -> KeccakHasherState { KeccakHasherState { arr: array![] } } #[inline(never)] fn update_u64_as_u256(ref self: KeccakHasherState, v: u64) { self.arr.append(0); self.arr.append(0); self.arr.append(0); self.arr.append(u64_byte_reverse(v)); } #[inline] fn update(ref self: KeccakHasherState, v: u256) { keccak::keccak_add_u256_be(ref self.arr, v); } #[inline] fn update_0_256(ref self: KeccakHasherState) { self.arr.append(0); self.arr.append(0); self.arr.append(0); self.arr.append(0); } #[inline] fn digest(ref self: KeccakHasherState) -> u256 { ke_le_out_to_ch_be( keccak::cairo_keccak(ref self.arr, last_input_word: 0, last_input_num_bytes: 0), ) } } #[inline] fn u64_byte_reverse(word: u64) -> u64 { (core::integer::u128_byte_reverse(word.into()) / 0x10000000000000000).try_into().unwrap() } #[inline] fn u256_byte_reverse(word: u256) -> u256 { u256 { low: core::integer::u128_byte_reverse(word.high), high: core::integer::u128_byte_reverse(word.low), } } #[inline(never)] pub fn append_proof_point>(ref hasher: T, point: G1Point256) { hasher.update(point.x); hasher.update(point.y); } // Hasher little endian output to big endian challenge. // Converts to big endian, then takes modulo Fr. fn ke_le_out_to_ch_be(ke_le_out: u256) -> u256 { let ke_be: u256 = u256_byte_reverse(ke_le_out); let ch_be: u256 = ke_be % Fr; ch_be } #[derive(Drop, Debug, PartialEq)] pub struct ZKHonkTranscript { pub eta: u128, pub eta_two: u128, pub eta_three: u128, pub beta: u128, pub gamma: u128, pub alpha: u128, pub gate_challenge: u128, pub libra_challenge: u128, pub sum_check_u_challenges: Array, pub rho: u128, pub gemini_r: u128, pub shplonk_nu: u128, pub shplonk_z: u128, } #[derive(Drop)] pub struct Etas { pub eta: u128, pub eta2: u128, pub eta3: u128, } #[generate_trait] pub impl ZKHonkTranscriptImpl of ZKHonkTranscriptTrait { fn from_proof, impl Drop: Drop>( honk_proof: ZKHonkProof, vk_hash: u256, log_circuit_size: usize, ) -> (ZKHonkTranscript, felt252, felt252) { let (etas, challenge) = get_eta_challenges::< T, >( honk_proof.public_inputs, honk_proof.pairing_point_object, honk_proof.w1, honk_proof.w2, honk_proof.w3, vk_hash, ); let beta_gamma = get_beta_gamma_challenges::< T, >(challenge, honk_proof.lookup_read_counts, honk_proof.lookup_read_tags, honk_proof.w4); let alpha_challenge = generate_alpha_challenge::< T, >(beta_gamma, honk_proof.lookup_inverses, honk_proof.z_perm); let gate_challenge = generate_gate_challenge::(alpha_challenge); let libra_challenge = generate_libra_challenge::< T, >(gate_challenge, honk_proof.libra_commitments, honk_proof.libra_sum); let (sum_check_u_challenges, challenge) = generate_sumcheck_u_challenges::< T, >(libra_challenge, honk_proof.sumcheck_univariates, log_circuit_size); let rho_challenge = generate_rho_challenge::< T, >( challenge, honk_proof.sumcheck_evaluations, honk_proof.libra_evaluation, honk_proof.libra_commitments, honk_proof.gemini_masking_poly, honk_proof.gemini_masking_eval, ); let gemini_r_challenge = generate_gemini_r_challenge::< T, >(rho_challenge, honk_proof.gemini_fold_comms, log_circuit_size); let shplonk_nu_challenge = generate_shplonk_nu_challenge::< T, >( gemini_r_challenge, honk_proof.gemini_a_evaluations, honk_proof.libra_poly_evals, log_circuit_size, ); let shplonk_z_challenge = generate_shplonk_z_challenge::< T, >(shplonk_nu_challenge, honk_proof.shplonk_q); let (transcript_state, base_rlc, _) = hades_permutation( shplonk_z_challenge.low.into(), shplonk_z_challenge.high.into(), 2, ); return ( ZKHonkTranscript { eta: etas.eta, eta_two: etas.eta2, eta_three: etas.eta3, beta: beta_gamma.low, gamma: beta_gamma.high, alpha: alpha_challenge.low, gate_challenge: gate_challenge.low, libra_challenge: libra_challenge.low, sum_check_u_challenges: sum_check_u_challenges, rho: rho_challenge.low, gemini_r: gemini_r_challenge.low, shplonk_nu: shplonk_nu_challenge.low, shplonk_z: shplonk_z_challenge.low, }, transcript_state, base_rlc, ); } } // Return eta and last hasher output #[inline] pub fn get_eta_challenges, impl Drop: Drop>( pub_inputs: Span, pairing_point_object: Span, w1: G1Point256, w2: G1Point256, w3: G1Point256, vk_hash: u256, ) -> (Etas, u256) { let mut hasher = Hasher::new(); hasher.update(vk_hash); for pub_i in pub_inputs { hasher.update(*pub_i); } for pub_i in pairing_point_object { hasher.update(*pub_i); } append_proof_point(ref hasher, w1); append_proof_point(ref hasher, w2); append_proof_point(ref hasher, w3); let ch_be: u256 = hasher.digest(); let mut hasher_2 = Hasher::new(); hasher_2.update(ch_be); let ch_2_be: u256 = hasher_2.digest(); (Etas { eta: ch_be.low, eta2: ch_be.high, eta3: ch_2_be.low }, ch_2_be) } // Return beta, gamma, and last hasher output. // Outut : // ch_be. // beta = ch_be.low, gamma = ch_be.high, last_hasher_output = ch_be. #[inline] pub fn get_beta_gamma_challenges, impl Drop: Drop>( prev_hasher_output: u256, lookup_read_counts: G1Point256, lookup_read_tags: G1Point256, w4: G1Point256, ) -> u256 { let mut hasher = Hasher::new(); hasher.update(prev_hasher_output); append_proof_point(ref hasher, lookup_read_counts); append_proof_point(ref hasher, lookup_read_tags); append_proof_point(ref hasher, w4); let ch_be: u256 = hasher.digest(); ch_be } #[inline] pub fn generate_alpha_challenge, impl Drop: Drop>( prev_hasher_output: u256, lookup_inverse: G1Point256, z_perm: G1Point256, ) -> u256 { let mut hasher = Hasher::new(); hasher.update(prev_hasher_output); append_proof_point(ref hasher, lookup_inverse); append_proof_point(ref hasher, z_perm); let challenge: u256 = hasher.digest(); challenge } #[inline] pub fn generate_gate_challenge, impl Drop: Drop>( prev_hasher_output: u256, ) -> u256 { let mut hasher = Hasher::new(); hasher.update(prev_hasher_output); let gate_challenge: u256 = hasher.digest(); gate_challenge } #[inline] pub fn generate_libra_challenge, impl Drop: Drop>( prev_hasher_output: u256, libra_commitments: Span, libra_sum: u256, ) -> u256 { let mut hasher = Hasher::new(); hasher.update(prev_hasher_output); append_proof_point(ref hasher, (*libra_commitments.at(0)).into()); hasher.update(libra_sum); hasher.digest() } #[inline] pub fn generate_sumcheck_u_challenges, impl Drop: Drop>( prev_hasher_output: u256, sumcheck_univariates: Span, log_circuit_size: usize, ) -> (Array, u256) { let mut sum_check_u_challenges: Array = array![]; let mut challenge: u256 = prev_hasher_output; for i in 0..log_circuit_size { let mut hasher = Hasher::new(); hasher.update(challenge); for univariate in sumcheck_univariates .slice(i * ZK_BATCHED_RELATION_PARTIAL_LENGTH, ZK_BATCHED_RELATION_PARTIAL_LENGTH) { hasher.update(*univariate); } challenge = hasher.digest(); sum_check_u_challenges.append(challenge.low); } (sum_check_u_challenges, challenge) } #[inline] pub fn generate_rho_challenge, impl Drop: Drop>( prev_hasher_output: u256, sumcheck_evaluations: Span, libra_evaluation: u256, libra_commitments: Span, gemini_masking_poly: G1Point256, gemini_masking_eval: u256, ) -> u256 { let mut hasher = Hasher::new(); hasher.update(prev_hasher_output); assert(sumcheck_evaluations.len() == NUMBER_OF_ENTITIES, 'Wrong # of sumcheck evaluations'); for eval in sumcheck_evaluations { hasher.update(*eval); } hasher.update(libra_evaluation); append_proof_point(ref hasher, (*libra_commitments.at(1))); append_proof_point(ref hasher, (*libra_commitments.at(2))); append_proof_point(ref hasher, gemini_masking_poly); hasher.update(gemini_masking_eval); hasher.digest() } #[inline] pub fn generate_gemini_r_challenge, impl Drop: Drop>( prev_hasher_output: u256, gemini_fold_comms: Span, log_circuit_size: usize, ) -> u256 { let mut hasher = Hasher::new(); hasher.update(prev_hasher_output); // Log_n - 1 points assert(gemini_fold_comms.len() == log_circuit_size - 1, 'Wrong # gemini fold commitments'); for pt in gemini_fold_comms { append_proof_point(ref hasher, (*pt)); } hasher.digest() } #[inline] pub fn generate_shplonk_nu_challenge, impl Drop: Drop>( prev_hasher_output: u256, gemini_a_evaluations: Span, libra_poly_evals: Span, log_circuit_size: usize, ) -> u256 { let mut hasher = Hasher::new(); hasher.update(prev_hasher_output); assert(gemini_a_evaluations.len() == log_circuit_size, 'Wrong # gemini a evaluations'); for eval in gemini_a_evaluations { hasher.update(*eval); } assert(libra_poly_evals.len() == 4, 'Wrong # libra poly evals'); for eval in libra_poly_evals { hasher.update(*eval); } hasher.digest() } #[inline] pub fn generate_shplonk_z_challenge, impl Drop: Drop>( prev_hasher_output: u256, shplonk_q: G1Point256, ) -> u256 { let mut hasher = Hasher::new(); hasher.update(prev_hasher_output); append_proof_point(ref hasher, shplonk_q); hasher.digest() } #[cfg(test)] mod tests { use garaga::apps::noir::{get_vk, get_zk_proof_keccak}; use super::{KeccakHasherState, ZKHonkTranscript, ZKHonkTranscriptTrait}; #[test] fn test_transcript_zk_keccak() { let vk = get_vk(); let proof = get_zk_proof_keccak(); let (transcript, _, _) = ZKHonkTranscriptTrait::from_proof::< KeccakHasherState, >(proof, vk.vk_hash, vk.log_circuit_size); let expected = ZKHonkTranscript { eta: 0xe06b1fc6aaa49ae9fd402ada2b9134b9, eta_two: 0xe542c4b5332d3d478ddb457634915e1, eta_three: 0x8e6609b790521615a5280fb48742cad8, beta: 0x72d843c38074ab30feda0c1fec6c1b3a, gamma: 0x2a2d65e61cca6188a3a8923aa8e5f0fd, alpha: 0x9a4e2bc96d7e1dd703244eef656760ad, gate_challenge: 0x93408fac46045cb577fef77c8ae160e5, libra_challenge: 0x3d7684814dfcb8a69e8ed0d6811500ce, sum_check_u_challenges: array![ 0xdd54b9aefc090c30ea2968d1f2f2875b, 0x5b2c6faddf41ec1b5b0d30441320df35, 0x31a05c60e4601a6e5dd0cbf00ba66d4d, 0x78fd67e59d93d13bd9f90fe775d88759, 0x64d775cbd626fc667f7ef431d7a8a026, 0x5a389eb79d036095de26968eff05a52f, 0xad7a51b6745cf979f995c463b7c84b33, 0x396d8c7eb553dc399585fcbb227d8819, 0x9fbb8219244d68f56af6042a9aed2a6f, 0x8abf1fe8e59622f23abaefbbf040b77a, 0x2d8091d0fa8dbe6da6e339538144f442, 0xfc2b3617ce73378503ccce368a9010d5, ], rho: 0x193ead6536b4ba765236aa95c50de7f6, gemini_r: 0x7defebd9a6f21decaac79819dc18596e, shplonk_nu: 0xf2a3267c336f0ee4ab6f5a2b60b47647, shplonk_z: 0x1369879dd6918cd679e6295a75569269, }; assert_eq!(transcript.eta, expected.eta); assert_eq!(transcript.eta_two, expected.eta_two); assert_eq!(transcript.eta_three, expected.eta_three); assert_eq!(transcript.beta, expected.beta); assert_eq!(transcript.gamma, expected.gamma); assert_eq!(transcript.alpha, expected.alpha); assert_eq!(transcript.gate_challenge, expected.gate_challenge); assert_eq!(transcript.libra_challenge, expected.libra_challenge); assert_eq!(transcript.sum_check_u_challenges, expected.sum_check_u_challenges); assert_eq!(transcript.rho, expected.rho); assert_eq!(transcript.gemini_r, expected.gemini_r); assert_eq!(transcript.shplonk_nu, expected.shplonk_nu); assert_eq!(transcript.shplonk_z, expected.shplonk_z); } } ================================================ FILE: src/src/apps/noir.cairo ================================================ pub mod zk_honk_transcript; // use garaga::core::circuit::U64IntoU384; use garaga::definitions::{G1Point, G2Point, u384}; #[derive(Drop, Copy, Serde)] pub struct G1Point256 { pub x: u256, pub y: u256, } #[derive(Drop, Serde, Copy)] pub struct ZKHonkProof { pub public_inputs: Span, pub pairing_point_object: Span, pub w1: G1Point256, pub w2: G1Point256, pub w3: G1Point256, pub w4: G1Point256, pub z_perm: G1Point256, pub lookup_read_counts: G1Point256, pub lookup_read_tags: G1Point256, pub lookup_inverses: G1Point256, pub libra_commitments: Span, pub libra_sum: u256, pub sumcheck_univariates: Span, pub sumcheck_evaluations: Span, pub libra_evaluation: u256, pub gemini_masking_poly: G1Point256, pub gemini_masking_eval: u256, pub gemini_fold_comms: Span, pub gemini_a_evaluations: Span, pub libra_poly_evals: Span, pub shplonk_q: G1Point256, pub kzg_quotient: G1Point256, } #[derive(Drop, Copy)] pub struct HonkVk { pub vk_hash: u256, // keccak256(vk_bytes) % BN254_Fr pub log_circuit_size: usize, pub public_inputs_size: usize, pub qm: G1Point, pub qc: G1Point, pub ql: G1Point, pub qr: G1Point, pub qo: G1Point, pub q4: G1Point, pub qLookup: G1Point, pub qArith: G1Point, pub qDeltaRange: G1Point, pub qElliptic: G1Point, pub qMemory: G1Point, pub qNnf: G1Point, pub qPoseidon2External: G1Point, pub qPoseidon2Internal: G1Point, pub s1: G1Point, pub s2: G1Point, pub s3: G1Point, pub s4: G1Point, pub id1: G1Point, pub id2: G1Point, pub id3: G1Point, pub id4: G1Point, pub t1: G1Point, pub t2: G1Point, pub t3: G1Point, pub t4: G1Point, pub lagrange_first: G1Point, pub lagrange_last: G1Point, } pub const G2_POINT_KZG_1: G2Point = G2Point { x0: u384 { limb0: 0xf75edadd46debd5cd992f6ed, limb1: 0x426a00665e5c4479674322d4, limb2: 0x1800deef121f1e76, limb3: 0x0, }, x1: u384 { limb0: 0x35a9e71297e485b7aef312c2, limb1: 0x7260bfb731fb5d25f1aa4933, limb2: 0x198e9393920d483a, limb3: 0x0, }, y0: u384 { limb0: 0xc43d37b4ce6cc0166fa7daa, limb1: 0x4aab71808dcb408fe3d1e769, limb2: 0x12c85ea5db8c6deb, limb3: 0x0, }, y1: u384 { limb0: 0x70b38ef355acdadcd122975b, limb1: 0xec9e99ad690c3395bc4b3133, limb2: 0x90689d0585ff075, limb3: 0x0, }, }; pub const G2_POINT_KZG_2: G2Point = G2Point { x0: u384 { limb0: 0x3b32078b7e231fec938883b0, limb1: 0xbc89b5b398b5974e9f594407, limb2: 0x118c4d5b837bcc2, limb3: 0x0, }, x1: u384 { limb0: 0x358e038b4efe30fac09383c1, limb1: 0xe7ff4e580791dee8ea51d87a, limb2: 0x260e01b251f6f1c7, limb3: 0x0, }, y0: u384 { limb0: 0x96e6cea2854a87d4dacc5e55, limb1: 0x56475b4214e5615e11e6dd3f, limb2: 0x22febda3c0c0632a, limb3: 0x0, }, y1: u384 { limb0: 0x41f99ba4ee413c80da6a5fe4, limb1: 0xd25156c1bb9a72859cf2a046, limb2: 0x4fc6369f7110fe3, limb3: 0x0, }, }; pub fn get_vk() -> HonkVk { HonkVk { vk_hash: 1655602901159187576028713697867454584902070339986579942408953720408510516376, log_circuit_size: 12, public_inputs_size: 17, qm: G1Point { x: u384 { limb0: 0x1a11b55dce82f38413640a64, limb1: 0x25c78e040da5a5cbe6f296ee, limb2: 0x142bd66bdb7a2bc1, limb3: 0x0, }, y: u384 { limb0: 0x3dc8a5d19d0bf85b0fa95ad4, limb1: 0xaa34836fe60428f70dee9285, limb2: 0xd1415082e63c88e, limb3: 0x0, }, }, qc: G1Point { x: u384 { limb0: 0xcd51216bd8c56683467cd704, limb1: 0x7c77ce4f20f0fd5a3a264861, limb2: 0x2deae537974aa569, limb3: 0x0, }, y: u384 { limb0: 0xa1179c7a8ed5c59a1015e784, limb1: 0x714496966bf5f4374fb6087b, limb2: 0x68627460599c3db, limb3: 0x0, }, }, ql: G1Point { x: u384 { limb0: 0x36d34df5c2aab80f85a218f2, limb1: 0x864a67847d46222c9aee090f, limb2: 0x6681df238df2a0f, limb3: 0x0, }, y: u384 { limb0: 0xbc5d11d2d55e4ac8adccae27, limb1: 0xb9c1b8da3c671ec025fe40ee, limb2: 0x18e37167fd19d013, limb3: 0x0, }, }, qr: G1Point { x: u384 { limb0: 0xfe3f9cf39c6f73896b06e821, limb1: 0x3dc4669f3d97f847e96e4bce, limb2: 0x177c7a07701c29d1, limb3: 0x0, }, y: u384 { limb0: 0x7c23cf6fe4a49a8e4f4c5aba, limb1: 0x38f1a638b192ffc9b995fd68, limb2: 0x2d31ea12ba12ee23, limb3: 0x0, }, }, qo: G1Point { x: u384 { limb0: 0xd8b0a3fb6597416a145754e3, limb1: 0xac68b01fa7f3faaa5a881854, limb2: 0x2d623ef9f6f62903, limb3: 0x0, }, y: u384 { limb0: 0x6059e6db24a7e1bfc51be2ac, limb1: 0x52b442fa3ce1643a24c7ac8e, limb2: 0x20b75671e0dd20da, limb3: 0x0, }, }, q4: G1Point { x: u384 { limb0: 0x528aeba6bdb01913c3236ff8, limb1: 0xe2edafe7a56dfd287d677b48, limb2: 0x7ea8dd8b4d3fd18, limb3: 0x0, }, y: u384 { limb0: 0x853ad38b76968342e932d84b, limb1: 0xe23f777f35827a35ea2716bc, limb2: 0x2826602478d64dc4, limb3: 0x0, }, }, qLookup: G1Point { x: u384 { limb0: 0x53f9b24d923d8f404cb0bbc9, limb1: 0x75a8449d3d5ce8bc3661650d, limb2: 0xc4032c3079594eb, limb3: 0x0, }, y: u384 { limb0: 0xa0ca89441369b7c24301f851, limb1: 0xf0158fd6da81f54eb5fe796, limb2: 0x1084d709650356d4, limb3: 0x0, }, }, qArith: G1Point { x: u384 { limb0: 0x1c518c7ea0b38257198a9523, limb1: 0xc2c72a3c00da41d4c7c7b6d0, limb2: 0x3057f9cfd5edb0e7, limb3: 0x0, }, y: u384 { limb0: 0xf647b842154c13fa145167b7, limb1: 0x6a98575cedc65ee5700a7148, limb2: 0x27eb0839ef4980d, limb3: 0x0, }, }, qDeltaRange: G1Point { x: u384 { limb0: 0xbefcd8cd631818993e143702, limb1: 0x3b9a8bc08ae2fdbd8e9dc005, limb2: 0x1775fbd3ba5e4316, limb3: 0x0, }, y: u384 { limb0: 0xbdde06678d3bce4455d2086f, limb1: 0x9e409fcb2e19a72238c07631, limb2: 0x1d8011ee756abfa1, limb3: 0x0, }, }, qElliptic: G1Point { x: u384 { limb0: 0x990b1eaa86226b3574e5c43f, limb1: 0x50fb0eae1d72783faba96bc3, limb2: 0x9c706e73a00d844, limb3: 0x0, }, y: u384 { limb0: 0x9b1f547ec36638d7b5a1ecd9, limb1: 0x68fcae74683a84de1084739f, limb2: 0x276d401f1c0f9a26, limb3: 0x0, }, }, qMemory: G1Point { x: u384 { limb0: 0xc20dedd7ff81c5677d3286ce, limb1: 0x276f3537c64334419e05b13f, limb2: 0x12b12523f7d04a83, limb3: 0x0, }, y: u384 { limb0: 0x4e602d1c13a77a2472f082da, limb1: 0x55a526829445f3fda95e243c, limb2: 0x2e741be4fe42cc11, limb3: 0x0, }, }, qNnf: G1Point { x: u384 { limb0: 0x5526834f93c6db848d56dcb0, limb1: 0xe4e8e364439d0abba02dc62a, limb2: 0x16a1350662e14b4c, limb3: 0x0, }, y: u384 { limb0: 0xb2e746ed0b6e85782c26040e, limb1: 0x9296d71489889503dda143f0, limb2: 0x563b1f480cad906, limb3: 0x0, }, }, qPoseidon2External: G1Point { x: u384 { limb0: 0xe4d88b5517e40b2a0133f401, limb1: 0x42f6c756379f231d5f472088, limb2: 0x20e1bb3056279dc3, limb3: 0x0, }, y: u384 { limb0: 0x2c8d1a5a6b3bd0ec93b42e77, limb1: 0x9eb4da763de77062d23ce01e, limb2: 0x23ee36ecb11b6278, limb3: 0x0, }, }, qPoseidon2Internal: G1Point { x: u384 { limb0: 0x19d18424d0e92f60a31671d9, limb1: 0xfdda50b3205d5aa4486b6325, limb2: 0xd1611c856951969, limb3: 0x0, }, y: u384 { limb0: 0x94aa3cadd7cd42e719521e0f, limb1: 0x30c0b534ea958de4c47e2f4c, limb2: 0xce97ee59d45d762, limb3: 0x0, }, }, s1: G1Point { x: u384 { limb0: 0x1b074244b7337b923c097eaf, limb1: 0xd2ae3eafb3800ee0eaf997cb, limb2: 0x154bdee4123a9946, limb3: 0x0, }, y: u384 { limb0: 0xf34e2352250dd3fb63d6d8c6, limb1: 0x3c0953803a3a34d916eefb5b, limb2: 0xd5f22b8ade2c19f, limb3: 0x0, }, }, s2: G1Point { x: u384 { limb0: 0x111168b4d7ab689558c334db, limb1: 0x7c62cc30718076db1836d9e1, limb2: 0x22d2dd0a34c3a1da, limb3: 0x0, }, y: u384 { limb0: 0x98a26842094b80c6e88321bf, limb1: 0x243059518c261a4137e7f6a6, limb2: 0x262c701396f0e3ae, limb3: 0x0, }, }, s3: G1Point { x: u384 { limb0: 0xe1213cb7ef934c944e4e8374, limb1: 0x84b08b441d010fc2976235c0, limb2: 0x172f8c6455a2bfe2, limb3: 0x0, }, y: u384 { limb0: 0x960773bd1e8b46a6a182239d, limb1: 0x640beab3f563e0a2402c116a, limb2: 0x178afa12bf161e7e, limb3: 0x0, }, }, s4: G1Point { x: u384 { limb0: 0xd14c60e677f8e1897f658057, limb1: 0x33204ad4109fa0fbb54c4fea, limb2: 0x21f45516c16fcb30, limb3: 0x0, }, y: u384 { limb0: 0x52efc7a0ee6a29e06296bb4d, limb1: 0xb82792c925627d7348f0bf11, limb2: 0xa7a5c9f897fd8da, limb3: 0x0, }, }, id1: G1Point { x: u384 { limb0: 0xaa69e812f125d20848fd1c50, limb1: 0x621962d025f0fbb42467ce5c, limb2: 0x1d1934c19b595461, limb3: 0x0, }, y: u384 { limb0: 0x8971dba72882ee742a0b57f4, limb1: 0xdf91438bfa5b19a7bad0f91d, limb2: 0x10e15c437db6ae7e, limb3: 0x0, }, }, id2: G1Point { x: u384 { limb0: 0x3a6957e0c9aa54ec21894a61, limb1: 0x320938baa053cd1f3dccb71, limb2: 0x146dc127b5450502, limb3: 0x0, }, y: u384 { limb0: 0xfd19216bf0829882cdabebe6, limb1: 0x828ba063530a81a329131fb4, limb2: 0x2d5cbdbf9edeff0d, limb3: 0x0, }, }, id3: G1Point { x: u384 { limb0: 0xbe73592b0b543997ac9ec27b, limb1: 0x600ed91fa96cd915db4ed7fd, limb2: 0x1e214a8b0ce35f8e, limb3: 0x0, }, y: u384 { limb0: 0x5eb2130b9c574c4e04e6e477, limb1: 0x7203e26ecee99e2307846f5a, limb2: 0x214375d66b2db2ba, limb3: 0x0, }, }, id4: G1Point { x: u384 { limb0: 0xc0ed29b2c26f8c8cbcbd82cf, limb1: 0x9b46a4cf0acba266c2a9b02, limb2: 0x2825f908ee9357e4, limb3: 0x0, }, y: u384 { limb0: 0xf0bd3cf808a6d1bcd0d63ba, limb1: 0x8100429b213b9140ed25274a, limb2: 0x264ef648e6714012, limb3: 0x0, }, }, t1: G1Point { x: u384 { limb0: 0xa63b05df652b0d10ef146d26, limb1: 0xfe18040105b9b395b5d8b7b4, limb2: 0x99e3bd5a0a00ab7, limb3: 0x0, }, y: u384 { limb0: 0x7f5a622a32440f860d1e2a7f, limb1: 0xccec99dcd194592129af3a63, limb2: 0x15b8d2515d76e2, limb3: 0x0, }, }, t2: G1Point { x: u384 { limb0: 0xdc25d1aa450e0b4bc212c37e, limb1: 0x8bc01c9595092a222b888108, limb2: 0x1b917517920bad3d, limb3: 0x0, }, y: u384 { limb0: 0xe42000a1d58ccb74381f6d19, limb1: 0x22e6e992077a84482141c7eb, limb2: 0x305e8992b148eedb, limb3: 0x0, }, }, t3: G1Point { x: u384 { limb0: 0x400b2bca37e2b1085e924a77, limb1: 0x3ada15236ba5cfa60111b440, limb2: 0x13567e3b915c8101, limb3: 0x0, }, y: u384 { limb0: 0x904b434e748f9713de8cc3d7, limb1: 0x8f4674af5744dedafd63caea, limb2: 0x148d22589b91f0d, limb3: 0x0, }, }, t4: G1Point { x: u384 { limb0: 0x6c840d9c943fdf45521c64ce, limb1: 0x7342af45d0155a28edd1a7e4, limb2: 0x43d063b130adfb3, limb3: 0x0, }, y: u384 { limb0: 0x4c573d1686d9cb4a00733854, limb1: 0x6aff96736194949330952ae7, limb2: 0x261522c408933064, limb3: 0x0, }, }, lagrange_first: G1Point { x: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, y: u384 { limb0: 0x2, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }, lagrange_last: G1Point { x: u384 { limb0: 0xc894b742744cf102a554d06f, limb1: 0x9ed4d186a2debd4bfe72be9b, limb2: 0x6a032e44c27b0ce, limb3: 0x0, }, y: u384 { limb0: 0x26660c8385d13a63d2078399, limb1: 0xad76960162ff0d8c34d25b61, limb2: 0x53396ef4f905183, limb3: 0x0, }, }, } } pub fn get_zk_proof_keccak() -> ZKHonkProof { ZKHonkProof { public_inputs: array![0x2].span(), pairing_point_object: array![ 0x42ab5d6d1986846cf, 0xb75c020998797da78, 0x5a107acb64952eca, 0x31e97a575e9d, 0xb5666547acf8bd5a4, 0xc410db10a01750aeb, 0xd722669117f9758a4, 0x178cbf4206471, 0xe91b8a11e7842c38, 0x7fd51009034b3357f, 0x9889939f81e9c7402, 0xf94656a2ca48, 0x6fb128b46c1ddb67f, 0x93fe27776f50224bd, 0x4a0c80c0da527a081, 0x1b52c2020d746, ] .span(), w1: G1Point256 { x: 0x1e34c173234bc959a7180a6bcc4400e875f693f8ba7aa39f084be9ffe2a7030e, y: 0x2b746f5a836e791d389755abda9fb5c9d749337fb05852bff6277a689620de9f, }, w2: G1Point256 { x: 0xfbd3eedde3a077f81b3f6e19e88da20865e0d96ac30dcea46367405b98e7ee8, y: 0x2d9de94695b5f22e2e76d7bbf3c9f2574f674330802f0ead9b527154f08708c8, }, w3: G1Point256 { x: 0x14a120ab523b85cb55ffddc33d5004ad91474cde957a6fdbaf145d18d45ed987, y: 0x1343a5fd555b6456db3af84e21a912c297379b278609d25591063bd444ce1697, }, w4: G1Point256 { x: 0xeba60f911766695f96f1cc1087203076722a4275781461c1cb8512937e9ca09, y: 0x2531eee848f996051e53e155e72d4e2e36d6a192cef36c46d92a9d9573f5c802, }, z_perm: G1Point256 { x: 0x2f4d259d57533bb5b04a62e10b3312b1d57c31a72daf5114e65fa1bacf2db0b4, y: 0x122fe61c0c3e49d24cdc6dcfe202787fbf2c12d8de5ec018c5e82491f0a58d26, }, lookup_read_counts: G1Point256 { x: 0x1c205828426756e2d6fe1a24e7d2a3f572b75a0b9ca18b0bf2098d68efdb4fd6, y: 0x13d3a102f9b15308b0233b512847b2ed03fe0b9f1eadb624596edda65af3ffae, }, lookup_read_tags: G1Point256 { x: 0x1af83bd052017a1caef1cb49f7493688e4b1d2291a8c81ee828b6d8cd5a3929c, y: 0xeb612b6d43562a5a959a8b335e0e8e699ccedd4331ac12ad01091ebc990b296, }, lookup_inverses: G1Point256 { x: 0x8dfe2b0529d66494e26f702f13284b1ec31bccde949e11bb9dcf2f9204b0f72, y: 0x1a17d9e42eeca241deb7880a1987676cbe1043c4b4e39cb8393753d2cbb3b752, }, libra_commitments: array![ G1Point256 { x: 0x170915817e4884ee05a88ce77c8a34875a1821758557e2a15e451c9b44e2bf77, y: 0x2687de64a3db7ce4da18126d442d00cc5a4ed4220812c29b54bd3e0a13dcb1bb, }, G1Point256 { x: 0x2be452b393768e61cfdfeccade5cdf0d1766bbf5e528b5aa1a393e49fa3e5ca9, y: 0x2852b988ed0d271109741f930ea0924fcd94eb67b505d4c88d47ba12d6cfe4e5, }, G1Point256 { x: 0xd22d803fc19a867752924eb0a1cabb3d416b43cadeace3a3ebc42b49ff1ad06, y: 0x27b8cd7a0a74924ed8c7d07ee75907cfade7005eb42492f8519c62020183be00, }, ] .span(), libra_sum: 0x90144f9a53cfc333c47451b4adcfe1c23478b5fedc99ded280b54409de73c26, sumcheck_univariates: array![ 0x3149d68db6edb589893c337f6fa124a4e1e21c4d04fa5de31b29889da3634ec, 0x16d5d9a40812efff9f08eb10fbdee1c124d1d7195922927816ce778691e08152, 0xe8a05f197b383bbcd4cfa0972e429fc5e35c2d18079035e4979223b3fa5a7fa, 0x24f6a24319cafae3b708e9148a9b28d1f26ae5091c97c3a7fbe95c6571aa270, 0x151107311f5801d6792bc44aea560e400de6c372dfa64eec2962b1d179ba59b, 0xab68b23d47720b06bf7f3a4fad1958f0b036c0cea11533eea85b6831d85a1fa, 0x26f4315868b55f723f1c2d036316ea5125f90ecf027262126a7385f4e296e2c, 0x1eeb97671be33f66bca8fb643ab214d82cd46ae5afbb60f8a786d164f1f80934, 0x24faae84d5ee43de3815a5be73d77e2a8600526f7fc2a76fddc7238089f322e7, 0x18a9cb845a1fb2d9625b2251b0953b02f156c09696c3602b5286f06a4205c89, 0x7e42892aefeaa5209c01c9e098de4e7f0858dda32bc95da8ec08ab8220e48d8, 0x1d3592e48b62d8743793a25cca0e51e716fc09d7fd8f7d1d537ecc204d167d1, 0x2997d5b42e40cab8d9b0f7909a6b5c5fab84ba180a0c5a91a3e0b12ebfad76f5, 0xa419cbd276cc548aea0f9c168bbfece44382fae6fcebe2659e285655129428a, 0x632e4f72070d900a143fb798907979956955681b98feb27169b71caca0825e5, 0x2b423792b6cc5bbbb86c7889ee1a9caaa505797f3c0cf0d083c3c732dad38289, 0x104a3c02a4c581859887647e5ea591a4cc9ae3ca3f6ea459ca06624a74a6a0ee, 0x231fdb9a35dd4a8c5a6d0fd65195ccef5291f4944c627677c24ad42f0150941e, 0xb305bdc9fddd22f488eaac6187dae6a0e115b5209f0cbab2600d08767f73d7e, 0x22c974bf215ae21071ec73d7b7edc30d12b37737a248881d48ba8aba75110760, 0x9b0a436158fb0f2a4888e55b672aaf161884d29b1c92fc566a4769fad1f1662, 0x28b84b03b50c5ab8dfd459531675fddac1e9fef6747b724d4aafadd7701ad0b3, 0xe12eed7ece4b17ed9aefa90c4f858550d1227af01f5093ea2e1194d01dd5c1b, 0x236fd96ffb804945c9705b3eeb39af98329b94ff1e7e1120f1461369e2c1f7a0, 0x1945bc69ae6755998f65deff579a24fd45721ac071144d902329d2811c7c7fd9, 0x6c58d2ee567254ab86864b4652423a1a938270c740ac0aaa48bc458ee290f15, 0x9eab94ff32c8d5e6592803954e3cbfb66e7f2b429bbbbfaeb84480dc31ba603, 0x25c025181fb1cb6ac8b54d80d73dd505abebb610e12c4086ce37ef02781d09a7, 0x10f6a28fb969623c13a8d03de2d64a46305a1b57a4aeea72b7bb13cb20eecd36, 0xfccac954245c3c67536ebafb134c6beaf8068d692d82edef7071f1eec1876f2, 0x13bf9c5b2bb484a95f0a9805abb41a5690e353315635b39c21fbd7f580270fc4, 0x1933fed4de4ca7ea196d299d5bb300ecf9edbd3d6dfbdb64a17658d20021a4d9, 0x265815656b600b952d2e1f1c7819ca82fca81e49888abae58687e8a16440d5e8, 0x2ea8b4c68b9f4319d41fadb8687f840a30ad87aaa8066e57e593004f3532e134, 0x27f0e547478d3dc127439447953643959ae08665ccb625067efaff37414a7333, 0x16091d3d50a304b2711e8ab203f5c75058ccc96ae7805786f284a8ae4dba022c, 0x20b017ce49f243ab96013aca53b99ed0ef64836ed7b7111e75c051c042b70b1d, 0x16c3c2093db68946aa8daf3b183dacc7cdc72ebf291eb8eff7eb90d30eb04edb, 0x1ec3ca15c7f742c257cedc604dd201202ce3248cd37b4005f433688199d56196, 0x17952c04233c59b0394e7f6cb5c613807fdb4c99f77c2a496faeefac3b0670c8, 0x2cbc304b746d10106d5ca386ff1f4e3cfc7e569c04e46ecd9d69f791f8aab6eb, 0x1c77bd01f0bd518100a1454b33bbbdf5e4e93d6cb428894cd6fcb3b022d1e8b4, 0x132e106c58142b5679e7006fd3c9bf8ce55ae3e53312b62a1e7a3e3a983f8c24, 0x24a0381969a5bb634111aa3e613bf0f7f57a2b1a08cd10855a6cd50539008d17, 0x22cacd970c627c6cd704c36c516c89566870a0f05a105b877b0581088e69b35f, 0x2afaf6bf152ebd048ee022eb3897a2e7820c4cb8f8466df4c40755a513e33d1d, 0x264f26a5e116d1b8167c6d90eeefbb52e7b40ee168a81ef21d0c21a275f36043, 0x294253bdea2bf3dcd61bd93732f536a5bc49b57f9bd225766fecbdbab43db963, 0x12d8c95ede7c15ddb6ecf9fe0e42baa67e689c3200aad123b59d1cbebc0af2e0, 0x104510383e6234abd06c3aeec9fb08854a82620a35e45247b6cd8de461b0259a, 0x7d219662f75b601dc2d55fd7da3fcd5a9a18f3858b6ae8a6b043d06a4ea9b44, 0xaa4013906a98a1341f5a816f03e9e163eaa64baa846718e56b55255ab82bbe, 0x28f931b264c9a2b1e951bb4344c1136d53c6e49d5f44ae07a93b24f300077006, 0x27b12d853426db59cc2dbcbcc4f4f65d97f36c42ce8d1b35618cc2406f6bcc2f, 0x121d138ad4faf57b387a0c6ceabbcf40d267ba1a57274779d30e82eebf33f499, 0x1f4e057d79b4f5067e639ac93daac5c15930ed56fc4668633eec1e0171fc1e1e, 0x301e110c5f4bb410002752fadb973462699f99eff2c522bb29fcc3d268838969, 0x179b4a790c726b98fdb4e8f3538205caea13c58b21fa5e4744b5f2b32117c6bb, 0xfcb8cf6b078413f39e5d03c9a0764144cf69674cf3e8f947adac1867ef5dd25, 0x2405407e10a6d25bfc82bd8296581caf938d28ebcbd24b0203b5d24a56a046ac, 0x2b50b38db9a82cc14d258e8a3d7447e56ae8525ec296898c97ee2ff8d6c829d7, 0x27d6d4a65a494950fd8ee286c4de6d1918e30901f81185d0280a83c925546597, 0x66a2b7ccc890a7b28d360e935e3cc649b2ebd93c65e7971993e5d4f8419a88d, 0x577eb50c286a240c191897c73621c9a7a5a7eb061fa395d790e38bb3bf0ffa0, 0x843ed2873262d670315de6d882611c31934d04f25e7e275ec73cc0322da3204, 0x2a9064d23951b7392a196dfb9c89e66c824275ccba1ebdd070f95d1729b06293, 0x218eb8c4a137172fe1ced0281376d26148cc83b728964e04aec9d3c9bc2ca0e5, 0xb28012720a35d1fde5fc838f56b97e14e831b280dc9d3c5d2cd90f662acb50a, 0xa0c9e4e4ae3e002615dd5c69f2165acf31c64d5327df16d46d4f74eac718265, 0xce7ff6c1981b21a195472b06ce7d22335b13bf12e76e3070ac90adb7fd95616, 0x16a5335bdf6596ac1351dc015c1316098ce91c57d5b5ea50c949fd652bfc815f, 0xfe114dc57f1a2f4bae55b57b366d0b499f956da79b1b6736df7fb9dcc4547ca, 0x147892a2bba985b7a415c2c108bb60a413581331c4aa3df48abe41bec92bffb7, 0x13ecd1b079e18b2a84cc1f92af470baf348518ec044dc4fe416336bcca53b38a, 0x1569b0c81db8022270d0af9cafbe881173d952ddf37c07ec2a766b6c578f37d7, 0x10db7d41f627623b905f28baed9ae528272d131e9c899885037f7fcd8083b177, 0x24c3021fb55a11c5833d4141c529a2166afa1d94208dad69f9ac2a19516ed28f, 0x2e7d5fc72956e9825f0f14fb3c0fd27ffbf6de4b248773759f39a30956270c1a, 0x2c7a64b108fe865fb1ee22323c3cab2b2d949b80d24642d131b4ff4643a9b9c9, 0x2b3c851da00e8c3b44422c1522fe5cf884a786626c34c6e4426a35ec221ce0b7, 0x165853d1ecaad0c5aea08d3ddc6511d174697f594afeca57a1ce8f6fda021c14, 0x10931a4f5f8e17c9233ae0b7f675ace7d056c244f376958041579b9bf897652d, 0x684e5cd9e7d09d905e11e660b811d2afc1e8a248f822cceb80d085e15d37c1f, 0x1cfbc7620177d24eab2b2c3184e70d04eb289f87a0d9c141d4d820f7a2eb87c0, 0x2471650400ec3bb9ae965ea280132cdd6db6305b1e7503648a42badf4b831bda, 0x106f62d6823cae740320e3efa8928f916bf79cebccfd9f6e8c19213d1403df05, 0x8c796662cf9ee1ad01ff917be730cbfde624286c76c54a2edc6d202c2b407c8, 0x146c0f4c6464f9fb5b15300f2e69c9b08624734c2f68cea603580fd08715822, 0x1e519b10d4404fa71f34885ffe96929ba174696f1f683c21d1f97cb04bd4d22b, 0x1db5c6b7ffa992613926b14dc9e2d38ccaf540b28989b454b9ba6e827921619c, 0x221294410242d3af8f43fb85acaef03ef5f25f9d04334fd7e293355f85d512bd, 0x1943b5ae1d9f077ab778c538e49a62e7d4d28b597446b560d16e72da8072bb3d, 0x4a9f7d95827a54eee2c8242d174c95ddc3f9d8d69507de49ca41adea8261d19, 0xa1810218a2aa24b3aced9a70886da5bf931e5482a7eebc805330e435a0285ad, 0x21c33cbe7a21ba6b7abfe15937c1b295bc12afbf582512bdc8bbf5655164c494, 0x2ca72a8a3499bfe2d0eb23e7bfe3244f9125ef19f3353bdecb99957b351bdf23, 0x236c92d20e92a0670678bd93b9a8d2ce5cd777407337dba37afcde2c73b296e8, 0x112ae8a0c5764d4c0de96f7001857726904dab3b66324a96b9272a18185a7761, 0x294dc118f95f01a6a77d01341801a12ea3ca8135eea4c593d0e3ab020b17eb3f, 0x2d9a0c73e31475e0b545e497b562a3c51340e0a9578ce78019a07f2ea8780d71, 0x16538f95bff012672df3fa422dcebc32600ae0cf100b72bbf0e5f36ca55c079c, 0x2c141dc8ef9c6ee31c17a04af6ba16b3489956dfd601437312be4571f909a5b, 0x231ba01c0cea4e1634851d2195e5bdff65ca184b39812e03be83aa269ba4c094, 0x2891195c085604acfdf93ef63e535eced06d41bc8058c31c6e7ab680de727540, 0x2cb5ccf9dc7fba5b62f47e20f1dc78bbac5741016e67df2678dac62da61c9ce6, 0xd9c684b8b528dea680d100518355c92c9707aae4bbcdcc221c9b947864cfdba, 0x18957cdde94d31a2b9961d680b45158e0522d6eaa79daff030d123f0fe463b2e, 0x24df9e3fbd718e06157a9de498e0d97becc7ed30174041a90de1cec78cc74fe9, ] .span(), sumcheck_evaluations: array![ 0xda1f5a72d1ec76cda05874ef901ba28ce501879ad38eaf3f9b6361df206a973, 0x1ed85d53329e768dd416a57420e6d9cb5932c1882cf4a63394634de89452176a, 0x1d04ffeaff81057edef1460352e01891da17828af736f9f25d7e6c0f1ff07596, 0x2c9c0a7f812b743a24af92cb933ef6fe0e57872bafe7bcf09edb1ad91a80880b, 0x24d368974add765b0465b03cd25e8fa707aa07ac132275bd8f152648626eff34, 0x196bc2a2c56b57e59f6a5e9f8776e01d0576858ce4790b584e478242f29e2bff, 0x159fb5b8f9d76812eeab102d5881cedaeeb0b57e98e6b4b8466916e3b268aa9c, 0x17208caf6206925146bbaf5ba306efd47fa53dbc3d33696a9b33194db83e585e, 0x61d45cf35212d7214c22ff7ff9e6ef520b6773d493640fb2988550f972c8802, 0x7b91f492b587fade1b237adfeefe507fc76bcbf5a4faafc76ecf7b0346b88b5, 0x1dbe57d9bbe4f32165b4e6264ae69058d3143fbb6d01bfa839de3cd003a246a6, 0x1612ca4aa2cf172583d2cd1c3a67221abecb16d91d9c4fb067b784d4fdb4c112, 0x2266a0bca10cd57eba99438f820e8a0a91f7095831a474510110ce030d68bfbf, 0x28a2fb53bc4d65fbd7902353d352fc3ff9f10baf0f565221ba3ccf3a02596e40, 0x1a7eb155f45e7585bd3f000ff98c57a44f23df666585dbd04d3f881a8d5c841c, 0x1878c1e0ea64fa025d989d85081ddb3c0b3caf1b83f950bdb746cb052f7516a0, 0x276dd76fb0ca6fe37e4aa87d9107abd1d499af57e6bb587dfff5fd61969f7b6e, 0x1308a2d137e657fcacc9368b5c4dc672ee358f9878dece5aff25994b9797ae9a, 0x1f030b8b61847b35361104ae7ed473b72f57126323d35ca00189b532c7a2976, 0x2be3abfd1d75a1c0c1c121f602ee6c51c098474b2541c8758cb98bcc1350413c, 0x1bb5b1028805b0c1a875939537de220777403b1ef8787b361872cf715cd2c3e9, 0x1abafb4da41750fdfbea04d59ec64bb90fb4451b0b24e30035ec08fe832babb2, 0x1e9682feb5c4594b7acfe9fa6c8bad335e3c91d215c68034e3b46f11f9f2c61f, 0x2658a073798adbbce5691192977b2316626731acd49565ee30953275f96d0f8d, 0x25c0a364baa8f10aea8f4295f44e30817662f6c2e446dd71941fcfe377a2500b, 0x185ebc437928bcdbb426d9612d876c0b3aa89b5c8987014fdd040e0de6357039, 0x832fd6a95e9d33d53d1867f40fe6f5eb2c742c89ffe534ab5fa4b9f28e45192, 0x15bba137e6114ef194c6dd0c4a294047720a52ba05bfb3232113fb9c03a2740b, 0x20c8d9a09290bf43a0346153491f693ca3af127d9842fe196310bf5e3863a41b, 0x2996bbc4aac149f9e1176c8a10e731642acd43ee45b4f39eea30502e7c7b23cf, 0x1678d7bdb6529a27bd8bcd78df9237ce30bc8b161c9a03220b27d777694ea3c5, 0x26e6234272e92ff6eff8e8391567528de1e1c82f66628aa2679343319fedbdab, 0x56d249e93995c56591338bec2af3b770ed0ab09cf9b15c30245268c7c08316d, 0x5db0360469781fab0e6e0adc65adf68490b2b4d46bc43a584694e8eaf56f65c, 0x2d98fef4d951abf9a4724f5f960a6813fcd1b5bb0e5bcd390a8d5b457fc89c14, 0x291453c614c83070310f7eee9103d15858371cf28460788799ba673c94eeeae3, 0x9051b6d85fea1b22e85cc849c153074c399f81a241abea2121972ccac321fda, 0xc6a75a540dcb928e18bf7b90d1243a7ffe96db6cdf90cdb4698ff4ada76a6e3, 0x2ad59d311c014d11a8b906f3696fc86193cc6d228f568b45b06a7ffff25675ce, 0x158b238a3c1c894a9c7ab11bedfe7564af3d5fd8c15c8d208c1f347ff2a33ca0, 0x703886f358e78a25a832d65cc8fbe5367da5082435cd734f0e796576637d2a1, ] .span(), libra_evaluation: 0x1132ace165bbb656b51a3e2cc2afd3233ec2bec2784a63214acb8615929266e3, gemini_masking_poly: G1Point256 { x: 0x26014e34fea9af7f7811011ecbde8ebfd88e0756b5a07ddaf6282295fe8b5d2b, y: 0x1f82c2e2c6d56563ffcaf90b0164fed63750d10f0f62e0d436090346b51281da, }, gemini_masking_eval: 0x1c9d49995b00c7ac2b1bd1c5d3c4cc9e3f7e06e37b66a4ed37fcbc212c6b21a2, gemini_fold_comms: array![ G1Point256 { x: 0x2918d3bea258d9e87d3c1864cc4b51e2a660f22b6835bea39099e8d28b644d49, y: 0x1c04a1962be87e2cca7683eeeb89df859b71be6e49bb9addbf6020e1b80af882, }, G1Point256 { x: 0xad8457e1af0a0b9c009c589dc2aa7c6ca8184e5ab3b8547eb924c051969d87c, y: 0x1e8136880bc80710c9746ca9ab32e1355814e73bdf996fbb95161a43212c0476, }, G1Point256 { x: 0x8dcff84c035e66e9fea2edd57edc0299678373ccfb62264b3f9fb0fa5d85b3b, y: 0x299f4b10d489ce2001d7f05a1a98f120d2088abdb1f1cf6f668aae0519362cce, }, G1Point256 { x: 0x21a02af46e8a9449d16f1359f2c0e44484388d70e838c07b826182d4386bf875, y: 0x1489e07ff0ea2d7ed52a64476b9365ceac3268fa3cf4a008243d92c2fa1aa500, }, G1Point256 { x: 0x2fe2ca7bc51f9426d7ac008e8d18f0779f132c5f7b14f8a7070cff82951bfffe, y: 0x21ebd772c6ce32090a524a1fe16b88e1b5acb76a9f553133c15ca0a529eb71d9, }, G1Point256 { x: 0x483d5e7e02ffadc40e03af829fab2d1ec4c3ec2273865ced6f8c9bec0db89a9, y: 0x24cee8d6fd9d9cd11a136c01b160e8ebc63e78fdf2b6bafc0a11ceaf0c7a082a, }, G1Point256 { x: 0x1a3ec43fbb203ca00bf3d5206c7399ed48027170e5b4704ac969ce730e5d974b, y: 0x21f38a577ade9fd8bbcf3510a97c358b0c660216e4a83c368406cca6b2fd2799, }, G1Point256 { x: 0x1466ac7fe3cec7cfc27e88415660f632b6a5651f45818a033afc3dd4066f23f1, y: 0xecd64b04c089455277f46b3a946046f1445674cbcb2c537bba2498f34efd7f2, }, G1Point256 { x: 0x1dccac0dff547f871103577bd87509dfa0103188faadeddca36dea513dcccd6f, y: 0x8f41998df00acf151dcea7d61f38dcb0f12ba94eba520755684230e1dc43e79, }, G1Point256 { x: 0x2201ff1c5b0bc9d9304c8fcb5ceaab7389aaaa639fccc15c99757ae33d0a0bab, y: 0xe817c9e51dca78ff6d0d9390884deac07919706599688a3663e45761c185287, }, G1Point256 { x: 0x1b44c9747e5e2e9a8084ff374bedc82ee9c02079cd7017a7f3de5fe6735d9a87, y: 0x23a08eadc1723f6c47ae0da29880b3122be4d80c1c161955be55a7de1ef634b4, }, ] .span(), gemini_a_evaluations: array![ 0x26a6901a61216f8b4252c1d327711877a6078f277643443896f1f832c6da1f66, 0x1bbacd086d6b20ace675bf297a3fcfc6865e986c78ae9171d774d22d1242cbb1, 0x27a5d919bb1cecac67cc4bd6b260a04e33a91283e4b9cf071399e8249743876a, 0x2bce80ffb28871803bb5cf5dbfa65b9256e0dea0dd9449104ba26ab8db5c7bbb, 0x252d45f8db3a296d722dc7df3d9e640b1ee375d598bbf51cd5584ed52e67ae62, 0x12e77f2aaf87ba208a822b98f2e02a7928236fcbdc413b9bad32d2bc7bee9c52, 0x8c56bc9d6093c8a56d94d7987331aa6cb17008b9460f76785ed2d57ef600d70, 0x2cad2a1c5329e115d078e74b264e937adaf4e0eb1ed682424789b6ee340387c1, 0x522e03828a6195d3279fffb5b805666a69a582c5c90b17c2a719f790f443483, 0x247d32c70f1aadddd49ed465539f1e544b1c9dd7478b4077adf8cae1bae7dad7, 0x1e69b320445a0e22ccfbbdb54eee09bf9bd5b293b8d7d727fe8c8e7064b7768d, 0x2b592160911cb387fd83294230672bc528a6c25d9b3fb99417c74f7de7f197c2, ] .span(), libra_poly_evals: array![ 0x41fd901c2fda436051e8923e20fcc27afb24a65d70eb00473f172e9f7f9776, 0xd794e3a56c5c5fb5f5a48ef6f17f1956ef8197b7bfe838e685acae0efcb8d90, 0x2f4b4a38d4ecc05f39865b2b05731bde72a9c7b36e3f9cb6486f3653806a56ef, 0x131bcf56f4b07e163b777029ef66826bfcdad7f1fd2c881d8e06f2d9b98148fc, ] .span(), shplonk_q: G1Point256 { x: 0xc1728e9f86fb53fe3befee017177d6a30a27feb87dfa78846a7fd510618d3b5, y: 0x67583f1cd028a2b317f924ead8e3a00884dfc6966442521972479b22d7d82d5, }, kzg_quotient: G1Point256 { x: 0x145edb11f0b06a0cccd6233a0f9659439b7c0cf388f18aad29cbe3eb5ae61eb7, y: 0x1912b95a1b1811be10bd6149227d5c11d47c78b76ded7a17e4c77bd1f9b9a841, }, } } // #[cfg(test)] // mod tests { // use super::{ // HonkProof, HonkVk, G1Point256, G1PointProof, get_proof, // remove_unused_variables_sumcheck_evaluations, U64IntoU384 // }; // use core::num::traits::{Zero, One}; // use core::circuit::u384; // use garaga::apps::noir::keccak_transcript::{HonkTranscriptTrait}; // use garaga::circuits::honk_circuits::{ // run_GRUMPKIN_HONK_SUMCHECK_SIZE_5_PUB_1_circuit, // run_GRUMPKIN_HONK_PREPARE_MSM_SCALARS_SIZE_5_circuit, // }; // #[test] // fn test_sumcheck() { // let proof = get_proof(); // let (transcript, base_rlc) = HonkTranscriptTrait::from_proof(proof); // let log_n = 5; // let (check_rlc, check) = run_GRUMPKIN_HONK_SUMCHECK_SIZE_5_PUB_1_circuit( // p_public_inputs: proof.public_inputs, // p_public_inputs_offset: proof.public_inputs_offset.into(), // sumcheck_univariate_0: (*proof.sumcheck_univariates.at(0)), // sumcheck_univariate_1: (*proof.sumcheck_univariates.at(1)), // sumcheck_univariate_2: (*proof.sumcheck_univariates.at(2)), // sumcheck_univariate_3: (*proof.sumcheck_univariates.at(3)), // sumcheck_univariate_4: (*proof.sumcheck_univariates.at(4)), // sumcheck_evaluations: remove_unused_variables_sumcheck_evaluations( // proof.sumcheck_evaluations // ), // tp_sum_check_u_challenges: transcript.sum_check_u_challenges.span().slice(0, log_n), // tp_gate_challenges: transcript.gate_challenges.span().slice(0, log_n), // tp_eta_1: transcript.eta.into(), // tp_eta_2: transcript.eta_two.into(), // tp_eta_3: transcript.eta_three.into(), // tp_beta: transcript.beta.into(), // tp_gamma: transcript.gamma.into(), // tp_base_rlc: base_rlc.into(), // tp_alphas: transcript.alphas.span(), // ); // assert(check_rlc.is_zero(), 'check_rlc should be zero'); // assert(check.is_zero(), 'check should be zero'); // } // } ================================================ FILE: src/src/apps/risc0.cairo ================================================ use core::integer; use core::sha256::{compute_sha256_byte_array, compute_sha256_u32_array}; use garaga::pairing_check::MPCheckHintBN254; use garaga::utils::calldata::{ Groth16ProofRaw, _deserialize_groth16_proof_points, _deserialize_mpcheck_hint_bn254, }; use garaga::utils::usize_assert_eq; #[derive(Drop)] pub struct FullProofWithHintsRisc0 { pub groth16_proof: Groth16ProofRaw, pub image_id: Span, pub journal: Span, pub mpcheck_hint: MPCheckHintBN254, pub msm_hint: Span, } // sha256(b"risc0.ReceiptClaim") = // 0xcb1fefcd1f2d9a64975cbbbf6e161e2914434b0cbb9960b84df5d717e86b48af const TAG_DIGEST: [u32; 8] = [ 0xcb1fefcd, 0x1f2d9a64, 0x975cbbbf, 0x6e161e29, 0x14434b0c, 0xbb9960b8, 0x4df5d717, 0xe86b48af, ]; // 0xA3ACC27117418996340B84E5A90F3EF4C49D22C79E44AAD822EC9C313E1EB8E2 // https://github.com/risc0/risc0-ethereum/blob/34d2fee4ca6b5fb354a8a1a00c43f8945097bfe5/contracts/src/IRiscZeroVerifier.sol#L60 const SYSTEM_STATE_ZERO_DIGEST: [u32; 8] = [ 0xa3acc271, 0x17418996, 0x340b84e5, 0xa90f3ef4, 0xc49d22c7, 0x9e44aad8, 0x22ec9c31, 0x3e1eb8e2, ]; const INPUT_ZERO: [u32; 8] = [0, 0, 0, 0, 0, 0, 0, 0]; // sha256(b"risc0.Output") = // 0x77eafeb366a78b47747de0d7bb176284085ff5564887009a5be63da32d3559d4 const RISC0_OUTPUT_TAG: [u32; 8] = [ 0x77eafeb3, 0x66a78b47, 0x747de0d7, 0xbb176284, 0x85ff556, 0x4887009a, 0x5be63da3, 0x2d3559d4, ]; fn uint256_byte_reverse(x: u256) -> u256 { let new_low = integer::u128_byte_reverse(x.high); let new_high = integer::u128_byte_reverse(x.low); return u256 { low: new_low, high: new_high }; } pub fn journal_sha256(journal: Span) -> Span { let journal_arr: Array = journal.into(); let mut journal_byte_arr = ""; for byte in journal_arr { journal_byte_arr.append_byte(byte); } let journal_digest = compute_sha256_byte_array(@journal_byte_arr); return journal_digest.span(); } // https://github.com/risc0/risc0-ethereum/blob/34d2fee4ca6b5fb354a8a1a00c43f8945097bfe5/contracts/src/IRiscZeroVerifier.sol#L71-L98 pub fn compute_receipt_claim(image_id: Span, journal_digest: Span) -> u256 { usize_assert_eq(image_id.len(), 8); let mut array = array![]; // Tag digest for v in TAG_DIGEST.span() { array.append(*v); } // Input for v in INPUT_ZERO.span() { array.append(*v); } // Pre state digest for v in image_id { array.append(*v); } // Post state digest for v in SYSTEM_STATE_ZERO_DIGEST.span() { array.append(*v); } // Output let output_digest = output_digest(journal_digest); for v in output_digest.span() { array.append(*v); } // Exit_code system (0) (4 bytes) + Exit Code User (0) (4 bytes) array.append(0); array.append(0); // Append 4 << 8 = 1024 to the end of the array (2 bytes) let res_u32 = compute_sha256_u32_array( input: array, last_input_word: 1024, last_input_num_bytes: 2, ) .span(); let res_low: felt252 = (*res_u32[7]).into() + (*res_u32[6]).into() * 0x100000000 + (*res_u32[5]).into() * 0x10000000000000000 + (*res_u32[4]).into() * 0x1000000000000000000000000; let res_high: felt252 = (*res_u32[3]).into() + (*res_u32[2]).into() * 0x100000000 + (*res_u32[1]).into() * 0x10000000000000000 + (*res_u32[0]).into() * 0x1000000000000000000000000; return uint256_byte_reverse( u256 { low: res_low.try_into().unwrap(), high: res_high.try_into().unwrap() }, ); } fn output_digest(journal_digest: Span) -> [u32; 8] { let mut array = array![]; usize_assert_eq(journal_digest.len(), 8); for v in RISC0_OUTPUT_TAG.span() { array.append(*v); } for v in journal_digest { array.append(*v); } // Assumptions digest for v in INPUT_ZERO.span() { array.append(*v); } // Add 2 << 8 = 512 to the end of the array (2 bytes) compute_sha256_u32_array(input: array, last_input_word: 512, last_input_num_bytes: 2) } pub fn deserialize_full_proof_with_hints_risc0( mut serialized: Span, ) -> FullProofWithHintsRisc0 { let groth16_proof_raw = _deserialize_groth16_proof_points(ref serialized); let n_image_id: u32 = (*serialized.pop_front().unwrap()).try_into().unwrap(); let mut image_id: Array = array![]; for _ in 0..n_image_id { image_id.append((*serialized.pop_front().unwrap()).try_into().unwrap()); } let n_journal: u32 = (*serialized.pop_front().unwrap()).try_into().unwrap(); let mut journal: Array = array![]; for _ in 0..n_journal { journal.append((*serialized.pop_front().unwrap()).try_into().unwrap()); } let mpcheck_hint = _deserialize_mpcheck_hint_bn254(ref serialized); let msm_hint = serialized; return FullProofWithHintsRisc0 { groth16_proof: groth16_proof_raw, image_id: image_id.span(), journal: journal.span(), mpcheck_hint: mpcheck_hint, msm_hint: msm_hint, }; } #[cfg(test)] mod risc0_utils_tests { use super::{compute_receipt_claim, output_digest, uint256_byte_reverse}; #[test] fn test_receipt_claim() { let image_id: [u32; 8] = [ 3491501487, 2808651867, 557489759, 3452720932, 2727640576, 160202435, 1288430228, 1807482899, ]; let journal_digest: [u32; 8] = [ 998783442, 2641348904, 1804572153, 3329687312, 3249394632, 3219372246, 356247808, 552440254, ]; let receipt_claim = compute_receipt_claim(image_id.span(), journal_digest.span()); assert_eq!( receipt_claim, uint256_byte_reverse( 0xe58e40abecebcfa4af85692fca5ed77d4ccb4b3f640f5e684e4faf3a36b0c4e0, ), ); } #[test] fn test_output_digest() { let journal_digest: [u32; 8] = [ 998783442, 2641348904, 1804572153, 3329687312, 3249394632, 3219372246, 356247808, 552440254, ]; let out = output_digest(journal_digest.span()); assert_eq!( out, [ 0x6293f84a, 0xf9e28fcc, 0x43eb4d3d, 0xf962d8d8, 0x1364db76, 0x22a407a1, 0xab5be010, 0x1a1f0a26, ], ); } } ================================================ FILE: src/src/apps/sp1.cairo ================================================ use core::sha256::compute_sha256_u32_array; use corelib_imports::bounded_int::{AddHelper, BoundedInt, MulHelper, UnitInt, bounded_int, upcast}; use garaga::ec::pairing::groth16::{Groth16Proof, verify_groth16_bn254}; use garaga::pairing_check::MPCheckHintBN254; use garaga::utils::calldata::{ Groth16ProofRaw, _deserialize_groth16_proof_points, _deserialize_mpcheck_hint_bn254, }; use super::sp1_constants::{ic, precomputed_lines, vk}; #[derive(Drop)] pub struct FullProofWithHintsSP1 { pub groth16_proof: Groth16ProofRaw, pub vkey: u256, pub public_inputs_sp1: Array, pub mpcheck_hint: MPCheckHintBN254, pub msm_hint: Span, } const POW_32: felt252 = 0x100000000; const POW_64: felt252 = 0x10000000000000000; const POW_96: felt252 = 0x1000000000000000000000000; const POW_32_UI: UnitInt = 0x100000000; const POW_64_UI: UnitInt = 0x10000000000000000; const POW_96_UI: UnitInt = 0x1000000000000000000000000; const POW_128: felt252 = 0x100000000000000000000000000000000; pub type u32_bi = BoundedInt<0, { POW_32 - 1 }>; pub type u64_bi = BoundedInt<0, { POW_64 - 1 }>; pub type u96_bi = BoundedInt<0, { POW_96 - 1 }>; pub type u128_bi = BoundedInt<0, { POW_128 - 1 }>; pub type w1_shift_32 = BoundedInt<0, { 0xffffffff00000000 }>; // (2**32)-1 * 2**32 pub type w2_shift_64 = BoundedInt<0, { 0xffffffff0000000000000000 }>; // (2**32)-1 * 2**64 pub type w3_shift_96 = BoundedInt<0, { 0xffffffff000000000000000000000000 }>; // (2**32)-1 * 2**96 impl MulHelperU32ByPow32Impl of MulHelper> { type Result = w1_shift_32; } impl MulHelperU32ByPow64Impl of MulHelper> { type Result = w2_shift_64; } impl MulHelperU32ByPow96Impl of MulHelper> { type Result = w3_shift_96; } impl AddHelperU32ByW1Impl of AddHelper { type Result = u64_bi; } impl AddHelperU64ByW2Impl of AddHelper { type Result = u96_bi; } impl AddHelperU96ByW3Impl of AddHelper { type Result = u128_bi; } pub fn convert_u32_to_u128(input: [u32; 4]) -> u128 { let [w3, w2, w1, w0] = input; let w3_bi: u32_bi = upcast(w3); let w2_bi: u32_bi = upcast(w2); let w1_bi: u32_bi = upcast(w1); let w0_bi: u32_bi = upcast(w0); let tmp: u64_bi = bounded_int::add(w0_bi, bounded_int::mul(w1_bi, POW_32_UI)); let tmp: u96_bi = bounded_int::add(tmp, bounded_int::mul(w2_bi, POW_64_UI)); let result: u128_bi = bounded_int::add(tmp, bounded_int::mul(w3_bi, POW_96_UI)); return upcast(result); } // 2**253 const POW_253: u256 = 0x2000000000000000000000000000000000000000000000000000000000000000; pub fn process_public_inputs_sp1(public_inputs: Array) -> (Span, u256) { let mut pi = public_inputs.span(); let mut pub_inputs_256: Array = array![]; assert(public_inputs.len() % 8 == 0, 'wrong sp1 pub inputs size'); while let Option::Some(word) = pi.multi_pop_front::<8>() { let [w7, w6, w5, w4, w3, w2, w1, w0] = (*word).unbox(); let high_128 = convert_u32_to_u128([w7, w6, w5, w4]); let low_128 = convert_u32_to_u128([w3, w2, w1, w0]); pub_inputs_256.append(u256 { low: low_128, high: high_128 }); } let [h7, h6, h5, h4, h3, h2, h1, h0] = compute_sha256_u32_array( input: public_inputs, last_input_word: 0, last_input_num_bytes: 0, ); let hash_raw = u256 { low: convert_u32_to_u128([h3, h2, h1, h0]), high: convert_u32_to_u128([h7, h6, h5, h4]), }; let hash_mod = hash_raw % POW_253; return (pub_inputs_256.span(), hash_mod); } pub fn deserialize_full_proof_with_hints_sp1( mut serialized: Span, ) -> FullProofWithHintsSP1 { let groth16_proof_raw = _deserialize_groth16_proof_points(ref serialized); let vkey = u256 { low: (*serialized.pop_front().unwrap()).try_into().unwrap(), high: (*serialized.pop_front().unwrap()).try_into().unwrap(), }; let n_words: u32 = (*serialized.pop_front().unwrap()).try_into().unwrap(); let mut public_inputs_sp1: Array = array![]; for _ in 0..n_words { let [w7, w6, w5, w4, w3, w2, w1, w0] = (*serialized.multi_pop_front::<8>().unwrap()) .unbox(); public_inputs_sp1.append(w7.try_into().unwrap()); public_inputs_sp1.append(w6.try_into().unwrap()); public_inputs_sp1.append(w5.try_into().unwrap()); public_inputs_sp1.append(w4.try_into().unwrap()); public_inputs_sp1.append(w3.try_into().unwrap()); public_inputs_sp1.append(w2.try_into().unwrap()); public_inputs_sp1.append(w1.try_into().unwrap()); public_inputs_sp1.append(w0.try_into().unwrap()); } let mpcheck_hint = _deserialize_mpcheck_hint_bn254(ref serialized); let msm_hint = serialized; return FullProofWithHintsSP1 { groth16_proof: groth16_proof_raw, vkey: vkey, public_inputs_sp1: public_inputs_sp1, mpcheck_hint: mpcheck_hint, msm_hint: msm_hint, }; } pub fn verify_groth16_sp1(proof: FullProofWithHintsSP1) -> Result, felt252> { let groth16_proof_raw = proof.groth16_proof; let vkey = proof.vkey; let public_inputs_sp1 = proof.public_inputs_sp1; let mpcheck_hint = proof.mpcheck_hint; let mut msm_hint = proof.msm_hint; let _ = msm_hint.pop_front().unwrap(); let (_pub_inputs_256, pub_input_hash): (Span, u256) = process_public_inputs_sp1( public_inputs_sp1, ); let proof_pub_input = array![vkey, pub_input_hash]; let proof = Groth16Proof { raw: groth16_proof_raw, public_inputs: proof_pub_input.span() }; let result = verify_groth16_bn254( vk, precomputed_lines.span(), ic.span(), proof, msm_hint, mpcheck_hint, ); match result { Result::Ok(_) => Result::Ok(proof.public_inputs), Result::Err(error) => Result::Err(error), } } #[cfg(test)] mod tests { use super::convert_u32_to_u128; #[test] fn test_convert_u32_to_u128() { let input = [0, 0, 0, 1]; let result = convert_u32_to_u128(input); assert_eq!(result, 1); } } ================================================ FILE: src/src/apps/sp1_constants.cairo ================================================ // Generated by Garaga version 1.1.0 use garaga::definitions::{E12D, G1Point, G2Line, G2Point, u288, u384}; use garaga::groth16::Groth16VerifyingKey; pub const N_PUBLIC_INPUTS: usize = 2; pub const vk: Groth16VerifyingKey = Groth16VerifyingKey { alpha_beta_miller_loop_result: E12D { w0: u288 { limb0: 0x38febe9f87f730fa3e5bd174, limb1: 0xf763950637a776ef9e248435, limb2: 0x29dc2d37c63acbda, }, w1: u288 { limb0: 0xa31610a97aa4e4539be919ff, limb1: 0xfa4d4bfb72b6a3c002018e97, limb2: 0x1968ab971e610fce, }, w2: u288 { limb0: 0xee6c1ce3a15313c6f9d57f7e, limb1: 0xd37e28396640fcfe5f122aae, limb2: 0x210d3763f7a27517, }, w3: u288 { limb0: 0x7746ddac185562e756b1b92f, limb1: 0x44f8b75638ef5a373f319cd8, limb2: 0x51e9605db4edac6, }, w4: u288 { limb0: 0xc29e0c2ac434301d671ffa56, limb1: 0xa06f1db2d4ca4dd88f979102, limb2: 0x1d0126fb7d721e02, }, w5: u288 { limb0: 0xed2e022e10acbeb35084dc1, limb1: 0xf9de514baee870f114669060, limb2: 0x10889a0f300ce96c, }, w6: u288 { limb0: 0xeec23aadde92d2dd00e4568e, limb1: 0x6d5b4b63667db8f10bd851ab, limb2: 0x18f1dd15d2e64c69, }, w7: u288 { limb0: 0x2131bad24ea07a033d0bf397, limb1: 0xb6312a7f2622146be93b5950, limb2: 0x227e61ca055f0ac3, }, w8: u288 { limb0: 0xb896f30b06350f012274ebcd, limb1: 0xd14298f13a76183170aafe08, limb2: 0x302bfd90358d23a0, }, w9: u288 { limb0: 0x679d91263798da428fa5ea62, limb1: 0x806797d163f4df8b55ec774c, limb2: 0x29b72d4ec063face, }, w10: u288 { limb0: 0x4dbef45fe0c5a14bef7c4a90, limb1: 0xd4ae215c443d0f0768198bc6, limb2: 0x2fcc02633e427272, }, w11: u288 { limb0: 0x7308cad65773475443cfbd80, limb1: 0x972f90a77f1a8aeece6571ff, limb2: 0x2d3a570362a9fd7f, }, }, gamma_g2: G2Point { x0: u384 { limb0: 0xf75edadd46debd5cd992f6ed, limb1: 0x426a00665e5c4479674322d4, limb2: 0x1800deef121f1e76, limb3: 0x0, }, x1: u384 { limb0: 0x35a9e71297e485b7aef312c2, limb1: 0x7260bfb731fb5d25f1aa4933, limb2: 0x198e9393920d483a, limb3: 0x0, }, y0: u384 { limb0: 0xc43d37b4ce6cc0166fa7daa, limb1: 0x4aab71808dcb408fe3d1e769, limb2: 0x12c85ea5db8c6deb, limb3: 0x0, }, y1: u384 { limb0: 0x70b38ef355acdadcd122975b, limb1: 0xec9e99ad690c3395bc4b3133, limb2: 0x90689d0585ff075, limb3: 0x0, }, }, delta_g2: G2Point { x0: u384 { limb0: 0x777a63b327d736bffb0122ed, limb1: 0x2caf27354d28e4b8f83d3b76, limb2: 0x3ff41f4ba0c37fe, limb3: 0x0, }, x1: u384 { limb0: 0xc020024521998269845f74e6, limb1: 0x21f01ecc9b46d236e0865e0c, limb2: 0x1cc7cb8de715675f, limb3: 0x0, }, y0: u384 { limb0: 0x264a04499f7e2f6df690dd85, limb1: 0x909b4f1c3d80fcd6865afc4a, limb2: 0x17387b4b9cf03927, limb3: 0x0, }, y1: u384 { limb0: 0xf614f4fd11b56b3c5e53c44c, limb1: 0xd19a3d72dcd590ac85a971de, limb2: 0x2ed3b19b5eb39db0, limb3: 0x0, }, }, }; pub const ic: [G1Point; 3] = [ G1Point { x: u384 { limb0: 0x33db734c451d28b58aa9758e, limb1: 0x4ea0a694cd3743ebf5247792, limb2: 0x26091e1cafb0ad8a, limb3: 0x0, }, y: u384 { limb0: 0xefa65a3e782e7ba70b66690e, limb1: 0xca6fdb2690a124f8ce25489f, limb2: 0x9ff50a6b8b11c3, limb3: 0x0, }, }, G1Point { x: u384 { limb0: 0xec878755e537c1c48951fb4c, limb1: 0x2607c227d090cca750ed36c6, limb2: 0x61c3fd0fd3da25d, limb3: 0x0, }, y: u384 { limb0: 0x3e6119a212dd09eb51707219, limb1: 0xdf7b5c65eff0e107055e9a27, limb2: 0xfa17ae9c2033379, limb3: 0x0, }, }, G1Point { x: u384 { limb0: 0xa16028dee020634fd129e71c, limb1: 0x7fe0e0e2ead0b2ec4ffdec51, limb2: 0x4eab241388a7981, limb3: 0x0, }, y: u384 { limb0: 0xca56b18d5544b0889a65c1f5, limb1: 0x2f0bdbf95cff83e03ea9e16f, limb2: 0x7236256d21c60d0, limb3: 0x0, }, }, ]; pub const precomputed_lines: [G2Line; 176] = [ G2Line { r0a0: u288 { limb0: 0x4d347301094edcbfa224d3d5, limb1: 0x98005e68cacde68a193b54e6, limb2: 0x237db2935c4432bc, }, r0a1: u288 { limb0: 0x6b4ba735fba44e801d415637, limb1: 0x707c3ec1809ae9bafafa05dd, limb2: 0x124077e14a7d826a, }, r1a0: u288 { limb0: 0x49a8dc1dd6e067932b6a7e0d, limb1: 0x7676d0000961488f8fbce033, limb2: 0x3b7178c857630da, }, r1a1: u288 { limb0: 0x98c81278efe1e96b86397652, limb1: 0xe3520b9dfa601ead6f0bf9cd, limb2: 0x2b17c2b12c26fdd0, }, }, G2Line { r0a0: u288 { limb0: 0x7cbf2d97579849ed7f37f916, limb1: 0x7c7c7cabc0338914ae612207, limb2: 0x7f04129bafedc9a, }, r0a1: u288 { limb0: 0x28db0f05530a21fac876cfe4, limb1: 0xb08060f001e32bf0f4beff7a, limb2: 0x1758a3c93ad8f055, }, r1a0: u288 { limb0: 0x53ad64ec102823f3f1d3fd30, limb1: 0xe512e2de1e37f60219c44720, limb2: 0xb05a57aa94413c8, }, r1a1: u288 { limb0: 0x3c6bb091ccdadd1f42045694, limb1: 0x5756eeec096f1de96f136d22, limb2: 0xe9421367ecf6d7f, }, }, G2Line { r0a0: u288 { limb0: 0x1b3d578c32d1af5736582972, limb1: 0x204fe74db6b371d37e4615ab, limb2: 0xce69bdf84ed6d6d, }, r0a1: u288 { limb0: 0xfd262357407c3d96bb3ba710, limb1: 0x47d406f500e66ea29c8764b3, limb2: 0x1e23d69196b41dbf, }, r1a0: u288 { limb0: 0x1ec8ee6f65402483ad127f3a, limb1: 0x41d975b678200fce07c48a5e, limb2: 0x2cad36e65bbb6f4f, }, r1a1: u288 { limb0: 0xcfa9b8144c3ea2ab524386f5, limb1: 0xd4fe3a18872139b0287570c3, limb2: 0x54c8bc1b50aa258, }, }, G2Line { r0a0: u288 { limb0: 0xb5ee22ba52a7ed0c533b7173, limb1: 0xbfa13123614ecf9c4853249b, limb2: 0x6567a7f6972b7bb, }, r0a1: u288 { limb0: 0xcf422f26ac76a450359f819e, limb1: 0xc42d7517ae6f59453eaf32c7, limb2: 0x899cb1e339f7582, }, r1a0: u288 { limb0: 0x9f287f4842d688d7afd9cd67, limb1: 0x30af75417670de33dfa95eda, limb2: 0x1121d4ca1c2cab36, }, r1a1: u288 { limb0: 0x7c4c55c27110f2c9a228f7d8, limb1: 0x8f14f6c3a2e2c9d74b347bfe, limb2: 0x83ef274ba7913a5, }, }, G2Line { r0a0: u288 { limb0: 0xebb29cf5e488422959450431, limb1: 0x3bd3c90ac14dcf48e9204889, limb2: 0x28740d492632c38f, }, r0a1: u288 { limb0: 0x3f96bb87e9166a1c10062d63, limb1: 0x7cfe4c67f9e2c6ca2c26b17, limb2: 0x190baaa9a658afd4, }, r1a0: u288 { limb0: 0x14c465a12bf86822e6a90017, limb1: 0xd33d62d86349625b7dbd2371, limb2: 0x255ea8f837ed8c60, }, r1a1: u288 { limb0: 0x2c0619fb6f45aef79678a6b3, limb1: 0x60f956ca78123a74286dfd6f, limb2: 0x21d02d3c626232aa, }, }, G2Line { r0a0: u288 { limb0: 0xc6a50211bb4e98f1dbcc18c6, limb1: 0x9847d0e53a837fae823cd4ea, limb2: 0x2082a2a015765ee3, }, r0a1: u288 { limb0: 0x24ae565e25a79ee1ea39d033, limb1: 0x2faeb8128c16d60a0efbf2a8, limb2: 0x2be4069bfaeb9e80, }, r1a0: u288 { limb0: 0xed15a9b34ed7444c70f2da29, limb1: 0x9aad3ebe8a77d1b9f448c5e4, limb2: 0x2ccac3d2f5842673, }, r1a1: u288 { limb0: 0xaeba508ff18253293d75a9fb, limb1: 0xefc547444d7e210113d1126f, limb2: 0x15d5770504f94de3, }, }, G2Line { r0a0: u288 { limb0: 0xfc23a674d089e9cfdefb1db8, limb1: 0x9ddfd61d289b65a9b4254476, limb2: 0x1e2f561324ef4447, }, r0a1: u288 { limb0: 0xf67a6a9e31f6975b220642ea, limb1: 0xccd852893796296e4d1ed330, limb2: 0x94ff1987d19b62, }, r1a0: u288 { limb0: 0x360c2a5aca59996d24cc1947, limb1: 0x66c2d7d0d176a3bc53f386e8, limb2: 0x2cfcc62a17fbeecb, }, r1a1: u288 { limb0: 0x2ddc73389dd9a9e34168d8a9, limb1: 0xae9afc57944748b835cbda0f, limb2: 0x12f0a1f8cf564067, }, }, G2Line { r0a0: u288 { limb0: 0x938f40d6331d337cd5a78483, limb1: 0xfb9bf9696fc566e9277e3562, limb2: 0x178c9caed033670a, }, r0a1: u288 { limb0: 0x1868c526c195826f2926a360, limb1: 0x7c87ae606c93c769e7dc805f, limb2: 0xbaf9f3e4b922406, }, r1a0: u288 { limb0: 0xf0324176663d80d726a6a17, limb1: 0x2687269fb7f21bd83428ced1, limb2: 0x2c8b67dc6eaacc68, }, r1a1: u288 { limb0: 0xecb58d4301481dcffc13975d, limb1: 0x12c9ac3eaf1828a708993570, limb2: 0x295e2d4bbfdf162b, }, }, G2Line { r0a0: u288 { limb0: 0x9c963c4bdade6ce3d460b077, limb1: 0x1738311feefc76f565e34e8a, limb2: 0x1aae0d6c9e9888ad, }, r0a1: u288 { limb0: 0x9272581fdf80b045c9c3f0a, limb1: 0x3946807b0756e87666798edb, limb2: 0x2bf6eeda2d8be192, }, r1a0: u288 { limb0: 0x3e957661b35995552fb475de, limb1: 0xd8076fa48f93f09d8128a2a8, limb2: 0xb6f87c3f00a6fcf, }, r1a1: u288 { limb0: 0xcf17d6cd2101301246a8f264, limb1: 0x514d04ad989b91e697aa5a0e, limb2: 0x175f17bbd0ad1219, }, }, G2Line { r0a0: u288 { limb0: 0x894bc18cc70ca1987e3b8f9f, limb1: 0xd4bfa535181f0f8659b063e3, limb2: 0x19168d524164f463, }, r0a1: u288 { limb0: 0x850ee8d0e9b58b82719a6e92, limb1: 0x9fc4eb75cbb027c137d48341, limb2: 0x2b2f8a383d944fa0, }, r1a0: u288 { limb0: 0x5451c8974a709483c2b07fbd, limb1: 0xd7e09837b8a2a3b78e7fe525, limb2: 0x347d96be5e7fa31, }, r1a1: u288 { limb0: 0x823f2ba2743ee254e4c18a1e, limb1: 0x6a61af5db035c443ed0f8172, limb2: 0x1e840eee275d1063, }, }, G2Line { r0a0: u288 { limb0: 0x42b739265325a48fbafa90d8, limb1: 0xcaaca7c05543af71af550508, limb2: 0xaf2a71170a857a3, }, r0a1: u288 { limb0: 0x83dba88a49375b3088ec56ed, limb1: 0xf0b67f36f46fc663eecd11f0, limb2: 0x61b8dea2acb984b, }, r1a0: u288 { limb0: 0x55990d74b22baae47fb0fdaf, limb1: 0x9562f464f486bfae1e003333, limb2: 0x1508b9aaa2d992ed, }, r1a1: u288 { limb0: 0xb0f384299f76ba205b8aaae0, limb1: 0x59c4180e94d72106043ddd38, limb2: 0x26fb9897974b52b5, }, }, G2Line { r0a0: u288 { limb0: 0x4a713c06f87eec4f6c8f84d1, limb1: 0x57504d3d02142f561546fc52, limb2: 0x25dafbc904cc0af3, }, r0a1: u288 { limb0: 0x86db774a383a67fe84821fe0, limb1: 0xeca958da5742fbbfd64eb68d, limb2: 0x13675c605dc3d55c, }, r1a0: u288 { limb0: 0x679f0a0f3c17bd7394a8834d, limb1: 0xef1b109621da0a27bd87799d, limb2: 0xc7ce67ca683f6f8, }, r1a1: u288 { limb0: 0x50ad632be82adc7cca6edc58, limb1: 0xf0470f4c78cd6f03c2bb1ed0, limb2: 0x26dff4d8c96ccdb0, }, }, G2Line { r0a0: u288 { limb0: 0x18d630598e58bb5d0102b30e, limb1: 0x9767e27b02a8da37411a2787, limb2: 0x100a541662b9cd7c, }, r0a1: u288 { limb0: 0x4ca7313df2e168e7e5ea70, limb1: 0xd49cce6abd50b574f31c2d72, limb2: 0x78a2afbf72317e7, }, r1a0: u288 { limb0: 0x6d99388b0a1a67d6b48d87e0, limb1: 0x1d8711d321a193be3333bc68, limb2: 0x27e76de53a010ce1, }, r1a1: u288 { limb0: 0x77341bf4e1605e982fa50abd, limb1: 0xc5cf10db170b4feaaf5f8f1b, limb2: 0x762adef02274807, }, }, G2Line { r0a0: u288 { limb0: 0xcac1344e8cb568214722a8c8, limb1: 0xc892d892267faeae62644b74, limb2: 0x2d89e403f6e30991, }, r0a1: u288 { limb0: 0x48c9a2b7277986259bac47be, limb1: 0x6f8677a58151e08a08f490e5, limb2: 0x4edfbee8ff0719, }, r1a0: u288 { limb0: 0x1d121ebf7a9fb2b1a77c2c48, limb1: 0x2a69c49d06a7830375bb91df, limb2: 0x10bd82bd6966042f, }, r1a1: u288 { limb0: 0xacc263d42b87601b8d585974, limb1: 0xf45b7035591969a55d96f2e7, limb2: 0x27673d5868aed589, }, }, G2Line { r0a0: u288 { limb0: 0xa137b991ba9048aee9fa0bc7, limb1: 0xf5433785c186cd1100ab6b80, limb2: 0xab519fd7cf8e7f9, }, r0a1: u288 { limb0: 0x90832f45d3398c60aa1a74e2, limb1: 0x17f7ac209532723f22a344b, limb2: 0x23db979f8481c5f, }, r1a0: u288 { limb0: 0x723b0e23c2808a5d1ea6b11d, limb1: 0x3030030d26411f84235c3af5, limb2: 0x122e78da5509eddb, }, r1a1: u288 { limb0: 0xf1718c1e21a9bc3ec822f319, limb1: 0xf5ee6dfa3bd3272b2f09f0c7, limb2: 0x5a29c1e27616b34, }, }, G2Line { r0a0: u288 { limb0: 0x68d34d439ae2c989972b1a0f, limb1: 0xf95d4027b5c73acfb60d525f, limb2: 0xeb6c23cd34d1aa6, }, r0a1: u288 { limb0: 0xa4d59d3b671a81bf28b00065, limb1: 0x488f591820d610c9cee5ad2, limb2: 0xd3ad6058795bc4b, }, r1a0: u288 { limb0: 0x1cda8ced3e8fcef708fd8d15, limb1: 0xc4eb263c073391531751a836, limb2: 0x1e277f8c09e04ee4, }, r1a1: u288 { limb0: 0xa8ed44c840c2be958d1a4582, limb1: 0xc7752e9691f112d0ffa7b455, limb2: 0x1ac35e3d2a100323, }, }, G2Line { r0a0: u288 { limb0: 0xbc1ede480873fceb8739511e, limb1: 0xd5a60533bd0ce7869efbc15, limb2: 0x182c17d793eba74d, }, r0a1: u288 { limb0: 0x83bf38d91876ad8999516bc2, limb1: 0x7756322ea3dc079289d51f2d, limb2: 0x1d0f6156a89a4244, }, r1a0: u288 { limb0: 0x6aba652f197be8f99707b88c, limb1: 0xbf94286c245794ea0f562f32, limb2: 0x25a358967a2ca81d, }, r1a1: u288 { limb0: 0xc028cbff48c01433e8b23568, limb1: 0xd2e791f5772ed43b056beba1, limb2: 0x83eb38dff4960e, }, }, G2Line { r0a0: u288 { limb0: 0x725e048159c543615bb84e6e, limb1: 0x45fbc1f38e142ccda443cd6, limb2: 0x2ab74aaac994b0dc, }, r0a1: u288 { limb0: 0xab291908bb575acbab668ad1, limb1: 0xc942a48a949adf3f77abd94, limb2: 0xf5e7c6df6de7ffd, }, r1a0: u288 { limb0: 0xaa885b0a29c1ec26fc8ecabc, limb1: 0xf497d575c19ed625b01fde30, limb2: 0x2e30b462f1cdccef, }, r1a1: u288 { limb0: 0xaafdb72e153e37da9c9bedc8, limb1: 0xa7eb7720a5e8ac3b81d5cb86, limb2: 0x119a5d1009fc61c8, }, }, G2Line { r0a0: u288 { limb0: 0xc2a2b787d8e718e81970db80, limb1: 0x5372abeaf56844dee60d6198, limb2: 0x131210153a2217d6, }, r0a1: u288 { limb0: 0x70421980313e09a8a0e5a82d, limb1: 0xf75ca1f68f4b8deafb1d3b48, limb2: 0x102113c9b6feb035, }, r1a0: u288 { limb0: 0x4654c11d73bda84873de9b86, limb1: 0xa67601bca2e595339833191a, limb2: 0x1c2b76e439adc8cc, }, r1a1: u288 { limb0: 0x9c53a48cc66c1f4d644105f2, limb1: 0xa17a18867557d96fb7c2f849, limb2: 0x1deb99799bd8b63a, }, }, G2Line { r0a0: u288 { limb0: 0xc32026c56341297fa080790c, limb1: 0xe23ad2ff283399133533b31f, limb2: 0xa6860f5c968f7ad, }, r0a1: u288 { limb0: 0x2966cf259dc612c6a4d8957d, limb1: 0xfba87ea86054f3db5774a08f, limb2: 0xc73408b6a646780, }, r1a0: u288 { limb0: 0x6272ce5976d8eeba08f66b48, limb1: 0x7dfbd78fa06509604c0cec8d, limb2: 0x181ec0eaa6660e45, }, r1a1: u288 { limb0: 0x48af37c1a2343555fbf8a357, limb1: 0xa7b5e1e20e64d6a9a9ce8e61, limb2: 0x1147dcea39a47abd, }, }, G2Line { r0a0: u288 { limb0: 0x9b8973e6a6608567ccd76366, limb1: 0x8a0b0ff16938e5e9d047a619, limb2: 0x2b77ff867bd8e680, }, r0a1: u288 { limb0: 0xcb7418d320b301aabe4148da, limb1: 0x235198f24eec02e28695e10d, limb2: 0xa8301843558aa76, }, r1a0: u288 { limb0: 0x5c829b7de1bd80457eabff96, limb1: 0x8a62cc6b40a204c85decd770, limb2: 0x242afd2ccfcfee9c, }, r1a1: u288 { limb0: 0xcf929d2a26a49eba7aefc650, limb1: 0x9f0aecd693f8e14112325cbc, limb2: 0x2f80e551b8c656e5, }, }, G2Line { r0a0: u288 { limb0: 0x811ea824acc13b51e0c97817, limb1: 0xde9eb6d50d2979e139a147e9, limb2: 0x3c30b8b0df3f74f, }, r0a1: u288 { limb0: 0xd5d75a2f277774b60b1784d2, limb1: 0xfda6904cb620bf9443d8afd7, limb2: 0x217f45e35d37496d, }, r1a0: u288 { limb0: 0x8fe90603c2f1b8e3a1d867d0, limb1: 0xa9a56b26cfe0b448eca62dec, limb2: 0x63b61231638b05a, }, r1a1: u288 { limb0: 0xb13dd53df7a134f20fadc38, limb1: 0xdbca72fe038c93d61287c616, limb2: 0x2da092b4bd5d3c42, }, }, G2Line { r0a0: u288 { limb0: 0x4033c51e6e469818521cd2ae, limb1: 0xb71a4629a4696b2759f8e19e, limb2: 0x4f5744e29c1eb30, }, r0a1: u288 { limb0: 0xa4f47bbc60cb0649dca1c772, limb1: 0x835f427106f4a6b897c6cf23, limb2: 0x17ca6ea4855756bb, }, r1a0: u288 { limb0: 0x7f844a35c7eeadf511e67e57, limb1: 0x8bb54fb0b3688cac8860f10, limb2: 0x1c7258499a6bbebf, }, r1a1: u288 { limb0: 0x10d269c1779f96946e518246, limb1: 0xce6fcef6676d0dacd395dc1a, limb2: 0x2cf4c6ae1b55d87d, }, }, G2Line { r0a0: u288 { limb0: 0xfbe0193ec22b48fec5af2f7, limb1: 0x774b3f299076ff89c55c3d4a, limb2: 0x2205817196a5cce3, }, r0a1: u288 { limb0: 0xcd9ec02cfbd2a3ee9a60e0bc, limb1: 0xdc96dde2fc513b87c71ff1b7, limb2: 0x1cd732208e302df2, }, r1a0: u288 { limb0: 0x2c9d6c58dffd69e8847fddea, limb1: 0x7758ea015f811fa25d88afad, limb2: 0x15d123eaba763b4d, }, r1a1: u288 { limb0: 0xe98b3872ba65f4177b7b71b2, limb1: 0xf707fe02014d268ff63c196d, limb2: 0xb09a8f9c30f805b, }, }, G2Line { r0a0: u288 { limb0: 0xab74a6bae36b17b1d2cc1081, limb1: 0x904cf03d9d30b1fe9dc71374, limb2: 0x14ffdd55685b7d82, }, r0a1: u288 { limb0: 0x277f7180b7cf33feded1583c, limb1: 0xc029c3968a75b612303c4298, limb2: 0x20ef4ba03605cdc6, }, r1a0: u288 { limb0: 0xd5a7a27c1baba3791ab18957, limb1: 0x973730213d5d70d3e62d6db, limb2: 0x24ca121c566eb857, }, r1a1: u288 { limb0: 0x9f4c2dea0492f548ae7d9e93, limb1: 0xe584b6b251a5227c70c5188, limb2: 0x22bcecac2bd5e51b, }, }, G2Line { r0a0: u288 { limb0: 0x340c82974f7221a53fc2f3ac, limb1: 0x7146f18cd591d423874996e7, limb2: 0xa6d154791056f46, }, r0a1: u288 { limb0: 0x70894ea6418890d53b5ee12a, limb1: 0x882290cb53b795b0e7c8c208, limb2: 0x1b5777dc18b2899b, }, r1a0: u288 { limb0: 0x99a0e528d582006a626206b6, limb1: 0xb1cf825d80e199c5c9c795b5, limb2: 0x2a97495b032f0542, }, r1a1: u288 { limb0: 0xc7cf5b455d6f3ba73debeba5, limb1: 0xbb0a01235687223b7b71d0e5, limb2: 0x250024ac44c35e3f, }, }, G2Line { r0a0: u288 { limb0: 0x5de94d9644e370b354056a2a, limb1: 0xffa4b4e6caa341c06532adf9, limb2: 0x19a1fdd66cb0bea4, }, r0a1: u288 { limb0: 0x8c4cb8999e50edcc5d79d10f, limb1: 0x38fd66d18df30b9270c237b8, limb2: 0x1d2989db26ed77e8, }, r1a0: u288 { limb0: 0xbd0c585ef9c4c363feaf733a, limb1: 0x4a9788e4b097b387a2e3d25d, limb2: 0x71d26c1ddac58a0, }, r1a1: u288 { limb0: 0xde8ea360f082230cba2c3d58, limb1: 0xf5d295a2e8fc6776a2c38b60, limb2: 0x1d99e0b44328228a, }, }, G2Line { r0a0: u288 { limb0: 0xa14926bd3ee473b50fe5aaee, limb1: 0x113fd7acdfcbf4b4dcd52ea1, limb2: 0x69a24cbf370e857, }, r0a1: u288 { limb0: 0x3609ea680e1899336a162b3d, limb1: 0x66238105b2124b799337961e, limb2: 0x147fb45ccd95134e, }, r1a0: u288 { limb0: 0xb2d55d56c185a82ac9281057, limb1: 0xc2faa7fcfd3a124169486c63, limb2: 0x19db77c344303fba, }, r1a1: u288 { limb0: 0x2f0bb0d515012a5ead2ef5b9, limb1: 0xc016838fa0925fca09eaf0c2, limb2: 0x2dd347070a684eb0, }, }, G2Line { r0a0: u288 { limb0: 0xccf841cf5c1cf8f4a0485e28, limb1: 0xb5077662d0ce9d755af1446b, limb2: 0x2b08658e9d5ba5cb, }, r0a1: u288 { limb0: 0x6ce62184a15685babd77f27f, limb1: 0x5ff9bb7d74505b0542578299, limb2: 0x7244563488bab2, }, r1a0: u288 { limb0: 0xec778048d344ac71275d961d, limb1: 0x1273984019753000ad890d33, limb2: 0x27c2855e60d361bd, }, r1a1: u288 { limb0: 0xa7a0071e22af2f3a79a12da, limb1: 0xc84a6fd41c20759ff6ff169a, limb2: 0x23e7ef2a308e49d1, }, }, G2Line { r0a0: u288 { limb0: 0xde26507b6464c2b2432946d3, limb1: 0xccdae412f5efda9224b487a6, limb2: 0x7397099c18bb017, }, r0a1: u288 { limb0: 0x113302c7ec8ed33f4a2336c6, limb1: 0xb076f9a40642c67e9dcca121, limb2: 0x27758b6b6267b249, }, r1a0: u288 { limb0: 0x1d108f0331b13db2d7cd219f, limb1: 0x167a01313f068dd4f63ff09c, limb2: 0x203d41b179e2ede8, }, r1a1: u288 { limb0: 0xce04948c084e9702a349ed11, limb1: 0xe4644eb462d7ad1d68bfc0d9, limb2: 0x7c5ae799b65a74d, }, }, G2Line { r0a0: u288 { limb0: 0x7105024c431a33683d9d0b9d, limb1: 0x12e23637b641ab0e5b322ad8, limb2: 0x2918e9e08c764c28, }, r0a1: u288 { limb0: 0x26384979d1f5417e451aeabf, limb1: 0xacfb499e362291d0b053bbf6, limb2: 0x2a6ad1a1f7b04ef6, }, r1a0: u288 { limb0: 0xba4db515be70c384080fc9f9, limb1: 0x5a983a6afa9cb830fa5b66e6, limb2: 0x8cc1fa494726a0c, }, r1a1: u288 { limb0: 0x59c9af9399ed004284eb6105, limb1: 0xef37f66b058b4c971d9c96b0, limb2: 0x2c1839afde65bafa, }, }, G2Line { r0a0: u288 { limb0: 0xce283994615e4036d5f9b3ce, limb1: 0xe0bdc04bf896427f10bfde51, limb2: 0xf5d867b4bca046f, }, r0a1: u288 { limb0: 0xf0b527e39a718a6c10415ace, limb1: 0xe6369ae45b67558e1c4b4d3c, limb2: 0x26bc24d2eadac885, }, r1a0: u288 { limb0: 0xc9ad80732ebb2fce8f00a80b, limb1: 0x5d4753fedb0e9bfd7c0b1f6, limb2: 0x14b268ac1c4382d7, }, r1a1: u288 { limb0: 0xce27cc14afec384c81c7dcd0, limb1: 0x1f3a4716b45fd52cdeb157d3, limb2: 0x244aca1db91a1f0d, }, }, G2Line { r0a0: u288 { limb0: 0x6bf13a27b0f4eb6657abc4b, limb1: 0xf78d57f089bffdf07c676bb3, limb2: 0x228e4aefbdd738df, }, r0a1: u288 { limb0: 0x4f41a40b04ec964619823053, limb1: 0xfa3fb44f4a80641a9bb3bc09, limb2: 0x29bf29a3d071ec4b, }, r1a0: u288 { limb0: 0x83823dcdff02bdc8a0e6aa03, limb1: 0x79ac92f113de29251cd73a98, limb2: 0x1ccdb791718d144, }, r1a1: u288 { limb0: 0xa074add9d066db9a2a6046b6, limb1: 0xef3a70034497456c7d001a5, limb2: 0x27d09562d815b4a6, }, }, G2Line { r0a0: u288 { limb0: 0xbf8efa0f44277ab5e9811cb4, limb1: 0x4f4a912383fe29ef4fac6d85, limb2: 0xb13f577a181edf2, }, r0a1: u288 { limb0: 0x7caea92119bc1aa87d1a4022, limb1: 0xc3c61eb32a1ae87fedc32db6, limb2: 0x1ebce60883c9ce51, }, r1a0: u288 { limb0: 0x637e0775ea61e20fb0e8a12a, limb1: 0x6f35385f1e29a52311ff082e, limb2: 0xb29b15c3c57992, }, r1a1: u288 { limb0: 0x82c37125ed664f16c787c2a8, limb1: 0xa65fedf5e8c9d952f8cff058, limb2: 0xcc492d0f6b348b6, }, }, G2Line { r0a0: u288 { limb0: 0x87a44d343cc761056f4f2eae, limb1: 0x18016f16818253360d2c8adf, limb2: 0x1bcd5c6e597d735e, }, r0a1: u288 { limb0: 0x593d7444c376f6d69289660b, limb1: 0x1d6d97020b59cf2e4b38be4f, limb2: 0x17133b62617f63a7, }, r1a0: u288 { limb0: 0x88cac99869bb335ec9553a70, limb1: 0x95bcfa7f7c0b708b4d737afc, limb2: 0x1eec79b9db274c09, }, r1a1: u288 { limb0: 0xe465a53e9fe085eb58a6be75, limb1: 0x868e45cc13e7fd9d34e11839, limb2: 0x2b401ce0f05ee6bb, }, }, G2Line { r0a0: u288 { limb0: 0x83f48fbac5c1b94486c2d037, limb1: 0xf95d9333449543de78c69e75, limb2: 0x7bca8163e842be7, }, r0a1: u288 { limb0: 0x60157b2ff6e4d737e2dac26b, limb1: 0x30ab91893fcf39d9dcf1b89, limb2: 0x29a58a02490d7f53, }, r1a0: u288 { limb0: 0x520f9cb580066bcf2ce872db, limb1: 0x24a6e42c185fd36abb66c4ba, limb2: 0x309b07583317a13, }, r1a1: u288 { limb0: 0x5a4c61efaa3d09a652c72471, limb1: 0xfcb2676d6aa28ca318519d2, limb2: 0x1405483699afa209, }, }, G2Line { r0a0: u288 { limb0: 0xc47d4ada891776f3e6e116e1, limb1: 0x6c80dc5afdcfc02145df53f6, limb2: 0x4c8414aac1b0395, }, r0a1: u288 { limb0: 0xd484d52c85030a07343929a1, limb1: 0x75a6f09394f911d4959f189f, limb2: 0x2ba0a456ad7d89ff, }, r1a0: u288 { limb0: 0xa8f4cf37f64451a7fe1fef82, limb1: 0x6388ae9a93882e4ff2e54b34, limb2: 0x1629c6ff16173284, }, r1a1: u288 { limb0: 0x320367a73ffab79d59ffe89a, limb1: 0x37f82ff751295fe21521991d, limb2: 0x789f87edf2e3df9, }, }, G2Line { r0a0: u288 { limb0: 0xbca9043533f559077d2eba79, limb1: 0x13fef9825c761d5bddbcf07d, limb2: 0x1195674e328c72c9, }, r0a1: u288 { limb0: 0xdcb16742336d127fd7d8f824, limb1: 0x2cdf6a68d632f5c1b44867cd, limb2: 0xac06da12d262554, }, r1a0: u288 { limb0: 0xedb983ba4e8f497c45b6dbc2, limb1: 0x6aa30e035c6f5c55622b1e40, limb2: 0x11dd74de83ecbd9f, }, r1a1: u288 { limb0: 0x407935653afae88cfc4fc70c, limb1: 0x15ecf74f65948447d9f436a3, limb2: 0x2b6ba90989e359ee, }, }, G2Line { r0a0: u288 { limb0: 0xbfdfdae86101e29da3e869b8, limb1: 0xf969a9b961a28b872e56aac2, limb2: 0x1afdc719440d90f0, }, r0a1: u288 { limb0: 0xee43c995686f13baa9b07266, limb1: 0xbfa387a694c641cceee4443a, limb2: 0x104d8c02eb7f60c8, }, r1a0: u288 { limb0: 0x8d451602b3593e798aecd7fb, limb1: 0x69ffbefe7c5ac2cf68e8691e, limb2: 0x2ea064a1bc373d28, }, r1a1: u288 { limb0: 0x6e7a663073bfe88a2b02326f, limb1: 0x5faadb36847ca0103793fa4a, limb2: 0x26c09a8ec9303836, }, }, G2Line { r0a0: u288 { limb0: 0x3c6f6125152a1dfb641aff97, limb1: 0x91361d513d1da420fa8b4c53, limb2: 0x25fff9ec836eb501, }, r0a1: u288 { limb0: 0xb9ca876c8f91a90bd03aa49a, limb1: 0x41e027306cc4eb305bdf98ee, limb2: 0x2dc58f6baf41e472, }, r1a0: u288 { limb0: 0x6db773b8ac0547e309d8cc94, limb1: 0x95a943a2523fc74c7b3ce15e, limb2: 0x7f19fee8893e3ec, }, r1a1: u288 { limb0: 0xec01c36f2fb8eaaef1f45122, limb1: 0x8408305b35600377713d0e1f, limb2: 0xb36c5a3f958f2a7, }, }, G2Line { r0a0: u288 { limb0: 0x3d038747ebac16adc1c50bdd, limb1: 0xe3706a783e99f73ac742aa1a, limb2: 0x17eac23b00b545ff, }, r0a1: u288 { limb0: 0xdc25ff0bd02abcbe502c4e37, limb1: 0x39b92e6ebb65e5f2d8504f90, limb2: 0x2415b5f61301dff6, }, r1a0: u288 { limb0: 0x9cdcb2146d15f37900db82ac, limb1: 0x96c3940e2f5c5f8198fadee3, limb2: 0x2f662ea79b473fc2, }, r1a1: u288 { limb0: 0xc0fb95686de65e504ed4c57a, limb1: 0xec396c7c4275d4e493b00713, limb2: 0x106d2aab8d90d517, }, }, G2Line { r0a0: u288 { limb0: 0xd0676b34291facf89d33679e, limb1: 0x81b00356cfb982eec3ce4d10, limb2: 0x15f2b090fcb75ad5, }, r0a1: u288 { limb0: 0x8e17b4ac5fc26b6b8c70d1d0, limb1: 0x61ddfc96918011fbbfb6bd96, limb2: 0x1e66b984c4cd0579, }, r1a0: u288 { limb0: 0x3cfd9855bd21f16929977c4c, limb1: 0x61d8356887fe36bc306ba57c, limb2: 0x2d05307f879d4032, }, r1a1: u288 { limb0: 0x1484c8392195ac794e9abca7, limb1: 0x7f1d5ac422740092bcd9e169, limb2: 0x293919abeef84688, }, }, G2Line { r0a0: u288 { limb0: 0x49bbb4d856921e3177c0b5bf, limb1: 0x76d84d273694e662bdd5d364, limb2: 0xea5dc611bdd369d, }, r0a1: u288 { limb0: 0x9e9fc3adc530fa3c5c6fd7fe, limb1: 0x114bb0c0e8bd247da41b3883, limb2: 0x6044124f85d2ce, }, r1a0: u288 { limb0: 0xa6e604cdb4e40982a97c084, limb1: 0xef485caa56c7820be2f6b11d, limb2: 0x280de6387dcbabe1, }, r1a1: u288 { limb0: 0xcaceaf6df5ca9f8a18bf2e1e, limb1: 0xc5cce932cc6818b53136c142, limb2: 0x12f1cd688682030c, }, }, G2Line { r0a0: u288 { limb0: 0x37497c23dcf629df58a5fa12, limb1: 0x4fcd5534ae47bded76245ac9, limb2: 0x1715ab081e32ac95, }, r0a1: u288 { limb0: 0x856275471989e2c288e3c83, limb1: 0xb42d81a575b89b127a7821a, limb2: 0x5fa75a0e4ae3118, }, r1a0: u288 { limb0: 0xeb22351e8cd345c23c0a3fef, limb1: 0x271feb16d4b47d2267ac9d57, limb2: 0x258f9950b9a2dee5, }, r1a1: u288 { limb0: 0xb5f75468922dc025ba7916fa, limb1: 0x7e24515de90edf1bde4edd9, limb2: 0x289145b3512d4d81, }, }, G2Line { r0a0: u288 { limb0: 0x9dca870c1484810a661f59d4, limb1: 0xadff34db27fd944111f8a6b1, limb2: 0x2f04571e7b81b9c4, }, r0a1: u288 { limb0: 0xd9a94da685de3ff292c308a1, limb1: 0x1b9b7392d48239e525d06701, limb2: 0x2ba482e60ec17938, }, r1a0: u288 { limb0: 0xdb0def301197ce2ffb78a2d0, limb1: 0x3dc46153ace29b10df2e46f5, limb2: 0xc85daa61e3e1093, }, r1a1: u288 { limb0: 0xc36a99960a6ef0154c914b17, limb1: 0x141f0194a483fc78645ba557, limb2: 0x34a9ad3ff55fdca, }, }, G2Line { r0a0: u288 { limb0: 0x61f660445e3c332848ca8e, limb1: 0xc0f8425af6c6f01521dc84ce, limb2: 0xfd780cc97d031fd, }, r0a1: u288 { limb0: 0xe4f5496cb0df45f8f814ead5, limb1: 0x2c15fb46d6f9109a2e6bff16, limb2: 0x1c51dd9b55467dec, }, r1a0: u288 { limb0: 0xe9eb3a9743a5b7359666eba2, limb1: 0xef222d816cd87172c3011f61, limb2: 0x274bd1c75922a74, }, r1a1: u288 { limb0: 0x10ac95e57548c36e16a880df, limb1: 0x18b4d558688aa4560774a76, limb2: 0x2a044b9949c906a5, }, }, G2Line { r0a0: u288 { limb0: 0x95b7b32bcc3119c64a62a8de, limb1: 0xe07184496f17bbd59a4b7bbd, limb2: 0x1708c536fd78b531, }, r0a1: u288 { limb0: 0xfa85b5778c77166c1523a75e, limb1: 0x89a00c53309a9e525bef171a, limb2: 0x2d2287dd024e421, }, r1a0: u288 { limb0: 0x31fd0884eaf2208bf8831e72, limb1: 0x537e04ea344beb57ee645026, limb2: 0x23c7f99715257261, }, r1a1: u288 { limb0: 0x8c38b3aeea525f3c2d2fdc22, limb1: 0xf838a99d9ec8ed6dcec6a2a8, limb2: 0x2973d5159ddc479a, }, }, G2Line { r0a0: u288 { limb0: 0x3f058d8c63fd905d3ca29b42, limb1: 0x1f0a90982cc68e4ddcd83e57, limb2: 0x240aeaae0783fbfa, }, r0a1: u288 { limb0: 0xedfee81d80da310fdf0d0d8, limb1: 0xc2208e6de8806cf491bd74d4, limb2: 0xb7318be62a476af, }, r1a0: u288 { limb0: 0x3c6920c8a24454c634f388fe, limb1: 0x23328a006312a722ae09548b, limb2: 0x1d2f1c58b80432e2, }, r1a1: u288 { limb0: 0xb72980574f7a877586de3a63, limb1: 0xcd773b87ef4a29c16784c5ae, limb2: 0x1f812c7e22f339c5, }, }, G2Line { r0a0: u288 { limb0: 0xc06bfbec93c79c253ea70541, limb1: 0x5c5d3fe17a555e21f99e07ea, limb2: 0x17b4863826c54b28, }, r0a1: u288 { limb0: 0x44dbf42a961eb2ec7d783e85, limb1: 0xa6a66651685162adcd51359c, limb2: 0x6cb177bd8315214, }, r1a0: u288 { limb0: 0x80b82b2149a8d9b7ed9268fa, limb1: 0x62e408934939eda616b66100, limb2: 0xe958d23c6dae95b, }, r1a1: u288 { limb0: 0xf1d9428436e2c6a8fd847202, limb1: 0x5e41926889922dfffc189c93, limb2: 0x13f574f2efbbee63, }, }, G2Line { r0a0: u288 { limb0: 0x22008f8153092426a639c910, limb1: 0x7ec2db6c987ef1c20e5a8234, limb2: 0x1697f4ed7a5b552e, }, r0a1: u288 { limb0: 0x704f56be0f50078b47ad9f6c, limb1: 0xdb08445bceca2122b9457041, limb2: 0x76a9dd645d1365b, }, r1a0: u288 { limb0: 0x932e9e84d92176e5aedd41cc, limb1: 0x462304236b3c39af3a6c797b, limb2: 0x81a6316f1638b1c, }, r1a1: u288 { limb0: 0xc15ec06106531c2b26a125f9, limb1: 0x8f5c088d3120f7dd67539762, limb2: 0x12424d7e9d4e628d, }, }, G2Line { r0a0: u288 { limb0: 0xfeebe92941f95b6ea1d095bb, limb1: 0x9c7962eb8bbeb95a9ca7cf50, limb2: 0x290bdaf3b9a08dc3, }, r0a1: u288 { limb0: 0x686cfa11c9d4b93675495599, limb1: 0xb1d69e17b4b5ebf64f0d51e1, limb2: 0x2c18bb4bdc2e9567, }, r1a0: u288 { limb0: 0x17419b0f6a04bfc98d71527, limb1: 0x80eba6ff02787e3de964a4d1, limb2: 0x26087bb100e7ff9f, }, r1a1: u288 { limb0: 0x17c4ee42c3f612c43a08f689, limb1: 0x7276bdda2df6d51a291dba69, limb2: 0x40a7220ddb393e1, }, }, G2Line { r0a0: u288 { limb0: 0x6928ca64347d7c31671e2377, limb1: 0x2272be450aa84aa36df3365c, limb2: 0x2ca92615957b2fe0, }, r0a1: u288 { limb0: 0x88c4ede7111d187969799eca, limb1: 0xcc81917803770e59700eb7f8, limb2: 0x5930cfc2846191, }, r1a0: u288 { limb0: 0xafb165196b5d95e4fe136a4d, limb1: 0xc39d63ee112a9ccaa57134d4, limb2: 0x10dc932094831bbf, }, r1a1: u288 { limb0: 0xf7de51ac5b8a92c5b4845450, limb1: 0x9f3d9c4f13a46001e07751f, limb2: 0x242facacc7e8f671, }, }, G2Line { r0a0: u288 { limb0: 0x830d777c19040571a1d72fd0, limb1: 0x651b2c6b8c292020817a633f, limb2: 0x268af1e285bc59ff, }, r0a1: u288 { limb0: 0xede78baa381c5bce077f443d, limb1: 0x540ff96bae21cd8b9ae5438b, limb2: 0x12a1fa7e3b369242, }, r1a0: u288 { limb0: 0x797c0608e5a535d8736d4bc5, limb1: 0x375faf00f1147656b7c1075f, limb2: 0xda60fab2dc5a639, }, r1a1: u288 { limb0: 0x610d26085cfbebdb30ce476e, limb1: 0x5bc55890ff076827a09e8444, limb2: 0x14272ee2d25f20b7, }, }, G2Line { r0a0: u288 { limb0: 0x7b4f91687570395170f4325a, limb1: 0x9296c0d69936b134492c0fbb, limb2: 0x7cb37912214e21d, }, r0a1: u288 { limb0: 0x705f6482b8a7224e7254263e, limb1: 0x425d24e68239b8a49a2df34a, limb2: 0x2cb8ff7fc64712c3, }, r1a0: u288 { limb0: 0xe77944a01d94bda00b92ca30, limb1: 0x9b4dac2f2032dd830f464e92, limb2: 0x1297033462697e3e, }, r1a1: u288 { limb0: 0x7321500e3b68552ad9805a97, limb1: 0x3cac1d28317fe827c7707539, limb2: 0xe39933fb1acfd45, }, }, G2Line { r0a0: u288 { limb0: 0xd6862e1a4ca3b2baf6f8d8aa, limb1: 0x96f9066dded3a3d899025af4, limb2: 0x1a98af9f0d48fd3, }, r0a1: u288 { limb0: 0x276b417cc61ea259c114314e, limb1: 0x464399e5e0037b159866b246, limb2: 0x12cc97dcf32896b5, }, r1a0: u288 { limb0: 0xef72647f4c2d08fc038c4377, limb1: 0x34883cea19be9a490a93cf2b, limb2: 0x10d01394daa61ed0, }, r1a1: u288 { limb0: 0xdf345239ece3acaa62919643, limb1: 0x914780908ece64e763cca062, limb2: 0xee2a80dbd2012a3, }, }, G2Line { r0a0: u288 { limb0: 0x1d5a31f4d08a0ebf7e071e00, limb1: 0xcd1244dd95dd30005f531f81, limb2: 0xb4cb469a2dcf4f1, }, r0a1: u288 { limb0: 0x7c5938adaf38b355092de1f1, limb1: 0x292ab08995b293abfcba14b, limb2: 0x1fd126a2b9f37c67, }, r1a0: u288 { limb0: 0x6e9d352b02a7cb771fcc33f9, limb1: 0x7754d8536eefda2025a07340, limb2: 0x1840289291c35a72, }, r1a1: u288 { limb0: 0xe85f465417b7bd758c547b2e, limb1: 0xf7f703c3bc55ff8a01fa9365, limb2: 0xfa301227880a841, }, }, G2Line { r0a0: u288 { limb0: 0xfd7198d8b21c7b14a5a143d, limb1: 0x8cfa979dc7cb9fc44b348243, limb2: 0x63df00df9d13158, }, r0a1: u288 { limb0: 0x6f0fce584dccf2bc6a2b7552, limb1: 0x1b140d497e17a65153b219a2, limb2: 0x10ce2826fd679062, }, r1a0: u288 { limb0: 0x53e1e3344c706d1e560c5848, limb1: 0x2fa5fabbfc7c3a2615b2edbf, limb2: 0x16281a4a9dddf9a0, }, r1a1: u288 { limb0: 0x66e7e5216001704b0e0cf4b5, limb1: 0xa7bf2855a1a1d4f010d62c, limb2: 0x2e81a3b58efb5b08, }, }, G2Line { r0a0: u288 { limb0: 0x4e69b18988e940ef04764973, limb1: 0x1359ec39c9bfbf237b166375, limb2: 0x210592c1052c27c4, }, r0a1: u288 { limb0: 0x96ff351bb35e280c44fdff2, limb1: 0x17cde5251799ae4c9022bf5d, limb2: 0x27db21da13d1b0f1, }, r1a0: u288 { limb0: 0x4491b38fa37fdd7f6044b9e9, limb1: 0x75b95dbf3d52c45e79c49bd, limb2: 0x2f3d051a55a02089, }, r1a1: u288 { limb0: 0xaacb5301c0579fc0d0fd11f6, limb1: 0xa5a84b967b1bc3836f19eb3e, limb2: 0x119eb30fec7d8cf2, }, }, G2Line { r0a0: u288 { limb0: 0xa4058149e82ea51362b79be4, limb1: 0x734eba2621918a820ae44684, limb2: 0x110a314a02272b1, }, r0a1: u288 { limb0: 0xe2b43963ef5055df3c249613, limb1: 0x409c246f762c0126a1b3b7b7, limb2: 0x19aa27f34ab03585, }, r1a0: u288 { limb0: 0x179aad5f620193f228031d62, limb1: 0x6ba32299b05f31b099a3ef0d, limb2: 0x157724be2a0a651f, }, r1a1: u288 { limb0: 0xa33b28d9a50300e4bbc99137, limb1: 0x262a51847049d9b4d8cea297, limb2: 0x189acb4571d50692, }, }, G2Line { r0a0: u288 { limb0: 0x8d47b10c98dad29569e9ddea, limb1: 0xb64d4b555fe1f7efc7bfbb27, limb2: 0x5f15cd7b11de5c9, }, r0a1: u288 { limb0: 0xc2de52b36d1b7805208b5e05, limb1: 0x8f26ade6ec9af59c5c53bce3, limb2: 0x10d8927ecd55e636, }, r1a0: u288 { limb0: 0xb284f891bdbbe56c8cd8b1df, limb1: 0x561c9fd87f0c37ff58a351d8, limb2: 0xe724a52a68b9517, }, r1a1: u288 { limb0: 0xc0dd13ed0ff288dc9d2a6b09, limb1: 0x134704230fe887e73929097d, limb2: 0x1357c0d4f1c13f2a, }, }, G2Line { r0a0: u288 { limb0: 0x29bd4381ae4afc677ee37ed6, limb1: 0x29ed43453f9a008d9176f004, limb2: 0x24134eb915104f43, }, r0a1: u288 { limb0: 0x81597f82bb67e90a3e72bdd2, limb1: 0xab3bbde5f7bbb4df6a6b5c19, limb2: 0x19ac61eea40a367c, }, r1a0: u288 { limb0: 0xe30a79342fb3199651aee2fa, limb1: 0xf500f028a73ab7b7db0104a3, limb2: 0x808b50e0ecb5e4d, }, r1a1: u288 { limb0: 0x55f2818453c31d942444d9d6, limb1: 0xf6dd80c71ab6e893f2cf48db, limb2: 0x13c3ac4488abd138, }, }, G2Line { r0a0: u288 { limb0: 0x2db454bb8a3ad67349a0fbf3, limb1: 0x602d5a16aa797251acc2cefa, limb2: 0x375d59376b3a7f9, }, r0a1: u288 { limb0: 0x5878afce6b152e235c5f6903, limb1: 0x90ef180ae111c1f2c33f005a, limb2: 0x13ffb21961cc2f98, }, r1a0: u288 { limb0: 0xefc6feb49cef1713c1b90d99, limb1: 0x9d88fa75495a84c8fc058292, limb2: 0xe600d88bc38add5, }, r1a1: u288 { limb0: 0x21b0fbb2002056263f11d13a, limb1: 0x8818f85658929c2a3fc48ce8, limb2: 0xa5f20f85c67e36f, }, }, G2Line { r0a0: u288 { limb0: 0xd1464269bbeafa546f559b8f, limb1: 0xab7f7dcd1ac32b86979471cf, limb2: 0x6a38256ee96f113, }, r0a1: u288 { limb0: 0xf14d50984e65f9bc41df4e7e, limb1: 0x350aff9be6f9652ad441a3ad, limb2: 0x1b1e60534b0a6aba, }, r1a0: u288 { limb0: 0x9e98507da6cc50a56f023849, limb1: 0xcf8925e03f2bb5c1ba0962dd, limb2: 0x2b18961810a62f87, }, r1a1: u288 { limb0: 0x3a4c61b937d4573e3f2da299, limb1: 0x6f4c6c13fd90f4edc322796f, limb2: 0x13f4e99b6a2f025e, }, }, G2Line { r0a0: u288 { limb0: 0xc10f4c88a98b0d61d708002e, limb1: 0x4ac3d70224f191b0e0d2853a, limb2: 0x1fa4ccc4d95b80c6, }, r0a1: u288 { limb0: 0x17236a7e35ee2ab3b4f06f07, limb1: 0xf35f3bd072613ded87027ae0, limb2: 0x2101c31ea458ce27, }, r1a0: u288 { limb0: 0x5bc8589aa3dd32a141953938, limb1: 0x9d90f13527d79e8e5acebcb0, limb2: 0x178688523ab3c6c0, }, r1a1: u288 { limb0: 0xe90a7e5cf5d0984ee96bdde3, limb1: 0x29d8991e5e746709556196f9, limb2: 0x17f632c106ca4945, }, }, G2Line { r0a0: u288 { limb0: 0xe0115a79120ae892a72f3dcb, limb1: 0xec67b5fc9ea414a4020135f, limb2: 0x1ee364e12321904a, }, r0a1: u288 { limb0: 0xa74d09666f9429c1f2041cd9, limb1: 0x57ffe0951f863dd0c1c2e97a, limb2: 0x154877b2d1908995, }, r1a0: u288 { limb0: 0xcbe5e4d2d2c91cdd4ccca0, limb1: 0xe6acea145563a04b2821d120, limb2: 0x18213221f2937afb, }, r1a1: u288 { limb0: 0xfe20afa6f6ddeb2cb768a5ae, limb1: 0x1a3b509131945337c3568fcf, limb2: 0x127b5788263a927e, }, }, G2Line { r0a0: u288 { limb0: 0x12001d91db931ce66e88e1b6, limb1: 0x74e3d114c62a197de1ca3725, limb2: 0x268f10b41d839cb9, }, r0a1: u288 { limb0: 0x37fa067815b37c30a270d0eb, limb1: 0xde1184e5735eed8c75c61138, limb2: 0x2e915a3aef5d480c, }, r1a0: u288 { limb0: 0xa52e8ba088de9dad4ad62373, limb1: 0x144382b24e1957b51ef45581, limb2: 0x18ca358adc06316f, }, r1a1: u288 { limb0: 0xf3a419830f1d63011c7d18fc, limb1: 0x69a8c6e679dae84b49ef21eb, limb2: 0x3002b7eaffec547f, }, }, G2Line { r0a0: u288 { limb0: 0xe7c658aecdab4db3c83f7927, limb1: 0xfbf162264ca04ee50c70bde8, limb2: 0x2a20f4565b7ff885, }, r0a1: u288 { limb0: 0x45b1c2f0a1226361f42683c0, limb1: 0x9acdd892c48c08de047296bc, limb2: 0x27836373108925d4, }, r1a0: u288 { limb0: 0xc0ea9294b345e6d4892676a7, limb1: 0xcba74eca77086af245d1606e, limb2: 0xf20edac89053e72, }, r1a1: u288 { limb0: 0x4c92a28f2779a527a68a938c, limb1: 0x3a1c3c55ff9d20eac109fab3, limb2: 0x21c4a8c524b1ee7d, }, }, G2Line { r0a0: u288 { limb0: 0xe417e1af22c27b08f77c9a24, limb1: 0xe9f25ac1fc093df8757d4423, limb2: 0x10cb27cc61842200, }, r0a1: u288 { limb0: 0x95b53ca4e1a1e1b25b252a11, limb1: 0x5dbfc89db58efed8c8889fad, limb2: 0x2c1f157b89793de1, }, r1a0: u288 { limb0: 0x5c365567188422646a2ce946, limb1: 0xd06ee3bc533f8050606b64b2, limb2: 0x10f2edab2c241eee, }, r1a1: u288 { limb0: 0x929065a65c64cf7eb2724de0, limb1: 0xc6c085722c084f8086b9bf0, limb2: 0x9d2ef06935d37d9, }, }, G2Line { r0a0: u288 { limb0: 0xa68021d593c46246af22559e, limb1: 0x5c2cfc5bc4cd1b48f4704134, limb2: 0x296066ede1298f8c, }, r0a1: u288 { limb0: 0xfe17dd6765eb9b9625eb6a84, limb1: 0x4e35dd8e8f6088bb14299f8d, limb2: 0x1a380ab2689106e4, }, r1a0: u288 { limb0: 0x82bacf337ca09853df42bc59, limb1: 0xa15de4ef34a30014c5a2e9ae, limb2: 0x243cc0cec53c778b, }, r1a1: u288 { limb0: 0xcb2a1bf18e3ba9349b0a8bf2, limb1: 0x35134b2505cbb5a4c91f0ac4, limb2: 0x25e45206b13f43c4, }, }, G2Line { r0a0: u288 { limb0: 0x8e97b007ffd9891bd0e77650, limb1: 0x77671278ac33f17df6b1db88, limb2: 0x243daddc47f5d5c2, }, r0a1: u288 { limb0: 0x655fe4c8bbe5ee06aaa0054b, limb1: 0xf751450b02c93c7ddea95938, limb2: 0x21aa988e950d563f, }, r1a0: u288 { limb0: 0xb51b3b6b8582de3eb0549518, limb1: 0x84a1031766b7e465f5bbf40c, limb2: 0xd46c2d5b95e5532, }, r1a1: u288 { limb0: 0x50b6ddd8a5eef0067652191e, limb1: 0x298832a0bc46ebed8bff6190, limb2: 0xb568b4fe8311f93, }, }, G2Line { r0a0: u288 { limb0: 0xbb5cbeceb2f246e13d86b7e, limb1: 0xb8a224bd5eb5bf0ac661280d, limb2: 0x1f31873419815e8c, }, r0a1: u288 { limb0: 0xd539fdf65481b6a1d5363447, limb1: 0xd45b0e4c8fd5912ff6acc054, limb2: 0x1ad52c09bbb45a6a, }, r1a0: u288 { limb0: 0x18c54bae51814ad31a7637dc, limb1: 0x7399f2997ab65363f4b07657, limb2: 0x14ca110b944d53ee, }, r1a1: u288 { limb0: 0xdf5b710c160fda77b78d1963, limb1: 0x5610ab09a6b6f9785b0d5e31, limb2: 0x2bd8363dac7d0d6d, }, }, G2Line { r0a0: u288 { limb0: 0xb9a036825faa86e558ac3b7c, limb1: 0xde8e05942227a45439a04aba, limb2: 0x15e0173a1220d16f, }, r0a1: u288 { limb0: 0x76187085a6d0013ddc40c1b7, limb1: 0xdfb11818eaa5468e457b1a66, limb2: 0x2caa10f9c375fdad, }, r1a0: u288 { limb0: 0x947c4c0963d9d0f7879bdd6, limb1: 0x833b3e8ccc4dae2807240bac, limb2: 0xbd0a0ccace988f5, }, r1a1: u288 { limb0: 0x5d05c4f7170655b9e64a98c9, limb1: 0xa96f0f8887a475547c9fb49d, limb2: 0xf5c467cc50f5ca8, }, }, G2Line { r0a0: u288 { limb0: 0xddb4db99db681d35f71a159c, limb1: 0xf71a330019414e6fdee75700, limb2: 0x14d9838e7d1918bb, }, r0a1: u288 { limb0: 0x203c8bac71951a5f2c653710, limb1: 0x9fc93f8da38ecc2957313982, limb2: 0x7b6d981259cabd9, }, r1a0: u288 { limb0: 0xa7297cdb5be0cc45d48ca6af, limb1: 0xa07b4b025ebe6c960eddfc56, limb2: 0xef2a5c30ef00652, }, r1a1: u288 { limb0: 0xb7f05c76d860e9122b36ecd7, limb1: 0x407d6522e1f9ce2bcbf80eda, limb2: 0x197625a558f32c36, }, }, G2Line { r0a0: u288 { limb0: 0x2439cf9215808554cb12e63b, limb1: 0x3c7e2319b82d818d33777496, limb2: 0xfecef34cf6a529a, }, r0a1: u288 { limb0: 0xb9ebc2e1b201650cfe389c58, limb1: 0xdd5693c4da9af85799b6f077, limb2: 0x52803678bcf37d4, }, r1a0: u288 { limb0: 0xb7a5621c2bfa839aec6bcda6, limb1: 0xfda43823873c0833aeb28bd6, limb2: 0xfb92522965f5d4d, }, r1a1: u288 { limb0: 0x4ba0ec0f60464b07f207b70d, limb1: 0x6926f82ebb1480439708f64e, limb2: 0x1577548c5fc31c26, }, }, G2Line { r0a0: u288 { limb0: 0xb0f04df9dec94801e48a6ff7, limb1: 0xdc59d087c627d38334e5b969, limb2: 0x3d36e11420be053, }, r0a1: u288 { limb0: 0xc80f070001aa1586189e0215, limb1: 0xff849fcbbbe7c00c83ab5282, limb2: 0x2a2354b2882706a6, }, r1a0: u288 { limb0: 0x48cf70c80f08b6c7dc78adb2, limb1: 0xc6632efa77b36a4a1551d003, limb2: 0xc2d3533ece75879, }, r1a1: u288 { limb0: 0x63e82ba26617416a0b76ddaa, limb1: 0xdaceb24adda5a049bed29a50, limb2: 0x1a82061a3344043b, }, }, G2Line { r0a0: u288 { limb0: 0x35d6a47eb6e3946877b8faa4, limb1: 0x3226b4af47aefd8d27f573ce, limb2: 0xfc0eff6a2b8b60, }, r0a1: u288 { limb0: 0xdd6a357e6537b879eeb96e5c, limb1: 0x5c1adf10968f6e6f920f4ed, limb2: 0x398dff2b4ff6d14, }, r1a0: u288 { limb0: 0xd686f20c60c2d5e4bc95779c, limb1: 0x19250d0528a15c4610e5879b, limb2: 0x2fd84429a7cd5ce, }, r1a1: u288 { limb0: 0xb6467442d2b7537c06de1ee1, limb1: 0xc638febd171b2a5fe230ba46, limb2: 0x130f3130328340b3, }, }, G2Line { r0a0: u288 { limb0: 0x9152fecf0f523415acc7c7be, limb1: 0xd9632cbfccc4ea5d7bf31177, limb2: 0x2d7288c5f8c83ab1, }, r0a1: u288 { limb0: 0x53144bfe4030f3f9f5efda8, limb1: 0xfeec394fbf392b11c66bae27, limb2: 0x28840813ab8a200b, }, r1a0: u288 { limb0: 0xdec3b11fbc28b305d9996ec7, limb1: 0x5b5f8d9d17199e149c9def6e, limb2: 0x10c1a149b6751bae, }, r1a1: u288 { limb0: 0x665e8eb7e7d376a2d921c889, limb1: 0xfdd76d06e46ee1a943b8788d, limb2: 0x8bb21d9960e837b, }, }, G2Line { r0a0: u288 { limb0: 0x3a67c28a175200e631aa506a, limb1: 0x7397303a34968ff17c06e801, limb2: 0x1b81e0c63123688b, }, r0a1: u288 { limb0: 0x3490cfd4f076c621dac4a12c, limb1: 0xec183578c91b90b72e5887b7, limb2: 0x179fb354f608da00, }, r1a0: u288 { limb0: 0x9322bde2044dde580a78ba33, limb1: 0xfc74821b668d3570cad38f8b, limb2: 0x8cec54a291f5e57, }, r1a1: u288 { limb0: 0xc2818b6a9530ee85d4b2ae49, limb1: 0x8d7b651ad167f2a43d7a2d0a, limb2: 0x7c9ca9bab0ffc7f, }, }, G2Line { r0a0: u288 { limb0: 0xc274e231d1af08db19d9587b, limb1: 0x835ea4ada618598e54401f91, limb2: 0xea45e2ca1303f7c, }, r0a1: u288 { limb0: 0xc3db7f0268aea6734f3a6c08, limb1: 0x5a4a35f6f081ec00f9f82eb6, limb2: 0x132df163db52471d, }, r1a0: u288 { limb0: 0x61dbd840ad68b3b9fac00f32, limb1: 0x86a31d757749fc9418afc019, limb2: 0x2ee9f85e4c10ad58, }, r1a1: u288 { limb0: 0xf307238e66d8d61123d0c511, limb1: 0x9701297c75163ffce50e8dbb, limb2: 0x779fa2df58f46e4, }, }, G2Line { r0a0: u288 { limb0: 0x6ddfe3fe6e09660af859f4fb, limb1: 0x7ee4d91145f672775128aa1e, limb2: 0x30039ee28acdda42, }, r0a1: u288 { limb0: 0x3e6a40be2e258f27abaeac43, limb1: 0x13f1e6c56b5854c7873d5147, limb2: 0x25294aeee7c6f83c, }, r1a0: u288 { limb0: 0xe24ce9b2af200251507b7ddc, limb1: 0xaa6119bab54437145b0ffb72, limb2: 0x723436cc5e0ba3f, }, r1a1: u288 { limb0: 0x7423e1cd29046ca866701a4a, limb1: 0xde637f730d8996e4a46cf668, limb2: 0x2462acb26100a370, }, }, G2Line { r0a0: u288 { limb0: 0xa576408f8300de3a7714e6ae, limb1: 0xe1072c9a16f202ecf37fbc34, limb2: 0x1b0cb1e2b5871263, }, r0a1: u288 { limb0: 0x2128e2314694b663286e231e, limb1: 0x54bea71957426f002508f715, limb2: 0x36ecc5dbe069dca, }, r1a0: u288 { limb0: 0x17c77cd88f9d5870957850ce, limb1: 0xb7f4ec2bc270ce30538fe9b8, limb2: 0x766279e588592bf, }, r1a1: u288 { limb0: 0x1b6caddf18de2f30fa650122, limb1: 0x40b77237a29cada253c126c6, limb2: 0x74ff1349b1866c8, }, }, G2Line { r0a0: u288 { limb0: 0xe460e0022fd982dd65e52c43, limb1: 0xc3133a12d43813345194194a, limb2: 0x122345e30b232d2c, }, r0a1: u288 { limb0: 0xb99c2ae2112a808f231ccfd5, limb1: 0x33a214c9658724f45321f3cb, limb2: 0x4b19649cd727708, }, r1a0: u288 { limb0: 0x7679f8b3e3b1cb4437b82b6a, limb1: 0x6d58389da15334f63e2ef997, limb2: 0x21cbedc6cce1d5d1, }, r1a1: u288 { limb0: 0x87ee5132496c29a159d1c039, limb1: 0x254b650562ef412646742be3, limb2: 0x272e27a277a60f1b, }, }, G2Line { r0a0: u288 { limb0: 0x3603266e05560becab36faef, limb1: 0x8c3b88c9390278873dd4b048, limb2: 0x24a715a5d9880f38, }, r0a1: u288 { limb0: 0xe9f595b111cfd00d1dd28891, limb1: 0x75c6a392ab4a627f642303e1, limb2: 0x17b34a30def82ab6, }, r1a0: u288 { limb0: 0xe706de8f35ac8372669fc8d3, limb1: 0x16cc7f4032b3f3ebcecd997d, limb2: 0x166eba592eb1fc78, }, r1a1: u288 { limb0: 0x7d584f102b8e64dcbbd1be9, limb1: 0x2ead4092f009a9c0577f7d3, limb2: 0x2fe2c31ee6b1d41e, }, }, G2Line { r0a0: u288 { limb0: 0x72253d939632f8c28fb5763, limb1: 0x9b943ab13cad451aed1b08a2, limb2: 0xdb9b2068e450f10, }, r0a1: u288 { limb0: 0x80f025dcbce32f6449fa7719, limb1: 0x8a0791d4d1ed60b86e4fe813, limb2: 0x1b1bd5dbce0ea966, }, r1a0: u288 { limb0: 0xaa72a31de7d815ae717165d4, limb1: 0x501c29c7b6aebc4a1b44407f, limb2: 0x464aa89f8631b3a, }, r1a1: u288 { limb0: 0x6b8d137e1ea43cd4b1f616b1, limb1: 0xdd526a510cc84f150cc4d55a, limb2: 0x1da2ed980ebd3f29, }, }, G2Line { r0a0: u288 { limb0: 0x4cd2646eabd4d5cff32052a6, limb1: 0x83d7e83c6f09aeefde86fc60, limb2: 0x1fc1e7c446ee815a, }, r0a1: u288 { limb0: 0x3a1a9e52b334c520eb55ff6b, limb1: 0x20d356b0b9123715a827c7b, limb2: 0xa8f15019ec6f24b, }, r1a0: u288 { limb0: 0x3562c1467de42a724ad3840d, limb1: 0xea424d9d7016d3203fda5249, limb2: 0x20d6afd1fb5725cd, }, r1a1: u288 { limb0: 0x72cdbd431057bcb0623d79, limb1: 0x2a173bad85c78751480984dc, limb2: 0xc3f6e7bbb16c7ac, }, }, G2Line { r0a0: u288 { limb0: 0xcc9b9f22372562a0913012cc, limb1: 0x4653a2ba5e6adf2aa8c3bdfc, limb2: 0x172d0e92a7ba9f75, }, r0a1: u288 { limb0: 0x2dddd736f3f3bace91f4b424, limb1: 0xfd210f553d0f4aa73b3ff14c, limb2: 0x85f5ae434eac7ab, }, r1a0: u288 { limb0: 0x8fe12ea5bbfc97bf316e3937, limb1: 0xf172bba1b5323c01413ff4a3, limb2: 0xbeebca688f99c40, }, r1a1: u288 { limb0: 0xf95c55ffa6c4b017804f8324, limb1: 0xe6e3bb6dfaa2bd6e1da7766c, limb2: 0x136c1ff2a96eccab, }, }, G2Line { r0a0: u288 { limb0: 0x867cced8a010850958f41ff5, limb1: 0x6a37fdb2b8993eed18bafe8e, limb2: 0x21b9f782109e5a7, }, r0a1: u288 { limb0: 0x7307477d650618e66de38d0f, limb1: 0xacb622ce92a7e393dbe10ba1, limb2: 0x236e70838cee0ed5, }, r1a0: u288 { limb0: 0xb564a308aaf5dda0f4af0f0d, limb1: 0x55fc71e2f13d8cb12bd51e74, limb2: 0x294cf115a234a9e9, }, r1a1: u288 { limb0: 0xbd166057df55c135b87f35f3, limb1: 0xf9f29b6c50f1cce9b85ec9b, limb2: 0x2e8448d167f20f96, }, }, G2Line { r0a0: u288 { limb0: 0xcaa6d4115cc70a8bbc8baf78, limb1: 0xbda798d59aad11d74f87989d, limb2: 0xc366e4f74f33072, }, r0a1: u288 { limb0: 0xd148a96ac857a95fa9c98b72, limb1: 0x61012b08f12dc78ec4bece91, limb2: 0x2b97ec9eb164657f, }, r1a0: u288 { limb0: 0x2dbd7565ab717dab4038b4b5, limb1: 0xe36861232766618a7949cd7d, limb2: 0x2689d0706676707e, }, r1a1: u288 { limb0: 0x70f62db7654a24ab3cc7aa17, limb1: 0x760f6520439ffd75cefc2022, limb2: 0x1f1579d08acb1da, }, }, G2Line { r0a0: u288 { limb0: 0xdedaff3205bb953b2c390b8a, limb1: 0xe1a899da21c1dafb485c707e, limb2: 0x1ec897e7a041493e, }, r0a1: u288 { limb0: 0xf52c3c30cd4d3202b34089e0, limb1: 0xc652aa1ff533e1aad7532305, limb2: 0x2a1df766e5e3aa2e, }, r1a0: u288 { limb0: 0x7ac695d3e19d79b234daaf3d, limb1: 0x5ce2f92666aec92a650feee1, limb2: 0x21ab4fe20d978e77, }, r1a1: u288 { limb0: 0xa64a913a29a1aed4e0798664, limb1: 0x66bc208b511503d127ff5ede, limb2: 0x2389ba056de56a8d, }, }, G2Line { r0a0: u288 { limb0: 0x5b9d278de289476b42c772c1, limb1: 0x5fc336c4466561dae92c0a7a, limb2: 0x22e43f58103642de, }, r0a1: u288 { limb0: 0x614e554ee2047bd39ee9e569, limb1: 0x89f6a3f450e6ad4c75bf3b7c, limb2: 0x17f3f358f3208e2, }, r1a0: u288 { limb0: 0xd6914fc96e46bb5166f2a8c7, limb1: 0x7ab0a8d25eb1ce99339eb4f3, limb2: 0x26d50123983410a5, }, r1a1: u288 { limb0: 0x66f5a6fa34156df9ed454e7e, limb1: 0x8dea13b19d2b448228c489fe, limb2: 0x221b0f1b3cf1b5b0, }, }, G2Line { r0a0: u288 { limb0: 0xd88b16e68600a12e6c1f6006, limb1: 0x333243b43d3b7ff18d0cc671, limb2: 0x2b84b2a9b0f03ed8, }, r0a1: u288 { limb0: 0xf3e2b57ddaac822c4da09991, limb1: 0xd7c894b3fe515296bb054d2f, limb2: 0x10a75e4c6dddb441, }, r1a0: u288 { limb0: 0x73c65fbbb06a7b21b865ac56, limb1: 0x21f4ecd1403bb78729c7e99b, limb2: 0xaf88a160a6b35d4, }, r1a1: u288 { limb0: 0xade61ce10b8492d659ff68d0, limb1: 0x1476e76cf3a8e0df086ad9eb, limb2: 0x2e28cfc65d61e946, }, }, G2Line { r0a0: u288 { limb0: 0xdf8b54b244108008e7f93350, limb1: 0x2ae9a68b9d6b96f392decd6b, limb2: 0x160b19eed152271c, }, r0a1: u288 { limb0: 0xc18a8994cfbb2e8df446e449, limb1: 0x408d51e7e4adedd8f4f94d06, limb2: 0x27661b404fe90162, }, r1a0: u288 { limb0: 0x1390b2a3b27f43f7ac73832c, limb1: 0x14d57301f6002fd328f2d64d, limb2: 0x17f3fa337367dddc, }, r1a1: u288 { limb0: 0x79cab8ff5bf2f762c5372f80, limb1: 0xc979d6f385fae4b5e4785acf, limb2: 0x60c5307a735b00f, }, }, G2Line { r0a0: u288 { limb0: 0x905277068fc2a9eaf4022c94, limb1: 0x484667d98d38e5a129e1e41, limb2: 0x1e555bb230565f19, }, r0a1: u288 { limb0: 0xf91934891dadaf69ceb2783, limb1: 0x8d865e297806a5e7b924b2b0, limb2: 0x15f3c40b57125de6, }, r1a0: u288 { limb0: 0x8ece4f147f09da0dd81f7bd9, limb1: 0x362f0e81d6c7c4a91a7d9c05, limb2: 0x12cb92de7484a836, }, r1a1: u288 { limb0: 0x1b36ed01861dad86c8fe7719, limb1: 0xa0d402159346e6f0b467ad73, limb2: 0x3cdab1b7cf2b2b1, }, }, G2Line { r0a0: u288 { limb0: 0xb3356ac66981416a87728e37, limb1: 0xf763adf54bfe038e4f3120cd, limb2: 0x128c2fb7ac0f6fdc, }, r0a1: u288 { limb0: 0x16fdbb3373e3a04996380f4d, limb1: 0xa69f830696258682eacddd88, limb2: 0xece01e036560157, }, r1a0: u288 { limb0: 0x7a7f4318f4415556a1d9704a, limb1: 0x36ed351a6cbff887d265d32d, limb2: 0xb467b7eb44b98d9, }, r1a1: u288 { limb0: 0xed0a5e62d5d68a37e829b892, limb1: 0x791ec430bf872c680fd3aee9, limb2: 0x2b6dfd84fd2335e, }, }, G2Line { r0a0: u288 { limb0: 0x386d7b23c6dccb87637018c9, limb1: 0xfed2ea478e9a2210289079e2, limb2: 0x100aa83cb843353e, }, r0a1: u288 { limb0: 0x229c5c285f049d04c3dc5ce7, limb1: 0x28110670fe1d38c53ffcc6f7, limb2: 0x1778918279578f50, }, r1a0: u288 { limb0: 0xe9ad2c7b8a17a1f1627ff09d, limb1: 0xedff5563c3c3e7d2dcc402ec, limb2: 0xa8bd6770b6d5aa8, }, r1a1: u288 { limb0: 0x66c5c1aeed5c04470b4e8a3d, limb1: 0x846e73d11f2d18fe7e1e1aa2, limb2: 0x10a60eabe0ec3d78, }, }, G2Line { r0a0: u288 { limb0: 0x7d050d3f6b11d66c1d7938d3, limb1: 0x7c56af94f183f725117d86dd, limb2: 0x1a7dc5625ba0d800, }, r0a1: u288 { limb0: 0x85c3d95f9bdb74dc2df32d60, limb1: 0x2ce48e3c8dfbfb4d4598bd15, limb2: 0x15d12571292df44f, }, r1a0: u288 { limb0: 0xed4859f84410cebb78050aa, limb1: 0x19cc122e96cb959c7d8c9f9f, limb2: 0xf8236b851f0c821, }, r1a1: u288 { limb0: 0x4c517c69569fcf0586fb8351, limb1: 0x7fe39e8e6a6fb9b4e7461cca, limb2: 0x2aa8100976400cca, }, }, G2Line { r0a0: u288 { limb0: 0x88ca191d85be1f6c205257ef, limb1: 0xd0cecf5c5f80926c77fd4870, limb2: 0x16ec42b5cae83200, }, r0a1: u288 { limb0: 0x154cba82460752b94916186d, limb1: 0x564f6bebac05a4f3fb1353ac, limb2: 0x2d47a47da836d1a7, }, r1a0: u288 { limb0: 0xb39c4d6150bd64b4674f42ba, limb1: 0x93c967a38fe86f0779bf4163, limb2: 0x1a51995a49d50f26, }, r1a1: u288 { limb0: 0xeb7bdec4b7e304bbb0450608, limb1: 0x11fc9a124b8c74b3d5560ea4, limb2: 0xbfa9bd7f55ad8ac, }, }, G2Line { r0a0: u288 { limb0: 0x19a47ae9837b17ed7766dc46, limb1: 0x287abc763db12ac0b6d544e4, limb2: 0x2d924e29dde311b8, }, r0a1: u288 { limb0: 0x7fb0ee7335115e02db2bfd2d, limb1: 0x8aba5ed4254d66ebbc36b1a7, limb2: 0x12e289ec35af915b, }, r1a0: u288 { limb0: 0x1d5bda2d04c26274095e86ba, limb1: 0xa0403a6836764d9347154ac1, limb2: 0x1e6c670b3e18fdcd, }, r1a1: u288 { limb0: 0x749725dd346d879ecd2ec6e9, limb1: 0x823aa726897471f6e984295a, limb2: 0x143d734b04f6993b, }, }, G2Line { r0a0: u288 { limb0: 0x2fdc574c85cf0c0ce5e07a51, limb1: 0xd2439bf7b00bddc4cfb01b0c, limb2: 0x125c3bbdeb0bd2da, }, r0a1: u288 { limb0: 0x9d664714bae53cafcb5ef55d, limb1: 0x495c01724790853548f5e4de, limb2: 0x2ce5e2e263725941, }, r1a0: u288 { limb0: 0x98071eb7fe88c9124aee3774, limb1: 0xc3f66947a52bd2f6d520579f, limb2: 0x2eaf775dbd52f7d3, }, r1a1: u288 { limb0: 0x23e5594948e21db2061dca92, limb1: 0xd0ffa6f6c77290531c185431, limb2: 0x604c085de03afb1, }, }, G2Line { r0a0: u288 { limb0: 0x3352ea0d65d65ebdd17519aa, limb1: 0x8b9da99137040f85a8864a04, limb2: 0xa372112cdf0a7c2, }, r0a1: u288 { limb0: 0x5b96ba3359a8de70a5695d09, limb1: 0x7a097725a4c6f484a2766b2, limb2: 0x2a71ba7f8ded5c34, }, r1a0: u288 { limb0: 0x761550b61d41fb97ebadae02, limb1: 0xe6829d1e928b580c3abbefa0, limb2: 0x46f25685bfc35a8, }, r1a1: u288 { limb0: 0x2c25f70377990a68d8759910, limb1: 0x471894defdadfedf22c0bafb, limb2: 0x2ab4916c3bc05768, }, }, G2Line { r0a0: u288 { limb0: 0xeec2912e15f6bda39d4e005e, limb1: 0x2b8610c44d27bdbc6ba2aac5, limb2: 0x78ddc4573fc1fed, }, r0a1: u288 { limb0: 0x48099a0da11ea21de015229d, limb1: 0x5fe937100967d5cc544f4af1, limb2: 0x2c9ffe6d7d7e9631, }, r1a0: u288 { limb0: 0xa70d251296ef1ae37ceb7d03, limb1: 0x2adadcb7d219bb1580e6e9c, limb2: 0x180481a57f22fd03, }, r1a1: u288 { limb0: 0xacf46db9631037dd933eb72a, limb1: 0x8a58491815c7656292a77d29, limb2: 0x261e3516c348ae12, }, }, G2Line { r0a0: u288 { limb0: 0x8d8f24f69ae85e21e752729f, limb1: 0x4a35e040036039c8b7ca8b20, limb2: 0x7fecda8f0555a5f, }, r0a1: u288 { limb0: 0xba227b6219fbafd98a0685c6, limb1: 0x5767306795e9ffe9dab73eb0, limb2: 0xcb264c99750f1af, }, r1a0: u288 { limb0: 0x47b66cce1b80c3fe69fa1b2b, limb1: 0x6108b3a8db500ebc0c3effe1, limb2: 0x1973e255653c37fd, }, r1a1: u288 { limb0: 0x9837f3fa5fed8ec21af731a1, limb1: 0x3ad9b937919f2a9068fab4f, limb2: 0x13db07c0d16823df, }, }, G2Line { r0a0: u288 { limb0: 0x2bfa32f0a09c3e2cfb8f6a38, limb1: 0x7a24df3ff3c7119a59d49318, limb2: 0x10e42281d64907ba, }, r0a1: u288 { limb0: 0xce42177a66cdeb4207d11e0c, limb1: 0x3322aa425a9ca270152372ad, limb2: 0x2f7fa83db407600c, }, r1a0: u288 { limb0: 0x62a8ff94fd1c7b9035af4446, limb1: 0x3ad500601bbb6e7ed1301377, limb2: 0x254d253ca06928f, }, r1a1: u288 { limb0: 0xf8f1787cd8e730c904b4386d, limb1: 0x7fd3744349918d62c42d24cc, limb2: 0x28a05e105d652eb8, }, }, G2Line { r0a0: u288 { limb0: 0x6ef31e059d602897fa8e80a8, limb1: 0x66a0710847b6609ceda5140, limb2: 0x228c0e568f1eb9c0, }, r0a1: u288 { limb0: 0x7b47b1b133c1297b45cdd79b, limb1: 0x6b4f04ed71b58dafd06b527b, limb2: 0x13ae6db5254df01a, }, r1a0: u288 { limb0: 0xbeca2fccf7d0754dcf23ddda, limb1: 0xe3d0bcd7d9496d1e5afb0a59, limb2: 0x305a0afb142cf442, }, r1a1: u288 { limb0: 0x2d299847431477c899560ecf, limb1: 0xbcd9e6c30bedee116b043d8d, limb2: 0x79473a2a7438353, }, }, G2Line { r0a0: u288 { limb0: 0x4c3d4c9736611ed8fb1d9271, limb1: 0x1ad8304567218f83e6629715, limb2: 0x1e2998ef42e3bd93, }, r0a1: u288 { limb0: 0x6058da5c0e33f3bb91f1ccdc, limb1: 0x85fd873aae33fd9827f11b70, limb2: 0x988a3b4c890f6ed, }, r1a0: u288 { limb0: 0xcd745c1fa813f0f824992107, limb1: 0x41350289a79b1428b321549f, limb2: 0x18e8b3780c7e35b0, }, r1a1: u288 { limb0: 0xea70ff019228aeef72c9e3fc, limb1: 0x4b003c67445395584152ba28, limb2: 0x13f07e9a64bf528e, }, }, G2Line { r0a0: u288 { limb0: 0x4fa8f98d7bd0604e5d5b49c0, limb1: 0xfe9fc0738cfdf0d23a42711f, limb2: 0x1568a39cad4154c, }, r0a1: u288 { limb0: 0x8471afa248283ad06c4db529, limb1: 0x9447b93c68733a150e76e5d0, limb2: 0x13b3b7131a3847ad, }, r1a0: u288 { limb0: 0x9c866d6940a2068b8d87af80, limb1: 0x1470ea8951d66e29138578ed, limb2: 0x15a3f7cc0cba7976, }, r1a1: u288 { limb0: 0x20066a7aec98ccd59adcabc, limb1: 0x865be6476878d559602a0b65, limb2: 0x22c7d2f27c5da091, }, }, G2Line { r0a0: u288 { limb0: 0x65b71fe695e7ccd4b460dace, limb1: 0xa6ceba62ef334e6fe91301d5, limb2: 0x299f578d0f3554e6, }, r0a1: u288 { limb0: 0xaf781dd030a274e7ecf0cfa4, limb1: 0x2095020d373a14d7967797aa, limb2: 0x6a7f9df6f185bf8, }, r1a0: u288 { limb0: 0x8e91e2dba67d130a0b274df3, limb1: 0xe192a19fce285c12c6770089, limb2: 0x6e9acf4205c2e22, }, r1a1: u288 { limb0: 0xbcd5c206b5f9c77d667189bf, limb1: 0x656a7e2ebc78255d5242ca9, limb2: 0x25f43fec41d2b245, }, }, G2Line { r0a0: u288 { limb0: 0x872323fa18de52d2b738cd1, limb1: 0x6a848834793291e5f134b761, limb2: 0x1419be04db8c1168, }, r0a1: u288 { limb0: 0x80407871d8b9dd1778465b6, limb1: 0x2df09786d9e41dd2770f8848, limb2: 0x17daa86ff58088b8, }, r1a0: u288 { limb0: 0x7d8a012d087be15cc7485f00, limb1: 0xc377bd58ce9c87034730c675, limb2: 0x1f5cb7e6d6c127a3, }, r1a1: u288 { limb0: 0x5f5cb76761c71c418877f0da, limb1: 0x860abc859349f556b5d7ba6b, limb2: 0x14ae2383286f589e, }, }, G2Line { r0a0: u288 { limb0: 0x4e56e6733cce20d9c5b16d96, limb1: 0xc7ef260535fb75b9d3e089f, limb2: 0x292dd4aa636e7729, }, r0a1: u288 { limb0: 0x6e7e1038b336f36519c9faaf, limb1: 0x3c66bd609510309485e225c7, limb2: 0x10cacac137411eb, }, r1a0: u288 { limb0: 0x4a3e8b96278ac092fe4f3b15, limb1: 0xba47e583e2750b42f93c9631, limb2: 0x125da6bd69495bb9, }, r1a1: u288 { limb0: 0xae7a56ab4b959a5f6060d529, limb1: 0xc3c263bfd58c0030c063a48e, limb2: 0x2f4d15f13fae788c, }, }, G2Line { r0a0: u288 { limb0: 0x301e0885c84d273b6d323124, limb1: 0x11fd5c75e269f7a30fa4154f, limb2: 0x19afdcfdcce2fc0d, }, r0a1: u288 { limb0: 0x3d13519f934526be815c38b0, limb1: 0xd43735909547da73838874fc, limb2: 0x255d8aca30f4e0f6, }, r1a0: u288 { limb0: 0x90a505b76f25a3396e2cea79, limb1: 0x3957a2d0848c54b9079fc114, limb2: 0x1ba0cd3a9fe6d4bb, }, r1a1: u288 { limb0: 0xc47930fba77a46ebb1db30a9, limb1: 0x993a1cb166e9d40bebab02b2, limb2: 0x1deb16166d48118b, }, }, G2Line { r0a0: u288 { limb0: 0x5be18af9475ec81c90435ea3, limb1: 0x572d85787941ccf2a06e8a85, limb2: 0x1d266e4c2bbec23d, }, r0a1: u288 { limb0: 0x9abb04ade2ec32d45ad1e12e, limb1: 0x49001b1fe108f35c59463a58, limb2: 0x8d9758e803867dc, }, r1a0: u288 { limb0: 0x6a6fc3406f463fab5c090723, limb1: 0xa5448526ae4526bffd1b66f9, limb2: 0x1f2fd6943b4af50c, }, r1a1: u288 { limb0: 0xdefebeb5f133576a36ff1ec7, limb1: 0x3ac5b194dc32605f842a4ee4, limb2: 0x14dac2b182561bf1, }, }, G2Line { r0a0: u288 { limb0: 0xb3f4a06dec84c0542fc584f3, limb1: 0x17dd8ec2b5040175db54f522, limb2: 0x1798d49900134630, }, r0a1: u288 { limb0: 0x5804e0e6f05b2d114f8fc628, limb1: 0xcd413fa41667528622a63385, limb2: 0x1b2f6ee6c09efee2, }, r1a0: u288 { limb0: 0x411cc5e5d5a9650eb8ab4151, limb1: 0x2578d1120f3a7491374cca05, limb2: 0xc7339e3f4da0dfc, }, r1a1: u288 { limb0: 0xc5be52b91b24f9781785f0b6, limb1: 0x5a37f2d250cba3528432a971, limb2: 0x1e671b7e0f46542a, }, }, G2Line { r0a0: u288 { limb0: 0xb15bbaec50ff49d30e49f74a, limb1: 0xc90a8c79fb045c5468f14151, limb2: 0x25e47927e92df0e3, }, r0a1: u288 { limb0: 0x57f66909d5d40dfb8c7b4d5c, limb1: 0xea5265282e2139c48c1953f2, limb2: 0x2d7f5e6aff2381f6, }, r1a0: u288 { limb0: 0x2a2f573b189a3c8832231394, limb1: 0x738abc15844895ffd4733587, limb2: 0x20aa11739c4b9bb4, }, r1a1: u288 { limb0: 0x51695ec614f1ff4cce2f65d1, limb1: 0x6765aae6cb895a2406a6dd7e, limb2: 0x1126ee431c522da0, }, }, G2Line { r0a0: u288 { limb0: 0x9606a8fd4c578ad51c41d233, limb1: 0x2690e48ffb5f365373a1f091, limb2: 0xdd50bed38cb96c5, }, r0a1: u288 { limb0: 0x63b3ed215339675ba0f1bf0e, limb1: 0xb6b4e56bce1950607175b381, limb2: 0x1c995e2e67d6ea05, }, r1a0: u288 { limb0: 0x4fc66decf75dc3b1b5d8f7f6, limb1: 0x87158d4f7fd6a4a06ccf675a, limb2: 0xcc9b78c3687df9b, }, r1a1: u288 { limb0: 0xd0606aae6c5defaa7213f850, limb1: 0x389176022636fccde16f423d, limb2: 0x6e06f2476a14caa, }, }, G2Line { r0a0: u288 { limb0: 0x9214fc3209f1518b05fd21c6, limb1: 0x9bc8ce4f56423009710770e8, limb2: 0x32445cc6972799c, }, r0a1: u288 { limb0: 0x93ef401ecd9cfae3644d22e6, limb1: 0xce5a741a9847a144cfaf8c96, limb2: 0xf7a814d5726da4a, }, r1a0: u288 { limb0: 0xd19264d986f163b133a91c0c, limb1: 0x529dc5ce4b193c0f672c6a32, limb2: 0x2e9a118959353374, }, r1a1: u288 { limb0: 0x3d97d6e8f45072cc9e85e412, limb1: 0x4dafecb04c3bb23c374f0486, limb2: 0xa174dd4ac8ee628, }, }, G2Line { r0a0: u288 { limb0: 0xb6c5442fe553f87d4f922a6d, limb1: 0xecb5da9f4f147b627dcdd817, limb2: 0x265099b47c79df0, }, r0a1: u288 { limb0: 0x44d6aa0608f80fd2926679d1, limb1: 0xb0985b03442413e8c592e084, limb2: 0x2a27582793f6ec08, }, r1a0: u288 { limb0: 0x9cb8bba4d80765686c460fb9, limb1: 0xca96945fb24c35d97e414e79, limb2: 0x2d579095df0481ae, }, r1a1: u288 { limb0: 0x3cbb12a18adf878065bef682, limb1: 0xa80055f23c8cf9db20621287, limb2: 0x23166dcd4d1d60b8, }, }, G2Line { r0a0: u288 { limb0: 0x98d8b0c4adcf27bceb305c2c, limb1: 0x859afa9c7668ed6152d8cba3, limb2: 0x29e7694f46e3a272, }, r0a1: u288 { limb0: 0x1d970845365594307ba97556, limb1: 0xd002d93ad793e154afe5b49b, limb2: 0x12ca77d3fb8eee63, }, r1a0: u288 { limb0: 0x9f2934faefb8268e20d0e337, limb1: 0xbc4b5e1ec056881319f08766, limb2: 0x2e103461759a9ee4, }, r1a1: u288 { limb0: 0x7adc6cb87d6b43000e2466b6, limb1: 0x65e5cefa42b25a7ee8925fa6, limb2: 0x2560115898d7362a, }, }, G2Line { r0a0: u288 { limb0: 0x3e32a97160ba590f8477262a, limb1: 0x58f608cc4f024f332af3dc84, limb2: 0x2ea79ee82a69dca1, }, r0a1: u288 { limb0: 0x769cbde6b95b9539f653a482, limb1: 0x8a97f58029c72cd2e8bd157b, limb2: 0x231881d71d090c10, }, r1a0: u288 { limb0: 0x96ee714152f58446623381bc, limb1: 0x3420b725a86b137722463ae9, limb2: 0x1a1196cb42508616, }, r1a1: u288 { limb0: 0xaa1685e2b271783a5ca3032b, limb1: 0xaaaefd9edd79d87a225f1981, limb2: 0x1bdcf987a5b8df95, }, }, G2Line { r0a0: u288 { limb0: 0x64d864643668392c0e357cc4, limb1: 0x4c9bf66853f1b287015ab84c, limb2: 0x2f5f1b92ad7ee4d4, }, r0a1: u288 { limb0: 0xdc33c8da5c575eef6987a0e1, limb1: 0x51cc07c7ef28e1b8d934bc32, limb2: 0x2358d94a17ec2a44, }, r1a0: u288 { limb0: 0xf659845b829bbba363a2497b, limb1: 0x440f348e4e7bed1fb1eb47b2, limb2: 0x1ad0eaab0fb0bdab, }, r1a1: u288 { limb0: 0x1944bb6901a1af6ea9afa6fc, limb1: 0x132319df135dedddf5baae67, limb2: 0x52598294643a4aa, }, }, G2Line { r0a0: u288 { limb0: 0x76fd94c5e6f17fa6741bd7de, limb1: 0xc2e0831024f67d21013e0bdd, limb2: 0x21e2af6a43119665, }, r0a1: u288 { limb0: 0xad290eab38c64c0d8b13879b, limb1: 0xdd67f881be32b09d9a6c76a0, limb2: 0x8000712ce0392f2, }, r1a0: u288 { limb0: 0xd30a46f4ba2dee3c7ace0a37, limb1: 0x3914314f4ec56ff61e2c29e, limb2: 0x22ae1ba6cd84d822, }, r1a1: u288 { limb0: 0x5d888a78f6dfce9e7544f142, limb1: 0x9439156de974d3fb6d6bda6e, limb2: 0x106c8f9a27d41a4f, }, }, G2Line { r0a0: u288 { limb0: 0xccc51c0b8c2b880bedb67e69, limb1: 0xe9f784ec67907a367b707a68, limb2: 0x1e35ff4c250d3874, }, r0a1: u288 { limb0: 0xacd642ea141735c86a2632fd, limb1: 0x96f30bd849416ec9c2ba51d3, limb2: 0x5f80ff0bb5c3d3a, }, r1a0: u288 { limb0: 0xdae6620b2dea1022c6b469d, limb1: 0x2dc227e830c6a53a0a25de16, limb2: 0x26419eb1ffc2ecc, }, r1a1: u288 { limb0: 0x2a5f072722aa48f17e4e62e8, limb1: 0x5e2d84dc0619f32bf61069ea, limb2: 0x2a9c754f2c69c22f, }, }, G2Line { r0a0: u288 { limb0: 0x2f21e0778a693efad56332f1, limb1: 0x5e0c280a34256b55cee88c6f, limb2: 0x193d0a513d46a271, }, r0a1: u288 { limb0: 0xbd7e454376dd0af2d423917b, limb1: 0x360968bd4949aebffdb38b61, limb2: 0x272c13f48382cde5, }, r1a0: u288 { limb0: 0xef13637247749cd7ed5af935, limb1: 0xa75937c16210e74805454829, limb2: 0x20c95f5b97f7c964, }, r1a1: u288 { limb0: 0xd45ec00ea7d9b50619a68b06, limb1: 0xeceac81ee86a4441c708de28, limb2: 0x1171c3953d8cc236, }, }, G2Line { r0a0: u288 { limb0: 0x92c09e4796207b802168341b, limb1: 0xd2d9d6acffd7829066cc49ce, limb2: 0xc89c2d0a7b2c81e, }, r0a1: u288 { limb0: 0x47e3c1cf6cdb6f3efe778c7f, limb1: 0x66b347099b6436794cf062eb, limb2: 0x18b4ccc64ae0a857, }, r1a0: u288 { limb0: 0x7d5793606a73b2740c71484a, limb1: 0xa0070135ca2dc571b28e3c9c, limb2: 0x1bc03576e04b94cf, }, r1a1: u288 { limb0: 0x1ba85b29875e638c10f16c99, limb1: 0x158f2f2acc3c2300bb9f9225, limb2: 0x42d8a8c36ea97c6, }, }, G2Line { r0a0: u288 { limb0: 0xa8acc4cfbba1bf079026d2eb, limb1: 0x857c16b222c18dee6e550f0d, limb2: 0x485868d6e02d3da, }, r0a1: u288 { limb0: 0xf9277c3cd01668e151c989d1, limb1: 0x96acc5c1180c14277e7e37ff, limb2: 0x1cc26eeaa7bef1e8, }, r1a0: u288 { limb0: 0x8df631d1435e16921239d61c, limb1: 0xb6a0bfe28ec3ad068221088e, limb2: 0x1006ca3de092710c, }, r1a1: u288 { limb0: 0x72e0bfa73d019b269033979b, limb1: 0xfa12478f48ea99607baf21ca, limb2: 0x2813a5311545749, }, }, G2Line { r0a0: u288 { limb0: 0x9440ad13408319cecb07087b, limb1: 0x537afc0c0cfe8ff761c24e08, limb2: 0x48e4ac10081048d, }, r0a1: u288 { limb0: 0xa37fb82b03a2c0bb2aa50c4f, limb1: 0xd3797f05c8fb84f6b630dfb, limb2: 0x2dffde2d6c7e43ff, }, r1a0: u288 { limb0: 0xc55d2eb1ea953275e780e65b, limb1: 0xe141cf680cab57483c02e4c7, limb2: 0x1b71395ce5ce20ae, }, r1a1: u288 { limb0: 0xe4fab521f1212a1d301065de, limb1: 0x4f8d31c78df3dbe4ab721ef2, limb2: 0x2828f21554706a0e, }, }, G2Line { r0a0: u288 { limb0: 0x8cefc2f2af2a3082b790784e, limb1: 0x97ac13b37c6fbfc736a3d456, limb2: 0x683b1cdffd60acd, }, r0a1: u288 { limb0: 0xa266a8188a8c933dcffe2d02, limb1: 0x18d3934c1838d7bce81b2eeb, limb2: 0x206ac5cdda42377, }, r1a0: u288 { limb0: 0x90332652437f6e177dc3b28c, limb1: 0x75bd8199433d607735414ee8, limb2: 0x29d6842d8298cf7e, }, r1a1: u288 { limb0: 0xadedf46d8ea11932db0018e1, limb1: 0xbc7239ae9d1453258037befb, limb2: 0x22e7ebdd72c6f7a1, }, }, G2Line { r0a0: u288 { limb0: 0xfe5ce198530e6e5e428ed7b2, limb1: 0xf5ddb0194d7a5e2c8ae0e004, limb2: 0x1ff33fa41a2219b8, }, r0a1: u288 { limb0: 0xd40273c44e451086853d5c0c, limb1: 0x8196328a49b3e57f1aa97f3a, limb2: 0xa65be2b86cb6cc2, }, r1a0: u288 { limb0: 0xee7e8e5603eb2987c03aad20, limb1: 0x8d1836c2944f14d62304e3ce, limb2: 0x23aec3995836284f, }, r1a1: u288 { limb0: 0x44f63dede0bab74447432434, limb1: 0xbc242707481e3421608e7484, limb2: 0x12cbfde9472f6129, }, }, G2Line { r0a0: u288 { limb0: 0x66e6518a789e643f2fe0adf8, limb1: 0x9e041475138e52b7d6ba273f, limb2: 0x29738d09b3c3aa2d, }, r0a1: u288 { limb0: 0xd1953d4aaaccbb14a05ce666, limb1: 0xb6d92c0103e2eb840c035099, limb2: 0x163fbc494cd5fbd7, }, r1a0: u288 { limb0: 0x8326000670635a008221d45c, limb1: 0xc68e2c1fde55cf6dea31ebf2, limb2: 0x112136de2bcb8814, }, r1a1: u288 { limb0: 0xd91f410c6e215358b08e3761, limb1: 0x562ad42a0ab380ced5be614e, limb2: 0x2e6307ece4da28b7, }, }, G2Line { r0a0: u288 { limb0: 0x348e15357d9299e582033136, limb1: 0x53578c46b15abb39da35a56e, limb2: 0x1043b711f86bb33f, }, r0a1: u288 { limb0: 0x9fa230a629b75217f0518e7c, limb1: 0x77012a4bb8751322a406024d, limb2: 0x121e2d845d972695, }, r1a0: u288 { limb0: 0x5600f2d51f21d9dfac35eb10, limb1: 0x6fde61f876fb76611fb86c1a, limb2: 0x2bf4fbaf5bd0d0df, }, r1a1: u288 { limb0: 0xd732aa0b6161aaffdae95324, limb1: 0xb3c4f8c3770402d245692464, limb2: 0x2a0f1740a293e6f0, }, }, G2Line { r0a0: u288 { limb0: 0xc119366343bb90cfbb6b9f59, limb1: 0xf0f4051e5e2ec1d270a24519, limb2: 0x20641b4fd703bcc3, }, r0a1: u288 { limb0: 0x62c9da6fce0da9722dbdd4d, limb1: 0x9a55da1b4d9e1720ef695988, limb2: 0x27e055d89e9b5c22, }, r1a0: u288 { limb0: 0x60b613aa5ffe7a0b312af762, limb1: 0xb6e419e3349fcd626b912362, limb2: 0x1e94385fbd0dabc1, }, r1a1: u288 { limb0: 0x285da06db745c401161f5dbd, limb1: 0x1bac165aff4fc8fb01e05c73, limb2: 0xaf6d157ef87e3e8, }, }, G2Line { r0a0: u288 { limb0: 0xa9e2efa41aaa98ab59728940, limb1: 0x163c0425f66ce72daef2f53e, limb2: 0x2feaf1b1770aa7d8, }, r0a1: u288 { limb0: 0x3bb7afd3c0a79b6ac2c4c063, limb1: 0xee5cb42e8b2bc999e312e032, limb2: 0x1af2071ae77151c3, }, r1a0: u288 { limb0: 0x1cef1c0d8956d7ceb2b162e7, limb1: 0x202b4af9e51edfc81a943ded, limb2: 0xc9e943ffbdcfdcb, }, r1a1: u288 { limb0: 0xe18b1b34798b0a18d5ad43dd, limb1: 0x55e8237731941007099af6b8, limb2: 0x1472c0290db54042, }, }, G2Line { r0a0: u288 { limb0: 0x5d89d98abb1e14ee40991eb8, limb1: 0xd25c670d7cc0d9e15998c064, limb2: 0x2b88eb10af0a7936, }, r0a1: u288 { limb0: 0xb0dbbad1655c7012f1443855, limb1: 0xba3c8a0898f276368f7de179, limb2: 0x13f1970118681271, }, r1a0: u288 { limb0: 0xd5229b51e340a01bdf1597bb, limb1: 0xd083b17bb74a2d66e3fb7703, limb2: 0x1fb6b2e9b110b510, }, r1a1: u288 { limb0: 0x7d5334985a52a20b9c42dba2, limb1: 0x43ce2272331ede659a1ff0ce, limb2: 0xc641156a71d87fd, }, }, G2Line { r0a0: u288 { limb0: 0xb4c7963e0d1dc082de0725e, limb1: 0x375a7a3d765918de24804223, limb2: 0xf177b77b031596d, }, r0a1: u288 { limb0: 0x87a7b9c5f10500b0b40d7a1e, limb1: 0x6f234d1dc7f1394b55858810, limb2: 0x26288146660a3914, }, r1a0: u288 { limb0: 0xa6308c89cebe40447abf4a9a, limb1: 0x657f0fdda13b1f8ee314c22, limb2: 0x1701aabc250a9cc7, }, r1a1: u288 { limb0: 0x9db9bf660dc77cbe2788a755, limb1: 0xbdf9c1c15a4bd502a119fb98, limb2: 0x14b4de3d26bd66e1, }, }, G2Line { r0a0: u288 { limb0: 0x53c49c62ca96007e14435295, limb1: 0x85aeb885e4123ca8d3232fdf, limb2: 0x750017ce108abf3, }, r0a1: u288 { limb0: 0xba6bf3e25d370182e4821239, limb1: 0x39de83bf370bd2ba116e8405, limb2: 0x2b8417a72ba6d940, }, r1a0: u288 { limb0: 0xa922f50550d349849b14307b, limb1: 0x569766b6feca6143a5ddde9d, limb2: 0x2c3c6765b25a01d, }, r1a1: u288 { limb0: 0x6016011bdc3b506563b0f117, limb1: 0xbab4932beab93dde9b5b8a5c, limb2: 0x1bf3f698de0ace60, }, }, G2Line { r0a0: u288 { limb0: 0x7754330fba8d9edd1fd085f1, limb1: 0x540da38cbcf9967f1643fa83, limb2: 0x10041a58b44d7033, }, r0a1: u288 { limb0: 0xe61863c0b32f056dd86bff8f, limb1: 0x6f0906f4c8ec2c0bb1f2f8ac, limb2: 0x12c8eb56d7345658, }, r1a0: u288 { limb0: 0x83db9f45eed4202ecff4be38, limb1: 0x7d4fb28ab7beedbd993663a9, limb2: 0x140bcf4fc3e627d5, }, r1a1: u288 { limb0: 0x24bf73a83ec1526eba35c3a1, limb1: 0x49f611dd3e7158df3d710450, limb2: 0x46bfbe767839086, }, }, G2Line { r0a0: u288 { limb0: 0x3a005fa4b568804c37599fab, limb1: 0x1dbc187d120e8654c667d416, limb2: 0x26f1a3ff5dedd43c, }, r0a1: u288 { limb0: 0x9e3bbd13c68b59154325f840, limb1: 0x127142f3a8f8d48ac0ba0e8, limb2: 0x22114246f18dc553, }, r1a0: u288 { limb0: 0xb0c427f7dc2ad19fae159a8d, limb1: 0x43cdfbe4e4688353690b625d, limb2: 0x11de9941593cdedf, }, r1a1: u288 { limb0: 0x2bc192a0466c146b0f1a63c5, limb1: 0xa06ae4a5aeb9c79ff9605a68, limb2: 0x1c72897ef64ed3be, }, }, G2Line { r0a0: u288 { limb0: 0xb9f05ffda3ee208f990ff3a8, limb1: 0x6201d08440b28ea672b9ea93, limb2: 0x1ed60e5a5e778b42, }, r0a1: u288 { limb0: 0x8e8468b937854c9c00582d36, limb1: 0x7888fa8b2850a0c555adb743, limb2: 0xd1342bd01402f29, }, r1a0: u288 { limb0: 0xf5c4c66a974d45ec754b3873, limb1: 0x34322544ed59f01c835dd28b, limb2: 0x10fe4487a871a419, }, r1a1: u288 { limb0: 0xedf4af2df7c13d6340069716, limb1: 0x8592eea593ece446e8b2c83b, limb2: 0x12f9280ce8248724, }, }, G2Line { r0a0: u288 { limb0: 0x2bea0074bb7f17895214c7d5, limb1: 0xbe6933bf702502fb784d01af, limb2: 0x6ee13677c0ad1fb, }, r0a1: u288 { limb0: 0x7ba822d78fbb7499ec4a0bd5, limb1: 0xfd0ef51891aaf641c59ddff6, limb2: 0x7ea3e5374ce185e, }, r1a0: u288 { limb0: 0xfa9c6c209da4cec9ff566b61, limb1: 0xf81313708ccdb696e83d4f2f, limb2: 0x1a188c142bfa4eea, }, r1a1: u288 { limb0: 0xa2753b4de51c3790b55b4081, limb1: 0x770a5d6993f8efcfbef79cfe, limb2: 0xe66a0c0eb7f55d, }, }, G2Line { r0a0: u288 { limb0: 0xe67f72c6d45f1bb04403139f, limb1: 0x9233e2a95d3f3c3ff2f7e5b8, limb2: 0x1f931e8e4343b028, }, r0a1: u288 { limb0: 0x20ef53907af71803ce3ca5ca, limb1: 0xd99b6637ee9c73150b503ea4, limb2: 0x1c9759def8a98ea8, }, r1a0: u288 { limb0: 0xa0a3b24c9089d224822fad53, limb1: 0xdfa2081342a7a895062f3e50, limb2: 0x185e8cf6b3e494e6, }, r1a1: u288 { limb0: 0x8752a12394b29d0ba799e476, limb1: 0x1493421da067a42e7f3d0f8f, limb2: 0x67e7fa3e3035edf, }, }, G2Line { r0a0: u288 { limb0: 0x800f37efa40c0fe115a48c7, limb1: 0x4ee2180ba804ad1127a1032c, limb2: 0x8d02f7a21511b4d, }, r0a1: u288 { limb0: 0x7732462537e4c83fbdf9e250, limb1: 0xf043e87195d99c09dfd19257, limb2: 0x13a5f2a36b471d20, }, r1a0: u288 { limb0: 0x90a69629898539061531a3d4, limb1: 0xfb1bfbd5aafaa2bca4a7d88a, limb2: 0x4c80e61af9357b9, }, r1a1: u288 { limb0: 0xa6bd67fe9bcb18eef3d498f5, limb1: 0xc9d9f001d0a22a8561f2a8f6, limb2: 0x2fc5dbc2e7f7bae1, }, }, G2Line { r0a0: u288 { limb0: 0x6d6138c95464e5e774ae7ba0, limb1: 0xe6ca73a5498e4ccd4bb68fc7, limb2: 0x15bf8aa8ed1beff6, }, r0a1: u288 { limb0: 0xabd7c55a134ed405b4966d3c, limb1: 0xe69dd725ccc4f9dd537fe558, limb2: 0x2df4a03e2588a8f1, }, r1a0: u288 { limb0: 0x7cf42890de0355ffc2480d46, limb1: 0xe33c2ad9627bcb4b028c2358, limb2: 0x2a18767b40de20bd, }, r1a1: u288 { limb0: 0x79737d4a87fab560f3d811c6, limb1: 0xa88fee5629b91721f2ccdcf7, limb2: 0x2b51c831d3404d5e, }, }, G2Line { r0a0: u288 { limb0: 0x997c6c49f6cfe7b57ed6a795, limb1: 0x83f751adb017f8fe16cb1332, limb2: 0x421893391c31a08, }, r0a1: u288 { limb0: 0x8881c1e22322290da9e0adda, limb1: 0xd279d9d315f84c72d3d7ca8d, limb2: 0x161e57b3c2bd69ca, }, r1a0: u288 { limb0: 0x2a00b9a30f468603c234683d, limb1: 0x3335abc142f64cb623384c71, limb2: 0x247f21d5ac0ad015, }, r1a1: u288 { limb0: 0x791eb4f0258d141246133ad8, limb1: 0x2e227e5de8c27b9270bf3679, limb2: 0x252ff1bf56426314, }, }, G2Line { r0a0: u288 { limb0: 0x9812f6145cf7e949fa207f20, limb1: 0x4061c36b08d5bcd408b14f19, limb2: 0x8332e08b2eb51ed, }, r0a1: u288 { limb0: 0xa4a7ae8f65ba180c523cb33, limb1: 0xb71fabbdc78b1128712d32a5, limb2: 0x2acd1052fd0fefa7, }, r1a0: u288 { limb0: 0x6ea5598e221f25bf27efc618, limb1: 0xa2c2521a6dd8f306f86d6db7, limb2: 0x13af144288655944, }, r1a1: u288 { limb0: 0xea469c4b390716a6810fff5d, limb1: 0xf8052694d0fdd3f40b596c20, limb2: 0x24d0ea6c86e48c5c, }, }, G2Line { r0a0: u288 { limb0: 0x2e39be614d904bafea58a8cd, limb1: 0xf53f0a6a20a1f1783b0ea2d0, limb2: 0x99c451b7bb726d7, }, r0a1: u288 { limb0: 0x28ec54a4ca8da838800c573d, limb1: 0xb78365fa47b5e192307b7b87, limb2: 0x2df87aa88e012fec, }, r1a0: u288 { limb0: 0xfb7022881c6a6fdfb18de4aa, limb1: 0xb9bd30f0e93c5b93ad333bab, limb2: 0x1dd20cbccdeb9924, }, r1a1: u288 { limb0: 0x16d8dfdf790a6be16a0e55ba, limb1: 0x90ab884395509b9a264472d4, limb2: 0xeaec571657b6e9d, }, }, G2Line { r0a0: u288 { limb0: 0xae592cfc7284eace4317b38f, limb1: 0x41aa2fd0f201ea2488aae4cd, limb2: 0x2d7c9fa788a19387, }, r0a1: u288 { limb0: 0x30fade520b7c5ad891fcd5e4, limb1: 0x726c4b2c0ab14b4824d6eb51, limb2: 0x2cbeb397ae3adbaf, }, r1a0: u288 { limb0: 0x7754c7f9eb971c83580a6802, limb1: 0xc0501999d5fbbfecb742e62a, limb2: 0x2886be745478c5eb, }, r1a1: u288 { limb0: 0xbbd01f31b4c7270f1874d615, limb1: 0x2860e90555449cc5557a6eeb, limb2: 0xaa8bcd043216ae0, }, }, G2Line { r0a0: u288 { limb0: 0x1475f22439f945fe4f1866a4, limb1: 0x6093e054af08253105508201, limb2: 0x238fbceae0a52193, }, r0a1: u288 { limb0: 0x37b706045af36f96f3de74bf, limb1: 0x42d8a96440085e5a0602ffc8, limb2: 0x301cf8ab791f87ec, }, r1a0: u288 { limb0: 0x7dafe229ff600244975059d9, limb1: 0xc77f2c778fbc1edacf71ea1b, limb2: 0xfa04355fa70376b, }, r1a1: u288 { limb0: 0x4b111cf6a84eadb0ea9697a4, limb1: 0x485179b0613471ed941c408f, limb2: 0x1c04e5e709a3ee73, }, }, G2Line { r0a0: u288 { limb0: 0xce78fc6505db036c10fac771, limb1: 0x61f8c0bc7f60ad6415d5e419, limb2: 0x59009c5cf9ea663, }, r0a1: u288 { limb0: 0xb3b3f697fc34d64ba053b914, limb1: 0x317af5815ce5bfffc5a6bc97, limb2: 0x23f97fee4deda847, }, r1a0: u288 { limb0: 0xf559e09cf7a02674ac2fa642, limb1: 0x4fa7548b79cdd054e203689c, limb2: 0x2173b379d546fb47, }, r1a1: u288 { limb0: 0x758feb5b51caccff9da0f78f, limb1: 0xd7f37a1008233b74c4894f55, limb2: 0x917c640b4b9627e, }, }, G2Line { r0a0: u288 { limb0: 0x71a5b7371acb1f8a8e863a0f, limb1: 0xe160f090c89db8037b7b3270, limb2: 0x5dc19d479a9e0a1, }, r0a1: u288 { limb0: 0x268283362f9eaa2b1bfc7d37, limb1: 0x41dd0a500b275c341fadfdd1, limb2: 0x58dc210e5db63b, }, r1a0: u288 { limb0: 0x8c69e7aaedcd6f6d9bbb6eca, limb1: 0x9d2c3abb7be1d3e18bbbeea, limb2: 0x17821916435fc513, }, r1a1: u288 { limb0: 0x12e15214b9ff3b0a87d02275, limb1: 0xec528ff80882d2613d62f7af, limb2: 0x21d7cb7981a2c8ee, }, }, G2Line { r0a0: u288 { limb0: 0x72548e0d946b796842cfecd8, limb1: 0x78b54b355e3c26476b0fab82, limb2: 0x2dc9f32c90b6ba31, }, r0a1: u288 { limb0: 0xa943be83a6fc90414320753b, limb1: 0xd708fde97241095833ce5a08, limb2: 0x142111e6a73d2e82, }, r1a0: u288 { limb0: 0xc79e8d5465ec5f28781e30a2, limb1: 0x697fb9430b9ad050ced6cce, limb2: 0x1a9d647149842c53, }, r1a1: u288 { limb0: 0x9bab496952559362586725cd, limb1: 0xbe78e5a416d9665be64806de, limb2: 0x147b550afb4b8b84, }, }, G2Line { r0a0: u288 { limb0: 0x5a5b43c79c51930d0132f9e5, limb1: 0x84940e72e7f85b7410ad5959, limb2: 0x29ea8276c9dd2922, }, r0a1: u288 { limb0: 0x564fad8093496ec0264503f9, limb1: 0x8087865cbf262c46af83e11, limb2: 0xfb4782ff8819bc3, }, r1a0: u288 { limb0: 0xa14e0c681a92583584de7966, limb1: 0x9ee7630f508ee0abdbbf52de, limb2: 0x23502d641c894fe4, }, r1a1: u288 { limb0: 0x45697b4bda8746aaefc84de6, limb1: 0xbbbb95bac5f667348485280b, limb2: 0x14d11f2f3b102ea0, }, }, G2Line { r0a0: u288 { limb0: 0x1422e11013fe6cdd7f843391, limb1: 0xfb96092ab69fc530e27d8d8e, limb2: 0xe39e04564fedd0, }, r0a1: u288 { limb0: 0xbd4e81e3b4db192e11192788, limb1: 0x805257d3c2bdbc344a15ce0d, limb2: 0x10ddd4f47445106b, }, r1a0: u288 { limb0: 0x87ab7f750b693ec75bce04e1, limb1: 0x128ba38ebed26d74d26e4d69, limb2: 0x2f1d22a64c983ab8, }, r1a1: u288 { limb0: 0x74207c17f5c8335183649f77, limb1: 0x7144cd3520ac2e1be3204133, limb2: 0xb38d0645ab3499d, }, }, G2Line { r0a0: u288 { limb0: 0xfd4ccd25ca5305b5a0c8f08c, limb1: 0x5c9ab754a0f97eba493b22cf, limb2: 0x1ee3d126af282430, }, r0a1: u288 { limb0: 0x1650604310ad29b1ebe37a1c, limb1: 0xb8d6890fa276c5c89d0b87f6, limb2: 0x16187f2f98969294, }, r1a0: u288 { limb0: 0x9adb39a172e4b1392fe50508, limb1: 0x32a5696a6e93a3cc6a5ad2ef, limb2: 0x3010f0bed371d9ab, }, r1a1: u288 { limb0: 0x2178f739b0201a2f690222fb, limb1: 0xb1962d2f42010bff9c0acd0d, limb2: 0x12c651f9cff8bd2, }, }, G2Line { r0a0: u288 { limb0: 0x49173a889c697b0ab07f35bc, limb1: 0xdcffb65f4b4c21ced6b623af, limb2: 0x1366d12ee6022f7b, }, r0a1: u288 { limb0: 0x285fdce362f7a79b89c49b5c, limb1: 0xae9358c8eaf26e2fed7353f5, limb2: 0x21c91fefaf522b5f, }, r1a0: u288 { limb0: 0x748798f96436e3b18c64964a, limb1: 0xfc3bb221103d3966d0510599, limb2: 0x167859ae2ebc5e27, }, r1a1: u288 { limb0: 0xe3b55b05bb30e23fa7eba05b, limb1: 0xa5fc8b7f7bc6abe91c90ddd5, limb2: 0xe0da83c6cdebb5a, }, }, G2Line { r0a0: u288 { limb0: 0x30a4abff5957209783681bfb, limb1: 0x82d868d5ca421e4f1a0daf79, limb2: 0x1ba96ef98093d510, }, r0a1: u288 { limb0: 0xd9132c7f206a6c036a39e432, limb1: 0x8a2dfb94aba29a87046110b8, limb2: 0x1fad2fd5e5e37395, }, r1a0: u288 { limb0: 0x76b136dc82b82e411b2c44f6, limb1: 0xe405f12052823a54abb9ea95, limb2: 0xf125ba508c26ddc, }, r1a1: u288 { limb0: 0x1bae07f5f0cc48e5f7aac169, limb1: 0x47d1288d741496a960e1a979, limb2: 0xa0911f6cc5eb84e, }, }, G2Line { r0a0: u288 { limb0: 0xde53fa0e516e8521f9fd2218, limb1: 0xa8695dc7f4d9dc5cb20c5569, limb2: 0x26ae4f9889fdc9e9, }, r0a1: u288 { limb0: 0x8ec99c1251e3701a92712d94, limb1: 0xd7a4e59134a81563dde18e00, limb2: 0x12abf32b5f5fd295, }, r1a0: u288 { limb0: 0x3f40f6f544941079f98bbca1, limb1: 0x784e4af205d7ce81736a86e, limb2: 0x262955c2400f2cd9, }, r1a1: u288 { limb0: 0xad09121aa67be24e2a15e358, limb1: 0xf372de521bb4645145104e80, limb2: 0x204386f0cc534dc1, }, }, G2Line { r0a0: u288 { limb0: 0xb1a701becfac8ab4911bd3d5, limb1: 0x31059867e401e3c097e71713, limb2: 0x11f83ad520dbe146, }, r0a1: u288 { limb0: 0x89c187f73b3df55369b5bf87, limb1: 0x55cbff5d865ed9eee13a53e7, limb2: 0xdc789be8b591928, }, r1a0: u288 { limb0: 0x8fa833ccae2dee5a104910ab, limb1: 0x4f6d27d1caf11f4efaba2d99, limb2: 0x19a3a2baf9e9c654, }, r1a1: u288 { limb0: 0x2cba57223327aaa86463ab7b, limb1: 0x8c542ad2a8acedbae2dbcaef, limb2: 0xc6cc1c26b074f93, }, }, G2Line { r0a0: u288 { limb0: 0x2e7b3a5a35456f42e87968e6, limb1: 0xb4303f5093c3a460674a2fcd, limb2: 0x2b5331f03b8fa15f, }, r0a1: u288 { limb0: 0x7cea371d64d8bd0fc5b9427e, limb1: 0x76208e15fc175e352c274fbe, limb2: 0x5ceb46647d41234, }, r1a0: u288 { limb0: 0x6cdac06bfcf041a30435a560, limb1: 0x15a7ab7ed1df6d7ed12616a6, limb2: 0x2520b0f462ad4724, }, r1a1: u288 { limb0: 0xe8b65c5fff04e6a19310802f, limb1: 0xc96324a563d5dab3cd304c64, limb2: 0x230de25606159b1e, }, }, G2Line { r0a0: u288 { limb0: 0x7502eb9d6e34d48c8d6bd674, limb1: 0x75a76de3d24ae67c74c25ab9, limb2: 0x269c5fbce67ef3f7, }, r0a1: u288 { limb0: 0x18b64b67a0130324a775a54e, limb1: 0x510f1940ffe32b65eb777dbb, limb2: 0x1c67e2246d3e8b0e, }, r1a0: u288 { limb0: 0x751b9c3f410b7b8cc2554028, limb1: 0xaa415e864cedc338dd4f93c5, limb2: 0x15b0cb160799f8b5, }, r1a1: u288 { limb0: 0x431baa5aff5efafb3deb786d, limb1: 0x818f7f0c0cf08373d8497c20, limb2: 0x150266ce897a149b, }, }, G2Line { r0a0: u288 { limb0: 0xb2236e5462d1e11842039bb5, limb1: 0x8d746dd0bb8bb2a455d505c1, limb2: 0x2fd3f4a905e027ce, }, r0a1: u288 { limb0: 0x3d6d9836d71ddf8e3b741b09, limb1: 0x443f16e368feb4cb20a5a1ab, limb2: 0xb5f19dda13bdfad, }, r1a0: u288 { limb0: 0x4e5612c2b64a1045a590a938, limb1: 0xbca215d075ce5769db2a29d7, limb2: 0x161e651ebdfb5065, }, r1a1: u288 { limb0: 0xc02a55b6685351f24e4bf9c7, limb1: 0x4134240119050f22bc4991c8, limb2: 0x300bd9f8d76bbc11, }, }, G2Line { r0a0: u288 { limb0: 0xe9296a3a3aed4c4143d2e0ba, limb1: 0x7de973514b499b2da739b3e6, limb2: 0x1b4b807986fcdee0, }, r0a1: u288 { limb0: 0xb9295fecce961afe0c5e6dad, limb1: 0xc4e30c322bcae6d526c4de95, limb2: 0x1fee592f513ed6b2, }, r1a0: u288 { limb0: 0x7245f5e5e803d0d448fafe21, limb1: 0xcbdc032ecb3b7a63899c53d0, limb2: 0x1fde9ffc17accfc3, }, r1a1: u288 { limb0: 0x8edcc1b2fdd35c87a7814a87, limb1: 0x99d54b5c2fe171c49aa9cb08, limb2: 0x130ef740e416a6fe, }, }, G2Line { r0a0: u288 { limb0: 0x37b1d9f507e01f86b93547ea, limb1: 0x41ac3502f8b693b2f9ed1a29, limb2: 0x12d36862936402d, }, r0a1: u288 { limb0: 0xaade7b42e239d7be07481e78, limb1: 0x3f8243ee7eb4a9c3b7cbb956, limb2: 0xaf29236a909acbb, }, r1a0: u288 { limb0: 0xbfa7efb7457cc99dd4b66e37, limb1: 0x1aff3d917e026429380e9dc6, limb2: 0x87399bf2ca178f4, }, r1a1: u288 { limb0: 0x351e9fa186b018907f3dfd58, limb1: 0x7027b103c6f3030eb6f019b0, limb2: 0x288a941ff1ef82c8, }, }, G2Line { r0a0: u288 { limb0: 0x280d19be00a1fbb9ccaafb46, limb1: 0x4d694832b9452e3da1f121cd, limb2: 0x2a866c481e54b43e, }, r0a1: u288 { limb0: 0x94acc4d34d73a6813c99def3, limb1: 0x2e9a78d89158c8144f4a163d, limb2: 0x6a7ba87130777b1, }, r1a0: u288 { limb0: 0xa171b01ed37b9874fc4b2fd1, limb1: 0x644415f2fadd9f5572937ff, limb2: 0x188c19a6dbd348f6, }, r1a1: u288 { limb0: 0xa8b807a7d82b4ca8813e6c16, limb1: 0xd36395399fea43c401b55926, limb2: 0x1ebe1e6668036172, }, }, G2Line { r0a0: u288 { limb0: 0x537ecf0916b38aeea21d4e47, limb1: 0x181a00de27ba4be1b380d6c8, limb2: 0x8c2fe2799316543, }, r0a1: u288 { limb0: 0xe68fff5ee73364fff3fe403b, limb1: 0x7b8685c8a725ae79cfac8f99, limb2: 0x7b4be349766aba4, }, r1a0: u288 { limb0: 0xdf7c93c0095545ad5e5361ea, limb1: 0xce316c76191f1e7cd7d03f3, limb2: 0x22ea21f18ddec947, }, r1a1: u288 { limb0: 0xa19620b4c32db68cc1c2ef0c, limb1: 0xffa1e4be3bed5faba2ccbbf4, limb2: 0x16fc78a64c45f518, }, }, G2Line { r0a0: u288 { limb0: 0x2b6af476f520b4bf804415bc, limb1: 0xd949ee7f9e8874698b090fca, limb2: 0x34db5e5ec2180cf, }, r0a1: u288 { limb0: 0x3e06a324f038ac8abcfb28d7, limb1: 0xc2e6375b7a83c0a0145f8942, limb2: 0x2247e79161483763, }, r1a0: u288 { limb0: 0x708773d8ae3a13918382fb9d, limb1: 0xaf83f409556e32aa85ae92bf, limb2: 0x9af0a924ae43ba, }, r1a1: u288 { limb0: 0xa6fded212ff5b2ce79755af7, limb1: 0x55a2adfb2699ef5de6581b21, limb2: 0x2476e83cfe8daa5c, }, }, G2Line { r0a0: u288 { limb0: 0x732b1d0e86389fae1b305692, limb1: 0x5e1ed01fae18aa2d2e501b89, limb2: 0x198dc823ba823f13, }, r0a1: u288 { limb0: 0x395ecb34fbf15f7b72c54317, limb1: 0x19fb1bd9a5cabbf5eb248610, limb2: 0xb73bf1e6f4b2b31, }, r1a0: u288 { limb0: 0x69471a9ea2a3b85c26c836d9, limb1: 0xe814a8008320f1fe43f51f0a, limb2: 0x2d0070077956b257, }, r1a1: u288 { limb0: 0xc2ed008982c3b3a2381a1d13, limb1: 0x3aa758745a68a1c386ea1919, limb2: 0x1f719f31da901ffd, }, }, G2Line { r0a0: u288 { limb0: 0xa773ff432f3fcb587a0ba2dd, limb1: 0xa72f6d2ad27b55412047c8a2, limb2: 0x196c95f5075736cc, }, r0a1: u288 { limb0: 0x8d46b81c8d7815fb84f68477, limb1: 0x759aa3f94e1cbaff6069a0e0, limb2: 0x25349de9eb818c1b, }, r1a0: u288 { limb0: 0x7e987a2cbb6794ba7ad8226b, limb1: 0x37b8b1d26e87ac1cc75bc768, limb2: 0x1b6594b5683fb78c, }, r1a1: u288 { limb0: 0x6db02d761232580559059396, limb1: 0x4608f90f5be37fcf1ca05d00, limb2: 0x8280f225a44efb3, }, }, G2Line { r0a0: u288 { limb0: 0x1c4759bcf7c607fe3f839d4d, limb1: 0xea91f311da73327e2ed40785, limb2: 0x2017052c72360f42, }, r0a1: u288 { limb0: 0x38cf8a4368c0709980199fc3, limb1: 0xfc9047885996c19e84d7d4ea, limb2: 0x1795549eb0b97783, }, r1a0: u288 { limb0: 0xb70f7ecfbec0eaf46845e8cc, limb1: 0x9ddf274c2a9f89ea3bc4d66f, limb2: 0xcc6f106abfcf377, }, r1a1: u288 { limb0: 0xf6ff11ce29186237468c2698, limb1: 0x5c629ad27bb61e4826bb1313, limb2: 0x2014c6623f1fb55e, }, }, G2Line { r0a0: u288 { limb0: 0xeba6e51ec8e06f1a878b476b, limb1: 0xc701590aac4f7059ebebecc7, limb2: 0x178ad12f64b4cce0, }, r0a1: u288 { limb0: 0xd26c1a0c4cd1c5e42e3b29b1, limb1: 0x344935f56b019eefc0ae9366, limb2: 0x2ac2051a8e04afa1, }, r1a0: u288 { limb0: 0x5d6f37a0a446777c90c36deb, limb1: 0x2fb002f2be492ec5d334587f, limb2: 0x2300ad73e7a9475e, }, r1a1: u288 { limb0: 0x579a05a596e27b546604bf72, limb1: 0x9062b97873327607c1e5fce4, limb2: 0x2d3543a9b5a8d09, }, }, G2Line { r0a0: u288 { limb0: 0xc648054e4b6134bbfd68487f, limb1: 0xdf0506dad3f3d098c13a6386, limb2: 0x26bebeb6f46c2e8c, }, r0a1: u288 { limb0: 0x9d0cdb28a94204776c6e6ba6, limb1: 0x303f02dfe619752b1607951d, limb2: 0x1127d8b17ef2c064, }, r1a0: u288 { limb0: 0xe34ca1188b8db4e4694a696c, limb1: 0x243553602481d9b88ca1211, limb2: 0x1f8ef034831d0132, }, r1a1: u288 { limb0: 0xe3a5dfb1785690dad89ad10c, limb1: 0xd690b583ace24ba033dd23e0, limb2: 0x405d0709e110c03, }, }, G2Line { r0a0: u288 { limb0: 0xe64904238461826f7b9b6bd1, limb1: 0x7eef335c29c10b073c3c8df, limb2: 0x11ab7f696cecd13b, }, r0a1: u288 { limb0: 0xa4ee9a0489ebf368f8d5b7df, limb1: 0xfc2fb710377d3a9b68d87438, limb2: 0xbb582e949e0b05c, }, r1a0: u288 { limb0: 0x4942e63133bef00be3e86722, limb1: 0x159a6773262b5a5ffe915583, limb2: 0x26cb6b36d9d079a0, }, r1a1: u288 { limb0: 0x923f51c6ac50ef980fc5c63e, limb1: 0x7431352b389608ee374cc6f7, limb2: 0x205d7212a2bb155f, }, }, G2Line { r0a0: u288 { limb0: 0x72cc2cef2785ce4ff4e9b7af, limb1: 0x60ed5b9c207d7f31fb6234ab, limb2: 0x1bb17a4bc7b643ed, }, r0a1: u288 { limb0: 0x9424eb15b502cde7927c7530, limb1: 0xa0e33edbbaa9de8e9c206059, limb2: 0x2b9a3a63bbf4af99, }, r1a0: u288 { limb0: 0x423811cb6386e606cf274a3c, limb1: 0x8adcc0e471ecfe526f56dc39, limb2: 0x9169a8660d14368, }, r1a1: u288 { limb0: 0xf616c863890c3c8e33127931, limb1: 0xcc9414078a6da6989dae6b91, limb2: 0x594d6a7e6b34ab2, }, }, G2Line { r0a0: u288 { limb0: 0xd1ef4e012e4ddec967871f0c, limb1: 0x73a1f0eaa41d3b58b2410cc5, limb2: 0x678a431a3208d78, }, r0a1: u288 { limb0: 0x1182bff7a17bbcb072bce5d2, limb1: 0xe8d0894231092859c53b6a86, limb2: 0x2a8df47f9e66fa63, }, r1a0: u288 { limb0: 0xef6ef9aa3976f4dd18917f5a, limb1: 0x544992409f5d8c72277c40a5, limb2: 0x269adf40fda899e9, }, r1a1: u288 { limb0: 0x1272a877af1721f324764564, limb1: 0x9cfb207d93eef259ff85dd53, limb2: 0x1738f274efa92229, }, }, G2Line { r0a0: u288 { limb0: 0xf2d619ae78049bf9141c35cf, limb1: 0x717f8b10d469a1ee2d91f191, limb2: 0x2c72c82fa8afe345, }, r0a1: u288 { limb0: 0xb89321223b82a2dc793c0185, limb1: 0x71506a0cf4adb8e51bb7b759, limb2: 0x2c13b92a98651492, }, r1a0: u288 { limb0: 0x4947ef2c89276f77f9d20942, limb1: 0xb454d68685ab6b6976e71ec5, limb2: 0x19a938d0e78a3593, }, r1a1: u288 { limb0: 0xbe883eb119609b489c01c905, limb1: 0xaa06779922047f52feac5ce6, limb2: 0x76977a3015dc164, }, }, G2Line { r0a0: u288 { limb0: 0x43a96a588005043a46aadf2c, limb1: 0xa37b89d8a1784582f0c52126, limb2: 0x22e9ef3f5d4b2297, }, r0a1: u288 { limb0: 0x8c6f6d8474cf6e5a58468a31, limb1: 0xeb1ce6ac75930ef1c79b07e5, limb2: 0xf49839a756c7230, }, r1a0: u288 { limb0: 0x82b84693a656c8e8c1f962fd, limb1: 0x2c1c8918ae80282208b6b23d, limb2: 0x14d3504b5c8d428f, }, r1a1: u288 { limb0: 0x60ef4f4324d5619b60a3bb84, limb1: 0x6d3090caefeedbc33638c77a, limb2: 0x159264c370c89fec, }, }, G2Line { r0a0: u288 { limb0: 0x3a0493f840a637df757ffbd, limb1: 0x78784ce2127de5ab9fd43f98, limb2: 0x404e6e7d65575af, }, r0a1: u288 { limb0: 0x40a91253ff86fe1a9f30b23, limb1: 0x9876650a81d21ccadf7b5a47, limb2: 0x23641d1989cf0d22, }, r1a0: u288 { limb0: 0xd686edf528c50fe4b5fc743d, limb1: 0xaff67da08ae2568924ba172c, limb2: 0x147e9121533c6431, }, r1a1: u288 { limb0: 0xad80f0aa65056d5483a4ab44, limb1: 0x6e8e1992f62ad66fac7881b4, limb2: 0x24a28d1d5d8e8f3b, }, }, G2Line { r0a0: u288 { limb0: 0xea1771c5a15aef9e3079786d, limb1: 0x77a90b139183352b680523a0, limb2: 0x232c100c95eae30e, }, r0a1: u288 { limb0: 0x6b283b2e00ceee9181913d03, limb1: 0x977d294255416755d5596a3d, limb2: 0x25678644f6a5053d, }, r1a0: u288 { limb0: 0xa543b526974a72bd42654bfb, limb1: 0xdf95c5b8a9328fc318d7b435, limb2: 0x161ef71b5e24d302, }, r1a1: u288 { limb0: 0x7412e2b94a4551851b42cd3, limb1: 0xac25f9bbd0d7eb7e7789a8af, limb2: 0x26d86a5064526fcb, }, }, ]; ================================================ FILE: src/src/basic_field_ops.cairo ================================================ use core::circuit::{ CircuitElement, CircuitElement as CE, CircuitInput, CircuitInput as CI, CircuitInputs, CircuitModulus, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use core::num::traits::Zero; use corelib_imports::bounded_int::upcast; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::{E12D, get_BLS12_381_modulus, get_BN254_modulus, u288}; use garaga::utils::hashing::{PoseidonState, hades_permutation, hash_quadruple_u288}; const POW_2_32_252: felt252 = 0x100000000; const POW_2_64_252: felt252 = 0x10000000000000000; const POW_2_256_384: u384 = u384 { limb0: 0x0, limb1: 0x0, limb2: 0x10000000000000000, limb3: 0x0 }; // Reduces a u384 given a circuit modulus by computing (a + 0) mod p. // Circuits outputs are reduced mod p. pub fn reduce_mod_p(a: u384, modulus: CircuitModulus) -> u384 { let in1 = CircuitElement::> {}; let in2 = CircuitElement::> {}; let reduce = circuit_add(in1, in2); let outputs = (reduce,) .new_inputs() .next_2(a) .next_2([0, 0, 0, 0]) .done_2() .eval(modulus) .unwrap(); return outputs.get_output(reduce); } pub fn neg_mod_p(a: u384, modulus: CircuitModulus) -> u384 { let in1 = CircuitElement::> {}; let in2 = CircuitElement::> {}; let neg = circuit_sub(in1, in2); let outputs = (neg,) .new_inputs() .next_2([0, 0, 0, 0]) .next_2(a) .done_2() .eval(modulus) .unwrap(); return outputs.get_output(neg); } // Returns true if a == -b mod p (a + b = 0 mod p) pub fn is_opposite_mod_p(a: u384, b: u384, modulus: CircuitModulus) -> bool { let in1 = CircuitElement::> {}; let in2 = CircuitElement::> {}; let sum = circuit_add(in1, in2); let outputs = (sum,).new_inputs().next_2(a).next_2(b).done_2().eval(modulus).unwrap(); return outputs.get_output(sum).is_zero(); } // Returns true if a == 0 mod p (p must be odd prime) pub fn is_zero_mod_p(a: u384, modulus: CircuitModulus) -> bool { let in1 = CircuitElement::> {}; let sum = circuit_add(in1, in1); let outputs = (sum,).new_inputs().next_2(a).done_2().eval(modulus).unwrap(); return outputs.get_output(sum).is_zero(); } pub fn is_even_u384(a: u384) -> bool { let limb0_u128: u128 = upcast(a.limb0); limb0_u128 % 2 == 0 } pub fn u32_8_to_u384(a: [u32; 8]) -> u384 { let [a_0, a_1, a_2, a_3, a_4, a_5, a_6, a_7] = a; let l0: felt252 = a_7.into() + a_6.into() * POW_2_32_252 + a_5.into() * POW_2_64_252; let l1: felt252 = a_4.into() + a_3.into() * POW_2_32_252 + a_2.into() * POW_2_64_252; let l2: felt252 = a_1.into() + a_0.into() * POW_2_32_252; u384 { limb0: l0.try_into().unwrap(), limb1: l1.try_into().unwrap(), limb2: l2.try_into().unwrap(), limb3: 0, } } // Takes big endian u512 and returns a u384 mod modulus // u512 = low_256 + high_256 * 2^256 // u512 % p = (low_256 + high_256 * 2^256) % p // = (low_256 % p + high_256 * 2^256 % p) % p // CAUTION : a_high and a_low are expected to be < 2^256. No check is performed. pub fn u512_mod_p(high_256: u384, low_256: u384, modulus: CircuitModulus) -> u384 { let low = CircuitElement::> {}; let high = CircuitElement::> {}; let shift = CircuitElement::> {}; let high_shifted = circuit_mul(high, shift); let res = circuit_add(low, high_shifted); let outputs = (res,) .new_inputs() .next_2(low_256) .next_2(high_256) .next_2(POW_2_256_384) .done_2() .eval(modulus) .unwrap(); return outputs.get_output(res); } pub fn add_mod_p(a: u384, b: u384, modulus: CircuitModulus) -> u384 { let in1 = CircuitElement::> {}; let in2 = CircuitElement::> {}; let add = circuit_add(in1, in2); let outputs = (add,).new_inputs().next_2(a).next_2(b).done_2().eval(modulus).unwrap(); return outputs.get_output(add); } pub fn sub_mod_p(a: u384, b: u384, modulus: CircuitModulus) -> u384 { let in1 = CircuitElement::> {}; let in2 = CircuitElement::> {}; let sub = circuit_sub(in1, in2); let outputs = (sub,).new_inputs().next_2(a).next_2(b).done_2().eval(modulus).unwrap(); return outputs.get_output(sub); } pub fn mul_mod_p(a: u384, b: u384, modulus: CircuitModulus) -> u384 { let in1 = CircuitElement::> {}; let in2 = CircuitElement::> {}; let mul = circuit_mul(in1, in2); let outputs = (mul,).new_inputs().next_2(a).next_2(b).done_2().eval(modulus).unwrap(); return outputs.get_output(mul); } #[inline(always)] pub fn batch_3_mod_p(x: u384, y: u384, z: u384, c0: u384, modulus: CircuitModulus) -> u384 { let _x = CircuitElement::> {}; let _y = CircuitElement::> {}; let _z = CircuitElement::> {}; let _c0 = CircuitElement::> {}; let _c1 = circuit_mul(_c0, _c0); let _c2 = circuit_mul(_c1, _c0); let _mul1 = circuit_mul(_x, _c0); let _mul2 = circuit_mul(_y, _c1); let _mul3 = circuit_mul(_z, _c2); let res = circuit_add(circuit_add(_mul1, _mul2), _mul3); let outputs = (res,) .new_inputs() .next_2(x) .next_2(y) .next_2(z) .next_2(c0) .done_2() .eval(modulus) .unwrap(); return outputs.get_output(res); } pub fn inv_mod_p(a: u384, modulus: CircuitModulus) -> u384 { let in1 = CircuitElement::> {}; let inv = circuit_inverse(in1); let outputs = (inv,).new_inputs().next_2(a).done_2().eval(modulus).unwrap(); return outputs.get_output(inv); } #[inline(always)] pub fn eval_and_hash_E12D_u288_transcript( transcript: Span>, mut s: PoseidonState, z: u384, ) -> (PoseidonState, Array) { let base: felt252 = 79228162514264337593543950336; // 2**96 let mut evals: Array = array![]; let modulus = get_BN254_modulus(); // BN254 prime field modulus for elmt in transcript { let elmt = *elmt; let _s = hash_quadruple_u288(elmt.w0, elmt.w1, elmt.w2, elmt.w3, base, s); let _s = hash_quadruple_u288(elmt.w4, elmt.w5, elmt.w6, elmt.w7, base, _s); let _s = hash_quadruple_u288(elmt.w8, elmt.w9, elmt.w10, elmt.w11, base, _s); s = _s; let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let in12 = CE::> {}; let t0 = circuit_mul(in11, in12); // Eval X Horner step: multiply by z let t1 = circuit_add(in10, t0); // Eval X Horner step: add coefficient_10 let t2 = circuit_mul(t1, in12); // Eval X Horner step: multiply by z let t3 = circuit_add(in9, t2); // Eval X Horner step: add coefficient_9 let t4 = circuit_mul(t3, in12); // Eval X Horner step: multiply by z let t5 = circuit_add(in8, t4); // Eval X Horner step: add coefficient_8 let t6 = circuit_mul(t5, in12); // Eval X Horner step: multiply by z let t7 = circuit_add(in7, t6); // Eval X Horner step: add coefficient_7 let t8 = circuit_mul(t7, in12); // Eval X Horner step: multiply by z let t9 = circuit_add(in6, t8); // Eval X Horner step: add coefficient_6 let t10 = circuit_mul(t9, in12); // Eval X Horner step: multiply by z let t11 = circuit_add(in5, t10); // Eval X Horner step: add coefficient_5 let t12 = circuit_mul(t11, in12); // Eval X Horner step: multiply by z let t13 = circuit_add(in4, t12); // Eval X Horner step: add coefficient_4 let t14 = circuit_mul(t13, in12); // Eval X Horner step: multiply by z let t15 = circuit_add(in3, t14); // Eval X Horner step: add coefficient_3 let t16 = circuit_mul(t15, in12); // Eval X Horner step: multiply by z let t17 = circuit_add(in2, t16); // Eval X Horner step: add coefficient_2 let t18 = circuit_mul(t17, in12); // Eval X Horner step: multiply by z let t19 = circuit_add(in1, t18); // Eval X Horner step: add coefficient_1 let t20 = circuit_mul(t19, in12); // Eval X Horner step: multiply by z let t21 = circuit_add(in0, t20); // Eval X Horner step: add coefficient_0 let mut circuit_inputs = (t21,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(elmt.w0); // in0 circuit_inputs = circuit_inputs.next_2(elmt.w1); // in1 circuit_inputs = circuit_inputs.next_2(elmt.w2); // in2 circuit_inputs = circuit_inputs.next_2(elmt.w3); // in3 circuit_inputs = circuit_inputs.next_2(elmt.w4); // in4 circuit_inputs = circuit_inputs.next_2(elmt.w5); // in5 circuit_inputs = circuit_inputs.next_2(elmt.w6); // in6 circuit_inputs = circuit_inputs.next_2(elmt.w7); // in7 circuit_inputs = circuit_inputs.next_2(elmt.w8); // in8 circuit_inputs = circuit_inputs.next_2(elmt.w9); // in9 circuit_inputs = circuit_inputs.next_2(elmt.w10); // in10 circuit_inputs = circuit_inputs.next_2(elmt.w11); // in11 circuit_inputs = circuit_inputs.next_2(z); // in12 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let f_of_z: u384 = outputs.get_output(t21); evals.append(f_of_z); } return (s, evals); } #[inline(always)] pub fn eval_and_hash_E12D_u384_transcript( transcript: Span>, mut s: PoseidonState, z: u384, ) -> (PoseidonState, Array) { let base: felt252 = 79228162514264337593543950336; // 2**96 let mut evals: Array = array![]; let modulus = get_BLS12_381_modulus(); // BLS12_381 prime field modulus for elmt in transcript { let elmt = *elmt; let in_1 = s.s0 + elmt.w0.limb0.into() + base * elmt.w0.limb1.into(); let in_2 = s.s1 + elmt.w0.limb2.into() + base * elmt.w0.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, s.s2); let in_1 = _s0 + elmt.w1.limb0.into() + base * elmt.w1.limb1.into(); let in_2 = _s1 + elmt.w1.limb2.into() + base * elmt.w1.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt.w2.limb0.into() + base * elmt.w2.limb1.into(); let in_2 = _s1 + elmt.w2.limb2.into() + base * elmt.w2.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt.w3.limb0.into() + base * elmt.w3.limb1.into(); let in_2 = _s1 + elmt.w3.limb2.into() + base * elmt.w3.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt.w4.limb0.into() + base * elmt.w4.limb1.into(); let in_2 = _s1 + elmt.w4.limb2.into() + base * elmt.w4.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt.w5.limb0.into() + base * elmt.w5.limb1.into(); let in_2 = _s1 + elmt.w5.limb2.into() + base * elmt.w5.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt.w6.limb0.into() + base * elmt.w6.limb1.into(); let in_2 = _s1 + elmt.w6.limb2.into() + base * elmt.w6.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt.w7.limb0.into() + base * elmt.w7.limb1.into(); let in_2 = _s1 + elmt.w7.limb2.into() + base * elmt.w7.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt.w8.limb0.into() + base * elmt.w8.limb1.into(); let in_2 = _s1 + elmt.w8.limb2.into() + base * elmt.w8.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt.w9.limb0.into() + base * elmt.w9.limb1.into(); let in_2 = _s1 + elmt.w9.limb2.into() + base * elmt.w9.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt.w10.limb0.into() + base * elmt.w10.limb1.into(); let in_2 = _s1 + elmt.w10.limb2.into() + base * elmt.w10.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt.w11.limb0.into() + base * elmt.w11.limb1.into(); let in_2 = _s1 + elmt.w11.limb2.into() + base * elmt.w11.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); s = PoseidonState { s0: _s0, s1: _s1, s2: _s2 }; let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let in12 = CE::> {}; let t0 = circuit_mul(in11, in12); // Eval X Horner step: multiply by z let t1 = circuit_add(in10, t0); // Eval X Horner step: add coefficient_10 let t2 = circuit_mul(t1, in12); // Eval X Horner step: multiply by z let t3 = circuit_add(in9, t2); // Eval X Horner step: add coefficient_9 let t4 = circuit_mul(t3, in12); // Eval X Horner step: multiply by z let t5 = circuit_add(in8, t4); // Eval X Horner step: add coefficient_8 let t6 = circuit_mul(t5, in12); // Eval X Horner step: multiply by z let t7 = circuit_add(in7, t6); // Eval X Horner step: add coefficient_7 let t8 = circuit_mul(t7, in12); // Eval X Horner step: multiply by z let t9 = circuit_add(in6, t8); // Eval X Horner step: add coefficient_6 let t10 = circuit_mul(t9, in12); // Eval X Horner step: multiply by z let t11 = circuit_add(in5, t10); // Eval X Horner step: add coefficient_5 let t12 = circuit_mul(t11, in12); // Eval X Horner step: multiply by z let t13 = circuit_add(in4, t12); // Eval X Horner step: add coefficient_4 let t14 = circuit_mul(t13, in12); // Eval X Horner step: multiply by z let t15 = circuit_add(in3, t14); // Eval X Horner step: add coefficient_3 let t16 = circuit_mul(t15, in12); // Eval X Horner step: multiply by z let t17 = circuit_add(in2, t16); // Eval X Horner step: add coefficient_2 let t18 = circuit_mul(t17, in12); // Eval X Horner step: multiply by z let t19 = circuit_add(in1, t18); // Eval X Horner step: add coefficient_1 let t20 = circuit_mul(t19, in12); // Eval X Horner step: multiply by z let t21 = circuit_add(in0, t20); // Eval X Horner step: add coefficient_0 let mut circuit_inputs = (t21,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(elmt.w0); // in0 circuit_inputs = circuit_inputs.next_2(elmt.w1); // in1 circuit_inputs = circuit_inputs.next_2(elmt.w2); // in2 circuit_inputs = circuit_inputs.next_2(elmt.w3); // in3 circuit_inputs = circuit_inputs.next_2(elmt.w4); // in4 circuit_inputs = circuit_inputs.next_2(elmt.w5); // in5 circuit_inputs = circuit_inputs.next_2(elmt.w6); // in6 circuit_inputs = circuit_inputs.next_2(elmt.w7); // in7 circuit_inputs = circuit_inputs.next_2(elmt.w8); // in8 circuit_inputs = circuit_inputs.next_2(elmt.w9); // in9 circuit_inputs = circuit_inputs.next_2(elmt.w10); // in10 circuit_inputs = circuit_inputs.next_2(elmt.w11); // in11 circuit_inputs = circuit_inputs.next_2(z); // in12 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let f_of_z: u384 = outputs.get_output(t21); evals.append(f_of_z); } return (s, evals); } ================================================ FILE: src/src/circuits/README.md ================================================ This folder contains autogenerated circuits only. To regenerate the circuits, run the following command from the root of the repository: ```bash make rewrite ``` See the corresponding script in [tools/make/rewrite.sh](../../../tools/make/rewrite.sh) ================================================ FILE: src/src/circuits/dummy.cairo ================================================ use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; #[inline(always)] pub fn run_DUMMY_circuit(mut input: Array, curve_index: usize) -> Array { // INPUT stack let (in0, in1) = (CE::> {}, CE::> {}); let t0 = circuit_sub(in0, in1); let t1 = circuit_inverse(in1); let t2 = circuit_mul(in0, t1); let t3 = circuit_add(t0, t2); let t4 = circuit_sub(t0, t2); let t5 = circuit_mul(t0, t2); let t6 = circuit_inverse(t2); let t7 = circuit_mul(t0, t6); let modulus = crate::definitions::get_modulus(curve_index); let mut circuit_inputs = (t0, t2, t3, t4, t5, t7).new_inputs(); // Prefill constants: // Fill inputs: let mut input = input; while let Option::Some(val) = input.pop_front() { circuit_inputs = circuit_inputs.next_2(val); } let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res = array![ outputs.get_output(t0), outputs.get_output(t2), outputs.get_output(t3), outputs.get_output(t4), outputs.get_output(t5), outputs.get_output(t7), ]; return res; } ================================================ FILE: src/src/circuits/ec.cairo ================================================ use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::{G1Point, G2Point}; impl CircuitDefinition27< E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, > of core::circuit::CircuitDefinition< ( CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, ), > { type CircuitType = core::circuit::Circuit< ( E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, ), >; } impl MyDrp_27< E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, > of Drop< ( CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, ), >; impl CircuitDefinition28< E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, > of core::circuit::CircuitDefinition< ( CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, ), > { type CircuitType = core::circuit::Circuit< ( E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, ), >; } impl MyDrp_28< E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, > of Drop< ( CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, ), >; #[inline(always)] pub fn run_ADD_EC_POINTS_G2_circuit( p: G2Point, q: G2Point, modulus: core::circuit::CircuitModulus, ) -> (G2Point,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8) = (CE::> {}, CE::> {}); let t0 = circuit_sub(in3, in7); // Fp2 sub coeff 0/1 let t1 = circuit_sub(in4, in8); // Fp2 sub coeff 1/1 let t2 = circuit_sub(in1, in5); // Fp2 sub coeff 0/1 let t3 = circuit_sub(in2, in6); // Fp2 sub coeff 1/1 let t4 = circuit_mul(t2, t2); // Fp2 Inv start let t5 = circuit_mul(t3, t3); let t6 = circuit_add(t4, t5); let t7 = circuit_inverse(t6); let t8 = circuit_mul(t2, t7); // Fp2 Inv real part end let t9 = circuit_mul(t3, t7); let t10 = circuit_sub(in0, t9); // Fp2 Inv imag part end let t11 = circuit_mul(t0, t8); // Fp2 mul start let t12 = circuit_mul(t1, t10); let t13 = circuit_sub(t11, t12); // Fp2 mul real part end let t14 = circuit_mul(t0, t10); let t15 = circuit_mul(t1, t8); let t16 = circuit_add(t14, t15); // Fp2 mul imag part end let t17 = circuit_add(t13, t16); let t18 = circuit_sub(t13, t16); let t19 = circuit_mul(t17, t18); let t20 = circuit_mul(t13, t16); let t21 = circuit_add(t20, t20); let t22 = circuit_sub(t19, in1); // Fp2 sub coeff 0/1 let t23 = circuit_sub(t21, in2); // Fp2 sub coeff 1/1 let t24 = circuit_sub(t22, in5); // Fp2 sub coeff 0/1 let t25 = circuit_sub(t23, in6); // Fp2 sub coeff 1/1 let t26 = circuit_sub(in1, t24); // Fp2 sub coeff 0/1 let t27 = circuit_sub(in2, t25); // Fp2 sub coeff 1/1 let t28 = circuit_mul(t13, t26); // Fp2 mul start let t29 = circuit_mul(t16, t27); let t30 = circuit_sub(t28, t29); // Fp2 mul real part end let t31 = circuit_mul(t13, t27); let t32 = circuit_mul(t16, t26); let t33 = circuit_add(t31, t32); // Fp2 mul imag part end let t34 = circuit_sub(t30, in3); // Fp2 sub coeff 0/1 let t35 = circuit_sub(t33, in4); // Fp2 sub coeff 1/1 let modulus = modulus; let mut circuit_inputs = (t24, t25, t34, t35).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x0); // in1 circuit_inputs = circuit_inputs.next_2(p.x1); // in2 circuit_inputs = circuit_inputs.next_2(p.y0); // in3 circuit_inputs = circuit_inputs.next_2(p.y1); // in4 circuit_inputs = circuit_inputs.next_2(q.x0); // in5 circuit_inputs = circuit_inputs.next_2(q.x1); // in6 circuit_inputs = circuit_inputs.next_2(q.y0); // in7 circuit_inputs = circuit_inputs.next_2(q.y1); // in8 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let result: G2Point = G2Point { x0: outputs.get_output(t24), x1: outputs.get_output(t25), y0: outputs.get_output(t34), y1: outputs.get_output(t35), }; return (result,); } #[inline(always)] pub fn run_ADD_EC_POINT_circuit( p: G1Point, q: G1Point, modulus: core::circuit::CircuitModulus, ) -> (G1Point,) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let in3 = CE::> {}; let t0 = circuit_sub(in1, in3); let t1 = circuit_sub(in0, in2); let t2 = circuit_inverse(t1); let t3 = circuit_mul(t0, t2); let t4 = circuit_mul(t3, t3); let t5 = circuit_sub(t4, in0); let t6 = circuit_sub(t5, in2); let t7 = circuit_sub(in0, t6); let t8 = circuit_mul(t3, t7); let t9 = circuit_sub(t8, in1); let modulus = modulus; let mut circuit_inputs = (t6, t9).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x); // in0 circuit_inputs = circuit_inputs.next_2(p.y); // in1 circuit_inputs = circuit_inputs.next_2(q.x); // in2 circuit_inputs = circuit_inputs.next_2(q.y); // in3 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let r: G1Point = G1Point { x: outputs.get_output(t6), y: outputs.get_output(t9) }; return (r,); } #[inline(always)] pub fn run_CLEAR_COFACTOR_BLS12_381_circuit( P: G1Point, modulus: core::circuit::CircuitModulus, ) -> (G1Point,) { // CONSTANT stack let in0 = CE::> {}; // 0x3 // INPUT stack let (in1, in2) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in1, in1); let t1 = circuit_mul(in0, t0); let t2 = circuit_add(in2, in2); let t3 = circuit_inverse(t2); let t4 = circuit_mul(t1, t3); let t5 = circuit_mul(t4, t4); let t6 = circuit_sub(t5, in1); let t7 = circuit_sub(t6, in1); let t8 = circuit_sub(in1, t7); let t9 = circuit_mul(t4, t8); let t10 = circuit_sub(t9, in2); let t11 = circuit_sub(t10, in2); let t12 = circuit_sub(t7, in1); let t13 = circuit_inverse(t12); let t14 = circuit_mul(t11, t13); let t15 = circuit_mul(t14, t14); let t16 = circuit_sub(t15, t7); let t17 = circuit_sub(t16, in1); let t18 = circuit_sub(t7, t17); let t19 = circuit_mul(t14, t18); let t20 = circuit_sub(t19, t10); let t21 = circuit_mul(t17, t17); let t22 = circuit_mul(in0, t21); let t23 = circuit_add(t20, t20); let t24 = circuit_inverse(t23); let t25 = circuit_mul(t22, t24); let t26 = circuit_mul(t25, t25); let t27 = circuit_sub(t26, t17); let t28 = circuit_sub(t27, t17); let t29 = circuit_sub(t17, t28); let t30 = circuit_mul(t25, t29); let t31 = circuit_sub(t30, t20); let t32 = circuit_mul(t28, t28); let t33 = circuit_mul(in0, t32); let t34 = circuit_add(t31, t31); let t35 = circuit_inverse(t34); let t36 = circuit_mul(t33, t35); let t37 = circuit_mul(t36, t36); let t38 = circuit_sub(t37, t28); let t39 = circuit_sub(t38, t28); let t40 = circuit_sub(t28, t39); let t41 = circuit_mul(t36, t40); let t42 = circuit_sub(t41, t31); let t43 = circuit_sub(t42, in2); let t44 = circuit_sub(t39, in1); let t45 = circuit_inverse(t44); let t46 = circuit_mul(t43, t45); let t47 = circuit_mul(t46, t46); let t48 = circuit_sub(t47, t39); let t49 = circuit_sub(t48, in1); let t50 = circuit_sub(t39, t49); let t51 = circuit_mul(t46, t50); let t52 = circuit_sub(t51, t42); let t53 = circuit_mul(t49, t49); let t54 = circuit_mul(in0, t53); let t55 = circuit_add(t52, t52); let t56 = circuit_inverse(t55); let t57 = circuit_mul(t54, t56); let t58 = circuit_mul(t57, t57); let t59 = circuit_sub(t58, t49); let t60 = circuit_sub(t59, t49); let t61 = circuit_sub(t49, t60); let t62 = circuit_mul(t57, t61); let t63 = circuit_sub(t62, t52); let t64 = circuit_mul(t60, t60); let t65 = circuit_mul(in0, t64); let t66 = circuit_add(t63, t63); let t67 = circuit_inverse(t66); let t68 = circuit_mul(t65, t67); let t69 = circuit_mul(t68, t68); let t70 = circuit_sub(t69, t60); let t71 = circuit_sub(t70, t60); let t72 = circuit_sub(t60, t71); let t73 = circuit_mul(t68, t72); let t74 = circuit_sub(t73, t63); let t75 = circuit_mul(t71, t71); let t76 = circuit_mul(in0, t75); let t77 = circuit_add(t74, t74); let t78 = circuit_inverse(t77); let t79 = circuit_mul(t76, t78); let t80 = circuit_mul(t79, t79); let t81 = circuit_sub(t80, t71); let t82 = circuit_sub(t81, t71); let t83 = circuit_sub(t71, t82); let t84 = circuit_mul(t79, t83); let t85 = circuit_sub(t84, t74); let t86 = circuit_sub(t85, in2); let t87 = circuit_sub(t82, in1); let t88 = circuit_inverse(t87); let t89 = circuit_mul(t86, t88); let t90 = circuit_mul(t89, t89); let t91 = circuit_sub(t90, t82); let t92 = circuit_sub(t91, in1); let t93 = circuit_sub(t82, t92); let t94 = circuit_mul(t89, t93); let t95 = circuit_sub(t94, t85); let t96 = circuit_mul(t92, t92); let t97 = circuit_mul(in0, t96); let t98 = circuit_add(t95, t95); let t99 = circuit_inverse(t98); let t100 = circuit_mul(t97, t99); let t101 = circuit_mul(t100, t100); let t102 = circuit_sub(t101, t92); let t103 = circuit_sub(t102, t92); let t104 = circuit_sub(t92, t103); let t105 = circuit_mul(t100, t104); let t106 = circuit_sub(t105, t95); let t107 = circuit_mul(t103, t103); let t108 = circuit_mul(in0, t107); let t109 = circuit_add(t106, t106); let t110 = circuit_inverse(t109); let t111 = circuit_mul(t108, t110); let t112 = circuit_mul(t111, t111); let t113 = circuit_sub(t112, t103); let t114 = circuit_sub(t113, t103); let t115 = circuit_sub(t103, t114); let t116 = circuit_mul(t111, t115); let t117 = circuit_sub(t116, t106); let t118 = circuit_mul(t114, t114); let t119 = circuit_mul(in0, t118); let t120 = circuit_add(t117, t117); let t121 = circuit_inverse(t120); let t122 = circuit_mul(t119, t121); let t123 = circuit_mul(t122, t122); let t124 = circuit_sub(t123, t114); let t125 = circuit_sub(t124, t114); let t126 = circuit_sub(t114, t125); let t127 = circuit_mul(t122, t126); let t128 = circuit_sub(t127, t117); let t129 = circuit_mul(t125, t125); let t130 = circuit_mul(in0, t129); let t131 = circuit_add(t128, t128); let t132 = circuit_inverse(t131); let t133 = circuit_mul(t130, t132); let t134 = circuit_mul(t133, t133); let t135 = circuit_sub(t134, t125); let t136 = circuit_sub(t135, t125); let t137 = circuit_sub(t125, t136); let t138 = circuit_mul(t133, t137); let t139 = circuit_sub(t138, t128); let t140 = circuit_mul(t136, t136); let t141 = circuit_mul(in0, t140); let t142 = circuit_add(t139, t139); let t143 = circuit_inverse(t142); let t144 = circuit_mul(t141, t143); let t145 = circuit_mul(t144, t144); let t146 = circuit_sub(t145, t136); let t147 = circuit_sub(t146, t136); let t148 = circuit_sub(t136, t147); let t149 = circuit_mul(t144, t148); let t150 = circuit_sub(t149, t139); let t151 = circuit_mul(t147, t147); let t152 = circuit_mul(in0, t151); let t153 = circuit_add(t150, t150); let t154 = circuit_inverse(t153); let t155 = circuit_mul(t152, t154); let t156 = circuit_mul(t155, t155); let t157 = circuit_sub(t156, t147); let t158 = circuit_sub(t157, t147); let t159 = circuit_sub(t147, t158); let t160 = circuit_mul(t155, t159); let t161 = circuit_sub(t160, t150); let t162 = circuit_mul(t158, t158); let t163 = circuit_mul(in0, t162); let t164 = circuit_add(t161, t161); let t165 = circuit_inverse(t164); let t166 = circuit_mul(t163, t165); let t167 = circuit_mul(t166, t166); let t168 = circuit_sub(t167, t158); let t169 = circuit_sub(t168, t158); let t170 = circuit_sub(t158, t169); let t171 = circuit_mul(t166, t170); let t172 = circuit_sub(t171, t161); let t173 = circuit_mul(t169, t169); let t174 = circuit_mul(in0, t173); let t175 = circuit_add(t172, t172); let t176 = circuit_inverse(t175); let t177 = circuit_mul(t174, t176); let t178 = circuit_mul(t177, t177); let t179 = circuit_sub(t178, t169); let t180 = circuit_sub(t179, t169); let t181 = circuit_sub(t169, t180); let t182 = circuit_mul(t177, t181); let t183 = circuit_sub(t182, t172); let t184 = circuit_mul(t180, t180); let t185 = circuit_mul(in0, t184); let t186 = circuit_add(t183, t183); let t187 = circuit_inverse(t186); let t188 = circuit_mul(t185, t187); let t189 = circuit_mul(t188, t188); let t190 = circuit_sub(t189, t180); let t191 = circuit_sub(t190, t180); let t192 = circuit_sub(t180, t191); let t193 = circuit_mul(t188, t192); let t194 = circuit_sub(t193, t183); let t195 = circuit_sub(t194, in2); let t196 = circuit_sub(t191, in1); let t197 = circuit_inverse(t196); let t198 = circuit_mul(t195, t197); let t199 = circuit_mul(t198, t198); let t200 = circuit_sub(t199, t191); let t201 = circuit_sub(t200, in1); let t202 = circuit_sub(t191, t201); let t203 = circuit_mul(t198, t202); let t204 = circuit_sub(t203, t194); let t205 = circuit_mul(t201, t201); let t206 = circuit_mul(in0, t205); let t207 = circuit_add(t204, t204); let t208 = circuit_inverse(t207); let t209 = circuit_mul(t206, t208); let t210 = circuit_mul(t209, t209); let t211 = circuit_sub(t210, t201); let t212 = circuit_sub(t211, t201); let t213 = circuit_sub(t201, t212); let t214 = circuit_mul(t209, t213); let t215 = circuit_sub(t214, t204); let t216 = circuit_mul(t212, t212); let t217 = circuit_mul(in0, t216); let t218 = circuit_add(t215, t215); let t219 = circuit_inverse(t218); let t220 = circuit_mul(t217, t219); let t221 = circuit_mul(t220, t220); let t222 = circuit_sub(t221, t212); let t223 = circuit_sub(t222, t212); let t224 = circuit_sub(t212, t223); let t225 = circuit_mul(t220, t224); let t226 = circuit_sub(t225, t215); let t227 = circuit_mul(t223, t223); let t228 = circuit_mul(in0, t227); let t229 = circuit_add(t226, t226); let t230 = circuit_inverse(t229); let t231 = circuit_mul(t228, t230); let t232 = circuit_mul(t231, t231); let t233 = circuit_sub(t232, t223); let t234 = circuit_sub(t233, t223); let t235 = circuit_sub(t223, t234); let t236 = circuit_mul(t231, t235); let t237 = circuit_sub(t236, t226); let t238 = circuit_mul(t234, t234); let t239 = circuit_mul(in0, t238); let t240 = circuit_add(t237, t237); let t241 = circuit_inverse(t240); let t242 = circuit_mul(t239, t241); let t243 = circuit_mul(t242, t242); let t244 = circuit_sub(t243, t234); let t245 = circuit_sub(t244, t234); let t246 = circuit_sub(t234, t245); let t247 = circuit_mul(t242, t246); let t248 = circuit_sub(t247, t237); let t249 = circuit_mul(t245, t245); let t250 = circuit_mul(in0, t249); let t251 = circuit_add(t248, t248); let t252 = circuit_inverse(t251); let t253 = circuit_mul(t250, t252); let t254 = circuit_mul(t253, t253); let t255 = circuit_sub(t254, t245); let t256 = circuit_sub(t255, t245); let t257 = circuit_sub(t245, t256); let t258 = circuit_mul(t253, t257); let t259 = circuit_sub(t258, t248); let t260 = circuit_mul(t256, t256); let t261 = circuit_mul(in0, t260); let t262 = circuit_add(t259, t259); let t263 = circuit_inverse(t262); let t264 = circuit_mul(t261, t263); let t265 = circuit_mul(t264, t264); let t266 = circuit_sub(t265, t256); let t267 = circuit_sub(t266, t256); let t268 = circuit_sub(t256, t267); let t269 = circuit_mul(t264, t268); let t270 = circuit_sub(t269, t259); let t271 = circuit_mul(t267, t267); let t272 = circuit_mul(in0, t271); let t273 = circuit_add(t270, t270); let t274 = circuit_inverse(t273); let t275 = circuit_mul(t272, t274); let t276 = circuit_mul(t275, t275); let t277 = circuit_sub(t276, t267); let t278 = circuit_sub(t277, t267); let t279 = circuit_sub(t267, t278); let t280 = circuit_mul(t275, t279); let t281 = circuit_sub(t280, t270); let t282 = circuit_mul(t278, t278); let t283 = circuit_mul(in0, t282); let t284 = circuit_add(t281, t281); let t285 = circuit_inverse(t284); let t286 = circuit_mul(t283, t285); let t287 = circuit_mul(t286, t286); let t288 = circuit_sub(t287, t278); let t289 = circuit_sub(t288, t278); let t290 = circuit_sub(t278, t289); let t291 = circuit_mul(t286, t290); let t292 = circuit_sub(t291, t281); let t293 = circuit_mul(t289, t289); let t294 = circuit_mul(in0, t293); let t295 = circuit_add(t292, t292); let t296 = circuit_inverse(t295); let t297 = circuit_mul(t294, t296); let t298 = circuit_mul(t297, t297); let t299 = circuit_sub(t298, t289); let t300 = circuit_sub(t299, t289); let t301 = circuit_sub(t289, t300); let t302 = circuit_mul(t297, t301); let t303 = circuit_sub(t302, t292); let t304 = circuit_mul(t300, t300); let t305 = circuit_mul(in0, t304); let t306 = circuit_add(t303, t303); let t307 = circuit_inverse(t306); let t308 = circuit_mul(t305, t307); let t309 = circuit_mul(t308, t308); let t310 = circuit_sub(t309, t300); let t311 = circuit_sub(t310, t300); let t312 = circuit_sub(t300, t311); let t313 = circuit_mul(t308, t312); let t314 = circuit_sub(t313, t303); let t315 = circuit_mul(t311, t311); let t316 = circuit_mul(in0, t315); let t317 = circuit_add(t314, t314); let t318 = circuit_inverse(t317); let t319 = circuit_mul(t316, t318); let t320 = circuit_mul(t319, t319); let t321 = circuit_sub(t320, t311); let t322 = circuit_sub(t321, t311); let t323 = circuit_sub(t311, t322); let t324 = circuit_mul(t319, t323); let t325 = circuit_sub(t324, t314); let t326 = circuit_mul(t322, t322); let t327 = circuit_mul(in0, t326); let t328 = circuit_add(t325, t325); let t329 = circuit_inverse(t328); let t330 = circuit_mul(t327, t329); let t331 = circuit_mul(t330, t330); let t332 = circuit_sub(t331, t322); let t333 = circuit_sub(t332, t322); let t334 = circuit_sub(t322, t333); let t335 = circuit_mul(t330, t334); let t336 = circuit_sub(t335, t325); let t337 = circuit_mul(t333, t333); let t338 = circuit_mul(in0, t337); let t339 = circuit_add(t336, t336); let t340 = circuit_inverse(t339); let t341 = circuit_mul(t338, t340); let t342 = circuit_mul(t341, t341); let t343 = circuit_sub(t342, t333); let t344 = circuit_sub(t343, t333); let t345 = circuit_sub(t333, t344); let t346 = circuit_mul(t341, t345); let t347 = circuit_sub(t346, t336); let t348 = circuit_mul(t344, t344); let t349 = circuit_mul(in0, t348); let t350 = circuit_add(t347, t347); let t351 = circuit_inverse(t350); let t352 = circuit_mul(t349, t351); let t353 = circuit_mul(t352, t352); let t354 = circuit_sub(t353, t344); let t355 = circuit_sub(t354, t344); let t356 = circuit_sub(t344, t355); let t357 = circuit_mul(t352, t356); let t358 = circuit_sub(t357, t347); let t359 = circuit_mul(t355, t355); let t360 = circuit_mul(in0, t359); let t361 = circuit_add(t358, t358); let t362 = circuit_inverse(t361); let t363 = circuit_mul(t360, t362); let t364 = circuit_mul(t363, t363); let t365 = circuit_sub(t364, t355); let t366 = circuit_sub(t365, t355); let t367 = circuit_sub(t355, t366); let t368 = circuit_mul(t363, t367); let t369 = circuit_sub(t368, t358); let t370 = circuit_mul(t366, t366); let t371 = circuit_mul(in0, t370); let t372 = circuit_add(t369, t369); let t373 = circuit_inverse(t372); let t374 = circuit_mul(t371, t373); let t375 = circuit_mul(t374, t374); let t376 = circuit_sub(t375, t366); let t377 = circuit_sub(t376, t366); let t378 = circuit_sub(t366, t377); let t379 = circuit_mul(t374, t378); let t380 = circuit_sub(t379, t369); let t381 = circuit_mul(t377, t377); let t382 = circuit_mul(in0, t381); let t383 = circuit_add(t380, t380); let t384 = circuit_inverse(t383); let t385 = circuit_mul(t382, t384); let t386 = circuit_mul(t385, t385); let t387 = circuit_sub(t386, t377); let t388 = circuit_sub(t387, t377); let t389 = circuit_sub(t377, t388); let t390 = circuit_mul(t385, t389); let t391 = circuit_sub(t390, t380); let t392 = circuit_mul(t388, t388); let t393 = circuit_mul(in0, t392); let t394 = circuit_add(t391, t391); let t395 = circuit_inverse(t394); let t396 = circuit_mul(t393, t395); let t397 = circuit_mul(t396, t396); let t398 = circuit_sub(t397, t388); let t399 = circuit_sub(t398, t388); let t400 = circuit_sub(t388, t399); let t401 = circuit_mul(t396, t400); let t402 = circuit_sub(t401, t391); let t403 = circuit_mul(t399, t399); let t404 = circuit_mul(in0, t403); let t405 = circuit_add(t402, t402); let t406 = circuit_inverse(t405); let t407 = circuit_mul(t404, t406); let t408 = circuit_mul(t407, t407); let t409 = circuit_sub(t408, t399); let t410 = circuit_sub(t409, t399); let t411 = circuit_sub(t399, t410); let t412 = circuit_mul(t407, t411); let t413 = circuit_sub(t412, t402); let t414 = circuit_mul(t410, t410); let t415 = circuit_mul(in0, t414); let t416 = circuit_add(t413, t413); let t417 = circuit_inverse(t416); let t418 = circuit_mul(t415, t417); let t419 = circuit_mul(t418, t418); let t420 = circuit_sub(t419, t410); let t421 = circuit_sub(t420, t410); let t422 = circuit_sub(t410, t421); let t423 = circuit_mul(t418, t422); let t424 = circuit_sub(t423, t413); let t425 = circuit_mul(t421, t421); let t426 = circuit_mul(in0, t425); let t427 = circuit_add(t424, t424); let t428 = circuit_inverse(t427); let t429 = circuit_mul(t426, t428); let t430 = circuit_mul(t429, t429); let t431 = circuit_sub(t430, t421); let t432 = circuit_sub(t431, t421); let t433 = circuit_sub(t421, t432); let t434 = circuit_mul(t429, t433); let t435 = circuit_sub(t434, t424); let t436 = circuit_mul(t432, t432); let t437 = circuit_mul(in0, t436); let t438 = circuit_add(t435, t435); let t439 = circuit_inverse(t438); let t440 = circuit_mul(t437, t439); let t441 = circuit_mul(t440, t440); let t442 = circuit_sub(t441, t432); let t443 = circuit_sub(t442, t432); let t444 = circuit_sub(t432, t443); let t445 = circuit_mul(t440, t444); let t446 = circuit_sub(t445, t435); let t447 = circuit_mul(t443, t443); let t448 = circuit_mul(in0, t447); let t449 = circuit_add(t446, t446); let t450 = circuit_inverse(t449); let t451 = circuit_mul(t448, t450); let t452 = circuit_mul(t451, t451); let t453 = circuit_sub(t452, t443); let t454 = circuit_sub(t453, t443); let t455 = circuit_sub(t443, t454); let t456 = circuit_mul(t451, t455); let t457 = circuit_sub(t456, t446); let t458 = circuit_mul(t454, t454); let t459 = circuit_mul(in0, t458); let t460 = circuit_add(t457, t457); let t461 = circuit_inverse(t460); let t462 = circuit_mul(t459, t461); let t463 = circuit_mul(t462, t462); let t464 = circuit_sub(t463, t454); let t465 = circuit_sub(t464, t454); let t466 = circuit_sub(t454, t465); let t467 = circuit_mul(t462, t466); let t468 = circuit_sub(t467, t457); let t469 = circuit_mul(t465, t465); let t470 = circuit_mul(in0, t469); let t471 = circuit_add(t468, t468); let t472 = circuit_inverse(t471); let t473 = circuit_mul(t470, t472); let t474 = circuit_mul(t473, t473); let t475 = circuit_sub(t474, t465); let t476 = circuit_sub(t475, t465); let t477 = circuit_sub(t465, t476); let t478 = circuit_mul(t473, t477); let t479 = circuit_sub(t478, t468); let t480 = circuit_mul(t476, t476); let t481 = circuit_mul(in0, t480); let t482 = circuit_add(t479, t479); let t483 = circuit_inverse(t482); let t484 = circuit_mul(t481, t483); let t485 = circuit_mul(t484, t484); let t486 = circuit_sub(t485, t476); let t487 = circuit_sub(t486, t476); let t488 = circuit_sub(t476, t487); let t489 = circuit_mul(t484, t488); let t490 = circuit_sub(t489, t479); let t491 = circuit_mul(t487, t487); let t492 = circuit_mul(in0, t491); let t493 = circuit_add(t490, t490); let t494 = circuit_inverse(t493); let t495 = circuit_mul(t492, t494); let t496 = circuit_mul(t495, t495); let t497 = circuit_sub(t496, t487); let t498 = circuit_sub(t497, t487); let t499 = circuit_sub(t487, t498); let t500 = circuit_mul(t495, t499); let t501 = circuit_sub(t500, t490); let t502 = circuit_mul(t498, t498); let t503 = circuit_mul(in0, t502); let t504 = circuit_add(t501, t501); let t505 = circuit_inverse(t504); let t506 = circuit_mul(t503, t505); let t507 = circuit_mul(t506, t506); let t508 = circuit_sub(t507, t498); let t509 = circuit_sub(t508, t498); let t510 = circuit_sub(t498, t509); let t511 = circuit_mul(t506, t510); let t512 = circuit_sub(t511, t501); let t513 = circuit_mul(t509, t509); let t514 = circuit_mul(in0, t513); let t515 = circuit_add(t512, t512); let t516 = circuit_inverse(t515); let t517 = circuit_mul(t514, t516); let t518 = circuit_mul(t517, t517); let t519 = circuit_sub(t518, t509); let t520 = circuit_sub(t519, t509); let t521 = circuit_sub(t509, t520); let t522 = circuit_mul(t517, t521); let t523 = circuit_sub(t522, t512); let t524 = circuit_mul(t520, t520); let t525 = circuit_mul(in0, t524); let t526 = circuit_add(t523, t523); let t527 = circuit_inverse(t526); let t528 = circuit_mul(t525, t527); let t529 = circuit_mul(t528, t528); let t530 = circuit_sub(t529, t520); let t531 = circuit_sub(t530, t520); let t532 = circuit_sub(t520, t531); let t533 = circuit_mul(t528, t532); let t534 = circuit_sub(t533, t523); let t535 = circuit_mul(t531, t531); let t536 = circuit_mul(in0, t535); let t537 = circuit_add(t534, t534); let t538 = circuit_inverse(t537); let t539 = circuit_mul(t536, t538); let t540 = circuit_mul(t539, t539); let t541 = circuit_sub(t540, t531); let t542 = circuit_sub(t541, t531); let t543 = circuit_sub(t531, t542); let t544 = circuit_mul(t539, t543); let t545 = circuit_sub(t544, t534); let t546 = circuit_mul(t542, t542); let t547 = circuit_mul(in0, t546); let t548 = circuit_add(t545, t545); let t549 = circuit_inverse(t548); let t550 = circuit_mul(t547, t549); let t551 = circuit_mul(t550, t550); let t552 = circuit_sub(t551, t542); let t553 = circuit_sub(t552, t542); let t554 = circuit_sub(t542, t553); let t555 = circuit_mul(t550, t554); let t556 = circuit_sub(t555, t545); let t557 = circuit_sub(t556, in2); let t558 = circuit_sub(t553, in1); let t559 = circuit_inverse(t558); let t560 = circuit_mul(t557, t559); let t561 = circuit_mul(t560, t560); let t562 = circuit_sub(t561, t553); let t563 = circuit_sub(t562, in1); let t564 = circuit_sub(t553, t563); let t565 = circuit_mul(t560, t564); let t566 = circuit_sub(t565, t556); let t567 = circuit_mul(t563, t563); let t568 = circuit_mul(in0, t567); let t569 = circuit_add(t566, t566); let t570 = circuit_inverse(t569); let t571 = circuit_mul(t568, t570); let t572 = circuit_mul(t571, t571); let t573 = circuit_sub(t572, t563); let t574 = circuit_sub(t573, t563); let t575 = circuit_sub(t563, t574); let t576 = circuit_mul(t571, t575); let t577 = circuit_sub(t576, t566); let t578 = circuit_mul(t574, t574); let t579 = circuit_mul(in0, t578); let t580 = circuit_add(t577, t577); let t581 = circuit_inverse(t580); let t582 = circuit_mul(t579, t581); let t583 = circuit_mul(t582, t582); let t584 = circuit_sub(t583, t574); let t585 = circuit_sub(t584, t574); let t586 = circuit_sub(t574, t585); let t587 = circuit_mul(t582, t586); let t588 = circuit_sub(t587, t577); let t589 = circuit_mul(t585, t585); let t590 = circuit_mul(in0, t589); let t591 = circuit_add(t588, t588); let t592 = circuit_inverse(t591); let t593 = circuit_mul(t590, t592); let t594 = circuit_mul(t593, t593); let t595 = circuit_sub(t594, t585); let t596 = circuit_sub(t595, t585); let t597 = circuit_sub(t585, t596); let t598 = circuit_mul(t593, t597); let t599 = circuit_sub(t598, t588); let t600 = circuit_mul(t596, t596); let t601 = circuit_mul(in0, t600); let t602 = circuit_add(t599, t599); let t603 = circuit_inverse(t602); let t604 = circuit_mul(t601, t603); let t605 = circuit_mul(t604, t604); let t606 = circuit_sub(t605, t596); let t607 = circuit_sub(t606, t596); let t608 = circuit_sub(t596, t607); let t609 = circuit_mul(t604, t608); let t610 = circuit_sub(t609, t599); let t611 = circuit_mul(t607, t607); let t612 = circuit_mul(in0, t611); let t613 = circuit_add(t610, t610); let t614 = circuit_inverse(t613); let t615 = circuit_mul(t612, t614); let t616 = circuit_mul(t615, t615); let t617 = circuit_sub(t616, t607); let t618 = circuit_sub(t617, t607); let t619 = circuit_sub(t607, t618); let t620 = circuit_mul(t615, t619); let t621 = circuit_sub(t620, t610); let t622 = circuit_mul(t618, t618); let t623 = circuit_mul(in0, t622); let t624 = circuit_add(t621, t621); let t625 = circuit_inverse(t624); let t626 = circuit_mul(t623, t625); let t627 = circuit_mul(t626, t626); let t628 = circuit_sub(t627, t618); let t629 = circuit_sub(t628, t618); let t630 = circuit_sub(t618, t629); let t631 = circuit_mul(t626, t630); let t632 = circuit_sub(t631, t621); let t633 = circuit_mul(t629, t629); let t634 = circuit_mul(in0, t633); let t635 = circuit_add(t632, t632); let t636 = circuit_inverse(t635); let t637 = circuit_mul(t634, t636); let t638 = circuit_mul(t637, t637); let t639 = circuit_sub(t638, t629); let t640 = circuit_sub(t639, t629); let t641 = circuit_sub(t629, t640); let t642 = circuit_mul(t637, t641); let t643 = circuit_sub(t642, t632); let t644 = circuit_mul(t640, t640); let t645 = circuit_mul(in0, t644); let t646 = circuit_add(t643, t643); let t647 = circuit_inverse(t646); let t648 = circuit_mul(t645, t647); let t649 = circuit_mul(t648, t648); let t650 = circuit_sub(t649, t640); let t651 = circuit_sub(t650, t640); let t652 = circuit_sub(t640, t651); let t653 = circuit_mul(t648, t652); let t654 = circuit_sub(t653, t643); let t655 = circuit_mul(t651, t651); let t656 = circuit_mul(in0, t655); let t657 = circuit_add(t654, t654); let t658 = circuit_inverse(t657); let t659 = circuit_mul(t656, t658); let t660 = circuit_mul(t659, t659); let t661 = circuit_sub(t660, t651); let t662 = circuit_sub(t661, t651); let t663 = circuit_sub(t651, t662); let t664 = circuit_mul(t659, t663); let t665 = circuit_sub(t664, t654); let t666 = circuit_mul(t662, t662); let t667 = circuit_mul(in0, t666); let t668 = circuit_add(t665, t665); let t669 = circuit_inverse(t668); let t670 = circuit_mul(t667, t669); let t671 = circuit_mul(t670, t670); let t672 = circuit_sub(t671, t662); let t673 = circuit_sub(t672, t662); let t674 = circuit_sub(t662, t673); let t675 = circuit_mul(t670, t674); let t676 = circuit_sub(t675, t665); let t677 = circuit_mul(t673, t673); let t678 = circuit_mul(in0, t677); let t679 = circuit_add(t676, t676); let t680 = circuit_inverse(t679); let t681 = circuit_mul(t678, t680); let t682 = circuit_mul(t681, t681); let t683 = circuit_sub(t682, t673); let t684 = circuit_sub(t683, t673); let t685 = circuit_sub(t673, t684); let t686 = circuit_mul(t681, t685); let t687 = circuit_sub(t686, t676); let t688 = circuit_mul(t684, t684); let t689 = circuit_mul(in0, t688); let t690 = circuit_add(t687, t687); let t691 = circuit_inverse(t690); let t692 = circuit_mul(t689, t691); let t693 = circuit_mul(t692, t692); let t694 = circuit_sub(t693, t684); let t695 = circuit_sub(t694, t684); let t696 = circuit_sub(t684, t695); let t697 = circuit_mul(t692, t696); let t698 = circuit_sub(t697, t687); let t699 = circuit_mul(t695, t695); let t700 = circuit_mul(in0, t699); let t701 = circuit_add(t698, t698); let t702 = circuit_inverse(t701); let t703 = circuit_mul(t700, t702); let t704 = circuit_mul(t703, t703); let t705 = circuit_sub(t704, t695); let t706 = circuit_sub(t705, t695); let t707 = circuit_sub(t695, t706); let t708 = circuit_mul(t703, t707); let t709 = circuit_sub(t708, t698); let t710 = circuit_mul(t706, t706); let t711 = circuit_mul(in0, t710); let t712 = circuit_add(t709, t709); let t713 = circuit_inverse(t712); let t714 = circuit_mul(t711, t713); let t715 = circuit_mul(t714, t714); let t716 = circuit_sub(t715, t706); let t717 = circuit_sub(t716, t706); let t718 = circuit_sub(t706, t717); let t719 = circuit_mul(t714, t718); let t720 = circuit_sub(t719, t709); let t721 = circuit_mul(t717, t717); let t722 = circuit_mul(in0, t721); let t723 = circuit_add(t720, t720); let t724 = circuit_inverse(t723); let t725 = circuit_mul(t722, t724); let t726 = circuit_mul(t725, t725); let t727 = circuit_sub(t726, t717); let t728 = circuit_sub(t727, t717); let t729 = circuit_sub(t717, t728); let t730 = circuit_mul(t725, t729); let t731 = circuit_sub(t730, t720); let t732 = circuit_mul(t728, t728); let t733 = circuit_mul(in0, t732); let t734 = circuit_add(t731, t731); let t735 = circuit_inverse(t734); let t736 = circuit_mul(t733, t735); let t737 = circuit_mul(t736, t736); let t738 = circuit_sub(t737, t728); let t739 = circuit_sub(t738, t728); let t740 = circuit_sub(t728, t739); let t741 = circuit_mul(t736, t740); let t742 = circuit_sub(t741, t731); let t743 = circuit_sub(in2, t742); let t744 = circuit_sub(in1, t739); let t745 = circuit_inverse(t744); let t746 = circuit_mul(t743, t745); let t747 = circuit_mul(t746, t746); let t748 = circuit_sub(t747, in1); let t749 = circuit_sub(t748, t739); let t750 = circuit_sub(in1, t749); let t751 = circuit_mul(t746, t750); let t752 = circuit_sub(t751, in2); let modulus = modulus; let mut circuit_inputs = (t749, t752).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(P.x); // in1 circuit_inputs = circuit_inputs.next_2(P.y); // in2 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: G1Point = G1Point { x: outputs.get_output(t749), y: outputs.get_output(t752) }; return (res,); } #[inline(always)] pub fn run_DOUBLE_AND_ADD_EC_POINTS_G2_circuit( p: G2Point, q: G2Point, modulus: core::circuit::CircuitModulus, ) -> (G2Point,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8) = (CE::> {}, CE::> {}); let t0 = circuit_sub(in7, in3); // Fp2 sub coeff 0/1 let t1 = circuit_sub(in8, in4); // Fp2 sub coeff 1/1 let t2 = circuit_sub(in5, in1); // Fp2 sub coeff 0/1 let t3 = circuit_sub(in6, in2); // Fp2 sub coeff 1/1 let t4 = circuit_mul(t2, t2); // Fp2 Inv start let t5 = circuit_mul(t3, t3); let t6 = circuit_add(t4, t5); let t7 = circuit_inverse(t6); let t8 = circuit_mul(t2, t7); // Fp2 Inv real part end let t9 = circuit_mul(t3, t7); let t10 = circuit_sub(in0, t9); // Fp2 Inv imag part end let t11 = circuit_mul(t0, t8); // Fp2 mul start let t12 = circuit_mul(t1, t10); let t13 = circuit_sub(t11, t12); // Fp2 mul real part end let t14 = circuit_mul(t0, t10); let t15 = circuit_mul(t1, t8); let t16 = circuit_add(t14, t15); // Fp2 mul imag part end let t17 = circuit_add(t13, t16); let t18 = circuit_sub(t13, t16); let t19 = circuit_mul(t17, t18); let t20 = circuit_mul(t13, t16); let t21 = circuit_add(t20, t20); let t22 = circuit_add(in1, in5); // Fp2 add coeff 0/1 let t23 = circuit_add(in2, in6); // Fp2 add coeff 1/1 let t24 = circuit_sub(t19, t22); // Fp2 sub coeff 0/1 let t25 = circuit_sub(t21, t23); // Fp2 sub coeff 1/1 let t26 = circuit_add(in3, in3); // Fp2 add coeff 0/1 let t27 = circuit_add(in4, in4); // Fp2 add coeff 1/1 let t28 = circuit_sub(t24, in1); // Fp2 sub coeff 0/1 let t29 = circuit_sub(t25, in2); // Fp2 sub coeff 1/1 let t30 = circuit_mul(t28, t28); // Fp2 Inv start let t31 = circuit_mul(t29, t29); let t32 = circuit_add(t30, t31); let t33 = circuit_inverse(t32); let t34 = circuit_mul(t28, t33); // Fp2 Inv real part end let t35 = circuit_mul(t29, t33); let t36 = circuit_sub(in0, t35); // Fp2 Inv imag part end let t37 = circuit_mul(t26, t34); // Fp2 mul start let t38 = circuit_mul(t27, t36); let t39 = circuit_sub(t37, t38); // Fp2 mul real part end let t40 = circuit_mul(t26, t36); let t41 = circuit_mul(t27, t34); let t42 = circuit_add(t40, t41); // Fp2 mul imag part end let t43 = circuit_add(t13, t39); // Fp2 add coeff 0/1 let t44 = circuit_add(t16, t42); // Fp2 add coeff 1/1 let t45 = circuit_add(t43, t44); let t46 = circuit_sub(t43, t44); let t47 = circuit_mul(t45, t46); let t48 = circuit_mul(t43, t44); let t49 = circuit_add(t48, t48); let t50 = circuit_add(in1, t24); // Fp2 add coeff 0/1 let t51 = circuit_add(in2, t25); // Fp2 add coeff 1/1 let t52 = circuit_sub(t47, t50); // Fp2 sub coeff 0/1 let t53 = circuit_sub(t49, t51); // Fp2 sub coeff 1/1 let t54 = circuit_sub(t52, in1); // Fp2 sub coeff 0/1 let t55 = circuit_sub(t53, in2); // Fp2 sub coeff 1/1 let t56 = circuit_mul(t43, t54); // Fp2 mul start let t57 = circuit_mul(t44, t55); let t58 = circuit_sub(t56, t57); // Fp2 mul real part end let t59 = circuit_mul(t43, t55); let t60 = circuit_mul(t44, t54); let t61 = circuit_add(t59, t60); // Fp2 mul imag part end let t62 = circuit_sub(t58, in3); // Fp2 sub coeff 0/1 let t63 = circuit_sub(t61, in4); // Fp2 sub coeff 1/1 let modulus = modulus; let mut circuit_inputs = (t52, t53, t62, t63).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x0); // in1 circuit_inputs = circuit_inputs.next_2(p.x1); // in2 circuit_inputs = circuit_inputs.next_2(p.y0); // in3 circuit_inputs = circuit_inputs.next_2(p.y1); // in4 circuit_inputs = circuit_inputs.next_2(q.x0); // in5 circuit_inputs = circuit_inputs.next_2(q.x1); // in6 circuit_inputs = circuit_inputs.next_2(q.y0); // in7 circuit_inputs = circuit_inputs.next_2(q.y1); // in8 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let result: G2Point = G2Point { x0: outputs.get_output(t52), x1: outputs.get_output(t53), y0: outputs.get_output(t62), y1: outputs.get_output(t63), }; return (result,); } #[inline(always)] pub fn run_DOUBLE_EC_POINT_G2_A_EQ_0_circuit( p: G2Point, modulus: core::circuit::CircuitModulus, ) -> (G2Point,) { // CONSTANT stack let in0 = CE::> {}; // 0x3 let in1 = CE::> {}; // 0x0 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let in5 = CE::> {}; let t0 = circuit_add(in2, in3); let t1 = circuit_sub(in2, in3); let t2 = circuit_mul(t0, t1); let t3 = circuit_mul(in2, in3); let t4 = circuit_add(t3, t3); let t5 = circuit_mul(t2, in0); // Fp2 scalar mul coeff 0/1 let t6 = circuit_mul(t4, in0); // Fp2 scalar mul coeff 1/1 let t7 = circuit_add(in4, in4); // Fp2 add coeff 0/1 let t8 = circuit_add(in5, in5); // Fp2 add coeff 1/1 let t9 = circuit_mul(t7, t7); // Fp2 Inv start let t10 = circuit_mul(t8, t8); let t11 = circuit_add(t9, t10); let t12 = circuit_inverse(t11); let t13 = circuit_mul(t7, t12); // Fp2 Inv real part end let t14 = circuit_mul(t8, t12); let t15 = circuit_sub(in1, t14); // Fp2 Inv imag part end let t16 = circuit_mul(t5, t13); // Fp2 mul start let t17 = circuit_mul(t6, t15); let t18 = circuit_sub(t16, t17); // Fp2 mul real part end let t19 = circuit_mul(t5, t15); let t20 = circuit_mul(t6, t13); let t21 = circuit_add(t19, t20); // Fp2 mul imag part end let t22 = circuit_add(t18, t21); let t23 = circuit_sub(t18, t21); let t24 = circuit_mul(t22, t23); let t25 = circuit_mul(t18, t21); let t26 = circuit_add(t25, t25); let t27 = circuit_sub(t24, in2); // Fp2 sub coeff 0/1 let t28 = circuit_sub(t26, in3); // Fp2 sub coeff 1/1 let t29 = circuit_sub(t27, in2); // Fp2 sub coeff 0/1 let t30 = circuit_sub(t28, in3); // Fp2 sub coeff 1/1 let t31 = circuit_sub(in2, t29); // Fp2 sub coeff 0/1 let t32 = circuit_sub(in3, t30); // Fp2 sub coeff 1/1 let t33 = circuit_mul(t18, t31); // Fp2 mul start let t34 = circuit_mul(t21, t32); let t35 = circuit_sub(t33, t34); // Fp2 mul real part end let t36 = circuit_mul(t18, t32); let t37 = circuit_mul(t21, t31); let t38 = circuit_add(t36, t37); // Fp2 mul imag part end let t39 = circuit_sub(t35, in4); // Fp2 sub coeff 0/1 let t40 = circuit_sub(t38, in5); // Fp2 sub coeff 1/1 let modulus = modulus; let mut circuit_inputs = (t29, t30, t39, t40).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x0); // in2 circuit_inputs = circuit_inputs.next_2(p.x1); // in3 circuit_inputs = circuit_inputs.next_2(p.y0); // in4 circuit_inputs = circuit_inputs.next_2(p.y1); // in5 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let result: G2Point = G2Point { x0: outputs.get_output(t29), x1: outputs.get_output(t30), y0: outputs.get_output(t39), y1: outputs.get_output(t40), }; return (result,); } #[inline(always)] pub fn run_DOUBLE_EC_POINT_circuit( p: G1Point, A_weirstrass: u384, modulus: core::circuit::CircuitModulus, ) -> (G1Point,) { // CONSTANT stack let in0 = CE::> {}; // 0x3 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_mul(in1, in1); let t1 = circuit_mul(in0, t0); let t2 = circuit_add(t1, in3); let t3 = circuit_add(in2, in2); let t4 = circuit_inverse(t3); let t5 = circuit_mul(t2, t4); let t6 = circuit_mul(t5, t5); let t7 = circuit_sub(t6, in1); let t8 = circuit_sub(t7, in1); let t9 = circuit_sub(in1, t8); let t10 = circuit_mul(t5, t9); let t11 = circuit_sub(t10, in2); let modulus = modulus; let mut circuit_inputs = (t8, t11).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x); // in1 circuit_inputs = circuit_inputs.next_2(p.y); // in2 circuit_inputs = circuit_inputs.next_2(A_weirstrass); // in3 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let r: G1Point = G1Point { x: outputs.get_output(t8), y: outputs.get_output(t11) }; return (r,); } #[inline(always)] pub fn run_IS_ON_CURVE_G1_G2_circuit( p: G1Point, q: G2Point, a: u384, b: u384, b20: u384, b21: u384, curve_index: usize, ) -> (u384, u384, u384) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let in9 = CE::> {}; let t0 = circuit_mul(in1, in1); let t1 = circuit_mul(in0, in0); let t2 = circuit_mul(in0, t1); let t3 = circuit_add(t2, in7); let t4 = circuit_add(in4, in5); let t5 = circuit_sub(in4, in5); let t6 = circuit_mul(t4, t5); let t7 = circuit_mul(in4, in5); let t8 = circuit_add(t7, t7); let t9 = circuit_add(in2, in3); let t10 = circuit_sub(in2, in3); let t11 = circuit_mul(t9, t10); let t12 = circuit_mul(in2, in3); let t13 = circuit_add(t12, t12); let t14 = circuit_mul(in2, t11); // Fp2 mul start let t15 = circuit_mul(in3, t13); let t16 = circuit_sub(t14, t15); // Fp2 mul real part end let t17 = circuit_mul(in2, t13); let t18 = circuit_mul(in3, t11); let t19 = circuit_add(t17, t18); // Fp2 mul imag part end let t20 = circuit_mul(in6, in2); let t21 = circuit_mul(in6, in3); let t22 = circuit_add(t20, in8); let t23 = circuit_add(t21, in9); let t24 = circuit_add(t16, t22); let t25 = circuit_add(t19, t23); let t26 = circuit_sub(t0, t3); let t27 = circuit_sub(t6, t24); let t28 = circuit_sub(t8, t25); let modulus = crate::definitions::get_modulus(curve_index); let mut circuit_inputs = (t26, t27, t28).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x); // in0 circuit_inputs = circuit_inputs.next_2(p.y); // in1 circuit_inputs = circuit_inputs.next_2(q.x0); // in2 circuit_inputs = circuit_inputs.next_2(q.x1); // in3 circuit_inputs = circuit_inputs.next_2(q.y0); // in4 circuit_inputs = circuit_inputs.next_2(q.y1); // in5 circuit_inputs = circuit_inputs.next_2(a); // in6 circuit_inputs = circuit_inputs.next_2(b); // in7 circuit_inputs = circuit_inputs.next_2(b20); // in8 circuit_inputs = circuit_inputs.next_2(b21); // in9 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let zero_check_0: u384 = outputs.get_output(t26); let zero_check_1: u384 = outputs.get_output(t27); let zero_check_2: u384 = outputs.get_output(t28); return (zero_check_0, zero_check_1, zero_check_2); } #[inline(always)] pub fn run_IS_ON_CURVE_G1_circuit(p: G1Point, a: u384, b: u384, curve_index: usize) -> (u384,) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let in3 = CE::> {}; let t0 = circuit_mul(in1, in1); let t1 = circuit_mul(in0, in0); let t2 = circuit_mul(in0, t1); let t3 = circuit_mul(in2, in0); let t4 = circuit_add(t3, in3); let t5 = circuit_add(t2, t4); let t6 = circuit_sub(t0, t5); let modulus = crate::definitions::get_modulus(curve_index); let mut circuit_inputs = (t6,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x); // in0 circuit_inputs = circuit_inputs.next_2(p.y); // in1 circuit_inputs = circuit_inputs.next_2(a); // in2 circuit_inputs = circuit_inputs.next_2(b); // in3 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let zero_check: u384 = outputs.get_output(t6); return (zero_check,); } #[inline(always)] pub fn run_IS_ON_CURVE_G2_circuit( p: G2Point, a: u384, b20: u384, b21: u384, curve_index: usize, ) -> (u384, u384) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let in6 = CE::> {}; let t0 = circuit_add(in2, in3); let t1 = circuit_sub(in2, in3); let t2 = circuit_mul(t0, t1); let t3 = circuit_mul(in2, in3); let t4 = circuit_add(t3, t3); let t5 = circuit_add(in0, in1); let t6 = circuit_sub(in0, in1); let t7 = circuit_mul(t5, t6); let t8 = circuit_mul(in0, in1); let t9 = circuit_add(t8, t8); let t10 = circuit_mul(in0, t7); // Fp2 mul start let t11 = circuit_mul(in1, t9); let t12 = circuit_sub(t10, t11); // Fp2 mul real part end let t13 = circuit_mul(in0, t9); let t14 = circuit_mul(in1, t7); let t15 = circuit_add(t13, t14); // Fp2 mul imag part end let t16 = circuit_mul(in4, in0); let t17 = circuit_mul(in4, in1); let t18 = circuit_add(t16, in5); let t19 = circuit_add(t17, in6); let t20 = circuit_add(t12, t18); let t21 = circuit_add(t15, t19); let t22 = circuit_sub(t2, t20); let t23 = circuit_sub(t4, t21); let modulus = crate::definitions::get_modulus(curve_index); let mut circuit_inputs = (t22, t23).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x0); // in0 circuit_inputs = circuit_inputs.next_2(p.x1); // in1 circuit_inputs = circuit_inputs.next_2(p.y0); // in2 circuit_inputs = circuit_inputs.next_2(p.y1); // in3 circuit_inputs = circuit_inputs.next_2(a); // in4 circuit_inputs = circuit_inputs.next_2(b20); // in5 circuit_inputs = circuit_inputs.next_2(b21); // in6 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let zero_check_0: u384 = outputs.get_output(t22); let zero_check_1: u384 = outputs.get_output(t23); return (zero_check_0, zero_check_1); } #[inline(always)] pub fn run_PREPARE_FAKE_GLV_PTS_circuit( P: G1Point, Q: G1Point, s2_sign: u384, A_weirstrass: u384, modulus: core::circuit::CircuitModulus, ) -> ( G1Point, G1Point, G1Point, G1Point, u384, u384, u384, u384, G1Point, G1Point, G1Point, G1Point, u384, u384, u384, u384, G1Point, u384, ) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_mul(in1, in1); let t1 = circuit_add(t0, t0); let t2 = circuit_add(t1, t0); let t3 = circuit_add(t2, in6); let t4 = circuit_add(in2, in2); let t5 = circuit_inverse(t4); let t6 = circuit_mul(t3, t5); let t7 = circuit_mul(t6, t6); let t8 = circuit_add(in1, in1); let t9 = circuit_sub(t7, t8); let t10 = circuit_sub(in1, t9); let t11 = circuit_add(in2, in2); let t12 = circuit_inverse(t10); let t13 = circuit_mul(t11, t12); let t14 = circuit_sub(t13, t6); let t15 = circuit_mul(t14, t14); let t16 = circuit_add(in1, t9); let t17 = circuit_sub(t15, t16); let t18 = circuit_sub(in1, t17); let t19 = circuit_mul(t14, t18); let t20 = circuit_sub(t19, in2); let t21 = circuit_mul(in5, in4); let t22 = circuit_sub(in0, t21); let t23 = circuit_mul(in3, in3); let t24 = circuit_add(t23, t23); let t25 = circuit_add(t24, t23); let t26 = circuit_add(t25, in6); let t27 = circuit_add(t21, t21); let t28 = circuit_inverse(t27); let t29 = circuit_mul(t26, t28); let t30 = circuit_mul(t29, t29); let t31 = circuit_add(in3, in3); let t32 = circuit_sub(t30, t31); let t33 = circuit_sub(in3, t32); let t34 = circuit_add(t21, t21); let t35 = circuit_inverse(t33); let t36 = circuit_mul(t34, t35); let t37 = circuit_sub(t36, t29); let t38 = circuit_mul(t37, t37); let t39 = circuit_add(in3, t32); let t40 = circuit_sub(t38, t39); let t41 = circuit_sub(in3, t40); let t42 = circuit_mul(t37, t41); let t43 = circuit_sub(t42, t21); let t44 = circuit_sub(t20, t43); let t45 = circuit_sub(t17, t40); let t46 = circuit_inverse(t45); let t47 = circuit_mul(t44, t46); let t48 = circuit_mul(t47, t47); let t49 = circuit_sub(t48, t17); let t50 = circuit_sub(t49, t40); let t51 = circuit_sub(t17, t50); let t52 = circuit_mul(t47, t51); let t53 = circuit_sub(t52, t20); let t54 = circuit_sub(in2, t21); let t55 = circuit_sub(in1, in3); let t56 = circuit_inverse(t55); let t57 = circuit_mul(t54, t56); let t58 = circuit_mul(t57, t57); let t59 = circuit_sub(t58, in1); let t60 = circuit_sub(t59, in3); let t61 = circuit_sub(in1, t60); let t62 = circuit_mul(t57, t61); let t63 = circuit_sub(t62, in2); let t64 = circuit_sub(t20, t21); let t65 = circuit_sub(t17, in3); let t66 = circuit_inverse(t65); let t67 = circuit_mul(t64, t66); let t68 = circuit_mul(t67, t67); let t69 = circuit_sub(t68, t17); let t70 = circuit_sub(t69, in3); let t71 = circuit_sub(t17, t70); let t72 = circuit_mul(t67, t71); let t73 = circuit_sub(t72, t20); let t74 = circuit_sub(in2, t43); let t75 = circuit_sub(in1, t40); let t76 = circuit_inverse(t75); let t77 = circuit_mul(t74, t76); let t78 = circuit_mul(t77, t77); let t79 = circuit_sub(t78, in1); let t80 = circuit_sub(t79, t40); let t81 = circuit_sub(in1, t80); let t82 = circuit_mul(t77, t81); let t83 = circuit_sub(t82, in2); let t84 = circuit_sub(in0, t63); let t85 = circuit_sub(in0, t53); let t86 = circuit_sub(in0, t83); let t87 = circuit_sub(in0, t73); let t88 = circuit_sub(t20, t22); let t89 = circuit_sub(t17, in3); let t90 = circuit_inverse(t89); let t91 = circuit_mul(t88, t90); let t92 = circuit_mul(t91, t91); let t93 = circuit_sub(t92, t17); let t94 = circuit_sub(t93, in3); let t95 = circuit_sub(t17, t94); let t96 = circuit_mul(t91, t95); let t97 = circuit_sub(t96, t20); let t98 = circuit_sub(in0, t43); let t99 = circuit_sub(in2, t98); let t100 = circuit_sub(in1, t40); let t101 = circuit_inverse(t100); let t102 = circuit_mul(t99, t101); let t103 = circuit_mul(t102, t102); let t104 = circuit_sub(t103, in1); let t105 = circuit_sub(t104, t40); let t106 = circuit_sub(in1, t105); let t107 = circuit_mul(t102, t106); let t108 = circuit_sub(t107, in2); let t109 = circuit_sub(t20, t98); let t110 = circuit_sub(t17, t40); let t111 = circuit_inverse(t110); let t112 = circuit_mul(t109, t111); let t113 = circuit_mul(t112, t112); let t114 = circuit_sub(t113, t17); let t115 = circuit_sub(t114, t40); let t116 = circuit_sub(t17, t115); let t117 = circuit_mul(t112, t116); let t118 = circuit_sub(t117, t20); let t119 = circuit_sub(t22, in2); let t120 = circuit_sub(in3, in1); let t121 = circuit_inverse(t120); let t122 = circuit_mul(t119, t121); let t123 = circuit_mul(t122, t122); let t124 = circuit_sub(t123, in3); let t125 = circuit_sub(t124, in1); let t126 = circuit_sub(in3, t125); let t127 = circuit_mul(t122, t126); let t128 = circuit_sub(t127, t22); let t129 = circuit_sub(in0, t108); let t130 = circuit_sub(in0, t97); let t131 = circuit_sub(in0, t128); let t132 = circuit_sub(in0, t118); let modulus = modulus; let mut circuit_inputs = ( t50, t53, t60, t63, t70, t73, t80, t83, t84, t85, t86, t87, t94, t97, t105, t108, t115, t118, t125, t128, t129, t130, t131, t132, t40, t43, t22, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(P.x); // in1 circuit_inputs = circuit_inputs.next_2(P.y); // in2 circuit_inputs = circuit_inputs.next_2(Q.x); // in3 circuit_inputs = circuit_inputs.next_2(Q.y); // in4 circuit_inputs = circuit_inputs.next_2(s2_sign); // in5 circuit_inputs = circuit_inputs.next_2(A_weirstrass); // in6 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let T1: G1Point = G1Point { x: outputs.get_output(t50), y: outputs.get_output(t53) }; let T2: G1Point = G1Point { x: outputs.get_output(t60), y: outputs.get_output(t63) }; let T3: G1Point = G1Point { x: outputs.get_output(t70), y: outputs.get_output(t73) }; let T4: G1Point = G1Point { x: outputs.get_output(t80), y: outputs.get_output(t83) }; let T5y: u384 = outputs.get_output(t84); let T6y: u384 = outputs.get_output(t85); let T7y: u384 = outputs.get_output(t86); let T8y: u384 = outputs.get_output(t87); let T9: G1Point = G1Point { x: outputs.get_output(t94), y: outputs.get_output(t97) }; let T10: G1Point = G1Point { x: outputs.get_output(t105), y: outputs.get_output(t108) }; let T11: G1Point = G1Point { x: outputs.get_output(t115), y: outputs.get_output(t118) }; let T12: G1Point = G1Point { x: outputs.get_output(t125), y: outputs.get_output(t128) }; let T13y: u384 = outputs.get_output(t129); let T14y: u384 = outputs.get_output(t130); let T15y: u384 = outputs.get_output(t131); let T16y: u384 = outputs.get_output(t132); let R2: G1Point = G1Point { x: outputs.get_output(t40), y: outputs.get_output(t43) }; let R0y: u384 = outputs.get_output(t22); return (T1, T2, T3, T4, T5y, T6y, T7y, T8y, T9, T10, T11, T12, T13y, T14y, T15y, T16y, R2, R0y); } #[inline(always)] pub fn run_PREPARE_GLV_FAKE_GLV_PTS_circuit( Px: u384, P0y: u384, P1y: u384, Qx: u384, Q0y: u384, Phi_P0y: u384, Phi_P1y: u384, Phi_Q0y: u384, Gen: G1Point, third_root: u384, modulus: core::circuit::CircuitModulus, ) -> ( G1Point, G1Point, G1Point, G1Point, G1Point, G1Point, G1Point, G1Point, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, G1Point, ) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8, in9) = (CE::> {}, CE::> {}, CE::> {}); let (in10, in11) = (CE::> {}, CE::> {}); let t0 = circuit_sub(in2, in5); let t1 = circuit_sub(in1, in4); let t2 = circuit_inverse(t1); let t3 = circuit_mul(t0, t2); let t4 = circuit_mul(t3, t3); let t5 = circuit_sub(t4, in1); let t6 = circuit_sub(t5, in4); let t7 = circuit_sub(in1, t6); let t8 = circuit_mul(t3, t7); let t9 = circuit_sub(t8, in2); let t10 = circuit_sub(in0, t9); let t11 = circuit_sub(in3, in5); let t12 = circuit_sub(in1, in4); let t13 = circuit_inverse(t12); let t14 = circuit_mul(t11, t13); let t15 = circuit_mul(t14, t14); let t16 = circuit_sub(t15, in1); let t17 = circuit_sub(t16, in4); let t18 = circuit_sub(in1, t17); let t19 = circuit_mul(t14, t18); let t20 = circuit_sub(t19, in3); let t21 = circuit_mul(in1, in11); let t22 = circuit_mul(in4, in11); let t23 = circuit_sub(in6, in8); let t24 = circuit_sub(t21, t22); let t25 = circuit_inverse(t24); let t26 = circuit_mul(t23, t25); let t27 = circuit_mul(t26, t26); let t28 = circuit_sub(t27, t21); let t29 = circuit_sub(t28, t22); let t30 = circuit_sub(t21, t29); let t31 = circuit_mul(t26, t30); let t32 = circuit_sub(t31, in6); let t33 = circuit_sub(in0, t32); let t34 = circuit_sub(in7, in8); let t35 = circuit_sub(t21, t22); let t36 = circuit_inverse(t35); let t37 = circuit_mul(t34, t36); let t38 = circuit_mul(t37, t37); let t39 = circuit_sub(t38, t21); let t40 = circuit_sub(t39, t22); let t41 = circuit_sub(t21, t40); let t42 = circuit_mul(t37, t41); let t43 = circuit_sub(t42, in7); let t44 = circuit_sub(in0, t43); let t45 = circuit_sub(t10, t33); let t46 = circuit_sub(t6, t29); let t47 = circuit_inverse(t46); let t48 = circuit_mul(t45, t47); let t49 = circuit_mul(t48, t48); let t50 = circuit_sub(t49, t6); let t51 = circuit_sub(t50, t29); let t52 = circuit_sub(t6, t51); let t53 = circuit_mul(t48, t52); let t54 = circuit_sub(t53, t10); let t55 = circuit_sub(t10, t43); let t56 = circuit_sub(t6, t40); let t57 = circuit_inverse(t56); let t58 = circuit_mul(t55, t57); let t59 = circuit_mul(t58, t58); let t60 = circuit_sub(t59, t6); let t61 = circuit_sub(t60, t40); let t62 = circuit_sub(t6, t61); let t63 = circuit_mul(t58, t62); let t64 = circuit_sub(t63, t10); let t65 = circuit_sub(t10, t44); let t66 = circuit_sub(t6, t40); let t67 = circuit_inverse(t66); let t68 = circuit_mul(t65, t67); let t69 = circuit_mul(t68, t68); let t70 = circuit_sub(t69, t6); let t71 = circuit_sub(t70, t40); let t72 = circuit_sub(t6, t71); let t73 = circuit_mul(t68, t72); let t74 = circuit_sub(t73, t10); let t75 = circuit_sub(t10, t32); let t76 = circuit_sub(t6, t29); let t77 = circuit_inverse(t76); let t78 = circuit_mul(t75, t77); let t79 = circuit_mul(t78, t78); let t80 = circuit_sub(t79, t6); let t81 = circuit_sub(t80, t29); let t82 = circuit_sub(t6, t81); let t83 = circuit_mul(t78, t82); let t84 = circuit_sub(t83, t10); let t85 = circuit_sub(t20, t33); let t86 = circuit_sub(t17, t29); let t87 = circuit_inverse(t86); let t88 = circuit_mul(t85, t87); let t89 = circuit_mul(t88, t88); let t90 = circuit_sub(t89, t17); let t91 = circuit_sub(t90, t29); let t92 = circuit_sub(t17, t91); let t93 = circuit_mul(t88, t92); let t94 = circuit_sub(t93, t20); let t95 = circuit_sub(t20, t43); let t96 = circuit_sub(t17, t40); let t97 = circuit_inverse(t96); let t98 = circuit_mul(t95, t97); let t99 = circuit_mul(t98, t98); let t100 = circuit_sub(t99, t17); let t101 = circuit_sub(t100, t40); let t102 = circuit_sub(t17, t101); let t103 = circuit_mul(t98, t102); let t104 = circuit_sub(t103, t20); let t105 = circuit_sub(t20, t44); let t106 = circuit_sub(t17, t40); let t107 = circuit_inverse(t106); let t108 = circuit_mul(t105, t107); let t109 = circuit_mul(t108, t108); let t110 = circuit_sub(t109, t17); let t111 = circuit_sub(t110, t40); let t112 = circuit_sub(t17, t111); let t113 = circuit_mul(t108, t112); let t114 = circuit_sub(t113, t20); let t115 = circuit_sub(t20, t32); let t116 = circuit_sub(t17, t29); let t117 = circuit_inverse(t116); let t118 = circuit_mul(t115, t117); let t119 = circuit_mul(t118, t118); let t120 = circuit_sub(t119, t17); let t121 = circuit_sub(t120, t29); let t122 = circuit_sub(t17, t121); let t123 = circuit_mul(t118, t122); let t124 = circuit_sub(t123, t20); let t125 = circuit_sub(in0, t124); let t126 = circuit_sub(in0, t114); let t127 = circuit_sub(in0, t104); let t128 = circuit_sub(in0, t94); let t129 = circuit_sub(in0, t84); let t130 = circuit_sub(in0, t74); let t131 = circuit_sub(in0, t64); let t132 = circuit_sub(in0, t54); let t133 = circuit_sub(t54, in10); let t134 = circuit_sub(t51, in9); let t135 = circuit_inverse(t134); let t136 = circuit_mul(t133, t135); let t137 = circuit_mul(t136, t136); let t138 = circuit_sub(t137, t51); let t139 = circuit_sub(t138, in9); let t140 = circuit_sub(t51, t139); let t141 = circuit_mul(t136, t140); let t142 = circuit_sub(t141, t54); let modulus = modulus; let mut circuit_inputs = ( t51, t54, t61, t64, t71, t74, t81, t84, t91, t94, t101, t104, t111, t114, t121, t124, t125, t126, t127, t128, t129, t130, t131, t132, t21, t22, t139, t142, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(Px); // in1 circuit_inputs = circuit_inputs.next_2(P0y); // in2 circuit_inputs = circuit_inputs.next_2(P1y); // in3 circuit_inputs = circuit_inputs.next_2(Qx); // in4 circuit_inputs = circuit_inputs.next_2(Q0y); // in5 circuit_inputs = circuit_inputs.next_2(Phi_P0y); // in6 circuit_inputs = circuit_inputs.next_2(Phi_P1y); // in7 circuit_inputs = circuit_inputs.next_2(Phi_Q0y); // in8 circuit_inputs = circuit_inputs.next_2(Gen.x); // in9 circuit_inputs = circuit_inputs.next_2(Gen.y); // in10 circuit_inputs = circuit_inputs.next_2(third_root); // in11 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let B1: G1Point = G1Point { x: outputs.get_output(t51), y: outputs.get_output(t54) }; let B2: G1Point = G1Point { x: outputs.get_output(t61), y: outputs.get_output(t64) }; let B3: G1Point = G1Point { x: outputs.get_output(t71), y: outputs.get_output(t74) }; let B4: G1Point = G1Point { x: outputs.get_output(t81), y: outputs.get_output(t84) }; let B5: G1Point = G1Point { x: outputs.get_output(t91), y: outputs.get_output(t94) }; let B6: G1Point = G1Point { x: outputs.get_output(t101), y: outputs.get_output(t104) }; let B7: G1Point = G1Point { x: outputs.get_output(t111), y: outputs.get_output(t114) }; let B8: G1Point = G1Point { x: outputs.get_output(t121), y: outputs.get_output(t124) }; let B9y: u384 = outputs.get_output(t125); let B10y: u384 = outputs.get_output(t126); let B11y: u384 = outputs.get_output(t127); let B12y: u384 = outputs.get_output(t128); let B13y: u384 = outputs.get_output(t129); let B14y: u384 = outputs.get_output(t130); let B15y: u384 = outputs.get_output(t131); let B16y: u384 = outputs.get_output(t132); let Phi_P0x: u384 = outputs.get_output(t21); let Phi_Q0x: u384 = outputs.get_output(t22); let Acc: G1Point = G1Point { x: outputs.get_output(t139), y: outputs.get_output(t142) }; return ( B1, B2, B3, B4, B5, B6, B7, B8, B9y, B10y, B11y, B12y, B13y, B14y, B15y, B16y, Phi_P0x, Phi_Q0x, Acc, ); } #[inline(always)] pub fn run_PSI_G2_BLS12_381_circuit( p: G2Point, modulus: core::circuit::CircuitModulus, ) -> (G2Point,) { // CONSTANT stack let in0 = CE::< CI<0>, > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaad let in1 = CE::< CI<1>, > {}; // 0x135203e60180a68ee2e9c448d77a2cd91c3dedd930b1cf60ef396489f61eb45e304466cf3e67fa0af1ee7b04121bdea2 let in2 = CE::< CI<2>, > {}; // 0x6af0e0437ff400b6831e36d6bd17ffe48395dabc2d3435e77f76e17009241c5ee67992f72ec05f4c81084fbede3cc09 let in3 = CE::> {}; // 0x0 // INPUT stack let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let in7 = CE::> {}; let t0 = circuit_mul(in5, in0); let t1 = circuit_mul(in4, in0); let t2 = circuit_sub(in3, in7); let t3 = circuit_mul(in6, in1); // Fp2 mul start let t4 = circuit_mul(t2, in2); let t5 = circuit_sub(t3, t4); // Fp2 mul real part end let t6 = circuit_mul(in6, in2); let t7 = circuit_mul(t2, in1); let t8 = circuit_add(t6, t7); // Fp2 mul imag part end let modulus = modulus; let mut circuit_inputs = (t0, t1, t5, t8).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [ 0x4f49fffd8bfd00000000aaad, 0x897d29650fb85f9b409427eb, 0x63d4de85aa0d857d89759ad4, 0x1a0111ea397fe699ec024086, ], ); // in0 circuit_inputs = circuit_inputs .next_2( [ 0x3e67fa0af1ee7b04121bdea2, 0xef396489f61eb45e304466cf, 0xd77a2cd91c3dedd930b1cf60, 0x135203e60180a68ee2e9c448, ], ); // in1 circuit_inputs = circuit_inputs .next_2( [ 0x72ec05f4c81084fbede3cc09, 0x77f76e17009241c5ee67992f, 0x6bd17ffe48395dabc2d3435e, 0x6af0e0437ff400b6831e36d, ], ); // in2 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in3 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p.x0); // in4 circuit_inputs = circuit_inputs.next_2(p.x1); // in5 circuit_inputs = circuit_inputs.next_2(p.y0); // in6 circuit_inputs = circuit_inputs.next_2(p.y1); // in7 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let result: G2Point = G2Point { x0: outputs.get_output(t0), x1: outputs.get_output(t1), y0: outputs.get_output(t5), y1: outputs.get_output(t8), }; return (result,); } #[inline(always)] pub fn run_QUADRUPLE_AND_ADD_9_circuit( P: G1Point, Q_1: G1Point, Q_2: G1Point, Q_3: G1Point, Q_4: G1Point, Q_5: G1Point, Q_6: G1Point, Q_7: G1Point, Q_8: G1Point, Q_9: G1Point, A_weirstrass: u384, modulus: core::circuit::CircuitModulus, ) -> (G1Point,) { // CONSTANT stack let in0 = CE::> {}; // 0x3 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8, in9) = (CE::> {}, CE::> {}, CE::> {}); let (in10, in11, in12) = (CE::> {}, CE::> {}, CE::> {}); let (in13, in14, in15) = (CE::> {}, CE::> {}, CE::> {}); let (in16, in17, in18) = (CE::> {}, CE::> {}, CE::> {}); let (in19, in20, in21) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_mul(in1, in1); let t1 = circuit_mul(in0, t0); let t2 = circuit_add(t1, in21); let t3 = circuit_add(in2, in2); let t4 = circuit_inverse(t3); let t5 = circuit_mul(t2, t4); let t6 = circuit_mul(t5, t5); let t7 = circuit_sub(t6, in1); let t8 = circuit_sub(t7, in1); let t9 = circuit_sub(in1, t8); let t10 = circuit_mul(t5, t9); let t11 = circuit_sub(t10, in2); let t12 = circuit_sub(in4, t11); let t13 = circuit_sub(in3, t8); let t14 = circuit_inverse(t13); let t15 = circuit_mul(t12, t14); let t16 = circuit_mul(t15, t15); let t17 = circuit_add(t8, in3); let t18 = circuit_sub(t16, t17); let t19 = circuit_add(t11, t11); let t20 = circuit_sub(t18, t8); let t21 = circuit_inverse(t20); let t22 = circuit_mul(t19, t21); let t23 = circuit_add(t15, t22); let t24 = circuit_mul(t23, t23); let t25 = circuit_add(t8, t18); let t26 = circuit_sub(t24, t25); let t27 = circuit_sub(t26, t8); let t28 = circuit_mul(t23, t27); let t29 = circuit_sub(t28, t11); let t30 = circuit_mul(t26, t26); let t31 = circuit_mul(in0, t30); let t32 = circuit_add(t31, in21); let t33 = circuit_add(t29, t29); let t34 = circuit_inverse(t33); let t35 = circuit_mul(t32, t34); let t36 = circuit_mul(t35, t35); let t37 = circuit_sub(t36, t26); let t38 = circuit_sub(t37, t26); let t39 = circuit_sub(t26, t38); let t40 = circuit_mul(t35, t39); let t41 = circuit_sub(t40, t29); let t42 = circuit_sub(in6, t41); let t43 = circuit_sub(in5, t38); let t44 = circuit_inverse(t43); let t45 = circuit_mul(t42, t44); let t46 = circuit_mul(t45, t45); let t47 = circuit_add(t38, in5); let t48 = circuit_sub(t46, t47); let t49 = circuit_add(t41, t41); let t50 = circuit_sub(t48, t38); let t51 = circuit_inverse(t50); let t52 = circuit_mul(t49, t51); let t53 = circuit_add(t45, t52); let t54 = circuit_mul(t53, t53); let t55 = circuit_add(t38, t48); let t56 = circuit_sub(t54, t55); let t57 = circuit_sub(t56, t38); let t58 = circuit_mul(t53, t57); let t59 = circuit_sub(t58, t41); let t60 = circuit_mul(t56, t56); let t61 = circuit_mul(in0, t60); let t62 = circuit_add(t61, in21); let t63 = circuit_add(t59, t59); let t64 = circuit_inverse(t63); let t65 = circuit_mul(t62, t64); let t66 = circuit_mul(t65, t65); let t67 = circuit_sub(t66, t56); let t68 = circuit_sub(t67, t56); let t69 = circuit_sub(t56, t68); let t70 = circuit_mul(t65, t69); let t71 = circuit_sub(t70, t59); let t72 = circuit_sub(in8, t71); let t73 = circuit_sub(in7, t68); let t74 = circuit_inverse(t73); let t75 = circuit_mul(t72, t74); let t76 = circuit_mul(t75, t75); let t77 = circuit_add(t68, in7); let t78 = circuit_sub(t76, t77); let t79 = circuit_add(t71, t71); let t80 = circuit_sub(t78, t68); let t81 = circuit_inverse(t80); let t82 = circuit_mul(t79, t81); let t83 = circuit_add(t75, t82); let t84 = circuit_mul(t83, t83); let t85 = circuit_add(t68, t78); let t86 = circuit_sub(t84, t85); let t87 = circuit_sub(t86, t68); let t88 = circuit_mul(t83, t87); let t89 = circuit_sub(t88, t71); let t90 = circuit_mul(t86, t86); let t91 = circuit_mul(in0, t90); let t92 = circuit_add(t91, in21); let t93 = circuit_add(t89, t89); let t94 = circuit_inverse(t93); let t95 = circuit_mul(t92, t94); let t96 = circuit_mul(t95, t95); let t97 = circuit_sub(t96, t86); let t98 = circuit_sub(t97, t86); let t99 = circuit_sub(t86, t98); let t100 = circuit_mul(t95, t99); let t101 = circuit_sub(t100, t89); let t102 = circuit_sub(in10, t101); let t103 = circuit_sub(in9, t98); let t104 = circuit_inverse(t103); let t105 = circuit_mul(t102, t104); let t106 = circuit_mul(t105, t105); let t107 = circuit_add(t98, in9); let t108 = circuit_sub(t106, t107); let t109 = circuit_add(t101, t101); let t110 = circuit_sub(t108, t98); let t111 = circuit_inverse(t110); let t112 = circuit_mul(t109, t111); let t113 = circuit_add(t105, t112); let t114 = circuit_mul(t113, t113); let t115 = circuit_add(t98, t108); let t116 = circuit_sub(t114, t115); let t117 = circuit_sub(t116, t98); let t118 = circuit_mul(t113, t117); let t119 = circuit_sub(t118, t101); let t120 = circuit_mul(t116, t116); let t121 = circuit_mul(in0, t120); let t122 = circuit_add(t121, in21); let t123 = circuit_add(t119, t119); let t124 = circuit_inverse(t123); let t125 = circuit_mul(t122, t124); let t126 = circuit_mul(t125, t125); let t127 = circuit_sub(t126, t116); let t128 = circuit_sub(t127, t116); let t129 = circuit_sub(t116, t128); let t130 = circuit_mul(t125, t129); let t131 = circuit_sub(t130, t119); let t132 = circuit_sub(in12, t131); let t133 = circuit_sub(in11, t128); let t134 = circuit_inverse(t133); let t135 = circuit_mul(t132, t134); let t136 = circuit_mul(t135, t135); let t137 = circuit_add(t128, in11); let t138 = circuit_sub(t136, t137); let t139 = circuit_add(t131, t131); let t140 = circuit_sub(t138, t128); let t141 = circuit_inverse(t140); let t142 = circuit_mul(t139, t141); let t143 = circuit_add(t135, t142); let t144 = circuit_mul(t143, t143); let t145 = circuit_add(t128, t138); let t146 = circuit_sub(t144, t145); let t147 = circuit_sub(t146, t128); let t148 = circuit_mul(t143, t147); let t149 = circuit_sub(t148, t131); let t150 = circuit_mul(t146, t146); let t151 = circuit_mul(in0, t150); let t152 = circuit_add(t151, in21); let t153 = circuit_add(t149, t149); let t154 = circuit_inverse(t153); let t155 = circuit_mul(t152, t154); let t156 = circuit_mul(t155, t155); let t157 = circuit_sub(t156, t146); let t158 = circuit_sub(t157, t146); let t159 = circuit_sub(t146, t158); let t160 = circuit_mul(t155, t159); let t161 = circuit_sub(t160, t149); let t162 = circuit_sub(in14, t161); let t163 = circuit_sub(in13, t158); let t164 = circuit_inverse(t163); let t165 = circuit_mul(t162, t164); let t166 = circuit_mul(t165, t165); let t167 = circuit_add(t158, in13); let t168 = circuit_sub(t166, t167); let t169 = circuit_add(t161, t161); let t170 = circuit_sub(t168, t158); let t171 = circuit_inverse(t170); let t172 = circuit_mul(t169, t171); let t173 = circuit_add(t165, t172); let t174 = circuit_mul(t173, t173); let t175 = circuit_add(t158, t168); let t176 = circuit_sub(t174, t175); let t177 = circuit_sub(t176, t158); let t178 = circuit_mul(t173, t177); let t179 = circuit_sub(t178, t161); let t180 = circuit_mul(t176, t176); let t181 = circuit_mul(in0, t180); let t182 = circuit_add(t181, in21); let t183 = circuit_add(t179, t179); let t184 = circuit_inverse(t183); let t185 = circuit_mul(t182, t184); let t186 = circuit_mul(t185, t185); let t187 = circuit_sub(t186, t176); let t188 = circuit_sub(t187, t176); let t189 = circuit_sub(t176, t188); let t190 = circuit_mul(t185, t189); let t191 = circuit_sub(t190, t179); let t192 = circuit_sub(in16, t191); let t193 = circuit_sub(in15, t188); let t194 = circuit_inverse(t193); let t195 = circuit_mul(t192, t194); let t196 = circuit_mul(t195, t195); let t197 = circuit_add(t188, in15); let t198 = circuit_sub(t196, t197); let t199 = circuit_add(t191, t191); let t200 = circuit_sub(t198, t188); let t201 = circuit_inverse(t200); let t202 = circuit_mul(t199, t201); let t203 = circuit_add(t195, t202); let t204 = circuit_mul(t203, t203); let t205 = circuit_add(t188, t198); let t206 = circuit_sub(t204, t205); let t207 = circuit_sub(t206, t188); let t208 = circuit_mul(t203, t207); let t209 = circuit_sub(t208, t191); let t210 = circuit_mul(t206, t206); let t211 = circuit_mul(in0, t210); let t212 = circuit_add(t211, in21); let t213 = circuit_add(t209, t209); let t214 = circuit_inverse(t213); let t215 = circuit_mul(t212, t214); let t216 = circuit_mul(t215, t215); let t217 = circuit_sub(t216, t206); let t218 = circuit_sub(t217, t206); let t219 = circuit_sub(t206, t218); let t220 = circuit_mul(t215, t219); let t221 = circuit_sub(t220, t209); let t222 = circuit_sub(in18, t221); let t223 = circuit_sub(in17, t218); let t224 = circuit_inverse(t223); let t225 = circuit_mul(t222, t224); let t226 = circuit_mul(t225, t225); let t227 = circuit_add(t218, in17); let t228 = circuit_sub(t226, t227); let t229 = circuit_add(t221, t221); let t230 = circuit_sub(t228, t218); let t231 = circuit_inverse(t230); let t232 = circuit_mul(t229, t231); let t233 = circuit_add(t225, t232); let t234 = circuit_mul(t233, t233); let t235 = circuit_add(t218, t228); let t236 = circuit_sub(t234, t235); let t237 = circuit_sub(t236, t218); let t238 = circuit_mul(t233, t237); let t239 = circuit_sub(t238, t221); let t240 = circuit_mul(t236, t236); let t241 = circuit_mul(in0, t240); let t242 = circuit_add(t241, in21); let t243 = circuit_add(t239, t239); let t244 = circuit_inverse(t243); let t245 = circuit_mul(t242, t244); let t246 = circuit_mul(t245, t245); let t247 = circuit_sub(t246, t236); let t248 = circuit_sub(t247, t236); let t249 = circuit_sub(t236, t248); let t250 = circuit_mul(t245, t249); let t251 = circuit_sub(t250, t239); let t252 = circuit_sub(in20, t251); let t253 = circuit_sub(in19, t248); let t254 = circuit_inverse(t253); let t255 = circuit_mul(t252, t254); let t256 = circuit_mul(t255, t255); let t257 = circuit_add(t248, in19); let t258 = circuit_sub(t256, t257); let t259 = circuit_add(t251, t251); let t260 = circuit_sub(t258, t248); let t261 = circuit_inverse(t260); let t262 = circuit_mul(t259, t261); let t263 = circuit_add(t255, t262); let t264 = circuit_mul(t263, t263); let t265 = circuit_add(t248, t258); let t266 = circuit_sub(t264, t265); let t267 = circuit_sub(t266, t248); let t268 = circuit_mul(t263, t267); let t269 = circuit_sub(t268, t251); let modulus = modulus; let mut circuit_inputs = (t266, t269).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(P.x); // in1 circuit_inputs = circuit_inputs.next_2(P.y); // in2 circuit_inputs = circuit_inputs.next_2(Q_1.x); // in3 circuit_inputs = circuit_inputs.next_2(Q_1.y); // in4 circuit_inputs = circuit_inputs.next_2(Q_2.x); // in5 circuit_inputs = circuit_inputs.next_2(Q_2.y); // in6 circuit_inputs = circuit_inputs.next_2(Q_3.x); // in7 circuit_inputs = circuit_inputs.next_2(Q_3.y); // in8 circuit_inputs = circuit_inputs.next_2(Q_4.x); // in9 circuit_inputs = circuit_inputs.next_2(Q_4.y); // in10 circuit_inputs = circuit_inputs.next_2(Q_5.x); // in11 circuit_inputs = circuit_inputs.next_2(Q_5.y); // in12 circuit_inputs = circuit_inputs.next_2(Q_6.x); // in13 circuit_inputs = circuit_inputs.next_2(Q_6.y); // in14 circuit_inputs = circuit_inputs.next_2(Q_7.x); // in15 circuit_inputs = circuit_inputs.next_2(Q_7.y); // in16 circuit_inputs = circuit_inputs.next_2(Q_8.x); // in17 circuit_inputs = circuit_inputs.next_2(Q_8.y); // in18 circuit_inputs = circuit_inputs.next_2(Q_9.x); // in19 circuit_inputs = circuit_inputs.next_2(Q_9.y); // in20 circuit_inputs = circuit_inputs.next_2(A_weirstrass); // in21 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let R: G1Point = G1Point { x: outputs.get_output(t266), y: outputs.get_output(t269) }; return (R,); } ================================================ FILE: src/src/circuits/extf_mul.cairo ================================================ use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::{E12D, u288}; #[inline(always)] pub fn run_BLS12_381_EVAL_E12D_circuit(f: E12D, z: u384) -> (u384,) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let in12 = CE::> {}; let t0 = circuit_mul(in11, in12); // Eval X Horner step: multiply by z let t1 = circuit_add(in10, t0); // Eval X Horner step: add coefficient_10 let t2 = circuit_mul(t1, in12); // Eval X Horner step: multiply by z let t3 = circuit_add(in9, t2); // Eval X Horner step: add coefficient_9 let t4 = circuit_mul(t3, in12); // Eval X Horner step: multiply by z let t5 = circuit_add(in8, t4); // Eval X Horner step: add coefficient_8 let t6 = circuit_mul(t5, in12); // Eval X Horner step: multiply by z let t7 = circuit_add(in7, t6); // Eval X Horner step: add coefficient_7 let t8 = circuit_mul(t7, in12); // Eval X Horner step: multiply by z let t9 = circuit_add(in6, t8); // Eval X Horner step: add coefficient_6 let t10 = circuit_mul(t9, in12); // Eval X Horner step: multiply by z let t11 = circuit_add(in5, t10); // Eval X Horner step: add coefficient_5 let t12 = circuit_mul(t11, in12); // Eval X Horner step: multiply by z let t13 = circuit_add(in4, t12); // Eval X Horner step: add coefficient_4 let t14 = circuit_mul(t13, in12); // Eval X Horner step: multiply by z let t15 = circuit_add(in3, t14); // Eval X Horner step: add coefficient_3 let t16 = circuit_mul(t15, in12); // Eval X Horner step: multiply by z let t17 = circuit_add(in2, t16); // Eval X Horner step: add coefficient_2 let t18 = circuit_mul(t17, in12); // Eval X Horner step: multiply by z let t19 = circuit_add(in1, t18); // Eval X Horner step: add coefficient_1 let t20 = circuit_mul(t19, in12); // Eval X Horner step: multiply by z let t21 = circuit_add(in0, t20); // Eval X Horner step: add coefficient_0 let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t21,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(f.w0); // in0 circuit_inputs = circuit_inputs.next_2(f.w1); // in1 circuit_inputs = circuit_inputs.next_2(f.w2); // in2 circuit_inputs = circuit_inputs.next_2(f.w3); // in3 circuit_inputs = circuit_inputs.next_2(f.w4); // in4 circuit_inputs = circuit_inputs.next_2(f.w5); // in5 circuit_inputs = circuit_inputs.next_2(f.w6); // in6 circuit_inputs = circuit_inputs.next_2(f.w7); // in7 circuit_inputs = circuit_inputs.next_2(f.w8); // in8 circuit_inputs = circuit_inputs.next_2(f.w9); // in9 circuit_inputs = circuit_inputs.next_2(f.w10); // in10 circuit_inputs = circuit_inputs.next_2(f.w11); // in11 circuit_inputs = circuit_inputs.next_2(z); // in12 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let f_of_z: u384 = outputs.get_output(t21); return (f_of_z,); } #[inline(always)] pub fn run_BN254_EVAL_E12D_circuit(f: E12D, z: u384) -> (u384,) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let in12 = CE::> {}; let t0 = circuit_mul(in11, in12); // Eval X Horner step: multiply by z let t1 = circuit_add(in10, t0); // Eval X Horner step: add coefficient_10 let t2 = circuit_mul(t1, in12); // Eval X Horner step: multiply by z let t3 = circuit_add(in9, t2); // Eval X Horner step: add coefficient_9 let t4 = circuit_mul(t3, in12); // Eval X Horner step: multiply by z let t5 = circuit_add(in8, t4); // Eval X Horner step: add coefficient_8 let t6 = circuit_mul(t5, in12); // Eval X Horner step: multiply by z let t7 = circuit_add(in7, t6); // Eval X Horner step: add coefficient_7 let t8 = circuit_mul(t7, in12); // Eval X Horner step: multiply by z let t9 = circuit_add(in6, t8); // Eval X Horner step: add coefficient_6 let t10 = circuit_mul(t9, in12); // Eval X Horner step: multiply by z let t11 = circuit_add(in5, t10); // Eval X Horner step: add coefficient_5 let t12 = circuit_mul(t11, in12); // Eval X Horner step: multiply by z let t13 = circuit_add(in4, t12); // Eval X Horner step: add coefficient_4 let t14 = circuit_mul(t13, in12); // Eval X Horner step: multiply by z let t15 = circuit_add(in3, t14); // Eval X Horner step: add coefficient_3 let t16 = circuit_mul(t15, in12); // Eval X Horner step: multiply by z let t17 = circuit_add(in2, t16); // Eval X Horner step: add coefficient_2 let t18 = circuit_mul(t17, in12); // Eval X Horner step: multiply by z let t19 = circuit_add(in1, t18); // Eval X Horner step: add coefficient_1 let t20 = circuit_mul(t19, in12); // Eval X Horner step: multiply by z let t21 = circuit_add(in0, t20); // Eval X Horner step: add coefficient_0 let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t21,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(f.w0); // in0 circuit_inputs = circuit_inputs.next_2(f.w1); // in1 circuit_inputs = circuit_inputs.next_2(f.w2); // in2 circuit_inputs = circuit_inputs.next_2(f.w3); // in3 circuit_inputs = circuit_inputs.next_2(f.w4); // in4 circuit_inputs = circuit_inputs.next_2(f.w5); // in5 circuit_inputs = circuit_inputs.next_2(f.w6); // in6 circuit_inputs = circuit_inputs.next_2(f.w7); // in7 circuit_inputs = circuit_inputs.next_2(f.w8); // in8 circuit_inputs = circuit_inputs.next_2(f.w9); // in9 circuit_inputs = circuit_inputs.next_2(f.w10); // in10 circuit_inputs = circuit_inputs.next_2(f.w11); // in11 circuit_inputs = circuit_inputs.next_2(z); // in12 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let f_of_z: u384 = outputs.get_output(t21); return (f_of_z,); } ================================================ FILE: src/src/circuits/isogeny.cairo ================================================ use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::G1Point; #[inline(always)] pub fn run_BLS12_381_APPLY_ISOGENY_BLS12_381_circuit(pt: G1Point) -> (G1Point,) { // CONSTANT stack let in0 = CE::< CI<0>, > {}; // 0x11a05f2b1e833340b809101dd99815856b303e88a2d7005ff2627b56cdb4e2c85610c2d5f2e62d6eaeac1662734649b7 let in1 = CE::< CI<1>, > {}; // 0x17294ed3e943ab2f0588bab22147a81c7c17e75b2f6a8417f565e33c70d1e86b4838f2a6f318c356e834eef1b3cb83bb let in2 = CE::< CI<2>, > {}; // 0xd54005db97678ec1d1048c5d10a9a1bce032473295983e56878e501ec68e25c958c3e3d2a09729fe0179f9dac9edcb0 let in3 = CE::< CI<3>, > {}; // 0x1778e7166fcc6db74e0609d307e55412d7f5e4656a8dbf25f1b33289f1b330835336e25ce3107193c5b388641d9b6861 let in4 = CE::< CI<4>, > {}; // 0xe99726a3199f4436642b4b3e4118e5499db995a1257fb3f086eeb65982fac18985a286f301e77c451154ce9ac8895d9 let in5 = CE::< CI<5>, > {}; // 0x1630c3250d7313ff01d1201bf7a74ab5db3cb17dd952799b9ed3ab9097e68f90a0870d2dcae73d19cd13c1c66f652983 let in6 = CE::< CI<6>, > {}; // 0xd6ed6553fe44d296a3726c38ae652bfb11586264f0f8ce19008e218f9c86b2a8da25128c1052ecaddd7f225a139ed84 let in7 = CE::< CI<7>, > {}; // 0x17b81e7701abdbe2e8743884d1117e53356de5ab275b4db1a682c62ef0f2753339b7c8f8c8f475af9ccb5618e3f0c88e let in8 = CE::< CI<8>, > {}; // 0x80d3cf1f9a78fc47b90b33563be990dc43b756ce79f5574a2c596c928c5d1de4fa295f296b74e956d71986a8497e317 let in9 = CE::< CI<9>, > {}; // 0x169b1f8e1bcfa7c42e0c37515d138f22dd2ecb803a0c5c99676314baf4bb1b7fa3190b2edc0327797f241067be390c9e let in10 = CE::< CI<10>, > {}; // 0x10321da079ce07e272d8ec09d2565b0dfa7dccdde6787f96d50af36003b14866f69b771f8c285decca67df3f1605fb7b let in11 = CE::< CI<11>, > {}; // 0x6e08c248e260e70bd1e962381edee3d31d79d7e22c837bc23c0bf1bc24c6b68c24b1b80b64d391fa9c8ba2e8ba2d229 let in12 = CE::< CI<12>, > {}; // 0x8ca8d548cff19ae18b2e62f4bd3fa6f01d5ef4ba35b48ba9c9588617fc8ac62b558d681be343df8993cf9fa40d21b1c let in13 = CE::< CI<13>, > {}; // 0x12561a5deb559c4348b4711298e536367041e8ca0cf0800c0126c2588c48bf5713daa8846cb026e9e5c8276ec82b3bff let in14 = CE::< CI<14>, > {}; // 0xb2962fe57a3225e8137e629bff2991f6f89416f5a718cd1fca64e00b11aceacd6a3d0967c94fedcfcc239ba5cb83e19 let in15 = CE::< CI<15>, > {}; // 0x3425581a58ae2fec83aafef7c40eb545b08243f16b1655154cca8abc28d6fd04976d5243eecf5c4130de8938dc62cd8 let in16 = CE::< CI<16>, > {}; // 0x13a8e162022914a80a6f1d5f43e7a07dffdfc759a12062bb8d6b44e833b306da9bd29ba81f35781d539d395b3532a21e let in17 = CE::< CI<17>, > {}; // 0xe7355f8e4e667b955390f7f0506c6e9395735e9ce9cad4d0a43bcef24b8982f7400d24bc4228f11c02df9a29f6304a5 let in18 = CE::< CI<18>, > {}; // 0x772caacf16936190f3e0c63e0596721570f5799af53a1894e2e073062aede9cea73b3538f0de06cec2574496ee84a3a let in19 = CE::< CI<19>, > {}; // 0x14a7ac2a9d64a8b230b3f5b074cf01996e7f63c21bca68a81996e1cdf9822c580fa5b9489d11e2d311f7d99bbdcc5a5e let in20 = CE::< CI<20>, > {}; // 0xa10ecf6ada54f825e920b3dafc7a3cce07f8d1d7161366b74100da67f39883503826692abba43704776ec3a79a1d641 let in21 = CE::< CI<21>, > {}; // 0x95fc13ab9e92ad4476d6e3eb3a56680f682b4ee96f7d03776df533978f31c1593174e4b4b7865002d6384d168ecdd0a let in22 = CE::> {}; // 0x1 let in23 = CE::< CI<23>, > {}; // 0x90d97c81ba24ee0259d1f094980dcfa11ad138e48a869522b52af6c956543d3cd0c7aee9b3ba3c2be9845719707bb33 let in24 = CE::< CI<24>, > {}; // 0x134996a104ee5811d51036d776fb46831223e96c254f383d0f906343eb67ad34d6c56711962fa8bfe097e75a2e41c696 let in25 = CE::< CI<25>, > {}; // 0xcc786baa966e66f4a384c86a3b49942552e2d658a31ce2c344be4b91400da7d26d521628b00523b8dfe240c72de1f6 let in26 = CE::< CI<26>, > {}; // 0x1f86376e8981c217898751ad8746757d42aa7b90eeb791c09e4a3ec03251cf9de405aba9ec61deca6355c77b0e5f4cb let in27 = CE::< CI<27>, > {}; // 0x8cc03fdefe0ff135caf4fe2a21529c4195536fbe3ce50b879833fd221351adc2ee7f8dc099040a841b6daecf2e8fedb let in28 = CE::< CI<28>, > {}; // 0x16603fca40634b6a2211e11db8f0a6a074a7d0d4afadb7bd76505c3d3ad5544e203f6326c95a807299b23ab13633a5f0 let in29 = CE::< CI<29>, > {}; // 0x4ab0b9bcfac1bbcb2c977d027796b3ce75bb8ca2be184cb5231413c4d634f3747a87ac2460f415ec961f8855fe9d6f2 let in30 = CE::< CI<30>, > {}; // 0x987c8d5333ab86fde9926bd2ca6c674170a05bfe3bdd81ffd038da6c26c842642f64550fedfe935a15e4ca31870fb29 let in31 = CE::< CI<31>, > {}; // 0x9fc4018bd96684be88c9e221e4da1bb8f3abd16679dc26c1e8b6e6a1f20cabe69d65201c78607a360370e577bdba587 let in32 = CE::< CI<32>, > {}; // 0xe1bba7a1186bdb5223abde7ada14a23c42a0ca7915af6fe06985e7ed1e4d43b9b3f7055dd4eba6f2bafaaebca731c30 let in33 = CE::< CI<33>, > {}; // 0x19713e47937cd1be0dfd0b8f1d43fb93cd2fcbcb6caf493fd1183e416389e61031bf3a5cce3fbafce813711ad011c132 let in34 = CE::< CI<34>, > {}; // 0x18b46a908f36f6deb918c143fed2edcc523559b8aaf0c2462e6bfe7f911f643249d9cdf41b44d606ce07c8a4d0074d8e let in35 = CE::< CI<35>, > {}; // 0xb182cac101b9399d155096004f53f447aa7b12a3426b08ec02710e807b4633f06c851c1919211f20d4c04f00b971ef8 let in36 = CE::< CI<36>, > {}; // 0x245a394ad1eca9b72fc00ae7be315dc757b3b080d4c158013e6632d3c40659cc6cf90ad1c232a6442d9d3f5db980133 let in37 = CE::< CI<37>, > {}; // 0x5c129645e44cf1102a159f748c4a3fc5e673d81d7e86568d9ab0f5d396a7ce46ba1049b6579afb7866b1e715475224b let in38 = CE::< CI<38>, > {}; // 0x15e6be4e990f03ce4ea50b3b42df2eb5cb181d8f84965a3957add4fa95af01b2b665027efec01c7704b456be69c8b604 let in39 = CE::< CI<39>, > {}; // 0x16112c4c3a9c98b252181140fad0eae9601a6de578980be6eec3232b5be72e7a07f3688ef60c206d01479253b03663c1 let in40 = CE::< CI<40>, > {}; // 0x1962d75c2381201e1a0cbd6c43c348b885c84ff731c4d59ca4a10356f453e01f78a4260763529e3532f6102c2e49a03d let in41 = CE::< CI<41>, > {}; // 0x58df3306640da276faaae7d6e8eb15778c4855551ae7f310c35a5dd279cd2eca6757cd636f96f891e2538b53dbf67f2 let in42 = CE::< CI<42>, > {}; // 0x16b7d288798e5395f20d23bf89edb4d1d115c5dbddbcd30e123da489e726af41727364f2c28297ada8d26d98445f5416 let in43 = CE::< CI<43>, > {}; // 0xbe0e079545f43e4b00cc912f8228ddcc6d19c9f0f69bbb0542eda0fc9dec916a20b15dc0fd2ededda39142311a5001d let in44 = CE::< CI<44>, > {}; // 0x8d9e5297186db2d9fb266eaac783182b70152c65550d881c5ecd87b6f0f5a6449f38db9dfa9cce202c6477faaf9b7ac let in45 = CE::< CI<45>, > {}; // 0x166007c08a99db2fc3ba8734ace9824b5eecfdfa8d0cf8ef5dd365bc400a0051d5fa9c01a58b1fb93d1a1399126a775c let in46 = CE::< CI<46>, > {}; // 0x16a3ef08be3ea7ea03bcddfabba6ff6ee5a4375efa1f4fd7feb34fd206357132b920f5b00801dee460ee415a15812ed9 let in47 = CE::< CI<47>, > {}; // 0x1866c8ed336c61231a1be54fd1d74cc4f9fb0ce4c6af5920abc5750c4bf39b4852cfe2f7bb9248836b233d9d55535d4a let in48 = CE::< CI<48>, > {}; // 0x167a55cda70a6e1cea820597d94a84903216f763e13d87bb5308592e7ea7d4fbc7385ea3d529b35e346ef48bb8913f55 let in49 = CE::< CI<49>, > {}; // 0x4d2f259eea405bd48f010a01ad2911d9c6dd039bb61a6290e591b36e636a5c871a5c29f4f83060400f8b49cba8f6aa8 let in50 = CE::< CI<50>, > {}; // 0xaccbb67481d033ff5852c1e48c50c477f94ff8aefce42d28c0f9a88cea7913516f968986f7ebbea9684b529e2561092 let in51 = CE::< CI<51>, > {}; // 0xad6b9514c767fe3c3613144b45f1496543346d98adf02267d5ceef9a00d9b8693000763e3b90ac11e99b138573345cc let in52 = CE::< CI<52>, > {}; // 0x2660400eb2e4f3b628bdd0d53cd76f2bf565b94e72927c1cb748df27942480e420517bd8714cc80d1fadc1326ed06f7 let in53 = CE::< CI<53>, > {}; // 0xe0fa1d816ddc03e6b24255e0d7819c171c40f65e273b853324efcd6356caa205ca2f570f13497804415473a1d634b8f // INPUT stack let (in54, in55) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in11, in54); // Eval x_num Horner step: multiply by z let t1 = circuit_add(in10, t0); // Eval x_num Horner step: add coefficient_10 let t2 = circuit_mul(t1, in54); // Eval x_num Horner step: multiply by z let t3 = circuit_add(in9, t2); // Eval x_num Horner step: add coefficient_9 let t4 = circuit_mul(t3, in54); // Eval x_num Horner step: multiply by z let t5 = circuit_add(in8, t4); // Eval x_num Horner step: add coefficient_8 let t6 = circuit_mul(t5, in54); // Eval x_num Horner step: multiply by z let t7 = circuit_add(in7, t6); // Eval x_num Horner step: add coefficient_7 let t8 = circuit_mul(t7, in54); // Eval x_num Horner step: multiply by z let t9 = circuit_add(in6, t8); // Eval x_num Horner step: add coefficient_6 let t10 = circuit_mul(t9, in54); // Eval x_num Horner step: multiply by z let t11 = circuit_add(in5, t10); // Eval x_num Horner step: add coefficient_5 let t12 = circuit_mul(t11, in54); // Eval x_num Horner step: multiply by z let t13 = circuit_add(in4, t12); // Eval x_num Horner step: add coefficient_4 let t14 = circuit_mul(t13, in54); // Eval x_num Horner step: multiply by z let t15 = circuit_add(in3, t14); // Eval x_num Horner step: add coefficient_3 let t16 = circuit_mul(t15, in54); // Eval x_num Horner step: multiply by z let t17 = circuit_add(in2, t16); // Eval x_num Horner step: add coefficient_2 let t18 = circuit_mul(t17, in54); // Eval x_num Horner step: multiply by z let t19 = circuit_add(in1, t18); // Eval x_num Horner step: add coefficient_1 let t20 = circuit_mul(t19, in54); // Eval x_num Horner step: multiply by z let t21 = circuit_add(in0, t20); // Eval x_num Horner step: add coefficient_0 let t22 = circuit_mul(in22, in54); // Eval x_den Horner step: multiply by z let t23 = circuit_add(in21, t22); // Eval x_den Horner step: add coefficient_9 let t24 = circuit_mul(t23, in54); // Eval x_den Horner step: multiply by z let t25 = circuit_add(in20, t24); // Eval x_den Horner step: add coefficient_8 let t26 = circuit_mul(t25, in54); // Eval x_den Horner step: multiply by z let t27 = circuit_add(in19, t26); // Eval x_den Horner step: add coefficient_7 let t28 = circuit_mul(t27, in54); // Eval x_den Horner step: multiply by z let t29 = circuit_add(in18, t28); // Eval x_den Horner step: add coefficient_6 let t30 = circuit_mul(t29, in54); // Eval x_den Horner step: multiply by z let t31 = circuit_add(in17, t30); // Eval x_den Horner step: add coefficient_5 let t32 = circuit_mul(t31, in54); // Eval x_den Horner step: multiply by z let t33 = circuit_add(in16, t32); // Eval x_den Horner step: add coefficient_4 let t34 = circuit_mul(t33, in54); // Eval x_den Horner step: multiply by z let t35 = circuit_add(in15, t34); // Eval x_den Horner step: add coefficient_3 let t36 = circuit_mul(t35, in54); // Eval x_den Horner step: multiply by z let t37 = circuit_add(in14, t36); // Eval x_den Horner step: add coefficient_2 let t38 = circuit_mul(t37, in54); // Eval x_den Horner step: multiply by z let t39 = circuit_add(in13, t38); // Eval x_den Horner step: add coefficient_1 let t40 = circuit_mul(t39, in54); // Eval x_den Horner step: multiply by z let t41 = circuit_add(in12, t40); // Eval x_den Horner step: add coefficient_0 let t42 = circuit_inverse(t41); let t43 = circuit_mul(t21, t42); let t44 = circuit_mul(in38, in54); // Eval y_num Horner step: multiply by z let t45 = circuit_add(in37, t44); // Eval y_num Horner step: add coefficient_14 let t46 = circuit_mul(t45, in54); // Eval y_num Horner step: multiply by z let t47 = circuit_add(in36, t46); // Eval y_num Horner step: add coefficient_13 let t48 = circuit_mul(t47, in54); // Eval y_num Horner step: multiply by z let t49 = circuit_add(in35, t48); // Eval y_num Horner step: add coefficient_12 let t50 = circuit_mul(t49, in54); // Eval y_num Horner step: multiply by z let t51 = circuit_add(in34, t50); // Eval y_num Horner step: add coefficient_11 let t52 = circuit_mul(t51, in54); // Eval y_num Horner step: multiply by z let t53 = circuit_add(in33, t52); // Eval y_num Horner step: add coefficient_10 let t54 = circuit_mul(t53, in54); // Eval y_num Horner step: multiply by z let t55 = circuit_add(in32, t54); // Eval y_num Horner step: add coefficient_9 let t56 = circuit_mul(t55, in54); // Eval y_num Horner step: multiply by z let t57 = circuit_add(in31, t56); // Eval y_num Horner step: add coefficient_8 let t58 = circuit_mul(t57, in54); // Eval y_num Horner step: multiply by z let t59 = circuit_add(in30, t58); // Eval y_num Horner step: add coefficient_7 let t60 = circuit_mul(t59, in54); // Eval y_num Horner step: multiply by z let t61 = circuit_add(in29, t60); // Eval y_num Horner step: add coefficient_6 let t62 = circuit_mul(t61, in54); // Eval y_num Horner step: multiply by z let t63 = circuit_add(in28, t62); // Eval y_num Horner step: add coefficient_5 let t64 = circuit_mul(t63, in54); // Eval y_num Horner step: multiply by z let t65 = circuit_add(in27, t64); // Eval y_num Horner step: add coefficient_4 let t66 = circuit_mul(t65, in54); // Eval y_num Horner step: multiply by z let t67 = circuit_add(in26, t66); // Eval y_num Horner step: add coefficient_3 let t68 = circuit_mul(t67, in54); // Eval y_num Horner step: multiply by z let t69 = circuit_add(in25, t68); // Eval y_num Horner step: add coefficient_2 let t70 = circuit_mul(t69, in54); // Eval y_num Horner step: multiply by z let t71 = circuit_add(in24, t70); // Eval y_num Horner step: add coefficient_1 let t72 = circuit_mul(t71, in54); // Eval y_num Horner step: multiply by z let t73 = circuit_add(in23, t72); // Eval y_num Horner step: add coefficient_0 let t74 = circuit_mul(in22, in54); // Eval y_den Horner step: multiply by z let t75 = circuit_add(in53, t74); // Eval y_den Horner step: add coefficient_14 let t76 = circuit_mul(t75, in54); // Eval y_den Horner step: multiply by z let t77 = circuit_add(in52, t76); // Eval y_den Horner step: add coefficient_13 let t78 = circuit_mul(t77, in54); // Eval y_den Horner step: multiply by z let t79 = circuit_add(in51, t78); // Eval y_den Horner step: add coefficient_12 let t80 = circuit_mul(t79, in54); // Eval y_den Horner step: multiply by z let t81 = circuit_add(in50, t80); // Eval y_den Horner step: add coefficient_11 let t82 = circuit_mul(t81, in54); // Eval y_den Horner step: multiply by z let t83 = circuit_add(in49, t82); // Eval y_den Horner step: add coefficient_10 let t84 = circuit_mul(t83, in54); // Eval y_den Horner step: multiply by z let t85 = circuit_add(in48, t84); // Eval y_den Horner step: add coefficient_9 let t86 = circuit_mul(t85, in54); // Eval y_den Horner step: multiply by z let t87 = circuit_add(in47, t86); // Eval y_den Horner step: add coefficient_8 let t88 = circuit_mul(t87, in54); // Eval y_den Horner step: multiply by z let t89 = circuit_add(in46, t88); // Eval y_den Horner step: add coefficient_7 let t90 = circuit_mul(t89, in54); // Eval y_den Horner step: multiply by z let t91 = circuit_add(in45, t90); // Eval y_den Horner step: add coefficient_6 let t92 = circuit_mul(t91, in54); // Eval y_den Horner step: multiply by z let t93 = circuit_add(in44, t92); // Eval y_den Horner step: add coefficient_5 let t94 = circuit_mul(t93, in54); // Eval y_den Horner step: multiply by z let t95 = circuit_add(in43, t94); // Eval y_den Horner step: add coefficient_4 let t96 = circuit_mul(t95, in54); // Eval y_den Horner step: multiply by z let t97 = circuit_add(in42, t96); // Eval y_den Horner step: add coefficient_3 let t98 = circuit_mul(t97, in54); // Eval y_den Horner step: multiply by z let t99 = circuit_add(in41, t98); // Eval y_den Horner step: add coefficient_2 let t100 = circuit_mul(t99, in54); // Eval y_den Horner step: multiply by z let t101 = circuit_add(in40, t100); // Eval y_den Horner step: add coefficient_1 let t102 = circuit_mul(t101, in54); // Eval y_den Horner step: multiply by z let t103 = circuit_add(in39, t102); // Eval y_den Horner step: add coefficient_0 let t104 = circuit_inverse(t103); let t105 = circuit_mul(t73, t104); let t106 = circuit_mul(t105, in55); let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t43, t106).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(APPLY_ISOGENY_BLS12_381_BLS12_381_CONSTANTS.span()); // in0 - in53 // Fill inputs: circuit_inputs = circuit_inputs.next_2(pt.x); // in54 circuit_inputs = circuit_inputs.next_2(pt.y); // in55 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: G1Point = G1Point { x: outputs.get_output(t43), y: outputs.get_output(t106) }; return (res,); } const APPLY_ISOGENY_BLS12_381_BLS12_381_CONSTANTS: [u384; 54] = [ u384 { limb0: 0xf2e62d6eaeac1662734649b7, limb1: 0xf2627b56cdb4e2c85610c2d5, limb2: 0xd99815856b303e88a2d7005f, limb3: 0x11a05f2b1e833340b809101d, }, u384 { limb0: 0xf318c356e834eef1b3cb83bb, limb1: 0xf565e33c70d1e86b4838f2a6, limb2: 0x2147a81c7c17e75b2f6a8417, limb3: 0x17294ed3e943ab2f0588bab2, }, u384 { limb0: 0x2a09729fe0179f9dac9edcb0, limb1: 0x6878e501ec68e25c958c3e3d, limb2: 0xd10a9a1bce032473295983e5, limb3: 0xd54005db97678ec1d1048c5, }, u384 { limb0: 0xe3107193c5b388641d9b6861, limb1: 0xf1b33289f1b330835336e25c, limb2: 0x7e55412d7f5e4656a8dbf25, limb3: 0x1778e7166fcc6db74e0609d3, }, u384 { limb0: 0x301e77c451154ce9ac8895d9, limb1: 0x86eeb65982fac18985a286f, limb2: 0xe4118e5499db995a1257fb3f, limb3: 0xe99726a3199f4436642b4b3, }, u384 { limb0: 0xcae73d19cd13c1c66f652983, limb1: 0x9ed3ab9097e68f90a0870d2d, limb2: 0xf7a74ab5db3cb17dd952799b, limb3: 0x1630c3250d7313ff01d1201b, }, u384 { limb0: 0xc1052ecaddd7f225a139ed84, limb1: 0x9008e218f9c86b2a8da25128, limb2: 0x8ae652bfb11586264f0f8ce1, limb3: 0xd6ed6553fe44d296a3726c3, }, u384 { limb0: 0xc8f475af9ccb5618e3f0c88e, limb1: 0xa682c62ef0f2753339b7c8f8, limb2: 0xd1117e53356de5ab275b4db1, limb3: 0x17b81e7701abdbe2e8743884, }, u384 { limb0: 0x96b74e956d71986a8497e317, limb1: 0xa2c596c928c5d1de4fa295f2, limb2: 0x63be990dc43b756ce79f5574, limb3: 0x80d3cf1f9a78fc47b90b335, }, u384 { limb0: 0xdc0327797f241067be390c9e, limb1: 0x676314baf4bb1b7fa3190b2e, limb2: 0x5d138f22dd2ecb803a0c5c99, limb3: 0x169b1f8e1bcfa7c42e0c3751, }, u384 { limb0: 0x8c285decca67df3f1605fb7b, limb1: 0xd50af36003b14866f69b771f, limb2: 0xd2565b0dfa7dccdde6787f96, limb3: 0x10321da079ce07e272d8ec09, }, u384 { limb0: 0xb64d391fa9c8ba2e8ba2d229, limb1: 0x23c0bf1bc24c6b68c24b1b80, limb2: 0x81edee3d31d79d7e22c837bc, limb3: 0x6e08c248e260e70bd1e9623, }, u384 { limb0: 0xbe343df8993cf9fa40d21b1c, limb1: 0x9c9588617fc8ac62b558d681, limb2: 0x4bd3fa6f01d5ef4ba35b48ba, limb3: 0x8ca8d548cff19ae18b2e62f, }, u384 { limb0: 0x6cb026e9e5c8276ec82b3bff, limb1: 0x126c2588c48bf5713daa884, limb2: 0x98e536367041e8ca0cf0800c, limb3: 0x12561a5deb559c4348b47112, }, u384 { limb0: 0x7c94fedcfcc239ba5cb83e19, limb1: 0xfca64e00b11aceacd6a3d096, limb2: 0xbff2991f6f89416f5a718cd1, limb3: 0xb2962fe57a3225e8137e629, }, u384 { limb0: 0x3eecf5c4130de8938dc62cd8, limb1: 0x54cca8abc28d6fd04976d524, limb2: 0x7c40eb545b08243f16b16551, limb3: 0x3425581a58ae2fec83aafef, }, u384 { limb0: 0x1f35781d539d395b3532a21e, limb1: 0x8d6b44e833b306da9bd29ba8, limb2: 0x43e7a07dffdfc759a12062bb, limb3: 0x13a8e162022914a80a6f1d5f, }, u384 { limb0: 0xc4228f11c02df9a29f6304a5, limb1: 0xa43bcef24b8982f7400d24b, limb2: 0x506c6e9395735e9ce9cad4d, limb3: 0xe7355f8e4e667b955390f7f, }, u384 { limb0: 0x8f0de06cec2574496ee84a3a, limb1: 0x4e2e073062aede9cea73b353, limb2: 0xe0596721570f5799af53a189, limb3: 0x772caacf16936190f3e0c63, }, u384 { limb0: 0x9d11e2d311f7d99bbdcc5a5e, limb1: 0x1996e1cdf9822c580fa5b948, limb2: 0x74cf01996e7f63c21bca68a8, limb3: 0x14a7ac2a9d64a8b230b3f5b0, }, u384 { limb0: 0xabba43704776ec3a79a1d641, limb1: 0x74100da67f39883503826692, limb2: 0xafc7a3cce07f8d1d7161366b, limb3: 0xa10ecf6ada54f825e920b3d, }, u384 { limb0: 0x4b7865002d6384d168ecdd0a, limb1: 0x76df533978f31c1593174e4b, limb2: 0xb3a56680f682b4ee96f7d037, limb3: 0x95fc13ab9e92ad4476d6e3e, }, u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x9b3ba3c2be9845719707bb33, limb1: 0x2b52af6c956543d3cd0c7aee, limb2: 0x4980dcfa11ad138e48a86952, limb3: 0x90d97c81ba24ee0259d1f09, }, u384 { limb0: 0x962fa8bfe097e75a2e41c696, limb1: 0xf906343eb67ad34d6c56711, limb2: 0x76fb46831223e96c254f383d, limb3: 0x134996a104ee5811d51036d7, }, u384 { limb0: 0x28b00523b8dfe240c72de1f6, limb1: 0xc344be4b91400da7d26d5216, limb2: 0x6a3b49942552e2d658a31ce2, limb3: 0xcc786baa966e66f4a384c8, }, u384 { limb0: 0x9ec61deca6355c77b0e5f4cb, limb1: 0x9e4a3ec03251cf9de405aba, limb2: 0xd8746757d42aa7b90eeb791c, limb3: 0x1f86376e8981c217898751a, }, u384 { limb0: 0x99040a841b6daecf2e8fedb, limb1: 0x79833fd221351adc2ee7f8dc, limb2: 0xa21529c4195536fbe3ce50b8, limb3: 0x8cc03fdefe0ff135caf4fe2, }, u384 { limb0: 0xc95a807299b23ab13633a5f0, limb1: 0x76505c3d3ad5544e203f6326, limb2: 0xb8f0a6a074a7d0d4afadb7bd, limb3: 0x16603fca40634b6a2211e11d, }, u384 { limb0: 0x460f415ec961f8855fe9d6f2, limb1: 0x5231413c4d634f3747a87ac2, limb2: 0x27796b3ce75bb8ca2be184cb, limb3: 0x4ab0b9bcfac1bbcb2c977d0, }, u384 { limb0: 0xfedfe935a15e4ca31870fb29, limb1: 0xfd038da6c26c842642f64550, limb2: 0x2ca6c674170a05bfe3bdd81f, limb3: 0x987c8d5333ab86fde9926bd, }, u384 { limb0: 0xc78607a360370e577bdba587, limb1: 0x1e8b6e6a1f20cabe69d65201, limb2: 0x1e4da1bb8f3abd16679dc26c, limb3: 0x9fc4018bd96684be88c9e22, }, u384 { limb0: 0xdd4eba6f2bafaaebca731c30, limb1: 0x6985e7ed1e4d43b9b3f7055, limb2: 0xada14a23c42a0ca7915af6fe, limb3: 0xe1bba7a1186bdb5223abde7, }, u384 { limb0: 0xce3fbafce813711ad011c132, limb1: 0xd1183e416389e61031bf3a5c, limb2: 0x1d43fb93cd2fcbcb6caf493f, limb3: 0x19713e47937cd1be0dfd0b8f, }, u384 { limb0: 0x1b44d606ce07c8a4d0074d8e, limb1: 0x2e6bfe7f911f643249d9cdf4, limb2: 0xfed2edcc523559b8aaf0c246, limb3: 0x18b46a908f36f6deb918c143, }, u384 { limb0: 0x919211f20d4c04f00b971ef8, limb1: 0xc02710e807b4633f06c851c1, limb2: 0x4f53f447aa7b12a3426b08e, limb3: 0xb182cac101b9399d1550960, }, u384 { limb0: 0x1c232a6442d9d3f5db980133, limb1: 0x13e6632d3c40659cc6cf90ad, limb2: 0x7be315dc757b3b080d4c1580, limb3: 0x245a394ad1eca9b72fc00ae, }, u384 { limb0: 0x6579afb7866b1e715475224b, limb1: 0xd9ab0f5d396a7ce46ba1049b, limb2: 0x48c4a3fc5e673d81d7e86568, limb3: 0x5c129645e44cf1102a159f7, }, u384 { limb0: 0xfec01c7704b456be69c8b604, limb1: 0x57add4fa95af01b2b665027e, limb2: 0x42df2eb5cb181d8f84965a39, limb3: 0x15e6be4e990f03ce4ea50b3b, }, u384 { limb0: 0xf60c206d01479253b03663c1, limb1: 0xeec3232b5be72e7a07f3688e, limb2: 0xfad0eae9601a6de578980be6, limb3: 0x16112c4c3a9c98b252181140, }, u384 { limb0: 0x63529e3532f6102c2e49a03d, limb1: 0xa4a10356f453e01f78a42607, limb2: 0x43c348b885c84ff731c4d59c, limb3: 0x1962d75c2381201e1a0cbd6c, }, u384 { limb0: 0x36f96f891e2538b53dbf67f2, limb1: 0xc35a5dd279cd2eca6757cd6, limb2: 0x6e8eb15778c4855551ae7f31, limb3: 0x58df3306640da276faaae7d, }, u384 { limb0: 0xc28297ada8d26d98445f5416, limb1: 0x123da489e726af41727364f2, limb2: 0x89edb4d1d115c5dbddbcd30e, limb3: 0x16b7d288798e5395f20d23bf, }, u384 { limb0: 0xfd2ededda39142311a5001d, limb1: 0x542eda0fc9dec916a20b15dc, limb2: 0xf8228ddcc6d19c9f0f69bbb0, limb3: 0xbe0e079545f43e4b00cc912, }, u384 { limb0: 0xdfa9cce202c6477faaf9b7ac, limb1: 0xc5ecd87b6f0f5a6449f38db9, limb2: 0xac783182b70152c65550d881, limb3: 0x8d9e5297186db2d9fb266ea, }, u384 { limb0: 0xa58b1fb93d1a1399126a775c, limb1: 0x5dd365bc400a0051d5fa9c01, limb2: 0xace9824b5eecfdfa8d0cf8ef, limb3: 0x166007c08a99db2fc3ba8734, }, u384 { limb0: 0x801dee460ee415a15812ed9, limb1: 0xfeb34fd206357132b920f5b0, limb2: 0xbba6ff6ee5a4375efa1f4fd7, limb3: 0x16a3ef08be3ea7ea03bcddfa, }, u384 { limb0: 0xbb9248836b233d9d55535d4a, limb1: 0xabc5750c4bf39b4852cfe2f7, limb2: 0xd1d74cc4f9fb0ce4c6af5920, limb3: 0x1866c8ed336c61231a1be54f, }, u384 { limb0: 0xd529b35e346ef48bb8913f55, limb1: 0x5308592e7ea7d4fbc7385ea3, limb2: 0xd94a84903216f763e13d87bb, limb3: 0x167a55cda70a6e1cea820597, }, u384 { limb0: 0x4f83060400f8b49cba8f6aa8, limb1: 0xe591b36e636a5c871a5c29f, limb2: 0x1ad2911d9c6dd039bb61a629, limb3: 0x4d2f259eea405bd48f010a0, }, u384 { limb0: 0x6f7ebbea9684b529e2561092, limb1: 0x8c0f9a88cea7913516f96898, limb2: 0x48c50c477f94ff8aefce42d2, limb3: 0xaccbb67481d033ff5852c1e, }, u384 { limb0: 0xe3b90ac11e99b138573345cc, limb1: 0x7d5ceef9a00d9b8693000763, limb2: 0xb45f1496543346d98adf0226, limb3: 0xad6b9514c767fe3c3613144, }, u384 { limb0: 0x8714cc80d1fadc1326ed06f7, limb1: 0xcb748df27942480e420517bd, limb2: 0x53cd76f2bf565b94e72927c1, limb3: 0x2660400eb2e4f3b628bdd0d, }, u384 { limb0: 0xf13497804415473a1d634b8f, limb1: 0x324efcd6356caa205ca2f570, limb2: 0xd7819c171c40f65e273b853, limb3: 0xe0fa1d816ddc03e6b24255e, }, ]; ================================================ FILE: src/src/circuits/multi_pairing_check.cairo ================================================ use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::{ BLSProcessedPair, BNProcessedPair, E12D, G1Point, G2Line, G2Point, MillerLoopResultScalingFactor, u288, }; #[inline(always)] pub fn run_BLS12_381_INITIALIZE_MPCHECK_EXT_MLR_circuit( lambda_root_inverse: E12D, z: u384, scaling_factor: MillerLoopResultScalingFactor, precomputed_miller_loop_result: E12D, ) -> (u384, u384, u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x2 let in2 = CE::< CI<2>, > {}; // 0x18089593cbf626353947d5b1fd0c6d66bb34bc7585f5abdf8f17b50e12c47d65ce514a7c167b027b600febdb244714c5 let in3 = CE::< CI<3>, > {}; // 0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffeffff let in4 = CE::< CI<4>, > {}; // 0xd5e1c086ffe8016d063c6dad7a2fffc9072bb5785a686bcefeedc2e0124838bdccf325ee5d80be9902109f7dbc79812 let in5 = CE::< CI<5>, > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaad let in6 = CE::< CI<6>, > {}; // 0x1a0111ea397fe6998ce8d956845e1033efa3bf761f6622e9abc9802928bfc912627c4fd7ed3ffffb5dfb00000001aaaf let in7 = CE::< CI<7>, > {}; // 0xb659fb20274bfb1be8ff4d69163c08be7302c4818171fdd17d5be9b1d380acd8c747cdc4aff0e653631f5d3000f022c let in8 = CE::> {}; // -0x1 % p let in9 = CE::< CI<9>, > {}; // 0xfc3e2b36c4e03288e9e902231f9fb854a14787b6c7b36fec0c8ec971f63c5f282d5ac14d6c7ec22cf78a126ddc4af3 let in10 = CE::< CI<10>, > {}; // 0x1f87c566d89c06511d3d204463f3f70a9428f0f6d8f66dfd8191d92e3ec78be505ab5829ad8fd8459ef1424dbb895e6 let in11 = CE::< CI<11>, > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac let in12 = CE::< CI<12>, > {}; // 0x6af0e0437ff400b6831e36d6bd17ffe48395dabc2d3435e77f76e17009241c5ee67992f72ec05f4c81084fbede3cc09 let in13 = CE::< CI<13>, > {}; // 0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffefffe let in14 = CE::< CI<14>, > {}; // 0x144e4211384586c16bd3ad4afa99cc9170df3560e77982d0db45f3536814f0bd5871c1908bd478cd1ee605167ff82995 let in15 = CE::< CI<15>, > {}; // 0xe9b7238370b26e88c8bb2dfb1e7ec4b7d471f3cdb6df2e24f5b1405d978eb56923783226654f19a83cd0a2cfff0a87f // INPUT stack let (in16, in17, in18) = (CE::> {}, CE::> {}, CE::> {}); let (in19, in20, in21) = (CE::> {}, CE::> {}, CE::> {}); let (in22, in23, in24) = (CE::> {}, CE::> {}, CE::> {}); let (in25, in26, in27) = (CE::> {}, CE::> {}, CE::> {}); let (in28, in29, in30) = (CE::> {}, CE::> {}, CE::> {}); let (in31, in32, in33) = (CE::> {}, CE::> {}, CE::> {}); let (in34, in35, in36) = (CE::> {}, CE::> {}, CE::> {}); let (in37, in38, in39) = (CE::> {}, CE::> {}, CE::> {}); let (in40, in41, in42) = (CE::> {}, CE::> {}, CE::> {}); let (in43, in44, in45) = (CE::> {}, CE::> {}, CE::> {}); let in46 = CE::> {}; let t0 = circuit_mul(in28, in28); // Compute z^2 let t1 = circuit_mul(t0, in28); // Compute z^3 let t2 = circuit_mul(t1, in28); // Compute z^4 let t3 = circuit_mul(t2, in28); // Compute z^5 let t4 = circuit_mul(t3, in28); // Compute z^6 let t5 = circuit_mul(t4, in28); // Compute z^7 let t6 = circuit_mul(t5, in28); // Compute z^8 let t7 = circuit_mul(t6, in28); // Compute z^9 let t8 = circuit_mul(t7, in28); // Compute z^10 let t9 = circuit_mul(t8, in28); // Compute z^11 let t10 = circuit_sub(in0, in17); let t11 = circuit_sub(in0, in19); let t12 = circuit_sub(in0, in21); let t13 = circuit_sub(in0, in23); let t14 = circuit_sub(in0, in25); let t15 = circuit_sub(in0, in27); let t16 = circuit_mul(t10, in28); // Eval C_inv step coeff_1 * z^1 let t17 = circuit_add(in16, t16); // Eval C_inv step + (coeff_1 * z^1) let t18 = circuit_mul(in18, t0); // Eval C_inv step coeff_2 * z^2 let t19 = circuit_add(t17, t18); // Eval C_inv step + (coeff_2 * z^2) let t20 = circuit_mul(t11, t1); // Eval C_inv step coeff_3 * z^3 let t21 = circuit_add(t19, t20); // Eval C_inv step + (coeff_3 * z^3) let t22 = circuit_mul(in20, t2); // Eval C_inv step coeff_4 * z^4 let t23 = circuit_add(t21, t22); // Eval C_inv step + (coeff_4 * z^4) let t24 = circuit_mul(t12, t3); // Eval C_inv step coeff_5 * z^5 let t25 = circuit_add(t23, t24); // Eval C_inv step + (coeff_5 * z^5) let t26 = circuit_mul(in22, t4); // Eval C_inv step coeff_6 * z^6 let t27 = circuit_add(t25, t26); // Eval C_inv step + (coeff_6 * z^6) let t28 = circuit_mul(t13, t5); // Eval C_inv step coeff_7 * z^7 let t29 = circuit_add(t27, t28); // Eval C_inv step + (coeff_7 * z^7) let t30 = circuit_mul(in24, t6); // Eval C_inv step coeff_8 * z^8 let t31 = circuit_add(t29, t30); // Eval C_inv step + (coeff_8 * z^8) let t32 = circuit_mul(t14, t7); // Eval C_inv step coeff_9 * z^9 let t33 = circuit_add(t31, t32); // Eval C_inv step + (coeff_9 * z^9) let t34 = circuit_mul(in26, t8); // Eval C_inv step coeff_10 * z^10 let t35 = circuit_add(t33, t34); // Eval C_inv step + (coeff_10 * z^10) let t36 = circuit_mul(t15, t9); // Eval C_inv step coeff_11 * z^11 let t37 = circuit_add(t35, t36); // Eval C_inv step + (coeff_11 * z^11) let t38 = circuit_mul(in30, t0); // Eval sparse poly W step coeff_2 * z^2 let t39 = circuit_add(in29, t38); // Eval sparse poly W step + coeff_2 * z^2 let t40 = circuit_mul(in31, t2); // Eval sparse poly W step coeff_4 * z^4 let t41 = circuit_add(t39, t40); // Eval sparse poly W step + coeff_4 * z^4 let t42 = circuit_mul(in32, t4); // Eval sparse poly W step coeff_6 * z^6 let t43 = circuit_add(t41, t42); // Eval sparse poly W step + coeff_6 * z^6 let t44 = circuit_mul(in33, t6); // Eval sparse poly W step coeff_8 * z^8 let t45 = circuit_add(t43, t44); // Eval sparse poly W step + coeff_8 * z^8 let t46 = circuit_mul(in34, t8); // Eval sparse poly W step coeff_10 * z^10 let t47 = circuit_add(t45, t46); // Eval sparse poly W step + coeff_10 * z^10 let t48 = circuit_mul(in22, in1); let t49 = circuit_add(in16, t48); let t50 = circuit_mul(t10, in2); let t51 = circuit_mul(t13, in2); let t52 = circuit_add(t50, t51); let t53 = circuit_mul(in18, in3); let t54 = circuit_mul(t14, in4); let t55 = circuit_mul(in20, in5); let t56 = circuit_mul(in26, in6); let t57 = circuit_add(t55, t56); let t58 = circuit_mul(t12, in7); let t59 = circuit_mul(t15, in7); let t60 = circuit_add(t58, t59); let t61 = circuit_mul(in22, in8); let t62 = circuit_mul(t10, in9); let t63 = circuit_mul(t13, in10); let t64 = circuit_add(t62, t63); let t65 = circuit_mul(in18, in11); let t66 = circuit_mul(in24, in11); let t67 = circuit_add(t65, t66); let t68 = circuit_mul(t11, in12); let t69 = circuit_mul(in26, in13); let t70 = circuit_mul(t12, in14); let t71 = circuit_mul(t15, in15); let t72 = circuit_add(t70, t71); let t73 = circuit_sub(in0, t52); let t74 = circuit_sub(in0, t54); let t75 = circuit_sub(in0, t60); let t76 = circuit_sub(in0, t64); let t77 = circuit_sub(in0, t68); let t78 = circuit_sub(in0, t72); let t79 = circuit_mul(t73, in28); // Eval C_inv_frob_1 step coeff_1 * z^1 let t80 = circuit_add(t49, t79); // Eval C_inv_frob_1 step + (coeff_1 * z^1) let t81 = circuit_mul(t53, t0); // Eval C_inv_frob_1 step coeff_2 * z^2 let t82 = circuit_add(t80, t81); // Eval C_inv_frob_1 step + (coeff_2 * z^2) let t83 = circuit_mul(t74, t1); // Eval C_inv_frob_1 step coeff_3 * z^3 let t84 = circuit_add(t82, t83); // Eval C_inv_frob_1 step + (coeff_3 * z^3) let t85 = circuit_mul(t57, t2); // Eval C_inv_frob_1 step coeff_4 * z^4 let t86 = circuit_add(t84, t85); // Eval C_inv_frob_1 step + (coeff_4 * z^4) let t87 = circuit_mul(t75, t3); // Eval C_inv_frob_1 step coeff_5 * z^5 let t88 = circuit_add(t86, t87); // Eval C_inv_frob_1 step + (coeff_5 * z^5) let t89 = circuit_mul(t61, t4); // Eval C_inv_frob_1 step coeff_6 * z^6 let t90 = circuit_add(t88, t89); // Eval C_inv_frob_1 step + (coeff_6 * z^6) let t91 = circuit_mul(t76, t5); // Eval C_inv_frob_1 step coeff_7 * z^7 let t92 = circuit_add(t90, t91); // Eval C_inv_frob_1 step + (coeff_7 * z^7) let t93 = circuit_mul(t67, t6); // Eval C_inv_frob_1 step coeff_8 * z^8 let t94 = circuit_add(t92, t93); // Eval C_inv_frob_1 step + (coeff_8 * z^8) let t95 = circuit_mul(t77, t7); // Eval C_inv_frob_1 step coeff_9 * z^9 let t96 = circuit_add(t94, t95); // Eval C_inv_frob_1 step + (coeff_9 * z^9) let t97 = circuit_mul(t69, t8); // Eval C_inv_frob_1 step coeff_10 * z^10 let t98 = circuit_add(t96, t97); // Eval C_inv_frob_1 step + (coeff_10 * z^10) let t99 = circuit_mul(t78, t9); // Eval C_inv_frob_1 step coeff_11 * z^11 let t100 = circuit_add(t98, t99); // Eval C_inv_frob_1 step + (coeff_11 * z^11) let t101 = circuit_mul(in36, in28); // Eval precomputed_miller_loop_result step coeff_1 * z^1 let t102 = circuit_add( in35, t101, ); // Eval precomputed_miller_loop_result step + (coeff_1 * z^1) let t103 = circuit_mul(in37, t0); // Eval precomputed_miller_loop_result step coeff_2 * z^2 let t104 = circuit_add( t102, t103, ); // Eval precomputed_miller_loop_result step + (coeff_2 * z^2) let t105 = circuit_mul(in38, t1); // Eval precomputed_miller_loop_result step coeff_3 * z^3 let t106 = circuit_add( t104, t105, ); // Eval precomputed_miller_loop_result step + (coeff_3 * z^3) let t107 = circuit_mul(in39, t2); // Eval precomputed_miller_loop_result step coeff_4 * z^4 let t108 = circuit_add( t106, t107, ); // Eval precomputed_miller_loop_result step + (coeff_4 * z^4) let t109 = circuit_mul(in40, t3); // Eval precomputed_miller_loop_result step coeff_5 * z^5 let t110 = circuit_add( t108, t109, ); // Eval precomputed_miller_loop_result step + (coeff_5 * z^5) let t111 = circuit_mul(in41, t4); // Eval precomputed_miller_loop_result step coeff_6 * z^6 let t112 = circuit_add( t110, t111, ); // Eval precomputed_miller_loop_result step + (coeff_6 * z^6) let t113 = circuit_mul(in42, t5); // Eval precomputed_miller_loop_result step coeff_7 * z^7 let t114 = circuit_add( t112, t113, ); // Eval precomputed_miller_loop_result step + (coeff_7 * z^7) let t115 = circuit_mul(in43, t6); // Eval precomputed_miller_loop_result step coeff_8 * z^8 let t116 = circuit_add( t114, t115, ); // Eval precomputed_miller_loop_result step + (coeff_8 * z^8) let t117 = circuit_mul(in44, t7); // Eval precomputed_miller_loop_result step coeff_9 * z^9 let t118 = circuit_add( t116, t117, ); // Eval precomputed_miller_loop_result step + (coeff_9 * z^9) let t119 = circuit_mul(in45, t8); // Eval precomputed_miller_loop_result step coeff_10 * z^10 let t120 = circuit_add( t118, t119, ); // Eval precomputed_miller_loop_result step + (coeff_10 * z^10) let t121 = circuit_mul(in46, t9); // Eval precomputed_miller_loop_result step coeff_11 * z^11 let t122 = circuit_add( t120, t121, ); // Eval precomputed_miller_loop_result step + (coeff_11 * z^11) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t37, t47, t100, t122).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(INITIALIZE_MPCHECK_EXT_MLR_BLS12_381_CONSTANTS.span()); // in0 - in15 // Fill inputs: circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w0); // in16 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w1); // in17 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w2); // in18 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w3); // in19 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w4); // in20 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w5); // in21 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w6); // in22 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w7); // in23 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w8); // in24 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w9); // in25 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w10); // in26 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w11); // in27 circuit_inputs = circuit_inputs.next_2(z); // in28 circuit_inputs = circuit_inputs.next_2(scaling_factor.w0); // in29 circuit_inputs = circuit_inputs.next_2(scaling_factor.w2); // in30 circuit_inputs = circuit_inputs.next_2(scaling_factor.w4); // in31 circuit_inputs = circuit_inputs.next_2(scaling_factor.w6); // in32 circuit_inputs = circuit_inputs.next_2(scaling_factor.w8); // in33 circuit_inputs = circuit_inputs.next_2(scaling_factor.w10); // in34 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w0); // in35 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w1); // in36 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w2); // in37 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w3); // in38 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w4); // in39 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w5); // in40 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w6); // in41 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w7); // in42 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w8); // in43 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w9); // in44 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w10); // in45 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w11); // in46 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let c_inv_of_z: u384 = outputs.get_output(t37); let scaling_factor_of_z: u384 = outputs.get_output(t47); let c_inv_frob_1_conjugate_of_z: u384 = outputs.get_output(t100); let precomputed_miller_loop_result_of_z: u384 = outputs.get_output(t122); return ( c_inv_of_z, scaling_factor_of_z, c_inv_frob_1_conjugate_of_z, precomputed_miller_loop_result_of_z, ); } const INITIALIZE_MPCHECK_EXT_MLR_BLS12_381_CONSTANTS: [u384; 16] = [ u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x2, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x167b027b600febdb244714c5, limb1: 0x8f17b50e12c47d65ce514a7c, limb2: 0xfd0c6d66bb34bc7585f5abdf, limb3: 0x18089593cbf626353947d5b1, }, u384 { limb0: 0x620a00022e01fffffffeffff, limb1: 0xddb3a93be6f89688de17d813, limb2: 0xdf76ce51ba69c6076a0f77ea, limb3: 0x5f19672f, }, u384 { limb0: 0xe5d80be9902109f7dbc79812, limb1: 0xefeedc2e0124838bdccf325e, limb2: 0xd7a2fffc9072bb5785a686bc, limb3: 0xd5e1c086ffe8016d063c6da, }, u384 { limb0: 0x4f49fffd8bfd00000000aaad, limb1: 0x897d29650fb85f9b409427eb, limb2: 0x63d4de85aa0d857d89759ad4, limb3: 0x1a0111ea397fe699ec024086, }, u384 { limb0: 0xed3ffffb5dfb00000001aaaf, limb1: 0xabc9802928bfc912627c4fd7, limb2: 0x845e1033efa3bf761f6622e9, limb3: 0x1a0111ea397fe6998ce8d956, }, u384 { limb0: 0x4aff0e653631f5d3000f022c, limb1: 0x17d5be9b1d380acd8c747cdc, limb2: 0x9163c08be7302c4818171fdd, limb3: 0xb659fb20274bfb1be8ff4d6, }, u384 { limb0: 0xb153ffffb9feffffffffaaaa, limb1: 0x6730d2a0f6b0f6241eabfffe, limb2: 0x434bacd764774b84f38512bf, limb3: 0x1a0111ea397fe69a4b1ba7b6, }, u384 { limb0: 0x4d6c7ec22cf78a126ddc4af3, limb1: 0xec0c8ec971f63c5f282d5ac1, limb2: 0x231f9fb854a14787b6c7b36f, limb3: 0xfc3e2b36c4e03288e9e902, }, u384 { limb0: 0x9ad8fd8459ef1424dbb895e6, limb1: 0xd8191d92e3ec78be505ab582, limb2: 0x463f3f70a9428f0f6d8f66df, limb3: 0x1f87c566d89c06511d3d204, }, u384 { limb0: 0x4f49fffd8bfd00000000aaac, limb1: 0x897d29650fb85f9b409427eb, limb2: 0x63d4de85aa0d857d89759ad4, limb3: 0x1a0111ea397fe699ec024086, }, u384 { limb0: 0x72ec05f4c81084fbede3cc09, limb1: 0x77f76e17009241c5ee67992f, limb2: 0x6bd17ffe48395dabc2d3435e, limb3: 0x6af0e0437ff400b6831e36d, }, u384 { limb0: 0x620a00022e01fffffffefffe, limb1: 0xddb3a93be6f89688de17d813, limb2: 0xdf76ce51ba69c6076a0f77ea, limb3: 0x5f19672f, }, u384 { limb0: 0x8bd478cd1ee605167ff82995, limb1: 0xdb45f3536814f0bd5871c190, limb2: 0xfa99cc9170df3560e77982d0, limb3: 0x144e4211384586c16bd3ad4a, }, u384 { limb0: 0x6654f19a83cd0a2cfff0a87f, limb1: 0x4f5b1405d978eb5692378322, limb2: 0xb1e7ec4b7d471f3cdb6df2e2, limb3: 0xe9b7238370b26e88c8bb2df, }, ]; #[inline(always)] pub fn run_BLS12_381_INITIALIZE_MPCHECK_circuit( lambda_root_inverse: E12D, z: u384, scaling_factor: MillerLoopResultScalingFactor, ) -> (u384, u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x2 let in2 = CE::< CI<2>, > {}; // 0x18089593cbf626353947d5b1fd0c6d66bb34bc7585f5abdf8f17b50e12c47d65ce514a7c167b027b600febdb244714c5 let in3 = CE::< CI<3>, > {}; // 0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffeffff let in4 = CE::< CI<4>, > {}; // 0xd5e1c086ffe8016d063c6dad7a2fffc9072bb5785a686bcefeedc2e0124838bdccf325ee5d80be9902109f7dbc79812 let in5 = CE::< CI<5>, > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaad let in6 = CE::< CI<6>, > {}; // 0x1a0111ea397fe6998ce8d956845e1033efa3bf761f6622e9abc9802928bfc912627c4fd7ed3ffffb5dfb00000001aaaf let in7 = CE::< CI<7>, > {}; // 0xb659fb20274bfb1be8ff4d69163c08be7302c4818171fdd17d5be9b1d380acd8c747cdc4aff0e653631f5d3000f022c let in8 = CE::> {}; // -0x1 % p let in9 = CE::< CI<9>, > {}; // 0xfc3e2b36c4e03288e9e902231f9fb854a14787b6c7b36fec0c8ec971f63c5f282d5ac14d6c7ec22cf78a126ddc4af3 let in10 = CE::< CI<10>, > {}; // 0x1f87c566d89c06511d3d204463f3f70a9428f0f6d8f66dfd8191d92e3ec78be505ab5829ad8fd8459ef1424dbb895e6 let in11 = CE::< CI<11>, > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac let in12 = CE::< CI<12>, > {}; // 0x6af0e0437ff400b6831e36d6bd17ffe48395dabc2d3435e77f76e17009241c5ee67992f72ec05f4c81084fbede3cc09 let in13 = CE::< CI<13>, > {}; // 0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffefffe let in14 = CE::< CI<14>, > {}; // 0x144e4211384586c16bd3ad4afa99cc9170df3560e77982d0db45f3536814f0bd5871c1908bd478cd1ee605167ff82995 let in15 = CE::< CI<15>, > {}; // 0xe9b7238370b26e88c8bb2dfb1e7ec4b7d471f3cdb6df2e24f5b1405d978eb56923783226654f19a83cd0a2cfff0a87f // INPUT stack let (in16, in17, in18) = (CE::> {}, CE::> {}, CE::> {}); let (in19, in20, in21) = (CE::> {}, CE::> {}, CE::> {}); let (in22, in23, in24) = (CE::> {}, CE::> {}, CE::> {}); let (in25, in26, in27) = (CE::> {}, CE::> {}, CE::> {}); let (in28, in29, in30) = (CE::> {}, CE::> {}, CE::> {}); let (in31, in32, in33) = (CE::> {}, CE::> {}, CE::> {}); let in34 = CE::> {}; let t0 = circuit_mul(in28, in28); // Compute z^2 let t1 = circuit_mul(t0, in28); // Compute z^3 let t2 = circuit_mul(t1, in28); // Compute z^4 let t3 = circuit_mul(t2, in28); // Compute z^5 let t4 = circuit_mul(t3, in28); // Compute z^6 let t5 = circuit_mul(t4, in28); // Compute z^7 let t6 = circuit_mul(t5, in28); // Compute z^8 let t7 = circuit_mul(t6, in28); // Compute z^9 let t8 = circuit_mul(t7, in28); // Compute z^10 let t9 = circuit_mul(t8, in28); // Compute z^11 let t10 = circuit_sub(in0, in17); let t11 = circuit_sub(in0, in19); let t12 = circuit_sub(in0, in21); let t13 = circuit_sub(in0, in23); let t14 = circuit_sub(in0, in25); let t15 = circuit_sub(in0, in27); let t16 = circuit_mul(t10, in28); // Eval C_inv step coeff_1 * z^1 let t17 = circuit_add(in16, t16); // Eval C_inv step + (coeff_1 * z^1) let t18 = circuit_mul(in18, t0); // Eval C_inv step coeff_2 * z^2 let t19 = circuit_add(t17, t18); // Eval C_inv step + (coeff_2 * z^2) let t20 = circuit_mul(t11, t1); // Eval C_inv step coeff_3 * z^3 let t21 = circuit_add(t19, t20); // Eval C_inv step + (coeff_3 * z^3) let t22 = circuit_mul(in20, t2); // Eval C_inv step coeff_4 * z^4 let t23 = circuit_add(t21, t22); // Eval C_inv step + (coeff_4 * z^4) let t24 = circuit_mul(t12, t3); // Eval C_inv step coeff_5 * z^5 let t25 = circuit_add(t23, t24); // Eval C_inv step + (coeff_5 * z^5) let t26 = circuit_mul(in22, t4); // Eval C_inv step coeff_6 * z^6 let t27 = circuit_add(t25, t26); // Eval C_inv step + (coeff_6 * z^6) let t28 = circuit_mul(t13, t5); // Eval C_inv step coeff_7 * z^7 let t29 = circuit_add(t27, t28); // Eval C_inv step + (coeff_7 * z^7) let t30 = circuit_mul(in24, t6); // Eval C_inv step coeff_8 * z^8 let t31 = circuit_add(t29, t30); // Eval C_inv step + (coeff_8 * z^8) let t32 = circuit_mul(t14, t7); // Eval C_inv step coeff_9 * z^9 let t33 = circuit_add(t31, t32); // Eval C_inv step + (coeff_9 * z^9) let t34 = circuit_mul(in26, t8); // Eval C_inv step coeff_10 * z^10 let t35 = circuit_add(t33, t34); // Eval C_inv step + (coeff_10 * z^10) let t36 = circuit_mul(t15, t9); // Eval C_inv step coeff_11 * z^11 let t37 = circuit_add(t35, t36); // Eval C_inv step + (coeff_11 * z^11) let t38 = circuit_mul(in30, t0); // Eval sparse poly W step coeff_2 * z^2 let t39 = circuit_add(in29, t38); // Eval sparse poly W step + coeff_2 * z^2 let t40 = circuit_mul(in31, t2); // Eval sparse poly W step coeff_4 * z^4 let t41 = circuit_add(t39, t40); // Eval sparse poly W step + coeff_4 * z^4 let t42 = circuit_mul(in32, t4); // Eval sparse poly W step coeff_6 * z^6 let t43 = circuit_add(t41, t42); // Eval sparse poly W step + coeff_6 * z^6 let t44 = circuit_mul(in33, t6); // Eval sparse poly W step coeff_8 * z^8 let t45 = circuit_add(t43, t44); // Eval sparse poly W step + coeff_8 * z^8 let t46 = circuit_mul(in34, t8); // Eval sparse poly W step coeff_10 * z^10 let t47 = circuit_add(t45, t46); // Eval sparse poly W step + coeff_10 * z^10 let t48 = circuit_mul(in22, in1); let t49 = circuit_add(in16, t48); let t50 = circuit_mul(t10, in2); let t51 = circuit_mul(t13, in2); let t52 = circuit_add(t50, t51); let t53 = circuit_mul(in18, in3); let t54 = circuit_mul(t14, in4); let t55 = circuit_mul(in20, in5); let t56 = circuit_mul(in26, in6); let t57 = circuit_add(t55, t56); let t58 = circuit_mul(t12, in7); let t59 = circuit_mul(t15, in7); let t60 = circuit_add(t58, t59); let t61 = circuit_mul(in22, in8); let t62 = circuit_mul(t10, in9); let t63 = circuit_mul(t13, in10); let t64 = circuit_add(t62, t63); let t65 = circuit_mul(in18, in11); let t66 = circuit_mul(in24, in11); let t67 = circuit_add(t65, t66); let t68 = circuit_mul(t11, in12); let t69 = circuit_mul(in26, in13); let t70 = circuit_mul(t12, in14); let t71 = circuit_mul(t15, in15); let t72 = circuit_add(t70, t71); let t73 = circuit_sub(in0, t52); let t74 = circuit_sub(in0, t54); let t75 = circuit_sub(in0, t60); let t76 = circuit_sub(in0, t64); let t77 = circuit_sub(in0, t68); let t78 = circuit_sub(in0, t72); let t79 = circuit_mul(t73, in28); // Eval C_inv_frob_1 step coeff_1 * z^1 let t80 = circuit_add(t49, t79); // Eval C_inv_frob_1 step + (coeff_1 * z^1) let t81 = circuit_mul(t53, t0); // Eval C_inv_frob_1 step coeff_2 * z^2 let t82 = circuit_add(t80, t81); // Eval C_inv_frob_1 step + (coeff_2 * z^2) let t83 = circuit_mul(t74, t1); // Eval C_inv_frob_1 step coeff_3 * z^3 let t84 = circuit_add(t82, t83); // Eval C_inv_frob_1 step + (coeff_3 * z^3) let t85 = circuit_mul(t57, t2); // Eval C_inv_frob_1 step coeff_4 * z^4 let t86 = circuit_add(t84, t85); // Eval C_inv_frob_1 step + (coeff_4 * z^4) let t87 = circuit_mul(t75, t3); // Eval C_inv_frob_1 step coeff_5 * z^5 let t88 = circuit_add(t86, t87); // Eval C_inv_frob_1 step + (coeff_5 * z^5) let t89 = circuit_mul(t61, t4); // Eval C_inv_frob_1 step coeff_6 * z^6 let t90 = circuit_add(t88, t89); // Eval C_inv_frob_1 step + (coeff_6 * z^6) let t91 = circuit_mul(t76, t5); // Eval C_inv_frob_1 step coeff_7 * z^7 let t92 = circuit_add(t90, t91); // Eval C_inv_frob_1 step + (coeff_7 * z^7) let t93 = circuit_mul(t67, t6); // Eval C_inv_frob_1 step coeff_8 * z^8 let t94 = circuit_add(t92, t93); // Eval C_inv_frob_1 step + (coeff_8 * z^8) let t95 = circuit_mul(t77, t7); // Eval C_inv_frob_1 step coeff_9 * z^9 let t96 = circuit_add(t94, t95); // Eval C_inv_frob_1 step + (coeff_9 * z^9) let t97 = circuit_mul(t69, t8); // Eval C_inv_frob_1 step coeff_10 * z^10 let t98 = circuit_add(t96, t97); // Eval C_inv_frob_1 step + (coeff_10 * z^10) let t99 = circuit_mul(t78, t9); // Eval C_inv_frob_1 step coeff_11 * z^11 let t100 = circuit_add(t98, t99); // Eval C_inv_frob_1 step + (coeff_11 * z^11) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t37, t47, t100).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(INITIALIZE_MPCHECK_BLS12_381_CONSTANTS.span()); // in0 - in15 // Fill inputs: circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w0); // in16 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w1); // in17 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w2); // in18 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w3); // in19 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w4); // in20 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w5); // in21 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w6); // in22 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w7); // in23 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w8); // in24 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w9); // in25 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w10); // in26 circuit_inputs = circuit_inputs.next_2(lambda_root_inverse.w11); // in27 circuit_inputs = circuit_inputs.next_2(z); // in28 circuit_inputs = circuit_inputs.next_2(scaling_factor.w0); // in29 circuit_inputs = circuit_inputs.next_2(scaling_factor.w2); // in30 circuit_inputs = circuit_inputs.next_2(scaling_factor.w4); // in31 circuit_inputs = circuit_inputs.next_2(scaling_factor.w6); // in32 circuit_inputs = circuit_inputs.next_2(scaling_factor.w8); // in33 circuit_inputs = circuit_inputs.next_2(scaling_factor.w10); // in34 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let c_inv_of_z: u384 = outputs.get_output(t37); let scaling_factor_of_z: u384 = outputs.get_output(t47); let c_inv_frob_1_conjugate_of_z: u384 = outputs.get_output(t100); return (c_inv_of_z, scaling_factor_of_z, c_inv_frob_1_conjugate_of_z); } const INITIALIZE_MPCHECK_BLS12_381_CONSTANTS: [u384; 16] = [ u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x2, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x167b027b600febdb244714c5, limb1: 0x8f17b50e12c47d65ce514a7c, limb2: 0xfd0c6d66bb34bc7585f5abdf, limb3: 0x18089593cbf626353947d5b1, }, u384 { limb0: 0x620a00022e01fffffffeffff, limb1: 0xddb3a93be6f89688de17d813, limb2: 0xdf76ce51ba69c6076a0f77ea, limb3: 0x5f19672f, }, u384 { limb0: 0xe5d80be9902109f7dbc79812, limb1: 0xefeedc2e0124838bdccf325e, limb2: 0xd7a2fffc9072bb5785a686bc, limb3: 0xd5e1c086ffe8016d063c6da, }, u384 { limb0: 0x4f49fffd8bfd00000000aaad, limb1: 0x897d29650fb85f9b409427eb, limb2: 0x63d4de85aa0d857d89759ad4, limb3: 0x1a0111ea397fe699ec024086, }, u384 { limb0: 0xed3ffffb5dfb00000001aaaf, limb1: 0xabc9802928bfc912627c4fd7, limb2: 0x845e1033efa3bf761f6622e9, limb3: 0x1a0111ea397fe6998ce8d956, }, u384 { limb0: 0x4aff0e653631f5d3000f022c, limb1: 0x17d5be9b1d380acd8c747cdc, limb2: 0x9163c08be7302c4818171fdd, limb3: 0xb659fb20274bfb1be8ff4d6, }, u384 { limb0: 0xb153ffffb9feffffffffaaaa, limb1: 0x6730d2a0f6b0f6241eabfffe, limb2: 0x434bacd764774b84f38512bf, limb3: 0x1a0111ea397fe69a4b1ba7b6, }, u384 { limb0: 0x4d6c7ec22cf78a126ddc4af3, limb1: 0xec0c8ec971f63c5f282d5ac1, limb2: 0x231f9fb854a14787b6c7b36f, limb3: 0xfc3e2b36c4e03288e9e902, }, u384 { limb0: 0x9ad8fd8459ef1424dbb895e6, limb1: 0xd8191d92e3ec78be505ab582, limb2: 0x463f3f70a9428f0f6d8f66df, limb3: 0x1f87c566d89c06511d3d204, }, u384 { limb0: 0x4f49fffd8bfd00000000aaac, limb1: 0x897d29650fb85f9b409427eb, limb2: 0x63d4de85aa0d857d89759ad4, limb3: 0x1a0111ea397fe699ec024086, }, u384 { limb0: 0x72ec05f4c81084fbede3cc09, limb1: 0x77f76e17009241c5ee67992f, limb2: 0x6bd17ffe48395dabc2d3435e, limb3: 0x6af0e0437ff400b6831e36d, }, u384 { limb0: 0x620a00022e01fffffffefffe, limb1: 0xddb3a93be6f89688de17d813, limb2: 0xdf76ce51ba69c6076a0f77ea, limb3: 0x5f19672f, }, u384 { limb0: 0x8bd478cd1ee605167ff82995, limb1: 0xdb45f3536814f0bd5871c190, limb2: 0xfa99cc9170df3560e77982d0, limb3: 0x144e4211384586c16bd3ad4a, }, u384 { limb0: 0x6654f19a83cd0a2cfff0a87f, limb1: 0x4f5b1405d978eb5692378322, limb2: 0xb1e7ec4b7d471f3cdb6df2e2, limb3: 0xe9b7238370b26e88c8bb2df, }, ]; #[inline(always)] pub fn run_BLS12_381_MP_CHECK_BIT00_2P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, G2_line_2nd_0_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, G2_line_2nd_0_1: G2Line, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, z: u384, c1: u384, ) -> (u384,) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let in24 = CE::> {}; let t0 = circuit_mul(in23, in23); // compute z^2 let t1 = circuit_mul(t0, in23); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, t0); // compute z^8 let t4 = circuit_mul(in21, in21); // Square f evaluation in Z, the result of previous bit. let t5 = circuit_sub(in4, in5); let t6 = circuit_mul(t5, in0); // eval bls line by yInv let t7 = circuit_sub(in2, in3); let t8 = circuit_mul(t7, in1); // eval blsline by xNegOverY let t9 = circuit_mul(in5, in0); // eval bls line by yInv let t10 = circuit_mul(in3, in1); // eval bls line by xNegOverY let t11 = circuit_mul(t8, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 let t12 = circuit_add(t6, t11); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 let t13 = circuit_add(t12, t1); // Eval sparse poly line_0p_1 step + 1*z^3 let t14 = circuit_mul(t9, t2); // Eval sparse poly line_0p_1 step coeff_6 * z^6 let t15 = circuit_add(t13, t14); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 let t16 = circuit_mul(t10, t3); // Eval sparse poly line_0p_1 step coeff_8 * z^8 let t17 = circuit_add(t15, t16); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t18 = circuit_mul(t4, t17); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t19 = circuit_sub(in8, in9); let t20 = circuit_mul(t19, in10); // eval bls line by yInv let t21 = circuit_sub(in6, in7); let t22 = circuit_mul(t21, in11); // eval blsline by xNegOverY let t23 = circuit_mul(in9, in10); // eval bls line by yInv let t24 = circuit_mul(in7, in11); // eval bls line by xNegOverY let t25 = circuit_mul(t22, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 let t26 = circuit_add(t20, t25); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 let t27 = circuit_add(t26, t1); // Eval sparse poly line_1p_1 step + 1*z^3 let t28 = circuit_mul(t23, t2); // Eval sparse poly line_1p_1 step coeff_6 * z^6 let t29 = circuit_add(t27, t28); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 let t30 = circuit_mul(t24, t3); // Eval sparse poly line_1p_1 step coeff_8 * z^8 let t31 = circuit_add(t29, t30); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t32 = circuit_mul(t18, t31); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t33 = circuit_mul( t32, t32, ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 let t34 = circuit_sub(in14, in15); let t35 = circuit_mul(t34, in0); // eval bls line by yInv let t36 = circuit_sub(in12, in13); let t37 = circuit_mul(t36, in1); // eval blsline by xNegOverY let t38 = circuit_mul(in15, in0); // eval bls line by yInv let t39 = circuit_mul(in13, in1); // eval bls line by xNegOverY let t40 = circuit_mul(t37, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 let t41 = circuit_add(t35, t40); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 let t42 = circuit_add(t41, t1); // Eval sparse poly line_0p_1 step + 1*z^3 let t43 = circuit_mul(t38, t2); // Eval sparse poly line_0p_1 step coeff_6 * z^6 let t44 = circuit_add(t42, t43); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 let t45 = circuit_mul(t39, t3); // Eval sparse poly line_0p_1 step coeff_8 * z^8 let t46 = circuit_add(t44, t45); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t47 = circuit_mul(t33, t46); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t48 = circuit_sub(in18, in19); let t49 = circuit_mul(t48, in10); // eval bls line by yInv let t50 = circuit_sub(in16, in17); let t51 = circuit_mul(t50, in11); // eval blsline by xNegOverY let t52 = circuit_mul(in19, in10); // eval bls line by yInv let t53 = circuit_mul(in17, in11); // eval bls line by xNegOverY let t54 = circuit_mul(t51, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 let t55 = circuit_add(t49, t54); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 let t56 = circuit_add(t55, t1); // Eval sparse poly line_1p_1 step + 1*z^3 let t57 = circuit_mul(t52, t2); // Eval sparse poly line_1p_1 step coeff_6 * z^6 let t58 = circuit_add(t56, t57); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 let t59 = circuit_mul(t53, t3); // Eval sparse poly line_1p_1 step coeff_8 * z^8 let t60 = circuit_add(t58, t59); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t61 = circuit_mul(t47, t60); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t62 = circuit_sub(t61, in22); // (Π(i,k) (Pk(z))) - Ri(z) let t63 = circuit_mul(in24, in20); let t64 = circuit_add(t63, t62); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t64,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in0 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in1 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in2 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in3 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r0a0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r0a1); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r1a0); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r1a1); // in9 circuit_inputs = circuit_inputs.next_2(yInv_1); // in10 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in15 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r0a0); // in16 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r0a1); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r1a0); // in18 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r1a1); // in19 circuit_inputs = circuit_inputs.next_2(lhs_i); // in20 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in21 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in22 circuit_inputs = circuit_inputs.next_2(z); // in23 circuit_inputs = circuit_inputs.next_2(c1); // in24 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let lhs_i_plus_one: u384 = outputs.get_output(t64); return (lhs_i_plus_one,); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_BIT00_3P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, G2_line_2nd_0_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, G2_line_2nd_0_1: G2Line, yInv_2: u384, xNegOverY_2: u384, Q_2: G2Point, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, z: u384, c1: u384, ) -> (G2Point, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x3 let in1 = CE::> {}; // 0x6 let in2 = CE::> {}; // 0x0 // INPUT stack let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let (in24, in25, in26) = (CE::> {}, CE::> {}, CE::> {}); let (in27, in28, in29) = (CE::> {}, CE::> {}, CE::> {}); let (in30, in31, in32) = (CE::> {}, CE::> {}, CE::> {}); let in33 = CE::> {}; let t0 = circuit_mul(in32, in32); // compute z^2 let t1 = circuit_mul(t0, in32); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, t0); // compute z^8 let t4 = circuit_mul(in30, in30); // Square f evaluation in Z, the result of previous bit. let t5 = circuit_sub(in7, in8); let t6 = circuit_mul(t5, in3); // eval bls line by yInv let t7 = circuit_sub(in5, in6); let t8 = circuit_mul(t7, in4); // eval blsline by xNegOverY let t9 = circuit_mul(in8, in3); // eval bls line by yInv let t10 = circuit_mul(in6, in4); // eval bls line by xNegOverY let t11 = circuit_mul(t8, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 let t12 = circuit_add(t6, t11); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 let t13 = circuit_add(t12, t1); // Eval sparse poly line_0p_1 step + 1*z^3 let t14 = circuit_mul(t9, t2); // Eval sparse poly line_0p_1 step coeff_6 * z^6 let t15 = circuit_add(t13, t14); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 let t16 = circuit_mul(t10, t3); // Eval sparse poly line_0p_1 step coeff_8 * z^8 let t17 = circuit_add(t15, t16); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t18 = circuit_mul(t4, t17); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t19 = circuit_sub(in11, in12); let t20 = circuit_mul(t19, in13); // eval bls line by yInv let t21 = circuit_sub(in9, in10); let t22 = circuit_mul(t21, in14); // eval blsline by xNegOverY let t23 = circuit_mul(in12, in13); // eval bls line by yInv let t24 = circuit_mul(in10, in14); // eval bls line by xNegOverY let t25 = circuit_mul(t22, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 let t26 = circuit_add(t20, t25); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 let t27 = circuit_add(t26, t1); // Eval sparse poly line_1p_1 step + 1*z^3 let t28 = circuit_mul(t23, t2); // Eval sparse poly line_1p_1 step coeff_6 * z^6 let t29 = circuit_add(t27, t28); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 let t30 = circuit_mul(t24, t3); // Eval sparse poly line_1p_1 step coeff_8 * z^8 let t31 = circuit_add(t29, t30); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t32 = circuit_mul(t18, t31); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t33 = circuit_add(in25, in26); // Doubling slope numerator start let t34 = circuit_sub(in25, in26); let t35 = circuit_mul(t33, t34); let t36 = circuit_mul(in25, in26); let t37 = circuit_mul(t35, in0); let t38 = circuit_mul(t36, in1); // Doubling slope numerator end let t39 = circuit_add(in27, in27); // Fp2 add coeff 0/1 let t40 = circuit_add(in28, in28); // Fp2 add coeff 1/1 let t41 = circuit_mul(t39, t39); // Fp2 Inv start let t42 = circuit_mul(t40, t40); let t43 = circuit_add(t41, t42); let t44 = circuit_inverse(t43); let t45 = circuit_mul(t39, t44); // Fp2 Inv real part end let t46 = circuit_mul(t40, t44); let t47 = circuit_sub(in2, t46); // Fp2 Inv imag part end let t48 = circuit_mul(t37, t45); // Fp2 mul start let t49 = circuit_mul(t38, t47); let t50 = circuit_sub(t48, t49); // Fp2 mul real part end let t51 = circuit_mul(t37, t47); let t52 = circuit_mul(t38, t45); let t53 = circuit_add(t51, t52); // Fp2 mul imag part end let t54 = circuit_add(t50, t53); let t55 = circuit_sub(t50, t53); let t56 = circuit_mul(t54, t55); let t57 = circuit_mul(t50, t53); let t58 = circuit_add(t57, t57); let t59 = circuit_add(in25, in25); // Fp2 add coeff 0/1 let t60 = circuit_add(in26, in26); // Fp2 add coeff 1/1 let t61 = circuit_sub(t56, t59); // Fp2 sub coeff 0/1 let t62 = circuit_sub(t58, t60); // Fp2 sub coeff 1/1 let t63 = circuit_sub(in25, t61); // Fp2 sub coeff 0/1 let t64 = circuit_sub(in26, t62); // Fp2 sub coeff 1/1 let t65 = circuit_mul(t50, t63); // Fp2 mul start let t66 = circuit_mul(t53, t64); let t67 = circuit_sub(t65, t66); // Fp2 mul real part end let t68 = circuit_mul(t50, t64); let t69 = circuit_mul(t53, t63); let t70 = circuit_add(t68, t69); // Fp2 mul imag part end let t71 = circuit_sub(t67, in27); // Fp2 sub coeff 0/1 let t72 = circuit_sub(t70, in28); // Fp2 sub coeff 1/1 let t73 = circuit_mul(t50, in25); // Fp2 mul start let t74 = circuit_mul(t53, in26); let t75 = circuit_sub(t73, t74); // Fp2 mul real part end let t76 = circuit_mul(t50, in26); let t77 = circuit_mul(t53, in25); let t78 = circuit_add(t76, t77); // Fp2 mul imag part end let t79 = circuit_sub(t75, in27); // Fp2 sub coeff 0/1 let t80 = circuit_sub(t78, in28); // Fp2 sub coeff 1/1 let t81 = circuit_sub(t79, t80); let t82 = circuit_mul(t81, in23); // eval bls line by yInv let t83 = circuit_sub(t50, t53); let t84 = circuit_mul(t83, in24); // eval blsline by xNegOverY let t85 = circuit_mul(t80, in23); // eval bls line by yInv let t86 = circuit_mul(t53, in24); // eval bls line by xNegOverY let t87 = circuit_mul(t84, t0); // Eval sparse poly line_2p_1 step coeff_2 * z^2 let t88 = circuit_add(t82, t87); // Eval sparse poly line_2p_1 step + coeff_2 * z^2 let t89 = circuit_add(t88, t1); // Eval sparse poly line_2p_1 step + 1*z^3 let t90 = circuit_mul(t85, t2); // Eval sparse poly line_2p_1 step coeff_6 * z^6 let t91 = circuit_add(t89, t90); // Eval sparse poly line_2p_1 step + coeff_6 * z^6 let t92 = circuit_mul(t86, t3); // Eval sparse poly line_2p_1 step coeff_8 * z^8 let t93 = circuit_add(t91, t92); // Eval sparse poly line_2p_1 step + coeff_8 * z^8 let t94 = circuit_mul(t32, t93); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t95 = circuit_mul( t94, t94, ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 let t96 = circuit_sub(in17, in18); let t97 = circuit_mul(t96, in3); // eval bls line by yInv let t98 = circuit_sub(in15, in16); let t99 = circuit_mul(t98, in4); // eval blsline by xNegOverY let t100 = circuit_mul(in18, in3); // eval bls line by yInv let t101 = circuit_mul(in16, in4); // eval bls line by xNegOverY let t102 = circuit_mul(t99, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 let t103 = circuit_add(t97, t102); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 let t104 = circuit_add(t103, t1); // Eval sparse poly line_0p_1 step + 1*z^3 let t105 = circuit_mul(t100, t2); // Eval sparse poly line_0p_1 step coeff_6 * z^6 let t106 = circuit_add(t104, t105); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 let t107 = circuit_mul(t101, t3); // Eval sparse poly line_0p_1 step coeff_8 * z^8 let t108 = circuit_add(t106, t107); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t109 = circuit_mul(t95, t108); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t110 = circuit_sub(in21, in22); let t111 = circuit_mul(t110, in13); // eval bls line by yInv let t112 = circuit_sub(in19, in20); let t113 = circuit_mul(t112, in14); // eval blsline by xNegOverY let t114 = circuit_mul(in22, in13); // eval bls line by yInv let t115 = circuit_mul(in20, in14); // eval bls line by xNegOverY let t116 = circuit_mul(t113, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 let t117 = circuit_add(t111, t116); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 let t118 = circuit_add(t117, t1); // Eval sparse poly line_1p_1 step + 1*z^3 let t119 = circuit_mul(t114, t2); // Eval sparse poly line_1p_1 step coeff_6 * z^6 let t120 = circuit_add(t118, t119); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 let t121 = circuit_mul(t115, t3); // Eval sparse poly line_1p_1 step coeff_8 * z^8 let t122 = circuit_add(t120, t121); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t123 = circuit_mul(t109, t122); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t124 = circuit_add(t61, t62); // Doubling slope numerator start let t125 = circuit_sub(t61, t62); let t126 = circuit_mul(t124, t125); let t127 = circuit_mul(t61, t62); let t128 = circuit_mul(t126, in0); let t129 = circuit_mul(t127, in1); // Doubling slope numerator end let t130 = circuit_add(t71, t71); // Fp2 add coeff 0/1 let t131 = circuit_add(t72, t72); // Fp2 add coeff 1/1 let t132 = circuit_mul(t130, t130); // Fp2 Inv start let t133 = circuit_mul(t131, t131); let t134 = circuit_add(t132, t133); let t135 = circuit_inverse(t134); let t136 = circuit_mul(t130, t135); // Fp2 Inv real part end let t137 = circuit_mul(t131, t135); let t138 = circuit_sub(in2, t137); // Fp2 Inv imag part end let t139 = circuit_mul(t128, t136); // Fp2 mul start let t140 = circuit_mul(t129, t138); let t141 = circuit_sub(t139, t140); // Fp2 mul real part end let t142 = circuit_mul(t128, t138); let t143 = circuit_mul(t129, t136); let t144 = circuit_add(t142, t143); // Fp2 mul imag part end let t145 = circuit_add(t141, t144); let t146 = circuit_sub(t141, t144); let t147 = circuit_mul(t145, t146); let t148 = circuit_mul(t141, t144); let t149 = circuit_add(t148, t148); let t150 = circuit_add(t61, t61); // Fp2 add coeff 0/1 let t151 = circuit_add(t62, t62); // Fp2 add coeff 1/1 let t152 = circuit_sub(t147, t150); // Fp2 sub coeff 0/1 let t153 = circuit_sub(t149, t151); // Fp2 sub coeff 1/1 let t154 = circuit_sub(t61, t152); // Fp2 sub coeff 0/1 let t155 = circuit_sub(t62, t153); // Fp2 sub coeff 1/1 let t156 = circuit_mul(t141, t154); // Fp2 mul start let t157 = circuit_mul(t144, t155); let t158 = circuit_sub(t156, t157); // Fp2 mul real part end let t159 = circuit_mul(t141, t155); let t160 = circuit_mul(t144, t154); let t161 = circuit_add(t159, t160); // Fp2 mul imag part end let t162 = circuit_sub(t158, t71); // Fp2 sub coeff 0/1 let t163 = circuit_sub(t161, t72); // Fp2 sub coeff 1/1 let t164 = circuit_mul(t141, t61); // Fp2 mul start let t165 = circuit_mul(t144, t62); let t166 = circuit_sub(t164, t165); // Fp2 mul real part end let t167 = circuit_mul(t141, t62); let t168 = circuit_mul(t144, t61); let t169 = circuit_add(t167, t168); // Fp2 mul imag part end let t170 = circuit_sub(t166, t71); // Fp2 sub coeff 0/1 let t171 = circuit_sub(t169, t72); // Fp2 sub coeff 1/1 let t172 = circuit_sub(t170, t171); let t173 = circuit_mul(t172, in23); // eval bls line by yInv let t174 = circuit_sub(t141, t144); let t175 = circuit_mul(t174, in24); // eval blsline by xNegOverY let t176 = circuit_mul(t171, in23); // eval bls line by yInv let t177 = circuit_mul(t144, in24); // eval bls line by xNegOverY let t178 = circuit_mul(t175, t0); // Eval sparse poly line_2p_1 step coeff_2 * z^2 let t179 = circuit_add(t173, t178); // Eval sparse poly line_2p_1 step + coeff_2 * z^2 let t180 = circuit_add(t179, t1); // Eval sparse poly line_2p_1 step + 1*z^3 let t181 = circuit_mul(t176, t2); // Eval sparse poly line_2p_1 step coeff_6 * z^6 let t182 = circuit_add(t180, t181); // Eval sparse poly line_2p_1 step + coeff_6 * z^6 let t183 = circuit_mul(t177, t3); // Eval sparse poly line_2p_1 step coeff_8 * z^8 let t184 = circuit_add(t182, t183); // Eval sparse poly line_2p_1 step + coeff_8 * z^8 let t185 = circuit_mul(t123, t184); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t186 = circuit_sub(t185, in31); // (Π(i,k) (Pk(z))) - Ri(z) let t187 = circuit_mul(in33, in29); let t188 = circuit_add(t187, t186); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t152, t153, t162, t163, t188).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x6, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in2 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in3 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r0a0); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r0a1); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r1a0); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r1a1); // in12 circuit_inputs = circuit_inputs.next_2(yInv_1); // in13 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in15 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in16 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in18 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r0a0); // in19 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r0a1); // in20 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r1a0); // in21 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r1a1); // in22 circuit_inputs = circuit_inputs.next_2(yInv_2); // in23 circuit_inputs = circuit_inputs.next_2(xNegOverY_2); // in24 circuit_inputs = circuit_inputs.next_2(Q_2.x0); // in25 circuit_inputs = circuit_inputs.next_2(Q_2.x1); // in26 circuit_inputs = circuit_inputs.next_2(Q_2.y0); // in27 circuit_inputs = circuit_inputs.next_2(Q_2.y1); // in28 circuit_inputs = circuit_inputs.next_2(lhs_i); // in29 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in30 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in31 circuit_inputs = circuit_inputs.next_2(z); // in32 circuit_inputs = circuit_inputs.next_2(c1); // in33 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t152), x1: outputs.get_output(t153), y0: outputs.get_output(t162), y1: outputs.get_output(t163), }; let lhs_i_plus_one: u384 = outputs.get_output(t188); return (Q0, lhs_i_plus_one); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_BIT0_2P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, z: u384, c1: u384, ) -> (u384,) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in15, in15); // compute z^2 let t1 = circuit_mul(t0, in15); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, t0); // compute z^8 let t4 = circuit_mul(in13, in13); // Square f evaluation in Z, the result of previous bit. let t5 = circuit_sub(in4, in5); let t6 = circuit_mul(t5, in0); // eval bls line by yInv let t7 = circuit_sub(in2, in3); let t8 = circuit_mul(t7, in1); // eval blsline by xNegOverY let t9 = circuit_mul(in5, in0); // eval bls line by yInv let t10 = circuit_mul(in3, in1); // eval bls line by xNegOverY let t11 = circuit_mul(t8, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 let t12 = circuit_add(t6, t11); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 let t13 = circuit_add(t12, t1); // Eval sparse poly line_0p_1 step + 1*z^3 let t14 = circuit_mul(t9, t2); // Eval sparse poly line_0p_1 step coeff_6 * z^6 let t15 = circuit_add(t13, t14); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 let t16 = circuit_mul(t10, t3); // Eval sparse poly line_0p_1 step coeff_8 * z^8 let t17 = circuit_add(t15, t16); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t18 = circuit_mul(t4, t17); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t19 = circuit_sub(in10, in11); let t20 = circuit_mul(t19, in6); // eval bls line by yInv let t21 = circuit_sub(in8, in9); let t22 = circuit_mul(t21, in7); // eval blsline by xNegOverY let t23 = circuit_mul(in11, in6); // eval bls line by yInv let t24 = circuit_mul(in9, in7); // eval bls line by xNegOverY let t25 = circuit_mul(t22, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 let t26 = circuit_add(t20, t25); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 let t27 = circuit_add(t26, t1); // Eval sparse poly line_1p_1 step + 1*z^3 let t28 = circuit_mul(t23, t2); // Eval sparse poly line_1p_1 step coeff_6 * z^6 let t29 = circuit_add(t27, t28); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 let t30 = circuit_mul(t24, t3); // Eval sparse poly line_1p_1 step coeff_8 * z^8 let t31 = circuit_add(t29, t30); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t32 = circuit_mul(t18, t31); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t33 = circuit_sub(t32, in14); // (Π(i,k) (Pk(z))) - Ri(z) let t34 = circuit_mul(in16, in12); let t35 = circuit_add(t34, t33); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t35,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in0 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in1 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in2 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in3 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in5 circuit_inputs = circuit_inputs.next_2(yInv_1); // in6 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in11 circuit_inputs = circuit_inputs.next_2(lhs_i); // in12 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in13 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in14 circuit_inputs = circuit_inputs.next_2(z); // in15 circuit_inputs = circuit_inputs.next_2(c1); // in16 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let lhs_i_plus_one: u384 = outputs.get_output(t35); return (lhs_i_plus_one,); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_BIT0_3P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, yInv_2: u384, xNegOverY_2: u384, Q_2: G2Point, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, z: u384, c1: u384, ) -> (G2Point, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x3 let in1 = CE::> {}; // 0x6 let in2 = CE::> {}; // 0x0 // INPUT stack let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let (in24, in25) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in24, in24); // compute z^2 let t1 = circuit_mul(t0, in24); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, t0); // compute z^8 let t4 = circuit_mul(in22, in22); // Square f evaluation in Z, the result of previous bit. let t5 = circuit_sub(in7, in8); let t6 = circuit_mul(t5, in3); // eval bls line by yInv let t7 = circuit_sub(in5, in6); let t8 = circuit_mul(t7, in4); // eval blsline by xNegOverY let t9 = circuit_mul(in8, in3); // eval bls line by yInv let t10 = circuit_mul(in6, in4); // eval bls line by xNegOverY let t11 = circuit_mul(t8, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 let t12 = circuit_add(t6, t11); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 let t13 = circuit_add(t12, t1); // Eval sparse poly line_0p_1 step + 1*z^3 let t14 = circuit_mul(t9, t2); // Eval sparse poly line_0p_1 step coeff_6 * z^6 let t15 = circuit_add(t13, t14); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 let t16 = circuit_mul(t10, t3); // Eval sparse poly line_0p_1 step coeff_8 * z^8 let t17 = circuit_add(t15, t16); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t18 = circuit_mul(t4, t17); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t19 = circuit_sub(in13, in14); let t20 = circuit_mul(t19, in9); // eval bls line by yInv let t21 = circuit_sub(in11, in12); let t22 = circuit_mul(t21, in10); // eval blsline by xNegOverY let t23 = circuit_mul(in14, in9); // eval bls line by yInv let t24 = circuit_mul(in12, in10); // eval bls line by xNegOverY let t25 = circuit_mul(t22, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 let t26 = circuit_add(t20, t25); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 let t27 = circuit_add(t26, t1); // Eval sparse poly line_1p_1 step + 1*z^3 let t28 = circuit_mul(t23, t2); // Eval sparse poly line_1p_1 step coeff_6 * z^6 let t29 = circuit_add(t27, t28); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 let t30 = circuit_mul(t24, t3); // Eval sparse poly line_1p_1 step coeff_8 * z^8 let t31 = circuit_add(t29, t30); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t32 = circuit_mul(t18, t31); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t33 = circuit_add(in17, in18); // Doubling slope numerator start let t34 = circuit_sub(in17, in18); let t35 = circuit_mul(t33, t34); let t36 = circuit_mul(in17, in18); let t37 = circuit_mul(t35, in0); let t38 = circuit_mul(t36, in1); // Doubling slope numerator end let t39 = circuit_add(in19, in19); // Fp2 add coeff 0/1 let t40 = circuit_add(in20, in20); // Fp2 add coeff 1/1 let t41 = circuit_mul(t39, t39); // Fp2 Inv start let t42 = circuit_mul(t40, t40); let t43 = circuit_add(t41, t42); let t44 = circuit_inverse(t43); let t45 = circuit_mul(t39, t44); // Fp2 Inv real part end let t46 = circuit_mul(t40, t44); let t47 = circuit_sub(in2, t46); // Fp2 Inv imag part end let t48 = circuit_mul(t37, t45); // Fp2 mul start let t49 = circuit_mul(t38, t47); let t50 = circuit_sub(t48, t49); // Fp2 mul real part end let t51 = circuit_mul(t37, t47); let t52 = circuit_mul(t38, t45); let t53 = circuit_add(t51, t52); // Fp2 mul imag part end let t54 = circuit_add(t50, t53); let t55 = circuit_sub(t50, t53); let t56 = circuit_mul(t54, t55); let t57 = circuit_mul(t50, t53); let t58 = circuit_add(t57, t57); let t59 = circuit_add(in17, in17); // Fp2 add coeff 0/1 let t60 = circuit_add(in18, in18); // Fp2 add coeff 1/1 let t61 = circuit_sub(t56, t59); // Fp2 sub coeff 0/1 let t62 = circuit_sub(t58, t60); // Fp2 sub coeff 1/1 let t63 = circuit_sub(in17, t61); // Fp2 sub coeff 0/1 let t64 = circuit_sub(in18, t62); // Fp2 sub coeff 1/1 let t65 = circuit_mul(t50, t63); // Fp2 mul start let t66 = circuit_mul(t53, t64); let t67 = circuit_sub(t65, t66); // Fp2 mul real part end let t68 = circuit_mul(t50, t64); let t69 = circuit_mul(t53, t63); let t70 = circuit_add(t68, t69); // Fp2 mul imag part end let t71 = circuit_sub(t67, in19); // Fp2 sub coeff 0/1 let t72 = circuit_sub(t70, in20); // Fp2 sub coeff 1/1 let t73 = circuit_mul(t50, in17); // Fp2 mul start let t74 = circuit_mul(t53, in18); let t75 = circuit_sub(t73, t74); // Fp2 mul real part end let t76 = circuit_mul(t50, in18); let t77 = circuit_mul(t53, in17); let t78 = circuit_add(t76, t77); // Fp2 mul imag part end let t79 = circuit_sub(t75, in19); // Fp2 sub coeff 0/1 let t80 = circuit_sub(t78, in20); // Fp2 sub coeff 1/1 let t81 = circuit_sub(t79, t80); let t82 = circuit_mul(t81, in15); // eval bls line by yInv let t83 = circuit_sub(t50, t53); let t84 = circuit_mul(t83, in16); // eval blsline by xNegOverY let t85 = circuit_mul(t80, in15); // eval bls line by yInv let t86 = circuit_mul(t53, in16); // eval bls line by xNegOverY let t87 = circuit_mul(t84, t0); // Eval sparse poly line_2p_1 step coeff_2 * z^2 let t88 = circuit_add(t82, t87); // Eval sparse poly line_2p_1 step + coeff_2 * z^2 let t89 = circuit_add(t88, t1); // Eval sparse poly line_2p_1 step + 1*z^3 let t90 = circuit_mul(t85, t2); // Eval sparse poly line_2p_1 step coeff_6 * z^6 let t91 = circuit_add(t89, t90); // Eval sparse poly line_2p_1 step + coeff_6 * z^6 let t92 = circuit_mul(t86, t3); // Eval sparse poly line_2p_1 step coeff_8 * z^8 let t93 = circuit_add(t91, t92); // Eval sparse poly line_2p_1 step + coeff_8 * z^8 let t94 = circuit_mul(t32, t93); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t95 = circuit_sub(t94, in23); // (Π(i,k) (Pk(z))) - Ri(z) let t96 = circuit_mul(in25, in21); let t97 = circuit_add(t96, t95); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t61, t62, t71, t72, t97).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x6, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in2 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in3 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in8 circuit_inputs = circuit_inputs.next_2(yInv_1); // in9 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in14 circuit_inputs = circuit_inputs.next_2(yInv_2); // in15 circuit_inputs = circuit_inputs.next_2(xNegOverY_2); // in16 circuit_inputs = circuit_inputs.next_2(Q_2.x0); // in17 circuit_inputs = circuit_inputs.next_2(Q_2.x1); // in18 circuit_inputs = circuit_inputs.next_2(Q_2.y0); // in19 circuit_inputs = circuit_inputs.next_2(Q_2.y1); // in20 circuit_inputs = circuit_inputs.next_2(lhs_i); // in21 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in22 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in23 circuit_inputs = circuit_inputs.next_2(z); // in24 circuit_inputs = circuit_inputs.next_2(c1); // in25 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t61), x1: outputs.get_output(t62), y0: outputs.get_output(t71), y1: outputs.get_output(t72), }; let lhs_i_plus_one: u384 = outputs.get_output(t97); return (Q0, lhs_i_plus_one); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_BIT1_2P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, G2_line_add_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, G2_line_add_1: G2Line, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, c_or_cinv_of_z: u384, z: u384, c1: u384, ) -> (u384,) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let (in24, in25) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in24, in24); // compute z^2 let t1 = circuit_mul(t0, in24); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, t0); // compute z^8 let t4 = circuit_mul(in21, in21); // Square f evaluation in Z, the result of previous bit. let t5 = circuit_sub(in4, in5); let t6 = circuit_mul(t5, in0); // eval bls line by yInv let t7 = circuit_sub(in2, in3); let t8 = circuit_mul(t7, in1); // eval blsline by xNegOverY let t9 = circuit_mul(in5, in0); // eval bls line by yInv let t10 = circuit_mul(in3, in1); // eval bls line by xNegOverY let t11 = circuit_sub(in8, in9); let t12 = circuit_mul(t11, in0); // eval bls line by yInv let t13 = circuit_sub(in6, in7); let t14 = circuit_mul(t13, in1); // eval blsline by xNegOverY let t15 = circuit_mul(in9, in0); // eval bls line by yInv let t16 = circuit_mul(in7, in1); // eval bls line by xNegOverY let t17 = circuit_mul(t8, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 let t18 = circuit_add(t6, t17); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 let t19 = circuit_add(t18, t1); // Eval sparse poly line_0p_1 step + 1*z^3 let t20 = circuit_mul(t9, t2); // Eval sparse poly line_0p_1 step coeff_6 * z^6 let t21 = circuit_add(t19, t20); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 let t22 = circuit_mul(t10, t3); // Eval sparse poly line_0p_1 step coeff_8 * z^8 let t23 = circuit_add(t21, t22); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t24 = circuit_mul(t4, t23); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t25 = circuit_mul(t14, t0); // Eval sparse poly line_0p_2 step coeff_2 * z^2 let t26 = circuit_add(t12, t25); // Eval sparse poly line_0p_2 step + coeff_2 * z^2 let t27 = circuit_add(t26, t1); // Eval sparse poly line_0p_2 step + 1*z^3 let t28 = circuit_mul(t15, t2); // Eval sparse poly line_0p_2 step coeff_6 * z^6 let t29 = circuit_add(t27, t28); // Eval sparse poly line_0p_2 step + coeff_6 * z^6 let t30 = circuit_mul(t16, t3); // Eval sparse poly line_0p_2 step coeff_8 * z^8 let t31 = circuit_add(t29, t30); // Eval sparse poly line_0p_2 step + coeff_8 * z^8 let t32 = circuit_mul(t24, t31); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t33 = circuit_sub(in14, in15); let t34 = circuit_mul(t33, in10); // eval bls line by yInv let t35 = circuit_sub(in12, in13); let t36 = circuit_mul(t35, in11); // eval blsline by xNegOverY let t37 = circuit_mul(in15, in10); // eval bls line by yInv let t38 = circuit_mul(in13, in11); // eval bls line by xNegOverY let t39 = circuit_sub(in18, in19); let t40 = circuit_mul(t39, in10); // eval bls line by yInv let t41 = circuit_sub(in16, in17); let t42 = circuit_mul(t41, in11); // eval blsline by xNegOverY let t43 = circuit_mul(in19, in10); // eval bls line by yInv let t44 = circuit_mul(in17, in11); // eval bls line by xNegOverY let t45 = circuit_mul(t36, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 let t46 = circuit_add(t34, t45); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 let t47 = circuit_add(t46, t1); // Eval sparse poly line_1p_1 step + 1*z^3 let t48 = circuit_mul(t37, t2); // Eval sparse poly line_1p_1 step coeff_6 * z^6 let t49 = circuit_add(t47, t48); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 let t50 = circuit_mul(t38, t3); // Eval sparse poly line_1p_1 step coeff_8 * z^8 let t51 = circuit_add(t49, t50); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t52 = circuit_mul(t32, t51); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t53 = circuit_mul(t42, t0); // Eval sparse poly line_1p_2 step coeff_2 * z^2 let t54 = circuit_add(t40, t53); // Eval sparse poly line_1p_2 step + coeff_2 * z^2 let t55 = circuit_add(t54, t1); // Eval sparse poly line_1p_2 step + 1*z^3 let t56 = circuit_mul(t43, t2); // Eval sparse poly line_1p_2 step coeff_6 * z^6 let t57 = circuit_add(t55, t56); // Eval sparse poly line_1p_2 step + coeff_6 * z^6 let t58 = circuit_mul(t44, t3); // Eval sparse poly line_1p_2 step coeff_8 * z^8 let t59 = circuit_add(t57, t58); // Eval sparse poly line_1p_2 step + coeff_8 * z^8 let t60 = circuit_mul(t52, t59); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t61 = circuit_mul(t60, in23); let t62 = circuit_sub(t61, in22); // (Π(i,k) (Pk(z))) - Ri(z) let t63 = circuit_mul(in25, in20); let t64 = circuit_add(t63, t62); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t64,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in0 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in1 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in2 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in3 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_add_0.r0a0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_add_0.r0a1); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_add_0.r1a0); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_add_0.r1a1); // in9 circuit_inputs = circuit_inputs.next_2(yInv_1); // in10 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in15 circuit_inputs = circuit_inputs.next_2(G2_line_add_1.r0a0); // in16 circuit_inputs = circuit_inputs.next_2(G2_line_add_1.r0a1); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_add_1.r1a0); // in18 circuit_inputs = circuit_inputs.next_2(G2_line_add_1.r1a1); // in19 circuit_inputs = circuit_inputs.next_2(lhs_i); // in20 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in21 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in22 circuit_inputs = circuit_inputs.next_2(c_or_cinv_of_z); // in23 circuit_inputs = circuit_inputs.next_2(z); // in24 circuit_inputs = circuit_inputs.next_2(c1); // in25 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let lhs_i_plus_one: u384 = outputs.get_output(t64); return (lhs_i_plus_one,); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_BIT1_3P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, G2_line_add_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, G2_line_add_1: G2Line, yInv_2: u384, xNegOverY_2: u384, Q_2: G2Point, Q_or_Q_neg_2: G2Point, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, c_or_cinv_of_z: u384, z: u384, c1: u384, ) -> (G2Point, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8, in9) = (CE::> {}, CE::> {}, CE::> {}); let (in10, in11, in12) = (CE::> {}, CE::> {}, CE::> {}); let (in13, in14, in15) = (CE::> {}, CE::> {}, CE::> {}); let (in16, in17, in18) = (CE::> {}, CE::> {}, CE::> {}); let (in19, in20, in21) = (CE::> {}, CE::> {}, CE::> {}); let (in22, in23, in24) = (CE::> {}, CE::> {}, CE::> {}); let (in25, in26, in27) = (CE::> {}, CE::> {}, CE::> {}); let (in28, in29, in30) = (CE::> {}, CE::> {}, CE::> {}); let (in31, in32, in33) = (CE::> {}, CE::> {}, CE::> {}); let (in34, in35, in36) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_mul(in35, in35); // compute z^2 let t1 = circuit_mul(t0, in35); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, t0); // compute z^8 let t4 = circuit_mul(in32, in32); // Square f evaluation in Z, the result of previous bit. let t5 = circuit_sub(in5, in6); let t6 = circuit_mul(t5, in1); // eval bls line by yInv let t7 = circuit_sub(in3, in4); let t8 = circuit_mul(t7, in2); // eval blsline by xNegOverY let t9 = circuit_mul(in6, in1); // eval bls line by yInv let t10 = circuit_mul(in4, in2); // eval bls line by xNegOverY let t11 = circuit_sub(in9, in10); let t12 = circuit_mul(t11, in1); // eval bls line by yInv let t13 = circuit_sub(in7, in8); let t14 = circuit_mul(t13, in2); // eval blsline by xNegOverY let t15 = circuit_mul(in10, in1); // eval bls line by yInv let t16 = circuit_mul(in8, in2); // eval bls line by xNegOverY let t17 = circuit_mul(t8, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 let t18 = circuit_add(t6, t17); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 let t19 = circuit_add(t18, t1); // Eval sparse poly line_0p_1 step + 1*z^3 let t20 = circuit_mul(t9, t2); // Eval sparse poly line_0p_1 step coeff_6 * z^6 let t21 = circuit_add(t19, t20); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 let t22 = circuit_mul(t10, t3); // Eval sparse poly line_0p_1 step coeff_8 * z^8 let t23 = circuit_add(t21, t22); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t24 = circuit_mul(t4, t23); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t25 = circuit_mul(t14, t0); // Eval sparse poly line_0p_2 step coeff_2 * z^2 let t26 = circuit_add(t12, t25); // Eval sparse poly line_0p_2 step + coeff_2 * z^2 let t27 = circuit_add(t26, t1); // Eval sparse poly line_0p_2 step + 1*z^3 let t28 = circuit_mul(t15, t2); // Eval sparse poly line_0p_2 step coeff_6 * z^6 let t29 = circuit_add(t27, t28); // Eval sparse poly line_0p_2 step + coeff_6 * z^6 let t30 = circuit_mul(t16, t3); // Eval sparse poly line_0p_2 step coeff_8 * z^8 let t31 = circuit_add(t29, t30); // Eval sparse poly line_0p_2 step + coeff_8 * z^8 let t32 = circuit_mul(t24, t31); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t33 = circuit_sub(in15, in16); let t34 = circuit_mul(t33, in11); // eval bls line by yInv let t35 = circuit_sub(in13, in14); let t36 = circuit_mul(t35, in12); // eval blsline by xNegOverY let t37 = circuit_mul(in16, in11); // eval bls line by yInv let t38 = circuit_mul(in14, in12); // eval bls line by xNegOverY let t39 = circuit_sub(in19, in20); let t40 = circuit_mul(t39, in11); // eval bls line by yInv let t41 = circuit_sub(in17, in18); let t42 = circuit_mul(t41, in12); // eval blsline by xNegOverY let t43 = circuit_mul(in20, in11); // eval bls line by yInv let t44 = circuit_mul(in18, in12); // eval bls line by xNegOverY let t45 = circuit_mul(t36, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 let t46 = circuit_add(t34, t45); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 let t47 = circuit_add(t46, t1); // Eval sparse poly line_1p_1 step + 1*z^3 let t48 = circuit_mul(t37, t2); // Eval sparse poly line_1p_1 step coeff_6 * z^6 let t49 = circuit_add(t47, t48); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 let t50 = circuit_mul(t38, t3); // Eval sparse poly line_1p_1 step coeff_8 * z^8 let t51 = circuit_add(t49, t50); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t52 = circuit_mul(t32, t51); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t53 = circuit_mul(t42, t0); // Eval sparse poly line_1p_2 step coeff_2 * z^2 let t54 = circuit_add(t40, t53); // Eval sparse poly line_1p_2 step + coeff_2 * z^2 let t55 = circuit_add(t54, t1); // Eval sparse poly line_1p_2 step + 1*z^3 let t56 = circuit_mul(t43, t2); // Eval sparse poly line_1p_2 step coeff_6 * z^6 let t57 = circuit_add(t55, t56); // Eval sparse poly line_1p_2 step + coeff_6 * z^6 let t58 = circuit_mul(t44, t3); // Eval sparse poly line_1p_2 step coeff_8 * z^8 let t59 = circuit_add(t57, t58); // Eval sparse poly line_1p_2 step + coeff_8 * z^8 let t60 = circuit_mul(t52, t59); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t61 = circuit_sub(in25, in29); // Fp2 sub coeff 0/1 let t62 = circuit_sub(in26, in30); // Fp2 sub coeff 1/1 let t63 = circuit_sub(in23, in27); // Fp2 sub coeff 0/1 let t64 = circuit_sub(in24, in28); // Fp2 sub coeff 1/1 let t65 = circuit_mul(t63, t63); // Fp2 Inv start let t66 = circuit_mul(t64, t64); let t67 = circuit_add(t65, t66); let t68 = circuit_inverse(t67); let t69 = circuit_mul(t63, t68); // Fp2 Inv real part end let t70 = circuit_mul(t64, t68); let t71 = circuit_sub(in0, t70); // Fp2 Inv imag part end let t72 = circuit_mul(t61, t69); // Fp2 mul start let t73 = circuit_mul(t62, t71); let t74 = circuit_sub(t72, t73); // Fp2 mul real part end let t75 = circuit_mul(t61, t71); let t76 = circuit_mul(t62, t69); let t77 = circuit_add(t75, t76); // Fp2 mul imag part end let t78 = circuit_add(t74, t77); let t79 = circuit_sub(t74, t77); let t80 = circuit_mul(t78, t79); let t81 = circuit_mul(t74, t77); let t82 = circuit_add(t81, t81); let t83 = circuit_add(in23, in27); // Fp2 add coeff 0/1 let t84 = circuit_add(in24, in28); // Fp2 add coeff 1/1 let t85 = circuit_sub(t80, t83); // Fp2 sub coeff 0/1 let t86 = circuit_sub(t82, t84); // Fp2 sub coeff 1/1 let t87 = circuit_mul(t74, in23); // Fp2 mul start let t88 = circuit_mul(t77, in24); let t89 = circuit_sub(t87, t88); // Fp2 mul real part end let t90 = circuit_mul(t74, in24); let t91 = circuit_mul(t77, in23); let t92 = circuit_add(t90, t91); // Fp2 mul imag part end let t93 = circuit_sub(t89, in25); // Fp2 sub coeff 0/1 let t94 = circuit_sub(t92, in26); // Fp2 sub coeff 1/1 let t95 = circuit_add(in25, in25); // Fp2 add coeff 0/1 let t96 = circuit_add(in26, in26); // Fp2 add coeff 1/1 let t97 = circuit_sub(t85, in23); // Fp2 sub coeff 0/1 let t98 = circuit_sub(t86, in24); // Fp2 sub coeff 1/1 let t99 = circuit_mul(t97, t97); // Fp2 Inv start let t100 = circuit_mul(t98, t98); let t101 = circuit_add(t99, t100); let t102 = circuit_inverse(t101); let t103 = circuit_mul(t97, t102); // Fp2 Inv real part end let t104 = circuit_mul(t98, t102); let t105 = circuit_sub(in0, t104); // Fp2 Inv imag part end let t106 = circuit_mul(t95, t103); // Fp2 mul start let t107 = circuit_mul(t96, t105); let t108 = circuit_sub(t106, t107); // Fp2 mul real part end let t109 = circuit_mul(t95, t105); let t110 = circuit_mul(t96, t103); let t111 = circuit_add(t109, t110); // Fp2 mul imag part end let t112 = circuit_add(t74, t108); // Fp2 add coeff 0/1 let t113 = circuit_add(t77, t111); // Fp2 add coeff 1/1 let t114 = circuit_sub(in0, t112); // Fp2 neg coeff 0/1 let t115 = circuit_sub(in0, t113); // Fp2 neg coeff 1/1 let t116 = circuit_add(t114, t115); let t117 = circuit_sub(t114, t115); let t118 = circuit_mul(t116, t117); let t119 = circuit_mul(t114, t115); let t120 = circuit_add(t119, t119); let t121 = circuit_sub(t118, in23); // Fp2 sub coeff 0/1 let t122 = circuit_sub(t120, in24); // Fp2 sub coeff 1/1 let t123 = circuit_sub(t121, t85); // Fp2 sub coeff 0/1 let t124 = circuit_sub(t122, t86); // Fp2 sub coeff 1/1 let t125 = circuit_sub(in23, t123); // Fp2 sub coeff 0/1 let t126 = circuit_sub(in24, t124); // Fp2 sub coeff 1/1 let t127 = circuit_mul(t114, t125); // Fp2 mul start let t128 = circuit_mul(t115, t126); let t129 = circuit_sub(t127, t128); // Fp2 mul real part end let t130 = circuit_mul(t114, t126); let t131 = circuit_mul(t115, t125); let t132 = circuit_add(t130, t131); // Fp2 mul imag part end let t133 = circuit_sub(t129, in25); // Fp2 sub coeff 0/1 let t134 = circuit_sub(t132, in26); // Fp2 sub coeff 1/1 let t135 = circuit_mul(t114, in23); // Fp2 mul start let t136 = circuit_mul(t115, in24); let t137 = circuit_sub(t135, t136); // Fp2 mul real part end let t138 = circuit_mul(t114, in24); let t139 = circuit_mul(t115, in23); let t140 = circuit_add(t138, t139); // Fp2 mul imag part end let t141 = circuit_sub(t137, in25); // Fp2 sub coeff 0/1 let t142 = circuit_sub(t140, in26); // Fp2 sub coeff 1/1 let t143 = circuit_sub(t93, t94); let t144 = circuit_mul(t143, in21); // eval bls line by yInv let t145 = circuit_sub(t74, t77); let t146 = circuit_mul(t145, in22); // eval blsline by xNegOverY let t147 = circuit_mul(t94, in21); // eval bls line by yInv let t148 = circuit_mul(t77, in22); // eval bls line by xNegOverY let t149 = circuit_sub(t141, t142); let t150 = circuit_mul(t149, in21); // eval bls line by yInv let t151 = circuit_sub(t114, t115); let t152 = circuit_mul(t151, in22); // eval blsline by xNegOverY let t153 = circuit_mul(t142, in21); // eval bls line by yInv let t154 = circuit_mul(t115, in22); // eval bls line by xNegOverY let t155 = circuit_mul(t146, t0); // Eval sparse poly line_2p_1 step coeff_2 * z^2 let t156 = circuit_add(t144, t155); // Eval sparse poly line_2p_1 step + coeff_2 * z^2 let t157 = circuit_add(t156, t1); // Eval sparse poly line_2p_1 step + 1*z^3 let t158 = circuit_mul(t147, t2); // Eval sparse poly line_2p_1 step coeff_6 * z^6 let t159 = circuit_add(t157, t158); // Eval sparse poly line_2p_1 step + coeff_6 * z^6 let t160 = circuit_mul(t148, t3); // Eval sparse poly line_2p_1 step coeff_8 * z^8 let t161 = circuit_add(t159, t160); // Eval sparse poly line_2p_1 step + coeff_8 * z^8 let t162 = circuit_mul(t60, t161); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t163 = circuit_mul(t152, t0); // Eval sparse poly line_2p_2 step coeff_2 * z^2 let t164 = circuit_add(t150, t163); // Eval sparse poly line_2p_2 step + coeff_2 * z^2 let t165 = circuit_add(t164, t1); // Eval sparse poly line_2p_2 step + 1*z^3 let t166 = circuit_mul(t153, t2); // Eval sparse poly line_2p_2 step coeff_6 * z^6 let t167 = circuit_add(t165, t166); // Eval sparse poly line_2p_2 step + coeff_6 * z^6 let t168 = circuit_mul(t154, t3); // Eval sparse poly line_2p_2 step coeff_8 * z^8 let t169 = circuit_add(t167, t168); // Eval sparse poly line_2p_2 step + coeff_8 * z^8 let t170 = circuit_mul(t162, t169); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t171 = circuit_mul(t170, in34); let t172 = circuit_sub(t171, in33); // (Π(i,k) (Pk(z))) - Ri(z) let t173 = circuit_mul(in36, in31); let t174 = circuit_add(t173, t172); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t123, t124, t133, t134, t174).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in1 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in2 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in3 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_add_0.r0a0); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_add_0.r0a1); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_add_0.r1a0); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_add_0.r1a1); // in10 circuit_inputs = circuit_inputs.next_2(yInv_1); // in11 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in15 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in16 circuit_inputs = circuit_inputs.next_2(G2_line_add_1.r0a0); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_add_1.r0a1); // in18 circuit_inputs = circuit_inputs.next_2(G2_line_add_1.r1a0); // in19 circuit_inputs = circuit_inputs.next_2(G2_line_add_1.r1a1); // in20 circuit_inputs = circuit_inputs.next_2(yInv_2); // in21 circuit_inputs = circuit_inputs.next_2(xNegOverY_2); // in22 circuit_inputs = circuit_inputs.next_2(Q_2.x0); // in23 circuit_inputs = circuit_inputs.next_2(Q_2.x1); // in24 circuit_inputs = circuit_inputs.next_2(Q_2.y0); // in25 circuit_inputs = circuit_inputs.next_2(Q_2.y1); // in26 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.x0); // in27 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.x1); // in28 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.y0); // in29 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.y1); // in30 circuit_inputs = circuit_inputs.next_2(lhs_i); // in31 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in32 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in33 circuit_inputs = circuit_inputs.next_2(c_or_cinv_of_z); // in34 circuit_inputs = circuit_inputs.next_2(z); // in35 circuit_inputs = circuit_inputs.next_2(c1); // in36 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t123), x1: outputs.get_output(t124), y0: outputs.get_output(t133), y1: outputs.get_output(t134), }; let lhs_i_plus_one: u384 = outputs.get_output(t174); return (Q0, lhs_i_plus_one); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_FINALIZE_2P_circuit( R_n_minus_1_of_z: u384, c_1: u384, w_of_z: u384, z: u384, c_inv_frob_1_of_z: u384, previous_lhs: u384, R_n_minus_2: E12D, Q: Array, ) -> (u384,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x2 let in2 = CE::> {}; // -0x2 % p // INPUT stack let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let (in24, in25, in26) = (CE::> {}, CE::> {}, CE::> {}); let (in27, in28, in29) = (CE::> {}, CE::> {}, CE::> {}); let (in30, in31, in32) = (CE::> {}, CE::> {}, CE::> {}); let (in33, in34, in35) = (CE::> {}, CE::> {}, CE::> {}); let (in36, in37, in38) = (CE::> {}, CE::> {}, CE::> {}); let (in39, in40, in41) = (CE::> {}, CE::> {}, CE::> {}); let (in42, in43, in44) = (CE::> {}, CE::> {}, CE::> {}); let (in45, in46, in47) = (CE::> {}, CE::> {}, CE::> {}); let (in48, in49, in50) = (CE::> {}, CE::> {}, CE::> {}); let (in51, in52, in53) = (CE::> {}, CE::> {}, CE::> {}); let (in54, in55, in56) = (CE::> {}, CE::> {}, CE::> {}); let (in57, in58, in59) = (CE::> {}, CE::> {}, CE::> {}); let (in60, in61, in62) = (CE::> {}, CE::> {}, CE::> {}); let (in63, in64, in65) = (CE::> {}, CE::> {}, CE::> {}); let (in66, in67, in68) = (CE::> {}, CE::> {}, CE::> {}); let (in69, in70, in71) = (CE::> {}, CE::> {}, CE::> {}); let (in72, in73, in74) = (CE::> {}, CE::> {}, CE::> {}); let (in75, in76, in77) = (CE::> {}, CE::> {}, CE::> {}); let (in78, in79, in80) = (CE::> {}, CE::> {}, CE::> {}); let (in81, in82, in83) = (CE::> {}, CE::> {}, CE::> {}); let (in84, in85, in86) = (CE::> {}, CE::> {}, CE::> {}); let (in87, in88, in89) = (CE::> {}, CE::> {}, CE::> {}); let (in90, in91, in92) = (CE::> {}, CE::> {}, CE::> {}); let (in93, in94, in95) = (CE::> {}, CE::> {}, CE::> {}); let (in96, in97, in98) = (CE::> {}, CE::> {}, CE::> {}); let (in99, in100, in101) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_mul(in6, in6); // Compute z^2 let t1 = circuit_mul(t0, in6); // Compute z^3 let t2 = circuit_mul(t1, in6); // Compute z^4 let t3 = circuit_mul(t2, in6); // Compute z^5 let t4 = circuit_mul(t3, in6); // Compute z^6 let t5 = circuit_mul(t4, in6); // Compute z^7 let t6 = circuit_mul(t5, in6); // Compute z^8 let t7 = circuit_mul(t6, in6); // Compute z^9 let t8 = circuit_mul(t7, in6); // Compute z^10 let t9 = circuit_mul(t8, in6); // Compute z^11 let t10 = circuit_mul(t9, in6); // Compute z^12 let t11 = circuit_sub(in0, in10); let t12 = circuit_sub(in0, in12); let t13 = circuit_sub(in0, in14); let t14 = circuit_sub(in0, in16); let t15 = circuit_sub(in0, in18); let t16 = circuit_sub(in0, in20); let t17 = circuit_mul(t11, in6); // Eval R_n_minus_2_conjugate step coeff_1 * z^1 let t18 = circuit_add(in9, t17); // Eval R_n_minus_2_conjugate step + (coeff_1 * z^1) let t19 = circuit_mul(in11, t0); // Eval R_n_minus_2_conjugate step coeff_2 * z^2 let t20 = circuit_add(t18, t19); // Eval R_n_minus_2_conjugate step + (coeff_2 * z^2) let t21 = circuit_mul(t12, t1); // Eval R_n_minus_2_conjugate step coeff_3 * z^3 let t22 = circuit_add(t20, t21); // Eval R_n_minus_2_conjugate step + (coeff_3 * z^3) let t23 = circuit_mul(in13, t2); // Eval R_n_minus_2_conjugate step coeff_4 * z^4 let t24 = circuit_add(t22, t23); // Eval R_n_minus_2_conjugate step + (coeff_4 * z^4) let t25 = circuit_mul(t13, t3); // Eval R_n_minus_2_conjugate step coeff_5 * z^5 let t26 = circuit_add(t24, t25); // Eval R_n_minus_2_conjugate step + (coeff_5 * z^5) let t27 = circuit_mul(in15, t4); // Eval R_n_minus_2_conjugate step coeff_6 * z^6 let t28 = circuit_add(t26, t27); // Eval R_n_minus_2_conjugate step + (coeff_6 * z^6) let t29 = circuit_mul(t14, t5); // Eval R_n_minus_2_conjugate step coeff_7 * z^7 let t30 = circuit_add(t28, t29); // Eval R_n_minus_2_conjugate step + (coeff_7 * z^7) let t31 = circuit_mul(in17, t6); // Eval R_n_minus_2_conjugate step coeff_8 * z^8 let t32 = circuit_add(t30, t31); // Eval R_n_minus_2_conjugate step + (coeff_8 * z^8) let t33 = circuit_mul(t15, t7); // Eval R_n_minus_2_conjugate step coeff_9 * z^9 let t34 = circuit_add(t32, t33); // Eval R_n_minus_2_conjugate step + (coeff_9 * z^9) let t35 = circuit_mul(in19, t8); // Eval R_n_minus_2_conjugate step coeff_10 * z^10 let t36 = circuit_add(t34, t35); // Eval R_n_minus_2_conjugate step + (coeff_10 * z^10) let t37 = circuit_mul(t16, t9); // Eval R_n_minus_2_conjugate step coeff_11 * z^11 let t38 = circuit_add(t36, t37); // Eval R_n_minus_2_conjugate step + (coeff_11 * z^11) let t39 = circuit_mul(t38, in7); let t40 = circuit_mul(t39, in5); let t41 = circuit_sub(t40, in3); // (Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) let t42 = circuit_mul(in4, in8); let t43 = circuit_add(t42, t41); // c_1 * previous_lhs + lhs_n_minus_1 let t44 = circuit_mul(in2, t4); // Eval sparse poly P_irr step coeff_6 * z^6 let t45 = circuit_add(in1, t44); // Eval sparse poly P_irr step + coeff_6 * z^6 let t46 = circuit_add(t45, t10); // Eval sparse poly P_irr step + 1*z^12 let t47 = circuit_mul(in101, in6); // Eval big_Q Horner step: multiply by z let t48 = circuit_add(in100, t47); // Eval big_Q Horner step: add coefficient_79 let t49 = circuit_mul(t48, in6); // Eval big_Q Horner step: multiply by z let t50 = circuit_add(in99, t49); // Eval big_Q Horner step: add coefficient_78 let t51 = circuit_mul(t50, in6); // Eval big_Q Horner step: multiply by z let t52 = circuit_add(in98, t51); // Eval big_Q Horner step: add coefficient_77 let t53 = circuit_mul(t52, in6); // Eval big_Q Horner step: multiply by z let t54 = circuit_add(in97, t53); // Eval big_Q Horner step: add coefficient_76 let t55 = circuit_mul(t54, in6); // Eval big_Q Horner step: multiply by z let t56 = circuit_add(in96, t55); // Eval big_Q Horner step: add coefficient_75 let t57 = circuit_mul(t56, in6); // Eval big_Q Horner step: multiply by z let t58 = circuit_add(in95, t57); // Eval big_Q Horner step: add coefficient_74 let t59 = circuit_mul(t58, in6); // Eval big_Q Horner step: multiply by z let t60 = circuit_add(in94, t59); // Eval big_Q Horner step: add coefficient_73 let t61 = circuit_mul(t60, in6); // Eval big_Q Horner step: multiply by z let t62 = circuit_add(in93, t61); // Eval big_Q Horner step: add coefficient_72 let t63 = circuit_mul(t62, in6); // Eval big_Q Horner step: multiply by z let t64 = circuit_add(in92, t63); // Eval big_Q Horner step: add coefficient_71 let t65 = circuit_mul(t64, in6); // Eval big_Q Horner step: multiply by z let t66 = circuit_add(in91, t65); // Eval big_Q Horner step: add coefficient_70 let t67 = circuit_mul(t66, in6); // Eval big_Q Horner step: multiply by z let t68 = circuit_add(in90, t67); // Eval big_Q Horner step: add coefficient_69 let t69 = circuit_mul(t68, in6); // Eval big_Q Horner step: multiply by z let t70 = circuit_add(in89, t69); // Eval big_Q Horner step: add coefficient_68 let t71 = circuit_mul(t70, in6); // Eval big_Q Horner step: multiply by z let t72 = circuit_add(in88, t71); // Eval big_Q Horner step: add coefficient_67 let t73 = circuit_mul(t72, in6); // Eval big_Q Horner step: multiply by z let t74 = circuit_add(in87, t73); // Eval big_Q Horner step: add coefficient_66 let t75 = circuit_mul(t74, in6); // Eval big_Q Horner step: multiply by z let t76 = circuit_add(in86, t75); // Eval big_Q Horner step: add coefficient_65 let t77 = circuit_mul(t76, in6); // Eval big_Q Horner step: multiply by z let t78 = circuit_add(in85, t77); // Eval big_Q Horner step: add coefficient_64 let t79 = circuit_mul(t78, in6); // Eval big_Q Horner step: multiply by z let t80 = circuit_add(in84, t79); // Eval big_Q Horner step: add coefficient_63 let t81 = circuit_mul(t80, in6); // Eval big_Q Horner step: multiply by z let t82 = circuit_add(in83, t81); // Eval big_Q Horner step: add coefficient_62 let t83 = circuit_mul(t82, in6); // Eval big_Q Horner step: multiply by z let t84 = circuit_add(in82, t83); // Eval big_Q Horner step: add coefficient_61 let t85 = circuit_mul(t84, in6); // Eval big_Q Horner step: multiply by z let t86 = circuit_add(in81, t85); // Eval big_Q Horner step: add coefficient_60 let t87 = circuit_mul(t86, in6); // Eval big_Q Horner step: multiply by z let t88 = circuit_add(in80, t87); // Eval big_Q Horner step: add coefficient_59 let t89 = circuit_mul(t88, in6); // Eval big_Q Horner step: multiply by z let t90 = circuit_add(in79, t89); // Eval big_Q Horner step: add coefficient_58 let t91 = circuit_mul(t90, in6); // Eval big_Q Horner step: multiply by z let t92 = circuit_add(in78, t91); // Eval big_Q Horner step: add coefficient_57 let t93 = circuit_mul(t92, in6); // Eval big_Q Horner step: multiply by z let t94 = circuit_add(in77, t93); // Eval big_Q Horner step: add coefficient_56 let t95 = circuit_mul(t94, in6); // Eval big_Q Horner step: multiply by z let t96 = circuit_add(in76, t95); // Eval big_Q Horner step: add coefficient_55 let t97 = circuit_mul(t96, in6); // Eval big_Q Horner step: multiply by z let t98 = circuit_add(in75, t97); // Eval big_Q Horner step: add coefficient_54 let t99 = circuit_mul(t98, in6); // Eval big_Q Horner step: multiply by z let t100 = circuit_add(in74, t99); // Eval big_Q Horner step: add coefficient_53 let t101 = circuit_mul(t100, in6); // Eval big_Q Horner step: multiply by z let t102 = circuit_add(in73, t101); // Eval big_Q Horner step: add coefficient_52 let t103 = circuit_mul(t102, in6); // Eval big_Q Horner step: multiply by z let t104 = circuit_add(in72, t103); // Eval big_Q Horner step: add coefficient_51 let t105 = circuit_mul(t104, in6); // Eval big_Q Horner step: multiply by z let t106 = circuit_add(in71, t105); // Eval big_Q Horner step: add coefficient_50 let t107 = circuit_mul(t106, in6); // Eval big_Q Horner step: multiply by z let t108 = circuit_add(in70, t107); // Eval big_Q Horner step: add coefficient_49 let t109 = circuit_mul(t108, in6); // Eval big_Q Horner step: multiply by z let t110 = circuit_add(in69, t109); // Eval big_Q Horner step: add coefficient_48 let t111 = circuit_mul(t110, in6); // Eval big_Q Horner step: multiply by z let t112 = circuit_add(in68, t111); // Eval big_Q Horner step: add coefficient_47 let t113 = circuit_mul(t112, in6); // Eval big_Q Horner step: multiply by z let t114 = circuit_add(in67, t113); // Eval big_Q Horner step: add coefficient_46 let t115 = circuit_mul(t114, in6); // Eval big_Q Horner step: multiply by z let t116 = circuit_add(in66, t115); // Eval big_Q Horner step: add coefficient_45 let t117 = circuit_mul(t116, in6); // Eval big_Q Horner step: multiply by z let t118 = circuit_add(in65, t117); // Eval big_Q Horner step: add coefficient_44 let t119 = circuit_mul(t118, in6); // Eval big_Q Horner step: multiply by z let t120 = circuit_add(in64, t119); // Eval big_Q Horner step: add coefficient_43 let t121 = circuit_mul(t120, in6); // Eval big_Q Horner step: multiply by z let t122 = circuit_add(in63, t121); // Eval big_Q Horner step: add coefficient_42 let t123 = circuit_mul(t122, in6); // Eval big_Q Horner step: multiply by z let t124 = circuit_add(in62, t123); // Eval big_Q Horner step: add coefficient_41 let t125 = circuit_mul(t124, in6); // Eval big_Q Horner step: multiply by z let t126 = circuit_add(in61, t125); // Eval big_Q Horner step: add coefficient_40 let t127 = circuit_mul(t126, in6); // Eval big_Q Horner step: multiply by z let t128 = circuit_add(in60, t127); // Eval big_Q Horner step: add coefficient_39 let t129 = circuit_mul(t128, in6); // Eval big_Q Horner step: multiply by z let t130 = circuit_add(in59, t129); // Eval big_Q Horner step: add coefficient_38 let t131 = circuit_mul(t130, in6); // Eval big_Q Horner step: multiply by z let t132 = circuit_add(in58, t131); // Eval big_Q Horner step: add coefficient_37 let t133 = circuit_mul(t132, in6); // Eval big_Q Horner step: multiply by z let t134 = circuit_add(in57, t133); // Eval big_Q Horner step: add coefficient_36 let t135 = circuit_mul(t134, in6); // Eval big_Q Horner step: multiply by z let t136 = circuit_add(in56, t135); // Eval big_Q Horner step: add coefficient_35 let t137 = circuit_mul(t136, in6); // Eval big_Q Horner step: multiply by z let t138 = circuit_add(in55, t137); // Eval big_Q Horner step: add coefficient_34 let t139 = circuit_mul(t138, in6); // Eval big_Q Horner step: multiply by z let t140 = circuit_add(in54, t139); // Eval big_Q Horner step: add coefficient_33 let t141 = circuit_mul(t140, in6); // Eval big_Q Horner step: multiply by z let t142 = circuit_add(in53, t141); // Eval big_Q Horner step: add coefficient_32 let t143 = circuit_mul(t142, in6); // Eval big_Q Horner step: multiply by z let t144 = circuit_add(in52, t143); // Eval big_Q Horner step: add coefficient_31 let t145 = circuit_mul(t144, in6); // Eval big_Q Horner step: multiply by z let t146 = circuit_add(in51, t145); // Eval big_Q Horner step: add coefficient_30 let t147 = circuit_mul(t146, in6); // Eval big_Q Horner step: multiply by z let t148 = circuit_add(in50, t147); // Eval big_Q Horner step: add coefficient_29 let t149 = circuit_mul(t148, in6); // Eval big_Q Horner step: multiply by z let t150 = circuit_add(in49, t149); // Eval big_Q Horner step: add coefficient_28 let t151 = circuit_mul(t150, in6); // Eval big_Q Horner step: multiply by z let t152 = circuit_add(in48, t151); // Eval big_Q Horner step: add coefficient_27 let t153 = circuit_mul(t152, in6); // Eval big_Q Horner step: multiply by z let t154 = circuit_add(in47, t153); // Eval big_Q Horner step: add coefficient_26 let t155 = circuit_mul(t154, in6); // Eval big_Q Horner step: multiply by z let t156 = circuit_add(in46, t155); // Eval big_Q Horner step: add coefficient_25 let t157 = circuit_mul(t156, in6); // Eval big_Q Horner step: multiply by z let t158 = circuit_add(in45, t157); // Eval big_Q Horner step: add coefficient_24 let t159 = circuit_mul(t158, in6); // Eval big_Q Horner step: multiply by z let t160 = circuit_add(in44, t159); // Eval big_Q Horner step: add coefficient_23 let t161 = circuit_mul(t160, in6); // Eval big_Q Horner step: multiply by z let t162 = circuit_add(in43, t161); // Eval big_Q Horner step: add coefficient_22 let t163 = circuit_mul(t162, in6); // Eval big_Q Horner step: multiply by z let t164 = circuit_add(in42, t163); // Eval big_Q Horner step: add coefficient_21 let t165 = circuit_mul(t164, in6); // Eval big_Q Horner step: multiply by z let t166 = circuit_add(in41, t165); // Eval big_Q Horner step: add coefficient_20 let t167 = circuit_mul(t166, in6); // Eval big_Q Horner step: multiply by z let t168 = circuit_add(in40, t167); // Eval big_Q Horner step: add coefficient_19 let t169 = circuit_mul(t168, in6); // Eval big_Q Horner step: multiply by z let t170 = circuit_add(in39, t169); // Eval big_Q Horner step: add coefficient_18 let t171 = circuit_mul(t170, in6); // Eval big_Q Horner step: multiply by z let t172 = circuit_add(in38, t171); // Eval big_Q Horner step: add coefficient_17 let t173 = circuit_mul(t172, in6); // Eval big_Q Horner step: multiply by z let t174 = circuit_add(in37, t173); // Eval big_Q Horner step: add coefficient_16 let t175 = circuit_mul(t174, in6); // Eval big_Q Horner step: multiply by z let t176 = circuit_add(in36, t175); // Eval big_Q Horner step: add coefficient_15 let t177 = circuit_mul(t176, in6); // Eval big_Q Horner step: multiply by z let t178 = circuit_add(in35, t177); // Eval big_Q Horner step: add coefficient_14 let t179 = circuit_mul(t178, in6); // Eval big_Q Horner step: multiply by z let t180 = circuit_add(in34, t179); // Eval big_Q Horner step: add coefficient_13 let t181 = circuit_mul(t180, in6); // Eval big_Q Horner step: multiply by z let t182 = circuit_add(in33, t181); // Eval big_Q Horner step: add coefficient_12 let t183 = circuit_mul(t182, in6); // Eval big_Q Horner step: multiply by z let t184 = circuit_add(in32, t183); // Eval big_Q Horner step: add coefficient_11 let t185 = circuit_mul(t184, in6); // Eval big_Q Horner step: multiply by z let t186 = circuit_add(in31, t185); // Eval big_Q Horner step: add coefficient_10 let t187 = circuit_mul(t186, in6); // Eval big_Q Horner step: multiply by z let t188 = circuit_add(in30, t187); // Eval big_Q Horner step: add coefficient_9 let t189 = circuit_mul(t188, in6); // Eval big_Q Horner step: multiply by z let t190 = circuit_add(in29, t189); // Eval big_Q Horner step: add coefficient_8 let t191 = circuit_mul(t190, in6); // Eval big_Q Horner step: multiply by z let t192 = circuit_add(in28, t191); // Eval big_Q Horner step: add coefficient_7 let t193 = circuit_mul(t192, in6); // Eval big_Q Horner step: multiply by z let t194 = circuit_add(in27, t193); // Eval big_Q Horner step: add coefficient_6 let t195 = circuit_mul(t194, in6); // Eval big_Q Horner step: multiply by z let t196 = circuit_add(in26, t195); // Eval big_Q Horner step: add coefficient_5 let t197 = circuit_mul(t196, in6); // Eval big_Q Horner step: multiply by z let t198 = circuit_add(in25, t197); // Eval big_Q Horner step: add coefficient_4 let t199 = circuit_mul(t198, in6); // Eval big_Q Horner step: multiply by z let t200 = circuit_add(in24, t199); // Eval big_Q Horner step: add coefficient_3 let t201 = circuit_mul(t200, in6); // Eval big_Q Horner step: multiply by z let t202 = circuit_add(in23, t201); // Eval big_Q Horner step: add coefficient_2 let t203 = circuit_mul(t202, in6); // Eval big_Q Horner step: multiply by z let t204 = circuit_add(in22, t203); // Eval big_Q Horner step: add coefficient_1 let t205 = circuit_mul(t204, in6); // Eval big_Q Horner step: multiply by z let t206 = circuit_add(in21, t205); // Eval big_Q Horner step: add coefficient_0 let t207 = circuit_mul(t206, t46); // Q(z) * P(z) let t208 = circuit_sub(t43, t207); // final_lhs - Q(z) * P(z) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t208,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x2, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs .next_2( [ 0xb153ffffb9feffffffffaaa9, 0x6730d2a0f6b0f6241eabfffe, 0x434bacd764774b84f38512bf, 0x1a0111ea397fe69a4b1ba7b6, ], ); // in2 // Fill inputs: circuit_inputs = circuit_inputs.next_2(R_n_minus_1_of_z); // in3 circuit_inputs = circuit_inputs.next_2(c_1); // in4 circuit_inputs = circuit_inputs.next_2(w_of_z); // in5 circuit_inputs = circuit_inputs.next_2(z); // in6 circuit_inputs = circuit_inputs.next_2(c_inv_frob_1_of_z); // in7 circuit_inputs = circuit_inputs.next_2(previous_lhs); // in8 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w0); // in9 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w1); // in10 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w2); // in11 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w3); // in12 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w4); // in13 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w5); // in14 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w6); // in15 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w7); // in16 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w8); // in17 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w9); // in18 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w10); // in19 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w11); // in20 for val in Q.span() { circuit_inputs = circuit_inputs.next_2(*val); } // in21 - in101 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let final_check: u384 = outputs.get_output(t208); return (final_check,); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_FINALIZE_3P_EXT_MLR_circuit( R_n_minus_1_of_z: u384, c_1: u384, w_of_z: u384, z: u384, c_inv_frob_1_of_z: u384, previous_lhs: u384, R_n_minus_2: E12D, Q: Array, precomputed_miller_loop_result_of_z: u384, ) -> (u384,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x2 let in2 = CE::> {}; // -0x2 % p // INPUT stack let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let (in24, in25, in26) = (CE::> {}, CE::> {}, CE::> {}); let (in27, in28, in29) = (CE::> {}, CE::> {}, CE::> {}); let (in30, in31, in32) = (CE::> {}, CE::> {}, CE::> {}); let (in33, in34, in35) = (CE::> {}, CE::> {}, CE::> {}); let (in36, in37, in38) = (CE::> {}, CE::> {}, CE::> {}); let (in39, in40, in41) = (CE::> {}, CE::> {}, CE::> {}); let (in42, in43, in44) = (CE::> {}, CE::> {}, CE::> {}); let (in45, in46, in47) = (CE::> {}, CE::> {}, CE::> {}); let (in48, in49, in50) = (CE::> {}, CE::> {}, CE::> {}); let (in51, in52, in53) = (CE::> {}, CE::> {}, CE::> {}); let (in54, in55, in56) = (CE::> {}, CE::> {}, CE::> {}); let (in57, in58, in59) = (CE::> {}, CE::> {}, CE::> {}); let (in60, in61, in62) = (CE::> {}, CE::> {}, CE::> {}); let (in63, in64, in65) = (CE::> {}, CE::> {}, CE::> {}); let (in66, in67, in68) = (CE::> {}, CE::> {}, CE::> {}); let (in69, in70, in71) = (CE::> {}, CE::> {}, CE::> {}); let (in72, in73, in74) = (CE::> {}, CE::> {}, CE::> {}); let (in75, in76, in77) = (CE::> {}, CE::> {}, CE::> {}); let (in78, in79, in80) = (CE::> {}, CE::> {}, CE::> {}); let (in81, in82, in83) = (CE::> {}, CE::> {}, CE::> {}); let (in84, in85, in86) = (CE::> {}, CE::> {}, CE::> {}); let (in87, in88, in89) = (CE::> {}, CE::> {}, CE::> {}); let (in90, in91, in92) = (CE::> {}, CE::> {}, CE::> {}); let (in93, in94, in95) = (CE::> {}, CE::> {}, CE::> {}); let (in96, in97, in98) = (CE::> {}, CE::> {}, CE::> {}); let (in99, in100, in101) = (CE::> {}, CE::> {}, CE::> {}); let (in102, in103, in104) = (CE::> {}, CE::> {}, CE::> {}); let (in105, in106, in107) = (CE::> {}, CE::> {}, CE::> {}); let (in108, in109, in110) = (CE::> {}, CE::> {}, CE::> {}); let (in111, in112, in113) = (CE::> {}, CE::> {}, CE::> {}); let (in114, in115, in116) = (CE::> {}, CE::> {}, CE::> {}); let (in117, in118, in119) = (CE::> {}, CE::> {}, CE::> {}); let (in120, in121, in122) = (CE::> {}, CE::> {}, CE::> {}); let (in123, in124, in125) = (CE::> {}, CE::> {}, CE::> {}); let in126 = CE::> {}; let t0 = circuit_mul(in6, in6); // Compute z^2 let t1 = circuit_mul(t0, in6); // Compute z^3 let t2 = circuit_mul(t1, in6); // Compute z^4 let t3 = circuit_mul(t2, in6); // Compute z^5 let t4 = circuit_mul(t3, in6); // Compute z^6 let t5 = circuit_mul(t4, in6); // Compute z^7 let t6 = circuit_mul(t5, in6); // Compute z^8 let t7 = circuit_mul(t6, in6); // Compute z^9 let t8 = circuit_mul(t7, in6); // Compute z^10 let t9 = circuit_mul(t8, in6); // Compute z^11 let t10 = circuit_mul(t9, in6); // Compute z^12 let t11 = circuit_sub(in0, in10); let t12 = circuit_sub(in0, in12); let t13 = circuit_sub(in0, in14); let t14 = circuit_sub(in0, in16); let t15 = circuit_sub(in0, in18); let t16 = circuit_sub(in0, in20); let t17 = circuit_mul(t11, in6); // Eval R_n_minus_2_conjugate step coeff_1 * z^1 let t18 = circuit_add(in9, t17); // Eval R_n_minus_2_conjugate step + (coeff_1 * z^1) let t19 = circuit_mul(in11, t0); // Eval R_n_minus_2_conjugate step coeff_2 * z^2 let t20 = circuit_add(t18, t19); // Eval R_n_minus_2_conjugate step + (coeff_2 * z^2) let t21 = circuit_mul(t12, t1); // Eval R_n_minus_2_conjugate step coeff_3 * z^3 let t22 = circuit_add(t20, t21); // Eval R_n_minus_2_conjugate step + (coeff_3 * z^3) let t23 = circuit_mul(in13, t2); // Eval R_n_minus_2_conjugate step coeff_4 * z^4 let t24 = circuit_add(t22, t23); // Eval R_n_minus_2_conjugate step + (coeff_4 * z^4) let t25 = circuit_mul(t13, t3); // Eval R_n_minus_2_conjugate step coeff_5 * z^5 let t26 = circuit_add(t24, t25); // Eval R_n_minus_2_conjugate step + (coeff_5 * z^5) let t27 = circuit_mul(in15, t4); // Eval R_n_minus_2_conjugate step coeff_6 * z^6 let t28 = circuit_add(t26, t27); // Eval R_n_minus_2_conjugate step + (coeff_6 * z^6) let t29 = circuit_mul(t14, t5); // Eval R_n_minus_2_conjugate step coeff_7 * z^7 let t30 = circuit_add(t28, t29); // Eval R_n_minus_2_conjugate step + (coeff_7 * z^7) let t31 = circuit_mul(in17, t6); // Eval R_n_minus_2_conjugate step coeff_8 * z^8 let t32 = circuit_add(t30, t31); // Eval R_n_minus_2_conjugate step + (coeff_8 * z^8) let t33 = circuit_mul(t15, t7); // Eval R_n_minus_2_conjugate step coeff_9 * z^9 let t34 = circuit_add(t32, t33); // Eval R_n_minus_2_conjugate step + (coeff_9 * z^9) let t35 = circuit_mul(in19, t8); // Eval R_n_minus_2_conjugate step coeff_10 * z^10 let t36 = circuit_add(t34, t35); // Eval R_n_minus_2_conjugate step + (coeff_10 * z^10) let t37 = circuit_mul(t16, t9); // Eval R_n_minus_2_conjugate step coeff_11 * z^11 let t38 = circuit_add(t36, t37); // Eval R_n_minus_2_conjugate step + (coeff_11 * z^11) let t39 = circuit_mul(t38, in7); let t40 = circuit_mul(t39, in5); let t41 = circuit_mul(t40, in126); let t42 = circuit_sub(t41, in3); // (Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) let t43 = circuit_mul(in4, in8); let t44 = circuit_add(t43, t42); // c_1 * previous_lhs + lhs_n_minus_1 let t45 = circuit_mul(in2, t4); // Eval sparse poly P_irr step coeff_6 * z^6 let t46 = circuit_add(in1, t45); // Eval sparse poly P_irr step + coeff_6 * z^6 let t47 = circuit_add(t46, t10); // Eval sparse poly P_irr step + 1*z^12 let t48 = circuit_mul(in125, in6); // Eval big_Q Horner step: multiply by z let t49 = circuit_add(in124, t48); // Eval big_Q Horner step: add coefficient_103 let t50 = circuit_mul(t49, in6); // Eval big_Q Horner step: multiply by z let t51 = circuit_add(in123, t50); // Eval big_Q Horner step: add coefficient_102 let t52 = circuit_mul(t51, in6); // Eval big_Q Horner step: multiply by z let t53 = circuit_add(in122, t52); // Eval big_Q Horner step: add coefficient_101 let t54 = circuit_mul(t53, in6); // Eval big_Q Horner step: multiply by z let t55 = circuit_add(in121, t54); // Eval big_Q Horner step: add coefficient_100 let t56 = circuit_mul(t55, in6); // Eval big_Q Horner step: multiply by z let t57 = circuit_add(in120, t56); // Eval big_Q Horner step: add coefficient_99 let t58 = circuit_mul(t57, in6); // Eval big_Q Horner step: multiply by z let t59 = circuit_add(in119, t58); // Eval big_Q Horner step: add coefficient_98 let t60 = circuit_mul(t59, in6); // Eval big_Q Horner step: multiply by z let t61 = circuit_add(in118, t60); // Eval big_Q Horner step: add coefficient_97 let t62 = circuit_mul(t61, in6); // Eval big_Q Horner step: multiply by z let t63 = circuit_add(in117, t62); // Eval big_Q Horner step: add coefficient_96 let t64 = circuit_mul(t63, in6); // Eval big_Q Horner step: multiply by z let t65 = circuit_add(in116, t64); // Eval big_Q Horner step: add coefficient_95 let t66 = circuit_mul(t65, in6); // Eval big_Q Horner step: multiply by z let t67 = circuit_add(in115, t66); // Eval big_Q Horner step: add coefficient_94 let t68 = circuit_mul(t67, in6); // Eval big_Q Horner step: multiply by z let t69 = circuit_add(in114, t68); // Eval big_Q Horner step: add coefficient_93 let t70 = circuit_mul(t69, in6); // Eval big_Q Horner step: multiply by z let t71 = circuit_add(in113, t70); // Eval big_Q Horner step: add coefficient_92 let t72 = circuit_mul(t71, in6); // Eval big_Q Horner step: multiply by z let t73 = circuit_add(in112, t72); // Eval big_Q Horner step: add coefficient_91 let t74 = circuit_mul(t73, in6); // Eval big_Q Horner step: multiply by z let t75 = circuit_add(in111, t74); // Eval big_Q Horner step: add coefficient_90 let t76 = circuit_mul(t75, in6); // Eval big_Q Horner step: multiply by z let t77 = circuit_add(in110, t76); // Eval big_Q Horner step: add coefficient_89 let t78 = circuit_mul(t77, in6); // Eval big_Q Horner step: multiply by z let t79 = circuit_add(in109, t78); // Eval big_Q Horner step: add coefficient_88 let t80 = circuit_mul(t79, in6); // Eval big_Q Horner step: multiply by z let t81 = circuit_add(in108, t80); // Eval big_Q Horner step: add coefficient_87 let t82 = circuit_mul(t81, in6); // Eval big_Q Horner step: multiply by z let t83 = circuit_add(in107, t82); // Eval big_Q Horner step: add coefficient_86 let t84 = circuit_mul(t83, in6); // Eval big_Q Horner step: multiply by z let t85 = circuit_add(in106, t84); // Eval big_Q Horner step: add coefficient_85 let t86 = circuit_mul(t85, in6); // Eval big_Q Horner step: multiply by z let t87 = circuit_add(in105, t86); // Eval big_Q Horner step: add coefficient_84 let t88 = circuit_mul(t87, in6); // Eval big_Q Horner step: multiply by z let t89 = circuit_add(in104, t88); // Eval big_Q Horner step: add coefficient_83 let t90 = circuit_mul(t89, in6); // Eval big_Q Horner step: multiply by z let t91 = circuit_add(in103, t90); // Eval big_Q Horner step: add coefficient_82 let t92 = circuit_mul(t91, in6); // Eval big_Q Horner step: multiply by z let t93 = circuit_add(in102, t92); // Eval big_Q Horner step: add coefficient_81 let t94 = circuit_mul(t93, in6); // Eval big_Q Horner step: multiply by z let t95 = circuit_add(in101, t94); // Eval big_Q Horner step: add coefficient_80 let t96 = circuit_mul(t95, in6); // Eval big_Q Horner step: multiply by z let t97 = circuit_add(in100, t96); // Eval big_Q Horner step: add coefficient_79 let t98 = circuit_mul(t97, in6); // Eval big_Q Horner step: multiply by z let t99 = circuit_add(in99, t98); // Eval big_Q Horner step: add coefficient_78 let t100 = circuit_mul(t99, in6); // Eval big_Q Horner step: multiply by z let t101 = circuit_add(in98, t100); // Eval big_Q Horner step: add coefficient_77 let t102 = circuit_mul(t101, in6); // Eval big_Q Horner step: multiply by z let t103 = circuit_add(in97, t102); // Eval big_Q Horner step: add coefficient_76 let t104 = circuit_mul(t103, in6); // Eval big_Q Horner step: multiply by z let t105 = circuit_add(in96, t104); // Eval big_Q Horner step: add coefficient_75 let t106 = circuit_mul(t105, in6); // Eval big_Q Horner step: multiply by z let t107 = circuit_add(in95, t106); // Eval big_Q Horner step: add coefficient_74 let t108 = circuit_mul(t107, in6); // Eval big_Q Horner step: multiply by z let t109 = circuit_add(in94, t108); // Eval big_Q Horner step: add coefficient_73 let t110 = circuit_mul(t109, in6); // Eval big_Q Horner step: multiply by z let t111 = circuit_add(in93, t110); // Eval big_Q Horner step: add coefficient_72 let t112 = circuit_mul(t111, in6); // Eval big_Q Horner step: multiply by z let t113 = circuit_add(in92, t112); // Eval big_Q Horner step: add coefficient_71 let t114 = circuit_mul(t113, in6); // Eval big_Q Horner step: multiply by z let t115 = circuit_add(in91, t114); // Eval big_Q Horner step: add coefficient_70 let t116 = circuit_mul(t115, in6); // Eval big_Q Horner step: multiply by z let t117 = circuit_add(in90, t116); // Eval big_Q Horner step: add coefficient_69 let t118 = circuit_mul(t117, in6); // Eval big_Q Horner step: multiply by z let t119 = circuit_add(in89, t118); // Eval big_Q Horner step: add coefficient_68 let t120 = circuit_mul(t119, in6); // Eval big_Q Horner step: multiply by z let t121 = circuit_add(in88, t120); // Eval big_Q Horner step: add coefficient_67 let t122 = circuit_mul(t121, in6); // Eval big_Q Horner step: multiply by z let t123 = circuit_add(in87, t122); // Eval big_Q Horner step: add coefficient_66 let t124 = circuit_mul(t123, in6); // Eval big_Q Horner step: multiply by z let t125 = circuit_add(in86, t124); // Eval big_Q Horner step: add coefficient_65 let t126 = circuit_mul(t125, in6); // Eval big_Q Horner step: multiply by z let t127 = circuit_add(in85, t126); // Eval big_Q Horner step: add coefficient_64 let t128 = circuit_mul(t127, in6); // Eval big_Q Horner step: multiply by z let t129 = circuit_add(in84, t128); // Eval big_Q Horner step: add coefficient_63 let t130 = circuit_mul(t129, in6); // Eval big_Q Horner step: multiply by z let t131 = circuit_add(in83, t130); // Eval big_Q Horner step: add coefficient_62 let t132 = circuit_mul(t131, in6); // Eval big_Q Horner step: multiply by z let t133 = circuit_add(in82, t132); // Eval big_Q Horner step: add coefficient_61 let t134 = circuit_mul(t133, in6); // Eval big_Q Horner step: multiply by z let t135 = circuit_add(in81, t134); // Eval big_Q Horner step: add coefficient_60 let t136 = circuit_mul(t135, in6); // Eval big_Q Horner step: multiply by z let t137 = circuit_add(in80, t136); // Eval big_Q Horner step: add coefficient_59 let t138 = circuit_mul(t137, in6); // Eval big_Q Horner step: multiply by z let t139 = circuit_add(in79, t138); // Eval big_Q Horner step: add coefficient_58 let t140 = circuit_mul(t139, in6); // Eval big_Q Horner step: multiply by z let t141 = circuit_add(in78, t140); // Eval big_Q Horner step: add coefficient_57 let t142 = circuit_mul(t141, in6); // Eval big_Q Horner step: multiply by z let t143 = circuit_add(in77, t142); // Eval big_Q Horner step: add coefficient_56 let t144 = circuit_mul(t143, in6); // Eval big_Q Horner step: multiply by z let t145 = circuit_add(in76, t144); // Eval big_Q Horner step: add coefficient_55 let t146 = circuit_mul(t145, in6); // Eval big_Q Horner step: multiply by z let t147 = circuit_add(in75, t146); // Eval big_Q Horner step: add coefficient_54 let t148 = circuit_mul(t147, in6); // Eval big_Q Horner step: multiply by z let t149 = circuit_add(in74, t148); // Eval big_Q Horner step: add coefficient_53 let t150 = circuit_mul(t149, in6); // Eval big_Q Horner step: multiply by z let t151 = circuit_add(in73, t150); // Eval big_Q Horner step: add coefficient_52 let t152 = circuit_mul(t151, in6); // Eval big_Q Horner step: multiply by z let t153 = circuit_add(in72, t152); // Eval big_Q Horner step: add coefficient_51 let t154 = circuit_mul(t153, in6); // Eval big_Q Horner step: multiply by z let t155 = circuit_add(in71, t154); // Eval big_Q Horner step: add coefficient_50 let t156 = circuit_mul(t155, in6); // Eval big_Q Horner step: multiply by z let t157 = circuit_add(in70, t156); // Eval big_Q Horner step: add coefficient_49 let t158 = circuit_mul(t157, in6); // Eval big_Q Horner step: multiply by z let t159 = circuit_add(in69, t158); // Eval big_Q Horner step: add coefficient_48 let t160 = circuit_mul(t159, in6); // Eval big_Q Horner step: multiply by z let t161 = circuit_add(in68, t160); // Eval big_Q Horner step: add coefficient_47 let t162 = circuit_mul(t161, in6); // Eval big_Q Horner step: multiply by z let t163 = circuit_add(in67, t162); // Eval big_Q Horner step: add coefficient_46 let t164 = circuit_mul(t163, in6); // Eval big_Q Horner step: multiply by z let t165 = circuit_add(in66, t164); // Eval big_Q Horner step: add coefficient_45 let t166 = circuit_mul(t165, in6); // Eval big_Q Horner step: multiply by z let t167 = circuit_add(in65, t166); // Eval big_Q Horner step: add coefficient_44 let t168 = circuit_mul(t167, in6); // Eval big_Q Horner step: multiply by z let t169 = circuit_add(in64, t168); // Eval big_Q Horner step: add coefficient_43 let t170 = circuit_mul(t169, in6); // Eval big_Q Horner step: multiply by z let t171 = circuit_add(in63, t170); // Eval big_Q Horner step: add coefficient_42 let t172 = circuit_mul(t171, in6); // Eval big_Q Horner step: multiply by z let t173 = circuit_add(in62, t172); // Eval big_Q Horner step: add coefficient_41 let t174 = circuit_mul(t173, in6); // Eval big_Q Horner step: multiply by z let t175 = circuit_add(in61, t174); // Eval big_Q Horner step: add coefficient_40 let t176 = circuit_mul(t175, in6); // Eval big_Q Horner step: multiply by z let t177 = circuit_add(in60, t176); // Eval big_Q Horner step: add coefficient_39 let t178 = circuit_mul(t177, in6); // Eval big_Q Horner step: multiply by z let t179 = circuit_add(in59, t178); // Eval big_Q Horner step: add coefficient_38 let t180 = circuit_mul(t179, in6); // Eval big_Q Horner step: multiply by z let t181 = circuit_add(in58, t180); // Eval big_Q Horner step: add coefficient_37 let t182 = circuit_mul(t181, in6); // Eval big_Q Horner step: multiply by z let t183 = circuit_add(in57, t182); // Eval big_Q Horner step: add coefficient_36 let t184 = circuit_mul(t183, in6); // Eval big_Q Horner step: multiply by z let t185 = circuit_add(in56, t184); // Eval big_Q Horner step: add coefficient_35 let t186 = circuit_mul(t185, in6); // Eval big_Q Horner step: multiply by z let t187 = circuit_add(in55, t186); // Eval big_Q Horner step: add coefficient_34 let t188 = circuit_mul(t187, in6); // Eval big_Q Horner step: multiply by z let t189 = circuit_add(in54, t188); // Eval big_Q Horner step: add coefficient_33 let t190 = circuit_mul(t189, in6); // Eval big_Q Horner step: multiply by z let t191 = circuit_add(in53, t190); // Eval big_Q Horner step: add coefficient_32 let t192 = circuit_mul(t191, in6); // Eval big_Q Horner step: multiply by z let t193 = circuit_add(in52, t192); // Eval big_Q Horner step: add coefficient_31 let t194 = circuit_mul(t193, in6); // Eval big_Q Horner step: multiply by z let t195 = circuit_add(in51, t194); // Eval big_Q Horner step: add coefficient_30 let t196 = circuit_mul(t195, in6); // Eval big_Q Horner step: multiply by z let t197 = circuit_add(in50, t196); // Eval big_Q Horner step: add coefficient_29 let t198 = circuit_mul(t197, in6); // Eval big_Q Horner step: multiply by z let t199 = circuit_add(in49, t198); // Eval big_Q Horner step: add coefficient_28 let t200 = circuit_mul(t199, in6); // Eval big_Q Horner step: multiply by z let t201 = circuit_add(in48, t200); // Eval big_Q Horner step: add coefficient_27 let t202 = circuit_mul(t201, in6); // Eval big_Q Horner step: multiply by z let t203 = circuit_add(in47, t202); // Eval big_Q Horner step: add coefficient_26 let t204 = circuit_mul(t203, in6); // Eval big_Q Horner step: multiply by z let t205 = circuit_add(in46, t204); // Eval big_Q Horner step: add coefficient_25 let t206 = circuit_mul(t205, in6); // Eval big_Q Horner step: multiply by z let t207 = circuit_add(in45, t206); // Eval big_Q Horner step: add coefficient_24 let t208 = circuit_mul(t207, in6); // Eval big_Q Horner step: multiply by z let t209 = circuit_add(in44, t208); // Eval big_Q Horner step: add coefficient_23 let t210 = circuit_mul(t209, in6); // Eval big_Q Horner step: multiply by z let t211 = circuit_add(in43, t210); // Eval big_Q Horner step: add coefficient_22 let t212 = circuit_mul(t211, in6); // Eval big_Q Horner step: multiply by z let t213 = circuit_add(in42, t212); // Eval big_Q Horner step: add coefficient_21 let t214 = circuit_mul(t213, in6); // Eval big_Q Horner step: multiply by z let t215 = circuit_add(in41, t214); // Eval big_Q Horner step: add coefficient_20 let t216 = circuit_mul(t215, in6); // Eval big_Q Horner step: multiply by z let t217 = circuit_add(in40, t216); // Eval big_Q Horner step: add coefficient_19 let t218 = circuit_mul(t217, in6); // Eval big_Q Horner step: multiply by z let t219 = circuit_add(in39, t218); // Eval big_Q Horner step: add coefficient_18 let t220 = circuit_mul(t219, in6); // Eval big_Q Horner step: multiply by z let t221 = circuit_add(in38, t220); // Eval big_Q Horner step: add coefficient_17 let t222 = circuit_mul(t221, in6); // Eval big_Q Horner step: multiply by z let t223 = circuit_add(in37, t222); // Eval big_Q Horner step: add coefficient_16 let t224 = circuit_mul(t223, in6); // Eval big_Q Horner step: multiply by z let t225 = circuit_add(in36, t224); // Eval big_Q Horner step: add coefficient_15 let t226 = circuit_mul(t225, in6); // Eval big_Q Horner step: multiply by z let t227 = circuit_add(in35, t226); // Eval big_Q Horner step: add coefficient_14 let t228 = circuit_mul(t227, in6); // Eval big_Q Horner step: multiply by z let t229 = circuit_add(in34, t228); // Eval big_Q Horner step: add coefficient_13 let t230 = circuit_mul(t229, in6); // Eval big_Q Horner step: multiply by z let t231 = circuit_add(in33, t230); // Eval big_Q Horner step: add coefficient_12 let t232 = circuit_mul(t231, in6); // Eval big_Q Horner step: multiply by z let t233 = circuit_add(in32, t232); // Eval big_Q Horner step: add coefficient_11 let t234 = circuit_mul(t233, in6); // Eval big_Q Horner step: multiply by z let t235 = circuit_add(in31, t234); // Eval big_Q Horner step: add coefficient_10 let t236 = circuit_mul(t235, in6); // Eval big_Q Horner step: multiply by z let t237 = circuit_add(in30, t236); // Eval big_Q Horner step: add coefficient_9 let t238 = circuit_mul(t237, in6); // Eval big_Q Horner step: multiply by z let t239 = circuit_add(in29, t238); // Eval big_Q Horner step: add coefficient_8 let t240 = circuit_mul(t239, in6); // Eval big_Q Horner step: multiply by z let t241 = circuit_add(in28, t240); // Eval big_Q Horner step: add coefficient_7 let t242 = circuit_mul(t241, in6); // Eval big_Q Horner step: multiply by z let t243 = circuit_add(in27, t242); // Eval big_Q Horner step: add coefficient_6 let t244 = circuit_mul(t243, in6); // Eval big_Q Horner step: multiply by z let t245 = circuit_add(in26, t244); // Eval big_Q Horner step: add coefficient_5 let t246 = circuit_mul(t245, in6); // Eval big_Q Horner step: multiply by z let t247 = circuit_add(in25, t246); // Eval big_Q Horner step: add coefficient_4 let t248 = circuit_mul(t247, in6); // Eval big_Q Horner step: multiply by z let t249 = circuit_add(in24, t248); // Eval big_Q Horner step: add coefficient_3 let t250 = circuit_mul(t249, in6); // Eval big_Q Horner step: multiply by z let t251 = circuit_add(in23, t250); // Eval big_Q Horner step: add coefficient_2 let t252 = circuit_mul(t251, in6); // Eval big_Q Horner step: multiply by z let t253 = circuit_add(in22, t252); // Eval big_Q Horner step: add coefficient_1 let t254 = circuit_mul(t253, in6); // Eval big_Q Horner step: multiply by z let t255 = circuit_add(in21, t254); // Eval big_Q Horner step: add coefficient_0 let t256 = circuit_mul(t255, t47); // Q(z) * P(z) let t257 = circuit_sub(t44, t256); // final_lhs - Q(z) * P(z) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t257,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x2, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs .next_2( [ 0xb153ffffb9feffffffffaaa9, 0x6730d2a0f6b0f6241eabfffe, 0x434bacd764774b84f38512bf, 0x1a0111ea397fe69a4b1ba7b6, ], ); // in2 // Fill inputs: circuit_inputs = circuit_inputs.next_2(R_n_minus_1_of_z); // in3 circuit_inputs = circuit_inputs.next_2(c_1); // in4 circuit_inputs = circuit_inputs.next_2(w_of_z); // in5 circuit_inputs = circuit_inputs.next_2(z); // in6 circuit_inputs = circuit_inputs.next_2(c_inv_frob_1_of_z); // in7 circuit_inputs = circuit_inputs.next_2(previous_lhs); // in8 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w0); // in9 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w1); // in10 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w2); // in11 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w3); // in12 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w4); // in13 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w5); // in14 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w6); // in15 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w7); // in16 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w8); // in17 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w9); // in18 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w10); // in19 circuit_inputs = circuit_inputs.next_2(R_n_minus_2.w11); // in20 for val in Q.span() { circuit_inputs = circuit_inputs.next_2(*val); } // in21 - in125 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result_of_z); // in126 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let final_check: u384 = outputs.get_output(t257); return (final_check,); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_INIT_BIT_2P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_0: G2Line, G2_line_0_2: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_1: G2Line, G2_line_1_2: G2Line, R_i_of_z: u384, z: u384, c_inv_of_z: u384, ) -> (u384,) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in21, in21); // compute z^2 let t1 = circuit_mul(t0, in21); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, t0); // compute z^8 let t4 = circuit_mul(in22, in22); let t5 = circuit_mul(in22, t4); let t6 = circuit_sub(in4, in5); let t7 = circuit_mul(t6, in0); // eval bls line by yInv let t8 = circuit_sub(in2, in3); let t9 = circuit_mul(t8, in1); // eval blsline by xNegOverY let t10 = circuit_mul(in5, in0); // eval bls line by yInv let t11 = circuit_mul(in3, in1); // eval bls line by xNegOverY let t12 = circuit_sub(in8, in9); let t13 = circuit_mul(t12, in0); // eval bls line by yInv let t14 = circuit_sub(in6, in7); let t15 = circuit_mul(t14, in1); // eval blsline by xNegOverY let t16 = circuit_mul(in9, in0); // eval bls line by yInv let t17 = circuit_mul(in7, in1); // eval bls line by xNegOverY let t18 = circuit_mul(t9, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 let t19 = circuit_add(t7, t18); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 let t20 = circuit_add(t19, t1); // Eval sparse poly line_0p_1 step + 1*z^3 let t21 = circuit_mul(t10, t2); // Eval sparse poly line_0p_1 step coeff_6 * z^6 let t22 = circuit_add(t20, t21); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 let t23 = circuit_mul(t11, t3); // Eval sparse poly line_0p_1 step coeff_8 * z^8 let t24 = circuit_add(t22, t23); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t25 = circuit_mul(t5, t24); let t26 = circuit_mul(t15, t0); // Eval sparse poly line_0p_2 step coeff_2 * z^2 let t27 = circuit_add(t13, t26); // Eval sparse poly line_0p_2 step + coeff_2 * z^2 let t28 = circuit_add(t27, t1); // Eval sparse poly line_0p_2 step + 1*z^3 let t29 = circuit_mul(t16, t2); // Eval sparse poly line_0p_2 step coeff_6 * z^6 let t30 = circuit_add(t28, t29); // Eval sparse poly line_0p_2 step + coeff_6 * z^6 let t31 = circuit_mul(t17, t3); // Eval sparse poly line_0p_2 step coeff_8 * z^8 let t32 = circuit_add(t30, t31); // Eval sparse poly line_0p_2 step + coeff_8 * z^8 let t33 = circuit_mul(t25, t32); let t34 = circuit_sub(in14, in15); let t35 = circuit_mul(t34, in10); // eval bls line by yInv let t36 = circuit_sub(in12, in13); let t37 = circuit_mul(t36, in11); // eval blsline by xNegOverY let t38 = circuit_mul(in15, in10); // eval bls line by yInv let t39 = circuit_mul(in13, in11); // eval bls line by xNegOverY let t40 = circuit_sub(in18, in19); let t41 = circuit_mul(t40, in10); // eval bls line by yInv let t42 = circuit_sub(in16, in17); let t43 = circuit_mul(t42, in11); // eval blsline by xNegOverY let t44 = circuit_mul(in19, in10); // eval bls line by yInv let t45 = circuit_mul(in17, in11); // eval bls line by xNegOverY let t46 = circuit_mul(t37, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 let t47 = circuit_add(t35, t46); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 let t48 = circuit_add(t47, t1); // Eval sparse poly line_1p_1 step + 1*z^3 let t49 = circuit_mul(t38, t2); // Eval sparse poly line_1p_1 step coeff_6 * z^6 let t50 = circuit_add(t48, t49); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 let t51 = circuit_mul(t39, t3); // Eval sparse poly line_1p_1 step coeff_8 * z^8 let t52 = circuit_add(t50, t51); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t53 = circuit_mul(t33, t52); let t54 = circuit_mul(t43, t0); // Eval sparse poly line_1p_2 step coeff_2 * z^2 let t55 = circuit_add(t41, t54); // Eval sparse poly line_1p_2 step + coeff_2 * z^2 let t56 = circuit_add(t55, t1); // Eval sparse poly line_1p_2 step + 1*z^3 let t57 = circuit_mul(t44, t2); // Eval sparse poly line_1p_2 step coeff_6 * z^6 let t58 = circuit_add(t56, t57); // Eval sparse poly line_1p_2 step + coeff_6 * z^6 let t59 = circuit_mul(t45, t3); // Eval sparse poly line_1p_2 step coeff_8 * z^8 let t60 = circuit_add(t58, t59); // Eval sparse poly line_1p_2 step + coeff_8 * z^8 let t61 = circuit_mul(t53, t60); let t62 = circuit_sub(t61, in20); // ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t62,).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in0 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in1 circuit_inputs = circuit_inputs.next_2(G2_line_0.r0a0); // in2 circuit_inputs = circuit_inputs.next_2(G2_line_0.r0a1); // in3 circuit_inputs = circuit_inputs.next_2(G2_line_0.r1a0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_0.r1a1); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_0_2.r0a0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_0_2.r0a1); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_0_2.r1a0); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_0_2.r1a1); // in9 circuit_inputs = circuit_inputs.next_2(yInv_1); // in10 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_1.r0a0); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_1.r0a1); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_1.r1a0); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_1.r1a1); // in15 circuit_inputs = circuit_inputs.next_2(G2_line_1_2.r0a0); // in16 circuit_inputs = circuit_inputs.next_2(G2_line_1_2.r0a1); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_1_2.r1a0); // in18 circuit_inputs = circuit_inputs.next_2(G2_line_1_2.r1a1); // in19 circuit_inputs = circuit_inputs.next_2(R_i_of_z); // in20 circuit_inputs = circuit_inputs.next_2(z); // in21 circuit_inputs = circuit_inputs.next_2(c_inv_of_z); // in22 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let new_lhs: u384 = outputs.get_output(t62); return (new_lhs,); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_INIT_BIT_3P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_0: G2Line, G2_line_0_2: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_1: G2Line, G2_line_1_2: G2Line, yInv_2: u384, xNegOverY_2: u384, Q_2: G2Point, R_i_of_z: u384, z: u384, c_inv_of_z: u384, ) -> (G2Point, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x3 let in1 = CE::> {}; // 0x6 let in2 = CE::> {}; // 0x0 // INPUT stack let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let (in24, in25, in26) = (CE::> {}, CE::> {}, CE::> {}); let (in27, in28, in29) = (CE::> {}, CE::> {}, CE::> {}); let (in30, in31) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in30, in30); // compute z^2 let t1 = circuit_mul(t0, in30); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, t0); // compute z^8 let t4 = circuit_mul(in31, in31); let t5 = circuit_mul(in31, t4); let t6 = circuit_sub(in7, in8); let t7 = circuit_mul(t6, in3); // eval bls line by yInv let t8 = circuit_sub(in5, in6); let t9 = circuit_mul(t8, in4); // eval blsline by xNegOverY let t10 = circuit_mul(in8, in3); // eval bls line by yInv let t11 = circuit_mul(in6, in4); // eval bls line by xNegOverY let t12 = circuit_sub(in11, in12); let t13 = circuit_mul(t12, in3); // eval bls line by yInv let t14 = circuit_sub(in9, in10); let t15 = circuit_mul(t14, in4); // eval blsline by xNegOverY let t16 = circuit_mul(in12, in3); // eval bls line by yInv let t17 = circuit_mul(in10, in4); // eval bls line by xNegOverY let t18 = circuit_mul(t9, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 let t19 = circuit_add(t7, t18); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 let t20 = circuit_add(t19, t1); // Eval sparse poly line_0p_1 step + 1*z^3 let t21 = circuit_mul(t10, t2); // Eval sparse poly line_0p_1 step coeff_6 * z^6 let t22 = circuit_add(t20, t21); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 let t23 = circuit_mul(t11, t3); // Eval sparse poly line_0p_1 step coeff_8 * z^8 let t24 = circuit_add(t22, t23); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t25 = circuit_mul(t5, t24); let t26 = circuit_mul(t15, t0); // Eval sparse poly line_0p_2 step coeff_2 * z^2 let t27 = circuit_add(t13, t26); // Eval sparse poly line_0p_2 step + coeff_2 * z^2 let t28 = circuit_add(t27, t1); // Eval sparse poly line_0p_2 step + 1*z^3 let t29 = circuit_mul(t16, t2); // Eval sparse poly line_0p_2 step coeff_6 * z^6 let t30 = circuit_add(t28, t29); // Eval sparse poly line_0p_2 step + coeff_6 * z^6 let t31 = circuit_mul(t17, t3); // Eval sparse poly line_0p_2 step coeff_8 * z^8 let t32 = circuit_add(t30, t31); // Eval sparse poly line_0p_2 step + coeff_8 * z^8 let t33 = circuit_mul(t25, t32); let t34 = circuit_sub(in17, in18); let t35 = circuit_mul(t34, in13); // eval bls line by yInv let t36 = circuit_sub(in15, in16); let t37 = circuit_mul(t36, in14); // eval blsline by xNegOverY let t38 = circuit_mul(in18, in13); // eval bls line by yInv let t39 = circuit_mul(in16, in14); // eval bls line by xNegOverY let t40 = circuit_sub(in21, in22); let t41 = circuit_mul(t40, in13); // eval bls line by yInv let t42 = circuit_sub(in19, in20); let t43 = circuit_mul(t42, in14); // eval blsline by xNegOverY let t44 = circuit_mul(in22, in13); // eval bls line by yInv let t45 = circuit_mul(in20, in14); // eval bls line by xNegOverY let t46 = circuit_mul(t37, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 let t47 = circuit_add(t35, t46); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 let t48 = circuit_add(t47, t1); // Eval sparse poly line_1p_1 step + 1*z^3 let t49 = circuit_mul(t38, t2); // Eval sparse poly line_1p_1 step coeff_6 * z^6 let t50 = circuit_add(t48, t49); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 let t51 = circuit_mul(t39, t3); // Eval sparse poly line_1p_1 step coeff_8 * z^8 let t52 = circuit_add(t50, t51); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t53 = circuit_mul(t33, t52); let t54 = circuit_mul(t43, t0); // Eval sparse poly line_1p_2 step coeff_2 * z^2 let t55 = circuit_add(t41, t54); // Eval sparse poly line_1p_2 step + coeff_2 * z^2 let t56 = circuit_add(t55, t1); // Eval sparse poly line_1p_2 step + 1*z^3 let t57 = circuit_mul(t44, t2); // Eval sparse poly line_1p_2 step coeff_6 * z^6 let t58 = circuit_add(t56, t57); // Eval sparse poly line_1p_2 step + coeff_6 * z^6 let t59 = circuit_mul(t45, t3); // Eval sparse poly line_1p_2 step coeff_8 * z^8 let t60 = circuit_add(t58, t59); // Eval sparse poly line_1p_2 step + coeff_8 * z^8 let t61 = circuit_mul(t53, t60); let t62 = circuit_add(in25, in26); let t63 = circuit_sub(in25, in26); let t64 = circuit_mul(t62, t63); let t65 = circuit_mul(in25, in26); let t66 = circuit_mul(t64, in0); let t67 = circuit_mul(t65, in1); let t68 = circuit_add(in27, in27); // Fp2 add coeff 0/1 let t69 = circuit_add(in28, in28); // Fp2 add coeff 1/1 let t70 = circuit_mul(t68, t68); // Fp2 Inv start let t71 = circuit_mul(t69, t69); let t72 = circuit_add(t70, t71); let t73 = circuit_inverse(t72); let t74 = circuit_mul(t68, t73); // Fp2 Inv real part end let t75 = circuit_mul(t69, t73); let t76 = circuit_sub(in2, t75); // Fp2 Inv imag part end let t77 = circuit_mul(t66, t74); // Fp2 mul start let t78 = circuit_mul(t67, t76); let t79 = circuit_sub(t77, t78); // Fp2 mul real part end let t80 = circuit_mul(t66, t76); let t81 = circuit_mul(t67, t74); let t82 = circuit_add(t80, t81); // Fp2 mul imag part end let t83 = circuit_mul(t79, in25); // Fp2 mul start let t84 = circuit_mul(t82, in26); let t85 = circuit_sub(t83, t84); // Fp2 mul real part end let t86 = circuit_mul(t79, in26); let t87 = circuit_mul(t82, in25); let t88 = circuit_add(t86, t87); // Fp2 mul imag part end let t89 = circuit_sub(t85, in27); // Fp2 sub coeff 0/1 let t90 = circuit_sub(t88, in28); // Fp2 sub coeff 1/1 let t91 = circuit_add(t79, t82); let t92 = circuit_sub(t79, t82); let t93 = circuit_mul(t91, t92); let t94 = circuit_mul(t79, t82); let t95 = circuit_add(t94, t94); let t96 = circuit_add(in25, in25); // Fp2 add coeff 0/1 let t97 = circuit_add(in26, in26); // Fp2 add coeff 1/1 let t98 = circuit_sub(t93, t96); // Fp2 sub coeff 0/1 let t99 = circuit_sub(t95, t97); // Fp2 sub coeff 1/1 let t100 = circuit_sub(in25, t98); // Fp2 sub coeff 0/1 let t101 = circuit_sub(in26, t99); // Fp2 sub coeff 1/1 let t102 = circuit_mul(t100, t100); // Fp2 Inv start let t103 = circuit_mul(t101, t101); let t104 = circuit_add(t102, t103); let t105 = circuit_inverse(t104); let t106 = circuit_mul(t100, t105); // Fp2 Inv real part end let t107 = circuit_mul(t101, t105); let t108 = circuit_sub(in2, t107); // Fp2 Inv imag part end let t109 = circuit_mul(t68, t106); // Fp2 mul start let t110 = circuit_mul(t69, t108); let t111 = circuit_sub(t109, t110); // Fp2 mul real part end let t112 = circuit_mul(t68, t108); let t113 = circuit_mul(t69, t106); let t114 = circuit_add(t112, t113); // Fp2 mul imag part end let t115 = circuit_sub(t111, t79); // Fp2 sub coeff 0/1 let t116 = circuit_sub(t114, t82); // Fp2 sub coeff 1/1 let t117 = circuit_mul(t115, in25); // Fp2 mul start let t118 = circuit_mul(t116, in26); let t119 = circuit_sub(t117, t118); // Fp2 mul real part end let t120 = circuit_mul(t115, in26); let t121 = circuit_mul(t116, in25); let t122 = circuit_add(t120, t121); // Fp2 mul imag part end let t123 = circuit_sub(t119, in27); // Fp2 sub coeff 0/1 let t124 = circuit_sub(t122, in28); // Fp2 sub coeff 1/1 let t125 = circuit_add(t115, t116); let t126 = circuit_sub(t115, t116); let t127 = circuit_mul(t125, t126); let t128 = circuit_mul(t115, t116); let t129 = circuit_add(t128, t128); let t130 = circuit_add(in25, t98); // Fp2 add coeff 0/1 let t131 = circuit_add(in26, t99); // Fp2 add coeff 1/1 let t132 = circuit_sub(t127, t130); // Fp2 sub coeff 0/1 let t133 = circuit_sub(t129, t131); // Fp2 sub coeff 1/1 let t134 = circuit_sub(in25, t132); // Fp2 sub coeff 0/1 let t135 = circuit_sub(in26, t133); // Fp2 sub coeff 1/1 let t136 = circuit_mul(t115, t134); // Fp2 mul start let t137 = circuit_mul(t116, t135); let t138 = circuit_sub(t136, t137); // Fp2 mul real part end let t139 = circuit_mul(t115, t135); let t140 = circuit_mul(t116, t134); let t141 = circuit_add(t139, t140); // Fp2 mul imag part end let t142 = circuit_sub(t138, in27); // Fp2 sub coeff 0/1 let t143 = circuit_sub(t141, in28); // Fp2 sub coeff 1/1 let t144 = circuit_sub(t89, t90); let t145 = circuit_mul(t144, in23); // eval bls line by yInv let t146 = circuit_sub(t79, t82); let t147 = circuit_mul(t146, in24); // eval blsline by xNegOverY let t148 = circuit_mul(t90, in23); // eval bls line by yInv let t149 = circuit_mul(t82, in24); // eval bls line by xNegOverY let t150 = circuit_sub(t123, t124); let t151 = circuit_mul(t150, in23); // eval bls line by yInv let t152 = circuit_sub(t115, t116); let t153 = circuit_mul(t152, in24); // eval blsline by xNegOverY let t154 = circuit_mul(t124, in23); // eval bls line by yInv let t155 = circuit_mul(t116, in24); // eval bls line by xNegOverY let t156 = circuit_mul(t147, t0); // Eval sparse poly line_2p_1 step coeff_2 * z^2 let t157 = circuit_add(t145, t156); // Eval sparse poly line_2p_1 step + coeff_2 * z^2 let t158 = circuit_add(t157, t1); // Eval sparse poly line_2p_1 step + 1*z^3 let t159 = circuit_mul(t148, t2); // Eval sparse poly line_2p_1 step coeff_6 * z^6 let t160 = circuit_add(t158, t159); // Eval sparse poly line_2p_1 step + coeff_6 * z^6 let t161 = circuit_mul(t149, t3); // Eval sparse poly line_2p_1 step coeff_8 * z^8 let t162 = circuit_add(t160, t161); // Eval sparse poly line_2p_1 step + coeff_8 * z^8 let t163 = circuit_mul(t61, t162); let t164 = circuit_mul(t153, t0); // Eval sparse poly line_2p_2 step coeff_2 * z^2 let t165 = circuit_add(t151, t164); // Eval sparse poly line_2p_2 step + coeff_2 * z^2 let t166 = circuit_add(t165, t1); // Eval sparse poly line_2p_2 step + 1*z^3 let t167 = circuit_mul(t154, t2); // Eval sparse poly line_2p_2 step coeff_6 * z^6 let t168 = circuit_add(t166, t167); // Eval sparse poly line_2p_2 step + coeff_6 * z^6 let t169 = circuit_mul(t155, t3); // Eval sparse poly line_2p_2 step coeff_8 * z^8 let t170 = circuit_add(t168, t169); // Eval sparse poly line_2p_2 step + coeff_8 * z^8 let t171 = circuit_mul(t163, t170); let t172 = circuit_sub(t171, in29); // ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t132, t133, t142, t143, t172).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x6, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in2 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in3 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_0.r0a0); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_0.r0a1); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_0.r1a0); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_0.r1a1); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_0_2.r0a0); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_0_2.r0a1); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_0_2.r1a0); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_0_2.r1a1); // in12 circuit_inputs = circuit_inputs.next_2(yInv_1); // in13 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_1.r0a0); // in15 circuit_inputs = circuit_inputs.next_2(G2_line_1.r0a1); // in16 circuit_inputs = circuit_inputs.next_2(G2_line_1.r1a0); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_1.r1a1); // in18 circuit_inputs = circuit_inputs.next_2(G2_line_1_2.r0a0); // in19 circuit_inputs = circuit_inputs.next_2(G2_line_1_2.r0a1); // in20 circuit_inputs = circuit_inputs.next_2(G2_line_1_2.r1a0); // in21 circuit_inputs = circuit_inputs.next_2(G2_line_1_2.r1a1); // in22 circuit_inputs = circuit_inputs.next_2(yInv_2); // in23 circuit_inputs = circuit_inputs.next_2(xNegOverY_2); // in24 circuit_inputs = circuit_inputs.next_2(Q_2.x0); // in25 circuit_inputs = circuit_inputs.next_2(Q_2.x1); // in26 circuit_inputs = circuit_inputs.next_2(Q_2.y0); // in27 circuit_inputs = circuit_inputs.next_2(Q_2.y1); // in28 circuit_inputs = circuit_inputs.next_2(R_i_of_z); // in29 circuit_inputs = circuit_inputs.next_2(z); // in30 circuit_inputs = circuit_inputs.next_2(c_inv_of_z); // in31 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t132), x1: outputs.get_output(t133), y0: outputs.get_output(t142), y1: outputs.get_output(t143), }; let new_lhs: u384 = outputs.get_output(t172); return (Q0, new_lhs); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_PREPARE_PAIRS_1P_circuit(p_0: G1Point) -> (BLSProcessedPair,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2) = (CE::> {}, CE::> {}); let t0 = circuit_inverse(in2); let t1 = circuit_mul(in1, t0); let t2 = circuit_sub(in0, t1); let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t0, t2).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p_0.x); // in1 circuit_inputs = circuit_inputs.next_2(p_0.y); // in2 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let p_0: BLSProcessedPair = BLSProcessedPair { yInv: outputs.get_output(t0), xNegOverY: outputs.get_output(t2), }; return (p_0,); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2P_circuit( p_0: G1Point, p_1: G1Point, ) -> (BLSProcessedPair, BLSProcessedPair) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let in4 = CE::> {}; let t0 = circuit_inverse(in2); let t1 = circuit_mul(in1, t0); let t2 = circuit_sub(in0, t1); let t3 = circuit_inverse(in4); let t4 = circuit_mul(in3, t3); let t5 = circuit_sub(in0, t4); let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t0, t2, t3, t5).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p_0.x); // in1 circuit_inputs = circuit_inputs.next_2(p_0.y); // in2 circuit_inputs = circuit_inputs.next_2(p_1.x); // in3 circuit_inputs = circuit_inputs.next_2(p_1.y); // in4 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let p_0: BLSProcessedPair = BLSProcessedPair { yInv: outputs.get_output(t0), xNegOverY: outputs.get_output(t2), }; let p_1: BLSProcessedPair = BLSProcessedPair { yInv: outputs.get_output(t3), xNegOverY: outputs.get_output(t5), }; return (p_0, p_1); } #[inline(always)] pub fn run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3P_circuit( p_0: G1Point, p_1: G1Point, p_2: G1Point, ) -> (BLSProcessedPair, BLSProcessedPair, BLSProcessedPair) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_inverse(in2); let t1 = circuit_mul(in1, t0); let t2 = circuit_sub(in0, t1); let t3 = circuit_inverse(in4); let t4 = circuit_mul(in3, t3); let t5 = circuit_sub(in0, t4); let t6 = circuit_inverse(in6); let t7 = circuit_mul(in5, t6); let t8 = circuit_sub(in0, t7); let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t0, t2, t3, t5, t6, t8).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p_0.x); // in1 circuit_inputs = circuit_inputs.next_2(p_0.y); // in2 circuit_inputs = circuit_inputs.next_2(p_1.x); // in3 circuit_inputs = circuit_inputs.next_2(p_1.y); // in4 circuit_inputs = circuit_inputs.next_2(p_2.x); // in5 circuit_inputs = circuit_inputs.next_2(p_2.y); // in6 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let p_0: BLSProcessedPair = BLSProcessedPair { yInv: outputs.get_output(t0), xNegOverY: outputs.get_output(t2), }; let p_1: BLSProcessedPair = BLSProcessedPair { yInv: outputs.get_output(t3), xNegOverY: outputs.get_output(t5), }; let p_2: BLSProcessedPair = BLSProcessedPair { yInv: outputs.get_output(t6), xNegOverY: outputs.get_output(t8), }; return (p_0, p_1, p_2); } #[inline(always)] pub fn run_BN254_INITIALIZE_MPCHECK_EXT_MLR_circuit( lambda_root: E12D, z: u384, scaling_factor: MillerLoopResultScalingFactor, c_inv: E12D, precomputed_miller_loop_result: E12D, ) -> (u384, u384, u384, u384, u384, u384, u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x1 let in1 = CE::> {}; // 0x12 let in2 = CE::> {}; // 0x1d8c8daef3eee1e81b2522ec5eb28ded6895e1cdfde6a43f5daa971f3fa65955 let in3 = CE::> {}; // 0x217e400dc9351e774e34e2ac06ead4000d14d1e242b29c567e9c385ce480a71a let in4 = CE::> {}; // 0x242b719062f6737b8481d22c6934ce844d72f250fd28d102c0d147b2f4d521a7 let in5 = CE::> {}; // 0x359809094bd5c8e1b9c22d81246ffc2e794e17643ac198484b8d9094aa82536 let in6 = CE::> {}; // 0x21436d48fcb50cc60dd4ef1e69a0c1f0dd2949fa6df7b44cbb259ef7cb58d5ed let in7 = CE::> {}; // 0x18857a58f3b5bb3038a4311a86919d9c7c6c15f88a4f4f0831364cf35f78f771 let in8 = CE::> {}; // 0x2c84bbad27c3671562b7adefd44038ab3c0bbad96fc008e7d6998c82f7fc048b let in9 = CE::> {}; // 0xc33b1c70e4fd11b6d1eab6fcd18b99ad4afd096a8697e0c9c36d8ca3339a7b5 let in10 = CE::< CI<10>, > {}; // 0x1b007294a55accce13fe08bea73305ff6bdac77c5371c546d428780a6e3dcfa8 let in11 = CE::< CI<11>, > {}; // 0x215d42e7ac7bd17cefe88dd8e6965b3adae92c974f501fe811493d72543a3977 let in12 = CE::> {}; // -0x1 % p let in13 = CE::< CI<13>, > {}; // 0x246996f3b4fae7e6a6327cfe12150b8e747992778eeec7e5ca5cf05f80f362ac let in14 = CE::< CI<14>, > {}; // 0x12d7c0c3ed42be419d2b22ca22ceca702eeb88c36a8b264dde75f4f798d6a3f2 let in15 = CE::< CI<15>, > {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 let in16 = CE::> {}; // 0xc38dce27e3b2cae33ce738a184c89d94a0e78406b48f98a7b4f4463e3a7dba0 let in17 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 let in18 = CE::> {}; // 0xf20e129e47c9363aa7b569817e0966cba582096fa7a164080faed1f0d24275a let in19 = CE::< CI<19>, > {}; // 0x2c145edbe7fd8aee9f3a80b03b0b1c923685d2ea1bdec763c13b4711cd2b8126 let in20 = CE::> {}; // 0x3df92c5b96e3914559897c6ad411fb25b75afb7f8b1c1a56586ff93e080f8bc let in21 = CE::< CI<21>, > {}; // 0x12acf2ca76fd0675a27fb246c7729f7db080cb99678e2ac024c6b8ee6e0c2c4b let in22 = CE::< CI<22>, > {}; // 0x1563dbde3bd6d35ba4523cf7da4e525e2ba6a3151500054667f8140c6a3f2d9f let in23 = CE::< CI<23>, > {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd49 let in24 = CE::< CI<24>, > {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 let in25 = CE::> {}; // 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe let in26 = CE::> {}; // 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177ffffff let in27 = CE::< CI<27>, > {}; // 0x13d0c369615f7bb0b2bdfa8fef85fa07122bde8d67dfc8fabd3581ad840ddd76 let in28 = CE::< CI<28>, > {}; // 0x18a0f4219f4fdff6fc2bf531eb331a053a35744cac285af5685d3f90eacf7a66 let in29 = CE::> {}; // 0xc3a5e9c462a654779c3e050c9ca2a428908a81264e2b5a5bf22f67654883ae6 let in30 = CE::< CI<30>, > {}; // 0x2ce02aa5f9bf8cd65bdd2055c255cf9d9e08c1d9345582cc92fd973c74bd77f4 let in31 = CE::< CI<31>, > {}; // 0x17ded419ed7be4f97fac149bfaefbac11b155498de227b850aea3f23790405d6 let in32 = CE::< CI<32>, > {}; // 0x1bfe7b214c0294242fb81a8dccd8a9b4441d64f34150a79753fb0cd31cc99cc0 let in33 = CE::> {}; // 0x697b9c523e0390ed15da0ec97a9b8346513297b9efaf0f0f1a228f0d5662fbd let in34 = CE::> {}; // 0x7a0e052f2b1c443b5186d6ac4c723b85d3f78a3182d2db0c413901c32b0c6fe let in35 = CE::< CI<35>, > {}; // 0x1b76a37fba85f3cd5dc79824a3792597356c892c39c0d06b220500933945267f let in36 = CE::> {}; // 0xabf8b60be77d7306cbeee33576139d7f03a5e397d439ec7694aa2bf4c0c101 let in37 = CE::< CI<37>, > {}; // 0x1c938b097fd2247905924b2691fb5e5685558c04009201927eeb0a69546f1fd1 let in38 = CE::> {}; // 0x4f1de41b3d1766fa9f30e6dec26094f0fdf31bf98ff2631380cab2baaa586de let in39 = CE::< CI<39>, > {}; // 0x2429efd69b073ae23e8c6565b7b72e1b0e78c27f038f14e77cfd95a083f4c261 let in40 = CE::< CI<40>, > {}; // 0x28a411b634f09b8fb14b900e9507e9327600ecc7d8cf6ebab94d0cb3b2594c64 let in41 = CE::< CI<41>, > {}; // 0x23d5e999e1910a12feb0f6ef0cd21d04a44a9e08737f96e55fe3ed9d730c239f let in42 = CE::< CI<42>, > {}; // 0x1465d351952f0c0588982b28b4a8aea95364059e272122f5e8257f43bbb36087 let in43 = CE::< CI<43>, > {}; // 0x16db366a59b1dd0b9fb1b2282a48633d3e2ddaea200280211f25041384282499 let in44 = CE::< CI<44>, > {}; // 0x28c36e1fee7fdbe60337d84bbcba34a53a41f1ee50449cdc780cfbfaa5cc3649 // INPUT stack let (in45, in46, in47) = (CE::> {}, CE::> {}, CE::> {}); let (in48, in49, in50) = (CE::> {}, CE::> {}, CE::> {}); let (in51, in52, in53) = (CE::> {}, CE::> {}, CE::> {}); let (in54, in55, in56) = (CE::> {}, CE::> {}, CE::> {}); let (in57, in58, in59) = (CE::> {}, CE::> {}, CE::> {}); let (in60, in61, in62) = (CE::> {}, CE::> {}, CE::> {}); let (in63, in64, in65) = (CE::> {}, CE::> {}, CE::> {}); let (in66, in67, in68) = (CE::> {}, CE::> {}, CE::> {}); let (in69, in70, in71) = (CE::> {}, CE::> {}, CE::> {}); let (in72, in73, in74) = (CE::> {}, CE::> {}, CE::> {}); let (in75, in76, in77) = (CE::> {}, CE::> {}, CE::> {}); let (in78, in79, in80) = (CE::> {}, CE::> {}, CE::> {}); let (in81, in82, in83) = (CE::> {}, CE::> {}, CE::> {}); let (in84, in85, in86) = (CE::> {}, CE::> {}, CE::> {}); let in87 = CE::> {}; let t0 = circuit_mul(in57, in57); // Compute z^2 let t1 = circuit_mul(t0, in57); // Compute z^3 let t2 = circuit_mul(t1, in57); // Compute z^4 let t3 = circuit_mul(t2, in57); // Compute z^5 let t4 = circuit_mul(t3, in57); // Compute z^6 let t5 = circuit_mul(t4, in57); // Compute z^7 let t6 = circuit_mul(t5, in57); // Compute z^8 let t7 = circuit_mul(t6, in57); // Compute z^9 let t8 = circuit_mul(t7, in57); // Compute z^10 let t9 = circuit_mul(t8, in57); // Compute z^11 let t10 = circuit_mul(in46, in57); // Eval C step coeff_1 * z^1 let t11 = circuit_add(in45, t10); // Eval C step + (coeff_1 * z^1) let t12 = circuit_mul(in47, t0); // Eval C step coeff_2 * z^2 let t13 = circuit_add(t11, t12); // Eval C step + (coeff_2 * z^2) let t14 = circuit_mul(in48, t1); // Eval C step coeff_3 * z^3 let t15 = circuit_add(t13, t14); // Eval C step + (coeff_3 * z^3) let t16 = circuit_mul(in49, t2); // Eval C step coeff_4 * z^4 let t17 = circuit_add(t15, t16); // Eval C step + (coeff_4 * z^4) let t18 = circuit_mul(in50, t3); // Eval C step coeff_5 * z^5 let t19 = circuit_add(t17, t18); // Eval C step + (coeff_5 * z^5) let t20 = circuit_mul(in51, t4); // Eval C step coeff_6 * z^6 let t21 = circuit_add(t19, t20); // Eval C step + (coeff_6 * z^6) let t22 = circuit_mul(in52, t5); // Eval C step coeff_7 * z^7 let t23 = circuit_add(t21, t22); // Eval C step + (coeff_7 * z^7) let t24 = circuit_mul(in53, t6); // Eval C step coeff_8 * z^8 let t25 = circuit_add(t23, t24); // Eval C step + (coeff_8 * z^8) let t26 = circuit_mul(in54, t7); // Eval C step coeff_9 * z^9 let t27 = circuit_add(t25, t26); // Eval C step + (coeff_9 * z^9) let t28 = circuit_mul(in55, t8); // Eval C step coeff_10 * z^10 let t29 = circuit_add(t27, t28); // Eval C step + (coeff_10 * z^10) let t30 = circuit_mul(in56, t9); // Eval C step coeff_11 * z^11 let t31 = circuit_add(t29, t30); // Eval C step + (coeff_11 * z^11) let t32 = circuit_mul(in59, t0); // Eval sparse poly W step coeff_2 * z^2 let t33 = circuit_add(in58, t32); // Eval sparse poly W step + coeff_2 * z^2 let t34 = circuit_mul(in60, t2); // Eval sparse poly W step coeff_4 * z^4 let t35 = circuit_add(t33, t34); // Eval sparse poly W step + coeff_4 * z^4 let t36 = circuit_mul(in61, t4); // Eval sparse poly W step coeff_6 * z^6 let t37 = circuit_add(t35, t36); // Eval sparse poly W step + coeff_6 * z^6 let t38 = circuit_mul(in62, t6); // Eval sparse poly W step coeff_8 * z^8 let t39 = circuit_add(t37, t38); // Eval sparse poly W step + coeff_8 * z^8 let t40 = circuit_mul(in63, t8); // Eval sparse poly W step coeff_10 * z^10 let t41 = circuit_add(t39, t40); // Eval sparse poly W step + coeff_10 * z^10 let t42 = circuit_mul(in65, in57); // Eval C_inv step coeff_1 * z^1 let t43 = circuit_add(in64, t42); // Eval C_inv step + (coeff_1 * z^1) let t44 = circuit_mul(in66, t0); // Eval C_inv step coeff_2 * z^2 let t45 = circuit_add(t43, t44); // Eval C_inv step + (coeff_2 * z^2) let t46 = circuit_mul(in67, t1); // Eval C_inv step coeff_3 * z^3 let t47 = circuit_add(t45, t46); // Eval C_inv step + (coeff_3 * z^3) let t48 = circuit_mul(in68, t2); // Eval C_inv step coeff_4 * z^4 let t49 = circuit_add(t47, t48); // Eval C_inv step + (coeff_4 * z^4) let t50 = circuit_mul(in69, t3); // Eval C_inv step coeff_5 * z^5 let t51 = circuit_add(t49, t50); // Eval C_inv step + (coeff_5 * z^5) let t52 = circuit_mul(in70, t4); // Eval C_inv step coeff_6 * z^6 let t53 = circuit_add(t51, t52); // Eval C_inv step + (coeff_6 * z^6) let t54 = circuit_mul(in71, t5); // Eval C_inv step coeff_7 * z^7 let t55 = circuit_add(t53, t54); // Eval C_inv step + (coeff_7 * z^7) let t56 = circuit_mul(in72, t6); // Eval C_inv step coeff_8 * z^8 let t57 = circuit_add(t55, t56); // Eval C_inv step + (coeff_8 * z^8) let t58 = circuit_mul(in73, t7); // Eval C_inv step coeff_9 * z^9 let t59 = circuit_add(t57, t58); // Eval C_inv step + (coeff_9 * z^9) let t60 = circuit_mul(in74, t8); // Eval C_inv step coeff_10 * z^10 let t61 = circuit_add(t59, t60); // Eval C_inv step + (coeff_10 * z^10) let t62 = circuit_mul(in75, t9); // Eval C_inv step coeff_11 * z^11 let t63 = circuit_add(t61, t62); // Eval C_inv step + (coeff_11 * z^11) let t64 = circuit_mul(t31, t63); let t65 = circuit_sub(t64, in0); // c_of_z * c_inv_of_z - 1 let t66 = circuit_mul(in70, in1); let t67 = circuit_add(in64, t66); let t68 = circuit_mul(in65, in2); let t69 = circuit_mul(in71, in3); let t70 = circuit_add(t68, t69); let t71 = circuit_mul(in66, in4); let t72 = circuit_mul(in72, in5); let t73 = circuit_add(t71, t72); let t74 = circuit_mul(in67, in6); let t75 = circuit_mul(in73, in7); let t76 = circuit_add(t74, t75); let t77 = circuit_mul(in68, in8); let t78 = circuit_mul(in74, in9); let t79 = circuit_add(t77, t78); let t80 = circuit_mul(in69, in10); let t81 = circuit_mul(in75, in11); let t82 = circuit_add(t80, t81); let t83 = circuit_mul(in70, in12); let t84 = circuit_mul(in65, in13); let t85 = circuit_mul(in71, in14); let t86 = circuit_add(t84, t85); let t87 = circuit_mul(in66, in15); let t88 = circuit_mul(in72, in16); let t89 = circuit_add(t87, t88); let t90 = circuit_mul(in67, in17); let t91 = circuit_mul(in73, in18); let t92 = circuit_add(t90, t91); let t93 = circuit_mul(in68, in19); let t94 = circuit_mul(in74, in20); let t95 = circuit_add(t93, t94); let t96 = circuit_mul(in69, in21); let t97 = circuit_mul(in75, in22); let t98 = circuit_add(t96, t97); let t99 = circuit_mul(in46, in23); let t100 = circuit_mul(in47, in24); let t101 = circuit_mul(in48, in12); let t102 = circuit_mul(in49, in25); let t103 = circuit_mul(in50, in26); let t104 = circuit_mul(in52, in23); let t105 = circuit_mul(in53, in24); let t106 = circuit_mul(in54, in12); let t107 = circuit_mul(in55, in25); let t108 = circuit_mul(in56, in26); let t109 = circuit_mul(in70, in1); let t110 = circuit_add(in64, t109); let t111 = circuit_mul(in65, in27); let t112 = circuit_mul(in71, in28); let t113 = circuit_add(t111, t112); let t114 = circuit_mul(in66, in29); let t115 = circuit_mul(in72, in30); let t116 = circuit_add(t114, t115); let t117 = circuit_mul(in67, in18); let t118 = circuit_mul(in73, in31); let t119 = circuit_add(t117, t118); let t120 = circuit_mul(in68, in32); let t121 = circuit_mul(in74, in33); let t122 = circuit_add(t120, t121); let t123 = circuit_mul(in69, in34); let t124 = circuit_mul(in75, in35); let t125 = circuit_add(t123, t124); let t126 = circuit_mul(in70, in12); let t127 = circuit_mul(in65, in36); let t128 = circuit_mul(in71, in37); let t129 = circuit_add(t127, t128); let t130 = circuit_mul(in66, in38); let t131 = circuit_mul(in72, in39); let t132 = circuit_add(t130, t131); let t133 = circuit_mul(in67, in40); let t134 = circuit_mul(in73, in6); let t135 = circuit_add(t133, t134); let t136 = circuit_mul(in68, in41); let t137 = circuit_mul(in74, in42); let t138 = circuit_add(t136, t137); let t139 = circuit_mul(in69, in43); let t140 = circuit_mul(in75, in44); let t141 = circuit_add(t139, t140); let t142 = circuit_mul(t70, in57); // Eval C_inv_frob_1 step coeff_1 * z^1 let t143 = circuit_add(t67, t142); // Eval C_inv_frob_1 step + (coeff_1 * z^1) let t144 = circuit_mul(t73, t0); // Eval C_inv_frob_1 step coeff_2 * z^2 let t145 = circuit_add(t143, t144); // Eval C_inv_frob_1 step + (coeff_2 * z^2) let t146 = circuit_mul(t76, t1); // Eval C_inv_frob_1 step coeff_3 * z^3 let t147 = circuit_add(t145, t146); // Eval C_inv_frob_1 step + (coeff_3 * z^3) let t148 = circuit_mul(t79, t2); // Eval C_inv_frob_1 step coeff_4 * z^4 let t149 = circuit_add(t147, t148); // Eval C_inv_frob_1 step + (coeff_4 * z^4) let t150 = circuit_mul(t82, t3); // Eval C_inv_frob_1 step coeff_5 * z^5 let t151 = circuit_add(t149, t150); // Eval C_inv_frob_1 step + (coeff_5 * z^5) let t152 = circuit_mul(t83, t4); // Eval C_inv_frob_1 step coeff_6 * z^6 let t153 = circuit_add(t151, t152); // Eval C_inv_frob_1 step + (coeff_6 * z^6) let t154 = circuit_mul(t86, t5); // Eval C_inv_frob_1 step coeff_7 * z^7 let t155 = circuit_add(t153, t154); // Eval C_inv_frob_1 step + (coeff_7 * z^7) let t156 = circuit_mul(t89, t6); // Eval C_inv_frob_1 step coeff_8 * z^8 let t157 = circuit_add(t155, t156); // Eval C_inv_frob_1 step + (coeff_8 * z^8) let t158 = circuit_mul(t92, t7); // Eval C_inv_frob_1 step coeff_9 * z^9 let t159 = circuit_add(t157, t158); // Eval C_inv_frob_1 step + (coeff_9 * z^9) let t160 = circuit_mul(t95, t8); // Eval C_inv_frob_1 step coeff_10 * z^10 let t161 = circuit_add(t159, t160); // Eval C_inv_frob_1 step + (coeff_10 * z^10) let t162 = circuit_mul(t98, t9); // Eval C_inv_frob_1 step coeff_11 * z^11 let t163 = circuit_add(t161, t162); // Eval C_inv_frob_1 step + (coeff_11 * z^11) let t164 = circuit_mul(t99, in57); // Eval C_frob_2 step coeff_1 * z^1 let t165 = circuit_add(in45, t164); // Eval C_frob_2 step + (coeff_1 * z^1) let t166 = circuit_mul(t100, t0); // Eval C_frob_2 step coeff_2 * z^2 let t167 = circuit_add(t165, t166); // Eval C_frob_2 step + (coeff_2 * z^2) let t168 = circuit_mul(t101, t1); // Eval C_frob_2 step coeff_3 * z^3 let t169 = circuit_add(t167, t168); // Eval C_frob_2 step + (coeff_3 * z^3) let t170 = circuit_mul(t102, t2); // Eval C_frob_2 step coeff_4 * z^4 let t171 = circuit_add(t169, t170); // Eval C_frob_2 step + (coeff_4 * z^4) let t172 = circuit_mul(t103, t3); // Eval C_frob_2 step coeff_5 * z^5 let t173 = circuit_add(t171, t172); // Eval C_frob_2 step + (coeff_5 * z^5) let t174 = circuit_mul(in51, t4); // Eval C_frob_2 step coeff_6 * z^6 let t175 = circuit_add(t173, t174); // Eval C_frob_2 step + (coeff_6 * z^6) let t176 = circuit_mul(t104, t5); // Eval C_frob_2 step coeff_7 * z^7 let t177 = circuit_add(t175, t176); // Eval C_frob_2 step + (coeff_7 * z^7) let t178 = circuit_mul(t105, t6); // Eval C_frob_2 step coeff_8 * z^8 let t179 = circuit_add(t177, t178); // Eval C_frob_2 step + (coeff_8 * z^8) let t180 = circuit_mul(t106, t7); // Eval C_frob_2 step coeff_9 * z^9 let t181 = circuit_add(t179, t180); // Eval C_frob_2 step + (coeff_9 * z^9) let t182 = circuit_mul(t107, t8); // Eval C_frob_2 step coeff_10 * z^10 let t183 = circuit_add(t181, t182); // Eval C_frob_2 step + (coeff_10 * z^10) let t184 = circuit_mul(t108, t9); // Eval C_frob_2 step coeff_11 * z^11 let t185 = circuit_add(t183, t184); // Eval C_frob_2 step + (coeff_11 * z^11) let t186 = circuit_mul(t113, in57); // Eval C_inv_frob_3 step coeff_1 * z^1 let t187 = circuit_add(t110, t186); // Eval C_inv_frob_3 step + (coeff_1 * z^1) let t188 = circuit_mul(t116, t0); // Eval C_inv_frob_3 step coeff_2 * z^2 let t189 = circuit_add(t187, t188); // Eval C_inv_frob_3 step + (coeff_2 * z^2) let t190 = circuit_mul(t119, t1); // Eval C_inv_frob_3 step coeff_3 * z^3 let t191 = circuit_add(t189, t190); // Eval C_inv_frob_3 step + (coeff_3 * z^3) let t192 = circuit_mul(t122, t2); // Eval C_inv_frob_3 step coeff_4 * z^4 let t193 = circuit_add(t191, t192); // Eval C_inv_frob_3 step + (coeff_4 * z^4) let t194 = circuit_mul(t125, t3); // Eval C_inv_frob_3 step coeff_5 * z^5 let t195 = circuit_add(t193, t194); // Eval C_inv_frob_3 step + (coeff_5 * z^5) let t196 = circuit_mul(t126, t4); // Eval C_inv_frob_3 step coeff_6 * z^6 let t197 = circuit_add(t195, t196); // Eval C_inv_frob_3 step + (coeff_6 * z^6) let t198 = circuit_mul(t129, t5); // Eval C_inv_frob_3 step coeff_7 * z^7 let t199 = circuit_add(t197, t198); // Eval C_inv_frob_3 step + (coeff_7 * z^7) let t200 = circuit_mul(t132, t6); // Eval C_inv_frob_3 step coeff_8 * z^8 let t201 = circuit_add(t199, t200); // Eval C_inv_frob_3 step + (coeff_8 * z^8) let t202 = circuit_mul(t135, t7); // Eval C_inv_frob_3 step coeff_9 * z^9 let t203 = circuit_add(t201, t202); // Eval C_inv_frob_3 step + (coeff_9 * z^9) let t204 = circuit_mul(t138, t8); // Eval C_inv_frob_3 step coeff_10 * z^10 let t205 = circuit_add(t203, t204); // Eval C_inv_frob_3 step + (coeff_10 * z^10) let t206 = circuit_mul(t141, t9); // Eval C_inv_frob_3 step coeff_11 * z^11 let t207 = circuit_add(t205, t206); // Eval C_inv_frob_3 step + (coeff_11 * z^11) let t208 = circuit_mul(in77, in57); // Eval precomputed_miller_loop_result step coeff_1 * z^1 let t209 = circuit_add( in76, t208, ); // Eval precomputed_miller_loop_result step + (coeff_1 * z^1) let t210 = circuit_mul(in78, t0); // Eval precomputed_miller_loop_result step coeff_2 * z^2 let t211 = circuit_add( t209, t210, ); // Eval precomputed_miller_loop_result step + (coeff_2 * z^2) let t212 = circuit_mul(in79, t1); // Eval precomputed_miller_loop_result step coeff_3 * z^3 let t213 = circuit_add( t211, t212, ); // Eval precomputed_miller_loop_result step + (coeff_3 * z^3) let t214 = circuit_mul(in80, t2); // Eval precomputed_miller_loop_result step coeff_4 * z^4 let t215 = circuit_add( t213, t214, ); // Eval precomputed_miller_loop_result step + (coeff_4 * z^4) let t216 = circuit_mul(in81, t3); // Eval precomputed_miller_loop_result step coeff_5 * z^5 let t217 = circuit_add( t215, t216, ); // Eval precomputed_miller_loop_result step + (coeff_5 * z^5) let t218 = circuit_mul(in82, t4); // Eval precomputed_miller_loop_result step coeff_6 * z^6 let t219 = circuit_add( t217, t218, ); // Eval precomputed_miller_loop_result step + (coeff_6 * z^6) let t220 = circuit_mul(in83, t5); // Eval precomputed_miller_loop_result step coeff_7 * z^7 let t221 = circuit_add( t219, t220, ); // Eval precomputed_miller_loop_result step + (coeff_7 * z^7) let t222 = circuit_mul(in84, t6); // Eval precomputed_miller_loop_result step coeff_8 * z^8 let t223 = circuit_add( t221, t222, ); // Eval precomputed_miller_loop_result step + (coeff_8 * z^8) let t224 = circuit_mul(in85, t7); // Eval precomputed_miller_loop_result step coeff_9 * z^9 let t225 = circuit_add( t223, t224, ); // Eval precomputed_miller_loop_result step + (coeff_9 * z^9) let t226 = circuit_mul(in86, t8); // Eval precomputed_miller_loop_result step coeff_10 * z^10 let t227 = circuit_add( t225, t226, ); // Eval precomputed_miller_loop_result step + (coeff_10 * z^10) let t228 = circuit_mul(in87, t9); // Eval precomputed_miller_loop_result step coeff_11 * z^11 let t229 = circuit_add( t227, t228, ); // Eval precomputed_miller_loop_result step + (coeff_11 * z^11) let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t31, t41, t63, t65, t163, t185, t207, t229).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(INITIALIZE_MPCHECK_EXT_MLR_BN254_CONSTANTS.span()); // in0 - in44 // Fill inputs: circuit_inputs = circuit_inputs.next_2(lambda_root.w0); // in45 circuit_inputs = circuit_inputs.next_2(lambda_root.w1); // in46 circuit_inputs = circuit_inputs.next_2(lambda_root.w2); // in47 circuit_inputs = circuit_inputs.next_2(lambda_root.w3); // in48 circuit_inputs = circuit_inputs.next_2(lambda_root.w4); // in49 circuit_inputs = circuit_inputs.next_2(lambda_root.w5); // in50 circuit_inputs = circuit_inputs.next_2(lambda_root.w6); // in51 circuit_inputs = circuit_inputs.next_2(lambda_root.w7); // in52 circuit_inputs = circuit_inputs.next_2(lambda_root.w8); // in53 circuit_inputs = circuit_inputs.next_2(lambda_root.w9); // in54 circuit_inputs = circuit_inputs.next_2(lambda_root.w10); // in55 circuit_inputs = circuit_inputs.next_2(lambda_root.w11); // in56 circuit_inputs = circuit_inputs.next_2(z); // in57 circuit_inputs = circuit_inputs.next_2(scaling_factor.w0); // in58 circuit_inputs = circuit_inputs.next_2(scaling_factor.w2); // in59 circuit_inputs = circuit_inputs.next_2(scaling_factor.w4); // in60 circuit_inputs = circuit_inputs.next_2(scaling_factor.w6); // in61 circuit_inputs = circuit_inputs.next_2(scaling_factor.w8); // in62 circuit_inputs = circuit_inputs.next_2(scaling_factor.w10); // in63 circuit_inputs = circuit_inputs.next_2(c_inv.w0); // in64 circuit_inputs = circuit_inputs.next_2(c_inv.w1); // in65 circuit_inputs = circuit_inputs.next_2(c_inv.w2); // in66 circuit_inputs = circuit_inputs.next_2(c_inv.w3); // in67 circuit_inputs = circuit_inputs.next_2(c_inv.w4); // in68 circuit_inputs = circuit_inputs.next_2(c_inv.w5); // in69 circuit_inputs = circuit_inputs.next_2(c_inv.w6); // in70 circuit_inputs = circuit_inputs.next_2(c_inv.w7); // in71 circuit_inputs = circuit_inputs.next_2(c_inv.w8); // in72 circuit_inputs = circuit_inputs.next_2(c_inv.w9); // in73 circuit_inputs = circuit_inputs.next_2(c_inv.w10); // in74 circuit_inputs = circuit_inputs.next_2(c_inv.w11); // in75 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w0); // in76 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w1); // in77 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w2); // in78 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w3); // in79 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w4); // in80 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w5); // in81 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w6); // in82 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w7); // in83 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w8); // in84 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w9); // in85 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w10); // in86 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result.w11); // in87 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let c_of_z: u384 = outputs.get_output(t31); let scaling_factor_of_z: u384 = outputs.get_output(t41); let c_inv_of_z: u384 = outputs.get_output(t63); let lhs: u384 = outputs.get_output(t65); let c_inv_frob_1_of_z: u384 = outputs.get_output(t163); let c_frob_2_of_z: u384 = outputs.get_output(t185); let c_inv_frob_3_of_z: u384 = outputs.get_output(t207); let precomputed_miller_loop_result_of_z: u384 = outputs.get_output(t229); return ( c_of_z, scaling_factor_of_z, c_inv_of_z, lhs, c_inv_frob_1_of_z, c_frob_2_of_z, c_inv_frob_3_of_z, precomputed_miller_loop_result_of_z, ); } const INITIALIZE_MPCHECK_EXT_MLR_BN254_CONSTANTS: [u384; 45] = [ u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x12, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0xfde6a43f5daa971f3fa65955, limb1: 0x1b2522ec5eb28ded6895e1cd, limb2: 0x1d8c8daef3eee1e8, limb3: 0x0, }, u384 { limb0: 0x42b29c567e9c385ce480a71a, limb1: 0x4e34e2ac06ead4000d14d1e2, limb2: 0x217e400dc9351e77, limb3: 0x0, }, u384 { limb0: 0xfd28d102c0d147b2f4d521a7, limb1: 0x8481d22c6934ce844d72f250, limb2: 0x242b719062f6737b, limb3: 0x0, }, u384 { limb0: 0x43ac198484b8d9094aa82536, limb1: 0x1b9c22d81246ffc2e794e176, limb2: 0x359809094bd5c8e, limb3: 0x0, }, u384 { limb0: 0x6df7b44cbb259ef7cb58d5ed, limb1: 0xdd4ef1e69a0c1f0dd2949fa, limb2: 0x21436d48fcb50cc6, limb3: 0x0, }, u384 { limb0: 0x8a4f4f0831364cf35f78f771, limb1: 0x38a4311a86919d9c7c6c15f8, limb2: 0x18857a58f3b5bb30, limb3: 0x0, }, u384 { limb0: 0x6fc008e7d6998c82f7fc048b, limb1: 0x62b7adefd44038ab3c0bbad9, limb2: 0x2c84bbad27c36715, limb3: 0x0, }, u384 { limb0: 0xa8697e0c9c36d8ca3339a7b5, limb1: 0x6d1eab6fcd18b99ad4afd096, limb2: 0xc33b1c70e4fd11b, limb3: 0x0, }, u384 { limb0: 0x5371c546d428780a6e3dcfa8, limb1: 0x13fe08bea73305ff6bdac77c, limb2: 0x1b007294a55accce, limb3: 0x0, }, u384 { limb0: 0x4f501fe811493d72543a3977, limb1: 0xefe88dd8e6965b3adae92c97, limb2: 0x215d42e7ac7bd17c, limb3: 0x0, }, u384 { limb0: 0x6871ca8d3c208c16d87cfd46, limb1: 0xb85045b68181585d97816a91, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x8eeec7e5ca5cf05f80f362ac, limb1: 0xa6327cfe12150b8e74799277, limb2: 0x246996f3b4fae7e6, limb3: 0x0, }, u384 { limb0: 0x6a8b264dde75f4f798d6a3f2, limb1: 0x9d2b22ca22ceca702eeb88c3, limb2: 0x12d7c0c3ed42be41, limb3: 0x0, }, u384 { limb0: 0xb7c9dce1665d51c640fcba2, limb1: 0x4ba4cc8bd75a079432ae2a1d, limb2: 0x16c9e55061ebae20, limb3: 0x0, }, u384 { limb0: 0x6b48f98a7b4f4463e3a7dba0, limb1: 0x33ce738a184c89d94a0e7840, limb2: 0xc38dce27e3b2cae, limb3: 0x0, }, u384 { limb0: 0x8fa25bd282d37f632623b0e3, limb1: 0x704b5a7ec796f2b21807dc9, limb2: 0x7c03cbcac41049a, limb3: 0x0, }, u384 { limb0: 0xfa7a164080faed1f0d24275a, limb1: 0xaa7b569817e0966cba582096, limb2: 0xf20e129e47c9363, limb3: 0x0, }, u384 { limb0: 0x1bdec763c13b4711cd2b8126, limb1: 0x9f3a80b03b0b1c923685d2ea, limb2: 0x2c145edbe7fd8aee, limb3: 0x0, }, u384 { limb0: 0xf8b1c1a56586ff93e080f8bc, limb1: 0x559897c6ad411fb25b75afb7, limb2: 0x3df92c5b96e3914, limb3: 0x0, }, u384 { limb0: 0x678e2ac024c6b8ee6e0c2c4b, limb1: 0xa27fb246c7729f7db080cb99, limb2: 0x12acf2ca76fd0675, limb3: 0x0, }, u384 { limb0: 0x1500054667f8140c6a3f2d9f, limb1: 0xa4523cf7da4e525e2ba6a315, limb2: 0x1563dbde3bd6d35b, limb3: 0x0, }, u384 { limb0: 0xbb966e3de4bd44e5607cfd49, limb1: 0x5e6dd9e7e0acccb0c28f069f, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0xbb966e3de4bd44e5607cfd48, limb1: 0x5e6dd9e7e0acccb0c28f069f, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0xacdb5c4f5763473177fffffe, limb1: 0x59e26bcea0d48bacd4f263f1, limb2: 0x0, limb3: 0x0, }, u384 { limb0: 0xacdb5c4f5763473177ffffff, limb1: 0x59e26bcea0d48bacd4f263f1, limb2: 0x0, limb3: 0x0, }, u384 { limb0: 0x67dfc8fabd3581ad840ddd76, limb1: 0xb2bdfa8fef85fa07122bde8d, limb2: 0x13d0c369615f7bb0, limb3: 0x0, }, u384 { limb0: 0xac285af5685d3f90eacf7a66, limb1: 0xfc2bf531eb331a053a35744c, limb2: 0x18a0f4219f4fdff6, limb3: 0x0, }, u384 { limb0: 0x64e2b5a5bf22f67654883ae6, limb1: 0x79c3e050c9ca2a428908a812, limb2: 0xc3a5e9c462a6547, limb3: 0x0, }, u384 { limb0: 0x345582cc92fd973c74bd77f4, limb1: 0x5bdd2055c255cf9d9e08c1d9, limb2: 0x2ce02aa5f9bf8cd6, limb3: 0x0, }, u384 { limb0: 0xde227b850aea3f23790405d6, limb1: 0x7fac149bfaefbac11b155498, limb2: 0x17ded419ed7be4f9, limb3: 0x0, }, u384 { limb0: 0x4150a79753fb0cd31cc99cc0, limb1: 0x2fb81a8dccd8a9b4441d64f3, limb2: 0x1bfe7b214c029424, limb3: 0x0, }, u384 { limb0: 0x9efaf0f0f1a228f0d5662fbd, limb1: 0xd15da0ec97a9b8346513297b, limb2: 0x697b9c523e0390e, limb3: 0x0, }, u384 { limb0: 0x182d2db0c413901c32b0c6fe, limb1: 0xb5186d6ac4c723b85d3f78a3, limb2: 0x7a0e052f2b1c443, limb3: 0x0, }, u384 { limb0: 0x39c0d06b220500933945267f, limb1: 0x5dc79824a3792597356c892c, limb2: 0x1b76a37fba85f3cd, limb3: 0x0, }, u384 { limb0: 0x97d439ec7694aa2bf4c0c101, limb1: 0x6cbeee33576139d7f03a5e3, limb2: 0xabf8b60be77d73, limb3: 0x0, }, u384 { limb0: 0x9201927eeb0a69546f1fd1, limb1: 0x5924b2691fb5e5685558c04, limb2: 0x1c938b097fd22479, limb3: 0x0, }, u384 { limb0: 0x98ff2631380cab2baaa586de, limb1: 0xa9f30e6dec26094f0fdf31bf, limb2: 0x4f1de41b3d1766f, limb3: 0x0, }, u384 { limb0: 0x38f14e77cfd95a083f4c261, limb1: 0x3e8c6565b7b72e1b0e78c27f, limb2: 0x2429efd69b073ae2, limb3: 0x0, }, u384 { limb0: 0xd8cf6ebab94d0cb3b2594c64, limb1: 0xb14b900e9507e9327600ecc7, limb2: 0x28a411b634f09b8f, limb3: 0x0, }, u384 { limb0: 0x737f96e55fe3ed9d730c239f, limb1: 0xfeb0f6ef0cd21d04a44a9e08, limb2: 0x23d5e999e1910a12, limb3: 0x0, }, u384 { limb0: 0x272122f5e8257f43bbb36087, limb1: 0x88982b28b4a8aea95364059e, limb2: 0x1465d351952f0c05, limb3: 0x0, }, u384 { limb0: 0x200280211f25041384282499, limb1: 0x9fb1b2282a48633d3e2ddaea, limb2: 0x16db366a59b1dd0b, limb3: 0x0, }, u384 { limb0: 0x50449cdc780cfbfaa5cc3649, limb1: 0x337d84bbcba34a53a41f1ee, limb2: 0x28c36e1fee7fdbe6, limb3: 0x0, }, ]; #[inline(always)] pub fn run_BN254_INITIALIZE_MPCHECK_circuit( lambda_root: E12D, z: u384, scaling_factor: MillerLoopResultScalingFactor, c_inv: E12D, ) -> (u384, u384, u384, u384, u384, u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x1 let in1 = CE::> {}; // 0x12 let in2 = CE::> {}; // 0x1d8c8daef3eee1e81b2522ec5eb28ded6895e1cdfde6a43f5daa971f3fa65955 let in3 = CE::> {}; // 0x217e400dc9351e774e34e2ac06ead4000d14d1e242b29c567e9c385ce480a71a let in4 = CE::> {}; // 0x242b719062f6737b8481d22c6934ce844d72f250fd28d102c0d147b2f4d521a7 let in5 = CE::> {}; // 0x359809094bd5c8e1b9c22d81246ffc2e794e17643ac198484b8d9094aa82536 let in6 = CE::> {}; // 0x21436d48fcb50cc60dd4ef1e69a0c1f0dd2949fa6df7b44cbb259ef7cb58d5ed let in7 = CE::> {}; // 0x18857a58f3b5bb3038a4311a86919d9c7c6c15f88a4f4f0831364cf35f78f771 let in8 = CE::> {}; // 0x2c84bbad27c3671562b7adefd44038ab3c0bbad96fc008e7d6998c82f7fc048b let in9 = CE::> {}; // 0xc33b1c70e4fd11b6d1eab6fcd18b99ad4afd096a8697e0c9c36d8ca3339a7b5 let in10 = CE::< CI<10>, > {}; // 0x1b007294a55accce13fe08bea73305ff6bdac77c5371c546d428780a6e3dcfa8 let in11 = CE::< CI<11>, > {}; // 0x215d42e7ac7bd17cefe88dd8e6965b3adae92c974f501fe811493d72543a3977 let in12 = CE::> {}; // -0x1 % p let in13 = CE::< CI<13>, > {}; // 0x246996f3b4fae7e6a6327cfe12150b8e747992778eeec7e5ca5cf05f80f362ac let in14 = CE::< CI<14>, > {}; // 0x12d7c0c3ed42be419d2b22ca22ceca702eeb88c36a8b264dde75f4f798d6a3f2 let in15 = CE::< CI<15>, > {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 let in16 = CE::> {}; // 0xc38dce27e3b2cae33ce738a184c89d94a0e78406b48f98a7b4f4463e3a7dba0 let in17 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 let in18 = CE::> {}; // 0xf20e129e47c9363aa7b569817e0966cba582096fa7a164080faed1f0d24275a let in19 = CE::< CI<19>, > {}; // 0x2c145edbe7fd8aee9f3a80b03b0b1c923685d2ea1bdec763c13b4711cd2b8126 let in20 = CE::> {}; // 0x3df92c5b96e3914559897c6ad411fb25b75afb7f8b1c1a56586ff93e080f8bc let in21 = CE::< CI<21>, > {}; // 0x12acf2ca76fd0675a27fb246c7729f7db080cb99678e2ac024c6b8ee6e0c2c4b let in22 = CE::< CI<22>, > {}; // 0x1563dbde3bd6d35ba4523cf7da4e525e2ba6a3151500054667f8140c6a3f2d9f let in23 = CE::< CI<23>, > {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd49 let in24 = CE::< CI<24>, > {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 let in25 = CE::> {}; // 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe let in26 = CE::> {}; // 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177ffffff let in27 = CE::< CI<27>, > {}; // 0x13d0c369615f7bb0b2bdfa8fef85fa07122bde8d67dfc8fabd3581ad840ddd76 let in28 = CE::< CI<28>, > {}; // 0x18a0f4219f4fdff6fc2bf531eb331a053a35744cac285af5685d3f90eacf7a66 let in29 = CE::> {}; // 0xc3a5e9c462a654779c3e050c9ca2a428908a81264e2b5a5bf22f67654883ae6 let in30 = CE::< CI<30>, > {}; // 0x2ce02aa5f9bf8cd65bdd2055c255cf9d9e08c1d9345582cc92fd973c74bd77f4 let in31 = CE::< CI<31>, > {}; // 0x17ded419ed7be4f97fac149bfaefbac11b155498de227b850aea3f23790405d6 let in32 = CE::< CI<32>, > {}; // 0x1bfe7b214c0294242fb81a8dccd8a9b4441d64f34150a79753fb0cd31cc99cc0 let in33 = CE::> {}; // 0x697b9c523e0390ed15da0ec97a9b8346513297b9efaf0f0f1a228f0d5662fbd let in34 = CE::> {}; // 0x7a0e052f2b1c443b5186d6ac4c723b85d3f78a3182d2db0c413901c32b0c6fe let in35 = CE::< CI<35>, > {}; // 0x1b76a37fba85f3cd5dc79824a3792597356c892c39c0d06b220500933945267f let in36 = CE::> {}; // 0xabf8b60be77d7306cbeee33576139d7f03a5e397d439ec7694aa2bf4c0c101 let in37 = CE::< CI<37>, > {}; // 0x1c938b097fd2247905924b2691fb5e5685558c04009201927eeb0a69546f1fd1 let in38 = CE::> {}; // 0x4f1de41b3d1766fa9f30e6dec26094f0fdf31bf98ff2631380cab2baaa586de let in39 = CE::< CI<39>, > {}; // 0x2429efd69b073ae23e8c6565b7b72e1b0e78c27f038f14e77cfd95a083f4c261 let in40 = CE::< CI<40>, > {}; // 0x28a411b634f09b8fb14b900e9507e9327600ecc7d8cf6ebab94d0cb3b2594c64 let in41 = CE::< CI<41>, > {}; // 0x23d5e999e1910a12feb0f6ef0cd21d04a44a9e08737f96e55fe3ed9d730c239f let in42 = CE::< CI<42>, > {}; // 0x1465d351952f0c0588982b28b4a8aea95364059e272122f5e8257f43bbb36087 let in43 = CE::< CI<43>, > {}; // 0x16db366a59b1dd0b9fb1b2282a48633d3e2ddaea200280211f25041384282499 let in44 = CE::< CI<44>, > {}; // 0x28c36e1fee7fdbe60337d84bbcba34a53a41f1ee50449cdc780cfbfaa5cc3649 // INPUT stack let (in45, in46, in47) = (CE::> {}, CE::> {}, CE::> {}); let (in48, in49, in50) = (CE::> {}, CE::> {}, CE::> {}); let (in51, in52, in53) = (CE::> {}, CE::> {}, CE::> {}); let (in54, in55, in56) = (CE::> {}, CE::> {}, CE::> {}); let (in57, in58, in59) = (CE::> {}, CE::> {}, CE::> {}); let (in60, in61, in62) = (CE::> {}, CE::> {}, CE::> {}); let (in63, in64, in65) = (CE::> {}, CE::> {}, CE::> {}); let (in66, in67, in68) = (CE::> {}, CE::> {}, CE::> {}); let (in69, in70, in71) = (CE::> {}, CE::> {}, CE::> {}); let (in72, in73, in74) = (CE::> {}, CE::> {}, CE::> {}); let in75 = CE::> {}; let t0 = circuit_mul(in57, in57); // Compute z^2 let t1 = circuit_mul(t0, in57); // Compute z^3 let t2 = circuit_mul(t1, in57); // Compute z^4 let t3 = circuit_mul(t2, in57); // Compute z^5 let t4 = circuit_mul(t3, in57); // Compute z^6 let t5 = circuit_mul(t4, in57); // Compute z^7 let t6 = circuit_mul(t5, in57); // Compute z^8 let t7 = circuit_mul(t6, in57); // Compute z^9 let t8 = circuit_mul(t7, in57); // Compute z^10 let t9 = circuit_mul(t8, in57); // Compute z^11 let t10 = circuit_mul(in46, in57); // Eval C step coeff_1 * z^1 let t11 = circuit_add(in45, t10); // Eval C step + (coeff_1 * z^1) let t12 = circuit_mul(in47, t0); // Eval C step coeff_2 * z^2 let t13 = circuit_add(t11, t12); // Eval C step + (coeff_2 * z^2) let t14 = circuit_mul(in48, t1); // Eval C step coeff_3 * z^3 let t15 = circuit_add(t13, t14); // Eval C step + (coeff_3 * z^3) let t16 = circuit_mul(in49, t2); // Eval C step coeff_4 * z^4 let t17 = circuit_add(t15, t16); // Eval C step + (coeff_4 * z^4) let t18 = circuit_mul(in50, t3); // Eval C step coeff_5 * z^5 let t19 = circuit_add(t17, t18); // Eval C step + (coeff_5 * z^5) let t20 = circuit_mul(in51, t4); // Eval C step coeff_6 * z^6 let t21 = circuit_add(t19, t20); // Eval C step + (coeff_6 * z^6) let t22 = circuit_mul(in52, t5); // Eval C step coeff_7 * z^7 let t23 = circuit_add(t21, t22); // Eval C step + (coeff_7 * z^7) let t24 = circuit_mul(in53, t6); // Eval C step coeff_8 * z^8 let t25 = circuit_add(t23, t24); // Eval C step + (coeff_8 * z^8) let t26 = circuit_mul(in54, t7); // Eval C step coeff_9 * z^9 let t27 = circuit_add(t25, t26); // Eval C step + (coeff_9 * z^9) let t28 = circuit_mul(in55, t8); // Eval C step coeff_10 * z^10 let t29 = circuit_add(t27, t28); // Eval C step + (coeff_10 * z^10) let t30 = circuit_mul(in56, t9); // Eval C step coeff_11 * z^11 let t31 = circuit_add(t29, t30); // Eval C step + (coeff_11 * z^11) let t32 = circuit_mul(in59, t0); // Eval sparse poly W step coeff_2 * z^2 let t33 = circuit_add(in58, t32); // Eval sparse poly W step + coeff_2 * z^2 let t34 = circuit_mul(in60, t2); // Eval sparse poly W step coeff_4 * z^4 let t35 = circuit_add(t33, t34); // Eval sparse poly W step + coeff_4 * z^4 let t36 = circuit_mul(in61, t4); // Eval sparse poly W step coeff_6 * z^6 let t37 = circuit_add(t35, t36); // Eval sparse poly W step + coeff_6 * z^6 let t38 = circuit_mul(in62, t6); // Eval sparse poly W step coeff_8 * z^8 let t39 = circuit_add(t37, t38); // Eval sparse poly W step + coeff_8 * z^8 let t40 = circuit_mul(in63, t8); // Eval sparse poly W step coeff_10 * z^10 let t41 = circuit_add(t39, t40); // Eval sparse poly W step + coeff_10 * z^10 let t42 = circuit_mul(in65, in57); // Eval C_inv step coeff_1 * z^1 let t43 = circuit_add(in64, t42); // Eval C_inv step + (coeff_1 * z^1) let t44 = circuit_mul(in66, t0); // Eval C_inv step coeff_2 * z^2 let t45 = circuit_add(t43, t44); // Eval C_inv step + (coeff_2 * z^2) let t46 = circuit_mul(in67, t1); // Eval C_inv step coeff_3 * z^3 let t47 = circuit_add(t45, t46); // Eval C_inv step + (coeff_3 * z^3) let t48 = circuit_mul(in68, t2); // Eval C_inv step coeff_4 * z^4 let t49 = circuit_add(t47, t48); // Eval C_inv step + (coeff_4 * z^4) let t50 = circuit_mul(in69, t3); // Eval C_inv step coeff_5 * z^5 let t51 = circuit_add(t49, t50); // Eval C_inv step + (coeff_5 * z^5) let t52 = circuit_mul(in70, t4); // Eval C_inv step coeff_6 * z^6 let t53 = circuit_add(t51, t52); // Eval C_inv step + (coeff_6 * z^6) let t54 = circuit_mul(in71, t5); // Eval C_inv step coeff_7 * z^7 let t55 = circuit_add(t53, t54); // Eval C_inv step + (coeff_7 * z^7) let t56 = circuit_mul(in72, t6); // Eval C_inv step coeff_8 * z^8 let t57 = circuit_add(t55, t56); // Eval C_inv step + (coeff_8 * z^8) let t58 = circuit_mul(in73, t7); // Eval C_inv step coeff_9 * z^9 let t59 = circuit_add(t57, t58); // Eval C_inv step + (coeff_9 * z^9) let t60 = circuit_mul(in74, t8); // Eval C_inv step coeff_10 * z^10 let t61 = circuit_add(t59, t60); // Eval C_inv step + (coeff_10 * z^10) let t62 = circuit_mul(in75, t9); // Eval C_inv step coeff_11 * z^11 let t63 = circuit_add(t61, t62); // Eval C_inv step + (coeff_11 * z^11) let t64 = circuit_mul(t31, t63); let t65 = circuit_sub(t64, in0); // c_of_z * c_inv_of_z - 1 let t66 = circuit_mul(in70, in1); let t67 = circuit_add(in64, t66); let t68 = circuit_mul(in65, in2); let t69 = circuit_mul(in71, in3); let t70 = circuit_add(t68, t69); let t71 = circuit_mul(in66, in4); let t72 = circuit_mul(in72, in5); let t73 = circuit_add(t71, t72); let t74 = circuit_mul(in67, in6); let t75 = circuit_mul(in73, in7); let t76 = circuit_add(t74, t75); let t77 = circuit_mul(in68, in8); let t78 = circuit_mul(in74, in9); let t79 = circuit_add(t77, t78); let t80 = circuit_mul(in69, in10); let t81 = circuit_mul(in75, in11); let t82 = circuit_add(t80, t81); let t83 = circuit_mul(in70, in12); let t84 = circuit_mul(in65, in13); let t85 = circuit_mul(in71, in14); let t86 = circuit_add(t84, t85); let t87 = circuit_mul(in66, in15); let t88 = circuit_mul(in72, in16); let t89 = circuit_add(t87, t88); let t90 = circuit_mul(in67, in17); let t91 = circuit_mul(in73, in18); let t92 = circuit_add(t90, t91); let t93 = circuit_mul(in68, in19); let t94 = circuit_mul(in74, in20); let t95 = circuit_add(t93, t94); let t96 = circuit_mul(in69, in21); let t97 = circuit_mul(in75, in22); let t98 = circuit_add(t96, t97); let t99 = circuit_mul(in46, in23); let t100 = circuit_mul(in47, in24); let t101 = circuit_mul(in48, in12); let t102 = circuit_mul(in49, in25); let t103 = circuit_mul(in50, in26); let t104 = circuit_mul(in52, in23); let t105 = circuit_mul(in53, in24); let t106 = circuit_mul(in54, in12); let t107 = circuit_mul(in55, in25); let t108 = circuit_mul(in56, in26); let t109 = circuit_mul(in70, in1); let t110 = circuit_add(in64, t109); let t111 = circuit_mul(in65, in27); let t112 = circuit_mul(in71, in28); let t113 = circuit_add(t111, t112); let t114 = circuit_mul(in66, in29); let t115 = circuit_mul(in72, in30); let t116 = circuit_add(t114, t115); let t117 = circuit_mul(in67, in18); let t118 = circuit_mul(in73, in31); let t119 = circuit_add(t117, t118); let t120 = circuit_mul(in68, in32); let t121 = circuit_mul(in74, in33); let t122 = circuit_add(t120, t121); let t123 = circuit_mul(in69, in34); let t124 = circuit_mul(in75, in35); let t125 = circuit_add(t123, t124); let t126 = circuit_mul(in70, in12); let t127 = circuit_mul(in65, in36); let t128 = circuit_mul(in71, in37); let t129 = circuit_add(t127, t128); let t130 = circuit_mul(in66, in38); let t131 = circuit_mul(in72, in39); let t132 = circuit_add(t130, t131); let t133 = circuit_mul(in67, in40); let t134 = circuit_mul(in73, in6); let t135 = circuit_add(t133, t134); let t136 = circuit_mul(in68, in41); let t137 = circuit_mul(in74, in42); let t138 = circuit_add(t136, t137); let t139 = circuit_mul(in69, in43); let t140 = circuit_mul(in75, in44); let t141 = circuit_add(t139, t140); let t142 = circuit_mul(t70, in57); // Eval C_inv_frob_1 step coeff_1 * z^1 let t143 = circuit_add(t67, t142); // Eval C_inv_frob_1 step + (coeff_1 * z^1) let t144 = circuit_mul(t73, t0); // Eval C_inv_frob_1 step coeff_2 * z^2 let t145 = circuit_add(t143, t144); // Eval C_inv_frob_1 step + (coeff_2 * z^2) let t146 = circuit_mul(t76, t1); // Eval C_inv_frob_1 step coeff_3 * z^3 let t147 = circuit_add(t145, t146); // Eval C_inv_frob_1 step + (coeff_3 * z^3) let t148 = circuit_mul(t79, t2); // Eval C_inv_frob_1 step coeff_4 * z^4 let t149 = circuit_add(t147, t148); // Eval C_inv_frob_1 step + (coeff_4 * z^4) let t150 = circuit_mul(t82, t3); // Eval C_inv_frob_1 step coeff_5 * z^5 let t151 = circuit_add(t149, t150); // Eval C_inv_frob_1 step + (coeff_5 * z^5) let t152 = circuit_mul(t83, t4); // Eval C_inv_frob_1 step coeff_6 * z^6 let t153 = circuit_add(t151, t152); // Eval C_inv_frob_1 step + (coeff_6 * z^6) let t154 = circuit_mul(t86, t5); // Eval C_inv_frob_1 step coeff_7 * z^7 let t155 = circuit_add(t153, t154); // Eval C_inv_frob_1 step + (coeff_7 * z^7) let t156 = circuit_mul(t89, t6); // Eval C_inv_frob_1 step coeff_8 * z^8 let t157 = circuit_add(t155, t156); // Eval C_inv_frob_1 step + (coeff_8 * z^8) let t158 = circuit_mul(t92, t7); // Eval C_inv_frob_1 step coeff_9 * z^9 let t159 = circuit_add(t157, t158); // Eval C_inv_frob_1 step + (coeff_9 * z^9) let t160 = circuit_mul(t95, t8); // Eval C_inv_frob_1 step coeff_10 * z^10 let t161 = circuit_add(t159, t160); // Eval C_inv_frob_1 step + (coeff_10 * z^10) let t162 = circuit_mul(t98, t9); // Eval C_inv_frob_1 step coeff_11 * z^11 let t163 = circuit_add(t161, t162); // Eval C_inv_frob_1 step + (coeff_11 * z^11) let t164 = circuit_mul(t99, in57); // Eval C_frob_2 step coeff_1 * z^1 let t165 = circuit_add(in45, t164); // Eval C_frob_2 step + (coeff_1 * z^1) let t166 = circuit_mul(t100, t0); // Eval C_frob_2 step coeff_2 * z^2 let t167 = circuit_add(t165, t166); // Eval C_frob_2 step + (coeff_2 * z^2) let t168 = circuit_mul(t101, t1); // Eval C_frob_2 step coeff_3 * z^3 let t169 = circuit_add(t167, t168); // Eval C_frob_2 step + (coeff_3 * z^3) let t170 = circuit_mul(t102, t2); // Eval C_frob_2 step coeff_4 * z^4 let t171 = circuit_add(t169, t170); // Eval C_frob_2 step + (coeff_4 * z^4) let t172 = circuit_mul(t103, t3); // Eval C_frob_2 step coeff_5 * z^5 let t173 = circuit_add(t171, t172); // Eval C_frob_2 step + (coeff_5 * z^5) let t174 = circuit_mul(in51, t4); // Eval C_frob_2 step coeff_6 * z^6 let t175 = circuit_add(t173, t174); // Eval C_frob_2 step + (coeff_6 * z^6) let t176 = circuit_mul(t104, t5); // Eval C_frob_2 step coeff_7 * z^7 let t177 = circuit_add(t175, t176); // Eval C_frob_2 step + (coeff_7 * z^7) let t178 = circuit_mul(t105, t6); // Eval C_frob_2 step coeff_8 * z^8 let t179 = circuit_add(t177, t178); // Eval C_frob_2 step + (coeff_8 * z^8) let t180 = circuit_mul(t106, t7); // Eval C_frob_2 step coeff_9 * z^9 let t181 = circuit_add(t179, t180); // Eval C_frob_2 step + (coeff_9 * z^9) let t182 = circuit_mul(t107, t8); // Eval C_frob_2 step coeff_10 * z^10 let t183 = circuit_add(t181, t182); // Eval C_frob_2 step + (coeff_10 * z^10) let t184 = circuit_mul(t108, t9); // Eval C_frob_2 step coeff_11 * z^11 let t185 = circuit_add(t183, t184); // Eval C_frob_2 step + (coeff_11 * z^11) let t186 = circuit_mul(t113, in57); // Eval C_inv_frob_3 step coeff_1 * z^1 let t187 = circuit_add(t110, t186); // Eval C_inv_frob_3 step + (coeff_1 * z^1) let t188 = circuit_mul(t116, t0); // Eval C_inv_frob_3 step coeff_2 * z^2 let t189 = circuit_add(t187, t188); // Eval C_inv_frob_3 step + (coeff_2 * z^2) let t190 = circuit_mul(t119, t1); // Eval C_inv_frob_3 step coeff_3 * z^3 let t191 = circuit_add(t189, t190); // Eval C_inv_frob_3 step + (coeff_3 * z^3) let t192 = circuit_mul(t122, t2); // Eval C_inv_frob_3 step coeff_4 * z^4 let t193 = circuit_add(t191, t192); // Eval C_inv_frob_3 step + (coeff_4 * z^4) let t194 = circuit_mul(t125, t3); // Eval C_inv_frob_3 step coeff_5 * z^5 let t195 = circuit_add(t193, t194); // Eval C_inv_frob_3 step + (coeff_5 * z^5) let t196 = circuit_mul(t126, t4); // Eval C_inv_frob_3 step coeff_6 * z^6 let t197 = circuit_add(t195, t196); // Eval C_inv_frob_3 step + (coeff_6 * z^6) let t198 = circuit_mul(t129, t5); // Eval C_inv_frob_3 step coeff_7 * z^7 let t199 = circuit_add(t197, t198); // Eval C_inv_frob_3 step + (coeff_7 * z^7) let t200 = circuit_mul(t132, t6); // Eval C_inv_frob_3 step coeff_8 * z^8 let t201 = circuit_add(t199, t200); // Eval C_inv_frob_3 step + (coeff_8 * z^8) let t202 = circuit_mul(t135, t7); // Eval C_inv_frob_3 step coeff_9 * z^9 let t203 = circuit_add(t201, t202); // Eval C_inv_frob_3 step + (coeff_9 * z^9) let t204 = circuit_mul(t138, t8); // Eval C_inv_frob_3 step coeff_10 * z^10 let t205 = circuit_add(t203, t204); // Eval C_inv_frob_3 step + (coeff_10 * z^10) let t206 = circuit_mul(t141, t9); // Eval C_inv_frob_3 step coeff_11 * z^11 let t207 = circuit_add(t205, t206); // Eval C_inv_frob_3 step + (coeff_11 * z^11) let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t31, t41, t63, t65, t163, t185, t207).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(INITIALIZE_MPCHECK_BN254_CONSTANTS.span()); // in0 - in44 // Fill inputs: circuit_inputs = circuit_inputs.next_2(lambda_root.w0); // in45 circuit_inputs = circuit_inputs.next_2(lambda_root.w1); // in46 circuit_inputs = circuit_inputs.next_2(lambda_root.w2); // in47 circuit_inputs = circuit_inputs.next_2(lambda_root.w3); // in48 circuit_inputs = circuit_inputs.next_2(lambda_root.w4); // in49 circuit_inputs = circuit_inputs.next_2(lambda_root.w5); // in50 circuit_inputs = circuit_inputs.next_2(lambda_root.w6); // in51 circuit_inputs = circuit_inputs.next_2(lambda_root.w7); // in52 circuit_inputs = circuit_inputs.next_2(lambda_root.w8); // in53 circuit_inputs = circuit_inputs.next_2(lambda_root.w9); // in54 circuit_inputs = circuit_inputs.next_2(lambda_root.w10); // in55 circuit_inputs = circuit_inputs.next_2(lambda_root.w11); // in56 circuit_inputs = circuit_inputs.next_2(z); // in57 circuit_inputs = circuit_inputs.next_2(scaling_factor.w0); // in58 circuit_inputs = circuit_inputs.next_2(scaling_factor.w2); // in59 circuit_inputs = circuit_inputs.next_2(scaling_factor.w4); // in60 circuit_inputs = circuit_inputs.next_2(scaling_factor.w6); // in61 circuit_inputs = circuit_inputs.next_2(scaling_factor.w8); // in62 circuit_inputs = circuit_inputs.next_2(scaling_factor.w10); // in63 circuit_inputs = circuit_inputs.next_2(c_inv.w0); // in64 circuit_inputs = circuit_inputs.next_2(c_inv.w1); // in65 circuit_inputs = circuit_inputs.next_2(c_inv.w2); // in66 circuit_inputs = circuit_inputs.next_2(c_inv.w3); // in67 circuit_inputs = circuit_inputs.next_2(c_inv.w4); // in68 circuit_inputs = circuit_inputs.next_2(c_inv.w5); // in69 circuit_inputs = circuit_inputs.next_2(c_inv.w6); // in70 circuit_inputs = circuit_inputs.next_2(c_inv.w7); // in71 circuit_inputs = circuit_inputs.next_2(c_inv.w8); // in72 circuit_inputs = circuit_inputs.next_2(c_inv.w9); // in73 circuit_inputs = circuit_inputs.next_2(c_inv.w10); // in74 circuit_inputs = circuit_inputs.next_2(c_inv.w11); // in75 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let c_of_z: u384 = outputs.get_output(t31); let scaling_factor_of_z: u384 = outputs.get_output(t41); let c_inv_of_z: u384 = outputs.get_output(t63); let lhs: u384 = outputs.get_output(t65); let c_inv_frob_1_of_z: u384 = outputs.get_output(t163); let c_frob_2_of_z: u384 = outputs.get_output(t185); let c_inv_frob_3_of_z: u384 = outputs.get_output(t207); return ( c_of_z, scaling_factor_of_z, c_inv_of_z, lhs, c_inv_frob_1_of_z, c_frob_2_of_z, c_inv_frob_3_of_z, ); } const INITIALIZE_MPCHECK_BN254_CONSTANTS: [u384; 45] = [ u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x12, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0xfde6a43f5daa971f3fa65955, limb1: 0x1b2522ec5eb28ded6895e1cd, limb2: 0x1d8c8daef3eee1e8, limb3: 0x0, }, u384 { limb0: 0x42b29c567e9c385ce480a71a, limb1: 0x4e34e2ac06ead4000d14d1e2, limb2: 0x217e400dc9351e77, limb3: 0x0, }, u384 { limb0: 0xfd28d102c0d147b2f4d521a7, limb1: 0x8481d22c6934ce844d72f250, limb2: 0x242b719062f6737b, limb3: 0x0, }, u384 { limb0: 0x43ac198484b8d9094aa82536, limb1: 0x1b9c22d81246ffc2e794e176, limb2: 0x359809094bd5c8e, limb3: 0x0, }, u384 { limb0: 0x6df7b44cbb259ef7cb58d5ed, limb1: 0xdd4ef1e69a0c1f0dd2949fa, limb2: 0x21436d48fcb50cc6, limb3: 0x0, }, u384 { limb0: 0x8a4f4f0831364cf35f78f771, limb1: 0x38a4311a86919d9c7c6c15f8, limb2: 0x18857a58f3b5bb30, limb3: 0x0, }, u384 { limb0: 0x6fc008e7d6998c82f7fc048b, limb1: 0x62b7adefd44038ab3c0bbad9, limb2: 0x2c84bbad27c36715, limb3: 0x0, }, u384 { limb0: 0xa8697e0c9c36d8ca3339a7b5, limb1: 0x6d1eab6fcd18b99ad4afd096, limb2: 0xc33b1c70e4fd11b, limb3: 0x0, }, u384 { limb0: 0x5371c546d428780a6e3dcfa8, limb1: 0x13fe08bea73305ff6bdac77c, limb2: 0x1b007294a55accce, limb3: 0x0, }, u384 { limb0: 0x4f501fe811493d72543a3977, limb1: 0xefe88dd8e6965b3adae92c97, limb2: 0x215d42e7ac7bd17c, limb3: 0x0, }, u384 { limb0: 0x6871ca8d3c208c16d87cfd46, limb1: 0xb85045b68181585d97816a91, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x8eeec7e5ca5cf05f80f362ac, limb1: 0xa6327cfe12150b8e74799277, limb2: 0x246996f3b4fae7e6, limb3: 0x0, }, u384 { limb0: 0x6a8b264dde75f4f798d6a3f2, limb1: 0x9d2b22ca22ceca702eeb88c3, limb2: 0x12d7c0c3ed42be41, limb3: 0x0, }, u384 { limb0: 0xb7c9dce1665d51c640fcba2, limb1: 0x4ba4cc8bd75a079432ae2a1d, limb2: 0x16c9e55061ebae20, limb3: 0x0, }, u384 { limb0: 0x6b48f98a7b4f4463e3a7dba0, limb1: 0x33ce738a184c89d94a0e7840, limb2: 0xc38dce27e3b2cae, limb3: 0x0, }, u384 { limb0: 0x8fa25bd282d37f632623b0e3, limb1: 0x704b5a7ec796f2b21807dc9, limb2: 0x7c03cbcac41049a, limb3: 0x0, }, u384 { limb0: 0xfa7a164080faed1f0d24275a, limb1: 0xaa7b569817e0966cba582096, limb2: 0xf20e129e47c9363, limb3: 0x0, }, u384 { limb0: 0x1bdec763c13b4711cd2b8126, limb1: 0x9f3a80b03b0b1c923685d2ea, limb2: 0x2c145edbe7fd8aee, limb3: 0x0, }, u384 { limb0: 0xf8b1c1a56586ff93e080f8bc, limb1: 0x559897c6ad411fb25b75afb7, limb2: 0x3df92c5b96e3914, limb3: 0x0, }, u384 { limb0: 0x678e2ac024c6b8ee6e0c2c4b, limb1: 0xa27fb246c7729f7db080cb99, limb2: 0x12acf2ca76fd0675, limb3: 0x0, }, u384 { limb0: 0x1500054667f8140c6a3f2d9f, limb1: 0xa4523cf7da4e525e2ba6a315, limb2: 0x1563dbde3bd6d35b, limb3: 0x0, }, u384 { limb0: 0xbb966e3de4bd44e5607cfd49, limb1: 0x5e6dd9e7e0acccb0c28f069f, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0xbb966e3de4bd44e5607cfd48, limb1: 0x5e6dd9e7e0acccb0c28f069f, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0xacdb5c4f5763473177fffffe, limb1: 0x59e26bcea0d48bacd4f263f1, limb2: 0x0, limb3: 0x0, }, u384 { limb0: 0xacdb5c4f5763473177ffffff, limb1: 0x59e26bcea0d48bacd4f263f1, limb2: 0x0, limb3: 0x0, }, u384 { limb0: 0x67dfc8fabd3581ad840ddd76, limb1: 0xb2bdfa8fef85fa07122bde8d, limb2: 0x13d0c369615f7bb0, limb3: 0x0, }, u384 { limb0: 0xac285af5685d3f90eacf7a66, limb1: 0xfc2bf531eb331a053a35744c, limb2: 0x18a0f4219f4fdff6, limb3: 0x0, }, u384 { limb0: 0x64e2b5a5bf22f67654883ae6, limb1: 0x79c3e050c9ca2a428908a812, limb2: 0xc3a5e9c462a6547, limb3: 0x0, }, u384 { limb0: 0x345582cc92fd973c74bd77f4, limb1: 0x5bdd2055c255cf9d9e08c1d9, limb2: 0x2ce02aa5f9bf8cd6, limb3: 0x0, }, u384 { limb0: 0xde227b850aea3f23790405d6, limb1: 0x7fac149bfaefbac11b155498, limb2: 0x17ded419ed7be4f9, limb3: 0x0, }, u384 { limb0: 0x4150a79753fb0cd31cc99cc0, limb1: 0x2fb81a8dccd8a9b4441d64f3, limb2: 0x1bfe7b214c029424, limb3: 0x0, }, u384 { limb0: 0x9efaf0f0f1a228f0d5662fbd, limb1: 0xd15da0ec97a9b8346513297b, limb2: 0x697b9c523e0390e, limb3: 0x0, }, u384 { limb0: 0x182d2db0c413901c32b0c6fe, limb1: 0xb5186d6ac4c723b85d3f78a3, limb2: 0x7a0e052f2b1c443, limb3: 0x0, }, u384 { limb0: 0x39c0d06b220500933945267f, limb1: 0x5dc79824a3792597356c892c, limb2: 0x1b76a37fba85f3cd, limb3: 0x0, }, u384 { limb0: 0x97d439ec7694aa2bf4c0c101, limb1: 0x6cbeee33576139d7f03a5e3, limb2: 0xabf8b60be77d73, limb3: 0x0, }, u384 { limb0: 0x9201927eeb0a69546f1fd1, limb1: 0x5924b2691fb5e5685558c04, limb2: 0x1c938b097fd22479, limb3: 0x0, }, u384 { limb0: 0x98ff2631380cab2baaa586de, limb1: 0xa9f30e6dec26094f0fdf31bf, limb2: 0x4f1de41b3d1766f, limb3: 0x0, }, u384 { limb0: 0x38f14e77cfd95a083f4c261, limb1: 0x3e8c6565b7b72e1b0e78c27f, limb2: 0x2429efd69b073ae2, limb3: 0x0, }, u384 { limb0: 0xd8cf6ebab94d0cb3b2594c64, limb1: 0xb14b900e9507e9327600ecc7, limb2: 0x28a411b634f09b8f, limb3: 0x0, }, u384 { limb0: 0x737f96e55fe3ed9d730c239f, limb1: 0xfeb0f6ef0cd21d04a44a9e08, limb2: 0x23d5e999e1910a12, limb3: 0x0, }, u384 { limb0: 0x272122f5e8257f43bbb36087, limb1: 0x88982b28b4a8aea95364059e, limb2: 0x1465d351952f0c05, limb3: 0x0, }, u384 { limb0: 0x200280211f25041384282499, limb1: 0x9fb1b2282a48633d3e2ddaea, limb2: 0x16db366a59b1dd0b, limb3: 0x0, }, u384 { limb0: 0x50449cdc780cfbfaa5cc3649, limb1: 0x337d84bbcba34a53a41f1ee, limb2: 0x28c36e1fee7fdbe6, limb3: 0x0, }, ]; #[inline(always)] pub fn run_BN254_MP_CHECK_BIT00_2P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, G2_line_2nd_0_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, G2_line_2nd_0_1: G2Line, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, z: u384, c1: u384, ) -> (u384,) { // CONSTANT stack let in0 = CE::> {}; // -0x9 % p let in1 = CE::> {}; // 0x1 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let (in23, in24, in25) = (CE::> {}, CE::> {}, CE::> {}); let in26 = CE::> {}; let t0 = circuit_mul(in25, in25); // compute z^2 let t1 = circuit_mul(t0, in25); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, in25); // compute z^7 let t4 = circuit_mul(t3, t0); // compute z^9 let t5 = circuit_mul(in23, in23); // Square f evaluation in Z, the result of previous bit. let t6 = circuit_mul(in0, in5); let t7 = circuit_add(in4, t6); let t8 = circuit_mul(t7, in3); // eval bn line by xNegOverY let t9 = circuit_mul(in0, in7); let t10 = circuit_add(in6, t9); let t11 = circuit_mul(t10, in2); // eval bn line by yInv let t12 = circuit_mul(in5, in3); // eval bn line by xNegOverY let t13 = circuit_mul(in7, in2); // eval bn line by yInv let t14 = circuit_mul(t8, in25); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t15 = circuit_add(in1, t14); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t16 = circuit_mul(t11, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t17 = circuit_add(t15, t16); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t18 = circuit_mul(t12, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t19 = circuit_add(t17, t18); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t20 = circuit_mul(t13, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t21 = circuit_add(t19, t20); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t22 = circuit_mul(t5, t21); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t23 = circuit_mul(in0, in9); let t24 = circuit_add(in8, t23); let t25 = circuit_mul(t24, in13); // eval bn line by xNegOverY let t26 = circuit_mul(in0, in11); let t27 = circuit_add(in10, t26); let t28 = circuit_mul(t27, in12); // eval bn line by yInv let t29 = circuit_mul(in9, in13); // eval bn line by xNegOverY let t30 = circuit_mul(in11, in12); // eval bn line by yInv let t31 = circuit_mul(t25, in25); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t32 = circuit_add(in1, t31); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t33 = circuit_mul(t28, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t34 = circuit_add(t32, t33); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t35 = circuit_mul(t29, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t36 = circuit_add(t34, t35); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t37 = circuit_mul(t30, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t38 = circuit_add(t36, t37); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t39 = circuit_mul(t22, t38); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t40 = circuit_mul( t39, t39, ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 let t41 = circuit_mul(in0, in15); let t42 = circuit_add(in14, t41); let t43 = circuit_mul(t42, in3); // eval bn line by xNegOverY let t44 = circuit_mul(in0, in17); let t45 = circuit_add(in16, t44); let t46 = circuit_mul(t45, in2); // eval bn line by yInv let t47 = circuit_mul(in15, in3); // eval bn line by xNegOverY let t48 = circuit_mul(in17, in2); // eval bn line by yInv let t49 = circuit_mul(t43, in25); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t50 = circuit_add(in1, t49); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t51 = circuit_mul(t46, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t52 = circuit_add(t50, t51); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t53 = circuit_mul(t47, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t54 = circuit_add(t52, t53); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t55 = circuit_mul(t48, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t56 = circuit_add(t54, t55); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t57 = circuit_mul(t40, t56); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t58 = circuit_mul(in0, in19); let t59 = circuit_add(in18, t58); let t60 = circuit_mul(t59, in13); // eval bn line by xNegOverY let t61 = circuit_mul(in0, in21); let t62 = circuit_add(in20, t61); let t63 = circuit_mul(t62, in12); // eval bn line by yInv let t64 = circuit_mul(in19, in13); // eval bn line by xNegOverY let t65 = circuit_mul(in21, in12); // eval bn line by yInv let t66 = circuit_mul(t60, in25); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t67 = circuit_add(in1, t66); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t68 = circuit_mul(t63, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t69 = circuit_add(t67, t68); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t70 = circuit_mul(t64, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t71 = circuit_add(t69, t70); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t72 = circuit_mul(t65, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t73 = circuit_add(t71, t72); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t74 = circuit_mul(t57, t73); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t75 = circuit_sub(t74, in24); // (Π(i,k) (Pk(z))) - Ri(z) let t76 = circuit_mul(in26, in22); let t77 = circuit_add(t76, t75); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t77,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in2 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in3 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r0a0); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r0a1); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r1a0); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r1a1); // in11 circuit_inputs = circuit_inputs.next_2(yInv_1); // in12 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in15 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in16 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r0a0); // in18 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r0a1); // in19 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r1a0); // in20 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r1a1); // in21 circuit_inputs = circuit_inputs.next_2(lhs_i); // in22 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in23 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in24 circuit_inputs = circuit_inputs.next_2(z); // in25 circuit_inputs = circuit_inputs.next_2(c1); // in26 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let lhs_i_plus_one: u384 = outputs.get_output(t77); return (lhs_i_plus_one,); } #[inline(always)] pub fn run_BN254_MP_CHECK_BIT00_3P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, G2_line_2nd_0_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, G2_line_2nd_0_1: G2Line, yInv_2: u384, xNegOverY_2: u384, Q_2: G2Point, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, z: u384, c1: u384, ) -> (G2Point, u384) { // CONSTANT stack let in0 = CE::> {}; // -0x9 % p let in1 = CE::> {}; // 0x1 let in2 = CE::> {}; // 0x3 let in3 = CE::> {}; // 0x6 let in4 = CE::> {}; // 0x0 // INPUT stack let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let (in23, in24, in25) = (CE::> {}, CE::> {}, CE::> {}); let (in26, in27, in28) = (CE::> {}, CE::> {}, CE::> {}); let (in29, in30, in31) = (CE::> {}, CE::> {}, CE::> {}); let (in32, in33, in34) = (CE::> {}, CE::> {}, CE::> {}); let in35 = CE::> {}; let t0 = circuit_mul(in34, in34); // compute z^2 let t1 = circuit_mul(t0, in34); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, in34); // compute z^7 let t4 = circuit_mul(t3, t0); // compute z^9 let t5 = circuit_mul(in32, in32); // Square f evaluation in Z, the result of previous bit. let t6 = circuit_mul(in0, in8); let t7 = circuit_add(in7, t6); let t8 = circuit_mul(t7, in6); // eval bn line by xNegOverY let t9 = circuit_mul(in0, in10); let t10 = circuit_add(in9, t9); let t11 = circuit_mul(t10, in5); // eval bn line by yInv let t12 = circuit_mul(in8, in6); // eval bn line by xNegOverY let t13 = circuit_mul(in10, in5); // eval bn line by yInv let t14 = circuit_mul(t8, in34); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t15 = circuit_add(in1, t14); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t16 = circuit_mul(t11, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t17 = circuit_add(t15, t16); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t18 = circuit_mul(t12, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t19 = circuit_add(t17, t18); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t20 = circuit_mul(t13, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t21 = circuit_add(t19, t20); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t22 = circuit_mul(t5, t21); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t23 = circuit_mul(in0, in12); let t24 = circuit_add(in11, t23); let t25 = circuit_mul(t24, in16); // eval bn line by xNegOverY let t26 = circuit_mul(in0, in14); let t27 = circuit_add(in13, t26); let t28 = circuit_mul(t27, in15); // eval bn line by yInv let t29 = circuit_mul(in12, in16); // eval bn line by xNegOverY let t30 = circuit_mul(in14, in15); // eval bn line by yInv let t31 = circuit_mul(t25, in34); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t32 = circuit_add(in1, t31); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t33 = circuit_mul(t28, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t34 = circuit_add(t32, t33); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t35 = circuit_mul(t29, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t36 = circuit_add(t34, t35); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t37 = circuit_mul(t30, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t38 = circuit_add(t36, t37); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t39 = circuit_mul(t22, t38); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t40 = circuit_add(in27, in28); // Doubling slope numerator start let t41 = circuit_sub(in27, in28); let t42 = circuit_mul(t40, t41); let t43 = circuit_mul(in27, in28); let t44 = circuit_mul(t42, in2); let t45 = circuit_mul(t43, in3); // Doubling slope numerator end let t46 = circuit_add(in29, in29); // Fp2 add coeff 0/1 let t47 = circuit_add(in30, in30); // Fp2 add coeff 1/1 let t48 = circuit_mul(t46, t46); // Fp2 Inv start let t49 = circuit_mul(t47, t47); let t50 = circuit_add(t48, t49); let t51 = circuit_inverse(t50); let t52 = circuit_mul(t46, t51); // Fp2 Inv real part end let t53 = circuit_mul(t47, t51); let t54 = circuit_sub(in4, t53); // Fp2 Inv imag part end let t55 = circuit_mul(t44, t52); // Fp2 mul start let t56 = circuit_mul(t45, t54); let t57 = circuit_sub(t55, t56); // Fp2 mul real part end let t58 = circuit_mul(t44, t54); let t59 = circuit_mul(t45, t52); let t60 = circuit_add(t58, t59); // Fp2 mul imag part end let t61 = circuit_add(t57, t60); let t62 = circuit_sub(t57, t60); let t63 = circuit_mul(t61, t62); let t64 = circuit_mul(t57, t60); let t65 = circuit_add(t64, t64); let t66 = circuit_add(in27, in27); // Fp2 add coeff 0/1 let t67 = circuit_add(in28, in28); // Fp2 add coeff 1/1 let t68 = circuit_sub(t63, t66); // Fp2 sub coeff 0/1 let t69 = circuit_sub(t65, t67); // Fp2 sub coeff 1/1 let t70 = circuit_sub(in27, t68); // Fp2 sub coeff 0/1 let t71 = circuit_sub(in28, t69); // Fp2 sub coeff 1/1 let t72 = circuit_mul(t57, t70); // Fp2 mul start let t73 = circuit_mul(t60, t71); let t74 = circuit_sub(t72, t73); // Fp2 mul real part end let t75 = circuit_mul(t57, t71); let t76 = circuit_mul(t60, t70); let t77 = circuit_add(t75, t76); // Fp2 mul imag part end let t78 = circuit_sub(t74, in29); // Fp2 sub coeff 0/1 let t79 = circuit_sub(t77, in30); // Fp2 sub coeff 1/1 let t80 = circuit_mul(t57, in27); // Fp2 mul start let t81 = circuit_mul(t60, in28); let t82 = circuit_sub(t80, t81); // Fp2 mul real part end let t83 = circuit_mul(t57, in28); let t84 = circuit_mul(t60, in27); let t85 = circuit_add(t83, t84); // Fp2 mul imag part end let t86 = circuit_sub(t82, in29); // Fp2 sub coeff 0/1 let t87 = circuit_sub(t85, in30); // Fp2 sub coeff 1/1 let t88 = circuit_mul(in0, t60); let t89 = circuit_add(t57, t88); let t90 = circuit_mul(t89, in26); // eval bn line by xNegOverY let t91 = circuit_mul(in0, t87); let t92 = circuit_add(t86, t91); let t93 = circuit_mul(t92, in25); // eval bn line by yInv let t94 = circuit_mul(t60, in26); // eval bn line by xNegOverY let t95 = circuit_mul(t87, in25); // eval bn line by yInv let t96 = circuit_mul(t90, in34); // Eval sparse poly line_2p_1 step coeff_1 * z^1 let t97 = circuit_add(in1, t96); // Eval sparse poly line_2p_1 step + coeff_1 * z^1 let t98 = circuit_mul(t93, t1); // Eval sparse poly line_2p_1 step coeff_3 * z^3 let t99 = circuit_add(t97, t98); // Eval sparse poly line_2p_1 step + coeff_3 * z^3 let t100 = circuit_mul(t94, t3); // Eval sparse poly line_2p_1 step coeff_7 * z^7 let t101 = circuit_add(t99, t100); // Eval sparse poly line_2p_1 step + coeff_7 * z^7 let t102 = circuit_mul(t95, t4); // Eval sparse poly line_2p_1 step coeff_9 * z^9 let t103 = circuit_add(t101, t102); // Eval sparse poly line_2p_1 step + coeff_9 * z^9 let t104 = circuit_mul(t39, t103); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t105 = circuit_mul( t104, t104, ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 let t106 = circuit_mul(in0, in18); let t107 = circuit_add(in17, t106); let t108 = circuit_mul(t107, in6); // eval bn line by xNegOverY let t109 = circuit_mul(in0, in20); let t110 = circuit_add(in19, t109); let t111 = circuit_mul(t110, in5); // eval bn line by yInv let t112 = circuit_mul(in18, in6); // eval bn line by xNegOverY let t113 = circuit_mul(in20, in5); // eval bn line by yInv let t114 = circuit_mul(t108, in34); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t115 = circuit_add(in1, t114); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t116 = circuit_mul(t111, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t117 = circuit_add(t115, t116); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t118 = circuit_mul(t112, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t119 = circuit_add(t117, t118); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t120 = circuit_mul(t113, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t121 = circuit_add(t119, t120); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t122 = circuit_mul(t105, t121); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t123 = circuit_mul(in0, in22); let t124 = circuit_add(in21, t123); let t125 = circuit_mul(t124, in16); // eval bn line by xNegOverY let t126 = circuit_mul(in0, in24); let t127 = circuit_add(in23, t126); let t128 = circuit_mul(t127, in15); // eval bn line by yInv let t129 = circuit_mul(in22, in16); // eval bn line by xNegOverY let t130 = circuit_mul(in24, in15); // eval bn line by yInv let t131 = circuit_mul(t125, in34); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t132 = circuit_add(in1, t131); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t133 = circuit_mul(t128, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t134 = circuit_add(t132, t133); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t135 = circuit_mul(t129, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t136 = circuit_add(t134, t135); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t137 = circuit_mul(t130, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t138 = circuit_add(t136, t137); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t139 = circuit_mul(t122, t138); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t140 = circuit_add(t68, t69); // Doubling slope numerator start let t141 = circuit_sub(t68, t69); let t142 = circuit_mul(t140, t141); let t143 = circuit_mul(t68, t69); let t144 = circuit_mul(t142, in2); let t145 = circuit_mul(t143, in3); // Doubling slope numerator end let t146 = circuit_add(t78, t78); // Fp2 add coeff 0/1 let t147 = circuit_add(t79, t79); // Fp2 add coeff 1/1 let t148 = circuit_mul(t146, t146); // Fp2 Inv start let t149 = circuit_mul(t147, t147); let t150 = circuit_add(t148, t149); let t151 = circuit_inverse(t150); let t152 = circuit_mul(t146, t151); // Fp2 Inv real part end let t153 = circuit_mul(t147, t151); let t154 = circuit_sub(in4, t153); // Fp2 Inv imag part end let t155 = circuit_mul(t144, t152); // Fp2 mul start let t156 = circuit_mul(t145, t154); let t157 = circuit_sub(t155, t156); // Fp2 mul real part end let t158 = circuit_mul(t144, t154); let t159 = circuit_mul(t145, t152); let t160 = circuit_add(t158, t159); // Fp2 mul imag part end let t161 = circuit_add(t157, t160); let t162 = circuit_sub(t157, t160); let t163 = circuit_mul(t161, t162); let t164 = circuit_mul(t157, t160); let t165 = circuit_add(t164, t164); let t166 = circuit_add(t68, t68); // Fp2 add coeff 0/1 let t167 = circuit_add(t69, t69); // Fp2 add coeff 1/1 let t168 = circuit_sub(t163, t166); // Fp2 sub coeff 0/1 let t169 = circuit_sub(t165, t167); // Fp2 sub coeff 1/1 let t170 = circuit_sub(t68, t168); // Fp2 sub coeff 0/1 let t171 = circuit_sub(t69, t169); // Fp2 sub coeff 1/1 let t172 = circuit_mul(t157, t170); // Fp2 mul start let t173 = circuit_mul(t160, t171); let t174 = circuit_sub(t172, t173); // Fp2 mul real part end let t175 = circuit_mul(t157, t171); let t176 = circuit_mul(t160, t170); let t177 = circuit_add(t175, t176); // Fp2 mul imag part end let t178 = circuit_sub(t174, t78); // Fp2 sub coeff 0/1 let t179 = circuit_sub(t177, t79); // Fp2 sub coeff 1/1 let t180 = circuit_mul(t157, t68); // Fp2 mul start let t181 = circuit_mul(t160, t69); let t182 = circuit_sub(t180, t181); // Fp2 mul real part end let t183 = circuit_mul(t157, t69); let t184 = circuit_mul(t160, t68); let t185 = circuit_add(t183, t184); // Fp2 mul imag part end let t186 = circuit_sub(t182, t78); // Fp2 sub coeff 0/1 let t187 = circuit_sub(t185, t79); // Fp2 sub coeff 1/1 let t188 = circuit_mul(in0, t160); let t189 = circuit_add(t157, t188); let t190 = circuit_mul(t189, in26); // eval bn line by xNegOverY let t191 = circuit_mul(in0, t187); let t192 = circuit_add(t186, t191); let t193 = circuit_mul(t192, in25); // eval bn line by yInv let t194 = circuit_mul(t160, in26); // eval bn line by xNegOverY let t195 = circuit_mul(t187, in25); // eval bn line by yInv let t196 = circuit_mul(t190, in34); // Eval sparse poly line_2p_1 step coeff_1 * z^1 let t197 = circuit_add(in1, t196); // Eval sparse poly line_2p_1 step + coeff_1 * z^1 let t198 = circuit_mul(t193, t1); // Eval sparse poly line_2p_1 step coeff_3 * z^3 let t199 = circuit_add(t197, t198); // Eval sparse poly line_2p_1 step + coeff_3 * z^3 let t200 = circuit_mul(t194, t3); // Eval sparse poly line_2p_1 step coeff_7 * z^7 let t201 = circuit_add(t199, t200); // Eval sparse poly line_2p_1 step + coeff_7 * z^7 let t202 = circuit_mul(t195, t4); // Eval sparse poly line_2p_1 step coeff_9 * z^9 let t203 = circuit_add(t201, t202); // Eval sparse poly line_2p_1 step + coeff_9 * z^9 let t204 = circuit_mul(t139, t203); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t205 = circuit_sub(t204, in33); // (Π(i,k) (Pk(z))) - Ri(z) let t206 = circuit_mul(in35, in31); let t207 = circuit_add(t206, t205); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t168, t169, t178, t179, t207).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in2 circuit_inputs = circuit_inputs.next_2([0x6, 0x0, 0x0, 0x0]); // in3 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in4 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in5 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r0a0); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r0a1); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r1a0); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_0.r1a1); // in14 circuit_inputs = circuit_inputs.next_2(yInv_1); // in15 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in16 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in18 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in19 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in20 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r0a0); // in21 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r0a1); // in22 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r1a0); // in23 circuit_inputs = circuit_inputs.next_2(G2_line_2nd_0_1.r1a1); // in24 circuit_inputs = circuit_inputs.next_2(yInv_2); // in25 circuit_inputs = circuit_inputs.next_2(xNegOverY_2); // in26 circuit_inputs = circuit_inputs.next_2(Q_2.x0); // in27 circuit_inputs = circuit_inputs.next_2(Q_2.x1); // in28 circuit_inputs = circuit_inputs.next_2(Q_2.y0); // in29 circuit_inputs = circuit_inputs.next_2(Q_2.y1); // in30 circuit_inputs = circuit_inputs.next_2(lhs_i); // in31 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in32 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in33 circuit_inputs = circuit_inputs.next_2(z); // in34 circuit_inputs = circuit_inputs.next_2(c1); // in35 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t168), x1: outputs.get_output(t169), y0: outputs.get_output(t178), y1: outputs.get_output(t179), }; let lhs_i_plus_one: u384 = outputs.get_output(t207); return (Q0, lhs_i_plus_one); } #[inline(always)] pub fn run_BN254_MP_CHECK_BIT01_2P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, G2_line_dbl_10: G2Line, G2_line_add_10: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, G2_line_dbl_11: G2Line, G2_line_add_11: G2Line, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, c_or_cinv_of_z: u384, z: u384, c1: u384, ) -> (u384,) { // CONSTANT stack let in0 = CE::> {}; // -0x9 % p let in1 = CE::> {}; // 0x1 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let (in23, in24, in25) = (CE::> {}, CE::> {}, CE::> {}); let (in26, in27, in28) = (CE::> {}, CE::> {}, CE::> {}); let (in29, in30, in31) = (CE::> {}, CE::> {}, CE::> {}); let (in32, in33, in34) = (CE::> {}, CE::> {}, CE::> {}); let in35 = CE::> {}; let t0 = circuit_mul(in34, in34); // compute z^2 let t1 = circuit_mul(t0, in34); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, in34); // compute z^7 let t4 = circuit_mul(t3, t0); // compute z^9 let t5 = circuit_mul(in31, in31); // Square f evaluation in Z, the result of previous bit. let t6 = circuit_mul(in0, in5); let t7 = circuit_add(in4, t6); let t8 = circuit_mul(t7, in3); // eval bn line by xNegOverY let t9 = circuit_mul(in0, in7); let t10 = circuit_add(in6, t9); let t11 = circuit_mul(t10, in2); // eval bn line by yInv let t12 = circuit_mul(in5, in3); // eval bn line by xNegOverY let t13 = circuit_mul(in7, in2); // eval bn line by yInv let t14 = circuit_mul(t8, in34); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t15 = circuit_add(in1, t14); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t16 = circuit_mul(t11, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t17 = circuit_add(t15, t16); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t18 = circuit_mul(t12, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t19 = circuit_add(t17, t18); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t20 = circuit_mul(t13, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t21 = circuit_add(t19, t20); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t22 = circuit_mul(t5, t21); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t23 = circuit_mul(in0, in9); let t24 = circuit_add(in8, t23); let t25 = circuit_mul(t24, in17); // eval bn line by xNegOverY let t26 = circuit_mul(in0, in11); let t27 = circuit_add(in10, t26); let t28 = circuit_mul(t27, in16); // eval bn line by yInv let t29 = circuit_mul(in9, in17); // eval bn line by xNegOverY let t30 = circuit_mul(in11, in16); // eval bn line by yInv let t31 = circuit_mul(t25, in34); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t32 = circuit_add(in1, t31); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t33 = circuit_mul(t28, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t34 = circuit_add(t32, t33); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t35 = circuit_mul(t29, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t36 = circuit_add(t34, t35); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t37 = circuit_mul(t30, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t38 = circuit_add(t36, t37); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t39 = circuit_mul(t22, t38); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t40 = circuit_mul( t39, t39, ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 let t41 = circuit_mul(in0, in13); let t42 = circuit_add(in12, t41); let t43 = circuit_mul(t42, in3); // eval bn line by xNegOverY let t44 = circuit_mul(in0, in15); let t45 = circuit_add(in14, t44); let t46 = circuit_mul(t45, in2); // eval bn line by yInv let t47 = circuit_mul(in13, in3); // eval bn line by xNegOverY let t48 = circuit_mul(in15, in2); // eval bn line by yInv let t49 = circuit_mul(in0, in19); let t50 = circuit_add(in18, t49); let t51 = circuit_mul(t50, in3); // eval bn line by xNegOverY let t52 = circuit_mul(in0, in21); let t53 = circuit_add(in20, t52); let t54 = circuit_mul(t53, in2); // eval bn line by yInv let t55 = circuit_mul(in19, in3); // eval bn line by xNegOverY let t56 = circuit_mul(in21, in2); // eval bn line by yInv let t57 = circuit_mul(t43, in34); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t58 = circuit_add(in1, t57); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t59 = circuit_mul(t46, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t60 = circuit_add(t58, t59); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t61 = circuit_mul(t47, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t62 = circuit_add(t60, t61); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t63 = circuit_mul(t48, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t64 = circuit_add(t62, t63); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t65 = circuit_mul(t40, t64); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t66 = circuit_mul(t51, in34); // Eval sparse poly line_0p_2 step coeff_1 * z^1 let t67 = circuit_add(in1, t66); // Eval sparse poly line_0p_2 step + coeff_1 * z^1 let t68 = circuit_mul(t54, t1); // Eval sparse poly line_0p_2 step coeff_3 * z^3 let t69 = circuit_add(t67, t68); // Eval sparse poly line_0p_2 step + coeff_3 * z^3 let t70 = circuit_mul(t55, t3); // Eval sparse poly line_0p_2 step coeff_7 * z^7 let t71 = circuit_add(t69, t70); // Eval sparse poly line_0p_2 step + coeff_7 * z^7 let t72 = circuit_mul(t56, t4); // Eval sparse poly line_0p_2 step coeff_9 * z^9 let t73 = circuit_add(t71, t72); // Eval sparse poly line_0p_2 step + coeff_9 * z^9 let t74 = circuit_mul(t65, t73); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t75 = circuit_mul(in0, in23); let t76 = circuit_add(in22, t75); let t77 = circuit_mul(t76, in17); // eval bn line by xNegOverY let t78 = circuit_mul(in0, in25); let t79 = circuit_add(in24, t78); let t80 = circuit_mul(t79, in16); // eval bn line by yInv let t81 = circuit_mul(in23, in17); // eval bn line by xNegOverY let t82 = circuit_mul(in25, in16); // eval bn line by yInv let t83 = circuit_mul(in0, in27); let t84 = circuit_add(in26, t83); let t85 = circuit_mul(t84, in17); // eval bn line by xNegOverY let t86 = circuit_mul(in0, in29); let t87 = circuit_add(in28, t86); let t88 = circuit_mul(t87, in16); // eval bn line by yInv let t89 = circuit_mul(in27, in17); // eval bn line by xNegOverY let t90 = circuit_mul(in29, in16); // eval bn line by yInv let t91 = circuit_mul(t77, in34); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t92 = circuit_add(in1, t91); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t93 = circuit_mul(t80, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t94 = circuit_add(t92, t93); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t95 = circuit_mul(t81, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t96 = circuit_add(t94, t95); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t97 = circuit_mul(t82, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t98 = circuit_add(t96, t97); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t99 = circuit_mul(t74, t98); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t100 = circuit_mul(t85, in34); // Eval sparse poly line_1p_2 step coeff_1 * z^1 let t101 = circuit_add(in1, t100); // Eval sparse poly line_1p_2 step + coeff_1 * z^1 let t102 = circuit_mul(t88, t1); // Eval sparse poly line_1p_2 step coeff_3 * z^3 let t103 = circuit_add(t101, t102); // Eval sparse poly line_1p_2 step + coeff_3 * z^3 let t104 = circuit_mul(t89, t3); // Eval sparse poly line_1p_2 step coeff_7 * z^7 let t105 = circuit_add(t103, t104); // Eval sparse poly line_1p_2 step + coeff_7 * z^7 let t106 = circuit_mul(t90, t4); // Eval sparse poly line_1p_2 step coeff_9 * z^9 let t107 = circuit_add(t105, t106); // Eval sparse poly line_1p_2 step + coeff_9 * z^9 let t108 = circuit_mul(t99, t107); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t109 = circuit_mul(t108, in33); let t110 = circuit_sub(t109, in32); // (Π(i,k) (Pk(z))) - Ri(z) let t111 = circuit_mul(in35, in30); let t112 = circuit_add(t111, t110); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t112,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in2 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in3 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_10.r0a0); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_10.r0a1); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_10.r1a0); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_10.r1a1); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_add_10.r0a0); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_add_10.r0a1); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_add_10.r1a0); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_add_10.r1a1); // in15 circuit_inputs = circuit_inputs.next_2(yInv_1); // in16 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in18 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in19 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in20 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in21 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_11.r0a0); // in22 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_11.r0a1); // in23 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_11.r1a0); // in24 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_11.r1a1); // in25 circuit_inputs = circuit_inputs.next_2(G2_line_add_11.r0a0); // in26 circuit_inputs = circuit_inputs.next_2(G2_line_add_11.r0a1); // in27 circuit_inputs = circuit_inputs.next_2(G2_line_add_11.r1a0); // in28 circuit_inputs = circuit_inputs.next_2(G2_line_add_11.r1a1); // in29 circuit_inputs = circuit_inputs.next_2(lhs_i); // in30 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in31 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in32 circuit_inputs = circuit_inputs.next_2(c_or_cinv_of_z); // in33 circuit_inputs = circuit_inputs.next_2(z); // in34 circuit_inputs = circuit_inputs.next_2(c1); // in35 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let lhs_i_plus_one: u384 = outputs.get_output(t112); return (lhs_i_plus_one,); } #[inline(always)] pub fn run_BN254_MP_CHECK_BIT01_3P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, G2_line_dbl_10: G2Line, G2_line_add_10: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, G2_line_dbl_11: G2Line, G2_line_add_11: G2Line, yInv_2: u384, xNegOverY_2: u384, Q_2: G2Point, Q_or_Q_neg_2: G2Point, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, c_or_cinv_of_z: u384, z: u384, c1: u384, ) -> (G2Point, u384) { // CONSTANT stack let in0 = CE::> {}; // -0x9 % p let in1 = CE::> {}; // 0x1 let in2 = CE::> {}; // 0x3 let in3 = CE::> {}; // 0x6 let in4 = CE::> {}; // 0x0 // INPUT stack let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let (in23, in24, in25) = (CE::> {}, CE::> {}, CE::> {}); let (in26, in27, in28) = (CE::> {}, CE::> {}, CE::> {}); let (in29, in30, in31) = (CE::> {}, CE::> {}, CE::> {}); let (in32, in33, in34) = (CE::> {}, CE::> {}, CE::> {}); let (in35, in36, in37) = (CE::> {}, CE::> {}, CE::> {}); let (in38, in39, in40) = (CE::> {}, CE::> {}, CE::> {}); let (in41, in42, in43) = (CE::> {}, CE::> {}, CE::> {}); let (in44, in45, in46) = (CE::> {}, CE::> {}, CE::> {}); let (in47, in48) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in47, in47); // compute z^2 let t1 = circuit_mul(t0, in47); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, in47); // compute z^7 let t4 = circuit_mul(t3, t0); // compute z^9 let t5 = circuit_mul(in44, in44); // Square f evaluation in Z, the result of previous bit. let t6 = circuit_mul(in0, in8); let t7 = circuit_add(in7, t6); let t8 = circuit_mul(t7, in6); // eval bn line by xNegOverY let t9 = circuit_mul(in0, in10); let t10 = circuit_add(in9, t9); let t11 = circuit_mul(t10, in5); // eval bn line by yInv let t12 = circuit_mul(in8, in6); // eval bn line by xNegOverY let t13 = circuit_mul(in10, in5); // eval bn line by yInv let t14 = circuit_mul(t8, in47); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t15 = circuit_add(in1, t14); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t16 = circuit_mul(t11, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t17 = circuit_add(t15, t16); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t18 = circuit_mul(t12, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t19 = circuit_add(t17, t18); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t20 = circuit_mul(t13, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t21 = circuit_add(t19, t20); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t22 = circuit_mul(t5, t21); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t23 = circuit_mul(in0, in12); let t24 = circuit_add(in11, t23); let t25 = circuit_mul(t24, in20); // eval bn line by xNegOverY let t26 = circuit_mul(in0, in14); let t27 = circuit_add(in13, t26); let t28 = circuit_mul(t27, in19); // eval bn line by yInv let t29 = circuit_mul(in12, in20); // eval bn line by xNegOverY let t30 = circuit_mul(in14, in19); // eval bn line by yInv let t31 = circuit_mul(t25, in47); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t32 = circuit_add(in1, t31); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t33 = circuit_mul(t28, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t34 = circuit_add(t32, t33); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t35 = circuit_mul(t29, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t36 = circuit_add(t34, t35); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t37 = circuit_mul(t30, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t38 = circuit_add(t36, t37); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t39 = circuit_mul(t22, t38); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t40 = circuit_add(in35, in36); // Doubling slope numerator start let t41 = circuit_sub(in35, in36); let t42 = circuit_mul(t40, t41); let t43 = circuit_mul(in35, in36); let t44 = circuit_mul(t42, in2); let t45 = circuit_mul(t43, in3); // Doubling slope numerator end let t46 = circuit_add(in37, in37); // Fp2 add coeff 0/1 let t47 = circuit_add(in38, in38); // Fp2 add coeff 1/1 let t48 = circuit_mul(t46, t46); // Fp2 Inv start let t49 = circuit_mul(t47, t47); let t50 = circuit_add(t48, t49); let t51 = circuit_inverse(t50); let t52 = circuit_mul(t46, t51); // Fp2 Inv real part end let t53 = circuit_mul(t47, t51); let t54 = circuit_sub(in4, t53); // Fp2 Inv imag part end let t55 = circuit_mul(t44, t52); // Fp2 mul start let t56 = circuit_mul(t45, t54); let t57 = circuit_sub(t55, t56); // Fp2 mul real part end let t58 = circuit_mul(t44, t54); let t59 = circuit_mul(t45, t52); let t60 = circuit_add(t58, t59); // Fp2 mul imag part end let t61 = circuit_add(t57, t60); let t62 = circuit_sub(t57, t60); let t63 = circuit_mul(t61, t62); let t64 = circuit_mul(t57, t60); let t65 = circuit_add(t64, t64); let t66 = circuit_add(in35, in35); // Fp2 add coeff 0/1 let t67 = circuit_add(in36, in36); // Fp2 add coeff 1/1 let t68 = circuit_sub(t63, t66); // Fp2 sub coeff 0/1 let t69 = circuit_sub(t65, t67); // Fp2 sub coeff 1/1 let t70 = circuit_sub(in35, t68); // Fp2 sub coeff 0/1 let t71 = circuit_sub(in36, t69); // Fp2 sub coeff 1/1 let t72 = circuit_mul(t57, t70); // Fp2 mul start let t73 = circuit_mul(t60, t71); let t74 = circuit_sub(t72, t73); // Fp2 mul real part end let t75 = circuit_mul(t57, t71); let t76 = circuit_mul(t60, t70); let t77 = circuit_add(t75, t76); // Fp2 mul imag part end let t78 = circuit_sub(t74, in37); // Fp2 sub coeff 0/1 let t79 = circuit_sub(t77, in38); // Fp2 sub coeff 1/1 let t80 = circuit_mul(t57, in35); // Fp2 mul start let t81 = circuit_mul(t60, in36); let t82 = circuit_sub(t80, t81); // Fp2 mul real part end let t83 = circuit_mul(t57, in36); let t84 = circuit_mul(t60, in35); let t85 = circuit_add(t83, t84); // Fp2 mul imag part end let t86 = circuit_sub(t82, in37); // Fp2 sub coeff 0/1 let t87 = circuit_sub(t85, in38); // Fp2 sub coeff 1/1 let t88 = circuit_mul(in0, t60); let t89 = circuit_add(t57, t88); let t90 = circuit_mul(t89, in34); // eval bn line by xNegOverY let t91 = circuit_mul(in0, t87); let t92 = circuit_add(t86, t91); let t93 = circuit_mul(t92, in33); // eval bn line by yInv let t94 = circuit_mul(t60, in34); // eval bn line by xNegOverY let t95 = circuit_mul(t87, in33); // eval bn line by yInv let t96 = circuit_mul(t90, in47); // Eval sparse poly line_2p_1 step coeff_1 * z^1 let t97 = circuit_add(in1, t96); // Eval sparse poly line_2p_1 step + coeff_1 * z^1 let t98 = circuit_mul(t93, t1); // Eval sparse poly line_2p_1 step coeff_3 * z^3 let t99 = circuit_add(t97, t98); // Eval sparse poly line_2p_1 step + coeff_3 * z^3 let t100 = circuit_mul(t94, t3); // Eval sparse poly line_2p_1 step coeff_7 * z^7 let t101 = circuit_add(t99, t100); // Eval sparse poly line_2p_1 step + coeff_7 * z^7 let t102 = circuit_mul(t95, t4); // Eval sparse poly line_2p_1 step coeff_9 * z^9 let t103 = circuit_add(t101, t102); // Eval sparse poly line_2p_1 step + coeff_9 * z^9 let t104 = circuit_mul(t39, t103); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t105 = circuit_mul( t104, t104, ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 let t106 = circuit_mul(in0, in16); let t107 = circuit_add(in15, t106); let t108 = circuit_mul(t107, in6); // eval bn line by xNegOverY let t109 = circuit_mul(in0, in18); let t110 = circuit_add(in17, t109); let t111 = circuit_mul(t110, in5); // eval bn line by yInv let t112 = circuit_mul(in16, in6); // eval bn line by xNegOverY let t113 = circuit_mul(in18, in5); // eval bn line by yInv let t114 = circuit_mul(in0, in22); let t115 = circuit_add(in21, t114); let t116 = circuit_mul(t115, in6); // eval bn line by xNegOverY let t117 = circuit_mul(in0, in24); let t118 = circuit_add(in23, t117); let t119 = circuit_mul(t118, in5); // eval bn line by yInv let t120 = circuit_mul(in22, in6); // eval bn line by xNegOverY let t121 = circuit_mul(in24, in5); // eval bn line by yInv let t122 = circuit_mul(t108, in47); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t123 = circuit_add(in1, t122); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t124 = circuit_mul(t111, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t125 = circuit_add(t123, t124); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t126 = circuit_mul(t112, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t127 = circuit_add(t125, t126); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t128 = circuit_mul(t113, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t129 = circuit_add(t127, t128); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t130 = circuit_mul(t105, t129); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t131 = circuit_mul(t116, in47); // Eval sparse poly line_0p_2 step coeff_1 * z^1 let t132 = circuit_add(in1, t131); // Eval sparse poly line_0p_2 step + coeff_1 * z^1 let t133 = circuit_mul(t119, t1); // Eval sparse poly line_0p_2 step coeff_3 * z^3 let t134 = circuit_add(t132, t133); // Eval sparse poly line_0p_2 step + coeff_3 * z^3 let t135 = circuit_mul(t120, t3); // Eval sparse poly line_0p_2 step coeff_7 * z^7 let t136 = circuit_add(t134, t135); // Eval sparse poly line_0p_2 step + coeff_7 * z^7 let t137 = circuit_mul(t121, t4); // Eval sparse poly line_0p_2 step coeff_9 * z^9 let t138 = circuit_add(t136, t137); // Eval sparse poly line_0p_2 step + coeff_9 * z^9 let t139 = circuit_mul(t130, t138); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t140 = circuit_mul(in0, in26); let t141 = circuit_add(in25, t140); let t142 = circuit_mul(t141, in20); // eval bn line by xNegOverY let t143 = circuit_mul(in0, in28); let t144 = circuit_add(in27, t143); let t145 = circuit_mul(t144, in19); // eval bn line by yInv let t146 = circuit_mul(in26, in20); // eval bn line by xNegOverY let t147 = circuit_mul(in28, in19); // eval bn line by yInv let t148 = circuit_mul(in0, in30); let t149 = circuit_add(in29, t148); let t150 = circuit_mul(t149, in20); // eval bn line by xNegOverY let t151 = circuit_mul(in0, in32); let t152 = circuit_add(in31, t151); let t153 = circuit_mul(t152, in19); // eval bn line by yInv let t154 = circuit_mul(in30, in20); // eval bn line by xNegOverY let t155 = circuit_mul(in32, in19); // eval bn line by yInv let t156 = circuit_mul(t142, in47); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t157 = circuit_add(in1, t156); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t158 = circuit_mul(t145, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t159 = circuit_add(t157, t158); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t160 = circuit_mul(t146, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t161 = circuit_add(t159, t160); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t162 = circuit_mul(t147, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t163 = circuit_add(t161, t162); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t164 = circuit_mul(t139, t163); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t165 = circuit_mul(t150, in47); // Eval sparse poly line_1p_2 step coeff_1 * z^1 let t166 = circuit_add(in1, t165); // Eval sparse poly line_1p_2 step + coeff_1 * z^1 let t167 = circuit_mul(t153, t1); // Eval sparse poly line_1p_2 step coeff_3 * z^3 let t168 = circuit_add(t166, t167); // Eval sparse poly line_1p_2 step + coeff_3 * z^3 let t169 = circuit_mul(t154, t3); // Eval sparse poly line_1p_2 step coeff_7 * z^7 let t170 = circuit_add(t168, t169); // Eval sparse poly line_1p_2 step + coeff_7 * z^7 let t171 = circuit_mul(t155, t4); // Eval sparse poly line_1p_2 step coeff_9 * z^9 let t172 = circuit_add(t170, t171); // Eval sparse poly line_1p_2 step + coeff_9 * z^9 let t173 = circuit_mul(t164, t172); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t174 = circuit_sub(t78, in41); // Fp2 sub coeff 0/1 let t175 = circuit_sub(t79, in42); // Fp2 sub coeff 1/1 let t176 = circuit_sub(t68, in39); // Fp2 sub coeff 0/1 let t177 = circuit_sub(t69, in40); // Fp2 sub coeff 1/1 let t178 = circuit_mul(t176, t176); // Fp2 Inv start let t179 = circuit_mul(t177, t177); let t180 = circuit_add(t178, t179); let t181 = circuit_inverse(t180); let t182 = circuit_mul(t176, t181); // Fp2 Inv real part end let t183 = circuit_mul(t177, t181); let t184 = circuit_sub(in4, t183); // Fp2 Inv imag part end let t185 = circuit_mul(t174, t182); // Fp2 mul start let t186 = circuit_mul(t175, t184); let t187 = circuit_sub(t185, t186); // Fp2 mul real part end let t188 = circuit_mul(t174, t184); let t189 = circuit_mul(t175, t182); let t190 = circuit_add(t188, t189); // Fp2 mul imag part end let t191 = circuit_add(t187, t190); let t192 = circuit_sub(t187, t190); let t193 = circuit_mul(t191, t192); let t194 = circuit_mul(t187, t190); let t195 = circuit_add(t194, t194); let t196 = circuit_add(t68, in39); // Fp2 add coeff 0/1 let t197 = circuit_add(t69, in40); // Fp2 add coeff 1/1 let t198 = circuit_sub(t193, t196); // Fp2 sub coeff 0/1 let t199 = circuit_sub(t195, t197); // Fp2 sub coeff 1/1 let t200 = circuit_mul(t187, t68); // Fp2 mul start let t201 = circuit_mul(t190, t69); let t202 = circuit_sub(t200, t201); // Fp2 mul real part end let t203 = circuit_mul(t187, t69); let t204 = circuit_mul(t190, t68); let t205 = circuit_add(t203, t204); // Fp2 mul imag part end let t206 = circuit_sub(t202, t78); // Fp2 sub coeff 0/1 let t207 = circuit_sub(t205, t79); // Fp2 sub coeff 1/1 let t208 = circuit_add(t78, t78); // Fp2 add coeff 0/1 let t209 = circuit_add(t79, t79); // Fp2 add coeff 1/1 let t210 = circuit_sub(t198, t68); // Fp2 sub coeff 0/1 let t211 = circuit_sub(t199, t69); // Fp2 sub coeff 1/1 let t212 = circuit_mul(t210, t210); // Fp2 Inv start let t213 = circuit_mul(t211, t211); let t214 = circuit_add(t212, t213); let t215 = circuit_inverse(t214); let t216 = circuit_mul(t210, t215); // Fp2 Inv real part end let t217 = circuit_mul(t211, t215); let t218 = circuit_sub(in4, t217); // Fp2 Inv imag part end let t219 = circuit_mul(t208, t216); // Fp2 mul start let t220 = circuit_mul(t209, t218); let t221 = circuit_sub(t219, t220); // Fp2 mul real part end let t222 = circuit_mul(t208, t218); let t223 = circuit_mul(t209, t216); let t224 = circuit_add(t222, t223); // Fp2 mul imag part end let t225 = circuit_add(t187, t221); // Fp2 add coeff 0/1 let t226 = circuit_add(t190, t224); // Fp2 add coeff 1/1 let t227 = circuit_sub(in4, t225); // Fp2 neg coeff 0/1 let t228 = circuit_sub(in4, t226); // Fp2 neg coeff 1/1 let t229 = circuit_add(t227, t228); let t230 = circuit_sub(t227, t228); let t231 = circuit_mul(t229, t230); let t232 = circuit_mul(t227, t228); let t233 = circuit_add(t232, t232); let t234 = circuit_sub(t231, t68); // Fp2 sub coeff 0/1 let t235 = circuit_sub(t233, t69); // Fp2 sub coeff 1/1 let t236 = circuit_sub(t234, t198); // Fp2 sub coeff 0/1 let t237 = circuit_sub(t235, t199); // Fp2 sub coeff 1/1 let t238 = circuit_sub(t68, t236); // Fp2 sub coeff 0/1 let t239 = circuit_sub(t69, t237); // Fp2 sub coeff 1/1 let t240 = circuit_mul(t227, t238); // Fp2 mul start let t241 = circuit_mul(t228, t239); let t242 = circuit_sub(t240, t241); // Fp2 mul real part end let t243 = circuit_mul(t227, t239); let t244 = circuit_mul(t228, t238); let t245 = circuit_add(t243, t244); // Fp2 mul imag part end let t246 = circuit_sub(t242, t78); // Fp2 sub coeff 0/1 let t247 = circuit_sub(t245, t79); // Fp2 sub coeff 1/1 let t248 = circuit_mul(t227, t68); // Fp2 mul start let t249 = circuit_mul(t228, t69); let t250 = circuit_sub(t248, t249); // Fp2 mul real part end let t251 = circuit_mul(t227, t69); let t252 = circuit_mul(t228, t68); let t253 = circuit_add(t251, t252); // Fp2 mul imag part end let t254 = circuit_sub(t250, t78); // Fp2 sub coeff 0/1 let t255 = circuit_sub(t253, t79); // Fp2 sub coeff 1/1 let t256 = circuit_mul(in0, t190); let t257 = circuit_add(t187, t256); let t258 = circuit_mul(t257, in34); // eval bn line by xNegOverY let t259 = circuit_mul(in0, t207); let t260 = circuit_add(t206, t259); let t261 = circuit_mul(t260, in33); // eval bn line by yInv let t262 = circuit_mul(t190, in34); // eval bn line by xNegOverY let t263 = circuit_mul(t207, in33); // eval bn line by yInv let t264 = circuit_mul(in0, t228); let t265 = circuit_add(t227, t264); let t266 = circuit_mul(t265, in34); // eval bn line by xNegOverY let t267 = circuit_mul(in0, t255); let t268 = circuit_add(t254, t267); let t269 = circuit_mul(t268, in33); // eval bn line by yInv let t270 = circuit_mul(t228, in34); // eval bn line by xNegOverY let t271 = circuit_mul(t255, in33); // eval bn line by yInv let t272 = circuit_mul(t258, in47); // Eval sparse poly line_2p_1 step coeff_1 * z^1 let t273 = circuit_add(in1, t272); // Eval sparse poly line_2p_1 step + coeff_1 * z^1 let t274 = circuit_mul(t261, t1); // Eval sparse poly line_2p_1 step coeff_3 * z^3 let t275 = circuit_add(t273, t274); // Eval sparse poly line_2p_1 step + coeff_3 * z^3 let t276 = circuit_mul(t262, t3); // Eval sparse poly line_2p_1 step coeff_7 * z^7 let t277 = circuit_add(t275, t276); // Eval sparse poly line_2p_1 step + coeff_7 * z^7 let t278 = circuit_mul(t263, t4); // Eval sparse poly line_2p_1 step coeff_9 * z^9 let t279 = circuit_add(t277, t278); // Eval sparse poly line_2p_1 step + coeff_9 * z^9 let t280 = circuit_mul(t173, t279); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t281 = circuit_mul(t266, in47); // Eval sparse poly line_2p_2 step coeff_1 * z^1 let t282 = circuit_add(in1, t281); // Eval sparse poly line_2p_2 step + coeff_1 * z^1 let t283 = circuit_mul(t269, t1); // Eval sparse poly line_2p_2 step coeff_3 * z^3 let t284 = circuit_add(t282, t283); // Eval sparse poly line_2p_2 step + coeff_3 * z^3 let t285 = circuit_mul(t270, t3); // Eval sparse poly line_2p_2 step coeff_7 * z^7 let t286 = circuit_add(t284, t285); // Eval sparse poly line_2p_2 step + coeff_7 * z^7 let t287 = circuit_mul(t271, t4); // Eval sparse poly line_2p_2 step coeff_9 * z^9 let t288 = circuit_add(t286, t287); // Eval sparse poly line_2p_2 step + coeff_9 * z^9 let t289 = circuit_mul(t280, t288); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t290 = circuit_mul(t289, in46); let t291 = circuit_sub(t290, in45); // (Π(i,k) (Pk(z))) - Ri(z) let t292 = circuit_mul(in48, in43); let t293 = circuit_add(t292, t291); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t236, t237, t246, t247, t293).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in2 circuit_inputs = circuit_inputs.next_2([0x6, 0x0, 0x0, 0x0]); // in3 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in4 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in5 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_10.r0a0); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_10.r0a1); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_10.r1a0); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_10.r1a1); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_add_10.r0a0); // in15 circuit_inputs = circuit_inputs.next_2(G2_line_add_10.r0a1); // in16 circuit_inputs = circuit_inputs.next_2(G2_line_add_10.r1a0); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_add_10.r1a1); // in18 circuit_inputs = circuit_inputs.next_2(yInv_1); // in19 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in20 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in21 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in22 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in23 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in24 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_11.r0a0); // in25 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_11.r0a1); // in26 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_11.r1a0); // in27 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_11.r1a1); // in28 circuit_inputs = circuit_inputs.next_2(G2_line_add_11.r0a0); // in29 circuit_inputs = circuit_inputs.next_2(G2_line_add_11.r0a1); // in30 circuit_inputs = circuit_inputs.next_2(G2_line_add_11.r1a0); // in31 circuit_inputs = circuit_inputs.next_2(G2_line_add_11.r1a1); // in32 circuit_inputs = circuit_inputs.next_2(yInv_2); // in33 circuit_inputs = circuit_inputs.next_2(xNegOverY_2); // in34 circuit_inputs = circuit_inputs.next_2(Q_2.x0); // in35 circuit_inputs = circuit_inputs.next_2(Q_2.x1); // in36 circuit_inputs = circuit_inputs.next_2(Q_2.y0); // in37 circuit_inputs = circuit_inputs.next_2(Q_2.y1); // in38 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.x0); // in39 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.x1); // in40 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.y0); // in41 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.y1); // in42 circuit_inputs = circuit_inputs.next_2(lhs_i); // in43 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in44 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in45 circuit_inputs = circuit_inputs.next_2(c_or_cinv_of_z); // in46 circuit_inputs = circuit_inputs.next_2(z); // in47 circuit_inputs = circuit_inputs.next_2(c1); // in48 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t236), x1: outputs.get_output(t237), y0: outputs.get_output(t246), y1: outputs.get_output(t247), }; let lhs_i_plus_one: u384 = outputs.get_output(t293); return (Q0, lhs_i_plus_one); } #[inline(always)] pub fn run_BN254_MP_CHECK_BIT10_2P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, G2_line_add_1_0: G2Line, G2_line_dbl_0_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, G2_line_add_1_1: G2Line, G2_line_dbl_0_1: G2Line, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, c_or_cinv_of_z: u384, z: u384, c1: u384, ) -> (u384,) { // CONSTANT stack let in0 = CE::> {}; // -0x9 % p let in1 = CE::> {}; // 0x1 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let (in23, in24, in25) = (CE::> {}, CE::> {}, CE::> {}); let (in26, in27, in28) = (CE::> {}, CE::> {}, CE::> {}); let (in29, in30, in31) = (CE::> {}, CE::> {}, CE::> {}); let (in32, in33, in34) = (CE::> {}, CE::> {}, CE::> {}); let in35 = CE::> {}; let t0 = circuit_mul(in34, in34); // compute z^2 let t1 = circuit_mul(t0, in34); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, in34); // compute z^7 let t4 = circuit_mul(t3, t0); // compute z^9 let t5 = circuit_mul(in31, in31); // Square f evaluation in Z, the result of previous bit. let t6 = circuit_mul(in0, in5); let t7 = circuit_add(in4, t6); let t8 = circuit_mul(t7, in3); // eval bn line by xNegOverY let t9 = circuit_mul(in0, in7); let t10 = circuit_add(in6, t9); let t11 = circuit_mul(t10, in2); // eval bn line by yInv let t12 = circuit_mul(in5, in3); // eval bn line by xNegOverY let t13 = circuit_mul(in7, in2); // eval bn line by yInv let t14 = circuit_mul(in0, in9); let t15 = circuit_add(in8, t14); let t16 = circuit_mul(t15, in3); // eval bn line by xNegOverY let t17 = circuit_mul(in0, in11); let t18 = circuit_add(in10, t17); let t19 = circuit_mul(t18, in2); // eval bn line by yInv let t20 = circuit_mul(in9, in3); // eval bn line by xNegOverY let t21 = circuit_mul(in11, in2); // eval bn line by yInv let t22 = circuit_mul(t8, in34); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t23 = circuit_add(in1, t22); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t24 = circuit_mul(t11, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t25 = circuit_add(t23, t24); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t26 = circuit_mul(t12, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t27 = circuit_add(t25, t26); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t28 = circuit_mul(t13, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t29 = circuit_add(t27, t28); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t30 = circuit_mul(t5, t29); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t31 = circuit_mul(t16, in34); // Eval sparse poly line_0p_2 step coeff_1 * z^1 let t32 = circuit_add(in1, t31); // Eval sparse poly line_0p_2 step + coeff_1 * z^1 let t33 = circuit_mul(t19, t1); // Eval sparse poly line_0p_2 step coeff_3 * z^3 let t34 = circuit_add(t32, t33); // Eval sparse poly line_0p_2 step + coeff_3 * z^3 let t35 = circuit_mul(t20, t3); // Eval sparse poly line_0p_2 step coeff_7 * z^7 let t36 = circuit_add(t34, t35); // Eval sparse poly line_0p_2 step + coeff_7 * z^7 let t37 = circuit_mul(t21, t4); // Eval sparse poly line_0p_2 step coeff_9 * z^9 let t38 = circuit_add(t36, t37); // Eval sparse poly line_0p_2 step + coeff_9 * z^9 let t39 = circuit_mul(t30, t38); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t40 = circuit_mul(in0, in13); let t41 = circuit_add(in12, t40); let t42 = circuit_mul(t41, in17); // eval bn line by xNegOverY let t43 = circuit_mul(in0, in15); let t44 = circuit_add(in14, t43); let t45 = circuit_mul(t44, in16); // eval bn line by yInv let t46 = circuit_mul(in13, in17); // eval bn line by xNegOverY let t47 = circuit_mul(in15, in16); // eval bn line by yInv let t48 = circuit_mul(in0, in19); let t49 = circuit_add(in18, t48); let t50 = circuit_mul(t49, in17); // eval bn line by xNegOverY let t51 = circuit_mul(in0, in21); let t52 = circuit_add(in20, t51); let t53 = circuit_mul(t52, in16); // eval bn line by yInv let t54 = circuit_mul(in19, in17); // eval bn line by xNegOverY let t55 = circuit_mul(in21, in16); // eval bn line by yInv let t56 = circuit_mul(t42, in34); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t57 = circuit_add(in1, t56); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t58 = circuit_mul(t45, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t59 = circuit_add(t57, t58); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t60 = circuit_mul(t46, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t61 = circuit_add(t59, t60); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t62 = circuit_mul(t47, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t63 = circuit_add(t61, t62); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t64 = circuit_mul(t39, t63); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t65 = circuit_mul(t50, in34); // Eval sparse poly line_1p_2 step coeff_1 * z^1 let t66 = circuit_add(in1, t65); // Eval sparse poly line_1p_2 step + coeff_1 * z^1 let t67 = circuit_mul(t53, t1); // Eval sparse poly line_1p_2 step coeff_3 * z^3 let t68 = circuit_add(t66, t67); // Eval sparse poly line_1p_2 step + coeff_3 * z^3 let t69 = circuit_mul(t54, t3); // Eval sparse poly line_1p_2 step coeff_7 * z^7 let t70 = circuit_add(t68, t69); // Eval sparse poly line_1p_2 step + coeff_7 * z^7 let t71 = circuit_mul(t55, t4); // Eval sparse poly line_1p_2 step coeff_9 * z^9 let t72 = circuit_add(t70, t71); // Eval sparse poly line_1p_2 step + coeff_9 * z^9 let t73 = circuit_mul(t64, t72); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t74 = circuit_mul( t73, t73, ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 let t75 = circuit_mul(in0, in23); let t76 = circuit_add(in22, t75); let t77 = circuit_mul(t76, in3); // eval bn line by xNegOverY let t78 = circuit_mul(in0, in25); let t79 = circuit_add(in24, t78); let t80 = circuit_mul(t79, in2); // eval bn line by yInv let t81 = circuit_mul(in23, in3); // eval bn line by xNegOverY let t82 = circuit_mul(in25, in2); // eval bn line by yInv let t83 = circuit_mul(t77, in34); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t84 = circuit_add(in1, t83); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t85 = circuit_mul(t80, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t86 = circuit_add(t84, t85); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t87 = circuit_mul(t81, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t88 = circuit_add(t86, t87); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t89 = circuit_mul(t82, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t90 = circuit_add(t88, t89); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t91 = circuit_mul(t74, t90); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t92 = circuit_mul(in0, in27); let t93 = circuit_add(in26, t92); let t94 = circuit_mul(t93, in17); // eval bn line by xNegOverY let t95 = circuit_mul(in0, in29); let t96 = circuit_add(in28, t95); let t97 = circuit_mul(t96, in16); // eval bn line by yInv let t98 = circuit_mul(in27, in17); // eval bn line by xNegOverY let t99 = circuit_mul(in29, in16); // eval bn line by yInv let t100 = circuit_mul(t94, in34); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t101 = circuit_add(in1, t100); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t102 = circuit_mul(t97, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t103 = circuit_add(t101, t102); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t104 = circuit_mul(t98, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t105 = circuit_add(t103, t104); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t106 = circuit_mul(t99, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t107 = circuit_add(t105, t106); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t108 = circuit_mul(t91, t107); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t109 = circuit_mul(in33, in33); let t110 = circuit_mul(t108, t109); let t111 = circuit_sub(t110, in32); // (Π(i,k) (Pk(z))) - Ri(z) let t112 = circuit_mul(in35, in30); let t113 = circuit_add(t112, t111); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t113,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in2 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in3 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_0.r0a0); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_0.r0a1); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_0.r1a0); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_0.r1a1); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_0.r0a0); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_0.r0a1); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_0.r1a0); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_0.r1a1); // in15 circuit_inputs = circuit_inputs.next_2(yInv_1); // in16 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in18 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in19 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in20 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in21 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_1.r0a0); // in22 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_1.r0a1); // in23 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_1.r1a0); // in24 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_1.r1a1); // in25 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_1.r0a0); // in26 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_1.r0a1); // in27 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_1.r1a0); // in28 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_1.r1a1); // in29 circuit_inputs = circuit_inputs.next_2(lhs_i); // in30 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in31 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in32 circuit_inputs = circuit_inputs.next_2(c_or_cinv_of_z); // in33 circuit_inputs = circuit_inputs.next_2(z); // in34 circuit_inputs = circuit_inputs.next_2(c1); // in35 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let lhs_i_plus_one: u384 = outputs.get_output(t113); return (lhs_i_plus_one,); } #[inline(always)] pub fn run_BN254_MP_CHECK_BIT10_3P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_dbl_0: G2Line, G2_line_add_1_0: G2Line, G2_line_dbl_0_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_dbl_1: G2Line, G2_line_add_1_1: G2Line, G2_line_dbl_0_1: G2Line, yInv_2: u384, xNegOverY_2: u384, Q_2: G2Point, Q_or_Q_neg_2: G2Point, lhs_i: u384, f_i_of_z: u384, f_i_plus_one_of_z: u384, c_or_cinv_of_z: u384, z: u384, c1: u384, ) -> (G2Point, u384) { // CONSTANT stack let in0 = CE::> {}; // -0x9 % p let in1 = CE::> {}; // 0x1 let in2 = CE::> {}; // 0x0 let in3 = CE::> {}; // 0x3 let in4 = CE::> {}; // 0x6 // INPUT stack let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let (in23, in24, in25) = (CE::> {}, CE::> {}, CE::> {}); let (in26, in27, in28) = (CE::> {}, CE::> {}, CE::> {}); let (in29, in30, in31) = (CE::> {}, CE::> {}, CE::> {}); let (in32, in33, in34) = (CE::> {}, CE::> {}, CE::> {}); let (in35, in36, in37) = (CE::> {}, CE::> {}, CE::> {}); let (in38, in39, in40) = (CE::> {}, CE::> {}, CE::> {}); let (in41, in42, in43) = (CE::> {}, CE::> {}, CE::> {}); let (in44, in45, in46) = (CE::> {}, CE::> {}, CE::> {}); let (in47, in48) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in47, in47); // compute z^2 let t1 = circuit_mul(t0, in47); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, in47); // compute z^7 let t4 = circuit_mul(t3, t0); // compute z^9 let t5 = circuit_mul(in44, in44); // Square f evaluation in Z, the result of previous bit. let t6 = circuit_mul(in0, in8); let t7 = circuit_add(in7, t6); let t8 = circuit_mul(t7, in6); // eval bn line by xNegOverY let t9 = circuit_mul(in0, in10); let t10 = circuit_add(in9, t9); let t11 = circuit_mul(t10, in5); // eval bn line by yInv let t12 = circuit_mul(in8, in6); // eval bn line by xNegOverY let t13 = circuit_mul(in10, in5); // eval bn line by yInv let t14 = circuit_mul(in0, in12); let t15 = circuit_add(in11, t14); let t16 = circuit_mul(t15, in6); // eval bn line by xNegOverY let t17 = circuit_mul(in0, in14); let t18 = circuit_add(in13, t17); let t19 = circuit_mul(t18, in5); // eval bn line by yInv let t20 = circuit_mul(in12, in6); // eval bn line by xNegOverY let t21 = circuit_mul(in14, in5); // eval bn line by yInv let t22 = circuit_mul(t8, in47); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t23 = circuit_add(in1, t22); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t24 = circuit_mul(t11, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t25 = circuit_add(t23, t24); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t26 = circuit_mul(t12, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t27 = circuit_add(t25, t26); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t28 = circuit_mul(t13, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t29 = circuit_add(t27, t28); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t30 = circuit_mul(t5, t29); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t31 = circuit_mul(t16, in47); // Eval sparse poly line_0p_2 step coeff_1 * z^1 let t32 = circuit_add(in1, t31); // Eval sparse poly line_0p_2 step + coeff_1 * z^1 let t33 = circuit_mul(t19, t1); // Eval sparse poly line_0p_2 step coeff_3 * z^3 let t34 = circuit_add(t32, t33); // Eval sparse poly line_0p_2 step + coeff_3 * z^3 let t35 = circuit_mul(t20, t3); // Eval sparse poly line_0p_2 step coeff_7 * z^7 let t36 = circuit_add(t34, t35); // Eval sparse poly line_0p_2 step + coeff_7 * z^7 let t37 = circuit_mul(t21, t4); // Eval sparse poly line_0p_2 step coeff_9 * z^9 let t38 = circuit_add(t36, t37); // Eval sparse poly line_0p_2 step + coeff_9 * z^9 let t39 = circuit_mul(t30, t38); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t40 = circuit_mul(in0, in16); let t41 = circuit_add(in15, t40); let t42 = circuit_mul(t41, in20); // eval bn line by xNegOverY let t43 = circuit_mul(in0, in18); let t44 = circuit_add(in17, t43); let t45 = circuit_mul(t44, in19); // eval bn line by yInv let t46 = circuit_mul(in16, in20); // eval bn line by xNegOverY let t47 = circuit_mul(in18, in19); // eval bn line by yInv let t48 = circuit_mul(in0, in22); let t49 = circuit_add(in21, t48); let t50 = circuit_mul(t49, in20); // eval bn line by xNegOverY let t51 = circuit_mul(in0, in24); let t52 = circuit_add(in23, t51); let t53 = circuit_mul(t52, in19); // eval bn line by yInv let t54 = circuit_mul(in22, in20); // eval bn line by xNegOverY let t55 = circuit_mul(in24, in19); // eval bn line by yInv let t56 = circuit_mul(t42, in47); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t57 = circuit_add(in1, t56); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t58 = circuit_mul(t45, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t59 = circuit_add(t57, t58); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t60 = circuit_mul(t46, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t61 = circuit_add(t59, t60); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t62 = circuit_mul(t47, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t63 = circuit_add(t61, t62); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t64 = circuit_mul(t39, t63); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t65 = circuit_mul(t50, in47); // Eval sparse poly line_1p_2 step coeff_1 * z^1 let t66 = circuit_add(in1, t65); // Eval sparse poly line_1p_2 step + coeff_1 * z^1 let t67 = circuit_mul(t53, t1); // Eval sparse poly line_1p_2 step coeff_3 * z^3 let t68 = circuit_add(t66, t67); // Eval sparse poly line_1p_2 step + coeff_3 * z^3 let t69 = circuit_mul(t54, t3); // Eval sparse poly line_1p_2 step coeff_7 * z^7 let t70 = circuit_add(t68, t69); // Eval sparse poly line_1p_2 step + coeff_7 * z^7 let t71 = circuit_mul(t55, t4); // Eval sparse poly line_1p_2 step coeff_9 * z^9 let t72 = circuit_add(t70, t71); // Eval sparse poly line_1p_2 step + coeff_9 * z^9 let t73 = circuit_mul(t64, t72); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t74 = circuit_sub(in37, in41); // Fp2 sub coeff 0/1 let t75 = circuit_sub(in38, in42); // Fp2 sub coeff 1/1 let t76 = circuit_sub(in35, in39); // Fp2 sub coeff 0/1 let t77 = circuit_sub(in36, in40); // Fp2 sub coeff 1/1 let t78 = circuit_mul(t76, t76); // Fp2 Inv start let t79 = circuit_mul(t77, t77); let t80 = circuit_add(t78, t79); let t81 = circuit_inverse(t80); let t82 = circuit_mul(t76, t81); // Fp2 Inv real part end let t83 = circuit_mul(t77, t81); let t84 = circuit_sub(in2, t83); // Fp2 Inv imag part end let t85 = circuit_mul(t74, t82); // Fp2 mul start let t86 = circuit_mul(t75, t84); let t87 = circuit_sub(t85, t86); // Fp2 mul real part end let t88 = circuit_mul(t74, t84); let t89 = circuit_mul(t75, t82); let t90 = circuit_add(t88, t89); // Fp2 mul imag part end let t91 = circuit_add(t87, t90); let t92 = circuit_sub(t87, t90); let t93 = circuit_mul(t91, t92); let t94 = circuit_mul(t87, t90); let t95 = circuit_add(t94, t94); let t96 = circuit_add(in35, in39); // Fp2 add coeff 0/1 let t97 = circuit_add(in36, in40); // Fp2 add coeff 1/1 let t98 = circuit_sub(t93, t96); // Fp2 sub coeff 0/1 let t99 = circuit_sub(t95, t97); // Fp2 sub coeff 1/1 let t100 = circuit_mul(t87, in35); // Fp2 mul start let t101 = circuit_mul(t90, in36); let t102 = circuit_sub(t100, t101); // Fp2 mul real part end let t103 = circuit_mul(t87, in36); let t104 = circuit_mul(t90, in35); let t105 = circuit_add(t103, t104); // Fp2 mul imag part end let t106 = circuit_sub(t102, in37); // Fp2 sub coeff 0/1 let t107 = circuit_sub(t105, in38); // Fp2 sub coeff 1/1 let t108 = circuit_add(in37, in37); // Fp2 add coeff 0/1 let t109 = circuit_add(in38, in38); // Fp2 add coeff 1/1 let t110 = circuit_sub(t98, in35); // Fp2 sub coeff 0/1 let t111 = circuit_sub(t99, in36); // Fp2 sub coeff 1/1 let t112 = circuit_mul(t110, t110); // Fp2 Inv start let t113 = circuit_mul(t111, t111); let t114 = circuit_add(t112, t113); let t115 = circuit_inverse(t114); let t116 = circuit_mul(t110, t115); // Fp2 Inv real part end let t117 = circuit_mul(t111, t115); let t118 = circuit_sub(in2, t117); // Fp2 Inv imag part end let t119 = circuit_mul(t108, t116); // Fp2 mul start let t120 = circuit_mul(t109, t118); let t121 = circuit_sub(t119, t120); // Fp2 mul real part end let t122 = circuit_mul(t108, t118); let t123 = circuit_mul(t109, t116); let t124 = circuit_add(t122, t123); // Fp2 mul imag part end let t125 = circuit_add(t87, t121); // Fp2 add coeff 0/1 let t126 = circuit_add(t90, t124); // Fp2 add coeff 1/1 let t127 = circuit_sub(in2, t125); // Fp2 neg coeff 0/1 let t128 = circuit_sub(in2, t126); // Fp2 neg coeff 1/1 let t129 = circuit_add(t127, t128); let t130 = circuit_sub(t127, t128); let t131 = circuit_mul(t129, t130); let t132 = circuit_mul(t127, t128); let t133 = circuit_add(t132, t132); let t134 = circuit_sub(t131, in35); // Fp2 sub coeff 0/1 let t135 = circuit_sub(t133, in36); // Fp2 sub coeff 1/1 let t136 = circuit_sub(t134, t98); // Fp2 sub coeff 0/1 let t137 = circuit_sub(t135, t99); // Fp2 sub coeff 1/1 let t138 = circuit_sub(in35, t136); // Fp2 sub coeff 0/1 let t139 = circuit_sub(in36, t137); // Fp2 sub coeff 1/1 let t140 = circuit_mul(t127, t138); // Fp2 mul start let t141 = circuit_mul(t128, t139); let t142 = circuit_sub(t140, t141); // Fp2 mul real part end let t143 = circuit_mul(t127, t139); let t144 = circuit_mul(t128, t138); let t145 = circuit_add(t143, t144); // Fp2 mul imag part end let t146 = circuit_sub(t142, in37); // Fp2 sub coeff 0/1 let t147 = circuit_sub(t145, in38); // Fp2 sub coeff 1/1 let t148 = circuit_mul(t127, in35); // Fp2 mul start let t149 = circuit_mul(t128, in36); let t150 = circuit_sub(t148, t149); // Fp2 mul real part end let t151 = circuit_mul(t127, in36); let t152 = circuit_mul(t128, in35); let t153 = circuit_add(t151, t152); // Fp2 mul imag part end let t154 = circuit_sub(t150, in37); // Fp2 sub coeff 0/1 let t155 = circuit_sub(t153, in38); // Fp2 sub coeff 1/1 let t156 = circuit_mul(in0, t90); let t157 = circuit_add(t87, t156); let t158 = circuit_mul(t157, in34); // eval bn line by xNegOverY let t159 = circuit_mul(in0, t107); let t160 = circuit_add(t106, t159); let t161 = circuit_mul(t160, in33); // eval bn line by yInv let t162 = circuit_mul(t90, in34); // eval bn line by xNegOverY let t163 = circuit_mul(t107, in33); // eval bn line by yInv let t164 = circuit_mul(in0, t128); let t165 = circuit_add(t127, t164); let t166 = circuit_mul(t165, in34); // eval bn line by xNegOverY let t167 = circuit_mul(in0, t155); let t168 = circuit_add(t154, t167); let t169 = circuit_mul(t168, in33); // eval bn line by yInv let t170 = circuit_mul(t128, in34); // eval bn line by xNegOverY let t171 = circuit_mul(t155, in33); // eval bn line by yInv let t172 = circuit_mul(t158, in47); // Eval sparse poly line_2p_1 step coeff_1 * z^1 let t173 = circuit_add(in1, t172); // Eval sparse poly line_2p_1 step + coeff_1 * z^1 let t174 = circuit_mul(t161, t1); // Eval sparse poly line_2p_1 step coeff_3 * z^3 let t175 = circuit_add(t173, t174); // Eval sparse poly line_2p_1 step + coeff_3 * z^3 let t176 = circuit_mul(t162, t3); // Eval sparse poly line_2p_1 step coeff_7 * z^7 let t177 = circuit_add(t175, t176); // Eval sparse poly line_2p_1 step + coeff_7 * z^7 let t178 = circuit_mul(t163, t4); // Eval sparse poly line_2p_1 step coeff_9 * z^9 let t179 = circuit_add(t177, t178); // Eval sparse poly line_2p_1 step + coeff_9 * z^9 let t180 = circuit_mul(t73, t179); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t181 = circuit_mul(t166, in47); // Eval sparse poly line_2p_2 step coeff_1 * z^1 let t182 = circuit_add(in1, t181); // Eval sparse poly line_2p_2 step + coeff_1 * z^1 let t183 = circuit_mul(t169, t1); // Eval sparse poly line_2p_2 step coeff_3 * z^3 let t184 = circuit_add(t182, t183); // Eval sparse poly line_2p_2 step + coeff_3 * z^3 let t185 = circuit_mul(t170, t3); // Eval sparse poly line_2p_2 step coeff_7 * z^7 let t186 = circuit_add(t184, t185); // Eval sparse poly line_2p_2 step + coeff_7 * z^7 let t187 = circuit_mul(t171, t4); // Eval sparse poly line_2p_2 step coeff_9 * z^9 let t188 = circuit_add(t186, t187); // Eval sparse poly line_2p_2 step + coeff_9 * z^9 let t189 = circuit_mul(t180, t188); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t190 = circuit_mul( t189, t189, ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 let t191 = circuit_mul(in0, in26); let t192 = circuit_add(in25, t191); let t193 = circuit_mul(t192, in6); // eval bn line by xNegOverY let t194 = circuit_mul(in0, in28); let t195 = circuit_add(in27, t194); let t196 = circuit_mul(t195, in5); // eval bn line by yInv let t197 = circuit_mul(in26, in6); // eval bn line by xNegOverY let t198 = circuit_mul(in28, in5); // eval bn line by yInv let t199 = circuit_mul(t193, in47); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t200 = circuit_add(in1, t199); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t201 = circuit_mul(t196, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t202 = circuit_add(t200, t201); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t203 = circuit_mul(t197, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t204 = circuit_add(t202, t203); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t205 = circuit_mul(t198, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t206 = circuit_add(t204, t205); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t207 = circuit_mul(t190, t206); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t208 = circuit_mul(in0, in30); let t209 = circuit_add(in29, t208); let t210 = circuit_mul(t209, in20); // eval bn line by xNegOverY let t211 = circuit_mul(in0, in32); let t212 = circuit_add(in31, t211); let t213 = circuit_mul(t212, in19); // eval bn line by yInv let t214 = circuit_mul(in30, in20); // eval bn line by xNegOverY let t215 = circuit_mul(in32, in19); // eval bn line by yInv let t216 = circuit_mul(t210, in47); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t217 = circuit_add(in1, t216); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t218 = circuit_mul(t213, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t219 = circuit_add(t217, t218); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t220 = circuit_mul(t214, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t221 = circuit_add(t219, t220); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t222 = circuit_mul(t215, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t223 = circuit_add(t221, t222); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t224 = circuit_mul(t207, t223); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t225 = circuit_add(t136, t137); // Doubling slope numerator start let t226 = circuit_sub(t136, t137); let t227 = circuit_mul(t225, t226); let t228 = circuit_mul(t136, t137); let t229 = circuit_mul(t227, in3); let t230 = circuit_mul(t228, in4); // Doubling slope numerator end let t231 = circuit_add(t146, t146); // Fp2 add coeff 0/1 let t232 = circuit_add(t147, t147); // Fp2 add coeff 1/1 let t233 = circuit_mul(t231, t231); // Fp2 Inv start let t234 = circuit_mul(t232, t232); let t235 = circuit_add(t233, t234); let t236 = circuit_inverse(t235); let t237 = circuit_mul(t231, t236); // Fp2 Inv real part end let t238 = circuit_mul(t232, t236); let t239 = circuit_sub(in2, t238); // Fp2 Inv imag part end let t240 = circuit_mul(t229, t237); // Fp2 mul start let t241 = circuit_mul(t230, t239); let t242 = circuit_sub(t240, t241); // Fp2 mul real part end let t243 = circuit_mul(t229, t239); let t244 = circuit_mul(t230, t237); let t245 = circuit_add(t243, t244); // Fp2 mul imag part end let t246 = circuit_add(t242, t245); let t247 = circuit_sub(t242, t245); let t248 = circuit_mul(t246, t247); let t249 = circuit_mul(t242, t245); let t250 = circuit_add(t249, t249); let t251 = circuit_add(t136, t136); // Fp2 add coeff 0/1 let t252 = circuit_add(t137, t137); // Fp2 add coeff 1/1 let t253 = circuit_sub(t248, t251); // Fp2 sub coeff 0/1 let t254 = circuit_sub(t250, t252); // Fp2 sub coeff 1/1 let t255 = circuit_sub(t136, t253); // Fp2 sub coeff 0/1 let t256 = circuit_sub(t137, t254); // Fp2 sub coeff 1/1 let t257 = circuit_mul(t242, t255); // Fp2 mul start let t258 = circuit_mul(t245, t256); let t259 = circuit_sub(t257, t258); // Fp2 mul real part end let t260 = circuit_mul(t242, t256); let t261 = circuit_mul(t245, t255); let t262 = circuit_add(t260, t261); // Fp2 mul imag part end let t263 = circuit_sub(t259, t146); // Fp2 sub coeff 0/1 let t264 = circuit_sub(t262, t147); // Fp2 sub coeff 1/1 let t265 = circuit_mul(t242, t136); // Fp2 mul start let t266 = circuit_mul(t245, t137); let t267 = circuit_sub(t265, t266); // Fp2 mul real part end let t268 = circuit_mul(t242, t137); let t269 = circuit_mul(t245, t136); let t270 = circuit_add(t268, t269); // Fp2 mul imag part end let t271 = circuit_sub(t267, t146); // Fp2 sub coeff 0/1 let t272 = circuit_sub(t270, t147); // Fp2 sub coeff 1/1 let t273 = circuit_mul(in0, t245); let t274 = circuit_add(t242, t273); let t275 = circuit_mul(t274, in34); // eval bn line by xNegOverY let t276 = circuit_mul(in0, t272); let t277 = circuit_add(t271, t276); let t278 = circuit_mul(t277, in33); // eval bn line by yInv let t279 = circuit_mul(t245, in34); // eval bn line by xNegOverY let t280 = circuit_mul(t272, in33); // eval bn line by yInv let t281 = circuit_mul(t275, in47); // Eval sparse poly line_2p_1 step coeff_1 * z^1 let t282 = circuit_add(in1, t281); // Eval sparse poly line_2p_1 step + coeff_1 * z^1 let t283 = circuit_mul(t278, t1); // Eval sparse poly line_2p_1 step coeff_3 * z^3 let t284 = circuit_add(t282, t283); // Eval sparse poly line_2p_1 step + coeff_3 * z^3 let t285 = circuit_mul(t279, t3); // Eval sparse poly line_2p_1 step coeff_7 * z^7 let t286 = circuit_add(t284, t285); // Eval sparse poly line_2p_1 step + coeff_7 * z^7 let t287 = circuit_mul(t280, t4); // Eval sparse poly line_2p_1 step coeff_9 * z^9 let t288 = circuit_add(t286, t287); // Eval sparse poly line_2p_1 step + coeff_9 * z^9 let t289 = circuit_mul(t224, t288); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) let t290 = circuit_mul(in46, in46); let t291 = circuit_mul(t289, t290); let t292 = circuit_sub(t291, in45); // (Π(i,k) (Pk(z))) - Ri(z) let t293 = circuit_mul(in48, in43); let t294 = circuit_add(t293, t292); // LHS = c1 * LHS + ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t253, t254, t263, t264, t294).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in2 circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in3 circuit_inputs = circuit_inputs.next_2([0x6, 0x0, 0x0, 0x0]); // in4 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in5 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a0); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r0a1); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a0); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0.r1a1); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_0.r0a0); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_0.r0a1); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_0.r1a0); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_0.r1a1); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_0.r0a0); // in15 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_0.r0a1); // in16 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_0.r1a0); // in17 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_0.r1a1); // in18 circuit_inputs = circuit_inputs.next_2(yInv_1); // in19 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in20 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a0); // in21 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r0a1); // in22 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a0); // in23 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_1.r1a1); // in24 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_1.r0a0); // in25 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_1.r0a1); // in26 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_1.r1a0); // in27 circuit_inputs = circuit_inputs.next_2(G2_line_add_1_1.r1a1); // in28 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_1.r0a0); // in29 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_1.r0a1); // in30 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_1.r1a0); // in31 circuit_inputs = circuit_inputs.next_2(G2_line_dbl_0_1.r1a1); // in32 circuit_inputs = circuit_inputs.next_2(yInv_2); // in33 circuit_inputs = circuit_inputs.next_2(xNegOverY_2); // in34 circuit_inputs = circuit_inputs.next_2(Q_2.x0); // in35 circuit_inputs = circuit_inputs.next_2(Q_2.x1); // in36 circuit_inputs = circuit_inputs.next_2(Q_2.y0); // in37 circuit_inputs = circuit_inputs.next_2(Q_2.y1); // in38 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.x0); // in39 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.x1); // in40 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.y0); // in41 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_2.y1); // in42 circuit_inputs = circuit_inputs.next_2(lhs_i); // in43 circuit_inputs = circuit_inputs.next_2(f_i_of_z); // in44 circuit_inputs = circuit_inputs.next_2(f_i_plus_one_of_z); // in45 circuit_inputs = circuit_inputs.next_2(c_or_cinv_of_z); // in46 circuit_inputs = circuit_inputs.next_2(z); // in47 circuit_inputs = circuit_inputs.next_2(c1); // in48 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t253), x1: outputs.get_output(t254), y0: outputs.get_output(t263), y1: outputs.get_output(t264), }; let lhs_i_plus_one: u384 = outputs.get_output(t294); return (Q0, lhs_i_plus_one); } #[inline(always)] pub fn run_BN254_MP_CHECK_FINALIZE_2P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, line_1_0: G2Line, line_2_0: G2Line, yInv_1: u384, xNegOverY_1: u384, line_1_1: G2Line, line_2_1: G2Line, R_n_minus_2_of_z: u384, R_n_minus_1_of_z: u384, c_0: u384, w_of_z: u384, z: u384, c_inv_frob_1_of_z: u384, c_frob_2_of_z: u384, c_inv_frob_3_of_z: u384, previous_lhs: u384, R_n_minus_3_of_z: u384, Q: Array, ) -> (u384,) { // CONSTANT stack let in0 = CE::> {}; // -0x9 % p let in1 = CE::> {}; // 0x1 let in2 = CE::> {}; // 0x52 let in3 = CE::> {}; // -0x12 % p // INPUT stack let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8, in9) = (CE::> {}, CE::> {}, CE::> {}); let (in10, in11, in12) = (CE::> {}, CE::> {}, CE::> {}); let (in13, in14, in15) = (CE::> {}, CE::> {}, CE::> {}); let (in16, in17, in18) = (CE::> {}, CE::> {}, CE::> {}); let (in19, in20, in21) = (CE::> {}, CE::> {}, CE::> {}); let (in22, in23, in24) = (CE::> {}, CE::> {}, CE::> {}); let (in25, in26, in27) = (CE::> {}, CE::> {}, CE::> {}); let (in28, in29, in30) = (CE::> {}, CE::> {}, CE::> {}); let (in31, in32, in33) = (CE::> {}, CE::> {}, CE::> {}); let (in34, in35, in36) = (CE::> {}, CE::> {}, CE::> {}); let (in37, in38, in39) = (CE::> {}, CE::> {}, CE::> {}); let (in40, in41, in42) = (CE::> {}, CE::> {}, CE::> {}); let (in43, in44, in45) = (CE::> {}, CE::> {}, CE::> {}); let (in46, in47, in48) = (CE::> {}, CE::> {}, CE::> {}); let (in49, in50, in51) = (CE::> {}, CE::> {}, CE::> {}); let (in52, in53, in54) = (CE::> {}, CE::> {}, CE::> {}); let (in55, in56, in57) = (CE::> {}, CE::> {}, CE::> {}); let (in58, in59, in60) = (CE::> {}, CE::> {}, CE::> {}); let (in61, in62, in63) = (CE::> {}, CE::> {}, CE::> {}); let (in64, in65, in66) = (CE::> {}, CE::> {}, CE::> {}); let (in67, in68, in69) = (CE::> {}, CE::> {}, CE::> {}); let (in70, in71, in72) = (CE::> {}, CE::> {}, CE::> {}); let (in73, in74, in75) = (CE::> {}, CE::> {}, CE::> {}); let (in76, in77, in78) = (CE::> {}, CE::> {}, CE::> {}); let (in79, in80, in81) = (CE::> {}, CE::> {}, CE::> {}); let (in82, in83, in84) = (CE::> {}, CE::> {}, CE::> {}); let (in85, in86, in87) = (CE::> {}, CE::> {}, CE::> {}); let (in88, in89, in90) = (CE::> {}, CE::> {}, CE::> {}); let (in91, in92, in93) = (CE::> {}, CE::> {}, CE::> {}); let (in94, in95, in96) = (CE::> {}, CE::> {}, CE::> {}); let (in97, in98, in99) = (CE::> {}, CE::> {}, CE::> {}); let (in100, in101, in102) = (CE::> {}, CE::> {}, CE::> {}); let (in103, in104, in105) = (CE::> {}, CE::> {}, CE::> {}); let (in106, in107, in108) = (CE::> {}, CE::> {}, CE::> {}); let (in109, in110, in111) = (CE::> {}, CE::> {}, CE::> {}); let (in112, in113, in114) = (CE::> {}, CE::> {}, CE::> {}); let (in115, in116, in117) = (CE::> {}, CE::> {}, CE::> {}); let (in118, in119, in120) = (CE::> {}, CE::> {}, CE::> {}); let (in121, in122, in123) = (CE::> {}, CE::> {}, CE::> {}); let (in124, in125, in126) = (CE::> {}, CE::> {}, CE::> {}); let (in127, in128, in129) = (CE::> {}, CE::> {}, CE::> {}); let (in130, in131, in132) = (CE::> {}, CE::> {}, CE::> {}); let (in133, in134, in135) = (CE::> {}, CE::> {}, CE::> {}); let (in136, in137, in138) = (CE::> {}, CE::> {}, CE::> {}); let (in139, in140, in141) = (CE::> {}, CE::> {}, CE::> {}); let (in142, in143, in144) = (CE::> {}, CE::> {}, CE::> {}); let (in145, in146, in147) = (CE::> {}, CE::> {}, CE::> {}); let (in148, in149, in150) = (CE::> {}, CE::> {}, CE::> {}); let (in151, in152, in153) = (CE::> {}, CE::> {}, CE::> {}); let (in154, in155, in156) = (CE::> {}, CE::> {}, CE::> {}); let (in157, in158, in159) = (CE::> {}, CE::> {}, CE::> {}); let (in160, in161, in162) = (CE::> {}, CE::> {}, CE::> {}); let (in163, in164, in165) = (CE::> {}, CE::> {}, CE::> {}); let (in166, in167, in168) = (CE::> {}, CE::> {}, CE::> {}); let (in169, in170, in171) = (CE::> {}, CE::> {}, CE::> {}); let (in172, in173, in174) = (CE::> {}, CE::> {}, CE::> {}); let (in175, in176, in177) = (CE::> {}, CE::> {}, CE::> {}); let in178 = CE::> {}; let t0 = circuit_mul(in28, in28); // compute z^2 let t1 = circuit_mul(t0, in28); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, in28); // compute z^7 let t4 = circuit_mul(t3, t0); // compute z^9 let t5 = circuit_mul(t4, t1); // compute z^12 let t6 = circuit_mul(in0, in7); let t7 = circuit_add(in6, t6); let t8 = circuit_mul(t7, in5); // eval bn line by xNegOverY let t9 = circuit_mul(in0, in9); let t10 = circuit_add(in8, t9); let t11 = circuit_mul(t10, in4); // eval bn line by yInv let t12 = circuit_mul(in7, in5); // eval bn line by xNegOverY let t13 = circuit_mul(in9, in4); // eval bn line by yInv let t14 = circuit_mul(in0, in11); let t15 = circuit_add(in10, t14); let t16 = circuit_mul(t15, in5); // eval bn line by xNegOverY let t17 = circuit_mul(in0, in13); let t18 = circuit_add(in12, t17); let t19 = circuit_mul(t18, in4); // eval bn line by yInv let t20 = circuit_mul(in11, in5); // eval bn line by xNegOverY let t21 = circuit_mul(in13, in4); // eval bn line by yInv let t22 = circuit_mul(in0, in17); let t23 = circuit_add(in16, t22); let t24 = circuit_mul(t23, in15); // eval bn line by xNegOverY let t25 = circuit_mul(in0, in19); let t26 = circuit_add(in18, t25); let t27 = circuit_mul(t26, in14); // eval bn line by yInv let t28 = circuit_mul(in17, in15); // eval bn line by xNegOverY let t29 = circuit_mul(in19, in14); // eval bn line by yInv let t30 = circuit_mul(in0, in21); let t31 = circuit_add(in20, t30); let t32 = circuit_mul(t31, in15); // eval bn line by xNegOverY let t33 = circuit_mul(in0, in23); let t34 = circuit_add(in22, t33); let t35 = circuit_mul(t34, in14); // eval bn line by yInv let t36 = circuit_mul(in21, in15); // eval bn line by xNegOverY let t37 = circuit_mul(in23, in14); // eval bn line by yInv let t38 = circuit_mul(t8, in28); // Eval sparse poly line_0 step coeff_1 * z^1 let t39 = circuit_add(in1, t38); // Eval sparse poly line_0 step + coeff_1 * z^1 let t40 = circuit_mul(t11, t1); // Eval sparse poly line_0 step coeff_3 * z^3 let t41 = circuit_add(t39, t40); // Eval sparse poly line_0 step + coeff_3 * z^3 let t42 = circuit_mul(t12, t3); // Eval sparse poly line_0 step coeff_7 * z^7 let t43 = circuit_add(t41, t42); // Eval sparse poly line_0 step + coeff_7 * z^7 let t44 = circuit_mul(t13, t4); // Eval sparse poly line_0 step coeff_9 * z^9 let t45 = circuit_add(t43, t44); // Eval sparse poly line_0 step + coeff_9 * z^9 let t46 = circuit_mul(in33, t45); let t47 = circuit_mul(t16, in28); // Eval sparse poly line_1 step coeff_1 * z^1 let t48 = circuit_add(in1, t47); // Eval sparse poly line_1 step + coeff_1 * z^1 let t49 = circuit_mul(t19, t1); // Eval sparse poly line_1 step coeff_3 * z^3 let t50 = circuit_add(t48, t49); // Eval sparse poly line_1 step + coeff_3 * z^3 let t51 = circuit_mul(t20, t3); // Eval sparse poly line_1 step coeff_7 * z^7 let t52 = circuit_add(t50, t51); // Eval sparse poly line_1 step + coeff_7 * z^7 let t53 = circuit_mul(t21, t4); // Eval sparse poly line_1 step coeff_9 * z^9 let t54 = circuit_add(t52, t53); // Eval sparse poly line_1 step + coeff_9 * z^9 let t55 = circuit_mul(t46, t54); let t56 = circuit_mul(t24, in28); // Eval sparse poly line_2 step coeff_1 * z^1 let t57 = circuit_add(in1, t56); // Eval sparse poly line_2 step + coeff_1 * z^1 let t58 = circuit_mul(t27, t1); // Eval sparse poly line_2 step coeff_3 * z^3 let t59 = circuit_add(t57, t58); // Eval sparse poly line_2 step + coeff_3 * z^3 let t60 = circuit_mul(t28, t3); // Eval sparse poly line_2 step coeff_7 * z^7 let t61 = circuit_add(t59, t60); // Eval sparse poly line_2 step + coeff_7 * z^7 let t62 = circuit_mul(t29, t4); // Eval sparse poly line_2 step coeff_9 * z^9 let t63 = circuit_add(t61, t62); // Eval sparse poly line_2 step + coeff_9 * z^9 let t64 = circuit_mul(t55, t63); let t65 = circuit_mul(t32, in28); // Eval sparse poly line_3 step coeff_1 * z^1 let t66 = circuit_add(in1, t65); // Eval sparse poly line_3 step + coeff_1 * z^1 let t67 = circuit_mul(t35, t1); // Eval sparse poly line_3 step coeff_3 * z^3 let t68 = circuit_add(t66, t67); // Eval sparse poly line_3 step + coeff_3 * z^3 let t69 = circuit_mul(t36, t3); // Eval sparse poly line_3 step coeff_7 * z^7 let t70 = circuit_add(t68, t69); // Eval sparse poly line_3 step + coeff_7 * z^7 let t71 = circuit_mul(t37, t4); // Eval sparse poly line_3 step coeff_9 * z^9 let t72 = circuit_add(t70, t71); // Eval sparse poly line_3 step + coeff_9 * z^9 let t73 = circuit_mul(t64, t72); let t74 = circuit_sub(t73, in24); // ((Π(n-2,k) (Pk(z)) - R_n_minus_2(z)) let t75 = circuit_mul(in24, in29); let t76 = circuit_mul(t75, in30); let t77 = circuit_mul(t76, in31); let t78 = circuit_mul(t77, in27); let t79 = circuit_sub(t78, in25); // ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) let t80 = circuit_mul(in26, in32); let t81 = circuit_add(t80, t74); let t82 = circuit_mul(in26, t81); let t83 = circuit_add(t82, t79); let t84 = circuit_mul(in178, in28); // Eval big_Q Horner step: multiply by z let t85 = circuit_add(in177, t84); // Eval big_Q Horner step: add coefficient_143 let t86 = circuit_mul(t85, in28); // Eval big_Q Horner step: multiply by z let t87 = circuit_add(in176, t86); // Eval big_Q Horner step: add coefficient_142 let t88 = circuit_mul(t87, in28); // Eval big_Q Horner step: multiply by z let t89 = circuit_add(in175, t88); // Eval big_Q Horner step: add coefficient_141 let t90 = circuit_mul(t89, in28); // Eval big_Q Horner step: multiply by z let t91 = circuit_add(in174, t90); // Eval big_Q Horner step: add coefficient_140 let t92 = circuit_mul(t91, in28); // Eval big_Q Horner step: multiply by z let t93 = circuit_add(in173, t92); // Eval big_Q Horner step: add coefficient_139 let t94 = circuit_mul(t93, in28); // Eval big_Q Horner step: multiply by z let t95 = circuit_add(in172, t94); // Eval big_Q Horner step: add coefficient_138 let t96 = circuit_mul(t95, in28); // Eval big_Q Horner step: multiply by z let t97 = circuit_add(in171, t96); // Eval big_Q Horner step: add coefficient_137 let t98 = circuit_mul(t97, in28); // Eval big_Q Horner step: multiply by z let t99 = circuit_add(in170, t98); // Eval big_Q Horner step: add coefficient_136 let t100 = circuit_mul(t99, in28); // Eval big_Q Horner step: multiply by z let t101 = circuit_add(in169, t100); // Eval big_Q Horner step: add coefficient_135 let t102 = circuit_mul(t101, in28); // Eval big_Q Horner step: multiply by z let t103 = circuit_add(in168, t102); // Eval big_Q Horner step: add coefficient_134 let t104 = circuit_mul(t103, in28); // Eval big_Q Horner step: multiply by z let t105 = circuit_add(in167, t104); // Eval big_Q Horner step: add coefficient_133 let t106 = circuit_mul(t105, in28); // Eval big_Q Horner step: multiply by z let t107 = circuit_add(in166, t106); // Eval big_Q Horner step: add coefficient_132 let t108 = circuit_mul(t107, in28); // Eval big_Q Horner step: multiply by z let t109 = circuit_add(in165, t108); // Eval big_Q Horner step: add coefficient_131 let t110 = circuit_mul(t109, in28); // Eval big_Q Horner step: multiply by z let t111 = circuit_add(in164, t110); // Eval big_Q Horner step: add coefficient_130 let t112 = circuit_mul(t111, in28); // Eval big_Q Horner step: multiply by z let t113 = circuit_add(in163, t112); // Eval big_Q Horner step: add coefficient_129 let t114 = circuit_mul(t113, in28); // Eval big_Q Horner step: multiply by z let t115 = circuit_add(in162, t114); // Eval big_Q Horner step: add coefficient_128 let t116 = circuit_mul(t115, in28); // Eval big_Q Horner step: multiply by z let t117 = circuit_add(in161, t116); // Eval big_Q Horner step: add coefficient_127 let t118 = circuit_mul(t117, in28); // Eval big_Q Horner step: multiply by z let t119 = circuit_add(in160, t118); // Eval big_Q Horner step: add coefficient_126 let t120 = circuit_mul(t119, in28); // Eval big_Q Horner step: multiply by z let t121 = circuit_add(in159, t120); // Eval big_Q Horner step: add coefficient_125 let t122 = circuit_mul(t121, in28); // Eval big_Q Horner step: multiply by z let t123 = circuit_add(in158, t122); // Eval big_Q Horner step: add coefficient_124 let t124 = circuit_mul(t123, in28); // Eval big_Q Horner step: multiply by z let t125 = circuit_add(in157, t124); // Eval big_Q Horner step: add coefficient_123 let t126 = circuit_mul(t125, in28); // Eval big_Q Horner step: multiply by z let t127 = circuit_add(in156, t126); // Eval big_Q Horner step: add coefficient_122 let t128 = circuit_mul(t127, in28); // Eval big_Q Horner step: multiply by z let t129 = circuit_add(in155, t128); // Eval big_Q Horner step: add coefficient_121 let t130 = circuit_mul(t129, in28); // Eval big_Q Horner step: multiply by z let t131 = circuit_add(in154, t130); // Eval big_Q Horner step: add coefficient_120 let t132 = circuit_mul(t131, in28); // Eval big_Q Horner step: multiply by z let t133 = circuit_add(in153, t132); // Eval big_Q Horner step: add coefficient_119 let t134 = circuit_mul(t133, in28); // Eval big_Q Horner step: multiply by z let t135 = circuit_add(in152, t134); // Eval big_Q Horner step: add coefficient_118 let t136 = circuit_mul(t135, in28); // Eval big_Q Horner step: multiply by z let t137 = circuit_add(in151, t136); // Eval big_Q Horner step: add coefficient_117 let t138 = circuit_mul(t137, in28); // Eval big_Q Horner step: multiply by z let t139 = circuit_add(in150, t138); // Eval big_Q Horner step: add coefficient_116 let t140 = circuit_mul(t139, in28); // Eval big_Q Horner step: multiply by z let t141 = circuit_add(in149, t140); // Eval big_Q Horner step: add coefficient_115 let t142 = circuit_mul(t141, in28); // Eval big_Q Horner step: multiply by z let t143 = circuit_add(in148, t142); // Eval big_Q Horner step: add coefficient_114 let t144 = circuit_mul(t143, in28); // Eval big_Q Horner step: multiply by z let t145 = circuit_add(in147, t144); // Eval big_Q Horner step: add coefficient_113 let t146 = circuit_mul(t145, in28); // Eval big_Q Horner step: multiply by z let t147 = circuit_add(in146, t146); // Eval big_Q Horner step: add coefficient_112 let t148 = circuit_mul(t147, in28); // Eval big_Q Horner step: multiply by z let t149 = circuit_add(in145, t148); // Eval big_Q Horner step: add coefficient_111 let t150 = circuit_mul(t149, in28); // Eval big_Q Horner step: multiply by z let t151 = circuit_add(in144, t150); // Eval big_Q Horner step: add coefficient_110 let t152 = circuit_mul(t151, in28); // Eval big_Q Horner step: multiply by z let t153 = circuit_add(in143, t152); // Eval big_Q Horner step: add coefficient_109 let t154 = circuit_mul(t153, in28); // Eval big_Q Horner step: multiply by z let t155 = circuit_add(in142, t154); // Eval big_Q Horner step: add coefficient_108 let t156 = circuit_mul(t155, in28); // Eval big_Q Horner step: multiply by z let t157 = circuit_add(in141, t156); // Eval big_Q Horner step: add coefficient_107 let t158 = circuit_mul(t157, in28); // Eval big_Q Horner step: multiply by z let t159 = circuit_add(in140, t158); // Eval big_Q Horner step: add coefficient_106 let t160 = circuit_mul(t159, in28); // Eval big_Q Horner step: multiply by z let t161 = circuit_add(in139, t160); // Eval big_Q Horner step: add coefficient_105 let t162 = circuit_mul(t161, in28); // Eval big_Q Horner step: multiply by z let t163 = circuit_add(in138, t162); // Eval big_Q Horner step: add coefficient_104 let t164 = circuit_mul(t163, in28); // Eval big_Q Horner step: multiply by z let t165 = circuit_add(in137, t164); // Eval big_Q Horner step: add coefficient_103 let t166 = circuit_mul(t165, in28); // Eval big_Q Horner step: multiply by z let t167 = circuit_add(in136, t166); // Eval big_Q Horner step: add coefficient_102 let t168 = circuit_mul(t167, in28); // Eval big_Q Horner step: multiply by z let t169 = circuit_add(in135, t168); // Eval big_Q Horner step: add coefficient_101 let t170 = circuit_mul(t169, in28); // Eval big_Q Horner step: multiply by z let t171 = circuit_add(in134, t170); // Eval big_Q Horner step: add coefficient_100 let t172 = circuit_mul(t171, in28); // Eval big_Q Horner step: multiply by z let t173 = circuit_add(in133, t172); // Eval big_Q Horner step: add coefficient_99 let t174 = circuit_mul(t173, in28); // Eval big_Q Horner step: multiply by z let t175 = circuit_add(in132, t174); // Eval big_Q Horner step: add coefficient_98 let t176 = circuit_mul(t175, in28); // Eval big_Q Horner step: multiply by z let t177 = circuit_add(in131, t176); // Eval big_Q Horner step: add coefficient_97 let t178 = circuit_mul(t177, in28); // Eval big_Q Horner step: multiply by z let t179 = circuit_add(in130, t178); // Eval big_Q Horner step: add coefficient_96 let t180 = circuit_mul(t179, in28); // Eval big_Q Horner step: multiply by z let t181 = circuit_add(in129, t180); // Eval big_Q Horner step: add coefficient_95 let t182 = circuit_mul(t181, in28); // Eval big_Q Horner step: multiply by z let t183 = circuit_add(in128, t182); // Eval big_Q Horner step: add coefficient_94 let t184 = circuit_mul(t183, in28); // Eval big_Q Horner step: multiply by z let t185 = circuit_add(in127, t184); // Eval big_Q Horner step: add coefficient_93 let t186 = circuit_mul(t185, in28); // Eval big_Q Horner step: multiply by z let t187 = circuit_add(in126, t186); // Eval big_Q Horner step: add coefficient_92 let t188 = circuit_mul(t187, in28); // Eval big_Q Horner step: multiply by z let t189 = circuit_add(in125, t188); // Eval big_Q Horner step: add coefficient_91 let t190 = circuit_mul(t189, in28); // Eval big_Q Horner step: multiply by z let t191 = circuit_add(in124, t190); // Eval big_Q Horner step: add coefficient_90 let t192 = circuit_mul(t191, in28); // Eval big_Q Horner step: multiply by z let t193 = circuit_add(in123, t192); // Eval big_Q Horner step: add coefficient_89 let t194 = circuit_mul(t193, in28); // Eval big_Q Horner step: multiply by z let t195 = circuit_add(in122, t194); // Eval big_Q Horner step: add coefficient_88 let t196 = circuit_mul(t195, in28); // Eval big_Q Horner step: multiply by z let t197 = circuit_add(in121, t196); // Eval big_Q Horner step: add coefficient_87 let t198 = circuit_mul(t197, in28); // Eval big_Q Horner step: multiply by z let t199 = circuit_add(in120, t198); // Eval big_Q Horner step: add coefficient_86 let t200 = circuit_mul(t199, in28); // Eval big_Q Horner step: multiply by z let t201 = circuit_add(in119, t200); // Eval big_Q Horner step: add coefficient_85 let t202 = circuit_mul(t201, in28); // Eval big_Q Horner step: multiply by z let t203 = circuit_add(in118, t202); // Eval big_Q Horner step: add coefficient_84 let t204 = circuit_mul(t203, in28); // Eval big_Q Horner step: multiply by z let t205 = circuit_add(in117, t204); // Eval big_Q Horner step: add coefficient_83 let t206 = circuit_mul(t205, in28); // Eval big_Q Horner step: multiply by z let t207 = circuit_add(in116, t206); // Eval big_Q Horner step: add coefficient_82 let t208 = circuit_mul(t207, in28); // Eval big_Q Horner step: multiply by z let t209 = circuit_add(in115, t208); // Eval big_Q Horner step: add coefficient_81 let t210 = circuit_mul(t209, in28); // Eval big_Q Horner step: multiply by z let t211 = circuit_add(in114, t210); // Eval big_Q Horner step: add coefficient_80 let t212 = circuit_mul(t211, in28); // Eval big_Q Horner step: multiply by z let t213 = circuit_add(in113, t212); // Eval big_Q Horner step: add coefficient_79 let t214 = circuit_mul(t213, in28); // Eval big_Q Horner step: multiply by z let t215 = circuit_add(in112, t214); // Eval big_Q Horner step: add coefficient_78 let t216 = circuit_mul(t215, in28); // Eval big_Q Horner step: multiply by z let t217 = circuit_add(in111, t216); // Eval big_Q Horner step: add coefficient_77 let t218 = circuit_mul(t217, in28); // Eval big_Q Horner step: multiply by z let t219 = circuit_add(in110, t218); // Eval big_Q Horner step: add coefficient_76 let t220 = circuit_mul(t219, in28); // Eval big_Q Horner step: multiply by z let t221 = circuit_add(in109, t220); // Eval big_Q Horner step: add coefficient_75 let t222 = circuit_mul(t221, in28); // Eval big_Q Horner step: multiply by z let t223 = circuit_add(in108, t222); // Eval big_Q Horner step: add coefficient_74 let t224 = circuit_mul(t223, in28); // Eval big_Q Horner step: multiply by z let t225 = circuit_add(in107, t224); // Eval big_Q Horner step: add coefficient_73 let t226 = circuit_mul(t225, in28); // Eval big_Q Horner step: multiply by z let t227 = circuit_add(in106, t226); // Eval big_Q Horner step: add coefficient_72 let t228 = circuit_mul(t227, in28); // Eval big_Q Horner step: multiply by z let t229 = circuit_add(in105, t228); // Eval big_Q Horner step: add coefficient_71 let t230 = circuit_mul(t229, in28); // Eval big_Q Horner step: multiply by z let t231 = circuit_add(in104, t230); // Eval big_Q Horner step: add coefficient_70 let t232 = circuit_mul(t231, in28); // Eval big_Q Horner step: multiply by z let t233 = circuit_add(in103, t232); // Eval big_Q Horner step: add coefficient_69 let t234 = circuit_mul(t233, in28); // Eval big_Q Horner step: multiply by z let t235 = circuit_add(in102, t234); // Eval big_Q Horner step: add coefficient_68 let t236 = circuit_mul(t235, in28); // Eval big_Q Horner step: multiply by z let t237 = circuit_add(in101, t236); // Eval big_Q Horner step: add coefficient_67 let t238 = circuit_mul(t237, in28); // Eval big_Q Horner step: multiply by z let t239 = circuit_add(in100, t238); // Eval big_Q Horner step: add coefficient_66 let t240 = circuit_mul(t239, in28); // Eval big_Q Horner step: multiply by z let t241 = circuit_add(in99, t240); // Eval big_Q Horner step: add coefficient_65 let t242 = circuit_mul(t241, in28); // Eval big_Q Horner step: multiply by z let t243 = circuit_add(in98, t242); // Eval big_Q Horner step: add coefficient_64 let t244 = circuit_mul(t243, in28); // Eval big_Q Horner step: multiply by z let t245 = circuit_add(in97, t244); // Eval big_Q Horner step: add coefficient_63 let t246 = circuit_mul(t245, in28); // Eval big_Q Horner step: multiply by z let t247 = circuit_add(in96, t246); // Eval big_Q Horner step: add coefficient_62 let t248 = circuit_mul(t247, in28); // Eval big_Q Horner step: multiply by z let t249 = circuit_add(in95, t248); // Eval big_Q Horner step: add coefficient_61 let t250 = circuit_mul(t249, in28); // Eval big_Q Horner step: multiply by z let t251 = circuit_add(in94, t250); // Eval big_Q Horner step: add coefficient_60 let t252 = circuit_mul(t251, in28); // Eval big_Q Horner step: multiply by z let t253 = circuit_add(in93, t252); // Eval big_Q Horner step: add coefficient_59 let t254 = circuit_mul(t253, in28); // Eval big_Q Horner step: multiply by z let t255 = circuit_add(in92, t254); // Eval big_Q Horner step: add coefficient_58 let t256 = circuit_mul(t255, in28); // Eval big_Q Horner step: multiply by z let t257 = circuit_add(in91, t256); // Eval big_Q Horner step: add coefficient_57 let t258 = circuit_mul(t257, in28); // Eval big_Q Horner step: multiply by z let t259 = circuit_add(in90, t258); // Eval big_Q Horner step: add coefficient_56 let t260 = circuit_mul(t259, in28); // Eval big_Q Horner step: multiply by z let t261 = circuit_add(in89, t260); // Eval big_Q Horner step: add coefficient_55 let t262 = circuit_mul(t261, in28); // Eval big_Q Horner step: multiply by z let t263 = circuit_add(in88, t262); // Eval big_Q Horner step: add coefficient_54 let t264 = circuit_mul(t263, in28); // Eval big_Q Horner step: multiply by z let t265 = circuit_add(in87, t264); // Eval big_Q Horner step: add coefficient_53 let t266 = circuit_mul(t265, in28); // Eval big_Q Horner step: multiply by z let t267 = circuit_add(in86, t266); // Eval big_Q Horner step: add coefficient_52 let t268 = circuit_mul(t267, in28); // Eval big_Q Horner step: multiply by z let t269 = circuit_add(in85, t268); // Eval big_Q Horner step: add coefficient_51 let t270 = circuit_mul(t269, in28); // Eval big_Q Horner step: multiply by z let t271 = circuit_add(in84, t270); // Eval big_Q Horner step: add coefficient_50 let t272 = circuit_mul(t271, in28); // Eval big_Q Horner step: multiply by z let t273 = circuit_add(in83, t272); // Eval big_Q Horner step: add coefficient_49 let t274 = circuit_mul(t273, in28); // Eval big_Q Horner step: multiply by z let t275 = circuit_add(in82, t274); // Eval big_Q Horner step: add coefficient_48 let t276 = circuit_mul(t275, in28); // Eval big_Q Horner step: multiply by z let t277 = circuit_add(in81, t276); // Eval big_Q Horner step: add coefficient_47 let t278 = circuit_mul(t277, in28); // Eval big_Q Horner step: multiply by z let t279 = circuit_add(in80, t278); // Eval big_Q Horner step: add coefficient_46 let t280 = circuit_mul(t279, in28); // Eval big_Q Horner step: multiply by z let t281 = circuit_add(in79, t280); // Eval big_Q Horner step: add coefficient_45 let t282 = circuit_mul(t281, in28); // Eval big_Q Horner step: multiply by z let t283 = circuit_add(in78, t282); // Eval big_Q Horner step: add coefficient_44 let t284 = circuit_mul(t283, in28); // Eval big_Q Horner step: multiply by z let t285 = circuit_add(in77, t284); // Eval big_Q Horner step: add coefficient_43 let t286 = circuit_mul(t285, in28); // Eval big_Q Horner step: multiply by z let t287 = circuit_add(in76, t286); // Eval big_Q Horner step: add coefficient_42 let t288 = circuit_mul(t287, in28); // Eval big_Q Horner step: multiply by z let t289 = circuit_add(in75, t288); // Eval big_Q Horner step: add coefficient_41 let t290 = circuit_mul(t289, in28); // Eval big_Q Horner step: multiply by z let t291 = circuit_add(in74, t290); // Eval big_Q Horner step: add coefficient_40 let t292 = circuit_mul(t291, in28); // Eval big_Q Horner step: multiply by z let t293 = circuit_add(in73, t292); // Eval big_Q Horner step: add coefficient_39 let t294 = circuit_mul(t293, in28); // Eval big_Q Horner step: multiply by z let t295 = circuit_add(in72, t294); // Eval big_Q Horner step: add coefficient_38 let t296 = circuit_mul(t295, in28); // Eval big_Q Horner step: multiply by z let t297 = circuit_add(in71, t296); // Eval big_Q Horner step: add coefficient_37 let t298 = circuit_mul(t297, in28); // Eval big_Q Horner step: multiply by z let t299 = circuit_add(in70, t298); // Eval big_Q Horner step: add coefficient_36 let t300 = circuit_mul(t299, in28); // Eval big_Q Horner step: multiply by z let t301 = circuit_add(in69, t300); // Eval big_Q Horner step: add coefficient_35 let t302 = circuit_mul(t301, in28); // Eval big_Q Horner step: multiply by z let t303 = circuit_add(in68, t302); // Eval big_Q Horner step: add coefficient_34 let t304 = circuit_mul(t303, in28); // Eval big_Q Horner step: multiply by z let t305 = circuit_add(in67, t304); // Eval big_Q Horner step: add coefficient_33 let t306 = circuit_mul(t305, in28); // Eval big_Q Horner step: multiply by z let t307 = circuit_add(in66, t306); // Eval big_Q Horner step: add coefficient_32 let t308 = circuit_mul(t307, in28); // Eval big_Q Horner step: multiply by z let t309 = circuit_add(in65, t308); // Eval big_Q Horner step: add coefficient_31 let t310 = circuit_mul(t309, in28); // Eval big_Q Horner step: multiply by z let t311 = circuit_add(in64, t310); // Eval big_Q Horner step: add coefficient_30 let t312 = circuit_mul(t311, in28); // Eval big_Q Horner step: multiply by z let t313 = circuit_add(in63, t312); // Eval big_Q Horner step: add coefficient_29 let t314 = circuit_mul(t313, in28); // Eval big_Q Horner step: multiply by z let t315 = circuit_add(in62, t314); // Eval big_Q Horner step: add coefficient_28 let t316 = circuit_mul(t315, in28); // Eval big_Q Horner step: multiply by z let t317 = circuit_add(in61, t316); // Eval big_Q Horner step: add coefficient_27 let t318 = circuit_mul(t317, in28); // Eval big_Q Horner step: multiply by z let t319 = circuit_add(in60, t318); // Eval big_Q Horner step: add coefficient_26 let t320 = circuit_mul(t319, in28); // Eval big_Q Horner step: multiply by z let t321 = circuit_add(in59, t320); // Eval big_Q Horner step: add coefficient_25 let t322 = circuit_mul(t321, in28); // Eval big_Q Horner step: multiply by z let t323 = circuit_add(in58, t322); // Eval big_Q Horner step: add coefficient_24 let t324 = circuit_mul(t323, in28); // Eval big_Q Horner step: multiply by z let t325 = circuit_add(in57, t324); // Eval big_Q Horner step: add coefficient_23 let t326 = circuit_mul(t325, in28); // Eval big_Q Horner step: multiply by z let t327 = circuit_add(in56, t326); // Eval big_Q Horner step: add coefficient_22 let t328 = circuit_mul(t327, in28); // Eval big_Q Horner step: multiply by z let t329 = circuit_add(in55, t328); // Eval big_Q Horner step: add coefficient_21 let t330 = circuit_mul(t329, in28); // Eval big_Q Horner step: multiply by z let t331 = circuit_add(in54, t330); // Eval big_Q Horner step: add coefficient_20 let t332 = circuit_mul(t331, in28); // Eval big_Q Horner step: multiply by z let t333 = circuit_add(in53, t332); // Eval big_Q Horner step: add coefficient_19 let t334 = circuit_mul(t333, in28); // Eval big_Q Horner step: multiply by z let t335 = circuit_add(in52, t334); // Eval big_Q Horner step: add coefficient_18 let t336 = circuit_mul(t335, in28); // Eval big_Q Horner step: multiply by z let t337 = circuit_add(in51, t336); // Eval big_Q Horner step: add coefficient_17 let t338 = circuit_mul(t337, in28); // Eval big_Q Horner step: multiply by z let t339 = circuit_add(in50, t338); // Eval big_Q Horner step: add coefficient_16 let t340 = circuit_mul(t339, in28); // Eval big_Q Horner step: multiply by z let t341 = circuit_add(in49, t340); // Eval big_Q Horner step: add coefficient_15 let t342 = circuit_mul(t341, in28); // Eval big_Q Horner step: multiply by z let t343 = circuit_add(in48, t342); // Eval big_Q Horner step: add coefficient_14 let t344 = circuit_mul(t343, in28); // Eval big_Q Horner step: multiply by z let t345 = circuit_add(in47, t344); // Eval big_Q Horner step: add coefficient_13 let t346 = circuit_mul(t345, in28); // Eval big_Q Horner step: multiply by z let t347 = circuit_add(in46, t346); // Eval big_Q Horner step: add coefficient_12 let t348 = circuit_mul(t347, in28); // Eval big_Q Horner step: multiply by z let t349 = circuit_add(in45, t348); // Eval big_Q Horner step: add coefficient_11 let t350 = circuit_mul(t349, in28); // Eval big_Q Horner step: multiply by z let t351 = circuit_add(in44, t350); // Eval big_Q Horner step: add coefficient_10 let t352 = circuit_mul(t351, in28); // Eval big_Q Horner step: multiply by z let t353 = circuit_add(in43, t352); // Eval big_Q Horner step: add coefficient_9 let t354 = circuit_mul(t353, in28); // Eval big_Q Horner step: multiply by z let t355 = circuit_add(in42, t354); // Eval big_Q Horner step: add coefficient_8 let t356 = circuit_mul(t355, in28); // Eval big_Q Horner step: multiply by z let t357 = circuit_add(in41, t356); // Eval big_Q Horner step: add coefficient_7 let t358 = circuit_mul(t357, in28); // Eval big_Q Horner step: multiply by z let t359 = circuit_add(in40, t358); // Eval big_Q Horner step: add coefficient_6 let t360 = circuit_mul(t359, in28); // Eval big_Q Horner step: multiply by z let t361 = circuit_add(in39, t360); // Eval big_Q Horner step: add coefficient_5 let t362 = circuit_mul(t361, in28); // Eval big_Q Horner step: multiply by z let t363 = circuit_add(in38, t362); // Eval big_Q Horner step: add coefficient_4 let t364 = circuit_mul(t363, in28); // Eval big_Q Horner step: multiply by z let t365 = circuit_add(in37, t364); // Eval big_Q Horner step: add coefficient_3 let t366 = circuit_mul(t365, in28); // Eval big_Q Horner step: multiply by z let t367 = circuit_add(in36, t366); // Eval big_Q Horner step: add coefficient_2 let t368 = circuit_mul(t367, in28); // Eval big_Q Horner step: multiply by z let t369 = circuit_add(in35, t368); // Eval big_Q Horner step: add coefficient_1 let t370 = circuit_mul(t369, in28); // Eval big_Q Horner step: multiply by z let t371 = circuit_add(in34, t370); // Eval big_Q Horner step: add coefficient_0 let t372 = circuit_mul(in3, t2); // Eval sparse poly P_irr step coeff_6 * z^6 let t373 = circuit_add(in2, t372); // Eval sparse poly P_irr step + coeff_6 * z^6 let t374 = circuit_add(t373, t5); // Eval sparse poly P_irr step + 1*z^12 let t375 = circuit_mul(t371, t374); let t376 = circuit_sub(t83, t375); let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t376,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x52, 0x0, 0x0, 0x0]); // in2 circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd35, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in3 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in4 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in5 circuit_inputs = circuit_inputs.next_2(line_1_0.r0a0); // in6 circuit_inputs = circuit_inputs.next_2(line_1_0.r0a1); // in7 circuit_inputs = circuit_inputs.next_2(line_1_0.r1a0); // in8 circuit_inputs = circuit_inputs.next_2(line_1_0.r1a1); // in9 circuit_inputs = circuit_inputs.next_2(line_2_0.r0a0); // in10 circuit_inputs = circuit_inputs.next_2(line_2_0.r0a1); // in11 circuit_inputs = circuit_inputs.next_2(line_2_0.r1a0); // in12 circuit_inputs = circuit_inputs.next_2(line_2_0.r1a1); // in13 circuit_inputs = circuit_inputs.next_2(yInv_1); // in14 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in15 circuit_inputs = circuit_inputs.next_2(line_1_1.r0a0); // in16 circuit_inputs = circuit_inputs.next_2(line_1_1.r0a1); // in17 circuit_inputs = circuit_inputs.next_2(line_1_1.r1a0); // in18 circuit_inputs = circuit_inputs.next_2(line_1_1.r1a1); // in19 circuit_inputs = circuit_inputs.next_2(line_2_1.r0a0); // in20 circuit_inputs = circuit_inputs.next_2(line_2_1.r0a1); // in21 circuit_inputs = circuit_inputs.next_2(line_2_1.r1a0); // in22 circuit_inputs = circuit_inputs.next_2(line_2_1.r1a1); // in23 circuit_inputs = circuit_inputs.next_2(R_n_minus_2_of_z); // in24 circuit_inputs = circuit_inputs.next_2(R_n_minus_1_of_z); // in25 circuit_inputs = circuit_inputs.next_2(c_0); // in26 circuit_inputs = circuit_inputs.next_2(w_of_z); // in27 circuit_inputs = circuit_inputs.next_2(z); // in28 circuit_inputs = circuit_inputs.next_2(c_inv_frob_1_of_z); // in29 circuit_inputs = circuit_inputs.next_2(c_frob_2_of_z); // in30 circuit_inputs = circuit_inputs.next_2(c_inv_frob_3_of_z); // in31 circuit_inputs = circuit_inputs.next_2(previous_lhs); // in32 circuit_inputs = circuit_inputs.next_2(R_n_minus_3_of_z); // in33 for val in Q.span() { circuit_inputs = circuit_inputs.next_2(*val); } // in34 - in178 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let final_check: u384 = outputs.get_output(t376); return (final_check,); } #[inline(always)] pub fn run_BN254_MP_CHECK_FINALIZE_3P_2F_EXT_MLR_circuit( yInv_0: u384, xNegOverY_0: u384, line_1_0: G2Line, line_2_0: G2Line, yInv_1: u384, xNegOverY_1: u384, line_1_1: G2Line, line_2_1: G2Line, original_Q2: G2Point, yInv_2: u384, xNegOverY_2: u384, Q_2: G2Point, R_n_minus_2_of_z: u384, R_n_minus_1_of_z: u384, c_0: u384, w_of_z: u384, z: u384, c_inv_frob_1_of_z: u384, c_frob_2_of_z: u384, c_inv_frob_3_of_z: u384, previous_lhs: u384, R_n_minus_3_of_z: u384, Q: Array, precomputed_miller_loop_result_of_z: u384, ) -> (u384,) { // CONSTANT stack let in0 = CE::> {}; // 0x2fb347984f7911f74c0bec3cf559b143b78cc310c2c3330c99e39557176f553d let in1 = CE::> {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 let in2 = CE::> {}; // 0x63cf305489af5dcdc5ec698b6e2f9b9dbaae0eda9c95998dc54014671a0135a let in3 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 let in4 = CE::> {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 let in5 = CE::> {}; // 0x1 let in6 = CE::> {}; // 0x0 let in7 = CE::> {}; // -0x9 % p let in8 = CE::> {}; // 0x52 let in9 = CE::> {}; // -0x12 % p // INPUT stack let (in10, in11, in12) = (CE::> {}, CE::> {}, CE::> {}); let (in13, in14, in15) = (CE::> {}, CE::> {}, CE::> {}); let (in16, in17, in18) = (CE::> {}, CE::> {}, CE::> {}); let (in19, in20, in21) = (CE::> {}, CE::> {}, CE::> {}); let (in22, in23, in24) = (CE::> {}, CE::> {}, CE::> {}); let (in25, in26, in27) = (CE::> {}, CE::> {}, CE::> {}); let (in28, in29, in30) = (CE::> {}, CE::> {}, CE::> {}); let (in31, in32, in33) = (CE::> {}, CE::> {}, CE::> {}); let (in34, in35, in36) = (CE::> {}, CE::> {}, CE::> {}); let (in37, in38, in39) = (CE::> {}, CE::> {}, CE::> {}); let (in40, in41, in42) = (CE::> {}, CE::> {}, CE::> {}); let (in43, in44, in45) = (CE::> {}, CE::> {}, CE::> {}); let (in46, in47, in48) = (CE::> {}, CE::> {}, CE::> {}); let (in49, in50, in51) = (CE::> {}, CE::> {}, CE::> {}); let (in52, in53, in54) = (CE::> {}, CE::> {}, CE::> {}); let (in55, in56, in57) = (CE::> {}, CE::> {}, CE::> {}); let (in58, in59, in60) = (CE::> {}, CE::> {}, CE::> {}); let (in61, in62, in63) = (CE::> {}, CE::> {}, CE::> {}); let (in64, in65, in66) = (CE::> {}, CE::> {}, CE::> {}); let (in67, in68, in69) = (CE::> {}, CE::> {}, CE::> {}); let (in70, in71, in72) = (CE::> {}, CE::> {}, CE::> {}); let (in73, in74, in75) = (CE::> {}, CE::> {}, CE::> {}); let (in76, in77, in78) = (CE::> {}, CE::> {}, CE::> {}); let (in79, in80, in81) = (CE::> {}, CE::> {}, CE::> {}); let (in82, in83, in84) = (CE::> {}, CE::> {}, CE::> {}); let (in85, in86, in87) = (CE::> {}, CE::> {}, CE::> {}); let (in88, in89, in90) = (CE::> {}, CE::> {}, CE::> {}); let (in91, in92, in93) = (CE::> {}, CE::> {}, CE::> {}); let (in94, in95, in96) = (CE::> {}, CE::> {}, CE::> {}); let (in97, in98, in99) = (CE::> {}, CE::> {}, CE::> {}); let (in100, in101, in102) = (CE::> {}, CE::> {}, CE::> {}); let (in103, in104, in105) = (CE::> {}, CE::> {}, CE::> {}); let (in106, in107, in108) = (CE::> {}, CE::> {}, CE::> {}); let (in109, in110, in111) = (CE::> {}, CE::> {}, CE::> {}); let (in112, in113, in114) = (CE::> {}, CE::> {}, CE::> {}); let (in115, in116, in117) = (CE::> {}, CE::> {}, CE::> {}); let (in118, in119, in120) = (CE::> {}, CE::> {}, CE::> {}); let (in121, in122, in123) = (CE::> {}, CE::> {}, CE::> {}); let (in124, in125, in126) = (CE::> {}, CE::> {}, CE::> {}); let (in127, in128, in129) = (CE::> {}, CE::> {}, CE::> {}); let (in130, in131, in132) = (CE::> {}, CE::> {}, CE::> {}); let (in133, in134, in135) = (CE::> {}, CE::> {}, CE::> {}); let (in136, in137, in138) = (CE::> {}, CE::> {}, CE::> {}); let (in139, in140, in141) = (CE::> {}, CE::> {}, CE::> {}); let (in142, in143, in144) = (CE::> {}, CE::> {}, CE::> {}); let (in145, in146, in147) = (CE::> {}, CE::> {}, CE::> {}); let (in148, in149, in150) = (CE::> {}, CE::> {}, CE::> {}); let (in151, in152, in153) = (CE::> {}, CE::> {}, CE::> {}); let (in154, in155, in156) = (CE::> {}, CE::> {}, CE::> {}); let (in157, in158, in159) = (CE::> {}, CE::> {}, CE::> {}); let (in160, in161, in162) = (CE::> {}, CE::> {}, CE::> {}); let (in163, in164, in165) = (CE::> {}, CE::> {}, CE::> {}); let (in166, in167, in168) = (CE::> {}, CE::> {}, CE::> {}); let (in169, in170, in171) = (CE::> {}, CE::> {}, CE::> {}); let (in172, in173, in174) = (CE::> {}, CE::> {}, CE::> {}); let (in175, in176, in177) = (CE::> {}, CE::> {}, CE::> {}); let (in178, in179, in180) = (CE::> {}, CE::> {}, CE::> {}); let (in181, in182, in183) = (CE::> {}, CE::> {}, CE::> {}); let (in184, in185, in186) = (CE::> {}, CE::> {}, CE::> {}); let (in187, in188, in189) = (CE::> {}, CE::> {}, CE::> {}); let (in190, in191, in192) = (CE::> {}, CE::> {}, CE::> {}); let (in193, in194, in195) = (CE::> {}, CE::> {}, CE::> {}); let (in196, in197, in198) = (CE::> {}, CE::> {}, CE::> {}); let (in199, in200, in201) = (CE::> {}, CE::> {}, CE::> {}); let (in202, in203, in204) = (CE::> {}, CE::> {}, CE::> {}); let (in205, in206, in207) = (CE::> {}, CE::> {}, CE::> {}); let (in208, in209, in210) = (CE::> {}, CE::> {}, CE::> {}); let (in211, in212, in213) = (CE::> {}, CE::> {}, CE::> {}); let (in214, in215, in216) = (CE::> {}, CE::> {}, CE::> {}); let (in217, in218, in219) = (CE::> {}, CE::> {}, CE::> {}); let (in220, in221, in222) = (CE::> {}, CE::> {}, CE::> {}); let (in223, in224, in225) = (CE::> {}, CE::> {}, CE::> {}); let (in226, in227, in228) = (CE::> {}, CE::> {}, CE::> {}); let (in229, in230, in231) = (CE::> {}, CE::> {}, CE::> {}); let (in232, in233, in234) = (CE::> {}, CE::> {}, CE::> {}); let (in235, in236, in237) = (CE::> {}, CE::> {}, CE::> {}); let (in238, in239, in240) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_mul(in44, in44); // compute z^2 let t1 = circuit_mul(t0, in44); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, in44); // compute z^7 let t4 = circuit_mul(t3, t0); // compute z^9 let t5 = circuit_mul(t4, t1); // compute z^12 let t6 = circuit_sub(in6, in31); let t7 = circuit_sub(in6, in33); let t8 = circuit_mul(in30, in0); // Fp2 mul start let t9 = circuit_mul(t6, in1); let t10 = circuit_sub(t8, t9); // Fp2 mul real part end let t11 = circuit_mul(in30, in1); let t12 = circuit_mul(t6, in0); let t13 = circuit_add(t11, t12); // Fp2 mul imag part end let t14 = circuit_mul(in32, in2); // Fp2 mul start let t15 = circuit_mul(t7, in3); let t16 = circuit_sub(t14, t15); // Fp2 mul real part end let t17 = circuit_mul(in32, in3); let t18 = circuit_mul(t7, in2); let t19 = circuit_add(t17, t18); // Fp2 mul imag part end let t20 = circuit_mul(in30, in4); // Fp2 scalar mul coeff 0/1 let t21 = circuit_mul(in31, in4); // Fp2 scalar mul coeff 1/1 let t22 = circuit_mul(in32, in5); // Fp2 scalar mul coeff 0/1 let t23 = circuit_mul(in33, in5); // Fp2 scalar mul coeff 1/1 let t24 = circuit_sub(in38, t16); // Fp2 sub coeff 0/1 let t25 = circuit_sub(in39, t19); // Fp2 sub coeff 1/1 let t26 = circuit_sub(in36, t10); // Fp2 sub coeff 0/1 let t27 = circuit_sub(in37, t13); // Fp2 sub coeff 1/1 let t28 = circuit_mul(t26, t26); // Fp2 Inv start let t29 = circuit_mul(t27, t27); let t30 = circuit_add(t28, t29); let t31 = circuit_inverse(t30); let t32 = circuit_mul(t26, t31); // Fp2 Inv real part end let t33 = circuit_mul(t27, t31); let t34 = circuit_sub(in6, t33); // Fp2 Inv imag part end let t35 = circuit_mul(t24, t32); // Fp2 mul start let t36 = circuit_mul(t25, t34); let t37 = circuit_sub(t35, t36); // Fp2 mul real part end let t38 = circuit_mul(t24, t34); let t39 = circuit_mul(t25, t32); let t40 = circuit_add(t38, t39); // Fp2 mul imag part end let t41 = circuit_add(t37, t40); let t42 = circuit_sub(t37, t40); let t43 = circuit_mul(t41, t42); let t44 = circuit_mul(t37, t40); let t45 = circuit_add(t44, t44); let t46 = circuit_add(in36, t10); // Fp2 add coeff 0/1 let t47 = circuit_add(in37, t13); // Fp2 add coeff 1/1 let t48 = circuit_sub(t43, t46); // Fp2 sub coeff 0/1 let t49 = circuit_sub(t45, t47); // Fp2 sub coeff 1/1 let t50 = circuit_sub(in36, t48); // Fp2 sub coeff 0/1 let t51 = circuit_sub(in37, t49); // Fp2 sub coeff 1/1 let t52 = circuit_mul(t37, t50); // Fp2 mul start let t53 = circuit_mul(t40, t51); let t54 = circuit_sub(t52, t53); // Fp2 mul real part end let t55 = circuit_mul(t37, t51); let t56 = circuit_mul(t40, t50); let t57 = circuit_add(t55, t56); // Fp2 mul imag part end let t58 = circuit_sub(t54, in38); // Fp2 sub coeff 0/1 let t59 = circuit_sub(t57, in39); // Fp2 sub coeff 1/1 let t60 = circuit_mul(t37, in36); // Fp2 mul start let t61 = circuit_mul(t40, in37); let t62 = circuit_sub(t60, t61); // Fp2 mul real part end let t63 = circuit_mul(t37, in37); let t64 = circuit_mul(t40, in36); let t65 = circuit_add(t63, t64); // Fp2 mul imag part end let t66 = circuit_sub(t62, in38); // Fp2 sub coeff 0/1 let t67 = circuit_sub(t65, in39); // Fp2 sub coeff 1/1 let t68 = circuit_sub(t58, t22); // Fp2 sub coeff 0/1 let t69 = circuit_sub(t59, t23); // Fp2 sub coeff 1/1 let t70 = circuit_sub(t48, t20); // Fp2 sub coeff 0/1 let t71 = circuit_sub(t49, t21); // Fp2 sub coeff 1/1 let t72 = circuit_mul(t70, t70); // Fp2 Inv start let t73 = circuit_mul(t71, t71); let t74 = circuit_add(t72, t73); let t75 = circuit_inverse(t74); let t76 = circuit_mul(t70, t75); // Fp2 Inv real part end let t77 = circuit_mul(t71, t75); let t78 = circuit_sub(in6, t77); // Fp2 Inv imag part end let t79 = circuit_mul(t68, t76); // Fp2 mul start let t80 = circuit_mul(t69, t78); let t81 = circuit_sub(t79, t80); // Fp2 mul real part end let t82 = circuit_mul(t68, t78); let t83 = circuit_mul(t69, t76); let t84 = circuit_add(t82, t83); // Fp2 mul imag part end let t85 = circuit_mul(t81, t48); // Fp2 mul start let t86 = circuit_mul(t84, t49); let t87 = circuit_sub(t85, t86); // Fp2 mul real part end let t88 = circuit_mul(t81, t49); let t89 = circuit_mul(t84, t48); let t90 = circuit_add(t88, t89); // Fp2 mul imag part end let t91 = circuit_sub(t87, t58); // Fp2 sub coeff 0/1 let t92 = circuit_sub(t90, t59); // Fp2 sub coeff 1/1 let t93 = circuit_mul(in7, in13); let t94 = circuit_add(in12, t93); let t95 = circuit_mul(t94, in11); // eval bn line by xNegOverY let t96 = circuit_mul(in7, in15); let t97 = circuit_add(in14, t96); let t98 = circuit_mul(t97, in10); // eval bn line by yInv let t99 = circuit_mul(in13, in11); // eval bn line by xNegOverY let t100 = circuit_mul(in15, in10); // eval bn line by yInv let t101 = circuit_mul(in7, in17); let t102 = circuit_add(in16, t101); let t103 = circuit_mul(t102, in11); // eval bn line by xNegOverY let t104 = circuit_mul(in7, in19); let t105 = circuit_add(in18, t104); let t106 = circuit_mul(t105, in10); // eval bn line by yInv let t107 = circuit_mul(in17, in11); // eval bn line by xNegOverY let t108 = circuit_mul(in19, in10); // eval bn line by yInv let t109 = circuit_mul(in7, in23); let t110 = circuit_add(in22, t109); let t111 = circuit_mul(t110, in21); // eval bn line by xNegOverY let t112 = circuit_mul(in7, in25); let t113 = circuit_add(in24, t112); let t114 = circuit_mul(t113, in20); // eval bn line by yInv let t115 = circuit_mul(in23, in21); // eval bn line by xNegOverY let t116 = circuit_mul(in25, in20); // eval bn line by yInv let t117 = circuit_mul(in7, in27); let t118 = circuit_add(in26, t117); let t119 = circuit_mul(t118, in21); // eval bn line by xNegOverY let t120 = circuit_mul(in7, in29); let t121 = circuit_add(in28, t120); let t122 = circuit_mul(t121, in20); // eval bn line by yInv let t123 = circuit_mul(in27, in21); // eval bn line by xNegOverY let t124 = circuit_mul(in29, in20); // eval bn line by yInv let t125 = circuit_mul(in7, t40); let t126 = circuit_add(t37, t125); let t127 = circuit_mul(t126, in35); // eval bn line by xNegOverY let t128 = circuit_mul(in7, t67); let t129 = circuit_add(t66, t128); let t130 = circuit_mul(t129, in34); // eval bn line by yInv let t131 = circuit_mul(t40, in35); // eval bn line by xNegOverY let t132 = circuit_mul(t67, in34); // eval bn line by yInv let t133 = circuit_mul(in7, t84); let t134 = circuit_add(t81, t133); let t135 = circuit_mul(t134, in35); // eval bn line by xNegOverY let t136 = circuit_mul(in7, t92); let t137 = circuit_add(t91, t136); let t138 = circuit_mul(t137, in34); // eval bn line by yInv let t139 = circuit_mul(t84, in35); // eval bn line by xNegOverY let t140 = circuit_mul(t92, in34); // eval bn line by yInv let t141 = circuit_mul(t95, in44); // Eval sparse poly line_0 step coeff_1 * z^1 let t142 = circuit_add(in5, t141); // Eval sparse poly line_0 step + coeff_1 * z^1 let t143 = circuit_mul(t98, t1); // Eval sparse poly line_0 step coeff_3 * z^3 let t144 = circuit_add(t142, t143); // Eval sparse poly line_0 step + coeff_3 * z^3 let t145 = circuit_mul(t99, t3); // Eval sparse poly line_0 step coeff_7 * z^7 let t146 = circuit_add(t144, t145); // Eval sparse poly line_0 step + coeff_7 * z^7 let t147 = circuit_mul(t100, t4); // Eval sparse poly line_0 step coeff_9 * z^9 let t148 = circuit_add(t146, t147); // Eval sparse poly line_0 step + coeff_9 * z^9 let t149 = circuit_mul(in49, t148); let t150 = circuit_mul(t103, in44); // Eval sparse poly line_1 step coeff_1 * z^1 let t151 = circuit_add(in5, t150); // Eval sparse poly line_1 step + coeff_1 * z^1 let t152 = circuit_mul(t106, t1); // Eval sparse poly line_1 step coeff_3 * z^3 let t153 = circuit_add(t151, t152); // Eval sparse poly line_1 step + coeff_3 * z^3 let t154 = circuit_mul(t107, t3); // Eval sparse poly line_1 step coeff_7 * z^7 let t155 = circuit_add(t153, t154); // Eval sparse poly line_1 step + coeff_7 * z^7 let t156 = circuit_mul(t108, t4); // Eval sparse poly line_1 step coeff_9 * z^9 let t157 = circuit_add(t155, t156); // Eval sparse poly line_1 step + coeff_9 * z^9 let t158 = circuit_mul(t149, t157); let t159 = circuit_mul(t111, in44); // Eval sparse poly line_2 step coeff_1 * z^1 let t160 = circuit_add(in5, t159); // Eval sparse poly line_2 step + coeff_1 * z^1 let t161 = circuit_mul(t114, t1); // Eval sparse poly line_2 step coeff_3 * z^3 let t162 = circuit_add(t160, t161); // Eval sparse poly line_2 step + coeff_3 * z^3 let t163 = circuit_mul(t115, t3); // Eval sparse poly line_2 step coeff_7 * z^7 let t164 = circuit_add(t162, t163); // Eval sparse poly line_2 step + coeff_7 * z^7 let t165 = circuit_mul(t116, t4); // Eval sparse poly line_2 step coeff_9 * z^9 let t166 = circuit_add(t164, t165); // Eval sparse poly line_2 step + coeff_9 * z^9 let t167 = circuit_mul(t158, t166); let t168 = circuit_mul(t119, in44); // Eval sparse poly line_3 step coeff_1 * z^1 let t169 = circuit_add(in5, t168); // Eval sparse poly line_3 step + coeff_1 * z^1 let t170 = circuit_mul(t122, t1); // Eval sparse poly line_3 step coeff_3 * z^3 let t171 = circuit_add(t169, t170); // Eval sparse poly line_3 step + coeff_3 * z^3 let t172 = circuit_mul(t123, t3); // Eval sparse poly line_3 step coeff_7 * z^7 let t173 = circuit_add(t171, t172); // Eval sparse poly line_3 step + coeff_7 * z^7 let t174 = circuit_mul(t124, t4); // Eval sparse poly line_3 step coeff_9 * z^9 let t175 = circuit_add(t173, t174); // Eval sparse poly line_3 step + coeff_9 * z^9 let t176 = circuit_mul(t167, t175); let t177 = circuit_mul(t127, in44); // Eval sparse poly line_4 step coeff_1 * z^1 let t178 = circuit_add(in5, t177); // Eval sparse poly line_4 step + coeff_1 * z^1 let t179 = circuit_mul(t130, t1); // Eval sparse poly line_4 step coeff_3 * z^3 let t180 = circuit_add(t178, t179); // Eval sparse poly line_4 step + coeff_3 * z^3 let t181 = circuit_mul(t131, t3); // Eval sparse poly line_4 step coeff_7 * z^7 let t182 = circuit_add(t180, t181); // Eval sparse poly line_4 step + coeff_7 * z^7 let t183 = circuit_mul(t132, t4); // Eval sparse poly line_4 step coeff_9 * z^9 let t184 = circuit_add(t182, t183); // Eval sparse poly line_4 step + coeff_9 * z^9 let t185 = circuit_mul(t176, t184); let t186 = circuit_mul(t135, in44); // Eval sparse poly line_5 step coeff_1 * z^1 let t187 = circuit_add(in5, t186); // Eval sparse poly line_5 step + coeff_1 * z^1 let t188 = circuit_mul(t138, t1); // Eval sparse poly line_5 step coeff_3 * z^3 let t189 = circuit_add(t187, t188); // Eval sparse poly line_5 step + coeff_3 * z^3 let t190 = circuit_mul(t139, t3); // Eval sparse poly line_5 step coeff_7 * z^7 let t191 = circuit_add(t189, t190); // Eval sparse poly line_5 step + coeff_7 * z^7 let t192 = circuit_mul(t140, t4); // Eval sparse poly line_5 step coeff_9 * z^9 let t193 = circuit_add(t191, t192); // Eval sparse poly line_5 step + coeff_9 * z^9 let t194 = circuit_mul(t185, t193); let t195 = circuit_sub(t194, in40); // ((Π(n-2,k) (Pk(z)) - R_n_minus_2(z)) let t196 = circuit_mul(in40, in45); let t197 = circuit_mul(t196, in46); let t198 = circuit_mul(t197, in47); let t199 = circuit_mul(t198, in43); let t200 = circuit_mul(t199, in240); let t201 = circuit_sub(t200, in41); // ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) let t202 = circuit_mul(in42, in48); let t203 = circuit_add(t202, t195); let t204 = circuit_mul(in42, t203); let t205 = circuit_add(t204, t201); let t206 = circuit_mul(in239, in44); // Eval big_Q Horner step: multiply by z let t207 = circuit_add(in238, t206); // Eval big_Q Horner step: add coefficient_188 let t208 = circuit_mul(t207, in44); // Eval big_Q Horner step: multiply by z let t209 = circuit_add(in237, t208); // Eval big_Q Horner step: add coefficient_187 let t210 = circuit_mul(t209, in44); // Eval big_Q Horner step: multiply by z let t211 = circuit_add(in236, t210); // Eval big_Q Horner step: add coefficient_186 let t212 = circuit_mul(t211, in44); // Eval big_Q Horner step: multiply by z let t213 = circuit_add(in235, t212); // Eval big_Q Horner step: add coefficient_185 let t214 = circuit_mul(t213, in44); // Eval big_Q Horner step: multiply by z let t215 = circuit_add(in234, t214); // Eval big_Q Horner step: add coefficient_184 let t216 = circuit_mul(t215, in44); // Eval big_Q Horner step: multiply by z let t217 = circuit_add(in233, t216); // Eval big_Q Horner step: add coefficient_183 let t218 = circuit_mul(t217, in44); // Eval big_Q Horner step: multiply by z let t219 = circuit_add(in232, t218); // Eval big_Q Horner step: add coefficient_182 let t220 = circuit_mul(t219, in44); // Eval big_Q Horner step: multiply by z let t221 = circuit_add(in231, t220); // Eval big_Q Horner step: add coefficient_181 let t222 = circuit_mul(t221, in44); // Eval big_Q Horner step: multiply by z let t223 = circuit_add(in230, t222); // Eval big_Q Horner step: add coefficient_180 let t224 = circuit_mul(t223, in44); // Eval big_Q Horner step: multiply by z let t225 = circuit_add(in229, t224); // Eval big_Q Horner step: add coefficient_179 let t226 = circuit_mul(t225, in44); // Eval big_Q Horner step: multiply by z let t227 = circuit_add(in228, t226); // Eval big_Q Horner step: add coefficient_178 let t228 = circuit_mul(t227, in44); // Eval big_Q Horner step: multiply by z let t229 = circuit_add(in227, t228); // Eval big_Q Horner step: add coefficient_177 let t230 = circuit_mul(t229, in44); // Eval big_Q Horner step: multiply by z let t231 = circuit_add(in226, t230); // Eval big_Q Horner step: add coefficient_176 let t232 = circuit_mul(t231, in44); // Eval big_Q Horner step: multiply by z let t233 = circuit_add(in225, t232); // Eval big_Q Horner step: add coefficient_175 let t234 = circuit_mul(t233, in44); // Eval big_Q Horner step: multiply by z let t235 = circuit_add(in224, t234); // Eval big_Q Horner step: add coefficient_174 let t236 = circuit_mul(t235, in44); // Eval big_Q Horner step: multiply by z let t237 = circuit_add(in223, t236); // Eval big_Q Horner step: add coefficient_173 let t238 = circuit_mul(t237, in44); // Eval big_Q Horner step: multiply by z let t239 = circuit_add(in222, t238); // Eval big_Q Horner step: add coefficient_172 let t240 = circuit_mul(t239, in44); // Eval big_Q Horner step: multiply by z let t241 = circuit_add(in221, t240); // Eval big_Q Horner step: add coefficient_171 let t242 = circuit_mul(t241, in44); // Eval big_Q Horner step: multiply by z let t243 = circuit_add(in220, t242); // Eval big_Q Horner step: add coefficient_170 let t244 = circuit_mul(t243, in44); // Eval big_Q Horner step: multiply by z let t245 = circuit_add(in219, t244); // Eval big_Q Horner step: add coefficient_169 let t246 = circuit_mul(t245, in44); // Eval big_Q Horner step: multiply by z let t247 = circuit_add(in218, t246); // Eval big_Q Horner step: add coefficient_168 let t248 = circuit_mul(t247, in44); // Eval big_Q Horner step: multiply by z let t249 = circuit_add(in217, t248); // Eval big_Q Horner step: add coefficient_167 let t250 = circuit_mul(t249, in44); // Eval big_Q Horner step: multiply by z let t251 = circuit_add(in216, t250); // Eval big_Q Horner step: add coefficient_166 let t252 = circuit_mul(t251, in44); // Eval big_Q Horner step: multiply by z let t253 = circuit_add(in215, t252); // Eval big_Q Horner step: add coefficient_165 let t254 = circuit_mul(t253, in44); // Eval big_Q Horner step: multiply by z let t255 = circuit_add(in214, t254); // Eval big_Q Horner step: add coefficient_164 let t256 = circuit_mul(t255, in44); // Eval big_Q Horner step: multiply by z let t257 = circuit_add(in213, t256); // Eval big_Q Horner step: add coefficient_163 let t258 = circuit_mul(t257, in44); // Eval big_Q Horner step: multiply by z let t259 = circuit_add(in212, t258); // Eval big_Q Horner step: add coefficient_162 let t260 = circuit_mul(t259, in44); // Eval big_Q Horner step: multiply by z let t261 = circuit_add(in211, t260); // Eval big_Q Horner step: add coefficient_161 let t262 = circuit_mul(t261, in44); // Eval big_Q Horner step: multiply by z let t263 = circuit_add(in210, t262); // Eval big_Q Horner step: add coefficient_160 let t264 = circuit_mul(t263, in44); // Eval big_Q Horner step: multiply by z let t265 = circuit_add(in209, t264); // Eval big_Q Horner step: add coefficient_159 let t266 = circuit_mul(t265, in44); // Eval big_Q Horner step: multiply by z let t267 = circuit_add(in208, t266); // Eval big_Q Horner step: add coefficient_158 let t268 = circuit_mul(t267, in44); // Eval big_Q Horner step: multiply by z let t269 = circuit_add(in207, t268); // Eval big_Q Horner step: add coefficient_157 let t270 = circuit_mul(t269, in44); // Eval big_Q Horner step: multiply by z let t271 = circuit_add(in206, t270); // Eval big_Q Horner step: add coefficient_156 let t272 = circuit_mul(t271, in44); // Eval big_Q Horner step: multiply by z let t273 = circuit_add(in205, t272); // Eval big_Q Horner step: add coefficient_155 let t274 = circuit_mul(t273, in44); // Eval big_Q Horner step: multiply by z let t275 = circuit_add(in204, t274); // Eval big_Q Horner step: add coefficient_154 let t276 = circuit_mul(t275, in44); // Eval big_Q Horner step: multiply by z let t277 = circuit_add(in203, t276); // Eval big_Q Horner step: add coefficient_153 let t278 = circuit_mul(t277, in44); // Eval big_Q Horner step: multiply by z let t279 = circuit_add(in202, t278); // Eval big_Q Horner step: add coefficient_152 let t280 = circuit_mul(t279, in44); // Eval big_Q Horner step: multiply by z let t281 = circuit_add(in201, t280); // Eval big_Q Horner step: add coefficient_151 let t282 = circuit_mul(t281, in44); // Eval big_Q Horner step: multiply by z let t283 = circuit_add(in200, t282); // Eval big_Q Horner step: add coefficient_150 let t284 = circuit_mul(t283, in44); // Eval big_Q Horner step: multiply by z let t285 = circuit_add(in199, t284); // Eval big_Q Horner step: add coefficient_149 let t286 = circuit_mul(t285, in44); // Eval big_Q Horner step: multiply by z let t287 = circuit_add(in198, t286); // Eval big_Q Horner step: add coefficient_148 let t288 = circuit_mul(t287, in44); // Eval big_Q Horner step: multiply by z let t289 = circuit_add(in197, t288); // Eval big_Q Horner step: add coefficient_147 let t290 = circuit_mul(t289, in44); // Eval big_Q Horner step: multiply by z let t291 = circuit_add(in196, t290); // Eval big_Q Horner step: add coefficient_146 let t292 = circuit_mul(t291, in44); // Eval big_Q Horner step: multiply by z let t293 = circuit_add(in195, t292); // Eval big_Q Horner step: add coefficient_145 let t294 = circuit_mul(t293, in44); // Eval big_Q Horner step: multiply by z let t295 = circuit_add(in194, t294); // Eval big_Q Horner step: add coefficient_144 let t296 = circuit_mul(t295, in44); // Eval big_Q Horner step: multiply by z let t297 = circuit_add(in193, t296); // Eval big_Q Horner step: add coefficient_143 let t298 = circuit_mul(t297, in44); // Eval big_Q Horner step: multiply by z let t299 = circuit_add(in192, t298); // Eval big_Q Horner step: add coefficient_142 let t300 = circuit_mul(t299, in44); // Eval big_Q Horner step: multiply by z let t301 = circuit_add(in191, t300); // Eval big_Q Horner step: add coefficient_141 let t302 = circuit_mul(t301, in44); // Eval big_Q Horner step: multiply by z let t303 = circuit_add(in190, t302); // Eval big_Q Horner step: add coefficient_140 let t304 = circuit_mul(t303, in44); // Eval big_Q Horner step: multiply by z let t305 = circuit_add(in189, t304); // Eval big_Q Horner step: add coefficient_139 let t306 = circuit_mul(t305, in44); // Eval big_Q Horner step: multiply by z let t307 = circuit_add(in188, t306); // Eval big_Q Horner step: add coefficient_138 let t308 = circuit_mul(t307, in44); // Eval big_Q Horner step: multiply by z let t309 = circuit_add(in187, t308); // Eval big_Q Horner step: add coefficient_137 let t310 = circuit_mul(t309, in44); // Eval big_Q Horner step: multiply by z let t311 = circuit_add(in186, t310); // Eval big_Q Horner step: add coefficient_136 let t312 = circuit_mul(t311, in44); // Eval big_Q Horner step: multiply by z let t313 = circuit_add(in185, t312); // Eval big_Q Horner step: add coefficient_135 let t314 = circuit_mul(t313, in44); // Eval big_Q Horner step: multiply by z let t315 = circuit_add(in184, t314); // Eval big_Q Horner step: add coefficient_134 let t316 = circuit_mul(t315, in44); // Eval big_Q Horner step: multiply by z let t317 = circuit_add(in183, t316); // Eval big_Q Horner step: add coefficient_133 let t318 = circuit_mul(t317, in44); // Eval big_Q Horner step: multiply by z let t319 = circuit_add(in182, t318); // Eval big_Q Horner step: add coefficient_132 let t320 = circuit_mul(t319, in44); // Eval big_Q Horner step: multiply by z let t321 = circuit_add(in181, t320); // Eval big_Q Horner step: add coefficient_131 let t322 = circuit_mul(t321, in44); // Eval big_Q Horner step: multiply by z let t323 = circuit_add(in180, t322); // Eval big_Q Horner step: add coefficient_130 let t324 = circuit_mul(t323, in44); // Eval big_Q Horner step: multiply by z let t325 = circuit_add(in179, t324); // Eval big_Q Horner step: add coefficient_129 let t326 = circuit_mul(t325, in44); // Eval big_Q Horner step: multiply by z let t327 = circuit_add(in178, t326); // Eval big_Q Horner step: add coefficient_128 let t328 = circuit_mul(t327, in44); // Eval big_Q Horner step: multiply by z let t329 = circuit_add(in177, t328); // Eval big_Q Horner step: add coefficient_127 let t330 = circuit_mul(t329, in44); // Eval big_Q Horner step: multiply by z let t331 = circuit_add(in176, t330); // Eval big_Q Horner step: add coefficient_126 let t332 = circuit_mul(t331, in44); // Eval big_Q Horner step: multiply by z let t333 = circuit_add(in175, t332); // Eval big_Q Horner step: add coefficient_125 let t334 = circuit_mul(t333, in44); // Eval big_Q Horner step: multiply by z let t335 = circuit_add(in174, t334); // Eval big_Q Horner step: add coefficient_124 let t336 = circuit_mul(t335, in44); // Eval big_Q Horner step: multiply by z let t337 = circuit_add(in173, t336); // Eval big_Q Horner step: add coefficient_123 let t338 = circuit_mul(t337, in44); // Eval big_Q Horner step: multiply by z let t339 = circuit_add(in172, t338); // Eval big_Q Horner step: add coefficient_122 let t340 = circuit_mul(t339, in44); // Eval big_Q Horner step: multiply by z let t341 = circuit_add(in171, t340); // Eval big_Q Horner step: add coefficient_121 let t342 = circuit_mul(t341, in44); // Eval big_Q Horner step: multiply by z let t343 = circuit_add(in170, t342); // Eval big_Q Horner step: add coefficient_120 let t344 = circuit_mul(t343, in44); // Eval big_Q Horner step: multiply by z let t345 = circuit_add(in169, t344); // Eval big_Q Horner step: add coefficient_119 let t346 = circuit_mul(t345, in44); // Eval big_Q Horner step: multiply by z let t347 = circuit_add(in168, t346); // Eval big_Q Horner step: add coefficient_118 let t348 = circuit_mul(t347, in44); // Eval big_Q Horner step: multiply by z let t349 = circuit_add(in167, t348); // Eval big_Q Horner step: add coefficient_117 let t350 = circuit_mul(t349, in44); // Eval big_Q Horner step: multiply by z let t351 = circuit_add(in166, t350); // Eval big_Q Horner step: add coefficient_116 let t352 = circuit_mul(t351, in44); // Eval big_Q Horner step: multiply by z let t353 = circuit_add(in165, t352); // Eval big_Q Horner step: add coefficient_115 let t354 = circuit_mul(t353, in44); // Eval big_Q Horner step: multiply by z let t355 = circuit_add(in164, t354); // Eval big_Q Horner step: add coefficient_114 let t356 = circuit_mul(t355, in44); // Eval big_Q Horner step: multiply by z let t357 = circuit_add(in163, t356); // Eval big_Q Horner step: add coefficient_113 let t358 = circuit_mul(t357, in44); // Eval big_Q Horner step: multiply by z let t359 = circuit_add(in162, t358); // Eval big_Q Horner step: add coefficient_112 let t360 = circuit_mul(t359, in44); // Eval big_Q Horner step: multiply by z let t361 = circuit_add(in161, t360); // Eval big_Q Horner step: add coefficient_111 let t362 = circuit_mul(t361, in44); // Eval big_Q Horner step: multiply by z let t363 = circuit_add(in160, t362); // Eval big_Q Horner step: add coefficient_110 let t364 = circuit_mul(t363, in44); // Eval big_Q Horner step: multiply by z let t365 = circuit_add(in159, t364); // Eval big_Q Horner step: add coefficient_109 let t366 = circuit_mul(t365, in44); // Eval big_Q Horner step: multiply by z let t367 = circuit_add(in158, t366); // Eval big_Q Horner step: add coefficient_108 let t368 = circuit_mul(t367, in44); // Eval big_Q Horner step: multiply by z let t369 = circuit_add(in157, t368); // Eval big_Q Horner step: add coefficient_107 let t370 = circuit_mul(t369, in44); // Eval big_Q Horner step: multiply by z let t371 = circuit_add(in156, t370); // Eval big_Q Horner step: add coefficient_106 let t372 = circuit_mul(t371, in44); // Eval big_Q Horner step: multiply by z let t373 = circuit_add(in155, t372); // Eval big_Q Horner step: add coefficient_105 let t374 = circuit_mul(t373, in44); // Eval big_Q Horner step: multiply by z let t375 = circuit_add(in154, t374); // Eval big_Q Horner step: add coefficient_104 let t376 = circuit_mul(t375, in44); // Eval big_Q Horner step: multiply by z let t377 = circuit_add(in153, t376); // Eval big_Q Horner step: add coefficient_103 let t378 = circuit_mul(t377, in44); // Eval big_Q Horner step: multiply by z let t379 = circuit_add(in152, t378); // Eval big_Q Horner step: add coefficient_102 let t380 = circuit_mul(t379, in44); // Eval big_Q Horner step: multiply by z let t381 = circuit_add(in151, t380); // Eval big_Q Horner step: add coefficient_101 let t382 = circuit_mul(t381, in44); // Eval big_Q Horner step: multiply by z let t383 = circuit_add(in150, t382); // Eval big_Q Horner step: add coefficient_100 let t384 = circuit_mul(t383, in44); // Eval big_Q Horner step: multiply by z let t385 = circuit_add(in149, t384); // Eval big_Q Horner step: add coefficient_99 let t386 = circuit_mul(t385, in44); // Eval big_Q Horner step: multiply by z let t387 = circuit_add(in148, t386); // Eval big_Q Horner step: add coefficient_98 let t388 = circuit_mul(t387, in44); // Eval big_Q Horner step: multiply by z let t389 = circuit_add(in147, t388); // Eval big_Q Horner step: add coefficient_97 let t390 = circuit_mul(t389, in44); // Eval big_Q Horner step: multiply by z let t391 = circuit_add(in146, t390); // Eval big_Q Horner step: add coefficient_96 let t392 = circuit_mul(t391, in44); // Eval big_Q Horner step: multiply by z let t393 = circuit_add(in145, t392); // Eval big_Q Horner step: add coefficient_95 let t394 = circuit_mul(t393, in44); // Eval big_Q Horner step: multiply by z let t395 = circuit_add(in144, t394); // Eval big_Q Horner step: add coefficient_94 let t396 = circuit_mul(t395, in44); // Eval big_Q Horner step: multiply by z let t397 = circuit_add(in143, t396); // Eval big_Q Horner step: add coefficient_93 let t398 = circuit_mul(t397, in44); // Eval big_Q Horner step: multiply by z let t399 = circuit_add(in142, t398); // Eval big_Q Horner step: add coefficient_92 let t400 = circuit_mul(t399, in44); // Eval big_Q Horner step: multiply by z let t401 = circuit_add(in141, t400); // Eval big_Q Horner step: add coefficient_91 let t402 = circuit_mul(t401, in44); // Eval big_Q Horner step: multiply by z let t403 = circuit_add(in140, t402); // Eval big_Q Horner step: add coefficient_90 let t404 = circuit_mul(t403, in44); // Eval big_Q Horner step: multiply by z let t405 = circuit_add(in139, t404); // Eval big_Q Horner step: add coefficient_89 let t406 = circuit_mul(t405, in44); // Eval big_Q Horner step: multiply by z let t407 = circuit_add(in138, t406); // Eval big_Q Horner step: add coefficient_88 let t408 = circuit_mul(t407, in44); // Eval big_Q Horner step: multiply by z let t409 = circuit_add(in137, t408); // Eval big_Q Horner step: add coefficient_87 let t410 = circuit_mul(t409, in44); // Eval big_Q Horner step: multiply by z let t411 = circuit_add(in136, t410); // Eval big_Q Horner step: add coefficient_86 let t412 = circuit_mul(t411, in44); // Eval big_Q Horner step: multiply by z let t413 = circuit_add(in135, t412); // Eval big_Q Horner step: add coefficient_85 let t414 = circuit_mul(t413, in44); // Eval big_Q Horner step: multiply by z let t415 = circuit_add(in134, t414); // Eval big_Q Horner step: add coefficient_84 let t416 = circuit_mul(t415, in44); // Eval big_Q Horner step: multiply by z let t417 = circuit_add(in133, t416); // Eval big_Q Horner step: add coefficient_83 let t418 = circuit_mul(t417, in44); // Eval big_Q Horner step: multiply by z let t419 = circuit_add(in132, t418); // Eval big_Q Horner step: add coefficient_82 let t420 = circuit_mul(t419, in44); // Eval big_Q Horner step: multiply by z let t421 = circuit_add(in131, t420); // Eval big_Q Horner step: add coefficient_81 let t422 = circuit_mul(t421, in44); // Eval big_Q Horner step: multiply by z let t423 = circuit_add(in130, t422); // Eval big_Q Horner step: add coefficient_80 let t424 = circuit_mul(t423, in44); // Eval big_Q Horner step: multiply by z let t425 = circuit_add(in129, t424); // Eval big_Q Horner step: add coefficient_79 let t426 = circuit_mul(t425, in44); // Eval big_Q Horner step: multiply by z let t427 = circuit_add(in128, t426); // Eval big_Q Horner step: add coefficient_78 let t428 = circuit_mul(t427, in44); // Eval big_Q Horner step: multiply by z let t429 = circuit_add(in127, t428); // Eval big_Q Horner step: add coefficient_77 let t430 = circuit_mul(t429, in44); // Eval big_Q Horner step: multiply by z let t431 = circuit_add(in126, t430); // Eval big_Q Horner step: add coefficient_76 let t432 = circuit_mul(t431, in44); // Eval big_Q Horner step: multiply by z let t433 = circuit_add(in125, t432); // Eval big_Q Horner step: add coefficient_75 let t434 = circuit_mul(t433, in44); // Eval big_Q Horner step: multiply by z let t435 = circuit_add(in124, t434); // Eval big_Q Horner step: add coefficient_74 let t436 = circuit_mul(t435, in44); // Eval big_Q Horner step: multiply by z let t437 = circuit_add(in123, t436); // Eval big_Q Horner step: add coefficient_73 let t438 = circuit_mul(t437, in44); // Eval big_Q Horner step: multiply by z let t439 = circuit_add(in122, t438); // Eval big_Q Horner step: add coefficient_72 let t440 = circuit_mul(t439, in44); // Eval big_Q Horner step: multiply by z let t441 = circuit_add(in121, t440); // Eval big_Q Horner step: add coefficient_71 let t442 = circuit_mul(t441, in44); // Eval big_Q Horner step: multiply by z let t443 = circuit_add(in120, t442); // Eval big_Q Horner step: add coefficient_70 let t444 = circuit_mul(t443, in44); // Eval big_Q Horner step: multiply by z let t445 = circuit_add(in119, t444); // Eval big_Q Horner step: add coefficient_69 let t446 = circuit_mul(t445, in44); // Eval big_Q Horner step: multiply by z let t447 = circuit_add(in118, t446); // Eval big_Q Horner step: add coefficient_68 let t448 = circuit_mul(t447, in44); // Eval big_Q Horner step: multiply by z let t449 = circuit_add(in117, t448); // Eval big_Q Horner step: add coefficient_67 let t450 = circuit_mul(t449, in44); // Eval big_Q Horner step: multiply by z let t451 = circuit_add(in116, t450); // Eval big_Q Horner step: add coefficient_66 let t452 = circuit_mul(t451, in44); // Eval big_Q Horner step: multiply by z let t453 = circuit_add(in115, t452); // Eval big_Q Horner step: add coefficient_65 let t454 = circuit_mul(t453, in44); // Eval big_Q Horner step: multiply by z let t455 = circuit_add(in114, t454); // Eval big_Q Horner step: add coefficient_64 let t456 = circuit_mul(t455, in44); // Eval big_Q Horner step: multiply by z let t457 = circuit_add(in113, t456); // Eval big_Q Horner step: add coefficient_63 let t458 = circuit_mul(t457, in44); // Eval big_Q Horner step: multiply by z let t459 = circuit_add(in112, t458); // Eval big_Q Horner step: add coefficient_62 let t460 = circuit_mul(t459, in44); // Eval big_Q Horner step: multiply by z let t461 = circuit_add(in111, t460); // Eval big_Q Horner step: add coefficient_61 let t462 = circuit_mul(t461, in44); // Eval big_Q Horner step: multiply by z let t463 = circuit_add(in110, t462); // Eval big_Q Horner step: add coefficient_60 let t464 = circuit_mul(t463, in44); // Eval big_Q Horner step: multiply by z let t465 = circuit_add(in109, t464); // Eval big_Q Horner step: add coefficient_59 let t466 = circuit_mul(t465, in44); // Eval big_Q Horner step: multiply by z let t467 = circuit_add(in108, t466); // Eval big_Q Horner step: add coefficient_58 let t468 = circuit_mul(t467, in44); // Eval big_Q Horner step: multiply by z let t469 = circuit_add(in107, t468); // Eval big_Q Horner step: add coefficient_57 let t470 = circuit_mul(t469, in44); // Eval big_Q Horner step: multiply by z let t471 = circuit_add(in106, t470); // Eval big_Q Horner step: add coefficient_56 let t472 = circuit_mul(t471, in44); // Eval big_Q Horner step: multiply by z let t473 = circuit_add(in105, t472); // Eval big_Q Horner step: add coefficient_55 let t474 = circuit_mul(t473, in44); // Eval big_Q Horner step: multiply by z let t475 = circuit_add(in104, t474); // Eval big_Q Horner step: add coefficient_54 let t476 = circuit_mul(t475, in44); // Eval big_Q Horner step: multiply by z let t477 = circuit_add(in103, t476); // Eval big_Q Horner step: add coefficient_53 let t478 = circuit_mul(t477, in44); // Eval big_Q Horner step: multiply by z let t479 = circuit_add(in102, t478); // Eval big_Q Horner step: add coefficient_52 let t480 = circuit_mul(t479, in44); // Eval big_Q Horner step: multiply by z let t481 = circuit_add(in101, t480); // Eval big_Q Horner step: add coefficient_51 let t482 = circuit_mul(t481, in44); // Eval big_Q Horner step: multiply by z let t483 = circuit_add(in100, t482); // Eval big_Q Horner step: add coefficient_50 let t484 = circuit_mul(t483, in44); // Eval big_Q Horner step: multiply by z let t485 = circuit_add(in99, t484); // Eval big_Q Horner step: add coefficient_49 let t486 = circuit_mul(t485, in44); // Eval big_Q Horner step: multiply by z let t487 = circuit_add(in98, t486); // Eval big_Q Horner step: add coefficient_48 let t488 = circuit_mul(t487, in44); // Eval big_Q Horner step: multiply by z let t489 = circuit_add(in97, t488); // Eval big_Q Horner step: add coefficient_47 let t490 = circuit_mul(t489, in44); // Eval big_Q Horner step: multiply by z let t491 = circuit_add(in96, t490); // Eval big_Q Horner step: add coefficient_46 let t492 = circuit_mul(t491, in44); // Eval big_Q Horner step: multiply by z let t493 = circuit_add(in95, t492); // Eval big_Q Horner step: add coefficient_45 let t494 = circuit_mul(t493, in44); // Eval big_Q Horner step: multiply by z let t495 = circuit_add(in94, t494); // Eval big_Q Horner step: add coefficient_44 let t496 = circuit_mul(t495, in44); // Eval big_Q Horner step: multiply by z let t497 = circuit_add(in93, t496); // Eval big_Q Horner step: add coefficient_43 let t498 = circuit_mul(t497, in44); // Eval big_Q Horner step: multiply by z let t499 = circuit_add(in92, t498); // Eval big_Q Horner step: add coefficient_42 let t500 = circuit_mul(t499, in44); // Eval big_Q Horner step: multiply by z let t501 = circuit_add(in91, t500); // Eval big_Q Horner step: add coefficient_41 let t502 = circuit_mul(t501, in44); // Eval big_Q Horner step: multiply by z let t503 = circuit_add(in90, t502); // Eval big_Q Horner step: add coefficient_40 let t504 = circuit_mul(t503, in44); // Eval big_Q Horner step: multiply by z let t505 = circuit_add(in89, t504); // Eval big_Q Horner step: add coefficient_39 let t506 = circuit_mul(t505, in44); // Eval big_Q Horner step: multiply by z let t507 = circuit_add(in88, t506); // Eval big_Q Horner step: add coefficient_38 let t508 = circuit_mul(t507, in44); // Eval big_Q Horner step: multiply by z let t509 = circuit_add(in87, t508); // Eval big_Q Horner step: add coefficient_37 let t510 = circuit_mul(t509, in44); // Eval big_Q Horner step: multiply by z let t511 = circuit_add(in86, t510); // Eval big_Q Horner step: add coefficient_36 let t512 = circuit_mul(t511, in44); // Eval big_Q Horner step: multiply by z let t513 = circuit_add(in85, t512); // Eval big_Q Horner step: add coefficient_35 let t514 = circuit_mul(t513, in44); // Eval big_Q Horner step: multiply by z let t515 = circuit_add(in84, t514); // Eval big_Q Horner step: add coefficient_34 let t516 = circuit_mul(t515, in44); // Eval big_Q Horner step: multiply by z let t517 = circuit_add(in83, t516); // Eval big_Q Horner step: add coefficient_33 let t518 = circuit_mul(t517, in44); // Eval big_Q Horner step: multiply by z let t519 = circuit_add(in82, t518); // Eval big_Q Horner step: add coefficient_32 let t520 = circuit_mul(t519, in44); // Eval big_Q Horner step: multiply by z let t521 = circuit_add(in81, t520); // Eval big_Q Horner step: add coefficient_31 let t522 = circuit_mul(t521, in44); // Eval big_Q Horner step: multiply by z let t523 = circuit_add(in80, t522); // Eval big_Q Horner step: add coefficient_30 let t524 = circuit_mul(t523, in44); // Eval big_Q Horner step: multiply by z let t525 = circuit_add(in79, t524); // Eval big_Q Horner step: add coefficient_29 let t526 = circuit_mul(t525, in44); // Eval big_Q Horner step: multiply by z let t527 = circuit_add(in78, t526); // Eval big_Q Horner step: add coefficient_28 let t528 = circuit_mul(t527, in44); // Eval big_Q Horner step: multiply by z let t529 = circuit_add(in77, t528); // Eval big_Q Horner step: add coefficient_27 let t530 = circuit_mul(t529, in44); // Eval big_Q Horner step: multiply by z let t531 = circuit_add(in76, t530); // Eval big_Q Horner step: add coefficient_26 let t532 = circuit_mul(t531, in44); // Eval big_Q Horner step: multiply by z let t533 = circuit_add(in75, t532); // Eval big_Q Horner step: add coefficient_25 let t534 = circuit_mul(t533, in44); // Eval big_Q Horner step: multiply by z let t535 = circuit_add(in74, t534); // Eval big_Q Horner step: add coefficient_24 let t536 = circuit_mul(t535, in44); // Eval big_Q Horner step: multiply by z let t537 = circuit_add(in73, t536); // Eval big_Q Horner step: add coefficient_23 let t538 = circuit_mul(t537, in44); // Eval big_Q Horner step: multiply by z let t539 = circuit_add(in72, t538); // Eval big_Q Horner step: add coefficient_22 let t540 = circuit_mul(t539, in44); // Eval big_Q Horner step: multiply by z let t541 = circuit_add(in71, t540); // Eval big_Q Horner step: add coefficient_21 let t542 = circuit_mul(t541, in44); // Eval big_Q Horner step: multiply by z let t543 = circuit_add(in70, t542); // Eval big_Q Horner step: add coefficient_20 let t544 = circuit_mul(t543, in44); // Eval big_Q Horner step: multiply by z let t545 = circuit_add(in69, t544); // Eval big_Q Horner step: add coefficient_19 let t546 = circuit_mul(t545, in44); // Eval big_Q Horner step: multiply by z let t547 = circuit_add(in68, t546); // Eval big_Q Horner step: add coefficient_18 let t548 = circuit_mul(t547, in44); // Eval big_Q Horner step: multiply by z let t549 = circuit_add(in67, t548); // Eval big_Q Horner step: add coefficient_17 let t550 = circuit_mul(t549, in44); // Eval big_Q Horner step: multiply by z let t551 = circuit_add(in66, t550); // Eval big_Q Horner step: add coefficient_16 let t552 = circuit_mul(t551, in44); // Eval big_Q Horner step: multiply by z let t553 = circuit_add(in65, t552); // Eval big_Q Horner step: add coefficient_15 let t554 = circuit_mul(t553, in44); // Eval big_Q Horner step: multiply by z let t555 = circuit_add(in64, t554); // Eval big_Q Horner step: add coefficient_14 let t556 = circuit_mul(t555, in44); // Eval big_Q Horner step: multiply by z let t557 = circuit_add(in63, t556); // Eval big_Q Horner step: add coefficient_13 let t558 = circuit_mul(t557, in44); // Eval big_Q Horner step: multiply by z let t559 = circuit_add(in62, t558); // Eval big_Q Horner step: add coefficient_12 let t560 = circuit_mul(t559, in44); // Eval big_Q Horner step: multiply by z let t561 = circuit_add(in61, t560); // Eval big_Q Horner step: add coefficient_11 let t562 = circuit_mul(t561, in44); // Eval big_Q Horner step: multiply by z let t563 = circuit_add(in60, t562); // Eval big_Q Horner step: add coefficient_10 let t564 = circuit_mul(t563, in44); // Eval big_Q Horner step: multiply by z let t565 = circuit_add(in59, t564); // Eval big_Q Horner step: add coefficient_9 let t566 = circuit_mul(t565, in44); // Eval big_Q Horner step: multiply by z let t567 = circuit_add(in58, t566); // Eval big_Q Horner step: add coefficient_8 let t568 = circuit_mul(t567, in44); // Eval big_Q Horner step: multiply by z let t569 = circuit_add(in57, t568); // Eval big_Q Horner step: add coefficient_7 let t570 = circuit_mul(t569, in44); // Eval big_Q Horner step: multiply by z let t571 = circuit_add(in56, t570); // Eval big_Q Horner step: add coefficient_6 let t572 = circuit_mul(t571, in44); // Eval big_Q Horner step: multiply by z let t573 = circuit_add(in55, t572); // Eval big_Q Horner step: add coefficient_5 let t574 = circuit_mul(t573, in44); // Eval big_Q Horner step: multiply by z let t575 = circuit_add(in54, t574); // Eval big_Q Horner step: add coefficient_4 let t576 = circuit_mul(t575, in44); // Eval big_Q Horner step: multiply by z let t577 = circuit_add(in53, t576); // Eval big_Q Horner step: add coefficient_3 let t578 = circuit_mul(t577, in44); // Eval big_Q Horner step: multiply by z let t579 = circuit_add(in52, t578); // Eval big_Q Horner step: add coefficient_2 let t580 = circuit_mul(t579, in44); // Eval big_Q Horner step: multiply by z let t581 = circuit_add(in51, t580); // Eval big_Q Horner step: add coefficient_1 let t582 = circuit_mul(t581, in44); // Eval big_Q Horner step: multiply by z let t583 = circuit_add(in50, t582); // Eval big_Q Horner step: add coefficient_0 let t584 = circuit_mul(in9, t2); // Eval sparse poly P_irr step coeff_6 * z^6 let t585 = circuit_add(in8, t584); // Eval sparse poly P_irr step + coeff_6 * z^6 let t586 = circuit_add(t585, t5); // Eval sparse poly P_irr step + 1*z^12 let t587 = circuit_mul(t583, t586); let t588 = circuit_sub(t205, t587); let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t588,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(MP_CHECK_FINALIZE_3P_2F_EXT_MLR_BN254_CONSTANTS.span()); // in0 - in9 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in10 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in11 circuit_inputs = circuit_inputs.next_2(line_1_0.r0a0); // in12 circuit_inputs = circuit_inputs.next_2(line_1_0.r0a1); // in13 circuit_inputs = circuit_inputs.next_2(line_1_0.r1a0); // in14 circuit_inputs = circuit_inputs.next_2(line_1_0.r1a1); // in15 circuit_inputs = circuit_inputs.next_2(line_2_0.r0a0); // in16 circuit_inputs = circuit_inputs.next_2(line_2_0.r0a1); // in17 circuit_inputs = circuit_inputs.next_2(line_2_0.r1a0); // in18 circuit_inputs = circuit_inputs.next_2(line_2_0.r1a1); // in19 circuit_inputs = circuit_inputs.next_2(yInv_1); // in20 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in21 circuit_inputs = circuit_inputs.next_2(line_1_1.r0a0); // in22 circuit_inputs = circuit_inputs.next_2(line_1_1.r0a1); // in23 circuit_inputs = circuit_inputs.next_2(line_1_1.r1a0); // in24 circuit_inputs = circuit_inputs.next_2(line_1_1.r1a1); // in25 circuit_inputs = circuit_inputs.next_2(line_2_1.r0a0); // in26 circuit_inputs = circuit_inputs.next_2(line_2_1.r0a1); // in27 circuit_inputs = circuit_inputs.next_2(line_2_1.r1a0); // in28 circuit_inputs = circuit_inputs.next_2(line_2_1.r1a1); // in29 circuit_inputs = circuit_inputs.next_2(original_Q2.x0); // in30 circuit_inputs = circuit_inputs.next_2(original_Q2.x1); // in31 circuit_inputs = circuit_inputs.next_2(original_Q2.y0); // in32 circuit_inputs = circuit_inputs.next_2(original_Q2.y1); // in33 circuit_inputs = circuit_inputs.next_2(yInv_2); // in34 circuit_inputs = circuit_inputs.next_2(xNegOverY_2); // in35 circuit_inputs = circuit_inputs.next_2(Q_2.x0); // in36 circuit_inputs = circuit_inputs.next_2(Q_2.x1); // in37 circuit_inputs = circuit_inputs.next_2(Q_2.y0); // in38 circuit_inputs = circuit_inputs.next_2(Q_2.y1); // in39 circuit_inputs = circuit_inputs.next_2(R_n_minus_2_of_z); // in40 circuit_inputs = circuit_inputs.next_2(R_n_minus_1_of_z); // in41 circuit_inputs = circuit_inputs.next_2(c_0); // in42 circuit_inputs = circuit_inputs.next_2(w_of_z); // in43 circuit_inputs = circuit_inputs.next_2(z); // in44 circuit_inputs = circuit_inputs.next_2(c_inv_frob_1_of_z); // in45 circuit_inputs = circuit_inputs.next_2(c_frob_2_of_z); // in46 circuit_inputs = circuit_inputs.next_2(c_inv_frob_3_of_z); // in47 circuit_inputs = circuit_inputs.next_2(previous_lhs); // in48 circuit_inputs = circuit_inputs.next_2(R_n_minus_3_of_z); // in49 for val in Q.span() { circuit_inputs = circuit_inputs.next_2(*val); } // in50 - in239 circuit_inputs = circuit_inputs.next_2(precomputed_miller_loop_result_of_z); // in240 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let final_check: u384 = outputs.get_output(t588); return (final_check,); } const MP_CHECK_FINALIZE_3P_2F_EXT_MLR_BN254_CONSTANTS: [u384; 10] = [ u384 { limb0: 0xc2c3330c99e39557176f553d, limb1: 0x4c0bec3cf559b143b78cc310, limb2: 0x2fb347984f7911f7, limb3: 0x0, }, u384 { limb0: 0xb7c9dce1665d51c640fcba2, limb1: 0x4ba4cc8bd75a079432ae2a1d, limb2: 0x16c9e55061ebae20, limb3: 0x0, }, u384 { limb0: 0xa9c95998dc54014671a0135a, limb1: 0xdc5ec698b6e2f9b9dbaae0ed, limb2: 0x63cf305489af5dc, limb3: 0x0, }, u384 { limb0: 0x8fa25bd282d37f632623b0e3, limb1: 0x704b5a7ec796f2b21807dc9, limb2: 0x7c03cbcac41049a, limb3: 0x0, }, u384 { limb0: 0xbb966e3de4bd44e5607cfd48, limb1: 0x5e6dd9e7e0acccb0c28f069f, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x6871ca8d3c208c16d87cfd3e, limb1: 0xb85045b68181585d97816a91, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x52, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x6871ca8d3c208c16d87cfd35, limb1: 0xb85045b68181585d97816a91, limb2: 0x30644e72e131a029, limb3: 0x0, }, ]; #[inline(always)] pub fn run_BN254_MP_CHECK_INIT_BIT_2P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_1: G2Line, R_i_of_z: u384, z: u384, c_inv_of_z: u384, c1: u384, previous_lhs: u384, ) -> (u384,) { // CONSTANT stack let in0 = CE::> {}; // -0x9 % p let in1 = CE::> {}; // 0x1 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in15, in15); // compute z^2 let t1 = circuit_mul(t0, in15); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, in15); // compute z^7 let t4 = circuit_mul(t3, t0); // compute z^9 let t5 = circuit_mul(in16, in16); let t6 = circuit_mul(in0, in5); let t7 = circuit_add(in4, t6); let t8 = circuit_mul(t7, in3); // eval bn line by xNegOverY let t9 = circuit_mul(in0, in7); let t10 = circuit_add(in6, t9); let t11 = circuit_mul(t10, in2); // eval bn line by yInv let t12 = circuit_mul(in5, in3); // eval bn line by xNegOverY let t13 = circuit_mul(in7, in2); // eval bn line by yInv let t14 = circuit_mul(t8, in15); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t15 = circuit_add(in1, t14); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t16 = circuit_mul(t11, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t17 = circuit_add(t15, t16); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t18 = circuit_mul(t12, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t19 = circuit_add(t17, t18); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t20 = circuit_mul(t13, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t21 = circuit_add(t19, t20); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t22 = circuit_mul(t5, t21); let t23 = circuit_mul(in0, in11); let t24 = circuit_add(in10, t23); let t25 = circuit_mul(t24, in9); // eval bn line by xNegOverY let t26 = circuit_mul(in0, in13); let t27 = circuit_add(in12, t26); let t28 = circuit_mul(t27, in8); // eval bn line by yInv let t29 = circuit_mul(in11, in9); // eval bn line by xNegOverY let t30 = circuit_mul(in13, in8); // eval bn line by yInv let t31 = circuit_mul(t25, in15); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t32 = circuit_add(in1, t31); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t33 = circuit_mul(t28, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t34 = circuit_add(t32, t33); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t35 = circuit_mul(t29, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t36 = circuit_add(t34, t35); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t37 = circuit_mul(t30, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t38 = circuit_add(t36, t37); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t39 = circuit_mul(t22, t38); let t40 = circuit_sub(t39, in14); // ((Π(i,k) (Pk(z)) - Ri(z)) let t41 = circuit_mul(in17, in18); let t42 = circuit_add(t40, t41); let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t42,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in2 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in3 circuit_inputs = circuit_inputs.next_2(G2_line_0.r0a0); // in4 circuit_inputs = circuit_inputs.next_2(G2_line_0.r0a1); // in5 circuit_inputs = circuit_inputs.next_2(G2_line_0.r1a0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_0.r1a1); // in7 circuit_inputs = circuit_inputs.next_2(yInv_1); // in8 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_1.r0a0); // in10 circuit_inputs = circuit_inputs.next_2(G2_line_1.r0a1); // in11 circuit_inputs = circuit_inputs.next_2(G2_line_1.r1a0); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_1.r1a1); // in13 circuit_inputs = circuit_inputs.next_2(R_i_of_z); // in14 circuit_inputs = circuit_inputs.next_2(z); // in15 circuit_inputs = circuit_inputs.next_2(c_inv_of_z); // in16 circuit_inputs = circuit_inputs.next_2(c1); // in17 circuit_inputs = circuit_inputs.next_2(previous_lhs); // in18 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let new_lhs: u384 = outputs.get_output(t42); return (new_lhs,); } #[inline(always)] pub fn run_BN254_MP_CHECK_INIT_BIT_3P_2F_circuit( yInv_0: u384, xNegOverY_0: u384, G2_line_0: G2Line, yInv_1: u384, xNegOverY_1: u384, G2_line_1: G2Line, yInv_2: u384, xNegOverY_2: u384, Q_2: G2Point, R_i_of_z: u384, z: u384, c_inv_of_z: u384, c1: u384, previous_lhs: u384, ) -> (G2Point, u384) { // CONSTANT stack let in0 = CE::> {}; // -0x9 % p let in1 = CE::> {}; // 0x1 let in2 = CE::> {}; // 0x3 let in3 = CE::> {}; // 0x6 let in4 = CE::> {}; // 0x0 // INPUT stack let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let (in23, in24, in25) = (CE::> {}, CE::> {}, CE::> {}); let (in26, in27) = (CE::> {}, CE::> {}); let t0 = circuit_mul(in24, in24); // compute z^2 let t1 = circuit_mul(t0, in24); // compute z^3 let t2 = circuit_mul(t1, t1); // compute z^6 let t3 = circuit_mul(t2, in24); // compute z^7 let t4 = circuit_mul(t3, t0); // compute z^9 let t5 = circuit_mul(in25, in25); let t6 = circuit_mul(in0, in8); let t7 = circuit_add(in7, t6); let t8 = circuit_mul(t7, in6); // eval bn line by xNegOverY let t9 = circuit_mul(in0, in10); let t10 = circuit_add(in9, t9); let t11 = circuit_mul(t10, in5); // eval bn line by yInv let t12 = circuit_mul(in8, in6); // eval bn line by xNegOverY let t13 = circuit_mul(in10, in5); // eval bn line by yInv let t14 = circuit_mul(t8, in24); // Eval sparse poly line_0p_1 step coeff_1 * z^1 let t15 = circuit_add(in1, t14); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 let t16 = circuit_mul(t11, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 let t17 = circuit_add(t15, t16); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 let t18 = circuit_mul(t12, t3); // Eval sparse poly line_0p_1 step coeff_7 * z^7 let t19 = circuit_add(t17, t18); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 let t20 = circuit_mul(t13, t4); // Eval sparse poly line_0p_1 step coeff_9 * z^9 let t21 = circuit_add(t19, t20); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t22 = circuit_mul(t5, t21); let t23 = circuit_mul(in0, in14); let t24 = circuit_add(in13, t23); let t25 = circuit_mul(t24, in12); // eval bn line by xNegOverY let t26 = circuit_mul(in0, in16); let t27 = circuit_add(in15, t26); let t28 = circuit_mul(t27, in11); // eval bn line by yInv let t29 = circuit_mul(in14, in12); // eval bn line by xNegOverY let t30 = circuit_mul(in16, in11); // eval bn line by yInv let t31 = circuit_mul(t25, in24); // Eval sparse poly line_1p_1 step coeff_1 * z^1 let t32 = circuit_add(in1, t31); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 let t33 = circuit_mul(t28, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 let t34 = circuit_add(t32, t33); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 let t35 = circuit_mul(t29, t3); // Eval sparse poly line_1p_1 step coeff_7 * z^7 let t36 = circuit_add(t34, t35); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 let t37 = circuit_mul(t30, t4); // Eval sparse poly line_1p_1 step coeff_9 * z^9 let t38 = circuit_add(t36, t37); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t39 = circuit_mul(t22, t38); let t40 = circuit_add(in19, in20); // Doubling slope numerator start let t41 = circuit_sub(in19, in20); let t42 = circuit_mul(t40, t41); let t43 = circuit_mul(in19, in20); let t44 = circuit_mul(t42, in2); let t45 = circuit_mul(t43, in3); // Doubling slope numerator end let t46 = circuit_add(in21, in21); // Fp2 add coeff 0/1 let t47 = circuit_add(in22, in22); // Fp2 add coeff 1/1 let t48 = circuit_mul(t46, t46); // Fp2 Inv start let t49 = circuit_mul(t47, t47); let t50 = circuit_add(t48, t49); let t51 = circuit_inverse(t50); let t52 = circuit_mul(t46, t51); // Fp2 Inv real part end let t53 = circuit_mul(t47, t51); let t54 = circuit_sub(in4, t53); // Fp2 Inv imag part end let t55 = circuit_mul(t44, t52); // Fp2 mul start let t56 = circuit_mul(t45, t54); let t57 = circuit_sub(t55, t56); // Fp2 mul real part end let t58 = circuit_mul(t44, t54); let t59 = circuit_mul(t45, t52); let t60 = circuit_add(t58, t59); // Fp2 mul imag part end let t61 = circuit_add(t57, t60); let t62 = circuit_sub(t57, t60); let t63 = circuit_mul(t61, t62); let t64 = circuit_mul(t57, t60); let t65 = circuit_add(t64, t64); let t66 = circuit_add(in19, in19); // Fp2 add coeff 0/1 let t67 = circuit_add(in20, in20); // Fp2 add coeff 1/1 let t68 = circuit_sub(t63, t66); // Fp2 sub coeff 0/1 let t69 = circuit_sub(t65, t67); // Fp2 sub coeff 1/1 let t70 = circuit_sub(in19, t68); // Fp2 sub coeff 0/1 let t71 = circuit_sub(in20, t69); // Fp2 sub coeff 1/1 let t72 = circuit_mul(t57, t70); // Fp2 mul start let t73 = circuit_mul(t60, t71); let t74 = circuit_sub(t72, t73); // Fp2 mul real part end let t75 = circuit_mul(t57, t71); let t76 = circuit_mul(t60, t70); let t77 = circuit_add(t75, t76); // Fp2 mul imag part end let t78 = circuit_sub(t74, in21); // Fp2 sub coeff 0/1 let t79 = circuit_sub(t77, in22); // Fp2 sub coeff 1/1 let t80 = circuit_mul(t57, in19); // Fp2 mul start let t81 = circuit_mul(t60, in20); let t82 = circuit_sub(t80, t81); // Fp2 mul real part end let t83 = circuit_mul(t57, in20); let t84 = circuit_mul(t60, in19); let t85 = circuit_add(t83, t84); // Fp2 mul imag part end let t86 = circuit_sub(t82, in21); // Fp2 sub coeff 0/1 let t87 = circuit_sub(t85, in22); // Fp2 sub coeff 1/1 let t88 = circuit_mul(in0, t60); let t89 = circuit_add(t57, t88); let t90 = circuit_mul(t89, in18); // eval bn line by xNegOverY let t91 = circuit_mul(in0, t87); let t92 = circuit_add(t86, t91); let t93 = circuit_mul(t92, in17); // eval bn line by yInv let t94 = circuit_mul(t60, in18); // eval bn line by xNegOverY let t95 = circuit_mul(t87, in17); // eval bn line by yInv let t96 = circuit_mul(t90, in24); // Eval sparse poly line_2p_1 step coeff_1 * z^1 let t97 = circuit_add(in1, t96); // Eval sparse poly line_2p_1 step + coeff_1 * z^1 let t98 = circuit_mul(t93, t1); // Eval sparse poly line_2p_1 step coeff_3 * z^3 let t99 = circuit_add(t97, t98); // Eval sparse poly line_2p_1 step + coeff_3 * z^3 let t100 = circuit_mul(t94, t3); // Eval sparse poly line_2p_1 step coeff_7 * z^7 let t101 = circuit_add(t99, t100); // Eval sparse poly line_2p_1 step + coeff_7 * z^7 let t102 = circuit_mul(t95, t4); // Eval sparse poly line_2p_1 step coeff_9 * z^9 let t103 = circuit_add(t101, t102); // Eval sparse poly line_2p_1 step + coeff_9 * z^9 let t104 = circuit_mul(t39, t103); let t105 = circuit_sub(t104, in23); // ((Π(i,k) (Pk(z)) - Ri(z)) let t106 = circuit_mul(in26, in27); let t107 = circuit_add(t105, t106); let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t68, t69, t78, t79, t107).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in2 circuit_inputs = circuit_inputs.next_2([0x6, 0x0, 0x0, 0x0]); // in3 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in4 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in5 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in6 circuit_inputs = circuit_inputs.next_2(G2_line_0.r0a0); // in7 circuit_inputs = circuit_inputs.next_2(G2_line_0.r0a1); // in8 circuit_inputs = circuit_inputs.next_2(G2_line_0.r1a0); // in9 circuit_inputs = circuit_inputs.next_2(G2_line_0.r1a1); // in10 circuit_inputs = circuit_inputs.next_2(yInv_1); // in11 circuit_inputs = circuit_inputs.next_2(xNegOverY_1); // in12 circuit_inputs = circuit_inputs.next_2(G2_line_1.r0a0); // in13 circuit_inputs = circuit_inputs.next_2(G2_line_1.r0a1); // in14 circuit_inputs = circuit_inputs.next_2(G2_line_1.r1a0); // in15 circuit_inputs = circuit_inputs.next_2(G2_line_1.r1a1); // in16 circuit_inputs = circuit_inputs.next_2(yInv_2); // in17 circuit_inputs = circuit_inputs.next_2(xNegOverY_2); // in18 circuit_inputs = circuit_inputs.next_2(Q_2.x0); // in19 circuit_inputs = circuit_inputs.next_2(Q_2.x1); // in20 circuit_inputs = circuit_inputs.next_2(Q_2.y0); // in21 circuit_inputs = circuit_inputs.next_2(Q_2.y1); // in22 circuit_inputs = circuit_inputs.next_2(R_i_of_z); // in23 circuit_inputs = circuit_inputs.next_2(z); // in24 circuit_inputs = circuit_inputs.next_2(c_inv_of_z); // in25 circuit_inputs = circuit_inputs.next_2(c1); // in26 circuit_inputs = circuit_inputs.next_2(previous_lhs); // in27 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t68), x1: outputs.get_output(t69), y0: outputs.get_output(t78), y1: outputs.get_output(t79), }; let new_lhs: u384 = outputs.get_output(t107); return (Q0, new_lhs); } #[inline(always)] pub fn run_BN254_MP_CHECK_PREPARE_PAIRS_1P_circuit( p_0: G1Point, Qy0_0: u384, Qy1_0: u384, ) -> (BNProcessedPair,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let in4 = CE::> {}; let t0 = circuit_inverse(in2); let t1 = circuit_mul(in1, t0); let t2 = circuit_sub(in0, t1); let t3 = circuit_sub(in0, in3); let t4 = circuit_sub(in0, in4); let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t0, t2, t3, t4).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p_0.x); // in1 circuit_inputs = circuit_inputs.next_2(p_0.y); // in2 circuit_inputs = circuit_inputs.next_2(Qy0_0); // in3 circuit_inputs = circuit_inputs.next_2(Qy1_0); // in4 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let p_0: BNProcessedPair = BNProcessedPair { yInv: outputs.get_output(t0), xNegOverY: outputs.get_output(t2), QyNeg0: outputs.get_output(t3), QyNeg1: outputs.get_output(t4), }; return (p_0,); } #[inline(always)] pub fn run_BN254_MP_CHECK_PREPARE_PAIRS_2P_circuit( p_0: G1Point, Qy0_0: u384, Qy1_0: u384, p_1: G1Point, Qy0_1: u384, Qy1_1: u384, ) -> (BNProcessedPair, BNProcessedPair) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8) = (CE::> {}, CE::> {}); let t0 = circuit_inverse(in2); let t1 = circuit_mul(in1, t0); let t2 = circuit_sub(in0, t1); let t3 = circuit_sub(in0, in3); let t4 = circuit_sub(in0, in4); let t5 = circuit_inverse(in6); let t6 = circuit_mul(in5, t5); let t7 = circuit_sub(in0, t6); let t8 = circuit_sub(in0, in7); let t9 = circuit_sub(in0, in8); let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t0, t2, t3, t4, t5, t7, t8, t9).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p_0.x); // in1 circuit_inputs = circuit_inputs.next_2(p_0.y); // in2 circuit_inputs = circuit_inputs.next_2(Qy0_0); // in3 circuit_inputs = circuit_inputs.next_2(Qy1_0); // in4 circuit_inputs = circuit_inputs.next_2(p_1.x); // in5 circuit_inputs = circuit_inputs.next_2(p_1.y); // in6 circuit_inputs = circuit_inputs.next_2(Qy0_1); // in7 circuit_inputs = circuit_inputs.next_2(Qy1_1); // in8 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let p_0: BNProcessedPair = BNProcessedPair { yInv: outputs.get_output(t0), xNegOverY: outputs.get_output(t2), QyNeg0: outputs.get_output(t3), QyNeg1: outputs.get_output(t4), }; let p_1: BNProcessedPair = BNProcessedPair { yInv: outputs.get_output(t5), xNegOverY: outputs.get_output(t7), QyNeg0: outputs.get_output(t8), QyNeg1: outputs.get_output(t9), }; return (p_0, p_1); } #[inline(always)] pub fn run_BN254_MP_CHECK_PREPARE_PAIRS_3P_circuit( p_0: G1Point, Qy0_0: u384, Qy1_0: u384, p_1: G1Point, Qy0_1: u384, Qy1_1: u384, p_2: G1Point, Qy0_2: u384, Qy1_2: u384, ) -> (BNProcessedPair, BNProcessedPair, BNProcessedPair) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8, in9) = (CE::> {}, CE::> {}, CE::> {}); let (in10, in11, in12) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_inverse(in2); let t1 = circuit_mul(in1, t0); let t2 = circuit_sub(in0, t1); let t3 = circuit_sub(in0, in3); let t4 = circuit_sub(in0, in4); let t5 = circuit_inverse(in6); let t6 = circuit_mul(in5, t5); let t7 = circuit_sub(in0, t6); let t8 = circuit_sub(in0, in7); let t9 = circuit_sub(in0, in8); let t10 = circuit_inverse(in10); let t11 = circuit_mul(in9, t10); let t12 = circuit_sub(in0, t11); let t13 = circuit_sub(in0, in11); let t14 = circuit_sub(in0, in12); let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t0, t2, t3, t4, t5, t7, t8, t9, t10, t12, t13, t14).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(p_0.x); // in1 circuit_inputs = circuit_inputs.next_2(p_0.y); // in2 circuit_inputs = circuit_inputs.next_2(Qy0_0); // in3 circuit_inputs = circuit_inputs.next_2(Qy1_0); // in4 circuit_inputs = circuit_inputs.next_2(p_1.x); // in5 circuit_inputs = circuit_inputs.next_2(p_1.y); // in6 circuit_inputs = circuit_inputs.next_2(Qy0_1); // in7 circuit_inputs = circuit_inputs.next_2(Qy1_1); // in8 circuit_inputs = circuit_inputs.next_2(p_2.x); // in9 circuit_inputs = circuit_inputs.next_2(p_2.y); // in10 circuit_inputs = circuit_inputs.next_2(Qy0_2); // in11 circuit_inputs = circuit_inputs.next_2(Qy1_2); // in12 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let p_0: BNProcessedPair = BNProcessedPair { yInv: outputs.get_output(t0), xNegOverY: outputs.get_output(t2), QyNeg0: outputs.get_output(t3), QyNeg1: outputs.get_output(t4), }; let p_1: BNProcessedPair = BNProcessedPair { yInv: outputs.get_output(t5), xNegOverY: outputs.get_output(t7), QyNeg0: outputs.get_output(t8), QyNeg1: outputs.get_output(t9), }; let p_2: BNProcessedPair = BNProcessedPair { yInv: outputs.get_output(t10), xNegOverY: outputs.get_output(t12), QyNeg0: outputs.get_output(t13), QyNeg1: outputs.get_output(t14), }; return (p_0, p_1, p_2); } ================================================ FILE: src/src/circuits/rsa.cairo ================================================ use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::{RSA2048Chunks, RSA2048ReductionWitness}; impl CircuitDefinition17< E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, > of core::circuit::CircuitDefinition< ( CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, ), > { type CircuitType = core::circuit::Circuit< (E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16), >; } impl MyDrp_17< E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, > of Drop< ( CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, CE, ), >; #[inline(always)] pub fn run_RSA_FULL_VERIFICATION_circuit( mod_chunks: RSA2048Chunks, sig_chunks: RSA2048Chunks, w_0: RSA2048ReductionWitness, w_1: RSA2048ReductionWitness, w_2: RSA2048ReductionWitness, w_3: RSA2048ReductionWitness, w_4: RSA2048ReductionWitness, w_5: RSA2048ReductionWitness, w_6: RSA2048ReductionWitness, w_7: RSA2048ReductionWitness, w_8: RSA2048ReductionWitness, w_9: RSA2048ReductionWitness, w_10: RSA2048ReductionWitness, w_11: RSA2048ReductionWitness, w_12: RSA2048ReductionWitness, w_13: RSA2048ReductionWitness, w_14: RSA2048ReductionWitness, w_15: RSA2048ReductionWitness, w_16: RSA2048ReductionWitness, step: u384, modulus: core::circuit::CircuitModulus, ) -> ( u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384, ) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let (in24, in25, in26) = (CE::> {}, CE::> {}, CE::> {}); let (in27, in28, in29) = (CE::> {}, CE::> {}, CE::> {}); let (in30, in31, in32) = (CE::> {}, CE::> {}, CE::> {}); let (in33, in34, in35) = (CE::> {}, CE::> {}, CE::> {}); let (in36, in37, in38) = (CE::> {}, CE::> {}, CE::> {}); let (in39, in40, in41) = (CE::> {}, CE::> {}, CE::> {}); let (in42, in43, in44) = (CE::> {}, CE::> {}, CE::> {}); let (in45, in46, in47) = (CE::> {}, CE::> {}, CE::> {}); let (in48, in49, in50) = (CE::> {}, CE::> {}, CE::> {}); let (in51, in52, in53) = (CE::> {}, CE::> {}, CE::> {}); let (in54, in55, in56) = (CE::> {}, CE::> {}, CE::> {}); let (in57, in58, in59) = (CE::> {}, CE::> {}, CE::> {}); let (in60, in61, in62) = (CE::> {}, CE::> {}, CE::> {}); let (in63, in64, in65) = (CE::> {}, CE::> {}, CE::> {}); let (in66, in67, in68) = (CE::> {}, CE::> {}, CE::> {}); let (in69, in70, in71) = (CE::> {}, CE::> {}, CE::> {}); let (in72, in73, in74) = (CE::> {}, CE::> {}, CE::> {}); let (in75, in76, in77) = (CE::> {}, CE::> {}, CE::> {}); let (in78, in79, in80) = (CE::> {}, CE::> {}, CE::> {}); let (in81, in82, in83) = (CE::> {}, CE::> {}, CE::> {}); let (in84, in85, in86) = (CE::> {}, CE::> {}, CE::> {}); let (in87, in88, in89) = (CE::> {}, CE::> {}, CE::> {}); let (in90, in91, in92) = (CE::> {}, CE::> {}, CE::> {}); let (in93, in94, in95) = (CE::> {}, CE::> {}, CE::> {}); let (in96, in97, in98) = (CE::> {}, CE::> {}, CE::> {}); let (in99, in100, in101) = (CE::> {}, CE::> {}, CE::> {}); let (in102, in103, in104) = (CE::> {}, CE::> {}, CE::> {}); let (in105, in106, in107) = (CE::> {}, CE::> {}, CE::> {}); let (in108, in109, in110) = (CE::> {}, CE::> {}, CE::> {}); let (in111, in112, in113) = (CE::> {}, CE::> {}, CE::> {}); let (in114, in115, in116) = (CE::> {}, CE::> {}, CE::> {}); let (in117, in118, in119) = (CE::> {}, CE::> {}, CE::> {}); let (in120, in121, in122) = (CE::> {}, CE::> {}, CE::> {}); let (in123, in124, in125) = (CE::> {}, CE::> {}, CE::> {}); let (in126, in127, in128) = (CE::> {}, CE::> {}, CE::> {}); let (in129, in130, in131) = (CE::> {}, CE::> {}, CE::> {}); let (in132, in133, in134) = (CE::> {}, CE::> {}, CE::> {}); let (in135, in136, in137) = (CE::> {}, CE::> {}, CE::> {}); let (in138, in139, in140) = (CE::> {}, CE::> {}, CE::> {}); let (in141, in142, in143) = (CE::> {}, CE::> {}, CE::> {}); let (in144, in145, in146) = (CE::> {}, CE::> {}, CE::> {}); let (in147, in148, in149) = (CE::> {}, CE::> {}, CE::> {}); let (in150, in151, in152) = (CE::> {}, CE::> {}, CE::> {}); let (in153, in154, in155) = (CE::> {}, CE::> {}, CE::> {}); let (in156, in157, in158) = (CE::> {}, CE::> {}, CE::> {}); let (in159, in160, in161) = (CE::> {}, CE::> {}, CE::> {}); let (in162, in163, in164) = (CE::> {}, CE::> {}, CE::> {}); let (in165, in166, in167) = (CE::> {}, CE::> {}, CE::> {}); let (in168, in169, in170) = (CE::> {}, CE::> {}, CE::> {}); let (in171, in172, in173) = (CE::> {}, CE::> {}, CE::> {}); let (in174, in175, in176) = (CE::> {}, CE::> {}, CE::> {}); let (in177, in178, in179) = (CE::> {}, CE::> {}, CE::> {}); let (in180, in181, in182) = (CE::> {}, CE::> {}, CE::> {}); let (in183, in184, in185) = (CE::> {}, CE::> {}, CE::> {}); let (in186, in187, in188) = (CE::> {}, CE::> {}, CE::> {}); let (in189, in190, in191) = (CE::> {}, CE::> {}, CE::> {}); let (in192, in193, in194) = (CE::> {}, CE::> {}, CE::> {}); let (in195, in196, in197) = (CE::> {}, CE::> {}, CE::> {}); let (in198, in199, in200) = (CE::> {}, CE::> {}, CE::> {}); let (in201, in202, in203) = (CE::> {}, CE::> {}, CE::> {}); let (in204, in205, in206) = (CE::> {}, CE::> {}, CE::> {}); let (in207, in208, in209) = (CE::> {}, CE::> {}, CE::> {}); let (in210, in211, in212) = (CE::> {}, CE::> {}, CE::> {}); let (in213, in214, in215) = (CE::> {}, CE::> {}, CE::> {}); let in216 = CE::> {}; let t0 = circuit_mul(in5, in216); // Eval mod_chunks Horner step: multiply by STEP let t1 = circuit_add(in4, t0); // Eval mod_chunks Horner step: add coefficient_4 let t2 = circuit_mul(t1, in216); // Eval mod_chunks Horner step: multiply by STEP let t3 = circuit_add(in3, t2); // Eval mod_chunks Horner step: add coefficient_3 let t4 = circuit_mul(t3, in216); // Eval mod_chunks Horner step: multiply by STEP let t5 = circuit_add(in2, t4); // Eval mod_chunks Horner step: add coefficient_2 let t6 = circuit_mul(t5, in216); // Eval mod_chunks Horner step: multiply by STEP let t7 = circuit_add(in1, t6); // Eval mod_chunks Horner step: add coefficient_1 let t8 = circuit_mul(t7, in216); // Eval mod_chunks Horner step: multiply by STEP let t9 = circuit_add(in0, t8); // Eval mod_chunks Horner step: add coefficient_0 let t10 = circuit_mul(in11, in216); // Eval sig_chunks Horner step: multiply by STEP let t11 = circuit_add(in10, t10); // Eval sig_chunks Horner step: add coefficient_4 let t12 = circuit_mul(t11, in216); // Eval sig_chunks Horner step: multiply by STEP let t13 = circuit_add(in9, t12); // Eval sig_chunks Horner step: add coefficient_3 let t14 = circuit_mul(t13, in216); // Eval sig_chunks Horner step: multiply by STEP let t15 = circuit_add(in8, t14); // Eval sig_chunks Horner step: add coefficient_2 let t16 = circuit_mul(t15, in216); // Eval sig_chunks Horner step: multiply by STEP let t17 = circuit_add(in7, t16); // Eval sig_chunks Horner step: add coefficient_1 let t18 = circuit_mul(t17, in216); // Eval sig_chunks Horner step: multiply by STEP let t19 = circuit_add(in6, t18); // Eval sig_chunks Horner step: add coefficient_0 let t20 = circuit_mul(in17, in216); // Eval quot_0 Horner step: multiply by STEP let t21 = circuit_add(in16, t20); // Eval quot_0 Horner step: add coefficient_4 let t22 = circuit_mul(t21, in216); // Eval quot_0 Horner step: multiply by STEP let t23 = circuit_add(in15, t22); // Eval quot_0 Horner step: add coefficient_3 let t24 = circuit_mul(t23, in216); // Eval quot_0 Horner step: multiply by STEP let t25 = circuit_add(in14, t24); // Eval quot_0 Horner step: add coefficient_2 let t26 = circuit_mul(t25, in216); // Eval quot_0 Horner step: multiply by STEP let t27 = circuit_add(in13, t26); // Eval quot_0 Horner step: add coefficient_1 let t28 = circuit_mul(t27, in216); // Eval quot_0 Horner step: multiply by STEP let t29 = circuit_add(in12, t28); // Eval quot_0 Horner step: add coefficient_0 let t30 = circuit_mul(in23, in216); // Eval rem_0 Horner step: multiply by STEP let t31 = circuit_add(in22, t30); // Eval rem_0 Horner step: add coefficient_4 let t32 = circuit_mul(t31, in216); // Eval rem_0 Horner step: multiply by STEP let t33 = circuit_add(in21, t32); // Eval rem_0 Horner step: add coefficient_3 let t34 = circuit_mul(t33, in216); // Eval rem_0 Horner step: multiply by STEP let t35 = circuit_add(in20, t34); // Eval rem_0 Horner step: add coefficient_2 let t36 = circuit_mul(t35, in216); // Eval rem_0 Horner step: multiply by STEP let t37 = circuit_add(in19, t36); // Eval rem_0 Horner step: add coefficient_1 let t38 = circuit_mul(t37, in216); // Eval rem_0 Horner step: multiply by STEP let t39 = circuit_add(in18, t38); // Eval rem_0 Horner step: add coefficient_0 let t40 = circuit_mul(t19, t19); // square_0 let t41 = circuit_mul(t29, t9); // quot*mod_0 let t42 = circuit_sub(t40, t41); // ab-qn_0 let t43 = circuit_sub(t42, t39); // ab-qn-rem_0 let t44 = circuit_mul(in29, in216); // Eval quot_1 Horner step: multiply by STEP let t45 = circuit_add(in28, t44); // Eval quot_1 Horner step: add coefficient_4 let t46 = circuit_mul(t45, in216); // Eval quot_1 Horner step: multiply by STEP let t47 = circuit_add(in27, t46); // Eval quot_1 Horner step: add coefficient_3 let t48 = circuit_mul(t47, in216); // Eval quot_1 Horner step: multiply by STEP let t49 = circuit_add(in26, t48); // Eval quot_1 Horner step: add coefficient_2 let t50 = circuit_mul(t49, in216); // Eval quot_1 Horner step: multiply by STEP let t51 = circuit_add(in25, t50); // Eval quot_1 Horner step: add coefficient_1 let t52 = circuit_mul(t51, in216); // Eval quot_1 Horner step: multiply by STEP let t53 = circuit_add(in24, t52); // Eval quot_1 Horner step: add coefficient_0 let t54 = circuit_mul(in35, in216); // Eval rem_1 Horner step: multiply by STEP let t55 = circuit_add(in34, t54); // Eval rem_1 Horner step: add coefficient_4 let t56 = circuit_mul(t55, in216); // Eval rem_1 Horner step: multiply by STEP let t57 = circuit_add(in33, t56); // Eval rem_1 Horner step: add coefficient_3 let t58 = circuit_mul(t57, in216); // Eval rem_1 Horner step: multiply by STEP let t59 = circuit_add(in32, t58); // Eval rem_1 Horner step: add coefficient_2 let t60 = circuit_mul(t59, in216); // Eval rem_1 Horner step: multiply by STEP let t61 = circuit_add(in31, t60); // Eval rem_1 Horner step: add coefficient_1 let t62 = circuit_mul(t61, in216); // Eval rem_1 Horner step: multiply by STEP let t63 = circuit_add(in30, t62); // Eval rem_1 Horner step: add coefficient_0 let t64 = circuit_mul(t39, t39); // square_1 let t65 = circuit_mul(t53, t9); // quot*mod_1 let t66 = circuit_sub(t64, t65); // ab-qn_1 let t67 = circuit_sub(t66, t63); // ab-qn-rem_1 let t68 = circuit_mul(in41, in216); // Eval quot_2 Horner step: multiply by STEP let t69 = circuit_add(in40, t68); // Eval quot_2 Horner step: add coefficient_4 let t70 = circuit_mul(t69, in216); // Eval quot_2 Horner step: multiply by STEP let t71 = circuit_add(in39, t70); // Eval quot_2 Horner step: add coefficient_3 let t72 = circuit_mul(t71, in216); // Eval quot_2 Horner step: multiply by STEP let t73 = circuit_add(in38, t72); // Eval quot_2 Horner step: add coefficient_2 let t74 = circuit_mul(t73, in216); // Eval quot_2 Horner step: multiply by STEP let t75 = circuit_add(in37, t74); // Eval quot_2 Horner step: add coefficient_1 let t76 = circuit_mul(t75, in216); // Eval quot_2 Horner step: multiply by STEP let t77 = circuit_add(in36, t76); // Eval quot_2 Horner step: add coefficient_0 let t78 = circuit_mul(in47, in216); // Eval rem_2 Horner step: multiply by STEP let t79 = circuit_add(in46, t78); // Eval rem_2 Horner step: add coefficient_4 let t80 = circuit_mul(t79, in216); // Eval rem_2 Horner step: multiply by STEP let t81 = circuit_add(in45, t80); // Eval rem_2 Horner step: add coefficient_3 let t82 = circuit_mul(t81, in216); // Eval rem_2 Horner step: multiply by STEP let t83 = circuit_add(in44, t82); // Eval rem_2 Horner step: add coefficient_2 let t84 = circuit_mul(t83, in216); // Eval rem_2 Horner step: multiply by STEP let t85 = circuit_add(in43, t84); // Eval rem_2 Horner step: add coefficient_1 let t86 = circuit_mul(t85, in216); // Eval rem_2 Horner step: multiply by STEP let t87 = circuit_add(in42, t86); // Eval rem_2 Horner step: add coefficient_0 let t88 = circuit_mul(t63, t63); // square_2 let t89 = circuit_mul(t77, t9); // quot*mod_2 let t90 = circuit_sub(t88, t89); // ab-qn_2 let t91 = circuit_sub(t90, t87); // ab-qn-rem_2 let t92 = circuit_mul(in53, in216); // Eval quot_3 Horner step: multiply by STEP let t93 = circuit_add(in52, t92); // Eval quot_3 Horner step: add coefficient_4 let t94 = circuit_mul(t93, in216); // Eval quot_3 Horner step: multiply by STEP let t95 = circuit_add(in51, t94); // Eval quot_3 Horner step: add coefficient_3 let t96 = circuit_mul(t95, in216); // Eval quot_3 Horner step: multiply by STEP let t97 = circuit_add(in50, t96); // Eval quot_3 Horner step: add coefficient_2 let t98 = circuit_mul(t97, in216); // Eval quot_3 Horner step: multiply by STEP let t99 = circuit_add(in49, t98); // Eval quot_3 Horner step: add coefficient_1 let t100 = circuit_mul(t99, in216); // Eval quot_3 Horner step: multiply by STEP let t101 = circuit_add(in48, t100); // Eval quot_3 Horner step: add coefficient_0 let t102 = circuit_mul(in59, in216); // Eval rem_3 Horner step: multiply by STEP let t103 = circuit_add(in58, t102); // Eval rem_3 Horner step: add coefficient_4 let t104 = circuit_mul(t103, in216); // Eval rem_3 Horner step: multiply by STEP let t105 = circuit_add(in57, t104); // Eval rem_3 Horner step: add coefficient_3 let t106 = circuit_mul(t105, in216); // Eval rem_3 Horner step: multiply by STEP let t107 = circuit_add(in56, t106); // Eval rem_3 Horner step: add coefficient_2 let t108 = circuit_mul(t107, in216); // Eval rem_3 Horner step: multiply by STEP let t109 = circuit_add(in55, t108); // Eval rem_3 Horner step: add coefficient_1 let t110 = circuit_mul(t109, in216); // Eval rem_3 Horner step: multiply by STEP let t111 = circuit_add(in54, t110); // Eval rem_3 Horner step: add coefficient_0 let t112 = circuit_mul(t87, t87); // square_3 let t113 = circuit_mul(t101, t9); // quot*mod_3 let t114 = circuit_sub(t112, t113); // ab-qn_3 let t115 = circuit_sub(t114, t111); // ab-qn-rem_3 let t116 = circuit_mul(in65, in216); // Eval quot_4 Horner step: multiply by STEP let t117 = circuit_add(in64, t116); // Eval quot_4 Horner step: add coefficient_4 let t118 = circuit_mul(t117, in216); // Eval quot_4 Horner step: multiply by STEP let t119 = circuit_add(in63, t118); // Eval quot_4 Horner step: add coefficient_3 let t120 = circuit_mul(t119, in216); // Eval quot_4 Horner step: multiply by STEP let t121 = circuit_add(in62, t120); // Eval quot_4 Horner step: add coefficient_2 let t122 = circuit_mul(t121, in216); // Eval quot_4 Horner step: multiply by STEP let t123 = circuit_add(in61, t122); // Eval quot_4 Horner step: add coefficient_1 let t124 = circuit_mul(t123, in216); // Eval quot_4 Horner step: multiply by STEP let t125 = circuit_add(in60, t124); // Eval quot_4 Horner step: add coefficient_0 let t126 = circuit_mul(in71, in216); // Eval rem_4 Horner step: multiply by STEP let t127 = circuit_add(in70, t126); // Eval rem_4 Horner step: add coefficient_4 let t128 = circuit_mul(t127, in216); // Eval rem_4 Horner step: multiply by STEP let t129 = circuit_add(in69, t128); // Eval rem_4 Horner step: add coefficient_3 let t130 = circuit_mul(t129, in216); // Eval rem_4 Horner step: multiply by STEP let t131 = circuit_add(in68, t130); // Eval rem_4 Horner step: add coefficient_2 let t132 = circuit_mul(t131, in216); // Eval rem_4 Horner step: multiply by STEP let t133 = circuit_add(in67, t132); // Eval rem_4 Horner step: add coefficient_1 let t134 = circuit_mul(t133, in216); // Eval rem_4 Horner step: multiply by STEP let t135 = circuit_add(in66, t134); // Eval rem_4 Horner step: add coefficient_0 let t136 = circuit_mul(t111, t111); // square_4 let t137 = circuit_mul(t125, t9); // quot*mod_4 let t138 = circuit_sub(t136, t137); // ab-qn_4 let t139 = circuit_sub(t138, t135); // ab-qn-rem_4 let t140 = circuit_mul(in77, in216); // Eval quot_5 Horner step: multiply by STEP let t141 = circuit_add(in76, t140); // Eval quot_5 Horner step: add coefficient_4 let t142 = circuit_mul(t141, in216); // Eval quot_5 Horner step: multiply by STEP let t143 = circuit_add(in75, t142); // Eval quot_5 Horner step: add coefficient_3 let t144 = circuit_mul(t143, in216); // Eval quot_5 Horner step: multiply by STEP let t145 = circuit_add(in74, t144); // Eval quot_5 Horner step: add coefficient_2 let t146 = circuit_mul(t145, in216); // Eval quot_5 Horner step: multiply by STEP let t147 = circuit_add(in73, t146); // Eval quot_5 Horner step: add coefficient_1 let t148 = circuit_mul(t147, in216); // Eval quot_5 Horner step: multiply by STEP let t149 = circuit_add(in72, t148); // Eval quot_5 Horner step: add coefficient_0 let t150 = circuit_mul(in83, in216); // Eval rem_5 Horner step: multiply by STEP let t151 = circuit_add(in82, t150); // Eval rem_5 Horner step: add coefficient_4 let t152 = circuit_mul(t151, in216); // Eval rem_5 Horner step: multiply by STEP let t153 = circuit_add(in81, t152); // Eval rem_5 Horner step: add coefficient_3 let t154 = circuit_mul(t153, in216); // Eval rem_5 Horner step: multiply by STEP let t155 = circuit_add(in80, t154); // Eval rem_5 Horner step: add coefficient_2 let t156 = circuit_mul(t155, in216); // Eval rem_5 Horner step: multiply by STEP let t157 = circuit_add(in79, t156); // Eval rem_5 Horner step: add coefficient_1 let t158 = circuit_mul(t157, in216); // Eval rem_5 Horner step: multiply by STEP let t159 = circuit_add(in78, t158); // Eval rem_5 Horner step: add coefficient_0 let t160 = circuit_mul(t135, t135); // square_5 let t161 = circuit_mul(t149, t9); // quot*mod_5 let t162 = circuit_sub(t160, t161); // ab-qn_5 let t163 = circuit_sub(t162, t159); // ab-qn-rem_5 let t164 = circuit_mul(in89, in216); // Eval quot_6 Horner step: multiply by STEP let t165 = circuit_add(in88, t164); // Eval quot_6 Horner step: add coefficient_4 let t166 = circuit_mul(t165, in216); // Eval quot_6 Horner step: multiply by STEP let t167 = circuit_add(in87, t166); // Eval quot_6 Horner step: add coefficient_3 let t168 = circuit_mul(t167, in216); // Eval quot_6 Horner step: multiply by STEP let t169 = circuit_add(in86, t168); // Eval quot_6 Horner step: add coefficient_2 let t170 = circuit_mul(t169, in216); // Eval quot_6 Horner step: multiply by STEP let t171 = circuit_add(in85, t170); // Eval quot_6 Horner step: add coefficient_1 let t172 = circuit_mul(t171, in216); // Eval quot_6 Horner step: multiply by STEP let t173 = circuit_add(in84, t172); // Eval quot_6 Horner step: add coefficient_0 let t174 = circuit_mul(in95, in216); // Eval rem_6 Horner step: multiply by STEP let t175 = circuit_add(in94, t174); // Eval rem_6 Horner step: add coefficient_4 let t176 = circuit_mul(t175, in216); // Eval rem_6 Horner step: multiply by STEP let t177 = circuit_add(in93, t176); // Eval rem_6 Horner step: add coefficient_3 let t178 = circuit_mul(t177, in216); // Eval rem_6 Horner step: multiply by STEP let t179 = circuit_add(in92, t178); // Eval rem_6 Horner step: add coefficient_2 let t180 = circuit_mul(t179, in216); // Eval rem_6 Horner step: multiply by STEP let t181 = circuit_add(in91, t180); // Eval rem_6 Horner step: add coefficient_1 let t182 = circuit_mul(t181, in216); // Eval rem_6 Horner step: multiply by STEP let t183 = circuit_add(in90, t182); // Eval rem_6 Horner step: add coefficient_0 let t184 = circuit_mul(t159, t159); // square_6 let t185 = circuit_mul(t173, t9); // quot*mod_6 let t186 = circuit_sub(t184, t185); // ab-qn_6 let t187 = circuit_sub(t186, t183); // ab-qn-rem_6 let t188 = circuit_mul(in101, in216); // Eval quot_7 Horner step: multiply by STEP let t189 = circuit_add(in100, t188); // Eval quot_7 Horner step: add coefficient_4 let t190 = circuit_mul(t189, in216); // Eval quot_7 Horner step: multiply by STEP let t191 = circuit_add(in99, t190); // Eval quot_7 Horner step: add coefficient_3 let t192 = circuit_mul(t191, in216); // Eval quot_7 Horner step: multiply by STEP let t193 = circuit_add(in98, t192); // Eval quot_7 Horner step: add coefficient_2 let t194 = circuit_mul(t193, in216); // Eval quot_7 Horner step: multiply by STEP let t195 = circuit_add(in97, t194); // Eval quot_7 Horner step: add coefficient_1 let t196 = circuit_mul(t195, in216); // Eval quot_7 Horner step: multiply by STEP let t197 = circuit_add(in96, t196); // Eval quot_7 Horner step: add coefficient_0 let t198 = circuit_mul(in107, in216); // Eval rem_7 Horner step: multiply by STEP let t199 = circuit_add(in106, t198); // Eval rem_7 Horner step: add coefficient_4 let t200 = circuit_mul(t199, in216); // Eval rem_7 Horner step: multiply by STEP let t201 = circuit_add(in105, t200); // Eval rem_7 Horner step: add coefficient_3 let t202 = circuit_mul(t201, in216); // Eval rem_7 Horner step: multiply by STEP let t203 = circuit_add(in104, t202); // Eval rem_7 Horner step: add coefficient_2 let t204 = circuit_mul(t203, in216); // Eval rem_7 Horner step: multiply by STEP let t205 = circuit_add(in103, t204); // Eval rem_7 Horner step: add coefficient_1 let t206 = circuit_mul(t205, in216); // Eval rem_7 Horner step: multiply by STEP let t207 = circuit_add(in102, t206); // Eval rem_7 Horner step: add coefficient_0 let t208 = circuit_mul(t183, t183); // square_7 let t209 = circuit_mul(t197, t9); // quot*mod_7 let t210 = circuit_sub(t208, t209); // ab-qn_7 let t211 = circuit_sub(t210, t207); // ab-qn-rem_7 let t212 = circuit_mul(in113, in216); // Eval quot_8 Horner step: multiply by STEP let t213 = circuit_add(in112, t212); // Eval quot_8 Horner step: add coefficient_4 let t214 = circuit_mul(t213, in216); // Eval quot_8 Horner step: multiply by STEP let t215 = circuit_add(in111, t214); // Eval quot_8 Horner step: add coefficient_3 let t216 = circuit_mul(t215, in216); // Eval quot_8 Horner step: multiply by STEP let t217 = circuit_add(in110, t216); // Eval quot_8 Horner step: add coefficient_2 let t218 = circuit_mul(t217, in216); // Eval quot_8 Horner step: multiply by STEP let t219 = circuit_add(in109, t218); // Eval quot_8 Horner step: add coefficient_1 let t220 = circuit_mul(t219, in216); // Eval quot_8 Horner step: multiply by STEP let t221 = circuit_add(in108, t220); // Eval quot_8 Horner step: add coefficient_0 let t222 = circuit_mul(in119, in216); // Eval rem_8 Horner step: multiply by STEP let t223 = circuit_add(in118, t222); // Eval rem_8 Horner step: add coefficient_4 let t224 = circuit_mul(t223, in216); // Eval rem_8 Horner step: multiply by STEP let t225 = circuit_add(in117, t224); // Eval rem_8 Horner step: add coefficient_3 let t226 = circuit_mul(t225, in216); // Eval rem_8 Horner step: multiply by STEP let t227 = circuit_add(in116, t226); // Eval rem_8 Horner step: add coefficient_2 let t228 = circuit_mul(t227, in216); // Eval rem_8 Horner step: multiply by STEP let t229 = circuit_add(in115, t228); // Eval rem_8 Horner step: add coefficient_1 let t230 = circuit_mul(t229, in216); // Eval rem_8 Horner step: multiply by STEP let t231 = circuit_add(in114, t230); // Eval rem_8 Horner step: add coefficient_0 let t232 = circuit_mul(t207, t207); // square_8 let t233 = circuit_mul(t221, t9); // quot*mod_8 let t234 = circuit_sub(t232, t233); // ab-qn_8 let t235 = circuit_sub(t234, t231); // ab-qn-rem_8 let t236 = circuit_mul(in125, in216); // Eval quot_9 Horner step: multiply by STEP let t237 = circuit_add(in124, t236); // Eval quot_9 Horner step: add coefficient_4 let t238 = circuit_mul(t237, in216); // Eval quot_9 Horner step: multiply by STEP let t239 = circuit_add(in123, t238); // Eval quot_9 Horner step: add coefficient_3 let t240 = circuit_mul(t239, in216); // Eval quot_9 Horner step: multiply by STEP let t241 = circuit_add(in122, t240); // Eval quot_9 Horner step: add coefficient_2 let t242 = circuit_mul(t241, in216); // Eval quot_9 Horner step: multiply by STEP let t243 = circuit_add(in121, t242); // Eval quot_9 Horner step: add coefficient_1 let t244 = circuit_mul(t243, in216); // Eval quot_9 Horner step: multiply by STEP let t245 = circuit_add(in120, t244); // Eval quot_9 Horner step: add coefficient_0 let t246 = circuit_mul(in131, in216); // Eval rem_9 Horner step: multiply by STEP let t247 = circuit_add(in130, t246); // Eval rem_9 Horner step: add coefficient_4 let t248 = circuit_mul(t247, in216); // Eval rem_9 Horner step: multiply by STEP let t249 = circuit_add(in129, t248); // Eval rem_9 Horner step: add coefficient_3 let t250 = circuit_mul(t249, in216); // Eval rem_9 Horner step: multiply by STEP let t251 = circuit_add(in128, t250); // Eval rem_9 Horner step: add coefficient_2 let t252 = circuit_mul(t251, in216); // Eval rem_9 Horner step: multiply by STEP let t253 = circuit_add(in127, t252); // Eval rem_9 Horner step: add coefficient_1 let t254 = circuit_mul(t253, in216); // Eval rem_9 Horner step: multiply by STEP let t255 = circuit_add(in126, t254); // Eval rem_9 Horner step: add coefficient_0 let t256 = circuit_mul(t231, t231); // square_9 let t257 = circuit_mul(t245, t9); // quot*mod_9 let t258 = circuit_sub(t256, t257); // ab-qn_9 let t259 = circuit_sub(t258, t255); // ab-qn-rem_9 let t260 = circuit_mul(in137, in216); // Eval quot_10 Horner step: multiply by STEP let t261 = circuit_add(in136, t260); // Eval quot_10 Horner step: add coefficient_4 let t262 = circuit_mul(t261, in216); // Eval quot_10 Horner step: multiply by STEP let t263 = circuit_add(in135, t262); // Eval quot_10 Horner step: add coefficient_3 let t264 = circuit_mul(t263, in216); // Eval quot_10 Horner step: multiply by STEP let t265 = circuit_add(in134, t264); // Eval quot_10 Horner step: add coefficient_2 let t266 = circuit_mul(t265, in216); // Eval quot_10 Horner step: multiply by STEP let t267 = circuit_add(in133, t266); // Eval quot_10 Horner step: add coefficient_1 let t268 = circuit_mul(t267, in216); // Eval quot_10 Horner step: multiply by STEP let t269 = circuit_add(in132, t268); // Eval quot_10 Horner step: add coefficient_0 let t270 = circuit_mul(in143, in216); // Eval rem_10 Horner step: multiply by STEP let t271 = circuit_add(in142, t270); // Eval rem_10 Horner step: add coefficient_4 let t272 = circuit_mul(t271, in216); // Eval rem_10 Horner step: multiply by STEP let t273 = circuit_add(in141, t272); // Eval rem_10 Horner step: add coefficient_3 let t274 = circuit_mul(t273, in216); // Eval rem_10 Horner step: multiply by STEP let t275 = circuit_add(in140, t274); // Eval rem_10 Horner step: add coefficient_2 let t276 = circuit_mul(t275, in216); // Eval rem_10 Horner step: multiply by STEP let t277 = circuit_add(in139, t276); // Eval rem_10 Horner step: add coefficient_1 let t278 = circuit_mul(t277, in216); // Eval rem_10 Horner step: multiply by STEP let t279 = circuit_add(in138, t278); // Eval rem_10 Horner step: add coefficient_0 let t280 = circuit_mul(t255, t255); // square_10 let t281 = circuit_mul(t269, t9); // quot*mod_10 let t282 = circuit_sub(t280, t281); // ab-qn_10 let t283 = circuit_sub(t282, t279); // ab-qn-rem_10 let t284 = circuit_mul(in149, in216); // Eval quot_11 Horner step: multiply by STEP let t285 = circuit_add(in148, t284); // Eval quot_11 Horner step: add coefficient_4 let t286 = circuit_mul(t285, in216); // Eval quot_11 Horner step: multiply by STEP let t287 = circuit_add(in147, t286); // Eval quot_11 Horner step: add coefficient_3 let t288 = circuit_mul(t287, in216); // Eval quot_11 Horner step: multiply by STEP let t289 = circuit_add(in146, t288); // Eval quot_11 Horner step: add coefficient_2 let t290 = circuit_mul(t289, in216); // Eval quot_11 Horner step: multiply by STEP let t291 = circuit_add(in145, t290); // Eval quot_11 Horner step: add coefficient_1 let t292 = circuit_mul(t291, in216); // Eval quot_11 Horner step: multiply by STEP let t293 = circuit_add(in144, t292); // Eval quot_11 Horner step: add coefficient_0 let t294 = circuit_mul(in155, in216); // Eval rem_11 Horner step: multiply by STEP let t295 = circuit_add(in154, t294); // Eval rem_11 Horner step: add coefficient_4 let t296 = circuit_mul(t295, in216); // Eval rem_11 Horner step: multiply by STEP let t297 = circuit_add(in153, t296); // Eval rem_11 Horner step: add coefficient_3 let t298 = circuit_mul(t297, in216); // Eval rem_11 Horner step: multiply by STEP let t299 = circuit_add(in152, t298); // Eval rem_11 Horner step: add coefficient_2 let t300 = circuit_mul(t299, in216); // Eval rem_11 Horner step: multiply by STEP let t301 = circuit_add(in151, t300); // Eval rem_11 Horner step: add coefficient_1 let t302 = circuit_mul(t301, in216); // Eval rem_11 Horner step: multiply by STEP let t303 = circuit_add(in150, t302); // Eval rem_11 Horner step: add coefficient_0 let t304 = circuit_mul(t279, t279); // square_11 let t305 = circuit_mul(t293, t9); // quot*mod_11 let t306 = circuit_sub(t304, t305); // ab-qn_11 let t307 = circuit_sub(t306, t303); // ab-qn-rem_11 let t308 = circuit_mul(in161, in216); // Eval quot_12 Horner step: multiply by STEP let t309 = circuit_add(in160, t308); // Eval quot_12 Horner step: add coefficient_4 let t310 = circuit_mul(t309, in216); // Eval quot_12 Horner step: multiply by STEP let t311 = circuit_add(in159, t310); // Eval quot_12 Horner step: add coefficient_3 let t312 = circuit_mul(t311, in216); // Eval quot_12 Horner step: multiply by STEP let t313 = circuit_add(in158, t312); // Eval quot_12 Horner step: add coefficient_2 let t314 = circuit_mul(t313, in216); // Eval quot_12 Horner step: multiply by STEP let t315 = circuit_add(in157, t314); // Eval quot_12 Horner step: add coefficient_1 let t316 = circuit_mul(t315, in216); // Eval quot_12 Horner step: multiply by STEP let t317 = circuit_add(in156, t316); // Eval quot_12 Horner step: add coefficient_0 let t318 = circuit_mul(in167, in216); // Eval rem_12 Horner step: multiply by STEP let t319 = circuit_add(in166, t318); // Eval rem_12 Horner step: add coefficient_4 let t320 = circuit_mul(t319, in216); // Eval rem_12 Horner step: multiply by STEP let t321 = circuit_add(in165, t320); // Eval rem_12 Horner step: add coefficient_3 let t322 = circuit_mul(t321, in216); // Eval rem_12 Horner step: multiply by STEP let t323 = circuit_add(in164, t322); // Eval rem_12 Horner step: add coefficient_2 let t324 = circuit_mul(t323, in216); // Eval rem_12 Horner step: multiply by STEP let t325 = circuit_add(in163, t324); // Eval rem_12 Horner step: add coefficient_1 let t326 = circuit_mul(t325, in216); // Eval rem_12 Horner step: multiply by STEP let t327 = circuit_add(in162, t326); // Eval rem_12 Horner step: add coefficient_0 let t328 = circuit_mul(t303, t303); // square_12 let t329 = circuit_mul(t317, t9); // quot*mod_12 let t330 = circuit_sub(t328, t329); // ab-qn_12 let t331 = circuit_sub(t330, t327); // ab-qn-rem_12 let t332 = circuit_mul(in173, in216); // Eval quot_13 Horner step: multiply by STEP let t333 = circuit_add(in172, t332); // Eval quot_13 Horner step: add coefficient_4 let t334 = circuit_mul(t333, in216); // Eval quot_13 Horner step: multiply by STEP let t335 = circuit_add(in171, t334); // Eval quot_13 Horner step: add coefficient_3 let t336 = circuit_mul(t335, in216); // Eval quot_13 Horner step: multiply by STEP let t337 = circuit_add(in170, t336); // Eval quot_13 Horner step: add coefficient_2 let t338 = circuit_mul(t337, in216); // Eval quot_13 Horner step: multiply by STEP let t339 = circuit_add(in169, t338); // Eval quot_13 Horner step: add coefficient_1 let t340 = circuit_mul(t339, in216); // Eval quot_13 Horner step: multiply by STEP let t341 = circuit_add(in168, t340); // Eval quot_13 Horner step: add coefficient_0 let t342 = circuit_mul(in179, in216); // Eval rem_13 Horner step: multiply by STEP let t343 = circuit_add(in178, t342); // Eval rem_13 Horner step: add coefficient_4 let t344 = circuit_mul(t343, in216); // Eval rem_13 Horner step: multiply by STEP let t345 = circuit_add(in177, t344); // Eval rem_13 Horner step: add coefficient_3 let t346 = circuit_mul(t345, in216); // Eval rem_13 Horner step: multiply by STEP let t347 = circuit_add(in176, t346); // Eval rem_13 Horner step: add coefficient_2 let t348 = circuit_mul(t347, in216); // Eval rem_13 Horner step: multiply by STEP let t349 = circuit_add(in175, t348); // Eval rem_13 Horner step: add coefficient_1 let t350 = circuit_mul(t349, in216); // Eval rem_13 Horner step: multiply by STEP let t351 = circuit_add(in174, t350); // Eval rem_13 Horner step: add coefficient_0 let t352 = circuit_mul(t327, t327); // square_13 let t353 = circuit_mul(t341, t9); // quot*mod_13 let t354 = circuit_sub(t352, t353); // ab-qn_13 let t355 = circuit_sub(t354, t351); // ab-qn-rem_13 let t356 = circuit_mul(in185, in216); // Eval quot_14 Horner step: multiply by STEP let t357 = circuit_add(in184, t356); // Eval quot_14 Horner step: add coefficient_4 let t358 = circuit_mul(t357, in216); // Eval quot_14 Horner step: multiply by STEP let t359 = circuit_add(in183, t358); // Eval quot_14 Horner step: add coefficient_3 let t360 = circuit_mul(t359, in216); // Eval quot_14 Horner step: multiply by STEP let t361 = circuit_add(in182, t360); // Eval quot_14 Horner step: add coefficient_2 let t362 = circuit_mul(t361, in216); // Eval quot_14 Horner step: multiply by STEP let t363 = circuit_add(in181, t362); // Eval quot_14 Horner step: add coefficient_1 let t364 = circuit_mul(t363, in216); // Eval quot_14 Horner step: multiply by STEP let t365 = circuit_add(in180, t364); // Eval quot_14 Horner step: add coefficient_0 let t366 = circuit_mul(in191, in216); // Eval rem_14 Horner step: multiply by STEP let t367 = circuit_add(in190, t366); // Eval rem_14 Horner step: add coefficient_4 let t368 = circuit_mul(t367, in216); // Eval rem_14 Horner step: multiply by STEP let t369 = circuit_add(in189, t368); // Eval rem_14 Horner step: add coefficient_3 let t370 = circuit_mul(t369, in216); // Eval rem_14 Horner step: multiply by STEP let t371 = circuit_add(in188, t370); // Eval rem_14 Horner step: add coefficient_2 let t372 = circuit_mul(t371, in216); // Eval rem_14 Horner step: multiply by STEP let t373 = circuit_add(in187, t372); // Eval rem_14 Horner step: add coefficient_1 let t374 = circuit_mul(t373, in216); // Eval rem_14 Horner step: multiply by STEP let t375 = circuit_add(in186, t374); // Eval rem_14 Horner step: add coefficient_0 let t376 = circuit_mul(t351, t351); // square_14 let t377 = circuit_mul(t365, t9); // quot*mod_14 let t378 = circuit_sub(t376, t377); // ab-qn_14 let t379 = circuit_sub(t378, t375); // ab-qn-rem_14 let t380 = circuit_mul(in197, in216); // Eval quot_15 Horner step: multiply by STEP let t381 = circuit_add(in196, t380); // Eval quot_15 Horner step: add coefficient_4 let t382 = circuit_mul(t381, in216); // Eval quot_15 Horner step: multiply by STEP let t383 = circuit_add(in195, t382); // Eval quot_15 Horner step: add coefficient_3 let t384 = circuit_mul(t383, in216); // Eval quot_15 Horner step: multiply by STEP let t385 = circuit_add(in194, t384); // Eval quot_15 Horner step: add coefficient_2 let t386 = circuit_mul(t385, in216); // Eval quot_15 Horner step: multiply by STEP let t387 = circuit_add(in193, t386); // Eval quot_15 Horner step: add coefficient_1 let t388 = circuit_mul(t387, in216); // Eval quot_15 Horner step: multiply by STEP let t389 = circuit_add(in192, t388); // Eval quot_15 Horner step: add coefficient_0 let t390 = circuit_mul(in203, in216); // Eval rem_15 Horner step: multiply by STEP let t391 = circuit_add(in202, t390); // Eval rem_15 Horner step: add coefficient_4 let t392 = circuit_mul(t391, in216); // Eval rem_15 Horner step: multiply by STEP let t393 = circuit_add(in201, t392); // Eval rem_15 Horner step: add coefficient_3 let t394 = circuit_mul(t393, in216); // Eval rem_15 Horner step: multiply by STEP let t395 = circuit_add(in200, t394); // Eval rem_15 Horner step: add coefficient_2 let t396 = circuit_mul(t395, in216); // Eval rem_15 Horner step: multiply by STEP let t397 = circuit_add(in199, t396); // Eval rem_15 Horner step: add coefficient_1 let t398 = circuit_mul(t397, in216); // Eval rem_15 Horner step: multiply by STEP let t399 = circuit_add(in198, t398); // Eval rem_15 Horner step: add coefficient_0 let t400 = circuit_mul(t375, t375); // square_15 let t401 = circuit_mul(t389, t9); // quot*mod_15 let t402 = circuit_sub(t400, t401); // ab-qn_15 let t403 = circuit_sub(t402, t399); // ab-qn-rem_15 let t404 = circuit_mul(in209, in216); // Eval quot_16 Horner step: multiply by STEP let t405 = circuit_add(in208, t404); // Eval quot_16 Horner step: add coefficient_4 let t406 = circuit_mul(t405, in216); // Eval quot_16 Horner step: multiply by STEP let t407 = circuit_add(in207, t406); // Eval quot_16 Horner step: add coefficient_3 let t408 = circuit_mul(t407, in216); // Eval quot_16 Horner step: multiply by STEP let t409 = circuit_add(in206, t408); // Eval quot_16 Horner step: add coefficient_2 let t410 = circuit_mul(t409, in216); // Eval quot_16 Horner step: multiply by STEP let t411 = circuit_add(in205, t410); // Eval quot_16 Horner step: add coefficient_1 let t412 = circuit_mul(t411, in216); // Eval quot_16 Horner step: multiply by STEP let t413 = circuit_add(in204, t412); // Eval quot_16 Horner step: add coefficient_0 let t414 = circuit_mul(in215, in216); // Eval rem_16 Horner step: multiply by STEP let t415 = circuit_add(in214, t414); // Eval rem_16 Horner step: add coefficient_4 let t416 = circuit_mul(t415, in216); // Eval rem_16 Horner step: multiply by STEP let t417 = circuit_add(in213, t416); // Eval rem_16 Horner step: add coefficient_3 let t418 = circuit_mul(t417, in216); // Eval rem_16 Horner step: multiply by STEP let t419 = circuit_add(in212, t418); // Eval rem_16 Horner step: add coefficient_2 let t420 = circuit_mul(t419, in216); // Eval rem_16 Horner step: multiply by STEP let t421 = circuit_add(in211, t420); // Eval rem_16 Horner step: add coefficient_1 let t422 = circuit_mul(t421, in216); // Eval rem_16 Horner step: multiply by STEP let t423 = circuit_add(in210, t422); // Eval rem_16 Horner step: add coefficient_0 let t424 = circuit_mul(t399, t19); // final_multiply let t425 = circuit_mul(t413, t9); // quot*mod_16 let t426 = circuit_sub(t424, t425); // ab-qn_16 let t427 = circuit_sub(t426, t423); // ab-qn-rem_16 let modulus = modulus; let mut circuit_inputs = ( t43, t67, t91, t115, t139, t163, t187, t211, t235, t259, t283, t307, t331, t355, t379, t403, t427, ) .new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(mod_chunks.w0); // in0 circuit_inputs = circuit_inputs.next_2(mod_chunks.w1); // in1 circuit_inputs = circuit_inputs.next_2(mod_chunks.w2); // in2 circuit_inputs = circuit_inputs.next_2(mod_chunks.w3); // in3 circuit_inputs = circuit_inputs.next_2(mod_chunks.w4); // in4 circuit_inputs = circuit_inputs.next_2(mod_chunks.w5); // in5 circuit_inputs = circuit_inputs.next_2(sig_chunks.w0); // in6 circuit_inputs = circuit_inputs.next_2(sig_chunks.w1); // in7 circuit_inputs = circuit_inputs.next_2(sig_chunks.w2); // in8 circuit_inputs = circuit_inputs.next_2(sig_chunks.w3); // in9 circuit_inputs = circuit_inputs.next_2(sig_chunks.w4); // in10 circuit_inputs = circuit_inputs.next_2(sig_chunks.w5); // in11 circuit_inputs = circuit_inputs.next_2(w_0.quotient.w0); // in12 circuit_inputs = circuit_inputs.next_2(w_0.quotient.w1); // in13 circuit_inputs = circuit_inputs.next_2(w_0.quotient.w2); // in14 circuit_inputs = circuit_inputs.next_2(w_0.quotient.w3); // in15 circuit_inputs = circuit_inputs.next_2(w_0.quotient.w4); // in16 circuit_inputs = circuit_inputs.next_2(w_0.quotient.w5); // in17 circuit_inputs = circuit_inputs.next_2(w_0.remainder.w0); // in18 circuit_inputs = circuit_inputs.next_2(w_0.remainder.w1); // in19 circuit_inputs = circuit_inputs.next_2(w_0.remainder.w2); // in20 circuit_inputs = circuit_inputs.next_2(w_0.remainder.w3); // in21 circuit_inputs = circuit_inputs.next_2(w_0.remainder.w4); // in22 circuit_inputs = circuit_inputs.next_2(w_0.remainder.w5); // in23 circuit_inputs = circuit_inputs.next_2(w_1.quotient.w0); // in24 circuit_inputs = circuit_inputs.next_2(w_1.quotient.w1); // in25 circuit_inputs = circuit_inputs.next_2(w_1.quotient.w2); // in26 circuit_inputs = circuit_inputs.next_2(w_1.quotient.w3); // in27 circuit_inputs = circuit_inputs.next_2(w_1.quotient.w4); // in28 circuit_inputs = circuit_inputs.next_2(w_1.quotient.w5); // in29 circuit_inputs = circuit_inputs.next_2(w_1.remainder.w0); // in30 circuit_inputs = circuit_inputs.next_2(w_1.remainder.w1); // in31 circuit_inputs = circuit_inputs.next_2(w_1.remainder.w2); // in32 circuit_inputs = circuit_inputs.next_2(w_1.remainder.w3); // in33 circuit_inputs = circuit_inputs.next_2(w_1.remainder.w4); // in34 circuit_inputs = circuit_inputs.next_2(w_1.remainder.w5); // in35 circuit_inputs = circuit_inputs.next_2(w_2.quotient.w0); // in36 circuit_inputs = circuit_inputs.next_2(w_2.quotient.w1); // in37 circuit_inputs = circuit_inputs.next_2(w_2.quotient.w2); // in38 circuit_inputs = circuit_inputs.next_2(w_2.quotient.w3); // in39 circuit_inputs = circuit_inputs.next_2(w_2.quotient.w4); // in40 circuit_inputs = circuit_inputs.next_2(w_2.quotient.w5); // in41 circuit_inputs = circuit_inputs.next_2(w_2.remainder.w0); // in42 circuit_inputs = circuit_inputs.next_2(w_2.remainder.w1); // in43 circuit_inputs = circuit_inputs.next_2(w_2.remainder.w2); // in44 circuit_inputs = circuit_inputs.next_2(w_2.remainder.w3); // in45 circuit_inputs = circuit_inputs.next_2(w_2.remainder.w4); // in46 circuit_inputs = circuit_inputs.next_2(w_2.remainder.w5); // in47 circuit_inputs = circuit_inputs.next_2(w_3.quotient.w0); // in48 circuit_inputs = circuit_inputs.next_2(w_3.quotient.w1); // in49 circuit_inputs = circuit_inputs.next_2(w_3.quotient.w2); // in50 circuit_inputs = circuit_inputs.next_2(w_3.quotient.w3); // in51 circuit_inputs = circuit_inputs.next_2(w_3.quotient.w4); // in52 circuit_inputs = circuit_inputs.next_2(w_3.quotient.w5); // in53 circuit_inputs = circuit_inputs.next_2(w_3.remainder.w0); // in54 circuit_inputs = circuit_inputs.next_2(w_3.remainder.w1); // in55 circuit_inputs = circuit_inputs.next_2(w_3.remainder.w2); // in56 circuit_inputs = circuit_inputs.next_2(w_3.remainder.w3); // in57 circuit_inputs = circuit_inputs.next_2(w_3.remainder.w4); // in58 circuit_inputs = circuit_inputs.next_2(w_3.remainder.w5); // in59 circuit_inputs = circuit_inputs.next_2(w_4.quotient.w0); // in60 circuit_inputs = circuit_inputs.next_2(w_4.quotient.w1); // in61 circuit_inputs = circuit_inputs.next_2(w_4.quotient.w2); // in62 circuit_inputs = circuit_inputs.next_2(w_4.quotient.w3); // in63 circuit_inputs = circuit_inputs.next_2(w_4.quotient.w4); // in64 circuit_inputs = circuit_inputs.next_2(w_4.quotient.w5); // in65 circuit_inputs = circuit_inputs.next_2(w_4.remainder.w0); // in66 circuit_inputs = circuit_inputs.next_2(w_4.remainder.w1); // in67 circuit_inputs = circuit_inputs.next_2(w_4.remainder.w2); // in68 circuit_inputs = circuit_inputs.next_2(w_4.remainder.w3); // in69 circuit_inputs = circuit_inputs.next_2(w_4.remainder.w4); // in70 circuit_inputs = circuit_inputs.next_2(w_4.remainder.w5); // in71 circuit_inputs = circuit_inputs.next_2(w_5.quotient.w0); // in72 circuit_inputs = circuit_inputs.next_2(w_5.quotient.w1); // in73 circuit_inputs = circuit_inputs.next_2(w_5.quotient.w2); // in74 circuit_inputs = circuit_inputs.next_2(w_5.quotient.w3); // in75 circuit_inputs = circuit_inputs.next_2(w_5.quotient.w4); // in76 circuit_inputs = circuit_inputs.next_2(w_5.quotient.w5); // in77 circuit_inputs = circuit_inputs.next_2(w_5.remainder.w0); // in78 circuit_inputs = circuit_inputs.next_2(w_5.remainder.w1); // in79 circuit_inputs = circuit_inputs.next_2(w_5.remainder.w2); // in80 circuit_inputs = circuit_inputs.next_2(w_5.remainder.w3); // in81 circuit_inputs = circuit_inputs.next_2(w_5.remainder.w4); // in82 circuit_inputs = circuit_inputs.next_2(w_5.remainder.w5); // in83 circuit_inputs = circuit_inputs.next_2(w_6.quotient.w0); // in84 circuit_inputs = circuit_inputs.next_2(w_6.quotient.w1); // in85 circuit_inputs = circuit_inputs.next_2(w_6.quotient.w2); // in86 circuit_inputs = circuit_inputs.next_2(w_6.quotient.w3); // in87 circuit_inputs = circuit_inputs.next_2(w_6.quotient.w4); // in88 circuit_inputs = circuit_inputs.next_2(w_6.quotient.w5); // in89 circuit_inputs = circuit_inputs.next_2(w_6.remainder.w0); // in90 circuit_inputs = circuit_inputs.next_2(w_6.remainder.w1); // in91 circuit_inputs = circuit_inputs.next_2(w_6.remainder.w2); // in92 circuit_inputs = circuit_inputs.next_2(w_6.remainder.w3); // in93 circuit_inputs = circuit_inputs.next_2(w_6.remainder.w4); // in94 circuit_inputs = circuit_inputs.next_2(w_6.remainder.w5); // in95 circuit_inputs = circuit_inputs.next_2(w_7.quotient.w0); // in96 circuit_inputs = circuit_inputs.next_2(w_7.quotient.w1); // in97 circuit_inputs = circuit_inputs.next_2(w_7.quotient.w2); // in98 circuit_inputs = circuit_inputs.next_2(w_7.quotient.w3); // in99 circuit_inputs = circuit_inputs.next_2(w_7.quotient.w4); // in100 circuit_inputs = circuit_inputs.next_2(w_7.quotient.w5); // in101 circuit_inputs = circuit_inputs.next_2(w_7.remainder.w0); // in102 circuit_inputs = circuit_inputs.next_2(w_7.remainder.w1); // in103 circuit_inputs = circuit_inputs.next_2(w_7.remainder.w2); // in104 circuit_inputs = circuit_inputs.next_2(w_7.remainder.w3); // in105 circuit_inputs = circuit_inputs.next_2(w_7.remainder.w4); // in106 circuit_inputs = circuit_inputs.next_2(w_7.remainder.w5); // in107 circuit_inputs = circuit_inputs.next_2(w_8.quotient.w0); // in108 circuit_inputs = circuit_inputs.next_2(w_8.quotient.w1); // in109 circuit_inputs = circuit_inputs.next_2(w_8.quotient.w2); // in110 circuit_inputs = circuit_inputs.next_2(w_8.quotient.w3); // in111 circuit_inputs = circuit_inputs.next_2(w_8.quotient.w4); // in112 circuit_inputs = circuit_inputs.next_2(w_8.quotient.w5); // in113 circuit_inputs = circuit_inputs.next_2(w_8.remainder.w0); // in114 circuit_inputs = circuit_inputs.next_2(w_8.remainder.w1); // in115 circuit_inputs = circuit_inputs.next_2(w_8.remainder.w2); // in116 circuit_inputs = circuit_inputs.next_2(w_8.remainder.w3); // in117 circuit_inputs = circuit_inputs.next_2(w_8.remainder.w4); // in118 circuit_inputs = circuit_inputs.next_2(w_8.remainder.w5); // in119 circuit_inputs = circuit_inputs.next_2(w_9.quotient.w0); // in120 circuit_inputs = circuit_inputs.next_2(w_9.quotient.w1); // in121 circuit_inputs = circuit_inputs.next_2(w_9.quotient.w2); // in122 circuit_inputs = circuit_inputs.next_2(w_9.quotient.w3); // in123 circuit_inputs = circuit_inputs.next_2(w_9.quotient.w4); // in124 circuit_inputs = circuit_inputs.next_2(w_9.quotient.w5); // in125 circuit_inputs = circuit_inputs.next_2(w_9.remainder.w0); // in126 circuit_inputs = circuit_inputs.next_2(w_9.remainder.w1); // in127 circuit_inputs = circuit_inputs.next_2(w_9.remainder.w2); // in128 circuit_inputs = circuit_inputs.next_2(w_9.remainder.w3); // in129 circuit_inputs = circuit_inputs.next_2(w_9.remainder.w4); // in130 circuit_inputs = circuit_inputs.next_2(w_9.remainder.w5); // in131 circuit_inputs = circuit_inputs.next_2(w_10.quotient.w0); // in132 circuit_inputs = circuit_inputs.next_2(w_10.quotient.w1); // in133 circuit_inputs = circuit_inputs.next_2(w_10.quotient.w2); // in134 circuit_inputs = circuit_inputs.next_2(w_10.quotient.w3); // in135 circuit_inputs = circuit_inputs.next_2(w_10.quotient.w4); // in136 circuit_inputs = circuit_inputs.next_2(w_10.quotient.w5); // in137 circuit_inputs = circuit_inputs.next_2(w_10.remainder.w0); // in138 circuit_inputs = circuit_inputs.next_2(w_10.remainder.w1); // in139 circuit_inputs = circuit_inputs.next_2(w_10.remainder.w2); // in140 circuit_inputs = circuit_inputs.next_2(w_10.remainder.w3); // in141 circuit_inputs = circuit_inputs.next_2(w_10.remainder.w4); // in142 circuit_inputs = circuit_inputs.next_2(w_10.remainder.w5); // in143 circuit_inputs = circuit_inputs.next_2(w_11.quotient.w0); // in144 circuit_inputs = circuit_inputs.next_2(w_11.quotient.w1); // in145 circuit_inputs = circuit_inputs.next_2(w_11.quotient.w2); // in146 circuit_inputs = circuit_inputs.next_2(w_11.quotient.w3); // in147 circuit_inputs = circuit_inputs.next_2(w_11.quotient.w4); // in148 circuit_inputs = circuit_inputs.next_2(w_11.quotient.w5); // in149 circuit_inputs = circuit_inputs.next_2(w_11.remainder.w0); // in150 circuit_inputs = circuit_inputs.next_2(w_11.remainder.w1); // in151 circuit_inputs = circuit_inputs.next_2(w_11.remainder.w2); // in152 circuit_inputs = circuit_inputs.next_2(w_11.remainder.w3); // in153 circuit_inputs = circuit_inputs.next_2(w_11.remainder.w4); // in154 circuit_inputs = circuit_inputs.next_2(w_11.remainder.w5); // in155 circuit_inputs = circuit_inputs.next_2(w_12.quotient.w0); // in156 circuit_inputs = circuit_inputs.next_2(w_12.quotient.w1); // in157 circuit_inputs = circuit_inputs.next_2(w_12.quotient.w2); // in158 circuit_inputs = circuit_inputs.next_2(w_12.quotient.w3); // in159 circuit_inputs = circuit_inputs.next_2(w_12.quotient.w4); // in160 circuit_inputs = circuit_inputs.next_2(w_12.quotient.w5); // in161 circuit_inputs = circuit_inputs.next_2(w_12.remainder.w0); // in162 circuit_inputs = circuit_inputs.next_2(w_12.remainder.w1); // in163 circuit_inputs = circuit_inputs.next_2(w_12.remainder.w2); // in164 circuit_inputs = circuit_inputs.next_2(w_12.remainder.w3); // in165 circuit_inputs = circuit_inputs.next_2(w_12.remainder.w4); // in166 circuit_inputs = circuit_inputs.next_2(w_12.remainder.w5); // in167 circuit_inputs = circuit_inputs.next_2(w_13.quotient.w0); // in168 circuit_inputs = circuit_inputs.next_2(w_13.quotient.w1); // in169 circuit_inputs = circuit_inputs.next_2(w_13.quotient.w2); // in170 circuit_inputs = circuit_inputs.next_2(w_13.quotient.w3); // in171 circuit_inputs = circuit_inputs.next_2(w_13.quotient.w4); // in172 circuit_inputs = circuit_inputs.next_2(w_13.quotient.w5); // in173 circuit_inputs = circuit_inputs.next_2(w_13.remainder.w0); // in174 circuit_inputs = circuit_inputs.next_2(w_13.remainder.w1); // in175 circuit_inputs = circuit_inputs.next_2(w_13.remainder.w2); // in176 circuit_inputs = circuit_inputs.next_2(w_13.remainder.w3); // in177 circuit_inputs = circuit_inputs.next_2(w_13.remainder.w4); // in178 circuit_inputs = circuit_inputs.next_2(w_13.remainder.w5); // in179 circuit_inputs = circuit_inputs.next_2(w_14.quotient.w0); // in180 circuit_inputs = circuit_inputs.next_2(w_14.quotient.w1); // in181 circuit_inputs = circuit_inputs.next_2(w_14.quotient.w2); // in182 circuit_inputs = circuit_inputs.next_2(w_14.quotient.w3); // in183 circuit_inputs = circuit_inputs.next_2(w_14.quotient.w4); // in184 circuit_inputs = circuit_inputs.next_2(w_14.quotient.w5); // in185 circuit_inputs = circuit_inputs.next_2(w_14.remainder.w0); // in186 circuit_inputs = circuit_inputs.next_2(w_14.remainder.w1); // in187 circuit_inputs = circuit_inputs.next_2(w_14.remainder.w2); // in188 circuit_inputs = circuit_inputs.next_2(w_14.remainder.w3); // in189 circuit_inputs = circuit_inputs.next_2(w_14.remainder.w4); // in190 circuit_inputs = circuit_inputs.next_2(w_14.remainder.w5); // in191 circuit_inputs = circuit_inputs.next_2(w_15.quotient.w0); // in192 circuit_inputs = circuit_inputs.next_2(w_15.quotient.w1); // in193 circuit_inputs = circuit_inputs.next_2(w_15.quotient.w2); // in194 circuit_inputs = circuit_inputs.next_2(w_15.quotient.w3); // in195 circuit_inputs = circuit_inputs.next_2(w_15.quotient.w4); // in196 circuit_inputs = circuit_inputs.next_2(w_15.quotient.w5); // in197 circuit_inputs = circuit_inputs.next_2(w_15.remainder.w0); // in198 circuit_inputs = circuit_inputs.next_2(w_15.remainder.w1); // in199 circuit_inputs = circuit_inputs.next_2(w_15.remainder.w2); // in200 circuit_inputs = circuit_inputs.next_2(w_15.remainder.w3); // in201 circuit_inputs = circuit_inputs.next_2(w_15.remainder.w4); // in202 circuit_inputs = circuit_inputs.next_2(w_15.remainder.w5); // in203 circuit_inputs = circuit_inputs.next_2(w_16.quotient.w0); // in204 circuit_inputs = circuit_inputs.next_2(w_16.quotient.w1); // in205 circuit_inputs = circuit_inputs.next_2(w_16.quotient.w2); // in206 circuit_inputs = circuit_inputs.next_2(w_16.quotient.w3); // in207 circuit_inputs = circuit_inputs.next_2(w_16.quotient.w4); // in208 circuit_inputs = circuit_inputs.next_2(w_16.quotient.w5); // in209 circuit_inputs = circuit_inputs.next_2(w_16.remainder.w0); // in210 circuit_inputs = circuit_inputs.next_2(w_16.remainder.w1); // in211 circuit_inputs = circuit_inputs.next_2(w_16.remainder.w2); // in212 circuit_inputs = circuit_inputs.next_2(w_16.remainder.w3); // in213 circuit_inputs = circuit_inputs.next_2(w_16.remainder.w4); // in214 circuit_inputs = circuit_inputs.next_2(w_16.remainder.w5); // in215 circuit_inputs = circuit_inputs.next_2(step); // in216 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let diff_0: u384 = outputs.get_output(t43); let diff_1: u384 = outputs.get_output(t67); let diff_2: u384 = outputs.get_output(t91); let diff_3: u384 = outputs.get_output(t115); let diff_4: u384 = outputs.get_output(t139); let diff_5: u384 = outputs.get_output(t163); let diff_6: u384 = outputs.get_output(t187); let diff_7: u384 = outputs.get_output(t211); let diff_8: u384 = outputs.get_output(t235); let diff_9: u384 = outputs.get_output(t259); let diff_10: u384 = outputs.get_output(t283); let diff_11: u384 = outputs.get_output(t307); let diff_12: u384 = outputs.get_output(t331); let diff_13: u384 = outputs.get_output(t355); let diff_14: u384 = outputs.get_output(t379); let diff_15: u384 = outputs.get_output(t403); let diff_16: u384 = outputs.get_output(t427); return ( diff_0, diff_1, diff_2, diff_3, diff_4, diff_5, diff_6, diff_7, diff_8, diff_9, diff_10, diff_11, diff_12, diff_13, diff_14, diff_15, diff_16, ); } ================================================ FILE: src/src/circuits/tower_circuits.cairo ================================================ use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::{E12T, G2Point}; #[inline(always)] pub fn run_BLS12_381_E12T_CYCLOTOMIC_SQUARE_circuit(M: E12T) -> (E12T,) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_add(in8, in9); let t1 = circuit_sub(in8, in9); let t2 = circuit_mul(t0, t1); let t3 = circuit_mul(in8, in9); let t4 = circuit_add(t3, t3); let t5 = circuit_add(in0, in1); let t6 = circuit_sub(in0, in1); let t7 = circuit_mul(t5, t6); let t8 = circuit_mul(in0, in1); let t9 = circuit_add(t8, t8); let t10 = circuit_add(in8, in0); // Fp2 add coeff 0/1 let t11 = circuit_add(in9, in1); // Fp2 add coeff 1/1 let t12 = circuit_add(t10, t11); let t13 = circuit_sub(t10, t11); let t14 = circuit_mul(t12, t13); let t15 = circuit_mul(t10, t11); let t16 = circuit_add(t15, t15); let t17 = circuit_sub(t14, t2); // Fp2 sub coeff 0/1 let t18 = circuit_sub(t16, t4); // Fp2 sub coeff 1/1 let t19 = circuit_sub(t17, t7); // Fp2 sub coeff 0/1 let t20 = circuit_sub(t18, t9); // Fp2 sub coeff 1/1 let t21 = circuit_add(in4, in5); let t22 = circuit_sub(in4, in5); let t23 = circuit_mul(t21, t22); let t24 = circuit_mul(in4, in5); let t25 = circuit_add(t24, t24); let t26 = circuit_add(in6, in7); let t27 = circuit_sub(in6, in7); let t28 = circuit_mul(t26, t27); let t29 = circuit_mul(in6, in7); let t30 = circuit_add(t29, t29); let t31 = circuit_add(in4, in6); // Fp2 add coeff 0/1 let t32 = circuit_add(in5, in7); // Fp2 add coeff 1/1 let t33 = circuit_add(t31, t32); let t34 = circuit_sub(t31, t32); let t35 = circuit_mul(t33, t34); let t36 = circuit_mul(t31, t32); let t37 = circuit_add(t36, t36); let t38 = circuit_sub(t35, t23); // Fp2 sub coeff 0/1 let t39 = circuit_sub(t37, t25); // Fp2 sub coeff 1/1 let t40 = circuit_sub(t38, t28); // Fp2 sub coeff 0/1 let t41 = circuit_sub(t39, t30); // Fp2 sub coeff 1/1 let t42 = circuit_add(in10, in11); let t43 = circuit_sub(in10, in11); let t44 = circuit_mul(t42, t43); let t45 = circuit_mul(in10, in11); let t46 = circuit_add(t45, t45); let t47 = circuit_add(in2, in3); let t48 = circuit_sub(in2, in3); let t49 = circuit_mul(t47, t48); let t50 = circuit_mul(in2, in3); let t51 = circuit_add(t50, t50); let t52 = circuit_add(in10, in2); // Fp2 add coeff 0/1 let t53 = circuit_add(in11, in3); // Fp2 add coeff 1/1 let t54 = circuit_add(t52, t53); let t55 = circuit_sub(t52, t53); let t56 = circuit_mul(t54, t55); let t57 = circuit_mul(t52, t53); let t58 = circuit_add(t57, t57); let t59 = circuit_sub(t56, t44); // Fp2 sub coeff 0/1 let t60 = circuit_sub(t58, t46); // Fp2 sub coeff 1/1 let t61 = circuit_sub(t59, t49); // Fp2 sub coeff 0/1 let t62 = circuit_sub(t60, t51); // Fp2 sub coeff 1/1 let t63 = circuit_add(t61, t62); let t64 = circuit_add(t63, t63); let t65 = circuit_sub(t61, t62); let t66 = circuit_sub(t64, t61); let t67 = circuit_sub(t66, t62); let t68 = circuit_add(t2, t4); let t69 = circuit_add(t68, t68); let t70 = circuit_sub(t2, t4); let t71 = circuit_sub(t69, t2); let t72 = circuit_sub(t71, t4); let t73 = circuit_add(t70, t7); // Fp2 add coeff 0/1 let t74 = circuit_add(t72, t9); // Fp2 add coeff 1/1 let t75 = circuit_add(t23, t25); let t76 = circuit_add(t75, t75); let t77 = circuit_sub(t23, t25); let t78 = circuit_sub(t76, t23); let t79 = circuit_sub(t78, t25); let t80 = circuit_add(t77, t28); // Fp2 add coeff 0/1 let t81 = circuit_add(t79, t30); // Fp2 add coeff 1/1 let t82 = circuit_add(t44, t46); let t83 = circuit_add(t82, t82); let t84 = circuit_sub(t44, t46); let t85 = circuit_sub(t83, t44); let t86 = circuit_sub(t85, t46); let t87 = circuit_add(t84, t49); // Fp2 add coeff 0/1 let t88 = circuit_add(t86, t51); // Fp2 add coeff 1/1 let t89 = circuit_sub(t73, in0); // Fp2 sub coeff 0/1 let t90 = circuit_sub(t74, in1); // Fp2 sub coeff 1/1 let t91 = circuit_add(t89, t89); // Fp2 add coeff 0/1 let t92 = circuit_add(t90, t90); // Fp2 add coeff 1/1 let t93 = circuit_add(t91, t73); // Fp2 add coeff 0/1 let t94 = circuit_add(t92, t74); // Fp2 add coeff 1/1 let t95 = circuit_sub(t80, in2); // Fp2 sub coeff 0/1 let t96 = circuit_sub(t81, in3); // Fp2 sub coeff 1/1 let t97 = circuit_add(t95, t95); // Fp2 add coeff 0/1 let t98 = circuit_add(t96, t96); // Fp2 add coeff 1/1 let t99 = circuit_add(t97, t80); // Fp2 add coeff 0/1 let t100 = circuit_add(t98, t81); // Fp2 add coeff 1/1 let t101 = circuit_sub(t87, in4); // Fp2 sub coeff 0/1 let t102 = circuit_sub(t88, in5); // Fp2 sub coeff 1/1 let t103 = circuit_add(t101, t101); // Fp2 add coeff 0/1 let t104 = circuit_add(t102, t102); // Fp2 add coeff 1/1 let t105 = circuit_add(t103, t87); // Fp2 add coeff 0/1 let t106 = circuit_add(t104, t88); // Fp2 add coeff 1/1 let t107 = circuit_add(t65, in6); // Fp2 add coeff 0/1 let t108 = circuit_add(t67, in7); // Fp2 add coeff 1/1 let t109 = circuit_add(t107, t107); // Fp2 add coeff 0/1 let t110 = circuit_add(t108, t108); // Fp2 add coeff 1/1 let t111 = circuit_add(t109, t65); // Fp2 add coeff 0/1 let t112 = circuit_add(t110, t67); // Fp2 add coeff 1/1 let t113 = circuit_add(t19, in8); // Fp2 add coeff 0/1 let t114 = circuit_add(t20, in9); // Fp2 add coeff 1/1 let t115 = circuit_add(t113, t113); // Fp2 add coeff 0/1 let t116 = circuit_add(t114, t114); // Fp2 add coeff 1/1 let t117 = circuit_add(t115, t19); // Fp2 add coeff 0/1 let t118 = circuit_add(t116, t20); // Fp2 add coeff 1/1 let t119 = circuit_add(t40, in10); // Fp2 add coeff 0/1 let t120 = circuit_add(t41, in11); // Fp2 add coeff 1/1 let t121 = circuit_add(t119, t119); // Fp2 add coeff 0/1 let t122 = circuit_add(t120, t120); // Fp2 add coeff 1/1 let t123 = circuit_add(t121, t40); // Fp2 add coeff 0/1 let t124 = circuit_add(t122, t41); // Fp2 add coeff 1/1 let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t93, t94, t99, t100, t105, t106, t111, t112, t117, t118, t123, t124) .new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(M.c0b0a0); // in0 circuit_inputs = circuit_inputs.next_2(M.c0b0a1); // in1 circuit_inputs = circuit_inputs.next_2(M.c0b1a0); // in2 circuit_inputs = circuit_inputs.next_2(M.c0b1a1); // in3 circuit_inputs = circuit_inputs.next_2(M.c0b2a0); // in4 circuit_inputs = circuit_inputs.next_2(M.c0b2a1); // in5 circuit_inputs = circuit_inputs.next_2(M.c1b0a0); // in6 circuit_inputs = circuit_inputs.next_2(M.c1b0a1); // in7 circuit_inputs = circuit_inputs.next_2(M.c1b1a0); // in8 circuit_inputs = circuit_inputs.next_2(M.c1b1a1); // in9 circuit_inputs = circuit_inputs.next_2(M.c1b2a0); // in10 circuit_inputs = circuit_inputs.next_2(M.c1b2a1); // in11 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t93), c0b0a1: outputs.get_output(t94), c0b1a0: outputs.get_output(t99), c0b1a1: outputs.get_output(t100), c0b2a0: outputs.get_output(t105), c0b2a1: outputs.get_output(t106), c1b0a0: outputs.get_output(t111), c1b0a1: outputs.get_output(t112), c1b1a0: outputs.get_output(t117), c1b1a1: outputs.get_output(t118), c1b2a0: outputs.get_output(t123), c1b2a1: outputs.get_output(t124), }; return (res,); } #[inline(always)] pub fn run_BLS12_381_E12T_CYCLO_SQUARE_COMPRESSED_circuit( xc0b1a0: u384, xc0b1a1: u384, xc0b2a0: u384, xc0b2a1: u384, xc1b0a0: u384, xc1b0a1: u384, xc1b2a0: u384, xc1b2a1: u384, ) -> (u384, u384, u384, u384, u384, u384, u384, u384) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7) = (CE::> {}, CE::> {}); let t0 = circuit_add(in0, in1); let t1 = circuit_sub(in0, in1); let t2 = circuit_mul(t0, t1); let t3 = circuit_mul(in0, in1); let t4 = circuit_add(t3, t3); let t5 = circuit_add(in6, in7); let t6 = circuit_sub(in6, in7); let t7 = circuit_mul(t5, t6); let t8 = circuit_mul(in6, in7); let t9 = circuit_add(t8, t8); let t10 = circuit_add(in0, in6); // Fp2 add coeff 0/1 let t11 = circuit_add(in1, in7); // Fp2 add coeff 1/1 let t12 = circuit_add(t10, t11); let t13 = circuit_sub(t10, t11); let t14 = circuit_mul(t12, t13); let t15 = circuit_mul(t10, t11); let t16 = circuit_add(t15, t15); let t17 = circuit_add(t2, t7); // Fp2 add coeff 0/1 let t18 = circuit_add(t4, t9); // Fp2 add coeff 1/1 let t19 = circuit_sub(t14, t17); // Fp2 sub coeff 0/1 let t20 = circuit_sub(t16, t18); // Fp2 sub coeff 1/1 let t21 = circuit_add(in4, in2); // Fp2 add coeff 0/1 let t22 = circuit_add(in5, in3); // Fp2 add coeff 1/1 let t23 = circuit_add(t21, t22); let t24 = circuit_sub(t21, t22); let t25 = circuit_mul(t23, t24); let t26 = circuit_mul(t21, t22); let t27 = circuit_add(t26, t26); let t28 = circuit_add(in4, in5); let t29 = circuit_sub(in4, in5); let t30 = circuit_mul(t28, t29); let t31 = circuit_mul(in4, in5); let t32 = circuit_add(t31, t31); let t33 = circuit_add(t19, t20); let t34 = circuit_add(t33, t33); let t35 = circuit_sub(t19, t20); let t36 = circuit_sub(t34, t19); let t37 = circuit_sub(t36, t20); let t38 = circuit_add(t35, in4); // Fp2 add coeff 0/1 let t39 = circuit_add(t37, in5); // Fp2 add coeff 1/1 let t40 = circuit_add(t38, t38); // Fp2 add coeff 0/1 let t41 = circuit_add(t39, t39); // Fp2 add coeff 1/1 let t42 = circuit_add(t40, t35); // Fp2 add coeff 0/1 let t43 = circuit_add(t41, t37); // Fp2 add coeff 1/1 let t44 = circuit_add(t7, t9); let t45 = circuit_add(t44, t44); let t46 = circuit_sub(t7, t9); let t47 = circuit_sub(t45, t7); let t48 = circuit_sub(t47, t9); let t49 = circuit_add(t2, t46); // Fp2 add coeff 0/1 let t50 = circuit_add(t4, t48); // Fp2 add coeff 1/1 let t51 = circuit_sub(t49, in2); // Fp2 sub coeff 0/1 let t52 = circuit_sub(t50, in3); // Fp2 sub coeff 1/1 let t53 = circuit_add(in2, in3); let t54 = circuit_sub(in2, in3); let t55 = circuit_mul(t53, t54); let t56 = circuit_mul(in2, in3); let t57 = circuit_add(t56, t56); let t58 = circuit_add(t51, t51); // Fp2 add coeff 0/1 let t59 = circuit_add(t52, t52); // Fp2 add coeff 1/1 let t60 = circuit_add(t58, t49); // Fp2 add coeff 0/1 let t61 = circuit_add(t59, t50); // Fp2 add coeff 1/1 let t62 = circuit_add(t55, t57); let t63 = circuit_add(t62, t62); let t64 = circuit_sub(t55, t57); let t65 = circuit_sub(t63, t55); let t66 = circuit_sub(t65, t57); let t67 = circuit_add(t30, t64); // Fp2 add coeff 0/1 let t68 = circuit_add(t32, t66); // Fp2 add coeff 1/1 let t69 = circuit_sub(t67, in0); // Fp2 sub coeff 0/1 let t70 = circuit_sub(t68, in1); // Fp2 sub coeff 1/1 let t71 = circuit_add(t69, t69); // Fp2 add coeff 0/1 let t72 = circuit_add(t70, t70); // Fp2 add coeff 1/1 let t73 = circuit_add(t71, t67); // Fp2 add coeff 0/1 let t74 = circuit_add(t72, t68); // Fp2 add coeff 1/1 let t75 = circuit_add(t30, t55); // Fp2 add coeff 0/1 let t76 = circuit_add(t32, t57); // Fp2 add coeff 1/1 let t77 = circuit_sub(t25, t75); // Fp2 sub coeff 0/1 let t78 = circuit_sub(t27, t76); // Fp2 sub coeff 1/1 let t79 = circuit_add(t77, in6); // Fp2 add coeff 0/1 let t80 = circuit_add(t78, in7); // Fp2 add coeff 1/1 let t81 = circuit_add(t79, t79); // Fp2 add coeff 0/1 let t82 = circuit_add(t80, t80); // Fp2 add coeff 1/1 let t83 = circuit_add(t77, t81); // Fp2 add coeff 0/1 let t84 = circuit_add(t78, t82); // Fp2 add coeff 1/1 let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t73, t74, t60, t61, t42, t43, t83, t84).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(xc0b1a0); // in0 circuit_inputs = circuit_inputs.next_2(xc0b1a1); // in1 circuit_inputs = circuit_inputs.next_2(xc0b2a0); // in2 circuit_inputs = circuit_inputs.next_2(xc0b2a1); // in3 circuit_inputs = circuit_inputs.next_2(xc1b0a0); // in4 circuit_inputs = circuit_inputs.next_2(xc1b0a1); // in5 circuit_inputs = circuit_inputs.next_2(xc1b2a0); // in6 circuit_inputs = circuit_inputs.next_2(xc1b2a1); // in7 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let xc0b1a0: u384 = outputs.get_output(t73); let xc0b1a1: u384 = outputs.get_output(t74); let xc0b2a0: u384 = outputs.get_output(t60); let xc0b2a1: u384 = outputs.get_output(t61); let xc1b0a0: u384 = outputs.get_output(t42); let xc1b0a1: u384 = outputs.get_output(t43); let xc1b2a0: u384 = outputs.get_output(t83); let xc1b2a1: u384 = outputs.get_output(t84); return (xc0b1a0, xc0b1a1, xc0b2a0, xc0b2a1, xc1b0a0, xc1b0a1, xc1b2a0, xc1b2a1); } #[inline(always)] pub fn run_BLS12_381_E12T_DECOMP_KARABINA_II_circuit( t0a0: u384, t0a1: u384, t1a0: u384, t1a1: u384, xc0b1a0: u384, xc0b1a1: u384, xc0b2a0: u384, xc0b2a1: u384, xc1b0a0: u384, xc1b0a1: u384, xc1b2a0: u384, xc1b2a1: u384, ) -> (u384, u384, u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x1 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_mul(in4, in4); // Fp2 Inv start let t1 = circuit_mul(in5, in5); let t2 = circuit_add(t0, t1); let t3 = circuit_inverse(t2); let t4 = circuit_mul(in4, t3); // Fp2 Inv real part end let t5 = circuit_mul(in5, t3); let t6 = circuit_sub(in0, t5); // Fp2 Inv imag part end let t7 = circuit_mul(in2, t4); // Fp2 mul start let t8 = circuit_mul(in3, t6); let t9 = circuit_sub(t7, t8); // Fp2 mul real part end let t10 = circuit_mul(in2, t6); let t11 = circuit_mul(in3, t4); let t12 = circuit_add(t10, t11); // Fp2 mul imag part end let t13 = circuit_mul(in8, in6); // Fp2 mul start let t14 = circuit_mul(in9, in7); let t15 = circuit_sub(t13, t14); // Fp2 mul real part end let t16 = circuit_mul(in8, in7); let t17 = circuit_mul(in9, in6); let t18 = circuit_add(t16, t17); // Fp2 mul imag part end let t19 = circuit_add(t9, t12); let t20 = circuit_sub(t9, t12); let t21 = circuit_mul(t19, t20); let t22 = circuit_mul(t9, t12); let t23 = circuit_add(t22, t22); let t24 = circuit_sub(t21, t15); // Fp2 sub coeff 0/1 let t25 = circuit_sub(t23, t18); // Fp2 sub coeff 1/1 let t26 = circuit_add(t24, t24); // Fp2 add coeff 0/1 let t27 = circuit_add(t25, t25); // Fp2 add coeff 1/1 let t28 = circuit_sub(t26, t15); // Fp2 sub coeff 0/1 let t29 = circuit_sub(t27, t18); // Fp2 sub coeff 1/1 let t30 = circuit_mul(in10, in12); // Fp2 mul start let t31 = circuit_mul(in11, in13); let t32 = circuit_sub(t30, t31); // Fp2 mul real part end let t33 = circuit_mul(in10, in13); let t34 = circuit_mul(in11, in12); let t35 = circuit_add(t33, t34); // Fp2 mul imag part end let t36 = circuit_add(t28, t32); // Fp2 add coeff 0/1 let t37 = circuit_add(t29, t35); // Fp2 add coeff 1/1 let t38 = circuit_add(t36, t37); let t39 = circuit_add(t38, t38); let t40 = circuit_sub(t36, t37); let t41 = circuit_sub(t39, t36); let t42 = circuit_sub(t41, t37); let t43 = circuit_add(t40, in1); let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t43, t42, t9, t12).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(t0a0); // in2 circuit_inputs = circuit_inputs.next_2(t0a1); // in3 circuit_inputs = circuit_inputs.next_2(t1a0); // in4 circuit_inputs = circuit_inputs.next_2(t1a1); // in5 circuit_inputs = circuit_inputs.next_2(xc0b1a0); // in6 circuit_inputs = circuit_inputs.next_2(xc0b1a1); // in7 circuit_inputs = circuit_inputs.next_2(xc0b2a0); // in8 circuit_inputs = circuit_inputs.next_2(xc0b2a1); // in9 circuit_inputs = circuit_inputs.next_2(xc1b0a0); // in10 circuit_inputs = circuit_inputs.next_2(xc1b0a1); // in11 circuit_inputs = circuit_inputs.next_2(xc1b2a0); // in12 circuit_inputs = circuit_inputs.next_2(xc1b2a1); // in13 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let zc0b0a0: u384 = outputs.get_output(t43); let zc0b0a1: u384 = outputs.get_output(t42); let zc1b1a0: u384 = outputs.get_output(t9); let zc1b1a1: u384 = outputs.get_output(t12); return (zc0b0a0, zc0b0a1, zc1b1a0, zc1b1a1); } #[inline(always)] pub fn run_BLS12_381_E12T_DECOMP_KARABINA_I_NZ_circuit( xc0b1a0: u384, xc0b1a1: u384, xc0b2a0: u384, xc0b2a1: u384, xc1b0a0: u384, xc1b0a1: u384, xc1b2a0: u384, xc1b2a1: u384, ) -> (u384, u384, u384, u384) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7) = (CE::> {}, CE::> {}); let t0 = circuit_add(in0, in1); let t1 = circuit_sub(in0, in1); let t2 = circuit_mul(t0, t1); let t3 = circuit_mul(in0, in1); let t4 = circuit_add(t3, t3); let t5 = circuit_sub(t2, in2); // Fp2 sub coeff 0/1 let t6 = circuit_sub(t4, in3); // Fp2 sub coeff 1/1 let t7 = circuit_add(t5, t5); // Fp2 add coeff 0/1 let t8 = circuit_add(t6, t6); // Fp2 add coeff 1/1 let t9 = circuit_add(t7, t2); // Fp2 add coeff 0/1 let t10 = circuit_add(t8, t4); // Fp2 add coeff 1/1 let t11 = circuit_add(in6, in7); let t12 = circuit_sub(in6, in7); let t13 = circuit_mul(t11, t12); let t14 = circuit_mul(in6, in7); let t15 = circuit_add(t14, t14); let t16 = circuit_add(t13, t15); let t17 = circuit_add(t16, t16); let t18 = circuit_sub(t13, t15); let t19 = circuit_sub(t17, t13); let t20 = circuit_sub(t19, t15); let t21 = circuit_add(t18, t9); // Fp2 add coeff 0/1 let t22 = circuit_add(t20, t10); // Fp2 add coeff 1/1 let t23 = circuit_add(in4, in4); // Fp2 add coeff 0/1 let t24 = circuit_add(in5, in5); // Fp2 add coeff 1/1 let t25 = circuit_add(t23, t23); // Fp2 add coeff 0/1 let t26 = circuit_add(t24, t24); // Fp2 add coeff 1/1 let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t21, t22, t25, t26).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(xc0b1a0); // in0 circuit_inputs = circuit_inputs.next_2(xc0b1a1); // in1 circuit_inputs = circuit_inputs.next_2(xc0b2a0); // in2 circuit_inputs = circuit_inputs.next_2(xc0b2a1); // in3 circuit_inputs = circuit_inputs.next_2(xc1b0a0); // in4 circuit_inputs = circuit_inputs.next_2(xc1b0a1); // in5 circuit_inputs = circuit_inputs.next_2(xc1b2a0); // in6 circuit_inputs = circuit_inputs.next_2(xc1b2a1); // in7 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let t0a0: u384 = outputs.get_output(t21); let t0a1: u384 = outputs.get_output(t22); let t1a0: u384 = outputs.get_output(t25); let t1a1: u384 = outputs.get_output(t26); return (t0a0, t0a1, t1a0, t1a1); } #[inline(always)] pub fn run_BLS12_381_E12T_DECOMP_KARABINA_I_Z_circuit( xc0b1a0: u384, xc0b1a1: u384, xc1b2a0: u384, xc1b2a1: u384, ) -> (u384, u384) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let in3 = CE::> {}; let t0 = circuit_mul(in0, in2); // Fp2 mul start let t1 = circuit_mul(in1, in3); let t2 = circuit_sub(t0, t1); // Fp2 mul real part end let t3 = circuit_mul(in0, in3); let t4 = circuit_mul(in1, in2); let t5 = circuit_add(t3, t4); // Fp2 mul imag part end let t6 = circuit_add(t2, t2); // Fp2 add coeff 0/1 let t7 = circuit_add(t5, t5); // Fp2 add coeff 1/1 let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t6, t7).new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(xc0b1a0); // in0 circuit_inputs = circuit_inputs.next_2(xc0b1a1); // in1 circuit_inputs = circuit_inputs.next_2(xc1b2a0); // in2 circuit_inputs = circuit_inputs.next_2(xc1b2a1); // in3 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res0: u384 = outputs.get_output(t6); let res1: u384 = outputs.get_output(t7); return (res0, res1); } #[inline(always)] pub fn run_BLS12_381_E12T_FROBENIUS_CUBE_circuit(M: E12T) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x1 let in2 = CE::> {}; // -0x1 % p let in3 = CE::< CI<3>, > {}; // 0x135203e60180a68ee2e9c448d77a2cd91c3dedd930b1cf60ef396489f61eb45e304466cf3e67fa0af1ee7b04121bdea2 let in4 = CE::< CI<4>, > {}; // 0x6af0e0437ff400b6831e36d6bd17ffe48395dabc2d3435e77f76e17009241c5ee67992f72ec05f4c81084fbede3cc09 // INPUT stack let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_sub(in0, in6); let t1 = circuit_add(in5, in0); let t2 = circuit_sub(in0, in8); let t3 = circuit_sub(in0, in10); let t4 = circuit_sub(in0, in12); let t5 = circuit_sub(in0, in14); let t6 = circuit_sub(in0, in16); let t7 = circuit_mul(in0, in7); // Fp2 mul start let t8 = circuit_mul(in1, t2); let t9 = circuit_sub(t7, t8); // Fp2 mul real part end let t10 = circuit_mul(in0, t2); let t11 = circuit_mul(in1, in7); let t12 = circuit_add(t10, t11); // Fp2 mul imag part end let t13 = circuit_mul(in2, in9); let t14 = circuit_mul(in2, t3); let t15 = circuit_mul(in3, in11); // Fp2 mul start let t16 = circuit_mul(in4, t4); let t17 = circuit_sub(t15, t16); // Fp2 mul real part end let t18 = circuit_mul(in3, t4); let t19 = circuit_mul(in4, in11); let t20 = circuit_add(t18, t19); // Fp2 mul imag part end let t21 = circuit_mul(in3, in13); // Fp2 mul start let t22 = circuit_mul(in3, t5); let t23 = circuit_sub(t21, t22); // Fp2 mul real part end let t24 = circuit_mul(in3, t5); let t25 = circuit_mul(in3, in13); let t26 = circuit_add(t24, t25); // Fp2 mul imag part end let t27 = circuit_mul(in4, in15); // Fp2 mul start let t28 = circuit_mul(in3, t6); let t29 = circuit_sub(t27, t28); // Fp2 mul real part end let t30 = circuit_mul(in4, t6); let t31 = circuit_mul(in3, in15); let t32 = circuit_add(t30, t31); // Fp2 mul imag part end let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t1, t0, t9, t12, t13, t14, t17, t20, t23, t26, t29, t32).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs .next_2( [ 0xb153ffffb9feffffffffaaaa, 0x6730d2a0f6b0f6241eabfffe, 0x434bacd764774b84f38512bf, 0x1a0111ea397fe69a4b1ba7b6, ], ); // in2 circuit_inputs = circuit_inputs .next_2( [ 0x3e67fa0af1ee7b04121bdea2, 0xef396489f61eb45e304466cf, 0xd77a2cd91c3dedd930b1cf60, 0x135203e60180a68ee2e9c448, ], ); // in3 circuit_inputs = circuit_inputs .next_2( [ 0x72ec05f4c81084fbede3cc09, 0x77f76e17009241c5ee67992f, 0x6bd17ffe48395dabc2d3435e, 0x6af0e0437ff400b6831e36d, ], ); // in4 // Fill inputs: circuit_inputs = circuit_inputs.next_2(M.c0b0a0); // in5 circuit_inputs = circuit_inputs.next_2(M.c0b0a1); // in6 circuit_inputs = circuit_inputs.next_2(M.c0b1a0); // in7 circuit_inputs = circuit_inputs.next_2(M.c0b1a1); // in8 circuit_inputs = circuit_inputs.next_2(M.c0b2a0); // in9 circuit_inputs = circuit_inputs.next_2(M.c0b2a1); // in10 circuit_inputs = circuit_inputs.next_2(M.c1b0a0); // in11 circuit_inputs = circuit_inputs.next_2(M.c1b0a1); // in12 circuit_inputs = circuit_inputs.next_2(M.c1b1a0); // in13 circuit_inputs = circuit_inputs.next_2(M.c1b1a1); // in14 circuit_inputs = circuit_inputs.next_2(M.c1b2a0); // in15 circuit_inputs = circuit_inputs.next_2(M.c1b2a1); // in16 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t1), c0b0a1: outputs.get_output(t0), c0b1a0: outputs.get_output(t9), c0b1a1: outputs.get_output(t12), c0b2a0: outputs.get_output(t13), c0b2a1: outputs.get_output(t14), c1b0a0: outputs.get_output(t17), c1b0a1: outputs.get_output(t20), c1b1a0: outputs.get_output(t23), c1b1a1: outputs.get_output(t26), c1b2a0: outputs.get_output(t29), c1b2a1: outputs.get_output(t32), }; return (res,); } #[inline(always)] pub fn run_BLS12_381_E12T_FROBENIUS_SQUARE_circuit(M: E12T) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::< CI<1>, > {}; // 0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffefffe let in2 = CE::< CI<2>, > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac let in3 = CE::< CI<3>, > {}; // 0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffeffff let in4 = CE::> {}; // -0x1 % p let in5 = CE::< CI<5>, > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaad // INPUT stack let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_add(in6, in0); let t1 = circuit_add(in7, in0); let t2 = circuit_mul(in1, in8); let t3 = circuit_mul(in1, in9); let t4 = circuit_mul(in2, in10); let t5 = circuit_mul(in2, in11); let t6 = circuit_mul(in3, in12); let t7 = circuit_mul(in3, in13); let t8 = circuit_mul(in4, in14); let t9 = circuit_mul(in4, in15); let t10 = circuit_mul(in5, in16); let t11 = circuit_mul(in5, in17); let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs .next_2( [ 0x620a00022e01fffffffefffe, 0xddb3a93be6f89688de17d813, 0xdf76ce51ba69c6076a0f77ea, 0x5f19672f, ], ); // in1 circuit_inputs = circuit_inputs .next_2( [ 0x4f49fffd8bfd00000000aaac, 0x897d29650fb85f9b409427eb, 0x63d4de85aa0d857d89759ad4, 0x1a0111ea397fe699ec024086, ], ); // in2 circuit_inputs = circuit_inputs .next_2( [ 0x620a00022e01fffffffeffff, 0xddb3a93be6f89688de17d813, 0xdf76ce51ba69c6076a0f77ea, 0x5f19672f, ], ); // in3 circuit_inputs = circuit_inputs .next_2( [ 0xb153ffffb9feffffffffaaaa, 0x6730d2a0f6b0f6241eabfffe, 0x434bacd764774b84f38512bf, 0x1a0111ea397fe69a4b1ba7b6, ], ); // in4 circuit_inputs = circuit_inputs .next_2( [ 0x4f49fffd8bfd00000000aaad, 0x897d29650fb85f9b409427eb, 0x63d4de85aa0d857d89759ad4, 0x1a0111ea397fe699ec024086, ], ); // in5 // Fill inputs: circuit_inputs = circuit_inputs.next_2(M.c0b0a0); // in6 circuit_inputs = circuit_inputs.next_2(M.c0b0a1); // in7 circuit_inputs = circuit_inputs.next_2(M.c0b1a0); // in8 circuit_inputs = circuit_inputs.next_2(M.c0b1a1); // in9 circuit_inputs = circuit_inputs.next_2(M.c0b2a0); // in10 circuit_inputs = circuit_inputs.next_2(M.c0b2a1); // in11 circuit_inputs = circuit_inputs.next_2(M.c1b0a0); // in12 circuit_inputs = circuit_inputs.next_2(M.c1b0a1); // in13 circuit_inputs = circuit_inputs.next_2(M.c1b1a0); // in14 circuit_inputs = circuit_inputs.next_2(M.c1b1a1); // in15 circuit_inputs = circuit_inputs.next_2(M.c1b2a0); // in16 circuit_inputs = circuit_inputs.next_2(M.c1b2a1); // in17 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t0), c0b0a1: outputs.get_output(t1), c0b1a0: outputs.get_output(t2), c0b1a1: outputs.get_output(t3), c0b2a0: outputs.get_output(t4), c0b2a1: outputs.get_output(t5), c1b0a0: outputs.get_output(t6), c1b0a1: outputs.get_output(t7), c1b1a0: outputs.get_output(t8), c1b1a1: outputs.get_output(t9), c1b2a0: outputs.get_output(t10), c1b2a1: outputs.get_output(t11), }; return (res,); } #[inline(always)] pub fn run_BLS12_381_E12T_FROBENIUS_circuit(M: E12T) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::< CI<1>, > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac let in2 = CE::< CI<2>, > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaad let in3 = CE::< CI<3>, > {}; // 0x1904d3bf02bb0667c231beb4202c0d1f0fd603fd3cbd5f4f7b2443d784bab9c4f67ea53d63e7813d8d0775ed92235fb8 let in4 = CE::< CI<4>, > {}; // 0xfc3e2b36c4e03288e9e902231f9fb854a14787b6c7b36fec0c8ec971f63c5f282d5ac14d6c7ec22cf78a126ddc4af3 let in5 = CE::< CI<5>, > {}; // 0x6af0e0437ff400b6831e36d6bd17ffe48395dabc2d3435e77f76e17009241c5ee67992f72ec05f4c81084fbede3cc09 let in6 = CE::< CI<6>, > {}; // 0x5b2cfd9013a5fd8df47fa6b48b1e045f39816240c0b8fee8beadf4d8e9c0566c63a3e6e257f87329b18fae980078116 let in7 = CE::< CI<7>, > {}; // 0x144e4211384586c16bd3ad4afa99cc9170df3560e77982d0db45f3536814f0bd5871c1908bd478cd1ee605167ff82995 // INPUT stack let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_sub(in0, in9); let t1 = circuit_add(in8, in0); let t2 = circuit_sub(in0, in11); let t3 = circuit_sub(in0, in13); let t4 = circuit_sub(in0, in15); let t5 = circuit_sub(in0, in17); let t6 = circuit_sub(in0, in19); let t7 = circuit_mul(in0, in10); // Fp2 mul start let t8 = circuit_mul(in1, t2); let t9 = circuit_sub(t7, t8); // Fp2 mul real part end let t10 = circuit_mul(in0, t2); let t11 = circuit_mul(in1, in10); let t12 = circuit_add(t10, t11); // Fp2 mul imag part end let t13 = circuit_mul(in2, in12); let t14 = circuit_mul(in2, t3); let t15 = circuit_mul(in3, in14); // Fp2 mul start let t16 = circuit_mul(in4, t4); let t17 = circuit_sub(t15, t16); // Fp2 mul real part end let t18 = circuit_mul(in3, t4); let t19 = circuit_mul(in4, in14); let t20 = circuit_add(t18, t19); // Fp2 mul imag part end let t21 = circuit_mul(in5, in16); // Fp2 mul start let t22 = circuit_mul(in5, t5); let t23 = circuit_sub(t21, t22); // Fp2 mul real part end let t24 = circuit_mul(in5, t5); let t25 = circuit_mul(in5, in16); let t26 = circuit_add(t24, t25); // Fp2 mul imag part end let t27 = circuit_mul(in6, in18); // Fp2 mul start let t28 = circuit_mul(in7, t6); let t29 = circuit_sub(t27, t28); // Fp2 mul real part end let t30 = circuit_mul(in6, t6); let t31 = circuit_mul(in7, in18); let t32 = circuit_add(t30, t31); // Fp2 mul imag part end let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = (t1, t0, t9, t12, t13, t14, t17, t20, t23, t26, t29, t32).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(E12T_FROBENIUS_BLS12_381_CONSTANTS.span()); // in0 - in7 // Fill inputs: circuit_inputs = circuit_inputs.next_2(M.c0b0a0); // in8 circuit_inputs = circuit_inputs.next_2(M.c0b0a1); // in9 circuit_inputs = circuit_inputs.next_2(M.c0b1a0); // in10 circuit_inputs = circuit_inputs.next_2(M.c0b1a1); // in11 circuit_inputs = circuit_inputs.next_2(M.c0b2a0); // in12 circuit_inputs = circuit_inputs.next_2(M.c0b2a1); // in13 circuit_inputs = circuit_inputs.next_2(M.c1b0a0); // in14 circuit_inputs = circuit_inputs.next_2(M.c1b0a1); // in15 circuit_inputs = circuit_inputs.next_2(M.c1b1a0); // in16 circuit_inputs = circuit_inputs.next_2(M.c1b1a1); // in17 circuit_inputs = circuit_inputs.next_2(M.c1b2a0); // in18 circuit_inputs = circuit_inputs.next_2(M.c1b2a1); // in19 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t1), c0b0a1: outputs.get_output(t0), c0b1a0: outputs.get_output(t9), c0b1a1: outputs.get_output(t12), c0b2a0: outputs.get_output(t13), c0b2a1: outputs.get_output(t14), c1b0a0: outputs.get_output(t17), c1b0a1: outputs.get_output(t20), c1b1a0: outputs.get_output(t23), c1b1a1: outputs.get_output(t26), c1b2a0: outputs.get_output(t29), c1b2a1: outputs.get_output(t32), }; return (res,); } const E12T_FROBENIUS_BLS12_381_CONSTANTS: [u384; 8] = [ u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x4f49fffd8bfd00000000aaac, limb1: 0x897d29650fb85f9b409427eb, limb2: 0x63d4de85aa0d857d89759ad4, limb3: 0x1a0111ea397fe699ec024086, }, u384 { limb0: 0x4f49fffd8bfd00000000aaad, limb1: 0x897d29650fb85f9b409427eb, limb2: 0x63d4de85aa0d857d89759ad4, limb3: 0x1a0111ea397fe699ec024086, }, u384 { limb0: 0x63e7813d8d0775ed92235fb8, limb1: 0x7b2443d784bab9c4f67ea53d, limb2: 0x202c0d1f0fd603fd3cbd5f4f, limb3: 0x1904d3bf02bb0667c231beb4, }, u384 { limb0: 0x4d6c7ec22cf78a126ddc4af3, limb1: 0xec0c8ec971f63c5f282d5ac1, limb2: 0x231f9fb854a14787b6c7b36f, limb3: 0xfc3e2b36c4e03288e9e902, }, u384 { limb0: 0x72ec05f4c81084fbede3cc09, limb1: 0x77f76e17009241c5ee67992f, limb2: 0x6bd17ffe48395dabc2d3435e, limb3: 0x6af0e0437ff400b6831e36d, }, u384 { limb0: 0x257f87329b18fae980078116, limb1: 0x8beadf4d8e9c0566c63a3e6e, limb2: 0x48b1e045f39816240c0b8fee, limb3: 0x5b2cfd9013a5fd8df47fa6b, }, u384 { limb0: 0x8bd478cd1ee605167ff82995, limb1: 0xdb45f3536814f0bd5871c190, limb2: 0xfa99cc9170df3560e77982d0, limb3: 0x144e4211384586c16bd3ad4a, }, ]; #[inline(always)] pub fn run_BLS12_381_E12T_INVERSE_circuit(M: E12T) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8, in9) = (CE::> {}, CE::> {}, CE::> {}); let (in10, in11, in12) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_mul(in1, in3); // Fp2 mul start let t1 = circuit_mul(in2, in4); let t2 = circuit_sub(t0, t1); // Fp2 mul real part end let t3 = circuit_mul(in1, in4); let t4 = circuit_mul(in2, in3); let t5 = circuit_add(t3, t4); // Fp2 mul imag part end let t6 = circuit_add(t2, t2); // Fp2 add coeff 0/1 let t7 = circuit_add(t5, t5); // Fp2 add coeff 1/1 let t8 = circuit_add(in5, in6); let t9 = circuit_sub(in5, in6); let t10 = circuit_mul(t8, t9); let t11 = circuit_mul(in5, in6); let t12 = circuit_add(t11, t11); let t13 = circuit_add(t10, t12); let t14 = circuit_add(t13, t13); let t15 = circuit_sub(t10, t12); let t16 = circuit_sub(t14, t10); let t17 = circuit_sub(t16, t12); let t18 = circuit_add(t15, t6); // Fp2 add coeff 0/1 let t19 = circuit_add(t17, t7); // Fp2 add coeff 1/1 let t20 = circuit_sub(t6, t10); // Fp2 sub coeff 0/1 let t21 = circuit_sub(t7, t12); // Fp2 sub coeff 1/1 let t22 = circuit_add(in1, in2); let t23 = circuit_sub(in1, in2); let t24 = circuit_mul(t22, t23); let t25 = circuit_mul(in1, in2); let t26 = circuit_add(t25, t25); let t27 = circuit_sub(in1, in3); // Fp2 sub coeff 0/1 let t28 = circuit_sub(in2, in4); // Fp2 sub coeff 1/1 let t29 = circuit_add(t27, in5); // Fp2 add coeff 0/1 let t30 = circuit_add(t28, in6); // Fp2 add coeff 1/1 let t31 = circuit_mul(in3, in5); // Fp2 mul start let t32 = circuit_mul(in4, in6); let t33 = circuit_sub(t31, t32); // Fp2 mul real part end let t34 = circuit_mul(in3, in6); let t35 = circuit_mul(in4, in5); let t36 = circuit_add(t34, t35); // Fp2 mul imag part end let t37 = circuit_add(t33, t33); // Fp2 add coeff 0/1 let t38 = circuit_add(t36, t36); // Fp2 add coeff 1/1 let t39 = circuit_add(t29, t30); let t40 = circuit_sub(t29, t30); let t41 = circuit_mul(t39, t40); let t42 = circuit_mul(t29, t30); let t43 = circuit_add(t42, t42); let t44 = circuit_add(t37, t38); let t45 = circuit_add(t44, t44); let t46 = circuit_sub(t37, t38); let t47 = circuit_sub(t45, t37); let t48 = circuit_sub(t47, t38); let t49 = circuit_add(t46, t24); // Fp2 add coeff 0/1 let t50 = circuit_add(t48, t26); // Fp2 add coeff 1/1 let t51 = circuit_add(t20, t41); // Fp2 add coeff 0/1 let t52 = circuit_add(t21, t43); // Fp2 add coeff 1/1 let t53 = circuit_add(t51, t37); // Fp2 add coeff 0/1 let t54 = circuit_add(t52, t38); // Fp2 add coeff 1/1 let t55 = circuit_sub(t53, t24); // Fp2 sub coeff 0/1 let t56 = circuit_sub(t54, t26); // Fp2 sub coeff 1/1 let t57 = circuit_mul(in7, in9); // Fp2 mul start let t58 = circuit_mul(in8, in10); let t59 = circuit_sub(t57, t58); // Fp2 mul real part end let t60 = circuit_mul(in7, in10); let t61 = circuit_mul(in8, in9); let t62 = circuit_add(t60, t61); // Fp2 mul imag part end let t63 = circuit_add(t59, t59); // Fp2 add coeff 0/1 let t64 = circuit_add(t62, t62); // Fp2 add coeff 1/1 let t65 = circuit_add(in11, in12); let t66 = circuit_sub(in11, in12); let t67 = circuit_mul(t65, t66); let t68 = circuit_mul(in11, in12); let t69 = circuit_add(t68, t68); let t70 = circuit_add(t67, t69); let t71 = circuit_add(t70, t70); let t72 = circuit_sub(t67, t69); let t73 = circuit_sub(t71, t67); let t74 = circuit_sub(t73, t69); let t75 = circuit_add(t72, t63); // Fp2 add coeff 0/1 let t76 = circuit_add(t74, t64); // Fp2 add coeff 1/1 let t77 = circuit_sub(t63, t67); // Fp2 sub coeff 0/1 let t78 = circuit_sub(t64, t69); // Fp2 sub coeff 1/1 let t79 = circuit_add(in7, in8); let t80 = circuit_sub(in7, in8); let t81 = circuit_mul(t79, t80); let t82 = circuit_mul(in7, in8); let t83 = circuit_add(t82, t82); let t84 = circuit_sub(in7, in9); // Fp2 sub coeff 0/1 let t85 = circuit_sub(in8, in10); // Fp2 sub coeff 1/1 let t86 = circuit_add(t84, in11); // Fp2 add coeff 0/1 let t87 = circuit_add(t85, in12); // Fp2 add coeff 1/1 let t88 = circuit_mul(in9, in11); // Fp2 mul start let t89 = circuit_mul(in10, in12); let t90 = circuit_sub(t88, t89); // Fp2 mul real part end let t91 = circuit_mul(in9, in12); let t92 = circuit_mul(in10, in11); let t93 = circuit_add(t91, t92); // Fp2 mul imag part end let t94 = circuit_add(t90, t90); // Fp2 add coeff 0/1 let t95 = circuit_add(t93, t93); // Fp2 add coeff 1/1 let t96 = circuit_add(t86, t87); let t97 = circuit_sub(t86, t87); let t98 = circuit_mul(t96, t97); let t99 = circuit_mul(t86, t87); let t100 = circuit_add(t99, t99); let t101 = circuit_add(t94, t95); let t102 = circuit_add(t101, t101); let t103 = circuit_sub(t94, t95); let t104 = circuit_sub(t102, t94); let t105 = circuit_sub(t104, t95); let t106 = circuit_add(t103, t81); // Fp2 add coeff 0/1 let t107 = circuit_add(t105, t83); // Fp2 add coeff 1/1 let t108 = circuit_add(t77, t98); // Fp2 add coeff 0/1 let t109 = circuit_add(t78, t100); // Fp2 add coeff 1/1 let t110 = circuit_add(t108, t94); // Fp2 add coeff 0/1 let t111 = circuit_add(t109, t95); // Fp2 add coeff 1/1 let t112 = circuit_sub(t110, t81); // Fp2 sub coeff 0/1 let t113 = circuit_sub(t111, t83); // Fp2 sub coeff 1/1 let t114 = circuit_add(t112, t113); let t115 = circuit_add(t114, t114); let t116 = circuit_sub(t112, t113); let t117 = circuit_sub(t115, t112); let t118 = circuit_sub(t117, t113); let t119 = circuit_sub(t49, t116); // Fp6 sub coeff 0/5 let t120 = circuit_sub(t50, t118); // Fp6 sub coeff 1/5 let t121 = circuit_sub(t18, t106); // Fp6 sub coeff 2/5 let t122 = circuit_sub(t19, t107); // Fp6 sub coeff 3/5 let t123 = circuit_sub(t55, t75); // Fp6 sub coeff 4/5 let t124 = circuit_sub(t56, t76); // Fp6 sub coeff 5/5 let t125 = circuit_add(t119, t120); let t126 = circuit_sub(t119, t120); let t127 = circuit_mul(t125, t126); let t128 = circuit_mul(t119, t120); let t129 = circuit_add(t128, t128); let t130 = circuit_add(t121, t122); let t131 = circuit_sub(t121, t122); let t132 = circuit_mul(t130, t131); let t133 = circuit_mul(t121, t122); let t134 = circuit_add(t133, t133); let t135 = circuit_add(t123, t124); let t136 = circuit_sub(t123, t124); let t137 = circuit_mul(t135, t136); let t138 = circuit_mul(t123, t124); let t139 = circuit_add(t138, t138); let t140 = circuit_mul(t119, t121); // Fp2 mul start let t141 = circuit_mul(t120, t122); let t142 = circuit_sub(t140, t141); // Fp2 mul real part end let t143 = circuit_mul(t119, t122); let t144 = circuit_mul(t120, t121); let t145 = circuit_add(t143, t144); // Fp2 mul imag part end let t146 = circuit_mul(t119, t123); // Fp2 mul start let t147 = circuit_mul(t120, t124); let t148 = circuit_sub(t146, t147); // Fp2 mul real part end let t149 = circuit_mul(t119, t124); let t150 = circuit_mul(t120, t123); let t151 = circuit_add(t149, t150); // Fp2 mul imag part end let t152 = circuit_mul(t121, t123); // Fp2 mul start let t153 = circuit_mul(t122, t124); let t154 = circuit_sub(t152, t153); // Fp2 mul real part end let t155 = circuit_mul(t121, t124); let t156 = circuit_mul(t122, t123); let t157 = circuit_add(t155, t156); // Fp2 mul imag part end let t158 = circuit_add(t154, t157); let t159 = circuit_add(t158, t158); let t160 = circuit_sub(t154, t157); let t161 = circuit_sub(t159, t154); let t162 = circuit_sub(t161, t157); let t163 = circuit_sub(in0, t160); // Fp2 neg coeff 0/1 let t164 = circuit_sub(in0, t162); // Fp2 neg coeff 1/1 let t165 = circuit_add(t163, t127); // Fp2 add coeff 0/1 let t166 = circuit_add(t164, t129); // Fp2 add coeff 1/1 let t167 = circuit_add(t137, t139); let t168 = circuit_add(t167, t167); let t169 = circuit_sub(t137, t139); let t170 = circuit_sub(t168, t137); let t171 = circuit_sub(t170, t139); let t172 = circuit_sub(t169, t142); // Fp2 sub coeff 0/1 let t173 = circuit_sub(t171, t145); // Fp2 sub coeff 1/1 let t174 = circuit_sub(t132, t148); // Fp2 sub coeff 0/1 let t175 = circuit_sub(t134, t151); // Fp2 sub coeff 1/1 let t176 = circuit_mul(t119, t165); // Fp2 mul start let t177 = circuit_mul(t120, t166); let t178 = circuit_sub(t176, t177); // Fp2 mul real part end let t179 = circuit_mul(t119, t166); let t180 = circuit_mul(t120, t165); let t181 = circuit_add(t179, t180); // Fp2 mul imag part end let t182 = circuit_mul(t123, t172); // Fp2 mul start let t183 = circuit_mul(t124, t173); let t184 = circuit_sub(t182, t183); // Fp2 mul real part end let t185 = circuit_mul(t123, t173); let t186 = circuit_mul(t124, t172); let t187 = circuit_add(t185, t186); // Fp2 mul imag part end let t188 = circuit_mul(t121, t174); // Fp2 mul start let t189 = circuit_mul(t122, t175); let t190 = circuit_sub(t188, t189); // Fp2 mul real part end let t191 = circuit_mul(t121, t175); let t192 = circuit_mul(t122, t174); let t193 = circuit_add(t191, t192); // Fp2 mul imag part end let t194 = circuit_add(t184, t190); // Fp2 add coeff 0/1 let t195 = circuit_add(t187, t193); // Fp2 add coeff 1/1 let t196 = circuit_add(t194, t195); let t197 = circuit_add(t196, t196); let t198 = circuit_sub(t194, t195); let t199 = circuit_sub(t197, t194); let t200 = circuit_sub(t199, t195); let t201 = circuit_add(t178, t198); // Fp2 add coeff 0/1 let t202 = circuit_add(t181, t200); // Fp2 add coeff 1/1 let t203 = circuit_mul(t201, t201); // Fp2 Inv start let t204 = circuit_mul(t202, t202); let t205 = circuit_add(t203, t204); let t206 = circuit_inverse(t205); let t207 = circuit_mul(t201, t206); // Fp2 Inv real part end let t208 = circuit_mul(t202, t206); let t209 = circuit_sub(in0, t208); // Fp2 Inv imag part end let t210 = circuit_mul(t165, t207); // Fp2 mul start let t211 = circuit_mul(t166, t209); let t212 = circuit_sub(t210, t211); // Fp2 mul real part end let t213 = circuit_mul(t165, t209); let t214 = circuit_mul(t166, t207); let t215 = circuit_add(t213, t214); // Fp2 mul imag part end let t216 = circuit_mul(t172, t207); // Fp2 mul start let t217 = circuit_mul(t173, t209); let t218 = circuit_sub(t216, t217); // Fp2 mul real part end let t219 = circuit_mul(t172, t209); let t220 = circuit_mul(t173, t207); let t221 = circuit_add(t219, t220); // Fp2 mul imag part end let t222 = circuit_mul(t174, t207); // Fp2 mul start let t223 = circuit_mul(t175, t209); let t224 = circuit_sub(t222, t223); // Fp2 mul real part end let t225 = circuit_mul(t174, t209); let t226 = circuit_mul(t175, t207); let t227 = circuit_add(t225, t226); // Fp2 mul imag part end let t228 = circuit_mul(in1, t212); // Fp2 mul start let t229 = circuit_mul(in2, t215); let t230 = circuit_sub(t228, t229); // Fp2 mul real part end let t231 = circuit_mul(in1, t215); let t232 = circuit_mul(in2, t212); let t233 = circuit_add(t231, t232); // Fp2 mul imag part end let t234 = circuit_mul(in3, t218); // Fp2 mul start let t235 = circuit_mul(in4, t221); let t236 = circuit_sub(t234, t235); // Fp2 mul real part end let t237 = circuit_mul(in3, t221); let t238 = circuit_mul(in4, t218); let t239 = circuit_add(t237, t238); // Fp2 mul imag part end let t240 = circuit_mul(in5, t224); // Fp2 mul start let t241 = circuit_mul(in6, t227); let t242 = circuit_sub(t240, t241); // Fp2 mul real part end let t243 = circuit_mul(in5, t227); let t244 = circuit_mul(in6, t224); let t245 = circuit_add(t243, t244); // Fp2 mul imag part end let t246 = circuit_add(in3, in5); // Fp2 add coeff 0/1 let t247 = circuit_add(in4, in6); // Fp2 add coeff 1/1 let t248 = circuit_add(t218, t224); // Fp2 add coeff 0/1 let t249 = circuit_add(t221, t227); // Fp2 add coeff 1/1 let t250 = circuit_mul(t246, t248); // Fp2 mul start let t251 = circuit_mul(t247, t249); let t252 = circuit_sub(t250, t251); // Fp2 mul real part end let t253 = circuit_mul(t246, t249); let t254 = circuit_mul(t247, t248); let t255 = circuit_add(t253, t254); // Fp2 mul imag part end let t256 = circuit_sub(t252, t236); // Fp2 sub coeff 0/1 let t257 = circuit_sub(t255, t239); // Fp2 sub coeff 1/1 let t258 = circuit_sub(t256, t242); // Fp2 sub coeff 0/1 let t259 = circuit_sub(t257, t245); // Fp2 sub coeff 1/1 let t260 = circuit_add(t258, t259); let t261 = circuit_add(t260, t260); let t262 = circuit_sub(t258, t259); let t263 = circuit_sub(t261, t258); let t264 = circuit_sub(t263, t259); let t265 = circuit_add(t262, t230); // Fp2 add coeff 0/1 let t266 = circuit_add(t264, t233); // Fp2 add coeff 1/1 let t267 = circuit_add(in1, in3); // Fp2 add coeff 0/1 let t268 = circuit_add(in2, in4); // Fp2 add coeff 1/1 let t269 = circuit_add(t212, t218); // Fp2 add coeff 0/1 let t270 = circuit_add(t215, t221); // Fp2 add coeff 1/1 let t271 = circuit_mul(t267, t269); // Fp2 mul start let t272 = circuit_mul(t268, t270); let t273 = circuit_sub(t271, t272); // Fp2 mul real part end let t274 = circuit_mul(t267, t270); let t275 = circuit_mul(t268, t269); let t276 = circuit_add(t274, t275); // Fp2 mul imag part end let t277 = circuit_sub(t273, t230); // Fp2 sub coeff 0/1 let t278 = circuit_sub(t276, t233); // Fp2 sub coeff 1/1 let t279 = circuit_sub(t277, t236); // Fp2 sub coeff 0/1 let t280 = circuit_sub(t278, t239); // Fp2 sub coeff 1/1 let t281 = circuit_add(t242, t245); let t282 = circuit_add(t281, t281); let t283 = circuit_sub(t242, t245); let t284 = circuit_sub(t282, t242); let t285 = circuit_sub(t284, t245); let t286 = circuit_add(t279, t283); // Fp2 add coeff 0/1 let t287 = circuit_add(t280, t285); // Fp2 add coeff 1/1 let t288 = circuit_add(in1, in5); // Fp2 add coeff 0/1 let t289 = circuit_add(in2, in6); // Fp2 add coeff 1/1 let t290 = circuit_add(t212, t224); // Fp2 add coeff 0/1 let t291 = circuit_add(t215, t227); // Fp2 add coeff 1/1 let t292 = circuit_mul(t290, t288); // Fp2 mul start let t293 = circuit_mul(t291, t289); let t294 = circuit_sub(t292, t293); // Fp2 mul real part end let t295 = circuit_mul(t290, t289); let t296 = circuit_mul(t291, t288); let t297 = circuit_add(t295, t296); // Fp2 mul imag part end let t298 = circuit_sub(t294, t230); // Fp2 sub coeff 0/1 let t299 = circuit_sub(t297, t233); // Fp2 sub coeff 1/1 let t300 = circuit_sub(t298, t242); // Fp2 sub coeff 0/1 let t301 = circuit_sub(t299, t245); // Fp2 sub coeff 1/1 let t302 = circuit_add(t300, t236); // Fp2 add coeff 0/1 let t303 = circuit_add(t301, t239); // Fp2 add coeff 1/1 let t304 = circuit_mul(in7, t212); // Fp2 mul start let t305 = circuit_mul(in8, t215); let t306 = circuit_sub(t304, t305); // Fp2 mul real part end let t307 = circuit_mul(in7, t215); let t308 = circuit_mul(in8, t212); let t309 = circuit_add(t307, t308); // Fp2 mul imag part end let t310 = circuit_mul(in9, t218); // Fp2 mul start let t311 = circuit_mul(in10, t221); let t312 = circuit_sub(t310, t311); // Fp2 mul real part end let t313 = circuit_mul(in9, t221); let t314 = circuit_mul(in10, t218); let t315 = circuit_add(t313, t314); // Fp2 mul imag part end let t316 = circuit_mul(in11, t224); // Fp2 mul start let t317 = circuit_mul(in12, t227); let t318 = circuit_sub(t316, t317); // Fp2 mul real part end let t319 = circuit_mul(in11, t227); let t320 = circuit_mul(in12, t224); let t321 = circuit_add(t319, t320); // Fp2 mul imag part end let t322 = circuit_add(in9, in11); // Fp2 add coeff 0/1 let t323 = circuit_add(in10, in12); // Fp2 add coeff 1/1 let t324 = circuit_add(t218, t224); // Fp2 add coeff 0/1 let t325 = circuit_add(t221, t227); // Fp2 add coeff 1/1 let t326 = circuit_mul(t322, t324); // Fp2 mul start let t327 = circuit_mul(t323, t325); let t328 = circuit_sub(t326, t327); // Fp2 mul real part end let t329 = circuit_mul(t322, t325); let t330 = circuit_mul(t323, t324); let t331 = circuit_add(t329, t330); // Fp2 mul imag part end let t332 = circuit_sub(t328, t312); // Fp2 sub coeff 0/1 let t333 = circuit_sub(t331, t315); // Fp2 sub coeff 1/1 let t334 = circuit_sub(t332, t318); // Fp2 sub coeff 0/1 let t335 = circuit_sub(t333, t321); // Fp2 sub coeff 1/1 let t336 = circuit_add(t334, t335); let t337 = circuit_add(t336, t336); let t338 = circuit_sub(t334, t335); let t339 = circuit_sub(t337, t334); let t340 = circuit_sub(t339, t335); let t341 = circuit_add(t338, t306); // Fp2 add coeff 0/1 let t342 = circuit_add(t340, t309); // Fp2 add coeff 1/1 let t343 = circuit_add(in7, in9); // Fp2 add coeff 0/1 let t344 = circuit_add(in8, in10); // Fp2 add coeff 1/1 let t345 = circuit_add(t212, t218); // Fp2 add coeff 0/1 let t346 = circuit_add(t215, t221); // Fp2 add coeff 1/1 let t347 = circuit_mul(t343, t345); // Fp2 mul start let t348 = circuit_mul(t344, t346); let t349 = circuit_sub(t347, t348); // Fp2 mul real part end let t350 = circuit_mul(t343, t346); let t351 = circuit_mul(t344, t345); let t352 = circuit_add(t350, t351); // Fp2 mul imag part end let t353 = circuit_sub(t349, t306); // Fp2 sub coeff 0/1 let t354 = circuit_sub(t352, t309); // Fp2 sub coeff 1/1 let t355 = circuit_sub(t353, t312); // Fp2 sub coeff 0/1 let t356 = circuit_sub(t354, t315); // Fp2 sub coeff 1/1 let t357 = circuit_add(t318, t321); let t358 = circuit_add(t357, t357); let t359 = circuit_sub(t318, t321); let t360 = circuit_sub(t358, t318); let t361 = circuit_sub(t360, t321); let t362 = circuit_add(t355, t359); // Fp2 add coeff 0/1 let t363 = circuit_add(t356, t361); // Fp2 add coeff 1/1 let t364 = circuit_add(in7, in11); // Fp2 add coeff 0/1 let t365 = circuit_add(in8, in12); // Fp2 add coeff 1/1 let t366 = circuit_add(t212, t224); // Fp2 add coeff 0/1 let t367 = circuit_add(t215, t227); // Fp2 add coeff 1/1 let t368 = circuit_mul(t366, t364); // Fp2 mul start let t369 = circuit_mul(t367, t365); let t370 = circuit_sub(t368, t369); // Fp2 mul real part end let t371 = circuit_mul(t366, t365); let t372 = circuit_mul(t367, t364); let t373 = circuit_add(t371, t372); // Fp2 mul imag part end let t374 = circuit_sub(t370, t306); // Fp2 sub coeff 0/1 let t375 = circuit_sub(t373, t309); // Fp2 sub coeff 1/1 let t376 = circuit_sub(t374, t318); // Fp2 sub coeff 0/1 let t377 = circuit_sub(t375, t321); // Fp2 sub coeff 1/1 let t378 = circuit_add(t376, t312); // Fp2 add coeff 0/1 let t379 = circuit_add(t377, t315); // Fp2 add coeff 1/1 let t380 = circuit_sub(in0, t341); // Fp6 neg coeff 0/5 let t381 = circuit_sub(in0, t342); // Fp6 neg coeff 1/5 let t382 = circuit_sub(in0, t362); // Fp6 neg coeff 2/5 let t383 = circuit_sub(in0, t363); // Fp6 neg coeff 3/5 let t384 = circuit_sub(in0, t378); // Fp6 neg coeff 4/5 let t385 = circuit_sub(in0, t379); // Fp6 neg coeff 5/5 let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = ( t265, t266, t286, t287, t302, t303, t380, t381, t382, t383, t384, t385, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(M.c0b0a0); // in1 circuit_inputs = circuit_inputs.next_2(M.c0b0a1); // in2 circuit_inputs = circuit_inputs.next_2(M.c0b1a0); // in3 circuit_inputs = circuit_inputs.next_2(M.c0b1a1); // in4 circuit_inputs = circuit_inputs.next_2(M.c0b2a0); // in5 circuit_inputs = circuit_inputs.next_2(M.c0b2a1); // in6 circuit_inputs = circuit_inputs.next_2(M.c1b0a0); // in7 circuit_inputs = circuit_inputs.next_2(M.c1b0a1); // in8 circuit_inputs = circuit_inputs.next_2(M.c1b1a0); // in9 circuit_inputs = circuit_inputs.next_2(M.c1b1a1); // in10 circuit_inputs = circuit_inputs.next_2(M.c1b2a0); // in11 circuit_inputs = circuit_inputs.next_2(M.c1b2a1); // in12 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t265), c0b0a1: outputs.get_output(t266), c0b1a0: outputs.get_output(t286), c0b1a1: outputs.get_output(t287), c0b2a0: outputs.get_output(t302), c0b2a1: outputs.get_output(t303), c1b0a0: outputs.get_output(t380), c1b0a1: outputs.get_output(t381), c1b1a0: outputs.get_output(t382), c1b1a1: outputs.get_output(t383), c1b2a0: outputs.get_output(t384), c1b2a1: outputs.get_output(t385), }; return (res,); } #[inline(always)] pub fn run_BLS12_381_E12T_MUL_circuit(X: E12T, Y: E12T) -> (E12T,) { // INPUT stack let (in0, in1, in2) = (CE::> {}, CE::> {}, CE::> {}); let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_add(in0, in6); // Fp6 add coeff 0/5 let t1 = circuit_add(in1, in7); // Fp6 add coeff 1/5 let t2 = circuit_add(in2, in8); // Fp6 add coeff 2/5 let t3 = circuit_add(in3, in9); // Fp6 add coeff 3/5 let t4 = circuit_add(in4, in10); // Fp6 add coeff 4/5 let t5 = circuit_add(in5, in11); // Fp6 add coeff 5/5 let t6 = circuit_add(in12, in18); // Fp6 add coeff 0/5 let t7 = circuit_add(in13, in19); // Fp6 add coeff 1/5 let t8 = circuit_add(in14, in20); // Fp6 add coeff 2/5 let t9 = circuit_add(in15, in21); // Fp6 add coeff 3/5 let t10 = circuit_add(in16, in22); // Fp6 add coeff 4/5 let t11 = circuit_add(in17, in23); // Fp6 add coeff 5/5 let t12 = circuit_mul(t0, t6); // Fp2 mul start let t13 = circuit_mul(t1, t7); let t14 = circuit_sub(t12, t13); // Fp2 mul real part end let t15 = circuit_mul(t0, t7); let t16 = circuit_mul(t1, t6); let t17 = circuit_add(t15, t16); // Fp2 mul imag part end let t18 = circuit_mul(t2, t8); // Fp2 mul start let t19 = circuit_mul(t3, t9); let t20 = circuit_sub(t18, t19); // Fp2 mul real part end let t21 = circuit_mul(t2, t9); let t22 = circuit_mul(t3, t8); let t23 = circuit_add(t21, t22); // Fp2 mul imag part end let t24 = circuit_mul(t4, t10); // Fp2 mul start let t25 = circuit_mul(t5, t11); let t26 = circuit_sub(t24, t25); // Fp2 mul real part end let t27 = circuit_mul(t4, t11); let t28 = circuit_mul(t5, t10); let t29 = circuit_add(t27, t28); // Fp2 mul imag part end let t30 = circuit_add(t2, t4); // Fp2 add coeff 0/1 let t31 = circuit_add(t3, t5); // Fp2 add coeff 1/1 let t32 = circuit_add(t8, t10); // Fp2 add coeff 0/1 let t33 = circuit_add(t9, t11); // Fp2 add coeff 1/1 let t34 = circuit_mul(t30, t32); // Fp2 mul start let t35 = circuit_mul(t31, t33); let t36 = circuit_sub(t34, t35); // Fp2 mul real part end let t37 = circuit_mul(t30, t33); let t38 = circuit_mul(t31, t32); let t39 = circuit_add(t37, t38); // Fp2 mul imag part end let t40 = circuit_sub(t36, t20); // Fp2 sub coeff 0/1 let t41 = circuit_sub(t39, t23); // Fp2 sub coeff 1/1 let t42 = circuit_sub(t40, t26); // Fp2 sub coeff 0/1 let t43 = circuit_sub(t41, t29); // Fp2 sub coeff 1/1 let t44 = circuit_add(t42, t43); let t45 = circuit_add(t44, t44); let t46 = circuit_sub(t42, t43); let t47 = circuit_sub(t45, t42); let t48 = circuit_sub(t47, t43); let t49 = circuit_add(t46, t14); // Fp2 add coeff 0/1 let t50 = circuit_add(t48, t17); // Fp2 add coeff 1/1 let t51 = circuit_add(t0, t2); // Fp2 add coeff 0/1 let t52 = circuit_add(t1, t3); // Fp2 add coeff 1/1 let t53 = circuit_add(t6, t8); // Fp2 add coeff 0/1 let t54 = circuit_add(t7, t9); // Fp2 add coeff 1/1 let t55 = circuit_mul(t51, t53); // Fp2 mul start let t56 = circuit_mul(t52, t54); let t57 = circuit_sub(t55, t56); // Fp2 mul real part end let t58 = circuit_mul(t51, t54); let t59 = circuit_mul(t52, t53); let t60 = circuit_add(t58, t59); // Fp2 mul imag part end let t61 = circuit_sub(t57, t14); // Fp2 sub coeff 0/1 let t62 = circuit_sub(t60, t17); // Fp2 sub coeff 1/1 let t63 = circuit_sub(t61, t20); // Fp2 sub coeff 0/1 let t64 = circuit_sub(t62, t23); // Fp2 sub coeff 1/1 let t65 = circuit_add(t26, t29); let t66 = circuit_add(t65, t65); let t67 = circuit_sub(t26, t29); let t68 = circuit_sub(t66, t26); let t69 = circuit_sub(t68, t29); let t70 = circuit_add(t63, t67); // Fp2 add coeff 0/1 let t71 = circuit_add(t64, t69); // Fp2 add coeff 1/1 let t72 = circuit_add(t0, t4); // Fp2 add coeff 0/1 let t73 = circuit_add(t1, t5); // Fp2 add coeff 1/1 let t74 = circuit_add(t6, t10); // Fp2 add coeff 0/1 let t75 = circuit_add(t7, t11); // Fp2 add coeff 1/1 let t76 = circuit_mul(t74, t72); // Fp2 mul start let t77 = circuit_mul(t75, t73); let t78 = circuit_sub(t76, t77); // Fp2 mul real part end let t79 = circuit_mul(t74, t73); let t80 = circuit_mul(t75, t72); let t81 = circuit_add(t79, t80); // Fp2 mul imag part end let t82 = circuit_sub(t78, t14); // Fp2 sub coeff 0/1 let t83 = circuit_sub(t81, t17); // Fp2 sub coeff 1/1 let t84 = circuit_sub(t82, t26); // Fp2 sub coeff 0/1 let t85 = circuit_sub(t83, t29); // Fp2 sub coeff 1/1 let t86 = circuit_add(t84, t20); // Fp2 add coeff 0/1 let t87 = circuit_add(t85, t23); // Fp2 add coeff 1/1 let t88 = circuit_mul(in0, in12); // Fp2 mul start let t89 = circuit_mul(in1, in13); let t90 = circuit_sub(t88, t89); // Fp2 mul real part end let t91 = circuit_mul(in0, in13); let t92 = circuit_mul(in1, in12); let t93 = circuit_add(t91, t92); // Fp2 mul imag part end let t94 = circuit_mul(in2, in14); // Fp2 mul start let t95 = circuit_mul(in3, in15); let t96 = circuit_sub(t94, t95); // Fp2 mul real part end let t97 = circuit_mul(in2, in15); let t98 = circuit_mul(in3, in14); let t99 = circuit_add(t97, t98); // Fp2 mul imag part end let t100 = circuit_mul(in4, in16); // Fp2 mul start let t101 = circuit_mul(in5, in17); let t102 = circuit_sub(t100, t101); // Fp2 mul real part end let t103 = circuit_mul(in4, in17); let t104 = circuit_mul(in5, in16); let t105 = circuit_add(t103, t104); // Fp2 mul imag part end let t106 = circuit_add(in2, in4); // Fp2 add coeff 0/1 let t107 = circuit_add(in3, in5); // Fp2 add coeff 1/1 let t108 = circuit_add(in14, in16); // Fp2 add coeff 0/1 let t109 = circuit_add(in15, in17); // Fp2 add coeff 1/1 let t110 = circuit_mul(t106, t108); // Fp2 mul start let t111 = circuit_mul(t107, t109); let t112 = circuit_sub(t110, t111); // Fp2 mul real part end let t113 = circuit_mul(t106, t109); let t114 = circuit_mul(t107, t108); let t115 = circuit_add(t113, t114); // Fp2 mul imag part end let t116 = circuit_sub(t112, t96); // Fp2 sub coeff 0/1 let t117 = circuit_sub(t115, t99); // Fp2 sub coeff 1/1 let t118 = circuit_sub(t116, t102); // Fp2 sub coeff 0/1 let t119 = circuit_sub(t117, t105); // Fp2 sub coeff 1/1 let t120 = circuit_add(t118, t119); let t121 = circuit_add(t120, t120); let t122 = circuit_sub(t118, t119); let t123 = circuit_sub(t121, t118); let t124 = circuit_sub(t123, t119); let t125 = circuit_add(t122, t90); // Fp2 add coeff 0/1 let t126 = circuit_add(t124, t93); // Fp2 add coeff 1/1 let t127 = circuit_add(in0, in2); // Fp2 add coeff 0/1 let t128 = circuit_add(in1, in3); // Fp2 add coeff 1/1 let t129 = circuit_add(in12, in14); // Fp2 add coeff 0/1 let t130 = circuit_add(in13, in15); // Fp2 add coeff 1/1 let t131 = circuit_mul(t127, t129); // Fp2 mul start let t132 = circuit_mul(t128, t130); let t133 = circuit_sub(t131, t132); // Fp2 mul real part end let t134 = circuit_mul(t127, t130); let t135 = circuit_mul(t128, t129); let t136 = circuit_add(t134, t135); // Fp2 mul imag part end let t137 = circuit_sub(t133, t90); // Fp2 sub coeff 0/1 let t138 = circuit_sub(t136, t93); // Fp2 sub coeff 1/1 let t139 = circuit_sub(t137, t96); // Fp2 sub coeff 0/1 let t140 = circuit_sub(t138, t99); // Fp2 sub coeff 1/1 let t141 = circuit_add(t102, t105); let t142 = circuit_add(t141, t141); let t143 = circuit_sub(t102, t105); let t144 = circuit_sub(t142, t102); let t145 = circuit_sub(t144, t105); let t146 = circuit_add(t139, t143); // Fp2 add coeff 0/1 let t147 = circuit_add(t140, t145); // Fp2 add coeff 1/1 let t148 = circuit_add(in0, in4); // Fp2 add coeff 0/1 let t149 = circuit_add(in1, in5); // Fp2 add coeff 1/1 let t150 = circuit_add(in12, in16); // Fp2 add coeff 0/1 let t151 = circuit_add(in13, in17); // Fp2 add coeff 1/1 let t152 = circuit_mul(t150, t148); // Fp2 mul start let t153 = circuit_mul(t151, t149); let t154 = circuit_sub(t152, t153); // Fp2 mul real part end let t155 = circuit_mul(t150, t149); let t156 = circuit_mul(t151, t148); let t157 = circuit_add(t155, t156); // Fp2 mul imag part end let t158 = circuit_sub(t154, t90); // Fp2 sub coeff 0/1 let t159 = circuit_sub(t157, t93); // Fp2 sub coeff 1/1 let t160 = circuit_sub(t158, t102); // Fp2 sub coeff 0/1 let t161 = circuit_sub(t159, t105); // Fp2 sub coeff 1/1 let t162 = circuit_add(t160, t96); // Fp2 add coeff 0/1 let t163 = circuit_add(t161, t99); // Fp2 add coeff 1/1 let t164 = circuit_mul(in6, in18); // Fp2 mul start let t165 = circuit_mul(in7, in19); let t166 = circuit_sub(t164, t165); // Fp2 mul real part end let t167 = circuit_mul(in6, in19); let t168 = circuit_mul(in7, in18); let t169 = circuit_add(t167, t168); // Fp2 mul imag part end let t170 = circuit_mul(in8, in20); // Fp2 mul start let t171 = circuit_mul(in9, in21); let t172 = circuit_sub(t170, t171); // Fp2 mul real part end let t173 = circuit_mul(in8, in21); let t174 = circuit_mul(in9, in20); let t175 = circuit_add(t173, t174); // Fp2 mul imag part end let t176 = circuit_mul(in10, in22); // Fp2 mul start let t177 = circuit_mul(in11, in23); let t178 = circuit_sub(t176, t177); // Fp2 mul real part end let t179 = circuit_mul(in10, in23); let t180 = circuit_mul(in11, in22); let t181 = circuit_add(t179, t180); // Fp2 mul imag part end let t182 = circuit_add(in8, in10); // Fp2 add coeff 0/1 let t183 = circuit_add(in9, in11); // Fp2 add coeff 1/1 let t184 = circuit_add(in20, in22); // Fp2 add coeff 0/1 let t185 = circuit_add(in21, in23); // Fp2 add coeff 1/1 let t186 = circuit_mul(t182, t184); // Fp2 mul start let t187 = circuit_mul(t183, t185); let t188 = circuit_sub(t186, t187); // Fp2 mul real part end let t189 = circuit_mul(t182, t185); let t190 = circuit_mul(t183, t184); let t191 = circuit_add(t189, t190); // Fp2 mul imag part end let t192 = circuit_sub(t188, t172); // Fp2 sub coeff 0/1 let t193 = circuit_sub(t191, t175); // Fp2 sub coeff 1/1 let t194 = circuit_sub(t192, t178); // Fp2 sub coeff 0/1 let t195 = circuit_sub(t193, t181); // Fp2 sub coeff 1/1 let t196 = circuit_add(t194, t195); let t197 = circuit_add(t196, t196); let t198 = circuit_sub(t194, t195); let t199 = circuit_sub(t197, t194); let t200 = circuit_sub(t199, t195); let t201 = circuit_add(t198, t166); // Fp2 add coeff 0/1 let t202 = circuit_add(t200, t169); // Fp2 add coeff 1/1 let t203 = circuit_add(in6, in8); // Fp2 add coeff 0/1 let t204 = circuit_add(in7, in9); // Fp2 add coeff 1/1 let t205 = circuit_add(in18, in20); // Fp2 add coeff 0/1 let t206 = circuit_add(in19, in21); // Fp2 add coeff 1/1 let t207 = circuit_mul(t203, t205); // Fp2 mul start let t208 = circuit_mul(t204, t206); let t209 = circuit_sub(t207, t208); // Fp2 mul real part end let t210 = circuit_mul(t203, t206); let t211 = circuit_mul(t204, t205); let t212 = circuit_add(t210, t211); // Fp2 mul imag part end let t213 = circuit_sub(t209, t166); // Fp2 sub coeff 0/1 let t214 = circuit_sub(t212, t169); // Fp2 sub coeff 1/1 let t215 = circuit_sub(t213, t172); // Fp2 sub coeff 0/1 let t216 = circuit_sub(t214, t175); // Fp2 sub coeff 1/1 let t217 = circuit_add(t178, t181); let t218 = circuit_add(t217, t217); let t219 = circuit_sub(t178, t181); let t220 = circuit_sub(t218, t178); let t221 = circuit_sub(t220, t181); let t222 = circuit_add(t215, t219); // Fp2 add coeff 0/1 let t223 = circuit_add(t216, t221); // Fp2 add coeff 1/1 let t224 = circuit_add(in6, in10); // Fp2 add coeff 0/1 let t225 = circuit_add(in7, in11); // Fp2 add coeff 1/1 let t226 = circuit_add(in18, in22); // Fp2 add coeff 0/1 let t227 = circuit_add(in19, in23); // Fp2 add coeff 1/1 let t228 = circuit_mul(t226, t224); // Fp2 mul start let t229 = circuit_mul(t227, t225); let t230 = circuit_sub(t228, t229); // Fp2 mul real part end let t231 = circuit_mul(t226, t225); let t232 = circuit_mul(t227, t224); let t233 = circuit_add(t231, t232); // Fp2 mul imag part end let t234 = circuit_sub(t230, t166); // Fp2 sub coeff 0/1 let t235 = circuit_sub(t233, t169); // Fp2 sub coeff 1/1 let t236 = circuit_sub(t234, t178); // Fp2 sub coeff 0/1 let t237 = circuit_sub(t235, t181); // Fp2 sub coeff 1/1 let t238 = circuit_add(t236, t172); // Fp2 add coeff 0/1 let t239 = circuit_add(t237, t175); // Fp2 add coeff 1/1 let t240 = circuit_sub(t49, t125); // Fp6 sub coeff 0/5 let t241 = circuit_sub(t50, t126); // Fp6 sub coeff 1/5 let t242 = circuit_sub(t70, t146); // Fp6 sub coeff 2/5 let t243 = circuit_sub(t71, t147); // Fp6 sub coeff 3/5 let t244 = circuit_sub(t86, t162); // Fp6 sub coeff 4/5 let t245 = circuit_sub(t87, t163); // Fp6 sub coeff 5/5 let t246 = circuit_sub(t240, t201); // Fp6 sub coeff 0/5 let t247 = circuit_sub(t241, t202); // Fp6 sub coeff 1/5 let t248 = circuit_sub(t242, t222); // Fp6 sub coeff 2/5 let t249 = circuit_sub(t243, t223); // Fp6 sub coeff 3/5 let t250 = circuit_sub(t244, t238); // Fp6 sub coeff 4/5 let t251 = circuit_sub(t245, t239); // Fp6 sub coeff 5/5 let t252 = circuit_add(t238, t239); let t253 = circuit_add(t252, t252); let t254 = circuit_sub(t238, t239); let t255 = circuit_sub(t253, t238); let t256 = circuit_sub(t255, t239); let t257 = circuit_add(t254, t125); // Fp6 add coeff 0/5 let t258 = circuit_add(t256, t126); // Fp6 add coeff 1/5 let t259 = circuit_add(t201, t146); // Fp6 add coeff 2/5 let t260 = circuit_add(t202, t147); // Fp6 add coeff 3/5 let t261 = circuit_add(t222, t162); // Fp6 add coeff 4/5 let t262 = circuit_add(t223, t163); // Fp6 add coeff 5/5 let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = ( t257, t258, t259, t260, t261, t262, t246, t247, t248, t249, t250, t251, ) .new_inputs(); // Prefill constants: // Fill inputs: circuit_inputs = circuit_inputs.next_2(X.c0b0a0); // in0 circuit_inputs = circuit_inputs.next_2(X.c0b0a1); // in1 circuit_inputs = circuit_inputs.next_2(X.c0b1a0); // in2 circuit_inputs = circuit_inputs.next_2(X.c0b1a1); // in3 circuit_inputs = circuit_inputs.next_2(X.c0b2a0); // in4 circuit_inputs = circuit_inputs.next_2(X.c0b2a1); // in5 circuit_inputs = circuit_inputs.next_2(X.c1b0a0); // in6 circuit_inputs = circuit_inputs.next_2(X.c1b0a1); // in7 circuit_inputs = circuit_inputs.next_2(X.c1b1a0); // in8 circuit_inputs = circuit_inputs.next_2(X.c1b1a1); // in9 circuit_inputs = circuit_inputs.next_2(X.c1b2a0); // in10 circuit_inputs = circuit_inputs.next_2(X.c1b2a1); // in11 circuit_inputs = circuit_inputs.next_2(Y.c0b0a0); // in12 circuit_inputs = circuit_inputs.next_2(Y.c0b0a1); // in13 circuit_inputs = circuit_inputs.next_2(Y.c0b1a0); // in14 circuit_inputs = circuit_inputs.next_2(Y.c0b1a1); // in15 circuit_inputs = circuit_inputs.next_2(Y.c0b2a0); // in16 circuit_inputs = circuit_inputs.next_2(Y.c0b2a1); // in17 circuit_inputs = circuit_inputs.next_2(Y.c1b0a0); // in18 circuit_inputs = circuit_inputs.next_2(Y.c1b0a1); // in19 circuit_inputs = circuit_inputs.next_2(Y.c1b1a0); // in20 circuit_inputs = circuit_inputs.next_2(Y.c1b1a1); // in21 circuit_inputs = circuit_inputs.next_2(Y.c1b2a0); // in22 circuit_inputs = circuit_inputs.next_2(Y.c1b2a1); // in23 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t257), c0b0a1: outputs.get_output(t258), c0b1a0: outputs.get_output(t259), c0b1a1: outputs.get_output(t260), c0b2a0: outputs.get_output(t261), c0b2a1: outputs.get_output(t262), c1b0a0: outputs.get_output(t246), c1b0a1: outputs.get_output(t247), c1b1a0: outputs.get_output(t248), c1b1a1: outputs.get_output(t249), c1b2a0: outputs.get_output(t250), c1b2a1: outputs.get_output(t251), }; return (res,); } #[inline(always)] pub fn run_BLS12_381_TOWER_MILLER_BIT0_1P_circuit( yInv_0: u384, xNegOverY_0: u384, Q_0: G2Point, M_i: E12T, ) -> (G2Point, E12T) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x3 let in2 = CE::> {}; // 0x6 let in3 = CE::> {}; // 0x1 // INPUT stack let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8, in9) = (CE::> {}, CE::> {}, CE::> {}); let (in10, in11, in12) = (CE::> {}, CE::> {}, CE::> {}); let (in13, in14, in15) = (CE::> {}, CE::> {}, CE::> {}); let (in16, in17, in18) = (CE::> {}, CE::> {}, CE::> {}); let (in19, in20, in21) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_sub(in10, in16); // Fp6 sub coeff 0/5 let t1 = circuit_sub(in11, in17); // Fp6 sub coeff 1/5 let t2 = circuit_sub(in12, in18); // Fp6 sub coeff 2/5 let t3 = circuit_sub(in13, in19); // Fp6 sub coeff 3/5 let t4 = circuit_sub(in14, in20); // Fp6 sub coeff 4/5 let t5 = circuit_sub(in15, in21); // Fp6 sub coeff 5/5 let t6 = circuit_add(in20, in21); let t7 = circuit_add(t6, t6); let t8 = circuit_sub(in20, in21); let t9 = circuit_sub(t7, in20); let t10 = circuit_sub(t9, in21); let t11 = circuit_sub(in0, t8); // Fp6 neg coeff 0/5 let t12 = circuit_sub(in0, t10); // Fp6 neg coeff 1/5 let t13 = circuit_sub(in0, in16); // Fp6 neg coeff 2/5 let t14 = circuit_sub(in0, in17); // Fp6 neg coeff 3/5 let t15 = circuit_sub(in0, in18); // Fp6 neg coeff 4/5 let t16 = circuit_sub(in0, in19); // Fp6 neg coeff 5/5 let t17 = circuit_add(in10, t11); // Fp6 add coeff 0/5 let t18 = circuit_add(in11, t12); // Fp6 add coeff 1/5 let t19 = circuit_add(in12, t13); // Fp6 add coeff 2/5 let t20 = circuit_add(in13, t14); // Fp6 add coeff 3/5 let t21 = circuit_add(in14, t15); // Fp6 add coeff 4/5 let t22 = circuit_add(in15, t16); // Fp6 add coeff 5/5 let t23 = circuit_mul(in10, in16); // Fp2 mul start let t24 = circuit_mul(in11, in17); let t25 = circuit_sub(t23, t24); // Fp2 mul real part end let t26 = circuit_mul(in10, in17); let t27 = circuit_mul(in11, in16); let t28 = circuit_add(t26, t27); // Fp2 mul imag part end let t29 = circuit_mul(in12, in18); // Fp2 mul start let t30 = circuit_mul(in13, in19); let t31 = circuit_sub(t29, t30); // Fp2 mul real part end let t32 = circuit_mul(in12, in19); let t33 = circuit_mul(in13, in18); let t34 = circuit_add(t32, t33); // Fp2 mul imag part end let t35 = circuit_mul(in14, in20); // Fp2 mul start let t36 = circuit_mul(in15, in21); let t37 = circuit_sub(t35, t36); // Fp2 mul real part end let t38 = circuit_mul(in14, in21); let t39 = circuit_mul(in15, in20); let t40 = circuit_add(t38, t39); // Fp2 mul imag part end let t41 = circuit_add(in12, in14); // Fp2 add coeff 0/1 let t42 = circuit_add(in13, in15); // Fp2 add coeff 1/1 let t43 = circuit_add(in18, in20); // Fp2 add coeff 0/1 let t44 = circuit_add(in19, in21); // Fp2 add coeff 1/1 let t45 = circuit_mul(t41, t43); // Fp2 mul start let t46 = circuit_mul(t42, t44); let t47 = circuit_sub(t45, t46); // Fp2 mul real part end let t48 = circuit_mul(t41, t44); let t49 = circuit_mul(t42, t43); let t50 = circuit_add(t48, t49); // Fp2 mul imag part end let t51 = circuit_sub(t47, t31); // Fp2 sub coeff 0/1 let t52 = circuit_sub(t50, t34); // Fp2 sub coeff 1/1 let t53 = circuit_sub(t51, t37); // Fp2 sub coeff 0/1 let t54 = circuit_sub(t52, t40); // Fp2 sub coeff 1/1 let t55 = circuit_add(t53, t54); let t56 = circuit_add(t55, t55); let t57 = circuit_sub(t53, t54); let t58 = circuit_sub(t56, t53); let t59 = circuit_sub(t58, t54); let t60 = circuit_add(t57, t25); // Fp2 add coeff 0/1 let t61 = circuit_add(t59, t28); // Fp2 add coeff 1/1 let t62 = circuit_add(in10, in12); // Fp2 add coeff 0/1 let t63 = circuit_add(in11, in13); // Fp2 add coeff 1/1 let t64 = circuit_add(in16, in18); // Fp2 add coeff 0/1 let t65 = circuit_add(in17, in19); // Fp2 add coeff 1/1 let t66 = circuit_mul(t62, t64); // Fp2 mul start let t67 = circuit_mul(t63, t65); let t68 = circuit_sub(t66, t67); // Fp2 mul real part end let t69 = circuit_mul(t62, t65); let t70 = circuit_mul(t63, t64); let t71 = circuit_add(t69, t70); // Fp2 mul imag part end let t72 = circuit_sub(t68, t25); // Fp2 sub coeff 0/1 let t73 = circuit_sub(t71, t28); // Fp2 sub coeff 1/1 let t74 = circuit_sub(t72, t31); // Fp2 sub coeff 0/1 let t75 = circuit_sub(t73, t34); // Fp2 sub coeff 1/1 let t76 = circuit_add(t37, t40); let t77 = circuit_add(t76, t76); let t78 = circuit_sub(t37, t40); let t79 = circuit_sub(t77, t37); let t80 = circuit_sub(t79, t40); let t81 = circuit_add(t74, t78); // Fp2 add coeff 0/1 let t82 = circuit_add(t75, t80); // Fp2 add coeff 1/1 let t83 = circuit_add(in10, in14); // Fp2 add coeff 0/1 let t84 = circuit_add(in11, in15); // Fp2 add coeff 1/1 let t85 = circuit_add(in16, in20); // Fp2 add coeff 0/1 let t86 = circuit_add(in17, in21); // Fp2 add coeff 1/1 let t87 = circuit_mul(t85, t83); // Fp2 mul start let t88 = circuit_mul(t86, t84); let t89 = circuit_sub(t87, t88); // Fp2 mul real part end let t90 = circuit_mul(t85, t84); let t91 = circuit_mul(t86, t83); let t92 = circuit_add(t90, t91); // Fp2 mul imag part end let t93 = circuit_sub(t89, t25); // Fp2 sub coeff 0/1 let t94 = circuit_sub(t92, t28); // Fp2 sub coeff 1/1 let t95 = circuit_sub(t93, t37); // Fp2 sub coeff 0/1 let t96 = circuit_sub(t94, t40); // Fp2 sub coeff 1/1 let t97 = circuit_add(t95, t31); // Fp2 add coeff 0/1 let t98 = circuit_add(t96, t34); // Fp2 add coeff 1/1 let t99 = circuit_mul(t0, t17); // Fp2 mul start let t100 = circuit_mul(t1, t18); let t101 = circuit_sub(t99, t100); // Fp2 mul real part end let t102 = circuit_mul(t0, t18); let t103 = circuit_mul(t1, t17); let t104 = circuit_add(t102, t103); // Fp2 mul imag part end let t105 = circuit_mul(t2, t19); // Fp2 mul start let t106 = circuit_mul(t3, t20); let t107 = circuit_sub(t105, t106); // Fp2 mul real part end let t108 = circuit_mul(t2, t20); let t109 = circuit_mul(t3, t19); let t110 = circuit_add(t108, t109); // Fp2 mul imag part end let t111 = circuit_mul(t4, t21); // Fp2 mul start let t112 = circuit_mul(t5, t22); let t113 = circuit_sub(t111, t112); // Fp2 mul real part end let t114 = circuit_mul(t4, t22); let t115 = circuit_mul(t5, t21); let t116 = circuit_add(t114, t115); // Fp2 mul imag part end let t117 = circuit_add(t2, t4); // Fp2 add coeff 0/1 let t118 = circuit_add(t3, t5); // Fp2 add coeff 1/1 let t119 = circuit_add(t19, t21); // Fp2 add coeff 0/1 let t120 = circuit_add(t20, t22); // Fp2 add coeff 1/1 let t121 = circuit_mul(t117, t119); // Fp2 mul start let t122 = circuit_mul(t118, t120); let t123 = circuit_sub(t121, t122); // Fp2 mul real part end let t124 = circuit_mul(t117, t120); let t125 = circuit_mul(t118, t119); let t126 = circuit_add(t124, t125); // Fp2 mul imag part end let t127 = circuit_sub(t123, t107); // Fp2 sub coeff 0/1 let t128 = circuit_sub(t126, t110); // Fp2 sub coeff 1/1 let t129 = circuit_sub(t127, t113); // Fp2 sub coeff 0/1 let t130 = circuit_sub(t128, t116); // Fp2 sub coeff 1/1 let t131 = circuit_add(t129, t130); let t132 = circuit_add(t131, t131); let t133 = circuit_sub(t129, t130); let t134 = circuit_sub(t132, t129); let t135 = circuit_sub(t134, t130); let t136 = circuit_add(t133, t101); // Fp2 add coeff 0/1 let t137 = circuit_add(t135, t104); // Fp2 add coeff 1/1 let t138 = circuit_add(t0, t2); // Fp2 add coeff 0/1 let t139 = circuit_add(t1, t3); // Fp2 add coeff 1/1 let t140 = circuit_add(t17, t19); // Fp2 add coeff 0/1 let t141 = circuit_add(t18, t20); // Fp2 add coeff 1/1 let t142 = circuit_mul(t138, t140); // Fp2 mul start let t143 = circuit_mul(t139, t141); let t144 = circuit_sub(t142, t143); // Fp2 mul real part end let t145 = circuit_mul(t138, t141); let t146 = circuit_mul(t139, t140); let t147 = circuit_add(t145, t146); // Fp2 mul imag part end let t148 = circuit_sub(t144, t101); // Fp2 sub coeff 0/1 let t149 = circuit_sub(t147, t104); // Fp2 sub coeff 1/1 let t150 = circuit_sub(t148, t107); // Fp2 sub coeff 0/1 let t151 = circuit_sub(t149, t110); // Fp2 sub coeff 1/1 let t152 = circuit_add(t113, t116); let t153 = circuit_add(t152, t152); let t154 = circuit_sub(t113, t116); let t155 = circuit_sub(t153, t113); let t156 = circuit_sub(t155, t116); let t157 = circuit_add(t150, t154); // Fp2 add coeff 0/1 let t158 = circuit_add(t151, t156); // Fp2 add coeff 1/1 let t159 = circuit_add(t0, t4); // Fp2 add coeff 0/1 let t160 = circuit_add(t1, t5); // Fp2 add coeff 1/1 let t161 = circuit_add(t17, t21); // Fp2 add coeff 0/1 let t162 = circuit_add(t18, t22); // Fp2 add coeff 1/1 let t163 = circuit_mul(t161, t159); // Fp2 mul start let t164 = circuit_mul(t162, t160); let t165 = circuit_sub(t163, t164); // Fp2 mul real part end let t166 = circuit_mul(t161, t160); let t167 = circuit_mul(t162, t159); let t168 = circuit_add(t166, t167); // Fp2 mul imag part end let t169 = circuit_sub(t165, t101); // Fp2 sub coeff 0/1 let t170 = circuit_sub(t168, t104); // Fp2 sub coeff 1/1 let t171 = circuit_sub(t169, t113); // Fp2 sub coeff 0/1 let t172 = circuit_sub(t170, t116); // Fp2 sub coeff 1/1 let t173 = circuit_add(t171, t107); // Fp2 add coeff 0/1 let t174 = circuit_add(t172, t110); // Fp2 add coeff 1/1 let t175 = circuit_add(t136, t60); // Fp6 add coeff 0/5 let t176 = circuit_add(t137, t61); // Fp6 add coeff 1/5 let t177 = circuit_add(t157, t81); // Fp6 add coeff 2/5 let t178 = circuit_add(t158, t82); // Fp6 add coeff 3/5 let t179 = circuit_add(t173, t97); // Fp6 add coeff 4/5 let t180 = circuit_add(t174, t98); // Fp6 add coeff 5/5 let t181 = circuit_add(t60, t60); // Fp6 add coeff 0/5 let t182 = circuit_add(t61, t61); // Fp6 add coeff 1/5 let t183 = circuit_add(t81, t81); // Fp6 add coeff 2/5 let t184 = circuit_add(t82, t82); // Fp6 add coeff 3/5 let t185 = circuit_add(t97, t97); // Fp6 add coeff 4/5 let t186 = circuit_add(t98, t98); // Fp6 add coeff 5/5 let t187 = circuit_add(t97, t98); let t188 = circuit_add(t187, t187); let t189 = circuit_sub(t97, t98); let t190 = circuit_sub(t188, t97); let t191 = circuit_sub(t190, t98); let t192 = circuit_add(t175, t189); // Fp6 add coeff 0/5 let t193 = circuit_add(t176, t191); // Fp6 add coeff 1/5 let t194 = circuit_add(t177, t60); // Fp6 add coeff 2/5 let t195 = circuit_add(t178, t61); // Fp6 add coeff 3/5 let t196 = circuit_add(t179, t81); // Fp6 add coeff 4/5 let t197 = circuit_add(t180, t82); // Fp6 add coeff 5/5 let t198 = circuit_add(in6, in7); // Doubling slope numerator start let t199 = circuit_sub(in6, in7); let t200 = circuit_mul(t198, t199); let t201 = circuit_mul(in6, in7); let t202 = circuit_mul(t200, in1); let t203 = circuit_mul(t201, in2); // Doubling slope numerator end let t204 = circuit_add(in8, in8); // Fp2 add coeff 0/1 let t205 = circuit_add(in9, in9); // Fp2 add coeff 1/1 let t206 = circuit_mul(t204, t204); // Fp2 Inv start let t207 = circuit_mul(t205, t205); let t208 = circuit_add(t206, t207); let t209 = circuit_inverse(t208); let t210 = circuit_mul(t204, t209); // Fp2 Inv real part end let t211 = circuit_mul(t205, t209); let t212 = circuit_sub(in0, t211); // Fp2 Inv imag part end let t213 = circuit_mul(t202, t210); // Fp2 mul start let t214 = circuit_mul(t203, t212); let t215 = circuit_sub(t213, t214); // Fp2 mul real part end let t216 = circuit_mul(t202, t212); let t217 = circuit_mul(t203, t210); let t218 = circuit_add(t216, t217); // Fp2 mul imag part end let t219 = circuit_add(t215, t218); let t220 = circuit_sub(t215, t218); let t221 = circuit_mul(t219, t220); let t222 = circuit_mul(t215, t218); let t223 = circuit_add(t222, t222); let t224 = circuit_add(in6, in6); // Fp2 add coeff 0/1 let t225 = circuit_add(in7, in7); // Fp2 add coeff 1/1 let t226 = circuit_sub(t221, t224); // Fp2 sub coeff 0/1 let t227 = circuit_sub(t223, t225); // Fp2 sub coeff 1/1 let t228 = circuit_sub(in6, t226); // Fp2 sub coeff 0/1 let t229 = circuit_sub(in7, t227); // Fp2 sub coeff 1/1 let t230 = circuit_mul(t215, t228); // Fp2 mul start let t231 = circuit_mul(t218, t229); let t232 = circuit_sub(t230, t231); // Fp2 mul real part end let t233 = circuit_mul(t215, t229); let t234 = circuit_mul(t218, t228); let t235 = circuit_add(t233, t234); // Fp2 mul imag part end let t236 = circuit_sub(t232, in8); // Fp2 sub coeff 0/1 let t237 = circuit_sub(t235, in9); // Fp2 sub coeff 1/1 let t238 = circuit_mul(t215, in6); // Fp2 mul start let t239 = circuit_mul(t218, in7); let t240 = circuit_sub(t238, t239); // Fp2 mul real part end let t241 = circuit_mul(t215, in7); let t242 = circuit_mul(t218, in6); let t243 = circuit_add(t241, t242); // Fp2 mul imag part end let t244 = circuit_sub(t240, in8); // Fp2 sub coeff 0/1 let t245 = circuit_sub(t243, in9); // Fp2 sub coeff 1/1 let t246 = circuit_mul(t244, in4); let t247 = circuit_mul(t245, in4); let t248 = circuit_mul(t215, in5); let t249 = circuit_mul(t218, in5); let t250 = circuit_mul(t192, t246); // Fp2 mul start let t251 = circuit_mul(t193, t247); let t252 = circuit_sub(t250, t251); // Fp2 mul real part end let t253 = circuit_mul(t192, t247); let t254 = circuit_mul(t193, t246); let t255 = circuit_add(t253, t254); // Fp2 mul imag part end let t256 = circuit_mul(t194, t248); // Fp2 mul start let t257 = circuit_mul(t195, t249); let t258 = circuit_sub(t256, t257); // Fp2 mul real part end let t259 = circuit_mul(t194, t249); let t260 = circuit_mul(t195, t248); let t261 = circuit_add(t259, t260); // Fp2 mul imag part end let t262 = circuit_add(t194, t196); // Fp2 add coeff 0/1 let t263 = circuit_add(t195, t197); // Fp2 add coeff 1/1 let t264 = circuit_mul(t248, t262); // Fp2 mul start let t265 = circuit_mul(t249, t263); let t266 = circuit_sub(t264, t265); // Fp2 mul real part end let t267 = circuit_mul(t248, t263); let t268 = circuit_mul(t249, t262); let t269 = circuit_add(t267, t268); // Fp2 mul imag part end let t270 = circuit_sub(t266, t258); // Fp2 sub coeff 0/1 let t271 = circuit_sub(t269, t261); // Fp2 sub coeff 1/1 let t272 = circuit_add(t270, t271); let t273 = circuit_add(t272, t272); let t274 = circuit_sub(t270, t271); let t275 = circuit_sub(t273, t270); let t276 = circuit_sub(t275, t271); let t277 = circuit_add(t274, t252); // Fp2 add coeff 0/1 let t278 = circuit_add(t276, t255); // Fp2 add coeff 1/1 let t279 = circuit_add(t192, t196); // Fp2 add coeff 0/1 let t280 = circuit_add(t193, t197); // Fp2 add coeff 1/1 let t281 = circuit_mul(t246, t279); // Fp2 mul start let t282 = circuit_mul(t247, t280); let t283 = circuit_sub(t281, t282); // Fp2 mul real part end let t284 = circuit_mul(t246, t280); let t285 = circuit_mul(t247, t279); let t286 = circuit_add(t284, t285); // Fp2 mul imag part end let t287 = circuit_sub(t283, t252); // Fp2 sub coeff 0/1 let t288 = circuit_sub(t286, t255); // Fp2 sub coeff 1/1 let t289 = circuit_add(t287, t258); // Fp2 add coeff 0/1 let t290 = circuit_add(t288, t261); // Fp2 add coeff 1/1 let t291 = circuit_add(t246, t248); // Fp2 add coeff 0/1 let t292 = circuit_add(t247, t249); // Fp2 add coeff 1/1 let t293 = circuit_add(t192, t194); // Fp2 add coeff 0/1 let t294 = circuit_add(t193, t195); // Fp2 add coeff 1/1 let t295 = circuit_mul(t291, t293); // Fp2 mul start let t296 = circuit_mul(t292, t294); let t297 = circuit_sub(t295, t296); // Fp2 mul real part end let t298 = circuit_mul(t291, t294); let t299 = circuit_mul(t292, t293); let t300 = circuit_add(t298, t299); // Fp2 mul imag part end let t301 = circuit_sub(t297, t252); // Fp2 sub coeff 0/1 let t302 = circuit_sub(t300, t255); // Fp2 sub coeff 1/1 let t303 = circuit_sub(t301, t258); // Fp2 sub coeff 0/1 let t304 = circuit_sub(t302, t261); // Fp2 sub coeff 1/1 let t305 = circuit_add(t185, t186); let t306 = circuit_add(t305, t305); let t307 = circuit_sub(t185, t186); let t308 = circuit_sub(t306, t185); let t309 = circuit_sub(t308, t186); let t310 = circuit_add(in3, t248); let t311 = circuit_add(t181, t192); // Fp6 add coeff 0/5 let t312 = circuit_add(t182, t193); // Fp6 add coeff 1/5 let t313 = circuit_add(t183, t194); // Fp6 add coeff 2/5 let t314 = circuit_add(t184, t195); // Fp6 add coeff 3/5 let t315 = circuit_add(t185, t196); // Fp6 add coeff 4/5 let t316 = circuit_add(t186, t197); // Fp6 add coeff 5/5 let t317 = circuit_mul(t311, t246); // Fp2 mul start let t318 = circuit_mul(t312, t247); let t319 = circuit_sub(t317, t318); // Fp2 mul real part end let t320 = circuit_mul(t311, t247); let t321 = circuit_mul(t312, t246); let t322 = circuit_add(t320, t321); // Fp2 mul imag part end let t323 = circuit_mul(t313, t310); // Fp2 mul start let t324 = circuit_mul(t314, t249); let t325 = circuit_sub(t323, t324); // Fp2 mul real part end let t326 = circuit_mul(t313, t249); let t327 = circuit_mul(t314, t310); let t328 = circuit_add(t326, t327); // Fp2 mul imag part end let t329 = circuit_add(t313, t315); // Fp2 add coeff 0/1 let t330 = circuit_add(t314, t316); // Fp2 add coeff 1/1 let t331 = circuit_mul(t310, t329); // Fp2 mul start let t332 = circuit_mul(t249, t330); let t333 = circuit_sub(t331, t332); // Fp2 mul real part end let t334 = circuit_mul(t310, t330); let t335 = circuit_mul(t249, t329); let t336 = circuit_add(t334, t335); // Fp2 mul imag part end let t337 = circuit_sub(t333, t325); // Fp2 sub coeff 0/1 let t338 = circuit_sub(t336, t328); // Fp2 sub coeff 1/1 let t339 = circuit_add(t337, t338); let t340 = circuit_add(t339, t339); let t341 = circuit_sub(t337, t338); let t342 = circuit_sub(t340, t337); let t343 = circuit_sub(t342, t338); let t344 = circuit_add(t341, t319); // Fp2 add coeff 0/1 let t345 = circuit_add(t343, t322); // Fp2 add coeff 1/1 let t346 = circuit_add(t311, t315); // Fp2 add coeff 0/1 let t347 = circuit_add(t312, t316); // Fp2 add coeff 1/1 let t348 = circuit_mul(t246, t346); // Fp2 mul start let t349 = circuit_mul(t247, t347); let t350 = circuit_sub(t348, t349); // Fp2 mul real part end let t351 = circuit_mul(t246, t347); let t352 = circuit_mul(t247, t346); let t353 = circuit_add(t351, t352); // Fp2 mul imag part end let t354 = circuit_sub(t350, t319); // Fp2 sub coeff 0/1 let t355 = circuit_sub(t353, t322); // Fp2 sub coeff 1/1 let t356 = circuit_add(t354, t325); // Fp2 add coeff 0/1 let t357 = circuit_add(t355, t328); // Fp2 add coeff 1/1 let t358 = circuit_add(t246, t310); // Fp2 add coeff 0/1 let t359 = circuit_add(t247, t249); // Fp2 add coeff 1/1 let t360 = circuit_add(t311, t313); // Fp2 add coeff 0/1 let t361 = circuit_add(t312, t314); // Fp2 add coeff 1/1 let t362 = circuit_mul(t358, t360); // Fp2 mul start let t363 = circuit_mul(t359, t361); let t364 = circuit_sub(t362, t363); // Fp2 mul real part end let t365 = circuit_mul(t358, t361); let t366 = circuit_mul(t359, t360); let t367 = circuit_add(t365, t366); // Fp2 mul imag part end let t368 = circuit_sub(t364, t319); // Fp2 sub coeff 0/1 let t369 = circuit_sub(t367, t322); // Fp2 sub coeff 1/1 let t370 = circuit_sub(t368, t325); // Fp2 sub coeff 0/1 let t371 = circuit_sub(t369, t328); // Fp2 sub coeff 1/1 let t372 = circuit_sub(t344, t277); // Fp6 sub coeff 0/5 let t373 = circuit_sub(t345, t278); // Fp6 sub coeff 1/5 let t374 = circuit_sub(t370, t303); // Fp6 sub coeff 2/5 let t375 = circuit_sub(t371, t304); // Fp6 sub coeff 3/5 let t376 = circuit_sub(t356, t289); // Fp6 sub coeff 4/5 let t377 = circuit_sub(t357, t290); // Fp6 sub coeff 5/5 let t378 = circuit_sub(t372, t307); // Fp6 sub coeff 0/5 let t379 = circuit_sub(t373, t309); // Fp6 sub coeff 1/5 let t380 = circuit_sub(t374, t181); // Fp6 sub coeff 2/5 let t381 = circuit_sub(t375, t182); // Fp6 sub coeff 3/5 let t382 = circuit_sub(t376, t183); // Fp6 sub coeff 4/5 let t383 = circuit_sub(t377, t184); // Fp6 sub coeff 5/5 let t384 = circuit_add(t183, t184); let t385 = circuit_add(t384, t384); let t386 = circuit_sub(t183, t184); let t387 = circuit_sub(t385, t183); let t388 = circuit_sub(t387, t184); let t389 = circuit_add(t386, t277); // Fp6 add coeff 0/5 let t390 = circuit_add(t388, t278); // Fp6 add coeff 1/5 let t391 = circuit_add(t307, t303); // Fp6 add coeff 2/5 let t392 = circuit_add(t309, t304); // Fp6 add coeff 3/5 let t393 = circuit_add(t181, t289); // Fp6 add coeff 4/5 let t394 = circuit_add(t182, t290); // Fp6 add coeff 5/5 let t395 = circuit_add(t226, t227); let t396 = circuit_add(t395, t236); let t397 = circuit_add(t396, t237); let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = ( t397, t389, t390, t391, t392, t393, t394, t378, t379, t380, t381, t382, t383, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x6, 0x0, 0x0, 0x0]); // in2 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in3 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in4 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in5 circuit_inputs = circuit_inputs.next_2(Q_0.x0); // in6 circuit_inputs = circuit_inputs.next_2(Q_0.x1); // in7 circuit_inputs = circuit_inputs.next_2(Q_0.y0); // in8 circuit_inputs = circuit_inputs.next_2(Q_0.y1); // in9 circuit_inputs = circuit_inputs.next_2(M_i.c0b0a0); // in10 circuit_inputs = circuit_inputs.next_2(M_i.c0b0a1); // in11 circuit_inputs = circuit_inputs.next_2(M_i.c0b1a0); // in12 circuit_inputs = circuit_inputs.next_2(M_i.c0b1a1); // in13 circuit_inputs = circuit_inputs.next_2(M_i.c0b2a0); // in14 circuit_inputs = circuit_inputs.next_2(M_i.c0b2a1); // in15 circuit_inputs = circuit_inputs.next_2(M_i.c1b0a0); // in16 circuit_inputs = circuit_inputs.next_2(M_i.c1b0a1); // in17 circuit_inputs = circuit_inputs.next_2(M_i.c1b1a0); // in18 circuit_inputs = circuit_inputs.next_2(M_i.c1b1a1); // in19 circuit_inputs = circuit_inputs.next_2(M_i.c1b2a0); // in20 circuit_inputs = circuit_inputs.next_2(M_i.c1b2a1); // in21 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t226), x1: outputs.get_output(t227), y0: outputs.get_output(t236), y1: outputs.get_output(t237), }; let Mi_plus_one: E12T = E12T { c0b0a0: outputs.get_output(t389), c0b0a1: outputs.get_output(t390), c0b1a0: outputs.get_output(t391), c0b1a1: outputs.get_output(t392), c0b2a0: outputs.get_output(t393), c0b2a1: outputs.get_output(t394), c1b0a0: outputs.get_output(t378), c1b0a1: outputs.get_output(t379), c1b1a0: outputs.get_output(t380), c1b1a1: outputs.get_output(t381), c1b2a0: outputs.get_output(t382), c1b2a1: outputs.get_output(t383), }; return (Q0, Mi_plus_one); } #[inline(always)] pub fn run_BLS12_381_TOWER_MILLER_BIT1_1P_circuit( yInv_0: u384, xNegOverY_0: u384, Q_0: G2Point, Q_or_Q_neg_0: G2Point, M_i: E12T, ) -> (G2Point, E12T) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x1 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let in23 = CE::> {}; let t0 = circuit_sub(in12, in18); // Fp6 sub coeff 0/5 let t1 = circuit_sub(in13, in19); // Fp6 sub coeff 1/5 let t2 = circuit_sub(in14, in20); // Fp6 sub coeff 2/5 let t3 = circuit_sub(in15, in21); // Fp6 sub coeff 3/5 let t4 = circuit_sub(in16, in22); // Fp6 sub coeff 4/5 let t5 = circuit_sub(in17, in23); // Fp6 sub coeff 5/5 let t6 = circuit_add(in22, in23); let t7 = circuit_add(t6, t6); let t8 = circuit_sub(in22, in23); let t9 = circuit_sub(t7, in22); let t10 = circuit_sub(t9, in23); let t11 = circuit_sub(in0, t8); // Fp6 neg coeff 0/5 let t12 = circuit_sub(in0, t10); // Fp6 neg coeff 1/5 let t13 = circuit_sub(in0, in18); // Fp6 neg coeff 2/5 let t14 = circuit_sub(in0, in19); // Fp6 neg coeff 3/5 let t15 = circuit_sub(in0, in20); // Fp6 neg coeff 4/5 let t16 = circuit_sub(in0, in21); // Fp6 neg coeff 5/5 let t17 = circuit_add(in12, t11); // Fp6 add coeff 0/5 let t18 = circuit_add(in13, t12); // Fp6 add coeff 1/5 let t19 = circuit_add(in14, t13); // Fp6 add coeff 2/5 let t20 = circuit_add(in15, t14); // Fp6 add coeff 3/5 let t21 = circuit_add(in16, t15); // Fp6 add coeff 4/5 let t22 = circuit_add(in17, t16); // Fp6 add coeff 5/5 let t23 = circuit_mul(in12, in18); // Fp2 mul start let t24 = circuit_mul(in13, in19); let t25 = circuit_sub(t23, t24); // Fp2 mul real part end let t26 = circuit_mul(in12, in19); let t27 = circuit_mul(in13, in18); let t28 = circuit_add(t26, t27); // Fp2 mul imag part end let t29 = circuit_mul(in14, in20); // Fp2 mul start let t30 = circuit_mul(in15, in21); let t31 = circuit_sub(t29, t30); // Fp2 mul real part end let t32 = circuit_mul(in14, in21); let t33 = circuit_mul(in15, in20); let t34 = circuit_add(t32, t33); // Fp2 mul imag part end let t35 = circuit_mul(in16, in22); // Fp2 mul start let t36 = circuit_mul(in17, in23); let t37 = circuit_sub(t35, t36); // Fp2 mul real part end let t38 = circuit_mul(in16, in23); let t39 = circuit_mul(in17, in22); let t40 = circuit_add(t38, t39); // Fp2 mul imag part end let t41 = circuit_add(in14, in16); // Fp2 add coeff 0/1 let t42 = circuit_add(in15, in17); // Fp2 add coeff 1/1 let t43 = circuit_add(in20, in22); // Fp2 add coeff 0/1 let t44 = circuit_add(in21, in23); // Fp2 add coeff 1/1 let t45 = circuit_mul(t41, t43); // Fp2 mul start let t46 = circuit_mul(t42, t44); let t47 = circuit_sub(t45, t46); // Fp2 mul real part end let t48 = circuit_mul(t41, t44); let t49 = circuit_mul(t42, t43); let t50 = circuit_add(t48, t49); // Fp2 mul imag part end let t51 = circuit_sub(t47, t31); // Fp2 sub coeff 0/1 let t52 = circuit_sub(t50, t34); // Fp2 sub coeff 1/1 let t53 = circuit_sub(t51, t37); // Fp2 sub coeff 0/1 let t54 = circuit_sub(t52, t40); // Fp2 sub coeff 1/1 let t55 = circuit_add(t53, t54); let t56 = circuit_add(t55, t55); let t57 = circuit_sub(t53, t54); let t58 = circuit_sub(t56, t53); let t59 = circuit_sub(t58, t54); let t60 = circuit_add(t57, t25); // Fp2 add coeff 0/1 let t61 = circuit_add(t59, t28); // Fp2 add coeff 1/1 let t62 = circuit_add(in12, in14); // Fp2 add coeff 0/1 let t63 = circuit_add(in13, in15); // Fp2 add coeff 1/1 let t64 = circuit_add(in18, in20); // Fp2 add coeff 0/1 let t65 = circuit_add(in19, in21); // Fp2 add coeff 1/1 let t66 = circuit_mul(t62, t64); // Fp2 mul start let t67 = circuit_mul(t63, t65); let t68 = circuit_sub(t66, t67); // Fp2 mul real part end let t69 = circuit_mul(t62, t65); let t70 = circuit_mul(t63, t64); let t71 = circuit_add(t69, t70); // Fp2 mul imag part end let t72 = circuit_sub(t68, t25); // Fp2 sub coeff 0/1 let t73 = circuit_sub(t71, t28); // Fp2 sub coeff 1/1 let t74 = circuit_sub(t72, t31); // Fp2 sub coeff 0/1 let t75 = circuit_sub(t73, t34); // Fp2 sub coeff 1/1 let t76 = circuit_add(t37, t40); let t77 = circuit_add(t76, t76); let t78 = circuit_sub(t37, t40); let t79 = circuit_sub(t77, t37); let t80 = circuit_sub(t79, t40); let t81 = circuit_add(t74, t78); // Fp2 add coeff 0/1 let t82 = circuit_add(t75, t80); // Fp2 add coeff 1/1 let t83 = circuit_add(in12, in16); // Fp2 add coeff 0/1 let t84 = circuit_add(in13, in17); // Fp2 add coeff 1/1 let t85 = circuit_add(in18, in22); // Fp2 add coeff 0/1 let t86 = circuit_add(in19, in23); // Fp2 add coeff 1/1 let t87 = circuit_mul(t85, t83); // Fp2 mul start let t88 = circuit_mul(t86, t84); let t89 = circuit_sub(t87, t88); // Fp2 mul real part end let t90 = circuit_mul(t85, t84); let t91 = circuit_mul(t86, t83); let t92 = circuit_add(t90, t91); // Fp2 mul imag part end let t93 = circuit_sub(t89, t25); // Fp2 sub coeff 0/1 let t94 = circuit_sub(t92, t28); // Fp2 sub coeff 1/1 let t95 = circuit_sub(t93, t37); // Fp2 sub coeff 0/1 let t96 = circuit_sub(t94, t40); // Fp2 sub coeff 1/1 let t97 = circuit_add(t95, t31); // Fp2 add coeff 0/1 let t98 = circuit_add(t96, t34); // Fp2 add coeff 1/1 let t99 = circuit_mul(t0, t17); // Fp2 mul start let t100 = circuit_mul(t1, t18); let t101 = circuit_sub(t99, t100); // Fp2 mul real part end let t102 = circuit_mul(t0, t18); let t103 = circuit_mul(t1, t17); let t104 = circuit_add(t102, t103); // Fp2 mul imag part end let t105 = circuit_mul(t2, t19); // Fp2 mul start let t106 = circuit_mul(t3, t20); let t107 = circuit_sub(t105, t106); // Fp2 mul real part end let t108 = circuit_mul(t2, t20); let t109 = circuit_mul(t3, t19); let t110 = circuit_add(t108, t109); // Fp2 mul imag part end let t111 = circuit_mul(t4, t21); // Fp2 mul start let t112 = circuit_mul(t5, t22); let t113 = circuit_sub(t111, t112); // Fp2 mul real part end let t114 = circuit_mul(t4, t22); let t115 = circuit_mul(t5, t21); let t116 = circuit_add(t114, t115); // Fp2 mul imag part end let t117 = circuit_add(t2, t4); // Fp2 add coeff 0/1 let t118 = circuit_add(t3, t5); // Fp2 add coeff 1/1 let t119 = circuit_add(t19, t21); // Fp2 add coeff 0/1 let t120 = circuit_add(t20, t22); // Fp2 add coeff 1/1 let t121 = circuit_mul(t117, t119); // Fp2 mul start let t122 = circuit_mul(t118, t120); let t123 = circuit_sub(t121, t122); // Fp2 mul real part end let t124 = circuit_mul(t117, t120); let t125 = circuit_mul(t118, t119); let t126 = circuit_add(t124, t125); // Fp2 mul imag part end let t127 = circuit_sub(t123, t107); // Fp2 sub coeff 0/1 let t128 = circuit_sub(t126, t110); // Fp2 sub coeff 1/1 let t129 = circuit_sub(t127, t113); // Fp2 sub coeff 0/1 let t130 = circuit_sub(t128, t116); // Fp2 sub coeff 1/1 let t131 = circuit_add(t129, t130); let t132 = circuit_add(t131, t131); let t133 = circuit_sub(t129, t130); let t134 = circuit_sub(t132, t129); let t135 = circuit_sub(t134, t130); let t136 = circuit_add(t133, t101); // Fp2 add coeff 0/1 let t137 = circuit_add(t135, t104); // Fp2 add coeff 1/1 let t138 = circuit_add(t0, t2); // Fp2 add coeff 0/1 let t139 = circuit_add(t1, t3); // Fp2 add coeff 1/1 let t140 = circuit_add(t17, t19); // Fp2 add coeff 0/1 let t141 = circuit_add(t18, t20); // Fp2 add coeff 1/1 let t142 = circuit_mul(t138, t140); // Fp2 mul start let t143 = circuit_mul(t139, t141); let t144 = circuit_sub(t142, t143); // Fp2 mul real part end let t145 = circuit_mul(t138, t141); let t146 = circuit_mul(t139, t140); let t147 = circuit_add(t145, t146); // Fp2 mul imag part end let t148 = circuit_sub(t144, t101); // Fp2 sub coeff 0/1 let t149 = circuit_sub(t147, t104); // Fp2 sub coeff 1/1 let t150 = circuit_sub(t148, t107); // Fp2 sub coeff 0/1 let t151 = circuit_sub(t149, t110); // Fp2 sub coeff 1/1 let t152 = circuit_add(t113, t116); let t153 = circuit_add(t152, t152); let t154 = circuit_sub(t113, t116); let t155 = circuit_sub(t153, t113); let t156 = circuit_sub(t155, t116); let t157 = circuit_add(t150, t154); // Fp2 add coeff 0/1 let t158 = circuit_add(t151, t156); // Fp2 add coeff 1/1 let t159 = circuit_add(t0, t4); // Fp2 add coeff 0/1 let t160 = circuit_add(t1, t5); // Fp2 add coeff 1/1 let t161 = circuit_add(t17, t21); // Fp2 add coeff 0/1 let t162 = circuit_add(t18, t22); // Fp2 add coeff 1/1 let t163 = circuit_mul(t161, t159); // Fp2 mul start let t164 = circuit_mul(t162, t160); let t165 = circuit_sub(t163, t164); // Fp2 mul real part end let t166 = circuit_mul(t161, t160); let t167 = circuit_mul(t162, t159); let t168 = circuit_add(t166, t167); // Fp2 mul imag part end let t169 = circuit_sub(t165, t101); // Fp2 sub coeff 0/1 let t170 = circuit_sub(t168, t104); // Fp2 sub coeff 1/1 let t171 = circuit_sub(t169, t113); // Fp2 sub coeff 0/1 let t172 = circuit_sub(t170, t116); // Fp2 sub coeff 1/1 let t173 = circuit_add(t171, t107); // Fp2 add coeff 0/1 let t174 = circuit_add(t172, t110); // Fp2 add coeff 1/1 let t175 = circuit_add(t136, t60); // Fp6 add coeff 0/5 let t176 = circuit_add(t137, t61); // Fp6 add coeff 1/5 let t177 = circuit_add(t157, t81); // Fp6 add coeff 2/5 let t178 = circuit_add(t158, t82); // Fp6 add coeff 3/5 let t179 = circuit_add(t173, t97); // Fp6 add coeff 4/5 let t180 = circuit_add(t174, t98); // Fp6 add coeff 5/5 let t181 = circuit_add(t60, t60); // Fp6 add coeff 0/5 let t182 = circuit_add(t61, t61); // Fp6 add coeff 1/5 let t183 = circuit_add(t81, t81); // Fp6 add coeff 2/5 let t184 = circuit_add(t82, t82); // Fp6 add coeff 3/5 let t185 = circuit_add(t97, t97); // Fp6 add coeff 4/5 let t186 = circuit_add(t98, t98); // Fp6 add coeff 5/5 let t187 = circuit_add(t97, t98); let t188 = circuit_add(t187, t187); let t189 = circuit_sub(t97, t98); let t190 = circuit_sub(t188, t97); let t191 = circuit_sub(t190, t98); let t192 = circuit_add(t175, t189); // Fp6 add coeff 0/5 let t193 = circuit_add(t176, t191); // Fp6 add coeff 1/5 let t194 = circuit_add(t177, t60); // Fp6 add coeff 2/5 let t195 = circuit_add(t178, t61); // Fp6 add coeff 3/5 let t196 = circuit_add(t179, t81); // Fp6 add coeff 4/5 let t197 = circuit_add(t180, t82); // Fp6 add coeff 5/5 let t198 = circuit_sub(in6, in10); // Fp2 sub coeff 0/1 let t199 = circuit_sub(in7, in11); // Fp2 sub coeff 1/1 let t200 = circuit_sub(in4, in8); // Fp2 sub coeff 0/1 let t201 = circuit_sub(in5, in9); // Fp2 sub coeff 1/1 let t202 = circuit_mul(t200, t200); // Fp2 Inv start let t203 = circuit_mul(t201, t201); let t204 = circuit_add(t202, t203); let t205 = circuit_inverse(t204); let t206 = circuit_mul(t200, t205); // Fp2 Inv real part end let t207 = circuit_mul(t201, t205); let t208 = circuit_sub(in0, t207); // Fp2 Inv imag part end let t209 = circuit_mul(t198, t206); // Fp2 mul start let t210 = circuit_mul(t199, t208); let t211 = circuit_sub(t209, t210); // Fp2 mul real part end let t212 = circuit_mul(t198, t208); let t213 = circuit_mul(t199, t206); let t214 = circuit_add(t212, t213); // Fp2 mul imag part end let t215 = circuit_add(t211, t214); let t216 = circuit_sub(t211, t214); let t217 = circuit_mul(t215, t216); let t218 = circuit_mul(t211, t214); let t219 = circuit_add(t218, t218); let t220 = circuit_add(in4, in8); // Fp2 add coeff 0/1 let t221 = circuit_add(in5, in9); // Fp2 add coeff 1/1 let t222 = circuit_sub(t217, t220); // Fp2 sub coeff 0/1 let t223 = circuit_sub(t219, t221); // Fp2 sub coeff 1/1 let t224 = circuit_mul(t211, in4); // Fp2 mul start let t225 = circuit_mul(t214, in5); let t226 = circuit_sub(t224, t225); // Fp2 mul real part end let t227 = circuit_mul(t211, in5); let t228 = circuit_mul(t214, in4); let t229 = circuit_add(t227, t228); // Fp2 mul imag part end let t230 = circuit_sub(t226, in6); // Fp2 sub coeff 0/1 let t231 = circuit_sub(t229, in7); // Fp2 sub coeff 1/1 let t232 = circuit_add(in6, in6); // Fp2 add coeff 0/1 let t233 = circuit_add(in7, in7); // Fp2 add coeff 1/1 let t234 = circuit_sub(t222, in4); // Fp2 sub coeff 0/1 let t235 = circuit_sub(t223, in5); // Fp2 sub coeff 1/1 let t236 = circuit_mul(t234, t234); // Fp2 Inv start let t237 = circuit_mul(t235, t235); let t238 = circuit_add(t236, t237); let t239 = circuit_inverse(t238); let t240 = circuit_mul(t234, t239); // Fp2 Inv real part end let t241 = circuit_mul(t235, t239); let t242 = circuit_sub(in0, t241); // Fp2 Inv imag part end let t243 = circuit_mul(t232, t240); // Fp2 mul start let t244 = circuit_mul(t233, t242); let t245 = circuit_sub(t243, t244); // Fp2 mul real part end let t246 = circuit_mul(t232, t242); let t247 = circuit_mul(t233, t240); let t248 = circuit_add(t246, t247); // Fp2 mul imag part end let t249 = circuit_add(t211, t245); // Fp2 add coeff 0/1 let t250 = circuit_add(t214, t248); // Fp2 add coeff 1/1 let t251 = circuit_sub(in0, t249); // Fp2 neg coeff 0/1 let t252 = circuit_sub(in0, t250); // Fp2 neg coeff 1/1 let t253 = circuit_add(t251, t252); let t254 = circuit_sub(t251, t252); let t255 = circuit_mul(t253, t254); let t256 = circuit_mul(t251, t252); let t257 = circuit_add(t256, t256); let t258 = circuit_sub(t255, in4); // Fp2 sub coeff 0/1 let t259 = circuit_sub(t257, in5); // Fp2 sub coeff 1/1 let t260 = circuit_sub(t258, t222); // Fp2 sub coeff 0/1 let t261 = circuit_sub(t259, t223); // Fp2 sub coeff 1/1 let t262 = circuit_sub(in4, t260); // Fp2 sub coeff 0/1 let t263 = circuit_sub(in5, t261); // Fp2 sub coeff 1/1 let t264 = circuit_mul(t251, t262); // Fp2 mul start let t265 = circuit_mul(t252, t263); let t266 = circuit_sub(t264, t265); // Fp2 mul real part end let t267 = circuit_mul(t251, t263); let t268 = circuit_mul(t252, t262); let t269 = circuit_add(t267, t268); // Fp2 mul imag part end let t270 = circuit_sub(t266, in6); // Fp2 sub coeff 0/1 let t271 = circuit_sub(t269, in7); // Fp2 sub coeff 1/1 let t272 = circuit_mul(t251, in4); // Fp2 mul start let t273 = circuit_mul(t252, in5); let t274 = circuit_sub(t272, t273); // Fp2 mul real part end let t275 = circuit_mul(t251, in5); let t276 = circuit_mul(t252, in4); let t277 = circuit_add(t275, t276); // Fp2 mul imag part end let t278 = circuit_sub(t274, in6); // Fp2 sub coeff 0/1 let t279 = circuit_sub(t277, in7); // Fp2 sub coeff 1/1 let t280 = circuit_mul(t230, in2); let t281 = circuit_mul(t231, in2); let t282 = circuit_mul(t211, in3); let t283 = circuit_mul(t214, in3); let t284 = circuit_mul(t278, in2); let t285 = circuit_mul(t279, in2); let t286 = circuit_mul(t251, in3); let t287 = circuit_mul(t252, in3); let t288 = circuit_mul(t192, t280); // Fp2 mul start let t289 = circuit_mul(t193, t281); let t290 = circuit_sub(t288, t289); // Fp2 mul real part end let t291 = circuit_mul(t192, t281); let t292 = circuit_mul(t193, t280); let t293 = circuit_add(t291, t292); // Fp2 mul imag part end let t294 = circuit_mul(t194, t282); // Fp2 mul start let t295 = circuit_mul(t195, t283); let t296 = circuit_sub(t294, t295); // Fp2 mul real part end let t297 = circuit_mul(t194, t283); let t298 = circuit_mul(t195, t282); let t299 = circuit_add(t297, t298); // Fp2 mul imag part end let t300 = circuit_add(t194, t196); // Fp2 add coeff 0/1 let t301 = circuit_add(t195, t197); // Fp2 add coeff 1/1 let t302 = circuit_mul(t282, t300); // Fp2 mul start let t303 = circuit_mul(t283, t301); let t304 = circuit_sub(t302, t303); // Fp2 mul real part end let t305 = circuit_mul(t282, t301); let t306 = circuit_mul(t283, t300); let t307 = circuit_add(t305, t306); // Fp2 mul imag part end let t308 = circuit_sub(t304, t296); // Fp2 sub coeff 0/1 let t309 = circuit_sub(t307, t299); // Fp2 sub coeff 1/1 let t310 = circuit_add(t308, t309); let t311 = circuit_add(t310, t310); let t312 = circuit_sub(t308, t309); let t313 = circuit_sub(t311, t308); let t314 = circuit_sub(t313, t309); let t315 = circuit_add(t312, t290); // Fp2 add coeff 0/1 let t316 = circuit_add(t314, t293); // Fp2 add coeff 1/1 let t317 = circuit_add(t192, t196); // Fp2 add coeff 0/1 let t318 = circuit_add(t193, t197); // Fp2 add coeff 1/1 let t319 = circuit_mul(t280, t317); // Fp2 mul start let t320 = circuit_mul(t281, t318); let t321 = circuit_sub(t319, t320); // Fp2 mul real part end let t322 = circuit_mul(t280, t318); let t323 = circuit_mul(t281, t317); let t324 = circuit_add(t322, t323); // Fp2 mul imag part end let t325 = circuit_sub(t321, t290); // Fp2 sub coeff 0/1 let t326 = circuit_sub(t324, t293); // Fp2 sub coeff 1/1 let t327 = circuit_add(t325, t296); // Fp2 add coeff 0/1 let t328 = circuit_add(t326, t299); // Fp2 add coeff 1/1 let t329 = circuit_add(t280, t282); // Fp2 add coeff 0/1 let t330 = circuit_add(t281, t283); // Fp2 add coeff 1/1 let t331 = circuit_add(t192, t194); // Fp2 add coeff 0/1 let t332 = circuit_add(t193, t195); // Fp2 add coeff 1/1 let t333 = circuit_mul(t329, t331); // Fp2 mul start let t334 = circuit_mul(t330, t332); let t335 = circuit_sub(t333, t334); // Fp2 mul real part end let t336 = circuit_mul(t329, t332); let t337 = circuit_mul(t330, t331); let t338 = circuit_add(t336, t337); // Fp2 mul imag part end let t339 = circuit_sub(t335, t290); // Fp2 sub coeff 0/1 let t340 = circuit_sub(t338, t293); // Fp2 sub coeff 1/1 let t341 = circuit_sub(t339, t296); // Fp2 sub coeff 0/1 let t342 = circuit_sub(t340, t299); // Fp2 sub coeff 1/1 let t343 = circuit_add(t185, t186); let t344 = circuit_add(t343, t343); let t345 = circuit_sub(t185, t186); let t346 = circuit_sub(t344, t185); let t347 = circuit_sub(t346, t186); let t348 = circuit_add(in1, t282); let t349 = circuit_add(t181, t192); // Fp6 add coeff 0/5 let t350 = circuit_add(t182, t193); // Fp6 add coeff 1/5 let t351 = circuit_add(t183, t194); // Fp6 add coeff 2/5 let t352 = circuit_add(t184, t195); // Fp6 add coeff 3/5 let t353 = circuit_add(t185, t196); // Fp6 add coeff 4/5 let t354 = circuit_add(t186, t197); // Fp6 add coeff 5/5 let t355 = circuit_mul(t349, t280); // Fp2 mul start let t356 = circuit_mul(t350, t281); let t357 = circuit_sub(t355, t356); // Fp2 mul real part end let t358 = circuit_mul(t349, t281); let t359 = circuit_mul(t350, t280); let t360 = circuit_add(t358, t359); // Fp2 mul imag part end let t361 = circuit_mul(t351, t348); // Fp2 mul start let t362 = circuit_mul(t352, t283); let t363 = circuit_sub(t361, t362); // Fp2 mul real part end let t364 = circuit_mul(t351, t283); let t365 = circuit_mul(t352, t348); let t366 = circuit_add(t364, t365); // Fp2 mul imag part end let t367 = circuit_add(t351, t353); // Fp2 add coeff 0/1 let t368 = circuit_add(t352, t354); // Fp2 add coeff 1/1 let t369 = circuit_mul(t348, t367); // Fp2 mul start let t370 = circuit_mul(t283, t368); let t371 = circuit_sub(t369, t370); // Fp2 mul real part end let t372 = circuit_mul(t348, t368); let t373 = circuit_mul(t283, t367); let t374 = circuit_add(t372, t373); // Fp2 mul imag part end let t375 = circuit_sub(t371, t363); // Fp2 sub coeff 0/1 let t376 = circuit_sub(t374, t366); // Fp2 sub coeff 1/1 let t377 = circuit_add(t375, t376); let t378 = circuit_add(t377, t377); let t379 = circuit_sub(t375, t376); let t380 = circuit_sub(t378, t375); let t381 = circuit_sub(t380, t376); let t382 = circuit_add(t379, t357); // Fp2 add coeff 0/1 let t383 = circuit_add(t381, t360); // Fp2 add coeff 1/1 let t384 = circuit_add(t349, t353); // Fp2 add coeff 0/1 let t385 = circuit_add(t350, t354); // Fp2 add coeff 1/1 let t386 = circuit_mul(t280, t384); // Fp2 mul start let t387 = circuit_mul(t281, t385); let t388 = circuit_sub(t386, t387); // Fp2 mul real part end let t389 = circuit_mul(t280, t385); let t390 = circuit_mul(t281, t384); let t391 = circuit_add(t389, t390); // Fp2 mul imag part end let t392 = circuit_sub(t388, t357); // Fp2 sub coeff 0/1 let t393 = circuit_sub(t391, t360); // Fp2 sub coeff 1/1 let t394 = circuit_add(t392, t363); // Fp2 add coeff 0/1 let t395 = circuit_add(t393, t366); // Fp2 add coeff 1/1 let t396 = circuit_add(t280, t348); // Fp2 add coeff 0/1 let t397 = circuit_add(t281, t283); // Fp2 add coeff 1/1 let t398 = circuit_add(t349, t351); // Fp2 add coeff 0/1 let t399 = circuit_add(t350, t352); // Fp2 add coeff 1/1 let t400 = circuit_mul(t396, t398); // Fp2 mul start let t401 = circuit_mul(t397, t399); let t402 = circuit_sub(t400, t401); // Fp2 mul real part end let t403 = circuit_mul(t396, t399); let t404 = circuit_mul(t397, t398); let t405 = circuit_add(t403, t404); // Fp2 mul imag part end let t406 = circuit_sub(t402, t357); // Fp2 sub coeff 0/1 let t407 = circuit_sub(t405, t360); // Fp2 sub coeff 1/1 let t408 = circuit_sub(t406, t363); // Fp2 sub coeff 0/1 let t409 = circuit_sub(t407, t366); // Fp2 sub coeff 1/1 let t410 = circuit_sub(t382, t315); // Fp6 sub coeff 0/5 let t411 = circuit_sub(t383, t316); // Fp6 sub coeff 1/5 let t412 = circuit_sub(t408, t341); // Fp6 sub coeff 2/5 let t413 = circuit_sub(t409, t342); // Fp6 sub coeff 3/5 let t414 = circuit_sub(t394, t327); // Fp6 sub coeff 4/5 let t415 = circuit_sub(t395, t328); // Fp6 sub coeff 5/5 let t416 = circuit_sub(t410, t345); // Fp6 sub coeff 0/5 let t417 = circuit_sub(t411, t347); // Fp6 sub coeff 1/5 let t418 = circuit_sub(t412, t181); // Fp6 sub coeff 2/5 let t419 = circuit_sub(t413, t182); // Fp6 sub coeff 3/5 let t420 = circuit_sub(t414, t183); // Fp6 sub coeff 4/5 let t421 = circuit_sub(t415, t184); // Fp6 sub coeff 5/5 let t422 = circuit_add(t183, t184); let t423 = circuit_add(t422, t422); let t424 = circuit_sub(t183, t184); let t425 = circuit_sub(t423, t183); let t426 = circuit_sub(t425, t184); let t427 = circuit_add(t424, t315); // Fp6 add coeff 0/5 let t428 = circuit_add(t426, t316); // Fp6 add coeff 1/5 let t429 = circuit_add(t345, t341); // Fp6 add coeff 2/5 let t430 = circuit_add(t347, t342); // Fp6 add coeff 3/5 let t431 = circuit_add(t181, t327); // Fp6 add coeff 4/5 let t432 = circuit_add(t182, t328); // Fp6 add coeff 5/5 let t433 = circuit_mul(t427, t284); // Fp2 mul start let t434 = circuit_mul(t428, t285); let t435 = circuit_sub(t433, t434); // Fp2 mul real part end let t436 = circuit_mul(t427, t285); let t437 = circuit_mul(t428, t284); let t438 = circuit_add(t436, t437); // Fp2 mul imag part end let t439 = circuit_mul(t429, t286); // Fp2 mul start let t440 = circuit_mul(t430, t287); let t441 = circuit_sub(t439, t440); // Fp2 mul real part end let t442 = circuit_mul(t429, t287); let t443 = circuit_mul(t430, t286); let t444 = circuit_add(t442, t443); // Fp2 mul imag part end let t445 = circuit_add(t429, t431); // Fp2 add coeff 0/1 let t446 = circuit_add(t430, t432); // Fp2 add coeff 1/1 let t447 = circuit_mul(t286, t445); // Fp2 mul start let t448 = circuit_mul(t287, t446); let t449 = circuit_sub(t447, t448); // Fp2 mul real part end let t450 = circuit_mul(t286, t446); let t451 = circuit_mul(t287, t445); let t452 = circuit_add(t450, t451); // Fp2 mul imag part end let t453 = circuit_sub(t449, t441); // Fp2 sub coeff 0/1 let t454 = circuit_sub(t452, t444); // Fp2 sub coeff 1/1 let t455 = circuit_add(t453, t454); let t456 = circuit_add(t455, t455); let t457 = circuit_sub(t453, t454); let t458 = circuit_sub(t456, t453); let t459 = circuit_sub(t458, t454); let t460 = circuit_add(t457, t435); // Fp2 add coeff 0/1 let t461 = circuit_add(t459, t438); // Fp2 add coeff 1/1 let t462 = circuit_add(t427, t431); // Fp2 add coeff 0/1 let t463 = circuit_add(t428, t432); // Fp2 add coeff 1/1 let t464 = circuit_mul(t284, t462); // Fp2 mul start let t465 = circuit_mul(t285, t463); let t466 = circuit_sub(t464, t465); // Fp2 mul real part end let t467 = circuit_mul(t284, t463); let t468 = circuit_mul(t285, t462); let t469 = circuit_add(t467, t468); // Fp2 mul imag part end let t470 = circuit_sub(t466, t435); // Fp2 sub coeff 0/1 let t471 = circuit_sub(t469, t438); // Fp2 sub coeff 1/1 let t472 = circuit_add(t470, t441); // Fp2 add coeff 0/1 let t473 = circuit_add(t471, t444); // Fp2 add coeff 1/1 let t474 = circuit_add(t284, t286); // Fp2 add coeff 0/1 let t475 = circuit_add(t285, t287); // Fp2 add coeff 1/1 let t476 = circuit_add(t427, t429); // Fp2 add coeff 0/1 let t477 = circuit_add(t428, t430); // Fp2 add coeff 1/1 let t478 = circuit_mul(t474, t476); // Fp2 mul start let t479 = circuit_mul(t475, t477); let t480 = circuit_sub(t478, t479); // Fp2 mul real part end let t481 = circuit_mul(t474, t477); let t482 = circuit_mul(t475, t476); let t483 = circuit_add(t481, t482); // Fp2 mul imag part end let t484 = circuit_sub(t480, t435); // Fp2 sub coeff 0/1 let t485 = circuit_sub(t483, t438); // Fp2 sub coeff 1/1 let t486 = circuit_sub(t484, t441); // Fp2 sub coeff 0/1 let t487 = circuit_sub(t485, t444); // Fp2 sub coeff 1/1 let t488 = circuit_add(t420, t421); let t489 = circuit_add(t488, t488); let t490 = circuit_sub(t420, t421); let t491 = circuit_sub(t489, t420); let t492 = circuit_sub(t491, t421); let t493 = circuit_add(in1, t286); let t494 = circuit_add(t416, t427); // Fp6 add coeff 0/5 let t495 = circuit_add(t417, t428); // Fp6 add coeff 1/5 let t496 = circuit_add(t418, t429); // Fp6 add coeff 2/5 let t497 = circuit_add(t419, t430); // Fp6 add coeff 3/5 let t498 = circuit_add(t420, t431); // Fp6 add coeff 4/5 let t499 = circuit_add(t421, t432); // Fp6 add coeff 5/5 let t500 = circuit_mul(t494, t284); // Fp2 mul start let t501 = circuit_mul(t495, t285); let t502 = circuit_sub(t500, t501); // Fp2 mul real part end let t503 = circuit_mul(t494, t285); let t504 = circuit_mul(t495, t284); let t505 = circuit_add(t503, t504); // Fp2 mul imag part end let t506 = circuit_mul(t496, t493); // Fp2 mul start let t507 = circuit_mul(t497, t287); let t508 = circuit_sub(t506, t507); // Fp2 mul real part end let t509 = circuit_mul(t496, t287); let t510 = circuit_mul(t497, t493); let t511 = circuit_add(t509, t510); // Fp2 mul imag part end let t512 = circuit_add(t496, t498); // Fp2 add coeff 0/1 let t513 = circuit_add(t497, t499); // Fp2 add coeff 1/1 let t514 = circuit_mul(t493, t512); // Fp2 mul start let t515 = circuit_mul(t287, t513); let t516 = circuit_sub(t514, t515); // Fp2 mul real part end let t517 = circuit_mul(t493, t513); let t518 = circuit_mul(t287, t512); let t519 = circuit_add(t517, t518); // Fp2 mul imag part end let t520 = circuit_sub(t516, t508); // Fp2 sub coeff 0/1 let t521 = circuit_sub(t519, t511); // Fp2 sub coeff 1/1 let t522 = circuit_add(t520, t521); let t523 = circuit_add(t522, t522); let t524 = circuit_sub(t520, t521); let t525 = circuit_sub(t523, t520); let t526 = circuit_sub(t525, t521); let t527 = circuit_add(t524, t502); // Fp2 add coeff 0/1 let t528 = circuit_add(t526, t505); // Fp2 add coeff 1/1 let t529 = circuit_add(t494, t498); // Fp2 add coeff 0/1 let t530 = circuit_add(t495, t499); // Fp2 add coeff 1/1 let t531 = circuit_mul(t284, t529); // Fp2 mul start let t532 = circuit_mul(t285, t530); let t533 = circuit_sub(t531, t532); // Fp2 mul real part end let t534 = circuit_mul(t284, t530); let t535 = circuit_mul(t285, t529); let t536 = circuit_add(t534, t535); // Fp2 mul imag part end let t537 = circuit_sub(t533, t502); // Fp2 sub coeff 0/1 let t538 = circuit_sub(t536, t505); // Fp2 sub coeff 1/1 let t539 = circuit_add(t537, t508); // Fp2 add coeff 0/1 let t540 = circuit_add(t538, t511); // Fp2 add coeff 1/1 let t541 = circuit_add(t284, t493); // Fp2 add coeff 0/1 let t542 = circuit_add(t285, t287); // Fp2 add coeff 1/1 let t543 = circuit_add(t494, t496); // Fp2 add coeff 0/1 let t544 = circuit_add(t495, t497); // Fp2 add coeff 1/1 let t545 = circuit_mul(t541, t543); // Fp2 mul start let t546 = circuit_mul(t542, t544); let t547 = circuit_sub(t545, t546); // Fp2 mul real part end let t548 = circuit_mul(t541, t544); let t549 = circuit_mul(t542, t543); let t550 = circuit_add(t548, t549); // Fp2 mul imag part end let t551 = circuit_sub(t547, t502); // Fp2 sub coeff 0/1 let t552 = circuit_sub(t550, t505); // Fp2 sub coeff 1/1 let t553 = circuit_sub(t551, t508); // Fp2 sub coeff 0/1 let t554 = circuit_sub(t552, t511); // Fp2 sub coeff 1/1 let t555 = circuit_sub(t527, t460); // Fp6 sub coeff 0/5 let t556 = circuit_sub(t528, t461); // Fp6 sub coeff 1/5 let t557 = circuit_sub(t553, t486); // Fp6 sub coeff 2/5 let t558 = circuit_sub(t554, t487); // Fp6 sub coeff 3/5 let t559 = circuit_sub(t539, t472); // Fp6 sub coeff 4/5 let t560 = circuit_sub(t540, t473); // Fp6 sub coeff 5/5 let t561 = circuit_sub(t555, t490); // Fp6 sub coeff 0/5 let t562 = circuit_sub(t556, t492); // Fp6 sub coeff 1/5 let t563 = circuit_sub(t557, t416); // Fp6 sub coeff 2/5 let t564 = circuit_sub(t558, t417); // Fp6 sub coeff 3/5 let t565 = circuit_sub(t559, t418); // Fp6 sub coeff 4/5 let t566 = circuit_sub(t560, t419); // Fp6 sub coeff 5/5 let t567 = circuit_add(t418, t419); let t568 = circuit_add(t567, t567); let t569 = circuit_sub(t418, t419); let t570 = circuit_sub(t568, t418); let t571 = circuit_sub(t570, t419); let t572 = circuit_add(t569, t460); // Fp6 add coeff 0/5 let t573 = circuit_add(t571, t461); // Fp6 add coeff 1/5 let t574 = circuit_add(t490, t486); // Fp6 add coeff 2/5 let t575 = circuit_add(t492, t487); // Fp6 add coeff 3/5 let t576 = circuit_add(t416, t472); // Fp6 add coeff 4/5 let t577 = circuit_add(t417, t473); // Fp6 add coeff 5/5 let t578 = circuit_add(t260, t261); let t579 = circuit_add(t578, t270); let t580 = circuit_add(t579, t271); let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = ( t580, t572, t573, t574, t575, t576, t577, t561, t562, t563, t564, t565, t566, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in2 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in3 circuit_inputs = circuit_inputs.next_2(Q_0.x0); // in4 circuit_inputs = circuit_inputs.next_2(Q_0.x1); // in5 circuit_inputs = circuit_inputs.next_2(Q_0.y0); // in6 circuit_inputs = circuit_inputs.next_2(Q_0.y1); // in7 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_0.x0); // in8 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_0.x1); // in9 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_0.y0); // in10 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_0.y1); // in11 circuit_inputs = circuit_inputs.next_2(M_i.c0b0a0); // in12 circuit_inputs = circuit_inputs.next_2(M_i.c0b0a1); // in13 circuit_inputs = circuit_inputs.next_2(M_i.c0b1a0); // in14 circuit_inputs = circuit_inputs.next_2(M_i.c0b1a1); // in15 circuit_inputs = circuit_inputs.next_2(M_i.c0b2a0); // in16 circuit_inputs = circuit_inputs.next_2(M_i.c0b2a1); // in17 circuit_inputs = circuit_inputs.next_2(M_i.c1b0a0); // in18 circuit_inputs = circuit_inputs.next_2(M_i.c1b0a1); // in19 circuit_inputs = circuit_inputs.next_2(M_i.c1b1a0); // in20 circuit_inputs = circuit_inputs.next_2(M_i.c1b1a1); // in21 circuit_inputs = circuit_inputs.next_2(M_i.c1b2a0); // in22 circuit_inputs = circuit_inputs.next_2(M_i.c1b2a1); // in23 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t260), x1: outputs.get_output(t261), y0: outputs.get_output(t270), y1: outputs.get_output(t271), }; let Mi_plus_one: E12T = E12T { c0b0a0: outputs.get_output(t572), c0b0a1: outputs.get_output(t573), c0b1a0: outputs.get_output(t574), c0b1a1: outputs.get_output(t575), c0b2a0: outputs.get_output(t576), c0b2a1: outputs.get_output(t577), c1b0a0: outputs.get_output(t561), c1b0a1: outputs.get_output(t562), c1b1a0: outputs.get_output(t563), c1b1a1: outputs.get_output(t564), c1b2a0: outputs.get_output(t565), c1b2a1: outputs.get_output(t566), }; return (Q0, Mi_plus_one); } #[inline(always)] pub fn run_BLS12_381_TOWER_MILLER_INIT_BIT_1P_circuit( yInv_0: u384, xNegOverY_0: u384, Q_0: G2Point, ) -> (G2Point, u384, u384, u384, u384, u384, u384, u384, u384, u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x3 let in1 = CE::> {}; // 0x6 let in2 = CE::> {}; // 0x0 let in3 = CE::> {}; // 0x1 // INPUT stack let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8, in9) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_add(in6, in7); let t1 = circuit_sub(in6, in7); let t2 = circuit_mul(t0, t1); let t3 = circuit_mul(in6, in7); let t4 = circuit_mul(t2, in0); let t5 = circuit_mul(t3, in1); let t6 = circuit_add(in8, in8); // Fp2 add coeff 0/1 let t7 = circuit_add(in9, in9); // Fp2 add coeff 1/1 let t8 = circuit_mul(t6, t6); // Fp2 Inv start let t9 = circuit_mul(t7, t7); let t10 = circuit_add(t8, t9); let t11 = circuit_inverse(t10); let t12 = circuit_mul(t6, t11); // Fp2 Inv real part end let t13 = circuit_mul(t7, t11); let t14 = circuit_sub(in2, t13); // Fp2 Inv imag part end let t15 = circuit_mul(t4, t12); // Fp2 mul start let t16 = circuit_mul(t5, t14); let t17 = circuit_sub(t15, t16); // Fp2 mul real part end let t18 = circuit_mul(t4, t14); let t19 = circuit_mul(t5, t12); let t20 = circuit_add(t18, t19); // Fp2 mul imag part end let t21 = circuit_mul(t17, in6); // Fp2 mul start let t22 = circuit_mul(t20, in7); let t23 = circuit_sub(t21, t22); // Fp2 mul real part end let t24 = circuit_mul(t17, in7); let t25 = circuit_mul(t20, in6); let t26 = circuit_add(t24, t25); // Fp2 mul imag part end let t27 = circuit_sub(t23, in8); // Fp2 sub coeff 0/1 let t28 = circuit_sub(t26, in9); // Fp2 sub coeff 1/1 let t29 = circuit_add(t17, t20); let t30 = circuit_sub(t17, t20); let t31 = circuit_mul(t29, t30); let t32 = circuit_mul(t17, t20); let t33 = circuit_add(t32, t32); let t34 = circuit_add(in6, in6); // Fp2 add coeff 0/1 let t35 = circuit_add(in7, in7); // Fp2 add coeff 1/1 let t36 = circuit_sub(t31, t34); // Fp2 sub coeff 0/1 let t37 = circuit_sub(t33, t35); // Fp2 sub coeff 1/1 let t38 = circuit_sub(in6, t36); // Fp2 sub coeff 0/1 let t39 = circuit_sub(in7, t37); // Fp2 sub coeff 1/1 let t40 = circuit_mul(t38, t38); // Fp2 Inv start let t41 = circuit_mul(t39, t39); let t42 = circuit_add(t40, t41); let t43 = circuit_inverse(t42); let t44 = circuit_mul(t38, t43); // Fp2 Inv real part end let t45 = circuit_mul(t39, t43); let t46 = circuit_sub(in2, t45); // Fp2 Inv imag part end let t47 = circuit_mul(t6, t44); // Fp2 mul start let t48 = circuit_mul(t7, t46); let t49 = circuit_sub(t47, t48); // Fp2 mul real part end let t50 = circuit_mul(t6, t46); let t51 = circuit_mul(t7, t44); let t52 = circuit_add(t50, t51); // Fp2 mul imag part end let t53 = circuit_sub(t49, t17); // Fp2 sub coeff 0/1 let t54 = circuit_sub(t52, t20); // Fp2 sub coeff 1/1 let t55 = circuit_mul(t53, in6); // Fp2 mul start let t56 = circuit_mul(t54, in7); let t57 = circuit_sub(t55, t56); // Fp2 mul real part end let t58 = circuit_mul(t53, in7); let t59 = circuit_mul(t54, in6); let t60 = circuit_add(t58, t59); // Fp2 mul imag part end let t61 = circuit_sub(t57, in8); // Fp2 sub coeff 0/1 let t62 = circuit_sub(t60, in9); // Fp2 sub coeff 1/1 let t63 = circuit_add(t53, t54); let t64 = circuit_sub(t53, t54); let t65 = circuit_mul(t63, t64); let t66 = circuit_mul(t53, t54); let t67 = circuit_add(t66, t66); let t68 = circuit_add(in6, t36); // Fp2 add coeff 0/1 let t69 = circuit_add(in7, t37); // Fp2 add coeff 1/1 let t70 = circuit_sub(t65, t68); // Fp2 sub coeff 0/1 let t71 = circuit_sub(t67, t69); // Fp2 sub coeff 1/1 let t72 = circuit_sub(in6, t70); // Fp2 sub coeff 0/1 let t73 = circuit_sub(in7, t71); // Fp2 sub coeff 1/1 let t74 = circuit_mul(t53, t72); // Fp2 mul start let t75 = circuit_mul(t54, t73); let t76 = circuit_sub(t74, t75); // Fp2 mul real part end let t77 = circuit_mul(t53, t73); let t78 = circuit_mul(t54, t72); let t79 = circuit_add(t77, t78); // Fp2 mul imag part end let t80 = circuit_sub(t76, in8); // Fp2 sub coeff 0/1 let t81 = circuit_sub(t79, in9); // Fp2 sub coeff 1/1 let t82 = circuit_mul(t27, in4); let t83 = circuit_mul(t28, in4); let t84 = circuit_mul(t17, in5); let t85 = circuit_mul(t20, in5); let t86 = circuit_mul(t61, in4); let t87 = circuit_mul(t62, in4); let t88 = circuit_mul(t53, in5); let t89 = circuit_mul(t54, in5); let t90 = circuit_mul(t86, t82); // Fp2 mul start let t91 = circuit_mul(t87, t83); let t92 = circuit_sub(t90, t91); // Fp2 mul real part end let t93 = circuit_mul(t86, t83); let t94 = circuit_mul(t87, t82); let t95 = circuit_add(t93, t94); // Fp2 mul imag part end let t96 = circuit_mul(t88, t84); // Fp2 mul start let t97 = circuit_mul(t89, t85); let t98 = circuit_sub(t96, t97); // Fp2 mul real part end let t99 = circuit_mul(t88, t85); let t100 = circuit_mul(t89, t84); let t101 = circuit_add(t99, t100); // Fp2 mul imag part end let t102 = circuit_add(t82, t86); // Fp2 add coeff 0/1 let t103 = circuit_add(t83, t87); // Fp2 add coeff 1/1 let t104 = circuit_add(t86, t88); // Fp2 add coeff 0/1 let t105 = circuit_add(t87, t89); // Fp2 add coeff 1/1 let t106 = circuit_add(t82, t84); // Fp2 add coeff 0/1 let t107 = circuit_add(t83, t85); // Fp2 add coeff 1/1 let t108 = circuit_mul(t106, t104); // Fp2 mul start let t109 = circuit_mul(t107, t105); let t110 = circuit_sub(t108, t109); // Fp2 mul real part end let t111 = circuit_mul(t106, t105); let t112 = circuit_mul(t107, t104); let t113 = circuit_add(t111, t112); // Fp2 mul imag part end let t114 = circuit_sub(t110, t92); // Fp2 sub coeff 0/1 let t115 = circuit_sub(t113, t95); // Fp2 sub coeff 1/1 let t116 = circuit_sub(t114, t98); // Fp2 sub coeff 0/1 let t117 = circuit_sub(t115, t101); // Fp2 sub coeff 1/1 let t118 = circuit_add(t84, t88); // Fp2 add coeff 0/1 let t119 = circuit_add(t85, t89); // Fp2 add coeff 1/1 let t120 = circuit_add(in3, in2); let t121 = circuit_add(t120, t120); let t122 = circuit_sub(in3, in2); let t123 = circuit_sub(t121, in3); let t124 = circuit_sub(t123, in2); let t125 = circuit_add(t122, t92); // Fp2 add coeff 0/1 let t126 = circuit_add(t124, t95); // Fp2 add coeff 1/1 let modulus = crate::definitions::get_BLS12_381_modulus(); // BLS12_381 prime field modulus let mut circuit_inputs = ( t70, t71, t80, t81, t125, t126, t116, t117, t98, t101, t102, t103, t118, t119, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x6, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in2 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in3 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in4 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in5 circuit_inputs = circuit_inputs.next_2(Q_0.x0); // in6 circuit_inputs = circuit_inputs.next_2(Q_0.x1); // in7 circuit_inputs = circuit_inputs.next_2(Q_0.y0); // in8 circuit_inputs = circuit_inputs.next_2(Q_0.y1); // in9 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t70), x1: outputs.get_output(t71), y0: outputs.get_output(t80), y1: outputs.get_output(t81), }; let c0b0a0: u384 = outputs.get_output(t125); let c0b0a1: u384 = outputs.get_output(t126); let c0b1a0: u384 = outputs.get_output(t116); let c0b1a1: u384 = outputs.get_output(t117); let c0b2a0: u384 = outputs.get_output(t98); let c0b2a1: u384 = outputs.get_output(t101); let c1b1a0: u384 = outputs.get_output(t102); let c1b1a1: u384 = outputs.get_output(t103); let c1b2a0: u384 = outputs.get_output(t118); let c1b2a1: u384 = outputs.get_output(t119); return (Q0, c0b0a0, c0b0a1, c0b1a0, c0b1a1, c0b2a0, c0b2a1, c1b1a0, c1b1a1, c1b2a0, c1b2a1); } #[inline(always)] pub fn run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(M: E12T) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0xa let in1 = CE::> {}; // 0x9 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_add(in10, in11); let t1 = circuit_sub(in10, in11); let t2 = circuit_mul(t0, t1); let t3 = circuit_mul(in10, in11); let t4 = circuit_add(t3, t3); let t5 = circuit_add(in2, in3); let t6 = circuit_sub(in2, in3); let t7 = circuit_mul(t5, t6); let t8 = circuit_mul(in2, in3); let t9 = circuit_add(t8, t8); let t10 = circuit_add(in10, in2); // Fp2 add coeff 0/1 let t11 = circuit_add(in11, in3); // Fp2 add coeff 1/1 let t12 = circuit_add(t10, t11); let t13 = circuit_sub(t10, t11); let t14 = circuit_mul(t12, t13); let t15 = circuit_mul(t10, t11); let t16 = circuit_add(t15, t15); let t17 = circuit_sub(t14, t2); // Fp2 sub coeff 0/1 let t18 = circuit_sub(t16, t4); // Fp2 sub coeff 1/1 let t19 = circuit_sub(t17, t7); // Fp2 sub coeff 0/1 let t20 = circuit_sub(t18, t9); // Fp2 sub coeff 1/1 let t21 = circuit_add(in6, in7); let t22 = circuit_sub(in6, in7); let t23 = circuit_mul(t21, t22); let t24 = circuit_mul(in6, in7); let t25 = circuit_add(t24, t24); let t26 = circuit_add(in8, in9); let t27 = circuit_sub(in8, in9); let t28 = circuit_mul(t26, t27); let t29 = circuit_mul(in8, in9); let t30 = circuit_add(t29, t29); let t31 = circuit_add(in6, in8); // Fp2 add coeff 0/1 let t32 = circuit_add(in7, in9); // Fp2 add coeff 1/1 let t33 = circuit_add(t31, t32); let t34 = circuit_sub(t31, t32); let t35 = circuit_mul(t33, t34); let t36 = circuit_mul(t31, t32); let t37 = circuit_add(t36, t36); let t38 = circuit_sub(t35, t23); // Fp2 sub coeff 0/1 let t39 = circuit_sub(t37, t25); // Fp2 sub coeff 1/1 let t40 = circuit_sub(t38, t28); // Fp2 sub coeff 0/1 let t41 = circuit_sub(t39, t30); // Fp2 sub coeff 1/1 let t42 = circuit_add(in12, in13); let t43 = circuit_sub(in12, in13); let t44 = circuit_mul(t42, t43); let t45 = circuit_mul(in12, in13); let t46 = circuit_add(t45, t45); let t47 = circuit_add(in4, in5); let t48 = circuit_sub(in4, in5); let t49 = circuit_mul(t47, t48); let t50 = circuit_mul(in4, in5); let t51 = circuit_add(t50, t50); let t52 = circuit_add(in12, in4); // Fp2 add coeff 0/1 let t53 = circuit_add(in13, in5); // Fp2 add coeff 1/1 let t54 = circuit_add(t52, t53); let t55 = circuit_sub(t52, t53); let t56 = circuit_mul(t54, t55); let t57 = circuit_mul(t52, t53); let t58 = circuit_add(t57, t57); let t59 = circuit_sub(t56, t44); // Fp2 sub coeff 0/1 let t60 = circuit_sub(t58, t46); // Fp2 sub coeff 1/1 let t61 = circuit_sub(t59, t49); // Fp2 sub coeff 0/1 let t62 = circuit_sub(t60, t51); // Fp2 sub coeff 1/1 let t63 = circuit_add(t61, t62); let t64 = circuit_mul(t63, in0); let t65 = circuit_mul(t61, in1); let t66 = circuit_sub(t65, t62); let t67 = circuit_sub(t64, t65); let t68 = circuit_sub(t67, t62); let t69 = circuit_add(t2, t4); let t70 = circuit_mul(t69, in0); let t71 = circuit_mul(t2, in1); let t72 = circuit_sub(t71, t4); let t73 = circuit_sub(t70, t71); let t74 = circuit_sub(t73, t4); let t75 = circuit_add(t72, t7); // Fp2 add coeff 0/1 let t76 = circuit_add(t74, t9); // Fp2 add coeff 1/1 let t77 = circuit_add(t23, t25); let t78 = circuit_mul(t77, in0); let t79 = circuit_mul(t23, in1); let t80 = circuit_sub(t79, t25); let t81 = circuit_sub(t78, t79); let t82 = circuit_sub(t81, t25); let t83 = circuit_add(t80, t28); // Fp2 add coeff 0/1 let t84 = circuit_add(t82, t30); // Fp2 add coeff 1/1 let t85 = circuit_add(t44, t46); let t86 = circuit_mul(t85, in0); let t87 = circuit_mul(t44, in1); let t88 = circuit_sub(t87, t46); let t89 = circuit_sub(t86, t87); let t90 = circuit_sub(t89, t46); let t91 = circuit_add(t88, t49); // Fp2 add coeff 0/1 let t92 = circuit_add(t90, t51); // Fp2 add coeff 1/1 let t93 = circuit_sub(t75, in2); // Fp2 sub coeff 0/1 let t94 = circuit_sub(t76, in3); // Fp2 sub coeff 1/1 let t95 = circuit_add(t93, t93); // Fp2 add coeff 0/1 let t96 = circuit_add(t94, t94); // Fp2 add coeff 1/1 let t97 = circuit_add(t95, t75); // Fp2 add coeff 0/1 let t98 = circuit_add(t96, t76); // Fp2 add coeff 1/1 let t99 = circuit_sub(t83, in4); // Fp2 sub coeff 0/1 let t100 = circuit_sub(t84, in5); // Fp2 sub coeff 1/1 let t101 = circuit_add(t99, t99); // Fp2 add coeff 0/1 let t102 = circuit_add(t100, t100); // Fp2 add coeff 1/1 let t103 = circuit_add(t101, t83); // Fp2 add coeff 0/1 let t104 = circuit_add(t102, t84); // Fp2 add coeff 1/1 let t105 = circuit_sub(t91, in6); // Fp2 sub coeff 0/1 let t106 = circuit_sub(t92, in7); // Fp2 sub coeff 1/1 let t107 = circuit_add(t105, t105); // Fp2 add coeff 0/1 let t108 = circuit_add(t106, t106); // Fp2 add coeff 1/1 let t109 = circuit_add(t107, t91); // Fp2 add coeff 0/1 let t110 = circuit_add(t108, t92); // Fp2 add coeff 1/1 let t111 = circuit_add(t66, in8); // Fp2 add coeff 0/1 let t112 = circuit_add(t68, in9); // Fp2 add coeff 1/1 let t113 = circuit_add(t111, t111); // Fp2 add coeff 0/1 let t114 = circuit_add(t112, t112); // Fp2 add coeff 1/1 let t115 = circuit_add(t113, t66); // Fp2 add coeff 0/1 let t116 = circuit_add(t114, t68); // Fp2 add coeff 1/1 let t117 = circuit_add(t19, in10); // Fp2 add coeff 0/1 let t118 = circuit_add(t20, in11); // Fp2 add coeff 1/1 let t119 = circuit_add(t117, t117); // Fp2 add coeff 0/1 let t120 = circuit_add(t118, t118); // Fp2 add coeff 1/1 let t121 = circuit_add(t119, t19); // Fp2 add coeff 0/1 let t122 = circuit_add(t120, t20); // Fp2 add coeff 1/1 let t123 = circuit_add(t40, in12); // Fp2 add coeff 0/1 let t124 = circuit_add(t41, in13); // Fp2 add coeff 1/1 let t125 = circuit_add(t123, t123); // Fp2 add coeff 0/1 let t126 = circuit_add(t124, t124); // Fp2 add coeff 1/1 let t127 = circuit_add(t125, t40); // Fp2 add coeff 0/1 let t128 = circuit_add(t126, t41); // Fp2 add coeff 1/1 let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t97, t98, t103, t104, t109, t110, t115, t116, t121, t122, t127, t128) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0xa, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x9, 0x0, 0x0, 0x0]); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(M.c0b0a0); // in2 circuit_inputs = circuit_inputs.next_2(M.c0b0a1); // in3 circuit_inputs = circuit_inputs.next_2(M.c0b1a0); // in4 circuit_inputs = circuit_inputs.next_2(M.c0b1a1); // in5 circuit_inputs = circuit_inputs.next_2(M.c0b2a0); // in6 circuit_inputs = circuit_inputs.next_2(M.c0b2a1); // in7 circuit_inputs = circuit_inputs.next_2(M.c1b0a0); // in8 circuit_inputs = circuit_inputs.next_2(M.c1b0a1); // in9 circuit_inputs = circuit_inputs.next_2(M.c1b1a0); // in10 circuit_inputs = circuit_inputs.next_2(M.c1b1a1); // in11 circuit_inputs = circuit_inputs.next_2(M.c1b2a0); // in12 circuit_inputs = circuit_inputs.next_2(M.c1b2a1); // in13 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t97), c0b0a1: outputs.get_output(t98), c0b1a0: outputs.get_output(t103), c0b1a1: outputs.get_output(t104), c0b2a0: outputs.get_output(t109), c0b2a1: outputs.get_output(t110), c1b0a0: outputs.get_output(t115), c1b0a1: outputs.get_output(t116), c1b1a0: outputs.get_output(t121), c1b1a1: outputs.get_output(t122), c1b2a0: outputs.get_output(t127), c1b2a1: outputs.get_output(t128), }; return (res,); } #[inline(always)] pub fn run_BN254_E12T_FROBENIUS_CUBE_circuit(M: E12T) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x856e078b755ef0abaff1c77959f25ac805ffd3d5d6942d37b746ee87bdcfb6d let in2 = CE::> {}; // 0x4f1de41b3d1766fa9f30e6dec26094f0fdf31bf98ff2631380cab2baaa586de let in3 = CE::> {}; // 0xbc58c6611c08dab19bee0f7b5b2444ee633094575b06bcb0e1a92bc3ccbf066 let in4 = CE::> {}; // 0x23d5e999e1910a12feb0f6ef0cd21d04a44a9e08737f96e55fe3ed9d730c239f let in5 = CE::> {}; // 0x19dc81cfcc82e4bbefe9608cd0acaa90894cb38dbe55d24ae86f7d391ed4a67f let in6 = CE::> {}; // 0xabf8b60be77d7306cbeee33576139d7f03a5e397d439ec7694aa2bf4c0c101 let in7 = CE::> {}; // 0x2a275b6d9896aa4cdbf17f1dca9e5ea3bbd689a3bea870f45fcc8ad066dce9ed let in8 = CE::> {}; // 0x28a411b634f09b8fb14b900e9507e9327600ecc7d8cf6ebab94d0cb3b2594c64 let in9 = CE::> {}; // 0x13c49044952c0905711699fa3b4d3f692ed68098967c84a5ebde847076261b43 let in10 = CE::< CI<10>, > {}; // 0x16db366a59b1dd0b9fb1b2282a48633d3e2ddaea200280211f25041384282499 // INPUT stack let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_sub(in0, in12); let t1 = circuit_add(in11, in0); let t2 = circuit_sub(in0, in14); let t3 = circuit_sub(in0, in16); let t4 = circuit_sub(in0, in18); let t5 = circuit_sub(in0, in20); let t6 = circuit_sub(in0, in22); let t7 = circuit_mul(in1, in13); // Fp2 mul start let t8 = circuit_mul(in2, t2); let t9 = circuit_sub(t7, t8); // Fp2 mul real part end let t10 = circuit_mul(in1, t2); let t11 = circuit_mul(in2, in13); let t12 = circuit_add(t10, t11); // Fp2 mul imag part end let t13 = circuit_mul(in3, in15); // Fp2 mul start let t14 = circuit_mul(in4, t3); let t15 = circuit_sub(t13, t14); // Fp2 mul real part end let t16 = circuit_mul(in3, t3); let t17 = circuit_mul(in4, in15); let t18 = circuit_add(t16, t17); // Fp2 mul imag part end let t19 = circuit_mul(in5, in17); // Fp2 mul start let t20 = circuit_mul(in6, t4); let t21 = circuit_sub(t19, t20); // Fp2 mul real part end let t22 = circuit_mul(in5, t4); let t23 = circuit_mul(in6, in17); let t24 = circuit_add(t22, t23); // Fp2 mul imag part end let t25 = circuit_mul(in7, in19); // Fp2 mul start let t26 = circuit_mul(in8, t5); let t27 = circuit_sub(t25, t26); // Fp2 mul real part end let t28 = circuit_mul(in7, t5); let t29 = circuit_mul(in8, in19); let t30 = circuit_add(t28, t29); // Fp2 mul imag part end let t31 = circuit_mul(in9, in21); // Fp2 mul start let t32 = circuit_mul(in10, t6); let t33 = circuit_sub(t31, t32); // Fp2 mul real part end let t34 = circuit_mul(in9, t6); let t35 = circuit_mul(in10, in21); let t36 = circuit_add(t34, t35); // Fp2 mul imag part end let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t1, t0, t9, t12, t15, t18, t21, t24, t27, t30, t33, t36).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(E12T_FROBENIUS_CUBE_BN254_CONSTANTS.span()); // in0 - in10 // Fill inputs: circuit_inputs = circuit_inputs.next_2(M.c0b0a0); // in11 circuit_inputs = circuit_inputs.next_2(M.c0b0a1); // in12 circuit_inputs = circuit_inputs.next_2(M.c0b1a0); // in13 circuit_inputs = circuit_inputs.next_2(M.c0b1a1); // in14 circuit_inputs = circuit_inputs.next_2(M.c0b2a0); // in15 circuit_inputs = circuit_inputs.next_2(M.c0b2a1); // in16 circuit_inputs = circuit_inputs.next_2(M.c1b0a0); // in17 circuit_inputs = circuit_inputs.next_2(M.c1b0a1); // in18 circuit_inputs = circuit_inputs.next_2(M.c1b1a0); // in19 circuit_inputs = circuit_inputs.next_2(M.c1b1a1); // in20 circuit_inputs = circuit_inputs.next_2(M.c1b2a0); // in21 circuit_inputs = circuit_inputs.next_2(M.c1b2a1); // in22 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t1), c0b0a1: outputs.get_output(t0), c0b1a0: outputs.get_output(t9), c0b1a1: outputs.get_output(t12), c0b2a0: outputs.get_output(t15), c0b2a1: outputs.get_output(t18), c1b0a0: outputs.get_output(t21), c1b0a1: outputs.get_output(t24), c1b1a0: outputs.get_output(t27), c1b1a1: outputs.get_output(t30), c1b2a0: outputs.get_output(t33), c1b2a1: outputs.get_output(t36), }; return (res,); } const E12T_FROBENIUS_CUBE_BN254_CONSTANTS: [u384; 11] = [ u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x5d6942d37b746ee87bdcfb6d, limb1: 0xbaff1c77959f25ac805ffd3d, limb2: 0x856e078b755ef0a, limb3: 0x0, }, u384 { limb0: 0x98ff2631380cab2baaa586de, limb1: 0xa9f30e6dec26094f0fdf31bf, limb2: 0x4f1de41b3d1766f, limb3: 0x0, }, u384 { limb0: 0x75b06bcb0e1a92bc3ccbf066, limb1: 0x19bee0f7b5b2444ee6330945, limb2: 0xbc58c6611c08dab, limb3: 0x0, }, u384 { limb0: 0x737f96e55fe3ed9d730c239f, limb1: 0xfeb0f6ef0cd21d04a44a9e08, limb2: 0x23d5e999e1910a12, limb3: 0x0, }, u384 { limb0: 0xbe55d24ae86f7d391ed4a67f, limb1: 0xefe9608cd0acaa90894cb38d, limb2: 0x19dc81cfcc82e4bb, limb3: 0x0, }, u384 { limb0: 0x97d439ec7694aa2bf4c0c101, limb1: 0x6cbeee33576139d7f03a5e3, limb2: 0xabf8b60be77d73, limb3: 0x0, }, u384 { limb0: 0xbea870f45fcc8ad066dce9ed, limb1: 0xdbf17f1dca9e5ea3bbd689a3, limb2: 0x2a275b6d9896aa4c, limb3: 0x0, }, u384 { limb0: 0xd8cf6ebab94d0cb3b2594c64, limb1: 0xb14b900e9507e9327600ecc7, limb2: 0x28a411b634f09b8f, limb3: 0x0, }, u384 { limb0: 0x967c84a5ebde847076261b43, limb1: 0x711699fa3b4d3f692ed68098, limb2: 0x13c49044952c0905, limb3: 0x0, }, u384 { limb0: 0x200280211f25041384282499, limb1: 0x9fb1b2282a48633d3e2ddaea, limb2: 0x16db366a59b1dd0b, limb3: 0x0, }, ]; #[inline(always)] pub fn run_BN254_E12T_FROBENIUS_SQUARE_circuit(M: E12T) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 let in2 = CE::> {}; // 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe let in3 = CE::> {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd49 let in4 = CE::> {}; // -0x1 % p let in5 = CE::> {}; // 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177ffffff // INPUT stack let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_add(in6, in0); let t1 = circuit_add(in7, in0); let t2 = circuit_mul(in1, in8); let t3 = circuit_mul(in1, in9); let t4 = circuit_mul(in2, in10); let t5 = circuit_mul(in2, in11); let t6 = circuit_mul(in3, in12); let t7 = circuit_mul(in3, in13); let t8 = circuit_mul(in4, in14); let t9 = circuit_mul(in4, in15); let t10 = circuit_mul(in5, in16); let t11 = circuit_mul(in5, in17); let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs .next_2( [0xbb966e3de4bd44e5607cfd48, 0x5e6dd9e7e0acccb0c28f069f, 0x30644e72e131a029, 0x0], ); // in1 circuit_inputs = circuit_inputs .next_2([0xacdb5c4f5763473177fffffe, 0x59e26bcea0d48bacd4f263f1, 0x0, 0x0]); // in2 circuit_inputs = circuit_inputs .next_2( [0xbb966e3de4bd44e5607cfd49, 0x5e6dd9e7e0acccb0c28f069f, 0x30644e72e131a029, 0x0], ); // in3 circuit_inputs = circuit_inputs .next_2( [0x6871ca8d3c208c16d87cfd46, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], ); // in4 circuit_inputs = circuit_inputs .next_2([0xacdb5c4f5763473177ffffff, 0x59e26bcea0d48bacd4f263f1, 0x0, 0x0]); // in5 // Fill inputs: circuit_inputs = circuit_inputs.next_2(M.c0b0a0); // in6 circuit_inputs = circuit_inputs.next_2(M.c0b0a1); // in7 circuit_inputs = circuit_inputs.next_2(M.c0b1a0); // in8 circuit_inputs = circuit_inputs.next_2(M.c0b1a1); // in9 circuit_inputs = circuit_inputs.next_2(M.c0b2a0); // in10 circuit_inputs = circuit_inputs.next_2(M.c0b2a1); // in11 circuit_inputs = circuit_inputs.next_2(M.c1b0a0); // in12 circuit_inputs = circuit_inputs.next_2(M.c1b0a1); // in13 circuit_inputs = circuit_inputs.next_2(M.c1b1a0); // in14 circuit_inputs = circuit_inputs.next_2(M.c1b1a1); // in15 circuit_inputs = circuit_inputs.next_2(M.c1b2a0); // in16 circuit_inputs = circuit_inputs.next_2(M.c1b2a1); // in17 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t0), c0b0a1: outputs.get_output(t1), c0b1a0: outputs.get_output(t2), c0b1a1: outputs.get_output(t3), c0b2a0: outputs.get_output(t4), c0b2a1: outputs.get_output(t5), c1b0a0: outputs.get_output(t6), c1b0a1: outputs.get_output(t7), c1b1a0: outputs.get_output(t8), c1b1a1: outputs.get_output(t9), c1b2a0: outputs.get_output(t10), c1b2a1: outputs.get_output(t11), }; return (res,); } #[inline(always)] pub fn run_BN254_E12T_FROBENIUS_circuit(M: E12T) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0x2fb347984f7911f74c0bec3cf559b143b78cc310c2c3330c99e39557176f553d let in2 = CE::> {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 let in3 = CE::> {}; // 0x5b54f5e64eea80180f3c0b75a181e84d33365f7be94ec72848a1f55921ea762 let in4 = CE::> {}; // 0x2c145edbe7fd8aee9f3a80b03b0b1c923685d2ea1bdec763c13b4711cd2b8126 let in5 = CE::> {}; // 0x1284b71c2865a7dfe8b99fdd76e68b605c521e08292f2176d60b35dadcc9e470 let in6 = CE::> {}; // 0x246996f3b4fae7e6a6327cfe12150b8e747992778eeec7e5ca5cf05f80f362ac let in7 = CE::> {}; // 0x63cf305489af5dcdc5ec698b6e2f9b9dbaae0eda9c95998dc54014671a0135a let in8 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 let in9 = CE::> {}; // 0x183c1e74f798649e93a3661a4353ff4425c459b55aa1bd32ea2c810eab7692f let in10 = CE::< CI<10>, > {}; // 0x12acf2ca76fd0675a27fb246c7729f7db080cb99678e2ac024c6b8ee6e0c2c4b // INPUT stack let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_sub(in0, in12); let t1 = circuit_add(in11, in0); let t2 = circuit_sub(in0, in14); let t3 = circuit_sub(in0, in16); let t4 = circuit_sub(in0, in18); let t5 = circuit_sub(in0, in20); let t6 = circuit_sub(in0, in22); let t7 = circuit_mul(in1, in13); // Fp2 mul start let t8 = circuit_mul(in2, t2); let t9 = circuit_sub(t7, t8); // Fp2 mul real part end let t10 = circuit_mul(in1, t2); let t11 = circuit_mul(in2, in13); let t12 = circuit_add(t10, t11); // Fp2 mul imag part end let t13 = circuit_mul(in3, in15); // Fp2 mul start let t14 = circuit_mul(in4, t3); let t15 = circuit_sub(t13, t14); // Fp2 mul real part end let t16 = circuit_mul(in3, t3); let t17 = circuit_mul(in4, in15); let t18 = circuit_add(t16, t17); // Fp2 mul imag part end let t19 = circuit_mul(in5, in17); // Fp2 mul start let t20 = circuit_mul(in6, t4); let t21 = circuit_sub(t19, t20); // Fp2 mul real part end let t22 = circuit_mul(in5, t4); let t23 = circuit_mul(in6, in17); let t24 = circuit_add(t22, t23); // Fp2 mul imag part end let t25 = circuit_mul(in7, in19); // Fp2 mul start let t26 = circuit_mul(in8, t5); let t27 = circuit_sub(t25, t26); // Fp2 mul real part end let t28 = circuit_mul(in7, t5); let t29 = circuit_mul(in8, in19); let t30 = circuit_add(t28, t29); // Fp2 mul imag part end let t31 = circuit_mul(in9, in21); // Fp2 mul start let t32 = circuit_mul(in10, t6); let t33 = circuit_sub(t31, t32); // Fp2 mul real part end let t34 = circuit_mul(in9, t6); let t35 = circuit_mul(in10, in21); let t36 = circuit_add(t34, t35); // Fp2 mul imag part end let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = (t1, t0, t9, t12, t15, t18, t21, t24, t27, t30, t33, t36).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_span(E12T_FROBENIUS_BN254_CONSTANTS.span()); // in0 - in10 // Fill inputs: circuit_inputs = circuit_inputs.next_2(M.c0b0a0); // in11 circuit_inputs = circuit_inputs.next_2(M.c0b0a1); // in12 circuit_inputs = circuit_inputs.next_2(M.c0b1a0); // in13 circuit_inputs = circuit_inputs.next_2(M.c0b1a1); // in14 circuit_inputs = circuit_inputs.next_2(M.c0b2a0); // in15 circuit_inputs = circuit_inputs.next_2(M.c0b2a1); // in16 circuit_inputs = circuit_inputs.next_2(M.c1b0a0); // in17 circuit_inputs = circuit_inputs.next_2(M.c1b0a1); // in18 circuit_inputs = circuit_inputs.next_2(M.c1b1a0); // in19 circuit_inputs = circuit_inputs.next_2(M.c1b1a1); // in20 circuit_inputs = circuit_inputs.next_2(M.c1b2a0); // in21 circuit_inputs = circuit_inputs.next_2(M.c1b2a1); // in22 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t1), c0b0a1: outputs.get_output(t0), c0b1a0: outputs.get_output(t9), c0b1a1: outputs.get_output(t12), c0b2a0: outputs.get_output(t15), c0b2a1: outputs.get_output(t18), c1b0a0: outputs.get_output(t21), c1b0a1: outputs.get_output(t24), c1b1a0: outputs.get_output(t27), c1b1a1: outputs.get_output(t30), c1b2a0: outputs.get_output(t33), c1b2a1: outputs.get_output(t36), }; return (res,); } const E12T_FROBENIUS_BN254_CONSTANTS: [u384; 11] = [ u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0xc2c3330c99e39557176f553d, limb1: 0x4c0bec3cf559b143b78cc310, limb2: 0x2fb347984f7911f7, limb3: 0x0, }, u384 { limb0: 0xb7c9dce1665d51c640fcba2, limb1: 0x4ba4cc8bd75a079432ae2a1d, limb2: 0x16c9e55061ebae20, limb3: 0x0, }, u384 { limb0: 0xbe94ec72848a1f55921ea762, limb1: 0x80f3c0b75a181e84d33365f7, limb2: 0x5b54f5e64eea801, limb3: 0x0, }, u384 { limb0: 0x1bdec763c13b4711cd2b8126, limb1: 0x9f3a80b03b0b1c923685d2ea, limb2: 0x2c145edbe7fd8aee, limb3: 0x0, }, u384 { limb0: 0x292f2176d60b35dadcc9e470, limb1: 0xe8b99fdd76e68b605c521e08, limb2: 0x1284b71c2865a7df, limb3: 0x0, }, u384 { limb0: 0x8eeec7e5ca5cf05f80f362ac, limb1: 0xa6327cfe12150b8e74799277, limb2: 0x246996f3b4fae7e6, limb3: 0x0, }, u384 { limb0: 0xa9c95998dc54014671a0135a, limb1: 0xdc5ec698b6e2f9b9dbaae0ed, limb2: 0x63cf305489af5dc, limb3: 0x0, }, u384 { limb0: 0x8fa25bd282d37f632623b0e3, limb1: 0x704b5a7ec796f2b21807dc9, limb2: 0x7c03cbcac41049a, limb3: 0x0, }, u384 { limb0: 0x55aa1bd32ea2c810eab7692f, limb1: 0xe93a3661a4353ff4425c459b, limb2: 0x183c1e74f798649, limb3: 0x0, }, u384 { limb0: 0x678e2ac024c6b8ee6e0c2c4b, limb1: 0xa27fb246c7729f7db080cb99, limb2: 0x12acf2ca76fd0675, limb3: 0x0, }, ]; #[inline(always)] pub fn run_BN254_E12T_INVERSE_circuit(M: E12T) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0xa let in1 = CE::> {}; // 0x9 let in2 = CE::> {}; // 0x0 // INPUT stack let (in3, in4, in5) = (CE::> {}, CE::> {}, CE::> {}); let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_mul(in3, in5); // Fp2 mul start let t1 = circuit_mul(in4, in6); let t2 = circuit_sub(t0, t1); // Fp2 mul real part end let t3 = circuit_mul(in3, in6); let t4 = circuit_mul(in4, in5); let t5 = circuit_add(t3, t4); // Fp2 mul imag part end let t6 = circuit_add(t2, t2); // Fp2 add coeff 0/1 let t7 = circuit_add(t5, t5); // Fp2 add coeff 1/1 let t8 = circuit_add(in7, in8); let t9 = circuit_sub(in7, in8); let t10 = circuit_mul(t8, t9); let t11 = circuit_mul(in7, in8); let t12 = circuit_add(t11, t11); let t13 = circuit_add(t10, t12); let t14 = circuit_mul(t13, in0); let t15 = circuit_mul(t10, in1); let t16 = circuit_sub(t15, t12); let t17 = circuit_sub(t14, t15); let t18 = circuit_sub(t17, t12); let t19 = circuit_add(t16, t6); // Fp2 add coeff 0/1 let t20 = circuit_add(t18, t7); // Fp2 add coeff 1/1 let t21 = circuit_sub(t6, t10); // Fp2 sub coeff 0/1 let t22 = circuit_sub(t7, t12); // Fp2 sub coeff 1/1 let t23 = circuit_add(in3, in4); let t24 = circuit_sub(in3, in4); let t25 = circuit_mul(t23, t24); let t26 = circuit_mul(in3, in4); let t27 = circuit_add(t26, t26); let t28 = circuit_sub(in3, in5); // Fp2 sub coeff 0/1 let t29 = circuit_sub(in4, in6); // Fp2 sub coeff 1/1 let t30 = circuit_add(t28, in7); // Fp2 add coeff 0/1 let t31 = circuit_add(t29, in8); // Fp2 add coeff 1/1 let t32 = circuit_mul(in5, in7); // Fp2 mul start let t33 = circuit_mul(in6, in8); let t34 = circuit_sub(t32, t33); // Fp2 mul real part end let t35 = circuit_mul(in5, in8); let t36 = circuit_mul(in6, in7); let t37 = circuit_add(t35, t36); // Fp2 mul imag part end let t38 = circuit_add(t34, t34); // Fp2 add coeff 0/1 let t39 = circuit_add(t37, t37); // Fp2 add coeff 1/1 let t40 = circuit_add(t30, t31); let t41 = circuit_sub(t30, t31); let t42 = circuit_mul(t40, t41); let t43 = circuit_mul(t30, t31); let t44 = circuit_add(t43, t43); let t45 = circuit_add(t38, t39); let t46 = circuit_mul(t45, in0); let t47 = circuit_mul(t38, in1); let t48 = circuit_sub(t47, t39); let t49 = circuit_sub(t46, t47); let t50 = circuit_sub(t49, t39); let t51 = circuit_add(t48, t25); // Fp2 add coeff 0/1 let t52 = circuit_add(t50, t27); // Fp2 add coeff 1/1 let t53 = circuit_add(t21, t42); // Fp2 add coeff 0/1 let t54 = circuit_add(t22, t44); // Fp2 add coeff 1/1 let t55 = circuit_add(t53, t38); // Fp2 add coeff 0/1 let t56 = circuit_add(t54, t39); // Fp2 add coeff 1/1 let t57 = circuit_sub(t55, t25); // Fp2 sub coeff 0/1 let t58 = circuit_sub(t56, t27); // Fp2 sub coeff 1/1 let t59 = circuit_mul(in9, in11); // Fp2 mul start let t60 = circuit_mul(in10, in12); let t61 = circuit_sub(t59, t60); // Fp2 mul real part end let t62 = circuit_mul(in9, in12); let t63 = circuit_mul(in10, in11); let t64 = circuit_add(t62, t63); // Fp2 mul imag part end let t65 = circuit_add(t61, t61); // Fp2 add coeff 0/1 let t66 = circuit_add(t64, t64); // Fp2 add coeff 1/1 let t67 = circuit_add(in13, in14); let t68 = circuit_sub(in13, in14); let t69 = circuit_mul(t67, t68); let t70 = circuit_mul(in13, in14); let t71 = circuit_add(t70, t70); let t72 = circuit_add(t69, t71); let t73 = circuit_mul(t72, in0); let t74 = circuit_mul(t69, in1); let t75 = circuit_sub(t74, t71); let t76 = circuit_sub(t73, t74); let t77 = circuit_sub(t76, t71); let t78 = circuit_add(t75, t65); // Fp2 add coeff 0/1 let t79 = circuit_add(t77, t66); // Fp2 add coeff 1/1 let t80 = circuit_sub(t65, t69); // Fp2 sub coeff 0/1 let t81 = circuit_sub(t66, t71); // Fp2 sub coeff 1/1 let t82 = circuit_add(in9, in10); let t83 = circuit_sub(in9, in10); let t84 = circuit_mul(t82, t83); let t85 = circuit_mul(in9, in10); let t86 = circuit_add(t85, t85); let t87 = circuit_sub(in9, in11); // Fp2 sub coeff 0/1 let t88 = circuit_sub(in10, in12); // Fp2 sub coeff 1/1 let t89 = circuit_add(t87, in13); // Fp2 add coeff 0/1 let t90 = circuit_add(t88, in14); // Fp2 add coeff 1/1 let t91 = circuit_mul(in11, in13); // Fp2 mul start let t92 = circuit_mul(in12, in14); let t93 = circuit_sub(t91, t92); // Fp2 mul real part end let t94 = circuit_mul(in11, in14); let t95 = circuit_mul(in12, in13); let t96 = circuit_add(t94, t95); // Fp2 mul imag part end let t97 = circuit_add(t93, t93); // Fp2 add coeff 0/1 let t98 = circuit_add(t96, t96); // Fp2 add coeff 1/1 let t99 = circuit_add(t89, t90); let t100 = circuit_sub(t89, t90); let t101 = circuit_mul(t99, t100); let t102 = circuit_mul(t89, t90); let t103 = circuit_add(t102, t102); let t104 = circuit_add(t97, t98); let t105 = circuit_mul(t104, in0); let t106 = circuit_mul(t97, in1); let t107 = circuit_sub(t106, t98); let t108 = circuit_sub(t105, t106); let t109 = circuit_sub(t108, t98); let t110 = circuit_add(t107, t84); // Fp2 add coeff 0/1 let t111 = circuit_add(t109, t86); // Fp2 add coeff 1/1 let t112 = circuit_add(t80, t101); // Fp2 add coeff 0/1 let t113 = circuit_add(t81, t103); // Fp2 add coeff 1/1 let t114 = circuit_add(t112, t97); // Fp2 add coeff 0/1 let t115 = circuit_add(t113, t98); // Fp2 add coeff 1/1 let t116 = circuit_sub(t114, t84); // Fp2 sub coeff 0/1 let t117 = circuit_sub(t115, t86); // Fp2 sub coeff 1/1 let t118 = circuit_add(t116, t117); let t119 = circuit_mul(t118, in0); let t120 = circuit_mul(t116, in1); let t121 = circuit_sub(t120, t117); let t122 = circuit_sub(t119, t120); let t123 = circuit_sub(t122, t117); let t124 = circuit_sub(t51, t121); // Fp6 sub coeff 0/5 let t125 = circuit_sub(t52, t123); // Fp6 sub coeff 1/5 let t126 = circuit_sub(t19, t110); // Fp6 sub coeff 2/5 let t127 = circuit_sub(t20, t111); // Fp6 sub coeff 3/5 let t128 = circuit_sub(t57, t78); // Fp6 sub coeff 4/5 let t129 = circuit_sub(t58, t79); // Fp6 sub coeff 5/5 let t130 = circuit_add(t124, t125); let t131 = circuit_sub(t124, t125); let t132 = circuit_mul(t130, t131); let t133 = circuit_mul(t124, t125); let t134 = circuit_add(t133, t133); let t135 = circuit_add(t126, t127); let t136 = circuit_sub(t126, t127); let t137 = circuit_mul(t135, t136); let t138 = circuit_mul(t126, t127); let t139 = circuit_add(t138, t138); let t140 = circuit_add(t128, t129); let t141 = circuit_sub(t128, t129); let t142 = circuit_mul(t140, t141); let t143 = circuit_mul(t128, t129); let t144 = circuit_add(t143, t143); let t145 = circuit_mul(t124, t126); // Fp2 mul start let t146 = circuit_mul(t125, t127); let t147 = circuit_sub(t145, t146); // Fp2 mul real part end let t148 = circuit_mul(t124, t127); let t149 = circuit_mul(t125, t126); let t150 = circuit_add(t148, t149); // Fp2 mul imag part end let t151 = circuit_mul(t124, t128); // Fp2 mul start let t152 = circuit_mul(t125, t129); let t153 = circuit_sub(t151, t152); // Fp2 mul real part end let t154 = circuit_mul(t124, t129); let t155 = circuit_mul(t125, t128); let t156 = circuit_add(t154, t155); // Fp2 mul imag part end let t157 = circuit_mul(t126, t128); // Fp2 mul start let t158 = circuit_mul(t127, t129); let t159 = circuit_sub(t157, t158); // Fp2 mul real part end let t160 = circuit_mul(t126, t129); let t161 = circuit_mul(t127, t128); let t162 = circuit_add(t160, t161); // Fp2 mul imag part end let t163 = circuit_add(t159, t162); let t164 = circuit_mul(t163, in0); let t165 = circuit_mul(t159, in1); let t166 = circuit_sub(t165, t162); let t167 = circuit_sub(t164, t165); let t168 = circuit_sub(t167, t162); let t169 = circuit_sub(in2, t166); // Fp2 neg coeff 0/1 let t170 = circuit_sub(in2, t168); // Fp2 neg coeff 1/1 let t171 = circuit_add(t169, t132); // Fp2 add coeff 0/1 let t172 = circuit_add(t170, t134); // Fp2 add coeff 1/1 let t173 = circuit_add(t142, t144); let t174 = circuit_mul(t173, in0); let t175 = circuit_mul(t142, in1); let t176 = circuit_sub(t175, t144); let t177 = circuit_sub(t174, t175); let t178 = circuit_sub(t177, t144); let t179 = circuit_sub(t176, t147); // Fp2 sub coeff 0/1 let t180 = circuit_sub(t178, t150); // Fp2 sub coeff 1/1 let t181 = circuit_sub(t137, t153); // Fp2 sub coeff 0/1 let t182 = circuit_sub(t139, t156); // Fp2 sub coeff 1/1 let t183 = circuit_mul(t124, t171); // Fp2 mul start let t184 = circuit_mul(t125, t172); let t185 = circuit_sub(t183, t184); // Fp2 mul real part end let t186 = circuit_mul(t124, t172); let t187 = circuit_mul(t125, t171); let t188 = circuit_add(t186, t187); // Fp2 mul imag part end let t189 = circuit_mul(t128, t179); // Fp2 mul start let t190 = circuit_mul(t129, t180); let t191 = circuit_sub(t189, t190); // Fp2 mul real part end let t192 = circuit_mul(t128, t180); let t193 = circuit_mul(t129, t179); let t194 = circuit_add(t192, t193); // Fp2 mul imag part end let t195 = circuit_mul(t126, t181); // Fp2 mul start let t196 = circuit_mul(t127, t182); let t197 = circuit_sub(t195, t196); // Fp2 mul real part end let t198 = circuit_mul(t126, t182); let t199 = circuit_mul(t127, t181); let t200 = circuit_add(t198, t199); // Fp2 mul imag part end let t201 = circuit_add(t191, t197); // Fp2 add coeff 0/1 let t202 = circuit_add(t194, t200); // Fp2 add coeff 1/1 let t203 = circuit_add(t201, t202); let t204 = circuit_mul(t203, in0); let t205 = circuit_mul(t201, in1); let t206 = circuit_sub(t205, t202); let t207 = circuit_sub(t204, t205); let t208 = circuit_sub(t207, t202); let t209 = circuit_add(t185, t206); // Fp2 add coeff 0/1 let t210 = circuit_add(t188, t208); // Fp2 add coeff 1/1 let t211 = circuit_mul(t209, t209); // Fp2 Inv start let t212 = circuit_mul(t210, t210); let t213 = circuit_add(t211, t212); let t214 = circuit_inverse(t213); let t215 = circuit_mul(t209, t214); // Fp2 Inv real part end let t216 = circuit_mul(t210, t214); let t217 = circuit_sub(in2, t216); // Fp2 Inv imag part end let t218 = circuit_mul(t171, t215); // Fp2 mul start let t219 = circuit_mul(t172, t217); let t220 = circuit_sub(t218, t219); // Fp2 mul real part end let t221 = circuit_mul(t171, t217); let t222 = circuit_mul(t172, t215); let t223 = circuit_add(t221, t222); // Fp2 mul imag part end let t224 = circuit_mul(t179, t215); // Fp2 mul start let t225 = circuit_mul(t180, t217); let t226 = circuit_sub(t224, t225); // Fp2 mul real part end let t227 = circuit_mul(t179, t217); let t228 = circuit_mul(t180, t215); let t229 = circuit_add(t227, t228); // Fp2 mul imag part end let t230 = circuit_mul(t181, t215); // Fp2 mul start let t231 = circuit_mul(t182, t217); let t232 = circuit_sub(t230, t231); // Fp2 mul real part end let t233 = circuit_mul(t181, t217); let t234 = circuit_mul(t182, t215); let t235 = circuit_add(t233, t234); // Fp2 mul imag part end let t236 = circuit_mul(in3, t220); // Fp2 mul start let t237 = circuit_mul(in4, t223); let t238 = circuit_sub(t236, t237); // Fp2 mul real part end let t239 = circuit_mul(in3, t223); let t240 = circuit_mul(in4, t220); let t241 = circuit_add(t239, t240); // Fp2 mul imag part end let t242 = circuit_mul(in5, t226); // Fp2 mul start let t243 = circuit_mul(in6, t229); let t244 = circuit_sub(t242, t243); // Fp2 mul real part end let t245 = circuit_mul(in5, t229); let t246 = circuit_mul(in6, t226); let t247 = circuit_add(t245, t246); // Fp2 mul imag part end let t248 = circuit_mul(in7, t232); // Fp2 mul start let t249 = circuit_mul(in8, t235); let t250 = circuit_sub(t248, t249); // Fp2 mul real part end let t251 = circuit_mul(in7, t235); let t252 = circuit_mul(in8, t232); let t253 = circuit_add(t251, t252); // Fp2 mul imag part end let t254 = circuit_add(in5, in7); // Fp2 add coeff 0/1 let t255 = circuit_add(in6, in8); // Fp2 add coeff 1/1 let t256 = circuit_add(t226, t232); // Fp2 add coeff 0/1 let t257 = circuit_add(t229, t235); // Fp2 add coeff 1/1 let t258 = circuit_mul(t254, t256); // Fp2 mul start let t259 = circuit_mul(t255, t257); let t260 = circuit_sub(t258, t259); // Fp2 mul real part end let t261 = circuit_mul(t254, t257); let t262 = circuit_mul(t255, t256); let t263 = circuit_add(t261, t262); // Fp2 mul imag part end let t264 = circuit_sub(t260, t244); // Fp2 sub coeff 0/1 let t265 = circuit_sub(t263, t247); // Fp2 sub coeff 1/1 let t266 = circuit_sub(t264, t250); // Fp2 sub coeff 0/1 let t267 = circuit_sub(t265, t253); // Fp2 sub coeff 1/1 let t268 = circuit_add(t266, t267); let t269 = circuit_mul(t268, in0); let t270 = circuit_mul(t266, in1); let t271 = circuit_sub(t270, t267); let t272 = circuit_sub(t269, t270); let t273 = circuit_sub(t272, t267); let t274 = circuit_add(t271, t238); // Fp2 add coeff 0/1 let t275 = circuit_add(t273, t241); // Fp2 add coeff 1/1 let t276 = circuit_add(in3, in5); // Fp2 add coeff 0/1 let t277 = circuit_add(in4, in6); // Fp2 add coeff 1/1 let t278 = circuit_add(t220, t226); // Fp2 add coeff 0/1 let t279 = circuit_add(t223, t229); // Fp2 add coeff 1/1 let t280 = circuit_mul(t276, t278); // Fp2 mul start let t281 = circuit_mul(t277, t279); let t282 = circuit_sub(t280, t281); // Fp2 mul real part end let t283 = circuit_mul(t276, t279); let t284 = circuit_mul(t277, t278); let t285 = circuit_add(t283, t284); // Fp2 mul imag part end let t286 = circuit_sub(t282, t238); // Fp2 sub coeff 0/1 let t287 = circuit_sub(t285, t241); // Fp2 sub coeff 1/1 let t288 = circuit_sub(t286, t244); // Fp2 sub coeff 0/1 let t289 = circuit_sub(t287, t247); // Fp2 sub coeff 1/1 let t290 = circuit_add(t250, t253); let t291 = circuit_mul(t290, in0); let t292 = circuit_mul(t250, in1); let t293 = circuit_sub(t292, t253); let t294 = circuit_sub(t291, t292); let t295 = circuit_sub(t294, t253); let t296 = circuit_add(t288, t293); // Fp2 add coeff 0/1 let t297 = circuit_add(t289, t295); // Fp2 add coeff 1/1 let t298 = circuit_add(in3, in7); // Fp2 add coeff 0/1 let t299 = circuit_add(in4, in8); // Fp2 add coeff 1/1 let t300 = circuit_add(t220, t232); // Fp2 add coeff 0/1 let t301 = circuit_add(t223, t235); // Fp2 add coeff 1/1 let t302 = circuit_mul(t300, t298); // Fp2 mul start let t303 = circuit_mul(t301, t299); let t304 = circuit_sub(t302, t303); // Fp2 mul real part end let t305 = circuit_mul(t300, t299); let t306 = circuit_mul(t301, t298); let t307 = circuit_add(t305, t306); // Fp2 mul imag part end let t308 = circuit_sub(t304, t238); // Fp2 sub coeff 0/1 let t309 = circuit_sub(t307, t241); // Fp2 sub coeff 1/1 let t310 = circuit_sub(t308, t250); // Fp2 sub coeff 0/1 let t311 = circuit_sub(t309, t253); // Fp2 sub coeff 1/1 let t312 = circuit_add(t310, t244); // Fp2 add coeff 0/1 let t313 = circuit_add(t311, t247); // Fp2 add coeff 1/1 let t314 = circuit_mul(in9, t220); // Fp2 mul start let t315 = circuit_mul(in10, t223); let t316 = circuit_sub(t314, t315); // Fp2 mul real part end let t317 = circuit_mul(in9, t223); let t318 = circuit_mul(in10, t220); let t319 = circuit_add(t317, t318); // Fp2 mul imag part end let t320 = circuit_mul(in11, t226); // Fp2 mul start let t321 = circuit_mul(in12, t229); let t322 = circuit_sub(t320, t321); // Fp2 mul real part end let t323 = circuit_mul(in11, t229); let t324 = circuit_mul(in12, t226); let t325 = circuit_add(t323, t324); // Fp2 mul imag part end let t326 = circuit_mul(in13, t232); // Fp2 mul start let t327 = circuit_mul(in14, t235); let t328 = circuit_sub(t326, t327); // Fp2 mul real part end let t329 = circuit_mul(in13, t235); let t330 = circuit_mul(in14, t232); let t331 = circuit_add(t329, t330); // Fp2 mul imag part end let t332 = circuit_add(in11, in13); // Fp2 add coeff 0/1 let t333 = circuit_add(in12, in14); // Fp2 add coeff 1/1 let t334 = circuit_add(t226, t232); // Fp2 add coeff 0/1 let t335 = circuit_add(t229, t235); // Fp2 add coeff 1/1 let t336 = circuit_mul(t332, t334); // Fp2 mul start let t337 = circuit_mul(t333, t335); let t338 = circuit_sub(t336, t337); // Fp2 mul real part end let t339 = circuit_mul(t332, t335); let t340 = circuit_mul(t333, t334); let t341 = circuit_add(t339, t340); // Fp2 mul imag part end let t342 = circuit_sub(t338, t322); // Fp2 sub coeff 0/1 let t343 = circuit_sub(t341, t325); // Fp2 sub coeff 1/1 let t344 = circuit_sub(t342, t328); // Fp2 sub coeff 0/1 let t345 = circuit_sub(t343, t331); // Fp2 sub coeff 1/1 let t346 = circuit_add(t344, t345); let t347 = circuit_mul(t346, in0); let t348 = circuit_mul(t344, in1); let t349 = circuit_sub(t348, t345); let t350 = circuit_sub(t347, t348); let t351 = circuit_sub(t350, t345); let t352 = circuit_add(t349, t316); // Fp2 add coeff 0/1 let t353 = circuit_add(t351, t319); // Fp2 add coeff 1/1 let t354 = circuit_add(in9, in11); // Fp2 add coeff 0/1 let t355 = circuit_add(in10, in12); // Fp2 add coeff 1/1 let t356 = circuit_add(t220, t226); // Fp2 add coeff 0/1 let t357 = circuit_add(t223, t229); // Fp2 add coeff 1/1 let t358 = circuit_mul(t354, t356); // Fp2 mul start let t359 = circuit_mul(t355, t357); let t360 = circuit_sub(t358, t359); // Fp2 mul real part end let t361 = circuit_mul(t354, t357); let t362 = circuit_mul(t355, t356); let t363 = circuit_add(t361, t362); // Fp2 mul imag part end let t364 = circuit_sub(t360, t316); // Fp2 sub coeff 0/1 let t365 = circuit_sub(t363, t319); // Fp2 sub coeff 1/1 let t366 = circuit_sub(t364, t322); // Fp2 sub coeff 0/1 let t367 = circuit_sub(t365, t325); // Fp2 sub coeff 1/1 let t368 = circuit_add(t328, t331); let t369 = circuit_mul(t368, in0); let t370 = circuit_mul(t328, in1); let t371 = circuit_sub(t370, t331); let t372 = circuit_sub(t369, t370); let t373 = circuit_sub(t372, t331); let t374 = circuit_add(t366, t371); // Fp2 add coeff 0/1 let t375 = circuit_add(t367, t373); // Fp2 add coeff 1/1 let t376 = circuit_add(in9, in13); // Fp2 add coeff 0/1 let t377 = circuit_add(in10, in14); // Fp2 add coeff 1/1 let t378 = circuit_add(t220, t232); // Fp2 add coeff 0/1 let t379 = circuit_add(t223, t235); // Fp2 add coeff 1/1 let t380 = circuit_mul(t378, t376); // Fp2 mul start let t381 = circuit_mul(t379, t377); let t382 = circuit_sub(t380, t381); // Fp2 mul real part end let t383 = circuit_mul(t378, t377); let t384 = circuit_mul(t379, t376); let t385 = circuit_add(t383, t384); // Fp2 mul imag part end let t386 = circuit_sub(t382, t316); // Fp2 sub coeff 0/1 let t387 = circuit_sub(t385, t319); // Fp2 sub coeff 1/1 let t388 = circuit_sub(t386, t328); // Fp2 sub coeff 0/1 let t389 = circuit_sub(t387, t331); // Fp2 sub coeff 1/1 let t390 = circuit_add(t388, t322); // Fp2 add coeff 0/1 let t391 = circuit_add(t389, t325); // Fp2 add coeff 1/1 let t392 = circuit_sub(in2, t352); // Fp6 neg coeff 0/5 let t393 = circuit_sub(in2, t353); // Fp6 neg coeff 1/5 let t394 = circuit_sub(in2, t374); // Fp6 neg coeff 2/5 let t395 = circuit_sub(in2, t375); // Fp6 neg coeff 3/5 let t396 = circuit_sub(in2, t390); // Fp6 neg coeff 4/5 let t397 = circuit_sub(in2, t391); // Fp6 neg coeff 5/5 let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = ( t274, t275, t296, t297, t312, t313, t392, t393, t394, t395, t396, t397, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0xa, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x9, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in2 // Fill inputs: circuit_inputs = circuit_inputs.next_2(M.c0b0a0); // in3 circuit_inputs = circuit_inputs.next_2(M.c0b0a1); // in4 circuit_inputs = circuit_inputs.next_2(M.c0b1a0); // in5 circuit_inputs = circuit_inputs.next_2(M.c0b1a1); // in6 circuit_inputs = circuit_inputs.next_2(M.c0b2a0); // in7 circuit_inputs = circuit_inputs.next_2(M.c0b2a1); // in8 circuit_inputs = circuit_inputs.next_2(M.c1b0a0); // in9 circuit_inputs = circuit_inputs.next_2(M.c1b0a1); // in10 circuit_inputs = circuit_inputs.next_2(M.c1b1a0); // in11 circuit_inputs = circuit_inputs.next_2(M.c1b1a1); // in12 circuit_inputs = circuit_inputs.next_2(M.c1b2a0); // in13 circuit_inputs = circuit_inputs.next_2(M.c1b2a1); // in14 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t274), c0b0a1: outputs.get_output(t275), c0b1a0: outputs.get_output(t296), c0b1a1: outputs.get_output(t297), c0b2a0: outputs.get_output(t312), c0b2a1: outputs.get_output(t313), c1b0a0: outputs.get_output(t392), c1b0a1: outputs.get_output(t393), c1b1a0: outputs.get_output(t394), c1b1a1: outputs.get_output(t395), c1b2a0: outputs.get_output(t396), c1b2a1: outputs.get_output(t397), }; return (res,); } #[inline(always)] pub fn run_BN254_E12T_MUL_circuit(X: E12T, Y: E12T) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0xa let in1 = CE::> {}; // 0x9 // INPUT stack let (in2, in3, in4) = (CE::> {}, CE::> {}, CE::> {}); let (in5, in6, in7) = (CE::> {}, CE::> {}, CE::> {}); let (in8, in9, in10) = (CE::> {}, CE::> {}, CE::> {}); let (in11, in12, in13) = (CE::> {}, CE::> {}, CE::> {}); let (in14, in15, in16) = (CE::> {}, CE::> {}, CE::> {}); let (in17, in18, in19) = (CE::> {}, CE::> {}, CE::> {}); let (in20, in21, in22) = (CE::> {}, CE::> {}, CE::> {}); let (in23, in24, in25) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_add(in2, in8); // Fp6 add coeff 0/5 let t1 = circuit_add(in3, in9); // Fp6 add coeff 1/5 let t2 = circuit_add(in4, in10); // Fp6 add coeff 2/5 let t3 = circuit_add(in5, in11); // Fp6 add coeff 3/5 let t4 = circuit_add(in6, in12); // Fp6 add coeff 4/5 let t5 = circuit_add(in7, in13); // Fp6 add coeff 5/5 let t6 = circuit_add(in14, in20); // Fp6 add coeff 0/5 let t7 = circuit_add(in15, in21); // Fp6 add coeff 1/5 let t8 = circuit_add(in16, in22); // Fp6 add coeff 2/5 let t9 = circuit_add(in17, in23); // Fp6 add coeff 3/5 let t10 = circuit_add(in18, in24); // Fp6 add coeff 4/5 let t11 = circuit_add(in19, in25); // Fp6 add coeff 5/5 let t12 = circuit_mul(t0, t6); // Fp2 mul start let t13 = circuit_mul(t1, t7); let t14 = circuit_sub(t12, t13); // Fp2 mul real part end let t15 = circuit_mul(t0, t7); let t16 = circuit_mul(t1, t6); let t17 = circuit_add(t15, t16); // Fp2 mul imag part end let t18 = circuit_mul(t2, t8); // Fp2 mul start let t19 = circuit_mul(t3, t9); let t20 = circuit_sub(t18, t19); // Fp2 mul real part end let t21 = circuit_mul(t2, t9); let t22 = circuit_mul(t3, t8); let t23 = circuit_add(t21, t22); // Fp2 mul imag part end let t24 = circuit_mul(t4, t10); // Fp2 mul start let t25 = circuit_mul(t5, t11); let t26 = circuit_sub(t24, t25); // Fp2 mul real part end let t27 = circuit_mul(t4, t11); let t28 = circuit_mul(t5, t10); let t29 = circuit_add(t27, t28); // Fp2 mul imag part end let t30 = circuit_add(t2, t4); // Fp2 add coeff 0/1 let t31 = circuit_add(t3, t5); // Fp2 add coeff 1/1 let t32 = circuit_add(t8, t10); // Fp2 add coeff 0/1 let t33 = circuit_add(t9, t11); // Fp2 add coeff 1/1 let t34 = circuit_mul(t30, t32); // Fp2 mul start let t35 = circuit_mul(t31, t33); let t36 = circuit_sub(t34, t35); // Fp2 mul real part end let t37 = circuit_mul(t30, t33); let t38 = circuit_mul(t31, t32); let t39 = circuit_add(t37, t38); // Fp2 mul imag part end let t40 = circuit_sub(t36, t20); // Fp2 sub coeff 0/1 let t41 = circuit_sub(t39, t23); // Fp2 sub coeff 1/1 let t42 = circuit_sub(t40, t26); // Fp2 sub coeff 0/1 let t43 = circuit_sub(t41, t29); // Fp2 sub coeff 1/1 let t44 = circuit_add(t42, t43); let t45 = circuit_mul(t44, in0); let t46 = circuit_mul(t42, in1); let t47 = circuit_sub(t46, t43); let t48 = circuit_sub(t45, t46); let t49 = circuit_sub(t48, t43); let t50 = circuit_add(t47, t14); // Fp2 add coeff 0/1 let t51 = circuit_add(t49, t17); // Fp2 add coeff 1/1 let t52 = circuit_add(t0, t2); // Fp2 add coeff 0/1 let t53 = circuit_add(t1, t3); // Fp2 add coeff 1/1 let t54 = circuit_add(t6, t8); // Fp2 add coeff 0/1 let t55 = circuit_add(t7, t9); // Fp2 add coeff 1/1 let t56 = circuit_mul(t52, t54); // Fp2 mul start let t57 = circuit_mul(t53, t55); let t58 = circuit_sub(t56, t57); // Fp2 mul real part end let t59 = circuit_mul(t52, t55); let t60 = circuit_mul(t53, t54); let t61 = circuit_add(t59, t60); // Fp2 mul imag part end let t62 = circuit_sub(t58, t14); // Fp2 sub coeff 0/1 let t63 = circuit_sub(t61, t17); // Fp2 sub coeff 1/1 let t64 = circuit_sub(t62, t20); // Fp2 sub coeff 0/1 let t65 = circuit_sub(t63, t23); // Fp2 sub coeff 1/1 let t66 = circuit_add(t26, t29); let t67 = circuit_mul(t66, in0); let t68 = circuit_mul(t26, in1); let t69 = circuit_sub(t68, t29); let t70 = circuit_sub(t67, t68); let t71 = circuit_sub(t70, t29); let t72 = circuit_add(t64, t69); // Fp2 add coeff 0/1 let t73 = circuit_add(t65, t71); // Fp2 add coeff 1/1 let t74 = circuit_add(t0, t4); // Fp2 add coeff 0/1 let t75 = circuit_add(t1, t5); // Fp2 add coeff 1/1 let t76 = circuit_add(t6, t10); // Fp2 add coeff 0/1 let t77 = circuit_add(t7, t11); // Fp2 add coeff 1/1 let t78 = circuit_mul(t76, t74); // Fp2 mul start let t79 = circuit_mul(t77, t75); let t80 = circuit_sub(t78, t79); // Fp2 mul real part end let t81 = circuit_mul(t76, t75); let t82 = circuit_mul(t77, t74); let t83 = circuit_add(t81, t82); // Fp2 mul imag part end let t84 = circuit_sub(t80, t14); // Fp2 sub coeff 0/1 let t85 = circuit_sub(t83, t17); // Fp2 sub coeff 1/1 let t86 = circuit_sub(t84, t26); // Fp2 sub coeff 0/1 let t87 = circuit_sub(t85, t29); // Fp2 sub coeff 1/1 let t88 = circuit_add(t86, t20); // Fp2 add coeff 0/1 let t89 = circuit_add(t87, t23); // Fp2 add coeff 1/1 let t90 = circuit_mul(in2, in14); // Fp2 mul start let t91 = circuit_mul(in3, in15); let t92 = circuit_sub(t90, t91); // Fp2 mul real part end let t93 = circuit_mul(in2, in15); let t94 = circuit_mul(in3, in14); let t95 = circuit_add(t93, t94); // Fp2 mul imag part end let t96 = circuit_mul(in4, in16); // Fp2 mul start let t97 = circuit_mul(in5, in17); let t98 = circuit_sub(t96, t97); // Fp2 mul real part end let t99 = circuit_mul(in4, in17); let t100 = circuit_mul(in5, in16); let t101 = circuit_add(t99, t100); // Fp2 mul imag part end let t102 = circuit_mul(in6, in18); // Fp2 mul start let t103 = circuit_mul(in7, in19); let t104 = circuit_sub(t102, t103); // Fp2 mul real part end let t105 = circuit_mul(in6, in19); let t106 = circuit_mul(in7, in18); let t107 = circuit_add(t105, t106); // Fp2 mul imag part end let t108 = circuit_add(in4, in6); // Fp2 add coeff 0/1 let t109 = circuit_add(in5, in7); // Fp2 add coeff 1/1 let t110 = circuit_add(in16, in18); // Fp2 add coeff 0/1 let t111 = circuit_add(in17, in19); // Fp2 add coeff 1/1 let t112 = circuit_mul(t108, t110); // Fp2 mul start let t113 = circuit_mul(t109, t111); let t114 = circuit_sub(t112, t113); // Fp2 mul real part end let t115 = circuit_mul(t108, t111); let t116 = circuit_mul(t109, t110); let t117 = circuit_add(t115, t116); // Fp2 mul imag part end let t118 = circuit_sub(t114, t98); // Fp2 sub coeff 0/1 let t119 = circuit_sub(t117, t101); // Fp2 sub coeff 1/1 let t120 = circuit_sub(t118, t104); // Fp2 sub coeff 0/1 let t121 = circuit_sub(t119, t107); // Fp2 sub coeff 1/1 let t122 = circuit_add(t120, t121); let t123 = circuit_mul(t122, in0); let t124 = circuit_mul(t120, in1); let t125 = circuit_sub(t124, t121); let t126 = circuit_sub(t123, t124); let t127 = circuit_sub(t126, t121); let t128 = circuit_add(t125, t92); // Fp2 add coeff 0/1 let t129 = circuit_add(t127, t95); // Fp2 add coeff 1/1 let t130 = circuit_add(in2, in4); // Fp2 add coeff 0/1 let t131 = circuit_add(in3, in5); // Fp2 add coeff 1/1 let t132 = circuit_add(in14, in16); // Fp2 add coeff 0/1 let t133 = circuit_add(in15, in17); // Fp2 add coeff 1/1 let t134 = circuit_mul(t130, t132); // Fp2 mul start let t135 = circuit_mul(t131, t133); let t136 = circuit_sub(t134, t135); // Fp2 mul real part end let t137 = circuit_mul(t130, t133); let t138 = circuit_mul(t131, t132); let t139 = circuit_add(t137, t138); // Fp2 mul imag part end let t140 = circuit_sub(t136, t92); // Fp2 sub coeff 0/1 let t141 = circuit_sub(t139, t95); // Fp2 sub coeff 1/1 let t142 = circuit_sub(t140, t98); // Fp2 sub coeff 0/1 let t143 = circuit_sub(t141, t101); // Fp2 sub coeff 1/1 let t144 = circuit_add(t104, t107); let t145 = circuit_mul(t144, in0); let t146 = circuit_mul(t104, in1); let t147 = circuit_sub(t146, t107); let t148 = circuit_sub(t145, t146); let t149 = circuit_sub(t148, t107); let t150 = circuit_add(t142, t147); // Fp2 add coeff 0/1 let t151 = circuit_add(t143, t149); // Fp2 add coeff 1/1 let t152 = circuit_add(in2, in6); // Fp2 add coeff 0/1 let t153 = circuit_add(in3, in7); // Fp2 add coeff 1/1 let t154 = circuit_add(in14, in18); // Fp2 add coeff 0/1 let t155 = circuit_add(in15, in19); // Fp2 add coeff 1/1 let t156 = circuit_mul(t154, t152); // Fp2 mul start let t157 = circuit_mul(t155, t153); let t158 = circuit_sub(t156, t157); // Fp2 mul real part end let t159 = circuit_mul(t154, t153); let t160 = circuit_mul(t155, t152); let t161 = circuit_add(t159, t160); // Fp2 mul imag part end let t162 = circuit_sub(t158, t92); // Fp2 sub coeff 0/1 let t163 = circuit_sub(t161, t95); // Fp2 sub coeff 1/1 let t164 = circuit_sub(t162, t104); // Fp2 sub coeff 0/1 let t165 = circuit_sub(t163, t107); // Fp2 sub coeff 1/1 let t166 = circuit_add(t164, t98); // Fp2 add coeff 0/1 let t167 = circuit_add(t165, t101); // Fp2 add coeff 1/1 let t168 = circuit_mul(in8, in20); // Fp2 mul start let t169 = circuit_mul(in9, in21); let t170 = circuit_sub(t168, t169); // Fp2 mul real part end let t171 = circuit_mul(in8, in21); let t172 = circuit_mul(in9, in20); let t173 = circuit_add(t171, t172); // Fp2 mul imag part end let t174 = circuit_mul(in10, in22); // Fp2 mul start let t175 = circuit_mul(in11, in23); let t176 = circuit_sub(t174, t175); // Fp2 mul real part end let t177 = circuit_mul(in10, in23); let t178 = circuit_mul(in11, in22); let t179 = circuit_add(t177, t178); // Fp2 mul imag part end let t180 = circuit_mul(in12, in24); // Fp2 mul start let t181 = circuit_mul(in13, in25); let t182 = circuit_sub(t180, t181); // Fp2 mul real part end let t183 = circuit_mul(in12, in25); let t184 = circuit_mul(in13, in24); let t185 = circuit_add(t183, t184); // Fp2 mul imag part end let t186 = circuit_add(in10, in12); // Fp2 add coeff 0/1 let t187 = circuit_add(in11, in13); // Fp2 add coeff 1/1 let t188 = circuit_add(in22, in24); // Fp2 add coeff 0/1 let t189 = circuit_add(in23, in25); // Fp2 add coeff 1/1 let t190 = circuit_mul(t186, t188); // Fp2 mul start let t191 = circuit_mul(t187, t189); let t192 = circuit_sub(t190, t191); // Fp2 mul real part end let t193 = circuit_mul(t186, t189); let t194 = circuit_mul(t187, t188); let t195 = circuit_add(t193, t194); // Fp2 mul imag part end let t196 = circuit_sub(t192, t176); // Fp2 sub coeff 0/1 let t197 = circuit_sub(t195, t179); // Fp2 sub coeff 1/1 let t198 = circuit_sub(t196, t182); // Fp2 sub coeff 0/1 let t199 = circuit_sub(t197, t185); // Fp2 sub coeff 1/1 let t200 = circuit_add(t198, t199); let t201 = circuit_mul(t200, in0); let t202 = circuit_mul(t198, in1); let t203 = circuit_sub(t202, t199); let t204 = circuit_sub(t201, t202); let t205 = circuit_sub(t204, t199); let t206 = circuit_add(t203, t170); // Fp2 add coeff 0/1 let t207 = circuit_add(t205, t173); // Fp2 add coeff 1/1 let t208 = circuit_add(in8, in10); // Fp2 add coeff 0/1 let t209 = circuit_add(in9, in11); // Fp2 add coeff 1/1 let t210 = circuit_add(in20, in22); // Fp2 add coeff 0/1 let t211 = circuit_add(in21, in23); // Fp2 add coeff 1/1 let t212 = circuit_mul(t208, t210); // Fp2 mul start let t213 = circuit_mul(t209, t211); let t214 = circuit_sub(t212, t213); // Fp2 mul real part end let t215 = circuit_mul(t208, t211); let t216 = circuit_mul(t209, t210); let t217 = circuit_add(t215, t216); // Fp2 mul imag part end let t218 = circuit_sub(t214, t170); // Fp2 sub coeff 0/1 let t219 = circuit_sub(t217, t173); // Fp2 sub coeff 1/1 let t220 = circuit_sub(t218, t176); // Fp2 sub coeff 0/1 let t221 = circuit_sub(t219, t179); // Fp2 sub coeff 1/1 let t222 = circuit_add(t182, t185); let t223 = circuit_mul(t222, in0); let t224 = circuit_mul(t182, in1); let t225 = circuit_sub(t224, t185); let t226 = circuit_sub(t223, t224); let t227 = circuit_sub(t226, t185); let t228 = circuit_add(t220, t225); // Fp2 add coeff 0/1 let t229 = circuit_add(t221, t227); // Fp2 add coeff 1/1 let t230 = circuit_add(in8, in12); // Fp2 add coeff 0/1 let t231 = circuit_add(in9, in13); // Fp2 add coeff 1/1 let t232 = circuit_add(in20, in24); // Fp2 add coeff 0/1 let t233 = circuit_add(in21, in25); // Fp2 add coeff 1/1 let t234 = circuit_mul(t232, t230); // Fp2 mul start let t235 = circuit_mul(t233, t231); let t236 = circuit_sub(t234, t235); // Fp2 mul real part end let t237 = circuit_mul(t232, t231); let t238 = circuit_mul(t233, t230); let t239 = circuit_add(t237, t238); // Fp2 mul imag part end let t240 = circuit_sub(t236, t170); // Fp2 sub coeff 0/1 let t241 = circuit_sub(t239, t173); // Fp2 sub coeff 1/1 let t242 = circuit_sub(t240, t182); // Fp2 sub coeff 0/1 let t243 = circuit_sub(t241, t185); // Fp2 sub coeff 1/1 let t244 = circuit_add(t242, t176); // Fp2 add coeff 0/1 let t245 = circuit_add(t243, t179); // Fp2 add coeff 1/1 let t246 = circuit_sub(t50, t128); // Fp6 sub coeff 0/5 let t247 = circuit_sub(t51, t129); // Fp6 sub coeff 1/5 let t248 = circuit_sub(t72, t150); // Fp6 sub coeff 2/5 let t249 = circuit_sub(t73, t151); // Fp6 sub coeff 3/5 let t250 = circuit_sub(t88, t166); // Fp6 sub coeff 4/5 let t251 = circuit_sub(t89, t167); // Fp6 sub coeff 5/5 let t252 = circuit_sub(t246, t206); // Fp6 sub coeff 0/5 let t253 = circuit_sub(t247, t207); // Fp6 sub coeff 1/5 let t254 = circuit_sub(t248, t228); // Fp6 sub coeff 2/5 let t255 = circuit_sub(t249, t229); // Fp6 sub coeff 3/5 let t256 = circuit_sub(t250, t244); // Fp6 sub coeff 4/5 let t257 = circuit_sub(t251, t245); // Fp6 sub coeff 5/5 let t258 = circuit_add(t244, t245); let t259 = circuit_mul(t258, in0); let t260 = circuit_mul(t244, in1); let t261 = circuit_sub(t260, t245); let t262 = circuit_sub(t259, t260); let t263 = circuit_sub(t262, t245); let t264 = circuit_add(t261, t128); // Fp6 add coeff 0/5 let t265 = circuit_add(t263, t129); // Fp6 add coeff 1/5 let t266 = circuit_add(t206, t150); // Fp6 add coeff 2/5 let t267 = circuit_add(t207, t151); // Fp6 add coeff 3/5 let t268 = circuit_add(t228, t166); // Fp6 add coeff 4/5 let t269 = circuit_add(t229, t167); // Fp6 add coeff 5/5 let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = ( t264, t265, t266, t267, t268, t269, t252, t253, t254, t255, t256, t257, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0xa, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x9, 0x0, 0x0, 0x0]); // in1 // Fill inputs: circuit_inputs = circuit_inputs.next_2(X.c0b0a0); // in2 circuit_inputs = circuit_inputs.next_2(X.c0b0a1); // in3 circuit_inputs = circuit_inputs.next_2(X.c0b1a0); // in4 circuit_inputs = circuit_inputs.next_2(X.c0b1a1); // in5 circuit_inputs = circuit_inputs.next_2(X.c0b2a0); // in6 circuit_inputs = circuit_inputs.next_2(X.c0b2a1); // in7 circuit_inputs = circuit_inputs.next_2(X.c1b0a0); // in8 circuit_inputs = circuit_inputs.next_2(X.c1b0a1); // in9 circuit_inputs = circuit_inputs.next_2(X.c1b1a0); // in10 circuit_inputs = circuit_inputs.next_2(X.c1b1a1); // in11 circuit_inputs = circuit_inputs.next_2(X.c1b2a0); // in12 circuit_inputs = circuit_inputs.next_2(X.c1b2a1); // in13 circuit_inputs = circuit_inputs.next_2(Y.c0b0a0); // in14 circuit_inputs = circuit_inputs.next_2(Y.c0b0a1); // in15 circuit_inputs = circuit_inputs.next_2(Y.c0b1a0); // in16 circuit_inputs = circuit_inputs.next_2(Y.c0b1a1); // in17 circuit_inputs = circuit_inputs.next_2(Y.c0b2a0); // in18 circuit_inputs = circuit_inputs.next_2(Y.c0b2a1); // in19 circuit_inputs = circuit_inputs.next_2(Y.c1b0a0); // in20 circuit_inputs = circuit_inputs.next_2(Y.c1b0a1); // in21 circuit_inputs = circuit_inputs.next_2(Y.c1b1a0); // in22 circuit_inputs = circuit_inputs.next_2(Y.c1b1a1); // in23 circuit_inputs = circuit_inputs.next_2(Y.c1b2a0); // in24 circuit_inputs = circuit_inputs.next_2(Y.c1b2a1); // in25 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let res: E12T = E12T { c0b0a0: outputs.get_output(t264), c0b0a1: outputs.get_output(t265), c0b1a0: outputs.get_output(t266), c0b1a1: outputs.get_output(t267), c0b2a0: outputs.get_output(t268), c0b2a1: outputs.get_output(t269), c1b0a0: outputs.get_output(t252), c1b0a1: outputs.get_output(t253), c1b1a0: outputs.get_output(t254), c1b1a1: outputs.get_output(t255), c1b2a0: outputs.get_output(t256), c1b2a1: outputs.get_output(t257), }; return (res,); } #[inline(always)] pub fn run_BN254_TOWER_MILLER_BIT0_1P_circuit( yInv_0: u384, xNegOverY_0: u384, Q_0: G2Point, M_i: E12T, ) -> (G2Point, E12T) { // CONSTANT stack let in0 = CE::> {}; // 0xa let in1 = CE::> {}; // 0x9 let in2 = CE::> {}; // 0x0 let in3 = CE::> {}; // 0x3 let in4 = CE::> {}; // 0x6 let in5 = CE::> {}; // 0x1 // INPUT stack let (in6, in7, in8) = (CE::> {}, CE::> {}, CE::> {}); let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_sub(in12, in18); // Fp6 sub coeff 0/5 let t1 = circuit_sub(in13, in19); // Fp6 sub coeff 1/5 let t2 = circuit_sub(in14, in20); // Fp6 sub coeff 2/5 let t3 = circuit_sub(in15, in21); // Fp6 sub coeff 3/5 let t4 = circuit_sub(in16, in22); // Fp6 sub coeff 4/5 let t5 = circuit_sub(in17, in23); // Fp6 sub coeff 5/5 let t6 = circuit_add(in22, in23); let t7 = circuit_mul(t6, in0); let t8 = circuit_mul(in22, in1); let t9 = circuit_sub(t8, in23); let t10 = circuit_sub(t7, t8); let t11 = circuit_sub(t10, in23); let t12 = circuit_sub(in2, t9); // Fp6 neg coeff 0/5 let t13 = circuit_sub(in2, t11); // Fp6 neg coeff 1/5 let t14 = circuit_sub(in2, in18); // Fp6 neg coeff 2/5 let t15 = circuit_sub(in2, in19); // Fp6 neg coeff 3/5 let t16 = circuit_sub(in2, in20); // Fp6 neg coeff 4/5 let t17 = circuit_sub(in2, in21); // Fp6 neg coeff 5/5 let t18 = circuit_add(in12, t12); // Fp6 add coeff 0/5 let t19 = circuit_add(in13, t13); // Fp6 add coeff 1/5 let t20 = circuit_add(in14, t14); // Fp6 add coeff 2/5 let t21 = circuit_add(in15, t15); // Fp6 add coeff 3/5 let t22 = circuit_add(in16, t16); // Fp6 add coeff 4/5 let t23 = circuit_add(in17, t17); // Fp6 add coeff 5/5 let t24 = circuit_mul(in12, in18); // Fp2 mul start let t25 = circuit_mul(in13, in19); let t26 = circuit_sub(t24, t25); // Fp2 mul real part end let t27 = circuit_mul(in12, in19); let t28 = circuit_mul(in13, in18); let t29 = circuit_add(t27, t28); // Fp2 mul imag part end let t30 = circuit_mul(in14, in20); // Fp2 mul start let t31 = circuit_mul(in15, in21); let t32 = circuit_sub(t30, t31); // Fp2 mul real part end let t33 = circuit_mul(in14, in21); let t34 = circuit_mul(in15, in20); let t35 = circuit_add(t33, t34); // Fp2 mul imag part end let t36 = circuit_mul(in16, in22); // Fp2 mul start let t37 = circuit_mul(in17, in23); let t38 = circuit_sub(t36, t37); // Fp2 mul real part end let t39 = circuit_mul(in16, in23); let t40 = circuit_mul(in17, in22); let t41 = circuit_add(t39, t40); // Fp2 mul imag part end let t42 = circuit_add(in14, in16); // Fp2 add coeff 0/1 let t43 = circuit_add(in15, in17); // Fp2 add coeff 1/1 let t44 = circuit_add(in20, in22); // Fp2 add coeff 0/1 let t45 = circuit_add(in21, in23); // Fp2 add coeff 1/1 let t46 = circuit_mul(t42, t44); // Fp2 mul start let t47 = circuit_mul(t43, t45); let t48 = circuit_sub(t46, t47); // Fp2 mul real part end let t49 = circuit_mul(t42, t45); let t50 = circuit_mul(t43, t44); let t51 = circuit_add(t49, t50); // Fp2 mul imag part end let t52 = circuit_sub(t48, t32); // Fp2 sub coeff 0/1 let t53 = circuit_sub(t51, t35); // Fp2 sub coeff 1/1 let t54 = circuit_sub(t52, t38); // Fp2 sub coeff 0/1 let t55 = circuit_sub(t53, t41); // Fp2 sub coeff 1/1 let t56 = circuit_add(t54, t55); let t57 = circuit_mul(t56, in0); let t58 = circuit_mul(t54, in1); let t59 = circuit_sub(t58, t55); let t60 = circuit_sub(t57, t58); let t61 = circuit_sub(t60, t55); let t62 = circuit_add(t59, t26); // Fp2 add coeff 0/1 let t63 = circuit_add(t61, t29); // Fp2 add coeff 1/1 let t64 = circuit_add(in12, in14); // Fp2 add coeff 0/1 let t65 = circuit_add(in13, in15); // Fp2 add coeff 1/1 let t66 = circuit_add(in18, in20); // Fp2 add coeff 0/1 let t67 = circuit_add(in19, in21); // Fp2 add coeff 1/1 let t68 = circuit_mul(t64, t66); // Fp2 mul start let t69 = circuit_mul(t65, t67); let t70 = circuit_sub(t68, t69); // Fp2 mul real part end let t71 = circuit_mul(t64, t67); let t72 = circuit_mul(t65, t66); let t73 = circuit_add(t71, t72); // Fp2 mul imag part end let t74 = circuit_sub(t70, t26); // Fp2 sub coeff 0/1 let t75 = circuit_sub(t73, t29); // Fp2 sub coeff 1/1 let t76 = circuit_sub(t74, t32); // Fp2 sub coeff 0/1 let t77 = circuit_sub(t75, t35); // Fp2 sub coeff 1/1 let t78 = circuit_add(t38, t41); let t79 = circuit_mul(t78, in0); let t80 = circuit_mul(t38, in1); let t81 = circuit_sub(t80, t41); let t82 = circuit_sub(t79, t80); let t83 = circuit_sub(t82, t41); let t84 = circuit_add(t76, t81); // Fp2 add coeff 0/1 let t85 = circuit_add(t77, t83); // Fp2 add coeff 1/1 let t86 = circuit_add(in12, in16); // Fp2 add coeff 0/1 let t87 = circuit_add(in13, in17); // Fp2 add coeff 1/1 let t88 = circuit_add(in18, in22); // Fp2 add coeff 0/1 let t89 = circuit_add(in19, in23); // Fp2 add coeff 1/1 let t90 = circuit_mul(t88, t86); // Fp2 mul start let t91 = circuit_mul(t89, t87); let t92 = circuit_sub(t90, t91); // Fp2 mul real part end let t93 = circuit_mul(t88, t87); let t94 = circuit_mul(t89, t86); let t95 = circuit_add(t93, t94); // Fp2 mul imag part end let t96 = circuit_sub(t92, t26); // Fp2 sub coeff 0/1 let t97 = circuit_sub(t95, t29); // Fp2 sub coeff 1/1 let t98 = circuit_sub(t96, t38); // Fp2 sub coeff 0/1 let t99 = circuit_sub(t97, t41); // Fp2 sub coeff 1/1 let t100 = circuit_add(t98, t32); // Fp2 add coeff 0/1 let t101 = circuit_add(t99, t35); // Fp2 add coeff 1/1 let t102 = circuit_mul(t0, t18); // Fp2 mul start let t103 = circuit_mul(t1, t19); let t104 = circuit_sub(t102, t103); // Fp2 mul real part end let t105 = circuit_mul(t0, t19); let t106 = circuit_mul(t1, t18); let t107 = circuit_add(t105, t106); // Fp2 mul imag part end let t108 = circuit_mul(t2, t20); // Fp2 mul start let t109 = circuit_mul(t3, t21); let t110 = circuit_sub(t108, t109); // Fp2 mul real part end let t111 = circuit_mul(t2, t21); let t112 = circuit_mul(t3, t20); let t113 = circuit_add(t111, t112); // Fp2 mul imag part end let t114 = circuit_mul(t4, t22); // Fp2 mul start let t115 = circuit_mul(t5, t23); let t116 = circuit_sub(t114, t115); // Fp2 mul real part end let t117 = circuit_mul(t4, t23); let t118 = circuit_mul(t5, t22); let t119 = circuit_add(t117, t118); // Fp2 mul imag part end let t120 = circuit_add(t2, t4); // Fp2 add coeff 0/1 let t121 = circuit_add(t3, t5); // Fp2 add coeff 1/1 let t122 = circuit_add(t20, t22); // Fp2 add coeff 0/1 let t123 = circuit_add(t21, t23); // Fp2 add coeff 1/1 let t124 = circuit_mul(t120, t122); // Fp2 mul start let t125 = circuit_mul(t121, t123); let t126 = circuit_sub(t124, t125); // Fp2 mul real part end let t127 = circuit_mul(t120, t123); let t128 = circuit_mul(t121, t122); let t129 = circuit_add(t127, t128); // Fp2 mul imag part end let t130 = circuit_sub(t126, t110); // Fp2 sub coeff 0/1 let t131 = circuit_sub(t129, t113); // Fp2 sub coeff 1/1 let t132 = circuit_sub(t130, t116); // Fp2 sub coeff 0/1 let t133 = circuit_sub(t131, t119); // Fp2 sub coeff 1/1 let t134 = circuit_add(t132, t133); let t135 = circuit_mul(t134, in0); let t136 = circuit_mul(t132, in1); let t137 = circuit_sub(t136, t133); let t138 = circuit_sub(t135, t136); let t139 = circuit_sub(t138, t133); let t140 = circuit_add(t137, t104); // Fp2 add coeff 0/1 let t141 = circuit_add(t139, t107); // Fp2 add coeff 1/1 let t142 = circuit_add(t0, t2); // Fp2 add coeff 0/1 let t143 = circuit_add(t1, t3); // Fp2 add coeff 1/1 let t144 = circuit_add(t18, t20); // Fp2 add coeff 0/1 let t145 = circuit_add(t19, t21); // Fp2 add coeff 1/1 let t146 = circuit_mul(t142, t144); // Fp2 mul start let t147 = circuit_mul(t143, t145); let t148 = circuit_sub(t146, t147); // Fp2 mul real part end let t149 = circuit_mul(t142, t145); let t150 = circuit_mul(t143, t144); let t151 = circuit_add(t149, t150); // Fp2 mul imag part end let t152 = circuit_sub(t148, t104); // Fp2 sub coeff 0/1 let t153 = circuit_sub(t151, t107); // Fp2 sub coeff 1/1 let t154 = circuit_sub(t152, t110); // Fp2 sub coeff 0/1 let t155 = circuit_sub(t153, t113); // Fp2 sub coeff 1/1 let t156 = circuit_add(t116, t119); let t157 = circuit_mul(t156, in0); let t158 = circuit_mul(t116, in1); let t159 = circuit_sub(t158, t119); let t160 = circuit_sub(t157, t158); let t161 = circuit_sub(t160, t119); let t162 = circuit_add(t154, t159); // Fp2 add coeff 0/1 let t163 = circuit_add(t155, t161); // Fp2 add coeff 1/1 let t164 = circuit_add(t0, t4); // Fp2 add coeff 0/1 let t165 = circuit_add(t1, t5); // Fp2 add coeff 1/1 let t166 = circuit_add(t18, t22); // Fp2 add coeff 0/1 let t167 = circuit_add(t19, t23); // Fp2 add coeff 1/1 let t168 = circuit_mul(t166, t164); // Fp2 mul start let t169 = circuit_mul(t167, t165); let t170 = circuit_sub(t168, t169); // Fp2 mul real part end let t171 = circuit_mul(t166, t165); let t172 = circuit_mul(t167, t164); let t173 = circuit_add(t171, t172); // Fp2 mul imag part end let t174 = circuit_sub(t170, t104); // Fp2 sub coeff 0/1 let t175 = circuit_sub(t173, t107); // Fp2 sub coeff 1/1 let t176 = circuit_sub(t174, t116); // Fp2 sub coeff 0/1 let t177 = circuit_sub(t175, t119); // Fp2 sub coeff 1/1 let t178 = circuit_add(t176, t110); // Fp2 add coeff 0/1 let t179 = circuit_add(t177, t113); // Fp2 add coeff 1/1 let t180 = circuit_add(t140, t62); // Fp6 add coeff 0/5 let t181 = circuit_add(t141, t63); // Fp6 add coeff 1/5 let t182 = circuit_add(t162, t84); // Fp6 add coeff 2/5 let t183 = circuit_add(t163, t85); // Fp6 add coeff 3/5 let t184 = circuit_add(t178, t100); // Fp6 add coeff 4/5 let t185 = circuit_add(t179, t101); // Fp6 add coeff 5/5 let t186 = circuit_add(t62, t62); // Fp6 add coeff 0/5 let t187 = circuit_add(t63, t63); // Fp6 add coeff 1/5 let t188 = circuit_add(t84, t84); // Fp6 add coeff 2/5 let t189 = circuit_add(t85, t85); // Fp6 add coeff 3/5 let t190 = circuit_add(t100, t100); // Fp6 add coeff 4/5 let t191 = circuit_add(t101, t101); // Fp6 add coeff 5/5 let t192 = circuit_add(t100, t101); let t193 = circuit_mul(t192, in0); let t194 = circuit_mul(t100, in1); let t195 = circuit_sub(t194, t101); let t196 = circuit_sub(t193, t194); let t197 = circuit_sub(t196, t101); let t198 = circuit_add(t180, t195); // Fp6 add coeff 0/5 let t199 = circuit_add(t181, t197); // Fp6 add coeff 1/5 let t200 = circuit_add(t182, t62); // Fp6 add coeff 2/5 let t201 = circuit_add(t183, t63); // Fp6 add coeff 3/5 let t202 = circuit_add(t184, t84); // Fp6 add coeff 4/5 let t203 = circuit_add(t185, t85); // Fp6 add coeff 5/5 let t204 = circuit_add(in8, in9); // Doubling slope numerator start let t205 = circuit_sub(in8, in9); let t206 = circuit_mul(t204, t205); let t207 = circuit_mul(in8, in9); let t208 = circuit_mul(t206, in3); let t209 = circuit_mul(t207, in4); // Doubling slope numerator end let t210 = circuit_add(in10, in10); // Fp2 add coeff 0/1 let t211 = circuit_add(in11, in11); // Fp2 add coeff 1/1 let t212 = circuit_mul(t210, t210); // Fp2 Inv start let t213 = circuit_mul(t211, t211); let t214 = circuit_add(t212, t213); let t215 = circuit_inverse(t214); let t216 = circuit_mul(t210, t215); // Fp2 Inv real part end let t217 = circuit_mul(t211, t215); let t218 = circuit_sub(in2, t217); // Fp2 Inv imag part end let t219 = circuit_mul(t208, t216); // Fp2 mul start let t220 = circuit_mul(t209, t218); let t221 = circuit_sub(t219, t220); // Fp2 mul real part end let t222 = circuit_mul(t208, t218); let t223 = circuit_mul(t209, t216); let t224 = circuit_add(t222, t223); // Fp2 mul imag part end let t225 = circuit_add(t221, t224); let t226 = circuit_sub(t221, t224); let t227 = circuit_mul(t225, t226); let t228 = circuit_mul(t221, t224); let t229 = circuit_add(t228, t228); let t230 = circuit_add(in8, in8); // Fp2 add coeff 0/1 let t231 = circuit_add(in9, in9); // Fp2 add coeff 1/1 let t232 = circuit_sub(t227, t230); // Fp2 sub coeff 0/1 let t233 = circuit_sub(t229, t231); // Fp2 sub coeff 1/1 let t234 = circuit_sub(in8, t232); // Fp2 sub coeff 0/1 let t235 = circuit_sub(in9, t233); // Fp2 sub coeff 1/1 let t236 = circuit_mul(t221, t234); // Fp2 mul start let t237 = circuit_mul(t224, t235); let t238 = circuit_sub(t236, t237); // Fp2 mul real part end let t239 = circuit_mul(t221, t235); let t240 = circuit_mul(t224, t234); let t241 = circuit_add(t239, t240); // Fp2 mul imag part end let t242 = circuit_sub(t238, in10); // Fp2 sub coeff 0/1 let t243 = circuit_sub(t241, in11); // Fp2 sub coeff 1/1 let t244 = circuit_mul(t221, in8); // Fp2 mul start let t245 = circuit_mul(t224, in9); let t246 = circuit_sub(t244, t245); // Fp2 mul real part end let t247 = circuit_mul(t221, in9); let t248 = circuit_mul(t224, in8); let t249 = circuit_add(t247, t248); // Fp2 mul imag part end let t250 = circuit_sub(t246, in10); // Fp2 sub coeff 0/1 let t251 = circuit_sub(t249, in11); // Fp2 sub coeff 1/1 let t252 = circuit_mul(t221, in7); let t253 = circuit_mul(t224, in7); let t254 = circuit_mul(t250, in6); let t255 = circuit_mul(t251, in6); let t256 = circuit_mul(t186, t252); // Fp2 mul start let t257 = circuit_mul(t187, t253); let t258 = circuit_sub(t256, t257); // Fp2 mul real part end let t259 = circuit_mul(t186, t253); let t260 = circuit_mul(t187, t252); let t261 = circuit_add(t259, t260); // Fp2 mul imag part end let t262 = circuit_mul(t188, t254); // Fp2 mul start let t263 = circuit_mul(t189, t255); let t264 = circuit_sub(t262, t263); // Fp2 mul real part end let t265 = circuit_mul(t188, t255); let t266 = circuit_mul(t189, t254); let t267 = circuit_add(t265, t266); // Fp2 mul imag part end let t268 = circuit_add(t188, t190); // Fp2 add coeff 0/1 let t269 = circuit_add(t189, t191); // Fp2 add coeff 1/1 let t270 = circuit_mul(t254, t268); // Fp2 mul start let t271 = circuit_mul(t255, t269); let t272 = circuit_sub(t270, t271); // Fp2 mul real part end let t273 = circuit_mul(t254, t269); let t274 = circuit_mul(t255, t268); let t275 = circuit_add(t273, t274); // Fp2 mul imag part end let t276 = circuit_sub(t272, t264); // Fp2 sub coeff 0/1 let t277 = circuit_sub(t275, t267); // Fp2 sub coeff 1/1 let t278 = circuit_add(t276, t277); let t279 = circuit_mul(t278, in0); let t280 = circuit_mul(t276, in1); let t281 = circuit_sub(t280, t277); let t282 = circuit_sub(t279, t280); let t283 = circuit_sub(t282, t277); let t284 = circuit_add(t281, t258); // Fp2 add coeff 0/1 let t285 = circuit_add(t283, t261); // Fp2 add coeff 1/1 let t286 = circuit_add(t186, t190); // Fp2 add coeff 0/1 let t287 = circuit_add(t187, t191); // Fp2 add coeff 1/1 let t288 = circuit_mul(t252, t286); // Fp2 mul start let t289 = circuit_mul(t253, t287); let t290 = circuit_sub(t288, t289); // Fp2 mul real part end let t291 = circuit_mul(t252, t287); let t292 = circuit_mul(t253, t286); let t293 = circuit_add(t291, t292); // Fp2 mul imag part end let t294 = circuit_sub(t290, t258); // Fp2 sub coeff 0/1 let t295 = circuit_sub(t293, t261); // Fp2 sub coeff 1/1 let t296 = circuit_add(t294, t264); // Fp2 add coeff 0/1 let t297 = circuit_add(t295, t267); // Fp2 add coeff 1/1 let t298 = circuit_add(t252, t254); // Fp2 add coeff 0/1 let t299 = circuit_add(t253, t255); // Fp2 add coeff 1/1 let t300 = circuit_add(t186, t188); // Fp2 add coeff 0/1 let t301 = circuit_add(t187, t189); // Fp2 add coeff 1/1 let t302 = circuit_mul(t298, t300); // Fp2 mul start let t303 = circuit_mul(t299, t301); let t304 = circuit_sub(t302, t303); // Fp2 mul real part end let t305 = circuit_mul(t298, t301); let t306 = circuit_mul(t299, t300); let t307 = circuit_add(t305, t306); // Fp2 mul imag part end let t308 = circuit_sub(t304, t258); // Fp2 sub coeff 0/1 let t309 = circuit_sub(t307, t261); // Fp2 sub coeff 1/1 let t310 = circuit_sub(t308, t264); // Fp2 sub coeff 0/1 let t311 = circuit_sub(t309, t267); // Fp2 sub coeff 1/1 let t312 = circuit_add(in5, t252); // Fp2 add coeff 0/1 let t313 = circuit_add(in2, t253); // Fp2 add coeff 1/1 let t314 = circuit_add(t198, t186); // Fp6 add coeff 0/5 let t315 = circuit_add(t199, t187); // Fp6 add coeff 1/5 let t316 = circuit_add(t200, t188); // Fp6 add coeff 2/5 let t317 = circuit_add(t201, t189); // Fp6 add coeff 3/5 let t318 = circuit_add(t202, t190); // Fp6 add coeff 4/5 let t319 = circuit_add(t203, t191); // Fp6 add coeff 5/5 let t320 = circuit_mul(t314, t312); // Fp2 mul start let t321 = circuit_mul(t315, t313); let t322 = circuit_sub(t320, t321); // Fp2 mul real part end let t323 = circuit_mul(t314, t313); let t324 = circuit_mul(t315, t312); let t325 = circuit_add(t323, t324); // Fp2 mul imag part end let t326 = circuit_mul(t316, t254); // Fp2 mul start let t327 = circuit_mul(t317, t255); let t328 = circuit_sub(t326, t327); // Fp2 mul real part end let t329 = circuit_mul(t316, t255); let t330 = circuit_mul(t317, t254); let t331 = circuit_add(t329, t330); // Fp2 mul imag part end let t332 = circuit_add(t316, t318); // Fp2 add coeff 0/1 let t333 = circuit_add(t317, t319); // Fp2 add coeff 1/1 let t334 = circuit_mul(t254, t332); // Fp2 mul start let t335 = circuit_mul(t255, t333); let t336 = circuit_sub(t334, t335); // Fp2 mul real part end let t337 = circuit_mul(t254, t333); let t338 = circuit_mul(t255, t332); let t339 = circuit_add(t337, t338); // Fp2 mul imag part end let t340 = circuit_sub(t336, t328); // Fp2 sub coeff 0/1 let t341 = circuit_sub(t339, t331); // Fp2 sub coeff 1/1 let t342 = circuit_add(t340, t341); let t343 = circuit_mul(t342, in0); let t344 = circuit_mul(t340, in1); let t345 = circuit_sub(t344, t341); let t346 = circuit_sub(t343, t344); let t347 = circuit_sub(t346, t341); let t348 = circuit_add(t345, t322); // Fp2 add coeff 0/1 let t349 = circuit_add(t347, t325); // Fp2 add coeff 1/1 let t350 = circuit_add(t314, t318); // Fp2 add coeff 0/1 let t351 = circuit_add(t315, t319); // Fp2 add coeff 1/1 let t352 = circuit_mul(t312, t350); // Fp2 mul start let t353 = circuit_mul(t313, t351); let t354 = circuit_sub(t352, t353); // Fp2 mul real part end let t355 = circuit_mul(t312, t351); let t356 = circuit_mul(t313, t350); let t357 = circuit_add(t355, t356); // Fp2 mul imag part end let t358 = circuit_sub(t354, t322); // Fp2 sub coeff 0/1 let t359 = circuit_sub(t357, t325); // Fp2 sub coeff 1/1 let t360 = circuit_add(t358, t328); // Fp2 add coeff 0/1 let t361 = circuit_add(t359, t331); // Fp2 add coeff 1/1 let t362 = circuit_add(t312, t254); // Fp2 add coeff 0/1 let t363 = circuit_add(t313, t255); // Fp2 add coeff 1/1 let t364 = circuit_add(t314, t316); // Fp2 add coeff 0/1 let t365 = circuit_add(t315, t317); // Fp2 add coeff 1/1 let t366 = circuit_mul(t362, t364); // Fp2 mul start let t367 = circuit_mul(t363, t365); let t368 = circuit_sub(t366, t367); // Fp2 mul real part end let t369 = circuit_mul(t362, t365); let t370 = circuit_mul(t363, t364); let t371 = circuit_add(t369, t370); // Fp2 mul imag part end let t372 = circuit_sub(t368, t322); // Fp2 sub coeff 0/1 let t373 = circuit_sub(t371, t325); // Fp2 sub coeff 1/1 let t374 = circuit_sub(t372, t328); // Fp2 sub coeff 0/1 let t375 = circuit_sub(t373, t331); // Fp2 sub coeff 1/1 let t376 = circuit_add(t198, t284); // Fp6 add coeff 0/5 let t377 = circuit_add(t199, t285); // Fp6 add coeff 1/5 let t378 = circuit_add(t200, t310); // Fp6 add coeff 2/5 let t379 = circuit_add(t201, t311); // Fp6 add coeff 3/5 let t380 = circuit_add(t202, t296); // Fp6 add coeff 4/5 let t381 = circuit_add(t203, t297); // Fp6 add coeff 5/5 let t382 = circuit_sub(in2, t376); // Fp6 neg coeff 0/5 let t383 = circuit_sub(in2, t377); // Fp6 neg coeff 1/5 let t384 = circuit_sub(in2, t378); // Fp6 neg coeff 2/5 let t385 = circuit_sub(in2, t379); // Fp6 neg coeff 3/5 let t386 = circuit_sub(in2, t380); // Fp6 neg coeff 4/5 let t387 = circuit_sub(in2, t381); // Fp6 neg coeff 5/5 let t388 = circuit_add(t382, t348); // Fp6 add coeff 0/5 let t389 = circuit_add(t383, t349); // Fp6 add coeff 1/5 let t390 = circuit_add(t384, t374); // Fp6 add coeff 2/5 let t391 = circuit_add(t385, t375); // Fp6 add coeff 3/5 let t392 = circuit_add(t386, t360); // Fp6 add coeff 4/5 let t393 = circuit_add(t387, t361); // Fp6 add coeff 5/5 let t394 = circuit_add(t296, t297); let t395 = circuit_mul(t394, in0); let t396 = circuit_mul(t296, in1); let t397 = circuit_sub(t396, t297); let t398 = circuit_sub(t395, t396); let t399 = circuit_sub(t398, t297); let t400 = circuit_add(t397, t198); // Fp6 add coeff 0/5 let t401 = circuit_add(t399, t199); // Fp6 add coeff 1/5 let t402 = circuit_add(t284, t200); // Fp6 add coeff 2/5 let t403 = circuit_add(t285, t201); // Fp6 add coeff 3/5 let t404 = circuit_add(t310, t202); // Fp6 add coeff 4/5 let t405 = circuit_add(t311, t203); // Fp6 add coeff 5/5 let t406 = circuit_add(t232, t233); let t407 = circuit_add(t406, t242); let t408 = circuit_add(t407, t243); let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = ( t408, t400, t401, t402, t403, t404, t405, t388, t389, t390, t391, t392, t393, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0xa, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x9, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in2 circuit_inputs = circuit_inputs.next_2([0x3, 0x0, 0x0, 0x0]); // in3 circuit_inputs = circuit_inputs.next_2([0x6, 0x0, 0x0, 0x0]); // in4 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in5 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in6 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in7 circuit_inputs = circuit_inputs.next_2(Q_0.x0); // in8 circuit_inputs = circuit_inputs.next_2(Q_0.x1); // in9 circuit_inputs = circuit_inputs.next_2(Q_0.y0); // in10 circuit_inputs = circuit_inputs.next_2(Q_0.y1); // in11 circuit_inputs = circuit_inputs.next_2(M_i.c0b0a0); // in12 circuit_inputs = circuit_inputs.next_2(M_i.c0b0a1); // in13 circuit_inputs = circuit_inputs.next_2(M_i.c0b1a0); // in14 circuit_inputs = circuit_inputs.next_2(M_i.c0b1a1); // in15 circuit_inputs = circuit_inputs.next_2(M_i.c0b2a0); // in16 circuit_inputs = circuit_inputs.next_2(M_i.c0b2a1); // in17 circuit_inputs = circuit_inputs.next_2(M_i.c1b0a0); // in18 circuit_inputs = circuit_inputs.next_2(M_i.c1b0a1); // in19 circuit_inputs = circuit_inputs.next_2(M_i.c1b1a0); // in20 circuit_inputs = circuit_inputs.next_2(M_i.c1b1a1); // in21 circuit_inputs = circuit_inputs.next_2(M_i.c1b2a0); // in22 circuit_inputs = circuit_inputs.next_2(M_i.c1b2a1); // in23 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t232), x1: outputs.get_output(t233), y0: outputs.get_output(t242), y1: outputs.get_output(t243), }; let Mi_plus_one: E12T = E12T { c0b0a0: outputs.get_output(t400), c0b0a1: outputs.get_output(t401), c0b1a0: outputs.get_output(t402), c0b1a1: outputs.get_output(t403), c0b2a0: outputs.get_output(t404), c0b2a1: outputs.get_output(t405), c1b0a0: outputs.get_output(t388), c1b0a1: outputs.get_output(t389), c1b1a0: outputs.get_output(t390), c1b1a1: outputs.get_output(t391), c1b2a0: outputs.get_output(t392), c1b2a1: outputs.get_output(t393), }; return (Q0, Mi_plus_one); } #[inline(always)] pub fn run_BN254_TOWER_MILLER_BIT1_1P_circuit( yInv_0: u384, xNegOverY_0: u384, Q_0: G2Point, Q_or_Q_neg_0: G2Point, M_i: E12T, ) -> (G2Point, E12T) { // CONSTANT stack let in0 = CE::> {}; // 0xa let in1 = CE::> {}; // 0x9 let in2 = CE::> {}; // 0x0 let in3 = CE::> {}; // 0x1 // INPUT stack let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let (in7, in8, in9) = (CE::> {}, CE::> {}, CE::> {}); let (in10, in11, in12) = (CE::> {}, CE::> {}, CE::> {}); let (in13, in14, in15) = (CE::> {}, CE::> {}, CE::> {}); let (in16, in17, in18) = (CE::> {}, CE::> {}, CE::> {}); let (in19, in20, in21) = (CE::> {}, CE::> {}, CE::> {}); let (in22, in23, in24) = (CE::> {}, CE::> {}, CE::> {}); let in25 = CE::> {}; let t0 = circuit_sub(in14, in20); // Fp6 sub coeff 0/5 let t1 = circuit_sub(in15, in21); // Fp6 sub coeff 1/5 let t2 = circuit_sub(in16, in22); // Fp6 sub coeff 2/5 let t3 = circuit_sub(in17, in23); // Fp6 sub coeff 3/5 let t4 = circuit_sub(in18, in24); // Fp6 sub coeff 4/5 let t5 = circuit_sub(in19, in25); // Fp6 sub coeff 5/5 let t6 = circuit_add(in24, in25); let t7 = circuit_mul(t6, in0); let t8 = circuit_mul(in24, in1); let t9 = circuit_sub(t8, in25); let t10 = circuit_sub(t7, t8); let t11 = circuit_sub(t10, in25); let t12 = circuit_sub(in2, t9); // Fp6 neg coeff 0/5 let t13 = circuit_sub(in2, t11); // Fp6 neg coeff 1/5 let t14 = circuit_sub(in2, in20); // Fp6 neg coeff 2/5 let t15 = circuit_sub(in2, in21); // Fp6 neg coeff 3/5 let t16 = circuit_sub(in2, in22); // Fp6 neg coeff 4/5 let t17 = circuit_sub(in2, in23); // Fp6 neg coeff 5/5 let t18 = circuit_add(in14, t12); // Fp6 add coeff 0/5 let t19 = circuit_add(in15, t13); // Fp6 add coeff 1/5 let t20 = circuit_add(in16, t14); // Fp6 add coeff 2/5 let t21 = circuit_add(in17, t15); // Fp6 add coeff 3/5 let t22 = circuit_add(in18, t16); // Fp6 add coeff 4/5 let t23 = circuit_add(in19, t17); // Fp6 add coeff 5/5 let t24 = circuit_mul(in14, in20); // Fp2 mul start let t25 = circuit_mul(in15, in21); let t26 = circuit_sub(t24, t25); // Fp2 mul real part end let t27 = circuit_mul(in14, in21); let t28 = circuit_mul(in15, in20); let t29 = circuit_add(t27, t28); // Fp2 mul imag part end let t30 = circuit_mul(in16, in22); // Fp2 mul start let t31 = circuit_mul(in17, in23); let t32 = circuit_sub(t30, t31); // Fp2 mul real part end let t33 = circuit_mul(in16, in23); let t34 = circuit_mul(in17, in22); let t35 = circuit_add(t33, t34); // Fp2 mul imag part end let t36 = circuit_mul(in18, in24); // Fp2 mul start let t37 = circuit_mul(in19, in25); let t38 = circuit_sub(t36, t37); // Fp2 mul real part end let t39 = circuit_mul(in18, in25); let t40 = circuit_mul(in19, in24); let t41 = circuit_add(t39, t40); // Fp2 mul imag part end let t42 = circuit_add(in16, in18); // Fp2 add coeff 0/1 let t43 = circuit_add(in17, in19); // Fp2 add coeff 1/1 let t44 = circuit_add(in22, in24); // Fp2 add coeff 0/1 let t45 = circuit_add(in23, in25); // Fp2 add coeff 1/1 let t46 = circuit_mul(t42, t44); // Fp2 mul start let t47 = circuit_mul(t43, t45); let t48 = circuit_sub(t46, t47); // Fp2 mul real part end let t49 = circuit_mul(t42, t45); let t50 = circuit_mul(t43, t44); let t51 = circuit_add(t49, t50); // Fp2 mul imag part end let t52 = circuit_sub(t48, t32); // Fp2 sub coeff 0/1 let t53 = circuit_sub(t51, t35); // Fp2 sub coeff 1/1 let t54 = circuit_sub(t52, t38); // Fp2 sub coeff 0/1 let t55 = circuit_sub(t53, t41); // Fp2 sub coeff 1/1 let t56 = circuit_add(t54, t55); let t57 = circuit_mul(t56, in0); let t58 = circuit_mul(t54, in1); let t59 = circuit_sub(t58, t55); let t60 = circuit_sub(t57, t58); let t61 = circuit_sub(t60, t55); let t62 = circuit_add(t59, t26); // Fp2 add coeff 0/1 let t63 = circuit_add(t61, t29); // Fp2 add coeff 1/1 let t64 = circuit_add(in14, in16); // Fp2 add coeff 0/1 let t65 = circuit_add(in15, in17); // Fp2 add coeff 1/1 let t66 = circuit_add(in20, in22); // Fp2 add coeff 0/1 let t67 = circuit_add(in21, in23); // Fp2 add coeff 1/1 let t68 = circuit_mul(t64, t66); // Fp2 mul start let t69 = circuit_mul(t65, t67); let t70 = circuit_sub(t68, t69); // Fp2 mul real part end let t71 = circuit_mul(t64, t67); let t72 = circuit_mul(t65, t66); let t73 = circuit_add(t71, t72); // Fp2 mul imag part end let t74 = circuit_sub(t70, t26); // Fp2 sub coeff 0/1 let t75 = circuit_sub(t73, t29); // Fp2 sub coeff 1/1 let t76 = circuit_sub(t74, t32); // Fp2 sub coeff 0/1 let t77 = circuit_sub(t75, t35); // Fp2 sub coeff 1/1 let t78 = circuit_add(t38, t41); let t79 = circuit_mul(t78, in0); let t80 = circuit_mul(t38, in1); let t81 = circuit_sub(t80, t41); let t82 = circuit_sub(t79, t80); let t83 = circuit_sub(t82, t41); let t84 = circuit_add(t76, t81); // Fp2 add coeff 0/1 let t85 = circuit_add(t77, t83); // Fp2 add coeff 1/1 let t86 = circuit_add(in14, in18); // Fp2 add coeff 0/1 let t87 = circuit_add(in15, in19); // Fp2 add coeff 1/1 let t88 = circuit_add(in20, in24); // Fp2 add coeff 0/1 let t89 = circuit_add(in21, in25); // Fp2 add coeff 1/1 let t90 = circuit_mul(t88, t86); // Fp2 mul start let t91 = circuit_mul(t89, t87); let t92 = circuit_sub(t90, t91); // Fp2 mul real part end let t93 = circuit_mul(t88, t87); let t94 = circuit_mul(t89, t86); let t95 = circuit_add(t93, t94); // Fp2 mul imag part end let t96 = circuit_sub(t92, t26); // Fp2 sub coeff 0/1 let t97 = circuit_sub(t95, t29); // Fp2 sub coeff 1/1 let t98 = circuit_sub(t96, t38); // Fp2 sub coeff 0/1 let t99 = circuit_sub(t97, t41); // Fp2 sub coeff 1/1 let t100 = circuit_add(t98, t32); // Fp2 add coeff 0/1 let t101 = circuit_add(t99, t35); // Fp2 add coeff 1/1 let t102 = circuit_mul(t0, t18); // Fp2 mul start let t103 = circuit_mul(t1, t19); let t104 = circuit_sub(t102, t103); // Fp2 mul real part end let t105 = circuit_mul(t0, t19); let t106 = circuit_mul(t1, t18); let t107 = circuit_add(t105, t106); // Fp2 mul imag part end let t108 = circuit_mul(t2, t20); // Fp2 mul start let t109 = circuit_mul(t3, t21); let t110 = circuit_sub(t108, t109); // Fp2 mul real part end let t111 = circuit_mul(t2, t21); let t112 = circuit_mul(t3, t20); let t113 = circuit_add(t111, t112); // Fp2 mul imag part end let t114 = circuit_mul(t4, t22); // Fp2 mul start let t115 = circuit_mul(t5, t23); let t116 = circuit_sub(t114, t115); // Fp2 mul real part end let t117 = circuit_mul(t4, t23); let t118 = circuit_mul(t5, t22); let t119 = circuit_add(t117, t118); // Fp2 mul imag part end let t120 = circuit_add(t2, t4); // Fp2 add coeff 0/1 let t121 = circuit_add(t3, t5); // Fp2 add coeff 1/1 let t122 = circuit_add(t20, t22); // Fp2 add coeff 0/1 let t123 = circuit_add(t21, t23); // Fp2 add coeff 1/1 let t124 = circuit_mul(t120, t122); // Fp2 mul start let t125 = circuit_mul(t121, t123); let t126 = circuit_sub(t124, t125); // Fp2 mul real part end let t127 = circuit_mul(t120, t123); let t128 = circuit_mul(t121, t122); let t129 = circuit_add(t127, t128); // Fp2 mul imag part end let t130 = circuit_sub(t126, t110); // Fp2 sub coeff 0/1 let t131 = circuit_sub(t129, t113); // Fp2 sub coeff 1/1 let t132 = circuit_sub(t130, t116); // Fp2 sub coeff 0/1 let t133 = circuit_sub(t131, t119); // Fp2 sub coeff 1/1 let t134 = circuit_add(t132, t133); let t135 = circuit_mul(t134, in0); let t136 = circuit_mul(t132, in1); let t137 = circuit_sub(t136, t133); let t138 = circuit_sub(t135, t136); let t139 = circuit_sub(t138, t133); let t140 = circuit_add(t137, t104); // Fp2 add coeff 0/1 let t141 = circuit_add(t139, t107); // Fp2 add coeff 1/1 let t142 = circuit_add(t0, t2); // Fp2 add coeff 0/1 let t143 = circuit_add(t1, t3); // Fp2 add coeff 1/1 let t144 = circuit_add(t18, t20); // Fp2 add coeff 0/1 let t145 = circuit_add(t19, t21); // Fp2 add coeff 1/1 let t146 = circuit_mul(t142, t144); // Fp2 mul start let t147 = circuit_mul(t143, t145); let t148 = circuit_sub(t146, t147); // Fp2 mul real part end let t149 = circuit_mul(t142, t145); let t150 = circuit_mul(t143, t144); let t151 = circuit_add(t149, t150); // Fp2 mul imag part end let t152 = circuit_sub(t148, t104); // Fp2 sub coeff 0/1 let t153 = circuit_sub(t151, t107); // Fp2 sub coeff 1/1 let t154 = circuit_sub(t152, t110); // Fp2 sub coeff 0/1 let t155 = circuit_sub(t153, t113); // Fp2 sub coeff 1/1 let t156 = circuit_add(t116, t119); let t157 = circuit_mul(t156, in0); let t158 = circuit_mul(t116, in1); let t159 = circuit_sub(t158, t119); let t160 = circuit_sub(t157, t158); let t161 = circuit_sub(t160, t119); let t162 = circuit_add(t154, t159); // Fp2 add coeff 0/1 let t163 = circuit_add(t155, t161); // Fp2 add coeff 1/1 let t164 = circuit_add(t0, t4); // Fp2 add coeff 0/1 let t165 = circuit_add(t1, t5); // Fp2 add coeff 1/1 let t166 = circuit_add(t18, t22); // Fp2 add coeff 0/1 let t167 = circuit_add(t19, t23); // Fp2 add coeff 1/1 let t168 = circuit_mul(t166, t164); // Fp2 mul start let t169 = circuit_mul(t167, t165); let t170 = circuit_sub(t168, t169); // Fp2 mul real part end let t171 = circuit_mul(t166, t165); let t172 = circuit_mul(t167, t164); let t173 = circuit_add(t171, t172); // Fp2 mul imag part end let t174 = circuit_sub(t170, t104); // Fp2 sub coeff 0/1 let t175 = circuit_sub(t173, t107); // Fp2 sub coeff 1/1 let t176 = circuit_sub(t174, t116); // Fp2 sub coeff 0/1 let t177 = circuit_sub(t175, t119); // Fp2 sub coeff 1/1 let t178 = circuit_add(t176, t110); // Fp2 add coeff 0/1 let t179 = circuit_add(t177, t113); // Fp2 add coeff 1/1 let t180 = circuit_add(t140, t62); // Fp6 add coeff 0/5 let t181 = circuit_add(t141, t63); // Fp6 add coeff 1/5 let t182 = circuit_add(t162, t84); // Fp6 add coeff 2/5 let t183 = circuit_add(t163, t85); // Fp6 add coeff 3/5 let t184 = circuit_add(t178, t100); // Fp6 add coeff 4/5 let t185 = circuit_add(t179, t101); // Fp6 add coeff 5/5 let t186 = circuit_add(t62, t62); // Fp6 add coeff 0/5 let t187 = circuit_add(t63, t63); // Fp6 add coeff 1/5 let t188 = circuit_add(t84, t84); // Fp6 add coeff 2/5 let t189 = circuit_add(t85, t85); // Fp6 add coeff 3/5 let t190 = circuit_add(t100, t100); // Fp6 add coeff 4/5 let t191 = circuit_add(t101, t101); // Fp6 add coeff 5/5 let t192 = circuit_add(t100, t101); let t193 = circuit_mul(t192, in0); let t194 = circuit_mul(t100, in1); let t195 = circuit_sub(t194, t101); let t196 = circuit_sub(t193, t194); let t197 = circuit_sub(t196, t101); let t198 = circuit_add(t180, t195); // Fp6 add coeff 0/5 let t199 = circuit_add(t181, t197); // Fp6 add coeff 1/5 let t200 = circuit_add(t182, t62); // Fp6 add coeff 2/5 let t201 = circuit_add(t183, t63); // Fp6 add coeff 3/5 let t202 = circuit_add(t184, t84); // Fp6 add coeff 4/5 let t203 = circuit_add(t185, t85); // Fp6 add coeff 5/5 let t204 = circuit_sub(in8, in12); // Fp2 sub coeff 0/1 let t205 = circuit_sub(in9, in13); // Fp2 sub coeff 1/1 let t206 = circuit_sub(in6, in10); // Fp2 sub coeff 0/1 let t207 = circuit_sub(in7, in11); // Fp2 sub coeff 1/1 let t208 = circuit_mul(t206, t206); // Fp2 Inv start let t209 = circuit_mul(t207, t207); let t210 = circuit_add(t208, t209); let t211 = circuit_inverse(t210); let t212 = circuit_mul(t206, t211); // Fp2 Inv real part end let t213 = circuit_mul(t207, t211); let t214 = circuit_sub(in2, t213); // Fp2 Inv imag part end let t215 = circuit_mul(t204, t212); // Fp2 mul start let t216 = circuit_mul(t205, t214); let t217 = circuit_sub(t215, t216); // Fp2 mul real part end let t218 = circuit_mul(t204, t214); let t219 = circuit_mul(t205, t212); let t220 = circuit_add(t218, t219); // Fp2 mul imag part end let t221 = circuit_add(t217, t220); let t222 = circuit_sub(t217, t220); let t223 = circuit_mul(t221, t222); let t224 = circuit_mul(t217, t220); let t225 = circuit_add(t224, t224); let t226 = circuit_add(in6, in10); // Fp2 add coeff 0/1 let t227 = circuit_add(in7, in11); // Fp2 add coeff 1/1 let t228 = circuit_sub(t223, t226); // Fp2 sub coeff 0/1 let t229 = circuit_sub(t225, t227); // Fp2 sub coeff 1/1 let t230 = circuit_mul(t217, in6); // Fp2 mul start let t231 = circuit_mul(t220, in7); let t232 = circuit_sub(t230, t231); // Fp2 mul real part end let t233 = circuit_mul(t217, in7); let t234 = circuit_mul(t220, in6); let t235 = circuit_add(t233, t234); // Fp2 mul imag part end let t236 = circuit_sub(t232, in8); // Fp2 sub coeff 0/1 let t237 = circuit_sub(t235, in9); // Fp2 sub coeff 1/1 let t238 = circuit_add(in8, in8); // Fp2 add coeff 0/1 let t239 = circuit_add(in9, in9); // Fp2 add coeff 1/1 let t240 = circuit_sub(t228, in6); // Fp2 sub coeff 0/1 let t241 = circuit_sub(t229, in7); // Fp2 sub coeff 1/1 let t242 = circuit_mul(t240, t240); // Fp2 Inv start let t243 = circuit_mul(t241, t241); let t244 = circuit_add(t242, t243); let t245 = circuit_inverse(t244); let t246 = circuit_mul(t240, t245); // Fp2 Inv real part end let t247 = circuit_mul(t241, t245); let t248 = circuit_sub(in2, t247); // Fp2 Inv imag part end let t249 = circuit_mul(t238, t246); // Fp2 mul start let t250 = circuit_mul(t239, t248); let t251 = circuit_sub(t249, t250); // Fp2 mul real part end let t252 = circuit_mul(t238, t248); let t253 = circuit_mul(t239, t246); let t254 = circuit_add(t252, t253); // Fp2 mul imag part end let t255 = circuit_add(t217, t251); // Fp2 add coeff 0/1 let t256 = circuit_add(t220, t254); // Fp2 add coeff 1/1 let t257 = circuit_sub(in2, t255); // Fp2 neg coeff 0/1 let t258 = circuit_sub(in2, t256); // Fp2 neg coeff 1/1 let t259 = circuit_add(t257, t258); let t260 = circuit_sub(t257, t258); let t261 = circuit_mul(t259, t260); let t262 = circuit_mul(t257, t258); let t263 = circuit_add(t262, t262); let t264 = circuit_sub(t261, in6); // Fp2 sub coeff 0/1 let t265 = circuit_sub(t263, in7); // Fp2 sub coeff 1/1 let t266 = circuit_sub(t264, t228); // Fp2 sub coeff 0/1 let t267 = circuit_sub(t265, t229); // Fp2 sub coeff 1/1 let t268 = circuit_sub(in6, t266); // Fp2 sub coeff 0/1 let t269 = circuit_sub(in7, t267); // Fp2 sub coeff 1/1 let t270 = circuit_mul(t257, t268); // Fp2 mul start let t271 = circuit_mul(t258, t269); let t272 = circuit_sub(t270, t271); // Fp2 mul real part end let t273 = circuit_mul(t257, t269); let t274 = circuit_mul(t258, t268); let t275 = circuit_add(t273, t274); // Fp2 mul imag part end let t276 = circuit_sub(t272, in8); // Fp2 sub coeff 0/1 let t277 = circuit_sub(t275, in9); // Fp2 sub coeff 1/1 let t278 = circuit_mul(t257, in6); // Fp2 mul start let t279 = circuit_mul(t258, in7); let t280 = circuit_sub(t278, t279); // Fp2 mul real part end let t281 = circuit_mul(t257, in7); let t282 = circuit_mul(t258, in6); let t283 = circuit_add(t281, t282); // Fp2 mul imag part end let t284 = circuit_sub(t280, in8); // Fp2 sub coeff 0/1 let t285 = circuit_sub(t283, in9); // Fp2 sub coeff 1/1 let t286 = circuit_mul(t217, in5); let t287 = circuit_mul(t220, in5); let t288 = circuit_mul(t236, in4); let t289 = circuit_mul(t237, in4); let t290 = circuit_mul(t257, in5); let t291 = circuit_mul(t258, in5); let t292 = circuit_mul(t284, in4); let t293 = circuit_mul(t285, in4); let t294 = circuit_mul(t186, t286); // Fp2 mul start let t295 = circuit_mul(t187, t287); let t296 = circuit_sub(t294, t295); // Fp2 mul real part end let t297 = circuit_mul(t186, t287); let t298 = circuit_mul(t187, t286); let t299 = circuit_add(t297, t298); // Fp2 mul imag part end let t300 = circuit_mul(t188, t288); // Fp2 mul start let t301 = circuit_mul(t189, t289); let t302 = circuit_sub(t300, t301); // Fp2 mul real part end let t303 = circuit_mul(t188, t289); let t304 = circuit_mul(t189, t288); let t305 = circuit_add(t303, t304); // Fp2 mul imag part end let t306 = circuit_add(t188, t190); // Fp2 add coeff 0/1 let t307 = circuit_add(t189, t191); // Fp2 add coeff 1/1 let t308 = circuit_mul(t288, t306); // Fp2 mul start let t309 = circuit_mul(t289, t307); let t310 = circuit_sub(t308, t309); // Fp2 mul real part end let t311 = circuit_mul(t288, t307); let t312 = circuit_mul(t289, t306); let t313 = circuit_add(t311, t312); // Fp2 mul imag part end let t314 = circuit_sub(t310, t302); // Fp2 sub coeff 0/1 let t315 = circuit_sub(t313, t305); // Fp2 sub coeff 1/1 let t316 = circuit_add(t314, t315); let t317 = circuit_mul(t316, in0); let t318 = circuit_mul(t314, in1); let t319 = circuit_sub(t318, t315); let t320 = circuit_sub(t317, t318); let t321 = circuit_sub(t320, t315); let t322 = circuit_add(t319, t296); // Fp2 add coeff 0/1 let t323 = circuit_add(t321, t299); // Fp2 add coeff 1/1 let t324 = circuit_add(t186, t190); // Fp2 add coeff 0/1 let t325 = circuit_add(t187, t191); // Fp2 add coeff 1/1 let t326 = circuit_mul(t286, t324); // Fp2 mul start let t327 = circuit_mul(t287, t325); let t328 = circuit_sub(t326, t327); // Fp2 mul real part end let t329 = circuit_mul(t286, t325); let t330 = circuit_mul(t287, t324); let t331 = circuit_add(t329, t330); // Fp2 mul imag part end let t332 = circuit_sub(t328, t296); // Fp2 sub coeff 0/1 let t333 = circuit_sub(t331, t299); // Fp2 sub coeff 1/1 let t334 = circuit_add(t332, t302); // Fp2 add coeff 0/1 let t335 = circuit_add(t333, t305); // Fp2 add coeff 1/1 let t336 = circuit_add(t286, t288); // Fp2 add coeff 0/1 let t337 = circuit_add(t287, t289); // Fp2 add coeff 1/1 let t338 = circuit_add(t186, t188); // Fp2 add coeff 0/1 let t339 = circuit_add(t187, t189); // Fp2 add coeff 1/1 let t340 = circuit_mul(t336, t338); // Fp2 mul start let t341 = circuit_mul(t337, t339); let t342 = circuit_sub(t340, t341); // Fp2 mul real part end let t343 = circuit_mul(t336, t339); let t344 = circuit_mul(t337, t338); let t345 = circuit_add(t343, t344); // Fp2 mul imag part end let t346 = circuit_sub(t342, t296); // Fp2 sub coeff 0/1 let t347 = circuit_sub(t345, t299); // Fp2 sub coeff 1/1 let t348 = circuit_sub(t346, t302); // Fp2 sub coeff 0/1 let t349 = circuit_sub(t347, t305); // Fp2 sub coeff 1/1 let t350 = circuit_add(in3, t286); // Fp2 add coeff 0/1 let t351 = circuit_add(in2, t287); // Fp2 add coeff 1/1 let t352 = circuit_add(t198, t186); // Fp6 add coeff 0/5 let t353 = circuit_add(t199, t187); // Fp6 add coeff 1/5 let t354 = circuit_add(t200, t188); // Fp6 add coeff 2/5 let t355 = circuit_add(t201, t189); // Fp6 add coeff 3/5 let t356 = circuit_add(t202, t190); // Fp6 add coeff 4/5 let t357 = circuit_add(t203, t191); // Fp6 add coeff 5/5 let t358 = circuit_mul(t352, t350); // Fp2 mul start let t359 = circuit_mul(t353, t351); let t360 = circuit_sub(t358, t359); // Fp2 mul real part end let t361 = circuit_mul(t352, t351); let t362 = circuit_mul(t353, t350); let t363 = circuit_add(t361, t362); // Fp2 mul imag part end let t364 = circuit_mul(t354, t288); // Fp2 mul start let t365 = circuit_mul(t355, t289); let t366 = circuit_sub(t364, t365); // Fp2 mul real part end let t367 = circuit_mul(t354, t289); let t368 = circuit_mul(t355, t288); let t369 = circuit_add(t367, t368); // Fp2 mul imag part end let t370 = circuit_add(t354, t356); // Fp2 add coeff 0/1 let t371 = circuit_add(t355, t357); // Fp2 add coeff 1/1 let t372 = circuit_mul(t288, t370); // Fp2 mul start let t373 = circuit_mul(t289, t371); let t374 = circuit_sub(t372, t373); // Fp2 mul real part end let t375 = circuit_mul(t288, t371); let t376 = circuit_mul(t289, t370); let t377 = circuit_add(t375, t376); // Fp2 mul imag part end let t378 = circuit_sub(t374, t366); // Fp2 sub coeff 0/1 let t379 = circuit_sub(t377, t369); // Fp2 sub coeff 1/1 let t380 = circuit_add(t378, t379); let t381 = circuit_mul(t380, in0); let t382 = circuit_mul(t378, in1); let t383 = circuit_sub(t382, t379); let t384 = circuit_sub(t381, t382); let t385 = circuit_sub(t384, t379); let t386 = circuit_add(t383, t360); // Fp2 add coeff 0/1 let t387 = circuit_add(t385, t363); // Fp2 add coeff 1/1 let t388 = circuit_add(t352, t356); // Fp2 add coeff 0/1 let t389 = circuit_add(t353, t357); // Fp2 add coeff 1/1 let t390 = circuit_mul(t350, t388); // Fp2 mul start let t391 = circuit_mul(t351, t389); let t392 = circuit_sub(t390, t391); // Fp2 mul real part end let t393 = circuit_mul(t350, t389); let t394 = circuit_mul(t351, t388); let t395 = circuit_add(t393, t394); // Fp2 mul imag part end let t396 = circuit_sub(t392, t360); // Fp2 sub coeff 0/1 let t397 = circuit_sub(t395, t363); // Fp2 sub coeff 1/1 let t398 = circuit_add(t396, t366); // Fp2 add coeff 0/1 let t399 = circuit_add(t397, t369); // Fp2 add coeff 1/1 let t400 = circuit_add(t350, t288); // Fp2 add coeff 0/1 let t401 = circuit_add(t351, t289); // Fp2 add coeff 1/1 let t402 = circuit_add(t352, t354); // Fp2 add coeff 0/1 let t403 = circuit_add(t353, t355); // Fp2 add coeff 1/1 let t404 = circuit_mul(t400, t402); // Fp2 mul start let t405 = circuit_mul(t401, t403); let t406 = circuit_sub(t404, t405); // Fp2 mul real part end let t407 = circuit_mul(t400, t403); let t408 = circuit_mul(t401, t402); let t409 = circuit_add(t407, t408); // Fp2 mul imag part end let t410 = circuit_sub(t406, t360); // Fp2 sub coeff 0/1 let t411 = circuit_sub(t409, t363); // Fp2 sub coeff 1/1 let t412 = circuit_sub(t410, t366); // Fp2 sub coeff 0/1 let t413 = circuit_sub(t411, t369); // Fp2 sub coeff 1/1 let t414 = circuit_add(t198, t322); // Fp6 add coeff 0/5 let t415 = circuit_add(t199, t323); // Fp6 add coeff 1/5 let t416 = circuit_add(t200, t348); // Fp6 add coeff 2/5 let t417 = circuit_add(t201, t349); // Fp6 add coeff 3/5 let t418 = circuit_add(t202, t334); // Fp6 add coeff 4/5 let t419 = circuit_add(t203, t335); // Fp6 add coeff 5/5 let t420 = circuit_sub(in2, t414); // Fp6 neg coeff 0/5 let t421 = circuit_sub(in2, t415); // Fp6 neg coeff 1/5 let t422 = circuit_sub(in2, t416); // Fp6 neg coeff 2/5 let t423 = circuit_sub(in2, t417); // Fp6 neg coeff 3/5 let t424 = circuit_sub(in2, t418); // Fp6 neg coeff 4/5 let t425 = circuit_sub(in2, t419); // Fp6 neg coeff 5/5 let t426 = circuit_add(t420, t386); // Fp6 add coeff 0/5 let t427 = circuit_add(t421, t387); // Fp6 add coeff 1/5 let t428 = circuit_add(t422, t412); // Fp6 add coeff 2/5 let t429 = circuit_add(t423, t413); // Fp6 add coeff 3/5 let t430 = circuit_add(t424, t398); // Fp6 add coeff 4/5 let t431 = circuit_add(t425, t399); // Fp6 add coeff 5/5 let t432 = circuit_add(t334, t335); let t433 = circuit_mul(t432, in0); let t434 = circuit_mul(t334, in1); let t435 = circuit_sub(t434, t335); let t436 = circuit_sub(t433, t434); let t437 = circuit_sub(t436, t335); let t438 = circuit_add(t435, t198); // Fp6 add coeff 0/5 let t439 = circuit_add(t437, t199); // Fp6 add coeff 1/5 let t440 = circuit_add(t322, t200); // Fp6 add coeff 2/5 let t441 = circuit_add(t323, t201); // Fp6 add coeff 3/5 let t442 = circuit_add(t348, t202); // Fp6 add coeff 4/5 let t443 = circuit_add(t349, t203); // Fp6 add coeff 5/5 let t444 = circuit_mul(t426, t290); // Fp2 mul start let t445 = circuit_mul(t427, t291); let t446 = circuit_sub(t444, t445); // Fp2 mul real part end let t447 = circuit_mul(t426, t291); let t448 = circuit_mul(t427, t290); let t449 = circuit_add(t447, t448); // Fp2 mul imag part end let t450 = circuit_mul(t428, t292); // Fp2 mul start let t451 = circuit_mul(t429, t293); let t452 = circuit_sub(t450, t451); // Fp2 mul real part end let t453 = circuit_mul(t428, t293); let t454 = circuit_mul(t429, t292); let t455 = circuit_add(t453, t454); // Fp2 mul imag part end let t456 = circuit_add(t428, t430); // Fp2 add coeff 0/1 let t457 = circuit_add(t429, t431); // Fp2 add coeff 1/1 let t458 = circuit_mul(t292, t456); // Fp2 mul start let t459 = circuit_mul(t293, t457); let t460 = circuit_sub(t458, t459); // Fp2 mul real part end let t461 = circuit_mul(t292, t457); let t462 = circuit_mul(t293, t456); let t463 = circuit_add(t461, t462); // Fp2 mul imag part end let t464 = circuit_sub(t460, t452); // Fp2 sub coeff 0/1 let t465 = circuit_sub(t463, t455); // Fp2 sub coeff 1/1 let t466 = circuit_add(t464, t465); let t467 = circuit_mul(t466, in0); let t468 = circuit_mul(t464, in1); let t469 = circuit_sub(t468, t465); let t470 = circuit_sub(t467, t468); let t471 = circuit_sub(t470, t465); let t472 = circuit_add(t469, t446); // Fp2 add coeff 0/1 let t473 = circuit_add(t471, t449); // Fp2 add coeff 1/1 let t474 = circuit_add(t426, t430); // Fp2 add coeff 0/1 let t475 = circuit_add(t427, t431); // Fp2 add coeff 1/1 let t476 = circuit_mul(t290, t474); // Fp2 mul start let t477 = circuit_mul(t291, t475); let t478 = circuit_sub(t476, t477); // Fp2 mul real part end let t479 = circuit_mul(t290, t475); let t480 = circuit_mul(t291, t474); let t481 = circuit_add(t479, t480); // Fp2 mul imag part end let t482 = circuit_sub(t478, t446); // Fp2 sub coeff 0/1 let t483 = circuit_sub(t481, t449); // Fp2 sub coeff 1/1 let t484 = circuit_add(t482, t452); // Fp2 add coeff 0/1 let t485 = circuit_add(t483, t455); // Fp2 add coeff 1/1 let t486 = circuit_add(t290, t292); // Fp2 add coeff 0/1 let t487 = circuit_add(t291, t293); // Fp2 add coeff 1/1 let t488 = circuit_add(t426, t428); // Fp2 add coeff 0/1 let t489 = circuit_add(t427, t429); // Fp2 add coeff 1/1 let t490 = circuit_mul(t486, t488); // Fp2 mul start let t491 = circuit_mul(t487, t489); let t492 = circuit_sub(t490, t491); // Fp2 mul real part end let t493 = circuit_mul(t486, t489); let t494 = circuit_mul(t487, t488); let t495 = circuit_add(t493, t494); // Fp2 mul imag part end let t496 = circuit_sub(t492, t446); // Fp2 sub coeff 0/1 let t497 = circuit_sub(t495, t449); // Fp2 sub coeff 1/1 let t498 = circuit_sub(t496, t452); // Fp2 sub coeff 0/1 let t499 = circuit_sub(t497, t455); // Fp2 sub coeff 1/1 let t500 = circuit_add(in3, t290); // Fp2 add coeff 0/1 let t501 = circuit_add(in2, t291); // Fp2 add coeff 1/1 let t502 = circuit_add(t438, t426); // Fp6 add coeff 0/5 let t503 = circuit_add(t439, t427); // Fp6 add coeff 1/5 let t504 = circuit_add(t440, t428); // Fp6 add coeff 2/5 let t505 = circuit_add(t441, t429); // Fp6 add coeff 3/5 let t506 = circuit_add(t442, t430); // Fp6 add coeff 4/5 let t507 = circuit_add(t443, t431); // Fp6 add coeff 5/5 let t508 = circuit_mul(t502, t500); // Fp2 mul start let t509 = circuit_mul(t503, t501); let t510 = circuit_sub(t508, t509); // Fp2 mul real part end let t511 = circuit_mul(t502, t501); let t512 = circuit_mul(t503, t500); let t513 = circuit_add(t511, t512); // Fp2 mul imag part end let t514 = circuit_mul(t504, t292); // Fp2 mul start let t515 = circuit_mul(t505, t293); let t516 = circuit_sub(t514, t515); // Fp2 mul real part end let t517 = circuit_mul(t504, t293); let t518 = circuit_mul(t505, t292); let t519 = circuit_add(t517, t518); // Fp2 mul imag part end let t520 = circuit_add(t504, t506); // Fp2 add coeff 0/1 let t521 = circuit_add(t505, t507); // Fp2 add coeff 1/1 let t522 = circuit_mul(t292, t520); // Fp2 mul start let t523 = circuit_mul(t293, t521); let t524 = circuit_sub(t522, t523); // Fp2 mul real part end let t525 = circuit_mul(t292, t521); let t526 = circuit_mul(t293, t520); let t527 = circuit_add(t525, t526); // Fp2 mul imag part end let t528 = circuit_sub(t524, t516); // Fp2 sub coeff 0/1 let t529 = circuit_sub(t527, t519); // Fp2 sub coeff 1/1 let t530 = circuit_add(t528, t529); let t531 = circuit_mul(t530, in0); let t532 = circuit_mul(t528, in1); let t533 = circuit_sub(t532, t529); let t534 = circuit_sub(t531, t532); let t535 = circuit_sub(t534, t529); let t536 = circuit_add(t533, t510); // Fp2 add coeff 0/1 let t537 = circuit_add(t535, t513); // Fp2 add coeff 1/1 let t538 = circuit_add(t502, t506); // Fp2 add coeff 0/1 let t539 = circuit_add(t503, t507); // Fp2 add coeff 1/1 let t540 = circuit_mul(t500, t538); // Fp2 mul start let t541 = circuit_mul(t501, t539); let t542 = circuit_sub(t540, t541); // Fp2 mul real part end let t543 = circuit_mul(t500, t539); let t544 = circuit_mul(t501, t538); let t545 = circuit_add(t543, t544); // Fp2 mul imag part end let t546 = circuit_sub(t542, t510); // Fp2 sub coeff 0/1 let t547 = circuit_sub(t545, t513); // Fp2 sub coeff 1/1 let t548 = circuit_add(t546, t516); // Fp2 add coeff 0/1 let t549 = circuit_add(t547, t519); // Fp2 add coeff 1/1 let t550 = circuit_add(t500, t292); // Fp2 add coeff 0/1 let t551 = circuit_add(t501, t293); // Fp2 add coeff 1/1 let t552 = circuit_add(t502, t504); // Fp2 add coeff 0/1 let t553 = circuit_add(t503, t505); // Fp2 add coeff 1/1 let t554 = circuit_mul(t550, t552); // Fp2 mul start let t555 = circuit_mul(t551, t553); let t556 = circuit_sub(t554, t555); // Fp2 mul real part end let t557 = circuit_mul(t550, t553); let t558 = circuit_mul(t551, t552); let t559 = circuit_add(t557, t558); // Fp2 mul imag part end let t560 = circuit_sub(t556, t510); // Fp2 sub coeff 0/1 let t561 = circuit_sub(t559, t513); // Fp2 sub coeff 1/1 let t562 = circuit_sub(t560, t516); // Fp2 sub coeff 0/1 let t563 = circuit_sub(t561, t519); // Fp2 sub coeff 1/1 let t564 = circuit_add(t438, t472); // Fp6 add coeff 0/5 let t565 = circuit_add(t439, t473); // Fp6 add coeff 1/5 let t566 = circuit_add(t440, t498); // Fp6 add coeff 2/5 let t567 = circuit_add(t441, t499); // Fp6 add coeff 3/5 let t568 = circuit_add(t442, t484); // Fp6 add coeff 4/5 let t569 = circuit_add(t443, t485); // Fp6 add coeff 5/5 let t570 = circuit_sub(in2, t564); // Fp6 neg coeff 0/5 let t571 = circuit_sub(in2, t565); // Fp6 neg coeff 1/5 let t572 = circuit_sub(in2, t566); // Fp6 neg coeff 2/5 let t573 = circuit_sub(in2, t567); // Fp6 neg coeff 3/5 let t574 = circuit_sub(in2, t568); // Fp6 neg coeff 4/5 let t575 = circuit_sub(in2, t569); // Fp6 neg coeff 5/5 let t576 = circuit_add(t570, t536); // Fp6 add coeff 0/5 let t577 = circuit_add(t571, t537); // Fp6 add coeff 1/5 let t578 = circuit_add(t572, t562); // Fp6 add coeff 2/5 let t579 = circuit_add(t573, t563); // Fp6 add coeff 3/5 let t580 = circuit_add(t574, t548); // Fp6 add coeff 4/5 let t581 = circuit_add(t575, t549); // Fp6 add coeff 5/5 let t582 = circuit_add(t484, t485); let t583 = circuit_mul(t582, in0); let t584 = circuit_mul(t484, in1); let t585 = circuit_sub(t584, t485); let t586 = circuit_sub(t583, t584); let t587 = circuit_sub(t586, t485); let t588 = circuit_add(t585, t438); // Fp6 add coeff 0/5 let t589 = circuit_add(t587, t439); // Fp6 add coeff 1/5 let t590 = circuit_add(t472, t440); // Fp6 add coeff 2/5 let t591 = circuit_add(t473, t441); // Fp6 add coeff 3/5 let t592 = circuit_add(t498, t442); // Fp6 add coeff 4/5 let t593 = circuit_add(t499, t443); // Fp6 add coeff 5/5 let t594 = circuit_add(t266, t267); let t595 = circuit_add(t594, t276); let t596 = circuit_add(t595, t277); let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = ( t596, t588, t589, t590, t591, t592, t593, t576, t577, t578, t579, t580, t581, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0xa, 0x0, 0x0, 0x0]); // in0 circuit_inputs = circuit_inputs.next_2([0x9, 0x0, 0x0, 0x0]); // in1 circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in2 circuit_inputs = circuit_inputs.next_2([0x1, 0x0, 0x0, 0x0]); // in3 // Fill inputs: circuit_inputs = circuit_inputs.next_2(yInv_0); // in4 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in5 circuit_inputs = circuit_inputs.next_2(Q_0.x0); // in6 circuit_inputs = circuit_inputs.next_2(Q_0.x1); // in7 circuit_inputs = circuit_inputs.next_2(Q_0.y0); // in8 circuit_inputs = circuit_inputs.next_2(Q_0.y1); // in9 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_0.x0); // in10 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_0.x1); // in11 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_0.y0); // in12 circuit_inputs = circuit_inputs.next_2(Q_or_Q_neg_0.y1); // in13 circuit_inputs = circuit_inputs.next_2(M_i.c0b0a0); // in14 circuit_inputs = circuit_inputs.next_2(M_i.c0b0a1); // in15 circuit_inputs = circuit_inputs.next_2(M_i.c0b1a0); // in16 circuit_inputs = circuit_inputs.next_2(M_i.c0b1a1); // in17 circuit_inputs = circuit_inputs.next_2(M_i.c0b2a0); // in18 circuit_inputs = circuit_inputs.next_2(M_i.c0b2a1); // in19 circuit_inputs = circuit_inputs.next_2(M_i.c1b0a0); // in20 circuit_inputs = circuit_inputs.next_2(M_i.c1b0a1); // in21 circuit_inputs = circuit_inputs.next_2(M_i.c1b1a0); // in22 circuit_inputs = circuit_inputs.next_2(M_i.c1b1a1); // in23 circuit_inputs = circuit_inputs.next_2(M_i.c1b2a0); // in24 circuit_inputs = circuit_inputs.next_2(M_i.c1b2a1); // in25 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Q0: G2Point = G2Point { x0: outputs.get_output(t266), x1: outputs.get_output(t267), y0: outputs.get_output(t276), y1: outputs.get_output(t277), }; let Mi_plus_one: E12T = E12T { c0b0a0: outputs.get_output(t588), c0b0a1: outputs.get_output(t589), c0b1a0: outputs.get_output(t590), c0b1a1: outputs.get_output(t591), c0b2a0: outputs.get_output(t592), c0b2a1: outputs.get_output(t593), c1b0a0: outputs.get_output(t576), c1b0a1: outputs.get_output(t577), c1b1a0: outputs.get_output(t578), c1b1a1: outputs.get_output(t579), c1b2a0: outputs.get_output(t580), c1b2a1: outputs.get_output(t581), }; return (Q0, Mi_plus_one); } #[inline(always)] pub fn run_BN254_TOWER_MILLER_FINALIZE_BN_1P_circuit( original_Q0: G2Point, yInv_0: u384, xNegOverY_0: u384, Q_0: G2Point, Mi: E12T, ) -> (E12T,) { // CONSTANT stack let in0 = CE::> {}; // 0x2fb347984f7911f74c0bec3cf559b143b78cc310c2c3330c99e39557176f553d let in1 = CE::> {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 let in2 = CE::> {}; // 0x63cf305489af5dcdc5ec698b6e2f9b9dbaae0eda9c95998dc54014671a0135a let in3 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 let in4 = CE::> {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 let in5 = CE::> {}; // 0x1 let in6 = CE::> {}; // 0x0 let in7 = CE::> {}; // 0xa let in8 = CE::> {}; // 0x9 // INPUT stack let (in9, in10, in11) = (CE::> {}, CE::> {}, CE::> {}); let (in12, in13, in14) = (CE::> {}, CE::> {}, CE::> {}); let (in15, in16, in17) = (CE::> {}, CE::> {}, CE::> {}); let (in18, in19, in20) = (CE::> {}, CE::> {}, CE::> {}); let (in21, in22, in23) = (CE::> {}, CE::> {}, CE::> {}); let (in24, in25, in26) = (CE::> {}, CE::> {}, CE::> {}); let (in27, in28, in29) = (CE::> {}, CE::> {}, CE::> {}); let in30 = CE::> {}; let t0 = circuit_sub(in6, in10); let t1 = circuit_sub(in6, in12); let t2 = circuit_mul(in9, in0); // Fp2 mul start let t3 = circuit_mul(t0, in1); let t4 = circuit_sub(t2, t3); // Fp2 mul real part end let t5 = circuit_mul(in9, in1); let t6 = circuit_mul(t0, in0); let t7 = circuit_add(t5, t6); // Fp2 mul imag part end let t8 = circuit_mul(in11, in2); // Fp2 mul start let t9 = circuit_mul(t1, in3); let t10 = circuit_sub(t8, t9); // Fp2 mul real part end let t11 = circuit_mul(in11, in3); let t12 = circuit_mul(t1, in2); let t13 = circuit_add(t11, t12); // Fp2 mul imag part end let t14 = circuit_mul(in9, in4); // Fp2 scalar mul coeff 0/1 let t15 = circuit_mul(in10, in4); // Fp2 scalar mul coeff 1/1 let t16 = circuit_mul(in11, in5); // Fp2 scalar mul coeff 0/1 let t17 = circuit_mul(in12, in5); // Fp2 scalar mul coeff 1/1 let t18 = circuit_sub(in17, t10); // Fp2 sub coeff 0/1 let t19 = circuit_sub(in18, t13); // Fp2 sub coeff 1/1 let t20 = circuit_sub(in15, t4); // Fp2 sub coeff 0/1 let t21 = circuit_sub(in16, t7); // Fp2 sub coeff 1/1 let t22 = circuit_mul(t20, t20); // Fp2 Inv start let t23 = circuit_mul(t21, t21); let t24 = circuit_add(t22, t23); let t25 = circuit_inverse(t24); let t26 = circuit_mul(t20, t25); // Fp2 Inv real part end let t27 = circuit_mul(t21, t25); let t28 = circuit_sub(in6, t27); // Fp2 Inv imag part end let t29 = circuit_mul(t18, t26); // Fp2 mul start let t30 = circuit_mul(t19, t28); let t31 = circuit_sub(t29, t30); // Fp2 mul real part end let t32 = circuit_mul(t18, t28); let t33 = circuit_mul(t19, t26); let t34 = circuit_add(t32, t33); // Fp2 mul imag part end let t35 = circuit_add(t31, t34); let t36 = circuit_sub(t31, t34); let t37 = circuit_mul(t35, t36); let t38 = circuit_mul(t31, t34); let t39 = circuit_add(t38, t38); let t40 = circuit_add(in15, t4); // Fp2 add coeff 0/1 let t41 = circuit_add(in16, t7); // Fp2 add coeff 1/1 let t42 = circuit_sub(t37, t40); // Fp2 sub coeff 0/1 let t43 = circuit_sub(t39, t41); // Fp2 sub coeff 1/1 let t44 = circuit_sub(in15, t42); // Fp2 sub coeff 0/1 let t45 = circuit_sub(in16, t43); // Fp2 sub coeff 1/1 let t46 = circuit_mul(t31, t44); // Fp2 mul start let t47 = circuit_mul(t34, t45); let t48 = circuit_sub(t46, t47); // Fp2 mul real part end let t49 = circuit_mul(t31, t45); let t50 = circuit_mul(t34, t44); let t51 = circuit_add(t49, t50); // Fp2 mul imag part end let t52 = circuit_sub(t48, in17); // Fp2 sub coeff 0/1 let t53 = circuit_sub(t51, in18); // Fp2 sub coeff 1/1 let t54 = circuit_mul(t31, in15); // Fp2 mul start let t55 = circuit_mul(t34, in16); let t56 = circuit_sub(t54, t55); // Fp2 mul real part end let t57 = circuit_mul(t31, in16); let t58 = circuit_mul(t34, in15); let t59 = circuit_add(t57, t58); // Fp2 mul imag part end let t60 = circuit_sub(t56, in17); // Fp2 sub coeff 0/1 let t61 = circuit_sub(t59, in18); // Fp2 sub coeff 1/1 let t62 = circuit_sub(t52, t16); // Fp2 sub coeff 0/1 let t63 = circuit_sub(t53, t17); // Fp2 sub coeff 1/1 let t64 = circuit_sub(t42, t14); // Fp2 sub coeff 0/1 let t65 = circuit_sub(t43, t15); // Fp2 sub coeff 1/1 let t66 = circuit_mul(t64, t64); // Fp2 Inv start let t67 = circuit_mul(t65, t65); let t68 = circuit_add(t66, t67); let t69 = circuit_inverse(t68); let t70 = circuit_mul(t64, t69); // Fp2 Inv real part end let t71 = circuit_mul(t65, t69); let t72 = circuit_sub(in6, t71); // Fp2 Inv imag part end let t73 = circuit_mul(t62, t70); // Fp2 mul start let t74 = circuit_mul(t63, t72); let t75 = circuit_sub(t73, t74); // Fp2 mul real part end let t76 = circuit_mul(t62, t72); let t77 = circuit_mul(t63, t70); let t78 = circuit_add(t76, t77); // Fp2 mul imag part end let t79 = circuit_mul(t75, t42); // Fp2 mul start let t80 = circuit_mul(t78, t43); let t81 = circuit_sub(t79, t80); // Fp2 mul real part end let t82 = circuit_mul(t75, t43); let t83 = circuit_mul(t78, t42); let t84 = circuit_add(t82, t83); // Fp2 mul imag part end let t85 = circuit_sub(t81, t52); // Fp2 sub coeff 0/1 let t86 = circuit_sub(t84, t53); // Fp2 sub coeff 1/1 let t87 = circuit_mul(t31, in14); let t88 = circuit_mul(t34, in14); let t89 = circuit_mul(t60, in13); let t90 = circuit_mul(t61, in13); let t91 = circuit_mul(t75, in14); let t92 = circuit_mul(t78, in14); let t93 = circuit_mul(t85, in13); let t94 = circuit_mul(t86, in13); let t95 = circuit_mul(t91, t87); // Fp2 mul start let t96 = circuit_mul(t92, t88); let t97 = circuit_sub(t95, t96); // Fp2 mul real part end let t98 = circuit_mul(t91, t88); let t99 = circuit_mul(t92, t87); let t100 = circuit_add(t98, t99); // Fp2 mul imag part end let t101 = circuit_mul(t93, t89); // Fp2 mul start let t102 = circuit_mul(t94, t90); let t103 = circuit_sub(t101, t102); // Fp2 mul real part end let t104 = circuit_mul(t93, t90); let t105 = circuit_mul(t94, t89); let t106 = circuit_add(t104, t105); // Fp2 mul imag part end let t107 = circuit_add(t93, t89); // Fp2 add coeff 0/1 let t108 = circuit_add(t94, t90); // Fp2 add coeff 1/1 let t109 = circuit_add(t91, t87); // Fp2 add coeff 0/1 let t110 = circuit_add(t92, t88); // Fp2 add coeff 1/1 let t111 = circuit_add(t91, t93); // Fp2 add coeff 0/1 let t112 = circuit_add(t92, t94); // Fp2 add coeff 1/1 let t113 = circuit_add(t87, t89); // Fp2 add coeff 0/1 let t114 = circuit_add(t88, t90); // Fp2 add coeff 1/1 let t115 = circuit_mul(t113, t111); // Fp2 mul start let t116 = circuit_mul(t114, t112); let t117 = circuit_sub(t115, t116); // Fp2 mul real part end let t118 = circuit_mul(t113, t112); let t119 = circuit_mul(t114, t111); let t120 = circuit_add(t118, t119); // Fp2 mul imag part end let t121 = circuit_sub(t117, t97); // Fp2 sub coeff 0/1 let t122 = circuit_sub(t120, t100); // Fp2 sub coeff 1/1 let t123 = circuit_sub(t121, t103); // Fp2 sub coeff 0/1 let t124 = circuit_sub(t122, t106); // Fp2 sub coeff 1/1 let t125 = circuit_add(t103, t106); let t126 = circuit_mul(t125, in7); let t127 = circuit_mul(t103, in8); let t128 = circuit_sub(t127, t106); let t129 = circuit_sub(t126, t127); let t130 = circuit_sub(t129, t106); let t131 = circuit_add(t128, in5); let t132 = circuit_add(in19, in25); // Fp6 add coeff 0/5 let t133 = circuit_add(in20, in26); // Fp6 add coeff 1/5 let t134 = circuit_add(in21, in27); // Fp6 add coeff 2/5 let t135 = circuit_add(in22, in28); // Fp6 add coeff 3/5 let t136 = circuit_add(in23, in29); // Fp6 add coeff 4/5 let t137 = circuit_add(in24, in30); // Fp6 add coeff 5/5 let t138 = circuit_add(t131, t109); // Fp6 add coeff 0/5 let t139 = circuit_add(t130, t110); // Fp6 add coeff 1/5 let t140 = circuit_add(t97, t107); // Fp6 add coeff 2/5 let t141 = circuit_add(t100, t108); // Fp6 add coeff 3/5 let t142 = circuit_add(t123, in6); // Fp6 add coeff 4/5 let t143 = circuit_add(t124, in6); // Fp6 add coeff 5/5 let t144 = circuit_mul(t132, t138); // Fp2 mul start let t145 = circuit_mul(t133, t139); let t146 = circuit_sub(t144, t145); // Fp2 mul real part end let t147 = circuit_mul(t132, t139); let t148 = circuit_mul(t133, t138); let t149 = circuit_add(t147, t148); // Fp2 mul imag part end let t150 = circuit_mul(t134, t140); // Fp2 mul start let t151 = circuit_mul(t135, t141); let t152 = circuit_sub(t150, t151); // Fp2 mul real part end let t153 = circuit_mul(t134, t141); let t154 = circuit_mul(t135, t140); let t155 = circuit_add(t153, t154); // Fp2 mul imag part end let t156 = circuit_mul(t136, t142); // Fp2 mul start let t157 = circuit_mul(t137, t143); let t158 = circuit_sub(t156, t157); // Fp2 mul real part end let t159 = circuit_mul(t136, t143); let t160 = circuit_mul(t137, t142); let t161 = circuit_add(t159, t160); // Fp2 mul imag part end let t162 = circuit_add(t134, t136); // Fp2 add coeff 0/1 let t163 = circuit_add(t135, t137); // Fp2 add coeff 1/1 let t164 = circuit_add(t140, t142); // Fp2 add coeff 0/1 let t165 = circuit_add(t141, t143); // Fp2 add coeff 1/1 let t166 = circuit_mul(t162, t164); // Fp2 mul start let t167 = circuit_mul(t163, t165); let t168 = circuit_sub(t166, t167); // Fp2 mul real part end let t169 = circuit_mul(t162, t165); let t170 = circuit_mul(t163, t164); let t171 = circuit_add(t169, t170); // Fp2 mul imag part end let t172 = circuit_sub(t168, t152); // Fp2 sub coeff 0/1 let t173 = circuit_sub(t171, t155); // Fp2 sub coeff 1/1 let t174 = circuit_sub(t172, t158); // Fp2 sub coeff 0/1 let t175 = circuit_sub(t173, t161); // Fp2 sub coeff 1/1 let t176 = circuit_add(t174, t175); let t177 = circuit_mul(t176, in7); let t178 = circuit_mul(t174, in8); let t179 = circuit_sub(t178, t175); let t180 = circuit_sub(t177, t178); let t181 = circuit_sub(t180, t175); let t182 = circuit_add(t179, t146); // Fp2 add coeff 0/1 let t183 = circuit_add(t181, t149); // Fp2 add coeff 1/1 let t184 = circuit_add(t132, t134); // Fp2 add coeff 0/1 let t185 = circuit_add(t133, t135); // Fp2 add coeff 1/1 let t186 = circuit_add(t138, t140); // Fp2 add coeff 0/1 let t187 = circuit_add(t139, t141); // Fp2 add coeff 1/1 let t188 = circuit_mul(t184, t186); // Fp2 mul start let t189 = circuit_mul(t185, t187); let t190 = circuit_sub(t188, t189); // Fp2 mul real part end let t191 = circuit_mul(t184, t187); let t192 = circuit_mul(t185, t186); let t193 = circuit_add(t191, t192); // Fp2 mul imag part end let t194 = circuit_sub(t190, t146); // Fp2 sub coeff 0/1 let t195 = circuit_sub(t193, t149); // Fp2 sub coeff 1/1 let t196 = circuit_sub(t194, t152); // Fp2 sub coeff 0/1 let t197 = circuit_sub(t195, t155); // Fp2 sub coeff 1/1 let t198 = circuit_add(t158, t161); let t199 = circuit_mul(t198, in7); let t200 = circuit_mul(t158, in8); let t201 = circuit_sub(t200, t161); let t202 = circuit_sub(t199, t200); let t203 = circuit_sub(t202, t161); let t204 = circuit_add(t196, t201); // Fp2 add coeff 0/1 let t205 = circuit_add(t197, t203); // Fp2 add coeff 1/1 let t206 = circuit_add(t132, t136); // Fp2 add coeff 0/1 let t207 = circuit_add(t133, t137); // Fp2 add coeff 1/1 let t208 = circuit_add(t138, t142); // Fp2 add coeff 0/1 let t209 = circuit_add(t139, t143); // Fp2 add coeff 1/1 let t210 = circuit_mul(t208, t206); // Fp2 mul start let t211 = circuit_mul(t209, t207); let t212 = circuit_sub(t210, t211); // Fp2 mul real part end let t213 = circuit_mul(t208, t207); let t214 = circuit_mul(t209, t206); let t215 = circuit_add(t213, t214); // Fp2 mul imag part end let t216 = circuit_sub(t212, t146); // Fp2 sub coeff 0/1 let t217 = circuit_sub(t215, t149); // Fp2 sub coeff 1/1 let t218 = circuit_sub(t216, t158); // Fp2 sub coeff 0/1 let t219 = circuit_sub(t217, t161); // Fp2 sub coeff 1/1 let t220 = circuit_add(t218, t152); // Fp2 add coeff 0/1 let t221 = circuit_add(t219, t155); // Fp2 add coeff 1/1 let t222 = circuit_mul(in19, t131); // Fp2 mul start let t223 = circuit_mul(in20, t130); let t224 = circuit_sub(t222, t223); // Fp2 mul real part end let t225 = circuit_mul(in19, t130); let t226 = circuit_mul(in20, t131); let t227 = circuit_add(t225, t226); // Fp2 mul imag part end let t228 = circuit_mul(in21, t97); // Fp2 mul start let t229 = circuit_mul(in22, t100); let t230 = circuit_sub(t228, t229); // Fp2 mul real part end let t231 = circuit_mul(in21, t100); let t232 = circuit_mul(in22, t97); let t233 = circuit_add(t231, t232); // Fp2 mul imag part end let t234 = circuit_mul(in23, t123); // Fp2 mul start let t235 = circuit_mul(in24, t124); let t236 = circuit_sub(t234, t235); // Fp2 mul real part end let t237 = circuit_mul(in23, t124); let t238 = circuit_mul(in24, t123); let t239 = circuit_add(t237, t238); // Fp2 mul imag part end let t240 = circuit_add(in21, in23); // Fp2 add coeff 0/1 let t241 = circuit_add(in22, in24); // Fp2 add coeff 1/1 let t242 = circuit_add(t97, t123); // Fp2 add coeff 0/1 let t243 = circuit_add(t100, t124); // Fp2 add coeff 1/1 let t244 = circuit_mul(t240, t242); // Fp2 mul start let t245 = circuit_mul(t241, t243); let t246 = circuit_sub(t244, t245); // Fp2 mul real part end let t247 = circuit_mul(t240, t243); let t248 = circuit_mul(t241, t242); let t249 = circuit_add(t247, t248); // Fp2 mul imag part end let t250 = circuit_sub(t246, t230); // Fp2 sub coeff 0/1 let t251 = circuit_sub(t249, t233); // Fp2 sub coeff 1/1 let t252 = circuit_sub(t250, t236); // Fp2 sub coeff 0/1 let t253 = circuit_sub(t251, t239); // Fp2 sub coeff 1/1 let t254 = circuit_add(t252, t253); let t255 = circuit_mul(t254, in7); let t256 = circuit_mul(t252, in8); let t257 = circuit_sub(t256, t253); let t258 = circuit_sub(t255, t256); let t259 = circuit_sub(t258, t253); let t260 = circuit_add(t257, t224); // Fp2 add coeff 0/1 let t261 = circuit_add(t259, t227); // Fp2 add coeff 1/1 let t262 = circuit_add(in19, in21); // Fp2 add coeff 0/1 let t263 = circuit_add(in20, in22); // Fp2 add coeff 1/1 let t264 = circuit_add(t131, t97); // Fp2 add coeff 0/1 let t265 = circuit_add(t130, t100); // Fp2 add coeff 1/1 let t266 = circuit_mul(t262, t264); // Fp2 mul start let t267 = circuit_mul(t263, t265); let t268 = circuit_sub(t266, t267); // Fp2 mul real part end let t269 = circuit_mul(t262, t265); let t270 = circuit_mul(t263, t264); let t271 = circuit_add(t269, t270); // Fp2 mul imag part end let t272 = circuit_sub(t268, t224); // Fp2 sub coeff 0/1 let t273 = circuit_sub(t271, t227); // Fp2 sub coeff 1/1 let t274 = circuit_sub(t272, t230); // Fp2 sub coeff 0/1 let t275 = circuit_sub(t273, t233); // Fp2 sub coeff 1/1 let t276 = circuit_add(t236, t239); let t277 = circuit_mul(t276, in7); let t278 = circuit_mul(t236, in8); let t279 = circuit_sub(t278, t239); let t280 = circuit_sub(t277, t278); let t281 = circuit_sub(t280, t239); let t282 = circuit_add(t274, t279); // Fp2 add coeff 0/1 let t283 = circuit_add(t275, t281); // Fp2 add coeff 1/1 let t284 = circuit_add(in19, in23); // Fp2 add coeff 0/1 let t285 = circuit_add(in20, in24); // Fp2 add coeff 1/1 let t286 = circuit_add(t131, t123); // Fp2 add coeff 0/1 let t287 = circuit_add(t130, t124); // Fp2 add coeff 1/1 let t288 = circuit_mul(t286, t284); // Fp2 mul start let t289 = circuit_mul(t287, t285); let t290 = circuit_sub(t288, t289); // Fp2 mul real part end let t291 = circuit_mul(t286, t285); let t292 = circuit_mul(t287, t284); let t293 = circuit_add(t291, t292); // Fp2 mul imag part end let t294 = circuit_sub(t290, t224); // Fp2 sub coeff 0/1 let t295 = circuit_sub(t293, t227); // Fp2 sub coeff 1/1 let t296 = circuit_sub(t294, t236); // Fp2 sub coeff 0/1 let t297 = circuit_sub(t295, t239); // Fp2 sub coeff 1/1 let t298 = circuit_add(t296, t230); // Fp2 add coeff 0/1 let t299 = circuit_add(t297, t233); // Fp2 add coeff 1/1 let t300 = circuit_mul(in25, t109); // Fp2 mul start let t301 = circuit_mul(in26, t110); let t302 = circuit_sub(t300, t301); // Fp2 mul real part end let t303 = circuit_mul(in25, t110); let t304 = circuit_mul(in26, t109); let t305 = circuit_add(t303, t304); // Fp2 mul imag part end let t306 = circuit_mul(in27, t107); // Fp2 mul start let t307 = circuit_mul(in28, t108); let t308 = circuit_sub(t306, t307); // Fp2 mul real part end let t309 = circuit_mul(in27, t108); let t310 = circuit_mul(in28, t107); let t311 = circuit_add(t309, t310); // Fp2 mul imag part end let t312 = circuit_mul(in29, in6); // Fp2 mul start let t313 = circuit_mul(in30, in6); let t314 = circuit_sub(t312, t313); // Fp2 mul real part end let t315 = circuit_mul(in29, in6); let t316 = circuit_mul(in30, in6); let t317 = circuit_add(t315, t316); // Fp2 mul imag part end let t318 = circuit_add(in27, in29); // Fp2 add coeff 0/1 let t319 = circuit_add(in28, in30); // Fp2 add coeff 1/1 let t320 = circuit_add(t107, in6); // Fp2 add coeff 0/1 let t321 = circuit_add(t108, in6); // Fp2 add coeff 1/1 let t322 = circuit_mul(t318, t320); // Fp2 mul start let t323 = circuit_mul(t319, t321); let t324 = circuit_sub(t322, t323); // Fp2 mul real part end let t325 = circuit_mul(t318, t321); let t326 = circuit_mul(t319, t320); let t327 = circuit_add(t325, t326); // Fp2 mul imag part end let t328 = circuit_sub(t324, t308); // Fp2 sub coeff 0/1 let t329 = circuit_sub(t327, t311); // Fp2 sub coeff 1/1 let t330 = circuit_sub(t328, t314); // Fp2 sub coeff 0/1 let t331 = circuit_sub(t329, t317); // Fp2 sub coeff 1/1 let t332 = circuit_add(t330, t331); let t333 = circuit_mul(t332, in7); let t334 = circuit_mul(t330, in8); let t335 = circuit_sub(t334, t331); let t336 = circuit_sub(t333, t334); let t337 = circuit_sub(t336, t331); let t338 = circuit_add(t335, t302); // Fp2 add coeff 0/1 let t339 = circuit_add(t337, t305); // Fp2 add coeff 1/1 let t340 = circuit_add(in25, in27); // Fp2 add coeff 0/1 let t341 = circuit_add(in26, in28); // Fp2 add coeff 1/1 let t342 = circuit_add(t109, t107); // Fp2 add coeff 0/1 let t343 = circuit_add(t110, t108); // Fp2 add coeff 1/1 let t344 = circuit_mul(t340, t342); // Fp2 mul start let t345 = circuit_mul(t341, t343); let t346 = circuit_sub(t344, t345); // Fp2 mul real part end let t347 = circuit_mul(t340, t343); let t348 = circuit_mul(t341, t342); let t349 = circuit_add(t347, t348); // Fp2 mul imag part end let t350 = circuit_sub(t346, t302); // Fp2 sub coeff 0/1 let t351 = circuit_sub(t349, t305); // Fp2 sub coeff 1/1 let t352 = circuit_sub(t350, t308); // Fp2 sub coeff 0/1 let t353 = circuit_sub(t351, t311); // Fp2 sub coeff 1/1 let t354 = circuit_add(t314, t317); let t355 = circuit_mul(t354, in7); let t356 = circuit_mul(t314, in8); let t357 = circuit_sub(t356, t317); let t358 = circuit_sub(t355, t356); let t359 = circuit_sub(t358, t317); let t360 = circuit_add(t352, t357); // Fp2 add coeff 0/1 let t361 = circuit_add(t353, t359); // Fp2 add coeff 1/1 let t362 = circuit_add(in25, in29); // Fp2 add coeff 0/1 let t363 = circuit_add(in26, in30); // Fp2 add coeff 1/1 let t364 = circuit_add(t109, in6); // Fp2 add coeff 0/1 let t365 = circuit_add(t110, in6); // Fp2 add coeff 1/1 let t366 = circuit_mul(t364, t362); // Fp2 mul start let t367 = circuit_mul(t365, t363); let t368 = circuit_sub(t366, t367); // Fp2 mul real part end let t369 = circuit_mul(t364, t363); let t370 = circuit_mul(t365, t362); let t371 = circuit_add(t369, t370); // Fp2 mul imag part end let t372 = circuit_sub(t368, t302); // Fp2 sub coeff 0/1 let t373 = circuit_sub(t371, t305); // Fp2 sub coeff 1/1 let t374 = circuit_sub(t372, t314); // Fp2 sub coeff 0/1 let t375 = circuit_sub(t373, t317); // Fp2 sub coeff 1/1 let t376 = circuit_add(t374, t308); // Fp2 add coeff 0/1 let t377 = circuit_add(t375, t311); // Fp2 add coeff 1/1 let t378 = circuit_sub(t182, t260); // Fp6 sub coeff 0/5 let t379 = circuit_sub(t183, t261); // Fp6 sub coeff 1/5 let t380 = circuit_sub(t204, t282); // Fp6 sub coeff 2/5 let t381 = circuit_sub(t205, t283); // Fp6 sub coeff 3/5 let t382 = circuit_sub(t220, t298); // Fp6 sub coeff 4/5 let t383 = circuit_sub(t221, t299); // Fp6 sub coeff 5/5 let t384 = circuit_sub(t378, t338); // Fp6 sub coeff 0/5 let t385 = circuit_sub(t379, t339); // Fp6 sub coeff 1/5 let t386 = circuit_sub(t380, t360); // Fp6 sub coeff 2/5 let t387 = circuit_sub(t381, t361); // Fp6 sub coeff 3/5 let t388 = circuit_sub(t382, t376); // Fp6 sub coeff 4/5 let t389 = circuit_sub(t383, t377); // Fp6 sub coeff 5/5 let t390 = circuit_add(t376, t377); let t391 = circuit_mul(t390, in7); let t392 = circuit_mul(t376, in8); let t393 = circuit_sub(t392, t377); let t394 = circuit_sub(t391, t392); let t395 = circuit_sub(t394, t377); let t396 = circuit_add(t393, t260); // Fp6 add coeff 0/5 let t397 = circuit_add(t395, t261); // Fp6 add coeff 1/5 let t398 = circuit_add(t338, t282); // Fp6 add coeff 2/5 let t399 = circuit_add(t339, t283); // Fp6 add coeff 3/5 let t400 = circuit_add(t360, t298); // Fp6 add coeff 4/5 let t401 = circuit_add(t361, t299); // Fp6 add coeff 5/5 let modulus = crate::definitions::get_BN254_modulus(); // BN254 prime field modulus let mut circuit_inputs = ( t396, t397, t398, t399, t400, t401, t384, t385, t386, t387, t388, t389, ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(TOWER_MILLER_FINALIZE_BN_1P_BN254_CONSTANTS.span()); // in0 - in8 // Fill inputs: circuit_inputs = circuit_inputs.next_2(original_Q0.x0); // in9 circuit_inputs = circuit_inputs.next_2(original_Q0.x1); // in10 circuit_inputs = circuit_inputs.next_2(original_Q0.y0); // in11 circuit_inputs = circuit_inputs.next_2(original_Q0.y1); // in12 circuit_inputs = circuit_inputs.next_2(yInv_0); // in13 circuit_inputs = circuit_inputs.next_2(xNegOverY_0); // in14 circuit_inputs = circuit_inputs.next_2(Q_0.x0); // in15 circuit_inputs = circuit_inputs.next_2(Q_0.x1); // in16 circuit_inputs = circuit_inputs.next_2(Q_0.y0); // in17 circuit_inputs = circuit_inputs.next_2(Q_0.y1); // in18 circuit_inputs = circuit_inputs.next_2(Mi.c0b0a0); // in19 circuit_inputs = circuit_inputs.next_2(Mi.c0b0a1); // in20 circuit_inputs = circuit_inputs.next_2(Mi.c0b1a0); // in21 circuit_inputs = circuit_inputs.next_2(Mi.c0b1a1); // in22 circuit_inputs = circuit_inputs.next_2(Mi.c0b2a0); // in23 circuit_inputs = circuit_inputs.next_2(Mi.c0b2a1); // in24 circuit_inputs = circuit_inputs.next_2(Mi.c1b0a0); // in25 circuit_inputs = circuit_inputs.next_2(Mi.c1b0a1); // in26 circuit_inputs = circuit_inputs.next_2(Mi.c1b1a0); // in27 circuit_inputs = circuit_inputs.next_2(Mi.c1b1a1); // in28 circuit_inputs = circuit_inputs.next_2(Mi.c1b2a0); // in29 circuit_inputs = circuit_inputs.next_2(Mi.c1b2a1); // in30 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let Mi: E12T = E12T { c0b0a0: outputs.get_output(t396), c0b0a1: outputs.get_output(t397), c0b1a0: outputs.get_output(t398), c0b1a1: outputs.get_output(t399), c0b2a0: outputs.get_output(t400), c0b2a1: outputs.get_output(t401), c1b0a0: outputs.get_output(t384), c1b0a1: outputs.get_output(t385), c1b1a0: outputs.get_output(t386), c1b1a1: outputs.get_output(t387), c1b2a0: outputs.get_output(t388), c1b2a1: outputs.get_output(t389), }; return (Mi,); } const TOWER_MILLER_FINALIZE_BN_1P_BN254_CONSTANTS: [u384; 9] = [ u384 { limb0: 0xc2c3330c99e39557176f553d, limb1: 0x4c0bec3cf559b143b78cc310, limb2: 0x2fb347984f7911f7, limb3: 0x0, }, u384 { limb0: 0xb7c9dce1665d51c640fcba2, limb1: 0x4ba4cc8bd75a079432ae2a1d, limb2: 0x16c9e55061ebae20, limb3: 0x0, }, u384 { limb0: 0xa9c95998dc54014671a0135a, limb1: 0xdc5ec698b6e2f9b9dbaae0ed, limb2: 0x63cf305489af5dc, limb3: 0x0, }, u384 { limb0: 0x8fa25bd282d37f632623b0e3, limb1: 0x704b5a7ec796f2b21807dc9, limb2: 0x7c03cbcac41049a, limb3: 0x0, }, u384 { limb0: 0xbb966e3de4bd44e5607cfd48, limb1: 0x5e6dd9e7e0acccb0c28f069f, limb2: 0x30644e72e131a029, limb3: 0x0, }, u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0xa, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x9, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, ]; #[inline(always)] pub fn run_FP6_NEG_circuit( b0a0: u384, b0a1: u384, b1a0: u384, b1a1: u384, b2a0: u384, b2a1: u384, curve_index: usize, ) -> (u384, u384, u384, u384, u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x0 // INPUT stack let (in1, in2, in3) = (CE::> {}, CE::> {}, CE::> {}); let (in4, in5, in6) = (CE::> {}, CE::> {}, CE::> {}); let t0 = circuit_sub(in0, in1); let t1 = circuit_sub(in0, in2); let t2 = circuit_sub(in0, in3); let t3 = circuit_sub(in0, in4); let t4 = circuit_sub(in0, in5); let t5 = circuit_sub(in0, in6); let modulus = crate::definitions::get_modulus(curve_index); let mut circuit_inputs = (t0, t1, t2, t3, t4, t5).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next_2([0x0, 0x0, 0x0, 0x0]); // in0 // Fill inputs: circuit_inputs = circuit_inputs.next_2(b0a0); // in1 circuit_inputs = circuit_inputs.next_2(b0a1); // in2 circuit_inputs = circuit_inputs.next_2(b1a0); // in3 circuit_inputs = circuit_inputs.next_2(b1a1); // in4 circuit_inputs = circuit_inputs.next_2(b2a0); // in5 circuit_inputs = circuit_inputs.next_2(b2a1); // in6 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let r0: u384 = outputs.get_output(t0); let r1: u384 = outputs.get_output(t1); let r2: u384 = outputs.get_output(t2); let r3: u384 = outputs.get_output(t3); let r4: u384 = outputs.get_output(t4); let r5: u384 = outputs.get_output(t5); return (r0, r1, r2, r3, r4, r5); } ================================================ FILE: src/src/core/circuit.cairo ================================================ use core::panic_with_felt252; use corelib_imports::bounded_int::bounded_int; use corelib_imports::circuit::conversions::{ AddHelperTo128By64Impl, AddHelperTo128By96Impl, AddHelperTo96By32Impl, DivRemU128By96, DivRemU96By32, DivRemU96By64, MulHelper32By96Impl, MulHelper64By32Impl, MulHelper64By64Impl, NZ_POW32_TYPED, NZ_POW64_TYPED, NZ_POW96_TYPED, POW64_TYPED, POW96_TYPED, upcast, }; use corelib_imports::circuit::{ AddInputResult, CircuitData, IntoCircuitInputValue, U96Guarantee, add_circuit_input, into_u96_guarantee, u384, u96, }; use garaga::definitions::u288; pub impl U32IntoU384 of Into { fn into(self: u32) -> u384 { u384 { limb0: upcast(self), limb1: 0, limb2: 0, limb3: 0 } } } pub impl U64IntoU384 of Into { fn into(self: u64) -> u384 { u384 { limb0: upcast(self), limb1: 0, limb2: 0, limb3: 0 } } } // Cuts a u384 into a u256. // This is unsafe because it assumes the value is less than 2^256. // Only use when computing circuit with a modulus less than 2^256. #[inline(never)] pub fn into_u256_unchecked(value: u384) -> u256 { let (_, limb2_low) = bounded_int::div_rem(value.limb2, NZ_POW64_TYPED); let (limb1_high, limb1_low) = bounded_int::div_rem(value.limb1, NZ_POW32_TYPED); u256 { high: upcast(bounded_int::add(bounded_int::mul(limb2_low, POW64_TYPED), limb1_high)), low: upcast(bounded_int::add(bounded_int::mul(limb1_low, POW96_TYPED), value.limb0)), } } pub fn u256_to_u384(value: u256) -> u384 { value.into() } pub impl u288IntoCircuitInputValue of IntoCircuitInputValue { fn into_circuit_input_value(self: u288) -> [U96Guarantee; 4] { [ into_u96_guarantee(self.limb0), into_u96_guarantee(self.limb1), into_u96_guarantee(self.limb2), into_u96_guarantee(0_u8), ] } } #[generate_trait] pub impl AddInputResultImpl2 of AddInputResultTrait2 { /// Adds an input to the accumulator. // Inlining to make sure possibly huge `C` won't be in a user function name. // #[inline(never)] fn next_2, +Drop>( self: AddInputResult, value: Value, ) -> AddInputResult { match self { AddInputResult::More(accumulator) => add_circuit_input( accumulator, value.into_circuit_input_value(), ), AddInputResult::Done(_) => panic_with_felt252('All inputs have been filled'), } } // #[inline(never)] fn next_u256(self: AddInputResult, value: u256) -> AddInputResult { let val_u384: u384 = value.into(); self.next_2(val_u384) } // #[inline(never)] fn next_u128(self: AddInputResult, value: u128) -> AddInputResult { let (limb1, limb0) = bounded_int::div_rem(value, NZ_POW96_TYPED); let limb1: u96 = upcast(limb1); let c = match self { AddInputResult::More(accumulator) => add_circuit_input( accumulator, [ into_u96_guarantee(limb0), into_u96_guarantee(limb1), into_u96_guarantee(0_u8), into_u96_guarantee(0_u8), ], ), AddInputResult::Done(_) => panic_with_felt252(0), }; c } // fn next_e12d(self: AddInputResult, value: E12D) -> AddInputResult { // let c = match self { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w0.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w1.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w2.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w3.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w4.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w5.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w6.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w7.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w8.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w9.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w10.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // let c = match c { // AddInputResult::More(accumulator) => add_circuit_input( // accumulator, value.w11.into_circuit_input_value() // ), // AddInputResult::Done(_) => panic_with_felt252(0), // }; // c // } // #[inline] // fn next_array, +Drop>( // self: AddInputResult, value: Array // ) -> AddInputResult { // let mut add_input_result = self; // for v in value { // add_input_result = // add_circuit_input( // match add_input_result { // AddInputResult::More(acc) => acc, // AddInputResult::Done(_) => panic_with_felt252(0), // }, // v.into_circuit_input_value() // ); // }; // add_input_result // } #[inline] fn next_span(self: AddInputResult, value: Span) -> AddInputResult { let mut add_input_result = self; for v in value { add_input_result = add_circuit_input( match add_input_result { AddInputResult::More(acc) => acc, AddInputResult::Done(_) => panic_with_felt252('all inputs filled'), }, (*v).into_circuit_input_value(), ); } add_input_result } // Inlining to make sure possibly huge `C` won't be in a user function name. #[inline(always)] fn done_2(self: AddInputResult) -> CircuitData { match self { AddInputResult::Done(data) => data, AddInputResult::More(_) => panic_with_felt252('not all inputs filled'), } } } ================================================ FILE: src/src/crypto/mmr.cairo ================================================ use crate::hashes::poseidon_bn254::poseidon_hash_2; // Return the number of trailing ones in a 64-bit unsigned integer. // Ex : trailing_ones(0b111) = 3 // The number of parents that need to be added when a new leaf is inserted (using the # of leaves // before insertion) // Ex if n=1 leaf, trailing_ones(1) = 1, when adding a new leave, 1 parent will be created. pub fn trailing_ones(n: u64) -> usize { if n == 0 { return 0; } let mut count = 0; let (mut n, mut mod_n) = DivRem::div_rem(n, 2); while mod_n != 0 { let (_n, _mod_n) = DivRem::div_rem(n, 2); n = _n; mod_n = _mod_n; count += 1; } return count; } // // // def bag_peaks(self, peaks: List[int]) -> int: // bags = peaks[-1] // for peak in reversed(peaks[:-1]): // self._hasher.update(peak) // self._hasher.update(bags) // bags = self._hasher.digest() // return bags pub fn root_from_peaks(n_leaves: u64, peaks: Span) -> u256 { let bagged_peaks = bag_peaks(peaks); return bagged_peaks; } pub fn bag_peaks(mut peaks: Span) -> u256 { let mut res = *peaks.pop_back().unwrap(); while let Some(peak) = peaks.pop_back() { res = poseidon_hash_2(*peak, res); } return res; } #[cfg(test)] mod tests { use super::trailing_ones; #[test] fn test_trailing_ones() { assert(trailing_ones(7) == 3, 'Invalid trailing_ones'); assert(trailing_ones(11) == 2, 'Invalid trailing_ones'); assert(trailing_ones(0) == 0, 'Invalid trailing_ones'); assert(trailing_ones(1) == 1, 'Invalid trailing_ones'); assert(trailing_ones(2) == 0, 'Invalid trailing_ones'); assert(trailing_ones(3) == 2, 'Invalid trailing_ones'); assert(trailing_ones(9) == 1, 'Invalid trailing_ones'); assert(trailing_ones(5) == 1, 'Invalid trailing_ones'); assert(trailing_ones(6) == 0, 'Invalid trailing_ones'); } } ================================================ FILE: src/src/definitions/curves.cairo ================================================ pub use core::circuit::{CircuitModulus, u384, u96}; use garaga::definitions::{G1Point, G1PointZero, G2Point}; /// Square of the BLS12-381 x seed parameter used in curve generation pub const BLS_X_SEED_SQ: u128 = 0xac45a4010001a4020000000100000000; // Curve indices used throughout Garaga: // curve_index 0: BN254 // curve_index 1: BLS12_381 // curve_index 2: SECP256K1 // curve_index 3: SECP256R1 // curve_index 4: ED25519 (stored in Weierstrass form) // curve_index 5: GRUMPKIN /// Complete curve parameters for elliptic curves in Weierstrass form: y² = x³ + ax + b /// /// # Fields /// * `p`: Prime modulus of the base field Fp /// * `n`: Order of the curve (number of points in the prime-order subgroup) /// * `a`: Weierstrass a parameter /// * `b`: Weierstrass b parameter /// * `g`: Generator of the multiplicative group Fp* (for field operations) /// * `min_one`: (-1) mod p, precomputed for efficiency /// * `min_one_order`: (-1) mod n, precomputed for efficiency /// * `G`: Generator point of the curve's prime-order subgroup /// * `b_twist`: Twist curve b parameter (b₀, b₁) where b = b₀ + i·b₁ in Fp2 (for pairing /// curves only) /// * `modulus`: Prime modulus p as 4 limbs of u96 for CircuitModulus operations /// * `order_modulus`: Curve order n as 4 limbs of u96 for CircuitModulus operations /// * `eigenvalue`: GLV endomorphism eigenvalue λ (for curves with efficient endomorphism) /// * `nG_glv_fake_glv`: Precomputed point 2^(nbits-1)·G for GLV decomposition /// * `third_root_of_unity`: Cubic root of unity in Fp (for curves supporting GLV/fake-GLV) pub struct Curve { pub p: u384, // Prime modulus pub n: u256, // Order of the curve pub a: u384, // Weierstrass a parameter in eqn: y^2 = x^3 + ax + b pub b: u384, // Weierstrass b parameter in eqn: y^2 = x^3 + ax + b pub g: u384, // Generator of Fp* (the multiplicative group of the field) pub min_one: u384, // (-1) % p pub min_one_order: u384, // (-1) % n pub G: G1Point, // Generator of the curve pub b_twist: Option< (u384, u384), >, // b parameter for twisted curve (b0, b1) such that b = b0 + i*b1 pub modulus: [u96; 4], // Prime modulus as 4 limbs for CircuitModulus pub order_modulus: [u96; 4], // Curve order as 4 limbs for CircuitModulus pub eigenvalue: Option, // Eigenvalue for endomorphism (if available) pub nG_glv_fake_glv: Option, // 2^(nbits-1)*G for GLV/fake GLV (if available) pub third_root_of_unity: Option // Third root of unity in the base field (if available) } pub const BN254: Curve = Curve { p: u384 { limb0: 0x6871ca8d3c208c16d87cfd47, limb1: 0xb85045b68181585d97816a91, limb2: 0x30644e72e131a029, limb3: 0x0, }, n: u256 { low: 0x2833e84879b9709143e1f593f0000001, high: 0x30644e72e131a029b85045b68181585d }, a: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, b: u384 { limb0: 0x3, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, g: u384 { limb0: 0x3, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, min_one: u384 { limb0: 0x6871ca8d3c208c16d87cfd46, limb1: 0xb85045b68181585d97816a91, limb2: 0x30644e72e131a029, limb3: 0x0, }, min_one_order: u384 { limb0: 0x79b9709143e1f593f0000000, limb1: 0xb85045b68181585d2833e848, limb2: 0x30644e72e131a029, limb3: 0x0, }, G: G1Point { x: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, y: u384 { limb0: 0x2, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }, b_twist: Some( ( u384 { limb0: 27810052284636130223308486885, limb1: 40153378333836448380344387045, limb2: 3104278944836790958, limb3: 0, }, u384 { limb0: 70926583776874220189091304914, limb1: 63498449372070794915149226116, limb2: 42524369107353300, limb3: 0, }, ), ), modulus: [0x6871ca8d3c208c16d87cfd47, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0], order_modulus: [ 0x79b9709143e1f593f0000001, 0xb85045b68181585d2833e848, 0x30644e72e131a029, 0x0, ], eigenvalue: Some( u384 { limb0: 0x8d8daaa78b17ea66b99c90dd, limb1: 0xb3c4d79d41a917585bfc4108, limb2: 0x0, limb3: 0x0, }, ), nG_glv_fake_glv: Some( G1Point { x: u384 { limb0: 0x804f4c2700adf08a0214e529, limb1: 0xa68b293da254e1b0049b5825, limb2: 0x2715e750e68b52fa, limb3: 0x0, }, y: u384 { limb0: 0x15c090b1de77447950003fc9, limb1: 0xfb5afe510e7c4e23f41e4bad, limb2: 0x3921d1862445f32, limb3: 0x0, }, }, ), third_root_of_unity: Some( u384 { limb0: 0xacdb5c4f5763473177fffffe, limb1: 0x59e26bcea0d48bacd4f263f1, limb2: 0x0, limb3: 0x0, }, ), }; pub const BLS12_381: Curve = Curve { p: u384 { limb0: 0xb153ffffb9feffffffffaaab, limb1: 0x6730d2a0f6b0f6241eabfffe, limb2: 0x434bacd764774b84f38512bf, limb3: 0x1a0111ea397fe69a4b1ba7b6, }, n: u256 { low: 0x53bda402fffe5bfeffffffff00000001, high: 0x73eda753299d7d483339d80809a1d805 }, a: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, b: u384 { limb0: 0x4, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, g: u384 { limb0: 0x3, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, min_one: u384 { limb0: 0xb153ffffb9feffffffffaaaa, limb1: 0x6730d2a0f6b0f6241eabfffe, limb2: 0x434bacd764774b84f38512bf, limb3: 0x1a0111ea397fe69a4b1ba7b6, }, min_one_order: u384 { limb0: 0xfffe5bfeffffffff00000000, limb1: 0x3339d80809a1d80553bda402, limb2: 0x73eda753299d7d48, limb3: 0x0, }, G: G1Point { x: u384 { limb0: 0xf97a1aeffb3af00adb22c6bb, limb1: 0xa14e3a3f171bac586c55e83f, limb2: 0x4fa9ac0fc3688c4f9774b905, limb3: 0x17f1d3a73197d7942695638c, }, y: u384 { limb0: 0xa2888ae40caa232946c5e7e1, limb1: 0xdb18cb2c04b3edd03cc744, limb2: 0x741d8ae4fcf5e095d5d00af6, limb3: 0x8b3f481e3aaa0f1a09e30ed, }, }, b_twist: Some( ( u384 { limb0: 4, limb1: 0, limb2: 0, limb3: 0 }, u384 { limb0: 4, limb1: 0, limb2: 0, limb3: 0 }, ), ), modulus: [ 0xb153ffffb9feffffffffaaab, 0x6730d2a0f6b0f6241eabfffe, 0x434bacd764774b84f38512bf, 0x1a0111ea397fe69a4b1ba7b6, ], order_modulus: [ 0xfffe5bfeffffffff00000001, 0x3339d80809a1d80553bda402, 0x73eda753299d7d48, 0x0, ], eigenvalue: Some( u384 { limb0: 0x1a40200000000ffffffff, limb1: 0xac45a401, limb2: 0x0, limb3: 0x0 }, ), nG_glv_fake_glv: Some( G1Point { x: u384 { limb0: 0xcf4357bd59d6560f96d34480, limb1: 0x1c2b3f4bb7a8579e7473612d, limb2: 0x44f04a3ee426074a0864fc6e, limb3: 0x60aa1307100d28a9c44cc51, }, y: u384 { limb0: 0x365913fecd5eb4667fe5e1ea, limb1: 0xa456de882c324863cdfcf5b5, limb2: 0xbaaa2be88ae9a807b36465b8, limb3: 0x31152c621ab7ca0e5a2ab1c, }, }, ), third_root_of_unity: Some( u384 { limb0: 0x4f49fffd8bfd00000000aaac, limb1: 0x897d29650fb85f9b409427eb, limb2: 0x63d4de85aa0d857d89759ad4, limb3: 0x1a0111ea397fe699ec024086, }, ), }; pub const SECP256K1: Curve = Curve { p: u384 { limb0: 0xfffffffffffffffefffffc2f, limb1: 0xffffffffffffffffffffffff, limb2: 0xffffffffffffffff, limb3: 0x0, }, n: u256 { low: 0xbaaedce6af48a03bbfd25e8cd0364141, high: 0xfffffffffffffffffffffffffffffffe }, a: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, b: u384 { limb0: 0x7, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, g: u384 { limb0: 0x3, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, min_one: u384 { limb0: 0xfffffffffffffffefffffc2e, limb1: 0xffffffffffffffffffffffff, limb2: 0xffffffffffffffff, limb3: 0x0, }, min_one_order: u384 { limb0: 0xaf48a03bbfd25e8cd0364140, limb1: 0xfffffffffffffffebaaedce6, limb2: 0xffffffffffffffff, limb3: 0x0, }, G: G1Point { x: u384 { limb0: 0x2dce28d959f2815b16f81798, limb1: 0x55a06295ce870b07029bfcdb, limb2: 0x79be667ef9dcbbac, limb3: 0x0, }, y: u384 { limb0: 0xa68554199c47d08ffb10d4b8, limb1: 0x5da4fbfc0e1108a8fd17b448, limb2: 0x483ada7726a3c465, limb3: 0x0, }, }, b_twist: Option::None, modulus: [0xfffffffffffffffefffffc2f, 0xffffffffffffffffffffffff, 0xffffffffffffffff, 0x0], order_modulus: [ 0xaf48a03bbfd25e8cd0364141, 0xfffffffffffffffebaaedce6, 0xffffffffffffffff, 0x0, ], eigenvalue: Some( u384 { limb0: 0x20816678df02967c1b23bd72, limb1: 0xa5261c028812645a122e22ea, limb2: 0x5363ad4cc05c30e0, limb3: 0x0, }, ), nG_glv_fake_glv: Some( G1Point { x: u384 { limb0: 0xf668832ffd959af60c82a0a, limb1: 0x6b06c9f1919413b10f9226c6, limb2: 0x948bf809b1988a4, limb3: 0x0, }, y: u384 { limb0: 0xc97cd2bed4cb7f88d8c8e589, limb1: 0xdc6b74c5d1c3418c6d4dff08, limb2: 0x53a562856dcb6646, limb3: 0x0, }, }, ), third_root_of_unity: Some( u384 { limb0: 0x12f58995c1396c28719501ee, limb1: 0x6e64479eac3434e99cf04975, limb2: 0x7ae96a2b657c0710, limb3: 0x0, }, ), }; pub const SECP256R1: Curve = Curve { p: u384 { limb0: 0xffffffffffffffffffffffff, limb1: 0x0, limb2: 0xffffffff00000001, limb3: 0x0, }, n: u256 { low: 0xbce6faada7179e84f3b9cac2fc632551, high: 0xffffffff00000000ffffffffffffffff }, a: u384 { limb0: 0xfffffffffffffffffffffffc, limb1: 0x0, limb2: 0xffffffff00000001, limb3: 0x0, }, b: u384 { limb0: 0xcc53b0f63bce3c3e27d2604b, limb1: 0xb3ebbd55769886bc651d06b0, limb2: 0x5ac635d8aa3a93e7, limb3: 0x0, }, g: u384 { limb0: 0x6, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, min_one: u384 { limb0: 0xfffffffffffffffffffffffe, limb1: 0x0, limb2: 0xffffffff00000001, limb3: 0x0, }, min_one_order: u384 { limb0: 0xa7179e84f3b9cac2fc632550, limb1: 0xffffffffffffffffbce6faad, limb2: 0xffffffff00000000, limb3: 0x0, }, G: G1Point { x: u384 { limb0: 0x2deb33a0f4a13945d898c296, limb1: 0xf8bce6e563a440f277037d81, limb2: 0x6b17d1f2e12c4247, limb3: 0x0, }, y: u384 { limb0: 0x6b315ececbb6406837bf51f5, limb1: 0x8ee7eb4a7c0f9e162bce3357, limb2: 0x4fe342e2fe1a7f9b, limb3: 0x0, }, }, b_twist: None, modulus: [0xffffffffffffffffffffffff, 0x0, 0xffffffff00000001, 0x0], order_modulus: [ 0xa7179e84f3b9cac2fc632551, 0xffffffffffffffffbce6faad, 0xffffffff00000000, 0x0, ], eigenvalue: None, nG_glv_fake_glv: None, third_root_of_unity: None, }; pub const ED25519: Curve = Curve { p: u384 { limb0: 0xffffffffffffffffffffffed, limb1: 0xffffffffffffffffffffffff, limb2: 0x7fffffffffffffff, limb3: 0x0, }, n: u256 { low: 0x14def9dea2f79cd65812631a5cf5d3ed, high: 0x10000000000000000000000000000000 }, a: u384 { limb0: 0xca52af7ac71e18ef8bc172d, limb1: 0x3197e10d617b3dd66bb8b65d, limb2: 0x5d4eacd3a5b9bee6, limb3: 0x0, }, b: u384 { limb0: 0x6b9fbc329004ebc1f364b2a4, limb1: 0x550ddb06105780d5f5483197, limb2: 0x1d11b29bcfd0b3e0, limb3: 0x0, }, g: u384 { limb0: 0x6, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, min_one: u384 { limb0: 0xffffffffffffffffffffffec, limb1: 0xffffffffffffffffffffffff, limb2: 0x7fffffffffffffff, limb3: 0x0, }, min_one_order: u384 { limb0: 0xa2f79cd65812631a5cf5d3ec, limb1: 0x14def9de, limb2: 0x1000000000000000, limb3: 0x0, }, G: G1Point { x: u384 { limb0: 0xd617c9aca55c89b025aef35, limb1: 0xf00b8f02f1c20618a9c13fdf, limb2: 0x2a78dd0fd02c0339, limb3: 0x0, }, y: u384 { limb0: 0x807131659b7830f3f62c1d14, limb1: 0xbe483ba563798323cf6fd061, limb2: 0x29c644a5c71da22e, limb3: 0x0, }, }, b_twist: None, modulus: [0xffffffffffffffffffffffed, 0xffffffffffffffffffffffff, 0x7fffffffffffffff, 0x0], order_modulus: [0xa2f79cd65812631a5cf5d3ed, 0x14def9de, 0x1000000000000000, 0x0], eigenvalue: None, nG_glv_fake_glv: None, third_root_of_unity: None, }; pub const GRUMPKIN: Curve = Curve { p: u384 { limb0: 0x79b9709143e1f593f0000001, limb1: 0xb85045b68181585d2833e848, limb2: 0x30644e72e131a029, limb3: 0x0, }, n: u256 { low: 0x97816a916871ca8d3c208c16d87cfd47, high: 0x30644e72e131a029b85045b68181585d }, a: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, b: u384 { limb0: 0x79b9709143e1f593effffff0, limb1: 0xb85045b68181585d2833e848, limb2: 0x30644e72e131a029, limb3: 0x0, }, g: u384 { limb0: 0x5, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, min_one: u384 { limb0: 0x79b9709143e1f593f0000000, limb1: 0xb85045b68181585d2833e848, limb2: 0x30644e72e131a029, limb3: 0x0, }, min_one_order: u384 { limb0: 0x6871ca8d3c208c16d87cfd46, limb1: 0xb85045b68181585d97816a91, limb2: 0x30644e72e131a029, limb3: 0x0, }, G: G1Point { x: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, y: u384 { limb0: 0xf1181294833fc48d823f272c, limb1: 0xcf135e7506a45d632d270d45, limb2: 0x2, limb3: 0x0, }, }, b_twist: None, modulus: [0x79b9709143e1f593f0000001, 0xb85045b68181585d2833e848, 0x30644e72e131a029, 0x0], order_modulus: [ 0x6871ca8d3c208c16d87cfd47, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0, ], eigenvalue: None, nG_glv_fake_glv: None, third_root_of_unity: None, }; /// Generator point for the G2 subgroup of BLS12-381's twisted curve E'(Fp2) /// Coordinates are in Fp2 represented as (x₀ + i·x₁, y₀ + i·y₁) pub const BLS_G2_GENERATOR: G2Point = G2Point { x0: u384 { limb0: 0xa805bbefd48056c8c121bdb8, limb1: 0xb4510b647ae3d1770bac0326, limb2: 0x2dc51051c6e47ad4fa403b02, limb3: 0x24aa2b2f08f0a9126080527, }, x1: u384 { limb0: 0x13945d57e5ac7d055d042b7e, limb1: 0xb5da61bbdc7f5049334cf112, limb2: 0x88274f65596bd0d09920b61a, limb3: 0x13e02b6052719f607dacd3a0, }, y0: u384 { limb0: 0x3baca289e193548608b82801, limb1: 0x6d429a695160d12c923ac9cc, limb2: 0xda2e351aadfd9baa8cbdd3a7, limb3: 0xce5d527727d6e118cc9cdc6, }, y1: u384 { limb0: 0x5cec1da1aaa9075ff05f79be, limb1: 0x267492ab572e99ab3f370d27, limb2: 0x2bc28b99cb3e287e85a763af, limb3: 0x606c4a02ea734cc32acd2b0, }, }; /// Compressed NAF (Non-Adjacent Form) representation of BN254 seed parameter /// for efficient Miller loop computation in pairing operations. /// /// Computed as: recode_naf_bits(jy00(6·x + 2)[2:]) where x = 0x44E992B44A6909F1 /// Encoding: "00"→0, "10"→1, "-10"→2, "01"→3, "0-1"→4 /// See hydra/garaga/definitions.py for the encoding algorithm pub const BN254_SEED_BITS_JY00_COMPRESSED: [felt252; 32] = [ 2, 1, 0, 2, 2, 0, 2, 3, 1, 4, 0, 0, 3, 0, 2, 1, 4, 0, 0, 2, 1, 0, 2, 2, 3, 0, 4, 0, 4, 4, 2, 0, ]; /// Compressed binary representation of BLS12-381 seed parameter x = 0xD201000000010000 /// for efficient Miller loop computation. /// /// Binary digits with consecutive zeros replaced by 3 for compression /// Format: bin(x)[2:][2:] with "00" → 3 pub const BLS12_381_SEED_BITS_COMPRESSED: [felt252; 34] = [ 0, 1, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, ]; /// NAF (Non-Adjacent Form) representation of BN254 seed parameter /// for Miller loop computation in pairing operations. /// /// Computed as: NAF(6·x + 2)[1:] where x = 0x44E992B44A6909F1 /// Encoding: -1 is replaced by 2 (values are 0, 1, or 2) /// See hydra/garaga/definitions.py for the NAF algorithm pub const BN254_SEED_BITS_NAF: [usize; 65] = [ 0, 2, 0, 1, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 1, 0, 0, 2, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 2, 0, 2, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 2, 0, 0, 0, ]; /// Standard binary representation of BLS12-381 seed parameter x = 0xD201000000010000 /// Used for basic Miller loop operations /// Format: bin(x)[2:][2:] (binary digits after "0b" prefix, skipping first two) pub const BLS12_381_SEED_BITS: [usize; 62] = [ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; /// GETTER FUNCTIONS /// /// Returns the prime modulus p of the base field Fp for a given curve. /// /// # Arguments /// * `curve_index` - Index of the curve (0-5, see curve index mapping above) /// /// # Returns /// * The prime modulus p as u384, or zero for invalid indices pub fn get_p(curve_index: usize) -> u384 { match curve_index { 0 => BN254.p, 1 => BLS12_381.p, 2 => SECP256K1.p, 3 => SECP256R1.p, 4 => ED25519.p, 5 => GRUMPKIN.p, _ => u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, } } /// Checks if a curve has an efficient endomorphism available for GLV decomposition. /// /// GLV (Gallant-Lambert-Vanstone) decomposition accelerates scalar multiplication /// by utilizing the curve's endomorphism structure. /// /// # Arguments /// * `curve_index` - Index of the curve /// /// # Returns /// * `true` for BN254, BLS12_381, and SECP256K1 (curves 0, 1, 2) /// * `false` for all other curves pub fn has_endomorphism_available(curve_index: usize) -> bool { match curve_index { 0 | 1 | 2 => true, _ => false, } } /// Returns the Weierstrass 'a' parameter for a given curve. /// /// For Weierstrass curves: y² = x³ + ax + b /// /// # Arguments /// * `curve_index` - Index of the curve (0-5) /// /// # Returns /// * The 'a' parameter as u384, or zero for invalid indices /// /// # Note /// For ED25519 (index 4), this returns the 'a' parameter of the birationally /// equivalent Weierstrass curve, not the Edwards curve parameter. pub fn get_a(curve_index: usize) -> u384 { match curve_index { 0 => BN254.a, 1 => BLS12_381.a, 2 => SECP256K1.a, 3 => SECP256R1.a, 4 => ED25519.a, 5 => GRUMPKIN.a, _ => u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, } } /// Returns the Weierstrass 'b' parameter for a given curve. /// /// For Weierstrass curves: y² = x³ + ax + b /// /// # Arguments /// * `curve_index` - Index of the curve (0-5) /// /// # Returns /// * The 'b' parameter as u384, or zero for invalid indices /// /// # Note /// For ED25519 (index 4), this returns the 'b' parameter of the birationally /// equivalent Weierstrass curve, not the Edwards curve parameter. pub fn get_b(curve_index: usize) -> u384 { match curve_index { 0 => BN254.b, 1 => BLS12_381.b, 2 => SECP256K1.b, 3 => SECP256R1.b, 4 => ED25519.b, 5 => GRUMPKIN.b, _ => u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, } } /// Returns the b parameter for the twisted curve E'(Fp2) used in pairing operations. /// /// The twisted curve has equation: y² = x³ + b' where b' is in Fp2. /// /// # Arguments /// * `curve_index` - Index of the curve (must be 0 for BN254 or 1 for BLS12_381) /// /// # Returns /// * Tuple (b₀, b₁) where b' = b₀ + i·b₁ in Fp2 = Fp[i]/(i² + 1) /// /// # Panics /// * Panics for curves without pairing support (not BN254 or BLS12_381) pub fn get_b_twist(curve_index: usize) -> (u384, u384) { match curve_index { 0 => BN254.b_twist.unwrap(), 1 => BLS12_381.b_twist.unwrap(), _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns a generator g of the multiplicative group Fp* for a given curve. /// /// This generator is used for various field operations and exponentiations. /// /// # Arguments /// * `curve_index` - Index of the curve (0-5) /// /// # Returns /// * A generator element g ∈ Fp* as u384 /// /// # Panics /// * Panics for invalid curve indices pub fn get_g(curve_index: usize) -> u384 { match curve_index { 0 => BN254.g, 1 => BLS12_381.g, 2 => SECP256K1.g, 3 => SECP256R1.g, 4 => ED25519.g, 5 => GRUMPKIN.g, _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns the order n of the curve's prime-order subgroup. /// /// This is the number of points in the main cryptographic subgroup. /// For most curves, this equals #E(Fp)/cofactor. /// /// # Arguments /// * `curve_index` - Index of the curve (0-5) /// /// # Returns /// * The subgroup order n as u256 /// /// # Panics /// * Panics for invalid curve indices pub fn get_n(curve_index: usize) -> u256 { match curve_index { 0 => BN254.n, 1 => BLS12_381.n, 2 => SECP256K1.n, 3 => SECP256R1.n, 4 => ED25519.n, 5 => GRUMPKIN.n, _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns (-1) mod p precomputed for the base field Fp. /// /// This is equivalent to (p - 1) and is frequently used in field arithmetic. /// /// # Arguments /// * `curve_index` - Index of the curve (0-5) /// /// # Returns /// * The value (-1) mod p as u384 /// /// # Panics /// * Panics for invalid curve indices pub fn get_min_one(curve_index: usize) -> u384 { match curve_index { 0 => BN254.min_one, 1 => BLS12_381.min_one, 2 => SECP256K1.min_one, 3 => SECP256R1.min_one, 4 => ED25519.min_one, 5 => GRUMPKIN.min_one, _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns (-1) mod n precomputed for the scalar field (curve order). /// /// This is equivalent to (n - 1) and is used for scalar arithmetic operations. /// /// # Arguments /// * `curve_index` - Index of the curve (0-5) /// /// # Returns /// * The value (-1) mod n as u384 /// /// # Panics /// * Panics for invalid curve indices pub fn get_min_one_order(curve_index: usize) -> u384 { match curve_index { 0 => BN254.min_one_order, 1 => BLS12_381.min_one_order, 2 => SECP256K1.min_one_order, 3 => SECP256R1.min_one_order, 4 => ED25519.min_one_order, 5 => GRUMPKIN.min_one_order, _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns the base field modulus p as a CircuitModulus for circuit operations. /// /// CircuitModulus is used by Cairo's circuit builtins for modular arithmetic. /// /// # Arguments /// * `curve_index` - Index of the curve (0-5) /// /// # Returns /// * The prime modulus p as CircuitModulus /// /// # Panics /// * Panics for invalid curve indices pub fn get_modulus(curve_index: usize) -> CircuitModulus { match curve_index { 0 => get_BN254_modulus(), 1 => get_BLS12_381_modulus(), 2 => get_SECP256K1_modulus(), 3 => get_SECP256R1_modulus(), 4 => get_ED25519_modulus(), 5 => get_GRUMPKIN_modulus(), _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns the curve order n as a CircuitModulus for circuit operations. /// /// CircuitModulus is used by Cairo's circuit builtins for modular arithmetic /// in the scalar field. /// /// # Arguments /// * `curve_index` - Index of the curve (0-5) /// /// # Returns /// * The curve order n as CircuitModulus /// /// # Panics /// * Panics for invalid curve indices pub fn get_curve_order_modulus(curve_index: usize) -> CircuitModulus { match curve_index { 0 => get_BN254_order_modulus(), 1 => get_BLS12_381_order_modulus(), 2 => get_SECP256K1_order_modulus(), 3 => get_SECP256R1_order_modulus(), 4 => get_ED25519_order_modulus(), 5 => get_GRUMPKIN_order_modulus(), _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns the standard generator point G of the curve's prime-order subgroup. /// /// This is the base point used for scalar multiplication and key generation. /// /// # Arguments /// * `curve_index` - Index of the curve (0-5) /// /// # Returns /// * The generator point G as G1Point /// /// # Panics /// * Panics for invalid curve indices /// /// # Note /// For ED25519 (index 4), returns the generator in Weierstrass form. pub fn get_G(curve_index: usize) -> G1Point { match curve_index { 0 => BN254.G, 1 => BLS12_381.G, 2 => SECP256K1.G, 3 => SECP256R1.G, 4 => ED25519.G, 5 => GRUMPKIN.G, _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns the eigenvalue λ for the curve's efficiently computable endomorphism. /// /// The endomorphism φ satisfies φ(P) = λ·P for points P on the curve. /// This eigenvalue is used in GLV decomposition to accelerate scalar multiplication. /// /// # Arguments /// * `curve_index` - Index of the curve (must be 0, 1, or 2) /// /// # Returns /// * The eigenvalue λ as u384 /// /// # Panics /// * Panics for curves without efficient endomorphism (not BN254, BLS12_381, or SECP256K1) pub fn get_eigenvalue(curve_index: usize) -> u384 { match curve_index { 0 => BN254.eigenvalue.unwrap(), 1 => BLS12_381.eigenvalue.unwrap(), 2 => SECP256K1.eigenvalue.unwrap(), _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns the precomputed point 2^(nbits-1)·G for GLV/fake-GLV decomposition. /// /// This precomputed value is used to accelerate scalar multiplication via /// GLV (Gallant-Lambert-Vanstone) or fake-GLV decomposition techniques. /// /// The nbits parameter is computed as: nbits = n.bit_length() // 4 + 9 /// where n is the curve order. /// /// # Arguments /// * `curve_index` - Index of the curve (must be 0, 1, or 2) /// /// # Returns /// * The point 2^(nbits-1)·G as G1Point /// - For BN254: 2^72·G (nbits=73) /// - For BLS12_381: 2^72·G (nbits=73) /// - For SECP256K1: 2^72·G (nbits=73) /// /// # Panics /// * Panics for curves without efficient endomorphism (not BN254, BLS12_381, or SECP256K1) pub fn get_nG_glv_fake_glv(curve_index: usize) -> G1Point { match curve_index { 0 => BN254.nG_glv_fake_glv.unwrap(), 1 => BLS12_381.nG_glv_fake_glv.unwrap(), 2 => SECP256K1.nG_glv_fake_glv.unwrap(), _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns a primitive cube root of unity ω in the base field Fp. /// /// This element satisfies ω³ = 1 and ω ≠ 1, and is used in GLV endomorphism /// computations for accelerating scalar multiplication. /// /// # Arguments /// * `curve_index` - Index of the curve (must be 0, 1, or 2) /// /// # Returns /// * A third root of unity ω ∈ Fp as u384 /// /// # Panics /// * Panics for curves without efficient endomorphism (not BN254, BLS12_381, or SECP256K1) pub fn get_third_root_of_unity(curve_index: usize) -> u384 { match curve_index { 0 => BN254.third_root_of_unity.unwrap(), 1 => BLS12_381.third_root_of_unity.unwrap(), 2 => SECP256K1.third_root_of_unity.unwrap(), _ => core::panic_with_felt252('Invalid curve index'), } } /// Returns the BLS12-381 base field modulus as CircuitModulus. #[inline(always)] pub fn get_BLS12_381_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(BLS12_381.modulus).unwrap() } /// Returns the BN254 base field modulus as CircuitModulus. #[inline(always)] pub fn get_BN254_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(BN254.modulus).unwrap() } /// Returns the SECP256K1 base field modulus as CircuitModulus. #[inline(always)] pub fn get_SECP256K1_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(SECP256K1.modulus).unwrap() } /// Returns the SECP256R1 (P-256) base field modulus as CircuitModulus. #[inline(always)] pub fn get_SECP256R1_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(SECP256R1.modulus).unwrap() } /// Returns the ED25519 base field modulus as CircuitModulus. /// (Modulus of the birationally equivalent Weierstrass curve) #[inline(always)] pub fn get_ED25519_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(ED25519.modulus).unwrap() } /// Returns the GRUMPKIN base field modulus as CircuitModulus. #[inline(always)] pub fn get_GRUMPKIN_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(GRUMPKIN.modulus).unwrap() } /// Returns the BN254 curve order as CircuitModulus. #[inline(always)] pub fn get_BN254_order_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(BN254.order_modulus).unwrap() } /// Returns the BLS12-381 curve order as CircuitModulus. #[inline(always)] pub fn get_BLS12_381_order_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(BLS12_381.order_modulus).unwrap() } /// Returns the SECP256K1 curve order as CircuitModulus. #[inline(always)] pub fn get_SECP256K1_order_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(SECP256K1.order_modulus).unwrap() } /// Returns the SECP256R1 (P-256) curve order as CircuitModulus. #[inline(always)] pub fn get_SECP256R1_order_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(SECP256R1.order_modulus).unwrap() } /// Returns the ED25519 curve order as CircuitModulus. #[inline(always)] pub fn get_ED25519_order_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(ED25519.order_modulus).unwrap() } /// Returns the GRUMPKIN curve order as CircuitModulus. #[inline(always)] pub fn get_GRUMPKIN_order_modulus() -> CircuitModulus { TryInto::<_, CircuitModulus>::try_into(GRUMPKIN.order_modulus).unwrap() } ================================================ FILE: src/src/definitions/structs/fields.cairo ================================================ //! Field structures for degree-12 extension fields used by the circuits. //! //! - [`E12D`] models a polynomial representation with 12 coefficients. //! - [`E12T`] models a 2-3-2 tower representation with named coefficients. //! //! Documentation follows Scarb's doc conventions (`///` and `//!` comments), so it can be //! rendered with `scarb doc`. use core::circuit::{u384, u96}; use core::num; use core::num::traits::{One, Zero}; use core::serde::Serde; use corelib_imports::bounded_int::downcast; #[derive(Copy, Drop, Debug, PartialEq)] pub struct u288 { pub limb0: u96, pub limb1: u96, pub limb2: u96, } /// A 2048-bit integer packed into 6 chunks of at most 384 bits each /// (the top chunk w5 is constrained to 128 bits). /// /// Given 22 limbs of 96 bits, groups of 4 consecutive limbs form one u384 /// chunk. The last group uses only 2 limbs, yielding a 128-bit top chunk. #[derive(Copy, Drop, Debug, PartialEq)] pub struct RSA2048Chunks { pub w0: u384, pub w1: u384, pub w2: u384, pub w3: u384, pub w4: u384, pub w5: u384, } /// Witness for one modular reduction a * b = q * n + r over Z, /// where q (quotient) and r (remainder) are 2048-bit integers /// in chunk representation. #[derive(Copy, Drop, Debug, PartialEq)] pub struct RSA2048ReductionWitness { pub quotient: RSA2048Chunks, pub remainder: RSA2048Chunks, } /// Degree-12 extension field element (generic coefficients). /// /// Represents an element of the extension field F_{q^12} modeled as the /// quotient ring F_q[w]/p(w), where p(w) is an irreducible polynomial of /// degree 12. Canonical polynomial form: /// /// ```text /// w0 + w1*w + w2*w^2 + w3*w^3 + w4*w^4 + w5*w^5 /// + w6*w^6 + w7*w^7 + w8*w^8 + w9*w^9 + w10*w^10 + w11*w^11 /// ``` /// /// Coefficients w0 ... w11 are of type `T`. /// /// When `T` is a limb-based integer type used in this codebase: /// - `T = [u384]` (4 x u96 limbs) or `T = [u288]` (3 x u96 limbs). Helpers /// below serialize/deserialize to a flat `Array` (12x4 for `u384`, /// 12x3 for `u288`). /// - [`num::traits::One`] is implemented for `E12D` and `E12D`; the /// multiplicative identity is `w0 = 1` and all other coefficients are zero. /// /// Example: create the multiplicative identity for `u288` coefficients. /// ```text /// let one: E12D = E12D { /// w0: U288One::one(), /// w1: U288Zero::zero(), /// w2: U288Zero::zero(), /// w3: U288Zero::zero(), /// w4: U288Zero::zero(), /// w5: U288Zero::zero(), /// w6: U288Zero::zero(), /// w7: U288Zero::zero(), /// w8: U288Zero::zero(), /// w9: U288Zero::zero(), /// w10: U288Zero::zero(), /// w11: U288Zero::zero(), /// }; /// ``` #[derive(Copy, Drop, Debug, PartialEq)] pub struct E12D { pub w0: T, pub w1: T, pub w2: T, pub w3: T, pub w4: T, pub w5: T, pub w6: T, pub w7: T, pub w8: T, pub w9: T, pub w10: T, pub w11: T, } /// Degree-12 extension field element using a 2-3-2 tower construction. /// /// The field F_{q^12} is built in three steps: /// - F_{q^2} ~= F_q[u]/p1(u) /// - F_{q^6} ~= F_{q^2}[v]/p2(v) /// - F_{q^12} ~= F_{q^6}[w]/p3(w) /// /// Any element has the form: /// /// ```text /// [ (c1b2a1*u + c1b2a0)*v^2 + (c1b1a1*u + c1b1a0)*v + (c1b0a1*u + c1b0a0) ]*w /// + [ (c0b2a1*u + c0b2a0)*v^2 + (c0b1a1*u + c0b1a0)*v + (c0b0a1*u + c0b0a0) ] /// ``` /// /// This yields 12 base-field coefficients. Field names follow `c{c}b{b}a{a}`: /// - `c` in {0,1} selects the coefficient of 1 (c=0) or of w (c=1) /// - `b` in {0,1,2} selects the power of v (0, 1, or 2) /// - `a` in {0,1} selects the component in the quadratic basis over u /// /// All twelve attributes are [`u384`] values (unsigned 384-bit integers) used by /// the surrounding circuits and serializers. /// /// Example: zero element (schematic — any `u384` zero can be reused across fields). /// ```cairo /// let z: u384 = Zero::zero(); /// let e = E12T { /// c0b0a0: z, c0b0a1: z, /// c0b1a0: z, c0b1a1: z, /// c0b2a0: z, c0b2a1: z, /// c1b0a0: z, c1b0a1: z, /// c1b1a0: z, c1b1a1: z, /// c1b2a0: z, c1b2a1: z, /// }; /// ``` #[derive(Drop, Copy, Debug, PartialEq)] pub struct E12T { pub c0b0a0: u384, pub c0b0a1: u384, pub c0b1a0: u384, pub c0b1a1: u384, pub c0b2a0: u384, pub c0b2a1: u384, pub c1b0a0: u384, pub c1b0a1: u384, pub c1b1a0: u384, pub c1b1a1: u384, pub c1b2a0: u384, pub c1b2a1: u384, } pub fn serialize_u384(self: @u384, ref output: Array) { output.append((*self.limb0).into()); output.append((*self.limb1).into()); output.append((*self.limb2).into()); output.append((*self.limb3).into()); } pub fn deserialize_u384(ref serialized: Span) -> u384 { let [l0, l1, l2, l3] = (*serialized.multi_pop_front::<4>().unwrap()).unbox(); let limb0: u96 = downcast(l0).unwrap(); let limb1: u96 = downcast(l1).unwrap(); let limb2: u96 = downcast(l2).unwrap(); let limb3: u96 = downcast(l3).unwrap(); return u384 { limb0: limb0, limb1: limb1, limb2: limb2, limb3: limb3 }; } pub fn serialize_u384_array(self: @Array, ref output: Array) { self.len().serialize(ref output); serialize_u384_array_helper(self.span(), ref output); } pub impl RSA2048ChunksSerde of Serde { fn serialize(self: @RSA2048Chunks, ref output: Array) { serialize_u384(self.w0, ref output); serialize_u384(self.w1, ref output); serialize_u384(self.w2, ref output); serialize_u384(self.w3, ref output); serialize_u384(self.w4, ref output); serialize_u384(self.w5, ref output); } fn deserialize(ref serialized: Span) -> Option { let w0 = deserialize_u384(ref serialized); let w1 = deserialize_u384(ref serialized); let w2 = deserialize_u384(ref serialized); let w3 = deserialize_u384(ref serialized); let w4 = deserialize_u384(ref serialized); let w5 = deserialize_u384(ref serialized); return Option::Some(RSA2048Chunks { w0, w1, w2, w3, w4, w5 }); } } pub fn serialize_u384_array_helper(mut input: Span, ref output: Array) { if let Option::Some(value) = input.pop_front() { serialize_u384(value, ref output); serialize_u384_array_helper(input, ref output); } } pub fn deserialize_u384_array(ref serialized: Span) -> Array { let length = *serialized.pop_front().unwrap(); let mut arr = array![]; deserialize_u384_array_helper(ref serialized, arr, length) } pub fn deserialize_u384_array_helper( ref serialized: Span, mut curr_output: Array, remaining: felt252, ) -> Array { if remaining == 0 { return curr_output; } curr_output.append(deserialize_u384(ref serialized)); deserialize_u384_array_helper(ref serialized, curr_output, remaining - 1) } pub impl u288Serde of Serde { fn serialize(self: @u288, ref output: Array) { output.append((*self.limb0).into()); output.append((*self.limb1).into()); output.append((*self.limb2).into()); } fn deserialize(ref serialized: Span) -> Option { let [l0, l1, l2] = (*serialized.multi_pop_front::<3>().unwrap()).unbox(); let limb0 = downcast(l0).unwrap(); let limb1 = downcast(l1).unwrap(); let limb2 = downcast(l2).unwrap(); return Option::Some(u288 { limb0: limb0, limb1: limb1, limb2: limb2 }); } } impl U288Zero of num::traits::Zero { fn zero() -> u288 { u288 { limb0: 0, limb1: 0, limb2: 0 } } fn is_zero(self: @u288) -> bool { *self == Self::zero() } fn is_non_zero(self: @u288) -> bool { !self.is_zero() } } impl U288One of num::traits::One { fn one() -> u288 { u288 { limb0: 1, limb1: 0, limb2: 0 } } fn is_one(self: @u288) -> bool { *self == Self::one() } fn is_non_one(self: @u288) -> bool { !self.is_one() } } impl E12DOneU384 of num::traits::One> { fn one() -> E12D { E12D { w0: One::one(), w1: Zero::zero(), w2: Zero::zero(), w3: Zero::zero(), w4: Zero::zero(), w5: Zero::zero(), w6: Zero::zero(), w7: Zero::zero(), w8: Zero::zero(), w9: Zero::zero(), w10: Zero::zero(), w11: Zero::zero(), } } fn is_one(self: @E12D) -> bool { *self == Self::one() } fn is_non_one(self: @E12D) -> bool { !self.is_one() } } impl E12DOneU288 of num::traits::One> { fn one() -> E12D { E12D { w0: U288One::one(), w1: U288Zero::zero(), w2: U288Zero::zero(), w3: U288Zero::zero(), w4: U288Zero::zero(), w5: U288Zero::zero(), w6: U288Zero::zero(), w7: U288Zero::zero(), w8: U288Zero::zero(), w9: U288Zero::zero(), w10: U288Zero::zero(), w11: U288Zero::zero(), } } fn is_one(self: @E12D) -> bool { *self == Self::one() } fn is_non_one(self: @E12D) -> bool { !self.is_one() } } pub impl E12TOne of One { fn one() -> E12T { E12T { c0b0a0: One::one(), c0b0a1: Zero::zero(), c0b1a0: Zero::zero(), c0b1a1: Zero::zero(), c0b2a0: Zero::zero(), c0b2a1: Zero::zero(), c1b0a0: Zero::zero(), c1b0a1: Zero::zero(), c1b1a0: Zero::zero(), c1b1a1: Zero::zero(), c1b2a0: Zero::zero(), c1b2a1: Zero::zero(), } } fn is_one(self: @E12T) -> bool { *self == Self::one() } fn is_non_one(self: @E12T) -> bool { !Self::is_one(self) } } impl E12DSerde384 of Serde> { fn serialize(self: @E12D, ref output: Array) { let val = *self; output.append(val.w0.limb0.into()); output.append(val.w0.limb1.into()); output.append(val.w0.limb2.into()); output.append(val.w0.limb3.into()); output.append(val.w1.limb0.into()); output.append(val.w1.limb1.into()); output.append(val.w1.limb2.into()); output.append(val.w1.limb3.into()); output.append(val.w2.limb0.into()); output.append(val.w2.limb1.into()); output.append(val.w2.limb2.into()); output.append(val.w2.limb3.into()); output.append(val.w3.limb0.into()); output.append(val.w3.limb1.into()); output.append(val.w3.limb2.into()); output.append(val.w3.limb3.into()); output.append(val.w4.limb0.into()); output.append(val.w4.limb1.into()); output.append(val.w4.limb2.into()); output.append(val.w4.limb3.into()); output.append(val.w5.limb0.into()); output.append(val.w5.limb1.into()); output.append(val.w5.limb2.into()); output.append(val.w5.limb3.into()); output.append(val.w6.limb0.into()); output.append(val.w6.limb1.into()); output.append(val.w6.limb2.into()); output.append(val.w6.limb3.into()); output.append(val.w7.limb0.into()); output.append(val.w7.limb1.into()); output.append(val.w7.limb2.into()); output.append(val.w7.limb3.into()); output.append(val.w8.limb0.into()); output.append(val.w8.limb1.into()); output.append(val.w8.limb2.into()); output.append(val.w8.limb3.into()); output.append(val.w9.limb0.into()); output.append(val.w9.limb1.into()); output.append(val.w9.limb2.into()); output.append(val.w9.limb3.into()); output.append(val.w10.limb0.into()); output.append(val.w10.limb1.into()); output.append(val.w10.limb2.into()); output.append(val.w10.limb3.into()); output.append(val.w11.limb0.into()); output.append(val.w11.limb1.into()); output.append(val.w11.limb2.into()); output.append(val.w11.limb3.into()); } fn deserialize(ref serialized: Span) -> Option> { let [ w0l0, w0l1, w0l2, w0l3, w1l0, w1l1, w1l2, w1l3, w2l0, w2l1, w2l2, w2l3, w3l0, w3l1, w3l2, w3l3, w4l0, w4l1, w4l2, w4l3, w5l0, w5l1, w5l2, w5l3, w6l0, w6l1, w6l2, w6l3, w7l0, w7l1, w7l2, w7l3, w8l0, w8l1, w8l2, w8l3, w9l0, w9l1, w9l2, w9l3, w10l0, w10l1, w10l2, w10l3, w11l0, w11l1, w11l2, w11l3, ] = (*serialized .multi_pop_front::<48>() .unwrap()) .unbox(); Option::Some( E12D { w0: u384 { limb0: downcast(w0l0).unwrap(), limb1: downcast(w0l1).unwrap(), limb2: downcast(w0l2).unwrap(), limb3: downcast(w0l3).unwrap(), }, w1: u384 { limb0: downcast(w1l0).unwrap(), limb1: downcast(w1l1).unwrap(), limb2: downcast(w1l2).unwrap(), limb3: downcast(w1l3).unwrap(), }, w2: u384 { limb0: downcast(w2l0).unwrap(), limb1: downcast(w2l1).unwrap(), limb2: downcast(w2l2).unwrap(), limb3: downcast(w2l3).unwrap(), }, w3: u384 { limb0: downcast(w3l0).unwrap(), limb1: downcast(w3l1).unwrap(), limb2: downcast(w3l2).unwrap(), limb3: downcast(w3l3).unwrap(), }, w4: u384 { limb0: downcast(w4l0).unwrap(), limb1: downcast(w4l1).unwrap(), limb2: downcast(w4l2).unwrap(), limb3: downcast(w4l3).unwrap(), }, w5: u384 { limb0: downcast(w5l0).unwrap(), limb1: downcast(w5l1).unwrap(), limb2: downcast(w5l2).unwrap(), limb3: downcast(w5l3).unwrap(), }, w6: u384 { limb0: downcast(w6l0).unwrap(), limb1: downcast(w6l1).unwrap(), limb2: downcast(w6l2).unwrap(), limb3: downcast(w6l3).unwrap(), }, w7: u384 { limb0: downcast(w7l0).unwrap(), limb1: downcast(w7l1).unwrap(), limb2: downcast(w7l2).unwrap(), limb3: downcast(w7l3).unwrap(), }, w8: u384 { limb0: downcast(w8l0).unwrap(), limb1: downcast(w8l1).unwrap(), limb2: downcast(w8l2).unwrap(), limb3: downcast(w8l3).unwrap(), }, w9: u384 { limb0: downcast(w9l0).unwrap(), limb1: downcast(w9l1).unwrap(), limb2: downcast(w9l2).unwrap(), limb3: downcast(w9l3).unwrap(), }, w10: u384 { limb0: downcast(w10l0).unwrap(), limb1: downcast(w10l1).unwrap(), limb2: downcast(w10l2).unwrap(), limb3: downcast(w10l3).unwrap(), }, w11: u384 { limb0: downcast(w11l0).unwrap(), limb1: downcast(w11l1).unwrap(), limb2: downcast(w11l2).unwrap(), limb3: downcast(w11l3).unwrap(), }, }, ) } } impl E12DSerde288 of Serde> { fn serialize(self: @E12D, ref output: Array) { let val = *self; output.append(val.w0.limb0.into()); output.append(val.w0.limb1.into()); output.append(val.w0.limb2.into()); output.append(val.w1.limb0.into()); output.append(val.w1.limb1.into()); output.append(val.w1.limb2.into()); output.append(val.w2.limb0.into()); output.append(val.w2.limb1.into()); output.append(val.w2.limb2.into()); output.append(val.w3.limb0.into()); output.append(val.w3.limb1.into()); output.append(val.w3.limb2.into()); output.append(val.w4.limb0.into()); output.append(val.w4.limb1.into()); output.append(val.w4.limb2.into()); output.append(val.w5.limb0.into()); output.append(val.w5.limb1.into()); output.append(val.w5.limb2.into()); output.append(val.w6.limb0.into()); output.append(val.w6.limb1.into()); output.append(val.w6.limb2.into()); output.append(val.w7.limb0.into()); output.append(val.w7.limb1.into()); output.append(val.w7.limb2.into()); output.append(val.w8.limb0.into()); output.append(val.w8.limb1.into()); output.append(val.w8.limb2.into()); output.append(val.w9.limb0.into()); output.append(val.w9.limb1.into()); output.append(val.w9.limb2.into()); output.append(val.w10.limb0.into()); output.append(val.w10.limb1.into()); output.append(val.w10.limb2.into()); output.append(val.w11.limb0.into()); output.append(val.w11.limb1.into()); output.append(val.w11.limb2.into()); } fn deserialize(ref serialized: Span) -> Option> { let [ w0l0, w0l1, w0l2, w1l0, w1l1, w1l2, w2l0, w2l1, w2l2, w3l0, w3l1, w3l2, w4l0, w4l1, w4l2, w5l0, w5l1, w5l2, w6l0, w6l1, w6l2, w7l0, w7l1, w7l2, w8l0, w8l1, w8l2, w9l0, w9l1, w9l2, w10l0, w10l1, w10l2, w11l0, w11l1, w11l2, ] = (*serialized .multi_pop_front::<36>() .unwrap()) .unbox(); Option::Some( E12D { w0: u288 { limb0: downcast(w0l0).unwrap(), limb1: downcast(w0l1).unwrap(), limb2: downcast(w0l2).unwrap(), }, w1: u288 { limb0: downcast(w1l0).unwrap(), limb1: downcast(w1l1).unwrap(), limb2: downcast(w1l2).unwrap(), }, w2: u288 { limb0: downcast(w2l0).unwrap(), limb1: downcast(w2l1).unwrap(), limb2: downcast(w2l2).unwrap(), }, w3: u288 { limb0: downcast(w3l0).unwrap(), limb1: downcast(w3l1).unwrap(), limb2: downcast(w3l2).unwrap(), }, w4: u288 { limb0: downcast(w4l0).unwrap(), limb1: downcast(w4l1).unwrap(), limb2: downcast(w4l2).unwrap(), }, w5: u288 { limb0: downcast(w5l0).unwrap(), limb1: downcast(w5l1).unwrap(), limb2: downcast(w5l2).unwrap(), }, w6: u288 { limb0: downcast(w6l0).unwrap(), limb1: downcast(w6l1).unwrap(), limb2: downcast(w6l2).unwrap(), }, w7: u288 { limb0: downcast(w7l0).unwrap(), limb1: downcast(w7l1).unwrap(), limb2: downcast(w7l2).unwrap(), }, w8: u288 { limb0: downcast(w8l0).unwrap(), limb1: downcast(w8l1).unwrap(), limb2: downcast(w8l2).unwrap(), }, w9: u288 { limb0: downcast(w9l0).unwrap(), limb1: downcast(w9l1).unwrap(), limb2: downcast(w9l2).unwrap(), }, w10: u288 { limb0: downcast(w10l0).unwrap(), limb1: downcast(w10l1).unwrap(), limb2: downcast(w10l2).unwrap(), }, w11: u288 { limb0: downcast(w11l0).unwrap(), limb1: downcast(w11l1).unwrap(), limb2: downcast(w11l2).unwrap(), }, }, ) } } ================================================ FILE: src/src/definitions/structs/points.cairo ================================================ use core::circuit::u384; use core::num::traits::Zero; use core::serde::Serde; use corelib_imports::circuit::conversions; use garaga::definitions::{deserialize_u384, serialize_u384}; use starknet::storage_access::StorePacking; #[derive(Copy, Drop, Debug, PartialEq)] pub struct G1Point { pub x: u384, pub y: u384, } pub impl G1PointSerde of Serde { fn serialize(self: @G1Point, ref output: Array) { serialize_u384(self.x, ref output); serialize_u384(self.y, ref output); } fn deserialize(ref serialized: Span) -> Option { let x = deserialize_u384(ref serialized); let y = deserialize_u384(ref serialized); return Option::Some(G1Point { x: x, y: y }); } } pub impl G1PointStorePacking of StorePacking { fn pack(value: G1Point) -> [felt252; 4] { let x0 = conversions::two_u96_into_felt252(value.x.limb0, value.x.limb1); let x1 = conversions::two_u96_into_felt252(value.x.limb2, value.x.limb3); let y0 = conversions::two_u96_into_felt252(value.y.limb0, value.y.limb1); let y1 = conversions::two_u96_into_felt252(value.y.limb2, value.y.limb3); [x0, x1, y0, y1] } fn unpack(value: [felt252; 4]) -> G1Point { let [x0, x1, y0, y1] = value; let x = { let (limb0, limb1) = conversions::felt252_try_into_two_u96(x0).unwrap(); let (limb2, limb3) = conversions::felt252_try_into_two_u96(x1).unwrap(); u384 { limb0, limb1, limb2, limb3 } }; let y = { let (limb0, limb1) = conversions::felt252_try_into_two_u96(y0).unwrap(); let (limb2, limb3) = conversions::felt252_try_into_two_u96(y1).unwrap(); u384 { limb0, limb1, limb2, limb3 } }; return G1Point { x: x, y: y }; } } #[derive(Copy, Drop, Debug, PartialEq)] pub struct G2Point { pub x0: u384, pub x1: u384, pub y0: u384, pub y1: u384, } pub impl G2PointSerde of Serde { fn serialize(self: @G2Point, ref output: Array) { serialize_u384(self.x0, ref output); serialize_u384(self.x1, ref output); serialize_u384(self.y0, ref output); serialize_u384(self.y1, ref output); } fn deserialize(ref serialized: Span) -> Option { let x0 = deserialize_u384(ref serialized); let x1 = deserialize_u384(ref serialized); let y0 = deserialize_u384(ref serialized); let y1 = deserialize_u384(ref serialized); return Option::Some(G2Point { x0: x0, x1: x1, y0: y0, y1: y1 }); } } #[derive(Copy, Drop, Debug, PartialEq)] pub struct G2Line { pub r0a0: T, pub r0a1: T, pub r1a0: T, pub r1a1: T, } #[derive(Copy, Drop, Debug, PartialEq, Serde)] pub struct G1G2Pair { pub p: G1Point, pub q: G2Point, } // Represents the point at infinity pub impl G1PointZero of Zero { fn zero() -> G1Point { G1Point { x: Zero::zero(), y: Zero::zero() } } fn is_zero(self: @G1Point) -> bool { *self == Self::zero() } fn is_non_zero(self: @G1Point) -> bool { !self.is_zero() } } // Represents the point at infinity pub impl G2PointZero of Zero { fn zero() -> G2Point { G2Point { x0: Zero::zero(), x1: Zero::zero(), y0: Zero::zero(), y1: Zero::zero() } } fn is_zero(self: @G2Point) -> bool { *self == Self::zero() } fn is_non_zero(self: @G2Point) -> bool { !self.is_zero() } } ================================================ FILE: src/src/definitions.cairo ================================================ pub mod curves; pub mod structs { pub mod fields; pub mod points; } pub use core::circuit::{u384, u96}; pub use core::num::traits::{One, Zero}; pub use curves::{ BLS12_381, BLS12_381_SEED_BITS, BLS12_381_SEED_BITS_COMPRESSED, BLS_G2_GENERATOR, BLS_X_SEED_SQ, BN254, BN254_SEED_BITS_JY00_COMPRESSED, BN254_SEED_BITS_NAF, Curve, ED25519, GRUMPKIN, SECP256K1, SECP256R1, get_BLS12_381_modulus, get_BLS12_381_order_modulus, get_BN254_modulus, get_BN254_order_modulus, get_ED25519_modulus, get_ED25519_order_modulus, get_G, get_GRUMPKIN_modulus, get_GRUMPKIN_order_modulus, get_SECP256K1_modulus, get_SECP256K1_order_modulus, get_SECP256R1_modulus, get_SECP256R1_order_modulus, get_a, get_b, get_b_twist, get_curve_order_modulus, get_eigenvalue, get_g, get_min_one, get_min_one_order, get_modulus, get_n, get_nG_glv_fake_glv, get_p, get_third_root_of_unity, has_endomorphism_available, }; pub use structs::fields::{ E12D, E12T, RSA2048Chunks, RSA2048ChunksSerde, RSA2048ReductionWitness, deserialize_u384, deserialize_u384_array, serialize_u384, serialize_u384_array, u288, u288Serde, }; pub use structs::points::{ G1G2Pair, G1Point, G1PointSerde, G1PointStorePacking, G1PointZero, G2Line, G2Point, G2PointSerde, G2PointZero, }; pub use crate::ec::pairing::pairing_check::{ BLSProcessedPair, BNProcessedPair, MillerLoopResultScalingFactor, }; ================================================ FILE: src/src/ec/ec_ops.cairo ================================================ use core::array::ArrayTrait; use core::circuit::{ CircuitElement, CircuitInput, CircuitInputs, CircuitModulus, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, u96, }; use core::num::traits::{One, Zero}; use core::panic_with_felt252; use core::poseidon::hades_permutation; use core::result::ResultTrait; use corelib_imports::bounded_int::{downcast, upcast}; use corelib_imports::integer::{U128sFromFelt252Result, u128s_from_felt252}; use garaga::basic_field_ops::{is_opposite_mod_p, mul_mod_p, neg_mod_p, sub_mod_p}; use garaga::circuits::ec; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::{ G1Point, G1PointZero, get_G, get_a, get_b, get_curve_order_modulus, get_eigenvalue, get_min_one, get_min_one_order, get_modulus, get_n, get_nG_glv_fake_glv, get_third_root_of_unity, }; use garaga::ec::selectors; #[generate_trait] pub impl G1PointImpl of G1PointTrait { fn assert_on_curve_excluding_infinity(self: @G1Point, curve_index: usize) { if self.is_on_curve_excluding_infinity(curve_index) == false { panic_with_felt252('point not on curve'); } } fn is_on_curve_excluding_infinity(self: @G1Point, curve_index: usize) -> bool { let (check) = ec::run_IS_ON_CURVE_G1_circuit( *self, get_a(curve_index), get_b(curve_index), curve_index, ); check.is_zero() } fn negate(self: @G1Point, curve_index: usize) -> G1Point { let modulus = get_modulus(curve_index); G1Point { x: *self.x, y: neg_mod_p(*self.y, modulus) } } fn assert_in_subgroup_excluding_infinity(self: @G1Point, curve_index: usize) { self.assert_on_curve_excluding_infinity(curve_index); match curve_index { 0 => {}, // BN254 (cofactor 1) 1 => { // https://github.com/Consensys/gnark-crypto/blob/ff4c0ddbe1ef37d1c1c6bec8c36fc43a84c86be5/ecc/bls12-381/g1.go#L492 let modulus = get_modulus(curve_index); let phi_p = G1Point { x: mul_mod_p(get_third_root_of_unity(curve_index), *self.x, modulus), y: *self.y, }; let x_sq_phi_P = scalar_mul_by_bls12_381_seed_square(phi_p); if !ec_safe_add(*self, x_sq_phi_P, curve_index).is_infinity() { panic_with_felt252('bls12-381 pt not in subgroup'); } }, // BLS12-381 2 => {}, // SECP256K1 (cofactor 1) 3 => {}, // SECP256R1 (cofactor 1) 4 => { panic_with_felt252('ED25519 not implemented'); }, 5 => {}, // GRUMPKIN (cofactor 1) _ => { panic_with_felt252('invalid curve index') }, } } fn is_infinity(self: @G1Point) -> bool { return self.is_zero(); } fn update_hash_state( self: @G1Point, s0: felt252, s1: felt252, s2: felt252, ) -> (felt252, felt252, felt252) { let base: felt252 = 79228162514264337593543950336; // 2**96 let self = *self; let in_1 = s0 + self.x.limb0.into() + base * self.x.limb1.into(); let in_2 = s1 + self.x.limb2.into() + base * self.x.limb3.into(); let (s0, s1, s2) = hades_permutation(in_1, in_2, s2); let in_1 = s0 + self.y.limb0.into() + base * self.y.limb1.into(); let in_2 = s1 + self.y.limb2.into() + base * self.y.limb3.into(); let (s0, s1, s2) = hades_permutation(in_1, in_2, s2); return (s0, s1, s2); } } // Adds two elliptic curve points on a given curve. // Does not check the input points are on the curve. pub fn ec_safe_add(p: G1Point, q: G1Point, curve_index: usize) -> G1Point { if p.is_infinity() { return q; } if q.is_infinity() { return p; } let modulus = get_modulus(curve_index); let same_x = sub_mod_p(p.x, q.x, modulus).is_zero(); if same_x { let opposite_y = is_opposite_mod_p(p.y, q.y, modulus); if opposite_y { return G1PointZero::zero(); } else { let (res) = ec::run_DOUBLE_EC_POINT_circuit(p, get_a(curve_index), modulus); return res; } } else { let (res) = ec::run_ADD_EC_POINT_circuit(p, q, modulus); return res; } } pub fn _ec_safe_add( p: G1Point, q: G1Point, modulus: CircuitModulus, curve_index: usize, ) -> G1Point { if p.is_infinity() { return q; } if q.is_infinity() { return p; } let same_x = sub_mod_p(p.x, q.x, modulus).is_zero(); if same_x { let opposite_y = is_opposite_mod_p(p.y, q.y, modulus); if opposite_y { return G1PointZero::zero(); } else { let (res) = ec::run_DOUBLE_EC_POINT_circuit(p, get_a(curve_index), modulus); return res; } } else { let (res) = ec::run_ADD_EC_POINT_circuit(p, q, modulus); return res; } } #[derive(Drop, Serde)] pub struct GlvFakeGlvHint { pub Q: G1Point, pub u1: felt252, // Encoded as 2^128 * sign + abs(u1) pub u2: felt252, // Encoded as 2^128 * sign + abs(u2) pub v1: felt252, // Encoded as 2^128 * sign + abs(v1) pub v2: felt252 // Encoded as 2^128 * sign + abs(v2) } #[derive(Drop, Serde)] pub struct FakeGlvHint { pub Q: G1Point, pub s1: u128, // (s1)_u128 (always positive) pub s2: felt252 // Encoded as 2^128 * sign + abs(s2)_u128 } pub fn msm_g1( points: Span, scalars: Span, curve_index: usize, mut hint: Span, ) -> G1Point { match curve_index { 0 | 1 | 2 => { return msm_glv_fake_glv(points, scalars, curve_index, ref hint); }, _ => { return msm_fake_glv(points, scalars, curve_index, ref hint); }, } } pub fn msm_fake_glv( mut points: Span, mut scalars: Span, curve_index: usize, ref hint: Span, ) -> G1Point { let n = scalars.len(); assert(n == points.len(), 'n_pts!=n_scalars'); if n == 0 { panic_with_felt252('Msm size must be >= 1'); } assert(hint.len() == n * 10, 'wrong fakeglv hint size'); let order_modulus = get_curve_order_modulus(curve_index); let curve_order: u256 = get_n(curve_index); let modulus = get_modulus(curve_index); let A_weirstrass = get_a(curve_index); let order_minus_one = get_min_one_order(curve_index); let base_min_one = get_min_one(curve_index); let mut acc = G1PointZero::zero(); while hint.len() != 0 { let pt = *points.pop_front().unwrap(); let scalar = *scalars.pop_front().unwrap(); assert(scalar < curve_order, 'unreduced scalar'); let scalar_u384: u384 = scalar.into(); let fake_glv_hint: FakeGlvHint = Serde::deserialize(ref hint).unwrap(); let temp = _scalar_mul_fake_glv( pt, scalar_u384, order_modulus, modulus, A_weirstrass, order_minus_one, base_min_one, fake_glv_hint, curve_index, ); acc = _ec_safe_add(acc, temp, modulus, curve_index); } return acc; } pub fn _scalar_mul_fake_glv( point: G1Point, scalar: u384, order_modulus: CircuitModulus, modulus: CircuitModulus, A_weirstrass: u384, order_minus_one: u384, base_min_one: u384, hint: FakeGlvHint, curve_index: usize, ) -> G1Point { if scalar.is_zero() || point.is_infinity() { return G1PointZero::zero(); } point.assert_on_curve_excluding_infinity(curve_index); if scalar.is_one() { return point; } if scalar == order_minus_one { return G1Point { x: point.x, y: neg_mod_p(point.y, modulus) }; } hint.Q.assert_on_curve_excluding_infinity(curve_index); let (_s2_sign_order, _s2_sign_base, _s2_abs): (u384, u384, u128) = match u128s_from_felt252(hint.s2) { U128sFromFelt252Result::Narrow(low) => { ( u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }, u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }, low, ) }, U128sFromFelt252Result::Wide((_, low)) => { (order_minus_one, base_min_one, low) }, }; // Verify decomposition : s1 + scalar*s2 = 0 mod n && s2!=0. let s1 = CircuitElement::> {}; let S = CircuitElement::> {}; let s2 = CircuitElement::> {}; let s2_sign = CircuitElement::> {}; let check = circuit_add(s1, circuit_mul(S, circuit_mul(s2_sign, s2))); let s1_u384: u384 = hint.s1.into(); let s2_u384: u384 = _s2_abs.into(); let outputs = (check,) .new_inputs() .next_2(s1_u384) .next_2(scalar) .next_2(s2_u384) .next_2(_s2_sign_order) .done_2() .eval(order_modulus) .unwrap(); assert(_s2_abs != 0, 'FakeGLV: s2=0'); assert(outputs.get_output(check).is_zero(), 'Wrong FakeGLV decomposition'); let (T1, T2, T3, T4, T5y, T6y, T7y, T8y, T9, T10, T11, T12, T13y, T14y, T15y, T16y, R2, R0y) = ec::run_PREPARE_FAKE_GLV_PTS_circuit( point, hint.Q, _s2_sign_base, A_weirstrass, modulus, ); // ['T6', 'T7', 'T10', 'T11', 'T8', 'T5', 'T12', 'T9', 'T14', 'T15', 'T2', 'T3', 'T16', 'T13', // 'T4', 'T1'] let mut Ts: Array = array![ G1Point { x: T1.x, y: T6y }, G1Point { x: T4.x, y: T7y }, T10, T11, G1Point { x: T3.x, y: T8y }, G1Point { x: T2.x, y: T5y }, T12, T9, G1Point { x: T9.x, y: T14y }, G1Point { x: T12.x, y: T15y }, T2, T3, G1Point { x: T11.x, y: T16y }, G1Point { x: T10.x, y: T13y }, T4, T1, ]; let (mut selectors, s1lsb, s2lsb) = selectors::build_selectors_inlined_fake_glv( hint.s1, _s2_abs, ); // Add corrected point for the last bits 2-1 at position 16 in Ts array. let last_selector = *selectors.pop_front().unwrap(); let last_selector_pt = *Ts[last_selector]; let (last_selector_pt_corrected) = ec::run_ADD_EC_POINT_circuit(last_selector_pt, R2, modulus); Ts.append(last_selector_pt_corrected); let Ts = Ts.span(); // now the first selector should be 16 and will select the corrected point in the last // iteration. // First iteration (bit 128) let selector_y = *selectors.pop_back().unwrap(); let Bi = *Ts[selector_y]; let (Acc) = ec::run_DOUBLE_EC_POINT_circuit(T2, A_weirstrass, modulus); let (mut Acc) = ec::run_ADD_EC_POINT_circuit(Acc, Bi, modulus); // assert(selectors.len() == 63, 'wrong number of selectors'); // 7 iterations* 9 * 2 bits = 63 * 2 = 126 bits. while let Some(selector_y) = selectors.multi_pop_back::<9>() { let [ selector_y8, selector_y7, selector_y6, selector_y5, selector_y4, selector_y3, selector_y2, selector_y1, selector_y0, ] = selector_y .unbox(); let Bi = *Ts.at(selector_y0); let Bi1 = *Ts.at(selector_y1); let Bi2 = *Ts.at(selector_y2); let Bi3 = *Ts.at(selector_y3); let Bi4 = *Ts.at(selector_y4); let Bi5 = *Ts.at(selector_y5); let Bi6 = *Ts.at(selector_y6); let Bi7 = *Ts.at(selector_y7); let Bi8 = *Ts.at(selector_y8); let (_Acc) = ec::run_QUADRUPLE_AND_ADD_9_circuit( Acc, Bi, Bi1, Bi2, Bi3, Bi4, Bi5, Bi6, Bi7, Bi8, A_weirstrass, modulus, ); Acc = _Acc; } let (Acc) = if s1lsb == 0 { ec::run_ADD_EC_POINT_circuit( Acc, G1Point { x: point.x, y: neg_mod_p(point.y, modulus) }, modulus, ) } else { (Acc,) }; let (Acc) = if s2lsb == 0 { ec::run_ADD_EC_POINT_circuit(Acc, G1Point { x: hint.Q.x, y: R0y }, modulus) } else { (Acc,) }; // Assert. assert(Acc == R2, 'wrong FakeGLV result'); return hint.Q; } fn msm_glv_fake_glv( mut points: Span, mut scalars: Span, curve_index: usize, ref hint: Span, ) -> G1Point { let n = scalars.len(); assert!(n == points.len(), "scalars and points length mismatch"); if n == 0 { panic_with_felt252('Msm size must be >= 1'); } assert(hint.len() == n * 12, 'wrong glv&fakeglv hint size'); let eigen = get_eigenvalue(curve_index); let third_root_of_unity = get_third_root_of_unity(curve_index); let modulus = get_modulus(curve_index); let order_modulus = get_curve_order_modulus(curve_index); let curve_order: u256 = get_n(curve_index); let min_one = get_min_one_order(curve_index); let nG = get_nG_glv_fake_glv(curve_index); let mut acc = G1PointZero::zero(); while hint.len() != 0 { let pt = *points.pop_front().unwrap(); let scalar = *scalars.pop_front().unwrap(); assert(scalar < curve_order, 'unreduced scalar'); let scalar_u384: u384 = scalar.into(); let glv_fake_glv_hint: GlvFakeGlvHint = Serde::deserialize(ref hint).unwrap(); match pt.is_infinity() { true => { acc = acc; }, false => { pt.assert_on_curve_excluding_infinity(curve_index); let temp = _scalar_mul_glv_and_fake_glv( pt, scalar_u384, order_modulus, modulus, glv_fake_glv_hint, eigen, third_root_of_unity, min_one, nG, curve_index, ); acc = _ec_safe_add(acc, temp, modulus, curve_index); }, } } return acc; } #[inline(always)] // /!\ Assumes point is on curve (not infinity) and scalar is reduced mod n. /!\ pub fn _scalar_mul_glv_and_fake_glv( point: G1Point, scalar: u384, order_modulus: CircuitModulus, modulus: CircuitModulus, hint: GlvFakeGlvHint, _lambda: u384, third_root_of_unity: u384, minus_one: u384, n_bits_G: G1Point, curve_index: usize, ) -> G1Point { if scalar.is_zero() { return G1PointZero::zero(); } if scalar.is_one() { return point; } hint.Q.assert_on_curve_excluding_infinity(curve_index); if scalar == minus_one { return G1Point { x: point.x, y: neg_mod_p(point.y, modulus) }; } let one_u384: u384 = u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }; // Retrieve the u1, u2, v1, v2 values from the hint // They are encoded as 2^128 * sign + abs(value) // If high_128 limbs are != 0, we consider the value is negative, otherwise it is positive. // We also precompute the negated value of the y coordinate of the points based on the sign in // the same match condition for efficiency. let (_u1_sign, _u1_abs, P0y, P1y): (u384, u96, u384, u384) = match u128s_from_felt252(hint.u1) { U128sFromFelt252Result::Narrow(low) => { (one_u384, downcast(low).unwrap(), neg_mod_p(point.y, modulus), point.y) }, U128sFromFelt252Result::Wide(( _, low, )) => { (minus_one, downcast(low).unwrap(), point.y, neg_mod_p(point.y, modulus)) }, }; let (_u2_sign, _u2_abs, Phi_P0y, Phi_P1y): (u384, u96, u384, u384) = match u128s_from_felt252(hint.u2) { U128sFromFelt252Result::Narrow(low) => { (one_u384, downcast(low).unwrap(), neg_mod_p(point.y, modulus), point.y) }, U128sFromFelt252Result::Wide(( _, low, )) => { (minus_one, downcast(low).unwrap(), point.y, neg_mod_p(point.y, modulus)) }, }; let (_v1_sign, _v1_abs, Q0y): (u384, u96, u384) = match u128s_from_felt252(hint.v1) { U128sFromFelt252Result::Narrow(low) => { (one_u384, downcast(low).unwrap(), neg_mod_p(hint.Q.y, modulus)) }, U128sFromFelt252Result::Wide((_, low)) => { (minus_one, downcast(low).unwrap(), hint.Q.y) }, }; let (_v2_sign, _v2_abs, Phi_Q0y): (u384, u96, u384) = match u128s_from_felt252(hint.v2) { U128sFromFelt252Result::Narrow(low) => { (one_u384, downcast(low).unwrap(), neg_mod_p(hint.Q.y, modulus)) }, U128sFromFelt252Result::Wide((_, low)) => { (minus_one, downcast(low).unwrap(), hint.Q.y) }, }; // At this point ~ 631 steps. // Check that the GLV/FakeGLV decomposition is valid: // # s*(v1 + λ*v2) + u1 + λ*u2 = 0 let s = CircuitElement::> {}; let lambda = CircuitElement::> {}; let u1_abs = CircuitElement::> {}; let u1_sign = CircuitElement::> {}; let u2_abs = CircuitElement::> {}; let u2_sign = CircuitElement::> {}; let v1_abs = CircuitElement::> {}; let v1_sign = CircuitElement::> {}; let v2_abs = CircuitElement::> {}; let v2_sign = CircuitElement::> {}; let u1 = circuit_mul(u1_abs, u1_sign); let u2 = circuit_mul(u2_abs, u2_sign); let v1 = circuit_mul(v1_abs, v1_sign); let v2 = circuit_mul(v2_abs, v2_sign); // u1 + λ*u2 let lambda_u2 = circuit_mul(lambda, u2); let u1_lambda_u2 = circuit_add(u1, lambda_u2); // s*(v1 + λ*v2) let lambda_v2 = circuit_mul(lambda, v2); let v1_lambda_v2 = circuit_add(v1, lambda_v2); let s_v1_lambda_v2 = circuit_mul(s, v1_lambda_v2); // s*(v1 + λ*v2) + u1 + λ*u2 let res = circuit_add(s_v1_lambda_v2, u1_lambda_u2); let outputs = (res,) .new_inputs() .next_2(scalar) .next_2(_lambda) .next_2([_u1_abs, 0, 0, 0]) .next_2(_u1_sign) .next_2([_u2_abs, 0, 0, 0]) .next_2(_u2_sign) .next_2([_v1_abs, 0, 0, 0]) .next_2(_v1_sign) .next_2([_v2_abs, 0, 0, 0]) .next_2(_v2_sign) .done_2() .eval(order_modulus) .unwrap(); assert(outputs.get_output(res).is_zero(), 'Wrong GLV/FakeGLV decomposition'); // At this point, ~ 836 steps // Note : P != Q (scalar != 1) let P0 = G1Point { x: point.x, y: P0y }; let Q0 = G1Point { x: hint.Q.x, y: Q0y }; let ( B1, B2, B3, B4, B5, B6, B7, B8, B9y, B10y, B11y, B12y, B13y, B14y, B15y, B16y, Phi_P0x, Phi_Q0x, mut Acc, ) = ec::run_PREPARE_GLV_FAKE_GLV_PTS_circuit( point.x, P0y, P1y, hint.Q.x, Q0y, Phi_P0y, Phi_P1y, Phi_Q0y, get_G(curve_index), third_root_of_unity, modulus, ); let Bs: Span = array![ G1Point { x: B1.x, y: B16y }, B8, G1Point { x: B3.x, y: B14y }, B6, G1Point { x: B5.x, y: B12y }, B4, G1Point { x: B7.x, y: B10y }, B2, G1Point { x: B2.x, y: B15y }, B7, G1Point { x: B4.x, y: B13y }, B5, G1Point { x: B6.x, y: B11y }, B3, G1Point { x: B8.x, y: B9y }, B1, ] .span(); // At this point, ~ 1643 steps. // println!("Bs: {:?}", Bs); // println!("Acc: {:?}", Acc); let mut _u1: u128 = upcast(_u1_abs); let mut _u2: u128 = upcast(_u2_abs); let mut _v1: u128 = upcast(_v1_abs); let mut _v2: u128 = upcast(_v2_abs); let (mut selectors, u1lsb, u2lsb, v1lsb, v2lsb) = selectors::build_selectors_inlined( _u1, _u2, _v1, _v2, ); // Process 8 bits per iteration while let Some(selector_y) = selectors.multi_pop_back::<8>() { let [ selector_y7, selector_y6, selector_y5, selector_y4, selector_y3, selector_y2, selector_y1, selector_y0, ] = (*selector_y) .unbox(); let Bi = *Bs.at(selector_y0); let Bi1 = *Bs.at(selector_y1); let Bi2 = *Bs.at(selector_y2); let Bi3 = *Bs.at(selector_y3); let Bi4 = *Bs.at(selector_y4); let Bi5 = *Bs.at(selector_y5); let Bi6 = *Bs.at(selector_y6); let Bi7 = *Bs.at(selector_y7); Acc = double_and_add_8(Acc, Bi, Bi1, Bi2, Bi3, Bi4, Bi5, Bi6, Bi7, modulus); } // println!("Acc final: {:?}", Acc); let (Acc) = if u1lsb == 0 { ec::run_ADD_EC_POINT_circuit(Acc, P0, modulus) } else { (Acc,) }; let (Acc) = if u2lsb == 0 { ec::run_ADD_EC_POINT_circuit(Acc, G1Point { x: Phi_P0x, y: Phi_P0y }, modulus) } else { (Acc,) }; let (Acc) = if v1lsb == 0 { ec::run_ADD_EC_POINT_circuit(Acc, Q0, modulus) } else { (Acc,) }; let (Acc) = if v2lsb == 0 { ec::run_ADD_EC_POINT_circuit(Acc, G1Point { x: Phi_Q0x, y: Phi_Q0y }, modulus) } else { (Acc,) }; assert(Acc == n_bits_G, 'Wrong Glv&FakeGLV result'); return hint.Q; } fn scalar_mul_by_bls12_381_seed_square(q: G1Point) -> G1Point { let a = get_a(1); let modulus = get_modulus(1); let (z) = ec::run_DOUBLE_EC_POINT_circuit(q, a, modulus); // z := g1.double(q) let (z) = ec::run_ADD_EC_POINT_circuit(q, z, modulus); // z = g1.add(q, z) let (z) = ec::run_DOUBLE_EC_POINT_circuit(z, a, modulus); // z = g1.double(z) let z = double_and_add(z, q, modulus); // z = g1.doubleAndAdd(z, q) let z = double_n_times(z, 2, modulus, a); // z = g1.doubleN(z, 2) let z = double_and_add(z, q, modulus); // z = g1.doubleAndAdd(z, q) let z = double_n_times(z, 8, modulus, a); // z = g1.doubleN(z, 8) let z = double_and_add(z, q, modulus); // z = g1.doubleAndAdd(z, q) let (t0) = ec::run_DOUBLE_EC_POINT_circuit(z, a, modulus); // t0 := g1.double(z) let (t0) = ec::run_ADD_EC_POINT_circuit(z, t0, modulus); // t0 = g1.add(z, t0) let (t0) = ec::run_DOUBLE_EC_POINT_circuit(t0, a, modulus); // t0 = g1.double(t0) let t0 = double_and_add(t0, z, modulus); // t0 = g1.doubleAndAdd(t0, z) let t0 = double_n_times(t0, 2, modulus, a); // t0 = g1.doubleN(t0, 2) let t0 = double_and_add(t0, z, modulus); // t0 = g1.doubleAndAdd(t0, z) let t0 = double_n_times(t0, 8, modulus, a); // t0 = g1.doubleN(t0, 8) let t0 = double_and_add(t0, z, modulus); // t0 = g1.doubleAndAdd(t0, z) let t0 = double_n_times(t0, 31, modulus, a); // t0 = g1.doubleN(t0, 31) let (z) = ec::run_ADD_EC_POINT_circuit(t0, z, modulus); // z = g1.add(t0, z) let z = double_n_times(z, 32, modulus, a); // z = g1.doubleN(z, 32) let z = double_and_add(z, q, modulus); // z = g1.doubleAndAdd(z, q) let z = double_n_times(z, 32, modulus, a); // z = g1.doubleN(z, 32) return z; } pub fn double_n_times(p: G1Point, n: usize, modulus: CircuitModulus, a: u384) -> G1Point { let mut res = p; for _ in 0..n { let (tmp) = ec::run_DOUBLE_EC_POINT_circuit(res, a, modulus); res = tmp; } return res; } // Computes 2*P + Q pub fn double_and_add(p: G1Point, q: G1Point, modulus: CircuitModulus) -> G1Point { let px = CircuitElement::> {}; let py = CircuitElement::> {}; let qx = CircuitElement::> {}; let qy = CircuitElement::> {}; // Compute lambda1 for P + Q let num_lambda1 = circuit_sub(qy, py); let den_lambda1 = circuit_sub(qx, px); let lambda1 = circuit_mul(num_lambda1, circuit_inverse(den_lambda1)); // Compute x-coordinate of P + Q let lambda1_sq = circuit_mul(lambda1, lambda1); let x2 = circuit_sub(lambda1_sq, px); let x2 = circuit_sub(x2, qx); // Compute lambda2 for 2*P let den_lambda2 = circuit_sub(x2, px); let num_lambda2 = circuit_add(py, py); let term2_lambda2 = circuit_mul(num_lambda2, circuit_inverse(den_lambda2)); let lambda2 = circuit_add(lambda1, term2_lambda2); // Compute final coordinates of 2*P + Q let lambda2_sq = circuit_mul(lambda2, lambda2); let tx_temp = circuit_sub(lambda2_sq, px); let result_x = circuit_sub(tx_temp, x2); let tx_sub_px = circuit_sub(result_x, px); let term1_ty = circuit_mul(lambda2, tx_sub_px); let result_y = circuit_sub(term1_ty, py); let outputs = (result_x, result_y) .new_inputs() .next_2(p.x) .next_2(p.y) .next_2(q.x) .next_2(q.y) .done_2() .eval(modulus) .expect('double_and_add failed'); return G1Point { x: outputs.get_output(result_x), y: outputs.get_output(result_y) }; } // Computes 2*(2*(2*(2*(2*(2*(2*(2*P + Q0) + Q1) + Q2) + Q3) + Q4) + Q5) + Q6) + Q7 #[inline(always)] pub fn double_and_add_8( p: G1Point, q0: G1Point, q1: G1Point, q2: G1Point, q3: G1Point, q4: G1Point, q5: G1Point, q6: G1Point, q7: G1Point, modulus: CircuitModulus, ) -> G1Point { let px = CircuitElement::> {}; let py = CircuitElement::> {}; let q0x = CircuitElement::> {}; let q0y = CircuitElement::> {}; let q1x = CircuitElement::> {}; let q1y = CircuitElement::> {}; let q2x = CircuitElement::> {}; let q2y = CircuitElement::> {}; let q3x = CircuitElement::> {}; let q3y = CircuitElement::> {}; let q4x = CircuitElement::> {}; let q4y = CircuitElement::> {}; let q5x = CircuitElement::> {}; let q5y = CircuitElement::> {}; let q6x = CircuitElement::> {}; let q6y = CircuitElement::> {}; let q7x = CircuitElement::> {}; let q7y = CircuitElement::> {}; // --- Step 1: (2 * CurrentP) + Q0 --- let num_lambda1_0 = circuit_sub(q0y, py); let den_lambda1_0 = circuit_sub(q0x, px); let lambda1_0 = circuit_mul(num_lambda1_0, circuit_inverse(den_lambda1_0)); let lambda1_sq_0 = circuit_mul(lambda1_0, lambda1_0); let x2_0 = circuit_sub(lambda1_sq_0, px); let x2_0 = circuit_sub(x2_0, q0x); let den_lambda2_0 = circuit_sub(x2_0, px); let num_lambda2_0 = circuit_add(py, py); let term2_lambda2_0 = circuit_mul(num_lambda2_0, circuit_inverse(den_lambda2_0)); let lambda2_0 = circuit_add(lambda1_0, term2_lambda2_0); let lambda2_sq_0 = circuit_mul(lambda2_0, lambda2_0); let tx_temp_0 = circuit_sub(lambda2_sq_0, px); let T1x = circuit_sub(tx_temp_0, x2_0); let tx_sub_px_0 = circuit_sub(T1x, px); let term1_ty_0 = circuit_mul(lambda2_0, tx_sub_px_0); let T1y = circuit_sub(term1_ty_0, py); // --- Step 2: (2 * CurrentP) + Q1 --- let num_lambda1_1 = circuit_sub(q1y, T1y); let den_lambda1_1 = circuit_sub(q1x, T1x); let lambda1_1 = circuit_mul(num_lambda1_1, circuit_inverse(den_lambda1_1)); let lambda1_sq_1 = circuit_mul(lambda1_1, lambda1_1); let x2_1 = circuit_sub(lambda1_sq_1, T1x); let x2_1 = circuit_sub(x2_1, q1x); let den_lambda2_1 = circuit_sub(x2_1, T1x); let num_lambda2_1 = circuit_add(T1y, T1y); let term2_lambda2_1 = circuit_mul(num_lambda2_1, circuit_inverse(den_lambda2_1)); let lambda2_1 = circuit_add(lambda1_1, term2_lambda2_1); let lambda2_sq_1 = circuit_mul(lambda2_1, lambda2_1); let tx_temp_1 = circuit_sub(lambda2_sq_1, T1x); let T2x = circuit_sub(tx_temp_1, x2_1); let tx_sub_px_1 = circuit_sub(T2x, T1x); let term1_ty_1 = circuit_mul(lambda2_1, tx_sub_px_1); let T2y = circuit_sub(term1_ty_1, T1y); // --- Step 3: (2 * CurrentP) + Q2 --- let num_lambda1_2 = circuit_sub(q2y, T2y); let den_lambda1_2 = circuit_sub(q2x, T2x); let lambda1_2 = circuit_mul(num_lambda1_2, circuit_inverse(den_lambda1_2)); let lambda1_sq_2 = circuit_mul(lambda1_2, lambda1_2); let x2_2 = circuit_sub(lambda1_sq_2, T2x); let x2_2 = circuit_sub(x2_2, q2x); let den_lambda2_2 = circuit_sub(x2_2, T2x); let num_lambda2_2 = circuit_add(T2y, T2y); let term2_lambda2_2 = circuit_mul(num_lambda2_2, circuit_inverse(den_lambda2_2)); let lambda2_2 = circuit_add(lambda1_2, term2_lambda2_2); let lambda2_sq_2 = circuit_mul(lambda2_2, lambda2_2); let tx_temp_2 = circuit_sub(lambda2_sq_2, T2x); let T3x = circuit_sub(tx_temp_2, x2_2); let tx_sub_px_2 = circuit_sub(T3x, T2x); let term1_ty_2 = circuit_mul(lambda2_2, tx_sub_px_2); let T3y = circuit_sub(term1_ty_2, T2y); // --- Step 4: (2 * CurrentP) + Q3 --- let num_lambda1_3 = circuit_sub(q3y, T3y); let den_lambda1_3 = circuit_sub(q3x, T3x); let lambda1_3 = circuit_mul(num_lambda1_3, circuit_inverse(den_lambda1_3)); let lambda1_sq_3 = circuit_mul(lambda1_3, lambda1_3); let x2_3 = circuit_sub(lambda1_sq_3, T3x); let x2_3 = circuit_sub(x2_3, q3x); let den_lambda2_3 = circuit_sub(x2_3, T3x); let num_lambda2_3 = circuit_add(T3y, T3y); let term2_lambda2_3 = circuit_mul(num_lambda2_3, circuit_inverse(den_lambda2_3)); let lambda2_3 = circuit_add(lambda1_3, term2_lambda2_3); let lambda2_sq_3 = circuit_mul(lambda2_3, lambda2_3); let tx_temp_3 = circuit_sub(lambda2_sq_3, T3x); let T4x = circuit_sub(tx_temp_3, x2_3); let tx_sub_px_3 = circuit_sub(T4x, T3x); let term1_ty_3 = circuit_mul(lambda2_3, tx_sub_px_3); let T4y = circuit_sub(term1_ty_3, T3y); // --- Step 5: (2 * CurrentP) + Q4 --- let num_lambda1_4 = circuit_sub(q4y, T4y); let den_lambda1_4 = circuit_sub(q4x, T4x); let lambda1_4 = circuit_mul(num_lambda1_4, circuit_inverse(den_lambda1_4)); let lambda1_sq_4 = circuit_mul(lambda1_4, lambda1_4); let x2_4 = circuit_sub(lambda1_sq_4, T4x); let x2_4 = circuit_sub(x2_4, q4x); let den_lambda2_4 = circuit_sub(x2_4, T4x); let num_lambda2_4 = circuit_add(T4y, T4y); let term2_lambda2_4 = circuit_mul(num_lambda2_4, circuit_inverse(den_lambda2_4)); let lambda2_4 = circuit_add(lambda1_4, term2_lambda2_4); let lambda2_sq_4 = circuit_mul(lambda2_4, lambda2_4); let tx_temp_4 = circuit_sub(lambda2_sq_4, T4x); let T5x = circuit_sub(tx_temp_4, x2_4); let tx_sub_px_4 = circuit_sub(T5x, T4x); let term1_ty_4 = circuit_mul(lambda2_4, tx_sub_px_4); let T5y = circuit_sub(term1_ty_4, T4y); // --- Step 6: (2 * CurrentP) + Q5 --- let num_lambda1_5 = circuit_sub(q5y, T5y); let den_lambda1_5 = circuit_sub(q5x, T5x); let lambda1_5 = circuit_mul(num_lambda1_5, circuit_inverse(den_lambda1_5)); let lambda1_sq_5 = circuit_mul(lambda1_5, lambda1_5); let x2_5 = circuit_sub(lambda1_sq_5, T5x); let x2_5 = circuit_sub(x2_5, q5x); let den_lambda2_5 = circuit_sub(x2_5, T5x); let num_lambda2_5 = circuit_add(T5y, T5y); let term2_lambda2_5 = circuit_mul(num_lambda2_5, circuit_inverse(den_lambda2_5)); let lambda2_5 = circuit_add(lambda1_5, term2_lambda2_5); let lambda2_sq_5 = circuit_mul(lambda2_5, lambda2_5); let tx_temp_5 = circuit_sub(lambda2_sq_5, T5x); let T6x = circuit_sub(tx_temp_5, x2_5); let tx_sub_px_5 = circuit_sub(T6x, T5x); let term1_ty_5 = circuit_mul(lambda2_5, tx_sub_px_5); let T6y = circuit_sub(term1_ty_5, T5y); // --- Step 7: (2 * CurrentP) + Q6 --- let num_lambda1_6 = circuit_sub(q6y, T6y); let den_lambda1_6 = circuit_sub(q6x, T6x); let lambda1_6 = circuit_mul(num_lambda1_6, circuit_inverse(den_lambda1_6)); let lambda1_sq_6 = circuit_mul(lambda1_6, lambda1_6); let x2_6 = circuit_sub(lambda1_sq_6, T6x); let x2_6 = circuit_sub(x2_6, q6x); let den_lambda2_6 = circuit_sub(x2_6, T6x); let num_lambda2_6 = circuit_add(T6y, T6y); let term2_lambda2_6 = circuit_mul(num_lambda2_6, circuit_inverse(den_lambda2_6)); let lambda2_6 = circuit_add(lambda1_6, term2_lambda2_6); let lambda2_sq_6 = circuit_mul(lambda2_6, lambda2_6); let tx_temp_6 = circuit_sub(lambda2_sq_6, T6x); let T7x = circuit_sub(tx_temp_6, x2_6); let tx_sub_px_6 = circuit_sub(T7x, T6x); let term1_ty_6 = circuit_mul(lambda2_6, tx_sub_px_6); let T7y = circuit_sub(term1_ty_6, T6y); // --- Step 8: (2 * CurrentP) + Q7 --- let num_lambda1_7 = circuit_sub(q7y, T7y); let den_lambda1_7 = circuit_sub(q7x, T7x); let lambda1_7 = circuit_mul(num_lambda1_7, circuit_inverse(den_lambda1_7)); let lambda1_sq_7 = circuit_mul(lambda1_7, lambda1_7); let x2_7 = circuit_sub(lambda1_sq_7, T7x); let x2_7 = circuit_sub(x2_7, q7x); let den_lambda2_7 = circuit_sub(x2_7, T7x); let num_lambda2_7 = circuit_add(T7y, T7y); let term2_lambda2_7 = circuit_mul(num_lambda2_7, circuit_inverse(den_lambda2_7)); let lambda2_7 = circuit_add(lambda1_7, term2_lambda2_7); let lambda2_sq_7 = circuit_mul(lambda2_7, lambda2_7); let tx_temp_7 = circuit_sub(lambda2_sq_7, T7x); let T8x = circuit_sub(tx_temp_7, x2_7); let tx_sub_px_7 = circuit_sub(T8x, T7x); let term1_ty_7 = circuit_mul(lambda2_7, tx_sub_px_7); let T8y = circuit_sub(term1_ty_7, T7y); let outputs = (T8x, T8y) .new_inputs() .next_2(p.x) .next_2(p.y) .next_2(q0.x) .next_2(q0.y) .next_2(q1.x) .next_2(q1.y) .next_2(q2.x) .next_2(q2.y) .next_2(q3.x) .next_2(q3.y) .next_2(q4.x) .next_2(q4.y) .next_2(q5.x) .next_2(q5.y) .next_2(q6.x) .next_2(q6.y) .next_2(q7.x) .next_2(q7.y) .done_2() .eval(modulus) .expect('double_and_add_8 failed'); return G1Point { x: outputs.get_output(T8x), y: outputs.get_output(T8y) }; } ================================================ FILE: src/src/ec/ec_ops_g2.cairo ================================================ use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitModulus, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_sub, u384, }; use core::num::traits::Zero; use core::option::Option; use garaga::basic_field_ops::{neg_mod_p, reduce_mod_p}; use garaga::circuits::ec; use garaga::core::circuit::AddInputResultTrait2; use garaga::definitions::{G2Point, G2PointZero, get_a, get_b_twist, get_modulus}; use garaga::utils::u384_assert_zero; #[generate_trait] pub impl G2PointImpl of G2PointTrait { fn assert_on_curve_excluding_infinity(self: @G2Point, curve_index: usize) { let (b20, b21) = get_b_twist(curve_index); let (check0, check1) = ec::run_IS_ON_CURVE_G2_circuit( *self, get_a(curve_index), b20, b21, curve_index, ); u384_assert_zero(check0); u384_assert_zero(check1); } fn is_on_curve_excluding_infinity(self: @G2Point, curve_index: usize) -> bool { let (b20, b21) = get_b_twist(curve_index); let (check0, check1) = ec::run_IS_ON_CURVE_G2_circuit( *self, get_a(curve_index), b20, b21, curve_index, ); return check0.is_zero() && check1.is_zero(); } fn is_infinity(self: @G2Point) -> bool { return self.is_zero(); } fn negate(self: @G2Point, curve_index: usize) -> G2Point { let modulus = get_modulus(curve_index); G2Point { x0: *self.x0, x1: *self.x1, y0: neg_mod_p(*self.y0, modulus), y1: neg_mod_p(*self.y1, modulus), } } fn assert_in_subgroup_excluding_infinity(self: @G2Point, curve_index: usize) { self.assert_on_curve_excluding_infinity(curve_index); match curve_index { 0 => {}, // BN254 (cofactor 1, nothing to do) 1 => { let modulus = get_modulus(curve_index); let (psi_Q) = ec::run_PSI_G2_BLS12_381_circuit(*self, modulus); let seed_Q = scalar_mul_by_bls12_381_seed(*self); if psi_Q != seed_Q { core::panic_with_felt252('bls12-381 pt not in subgroup'); } }, _ => { core::panic_with_felt252('invalid curve index') }, } } } /// G2 Ops for BLS12-381. /// Adds two elliptic curve points on a given curve twist. /// /// # Assumptions /// - The curve equation is of the form y^2 = x^3 + b [Fp2] (i.e. a = 0) for the given curve index. /// - The curve index should be either 0 (BN254) or 1 (BLS12_381). Behavior is undefined otherwise. /// - The points are on the curve (can be the point at infinity as well). /// /// # Returns /// - Point at infinity if the points have the same x coordinate and opposite y coordinates. /// - The result of the addition otherwise. pub fn ec_safe_add_g2(p: G2Point, q: G2Point, curve_index: usize) -> G2Point { if p.is_infinity() { return q; } if q.is_infinity() { return p; } let modulus = get_modulus(curve_index); let same_x = eq_mod_p(p.x0, p.x1, q.x0, q.x1, modulus); if same_x { let opposite_y = eq_neg_mod_p(p.y0, p.y1, q.y0, q.y1, modulus); if opposite_y { return G2PointZero::zero(); // Point at infinity } else { let (res) = ec::run_DOUBLE_EC_POINT_G2_A_EQ_0_circuit(p, modulus); return res; } } else { let (res) = ec::run_ADD_EC_POINTS_G2_circuit(p, q, modulus); return res; } } /// Multiplies a G2 point by a u256 scalar. /// /// # Returns /// - `Option::None` if the point is not on the curve. /// /// # Notes /// - `curve_index` should be either 0 (BN254) or 1 (BLS12_381). Behavior is undefined otherwise. /// - Input points outside of the r-torsion subgroup are supported. pub fn ec_mul(pt: G2Point, s: u256, curve_index: usize) -> Option { if pt.is_zero() { // Input point is at infinity, return it return Option::Some(pt); } else if pt.is_on_curve_excluding_infinity(curve_index) { if s == 0 { return Option::Some(G2PointZero::zero()); } else if s == 1 { return Option::Some(pt); } else { // Point is on the curve. // s is >= 2. let bits = get_bits_little(s); let pt = ec_mul_inner(pt, bits, curve_index); return Option::Some(pt); } } else { // Point is not on the curve return Option::None; } } // Returns the bits of a 256 bit number in little endian format. pub fn get_bits_little(s: u256) -> Array { let mut bits = ArrayTrait::new(); let mut s_low = s.low; while s_low != 0 { let (q, r) = core::traits::DivRem::div_rem(s_low, 2); bits.append(r.into()); s_low = q; } let mut s_high = s.high; if s_high != 0 { while bits.len() != 128 { bits.append(0); } } while s_high != 0 { let (q, r) = core::traits::DivRem::div_rem(s_high, 2); bits.append(r.into()); s_high = q; } bits } // Should not be called outside of ec_mul. // The size of bits array must be at minimum 2 and the point must be strictly on the curve. fn ec_mul_inner(pt: G2Point, mut bits: Array, curve_index: usize) -> G2Point { let mut temp = pt; // 2^0 * pt let mut result: G2Point = G2PointZero::zero(); let modulus = get_modulus(curve_index); // Make sure input x coordinate is reduced mod p before the loop for check inside ec_add_inner. temp.x0 = reduce_mod_p(temp.x0, modulus); temp.x1 = reduce_mod_p(temp.x1, modulus); // Make sure input y coordinate is reduced mod p before the loop for the check before doubling. temp.y0 = reduce_mod_p(temp.y0, modulus); temp.y1 = reduce_mod_p(temp.y1, modulus); for bit in bits { if bit != 0 { result = _ec_add_inner(temp, result, modulus); } if temp.y0.is_zero() && temp.y1.is_zero() { // P = -P. Doubling will result in a point at infinity. temp = G2PointZero::zero(); } else { let (_temp) = ec::run_DOUBLE_EC_POINT_G2_A_EQ_0_circuit(temp, modulus); temp = _temp; // 2^i * pt } } return result; } // Inner add function for ec_mul_inner. // Assumptions: // - The points are on the curve (can be the point at infinity as well) // - p and q have their coordinates in reduced form. #[inline] fn _ec_add_inner(p: G2Point, q: G2Point, modulus: CircuitModulus) -> G2Point { if p.is_infinity() { return q; } if q.is_infinity() { return p; } let same_x = (p.x0 == q.x0 && p.x1 == q.x1); if same_x { let opposite_y = eq_neg_mod_p(p.y0, p.y1, q.y0, q.y1, modulus); if opposite_y { return G2PointZero::zero(); // Point at infinity } else { let (res) = ec::run_DOUBLE_EC_POINT_G2_A_EQ_0_circuit(p, modulus); return res; } } else { let (res) = ec::run_ADD_EC_POINTS_G2_circuit(p, q, modulus); return res; } } // returns true if a == b mod p bls12-381 #[inline] pub fn eq_mod_p(a0: u384, a1: u384, b0: u384, b1: u384, modulus: CircuitModulus) -> bool { let _a0 = CE::> {}; let _a1 = CE::> {}; let _b0 = CE::> {}; let _b1 = CE::> {}; let sub0 = circuit_sub(_a0, _b0); let sub1 = circuit_sub(_a1, _b1); let outputs = (sub0, sub1) .new_inputs() .next_2(a0) .next_2(a1) .next_2(b0) .next_2(b1) .done_2() .eval(modulus) .unwrap(); return outputs.get_output(sub0).is_zero() && outputs.get_output(sub1).is_zero(); } // returns true if a == -b mod p bls12-381 #[inline] pub fn eq_neg_mod_p(a0: u384, a1: u384, b0: u384, b1: u384, modulus: CircuitModulus) -> bool { let _a0 = CE::> {}; let _a1 = CE::> {}; let _b0 = CE::> {}; let _b1 = CE::> {}; let check0 = circuit_add(_a0, _b0); let check1 = circuit_add(_a1, _b1); let outputs = (check0, check1) .new_inputs() .next_2(a0) .next_2(a1) .next_2(b0) .next_2(b1) .done_2() .eval(modulus) .unwrap(); return outputs.get_output(check0).is_zero() && outputs.get_output(check1).is_zero(); } // Computes [x]Q where x is the BLS12-381 seed parameter. // // # Assumptions // - Q lies on the BLS12-381 G2 twist curve // - Q is not the point at infinity // // # Completeness // During the fixed addition chain an intermediate point may become // P = (x, 0). Such a point is a 2-torsion element (order 2) and doubling it // yields the point at infinity, causing the doubling circuit to fail. // // The BLS12-381 G2 twist contains exactly three finite 2-torsion points // (all with y = (0,0)) plus the point at infinity. // // • If the input Q is already in the prime-order subgroup r, // no 2-torsion point can ever be reached; the probability is exactly 0. // • For a uniformly random point of E(Fₚ²) the probability of hitting such an // intermediate is 3 / |E(Fₚ²)| ≈ 2⁻⁷⁶¹, which is cryptographically // negligible. // // Hence the routine is complete for all subgroup inputs and may only fail on // an astronomically small fraction of out-of-subgroup points. // This is acceptable because the function is invoked precisely for subgroup testing. pub fn scalar_mul_by_bls12_381_seed(q: G2Point) -> G2Point { let modulus = get_modulus(1); // Triple. let (z) = ec::run_DOUBLE_EC_POINT_G2_A_EQ_0_circuit(q, modulus); let (z) = ec::run_ADD_EC_POINTS_G2_circuit(z, q, modulus); // Double. let (z) = ec::run_DOUBLE_EC_POINT_G2_A_EQ_0_circuit(z, modulus); // Double and add. let (z) = ec::run_DOUBLE_AND_ADD_EC_POINTS_G2_circuit(z, q, modulus); // Double 2 times. let (z) = double_n_times(z, 2, modulus); // Double and add. let (z) = ec::run_DOUBLE_AND_ADD_EC_POINTS_G2_circuit(z, q, modulus); // Double 8 times. let (z) = double_n_times(z, 8, modulus); // Double and add. let (z) = ec::run_DOUBLE_AND_ADD_EC_POINTS_G2_circuit(z, q, modulus); // Double 31 times. let (z) = double_n_times(z, 31, modulus); // Double and add. let (z) = ec::run_DOUBLE_AND_ADD_EC_POINTS_G2_circuit(z, q, modulus); // Double 16 times. let (z) = double_n_times(z, 16, modulus); return z.negate(1); // Negative seed parameter. } fn double_n_times(p: G2Point, n: usize, modulus: CircuitModulus) -> (G2Point,) { let mut res = p; for _ in 0..n { let (tmp) = ec::run_DOUBLE_EC_POINT_G2_A_EQ_0_circuit(res, modulus); res = tmp; } return (res,); } #[cfg(test)] mod tests { use garaga::definitions::BLS_G2_GENERATOR; use super::{G2Point, G2PointZero, ec_mul, u384}; #[test] fn test_ec_mul_g2() { let g = BLS_G2_GENERATOR; let s = 0; let curve_index = 1; let r = ec_mul(g, s, curve_index).unwrap(); assert!(r == G2PointZero::zero()); let s: u256 = 1; let r = ec_mul(g, s, curve_index).unwrap(); assert!(r == g); let s: u256 = 2; let g2: G2Point = G2Point { x0: u384 { limb0: 0xf3611b78c952aacab827a053, limb1: 0xe1ea1e1e4d00dbae81f14b0b, limb2: 0xcc7ed5863bc0b995b8825e0e, limb3: 0x1638533957d540a9d2370f17, }, x1: u384 { limb0: 0xb57ec72a6178288c47c33577, limb1: 0x728114d1031e1572c6c886f6, limb2: 0x730a124fd70662a904ba1074, limb3: 0xa4edef9c1ed7f729f520e47, }, y0: u384 { limb0: 0x764bf3bd999d95d71e4c9899, limb1: 0xbfe6bd221e47aa8ae88dece9, limb2: 0x2b5256789a66da69bf91009c, limb3: 0x468fb440d82b0630aeb8dca, }, y1: u384 { limb0: 0xa59c8967acdefd8b6e36ccf3, limb1: 0x97003f7a13c308f5422e1aa0, limb2: 0x3f887136a43253d9c66c4116, limb3: 0xf6d4552fa65dd2638b36154, }, }; let r = ec_mul(g, s, curve_index).unwrap(); assert!(r == g2); let s: u256 = 3; let g3: G2Point = G2Point { x0: u384 { limb0: 0x866f09d516020ef82324afae, limb1: 0xa0c75df1c04d6d7a50a030fc, limb2: 0xdccb23ae691ae54329781315, limb3: 0x122915c824a0857e2ee414a3, }, x1: u384 { limb0: 0x937cc6d9d6a44aaa56ca66dc, limb1: 0x5062650f8d251c96eb480673, limb2: 0x7e0550ff2ac480905396eda5, limb3: 0x9380275bbc8e5dcea7dc4dd, }, y0: u384 { limb0: 0x8b52fdf2455e44813ecfd892, limb1: 0x326ac738fef5c721479dfd94, limb2: 0xbc1a6f0136961d1e3b20b1a7, limb3: 0xb21da7955969e61010c7a1a, }, y1: u384 { limb0: 0xb975b9edea56d53f23a0e849, limb1: 0x714150a166bfbd6bcf6b3b58, limb2: 0xa36cfe5f62a7e42e0bf1c1ed, limb3: 0x8f239ba329b3967fe48d718, }, }; let r = ec_mul(g, s, curve_index).unwrap(); assert!(r == g3); let s = 0xffffffffffffffffffffffffffffffff; let g4: G2Point = G2Point { x0: u384 { limb0: 0xae40a8b5aee95e54aedee2e7, limb1: 0x6e0699501c5035eed8fc5162, limb2: 0xbee76829b76806d1b6617bf8, limb3: 0x5026c3305c1267922077393, }, x1: u384 { limb0: 0x10c08c4b0a70e02491c3c435, limb1: 0x591ef738050b3ce067e2016f, limb2: 0xdd6e0a179e2ce3c1399c5273, limb3: 0xd5c9af9b97e94f90cb4aba3, }, y0: u384 { limb0: 0x93be53660cebb92c90d4fa87, limb1: 0xfbf63ca94e1d0ffd65801863, limb2: 0xd24fd9a06d72f1dc57f15f0a, limb3: 0x100dbfd4f271378e85171313, }, y1: u384 { limb0: 0xb7296e587409163eecd3ef5d, limb1: 0x8a065d6871fa185d15703e78, limb2: 0x8a85fb95bb90eb5c7a0d81a9, limb3: 0x157cf362e91a3c96640bd973, }, }; let r = ec_mul(g, s, curve_index).unwrap(); assert!(r == g4); // let s = 0x100000000000000000000000000000001; let g5: G2Point = G2Point { x0: u384 { limb0: 0x2131be4b061714de5a11407d, limb1: 0xd41318f9bcade1fee985310b, limb2: 0xb2669e638a7b78b7ba5c6751, limb3: 0xa5284fb2911d4e2f445e714, }, x1: u384 { limb0: 0x712edcaf95ed642a8237e6fd, limb1: 0xed6fccd7b64896ebb6ffb3d9, limb2: 0xfcb88d23294a46657b8d2482, limb3: 0x143ef485b660d37036fc18e2, }, y0: u384 { limb0: 0xaa5b7ff57bdbf47e6ab49121, limb1: 0xc14cded56b4a44e022320616, limb2: 0xdd5105feb3fdc5b10edb5afa, limb3: 0x175d2c78538490ce02fcead8, }, y1: u384 { limb0: 0x23893f1bb0fdb0533584b05f, limb1: 0x420d425d79dcd48b26d87814, limb2: 0xc932fa90468e6b9dfd658cc9, limb3: 0xe5fac70e9096e97adc6dd89, }, }; let r = ec_mul(g, s, curve_index).unwrap(); assert!(r == g5); } } ================================================ FILE: src/src/ec/generate_selector_code.py ================================================ # generate_selector_code.py import os # Import os module for path manipulation import subprocess # Import subprocess to run scarb fmt import sys import textwrap # Header content including necessary imports, constants, and impls CAIRO_HEADER = """\ use core::internal::bounded_int; use core::internal::bounded_int::{AddHelper, BoundedInt, DivRemHelper, MulHelper, UnitInt, upcast}; const TWO: felt252 = 2; const TWO_UI: UnitInt = 2; const FOUR_UI: UnitInt = 4; const EIGHT_UI: UnitInt = 8; const TWO_NZ_TYPED: NonZero> = 2; const FOUR_NZ_TYPED: NonZero> = 4; const POW128_DIV_2: felt252 = 0x7fffffffffffffffffffffffffffffff; // ((2^128-1) // 2) const POW128_DIV_4: felt252 = 0x3fffffffffffffffffffffffffffffff; // ((2^128-1) // 4) const POW128: felt252 = 0x100000000000000000000000000000000; const FOUR: felt252 = 4; const EIGHT: felt252 = 8; pub type u15_bi = BoundedInt<0, { 15 }>; pub type u12_bi = BoundedInt<0, { 12 }>; pub type u1_bi = BoundedInt<0, { 1 }>; pub type u2_bi = BoundedInt<0, { 2 }>; pub type u3_bi = BoundedInt<0, { 3 }>; pub type u4_bi = BoundedInt<0, { 4 }>; pub type u5_bi = BoundedInt<0, { 5 }>; pub type u6_bi = BoundedInt<0, { 6 }>; pub type u7_bi = BoundedInt<0, { 7 }>; pub type u8_bi = BoundedInt<0, { 8 }>; impl DivRemU128By2 of DivRemHelper, UnitInt> { type DivT = BoundedInt<0, { POW128_DIV_2 }>; type RemT = u1_bi; } impl DivRemU128By4 of DivRemHelper, UnitInt> { type DivT = BoundedInt<0, { POW128_DIV_4 }>; type RemT = u3_bi; } impl MulHelperBitBy2Impl of MulHelper> { type Result = u2_bi; } impl MulHelperBitBy4Impl of MulHelper> { type Result = u4_bi; } impl MulHelperBit3By4Impl of MulHelper> { type Result = u12_bi; } impl MulHelperBitBy8Impl of MulHelper> { type Result = u8_bi; } impl AddHelperU1ByU2Impl of AddHelper { type Result = u3_bi; } impl AddHelperU3ByU4Impl of AddHelper { type Result = u7_bi; } impl AddHelperU7ByU8Impl of AddHelper { type Result = u15_bi; } impl AddHelperU3ByU12Impl of AddHelper { type Result = u15_bi; } """ # Removed extra newline for cleaner concatenation # Define the new helper function as a string first CAIRO_HELPER_FUNCTION = """\ #[inline(always)] fn _extract_and_calculate_selector_bit_inlined( mut u1: BoundedInt<0, { POW128 - 1 }>, mut u2: BoundedInt<0, { POW128 - 1 }>, mut v1: BoundedInt<0, { POW128 - 1 }>, mut v2: BoundedInt<0, { POW128 - 1 }>, ) -> (BoundedInt<0, { POW128 - 1 }>, BoundedInt<0, { POW128 - 1 }>, BoundedInt<0, { POW128 - 1 }>, BoundedInt<0, { POW128 - 1 }>, u15_bi) { let (qu1, u1b) = bounded_int::div_rem(u1, TWO_NZ_TYPED); let (qu2, u2b) = bounded_int::div_rem(u2, TWO_NZ_TYPED); let (qv1, v1b) = bounded_int::div_rem(v1, TWO_NZ_TYPED); let (qv2, v2b) = bounded_int::div_rem(v2, TWO_NZ_TYPED); u1 = upcast(qu1); u2 = upcast(qu2); v1 = upcast(qv1); v2 = upcast(qv2); let selector: u15_bi = bounded_int::add(bounded_int::add(bounded_int::add(u1b, bounded_int::mul(u2b, TWO_UI)),bounded_int::mul(v1b, FOUR_UI)),bounded_int::mul(v2b, EIGHT_UI)); return (u1, u2, v1, v2, selector); } #[inline(always)] fn _extract_and_calculate_selector_bit_inlined_fake_glv( mut s1: BoundedInt<0, { POW128 - 1 }>, mut s2: BoundedInt<0, { POW128 - 1 }>, ) -> ( BoundedInt<0, { POW128 - 1 }>, BoundedInt<0, { POW128 - 1 }>, u15_bi, ) { let (qs1, s1b) = bounded_int::div_rem(s1, FOUR_NZ_TYPED); let (qs2, s2b) = bounded_int::div_rem(s2, FOUR_NZ_TYPED); s1 = upcast(qs1); s2 = upcast(qs2); let selector: u15_bi = bounded_int::add( s1b, bounded_int::mul(s2b, FOUR_UI), ); return (s1, s2, selector); } """ def generate_build_selectors_inlined(n_bits: int) -> str: """ Generates a complete Cairo module string containing the build_selectors_inlined function, which calls an inlined helper for its main loop. Args: n_bits: The number of bits, determining the loop count. Returns: A string containing the complete generated Cairo module code. Raises: ValueError: If n_bits is not positive. """ if n_bits <= 0: raise ValueError("n_bits must be positive") code = [ "#[inline(always)]", "pub fn build_selectors_inlined(_u1: u128, _u2: u128, _v1: u128, _v2: u128) -> (Span, u128, u128, u128, u128) {", " // Generated code for n_bits = {}".format(n_bits), " let mut selectors: Array = array![];", "", " let mut u1: BoundedInt<0, { POW128 - 1 }> = upcast(_u1);", " let mut u2: BoundedInt<0, { POW128 - 1 }> = upcast(_u2);", " let mut v1: BoundedInt<0, { POW128 - 1 }> = upcast(_v1);", " let mut v2: BoundedInt<0, { POW128 - 1 }> = upcast(_v2);", "", " // Initial division and remainder to get LSBs", " let (qu1, u1lsb) = bounded_int::div_rem(u1, TWO_NZ_TYPED);", " let (qu2, u2lsb) = bounded_int::div_rem(u2, TWO_NZ_TYPED);", " let (qv1, v1lsb) = bounded_int::div_rem(v1, TWO_NZ_TYPED);", " let (qv2, v2lsb) = bounded_int::div_rem(v2, TWO_NZ_TYPED);", " u1 = upcast(qu1);", " u2 = upcast(qu2);", " v1 = upcast(qv1);", " v2 = upcast(qv2);", "", f" // Inlined loop ({n_bits - 1} iterations)", ] for i in range(n_bits - 2): code.extend( [ f" let (u1, u2, v1, v2, selector_{i}) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2);", f" selectors.append(upcast(selector_{i}));", ] ) code.extend( [ f" let (_, _, _, _, selector_{n_bits - 2}) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2);", f" selectors.append(upcast(selector_{n_bits - 2}));", ] ) code.append( " return (selectors.span(), upcast(u1lsb), upcast(u2lsb), upcast(v1lsb), upcast(v2lsb));" ) code.append("}") function_body_str = "\n".join(code[1:]) indented_body = textwrap.indent(function_body_str, " ") generated_function_code = code[0] + "\n" + indented_body # Combine header, helper function, and main generated function return CAIRO_HEADER + "\n" + CAIRO_HELPER_FUNCTION + "\n" + generated_function_code def generate_build_selectors_inlined_fake_glv(n_bits: int = 128) -> str: """ Generates a complete Cairo module string containing the build_selectors_inlined function, which calls an inlined helper for its main loop. Args: n_bits: The number of bits, determining the loop count. Returns: A string containing the complete generated Cairo module code. Raises: ValueError: If n_bits is not positive. """ if n_bits <= 0: raise ValueError("n_bits must be positive") code = [ "#[inline(always)]", "pub fn build_selectors_inlined_fake_glv(_s1: u128, _s2: u128) -> (Span, u128, u128) {", " // Generated code for n_bits = {}".format(n_bits), " let mut selectors: Array = array![];", "", " let mut s1: BoundedInt<0, { POW128 - 1 }> = upcast(_s1);", " let mut s2: BoundedInt<0, { POW128 - 1 }> = upcast(_s2);", "", " // Initial division and remainder to get LSBs", " let (qs1, s1lsb) = bounded_int::div_rem(s1, TWO_NZ_TYPED);", " let (qs2, s2lsb) = bounded_int::div_rem(s2, TWO_NZ_TYPED);", " s1 = upcast(qs1);", " s2 = upcast(qs2);", "", f" // Inlined loop (63 2-bit iterations for 128 bits)", ] for i in range(63): code.extend( [ f" let (s1, s2, selector_{i}) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2);", f" selectors.append(upcast(selector_{i}));", ] ) if i == 0: code.extend( [ " // Correction for the last bits 2-1.", " selectors.append(16);", ] ) code.extend( [ "// At this point s1, and s2 are the MSB (last bit).", " if s1 != 0 {", " if s2 != 0 {", " // 11 T2 index : 10", " selectors.append(10);", " } else {", " // 10 T12 index : 6", " selectors.append(6);", " }", " } else {", " if s2 != 0 {", " // 01 T15 index : 9", " selectors.append(9);", " } else {", " // 00 T5 index : 5", " selectors.append(5);", " }", " }", " return (selectors.span(), upcast(s1lsb), upcast(s2lsb));", ] ) code.append("}") function_body_str = "\n".join(code[1:]) indented_body = textwrap.indent(function_body_str, " ") generated_function_code = code[0] + "\n" + indented_body # Combine header, helper function, and main generated function return generated_function_code def generate_double_and_add_n(n_points: int) -> str: """ Generates Cairo code for a double_and_add function variant that processes n_points additions. Assumes necessary imports (G1Point, CircuitElement, CircuitInput, CircuitModulus, circuit_add, circuit_sub, circuit_mul, circuit_inverse, etc.) are in scope. Args: n_points: The number of Q points to add (e.g., 1, 2, 4, 8). Returns: A string containing the generated Cairo function code. """ if n_points not in [1, 2, 4, 8]: # Or check if it's a power of 2 raise ValueError( "n_points must be 1, 2, 4, or 8 for this specific generator pattern" ) func_name = f"double_and_add_{n_points}" if n_points == 1: func_name = "double_and_add" # Match original naming for n=1 # Function signature q_params = [f"q{i}: G1Point" for i in range(n_points)] signature = f"pub fn {func_name}(p: G1Point, {', '.join(q_params)}, modulus: CircuitModulus) -> G1Point {{" lines = ["#[inline(always)]", signature] # CircuitElement inputs lines.append(f" let px = CircuitElement::> {{}}; ") lines.append(f" let py = CircuitElement::> {{}}; ") for i in range(n_points): lines.append( f" let q{i}x = CircuitElement::> {{}}; " ) lines.append( f" let q{i}y = CircuitElement::> {{}}; " ) lines.append("") current_px = "px" current_py = "py" next_tx = "" next_ty = "" # Doubling and Adding loop for i in range(n_points): lines.append(f" // --- Step {i+1}: (2 * CurrentP) + Q{i} --- ") qix = f"q{i}x" qiy = f"q{i}y" # Compute λ1 = (qiy - current_py) / (qix - current_px) lines.append(f" let num_lambda1_{i} = circuit_sub({qiy}, {current_py});") lines.append(f" let den_lambda1_{i} = circuit_sub({qix}, {current_px});") lines.append( f" let lambda1_{i} = circuit_mul(num_lambda1_{i}, circuit_inverse(den_lambda1_{i}));" ) lines.append("") # Compute x2 = λ1² - current_px - qix lines.append(f" let lambda1_sq_{i} = circuit_mul(lambda1_{i}, lambda1_{i});") lines.append(f" let x2_{i} = circuit_sub(lambda1_sq_{i}, {current_px});") lines.append(f" let x2_{i} = circuit_sub(x2_{i}, {qix});") lines.append("") # Compute -λ2 = λ1 + 2 * current_py / (x2 - current_px) lines.append(f" let den_lambda2_{i} = circuit_sub(x2_{i}, {current_px});") lines.append( f" let num_lambda2_{i} = circuit_add({current_py}, {current_py});" ) lines.append( f" let term2_lambda2_{i} = circuit_mul(num_lambda2_{i}, circuit_inverse(den_lambda2_{i}));" ) lines.append( f" let lambda2_{i} = circuit_add(lambda1_{i}, term2_lambda2_{i});" ) lines.append("") # Compute intermediate Tx = (-λ2)² - current_px - x2 lines.append(f" let lambda2_sq_{i} = circuit_mul(lambda2_{i}, lambda2_{i});") lines.append( f" let tx_temp_{i} = circuit_sub(lambda2_sq_{i}, {current_px});" ) next_tx = f"T{i+1}x" lines.append(f" let {next_tx} = circuit_sub(tx_temp_{i}, x2_{i});") lines.append("") # Compute intermediate Ty = -λ2 * (Tx - current_px) - current_py lines.append(f" let tx_sub_px_{i} = circuit_sub({next_tx}, {current_px});") lines.append(f" let term1_ty_{i} = circuit_mul(lambda2_{i}, tx_sub_px_{i});") next_ty = f"T{i+1}y" lines.append( f" let {next_ty} = circuit_sub(term1_ty_{i}, {current_py});" ) # Note: lambda2 corresponds to -lambda2 in standard formulas lines.append("") # Update current P for the next iteration current_px = next_tx current_py = next_ty # Final outputs and evaluation final_x = current_px final_y = current_py lines.append(f" let outputs = ({final_x}, {final_y})") lines.append(f" .new_inputs()") lines.append(f" .next_2(p.x)") lines.append(f" .next_2(p.y)") for i in range(n_points): lines.append(f" .next_2(q{i}.x)") lines.append(f" .next_2(q{i}.y)") lines.append(f" .done_2()") lines.append(f" .eval(modulus)") lines.append(f" .expect('{func_name} failed');") lines.append("") lines.append( f" return G1Point {{ x: outputs.get_output({final_x}), y: outputs.get_output({final_y}) }};" ) lines.append("}") # Join lines with proper indentation # Indent lines starting from the third line (index 2) indented_body = textwrap.indent("\n".join(lines[2:]), " ") return "\n".join(lines[:2]) + "\n" + indented_body if __name__ == "__main__": # Example usage: Generate selectors.cairo with n_bits=71 (default/example) # To generate double_and_add_8, you might run this script differently # or integrate argument parsing. For now, demonstrating selector generation. # --- Selector Generation --- try: n_bits_arg = 73 # Default or example value if len(sys.argv) > 1: try: n_bits_arg = int(sys.argv[1]) except ValueError: print( "Warning: Invalid integer for n_bits, using default {}. Usage: python ... ".format( n_bits_arg ) ) if n_bits_arg < 1: raise ValueError("n_bits must be at least 1") # Generate the complete Cairo code for selectors generated_cairo_code_selectors = generate_build_selectors_inlined(n_bits_arg) generated_cairo_code_selectors_fake_glv = ( generate_build_selectors_inlined_fake_glv() ) # Define the output file path output_file_path_selectors = "src/src/ec/selectors.cairo" # Write the generated code to the file with open(output_file_path_selectors, "w") as f: f.write( generated_cairo_code_selectors + "\n\n" + generated_cairo_code_selectors_fake_glv ) print( f"Successfully generated Cairo code to {output_file_path_selectors} for n_bits = {n_bits_arg}" ) # Format the generated file using scarb fmt try: print( f"Attempting to format {output_file_path_selectors} using scarb fmt..." ) process = subprocess.run( ["scarb", "fmt", output_file_path_selectors], check=True, capture_output=True, text=True, ) print("Formatting successful.") except FileNotFoundError: print( "Error: 'scarb' command not found. Please ensure Scarb is installed and in your PATH." ) except subprocess.CalledProcessError as e: print(f"Error during formatting: {e}") print(f"scarb fmt stdout:\n{e.stdout}") print(f"scarb fmt stderr:\n{e.stderr}") except ValueError as e: print(f"Error generating selectors: {e}") # Decide if we should exit here or continue to double_and_add generation except Exception as e: print(f"An unexpected error occurred during selector generation: {e}") print("\n" + "-" * 20 + "\n") # --- Double and Add 8 Generation (Example) --- try: n_points_to_gen = 8 print(f"Generating Cairo code for double_and_add_{n_points_to_gen}...") generated_double_add_code = generate_double_and_add_n(n_points_to_gen) # Print the generated code to console (or write to a file) print(f"\n// --- Generated code for double_and_add_{n_points_to_gen} ---") print("// Add this function to your ec_ops.cairo or similar file.") print( "// Ensure necessary imports and structs (G1Point, CircuitElement, etc.) are available." ) print(generated_double_add_code) # Example: Write to a separate file # output_file_path_double_add = f"src/src/ec/double_and_add_{n_points_to_gen}_generated.cairo" # with open(output_file_path_double_add, 'w') as f: # f.write("// NOTE: This file needs imports like G1Point, circuit ops etc.\n") # f.write(generated_double_add_code) # print(f"\nCode also written to {output_file_path_double_add}") # # Optionally format this file too # try: # subprocess.run(["scarb", "fmt", output_file_path_double_add], check=True) # except Exception as fmt_e: # print(f"Could not format {output_file_path_double_add}: {fmt_e}") except ValueError as e: print(f"Error generating double_and_add: {e}") except Exception as e: print(f"An unexpected error occurred during double_and_add generation: {e}") sys.exit(1) ================================================ FILE: src/src/ec/pairing/groth16.cairo ================================================ /// This file contains utilities to verify a pairing check of the form : /// e(P1, Qf1) * e(P2, Qf2) * e(P3, Q3) * e(Pf4, Qf4) == 1, where /// - Qf1 and Qf2 are fixed known G2 points. /// - Pf4 and Qf4 is a fixed pair of G1 and G2 points. /// The result of e(Pf4, Qf4) is precomputed and provided to the circuit as a the miller loop result /// precomputed_miller_loop_result = MillerLoop(Pf4, Qf4) ∈ Gt/Fp12. /// /// MultiPairing chekcs circuit in the "3P_2F" mode is used for triple pairs and double fixed G2 /// points /// /// Qf1 and Qf2 are represented by their pre-computed line functions for the specifc miller loop /// implementation. /// /// Two functions are provided for BN254 and BLS12-381 respectively. /// To generate the lines functions and the precomputed miller loop result, refer to garaga's /// documentation. /// /// Moreover, the file contains the full groth16 verification function for BN254 and BLS12-381. use core::circuit::u384; use core::num::traits::{One, Zero}; use core::option::Option; use garaga::basic_field_ops; use garaga::basic_field_ops::neg_mod_p; use garaga::circuits::multi_pairing_check as mpc; use garaga::circuits::multi_pairing_check::{ run_BLS12_381_INITIALIZE_MPCHECK_EXT_MLR_circuit, run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3P_circuit, run_BN254_INITIALIZE_MPCHECK_EXT_MLR_circuit, run_BN254_MP_CHECK_PREPARE_PAIRS_1P_circuit, }; use garaga::definitions::{ BLS12_381_SEED_BITS_COMPRESSED, BN254_SEED_BITS_JY00_COMPRESSED, E12D, G1G2Pair, G1Point, G2Line, G2Point, get_BN254_modulus, get_modulus, u288, }; use garaga::ec_ops::{G1PointTrait, ec_safe_add, msm_g1}; use garaga::ec_ops_g2::G2PointTrait; use garaga::pairing_check::{ BLSProcessedPair, BNProcessedPair, MPCheckHintBLS12_381, MPCheckHintBN254, compute_yInvXnegOverY, }; use garaga::utils::hashing; use garaga::utils::hashing::{PoseidonState, TWO_POW_96}; #[derive(Copy, Drop, Serde, Debug, PartialEq)] pub struct Groth16ProofRaw { pub a: G1Point, pub b: G2Point, pub c: G1Point, } // Groth16 proof structure, generic for both BN254 and BLS12-381. #[derive(Copy, Drop, Serde, Debug, PartialEq)] pub struct Groth16Proof { pub raw: Groth16ProofRaw, pub public_inputs: Span, } // Groth16 verifying key structure, consisting of the two fixed G2 points and the precomputed // miller loop result miller_loop(alpha, beta) // Does not include gamma and delta lines inside, although it should be part of the key. // Does not include IC either as its size is not fixed and we want to write it as constant in smart // contracts. #[derive(Drop)] pub struct Groth16VerifyingKey { pub alpha_beta_miller_loop_result: E12D, pub gamma_g2: G2Point, pub delta_g2: G2Point, } #[generate_trait] pub impl Groth16RawProofImpl of Groth16ProofRawTrait { fn check_proof_points(self: @Groth16ProofRaw, curve_id: u32) { self.a.assert_in_subgroup_excluding_infinity(curve_id); self.b.assert_in_subgroup_excluding_infinity(curve_id); self.c.assert_in_subgroup_excluding_infinity(curve_id); } } #[inline] fn _groth16_get_vk_x( proof: Groth16Proof, ic: Span, public_inputs_msm_hint: Span, curve_id: u32, ) -> G1Point { let vk_x_x: G1Point = msm_g1( ic.slice(1, ic.len() - 1), proof.public_inputs, curve_id, public_inputs_msm_hint, ); let vk_x = ec_safe_add(vk_x_x, *ic.at(0), curve_id); return vk_x; } // Verify a groth16 proof for BN254. // Parameters: // - proof: the proof to verify // - verification_key: the verifying key // - lines: the lines of the gamma and delta points. Must correspond to the ones of gamma and // delta. // - ic: the points in the VK corresponding to the public inputs. The length must correspond to the // number of public inputs in the proof. // - public_inputs_msm_hint: the MSM hint of the public inputs // - mpcheck_hint: the MPCheck hint of the proof pub fn verify_groth16_bn254( verification_key: Groth16VerifyingKey, mut lines: Span>, ic: Span, proof: Groth16Proof, public_inputs_msm_hint: Span, mpcheck_hint: MPCheckHintBN254, ) -> Result, felt252> { proof.raw.check_proof_points(0); let vk_x = _groth16_get_vk_x(proof, ic, public_inputs_msm_hint, 0); let check = multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result( G1G2Pair { p: vk_x, q: verification_key.gamma_g2 }, G1G2Pair { p: proof.raw.c, q: verification_key.delta_g2 }, G1G2Pair { p: proof.raw.a.negate(0), q: proof.raw.b }, verification_key.alpha_beta_miller_loop_result, lines, mpcheck_hint, ); match check { Result::Ok(_) => Result::Ok(proof.public_inputs), Result::Err(error) => Result::Err(error), } } // Verify a groth16 proof for BN254. // Parameters: // - proof: the proof to verify // - verification_key: the verifying key // - lines: the lines of the gamma and delta points. Must correspond to the ones of gamma and // delta. // - ic: the points in the VK corresponding to the public inputs. The length must correspond to the // number of public inputs in the proof. // - public_inputs_msm_hint: the MSM hint of the public inputs // - mpcheck_hint: the MPCheck hint of the proof pub fn verify_groth16_bls12_381( proof: Groth16Proof, verification_key: Groth16VerifyingKey, mut lines: Span>, ic: Span, public_inputs_msm_hint: Span, mpcheck_hint: MPCheckHintBLS12_381, ) -> Result, felt252> { proof.raw.check_proof_points(1); let vk_x = _groth16_get_vk_x(proof, ic, public_inputs_msm_hint, 1); let check = multi_pairing_check_bls12_381_3P_2F_with_extra_miller_loop_result( G1G2Pair { p: vk_x, q: verification_key.gamma_g2 }, G1G2Pair { p: proof.raw.c, q: verification_key.delta_g2 }, G1G2Pair { p: proof.raw.a.negate(1), q: proof.raw.b }, verification_key.alpha_beta_miller_loop_result, lines, mpcheck_hint, ); match check { Result::Ok(_) => Result::Ok(proof.public_inputs), Result::Err(error) => Result::Err(error), } } // This function verifies that // miller(P0, Q0) * miller(P1, Q1) * miller(P2, Q2) * precomputed_miller_loop_result * // hint.MillerLoopResultScalingFactor == hint.lambda_root ^ λ (1) // <=> e(P0, Q0) * e(P1, Q1) * e(P2, Q2) * final_exp(precomputed_miller_loop_result) == 1 (2) // It is based on the paper "On Proving Pairings" by Andrija Novakovic and Liam Eagen: // https://eprint.iacr.org/2024/640 to eliminate the cost of the final exponentiation. // Where : // - Q1 and Q2 are known G2 points, represented by their precomputed lines functions. // - λ = 6x + 2 + q - q^2 + q^3 with x the seed of the bn curve, and q the prime modulus of // the base field. // - MillerLoopResultScalingFactor is a factor lying in the Fq6 subfield such that it makes // miller(P0, Q0) * miller(P1, Q1) * miller(P2, Q2) * precomputed_miller_loop_result a lambda // residue. // To compute efficiently lambda_root^λ in (1) and take advantage of the squarings in the miller // function that is iterating over the bits of x, we initialize the miller loop result to // (1/hint.lambda_root), obtaining as an intermediate result in M = (f/hint.lambda_root^x), // where f = miller(P0, Q0) * miller(P1, Q1) * miller(P2, Q2) * precomputed_miller_loop_result. // // Finally, we verify that M * hint.MillerLoopResultScalingFactor * (1/hint.lambda_root)^q == 1, // using the Frobenius endomorphism for cheap exponentiation by q. // On top of this, all extension fields multiplications are verified and batched using // randomized extension field arithmetic. // For each bit of the miller loop (0, 1, -1, or 00), we compute the next miller loop intermediate, // depending on the bit case: // // - 0: f₍ᵢ₊₁₎ = fᵢ² * Πⱼ (Lᵢⱼ), // - (+1): f₍ᵢ₊₁₎ = fᵢ² * Πⱼ (Lᵢⱼ) * (1/lambda_root) // - (-1): f₍ᵢ₊₁₎ = fᵢ² * Πⱼ (Lᵢⱼ) * (lambda_root) // - 00: f₍ᵢ₊₂₎ = (fᵢ² * Πⱼ (Lᵢⱼ) )² * Πⱼ (L₍ᵢ₊₁₎ⱼ) // // where Lᵢⱼ is the j-th line of the i-th bit of the miller loop, evaluated at point Pⱼ. // Since we have 3 pairs, for bit "0", we have 3 lines, and for bit "1", we have 6 lines. // Instead of performing full extension field multiplications, we ask the caller to provide as hint // all the fᵢ as Fq12 elements inside hint.Ris. // We then hash (s₀, c₀, _) = Poseidon(Pair₀, Pair₁, Pair₂, // hint.MillerLoopResultScalingFactor, hint.Ris) // And we use the definition cᵢ₊₁ = cᵢ² to derive a random coefficient for all relations. // We also ask the prover to provide a quotient polynomial big_Q such that // Σᵢ cᵢ * (fᵢ₋₁)² * Πⱼ (Lᵢⱼ) = big_Q * P_irr + Σᵢ cᵢ * fᵢ , where P_irr // is the irreducible polynomial of the extension field. // From this, we derive a random point z = Poseidon(s0, hint.big_Q) // And finally verify that // Σᵢ cᵢ * (fᵢ₋₁(z))² * Πⱼ (Lᵢⱼ(z)) = big_Q(z) * P_irr(z) + Σᵢ cᵢ * fᵢ(z), // reusing fᵢ(z) evaluations in the next step. #[inline] pub fn multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result( pair0: G1G2Pair, pair1: G1G2Pair, pair2: G1G2Pair, precomputed_miller_loop_result: E12D, mut lines: Span>, mpcheck_hint: MPCheckHintBN254, ) -> Result { if mpcheck_hint.big_Q.len() != 190 { return Result::Err('WRONG_BIG_Q_LEN'); } if mpcheck_hint.Ris.len() != 34 { return Result::Err('WRONG_RIS_LEN'); } let modulus = get_BN254_modulus(); // BN254 prime field modulus let (yInv_0, xNegOverY_0) = compute_yInvXnegOverY(pair0.p.x, pair0.p.y, modulus); let (yInv_1, xNegOverY_1) = compute_yInvXnegOverY(pair1.p.x, pair1.p.y, modulus); let (processed_pair2): (BNProcessedPair,) = run_BN254_MP_CHECK_PREPARE_PAIRS_1P_circuit( pair2.p, pair2.q.y0, pair2.q.y1, ); // Init sponge state == hades_permutation(0, 0, int.from_bytes(b"MPCHECK_BN254_3P_2F", "big")) let hash_state = PoseidonState { s0: 0x63dd5cf2946ee642aef494d22ee96f6e9168664a2f9c485a6084bd03289b83f, s1: 0x22380e74267f899ea972f4f0fc327a181ed44093d778c9ad778437c7a41e418, s2: 0x3c3e169429d0a04b80b97617d27b5b37b8e7734bf57faaffc841b8f2cfb6bc7, }; // Hash Inputs let hash_state = hashing::hash_G1G2Pair(pair0, hash_state); let hash_state = hashing::hash_G1G2Pair(pair1, hash_state); let hash_state = hashing::hash_G1G2Pair(pair2, hash_state); let hash_state = hashing::hash_E12D_u288(mpcheck_hint.lambda_root, hash_state); let hash_state = hashing::hash_E12D_u288(mpcheck_hint.lambda_root_inverse, hash_state); let hash_state = hashing::hash_MillerLoopResultScalingFactor_u288(mpcheck_hint.w, hash_state); // Hash Ris to obtain base random coefficient c1 let z: u384 = mpcheck_hint.z.into(); let (hash_state, mut evals) = basic_field_ops::eval_and_hash_E12D_u288_transcript( mpcheck_hint.Ris, hash_state, z, ); let hash_state = hashing::hash_E12D_one_u288(hash_state); let hash_state = hashing::hash_E12D_u288(precomputed_miller_loop_result, hash_state); let mut evals = evals.span(); let c_1: u384 = hash_state.s1.into(); // hades_permutation(0,0,int.from_bytes(b"MPCHECK_BN254_3P_2F_II", "big")) let part_II_state = PoseidonState { s0: 0xe973a7c87240c35289f5fdac2ea94f1848022f9499f37b4ab94172b6742649, s1: 0x30d584d4a24b6615090c37103916bac45ed17401b63596cd0c29167e5fe1267, s2: 0x2073c3846b613a00ccc615a8ac460c372105a979ddde4ef9d484c15aca2b874, }; let hash_state = hashing::hash_u384(c_1, TWO_POW_96, part_II_state); // Hash Q = (Σ_i c_i*Q_i) to obtain random evaluation point z let z_felt252 = hashing::hash_u288_transcript(mpcheck_hint.big_Q.span(), hash_state).s0; if z_felt252 != mpcheck_hint.z { return Result::Err('WRONG_Z'); } let ( c_of_z, w_of_z, c_inv_of_z, LHS, c_inv_frob_1_of_z, c_frob_2_of_z, c_inv_frob_3_of_z, mlr_of_z, ): (u384, u384, u384, u384, u384, u384, u384, u384) = run_BN254_INITIALIZE_MPCHECK_EXT_MLR_circuit( mpcheck_hint.lambda_root, z, mpcheck_hint.w, mpcheck_hint.lambda_root_inverse, precomputed_miller_loop_result, ); // init bit for bn254 is 0: // let mut Ris = mpcheck_hint.Ris; let R_0_of_Z = *evals.pop_front().unwrap(); let [l0, l1] = (*lines.multi_pop_front::<2>().unwrap()).unbox(); let (_Q2, _lhs) = mpc::run_BN254_MP_CHECK_INIT_BIT_3P_2F_circuit( yInv_0, xNegOverY_0, l0, yInv_1, xNegOverY_1, l1, processed_pair2.yInv, processed_pair2.xNegOverY, pair2.q, R_0_of_Z, z, c_inv_of_z, c_1, LHS, ); let mut Q2 = _Q2; let mut LHS = _lhs; let mut f_i_of_z = R_0_of_Z; // rest of miller loop let mut bits = BN254_SEED_BITS_JY00_COMPRESSED.span(); while let Option::Some(bit) = bits.pop_front() { let R_i_of_z = *evals.pop_front().unwrap(); let (_Q2, _LHS): (G2Point, u384) = match *bit { 0 => { let [l0, l1, l2, l3] = (*lines.multi_pop_front::<4>().unwrap()).unbox(); mpc::run_BN254_MP_CHECK_BIT00_3P_2F_circuit( yInv_0, xNegOverY_0, l0, l1, yInv_1, xNegOverY_1, l2, l3, processed_pair2.yInv, processed_pair2.xNegOverY, Q2, LHS, f_i_of_z, R_i_of_z, z, c_1, ) }, 1 | 2 => { // 1 -> 10 // 2 -> -10 let [l0, l1, l2, l3, l4, l5] = (*lines.multi_pop_front::<6>().unwrap()).unbox(); let (Q_or_Q_neg, c_or_c_inv_of_z) = match (*bit - 1) { 0 => (pair2.q, c_inv_of_z), _ => ( G2Point { x0: pair2.q.x0, x1: pair2.q.x1, y0: processed_pair2.QyNeg0, y1: processed_pair2.QyNeg1, }, c_of_z, ), }; mpc::run_BN254_MP_CHECK_BIT10_3P_2F_circuit( yInv_0, xNegOverY_0, l0, l1, l2, yInv_1, xNegOverY_1, l3, l4, l5, processed_pair2.yInv, processed_pair2.xNegOverY, Q2, Q_or_Q_neg, LHS, f_i_of_z, R_i_of_z, c_or_c_inv_of_z, z, c_1, ) }, _ => { // 3 -> 01, 4 -> 0-1 let [l0, l1, l2, l3, l4, l5] = (*lines.multi_pop_front::<6>().unwrap()).unbox(); let (Q_or_Q_neg, c_or_c_inv_of_z) = match (*bit - 3) { 0 => (pair2.q, c_inv_of_z), _ => ( G2Point { x0: pair2.q.x0, x1: pair2.q.x1, y0: processed_pair2.QyNeg0, y1: processed_pair2.QyNeg1, }, c_of_z, ), }; mpc::run_BN254_MP_CHECK_BIT01_3P_2F_circuit( yInv_0, xNegOverY_0, l0, l1, l2, yInv_1, xNegOverY_1, l3, l4, l5, processed_pair2.yInv, processed_pair2.xNegOverY, Q2, Q_or_Q_neg, LHS, f_i_of_z, R_i_of_z, c_or_c_inv_of_z, z, c_1, ) }, }; Q2 = _Q2; LHS = _LHS; f_i_of_z = R_i_of_z; } let R_n_minus_2_of_z = *evals.pop_front().unwrap(); let R_n_minus_1_of_z: u384 = One::one(); let [l0, l1, l2, l3] = (*lines.multi_pop_front::<4>().unwrap()).unbox(); let (check) = mpc::run_BN254_MP_CHECK_FINALIZE_3P_2F_EXT_MLR_circuit( yInv_0, xNegOverY_0, l0, l1, yInv_1, xNegOverY_1, l2, l3, pair2.q, processed_pair2.yInv, processed_pair2.xNegOverY, Q2, R_n_minus_2_of_z, R_n_minus_1_of_z, c_1, w_of_z, z, c_inv_frob_1_of_z, c_frob_2_of_z, c_inv_frob_3_of_z, LHS, f_i_of_z, mpcheck_hint.big_Q, mlr_of_z, ); // Checks that LHS = Q(z) * P_irr(z) match check.is_zero() { true => Result::Ok(true), false => Result::Err('FINAL_CHECK_FAILED'), } } // This function verifies that // miller(P0, Q0) * miller(P1, Q1) * miller(P2, Q2) * precomputed_miller_loop_result * // hint.MillerLoopResultScalingFactor == hint.lambda_root ^ λ (1) // <=> e(P0, Q0) * e(P1, Q1) * e(P2, Q2) * final_exp(precomputed_miller_loop_result) == 1 (2) // It is based on the paper "On Proving Pairings" by Andrija Novakovic and Liam Eagen: // https://eprint.iacr.org/2024/640 to eliminate the cost of the final exponentiation. // Where : // - Q1 and Q2 are known G2 points, represented by their precomputed lines functions. // - λ = -x + q, with x the seed of the bls curve, and q the prime modulus of the base field. // - MillerLoopResultScalingFactor is a factor lying in the Fq6 subfield such that it makes // miller(P0, Q0) * miller(P1, Q1) * miller(P2, Q2) * precomputed_miller_loop_result a lambda // residue. // To compute efficiently lambda_root^λ in (1) and take advantage of the squarings in the miller // function that is iterating over the bits of x, we initialize the miller loop result to // (1/hint.lambda_root), obtaining as an intermediate result in M = (f/hint.lambda_root^x), // where f = miller(P0, Q0) * miller(P1, Q1) * miller(P2, Q2) * precomputed_miller_loop_result. // // Finally, we verify that M * hint.MillerLoopResultScalingFactor * (1/hint.lambda_root)^q == 1, // using the Frobenius endomorphism for cheap exponentiation by q. // On top of this, all extension fields multiplications are verified and batched using // randomized extension field arithmetic. // For each bit of the miller loop (0, 1, or 00), we compute the next miller loop intermediate, // depending on the bit case: // // - 0: f₍ᵢ₊₁₎ = fᵢ² * Πⱼ (Lᵢⱼ), // - 1: f₍ᵢ₊₁₎ = fᵢ² * Πⱼ (Lᵢⱼ) * (1/lambda_root) // - 00: f₍ᵢ₊₂₎ = (fᵢ² * Πⱼ (Lᵢⱼ) )² * Πⱼ (L₍ᵢ₊₁₎ⱼ) // // where Lᵢⱼ is the j-th line of the i-th bit of the miller loop. // Since we have 3 pairs, for bit "0", we have 3 lines, and for bit "1", we have 6 lines. // Instead of performing full extension field multiplications, we ask the caller to provide as hint // all the fᵢ as Fq12 elements inside hint.Ris. // We then hash (s₀, c₀, _) = Poseidon(Pair₀, Pair₁, Pair₂, // hint.MillerLoopResultScalingFactor, hint.Ris) // And we use the definition cᵢ₊₁ = cᵢ² to derive a random coefficient for all relations. // We also ask the prover to provide a quotient polynomial big_Q such that // Σᵢ cᵢ * (fᵢ₋₁)² * Πⱼ (Lᵢⱼ) = big_Q * P_irr + Σᵢ cᵢ * fᵢ , where P_irr // is the irreducible polynomial of the extension field. // From this, we derive a random point z = Poseidon(s0, hint.big_Q) // And finally verify that // Σᵢ cᵢ * (fᵢ₋₁(z))² * Πⱼ (Lᵢⱼ(z)) = big_Q(z) * P_irr(z) + Σᵢ cᵢ * fᵢ(z), // reusing fᵢ(z) evaluations in the next step. #[inline] pub fn multi_pairing_check_bls12_381_3P_2F_with_extra_miller_loop_result( pair0: G1G2Pair, pair1: G1G2Pair, pair2: G1G2Pair, precomputed_miller_loop_result: E12D, mut lines: Span>, hint: MPCheckHintBLS12_381, ) -> Result { if hint.big_Q.len() != 105 { return Result::Err('WRONG_BIG_Q_LEN'); } if hint.Ris.len() != 35 { return Result::Err('WRONG_RIS_LEN'); } let ( processed_pair0, processed_pair1, processed_pair2, ): (BLSProcessedPair, BLSProcessedPair, BLSProcessedPair) = run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3P_circuit( pair0.p, pair1.p, pair2.p, ); // Init sponge state : // >>> hades_permutation(0, 0, int.from_bytes(b"MPCHECK_BLS12_381_3P_2F", "big")) let hash_state = PoseidonState { s0: 0x2cdfabd228064e9e12d17c6b3c59bff3db6b737403a03e9b5f5e9f53409097b, s1: 0x37fe3519c1f442f6e45b0abd23d975f1937365ed27e08019d58d011269ecac2, s2: 0x2eec9f98b93d8f14927c5de60386404306a0e55acb61076c1ad847b456efe0e, }; // Hash Inputs. let hash_state = hashing::hash_G1G2Pair(pair0, hash_state); let hash_state = hashing::hash_G1G2Pair(pair1, hash_state); let hash_state = hashing::hash_G1G2Pair(pair2, hash_state); let hash_state = hashing::hash_E12D_u384(hint.lambda_root_inverse, hash_state); let hash_state = hashing::hash_MillerLoopResultScalingFactor_u384(hint.w, hash_state); // Hash Ris to obtain base random coefficient c0 let z: u384 = hint.z.into(); let (hash_state, mut evals) = basic_field_ops::eval_and_hash_E12D_u384_transcript( hint.Ris, hash_state, z, ); let hash_state = hashing::hash_E12D_one_u384(hash_state); let hash_state = hashing::hash_E12D_u384(precomputed_miller_loop_result, hash_state); let mut evals = evals.span(); let c_1: u384 = hash_state.s1.into(); // hades_permutation(0,0,int.from_bytes(b"MPCHECK_BLS12_381_3P_2F_II", "big")) let part_II_state = PoseidonState { s0: 0x145195a6df395d777bf1be74601510cbf888ca638394385ade2f0bd91396a34, s1: 0x1f144143bab9bbc63c8376ae067c0b15ae4611b1aa725dd654cd41c25e0c20f, s2: 0x25df9ac859e9e9db19383887d5c27d94b619b6c8d1de37b8e713cb653f7b55f, }; let hash_state = hashing::hash_u384(c_1, TWO_POW_96, part_II_state); // Hash Q = (Σ_i c_i*Q_i) to obtain random evaluation point z let z_felt252 = hashing::hash_u384_transcript(hint.big_Q.span(), hash_state).s0; if z_felt252 != hint.z { return Result::Err('WRONG_Z'); } // Precompute lambda root evaluated in Z: let (conjugate_c_inv_of_z, w_of_z, c_inv_of_z_frob_1, mlr_of_z): (u384, u384, u384, u384) = run_BLS12_381_INITIALIZE_MPCHECK_EXT_MLR_circuit( hint.lambda_root_inverse, z, hint.w, precomputed_miller_loop_result, ); // init bit for bls is 1: let R_0_of_Z = *evals.pop_front().unwrap(); let [l0, l1, l2, l3] = (*lines.multi_pop_front::<4>().unwrap()).unbox(); let (_Q2, _lhs) = mpc::run_BLS12_381_MP_CHECK_INIT_BIT_3P_2F_circuit( processed_pair0.yInv, processed_pair0.xNegOverY, l0, l1, processed_pair1.yInv, processed_pair1.xNegOverY, l2, l3, processed_pair2.yInv, processed_pair2.xNegOverY, pair2.q, R_0_of_Z, z, conjugate_c_inv_of_z, ); let mut Q2 = _Q2; let mut LHS = _lhs; let mut f_i_of_z = R_0_of_Z; // Σ_i (Π_k (c_i*P_k(z))) = (Σ_i c_i*Q_i(z)) * P(z) + Σ_i c_i * R_i(z) // <=> Σ_i (Π_k (c_i*P_k(z))) - Σ_i c_i * R_i(z) = (Σ_i c_i*Q_i(z)) * P(z) // => LHS = Σ_i (Π_k (c_i*P_k(z))) - Σ_i c_i * R_i(z) // rest of miller loop let mut bits = BLS12_381_SEED_BITS_COMPRESSED.span(); while let Option::Some(bit) = bits.pop_front() { let R_i_of_z = *evals.pop_front().unwrap(); let (_Q2, _LHS): (G2Point, u384) = match *bit { 0 => { let [l0, l1] = (*lines.multi_pop_front::<2>().unwrap()).unbox(); mpc::run_BLS12_381_MP_CHECK_BIT0_3P_2F_circuit( processed_pair0.yInv, processed_pair0.xNegOverY, l0, processed_pair1.yInv, processed_pair1.xNegOverY, l1, processed_pair2.yInv, processed_pair2.xNegOverY, Q2, LHS, f_i_of_z, R_i_of_z, z, c_1, ) }, 1 => { let [l0, l1, l2, l3] = (*lines.multi_pop_front::<4>().unwrap()).unbox(); mpc::run_BLS12_381_MP_CHECK_BIT1_3P_2F_circuit( processed_pair0.yInv, processed_pair0.xNegOverY, l0, l1, processed_pair1.yInv, processed_pair1.xNegOverY, l2, l3, processed_pair2.yInv, processed_pair2.xNegOverY, Q2, pair2.q, LHS, f_i_of_z, R_i_of_z, conjugate_c_inv_of_z, z, c_1, ) }, _ => { let [l0, l1, l2, l3] = (*lines.multi_pop_front::<4>().unwrap()).unbox(); mpc::run_BLS12_381_MP_CHECK_BIT00_3P_2F_circuit( processed_pair0.yInv, processed_pair0.xNegOverY, l0, l1, processed_pair1.yInv, processed_pair1.xNegOverY, l2, l3, processed_pair2.yInv, processed_pair2.xNegOverY, Q2, LHS, f_i_of_z, R_i_of_z, z, c_1, ) }, }; Q2 = _Q2; LHS = _LHS; f_i_of_z = R_i_of_z; } let R_last_of_z: u384 = One::one(); // Checks that LHS = Q(z) * P_irr(z) let (check) = mpc::run_BLS12_381_MP_CHECK_FINALIZE_3P_EXT_MLR_circuit( R_last_of_z, c_1, w_of_z, z, c_inv_of_z_frob_1, LHS, *hint.Ris.at(34), hint.big_Q, mlr_of_z, ); match check.is_zero() { true => Result::Ok(true), false => Result::Err('FINAL_CHECK_FAILED'), } } pub fn conjugate_e12D(self: E12D, curve_index: usize) -> E12D { let modulus = get_modulus(curve_index); E12D { w0: self.w0, w1: neg_mod_p(self.w1, modulus), w2: self.w2, w3: neg_mod_p(self.w3, modulus), w4: self.w4, w5: neg_mod_p(self.w5, modulus), w6: self.w6, w7: neg_mod_p(self.w7, modulus), w8: self.w8, w9: neg_mod_p(self.w9, modulus), w10: self.w10, w11: neg_mod_p(self.w11, modulus), } } ================================================ FILE: src/src/ec/pairing/pairing_check.cairo ================================================ use core::array::{ArrayTrait, SpanTrait}; use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitModulus, CircuitOutputsTrait, EvalCircuitTrait, circuit_inverse, circuit_mul, circuit_sub, u384, }; use core::num::traits::{One, Zero}; use core::option::Option; /// This file contains utilities to verify a pairing check of the form : /// e(P1, Qf1) * e(P2, Qf2) == 1, where Qf1 and Qf2 are fixed known points. (2P_2F circuits are used /// for double pairs and double fixed G2 points) /// Qf1 and Qf2 are represented by their pre-computed line functions for the specifc miller loop /// implementation. /// Two functions are provided for BN254 and BLS12-381 respectively. /// To generate the lines functions, you can use garaga's python backend. use core::option::OptionTrait; use garaga::basic_field_ops; use garaga::circuits::multi_pairing_check::{ run_BLS12_381_INITIALIZE_MPCHECK_circuit, run_BLS12_381_MP_CHECK_BIT00_2P_2F_circuit, run_BLS12_381_MP_CHECK_BIT0_2P_2F_circuit, run_BLS12_381_MP_CHECK_BIT1_2P_2F_circuit, run_BLS12_381_MP_CHECK_FINALIZE_2P_circuit, run_BLS12_381_MP_CHECK_INIT_BIT_2P_2F_circuit, run_BN254_INITIALIZE_MPCHECK_circuit, run_BN254_MP_CHECK_BIT00_2P_2F_circuit, run_BN254_MP_CHECK_BIT01_2P_2F_circuit, run_BN254_MP_CHECK_BIT10_2P_2F_circuit, run_BN254_MP_CHECK_FINALIZE_2P_2F_circuit, run_BN254_MP_CHECK_INIT_BIT_2P_2F_circuit, }; use garaga::definitions::{ BLS12_381_SEED_BITS_COMPRESSED, BN254_SEED_BITS_JY00_COMPRESSED, E12D, G1G2Pair, G2Line, get_BLS12_381_modulus, get_BN254_modulus, u288, }; use garaga::utils::hashing; use garaga::utils::hashing::{PoseidonState, TWO_POW_96}; use crate::core::circuit::AddInputResultTrait2; #[derive(Copy, Drop, Debug, PartialEq, Serde)] pub struct MillerLoopResultScalingFactor { pub w0: T, pub w2: T, pub w4: T, pub w6: T, pub w8: T, pub w10: T, } #[derive(Drop, Serde, Debug)] pub struct MPCheckHintBN254 { pub lambda_root: E12D, pub lambda_root_inverse: E12D, pub w: MillerLoopResultScalingFactor, pub Ris: Span>, pub big_Q: Array, pub z: felt252, } #[derive(Drop, Debug, PartialEq)] pub struct MPCheckHintBLS12_381 { pub lambda_root_inverse: E12D, pub w: MillerLoopResultScalingFactor, pub Ris: Span>, pub big_Q: Array, pub z: felt252, } // From a G1G2Pair(Px, Py, Qx0, Qx1, Qy0, Qy1), returns (1/Py, -Px/Py) #[derive(Drop, Debug, PartialEq)] pub struct BLSProcessedPair { pub yInv: u384, pub xNegOverY: u384, } // From a G1G2Pair(Px, Py, Qx0, Qx1, Qy0, Qy1), returns (1/Py, -Px/Py,-Qy0, -Qy1) #[derive(Drop, Debug, PartialEq)] pub struct BNProcessedPair { pub yInv: u384, pub xNegOverY: u384, pub QyNeg0: u384, pub QyNeg1: u384, } // From a point (x, y), returns (1/y, -x/y) pub fn compute_yInvXnegOverY(x: u384, y: u384, modulus: CircuitModulus) -> (u384, u384) { let in1 = CE::> {}; let in2 = CE::> {}; let in3 = CE::> {}; let yInv = circuit_inverse(in3); let xNeg = circuit_sub(in1, in2); let xNegOverY = circuit_mul(xNeg, yInv); let outputs = (yInv, xNegOverY) .new_inputs() .next_2([0, 0, 0, 0]) .next_2(x) .next_2(y) .done_2() .eval(modulus) .unwrap(); return (outputs.get_output(yInv), outputs.get_output(xNegOverY)); } #[inline(always)] pub fn multi_pairing_check_bn254_2P_2F( pair0: G1G2Pair, pair1: G1G2Pair, mut lines: Span>, hint: MPCheckHintBN254, ) -> Result { if hint.big_Q.len() != 145 { return Result::Err('WRONG_BIG_Q_LEN'); } if hint.Ris.len() != 34 { return Result::Err('WRONG_RIS_LEN'); } let modulus = get_BN254_modulus(); // BN254 prime field modulus let (yInv_0, xNegOverY_0) = compute_yInvXnegOverY(pair0.p.x, pair0.p.y, modulus); let (yInv_1, xNegOverY_1) = compute_yInvXnegOverY(pair1.p.x, pair1.p.y, modulus); // Init sponge state // >>> hades_permutation(0, 0, int.from_bytes(b"MPCHECK_BN254_2P_2F", "big")) let hash_state = PoseidonState { s0: 0x1a0eeac356472db3074d1ca6bb7bbb60fa9f0d53b34ef38a4eddde21b332b28, s1: 0x2783a4227674921675bfa12e30fda0dad992bb9be9785908ac1338b14018182, s2: 0x5d4b7659197d4e54258057765dd5e6dbf106bb3bd5a559fe1951303901e2e81, }; // Hash Inputs let hash_state = hashing::hash_G1G2Pair(pair0, hash_state); let hash_state = hashing::hash_G1G2Pair(pair1, hash_state); let hash_state = hashing::hash_E12D_u288(hint.lambda_root, hash_state); let hash_state = hashing::hash_E12D_u288(hint.lambda_root_inverse, hash_state); let hash_state = hashing::hash_MillerLoopResultScalingFactor_u288(hint.w, hash_state); // Hash Ris to obtain base random coefficient c0 and evals let z: u384 = hint.z.into(); let (hash_state, mut evals) = basic_field_ops::eval_and_hash_E12D_u288_transcript( hint.Ris, hash_state, z, ); // Last Ri is known to be 1: let hash_state = hashing::hash_E12D_one_u288(hash_state); let mut evals = evals.span(); let c_1: u384 = hash_state.s1.into(); // hades_permutation(0,0,int.from_bytes(b"MPCHECK_BN254_2P_2F_II", "big")) let part_II_state = PoseidonState { s0: 0x61306dbf52f13cce66776e642d58f27a1dc58ae7172565dd1d1555ac3bfbede, s1: 0x5895a3e8e579ff7c9a9bda84916ace794bc48e009dc6c76104a127111aef035, s2: 0x5ff2c406897ea02acecbbc03b4718c8e4a42cc5bb60d738ad60a58918aaa868, }; let hash_state = hashing::hash_u384(c_1, TWO_POW_96, part_II_state); // Hash Q = (Σ_i c_i*Q_i) to obtain random evaluation point z let z_felt252 = hashing::hash_u288_transcript(hint.big_Q.span(), hash_state).s0; if z_felt252 != hint.z { return Result::Err('WRONG_Z'); } let ( c_of_z, w_of_z, c_inv_of_z, LHS, c_inv_frob_1_of_z, c_frob_2_of_z, c_inv_frob_3_of_z, ): (u384, u384, u384, u384, u384, u384, u384) = run_BN254_INITIALIZE_MPCHECK_circuit( hint.lambda_root, z, hint.w, hint.lambda_root_inverse, ); let R_0_of_Z = *evals.pop_front().unwrap(); let [l0, l1] = (*lines.multi_pop_front::<2>().unwrap()).unbox(); let (_lhs) = run_BN254_MP_CHECK_INIT_BIT_2P_2F_circuit( yInv_0, xNegOverY_0, l0, yInv_1, xNegOverY_1, l1, R_0_of_Z, z, c_inv_of_z, c_1, LHS, ); let mut LHS = _lhs; let mut f_i_of_z = R_0_of_Z; // rest of miller loop let mut bits = BN254_SEED_BITS_JY00_COMPRESSED.span(); while let Option::Some(bit) = bits.pop_front() { // println!("bit {}", *bit); let R_i_of_z = *evals.pop_front().unwrap(); let (_LHS): (u384,) = match *bit { 0 => { let [l0, l1, l2, l3] = (*lines.multi_pop_front::<4>().unwrap()).unbox(); run_BN254_MP_CHECK_BIT00_2P_2F_circuit( yInv_0, xNegOverY_0, l0, l1, yInv_1, xNegOverY_1, l2, l3, LHS, f_i_of_z, R_i_of_z, z, c_1, ) }, 1 | 2 => { let [l0, l1, l2, l3, l4, l5] = (*lines.multi_pop_front::<6>().unwrap()).unbox(); let c_or_c_inv_of_z = match (*bit - 1) { 0 => c_inv_of_z, _ => c_of_z, }; run_BN254_MP_CHECK_BIT10_2P_2F_circuit( yInv_0, xNegOverY_0, l0, l1, l2, yInv_1, xNegOverY_1, l3, l4, l5, LHS, f_i_of_z, R_i_of_z, c_or_c_inv_of_z, z, c_1, ) }, _ => { // 3 -> 01, 4 -> 10 let [l0, l1, l2, l3, l4, l5] = (*lines.multi_pop_front::<6>().unwrap()).unbox(); let c_or_c_inv_of_z = match (*bit - 3) { 0 => c_inv_of_z, _ => c_of_z, }; run_BN254_MP_CHECK_BIT01_2P_2F_circuit( yInv_0, xNegOverY_0, l0, l1, l2, yInv_1, xNegOverY_1, l3, l4, l5, LHS, f_i_of_z, R_i_of_z, c_or_c_inv_of_z, z, c_1, ) }, }; LHS = _LHS; f_i_of_z = R_i_of_z; } let R_n_minus_2_of_z = *evals.pop_front().unwrap(); let R_n_minus_1_of_z: u384 = One::one(); let [l0, l1, l2, l3] = (*lines.multi_pop_front::<4>().unwrap()).unbox(); let (check) = run_BN254_MP_CHECK_FINALIZE_2P_2F_circuit( yInv_0, xNegOverY_0, l0, l1, yInv_1, xNegOverY_1, l2, l3, R_n_minus_2_of_z, R_n_minus_1_of_z, c_1, w_of_z, z, c_inv_frob_1_of_z, c_frob_2_of_z, c_inv_frob_3_of_z, LHS, f_i_of_z, hint.big_Q, ); match check.is_zero() { true => Result::Ok(true), false => Result::Err('FINAL_CHECK_FAILED'), } } #[inline(always)] pub fn multi_pairing_check_bls12_381_2P_2F( pair0: G1G2Pair, pair1: G1G2Pair, mut lines: Span>, hint: MPCheckHintBLS12_381, ) -> Result { if hint.big_Q.len() != 81 { return Result::Err('WRONG_BIG_Q_LEN'); } if hint.Ris.len() != 35 { return Result::Err('WRONG_RIS_LEN'); } let modulus = get_BLS12_381_modulus(); // BLS12_381 prime field modulus let (yInv_0, xNegOverY_0) = compute_yInvXnegOverY(pair0.p.x, pair0.p.y, modulus); let (yInv_1, xNegOverY_1) = compute_yInvXnegOverY(pair1.p.x, pair1.p.y, modulus); // Init sponge state // >>> hades_permutation(0, 0, int.from_bytes(b"MPCHECK_BLS12_381_2P_2F", "big")) let hash_state = PoseidonState { s0: 0x38fc487c6a5413cb099f102857912e93570c7a3628b34722ec1fff8cefa6f5f, s1: 0x3cec4f7f551bccf7cbfbfd86cde672f2104b89d5443707c7ca7aca8196f4d0f, s2: 0x5ff52024b20f5cd082b347b5455a15a265874a39983c38ed544090b750ee718, }; // Hash Inputs let hash_state = hashing::hash_G1G2Pair(pair0, hash_state); let hash_state = hashing::hash_G1G2Pair(pair1, hash_state); let hash_state = hashing::hash_E12D_u384(hint.lambda_root_inverse, hash_state); let hash_state = hashing::hash_MillerLoopResultScalingFactor_u384(hint.w, hash_state); // Hash Ris to obtain base random coefficient c0 & evaluate all Ris at z (given in advance). let z: u384 = hint.z.into(); let (hash_state, mut evals) = basic_field_ops::eval_and_hash_E12D_u384_transcript( hint.Ris, hash_state, z, ); // Last Ri is known to be 1: let hash_state = hashing::hash_E12D_one_u384(hash_state); let mut evals = evals.span(); let c_1: u384 = hash_state.s1.into(); // hades_permutation(0,0,int.from_bytes(b"MPCHECK_BLS12_381_2P_2F_II", "big")) let part_II_state = PoseidonState { s0: 0x68148a435d9f7b0d7bfa42c9fa6b8c0441fd8a741fc024c547445b689d294b9, s1: 0x3076763e35be672b2cc79293b3d9c3899d8b4f083b484ae6d591b8d582e3471, s2: 0x29153e786b3c7f75891c98d853cf2db3125f434b25f2b38fb8be850009713d0, }; let hash_state = hashing::hash_u384(c_1, TWO_POW_96, part_II_state); // Hash Q = (Σ_i c_i*Q_i) to obtain random evaluation point z let z_felt252 = hashing::hash_u384_transcript(hint.big_Q.span(), hash_state).s0; if z_felt252 != hint.z { return Result::Err('WRONG_Z'); } // Precompute lambda root evaluated in Z: let (conjugate_c_inv_of_z, w_of_z, c_inv_of_z_frob_1): (u384, u384, u384) = run_BLS12_381_INITIALIZE_MPCHECK_circuit( hint.lambda_root_inverse, z, hint.w, ); // init bit for bls is 1: let R_0_of_Z = *evals.pop_front().unwrap(); let [l0, l1, l2, l3] = (*lines.multi_pop_front::<4>().unwrap()).unbox(); let (_lhs) = run_BLS12_381_MP_CHECK_INIT_BIT_2P_2F_circuit( yInv_0, xNegOverY_0, l0, l1, yInv_1, xNegOverY_1, l2, l3, R_0_of_Z, z, conjugate_c_inv_of_z, ); let mut LHS = _lhs; let mut f_i_of_z = R_0_of_Z; // Σ_i (Π_k (c_i*P_k(z))) = (Σ_i c_i*Q_i(z)) * P(z) + Σ_i c_i * R_i(z) // <=> Σ_i (Π_k (c_i*P_k(z))) - Σ_i c_i * R_i(z) = (Σ_i c_i*Q_i(z)) * P(z) // => LHS = Σ_i (Π_k (c_i*P_k(z))) - Σ_i c_i * R_i(z) // rest of miller loop let mut bits = BLS12_381_SEED_BITS_COMPRESSED.span(); while let Option::Some(bit) = bits.pop_front() { let R_i_of_z = *evals.pop_front().unwrap(); let (_LHS): (u384,) = match *bit { 0 => { let [l0, l1] = (*lines.multi_pop_front::<2>().unwrap()).unbox(); run_BLS12_381_MP_CHECK_BIT0_2P_2F_circuit( yInv_0, xNegOverY_0, l0, yInv_1, xNegOverY_1, l1, LHS, f_i_of_z, R_i_of_z, z, c_1, ) }, 1 => { let [l0, l1, l2, l3] = (*lines.multi_pop_front::<4>().unwrap()).unbox(); run_BLS12_381_MP_CHECK_BIT1_2P_2F_circuit( yInv_0, xNegOverY_0, l0, l1, yInv_1, xNegOverY_1, l2, l3, LHS, f_i_of_z, R_i_of_z, conjugate_c_inv_of_z, z, c_1, ) }, _ => { let [l0, l1, l2, l3] = (*lines.multi_pop_front::<4>().unwrap()).unbox(); run_BLS12_381_MP_CHECK_BIT00_2P_2F_circuit( yInv_0, xNegOverY_0, l0, l1, yInv_1, xNegOverY_1, l2, l3, LHS, f_i_of_z, R_i_of_z, z, c_1, ) }, }; LHS = _LHS; f_i_of_z = R_i_of_z; } let R_last_of_z: u384 = One::one(); let (check,) = run_BLS12_381_MP_CHECK_FINALIZE_2P_circuit( R_last_of_z, c_1, w_of_z, z, c_inv_of_z_frob_1, LHS, *hint.Ris.at(34), hint.big_Q, ); match check.is_zero() { true => Result::Ok(true), false => Result::Err('FINAL_CHECK_FAILED'), } } ================================================ FILE: src/src/ec/pairing/single_pairing_tower.cairo ================================================ use core::circuit::u384; use core::num::traits::{One, Zero}; use garaga::circuits::multi_pairing_check::run_BN254_MP_CHECK_PREPARE_PAIRS_1P_circuit; use garaga::circuits::tower_circuits as tw; use garaga::definitions::curves::{BLS12_381_SEED_BITS, BN254_SEED_BITS_NAF, get_BLS12_381_modulus}; use garaga::definitions::{BNProcessedPair, E12T, G1Point, G2Point}; use garaga::ec::pairing::pairing_check::compute_yInvXnegOverY; pub fn miller_loop_bn254_tower(P: G1Point, Q: G2Point) -> (E12T,) { let bits = BN254_SEED_BITS_NAF.span(); let (processed_pair): (BNProcessedPair,) = run_BN254_MP_CHECK_PREPARE_PAIRS_1P_circuit( P, Q.y0, Q.y1, ); let mut Mi: E12T = One::one(); let mut Qi = Q; for bit in bits { let (_Qi, _Mi) = match *bit { 0 => { tw::run_BN254_TOWER_MILLER_BIT0_1P_circuit( processed_pair.yInv, processed_pair.xNegOverY, Qi, Mi, ) }, 1 => { tw::run_BN254_TOWER_MILLER_BIT1_1P_circuit( processed_pair.yInv, processed_pair.xNegOverY, Qi, Q, Mi, ) }, _ => { tw::run_BN254_TOWER_MILLER_BIT1_1P_circuit( processed_pair.yInv, processed_pair.xNegOverY, Qi, G2Point { x0: Q.x0, x1: Q.x1, y0: processed_pair.QyNeg0, y1: processed_pair.QyNeg1, }, Mi, ) }, }; Qi = _Qi; Mi = _Mi; } tw::run_BN254_TOWER_MILLER_FINALIZE_BN_1P_circuit( Q, processed_pair.yInv, processed_pair.xNegOverY, Qi, Mi, ) } pub fn expt_bn254_tower(X: E12T) -> (E12T,) { // Step 1 let (t3) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(X); // Step 2 let (t5) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t3); // Step 3 let (result) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t5); // Step 4 let (t0) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(result); // Step 5 let (t2) = tw::run_BN254_E12T_MUL_circuit(X, t0); // Step 6 let (t0) = tw::run_BN254_E12T_MUL_circuit(t3, t2); // Step 7 let (t1) = tw::run_BN254_E12T_MUL_circuit(X, t0); // Step 8 let (t4) = tw::run_BN254_E12T_MUL_circuit(result, t2); // Step 9 let (t6) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t2); // Step 10 let (t1) = tw::run_BN254_E12T_MUL_circuit(t0, t1); // Step 11 let (t0) = tw::run_BN254_E12T_MUL_circuit(t3, t1); // Step 17 let mut t6 = t6; for _ in 0..6_u8 { let (_t6) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t6); t6 = _t6; } // Step 18 let (t5) = tw::run_BN254_E12T_MUL_circuit(t5, t6); // Step 19 let (mut t5) = tw::run_BN254_E12T_MUL_circuit(t4, t5); // Step 26 for _ in 0..7_u8 { let (_t5) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t5); t5 = _t5; } // Step 27 let (mut t4) = tw::run_BN254_E12T_MUL_circuit(t4, t5); // Step 35 for _ in 0..8_u8 { let (_t4) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t4); t4 = _t4; } // Step 36 let (t4) = tw::run_BN254_E12T_MUL_circuit(t0, t4); // Step 37 let (mut t3) = tw::run_BN254_E12T_MUL_circuit(t3, t4); // Step 43 for _ in 0..6_u8 { let (_t3) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t3); t3 = _t3; } // Step 44 let (mut t2) = tw::run_BN254_E12T_MUL_circuit(t2, t3); // Step 52 for _ in 0..8_u8 { let (_t2) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t2); t2 = _t2; } // Step 53 let (mut t2) = tw::run_BN254_E12T_MUL_circuit(t0, t2); // Step 59 for _ in 0..6_u8 { let (_t2) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t2); t2 = _t2; } // Step 60 let (mut t2) = tw::run_BN254_E12T_MUL_circuit(t0, t2); // Step 70 for _ in 0..10_u8 { let (_t2) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t2); t2 = _t2; } // Step 71 let (mut t1) = tw::run_BN254_E12T_MUL_circuit(t1, t2); // Step 77 for _ in 0..6_u8 { let (_t1) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t1); t1 = _t1; } // Step 78 let (t0) = tw::run_BN254_E12T_MUL_circuit(t0, t1); // Step 79 let (result) = tw::run_BN254_E12T_MUL_circuit(result, t0); return (result,); } pub fn final_exp_bn254_tower(M: E12T) -> E12T { let curve_id = 0; let (t0) = fp12_conjugate(M, curve_id); let (result) = tw::run_BN254_E12T_INVERSE_circuit(M); let (t0) = tw::run_BN254_E12T_MUL_circuit(t0, result); let (result) = tw::run_BN254_E12T_FROBENIUS_SQUARE_circuit(t0); let (result) = tw::run_BN254_E12T_MUL_circuit(result, t0); // Hard part let (t0) = expt_bn254_tower(result); let (t0) = fp12_conjugate(t0, curve_id); let (t0) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t0); let (t1) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t0); let (t1) = tw::run_BN254_E12T_MUL_circuit(t0, t1); let (t2) = expt_bn254_tower(t1); let (t2) = fp12_conjugate(t2, curve_id); let (t3) = fp12_conjugate(t1, curve_id); let (t1) = tw::run_BN254_E12T_MUL_circuit(t2, t3); let (t3) = tw::run_BN254_E12T_CYCLOTOMIC_SQUARE_circuit(t2); let (t4) = expt_bn254_tower(t3); let (t4) = tw::run_BN254_E12T_MUL_circuit(t1, t4); let (t3) = tw::run_BN254_E12T_MUL_circuit(t0, t4); let (t0) = tw::run_BN254_E12T_MUL_circuit(t2, t4); let (t0) = tw::run_BN254_E12T_MUL_circuit(result, t0); let (t2) = tw::run_BN254_E12T_FROBENIUS_circuit(t3); let (t0) = tw::run_BN254_E12T_MUL_circuit(t2, t0); let (t2) = tw::run_BN254_E12T_FROBENIUS_SQUARE_circuit(t4); let (t0) = tw::run_BN254_E12T_MUL_circuit(t2, t0); let (t2) = fp12_conjugate(result, curve_id); let (t2) = tw::run_BN254_E12T_MUL_circuit(t2, t3); let (t2) = tw::run_BN254_E12T_FROBENIUS_CUBE_circuit(t2); let (result) = tw::run_BN254_E12T_MUL_circuit(t2, t0); result } #[inline] pub fn fp12_conjugate(X: E12T, curve_id: usize) -> (E12T,) { let (b0a0, b0a1, b1a0, b1a1, b2a0, b2a1) = tw::run_FP6_NEG_circuit( X.c1b0a0, X.c1b0a1, X.c1b1a0, X.c1b1a1, X.c1b2a0, X.c1b2a1, curve_id, ); ( E12T { c0b0a0: X.c0b0a0, c0b0a1: X.c0b0a1, c0b1a0: X.c0b1a0, c0b1a1: X.c0b1a1, c0b2a0: X.c0b2a0, c0b2a1: X.c0b2a1, c1b0a0: b0a0, c1b0a1: b0a1, c1b1a0: b1a0, c1b1a1: b1a1, c1b2a0: b2a0, c1b2a1: b2a1, }, ) } pub fn final_exp_bls12_381_tower(M: E12T) -> E12T { let result = M; let (t0) = fp12_conjugate(M, 1); let (result) = tw::run_BLS12_381_E12T_INVERSE_circuit(result); let (t0) = tw::run_BLS12_381_E12T_MUL_circuit(t0, result); let (result) = tw::run_BLS12_381_E12T_FROBENIUS_SQUARE_circuit(t0); let (result) = tw::run_BLS12_381_E12T_MUL_circuit(result, t0); let (t0) = tw::run_BLS12_381_E12T_CYCLOTOMIC_SQUARE_circuit(result); let (t1) = expt_half_bls12_381_tower(t0); let (t2) = fp12_conjugate(result, 1); let (t1) = tw::run_BLS12_381_E12T_MUL_circuit(t1, t2); let (t2) = expt_bls12_381_tower(t1); let (t1) = fp12_conjugate(t1, 1); let (t1) = tw::run_BLS12_381_E12T_MUL_circuit(t1, t2); let (t2) = expt_bls12_381_tower(t1); let (t1) = tw::run_BLS12_381_E12T_FROBENIUS_circuit(t1); let (t1) = tw::run_BLS12_381_E12T_MUL_circuit(t1, t2); let (result) = tw::run_BLS12_381_E12T_MUL_circuit(result, t0); let (t0) = expt_bls12_381_tower(t1); let (t2) = expt_bls12_381_tower(t0); let (t0) = tw::run_BLS12_381_E12T_FROBENIUS_SQUARE_circuit(t1); let (t1) = fp12_conjugate(t1, 1); let (t1) = tw::run_BLS12_381_E12T_MUL_circuit(t1, t2); let (t1) = tw::run_BLS12_381_E12T_MUL_circuit(t1, t0); let (result) = tw::run_BLS12_381_E12T_MUL_circuit(result, t1); result } /// Dedicated structure for compressed elements in the cyclotomic subgroup G_phi ⊂ Fq^12 /// /// Background and intent (Observation 47): /// - Elements in the cyclotomic subgroup admit the Karabina compression where two of the /// Fp6 components (c0.b0 and c1.b1 in our tower representation) can be recovered from the /// remaining ones. Squaring in this form is cheaper and is implemented by the circuit /// `run_BLS12_381_E12T_CYCLO_SQUARE_COMPRESSED_circuit` that takes eight Fp limbs. /// - We represent such compressed elements explicitly instead of overloading `E12T`. /// This avoids confusing unused fields and makes the intent of “compressed cyclotomic /// value” explicit at the type level. /// /// Representation details: /// - `E12T` is modeled as Fp12 via the tower (Fp2 → Fp6 → Fp12) with coordinates /// `c{i}.b{j}.a{k}`. The compressed form stores exactly the eight limbs required by the /// Karabina formulas: c0.b1, c0.b2, c1.b0 and c1.b2 (each over Fp2 → a0,a1). /// - The fields `c0.b0` and `c1.b1` are intentionally absent; they are reconstructed during /// decompression using `DECOMP_KARABINA_*` circuits. /// - Validity invariant: values of this type must come from the cyclotomic subgroup; using /// arbitrary Fp12 elements here is undefined. /// /// Usage: /// - Squaring: feed the eight limbs directly to /// `run_BLS12_381_E12T_CYCLO_SQUARE_COMPRESSED_circuit`. /// - Multiplication or any generic operation: first call /// `decompress_karabina_bls12_381_compressed` to recover a full `E12T`. /// - Zero-branch: when `c1b2 == 0`, decompression uses the cheaper "I_Z" path. /// /// Security/correctness notes: /// - Decompression returns `One` when the Karabina t1 component is zero, matching the /// standard algorithmic edge case. /// - The helper `to_compressed(E12T)` merely copies the eight required limbs; it does not /// check subgroup membership. #[derive(Copy, Drop, Debug, PartialEq)] pub struct CompressedE12T { pub c0b1a0: u384, pub c0b1a1: u384, pub c0b2a0: u384, pub c0b2a1: u384, pub c1b0a0: u384, pub c1b0a1: u384, pub c1b2a0: u384, pub c1b2a1: u384, } /// Convert a full `E12T` (assumed in G_phi) into its Karabina compressed form by /// extracting the eight required limbs (c0.b1, c0.b2, c1.b0, c1.b2). #[inline] fn to_compressed(X: E12T) -> (CompressedE12T,) { ( CompressedE12T { c0b1a0: X.c0b1a0, c0b1a1: X.c0b1a1, c0b2a0: X.c0b2a0, c0b2a1: X.c0b2a1, c1b0a0: X.c1b0a0, c1b0a1: X.c1b0a1, c1b2a0: X.c1b2a0, c1b2a1: X.c1b2a1, }, ) } /// Decompress a Karabina-compressed cyclotomic element back to `E12T`. /// /// The implementation mirrors the two-step Karabina decompression and branches between /// the “I_Z” and “I_NZ” circuits depending on whether `c1b2 == 0`. pub fn decompress_karabina_bls12_381_compressed(X: CompressedE12T) -> (E12T,) { let (t0a0, t0a1, t1a0, t1a1) = match (X.c1b2a0.is_zero() && X.c1b2a1.is_zero()) { true => { let (t0a0, t0a1) = tw::run_BLS12_381_E12T_DECOMP_KARABINA_I_Z_circuit( X.c0b1a0, X.c0b1a1, X.c1b2a0, X.c1b2a1, ); (t0a0, t0a1, X.c0b2a0, X.c0b2a1) }, false => { tw::run_BLS12_381_E12T_DECOMP_KARABINA_I_NZ_circuit( X.c0b1a0, X.c0b1a1, X.c0b2a0, X.c0b2a1, X.c1b0a0, X.c1b0a1, X.c1b2a0, X.c1b2a1, ) }, }; if t1a0.is_zero() && t1a1.is_zero() { return (One::one(),); } let (zc0b0a0, zc0b0a1, zc1b1a0, zc1b1a1) = tw::run_BLS12_381_E12T_DECOMP_KARABINA_II_circuit( t0a0, t0a1, t1a0, t1a1, X.c0b1a0, X.c0b1a1, X.c0b2a0, X.c0b2a1, X.c1b0a0, X.c1b0a1, X.c1b2a0, X.c1b2a1, ); ( E12T { c0b0a0: zc0b0a0, c0b0a1: zc0b0a1, c0b1a0: X.c0b1a0, c0b1a1: X.c0b1a1, c0b2a0: X.c0b2a0, c0b2a1: X.c0b2a1, c1b0a0: X.c1b0a0, c1b0a1: X.c1b0a1, c1b1a0: zc1b1a0, c1b1a1: zc1b1a1, c1b2a0: X.c1b2a0, c1b2a1: X.c1b2a1, }, ) } /// Apply `times` Karabina cyclotomic squarings on a value in the compressed domain and /// return the decompressed `E12T`. /// /// This keeps the element compressed between squarings (cheap), and only performs the /// final decompression once at the end when a full `E12T` is needed for multiplication or /// other generic operations. fn cyclo_square_compressed_then_decompress_k(X: E12T, times: u32) -> (E12T,) { let (mut C) = to_compressed(X); for _ in 0..times { let (_c0b1a0, _c0b1a1, _c0b2a0, _c0b2a1, _c1b0a0, _c1b0a1, _c1b2a0, _c1b2a1) = tw::run_BLS12_381_E12T_CYCLO_SQUARE_COMPRESSED_circuit( C.c0b1a0, C.c0b1a1, C.c0b2a0, C.c0b2a1, C.c1b0a0, C.c1b0a1, C.c1b2a0, C.c1b2a1, ); C = CompressedE12T { c0b1a0: _c0b1a0, c0b1a1: _c0b1a1, c0b2a0: _c0b2a0, c0b2a1: _c0b2a1, c1b0a0: _c1b0a0, c1b0a1: _c1b0a1, c1b2a0: _c1b2a0, c1b2a1: _c1b2a1, }; } decompress_karabina_bls12_381_compressed(C) } pub fn expt_half_bls12_381_tower(M: E12T) -> (E12T,) { let (t0) = cyclo_square_compressed_then_decompress_k(M, 15_u32); let (t1) = cyclo_square_compressed_then_decompress_k(t0, 32_u32); let (mut result) = tw::run_BLS12_381_E12T_MUL_circuit(t0, t1); let (t1) = cyclo_square_compressed_then_decompress_k(t1, 9_u32); let (result) = tw::run_BLS12_381_E12T_MUL_circuit(result, t1); let (t1) = cyclo_square_compressed_then_decompress_k(t1, 3_u32); let (result) = tw::run_BLS12_381_E12T_MUL_circuit(result, t1); let (t1) = cyclo_square_compressed_then_decompress_k(t1, 2_u32); let (result) = tw::run_BLS12_381_E12T_MUL_circuit(result, t1); let (t1) = tw::run_BLS12_381_E12T_CYCLOTOMIC_SQUARE_circuit(t1); let (result) = tw::run_BLS12_381_E12T_MUL_circuit(result, t1); let (result) = fp12_conjugate(result, 1); (result,) } pub fn expt_bls12_381_tower(M: E12T) -> (E12T,) { let (t0) = expt_half_bls12_381_tower(M); return tw::run_BLS12_381_E12T_CYCLOTOMIC_SQUARE_circuit(t0); } pub fn miller_loop_bls12_381_tower(P: G1Point, Q: G2Point) -> (E12T,) { let bits = BLS12_381_SEED_BITS.span(); let modulus = get_BLS12_381_modulus(); let (yInv, xNegOverY) = compute_yInvXnegOverY(P.x, P.y, modulus); let (TripleQ, c0b0a0, c0b0a1, c0b1a0, c0b1a1, c0b2a0, c0b2a1, c1b1a0, c1b1a1, c1b2a0, c1b2a1) = tw::run_BLS12_381_TOWER_MILLER_INIT_BIT_1P_circuit( yInv, xNegOverY, Q, ); let mut Mi: E12T = E12T { c0b0a0: c0b0a0, c0b0a1: c0b0a1, c0b1a0: c0b1a0, c0b1a1: c0b1a1, c0b2a0: c0b2a0, c0b2a1: c0b2a1, c1b0a0: Zero::zero(), c1b0a1: Zero::zero(), c1b1a0: c1b1a0, c1b1a1: c1b1a1, c1b2a0: c1b2a0, c1b2a1: c1b2a1, }; let mut Qi = TripleQ; for bit in bits { let (_Qi, _Mi) = match *bit { 0 => { tw::run_BLS12_381_TOWER_MILLER_BIT0_1P_circuit(yInv, xNegOverY, Qi, Mi) }, _ => { tw::run_BLS12_381_TOWER_MILLER_BIT1_1P_circuit(yInv, xNegOverY, Qi, Q, Mi) }, }; Qi = _Qi; Mi = _Mi; } return fp12_conjugate(Mi, 1); } ================================================ FILE: src/src/ec/selectors.cairo ================================================ use corelib_imports::bounded_int::{ AddHelper, BoundedInt, DivRemHelper, MulHelper, UnitInt, bounded_int, upcast, }; const TWO: felt252 = 2; const TWO_UI: UnitInt = 2; const FOUR_UI: UnitInt = 4; const EIGHT_UI: UnitInt = 8; const TWO_NZ_TYPED: NonZero> = 2; const FOUR_NZ_TYPED: NonZero> = 4; const POW128_DIV_2: felt252 = 0x7fffffffffffffffffffffffffffffff; // ((2^128-1) // 2) const POW128_DIV_4: felt252 = 0x3fffffffffffffffffffffffffffffff; // ((2^128-1) // 4) const POW128: felt252 = 0x100000000000000000000000000000000; const FOUR: felt252 = 4; const EIGHT: felt252 = 8; pub type u15_bi = BoundedInt<0, { 15 }>; pub type u12_bi = BoundedInt<0, { 12 }>; pub type u1_bi = BoundedInt<0, { 1 }>; pub type u2_bi = BoundedInt<0, { 2 }>; pub type u3_bi = BoundedInt<0, { 3 }>; pub type u4_bi = BoundedInt<0, { 4 }>; pub type u5_bi = BoundedInt<0, { 5 }>; pub type u6_bi = BoundedInt<0, { 6 }>; pub type u7_bi = BoundedInt<0, { 7 }>; pub type u8_bi = BoundedInt<0, { 8 }>; impl DivRemU128By2 of DivRemHelper, UnitInt> { type DivT = BoundedInt<0, { POW128_DIV_2 }>; type RemT = u1_bi; } impl DivRemU128By4 of DivRemHelper, UnitInt> { type DivT = BoundedInt<0, { POW128_DIV_4 }>; type RemT = u3_bi; } impl MulHelperBitBy2Impl of MulHelper> { type Result = u2_bi; } impl MulHelperBitBy4Impl of MulHelper> { type Result = u4_bi; } impl MulHelperBit3By4Impl of MulHelper> { type Result = u12_bi; } impl MulHelperBitBy8Impl of MulHelper> { type Result = u8_bi; } impl AddHelperU1ByU2Impl of AddHelper { type Result = u3_bi; } impl AddHelperU3ByU4Impl of AddHelper { type Result = u7_bi; } impl AddHelperU7ByU8Impl of AddHelper { type Result = u15_bi; } impl AddHelperU3ByU12Impl of AddHelper { type Result = u15_bi; } #[inline(always)] fn _extract_and_calculate_selector_bit_inlined( mut u1: BoundedInt<0, { POW128 - 1 }>, mut u2: BoundedInt<0, { POW128 - 1 }>, mut v1: BoundedInt<0, { POW128 - 1 }>, mut v2: BoundedInt<0, { POW128 - 1 }>, ) -> ( BoundedInt<0, { POW128 - 1 }>, BoundedInt<0, { POW128 - 1 }>, BoundedInt<0, { POW128 - 1 }>, BoundedInt<0, { POW128 - 1 }>, u15_bi, ) { let (qu1, u1b) = bounded_int::div_rem(u1, TWO_NZ_TYPED); let (qu2, u2b) = bounded_int::div_rem(u2, TWO_NZ_TYPED); let (qv1, v1b) = bounded_int::div_rem(v1, TWO_NZ_TYPED); let (qv2, v2b) = bounded_int::div_rem(v2, TWO_NZ_TYPED); u1 = upcast(qu1); u2 = upcast(qu2); v1 = upcast(qv1); v2 = upcast(qv2); let selector: u15_bi = bounded_int::add( bounded_int::add( bounded_int::add(u1b, bounded_int::mul(u2b, TWO_UI)), bounded_int::mul(v1b, FOUR_UI), ), bounded_int::mul(v2b, EIGHT_UI), ); return (u1, u2, v1, v2, selector); } #[inline(always)] fn _extract_and_calculate_selector_bit_inlined_fake_glv( mut s1: BoundedInt<0, { POW128 - 1 }>, mut s2: BoundedInt<0, { POW128 - 1 }>, ) -> (BoundedInt<0, { POW128 - 1 }>, BoundedInt<0, { POW128 - 1 }>, u15_bi) { let (qs1, s1b) = bounded_int::div_rem(s1, FOUR_NZ_TYPED); let (qs2, s2b) = bounded_int::div_rem(s2, FOUR_NZ_TYPED); s1 = upcast(qs1); s2 = upcast(qs2); let selector: u15_bi = bounded_int::add(s1b, bounded_int::mul(s2b, FOUR_UI)); return (s1, s2, selector); } #[inline(always)] pub fn build_selectors_inlined( _u1: u128, _u2: u128, _v1: u128, _v2: u128, ) -> (Span, u128, u128, u128, u128) { // Generated code for n_bits = 73 let mut selectors: Array = array![]; let mut u1: BoundedInt<0, { POW128 - 1 }> = upcast(_u1); let mut u2: BoundedInt<0, { POW128 - 1 }> = upcast(_u2); let mut v1: BoundedInt<0, { POW128 - 1 }> = upcast(_v1); let mut v2: BoundedInt<0, { POW128 - 1 }> = upcast(_v2); // Initial division and remainder to get LSBs let (qu1, u1lsb) = bounded_int::div_rem(u1, TWO_NZ_TYPED); let (qu2, u2lsb) = bounded_int::div_rem(u2, TWO_NZ_TYPED); let (qv1, v1lsb) = bounded_int::div_rem(v1, TWO_NZ_TYPED); let (qv2, v2lsb) = bounded_int::div_rem(v2, TWO_NZ_TYPED); u1 = upcast(qu1); u2 = upcast(qu2); v1 = upcast(qv1); v2 = upcast(qv2); // Inlined loop (72 iterations) let (u1, u2, v1, v2, selector_0) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_0)); let (u1, u2, v1, v2, selector_1) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_1)); let (u1, u2, v1, v2, selector_2) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_2)); let (u1, u2, v1, v2, selector_3) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_3)); let (u1, u2, v1, v2, selector_4) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_4)); let (u1, u2, v1, v2, selector_5) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_5)); let (u1, u2, v1, v2, selector_6) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_6)); let (u1, u2, v1, v2, selector_7) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_7)); let (u1, u2, v1, v2, selector_8) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_8)); let (u1, u2, v1, v2, selector_9) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_9)); let (u1, u2, v1, v2, selector_10) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_10)); let (u1, u2, v1, v2, selector_11) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_11)); let (u1, u2, v1, v2, selector_12) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_12)); let (u1, u2, v1, v2, selector_13) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_13)); let (u1, u2, v1, v2, selector_14) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_14)); let (u1, u2, v1, v2, selector_15) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_15)); let (u1, u2, v1, v2, selector_16) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_16)); let (u1, u2, v1, v2, selector_17) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_17)); let (u1, u2, v1, v2, selector_18) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_18)); let (u1, u2, v1, v2, selector_19) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_19)); let (u1, u2, v1, v2, selector_20) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_20)); let (u1, u2, v1, v2, selector_21) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_21)); let (u1, u2, v1, v2, selector_22) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_22)); let (u1, u2, v1, v2, selector_23) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_23)); let (u1, u2, v1, v2, selector_24) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_24)); let (u1, u2, v1, v2, selector_25) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_25)); let (u1, u2, v1, v2, selector_26) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_26)); let (u1, u2, v1, v2, selector_27) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_27)); let (u1, u2, v1, v2, selector_28) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_28)); let (u1, u2, v1, v2, selector_29) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_29)); let (u1, u2, v1, v2, selector_30) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_30)); let (u1, u2, v1, v2, selector_31) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_31)); let (u1, u2, v1, v2, selector_32) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_32)); let (u1, u2, v1, v2, selector_33) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_33)); let (u1, u2, v1, v2, selector_34) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_34)); let (u1, u2, v1, v2, selector_35) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_35)); let (u1, u2, v1, v2, selector_36) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_36)); let (u1, u2, v1, v2, selector_37) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_37)); let (u1, u2, v1, v2, selector_38) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_38)); let (u1, u2, v1, v2, selector_39) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_39)); let (u1, u2, v1, v2, selector_40) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_40)); let (u1, u2, v1, v2, selector_41) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_41)); let (u1, u2, v1, v2, selector_42) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_42)); let (u1, u2, v1, v2, selector_43) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_43)); let (u1, u2, v1, v2, selector_44) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_44)); let (u1, u2, v1, v2, selector_45) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_45)); let (u1, u2, v1, v2, selector_46) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_46)); let (u1, u2, v1, v2, selector_47) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_47)); let (u1, u2, v1, v2, selector_48) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_48)); let (u1, u2, v1, v2, selector_49) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_49)); let (u1, u2, v1, v2, selector_50) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_50)); let (u1, u2, v1, v2, selector_51) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_51)); let (u1, u2, v1, v2, selector_52) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_52)); let (u1, u2, v1, v2, selector_53) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_53)); let (u1, u2, v1, v2, selector_54) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_54)); let (u1, u2, v1, v2, selector_55) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_55)); let (u1, u2, v1, v2, selector_56) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_56)); let (u1, u2, v1, v2, selector_57) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_57)); let (u1, u2, v1, v2, selector_58) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_58)); let (u1, u2, v1, v2, selector_59) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_59)); let (u1, u2, v1, v2, selector_60) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_60)); let (u1, u2, v1, v2, selector_61) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_61)); let (u1, u2, v1, v2, selector_62) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_62)); let (u1, u2, v1, v2, selector_63) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_63)); let (u1, u2, v1, v2, selector_64) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_64)); let (u1, u2, v1, v2, selector_65) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_65)); let (u1, u2, v1, v2, selector_66) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_66)); let (u1, u2, v1, v2, selector_67) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_67)); let (u1, u2, v1, v2, selector_68) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_68)); let (u1, u2, v1, v2, selector_69) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_69)); let (u1, u2, v1, v2, selector_70) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_70)); let (_, _, _, _, selector_71) = _extract_and_calculate_selector_bit_inlined(u1, u2, v1, v2); selectors.append(upcast(selector_71)); return (selectors.span(), upcast(u1lsb), upcast(u2lsb), upcast(v1lsb), upcast(v2lsb)); } #[inline(always)] pub fn build_selectors_inlined_fake_glv(_s1: u128, _s2: u128) -> (Span, u128, u128) { // Generated code for n_bits = 128 let mut selectors: Array = array![]; let mut s1: BoundedInt<0, { POW128 - 1 }> = upcast(_s1); let mut s2: BoundedInt<0, { POW128 - 1 }> = upcast(_s2); // Initial division and remainder to get LSBs let (qs1, s1lsb) = bounded_int::div_rem(s1, TWO_NZ_TYPED); let (qs2, s2lsb) = bounded_int::div_rem(s2, TWO_NZ_TYPED); s1 = upcast(qs1); s2 = upcast(qs2); // Inlined loop (63 2-bit iterations for 128 bits) let (s1, s2, selector_0) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_0)); // Correction for the last bits 2-1. selectors.append(16); let (s1, s2, selector_1) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_1)); let (s1, s2, selector_2) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_2)); let (s1, s2, selector_3) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_3)); let (s1, s2, selector_4) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_4)); let (s1, s2, selector_5) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_5)); let (s1, s2, selector_6) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_6)); let (s1, s2, selector_7) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_7)); let (s1, s2, selector_8) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_8)); let (s1, s2, selector_9) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_9)); let (s1, s2, selector_10) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_10)); let (s1, s2, selector_11) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_11)); let (s1, s2, selector_12) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_12)); let (s1, s2, selector_13) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_13)); let (s1, s2, selector_14) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_14)); let (s1, s2, selector_15) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_15)); let (s1, s2, selector_16) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_16)); let (s1, s2, selector_17) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_17)); let (s1, s2, selector_18) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_18)); let (s1, s2, selector_19) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_19)); let (s1, s2, selector_20) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_20)); let (s1, s2, selector_21) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_21)); let (s1, s2, selector_22) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_22)); let (s1, s2, selector_23) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_23)); let (s1, s2, selector_24) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_24)); let (s1, s2, selector_25) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_25)); let (s1, s2, selector_26) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_26)); let (s1, s2, selector_27) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_27)); let (s1, s2, selector_28) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_28)); let (s1, s2, selector_29) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_29)); let (s1, s2, selector_30) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_30)); let (s1, s2, selector_31) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_31)); let (s1, s2, selector_32) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_32)); let (s1, s2, selector_33) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_33)); let (s1, s2, selector_34) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_34)); let (s1, s2, selector_35) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_35)); let (s1, s2, selector_36) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_36)); let (s1, s2, selector_37) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_37)); let (s1, s2, selector_38) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_38)); let (s1, s2, selector_39) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_39)); let (s1, s2, selector_40) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_40)); let (s1, s2, selector_41) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_41)); let (s1, s2, selector_42) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_42)); let (s1, s2, selector_43) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_43)); let (s1, s2, selector_44) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_44)); let (s1, s2, selector_45) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_45)); let (s1, s2, selector_46) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_46)); let (s1, s2, selector_47) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_47)); let (s1, s2, selector_48) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_48)); let (s1, s2, selector_49) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_49)); let (s1, s2, selector_50) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_50)); let (s1, s2, selector_51) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_51)); let (s1, s2, selector_52) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_52)); let (s1, s2, selector_53) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_53)); let (s1, s2, selector_54) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_54)); let (s1, s2, selector_55) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_55)); let (s1, s2, selector_56) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_56)); let (s1, s2, selector_57) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_57)); let (s1, s2, selector_58) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_58)); let (s1, s2, selector_59) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_59)); let (s1, s2, selector_60) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_60)); let (s1, s2, selector_61) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_61)); let (s1, s2, selector_62) = _extract_and_calculate_selector_bit_inlined_fake_glv(s1, s2); selectors.append(upcast(selector_62)); // At this point s1, and s2 are the MSB (last bit). if s1 != 0 { if s2 != 0 { // 11 T2 index : 10 selectors.append(10); } else { // 10 T12 index : 6 selectors.append(6); } } else { if s2 != 0 { // 01 T15 index : 9 selectors.append(9); } else { // 00 T5 index : 5 selectors.append(5); } } return (selectors.span(), upcast(s1lsb), upcast(s2lsb)); } ================================================ FILE: src/src/hashes/poseidon_bn254.cairo ================================================ use core::circuit::{ CircuitElement as CE, CircuitInput as CI, CircuitInputs, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_mul, u384, }; use garaga::core::circuit::AddInputResultTrait2; use garaga::definitions::get_GRUMPKIN_modulus; pub fn poseidon_hash_2(x: u256, y: u256) -> u256 { let x_u384: u384 = x.into(); let y_u384: u384 = y.into(); poseidon_hash_2_bn254(x_u384, y_u384).try_into().unwrap() } // Compute the poseidon hash of two elements for the BN254 scalar field (Fr). // Comptaible with circomlib poseidon hash (2 inputs) and Noir's hash 2 poseidon::bn254::hash_2 pub fn poseidon_hash_2_bn254(x: u384, y: u384) -> u384 { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // 0xee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e let in2 = CE::> {}; // 0xf1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864 let in3 = CE::> {}; // 0x8dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5 let in4 = CE::> {}; // 0x84d520e4e5bb469e1f9075cb7c490efa59565eedae2d00ca8ef88ceea2b0197 let in5 = CE::> {}; // 0x2d15d982d99577fa33da56722416fd734b3e667a2f9f15d8eb3e767ae0fd811e let in6 = CE::> {}; // 0xed2538844aba161cf1578a43cf0364e91601f6536a5996d0efbe65632c41b6d let in7 = CE::> {}; // 0x2600c27d879fbca186e739e6363c71cf804c877d829b735dcc3e3af02955e60a let in8 = CE::> {}; // 0x28f8bd44a583cbaa475bd15396430e7ccb99a5517440dfd970058558282bf2c5 let in9 = CE::> {}; // 0x9cd7d4c380dc5488781aad012e7eaef1ed314d7f697a5572d030c55df153221 let in10 = CE::< CI<10>, > {}; // 0x11bb6ee1291aabb206120ecaace460d24b6713febe82234951e2bee7d0f855f5 let in11 = CE::< CI<11>, > {}; // 0x2d74e8fa0637d9853310f3c0e3fae1d06f171580f5b8fd05349cadeecfceb230 let in12 = CE::< CI<12>, > {}; // 0x2735e4ec9d39bdffac9bef31bacba338b1a09559a511a18be4b4d316ed889033 let in13 = CE::> {}; // 0xf03c1e9e0895db1a5da6312faa78e971106c33f826e08dcf617e24213132dfd let in14 = CE::< CI<14>, > {}; // 0x17094cd297bf827caf92920205b719c18741090b8f777811848a7e9ead6778c4 let in15 = CE::> {}; // 0xdb8f419c21f92461fc2b3219465798348df90d4178042c81ba7d4b4d559e2b8 let in16 = CE::< CI<16>, > {}; // 0x243443613f64ffa417427ed5933fcfbc66809db60b9ca1724a22709ceceeece2 let in17 = CE::< CI<17>, > {}; // 0x22af49fbfd5d7e9fcd256c25c07d3dd8ecbbae6deecd03aa04bb191fada75411 let in18 = CE::< CI<18>, > {}; // 0x14fbd37fa8ad6e4e0c78a20d93c7230c4677f797b4327323f7f7c097c19420e0 let in19 = CE::< CI<19>, > {}; // 0x15a9298bbb882534d4b2c9fbc6e4ef4189420c4eb3f3e1ea22faa7e18b5ae625 let in20 = CE::< CI<20>, > {}; // 0x2f7de75f23ddaaa5221323ebceb2f2ac83eef92e854e75434c2f1d90562232bc let in21 = CE::> {}; // 0x36a4432a868283b78a315e84c4ae5aeca216f2ff9e9b2e623584f7479cd5c27 let in22 = CE::< CI<22>, > {}; // 0x2180d7786a8cf810e277218ab14a11e5e39f3c962f11e860ae1c5682c797de5c let in23 = CE::> {}; // 0xa268ef870736eebd0cb55be640d73ee3778990484cc03ce53572377eefff8e4 let in24 = CE::< CI<24>, > {}; // 0x1eefefe11c0be4664f2999031f15994829e982e8c90e09069df9bae16809a5b2 let in25 = CE::< CI<25>, > {}; // 0x27e87f033bd1e0a89ca596e8cb77fe3a4b8fb93d9a1129946571a3c3cf244c52 let in26 = CE::> {}; // 0x1498a3e6599fe243321f57d6c5435889979c4f9d2a3e184d21451809178ee39 let in27 = CE::< CI<27>, > {}; // 0x27c0a41f4cb9fe67e9dd4d7ce33707f74d5d6bcc235bef108dea1bbebde507aa let in28 = CE::< CI<28>, > {}; // 0x1f75230908b141b46637238b120fc770f4f4ae825d5004c16a7c91fe1dae280f let in29 = CE::< CI<29>, > {}; // 0x25f99a9198e923167bba831b15fffd2d7b97b3a089808d4eb1f0a085bee21656 let in30 = CE::< CI<30>, > {}; // 0x101bc318e9ea5920d0f6acdc2bb526593d3d56ec8ed14c67622974228ba900c6 let in31 = CE::< CI<31>, > {}; // 0x1a175607067d517397c1334ecb019754ebc0c852a3cf091ec1ccc43207a83c76 let in32 = CE::> {}; // 0xf02f0e6d25f9ea3deb245f3e8c381ee6b2eb380ba4af5c1c4d89770155df37b let in33 = CE::< CI<33>, > {}; // 0x151d757acc8237af08d8a6677203ec9692565de456ae789ff358b3163b393bc9 let in34 = CE::< CI<34>, > {}; // 0x256cd9577cea143049e0a1fe0068dd20084980ee5b757890a79d13a3a624fad4 let in35 = CE::> {}; // 0x513abaff6195ea48833b13da50e0884476682c3fbdd195497b8ae86e1937c61 let in36 = CE::< CI<36>, > {}; // 0x1d9570dc70a205f36f610251ee6e2e8039246e84e4ac448386d19dbac4e4a655 let in37 = CE::< CI<37>, > {}; // 0x18f1a5194755b8c5d5d7f1bf8aaa6f56effb012dd784cf5e044eec50b29fc9d4 let in38 = CE::< CI<38>, > {}; // 0x266b53b615ef73ac866512c091e4a4f2fa4bb0af966ef420d88163238eebbca8 let in39 = CE::< CI<39>, > {}; // 0x2d63234c9207438aa42b8de27644c02268304dfeb8c89a1a3f4fd6e8344ae0f7 let in40 = CE::< CI<40>, > {}; // 0x2ab30fbe51ee49bc7b3adde219a6f0b5fbb976205ef8df7e0021daee6f55c693 let in41 = CE::< CI<41>, > {}; // 0x1aee6d4b3ebe9366dcb9cce48969d4df1dc42abcd528b270068d9207fa6a45c9 let in42 = CE::< CI<42>, > {}; // 0x1891aeab71e34b895a79452e5864ae1d11f57646c60bb34aa211d123f6095219 let in43 = CE::< CI<43>, > {}; // 0x24492b5f95c0b0876437e94b4101c69118e16b2657771bd3a7caab01c818aa4b let in44 = CE::> {}; // 0x1752161b3350f7e1b3b2c8663a0d642964628213d66c10ab2fddf71bcfde68f let in45 = CE::> {}; // 0xab676935722e2f67cfb84938e614c6c2f445b8d148de54368cfb8f90a00f3a7 let in46 = CE::> {}; // 0xb0f72472b9a2f5f45bc730117ed9ae5683fc2e6e227e3d4fe0da1f7aa348189 let in47 = CE::< CI<47>, > {}; // 0x16aa6f9273acd5631c201d1a52fc4f8acaf2b2152c3ae6df13a78a513edcd369 let in48 = CE::< CI<48>, > {}; // 0x2f60b987e63614eb13c324c1d8716eb0bf62d9b155d23281a45c08d52435cd60 let in49 = CE::< CI<49>, > {}; // 0x18d24ae01dde92fd7606bb7884554e9df1cb89b042f508fd9db76b7cc1b21212 let in50 = CE::> {}; // 0x4fc3bf76fe31e2f8d776373130df79d18c3185fdf1593960715d4724cffa586 let in51 = CE::> {}; // 0xd18f6b53fc69546cfdd670b41732bdf6dee9e06b21260c6b5d26270468dbf82 let in52 = CE::> {}; // 0xba4231a918f13acec11fbafa17c5223f1f70b4cdb045036fa5d7045bd10e24 let in53 = CE::> {}; // 0x7b458b2e00cd7c6100985301663e7ec33c826da0635ff1ebedd0dd86120b4c8 let in54 = CE::< CI<54>, > {}; // 0x1c35c2d96db90f4f6058e76f15a0c8286bba24e2ed40b16cec39e9fd7baa5799 let in55 = CE::< CI<55>, > {}; // 0x1d12bea3d8c32a5d766568f03dd1ecdb0a4f589abbef96945e0dde688e292050 let in56 = CE::> {}; // 0xd953e20022003270525f9a73526e9889c995bb62fdea94313db405a61300286 let in57 = CE::< CI<57>, > {}; // 0x29f053ec388795d786a40bec4c875047f06ff0b610b4040a760e33506d2671e1 let in58 = CE::> {}; // 0x4188e33735f46b14a4952a98463bc12e264d5f446e0c3f64b9679caaae44fc2 let in59 = CE::< CI<59>, > {}; // 0x149ec28846d4f438a84f1d0529431bb9e996a408b7e97eb3bf1735cdbe96f68f let in60 = CE::> {}; // 0xde20fae0af5188bca24b5f63630bad47aeafd98e651922d148cce1c5fdddee8 let in61 = CE::< CI<61>, > {}; // 0x12d650e8f790b1253ea94350e722ad2f7d836c234b8660edf449fba6984c6709 let in62 = CE::< CI<62>, > {}; // 0x22ab53aa39f34ad30ea96717ba7446aafdadbc1a8abe28d78340dfc4babb8f6c let in63 = CE::< CI<63>, > {}; // 0x26503e8d4849bdf5450dabea7907bc3de0de109871dd776904a129db9149166c let in64 = CE::< CI<64>, > {}; // 0x1d5e7a0e2965dffa00f5454f5003c5c8ec34b23d897e7fc4c8064035b0d33850 let in65 = CE::> {}; // 0xee3d8daa098bee012d96b7ec48448c6bc9a6aefa544615b9cb3c7bbd07104cb let in66 = CE::< CI<66>, > {}; // 0x1bf282082a04979955d30754cd4d9056fa9ef7a7175703d91dc232b5f98ead00 let in67 = CE::> {}; // 0x7ae1344abfc6c2ce3e951bc316bee49971645f16b693733a0272173ee9ad461 let in68 = CE::< CI<68>, > {}; // 0x217e3a247827c376ec21b131d511d7dbdc98a36b7a47d97a5c8e89762ee80488 let in69 = CE::< CI<69>, > {}; // 0x215ffe584b0eb067a003d438e2fbe28babe1e50efc2894117509b616addc30ee let in70 = CE::< CI<70>, > {}; // 0x1e770fc8ecbfdc8692dcedc597c4ca0fbec19b84e33da57412a92d1d3ce3ec20 let in71 = CE::< CI<71>, > {}; // 0x2f6243cda919bf4c9f1e3a8a6d66a05742914fc19338b3c0e50e828f69ff6d1f let in72 = CE::< CI<72>, > {}; // 0x246efddc3117ecd39595d0046f44ab303a195d0e9cc89345d3c03ff87a11b693 let in73 = CE::> {}; // 0x53e8d9b3ea5b8ed4fe006f139cbc4e0168b1c89a918dfbe602bc62cec6adf1 let in74 = CE::< CI<74>, > {}; // 0x1b894a2f45cb96647d910f6a710d38b7eb4f261beefff135aec04c1abe59427b let in75 = CE::> {}; // 0xaeb1554e266693d8212652479107d5fdc077abf88651f5a42553d54ec242cc0 let in76 = CE::< CI<76>, > {}; // 0x16a735f6f7209d24e6888680d1781c7f04ba7d71bd4b7d0e11faf9da8d9ca28e let in77 = CE::> {}; // 0x487b8b7fab5fc8fd7c13b4df0543cd260e4bcbb615b19374ff549dcf073d41b let in78 = CE::< CI<78>, > {}; // 0x1e75b9d2c2006307124bea26b0772493cfb5d512068c3ad677fdf51c92388793 let in79 = CE::> {}; // 0x5120e3d0e28003c253b46d5ff77d272ae46fa1e239d1c6c961dcb02da3b388f let in80 = CE::> {}; // 0xda5feb534576492b822e8763240119ac0900a053b171823f890f5fd55d78372 let in81 = CE::< CI<81>, > {}; // 0x2e211b39a023031a22acc1a1f5f3bb6d8c2666a6379d9d2c40cc8f78b7bd9abe let in82 = CE::< CI<82>, > {}; // 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b let in83 = CE::< CI<83>, > {}; // 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771 let in84 = CE::< CI<84>, > {}; // 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7 let in85 = CE::< CI<85>, > {}; // 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0 let in86 = CE::< CI<86>, > {}; // 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23 let in87 = CE::< CI<87>, > {}; // 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911 let in88 = CE::< CI<88>, > {}; // 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d let in89 = CE::< CI<89>, > {}; // 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa let in90 = CE::< CI<90>, > {}; // 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0 let in91 = CE::< CI<91>, > {}; // 0x1e6f20a11d1e31e43f83dcedddb9a0236203f5f24ae72c925a8a79a66831f51d let in92 = CE::< CI<92>, > {}; // 0x1bd8c528472e57bdc722a141f8785694484f426725403ae24084e3027e782467 let in93 = CE::< CI<93>, > {}; // 0x2d51ba82c8073c6d6bacf1ad5e56655b7143625b0a9e9c3190527a1a5f05079a let in94 = CE::< CI<94>, > {}; // 0x1b07d6d51e6f7e97e0ab10fc2e51ea83ce0611f940ff0731b5f927fe8d6a77c9 let in95 = CE::< CI<95>, > {}; // 0x11e12a40d262ae88e8376f62d19edf43093cdef1ccf34d985a3e53f0bc5765a0 let in96 = CE::< CI<96>, > {}; // 0x221c170e4d02a2479c6f3e47b5ff55781574f980d89038308a3ef37cce8463bd let in97 = CE::> {}; // 0x3f0815ab463f1b76ee25a9b8768b3231a89752f427f4f063ab718e707576b31 let in98 = CE::< CI<98>, > {}; // 0x15648bf46f60d82954c7e33029b3617357012a3d3b1d34c8e008859f1dbfb317 let in99 = CE::< CI<99>, > {}; // 0x127e00c2253de07818ca7f2eafdd7564d05ea850cf61f1daa0cfefbf7fbfba85 let in100 = CE::< CI<100>, > {}; // 0x66365afd18a41ef9382fc0b1d265cb4d3ce470a8cbbb878f7d48051630747bd let in101 = CE::< CI<101>, > {}; // 0x219d14f823513140dc69a96f7fe7e086f4fa24c84e57dcf2b099715c4404aae7 let in102 = CE::< CI<102>, > {}; // 0x3a30bfbbf2cb86d4a6a63a8050d91f9f14f4d33696d37ebaefa9ac2302132d5 let in103 = CE::< CI<103>, > {}; // 0x2121bbcdeaa33a35b0270fb7d5c9f94edad5a84d74b06e3385104b0b41935bcc let in104 = CE::< CI<104>, > {}; // 0x196b544fbeb0a792cfbb82c289e579b7cd5580c2e338a389d053ef8b3d10e70e let in105 = CE::< CI<105>, > {}; // 0x2809c3a1547c0cee89c1db270ef479c26973ec73edb4bd4e7d907ea0202f560f let in106 = CE::< CI<106>, > {}; // 0x11c34446b083ef92ca157585a02b8b342a4c67175b31f4b5d40d4e96dfc5c8f1 let in107 = CE::< CI<107>, > {}; // 0x253ea0b33a8bf3b2367c030e3289cbe0f6242ad7709d90b86d9d8026e2e39925 let in108 = CE::< CI<108>, > {}; // 0x30467dc1930f6afe90c89d4007ad29fc4f5a19c006d1030438c16df85637bd5f let in109 = CE::< CI<109>, > {}; // 0x2f9d4b55495f7e377e20e6f5a3a88af7aa6a536458b38bbe13c8ebfbbba54f44 let in110 = CE::< CI<110>, > {}; // 0x1d9e9d5c736e3151f11d36d499e7e093d8ee2353be18aad54cfd03ff0feac4b8 let in111 = CE::< CI<111>, > {}; // 0x124b617b43e598f9ebf622f7823a3de7d1bfedb87e097c315f343de301e54841 let in112 = CE::< CI<112>, > {}; // 0x198e7cfc66ae45774055cf073bedc945a5f9c5b19cae08d789cc5748ffe199b2 let in113 = CE::< CI<113>, > {}; // 0x2eac25b3498dfadffd124ab3aad57789eb945ba57443099c5bb6c27ed977fe24 let in114 = CE::< CI<114>, > {}; // 0x1ee02c175cdfe1871b378305c1bb9c904e8af1d4454ed3550b3c6ab5f4f90126 let in115 = CE::< CI<115>, > {}; // 0x616f8c34c607266b29ea8f9d2dfa47ff6fbb1d9745c48609fa98301d0f679d5 let in116 = CE::< CI<116>, > {}; // 0x181d68b0a188504958b9f19cbbdb972a853e51ed385e4883a43a42832803370b let in117 = CE::< CI<117>, > {}; // 0x2d5397ce863464a25d6b7f5b015d579181d1ce2f24cbabf6059e9327f5ba7004 let in118 = CE::< CI<118>, > {}; // 0x15bf817491b94d71e8912940cc0b80277713e7d32da2b6591724d8dbd4bc2618 let in119 = CE::< CI<119>, > {}; // 0x2a7cbd11460b177ab76feab28b69485ac8cc687740bc910994a3827d29c08714 let in120 = CE::< CI<120>, > {}; // 0xf7cd5ffa4661730ab56e447fae5cc1763cb462da80a85614c237b290de9d502 let in121 = CE::< CI<121>, > {}; // 0xe0766004b4c4176eb13273508eb6575f768137d86d305be644ce04531008100 let in122 = CE::< CI<122>, > {}; // 0x625fa7145813481f6d148be6b9c8bb7b54ee3c1afac00104e1f763000b9924c let in123 = CE::< CI<123>, > {}; // 0x7c5472508b459916ee0f5461aad2e0b19cd9c7b184f515b65136318ce2c6a5 let in124 = CE::< CI<124>, > {}; // 0x567375470d189b693ac77ab3fb7557231d53073951d43c54685879cb7a89fcb let in125 = CE::< CI<125>, > {}; // 0x1d0406bcbec83f8d5165f56c063e42108ad21f51ea4bfc71601174ba5c7b8bcc let in126 = CE::< CI<126>, > {}; // 0xc02b18eef22332d280a8aa1f86405f3375f06342f8696ee7c73b46c63272cb7 let in127 = CE::< CI<127>, > {}; // 0x17c1fc174cd9a6ebeaa7add2f801a664823509ad4fd1b15aad053a55ad6da4cf let in128 = CE::< CI<128>, > {}; // 0x5f843c23024eb1dab7ebbc86709a021aaa6caf433f7ed258a08638e9584b32d let in129 = CE::< CI<129>, > {}; // 0x22df2420697ca28b5cc51c53165e002727b45ccd90a55c87589f792f0ad8cb37 let in130 = CE::< CI<130>, > {}; // 0x2f1438303a7b49d473400aaedf0f48009fd3af804b76be86417588efc4d7302a let in131 = CE::< CI<131>, > {}; // 0x2323d5fcf2da8965c6b2b7b4fbf9a24bbaa7f4dccd35d5ca6155c5463093b23b let in132 = CE::< CI<132>, > {}; // 0x26c85b9dfbbe48fe83b753a5e7336b9f40f7b961e9c54f94e37700073d4d26e let in133 = CE::< CI<133>, > {}; // 0x31511000251ec86feb38b5ab4e335f070b271df4c20979528e41d65384c318f let in134 = CE::< CI<134>, > {}; // 0x18e588324a9bbaacb42fa69e5d90a0c0e27cd16b941e34a60ff5df9a26c03af1 let in135 = CE::< CI<135>, > {}; // 0x2642b5d8e16b953b070635775c8d3c9498357d6ad9bef2e7d99f03c10ea1f95f let in136 = CE::< CI<136>, > {}; // 0x21fc313ba11c60e8e84ff60db906a0f031189b0b48335c4221f909aef836c133 let in137 = CE::< CI<137>, > {}; // 0x2d3562e3d4b42bc6890b698cc6ab89f7311298bcbac6e4e9f2f4d93d06dae151 let in138 = CE::< CI<138>, > {}; // 0xa74ef541d360e842e3e0b6ff7e5c7c77934a5f67616f01c189d886dfd2e0808 let in139 = CE::< CI<139>, > {}; // 0x140564b53e0a812ac3983d6e3b433afa43f434087d9e754967c2c9b1b02caf8a let in140 = CE::< CI<140>, > {}; // 0x14709e32d98ae4cd18b400181e71ab9759c436c8e83fa6993adb6f2db6bba9d0 let in141 = CE::< CI<141>, > {}; // 0x734b2366c59e394423f179e1266dd392372db4f2dba651f4a619a4b52bdc010 let in142 = CE::< CI<142>, > {}; // 0x11fb2d705c94b08d5ad3e3c5fb6629abe963ed92913642c7d02d7e71088fd2d4 let in143 = CE::< CI<143>, > {}; // 0x27d03abf5c1f290e5d715eba19371050ef6eb7f78fd84be834e4cc3618059484 let in144 = CE::< CI<144>, > {}; // 0x13ed9e9e6b452df27fb3353cfc2cd63ebe817f212a39c6a8bb9b441ac1395861 let in145 = CE::< CI<145>, > {}; // 0x1319c51cf37aaa10246cdaaa04a12e88795de4452604263a7c5b79ab99cbd23c let in146 = CE::> {}; // 0xbca25588d187b7f9dad839f2c8cb526a4cf444eebbd0e715b6cea019ac3f2 let in147 = CE::< CI<147>, > {}; // 0x1d837ea0341c5964181226874b923cd01a069b493f02f7a3c01be23cf51d593f let in148 = CE::< CI<148>, > {}; // 0x1b41ce9ed3634cbd42c427ce4c5c83774149e2a6dbd25f24012090db7de4e7f9 let in149 = CE::< CI<149>, > {}; // 0x671f0e3b674ae7cddc790ecc4e946f4bca74b98b78a127c7b56bd6673f1ce1f let in150 = CE::< CI<150>, > {}; // 0x19fc073797a39b272e40cd30615f55fefeb682c1ac14143071d0449a5426e4e let in151 = CE::< CI<151>, > {}; // 0x17bee47d262a497fd1f7c5c6d5a7c70fa4209480bf5d97311c5096619e9fd13 let in152 = CE::< CI<152>, > {}; // 0x2073cff92d3141b480763539cff2978a4c7944721cc937ba00cc8527274471e3 let in153 = CE::< CI<153>, > {}; // 0x3bd7b3e2c1885877f43182a55a91d48f9c58d152e730fe2c7aa46b1fa663baa let in154 = CE::< CI<154>, > {}; // 0x226ebc9a538b5bbaff128edfb9bbf5fa0ceb100719a14c8dfed9ffbbbad9b6b7 let in155 = CE::< CI<155>, > {}; // 0xd395f0b08b9fede0373a06e1552c0e634a49572af1d830dc6e394e8a5d3b21a let in156 = CE::< CI<156>, > {}; // 0x28242439b524540a30d49b68e19e31ba5284bd3bcf1e0f2f41f77d5331f99ffa let in157 = CE::< CI<157>, > {}; // 0x370d6fa19eaac142d2de034801ab85e0b457e129e91f929754b48c6154d4df6 let in158 = CE::< CI<158>, > {}; // 0x9a16f573b3280f390762abf269579eaa37939bc0c753feb0a2b2e0bcbde1659 let in159 = CE::< CI<159>, > {}; // 0x2228e360fb5b162b496ac443f98127ee3c0021a690b71b268d99981368231d97 let in160 = CE::< CI<160>, > {}; // 0x7e42c2ca633d2c49fabf83991476d209431e34d8032b6a1b97675f3c567f944 let in161 = CE::< CI<161>, > {}; // 0x2ce12d7269663770c3cab85a6215a32eed35fda1d8e9d753a50fe96097724a9f let in162 = CE::< CI<162>, > {}; // 0x3d7427704c61e2009eeb9b1b45a0125084bc4daf70973a7ba0b2231815b15de let in163 = CE::< CI<163>, > {}; // 0x10f8abf0764185861c1267fcf4b4b33ca096fb4ddc4626732d86921e553e69c6 let in164 = CE::< CI<164>, > {}; // 0x17ccaf6f26f7267a025d7cb456e3aeb251a1a620aaf6568a5c95644c7c5914cc let in165 = CE::< CI<165>, > {}; // 0x63bb306b96310051385c3ce00ca820ad0e3651a6e55754d59de6df28cea4d51 let in166 = CE::< CI<166>, > {}; // 0x1f761ee5553c5e86f2c304a18095ab7403242e0b65e608bc920cf993a4169974 let in167 = CE::< CI<167>, > {}; // 0xdc5f00bbfd7c1d9a23c0e666859ba6564bcde8761b45717cd6bdfc09de4e8f2 let in168 = CE::< CI<168>, > {}; // 0x6de511520e277b7df07c3536381c13eb44cf790a230abc391089760bfc40ef2 let in169 = CE::< CI<169>, > {}; // 0x2a134348c8660efcf9ef54863e70528a1fd4481b50a1fe21f24a8c06e10cca03 let in170 = CE::< CI<170>, > {}; // 0xaeb5023bbb9a64c4bd80089e99edf8ed5f6f1ffb63a7dbba1b33520bcfce37b let in171 = CE::< CI<171>, > {}; // 0x141a6d0810366ae225ecb5f0bfdc9995406c5960ab26155836fc51fb7cb933d1 let in172 = CE::< CI<172>, > {}; // 0x9d2ea05ef54dadbbe776f404dca6626cc0b2539990bc0b8bfe87497f1e2c5b7 let in173 = CE::< CI<173>, > {}; // 0x1e56d244a8e41be5d104d5f8ef70891d22d4a5432441bfe8ff1a16e91719cdde let in174 = CE::< CI<174>, > {}; // 0x1d4f020c57c4f14aec908b2f99b5c4fd5e09447fa85c2fd68ba4d5c5f50c7b49 let in175 = CE::< CI<175>, > {}; // 0x763911a3a92a4f0e09f4e14cd03398d8d82a1e09db80fb0ee1e833764c18fd3 let in176 = CE::< CI<176>, > {}; // 0x12857275be2fe6b9ba2ec68f9061643f1fc5d9a2c5e47e55684366e54b302946 let in177 = CE::< CI<177>, > {}; // 0x2ed11ccd2e2e2376655ffe9a96c4b81adc0a60353c5d83d4d0ebf50d1bbf87c0 let in178 = CE::< CI<178>, > {}; // 0x3e31de8958e82645b320d5e3e966ef4726d5b1c2cfbb4acd288a21543c6d594 let in179 = CE::< CI<179>, > {}; // 0x11e880dfefdbd08858ae890046533d58da28a608d7e905366ec2ca4a36e71963 let in180 = CE::< CI<180>, > {}; // 0x1835b275deaed2d00704a9c3cc21ab7a44a34662978d53c190dc25e969a507b2 let in181 = CE::< CI<181>, > {}; // 0x68b75315e25ed4ace5a4a9480e1d82ce5d44f76f1324240419f372ff8d3c3f5 let in182 = CE::< CI<182>, > {}; // 0x1b7ef7d04aec73d62b052d2ad12b92a4268fccd795c839d698ad3b22823274d1 let in183 = CE::< CI<183>, > {}; // 0x28c0c848022a90606f6193ff5501b57216b670727f4b8efcc240d30bbaa9f03f let in184 = CE::< CI<184>, > {}; // 0x13bda49296cbcc51686a7bfb1c39f3f254370985a16660efd6e5d82d4f068e1b let in185 = CE::< CI<185>, > {}; // 0x2e7987ea8204389d11eb10b34265e378a945729f86c3e0e2fd38490d3a594141 let in186 = CE::< CI<186>, > {}; // 0x826d4a2324ad3aa4b2b45c10a190fedef702aeffda3226ce5415fffd03935c8 let in187 = CE::< CI<187>, > {}; // 0x2dbeee85eaeaa9fa3675ef541c9df7bb964a85435c3b59685f93b434036ded let in188 = CE::< CI<188>, > {}; // 0x227ee7a945edaee6919418ecb3279b11e6fa44f5f5c5abfb966a4be599cb86c7 let in189 = CE::< CI<189>, > {}; // 0x1d0a6d1a9519877805ac90d696faf2a5ffadc23986de8c698d541471c7244220 let in190 = CE::< CI<190>, > {}; // 0x2208aaba508ae816da4f333b7854fbbcd10eea1db284ec3e9f4de02b25f6e9d4 let in191 = CE::< CI<191>, > {}; // 0x28a58901035b2c99e36a7d29b587a215c9e59268e2f8e01a175720971ccf04ec let in192 = CE::< CI<192>, > {}; // 0x112f6d8d42b0a0d123a07865ca1376df317a2a14ffc0191226f38a8adfd6238 let in193 = CE::< CI<193>, > {}; // 0x8c6eb19c016d1833174dda182d266d5c727f97fb4d01f1daf906b6d3c6e2308 let in194 = CE::< CI<194>, > {}; // 0x1359d2d6c8b5a116d0b38b95f9c642df75b1be9a48c8698ecfea9103f73f1879 let in195 = CE::< CI<195>, > {}; // 0x10c5052ec67ab9b6a467c1cc1878d91aaa07aacf7725f8a5ed42b699c4af3ca7 let in196 = CE::< CI<196>, > {}; // 0x583c4d292d54f3cdb708803e6338fc6afdb188d5d4e9f060193823684c96c75 let in197 = CE::< CI<197>, > {}; // 0x2d94a1c55be382151a4054c5b96322e7bcd1fe2b3e076e16ee2c18bfc06f57b4 let in198 = CE::< CI<198>, > {}; // 0x15e3402fdde8770fb997369579c1b1703ef77c671927ead80dbc64dd2211c3ec let in199 = CE::< CI<199>, > {}; // 0x185be98784817f22f7b21e6b867d5a71b5000bef8bb902eb302677e20a727be3 let in200 = CE::< CI<200>, > {}; // 0x18db4321c721c03666ed8927c89890aa8aad1b00c054547b5ca14cd94de467b6 let in201 = CE::< CI<201>, > {}; // 0x2a852b6247f5d61f0c390b3f3d799188528849bcd2cd0aff4eb2134a039b5126 let in202 = CE::< CI<202>, > {}; // 0x2510aeed51b7f506e65fb9a18ee0124aa5276f6de1cd771b165930204da58f22 let in203 = CE::< CI<203>, > {}; // 0xf2074a32eb8260fb5bd3a236f03a47b47b7fb54dcad1d7977d6486513bab5f2 let in204 = CE::< CI<204>, > {}; // 0x2f4c69297866bd45a8270e19941926cec3531c9e12c4c2c84971404bfa044090 let in205 = CE::< CI<205>, > {}; // 0x154668727d2dbadf05d083a65093c0d0e92df5fd5f3fd75e9b792c562a37473f let in206 = CE::< CI<206>, > {}; // 0x1e6ffc5d6a1ff5dc4fd77fc5ab5c8c4e8d3e2e375bcd1194a91e5b0f7b13cadf let in207 = CE::< CI<207>, > {}; // 0x2cf1a1d7c44309109d75acbc9395cb8398c8b2d428538571fafa389da29990c6 let in208 = CE::< CI<208>, > {}; // 0x140fb39a89f26f6d87cf76cd5ce8da47aa5d8a023e24cf016ecf64cf793c9880 let in209 = CE::< CI<209>, > {}; // 0x1289d13d58a17b5bf0712b201fb3cddfce2c16dac159990b8298a93a8589f9e8 let in210 = CE::< CI<210>, > {}; // 0xf45cf974d2c9edb5781e8d3d207adc8370cf56bc5218749610920fe98b2db2e let in211 = CE::< CI<211>, > {}; // 0x11909c81a16518046b79edfd24f5abcc585a81d1b333568b8687a1c9eceb44d4 let in212 = CE::< CI<212>, > {}; // 0x2990b23c81882f7709f3b891a0e3da4d6917672f2d5a1041fd7bbd6792330d16 let in213 = CE::< CI<213>, > {}; // 0x609551b14716ca3cd5560e0821e7285e0a083ea9a16dc102ecf461e4aef7277 let in214 = CE::< CI<214>, > {}; // 0xc8c1abdfab99d03fd93dced2467354b6175de1755f4f93dc0880eaa08d03f77 let in215 = CE::< CI<215>, > {}; // 0x138bd098c4923b9fbd02f33f8bec6c730db3fed298ec09f78a7a55d08f2e0b10 let in216 = CE::< CI<216>, > {}; // 0x2e61e4bc021630114673f0f77161ae55dcd0b45ce07d9ae3f21bb5a3190f14c0 let in217 = CE::< CI<217>, > {}; // 0x124860913e3df8f65a9c4060ce3297c626abd1c22401c905ddb408260d8e910 let in218 = CE::< CI<218>, > {}; // 0x13807f89c394a133ec104804d955cbe125f24c5701d98286c6ac8b7ed052ec8 let in219 = CE::< CI<219>, > {}; // 0x2e88d1a6938f0788132aa9eeaec08d2f59aa444050c8f4c4e85578abb0fc2fe5 let in220 = CE::< CI<220>, > {}; // 0x1f3d24f17cfc6050a0cbf64e1f1787e2257be3c3ba607c2e8fcc1f26abf3104 let in221 = CE::< CI<221>, > {}; // 0x1fe1cb0e2ae169f83b9d4f133d41fb5b3fe6c76a82a916bfd9b62f82f0f8d0bf let in222 = CE::< CI<222>, > {}; // 0xef79351229409cd353329221229827e19946f3d8d1c48bf5e3377f9177071f3 let in223 = CE::< CI<223>, > {}; // 0x18fb2e46fc1b90fe1c4893ef77a9d111507551883127860e89088608373beda9 let in224 = CE::< CI<224>, > {}; // 0x77afe2579f42ec14c32ef0761e23a3cc0ad6263a68c5cb61916bd57120d1868 let in225 = CE::< CI<225>, > {}; // 0x79769092daa5a752642c04ccf8a6ea54e2ac9836fdd65d248b186f1490b7b99 let in226 = CE::< CI<226>, > {}; // 0x1d8bf229c19968f0254eb6e09c5c8bfd67eb9734606b676b663c76cf76bab4a5 let in227 = CE::< CI<227>, > {}; // 0x2a33b7d855e7fe55f93556e49e4b37737664f14236f17256428f29f6ec1bddad let in228 = CE::< CI<228>, > {}; // 0x25b0331d7e2b15af4ec161c86e84ba6ab2056077e7aa7536340dc3187ccca8b2 let in229 = CE::< CI<229>, > {}; // 0x762098f5fe26598ccbf45e4810211b0ffcf8ccbb92c16e2f4f13f22342474e2 let in230 = CE::< CI<230>, > {}; // 0xe234d720d70b2886d0da4c007b1bda42362e144185c70716dece2b6172c2514 let in231 = CE::< CI<231>, > {}; // 0x1d82bedccd2bc8a06e3742e720b7fec2ea72182f11c0c60d135c811152aa4b60 let in232 = CE::< CI<232>, > {}; // 0x480064d4b3eb0ada5e9a3e7d05930b7c3397fd6b94d481314bd1c690a17c979 let in233 = CE::< CI<233>, > {}; // 0x10a892763b3cca9ef7593fbb1140edc8c8e4580568560cf41867f7464fb0c11a let in234 = CE::< CI<234>, > {}; // 0xb5ec64548ea841ac921f9b2553680785978b315667ae4714dde4cd7f4de8b91 let in235 = CE::< CI<235>, > {}; // 0x10554aca4e348e5949761bd7131dfaebd78010edd030e1a9ce3c65c9db931d46 let in236 = CE::< CI<236>, > {}; // 0x15be66f38d86b0998b93655462b1f475b9be9de306e150d4ac648fab3db0cff6 let in237 = CE::< CI<237>, > {}; // 0x176ad3600fd3491182d182957ffad01bf6c26e9d4ab0c23caaf308e427d3dbe8 let in238 = CE::< CI<238>, > {}; // 0x2b6f355b3dbf65f09335001d705ac125e3beb20f4fc11bd3ce82b5cf0af2e6f2 let in239 = CE::< CI<239>, > {}; // 0x1c85c06a6d5d40d81d7c89edefb32d1a8448c51288fa296b6de9ff788c77451 let in240 = CE::< CI<240>, > {}; // 0x20e1e876c4746a0cbd9a51d76b2e25f82361c389e43f7d1f51a70aaac2460d79 let in241 = CE::< CI<241>, > {}; // 0x20e46219f684186d2a024b637bc35a29ee3b08ce737701392d987dda9217fa08 let in242 = CE::< CI<242>, > {}; // 0x2ea7279db9f2aa0f654e987907277c24480766367a8bd90e28be0f2ed6091367 let in243 = CE::< CI<243>, > {}; // 0x136be2a7f18924c9362096d472bc75ca0969dc077c9171b1641be95091780f74 let in244 = CE::< CI<244>, > {}; // 0x1ca2033501baa3f73067c4300fb0f51119ed5736fbc8f1f6c924baf0df5a0e9e let in245 = CE::< CI<245>, > {}; // 0xa82f199c2505277ecaa75e495f34e3525824f7a4a9d9fa1da810832b48a50c7 let in246 = CE::< CI<246>, > {}; // 0xecf10485307b4bae92fefb0d7f7782a9f37a2722e7ed9eb7925a2dea580b7d5 let in247 = CE::< CI<247>, > {}; // 0x7b642138dfd6a6dd12aa22f08a8296d68615c8478f13af16aebbbb339a3936b let in248 = CE::< CI<248>, > {}; // 0x1d9dda43a25593ffd2256d34921fb86ed70e760ba76d61e9cbc3b6dd0f1a2150 let in249 = CE::< CI<249>, > {}; // 0x2f1af228520c8b751dc91136c91c6bccd5367eb08213d392958ce2fd3d7d2fce let in250 = CE::< CI<250>, > {}; // 0x1fecfe833ad540455c6d6c1ab3de4abae61ada625a1a2b6b18551a45a6cde123 let in251 = CE::< CI<251>, > {}; // 0x18fc8e608c735b2b3b0d7583460227575657ff8a77abe637bdd3ad28e4a23c88 let in252 = CE::< CI<252>, > {}; // 0x28f740bc1182e9706ebf03cb3f53aba8a43ce0b618783a5586388a7547faa815 let in253 = CE::< CI<253>, > {}; // 0x47998cc0af5a26b94ad301e4b998d29e960a4851cfd13822bed35b7146966a4 let in254 = CE::< CI<254>, > {}; // 0x1b5f1525b31db911dda43e415e1b9a3a9725c7b52e880ee130a14a692b777b70 let in255 = CE::< CI<255>, > {}; // 0x275a83fa5d19b4535f65e965a90eac9bf770ae9bd1d7b1af945fa57ed5c8de6e let in256 = CE::< CI<256>, > {}; // 0x2e8789257ed2cbcccb430568e49bc9dc2a563359808c9897ce3e40a6f6a27aa8 let in257 = CE::< CI<257>, > {}; // 0x927f46cfe80feefeb2721a4c09e9d17f60c34500dcd6e41e2925a39c8e2c7c1 let in258 = CE::< CI<258>, > {}; // 0x1f868ae04832a5dbc37619bfe6ab6a97fd8fb2cfbc1ecf9e0e484bbfe7698101 let in259 = CE::< CI<259>, > {}; // 0x9d7a11e27d2f53109b73f745b2defed65d94ba80f308fb19ce6d56c9b45eff4 let in260 = CE::< CI<260>, > {}; // 0x282d857cfe8da3b5104e1c2823fb7c5b9a7b25924fda5995b0c351aa2b879dff let in261 = CE::< CI<261>, > {}; // 0x20ba8a9fcec815b13f349ff830ae663b27576e135c0744f6987fb0f6ff49c217 let in262 = CE::< CI<262>, > {}; // 0x11b6afc91e32f1ca4589fba12e657d226d57b471ddd2ab1b66a8ae4dcbfb136e let in263 = CE::< CI<263>, > {}; // 0x2e666402ac9cc588316e335c7d93db344788eec2c72ddf3f908141736cebc3be let in264 = CE::< CI<264>, > {}; // 0x17522e0e9e64f795a202a110e283faad7057aec5c9ed9a1a74920f2794f18595 let in265 = CE::< CI<265>, > {}; // 0x2d2ed17f7a1f3ee9e20b470cad4cc7319e6adb40e2ff24b7878cb9878edbd3b9 let in266 = CE::< CI<266>, > {}; // 0x1a81efb19d7e1edaa96fa276e89e85d08f75e54a8136f4d73c937da16c7bf9f4 let in267 = CE::< CI<267>, > {}; // 0x27ff57c1ca847e57210a7b44e52e5630f299c5f451c7a0d515a16bb3bd33e237 let in268 = CE::< CI<268>, > {}; // 0x1c1a8e22230abcd13c5be96031bfa167840d117b3c6a5a0a11be26a7f5fb1a94 let in269 = CE::< CI<269>, > {}; // 0x2a1c3f15d4927c843627a9cd533e4250d81e7774d2c32b59d5836f9c19a5657 let in270 = CE::< CI<270>, > {}; // 0x2ddbb7239eb904d81c52499b37cb4be1af0373a10ac112e185acb219899357e4 let in271 = CE::< CI<271>, > {}; // 0xdff198393085a754e0d6faec54be81d8edf8bc25edadab48a86fad6da0afb60 let in272 = CE::< CI<272>, > {}; // 0x10d50c2473146bbc76275fcc589d038dec8db28728789f28b6d5f504bd1645ca let in273 = CE::< CI<273>, > {}; // 0x61e8328fb5593f92a53dfd40e1022e6231ba45948506282536b08b4476c1538 let in274 = CE::< CI<274>, > {}; // 0x1b589243847198ded90b644bee31ac58067debf3f07d3c51cfa5a0dd9f6d9784 let in275 = CE::< CI<275>, > {}; // 0x4b00c0da1f851e59863b053bd4c6087190f0bdcced99d5ce6f67a420a3bd1f7 let in276 = CE::< CI<276>, > {}; // 0x239941a46c2b93d9126a70163009a7ac27f8a8d42e35018b3bec8cdcb5ddfd67 let in277 = CE::< CI<277>, > {}; // 0x204f26ca7993b03ac2c35377cb0a3712bfc9bc3ec0bfecb4e87ef6814acf2ea2 let in278 = CE::< CI<278>, > {}; // 0x85aff9c7fdadba039d832d8be165a1e5747cf7308d515e348ef117e926d721c let in279 = CE::< CI<279>, > {}; // 0x249042a8dc111f27c4ae9db044c0b0b3f10e57d05e093158efd375df00ea2068 let in280 = CE::< CI<280>, > {}; // 0x6e799bcdf2b4a74542854f3029803e2f84550665203327b3e0825977413e96b let in281 = CE::< CI<281>, > {}; // 0x1cb3caed4bffb6aca9f4d2c002921bc3fffed333cae12085c612496183b87996 let in282 = CE::< CI<282>, > {}; // 0xb47e9755fae480128a128bfd4faa6a3dd6ea03cab566889dcd99e84d310d51c let in283 = CE::< CI<283>, > {}; // 0xc7e4cea365c2061920a0c9fd2c360a6506293bc024fd1ca3f0bb730da886a4f let in284 = CE::< CI<284>, > {}; // 0x21da1f701bac77bcbbaa30d964d6f6f63dbe1b20d9d6988c8dcd7ba4187215df let in285 = CE::< CI<285>, > {}; // 0x9ae612e8ba1ca1370905fb67899d10db86b47bd19965b6edd1a9486e3c6cc55 let in286 = CE::< CI<286>, > {}; // 0x262e1e0b56cac47fc150f284491190e6aab75445b0c99373fe1f7a0e3b95cf3d let in287 = CE::< CI<287>, > {}; // 0x234bf4a7dce7587c2c87c293e3bb7c9e2a7bfa5f29fd4ddeaa5d3f67491d34bd let in288 = CE::< CI<288>, > {}; // 0x2f6cbac694c886b02d0a527cac744fb658d2690e213d7432eee67f6cb69f70c2 let in289 = CE::< CI<289>, > {}; // 0x22accb18b7c49b4b7bb8c9fdf78b7aded52aa1842fff818d9a3300876dec3ad9 let in290 = CE::< CI<290>, > {}; // 0x81e2f0652f898c6d659f22d2c77be302eabd9182a0b3d3cbf623a1df7f8f2fc let in291 = CE::< CI<291>, > {}; // 0x12c0a25e70d006eccea3ada75d669b8c534b962890f3ffc016b3186ad675b935 let in292 = CE::< CI<292>, > {}; // 0x10ef9c23848128cc2fd6fc869df24d7ab56efd349edd56f49f8d4f2381df3259 let in293 = CE::< CI<293>, > {}; // 0x2161cd280772819dd4a81262b71df1bcc2c1d41b9491e0620bda347962b240f0 let in294 = CE::< CI<294>, > {}; // 0x2cebb0ae5108318eb406590041b5248292533364f799bc41b7f4fdd12cb8d38a let in295 = CE::< CI<295>, > {}; // 0x2b2092f86b5979a7fe4f7c22d9561f3bf2852283a656880fb759e08709a0a62f let in296 = CE::< CI<296>, > {}; // 0x1566b3402d774b8c08146188425a442450cfc900cf643e7382b2d8507a065fed let in297 = CE::< CI<297>, > {}; // 0x11a316aa31607f268fb4c56d6c57ba01627c3635fccf8d3d1a163e601d1a0173 let in298 = CE::< CI<298>, > {}; // 0xde7ee069c934256b782648b560e595408a5e8434644609152e353d9c2874e44 let in299 = CE::< CI<299>, > {}; // 0x2d36f4029245704cc84df0297708c5e5845c36ae706c72e67128b8949eab1af let in300 = CE::< CI<300>, > {}; // 0x1b8cc326b5ee160f53198c217fb34e899bde46cd82dabdc284d7951d546f858 let in301 = CE::< CI<301>, > {}; // 0x27625da0f73ea07110689fb2187b71694cbf9203fd4ddf8a96ece85407550ebb let in302 = CE::< CI<302>, > {}; // 0x1cd8338a3e5b1ad7cdc0da581a6950f6dea349c3edda06cb99ba025b94e4790d let in303 = CE::< CI<303>, > {}; // 0x5ea02d65b209f6da763856c94b6438c78a8aed8d3e67e877a10a84072741a56 let in304 = CE::< CI<304>, > {}; // 0x9f7cb68d4e388f85366cfcf284a895d8b6250ced627e810817743ce03330a55 let in305 = CE::< CI<305>, > {}; // 0x18c6230ddc0f896827b043f5e58dbd1aec13995a202e4ebcdfeb969e9d5c1212 let in306 = CE::< CI<306>, > {}; // 0x73a6114b997285e1a91c0a0fdccdaa8452e4f07bfd2e1a10578232096db6dcd let in307 = CE::< CI<307>, > {}; // 0x2e78746340b2a6d222c6a1fc0838adf5fe013f39b1660ce7a3e7742b2f37be7f let in308 = CE::< CI<308>, > {}; // 0x7aa27e7150baddd06303ad8e5e4bf4249b7ea846553def28e675259d3e5c851 let in309 = CE::< CI<309>, > {}; // 0xb66fdec210ea4eabf623d2712cf4d9fa90273ccb4643f680cbc98345715ead8 let in310 = CE::< CI<310>, > {}; // 0x2fb6a29d9f394a589b633b8a4d6be51c9c0601ce0b140be641acea41c49aa5e3 let in311 = CE::< CI<311>, > {}; // 0x29025cc66fd041c4fc845e9c1c2cd1288569fb243d049bd675a69dc889b2ce2a let in312 = CE::< CI<312>, > {}; // 0x150963f0aca9bcbe4126214ab9c627a6f7ed731cfa695168b85d534b17be3f48 let in313 = CE::< CI<313>, > {}; // 0xed59780302257663f72c1bfc6656eb7b5bca2e47bec0d5798a08a32a61a8a65 let in314 = CE::< CI<314>, > {}; // 0x7e19cb8a893369b3d30ae188c767f391c11888a3000debfc8d30c06143cc084 let in315 = CE::< CI<315>, > {}; // 0x600c7d2b6946345e5f1eeeafb5eb8ec2b6ecfe528d2c052cd860afb4a3aa272 let in316 = CE::< CI<316>, > {}; // 0x596083b6c972bc13022a1f33d6523b4773f2cd0a480e19ea0125119f0385705 let in317 = CE::< CI<317>, > {}; // 0x210b5c36f27a07d97f98b9d8663d85db2e64513099a8e1ef6db21043631e24c4 let in318 = CE::< CI<318>, > {}; // 0x13bb2764bf1475cfc7bb9f3d563c5cc201c2489874e9159326a8f4930b7883f9 let in319 = CE::< CI<319>, > {}; // 0x202cf557d625c26080eb082862a76757287872b181e89997219e4b7576e24d30 let in320 = CE::< CI<320>, > {}; // 0xe561c3f8bd4f76e76d49e97142d220601fbc5a03d905a4728ea1f95fd8824b2 let in321 = CE::< CI<321>, > {}; // 0xde20097480e7555471785de07bd9809d57dd859bbe827307c33ae9ed7890597 let in322 = CE::< CI<322>, > {}; // 0x72f2a6287fb984bb810df8c5788eebcfd2825613cb72bb80cde8edd76d2e97d // INPUT stack let (in323, in324) = (CE::> {}, CE::> {}); let t0 = circuit_add(in0, in1); let t1 = circuit_add(in323, in2); let t2 = circuit_add(in324, in3); let t3 = circuit_mul(t0, t0); let t4 = circuit_mul(t3, t3); let t5 = circuit_mul(t4, t0); let t6 = circuit_mul(t1, t1); let t7 = circuit_mul(t6, t6); let t8 = circuit_mul(t7, t1); let t9 = circuit_mul(t2, t2); let t10 = circuit_mul(t9, t9); let t11 = circuit_mul(t10, t2); let t12 = circuit_add(t5, in4); let t13 = circuit_add(t8, in5); let t14 = circuit_add(t11, in6); let t15 = circuit_mul(in82, t12); let t16 = circuit_mul(in85, t13); let t17 = circuit_mul(in88, t14); let t18 = circuit_add(t15, t16); let t19 = circuit_add(t18, t17); let t20 = circuit_mul(in83, t12); let t21 = circuit_mul(in86, t13); let t22 = circuit_mul(in89, t14); let t23 = circuit_add(t20, t21); let t24 = circuit_add(t23, t22); let t25 = circuit_mul(in84, t12); let t26 = circuit_mul(in87, t13); let t27 = circuit_mul(in90, t14); let t28 = circuit_add(t25, t26); let t29 = circuit_add(t28, t27); let t30 = circuit_mul(t19, t19); let t31 = circuit_mul(t30, t30); let t32 = circuit_mul(t31, t19); let t33 = circuit_mul(t24, t24); let t34 = circuit_mul(t33, t33); let t35 = circuit_mul(t34, t24); let t36 = circuit_mul(t29, t29); let t37 = circuit_mul(t36, t36); let t38 = circuit_mul(t37, t29); let t39 = circuit_add(t32, in7); let t40 = circuit_add(t35, in8); let t41 = circuit_add(t38, in9); let t42 = circuit_mul(in82, t39); let t43 = circuit_mul(in85, t40); let t44 = circuit_mul(in88, t41); let t45 = circuit_add(t42, t43); let t46 = circuit_add(t45, t44); let t47 = circuit_mul(in83, t39); let t48 = circuit_mul(in86, t40); let t49 = circuit_mul(in89, t41); let t50 = circuit_add(t47, t48); let t51 = circuit_add(t50, t49); let t52 = circuit_mul(in84, t39); let t53 = circuit_mul(in87, t40); let t54 = circuit_mul(in90, t41); let t55 = circuit_add(t52, t53); let t56 = circuit_add(t55, t54); let t57 = circuit_mul(t46, t46); let t58 = circuit_mul(t57, t57); let t59 = circuit_mul(t58, t46); let t60 = circuit_mul(t51, t51); let t61 = circuit_mul(t60, t60); let t62 = circuit_mul(t61, t51); let t63 = circuit_mul(t56, t56); let t64 = circuit_mul(t63, t63); let t65 = circuit_mul(t64, t56); let t66 = circuit_add(t59, in10); let t67 = circuit_add(t62, in11); let t68 = circuit_add(t65, in12); let t69 = circuit_mul(in82, t66); let t70 = circuit_mul(in85, t67); let t71 = circuit_mul(in88, t68); let t72 = circuit_add(t69, t70); let t73 = circuit_add(t72, t71); let t74 = circuit_mul(in83, t66); let t75 = circuit_mul(in86, t67); let t76 = circuit_mul(in89, t68); let t77 = circuit_add(t74, t75); let t78 = circuit_add(t77, t76); let t79 = circuit_mul(in84, t66); let t80 = circuit_mul(in87, t67); let t81 = circuit_mul(in90, t68); let t82 = circuit_add(t79, t80); let t83 = circuit_add(t82, t81); let t84 = circuit_mul(t73, t73); let t85 = circuit_mul(t84, t84); let t86 = circuit_mul(t85, t73); let t87 = circuit_mul(t78, t78); let t88 = circuit_mul(t87, t87); let t89 = circuit_mul(t88, t78); let t90 = circuit_mul(t83, t83); let t91 = circuit_mul(t90, t90); let t92 = circuit_mul(t91, t83); let t93 = circuit_add(t86, in13); let t94 = circuit_add(t89, in14); let t95 = circuit_add(t92, in15); let t96 = circuit_mul(in82, t93); let t97 = circuit_mul(in85, t94); let t98 = circuit_mul(in88, t95); let t99 = circuit_add(t96, t97); let t100 = circuit_add(t99, t98); let t101 = circuit_mul(in91, t93); let t102 = circuit_mul(in93, t94); let t103 = circuit_mul(in95, t95); let t104 = circuit_add(t101, t102); let t105 = circuit_add(t104, t103); let t106 = circuit_mul(in92, t93); let t107 = circuit_mul(in94, t94); let t108 = circuit_mul(in96, t95); let t109 = circuit_add(t106, t107); let t110 = circuit_add(t109, t108); let t111 = circuit_mul(t100, t100); let t112 = circuit_mul(t111, t111); let t113 = circuit_mul(t112, t100); let t114 = circuit_add(t113, in16); let t115 = circuit_mul(in82, t114); let t116 = circuit_mul(in97, t105); let t117 = circuit_mul(in98, t110); let t118 = circuit_add(t115, t116); let t119 = circuit_add(t118, t117); let t120 = circuit_mul(t114, in99); let t121 = circuit_add(t105, t120); let t122 = circuit_mul(t114, in100); let t123 = circuit_add(t110, t122); let t124 = circuit_mul(t119, t119); let t125 = circuit_mul(t124, t124); let t126 = circuit_mul(t125, t119); let t127 = circuit_add(t126, in17); let t128 = circuit_mul(in82, t127); let t129 = circuit_mul(in101, t121); let t130 = circuit_mul(in102, t123); let t131 = circuit_add(t128, t129); let t132 = circuit_add(t131, t130); let t133 = circuit_mul(t127, in103); let t134 = circuit_add(t121, t133); let t135 = circuit_mul(t127, in104); let t136 = circuit_add(t123, t135); let t137 = circuit_mul(t132, t132); let t138 = circuit_mul(t137, t137); let t139 = circuit_mul(t138, t132); let t140 = circuit_add(t139, in18); let t141 = circuit_mul(in82, t140); let t142 = circuit_mul(in105, t134); let t143 = circuit_mul(in106, t136); let t144 = circuit_add(t141, t142); let t145 = circuit_add(t144, t143); let t146 = circuit_mul(t140, in107); let t147 = circuit_add(t134, t146); let t148 = circuit_mul(t140, in108); let t149 = circuit_add(t136, t148); let t150 = circuit_mul(t145, t145); let t151 = circuit_mul(t150, t150); let t152 = circuit_mul(t151, t145); let t153 = circuit_add(t152, in19); let t154 = circuit_mul(in82, t153); let t155 = circuit_mul(in109, t147); let t156 = circuit_mul(in110, t149); let t157 = circuit_add(t154, t155); let t158 = circuit_add(t157, t156); let t159 = circuit_mul(t153, in111); let t160 = circuit_add(t147, t159); let t161 = circuit_mul(t153, in112); let t162 = circuit_add(t149, t161); let t163 = circuit_mul(t158, t158); let t164 = circuit_mul(t163, t163); let t165 = circuit_mul(t164, t158); let t166 = circuit_add(t165, in20); let t167 = circuit_mul(in82, t166); let t168 = circuit_mul(in113, t160); let t169 = circuit_mul(in114, t162); let t170 = circuit_add(t167, t168); let t171 = circuit_add(t170, t169); let t172 = circuit_mul(t166, in115); let t173 = circuit_add(t160, t172); let t174 = circuit_mul(t166, in116); let t175 = circuit_add(t162, t174); let t176 = circuit_mul(t171, t171); let t177 = circuit_mul(t176, t176); let t178 = circuit_mul(t177, t171); let t179 = circuit_add(t178, in21); let t180 = circuit_mul(in82, t179); let t181 = circuit_mul(in117, t173); let t182 = circuit_mul(in118, t175); let t183 = circuit_add(t180, t181); let t184 = circuit_add(t183, t182); let t185 = circuit_mul(t179, in119); let t186 = circuit_add(t173, t185); let t187 = circuit_mul(t179, in120); let t188 = circuit_add(t175, t187); let t189 = circuit_mul(t184, t184); let t190 = circuit_mul(t189, t189); let t191 = circuit_mul(t190, t184); let t192 = circuit_add(t191, in22); let t193 = circuit_mul(in82, t192); let t194 = circuit_mul(in121, t186); let t195 = circuit_mul(in122, t188); let t196 = circuit_add(t193, t194); let t197 = circuit_add(t196, t195); let t198 = circuit_mul(t192, in123); let t199 = circuit_add(t186, t198); let t200 = circuit_mul(t192, in124); let t201 = circuit_add(t188, t200); let t202 = circuit_mul(t197, t197); let t203 = circuit_mul(t202, t202); let t204 = circuit_mul(t203, t197); let t205 = circuit_add(t204, in23); let t206 = circuit_mul(in82, t205); let t207 = circuit_mul(in125, t199); let t208 = circuit_mul(in126, t201); let t209 = circuit_add(t206, t207); let t210 = circuit_add(t209, t208); let t211 = circuit_mul(t205, in127); let t212 = circuit_add(t199, t211); let t213 = circuit_mul(t205, in128); let t214 = circuit_add(t201, t213); let t215 = circuit_mul(t210, t210); let t216 = circuit_mul(t215, t215); let t217 = circuit_mul(t216, t210); let t218 = circuit_add(t217, in24); let t219 = circuit_mul(in82, t218); let t220 = circuit_mul(in129, t212); let t221 = circuit_mul(in130, t214); let t222 = circuit_add(t219, t220); let t223 = circuit_add(t222, t221); let t224 = circuit_mul(t218, in131); let t225 = circuit_add(t212, t224); let t226 = circuit_mul(t218, in132); let t227 = circuit_add(t214, t226); let t228 = circuit_mul(t223, t223); let t229 = circuit_mul(t228, t228); let t230 = circuit_mul(t229, t223); let t231 = circuit_add(t230, in25); let t232 = circuit_mul(in82, t231); let t233 = circuit_mul(in133, t225); let t234 = circuit_mul(in134, t227); let t235 = circuit_add(t232, t233); let t236 = circuit_add(t235, t234); let t237 = circuit_mul(t231, in135); let t238 = circuit_add(t225, t237); let t239 = circuit_mul(t231, in136); let t240 = circuit_add(t227, t239); let t241 = circuit_mul(t236, t236); let t242 = circuit_mul(t241, t241); let t243 = circuit_mul(t242, t236); let t244 = circuit_add(t243, in26); let t245 = circuit_mul(in82, t244); let t246 = circuit_mul(in137, t238); let t247 = circuit_mul(in138, t240); let t248 = circuit_add(t245, t246); let t249 = circuit_add(t248, t247); let t250 = circuit_mul(t244, in139); let t251 = circuit_add(t238, t250); let t252 = circuit_mul(t244, in140); let t253 = circuit_add(t240, t252); let t254 = circuit_mul(t249, t249); let t255 = circuit_mul(t254, t254); let t256 = circuit_mul(t255, t249); let t257 = circuit_add(t256, in27); let t258 = circuit_mul(in82, t257); let t259 = circuit_mul(in141, t251); let t260 = circuit_mul(in142, t253); let t261 = circuit_add(t258, t259); let t262 = circuit_add(t261, t260); let t263 = circuit_mul(t257, in143); let t264 = circuit_add(t251, t263); let t265 = circuit_mul(t257, in144); let t266 = circuit_add(t253, t265); let t267 = circuit_mul(t262, t262); let t268 = circuit_mul(t267, t267); let t269 = circuit_mul(t268, t262); let t270 = circuit_add(t269, in28); let t271 = circuit_mul(in82, t270); let t272 = circuit_mul(in145, t264); let t273 = circuit_mul(in146, t266); let t274 = circuit_add(t271, t272); let t275 = circuit_add(t274, t273); let t276 = circuit_mul(t270, in147); let t277 = circuit_add(t264, t276); let t278 = circuit_mul(t270, in148); let t279 = circuit_add(t266, t278); let t280 = circuit_mul(t275, t275); let t281 = circuit_mul(t280, t280); let t282 = circuit_mul(t281, t275); let t283 = circuit_add(t282, in29); let t284 = circuit_mul(in82, t283); let t285 = circuit_mul(in149, t277); let t286 = circuit_mul(in150, t279); let t287 = circuit_add(t284, t285); let t288 = circuit_add(t287, t286); let t289 = circuit_mul(t283, in151); let t290 = circuit_add(t277, t289); let t291 = circuit_mul(t283, in152); let t292 = circuit_add(t279, t291); let t293 = circuit_mul(t288, t288); let t294 = circuit_mul(t293, t293); let t295 = circuit_mul(t294, t288); let t296 = circuit_add(t295, in30); let t297 = circuit_mul(in82, t296); let t298 = circuit_mul(in153, t290); let t299 = circuit_mul(in154, t292); let t300 = circuit_add(t297, t298); let t301 = circuit_add(t300, t299); let t302 = circuit_mul(t296, in155); let t303 = circuit_add(t290, t302); let t304 = circuit_mul(t296, in156); let t305 = circuit_add(t292, t304); let t306 = circuit_mul(t301, t301); let t307 = circuit_mul(t306, t306); let t308 = circuit_mul(t307, t301); let t309 = circuit_add(t308, in31); let t310 = circuit_mul(in82, t309); let t311 = circuit_mul(in157, t303); let t312 = circuit_mul(in158, t305); let t313 = circuit_add(t310, t311); let t314 = circuit_add(t313, t312); let t315 = circuit_mul(t309, in159); let t316 = circuit_add(t303, t315); let t317 = circuit_mul(t309, in160); let t318 = circuit_add(t305, t317); let t319 = circuit_mul(t314, t314); let t320 = circuit_mul(t319, t319); let t321 = circuit_mul(t320, t314); let t322 = circuit_add(t321, in32); let t323 = circuit_mul(in82, t322); let t324 = circuit_mul(in161, t316); let t325 = circuit_mul(in162, t318); let t326 = circuit_add(t323, t324); let t327 = circuit_add(t326, t325); let t328 = circuit_mul(t322, in163); let t329 = circuit_add(t316, t328); let t330 = circuit_mul(t322, in164); let t331 = circuit_add(t318, t330); let t332 = circuit_mul(t327, t327); let t333 = circuit_mul(t332, t332); let t334 = circuit_mul(t333, t327); let t335 = circuit_add(t334, in33); let t336 = circuit_mul(in82, t335); let t337 = circuit_mul(in165, t329); let t338 = circuit_mul(in166, t331); let t339 = circuit_add(t336, t337); let t340 = circuit_add(t339, t338); let t341 = circuit_mul(t335, in167); let t342 = circuit_add(t329, t341); let t343 = circuit_mul(t335, in168); let t344 = circuit_add(t331, t343); let t345 = circuit_mul(t340, t340); let t346 = circuit_mul(t345, t345); let t347 = circuit_mul(t346, t340); let t348 = circuit_add(t347, in34); let t349 = circuit_mul(in82, t348); let t350 = circuit_mul(in169, t342); let t351 = circuit_mul(in170, t344); let t352 = circuit_add(t349, t350); let t353 = circuit_add(t352, t351); let t354 = circuit_mul(t348, in171); let t355 = circuit_add(t342, t354); let t356 = circuit_mul(t348, in172); let t357 = circuit_add(t344, t356); let t358 = circuit_mul(t353, t353); let t359 = circuit_mul(t358, t358); let t360 = circuit_mul(t359, t353); let t361 = circuit_add(t360, in35); let t362 = circuit_mul(in82, t361); let t363 = circuit_mul(in173, t355); let t364 = circuit_mul(in174, t357); let t365 = circuit_add(t362, t363); let t366 = circuit_add(t365, t364); let t367 = circuit_mul(t361, in175); let t368 = circuit_add(t355, t367); let t369 = circuit_mul(t361, in176); let t370 = circuit_add(t357, t369); let t371 = circuit_mul(t366, t366); let t372 = circuit_mul(t371, t371); let t373 = circuit_mul(t372, t366); let t374 = circuit_add(t373, in36); let t375 = circuit_mul(in82, t374); let t376 = circuit_mul(in177, t368); let t377 = circuit_mul(in178, t370); let t378 = circuit_add(t375, t376); let t379 = circuit_add(t378, t377); let t380 = circuit_mul(t374, in179); let t381 = circuit_add(t368, t380); let t382 = circuit_mul(t374, in180); let t383 = circuit_add(t370, t382); let t384 = circuit_mul(t379, t379); let t385 = circuit_mul(t384, t384); let t386 = circuit_mul(t385, t379); let t387 = circuit_add(t386, in37); let t388 = circuit_mul(in82, t387); let t389 = circuit_mul(in181, t381); let t390 = circuit_mul(in182, t383); let t391 = circuit_add(t388, t389); let t392 = circuit_add(t391, t390); let t393 = circuit_mul(t387, in183); let t394 = circuit_add(t381, t393); let t395 = circuit_mul(t387, in184); let t396 = circuit_add(t383, t395); let t397 = circuit_mul(t392, t392); let t398 = circuit_mul(t397, t397); let t399 = circuit_mul(t398, t392); let t400 = circuit_add(t399, in38); let t401 = circuit_mul(in82, t400); let t402 = circuit_mul(in185, t394); let t403 = circuit_mul(in186, t396); let t404 = circuit_add(t401, t402); let t405 = circuit_add(t404, t403); let t406 = circuit_mul(t400, in187); let t407 = circuit_add(t394, t406); let t408 = circuit_mul(t400, in188); let t409 = circuit_add(t396, t408); let t410 = circuit_mul(t405, t405); let t411 = circuit_mul(t410, t410); let t412 = circuit_mul(t411, t405); let t413 = circuit_add(t412, in39); let t414 = circuit_mul(in82, t413); let t415 = circuit_mul(in189, t407); let t416 = circuit_mul(in190, t409); let t417 = circuit_add(t414, t415); let t418 = circuit_add(t417, t416); let t419 = circuit_mul(t413, in191); let t420 = circuit_add(t407, t419); let t421 = circuit_mul(t413, in192); let t422 = circuit_add(t409, t421); let t423 = circuit_mul(t418, t418); let t424 = circuit_mul(t423, t423); let t425 = circuit_mul(t424, t418); let t426 = circuit_add(t425, in40); let t427 = circuit_mul(in82, t426); let t428 = circuit_mul(in193, t420); let t429 = circuit_mul(in194, t422); let t430 = circuit_add(t427, t428); let t431 = circuit_add(t430, t429); let t432 = circuit_mul(t426, in195); let t433 = circuit_add(t420, t432); let t434 = circuit_mul(t426, in196); let t435 = circuit_add(t422, t434); let t436 = circuit_mul(t431, t431); let t437 = circuit_mul(t436, t436); let t438 = circuit_mul(t437, t431); let t439 = circuit_add(t438, in41); let t440 = circuit_mul(in82, t439); let t441 = circuit_mul(in197, t433); let t442 = circuit_mul(in198, t435); let t443 = circuit_add(t440, t441); let t444 = circuit_add(t443, t442); let t445 = circuit_mul(t439, in199); let t446 = circuit_add(t433, t445); let t447 = circuit_mul(t439, in200); let t448 = circuit_add(t435, t447); let t449 = circuit_mul(t444, t444); let t450 = circuit_mul(t449, t449); let t451 = circuit_mul(t450, t444); let t452 = circuit_add(t451, in42); let t453 = circuit_mul(in82, t452); let t454 = circuit_mul(in201, t446); let t455 = circuit_mul(in202, t448); let t456 = circuit_add(t453, t454); let t457 = circuit_add(t456, t455); let t458 = circuit_mul(t452, in203); let t459 = circuit_add(t446, t458); let t460 = circuit_mul(t452, in204); let t461 = circuit_add(t448, t460); let t462 = circuit_mul(t457, t457); let t463 = circuit_mul(t462, t462); let t464 = circuit_mul(t463, t457); let t465 = circuit_add(t464, in43); let t466 = circuit_mul(in82, t465); let t467 = circuit_mul(in205, t459); let t468 = circuit_mul(in206, t461); let t469 = circuit_add(t466, t467); let t470 = circuit_add(t469, t468); let t471 = circuit_mul(t465, in207); let t472 = circuit_add(t459, t471); let t473 = circuit_mul(t465, in208); let t474 = circuit_add(t461, t473); let t475 = circuit_mul(t470, t470); let t476 = circuit_mul(t475, t475); let t477 = circuit_mul(t476, t470); let t478 = circuit_add(t477, in44); let t479 = circuit_mul(in82, t478); let t480 = circuit_mul(in209, t472); let t481 = circuit_mul(in210, t474); let t482 = circuit_add(t479, t480); let t483 = circuit_add(t482, t481); let t484 = circuit_mul(t478, in211); let t485 = circuit_add(t472, t484); let t486 = circuit_mul(t478, in212); let t487 = circuit_add(t474, t486); let t488 = circuit_mul(t483, t483); let t489 = circuit_mul(t488, t488); let t490 = circuit_mul(t489, t483); let t491 = circuit_add(t490, in45); let t492 = circuit_mul(in82, t491); let t493 = circuit_mul(in213, t485); let t494 = circuit_mul(in214, t487); let t495 = circuit_add(t492, t493); let t496 = circuit_add(t495, t494); let t497 = circuit_mul(t491, in215); let t498 = circuit_add(t485, t497); let t499 = circuit_mul(t491, in216); let t500 = circuit_add(t487, t499); let t501 = circuit_mul(t496, t496); let t502 = circuit_mul(t501, t501); let t503 = circuit_mul(t502, t496); let t504 = circuit_add(t503, in46); let t505 = circuit_mul(in82, t504); let t506 = circuit_mul(in217, t498); let t507 = circuit_mul(in218, t500); let t508 = circuit_add(t505, t506); let t509 = circuit_add(t508, t507); let t510 = circuit_mul(t504, in219); let t511 = circuit_add(t498, t510); let t512 = circuit_mul(t504, in220); let t513 = circuit_add(t500, t512); let t514 = circuit_mul(t509, t509); let t515 = circuit_mul(t514, t514); let t516 = circuit_mul(t515, t509); let t517 = circuit_add(t516, in47); let t518 = circuit_mul(in82, t517); let t519 = circuit_mul(in221, t511); let t520 = circuit_mul(in222, t513); let t521 = circuit_add(t518, t519); let t522 = circuit_add(t521, t520); let t523 = circuit_mul(t517, in223); let t524 = circuit_add(t511, t523); let t525 = circuit_mul(t517, in224); let t526 = circuit_add(t513, t525); let t527 = circuit_mul(t522, t522); let t528 = circuit_mul(t527, t527); let t529 = circuit_mul(t528, t522); let t530 = circuit_add(t529, in48); let t531 = circuit_mul(in82, t530); let t532 = circuit_mul(in225, t524); let t533 = circuit_mul(in226, t526); let t534 = circuit_add(t531, t532); let t535 = circuit_add(t534, t533); let t536 = circuit_mul(t530, in227); let t537 = circuit_add(t524, t536); let t538 = circuit_mul(t530, in228); let t539 = circuit_add(t526, t538); let t540 = circuit_mul(t535, t535); let t541 = circuit_mul(t540, t540); let t542 = circuit_mul(t541, t535); let t543 = circuit_add(t542, in49); let t544 = circuit_mul(in82, t543); let t545 = circuit_mul(in229, t537); let t546 = circuit_mul(in230, t539); let t547 = circuit_add(t544, t545); let t548 = circuit_add(t547, t546); let t549 = circuit_mul(t543, in231); let t550 = circuit_add(t537, t549); let t551 = circuit_mul(t543, in232); let t552 = circuit_add(t539, t551); let t553 = circuit_mul(t548, t548); let t554 = circuit_mul(t553, t553); let t555 = circuit_mul(t554, t548); let t556 = circuit_add(t555, in50); let t557 = circuit_mul(in82, t556); let t558 = circuit_mul(in233, t550); let t559 = circuit_mul(in234, t552); let t560 = circuit_add(t557, t558); let t561 = circuit_add(t560, t559); let t562 = circuit_mul(t556, in235); let t563 = circuit_add(t550, t562); let t564 = circuit_mul(t556, in236); let t565 = circuit_add(t552, t564); let t566 = circuit_mul(t561, t561); let t567 = circuit_mul(t566, t566); let t568 = circuit_mul(t567, t561); let t569 = circuit_add(t568, in51); let t570 = circuit_mul(in82, t569); let t571 = circuit_mul(in237, t563); let t572 = circuit_mul(in238, t565); let t573 = circuit_add(t570, t571); let t574 = circuit_add(t573, t572); let t575 = circuit_mul(t569, in239); let t576 = circuit_add(t563, t575); let t577 = circuit_mul(t569, in240); let t578 = circuit_add(t565, t577); let t579 = circuit_mul(t574, t574); let t580 = circuit_mul(t579, t579); let t581 = circuit_mul(t580, t574); let t582 = circuit_add(t581, in52); let t583 = circuit_mul(in82, t582); let t584 = circuit_mul(in241, t576); let t585 = circuit_mul(in242, t578); let t586 = circuit_add(t583, t584); let t587 = circuit_add(t586, t585); let t588 = circuit_mul(t582, in243); let t589 = circuit_add(t576, t588); let t590 = circuit_mul(t582, in244); let t591 = circuit_add(t578, t590); let t592 = circuit_mul(t587, t587); let t593 = circuit_mul(t592, t592); let t594 = circuit_mul(t593, t587); let t595 = circuit_add(t594, in53); let t596 = circuit_mul(in82, t595); let t597 = circuit_mul(in245, t589); let t598 = circuit_mul(in246, t591); let t599 = circuit_add(t596, t597); let t600 = circuit_add(t599, t598); let t601 = circuit_mul(t595, in247); let t602 = circuit_add(t589, t601); let t603 = circuit_mul(t595, in248); let t604 = circuit_add(t591, t603); let t605 = circuit_mul(t600, t600); let t606 = circuit_mul(t605, t605); let t607 = circuit_mul(t606, t600); let t608 = circuit_add(t607, in54); let t609 = circuit_mul(in82, t608); let t610 = circuit_mul(in249, t602); let t611 = circuit_mul(in250, t604); let t612 = circuit_add(t609, t610); let t613 = circuit_add(t612, t611); let t614 = circuit_mul(t608, in251); let t615 = circuit_add(t602, t614); let t616 = circuit_mul(t608, in252); let t617 = circuit_add(t604, t616); let t618 = circuit_mul(t613, t613); let t619 = circuit_mul(t618, t618); let t620 = circuit_mul(t619, t613); let t621 = circuit_add(t620, in55); let t622 = circuit_mul(in82, t621); let t623 = circuit_mul(in253, t615); let t624 = circuit_mul(in254, t617); let t625 = circuit_add(t622, t623); let t626 = circuit_add(t625, t624); let t627 = circuit_mul(t621, in255); let t628 = circuit_add(t615, t627); let t629 = circuit_mul(t621, in256); let t630 = circuit_add(t617, t629); let t631 = circuit_mul(t626, t626); let t632 = circuit_mul(t631, t631); let t633 = circuit_mul(t632, t626); let t634 = circuit_add(t633, in56); let t635 = circuit_mul(in82, t634); let t636 = circuit_mul(in257, t628); let t637 = circuit_mul(in258, t630); let t638 = circuit_add(t635, t636); let t639 = circuit_add(t638, t637); let t640 = circuit_mul(t634, in259); let t641 = circuit_add(t628, t640); let t642 = circuit_mul(t634, in260); let t643 = circuit_add(t630, t642); let t644 = circuit_mul(t639, t639); let t645 = circuit_mul(t644, t644); let t646 = circuit_mul(t645, t639); let t647 = circuit_add(t646, in57); let t648 = circuit_mul(in82, t647); let t649 = circuit_mul(in261, t641); let t650 = circuit_mul(in262, t643); let t651 = circuit_add(t648, t649); let t652 = circuit_add(t651, t650); let t653 = circuit_mul(t647, in263); let t654 = circuit_add(t641, t653); let t655 = circuit_mul(t647, in264); let t656 = circuit_add(t643, t655); let t657 = circuit_mul(t652, t652); let t658 = circuit_mul(t657, t657); let t659 = circuit_mul(t658, t652); let t660 = circuit_add(t659, in58); let t661 = circuit_mul(in82, t660); let t662 = circuit_mul(in265, t654); let t663 = circuit_mul(in266, t656); let t664 = circuit_add(t661, t662); let t665 = circuit_add(t664, t663); let t666 = circuit_mul(t660, in267); let t667 = circuit_add(t654, t666); let t668 = circuit_mul(t660, in268); let t669 = circuit_add(t656, t668); let t670 = circuit_mul(t665, t665); let t671 = circuit_mul(t670, t670); let t672 = circuit_mul(t671, t665); let t673 = circuit_add(t672, in59); let t674 = circuit_mul(in82, t673); let t675 = circuit_mul(in269, t667); let t676 = circuit_mul(in270, t669); let t677 = circuit_add(t674, t675); let t678 = circuit_add(t677, t676); let t679 = circuit_mul(t673, in271); let t680 = circuit_add(t667, t679); let t681 = circuit_mul(t673, in272); let t682 = circuit_add(t669, t681); let t683 = circuit_mul(t678, t678); let t684 = circuit_mul(t683, t683); let t685 = circuit_mul(t684, t678); let t686 = circuit_add(t685, in60); let t687 = circuit_mul(in82, t686); let t688 = circuit_mul(in273, t680); let t689 = circuit_mul(in274, t682); let t690 = circuit_add(t687, t688); let t691 = circuit_add(t690, t689); let t692 = circuit_mul(t686, in275); let t693 = circuit_add(t680, t692); let t694 = circuit_mul(t686, in276); let t695 = circuit_add(t682, t694); let t696 = circuit_mul(t691, t691); let t697 = circuit_mul(t696, t696); let t698 = circuit_mul(t697, t691); let t699 = circuit_add(t698, in61); let t700 = circuit_mul(in82, t699); let t701 = circuit_mul(in277, t693); let t702 = circuit_mul(in278, t695); let t703 = circuit_add(t700, t701); let t704 = circuit_add(t703, t702); let t705 = circuit_mul(t699, in279); let t706 = circuit_add(t693, t705); let t707 = circuit_mul(t699, in280); let t708 = circuit_add(t695, t707); let t709 = circuit_mul(t704, t704); let t710 = circuit_mul(t709, t709); let t711 = circuit_mul(t710, t704); let t712 = circuit_add(t711, in62); let t713 = circuit_mul(in82, t712); let t714 = circuit_mul(in281, t706); let t715 = circuit_mul(in282, t708); let t716 = circuit_add(t713, t714); let t717 = circuit_add(t716, t715); let t718 = circuit_mul(t712, in283); let t719 = circuit_add(t706, t718); let t720 = circuit_mul(t712, in284); let t721 = circuit_add(t708, t720); let t722 = circuit_mul(t717, t717); let t723 = circuit_mul(t722, t722); let t724 = circuit_mul(t723, t717); let t725 = circuit_add(t724, in63); let t726 = circuit_mul(in82, t725); let t727 = circuit_mul(in285, t719); let t728 = circuit_mul(in286, t721); let t729 = circuit_add(t726, t727); let t730 = circuit_add(t729, t728); let t731 = circuit_mul(t725, in287); let t732 = circuit_add(t719, t731); let t733 = circuit_mul(t725, in288); let t734 = circuit_add(t721, t733); let t735 = circuit_mul(t730, t730); let t736 = circuit_mul(t735, t735); let t737 = circuit_mul(t736, t730); let t738 = circuit_add(t737, in64); let t739 = circuit_mul(in82, t738); let t740 = circuit_mul(in289, t732); let t741 = circuit_mul(in290, t734); let t742 = circuit_add(t739, t740); let t743 = circuit_add(t742, t741); let t744 = circuit_mul(t738, in291); let t745 = circuit_add(t732, t744); let t746 = circuit_mul(t738, in292); let t747 = circuit_add(t734, t746); let t748 = circuit_mul(t743, t743); let t749 = circuit_mul(t748, t748); let t750 = circuit_mul(t749, t743); let t751 = circuit_add(t750, in65); let t752 = circuit_mul(in82, t751); let t753 = circuit_mul(in293, t745); let t754 = circuit_mul(in294, t747); let t755 = circuit_add(t752, t753); let t756 = circuit_add(t755, t754); let t757 = circuit_mul(t751, in295); let t758 = circuit_add(t745, t757); let t759 = circuit_mul(t751, in296); let t760 = circuit_add(t747, t759); let t761 = circuit_mul(t756, t756); let t762 = circuit_mul(t761, t761); let t763 = circuit_mul(t762, t756); let t764 = circuit_add(t763, in66); let t765 = circuit_mul(in82, t764); let t766 = circuit_mul(in297, t758); let t767 = circuit_mul(in298, t760); let t768 = circuit_add(t765, t766); let t769 = circuit_add(t768, t767); let t770 = circuit_mul(t764, in299); let t771 = circuit_add(t758, t770); let t772 = circuit_mul(t764, in300); let t773 = circuit_add(t760, t772); let t774 = circuit_mul(t769, t769); let t775 = circuit_mul(t774, t774); let t776 = circuit_mul(t775, t769); let t777 = circuit_add(t776, in67); let t778 = circuit_mul(in82, t777); let t779 = circuit_mul(in301, t771); let t780 = circuit_mul(in302, t773); let t781 = circuit_add(t778, t779); let t782 = circuit_add(t781, t780); let t783 = circuit_mul(t777, in303); let t784 = circuit_add(t771, t783); let t785 = circuit_mul(t777, in304); let t786 = circuit_add(t773, t785); let t787 = circuit_mul(t782, t782); let t788 = circuit_mul(t787, t787); let t789 = circuit_mul(t788, t782); let t790 = circuit_add(t789, in68); let t791 = circuit_mul(in82, t790); let t792 = circuit_mul(in305, t784); let t793 = circuit_mul(in306, t786); let t794 = circuit_add(t791, t792); let t795 = circuit_add(t794, t793); let t796 = circuit_mul(t790, in307); let t797 = circuit_add(t784, t796); let t798 = circuit_mul(t790, in308); let t799 = circuit_add(t786, t798); let t800 = circuit_mul(t795, t795); let t801 = circuit_mul(t800, t800); let t802 = circuit_mul(t801, t795); let t803 = circuit_add(t802, in69); let t804 = circuit_mul(in82, t803); let t805 = circuit_mul(in309, t797); let t806 = circuit_mul(in310, t799); let t807 = circuit_add(t804, t805); let t808 = circuit_add(t807, t806); let t809 = circuit_mul(t803, in311); let t810 = circuit_add(t797, t809); let t811 = circuit_mul(t803, in312); let t812 = circuit_add(t799, t811); let t813 = circuit_mul(t808, t808); let t814 = circuit_mul(t813, t813); let t815 = circuit_mul(t814, t808); let t816 = circuit_add(t815, in70); let t817 = circuit_mul(in82, t816); let t818 = circuit_mul(in313, t810); let t819 = circuit_mul(in314, t812); let t820 = circuit_add(t817, t818); let t821 = circuit_add(t820, t819); let t822 = circuit_mul(t816, in315); let t823 = circuit_add(t810, t822); let t824 = circuit_mul(t816, in316); let t825 = circuit_add(t812, t824); let t826 = circuit_mul(t821, t821); let t827 = circuit_mul(t826, t826); let t828 = circuit_mul(t827, t821); let t829 = circuit_add(t828, in71); let t830 = circuit_mul(in82, t829); let t831 = circuit_mul(in317, t823); let t832 = circuit_mul(in318, t825); let t833 = circuit_add(t830, t831); let t834 = circuit_add(t833, t832); let t835 = circuit_mul(t829, in319); let t836 = circuit_add(t823, t835); let t837 = circuit_mul(t829, in320); let t838 = circuit_add(t825, t837); let t839 = circuit_mul(t834, t834); let t840 = circuit_mul(t839, t839); let t841 = circuit_mul(t840, t834); let t842 = circuit_add(t841, in72); let t843 = circuit_mul(in82, t842); let t844 = circuit_mul(in321, t836); let t845 = circuit_mul(in322, t838); let t846 = circuit_add(t843, t844); let t847 = circuit_add(t846, t845); let t848 = circuit_mul(t842, in83); let t849 = circuit_add(t836, t848); let t850 = circuit_mul(t842, in84); let t851 = circuit_add(t838, t850); let t852 = circuit_mul(t847, t847); let t853 = circuit_mul(t852, t852); let t854 = circuit_mul(t853, t847); let t855 = circuit_mul(t849, t849); let t856 = circuit_mul(t855, t855); let t857 = circuit_mul(t856, t849); let t858 = circuit_mul(t851, t851); let t859 = circuit_mul(t858, t858); let t860 = circuit_mul(t859, t851); let t861 = circuit_add(t854, in73); let t862 = circuit_add(t857, in74); let t863 = circuit_add(t860, in75); let t864 = circuit_mul(in82, t861); let t865 = circuit_mul(in85, t862); let t866 = circuit_mul(in88, t863); let t867 = circuit_add(t864, t865); let t868 = circuit_add(t867, t866); let t869 = circuit_mul(in83, t861); let t870 = circuit_mul(in86, t862); let t871 = circuit_mul(in89, t863); let t872 = circuit_add(t869, t870); let t873 = circuit_add(t872, t871); let t874 = circuit_mul(in84, t861); let t875 = circuit_mul(in87, t862); let t876 = circuit_mul(in90, t863); let t877 = circuit_add(t874, t875); let t878 = circuit_add(t877, t876); let t879 = circuit_mul(t868, t868); let t880 = circuit_mul(t879, t879); let t881 = circuit_mul(t880, t868); let t882 = circuit_mul(t873, t873); let t883 = circuit_mul(t882, t882); let t884 = circuit_mul(t883, t873); let t885 = circuit_mul(t878, t878); let t886 = circuit_mul(t885, t885); let t887 = circuit_mul(t886, t878); let t888 = circuit_add(t881, in76); let t889 = circuit_add(t884, in77); let t890 = circuit_add(t887, in78); let t891 = circuit_mul(in82, t888); let t892 = circuit_mul(in85, t889); let t893 = circuit_mul(in88, t890); let t894 = circuit_add(t891, t892); let t895 = circuit_add(t894, t893); let t896 = circuit_mul(in83, t888); let t897 = circuit_mul(in86, t889); let t898 = circuit_mul(in89, t890); let t899 = circuit_add(t896, t897); let t900 = circuit_add(t899, t898); let t901 = circuit_mul(in84, t888); let t902 = circuit_mul(in87, t889); let t903 = circuit_mul(in90, t890); let t904 = circuit_add(t901, t902); let t905 = circuit_add(t904, t903); let t906 = circuit_mul(t895, t895); let t907 = circuit_mul(t906, t906); let t908 = circuit_mul(t907, t895); let t909 = circuit_mul(t900, t900); let t910 = circuit_mul(t909, t909); let t911 = circuit_mul(t910, t900); let t912 = circuit_mul(t905, t905); let t913 = circuit_mul(t912, t912); let t914 = circuit_mul(t913, t905); let t915 = circuit_add(t908, in79); let t916 = circuit_add(t911, in80); let t917 = circuit_add(t914, in81); let t918 = circuit_mul(in82, t915); let t919 = circuit_mul(in85, t916); let t920 = circuit_mul(in88, t917); let t921 = circuit_add(t918, t919); let t922 = circuit_add(t921, t920); let t923 = circuit_mul(in83, t915); let t924 = circuit_mul(in86, t916); let t925 = circuit_mul(in89, t917); let t926 = circuit_add(t923, t924); let t927 = circuit_add(t926, t925); let t928 = circuit_mul(in84, t915); let t929 = circuit_mul(in87, t916); let t930 = circuit_mul(in90, t917); let t931 = circuit_add(t928, t929); let t932 = circuit_add(t931, t930); let t933 = circuit_mul(t922, t922); let t934 = circuit_mul(t933, t933); let t935 = circuit_mul(t934, t922); let t936 = circuit_mul(t927, t927); let t937 = circuit_mul(t936, t936); let t938 = circuit_mul(t937, t927); let t939 = circuit_mul(t932, t932); let t940 = circuit_mul(t939, t939); let t941 = circuit_mul(t940, t932); let t942 = circuit_mul(in82, t935); let t943 = circuit_mul(in85, t938); let t944 = circuit_mul(in88, t941); let t945 = circuit_add(t942, t943); let t946 = circuit_add(t945, t944); let modulus = get_GRUMPKIN_modulus(); // GRUMPKIN prime field modulus let mut circuit_inputs = (t946,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs .next_span(POSEIDON_GRUMPKIN_GRUMPKIN_CONSTANTS.span()); // in0 - in322 // Fill inputs: circuit_inputs = circuit_inputs.next_2(x); // in323 circuit_inputs = circuit_inputs.next_2(y); // in324 let outputs = circuit_inputs.done_2().eval(modulus).unwrap(); let z: u384 = outputs.get_output(t946); return z; } const POSEIDON_GRUMPKIN_GRUMPKIN_CONSTANTS: [u384; 323] = [ u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x11bb29938d21d47304cd8e6e, limb1: 0xd05986d656f40c2114c4993c, limb2: 0xee9a592ba9a9518, limb3: 0x0, }, u384 { limb0: 0xd00868df5696fff40956e864, limb1: 0x5986587169fc1bcd887b08d4, limb2: 0xf1445235f2148c, limb3: 0x0, }, u384 { limb0: 0xb7ab36ce879f3890ecf73f5, limb1: 0x1f29a058d0fa80b930c72873, limb2: 0x8dff3487e8ac99e, limb3: 0x0, }, u384 { limb0: 0xdae2d00ca8ef88ceea2b0197, limb1: 0xe1f9075cb7c490efa59565ee, limb2: 0x84d520e4e5bb469, limb3: 0x0, }, u384 { limb0: 0x2f9f15d8eb3e767ae0fd811e, limb1: 0x33da56722416fd734b3e667a, limb2: 0x2d15d982d99577fa, limb3: 0x0, }, u384 { limb0: 0x36a5996d0efbe65632c41b6d, limb1: 0xcf1578a43cf0364e91601f65, limb2: 0xed2538844aba161, limb3: 0x0, }, u384 { limb0: 0x829b735dcc3e3af02955e60a, limb1: 0x86e739e6363c71cf804c877d, limb2: 0x2600c27d879fbca1, limb3: 0x0, }, u384 { limb0: 0x7440dfd970058558282bf2c5, limb1: 0x475bd15396430e7ccb99a551, limb2: 0x28f8bd44a583cbaa, limb3: 0x0, }, u384 { limb0: 0xf697a5572d030c55df153221, limb1: 0x8781aad012e7eaef1ed314d7, limb2: 0x9cd7d4c380dc548, limb3: 0x0, }, u384 { limb0: 0xbe82234951e2bee7d0f855f5, limb1: 0x6120ecaace460d24b6713fe, limb2: 0x11bb6ee1291aabb2, limb3: 0x0, }, u384 { limb0: 0xf5b8fd05349cadeecfceb230, limb1: 0x3310f3c0e3fae1d06f171580, limb2: 0x2d74e8fa0637d985, limb3: 0x0, }, u384 { limb0: 0xa511a18be4b4d316ed889033, limb1: 0xac9bef31bacba338b1a09559, limb2: 0x2735e4ec9d39bdff, limb3: 0x0, }, u384 { limb0: 0x826e08dcf617e24213132dfd, limb1: 0xa5da6312faa78e971106c33f, limb2: 0xf03c1e9e0895db1, limb3: 0x0, }, u384 { limb0: 0x8f777811848a7e9ead6778c4, limb1: 0xaf92920205b719c18741090b, limb2: 0x17094cd297bf827c, limb3: 0x0, }, u384 { limb0: 0x178042c81ba7d4b4d559e2b8, limb1: 0x1fc2b3219465798348df90d4, limb2: 0xdb8f419c21f9246, limb3: 0x0, }, u384 { limb0: 0xb9ca1724a22709ceceeece2, limb1: 0x17427ed5933fcfbc66809db6, limb2: 0x243443613f64ffa4, limb3: 0x0, }, u384 { limb0: 0xeecd03aa04bb191fada75411, limb1: 0xcd256c25c07d3dd8ecbbae6d, limb2: 0x22af49fbfd5d7e9f, limb3: 0x0, }, u384 { limb0: 0xb4327323f7f7c097c19420e0, limb1: 0xc78a20d93c7230c4677f797, limb2: 0x14fbd37fa8ad6e4e, limb3: 0x0, }, u384 { limb0: 0xb3f3e1ea22faa7e18b5ae625, limb1: 0xd4b2c9fbc6e4ef4189420c4e, limb2: 0x15a9298bbb882534, limb3: 0x0, }, u384 { limb0: 0x854e75434c2f1d90562232bc, limb1: 0x221323ebceb2f2ac83eef92e, limb2: 0x2f7de75f23ddaaa5, limb3: 0x0, }, u384 { limb0: 0xf9e9b2e623584f7479cd5c27, limb1: 0x78a315e84c4ae5aeca216f2f, limb2: 0x36a4432a868283b, limb3: 0x0, }, u384 { limb0: 0x2f11e860ae1c5682c797de5c, limb1: 0xe277218ab14a11e5e39f3c96, limb2: 0x2180d7786a8cf810, limb3: 0x0, }, u384 { limb0: 0x84cc03ce53572377eefff8e4, limb1: 0xd0cb55be640d73ee37789904, limb2: 0xa268ef870736eeb, limb3: 0x0, }, u384 { limb0: 0xc90e09069df9bae16809a5b2, limb1: 0x4f2999031f15994829e982e8, limb2: 0x1eefefe11c0be466, limb3: 0x0, }, u384 { limb0: 0x9a1129946571a3c3cf244c52, limb1: 0x9ca596e8cb77fe3a4b8fb93d, limb2: 0x27e87f033bd1e0a8, limb3: 0x0, }, u384 { limb0: 0xd2a3e184d21451809178ee39, limb1: 0x3321f57d6c5435889979c4f9, limb2: 0x1498a3e6599fe24, limb3: 0x0, }, u384 { limb0: 0x235bef108dea1bbebde507aa, limb1: 0xe9dd4d7ce33707f74d5d6bcc, limb2: 0x27c0a41f4cb9fe67, limb3: 0x0, }, u384 { limb0: 0x5d5004c16a7c91fe1dae280f, limb1: 0x6637238b120fc770f4f4ae82, limb2: 0x1f75230908b141b4, limb3: 0x0, }, u384 { limb0: 0x89808d4eb1f0a085bee21656, limb1: 0x7bba831b15fffd2d7b97b3a0, limb2: 0x25f99a9198e92316, limb3: 0x0, }, u384 { limb0: 0x8ed14c67622974228ba900c6, limb1: 0xd0f6acdc2bb526593d3d56ec, limb2: 0x101bc318e9ea5920, limb3: 0x0, }, u384 { limb0: 0xa3cf091ec1ccc43207a83c76, limb1: 0x97c1334ecb019754ebc0c852, limb2: 0x1a175607067d5173, limb3: 0x0, }, u384 { limb0: 0xba4af5c1c4d89770155df37b, limb1: 0xdeb245f3e8c381ee6b2eb380, limb2: 0xf02f0e6d25f9ea3, limb3: 0x0, }, u384 { limb0: 0x56ae789ff358b3163b393bc9, limb1: 0x8d8a6677203ec9692565de4, limb2: 0x151d757acc8237af, limb3: 0x0, }, u384 { limb0: 0x5b757890a79d13a3a624fad4, limb1: 0x49e0a1fe0068dd20084980ee, limb2: 0x256cd9577cea1430, limb3: 0x0, }, u384 { limb0: 0xfbdd195497b8ae86e1937c61, limb1: 0x8833b13da50e0884476682c3, limb2: 0x513abaff6195ea4, limb3: 0x0, }, u384 { limb0: 0xe4ac448386d19dbac4e4a655, limb1: 0x6f610251ee6e2e8039246e84, limb2: 0x1d9570dc70a205f3, limb3: 0x0, }, u384 { limb0: 0xd784cf5e044eec50b29fc9d4, limb1: 0xd5d7f1bf8aaa6f56effb012d, limb2: 0x18f1a5194755b8c5, limb3: 0x0, }, u384 { limb0: 0x966ef420d88163238eebbca8, limb1: 0x866512c091e4a4f2fa4bb0af, limb2: 0x266b53b615ef73ac, limb3: 0x0, }, u384 { limb0: 0xb8c89a1a3f4fd6e8344ae0f7, limb1: 0xa42b8de27644c02268304dfe, limb2: 0x2d63234c9207438a, limb3: 0x0, }, u384 { limb0: 0x5ef8df7e0021daee6f55c693, limb1: 0x7b3adde219a6f0b5fbb97620, limb2: 0x2ab30fbe51ee49bc, limb3: 0x0, }, u384 { limb0: 0xd528b270068d9207fa6a45c9, limb1: 0xdcb9cce48969d4df1dc42abc, limb2: 0x1aee6d4b3ebe9366, limb3: 0x0, }, u384 { limb0: 0xc60bb34aa211d123f6095219, limb1: 0x5a79452e5864ae1d11f57646, limb2: 0x1891aeab71e34b89, limb3: 0x0, }, u384 { limb0: 0x57771bd3a7caab01c818aa4b, limb1: 0x6437e94b4101c69118e16b26, limb2: 0x24492b5f95c0b087, limb3: 0x0, }, u384 { limb0: 0x3d66c10ab2fddf71bcfde68f, limb1: 0x1b3b2c8663a0d64296462821, limb2: 0x1752161b3350f7e, limb3: 0x0, }, u384 { limb0: 0x148de54368cfb8f90a00f3a7, limb1: 0x7cfb84938e614c6c2f445b8d, limb2: 0xab676935722e2f6, limb3: 0x0, }, u384 { limb0: 0xe227e3d4fe0da1f7aa348189, limb1: 0x45bc730117ed9ae5683fc2e6, limb2: 0xb0f72472b9a2f5f, limb3: 0x0, }, u384 { limb0: 0x2c3ae6df13a78a513edcd369, limb1: 0x1c201d1a52fc4f8acaf2b215, limb2: 0x16aa6f9273acd563, limb3: 0x0, }, u384 { limb0: 0x55d23281a45c08d52435cd60, limb1: 0x13c324c1d8716eb0bf62d9b1, limb2: 0x2f60b987e63614eb, limb3: 0x0, }, u384 { limb0: 0x42f508fd9db76b7cc1b21212, limb1: 0x7606bb7884554e9df1cb89b0, limb2: 0x18d24ae01dde92fd, limb3: 0x0, }, u384 { limb0: 0xdf1593960715d4724cffa586, limb1: 0x8d776373130df79d18c3185f, limb2: 0x4fc3bf76fe31e2f, limb3: 0x0, }, u384 { limb0: 0xb21260c6b5d26270468dbf82, limb1: 0xcfdd670b41732bdf6dee9e06, limb2: 0xd18f6b53fc69546, limb3: 0x0, }, u384 { limb0: 0xcdb045036fa5d7045bd10e24, limb1: 0xcec11fbafa17c5223f1f70b4, limb2: 0xba4231a918f13a, limb3: 0x0, }, u384 { limb0: 0x635ff1ebedd0dd86120b4c8, limb1: 0x100985301663e7ec33c826da, limb2: 0x7b458b2e00cd7c6, limb3: 0x0, }, u384 { limb0: 0xed40b16cec39e9fd7baa5799, limb1: 0x6058e76f15a0c8286bba24e2, limb2: 0x1c35c2d96db90f4f, limb3: 0x0, }, u384 { limb0: 0xbbef96945e0dde688e292050, limb1: 0x766568f03dd1ecdb0a4f589a, limb2: 0x1d12bea3d8c32a5d, limb3: 0x0, }, u384 { limb0: 0x2fdea94313db405a61300286, limb1: 0x525f9a73526e9889c995bb6, limb2: 0xd953e2002200327, limb3: 0x0, }, u384 { limb0: 0x10b4040a760e33506d2671e1, limb1: 0x86a40bec4c875047f06ff0b6, limb2: 0x29f053ec388795d7, limb3: 0x0, }, u384 { limb0: 0x46e0c3f64b9679caaae44fc2, limb1: 0x4a4952a98463bc12e264d5f4, limb2: 0x4188e33735f46b1, limb3: 0x0, }, u384 { limb0: 0xb7e97eb3bf1735cdbe96f68f, limb1: 0xa84f1d0529431bb9e996a408, limb2: 0x149ec28846d4f438, limb3: 0x0, }, u384 { limb0: 0xe651922d148cce1c5fdddee8, limb1: 0xca24b5f63630bad47aeafd98, limb2: 0xde20fae0af5188b, limb3: 0x0, }, u384 { limb0: 0x4b8660edf449fba6984c6709, limb1: 0x3ea94350e722ad2f7d836c23, limb2: 0x12d650e8f790b125, limb3: 0x0, }, u384 { limb0: 0x8abe28d78340dfc4babb8f6c, limb1: 0xea96717ba7446aafdadbc1a, limb2: 0x22ab53aa39f34ad3, limb3: 0x0, }, u384 { limb0: 0x71dd776904a129db9149166c, limb1: 0x450dabea7907bc3de0de1098, limb2: 0x26503e8d4849bdf5, limb3: 0x0, }, u384 { limb0: 0x897e7fc4c8064035b0d33850, limb1: 0xf5454f5003c5c8ec34b23d, limb2: 0x1d5e7a0e2965dffa, limb3: 0x0, }, u384 { limb0: 0xa544615b9cb3c7bbd07104cb, limb1: 0x12d96b7ec48448c6bc9a6aef, limb2: 0xee3d8daa098bee0, limb3: 0x0, }, u384 { limb0: 0x175703d91dc232b5f98ead00, limb1: 0x55d30754cd4d9056fa9ef7a7, limb2: 0x1bf282082a049799, limb3: 0x0, }, u384 { limb0: 0x6b693733a0272173ee9ad461, limb1: 0xe3e951bc316bee49971645f1, limb2: 0x7ae1344abfc6c2c, limb3: 0x0, }, u384 { limb0: 0x7a47d97a5c8e89762ee80488, limb1: 0xec21b131d511d7dbdc98a36b, limb2: 0x217e3a247827c376, limb3: 0x0, }, u384 { limb0: 0xfc2894117509b616addc30ee, limb1: 0xa003d438e2fbe28babe1e50e, limb2: 0x215ffe584b0eb067, limb3: 0x0, }, u384 { limb0: 0xe33da57412a92d1d3ce3ec20, limb1: 0x92dcedc597c4ca0fbec19b84, limb2: 0x1e770fc8ecbfdc86, limb3: 0x0, }, u384 { limb0: 0x9338b3c0e50e828f69ff6d1f, limb1: 0x9f1e3a8a6d66a05742914fc1, limb2: 0x2f6243cda919bf4c, limb3: 0x0, }, u384 { limb0: 0x9cc89345d3c03ff87a11b693, limb1: 0x9595d0046f44ab303a195d0e, limb2: 0x246efddc3117ecd3, limb3: 0x0, }, u384 { limb0: 0x9a918dfbe602bc62cec6adf1, limb1: 0xd4fe006f139cbc4e0168b1c8, limb2: 0x53e8d9b3ea5b8e, limb3: 0x0, }, u384 { limb0: 0xeefff135aec04c1abe59427b, limb1: 0x7d910f6a710d38b7eb4f261b, limb2: 0x1b894a2f45cb9664, limb3: 0x0, }, u384 { limb0: 0x88651f5a42553d54ec242cc0, limb1: 0x8212652479107d5fdc077abf, limb2: 0xaeb1554e266693d, limb3: 0x0, }, u384 { limb0: 0xbd4b7d0e11faf9da8d9ca28e, limb1: 0xe6888680d1781c7f04ba7d71, limb2: 0x16a735f6f7209d24, limb3: 0x0, }, u384 { limb0: 0x615b19374ff549dcf073d41b, limb1: 0xd7c13b4df0543cd260e4bcbb, limb2: 0x487b8b7fab5fc8f, limb3: 0x0, }, u384 { limb0: 0x68c3ad677fdf51c92388793, limb1: 0x124bea26b0772493cfb5d512, limb2: 0x1e75b9d2c2006307, limb3: 0x0, }, u384 { limb0: 0x239d1c6c961dcb02da3b388f, limb1: 0x253b46d5ff77d272ae46fa1e, limb2: 0x5120e3d0e28003c, limb3: 0x0, }, u384 { limb0: 0x3b171823f890f5fd55d78372, limb1: 0xb822e8763240119ac0900a05, limb2: 0xda5feb534576492, limb3: 0x0, }, u384 { limb0: 0x379d9d2c40cc8f78b7bd9abe, limb1: 0x22acc1a1f5f3bb6d8c2666a6, limb2: 0x2e211b39a023031a, limb3: 0x0, }, u384 { limb0: 0xad24378bfedb68592ba8118b, limb1: 0xb2b70caf5c36a7b194be7c11, limb2: 0x109b7f411ba0e4c9, limb3: 0x0, }, u384 { limb0: 0x415c3dded62940bcde0bd771, limb1: 0xb9c36c764379dbca2cc8fdd1, limb2: 0x2969f27eed31a480, limb3: 0x0, }, u384 { limb0: 0x8c5b3753326244ee65a1b1a7, limb1: 0xd5f9e654638065ce6cd79e2, limb2: 0x143021ec686a3f33, limb3: 0x0, }, u384 { limb0: 0xdbdeea55d6c64543dc4903e0, limb1: 0x6ae119424fddbcbc9314dc9f, limb2: 0x16ed41e13bb9c0c6, limb3: 0x0, }, u384 { limb0: 0x8c7b964029b2311687b1fe23, limb1: 0x4c9871c832963dc1b89d743c, limb2: 0x2e2419f9ec02ec39, limb3: 0x0, }, u384 { limb0: 0x58e7d7b6b16cdfabc8ee2911, limb1: 0x82a70eff08a6fd99d057e12e, limb2: 0x176cc029695ad025, limb3: 0x0, }, u384 { limb0: 0xceb247b791a93b74e36736d, limb1: 0xf617e7dcbfe82e0df706ab64, limb2: 0x2b90bba00fca0589, limb3: 0x0, }, u384 { limb0: 0x9f5fb065c8aacc55a0f89bfa, limb1: 0x97315876690f053d148d4e10, limb2: 0x101071f0032379b6, limb3: 0x0, }, u384 { limb0: 0x7043f7773279cd71d25d5e0, limb1: 0x17ba7fee3802593fa6444703, limb2: 0x19a3fc0a56702bf4, limb3: 0x0, }, u384 { limb0: 0x4ae72c925a8a79a66831f51d, limb1: 0x3f83dcedddb9a0236203f5f2, limb2: 0x1e6f20a11d1e31e4, limb3: 0x0, }, u384 { limb0: 0x25403ae24084e3027e782467, limb1: 0xc722a141f8785694484f4267, limb2: 0x1bd8c528472e57bd, limb3: 0x0, }, u384 { limb0: 0xa9e9c3190527a1a5f05079a, limb1: 0x6bacf1ad5e56655b7143625b, limb2: 0x2d51ba82c8073c6d, limb3: 0x0, }, u384 { limb0: 0x40ff0731b5f927fe8d6a77c9, limb1: 0xe0ab10fc2e51ea83ce0611f9, limb2: 0x1b07d6d51e6f7e97, limb3: 0x0, }, u384 { limb0: 0xccf34d985a3e53f0bc5765a0, limb1: 0xe8376f62d19edf43093cdef1, limb2: 0x11e12a40d262ae88, limb3: 0x0, }, u384 { limb0: 0xd89038308a3ef37cce8463bd, limb1: 0x9c6f3e47b5ff55781574f980, limb2: 0x221c170e4d02a247, limb3: 0x0, }, u384 { limb0: 0x427f4f063ab718e707576b31, limb1: 0x6ee25a9b8768b3231a89752f, limb2: 0x3f0815ab463f1b7, limb3: 0x0, }, u384 { limb0: 0x3b1d34c8e008859f1dbfb317, limb1: 0x54c7e33029b3617357012a3d, limb2: 0x15648bf46f60d829, limb3: 0x0, }, u384 { limb0: 0xcf61f1daa0cfefbf7fbfba85, limb1: 0x18ca7f2eafdd7564d05ea850, limb2: 0x127e00c2253de078, limb3: 0x0, }, u384 { limb0: 0x8cbbb878f7d48051630747bd, limb1: 0x9382fc0b1d265cb4d3ce470a, limb2: 0x66365afd18a41ef, limb3: 0x0, }, u384 { limb0: 0x4e57dcf2b099715c4404aae7, limb1: 0xdc69a96f7fe7e086f4fa24c8, limb2: 0x219d14f823513140, limb3: 0x0, }, u384 { limb0: 0x696d37ebaefa9ac2302132d5, limb1: 0x4a6a63a8050d91f9f14f4d33, limb2: 0x3a30bfbbf2cb86d, limb3: 0x0, }, u384 { limb0: 0x74b06e3385104b0b41935bcc, limb1: 0xb0270fb7d5c9f94edad5a84d, limb2: 0x2121bbcdeaa33a35, limb3: 0x0, }, u384 { limb0: 0xe338a389d053ef8b3d10e70e, limb1: 0xcfbb82c289e579b7cd5580c2, limb2: 0x196b544fbeb0a792, limb3: 0x0, }, u384 { limb0: 0xedb4bd4e7d907ea0202f560f, limb1: 0x89c1db270ef479c26973ec73, limb2: 0x2809c3a1547c0cee, limb3: 0x0, }, u384 { limb0: 0x5b31f4b5d40d4e96dfc5c8f1, limb1: 0xca157585a02b8b342a4c6717, limb2: 0x11c34446b083ef92, limb3: 0x0, }, u384 { limb0: 0x709d90b86d9d8026e2e39925, limb1: 0x367c030e3289cbe0f6242ad7, limb2: 0x253ea0b33a8bf3b2, limb3: 0x0, }, u384 { limb0: 0x6d1030438c16df85637bd5f, limb1: 0x90c89d4007ad29fc4f5a19c0, limb2: 0x30467dc1930f6afe, limb3: 0x0, }, u384 { limb0: 0x58b38bbe13c8ebfbbba54f44, limb1: 0x7e20e6f5a3a88af7aa6a5364, limb2: 0x2f9d4b55495f7e37, limb3: 0x0, }, u384 { limb0: 0xbe18aad54cfd03ff0feac4b8, limb1: 0xf11d36d499e7e093d8ee2353, limb2: 0x1d9e9d5c736e3151, limb3: 0x0, }, u384 { limb0: 0x7e097c315f343de301e54841, limb1: 0xebf622f7823a3de7d1bfedb8, limb2: 0x124b617b43e598f9, limb3: 0x0, }, u384 { limb0: 0x9cae08d789cc5748ffe199b2, limb1: 0x4055cf073bedc945a5f9c5b1, limb2: 0x198e7cfc66ae4577, limb3: 0x0, }, u384 { limb0: 0x7443099c5bb6c27ed977fe24, limb1: 0xfd124ab3aad57789eb945ba5, limb2: 0x2eac25b3498dfadf, limb3: 0x0, }, u384 { limb0: 0x454ed3550b3c6ab5f4f90126, limb1: 0x1b378305c1bb9c904e8af1d4, limb2: 0x1ee02c175cdfe187, limb3: 0x0, }, u384 { limb0: 0x745c48609fa98301d0f679d5, limb1: 0xb29ea8f9d2dfa47ff6fbb1d9, limb2: 0x616f8c34c607266, limb3: 0x0, }, u384 { limb0: 0x385e4883a43a42832803370b, limb1: 0x58b9f19cbbdb972a853e51ed, limb2: 0x181d68b0a1885049, limb3: 0x0, }, u384 { limb0: 0x24cbabf6059e9327f5ba7004, limb1: 0x5d6b7f5b015d579181d1ce2f, limb2: 0x2d5397ce863464a2, limb3: 0x0, }, u384 { limb0: 0x2da2b6591724d8dbd4bc2618, limb1: 0xe8912940cc0b80277713e7d3, limb2: 0x15bf817491b94d71, limb3: 0x0, }, u384 { limb0: 0x40bc910994a3827d29c08714, limb1: 0xb76feab28b69485ac8cc6877, limb2: 0x2a7cbd11460b177a, limb3: 0x0, }, u384 { limb0: 0xa80a85614c237b290de9d502, limb1: 0xab56e447fae5cc1763cb462d, limb2: 0xf7cd5ffa4661730, limb3: 0x0, }, u384 { limb0: 0x86d305be644ce04531008100, limb1: 0xeb13273508eb6575f768137d, limb2: 0xe0766004b4c4176, limb3: 0x0, }, u384 { limb0: 0xafac00104e1f763000b9924c, limb1: 0xf6d148be6b9c8bb7b54ee3c1, limb2: 0x625fa7145813481, limb3: 0x0, }, u384 { limb0: 0xb184f515b65136318ce2c6a5, limb1: 0x16ee0f5461aad2e0b19cd9c7, limb2: 0x7c5472508b4599, limb3: 0x0, }, u384 { limb0: 0x951d43c54685879cb7a89fcb, limb1: 0x93ac77ab3fb7557231d53073, limb2: 0x567375470d189b6, limb3: 0x0, }, u384 { limb0: 0xea4bfc71601174ba5c7b8bcc, limb1: 0x5165f56c063e42108ad21f51, limb2: 0x1d0406bcbec83f8d, limb3: 0x0, }, u384 { limb0: 0x2f8696ee7c73b46c63272cb7, limb1: 0x280a8aa1f86405f3375f0634, limb2: 0xc02b18eef22332d, limb3: 0x0, }, u384 { limb0: 0x4fd1b15aad053a55ad6da4cf, limb1: 0xeaa7add2f801a664823509ad, limb2: 0x17c1fc174cd9a6eb, limb3: 0x0, }, u384 { limb0: 0x33f7ed258a08638e9584b32d, limb1: 0xab7ebbc86709a021aaa6caf4, limb2: 0x5f843c23024eb1d, limb3: 0x0, }, u384 { limb0: 0x90a55c87589f792f0ad8cb37, limb1: 0x5cc51c53165e002727b45ccd, limb2: 0x22df2420697ca28b, limb3: 0x0, }, u384 { limb0: 0x4b76be86417588efc4d7302a, limb1: 0x73400aaedf0f48009fd3af80, limb2: 0x2f1438303a7b49d4, limb3: 0x0, }, u384 { limb0: 0xcd35d5ca6155c5463093b23b, limb1: 0xc6b2b7b4fbf9a24bbaa7f4dc, limb2: 0x2323d5fcf2da8965, limb3: 0x0, }, u384 { limb0: 0x1e9c54f94e37700073d4d26e, limb1: 0xe83b753a5e7336b9f40f7b96, limb2: 0x26c85b9dfbbe48f, limb3: 0x0, }, u384 { limb0: 0x4c20979528e41d65384c318f, limb1: 0xfeb38b5ab4e335f070b271df, limb2: 0x31511000251ec86, limb3: 0x0, }, u384 { limb0: 0x941e34a60ff5df9a26c03af1, limb1: 0xb42fa69e5d90a0c0e27cd16b, limb2: 0x18e588324a9bbaac, limb3: 0x0, }, u384 { limb0: 0xd9bef2e7d99f03c10ea1f95f, limb1: 0x70635775c8d3c9498357d6a, limb2: 0x2642b5d8e16b953b, limb3: 0x0, }, u384 { limb0: 0x48335c4221f909aef836c133, limb1: 0xe84ff60db906a0f031189b0b, limb2: 0x21fc313ba11c60e8, limb3: 0x0, }, u384 { limb0: 0xbac6e4e9f2f4d93d06dae151, limb1: 0x890b698cc6ab89f7311298bc, limb2: 0x2d3562e3d4b42bc6, limb3: 0x0, }, u384 { limb0: 0x7616f01c189d886dfd2e0808, limb1: 0x2e3e0b6ff7e5c7c77934a5f6, limb2: 0xa74ef541d360e84, limb3: 0x0, }, u384 { limb0: 0x7d9e754967c2c9b1b02caf8a, limb1: 0xc3983d6e3b433afa43f43408, limb2: 0x140564b53e0a812a, limb3: 0x0, }, u384 { limb0: 0xe83fa6993adb6f2db6bba9d0, limb1: 0x18b400181e71ab9759c436c8, limb2: 0x14709e32d98ae4cd, limb3: 0x0, }, u384 { limb0: 0x2dba651f4a619a4b52bdc010, limb1: 0x423f179e1266dd392372db4f, limb2: 0x734b2366c59e394, limb3: 0x0, }, u384 { limb0: 0x913642c7d02d7e71088fd2d4, limb1: 0x5ad3e3c5fb6629abe963ed92, limb2: 0x11fb2d705c94b08d, limb3: 0x0, }, u384 { limb0: 0x8fd84be834e4cc3618059484, limb1: 0x5d715eba19371050ef6eb7f7, limb2: 0x27d03abf5c1f290e, limb3: 0x0, }, u384 { limb0: 0x2a39c6a8bb9b441ac1395861, limb1: 0x7fb3353cfc2cd63ebe817f21, limb2: 0x13ed9e9e6b452df2, limb3: 0x0, }, u384 { limb0: 0x2604263a7c5b79ab99cbd23c, limb1: 0x246cdaaa04a12e88795de445, limb2: 0x1319c51cf37aaa10, limb3: 0x0, }, u384 { limb0: 0x4eebbd0e715b6cea019ac3f2, limb1: 0x7f9dad839f2c8cb526a4cf44, limb2: 0xbca25588d187b, limb3: 0x0, }, u384 { limb0: 0x3f02f7a3c01be23cf51d593f, limb1: 0x181226874b923cd01a069b49, limb2: 0x1d837ea0341c5964, limb3: 0x0, }, u384 { limb0: 0xdbd25f24012090db7de4e7f9, limb1: 0x42c427ce4c5c83774149e2a6, limb2: 0x1b41ce9ed3634cbd, limb3: 0x0, }, u384 { limb0: 0xb78a127c7b56bd6673f1ce1f, limb1: 0xddc790ecc4e946f4bca74b98, limb2: 0x671f0e3b674ae7c, limb3: 0x0, }, u384 { limb0: 0x1ac14143071d0449a5426e4e, limb1: 0x72e40cd30615f55fefeb682c, limb2: 0x19fc073797a39b2, limb3: 0x0, }, u384 { limb0: 0xbf5d97311c5096619e9fd13, limb1: 0xfd1f7c5c6d5a7c70fa420948, limb2: 0x17bee47d262a497, limb3: 0x0, }, u384 { limb0: 0x1cc937ba00cc8527274471e3, limb1: 0x80763539cff2978a4c794472, limb2: 0x2073cff92d3141b4, limb3: 0x0, }, u384 { limb0: 0x2e730fe2c7aa46b1fa663baa, limb1: 0x7f43182a55a91d48f9c58d15, limb2: 0x3bd7b3e2c188587, limb3: 0x0, }, u384 { limb0: 0x19a14c8dfed9ffbbbad9b6b7, limb1: 0xff128edfb9bbf5fa0ceb1007, limb2: 0x226ebc9a538b5bba, limb3: 0x0, }, u384 { limb0: 0xaf1d830dc6e394e8a5d3b21a, limb1: 0x373a06e1552c0e634a49572, limb2: 0xd395f0b08b9fede, limb3: 0x0, }, u384 { limb0: 0xcf1e0f2f41f77d5331f99ffa, limb1: 0x30d49b68e19e31ba5284bd3b, limb2: 0x28242439b524540a, limb3: 0x0, }, u384 { limb0: 0x9e91f929754b48c6154d4df6, limb1: 0x2d2de034801ab85e0b457e12, limb2: 0x370d6fa19eaac14, limb3: 0x0, }, u384 { limb0: 0xc753feb0a2b2e0bcbde1659, limb1: 0x90762abf269579eaa37939bc, limb2: 0x9a16f573b3280f3, limb3: 0x0, }, u384 { limb0: 0x90b71b268d99981368231d97, limb1: 0x496ac443f98127ee3c0021a6, limb2: 0x2228e360fb5b162b, limb3: 0x0, }, u384 { limb0: 0x8032b6a1b97675f3c567f944, limb1: 0x9fabf83991476d209431e34d, limb2: 0x7e42c2ca633d2c4, limb3: 0x0, }, u384 { limb0: 0xd8e9d753a50fe96097724a9f, limb1: 0xc3cab85a6215a32eed35fda1, limb2: 0x2ce12d7269663770, limb3: 0x0, }, u384 { limb0: 0xf70973a7ba0b2231815b15de, limb1: 0x9eeb9b1b45a0125084bc4da, limb2: 0x3d7427704c61e20, limb3: 0x0, }, u384 { limb0: 0xdc4626732d86921e553e69c6, limb1: 0x1c1267fcf4b4b33ca096fb4d, limb2: 0x10f8abf076418586, limb3: 0x0, }, u384 { limb0: 0xaaf6568a5c95644c7c5914cc, limb1: 0x25d7cb456e3aeb251a1a620, limb2: 0x17ccaf6f26f7267a, limb3: 0x0, }, u384 { limb0: 0x6e55754d59de6df28cea4d51, limb1: 0x1385c3ce00ca820ad0e3651a, limb2: 0x63bb306b9631005, limb3: 0x0, }, u384 { limb0: 0x65e608bc920cf993a4169974, limb1: 0xf2c304a18095ab7403242e0b, limb2: 0x1f761ee5553c5e86, limb3: 0x0, }, u384 { limb0: 0x61b45717cd6bdfc09de4e8f2, limb1: 0xa23c0e666859ba6564bcde87, limb2: 0xdc5f00bbfd7c1d9, limb3: 0x0, }, u384 { limb0: 0xa230abc391089760bfc40ef2, limb1: 0xdf07c3536381c13eb44cf790, limb2: 0x6de511520e277b7, limb3: 0x0, }, u384 { limb0: 0x50a1fe21f24a8c06e10cca03, limb1: 0xf9ef54863e70528a1fd4481b, limb2: 0x2a134348c8660efc, limb3: 0x0, }, u384 { limb0: 0xb63a7dbba1b33520bcfce37b, limb1: 0x4bd80089e99edf8ed5f6f1ff, limb2: 0xaeb5023bbb9a64c, limb3: 0x0, }, u384 { limb0: 0xab26155836fc51fb7cb933d1, limb1: 0x25ecb5f0bfdc9995406c5960, limb2: 0x141a6d0810366ae2, limb3: 0x0, }, u384 { limb0: 0x990bc0b8bfe87497f1e2c5b7, limb1: 0xbe776f404dca6626cc0b2539, limb2: 0x9d2ea05ef54dadb, limb3: 0x0, }, u384 { limb0: 0x2441bfe8ff1a16e91719cdde, limb1: 0xd104d5f8ef70891d22d4a543, limb2: 0x1e56d244a8e41be5, limb3: 0x0, }, u384 { limb0: 0xa85c2fd68ba4d5c5f50c7b49, limb1: 0xec908b2f99b5c4fd5e09447f, limb2: 0x1d4f020c57c4f14a, limb3: 0x0, }, u384 { limb0: 0x9db80fb0ee1e833764c18fd3, limb1: 0xe09f4e14cd03398d8d82a1e0, limb2: 0x763911a3a92a4f0, limb3: 0x0, }, u384 { limb0: 0xc5e47e55684366e54b302946, limb1: 0xba2ec68f9061643f1fc5d9a2, limb2: 0x12857275be2fe6b9, limb3: 0x0, }, u384 { limb0: 0x3c5d83d4d0ebf50d1bbf87c0, limb1: 0x655ffe9a96c4b81adc0a6035, limb2: 0x2ed11ccd2e2e2376, limb3: 0x0, }, u384 { limb0: 0x2cfbb4acd288a21543c6d594, limb1: 0x5b320d5e3e966ef4726d5b1c, limb2: 0x3e31de8958e8264, limb3: 0x0, }, u384 { limb0: 0xd7e905366ec2ca4a36e71963, limb1: 0x58ae890046533d58da28a608, limb2: 0x11e880dfefdbd088, limb3: 0x0, }, u384 { limb0: 0x978d53c190dc25e969a507b2, limb1: 0x704a9c3cc21ab7a44a34662, limb2: 0x1835b275deaed2d0, limb3: 0x0, }, u384 { limb0: 0xf1324240419f372ff8d3c3f5, limb1: 0xce5a4a9480e1d82ce5d44f76, limb2: 0x68b75315e25ed4a, limb3: 0x0, }, u384 { limb0: 0x95c839d698ad3b22823274d1, limb1: 0x2b052d2ad12b92a4268fccd7, limb2: 0x1b7ef7d04aec73d6, limb3: 0x0, }, u384 { limb0: 0x7f4b8efcc240d30bbaa9f03f, limb1: 0x6f6193ff5501b57216b67072, limb2: 0x28c0c848022a9060, limb3: 0x0, }, u384 { limb0: 0xa16660efd6e5d82d4f068e1b, limb1: 0x686a7bfb1c39f3f254370985, limb2: 0x13bda49296cbcc51, limb3: 0x0, }, u384 { limb0: 0x86c3e0e2fd38490d3a594141, limb1: 0x11eb10b34265e378a945729f, limb2: 0x2e7987ea8204389d, limb3: 0x0, }, u384 { limb0: 0xfda3226ce5415fffd03935c8, limb1: 0x4b2b45c10a190fedef702aef, limb2: 0x826d4a2324ad3aa, limb3: 0x0, }, u384 { limb0: 0x435c3b59685f93b434036ded, limb1: 0xfa3675ef541c9df7bb964a85, limb2: 0x2dbeee85eaeaa9, limb3: 0x0, }, u384 { limb0: 0xf5c5abfb966a4be599cb86c7, limb1: 0x919418ecb3279b11e6fa44f5, limb2: 0x227ee7a945edaee6, limb3: 0x0, }, u384 { limb0: 0x86de8c698d541471c7244220, limb1: 0x5ac90d696faf2a5ffadc239, limb2: 0x1d0a6d1a95198778, limb3: 0x0, }, u384 { limb0: 0xb284ec3e9f4de02b25f6e9d4, limb1: 0xda4f333b7854fbbcd10eea1d, limb2: 0x2208aaba508ae816, limb3: 0x0, }, u384 { limb0: 0xe2f8e01a175720971ccf04ec, limb1: 0xe36a7d29b587a215c9e59268, limb2: 0x28a58901035b2c99, limb3: 0x0, }, u384 { limb0: 0x4ffc0191226f38a8adfd6238, limb1: 0x123a07865ca1376df317a2a1, limb2: 0x112f6d8d42b0a0d, limb3: 0x0, }, u384 { limb0: 0xb4d01f1daf906b6d3c6e2308, limb1: 0x3174dda182d266d5c727f97f, limb2: 0x8c6eb19c016d183, limb3: 0x0, }, u384 { limb0: 0x48c8698ecfea9103f73f1879, limb1: 0xd0b38b95f9c642df75b1be9a, limb2: 0x1359d2d6c8b5a116, limb3: 0x0, }, u384 { limb0: 0x7725f8a5ed42b699c4af3ca7, limb1: 0xa467c1cc1878d91aaa07aacf, limb2: 0x10c5052ec67ab9b6, limb3: 0x0, }, u384 { limb0: 0x5d4e9f060193823684c96c75, limb1: 0xdb708803e6338fc6afdb188d, limb2: 0x583c4d292d54f3c, limb3: 0x0, }, u384 { limb0: 0x3e076e16ee2c18bfc06f57b4, limb1: 0x1a4054c5b96322e7bcd1fe2b, limb2: 0x2d94a1c55be38215, limb3: 0x0, }, u384 { limb0: 0x1927ead80dbc64dd2211c3ec, limb1: 0xb997369579c1b1703ef77c67, limb2: 0x15e3402fdde8770f, limb3: 0x0, }, u384 { limb0: 0x8bb902eb302677e20a727be3, limb1: 0xf7b21e6b867d5a71b5000bef, limb2: 0x185be98784817f22, limb3: 0x0, }, u384 { limb0: 0xc054547b5ca14cd94de467b6, limb1: 0x66ed8927c89890aa8aad1b00, limb2: 0x18db4321c721c036, limb3: 0x0, }, u384 { limb0: 0xd2cd0aff4eb2134a039b5126, limb1: 0xc390b3f3d799188528849bc, limb2: 0x2a852b6247f5d61f, limb3: 0x0, }, u384 { limb0: 0xe1cd771b165930204da58f22, limb1: 0xe65fb9a18ee0124aa5276f6d, limb2: 0x2510aeed51b7f506, limb3: 0x0, }, u384 { limb0: 0xdcad1d7977d6486513bab5f2, limb1: 0xb5bd3a236f03a47b47b7fb54, limb2: 0xf2074a32eb8260f, limb3: 0x0, }, u384 { limb0: 0x12c4c2c84971404bfa044090, limb1: 0xa8270e19941926cec3531c9e, limb2: 0x2f4c69297866bd45, limb3: 0x0, }, u384 { limb0: 0x5f3fd75e9b792c562a37473f, limb1: 0x5d083a65093c0d0e92df5fd, limb2: 0x154668727d2dbadf, limb3: 0x0, }, u384 { limb0: 0x5bcd1194a91e5b0f7b13cadf, limb1: 0x4fd77fc5ab5c8c4e8d3e2e37, limb2: 0x1e6ffc5d6a1ff5dc, limb3: 0x0, }, u384 { limb0: 0x28538571fafa389da29990c6, limb1: 0x9d75acbc9395cb8398c8b2d4, limb2: 0x2cf1a1d7c4430910, limb3: 0x0, }, u384 { limb0: 0x3e24cf016ecf64cf793c9880, limb1: 0x87cf76cd5ce8da47aa5d8a02, limb2: 0x140fb39a89f26f6d, limb3: 0x0, }, u384 { limb0: 0xc159990b8298a93a8589f9e8, limb1: 0xf0712b201fb3cddfce2c16da, limb2: 0x1289d13d58a17b5b, limb3: 0x0, }, u384 { limb0: 0xc5218749610920fe98b2db2e, limb1: 0x5781e8d3d207adc8370cf56b, limb2: 0xf45cf974d2c9edb, limb3: 0x0, }, u384 { limb0: 0xb333568b8687a1c9eceb44d4, limb1: 0x6b79edfd24f5abcc585a81d1, limb2: 0x11909c81a1651804, limb3: 0x0, }, u384 { limb0: 0x2d5a1041fd7bbd6792330d16, limb1: 0x9f3b891a0e3da4d6917672f, limb2: 0x2990b23c81882f77, limb3: 0x0, }, u384 { limb0: 0x9a16dc102ecf461e4aef7277, limb1: 0xcd5560e0821e7285e0a083ea, limb2: 0x609551b14716ca3, limb3: 0x0, }, u384 { limb0: 0x55f4f93dc0880eaa08d03f77, limb1: 0xfd93dced2467354b6175de17, limb2: 0xc8c1abdfab99d03, limb3: 0x0, }, u384 { limb0: 0x98ec09f78a7a55d08f2e0b10, limb1: 0xbd02f33f8bec6c730db3fed2, limb2: 0x138bd098c4923b9f, limb3: 0x0, }, u384 { limb0: 0xe07d9ae3f21bb5a3190f14c0, limb1: 0x4673f0f77161ae55dcd0b45c, limb2: 0x2e61e4bc02163011, limb3: 0x0, }, u384 { limb0: 0x22401c905ddb408260d8e910, limb1: 0x65a9c4060ce3297c626abd1c, limb2: 0x124860913e3df8f, limb3: 0x0, }, u384 { limb0: 0x701d98286c6ac8b7ed052ec8, limb1: 0x3ec104804d955cbe125f24c5, limb2: 0x13807f89c394a13, limb3: 0x0, }, u384 { limb0: 0x50c8f4c4e85578abb0fc2fe5, limb1: 0x132aa9eeaec08d2f59aa4440, limb2: 0x2e88d1a6938f0788, limb3: 0x0, }, u384 { limb0: 0x3ba607c2e8fcc1f26abf3104, limb1: 0xa0cbf64e1f1787e2257be3c, limb2: 0x1f3d24f17cfc605, limb3: 0x0, }, u384 { limb0: 0x82a916bfd9b62f82f0f8d0bf, limb1: 0x3b9d4f133d41fb5b3fe6c76a, limb2: 0x1fe1cb0e2ae169f8, limb3: 0x0, }, u384 { limb0: 0x8d1c48bf5e3377f9177071f3, limb1: 0x353329221229827e19946f3d, limb2: 0xef79351229409cd, limb3: 0x0, }, u384 { limb0: 0x3127860e89088608373beda9, limb1: 0x1c4893ef77a9d11150755188, limb2: 0x18fb2e46fc1b90fe, limb3: 0x0, }, u384 { limb0: 0xa68c5cb61916bd57120d1868, limb1: 0x4c32ef0761e23a3cc0ad6263, limb2: 0x77afe2579f42ec1, limb3: 0x0, }, u384 { limb0: 0x6fdd65d248b186f1490b7b99, limb1: 0x2642c04ccf8a6ea54e2ac983, limb2: 0x79769092daa5a75, limb3: 0x0, }, u384 { limb0: 0x606b676b663c76cf76bab4a5, limb1: 0x254eb6e09c5c8bfd67eb9734, limb2: 0x1d8bf229c19968f0, limb3: 0x0, }, u384 { limb0: 0x36f17256428f29f6ec1bddad, limb1: 0xf93556e49e4b37737664f142, limb2: 0x2a33b7d855e7fe55, limb3: 0x0, }, u384 { limb0: 0xe7aa7536340dc3187ccca8b2, limb1: 0x4ec161c86e84ba6ab2056077, limb2: 0x25b0331d7e2b15af, limb3: 0x0, }, u384 { limb0: 0xb92c16e2f4f13f22342474e2, limb1: 0xccbf45e4810211b0ffcf8ccb, limb2: 0x762098f5fe26598, limb3: 0x0, }, u384 { limb0: 0x185c70716dece2b6172c2514, limb1: 0x6d0da4c007b1bda42362e144, limb2: 0xe234d720d70b288, limb3: 0x0, }, u384 { limb0: 0x11c0c60d135c811152aa4b60, limb1: 0x6e3742e720b7fec2ea72182f, limb2: 0x1d82bedccd2bc8a0, limb3: 0x0, }, u384 { limb0: 0xb94d481314bd1c690a17c979, limb1: 0xa5e9a3e7d05930b7c3397fd6, limb2: 0x480064d4b3eb0ad, limb3: 0x0, }, u384 { limb0: 0x68560cf41867f7464fb0c11a, limb1: 0xf7593fbb1140edc8c8e45805, limb2: 0x10a892763b3cca9e, limb3: 0x0, }, u384 { limb0: 0x667ae4714dde4cd7f4de8b91, limb1: 0xc921f9b2553680785978b315, limb2: 0xb5ec64548ea841a, limb3: 0x0, }, u384 { limb0: 0xd030e1a9ce3c65c9db931d46, limb1: 0x49761bd7131dfaebd78010ed, limb2: 0x10554aca4e348e59, limb3: 0x0, }, u384 { limb0: 0x6e150d4ac648fab3db0cff6, limb1: 0x8b93655462b1f475b9be9de3, limb2: 0x15be66f38d86b099, limb3: 0x0, }, u384 { limb0: 0x4ab0c23caaf308e427d3dbe8, limb1: 0x82d182957ffad01bf6c26e9d, limb2: 0x176ad3600fd34911, limb3: 0x0, }, u384 { limb0: 0x4fc11bd3ce82b5cf0af2e6f2, limb1: 0x9335001d705ac125e3beb20f, limb2: 0x2b6f355b3dbf65f0, limb3: 0x0, }, u384 { limb0: 0x288fa296b6de9ff788c77451, limb1: 0x81d7c89edefb32d1a8448c51, limb2: 0x1c85c06a6d5d40d, limb3: 0x0, }, u384 { limb0: 0xe43f7d1f51a70aaac2460d79, limb1: 0xbd9a51d76b2e25f82361c389, limb2: 0x20e1e876c4746a0c, limb3: 0x0, }, u384 { limb0: 0x737701392d987dda9217fa08, limb1: 0x2a024b637bc35a29ee3b08ce, limb2: 0x20e46219f684186d, limb3: 0x0, }, u384 { limb0: 0x7a8bd90e28be0f2ed6091367, limb1: 0x654e987907277c2448076636, limb2: 0x2ea7279db9f2aa0f, limb3: 0x0, }, u384 { limb0: 0x7c9171b1641be95091780f74, limb1: 0x362096d472bc75ca0969dc07, limb2: 0x136be2a7f18924c9, limb3: 0x0, }, u384 { limb0: 0xfbc8f1f6c924baf0df5a0e9e, limb1: 0x3067c4300fb0f51119ed5736, limb2: 0x1ca2033501baa3f7, limb3: 0x0, }, u384 { limb0: 0x4a9d9fa1da810832b48a50c7, limb1: 0xecaa75e495f34e3525824f7a, limb2: 0xa82f199c2505277, limb3: 0x0, }, u384 { limb0: 0x2e7ed9eb7925a2dea580b7d5, limb1: 0xe92fefb0d7f7782a9f37a272, limb2: 0xecf10485307b4ba, limb3: 0x0, }, u384 { limb0: 0x78f13af16aebbbb339a3936b, limb1: 0xd12aa22f08a8296d68615c84, limb2: 0x7b642138dfd6a6d, limb3: 0x0, }, u384 { limb0: 0xa76d61e9cbc3b6dd0f1a2150, limb1: 0xd2256d34921fb86ed70e760b, limb2: 0x1d9dda43a25593ff, limb3: 0x0, }, u384 { limb0: 0x8213d392958ce2fd3d7d2fce, limb1: 0x1dc91136c91c6bccd5367eb0, limb2: 0x2f1af228520c8b75, limb3: 0x0, }, u384 { limb0: 0x5a1a2b6b18551a45a6cde123, limb1: 0x5c6d6c1ab3de4abae61ada62, limb2: 0x1fecfe833ad54045, limb3: 0x0, }, u384 { limb0: 0x77abe637bdd3ad28e4a23c88, limb1: 0x3b0d7583460227575657ff8a, limb2: 0x18fc8e608c735b2b, limb3: 0x0, }, u384 { limb0: 0x18783a5586388a7547faa815, limb1: 0x6ebf03cb3f53aba8a43ce0b6, limb2: 0x28f740bc1182e970, limb3: 0x0, }, u384 { limb0: 0x1cfd13822bed35b7146966a4, limb1: 0x94ad301e4b998d29e960a485, limb2: 0x47998cc0af5a26b, limb3: 0x0, }, u384 { limb0: 0x2e880ee130a14a692b777b70, limb1: 0xdda43e415e1b9a3a9725c7b5, limb2: 0x1b5f1525b31db911, limb3: 0x0, }, u384 { limb0: 0xd1d7b1af945fa57ed5c8de6e, limb1: 0x5f65e965a90eac9bf770ae9b, limb2: 0x275a83fa5d19b453, limb3: 0x0, }, u384 { limb0: 0x808c9897ce3e40a6f6a27aa8, limb1: 0xcb430568e49bc9dc2a563359, limb2: 0x2e8789257ed2cbcc, limb3: 0x0, }, u384 { limb0: 0xdcd6e41e2925a39c8e2c7c1, limb1: 0xeb2721a4c09e9d17f60c3450, limb2: 0x927f46cfe80feef, limb3: 0x0, }, u384 { limb0: 0xbc1ecf9e0e484bbfe7698101, limb1: 0xc37619bfe6ab6a97fd8fb2cf, limb2: 0x1f868ae04832a5db, limb3: 0x0, }, u384 { limb0: 0xf308fb19ce6d56c9b45eff4, limb1: 0x9b73f745b2defed65d94ba8, limb2: 0x9d7a11e27d2f531, limb3: 0x0, }, u384 { limb0: 0x4fda5995b0c351aa2b879dff, limb1: 0x104e1c2823fb7c5b9a7b2592, limb2: 0x282d857cfe8da3b5, limb3: 0x0, }, u384 { limb0: 0x5c0744f6987fb0f6ff49c217, limb1: 0x3f349ff830ae663b27576e13, limb2: 0x20ba8a9fcec815b1, limb3: 0x0, }, u384 { limb0: 0xddd2ab1b66a8ae4dcbfb136e, limb1: 0x4589fba12e657d226d57b471, limb2: 0x11b6afc91e32f1ca, limb3: 0x0, }, u384 { limb0: 0xc72ddf3f908141736cebc3be, limb1: 0x316e335c7d93db344788eec2, limb2: 0x2e666402ac9cc588, limb3: 0x0, }, u384 { limb0: 0xc9ed9a1a74920f2794f18595, limb1: 0xa202a110e283faad7057aec5, limb2: 0x17522e0e9e64f795, limb3: 0x0, }, u384 { limb0: 0xe2ff24b7878cb9878edbd3b9, limb1: 0xe20b470cad4cc7319e6adb40, limb2: 0x2d2ed17f7a1f3ee9, limb3: 0x0, }, u384 { limb0: 0x8136f4d73c937da16c7bf9f4, limb1: 0xa96fa276e89e85d08f75e54a, limb2: 0x1a81efb19d7e1eda, limb3: 0x0, }, u384 { limb0: 0x51c7a0d515a16bb3bd33e237, limb1: 0x210a7b44e52e5630f299c5f4, limb2: 0x27ff57c1ca847e57, limb3: 0x0, }, u384 { limb0: 0x3c6a5a0a11be26a7f5fb1a94, limb1: 0x3c5be96031bfa167840d117b, limb2: 0x1c1a8e22230abcd1, limb3: 0x0, }, u384 { limb0: 0x4d2c32b59d5836f9c19a5657, limb1: 0x43627a9cd533e4250d81e777, limb2: 0x2a1c3f15d4927c8, limb3: 0x0, }, u384 { limb0: 0xac112e185acb219899357e4, limb1: 0x1c52499b37cb4be1af0373a1, limb2: 0x2ddbb7239eb904d8, limb3: 0x0, }, u384 { limb0: 0x5edadab48a86fad6da0afb60, limb1: 0x4e0d6faec54be81d8edf8bc2, limb2: 0xdff198393085a75, limb3: 0x0, }, u384 { limb0: 0x28789f28b6d5f504bd1645ca, limb1: 0x76275fcc589d038dec8db287, limb2: 0x10d50c2473146bbc, limb3: 0x0, }, u384 { limb0: 0x48506282536b08b4476c1538, limb1: 0x2a53dfd40e1022e6231ba459, limb2: 0x61e8328fb5593f9, limb3: 0x0, }, u384 { limb0: 0xf07d3c51cfa5a0dd9f6d9784, limb1: 0xd90b644bee31ac58067debf3, limb2: 0x1b589243847198de, limb3: 0x0, }, u384 { limb0: 0xced99d5ce6f67a420a3bd1f7, limb1: 0x9863b053bd4c6087190f0bdc, limb2: 0x4b00c0da1f851e5, limb3: 0x0, }, u384 { limb0: 0x2e35018b3bec8cdcb5ddfd67, limb1: 0x126a70163009a7ac27f8a8d4, limb2: 0x239941a46c2b93d9, limb3: 0x0, }, u384 { limb0: 0xc0bfecb4e87ef6814acf2ea2, limb1: 0xc2c35377cb0a3712bfc9bc3e, limb2: 0x204f26ca7993b03a, limb3: 0x0, }, u384 { limb0: 0x8d515e348ef117e926d721c, limb1: 0x39d832d8be165a1e5747cf73, limb2: 0x85aff9c7fdadba0, limb3: 0x0, }, u384 { limb0: 0x5e093158efd375df00ea2068, limb1: 0xc4ae9db044c0b0b3f10e57d0, limb2: 0x249042a8dc111f27, limb3: 0x0, }, u384 { limb0: 0x5203327b3e0825977413e96b, limb1: 0x542854f3029803e2f8455066, limb2: 0x6e799bcdf2b4a74, limb3: 0x0, }, u384 { limb0: 0xcae12085c612496183b87996, limb1: 0xa9f4d2c002921bc3fffed333, limb2: 0x1cb3caed4bffb6ac, limb3: 0x0, }, u384 { limb0: 0xab566889dcd99e84d310d51c, limb1: 0x28a128bfd4faa6a3dd6ea03c, limb2: 0xb47e9755fae4801, limb3: 0x0, }, u384 { limb0: 0x24fd1ca3f0bb730da886a4f, limb1: 0x920a0c9fd2c360a6506293bc, limb2: 0xc7e4cea365c2061, limb3: 0x0, }, u384 { limb0: 0xd9d6988c8dcd7ba4187215df, limb1: 0xbbaa30d964d6f6f63dbe1b20, limb2: 0x21da1f701bac77bc, limb3: 0x0, }, u384 { limb0: 0x19965b6edd1a9486e3c6cc55, limb1: 0x70905fb67899d10db86b47bd, limb2: 0x9ae612e8ba1ca13, limb3: 0x0, }, u384 { limb0: 0xb0c99373fe1f7a0e3b95cf3d, limb1: 0xc150f284491190e6aab75445, limb2: 0x262e1e0b56cac47f, limb3: 0x0, }, u384 { limb0: 0x29fd4ddeaa5d3f67491d34bd, limb1: 0x2c87c293e3bb7c9e2a7bfa5f, limb2: 0x234bf4a7dce7587c, limb3: 0x0, }, u384 { limb0: 0x213d7432eee67f6cb69f70c2, limb1: 0x2d0a527cac744fb658d2690e, limb2: 0x2f6cbac694c886b0, limb3: 0x0, }, u384 { limb0: 0x2fff818d9a3300876dec3ad9, limb1: 0x7bb8c9fdf78b7aded52aa184, limb2: 0x22accb18b7c49b4b, limb3: 0x0, }, u384 { limb0: 0x2a0b3d3cbf623a1df7f8f2fc, limb1: 0xd659f22d2c77be302eabd918, limb2: 0x81e2f0652f898c6, limb3: 0x0, }, u384 { limb0: 0x90f3ffc016b3186ad675b935, limb1: 0xcea3ada75d669b8c534b9628, limb2: 0x12c0a25e70d006ec, limb3: 0x0, }, u384 { limb0: 0x9edd56f49f8d4f2381df3259, limb1: 0x2fd6fc869df24d7ab56efd34, limb2: 0x10ef9c23848128cc, limb3: 0x0, }, u384 { limb0: 0x9491e0620bda347962b240f0, limb1: 0xd4a81262b71df1bcc2c1d41b, limb2: 0x2161cd280772819d, limb3: 0x0, }, u384 { limb0: 0xf799bc41b7f4fdd12cb8d38a, limb1: 0xb406590041b5248292533364, limb2: 0x2cebb0ae5108318e, limb3: 0x0, }, u384 { limb0: 0xa656880fb759e08709a0a62f, limb1: 0xfe4f7c22d9561f3bf2852283, limb2: 0x2b2092f86b5979a7, limb3: 0x0, }, u384 { limb0: 0xcf643e7382b2d8507a065fed, limb1: 0x8146188425a442450cfc900, limb2: 0x1566b3402d774b8c, limb3: 0x0, }, u384 { limb0: 0xfccf8d3d1a163e601d1a0173, limb1: 0x8fb4c56d6c57ba01627c3635, limb2: 0x11a316aa31607f26, limb3: 0x0, }, u384 { limb0: 0x4644609152e353d9c2874e44, limb1: 0xb782648b560e595408a5e843, limb2: 0xde7ee069c934256, limb3: 0x0, }, u384 { limb0: 0xe706c72e67128b8949eab1af, limb1: 0xcc84df0297708c5e5845c36a, limb2: 0x2d36f4029245704, limb3: 0x0, }, u384 { limb0: 0xd82dabdc284d7951d546f858, limb1: 0xf53198c217fb34e899bde46c, limb2: 0x1b8cc326b5ee160, limb3: 0x0, }, u384 { limb0: 0xfd4ddf8a96ece85407550ebb, limb1: 0x10689fb2187b71694cbf9203, limb2: 0x27625da0f73ea071, limb3: 0x0, }, u384 { limb0: 0xedda06cb99ba025b94e4790d, limb1: 0xcdc0da581a6950f6dea349c3, limb2: 0x1cd8338a3e5b1ad7, limb3: 0x0, }, u384 { limb0: 0xd3e67e877a10a84072741a56, limb1: 0xa763856c94b6438c78a8aed8, limb2: 0x5ea02d65b209f6d, limb3: 0x0, }, u384 { limb0: 0xd627e810817743ce03330a55, limb1: 0x5366cfcf284a895d8b6250ce, limb2: 0x9f7cb68d4e388f8, limb3: 0x0, }, u384 { limb0: 0x202e4ebcdfeb969e9d5c1212, limb1: 0x27b043f5e58dbd1aec13995a, limb2: 0x18c6230ddc0f8968, limb3: 0x0, }, u384 { limb0: 0xbfd2e1a10578232096db6dcd, limb1: 0x1a91c0a0fdccdaa8452e4f07, limb2: 0x73a6114b997285e, limb3: 0x0, }, u384 { limb0: 0xb1660ce7a3e7742b2f37be7f, limb1: 0x22c6a1fc0838adf5fe013f39, limb2: 0x2e78746340b2a6d2, limb3: 0x0, }, u384 { limb0: 0x6553def28e675259d3e5c851, limb1: 0x6303ad8e5e4bf4249b7ea84, limb2: 0x7aa27e7150baddd, limb3: 0x0, }, u384 { limb0: 0xb4643f680cbc98345715ead8, limb1: 0xbf623d2712cf4d9fa90273cc, limb2: 0xb66fdec210ea4ea, limb3: 0x0, }, u384 { limb0: 0xb140be641acea41c49aa5e3, limb1: 0x9b633b8a4d6be51c9c0601ce, limb2: 0x2fb6a29d9f394a58, limb3: 0x0, }, u384 { limb0: 0x3d049bd675a69dc889b2ce2a, limb1: 0xfc845e9c1c2cd1288569fb24, limb2: 0x29025cc66fd041c4, limb3: 0x0, }, u384 { limb0: 0xfa695168b85d534b17be3f48, limb1: 0x4126214ab9c627a6f7ed731c, limb2: 0x150963f0aca9bcbe, limb3: 0x0, }, u384 { limb0: 0x7bec0d5798a08a32a61a8a65, limb1: 0x3f72c1bfc6656eb7b5bca2e4, limb2: 0xed5978030225766, limb3: 0x0, }, u384 { limb0: 0x3000debfc8d30c06143cc084, limb1: 0x3d30ae188c767f391c11888a, limb2: 0x7e19cb8a893369b, limb3: 0x0, }, u384 { limb0: 0x28d2c052cd860afb4a3aa272, limb1: 0xe5f1eeeafb5eb8ec2b6ecfe5, limb2: 0x600c7d2b6946345, limb3: 0x0, }, u384 { limb0: 0xa480e19ea0125119f0385705, limb1: 0x3022a1f33d6523b4773f2cd0, limb2: 0x596083b6c972bc1, limb3: 0x0, }, u384 { limb0: 0x99a8e1ef6db21043631e24c4, limb1: 0x7f98b9d8663d85db2e645130, limb2: 0x210b5c36f27a07d9, limb3: 0x0, }, u384 { limb0: 0x74e9159326a8f4930b7883f9, limb1: 0xc7bb9f3d563c5cc201c24898, limb2: 0x13bb2764bf1475cf, limb3: 0x0, }, u384 { limb0: 0x81e89997219e4b7576e24d30, limb1: 0x80eb082862a76757287872b1, limb2: 0x202cf557d625c260, limb3: 0x0, }, u384 { limb0: 0x3d905a4728ea1f95fd8824b2, limb1: 0x76d49e97142d220601fbc5a0, limb2: 0xe561c3f8bd4f76e, limb3: 0x0, }, u384 { limb0: 0xbbe827307c33ae9ed7890597, limb1: 0x471785de07bd9809d57dd859, limb2: 0xde20097480e7555, limb3: 0x0, }, u384 { limb0: 0x3cb72bb80cde8edd76d2e97d, limb1: 0xb810df8c5788eebcfd282561, limb2: 0x72f2a6287fb984b, limb3: 0x0, }, ]; #[cfg(test)] mod tests { use core::circuit::u384; use super::poseidon_hash_2_bn254; #[test] fn test_run_poseidon_grumpkin_circuit_1() { let x: u384 = u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }; let y: u384 = u384 { limb0: 2, limb1: 0, limb2: 0, limb3: 0 }; let z: u384 = u384 { limb0: 35961034779122590217458358426, limb1: 19176342235218042678530152434, limb2: 1251086958891274305, limb3: 0, }; assert_eq!(poseidon_hash_2_bn254(x, y), z); } #[ignore] // Ignored for auto-benchmarks #[test] fn test_run_poseidon_grumpkin_circuit_2() { let x: u384 = u384 { limb0: 1234556789, limb1: 0, limb2: 0, limb3: 0 }; let y: u384 = u384 { limb0: 987654321, limb1: 0, limb2: 0, limb3: 0 }; let z: u384 = u384 { limb0: 8305167385555799669027062613, limb1: 57704763612671584465832054609, limb2: 430243426511221670, limb3: 0, }; assert_eq!(poseidon_hash_2_bn254(x, y), z); } } ================================================ FILE: src/src/hashes/sha_512.cairo ================================================ // Optimized version, originally from Alexandria library. // use core::integer::{bitwise, u64_bitwise}; use core::num::traits::WrappingAdd; use core::traits::{BitAnd, BitNot, BitOr, BitXor}; // Variable naming is compliant to RFC-6234 (https://datatracker.ietf.org/doc/html/rfc6234) pub const SHA512_LEN: usize = 64; pub const TWO_POW_56_NZ: NonZero = 0x100000000000000; pub const TWO_POW_48_NZ: NonZero = 0x1000000000000; pub const TWO_POW_40_NZ: NonZero = 0x10000000000; pub const TWO_POW_32_NZ: NonZero = 0x100000000; pub const TWO_POW_24_NZ: NonZero = 0x1000000; pub const TWO_POW_16_NZ: NonZero = 0x10000; pub const TWO_POW_8_NZ: NonZero = 0x100; pub const TWO_POW_56: u64 = 0x100000000000000; pub const TWO_POW_48: u64 = 0x1000000000000; pub const TWO_POW_40: u64 = 0x10000000000; pub const TWO_POW_32: u64 = 0x100000000; pub const TWO_POW_24: u64 = 0x1000000; pub const TWO_POW_16: u64 = 0x10000; pub const TWO_POW_8: u64 = 0x100; pub const TWO_POW_4: u64 = 0x10; pub const TWO_POW_2: u64 = 0x4; pub const TWO_POW_1: u64 = 0x2; pub const TWO_POW_0: u64 = 0x1; const TWO_POW_6: u64 = 0x40; const TWO_POW_7: u64 = 0x80; const TWO_POW_14: u64 = 0x4000; const TWO_POW_18: u64 = 0x40000; const TWO_POW_19: u64 = 0x80000; const TWO_POW_28: u64 = 0x10000000; const TWO_POW_34: u64 = 0x400000000; const TWO_POW_39: u64 = 0x8000000000; const TWO_POW_41: u64 = 0x20000000000; const TWO_POW_61: u64 = 0x2000000000000000; const TWO_POW_64: u128 = 0x10000000000000000; const TWO_POW_64_MINUS_1: u64 = 0x8000000000000000; const TWO_POW_64_MINUS_8: u64 = 0x100000000000000; const TWO_POW_64_MINUS_14: u64 = 0x4000000000000; const TWO_POW_64_MINUS_18: u64 = 0x400000000000; const TWO_POW_64_MINUS_19: u64 = 0x200000000000; const TWO_POW_64_MINUS_28: u64 = 0x1000000000; const TWO_POW_64_MINUS_34: u64 = 0x40000000; const TWO_POW_64_MINUS_39: u64 = 0x2000000; const TWO_POW_64_MINUS_41: u64 = 0x800000; const TWO_POW_64_MINUS_61: u64 = 0x8; // Max u8 and u64 for bitwise operations pub const MAX_U8: u64 = 0xff; pub const MAX_U64: u128 = 0xffffffffffffffff; #[derive(Drop, Copy)] pub struct Word64 { pub data: u64, } impl WordBitAnd of BitAnd { fn bitand(lhs: Word64, rhs: Word64) -> Word64 { Word64 { data: lhs.data & rhs.data } } } impl WordBitXor of BitXor { fn bitxor(lhs: Word64, rhs: Word64) -> Word64 { Word64 { data: lhs.data ^ rhs.data } } } impl WordBitOr of BitOr { fn bitor(lhs: Word64, rhs: Word64) -> Word64 { Word64 { data: lhs.data | rhs.data } } } impl WordBitNot of BitNot { fn bitnot(a: Word64) -> Word64 { Word64 { data: ~a.data } } } impl WordAdd of Add { fn add(lhs: Word64, rhs: Word64) -> Word64 { Word64 { data: lhs.data.wrapping_add(rhs.data) } } } impl U128IntoWord of Into { fn into(self: u128) -> Word64 { Word64 { data: self.try_into().unwrap() } } } impl U64IntoWord of Into { fn into(self: u64) -> Word64 { Word64 { data: self } } } impl WordIntoFelt252 of Into { fn into(self: Word64) -> felt252 { self.data.into() } } use corelib_imports::bounded_int::{bounded_int, upcast}; use corelib_imports::circuit::conversions::{DivRemU128By64, NZ_POW64_TYPED}; impl Felt252IntoWord of Into { fn into(self: felt252) -> Word64 { let f_128: u128 = self.try_into().unwrap(); let (_, rem) = bounded_int::div_rem(f_128, NZ_POW64_TYPED); Word64 { data: upcast(rem) } } } pub trait WordOperations { fn rotr_precomputed(self: T, two_pow_n: u64, two_pow_64_n: u64) -> u128; } pub impl Word64WordOperations of WordOperations { // does the work of rotr but with precomputed values 2**n and 2**(64-n) fn rotr_precomputed(self: Word64, two_pow_n: u64, two_pow_64_n: u64) -> u128 { let data = self.data.into(); let data: u128 = math_shr_precomputed::(data, two_pow_n.into()) | math_shl_precomputed_u128(data, two_pow_64_n.into()); data } } fn ch(e: Word64, f: Word64, g: Word64) -> felt252 { (e & f).into() + (~e & g).into() } fn maj(x: Word64, y: Word64, z: Word64) -> felt252 { // (x & y) ^ (x & z) ^ (y & z) let x_xor_y = x ^ y; let x_xor_y_xor_z = x_xor_y ^ z; let res: felt252 = core::felt252_div( (x.into() + y.into() + z.into() - x_xor_y_xor_z.into()), 2, ); res } /// Performs x.rotr(28) ^ x.rotr(34) ^ x.rotr(39), /// Using precomputed values to avoid recomputation fn bsig0(x: Word64) -> u128 { // x.rotr(28) ^ x.rotr(34) ^ x.rotr(39) x.rotr_precomputed(TWO_POW_28, TWO_POW_64_MINUS_28) ^ x.rotr_precomputed(TWO_POW_34, TWO_POW_64_MINUS_34) ^ x.rotr_precomputed(TWO_POW_39, TWO_POW_64_MINUS_39) } /// Performs x.rotr(14) ^ x.rotr(18) ^ x.rotr(41), /// Using precomputed values to avoid recomputation fn bsig1(x: Word64) -> u128 { // x.rotr(14) ^ x.rotr(18) ^ x.rotr(41) x.rotr_precomputed(TWO_POW_14, TWO_POW_64_MINUS_14) ^ x.rotr_precomputed(TWO_POW_18, TWO_POW_64_MINUS_18) ^ x.rotr_precomputed(TWO_POW_41, TWO_POW_64_MINUS_41) } /// Performs x.rotr(1) ^ x.rotr(8) ^ x.shr(7), /// Using precomputed values to avoid recomputation fn ssig0(x: Word64) -> u128 { // x.rotr(1) ^ x.rotr(8) ^ x.shr(7) x.rotr_precomputed(TWO_POW_1, TWO_POW_64_MINUS_1) ^ x.rotr_precomputed(TWO_POW_8, TWO_POW_64_MINUS_8) ^ math_shr_precomputed::(x.data.into(), TWO_POW_7).into() // 2 ** 7 } /// Performs x.rotr(19) ^ x.rotr(61) ^ x.shr(6), /// Using precomputed values to avoid recomputation fn ssig1(x: Word64) -> u128 { // x.rotr(19) ^ x.rotr(61) ^ x.shr(6) x.rotr_precomputed(TWO_POW_19, TWO_POW_64_MINUS_19) ^ x.rotr_precomputed(TWO_POW_61, TWO_POW_64_MINUS_61) ^ math_shr_precomputed::(x.data, TWO_POW_6).into() // 2 ** 6 } // Shift left with precomputed powers of 2 // Only use in this file. Unsafe otherwise. fn math_shl_precomputed_u128(x: u128, two_power_n: u128) -> u128 { let mul: felt252 = x.into() * two_power_n.into(); mul.try_into().unwrap() } // Shift right with precomputed powers of 2 fn math_shr_precomputed, +Rem, +Drop, +Copy, +Into>( x: T, two_power_n: T, ) -> T { x / two_power_n } fn add_trailing_zeroes(ref data: Array, msg_len: usize) { let mdi = msg_len % 128; let padding_len = if (mdi < 112) { 119 - mdi } else { 247 - mdi }; let mut i = 0; while (i != padding_len) { data.append(0); i += 1; }; } // Input must be a multiple of 8. fn from_u8Array_to_WordArray(mut data: Span) -> Array { let mut new_arr: Array = array![]; while let Some(b8) = data.multi_pop_front::<8>() { let [b7, b6, b5, b4, b3, b2, b1, b0] = b8.unbox(); let b0: felt252 = b0.into(); let b1: felt252 = b1.into(); let b2: felt252 = b2.into(); let b3: felt252 = b3.into(); let b4: felt252 = b4.into(); let b5: felt252 = b5.into(); let b6: felt252 = b6.into(); let b7: felt252 = b7.into(); let new_word: felt252 = b0 + 256 * (b1 + 256 * (b2 + 256 * (b3 + 256 * (b4 + 256 * (b5 + 256 * (b6 + 256 * b7)))))); new_arr.append(Word64 { data: new_word.try_into().unwrap() }); } new_arr } fn from_WordArray_to_u8array(data: Span) -> Array { let mut arr: Array = array![]; // Use precomputed powers of 2 for shift right to avoid recomputation for word in data { let data_i: u64 = *word.data; let (w7, w) = DivRem::div_rem(data_i, TWO_POW_56_NZ); let (w6, w) = DivRem::div_rem(w, TWO_POW_48_NZ); let (w5, w) = DivRem::div_rem(w, TWO_POW_40_NZ); let (w4, w) = DivRem::div_rem(w, TWO_POW_32_NZ); let (w3, w) = DivRem::div_rem(w, TWO_POW_24_NZ); let (w2, w) = DivRem::div_rem(w, TWO_POW_16_NZ); let (w1, w0) = DivRem::div_rem(w, TWO_POW_8_NZ); arr.append(w7.try_into().unwrap()); arr.append(w6.try_into().unwrap()); arr.append(w5.try_into().unwrap()); arr.append(w4.try_into().unwrap()); arr.append(w3.try_into().unwrap()); arr.append(w2.try_into().unwrap()); arr.append(w1.try_into().unwrap()); arr.append(w0.try_into().unwrap()); } arr } fn digest_hash(data: Span, msg_len: usize) -> [Word64; 8] { let k = K.span(); let block_nb = msg_len / 128; let [mut h_0, mut h_1, mut h_2, mut h_3, mut h_4, mut h_5, mut h_6, mut h_7] = H; let mut i = 0; while (i != block_nb) { // Prepare message schedule let mut t: usize = 0; let mut W: Array = array![]; while (t != 80) { if t < 16 { W.append(*data.at(i * 16 + t)); } else { let buf_felt252: felt252 = ssig1(*W.at(t - 2)).into() + (*W.at(t - 7)).into() + ssig0(*W.at(t - 15)).into() + (*W.at(t - 16)).into(); let buf: Word64 = buf_felt252.into(); W.append(buf); } t += 1; } let mut a = h_0; let mut b = h_1; let mut c = h_2; let mut d = h_3; let mut e = h_4; let mut f = h_5; let mut g = h_6; let mut h = h_7; let mut W = W.span(); for _k in k { let T1_felt252: felt252 = h.into() + bsig1(e).into() + ch(e, f, g) + (*_k).into() + (*W.pop_front().unwrap()).into(); let T1_T2_felt252: felt252 = bsig0(a).into() + maj(a, b, c) + T1_felt252; h = g; g = f; f = e; e = d + T1_felt252.into(); d = c; c = b; b = a; a = T1_T2_felt252.into(); } h_0 = a + h_0; h_1 = b + h_1; h_2 = c + h_2; h_3 = d + h_3; h_4 = e + h_4; h_5 = f + h_5; h_6 = g + h_6; h_7 = h + h_7; i += 1; } return [h_0, h_1, h_2, h_3, h_4, h_5, h_6, h_7]; } pub fn sha512(mut data: Array) -> Array { let hash = _sha512(data); from_WordArray_to_u8array(hash.span()) } pub fn _sha512(mut data: Array) -> [Word64; 8] { let bit_numbers: u128 = data.len().into() * 8; // any u32 * 8 fits in u64 // let bit_numbers = bit_numbers & Bounded::::MAX.into(); let max_u8: u128 = MAX_U8.into(); let mut msg_len = data.len(); // Appends 1 data.append(0x80); add_trailing_zeroes(ref data, msg_len); // add length to the end // Use precomputed powers of 2 for shift right to avoid recomputation let mut res: u128 = math_shr_precomputed(bit_numbers, TWO_POW_56.into()) & max_u8; data.append(res.try_into().unwrap()); res = math_shr_precomputed(bit_numbers, TWO_POW_48.into()) & max_u8; data.append(res.try_into().unwrap()); res = math_shr_precomputed(bit_numbers, TWO_POW_40.into()) & max_u8; data.append(res.try_into().unwrap()); res = math_shr_precomputed(bit_numbers, TWO_POW_32.into()) & max_u8; data.append(res.try_into().unwrap()); res = math_shr_precomputed(bit_numbers, TWO_POW_24.into()) & max_u8; data.append(res.try_into().unwrap()); res = math_shr_precomputed(bit_numbers, TWO_POW_16.into()) & max_u8; data.append(res.try_into().unwrap()); res = math_shr_precomputed(bit_numbers, TWO_POW_8.into()) & max_u8; data.append(res.try_into().unwrap()); res = math_shr_precomputed(bit_numbers, TWO_POW_0.into()) & max_u8; data.append(res.try_into().unwrap()); msg_len = data.len(); let mut data = from_u8Array_to_WordArray(data.span()); let hash = digest_hash(data.span(), msg_len); hash } const H: [Word64; 8] = [ Word64 { data: 0x6a09e667f3bcc908 }, Word64 { data: 0xbb67ae8584caa73b }, Word64 { data: 0x3c6ef372fe94f82b }, Word64 { data: 0xa54ff53a5f1d36f1 }, Word64 { data: 0x510e527fade682d1 }, Word64 { data: 0x9b05688c2b3e6c1f }, Word64 { data: 0x1f83d9abfb41bd6b }, Word64 { data: 0x5be0cd19137e2179 }, ]; const K: [Word64; 80] = [ Word64 { data: 0x428a2f98d728ae22 }, Word64 { data: 0x7137449123ef65cd }, Word64 { data: 0xb5c0fbcfec4d3b2f }, Word64 { data: 0xe9b5dba58189dbbc }, Word64 { data: 0x3956c25bf348b538 }, Word64 { data: 0x59f111f1b605d019 }, Word64 { data: 0x923f82a4af194f9b }, Word64 { data: 0xab1c5ed5da6d8118 }, Word64 { data: 0xd807aa98a3030242 }, Word64 { data: 0x12835b0145706fbe }, Word64 { data: 0x243185be4ee4b28c }, Word64 { data: 0x550c7dc3d5ffb4e2 }, Word64 { data: 0x72be5d74f27b896f }, Word64 { data: 0x80deb1fe3b1696b1 }, Word64 { data: 0x9bdc06a725c71235 }, Word64 { data: 0xc19bf174cf692694 }, Word64 { data: 0xe49b69c19ef14ad2 }, Word64 { data: 0xefbe4786384f25e3 }, Word64 { data: 0x0fc19dc68b8cd5b5 }, Word64 { data: 0x240ca1cc77ac9c65 }, Word64 { data: 0x2de92c6f592b0275 }, Word64 { data: 0x4a7484aa6ea6e483 }, Word64 { data: 0x5cb0a9dcbd41fbd4 }, Word64 { data: 0x76f988da831153b5 }, Word64 { data: 0x983e5152ee66dfab }, Word64 { data: 0xa831c66d2db43210 }, Word64 { data: 0xb00327c898fb213f }, Word64 { data: 0xbf597fc7beef0ee4 }, Word64 { data: 0xc6e00bf33da88fc2 }, Word64 { data: 0xd5a79147930aa725 }, Word64 { data: 0x06ca6351e003826f }, Word64 { data: 0x142929670a0e6e70 }, Word64 { data: 0x27b70a8546d22ffc }, Word64 { data: 0x2e1b21385c26c926 }, Word64 { data: 0x4d2c6dfc5ac42aed }, Word64 { data: 0x53380d139d95b3df }, Word64 { data: 0x650a73548baf63de }, Word64 { data: 0x766a0abb3c77b2a8 }, Word64 { data: 0x81c2c92e47edaee6 }, Word64 { data: 0x92722c851482353b }, Word64 { data: 0xa2bfe8a14cf10364 }, Word64 { data: 0xa81a664bbc423001 }, Word64 { data: 0xc24b8b70d0f89791 }, Word64 { data: 0xc76c51a30654be30 }, Word64 { data: 0xd192e819d6ef5218 }, Word64 { data: 0xd69906245565a910 }, Word64 { data: 0xf40e35855771202a }, Word64 { data: 0x106aa07032bbd1b8 }, Word64 { data: 0x19a4c116b8d2d0c8 }, Word64 { data: 0x1e376c085141ab53 }, Word64 { data: 0x2748774cdf8eeb99 }, Word64 { data: 0x34b0bcb5e19b48a8 }, Word64 { data: 0x391c0cb3c5c95a63 }, Word64 { data: 0x4ed8aa4ae3418acb }, Word64 { data: 0x5b9cca4f7763e373 }, Word64 { data: 0x682e6ff3d6b2b8a3 }, Word64 { data: 0x748f82ee5defb2fc }, Word64 { data: 0x78a5636f43172f60 }, Word64 { data: 0x84c87814a1f0ab72 }, Word64 { data: 0x8cc702081a6439ec }, Word64 { data: 0x90befffa23631e28 }, Word64 { data: 0xa4506cebde82bde9 }, Word64 { data: 0xbef9a3f7b2c67915 }, Word64 { data: 0xc67178f2e372532b }, Word64 { data: 0xca273eceea26619c }, Word64 { data: 0xd186b8c721c0c207 }, Word64 { data: 0xeada7dd6cde0eb1e }, Word64 { data: 0xf57d4f7fee6ed178 }, Word64 { data: 0x06f067aa72176fba }, Word64 { data: 0x0a637dc5a2c898a6 }, Word64 { data: 0x113f9804bef90dae }, Word64 { data: 0x1b710b35131c471b }, Word64 { data: 0x28db77f523047d84 }, Word64 { data: 0x32caab7b40c72493 }, Word64 { data: 0x3c9ebe0a15c9bebc }, Word64 { data: 0x431d67c49c100d4c }, Word64 { data: 0x4cc5d4becb3e42b6 }, Word64 { data: 0x597f299cfc657e2a }, Word64 { data: 0x5fcb6fab3ad6faec }, Word64 { data: 0x6c44198c4a475817 }, ]; ================================================ FILE: src/src/lib.cairo ================================================ pub mod apps { pub mod drand; pub mod noir; pub mod risc0; pub mod sp1; pub mod sp1_constants; } pub mod basic_field_ops; pub mod core { pub mod circuit; } pub mod circuits { pub(crate) mod dummy; pub(crate) mod ec; pub(crate) mod extf_mul; pub(crate) mod isogeny; pub(crate) mod multi_pairing_check; pub(crate) mod rsa; pub(crate) mod tower_circuits; } pub mod crypto { pub mod mmr; } pub mod definitions; pub mod ec { pub mod ec_ops; pub mod ec_ops_g2; pub mod selectors; pub mod pairing { pub mod groth16; pub mod pairing_check; pub mod single_pairing_tower; } } pub mod hashes { pub mod poseidon_bn254; pub mod sha_512; pub use poseidon_bn254::poseidon_hash_2_bn254; pub use sha_512::sha512; } pub mod signatures { pub mod ecdsa; pub mod eddsa_25519; pub mod rsa; pub mod schnorr; } mod tests { mod autogenerated { #[cfg(test)] mod ecdsa_tests; #[cfg(test)] mod eddsa_tests; #[cfg(test)] mod msm_tests; #[cfg(test)] mod pairing_tests; #[cfg(test)] mod rsa_tests; #[cfg(test)] mod schnorr_tests; #[cfg(test)] mod tower_pairing_tests; } #[cfg(test)] mod calldata_tests; #[cfg(test)] mod sha512_tests; #[cfg(test)] mod sp1_groth_16_tests; } pub mod utils { pub mod calldata; pub mod hashing; pub mod neg_3; use core::circuit::u384; use core::panic_with_felt252; pub fn u384_assert_zero(x: u384) { if x.limb0 != 0 { panic_with_felt252('not zero l0'); } if x.limb1 != 0 { panic_with_felt252('not zero l1'); } if x.limb2 != 0 { panic_with_felt252('not zero l2'); } if x.limb3 != 0 { panic_with_felt252('not zero l3'); } } pub fn u384_assert_eq(x: u384, y: u384) { if x.limb0 != y.limb0 { panic_with_felt252('not equal l0'); } if x.limb1 != y.limb1 { panic_with_felt252('not equal l1'); } if x.limb2 != y.limb2 { panic_with_felt252('not equal l2'); } if x.limb3 != y.limb3 { panic_with_felt252('not equal l3'); } } pub fn usize_assert_eq(x: usize, y: usize) { if x != y { panic_with_felt252('not equal usize'); } } // Returns true if all limbs of x are zero, false otherwise. pub fn u384_eq_zero(x: u384) -> bool { if x.limb0 != 0 { return false; } if x.limb1 != 0 { return false; } if x.limb2 != 0 { return false; } if x.limb3 != 0 { return false; } true } } pub use garaga::ec::ec_ops; pub use garaga::ec::ec_ops_g2; pub use garaga::ec::pairing::{groth16, pairing_check, single_pairing_tower}; #[cfg(test)] mod tests_lib { use core::circuit::{ AddInputResultTrait, AddMod, CircuitElement, CircuitInput, CircuitInputs, CircuitModulus, CircuitOutputsTrait, EvalCircuitTrait, MulMod, RangeCheck96, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, u96, }; use core::traits::TryInto; #[test] #[ignore] // Ignored for auto-benchmarks fn test_u96() { let a: u96 = 0x123; assert_eq!(a, 0x123); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_builtins() { core::internal::require_implicit::(); core::internal::require_implicit::(); core::internal::require_implicit::(); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_circuit_success() { let in1 = CircuitElement::> {}; let in2 = CircuitElement::> {}; let add = circuit_add(in1, in2); let inv = circuit_inverse(add); let sub = circuit_sub(inv, in2); let mul = circuit_mul(inv, sub); let modulus = TryInto::<_, CircuitModulus>::try_into([7, 0, 0, 0]).unwrap(); let outputs = (mul, add, inv) .new_inputs() .next([3, 0, 0, 0]) .next([6, 0, 0, 0]) .done() .eval(modulus) .unwrap(); assert_eq!(outputs.get_output(add), u384 { limb0: 2, limb1: 0, limb2: 0, limb3: 0 }); assert_eq!(outputs.get_output(inv), u384 { limb0: 4, limb1: 0, limb2: 0, limb3: 0 }); assert_eq!(outputs.get_output(sub), u384 { limb0: 5, limb1: 0, limb2: 0, limb3: 0 }); assert_eq!(outputs.get_output(mul), u384 { limb0: 6, limb1: 0, limb2: 0, limb3: 0 }); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_circuit_failure() { let in0 = CircuitElement::> {}; let out0 = circuit_inverse(in0); let modulus = TryInto::<_, CircuitModulus>::try_into([55, 0, 0, 0]).unwrap(); (out0,).new_inputs().next([11, 0, 0, 0]).done().eval(modulus).unwrap_err(); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_fill_inputs_loop() { let in1 = CircuitElement::> {}; let in2 = CircuitElement::> {}; let add = circuit_add(in1, in2); let mut inputs: Array<[u96; 4]> = array![[1, 0, 0, 0], [2, 0, 0, 0]]; let mut circuit_inputs = (add,).new_inputs(); while let Option::Some(input) = inputs.pop_front() { circuit_inputs = circuit_inputs.next(input); } let modulus = TryInto::<_, CircuitModulus>::try_into([55, 0, 0, 0]).unwrap(); circuit_inputs.done().eval(modulus).unwrap(); } } ================================================ FILE: src/src/signatures/ecdsa.cairo ================================================ use garaga::basic_field_ops::{inv_mod_p, is_even_u384, mul_mod_p, reduce_mod_p}; use garaga::definitions::{ G1Point, Zero, deserialize_u384, get_G, get_curve_order_modulus, get_n, serialize_u384, u384, }; use garaga::ec_ops::{G1PointTrait, msm_g1}; use garaga::utils::u384_eq_zero; /// An ECDSA signature with message hash. /// /// # Fields /// * `rx`: `u384` - The r component (R.x mod n) of the signature. /// * `s`: `u256` - The s component of the signature. /// * `v`: `bool` - The parity of R.y (false if R.y is even, true if odd). /// * `z`: `u256` - The message hash. #[derive(Drop, Debug, PartialEq)] pub struct ECDSASignature { pub rx: u384, pub s: u256, pub v: bool, pub z: u256, } pub impl SerdeECDSASignature of Serde { fn serialize(self: @ECDSASignature, ref output: Array) { serialize_u384(self.rx, ref output); Serde::::serialize(self.s, ref output); Serde::::serialize(self.v, ref output); Serde::::serialize(self.z, ref output); } fn deserialize(ref serialized: Span) -> Option { let rx = deserialize_u384(ref serialized); let s = Serde::::deserialize(ref serialized).unwrap(); let v = Serde::::deserialize(ref serialized).unwrap(); let z = Serde::::deserialize(ref serialized).unwrap(); return Option::Some(ECDSASignature { rx, s, v, z }); } } /// An ECDSA signature bundled with computation hints required for Cairo verification. /// /// # Fields /// * `signature`: `ECDSASignature` - The core signature data. /// * `msm_hint`: `Span` - Hint for multi-scalar multiplication computation. #[derive(Drop, Debug, PartialEq, Serde)] pub struct ECDSASignatureWithHint { pub signature: ECDSASignature, pub msm_hint: Span, } /// Verifies an ECDSA signature with associated hints, assuming the message hash is correct. /// /// # Important Assumption /// **This function assumes that the message hash `z` has been correctly computed from the message /// by the caller.** It does not compute or verify the hash derivation itself. The caller is /// responsible for ensuring that `z = H(message)` (or the appropriate hash function for their /// protocol) before calling this function. /// /// # Arguments /// * `signature`: `ECDSASignatureWithHint` - The signature and verification data bundle containing: /// - rx: The r component (R.x mod n) of the signature /// - s: The s component of the signature /// - v: The parity of R.y /// - z: The message hash (assumed to be correctly computed by the caller) /// - msm_hint: Hint for multi-scalar multiplication /// * `public_key`: `G1Point` - The public key to verify against. /// * `curve_id`: `usize` - The curve identifier /// /// # Algorithm /// The ECDSA signature verification checks if the signature (r,s) is valid for a given message hash /// z: /// 1. Verify that r is non-zero and s ∈ {1, ..., n-1} /// 2. Verify that the public key P is on the curve /// 3. Compute w = s⁻¹ mod n /// 4. Compute u₁ = zw mod n and u₂ = rw mod n /// 5. Compute R' = u₁G + u₂P /// 6. Verify that R'.x mod n equals r (implicitly checks r < n) and R'.y's parity does NOT match v /// /!\ Note: Behaviour for cofactor > 1 only tested on curves with cofactor 1 /// (BN254, SECP256K1/R1, GRUMPKIN). pub fn is_valid_ecdsa_signature_assuming_hash( signature: ECDSASignatureWithHint, public_key: G1Point, curve_id: usize, ) -> bool { let ECDSASignatureWithHint { signature, msm_hint } = signature; let ECDSASignature { rx, s, v, z } = signature; let n: u256 = get_n(curve_id); let modulus = get_curve_order_modulus(curve_id); // Check that r is non-zero and s is in range {1, ..., n-1} // Note: r < n is implicitly checked later when comparing r_prime.x mod n == r if u384_eq_zero(rx) || s >= n || s == 0 { return false; } // Verify public key is on curve if !public_key.is_on_curve_excluding_infinity(curve_id) { return false; } // Compute s⁻¹ mod n using the inv_mod_p function let s_u384: u384 = s.into(); let s_inv = inv_mod_p(s_u384, modulus); // Compute u₁ = z·s⁻¹ mod n and u₂ = r·s⁻¹ mod n let u1: u256 = mul_mod_p(z.into(), s_inv, modulus).try_into().unwrap(); let u2: u256 = mul_mod_p(rx, s_inv, modulus).try_into().unwrap(); // Compute R' = u₁G + u₂P using MSM let points = array![get_G(curve_id), public_key].span(); let scalars = array![u1, u2].span(); let R_prime = msm_g1(points, scalars, curve_id, msm_hint); // Check R'.x mod n equals r and R'.y parity matches v // Note : if cofactor is 1, no need to reduce r_prime.x mod n let ry_prime_parity = is_even_u384(R_prime.y); let r_prime_x_mod_n = reduce_mod_p(R_prime.x, modulus); if R_prime.is_zero() || r_prime_x_mod_n != rx || ry_prime_parity == v { return false; } true } ================================================ FILE: src/src/signatures/eddsa_25519.cairo ================================================ use core::circuit::{ CircuitElement, CircuitInput, CircuitInputs, CircuitOutputsTrait, EvalCircuitTrait, circuit_add, circuit_inverse, circuit_mul, circuit_sub, u384, }; use core::integer::u128_byte_reverse; use garaga::basic_field_ops::{neg_mod_p, u512_mod_p}; use garaga::circuits::ec; use garaga::core::circuit::{AddInputResultTrait2, u288IntoCircuitInputValue}; use garaga::definitions::{ G1Point, Zero, get_ED25519_modulus, get_a, get_curve_order_modulus, get_modulus, u288Serde, }; use garaga::ec_ops::{G1PointTrait, ec_safe_add, msm_fake_glv}; use garaga::hashes::sha_512::_sha512; const POW_2_32_u64: NonZero = 0x100000000; const POW_2_127_u128: NonZero = 0x80000000000000000000000000000000; const POW_2_8_u128: NonZero = 0x100; const POW_2_64_u128: u128 = 0x10000000000000000; const X22519_u256: u256 = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed; const D_TWISTED: u384 = u384 { limb0: 0x4141d8ab75eb4dca135978a3, limb1: 0x8cc740797779e89800700a4d, limb2: 0x52036cee2b6ffe73, limb3: 0x0, }; const A_TWISTED: u384 = u384 { limb0: 0xffffffffffffffffffffffec, limb1: 0xffffffffffffffffffffffff, limb2: 0x7fffffffffffffff, limb3: 0x0, }; const G_neg: G1Point = G1Point { x: u384 { limb0: 0xd617c9aca55c89b025aef35, limb1: 0xf00b8f02f1c20618a9c13fdf, limb2: 0x2a78dd0fd02c0339, limb3: 0x0, }, y: u384 { limb0: 0x7f8ece9a6487cf0c09d3e2d9, limb1: 0x41b7c45a9c867cdc30902f9e, limb2: 0x5639bb5a38e25dd1, limb3: 0x0, }, }; #[derive(Copy, Drop, Debug, PartialEq, Serde)] pub struct EdDSASignature { pub Ry_twisted: u256, // Compressed form of Ry (converted to integer from little endian bytes) pub s: u256, pub msg: Span, } #[derive(Copy, Drop, Debug, PartialEq, Serde)] pub struct EdDSASignatureWithHint { pub signature: EdDSASignature, pub msm_hint: Span, pub sqrt_Rx_hint: u256, pub sqrt_Px_hint: u256, } /// Verifies an Ed25519 signature according to RFC 8032. /// /// # Security /// This implementation follows RFC 8032 Section 5.1.7 by explicitly rejecting /// small-order points. Both the signature point R and public key A are tested /// to ensure [8]P ≠ 𝒪, preventing key-compromise and signature-malleability /// attacks that could arise from small-order components. /// /// # Parameters /// - `signature`: The signature with hints for point decompression and MSM /// - `Py_twisted`: Compressed form of Public Key y-coordinate (converted to integer from little /// endian bytes) /// /// # Returns /// - `true` if the signature is valid /// - `false` if the signature is invalid or contains small-order points pub fn is_valid_eddsa_signature(signature: EdDSASignatureWithHint, Py_twisted: u256) -> bool { let EdDSASignatureWithHint { signature, mut msm_hint, sqrt_Rx_hint, sqrt_Px_hint } = signature; let EdDSASignature { Ry_twisted, s, msg } = signature; let R_opt: Option = decompress_edwards_pt_from_y_compressed_le_into_weirstrass_point( Ry_twisted, sqrt_Rx_hint, ); let P_opt: Option = decompress_edwards_pt_from_y_compressed_le_into_weirstrass_point( Py_twisted, sqrt_Px_hint, ); if P_opt.is_none() || R_opt.is_none() { return false; } let P: G1Point = P_opt.unwrap(); let R: G1Point = R_opt.unwrap(); // Verify points lie on the curve (but may be outside the prime-order subgroup) if !R.is_on_curve_excluding_infinity(4) || !P.is_on_curve_excluding_infinity(4) { return false; } // Reject small-order points explicitly to prevent key-compromise and // signature-malleability attacks. Check [8]P = 𝒪 for both R and the public key. if is_small_order_point(R, 4) || is_small_order_point(P, 4) { return false; } let mut data: Array = array![]; // Hash(Ry + Py + msg) append_u256_le_to_u8_be_array(Ry_twisted, ref data); append_u256_le_to_u8_be_array(Py_twisted, ref data); for byte in msg { data.append(*byte); } // println!("preimage: {:?}", data); let hash = _sha512(data); let [h0, h1, h2, h3, h4, h5, h6, h7] = hash; // println!("hash_bytes: {:?}", hash_bytes); let high_high_128: u128 = h1.data.into() + h0.data.into() * POW_2_64_u128; let high_low_128: u128 = h3.data.into() + h2.data.into() * POW_2_64_u128; let low_high_128: u128 = h5.data.into() + h4.data.into() * POW_2_64_u128; let low_low_128: u128 = h7.data.into() + h6.data.into() * POW_2_64_u128; let high_256 = u256 { low: high_low_128, high: high_high_128 }; let low_256 = u256 { low: low_low_128, high: low_high_128 }; // [hh0, ..., hh15] [hl0, ..., hl15] [lh0, ..., lh15] [ll0, ..., ll15] let hh_le = u128_byte_reverse(low_256.low); let hl_le = u128_byte_reverse(low_256.high); let lh_le = u128_byte_reverse(high_256.low); let ll_le = u128_byte_reverse(high_256.high); // u512 from hash bytes (little endian) // [ll15, ..., ll0] [lh15, ..., lh0] [hl15, ..., hl0] [hh15, ..., hh0] let h_le: u384 = u256 { low: hl_le, high: hh_le }.into(); let l_le: u384 = u256 { low: ll_le, high: lh_le }.into(); // println!("h_le: {:?}", h_le); // println!("l_le: {:?}", l_le); let order_modulus = get_curve_order_modulus(4); let h_mod_p = u512_mod_p(h_le, l_le, order_modulus); // Calculate h = hash(R + pubKey + msg) mod q // Calculate P1 = s * G // Calculate P2 = R + h * pubKey // Return s*G == R + h * pubKey // <=> s*(-G) + h * pubKey + R == 0 let points: Span = array![G_neg, P].span(); let scalars: Span = array![s, h_mod_p.try_into().unwrap()].span(); let msm_result = msm_fake_glv(points, scalars, 4, ref msm_hint); return ec_safe_add(msm_result, R, 4).is_infinity(); } /// Checks if a point has small order (order dividing the cofactor 8). /// /// For Ed25519 the full curve has order 8×ℓ where ℓ is the prime-order subgroup. /// Small-order points (orders 1, 2, 4, 8) can enable attacks, so they must be rejected. /// /// # Implementation /// Tests for small-order by checking if [2^k]P = 𝒪 for k = 1, 2, or 3 (i.e., orders 2, 4, or 8). /// Uses the fact that on Weierstrass curves, a point equals its negation (hence has order 2) /// iff its y-coordinate is zero. Returns true if P has order dividing 8. /// /// # Parameters /// - `p`: The point to test /// - `curve_index`: Must be 4 (Ed25519) /// /// # Returns /// - `true` if P has small order (should be rejected) /// - `false` if P is in the large subgroup (acceptable) fn is_small_order_point(p: G1Point, curve_index: usize) -> bool { // Compute [8]P = [2^3]P by three doublings if p.y.is_zero() { // => P=-P => 2P = 0 return true; } let modulus = get_modulus(curve_index); let a = get_a(curve_index); let (p2) = ec::run_DOUBLE_EC_POINT_circuit(p, a, modulus); if p2.y.is_zero() { // => 2P=-2P => 4P = 0 return true; } let (p4) = ec::run_DOUBLE_EC_POINT_circuit(p2, a, modulus); if p4.y.is_zero() { // => 4P=-4P => 8P = 0 return true; } // If [8]P = 𝒪 then P has order dividing 8 (small-order point) return false; } pub fn decompress_edwards_pt_from_y_compressed_le_into_weirstrass_point( y_twisted_compressed: u256, sqrt_hint: u256, ) -> Option { let (bit_sign, y_high): (u128, u128) = DivRem::div_rem( y_twisted_compressed.high, POW_2_127_u128, ); let modulus = get_ED25519_modulus(); // println!("sqrt_hint: 0x{:x}", sqrt_hint); let sqrt_hint_384: u384 = sqrt_hint.into(); let x_384: u384 = match sqrt_hint.low % 2 == bit_sign % 2 { true => sqrt_hint_384, false => neg_mod_p(sqrt_hint_384, modulus), }; let y = u256 { low: y_twisted_compressed.low, high: y_high }; let y_u384: u384 = y.into(); let y = CircuitElement::> {}; let f1 = CircuitElement::> {}; let d = CircuitElement::> {}; let sqrt_x = CircuitElement::> {}; let y_sq = circuit_mul(y, y); let num = circuit_sub(y_sq, f1); let d_mul_y_sq = circuit_mul(d, y_sq); let den = circuit_add(d_mul_y_sq, f1); let inv_den = circuit_inverse(den); let x_sq = circuit_mul(num, inv_den); let sqrt_x_sq = circuit_mul(sqrt_x, sqrt_x); let check = circuit_sub(sqrt_x_sq, x_sq); let outputs = (check,) .new_inputs() .next_2(y_u384) .next_2([1, 0, 0, 0]) .next_2([0x4141d8ab75eb4dca135978a3, 0x8cc740797779e89800700a4d, 0x52036cee2b6ffe73, 0x0]) .next_2(x_384) .done_2() .eval(modulus) .unwrap(); let sqrt_check = outputs.get_output(check); if sqrt_check.is_non_zero() { return None; } if sqrt_hint >= X22519_u256 { return None; } return Some(to_weierstrass(x_384, y_u384)); } // Convert twisted Edwards Ed25519 point to equivalent Weierstrass point pub fn to_weierstrass(x_twisted: u384, y_twisted: u384) -> G1Point { let x_t = CircuitElement::> {}; let y_t = CircuitElement::> {}; let a = CircuitElement::> {}; let d = CircuitElement::> {}; let four = CircuitElement::> {}; let five = CircuitElement::> {}; let twelve = CircuitElement::> {}; let modulus = get_ED25519_modulus(); let five_a = circuit_mul(five, a); let a_y_twisted = circuit_mul(a, y_t); let d_y_twisted = circuit_mul(d, y_t); let five_d_y_twisted = circuit_mul(five, d_y_twisted); let num_x = circuit_sub(circuit_add(five_a, a_y_twisted), circuit_add(five_d_y_twisted, d)); let den_x = circuit_sub(twelve, circuit_mul(twelve, y_t)); let _x = circuit_mul(num_x, circuit_inverse(den_x)); let num_y = circuit_sub(circuit_add(a, a_y_twisted), circuit_add(d_y_twisted, d)); let four_xt = circuit_mul(four, x_t); let den_y = circuit_sub(four_xt, circuit_mul(four_xt, y_t)); let _y = circuit_mul(num_y, circuit_inverse(den_y)); let outputs = (_x, _y) .new_inputs() .next_2(x_twisted) .next_2(y_twisted) .next_2(A_TWISTED) .next_2(D_TWISTED) .next_2([4, 0, 0, 0]) .next_2([5, 0, 0, 0]) .next_2([12, 0, 0, 0]) .done_2() .eval(modulus) .unwrap(); let x = outputs.get_output(_x); let y = outputs.get_output(_y); G1Point { x: x, y: y } } #[inline] pub fn u256_byte_reverse(word: u256) -> u256 { u256 { low: core::integer::u128_byte_reverse(word.high), high: core::integer::u128_byte_reverse(word.low), } } // Append u256 as little endian to u8 array fn append_u256_le_to_u8_be_array(x_le: u256, ref arr: Array) { let mut high = x_le.high; let mut low = x_le.low; let mut i: felt252 = 0; while (i != 16) { let (temp_remaining, byte) = DivRem::div_rem(low, POW_2_8_u128); arr.append(byte.try_into().unwrap()); low = temp_remaining; i += 1; } let mut j: felt252 = 0; while (j != 16) { let (temp_remaining, byte) = DivRem::div_rem(high, POW_2_8_u128); arr.append(byte.try_into().unwrap()); high = temp_remaining; j += 1; } } ================================================ FILE: src/src/signatures/rsa.cairo ================================================ //! RSA-2048 signature verification via multi-channel RNS arithmetic. //! //! Verifies s^{65537} ≡ m (mod n) for a 2048-bit RSA modulus n without //! native 2048-bit arithmetic. Integers are represented in a Residue Number //! System (RNS) defined by 11 pairwise coprime ~384-bit primes p_1, ..., p_{11}. //! //! Each modular reduction a·b = q·n + r in the exponentiation chain is verified //! by evaluating chunk polynomials at α_i = (2^{96})^4 mod p_i via Horner's method //! and checking a(α_i)·b(α_i) - q(α_i)·n(α_i) - r(α_i) = 0 for all i. //! //! The CRT exactness theorem guarantees that if all 11 channel checks pass and //! ∏ p_i exceeds the maximum deviation |a·b - q·n - r|, then the integer //! relation holds exactly. use core::circuit::{CircuitModulus, u384, u96}; use core::num::traits::Zero; use core::serde::Serde; use core::sha256::compute_sha256_byte_array; use core::traits::TryInto; use corelib_imports::bounded_int::{downcast, upcast}; use garaga::basic_field_ops::is_even_u384; use garaga::circuits::rsa::run_RSA_FULL_VERIFICATION_circuit; use garaga::definitions::{RSA2048Chunks, RSA2048ReductionWitness, deserialize_u384, serialize_u384}; const RSA_TOP_CHUNK_LIMB1_MAX: u128 = 0xFFFF_FFFF_u128; const RSA2048_CHUNKS_SERIALIZED_LEN: usize = 24; const RSA2048_REDUCTION_WITNESS_SERIALIZED_LEN: usize = 2 * RSA2048_CHUNKS_SERIALIZED_LEN; const RSA2048_REDUCTION_COUNT: usize = 17; const RSA2048_REDUCTIONS_HINT_SERIALIZED_LEN: usize = RSA2048_REDUCTION_COUNT * RSA2048_REDUCTION_WITNESS_SERIALIZED_LEN; const RSA_CHANNEL_MODULI: [[u96; 4]; 11] = [ [ 0xfffffffffffffffffffffd21, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], [ 0xfffffffffffffffffffffb4d, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], [ 0xfffffffffffffffffffff3ed, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], [ 0xfffffffffffffffffffff05d, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], [ 0xffffffffffffffffffffed33, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], [ 0xffffffffffffffffffffe9b9, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], [ 0xffffffffffffffffffffe877, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], [ 0xffffffffffffffffffffe4db, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], [ 0xffffffffffffffffffffe40f, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], [ 0xffffffffffffffffffffe083, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], [ 0xffffffffffffffffffffdd1d, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1fffffffffffffffffffffff, ], ]; const U384_ZERO: u384 = u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }; const U384_ONE: u384 = u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }; /// The multiplicative identity 1 in chunk representation. const RSA_ONE_CHUNKS: RSA2048Chunks = RSA2048Chunks { w0: U384_ONE, w1: U384_ZERO, w2: U384_ZERO, w3: U384_ZERO, w4: U384_ZERO, w5: U384_ZERO, }; /// Horner evaluation bases: α_i = (2^96)^4 mod p_i for each of the 11 channel primes. /// Used to evaluate the chunk polynomial representation of 2048-bit integers /// within each RNS channel circuit. const RSA_CHUNK_STEPS: [u384; 11] = [ u384 { limb0: 0x16f8, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x2598, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x6098, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x7d18, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x9668, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0xb238, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0xbc48, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0xd928, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0xdf88, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0xfbe8, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, u384 { limb0: 0x11718, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, ]; fn serialize_rsa2048_chunks(self: @RSA2048Chunks, ref output: Array) { serialize_u384(self.w0, ref output); serialize_u384(self.w1, ref output); serialize_u384(self.w2, ref output); serialize_u384(self.w3, ref output); serialize_u384(self.w4, ref output); serialize_u384(self.w5, ref output); } fn deserialize_rsa2048_chunks(ref serialized: Span) -> RSA2048Chunks { let w0 = deserialize_u384(ref serialized); let w1 = deserialize_u384(ref serialized); let w2 = deserialize_u384(ref serialized); let w3 = deserialize_u384(ref serialized); let w4 = deserialize_u384(ref serialized); let w5 = deserialize_u384(ref serialized); RSA2048Chunks { w0, w1, w2, w3, w4, w5 } } #[derive(Copy, Drop, Debug, PartialEq)] pub struct RSA2048PublicKey { pub modulus: RSA2048Chunks, } pub impl RSA2048PublicKeySerde of Serde { fn serialize(self: @RSA2048PublicKey, ref output: Array) { serialize_rsa2048_chunks(self.modulus, ref output); } fn deserialize(ref serialized: Span) -> Option { Option::Some(RSA2048PublicKey { modulus: deserialize_rsa2048_chunks(ref serialized) }) } } #[derive(Copy, Drop, Debug, PartialEq)] pub struct RSA2048Signature { pub signature: RSA2048Chunks, pub expected_message: RSA2048Chunks, } pub impl RSA2048SignatureSerde of Serde { fn serialize(self: @RSA2048Signature, ref output: Array) { serialize_rsa2048_chunks(self.signature, ref output); serialize_rsa2048_chunks(self.expected_message, ref output); } fn deserialize(ref serialized: Span) -> Option { let signature = deserialize_rsa2048_chunks(ref serialized); let expected_message = deserialize_rsa2048_chunks(ref serialized); Option::Some(RSA2048Signature { signature, expected_message }) } } pub impl RSA2048ReductionWitnessSerde of Serde { fn serialize(self: @RSA2048ReductionWitness, ref output: Array) { serialize_rsa2048_chunks(self.quotient, ref output); serialize_rsa2048_chunks(self.remainder, ref output); } fn deserialize(ref serialized: Span) -> Option { let quotient = deserialize_rsa2048_chunks(ref serialized); let remainder = deserialize_rsa2048_chunks(ref serialized); Option::Some(RSA2048ReductionWitness { quotient, remainder }) } } #[derive(Drop, Debug, PartialEq)] pub struct RSA2048SignatureWithHint { pub signature: RSA2048Signature, pub reductions_hint: Span, } pub impl SerdeRSA2048SignatureWithHint of Serde { fn serialize(self: @RSA2048SignatureWithHint, ref output: Array) { Serde::::serialize(self.signature, ref output); output.append_span(*self.reductions_hint); } fn deserialize(ref serialized: Span) -> Option { let signature = Serde::::deserialize(ref serialized)?; let serialized_len = serialized.len(); if serialized_len < RSA2048_REDUCTIONS_HINT_SERIALIZED_LEN { return Option::None; } let reductions_hint = serialized.slice(0, RSA2048_REDUCTIONS_HINT_SERIALIZED_LEN); serialized = serialized .slice( RSA2048_REDUCTIONS_HINT_SERIALIZED_LEN, serialized_len - RSA2048_REDUCTIONS_HINT_SERIALIZED_LEN, ); Option::Some(RSA2048SignatureWithHint { signature, reductions_hint }) } } fn limb_lt(lhs: u96, rhs: u96) -> bool { let lhs_u128: u128 = upcast(lhs); let rhs_u128: u128 = upcast(rhs); lhs_u128 < rhs_u128 } fn u384_lt(lhs: u384, rhs: u384) -> bool { if lhs.limb3 != rhs.limb3 { return limb_lt(lhs.limb3, rhs.limb3); } if lhs.limb2 != rhs.limb2 { return limb_lt(lhs.limb2, rhs.limb2); } if lhs.limb1 != rhs.limb1 { return limb_lt(lhs.limb1, rhs.limb1); } return limb_lt(lhs.limb0, rhs.limb0); } fn chunks_lt(lhs: RSA2048Chunks, rhs: RSA2048Chunks) -> bool { if lhs.w5 != rhs.w5 { return u384_lt(lhs.w5, rhs.w5); } if lhs.w4 != rhs.w4 { return u384_lt(lhs.w4, rhs.w4); } if lhs.w3 != rhs.w3 { return u384_lt(lhs.w3, rhs.w3); } if lhs.w2 != rhs.w2 { return u384_lt(lhs.w2, rhs.w2); } if lhs.w1 != rhs.w1 { return u384_lt(lhs.w1, rhs.w1); } return u384_lt(lhs.w0, rhs.w0); } fn chunks_le(lhs: RSA2048Chunks, rhs: RSA2048Chunks) -> bool { lhs == rhs || chunks_lt(lhs, rhs) } fn top_chunk_is_well_formed(top: u384) -> bool { if top.limb2 != 0 { return false; } if top.limb3 != 0 { return false; } let limb1: u128 = upcast(top.limb1); limb1 <= RSA_TOP_CHUNK_LIMB1_MAX } /// Deserialize and validate a modular reduction witness (q, r) from raw felt252 data. /// Checks that both quotient and remainder have well-formed top chunks, /// and that the remainder is strictly less than the modulus. fn deserialize_and_validate_witness( ref hint: Span, modulus_chunks: RSA2048Chunks, ) -> RSA2048ReductionWitness { let quotient = deserialize_rsa2048_chunks(ref hint); let remainder = deserialize_rsa2048_chunks(ref hint); assert(top_chunk_is_well_formed(quotient.w5), 'RSA:bad quotient top chunk'); assert(top_chunk_is_well_formed(remainder.w5), 'RSA:bad remainder top chunk'); assert(chunks_lt(remainder, modulus_chunks), 'RSA:remainder >= modulus'); RSA2048ReductionWitness { quotient, remainder } } /// Verify an RSA-2048 signature assuming the message is already encoded. /// /// Given public key n and signature data (s, m, 17 reduction witnesses), /// verifies s^{65537} ≡ m (mod n) by: /// 1. Well-formedness: n > 1 odd, 0 ≤ s < n, 0 ≤ m < n, valid chunk bounds. /// 2. For each of 11 RNS channels: run the mega-circuit to verify all 17 /// reduction steps of the square-and-multiply chain. /// 3. Final equality: the last reduction remainder equals the expected message m. #[inline(never)] pub fn is_valid_rsa2048_signature_assuming_encoded_message( signature: @RSA2048SignatureWithHint, public_key: @RSA2048PublicKey, ) -> bool { let modulus_chunks = *public_key.modulus; let sig_chunks = *signature.signature.signature; let expected_message_chunks = *signature.signature.expected_message; if !top_chunk_is_well_formed(modulus_chunks.w5) { return false; } if !top_chunk_is_well_formed(sig_chunks.w5) { return false; } if !top_chunk_is_well_formed(expected_message_chunks.w5) { return false; } if chunks_le(modulus_chunks, RSA_ONE_CHUNKS) { return false; } if is_even_u384(modulus_chunks.w0) { return false; } if !chunks_lt(sig_chunks, modulus_chunks) { return false; } if !chunks_lt(expected_message_chunks, modulus_chunks) { return false; } let mut reductions_hint = *signature.reductions_hint; // Deserialize and validate all 17 modular reduction witnesses (q_i, r_i) if reductions_hint.len() < RSA2048_REDUCTIONS_HINT_SERIALIZED_LEN { return false; } let w0 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w1 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w2 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w3 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w4 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w5 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w6 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w7 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w8 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w9 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w10 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w11 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w12 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w13 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w14 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w15 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); let w16 = deserialize_and_validate_witness(ref reductions_hint, modulus_chunks); if !reductions_hint.is_empty() { return false; } // For each RNS channel p_i, verify all 17 reductions via the fused circuit let mut steps = RSA_CHUNK_STEPS.span(); for channel_modulus_limbs in RSA_CHANNEL_MODULI.span() { let step = *steps.pop_front().unwrap(); let channel_modulus: CircuitModulus = (*channel_modulus_limbs).try_into().unwrap(); let (d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16) = run_RSA_FULL_VERIFICATION_circuit( modulus_chunks, sig_chunks, w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15, w16, step, channel_modulus, ); if !d0.is_zero() || !d1.is_zero() || !d2.is_zero() || !d3.is_zero() || !d4.is_zero() || !d5.is_zero() || !d6.is_zero() || !d7.is_zero() || !d8.is_zero() || !d9.is_zero() || !d10.is_zero() || !d11.is_zero() || !d12.is_zero() || !d13.is_zero() || !d14.is_zero() || !d15.is_zero() || !d16.is_zero() { return false; } } // The final remainder r_{16} must equal the expected message m w16.remainder == expected_message_chunks } // PKCS#1 v1.5 SHA-256 constant chunks (W1..W5). // These encode: 0x00||0x01||0xFF×202||0x00||DigestInfo[12:19] // W0 depends on the hash and is built dynamically. const PKCS1_SHA256_W5: u384 = u384 { limb0: 0xffffffffffffffffffffffff, limb1: 0x0001ffff, limb2: 0x0, limb3: 0x0, }; const PKCS1_SHA256_W4: u384 = u384 { limb0: 0xffffffffffffffffffffffff, limb1: 0xffffffffffffffffffffffff, limb2: 0xffffffffffffffffffffffff, limb3: 0xffffffffffffffffffffffff, }; const PKCS1_SHA256_W3: u384 = u384 { limb0: 0xffffffffffffffffffffffff, limb1: 0xffffffffffffffffffffffff, limb2: 0xffffffffffffffffffffffff, limb3: 0xffffffffffffffffffffffff, }; const PKCS1_SHA256_W2: u384 = u384 { limb0: 0xffffffffffffffffffffffff, limb1: 0xffffffffffffffffffffffff, limb2: 0xffffffffffffffffffffffff, limb3: 0xffffffffffffffffffffffff, }; const PKCS1_SHA256_W1: u384 = u384 { limb0: 0xffffffffffffffff00303130, limb1: 0xffffffffffffffffffffffff, limb2: 0xffffffffffffffffffffffff, limb3: 0xffffffffffffffffffffffff, }; // W0.limb3 is the constant part: DigestInfo[3:15] encoded as 96 bits. const PKCS1_SHA256_W0_LIMB3: u96 = 0x0d0609608648016503040201; /// Build the PKCS#1 v1.5 SHA-256 encoded message from 8 hash words. /// /// Layout (256 bytes big-endian): /// 0x00||0x01||PS(0xFF×202)||0x00||DigestInfo(19)||SHA-256(32) /// /// W0 limb packing: /// limb0 = hw5 * 2^64 + hw6 * 2^32 + hw7 /// limb1 = hw2 * 2^64 + hw3 * 2^32 + hw4 /// limb2 = 0x05000420 * 2^64 + hw0 * 2^32 + hw1 /// limb3 = 0x0d0609608648016503040201 (constant) fn pkcs1_v1_5_sha256_encode(hash: [u32; 8]) -> RSA2048Chunks { let [hw0, hw1, hw2, hw3, hw4, hw5, hw6, hw7] = hash; let hw0: felt252 = hw0.into(); let hw1: felt252 = hw1.into(); let hw2: felt252 = hw2.into(); let hw3: felt252 = hw3.into(); let hw4: felt252 = hw4.into(); let hw5: felt252 = hw5.into(); let hw6: felt252 = hw6.into(); let hw7: felt252 = hw7.into(); let limb0: u96 = downcast(hw5 * 0x10000000000000000 + hw6 * 0x100000000 + hw7).unwrap(); let limb1: u96 = downcast(hw2 * 0x10000000000000000 + hw3 * 0x100000000 + hw4).unwrap(); let limb2: u96 = downcast(0x05000420 * 0x10000000000000000 + hw0 * 0x100000000 + hw1).unwrap(); let w0 = u384 { limb0, limb1, limb2, limb3: PKCS1_SHA256_W0_LIMB3 }; RSA2048Chunks { w0, w1: PKCS1_SHA256_W1, w2: PKCS1_SHA256_W2, w3: PKCS1_SHA256_W3, w4: PKCS1_SHA256_W4, w5: PKCS1_SHA256_W5, } } /// Verify an RSA-2048 signature against a raw message using SHA-256. /// /// Computes SHA-256(message) on-chain, constructs the PKCS#1 v1.5 encoding, /// asserts it matches the expected_message hint, then delegates to the /// existing RNS-based RSA verification. #[inline(never)] pub fn is_valid_rsa2048_sha256_signature( signature: @RSA2048SignatureWithHint, public_key: @RSA2048PublicKey, message: @ByteArray, ) -> bool { // Compute SHA-256 of the message on-chain let hash: [u32; 8] = compute_sha256_byte_array(message); // Build the PKCS#1 v1.5 encoded message from the hash let encoded = pkcs1_v1_5_sha256_encode(hash); // Assert the hint matches the on-chain computation if encoded != *signature.signature.expected_message { return false; } // Delegate to the existing RSA verifier is_valid_rsa2048_signature_assuming_encoded_message(signature, public_key) } ================================================ FILE: src/src/signatures/schnorr.cairo ================================================ use garaga::basic_field_ops::{is_even_u384, neg_mod_p}; use garaga::definitions::{ G1Point, Zero, deserialize_u384, get_G, get_curve_order_modulus, get_n, serialize_u384, u384, }; use garaga::ec_ops::{G1PointTrait, msm_g1}; use garaga::utils::u384_eq_zero; /// A Schnorr signature. /// /// # Fields /// * `rx`: `u384` - The x-coordinate of the R point from the signature. /// * `s`: `u256` - The s component of the signature. /// * `e`: `u256` - The challenge hash. #[derive(Drop, Debug, PartialEq)] pub struct SchnorrSignature { pub rx: u384, pub s: u256, pub e: u256, } pub impl SerdeSchnorrSignature of Serde { fn serialize(self: @SchnorrSignature, ref output: Array) { serialize_u384(self.rx, ref output); Serde::::serialize(self.s, ref output); Serde::::serialize(self.e, ref output); } fn deserialize(ref serialized: Span) -> Option { let rx = deserialize_u384(ref serialized); let s = Serde::::deserialize(ref serialized).unwrap(); let e = Serde::::deserialize(ref serialized).unwrap(); return Option::Some(SchnorrSignature { rx: rx, s: s, e: e }); } } /// A Schnorr signature bundled with computation hints required for Cairo verification. /// /// # Fields /// * `signature`: `SchnorrSignature` - The core signature data. /// * `msm_hint`: `Span` - Hint for multi-scalar multiplication computation. #[derive(Drop, Debug, PartialEq, Serde)] pub struct SchnorrSignatureWithHint { pub signature: SchnorrSignature, pub msm_hint: Span, } /// Verifies a Schnorr signature with associated hints, assuming the hash challenge is correct. /// /// # Important Assumption /// **This function assumes that the hash `e` has been correctly derived from `x_R` and the message /// by the caller.** It does not compute or verify the hash derivation itself. The caller is /// responsible for ensuring that `e = H(x_R || message)` (or the appropriate hash construction for /// their protocol) before calling this function. /// /// # Arguments /// * `signature`: `SchnorrSignatureWithHint` - The signature and verification data bundle /// containing: /// - rx: The x-coordinate of the R point /// - s: The s component of the signature /// - e: The challenge hash (assumed to be correctly computed by the caller) /// - msm_hint: Hint for multi-scalar multiplication /// * `public_key`: `G1Point` - The public key to verify against. /// * `curve_id`: `usize` - The id of the curve. (0 for BN254, 1 for BLS12_381, 2 for SECP256K1, 3 /// for SECP256R1, 4 for ED25519, 5 for GRUMPKIN) /// /// # Algorithm /// The Schnorr signature verification checks if the signature (R, s) is valid for a given challenge /// hash e and public key P: /// 1. Verify that all inputs (rx, s, e) are non-zero and less than the curve order n /// 2. Verify that the public key P is on the curve and has even y-coordinate (BIP340 requirement, /// see /// https://github.com/bitcoin/bips/blob/58ffd93812ff25e87d53d1f202fbb389fdfb85bb/bip-0340/reference.py#L71) /// 3. Compute sG - eP where G is the generator point (using MSM) /// 4. Verify that the result equals R (matching x-coordinate and even y-coordinate) /// 5. The signature is valid if all checks pass /// /// This implements the verification equation: sG - eP = R /// Which proves the signer knew the private key x where P = xG, given that e was correctly derived. /// Returns false if the signature is invalid. pub fn is_valid_schnorr_signature_assuming_hash( signature: SchnorrSignatureWithHint, public_key: G1Point, curve_id: usize, ) -> bool { let SchnorrSignatureWithHint { signature, msm_hint } = signature; let SchnorrSignature { rx, s, e } = signature; let n: u256 = get_n(curve_id); if u384_eq_zero(rx) || s >= n || s == 0 || e >= n || e == 0 || is_even_u384(public_key.y) == false { return false; } let pk_on_curve = public_key.is_on_curve_excluding_infinity(curve_id); if pk_on_curve == false { return false; } let n_modulus = get_curve_order_modulus(curve_id); let e_neg: u256 = neg_mod_p(e.into(), n_modulus).try_into().unwrap(); let points = array![get_G(curve_id), public_key].span(); let scalars = array![s, e_neg].span(); let res = msm_g1(points, scalars, curve_id, msm_hint); let ry_l0_f252: felt252 = res.y.limb0.into(); let ry_l0_u128: u128 = ry_l0_f252.try_into().unwrap(); if res.is_zero() || res.x != rx || (ry_l0_u128 % 2) != 0 { return false; } true } ================================================ FILE: src/src/tests/autogenerated/ecdsa_tests.cairo ================================================ use garaga::core::circuit::u288IntoCircuitInputValue; use garaga::definitions::G1Point; use garaga::signatures::ecdsa::{ECDSASignatureWithHint, is_valid_ecdsa_signature_assuming_hash}; #[test] #[ignore] // Ignored for auto-benchmarks fn test_ecdsa_BN254() { let mut ecdsa_sig_with_hints_serialized = array![ 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0x772ca79c580e121ca148fe75, 0xce2f55e418ca01b3d6d1014b, 0x2884b1dc4e84e30f, 0x0, 0x236ca9312dad3661a37f2d6f, 0x98424c01caad7592315715d1, 0x795b9fd941b23c4, 0x0, 0xbf6659a4013d8a0bc49c2bba0fe0b551, 0x2667e798582a362fb041cb7c36d149a8, 0x1, 0xb4862b21fb97d43588561712e8e5216b, 0x967d0cae6f4590b9a164106cf6a659e, 0x18, 0x1f553b3c905bf06693d39af3, 0x22a1bf1fdfb897a2e2368128, 0x56d66d1d4d06ac4, 0x0, 0xf6482bdbc7401ca9a5730403, 0x75053f99e9420c530d43ee42, 0x1fe46da1cc905e5d, 0x0, 0x1a59f6054bfb443f, 0x1000000000000000005d7679874156a92, 0xa19cd0d3b84ff34, 0x4aae535488bc0171, 0xb2b487addb0999f4b7e26ef8, 0xab2d694c6f3e51b16518f05b, 0x206ee9b43426de0b, 0x0, 0x43ad5aba55c006f840ef53f6, 0xd90cb92d61bdf082a563725f, 0x28e0a95f5fae45b5, 0x0, 0xa0b063933d8e3f54, 0x1000000000000000003fc2ccc129935ee, 0x1000000000000000030112506a6d6deff, 0x21d269100269048a, ] .span(); let public_key = Serde::::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let ecdsa_with_hints = Serde::< ECDSASignatureWithHint, >::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_ecdsa_signature_assuming_hash(ecdsa_with_hints, public_key, 0); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_ecdsa_BLS12_381() { let mut ecdsa_sig_with_hints_serialized = array![ 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x3d77d61326ef5a9a5a681757, 0xd3070afd4f0e121de7fcee60, 0xdf9ef4088763fe611fb85858, 0x11a612bdd0bc09562856a70, 0x867620dc5a8fd7ecbe07be76, 0x11d338240a4de8ca41217d43, 0x2c7753c1707137bf, 0x0, 0x94796ffb457f39ac41d6612e5ce0a191, 0x356631f83b3d990d4f60bada0d2ecc95, 0x1, 0xb4862b21fb97d43588561712e8e5216b, 0x12cfa194e6f4590b9a164106cf6a659e, 0x18, 0x6c178cfd0b3cfa1cdc9611c2, 0x2e2e9b5b3dc7495056fcb216, 0xdc6b710b9b8d6af1b0d9662f, 0x144281277c62ad45fcc361df, 0xdd51112be4c794ba47bc61bb, 0xba737e0b6d17079da040afaf, 0x93d8c4b8589d2520cda8c68a, 0x1492245eaba8fad13666bf8, 0x2da17082600f7add, 0x1cbcf87b9857ba44, 0x989a085f93dfee0, 0x100000000000000002e5733515f6dc037, 0xcb7778677f6122a2ad987779, 0xf6d1d01660d142741ae0a2c9, 0x5d1be8a4ebf8d22589f99a46, 0xbcaa099b6ef5b8ac192db47, 0xe6dd3401412576d3a894bcf2, 0x2a839ac601bb4ed694e4724b, 0xa6ee37842198c02e8bc4074b, 0x107f65d9ec3f6a9587cfe814, 0x4c5ccbf186df2adb, 0x100000000000000009289460599d5e6be, 0x100000000000000003f0c985cb7645566, 0x396e116d375dd2dd, ] .span(); let public_key = Serde::::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let ecdsa_with_hints = Serde::< ECDSASignatureWithHint, >::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_ecdsa_signature_assuming_hash(ecdsa_with_hints, public_key, 1); assert!(is_valid); } #[test] fn test_ecdsa_SECP256R1() { let mut ecdsa_sig_with_hints_serialized = array![ 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0x46ae31f6fc294ad0814552b6, 0x2d54cc811efaf988efb3de23, 0x2a2cc02b8f0c419f, 0x0, 0x47e8f962616a171283a1176e90490f33, 0xde5c72ea3ea08688ab2876686671cca8, 0x1, 0xeb1167b367a9c3787c65c1e582e2e663, 0xf7c1bd874da5e709d4713d60c8a70639, 0x14, 0x286091616e02ba0069d28be8, 0x1d9745f8427b797bfae94bc9, 0xb3eb1f4823aa5b9f, 0x0, 0xd955b1c2d5dbf2b7ce1f8cc0, 0xd9d9fdc9f4834421e0583e30, 0x8bab0f5e16efdcd5, 0x0, 0xeae9da0724797b8c4deebd03881e0a93, 0x168a1a12c6aaa58209ea9db2a7f1a2b2f, 0x94038dc6b682d83583f52251, 0x2c3509157e0085975bedd577, 0x1e00bb14af9e8bf8, 0x0, 0x3017341aa1f59a0d17c013c5, 0x51583e6cc584e0a8145045aa, 0xb9220afd0e923820, 0x0, 0xd0446b1605d4f3bfb5a82b168ba1b43, 0x1ab0f41000c73e671352e746066899a70, ] .span(); let public_key = Serde::::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let ecdsa_with_hints = Serde::< ECDSASignatureWithHint, >::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_ecdsa_signature_assuming_hash(ecdsa_with_hints, public_key, 3); assert!(is_valid); } #[test] fn test_ecdsa_SECP256K1() { let mut ecdsa_sig_with_hints_serialized = array![ 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0x2965eeb3ec1fe786a6abe874, 0x33e2545f82bb6add02788b8e, 0xf586bc0db335d7b8, 0x0, 0x6bb797837f385ccf8ea3b9b6e7074b68, 0x123ea74e335845008c7f5f797313610f, 0x0, 0xeb1167b367a9c3787c65c1e582e2e663, 0xf7c1bd874da5e709d4713d60c8a70639, 0x18, 0xed540ba7da3f81bbaa728909, 0x893eeca8c449fc9407668128, 0x4c72a831e28b48, 0x0, 0xf7ae1bf4ac84c840ee8163eb, 0xfb80d24687ae79865523f56d, 0xebddaf8646d563b7, 0x0, 0x5763a6a1517232b0, 0x100000000000000003fa616b9d1aa135b, 0x2ee3ef80f868d011, 0x100000000000000003fe78eccc1da3303, 0x3baca0be7f388c0f13f91502, 0x279cead44672432f6083c7de, 0x7b7ead3b5811d2dd, 0x0, 0x5bbc00623473536e653b34f3, 0xe4d94e156ddc62c1d41c68f4, 0xe635b285558b642c, 0x0, 0x1000000000000000097e848fb19a47c06, 0x100000000000000003dc81ff2129521cf, 0xdfac131bb3bb11de, 0xafc939cc6fed0eee, ] .span(); let public_key = Serde::::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let ecdsa_with_hints = Serde::< ECDSASignatureWithHint, >::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_ecdsa_signature_assuming_hash(ecdsa_with_hints, public_key, 2); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_ecdsa_ED25519() { let mut ecdsa_sig_with_hints_serialized = array![ 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0xd4b581f1ee29a4dfba0aa2d4, 0xf18a70dbf1dc5a76494bff12, 0xac1b7bfc409119f, 0x0, 0xd75af662c90a1cb06a531ce8992bfda2, 0x9c65af0ba668f70fb54682dc51dddb4, 0x1, 0xb4862b21fb97d43588561712e8e5216b, 0x4b3e865e6f4590b9a164106cf6a659e, 0x14, 0x8e4ebbfe9103ea220b651a02, 0x18ce985bbcad7e677405dafb, 0x69d6abb9648d50ad, 0x0, 0xc1ce73f105e57f3a39f4ed13, 0xcd2f4939fe1a2abf2a689253, 0x34f18a43f7786d73, 0x0, 0x28c38021207719b4c15ec8e3585a12b, 0x12f56bf5ab761b880d6d797751d76c911, 0x378b92a7d8456bc43b2417e1, 0xca39a3a66b3713d3f07aa06c, 0x2aa069ab39cf3c36, 0x0, 0x3d54f7790b6544e46aa424c4, 0x2fad442bf9ae38403e9616c2, 0xda201ff9acac7ac, 0x0, 0xa9c80a21b193cc891541d32627df585, 0x113108f379dac95a41e3221331fd0f214, ] .span(); let public_key = Serde::::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let ecdsa_with_hints = Serde::< ECDSASignatureWithHint, >::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_ecdsa_signature_assuming_hash(ecdsa_with_hints, public_key, 4); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_ecdsa_GRUMPKIN() { let mut ecdsa_sig_with_hints_serialized = array![ 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x3c26f4ff476ab777dc184776, 0xbccb2cba46cf421f11eb4d14, 0x27ec44064c727a3d, 0x0, 0x4be0b43c26c6f414a5ea9ea34cff6d0c, 0x14d85887ecbe1e0c06e6a8310bf6d595, 0x0, 0xb4862b21fb97d43588561712e8e5216b, 0x967d0cae6f4590b9a164106cf6a659e, 0x14, 0xa92ff39dc786d18400f152fa, 0x20eafe86707668d52aa0d2, 0x6b08f8ea2e0d3ff, 0x0, 0x7e5a501bb54172443d6608ac, 0xe03026c1fc3a1c6ead58dafd, 0xa6f4d2409778496, 0x0, 0x5291f4cf1867b05ae7b1d1bbabfd2ac3, 0x26042d2cad5454bf11c7d3f813c42338, 0x3b840ebf6e6c7b9ad848e269, 0xc10e351a38f60bd193db9784, 0x16a66333126cff05, 0x0, 0x8f5f58884224366a4b4708a4, 0xee5fc2fc6e001cdb0584bd57, 0x1d311cc64e5601b2, 0x0, 0xab7959b0b8b002ec27721af3d0ccf03, 0x357d7828010d521de3fe6fc9427ab043, ] .span(); let public_key = Serde::::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let ecdsa_with_hints = Serde::< ECDSASignatureWithHint, >::deserialize(ref ecdsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_ecdsa_signature_assuming_hash(ecdsa_with_hints, public_key, 5); assert!(is_valid); } ================================================ FILE: src/src/tests/autogenerated/eddsa_tests.cairo ================================================ use garaga::signatures::eddsa_25519::{EdDSASignatureWithHint, is_valid_eddsa_signature}; #[test] fn test_eddsa_0_0B() { let mut eddsa_sig_with_hints_serialized = array![ 0x3a0764c9d3fe4bd5b70ab18201985ad7, 0x1a5107f7681a02af2523a6daf372e10e, 0x8a826e80cce2869072ac60c3004356e5, 0x5501492265e073d874d9e5b81e7f8784, 0x6bb4f91c70391ec6ac3ba3901582b85f, 0xb107a8e4341516524be5b59f0f55bd2, 0x0, 0x14, 0xea59f1a1b369842eaf693886, 0xf9224e07ed11424e3ec1fa70, 0x4a92acec2f8e1cbe, 0x0, 0xe590d7d2c7256a3e0ead52f, 0xd86b5e53124f1f969c189730, 0x537563cb5552be8d, 0x0, 0x138c5052d6a27a4e4c9560fdd264cfd3, 0x11a2728b581551e5fb75531f987dd1989, 0x21ed5fd748dd92098b05acad, 0x7994ad2b8159fd82cc56b3ef, 0x50b6933858654726, 0x0, 0xe2c7733e684c969b9e877cc9, 0x5b1f73e8e98e8c71a215ef2d, 0x697849ab9ad5648, 0x0, 0x336adfeb48576dcc2cbe3d6bcebf0290, 0xde93b33a51de734be6bf4494c1e417d, 0x82324bd01ce6f3cf81ab44e62959c82a, 0x6218e309d40065fcc338b3127f468371, 0xc513d47253187c24b12786bd777645ce, 0x55d0e09a2b9d34292297e08d60d0f620, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_1_2B() { let mut eddsa_sig_with_hints_serialized = array![ 0x58f03002d07ea48da3a118628ecd51fc, 0x258090481591eb5dac0333ba13ed1608, 0xa301be3a9ce627480224ecde57d69162, 0xacc35adbd780365e443a7484a248e50c, 0x59c64d9860f767ae90f2168d539bff18, 0xac41eeacebe27c08dd26e71e9157c4a, 0x2, 0xaf, 0x82, 0x14, 0x6dcaf738b22009c93c0bdb87, 0x3bf824e64854c39e4f4b4d71, 0x2ba562c0a5855870, 0x0, 0xd156c934e0630b6b1cade37c, 0xf9592c2a8d4525621a66ff9e, 0x6ea3c2799dcb0791, 0x0, 0x2b7d8065ce28f598d400cb3247955529, 0x11805a2d4008709e8bf8df99ecd21a9c8, 0xbea748bd8161e9392414c6af, 0xfb78a46df09a3550b0f40b90, 0x1736a99e1e6b6b2a, 0x0, 0xcd40357ed01033e3ff528c49, 0xc3d6cd32c65892252ebd9898, 0x11d058072223478a, 0x0, 0x941c53d6db9e9db6634c5d73d8a9cf3, 0x12d39e660f6e64df38adf8625e063b3cf, 0x98f8f7962a1ed013293448bba5b444f, 0x39a50ed09ff56e66f9db162c5fb6791a, 0x18236f1734e3e9b945a9ff5486cdbd02, 0x61213aa2dc9d68833f65d1b48dcf8598, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_2_4B() { let mut eddsa_sig_with_hints_serialized = array![ 0x5323472831c45de2863153c402c1dac0, 0xa73302d9921f008eeb2a158b87dbabea, 0x4d6630d51be769278400d1b0c66f4f12, 0x1634b9ae09b5fded6dc5f67d50f88d88, 0x2a8bc1975609f35d3006aa388d916be2, 0x70c155ea8e5ba9fe40adc2ea5ea32a8, 0x4, 0x5f, 0x4c, 0x89, 0x89, 0x14, 0xfc2e795891abcdefc79c39ab, 0xc39ec060c9acab62d783f744, 0x7edd959fdf5944aa, 0x0, 0xb9af3f53cf443ce8258ce9d8, 0x25a93844e779d9acf1a76582, 0x6044e088dd26d914, 0x0, 0x367ea01340ed3f4eb35fc0b5d6909880, 0x65becb59a33390e7a8eeb2961732995, 0x4d1173ab1a7126cd6f3553e5, 0x737d4ab842a32b29798c247e, 0x7175327fc8d35a1d, 0x0, 0xd940bd48ba9f49f998750045, 0x6a748e9b4454606da58d20fa, 0x1e0a3bd228532c1, 0x0, 0x683951430b64535637cbe187fb571f2, 0x1426013715579b3cf9108dacbc5d24c5, 0xafd7a14549a75297ba0c7c7b8bf58cc2, 0x6b0c3a1c5526758320ce254b6896d815, 0x44c071ef224e23c3376a6cfaf588f8b1, 0x15daf15d98e9a7cec9a0d949aa8a1010, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_3_6B() { let mut eddsa_sig_with_hints_serialized = array![ 0x54cc85d1334a44bef2d70505a4bfcffb, 0x3d64e33eb887502b0b64e16052616de1, 0x3f5a6d63ff558746e1e99c1dfc29d66e, 0x29fae5f73018249db793fd1ac9d9a540, 0x994ed1168dbd8d24bbec6ecc208f4b85, 0x239d831895634dc7094d90e4942175, 0x6, 0x89, 0x1, 0xd, 0x85, 0x59, 0x72, 0x14, 0x80741b4318d18819882bb551, 0xb2779f18fc7fb12feb65a53, 0x142ca3875044978f, 0x0, 0xa93609d4fc6719102719e96b, 0x6d8f72df2fdf0661b61a1139, 0x2a9bc38a67fdf1af, 0x0, 0xeba21cc2b39436195b0b53a4dd3d7e5, 0x126aa5d255d4eb38e1d8919974d3f183e, 0x72b49563bd0280d6978d8f59, 0xee4b484f08eead598602db92, 0x1d762afb1672ad6f, 0x0, 0x54194dff66204d8aa3eef75b, 0xc8e4dab18ef2e40c806b2245, 0x5b786f9856ffe227, 0x0, 0x3c7b94be6b7e6bfa95bee538eefe5fef, 0x94070cbd62a695ecf77e388896f23b0, 0x166b7bb41838af3515acc516812d7b0a, 0xc9430416260957f2798ebc1f4c0820, 0xfd1009be194ba52c4c3af995f41ea6de, 0x28ea2ab7b73169d1eb053770cc4c90cc, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_4_8B() { let mut eddsa_sig_with_hints_serialized = array![ 0x403164cdaf33b05ed9ce5f824ab51ff8, 0x63b8346f4303258970a920bd0afbab75, 0x88f2e7d378b17bc18a52b0afc5deadd6, 0x23def957bcf35e5410e116adb1db9a7f, 0x59620cc93a0fbe07893b728f38c8a514, 0x8fa05f888d4b73ddf4576c1ec85e8bb, 0x8, 0x42, 0x84, 0xab, 0xc5, 0x1b, 0xb6, 0x72, 0x35, 0x14, 0x62920ccda7a4a43580c16a97, 0xbc42ab1a6625ff1e10cf6704, 0xddd34ffe3defba, 0x0, 0x21bd69a53ef0e957f99488cf, 0x951d5e6a7d167e2c8b9c8ee8, 0x27d72985e7a6135f, 0x0, 0x3af1a7897e95058b0a1f9e6f8c89504a, 0x228f99300a1dbd3aa20393f9adaa37c9, 0x99acfb45641fa7e3e18424da, 0x44eec67bb79d7b7b0a740c2f, 0x102c2cdf25176fb7, 0x0, 0x1b86dd209edc5f7108c52dd0, 0x67ab6794197e33768c702848, 0x754e75fee6b042b, 0x0, 0x39e458b6a016bff5cc4ee182498edeaa, 0x3489b4d0d7178376a2f9c2366c0d415, 0xba02b3f75514da3d99a7c37c948ff75a, 0x758f833d060d0a8a117ec27148c907fd, 0x46eadcf85f952099fbb70cdb91f10610, 0x54c40a9283a8e6206a15e02b64b46288, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_5_10B() { let mut eddsa_sig_with_hints_serialized = array![ 0xe938c55c67fafa1dabf748834b52b231, 0xff4d6ea3c1bbd82ac1279e81e53f4ea8, 0x914eab3f9f3ff001dee95a418c59e428, 0x9949c55e6b9796edf0c2bdd37f58b9e, 0x258894367c6237391983f0404c1a15d9, 0x8ced65d6a69a67f49870a9f5ada999e, 0xa, 0x33, 0xd7, 0xa7, 0x86, 0xad, 0xed, 0x8c, 0x1b, 0xf6, 0x91, 0x14, 0x38c8023c9fb41d7b6939d204, 0x6c47c9dcf6dd08f0027d26cb, 0x7643328979691ed8, 0x0, 0xf539d2a0878555c6a28113ce, 0xd28009225c7af9f44698b284, 0x748c3d43195e54b8, 0x0, 0x37fb348b196c8215fbfea725d82bec57, 0x1070137c89b13bc46aaaa21e205c4982d, 0xb35abd3c324790d8a654aa98, 0xe5e89428ddbb53e8b5978536, 0x107329dcf2c18f83, 0x0, 0xc569bab4c0dd2d506349ad99, 0x40a1ce7bc71879d83ddb9493, 0x7d172c2321d811d4, 0x0, 0x238c19411579a152ed700c6fed5a148d, 0x1265553ee261600443f5b5980f90b6abe, 0x75f6f309f81f9e8aa1f24f9c28eab288, 0x256a25046b0c5c6e6e7a0eee192ff255, 0x26d6d2c886c8d8938da2c0c48aaa27ab, 0x4cd530baaf96cfce24c4baf37493d3cc, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_6_12B() { let mut eddsa_sig_with_hints_serialized = array![ 0xa940aaba3f4f1c1311d111d09336e86f, 0x5782b17ac29ee3b03bf72f01306bd7d3, 0x1e38377d274b6106faa2333079d99a0f, 0x582292ced69ed05845a9a5c25af6946d, 0xddc8d0c0c3ae9742c93a862e9567a5c1, 0xec4ad559b4427bab60b8604e58410f7, 0xc, 0x5a, 0x8d, 0x9d, 0xa, 0x22, 0x35, 0x7e, 0x66, 0x55, 0xf9, 0xc7, 0x85, 0x14, 0x9b1776a1824355ed0f31d4b6, 0x9ba13aeac727ec1c4c3989d7, 0x1c20c27b1b41836f, 0x0, 0xad7ca35f9f1a595260a64136, 0x9b28c807d04f47f3e7ba89ae, 0x76a7aad88686c4cd, 0x0, 0x360399ddbc65be2e628e3fae9ee6d55c, 0x11c8a2911627601b102062e50546df703, 0xfbc5708cfe886fd0498219ad, 0xbd3fded76459b0468208d2b7, 0x66086effa4c818f0, 0x0, 0xbcdf5d18e7a01ecc5fcbc1aa, 0xb7733fa1f254458c678f0c4, 0x6ade3a37aaa14389, 0x0, 0x1b635746f2ada962d38fcba9f0aec343, 0x193ab04b7e052b85dcd94e7d6e265dfc, 0x7ec01a0af470fa5a48b1b20af07af00a, 0x5fca1ee5ddca2e7454275f8125d54949, 0x141afcb83c809f637a968f7a694d9a6a, 0xb2e763e5c5d8d490ad567a99d254c52, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_7_14B() { let mut eddsa_sig_with_hints_serialized = array![ 0x267e03bc533dd3527a5b7a4698f83acf, 0x91f2e233c0e9172225fc036999daa842, 0xe6253b6b00b21223eb603ce281fee36e, 0xb06ad6af8ddb4ec444f8236610028e83, 0x9042af526e1d8af5b8f55d19fd871067, 0x6cf94ef95877492000121735cd55380, 0xe, 0x55, 0xc7, 0xfa, 0x43, 0x4f, 0x5e, 0xd8, 0xcd, 0xec, 0x2b, 0x7a, 0xea, 0xc1, 0x73, 0x14, 0xc1e32736d15729299aaa09e7, 0x8e424562b0b2d4e10849f3f7, 0x4638985f6c4eecb8, 0x0, 0xf6f8582e11475ecce6e33473, 0x602deb6eefe4e4c17c82e744, 0x3abfa51751dcd4a0, 0x0, 0x249f7fab0b194de4a84fcbf4d04b48a2, 0x12e9de13153f96a14ecb14d5df17d9e2d, 0x63296c74f8e9485907858fda, 0xa300e4caed5ea8cfc94893a3, 0x4a781002e18f5dea, 0x0, 0xb6accf3462884fda4c7da786, 0x57c6fccffb3d8e0dd16d6d28, 0x184c57d464a36acc, 0x0, 0x227d1381630c922e8c77a0be24f969f7, 0x983ecf169859b172a652dab7630e8b, 0xf51214784e30f6963636248940f4bd31, 0x673970dc3e5bec3f2a44fc4e7518e66d, 0x1750714406fc2d2876ff75bc2cad8e11, 0x100e3069d5815a94db87c734f43b368b, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_8_16B() { let mut eddsa_sig_with_hints_serialized = array![ 0xa2debae466c062697443478c50a8e534, 0x5b954321cd6c47944f5cde84b48a1b20, 0x68b308f9b7a3497912a8d040dc273d2a, 0x87ae2db0b9415d7ac1a654ff1b7638f, 0x53ce87ba90a44fe4e1b07af442c1aa09, 0xc5054ae7c364ceff1ca3915893af392, 0x10, 0xc9, 0x42, 0xfa, 0x7a, 0xc6, 0xb2, 0x3a, 0xb7, 0xff, 0x61, 0x2f, 0xdc, 0x8e, 0x68, 0xef, 0x39, 0x14, 0x2ccc5c7cac2eee8b2e47375, 0xbe3457718bcbd53b10b92cf9, 0x47d2b530179b9892, 0x0, 0xa0d5148d627eff7de3695066, 0xfbbf54cf338c905e6d373cd9, 0x51a1142c5de46d49, 0x0, 0x3540f747691b1589c7246b2a16cb78f, 0x127059d142c92015acd6f16fcc0f6aca0, 0xcf28c60e976b78e041947ee, 0xd1a14bd8d8623e6a8a8e9b0a, 0x21bcebc8f8c18ced, 0x0, 0x5e9d79fb649eeffc22a13d52, 0x6d83860361dd3223bf842efe, 0x4e148cceb02ebe6f, 0x0, 0x1175e121aacfeb9369560423064b5895, 0x101759331499142832f566dbd72c777cb, 0x1ea7db3fb12901a9622ff15d26e3634e, 0x5b4066ef8eb5ea44ae38dc24f9b8ce84, 0x6fe7a48b2b9e4c036d80526005e9e3aa, 0x64599205bcb26f328e09b76cea8e9f6, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_9_18B() { let mut eddsa_sig_with_hints_serialized = array![ 0xf2e34c3bc3ae76866ad899f12791d274, 0x6b3a2165ca8c1ecd1c192cf591b1cc25, 0xee92302f49750591173ca043d729e9fb, 0xf5134738ca574ecacfca3604af12b2a, 0x80db0a70f1418c6c2d32912758db62c2, 0xa3e62e73eae4434700b2714bcca7e02, 0x12, 0xbd, 0x8e, 0x5, 0x3, 0x3f, 0x3a, 0x8b, 0xcd, 0xcb, 0xf4, 0xbe, 0xce, 0xb7, 0x9, 0x1, 0xc8, 0x2e, 0x31, 0x14, 0xfa1252aa123e86ee87f8c8c7, 0xa2218cc84ca64ab31a5bdbf9, 0x760ea6e91bcff0fd, 0x0, 0xbc93a87ac4c455717816c9d1, 0x88c7777545d6c5afdfd4387a, 0x4dd7be231e07a6b8, 0x0, 0x3662cbc08efd2b73724c4b64e181fe3f, 0x220b0e53b6a13c6efb4727fc6922ae1c, 0x20ff2c17be4383c0c7b3461, 0xcee6248e4f8755edfae5b7e, 0x7584f114bf6892a4, 0x0, 0xeb29df4ea33769a5027a031, 0x677e70b90c46b0141bae3def, 0x5bee213f1981b3be, 0x0, 0x379f66621fb39f0dcb0c73e8ad7ba68f, 0x129078edcd97e548881a71998959917dc, 0x12f9c9f73a8645fb1ec4f7e542186624, 0x1faf3db7e89ef842c31398dc78b1d6a4, 0xbb608ba1755964b8a7e626f14eb5a33c, 0x46e151b817dfa0805ffc863f3ba6a850, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_10_20B() { let mut eddsa_sig_with_hints_serialized = array![ 0x5b0884354e71a735658929859381a21c, 0x7f81008c5dddc89f81423f72ec9fef86, 0x4d42f6df7f7e676206982d6abcc2ada1, 0x85326f256ee9f3fd90ca95570fa5dbe7, 0xc44c74eba94023d992e4860331dc7ca, 0x5f193db373926046e3ee85ff3fdaf61, 0x14, 0x8b, 0xa6, 0xa4, 0xc9, 0xa1, 0x5a, 0x24, 0x4a, 0x9c, 0x26, 0xbb, 0x2a, 0x59, 0xb1, 0x2, 0x6f, 0x21, 0x34, 0x8b, 0x49, 0x14, 0x937d82291b7f8dc2781d4e5f, 0xa937d9ca11ae15eff034e737, 0x34b1848dd33cc4bc, 0x0, 0x1aa605be8f31fb5fa2f72f6d, 0x2b625f928529ba42e9970fea, 0x52f1e366d79e7073, 0x0, 0x387306bd9bc7a9af9d7ca633a58771b9, 0x243411ab947bef8f30e95cdb895fa8c1, 0x37e3b62e93ef9a9e5987db54, 0x1ffee904ff81caa82c12aba7, 0x18f6049707602a63, 0x0, 0xe2045701aec1245297f05444, 0xf0506a3f16f97c20c745af91, 0x6341e55f4b7c38c7, 0x0, 0x29ddad2d13e8fcc5f380cdc5ad8dc7fb, 0x1df6c6969ff415bd6ab279f827575811, 0x6120e97100cf4aaebfcf1db80e51bdbb, 0x6ef0677f61dbc7d5f23697cafb1ff6af, 0xc0decbf4f20c787447d823b0dd40639c, 0x37a3fb1811a6325320bf08033e450a8f, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_11_22B() { let mut eddsa_sig_with_hints_serialized = array![ 0x147e5eb78bbb945d71f0230d859b3548, 0x85fc02a0bd3f4005a8286ff014af2e32, 0x1d6e8787cea32243c5badf8999d0dcb6, 0x6ad897a7a6d70bb5249dc798a94d1362, 0x9fecfb2c653c674ac1d691749ddc140e, 0x13928ab6d079082f3bda45c9382a96, 0x16, 0x1b, 0xa, 0xfb, 0xa, 0xc4, 0xba, 0x9a, 0xb7, 0xb7, 0x17, 0x2c, 0xdd, 0xc9, 0xeb, 0x42, 0xbb, 0xa1, 0xa6, 0x4b, 0xce, 0x47, 0xd4, 0x14, 0x95156f4654352c47d318d763, 0x60bbfcd2afac5410c4e71df8, 0x15b6c8789497160a, 0x0, 0x8b5ca313032ef0415a347710, 0x5804f93938239c9afbc99e9e, 0x7c65c4735c4ffbd8, 0x0, 0x28a74c9dce2b2e4a842e33e399863e1f, 0x11da7a8750a2ce61ed28c38c0d512155d, 0x189e561188bc49a918bafffe, 0xfc6b5aae2395e9e47a2ba2a2, 0xc37c6f902c1d20c, 0x0, 0x876528e8db7ca14d83a81e9c, 0xaacbaa6e2bb209db25f41261, 0x370d6bc6274f3efe, 0x0, 0x196f76c318589c37468b549f759bb8bb, 0x117d80ddf19758192660aa5d7d49050f3, 0xc0d2ff32c5a6af243630ec9259c6af2c, 0x61aea3a5983fd6cae64eb8e88b96850d, 0xafe00c80288a3f318befb32b139a5437, 0x5c7c637a089f1adb6ead8f3bf7b7eddf, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_12_24B() { let mut eddsa_sig_with_hints_serialized = array![ 0x5819635133648c8ad52720890198d3b1, 0x71137301f7e496032cabe1db6c1bf93, 0x974e658b38a47047aa489c4d76fa6a83, 0x24d9df7dc42f7fa2bcfe6729086fc1b3, 0x230bb64643700951cf8a6929c7cf034b, 0xae72d12d199239156dc9d083054250f, 0x18, 0xd3, 0xd6, 0x15, 0xa8, 0x47, 0x2d, 0x99, 0x62, 0xbb, 0x70, 0xc5, 0xb5, 0x46, 0x6a, 0x3d, 0x98, 0x3a, 0x48, 0x11, 0x4, 0x6e, 0x2a, 0xe, 0xf5, 0x14, 0x93365d4deeadd32cb6bef2eb, 0xb1e8c7218c86075e32aee0, 0x1d7d22ed34f1149, 0x0, 0xe0f56ac073d697677a6fe5e5, 0x96d8c7060abc38fe9aca1fa8, 0x49724abc771d47ee, 0x0, 0x160b0f9b0c4c14a731464bb6d1b233d7, 0xd2e63ee4fa297d82b689e05eb59b317, 0xb184e835deae44e701bcd4c3, 0x89e0109a1956c9ad42d7eb0e, 0x4c9b77572f7eba05, 0x0, 0x6d672251bdafa6854506ba2c, 0xed6dbbf342430dda8e232a5, 0x522281f8c2485961, 0x0, 0x12bc7ea1134aefe5e5b12d22ad5b534d, 0x1243a10433596b92d64a074d7e1776fca, 0x82b993a0531c7dd032b01d860a0439de, 0x7bd75a648b9b9f011eb35a457c8f0fa8, 0xfae6685f07ce72100cf3cb675d2dff5e, 0x71631f2614a7d8451b8e92b94431e353, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_13_26B() { let mut eddsa_sig_with_hints_serialized = array![ 0xa0ee85cd9ee2f3d82246ba42a12bf32b, 0x238b21dd270b519b2c41649dbe479c7b, 0x27dd70b034665bf7f00d035a8c5b1f88, 0xf9bb6964eeb3389334ae3887c0e31ebd, 0x2831212de5e5382517d238a57130b76, 0xf9a04447ba0dc37653ad665f8b5907a, 0x1a, 0x82, 0xcb, 0x53, 0xc4, 0xd5, 0xa0, 0x13, 0xba, 0xe5, 0x7, 0x7, 0x59, 0xec, 0x6, 0xc3, 0xc6, 0x95, 0x5a, 0xb7, 0xa4, 0x5, 0x9, 0x58, 0xec, 0x32, 0x8c, 0x14, 0xdc02485645b64ce43298b09c, 0xc5b33942074cdd7280920b92, 0x6ab46e3a2ba409d6, 0x0, 0x41ba3f26848b6a909d587a94, 0xfdbf13ee5884324e413206d9, 0x3a09c07e27fd90b2, 0x0, 0x16e65808b9c27d57d7cd996821a0eff, 0x22b34ea38eebdbf4fbfde51a1faefa0e, 0xf772d2a88ec86f5ce6a7877e, 0x117c7f63e5c11f2b8d94f370, 0x692164d4228964e1, 0x0, 0x320d098d9fa46ac8495c66a0, 0xfd7ce2c6687abd6fb03ed1a0, 0x7b1010a7831bec78, 0x0, 0x3102b7637f8a45b26c33aaf26633fd91, 0x11c35669269462aabc3a7d66234b45bb3, 0xc9035a46924bf4932cd117694695e539, 0x6ce4dac054bc1a31f39854152016223e, 0x667226bfd4e63a2380c6eb6b8f164376, 0x7287797999af616511d3b1c69188181c, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_14_28B() { let mut eddsa_sig_with_hints_serialized = array![ 0x336ff7c6db96a4af9b6b7ab9a84a089d, 0x7e426943910f0a5281e617d9c916a106, 0xffd9e58d99e8b56c21661b78235487f5, 0x81efc3a9034537e3ac547010671d9dc2, 0xca78c41a6f70bd44672981de69f27715, 0x191cba6f957bd02f8b371f8cd549bf0, 0x1c, 0x5c, 0xb6, 0xf9, 0xaa, 0x59, 0xb8, 0xe, 0xca, 0x14, 0xf6, 0xa6, 0x8f, 0xb4, 0xc, 0xf0, 0x7b, 0x79, 0x4e, 0x75, 0x17, 0x1f, 0xba, 0x96, 0x26, 0x2c, 0x1c, 0x6a, 0xdc, 0x14, 0xc64d7b617fdd5e1dbfba3d1c, 0xdfc0e53f0dc3699f5e6cc2c6, 0x144281755c7dcb1f, 0x0, 0xd2a954957a5a6f44af21b472, 0x32241a2bbac5dcaa73d93ee7, 0x3f300f37829c6980, 0x0, 0x2db8a4f9c475029ff4a31fd1468b1d9d, 0x105400ba14430012a90e043fe206b7f80, 0x2916403d6d09a3606f2bb0e1, 0x9a8c140557d268d2555dc87d, 0x2750f18a91ffb29f, 0x0, 0xc0ea955da0b0dd810bdc057c, 0xaa16523f1baed52398fc986e, 0x76b7543e99975ea1, 0x0, 0xaea7956216a955368dbcfbf36879b7f, 0x1226e3a51516bc1bad4960660c8167217, 0xb4bd4eea06387163676c44a6cd8d3bd3, 0x7001ba4f029bd407b7f030ec050834e8, 0xac5166adc37dd52a5364e38f13cd26e0, 0x2eca1086c3bd55727b33c81bb9a08aa2, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_15_30B() { let mut eddsa_sig_with_hints_serialized = array![ 0xa3746aa5bbf565ce71fd2d563c32be23, 0x5b5afdb4f9c735f6942f3d576bc3dfa6, 0x8b375cc7ea20544f1b77de6b1ead8f0f, 0x482b433b82c110c22bcd5066acb56dae, 0xce93b289897a2fb9fa8f459505b116e0, 0x26ff1aa2a6506fc38203a246ceddfb8, 0x1e, 0xbb, 0x31, 0x72, 0x79, 0x57, 0x10, 0xfe, 0x0, 0x5, 0x4d, 0x3b, 0x5d, 0xfe, 0xf8, 0xa1, 0x16, 0x23, 0x58, 0x2d, 0xa6, 0x8b, 0xf8, 0xe4, 0x6d, 0x72, 0xd2, 0x7c, 0xec, 0xe2, 0xaa, 0x14, 0x695dff34554d1a4dc482d768, 0xd80b6ba6d7fa574d4d3290e7, 0x2a7ec089be1f9cbc, 0x0, 0x9d67cc27cacb90f274d3b80e, 0xe5f1d418344e291b7d9b6672, 0x1a29179e69f6518b, 0x0, 0x2148218957c9696ee542bcbdba204bb4, 0x10c6379409ee699507ba2a0c374d2adf7, 0x4739284c7860670641e3c224, 0xda1134a29f016547e345c4f0, 0x59dd1b7111fe87a, 0x0, 0x410b16bb6b54b3fe38806104, 0xaee2032adbd06d2248f8bfd5, 0x57dc9745231a60b, 0x0, 0xe956cf464450cbc9d6b0fba01bc8249, 0x1227d4b51278afc080aecbff814bf4a0f, 0x51dbe64d8ca775957a1e4bc33415af30, 0x4f2937cc1546c324d01dbb640cb6b0e9, 0x9b9a4ef694420c49e77e74c2e8d4b572, 0x2a0ac0449362354f213d5b96a050528c, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] fn test_eddsa_16_32B() { let mut eddsa_sig_with_hints_serialized = array![ 0x920ebc336f46f3a8fca7c6b1783a9fb4, 0xd9169375c3465f46a7c20643a0fb019f, 0xcfff01c94634eb2c32c1913b036c2604, 0xb33a73b89a17c59c987e834400cc43c, 0xf96da651bac612c035ef4281b4d8bbec, 0xb79952410703eb0e4b1d68a26b68c30, 0x20, 0xa7, 0x50, 0xc2, 0x32, 0x93, 0x3d, 0xc1, 0x4b, 0x11, 0x84, 0xd8, 0x6d, 0x8b, 0x4c, 0xe7, 0x2e, 0x16, 0xd6, 0x97, 0x44, 0xba, 0x69, 0x81, 0x8b, 0x6a, 0xc3, 0x3b, 0x1d, 0x82, 0x3b, 0xb2, 0xc3, 0x14, 0x662dc9a0c76e92de64ec1a88, 0xd2d804748dd9b3bca82dd8bd, 0x457a1c7d45c2e9a7, 0x0, 0x11a47f8c54b597cc233eb3c6, 0x63336aece841abd85253fd9a, 0x6ea4440a5a4d3f30, 0x0, 0x25bf29e718cebe0ce36dd0d4940f9d9d, 0x14fba393e8cd1b8036af3f707a8d9bfc, 0xfe9858637aa58ff5156e78d4, 0x956a2b8e1e2e952d10372d02, 0x6e43afd2c1a07d87, 0x0, 0x427e477e25b26ddcf82d0b31, 0xcbbb0211b0fa3200f1155f46, 0x78d4ba282e9fa7d4, 0x0, 0x28a9d1a11a601216ef8957600ea23a3f, 0x256a50b455e31ea6fd318955d93f2727, 0x9256394c23e0a68b4782cb46ae015318, 0x3357ca9c3c92a0fbc7694fcf95f4a6, 0x454ef0b5785b42c24de91294328ace85, 0x7dc110abca7f279ee8797a0fbd3d1bc0, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_17_34B() { let mut eddsa_sig_with_hints_serialized = array![ 0x4434db9c3af99a4b95c94d4745716baf, 0xc059ce3300b930e2244d821c657c5b9d, 0x7e2eb16ba77c2fdee09a99f2b1edc16, 0x3cc381f6897a04c578de3c14915edab8, 0x522d00ec11a803590928c9d528344e4e, 0x43eabb9d06d0c202719feb3f8d79ea3, 0x22, 0x8b, 0xc4, 0x18, 0x5e, 0x50, 0xe5, 0x7d, 0x5f, 0x87, 0xf4, 0x75, 0x15, 0xfe, 0x2b, 0x18, 0x37, 0xd5, 0x85, 0xf0, 0xaa, 0xe9, 0xe1, 0xca, 0x38, 0x3b, 0x3e, 0xc9, 0x8, 0x88, 0x4b, 0xb9, 0x0, 0xff, 0x27, 0x14, 0x8574ce95d05ba104575918c8, 0x478f99955bb34eafda2c4ef3, 0x76569cefd127cdc3, 0x0, 0x431e7bf616e082984d43819b, 0xd3de171509f57d53c66792c1, 0x12e6b6b75421ba59, 0x0, 0x42d2ba3c9b2a04ea6efa1fb2c448b27, 0x13c1fbc940e682b14e2822fd823c59374, 0x5a14bca84136abbbf31fa2b5, 0xc6a3506b2be99c8ce20d3fdf, 0x48fb6aec47c72452, 0x0, 0x5da1125f4fa6cded1ed8e483, 0xc2b212667311e55132b3860c, 0x3ac68f0d30d25ab2, 0x0, 0xae2fc31954b7bc1d2b8aac8de538e91, 0x12f8f3fcfcd9732eb74c7f05846518331, 0x4b0a8d3f7b856f0ccd6b58fa2d44a71c, 0x83744d08483ecb443579ded32c9c548, 0x40d42f7668f5a94e643c14c7da1fdebd, 0x6d275cfcf946e02027096f961f1121f2, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_18_36B() { let mut eddsa_sig_with_hints_serialized = array![ 0xaae380fcc272f2c7810a0979c8707301, 0x265b74ab60116998fc9a37cb3f60bcc2, 0xeecce3639db5961e14a75a33827f95ac, 0xfdd53395dc42afc24065027dc4a2c395, 0xb1755e913478f3ea7a18ad79167d8281, 0xc5e1a05dd43ba167501c8066828a947, 0x24, 0xe0, 0x5f, 0x71, 0xe4, 0xe4, 0x9a, 0x72, 0xec, 0x55, 0xc, 0x44, 0xa3, 0xb8, 0x5a, 0xca, 0x8f, 0x20, 0xff, 0x26, 0xc3, 0xee, 0x94, 0xa8, 0xf, 0x1b, 0x43, 0x1c, 0x7d, 0x15, 0x4e, 0xc9, 0x60, 0x3e, 0xe0, 0x25, 0x31, 0x14, 0xae93b41734e620cdee334fa0, 0xd352ee5d019527eb8c98e8f1, 0x33ec5f8898a0b075, 0x0, 0xb7b28970512e699b3a38463f, 0x6ddca8144ee02b3057724405, 0x38d2dfd4057d68ba, 0x0, 0xbd218002a44c7b51960ce902651c697, 0x1111b38650a75851b477de2ab9df44637, 0x84021670d8df0bfb2b628b5d, 0x11e4264eb37f2d5374f3a81, 0x7411fca07291f143, 0x0, 0xeb56b6b0af302d8903d0f9b7, 0x1ecf1d9759518efbfbce8f53, 0x6fab7cf11da9bf96, 0x0, 0x99aea252a91ad794073425c9eb7ca69, 0x16838f2988f00e1efa919551d94ce0b8, 0x115b8c0b51e3124c0c202c162992a1ab, 0x78e0429e2308507c6259d6eeeb977dde, 0x8e42671bc55a1b56d9411c574a12fdb0, 0x3f318627b427cd4f04c4bcb332869caf, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_19_38B() { let mut eddsa_sig_with_hints_serialized = array![ 0x3df5a88a1f2b1ca8076556b2bd0fad34, 0x30e9ee070d903e901ba9ad87cc64aacc, 0x4973c8372e2332c7549c489c1655b22a, 0xfd08ef29d3fee7abdb0905a2ebb186d4, 0x43b3ca51ccb56ca22e7be645d11cba75, 0x5f979b9d9fc6a4cecb0d71ffe85b0ee, 0x26, 0x83, 0x83, 0x67, 0x47, 0x11, 0x83, 0xc7, 0x1f, 0x7e, 0x71, 0x77, 0x24, 0xf8, 0x9d, 0x40, 0x1c, 0x3a, 0xd9, 0x86, 0x3f, 0xd9, 0xcc, 0x7a, 0xa3, 0xcf, 0x33, 0xd3, 0xc5, 0x29, 0x86, 0xc, 0xb5, 0x81, 0xf3, 0x9, 0x3d, 0x87, 0xda, 0x14, 0xa6292f8e5d044b22c5c63f84, 0xb5185d5bf28c5010285e7757, 0x455da0f9cd7bf6b0, 0x0, 0x765e6b22af349115fad57451, 0x59540b16237f6a1b57b61ec9, 0x62f01856724d22d6, 0x0, 0x17e85b805b8f90696245d1b1b1649e49, 0x3d44174a16f4dfe2ba3435e92180d6c8, 0x4981e32164acf5f47ec1644b, 0xc9771971ecf4273b72688ecf, 0x6d903846fdffebc, 0x0, 0xf9f67f8a29cbbb2787d26da9, 0xe579cb390629c7b291f9b184, 0x59c8c0216b2de9e0, 0x0, 0x2248d914e046643681fcff8df64e4d19, 0x110cf02766d970c48e424aa5132ad8c4a, 0x26c5bcd8bb36d24db3e484b1d29db41d, 0x5a146fe46aad15a653ebf45fc80274c1, 0xc49b3df64adbc040338abbe815fd2b80, 0x5fd235e9d5bdd1630c10d1de12b63e15, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_20_40B() { let mut eddsa_sig_with_hints_serialized = array![ 0x3cbce77b25c3d1f9d23fd2c2abc57217, 0xb864f9d243773a9b744b8440ee9cd71c, 0x5b972a3c6db9cea4b893e72476cd2868, 0x5283581e6258406153f34566ffe573f7, 0x321e5144266f736dafe6df421ff3e789, 0x8cbe8d30e73188d77792a5898a60f0c, 0x28, 0xda, 0x9c, 0x55, 0x59, 0xd0, 0xea, 0x51, 0xd2, 0x55, 0xb6, 0xbd, 0x9d, 0x76, 0x38, 0xb8, 0x76, 0x47, 0x2f, 0x94, 0x2b, 0x33, 0xf, 0xc0, 0xe2, 0xb3, 0xa, 0xea, 0x68, 0xd7, 0x73, 0x68, 0xfc, 0xe4, 0x94, 0x82, 0x72, 0x99, 0x1d, 0x25, 0x7e, 0x14, 0x5fa522a4fef55e8e23ddadc9, 0x4162b9c3d065c6877fcae158, 0x2c69d38963d3bbb0, 0x0, 0xa32c421a1744326f2487aa9d, 0x5d3a2032e251af5714e7268, 0x6f0b4dcca7119894, 0x0, 0x1eb1fc609d94408338932e6571331544, 0x106e4b717d15ec8ce530c18b4be2f30bf, 0x948833f5f59ff99bb96d7d9a, 0x1972451c30b9681ac6cc4894, 0x71db24cb9a8e37e5, 0x0, 0x5b05737bf52d3fac0da1105c, 0xdb567e54ca42d6c5bcaee354, 0xd21c41d6e5278aa, 0x0, 0x4a10590868e679657c16429324bdd19, 0x363fc94159c3ad82e51877bd206d3da4, 0x649a1364d8d8f4e98bc74329570bfc96, 0x3a80f629c7d3bc576d89c9d496ee9f95, 0x57b85b2b20263ab1877dcbc3614d71ed, 0x39711965fa2e49141a67dce0499f9413, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_21_42B() { let mut eddsa_sig_with_hints_serialized = array![ 0xa3ff77a0b64bf8a53add37c4208b76da, 0x8d39c2e67fcefdc35c2b35c50185b64a, 0x6e7ca9c4d5e470a6262477c6203a721c, 0x2203296e40441e6315a4b01bf74791be, 0x5fe90f5d23dc8e6a85e78f347d97cae4, 0xa2f558ffddbc7e2778af2ddef1ad97e, 0x2a, 0x56, 0xf1, 0x32, 0x9d, 0x9a, 0x6b, 0xe2, 0x5a, 0x61, 0x59, 0xc7, 0x2f, 0x12, 0x68, 0x8d, 0xc8, 0x31, 0x4e, 0x85, 0xdd, 0x9e, 0x7e, 0x4d, 0xc0, 0x5b, 0xbe, 0xcb, 0x77, 0x29, 0xe0, 0x23, 0xc8, 0x6f, 0x8e, 0x9, 0x37, 0x35, 0x3f, 0x27, 0xc7, 0xed, 0xe9, 0x14, 0x6b84c39c4ad9cb2e9fa5c149, 0x78c59746fc3088327d4bbd98, 0x68c11f92ae24ca72, 0x0, 0x1ced9f7228d7051e25a21ff2, 0x5ad874fcfa9ef5ba64690548, 0x51bb8c3d280a1573, 0x0, 0x13a34b7d33dc76aaae012b70bcf1acd0, 0x2e42e245d8c7acb1d38141d0f2db3a2d, 0x3e1169a11a78e93989c338ab, 0x899bef2f13548199aa4ef880, 0x4f1ae0fecc6a40e4, 0x0, 0x99a7d8e333508e404954f77b, 0x6a763523b369a5647f1c3231, 0x24569ad8c201845a, 0x0, 0x66ff6748d8f79e3c78e61150ca8a367, 0x222ba2090a2091dccb807d3796e4bcba, 0xe4a0af74125fe32ce5ba54d9150a8f70, 0x2f9b4728682aa4dc6c45b098f9fa09c7, 0xe1c91d844f3ac84d0a918cb52493a511, 0x3b5e09022b3317db3e3908788aa7e0f8, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_22_44B() { let mut eddsa_sig_with_hints_serialized = array![ 0x476be4e75dba5012b6312fd42b6afbec, 0x37be3a0a7bdfd17b1ab70d66bcdfaf19, 0xb801bc80df12f7989423c74c3485f89a, 0xf6e2727a014555aa8bd2a1d41e293806, 0xa46c3a54f5b9fa5beba63d60f9cc4956, 0xcb015f6de95bf66bf763c156638afa7, 0x2c, 0x63, 0xb8, 0xb, 0x79, 0x56, 0xac, 0xbe, 0xcf, 0xc, 0x35, 0xe9, 0xab, 0x6, 0xb9, 0x14, 0xb0, 0xc7, 0x1, 0x4f, 0xe1, 0xa4, 0xbb, 0xc0, 0x21, 0x72, 0x40, 0xc1, 0xa3, 0x30, 0x95, 0xd7, 0x7, 0x95, 0x3e, 0xd7, 0x7b, 0x15, 0xd2, 0x11, 0xad, 0xaf, 0x9b, 0x97, 0xdc, 0x14, 0x8e7a92dea46f5561cf42f4bf, 0x3c16c9f7e12c8031937b5841, 0x2fad501544bd25c3, 0x0, 0x9a42264efd722de5794de5a1, 0x8ad70bf5e54d7c1e3e4833a8, 0x52e0fbeffe0d8623, 0x0, 0x63dda375cf39add7aff7470ead0dda5, 0x128071e01fe406fbeba88b7ccaa65a4a4, 0x6527a45e52b613894241f38, 0x27f84d85b97550d9cff0469e, 0xeff192310afb7, 0x0, 0x57d8a273d2fa8a6a0a827f15, 0xca33afdf5da8a3e129924e5e, 0x17dbe1f0ad58ba4e, 0x0, 0x235bfdd3d4df5fbab9ebc276cf04fa73, 0x1024324259d46313353e5ba361cda0906, 0x20866b32fd08893480bdca692eb706b5, 0x44899a259832955b940237cc48fa0d8, 0x396285d427e7e9697dd65ae4a51141ba, 0x257ce91e91c41dabaf781533a67e1b9e, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_23_46B() { let mut eddsa_sig_with_hints_serialized = array![ 0xeedad93b7bddeacc2a01b2aa95e7a3ab, 0x32386e83a3c29936c9d7dc8b25f56fed, 0xe016915541fad2d520ce87d4a81f692c, 0xf76cd64135185625150e24f57c39f4bb, 0x4347384defdb3903398d38a401245853, 0xb6e8a1a13b9a78ba6ab8d5ff546a3ca, 0x2e, 0x4f, 0x18, 0x46, 0xdd, 0x7a, 0xd5, 0xe, 0x54, 0x5d, 0x4c, 0xfb, 0xff, 0xbb, 0x1d, 0xc2, 0xff, 0x14, 0x5d, 0xc1, 0x23, 0x75, 0x4d, 0x8, 0xaf, 0x4e, 0x44, 0xec, 0xc0, 0xbc, 0x8c, 0x91, 0x41, 0x13, 0x88, 0xbc, 0x76, 0x53, 0xe2, 0xd8, 0x93, 0xd1, 0xea, 0xc2, 0x10, 0x7d, 0x5, 0x14, 0xf6aa1c3bcc6e9700fc72b9ec, 0x681c04f4d32e18731212375d, 0x5e0dd71647da599c, 0x0, 0x8e0f72c3b68f7ebafcec36a9, 0xbfdb6659c14511f534e282e1, 0x560f035da03f446c, 0x0, 0x6754299b9230b4b748b81c8773dcc0b, 0x11e0735b5b5d8d1e8a026d71f4944f30f, 0x7b9ba4e30b721ef913b4b6af, 0x23173f3fe90e6b5dec2fab9b, 0x230513fc8fe0951c, 0x0, 0x561a02e5dfbd78c8fb30a94b, 0x9b595711a1baf14fbec9b24b, 0x4c2dfe6dc0026e8b, 0x0, 0xffb8cc0ac6f793bee4a03695b069793, 0x1028d22f7af6abfad53ca95e74b6d75dc, 0x5c419a73d0a5de49c039f6583bfa4681, 0x6706312f873431995171f83697a97122, 0xc3aee7a86e08b3325330143719401486, 0x6faf8d956cf70dd2ebc8a45c3391c21, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_24_48B() { let mut eddsa_sig_with_hints_serialized = array![ 0xcfdb8360a12c992b6b3ed4a4bbefd290, 0x7fc4d34558e9f375eeb007393822b3a2, 0xd2cb053d81746685d5f1ae2144992efa, 0x60fec2bdfdc60dcd6eaf24b45eef84cf, 0x9e14c9f1b2bf594ff3ec12338885e95f, 0xbaedd28edf3301173b205daecc99c5b, 0x30, 0x78, 0x3e, 0x33, 0xc3, 0xac, 0xbd, 0xbb, 0x36, 0xe8, 0x19, 0xf5, 0x44, 0xa7, 0x78, 0x1d, 0x83, 0xfc, 0x28, 0x3d, 0x33, 0x9, 0xf5, 0xd3, 0xd1, 0x2c, 0x8d, 0xcd, 0x6b, 0xb, 0x3d, 0xe, 0x89, 0xe3, 0x8c, 0xfd, 0x3b, 0x4d, 0x8, 0x85, 0x66, 0x1c, 0xa5, 0x47, 0xfb, 0x97, 0x64, 0xab, 0xff, 0x14, 0xc17a6d05aaa41f9149dcdb2b, 0x402616ffdb4be4a39136a15a, 0x5ba0b15e673922b, 0x0, 0xdf4a5ed66de118a654bb55b4, 0x49018cec5c513896e1d4a5e6, 0x6ae98c1c50103d05, 0x0, 0x723647dbe73565e7b296b665b6be597, 0x19ef237fc11b456bec481912e370bb95, 0x71388f6384ec1f413bb64710, 0x5df63eb4f74230be958e4991, 0x562fa915201de425, 0x0, 0xa445ce534badd02fdfd8f5cc, 0x73ac7e1c6a395204156ead87, 0x3824d1eac362f57c, 0x0, 0x334bb82d22d7cc13bf79805b67a26a85, 0x12582916a2d746811cf563824ac031712, 0xce5742cee59b900d9b3befe2ee496042, 0x5d32a7afdf3f080544d2ce6e7ca33834, 0x69b771d216a328ed57ed6b4ec1cad004, 0x75fe7470f00d84132c4a40f8d601283c, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_25_50B() { let mut eddsa_sig_with_hints_serialized = array![ 0x9fb36f3a5f8c20a6bb348ee70f8502c, 0xea3e15166e0a2078e025ccdb5030110b, 0xdcda74b5f6ae8167383631a49a4e669, 0x82d3d8fdbe897cc664a2d0f158cc1e73, 0x579680c715179313f50bcc333be18d9d, 0xe593607433d771c964c7e560b9bfe2, 0x32, 0xf3, 0x99, 0x2c, 0xde, 0x64, 0x93, 0xe6, 0x71, 0xf1, 0xe1, 0x29, 0xdd, 0xca, 0x80, 0x38, 0xb0, 0xab, 0xdb, 0x77, 0xbb, 0x90, 0x35, 0xf9, 0xf8, 0xbe, 0x54, 0xbd, 0x5d, 0x68, 0xc1, 0xae, 0xff, 0x72, 0x4f, 0xf4, 0x7d, 0x29, 0x34, 0x43, 0x91, 0xdc, 0x53, 0x61, 0x66, 0xb8, 0x67, 0x1c, 0xbb, 0xf1, 0x23, 0x14, 0xb3b35fd5c7c76a8ea5b2a6ba, 0x6c0a0a53693666bd25ee428c, 0x202f90c8ef321f6f, 0x0, 0x3c08c085af81e14f87c4bc03, 0x3afe55b3061dc180489354f, 0x837540e0ecd67a3, 0x0, 0x333eda5ec9a4997625f1b53f1102021d, 0x1079bddd98bb1a199c2d8b57dcb5dc00f, 0xa9db5a3566d6d7bf3cf98b58, 0xd867c7904c4254f037ab74f5, 0x19c96b03ef8562cd, 0x0, 0xaae27af9c2298bc97cd34493, 0xfc562747747b0394b3f02019, 0x1a01d22c3d2fa4a0, 0x0, 0x111acf0e8d550078a432773811d0e09, 0x21bb5e205ac4f9c793f53dabc51b401e, 0x83c9cb27881166dc58f55d24a3cc5629, 0x13943760e9fccf769ae50fa9cbe54f4, 0xac766d9b53daefcb66a02c6d840691a3, 0x49509ad5e9d477ad6c36d0b0d515bdb4, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_26_52B() { let mut eddsa_sig_with_hints_serialized = array![ 0xe1405cbd4e9a829f72cf5a41f2193c5e, 0x1ae53709ed876037a90357a9bc9fbca6, 0xcc2c3c13dd3b0b36d4f91e81a1c3d427, 0x139b7f17e47eb06c771582242f2cd030, 0x2e187f3c66c725f2d8fec2a670dd42fc, 0x1eab1c54e83d5e1b0c70df2cfece87e, 0x34, 0xf8, 0xb2, 0x19, 0x62, 0x44, 0x7b, 0xa, 0x8f, 0x2e, 0x42, 0x79, 0xde, 0x41, 0x1b, 0xea, 0x12, 0x8e, 0xb, 0xe4, 0x4b, 0x69, 0x15, 0xe6, 0xcd, 0xa8, 0x83, 0x41, 0xa6, 0x8a, 0xd, 0x81, 0x83, 0x57, 0xdb, 0x93, 0x8e, 0xac, 0x73, 0xe0, 0xaf, 0x6d, 0x31, 0x20, 0x6b, 0x39, 0x48, 0xf8, 0xc4, 0x8a, 0x44, 0x73, 0x8, 0x14, 0xe65e7fe469389002fc7e8a57, 0xf5b85bed46a00c3b565ebe3, 0xdfb32e26ef297ed, 0x0, 0xafa8530415d22760c6d2b82a, 0x3d4cf9af9e321a9d52458d29, 0x1017dee106d78e13, 0x0, 0x204988f6a59dff4ef4bfb55d11ab1ec5, 0x1c7564759fa0994497c7b23d5195c3af, 0x67cd465864680f744b4c139f, 0x1f6118c3db728c0b671289a0, 0x526a6d0a81c6de17, 0x0, 0x7e2abbcc7e46b7f2a07873eb, 0x6d925be11b749e01fbed5766, 0x42b07313b6687cad, 0x0, 0x753cc470c1cbef106b37c0820954b69, 0x107776920c1afb3097c6af04856fcc034, 0x2949b860890c89625374cd3a9b74b1b2, 0x3e8bf981fa03c01cc7dccd738a261f28, 0x8ab1c1445f2f250fc8c354c959da80, 0x238e9c2dd40f5ec92dd14281c6e86509, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_27_54B() { let mut eddsa_sig_with_hints_serialized = array![ 0xe205910db2c633ec94a8fe163e9ca965, 0x2e4aabfeac8b4dbd9b9d76a464274ea0, 0xa27b806af44a61d382b6b8831d90bb01, 0x75a50aff49f523345d3275b7fe581369, 0xf4d419b354f3d821970fc7e9741a4e7e, 0xd736446d6fe94fb0ffd70c84514d9a1, 0x36, 0xe0, 0x72, 0x41, 0xdb, 0xd3, 0xad, 0xbe, 0x61, 0xb, 0xbe, 0x4d, 0x0, 0x5d, 0xd4, 0x67, 0x32, 0xa4, 0xc2, 0x50, 0x86, 0xec, 0xb8, 0xec, 0x29, 0xcd, 0x7b, 0xca, 0x11, 0x6e, 0x1b, 0xf9, 0xf5, 0x3b, 0xfb, 0xf3, 0xe1, 0x1f, 0xa4, 0x90, 0x18, 0xd3, 0x9f, 0xf1, 0x15, 0x4a, 0x6, 0x66, 0x8e, 0xf7, 0xdf, 0x5c, 0x67, 0x8e, 0x6a, 0x14, 0x8fd48a5f0cbc7cd551b22b8f, 0xf70280b61c3739182e9707c5, 0x1bb4d9afe2b6388a, 0x0, 0xedd3e73dfef36cf88bd9c61d, 0xaec12bf9f55127130f8749cc, 0x4c9f640f4dd1e2af, 0x0, 0x188b5300042082233b95b31db38d6faf, 0x9223932d7b504223f930056888ac19c, 0x2e970b3220987939bb229eaa, 0x47a6fa0b58ad803d3daaf244, 0x5f1c153a8b5f9869, 0x0, 0xb3795852b41dd54acd555598, 0x8d67b51c5ff50eb415b43815, 0x326cc94912a4cc3e, 0x0, 0x165d26c1c61e237b08433ed3d7ee3ca7, 0x124bbe48efb6b7c2e2caf70c2e3cb5d1c, 0xe98560f4b05a42b6abfd7d4381e6ea5c, 0x791bc3d6e37de6c41a20af9aac189a7d, 0x4c6aaaebe23953c625e6c2ce955a818c, 0x6286fc75f531a5a68b22af0e38eb4903, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_28_56B() { let mut eddsa_sig_with_hints_serialized = array![ 0x6cd49146124c9ae4dfcd13517a4ca057, 0xda1fa7ec0a33a172cb9d3f348fdc9c1f, 0x90c02885701acf55147dc8f947c9cba6, 0xfa55dea45474f4adba1d5d85e4ce1ef1, 0x2d9921cf8c29598f5f5b3ad7364be84c, 0xb66c3f2329d7e3b75873d1634ef92f4, 0x38, 0x7f, 0x31, 0x8d, 0xbd, 0x12, 0x1c, 0x8, 0xbf, 0xdd, 0xfe, 0xff, 0x4f, 0x6a, 0xff, 0x4e, 0x45, 0x79, 0x32, 0x51, 0xf8, 0xab, 0xf6, 0x58, 0x40, 0x33, 0x58, 0x23, 0x89, 0x84, 0x36, 0x0, 0x54, 0xf2, 0xa8, 0x62, 0xc5, 0xbb, 0x83, 0xed, 0x89, 0x2, 0x5d, 0x20, 0x14, 0xa7, 0xa0, 0xce, 0xe5, 0xd, 0xa3, 0xcb, 0xe, 0x76, 0xbb, 0xb6, 0xbf, 0x14, 0x221f8ae08ba5a8b36e213773, 0x3b5c2e1a0eb0f0dbbf806105, 0x4193c37bae1895cf, 0x0, 0x93b2e4cb7b4cb75620dd80ad, 0x30c7fe492e2173818988c7b, 0x13c907b836ebd26d, 0x0, 0x1892c94646453a6599670cbf4d7329cb, 0x26c90b82594af5ef94487cfcd2106d53, 0xd9ddc94af516fb8449f061a8, 0xc0fb572fdbe70b1d59d80007, 0x2d8b0f14c92d1cdd, 0x0, 0xcddf1ba9914ce12c8cc36a68, 0x79e032c4c246b23cd4943fa7, 0x33443ad08a8b45d4, 0x0, 0x2e324828471c960e7c93d1f2920a0f3b, 0x10d9e8be6f56de45c5a85896623d83ef0, 0x7d5783030cd8e4017806134ff0ebf737, 0x3e70836352841b985940286dd86ee97e, 0xe730705124f314044c5f7421d9b16011, 0x90ad7fad39fa85be8e39c6bed340cbb, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_29_58B() { let mut eddsa_sig_with_hints_serialized = array![ 0xa5cd35ea3685ae2b5e62991409da7e0f, 0x123634832c6f1d346b417e9c6ad13b48, 0xe074ecb682f8165568625d6af241bdef, 0x78659c9ae9268f2431c203d23018a7d5, 0x9fbcecf9240dad1672fab8cd680d90ec, 0x4a71fa395536426f6826566515365fa, 0x3a, 0x8d, 0xdc, 0xd6, 0x30, 0x43, 0xf5, 0x5e, 0xc3, 0xbf, 0xc8, 0x3d, 0xce, 0xae, 0x69, 0xd8, 0xf8, 0xb3, 0x2f, 0x4c, 0xdb, 0x6e, 0x2a, 0xeb, 0xd9, 0x4b, 0x43, 0x14, 0xf8, 0xfe, 0x72, 0x87, 0xdc, 0xb6, 0x27, 0x32, 0xc9, 0x5, 0x2e, 0x75, 0x57, 0xfe, 0x63, 0x53, 0x43, 0x38, 0xef, 0xb5, 0xb6, 0x25, 0x4c, 0x5d, 0x41, 0xd2, 0x69, 0xc, 0xf5, 0x14, 0x4f, 0x14, 0x9b1c19208091298d52b36ff8, 0x86a37c43e6283f0de97ec43c, 0x4a72aab104cfe59c, 0x0, 0xdea3ba3657ed19626b8a6032, 0x41ae598bba09f743633bf037, 0x1dbd4c50f393a85f, 0x0, 0x1bc74f1028aeb6f6970483ae9cc95d63, 0x2025f40277c842f6a70792a848c26cb4, 0x50994f1284796db6fad98849, 0x30278b2241f9ac8d9d9adcfb, 0x6ae23674d14c9829, 0x0, 0x4ee6e2f223e8d6739f5f5880, 0x236022ff45332e17e050ef89, 0x4e62795b32055a40, 0x0, 0x3e5d60e5fc3b1f7d57a9c5f4a661cef3, 0x134cf865b10157749c76a5699e5a54c9f, 0xf044d65abce84b8879ae487d70dbcb0c, 0x18b94c37ce13d3ab114b84324e8fd5e7, 0xe2358f86e3017a6600ec864c9b562c80, 0x4252d8aff604e746087ad8b8c79e7bd5, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_30_60B() { let mut eddsa_sig_with_hints_serialized = array![ 0x9b7290b34092910ceb3f4d5440e58d78, 0x135f2ec69465bb63e97ad644be987e4, 0x409078c3a7fa07258520e79127e0fdd2, 0x42154902407f55ac13f321636486efd9, 0x88515dbc1f5095d4b0cd90695cd067dd, 0xf69c27fa40306ee8b09f61bdc84bbbf, 0x3c, 0x3a, 0x53, 0x59, 0x4f, 0x3f, 0xba, 0x3, 0x2, 0x93, 0x18, 0xf5, 0x12, 0xb0, 0x84, 0xa0, 0x71, 0xeb, 0xd6, 0xb, 0xae, 0xc7, 0xf5, 0x5b, 0x2, 0x8d, 0xc7, 0x3b, 0xfc, 0x9c, 0x74, 0xe0, 0xca, 0x49, 0x6b, 0xf8, 0x19, 0xdd, 0x92, 0xab, 0x61, 0xcd, 0x8b, 0x74, 0xbe, 0x3c, 0xd, 0x6d, 0xcd, 0x12, 0x8e, 0xfc, 0x5e, 0xd3, 0x34, 0x2c, 0xba, 0x12, 0x4f, 0x72, 0x6c, 0x14, 0x767582504fcdf5c532ae821f, 0x369283997ece24f13874c7f3, 0x2c98a25fbbac87a0, 0x0, 0xb605dd1a7fd4bc65bfa1cc37, 0xa8f7771da5567342f07d981f, 0x70c2347f0c6cad9d, 0x0, 0x2374543478d593b0338a55f4bfc170d1, 0x1091fb47f6277c497014342fd6302db4f, 0x75607a81fc9dfdbce0a61099, 0xaaf1cdc31dac2c136d9f0796, 0x320d0d002388dca2, 0x0, 0xd52681f4406522dfe89abd4b, 0x16c7f383c6733c5126d3ef23, 0x705ed4abf42a6a8b, 0x0, 0x28b688ea47e475fbe26e2054b2f25ec5, 0x12c0f45dc3f535dd3bda5ee32c863aa05, 0x3c11a7163b0a795314eedc7f9f209cf2, 0x38b48bcaf3ce9863ef2021828e2f49c3, 0x25b049f36336d365154fee2d92f7209a, 0x7afa60ee9713dfea9945e105904bb927, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_eddsa_31_62B() { let mut eddsa_sig_with_hints_serialized = array![ 0xe2c6f49b0327d5e1b001737df5ea1005, 0xb15103103c20f3345476b4613a0a3092, 0xec38dd1c63f1903a5b70c76a43d8e506, 0xad60d5e7a4be5efaf2b9a97897a43f1a, 0xca1a7642373220a48bfafa42ff26dda7, 0xb435db4aa2df73ff6be1bc20d940469, 0x3e, 0x54, 0xe0, 0xca, 0xa8, 0xe6, 0x39, 0x19, 0xca, 0x61, 0x4b, 0x2b, 0xfd, 0x30, 0x8c, 0xcf, 0xe5, 0xc, 0x9e, 0xa8, 0x88, 0xe1, 0xee, 0x44, 0x46, 0xd6, 0x82, 0xcb, 0x50, 0x34, 0x62, 0x7f, 0x97, 0xb0, 0x53, 0x92, 0xc0, 0x4e, 0x83, 0x55, 0x56, 0xc3, 0x1c, 0x52, 0x81, 0x6a, 0x48, 0xe4, 0xfb, 0x19, 0x66, 0x93, 0x20, 0x6b, 0x8a, 0xfb, 0x44, 0x8, 0x66, 0x2b, 0x3c, 0xb5, 0x75, 0x14, 0x962624a2b58a3398a4cb5f20, 0xa2f7b76e2e5211d70478e1c4, 0x34f1dbb6c3a2820f, 0x0, 0xb1959060b4fbc9fdbf1fbd3d, 0xb65e79dd2152fee4e722175b, 0x1e30caa19014bf94, 0x0, 0x566024cc1d8444077611d2dbc0124c0, 0x838993ad8b06741eb5a8c34b36a8ab9, 0xa8daf3da5d467d1f8f78fa2e, 0xda73157212cd2884342c6fe5, 0x2027ede735f65b7d, 0x0, 0x66c3c9bb08d3e040fcfc08b1, 0x2653aa90486e889f8d9527d9, 0x5fd1337521e862db, 0x0, 0x5dca01e9cbf9f2873a07d909c4bc1d9, 0x1703982ac551c4c9dbe2856f29d22033, 0xbed3d85b70b069b3447e8327aaf8695f, 0x408a942fe8f45cddd22487f5180e39a3, 0x8c9bf6a015c76f19883037c34ca77b45, 0x566af0d91aa86827627d0323bd33fdb9, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } #[test] fn test_eddsa_32_64B() { let mut eddsa_sig_with_hints_serialized = array![ 0x51e367ada5fda575b66d4bf876a03ff7, 0xccc6e9870301ca0968d1ad297f8e1ea4, 0xa1ea48dde7ba2174837f2011a7d2b957, 0x3a8f457be1fe065830f1a0709a1aab8e, 0x770b006f49e8c90a3e4d83d102b36409, 0x66aee0e84c7fb32e657a9f8413b08f0, 0x40, 0x4b, 0xaf, 0xda, 0xc9, 0x9, 0x9d, 0x40, 0x57, 0xed, 0x6d, 0xd0, 0x8b, 0xca, 0xee, 0x87, 0x56, 0xe9, 0xa4, 0xf, 0x2c, 0xb9, 0x59, 0x80, 0x20, 0xeb, 0x95, 0x1, 0x95, 0x28, 0x40, 0x9b, 0xbe, 0xa3, 0x8b, 0x38, 0x4a, 0x59, 0xf1, 0x19, 0xf5, 0x72, 0x97, 0xbf, 0xb2, 0xfa, 0x14, 0x2f, 0xc7, 0xbb, 0x1d, 0x90, 0xdb, 0xdd, 0xde, 0x77, 0x2b, 0xcd, 0xe4, 0x8c, 0x56, 0x70, 0xd5, 0xfa, 0x13, 0x14, 0xd161fc726de012c0e0743e7, 0x42acee4e16921c0867f97342, 0x3df8d27df4355025, 0x0, 0x417af9c7a0442b578a1bc6fd, 0x8b47ac563f259260e2b0f80, 0x6c6ff02c28f84b7c, 0x0, 0xa02b77f8fd8b7c1eb63155c5ea920a5, 0x106d7cd46cb0e0c81f3d995c3bc47503d, 0xb4630746992c8a357d6df9eb, 0x5fdba5230f13b83f1c2abc8e, 0x23b4e6d66fd0dd34, 0x0, 0x7670dc68e4c7436863f0f4e, 0xf570573dc0f1cc0cdc47bf49, 0x5e0b72bc8a7978af, 0x0, 0x211da8e595abb9413372df7309b63acf, 0x1085d544d1097dd536984587f626dac87, 0xf72722a04d4e780bc03c03781212ceac, 0x7d057bb78a4c6624f1754cb4366b1757, 0xdb32bb362e6f4e4ab652852ea150f205, 0x745397cfb61e599ed42508c8e6169142, ] .span(); let public_key_y = Serde::::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let eddsa_with_hints = Serde::< EdDSASignatureWithHint, >::deserialize(ref eddsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_eddsa_signature(eddsa_with_hints, public_key_y); assert!(is_valid); } ================================================ FILE: src/src/tests/autogenerated/msm_tests.cairo ================================================ use garaga::core::circuit::u288IntoCircuitInputValue; use garaga::definitions::{G1Point, u384}; use garaga::ec_ops::msm_g1; #[test] #[ignore] fn test_msm_BN254_1P() { let mut data = array![ 0x1, 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0x772ca79c580e121ca148fe75, 0xce2f55e418ca01b3d6d1014b, 0x2884b1dc4e84e30f, 0x0, 0x1, 0xb4862b21fb97d43588561712e8e5216a, 0x967d0cae6f4590b9a164106cf6a659e, 0x0, 0xa9f0001b3fc543c76e78dbe5, 0x59d3efe5fc893f110337f203, 0x2a3c4edaf4eb5933, 0x0, 0x47c7d40af526b19cd3c8e9d6, 0x77e086d9ab1747415c8a345, 0x2ecf62cd2d14d49c, 0x0, 0x10000000000000000358f1af3ace11fdc, 0x100000000000000004ac9542b22967d33, 0x100000000000000000cf05f964742cc6d, 0x1000000000000000081d342cffb91cba7, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xa9f0001b3fc543c76e78dbe5, limb1: 0x59d3efe5fc893f110337f203, limb2: 0x2a3c4edaf4eb5933, limb3: 0x0, }, y: u384 { limb0: 0x47c7d40af526b19cd3c8e9d6, limb1: 0x77e086d9ab1747415c8a345, limb2: 0x2ecf62cd2d14d49c, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BN254_2P() { let mut data = array![ 0x2, 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0x772ca79c580e121ca148fe75, 0xce2f55e418ca01b3d6d1014b, 0x2884b1dc4e84e30f, 0x0, 0x536c985db33c69f7c242e07a, 0xfc531bccffafcf1e59d91fb9, 0x2585e4f8a31664cb, 0x0, 0x57fa42444057cf0c1d62ae3c, 0x4f48d341183118d68ea41313, 0x1d2d2799db056ed1, 0x0, 0x2, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0x1521f387af19922ad9b8a714e61a441c, 0x5a92118719c78df48f4ff31e78de5857, 0x28fcb26f9c6316b950f244556f25e2a2, 0x0, 0x3e478e7543d16c51c9284bef, 0xc686c1c872c6e2c5037128b3, 0x199c5e1c0cdf53c8, 0x0, 0xf388e0c9512c46adb6327d02, 0xfeecfb56cfd9a1509392beb3, 0x2ccad398d3b28843, 0x0, 0x9be5263ddc8a3746, 0x3b9c1e56ffcfcc82, 0x1000000000000000041c754da808c6d02, 0x277449c3e218531f, 0x5211712cf983c9bb37a437a3, 0x3c9da9e18a4323d2ed3b9bcb, 0x135de21f5341b7ec, 0x0, 0x3c22df03e388c6cea0664c2b, 0xc1036691dedbab22e63b1e2a, 0x104e399500d777b8, 0x0, 0x100000000000000005fcd1b724f1296a6, 0x1000000000000000016e3236cbd22722f, 0x4dac40f4f32b51f2, 0x1000000000000000000417aa85f133ffd, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x9234d7617541ef6bd6a55e9e, limb1: 0x7a1353bb00de9de1d818c849, limb2: 0x21e43e4fdf41dbf4, limb3: 0x0, }, y: u384 { limb0: 0x30dd41ab3aae480eb7924f99, limb1: 0xa94c0b54f99635a912b59f0f, limb2: 0x187498a467804f5b, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BN254_3P() { let mut data = array![ 0x3, 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0x772ca79c580e121ca148fe75, 0xce2f55e418ca01b3d6d1014b, 0x2884b1dc4e84e30f, 0x0, 0x536c985db33c69f7c242e07a, 0xfc531bccffafcf1e59d91fb9, 0x2585e4f8a31664cb, 0x0, 0x57fa42444057cf0c1d62ae3c, 0x4f48d341183118d68ea41313, 0x1d2d2799db056ed1, 0x0, 0x236ca9312dad3661a37f2d6f, 0x98424c01caad7592315715d1, 0x795b9fd941b23c4, 0x0, 0xc7ab5834609a54b8993ffd79, 0xe81cd490528b814ca632aace, 0x2d9ff53d3009e6f7, 0x0, 0x3, 0x5a92118719c78df48f4ff31e78de5857, 0x28fcb26f9c6316b950f244556f25e2a2, 0x8d723104f77383c13458a748e9bb17bc, 0x215ddba6dd84f39e71545a137a1d5006, 0xeb2083e6ce164dba0ff18e0242af9fc3, 0x5f82a8f03983ca8ea7e9d498c778ea6, 0x0, 0xeb6c64e1541feb4cd5958beb, 0x69953b682ac9e3bef74198ea, 0xf357da3c551bd01, 0x0, 0x8cf96097b6703380dee48cfa, 0xaf4c872e1b6551bf875c946f, 0x30549c20b1c1e0ff, 0x0, 0x100000000000000005fcd1b724f1296a6, 0x1000000000000000016e3236cbd22722f, 0x4dac40f4f32b51f2, 0x1000000000000000000417aa85f133ffd, 0x71c5aa9b358faf4569aead5, 0x5b16db715ec2839da79801db, 0x33ab1528e0d2ba4, 0x0, 0x1d4cf315732c8bfaf74e675a, 0x81e4a39e6f6fca6f89cc94f0, 0x2939221afe7a9318, 0x0, 0x100000000000000001ab0231e3f1af32b, 0x1f1689eda0b7325, 0x8211c744ee497946, 0x100000000000000001401005296ba5335, 0x9f30216b591e9f34501cf268, 0x7aebbd8d9c7bedb729aab01f, 0x16413acc47520c69, 0x0, 0x596a902a02766a7777a12a86, 0xcd89979d5d539a6d7dfb9208, 0x12c9d036ab478f21, 0x0, 0x257275fdb7e6a5fd, 0x437a0a16546be43f, 0x100000000000000001e20dc33694e8500, 0x4c004b142b3cda1a, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xa505aa539534e1ed3825e1d3, limb1: 0xd3d6e50ccbd336be810ae134, limb2: 0x2b8806194c015dab, limb3: 0x0, }, y: u384 { limb0: 0xe3066db5d6cc9577162aa35c, limb1: 0x3ab20c13b3f5fdea9441aaa8, limb2: 0xc21ee843d06bdd4, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BN254_4P() { let mut data = array![ 0x4, 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0x772ca79c580e121ca148fe75, 0xce2f55e418ca01b3d6d1014b, 0x2884b1dc4e84e30f, 0x0, 0x536c985db33c69f7c242e07a, 0xfc531bccffafcf1e59d91fb9, 0x2585e4f8a31664cb, 0x0, 0x57fa42444057cf0c1d62ae3c, 0x4f48d341183118d68ea41313, 0x1d2d2799db056ed1, 0x0, 0x236ca9312dad3661a37f2d6f, 0x98424c01caad7592315715d1, 0x795b9fd941b23c4, 0x0, 0xc7ab5834609a54b8993ffd79, 0xe81cd490528b814ca632aace, 0x2d9ff53d3009e6f7, 0x0, 0x163df40cafbf585ca5b2ab44, 0xb4752e4666c88dbbe23783a0, 0x1a801462ac9cb657, 0x0, 0xac9b557d7ca8625d957263c6, 0xdc6f75fa8339a78b998ae54a, 0x28683293b6494d9f, 0x0, 0x4, 0x8d723104f77383c13458a748e9bb17bc, 0x215ddba6dd84f39e71545a137a1d5006, 0xeb2083e6ce164dba0ff18e0242af9fc3, 0x5f82a8f03983ca8ea7e9d498c778ea6, 0xb5d32b1666194cb1d71037d1b83e90ec, 0x28045af9ab0c1681c8f8e3d0d3290a4c, 0xd3fbf47a7e5b1e7f9ca5499d004ae545, 0x2ebce25e3e70f16a55485822de1b372a, 0x0, 0x6cb501b0f2f9a414f1369408, 0x6ca7b1f397dfefc2369e7f77, 0x135eb18352681cd0, 0x0, 0xbddf987b8ac91c298eae5fb6, 0x9c1baec61cca6ff8093200df, 0x1db47142bcb9084e, 0x0, 0x100000000000000001ab0231e3f1af32b, 0x1f1689eda0b7325, 0x8211c744ee497946, 0x100000000000000001401005296ba5335, 0x975b5f57e34be656906b1316, 0x4365ddb9eb3fb542f4a81fa5, 0x1e4b71ab4bb74438, 0x0, 0x661840b85c4650ab80d6abfc, 0x6bedd43f4682513b3f26e3b9, 0x1bfbc09bedc6e6a1, 0x0, 0x257275fdb7e6a5fd, 0x437a0a16546be43f, 0x100000000000000001e20dc33694e8500, 0x4c004b142b3cda1a, 0x15e4e2a08ec22ffe7c9bb956, 0x50cedfd39b0f587f62445c96, 0xbfefc101da6032d, 0x0, 0x626cafb2e14919812dc11374, 0xd8702613e26c1c5acbb0502a, 0xac9c3b014f6663, 0x0, 0x1000000000000000001067d48d1582ff7, 0x35ded9055ac1fce, 0x100000000000000009f949519947d21c6, 0x1000000000000000008e3b423119eedaf, 0xfa187fa0605efdbcf49ce5e0, 0x9bba09b74197b6f6a0c7d548, 0x15f5043298d09f8f, 0x0, 0x69bb1bf803d830390621ff4b, 0xeab9213022b9471b2f5ffb27, 0x20e0ff3bce0d13ab, 0x0, 0x6d0d75af97fefa50, 0x1000000000000000021d60bf2c3658c74, 0x1000000000000000034f51fecbdff851a, 0x1000000000000000002c54143b4f61e7f, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xda530556c75d2e27b35e716b, limb1: 0xe263c10943a7c230d41bb940, limb2: 0x1d051a29c6a2eafe, limb3: 0x0, }, y: u384 { limb0: 0x679ed4b58350eefe8c88ae2a, limb1: 0x46b4e4ba8a6a9374a0120664, limb2: 0x121c2c711b7c7f40, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BN254_10P() { let mut data = array![ 0xa, 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0x772ca79c580e121ca148fe75, 0xce2f55e418ca01b3d6d1014b, 0x2884b1dc4e84e30f, 0x0, 0x536c985db33c69f7c242e07a, 0xfc531bccffafcf1e59d91fb9, 0x2585e4f8a31664cb, 0x0, 0x57fa42444057cf0c1d62ae3c, 0x4f48d341183118d68ea41313, 0x1d2d2799db056ed1, 0x0, 0x236ca9312dad3661a37f2d6f, 0x98424c01caad7592315715d1, 0x795b9fd941b23c4, 0x0, 0xc7ab5834609a54b8993ffd79, 0xe81cd490528b814ca632aace, 0x2d9ff53d3009e6f7, 0x0, 0x163df40cafbf585ca5b2ab44, 0xb4752e4666c88dbbe23783a0, 0x1a801462ac9cb657, 0x0, 0xac9b557d7ca8625d957263c6, 0xdc6f75fa8339a78b998ae54a, 0x28683293b6494d9f, 0x0, 0x5c4f5dca0c973b7f70bfff9, 0x188c2afab11eef5d48ecda3c, 0xc2fed35d36c49f1, 0x0, 0x9d7244ea10697ca42e2e066b, 0xfe18a519c7d68770dc48dbf9, 0x149bb528db998529, 0x0, 0xffc057151b06c496e6fdd440, 0x5a01bae0c7441f08c7af1cf9, 0x274e0e02529e6d26, 0x0, 0x65ceb8977413bc9798681ecb, 0x19ffb287b45234f0c28fd1a7, 0x28dbbd2f9267be76, 0x0, 0xcfcdbfdb2056ff1a64bf1d47, 0xf26fe2dae9f693d9b4aab2e6, 0x12d66ad4802d841e, 0x0, 0xe6e34ebfa2e18dce86cadbdc, 0x7ce096238b3d4b1b8fba6a55, 0x2e0a660b1549800c, 0x0, 0xd2dd03b29d58d045656ecf33, 0xeddac3cf7a123aae2180739b, 0x215bec6e0a03c924, 0x0, 0xe5201e51828eb11589d8619f, 0xa6563c760aa3a2c9d15af235, 0x7ed0c9b2e7811fb, 0x0, 0xc33ac21c67b06a9994457b4c, 0xa9aa5573bf7a92aab85366eb, 0x1a407281e1d92e91, 0x0, 0x5a306649d971b115d71a78b1, 0xa70687a9b5132e26b2cfbb37, 0x2031920af5d6c9db, 0x0, 0x58a3cea1103f16402eb74c08, 0xdfefcd91df2f4295ec21e03a, 0x1150bcc09ac40007, 0x0, 0x57ed7d356f91abcef751889f, 0x5c668cded3599c9af5a7e5fa, 0x2ccf74197cb9bc13, 0x0, 0xa, 0xe005b86051ef1922fe43c49e149818d1, 0x1f507980eece328bff7b118e820865d6, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x154bc8ce8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x2305d1699a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x144a7edf6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x21c38572fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0x2b70369e16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x522c9d6d7ab792809e469e6ec62b2c8, 0x85940927468ff53d864a7a50b48d73f1, 0xdc5dba1d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x119d0dd09466e4726b5f5241f323ca74, 0x5306f3f5151665705b7c709acb175a5a, 0x2592a1c37c879b741d878f9f9cdf5a86, 0x0, 0x61e02fbc1bed21b7bcf46f4c, 0xa6effae60cef67c2b63c39bb, 0x2ab9fc18a6615fb, 0x0, 0x4b3724a1eaa0e523a8201b45, 0x62b04965c68922390462b7a3, 0x2198f058f64e1c43, 0x0, 0x100000000000000003ff332cfc13ea1b7, 0x1000000000000000017a384910097a0a6, 0x100000000000000008a1753b1b37a6668, 0xbf55a306145dc38, 0x698fa5385db63a1c306f31a6, 0xbf42f2af27151fb1080c4e1b, 0x1fb3b32ec12c4f, 0x0, 0xce605cbc0a47803533df71b7, 0x5e11c8521b0dd8cf8f000ffe, 0x7cb22177b9f6c9f, 0x0, 0x7661ed95c25cdb91, 0x10b644cef3d30c35, 0x100000000000000006f577c0b4a402ddc, 0x100000000000000001a7d3ea294939351, 0xa645e8eb1794e374ba58a593, 0x1efd47471ced39aacc2c4663, 0x2728f58a400a469f, 0x0, 0x9bd43dd33e0aab21c26f95c5, 0xd0e362800d54bbfbc6c4fe83, 0x2f76d907a29973cd, 0x0, 0x3d2887de3517544e, 0x7509da3e05adfa0a, 0x1000000000000000008604e989fdb09b5, 0x100000000000000002c850eaa7c78bdc0, 0x5fe0d34aad545b3c4ef06b35, 0x5bff1849e6dc24399ac732fd, 0x1e6185c8691064be, 0x0, 0xea77a9d5f1cd74b987667e33, 0xdc6d8e6d769c20731a299dbc, 0x1198dca5bf14851b, 0x0, 0x10000000000000000026898e43eca56c7, 0x30387575e4bac6c6, 0x20776c3ca242b7de, 0x100000000000000007d486e28cf4b0e10, 0x4d7402b67e248a1511a0841e, 0x9c7a8605f376bd75aeb721e4, 0x16a48728caed67a6, 0x0, 0x3269769473a96aba2d5b866a, 0x9fa613baafe4ff9c9827622, 0x83acb5fbc7fad50, 0x0, 0x1000000000000000025897c91d7b8d1f1, 0x3fd9c240adbcce3, 0x100000000000000009a89d61b8c513677, 0x100000000000000001d92935462ea59df, 0x8373942d7372f9b1f8b95c4c, 0x3d9f31bb677a013ba4cdd49f, 0x2a30441dde9012f4, 0x0, 0x7d526a9f384aa7db749876de, 0x9c9092ab98018ed02c205430, 0xcdd28eac120a42f, 0x0, 0x100000000000000002fc911da020d2f55, 0x11da5e7b097ee9cd, 0x10000000000000000ad5176da721b78b7, 0x100000000000000004102d2a01b7fbf5f, 0x7d8d69262635c81c7aef2d75, 0xa11a1dba95b5b955c00180c3, 0x76e4b2ad1aa3378, 0x0, 0xb71796d33a53c64cf156350c, 0x2a66cebb6ad6a9131e268eb8, 0xb500720ebb9a86d, 0x0, 0x35d8a8c78484d0c2, 0x37b379080cbcb6f7, 0x6b7a53f07ab793f1, 0x449bac4fffe801bc, 0x71c6ac67d5825359f2b87c45, 0xd7353e8c0a5d50546cf6c671, 0x2ae62bb2dabe475f, 0x0, 0xf0766ee822be9548105cadfb, 0x3a54b0466d91cbcacb90e0a, 0x5e9d7884973f330, 0x0, 0x10b1947ddf58a676, 0x103c836271b652be, 0x100000000000000007e3b371d8da612a2, 0x10000000000000000afdc716fd42dcebf, 0xb0bf2c61b4f4cbdead74273e, 0xb96526c6288d150336e0ee96, 0x12948db5514c09a7, 0x0, 0xf3d8437a14c19236c52edcfc, 0xffd55886b031537735e02f78, 0x2ce46f7b1c749b99, 0x0, 0x62e2e02294e2c662, 0xb7b29a6b2600fb8d, 0x12dfa3a68a5aa4b8, 0x15945e750a0443c5, 0x7f83b4b51d00fc80bb831daf, 0x25d239976a348f767993ced5, 0x2b84658d4f6cb5c8, 0x0, 0xfff31f69291319d397b31124, 0x156bf2f02ea3e4621278874b, 0x103cc7bade9316ae, 0x0, 0x1ac00f1b74998794, 0x1000000000000000024c1b4e8a2305293, 0x59d3cc6f01477796, 0xc9c2a2cd82f7e2d, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x7f5a9b9409f2cc39825a02c, limb1: 0xcae0e79fbccb0daf22e3d147, limb2: 0xe6a2d797f40f61, limb3: 0x0, }, y: u384 { limb0: 0x2a28940c5db0b16b11bcb83b, limb1: 0x909e67a632b9f3e09db0636b, limb2: 0x18643fa5fa438363, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BN254_11P() { let mut data = array![ 0xb, 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0x772ca79c580e121ca148fe75, 0xce2f55e418ca01b3d6d1014b, 0x2884b1dc4e84e30f, 0x0, 0x536c985db33c69f7c242e07a, 0xfc531bccffafcf1e59d91fb9, 0x2585e4f8a31664cb, 0x0, 0x57fa42444057cf0c1d62ae3c, 0x4f48d341183118d68ea41313, 0x1d2d2799db056ed1, 0x0, 0x236ca9312dad3661a37f2d6f, 0x98424c01caad7592315715d1, 0x795b9fd941b23c4, 0x0, 0xc7ab5834609a54b8993ffd79, 0xe81cd490528b814ca632aace, 0x2d9ff53d3009e6f7, 0x0, 0x163df40cafbf585ca5b2ab44, 0xb4752e4666c88dbbe23783a0, 0x1a801462ac9cb657, 0x0, 0xac9b557d7ca8625d957263c6, 0xdc6f75fa8339a78b998ae54a, 0x28683293b6494d9f, 0x0, 0x5c4f5dca0c973b7f70bfff9, 0x188c2afab11eef5d48ecda3c, 0xc2fed35d36c49f1, 0x0, 0x9d7244ea10697ca42e2e066b, 0xfe18a519c7d68770dc48dbf9, 0x149bb528db998529, 0x0, 0xffc057151b06c496e6fdd440, 0x5a01bae0c7441f08c7af1cf9, 0x274e0e02529e6d26, 0x0, 0x65ceb8977413bc9798681ecb, 0x19ffb287b45234f0c28fd1a7, 0x28dbbd2f9267be76, 0x0, 0xcfcdbfdb2056ff1a64bf1d47, 0xf26fe2dae9f693d9b4aab2e6, 0x12d66ad4802d841e, 0x0, 0xe6e34ebfa2e18dce86cadbdc, 0x7ce096238b3d4b1b8fba6a55, 0x2e0a660b1549800c, 0x0, 0xd2dd03b29d58d045656ecf33, 0xeddac3cf7a123aae2180739b, 0x215bec6e0a03c924, 0x0, 0xe5201e51828eb11589d8619f, 0xa6563c760aa3a2c9d15af235, 0x7ed0c9b2e7811fb, 0x0, 0xc33ac21c67b06a9994457b4c, 0xa9aa5573bf7a92aab85366eb, 0x1a407281e1d92e91, 0x0, 0x5a306649d971b115d71a78b1, 0xa70687a9b5132e26b2cfbb37, 0x2031920af5d6c9db, 0x0, 0x58a3cea1103f16402eb74c08, 0xdfefcd91df2f4295ec21e03a, 0x1150bcc09ac40007, 0x0, 0x57ed7d356f91abcef751889f, 0x5c668cded3599c9af5a7e5fa, 0x2ccf74197cb9bc13, 0x0, 0x529118e291927516dfbcba2d, 0x440af959472c61e99aac7977, 0x218bbc79509b59ce, 0x0, 0x226044f7331ccf82af7afb39, 0xc1953da25a89d084dcfaea76, 0x1042fdc36b43dac3, 0x0, 0xb, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x154bc8ce8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x2305d1699a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x144a7edf6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x21c38572fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0x2b70369e16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x522c9d6d7ab792809e469e6ec62b2c8, 0x85940927468ff53d864a7a50b48d73f1, 0xdc5dba1d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x119d0dd09466e4726b5f5241f323ca74, 0x5306f3f5151665705b7c709acb175a5a, 0x2592a1c37c879b741d878f9f9cdf5a86, 0x30bcab0ed857010255d44936a1515607, 0x1158af9fbb42e0b20426465e3e37952d, 0x5f3f563838701a14b490b6081dfc8352, 0x1b45bb86552116dd2ba4b180cb69ca38, 0x0, 0xf59b76239fad9eb74730cd7, 0xa1143b2f09cd01fbb559c486, 0x2f8d04122e8fbde7, 0x0, 0xa4777776f13805422915c296, 0x1c2749af3d7f4b652217ddae, 0xd4e2c28702c3059, 0x0, 0x7661ed95c25cdb91, 0x10b644cef3d30c35, 0x100000000000000006f577c0b4a402ddc, 0x100000000000000001a7d3ea294939351, 0x38ffcd70be2dbbae82096a26, 0xcfeb56ca9f8a8a2384543b8e, 0x73059fa2677d1e5, 0x0, 0xa84366869190b93d9d917bf, 0xc455446eda9f79d73aa0cbad, 0x2641bc3008f8cc9e, 0x0, 0x3d2887de3517544e, 0x7509da3e05adfa0a, 0x1000000000000000008604e989fdb09b5, 0x100000000000000002c850eaa7c78bdc0, 0xb4ec8b46be22584530b7b3e, 0xb6fd065dbd73e3d763c2e67c, 0x2e111c1d191de144, 0x0, 0x81464c2ae0122148a3ddad93, 0x44c76e3df069bedffabb2d13, 0x1bf97d9ca1c2f369, 0x0, 0x10000000000000000026898e43eca56c7, 0x30387575e4bac6c6, 0x20776c3ca242b7de, 0x100000000000000007d486e28cf4b0e10, 0x64b2119b459e63324fbafc05, 0x66502154bd1382ce47b7681e, 0x2ddfe6039dcfde7, 0x0, 0x529aa77c8e7a1d4ca0e64359, 0x2e01879e99328b28e513ff1c, 0x44ef12a2f42ec77, 0x0, 0x1000000000000000025897c91d7b8d1f1, 0x3fd9c240adbcce3, 0x100000000000000009a89d61b8c513677, 0x100000000000000001d92935462ea59df, 0x8d414937f9c4a302b137537b, 0xa386777f18abfefe85c31058, 0x257b5a32a23f40a3, 0x0, 0x3e95a9ff945e0553c85cfe2c, 0x4c5e5834c653623c13fec9b6, 0x1664b40825e1a905, 0x0, 0x100000000000000002fc911da020d2f55, 0x11da5e7b097ee9cd, 0x10000000000000000ad5176da721b78b7, 0x100000000000000004102d2a01b7fbf5f, 0xa66fcc2f529276b780499985, 0xf69c7da32d819f1f4f193fc1, 0x1805e698d92c3ac0, 0x0, 0xb9abf7ad6d28c58e2cc31b94, 0xf074390b2247dfaf60121eda, 0x27b2e899ed29cf1a, 0x0, 0x35d8a8c78484d0c2, 0x37b379080cbcb6f7, 0x6b7a53f07ab793f1, 0x449bac4fffe801bc, 0x5a1cd56b595531e6a3d814bf, 0x525e7a8c84a1f276259877a8, 0x7d7c34039bc644d, 0x0, 0x97125887d88507b5fe4333b9, 0xdf81a585fe7f350ed9d80836, 0x197c0dbf47481ded, 0x0, 0x10b1947ddf58a676, 0x103c836271b652be, 0x100000000000000007e3b371d8da612a2, 0x10000000000000000afdc716fd42dcebf, 0xca590b79acc3248cf7071af2, 0xf8f64dd38ddb672cfe35764, 0xa4a93bb49cda78e, 0x0, 0x7fca5043edf56dfce89121b9, 0x5a1191ede225c26c4e2fdd0e, 0x1b28478576081b5e, 0x0, 0x62e2e02294e2c662, 0xb7b29a6b2600fb8d, 0x12dfa3a68a5aa4b8, 0x15945e750a0443c5, 0x29281279f0958f532340b1e, 0x9c3f90c5b44db2da51242b88, 0x18c51e06011b8dbf, 0x0, 0x1fce97d7fe0ad6091ef99256, 0x37115682a1c2995a8f46348, 0x1fe22395832d2e61, 0x0, 0x1ac00f1b74998794, 0x1000000000000000024c1b4e8a2305293, 0x59d3cc6f01477796, 0xc9c2a2cd82f7e2d, 0x3bb0f32e0eb9448943980b5c, 0xaf7fdc854146e31d92761fa8, 0x247b7d3680ef0e4b, 0x0, 0xb46343f09e9d87fd5b9796cd, 0xd0a6f8103729c2dc3c47dbe9, 0x2eaaab3d9d415e13, 0x0, 0x1000000000000000057e1f3bedd0842d4, 0x10000000000000000255df8d996acfae5, 0x100000000000000000318c2486aecb245, 0x1000000000000000023ae98fa95aa07b8, 0x4b9261005811ccafc4725902, 0x689c7c5528fbcab2ffdd0e45, 0xee7f574a2b0c0fe, 0x0, 0x98e15c5c68cffe74a22c43c7, 0x77bc1a28c4ad8e05bfa5a214, 0xb4a65415b0eba66, 0x0, 0x1000000000000000059cfa117d9318779, 0x100000000000000008ef4027bb5693ee0, 0x3ae8a87244a109a4, 0x558c79eb7e83bb58, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x8f1d04d9dacdeb4b06745aae, limb1: 0x5c68471b1c99a97baed7f423, limb2: 0x1e8ed25080c73efd, limb3: 0x0, }, y: u384 { limb0: 0xc479efb2cb1c33352e438dbe, limb1: 0x1f9fcbf3fb537094c9816470, limb2: 0x2e15234a5a95acac, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BN254_12P() { let mut data = array![ 0xc, 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0x772ca79c580e121ca148fe75, 0xce2f55e418ca01b3d6d1014b, 0x2884b1dc4e84e30f, 0x0, 0x536c985db33c69f7c242e07a, 0xfc531bccffafcf1e59d91fb9, 0x2585e4f8a31664cb, 0x0, 0x57fa42444057cf0c1d62ae3c, 0x4f48d341183118d68ea41313, 0x1d2d2799db056ed1, 0x0, 0x236ca9312dad3661a37f2d6f, 0x98424c01caad7592315715d1, 0x795b9fd941b23c4, 0x0, 0xc7ab5834609a54b8993ffd79, 0xe81cd490528b814ca632aace, 0x2d9ff53d3009e6f7, 0x0, 0x163df40cafbf585ca5b2ab44, 0xb4752e4666c88dbbe23783a0, 0x1a801462ac9cb657, 0x0, 0xac9b557d7ca8625d957263c6, 0xdc6f75fa8339a78b998ae54a, 0x28683293b6494d9f, 0x0, 0x5c4f5dca0c973b7f70bfff9, 0x188c2afab11eef5d48ecda3c, 0xc2fed35d36c49f1, 0x0, 0x9d7244ea10697ca42e2e066b, 0xfe18a519c7d68770dc48dbf9, 0x149bb528db998529, 0x0, 0xffc057151b06c496e6fdd440, 0x5a01bae0c7441f08c7af1cf9, 0x274e0e02529e6d26, 0x0, 0x65ceb8977413bc9798681ecb, 0x19ffb287b45234f0c28fd1a7, 0x28dbbd2f9267be76, 0x0, 0xcfcdbfdb2056ff1a64bf1d47, 0xf26fe2dae9f693d9b4aab2e6, 0x12d66ad4802d841e, 0x0, 0xe6e34ebfa2e18dce86cadbdc, 0x7ce096238b3d4b1b8fba6a55, 0x2e0a660b1549800c, 0x0, 0xd2dd03b29d58d045656ecf33, 0xeddac3cf7a123aae2180739b, 0x215bec6e0a03c924, 0x0, 0xe5201e51828eb11589d8619f, 0xa6563c760aa3a2c9d15af235, 0x7ed0c9b2e7811fb, 0x0, 0xc33ac21c67b06a9994457b4c, 0xa9aa5573bf7a92aab85366eb, 0x1a407281e1d92e91, 0x0, 0x5a306649d971b115d71a78b1, 0xa70687a9b5132e26b2cfbb37, 0x2031920af5d6c9db, 0x0, 0x58a3cea1103f16402eb74c08, 0xdfefcd91df2f4295ec21e03a, 0x1150bcc09ac40007, 0x0, 0x57ed7d356f91abcef751889f, 0x5c668cded3599c9af5a7e5fa, 0x2ccf74197cb9bc13, 0x0, 0x529118e291927516dfbcba2d, 0x440af959472c61e99aac7977, 0x218bbc79509b59ce, 0x0, 0x226044f7331ccf82af7afb39, 0xc1953da25a89d084dcfaea76, 0x1042fdc36b43dac3, 0x0, 0xf1581f4d2c98dddd1045823a, 0x4c70cf5d1fe8d72e2b0eda8, 0x2dd6cf0e5b99415d, 0x0, 0xc3ebcba51d8891914acc5129, 0xa68f2b05936baf6578514dbf, 0xc4404c6b9b7453d, 0x0, 0xc, 0x3405095c8a5006c1ec188efbd080e66e, 0x2305d1699a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x144a7edf6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x21c38572fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0x2b70369e16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x522c9d6d7ab792809e469e6ec62b2c8, 0x85940927468ff53d864a7a50b48d73f1, 0xdc5dba1d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x119d0dd09466e4726b5f5241f323ca74, 0x5306f3f5151665705b7c709acb175a5a, 0x2592a1c37c879b741d878f9f9cdf5a86, 0x30bcab0ed857010255d44936a1515607, 0x1158af9fbb42e0b20426465e3e37952d, 0x5f3f563838701a14b490b6081dfc8352, 0x1b45bb86552116dd2ba4b180cb69ca38, 0xc87a746319c16a0d0febd845d0dfae43, 0xe0062d1b29a8b06daf66c5f2577bffa, 0xa25b59fd92e8e269d12ecbc40b9475b1, 0x2689f61688c132adefbfc19ee8f6cf32, 0x0, 0xa35f081ddc3964fef11b87ba, 0x7926593494405c5ed2a7c203, 0xb1fe4cb2b23209a, 0x0, 0x1c0a838ac08fb4060688ee71, 0xfce2bda26b33f861d57cd974, 0x1ac64db61ee9a873, 0x0, 0x3d2887de3517544e, 0x7509da3e05adfa0a, 0x1000000000000000008604e989fdb09b5, 0x100000000000000002c850eaa7c78bdc0, 0xa74372df079d8431e9b18880, 0x6cd132648c2b9586f34ba4e5, 0x17c5e79c26faf814, 0x0, 0x4e00fca0765a5dc39716592c, 0x62608fda1d9eb8ac692327ab, 0x2efd2837ff622761, 0x0, 0x10000000000000000026898e43eca56c7, 0x30387575e4bac6c6, 0x20776c3ca242b7de, 0x100000000000000007d486e28cf4b0e10, 0x7948eabf056257f90152cce1, 0xfbefb6402b0f561fc2895f89, 0x7f3f0f1b174e884, 0x0, 0x3c76805faa60392fe4b110d3, 0xba4b2232318a58138b8716b0, 0x31586d69a9e9d5f, 0x0, 0x1000000000000000025897c91d7b8d1f1, 0x3fd9c240adbcce3, 0x100000000000000009a89d61b8c513677, 0x100000000000000001d92935462ea59df, 0x68e1b7bda4cc53d96d5d21fc, 0x224cbbd937d29f5c8f33af33, 0x1eecbf09aea2ba62, 0x0, 0x9ba28499df4dc86dba4834c9, 0x593878cb3634fbf4ad666d2f, 0x8d61bffa7ed1cf4, 0x0, 0x100000000000000002fc911da020d2f55, 0x11da5e7b097ee9cd, 0x10000000000000000ad5176da721b78b7, 0x100000000000000004102d2a01b7fbf5f, 0x6404129b95705ec3758c3c32, 0xfee2f803c30b9c60ec9058c9, 0x1c4acdc80de3ff15, 0x0, 0xeef9c5c2c7dd04d9ef28627, 0x85f67ca8fb3693eb3d49e733, 0x23179b3241d8554e, 0x0, 0x35d8a8c78484d0c2, 0x37b379080cbcb6f7, 0x6b7a53f07ab793f1, 0x449bac4fffe801bc, 0x127b307b02001ee53147974e, 0x19d13f1496e714d0e81eb452, 0x2d6284b456ce4016, 0x0, 0xddba124fb48f7a6a17ffd3e9, 0xf09236f948f55c12f051316d, 0x1d89cad2e98d792b, 0x0, 0x10b1947ddf58a676, 0x103c836271b652be, 0x100000000000000007e3b371d8da612a2, 0x10000000000000000afdc716fd42dcebf, 0x9933f565ff29445c4095b6bc, 0x657f8c9411abc5bbcc136d8a, 0x73e7ef94ba9d52e, 0x0, 0x6c40ee001e861af8b54083f9, 0xcd5e9710c4a04d282ce7349a, 0x690a0b30371b326, 0x0, 0x62e2e02294e2c662, 0xb7b29a6b2600fb8d, 0x12dfa3a68a5aa4b8, 0x15945e750a0443c5, 0xe73c8b0ec70203c2e8989117, 0x7ddfadad5f08ce1aa07c411c, 0x13613f779a31d6ff, 0x0, 0x638429e6306a39c9e31a3603, 0x327c5d8bef475c0133cb5d8b, 0x27096fced1ae8ce9, 0x0, 0x1ac00f1b74998794, 0x1000000000000000024c1b4e8a2305293, 0x59d3cc6f01477796, 0xc9c2a2cd82f7e2d, 0xdcaf34a4eef803781d3022, 0xbc09ae870f85a6cf01c65e44, 0x385ae0f48077e7e, 0x0, 0x61a1baa7bab47c085609a548, 0x914206f8e0e04938aee16726, 0x389734c913660f7, 0x0, 0x1000000000000000057e1f3bedd0842d4, 0x10000000000000000255df8d996acfae5, 0x100000000000000000318c2486aecb245, 0x1000000000000000023ae98fa95aa07b8, 0x88adbf9219029597e553bb04, 0xeb6747eb6284e8b022461ec2, 0x14a572f4f58c464f, 0x0, 0xeb6bac7a6c66241c45996655, 0xbd605734ae6e9a1ddcf2eb6e, 0x7fbe6469eaad0bb, 0x0, 0x1000000000000000059cfa117d9318779, 0x100000000000000008ef4027bb5693ee0, 0x3ae8a87244a109a4, 0x558c79eb7e83bb58, 0xd37309fe22d9e35f307c3a6b, 0xe5de80a909551c749fca4879, 0x21fd1084d81d15e7, 0x0, 0x8a05d9d6713308396ada192b, 0x5126361876e6ce50233c747c, 0x21db15f93ac460fe, 0x0, 0x9af91b3e36abc612, 0x86643c813ecda430, 0x100000000000000000e467a16915fd7e5, 0x100000000000000004a115b9161854fec, 0xe936353409de55cec6156fe6, 0xcb2d34e3b109e4ab4f9bfac3, 0x8435d0668aada26, 0x0, 0x6d5907f5ae10fced2d3d609d, 0x4720c6ca15b721ac824fd1dc, 0x28fd8e028bbd4327, 0x0, 0x100000000000000000615f3f7b8d448b9, 0x100000000000000007f9651eee6b31ff4, 0x1000000000000000016a63b2f0da9904c, 0x1000000000000000047f4ef94b6a2cc82, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x744865055917ca125348c4f8, limb1: 0x5c545244519dd218c72f1665, limb2: 0xcc6f1868dc806a6, limb3: 0x0, }, y: u384 { limb0: 0xcbb128d3e724151be03bef12, limb1: 0x3d9dca95a86b6ea20b40f368, limb2: 0x1d2cfc3fd3c3ff7f, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BLS12_381_1P() { let mut data = array![ 0x1, 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x3d77d61326ef5a9a5a681757, 0xd3070afd4f0e121de7fcee60, 0xdf9ef4088763fe611fb85858, 0x11a612bdd0bc09562856a70, 0x1, 0xb4862b21fb97d43588561712e8e5216a, 0x12cfa194e6f4590b9a164106cf6a659e, 0x1, 0xb603ffc901ec7f3e42216ae4, 0x269adaf11286bf338b9dacb1, 0xab33b097e05378c0867894f, 0xbfd8ef26d4610b8e77f5c28, 0x9afe78c2bb0f305eccbffb90, 0xc8b06f9aaf49eda1f9fd6cfd, 0xc422cd476b9611aef3a1ee3, 0x1201e1e9a2b0867eb9da1725, 0x1000000000000000062a39ac9655a0af5, 0x10000000000000000b59da527feb9e759, 0x885278dc00a1125a, 0x2fe0754b9fadfe7b, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xb603ffc901ec7f3e42216ae4, limb1: 0x269adaf11286bf338b9dacb1, limb2: 0xab33b097e05378c0867894f, limb3: 0xbfd8ef26d4610b8e77f5c28, }, y: u384 { limb0: 0x9afe78c2bb0f305eccbffb90, limb1: 0xc8b06f9aaf49eda1f9fd6cfd, limb2: 0xc422cd476b9611aef3a1ee3, limb3: 0x1201e1e9a2b0867eb9da1725, }, }, ); } #[test] #[ignore] fn test_msm_BLS12_381_2P() { let mut data = array![ 0x2, 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x3d77d61326ef5a9a5a681757, 0xd3070afd4f0e121de7fcee60, 0xdf9ef4088763fe611fb85858, 0x11a612bdd0bc09562856a70, 0xde4f62a6588c9401ffefbd3, 0x9bb5f797ac6d3395b71420b5, 0xdc39e973aaf31de52219df08, 0x105dcc4dce3960447d21d3c1, 0xaefd0d854043fd325dd3c34f, 0x9b63c98d9a7845c52e1e2b0f, 0x9db0be660d847ccc58358f3f, 0x17cb6c41f0c4e1a7394ab62a, 0x2, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0x2a43e70faf19922ad9b8a714e61a441c, 0x5a92118719c78df48f4ff31e78de5857, 0x51f964df9c6316b950f244556f25e2a2, 0x1, 0x767bdb83da4925db077ac23d, 0x51fcd455bd59b97a1e4a2d02, 0xf9650cba7ed29c8f01577a4d, 0x13e6deb52a57b03867f2c663, 0x2170a02826a65df5fff9fc69, 0xcdef32f5872257c0f74a4983, 0x275718e62abbba48d224fc01, 0x16e4935008c1ecbfc238a44c, 0x97ac96128760678, 0x1b8269c5da3a7aa, 0x946f8bb609f9ba7d, 0x4e77077ba28bdfd6, 0xe6c4136fba2947157839fc3f, 0x58df45b89ea1d6fd003f377d, 0x428ff9cfd30586deea516488, 0xc0c17be01b5ec83544d88ff, 0xfdf2fbfb66f355ed990a534f, 0x98f6b2b220c2c0e179e4d145, 0xe2766e3b994a5f31518b1b4, 0xb1861e2a35c8eceb1eb84bf, 0x3827704126429022, 0x59c3b34a3b390fcf, 0x1000000000000000076a605fca076460a, 0x2f4183d416809c9a, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x32321a942ef961780ca91c06, limb1: 0x57e5605fbba104f908e63665, limb2: 0x843c0bbd70b5a837b690bd95, limb3: 0xbe7f58485672327a5c447c1, }, y: u384 { limb0: 0x2150b2afd97c7793d20d0ecc, limb1: 0x4f6a0ae7eaf68e727f2fcb5d, limb2: 0x96407ddecb1fe770faf07c8c, limb3: 0x4c4183b2e457821188d59e7, }, }, ); } #[test] #[ignore] fn test_msm_BLS12_381_3P() { let mut data = array![ 0x3, 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x3d77d61326ef5a9a5a681757, 0xd3070afd4f0e121de7fcee60, 0xdf9ef4088763fe611fb85858, 0x11a612bdd0bc09562856a70, 0xde4f62a6588c9401ffefbd3, 0x9bb5f797ac6d3395b71420b5, 0xdc39e973aaf31de52219df08, 0x105dcc4dce3960447d21d3c1, 0xaefd0d854043fd325dd3c34f, 0x9b63c98d9a7845c52e1e2b0f, 0x9db0be660d847ccc58358f3f, 0x17cb6c41f0c4e1a7394ab62a, 0xcf86158ab69213388e721bb7, 0x5f7812269d790797cad9aa15, 0xb1c3622a0177001d9ed8e25f, 0x115cf429f459884785c6ba46, 0x1e81341e2f3f988ff115dda3, 0xad22946489db6ee4954fa5e1, 0x83bed94412e19d92b73cc763, 0x2074c7bceff87d0d41edba1, 0x3, 0x5a92118719c78df48f4ff31e78de5857, 0x51f964df9c6316b950f244556f25e2a2, 0x8d723104f77383c13458a748e9bb17bc, 0x42bbb74ddd84f39e71545a137a1d5006, 0xeb2083e6ce164dba0ff18e0242af9fc3, 0xbf0551e03983ca8ea7e9d498c778ea6, 0x1, 0xa212d9c99e9c04c4d5c9413e, 0x396a875482462ca6c1340431, 0xc2162538b674feeff3abfd69, 0x753e02471aea6c84aaa5ffc, 0x929a8f9dbb886a14600841b2, 0xd2549b8930caba7ed2b7f6f0, 0x35911c87fe8cfc373e803e14, 0x180e16c3ae7f7949857d4ca0, 0x3827704126429022, 0x59c3b34a3b390fcf, 0x1000000000000000076a605fca076460a, 0x2f4183d416809c9a, 0x201564ee2f51efc0dd066bf4, 0x631f5532a8b44cccd0c4ae3a, 0x56a5d8f1e24804c51d3baba8, 0x155dcc0adb758a4caede5e39, 0x4e0b78c88baeacb640f333c4, 0x2a16352f6da4000344ea35b3, 0xe58d1f7ed72ebc3a1aced4bb, 0x7b09c3c38b9665bb6dcd1a3, 0x89ec0bb47cfdf6b1, 0xb71533d7b1764557, 0x340a863c788b8bd1, 0x100000000000000001b03838bf180c6bb, 0x8070e05e9145d1c520b0bc9f, 0xd2505d00fcfa7f814e629e1f, 0x789f47493e01360b240d31be, 0xd4d252b4e71c49b728891b0, 0x32fd0164a7284bf6631f2131, 0xbf29e9b9d14edb8796f7c003, 0x73032a27b08ccde5970c792a, 0x14128a5b1473f5285668a863, 0x29d77abed65ff201, 0x4ea390aeeae13c8a, 0x426754eb9138bd09, 0x100000000000000007ebb92a3d2545c26, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x21b85c07d97d8ad7ed64cf5c, limb1: 0xc68ab576217c87f6afe7e8f6, limb2: 0x8aecb918175dcc693f68b02c, limb3: 0x16bdc982d01b9f8d1782060e, }, y: u384 { limb0: 0x11cf0b8dceb54a416ec13f47, limb1: 0x81a05b3acc5b76a765127289, limb2: 0xcdbd38ba08efd726fae10661, limb3: 0x9747640d51b315635b0059a, }, }, ); } #[test] #[ignore] fn test_msm_BLS12_381_4P() { let mut data = array![ 0x4, 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x3d77d61326ef5a9a5a681757, 0xd3070afd4f0e121de7fcee60, 0xdf9ef4088763fe611fb85858, 0x11a612bdd0bc09562856a70, 0xde4f62a6588c9401ffefbd3, 0x9bb5f797ac6d3395b71420b5, 0xdc39e973aaf31de52219df08, 0x105dcc4dce3960447d21d3c1, 0xaefd0d854043fd325dd3c34f, 0x9b63c98d9a7845c52e1e2b0f, 0x9db0be660d847ccc58358f3f, 0x17cb6c41f0c4e1a7394ab62a, 0xcf86158ab69213388e721bb7, 0x5f7812269d790797cad9aa15, 0xb1c3622a0177001d9ed8e25f, 0x115cf429f459884785c6ba46, 0x1e81341e2f3f988ff115dda3, 0xad22946489db6ee4954fa5e1, 0x83bed94412e19d92b73cc763, 0x2074c7bceff87d0d41edba1, 0xe2955c55da59eba4b7b57d3d, 0x1e6629b0431bce67cf28c22, 0x1c35b7efd5b67f87221b8bfc, 0x3e53df9e3488a9e42acd87e, 0x2e089afa726154d40dd12102, 0x5391613ecf49db2bcf1cad86, 0x84a2abb2de6b3a6e09026a50, 0x19557a3a3c1d62a205d5dc87, 0x4, 0x8d723104f77383c13458a748e9bb17bc, 0x42bbb74ddd84f39e71545a137a1d5006, 0xeb2083e6ce164dba0ff18e0242af9fc3, 0xbf0551e03983ca8ea7e9d498c778ea6, 0xb5d32b1666194cb1d71037d1b83e90ec, 0x5008b5f2ab0c1681c8f8e3d0d3290a4c, 0xd3fbf47a7e5b1e7f9ca5499d004ae545, 0x5d79c4bd3e70f16a55485822de1b372a, 0x1, 0x44bb6f75a004bca814756b12, 0x1818b158d2190e6e0fc9e550, 0x2c30743bfb89fd6efbecc08b, 0x37837c70d528dd05cbf07e7, 0x492cb4f7c261d2d0b24d8b02, 0x230240dd9634dc222a23cb1a, 0xe3eec79d41d215665e8c84cb, 0xeff88e6c2c0702d1d489a73, 0x89ec0bb47cfdf6b1, 0xb71533d7b1764557, 0x340a863c788b8bd1, 0x100000000000000001b03838bf180c6bb, 0xf88a71d0107733babbd62a8a, 0x5c8822f79ed71c8bbfa7ff17, 0x7a8298e09fc3cb760af959c9, 0x71970cd5e563018d29192bc, 0x6d859bf8574d99e4aa0d6235, 0x743b1ed749ce3385e004fd1e, 0x40b348aadf32289fd4ba39a2, 0x117e2219a46e398da3a4bcfb, 0x29d77abed65ff201, 0x4ea390aeeae13c8a, 0x426754eb9138bd09, 0x100000000000000007ebb92a3d2545c26, 0x62a1dd00d0d70c14a6483357, 0xd3311030294d0ecbd126a83c, 0x9ab588fa5774077b42bfaf84, 0x2ca8d2c572fb8a41c46768, 0x9078c212d37a3119918e97e2, 0x7bfd90eaf25c921f82205790, 0x87a6d075aaafcb12c6615ced, 0x14c4cdf3aa2c27b1ab23e540, 0x3a52f2488abaf3cf, 0x100000000000000002db717c471a1fc21, 0x10000000000000000644c4a2d385dbb8f, 0x10000000000000000a04a3389734226f8, 0xae129d9a602a42cc514ab5bd, 0x6b8ff0a7bab2c6cf01ab2b0d, 0xe54a1c91c8cebd80422d7472, 0x18f20ed943760167480b399c, 0x3c855ffac29166b79418290c, 0x16673746c28add51dbb908b6, 0x6bba7b68853a2592c3ab118d, 0x56b1a0d430dbe3db167379b, 0x100000000000000004bed5581e0e7a253, 0x100000000000000009c34387abab6c0fe, 0xb72bffe782e92797, 0x3a8e5d970236b4f1, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x7406fee5d57362d0bd20a5fe, limb1: 0x9c148946ef3f3c63933238ab, limb2: 0x29449d34c8a2d4f2985f3c36, limb3: 0xa598551ba8198a566f2d4be, }, y: u384 { limb0: 0x79e483b729f05957e7c73f33, limb1: 0x3a0046ded0b81194df4ad0d5, limb2: 0x6bb49380867caf051586303a, limb3: 0xc750343cc7a561d93f3d0c0, }, }, ); } #[test] #[ignore] fn test_msm_BLS12_381_10P() { let mut data = array![ 0xa, 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x3d77d61326ef5a9a5a681757, 0xd3070afd4f0e121de7fcee60, 0xdf9ef4088763fe611fb85858, 0x11a612bdd0bc09562856a70, 0xde4f62a6588c9401ffefbd3, 0x9bb5f797ac6d3395b71420b5, 0xdc39e973aaf31de52219df08, 0x105dcc4dce3960447d21d3c1, 0xaefd0d854043fd325dd3c34f, 0x9b63c98d9a7845c52e1e2b0f, 0x9db0be660d847ccc58358f3f, 0x17cb6c41f0c4e1a7394ab62a, 0xcf86158ab69213388e721bb7, 0x5f7812269d790797cad9aa15, 0xb1c3622a0177001d9ed8e25f, 0x115cf429f459884785c6ba46, 0x1e81341e2f3f988ff115dda3, 0xad22946489db6ee4954fa5e1, 0x83bed94412e19d92b73cc763, 0x2074c7bceff87d0d41edba1, 0xe2955c55da59eba4b7b57d3d, 0x1e6629b0431bce67cf28c22, 0x1c35b7efd5b67f87221b8bfc, 0x3e53df9e3488a9e42acd87e, 0x2e089afa726154d40dd12102, 0x5391613ecf49db2bcf1cad86, 0x84a2abb2de6b3a6e09026a50, 0x19557a3a3c1d62a205d5dc87, 0x490bf40774926e8b279947c, 0xeabab6aef9e9d2a4f64f4e7d, 0x3e309fe1b1c8247abab20d7e, 0x79c527862917f69ac58fcc4, 0xacb18f2da2b425c2ff50dafd, 0x7623850d87e279a8a30f31ff, 0x777564c7291d95fa80203ade, 0x1764ce0e7fb626109b63789b, 0x42f2f3f4f6b9d2c2b73a361f, 0xcd78c070c184c38b1e5716aa, 0x72cbc24cd90da89e0e3cefe4, 0x19485e1c46d0dce75f8b192b, 0xb56b3539074b3c47b3f504d9, 0x2c229530bddedd8851b03dcc, 0xc93eef8474c4e18d6378e7f0, 0x173d36f17a3c9ae77a2acc25, 0x5fbf29cf20556a11621a6639, 0xdfda5b7dbf0b226822094787, 0x4a3b059e521b4b0445df96d5, 0x333988c2c09f5af061cdfb, 0x13d3570be6d27d1d588b22fc, 0x20c763e58d4df3e4990cdae9, 0x2c3301367f400c31f4bded26, 0x16a6c25d133fba74b4c55972, 0xcb24d12438557639f52df5fd, 0x4a6a46feebe8a88a8062bd0e, 0x65f04211af4b168b1e25787d, 0x17935d6f4fa575744ca46f75, 0x644f324be8a5c152625a5b8a, 0x501e52e8c5707d7a3a77ee18, 0x9636c463c14c5b85c2e6d3b1, 0x1939b6f297f7b5b7fd0ac458, 0xde1d8e2670532ec5bba60ade, 0x1154f5064f7dd38656f7f82b, 0xc9bec68372b7d07dcf66270c, 0x315ced00b3153219bbd430, 0xc48b3bc110e208d827b13f4d, 0x87d82592699bca3dbf847c2b, 0xff04f0f2c8be12365aa73443, 0x1739c8c450ac994a5326c809, 0x8904b74d5d114b5416df0ed6, 0x479ee13e49cde067742c2655, 0x45b9359bfa338dd432ca9ff1, 0x12bf6460e7a42942be6c16a0, 0x3a8b37aacb2f620bc41c6109, 0x91f68edf90b5947273b0aadf, 0x265d48695a73800b7404124c, 0x141e3d99b3ab683bdb0ce70f, 0xa, 0xe005b86051ef1922fe43c49e149818d1, 0x3ea0f301eece328bff7b118e820865d6, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x2a97919d8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x460ba2d39a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x2894fdbe6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x43870ae2fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0x56e06d3d16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0xa4593acd7ab792809e469e6ec62b2c8, 0xd450fe4aec4f217bb306d1a8e5eeac76, 0x6b3f2afe642bfa42aef9c00b8a64c1b9, 0x85940927468ff53d864a7a50b48d73f1, 0x1b8bb742d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x233a1ba09466e4726b5f5241f323ca74, 0x1, 0x4fec1bc3c60e1e8698dead7e, 0x5d71a7fdab6311661050245a, 0xe05d09f0bc4a8f934ca0be3, 0x3e410c8ef8929e597fc5e16, 0x2cb369f5527d80a3f85dfe16, 0x23136c25c83e8f7bbec1cf73, 0xff512e4a07edaf5b49d3d728, 0x12d5dbede4328cb09da72b84, 0x100000000000000004292942fff5c5c73, 0x100000000000000006f8e81274b1b80e7, 0x3b3d1e96d895314d, 0x1000000000000000084bf5385aab534ac, 0x60a1a3ab0c7177eab76fff39, 0xc0be22d12b053ffe9ca14f59, 0x181af3ad4d7e2a3d70d0d390, 0xa7fcec07bd4cbf86517c4ab, 0x225dafa45afbf8fdc096ca46, 0x83fe86ca3674bc4f0fa1be03, 0x1419a6d50b39b38488129411, 0x673aa0dca89d43027ecf344, 0x10000000000000000cea55d261de27134, 0x4945ad0e7a3ff67, 0x2fc459c3edadc3a2, 0x10000000000000000061e3b8d4a2b7b49, 0x17f488f0ade4733d6ef16e5, 0x2345447ae416edecd39537f0, 0xb6b696b8639e7cf9895c5cc4, 0x9e0e0023c554f7dcea9988f, 0x9d39eb85ff093ed952b7b83e, 0xe97ebfec0868fb25fc01f0d2, 0x10ad24a237318d2b9652aa09, 0x13254cc65058dd9358b96239, 0xab1e43002be79daa, 0x4647693a000da8bb, 0x100000000000000007d866035ad43d2cd, 0x100000000000000008ac469986dc04381, 0x1c0101fbd27c0a2fce7dea00, 0xa1754f662e645363a3d7555e, 0xf500d7bbb858b228f7566d60, 0x123c9acdbe8c6cd24ca87a2d, 0x49abf7cca1720df09b8013e8, 0x58d4d7df624dc9492bdd5f14, 0xd885e40ee88b16151fc21f83, 0x18bc3ac505215228c26ed360, 0x100000000000000008f832425d3465a7d, 0x100000000000000007a1648de1b75e170, 0x10000000000000000782f24b2b6f99caa, 0x10000000000000000a46207414514e0b7, 0xb680e2ee3456fa57129b0045, 0xfc71104d4fa38e9455aa5cd8, 0x9d5f6b4a7451e6cd2c4f7c7e, 0xfefc054f2225661c3586c55, 0xbabd33086acd589bbb7df2d8, 0xea6d9ef8b309c10adde6756d, 0x717bd330e5157289ed69b9ba, 0xb919c30025518a30b26a33b, 0x10000000000000000ae0ed118d80201db, 0x100000000000000007dad72d6582f2e8a, 0x3e9b7c2f776f9ad1, 0x33c103bec8d8dd99, 0xa05e97f79f1da1a74d36f934, 0x82cf8025c3bdc887ecdaff73, 0x24a11bec2b7777732ea49307, 0x156f141bcbaef8188730e3d3, 0x5630c9208c0eb9c6338de7e, 0x1b5aaef757b58eb36a731689, 0x3fa1031d312ad2881206f852, 0x12b8899d4af7a8c34e2a9d46, 0x10000000000000000022bf071f1160083, 0x1000000000000000057d827f50ce811a1, 0x21e30fccd874a3e1, 0x1000000000000000081bff70857d935ca, 0x7053f48d9623a0772224604c, 0xb11da71ba9823dc5c04dd4dd, 0x184deafecb58abd1e56400b1, 0x157346717db5b34fd548cd32, 0xd9cadf87641980d152d6537d, 0xee861d7d0a13c67b7217634, 0x7826079f0eee56e4e5c062fc, 0x191da207fdd5403838e0728e, 0x10000000000000000ed6a42a626d0b5c2, 0x100000000000000008251f67200c0fd29, 0x3753a6d93f053e65, 0x39f069691aa27848, 0xc378beb21e5b84edd744923f, 0x9b228eaa8c0baec7dadb455a, 0x186026cdb53d6b03ac71faf9, 0x30663d24fb4b20705ac56ce, 0x8b26b689e5b52df6b3b59981, 0x49a372daaf7ae6845981a370, 0x191c1c0b1921fa467089cad9, 0x11bd657f852a9cc7b38ac45, 0xabf8f0133c1f072e, 0x161489d2a4ae8501, 0x10000000000000000a422466a58575055, 0x100000000000000010d01a10c0ddec2b7, 0xc17c00c80be4888b417fcab7, 0x237837a17d7f044145e07dd0, 0xdd4c4c3ee185dede22941eee, 0x10bcc285e222e3edf5a3bb26, 0x3e1c8591502f1fa558f9f37f, 0xd279a8b40c7d82a067c1a9e0, 0x8ebeb1d2a390ea6cc8282d68, 0x1859d1c72735f018ea45dea3, 0x1000000000000000005f68a6ba1476c4c, 0x1badaadb9ef013b5, 0x100000000000000009d7e4713e105078d, 0x10000000000000000704d4f90616d782f, 0xd7734cfb87bdee6ddbecba22, 0xb5be04f83be44ace5a664a82, 0xa924b5316afad687fc174c75, 0x136a13276f643b22873d7490, 0xfa56e794ab2e49db1a65d154, 0xa8c32e8861e673612ae9f3a2, 0xd12e4badeb492211212793, 0x5fe3e9844a34155419eb432, 0x100000000000000000d9e2865dd56177d, 0x1000000000000000027d8ecbd5198c228, 0x1000000000000000022c5f7e952ac9b2b, 0x10000000000000000a2e9b304305db746, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x85cd6b5af7b7cca272f94a3, limb1: 0x55be389217b4b81baee9530f, limb2: 0x1b5a70fff8b31b3cfc4b68de, limb3: 0x101c3dcc7f2a1be1afe50e39, }, y: u384 { limb0: 0xdc944be6d0d78b23304e3193, limb1: 0xe1cdd664f4036ec4bd90db8, limb2: 0xf9e55c43073f3a6163464638, limb3: 0x14396fc17f6c6bc8f76ea501, }, }, ); } #[test] #[ignore] fn test_msm_BLS12_381_11P() { let mut data = array![ 0xb, 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x3d77d61326ef5a9a5a681757, 0xd3070afd4f0e121de7fcee60, 0xdf9ef4088763fe611fb85858, 0x11a612bdd0bc09562856a70, 0xde4f62a6588c9401ffefbd3, 0x9bb5f797ac6d3395b71420b5, 0xdc39e973aaf31de52219df08, 0x105dcc4dce3960447d21d3c1, 0xaefd0d854043fd325dd3c34f, 0x9b63c98d9a7845c52e1e2b0f, 0x9db0be660d847ccc58358f3f, 0x17cb6c41f0c4e1a7394ab62a, 0xcf86158ab69213388e721bb7, 0x5f7812269d790797cad9aa15, 0xb1c3622a0177001d9ed8e25f, 0x115cf429f459884785c6ba46, 0x1e81341e2f3f988ff115dda3, 0xad22946489db6ee4954fa5e1, 0x83bed94412e19d92b73cc763, 0x2074c7bceff87d0d41edba1, 0xe2955c55da59eba4b7b57d3d, 0x1e6629b0431bce67cf28c22, 0x1c35b7efd5b67f87221b8bfc, 0x3e53df9e3488a9e42acd87e, 0x2e089afa726154d40dd12102, 0x5391613ecf49db2bcf1cad86, 0x84a2abb2de6b3a6e09026a50, 0x19557a3a3c1d62a205d5dc87, 0x490bf40774926e8b279947c, 0xeabab6aef9e9d2a4f64f4e7d, 0x3e309fe1b1c8247abab20d7e, 0x79c527862917f69ac58fcc4, 0xacb18f2da2b425c2ff50dafd, 0x7623850d87e279a8a30f31ff, 0x777564c7291d95fa80203ade, 0x1764ce0e7fb626109b63789b, 0x42f2f3f4f6b9d2c2b73a361f, 0xcd78c070c184c38b1e5716aa, 0x72cbc24cd90da89e0e3cefe4, 0x19485e1c46d0dce75f8b192b, 0xb56b3539074b3c47b3f504d9, 0x2c229530bddedd8851b03dcc, 0xc93eef8474c4e18d6378e7f0, 0x173d36f17a3c9ae77a2acc25, 0x5fbf29cf20556a11621a6639, 0xdfda5b7dbf0b226822094787, 0x4a3b059e521b4b0445df96d5, 0x333988c2c09f5af061cdfb, 0x13d3570be6d27d1d588b22fc, 0x20c763e58d4df3e4990cdae9, 0x2c3301367f400c31f4bded26, 0x16a6c25d133fba74b4c55972, 0xcb24d12438557639f52df5fd, 0x4a6a46feebe8a88a8062bd0e, 0x65f04211af4b168b1e25787d, 0x17935d6f4fa575744ca46f75, 0x644f324be8a5c152625a5b8a, 0x501e52e8c5707d7a3a77ee18, 0x9636c463c14c5b85c2e6d3b1, 0x1939b6f297f7b5b7fd0ac458, 0xde1d8e2670532ec5bba60ade, 0x1154f5064f7dd38656f7f82b, 0xc9bec68372b7d07dcf66270c, 0x315ced00b3153219bbd430, 0xc48b3bc110e208d827b13f4d, 0x87d82592699bca3dbf847c2b, 0xff04f0f2c8be12365aa73443, 0x1739c8c450ac994a5326c809, 0x8904b74d5d114b5416df0ed6, 0x479ee13e49cde067742c2655, 0x45b9359bfa338dd432ca9ff1, 0x12bf6460e7a42942be6c16a0, 0x3a8b37aacb2f620bc41c6109, 0x91f68edf90b5947273b0aadf, 0x265d48695a73800b7404124c, 0x141e3d99b3ab683bdb0ce70f, 0x6d6db022a8549ee86374b69a, 0x3e98f7258170733507d8709b, 0x10b4337a56d4cd17ab2fe1d5, 0x11366a6fecb124757076f4b6, 0x77b25b600d3baa1a2f54f826, 0x924c3c1a699e9b27b3612246, 0x6a253cae0097b1955d4f0cfd, 0xd2bd6591140d2faabafefac, 0xb, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x2a97919d8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x460ba2d39a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x2894fdbe6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x43870ae2fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0x56e06d3d16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0xa4593acd7ab792809e469e6ec62b2c8, 0xd450fe4aec4f217bb306d1a8e5eeac76, 0x6b3f2afe642bfa42aef9c00b8a64c1b9, 0x85940927468ff53d864a7a50b48d73f1, 0x1b8bb742d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x233a1ba09466e4726b5f5241f323ca74, 0x5306f3f5151665705b7c709acb175a5a, 0x4b2543867c879b741d878f9f9cdf5a86, 0x30bcab0ed857010255d44936a1515607, 0x22b15f3fbb42e0b20426465e3e37952d, 0x1, 0x19eea9b02b0269a828e87bbc, 0x67bd46455c26c6ca390ae0ba, 0xa9dc83672893066741fa95e1, 0x14a2ab6a3bc68452c5582829, 0x2a53345d1b34e4641cc38c3d, 0xc82502e6ee206ff835917eb7, 0xb6c87f3b28288a29296a7059, 0x1361292ebd69db3c0b2f9180, 0x10000000000000000cea55d261de27134, 0x4945ad0e7a3ff67, 0x2fc459c3edadc3a2, 0x10000000000000000061e3b8d4a2b7b49, 0xcca46ee7e7d728cf4687644, 0x3ade741f416cf509a8d72a4c, 0x8e7572df6c768d460cb201d1, 0x1298c2031c383f68f18d47, 0xa554139550742d2c1c2dbfcc, 0x179852f9e707ce5dfc6c509, 0x307f6d2c8b88fb29906b9668, 0xce27f25b13c90cd75581cd7, 0xab1e43002be79daa, 0x4647693a000da8bb, 0x100000000000000007d866035ad43d2cd, 0x100000000000000008ac469986dc04381, 0x77117911414f1a8ba740937f, 0xfa4b42c9e27b825abb6e1932, 0x1957cbae8168c2a9ea426a5a, 0x10cae1885e14624756a7eba6, 0xa3cd665fc42827532aaa2ea, 0x8af3e1bc51da81d7990f227e, 0x788c055adcefcc69a3a5d382, 0x1003592246083ca043286287, 0x100000000000000008f832425d3465a7d, 0x100000000000000007a1648de1b75e170, 0x10000000000000000782f24b2b6f99caa, 0x10000000000000000a46207414514e0b7, 0xbe9bca3bf5eec6cc9844c551, 0xe0d5a94e288ef5adcba43ed7, 0xe9e85c194dff7c219c6d8ca3, 0x1254bb7494352e470a3b0a40, 0x747bed6d938a5434bfd865e3, 0x3d5af5929e771b0b1a09959b, 0x78e81d642b9ecee32d559eb, 0x14cc935a8ea60d9c8231390c, 0x10000000000000000ae0ed118d80201db, 0x100000000000000007dad72d6582f2e8a, 0x3e9b7c2f776f9ad1, 0x33c103bec8d8dd99, 0xac99a8072958d59134f663b9, 0xb30bb7a088fd8458abe354a5, 0x1d1dacff16391acd20b4eaea, 0x7b73f92d3f09b43016e07b3, 0xf6ae86523c0174ca5b1b0fc8, 0x73380bbaaba7c2034a6c5c63, 0x74bb326851d9f4a7c3e2c22, 0xbadb8e20341bc68ee0d62fb, 0x10000000000000000022bf071f1160083, 0x1000000000000000057d827f50ce811a1, 0x21e30fccd874a3e1, 0x1000000000000000081bff70857d935ca, 0xd1db88e35a5fd4b22e8a7242, 0xcf4280e99dabae608abafd04, 0x46af27b56584cc2c598e71ed, 0x14e9eb8a645712d6102c0a9e, 0xd7eb2bc34e0a3094c44bacf3, 0xd0c67ab4ba8aaa1ddd0d6652, 0xb581c278d1737880614fa64d, 0x99a3a36cbc29026cdb989a3, 0x10000000000000000ed6a42a626d0b5c2, 0x100000000000000008251f67200c0fd29, 0x3753a6d93f053e65, 0x39f069691aa27848, 0xb96cfe43c16c753450704e86, 0x2a10f11f55f81a94dd748595, 0x974380349665cfafcdae9c95, 0x866a4b640813c8ed4602e74, 0xda29c08c0e39dbfd34e194b7, 0x76eda22634152a733d1bb476, 0x3ccf70b893cad74b3949dcab, 0x11ae5fe6d5c14a6d2752cef6, 0xabf8f0133c1f072e, 0x161489d2a4ae8501, 0x10000000000000000a422466a58575055, 0x100000000000000010d01a10c0ddec2b7, 0xdc59ecc95ada6a3cddec47f, 0xbd9358cf424cddcab08790fa, 0x50659409e42159c50d14ced0, 0x8306fb79b2c290cc5c1fd38, 0x4ca0ea4e89d982c06289a0c4, 0x37e68136c605119f244d8150, 0xab4fee3c3a973c68f7f97975, 0xf51d92010bec98bd50ac787, 0x1000000000000000005f68a6ba1476c4c, 0x1badaadb9ef013b5, 0x100000000000000009d7e4713e105078d, 0x10000000000000000704d4f90616d782f, 0x86c26fd1dd2a50ee0449c352, 0x1b4d11d7f532f65e13dcba4e, 0x9015975fbc0102c1ff188862, 0x7e1482bb4fc0ef8853ca0c, 0x94cc4d2e3c7efb6f9333e845, 0xb0e5f311c82f55c14cd25a55, 0x507353e7c8312a9919c42bd9, 0xd36d6a8ef21c5f12abba7b0, 0x100000000000000000d9e2865dd56177d, 0x1000000000000000027d8ecbd5198c228, 0x1000000000000000022c5f7e952ac9b2b, 0x10000000000000000a2e9b304305db746, 0x6c4a291f3b18b98c85df2dc3, 0xc22d37b8b13205d494623e06, 0x4d3d27bda9b62c0f25a91194, 0x11bc318214ab34ab5197de3d, 0xf96d5803e611f1ad039b8569, 0x8846b82a7c6d0744b0ce648d, 0x4a92230e8cec10baf31a9ca8, 0x61491babdbf49d8a7f52951, 0xbda83aa75e798d1, 0x100000000000000006286d6ba5e14f26e, 0x38e7f7d2ae5ed155, 0x568116e3630d2d3c, 0x6eda656d7e631870e3600441, 0x170f2b8ebab1a7c6884463a3, 0xd7bfea3459a831bff9178452, 0xf1e34eceee6376fc7ca9b25, 0x9245d44dca719c11569e91c5, 0x829977ffedfa58f78ae0959e, 0xcbb65cb0a53b9639d2fcd418, 0x7635fac8f26c4762db2fb7, 0x100000000000000003b4d8d413c8654e3, 0x480407e0ff6c1d6c, 0x1011af9ee2cc20e6, 0x2dde429d4509a6dc, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x20ed31b5bd1a6a99cbc5f536, limb1: 0x455cd2878abeba8b867a4290, limb2: 0x9dfb4341a83a69b41feb23e4, limb3: 0x16dfcd6d60e4be40819587ca, }, y: u384 { limb0: 0xe898728a87fdf94569d6fc7b, limb1: 0xebd6dcf86bcbaf6626552df1, limb2: 0x3892cf6167890a8cfbb63c03, limb3: 0xcc772bf8b9e03accf1bd62, }, }, ); } #[test] #[ignore] fn test_msm_BLS12_381_12P() { let mut data = array![ 0xc, 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x3d77d61326ef5a9a5a681757, 0xd3070afd4f0e121de7fcee60, 0xdf9ef4088763fe611fb85858, 0x11a612bdd0bc09562856a70, 0xde4f62a6588c9401ffefbd3, 0x9bb5f797ac6d3395b71420b5, 0xdc39e973aaf31de52219df08, 0x105dcc4dce3960447d21d3c1, 0xaefd0d854043fd325dd3c34f, 0x9b63c98d9a7845c52e1e2b0f, 0x9db0be660d847ccc58358f3f, 0x17cb6c41f0c4e1a7394ab62a, 0xcf86158ab69213388e721bb7, 0x5f7812269d790797cad9aa15, 0xb1c3622a0177001d9ed8e25f, 0x115cf429f459884785c6ba46, 0x1e81341e2f3f988ff115dda3, 0xad22946489db6ee4954fa5e1, 0x83bed94412e19d92b73cc763, 0x2074c7bceff87d0d41edba1, 0xe2955c55da59eba4b7b57d3d, 0x1e6629b0431bce67cf28c22, 0x1c35b7efd5b67f87221b8bfc, 0x3e53df9e3488a9e42acd87e, 0x2e089afa726154d40dd12102, 0x5391613ecf49db2bcf1cad86, 0x84a2abb2de6b3a6e09026a50, 0x19557a3a3c1d62a205d5dc87, 0x490bf40774926e8b279947c, 0xeabab6aef9e9d2a4f64f4e7d, 0x3e309fe1b1c8247abab20d7e, 0x79c527862917f69ac58fcc4, 0xacb18f2da2b425c2ff50dafd, 0x7623850d87e279a8a30f31ff, 0x777564c7291d95fa80203ade, 0x1764ce0e7fb626109b63789b, 0x42f2f3f4f6b9d2c2b73a361f, 0xcd78c070c184c38b1e5716aa, 0x72cbc24cd90da89e0e3cefe4, 0x19485e1c46d0dce75f8b192b, 0xb56b3539074b3c47b3f504d9, 0x2c229530bddedd8851b03dcc, 0xc93eef8474c4e18d6378e7f0, 0x173d36f17a3c9ae77a2acc25, 0x5fbf29cf20556a11621a6639, 0xdfda5b7dbf0b226822094787, 0x4a3b059e521b4b0445df96d5, 0x333988c2c09f5af061cdfb, 0x13d3570be6d27d1d588b22fc, 0x20c763e58d4df3e4990cdae9, 0x2c3301367f400c31f4bded26, 0x16a6c25d133fba74b4c55972, 0xcb24d12438557639f52df5fd, 0x4a6a46feebe8a88a8062bd0e, 0x65f04211af4b168b1e25787d, 0x17935d6f4fa575744ca46f75, 0x644f324be8a5c152625a5b8a, 0x501e52e8c5707d7a3a77ee18, 0x9636c463c14c5b85c2e6d3b1, 0x1939b6f297f7b5b7fd0ac458, 0xde1d8e2670532ec5bba60ade, 0x1154f5064f7dd38656f7f82b, 0xc9bec68372b7d07dcf66270c, 0x315ced00b3153219bbd430, 0xc48b3bc110e208d827b13f4d, 0x87d82592699bca3dbf847c2b, 0xff04f0f2c8be12365aa73443, 0x1739c8c450ac994a5326c809, 0x8904b74d5d114b5416df0ed6, 0x479ee13e49cde067742c2655, 0x45b9359bfa338dd432ca9ff1, 0x12bf6460e7a42942be6c16a0, 0x3a8b37aacb2f620bc41c6109, 0x91f68edf90b5947273b0aadf, 0x265d48695a73800b7404124c, 0x141e3d99b3ab683bdb0ce70f, 0x6d6db022a8549ee86374b69a, 0x3e98f7258170733507d8709b, 0x10b4337a56d4cd17ab2fe1d5, 0x11366a6fecb124757076f4b6, 0x77b25b600d3baa1a2f54f826, 0x924c3c1a699e9b27b3612246, 0x6a253cae0097b1955d4f0cfd, 0xd2bd6591140d2faabafefac, 0xe706f12d726b82e518e76de2, 0xcbc3fafc8178466a6bfb6b20, 0x27d77f8bd8c4a2d2333b94e2, 0x3fd4d3cb36a5470ac66276d, 0xaa24c8373ee67a1fdcfeddd6, 0xb14ff80cfb97cbe0062505e6, 0x1f3cff0169eb74ea25e4b514, 0x9c9767230b739e24df854f7, 0xc, 0x3405095c8a5006c1ec188efbd080e66e, 0x460ba2d39a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x2894fdbe6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x43870ae2fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0x56e06d3d16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0xa4593acd7ab792809e469e6ec62b2c8, 0xd450fe4aec4f217bb306d1a8e5eeac76, 0x6b3f2afe642bfa42aef9c00b8a64c1b9, 0x85940927468ff53d864a7a50b48d73f1, 0x1b8bb742d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x233a1ba09466e4726b5f5241f323ca74, 0x5306f3f5151665705b7c709acb175a5a, 0x4b2543867c879b741d878f9f9cdf5a86, 0x30bcab0ed857010255d44936a1515607, 0x22b15f3fbb42e0b20426465e3e37952d, 0x5f3f563838701a14b490b6081dfc8352, 0x368b770c552116dd2ba4b180cb69ca38, 0xc87a746319c16a0d0febd845d0dfae43, 0x1c00c5a3b29a8b06daf66c5f2577bffa, 0x1, 0x662eb982d85d057e3ecd3e80, 0xb4a9a06f1870cef04d259893, 0x13c63b08919789f6693ac767, 0x46b57475ebe2592c180602a, 0xa29ba889efae66ae28b5a21c, 0x90db50a5f6fd2bd2f903028a, 0x2ff1e2429fbd64dfa2d6ad63, 0x12dafd8eb8056d84ec28ec15, 0xab1e43002be79daa, 0x4647693a000da8bb, 0x100000000000000007d866035ad43d2cd, 0x100000000000000008ac469986dc04381, 0xae2f33a9d9cb4b15ee0ad6b1, 0xf3a69411c14fe8a373bca88b, 0x217b85cd445d90ff0e4660be, 0xcd5e4ff4b00690b55b4ccab, 0x6eed9ed30f4774665c816e0c, 0x41cd754068d68ea27a0b5a89, 0xa959aebee91fe56aa2e55599, 0x1979875ae2f9097a371a56f, 0x100000000000000008f832425d3465a7d, 0x100000000000000007a1648de1b75e170, 0x10000000000000000782f24b2b6f99caa, 0x10000000000000000a46207414514e0b7, 0xdfb5306dcb37c28c478de377, 0x82bf6e7247d010b3b88124e, 0x1350fed73699712cd10e4997, 0x264ec684e80ad573730987b, 0x7e9381355a8d8cf41277ab35, 0x1dd2f50a04724803c09295fb, 0xd59632cde5cb28cb87504b56, 0x150c5c0d0a3bcdb7fd2c4431, 0x10000000000000000ae0ed118d80201db, 0x100000000000000007dad72d6582f2e8a, 0x3e9b7c2f776f9ad1, 0x33c103bec8d8dd99, 0x6adb19e05054bbfb8a53d37b, 0x2c394966e7282d8a110f2653, 0x512faaf7af9cfceb077d30e7, 0x13427ec47a05bb56e340d4d7, 0xc5ee5e3724d194a0d2791d0f, 0x5d820084f43d9203e1e31a16, 0xa67dc8923161c3bc6ae1f4f5, 0x1dc8d7785737a204ad5d5e5, 0x10000000000000000022bf071f1160083, 0x1000000000000000057d827f50ce811a1, 0x21e30fccd874a3e1, 0x1000000000000000081bff70857d935ca, 0x382cac990c38c14a85724327, 0x98521dab0ab80ddee741516f, 0xafe85b60155438f1d4633925, 0x45c68724b994edb98efb200, 0xdbf686bb85160b27e6488220, 0x59414eea0e11ecf7c9d22ae3, 0x40d4f4747cb840ea3899a9b, 0x2861afe5dbb737326928b2b, 0x10000000000000000ed6a42a626d0b5c2, 0x100000000000000008251f67200c0fd29, 0x3753a6d93f053e65, 0x39f069691aa27848, 0x849645de9e01e7a980f44c83, 0x73c2ecb8cb203193684963db, 0x9945175490a2d564c0840500, 0x15307d5f56f347db9f7d7438, 0x376ccbcc1e7cff3de0291c4d, 0xaea02820b94f9707dd1845c, 0x352c307a3c4c5a6903a65295, 0x136ac345ecdf8cdb887a13e5, 0xabf8f0133c1f072e, 0x161489d2a4ae8501, 0x10000000000000000a422466a58575055, 0x100000000000000010d01a10c0ddec2b7, 0x71a63008c587621a4f6f2fa1, 0x82ce5f249132fd11542b71b2, 0x4069ad0155b3070b2b6f4203, 0x1126657c4bb0502d5248df50, 0x97eb128e69157b31c5de2a51, 0x627ccbf06c57855ca24f82a3, 0xba851322224041050c2c7b0b, 0x166b10a0c76fedee06db3e9a, 0x1000000000000000005f68a6ba1476c4c, 0x1badaadb9ef013b5, 0x100000000000000009d7e4713e105078d, 0x10000000000000000704d4f90616d782f, 0xda173dac5e6d0480ba667f76, 0x322fa6cc1fec8d7c415cf100, 0xfef7b6962ba4e32e16c004d7, 0xabbcb2d8ced3d51e8a78865, 0x2d862d3014969ce931cd1262, 0xcafd95d76195abeda17c7f45, 0x69277501e6ac90cabbfd905b, 0x2104682267f86645d8554d4, 0x100000000000000000d9e2865dd56177d, 0x1000000000000000027d8ecbd5198c228, 0x1000000000000000022c5f7e952ac9b2b, 0x10000000000000000a2e9b304305db746, 0xe86bdaffc7d80a66c773f278, 0xa3367d8c785f430e9f7ab55c, 0x347404e9a1d224b1a7e64804, 0x17887f8a85307d4c5ccc2bbc, 0xdcd40632f732048108cef9f5, 0x494a6fe05b3b9d1ebc125f36, 0x18a01df527ac65db6aa8e28b, 0x15157ba64035c63122bcc5cf, 0xbda83aa75e798d1, 0x100000000000000006286d6ba5e14f26e, 0x38e7f7d2ae5ed155, 0x568116e3630d2d3c, 0x65253fd616826b1dd8c6236a, 0x493a8f8b6538bb9a725be42c, 0x5a1a1e203464a4e5f03885d8, 0xf2c7a601a50541e04819723, 0x9fdb8a5060ab7533fe50a415, 0xf4dd7e344ccc7f09843b76af, 0xc660f2fffacb256a3e366c57, 0xcc76384b035432da44ba0c3, 0x100000000000000003b4d8d413c8654e3, 0x480407e0ff6c1d6c, 0x1011af9ee2cc20e6, 0x2dde429d4509a6dc, 0x9a04f7c7cf9cf95db3549484, 0x4a0c467c3a6e7c13b6bbb2e6, 0xdb99b99a930fe293db1b8e80, 0x10c8dfe8a58baf24cbb10f59, 0xc6d991cbebf3f9fa457915ba, 0xa520ddf24608d77a970d70ae, 0x1c1b315ab5926bca556680a7, 0x55733b5e405e88290930f38, 0x10000000000000000a857f257ed546ea8, 0x100000000000000001c358602b6f2cc63, 0x100000000000000000cfc85c4f3f5d8b2, 0x5dc2c695f99c34b6, 0x15fe07945fe2e77a80e4179c, 0x1ec2648a2cb50e385ba8a01a, 0x4ad0adea7d44208504ffa544, 0x122dbd49c1be9a7cede8f22d, 0xa7a998d5d885d32646167830, 0x5f83ce9f704555fd5177aa16, 0x95cdcf02e2e556a08a988e4, 0xdac0c3fac6c4b903f15e3af, 0x6249de39f2cc9280, 0x100000000000000008d2562f99f8222e7, 0x28c4e5bf72e345ad, 0x10000000000000000222b64363b6a2501, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x8bce5042829fff73a3bcf235, limb1: 0x24302605af7afd068c1bac35, limb2: 0x37e884c17dfeef6ccab457b5, limb3: 0xd33acb51b348e3a6fe9f58b, }, y: u384 { limb0: 0x26976f00ce9dc19a844a55bf, limb1: 0x305566a6af04e25742e40b78, limb2: 0xeb73722c02dbef5226438532, limb3: 0x1618caeaf7d7b6c6e1bf656, }, }, ); } #[test] fn test_msm_SECP256R1_1P() { let mut data = array![ 0x1, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0x1, 0xeb1167b367a9c3787c65c1e582e2e662, 0xf7c1bd874da5e709d4713d60c8a70639, 0x3, 0x5ecaccc77099015edd4567b8, 0xa82e8c31fd89230e9e054b35, 0x9b8f95662d8ac62b, 0x0, 0x197a10d65c49dfb9020a06d1, 0x385d645da0e58782b062bea8, 0xce16e956485f6821, 0x0, 0x35a5b9ab55bd33dd4dec8ec8c85b8754, 0x1256a1018e9a2606d3efc444e5bc9e97, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x5ecaccc77099015edd4567b8, limb1: 0xa82e8c31fd89230e9e054b35, limb2: 0x9b8f95662d8ac62b, limb3: 0x0, }, y: u384 { limb0: 0x197a10d65c49dfb9020a06d1, limb1: 0x385d645da0e58782b062bea8, limb2: 0xce16e956485f6821, limb3: 0x0, }, }, ); } #[test] fn test_msm_SECP256R1_2P() { let mut data = array![ 0x2, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0xd3ff147ff0ee4213f51f677d, 0x431366a7732a6e4a6b942255, 0x9fe743b25d39a591, 0x0, 0x7f8bb562ff60a902ef14bcb0, 0xeb9420089fa531db62e806a6, 0xfd028df433dfd5cc, 0x0, 0x2, 0xe443df789558867f5ba91faf7a024204, 0x23a7711a8133287637ebdcd9e87a1613, 0x1846d424c17c627923c6612f48268673, 0xfcbd04c340212ef7cca5a5a19e4d6e3c, 0x3, 0x69ad05b5d409fdd74ff3606a, 0xa4cd8f1dd82b0b833eb4f2e7, 0x24b24c3d5a6a9dfd, 0x0, 0xd836719652e6763c9000c8bf, 0xf5a12b525077946be38f884b, 0x648707519821f2b4, 0x0, 0x29fa93ff2e088f257810ffaf340cbe2f, 0x67db401fe06eea845a19e61367b76a34, 0xf89789bfc970e55d00b6c590, 0xf75a68e0b3fa2545ac20867c, 0x2960649db3055cd8, 0x0, 0x89f368de0f28fdf05075bde, 0x528cd10ce08cfe5ddb208066, 0xda975b1ed45230dd, 0x0, 0x44faf735503f8d6a4fd7c1f1541b0e83, 0x108efc1b039167d94064f65615a509dcb, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x7c99e6e15710cca6d05a228c, limb1: 0xb3b0695cd0bcf4e2fff2aa40, limb2: 0xf51b415c36a8d206, limb3: 0x0, }, y: u384 { limb0: 0x3ed9af037beeebe8a4e51272, limb1: 0x59c17339e41ffb8881d8ff31, limb2: 0x8659e768c3fbaf89, limb3: 0x0, }, }, ); } #[test] fn test_msm_SECP256R1_3P() { let mut data = array![ 0x3, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0xd3ff147ff0ee4213f51f677d, 0x431366a7732a6e4a6b942255, 0x9fe743b25d39a591, 0x0, 0x7f8bb562ff60a902ef14bcb0, 0xeb9420089fa531db62e806a6, 0xfd028df433dfd5cc, 0x0, 0x46ae31f6fc294ad0814552b6, 0x2d54cc811efaf988efb3de23, 0x2a2cc02b8f0c419f, 0x0, 0xaec889b9d8ce51c4a2c3586f, 0xa2b07874c333bfee9f78e13e, 0xc445de21be8d8709, 0x0, 0x3, 0x1846d424c17c627923c6612f48268673, 0xfcbd04c340212ef7cca5a5a19e4d6e3c, 0xb4862b21fb97d43588561712e8e5216a, 0x259f4329e6f4590b9a164106cf6a659e, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0x5487ce1eaf19922ad9b8a714e61a441c, 0x3, 0x21932ec80e1487c9cfaca85, 0xc186376df1525312e49b706e, 0xc31cc2013df9b079, 0x0, 0xfc2a2329e088a2bf919713c2, 0x6f226891c087240877728fb4, 0x8c2581e103f28987, 0x0, 0x44faf735503f8d6a4fd7c1f1541b0e83, 0x108efc1b039167d94064f65615a509dcb, 0x771ae9413e9a50212f4cab04, 0xe237a7ac362eb52c39a5693d, 0xfed723892728a27d, 0x0, 0x22cef04d0e2d637e3ac6f9dc, 0xfe6992a829bc39d46025402c, 0xf9f46dc5ec2a3be2, 0x0, 0x97f029beb074caf4db383ce1b6f43018, 0x676a9d25b186deaeeb154f6f81c3cac5, 0xcb6fdbee18c8593a5411d8d4, 0xb5481fe44962e7d3e222115, 0x871c9156dc079065, 0x0, 0x8c26b99697ee8e8f646fc0eb, 0x73d06be2b40891cb15d4a6c8, 0x97c7a60ae52be2f, 0x0, 0xe1a61de4d41b08744b95b20a4e12fcb3, 0x153b6b6be0d5eaf38f83e1294ef38c98b, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x60a04d1cd61720fd649a635, limb1: 0x4de992ec1fe826266faf9542, limb2: 0x7fcc86284cb4d8d5, limb3: 0x0, }, y: u384 { limb0: 0xc5cc56bee25131b3aec25cee, limb1: 0x60f429ebbf34f181ee9e0f69, limb2: 0xeaba7780c9c9f8a8, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256R1_4P() { let mut data = array![ 0x4, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0xd3ff147ff0ee4213f51f677d, 0x431366a7732a6e4a6b942255, 0x9fe743b25d39a591, 0x0, 0x7f8bb562ff60a902ef14bcb0, 0xeb9420089fa531db62e806a6, 0xfd028df433dfd5cc, 0x0, 0x46ae31f6fc294ad0814552b6, 0x2d54cc811efaf988efb3de23, 0x2a2cc02b8f0c419f, 0x0, 0xaec889b9d8ce51c4a2c3586f, 0xa2b07874c333bfee9f78e13e, 0xc445de21be8d8709, 0x0, 0x7e47d1c2d19c21b2f6870259, 0xe701b40af42001c38bca00db, 0xd87ea1720d4dd3d6, 0x0, 0x5b1d6cc74985ce49a1f737fe, 0xb9127c572c3f091c031c249c, 0x1392711e1576aa6f, 0x0, 0x4, 0xb4862b21fb97d43588561712e8e5216a, 0x259f4329e6f4590b9a164106cf6a659e, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0x5487ce1eaf19922ad9b8a714e61a441c, 0x5a92118719c78df48f4ff31e78de5857, 0xa3f2c9bf9c6316b950f244556f25e2a2, 0x8d723104f77383c13458a748e9bb17bc, 0x85776e9add84f39e71545a137a1d5006, 0x3, 0x9921ded7d529ce361c8e3ff0, 0xdc220d0b5287d69a714d190b, 0x1b76478b4180189d, 0x0, 0xb1d2a54b21c1ad7f7d0f9027, 0x7e58d3d0b7e2a537a993411c, 0x7985849f9dd8119, 0x0, 0x97f029beb074caf4db383ce1b6f43018, 0x676a9d25b186deaeeb154f6f81c3cac5, 0xe25b3d09a0ca15758eec5c35, 0x4eb2ac787bfa862b05c37a19, 0x485dc9be973d40ad, 0x0, 0xc544faf31ae71d76185ae1c9, 0xe7c7a3e02b520e65be0e955f, 0x56d97c994d146f8a, 0x0, 0xe1a61de4d41b08744b95b20a4e12fcb3, 0x153b6b6be0d5eaf38f83e1294ef38c98b, 0x57748c8a004a6262d9e306a3, 0x96a084f871c636d34425a103, 0xb3c2b8700cd7d920, 0x0, 0x4ad02dbf9a1e3ee40e1e3d8d, 0xf797030462c8333af23d3f54, 0x1dc280acb99e5f4c, 0x0, 0x26994a6057531b28435aaa960f280193, 0x30924dc9b5e85e844f4ee14d4bfe0e12, 0xfeea2dd70b8a91873d10df4b, 0xb8e2d33a659ef7fa87e3fa0, 0x74fc51cbe8e5400d, 0x0, 0xe4d3e3cf55a86291a7c5da22, 0xd3b103edfa5860bd1f94cdf8, 0x3480d7e452a5d2b5, 0x0, 0x935644fe1e5f8844579a502568d12dc6, 0x177896bfd1e087a003ea64e9eaecd32d3, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x34c12d0510448edd8a4f435e, limb1: 0x1c1b70597d3d6f0ffda68cdc, limb2: 0x8f60be7a69fb2da6, limb3: 0x0, }, y: u384 { limb0: 0x67b330ca24613a628c5f1d44, limb1: 0xa12378b8d8a57f7ee45cf035, limb2: 0x7f7102c7548d7593, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256R1_10P() { let mut data = array![ 0xa, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0xd3ff147ff0ee4213f51f677d, 0x431366a7732a6e4a6b942255, 0x9fe743b25d39a591, 0x0, 0x7f8bb562ff60a902ef14bcb0, 0xeb9420089fa531db62e806a6, 0xfd028df433dfd5cc, 0x0, 0x46ae31f6fc294ad0814552b6, 0x2d54cc811efaf988efb3de23, 0x2a2cc02b8f0c419f, 0x0, 0xaec889b9d8ce51c4a2c3586f, 0xa2b07874c333bfee9f78e13e, 0xc445de21be8d8709, 0x0, 0x7e47d1c2d19c21b2f6870259, 0xe701b40af42001c38bca00db, 0xd87ea1720d4dd3d6, 0x0, 0x5b1d6cc74985ce49a1f737fe, 0xb9127c572c3f091c031c249c, 0x1392711e1576aa6f, 0x0, 0xb71f95ea692ed186e06e4c37, 0x807276cd9cc59718bb11dbe9, 0x10756a25836d67ca, 0x0, 0xd34211b3520c83c5f9be99af, 0x8f19a28ceef67bbda102ffe7, 0x7ac2b92030d351cc, 0x0, 0x411bb5d0fbe844f025c7178c, 0xcf603787227b7ac499d6d1c4, 0x5f6b2479862eb2f8, 0x0, 0xce60303cfcb98726ff64a1e5, 0xa64534c614754b3527588d25, 0x44f75e245622181, 0x0, 0x8a703177da18d4ede707c057, 0x7d6c11e754ab6fbe73deea43, 0xdf9787168190a047, 0x0, 0x2e6585ab5f125a34fef37875, 0xb70e9f02ce7744197172a117, 0x60e305f9fe6f2298, 0x0, 0x712f72f3929408ff68af059d, 0x4f72cea12cd115dc1c8639f5, 0xc6d5ae1b897ffe77, 0x0, 0xfcf91f56bad0659142668837, 0xa15458b49bcdad6c870e3889, 0x81a1342e70b1b765, 0x0, 0x461d7579f9613d3168fc6220, 0x7626024a6195fe0eafcea08b, 0x32e91b268a032443, 0x0, 0xcdc7ae298071a741aafd4035, 0x9a9bdfbdb824dc1278457a10, 0x17fbec3713dfd145, 0x0, 0x9b85054533e9d24310265ee0, 0x51cbb79b2625c435ba43bbef, 0x1fd81fcb136c629b, 0x0, 0x96378a2e47ab50246a9cf131, 0x4d0f08867537268cf39eae04, 0x4eeb60396f3e5f52, 0x0, 0xa, 0xd3fbf47a7e5b1e7f9ca5499d004ae545, 0xbaf3897a3e70f16a55485822de1b372a, 0x101fbcccded733e8b421eaeb534097ca, 0x38c1962e9148624feac1c14f30e9c5cc, 0x247a8333f7b0b7d2cda8056c3d15eef7, 0x1759edc372ae22448b0163c1cd9d2b7d, 0xe005b86051ef1922fe43c49e149818d1, 0x7d41e602eece328bff7b118e820865d6, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x552f233a8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x8c1745a79a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x5129fb7c6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x870e15c2fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0xadc0da7a16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x148b2758d7ab792809e469e6ec62b2c8, 0x3, 0x38561918155956c9814da8c1, 0x4ee05f58a1e16b839f0d9c00, 0xecde93203b4a7dfa, 0x0, 0xa685cbd24295124d7e743db7, 0x839d0ebc27e44d043d77eded, 0xe795a8a4341deaa3, 0x0, 0xed0428b23446f2526c2e4e7b07209994, 0x10210ae4a0d0485cb56c075354424cf5d, 0xa3dad4276a73d4c09d6159d4, 0x993f51a3b23380f272860899, 0x32c55c9bd7a08a15, 0x0, 0xc5e4a047ae1c8e94b7d2caf4, 0xb641a3a56bdde831271d3274, 0x33595945536b7789, 0x0, 0xc0845253484d89c1d1ccaf50b5524f81, 0x559558f8096b66022bac83a15eb9ff6f, 0x6b1cb9b2433fb61e81654c3b, 0x67617c9e3a607fac036ceecb, 0x97c35ee2d0c73db6, 0x0, 0xf0c3a4705c96d01f668e05ce, 0xeafdbf139502919889b40454, 0xc935a5c99c11cf36, 0x0, 0x44922bc02cadce44e7b7886df54150df, 0x1c077ddb46086b3c48c0151e702cff2f6, 0x65677810a039bc3e3c9be37c, 0x7d16040d79afaf58b3f80fa9, 0xfae349c7861f6f48, 0x0, 0xd89bebc35496c77341e51852, 0x2358a145b3d17fa89be6dbdc, 0xd3b85a68d5dc2676, 0x0, 0xc9ed151811182720cf9615e71e9fa060, 0x142125c7f17a0f71398604210c95e5ca5, 0x4b3c7e7ccefc0fae7b0f55bb, 0xef7afabc6323803d011d8d2, 0x60a2c23d746b1a06, 0x0, 0xb25819a91f97473e0339cd04, 0xaf305d5c7986ca879648d39e, 0xda3801752ba46faa, 0x0, 0xae8d22acf2919234f64b2558ab7b67df, 0x11041f8236fcac05059b625657966610f, 0x4c3728ed346a68dbf7e146f7, 0x678f6cd8ef42911e63db5bec, 0x77f7f11c0623961b, 0x0, 0x685ae2d8682fb6e5bddbf735, 0x1f03b99ca6329f7dc3a47dd, 0x711f6d38f7342bbc, 0x0, 0x1f14954c7b5ac5b971b602c56df47bc3, 0x12d076b9e2d6f7ff90377d25582942bfe, 0x3b04be6e199cf2f9e01b8e25, 0xfcf54a6935861246f40ccf8c, 0xfbadcace1d51d441, 0x0, 0xd70f738575d4a0269184b8ff, 0x3b4408df2be178958c3bf10c, 0x79e7079bd76a7b55, 0x0, 0x6436caaee772af5fc76e60b7db77afc1, 0x1c3e3905b638753f3071cef680336e7fe, 0xfe871f11377ae9427e3685f9, 0x7e050d6b4465549c28c47dc0, 0xc4902f8601ad20c0, 0x0, 0xe79c221af2b5a795ce938be6, 0x97c17d2cd373c628e73940b, 0xe94b501243f485aa, 0x0, 0x16f8de87b088d889a9fe62c941cfad9b, 0x181d97eccb30bde04756f33bbfe09ac77, 0x34be9f4109fde722b0ad2953, 0x61c76a815bc4e8e49f2f6f22, 0x45c8af482d122938, 0x0, 0x23cef567487cef807c8f37df, 0xb06e7986c8691afa2c56be48, 0x2f6997e366662173, 0x0, 0x10c6c0d26e3816ea1b2e066d32578f8e, 0xe883f51850260b2857cb5d63a26adb1d, 0x642b3b250974accb2a19bddd, 0xab3e89d8cf48dc55485119e6, 0xc5f80116c5e9c74, 0x0, 0xff9bfb138c144d05684a114c, 0x7e7e1ae6a3570325390ed38e, 0x92eb23ab15e45e63, 0x0, 0xa318a477495afb754a1e314186443137, 0x1a9d9d5e84e930f6526918aa8ca162b82, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xfba2105cfbf4fb86b8691c25, limb1: 0x737afa206da896812a1683ed, limb2: 0x3770a73db013e250, limb3: 0x0, }, y: u384 { limb0: 0x5590076303a44e451ab3856b, limb1: 0xd5fcd660db51d063c730f5c7, limb2: 0x506410f9c703c100, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256R1_11P() { let mut data = array![ 0xb, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0xd3ff147ff0ee4213f51f677d, 0x431366a7732a6e4a6b942255, 0x9fe743b25d39a591, 0x0, 0x7f8bb562ff60a902ef14bcb0, 0xeb9420089fa531db62e806a6, 0xfd028df433dfd5cc, 0x0, 0x46ae31f6fc294ad0814552b6, 0x2d54cc811efaf988efb3de23, 0x2a2cc02b8f0c419f, 0x0, 0xaec889b9d8ce51c4a2c3586f, 0xa2b07874c333bfee9f78e13e, 0xc445de21be8d8709, 0x0, 0x7e47d1c2d19c21b2f6870259, 0xe701b40af42001c38bca00db, 0xd87ea1720d4dd3d6, 0x0, 0x5b1d6cc74985ce49a1f737fe, 0xb9127c572c3f091c031c249c, 0x1392711e1576aa6f, 0x0, 0xb71f95ea692ed186e06e4c37, 0x807276cd9cc59718bb11dbe9, 0x10756a25836d67ca, 0x0, 0xd34211b3520c83c5f9be99af, 0x8f19a28ceef67bbda102ffe7, 0x7ac2b92030d351cc, 0x0, 0x411bb5d0fbe844f025c7178c, 0xcf603787227b7ac499d6d1c4, 0x5f6b2479862eb2f8, 0x0, 0xce60303cfcb98726ff64a1e5, 0xa64534c614754b3527588d25, 0x44f75e245622181, 0x0, 0x8a703177da18d4ede707c057, 0x7d6c11e754ab6fbe73deea43, 0xdf9787168190a047, 0x0, 0x2e6585ab5f125a34fef37875, 0xb70e9f02ce7744197172a117, 0x60e305f9fe6f2298, 0x0, 0x712f72f3929408ff68af059d, 0x4f72cea12cd115dc1c8639f5, 0xc6d5ae1b897ffe77, 0x0, 0xfcf91f56bad0659142668837, 0xa15458b49bcdad6c870e3889, 0x81a1342e70b1b765, 0x0, 0x461d7579f9613d3168fc6220, 0x7626024a6195fe0eafcea08b, 0x32e91b268a032443, 0x0, 0xcdc7ae298071a741aafd4035, 0x9a9bdfbdb824dc1278457a10, 0x17fbec3713dfd145, 0x0, 0x9b85054533e9d24310265ee0, 0x51cbb79b2625c435ba43bbef, 0x1fd81fcb136c629b, 0x0, 0x96378a2e47ab50246a9cf131, 0x4d0f08867537268cf39eae04, 0x4eeb60396f3e5f52, 0x0, 0x4e9960d402494fb117251955, 0xc0fb055de656d6ac2ba4da86, 0x800a21e8619f448f, 0x0, 0x21ba9af739425b664464e3d5, 0xd09194888c2ffcf16e93e0c9, 0x5d4d3cd0684b6cd1, 0x0, 0xb, 0x101fbcccded733e8b421eaeb534097ca, 0x38c1962e9148624feac1c14f30e9c5cc, 0x247a8333f7b0b7d2cda8056c3d15eef7, 0x1759edc372ae22448b0163c1cd9d2b7d, 0xe005b86051ef1922fe43c49e149818d1, 0x7d41e602eece328bff7b118e820865d6, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x552f233a8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x8c1745a79a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x5129fb7c6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x870e15c2fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0xadc0da7a16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x148b2758d7ab792809e469e6ec62b2c8, 0xd450fe4aec4f217bb306d1a8e5eeac76, 0xd67e55fd642bfa42aef9c00b8a64c1b9, 0x85940927468ff53d864a7a50b48d73f1, 0x37176e84d977e9933c49d76fcfc6e625, 0x3, 0xb16bff1ced538bfd53bae25e, 0xbf1402b7e25844a265c1bdd5, 0x1be24841a28b989f, 0x0, 0xf986f402c5573e161419f24a, 0x7b675d2f5f2da582d6fe8f9e, 0x6aeca6fa85a397dc, 0x0, 0xc0845253484d89c1d1ccaf50b5524f81, 0x559558f8096b66022bac83a15eb9ff6f, 0x962f32f58256def96811a9d0, 0xa1b9c86a62821a4cfcd4a227, 0xef591311df6d01e4, 0x0, 0x742d94ecec04d08af134a72f, 0xad0028269dacda27bef683c4, 0x298a3de72a4ed3cf, 0x0, 0x44922bc02cadce44e7b7886df54150df, 0x1c077ddb46086b3c48c0151e702cff2f6, 0x45a06c488f5dcafb092b1d04, 0x1da9b0f063b8d103454f7cc4, 0xd913f452d9dd6f57, 0x0, 0x75d6dd631f23b758508fcb4, 0xf21f94eae9d1c6ed2aa4fb67, 0xdf5004b53571e9a9, 0x0, 0xc9ed151811182720cf9615e71e9fa060, 0x142125c7f17a0f71398604210c95e5ca5, 0x8d9a40cc54f2cc7d02b7e0b0, 0xe36d1ca0c233cf2ec25c402f, 0x94f2e92234345839, 0x0, 0x7939e94d8e6282dd8964091f, 0x98530c37ba4b3964a3a0fe4a, 0x982d6fbcc9b50a64, 0x0, 0xae8d22acf2919234f64b2558ab7b67df, 0x11041f8236fcac05059b625657966610f, 0x21c3e96235c9016bf0a84114, 0x247ff7af02d28a262889b947, 0x92f35a496b19286d, 0x0, 0x343cd3d8bf84c15a702e7657, 0x5e021f090c2b6c54bb8bcf1f, 0x5d1e6f00fb3793c5, 0x0, 0x1f14954c7b5ac5b971b602c56df47bc3, 0x12d076b9e2d6f7ff90377d25582942bfe, 0x2b574bbd9c8f851c273ff965, 0x6e259626c2a5c8caa331135b, 0x36ae66488788bb25, 0x0, 0xb143e40a36ef2d4c7875e024, 0x62bbca04aa3439b4100d24c9, 0x49c3be30dc73a5fe, 0x0, 0x6436caaee772af5fc76e60b7db77afc1, 0x1c3e3905b638753f3071cef680336e7fe, 0xb50c01b147f62f5ced402fc7, 0x916dc3141db597cb65f49535, 0xfa26dd483341953, 0x0, 0x83482d67557d46be990aeb2b, 0x879cc943ac21722d332e0387, 0x53e3c2b4d5a19544, 0x0, 0x16f8de87b088d889a9fe62c941cfad9b, 0x181d97eccb30bde04756f33bbfe09ac77, 0x39a4c7a121736d93c8c46aca, 0xd75c5f684d85cbf35b9f803d, 0xa71f416ba3e8524f, 0x0, 0x3fb43e42616b1d7de570fd52, 0xe64815507843d1afb0823f58, 0xb0ed6357a48b8b89, 0x0, 0x10c6c0d26e3816ea1b2e066d32578f8e, 0xe883f51850260b2857cb5d63a26adb1d, 0xd9b0171c1f079d16eb88b0b5, 0xc10f56ec85cc7f859a09f8de, 0x215108f002c87662, 0x0, 0x5e4c522f974963e8bf756e19, 0xe603a1ddbea2d112fc889233, 0x5fc356df32962109, 0x0, 0xa318a477495afb754a1e314186443137, 0x1a9d9d5e84e930f6526918aa8ca162b82, 0x145a727889f0bb4d53d6fbaa, 0x4155f220ac0460cd7ed04829, 0xb3ed8c7049dc43dc, 0x0, 0x8a4850ae0cc7d3a0fc4a4a8e, 0x47478a0e45160288b6680b05, 0x10bdda9cc7016108, 0x0, 0x2785e73e00b487bf30548408ffb58c02, 0x15f510a537d9b81be6f4a2335fa207095, 0xff532f80c81fe274ac646064, 0x8c46882da4fde0295beab9e1, 0xc2b5cd8a7a93240a, 0x0, 0xc949597e8e67ebee593df861, 0xa4849c0210fd9206fdaffcfd, 0x510cde5a5da7c46e, 0x0, 0xe293dda213f46bf461aba1d96a9d193b, 0x15cb16111d99d7ae505af716e48e6b599, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xe702738c3be4c98312c6fd8, limb1: 0xdf289702da4292e2baf6d123, limb2: 0xd2e3d9fa85ae9ec9, limb3: 0x0, }, y: u384 { limb0: 0xb24620fd1d6468e74e756e09, limb1: 0xa92f0cfbb6159a6b7d73d3c8, limb2: 0xfdfb28f19d569756, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256R1_12P() { let mut data = array![ 0xc, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0xd3ff147ff0ee4213f51f677d, 0x431366a7732a6e4a6b942255, 0x9fe743b25d39a591, 0x0, 0x7f8bb562ff60a902ef14bcb0, 0xeb9420089fa531db62e806a6, 0xfd028df433dfd5cc, 0x0, 0x46ae31f6fc294ad0814552b6, 0x2d54cc811efaf988efb3de23, 0x2a2cc02b8f0c419f, 0x0, 0xaec889b9d8ce51c4a2c3586f, 0xa2b07874c333bfee9f78e13e, 0xc445de21be8d8709, 0x0, 0x7e47d1c2d19c21b2f6870259, 0xe701b40af42001c38bca00db, 0xd87ea1720d4dd3d6, 0x0, 0x5b1d6cc74985ce49a1f737fe, 0xb9127c572c3f091c031c249c, 0x1392711e1576aa6f, 0x0, 0xb71f95ea692ed186e06e4c37, 0x807276cd9cc59718bb11dbe9, 0x10756a25836d67ca, 0x0, 0xd34211b3520c83c5f9be99af, 0x8f19a28ceef67bbda102ffe7, 0x7ac2b92030d351cc, 0x0, 0x411bb5d0fbe844f025c7178c, 0xcf603787227b7ac499d6d1c4, 0x5f6b2479862eb2f8, 0x0, 0xce60303cfcb98726ff64a1e5, 0xa64534c614754b3527588d25, 0x44f75e245622181, 0x0, 0x8a703177da18d4ede707c057, 0x7d6c11e754ab6fbe73deea43, 0xdf9787168190a047, 0x0, 0x2e6585ab5f125a34fef37875, 0xb70e9f02ce7744197172a117, 0x60e305f9fe6f2298, 0x0, 0x712f72f3929408ff68af059d, 0x4f72cea12cd115dc1c8639f5, 0xc6d5ae1b897ffe77, 0x0, 0xfcf91f56bad0659142668837, 0xa15458b49bcdad6c870e3889, 0x81a1342e70b1b765, 0x0, 0x461d7579f9613d3168fc6220, 0x7626024a6195fe0eafcea08b, 0x32e91b268a032443, 0x0, 0xcdc7ae298071a741aafd4035, 0x9a9bdfbdb824dc1278457a10, 0x17fbec3713dfd145, 0x0, 0x9b85054533e9d24310265ee0, 0x51cbb79b2625c435ba43bbef, 0x1fd81fcb136c629b, 0x0, 0x96378a2e47ab50246a9cf131, 0x4d0f08867537268cf39eae04, 0x4eeb60396f3e5f52, 0x0, 0x4e9960d402494fb117251955, 0xc0fb055de656d6ac2ba4da86, 0x800a21e8619f448f, 0x0, 0x21ba9af739425b664464e3d5, 0xd09194888c2ffcf16e93e0c9, 0x5d4d3cd0684b6cd1, 0x0, 0x4bec631b62d40e5b8aaff33e, 0xf7161e0a086fb1c95bc84eab, 0xfbff400a905bf4cf, 0x0, 0x482ffa9e045ec6f1e1e09d6e, 0x9a75ce6f11a020bef0b9b3f3, 0x253b9af963b9e192, 0x0, 0xc, 0x247a8333f7b0b7d2cda8056c3d15eef7, 0x1759edc372ae22448b0163c1cd9d2b7d, 0xe005b86051ef1922fe43c49e149818d1, 0x7d41e602eece328bff7b118e820865d6, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x552f233a8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x8c1745a79a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x5129fb7c6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x870e15c2fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0xadc0da7a16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x148b2758d7ab792809e469e6ec62b2c8, 0xd450fe4aec4f217bb306d1a8e5eeac76, 0xd67e55fd642bfa42aef9c00b8a64c1b9, 0x85940927468ff53d864a7a50b48d73f1, 0x37176e84d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x467437419466e4726b5f5241f323ca74, 0xa425799aa905d7507e1ea9c573581a81, 0xfb82860deabca8d0b341facdff0ac0f1, 0x3, 0xf21b3e6af6d840760fa8411f, 0xd677b055694872a38d273ef1, 0x150932895e8f8c82, 0x0, 0x45195680cc81c556f391cc4b, 0xdde61f43811514fa59ed06e9, 0x220cfb9298b8cc55, 0x0, 0x44922bc02cadce44e7b7886df54150df, 0x1c077ddb46086b3c48c0151e702cff2f6, 0x2b346d6b79e589393cf0d61b, 0x4f58aa4dd49fc3dd5924c7f9, 0x386d7047f06ea697, 0x0, 0x3a470a888b07a992eebf9389, 0x8324abb26382c12bce482ab1, 0xb384c6bec834d324, 0x0, 0xc9ed151811182720cf9615e71e9fa060, 0x142125c7f17a0f71398604210c95e5ca5, 0x9c891702b89da5331cb7832e, 0x2731f6bc2f1aa2eb186b25c5, 0x2ad90d0df0c3682c, 0x0, 0xcd1df42426c63336a3458fe5, 0x7c918ae249bb546477383a55, 0x44e172d8e00fd452, 0x0, 0xae8d22acf2919234f64b2558ab7b67df, 0x11041f8236fcac05059b625657966610f, 0xd6cf6a25a18ed80eb0e6190e, 0x3c774b8768bc771fab9fdcc9, 0x47c91895e8b1d94e, 0x0, 0x272762d65915cc5033c101ea, 0x99426a49b9b07e18aded6f42, 0xca92ae7e999ccfaa, 0x0, 0x1f14954c7b5ac5b971b602c56df47bc3, 0x12d076b9e2d6f7ff90377d25582942bfe, 0x394cc425f5996a29056252d1, 0xd2b3ec664a7880e8d35f183f, 0xc828b02c43406f58, 0x0, 0x804960c086f17cae9d5ad279, 0x484702a1d46ed78aefb3e507, 0x1e99ac387923772, 0x0, 0x6436caaee772af5fc76e60b7db77afc1, 0x1c3e3905b638753f3071cef680336e7fe, 0x26ce92552827bb2fa63cca66, 0xc39a63811359b427370b0575, 0xae807a141eaa26dc, 0x0, 0xc0c2b78a71d509508baf0f2a, 0x2feadccb72de72e9f5fc6138, 0xc0382fd27bb08ce3, 0x0, 0x16f8de87b088d889a9fe62c941cfad9b, 0x181d97eccb30bde04756f33bbfe09ac77, 0x78113c1d4dfdf1520f3f1999, 0x2c5b0f78ece4dbf13818b6da, 0x91423833a8a23044, 0x0, 0x4f72d597c449ae91c028fe43, 0x6254a79f46e2eba930ff0922, 0x2fe944a98818b85, 0x0, 0x10c6c0d26e3816ea1b2e066d32578f8e, 0xe883f51850260b2857cb5d63a26adb1d, 0x6623d54c69187cc05a7d25f1, 0x4f1c622a1f647d93565c3832, 0x6a79e7e30dd11556, 0x0, 0x1fce6face866ebb2c02113a5, 0xdeff94345f28459d5573a31b, 0xae91e80a1d94d7e5, 0x0, 0xa318a477495afb754a1e314186443137, 0x1a9d9d5e84e930f6526918aa8ca162b82, 0x8cf51eb38bcb71c8f648bcff, 0x4c19c480af80b7e6a658baa2, 0xcf2c5e5a5d2ebee5, 0x0, 0x19103765b836ea25211d48d7, 0xfe67a940dcd330efe84be2dd, 0x8d56f6b8b35dbce5, 0x0, 0x2785e73e00b487bf30548408ffb58c02, 0x15f510a537d9b81be6f4a2335fa207095, 0x8bfd5afc63995feebc71e165, 0xe7d8abd837751c2eb24eef3e, 0xee5889cb9dcfbaf5, 0x0, 0x1f5083d084d6f44e5bfbbb5b, 0x2b94b883ed3e33932b61c480, 0xe267eab32408be05, 0x0, 0xe293dda213f46bf461aba1d96a9d193b, 0x15cb16111d99d7ae505af716e48e6b599, 0x5c19035d92c3b9e269ca9231, 0x305af2b3721b71e18b9f971, 0x174d9aaf6ed44af2, 0x0, 0x7b91bd8b08dd4844dd8b2f3e, 0xe8174f87ddde9f6c71c644ff, 0x8b0c88aa96b2ff53, 0x0, 0x5747d2a86b06c3af37767b79685e955a, 0x12d5f64271c5145c58fdf6149840ae47, 0x93b81d705fbc02e172727cfd, 0x4de473fa4428b4c924d7bd53, 0x1939f32498b8d75d, 0x0, 0x8ab3d19f0f073043eb950bf9, 0xee1962e119ef85b4c508ad6d, 0x6808f2627e81135c, 0x0, 0xf49af9f8629ea294f624aa92983015e9, 0x1046b42b340cdb380acd6a9b3aecef690, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xce6a9b69daea1558dcbe14f1, limb1: 0x3d82daa514f325d29522e5e7, limb2: 0xc9833209611997e9, limb3: 0x0, }, y: u384 { limb0: 0x84af480eeea70b1a6120dc57, limb1: 0xc6df620bb03464672b4e6d28, limb2: 0x53ae491c8e1b5177, limb3: 0x0, }, }, ); } #[test] fn test_msm_SECP256K1_1P() { let mut data = array![ 0x1, 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0x1, 0xeb1167b367a9c3787c65c1e582e2e662, 0xf7c1bd874da5e709d4713d60c8a70639, 0x2, 0xc20f5aa13afc3a2097ce088b, 0x50220928f8ca04bf313c1d7, 0x70743ffac9bb07f9, 0x0, 0xfa42792834ae5445fcaca832, 0x6796f84b7340adf44ed49d33, 0x62fd8a76eedcb778, 0x0, 0x100000000000000006d17da9dde38d3aa, 0x100000000000000008e0801a3d001f325, 0x87ea3597eb650e8, 0xe42d003a1f0e89bd, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xc20f5aa13afc3a2097ce088b, limb1: 0x50220928f8ca04bf313c1d7, limb2: 0x70743ffac9bb07f9, limb3: 0x0, }, y: u384 { limb0: 0xfa42792834ae5445fcaca832, limb1: 0x6796f84b7340adf44ed49d33, limb2: 0x62fd8a76eedcb778, limb3: 0x0, }, }, ); } #[test] fn test_msm_SECP256K1_2P() { let mut data = array![ 0x2, 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0xfdfdc509f368ba4395773d3a, 0x8de2b60b577a13d0f83b578e, 0xc2dd970269530ba2, 0x0, 0x589fa250d638e35400c12ddf, 0xb3aac19fcb5095808402aa7f, 0xed6de6590d0195d1, 0x0, 0x2, 0xe443df789558867f5ba91faf7a024204, 0x23a7711a8133287637ebdcd9e87a1613, 0x1846d424c17c627923c6612f48268673, 0xfcbd04c340212ef7cca5a5a19e4d6e3c, 0x2, 0x889ef9db2dcca93176722661, 0x30f90e4e5ea1e991ccf9dd07, 0xe840f7e9e3d96c65, 0x0, 0x6b95984b663cf4ffcd07d9c7, 0x952dac88c6a40f73979028d6, 0xc5e5fd89e078d389, 0x0, 0x4bab076cac43472e, 0x896dcc1031d19f2d, 0x100000000000000006f45630d920758e7, 0x13bfcc5670fee7eb, 0xef8bfd5fa527215c20165899, 0x7e263c9c3df47bc32eb4890b, 0x9a3ee712d779bbf1, 0x0, 0x7d54e9e980c0873b3755c17e, 0x22a963dcae22fec5cacd5431, 0x817adf30a086d140, 0x0, 0x40c3f72fa123bad6, 0x461e3a87e8955f53, 0x53ec0e0286c9f6ad, 0x1000000000000000074832ec5bb09d4f6, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x97ad9ae598203a75c13a895, limb1: 0xed9fb4bee5b2f54ca5cffb42, limb2: 0x284782b62d08871c, limb3: 0x0, }, y: u384 { limb0: 0xfb082c65dab4069694f90f18, limb1: 0xb12d25f5fb5e746c12686571, limb2: 0x7d0eb16046d10c7e, limb3: 0x0, }, }, ); } #[test] fn test_msm_SECP256K1_3P() { let mut data = array![ 0x3, 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0xfdfdc509f368ba4395773d3a, 0x8de2b60b577a13d0f83b578e, 0xc2dd970269530ba2, 0x0, 0x589fa250d638e35400c12ddf, 0xb3aac19fcb5095808402aa7f, 0xed6de6590d0195d1, 0x0, 0x2965eeb3ec1fe786a6abe874, 0x33e2545f82bb6add02788b8e, 0xf586bc0db335d7b8, 0x0, 0x155b35991489db2fdf4de620, 0xf24ce461346a182d67eeccf0, 0xb4122bb4b37cc7d5, 0x0, 0x3, 0x1846d424c17c627923c6612f48268673, 0xfcbd04c340212ef7cca5a5a19e4d6e3c, 0xb4862b21fb97d43588561712e8e5216a, 0x259f4329e6f4590b9a164106cf6a659e, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0x5487ce1eaf19922ad9b8a714e61a441c, 0x2, 0xa9ca5eaf239f624e5f32d52c, 0xe8781b10ffc1e9d6b65fcf8e, 0xa99e25b10243bc1b, 0x0, 0x48c471108b3d056fc7043965, 0xa13fee6c99e702aaa40e511e, 0x3dabf3e8f614a3e, 0x0, 0x40c3f72fa123bad6, 0x461e3a87e8955f53, 0x53ec0e0286c9f6ad, 0x1000000000000000074832ec5bb09d4f6, 0x280f3fa841c7bf6d615bcb53, 0x276795ef2ecbbe7e2012f4cd, 0x81043aa56aa2d4a, 0x0, 0x6ed67d338a2a9b542f54ec66, 0x6b2b2546eb3b1938441381f5, 0x4dbf81ca0dfc9cdf, 0x0, 0x100000000000000008a16fd00888d3c49, 0x10000000000000000701b1de1a64611a5, 0x7bb19b6adc4d85f4, 0x2fd5ac7d0446c0d3, 0x8a41f2a7e7ad4089990a1bcd, 0xec1d1ff466f58331529b0acd, 0x5649d8d001330363, 0x0, 0xfc543db1835e8a78f0994291, 0x43c390ccae632a174f607c8a, 0x813ee8122c9dfa7b, 0x0, 0x7f7b9792bad13df8, 0xf56d08780b0b13f5, 0x535b7499f702bf5d, 0xce3ee818c4660dc, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x793f03cb81255db0817da454, limb1: 0x5ed27cf7207443f37bfeee3c, limb2: 0x42943c6416752a12, limb3: 0x0, }, y: u384 { limb0: 0xf2d25838b8b95a3caaef5ce4, limb1: 0xce58bfff9d25e997305603f3, limb2: 0x5d776495b03d0b6c, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256K1_4P() { let mut data = array![ 0x4, 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0xfdfdc509f368ba4395773d3a, 0x8de2b60b577a13d0f83b578e, 0xc2dd970269530ba2, 0x0, 0x589fa250d638e35400c12ddf, 0xb3aac19fcb5095808402aa7f, 0xed6de6590d0195d1, 0x0, 0x2965eeb3ec1fe786a6abe874, 0x33e2545f82bb6add02788b8e, 0xf586bc0db335d7b8, 0x0, 0x155b35991489db2fdf4de620, 0xf24ce461346a182d67eeccf0, 0xb4122bb4b37cc7d5, 0x0, 0x12815740835b12f70b96c66f, 0xbfa76a8b80aec9f2e31c40cc, 0xcd8a26d17d33c7c1, 0x0, 0x9a8f496f09402b8fd6beb89b, 0x28e48918dad2123d7f202bef, 0xcdd11b6ffb3f8614, 0x0, 0x4, 0xb4862b21fb97d43588561712e8e5216a, 0x259f4329e6f4590b9a164106cf6a659e, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0x5487ce1eaf19922ad9b8a714e61a441c, 0x5a92118719c78df48f4ff31e78de5857, 0xa3f2c9bf9c6316b950f244556f25e2a2, 0x8d723104f77383c13458a748e9bb17bc, 0x85776e9add84f39e71545a137a1d5006, 0x2, 0x7c5bbcc9341cd7fab6ad4876, 0x3c6a25a05d905654bd812731, 0xf473dbb400e14df5, 0x0, 0x5f748642ae1443931d093af4, 0xddca2248291c024312127d87, 0xbbb00af8a51cc511, 0x0, 0x100000000000000008a16fd00888d3c49, 0x10000000000000000701b1de1a64611a5, 0x7bb19b6adc4d85f4, 0x2fd5ac7d0446c0d3, 0xd548dda6e1f541d784d4c228, 0x3bc7fbd282f26a90865b5b09, 0x3b648ed118007c3, 0x0, 0x5a28118c93a1de7664b1d6ba, 0x919d9a3d5dfce3b255589541, 0x883bab5b394b16cf, 0x0, 0x7f7b9792bad13df8, 0xf56d08780b0b13f5, 0x535b7499f702bf5d, 0xce3ee818c4660dc, 0xbc08950bb2cf7b7d9eeda922, 0xb2b86106457dfc8ec9cffb7e, 0xe835a6fda5354661, 0x0, 0xdca7ee443dbdfb5bab9335d5, 0x1e062663e3974b0f7b798cb4, 0x37d153aaefa189f2, 0x0, 0x5aba5c5df852e79b, 0x10000000000000000a37bff5d07f4f628, 0x399451b7748ce4b8, 0x1000000000000000006a4728421f58565, 0xa46be4f636be4779570df4e8, 0x7380a6e3dc3aa91b3650ca10, 0x3ef088ac9bc45c0e, 0x0, 0xce7710a9c0715f82fea0f76a, 0xf51283a23eaaaca518d43319, 0x5069f990b18886d0, 0x0, 0xa5ba5bf9830a178c, 0xf8d715433d751f7e, 0x1000000000000000001b585fab6a98780, 0x100000000000000001ee3ebda652c4c63, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xafc19dabd2b0bef1f47a78e4, limb1: 0x64c8cfa2f6ce21bd45380a70, limb2: 0xd6ec71e82872d984, limb3: 0x0, }, y: u384 { limb0: 0x1afed7037f7e7362dceb03ec, limb1: 0x149013c6ed7333d6e4ded96a, limb2: 0xaf1489c5a6180b55, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256K1_10P() { let mut data = array![ 0xa, 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0xfdfdc509f368ba4395773d3a, 0x8de2b60b577a13d0f83b578e, 0xc2dd970269530ba2, 0x0, 0x589fa250d638e35400c12ddf, 0xb3aac19fcb5095808402aa7f, 0xed6de6590d0195d1, 0x0, 0x2965eeb3ec1fe786a6abe874, 0x33e2545f82bb6add02788b8e, 0xf586bc0db335d7b8, 0x0, 0x155b35991489db2fdf4de620, 0xf24ce461346a182d67eeccf0, 0xb4122bb4b37cc7d5, 0x0, 0x12815740835b12f70b96c66f, 0xbfa76a8b80aec9f2e31c40cc, 0xcd8a26d17d33c7c1, 0x0, 0x9a8f496f09402b8fd6beb89b, 0x28e48918dad2123d7f202bef, 0xcdd11b6ffb3f8614, 0x0, 0xb5076be8537cff2a42c6db68, 0x1066d40cbd01a3752e4e069c, 0x123ec2fd302cb0f9, 0x0, 0xc85f5e5efdf415f8081bf53f, 0xadc5010e9d9ac6c64000d33d, 0xf81314011d8852e4, 0x0, 0xd5915098d3d2001310b0b935, 0x88bb4507ebf1be82cfba2397, 0x8a463f1c00ce885f, 0x0, 0x414858f8a83f9d4498890137, 0xa09c4658c47ace74c42cdb60, 0x8aaf300ff3ab7d98, 0x0, 0x1772eb803ddc8a82e23b1c05, 0xc26baeb89b03fd69eb64b337, 0x4ea7131b2d873a45, 0x0, 0xc9d16330db15efd90235eed9, 0x1b586ef360673d36baa16189, 0xee652d2b848ad111, 0x0, 0x68f9e7942638253f3b596f1f, 0xb37e6153d9accd97a344f384, 0xda48eae9ff614551, 0x0, 0xc58be8ed857035b34f51c620, 0x3b14ed53116cb7c1db000006, 0x7dfa292fe99b77dd, 0x0, 0xf7f7bd2513c1b31de932bbd2, 0x627e2fa74b7ac891f7d555c7, 0x7f8a094f818e7192, 0x0, 0x9b47b9326b668e62071faf18, 0xe21058cb6937afa89be6931a, 0x21a4bfb4cce2ac8c, 0x0, 0xaf4ad4d7d582b10b14c97e6c, 0xadf808c85e766e997e470fd0, 0x2714571e587ce46d, 0x0, 0x86a7815dad7e8a53b19fee2, 0x1922fc1efcc51e68146ffa1b, 0x9e19b7c1f886488e, 0x0, 0xa, 0xd3fbf47a7e5b1e7f9ca5499d004ae545, 0xbaf3897a3e70f16a55485822de1b372a, 0x101fbcccded733e8b421eaeb534097ca, 0x38c1962e9148624feac1c14f30e9c5cc, 0x247a8333f7b0b7d2cda8056c3d15eef7, 0x1759edc372ae22448b0163c1cd9d2b7d, 0xe005b86051ef1922fe43c49e149818d1, 0x7d41e602eece328bff7b118e820865d6, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x552f233a8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x8c1745a79a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x5129fb7c6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x870e15c2fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0xadc0da7a16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x148b2758d7ab792809e469e6ec62b2c8, 0x2, 0x278357bca21047e53cebcc8a, 0x5e183af032bbb7d3addb0053, 0x69f0f0d699ad0da, 0x0, 0x4f4baec4857a9e113c4bc046, 0x59934dd81f724602c55be112, 0x8ce0ab262b3c3676, 0x0, 0x2ef5cbfbef5479e9, 0x6fffb6b3d9f3ca00, 0xf99949f846de0180, 0x19226f35ed7d16dd, 0xb153c64d6f19ccd0278c6b94, 0x398a04c551fc8f74aa610c1, 0x2d39d1e12f83b407, 0x0, 0x8feed9f3a486593099594eab, 0x2571bc5e1f54fbed340811bf, 0xbbd2a19c5275b47c, 0x0, 0x8950a7e57cb188c3, 0x915677115b4cd35f, 0x10000000000000000adff605ec8f8e9b5, 0x10000000000000000ebfc6d2272e97ea1, 0x4caef24e507f272f30b7c823, 0x5273dc9feb3629a58072cedb, 0x2854b0b223aa71f0, 0x0, 0xac66b42ece626c4bf206c037, 0xc8b1c6f40a2edf407ce41397, 0x7c13db0a671e8662, 0x0, 0xa5060dbc57d602fe, 0x6914b48dc0c5534, 0x1b984728b0823ac8, 0x10000000000000000040e1ff5866bad1f, 0xc0ea96b4755baeb8090366aa, 0xcbfcbba1c8e0c3aa488fe399, 0xb1f7eea21e3d2ebe, 0x0, 0x769b003ec5b35afb7a3a9dbb, 0x2a28c3b33652ef6083180502, 0xb8a171b80bdab536, 0x0, 0x100000000000000007cbe66bb133fe6dc, 0x10000000000000000f0156c908c9d979c, 0x6b7c419ad9ed10d3, 0x1007811bd8c66050, 0x196c84114c4e6fd84943ae10, 0xb2b1bfb6e4a2d665b61a30e8, 0x3f7696cdb3ac6c, 0x0, 0x532d5b9de002db8f9775590d, 0x113ca5d5d68dbb4ad52542cb, 0xd4ebd6d9511abbd8, 0x0, 0x100000000000000001ee58c7660c5446b, 0x6ec3e8f177762e53, 0x100000000000000004538bd9c129bed52, 0x10000000000000000680a1770588f346e, 0x7d64eea8c9bb0b269ceb0809, 0x35432fa6ed8233fa1a176ea9, 0x4bb75b24119f877, 0x0, 0x68c57d7b2100616b5d4f104e, 0x8f4d438beb46139b440e571a, 0x3e63373ef063d4df, 0x0, 0x31b70045caadb0df, 0x3c110d9c03771d4f, 0x10000000000000000d3c49e4016b7ecb4, 0x10000000000000000cc890a6969b1a6e8, 0x2b695a4e6347bbe52bec6d29, 0xdd7ea9c6e862c5502f09e620, 0x94eed93be116d060, 0x0, 0xdbc07e9625599f80c1d400b, 0x33ba3da84dfdc5a2156437fc, 0x5baa7e2b8dd19cf3, 0x0, 0x22c35f43afc49a04, 0x267ff348a27461d3, 0x4a5f5d7ebb83d89c, 0x100000000000000002481d409cb1131a6, 0x25d13d57845635a3e479c501, 0x4bf3cea4d7858ac08ea61048, 0xeb01baa639087890, 0x0, 0xbf474987bdb67ad514ce70d, 0x25fa6f5fd0491ecf3c292ad7, 0xc7fdc6797752a36f, 0x0, 0x7c6ad3604c315150, 0x100000000000000002bc61778337cab95, 0xa8c3d96ce6c35e35, 0x79d7ca1b47402407, 0xc67a7a0c9df3fdf85ec5e7bb, 0x5670672aadc54cf37a60ad0f, 0xa123dd3cd9abff2, 0x0, 0x7df5d7f0d76e984c5f7c7d1b, 0x28ea2c9960be29367b03d650, 0x217ad558610431f, 0x0, 0x4dcbb5eb0dd68cef, 0x85c36b384754ae7e, 0x100000000000000006cb2ed250bb203bb, 0x100000000000000004be1fd4931e473e2, 0x5d40472f64481ec66b6dfdcb, 0xd9d5a457d4f31dcc2466d69c, 0x449dc00f6eae442, 0x0, 0x6c92237c0eb59cbc2c25069c, 0x11d28a7835aabe323b14a8c6, 0x921e2140e6ae64cd, 0x0, 0x1000000000000000065147afbdc695a04, 0x10000000000000000018d0e419fe453c3, 0x1000000000000000032ded75d2eb0eb80, 0x10000000000000000ee7c926d371453c4, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x1c835913f9cca4833f4dee66, limb1: 0x192924721b46c95f86539366, limb2: 0xb6324fc7eea725e5, limb3: 0x0, }, y: u384 { limb0: 0x1655ccd2f516c24c8b23cd23, limb1: 0x5a78708d282fbf676e9eafa4, limb2: 0x8f71e12b03a69c94, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256K1_11P() { let mut data = array![ 0xb, 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0xfdfdc509f368ba4395773d3a, 0x8de2b60b577a13d0f83b578e, 0xc2dd970269530ba2, 0x0, 0x589fa250d638e35400c12ddf, 0xb3aac19fcb5095808402aa7f, 0xed6de6590d0195d1, 0x0, 0x2965eeb3ec1fe786a6abe874, 0x33e2545f82bb6add02788b8e, 0xf586bc0db335d7b8, 0x0, 0x155b35991489db2fdf4de620, 0xf24ce461346a182d67eeccf0, 0xb4122bb4b37cc7d5, 0x0, 0x12815740835b12f70b96c66f, 0xbfa76a8b80aec9f2e31c40cc, 0xcd8a26d17d33c7c1, 0x0, 0x9a8f496f09402b8fd6beb89b, 0x28e48918dad2123d7f202bef, 0xcdd11b6ffb3f8614, 0x0, 0xb5076be8537cff2a42c6db68, 0x1066d40cbd01a3752e4e069c, 0x123ec2fd302cb0f9, 0x0, 0xc85f5e5efdf415f8081bf53f, 0xadc5010e9d9ac6c64000d33d, 0xf81314011d8852e4, 0x0, 0xd5915098d3d2001310b0b935, 0x88bb4507ebf1be82cfba2397, 0x8a463f1c00ce885f, 0x0, 0x414858f8a83f9d4498890137, 0xa09c4658c47ace74c42cdb60, 0x8aaf300ff3ab7d98, 0x0, 0x1772eb803ddc8a82e23b1c05, 0xc26baeb89b03fd69eb64b337, 0x4ea7131b2d873a45, 0x0, 0xc9d16330db15efd90235eed9, 0x1b586ef360673d36baa16189, 0xee652d2b848ad111, 0x0, 0x68f9e7942638253f3b596f1f, 0xb37e6153d9accd97a344f384, 0xda48eae9ff614551, 0x0, 0xc58be8ed857035b34f51c620, 0x3b14ed53116cb7c1db000006, 0x7dfa292fe99b77dd, 0x0, 0xf7f7bd2513c1b31de932bbd2, 0x627e2fa74b7ac891f7d555c7, 0x7f8a094f818e7192, 0x0, 0x9b47b9326b668e62071faf18, 0xe21058cb6937afa89be6931a, 0x21a4bfb4cce2ac8c, 0x0, 0xaf4ad4d7d582b10b14c97e6c, 0xadf808c85e766e997e470fd0, 0x2714571e587ce46d, 0x0, 0x86a7815dad7e8a53b19fee2, 0x1922fc1efcc51e68146ffa1b, 0x9e19b7c1f886488e, 0x0, 0x17bc74c409191a2b2249d987, 0xf4fe5f79db38f3064f7d093e, 0x3536ce04295e2a42, 0x0, 0xb1d36a10f008c1c24de1ad7d, 0xa4f2190c71ee5e0ff07c48f8, 0x21c1a2d4cfff3233, 0x0, 0xb, 0x101fbcccded733e8b421eaeb534097ca, 0x38c1962e9148624feac1c14f30e9c5cc, 0x247a8333f7b0b7d2cda8056c3d15eef7, 0x1759edc372ae22448b0163c1cd9d2b7d, 0xe005b86051ef1922fe43c49e149818d1, 0x7d41e602eece328bff7b118e820865d6, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x552f233a8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x8c1745a79a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x5129fb7c6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x870e15c2fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0xadc0da7a16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x148b2758d7ab792809e469e6ec62b2c8, 0xd450fe4aec4f217bb306d1a8e5eeac76, 0xd67e55fd642bfa42aef9c00b8a64c1b9, 0x85940927468ff53d864a7a50b48d73f1, 0x37176e84d977e9933c49d76fcfc6e625, 0x2, 0x7a385b48241ff9b7472584bc, 0xfb86d85d87b00caed733ad64, 0xa1b750a9ad42265e, 0x0, 0x3c91608638f07e6b127effa, 0xbeb39c70848314492f0b1e9c, 0xba02c3181f197560, 0x0, 0x8950a7e57cb188c3, 0x915677115b4cd35f, 0x10000000000000000adff605ec8f8e9b5, 0x10000000000000000ebfc6d2272e97ea1, 0x17404de3e819f065de7c1017, 0x536d661a4644833c20a0cb4, 0x1f70dd88b20f7871, 0x0, 0x1aaa9311df61995c80ac577e, 0xa164780ea8788997ea2c423f, 0x83592576e08cd1fc, 0x0, 0xa5060dbc57d602fe, 0x6914b48dc0c5534, 0x1b984728b0823ac8, 0x10000000000000000040e1ff5866bad1f, 0x20ff56624796b65fd048677d, 0xe383e9098b0d38b210aecacc, 0xc935268d99a6ed4f, 0x0, 0xa4c981a051c154841b31dd75, 0x13a468f6a24a22757a8a9380, 0x3d65cc664e17a287, 0x0, 0x100000000000000007cbe66bb133fe6dc, 0x10000000000000000f0156c908c9d979c, 0x6b7c419ad9ed10d3, 0x1007811bd8c66050, 0x72ce4e4dc43d1db4a97b15eb, 0x9ac63f1462d8befc6ff716f2, 0xdd1b010de89e6bc9, 0x0, 0xc040c8c28bb16bed1cb5c089, 0xdb44fcda4787ab558fea8dd4, 0xd22d7176551ddc90, 0x0, 0x100000000000000001ee58c7660c5446b, 0x6ec3e8f177762e53, 0x100000000000000004538bd9c129bed52, 0x10000000000000000680a1770588f346e, 0xd7ed39d04214f124fb9a5454, 0x86156f125d3f2fd0836c41f4, 0x5b9651563d384ca0, 0x0, 0x1b663c9b6d949019c972b35f, 0x57c5020ee6fa7595d7ff9733, 0x34a8daa071411071, 0x0, 0x31b70045caadb0df, 0x3c110d9c03771d4f, 0x10000000000000000d3c49e4016b7ecb4, 0x10000000000000000cc890a6969b1a6e8, 0xfd20e510eb06b6b6cd26caa1, 0x4ed7a07b13deb87f778930b1, 0xf32b6d3cca1243b3, 0x0, 0x3cc0c83359b0da6a89b90f6f, 0xcc2ad62f07d5162679f1aead, 0xfab1a759721ba470, 0x0, 0x22c35f43afc49a04, 0x267ff348a27461d3, 0x4a5f5d7ebb83d89c, 0x100000000000000002481d409cb1131a6, 0x7ab94096eb99e777f21f264a, 0x2833b6cb1e9b57aca3255927, 0xe9577cffafa96848, 0x0, 0x211e8205578e14223b57d0e, 0x7524d5e57dfb8062ee504b92, 0x699257546ab9c7fc, 0x0, 0x7c6ad3604c315150, 0x100000000000000002bc61778337cab95, 0xa8c3d96ce6c35e35, 0x79d7ca1b47402407, 0xaa1d36523b9bbf173e28862b, 0x5cef005c976b645423a14da0, 0x5457f1479f27d0c4, 0x0, 0x6e15d05091cef49e6e490159, 0xebc02df9a0a4608fe67588c1, 0x23eaba74cbb63d26, 0x0, 0x4dcbb5eb0dd68cef, 0x85c36b384754ae7e, 0x100000000000000006cb2ed250bb203bb, 0x100000000000000004be1fd4931e473e2, 0x910d0a96046e92b7cd582798, 0xbff23854f39adfd43e26c5d4, 0xb51e917d6c662c76, 0x0, 0x292829fd70bf0df94c146d72, 0xdca27ae811d3ebc462421967, 0x1b2a813516fdba2c, 0x0, 0x1000000000000000065147afbdc695a04, 0x10000000000000000018d0e419fe453c3, 0x1000000000000000032ded75d2eb0eb80, 0x10000000000000000ee7c926d371453c4, 0xe5fe5d19f302b11f287cc8be, 0x247647c30315ec0eb6056189, 0x9de7876737227ed5, 0x0, 0xf98723a6e18a798271d5b545, 0x58f73113c3451ed86535f3f2, 0x7c4449246418862d, 0x0, 0x100000000000000000139803cda63f3ba, 0x1000000000000000016b7cf2653dc74a8, 0x1089abd09e19fd5df, 0xc69eeeb967755694, 0xfdaa8c8434c1fdf1f6736acd, 0xbb1563781b62fc9b97ec831c, 0x4a33d42ad138f3ae, 0x0, 0x61cfb29de0788d394e459f95, 0x4c2cf12dc88f92c32a6186ae, 0xa44f474e566f0d73, 0x0, 0x4f62e61d803963a6, 0x6f08b65992670489, 0x67cea05dbb9a909d, 0x96fb2bd0b03403bc, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x64fc5a7a1dbb0ded5877d244, limb1: 0x690efd6ba8db4b9093e04859, limb2: 0x4a95e2ad2036bb89, limb3: 0x0, }, y: u384 { limb0: 0x787161946cccf45a982322c8, limb1: 0xfb559d2c2a26b632cf7c2894, limb2: 0x4ed9af33445b7a3f, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256K1_12P() { let mut data = array![ 0xc, 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0xfdfdc509f368ba4395773d3a, 0x8de2b60b577a13d0f83b578e, 0xc2dd970269530ba2, 0x0, 0x589fa250d638e35400c12ddf, 0xb3aac19fcb5095808402aa7f, 0xed6de6590d0195d1, 0x0, 0x2965eeb3ec1fe786a6abe874, 0x33e2545f82bb6add02788b8e, 0xf586bc0db335d7b8, 0x0, 0x155b35991489db2fdf4de620, 0xf24ce461346a182d67eeccf0, 0xb4122bb4b37cc7d5, 0x0, 0x12815740835b12f70b96c66f, 0xbfa76a8b80aec9f2e31c40cc, 0xcd8a26d17d33c7c1, 0x0, 0x9a8f496f09402b8fd6beb89b, 0x28e48918dad2123d7f202bef, 0xcdd11b6ffb3f8614, 0x0, 0xb5076be8537cff2a42c6db68, 0x1066d40cbd01a3752e4e069c, 0x123ec2fd302cb0f9, 0x0, 0xc85f5e5efdf415f8081bf53f, 0xadc5010e9d9ac6c64000d33d, 0xf81314011d8852e4, 0x0, 0xd5915098d3d2001310b0b935, 0x88bb4507ebf1be82cfba2397, 0x8a463f1c00ce885f, 0x0, 0x414858f8a83f9d4498890137, 0xa09c4658c47ace74c42cdb60, 0x8aaf300ff3ab7d98, 0x0, 0x1772eb803ddc8a82e23b1c05, 0xc26baeb89b03fd69eb64b337, 0x4ea7131b2d873a45, 0x0, 0xc9d16330db15efd90235eed9, 0x1b586ef360673d36baa16189, 0xee652d2b848ad111, 0x0, 0x68f9e7942638253f3b596f1f, 0xb37e6153d9accd97a344f384, 0xda48eae9ff614551, 0x0, 0xc58be8ed857035b34f51c620, 0x3b14ed53116cb7c1db000006, 0x7dfa292fe99b77dd, 0x0, 0xf7f7bd2513c1b31de932bbd2, 0x627e2fa74b7ac891f7d555c7, 0x7f8a094f818e7192, 0x0, 0x9b47b9326b668e62071faf18, 0xe21058cb6937afa89be6931a, 0x21a4bfb4cce2ac8c, 0x0, 0xaf4ad4d7d582b10b14c97e6c, 0xadf808c85e766e997e470fd0, 0x2714571e587ce46d, 0x0, 0x86a7815dad7e8a53b19fee2, 0x1922fc1efcc51e68146ffa1b, 0x9e19b7c1f886488e, 0x0, 0x17bc74c409191a2b2249d987, 0xf4fe5f79db38f3064f7d093e, 0x3536ce04295e2a42, 0x0, 0xb1d36a10f008c1c24de1ad7d, 0xa4f2190c71ee5e0ff07c48f8, 0x21c1a2d4cfff3233, 0x0, 0xef493bf7016f192140ec0c20, 0x489bc5a24a83819834b3c08c, 0xcccdd6728670ed1e, 0x0, 0xb2d8f23e9b244453602fae5a, 0x76fafc92aa2ea44429a3050e, 0xc6c6fb7c62dc6c2f, 0x0, 0xc, 0x247a8333f7b0b7d2cda8056c3d15eef7, 0x1759edc372ae22448b0163c1cd9d2b7d, 0xe005b86051ef1922fe43c49e149818d1, 0x7d41e602eece328bff7b118e820865d6, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x552f233a8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x8c1745a79a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x5129fb7c6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x870e15c2fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0xadc0da7a16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x148b2758d7ab792809e469e6ec62b2c8, 0xd450fe4aec4f217bb306d1a8e5eeac76, 0xd67e55fd642bfa42aef9c00b8a64c1b9, 0x85940927468ff53d864a7a50b48d73f1, 0x37176e84d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x467437419466e4726b5f5241f323ca74, 0xa425799aa905d7507e1ea9c573581a81, 0xfb82860deabca8d0b341facdff0ac0f1, 0x2, 0xa87e6d457192ad65d259e791, 0x9228287912a17822cfae6f8f, 0x622e90ac5ea25d59, 0x0, 0xef651884d008a32a2d116a87, 0xbdc4cdc9a1445b7005e4b44c, 0xdf1337bf8228bb28, 0x0, 0xa5060dbc57d602fe, 0x6914b48dc0c5534, 0x1b984728b0823ac8, 0x10000000000000000040e1ff5866bad1f, 0x48ff078b363f5d94cc9f63eb, 0x115c8cf2a38d0da440ebcbae, 0x1b816a5e72b58557, 0x0, 0xfb6369ff14a7b85e6d35f7bf, 0x4e00e50aca1aa90a598bd7b3, 0x8e70e3f336057410, 0x0, 0x100000000000000007cbe66bb133fe6dc, 0x10000000000000000f0156c908c9d979c, 0x6b7c419ad9ed10d3, 0x1007811bd8c66050, 0x8780bf2048f368173bec0c07, 0x5be44a71954e17bc36eccfd5, 0x4236fb0e86bcdf32, 0x0, 0x8ec2eb1532b2b96c14bebef9, 0x7b980c967373d71a38ebf92, 0xb4336cf34bb238f5, 0x0, 0x100000000000000001ee58c7660c5446b, 0x6ec3e8f177762e53, 0x100000000000000004538bd9c129bed52, 0x10000000000000000680a1770588f346e, 0x2b4f07edf389acd027af1e2b, 0xab8850651076565399b13fb, 0x501f99d468b51a7e, 0x0, 0x8d3259be568e4af9d34e488a, 0x11366602fb75ddb2a230c632, 0x2eb403dd3d7fa0e8, 0x0, 0x31b70045caadb0df, 0x3c110d9c03771d4f, 0x10000000000000000d3c49e4016b7ecb4, 0x10000000000000000cc890a6969b1a6e8, 0xf1d15e674b76c9d0cb85672c, 0x2e8098be6d52b92e20c98bab, 0x8acdee9ae1736d12, 0x0, 0x24f1249583774bb75801caa3, 0xaead17e1dc834bd1a624ac48, 0x6a22bf5e98d9d9b7, 0x0, 0x22c35f43afc49a04, 0x267ff348a27461d3, 0x4a5f5d7ebb83d89c, 0x100000000000000002481d409cb1131a6, 0x3494a03c71f4399881fd8880, 0x6ac1b4b6ca039c3d1286e70e, 0xf2d9a056ea050a57, 0x0, 0xeaf37f80878445372361b216, 0xd41e8bc2aadf12bbc38751ef, 0xa79a8a4e997661e5, 0x0, 0x7c6ad3604c315150, 0x100000000000000002bc61778337cab95, 0xa8c3d96ce6c35e35, 0x79d7ca1b47402407, 0x6b284c5645d14cd1e45ce41d, 0xef7365195e7be14a08d63f9, 0x79ebfed96dcb4d8c, 0x0, 0xa32f8ed8fc4e2819dbf5d354, 0xbe62aa24eb445342493fb1c4, 0xdcc7ad508612f5f4, 0x0, 0x4dcbb5eb0dd68cef, 0x85c36b384754ae7e, 0x100000000000000006cb2ed250bb203bb, 0x100000000000000004be1fd4931e473e2, 0x13b1bbb13f7da105749db0c7, 0x65d1c3c7fbdeb2befeb39fec, 0x24e9141cf844f065, 0x0, 0xfbb506c8ebd4fc51735b3359, 0x6319c6fb9d75f3f8d0fb8575, 0xc49721294a562789, 0x0, 0x1000000000000000065147afbdc695a04, 0x10000000000000000018d0e419fe453c3, 0x1000000000000000032ded75d2eb0eb80, 0x10000000000000000ee7c926d371453c4, 0x93c576094dc85b72f72c8832, 0x654b95f3c73106a0d4381f75, 0xd731fce177c83fd9, 0x0, 0xabbb1b3a35e3d538325af014, 0x259217577cc285a6b83953ee, 0x6383caf5d18c3339, 0x0, 0x100000000000000000139803cda63f3ba, 0x1000000000000000016b7cf2653dc74a8, 0x1089abd09e19fd5df, 0xc69eeeb967755694, 0xfb261e5abbce9c6f9a27475e, 0x60775102ab55d73e343fc464, 0x92ed6dd8fd0f867a, 0x0, 0xf5668dbab0802c48eca685fb, 0xe0ee5cbcf3dda9b624126e28, 0xd133f8ecb79a5748, 0x0, 0x4f62e61d803963a6, 0x6f08b65992670489, 0x67cea05dbb9a909d, 0x96fb2bd0b03403bc, 0xdb5b96b385bbefcb8a8381ba, 0x356746189fa0ba9f09af67fb, 0xb0aa6be9137e6b04, 0x0, 0x504768e8026a92690411fdf1, 0x8f2862bfadfa61b926a651c7, 0xa2b129ae94ecfbc0, 0x0, 0x903c783ffbbcfae, 0x10000000000000000a9647c65c4885765, 0x100000000000000004b4be4ce034de996, 0x8fc19cd46a492745, 0x278a81bdcc0f4f0f1b17c004, 0xf44d7e6bc07af6f2ee512475, 0x999ae67b5d65554a, 0x0, 0x6f57b1bfa3ea31cc6d8812f7, 0x709574ee1724876336af416d, 0x6b54f96429ec82f6, 0x0, 0x984e110d1ee38dcc, 0x1000000000000000004d4f2a3b925c2b8, 0x1000000000000000008b29d4fa5dec6e5, 0x100000000000000004e45715b78d9bfec, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x37558e45b8041762de768836, limb1: 0x5d514037c232b89fb7a06905, limb2: 0x2515485638a3a199, limb3: 0x0, }, y: u384 { limb0: 0xb85967bc1c9cde890f6a236f, limb1: 0xeece653858fb74a34a817724, limb2: 0x71995703660dd489, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_ED25519_1P() { let mut data = array![ 0x1, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x1, 0xb4862b21fb97d43588561712e8e5216a, 0x4b3e865e6f4590b9a164106cf6a659e, 0x4, 0x62c2b89a3152e22243cf864d, 0xaf83913cf31609fd7b4f9a32, 0x6da9a48b077c3954, 0x0, 0xa54703c64365ab4373eae904, 0x87e47f46101c003371e14338, 0x462e50d88b5b5c17, 0x0, 0x21ef407bea1953254c1bc318a0af2527, 0x1c147c0993c84eed5f426b94b3350045, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x62c2b89a3152e22243cf864d, limb1: 0xaf83913cf31609fd7b4f9a32, limb2: 0x6da9a48b077c3954, limb3: 0x0, }, y: u384 { limb0: 0xa54703c64365ab4373eae904, limb1: 0x87e47f46101c003371e14338, limb2: 0x462e50d88b5b5c17, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_ED25519_2P() { let mut data = array![ 0x2, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x82e4a33f8e4e5881e791d86b, 0xbcb062435ae8ec5fdaeac4bf, 0x179e1bae9e0f9f34, 0x0, 0x19657783ba5660e255c21849, 0x7ed7474bcea7551fc71e46bc, 0x596c0a76b75f4756, 0x0, 0x2, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0xa90f9c3af19922ad9b8a714e61a441c, 0xeb2083e6ce164dba0ff18e0242af9fc3, 0x2fc154703983ca8ea7e9d498c778ea6, 0x4, 0xcd7471596402adb99c204f6a, 0x71072cc6a799ca5492c35787, 0xaaecc4b08ca80c, 0x0, 0x9df62dff1b19647a74925491, 0xcff3a8ebb8f88bfdab94c62, 0x7561a9c9a4e6450a, 0x0, 0x211c4f690d00cb3af0b34c381ddf6429, 0x10dbbf233e0f266b14c85329c2440c426, 0x20b84e815be93309f3490609, 0xcddf2646d9499c09fa01ac80, 0x47a3d45b5433479c, 0x0, 0x257b7612e4301ed9448341a6, 0x4f3236c077377add9253d652, 0x3b0d15e6632e50c, 0x0, 0x3242668a77ced3cb6ca4b87c1b759c91, 0x128e825972592d2a632df711368a1c105, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x78cd6990a813b6a2588ccb19, limb1: 0xcb57433fd1eaa5787491656f, limb2: 0x70e4c58e64e4a9f3, limb3: 0x0, }, y: u384 { limb0: 0x428873cad69986b7befbd0f0, limb1: 0x5dde16f78dd45ec0c5a51f9d, limb2: 0x67295fe953f1c748, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_ED25519_3P() { let mut data = array![ 0x3, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x82e4a33f8e4e5881e791d86b, 0xbcb062435ae8ec5fdaeac4bf, 0x179e1bae9e0f9f34, 0x0, 0x19657783ba5660e255c21849, 0x7ed7474bcea7551fc71e46bc, 0x596c0a76b75f4756, 0x0, 0xa6832ef7fe97f77de7cd9a62, 0xf18a70dbf1dc5a76c685da4a, 0x6ac1b7bfc409119f, 0x0, 0x7751161b1a9ef600b865a5af, 0xed28aad4835a39a9e8318ceb, 0x572e95c429f0e07a, 0x0, 0x3, 0xeb2083e6ce164dba0ff18e0242af9fc3, 0x2fc154703983ca8ea7e9d498c778ea6, 0x101fbcccded733e8b421eaeb534097ca, 0x71832c59148624feac1c14f30e9c5cc, 0x247a8333f7b0b7d2cda8056c3d15eef7, 0x2eb3db872ae22448b0163c1cd9d2b7d, 0x4, 0xac2b5804f3b5ea6a7c385142, 0x67878b88a9a9d518e06d811c, 0x4549187a243009c8, 0x0, 0x77b113304bc4ddbb1d09761d, 0xdeac72115bc7d3e18f4a0a72, 0x52c6b8f99ceb4be4, 0x0, 0x3242668a77ced3cb6ca4b87c1b759c91, 0x128e825972592d2a632df711368a1c105, 0xd4eecb0109a013892abd75e5, 0x167aa57abaa882be1301e3dd, 0x2457e48112697980, 0x0, 0xb26742ddc3687f7d8983bc6e, 0xc6eb0f3fd431dccb4cd39680, 0x31fb690012ae0317, 0x0, 0x25b58a4ace1755dfa44b5f1f5d91fdcb, 0x23fa824d04875112a551d6ef70fef39, 0x6444144efd61c928f158778, 0x90d9eaffbf7e696c0b22614, 0x6879c7c3d7314db0, 0x0, 0xd6ae7f02956e20ce1359317d, 0x3545b77c84a0952ba44fa34, 0x54c416a35489a439, 0x0, 0x46f42706c0113ff0ccf72fe8f742fd2, 0x1035b8cd8e980519d9ab6ef3f50ee8fa9, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x9292b7770106624b91a73738, limb1: 0x2c9a7c1a0496485effe3922e, limb2: 0x7cc025fefaaec43f, limb3: 0x0, }, y: u384 { limb0: 0x44e571d5378b2d6e5b1d7114, limb1: 0x5d34cb1a17260d862ef07e73, limb2: 0x3d6ee7ee0c8df451, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_ED25519_4P() { let mut data = array![ 0x4, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x82e4a33f8e4e5881e791d86b, 0xbcb062435ae8ec5fdaeac4bf, 0x179e1bae9e0f9f34, 0x0, 0x19657783ba5660e255c21849, 0x7ed7474bcea7551fc71e46bc, 0x596c0a76b75f4756, 0x0, 0xa6832ef7fe97f77de7cd9a62, 0xf18a70dbf1dc5a76c685da4a, 0x6ac1b7bfc409119f, 0x0, 0x7751161b1a9ef600b865a5af, 0xed28aad4835a39a9e8318ceb, 0x572e95c429f0e07a, 0x0, 0x5e71d0fc5d1c016834779173, 0xadd002dfc0ebf1b25c23c252, 0x40a868d928ae5233, 0x0, 0x423fa293418d6e3f59c2e830, 0x7a4bcf26f93e71ffd903e68e, 0x7837b851ad8da6e3, 0x0, 0x4, 0x101fbcccded733e8b421eaeb534097ca, 0x71832c59148624feac1c14f30e9c5cc, 0x247a8333f7b0b7d2cda8056c3d15eef7, 0x2eb3db872ae22448b0163c1cd9d2b7d, 0xe005b86051ef1922fe43c49e149818d1, 0xfa83cc0eece328bff7b118e820865d6, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0xaa5e4678c25166a1ff39849b4e1357d, 0x4, 0x338e295a7da6c8dc47afeb59, 0x93a4ff4ae149504868278a09, 0x418e9170913c0f5b, 0x0, 0x5b20ca7e0ef2c05cc66e6a84, 0xdc8feaa2fc336cdbce46f0fa, 0x5e556f7c5bd833ed, 0x0, 0x25b58a4ace1755dfa44b5f1f5d91fdcb, 0x23fa824d04875112a551d6ef70fef39, 0xdf877be8a80fdde7e3b855b0, 0x91e54f2f86bd9262717e6b75, 0x7062334bd4c7b885, 0x0, 0x9320d417f7513821af6e0284, 0x96ed52f40e0c8b60098260d8, 0xf8afa50615dfd75, 0x0, 0x46f42706c0113ff0ccf72fe8f742fd2, 0x1035b8cd8e980519d9ab6ef3f50ee8fa9, 0xfeec5e7debf32dad5e019ae9, 0x8bf005c9328632982aeaeed2, 0x1933fdb9e8d9ea7a, 0x0, 0x56826fcbe77185341a6d2b8f, 0x69cbccb406ae88585a522de9, 0x76fc50497be174d7, 0x0, 0x25f8e65eae4eb72e4febaca4a978a32e, 0x3138e75e7839c1e424a845740cd897e1, 0xa2afdf272784379c88d18a53, 0x15e4f535a988eb9702bc3741, 0x2317d852a07769d1, 0x0, 0x29cd9f41fe12ae23c14fe282, 0x85611a868445899f82b3529c, 0x676eb93f52742f3f, 0x0, 0x1efc8eeeff5d60d288b61287fc750073, 0x1205819efd721c8fa9d99528aa8086dd8, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x54e30b1dbc54acd91542088c, limb1: 0x702b532dab377f0636d9f465, limb2: 0x25ee2efd1d7ca3f6, limb3: 0x0, }, y: u384 { limb0: 0xd25f547d7c2f7258cbdb9c6b, limb1: 0xcae4d4cae9a1aba26935de1e, limb2: 0x277ff10c5815321e, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_ED25519_10P() { let mut data = array![ 0xa, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x82e4a33f8e4e5881e791d86b, 0xbcb062435ae8ec5fdaeac4bf, 0x179e1bae9e0f9f34, 0x0, 0x19657783ba5660e255c21849, 0x7ed7474bcea7551fc71e46bc, 0x596c0a76b75f4756, 0x0, 0xa6832ef7fe97f77de7cd9a62, 0xf18a70dbf1dc5a76c685da4a, 0x6ac1b7bfc409119f, 0x0, 0x7751161b1a9ef600b865a5af, 0xed28aad4835a39a9e8318ceb, 0x572e95c429f0e07a, 0x0, 0x5e71d0fc5d1c016834779173, 0xadd002dfc0ebf1b25c23c252, 0x40a868d928ae5233, 0x0, 0x423fa293418d6e3f59c2e830, 0x7a4bcf26f93e71ffd903e68e, 0x7837b851ad8da6e3, 0x0, 0x5907087f8e8e4dacdd039371, 0xc390e2073b4e64b9ede0570d, 0x6b039a85962f1594, 0x0, 0xc45eefa03155b8f7eb780b42, 0x3db57eb22f9b0394a4d7b78e, 0x6cf45b6d90883f60, 0x0, 0x60dd8ed0a614b596fb37eb1f, 0xabb99f371be41e26ec2d8e4b, 0x187ecd72c40f159d, 0x0, 0x7b66c9263de5e1663622985d, 0x118b032cc27a1d6dd192eca6, 0x312fb405788616e8, 0x0, 0xf4ac3e1f1f068dd64c86fdda, 0x24594e591d82a7f964b5ec9f, 0x6ca311b5421c57fc, 0x0, 0x42745cd7b146012455434d0f, 0x6aa4f552b7bdc93a613bd9df, 0x5832a065d7199c7a, 0x0, 0x341786b7854e3e0104e2e416, 0xbb368441c295043bee7b1d2f, 0x35c88542e11463b4, 0x0, 0x3c36e7fcc4e2fde28308132, 0xf58043d0e3d1a36d1f8137fc, 0x58c1508fbe8868a8, 0x0, 0x560a37951d69a6c8d7138239, 0x462d454a509846714184ef71, 0x3aaf8fb4f60e3e9c, 0x0, 0xb70cea4e13db5322899753f9, 0x6c62656b6d7ffb5c2af44fd5, 0x4b5ae4567dc6a7c0, 0x0, 0xb06cccb4b425d5179f528270, 0xce017c281a3861570706cd86, 0x42d14846dc4860ab, 0x0, 0x646bf486f6e77663c597ece8, 0xd87c8c36a430a6fe42305b88, 0x7964c7742b6f13da, 0x0, 0xa, 0x2648ee38e07405eb215663abc1f254b8, 0x29164ebd7ab792809e469e6ec62b2c8, 0x85940927468ff53d864a7a50b48d73f1, 0x6e2edd0d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x8ce86e89466e4726b5f5241f323ca74, 0x30bcab0ed857010255d44936a1515607, 0x8ac57cfbb42e0b20426465e3e37952d, 0x5f3f563838701a14b490b6081dfc8352, 0xda2ddc3552116dd2ba4b180cb69ca38, 0xc87a746319c16a0d0febd845d0dfae43, 0x7003168b29a8b06daf66c5f2577bffa, 0x176ea1b164264cd51ea45cd69371a71f, 0x3b6a666fb0323a1d576d4155ec17dbe, 0x9edfa3da6cf55b158b53031d05d51433, 0x23d79a9428a1c22d5fdb76a19fbeb1d, 0x4d125e7fa59cec98126cbc8f38884479, 0x1f40f472e2950656fa231e959acdd98, 0x98b33c6e0a14b90a7795e98680ee526e, 0xc8555a9fcfcfa81b306d70019d5f970, 0x4, 0xb51ed06dd615b64d198d6b40, 0xc6014a9ec6d192c15f73d83, 0x4236ece07ab7f046, 0x0, 0x8f62a668da7f4862606fc8ee, 0xc2af7ed7c76e0384d7f30cb1, 0x2ee4a538de1cb3e1, 0x0, 0x109e48ca918759429cee2d75a919bf, 0x254dce38863be7379de4e89912d39a24, 0xd64052a1c3dddd0acfc5f6de, 0x81b4284ddeec997a06f7adbb, 0x2a3e2e0b8b6db118, 0x0, 0xeb1fb40ed774d5a5a932cbcd, 0x69a12cf14a2add045b8a6b2a, 0x5b9b707cde7cba42, 0x0, 0x62af3a314ed8541630e74b78e9f03a0, 0x3e5106e138112347fd7dbb662f3fb959, 0x76a17d0e9a7acdde761cf17e, 0x9df10374167580666440f792, 0x71e338c631665afe, 0x0, 0xa37e8ec892cfd84673ff810f, 0x4ff99d688a4d76e5fae62c7c, 0x10ab842e4b509be8, 0x0, 0x100999da2383a787fc58bce955201c59, 0x2d492fcea91c7b9e8fa3931db543fa13, 0x9c40d5ca5c4f37890bb899f8, 0x39b20e332317d1cc680cac6b, 0x2c9116e237dcd2c2, 0x0, 0xee4f6acf3ccd375ceb6fda83, 0x82a46494eb678a382d67337b, 0xa451fa8fc325a99, 0x0, 0x2be10b93bdf768ae7778b99191b2cf05, 0x19d5b37430b75b04d20856a7ba530478, 0xde61d931ad4af1b6aa3b7420, 0xebfb852ab0963b3bd6b97d01, 0x62f2626356a4e691, 0x0, 0x311bab2cac0350b9be3e7c11, 0x213c4209753d44f212a6085f, 0x7ef9ef4df118cf30, 0x0, 0x306359e58443dc9fa7b677c05b67bc03, 0x22f5c652ce175682bece3c707b7f0c64, 0xc22428dd359a4d97677d1a2a, 0x6a403588ae0f11e6852c9003, 0x265ca2a9c81b7fcd, 0x0, 0x41e8bf26a5f61a80ed2a1a4f, 0x4816633adc2e1a1ecbdefd13, 0x78d97cf47703cd10, 0x0, 0x1af8531e7421e1b5fc3f282922950413, 0x12802c684a9d9ebd5f6c8d17c2c0dce9a, 0xf78d57c527f35f5b17341ad, 0x9b93fae1633f0f504ea60e41, 0x23373872d46eb70b, 0x0, 0x654177c81ab44be525fc8a10, 0xcf56847d39c0dc1808c5626c, 0x692fda489d9ad018, 0x0, 0x3e15cff10f1609922ab32f8f9278107, 0x10a16e8bfef9be00041b12d3df0ab90d2, 0x32ffdcb0ebe78606cfda3864, 0x810f43c0463b6222100c039d, 0x2676d3d3af79c942, 0x0, 0xe20135efdb9ce9d0b1f0b087, 0x16a1b8a19bb224519871ad10, 0x54b74ede0f974b53, 0x0, 0x2be5e02dea43047daaed4fbaf06fafca, 0x1de6096b4f0d2f729b2b56af6ca9e273, 0x1395db0ef36c4e2931f84d21, 0x27adbaec38ab1b5c362047ca, 0x39e135d80347ccff, 0x0, 0xddfc395884c79d27da8fb121, 0x3ed6197d9e6d701775f0b246, 0x4f49fa341a6be18, 0x0, 0x5e0ad7648a4f59729af8617b82d4b15, 0x1204a5942db3ff32572d539505799c162, 0xfed466728e21ebb6ec730686, 0x4c84b97d2b2b549c0205e93d, 0x6d18c143ec437b75, 0x0, 0x1375c64d45b624c9fcbbbfc7, 0xa154d66ebcc37fc1b61f1bd0, 0x35765a06dfd06c00, 0x0, 0x1bb625624ceab37b75f8eb6d9baaec37, 0x8869d6e2bfcd45999b706e500bdf6e9, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x9dd56ed7fdf1e5a3e9cbb3b5, limb1: 0xd0df8ca018c550bbd230f67, limb2: 0x75b3c38a01fed369, limb3: 0x0, }, y: u384 { limb0: 0xa1bb56d8c1b7c9598a692c1c, limb1: 0xc940b96f597931f22e3c4b07, limb2: 0x41ca6082f12494f3, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_ED25519_11P() { let mut data = array![ 0xb, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x82e4a33f8e4e5881e791d86b, 0xbcb062435ae8ec5fdaeac4bf, 0x179e1bae9e0f9f34, 0x0, 0x19657783ba5660e255c21849, 0x7ed7474bcea7551fc71e46bc, 0x596c0a76b75f4756, 0x0, 0xa6832ef7fe97f77de7cd9a62, 0xf18a70dbf1dc5a76c685da4a, 0x6ac1b7bfc409119f, 0x0, 0x7751161b1a9ef600b865a5af, 0xed28aad4835a39a9e8318ceb, 0x572e95c429f0e07a, 0x0, 0x5e71d0fc5d1c016834779173, 0xadd002dfc0ebf1b25c23c252, 0x40a868d928ae5233, 0x0, 0x423fa293418d6e3f59c2e830, 0x7a4bcf26f93e71ffd903e68e, 0x7837b851ad8da6e3, 0x0, 0x5907087f8e8e4dacdd039371, 0xc390e2073b4e64b9ede0570d, 0x6b039a85962f1594, 0x0, 0xc45eefa03155b8f7eb780b42, 0x3db57eb22f9b0394a4d7b78e, 0x6cf45b6d90883f60, 0x0, 0x60dd8ed0a614b596fb37eb1f, 0xabb99f371be41e26ec2d8e4b, 0x187ecd72c40f159d, 0x0, 0x7b66c9263de5e1663622985d, 0x118b032cc27a1d6dd192eca6, 0x312fb405788616e8, 0x0, 0xf4ac3e1f1f068dd64c86fdda, 0x24594e591d82a7f964b5ec9f, 0x6ca311b5421c57fc, 0x0, 0x42745cd7b146012455434d0f, 0x6aa4f552b7bdc93a613bd9df, 0x5832a065d7199c7a, 0x0, 0x341786b7854e3e0104e2e416, 0xbb368441c295043bee7b1d2f, 0x35c88542e11463b4, 0x0, 0x3c36e7fcc4e2fde28308132, 0xf58043d0e3d1a36d1f8137fc, 0x58c1508fbe8868a8, 0x0, 0x560a37951d69a6c8d7138239, 0x462d454a509846714184ef71, 0x3aaf8fb4f60e3e9c, 0x0, 0xb70cea4e13db5322899753f9, 0x6c62656b6d7ffb5c2af44fd5, 0x4b5ae4567dc6a7c0, 0x0, 0xb06cccb4b425d5179f528270, 0xce017c281a3861570706cd86, 0x42d14846dc4860ab, 0x0, 0x646bf486f6e77663c597ece8, 0xd87c8c36a430a6fe42305b88, 0x7964c7742b6f13da, 0x0, 0x52c487a17925c92335926072, 0x13155d04b743220ba9c4dd31, 0x1106c832e8e52057, 0x0, 0xbc69df5aa9a21ba08f160d5f, 0xc207c95ac5d454f546b05fc3, 0x574515b32b35f440, 0x0, 0xb, 0x85940927468ff53d864a7a50b48d73f1, 0x6e2edd0d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x8ce86e89466e4726b5f5241f323ca74, 0x30bcab0ed857010255d44936a1515607, 0x8ac57cfbb42e0b20426465e3e37952d, 0x5f3f563838701a14b490b6081dfc8352, 0xda2ddc3552116dd2ba4b180cb69ca38, 0xc87a746319c16a0d0febd845d0dfae43, 0x7003168b29a8b06daf66c5f2577bffa, 0x176ea1b164264cd51ea45cd69371a71f, 0x3b6a666fb0323a1d576d4155ec17dbe, 0x9edfa3da6cf55b158b53031d05d51433, 0x23d79a9428a1c22d5fdb76a19fbeb1d, 0x4d125e7fa59cec98126cbc8f38884479, 0x1f40f472e2950656fa231e959acdd98, 0x98b33c6e0a14b90a7795e98680ee526e, 0xc8555a9fcfcfa81b306d70019d5f970, 0xebe2136898c752051e01a934402d0baf, 0x6c2a492cc0f859aa6524ab713b7e05, 0x637e0edc5b6e4ae7a62081434fbaecc0, 0x4e8c1e4403d1f83a859890cd670f668, 0x4, 0x8d9da7701d08684a79c3c9a, 0x7b0faee9af3327934d090e7b, 0x151533e6a0b794f9, 0x0, 0xac7e4649ec69e08fa2aa440b, 0xd82ea8c5365beebbfc40ecc, 0x38290dcf3704f737, 0x0, 0x62af3a314ed8541630e74b78e9f03a0, 0x3e5106e138112347fd7dbb662f3fb959, 0x78f18f4fb87ce5e32a5ac01, 0x84e0525afbc64b068cb6e83f, 0x679bfbb0e8f543d, 0x0, 0x6fc9c69b7f2a72ee149372db, 0x5365848854ebf2c4cc13846c, 0x159f12f1f03023c3, 0x0, 0x100999da2383a787fc58bce955201c59, 0x2d492fcea91c7b9e8fa3931db543fa13, 0x9c5453b82378379d24968334, 0xfd07ecb3fa7e01e989a2c80e, 0x2abb3011d1e59739, 0x0, 0x70aab3462dc41390fb5d5945, 0x370b9445bf570bbc08f08c5e, 0x5a10e78a2d5b49fe, 0x0, 0x2be10b93bdf768ae7778b99191b2cf05, 0x19d5b37430b75b04d20856a7ba530478, 0xe20e3a8f807f193989382239, 0x3ab3cda492b3306dc2b43c41, 0x6c0baedb36072eff, 0x0, 0xd3c4bb13b9e5e81a81545d4e, 0xd51c83211a5f2730fbba7376, 0x4a495b6570c26a1e, 0x0, 0x306359e58443dc9fa7b677c05b67bc03, 0x22f5c652ce175682bece3c707b7f0c64, 0x6e30168d06be82ea3d69d68a, 0xda5ae968ed031509a07db5ea, 0x5762b3c39c6fe86f, 0x0, 0x74419c84014bf3e0732f88a3, 0x838840e4c0101d2d3541fb62, 0x74c06cf05074141d, 0x0, 0x1af8531e7421e1b5fc3f282922950413, 0x12802c684a9d9ebd5f6c8d17c2c0dce9a, 0xbb52092c3e73614686ee83b5, 0xf204cfa0ed9c00d274e448af, 0x588759dedfb95ed, 0x0, 0x13596038783eaa2228a4350d, 0x8ae684504a218717c9e052a4, 0x5bd31f41a2d7a4e4, 0x0, 0x3e15cff10f1609922ab32f8f9278107, 0x10a16e8bfef9be00041b12d3df0ab90d2, 0x8df66128d3c7762f2e4ddc59, 0x183a5335a9b651a5d1e85f56, 0x1619dd97c40a41f0, 0x0, 0x552c3d261e98b36a60543610, 0x24f4791bbcdc4290045ca9c, 0x3c7f7ce3551d7fdd, 0x0, 0x2be5e02dea43047daaed4fbaf06fafca, 0x1de6096b4f0d2f729b2b56af6ca9e273, 0xbf23cd7c25b12a0d92c6b1c2, 0x821033c574b23f4fbc286f90, 0xfa21edaab8d6f72, 0x0, 0xc9ac857dc9f3d10bbb9e967c, 0x644a0414354d3a76d9c25fdd, 0x51b76f634c812ae6, 0x0, 0x5e0ad7648a4f59729af8617b82d4b15, 0x1204a5942db3ff32572d539505799c162, 0xcf1ad31679ec4c27e3830f3a, 0xa017f3868f913c86551ad885, 0x314bccf1c49a9154, 0x0, 0x3fbe277240930e0039b24d90, 0x44c3f435ed00859eaef40526, 0xaf4e10850bd6cb6, 0x0, 0x1bb625624ceab37b75f8eb6d9baaec37, 0x8869d6e2bfcd45999b706e500bdf6e9, 0x9008bb2465decd0de32e352b, 0xde20aad12ffa049c38c36b98, 0x7f70d611ad868171, 0x0, 0xe1e028e0788998638bf9bac7, 0xfa52b231caf7768fab52216a, 0x597888666ca85946, 0x0, 0x4f7c63b27ca63da0b0528098af0dab, 0xf35e51f8509ab42e70f2e964b3fd8c, 0x93dd0836e7e13591e646d775, 0x165ef3a2c6f0a3c905a9eb74, 0x41d60538e230bb0, 0x0, 0xa8dc2a660b9336e923e82fd8, 0xf329310a470287aef66cbfc9, 0x5d6441cffa1f00d2, 0x0, 0x122200117465217fb53ec8140b91481, 0x13d5f8e8fedb409022970ed842b78a9c4, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x1518e158cd20a0734c8395d6, limb1: 0x9e542f72e122bba6f1c46e7, limb2: 0x74cb223a70d329c9, limb3: 0x0, }, y: u384 { limb0: 0x779bfa346b625483d1999346, limb1: 0xf6901ab1d5d3d000b7fb3634, limb2: 0x6898c5fa74d3665a, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_ED25519_12P() { let mut data = array![ 0xc, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x82e4a33f8e4e5881e791d86b, 0xbcb062435ae8ec5fdaeac4bf, 0x179e1bae9e0f9f34, 0x0, 0x19657783ba5660e255c21849, 0x7ed7474bcea7551fc71e46bc, 0x596c0a76b75f4756, 0x0, 0xa6832ef7fe97f77de7cd9a62, 0xf18a70dbf1dc5a76c685da4a, 0x6ac1b7bfc409119f, 0x0, 0x7751161b1a9ef600b865a5af, 0xed28aad4835a39a9e8318ceb, 0x572e95c429f0e07a, 0x0, 0x5e71d0fc5d1c016834779173, 0xadd002dfc0ebf1b25c23c252, 0x40a868d928ae5233, 0x0, 0x423fa293418d6e3f59c2e830, 0x7a4bcf26f93e71ffd903e68e, 0x7837b851ad8da6e3, 0x0, 0x5907087f8e8e4dacdd039371, 0xc390e2073b4e64b9ede0570d, 0x6b039a85962f1594, 0x0, 0xc45eefa03155b8f7eb780b42, 0x3db57eb22f9b0394a4d7b78e, 0x6cf45b6d90883f60, 0x0, 0x60dd8ed0a614b596fb37eb1f, 0xabb99f371be41e26ec2d8e4b, 0x187ecd72c40f159d, 0x0, 0x7b66c9263de5e1663622985d, 0x118b032cc27a1d6dd192eca6, 0x312fb405788616e8, 0x0, 0xf4ac3e1f1f068dd64c86fdda, 0x24594e591d82a7f964b5ec9f, 0x6ca311b5421c57fc, 0x0, 0x42745cd7b146012455434d0f, 0x6aa4f552b7bdc93a613bd9df, 0x5832a065d7199c7a, 0x0, 0x341786b7854e3e0104e2e416, 0xbb368441c295043bee7b1d2f, 0x35c88542e11463b4, 0x0, 0x3c36e7fcc4e2fde28308132, 0xf58043d0e3d1a36d1f8137fc, 0x58c1508fbe8868a8, 0x0, 0x560a37951d69a6c8d7138239, 0x462d454a509846714184ef71, 0x3aaf8fb4f60e3e9c, 0x0, 0xb70cea4e13db5322899753f9, 0x6c62656b6d7ffb5c2af44fd5, 0x4b5ae4567dc6a7c0, 0x0, 0xb06cccb4b425d5179f528270, 0xce017c281a3861570706cd86, 0x42d14846dc4860ab, 0x0, 0x646bf486f6e77663c597ece8, 0xd87c8c36a430a6fe42305b88, 0x7964c7742b6f13da, 0x0, 0x52c487a17925c92335926072, 0x13155d04b743220ba9c4dd31, 0x1106c832e8e52057, 0x0, 0xbc69df5aa9a21ba08f160d5f, 0xc207c95ac5d454f546b05fc3, 0x574515b32b35f440, 0x0, 0x4f068c66f642eed6b2a9cf28, 0x5cde9d21988aa8eed49fbe13, 0x5847165150f2b16b, 0x0, 0xdf6b306bce93c8248de1b0ab, 0x5d126993fea5de605b6d6f73, 0xb2fd0f2d63c2503, 0x0, 0xc, 0xd344749096fd35d0adf20806e5214606, 0x8ce86e89466e4726b5f5241f323ca74, 0x30bcab0ed857010255d44936a1515607, 0x8ac57cfbb42e0b20426465e3e37952d, 0x5f3f563838701a14b490b6081dfc8352, 0xda2ddc3552116dd2ba4b180cb69ca38, 0xc87a746319c16a0d0febd845d0dfae43, 0x7003168b29a8b06daf66c5f2577bffa, 0x176ea1b164264cd51ea45cd69371a71f, 0x3b6a666fb0323a1d576d4155ec17dbe, 0x9edfa3da6cf55b158b53031d05d51433, 0x23d79a9428a1c22d5fdb76a19fbeb1d, 0x4d125e7fa59cec98126cbc8f38884479, 0x1f40f472e2950656fa231e959acdd98, 0x98b33c6e0a14b90a7795e98680ee526e, 0xc8555a9fcfcfa81b306d70019d5f970, 0xebe2136898c752051e01a934402d0baf, 0x6c2a492cc0f859aa6524ab713b7e05, 0x637e0edc5b6e4ae7a62081434fbaecc0, 0x4e8c1e4403d1f83a859890cd670f668, 0x2284b7a447e7f5938b5885ca0bb2c3f0, 0xf6b20a3f40048d7c31d5a973d792fa1, 0xc5adf6816b10e53a9145de05b3ab1b2c, 0x54d35980bf9c0efb5816b74a985ab61, 0x4, 0xfa06825a3970e5b2395be2b, 0x4e5a7ba3551df3652d46082d, 0xcfca9a525fe359, 0x0, 0x4b5b3f76f46f535ef91e563e, 0x7966c4c81669a7d88fb8ff47, 0x5319f116c45c71a8, 0x0, 0x100999da2383a787fc58bce955201c59, 0x2d492fcea91c7b9e8fa3931db543fa13, 0x7f99cd69e93181300ddb085a, 0x2a1d1771927bbfe32603da8b, 0x1b74f12f3379df06, 0x0, 0x9c6622f17ebe2c6e5ff51ed2, 0x204fecff8a5332121c431d6c, 0x5aef5ec5cb6f461e, 0x0, 0x2be10b93bdf768ae7778b99191b2cf05, 0x19d5b37430b75b04d20856a7ba530478, 0xfb04ee0dc3febe0615ddb0f8, 0xdb1a0ab954022ed49344333d, 0xc954e46c5b77f1, 0x0, 0x9ce91f8ebf3d15bd8a382b6e, 0xdfabad49441c0d28944c6b9c, 0x50386dc8735ea9aa, 0x0, 0x306359e58443dc9fa7b677c05b67bc03, 0x22f5c652ce175682bece3c707b7f0c64, 0x4a3eb763e06c59a43ee29389, 0x1bccf75e9f35eef7529a1ef5, 0x10fda802117cdfa6, 0x0, 0xa7ef2ec0616f2443afd7cfbb, 0xd9cea79fbf13150fc3cd14eb, 0x4716f7e70987aa10, 0x0, 0x1af8531e7421e1b5fc3f282922950413, 0x12802c684a9d9ebd5f6c8d17c2c0dce9a, 0x8d97858df9c229a8d620899, 0x7db5c765b658f7a25710c917, 0xcf309068ad0dba9, 0x0, 0x910500da56aeb50040a7dcc4, 0x3f3a644f90034e28ba18da95, 0x175ed58aa3954930, 0x0, 0x3e15cff10f1609922ab32f8f9278107, 0x10a16e8bfef9be00041b12d3df0ab90d2, 0x979bd1588dea18a8b58a36af, 0x3b2b0ed61e1178cba7126bb7, 0x785cdb331bd169df, 0x0, 0xfa4fe3f5b031c72c034663a2, 0xb0e20f66408902c55e655ba1, 0x75bd7b3b090eed75, 0x0, 0x2be5e02dea43047daaed4fbaf06fafca, 0x1de6096b4f0d2f729b2b56af6ca9e273, 0x3fce6566c5bcd92f4f85fa83, 0x623822e4a6f44b0bf23c8675, 0x6e423031e41718c0, 0x0, 0x16cc5bb608bc6da0bdb24659, 0x14a20f3a350b3c92c8985f2c, 0x62b6194db85582a7, 0x0, 0x5e0ad7648a4f59729af8617b82d4b15, 0x1204a5942db3ff32572d539505799c162, 0x695752f39d6ec14aacfbee31, 0xf8dd60148b6b6cd713f249de, 0x4ae3fa433428da67, 0x0, 0x2fc01927924d2423beeabc84, 0x8d3ab58869e8b96487a1c521, 0x47292b4a7182ce7f, 0x0, 0x1bb625624ceab37b75f8eb6d9baaec37, 0x8869d6e2bfcd45999b706e500bdf6e9, 0x6474fbdb6af73701de45f274, 0x6094e5f591a45f3bf08427c8, 0x103a5881e0aef8e4, 0x0, 0xa14105659db45179803bc1ee, 0xcd28f77e60c994a87a8e0d3d, 0x57e7812e2c87633c, 0x0, 0x4f7c63b27ca63da0b0528098af0dab, 0xf35e51f8509ab42e70f2e964b3fd8c, 0xa25e04756aa0d3cf7a58d681, 0xf525fde801d661e742afdf23, 0xb8057a3525f95e3, 0x0, 0x6423b1c187fb4699d91e7961, 0x97ed6053542a17b2ee5a276d, 0x24f4c3823852a469, 0x0, 0x122200117465217fb53ec8140b91481, 0x13d5f8e8fedb409022970ed842b78a9c4, 0xc4c0db3983aec6a159c5bc04, 0x5f92edcb20df32b1cfb385f, 0x300014ec8791a43a, 0x0, 0x17b89b207ec56f494c10480a, 0x610f69ebee5483ba4bd0d917, 0x2bec654de3ea3a80, 0x0, 0x37b10ae5354582f85190f7870b858c63, 0x1316ba5fddb42e06735d0f1fdcc24a38, 0x45a14721d6abe459bc5aea8, 0x1568bffaa9565041d7dbaf28, 0x3e6067b9f8935c8, 0x0, 0x26d59ad679daa7e759147eba, 0x9503c0a1029b0f7ce7406c4b, 0x3db5661841ebce66, 0x0, 0x121b5378cd43ffc919a2305e76423029, 0x18300af219c488c1a25884d5c7401c30, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x4ee4167708b29620b1a9e142, limb1: 0x6fd520385a98769aa6f2e833, limb2: 0x29e58ca78283490e, limb3: 0x0, }, y: u384 { limb0: 0xf78829d77fe7c51b0788aa60, limb1: 0x98af3b491451a91c0de5fdab, limb2: 0x4ba4b20ac788a99, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_GRUMPKIN_1P() { let mut data = array![ 0x1, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x1, 0xb4862b21fb97d43588561712e8e5216a, 0x967d0cae6f4590b9a164106cf6a659e, 0x5, 0x41c610705003caeb41ebc2e1, 0x7e86ece0ef89d80aca46deac, 0x121b38a9ddb387ef, 0x0, 0x5d4d7ed98f7bc32e88ca220f, 0xc1b7d0a1662fc4fbf7fefffe, 0x24a447a3fd6b6dd0, 0x0, 0x5520c252aad219e02bf5055a4ed023b7, 0x197e50b8e7adb6dd93eeede129c12721, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x41c610705003caeb41ebc2e1, limb1: 0x7e86ece0ef89d80aca46deac, limb2: 0x121b38a9ddb387ef, limb3: 0x0, }, y: u384 { limb0: 0x5d4d7ed98f7bc32e88ca220f, limb1: 0xc1b7d0a1662fc4fbf7fefffe, limb2: 0x24a447a3fd6b6dd0, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_GRUMPKIN_2P() { let mut data = array![ 0x2, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x20669ef12954f8e3bbc8b4d3, 0x396a6f7243c27ce553121ee3, 0x11438ca2ec259aed, 0x0, 0xa560a5759c90985fde99aca0, 0xc5b21186cc6dcd0421026513, 0x21fb1f47c6ac55b3, 0x0, 0x2, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0x1521f387af19922ad9b8a714e61a441c, 0x5a92118719c78df48f4ff31e78de5857, 0x28fcb26f9c6316b950f244556f25e2a2, 0x5, 0x32536984a4baf6f115cbb0bd, 0xdae1afb06300dbd4fde0fe2a, 0x1f1896139ffba76b, 0x0, 0xdf40e1ffc936ca509fbb16a8, 0xca2a5643c84ea6749543ee4c, 0x29b131b03ad6f119, 0x0, 0x39dea48eef47b3e6bcae980c9112d477, 0x538cc4627274d8f320bf5df15c887356, 0xc0a469a5b7f47ad22e92fe7d, 0xd7d5b526e50c6900bdcfeb9d, 0x21df2654af8f907c, 0x0, 0x19ca14fef97aef829a022e99, 0x3436a3a9d29787ffa53573f3, 0x16d3f0d2e78b2950, 0x0, 0x10a2e45b33049f11b360c09b6389565b, 0x63f1d0c59d848c415389772b72561b3d, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x512920e074cbe690304d839e, limb1: 0xb077d5884dbdc5fcb9424a35, limb2: 0x16cd67edce8be7ac, limb3: 0x0, }, y: u384 { limb0: 0x70cd2c4a003d407aabc7cc, limb1: 0xe2748dd5f8c2a0e1dadd02d5, limb2: 0x1c1cfa79fda07581, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_GRUMPKIN_3P() { let mut data = array![ 0x3, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x20669ef12954f8e3bbc8b4d3, 0x396a6f7243c27ce553121ee3, 0x11438ca2ec259aed, 0x0, 0xa560a5759c90985fde99aca0, 0xc5b21186cc6dcd0421026513, 0x21fb1f47c6ac55b3, 0x0, 0x3c26f4ff476ab777dc184776, 0xbccb2cba46cf421f11eb4d14, 0x27ec44064c727a3d, 0x0, 0xa893636703904fcbe984618c, 0x73b210a224190b9b7b28784c, 0x20f05486689dff6c, 0x0, 0x3, 0x5a92118719c78df48f4ff31e78de5857, 0x28fcb26f9c6316b950f244556f25e2a2, 0x8d723104f77383c13458a748e9bb17bc, 0x215ddba6dd84f39e71545a137a1d5006, 0xeb2083e6ce164dba0ff18e0242af9fc3, 0x5f82a8f03983ca8ea7e9d498c778ea6, 0x5, 0xe7bee0981732826e6716a8b9, 0x8001b0e38269465d6a3ba48f, 0x1a727a8f4b29ab8, 0x0, 0x8180b66bf02ff17b607d43de, 0xfaf5d89afaaafcba4c3a43ef, 0xb1992b294551079, 0x0, 0x10a2e45b33049f11b360c09b6389565b, 0x63f1d0c59d848c415389772b72561b3d, 0x74575ca46c143d22121ea904, 0x77200655d23500648b27cb30, 0xaa0637dd46a67ab, 0x0, 0xfe93e7c36bbe7d7cde12c6ac, 0x51cb8066bcd86f62f01ec58, 0x1f28f657f6b9dadd, 0x0, 0x4330e45cf056866449d6d2b7255a6d25, 0x102e9d68e73086da22f4b98d2103a3c22, 0x2e20c00e88de121d37fa2696, 0x86ac870558aabfae43dc69a0, 0x26095fa9606bf53, 0x0, 0x327031fef1203666f47f2099, 0xdb951627a7f45379f1e51f4f, 0x376fe09acf51529, 0x0, 0x32cbca2bbd2f37ecb19ba4403b940cc1, 0x12977bae8a28f111cf0a43807982d3bb7, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x213a074a0215934c65d47250, limb1: 0x57ceadf09cd8ebde50476db0, limb2: 0x1f82780f1a4c3d23, limb3: 0x0, }, y: u384 { limb0: 0x7282af42d1608d1f8c034960, limb1: 0x81214b248c88a391f72dd6e0, limb2: 0x5df1db744450be3, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_GRUMPKIN_4P() { let mut data = array![ 0x4, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x20669ef12954f8e3bbc8b4d3, 0x396a6f7243c27ce553121ee3, 0x11438ca2ec259aed, 0x0, 0xa560a5759c90985fde99aca0, 0xc5b21186cc6dcd0421026513, 0x21fb1f47c6ac55b3, 0x0, 0x3c26f4ff476ab777dc184776, 0xbccb2cba46cf421f11eb4d14, 0x27ec44064c727a3d, 0x0, 0xa893636703904fcbe984618c, 0x73b210a224190b9b7b28784c, 0x20f05486689dff6c, 0x0, 0x74f2a24c1853d803c1b9e310, 0x9e78bb9233603b686b9d27, 0x1d13a84fbcd96e81, 0x0, 0xe5bc08950f2f1accd92245f4, 0x3b653bbe7b6cfd9074b07f89, 0x1638a8a07b89463b, 0x0, 0x4, 0x8d723104f77383c13458a748e9bb17bc, 0x215ddba6dd84f39e71545a137a1d5006, 0xeb2083e6ce164dba0ff18e0242af9fc3, 0x5f82a8f03983ca8ea7e9d498c778ea6, 0xb5d32b1666194cb1d71037d1b83e90ec, 0x28045af9ab0c1681c8f8e3d0d3290a4c, 0xd3fbf47a7e5b1e7f9ca5499d004ae545, 0x2ebce25e3e70f16a55485822de1b372a, 0x5, 0x6463bd58916931d0ac4eb128, 0x36bcb9db9fbc494127d685b9, 0xbe0d59677fd6637, 0x0, 0xfdfd5ee62a80a8195a667cd1, 0x8eb9b531d1c1bed421f1d865, 0x2fbd2d2aa811c3e1, 0x0, 0x4330e45cf056866449d6d2b7255a6d25, 0x102e9d68e73086da22f4b98d2103a3c22, 0x8fd7943c409c6d0b97790c17, 0x6609bc50ae73b6db4a08db2e, 0x1a5a408e625e1019, 0x0, 0x56e67a10d45628f5fcf8d390, 0xe19469815ce43c544151b3ac, 0xeb5ad829227a07f, 0x0, 0x32cbca2bbd2f37ecb19ba4403b940cc1, 0x12977bae8a28f111cf0a43807982d3bb7, 0xd49218ddf86e81250924e4ed, 0xf193c73d0d41e7f71dd4d878, 0x21192796ca5e2dac, 0x0, 0xbb5b1bfe4b3be7d06581a624, 0x57281f4af424359f81b5526a, 0x2f72bb4496fb4ce4, 0x0, 0x453503237fe891d4168e4f9228c400b7, 0x72e13e861339a4b3dab61e0d640fc66, 0x7ec3a5c2c9499344ac050cdd, 0x791b53545bf433b7079614ac, 0x21453b32e9702074, 0x0, 0xdb015deb84bb2b7b687999ca, 0xf553ab53e8fed39de94cc1f5, 0x1c73bed188a1cf2f, 0x0, 0x3370dc3b2f6a7a7d6a4917e6cae4e0e1, 0x14488bb2a825221dfb2b87de071f1b27c, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x577ddc8cb42b7a3b83e4d525, limb1: 0x74e9415eb1dbca9529930fc, limb2: 0x26b61a5d6d67dd31, limb3: 0x0, }, y: u384 { limb0: 0x6cc0d22d0549fc5bbbb24080, limb1: 0x315ae072448564ca12dc062e, limb2: 0x2d218fcb973e8f23, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_GRUMPKIN_10P() { let mut data = array![ 0xa, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x20669ef12954f8e3bbc8b4d3, 0x396a6f7243c27ce553121ee3, 0x11438ca2ec259aed, 0x0, 0xa560a5759c90985fde99aca0, 0xc5b21186cc6dcd0421026513, 0x21fb1f47c6ac55b3, 0x0, 0x3c26f4ff476ab777dc184776, 0xbccb2cba46cf421f11eb4d14, 0x27ec44064c727a3d, 0x0, 0xa893636703904fcbe984618c, 0x73b210a224190b9b7b28784c, 0x20f05486689dff6c, 0x0, 0x74f2a24c1853d803c1b9e310, 0x9e78bb9233603b686b9d27, 0x1d13a84fbcd96e81, 0x0, 0xe5bc08950f2f1accd92245f4, 0x3b653bbe7b6cfd9074b07f89, 0x1638a8a07b89463b, 0x0, 0x549a4dee31909bd274709d7c, 0x2628a928b4ed90e98d5de1f, 0x1f2c2eeb200495b, 0x0, 0xbae71f4f781675cce1119290, 0x18995b20b8d0966bac7f5c23, 0x1f7a255155ab7785, 0x0, 0x616d2877cb47206e625b0076, 0xa7255531af3575b0a682d6df, 0xdd4a0db8187661d, 0x0, 0xea99c54030edacb739c9ad0f, 0x1e2e84792f7a12b330406ecd, 0x70f1e1a9673a240, 0x0, 0x4ca9473b8cae66da0baf8eca, 0x9ca627187edabffeb80da281, 0xda800cad866dc3c, 0x0, 0x6dcd62554ccd88a00f3e90b3, 0x141b8118cd6873dc9ac01a64, 0x19146bc96fa6a4bd, 0x0, 0xd21eca6170588371cf0fef12, 0x2aae89b6d1784d7fe5d6f233, 0x2fa67b7cd137898c, 0x0, 0xb20856046d39da92c0a6898a, 0xc9dba030db3ed937e781ae4d, 0x695a8c76fb0f771, 0x0, 0x919e8724022c5bd17875261b, 0x3a2b09cc9362be43a8573a0, 0x2cf4abb949016ad7, 0x0, 0x89062bf5adf784b526337420, 0xf710d8fb0beb9551fe0e08f3, 0x1577b6c8f024c52d, 0x0, 0x2cb6c8386e51647e028876a2, 0x3eeb71e38623705690872fa1, 0xbf610b0d76e1a8f, 0x0, 0x92f468ac225e9f9a2b52929d, 0x28e7d79e30f3f4d4abf38c05, 0x2e2ba523e6456871, 0x0, 0xa, 0xe005b86051ef1922fe43c49e149818d1, 0x1f507980eece328bff7b118e820865d6, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x154bc8ce8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x2305d1699a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x144a7edf6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x21c38572fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0x2b70369e16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x522c9d6d7ab792809e469e6ec62b2c8, 0x85940927468ff53d864a7a50b48d73f1, 0xdc5dba1d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x119d0dd09466e4726b5f5241f323ca74, 0x5306f3f5151665705b7c709acb175a5a, 0x2592a1c37c879b741d878f9f9cdf5a86, 0x5, 0x32eb30f6f18b90fd2c54a7bc, 0x3c30d2c79fedd11320172c6b, 0x1c24ff684f9b5d37, 0x0, 0x30da50af17d999a6e4f507cc, 0x8b68b2e39f2184199c693db6, 0x29406ed67ec36daa, 0x0, 0x44a6ec700b7df57842dc495ff54035ab, 0x1a16322818541ea7ff83fb7401b38645, 0xf988d8bc102cc5827e4caa0f, 0x49d307fa622f159f155a1d5d, 0x279bbe5814108d5, 0x0, 0x8175447243fbd59a37850f7e, 0x97eab11e0760e9d18ebd0279, 0x207bde70fd6ed720, 0x0, 0x2f98f4efaa736ab4d7bfb789bfba3055, 0x13cd9b8573802529fd653bb6e0d2b9003, 0x52463a5e56dce95d52653f6c, 0xc486275eefc0a3085d30994f, 0x1911dc07106bf4ba, 0x0, 0x50eeee6f973b2226963afb66, 0x1afe5cccc2c986ed4ae0d870, 0x1164fff2e2c71e0a, 0x0, 0x4bf90ecc32be6be1a6c37a7a9d07c71d, 0xf44e3c518c0a9551bc4adf61e4848ba, 0x2704d0e441c6416e0fca2d7c, 0x2210d1dbdbe71c652f93ab45, 0x22a59daf5cbe974b, 0x0, 0xfa94c262d139c0ee254542eb, 0x2d6985158d5a69f37216750b, 0x196f95cbe169d63, 0x0, 0x5ef24d1d34d20af1accc99a7a47ced7, 0x15a3bf99ae0dc9de808f9f24fc67eb36b, 0x90e925805f4e493a98513928, 0x20747869ef32538aca7f3a98, 0x1d9ba510fc4dbce1, 0x0, 0x19866ab554bc8233e08b4443, 0xa95c235c28b853948e2ab1bf, 0x167644ace98da43f, 0x0, 0x2cb938e8d1c7a21ed6905354bb26d393, 0x5531d3f34afddbea08c69f58e5606d44, 0xe8975bf70ea1a1253b0d37d2, 0xc825272fb51f264751b2a16e, 0x82a1f118fcda22c, 0x0, 0x2f242762bb612f6c60c0126c, 0x919d79be09b46ad1f5cebf8e, 0x6b9c0cfd4951eec, 0x0, 0x60e45e17bea8d8126f02e5a29022aee5, 0x132504ebb936117e97628b682972007b8, 0x6fd67ead04596b5005a7175b, 0x9da6449170ac81a2f6cc28a, 0x1413b85981e32e9e, 0x0, 0x3ff0bf0cd595a2bd615527a3, 0x94482e2708c6ae32d5bd1b5f, 0xfcfed4eeb170294, 0x0, 0x516c64bbee2a8bf42f7414f288f1f846, 0x145799d59f914437c97585c53ceb86623, 0xc71e8a64b2f862ae51d2200a, 0x39cef19185293495361def27, 0x2e0a4cb3b5568f75, 0x0, 0x85d0d27771793625c874ebbf, 0xce9e91179dc4f4b408181c1f, 0x261a1cca4c19631a, 0x0, 0xcefe84e1bdce362a5bd286f90a8b1cb, 0x3717c82dc5b0858c3ba6f188e61330a, 0x67427da6ac310253c4305f51, 0x4b8a13108dbfa4be65e8debc, 0x17a3550c4017bb7a, 0x0, 0xc1b3b3c0adb4ea9812127500, 0xe8a20b9f8ad97a21e3450200, 0x1dcd89db1920a499, 0x0, 0x146dc11c44642a7552be554048969667, 0x1240b81ea23b0099fa77c5be92a2a8286, 0xead19fc6d1fe6777fc7fe69f, 0x75f5a9115bf9d3ee7a306806, 0x325b9bf2679afd4, 0x0, 0x69479ee6fe51ea5b53a60c39, 0xb467acaf148cd9cc4e51a679, 0x1aa47e4314e976ec, 0x0, 0x2024c45822518dadf0322fb9e8b505e1, 0x1581e6419c45af5a4b61bbe76efb6a640, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x664e7a2a841e9440a32b6d19, limb1: 0xafdb5f6d16a62de9213ee040, limb2: 0x13f95a9cdebbf34c, limb3: 0x0, }, y: u384 { limb0: 0x7ff039b0dc46b2d7c69d0faf, limb1: 0x2e4a2bd3a50e076ea1b3056, limb2: 0x2dbf12d12987fc34, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_GRUMPKIN_11P() { let mut data = array![ 0xb, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x20669ef12954f8e3bbc8b4d3, 0x396a6f7243c27ce553121ee3, 0x11438ca2ec259aed, 0x0, 0xa560a5759c90985fde99aca0, 0xc5b21186cc6dcd0421026513, 0x21fb1f47c6ac55b3, 0x0, 0x3c26f4ff476ab777dc184776, 0xbccb2cba46cf421f11eb4d14, 0x27ec44064c727a3d, 0x0, 0xa893636703904fcbe984618c, 0x73b210a224190b9b7b28784c, 0x20f05486689dff6c, 0x0, 0x74f2a24c1853d803c1b9e310, 0x9e78bb9233603b686b9d27, 0x1d13a84fbcd96e81, 0x0, 0xe5bc08950f2f1accd92245f4, 0x3b653bbe7b6cfd9074b07f89, 0x1638a8a07b89463b, 0x0, 0x549a4dee31909bd274709d7c, 0x2628a928b4ed90e98d5de1f, 0x1f2c2eeb200495b, 0x0, 0xbae71f4f781675cce1119290, 0x18995b20b8d0966bac7f5c23, 0x1f7a255155ab7785, 0x0, 0x616d2877cb47206e625b0076, 0xa7255531af3575b0a682d6df, 0xdd4a0db8187661d, 0x0, 0xea99c54030edacb739c9ad0f, 0x1e2e84792f7a12b330406ecd, 0x70f1e1a9673a240, 0x0, 0x4ca9473b8cae66da0baf8eca, 0x9ca627187edabffeb80da281, 0xda800cad866dc3c, 0x0, 0x6dcd62554ccd88a00f3e90b3, 0x141b8118cd6873dc9ac01a64, 0x19146bc96fa6a4bd, 0x0, 0xd21eca6170588371cf0fef12, 0x2aae89b6d1784d7fe5d6f233, 0x2fa67b7cd137898c, 0x0, 0xb20856046d39da92c0a6898a, 0xc9dba030db3ed937e781ae4d, 0x695a8c76fb0f771, 0x0, 0x919e8724022c5bd17875261b, 0x3a2b09cc9362be43a8573a0, 0x2cf4abb949016ad7, 0x0, 0x89062bf5adf784b526337420, 0xf710d8fb0beb9551fe0e08f3, 0x1577b6c8f024c52d, 0x0, 0x2cb6c8386e51647e028876a2, 0x3eeb71e38623705690872fa1, 0xbf610b0d76e1a8f, 0x0, 0x92f468ac225e9f9a2b52929d, 0x28e7d79e30f3f4d4abf38c05, 0x2e2ba523e6456871, 0x0, 0x7bfeb500d87c8d6a89e3b500, 0x114bfa8db0c1f0065e73cf9a, 0x129e9c5a3641b28e, 0x0, 0x755ef61cf917721bfef36992, 0x8f3d6b6348b89a2c0cfa9d3f, 0x272de7db2186fd11, 0x0, 0xb, 0x4a84eb038d1fd9b74d2b9deb1beb3711, 0x154bc8ce8c25166a1ff39849b4e1357d, 0x3405095c8a5006c1ec188efbd080e66e, 0x2305d1699a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x144a7edf6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x21c38572fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0x2b70369e16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x522c9d6d7ab792809e469e6ec62b2c8, 0x85940927468ff53d864a7a50b48d73f1, 0xdc5dba1d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x119d0dd09466e4726b5f5241f323ca74, 0x5306f3f5151665705b7c709acb175a5a, 0x2592a1c37c879b741d878f9f9cdf5a86, 0x30bcab0ed857010255d44936a1515607, 0x1158af9fbb42e0b20426465e3e37952d, 0x5f3f563838701a14b490b6081dfc8352, 0x1b45bb86552116dd2ba4b180cb69ca38, 0x5, 0x82a38d8c5a5ed06e02f523ea, 0x82af79a6bf3ac89993eab3e8, 0x1be27c5dcf4d031, 0x0, 0x47cd0a6bf8f3e2719f3676c3, 0xb52e9a47fb56e1d543047f8b, 0x2d0102ccf985e7db, 0x0, 0x2f98f4efaa736ab4d7bfb789bfba3055, 0x13cd9b8573802529fd653bb6e0d2b9003, 0xfc1dd0e74df0a1a8d64f91ef, 0x7152ce13dd09af9d91af51a5, 0x1f20f94df2d7fe74, 0x0, 0x7e05f6cc422c4a84b77ae1c4, 0xce37231b21808d9920cd5380, 0x111ebb3c2386a02a, 0x0, 0x4bf90ecc32be6be1a6c37a7a9d07c71d, 0xf44e3c518c0a9551bc4adf61e4848ba, 0xa237e5e2279f34d3f8c9d69c, 0xff7f5d3ae502e52c40306b83, 0x1337f2421463490b, 0x0, 0x45b6a863b5abf54962d9b884, 0x30a306da962a35989645725e, 0x99a1ae365a1daf2, 0x0, 0x5ef24d1d34d20af1accc99a7a47ced7, 0x15a3bf99ae0dc9de808f9f24fc67eb36b, 0xb84b0e70b2875bab51e9d89a, 0x2091fcf632cf164d90c07d54, 0x1817470ef8567bdd, 0x0, 0x6cfa31ea1faa7f591e0c9898, 0x91ae224d73336f6aea463d10, 0x1a76f383b7ffeff9, 0x0, 0x2cb938e8d1c7a21ed6905354bb26d393, 0x5531d3f34afddbea08c69f58e5606d44, 0x70b4837532b9116ba15cb044, 0x8dc6e9f1aec52fcb46bbea60, 0x1de8b549ffcc3ab3, 0x0, 0x8ebe92f66b5744c974e0ae04, 0xf4f8ffe04323fde3bc621b11, 0x177ac0d85f238570, 0x0, 0x60e45e17bea8d8126f02e5a29022aee5, 0x132504ebb936117e97628b682972007b8, 0xf69fee0280761794b8af094d, 0x2cab3532c766373f21f01ea1, 0xb2a41c7c05cf495, 0x0, 0x47c5682cc4d62cd6a6b5c399, 0xff9caa6f33c1d17ec353d81e, 0x424b8d93bc33ee3, 0x0, 0x516c64bbee2a8bf42f7414f288f1f846, 0x145799d59f914437c97585c53ceb86623, 0x91abb630ebe86fa5ed36f08, 0x8792ec1248359362df03ea13, 0xa395ae138e67d28, 0x0, 0xea244ec29efaa151ea8df973, 0x1066b45d5cfb0ecf6b1c83d, 0x29bc678e1f1a863b, 0x0, 0xcefe84e1bdce362a5bd286f90a8b1cb, 0x3717c82dc5b0858c3ba6f188e61330a, 0x4e0af46df62ebdf83ef8427a, 0xe920eb4917f8088bed5a0ff1, 0x290d2f419d55f05, 0x0, 0xc99e48407b226ca08f8edcd0, 0xa26bf316d4aa7e7801849498, 0xe537c8f794284fb, 0x0, 0x146dc11c44642a7552be554048969667, 0x1240b81ea23b0099fa77c5be92a2a8286, 0x4e0ff52d69dc8189069ca894, 0xbb8275552c772e2c5ab6a827, 0x304d9f7b60971a3a, 0x0, 0x2c86e8197dada4886b64d972, 0x7c82e3ee4a0890e23f95a00e, 0x223e0af0a2ca1d7f, 0x0, 0x2024c45822518dadf0322fb9e8b505e1, 0x1581e6419c45af5a4b61bbe76efb6a640, 0xd2f1ac9e8e396d2773eb4815, 0xff66e9037c285a85f82cd552, 0x17f35aece5c7a033, 0x0, 0xa9f477c2284f410dcf3e9b, 0x4c5370e3920042051b704352, 0x16d56bd7c7796d7c, 0x0, 0x32d3a03325ee181cc9c2b39a4e2916d9, 0x219449b8074d447b4f3f2fb27633a5e1, 0x85028124eee08fb0e6ef7707, 0x91fb6fec286026bab476ba92, 0x2733c400e9b74caf, 0x0, 0x7660634344195f9b47cdb6ca, 0x4fdc765e611b89333602fe6d, 0x1152965b31d3e6b7, 0x0, 0xa131e2b48ec3bee1efa6016b50ac441, 0x10c7fd5e62bf48ea70c58c0cfa9a06e45, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xffdf31426d80fe0e0c50bc6c, limb1: 0x3f2ee5e0c6081e2b90431a5d, limb2: 0xee45d84f0c8d969, limb3: 0x0, }, y: u384 { limb0: 0xe2ce9a7cc98cfccbbfd0057, limb1: 0xcb704f80e53cbafb61a4cf65, limb2: 0x2249c2809c6b67ce, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_GRUMPKIN_12P() { let mut data = array![ 0xc, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x20669ef12954f8e3bbc8b4d3, 0x396a6f7243c27ce553121ee3, 0x11438ca2ec259aed, 0x0, 0xa560a5759c90985fde99aca0, 0xc5b21186cc6dcd0421026513, 0x21fb1f47c6ac55b3, 0x0, 0x3c26f4ff476ab777dc184776, 0xbccb2cba46cf421f11eb4d14, 0x27ec44064c727a3d, 0x0, 0xa893636703904fcbe984618c, 0x73b210a224190b9b7b28784c, 0x20f05486689dff6c, 0x0, 0x74f2a24c1853d803c1b9e310, 0x9e78bb9233603b686b9d27, 0x1d13a84fbcd96e81, 0x0, 0xe5bc08950f2f1accd92245f4, 0x3b653bbe7b6cfd9074b07f89, 0x1638a8a07b89463b, 0x0, 0x549a4dee31909bd274709d7c, 0x2628a928b4ed90e98d5de1f, 0x1f2c2eeb200495b, 0x0, 0xbae71f4f781675cce1119290, 0x18995b20b8d0966bac7f5c23, 0x1f7a255155ab7785, 0x0, 0x616d2877cb47206e625b0076, 0xa7255531af3575b0a682d6df, 0xdd4a0db8187661d, 0x0, 0xea99c54030edacb739c9ad0f, 0x1e2e84792f7a12b330406ecd, 0x70f1e1a9673a240, 0x0, 0x4ca9473b8cae66da0baf8eca, 0x9ca627187edabffeb80da281, 0xda800cad866dc3c, 0x0, 0x6dcd62554ccd88a00f3e90b3, 0x141b8118cd6873dc9ac01a64, 0x19146bc96fa6a4bd, 0x0, 0xd21eca6170588371cf0fef12, 0x2aae89b6d1784d7fe5d6f233, 0x2fa67b7cd137898c, 0x0, 0xb20856046d39da92c0a6898a, 0xc9dba030db3ed937e781ae4d, 0x695a8c76fb0f771, 0x0, 0x919e8724022c5bd17875261b, 0x3a2b09cc9362be43a8573a0, 0x2cf4abb949016ad7, 0x0, 0x89062bf5adf784b526337420, 0xf710d8fb0beb9551fe0e08f3, 0x1577b6c8f024c52d, 0x0, 0x2cb6c8386e51647e028876a2, 0x3eeb71e38623705690872fa1, 0xbf610b0d76e1a8f, 0x0, 0x92f468ac225e9f9a2b52929d, 0x28e7d79e30f3f4d4abf38c05, 0x2e2ba523e6456871, 0x0, 0x7bfeb500d87c8d6a89e3b500, 0x114bfa8db0c1f0065e73cf9a, 0x129e9c5a3641b28e, 0x0, 0x755ef61cf917721bfef36992, 0x8f3d6b6348b89a2c0cfa9d3f, 0x272de7db2186fd11, 0x0, 0x499828e9a86afe3b8c909275, 0xb8910cabe37f6e8f4bd4b4c1, 0x2634fe56d6751316, 0x0, 0x777228ef48ddade6caeb3c9, 0x6e0e16c7f54463307a858b78, 0x6e2e3e3a1dc83da, 0x0, 0xc, 0x3405095c8a5006c1ec188efbd080e66e, 0x2305d1699a6a5f92cca74147f6be1f72, 0x1775336d71eacd0549a3e80e966e1277, 0x144a7edf6288e1a5cc45782198a6416d, 0x2f1205544a5308cc3dfabc08935ddd72, 0x21c38572fcd81b5d24bace4307bf326, 0x42930b33a81ad477fb3675b89cdeb3e6, 0x2b70369e16febaa011af923d79fdef7c, 0x2648ee38e07405eb215663abc1f254b8, 0x522c9d6d7ab792809e469e6ec62b2c8, 0x85940927468ff53d864a7a50b48d73f1, 0xdc5dba1d977e9933c49d76fcfc6e625, 0xd344749096fd35d0adf20806e5214606, 0x119d0dd09466e4726b5f5241f323ca74, 0x5306f3f5151665705b7c709acb175a5a, 0x2592a1c37c879b741d878f9f9cdf5a86, 0x30bcab0ed857010255d44936a1515607, 0x1158af9fbb42e0b20426465e3e37952d, 0x5f3f563838701a14b490b6081dfc8352, 0x1b45bb86552116dd2ba4b180cb69ca38, 0xc87a746319c16a0d0febd845d0dfae43, 0xe0062d1b29a8b06daf66c5f2577bffa, 0xa25b59fd92e8e269d12ecbc40b9475b1, 0x2689f61688c132adefbfc19ee8f6cf32, 0x5, 0xf9033eff6f190d31c0c4211d, 0x5695a5c1624dd1742a3cdfe9, 0x179c263b9b4504b8, 0x0, 0x28d168c4ac03deddb2bfced2, 0x70704860340808682034ce25, 0x128005647d6a6d42, 0x0, 0x4bf90ecc32be6be1a6c37a7a9d07c71d, 0xf44e3c518c0a9551bc4adf61e4848ba, 0x8064a8fdea100eeea33de95e, 0x48241e9bcc914c3f4688d747, 0x36d11122251d0be, 0x0, 0xed92f97ad0666c54c0c7c322, 0xb8286940afc6cb2b56a8186f, 0x2998081bd2a6cc53, 0x0, 0x5ef24d1d34d20af1accc99a7a47ced7, 0x15a3bf99ae0dc9de808f9f24fc67eb36b, 0x9091115a73842d352e7260c2, 0x7c9c3b4234d11be97c3a47c2, 0x20f7f327ca913b6, 0x0, 0x554304ae2efdf0b481bef53a, 0x2ec24f5512a59f6d9389adb7, 0xf108022c4d70cb1, 0x0, 0x2cb938e8d1c7a21ed6905354bb26d393, 0x5531d3f34afddbea08c69f58e5606d44, 0xaf21babf96dd103773c072ef, 0x7ce5ce3522b6ea4c0e3ec87c, 0x949d7f5b6f58cf0, 0x0, 0x997fee3b8a7a55ed6c3ce35a, 0x85dc08d63c739254f7cd9e08, 0x1e8720754774e3be, 0x0, 0x60e45e17bea8d8126f02e5a29022aee5, 0x132504ebb936117e97628b682972007b8, 0x949ac2b0821b3f17297f3379, 0x68229918ea7af402a38533f4, 0x2218e85e6418087f, 0x0, 0x8240596af6fd6399672c6fc7, 0x7f7eb048cdb769efa3581400, 0x2300655984a19dfc, 0x0, 0x516c64bbee2a8bf42f7414f288f1f846, 0x145799d59f914437c97585c53ceb86623, 0xf2116223dcea1035d6598225, 0xec21b290a7a3b366b93dc6c5, 0x19ba2583fa478605, 0x0, 0xe2501715d7aa98cae184ce22, 0x23c9c5d67009ad497435a9cd, 0x17f114ad703e0cf1, 0x0, 0xcefe84e1bdce362a5bd286f90a8b1cb, 0x3717c82dc5b0858c3ba6f188e61330a, 0x6b7bafcd4192510084e8f673, 0x4fac1a2d0116dc53ad2667fa, 0x1ed9f98441a2478c, 0x0, 0xf1355b40d63ec40e1e343f5c, 0x4cada2fa0416e8c573e54188, 0x2c486d8ca96cef62, 0x0, 0x146dc11c44642a7552be554048969667, 0x1240b81ea23b0099fa77c5be92a2a8286, 0x5b9ecbfbecd3454955d82d52, 0xdb7b0c28a61b88ec3874eaf4, 0x1d92b948e287e544, 0x0, 0xbc95b0afca3a981ea9d42a63, 0xf6b2fcafda97e7d50eae45a2, 0x67531d1cc994e69, 0x0, 0x2024c45822518dadf0322fb9e8b505e1, 0x1581e6419c45af5a4b61bbe76efb6a640, 0xeccb4b446b26500e9b2af328, 0x438e22ee4ae8272a0464cc1a, 0x1187394d50486a03, 0x0, 0x28bb06c6fbae4aa8769a05e1, 0x3c6ae34464712ecdb77f360f, 0x141ed6d5a2aba61e, 0x0, 0x32d3a03325ee181cc9c2b39a4e2916d9, 0x219449b8074d447b4f3f2fb27633a5e1, 0x7d2d0722d87337ba712167c5, 0xc3cc9233aa74d73f553e65b6, 0x518142076033a0c, 0x0, 0x5669e2a9f99dec284bd9833e, 0x7ff81fdc9b9fe048166702e, 0x23306f377d466ff8, 0x0, 0xa131e2b48ec3bee1efa6016b50ac441, 0x10c7fd5e62bf48ea70c58c0cfa9a06e45, 0xac500059bd0254354a7eb10d, 0x57846864e2cc212729077c5f, 0x1779a3734e112297, 0x0, 0x95dab19850fefcce556c2e45, 0x8508e9c2e5ccb68087e137a9, 0x47ca47056355729, 0x0, 0x14a37dd97b695d69cf3442e2c033af3c, 0x21a0482fffb4108132fea168f764c63f, 0x6ea786336e5cc29f4f62bb0a, 0xfe31116e59152678d3e658f7, 0x1d659cd996e57821, 0x0, 0x7f9bfd31230be6f74a939865, 0xceae5af5704b817d79a4b61e, 0x11c5608e4816db0f, 0x0, 0x5396fa1ad3cb506768c58b91578ff06d, 0x542910fa71de1143e977087fee8f6313, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xcb36822ddaf2d31c783a48a, limb1: 0x8bdd749154654edb9553e2d, limb2: 0x27b9db3dc009b797, limb3: 0x0, }, y: u384 { limb0: 0x98d17fd0a10d23d8218f14dc, limb1: 0xe9084619146a3dc82331192, limb2: 0xd5e171223497006, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BN254_1P_edge_case() { let mut data = array![ 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2833e84879b9709143e1f593f0000000, 0x30644e72e131a029b85045b68181585d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6871ca8d3c208c16d87cfd45, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0, 0x100000000000000000000000000000001, 0x0, 0x1, 0x0, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, y: u384 { limb0: 0x6871ca8d3c208c16d87cfd45, limb1: 0xb85045b68181585d97816a91, limb2: 0x30644e72e131a029, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BN254_2P_edge_case() { let mut data = array![ 0x3, 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0x772ca79c580e121ca148fe75, 0xce2f55e418ca01b3d6d1014b, 0x2884b1dc4e84e30f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xb4862b21fb97d43588561712e8e5216a, 0x967d0cae6f4590b9a164106cf6a659e, 0x2833e84879b9709143e1f593f0000000, 0x30644e72e131a029b85045b68181585d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000000000000000358f1af3ace11fdc, 0x100000000000000004ac9542b22967d33, 0x100000000000000000cf05f964742cc6d, 0x1000000000000000081d342cffb91cba7, 0x1, 0x0, 0x0, 0x0, 0x6871ca8d3c208c16d87cfd45, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0, 0x100000000000000000000000000000001, 0x0, 0x1, 0x0, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, y: u384 { limb0: 0x6871ca8d3c208c16d87cfd45, limb1: 0xb85045b68181585d97816a91, limb2: 0x30644e72e131a029, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BN254_3P_edge_case() { let mut data = array![ 0x4, 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0x772ca79c580e121ca148fe75, 0xce2f55e418ca01b3d6d1014b, 0x2884b1dc4e84e30f, 0x0, 0x536c985db33c69f7c242e07a, 0xfc531bccffafcf1e59d91fb9, 0x2585e4f8a31664cb, 0x0, 0x57fa42444057cf0c1d62ae3c, 0x4f48d341183118d68ea41313, 0x1d2d2799db056ed1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0x1521f387af19922ad9b8a714e61a441c, 0x5a92118719c78df48f4ff31e78de5857, 0x28fcb26f9c6316b950f244556f25e2a2, 0x2833e84879b9709143e1f593f0000000, 0x30644e72e131a029b85045b68181585d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x21725fdb9f487676e547051, 0xc23930e4f96498a77a316418, 0x1244cb13309195ed, 0x0, 0x6251c487cf0f5a44ac24a45b, 0xf1db336c10ce7fae206dd8dd, 0x1da9c56792006d76, 0x0, 0x9be5263ddc8a3746, 0x3b9c1e56ffcfcc82, 0x1000000000000000041c754da808c6d02, 0x277449c3e218531f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100000000000000005fcd1b724f1296a6, 0x1000000000000000016e3236cbd22722f, 0x4dac40f4f32b51f2, 0x1000000000000000000417aa85f133ffd, 0x1, 0x0, 0x0, 0x0, 0x6871ca8d3c208c16d87cfd45, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0, 0x100000000000000000000000000000001, 0x0, 0x1, 0x0, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x8cb92121f4f98343b28bd83d, limb1: 0xa60bedf2a6dc9ea3a4503a84, limb2: 0x242282a9381754f, limb3: 0x0, }, y: u384 { limb0: 0x41c01095a54c1bf16eec174b, limb1: 0x84b781a7f16d430823b44408, limb2: 0x26bc23f1f4abf016, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_BLS12_381_1P_edge_case() { let mut data = array![ 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf97a1aeffb3af00adb22c6bb, 0xa14e3a3f171bac586c55e83f, 0x4fa9ac0fc3688c4f9774b905, 0x17f1d3a73197d7942695638c, 0xa2888ae40caa232946c5e7e1, 0xdb18cb2c04b3edd03cc744, 0x741d8ae4fcf5e095d5d00af6, 0x8b3f481e3aaa0f1a09e30ed, 0x2, 0x0, 0x0, 0x53bda402fffe5bfeffffffff00000000, 0x73eda753299d7d483339d80809a1d805, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xf97a1aeffb3af00adb22c6bb, 0xa14e3a3f171bac586c55e83f, 0x4fa9ac0fc3688c4f9774b905, 0x17f1d3a73197d7942695638c, 0xecb751bad54dcd6b939c2ca, 0x6655b9d5caac42364e6f38ba, 0xcf2e21f267816aef1db507c9, 0x114d1d6855d545a8aa7d76c8, 0x100000000000000000000000000000001, 0x0, 0x1, 0x0, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xf97a1aeffb3af00adb22c6bb, limb1: 0xa14e3a3f171bac586c55e83f, limb2: 0x4fa9ac0fc3688c4f9774b905, limb3: 0x17f1d3a73197d7942695638c, }, y: u384 { limb0: 0xecb751bad54dcd6b939c2ca, limb1: 0x6655b9d5caac42364e6f38ba, limb2: 0xcf2e21f267816aef1db507c9, limb3: 0x114d1d6855d545a8aa7d76c8, }, }, ); } #[test] #[ignore] fn test_msm_BLS12_381_2P_edge_case() { let mut data = array![ 0x3, 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x3d77d61326ef5a9a5a681757, 0xd3070afd4f0e121de7fcee60, 0xdf9ef4088763fe611fb85858, 0x11a612bdd0bc09562856a70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf97a1aeffb3af00adb22c6bb, 0xa14e3a3f171bac586c55e83f, 0x4fa9ac0fc3688c4f9774b905, 0x17f1d3a73197d7942695638c, 0xa2888ae40caa232946c5e7e1, 0xdb18cb2c04b3edd03cc744, 0x741d8ae4fcf5e095d5d00af6, 0x8b3f481e3aaa0f1a09e30ed, 0x3, 0x0, 0x0, 0xb4862b21fb97d43588561712e8e5216a, 0x12cfa194e6f4590b9a164106cf6a659e, 0x53bda402fffe5bfeffffffff00000000, 0x73eda753299d7d483339d80809a1d805, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000000000000000062a39ac9655a0af5, 0x10000000000000000b59da527feb9e759, 0x885278dc00a1125a, 0x2fe0754b9fadfe7b, 0xf97a1aeffb3af00adb22c6bb, 0xa14e3a3f171bac586c55e83f, 0x4fa9ac0fc3688c4f9774b905, 0x17f1d3a73197d7942695638c, 0xecb751bad54dcd6b939c2ca, 0x6655b9d5caac42364e6f38ba, 0xcf2e21f267816aef1db507c9, 0x114d1d6855d545a8aa7d76c8, 0x100000000000000000000000000000001, 0x0, 0x1, 0x0, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xf97a1aeffb3af00adb22c6bb, limb1: 0xa14e3a3f171bac586c55e83f, limb2: 0x4fa9ac0fc3688c4f9774b905, limb3: 0x17f1d3a73197d7942695638c, }, y: u384 { limb0: 0xecb751bad54dcd6b939c2ca, limb1: 0x6655b9d5caac42364e6f38ba, limb2: 0xcf2e21f267816aef1db507c9, limb3: 0x114d1d6855d545a8aa7d76c8, }, }, ); } #[test] #[ignore] fn test_msm_BLS12_381_3P_edge_case() { let mut data = array![ 0x4, 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x3d77d61326ef5a9a5a681757, 0xd3070afd4f0e121de7fcee60, 0xdf9ef4088763fe611fb85858, 0x11a612bdd0bc09562856a70, 0xde4f62a6588c9401ffefbd3, 0x9bb5f797ac6d3395b71420b5, 0xdc39e973aaf31de52219df08, 0x105dcc4dce3960447d21d3c1, 0xaefd0d854043fd325dd3c34f, 0x9b63c98d9a7845c52e1e2b0f, 0x9db0be660d847ccc58358f3f, 0x17cb6c41f0c4e1a7394ab62a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf97a1aeffb3af00adb22c6bb, 0xa14e3a3f171bac586c55e83f, 0x4fa9ac0fc3688c4f9774b905, 0x17f1d3a73197d7942695638c, 0xa2888ae40caa232946c5e7e1, 0xdb18cb2c04b3edd03cc744, 0x741d8ae4fcf5e095d5d00af6, 0x8b3f481e3aaa0f1a09e30ed, 0x4, 0x0, 0x0, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0x2a43e70faf19922ad9b8a714e61a441c, 0x5a92118719c78df48f4ff31e78de5857, 0x51f964df9c6316b950f244556f25e2a2, 0x53bda402fffe5bfeffffffff00000000, 0x73eda753299d7d483339d80809a1d805, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2b828af1f5fe30bbe7a1074a, 0x5669beaa69827b52dc874c9f, 0x648af2c24d82a5a758c96b8e, 0x188bc245620ae6b6afec9dc3, 0xdc96192f803ef92f56d59758, 0xfc6139925c05a030065d564, 0xb24447300bec56efec94dcf4, 0x156f97e5d31055c0a5fe154d, 0x97ac96128760678, 0x1b8269c5da3a7aa, 0x946f8bb609f9ba7d, 0x4e77077ba28bdfd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3827704126429022, 0x59c3b34a3b390fcf, 0x1000000000000000076a605fca076460a, 0x2f4183d416809c9a, 0xf97a1aeffb3af00adb22c6bb, 0xa14e3a3f171bac586c55e83f, 0x4fa9ac0fc3688c4f9774b905, 0x17f1d3a73197d7942695638c, 0xecb751bad54dcd6b939c2ca, 0x6655b9d5caac42364e6f38ba, 0xcf2e21f267816aef1db507c9, 0x114d1d6855d545a8aa7d76c8, 0x100000000000000000000000000000001, 0x0, 0x1, 0x0, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xba6f9a258a5c81eb5c00d6d3, limb1: 0xa5d26fbf164440da345149b7, limb2: 0xf226b85ccdee44779e368a95, limb3: 0x187795607228007e29c792fb, }, y: u384 { limb0: 0x7393cfd2196053529ef8ea01, limb1: 0xf856ee4c4e2adaa88c09b7d9, limb2: 0x499710d15a098f2ff8b26e13, limb3: 0x119aed04afd21b50d616ee0e, }, }, ); } #[test] #[ignore] fn test_msm_SECP256R1_1P_edge_case() { let mut data = array![ 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2deb33a0f4a13945d898c296, 0xf8bce6e563a440f277037d81, 0x6b17d1f2e12c4247, 0x0, 0x6b315ececbb6406837bf51f5, 0x8ee7eb4a7c0f9e162bce3357, 0x4fe342e2fe1a7f9b, 0x0, 0x2, 0x0, 0x0, 0xbce6faada7179e84f3b9cac2fc632550, 0xffffffff00000000ffffffffffffffff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x100000000000000000000000000000001, 0x2deb33a0f4a13945d898c296, 0xf8bce6e563a440f277037d81, 0x6b17d1f2e12c4247, 0x0, 0x94cea1313449bf97c840ae0a, 0x711814b583f061e9d431cca9, 0xb01cbd1c01e58065, 0x0, 0x1, 0x1, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x2deb33a0f4a13945d898c296, limb1: 0xf8bce6e563a440f277037d81, limb2: 0x6b17d1f2e12c4247, limb3: 0x0, }, y: u384 { limb0: 0x94cea1313449bf97c840ae0a, limb1: 0x711814b583f061e9d431cca9, limb2: 0xb01cbd1c01e58065, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256R1_2P_edge_case() { let mut data = array![ 0x3, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2deb33a0f4a13945d898c296, 0xf8bce6e563a440f277037d81, 0x6b17d1f2e12c4247, 0x0, 0x6b315ececbb6406837bf51f5, 0x8ee7eb4a7c0f9e162bce3357, 0x4fe342e2fe1a7f9b, 0x0, 0x3, 0x0, 0x0, 0xeb1167b367a9c3787c65c1e582e2e662, 0xf7c1bd874da5e709d4713d60c8a70639, 0xbce6faada7179e84f3b9cac2fc632550, 0xffffffff00000000ffffffffffffffff, 0x3, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0x1, 0x100000000000000000000000000000001, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35a5b9ab55bd33dd4dec8ec8c85b8754, 0x1256a1018e9a2606d3efc444e5bc9e97, 0x2deb33a0f4a13945d898c296, 0xf8bce6e563a440f277037d81, 0x6b17d1f2e12c4247, 0x0, 0x94cea1313449bf97c840ae0a, 0x711814b583f061e9d431cca9, 0xb01cbd1c01e58065, 0x0, 0x1, 0x1, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x2deb33a0f4a13945d898c296, limb1: 0xf8bce6e563a440f277037d81, limb2: 0x6b17d1f2e12c4247, limb3: 0x0, }, y: u384 { limb0: 0x94cea1313449bf97c840ae0a, limb1: 0x711814b583f061e9d431cca9, limb2: 0xb01cbd1c01e58065, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256R1_3P_edge_case() { let mut data = array![ 0x4, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0xd3ff147ff0ee4213f51f677d, 0x431366a7732a6e4a6b942255, 0x9fe743b25d39a591, 0x0, 0x7f8bb562ff60a902ef14bcb0, 0xeb9420089fa531db62e806a6, 0xfd028df433dfd5cc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2deb33a0f4a13945d898c296, 0xf8bce6e563a440f277037d81, 0x6b17d1f2e12c4247, 0x0, 0x6b315ececbb6406837bf51f5, 0x8ee7eb4a7c0f9e162bce3357, 0x4fe342e2fe1a7f9b, 0x0, 0x4, 0x0, 0x0, 0xe443df789558867f5ba91faf7a024204, 0x23a7711a8133287637ebdcd9e87a1613, 0x1846d424c17c627923c6612f48268673, 0xfcbd04c340212ef7cca5a5a19e4d6e3c, 0xbce6faada7179e84f3b9cac2fc632550, 0xffffffff00000000ffffffffffffffff, 0x3, 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0x1, 0x100000000000000000000000000000001, 0x33ee7695471a03192ef22266, 0xb449dd8cfd0c3438e14a718c, 0x1fbb33f079b828e2, 0x0, 0xb411f97aeec2eae6044122ec, 0xcdce180b60667260d7ce284e, 0xa73a7381dd3b07c, 0x0, 0x29fa93ff2e088f257810ffaf340cbe2f, 0x67db401fe06eea845a19e61367b76a34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44faf735503f8d6a4fd7c1f1541b0e83, 0x108efc1b039167d94064f65615a509dcb, 0x2deb33a0f4a13945d898c296, 0xf8bce6e563a440f277037d81, 0x6b17d1f2e12c4247, 0x0, 0x94cea1313449bf97c840ae0a, 0x711814b583f061e9d431cca9, 0xb01cbd1c01e58065, 0x0, 0x1, 0x1, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xdffcaf62be678f4d3d103700, limb1: 0x4ae0c3b5a4fb0e4e7ee75279, limb2: 0x651ce75927276c9a, limb3: 0x0, }, y: u384 { limb0: 0xb27867c3cd0eb05ed74c5f9c, limb1: 0xd30f6d2e04931e22def1d510, limb2: 0x645a0d9d9776e75f, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256K1_1P_edge_case() { let mut data = array![ 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2dce28d959f2815b16f81798, 0x55a06295ce870b07029bfcdb, 0x79be667ef9dcbbac, 0x0, 0xa68554199c47d08ffb10d4b8, 0x5da4fbfc0e1108a8fd17b448, 0x483ada7726a3c465, 0x0, 0x2, 0x0, 0x0, 0xbaaedce6af48a03bbfd25e8cd0364140, 0xfffffffffffffffffffffffffffffffe, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2dce28d959f2815b16f81798, 0x55a06295ce870b07029bfcdb, 0x79be667ef9dcbbac, 0x0, 0x597aabe663b82f6f04ef2777, 0xa25b0403f1eef75702e84bb7, 0xb7c52588d95c3b9a, 0x0, 0x100000000000000000000000000000001, 0x0, 0x1, 0x0, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x2dce28d959f2815b16f81798, limb1: 0x55a06295ce870b07029bfcdb, limb2: 0x79be667ef9dcbbac, limb3: 0x0, }, y: u384 { limb0: 0x597aabe663b82f6f04ef2777, limb1: 0xa25b0403f1eef75702e84bb7, limb2: 0xb7c52588d95c3b9a, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256K1_2P_edge_case() { let mut data = array![ 0x3, 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2dce28d959f2815b16f81798, 0x55a06295ce870b07029bfcdb, 0x79be667ef9dcbbac, 0x0, 0xa68554199c47d08ffb10d4b8, 0x5da4fbfc0e1108a8fd17b448, 0x483ada7726a3c465, 0x0, 0x3, 0x0, 0x0, 0xeb1167b367a9c3787c65c1e582e2e662, 0xf7c1bd874da5e709d4713d60c8a70639, 0xbaaedce6af48a03bbfd25e8cd0364140, 0xfffffffffffffffffffffffffffffffe, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100000000000000006d17da9dde38d3aa, 0x100000000000000008e0801a3d001f325, 0x87ea3597eb650e8, 0xe42d003a1f0e89bd, 0x2dce28d959f2815b16f81798, 0x55a06295ce870b07029bfcdb, 0x79be667ef9dcbbac, 0x0, 0x597aabe663b82f6f04ef2777, 0xa25b0403f1eef75702e84bb7, 0xb7c52588d95c3b9a, 0x0, 0x100000000000000000000000000000001, 0x0, 0x1, 0x0, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x2dce28d959f2815b16f81798, limb1: 0x55a06295ce870b07029bfcdb, limb2: 0x79be667ef9dcbbac, limb3: 0x0, }, y: u384 { limb0: 0x597aabe663b82f6f04ef2777, limb1: 0xa25b0403f1eef75702e84bb7, limb2: 0xb7c52588d95c3b9a, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_SECP256K1_3P_edge_case() { let mut data = array![ 0x4, 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0xfdfdc509f368ba4395773d3a, 0x8de2b60b577a13d0f83b578e, 0xc2dd970269530ba2, 0x0, 0x589fa250d638e35400c12ddf, 0xb3aac19fcb5095808402aa7f, 0xed6de6590d0195d1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2dce28d959f2815b16f81798, 0x55a06295ce870b07029bfcdb, 0x79be667ef9dcbbac, 0x0, 0xa68554199c47d08ffb10d4b8, 0x5da4fbfc0e1108a8fd17b448, 0x483ada7726a3c465, 0x0, 0x4, 0x0, 0x0, 0xe443df789558867f5ba91faf7a024204, 0x23a7711a8133287637ebdcd9e87a1613, 0x1846d424c17c627923c6612f48268673, 0xfcbd04c340212ef7cca5a5a19e4d6e3c, 0xbaaedce6af48a03bbfd25e8cd0364140, 0xfffffffffffffffffffffffffffffffe, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x55909ba28af82ea934a4b85d, 0x4bf448ca5d57fb119c843e0a, 0x6a2275491b991ee3, 0x0, 0x5bf4bf0cefc9553422e60eb0, 0x178d55925d3d72f44783f626, 0xe13a21d7302f8139, 0x0, 0x4bab076cac43472e, 0x896dcc1031d19f2d, 0x100000000000000006f45630d920758e7, 0x13bfcc5670fee7eb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40c3f72fa123bad6, 0x461e3a87e8955f53, 0x53ec0e0286c9f6ad, 0x1000000000000000074832ec5bb09d4f6, 0x2dce28d959f2815b16f81798, 0x55a06295ce870b07029bfcdb, 0x79be667ef9dcbbac, 0x0, 0x597aabe663b82f6f04ef2777, 0xa25b0403f1eef75702e84bb7, 0xb7c52588d95c3b9a, 0x0, 0x100000000000000000000000000000001, 0x0, 0x1, 0x0, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x8ae1b945a4bee5df2482580e, limb1: 0x113a509c4213fb90b017895a, limb2: 0xdb53345431b0c359, limb3: 0x0, }, y: u384 { limb0: 0x5f8a05f7d421794bf1c2f718, limb1: 0xf026f2017517996e6dc446ce, limb2: 0xc09762999f005286, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_ED25519_1P_edge_case() { let mut data = array![ 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd617c9aca55c89b025aef35, 0xf00b8f02f1c20618a9c13fdf, 0x2a78dd0fd02c0339, 0x0, 0x807131659b7830f3f62c1d14, 0xbe483ba563798323cf6fd061, 0x29c644a5c71da22e, 0x0, 0x2, 0x0, 0x0, 0x14def9dea2f79cd65812631a5cf5d3ec, 0x10000000000000000000000000000000, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x100000000000000000000000000000001, 0xd617c9aca55c89b025aef35, 0xf00b8f02f1c20618a9c13fdf, 0x2a78dd0fd02c0339, 0x0, 0x7f8ece9a6487cf0c09d3e2d9, 0x41b7c45a9c867cdc30902f9e, 0x5639bb5a38e25dd1, 0x0, 0x1, 0x1, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xd617c9aca55c89b025aef35, limb1: 0xf00b8f02f1c20618a9c13fdf, limb2: 0x2a78dd0fd02c0339, limb3: 0x0, }, y: u384 { limb0: 0x7f8ece9a6487cf0c09d3e2d9, limb1: 0x41b7c45a9c867cdc30902f9e, limb2: 0x5639bb5a38e25dd1, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_ED25519_2P_edge_case() { let mut data = array![ 0x3, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd617c9aca55c89b025aef35, 0xf00b8f02f1c20618a9c13fdf, 0x2a78dd0fd02c0339, 0x0, 0x807131659b7830f3f62c1d14, 0xbe483ba563798323cf6fd061, 0x29c644a5c71da22e, 0x0, 0x3, 0x0, 0x0, 0xb4862b21fb97d43588561712e8e5216a, 0x4b3e865e6f4590b9a164106cf6a659e, 0x14def9dea2f79cd65812631a5cf5d3ec, 0x10000000000000000000000000000000, 0x4, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x1, 0x100000000000000000000000000000001, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21ef407bea1953254c1bc318a0af2527, 0x1c147c0993c84eed5f426b94b3350045, 0xd617c9aca55c89b025aef35, 0xf00b8f02f1c20618a9c13fdf, 0x2a78dd0fd02c0339, 0x0, 0x7f8ece9a6487cf0c09d3e2d9, 0x41b7c45a9c867cdc30902f9e, 0x5639bb5a38e25dd1, 0x0, 0x1, 0x1, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xd617c9aca55c89b025aef35, limb1: 0xf00b8f02f1c20618a9c13fdf, limb2: 0x2a78dd0fd02c0339, limb3: 0x0, }, y: u384 { limb0: 0x7f8ece9a6487cf0c09d3e2d9, limb1: 0x41b7c45a9c867cdc30902f9e, limb2: 0x5639bb5a38e25dd1, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_ED25519_3P_edge_case() { let mut data = array![ 0x4, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x82e4a33f8e4e5881e791d86b, 0xbcb062435ae8ec5fdaeac4bf, 0x179e1bae9e0f9f34, 0x0, 0x19657783ba5660e255c21849, 0x7ed7474bcea7551fc71e46bc, 0x596c0a76b75f4756, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd617c9aca55c89b025aef35, 0xf00b8f02f1c20618a9c13fdf, 0x2a78dd0fd02c0339, 0x0, 0x807131659b7830f3f62c1d14, 0xbe483ba563798323cf6fd061, 0x29c644a5c71da22e, 0x0, 0x4, 0x0, 0x0, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0xa90f9c3af19922ad9b8a714e61a441c, 0xeb2083e6ce164dba0ff18e0242af9fc3, 0x2fc154703983ca8ea7e9d498c778ea6, 0x14def9dea2f79cd65812631a5cf5d3ec, 0x10000000000000000000000000000000, 0x4, 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xf046f8cd6e5a75fca71dd19b, 0x892b4613ef5c58df4ef692a4, 0x7527fa36f5738847, 0x0, 0x1, 0x100000000000000000000000000000001, 0xf7d884feff5aba51d9990dce, 0x999f1d302046c6266257ff5, 0x7f9caa5ee5815899, 0x0, 0x6d71279424538e87f8ecf2cc, 0x8a8a1d74581da5996a52bbaf, 0x29acff692eccea25, 0x0, 0x211c4f690d00cb3af0b34c381ddf6429, 0x10dbbf233e0f266b14c85329c2440c426, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3242668a77ced3cb6ca4b87c1b759c91, 0x128e825972592d2a632df711368a1c105, 0xd617c9aca55c89b025aef35, 0xf00b8f02f1c20618a9c13fdf, 0x2a78dd0fd02c0339, 0x0, 0x7f8ece9a6487cf0c09d3e2d9, 0x41b7c45a9c867cdc30902f9e, 0x5639bb5a38e25dd1, 0x0, 0x1, 0x1, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xea1930f7f9c99711b76d5726, limb1: 0xa06d0a2a0011cdaa581c307a, limb2: 0x6a9d379c7dcfb5b6, limb3: 0x0, }, y: u384 { limb0: 0xe529194a47d7db7a9a8b88b1, limb1: 0xebb88d8901d42d55b9966ff5, limb2: 0x2ea083fb0eb0877c, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_GRUMPKIN_1P_edge_case() { let mut data = array![ 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xf1181294833fc48d823f272c, 0xcf135e7506a45d632d270d45, 0x2, 0x0, 0x2, 0x0, 0x0, 0x97816a916871ca8d3c208c16d87cfd46, 0x30644e72e131a029b85045b68181585d, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x100000000000000000000000000000001, 0x1, 0x0, 0x0, 0x0, 0x88a15dfcc0a231066dc0d8d5, 0xe93ce7417adcfaf9fb0cdb02, 0x30644e72e131a026, 0x0, 0x1, 0x1, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, y: u384 { limb0: 0x88a15dfcc0a231066dc0d8d5, limb1: 0xe93ce7417adcfaf9fb0cdb02, limb2: 0x30644e72e131a026, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_GRUMPKIN_2P_edge_case() { let mut data = array![ 0x3, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xf1181294833fc48d823f272c, 0xcf135e7506a45d632d270d45, 0x2, 0x0, 0x3, 0x0, 0x0, 0xb4862b21fb97d43588561712e8e5216a, 0x967d0cae6f4590b9a164106cf6a659e, 0x97816a916871ca8d3c208c16d87cfd46, 0x30644e72e131a029b85045b68181585d, 0x5, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x1, 0x100000000000000000000000000000001, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5520c252aad219e02bf5055a4ed023b7, 0x197e50b8e7adb6dd93eeede129c12721, 0x1, 0x0, 0x0, 0x0, 0x88a15dfcc0a231066dc0d8d5, 0xe93ce7417adcfaf9fb0cdb02, 0x30644e72e131a026, 0x0, 0x1, 0x1, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, y: u384 { limb0: 0x88a15dfcc0a231066dc0d8d5, limb1: 0xe93ce7417adcfaf9fb0cdb02, limb2: 0x30644e72e131a026, limb3: 0x0, }, }, ); } #[test] #[ignore] fn test_msm_GRUMPKIN_3P_edge_case() { let mut data = array![ 0x4, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x20669ef12954f8e3bbc8b4d3, 0x396a6f7243c27ce553121ee3, 0x11438ca2ec259aed, 0x0, 0xa560a5759c90985fde99aca0, 0xc5b21186cc6dcd0421026513, 0x21fb1f47c6ac55b3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xf1181294833fc48d823f272c, 0xcf135e7506a45d632d270d45, 0x2, 0x0, 0x4, 0x0, 0x0, 0x12e0c8b2bad640fb19488dec4f65d4d9, 0x1521f387af19922ad9b8a714e61a441c, 0x5a92118719c78df48f4ff31e78de5857, 0x28fcb26f9c6316b950f244556f25e2a2, 0x97816a916871ca8d3c208c16d87cfd46, 0x30644e72e131a029b85045b68181585d, 0x5, 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x371e7b6a5c01505bd4334e81, 0x2f596ae4492a87c66f7bda1a, 0x9dffb4dcdb94df9, 0x0, 0x1, 0x100000000000000000000000000000001, 0xf47b4ee8eecf8576c38173d8, 0x755d90a26c30d7d6fb33afd3, 0x5e835e05fdb55c5, 0x0, 0x990d5f4767a8d057f8695e4e, 0x5f8dd4e272c268c0d2ce4a39, 0x1704905427d31a82, 0x0, 0x39dea48eef47b3e6bcae980c9112d477, 0x538cc4627274d8f320bf5df15c887356, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10a2e45b33049f11b360c09b6389565b, 0x63f1d0c59d848c415389772b72561b3d, 0x1, 0x0, 0x0, 0x0, 0x88a15dfcc0a231066dc0d8d5, 0xe93ce7417adcfaf9fb0cdb02, 0x30644e72e131a026, 0x0, 0x1, 0x1, ] .span(); let points = Serde::deserialize(ref data).unwrap(); let scalars = Serde::deserialize(ref data).unwrap(); let curve_id = Serde::deserialize(ref data).unwrap(); let res = msm_g1(points, scalars, curve_id, data); assert!( res == G1Point { x: u384 { limb0: 0xf8c1f1ea2f76ef32e8aaa1e5, limb1: 0x4f332469fd3c88e2a2a255c6, limb2: 0x25bea91cb12ea60f, limb3: 0x0, }, y: u384 { limb0: 0x13dd399b7d2ee3c5048e382d, limb1: 0x8d9fd23cff123740ae29ea9a, limb2: 0x8aa44466337bea4, limb3: 0x0, }, }, ); } ================================================ FILE: src/src/tests/autogenerated/pairing_tests.cairo ================================================ use garaga::definitions::{ E12D, G1G2Pair, G1Point, G2Line, G2Point, MillerLoopResultScalingFactor, u288, u384, }; use garaga::groth16::{ multi_pairing_check_bls12_381_3P_2F_with_extra_miller_loop_result, multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result, }; use garaga::pairing_check::{ MPCheckHintBLS12_381, MPCheckHintBN254, multi_pairing_check_bls12_381_2P_2F, multi_pairing_check_bn254_2P_2F, }; #[test] fn test_BN254_mpcheck_2P_2F() { let pair0: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { limb0: 0xcdb6d03cb7b9a5409b7efcd8, limb1: 0xd1df87eab84852372b905c9c, limb2: 0x1d0634f3f21e7890, limb3: 0x0, }, y: u384 { limb0: 0xaa1d4f4d3021032564460978, limb1: 0xeb3f1d6ba3b10e2b53dc193b, limb2: 0x24c53532773dce26, limb3: 0x0, }, }, q: G2Point { x0: u384 { limb0: 0xf75edadd46debd5cd992f6ed, limb1: 0x426a00665e5c4479674322d4, limb2: 0x1800deef121f1e76, limb3: 0x0, }, x1: u384 { limb0: 0x35a9e71297e485b7aef312c2, limb1: 0x7260bfb731fb5d25f1aa4933, limb2: 0x198e9393920d483a, limb3: 0x0, }, y0: u384 { limb0: 0xc43d37b4ce6cc0166fa7daa, limb1: 0x4aab71808dcb408fe3d1e769, limb2: 0x12c85ea5db8c6deb, limb3: 0x0, }, y1: u384 { limb0: 0x70b38ef355acdadcd122975b, limb1: 0xec9e99ad690c3395bc4b3133, limb2: 0x90689d0585ff075, limb3: 0x0, }, }, }; let pair1: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { limb0: 0x536c985db33c69f7c242e07a, limb1: 0xfc531bccffafcf1e59d91fb9, limb2: 0x2585e4f8a31664cb, limb3: 0x0, }, y: u384 { limb0: 0x57fa42444057cf0c1d62ae3c, limb1: 0x4f48d341183118d68ea41313, limb2: 0x1d2d2799db056ed1, limb3: 0x0, }, }, q: G2Point { x0: u384 { limb0: 0x335eb0538f718d8e6651eeb1, limb1: 0x635e573808d9d5c7178bdce7, limb2: 0x1314aaf1c372e6d7, limb3: 0x0, }, x1: u384 { limb0: 0x5289f29ccc5acf5e81526673, limb1: 0x2d4aba9e1448a8cc1048d01a, limb2: 0x14c25d3aec745e5a, limb3: 0x0, }, y0: u384 { limb0: 0x10d1d0efd5869ecd23aab8e9, limb1: 0xba7d1de6d86501d49b6a8dab, limb2: 0x397391b7b25e2f, limb3: 0x0, }, y1: u384 { limb0: 0x385a553ea12434f4eda6db36, limb1: 0xb058c1ff7e4c5c7ec7e5859b, limb2: 0x1863ac65eca09e89, limb3: 0x0, }, }, }; let lines = array![ G2Line { r0a0: u288 { limb0: 0x4d347301094edcbfa224d3d5, limb1: 0x98005e68cacde68a193b54e6, limb2: 0x237db2935c4432bc, }, r0a1: u288 { limb0: 0x6b4ba735fba44e801d415637, limb1: 0x707c3ec1809ae9bafafa05dd, limb2: 0x124077e14a7d826a, }, r1a0: u288 { limb0: 0x49a8dc1dd6e067932b6a7e0d, limb1: 0x7676d0000961488f8fbce033, limb2: 0x3b7178c857630da, }, r1a1: u288 { limb0: 0x98c81278efe1e96b86397652, limb1: 0xe3520b9dfa601ead6f0bf9cd, limb2: 0x2b17c2b12c26fdd0, }, }, G2Line { r0a0: u288 { limb0: 0x7e165b3014d84802bf01484e, limb1: 0x3260b32ceced0b1243d4c84e, limb2: 0x2d4b148197812cd9, }, r0a1: u288 { limb0: 0xed50630084c5fc98c14adf76, limb1: 0x8b3e4e11609f5b1ec2a4a3fd, limb2: 0x9449ebaa6581db4, }, r1a0: u288 { limb0: 0x6dbbec1fa71f727fad9c2035, limb1: 0x2d74c51612b1473f7a789efb, limb2: 0x219b1595f2e94586, }, r1a1: u288 { limb0: 0x18b802809d63c96cb122eb63, limb1: 0x971ad93ce0fb9233480bfe98, limb2: 0x1cf3a36431cdb52c, }, }, G2Line { r0a0: u288 { limb0: 0x1b3d578c32d1af5736582972, limb1: 0x204fe74db6b371d37e4615ab, limb2: 0xce69bdf84ed6d6d, }, r0a1: u288 { limb0: 0xfd262357407c3d96bb3ba710, limb1: 0x47d406f500e66ea29c8764b3, limb2: 0x1e23d69196b41dbf, }, r1a0: u288 { limb0: 0x1ec8ee6f65402483ad127f3a, limb1: 0x41d975b678200fce07c48a5e, limb2: 0x2cad36e65bbb6f4f, }, r1a1: u288 { limb0: 0xcfa9b8144c3ea2ab524386f5, limb1: 0xd4fe3a18872139b0287570c3, limb2: 0x54c8bc1b50aa258, }, }, G2Line { r0a0: u288 { limb0: 0xb5ee22ba52a7ed0c533b7173, limb1: 0xbfa13123614ecf9c4853249b, limb2: 0x6567a7f6972b7bb, }, r0a1: u288 { limb0: 0xcf422f26ac76a450359f819e, limb1: 0xc42d7517ae6f59453eaf32c7, limb2: 0x899cb1e339f7582, }, r1a0: u288 { limb0: 0x9f287f4842d688d7afd9cd67, limb1: 0x30af75417670de33dfa95eda, limb2: 0x1121d4ca1c2cab36, }, r1a1: u288 { limb0: 0x7c4c55c27110f2c9a228f7d8, limb1: 0x8f14f6c3a2e2c9d74b347bfe, limb2: 0x83ef274ba7913a5, }, }, G2Line { r0a0: u288 { limb0: 0xea5b6f5d27484414197bb4f9, limb1: 0x85ef928994944d4b53aca242, limb2: 0x31939f149b07350, }, r0a1: u288 { limb0: 0x7b21678cb75a8f7e17321dd1, limb1: 0x2d11f7a520e1fd3ed4dcc693, limb2: 0x271fafb83ad98275, }, r1a0: u288 { limb0: 0xfab5de6d950119972ae0dd12, limb1: 0x8adb80a06ed0111e1d08cb95, limb2: 0xec938dcee485aa3, }, r1a1: u288 { limb0: 0x4fb9c80c9ebcc2aa275a11e4, limb1: 0x21356c79a085c62a4f756bf9, limb2: 0x1370ab0eaf63eafd, }, }, G2Line { r0a0: u288 { limb0: 0xc0f94eb338d27e3d9c3c54bf, limb1: 0xcbc81234f5e7a25b356780b1, limb2: 0x2d7855cb075109f7, }, r0a1: u288 { limb0: 0x284c304021c8efe832d4019, limb1: 0xcf072fe1e6a5712c6939b2e5, limb2: 0x2aebdfbcb148dbd2, }, r1a0: u288 { limb0: 0xd7b47c349d5fa8cbc0c0bdc4, limb1: 0x262a79a0c9001db94d4629e6, limb2: 0x229b6a2be2e077d7, }, r1a1: u288 { limb0: 0x5ac06a263b3dad67c61b9b1a, limb1: 0x218d4cdc4cddee7306803f0c, limb2: 0x2c404c393f42c23c, }, }, G2Line { r0a0: u288 { limb0: 0xfc23a674d089e9cfdefb1db8, limb1: 0x9ddfd61d289b65a9b4254476, limb2: 0x1e2f561324ef4447, }, r0a1: u288 { limb0: 0xf67a6a9e31f6975b220642ea, limb1: 0xccd852893796296e4d1ed330, limb2: 0x94ff1987d19b62, }, r1a0: u288 { limb0: 0x360c2a5aca59996d24cc1947, limb1: 0x66c2d7d0d176a3bc53f386e8, limb2: 0x2cfcc62a17fbeecb, }, r1a1: u288 { limb0: 0x2ddc73389dd9a9e34168d8a9, limb1: 0xae9afc57944748b835cbda0f, limb2: 0x12f0a1f8cf564067, }, }, G2Line { r0a0: u288 { limb0: 0x9e2613c20164688ed46379a, limb1: 0x716db3679a44c686aa59d1ab, limb2: 0x15001844790ca939, }, r0a1: u288 { limb0: 0x6fbc98bc7a182aa3dd0cb359, limb1: 0xc97408d0c1cf3952033b11b0, limb2: 0x1ab481f0cb16916b, }, r1a0: u288 { limb0: 0x7f38f154b08df182e2924e74, limb1: 0xba31b530302528255113573a, limb2: 0x933362e822d9bbb, }, r1a1: u288 { limb0: 0xfe131760a10954277d407df3, limb1: 0x7fa6f47454535d07b1c8ffad, limb2: 0x966415d59cef8df, }, }, G2Line { r0a0: u288 { limb0: 0x9c963c4bdade6ce3d460b077, limb1: 0x1738311feefc76f565e34e8a, limb2: 0x1aae0d6c9e9888ad, }, r0a1: u288 { limb0: 0x9272581fdf80b045c9c3f0a, limb1: 0x3946807b0756e87666798edb, limb2: 0x2bf6eeda2d8be192, }, r1a0: u288 { limb0: 0x3e957661b35995552fb475de, limb1: 0xd8076fa48f93f09d8128a2a8, limb2: 0xb6f87c3f00a6fcf, }, r1a1: u288 { limb0: 0xcf17d6cd2101301246a8f264, limb1: 0x514d04ad989b91e697aa5a0e, limb2: 0x175f17bbd0ad1219, }, }, G2Line { r0a0: u288 { limb0: 0x894bc18cc70ca1987e3b8f9f, limb1: 0xd4bfa535181f0f8659b063e3, limb2: 0x19168d524164f463, }, r0a1: u288 { limb0: 0x850ee8d0e9b58b82719a6e92, limb1: 0x9fc4eb75cbb027c137d48341, limb2: 0x2b2f8a383d944fa0, }, r1a0: u288 { limb0: 0x5451c8974a709483c2b07fbd, limb1: 0xd7e09837b8a2a3b78e7fe525, limb2: 0x347d96be5e7fa31, }, r1a1: u288 { limb0: 0x823f2ba2743ee254e4c18a1e, limb1: 0x6a61af5db035c443ed0f8172, limb2: 0x1e840eee275d1063, }, }, G2Line { r0a0: u288 { limb0: 0x97890ec993740b1ca0337563, limb1: 0x4fa454f0d8b7b9f3e996a148, limb2: 0x2687d9105ae36d86, }, r0a1: u288 { limb0: 0x94553c479c2341dd9d19c228, limb1: 0xf3893568e1c69e8691e6d21d, limb2: 0x176dd970f5c96141, }, r1a0: u288 { limb0: 0x10b35743d178c928ae8988f3, limb1: 0x4e09ad83d2ef00527273723e, limb2: 0x2357f050a2e191c4, }, r1a1: u288 { limb0: 0x4c47ba83a5200a671c9a6e66, limb1: 0x9ed7cd2e0db8b052d78aeccf, limb2: 0x2b778d052020e24f, }, }, G2Line { r0a0: u288 { limb0: 0x38f9cedd0c82018426759a6e, limb1: 0x44c9564dd70a19718df031b9, limb2: 0x2c123a573f011ecf, }, r0a1: u288 { limb0: 0xdc5f6dd6fabcfd365452fd48, limb1: 0x3be2013bcd845c73bef09c2a, limb2: 0x20a73a0d44be878, }, r1a0: u288 { limb0: 0x9d6fc1cc6d53b9b473418843, limb1: 0x179167ea194fa9a3fb5546bf, limb2: 0x122aeeaaf6e42f52, }, r1a1: u288 { limb0: 0x3b7e8d815b2f3ad687c6b33b, limb1: 0xbfacefc007f6e8b61a5b0930, limb2: 0x14d40bc6eff71288, }, }, G2Line { r0a0: u288 { limb0: 0x18d630598e58bb5d0102b30e, limb1: 0x9767e27b02a8da37411a2787, limb2: 0x100a541662b9cd7c, }, r0a1: u288 { limb0: 0x4ca7313df2e168e7e5ea70, limb1: 0xd49cce6abd50b574f31c2d72, limb2: 0x78a2afbf72317e7, }, r1a0: u288 { limb0: 0x6d99388b0a1a67d6b48d87e0, limb1: 0x1d8711d321a193be3333bc68, limb2: 0x27e76de53a010ce1, }, r1a1: u288 { limb0: 0x77341bf4e1605e982fa50abd, limb1: 0xc5cf10db170b4feaaf5f8f1b, limb2: 0x762adef02274807, }, }, G2Line { r0a0: u288 { limb0: 0x3896b4539101a9d082d01df0, limb1: 0x1bdd4fa3c048c10eb04232b4, limb2: 0x2bbc70702a7f5b2d, }, r0a1: u288 { limb0: 0x617716ce0b0fc90781832057, limb1: 0x800927818218483eb3cf9245, limb2: 0x211e4fc4a1ae2c66, }, r1a0: u288 { limb0: 0xe7b44e14a444b645b8c0b11f, limb1: 0x2b07f556a654bd49cd865885, limb2: 0x1866e4634404cecf, }, r1a1: u288 { limb0: 0x48a0768996bd4017ff614ce, limb1: 0x4f0066744ba90bd46ee6e88e, limb2: 0x1de00ce581b3556f, }, }, G2Line { r0a0: u288 { limb0: 0xa137b991ba9048aee9fa0bc7, limb1: 0xf5433785c186cd1100ab6b80, limb2: 0xab519fd7cf8e7f9, }, r0a1: u288 { limb0: 0x90832f45d3398c60aa1a74e2, limb1: 0x17f7ac209532723f22a344b, limb2: 0x23db979f8481c5f, }, r1a0: u288 { limb0: 0x723b0e23c2808a5d1ea6b11d, limb1: 0x3030030d26411f84235c3af5, limb2: 0x122e78da5509eddb, }, r1a1: u288 { limb0: 0xf1718c1e21a9bc3ec822f319, limb1: 0xf5ee6dfa3bd3272b2f09f0c7, limb2: 0x5a29c1e27616b34, }, }, G2Line { r0a0: u288 { limb0: 0x7369b6adc59d1ad1956aa29c, limb1: 0x5a1a92f3dda868e7423f70bd, limb2: 0x13da850286346586, }, r0a1: u288 { limb0: 0x5eedbb4b5f1b8c52d4ff5734, limb1: 0x9988f4f6e06343ab4f5831ad, limb2: 0xfbbd4d49b51a489, }, r1a0: u288 { limb0: 0x9cd983785651ba1c2c06bf74, limb1: 0x21f088328b5920e22e7a73f6, limb2: 0x1e16dd13e77f83f4, }, r1a1: u288 { limb0: 0x44bdd6e622016e7b7287c24f, limb1: 0xb454bfef81527e305bd509e6, limb2: 0x25b37c864eb9335d, }, }, G2Line { r0a0: u288 { limb0: 0xbc1ede480873fceb8739511e, limb1: 0xd5a60533bd0ce7869efbc15, limb2: 0x182c17d793eba74d, }, r0a1: u288 { limb0: 0x83bf38d91876ad8999516bc2, limb1: 0x7756322ea3dc079289d51f2d, limb2: 0x1d0f6156a89a4244, }, r1a0: u288 { limb0: 0x6aba652f197be8f99707b88c, limb1: 0xbf94286c245794ea0f562f32, limb2: 0x25a358967a2ca81d, }, r1a1: u288 { limb0: 0xc028cbff48c01433e8b23568, limb1: 0xd2e791f5772ed43b056beba1, limb2: 0x83eb38dff4960e, }, }, G2Line { r0a0: u288 { limb0: 0xea4e2dfe89a1e44be7ce1e1c, limb1: 0x5a92c01d769c449c202b3214, limb2: 0xff9af539be5c8c9, }, r0a1: u288 { limb0: 0x787ac32ae432e43bed70fb07, limb1: 0x4a33b653a031d4b9f2785ff3, limb2: 0x26614c3211203a55, }, r1a0: u288 { limb0: 0xb191249d1a1f0c8c86ebe4ea, limb1: 0xad273f446b939f4f1f361ebf, limb2: 0xedc66a88aa083a1, }, r1a1: u288 { limb0: 0xdca5c397dab1714ac36c1bc8, limb1: 0x924f9820543a3519c11d3f74, limb2: 0x1ad8a781081d4a96, }, }, G2Line { r0a0: u288 { limb0: 0xc2a2b787d8e718e81970db80, limb1: 0x5372abeaf56844dee60d6198, limb2: 0x131210153a2217d6, }, r0a1: u288 { limb0: 0x70421980313e09a8a0e5a82d, limb1: 0xf75ca1f68f4b8deafb1d3b48, limb2: 0x102113c9b6feb035, }, r1a0: u288 { limb0: 0x4654c11d73bda84873de9b86, limb1: 0xa67601bca2e595339833191a, limb2: 0x1c2b76e439adc8cc, }, r1a1: u288 { limb0: 0x9c53a48cc66c1f4d644105f2, limb1: 0xa17a18867557d96fb7c2f849, limb2: 0x1deb99799bd8b63a, }, }, G2Line { r0a0: u288 { limb0: 0xc32026c56341297fa080790c, limb1: 0xe23ad2ff283399133533b31f, limb2: 0xa6860f5c968f7ad, }, r0a1: u288 { limb0: 0x2966cf259dc612c6a4d8957d, limb1: 0xfba87ea86054f3db5774a08f, limb2: 0xc73408b6a646780, }, r1a0: u288 { limb0: 0x6272ce5976d8eeba08f66b48, limb1: 0x7dfbd78fa06509604c0cec8d, limb2: 0x181ec0eaa6660e45, }, r1a1: u288 { limb0: 0x48af37c1a2343555fbf8a357, limb1: 0xa7b5e1e20e64d6a9a9ce8e61, limb2: 0x1147dcea39a47abd, }, }, G2Line { r0a0: u288 { limb0: 0x9fd5ab512989c347dc77f420, limb1: 0xc1c85ee38ca3eb02a0a92db3, limb2: 0x2134aa9ca8e8d251, }, r0a1: u288 { limb0: 0xe4f274770138210ec97f351c, limb1: 0x95d8dbdcefe97681885f8ca3, limb2: 0x25c205641353bd02, }, r1a0: u288 { limb0: 0x67e5fc30cb9d54c952e30530, limb1: 0xbed1776ffd1f34cef4d280ba, limb2: 0x9bfcdc38d2edfbc, }, r1a1: u288 { limb0: 0x2cdc4960c64fd9f1e1d8c062, limb1: 0x25ab4699c0326eb69704502c, limb2: 0x1a1bfdd2477bfb3, }, }, G2Line { r0a0: u288 { limb0: 0xc01f15fdcbfada9ddb6d29e5, limb1: 0x1c597a278f91d2146e39417b, limb2: 0x1e738c819e505603, }, r0a1: u288 { limb0: 0xc448617c638a5f5a3d7bb80b, limb1: 0xe5c0daa3ccc9d0066e8748e6, limb2: 0x1531822272e52502, }, r1a0: u288 { limb0: 0xe6dcbe5738e474a779a48437, limb1: 0x778679b9709f1160945eb1f4, limb2: 0x1c4c788451e4cdd3, }, r1a1: u288 { limb0: 0x9bb0e3bca45c662cc5a01154, limb1: 0xdcc6384e4ed67039e4f3a54d, limb2: 0x1e8aea6fd2e608bf, }, }, G2Line { r0a0: u288 { limb0: 0x4033c51e6e469818521cd2ae, limb1: 0xb71a4629a4696b2759f8e19e, limb2: 0x4f5744e29c1eb30, }, r0a1: u288 { limb0: 0xa4f47bbc60cb0649dca1c772, limb1: 0x835f427106f4a6b897c6cf23, limb2: 0x17ca6ea4855756bb, }, r1a0: u288 { limb0: 0x7f844a35c7eeadf511e67e57, limb1: 0x8bb54fb0b3688cac8860f10, limb2: 0x1c7258499a6bbebf, }, r1a1: u288 { limb0: 0x10d269c1779f96946e518246, limb1: 0xce6fcef6676d0dacd395dc1a, limb2: 0x2cf4c6ae1b55d87d, }, }, G2Line { r0a0: u288 { limb0: 0xc55a9ab2be5b1c5f99b4afdf, limb1: 0x443b75328adfb9d1d45195be, limb2: 0x568d5a8780d1576, }, r0a1: u288 { limb0: 0x85b522186579e779a3606ede, limb1: 0x1ebb4d198b300f1f7309a38f, limb2: 0x9f9cb82898a523d, }, r1a0: u288 { limb0: 0x731bed2ccf3a6cbf023ed5b, limb1: 0xcf340b50f74cdea1da20612a, limb2: 0x21d63865d400949d, }, r1a1: u288 { limb0: 0x552864462eb5b6c21cb44edb, limb1: 0x79eaf9afc4175e8707d58a17, limb2: 0x2f0de7da33934176, }, }, G2Line { r0a0: u288 { limb0: 0xab74a6bae36b17b1d2cc1081, limb1: 0x904cf03d9d30b1fe9dc71374, limb2: 0x14ffdd55685b7d82, }, r0a1: u288 { limb0: 0x277f7180b7cf33feded1583c, limb1: 0xc029c3968a75b612303c4298, limb2: 0x20ef4ba03605cdc6, }, r1a0: u288 { limb0: 0xd5a7a27c1baba3791ab18957, limb1: 0x973730213d5d70d3e62d6db, limb2: 0x24ca121c566eb857, }, r1a1: u288 { limb0: 0x9f4c2dea0492f548ae7d9e93, limb1: 0xe584b6b251a5227c70c5188, limb2: 0x22bcecac2bd5e51b, }, }, G2Line { r0a0: u288 { limb0: 0x340c82974f7221a53fc2f3ac, limb1: 0x7146f18cd591d423874996e7, limb2: 0xa6d154791056f46, }, r0a1: u288 { limb0: 0x70894ea6418890d53b5ee12a, limb1: 0x882290cb53b795b0e7c8c208, limb2: 0x1b5777dc18b2899b, }, r1a0: u288 { limb0: 0x99a0e528d582006a626206b6, limb1: 0xb1cf825d80e199c5c9c795b5, limb2: 0x2a97495b032f0542, }, r1a1: u288 { limb0: 0xc7cf5b455d6f3ba73debeba5, limb1: 0xbb0a01235687223b7b71d0e5, limb2: 0x250024ac44c35e3f, }, }, G2Line { r0a0: u288 { limb0: 0xd60abda751022b3ab52a71fb, limb1: 0xac2bdbc297c0590db6bfc3f6, limb2: 0x8eb71504cf2858c, }, r0a1: u288 { limb0: 0x6120b9134e8c6243cb4b6ab2, limb1: 0xd2116c2eb5a22f2b5c828eb8, limb2: 0x659ba27e279a722, }, r1a0: u288 { limb0: 0x89052eb421e5e6c50c145ffa, limb1: 0x61d9216517954ead7424ae94, limb2: 0x284310b8977a380c, }, r1a1: u288 { limb0: 0xbb92f5394c4983a885a8f465, limb1: 0x6246bb3479c74157b24f6745, limb2: 0x24da3c02db70be46, }, }, G2Line { r0a0: u288 { limb0: 0xb876e41dfcbf9c2c748bcbbf, limb1: 0xa86948ab4d29ceba965253f9, limb2: 0xd0080dd30431eab, }, r0a1: u288 { limb0: 0x1f7efe01d08f305661f923b3, limb1: 0xf265d5179bafe8cf813b9077, limb2: 0x1f37e85fd504232f, }, r1a0: u288 { limb0: 0xdeb3dcf52e8219964b3ca860, limb1: 0x8b80044bac7a9a9540370b1d, limb2: 0x208591589c3eecb3, }, r1a1: u288 { limb0: 0x32af49c4ba67546152124706, limb1: 0xf1767348c820427b48c1137d, limb2: 0x248a2111fa7d4710, }, }, G2Line { r0a0: u288 { limb0: 0xccf841cf5c1cf8f4a0485e28, limb1: 0xb5077662d0ce9d755af1446b, limb2: 0x2b08658e9d5ba5cb, }, r0a1: u288 { limb0: 0x6ce62184a15685babd77f27f, limb1: 0x5ff9bb7d74505b0542578299, limb2: 0x7244563488bab2, }, r1a0: u288 { limb0: 0xec778048d344ac71275d961d, limb1: 0x1273984019753000ad890d33, limb2: 0x27c2855e60d361bd, }, r1a1: u288 { limb0: 0xa7a0071e22af2f3a79a12da, limb1: 0xc84a6fd41c20759ff6ff169a, limb2: 0x23e7ef2a308e49d1, }, }, G2Line { r0a0: u288 { limb0: 0x159e03e80a712c3eb4bb2322, limb1: 0x152e9c0687bd5b6ed027fddc, limb2: 0xa5e3c400f76af96, }, r0a1: u288 { limb0: 0xad170c2df32989054acf70f0, limb1: 0x90e09c7dcbb9bf4ceb2c5ea4, limb2: 0xe20987b18a95c02, }, r1a0: u288 { limb0: 0xd41b9cbc90b68f69379ec96b, limb1: 0x6c8e7199aa1fea5f81256ace, limb2: 0xbacee39e0dd19dd, }, r1a1: u288 { limb0: 0xcf578a12f806c50b19311642, limb1: 0x2e7d9a7d24ff529e1b2e6943, limb2: 0x262bbe97a5dc53fe, }, }, G2Line { r0a0: u288 { limb0: 0x7105024c431a33683d9d0b9d, limb1: 0x12e23637b641ab0e5b322ad8, limb2: 0x2918e9e08c764c28, }, r0a1: u288 { limb0: 0x26384979d1f5417e451aeabf, limb1: 0xacfb499e362291d0b053bbf6, limb2: 0x2a6ad1a1f7b04ef6, }, r1a0: u288 { limb0: 0xba4db515be70c384080fc9f9, limb1: 0x5a983a6afa9cb830fa5b66e6, limb2: 0x8cc1fa494726a0c, }, r1a1: u288 { limb0: 0x59c9af9399ed004284eb6105, limb1: 0xef37f66b058b4c971d9c96b0, limb2: 0x2c1839afde65bafa, }, }, G2Line { r0a0: u288 { limb0: 0x5725ce4f02f7ca75d7189073, limb1: 0xd105fefd57a1a89e7a69faa3, limb2: 0x16a43b8238e9776f, }, r0a1: u288 { limb0: 0x25c4f2d5b972ced61efac33b, limb1: 0x7b68646179eb9d2ceda7914a, limb2: 0x1652bf6b8b1d3e3e, }, r1a0: u288 { limb0: 0xcb753ca19e3c38273d73e58a, limb1: 0xa9a697028f43b5b5c1faf7f8, limb2: 0x176d848a309eb7a, }, r1a1: u288 { limb0: 0x88a5193c45c3a80b0e66981a, limb1: 0xfd6ff58f8f6f9027281fb5f9, limb2: 0x25df2ca1dfba7366, }, }, G2Line { r0a0: u288 { limb0: 0x6bf13a27b0f4eb6657abc4b, limb1: 0xf78d57f089bffdf07c676bb3, limb2: 0x228e4aefbdd738df, }, r0a1: u288 { limb0: 0x4f41a40b04ec964619823053, limb1: 0xfa3fb44f4a80641a9bb3bc09, limb2: 0x29bf29a3d071ec4b, }, r1a0: u288 { limb0: 0x83823dcdff02bdc8a0e6aa03, limb1: 0x79ac92f113de29251cd73a98, limb2: 0x1ccdb791718d144, }, r1a1: u288 { limb0: 0xa074add9d066db9a2a6046b6, limb1: 0xef3a70034497456c7d001a5, limb2: 0x27d09562d815b4a6, }, }, G2Line { r0a0: u288 { limb0: 0x25e816712be02294b62c3be3, limb1: 0x13d1d46cbede4847bb0625b8, limb2: 0x9e1d1ffd8abfd4b, }, r0a1: u288 { limb0: 0x1c0d2715920fb25f1c6ffee5, limb1: 0x8f525d4d78921ab44b02a8ea, limb2: 0x1db798591d05a543, }, r1a0: u288 { limb0: 0x3329e474cb10234c64b9ee03, limb1: 0x576667fe79436c09a72a1e34, limb2: 0x134ac3bce6fa1ffc, }, r1a1: u288 { limb0: 0xfc08e5edb8edfaf73ad7f2b6, limb1: 0x781debc0d2178605c6f59e3f, limb2: 0x1f267149e0cc2034, }, }, G2Line { r0a0: u288 { limb0: 0x87a44d343cc761056f4f2eae, limb1: 0x18016f16818253360d2c8adf, limb2: 0x1bcd5c6e597d735e, }, r0a1: u288 { limb0: 0x593d7444c376f6d69289660b, limb1: 0x1d6d97020b59cf2e4b38be4f, limb2: 0x17133b62617f63a7, }, r1a0: u288 { limb0: 0x88cac99869bb335ec9553a70, limb1: 0x95bcfa7f7c0b708b4d737afc, limb2: 0x1eec79b9db274c09, }, r1a1: u288 { limb0: 0xe465a53e9fe085eb58a6be75, limb1: 0x868e45cc13e7fd9d34e11839, limb2: 0x2b401ce0f05ee6bb, }, }, G2Line { r0a0: u288 { limb0: 0x83f48fbac5c1b94486c2d037, limb1: 0xf95d9333449543de78c69e75, limb2: 0x7bca8163e842be7, }, r0a1: u288 { limb0: 0x60157b2ff6e4d737e2dac26b, limb1: 0x30ab91893fcf39d9dcf1b89, limb2: 0x29a58a02490d7f53, }, r1a0: u288 { limb0: 0x520f9cb580066bcf2ce872db, limb1: 0x24a6e42c185fd36abb66c4ba, limb2: 0x309b07583317a13, }, r1a1: u288 { limb0: 0x5a4c61efaa3d09a652c72471, limb1: 0xfcb2676d6aa28ca318519d2, limb2: 0x1405483699afa209, }, }, G2Line { r0a0: u288 { limb0: 0x96239ccb1673794f48c3814e, limb1: 0xa9424d7fd8d1cb457d8106a8, limb2: 0x18f633ca15146197, }, r0a1: u288 { limb0: 0x83821511cecf8050ab30d09b, limb1: 0xabe9d19055677c64212fb315, limb2: 0x17e8e943d4dd53dc, }, r1a0: u288 { limb0: 0xa3635311eefb6d8f006727b6, limb1: 0xe67ebc4b351851a29c182f14, limb2: 0x20be5ef63fa9f566, }, r1a1: u288 { limb0: 0xbdb0a8b8e3e37a1cad4fab9f, limb1: 0x12270bf0d7ba9cdcffa36b1c, limb2: 0x29de034e18f7685e, }, }, G2Line { r0a0: u288 { limb0: 0x208dc70e391d90d0bfb98656, limb1: 0xbfa819c7c80fa22a3aa2e036, limb2: 0x1a1213ebcb6adb0e, }, r0a1: u288 { limb0: 0xd6ae81e1044113f735597233, limb1: 0x43cc8817df94943fc400f20e, limb2: 0x2c4b9b2ee1ce9b7e, }, r1a0: u288 { limb0: 0x44af7f302b92dee29928a9b1, limb1: 0x4e6e061af95bc50d61b54813, limb2: 0x184eaff39795e0b5, }, r1a1: u288 { limb0: 0xd7f6b1aace297a73b349891, limb1: 0x3f66972428dc9236b93f8718, limb2: 0xf54166413a83eb9, }, }, G2Line { r0a0: u288 { limb0: 0xbfdfdae86101e29da3e869b8, limb1: 0xf969a9b961a28b872e56aac2, limb2: 0x1afdc719440d90f0, }, r0a1: u288 { limb0: 0xee43c995686f13baa9b07266, limb1: 0xbfa387a694c641cceee4443a, limb2: 0x104d8c02eb7f60c8, }, r1a0: u288 { limb0: 0x8d451602b3593e798aecd7fb, limb1: 0x69ffbefe7c5ac2cf68e8691e, limb2: 0x2ea064a1bc373d28, }, r1a1: u288 { limb0: 0x6e7a663073bfe88a2b02326f, limb1: 0x5faadb36847ca0103793fa4a, limb2: 0x26c09a8ec9303836, }, }, G2Line { r0a0: u288 { limb0: 0xda7e32ff636bb66ede683e6, limb1: 0x72508ca3cb51c08078df9e81, limb2: 0xcbffc477cdc6d53, }, r0a1: u288 { limb0: 0xec389fc066f7281a57220f62, limb1: 0xcb8aa465fb7a1fbef606f5f4, limb2: 0xae52f9f10665ce1, }, r1a0: u288 { limb0: 0x38510c3e655d75deba1be8d1, limb1: 0xeedd4d29f92ac584ba92062d, limb2: 0x2f2000eea8290b01, }, r1a1: u288 { limb0: 0x4d27e3af8c4b7ee38398ca08, limb1: 0x10704138acc1ba6a0c2845ed, limb2: 0x2a7ab438d02abe84, }, }, G2Line { r0a0: u288 { limb0: 0x3d038747ebac16adc1c50bdd, limb1: 0xe3706a783e99f73ac742aa1a, limb2: 0x17eac23b00b545ff, }, r0a1: u288 { limb0: 0xdc25ff0bd02abcbe502c4e37, limb1: 0x39b92e6ebb65e5f2d8504f90, limb2: 0x2415b5f61301dff6, }, r1a0: u288 { limb0: 0x9cdcb2146d15f37900db82ac, limb1: 0x96c3940e2f5c5f8198fadee3, limb2: 0x2f662ea79b473fc2, }, r1a1: u288 { limb0: 0xc0fb95686de65e504ed4c57a, limb1: 0xec396c7c4275d4e493b00713, limb2: 0x106d2aab8d90d517, }, }, G2Line { r0a0: u288 { limb0: 0x9c305c582cfb7a7d23b95811, limb1: 0x4bb6df7058c076c8852077bc, limb2: 0x260910f89761bfb5, }, r0a1: u288 { limb0: 0x7f49c8cd61b91f52a6e78d0b, limb1: 0x3a2ca7573f8e189320281763, limb2: 0x285987c9b92ff007, }, r1a0: u288 { limb0: 0xd9a09c023a61fcc1548df2ce, limb1: 0xa6582f6b78778a7cb28e1c1a, limb2: 0x1895d97b6e5913a6, }, r1a1: u288 { limb0: 0x6afbf3e269da5ffaac177f8e, limb1: 0x654e37e37a96d0e9327281d7, limb2: 0x7834cf60dd26f16, }, }, G2Line { r0a0: u288 { limb0: 0x49bbb4d856921e3177c0b5bf, limb1: 0x76d84d273694e662bdd5d364, limb2: 0xea5dc611bdd369d, }, r0a1: u288 { limb0: 0x9e9fc3adc530fa3c5c6fd7fe, limb1: 0x114bb0c0e8bd247da41b3883, limb2: 0x6044124f85d2ce, }, r1a0: u288 { limb0: 0xa6e604cdb4e40982a97c084, limb1: 0xef485caa56c7820be2f6b11d, limb2: 0x280de6387dcbabe1, }, r1a1: u288 { limb0: 0xcaceaf6df5ca9f8a18bf2e1e, limb1: 0xc5cce932cc6818b53136c142, limb2: 0x12f1cd688682030c, }, }, G2Line { r0a0: u288 { limb0: 0x37497c23dcf629df58a5fa12, limb1: 0x4fcd5534ae47bded76245ac9, limb2: 0x1715ab081e32ac95, }, r0a1: u288 { limb0: 0x856275471989e2c288e3c83, limb1: 0xb42d81a575b89b127a7821a, limb2: 0x5fa75a0e4ae3118, }, r1a0: u288 { limb0: 0xeb22351e8cd345c23c0a3fef, limb1: 0x271feb16d4b47d2267ac9d57, limb2: 0x258f9950b9a2dee5, }, r1a1: u288 { limb0: 0xb5f75468922dc025ba7916fa, limb1: 0x7e24515de90edf1bde4edd9, limb2: 0x289145b3512d4d81, }, }, G2Line { r0a0: u288 { limb0: 0x474d539c09e56d254248eb2b, limb1: 0xfd31c4dda0194dfc995c9a7, limb2: 0xc3a11eb34327e4, }, r0a1: u288 { limb0: 0x9c159e673fc04e4708c12343, limb1: 0xb4f305fcf82d9e1fc29c5be4, limb2: 0x1f4075ebbb40ae4f, }, r1a0: u288 { limb0: 0xb3c06a6a7da6cae6418b20f1, limb1: 0x52fd9665f418fc28d1a1c512, limb2: 0x15dcb567f6ba3f15, }, r1a1: u288 { limb0: 0x68eef22325cbe13b51e949ef, limb1: 0x58ff6f0479b6dba68c5b5457, limb2: 0x1b2faffca46537d7, }, }, G2Line { r0a0: u288 { limb0: 0xe2b891b2e4ab31d41c1e862d, limb1: 0x5e80a5ab28e058fe3363fad3, limb2: 0x1881cd458e4900fd, }, r0a1: u288 { limb0: 0xacf99791bc8df6a58559a444, limb1: 0x3c5ae5820c97272c6ecc3a34, limb2: 0x1ae9629d591a5874, }, r1a0: u288 { limb0: 0x83a000d401b2be3889b14e33, limb1: 0xa6d94925a487bed7783b13e9, limb2: 0x1460eb18169abc7, }, r1a1: u288 { limb0: 0x68a0fe19092799473fa1ecca, limb1: 0x4a5f3a56311ba88915d67614, limb2: 0x2fa198a45edde900, }, }, G2Line { r0a0: u288 { limb0: 0x95b7b32bcc3119c64a62a8de, limb1: 0xe07184496f17bbd59a4b7bbd, limb2: 0x1708c536fd78b531, }, r0a1: u288 { limb0: 0xfa85b5778c77166c1523a75e, limb1: 0x89a00c53309a9e525bef171a, limb2: 0x2d2287dd024e421, }, r1a0: u288 { limb0: 0x31fd0884eaf2208bf8831e72, limb1: 0x537e04ea344beb57ee645026, limb2: 0x23c7f99715257261, }, r1a1: u288 { limb0: 0x8c38b3aeea525f3c2d2fdc22, limb1: 0xf838a99d9ec8ed6dcec6a2a8, limb2: 0x2973d5159ddc479a, }, }, G2Line { r0a0: u288 { limb0: 0x3f058d8c63fd905d3ca29b42, limb1: 0x1f0a90982cc68e4ddcd83e57, limb2: 0x240aeaae0783fbfa, }, r0a1: u288 { limb0: 0xedfee81d80da310fdf0d0d8, limb1: 0xc2208e6de8806cf491bd74d4, limb2: 0xb7318be62a476af, }, r1a0: u288 { limb0: 0x3c6920c8a24454c634f388fe, limb1: 0x23328a006312a722ae09548b, limb2: 0x1d2f1c58b80432e2, }, r1a1: u288 { limb0: 0xb72980574f7a877586de3a63, limb1: 0xcd773b87ef4a29c16784c5ae, limb2: 0x1f812c7e22f339c5, }, }, G2Line { r0a0: u288 { limb0: 0xe72c7bcd2ec07cf939c82bf2, limb1: 0xf20f143e871594e88e02564f, limb2: 0x28a1e3b81f977f43, }, r0a1: u288 { limb0: 0xf5788be1af3d8de8da67b79f, limb1: 0x48f88a4e0abb1434db9e7304, limb2: 0x292130cc233b4429, }, r1a0: u288 { limb0: 0x1e5eac242edb50874c5dde70, limb1: 0x24febedd561c1b49f93efde4, limb2: 0x2673053ad23b2f55, }, r1a1: u288 { limb0: 0x3dcc892c39d59e3cb3ab2dc7, limb1: 0xbf90bfbeeaf31e4569c33b0f, limb2: 0x241dd4018555da7, }, }, G2Line { r0a0: u288 { limb0: 0xd8e8c28949cdca3f8d4385d7, limb1: 0x98fe4c263e58d50c230f9604, limb2: 0x96e498dd6ed6312, }, r0a1: u288 { limb0: 0x693f5c59849b8c6dab40e573, limb1: 0xb9754e3f3c99b4c9a9d3e253, limb2: 0x2333f41aae69fc1, }, r1a0: u288 { limb0: 0xc7c0fb6603257da254a953d7, limb1: 0xaf2914e88ac303e54c672acd, limb2: 0x25a52f889cfe814f, }, r1a1: u288 { limb0: 0x6502eb82951b4604da30a2a9, limb1: 0x9b317811fb6785bac19a8203, limb2: 0x1cb5c238f6a8f6c8, }, }, G2Line { r0a0: u288 { limb0: 0xfeebe92941f95b6ea1d095bb, limb1: 0x9c7962eb8bbeb95a9ca7cf50, limb2: 0x290bdaf3b9a08dc3, }, r0a1: u288 { limb0: 0x686cfa11c9d4b93675495599, limb1: 0xb1d69e17b4b5ebf64f0d51e1, limb2: 0x2c18bb4bdc2e9567, }, r1a0: u288 { limb0: 0x17419b0f6a04bfc98d71527, limb1: 0x80eba6ff02787e3de964a4d1, limb2: 0x26087bb100e7ff9f, }, r1a1: u288 { limb0: 0x17c4ee42c3f612c43a08f689, limb1: 0x7276bdda2df6d51a291dba69, limb2: 0x40a7220ddb393e1, }, }, G2Line { r0a0: u288 { limb0: 0x917d90650b71f1ab46bab72, limb1: 0xc1918cfed77a56e1070c0641, limb2: 0xed0bb71254b669b, }, r0a1: u288 { limb0: 0x3ea287920147db34d6f66f4f, limb1: 0x79077d9eba0a62a9cd93b232, limb2: 0x10741ac25481e28a, }, r1a0: u288 { limb0: 0x619c7fea78e866aba4198715, limb1: 0x34846c0b78033f9da1fad5e5, limb2: 0x154d8e87a1d50a8a, }, r1a1: u288 { limb0: 0xf07d32dec360fffd6db7bc17, limb1: 0x73f267153a367f1bd57f5383, limb2: 0x12c09b76a9ecb04b, }, }, G2Line { r0a0: u288 { limb0: 0x830d777c19040571a1d72fd0, limb1: 0x651b2c6b8c292020817a633f, limb2: 0x268af1e285bc59ff, }, r0a1: u288 { limb0: 0xede78baa381c5bce077f443d, limb1: 0x540ff96bae21cd8b9ae5438b, limb2: 0x12a1fa7e3b369242, }, r1a0: u288 { limb0: 0x797c0608e5a535d8736d4bc5, limb1: 0x375faf00f1147656b7c1075f, limb2: 0xda60fab2dc5a639, }, r1a1: u288 { limb0: 0x610d26085cfbebdb30ce476e, limb1: 0x5bc55890ff076827a09e8444, limb2: 0x14272ee2d25f20b7, }, }, G2Line { r0a0: u288 { limb0: 0x5cc8ee1ae0c281270770770a, limb1: 0x875f773ac9a2f4453b76031d, limb2: 0x2e18a40702156e7e, }, r0a1: u288 { limb0: 0x9a868b9382515fe16c1eacb0, limb1: 0x6c9facfbe6243346ad5d6c8a, limb2: 0x16555ceba9837031, }, r1a0: u288 { limb0: 0xf764e54b3fc901693aae459a, limb1: 0xa67ee51e4af1452067ac0ffe, limb2: 0x2826818194b192f5, }, r1a1: u288 { limb0: 0x61936eafb15f6a8062be4bb7, limb1: 0x9e1a4b26df02958fcf88f197, limb2: 0x1aa2bcb13967fa84, }, }, G2Line { r0a0: u288 { limb0: 0xd6862e1a4ca3b2baf6f8d8aa, limb1: 0x96f9066dded3a3d899025af4, limb2: 0x1a98af9f0d48fd3, }, r0a1: u288 { limb0: 0x276b417cc61ea259c114314e, limb1: 0x464399e5e0037b159866b246, limb2: 0x12cc97dcf32896b5, }, r1a0: u288 { limb0: 0xef72647f4c2d08fc038c4377, limb1: 0x34883cea19be9a490a93cf2b, limb2: 0x10d01394daa61ed0, }, r1a1: u288 { limb0: 0xdf345239ece3acaa62919643, limb1: 0x914780908ece64e763cca062, limb2: 0xee2a80dbd2012a3, }, }, G2Line { r0a0: u288 { limb0: 0x1d5a31f4d08a0ebf7e071e00, limb1: 0xcd1244dd95dd30005f531f81, limb2: 0xb4cb469a2dcf4f1, }, r0a1: u288 { limb0: 0x7c5938adaf38b355092de1f1, limb1: 0x292ab08995b293abfcba14b, limb2: 0x1fd126a2b9f37c67, }, r1a0: u288 { limb0: 0x6e9d352b02a7cb771fcc33f9, limb1: 0x7754d8536eefda2025a07340, limb2: 0x1840289291c35a72, }, r1a1: u288 { limb0: 0xe85f465417b7bd758c547b2e, limb1: 0xf7f703c3bc55ff8a01fa9365, limb2: 0xfa301227880a841, }, }, G2Line { r0a0: u288 { limb0: 0x214fc3a8db005247daee136a, limb1: 0xc37ebf6b47552b9bee766d92, limb2: 0xb58ed274feb30f6, }, r0a1: u288 { limb0: 0x905dea9364094d99ec8a9045, limb1: 0x3bfd9fbe57a1d2815913812e, limb2: 0x10dfd90843c03ab4, }, r1a0: u288 { limb0: 0x118f7a0e148e4bda7446fe05, limb1: 0x66583235f020b02a817ec6db, limb2: 0x2352079b097fceea, }, r1a1: u288 { limb0: 0xba58bc60f29736ec6df2a879, limb1: 0xbaf7d69e4f04d094074ffad5, limb2: 0x27b1c5d0ef78b4e7, }, }, G2Line { r0a0: u288 { limb0: 0x79be48160d704f2e2e5dca40, limb1: 0x8fbf9f087c596616cea86512, limb2: 0x1d8a89117fbc7c8, }, r0a1: u288 { limb0: 0xfe8a0cc5bc30a043cb039f3e, limb1: 0xba2d3630acdf8e20b9dd3c3c, limb2: 0xba977bc2fb18b8f, }, r1a0: u288 { limb0: 0x487697b042f01992743cef38, limb1: 0xcdf5ff596e895a68f81f7db9, limb2: 0x2e8c6bec9fdf6256, }, r1a1: u288 { limb0: 0x26b24c68c759e3a6c6a1e1be, limb1: 0xd110ce390b2cc30f60e04272, limb2: 0x2ef61a9ef3261262, }, }, G2Line { r0a0: u288 { limb0: 0xa4058149e82ea51362b79be4, limb1: 0x734eba2621918a820ae44684, limb2: 0x110a314a02272b1, }, r0a1: u288 { limb0: 0xe2b43963ef5055df3c249613, limb1: 0x409c246f762c0126a1b3b7b7, limb2: 0x19aa27f34ab03585, }, r1a0: u288 { limb0: 0x179aad5f620193f228031d62, limb1: 0x6ba32299b05f31b099a3ef0d, limb2: 0x157724be2a0a651f, }, r1a1: u288 { limb0: 0xa33b28d9a50300e4bbc99137, limb1: 0x262a51847049d9b4d8cea297, limb2: 0x189acb4571d50692, }, }, G2Line { r0a0: u288 { limb0: 0xd946f57b3b0729afee82f5bd, limb1: 0xadf28363d79debf1404ef6f1, limb2: 0x1c6ec53f8e1f685, }, r0a1: u288 { limb0: 0x6326670cc780b7709928fbc2, limb1: 0x6911b53a757220cba583023, limb2: 0x1a8b3686dff0d70f, }, r1a0: u288 { limb0: 0xa8749fb48ebbe0aabb71ba75, limb1: 0xf8d9ab7f732d405fedd6ee74, limb2: 0x5bfdc6f295776f0, }, r1a1: u288 { limb0: 0x894b9e4055ffeec20a7953e1, limb1: 0xdff2a1fba1c35348b8749de3, limb2: 0x48735157c274b95, }, }, G2Line { r0a0: u288 { limb0: 0x29bd4381ae4afc677ee37ed6, limb1: 0x29ed43453f9a008d9176f004, limb2: 0x24134eb915104f43, }, r0a1: u288 { limb0: 0x81597f82bb67e90a3e72bdd2, limb1: 0xab3bbde5f7bbb4df6a6b5c19, limb2: 0x19ac61eea40a367c, }, r1a0: u288 { limb0: 0xe30a79342fb3199651aee2fa, limb1: 0xf500f028a73ab7b7db0104a3, limb2: 0x808b50e0ecb5e4d, }, r1a1: u288 { limb0: 0x55f2818453c31d942444d9d6, limb1: 0xf6dd80c71ab6e893f2cf48db, limb2: 0x13c3ac4488abd138, }, }, G2Line { r0a0: u288 { limb0: 0xb7fc2c73d3a21478886c6925, limb1: 0x83f8f0f69bd418cd15cecf76, limb2: 0x4986ef1d1f37c0c, }, r0a1: u288 { limb0: 0x8929725c8a1d7ff0eb249763, limb1: 0x7b7a6c18c6e1940a7bd582a6, limb2: 0x1dd6e84a61cc2752, }, r1a0: u288 { limb0: 0x46c48446768009b8c1a0d40a, limb1: 0xd20a4867c595c48f2334a8c4, limb2: 0x51eeff6aec94138, }, r1a1: u288 { limb0: 0x55eafe5e395404eb31dcfe4, limb1: 0xa820fd20250cef46f2825458, limb2: 0xb96eb80fbf2d040, }, }, G2Line { r0a0: u288 { limb0: 0xd1464269bbeafa546f559b8f, limb1: 0xab7f7dcd1ac32b86979471cf, limb2: 0x6a38256ee96f113, }, r0a1: u288 { limb0: 0xf14d50984e65f9bc41df4e7e, limb1: 0x350aff9be6f9652ad441a3ad, limb2: 0x1b1e60534b0a6aba, }, r1a0: u288 { limb0: 0x9e98507da6cc50a56f023849, limb1: 0xcf8925e03f2bb5c1ba0962dd, limb2: 0x2b18961810a62f87, }, r1a1: u288 { limb0: 0x3a4c61b937d4573e3f2da299, limb1: 0x6f4c6c13fd90f4edc322796f, limb2: 0x13f4e99b6a2f025e, }, }, G2Line { r0a0: u288 { limb0: 0x2c7391fd0efbf9f8fa7d70bf, limb1: 0xeccd6c2bae8d56b800dc1353, limb2: 0xe5303c0689a9e57, }, r0a1: u288 { limb0: 0x19598ac1ef4eec1aa65bb9df, limb1: 0x96a88b783dca84fc7c04537, limb2: 0x25b5447946e3c22c, }, r1a0: u288 { limb0: 0xf554c51a85400690cf66eb6f, limb1: 0x1c6de9e803bcd80689072c29, limb2: 0xa476f32f5dd7149, }, r1a1: u288 { limb0: 0xfa6d6f282b1884f75fb19c3, limb1: 0x9e2279e2cceadbb22bb4936f, limb2: 0x1022cdda753274dc, }, }, G2Line { r0a0: u288 { limb0: 0xe0115a79120ae892a72f3dcb, limb1: 0xec67b5fc9ea414a4020135f, limb2: 0x1ee364e12321904a, }, r0a1: u288 { limb0: 0xa74d09666f9429c1f2041cd9, limb1: 0x57ffe0951f863dd0c1c2e97a, limb2: 0x154877b2d1908995, }, r1a0: u288 { limb0: 0xcbe5e4d2d2c91cdd4ccca0, limb1: 0xe6acea145563a04b2821d120, limb2: 0x18213221f2937afb, }, r1a1: u288 { limb0: 0xfe20afa6f6ddeb2cb768a5ae, limb1: 0x1a3b509131945337c3568fcf, limb2: 0x127b5788263a927e, }, }, G2Line { r0a0: u288 { limb0: 0xa3d871626cafc52591cba2f5, limb1: 0x9eb27d36f9d6ff81a65e608f, limb2: 0xc3d9b045879a885, }, r0a1: u288 { limb0: 0x33d9d97851c4759eaa3ec41e, limb1: 0xdef827b9a238dce09fd9a98b, limb2: 0x3b3e7b317193c08, }, r1a0: u288 { limb0: 0x73bce84ace690975f772498d, limb1: 0xc7dd71cceb715cbeaba0300b, limb2: 0xda625363f371385, }, r1a1: u288 { limb0: 0x7ccf1f4e92457cc060cc2dd2, limb1: 0x57a9867b1da25533618b0a38, limb2: 0x2ce2445b6d3b5d47, }, }, G2Line { r0a0: u288 { limb0: 0xe7c658aecdab4db3c83f7927, limb1: 0xfbf162264ca04ee50c70bde8, limb2: 0x2a20f4565b7ff885, }, r0a1: u288 { limb0: 0x45b1c2f0a1226361f42683c0, limb1: 0x9acdd892c48c08de047296bc, limb2: 0x27836373108925d4, }, r1a0: u288 { limb0: 0xc0ea9294b345e6d4892676a7, limb1: 0xcba74eca77086af245d1606e, limb2: 0xf20edac89053e72, }, r1a1: u288 { limb0: 0x4c92a28f2779a527a68a938c, limb1: 0x3a1c3c55ff9d20eac109fab3, limb2: 0x21c4a8c524b1ee7d, }, }, G2Line { r0a0: u288 { limb0: 0x2c5b2b73977e0bbe733f02f1, limb1: 0x941ef3cc68b0ec1c58733f97, limb2: 0x109dfb4fec8eeaa9, }, r0a1: u288 { limb0: 0x5e519b7be134d6e5176eb638, limb1: 0x8a154c6ff9c0c0e682d51638, limb2: 0x15abca9e5e8debfd, }, r1a0: u288 { limb0: 0x589fe2b1434b6c3ccdd54b47, limb1: 0x2d3af377839237e5a832dd21, limb2: 0x1cc7d69606c03fed, }, r1a1: u288 { limb0: 0xde1899cc358ffca1459c4725, limb1: 0x3b61b22ac1e07c00ed9a6e90, limb2: 0xc4ba7a6f58eb44, }, }, G2Line { r0a0: u288 { limb0: 0xa68021d593c46246af22559e, limb1: 0x5c2cfc5bc4cd1b48f4704134, limb2: 0x296066ede1298f8c, }, r0a1: u288 { limb0: 0xfe17dd6765eb9b9625eb6a84, limb1: 0x4e35dd8e8f6088bb14299f8d, limb2: 0x1a380ab2689106e4, }, r1a0: u288 { limb0: 0x82bacf337ca09853df42bc59, limb1: 0xa15de4ef34a30014c5a2e9ae, limb2: 0x243cc0cec53c778b, }, r1a1: u288 { limb0: 0xcb2a1bf18e3ba9349b0a8bf2, limb1: 0x35134b2505cbb5a4c91f0ac4, limb2: 0x25e45206b13f43c4, }, }, G2Line { r0a0: u288 { limb0: 0x8e97b007ffd9891bd0e77650, limb1: 0x77671278ac33f17df6b1db88, limb2: 0x243daddc47f5d5c2, }, r0a1: u288 { limb0: 0x655fe4c8bbe5ee06aaa0054b, limb1: 0xf751450b02c93c7ddea95938, limb2: 0x21aa988e950d563f, }, r1a0: u288 { limb0: 0xb51b3b6b8582de3eb0549518, limb1: 0x84a1031766b7e465f5bbf40c, limb2: 0xd46c2d5b95e5532, }, r1a1: u288 { limb0: 0x50b6ddd8a5eef0067652191e, limb1: 0x298832a0bc46ebed8bff6190, limb2: 0xb568b4fe8311f93, }, }, G2Line { r0a0: u288 { limb0: 0xdbcb8097378d390b07da248a, limb1: 0x8c1663634643ccfc902fb9ab, limb2: 0xc86707944dd94dc, }, r0a1: u288 { limb0: 0x9e8793757f235c776197a40c, limb1: 0x7dbd3da8b7acc50b88b81d13, limb2: 0x30275a0ea994486a, }, r1a0: u288 { limb0: 0xef0575f2db98a6990b5e711a, limb1: 0x435f838e3006b8a20f712ed7, limb2: 0x17966a602fe26c9a, }, r1a1: u288 { limb0: 0x5d4bfdefb19390640b2ed319, limb1: 0xa78667173fb7df5f94b4a16a, limb2: 0x8e4352fb4ae51a2, }, }, G2Line { r0a0: u288 { limb0: 0x6cd6297331a7caa0be521395, limb1: 0x7e756b60245d002f45c0fb0e, limb2: 0x184bca44f635d83c, }, r0a1: u288 { limb0: 0xf90865285ead353404073268, limb1: 0x602b0cb51354964341f10596, limb2: 0x2f9be8e4ee793677, }, r1a0: u288 { limb0: 0x6690385e85e2502acccf0f73, limb1: 0x75cde4d65e511fd1f30fdbfb, limb2: 0x201c80aa6ed20e16, }, r1a1: u288 { limb0: 0x968094989f04e6e32c57134e, limb1: 0xced44e94479ad20ef1a76854, limb2: 0xc8cc909f185a534, }, }, G2Line { r0a0: u288 { limb0: 0xddb4db99db681d35f71a159c, limb1: 0xf71a330019414e6fdee75700, limb2: 0x14d9838e7d1918bb, }, r0a1: u288 { limb0: 0x203c8bac71951a5f2c653710, limb1: 0x9fc93f8da38ecc2957313982, limb2: 0x7b6d981259cabd9, }, r1a0: u288 { limb0: 0xa7297cdb5be0cc45d48ca6af, limb1: 0xa07b4b025ebe6c960eddfc56, limb2: 0xef2a5c30ef00652, }, r1a1: u288 { limb0: 0xb7f05c76d860e9122b36ecd7, limb1: 0x407d6522e1f9ce2bcbf80eda, limb2: 0x197625a558f32c36, }, }, G2Line { r0a0: u288 { limb0: 0x97e789e67f556840749976fc, limb1: 0xd84af043e944d5b04a2b8bf2, limb2: 0x2b12733b29b0d0f2, }, r0a1: u288 { limb0: 0xc26f93b9a33a3a014aa0d63e, limb1: 0xa7bb6212b74b1d178ca2c461, limb2: 0x7ff0135d877564a, }, r1a0: u288 { limb0: 0xafd419b0ec21da02a2ab2d18, limb1: 0x2a4be9f89330466fbf862ab6, limb2: 0x86ef4c7ef738225, }, r1a1: u288 { limb0: 0xa09427825229ef33a181b63a, limb1: 0xe6ad699b1fab9a393ee44509, limb2: 0x277c698746a431ea, }, }, G2Line { r0a0: u288 { limb0: 0xb0f04df9dec94801e48a6ff7, limb1: 0xdc59d087c627d38334e5b969, limb2: 0x3d36e11420be053, }, r0a1: u288 { limb0: 0xc80f070001aa1586189e0215, limb1: 0xff849fcbbbe7c00c83ab5282, limb2: 0x2a2354b2882706a6, }, r1a0: u288 { limb0: 0x48cf70c80f08b6c7dc78adb2, limb1: 0xc6632efa77b36a4a1551d003, limb2: 0xc2d3533ece75879, }, r1a1: u288 { limb0: 0x63e82ba26617416a0b76ddaa, limb1: 0xdaceb24adda5a049bed29a50, limb2: 0x1a82061a3344043b, }, }, G2Line { r0a0: u288 { limb0: 0x473461f8672727e9ffa7c398, limb1: 0xaf2ae23f8f850a93ca51d377, limb2: 0x2a2aa81268836446, }, r0a1: u288 { limb0: 0x678d0df15b589c522e0f6d57, limb1: 0xf5bb7af20c01400bafb375ab, limb2: 0xfb0dcf47bd22abe, }, r1a0: u288 { limb0: 0x840273537792af0d0fa5532a, limb1: 0xceebd5b43f66b4e252465428, limb2: 0x126f3ae4ddbc2031, }, r1a1: u288 { limb0: 0xff451566c1fcfe01edf44a57, limb1: 0x90ad9e37524e5aa9552f4848, limb2: 0x1afee273872f8558, }, }, G2Line { r0a0: u288 { limb0: 0x9152fecf0f523415acc7c7be, limb1: 0xd9632cbfccc4ea5d7bf31177, limb2: 0x2d7288c5f8c83ab1, }, r0a1: u288 { limb0: 0x53144bfe4030f3f9f5efda8, limb1: 0xfeec394fbf392b11c66bae27, limb2: 0x28840813ab8a200b, }, r1a0: u288 { limb0: 0xdec3b11fbc28b305d9996ec7, limb1: 0x5b5f8d9d17199e149c9def6e, limb2: 0x10c1a149b6751bae, }, r1a1: u288 { limb0: 0x665e8eb7e7d376a2d921c889, limb1: 0xfdd76d06e46ee1a943b8788d, limb2: 0x8bb21d9960e837b, }, }, G2Line { r0a0: u288 { limb0: 0x3a67c28a175200e631aa506a, limb1: 0x7397303a34968ff17c06e801, limb2: 0x1b81e0c63123688b, }, r0a1: u288 { limb0: 0x3490cfd4f076c621dac4a12c, limb1: 0xec183578c91b90b72e5887b7, limb2: 0x179fb354f608da00, }, r1a0: u288 { limb0: 0x9322bde2044dde580a78ba33, limb1: 0xfc74821b668d3570cad38f8b, limb2: 0x8cec54a291f5e57, }, r1a1: u288 { limb0: 0xc2818b6a9530ee85d4b2ae49, limb1: 0x8d7b651ad167f2a43d7a2d0a, limb2: 0x7c9ca9bab0ffc7f, }, }, G2Line { r0a0: u288 { limb0: 0x5fd646ef2dbbf7900b22c4f9, limb1: 0xb570d4b312025ab6a457a604, limb2: 0x15705c5227a054f9, }, r0a1: u288 { limb0: 0x250623965dd8aa6332d6b309, limb1: 0x983ac0634d10fad03a2b04e3, limb2: 0x2066f7571a63d80b, }, r1a0: u288 { limb0: 0xa0a6c604d57330312d443bf4, limb1: 0x18e4218e5fe795fd18bbb5a3, limb2: 0x230c3fe7c21093e4, }, r1a1: u288 { limb0: 0xa516edc5b6c21a7a3b76eb39, limb1: 0x33e9b3d9d3cb10e483760299, limb2: 0x21691bae8377c5d3, }, }, G2Line { r0a0: u288 { limb0: 0xd0e45dcb44d7ac9f608ff467, limb1: 0xa5caf677a2dba4ef48ee021, limb2: 0x2059a94678da4ba, }, r0a1: u288 { limb0: 0xcc69cd267c7d0aa927d5a5ee, limb1: 0x284683ac1a2dc9daee692408, limb2: 0x19f923f3b031dd2c, }, r1a0: u288 { limb0: 0x52d42ec97ef4ee35e35e8afb, limb1: 0x42fa4e25346a269577c06677, limb2: 0xfa902cc6767142e, }, r1a1: u288 { limb0: 0x7d08d1a81f6af3a722eaca21, limb1: 0xaec250560f8a402fcdb429aa, limb2: 0x1867fe2267bae5b6, }, }, G2Line { r0a0: u288 { limb0: 0xa576408f8300de3a7714e6ae, limb1: 0xe1072c9a16f202ecf37fbc34, limb2: 0x1b0cb1e2b5871263, }, r0a1: u288 { limb0: 0x2128e2314694b663286e231e, limb1: 0x54bea71957426f002508f715, limb2: 0x36ecc5dbe069dca, }, r1a0: u288 { limb0: 0x17c77cd88f9d5870957850ce, limb1: 0xb7f4ec2bc270ce30538fe9b8, limb2: 0x766279e588592bf, }, r1a1: u288 { limb0: 0x1b6caddf18de2f30fa650122, limb1: 0x40b77237a29cada253c126c6, limb2: 0x74ff1349b1866c8, }, }, G2Line { r0a0: u288 { limb0: 0xdfe2149e4c340f0f977818e, limb1: 0x4aa73da39507ab61393b0a8f, limb2: 0x55afd3af80c6333, }, r0a1: u288 { limb0: 0xeb0ba65f392d7776bc4e594d, limb1: 0x79270f23defb3919d03163eb, limb2: 0x1432e9c69f6597cd, }, r1a0: u288 { limb0: 0x75e1c3546129fe4dfa15b4d1, limb1: 0xe2fede56842e4f6a87600bf2, limb2: 0x1f5fceb2bd6baf44, }, r1a1: u288 { limb0: 0x1d016f0eb8fdd05e6d13013b, limb1: 0x84b16f8cbdf1fe877670baa9, limb2: 0x2827768073a428fe, }, }, G2Line { r0a0: u288 { limb0: 0x3603266e05560becab36faef, limb1: 0x8c3b88c9390278873dd4b048, limb2: 0x24a715a5d9880f38, }, r0a1: u288 { limb0: 0xe9f595b111cfd00d1dd28891, limb1: 0x75c6a392ab4a627f642303e1, limb2: 0x17b34a30def82ab6, }, r1a0: u288 { limb0: 0xe706de8f35ac8372669fc8d3, limb1: 0x16cc7f4032b3f3ebcecd997d, limb2: 0x166eba592eb1fc78, }, r1a1: u288 { limb0: 0x7d584f102b8e64dcbbd1be9, limb1: 0x2ead4092f009a9c0577f7d3, limb2: 0x2fe2c31ee6b1d41e, }, }, G2Line { r0a0: u288 { limb0: 0x72253d939632f8c28fb5763, limb1: 0x9b943ab13cad451aed1b08a2, limb2: 0xdb9b2068e450f10, }, r0a1: u288 { limb0: 0x80f025dcbce32f6449fa7719, limb1: 0x8a0791d4d1ed60b86e4fe813, limb2: 0x1b1bd5dbce0ea966, }, r1a0: u288 { limb0: 0xaa72a31de7d815ae717165d4, limb1: 0x501c29c7b6aebc4a1b44407f, limb2: 0x464aa89f8631b3a, }, r1a1: u288 { limb0: 0x6b8d137e1ea43cd4b1f616b1, limb1: 0xdd526a510cc84f150cc4d55a, limb2: 0x1da2ed980ebd3f29, }, }, G2Line { r0a0: u288 { limb0: 0xf7550f29b2490e0f2a4e2c7f, limb1: 0x5da7008505dcd72e4af83d81, limb2: 0xa635c82bc641341, }, r0a1: u288 { limb0: 0xb4536bb43ce47f44107ecdae, limb1: 0x978283d291702bf7d638b1b2, limb2: 0xbfb8f1b15e61cee, }, r1a0: u288 { limb0: 0x595ecaca9a66ba86e5ee25be, limb1: 0x7e4182944606a828e57d7d07, limb2: 0x2069fe9edc3b22cf, }, r1a1: u288 { limb0: 0x798b743b9edabbb12e77e4d, limb1: 0x572ba71d9d2370e5cd0d86c9, limb2: 0x2412d38ad51d6d9d, }, }, G2Line { r0a0: u288 { limb0: 0x590a676d88841cb9954ee256, limb1: 0xbd64d85d808c1d1b6245a8f8, limb2: 0x2214134d4b92a04e, }, r0a1: u288 { limb0: 0x8390497531c6174c7fef5c8d, limb1: 0xe89cdbcdaed094595402d9cd, limb2: 0x3002adf5ee15c58d, }, r1a0: u288 { limb0: 0xee4e55dfd0cbfb767d77958d, limb1: 0xfb99c38c54dde247e8c16ec3, limb2: 0x25be0a00eeacced2, }, r1a1: u288 { limb0: 0x3332c7176c86556812fd074e, limb1: 0x2df615b45b95ec14c9b6ca59, limb2: 0x24ca6b711f0b9158, }, }, G2Line { r0a0: u288 { limb0: 0x867cced8a010850958f41ff5, limb1: 0x6a37fdb2b8993eed18bafe8e, limb2: 0x21b9f782109e5a7, }, r0a1: u288 { limb0: 0x7307477d650618e66de38d0f, limb1: 0xacb622ce92a7e393dbe10ba1, limb2: 0x236e70838cee0ed5, }, r1a0: u288 { limb0: 0xb564a308aaf5dda0f4af0f0d, limb1: 0x55fc71e2f13d8cb12bd51e74, limb2: 0x294cf115a234a9e9, }, r1a1: u288 { limb0: 0xbd166057df55c135b87f35f3, limb1: 0xf9f29b6c50f1cce9b85ec9b, limb2: 0x2e8448d167f20f96, }, }, G2Line { r0a0: u288 { limb0: 0xfc8b7ceec44c187218b0a628, limb1: 0xad8ab26e533851f6964cf080, limb2: 0x141e03c350014d73, }, r0a1: u288 { limb0: 0xa99377ed869aed282af105bd, limb1: 0x1e539a6a00a53a3a7116a5bb, limb2: 0x1843fc93640235e5, }, r1a0: u288 { limb0: 0x4eaed4a7f79772e125537900, limb1: 0x99a9d1eb5ae07f5ffce34a0e, limb2: 0x30509134887182b0, }, r1a1: u288 { limb0: 0x2afd0eba785d800601426d67, limb1: 0x2a95a13d8a163a4d9c942149, limb2: 0x1744f70d096b1075, }, }, G2Line { r0a0: u288 { limb0: 0xdedaff3205bb953b2c390b8a, limb1: 0xe1a899da21c1dafb485c707e, limb2: 0x1ec897e7a041493e, }, r0a1: u288 { limb0: 0xf52c3c30cd4d3202b34089e0, limb1: 0xc652aa1ff533e1aad7532305, limb2: 0x2a1df766e5e3aa2e, }, r1a0: u288 { limb0: 0x7ac695d3e19d79b234daaf3d, limb1: 0x5ce2f92666aec92a650feee1, limb2: 0x21ab4fe20d978e77, }, r1a1: u288 { limb0: 0xa64a913a29a1aed4e0798664, limb1: 0x66bc208b511503d127ff5ede, limb2: 0x2389ba056de56a8d, }, }, G2Line { r0a0: u288 { limb0: 0xbe894c9cefe9c46c519951de, limb1: 0x6a41efe6eec9e31520053d44, limb2: 0xf4b593a835cf530, }, r0a1: u288 { limb0: 0xeb27d1c9157c9746c3575d80, limb1: 0xcc0bfd86a701af6652a47ff, limb2: 0xf70ea9c35108131, }, r1a0: u288 { limb0: 0x86c07fbaa913e6826b293b91, limb1: 0xb18a5a5f195d0c8fcf4c9b96, limb2: 0x21116cc6ff2a6341, }, r1a1: u288 { limb0: 0xa2edb14bb741154545792f12, limb1: 0x89644490effc10bc0b9c087, limb2: 0x255559b492be7e42, }, }, G2Line { r0a0: u288 { limb0: 0xd88b16e68600a12e6c1f6006, limb1: 0x333243b43d3b7ff18d0cc671, limb2: 0x2b84b2a9b0f03ed8, }, r0a1: u288 { limb0: 0xf3e2b57ddaac822c4da09991, limb1: 0xd7c894b3fe515296bb054d2f, limb2: 0x10a75e4c6dddb441, }, r1a0: u288 { limb0: 0x73c65fbbb06a7b21b865ac56, limb1: 0x21f4ecd1403bb78729c7e99b, limb2: 0xaf88a160a6b35d4, }, r1a1: u288 { limb0: 0xade61ce10b8492d659ff68d0, limb1: 0x1476e76cf3a8e0df086ad9eb, limb2: 0x2e28cfc65d61e946, }, }, G2Line { r0a0: u288 { limb0: 0xdf8b54b244108008e7f93350, limb1: 0x2ae9a68b9d6b96f392decd6b, limb2: 0x160b19eed152271c, }, r0a1: u288 { limb0: 0xc18a8994cfbb2e8df446e449, limb1: 0x408d51e7e4adedd8f4f94d06, limb2: 0x27661b404fe90162, }, r1a0: u288 { limb0: 0x1390b2a3b27f43f7ac73832c, limb1: 0x14d57301f6002fd328f2d64d, limb2: 0x17f3fa337367dddc, }, r1a1: u288 { limb0: 0x79cab8ff5bf2f762c5372f80, limb1: 0xc979d6f385fae4b5e4785acf, limb2: 0x60c5307a735b00f, }, }, G2Line { r0a0: u288 { limb0: 0x9c63cc02c784e055248c3eed, limb1: 0xfd16031abbbc57c520b3448c, limb2: 0x123ce33363d29152, }, r0a1: u288 { limb0: 0xfda091461a1cef9950d3d452, limb1: 0x637d5ff5a189c44f2f3be15c, limb2: 0x1ce131a349febf1c, }, r1a0: u288 { limb0: 0x388902ae8f293fda6dd5e253, limb1: 0xd65a5c2dd9ba165e52942ce5, limb2: 0x9b4d425a8b8716a, }, r1a1: u288 { limb0: 0x32d6961e3fded32a7f74b3c3, limb1: 0x69e203465d4f4f5de03b6304, limb2: 0x1ea4dd6337833093, }, }, G2Line { r0a0: u288 { limb0: 0x13e26ec64f90f19a9fc24a14, limb1: 0xb723427b23f8f37bc71be2c3, limb2: 0x2011d52c72ddcb87, }, r0a1: u288 { limb0: 0xf2e7ebf099f1b3e5d8b28a20, limb1: 0x35b51b2f930d6b7f41ab3f1b, limb2: 0x26f365ce86167188, }, r1a0: u288 { limb0: 0x10e32b59b52b0906b96d83df, limb1: 0xefbd70cad041c74a3ef1bda0, limb2: 0x2589877cff897640, }, r1a1: u288 { limb0: 0x8df3430f6a567e745f702992, limb1: 0xfc341d1eaf0c10eec340bf9b, limb2: 0x1e4c94f61793bb7b, }, }, G2Line { r0a0: u288 { limb0: 0x386d7b23c6dccb87637018c9, limb1: 0xfed2ea478e9a2210289079e2, limb2: 0x100aa83cb843353e, }, r0a1: u288 { limb0: 0x229c5c285f049d04c3dc5ce7, limb1: 0x28110670fe1d38c53ffcc6f7, limb2: 0x1778918279578f50, }, r1a0: u288 { limb0: 0xe9ad2c7b8a17a1f1627ff09d, limb1: 0xedff5563c3c3e7d2dcc402ec, limb2: 0xa8bd6770b6d5aa8, }, r1a1: u288 { limb0: 0x66c5c1aeed5c04470b4e8a3d, limb1: 0x846e73d11f2d18fe7e1e1aa2, limb2: 0x10a60eabe0ec3d78, }, }, G2Line { r0a0: u288 { limb0: 0x675cc9c385f8658ad4f95b8f, limb1: 0x46072c9276ee065cea42b3bf, limb2: 0xbd1d099998eaab5, }, r0a1: u288 { limb0: 0xb5a009ebdae77421ca09efdd, limb1: 0x247d947b95fe2e8593afcfb8, limb2: 0x1169983817087c53, }, r1a0: u288 { limb0: 0xafecdb2936ac4202959a366d, limb1: 0xa952b225eacf34300e3b2c11, limb2: 0x2d3452e5608ee9db, }, r1a1: u288 { limb0: 0x86acf5efc205740641f2f711, limb1: 0x23725a6d2ce73462f6496ae3, limb2: 0x2d2908ce56b326cd, }, }, G2Line { r0a0: u288 { limb0: 0x88ca191d85be1f6c205257ef, limb1: 0xd0cecf5c5f80926c77fd4870, limb2: 0x16ec42b5cae83200, }, r0a1: u288 { limb0: 0x154cba82460752b94916186d, limb1: 0x564f6bebac05a4f3fb1353ac, limb2: 0x2d47a47da836d1a7, }, r1a0: u288 { limb0: 0xb39c4d6150bd64b4674f42ba, limb1: 0x93c967a38fe86f0779bf4163, limb2: 0x1a51995a49d50f26, }, r1a1: u288 { limb0: 0xeb7bdec4b7e304bbb0450608, limb1: 0x11fc9a124b8c74b3d5560ea4, limb2: 0xbfa9bd7f55ad8ac, }, }, G2Line { r0a0: u288 { limb0: 0x8ac4b290d5156e3e7fa4eb6c, limb1: 0x8d74a3b09d5503f6542b071a, limb2: 0x1c7c5837e2e98023, }, r0a1: u288 { limb0: 0xf62d5c02d7029d7049a05e29, limb1: 0xceeca19b95c93209d1eddf4c, limb2: 0x289ba7fe4810af60, }, r1a0: u288 { limb0: 0xa1ff7e417257a17c65e1a90d, limb1: 0x2ba9075ef59406b3a2499cd7, limb2: 0x19c14ffdfa679063, }, r1a1: u288 { limb0: 0xc4002e7f1c1427dd90e32241, limb1: 0xf0c32e9566ed7b68d43b5f1c, limb2: 0x10ed8a335bc8ef5e, }, }, G2Line { r0a0: u288 { limb0: 0x2fdc574c85cf0c0ce5e07a51, limb1: 0xd2439bf7b00bddc4cfb01b0c, limb2: 0x125c3bbdeb0bd2da, }, r0a1: u288 { limb0: 0x9d664714bae53cafcb5ef55d, limb1: 0x495c01724790853548f5e4de, limb2: 0x2ce5e2e263725941, }, r1a0: u288 { limb0: 0x98071eb7fe88c9124aee3774, limb1: 0xc3f66947a52bd2f6d520579f, limb2: 0x2eaf775dbd52f7d3, }, r1a1: u288 { limb0: 0x23e5594948e21db2061dca92, limb1: 0xd0ffa6f6c77290531c185431, limb2: 0x604c085de03afb1, }, }, G2Line { r0a0: u288 { limb0: 0x4983b91e0e5edcba05059d54, limb1: 0x5f3145341793c07682b08603, limb2: 0x108ceb28246075ac, }, r0a1: u288 { limb0: 0xca59dfe54f67accbd8399b9e, limb1: 0xef2c5096cdbac06f799c31b9, limb2: 0x7d170f63d0bc9f5, }, r1a0: u288 { limb0: 0x74e9b29b0793f5101b19e7db, limb1: 0xd34343845d2d6a013ffe76b0, limb2: 0x2119d53a2fbaebff, }, r1a1: u288 { limb0: 0x904bb445baeac56041fc9a41, limb1: 0xc300a959bcbab62e415c9599, limb2: 0x188e914b6ea3a25e, }, }, G2Line { r0a0: u288 { limb0: 0xeec2912e15f6bda39d4e005e, limb1: 0x2b8610c44d27bdbc6ba2aac5, limb2: 0x78ddc4573fc1fed, }, r0a1: u288 { limb0: 0x48099a0da11ea21de015229d, limb1: 0x5fe937100967d5cc544f4af1, limb2: 0x2c9ffe6d7d7e9631, }, r1a0: u288 { limb0: 0xa70d251296ef1ae37ceb7d03, limb1: 0x2adadcb7d219bb1580e6e9c, limb2: 0x180481a57f22fd03, }, r1a1: u288 { limb0: 0xacf46db9631037dd933eb72a, limb1: 0x8a58491815c7656292a77d29, limb2: 0x261e3516c348ae12, }, }, G2Line { r0a0: u288 { limb0: 0x8629cdd5e145fde3568fd43, limb1: 0x400c419a21cc9444e939cf6b, limb2: 0x2595c12cfa11df93, }, r0a1: u288 { limb0: 0x7912da4ae785a0a99325a792, limb1: 0x113296d83e3a33cc4d0e2171, limb2: 0x18916b0e597ec399, }, r1a0: u288 { limb0: 0xd9d365d20926cd19d741fac, limb1: 0xfb8e91f161e3e857edf0f5f1, limb2: 0x2aa07a692a41ed18, }, r1a1: u288 { limb0: 0xf40d0720adcc24c769e341a5, limb1: 0xb97e4af1a0dc0cb5e1ef38ef, limb2: 0x53c33301c8fed90, }, }, G2Line { r0a0: u288 { limb0: 0x2bfa32f0a09c3e2cfb8f6a38, limb1: 0x7a24df3ff3c7119a59d49318, limb2: 0x10e42281d64907ba, }, r0a1: u288 { limb0: 0xce42177a66cdeb4207d11e0c, limb1: 0x3322aa425a9ca270152372ad, limb2: 0x2f7fa83db407600c, }, r1a0: u288 { limb0: 0x62a8ff94fd1c7b9035af4446, limb1: 0x3ad500601bbb6e7ed1301377, limb2: 0x254d253ca06928f, }, r1a1: u288 { limb0: 0xf8f1787cd8e730c904b4386d, limb1: 0x7fd3744349918d62c42d24cc, limb2: 0x28a05e105d652eb8, }, }, G2Line { r0a0: u288 { limb0: 0x6ef31e059d602897fa8e80a8, limb1: 0x66a0710847b6609ceda5140, limb2: 0x228c0e568f1eb9c0, }, r0a1: u288 { limb0: 0x7b47b1b133c1297b45cdd79b, limb1: 0x6b4f04ed71b58dafd06b527b, limb2: 0x13ae6db5254df01a, }, r1a0: u288 { limb0: 0xbeca2fccf7d0754dcf23ddda, limb1: 0xe3d0bcd7d9496d1e5afb0a59, limb2: 0x305a0afb142cf442, }, r1a1: u288 { limb0: 0x2d299847431477c899560ecf, limb1: 0xbcd9e6c30bedee116b043d8d, limb2: 0x79473a2a7438353, }, }, G2Line { r0a0: u288 { limb0: 0x4bf333418ae65a79be01b42c, limb1: 0x7b21ed1382c0c50e2ff44e84, limb2: 0x826d5429701ad4f, }, r0a1: u288 { limb0: 0x659ec0ccc8a54d15f40741a5, limb1: 0xdef9f8893fcdc429f575ff81, limb2: 0x2521f3f6a385ce88, }, r1a0: u288 { limb0: 0xe2475c786cf18c448c10cfba, limb1: 0xf6fd377e663cd8f70113485e, limb2: 0x2f866df9d71d1203, }, r1a1: u288 { limb0: 0x6e6154e7fb702e585b725874, limb1: 0x3dd6afe8713ee4a89150e941, limb2: 0x1ad82561f12faf96, }, }, G2Line { r0a0: u288 { limb0: 0xa2ae1484e410f15d4c865c6f, limb1: 0x38c03955a4b41b98ec168058, limb2: 0x2c11dc796ade582e, }, r0a1: u288 { limb0: 0x9f01d36070072f1f68f59e40, limb1: 0x7d698d2f45990590d450e964, limb2: 0x18f20c083a7436da, }, r1a0: u288 { limb0: 0x8e7784ed907dbd25195d7da1, limb1: 0x4e659132fef2b2a014a8658, limb2: 0x191000817c8dfb33, }, r1a1: u288 { limb0: 0xb1973c468f164953864b0c33, limb1: 0x1382dbba13d9a77b7fb2fba1, limb2: 0x1935eee5346c0bf, }, }, G2Line { r0a0: u288 { limb0: 0x65b71fe695e7ccd4b460dace, limb1: 0xa6ceba62ef334e6fe91301d5, limb2: 0x299f578d0f3554e6, }, r0a1: u288 { limb0: 0xaf781dd030a274e7ecf0cfa4, limb1: 0x2095020d373a14d7967797aa, limb2: 0x6a7f9df6f185bf8, }, r1a0: u288 { limb0: 0x8e91e2dba67d130a0b274df3, limb1: 0xe192a19fce285c12c6770089, limb2: 0x6e9acf4205c2e22, }, r1a1: u288 { limb0: 0xbcd5c206b5f9c77d667189bf, limb1: 0x656a7e2ebc78255d5242ca9, limb2: 0x25f43fec41d2b245, }, }, G2Line { r0a0: u288 { limb0: 0x16a01fe226cb906356469222, limb1: 0x4277d50794500ca8a6d93550, limb2: 0x2cc16a055b005e1c, }, r0a1: u288 { limb0: 0xf08176a2a762310c7f5a0d79, limb1: 0xe8ff955f36e956afcc65b18d, limb2: 0x104c3fa43e0144ca, }, r1a0: u288 { limb0: 0x83d1006aac3dc6164c2f5349, limb1: 0x8b6949205e118d87a41bd72, limb2: 0x1c8bfbcb7a77e435, }, r1a1: u288 { limb0: 0xbaabbd1ebf18244d71fe44d, limb1: 0x84d1ad747d88667827607b5d, limb2: 0x2987105c580454ce, }, }, G2Line { r0a0: u288 { limb0: 0x4e56e6733cce20d9c5b16d96, limb1: 0xc7ef260535fb75b9d3e089f, limb2: 0x292dd4aa636e7729, }, r0a1: u288 { limb0: 0x6e7e1038b336f36519c9faaf, limb1: 0x3c66bd609510309485e225c7, limb2: 0x10cacac137411eb, }, r1a0: u288 { limb0: 0x4a3e8b96278ac092fe4f3b15, limb1: 0xba47e583e2750b42f93c9631, limb2: 0x125da6bd69495bb9, }, r1a1: u288 { limb0: 0xae7a56ab4b959a5f6060d529, limb1: 0xc3c263bfd58c0030c063a48e, limb2: 0x2f4d15f13fae788c, }, }, G2Line { r0a0: u288 { limb0: 0x301e0885c84d273b6d323124, limb1: 0x11fd5c75e269f7a30fa4154f, limb2: 0x19afdcfdcce2fc0d, }, r0a1: u288 { limb0: 0x3d13519f934526be815c38b0, limb1: 0xd43735909547da73838874fc, limb2: 0x255d8aca30f4e0f6, }, r1a0: u288 { limb0: 0x90a505b76f25a3396e2cea79, limb1: 0x3957a2d0848c54b9079fc114, limb2: 0x1ba0cd3a9fe6d4bb, }, r1a1: u288 { limb0: 0xc47930fba77a46ebb1db30a9, limb1: 0x993a1cb166e9d40bebab02b2, limb2: 0x1deb16166d48118b, }, }, G2Line { r0a0: u288 { limb0: 0x85d75bc97d6ce75681261b3, limb1: 0x2fec226ae2f731465e5d00d8, limb2: 0x28981b581f2938b5, }, r0a1: u288 { limb0: 0xff0800b8ac67a7469eaf7059, limb1: 0x6bca9de9f4b635539aece92e, limb2: 0x9faf1bbdd82d5d9, }, r1a0: u288 { limb0: 0x6a2f4abab426bb0010eeb544, limb1: 0xa661d1118e1148d0282bb0b, limb2: 0xea1783c4b4d0286, }, r1a1: u288 { limb0: 0xea7b56e271cab7e34832f740, limb1: 0x837870da6880f80599bd20d8, limb2: 0x1a71c24986082f98, }, }, G2Line { r0a0: u288 { limb0: 0x3ad19b6290bbdc1dcb374f45, limb1: 0x5b3cbe16738e22f510bf853, limb2: 0x75dc530769d3659, }, r0a1: u288 { limb0: 0xe13917b29527fdef53c1f4f0, limb1: 0x379f0d852369306386826c17, limb2: 0x1a9ceb06ec2e4ea0, }, r1a0: u288 { limb0: 0xb2f002fa616d4a7b93abfb51, limb1: 0xa37249159878c2ef9759fe0f, limb2: 0x25f0b5adc278194f, }, r1a1: u288 { limb0: 0xb80c5c2e9ddecdb709e24e8, limb1: 0x8b7a18df0908d921c5ef7660, limb2: 0x25d48dad31745ad8, }, }, G2Line { r0a0: u288 { limb0: 0xb15bbaec50ff49d30e49f74a, limb1: 0xc90a8c79fb045c5468f14151, limb2: 0x25e47927e92df0e3, }, r0a1: u288 { limb0: 0x57f66909d5d40dfb8c7b4d5c, limb1: 0xea5265282e2139c48c1953f2, limb2: 0x2d7f5e6aff2381f6, }, r1a0: u288 { limb0: 0x2a2f573b189a3c8832231394, limb1: 0x738abc15844895ffd4733587, limb2: 0x20aa11739c4b9bb4, }, r1a1: u288 { limb0: 0x51695ec614f1ff4cce2f65d1, limb1: 0x6765aae6cb895a2406a6dd7e, limb2: 0x1126ee431c522da0, }, }, G2Line { r0a0: u288 { limb0: 0xdea6e74d7541442273a4472d, limb1: 0xb3334895c3208e142ac30e24, limb2: 0x2b0fcbe08687c750, }, r0a1: u288 { limb0: 0x3957f9dc02bb02c18ac723bd, limb1: 0x586e97ed1f709b3712f554d6, limb2: 0x84f6ca831418acf, }, r1a0: u288 { limb0: 0x62ba0827259d2266495c096f, limb1: 0xbea933ce9db90f69205e1b2f, limb2: 0x283c87d1f0ab6104, }, r1a1: u288 { limb0: 0xc4e6d8a17b596384257bdaa2, limb1: 0x8d079c21e392ac8e92047ee8, limb2: 0x30478961a7077b85, }, }, G2Line { r0a0: u288 { limb0: 0x9214fc3209f1518b05fd21c6, limb1: 0x9bc8ce4f56423009710770e8, limb2: 0x32445cc6972799c, }, r0a1: u288 { limb0: 0x93ef401ecd9cfae3644d22e6, limb1: 0xce5a741a9847a144cfaf8c96, limb2: 0xf7a814d5726da4a, }, r1a0: u288 { limb0: 0xd19264d986f163b133a91c0c, limb1: 0x529dc5ce4b193c0f672c6a32, limb2: 0x2e9a118959353374, }, r1a1: u288 { limb0: 0x3d97d6e8f45072cc9e85e412, limb1: 0x4dafecb04c3bb23c374f0486, limb2: 0xa174dd4ac8ee628, }, }, G2Line { r0a0: u288 { limb0: 0x5db1ec127cfbf594acb0d677, limb1: 0x70e07fb9d781d02bdc15179d, limb2: 0x1aaa890030a85a3b, }, r0a1: u288 { limb0: 0x4226bf211011503eb035974d, limb1: 0x7514439dfc133ee1243ebf61, limb2: 0x1f2d401912f7031, }, r1a0: u288 { limb0: 0x23dff8cf641642f05e6b24bf, limb1: 0x4c4a46758c95697b75a19661, limb2: 0x3a93b0d88f96961, }, r1a1: u288 { limb0: 0x491f63f36d8623ebb5a8b06c, limb1: 0x888445ac9aacda055152af5d, limb2: 0x264f06d6ffd0a23f, }, }, G2Line { r0a0: u288 { limb0: 0x98d8b0c4adcf27bceb305c2c, limb1: 0x859afa9c7668ed6152d8cba3, limb2: 0x29e7694f46e3a272, }, r0a1: u288 { limb0: 0x1d970845365594307ba97556, limb1: 0xd002d93ad793e154afe5b49b, limb2: 0x12ca77d3fb8eee63, }, r1a0: u288 { limb0: 0x9f2934faefb8268e20d0e337, limb1: 0xbc4b5e1ec056881319f08766, limb2: 0x2e103461759a9ee4, }, r1a1: u288 { limb0: 0x7adc6cb87d6b43000e2466b6, limb1: 0x65e5cefa42b25a7ee8925fa6, limb2: 0x2560115898d7362a, }, }, G2Line { r0a0: u288 { limb0: 0xf84b2de12d9e988b4d350c4f, limb1: 0x3588bddeca93ec6153032d9f, limb2: 0x136d6e97720234, }, r0a1: u288 { limb0: 0x33d4fe3de71e57161d0ced84, limb1: 0xa313e00e4b35a0cfbaf78b9e, limb2: 0x2b15c2ef1e5b52bb, }, r1a0: u288 { limb0: 0xd5b6ed885e00cc8a89a25ad3, limb1: 0x330b2ac992f206b8a3888a1f, limb2: 0x2901d74097b5d222, }, r1a1: u288 { limb0: 0x841242f062bc3c4c64658ef5, limb1: 0x1ca54f523273c11520333ceb, limb2: 0xbb657e4adcfaec1, }, }, G2Line { r0a0: u288 { limb0: 0x64d864643668392c0e357cc4, limb1: 0x4c9bf66853f1b287015ab84c, limb2: 0x2f5f1b92ad7ee4d4, }, r0a1: u288 { limb0: 0xdc33c8da5c575eef6987a0e1, limb1: 0x51cc07c7ef28e1b8d934bc32, limb2: 0x2358d94a17ec2a44, }, r1a0: u288 { limb0: 0xf659845b829bbba363a2497b, limb1: 0x440f348e4e7bed1fb1eb47b2, limb2: 0x1ad0eaab0fb0bdab, }, r1a1: u288 { limb0: 0x1944bb6901a1af6ea9afa6fc, limb1: 0x132319df135dedddf5baae67, limb2: 0x52598294643a4aa, }, }, G2Line { r0a0: u288 { limb0: 0x76fd94c5e6f17fa6741bd7de, limb1: 0xc2e0831024f67d21013e0bdd, limb2: 0x21e2af6a43119665, }, r0a1: u288 { limb0: 0xad290eab38c64c0d8b13879b, limb1: 0xdd67f881be32b09d9a6c76a0, limb2: 0x8000712ce0392f2, }, r1a0: u288 { limb0: 0xd30a46f4ba2dee3c7ace0a37, limb1: 0x3914314f4ec56ff61e2c29e, limb2: 0x22ae1ba6cd84d822, }, r1a1: u288 { limb0: 0x5d888a78f6dfce9e7544f142, limb1: 0x9439156de974d3fb6d6bda6e, limb2: 0x106c8f9a27d41a4f, }, }, G2Line { r0a0: u288 { limb0: 0x56a94c2fcadf8b52b57b8f16, limb1: 0x80d337d9ea7500c2e01eaae7, limb2: 0x1d6437b87b74fef6, }, r0a1: u288 { limb0: 0x96b387e99073b5baa97385b8, limb1: 0x7f6930e3a08e255019cbc377, limb2: 0x117e2a946aaec899, }, r1a0: u288 { limb0: 0x69f533dfd8f123baa11e736f, limb1: 0xe83cb98efc4de9eefca878ca, limb2: 0x448df583ab25788, }, r1a1: u288 { limb0: 0x987e50cc7863442bca3ce7c7, limb1: 0xdef540ff995f9f94d1ae5032, limb2: 0x4701d89fe1b1f2d, }, }, G2Line { r0a0: u288 { limb0: 0x3f3c2f2df60d0e302fe746ac, limb1: 0xe174a6c9c3a94ee55f704207, limb2: 0x48d2ba2cb93eec, }, r0a1: u288 { limb0: 0xcc882073b44068d32f2f81fa, limb1: 0x8e1bd5b442ef660b7e32e2c3, limb2: 0x1e10b37996fa5061, }, r1a0: u288 { limb0: 0x40caa7ce29ce7fbe398494e2, limb1: 0x5170335f58724675cf628614, limb2: 0x1640a6bf828d2dfc, }, r1a1: u288 { limb0: 0xb4df27375cabcfb846fda30a, limb1: 0x95396691a8861f2fdd10f5cd, limb2: 0x18d60a694ad55b7a, }, }, G2Line { r0a0: u288 { limb0: 0x92c09e4796207b802168341b, limb1: 0xd2d9d6acffd7829066cc49ce, limb2: 0xc89c2d0a7b2c81e, }, r0a1: u288 { limb0: 0x47e3c1cf6cdb6f3efe778c7f, limb1: 0x66b347099b6436794cf062eb, limb2: 0x18b4ccc64ae0a857, }, r1a0: u288 { limb0: 0x7d5793606a73b2740c71484a, limb1: 0xa0070135ca2dc571b28e3c9c, limb2: 0x1bc03576e04b94cf, }, r1a1: u288 { limb0: 0x1ba85b29875e638c10f16c99, limb1: 0x158f2f2acc3c2300bb9f9225, limb2: 0x42d8a8c36ea97c6, }, }, G2Line { r0a0: u288 { limb0: 0xec4681e764cfbf7c538af2a, limb1: 0x4565ebc52b5d8a85adf19252, limb2: 0x44752fa5fffc699, }, r0a1: u288 { limb0: 0x2495ee358b1d2f7cb852e0df, limb1: 0x7e8e47f572051e45b148fabc, limb2: 0x1d2a5085edd69eec, }, r1a0: u288 { limb0: 0xcce126e911fe5179a3065fd0, limb1: 0x89eb158a703c3fb083d6ab63, limb2: 0xae09fb55487cf84, }, r1a1: u288 { limb0: 0xfc6ecc9bb6ab90610c6aa279, limb1: 0x2ec9dc3ab4fc89ec3d07455f, limb2: 0x2ce2a7db016dd063, }, }, G2Line { r0a0: u288 { limb0: 0x9440ad13408319cecb07087b, limb1: 0x537afc0c0cfe8ff761c24e08, limb2: 0x48e4ac10081048d, }, r0a1: u288 { limb0: 0xa37fb82b03a2c0bb2aa50c4f, limb1: 0xd3797f05c8fb84f6b630dfb, limb2: 0x2dffde2d6c7e43ff, }, r1a0: u288 { limb0: 0xc55d2eb1ea953275e780e65b, limb1: 0xe141cf680cab57483c02e4c7, limb2: 0x1b71395ce5ce20ae, }, r1a1: u288 { limb0: 0xe4fab521f1212a1d301065de, limb1: 0x4f8d31c78df3dbe4ab721ef2, limb2: 0x2828f21554706a0e, }, }, G2Line { r0a0: u288 { limb0: 0x8cefc2f2af2a3082b790784e, limb1: 0x97ac13b37c6fbfc736a3d456, limb2: 0x683b1cdffd60acd, }, r0a1: u288 { limb0: 0xa266a8188a8c933dcffe2d02, limb1: 0x18d3934c1838d7bce81b2eeb, limb2: 0x206ac5cdda42377, }, r1a0: u288 { limb0: 0x90332652437f6e177dc3b28c, limb1: 0x75bd8199433d607735414ee8, limb2: 0x29d6842d8298cf7e, }, r1a1: u288 { limb0: 0xadedf46d8ea11932db0018e1, limb1: 0xbc7239ae9d1453258037befb, limb2: 0x22e7ebdd72c6f7a1, }, }, G2Line { r0a0: u288 { limb0: 0xc91d19e8cd7e4fdc6f2ae8f2, limb1: 0xcbf567879da5ca68ae340836, limb2: 0x68d72bbf2d7a0c4, }, r0a1: u288 { limb0: 0x66b6b80f1f9f8466d38016f3, limb1: 0x58d023bc4c07e5afb96e55ba, limb2: 0xd4b76c1f3e9020a, }, r1a0: u288 { limb0: 0x7206444d57fa4b28cba07bd2, limb1: 0x2e3dde1511954bf0289531a8, limb2: 0x19556e38e7487eff, }, r1a1: u288 { limb0: 0x78784fe92d67b4363ebba156, limb1: 0xa325432ea8c347a555dafae8, limb2: 0xd956a5c41160f33, }, }, G2Line { r0a0: u288 { limb0: 0x415ddcddbf4b35a40861ba44, limb1: 0x937c973a9afa8c8a22f6b860, limb2: 0x1ca76ac0498591da, }, r0a1: u288 { limb0: 0xbcd94af7ee9c9c97c101a809, limb1: 0x9742c5dad21578a02495abdc, limb2: 0x2ae764c7a4fd325a, }, r1a0: u288 { limb0: 0xbb401a5b76780512474a588c, limb1: 0xf1438ea37e57137ce6b956bc, limb2: 0xa7a831e9e824aa2, }, r1a1: u288 { limb0: 0x958c06ec31ff5fe5bbc5289b, limb1: 0x73d96c6c37c1ec4fd0edd7e4, limb2: 0x1456a4a521213afc, }, }, G2Line { r0a0: u288 { limb0: 0x348e15357d9299e582033136, limb1: 0x53578c46b15abb39da35a56e, limb2: 0x1043b711f86bb33f, }, r0a1: u288 { limb0: 0x9fa230a629b75217f0518e7c, limb1: 0x77012a4bb8751322a406024d, limb2: 0x121e2d845d972695, }, r1a0: u288 { limb0: 0x5600f2d51f21d9dfac35eb10, limb1: 0x6fde61f876fb76611fb86c1a, limb2: 0x2bf4fbaf5bd0d0df, }, r1a1: u288 { limb0: 0xd732aa0b6161aaffdae95324, limb1: 0xb3c4f8c3770402d245692464, limb2: 0x2a0f1740a293e6f0, }, }, G2Line { r0a0: u288 { limb0: 0x89a2e58c2cb8dcd6a3b6565, limb1: 0x3bd4d0baf1f4a145223a5392, limb2: 0x1e7f97dea0eda0ac, }, r0a1: u288 { limb0: 0xabd7d7c71e35e233c23def95, limb1: 0x1366e53cff57cb47898bd655, limb2: 0x26d9ff9260bdff42, }, r1a0: u288 { limb0: 0x5d0a41a37eff48760e049506, limb1: 0xbca1a785a1639bafcdd56bc3, limb2: 0x1137a7fb31d90907, }, r1a1: u288 { limb0: 0xcf403ab36cd112c5e8039a5b, limb1: 0x2a71e15f5920519f6a592f3a, limb2: 0x2eb83824faf1b67c, }, }, G2Line { r0a0: u288 { limb0: 0xa9e2efa41aaa98ab59728940, limb1: 0x163c0425f66ce72daef2f53e, limb2: 0x2feaf1b1770aa7d8, }, r0a1: u288 { limb0: 0x3bb7afd3c0a79b6ac2c4c063, limb1: 0xee5cb42e8b2bc999e312e032, limb2: 0x1af2071ae77151c3, }, r1a0: u288 { limb0: 0x1cef1c0d8956d7ceb2b162e7, limb1: 0x202b4af9e51edfc81a943ded, limb2: 0xc9e943ffbdcfdcb, }, r1a1: u288 { limb0: 0xe18b1b34798b0a18d5ad43dd, limb1: 0x55e8237731941007099af6b8, limb2: 0x1472c0290db54042, }, }, G2Line { r0a0: u288 { limb0: 0xbbac3856a8e87a2e9a8b22c6, limb1: 0xdbfdecaed05832138ee553fe, limb2: 0x97e02cb38d8d7e9, }, r0a1: u288 { limb0: 0x9e1446fcf7d293a2469d0044, limb1: 0x463357a0f467ffc3d1ac9329, limb2: 0x134bb66656265af1, }, r1a0: u288 { limb0: 0x35197469de9782f565552391, limb1: 0x9a40559fee880b7ce57dc096, limb2: 0x135c6b73ad046335, }, r1a1: u288 { limb0: 0xf58099b0098ba0a363307259, limb1: 0x3aafc38f65f0115c8d769619, limb2: 0x1da35e56a76aff8e, }, }, G2Line { r0a0: u288 { limb0: 0xb4c7963e0d1dc082de0725e, limb1: 0x375a7a3d765918de24804223, limb2: 0xf177b77b031596d, }, r0a1: u288 { limb0: 0x87a7b9c5f10500b0b40d7a1e, limb1: 0x6f234d1dc7f1394b55858810, limb2: 0x26288146660a3914, }, r1a0: u288 { limb0: 0xa6308c89cebe40447abf4a9a, limb1: 0x657f0fdda13b1f8ee314c22, limb2: 0x1701aabc250a9cc7, }, r1a1: u288 { limb0: 0x9db9bf660dc77cbe2788a755, limb1: 0xbdf9c1c15a4bd502a119fb98, limb2: 0x14b4de3d26bd66e1, }, }, G2Line { r0a0: u288 { limb0: 0x53c49c62ca96007e14435295, limb1: 0x85aeb885e4123ca8d3232fdf, limb2: 0x750017ce108abf3, }, r0a1: u288 { limb0: 0xba6bf3e25d370182e4821239, limb1: 0x39de83bf370bd2ba116e8405, limb2: 0x2b8417a72ba6d940, }, r1a0: u288 { limb0: 0xa922f50550d349849b14307b, limb1: 0x569766b6feca6143a5ddde9d, limb2: 0x2c3c6765b25a01d, }, r1a1: u288 { limb0: 0x6016011bdc3b506563b0f117, limb1: 0xbab4932beab93dde9b5b8a5c, limb2: 0x1bf3f698de0ace60, }, }, G2Line { r0a0: u288 { limb0: 0x93bebaf7f40eb00912ee1ff8, limb1: 0x79a91520a19787b125796c6b, limb2: 0x45adea0cdba580c, }, r0a1: u288 { limb0: 0xea59a573b5d16f4b827e1209, limb1: 0x6202955602c536e53bd3387a, limb2: 0x1a511f3a72b13857, }, r1a0: u288 { limb0: 0xb745e4750bc9124d4e73ea0b, limb1: 0x2f33d8eeba9cc1435bbdc73f, limb2: 0x2e6777231d16918a, }, r1a1: u288 { limb0: 0x368391ad32f8bb4668d49a0d, limb1: 0x43450eb1798b1dd83825ef2a, limb2: 0x22bc511bb4630eea, }, }, G2Line { r0a0: u288 { limb0: 0x4ad06cb41fe56d977307ab2c, limb1: 0x3f5bc61856be34d17d908fa0, limb2: 0x99af0cec206d510, }, r0a1: u288 { limb0: 0x1ced159a6a98e98171d4669e, limb1: 0xafcae556259b99f38d59aa5, limb2: 0x89b4d02984287ec, }, r1a0: u288 { limb0: 0xd22b2495d2cc326e755b7f8e, limb1: 0xa1ccc284e75a8859266377a, limb2: 0x19fd2f610a91515c, }, r1a1: u288 { limb0: 0xc1c66a79e4a73dd8a34fafa6, limb1: 0xb9f0070e903de41bb0622c24, limb2: 0xbefae3b58cda298, }, }, G2Line { r0a0: u288 { limb0: 0xb9f05ffda3ee208f990ff3a8, limb1: 0x6201d08440b28ea672b9ea93, limb2: 0x1ed60e5a5e778b42, }, r0a1: u288 { limb0: 0x8e8468b937854c9c00582d36, limb1: 0x7888fa8b2850a0c555adb743, limb2: 0xd1342bd01402f29, }, r1a0: u288 { limb0: 0xf5c4c66a974d45ec754b3873, limb1: 0x34322544ed59f01c835dd28b, limb2: 0x10fe4487a871a419, }, r1a1: u288 { limb0: 0xedf4af2df7c13d6340069716, limb1: 0x8592eea593ece446e8b2c83b, limb2: 0x12f9280ce8248724, }, }, G2Line { r0a0: u288 { limb0: 0x4470eba4d9b59b96407ee453, limb1: 0x42e5bebde803009771b64e57, limb2: 0x15a127d5b9249aaf, }, r0a1: u288 { limb0: 0xd6cb50a7a92876580b531620, limb1: 0xef70fbfdb45b07e8f7babf8f, limb2: 0xe69823faec6b62f, }, r1a0: u288 { limb0: 0xf656b93207a60f9ea4b3b77a, limb1: 0xb0b29dbe81cee075c4d2f88f, limb2: 0x27e43cc268f2839d, }, r1a1: u288 { limb0: 0xdf8504b3164d07aa4f703b8e, limb1: 0xad4fb7395eb3b6d4e78fef42, limb2: 0x25065b36a637c585, }, }, G2Line { r0a0: u288 { limb0: 0xe67f72c6d45f1bb04403139f, limb1: 0x9233e2a95d3f3c3ff2f7e5b8, limb2: 0x1f931e8e4343b028, }, r0a1: u288 { limb0: 0x20ef53907af71803ce3ca5ca, limb1: 0xd99b6637ee9c73150b503ea4, limb2: 0x1c9759def8a98ea8, }, r1a0: u288 { limb0: 0xa0a3b24c9089d224822fad53, limb1: 0xdfa2081342a7a895062f3e50, limb2: 0x185e8cf6b3e494e6, }, r1a1: u288 { limb0: 0x8752a12394b29d0ba799e476, limb1: 0x1493421da067a42e7f3d0f8f, limb2: 0x67e7fa3e3035edf, }, }, G2Line { r0a0: u288 { limb0: 0xd4e7008d0b092bfff8fe7b22, limb1: 0x8917ebc9b364042de59b88bb, limb2: 0x2059627f035f9cd, }, r0a1: u288 { limb0: 0xbb1b0a9dbb59e8f877edf020, limb1: 0x8c8dc3726e82e68ba21b6b69, limb2: 0x1ba5cd54073c1cea, }, r1a0: u288 { limb0: 0x6a2c5a3d8e6236240edaf594, limb1: 0xe68677bda7793cb801acebcc, limb2: 0xc02f104a4e15c01, }, r1a1: u288 { limb0: 0x5c0bc4dce23d8b6bc29ae908, limb1: 0x6127032066da7babc36ec0d7, limb2: 0x1e697536f2da52d0, }, }, G2Line { r0a0: u288 { limb0: 0x6d6138c95464e5e774ae7ba0, limb1: 0xe6ca73a5498e4ccd4bb68fc7, limb2: 0x15bf8aa8ed1beff6, }, r0a1: u288 { limb0: 0xabd7c55a134ed405b4966d3c, limb1: 0xe69dd725ccc4f9dd537fe558, limb2: 0x2df4a03e2588a8f1, }, r1a0: u288 { limb0: 0x7cf42890de0355ffc2480d46, limb1: 0xe33c2ad9627bcb4b028c2358, limb2: 0x2a18767b40de20bd, }, r1a1: u288 { limb0: 0x79737d4a87fab560f3d811c6, limb1: 0xa88fee5629b91721f2ccdcf7, limb2: 0x2b51c831d3404d5e, }, }, G2Line { r0a0: u288 { limb0: 0x6bec21174a07a597502dcb70, limb1: 0xc8bfda289a81e43dd23758ac, limb2: 0x269f86504baa3fef, }, r0a1: u288 { limb0: 0x6ba3eb4f98c964368c0baea8, limb1: 0x95c9a6540a00750faa184469, limb2: 0xacf594a3e59eb53, }, r1a0: u288 { limb0: 0xcc5ab24e082353dce083cba0, limb1: 0x71aae3696df376a2733a9dae, limb2: 0xc8ffa16612417f8, }, r1a1: u288 { limb0: 0x23fc9d7be4a172856d916171, limb1: 0x1ea89e6339555c15f01d35eb, limb2: 0x1df21e5cd24fb7ca, }, }, G2Line { r0a0: u288 { limb0: 0x9812f6145cf7e949fa207f20, limb1: 0x4061c36b08d5bcd408b14f19, limb2: 0x8332e08b2eb51ed, }, r0a1: u288 { limb0: 0xa4a7ae8f65ba180c523cb33, limb1: 0xb71fabbdc78b1128712d32a5, limb2: 0x2acd1052fd0fefa7, }, r1a0: u288 { limb0: 0x6ea5598e221f25bf27efc618, limb1: 0xa2c2521a6dd8f306f86d6db7, limb2: 0x13af144288655944, }, r1a1: u288 { limb0: 0xea469c4b390716a6810fff5d, limb1: 0xf8052694d0fdd3f40b596c20, limb2: 0x24d0ea6c86e48c5c, }, }, G2Line { r0a0: u288 { limb0: 0x2e39be614d904bafea58a8cd, limb1: 0xf53f0a6a20a1f1783b0ea2d0, limb2: 0x99c451b7bb726d7, }, r0a1: u288 { limb0: 0x28ec54a4ca8da838800c573d, limb1: 0xb78365fa47b5e192307b7b87, limb2: 0x2df87aa88e012fec, }, r1a0: u288 { limb0: 0xfb7022881c6a6fdfb18de4aa, limb1: 0xb9bd30f0e93c5b93ad333bab, limb2: 0x1dd20cbccdeb9924, }, r1a1: u288 { limb0: 0x16d8dfdf790a6be16a0e55ba, limb1: 0x90ab884395509b9a264472d4, limb2: 0xeaec571657b6e9d, }, }, G2Line { r0a0: u288 { limb0: 0x83df0f14548cb4d3df297098, limb1: 0x6fce5768b8d9280342dc4f15, limb2: 0x1b847c02d5d13372, }, r0a1: u288 { limb0: 0xe0ad398e46dde2df37d57ea2, limb1: 0xfc42e5247aa2311cd279d7f5, limb2: 0x1b7988b75c25371e, }, r1a0: u288 { limb0: 0xfec8a1c309a7cb375e664afb, limb1: 0x5e17576eee68f0fee50010d3, limb2: 0x20d165c95da78c9e, }, r1a1: u288 { limb0: 0x747ef37118468b0e3d86f0d1, limb1: 0xe585b56f5e9bc73693416049, limb2: 0x16d647b984100e57, }, }, G2Line { r0a0: u288 { limb0: 0x32a896c88589d1e2d820d4b7, limb1: 0x6cddfd3af2415ef1287e3821, limb2: 0x168029eaf79f17fd, }, r0a1: u288 { limb0: 0x1380ac0f4d217fab84bcbd16, limb1: 0x1732a0408706c4c9fbe7d02e, limb2: 0x1a067f72a0e57d5e, }, r1a0: u288 { limb0: 0x52b10f62e67a60a9c6985c56, limb1: 0x59bfd92a57a9cc81693f91a0, limb2: 0x17885ada1c8800dd, }, r1a1: u288 { limb0: 0xc5c177df970ad4eb4a6f9410, limb1: 0x6eb19f03cfb97f703881fb87, limb2: 0x20884457b2d3a8ec, }, }, G2Line { r0a0: u288 { limb0: 0xce78fc6505db036c10fac771, limb1: 0x61f8c0bc7f60ad6415d5e419, limb2: 0x59009c5cf9ea663, }, r0a1: u288 { limb0: 0xb3b3f697fc34d64ba053b914, limb1: 0x317af5815ce5bfffc5a6bc97, limb2: 0x23f97fee4deda847, }, r1a0: u288 { limb0: 0xf559e09cf7a02674ac2fa642, limb1: 0x4fa7548b79cdd054e203689c, limb2: 0x2173b379d546fb47, }, r1a1: u288 { limb0: 0x758feb5b51caccff9da0f78f, limb1: 0xd7f37a1008233b74c4894f55, limb2: 0x917c640b4b9627e, }, }, G2Line { r0a0: u288 { limb0: 0x438bae16b78f8d4c6d3db30a, limb1: 0x8445211ebf9bfcba1c776529, limb2: 0x2f481a220dd1622a, }, r0a1: u288 { limb0: 0x3482b3e989656e30cb35b229, limb1: 0x42347ba4b55db7dd069c1a86, limb2: 0xde1fa929f76dbd7, }, r1a0: u288 { limb0: 0x8bc590876697c6fa8681219b, limb1: 0xe6bafedd88cafa369275dc4e, limb2: 0x145b451118b58bdf, }, r1a1: u288 { limb0: 0x730bdbb324324be339d39111, limb1: 0xc10f98222a10e6cc998a1a62, limb2: 0x1bb0517beaddec5, }, }, G2Line { r0a0: u288 { limb0: 0x72548e0d946b796842cfecd8, limb1: 0x78b54b355e3c26476b0fab82, limb2: 0x2dc9f32c90b6ba31, }, r0a1: u288 { limb0: 0xa943be83a6fc90414320753b, limb1: 0xd708fde97241095833ce5a08, limb2: 0x142111e6a73d2e82, }, r1a0: u288 { limb0: 0xc79e8d5465ec5f28781e30a2, limb1: 0x697fb9430b9ad050ced6cce, limb2: 0x1a9d647149842c53, }, r1a1: u288 { limb0: 0x9bab496952559362586725cd, limb1: 0xbe78e5a416d9665be64806de, limb2: 0x147b550afb4b8b84, }, }, G2Line { r0a0: u288 { limb0: 0xe7596a824a07b270ac4188c8, limb1: 0xe6c994e9676625d23213b4a2, limb2: 0x81a26c392dcf2c5, }, r0a1: u288 { limb0: 0xb2ea042038d6d50de71e18e4, limb1: 0x90341ba13db1bf782d7ee4e5, limb2: 0x271d330705e070b4, }, r1a0: u288 { limb0: 0xd33feb213584e1aff376fc48, limb1: 0x1e000c3d2386eea0df68e9ca, limb2: 0x130ed249899a2898, }, r1a1: u288 { limb0: 0xfacb4dd4ede95483ef565396, limb1: 0xa8089c5ac03ab4c520fd3549, limb2: 0x2dd9fb297e9a38bd, }, }, G2Line { r0a0: u288 { limb0: 0x1422e11013fe6cdd7f843391, limb1: 0xfb96092ab69fc530e27d8d8e, limb2: 0xe39e04564fedd0, }, r0a1: u288 { limb0: 0xbd4e81e3b4db192e11192788, limb1: 0x805257d3c2bdbc344a15ce0d, limb2: 0x10ddd4f47445106b, }, r1a0: u288 { limb0: 0x87ab7f750b693ec75bce04e1, limb1: 0x128ba38ebed26d74d26e4d69, limb2: 0x2f1d22a64c983ab8, }, r1a1: u288 { limb0: 0x74207c17f5c8335183649f77, limb1: 0x7144cd3520ac2e1be3204133, limb2: 0xb38d0645ab3499d, }, }, G2Line { r0a0: u288 { limb0: 0x6a6ef43c964cb860b38e6603, limb1: 0xd1b6d2306114c2a9d0d5ab8a, limb2: 0x25fca3e4a6ad8136, }, r0a1: u288 { limb0: 0x2ad046669b8551d7488add7, limb1: 0x84ac1d26252119712a5ceb2, limb2: 0x19f02ee8b1efc961, }, r1a0: u288 { limb0: 0x3cef7dc2c32f78d6c7d5a42c, limb1: 0xfa2616aba4343d1d5a9a0e2e, limb2: 0x17106b4d22f8d241, }, r1a1: u288 { limb0: 0xc701c3ffc4426f752e0b58c2, limb1: 0x96f0ac67850fb5c266cf5c, limb2: 0x1a16e16ce5a84c54, }, }, G2Line { r0a0: u288 { limb0: 0x49173a889c697b0ab07f35bc, limb1: 0xdcffb65f4b4c21ced6b623af, limb2: 0x1366d12ee6022f7b, }, r0a1: u288 { limb0: 0x285fdce362f7a79b89c49b5c, limb1: 0xae9358c8eaf26e2fed7353f5, limb2: 0x21c91fefaf522b5f, }, r1a0: u288 { limb0: 0x748798f96436e3b18c64964a, limb1: 0xfc3bb221103d3966d0510599, limb2: 0x167859ae2ebc5e27, }, r1a1: u288 { limb0: 0xe3b55b05bb30e23fa7eba05b, limb1: 0xa5fc8b7f7bc6abe91c90ddd5, limb2: 0xe0da83c6cdebb5a, }, }, G2Line { r0a0: u288 { limb0: 0x30a4abff5957209783681bfb, limb1: 0x82d868d5ca421e4f1a0daf79, limb2: 0x1ba96ef98093d510, }, r0a1: u288 { limb0: 0xd9132c7f206a6c036a39e432, limb1: 0x8a2dfb94aba29a87046110b8, limb2: 0x1fad2fd5e5e37395, }, r1a0: u288 { limb0: 0x76b136dc82b82e411b2c44f6, limb1: 0xe405f12052823a54abb9ea95, limb2: 0xf125ba508c26ddc, }, r1a1: u288 { limb0: 0x1bae07f5f0cc48e5f7aac169, limb1: 0x47d1288d741496a960e1a979, limb2: 0xa0911f6cc5eb84e, }, }, G2Line { r0a0: u288 { limb0: 0x14d30fda811521117927311a, limb1: 0xe1d92f17817d1a06eb5e3a2, limb2: 0x1281bb804fdd92a6, }, r0a1: u288 { limb0: 0x589100b3cd0e2be3feb99497, limb1: 0x763b459cdca3ea4cee8f3085, limb2: 0x15a8a70126af58f8, }, r1a0: u288 { limb0: 0xb77343171852732d4297b40d, limb1: 0xf26c00e232ec8878efd4e75c, limb2: 0x60d465fbdb8a07d, }, r1a1: u288 { limb0: 0xd8d997b09eab02f6a0a29be4, limb1: 0x1aca09f7a6558306fdb5d3e4, limb2: 0x2fbab16347a0f9ff, }, }, G2Line { r0a0: u288 { limb0: 0x857d0968bb488b80633a8bc1, limb1: 0xf2014971f9c6044a1e4c78a7, limb2: 0x1cc072450b90ed16, }, r0a1: u288 { limb0: 0x846981ea26f3e279d3dfba61, limb1: 0xf4f358cf12810a94e2e4f7f4, limb2: 0x779e8b7c7a46866, }, r1a0: u288 { limb0: 0x4228e32ecea217f455d31a3a, limb1: 0x2b56b887827ea6e4f7a91c37, limb2: 0x1a7a9910164d6252, }, r1a1: u288 { limb0: 0xdee06b1e3e0558ae82bee505, limb1: 0x163e51dfac33f9152680c9eb, limb2: 0x2a487bb7ad7218f3, }, }, G2Line { r0a0: u288 { limb0: 0x2e7b3a5a35456f42e87968e6, limb1: 0xb4303f5093c3a460674a2fcd, limb2: 0x2b5331f03b8fa15f, }, r0a1: u288 { limb0: 0x7cea371d64d8bd0fc5b9427e, limb1: 0x76208e15fc175e352c274fbe, limb2: 0x5ceb46647d41234, }, r1a0: u288 { limb0: 0x6cdac06bfcf041a30435a560, limb1: 0x15a7ab7ed1df6d7ed12616a6, limb2: 0x2520b0f462ad4724, }, r1a1: u288 { limb0: 0xe8b65c5fff04e6a19310802f, limb1: 0xc96324a563d5dab3cd304c64, limb2: 0x230de25606159b1e, }, }, G2Line { r0a0: u288 { limb0: 0xe2031868c812b8cecacd7a4a, limb1: 0x50546c799ceed3c43c41f4ba, limb2: 0x25cc77c74cbabdbd, }, r0a1: u288 { limb0: 0x295bae77b9ad4b6c97646232, limb1: 0x75621d2aff5e576b7d6fe300, limb2: 0x143043b86b1ca5b4, }, r1a0: u288 { limb0: 0xca3c979fa4d3b18d2f7b1bcc, limb1: 0xdd2c365809773b6e09ccb2b9, limb2: 0x14391c33bfc390d8, }, r1a1: u288 { limb0: 0x5e861ecfb9119d168163c202, limb1: 0xcdbc50774ab2e9bee2b80649, limb2: 0x1fbe4fcdc5c5a57e, }, }, G2Line { r0a0: u288 { limb0: 0xb2236e5462d1e11842039bb5, limb1: 0x8d746dd0bb8bb2a455d505c1, limb2: 0x2fd3f4a905e027ce, }, r0a1: u288 { limb0: 0x3d6d9836d71ddf8e3b741b09, limb1: 0x443f16e368feb4cb20a5a1ab, limb2: 0xb5f19dda13bdfad, }, r1a0: u288 { limb0: 0x4e5612c2b64a1045a590a938, limb1: 0xbca215d075ce5769db2a29d7, limb2: 0x161e651ebdfb5065, }, r1a1: u288 { limb0: 0xc02a55b6685351f24e4bf9c7, limb1: 0x4134240119050f22bc4991c8, limb2: 0x300bd9f8d76bbc11, }, }, G2Line { r0a0: u288 { limb0: 0xe9296a3a3aed4c4143d2e0ba, limb1: 0x7de973514b499b2da739b3e6, limb2: 0x1b4b807986fcdee0, }, r0a1: u288 { limb0: 0xb9295fecce961afe0c5e6dad, limb1: 0xc4e30c322bcae6d526c4de95, limb2: 0x1fee592f513ed6b2, }, r1a0: u288 { limb0: 0x7245f5e5e803d0d448fafe21, limb1: 0xcbdc032ecb3b7a63899c53d0, limb2: 0x1fde9ffc17accfc3, }, r1a1: u288 { limb0: 0x8edcc1b2fdd35c87a7814a87, limb1: 0x99d54b5c2fe171c49aa9cb08, limb2: 0x130ef740e416a6fe, }, }, G2Line { r0a0: u288 { limb0: 0x50cb7f4b087200d53fa86cb2, limb1: 0xff132c0ccf9286b3bc6e72f8, limb2: 0xd1d98c6aa4cbd20, }, r0a1: u288 { limb0: 0x5cb371016b5e5346aa276b94, limb1: 0xb4491b5077bb58bcf9cd8f43, limb2: 0xd51bc57128e720a, }, r1a0: u288 { limb0: 0x397965b705cdb46b061f25e8, limb1: 0xd1ed8b8fa62c5c50b27dc115, limb2: 0x395493fce79da18, }, r1a1: u288 { limb0: 0x8964d77b83faf3ac3f972566, limb1: 0x6c73a21e7e6db17d8f89f9fa, limb2: 0x7ed3c0d414cddf7, }, }, G2Line { r0a0: u288 { limb0: 0xed3ac7bc560f29f1d5148309, limb1: 0xd4bc60d88edc82f6a9336b9a, limb2: 0x1af46a921f0bb17, }, r0a1: u288 { limb0: 0xf5a22ff7d977b6b6acf9f3ca, limb1: 0xad4b2299bff7a855dfde34df, limb2: 0x2176ace7d56a9ff2, }, r1a0: u288 { limb0: 0xdc5d8bbb9566386bdca9619e, limb1: 0x518f514d6bf9082b5e1ca06a, limb2: 0x28162e5d570380f, }, r1a1: u288 { limb0: 0x448f699ecddf33780c7293a, limb1: 0x147b945d1db66b75de1d0e11, limb2: 0x2c3dec42b83ab6d5, }, }, G2Line { r0a0: u288 { limb0: 0x537ecf0916b38aeea21d4e47, limb1: 0x181a00de27ba4be1b380d6c8, limb2: 0x8c2fe2799316543, }, r0a1: u288 { limb0: 0xe68fff5ee73364fff3fe403b, limb1: 0x7b8685c8a725ae79cfac8f99, limb2: 0x7b4be349766aba4, }, r1a0: u288 { limb0: 0xdf7c93c0095545ad5e5361ea, limb1: 0xce316c76191f1e7cd7d03f3, limb2: 0x22ea21f18ddec947, }, r1a1: u288 { limb0: 0xa19620b4c32db68cc1c2ef0c, limb1: 0xffa1e4be3bed5faba2ccbbf4, limb2: 0x16fc78a64c45f518, }, }, G2Line { r0a0: u288 { limb0: 0x2b6af476f520b4bf804415bc, limb1: 0xd949ee7f9e8874698b090fca, limb2: 0x34db5e5ec2180cf, }, r0a1: u288 { limb0: 0x3e06a324f038ac8abcfb28d7, limb1: 0xc2e6375b7a83c0a0145f8942, limb2: 0x2247e79161483763, }, r1a0: u288 { limb0: 0x708773d8ae3a13918382fb9d, limb1: 0xaf83f409556e32aa85ae92bf, limb2: 0x9af0a924ae43ba, }, r1a1: u288 { limb0: 0xa6fded212ff5b2ce79755af7, limb1: 0x55a2adfb2699ef5de6581b21, limb2: 0x2476e83cfe8daa5c, }, }, G2Line { r0a0: u288 { limb0: 0x88da3121b35160882a1c7589, limb1: 0x65804a112b6f3376e944918a, limb2: 0x16dacfb60b1ce19a, }, r0a1: u288 { limb0: 0xeff82aff39cb798ce9b8b0d9, limb1: 0xa90ce85c7d5f232be9d0aa48, limb2: 0x193c05a28703b386, }, r1a0: u288 { limb0: 0x20ad3c10b068e055950db02d, limb1: 0x7f126eebf19b02a0833fe0ce, limb2: 0x297139b7691ecc5, }, r1a1: u288 { limb0: 0x1b6a771c255179179254a975, limb1: 0x6e8c9e35001729b1f77e9eb2, limb2: 0x3e2e494608e33c7, }, }, G2Line { r0a0: u288 { limb0: 0x7f9803672c5c3c3885d9f98a, limb1: 0xde4f0a101b3d8f9ee11d42b2, limb2: 0x20a37cabfbfa257, }, r0a1: u288 { limb0: 0x26838cb91e386068a3da1af1, limb1: 0xee22b598ea3b51661d35cff3, limb2: 0x1919454dad133f1c, }, r1a0: u288 { limb0: 0x7c23a02fb58896140cab4a26, limb1: 0xb61a77a33f73616e4ebaac8a, limb2: 0x98a546ad9b9c556, }, r1a1: u288 { limb0: 0xa4bc65cb502123f8cab8a370, limb1: 0x8be2308b4f0c0dd30f4f47e8, limb2: 0x20ccdec6f5186f9e, }, }, G2Line { r0a0: u288 { limb0: 0x1c4759bcf7c607fe3f839d4d, limb1: 0xea91f311da73327e2ed40785, limb2: 0x2017052c72360f42, }, r0a1: u288 { limb0: 0x38cf8a4368c0709980199fc3, limb1: 0xfc9047885996c19e84d7d4ea, limb2: 0x1795549eb0b97783, }, r1a0: u288 { limb0: 0xb70f7ecfbec0eaf46845e8cc, limb1: 0x9ddf274c2a9f89ea3bc4d66f, limb2: 0xcc6f106abfcf377, }, r1a1: u288 { limb0: 0xf6ff11ce29186237468c2698, limb1: 0x5c629ad27bb61e4826bb1313, limb2: 0x2014c6623f1fb55e, }, }, G2Line { r0a0: u288 { limb0: 0x5c4102ef74201f7de38e0463, limb1: 0xb1ef54e99607be59909009bb, limb2: 0x25ff50f42e66453b, }, r0a1: u288 { limb0: 0x76c0ba1f7c7f207460e65d58, limb1: 0x878854c0c07edabf3d15a5c9, limb2: 0x182311cfea026538, }, r1a0: u288 { limb0: 0xc8bbb32e6a668cf1e33ec2d8, limb1: 0x23c6efb2db33c7221af7e56c, limb2: 0x22c07d0e7f650e9a, }, r1a1: u288 { limb0: 0xadf5b275b9ae0362598bc296, limb1: 0x70f05b3cbfa5ee508c52d108, limb2: 0x2c76c696e1630aa3, }, }, G2Line { r0a0: u288 { limb0: 0xc648054e4b6134bbfd68487f, limb1: 0xdf0506dad3f3d098c13a6386, limb2: 0x26bebeb6f46c2e8c, }, r0a1: u288 { limb0: 0x9d0cdb28a94204776c6e6ba6, limb1: 0x303f02dfe619752b1607951d, limb2: 0x1127d8b17ef2c064, }, r1a0: u288 { limb0: 0xe34ca1188b8db4e4694a696c, limb1: 0x243553602481d9b88ca1211, limb2: 0x1f8ef034831d0132, }, r1a1: u288 { limb0: 0xe3a5dfb1785690dad89ad10c, limb1: 0xd690b583ace24ba033dd23e0, limb2: 0x405d0709e110c03, }, }, G2Line { r0a0: u288 { limb0: 0x9f395ba5aff2b0485d02ad3, limb1: 0xd745a02f5dda7608c1aa5b6c, limb2: 0x2c12ce79338fb06c, }, r0a1: u288 { limb0: 0x6bbfa55a1d9bfb38880150f5, limb1: 0x3a352c8ebceaab1b84fddea8, limb2: 0x1ef234624c2a4dd1, }, r1a0: u288 { limb0: 0xce4d0f18e7500ec5e79f5c9b, limb1: 0x806d4caac7b410b45752f986, limb2: 0x12ec5a5f04110219, }, r1a1: u288 { limb0: 0x1cacd816d2c00f06c10b8405, limb1: 0xfa95cba80a6fa53f6e8fcdbd, limb2: 0xd5b083f527eaaf5, }, }, G2Line { r0a0: u288 { limb0: 0x72cc2cef2785ce4ff4e9b7af, limb1: 0x60ed5b9c207d7f31fb6234ab, limb2: 0x1bb17a4bc7b643ed, }, r0a1: u288 { limb0: 0x9424eb15b502cde7927c7530, limb1: 0xa0e33edbbaa9de8e9c206059, limb2: 0x2b9a3a63bbf4af99, }, r1a0: u288 { limb0: 0x423811cb6386e606cf274a3c, limb1: 0x8adcc0e471ecfe526f56dc39, limb2: 0x9169a8660d14368, }, r1a1: u288 { limb0: 0xf616c863890c3c8e33127931, limb1: 0xcc9414078a6da6989dae6b91, limb2: 0x594d6a7e6b34ab2, }, }, G2Line { r0a0: u288 { limb0: 0x7fb74b75258ad974f27f0b99, limb1: 0x84f19bd902fadad4d0bcd73c, limb2: 0xce721ef63bddc72, }, r0a1: u288 { limb0: 0xaaa754b4283ded9567a7ebe6, limb1: 0x8680b8bb98776864cf0b9a91, limb2: 0x2c654975f8cf5aac, }, r1a0: u288 { limb0: 0x15b404bb99c14804cb871df0, limb1: 0x28f2373909ce28eab3269ad5, limb2: 0x23f0beb80a0dc66f, }, r1a1: u288 { limb0: 0x1a40652ffabc01487ee07368, limb1: 0xfb7d1ac226c315f73ba10295, limb2: 0xd4a4463afd8862a, }, }, G2Line { r0a0: u288 { limb0: 0xf2d619ae78049bf9141c35cf, limb1: 0x717f8b10d469a1ee2d91f191, limb2: 0x2c72c82fa8afe345, }, r0a1: u288 { limb0: 0xb89321223b82a2dc793c0185, limb1: 0x71506a0cf4adb8e51bb7b759, limb2: 0x2c13b92a98651492, }, r1a0: u288 { limb0: 0x4947ef2c89276f77f9d20942, limb1: 0xb454d68685ab6b6976e71ec5, limb2: 0x19a938d0e78a3593, }, r1a1: u288 { limb0: 0xbe883eb119609b489c01c905, limb1: 0xaa06779922047f52feac5ce6, limb2: 0x76977a3015dc164, }, }, G2Line { r0a0: u288 { limb0: 0x43a96a588005043a46aadf2c, limb1: 0xa37b89d8a1784582f0c52126, limb2: 0x22e9ef3f5d4b2297, }, r0a1: u288 { limb0: 0x8c6f6d8474cf6e5a58468a31, limb1: 0xeb1ce6ac75930ef1c79b07e5, limb2: 0xf49839a756c7230, }, r1a0: u288 { limb0: 0x82b84693a656c8e8c1f962fd, limb1: 0x2c1c8918ae80282208b6b23d, limb2: 0x14d3504b5c8d428f, }, r1a1: u288 { limb0: 0x60ef4f4324d5619b60a3bb84, limb1: 0x6d3090caefeedbc33638c77a, limb2: 0x159264c370c89fec, }, }, G2Line { r0a0: u288 { limb0: 0x8fac42bd654a73e6e06cd8cf, limb1: 0xc3830a580c7ae62ca9a58036, limb2: 0xb1a750d7380c19e, }, r0a1: u288 { limb0: 0x4e8496aad8f6ac809fd15dae, limb1: 0xb51505336049b39b3fe98502, limb2: 0xc2e5994cb400618, }, r1a0: u288 { limb0: 0x2fc55d31524d834b260b3051, limb1: 0xe465c3c590247c88422d26c8, limb2: 0x10322a13b180bb0a, }, r1a1: u288 { limb0: 0x25a29688c4e32c67cb1134a8, limb1: 0x651bc8b0deb27bdb5762232f, limb2: 0x117dd3744aca1f64, }, }, G2Line { r0a0: u288 { limb0: 0xee89d2a59689701ecf4a31f2, limb1: 0xefc968d4b47e143fc28040f3, limb2: 0x1a5b2ca3ba6945b3, }, r0a1: u288 { limb0: 0x981810f00669aa9ef6a5c331, limb1: 0x483396ddbc880f5c1a0a0915, limb2: 0x85f453a76b6bc86, }, r1a0: u288 { limb0: 0xe25dfca55ef96a66eb1a716a, limb1: 0xa36d2f86b377aeddc41b101b, limb2: 0x36848c2314fd3a7, }, r1a1: u288 { limb0: 0xac4c5ac54d6c417facda3992, limb1: 0xd0b77b71f704c0930adeef4c, limb2: 0x8c773a6db51d65d, }, }, ] .span(); let hint = MPCheckHintBN254 { lambda_root: E12D { w0: u288 { limb0: 0x195c16df4a0f8f9dcb48bee9, limb1: 0x27f3cb7c50eca75e794d2f14, limb2: 0x14156ca1853095df, }, w1: u288 { limb0: 0xf01d099a6df0a4a55ed21b59, limb1: 0x9fed6b2018946bcc2a8dad06, limb2: 0xdc2a20a6107d4c4, }, w2: u288 { limb0: 0x6c1817c4efa721fc98f69503, limb1: 0xed80f8339cf9e06ff04257cb, limb2: 0x14260c5afb0b1148, }, w3: u288 { limb0: 0xf98323135baab8ae3c766c60, limb1: 0xffefe512eb9448ef436dd090, limb2: 0xafe8a09df07bf3d, }, w4: u288 { limb0: 0x1707d6579371dae20368253c, limb1: 0x7bb02cc2b5dc98aff593681, limb2: 0x114692950f53d4f7, }, w5: u288 { limb0: 0xa9da397fe12d4a3939ce650c, limb1: 0x49646f1e106dc0ee917551f5, limb2: 0x2dd3fca725919631, }, w6: u288 { limb0: 0xd6054be99a9248497b82062a, limb1: 0x2ea3f1b228beff5fd364a127, limb2: 0x1750bd450b85cbd6, }, w7: u288 { limb0: 0x4b83377c168d89b919386546, limb1: 0x26169d3ce55db12ecafd74bc, limb2: 0x1248cfad33a21477, }, w8: u288 { limb0: 0x724e5f5589d549a709b2b5ef, limb1: 0x8816b055888399c99a954b82, limb2: 0x28d156bac04e6493, }, w9: u288 { limb0: 0x56fbb49c235bc75082f5f26e, limb1: 0x56afece475580f453f9126f2, limb2: 0x39e1ab153bd7095, }, w10: u288 { limb0: 0x4fd83597fed1d7e7b9d09e04, limb1: 0x7c7f558d3e74e6617d7f08b5, limb2: 0x14853f940bf5c55, }, w11: u288 { limb0: 0xae3473546aa01a618b78b125, limb1: 0xfee14a3ce2b7af4e1872fe49, limb2: 0xaa480d613601947, }, }, lambda_root_inverse: E12D { w0: u288 { limb0: 0xd4445d3e89123811ede12825, limb1: 0x7794dbccbd7925ea98507cf8, limb2: 0x1d7a9ffbbe137d69, }, w1: u288 { limb0: 0xe7642301653a6307c7467811, limb1: 0x75e5c1fc0ff08be0981a61d8, limb2: 0x1f45aa2ee73f15e2, }, w2: u288 { limb0: 0x9865533968e39b5083fc576e, limb1: 0xc63d81e8d0c1e37c901a5a56, limb2: 0x2446d99f276e4c8b, }, w3: u288 { limb0: 0x31b5aada49be919aaa447cc7, limb1: 0x5131a5f04c3c634c9df3447, limb2: 0x223bd50b771fcaa9, }, w4: u288 { limb0: 0x6aefbf4a9ce706bc36252c47, limb1: 0x4d7ddfacdd59750105dcc37f, limb2: 0x24cfef2958a7c9c, }, w5: u288 { limb0: 0xe9789fb7259c294210f7720e, limb1: 0x4955cb370b0ac66e3e295ea6, limb2: 0x3a974db52b27468, }, w6: u288 { limb0: 0x3fb8266ad697b531de5e2fb6, limb1: 0x41feb355a44845dc30c2a9ae, limb2: 0x160b7346ec9fdd98, }, w7: u288 { limb0: 0xa56b5d534495a358f9c739f, limb1: 0x5f204fa5ce1c9a99c7979911, limb2: 0xe46af84e1cbba80, }, w8: u288 { limb0: 0xa9b51192113e131bd5572a21, limb1: 0x9b9524e9708ac412d3fa05fe, limb2: 0x1f2b5709d0d7c949, }, w9: u288 { limb0: 0x1052a86d50224b92838c5d76, limb1: 0xf690cd9eab121b1f329194c, limb2: 0x8a75eef583ffc3b, }, w10: u288 { limb0: 0x9764f07572ce9593878da9fb, limb1: 0xde7ec74175c125ac7e878050, limb2: 0xef3a64570d17038, }, w11: u288 { limb0: 0x35825f15893ad52a39f54331, limb1: 0x7b87bc78053320664e06d12b, limb2: 0x2a6290607745b58a, }, }, w: MillerLoopResultScalingFactor { w0: u288 { limb0: 0x1, limb1: 0x0, limb2: 0x0 }, w2: u288 { limb0: 0x0, limb1: 0x0, limb2: 0x0 }, w4: u288 { limb0: 0x0, limb1: 0x0, limb2: 0x0 }, w6: u288 { limb0: 0x0, limb1: 0x0, limb2: 0x0 }, w8: u288 { limb0: 0x0, limb1: 0x0, limb2: 0x0 }, w10: u288 { limb0: 0x0, limb1: 0x0, limb2: 0x0 }, }, Ris: array![ E12D { w0: u288 { limb0: 0xf2fa8194a9fdd627525394de, limb1: 0xe1d604e9b0c0efb376aaa3e1, limb2: 0x6e2d5c667e253ff, }, w1: u288 { limb0: 0x9d2d152e532c421b7834a99d, limb1: 0xe2c971b204e63954fbc8ad23, limb2: 0x2dc3c5e55face7c5, }, w2: u288 { limb0: 0xa81940aec94ea9901fcac97d, limb1: 0xea2801041714bcb5d41a0ff, limb2: 0x2ff4750593044152, }, w3: u288 { limb0: 0x55867c1f0779e0422d545f0c, limb1: 0xf76a2af1d6b410d8639501aa, limb2: 0xdab9fd3d1ef5226, }, w4: u288 { limb0: 0x845bfd3e55f70e8272c8fb3, limb1: 0x3ffd60992916c6410e0f5352, limb2: 0x2fea029bdb6a10f5, }, w5: u288 { limb0: 0xc46ce45b66636cb6ba1ee436, limb1: 0xb7d8f5bedbe3c09728563ff0, limb2: 0x2f329aa1c588e3e4, }, w6: u288 { limb0: 0x100fa50e29907ad3283e7b83, limb1: 0xa405ca3722d951cb9a512f1c, limb2: 0x2290e74d07afff26, }, w7: u288 { limb0: 0x7f4ccb1aa1cff1983d7d2ae4, limb1: 0x8be6fdabbb6f2986a20934fe, limb2: 0x6bd6eba6eb034c9, }, w8: u288 { limb0: 0x49149a6939c1e7afec80ee3c, limb1: 0xb3543992e315765cb35d0f7d, limb2: 0x1ca0c85d7f94b5c6, }, w9: u288 { limb0: 0x3e916ca84262a68f9eea11f9, limb1: 0x5ecce1f7718bba441de2df4f, limb2: 0x1f70622e79ccbeb3, }, w10: u288 { limb0: 0x9e62952be0e54c3427ea8aab, limb1: 0xc1ad39913d06e14c6ad3a156, limb2: 0x2492333e1554b6d2, }, w11: u288 { limb0: 0xb40efced523794fd2aa17d4a, limb1: 0xe1f6f435746d944886953830, limb2: 0x2a9baf66b1ec17a, }, }, E12D { w0: u288 { limb0: 0xa1fc4e1e3b65f7f7793d75d7, limb1: 0xae4e796f20d02f00e403c73f, limb2: 0x21c18c15eaf2e543, }, w1: u288 { limb0: 0x3199827390abbe9ca30d6d5e, limb1: 0x730b129db4170c217248713c, limb2: 0x1ea8d6f41a6171e5, }, w2: u288 { limb0: 0x78d14fddb4434f077e2deab0, limb1: 0x9663d11277af92fcfe15e610, limb2: 0x19210af828cd091a, }, w3: u288 { limb0: 0x4de887d39eee6cb04c395b87, limb1: 0xc2ff130aea14a5d78e28cf8d, limb2: 0x2b61bdd91c851524, }, w4: u288 { limb0: 0xf2b2ba244a309375052c4f42, limb1: 0xacf0b149db02d1722805cad4, limb2: 0x1b3d1b4d652e719c, }, w5: u288 { limb0: 0x8f6d0954663be60b848af91b, limb1: 0x4cd56e52e93373b68f6d679d, limb2: 0x2e72ef29d615a4a, }, w6: u288 { limb0: 0xe4d9fbc1e47fc17f958217f, limb1: 0x1866843e972eb31da1b03a09, limb2: 0x17626c9319fd1b0e, }, w7: u288 { limb0: 0x6e90014bb73ec0e94d75f1ae, limb1: 0x8ce846c86c0d98599ea26c73, limb2: 0x1c2a1cb42ebfeca2, }, w8: u288 { limb0: 0x59885f5adfdafec208157d20, limb1: 0xc06108cd50dca18c6f38d6bc, limb2: 0x6cd036a10985c09, }, w9: u288 { limb0: 0x585e0bc54c4d2fe3d596b2e3, limb1: 0x5927149279279dcadf8c97b5, limb2: 0x2b1fa6025f359ad2, }, w10: u288 { limb0: 0x2b7b8c0f7639faad593e8383, limb1: 0xfcf8631ba48c4afe18d80c85, limb2: 0x966e5a47631686f, }, w11: u288 { limb0: 0x69461bc00469ae6f14b23750, limb1: 0xbc63f9e8cb37c1f943bf0690, limb2: 0x1d4e149f8299aa2d, }, }, E12D { w0: u288 { limb0: 0xbfcbda7691d6021a784022d5, limb1: 0xf407b3b09ed4b94542a95f63, limb2: 0x484ab1dd7428e01, }, w1: u288 { limb0: 0xb133cd33b820c39fb9fef059, limb1: 0x254f89192819893523420d52, limb2: 0x181f7e2c71063ffc, }, w2: u288 { limb0: 0x6386c277c18b70fbeccdb0ac, limb1: 0x830322bd75699347acf10beb, limb2: 0x25b122a978cff8b4, }, w3: u288 { limb0: 0x43de51582c42a09b767cb0db, limb1: 0x38fbf88e5df42583be8f94b5, limb2: 0x425b802f131c9cb, }, w4: u288 { limb0: 0x79e8bf369ece3027d02d9b23, limb1: 0xc43d966f8d7269715ebecee4, limb2: 0x10b0ade019bf9b51, }, w5: u288 { limb0: 0x25fb1663997d761c2d966543, limb1: 0xbc90d7df362a1172ac8ad1d7, limb2: 0x1236e39a09e91ce8, }, w6: u288 { limb0: 0x7519170922b5b0bdd65be6a7, limb1: 0x8d728cf7e9203cdde92b6b1a, limb2: 0x1559bd06e06a1748, }, w7: u288 { limb0: 0x3522045a369b7bbb242270df, limb1: 0xd947b9644921f9337a72005e, limb2: 0xdcb748b310acabf, }, w8: u288 { limb0: 0xca82b75883645f8fd56ce314, limb1: 0x48e0e79fa58c59fd9d8355f8, limb2: 0x101f82655362fa7b, }, w9: u288 { limb0: 0x61742edaa0da46b51a3efb80, limb1: 0x20dc1158e04bce1a5dc049e0, limb2: 0x1cf24ce8520c3a8b, }, w10: u288 { limb0: 0x37ffb162df38cdcb561cd489, limb1: 0x16b25873b29fdfb563b16a9f, limb2: 0x2375d4bad02acd4, }, w11: u288 { limb0: 0x2c023248737e318d2195a92, limb1: 0xaca7d0297ea2a7757d8cc9e1, limb2: 0x251260ddb7f1756d, }, }, E12D { w0: u288 { limb0: 0x81fe8c8afe6873cf3f7b5cd, limb1: 0x4ec5d556e1a946d1ddcb069a, limb2: 0xca3291e3f6ef12e, }, w1: u288 { limb0: 0x474f1efbda01f550d6c04a8a, limb1: 0x59446cd0acd4c47c9c9dce4f, limb2: 0x210465e49e0a585b, }, w2: u288 { limb0: 0xad9aeb3a7e41876c9e3ef2d2, limb1: 0xb4967ef0d9e28b41cfb7752e, limb2: 0x1579d33d082372e9, }, w3: u288 { limb0: 0x8897068598400e625d41936c, limb1: 0x3630dc545ed7f6dd2996f95d, limb2: 0xe7b6ee901988b96, }, w4: u288 { limb0: 0x56832f4842ec5db2742798ab, limb1: 0xe2699baf1ca60a52f7018e62, limb2: 0x135c42195434dfb8, }, w5: u288 { limb0: 0x152cc078fbb77283d8258c18, limb1: 0xbf47d56bbf8a81ad6350e169, limb2: 0x1c7c8963acb4f782, }, w6: u288 { limb0: 0xbe58ec496805ce645c12ea57, limb1: 0x3dee712fe63432f75fa00299, limb2: 0x230af637699638ee, }, w7: u288 { limb0: 0xa24d5cf767d2273e5a46a6de, limb1: 0x9d31117f3370645b3f8ba4d3, limb2: 0x20db0eb3812b696a, }, w8: u288 { limb0: 0xb177322e3c461ec3a18fab81, limb1: 0x4e10f0ab4925d0caa9f27a52, limb2: 0x1c467f5ac56d1ba3, }, w9: u288 { limb0: 0x6582d9e0006027351cb08356, limb1: 0x9e577626acb2a07771557dbe, limb2: 0xd7c96fe485899f0, }, w10: u288 { limb0: 0x100017574dd91436dbce587a, limb1: 0xbdda3d96d428123f881648ff, limb2: 0x2b7e0871d76d7562, }, w11: u288 { limb0: 0x534b2d82060ca792890071fb, limb1: 0x28eb9400b69a85997c673f39, limb2: 0x26256194b2d8184d, }, }, E12D { w0: u288 { limb0: 0x7a0590f085219d1e49b1a202, limb1: 0xc263a8319f723136aa0b96a3, limb2: 0x679690afb81dbda, }, w1: u288 { limb0: 0x71b85226100a44d0bf7d832a, limb1: 0x3067f6fbf94ee90ffad1172, limb2: 0x1736140d66ba7277, }, w2: u288 { limb0: 0x623d0ea9bc4d6d56f1f30d4a, limb1: 0x2ab6f8d1d518c5bf6193d719, limb2: 0x9f1bd18e2b9ee3a, }, w3: u288 { limb0: 0x6761411697651fc6c319f2f6, limb1: 0x61d48ed7306e80c3c447cc50, limb2: 0x18b5b8fee4c3bed9, }, w4: u288 { limb0: 0xb09464e6861e5ed9142f517a, limb1: 0x3697362f33ee1b6a2ffca931, limb2: 0x251eca3eb15ae1bb, }, w5: u288 { limb0: 0xb753d0fb3ef0221f38b3777d, limb1: 0x2b3cba72ef077890d91f7d72, limb2: 0xcac0c0d82a467de, }, w6: u288 { limb0: 0xacf131a2e4a8ac99cb66c4c7, limb1: 0xf0ba7668749554c860961672, limb2: 0x2b83f6926886f3ff, }, w7: u288 { limb0: 0xa57b1654a5ea8d73e9cb6916, limb1: 0x37d0bb062363510695f11887, limb2: 0x1025a3438e62a335, }, w8: u288 { limb0: 0xa6e8bde02fc0040222948861, limb1: 0xb3cd895a379088da54e7d665, limb2: 0xf239a541e2db6d9, }, w9: u288 { limb0: 0x150ab124c283da1a24aaa28f, limb1: 0x7b68a368f3df8a541116a40, limb2: 0x29dabc63d0f5e9a1, }, w10: u288 { limb0: 0xfcc3ffb404bd1c0effcc67fc, limb1: 0xa99cc3a1080e8fa3eac0f79d, limb2: 0x16b2ab0f6fefb72b, }, w11: u288 { limb0: 0xf4fab8a30df710b0a7aa23e4, limb1: 0xee08aba39e9b86d66f89b09, limb2: 0x10297d8dba978173, }, }, E12D { w0: u288 { limb0: 0x7f1da8d717c321da92620a38, limb1: 0x1c34d5a41dd1580cad5da4bb, limb2: 0x264c35a795ea35b3, }, w1: u288 { limb0: 0x93ef419e31d7e04fbfe40f26, limb1: 0x8dcee057ceb6a01686e7055a, limb2: 0x1c2f5969c7a2c07e, }, w2: u288 { limb0: 0x8fe175866e96f98fff3a22a0, limb1: 0x9e8081541ccefcb53c7eb2d, limb2: 0x2244e4f0ae949c4, }, w3: u288 { limb0: 0xf44cab93381d8325a2fc894e, limb1: 0x21e4d8a6a1c197c760b4b674, limb2: 0x2e70f85fae87c741, }, w4: u288 { limb0: 0x2b9421d1f4a75279a4a37950, limb1: 0xa40bf928ba237c3b64bd886b, limb2: 0x2181a8053d4d2243, }, w5: u288 { limb0: 0x551eedbb1be148ec878c8497, limb1: 0x63cfbe2727afbb1c9ab904d8, limb2: 0x1201390258b7fa5c, }, w6: u288 { limb0: 0x3413023817ffe912237924bb, limb1: 0xc8ec7546fa50a3a5bf73ef64, limb2: 0x154b10842ab9f08e, }, w7: u288 { limb0: 0x3433f3946abd235f4852671f, limb1: 0x4f0065f08eeb7ee8349bf5b9, limb2: 0x25af5a4af220ec11, }, w8: u288 { limb0: 0xdf980696295073821473e3a9, limb1: 0xe1d5ffff2ee85385ae1d84ed, limb2: 0x998add2cc38123b, }, w9: u288 { limb0: 0xa4460f4fa19d7da44b6d37d6, limb1: 0x21a63d9ac273152908e20cf4, limb2: 0xb43c05ecc1a46d7, }, w10: u288 { limb0: 0xfa2ac15271ea1ea122a7f7c2, limb1: 0x98ccdf1be55f7224639cae5a, limb2: 0x128165600a34f4d8, }, w11: u288 { limb0: 0x880fb407eaa05426a8a3699f, limb1: 0x13b039a6d088cde86bc99280, limb2: 0x25f0ddbe00bfe102, }, }, E12D { w0: u288 { limb0: 0xe79a1a3b581b15c6552fee96, limb1: 0x623169860e532b6833adaed0, limb2: 0xdf2e1bc3f49b17f, }, w1: u288 { limb0: 0x82fbfcc8e320d1a559108ebd, limb1: 0x398449cedc8a6c95fb7efba7, limb2: 0xe3f4dc0728dd65a, }, w2: u288 { limb0: 0xd42e5660c7259f239e94e9e6, limb1: 0x56a59f4335e45444ad6f0ab9, limb2: 0x717e8c6b06e6d07, }, w3: u288 { limb0: 0x959c3512c9bb1d3663382bf5, limb1: 0x25061bc0e8ad631f66c35752, limb2: 0x1be6180a76fe2379, }, w4: u288 { limb0: 0x113a01a95ff0b7344a6ed1fa, limb1: 0xed275900f8b636a554551b04, limb2: 0x1ed20c5fe3160f13, }, w5: u288 { limb0: 0xda5b00dcbf123e7ef0e22ecb, limb1: 0x4712a15f67df4356961b91b0, limb2: 0x191a6e54a247677e, }, w6: u288 { limb0: 0x8727e056ef1f2e00001ee30b, limb1: 0xa5899f981336f6b6ffb14600, limb2: 0x2ba9019a071ff9e7, }, w7: u288 { limb0: 0x430616f2db6ce63405b60234, limb1: 0x38853a1ed4fe555eb90e9387, limb2: 0xeb9cf3c0e1b1390, }, w8: u288 { limb0: 0x48f41979d7ee62a531dc11b1, limb1: 0xbf258b286416b510392d3426, limb2: 0x586a2b2130ac60c, }, w9: u288 { limb0: 0x12a3062d7cf738e164cab726, limb1: 0xd7c481cf0010024424dad92, limb2: 0x240e926f21d6137a, }, w10: u288 { limb0: 0xde116640887cb84fb5764ef7, limb1: 0xced8e2d7611e1b329248dc19, limb2: 0x6b9c04f96a0360e, }, w11: u288 { limb0: 0xc8f83c2f3507e8a16a023597, limb1: 0x7a1d65fb1bc859ac0b9a3af6, limb2: 0x2dbdf00f63e255a2, }, }, E12D { w0: u288 { limb0: 0x9f1833d4ee6e05b2e98eb194, limb1: 0xdf61e89608afbbff54451d49, limb2: 0x7341a57c8351835, }, w1: u288 { limb0: 0x396bde8ca73f5e0e52f1bcc3, limb1: 0xb41de7c6525d9097f89f9874, limb2: 0x1fee062ab770bd4a, }, w2: u288 { limb0: 0xde88c90e56f5efff42fc5ae5, limb1: 0x70eb11756f50d40816fa1a84, limb2: 0x1f35fa63de82bc30, }, w3: u288 { limb0: 0xaacbc7daaefa32f112ff727, limb1: 0x55e72851bb33661f52250a3f, limb2: 0x18c4cc5aa53fa8ab, }, w4: u288 { limb0: 0x4d832925bb29a07f12600b73, limb1: 0x4d648c8bf3aef6e9dc8f3eca, limb2: 0x468982847f8a07e, }, w5: u288 { limb0: 0x6865044fe86fc113321d84b3, limb1: 0x4afb949d44ddc19a50d76746, limb2: 0x1c4878b6bc126ea, }, w6: u288 { limb0: 0xcdb1ec52b0efcf2a333cb03e, limb1: 0x1d47715e046d09a63bd817b5, limb2: 0x47664218590ab80, }, w7: u288 { limb0: 0x9354e8a50050939f807da303, limb1: 0xdd6956fd5c5a1aab21b97b7c, limb2: 0x1bf57342d5e7ec73, }, w8: u288 { limb0: 0xf18eec3aaeee1eea6b00228e, limb1: 0x90405b5368a83b8e3e141abd, limb2: 0x5489f27d98c5a6d, }, w9: u288 { limb0: 0x33372084065e44dcd5edfe77, limb1: 0x9ea7ef66db0f0ff55972dbea, limb2: 0x20d81d5b8dd287c6, }, w10: u288 { limb0: 0xf95c243e1128f75841ac88a8, limb1: 0xe39101c1f545587666fc99c9, limb2: 0x1332f858bc2d9ed6, }, w11: u288 { limb0: 0x3dda3f6e97341fc9cbbe60d7, limb1: 0x7214e1d782068b63e36e074f, limb2: 0x7087cef01dfb965, }, }, E12D { w0: u288 { limb0: 0xee419f4271957570f4b1c32, limb1: 0xee1f110052ca2e56a97efb6c, limb2: 0xad375e8d172d961, }, w1: u288 { limb0: 0x63ebd35fc505842517b7e802, limb1: 0x62c3623a58ae1bd17f9436b7, limb2: 0x249b716ea1290d35, }, w2: u288 { limb0: 0x21b92dabf6e5280c26e361ee, limb1: 0x3c390fa8b8657c4f4fe50e82, limb2: 0x585285292095c27, }, w3: u288 { limb0: 0x755a1f81220bff5c131d7e96, limb1: 0x4df7a8ee45d3302f30ff29a8, limb2: 0x10d1d361cff8aba5, }, w4: u288 { limb0: 0xa2041d8fc2c467e3f1bac97a, limb1: 0x48e7421f5ec41f255b8c45ce, limb2: 0xca996570d833fcf, }, w5: u288 { limb0: 0x2183fed77e39e6b8807abd2c, limb1: 0xda8b0ba5b995978dd002d1ef, limb2: 0x25ba30a10ab4363f, }, w6: u288 { limb0: 0x44a4271d7e7d6e2372deb46f, limb1: 0x6ebe794b43059afaf191747a, limb2: 0x62cd7ea75a47f9d, }, w7: u288 { limb0: 0xb01b410bdd4f7d17faad0b02, limb1: 0x92b6fa71257d0e35216b8d76, limb2: 0x234c010bcace1d9e, }, w8: u288 { limb0: 0x2dba0f00a37d7388eb27942d, limb1: 0xb2148684b3580c6d45dfc7f8, limb2: 0x2286172b9d954df5, }, w9: u288 { limb0: 0xe48a688bec46fdf3a2b3458d, limb1: 0xc0dd157ca14a9dddee9f0749, limb2: 0x29b03a6b1d1d3ec9, }, w10: u288 { limb0: 0x7cf25068f4085c9a3552b26b, limb1: 0x51c51346bf9ee9478e82069a, limb2: 0x1c3b363ed4ad026a, }, w11: u288 { limb0: 0x32055cc475ed2979ba936b5d, limb1: 0x3a76365f65bb11dfa20f6f03, limb2: 0x14e82b52083c1950, }, }, E12D { w0: u288 { limb0: 0x86528ff5d288de551ba82e20, limb1: 0x779518dbb60908f0c9f431, limb2: 0x17e7b0c198e5fbb4, }, w1: u288 { limb0: 0xa6b91b5273ad23056d2b5571, limb1: 0x18283f4038662f9f2d32aa6d, limb2: 0x26250f9c485aaafe, }, w2: u288 { limb0: 0xff4b38ab950cec36907872c, limb1: 0xe8220a80ab1a1ebfb4a6b5ad, limb2: 0x16a38cdcffaa084e, }, w3: u288 { limb0: 0x30fe4c50e7cfb82354077ff9, limb1: 0xd825202a8b56831d4cb461f8, limb2: 0xacbc4404e784841, }, w4: u288 { limb0: 0x2f290a090b14ab72c573f72d, limb1: 0x28fe7dd957a3fea3a48824a3, limb2: 0x8d4fde60889f05e, }, w5: u288 { limb0: 0x78e4ad232628f93493799b05, limb1: 0x853fa0b232ed0e0fe4c72ee8, limb2: 0x1905420adaee585, }, w6: u288 { limb0: 0xf5b5ceac316dae7d4b72f222, limb1: 0xda7b251194b88252808ac1a8, limb2: 0xc2ad9e69e7a3c18, }, w7: u288 { limb0: 0x871823350e01e7c076568b23, limb1: 0xc2fcb7b9ab99f9ea2de64a6f, limb2: 0xcbca7c0f294b05, }, w8: u288 { limb0: 0x58214cf485aa2980892ab270, limb1: 0x38ae8b1a6d563a6e90b57720, limb2: 0xadc0f206a82720c, }, w9: u288 { limb0: 0xe47d85736adce266525b33a5, limb1: 0x75f41b36a691ecb3f1af75f, limb2: 0x2aaaad4a322f5ca2, }, w10: u288 { limb0: 0x449e76f3e507d1e4f79b2b41, limb1: 0xa66a19bfc8476c6ef9730a71, limb2: 0x1c4a7da448d6a424, }, w11: u288 { limb0: 0xaa745ba79deacfc0e958305c, limb1: 0x771b3d2cba2c850277042d9f, limb2: 0x2bbe2dd81ae206bf, }, }, E12D { w0: u288 { limb0: 0x89800871747a5772af0a4a5a, limb1: 0xc77aea4a034bd02c1a52fda4, limb2: 0x7696ff7e1b8f387, }, w1: u288 { limb0: 0xdc9663d006102d510d74c328, limb1: 0xfa5faa547c8a1b45034a3b2, limb2: 0x260faf1bbeb9d987, }, w2: u288 { limb0: 0x1bc1799be4bb7102992ecd13, limb1: 0x94e15f371c06ced1fde0dd3, limb2: 0x665a3a12509ed21, }, w3: u288 { limb0: 0xdcd827948ef109459f3b29fb, limb1: 0xa669670e935b5b5f278378c2, limb2: 0x2d04dee2ca1ba30c, }, w4: u288 { limb0: 0x63cc8b1759ef1e93c126782a, limb1: 0xe01767580df775dd4a40d5e5, limb2: 0x161187b33f992c8b, }, w5: u288 { limb0: 0xfe53c1faf8ba08de077db23f, limb1: 0x6ac9f2dc628f14bdf063327f, limb2: 0xec69da938087b0, }, w6: u288 { limb0: 0xead0bc1f5077694dad55c03f, limb1: 0xd6e68bf4d6cc956adcf2c643, limb2: 0x2dbf0ee9310afb09, }, w7: u288 { limb0: 0x863a0a8f4e19da762f117929, limb1: 0xdcf7e18447603c210882cb78, limb2: 0xdf9e8f70db03ce1, }, w8: u288 { limb0: 0xedf02766e9b8595f63abd18c, limb1: 0x784e4d5d60f519796f01cde8, limb2: 0x8671ab547845137, }, w9: u288 { limb0: 0x5b506c6c1ece6c888adc5d1a, limb1: 0x4ac5204b72b2c1a7db79a319, limb2: 0x1f01964bf79ce370, }, w10: u288 { limb0: 0x50e0979033627a4231737ef9, limb1: 0x9547f6bbfc8dee1f09baa0d9, limb2: 0xc73a07daa4654d3, }, w11: u288 { limb0: 0x152d341606f78da11aad9ad2, limb1: 0xdda73da51b1d63f6e0ba9b3, limb2: 0xf3378aada8698c6, }, }, E12D { w0: u288 { limb0: 0xc8a1ffbcd36ed4cf96782047, limb1: 0xd674cc0260707439a67f952c, limb2: 0x2bf4eb8f91fe5fe, }, w1: u288 { limb0: 0x87b77db32833cadca24eb37e, limb1: 0xf97e1ee9a29b1b3c4719de34, limb2: 0x10126e19d78ecaaa, }, w2: u288 { limb0: 0xf98f2fabd09b0a5b9eafd15a, limb1: 0x551baec50edb12da0d5439db, limb2: 0x14143683bf9b20b6, }, w3: u288 { limb0: 0x889655ca288b714f93f77428, limb1: 0x427cb28612597746a1372e94, limb2: 0x179e4eb714c7ff5c, }, w4: u288 { limb0: 0xf013770528f37122163612df, limb1: 0x8508416610e03d5e483e931f, limb2: 0x1a3cffaf3e762f1f, }, w5: u288 { limb0: 0x68d9bce40de25a34c00673f8, limb1: 0x9c697c919600f1ac723e8196, limb2: 0x19b88d8ac3b0e9a6, }, w6: u288 { limb0: 0xb41eaaa12e51e41f4a63d546, limb1: 0x7c859bffe9718b4e4b70d5af, limb2: 0x759e326dd6510bb, }, w7: u288 { limb0: 0xd160d856a92451c9341c729d, limb1: 0xdb907261b307fcd1e3a6d643, limb2: 0x21bbcee531c7850a, }, w8: u288 { limb0: 0x9b5f4ee4a91ab24f1fc4a252, limb1: 0x6ef085e2d7b9323fccd45f17, limb2: 0x7ddd2baeb8903da, }, w9: u288 { limb0: 0x356ca7b20da6a61328d2e6f8, limb1: 0xfe0a1835633574cddc743244, limb2: 0x260d783f746548, }, w10: u288 { limb0: 0x54119d293bba5a7b8c911e9a, limb1: 0x4c8bec82c87653b80179260, limb2: 0xc719d4761fc3dc3, }, w11: u288 { limb0: 0x27f9c5cf95c7c1614561860a, limb1: 0x2b6222d4d1199c76ca386b22, limb2: 0x16c8ee50f9adc5ac, }, }, E12D { w0: u288 { limb0: 0x6f3f7d0292c186ae873944f, limb1: 0x35c8a1bf39fa92a9f242fd69, limb2: 0x14b95f826ac74736, }, w1: u288 { limb0: 0x1c8deec644cf2503777cd0e9, limb1: 0xe390b3744ef378a066993673, limb2: 0x1ce103c73af34607, }, w2: u288 { limb0: 0xe51b2b5264cab98b0dce20e3, limb1: 0x12baa9b4a22f7f60f5a9e8a7, limb2: 0x199e6082a24e29fc, }, w3: u288 { limb0: 0x8ccec4fd0f4c40b24c174906, limb1: 0xd0eb4c466b50542bdd1f7ccd, limb2: 0x130c4888c5671589, }, w4: u288 { limb0: 0x841b256a04eb7ee8c763a86, limb1: 0x44dcb7ccff639f5cf00547f6, limb2: 0x43826f4900a3942, }, w5: u288 { limb0: 0x9dd7608e2f8eaab2cf59cf27, limb1: 0x6c531affa90ee4c3e6b1315b, limb2: 0x14c5bbbc9b662751, }, w6: u288 { limb0: 0x40ead5c383741f5e94a372dd, limb1: 0x63456b35874faf8614778b7e, limb2: 0x160428014e84270e, }, w7: u288 { limb0: 0x77ca9da77c9c26fa4eddeffb, limb1: 0xd64c0c2e0baa8971ce138592, limb2: 0x2532dd267a25b4f, }, w8: u288 { limb0: 0x8f0b492fe9cbb6713b3ae0b9, limb1: 0x6cd8f706cbc20ff6c2978d34, limb2: 0x25b8b619c12b4d53, }, w9: u288 { limb0: 0xb9f16df613dc83610524ae59, limb1: 0x999af8cf94fe6e9155b24ee, limb2: 0x2d763001f6ee910a, }, w10: u288 { limb0: 0x72e6293fa1874d4456f6a7ab, limb1: 0xbba9e551a891ac14dc529d7, limb2: 0x2fe56f474f803a1a, }, w11: u288 { limb0: 0xddef305ed66e797eb44cc927, limb1: 0x46cf45a1ffa3be343166c96a, limb2: 0x2c91340e7201c8e7, }, }, E12D { w0: u288 { limb0: 0xacd367bfb3a86503c4696228, limb1: 0xe5bebb9f891e0fcf9bb400df, limb2: 0x1f053bcf8dd0c40e, }, w1: u288 { limb0: 0xaa5f25aba69edf7eb3fbac7f, limb1: 0xa57c44bfb7a813d9565c6f4e, limb2: 0x1cbd2cad199b90af, }, w2: u288 { limb0: 0x1e3561ce4486f49c51c4841, limb1: 0x5d707d777cc267134dcb4a3e, limb2: 0x2d4f1b6b1704fcf8, }, w3: u288 { limb0: 0x8133df3d973205e2a6667b05, limb1: 0xd71333cad7c23d6436f895b1, limb2: 0xb96c7c4d9019afe, }, w4: u288 { limb0: 0x4c82c43fae3e6a4e9ac79773, limb1: 0xd632da8c8fade4bdd6d055b5, limb2: 0x1493c61b79713a9c, }, w5: u288 { limb0: 0x14f7514b5a6375a0ba02dfdd, limb1: 0xdb0492be6d819a64e5c8e869, limb2: 0x29ce11799d8ce7f6, }, w6: u288 { limb0: 0x88e5da8addd545f6e1828516, limb1: 0x59ab28d6dd8eb6ea501d3cb9, limb2: 0xe761374e20c2910, }, w7: u288 { limb0: 0x494bfaefdde4921257b3c8ff, limb1: 0xc560828dcd36efd417e936e7, limb2: 0x19065a582b0bfe84, }, w8: u288 { limb0: 0x54aed757dacfad3714775cd3, limb1: 0xc84bdb236c7d909b5a8a3cfc, limb2: 0x1568bd40a8a5b14d, }, w9: u288 { limb0: 0x5b800e067bb87a8edd6ba6f4, limb1: 0x72fafdbd2943d900f8330a8a, limb2: 0x203214386552455e, }, w10: u288 { limb0: 0x79c850293dd1ed17289f8d7a, limb1: 0x23514882c698d62934f0b85c, limb2: 0x2c8da86af166ec2, }, w11: u288 { limb0: 0x3149423b81d0601bf6983f66, limb1: 0xfdab0d5a898edf32625fdbe6, limb2: 0x81a2800e45aa663, }, }, E12D { w0: u288 { limb0: 0x8b51da2d8c55494918df21dd, limb1: 0xe08f0cc653fff5f77d129809, limb2: 0xac43cdef76e8e2b, }, w1: u288 { limb0: 0xe88d81f8cdf9db6cc3d7a8e3, limb1: 0xbbb798eb9215c4e9215009f5, limb2: 0x2b6e67c7cd78b23c, }, w2: u288 { limb0: 0x95fbbffc4a22fefe6ed6f466, limb1: 0x44b328ca91837bc5f2813bea, limb2: 0x15a0aa861322fe8e, }, w3: u288 { limb0: 0x230d31e951092a571dd5146, limb1: 0x1a87d85d215cd450d2691c01, limb2: 0x273b3d4ad1da0c4f, }, w4: u288 { limb0: 0xe13981b2395738db11f814d4, limb1: 0x96f3b24aa8b0e2286829b356, limb2: 0x17ca1b6c416d0b08, }, w5: u288 { limb0: 0x8a2711890225f3347def3ac, limb1: 0xaff7929a071b6d219ecc0d90, limb2: 0x13ab0ad11f39ed5c, }, w6: u288 { limb0: 0x131141a0e2587df1ed43c57a, limb1: 0xee8de29045aa8df56e7bf4d3, limb2: 0x53d8a8045aced2a, }, w7: u288 { limb0: 0x751db179fd8b0dd97ab90b62, limb1: 0xb24fa4509ea9a05ea3a0820e, limb2: 0x1b94eafd5f42b129, }, w8: u288 { limb0: 0x54d9a3cce32c8d336a38434, limb1: 0x8ef332aae2744817c97aa9fc, limb2: 0x5acd19414989ac9, }, w9: u288 { limb0: 0xdcd805c3441bf8da9f078037, limb1: 0x9d7cef94b46af01f54df6022, limb2: 0x13e81873c53f7de, }, w10: u288 { limb0: 0xd188a8da6b09f460a30ea7d4, limb1: 0x5e7d133426f98ced17f967ed, limb2: 0x2f9622f5e2961afd, }, w11: u288 { limb0: 0x835b65476aa69e0fee8add66, limb1: 0xf7eb0db4196481743f7c8536, limb2: 0x2420247c2eae05, }, }, E12D { w0: u288 { limb0: 0x1b9b3275438def2b14d3d6ec, limb1: 0x215e7ca4b8e610b90aea1fe2, limb2: 0xc57e1f84bab1fde, }, w1: u288 { limb0: 0xa3aa8bb56e04c330c70af082, limb1: 0x762683dea3a91a1813ebbe47, limb2: 0x1db06cf6c01944ef, }, w2: u288 { limb0: 0x6d3534ad1666ff07aef8ee5e, limb1: 0x95034543d303718bdddd0876, limb2: 0x4ffb855d2c5477a, }, w3: u288 { limb0: 0x9de5ea1d4cd7b93d85eef3a3, limb1: 0x7a3b2e8a90f40fbe7afa11b, limb2: 0x286259c2593cd27f, }, w4: u288 { limb0: 0xdb82f137af29e3458455efc4, limb1: 0x8b665e9e0eb3b9c8f027e3c9, limb2: 0x20fefbc49fb31a8e, }, w5: u288 { limb0: 0x6efd0bb670c6350880f786b3, limb1: 0x205615a0185a1b00916d37b7, limb2: 0x6375097bd6ed176, }, w6: u288 { limb0: 0x5e049cdbb227617f099b81d, limb1: 0x7c89c3a84805e47debd2d9b0, limb2: 0x90ad0e891a3872a, }, w7: u288 { limb0: 0x8deade236dc1f483f78b820, limb1: 0xa22016ef71d65892b510b65a, limb2: 0x15b035673845e2ba, }, w8: u288 { limb0: 0x28cce0800fcaeca24e4a1f11, limb1: 0xc873a609eb7443c53cc2146e, limb2: 0xed7bc75055a0bee, }, w9: u288 { limb0: 0xfdb3d8249042253ea50045c3, limb1: 0x1873c79692308a13011bf359, limb2: 0x1a1644f1a3d5b115, }, w10: u288 { limb0: 0x5c988b98ae035a4304a5f88d, limb1: 0x8a2936146d5703d9604e064c, limb2: 0x29b6437df8007dea, }, w11: u288 { limb0: 0x86051e2a2aaadd941e2a9241, limb1: 0xbf728a94603ee43956adbfb9, limb2: 0x2d4db3ebddcfd258, }, }, E12D { w0: u288 { limb0: 0x92acc012d562dfdfb6481b25, limb1: 0x3e64355b8e9e3082f99d33c5, limb2: 0x290b6aea5955f671, }, w1: u288 { limb0: 0xea2dac1a1640a6ac9b9ad377, limb1: 0xe1775d01c8f21468867a89ff, limb2: 0x1cf6cdd23f7ccb8b, }, w2: u288 { limb0: 0xd51e98bf9719380b097ea1fb, limb1: 0xd74149401b7667643b22e27f, limb2: 0x129b599f9eed72c9, }, w3: u288 { limb0: 0x66f868e872b587c8e5a18431, limb1: 0x5ce11b08a6e0fe0e0f9b96f1, limb2: 0xcecf76d78ff36b2, }, w4: u288 { limb0: 0x5ccd6edc479aeaf571c0890d, limb1: 0x91881d482210406422d39529, limb2: 0x2b1eefab1035d22a, }, w5: u288 { limb0: 0x10b346eae6854f264c866223, limb1: 0xece7a4751aad88e0d43ff850, limb2: 0x26ac9d94ac41a06c, }, w6: u288 { limb0: 0xdca528ca6016058cf3e5fae2, limb1: 0x78690b84e775a92f8bc8a4ed, limb2: 0x212be7d16a5f6c89, }, w7: u288 { limb0: 0xf3e83e445c62eeeb7ec84ce0, limb1: 0xdd116e6e8364db0a64b50304, limb2: 0x279d1022cd3e3e1f, }, w8: u288 { limb0: 0x65f73450ca7a1766028a9d92, limb1: 0xf27270b3123129865bf05ad5, limb2: 0x26bc3d97ad8925f4, }, w9: u288 { limb0: 0x944c276de7f91d41bcc4127e, limb1: 0xa89166f745e7e0640866c8db, limb2: 0xe7f920bd863ceb4, }, w10: u288 { limb0: 0xa31d4c6a3bdcbe04860624d4, limb1: 0x7c504b80689c987f9708269e, limb2: 0x27550021cf25c30d, }, w11: u288 { limb0: 0x91cb5c5218981603a881667f, limb1: 0xa0905ee77f1c0e9a5f9de4, limb2: 0xcc2ecbee6addff5, }, }, E12D { w0: u288 { limb0: 0x27ea098c66c31201eefb8430, limb1: 0x289402da5fe4bd14d8ef6edf, limb2: 0x1259961e054d6cd7, }, w1: u288 { limb0: 0xdf5835eb2fd6b73c5dba911a, limb1: 0xca03ca62684adaa9524cea2, limb2: 0x2eb6accd5526bb8c, }, w2: u288 { limb0: 0x30900fcfe01bded79b3d2477, limb1: 0xb279579672976833505fa71d, limb2: 0x162ac340cc3a9243, }, w3: u288 { limb0: 0xea6f09f94f1137fe93d6e281, limb1: 0xabf9e0b69162edef149ff1f3, limb2: 0xff91140a0ef8671, }, w4: u288 { limb0: 0x202e27f741f1e2b81753060e, limb1: 0x26a9a0ce89b8f06fa7d6326, limb2: 0x1c707bf011a33ace, }, w5: u288 { limb0: 0x95578a2c8e1895ac184cabfb, limb1: 0xbb75389aaa763c673982ea8, limb2: 0x607a8649a7b2555, }, w6: u288 { limb0: 0x71d90544c20a5aed5f41931, limb1: 0x16847c43a0cdfc05ebe58815, limb2: 0x4721c3f212088b0, }, w7: u288 { limb0: 0xc360aaad2a45074edfb74e14, limb1: 0x77f564b43fa632bde8eec9d, limb2: 0x250afa706df6d5e2, }, w8: u288 { limb0: 0x8bde53cc45322245c61c9a8b, limb1: 0xbb082994c8f59570001a3550, limb2: 0x27b5ec7a33a77874, }, w9: u288 { limb0: 0xd33f34a1a253f871c0f128e9, limb1: 0x88e401602a88af3bb22d4b4f, limb2: 0x8194f6251e043d8, }, w10: u288 { limb0: 0x37787931890dad2749f4172f, limb1: 0xb781b6da2911d39376770d8a, limb2: 0xf86cba82a2a63ca, }, w11: u288 { limb0: 0xb283d3c5e1df307fbded08de, limb1: 0x845c1e02379ee7fb83ade74d, limb2: 0x113edfefc35c7b27, }, }, E12D { w0: u288 { limb0: 0x800d14c753c40eb876da5bb8, limb1: 0xdd394093deedc4a58300a401, limb2: 0x20bbc62916a1c1c5, }, w1: u288 { limb0: 0x1ff3c025cb5fe163ac6341a1, limb1: 0x3492edb1001d97c57690e3ea, limb2: 0x2af5edbf90641874, }, w2: u288 { limb0: 0xa01ab0362ad9941df67212b5, limb1: 0x1273a4cfacad5b920f984247, limb2: 0x2c8dfd25ae12d28b, }, w3: u288 { limb0: 0xc72f15c7299855613325128d, limb1: 0xa7e25f6a3deaf4f7be35e120, limb2: 0x2607d100cbda5ad, }, w4: u288 { limb0: 0x2e236358d7c29fcbc45476ce, limb1: 0x696b09274ac45b177403228f, limb2: 0x22e618af62719cf3, }, w5: u288 { limb0: 0x81b4d1b3b2d2686cc3a33fac, limb1: 0xf5c5ffadb6ae0769530803d7, limb2: 0xe18f6caa2f9150, }, w6: u288 { limb0: 0x820aefb2f234355503fd73f6, limb1: 0xee49d901c9c66c15af10aafc, limb2: 0x2cf38629461bbcbd, }, w7: u288 { limb0: 0x702e95e8e205ab0d73f4d645, limb1: 0x6cc8a9e2e5bd482c2d970d01, limb2: 0x26c6783eedf68370, }, w8: u288 { limb0: 0xb083a4ca598ff879ef7aa527, limb1: 0x5310d5c6e27bf7bfa6681a70, limb2: 0x29480250c596232a, }, w9: u288 { limb0: 0x6cfaa3e7f9ac2fd8645db473, limb1: 0xb2739d025d0bf248c2d4e1a2, limb2: 0x912e2dc7402cd4f, }, w10: u288 { limb0: 0x2bd49d41f5a3e28554df2631, limb1: 0x8065584c5473ee5f56b0993e, limb2: 0xfb04b567cc1113a, }, w11: u288 { limb0: 0xf5cd0cfcb2e6ff69bf4754a5, limb1: 0xdb8d57f575f0a9e1419111fe, limb2: 0x1d1cea3ff669ce4e, }, }, E12D { w0: u288 { limb0: 0x61d29bcc1a3f6167a79d8c38, limb1: 0x532714800454848152e1c0e0, limb2: 0x132484d6b22372ae, }, w1: u288 { limb0: 0x108ce4183553945caff854, limb1: 0xbd70dd52d149435432ea127f, limb2: 0x189cdc05d04909b0, }, w2: u288 { limb0: 0x5ad21b0a5646ad085f528109, limb1: 0x1a9fc07a354670945f565e9e, limb2: 0x1e93c1c3e4b89488, }, w3: u288 { limb0: 0xa2b07e2a8ba8644821d8d454, limb1: 0xb04d7421f3ac6397e80a92a1, limb2: 0xe2e5a47221b2430, }, w4: u288 { limb0: 0x60e96edf654796d2d1e7ad12, limb1: 0xc053caa606b820b7bc203105, limb2: 0x23de5802449e2d0d, }, w5: u288 { limb0: 0x33531996505d714b68e97cdc, limb1: 0xb2f7f6dacae5650c70369c5, limb2: 0x2b9c8a1bd70d65c8, }, w6: u288 { limb0: 0x29c656ded9d8ede8b14e133a, limb1: 0x3251a0119e1def6470a73ee1, limb2: 0x108ccfd72642f085, }, w7: u288 { limb0: 0x59d63f9e2a5252d394fb3b13, limb1: 0x6af3a4182c974a4a4cb8cb43, limb2: 0x1a0d6334a517c128, }, w8: u288 { limb0: 0x1f9c66a90a3636f14efcc3bb, limb1: 0xbcf2e4dd6a6a18e0f4032755, limb2: 0xf77ce25573b3637, }, w9: u288 { limb0: 0x8629d396f0cbb19e5e5ae3ef, limb1: 0x8999b95d2cef1a967c52155e, limb2: 0x1a651bad046779e8, }, w10: u288 { limb0: 0x4136e2e567c71c7327bb5498, limb1: 0xfc077703802a973be3e1b595, limb2: 0x164eecf7e317e50f, }, w11: u288 { limb0: 0xa675d361f8324c4030afe60, limb1: 0xa5a92a85a22d4b737612f493, limb2: 0x1904c09382a0596a, }, }, E12D { w0: u288 { limb0: 0x7430544030d0c5607d8574fa, limb1: 0x948e3aa4cdc35494aa3d0c22, limb2: 0x149ca9118143d93b, }, w1: u288 { limb0: 0xe2ca69dc59b49107e665c357, limb1: 0xdff3f92ef170aba8ecbfed91, limb2: 0xc0020a7d7b54ee9, }, w2: u288 { limb0: 0x70927630b958392565150156, limb1: 0x50bccd63e76535da30f22410, limb2: 0x85f6272d3683e99, }, w3: u288 { limb0: 0x18b10fe562294e1493d32869, limb1: 0x7e3a83f64e5b06dad1f392f0, limb2: 0x7e60317cbbc746e, }, w4: u288 { limb0: 0x77d3f868cb018f42a51a098f, limb1: 0x3b28392831d5cdaf18471e03, limb2: 0x11b5be48a78a0132, }, w5: u288 { limb0: 0x8d1ce97123cff01dbf56879c, limb1: 0x2f02af85223c497ff5b2e11a, limb2: 0x1d3f1a99dfbd1384, }, w6: u288 { limb0: 0x3fd75ee1c489f88b2fc32243, limb1: 0x737aae095a654f624b6f63f9, limb2: 0x2f4b2b139fdc4fa9, }, w7: u288 { limb0: 0xa450865b8dc8ad706d913ad1, limb1: 0x6568246a5878ce9e6911b5d5, limb2: 0xd1505e942ab53fc, }, w8: u288 { limb0: 0x803cfc36831117d202a58c58, limb1: 0xc6daa54242c30c5d44005261, limb2: 0x27e112ce5019213, }, w9: u288 { limb0: 0x1381248822859f125ce62cd4, limb1: 0xfc617ab7f0e7bc85a514d322, limb2: 0x2a4e7ebc04f2a885, }, w10: u288 { limb0: 0x70e8bced7cd129b4096b8665, limb1: 0x8f4670dd657fde1c37ca0a3d, limb2: 0x9b49f8885959fcd, }, w11: u288 { limb0: 0x20534cc97052c24c0833ee05, limb1: 0xe9fe07db116fc63f2e2a4c5c, limb2: 0x1e017a6b3eebf717, }, }, E12D { w0: u288 { limb0: 0x6e6bdf80500cb854f5dd0bff, limb1: 0xbf9a626b9cbccc283c57700b, limb2: 0x20f5c7f5f71cb22d, }, w1: u288 { limb0: 0xdb32a31be60950339fb1122a, limb1: 0xf752607f2d770dbc152220c2, limb2: 0x119f27829f3f396b, }, w2: u288 { limb0: 0x9d48d334e95302c9d457e824, limb1: 0x71e66184e0c417cc823bcb6d, limb2: 0x230fd13d768e195b, }, w3: u288 { limb0: 0x2cce2b592737976adcdeb399, limb1: 0x6f7e7895cc9ac490802fc64c, limb2: 0x2e34a9c5e37e2c13, }, w4: u288 { limb0: 0x1b78faac53b2579e5036465a, limb1: 0x3dd4cb80488ff8f5cac70df4, limb2: 0x29834f6805b456e1, }, w5: u288 { limb0: 0xbeb6734949c1988a2bab2b43, limb1: 0x2551b72dc3bd9631884c52eb, limb2: 0x2a7502d7a3ab80e4, }, w6: u288 { limb0: 0xc862806b3e7a8b9b9c55054, limb1: 0x874d4d7db6cd2dc1c25218dc, limb2: 0x102e882c30c3623e, }, w7: u288 { limb0: 0xf303abb1515fa0b31a804e39, limb1: 0x240918f6ba89758a1c7d1cfa, limb2: 0x7f3dfb58aa1125b, }, w8: u288 { limb0: 0x3f1cfdf33cad91734b211407, limb1: 0x17c4a8522daa84de4bad7323, limb2: 0x19c76e0eb6c3b0c3, }, w9: u288 { limb0: 0x3a57bba7ae1b75fc6df7c6c0, limb1: 0xac20c3a4dd640432204a0563, limb2: 0x23288051e80e08eb, }, w10: u288 { limb0: 0x5e00c38b0e2a7ce9098d68b0, limb1: 0x66eae940dafebe8c421747aa, limb2: 0x9136eb12adac86f, }, w11: u288 { limb0: 0xf157c33f547ac7f32e5da8f0, limb1: 0xf76a7a02c64558b3145a2909, limb2: 0x260334b73e26b56, }, }, E12D { w0: u288 { limb0: 0xd4841712eb8b92acbedd7923, limb1: 0xdcc6cee17886abdb1007239, limb2: 0x150b39f44b2070e0, }, w1: u288 { limb0: 0x5693a871b5fcffa2aa8b4aaf, limb1: 0xf260475042f99b758ffee0f5, limb2: 0x10a5018f8eb12723, }, w2: u288 { limb0: 0x43308af7aa07017ad6f06355, limb1: 0xc9bed74aa5c3e515055e74bb, limb2: 0x281c1906fc2d8afe, }, w3: u288 { limb0: 0xaa4bf5eb2f5748f9b858b3ac, limb1: 0x903bb70501a35aac3f678acf, limb2: 0x1eb2165addc33abe, }, w4: u288 { limb0: 0xfc14dce79b687ac1377a374f, limb1: 0x18252db25bc6c91e70b57c56, limb2: 0x250aa6edf0514ce, }, w5: u288 { limb0: 0x229282724410b8e16b0f2fa7, limb1: 0x43c0ab0e53479a84a0f564b1, limb2: 0x277ac6336a1a9b7d, }, w6: u288 { limb0: 0xdeed55ef2faf345e53af52ec, limb1: 0x3bce9ebf3a661964cfe37503, limb2: 0x97f9056a20ad491, }, w7: u288 { limb0: 0x5f69ceece471cc3ebd6aa0f8, limb1: 0x32189eba17079bfd1de6d1a9, limb2: 0x12a79a708bf4a5f3, }, w8: u288 { limb0: 0xccbdec684569a23bb8881bd3, limb1: 0xd74a36913d0eb6e13ae1583b, limb2: 0xced65adac6fe081, }, w9: u288 { limb0: 0x37e051b03ff0ee8df34ca1d1, limb1: 0xc09812bdf872a01279ba5ec7, limb2: 0xc1c7be819a2edf5, }, w10: u288 { limb0: 0xdfb1cb3fd176963ae1e316f5, limb1: 0xdfef2969e0f31e316ae3b98, limb2: 0x16ce939a24e83d96, }, w11: u288 { limb0: 0x4def6d08fe4f8a3b36f8e4e4, limb1: 0x25c0237a5c43846680868d, limb2: 0x28301a94744a9062, }, }, E12D { w0: u288 { limb0: 0x51d791055394af3437707fca, limb1: 0x23d9d4f513172857b91ac570, limb2: 0x12d712a33c1350ef, }, w1: u288 { limb0: 0x6ebaf7ae16d5257aa23557c3, limb1: 0x7e85a68783668f379c36a3df, limb2: 0x1b780a9a09031ddc, }, w2: u288 { limb0: 0xfec2358627a9becd5a63e12e, limb1: 0xe9bef5e0c521222e0b7da3b1, limb2: 0x1296f365f4cf82fb, }, w3: u288 { limb0: 0x6cc4cf9d0dad41495180590b, limb1: 0x9f70ac798e90cf1ea4b1c1c8, limb2: 0x87c41a6c59dfc2d, }, w4: u288 { limb0: 0xe8febbc4d69a96df764a0a62, limb1: 0x1fb35aecac9dae22ec85780a, limb2: 0xdf36c808d1b34d, }, w5: u288 { limb0: 0x2e55c0606268af7f04a33d7c, limb1: 0xa3ea362cb853b36d21362864, limb2: 0x2440dcee8b02c1d8, }, w6: u288 { limb0: 0xef7561c98b669e09fef5573b, limb1: 0x9faf5b92dae5c40288b29667, limb2: 0x211a161b16c7393a, }, w7: u288 { limb0: 0x24d4a044898ad07d62fa1828, limb1: 0xf0baabec5df39b859a9a23b6, limb2: 0x26521f9732987047, }, w8: u288 { limb0: 0x7229c3d55422cc60a2776f2c, limb1: 0x22befd3a50a7a7e04032a122, limb2: 0x105baaf5e920b8c2, }, w9: u288 { limb0: 0x4390439b3b081876e13423a3, limb1: 0xb568d6eb2f6f72b6c3159bcc, limb2: 0x169d5ab5a0f60736, }, w10: u288 { limb0: 0x2f0b3c9576e4fd67031ca87d, limb1: 0x22e0bc83c4170a8aa384e3dd, limb2: 0x2872abcaeb098125, }, w11: u288 { limb0: 0xe52e2fb0028f73e921534e74, limb1: 0xf6cfd97c1d181d7750441ac9, limb2: 0x1c56ef8977682024, }, }, E12D { w0: u288 { limb0: 0xae28d327617f61548f759aba, limb1: 0x1401aa78c9ec2231ff346415, limb2: 0x113fb038206ddf58, }, w1: u288 { limb0: 0x42996e09532c7a0cefd8a71e, limb1: 0x69c61eb722a1e7209c4cd611, limb2: 0x13a6cbdff96772d, }, w2: u288 { limb0: 0xbf63f1fcc51ddcc897f42363, limb1: 0x707fca9fe10a26f918b0ca37, limb2: 0x669edeff7d809fe, }, w3: u288 { limb0: 0x8bb34e49a388ddc9b04b2180, limb1: 0x38dcd13822ba4ee2a5cdd793, limb2: 0x1d5dac515eaa51b8, }, w4: u288 { limb0: 0xa0125e6adb1681a41dbbf2d6, limb1: 0x3e2cccd5ac961e1a78aab8ce, limb2: 0x13d6bd7db8c4b48e, }, w5: u288 { limb0: 0x737b7f10bf6822280731a819, limb1: 0x69bd4676e8f1e6a89c10d4e7, limb2: 0x19ba69c1ce404728, }, w6: u288 { limb0: 0x4309f0c42a45a1cd80562659, limb1: 0xdda759df4dc118a6bb9c4ff4, limb2: 0x1fef98dddc22b559, }, w7: u288 { limb0: 0x16e4b900d586497d3c45f6df, limb1: 0x49f7f05337ad0de92e3b353d, limb2: 0x2a317f6bb6771fc4, }, w8: u288 { limb0: 0xdb1d34070b21596c13268b11, limb1: 0xaa74ad91700236cbbbdc34ff, limb2: 0x1f3d2738883aba1b, }, w9: u288 { limb0: 0x5dd4d2f3b2fa8a97fa8ea9f9, limb1: 0x2c5dc834a8f95e902710f4df, limb2: 0x138f968bf21498ba, }, w10: u288 { limb0: 0xabdbabb3b67443c8a7106c79, limb1: 0xb0ae2b75703e953d30907447, limb2: 0x190bab990471c462, }, w11: u288 { limb0: 0xcf34ae390b76e945d679a1ba, limb1: 0x4f4ea018b12e85eefbae6240, limb2: 0x11b6508aaf7e8efa, }, }, E12D { w0: u288 { limb0: 0x1d3d00823688d41dfa0aa2b3, limb1: 0x9b15db2c2993d757e61bb1c0, limb2: 0x2ae11207cfbeafa3, }, w1: u288 { limb0: 0x98d01e898aa5900d5e36c127, limb1: 0x5758a38ee763892c547b2b91, limb2: 0x10637e0aedce350d, }, w2: u288 { limb0: 0x7e29a433af8412d07647248, limb1: 0xa64f271a5fcb6111d0d23fe5, limb2: 0x19b1b1819c206eb3, }, w3: u288 { limb0: 0x76c3391612430b219f11873, limb1: 0x10b12d6e15c51b81da686386, limb2: 0x2e39ee00a0dd8a97, }, w4: u288 { limb0: 0x1a95ae61cf5a0ed10ad477b2, limb1: 0x288278e4057eea5d43aa3a66, limb2: 0xb2bb0125965187e, }, w5: u288 { limb0: 0xdcec59caea988d5ed8354e57, limb1: 0xd9de2dbed0736af7fb5adde9, limb2: 0x139627bfb4249292, }, w6: u288 { limb0: 0xb1a085a9c20d52aff5c6f0be, limb1: 0x9a17337ed73c52ccead8864e, limb2: 0xdcfc8e7b31d6b15, }, w7: u288 { limb0: 0x1ded66fd8aec0a04c911f1a3, limb1: 0x2814204faef35f41e3f1cc8b, limb2: 0x1999b17d88973015, }, w8: u288 { limb0: 0xa9969aafed2e81fe21fceccc, limb1: 0xde819f6c6186b981c324bd60, limb2: 0x2ea9d87f146b9984, }, w9: u288 { limb0: 0xa576384a80333dedf9e88310, limb1: 0x364ad41f1043ed9c6286cf5d, limb2: 0x185381ccca5628e0, }, w10: u288 { limb0: 0xec6a507f1e942bf671d63ab3, limb1: 0xf9ec826df2822a61bc36725, limb2: 0x14ce04de4bbb61da, }, w11: u288 { limb0: 0x168a2628e665ca7591760e15, limb1: 0x115842818d09028abf06552f, limb2: 0x1c7b912d4cec67a3, }, }, E12D { w0: u288 { limb0: 0xf73192b2fe5dc1293422b385, limb1: 0x7c0b272084084d471108c781, limb2: 0x3020dd2bb1971af4, }, w1: u288 { limb0: 0x30a64137b7e95ebfcdab4d96, limb1: 0x229f57d761eeb3876b51cd56, limb2: 0x19a596949310e6ad, }, w2: u288 { limb0: 0x6a8e194198a83adeb7bb2d57, limb1: 0xdd72e054a7572ae9694e527b, limb2: 0x1e166b19fd03f8da, }, w3: u288 { limb0: 0x89955ac52e292b8ef51fee5b, limb1: 0xb4a02290d35f652e34e4160c, limb2: 0x25f5a19aec7507fc, }, w4: u288 { limb0: 0xfd26f66a7e8b7c9b65ccf82f, limb1: 0x885924961e16baba1430bbff, limb2: 0x340f95fa56b75d0, }, w5: u288 { limb0: 0xef273d28469f2f491bbcd40a, limb1: 0xe90efb0fe5cac233218f725e, limb2: 0x2270370eed956191, }, w6: u288 { limb0: 0xca9dcd949b9485cbb6caf5, limb1: 0xf042772fe0b0a8d9ca424d0d, limb2: 0x6d8cd4db60bffeb, }, w7: u288 { limb0: 0x62143619306fd7c0b3b08cc9, limb1: 0xe18c5df14640cc99bb874bd4, limb2: 0x1e30a97ba92bbad6, }, w8: u288 { limb0: 0x25f8c1f28cee5b135d48cdb6, limb1: 0x9acc1820c130cb285092986d, limb2: 0x2f167bb2de542dc7, }, w9: u288 { limb0: 0xdfd9bc4b5d951cf27288f3d8, limb1: 0x20e76c8c514cfc034e8cee6c, limb2: 0x8b4f5acd534d42, }, w10: u288 { limb0: 0x8e677eb53bf14698e8b36257, limb1: 0x9aea99485edddd73910e5d7b, limb2: 0x1973552b29e8f190, }, w11: u288 { limb0: 0xd5b7c92c3679269e6e89fe4d, limb1: 0x571711871632367838fd954f, limb2: 0xca34d2d34fc803f, }, }, E12D { w0: u288 { limb0: 0x5a115fd010369153e97447d6, limb1: 0x30bec73abe3a59b63e145fad, limb2: 0x13cad9f295161d7b, }, w1: u288 { limb0: 0xa241b367a81e2287bcb61b16, limb1: 0x46dcbe36594cfb18595a8f0, limb2: 0xab01b7e5df25989, }, w2: u288 { limb0: 0x958fca463d9bb5661f0b2fd9, limb1: 0xe06657821675ca026783130d, limb2: 0x59ffe9952b66fb9, }, w3: u288 { limb0: 0x574fb844c92111198355d520, limb1: 0xa14dab7a5284adcd16f40ce5, limb2: 0x1806c0e26ec0aee7, }, w4: u288 { limb0: 0xe7172a20883b7e788bde9782, limb1: 0xcf0a0721de528a49cb3dd1c4, limb2: 0x25972b2764f33320, }, w5: u288 { limb0: 0x731c250de9790bc763ae6475, limb1: 0x2a9161ea6cab27c57ed08479, limb2: 0xbba79ad176ebf3d, }, w6: u288 { limb0: 0x1883e2d532d070e92581f205, limb1: 0x3ee4f828dc142213ed8af967, limb2: 0x2e502ad8c56d0a28, }, w7: u288 { limb0: 0x5e8c5fa9891c0aba3c546e3b, limb1: 0xef69eec871a7317eb48f3c4c, limb2: 0x15527229b85df416, }, w8: u288 { limb0: 0xf9d9b27fb6982c16115b072a, limb1: 0x25855f7b17b4ab7d777c5a71, limb2: 0x17b488bbc4482f41, }, w9: u288 { limb0: 0xc8d3bb50e255913069e7e85a, limb1: 0x24471c0093ed7d60d8ec93fe, limb2: 0x1d25a04ef49a8340, }, w10: u288 { limb0: 0x8469405a54b25563e06b7556, limb1: 0x362aa168589a62d47f199abd, limb2: 0x144504d5e88c24cd, }, w11: u288 { limb0: 0x6ecf9040c554795e77fbc3d, limb1: 0xce3f520885d6702426c67484, limb2: 0x1729093a618f3459, }, }, E12D { w0: u288 { limb0: 0x4e76344718fef690a24dad4a, limb1: 0xc77cee5e9c5a4c63dcec6df, limb2: 0x2eabcc53f3044ba2, }, w1: u288 { limb0: 0xff72f26ff560d5c610868418, limb1: 0xcf976dd967e078f76ffa7f14, limb2: 0x2c4c3336767ab0f8, }, w2: u288 { limb0: 0x74290c1a859b6a664515c7ec, limb1: 0x4018fec3da718ea7ce725e7a, limb2: 0x2c0acbaf6d3dda8c, }, w3: u288 { limb0: 0x9e24330df30e289200970ddc, limb1: 0x2c7506954dfbab29debdcc33, limb2: 0x19e88e5ba2f32c9e, }, w4: u288 { limb0: 0x92b81688683664e49ad6c207, limb1: 0x950a1848e1e7bd3bee4e9648, limb2: 0x245fb841e1ea7f20, }, w5: u288 { limb0: 0xc0f5268607b5fb01ab981f8, limb1: 0x92b4bd8b0642eb9b8125e71e, limb2: 0x832b45514154898, }, w6: u288 { limb0: 0x18faa9f18edac485d6a7b190, limb1: 0xc374fb5ae398115c8cc5d4f, limb2: 0x1b89ed6497f7528b, }, w7: u288 { limb0: 0x60c6513ff564579e1988b356, limb1: 0x829048cc61af118a911e5195, limb2: 0x4b67c5750b2a6c8, }, w8: u288 { limb0: 0x2ad1d470e7cbba646712536d, limb1: 0xebf4f74cfd00385bc9700205, limb2: 0x21fb3b56977d6981, }, w9: u288 { limb0: 0xc193efe12433a6a7cd169fd5, limb1: 0x8e27c0d34ce21cff9d29399a, limb2: 0x132d71372731fcc8, }, w10: u288 { limb0: 0x556a4d23d4f86a177341b2e5, limb1: 0x383fea5b5626cc64d9e66b7a, limb2: 0x1ce052cbe93337d, }, w11: u288 { limb0: 0x4e56bc802b5abe09ee095df, limb1: 0x37fb83a829d63d38ea7fe544, limb2: 0x2b3dbc96d14de0ea, }, }, E12D { w0: u288 { limb0: 0x672f14cd0b10414f1a06ab0e, limb1: 0xbc03210758f55bd394a8677b, limb2: 0x1919a01fe8398d6e, }, w1: u288 { limb0: 0x994ec01c61f79b37735fb04e, limb1: 0x9f89038d35f704713d113e7c, limb2: 0x2fb067f3596c6f5d, }, w2: u288 { limb0: 0xc4db13525dd2ebf1798bc011, limb1: 0xd7f230dddfb10272addc3ac5, limb2: 0x129d55618745bdb6, }, w3: u288 { limb0: 0x4df6042036cc4e73caee7fd1, limb1: 0xf39bb2f57992a78b7f562caf, limb2: 0x10b637bffbf9e3b6, }, w4: u288 { limb0: 0xaf7ef004ea70cae206949fe0, limb1: 0x746537a320de6c4a8a3597ea, limb2: 0x2aaeaf029d031dc, }, w5: u288 { limb0: 0xc621594a078899f8c62a9cdb, limb1: 0x89e9884f3bf39f6476b7b0ea, limb2: 0x272b433fbcd53b5c, }, w6: u288 { limb0: 0xed69fdcb268caf1bf4e7be79, limb1: 0xd64e544332ba16059fbe6f21, limb2: 0x453884fd8055fc7, }, w7: u288 { limb0: 0xfcb53a4db14a035bb31b8e42, limb1: 0xcb56190ac6955b4789800190, limb2: 0x1948730c4a6d36a3, }, w8: u288 { limb0: 0xf71fef15f0a4caabc93864d4, limb1: 0x533dd6e3aef09b50136b0424, limb2: 0x26d7908e833342d0, }, w9: u288 { limb0: 0xa7702df86f4ffe60b5fcd8be, limb1: 0x82f85e85117830f257dc4449, limb2: 0x1beb171bf8d70197, }, w10: u288 { limb0: 0x31fc4912bfb5683fe07e25cb, limb1: 0xd283fd947a39cca9cf8bad14, limb2: 0x115ec5f3559e2fc, }, w11: u288 { limb0: 0xa9507d23f9e956aa9f5be47d, limb1: 0x20a327008223620fe131958e, limb2: 0x1e5fc15a15ef1efa, }, }, E12D { w0: u288 { limb0: 0x2a32729f621dc67e38a9e308, limb1: 0x3c7a4c38ab41463dd90d71e6, limb2: 0x164410a5de4f6a31, }, w1: u288 { limb0: 0x7c865da012acb0d622f3e6af, limb1: 0x6efcde33e8cb90fe34763281, limb2: 0x8bb58070cb757b0, }, w2: u288 { limb0: 0x102a4c45e1c7dc9a185096a6, limb1: 0x939ac06cca64b4059b650779, limb2: 0x18d0f097d8f27ead, }, w3: u288 { limb0: 0x5604d370b04f242174dfdc19, limb1: 0x3f2331ab9d6af28b81d598d7, limb2: 0x14096280fdb84ef2, }, w4: u288 { limb0: 0x4412fcdec6354f32bbfff8ab, limb1: 0xb2455bc4da7ee0be75af5185, limb2: 0x1a06f1d06514810a, }, w5: u288 { limb0: 0x5b518b0ce27ac5904af109d2, limb1: 0x505b8452fe08ea12e98c5709, limb2: 0xb8fe7b802f5d89a, }, w6: u288 { limb0: 0xd0c037f851034b765eed83e4, limb1: 0xb208cada98ad38bb65fa1eac, limb2: 0xad14e495078b750, }, w7: u288 { limb0: 0x27c34e9def3b3769635e71be, limb1: 0xb2ec25f739ecf7d9600f51a6, limb2: 0x2865787fdd12b638, }, w8: u288 { limb0: 0x639142ced19d81d2bb7fab2e, limb1: 0x7c2168110de34c92009b4685, limb2: 0x1c898a9a832e3d64, }, w9: u288 { limb0: 0x1f5eb66df1fdc41bf0ce081e, limb1: 0xafbc19ef146651ce2da77852, limb2: 0xe6eac8e4ccd9b71, }, w10: u288 { limb0: 0xf57e46ceab88a82e3a3f41c0, limb1: 0xb9c56b5c009ea3787342009, limb2: 0x2b02ef12c18f1e03, }, w11: u288 { limb0: 0xfb98309dd05609eb835a18ea, limb1: 0x831938e89a1a52e80f384288, limb2: 0x2f28355805f38fcd, }, }, E12D { w0: u288 { limb0: 0xbc95d451e65b0289c2f0d9f4, limb1: 0x29864b5c2006361c7ec32dbc, limb2: 0x231b97e42e88b4ff, }, w1: u288 { limb0: 0x4bc818c5e9f6ed62903ac570, limb1: 0xa6da69d8d95bf6c6529bfd2e, limb2: 0x9e56c349c350628, }, w2: u288 { limb0: 0xed520f5d2e7e426947558231, limb1: 0x407b04e8f131e18a83493135, limb2: 0xa24acdc96970f27, }, w3: u288 { limb0: 0x1d6c5e4e2aeea52567838f68, limb1: 0x3bdb301020d1702216efd42d, limb2: 0x2b59a5b8dcb0422b, }, w4: u288 { limb0: 0xf85e1201fcab94bada581d84, limb1: 0xe0efe6f4951ed52abf8b76af, limb2: 0xa6ae5af3e8d245c, }, w5: u288 { limb0: 0x51002d24f61e489d8c153193, limb1: 0xb32c323348563ffd15f5c33c, limb2: 0x26c4b2966b0b0244, }, w6: u288 { limb0: 0xb16e8f73703c8fc9cbe27a54, limb1: 0xe85c673315e3ff3bd80c385a, limb2: 0x1097084941caa56b, }, w7: u288 { limb0: 0x418c90f7a9ddb4b009516166, limb1: 0x6b3e04040348ba6064a95888, limb2: 0x1109803e56079bbf, }, w8: u288 { limb0: 0xfba73400ff9d91da0d4bb12f, limb1: 0xaa1955281d88ef0e24a3555b, limb2: 0x2eb930dc35c971e5, }, w9: u288 { limb0: 0x5cf265fa7a069ab0faf07634, limb1: 0x1fc2d713371237aca902f86b, limb2: 0x239dbccb24faaa, }, w10: u288 { limb0: 0x2b4f288428a4b9bbe4f2fa4c, limb1: 0x7623c03640928ed49d920ddf, limb2: 0x13201c25a3d33428, }, w11: u288 { limb0: 0x40775c9ff8a831905a097195, limb1: 0x26f944b86fd036f02e3194c7, limb2: 0x28d19be843b3ff3c, }, }, E12D { w0: u288 { limb0: 0x189cb16fa9189ecd4fbb9343, limb1: 0x3b0200dcdda749a4ac7badd1, limb2: 0x127325cd0676619e, }, w1: u288 { limb0: 0x69426bc4ac151ab78084bd46, limb1: 0x6ed73cc76b2e6866f2bb6e99, limb2: 0xa8a06bc3b26bf4d, }, w2: u288 { limb0: 0x773e7d09877a907af19e3b20, limb1: 0xceef25b4bf04c5319d48ec40, limb2: 0x1551ac68039dc2ff, }, w3: u288 { limb0: 0x5109ce5668e51d98d7e472da, limb1: 0x79997b0e4983fd2528c1da6, limb2: 0x47a2e7358f796cc, }, w4: u288 { limb0: 0xab89501874d5d5203a865933, limb1: 0xd17c5b1d843b9ac35877d3b7, limb2: 0x1b0b482637ee8296, }, w5: u288 { limb0: 0x2409320a513ccf12624ea83d, limb1: 0x4e71c7cafee4e2c6029411d3, limb2: 0x3f88321fd8d60cb, }, w6: u288 { limb0: 0xda33ccef60ef4ad0f7de09a4, limb1: 0x896d7cf80ee703d4a76ea589, limb2: 0x26c5d68117d6cd8b, }, w7: u288 { limb0: 0xaae41113d58ca2d0b98fdc40, limb1: 0xb2b5035495fad57c313b39c7, limb2: 0x2332fb21abcde1dc, }, w8: u288 { limb0: 0x2265477f67c8e381757e2444, limb1: 0xff72e21f4c00cdb8045fe56a, limb2: 0xe369c6ccb5e2670, }, w9: u288 { limb0: 0xa47c80b7062c0a20d48497b6, limb1: 0x89c328f7723a88bdc303660f, limb2: 0x233963ef5c38065c, }, w10: u288 { limb0: 0xeaee6b9ebb4333692353011d, limb1: 0xd5b4ec24d21d826b39675fc1, limb2: 0x1ddb842c4860ed55, }, w11: u288 { limb0: 0x905d5ae2cb91239753abae8b, limb1: 0xe05b3862330500c4e491581a, limb2: 0x2a0484f49430b2f4, }, }, E12D { w0: u288 { limb0: 0x322ea1fa72a31dba5d539d3c, limb1: 0x7a42a67f2be67efd3656ce90, limb2: 0x20b10c4394721d38, }, w1: u288 { limb0: 0x8d4223351a2c2e79c68f7016, limb1: 0x7780a8b63715a853e1637024, limb2: 0x4840a61778756f7, }, w2: u288 { limb0: 0xd33364f24b90b7283e555f03, limb1: 0x2725b6c80c1db189e6c6030f, limb2: 0xd0e44a0d823a67e, }, w3: u288 { limb0: 0x882366ae98da604af6b4b252, limb1: 0xb3c7302035df6f08fe1bb60f, limb2: 0x1a9eb767ddd9d0d, }, w4: u288 { limb0: 0xcfbe7c69e24937ff2679bd74, limb1: 0xa52b7b97b50a452b511dc5ec, limb2: 0x1b0e7a47140766b2, }, w5: u288 { limb0: 0x31951de26a27a91be138fa32, limb1: 0x47bc4f53494987139e77af9a, limb2: 0x1149a75ca93cba86, }, w6: u288 { limb0: 0x88cbc9cc41de5834f9fb4004, limb1: 0x5bb1bdd77409a1a3e8607b84, limb2: 0xcec6462b9b83783, }, w7: u288 { limb0: 0xe8cca50626729793c273633c, limb1: 0xa94a00b04453b3af1fcda1e7, limb2: 0xe304d8c44e2ad29, }, w8: u288 { limb0: 0x6d79c62f33ef542ee031b10b, limb1: 0xa853b8626dc0f8edc9dae8a2, limb2: 0x25a442e527fb55ae, }, w9: u288 { limb0: 0xb73c62448fcc061b7461540, limb1: 0xd36efa0f2e61f0bdf4f23d5e, limb2: 0x146329a5e06f73d8, }, w10: u288 { limb0: 0xa78188e4bc75e2262a094916, limb1: 0xe7126a1cbcb03e681a2f9eb0, limb2: 0x22b08cfb6cb34c00, }, w11: u288 { limb0: 0x93651f5e4cfcfd80ebae9e97, limb1: 0x2ad39d6d02435965ab528f04, limb2: 0x162d5418053965e7, }, }, ] .span(), big_Q: array![ u288 { limb0: 0x65737383940f52cb41c10526, limb1: 0xf877e2e11c81d1fe760106bd, limb2: 0x227bda5a9bc6a20e, }, u288 { limb0: 0x1b3e8afea54678452808b494, limb1: 0x9a314566b20243000ffffaeb, limb2: 0x2e7746007ddf67d0, }, u288 { limb0: 0x62312dca7c275ac579aa50b8, limb1: 0xf46480fdc504a9bfbbc4d484, limb2: 0x973352f03b73eb5, }, u288 { limb0: 0xf3e2a6ba0b03b85ba1a3d01f, limb1: 0xb75994964b34677afb4326c3, limb2: 0x2000dc479e26f767, }, u288 { limb0: 0xd28d9a9818914178a09ab2e1, limb1: 0x7c7bb2b2e8c6993ca5b22dfe, limb2: 0x2ace321a82a4946d, }, u288 { limb0: 0xe7618ac141da3f2a9cd88d4f, limb1: 0xc9e921b7c54826a2c05273f, limb2: 0xa0dbf3389c7693b, }, u288 { limb0: 0xd299bc32e8f8e3cfcf4a7951, limb1: 0xcc425bfa75ea83022df159f5, limb2: 0x2a0e7b987dcfc752, }, u288 { limb0: 0x5940490ce87cef6a1d683434, limb1: 0xf2a0bd534e512ab07f43dc60, limb2: 0x289b342909df402c, }, u288 { limb0: 0x4157b535898f4ac32665d693, limb1: 0x1294e90c8a878a83addcdeec, limb2: 0x111795c8e87e87e6, }, u288 { limb0: 0xf4946ecd90cbbe2a82d22192, limb1: 0x1673fe41abc7a1c647582820, limb2: 0x12c8712a6681aff, }, u288 { limb0: 0x58840247ec3072352a2436d8, limb1: 0xb9d1028c2ecf0ea62b75f040, limb2: 0xd9c766fe79efe29, }, u288 { limb0: 0x7a36509d8837f009f250638e, limb1: 0x39bd2832439963a5fabea7bb, limb2: 0x26b08d333be665a2, }, u288 { limb0: 0x27e8487adb1d7c397d6ae2ff, limb1: 0x84fc3e5163b8e8c4e1606423, limb2: 0x12587e73d6fc88de, }, u288 { limb0: 0x17d0cc1a1f014726c1756720, limb1: 0x4c49a0d2b899436dcfa60a17, limb2: 0x2031cb449bac71ef, }, u288 { limb0: 0xc1994b8b1ad7facc2b20714f, limb1: 0x408ad2da3c40c1583f435ced, limb2: 0x1cdd005343419923, }, u288 { limb0: 0x7192520798c7483048248305, limb1: 0x47570633706991802a32c541, limb2: 0xeff568c923639e3, }, u288 { limb0: 0xbbf35db39a27767feb832057, limb1: 0x203f23aa27600216bc8856ca, limb2: 0x2c2fd033052e757, }, u288 { limb0: 0xd3196cbda080a96247007100, limb1: 0x4eae81309fe277a7d0d0eb2a, limb2: 0x1dec8b9ced6b73be, }, u288 { limb0: 0xe3ea031455b3dcf3a338a2a5, limb1: 0x96a31cb6bed1b090796f17a2, limb2: 0x2d639fe20c5b7055, }, u288 { limb0: 0xfa5499dc15c57a673779365, limb1: 0x5319f9fbaed02e58712b4fab, limb2: 0x216a8d7703b5ea74, }, u288 { limb0: 0x6ca0334674fac04c4351fdb2, limb1: 0xa7ed5a4b9a39700c623a465a, limb2: 0x2af6b33e02766932, }, u288 { limb0: 0x16a300b622102f6ddfd50be4, limb1: 0x665bcea4feed0f376e68d6d7, limb2: 0x2e3bb074536f0017, }, u288 { limb0: 0x5276a15b47f6e6c42261ad6c, limb1: 0x62673ce1b21738a7ccd6d56d, limb2: 0x16ed04838657204f, }, u288 { limb0: 0xee7853338912309287f8739c, limb1: 0xefd280a5048adb0ba5462896, limb2: 0x27da826c28d92d30, }, u288 { limb0: 0xc34d441c21867dabc4b1f264, limb1: 0x5dcea75877acd6c5296b6ad5, limb2: 0x892c761d623cc04, }, u288 { limb0: 0xe9f90e469898a79f40614764, limb1: 0xc142083a1130f216ffc912d2, limb2: 0x21bb09e89928b149, }, u288 { limb0: 0x7e5bdcdfbe5ac4eb13de7dca, limb1: 0xeee19a6658e3624065afb9a6, limb2: 0x20bdf08dc3365687, }, u288 { limb0: 0xec25ba4c96690601d0b0f490, limb1: 0x6ec04fe5fe236f9bc9d64510, limb2: 0x266cf88c56925bd9, }, u288 { limb0: 0x7e121bd46267bfa3df513c05, limb1: 0xf9708c81d16338da715c13c9, limb2: 0x16c1954ab2f0af5b, }, u288 { limb0: 0xad5f27f54ace39f1cd84d321, limb1: 0x1fcb650aec6368640ea19142, limb2: 0x1eb87bfe0c5e61fa, }, u288 { limb0: 0x8e4316f2e2689a9e222e7a84, limb1: 0x3d4a1e12d7b67c84e7deca00, limb2: 0x2f029b5f06637f1, }, u288 { limb0: 0xa2b4163147fdc053aa030788, limb1: 0x85c25a982acbba90843f0416, limb2: 0x183c679f44c5be6d, }, u288 { limb0: 0x8db8d4b353d5981714045a8a, limb1: 0x1ace7b14c205a096179743dc, limb2: 0x1b0e7a4ac6f217b2, }, u288 { limb0: 0x95395ac90a6c97863f1e99c5, limb1: 0x122416857760cc28685f379c, limb2: 0x12b222ed222108a0, }, u288 { limb0: 0x7bf057670e0f97f68f41ac36, limb1: 0xa5149ce14da71f38eea56eae, limb2: 0x1265243bc3e2c5ea, }, u288 { limb0: 0x8418d3f7d98fe9987d89ff14, limb1: 0xfed069ffae0d9cb6a51a8a2f, limb2: 0x2a338413f6d3d270, }, u288 { limb0: 0x930982b0b2a2c2dd50b5fb41, limb1: 0xd02e2da9dc7699a6f64cbb9a, limb2: 0x2b8ffa317e3f1276, }, u288 { limb0: 0x84ddad0f9fbbfb45198e1eb6, limb1: 0x6c57e5b7ede33cb3a3d8c675, limb2: 0x2fb2f04dcf704896, }, u288 { limb0: 0xdad9472c14c10ca87c130d21, limb1: 0x35755bbc84d811a3e8e9ce70, limb2: 0xbcccd8d0f4d1423, }, u288 { limb0: 0x9170ab0a3e8284a1652685a, limb1: 0xb27161bf3a4bc605c5c6e394, limb2: 0xf6610847ddda1ee, }, u288 { limb0: 0xf2f95683561514b88e7077ea, limb1: 0xcc9a1d69042ff42dfd44c06e, limb2: 0x4a13455f13f8129, }, u288 { limb0: 0xe69dcd8cb1f8d892fc5b1de6, limb1: 0x5572c2eda4130dc648323493, limb2: 0x1f31b37597f56798, }, u288 { limb0: 0x3c77fb7eeeb2eccee412ce42, limb1: 0xa0084c8adaca1fbfd63e0e1a, limb2: 0x52a40914c24671c, }, u288 { limb0: 0x7d2b7da76474dad36585b7e7, limb1: 0x1856c12452f710321181642a, limb2: 0x301b940b1447d9d7, }, u288 { limb0: 0xeb5b4277911371980f0a8e0f, limb1: 0x72a0d5cc46fc87b1b904798c, limb2: 0x26179cf8bc651947, }, u288 { limb0: 0xc4454bdc9ed97d4d4cebac0d, limb1: 0x472c451a131eefcb9a20f2fa, limb2: 0x7167de917f08a21, }, u288 { limb0: 0x8d3ae2d5ae3a4e8ad956ebde, limb1: 0xefba75c073f4c61d864a44bb, limb2: 0x2e54b53dbc14f1ce, }, u288 { limb0: 0x21f168553a19be49d69a62cf, limb1: 0x22278eca7d66db2b705abc3, limb2: 0x2a412839bb20990b, }, u288 { limb0: 0x89bddbae4532b67868621489, limb1: 0xc24b8bc8442e69f7ba3f012e, limb2: 0x23a975b0b27d8919, }, u288 { limb0: 0xd1f53ffdd65c12f10925aa2a, limb1: 0xe25c1506b9f657ed30591141, limb2: 0x2e9d671126870c77, }, u288 { limb0: 0x9f2238288028f1a0a906e7f4, limb1: 0x256ee6b35d0d1307f4a96a06, limb2: 0x2a2873a5811be00, }, u288 { limb0: 0x5c721328e7855f7cd92461da, limb1: 0xe523939450d66f776a0d1d9a, limb2: 0x2733e21226a65f57, }, u288 { limb0: 0x9d49104a6082e6461b5251f3, limb1: 0x97f939c1674c3a77f8fd1c8a, limb2: 0x1b1ae367faf61893, }, u288 { limb0: 0x203697dd0f77fde667a1b8ff, limb1: 0x8d37ec43eed86d9edbeb144a, limb2: 0xe4ea7c7c2018303, }, u288 { limb0: 0x3989ece6a86c080321c59298, limb1: 0xdb5be74e7eac5d30a82687ce, limb2: 0x86b221dfe010f48, }, u288 { limb0: 0xe91073f8e8aec3dcb6339829, limb1: 0x5d0a659556a66c7faf3ccf21, limb2: 0x2d88336a3579f01f, }, u288 { limb0: 0xd0c992cadc60ce354bb942d9, limb1: 0xfd81dc22df69375ae81238c1, limb2: 0x2a7e860facc9ab07, }, u288 { limb0: 0x28b45bdd853dd5275b09dac9, limb1: 0x5fa3a187169c4e4a9a95e563, limb2: 0xc6488cce84dd457, }, u288 { limb0: 0x1af383d9a35d68787de29a9b, limb1: 0x41ae22353da6ee5bfbfc8cb3, limb2: 0x10032c451fac66f2, }, u288 { limb0: 0x9b0ba48929069d11e54d3a28, limb1: 0x94c838f8a6b82ae2a78f40e9, limb2: 0x2dd220670eefe0bc, }, u288 { limb0: 0x47aee8581eafe04a4d9bbe8, limb1: 0x881497fdf299664132dc1c07, limb2: 0xb48b5b90f9bfab0, }, u288 { limb0: 0xf9a38a2af8fd95bb7076182a, limb1: 0xc52749ed432931bab7f2c984, limb2: 0x1db740a2ed8d996e, }, u288 { limb0: 0x99501e686fd0c40a91d7339, limb1: 0x312713aa76ddf7899ec3be0e, limb2: 0xc2e45782111c9ec, }, u288 { limb0: 0x4b26aeea21ebea59eb45a277, limb1: 0xf7565927060460e6136894d6, limb2: 0x114c739f89f57783, }, u288 { limb0: 0xace0689de7241e39a8c5b741, limb1: 0xe5ec1dbd6be215989a022025, limb2: 0x15c9b8143d1b0459, }, u288 { limb0: 0x963a09b1a3be2d806d510987, limb1: 0x3ef22a80958e58c4e7a292e7, limb2: 0x1946197258afc02, }, u288 { limb0: 0x24928648fed6706ecbc49c01, limb1: 0x727fd4565aa57ef92a6847aa, limb2: 0xff86864724d1210, }, u288 { limb0: 0x11a8806083074e6f4b5333bc, limb1: 0xb7d18840bbd9d7a5fcac5b8a, limb2: 0xcd8f13cec101102, }, u288 { limb0: 0x2e4bb08279d7d379dfe755b2, limb1: 0xdfd2fa1b0bcb643e6899c4e0, limb2: 0x25d2897397289b6b, }, u288 { limb0: 0x4da2928a57e87b95cccb0606, limb1: 0xc826ac4d7d09d3541f02b690, limb2: 0x27024317b96d05e6, }, u288 { limb0: 0x21f7a234c2eca483bf63e97, limb1: 0x24ef5412bf566c923335cc65, limb2: 0x7e7a0567070412d, }, u288 { limb0: 0xfbcc1c256e4e4ea76d383599, limb1: 0xf8361521fd76d36c13f5f506, limb2: 0x225b98b21b4df6e, }, u288 { limb0: 0xec6979f93f3b0f212177704b, limb1: 0xe814bbf588b1a5123dc9bfae, limb2: 0x2e1e2b4af68bf630, }, u288 { limb0: 0xe156ff3ef47a782f39214b71, limb1: 0x219a2571471341f90450f81, limb2: 0x12e14004dc3b0bc, }, u288 { limb0: 0xe3b78487836c7a76d11c552c, limb1: 0xa26caa1fb963f8ac995ccfe9, limb2: 0x2def85303108814d, }, u288 { limb0: 0x993960bc2433b5dd9f376783, limb1: 0xe22bf6bff4f4d68da7ba3bf2, limb2: 0x10ec5d253a033584, }, u288 { limb0: 0xc91f7662afadb5fe56bc1204, limb1: 0x5e9e290047e612784d4ce7da, limb2: 0x20493df7e73c9196, }, u288 { limb0: 0x1f1249c2117de52d6a375e55, limb1: 0xe8d8f26caa81ab31192a8de9, limb2: 0xf6000293ab458a2, }, u288 { limb0: 0x67a3596196f7534ec359923f, limb1: 0xc05e84b28d399cbed93451ef, limb2: 0xf0f41b5cd3e66ac, }, u288 { limb0: 0xf01c7b113d1ef665738769f6, limb1: 0xc2072270705c535b08cc8b01, limb2: 0x20be8e10e1839dd, }, u288 { limb0: 0xf3c7417504cc5431edbddf69, limb1: 0xf38f5c163db628f2d66ac4c4, limb2: 0x1b623c118836b5d3, }, u288 { limb0: 0x698ed5ad549e485869420b2b, limb1: 0xe7bd25db6fdce6a19a93c3f5, limb2: 0x2302a5d85daf7b71, }, u288 { limb0: 0xe7aab79261f7f0936432d2fc, limb1: 0x85f5a2c4515978d4cc616978, limb2: 0x14688896bdcc620f, }, u288 { limb0: 0x6e8efdac8caea05377f67a60, limb1: 0x5f0ba3a9597f39c98ee70b29, limb2: 0x17d6a6de6b12ecb2, }, u288 { limb0: 0xfe224f039e8d7e6e2c3c3a73, limb1: 0x724cd3adc07ad7e9bcc4de70, limb2: 0x28b85c96eae71882, }, u288 { limb0: 0xd6b7d623500f22e1cd6d94e, limb1: 0x88682e65ca47af510f9629e6, limb2: 0x166bde77a6a4cd5, }, u288 { limb0: 0x4c8dbe4dda56d6d79118c47c, limb1: 0xaf23c3262ad453c47bbea1f9, limb2: 0xc2030a03f8c2e93, }, u288 { limb0: 0x5c56451a911c7475df12a87b, limb1: 0x4577a074de41ebed5149081c, limb2: 0x2d39c50207684dc4, }, u288 { limb0: 0x6d62d9a0fea7bfbf070f1b9c, limb1: 0x4483879e5ecdc3e6f8812593, limb2: 0x1075781151708126, }, u288 { limb0: 0xa16c617126712421b4b5b710, limb1: 0x50751b90a3e365b886b04617, limb2: 0x2b772e6c40aef488, }, u288 { limb0: 0xf24251c9552e54d41aff488c, limb1: 0x48a4c73b42d3a254d532212d, limb2: 0x2ebf160545b189f4, }, u288 { limb0: 0x18dd18e3728ba83abbdb93c6, limb1: 0xccbfeb55ef935c5d34424267, limb2: 0x6e88d6bf23145f9, }, u288 { limb0: 0xff96a29e81b676f30e4feed9, limb1: 0x8ce71c9c3ed3603df82b9616, limb2: 0x157edea68745c496, }, u288 { limb0: 0x2a847e87b3e55e1b8bad8a4e, limb1: 0x9fdfaf093751b0a93b2ef710, limb2: 0x176da02630c9ec63, }, u288 { limb0: 0x9fce3cee88000b812536c2b8, limb1: 0xb62aaeb06cfb6e41b21327e2, limb2: 0x1bfafb13dcbb30ac, }, u288 { limb0: 0x8ac628d91bfc5197e12e8f4b, limb1: 0x2d9d9c60e02b821f1e5c7080, limb2: 0x6e515c438d56f3b, }, u288 { limb0: 0xfcb74c9102b255b70b0b5318, limb1: 0xdeebbfb69a31f4660008dbb8, limb2: 0xc8b2d7406314c83, }, u288 { limb0: 0x62a47c1f65acc0d1ce233774, limb1: 0x7609ae2edbbbe51609ab180b, limb2: 0x363ae70a06cbfa3, }, u288 { limb0: 0x9e3d397bc9b81c8be9b7cfd8, limb1: 0xe0c4c9bf47c6ff5a90929303, limb2: 0x1dc25695b77d3691, }, u288 { limb0: 0xa06aa3e4e2291d2dfcae3775, limb1: 0x42aa7f7795410fbc95a339, limb2: 0x2297d4db99d2906b, }, u288 { limb0: 0xb655744c405a773d5b40b257, limb1: 0x8f0fd82f059bb162c5b2846f, limb2: 0x10e6484f8beea051, }, u288 { limb0: 0x14d7daf97828687c2d22980a, limb1: 0xb6f930d9108048fd2648f607, limb2: 0x2e00304eafbb8a51, }, u288 { limb0: 0xb2a700e4dc38a7d29da9994f, limb1: 0xba450072ae7efcd133857642, limb2: 0x1d515f53f3be4db2, }, u288 { limb0: 0x5811fb9edd7738b6670ed3f9, limb1: 0x761f9d119293c9c95cedb3db, limb2: 0xcec7cc48032b1dc, }, u288 { limb0: 0xaffb69a1a6a320aa053d25d9, limb1: 0xfaa4a45760ffdf2e0f74e70b, limb2: 0xea26f67002f8990, }, u288 { limb0: 0x9649c3ea51c372ab9baad2a8, limb1: 0x30c7e36f9b542795d00a328, limb2: 0x2c25e8eedafc696e, }, u288 { limb0: 0xa717c23cd1d18fbe615839a2, limb1: 0xfe6ec0991f95d579f569267f, limb2: 0x2c2f14ce0fea96b3, }, u288 { limb0: 0x68addc6917cd7b2a68d60e8b, limb1: 0xf3298ab850ab7615287a2a61, limb2: 0xddd18f560259d64, }, u288 { limb0: 0x166e15ff9e0eb53e72da2396, limb1: 0x406d31053934866d1bbab5a2, limb2: 0x1c7234f6e4d26970, }, u288 { limb0: 0x569c66127dd9957769b660fd, limb1: 0x273dbad8b1aa38de08b9f709, limb2: 0x6a76281eafe9599, }, u288 { limb0: 0x45cf087f8571c36ecaadd2a5, limb1: 0x463fda5b62a264b996947faa, limb2: 0x184c2f79cadf48a5, }, u288 { limb0: 0xee49cb77bfe6a700add0c1f2, limb1: 0x6d7dd7786657f9d054439451, limb2: 0x18b6c6c7049b5f50, }, u288 { limb0: 0x683b9997727b9a9e67c6471b, limb1: 0x8716f102d32c3ce725df8169, limb2: 0x111048345498a7a3, }, u288 { limb0: 0xc1bf5c3589496ab6d7595e46, limb1: 0xf007453ce629fcf20634dff1, limb2: 0x158c33f50d4b8116, }, u288 { limb0: 0xf7705b7b76a6c33bcd218968, limb1: 0x8319fe8b5dd4bb0fe9a7f86c, limb2: 0x9d1a1848abb76cb, }, u288 { limb0: 0xe126329ee21b76c790e81302, limb1: 0x9abbee7b21ea11a7ba796135, limb2: 0x106b34443f87265b, }, u288 { limb0: 0xcad4ede64aa9f7184a78da58, limb1: 0x195ccfcab97b6f2bc0af932c, limb2: 0xe6149e62bd9cd99, }, u288 { limb0: 0xfca6890b61e4ae37626aea9f, limb1: 0xefd7f6a4e50af11fbb574989, limb2: 0x2708074111d394f4, }, u288 { limb0: 0x3a5685f239bbb7516a9ce4f0, limb1: 0x9e27ca310f6eed7da9da0ae3, limb2: 0x856156f2344cd99, }, u288 { limb0: 0xdc860e4205aac0d4a119db7a, limb1: 0xcab98cf8c47fe661e5e51751, limb2: 0xa6b9ecbecc92920, }, u288 { limb0: 0x421f4f31e89cd635f715f0b2, limb1: 0xf7438c10f4292abac4911cb1, limb2: 0xca7cb6b53e66e2d, }, u288 { limb0: 0xff8730c83666f03b63c82e9a, limb1: 0xbf15a711d60434a18ad0b332, limb2: 0x1e4e0174abb3ff35, }, u288 { limb0: 0xddaa0774bd9d3400487b3332, limb1: 0xa47169b652481e69cdbd586, limb2: 0x1077eff1074d9cf8, }, u288 { limb0: 0xb9d99431843de1c6e03930cf, limb1: 0x48055c4caf106ecdba4ac34, limb2: 0x1d85593859c0a084, }, u288 { limb0: 0x4d70a2f8aadfaef4a1684fc3, limb1: 0x851a661cb719732bb10a8605, limb2: 0x77fb033385f4d55, }, u288 { limb0: 0xa8df36d7fc5dde16f2f92d30, limb1: 0x3828c87739f9975c4679f6e3, limb2: 0x1e49eba589ab9049, }, u288 { limb0: 0x8afb36ffc90cdfb2c394054c, limb1: 0x68e2f7def70b6b68fd976374, limb2: 0x14f9b073519d71ca, }, u288 { limb0: 0x537ea3eac7013cbef6144e1f, limb1: 0x237fb1851dbe67882d4d5c11, limb2: 0x11ebc5003e3b3263, }, u288 { limb0: 0xfcced309e1dd2f53c834728c, limb1: 0xf9516f53eecb333fc95a18e4, limb2: 0x29f5bbf3dd9109e3, }, u288 { limb0: 0x938889c1b734d1489d03cad1, limb1: 0x1db581687ac5c8a9a17ed553, limb2: 0x161ecb984fb856e3, }, u288 { limb0: 0xa268de500efb03f7bea07973, limb1: 0x6c4a37b98bad9ddb8cfbd6d0, limb2: 0x1524755288056cda, }, u288 { limb0: 0x7d4497670d42bbf1c2145bc9, limb1: 0x7abbbc4122653cc6ca902869, limb2: 0x261090fa8aee41bb, }, u288 { limb0: 0x151b2312dc16eaa91f70b86d, limb1: 0xdb244db1311f915d8c6552d1, limb2: 0xf78ff35f48b050e, }, u288 { limb0: 0x583a0c5dabf9c29cb843214e, limb1: 0xd11a9ac8a4d814eab40581, limb2: 0xa40191c26327e38, }, u288 { limb0: 0x42d106709fde0376b3baaf29, limb1: 0xeade8db6e8f2d9a0f908711a, limb2: 0x1bc9aa9ee2ecedc9, }, u288 { limb0: 0xb1e8bdc9ae134a052e65b82f, limb1: 0xe9a3b46a54f1aa42cc41f70d, limb2: 0x2a5ab4034d9620c8, }, u288 { limb0: 0x6cd32ed3f988bd665ae0c4ad, limb1: 0xdba8bd99a74f29cf958bbd93, limb2: 0x30211dca93e1d47e, }, u288 { limb0: 0x7c7eedd9922c46ad005dbc1d, limb1: 0xbef703824144548d2ec5d752, limb2: 0x1d6d3e4b54788235, }, u288 { limb0: 0x3bb2440fa67475f383044802, limb1: 0xe4557d5ab9325d4dbe872115, limb2: 0x672a865f51eb536, }, u288 { limb0: 0x2e915fc6800aa8adc2dc20c3, limb1: 0x46bd6375ff3d31847846dbc2, limb2: 0x2c9d928ee5f7e380, }, u288 { limb0: 0x886a5670bcf95b46c8f20ad9, limb1: 0x77ee46095f8543fad0b9cfc5, limb2: 0x3db727715156be8, }, u288 { limb0: 0xbae6bfa1ab50e3f01425a433, limb1: 0x47856f2553698328e4e579f0, limb2: 0x190d21e247afb41a, }, u288 { limb0: 0xa5d50f00f3e9814c6440dfab, limb1: 0xb6a91c5c710bd62ee2b58fb7, limb2: 0x21aef87938c717b1, }, u288 { limb0: 0xf470603734c27f99d0c0182f, limb1: 0x377ba5790ad04eb84bbd37eb, limb2: 0x1e8b05f3cfda0857, }, u288 { limb0: 0x77d147b35e8a28c9a8f59a25, limb1: 0x475d3713be9110798f8ea60e, limb2: 0xa54c2f08056d9a0, }, ], z: 0x7f997c7ceaaa93d340bc143f505f6d8423271960d6604ea8bf9d8c50dc40977, }; let res = multi_pairing_check_bn254_2P_2F(pair0, pair1, lines, hint); assert!(res.is_ok()); } #[test] fn test_BN254_mpcheck_3P_2F_with_extra_miller_loop_result() { let pair0: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { limb0: 0x5c724369afbc772d02aed58e, limb1: 0x2cd3bc838c66439a3d6160b, limb2: 0x72f26b55fb56be1, limb3: 0x0, }, y: u384 { limb0: 0x772ca79c580e121ca148fe75, limb1: 0xce2f55e418ca01b3d6d1014b, limb2: 0x2884b1dc4e84e30f, limb3: 0x0, }, }, q: G2Point { x0: u384 { limb0: 0xa30b422f34656d6c94e40be, limb1: 0x83069b5050fd7194c7e35d0c, limb2: 0xf0e8184945e8d34, limb3: 0x0, }, x1: u384 { limb0: 0xde9079ee8fa5e15901dfef27, limb1: 0xdb602cf367841e5047ffab14, limb2: 0x1752c7b6b35af45, limb3: 0x0, }, y0: u384 { limb0: 0x4dafbd7f615fd2aa9f5a0acc, limb1: 0x35c8bbffe201ffd56deb5dea, limb2: 0xa822a5ba029a283, limb3: 0x0, }, y1: u384 { limb0: 0xec6d9e4fafec17b8404c0341, limb1: 0x17fe961ad4b8ee3bf2ade626, limb2: 0x1228147f83e3ea5, limb3: 0x0, }, }, }; let pair1: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { limb0: 0x5c724369afbc772d02aed58e, limb1: 0x2cd3bc838c66439a3d6160b, limb2: 0x72f26b55fb56be1, limb3: 0x0, }, y: u384 { limb0: 0x772ca79c580e121ca148fe75, limb1: 0xce2f55e418ca01b3d6d1014b, limb2: 0x2884b1dc4e84e30f, limb3: 0x0, }, }, q: G2Point { x0: u384 { limb0: 0xa30b422f34656d6c94e40be, limb1: 0x83069b5050fd7194c7e35d0c, limb2: 0xf0e8184945e8d34, limb3: 0x0, }, x1: u384 { limb0: 0xde9079ee8fa5e15901dfef27, limb1: 0xdb602cf367841e5047ffab14, limb2: 0x1752c7b6b35af45, limb3: 0x0, }, y0: u384 { limb0: 0x4dafbd7f615fd2aa9f5a0acc, limb1: 0x35c8bbffe201ffd56deb5dea, limb2: 0xa822a5ba029a283, limb3: 0x0, }, y1: u384 { limb0: 0xec6d9e4fafec17b8404c0341, limb1: 0x17fe961ad4b8ee3bf2ade626, limb2: 0x1228147f83e3ea5, limb3: 0x0, }, }, }; let pair2: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { limb0: 0x5c724369afbc772d02aed58e, limb1: 0x2cd3bc838c66439a3d6160b, limb2: 0x72f26b55fb56be1, limb3: 0x0, }, y: u384 { limb0: 0x772ca79c580e121ca148fe75, limb1: 0xce2f55e418ca01b3d6d1014b, limb2: 0x2884b1dc4e84e30f, limb3: 0x0, }, }, q: G2Point { x0: u384 { limb0: 0xa30b422f34656d6c94e40be, limb1: 0x83069b5050fd7194c7e35d0c, limb2: 0xf0e8184945e8d34, limb3: 0x0, }, x1: u384 { limb0: 0xde9079ee8fa5e15901dfef27, limb1: 0xdb602cf367841e5047ffab14, limb2: 0x1752c7b6b35af45, limb3: 0x0, }, y0: u384 { limb0: 0x4dafbd7f615fd2aa9f5a0acc, limb1: 0x35c8bbffe201ffd56deb5dea, limb2: 0xa822a5ba029a283, limb3: 0x0, }, y1: u384 { limb0: 0xec6d9e4fafec17b8404c0341, limb1: 0x17fe961ad4b8ee3bf2ade626, limb2: 0x1228147f83e3ea5, limb3: 0x0, }, }, }; let precomputed_miller_loop_result = E12D { w0: u288 { limb0: 0xfaccb300f066ee143625434e, limb1: 0x12bfc53caae870d85457c4bc, limb2: 0x590ff61397d0dd2, }, w1: u288 { limb0: 0x3d74a2131fff08abcc77f5ff, limb1: 0xcc055f39a02506234d00e8eb, limb2: 0xf706ef44c1d0af1, }, w2: u288 { limb0: 0x4605464626791e8c2d23914a, limb1: 0x7da5ae6eba3609b9a258aeb5, limb2: 0x22a5875254921ffd, }, w3: u288 { limb0: 0xa36080e7d54da24b20b89bf4, limb1: 0x701510a38855b7b7bbcf7e5b, limb2: 0xae461e60176f9fc, }, w4: u288 { limb0: 0x310a2f82381041f00ab0a97b, limb1: 0x4ec0223c3dc06216c285cccb, limb2: 0xaae21f01619c3fa, }, w5: u288 { limb0: 0xa206b95ba090599b7a5e8c2e, limb1: 0xac945c0f61fb2673fb43b2aa, limb2: 0xe203da0f9a03b1a, }, w6: u288 { limb0: 0x280fda652c0775ee0202237c, limb1: 0x4ad4e2c546956c34ec381b30, limb2: 0x1e2de9ed7968cac1, }, w7: u288 { limb0: 0xdff110a40e2837285a53cdc9, limb1: 0x303a0db8cbb989aa911eec40, limb2: 0xf3b13b4d08af03, }, w8: u288 { limb0: 0x622927b875c780e6f64e6abe, limb1: 0xc79a5ba5d705c69b59a88b64, limb2: 0x242bd1109f659686, }, w9: u288 { limb0: 0x47a207ed1fe3501ee8a66a12, limb1: 0x92d2dc829a2f34f4ee684f04, limb2: 0x1f626f25b03417e4, }, w10: u288 { limb0: 0x9cf6ea1c727f2d3d16f4095b, limb1: 0xdca506524d7f4aeb8f093970, limb2: 0x234cc399b032b927, }, w11: u288 { limb0: 0xc04208d92713b2b39e39f93, limb1: 0x339c2266bcf3504782285acc, limb2: 0x8dd178fb6d5acd8, }, }; let lines = array![ G2Line { r0a0: u288 { limb0: 0x13fc2cd2d19c89caf55a13a8, limb1: 0x6a3f58c82d87f618a84e2bf0, limb2: 0x18b4a261a618f14c, }, r0a1: u288 { limb0: 0xa12d7217806e8da77076b27c, limb1: 0x868641e2c5440aefc45ec097, limb2: 0x21a23fb8ecb967b4, }, r1a0: u288 { limb0: 0x9c39813fffc4c7b20cc17a76, limb1: 0xf4a2427d51f32abb183e2860, limb2: 0x2687525f35660d8f, }, r1a1: u288 { limb0: 0xc039aad6d5de6af4f5c6c0bb, limb1: 0x3750d73ecbf7e1bca03d1cf2, limb2: 0xecbbbebf08974c8, }, }, G2Line { r0a0: u288 { limb0: 0x13fc2cd2d19c89caf55a13a8, limb1: 0x6a3f58c82d87f618a84e2bf0, limb2: 0x18b4a261a618f14c, }, r0a1: u288 { limb0: 0xa12d7217806e8da77076b27c, limb1: 0x868641e2c5440aefc45ec097, limb2: 0x21a23fb8ecb967b4, }, r1a0: u288 { limb0: 0x9c39813fffc4c7b20cc17a76, limb1: 0xf4a2427d51f32abb183e2860, limb2: 0x2687525f35660d8f, }, r1a1: u288 { limb0: 0xc039aad6d5de6af4f5c6c0bb, limb1: 0x3750d73ecbf7e1bca03d1cf2, limb2: 0xecbbbebf08974c8, }, }, G2Line { r0a0: u288 { limb0: 0x54759dba6a84024be322e99f, limb1: 0x4e10ecee53f96244ef333ea1, limb2: 0x17afac113b18aedd, }, r0a1: u288 { limb0: 0xc7445875bbb1fe6f68064acb, limb1: 0x31ca03d3bc3d4d6dd322a9f9, limb2: 0xec20eb9f4783875, }, r1a0: u288 { limb0: 0xcc38494d3c5bc464cbbb82d1, limb1: 0xc3ae03392f8e2da27f434230, limb2: 0x9dcfc13abcb9299, }, r1a1: u288 { limb0: 0xa8381fb666422121e2b63c8c, limb1: 0x80ff6e77b58976a0f7444d9e, limb2: 0x21989286f0a82b61, }, }, G2Line { r0a0: u288 { limb0: 0x52cd2431a88ef78ec482ce43, limb1: 0xdb994b0266c17f5e8dded89e, limb2: 0x107cd7f4d3a5c20f, }, r0a1: u288 { limb0: 0xb4e4c1a20d77277f1ecef6b, limb1: 0x3fc13dd5746446d4e724e645, limb2: 0x18ed3b584ac56dfe, }, r1a0: u288 { limb0: 0x3a537f5b220d3afddbd3be9d, limb1: 0xeddb087729b8776323c5b8ee, limb2: 0x1f5e5f61ae8c59e6, }, r1a1: u288 { limb0: 0x4fe2c98dc347d3ceb841acdf, limb1: 0xe6a7f4bdda3390e40c62a288, limb2: 0x2a277c878fe85394, }, }, G2Line { r0a0: u288 { limb0: 0x54759dba6a84024be322e99f, limb1: 0x4e10ecee53f96244ef333ea1, limb2: 0x17afac113b18aedd, }, r0a1: u288 { limb0: 0xc7445875bbb1fe6f68064acb, limb1: 0x31ca03d3bc3d4d6dd322a9f9, limb2: 0xec20eb9f4783875, }, r1a0: u288 { limb0: 0xcc38494d3c5bc464cbbb82d1, limb1: 0xc3ae03392f8e2da27f434230, limb2: 0x9dcfc13abcb9299, }, r1a1: u288 { limb0: 0xa8381fb666422121e2b63c8c, limb1: 0x80ff6e77b58976a0f7444d9e, limb2: 0x21989286f0a82b61, }, }, G2Line { r0a0: u288 { limb0: 0x52cd2431a88ef78ec482ce43, limb1: 0xdb994b0266c17f5e8dded89e, limb2: 0x107cd7f4d3a5c20f, }, r0a1: u288 { limb0: 0xb4e4c1a20d77277f1ecef6b, limb1: 0x3fc13dd5746446d4e724e645, limb2: 0x18ed3b584ac56dfe, }, r1a0: u288 { limb0: 0x3a537f5b220d3afddbd3be9d, limb1: 0xeddb087729b8776323c5b8ee, limb2: 0x1f5e5f61ae8c59e6, }, r1a1: u288 { limb0: 0x4fe2c98dc347d3ceb841acdf, limb1: 0xe6a7f4bdda3390e40c62a288, limb2: 0x2a277c878fe85394, }, }, G2Line { r0a0: u288 { limb0: 0x53e743cfae97f5f975cf49cd, limb1: 0x4a80ced31104872cc46b3fa6, limb2: 0x26af32e1e4b51233, }, r0a1: u288 { limb0: 0x20537276ce9b6d318ea2f567, limb1: 0xf0d44c7024c00ead73f13f53, limb2: 0x13e665e776128b92, }, r1a0: u288 { limb0: 0xad9a173a5d331f5e8221dedc, limb1: 0x11fc759697a8b7533cf8e7fd, limb2: 0x281514af188294d6, }, r1a1: u288 { limb0: 0xcd59e5219230c0937878feff, limb1: 0x85d1c954acb2bf4803a9e200, limb2: 0x4229bcd8d07f251, }, }, G2Line { r0a0: u288 { limb0: 0x53e743cfae97f5f975cf49cd, limb1: 0x4a80ced31104872cc46b3fa6, limb2: 0x26af32e1e4b51233, }, r0a1: u288 { limb0: 0x20537276ce9b6d318ea2f567, limb1: 0xf0d44c7024c00ead73f13f53, limb2: 0x13e665e776128b92, }, r1a0: u288 { limb0: 0xad9a173a5d331f5e8221dedc, limb1: 0x11fc759697a8b7533cf8e7fd, limb2: 0x281514af188294d6, }, r1a1: u288 { limb0: 0xcd59e5219230c0937878feff, limb1: 0x85d1c954acb2bf4803a9e200, limb2: 0x4229bcd8d07f251, }, }, G2Line { r0a0: u288 { limb0: 0xa4e9586d1e24c4e20dafd647, limb1: 0x7f88fb247cdc95b6010d9e1, limb2: 0x2fc2b7b6b4abaf58, }, r0a1: u288 { limb0: 0x9bbcc4481ffe859db49e1d98, limb1: 0x13be783da3c9bea06995338d, limb2: 0x2041db55312bcc8b, }, r1a0: u288 { limb0: 0x89721c899fdfd2776e1d4131, limb1: 0x602e0c14a55d62b055ca8113, limb2: 0x1fbed06b550ce696, }, r1a1: u288 { limb0: 0xfff5deaaf0a2cf3cca44de5c, limb1: 0xd5efcfc87d7bc3cc0d3d9be1, limb2: 0x18106453c47c63f5, }, }, G2Line { r0a0: u288 { limb0: 0x33720aad04d475cab632ceb4, limb1: 0xd7b4eef636fd40d7ad28aaf7, limb2: 0x25e952c734deb4a7, }, r0a1: u288 { limb0: 0x8c407e44689ce2ec6ea22bb3, limb1: 0x10ab4ebbd57974771a9bfe37, limb2: 0xc2d6b95efdcdb61, }, r1a0: u288 { limb0: 0xb03dd6a767461c482dcafa86, limb1: 0xbbde25f51257025e9a28974, limb2: 0x278e5fd00fb1b935, }, r1a1: u288 { limb0: 0x7bbd2c1bbf42867093a08f41, limb1: 0xcc4d5b03ab2a82a219b80b43, limb2: 0x2105554776d3cf89, }, }, G2Line { r0a0: u288 { limb0: 0xa4e9586d1e24c4e20dafd647, limb1: 0x7f88fb247cdc95b6010d9e1, limb2: 0x2fc2b7b6b4abaf58, }, r0a1: u288 { limb0: 0x9bbcc4481ffe859db49e1d98, limb1: 0x13be783da3c9bea06995338d, limb2: 0x2041db55312bcc8b, }, r1a0: u288 { limb0: 0x89721c899fdfd2776e1d4131, limb1: 0x602e0c14a55d62b055ca8113, limb2: 0x1fbed06b550ce696, }, r1a1: u288 { limb0: 0xfff5deaaf0a2cf3cca44de5c, limb1: 0xd5efcfc87d7bc3cc0d3d9be1, limb2: 0x18106453c47c63f5, }, }, G2Line { r0a0: u288 { limb0: 0x33720aad04d475cab632ceb4, limb1: 0xd7b4eef636fd40d7ad28aaf7, limb2: 0x25e952c734deb4a7, }, r0a1: u288 { limb0: 0x8c407e44689ce2ec6ea22bb3, limb1: 0x10ab4ebbd57974771a9bfe37, limb2: 0xc2d6b95efdcdb61, }, r1a0: u288 { limb0: 0xb03dd6a767461c482dcafa86, limb1: 0xbbde25f51257025e9a28974, limb2: 0x278e5fd00fb1b935, }, r1a1: u288 { limb0: 0x7bbd2c1bbf42867093a08f41, limb1: 0xcc4d5b03ab2a82a219b80b43, limb2: 0x2105554776d3cf89, }, }, G2Line { r0a0: u288 { limb0: 0x32e40fb4d2025cd0e82ced6f, limb1: 0xbc0608261a5f898f868a08d8, limb2: 0x282ba090b78fca30, }, r0a1: u288 { limb0: 0xdfe55dec41a63986c6aceff7, limb1: 0x2555dd47b4f4cd057f63d51, limb2: 0xf5a1242bc10ee1f, }, r1a0: u288 { limb0: 0x590c3a14f70d93710ad8d62d, limb1: 0x91b6b9b5a53eb9825ebe4230, limb2: 0x2f3c78d5b1a40d44, }, r1a1: u288 { limb0: 0x7fa2feee5a3d934393f3dcdb, limb1: 0x216af82d8ef724bef3a0cff9, limb2: 0x2a3b1b41079d39de, }, }, G2Line { r0a0: u288 { limb0: 0x32e40fb4d2025cd0e82ced6f, limb1: 0xbc0608261a5f898f868a08d8, limb2: 0x282ba090b78fca30, }, r0a1: u288 { limb0: 0xdfe55dec41a63986c6aceff7, limb1: 0x2555dd47b4f4cd057f63d51, limb2: 0xf5a1242bc10ee1f, }, r1a0: u288 { limb0: 0x590c3a14f70d93710ad8d62d, limb1: 0x91b6b9b5a53eb9825ebe4230, limb2: 0x2f3c78d5b1a40d44, }, r1a1: u288 { limb0: 0x7fa2feee5a3d934393f3dcdb, limb1: 0x216af82d8ef724bef3a0cff9, limb2: 0x2a3b1b41079d39de, }, }, G2Line { r0a0: u288 { limb0: 0x70f807c9bd9cc653569a88c0, limb1: 0xd3bd9e80a4c0879b8c54502f, limb2: 0x78f06a79ebcc122, }, r0a1: u288 { limb0: 0x1f4b6ad4455ba03d167d7fb3, limb1: 0xd11276f3c684ac26d1a62390, limb2: 0x2e376293ba7c79b7, }, r1a0: u288 { limb0: 0xe7a2888c80e82ed69b2c357d, limb1: 0xa5057b1db97b9c3edd232a43, limb2: 0x1eed211bc2e66931, }, r1a1: u288 { limb0: 0xaca29d5ef46c59744a30d2e, limb1: 0xfeb93f366d5295ce80bf592, limb2: 0x697b2aa97f68681, }, }, G2Line { r0a0: u288 { limb0: 0x70f807c9bd9cc653569a88c0, limb1: 0xd3bd9e80a4c0879b8c54502f, limb2: 0x78f06a79ebcc122, }, r0a1: u288 { limb0: 0x1f4b6ad4455ba03d167d7fb3, limb1: 0xd11276f3c684ac26d1a62390, limb2: 0x2e376293ba7c79b7, }, r1a0: u288 { limb0: 0xe7a2888c80e82ed69b2c357d, limb1: 0xa5057b1db97b9c3edd232a43, limb2: 0x1eed211bc2e66931, }, r1a1: u288 { limb0: 0xaca29d5ef46c59744a30d2e, limb1: 0xfeb93f366d5295ce80bf592, limb2: 0x697b2aa97f68681, }, }, G2Line { r0a0: u288 { limb0: 0x21c98846074d27fd948bf071, limb1: 0x2677e986de7a6bb799458f9, limb2: 0xbfae24b95db3021, }, r0a1: u288 { limb0: 0x241a18abd825d1d53b4b1cd1, limb1: 0x1153ff7044093f39311453e, limb2: 0x7ef5b22d955cb08, }, r1a0: u288 { limb0: 0xfde2d3f182c7404c916ddaee, limb1: 0x51059992e83a57e0357b63f3, limb2: 0x5de94c1a6dce11c, }, r1a1: u288 { limb0: 0xa897c205d1548b407d3c7597, limb1: 0x3e8437329ebf4e2f1fe3b370, limb2: 0x1e321d523b1a40f8, }, }, G2Line { r0a0: u288 { limb0: 0x21c98846074d27fd948bf071, limb1: 0x2677e986de7a6bb799458f9, limb2: 0xbfae24b95db3021, }, r0a1: u288 { limb0: 0x241a18abd825d1d53b4b1cd1, limb1: 0x1153ff7044093f39311453e, limb2: 0x7ef5b22d955cb08, }, r1a0: u288 { limb0: 0xfde2d3f182c7404c916ddaee, limb1: 0x51059992e83a57e0357b63f3, limb2: 0x5de94c1a6dce11c, }, r1a1: u288 { limb0: 0xa897c205d1548b407d3c7597, limb1: 0x3e8437329ebf4e2f1fe3b370, limb2: 0x1e321d523b1a40f8, }, }, G2Line { r0a0: u288 { limb0: 0x3b7c7dfdc0377c6e77a69a78, limb1: 0x56046802d2acc2048f6473b0, limb2: 0x1e538130528f2037, }, r0a1: u288 { limb0: 0xf8d9c38bafe394d496ec036b, limb1: 0xa7178b19843c74a1c9ffdec9, limb2: 0x754d38a41b241f5, }, r1a0: u288 { limb0: 0x5399cd6b03cd5dd0e202dc18, limb1: 0x27132b0286f70ab0f9d3f154, limb2: 0x209e0408c047ebf6, }, r1a1: u288 { limb0: 0xa73bf15125290077d6d0d018, limb1: 0xe07ebcc1ab67f9cf97be2e80, limb2: 0x217014f56f93c3a2, }, }, G2Line { r0a0: u288 { limb0: 0xb565c9168c2f34f5d1a48833, limb1: 0x9f2143f7ae3a47cffb1e8fda, limb2: 0xaebc823dc1fcd02, }, r0a1: u288 { limb0: 0x59b0e8a0118c2f5ec29f117b, limb1: 0xd1d302931406f12c6271f149, limb2: 0x18a65ecc25e7a0e3, }, r1a0: u288 { limb0: 0xcf4c8bcea64951980f866870, limb1: 0xd708dcd6450bd5f68bed09a3, limb2: 0xb3c0fa83c8b5f48, }, r1a1: u288 { limb0: 0xc45fac32b4b9fb37bdaea5f3, limb1: 0xc46068320849da30be837df5, limb2: 0x2c6ea62118c44345, }, }, G2Line { r0a0: u288 { limb0: 0x3b7c7dfdc0377c6e77a69a78, limb1: 0x56046802d2acc2048f6473b0, limb2: 0x1e538130528f2037, }, r0a1: u288 { limb0: 0xf8d9c38bafe394d496ec036b, limb1: 0xa7178b19843c74a1c9ffdec9, limb2: 0x754d38a41b241f5, }, r1a0: u288 { limb0: 0x5399cd6b03cd5dd0e202dc18, limb1: 0x27132b0286f70ab0f9d3f154, limb2: 0x209e0408c047ebf6, }, r1a1: u288 { limb0: 0xa73bf15125290077d6d0d018, limb1: 0xe07ebcc1ab67f9cf97be2e80, limb2: 0x217014f56f93c3a2, }, }, G2Line { r0a0: u288 { limb0: 0xb565c9168c2f34f5d1a48833, limb1: 0x9f2143f7ae3a47cffb1e8fda, limb2: 0xaebc823dc1fcd02, }, r0a1: u288 { limb0: 0x59b0e8a0118c2f5ec29f117b, limb1: 0xd1d302931406f12c6271f149, limb2: 0x18a65ecc25e7a0e3, }, r1a0: u288 { limb0: 0xcf4c8bcea64951980f866870, limb1: 0xd708dcd6450bd5f68bed09a3, limb2: 0xb3c0fa83c8b5f48, }, r1a1: u288 { limb0: 0xc45fac32b4b9fb37bdaea5f3, limb1: 0xc46068320849da30be837df5, limb2: 0x2c6ea62118c44345, }, }, G2Line { r0a0: u288 { limb0: 0x9611d44432206361cd7f3473, limb1: 0xd34ce79c946302bdbf8f72de, limb2: 0x1fd5b330038873b0, }, r0a1: u288 { limb0: 0x71a17fc89e530dda653c4220, limb1: 0x37852a7f67a5fa74c6613c00, limb2: 0x1e11dde6c5c9261d, }, r1a0: u288 { limb0: 0xf8f9c22149b11566f643511e, limb1: 0xeafd5e990baff3df753b4545, limb2: 0x2e3219be0c5ae36a, }, r1a1: u288 { limb0: 0x8e2193129c343cb3a4db1f47, limb1: 0xf56af697b4d714d190d603dd, limb2: 0x2d3349ba9a465783, }, }, G2Line { r0a0: u288 { limb0: 0x9611d44432206361cd7f3473, limb1: 0xd34ce79c946302bdbf8f72de, limb2: 0x1fd5b330038873b0, }, r0a1: u288 { limb0: 0x71a17fc89e530dda653c4220, limb1: 0x37852a7f67a5fa74c6613c00, limb2: 0x1e11dde6c5c9261d, }, r1a0: u288 { limb0: 0xf8f9c22149b11566f643511e, limb1: 0xeafd5e990baff3df753b4545, limb2: 0x2e3219be0c5ae36a, }, r1a1: u288 { limb0: 0x8e2193129c343cb3a4db1f47, limb1: 0xf56af697b4d714d190d603dd, limb2: 0x2d3349ba9a465783, }, }, G2Line { r0a0: u288 { limb0: 0x196665c03009ef576fd6961, limb1: 0x2719b6e1af31847d795deb9e, limb2: 0x155d054c2097ab50, }, r0a1: u288 { limb0: 0x4e6b687ca0dfecf549daeef5, limb1: 0xb4e4f54e1d35a5cd994c6054, limb2: 0x11c8b740bfbe502, }, r1a0: u288 { limb0: 0xbc9857a840b86d1d7ffb6b9d, limb1: 0x3315341c9d5a9ff2955435b2, limb2: 0x30447649e2f50c77, }, r1a1: u288 { limb0: 0x9a187f6cc5ad3146f48c70be, limb1: 0x9809e5f4637c60447e7cfdef, limb2: 0x667330690960cd, }, }, G2Line { r0a0: u288 { limb0: 0x215d0ebb801c8a2c8b0ef9e1, limb1: 0x89edb45dc7e6f74cc7304d78, limb2: 0x2edb9f6a4282ba3f, }, r0a1: u288 { limb0: 0x78cef612dbc9013e22395718, limb1: 0x68c8984791d65522cdabe9da, limb2: 0x5cd4d2fb36b3baf, }, r1a0: u288 { limb0: 0x28728de61873d65855d29e69, limb1: 0x74abfdede8c4f6d81e7da1bd, limb2: 0x199f58d62645184b, }, r1a1: u288 { limb0: 0xaff5645c427c1f808f890796, limb1: 0x6040d76177456d9ec3d7dd19, limb2: 0xdead02313d94e2c, }, }, G2Line { r0a0: u288 { limb0: 0x196665c03009ef576fd6961, limb1: 0x2719b6e1af31847d795deb9e, limb2: 0x155d054c2097ab50, }, r0a1: u288 { limb0: 0x4e6b687ca0dfecf549daeef5, limb1: 0xb4e4f54e1d35a5cd994c6054, limb2: 0x11c8b740bfbe502, }, r1a0: u288 { limb0: 0xbc9857a840b86d1d7ffb6b9d, limb1: 0x3315341c9d5a9ff2955435b2, limb2: 0x30447649e2f50c77, }, r1a1: u288 { limb0: 0x9a187f6cc5ad3146f48c70be, limb1: 0x9809e5f4637c60447e7cfdef, limb2: 0x667330690960cd, }, }, G2Line { r0a0: u288 { limb0: 0x215d0ebb801c8a2c8b0ef9e1, limb1: 0x89edb45dc7e6f74cc7304d78, limb2: 0x2edb9f6a4282ba3f, }, r0a1: u288 { limb0: 0x78cef612dbc9013e22395718, limb1: 0x68c8984791d65522cdabe9da, limb2: 0x5cd4d2fb36b3baf, }, r1a0: u288 { limb0: 0x28728de61873d65855d29e69, limb1: 0x74abfdede8c4f6d81e7da1bd, limb2: 0x199f58d62645184b, }, r1a1: u288 { limb0: 0xaff5645c427c1f808f890796, limb1: 0x6040d76177456d9ec3d7dd19, limb2: 0xdead02313d94e2c, }, }, G2Line { r0a0: u288 { limb0: 0x7e32624925ec3a6751ef2472, limb1: 0x454a7f1340778a7b5e1fe904, limb2: 0x20906f33c00c8d33, }, r0a1: u288 { limb0: 0x11710c1c383a8014976022cf, limb1: 0x62f932c9ffa1da884f9fceaa, limb2: 0xb62b0be184f4494, }, r1a0: u288 { limb0: 0xebd3310b943ec2f49ece0892, limb1: 0x6a06d1930900d0bbc6221220, limb2: 0x116715e97fb69aaa, }, r1a1: u288 { limb0: 0x1cc4a1667629f976c64db1fd, limb1: 0x965c2705725d60a7cc1550d2, limb2: 0x10a0fbe4d0a5883d, }, }, G2Line { r0a0: u288 { limb0: 0x7e32624925ec3a6751ef2472, limb1: 0x454a7f1340778a7b5e1fe904, limb2: 0x20906f33c00c8d33, }, r0a1: u288 { limb0: 0x11710c1c383a8014976022cf, limb1: 0x62f932c9ffa1da884f9fceaa, limb2: 0xb62b0be184f4494, }, r1a0: u288 { limb0: 0xebd3310b943ec2f49ece0892, limb1: 0x6a06d1930900d0bbc6221220, limb2: 0x116715e97fb69aaa, }, r1a1: u288 { limb0: 0x1cc4a1667629f976c64db1fd, limb1: 0x965c2705725d60a7cc1550d2, limb2: 0x10a0fbe4d0a5883d, }, }, G2Line { r0a0: u288 { limb0: 0xf29c8da48273fcc3ed42600f, limb1: 0xc9085080314ee52208dbeaa3, limb2: 0x1c97df69a5dee342, }, r0a1: u288 { limb0: 0xe90ffc7dc1134df60473a9b0, limb1: 0x1785bba891bbf8bf4d028c93, limb2: 0x2c73ffd5720b59fe, }, r1a0: u288 { limb0: 0xaa4625384e00cc7a1d26f59c, limb1: 0x7e2bd7ea82f7679164b9a298, limb2: 0x1ceb19ac1c28c731, }, r1a1: u288 { limb0: 0x8570cac2138c94f9d261d52, limb1: 0x4750472206e83d3ee38e9950, limb2: 0x159e78c2f8fb9e87, }, }, G2Line { r0a0: u288 { limb0: 0xf29c8da48273fcc3ed42600f, limb1: 0xc9085080314ee52208dbeaa3, limb2: 0x1c97df69a5dee342, }, r0a1: u288 { limb0: 0xe90ffc7dc1134df60473a9b0, limb1: 0x1785bba891bbf8bf4d028c93, limb2: 0x2c73ffd5720b59fe, }, r1a0: u288 { limb0: 0xaa4625384e00cc7a1d26f59c, limb1: 0x7e2bd7ea82f7679164b9a298, limb2: 0x1ceb19ac1c28c731, }, r1a1: u288 { limb0: 0x8570cac2138c94f9d261d52, limb1: 0x4750472206e83d3ee38e9950, limb2: 0x159e78c2f8fb9e87, }, }, G2Line { r0a0: u288 { limb0: 0xf0061f0ffdd6c080cb6db4f2, limb1: 0x3156ebb6ec8163f1daaf0fef, limb2: 0x16a1d8e8a632ecda, }, r0a1: u288 { limb0: 0x8944acaa1fea52aec014ca14, limb1: 0xaef310c4279054f6513952eb, limb2: 0x187dba91d42da551, }, r1a0: u288 { limb0: 0x115802cd86218654ef41231b, limb1: 0x6d01289ae998e8d09b1c7304, limb2: 0x8e3eaae865b5448, }, r1a1: u288 { limb0: 0x9562b590b59641ca26308faa, limb1: 0x75559bf6ea06aaf7df07c197, limb2: 0x8245163a7eeeada, }, }, G2Line { r0a0: u288 { limb0: 0xf0061f0ffdd6c080cb6db4f2, limb1: 0x3156ebb6ec8163f1daaf0fef, limb2: 0x16a1d8e8a632ecda, }, r0a1: u288 { limb0: 0x8944acaa1fea52aec014ca14, limb1: 0xaef310c4279054f6513952eb, limb2: 0x187dba91d42da551, }, r1a0: u288 { limb0: 0x115802cd86218654ef41231b, limb1: 0x6d01289ae998e8d09b1c7304, limb2: 0x8e3eaae865b5448, }, r1a1: u288 { limb0: 0x9562b590b59641ca26308faa, limb1: 0x75559bf6ea06aaf7df07c197, limb2: 0x8245163a7eeeada, }, }, G2Line { r0a0: u288 { limb0: 0x2cd350402831a212e938de81, limb1: 0xed9a7a80de5e1ec0f4b2c4db, limb2: 0x2f04e512c778c8a3, }, r0a1: u288 { limb0: 0x8cd4823620230108e89a1e94, limb1: 0x2dc2d1e59111f47e7663cb36, limb2: 0x8cbcece7fd20252, }, r1a0: u288 { limb0: 0x6bbf0471a8988b16ca947450, limb1: 0xf7911a0d3db83d1956cc277b, limb2: 0x7db791f07f93808, }, r1a1: u288 { limb0: 0xd46f340dfdea0b0bef63e487, limb1: 0xbd7520f6a22899dfe8887b8b, limb2: 0x10f9c9a88e425f37, }, }, G2Line { r0a0: u288 { limb0: 0x6e52232ec1b38ff612c0a492, limb1: 0x7839f69ef41e655aea744d38, limb2: 0x20ab9a05d7ad1f52, }, r0a1: u288 { limb0: 0x8bcdd6166e6ee552371e4636, limb1: 0x1db9fb889b69e26b47964933, limb2: 0x15c1b7b4dc794f53, }, r1a0: u288 { limb0: 0xdb2e4167ad301668392630d4, limb1: 0x78d41ddd629aa47464b2954, limb2: 0x122cf4989cd8fabc, }, r1a1: u288 { limb0: 0xd20b6faf7e40f5ceda0b861d, limb1: 0xaa5af5b00dbdc5f5712dc3bc, limb2: 0x447f15fd6766a8b, }, }, G2Line { r0a0: u288 { limb0: 0x2cd350402831a212e938de81, limb1: 0xed9a7a80de5e1ec0f4b2c4db, limb2: 0x2f04e512c778c8a3, }, r0a1: u288 { limb0: 0x8cd4823620230108e89a1e94, limb1: 0x2dc2d1e59111f47e7663cb36, limb2: 0x8cbcece7fd20252, }, r1a0: u288 { limb0: 0x6bbf0471a8988b16ca947450, limb1: 0xf7911a0d3db83d1956cc277b, limb2: 0x7db791f07f93808, }, r1a1: u288 { limb0: 0xd46f340dfdea0b0bef63e487, limb1: 0xbd7520f6a22899dfe8887b8b, limb2: 0x10f9c9a88e425f37, }, }, G2Line { r0a0: u288 { limb0: 0x6e52232ec1b38ff612c0a492, limb1: 0x7839f69ef41e655aea744d38, limb2: 0x20ab9a05d7ad1f52, }, r0a1: u288 { limb0: 0x8bcdd6166e6ee552371e4636, limb1: 0x1db9fb889b69e26b47964933, limb2: 0x15c1b7b4dc794f53, }, r1a0: u288 { limb0: 0xdb2e4167ad301668392630d4, limb1: 0x78d41ddd629aa47464b2954, limb2: 0x122cf4989cd8fabc, }, r1a1: u288 { limb0: 0xd20b6faf7e40f5ceda0b861d, limb1: 0xaa5af5b00dbdc5f5712dc3bc, limb2: 0x447f15fd6766a8b, }, }, G2Line { r0a0: u288 { limb0: 0x6411c143a41cb76ad19b3fe9, limb1: 0xa0a964f97d57b7b7db78d2bb, limb2: 0x2bf9110ff7c2fdb2, }, r0a1: u288 { limb0: 0xe183b2e52b5137dcbd33bcb9, limb1: 0xa82fec8a97ce059d24aa3b35, limb2: 0x19d11db2c569eece, }, r1a0: u288 { limb0: 0xcce8df3877331ae709ba92e, limb1: 0x77be8fc4e226cee90a7f955a, limb2: 0x1609775efcfbed68, }, r1a1: u288 { limb0: 0x39a8e985d0dad03eb162f6be, limb1: 0x6e34512435de4fa5a24bd9f1, limb2: 0x48ac1c32967705c, }, }, G2Line { r0a0: u288 { limb0: 0x6411c143a41cb76ad19b3fe9, limb1: 0xa0a964f97d57b7b7db78d2bb, limb2: 0x2bf9110ff7c2fdb2, }, r0a1: u288 { limb0: 0xe183b2e52b5137dcbd33bcb9, limb1: 0xa82fec8a97ce059d24aa3b35, limb2: 0x19d11db2c569eece, }, r1a0: u288 { limb0: 0xcce8df3877331ae709ba92e, limb1: 0x77be8fc4e226cee90a7f955a, limb2: 0x1609775efcfbed68, }, r1a1: u288 { limb0: 0x39a8e985d0dad03eb162f6be, limb1: 0x6e34512435de4fa5a24bd9f1, limb2: 0x48ac1c32967705c, }, }, G2Line { r0a0: u288 { limb0: 0x278415dcf736521423d0298, limb1: 0x55397f4f2d8ce7f19b570e77, limb2: 0x2a99b961769beca0, }, r0a1: u288 { limb0: 0xe29c48b2596ae6288dbb21a1, limb1: 0x9588bace99c7dd5849e0b5de, limb2: 0x266a6e7880114997, }, r1a0: u288 { limb0: 0x67864f025c9d20172d805f80, limb1: 0xf9b4700f91ec6d99a9fbabcc, limb2: 0x72e5c24a77ea6eb, }, r1a1: u288 { limb0: 0x71a14ab9325b2c9548564f04, limb1: 0xc2155e899962d27d2aa8947e, limb2: 0x60eb66c4c422714, }, }, G2Line { r0a0: u288 { limb0: 0x278415dcf736521423d0298, limb1: 0x55397f4f2d8ce7f19b570e77, limb2: 0x2a99b961769beca0, }, r0a1: u288 { limb0: 0xe29c48b2596ae6288dbb21a1, limb1: 0x9588bace99c7dd5849e0b5de, limb2: 0x266a6e7880114997, }, r1a0: u288 { limb0: 0x67864f025c9d20172d805f80, limb1: 0xf9b4700f91ec6d99a9fbabcc, limb2: 0x72e5c24a77ea6eb, }, r1a1: u288 { limb0: 0x71a14ab9325b2c9548564f04, limb1: 0xc2155e899962d27d2aa8947e, limb2: 0x60eb66c4c422714, }, }, G2Line { r0a0: u288 { limb0: 0x14d6ff22b6658a773bf98a76, limb1: 0x68581150a1ef5c63bc535636, limb2: 0x2e657f4210ad1c7f, }, r0a1: u288 { limb0: 0x7b86a06e863df1f55189a452, limb1: 0xebbdb11f75deaae91545eb38, limb2: 0x226b31e0c2e0506a, }, r1a0: u288 { limb0: 0x68adcad192fe0de39e37b0a9, limb1: 0xcd9ca0c35ee7a0d1b7f70eb0, limb2: 0x1c98b0667298ccde, }, r1a1: u288 { limb0: 0x803a0d1125f5fa7b64acaedc, limb1: 0xf2f903ea7789b90ca1596a30, limb2: 0x1864a718bd9a7a91, }, }, G2Line { r0a0: u288 { limb0: 0x64f25c9b7128e749ef25f105, limb1: 0xa5df6656e0fe3aa5e76219c, limb2: 0x10eefd3c4ed405d9, }, r0a1: u288 { limb0: 0x5cfdf017ce0e5290a9af8685, limb1: 0xfef7491b535ef1df815f8e9, limb2: 0x14736e677cde8946, }, r1a0: u288 { limb0: 0x105ce8ec6221751c0a741801, limb1: 0xc8a91f64511eb8ec67bd0a5e, limb2: 0x24b72e0bef64ca50, }, r1a1: u288 { limb0: 0x7b6d0c7da1f527d186f153f4, limb1: 0x3af4476ab8b4bf6bfaa284c4, limb2: 0x14fd84d626179073, }, }, G2Line { r0a0: u288 { limb0: 0x14d6ff22b6658a773bf98a76, limb1: 0x68581150a1ef5c63bc535636, limb2: 0x2e657f4210ad1c7f, }, r0a1: u288 { limb0: 0x7b86a06e863df1f55189a452, limb1: 0xebbdb11f75deaae91545eb38, limb2: 0x226b31e0c2e0506a, }, r1a0: u288 { limb0: 0x68adcad192fe0de39e37b0a9, limb1: 0xcd9ca0c35ee7a0d1b7f70eb0, limb2: 0x1c98b0667298ccde, }, r1a1: u288 { limb0: 0x803a0d1125f5fa7b64acaedc, limb1: 0xf2f903ea7789b90ca1596a30, limb2: 0x1864a718bd9a7a91, }, }, G2Line { r0a0: u288 { limb0: 0x64f25c9b7128e749ef25f105, limb1: 0xa5df6656e0fe3aa5e76219c, limb2: 0x10eefd3c4ed405d9, }, r0a1: u288 { limb0: 0x5cfdf017ce0e5290a9af8685, limb1: 0xfef7491b535ef1df815f8e9, limb2: 0x14736e677cde8946, }, r1a0: u288 { limb0: 0x105ce8ec6221751c0a741801, limb1: 0xc8a91f64511eb8ec67bd0a5e, limb2: 0x24b72e0bef64ca50, }, r1a1: u288 { limb0: 0x7b6d0c7da1f527d186f153f4, limb1: 0x3af4476ab8b4bf6bfaa284c4, limb2: 0x14fd84d626179073, }, }, G2Line { r0a0: u288 { limb0: 0x95531ad3030b96d815ffc130, limb1: 0x3e57484f7c4a6080aeeb5389, limb2: 0x258e31db306db347, }, r0a1: u288 { limb0: 0x9083b01855e312eac6d42b37, limb1: 0x2345be89c9e05ddcaca68d44, limb2: 0x23c9dd3674d542b2, }, r1a0: u288 { limb0: 0xc79418d3ebbe74ae9a0dfa4, limb1: 0x14b66f0d16a1c604533cf0d6, limb2: 0x3acddc2145f3eec, }, r1a1: u288 { limb0: 0x1288e3b3be0ac21711e0f760, limb1: 0xd0bc22f88b8051ffc112590a, limb2: 0xdd5bdbb302158c1, }, }, G2Line { r0a0: u288 { limb0: 0xdf325bffc4f75bde16339c21, limb1: 0x59e1b11a922fd25b46da34ad, limb2: 0x1df431a8b518c319, }, r0a1: u288 { limb0: 0xa34e525fbce9d573f316a8e1, limb1: 0x5715c100bd0d4bc47e1199aa, limb2: 0x111fd4d9fe3f4aa8, }, r1a0: u288 { limb0: 0x4ddeb02cca8556d49bb4d13b, limb1: 0x56b8e64426fbb6983377fe9f, limb2: 0x166b7c9a7bb6eb74, }, r1a1: u288 { limb0: 0x8ef5c3ef69254a68b5ffcf4d, limb1: 0xd6eaa92d6814c39953c833ca, limb2: 0x8cda70783ba41fc, }, }, G2Line { r0a0: u288 { limb0: 0x95531ad3030b96d815ffc130, limb1: 0x3e57484f7c4a6080aeeb5389, limb2: 0x258e31db306db347, }, r0a1: u288 { limb0: 0x9083b01855e312eac6d42b37, limb1: 0x2345be89c9e05ddcaca68d44, limb2: 0x23c9dd3674d542b2, }, r1a0: u288 { limb0: 0xc79418d3ebbe74ae9a0dfa4, limb1: 0x14b66f0d16a1c604533cf0d6, limb2: 0x3acddc2145f3eec, }, r1a1: u288 { limb0: 0x1288e3b3be0ac21711e0f760, limb1: 0xd0bc22f88b8051ffc112590a, limb2: 0xdd5bdbb302158c1, }, }, G2Line { r0a0: u288 { limb0: 0xdf325bffc4f75bde16339c21, limb1: 0x59e1b11a922fd25b46da34ad, limb2: 0x1df431a8b518c319, }, r0a1: u288 { limb0: 0xa34e525fbce9d573f316a8e1, limb1: 0x5715c100bd0d4bc47e1199aa, limb2: 0x111fd4d9fe3f4aa8, }, r1a0: u288 { limb0: 0x4ddeb02cca8556d49bb4d13b, limb1: 0x56b8e64426fbb6983377fe9f, limb2: 0x166b7c9a7bb6eb74, }, r1a1: u288 { limb0: 0x8ef5c3ef69254a68b5ffcf4d, limb1: 0xd6eaa92d6814c39953c833ca, limb2: 0x8cda70783ba41fc, }, }, G2Line { r0a0: u288 { limb0: 0x4e44a9b72f424336295cd2d4, limb1: 0xe43008eebda999077f586dd0, limb2: 0x2833eade2a41fefe, }, r0a1: u288 { limb0: 0xa23faf119ba1e712eaa2ad9d, limb1: 0xffd42ca54f7c46f0e5dd7375, limb2: 0x14f3d66f92191f3d, }, r1a0: u288 { limb0: 0xde664b9a5bb68f83b166d13f, limb1: 0x504eada56a1604828ac250aa, limb2: 0x1a59ac93ced3882, }, r1a1: u288 { limb0: 0x57e2ca35f761f0a43dca1cf5, limb1: 0x9d1dae4b976d26ff058b20f6, limb2: 0x27083f11525f853e, }, }, G2Line { r0a0: u288 { limb0: 0x4e44a9b72f424336295cd2d4, limb1: 0xe43008eebda999077f586dd0, limb2: 0x2833eade2a41fefe, }, r0a1: u288 { limb0: 0xa23faf119ba1e712eaa2ad9d, limb1: 0xffd42ca54f7c46f0e5dd7375, limb2: 0x14f3d66f92191f3d, }, r1a0: u288 { limb0: 0xde664b9a5bb68f83b166d13f, limb1: 0x504eada56a1604828ac250aa, limb2: 0x1a59ac93ced3882, }, r1a1: u288 { limb0: 0x57e2ca35f761f0a43dca1cf5, limb1: 0x9d1dae4b976d26ff058b20f6, limb2: 0x27083f11525f853e, }, }, G2Line { r0a0: u288 { limb0: 0xacffdc27d3923f5779c9f561, limb1: 0x6acc5c81d640b06edf8669e7, limb2: 0x23d3ecf6cd5ae000, }, r0a1: u288 { limb0: 0xc576257e34519bcbfe12a0e5, limb1: 0x6dfda810453128aa1b9ff5f3, limb2: 0x272b3f6cde8f6f3d, }, r1a0: u288 { limb0: 0x3314182b61b3a1153d51085c, limb1: 0x78d944875a2068000dc27e73, limb2: 0x2184b9ce45b284ff, }, r1a1: u288 { limb0: 0xa3831da9efe63936fe510a88, limb1: 0xd853b46a2f7648744b5bbcea, limb2: 0x2437a9f7f5559f66, }, }, G2Line { r0a0: u288 { limb0: 0xacffdc27d3923f5779c9f561, limb1: 0x6acc5c81d640b06edf8669e7, limb2: 0x23d3ecf6cd5ae000, }, r0a1: u288 { limb0: 0xc576257e34519bcbfe12a0e5, limb1: 0x6dfda810453128aa1b9ff5f3, limb2: 0x272b3f6cde8f6f3d, }, r1a0: u288 { limb0: 0x3314182b61b3a1153d51085c, limb1: 0x78d944875a2068000dc27e73, limb2: 0x2184b9ce45b284ff, }, r1a1: u288 { limb0: 0xa3831da9efe63936fe510a88, limb1: 0xd853b46a2f7648744b5bbcea, limb2: 0x2437a9f7f5559f66, }, }, G2Line { r0a0: u288 { limb0: 0x373d78cacc3a213ab7a5dc77, limb1: 0x2c4c9295f1b3e767a376d95a, limb2: 0x6fa8606535c131, }, r0a1: u288 { limb0: 0x7a037d066e3015f12b9bb899, limb1: 0x2df06eb9be7dd1d34dd0ce6e, limb2: 0x2bfecfb6faa40681, }, r1a0: u288 { limb0: 0x767f84f556bc0e82acc4c2fc, limb1: 0xdc285959286fe86c69fd09c6, limb2: 0xddf35d64e052591, }, r1a1: u288 { limb0: 0xba3bf8a2a744c4be716d10a3, limb1: 0x704558fde5a2dd4610092a58, limb2: 0x24381fac38d1c2f4, }, }, G2Line { r0a0: u288 { limb0: 0x8bfb882fe3e87bf7f06a534, limb1: 0x60e74ba16f35b38925253fa1, limb2: 0x105952dd8d3cb0fb, }, r0a1: u288 { limb0: 0x86a65a5ae488b0d28900cf53, limb1: 0x4fca5c6edee392882c778363, limb2: 0x160b4e8a7969f551, }, r1a0: u288 { limb0: 0x7b126c951fa4afc0c2ebda0c, limb1: 0x85834d2eff18413563bf9144, limb2: 0x8f905b15b3b2add, }, r1a1: u288 { limb0: 0xa595d6853747f798b16d2eca, limb1: 0x42d7941f6581b069059ed186, limb2: 0x2eb502b9a9b7169b, }, }, G2Line { r0a0: u288 { limb0: 0x373d78cacc3a213ab7a5dc77, limb1: 0x2c4c9295f1b3e767a376d95a, limb2: 0x6fa8606535c131, }, r0a1: u288 { limb0: 0x7a037d066e3015f12b9bb899, limb1: 0x2df06eb9be7dd1d34dd0ce6e, limb2: 0x2bfecfb6faa40681, }, r1a0: u288 { limb0: 0x767f84f556bc0e82acc4c2fc, limb1: 0xdc285959286fe86c69fd09c6, limb2: 0xddf35d64e052591, }, r1a1: u288 { limb0: 0xba3bf8a2a744c4be716d10a3, limb1: 0x704558fde5a2dd4610092a58, limb2: 0x24381fac38d1c2f4, }, }, G2Line { r0a0: u288 { limb0: 0x8bfb882fe3e87bf7f06a534, limb1: 0x60e74ba16f35b38925253fa1, limb2: 0x105952dd8d3cb0fb, }, r0a1: u288 { limb0: 0x86a65a5ae488b0d28900cf53, limb1: 0x4fca5c6edee392882c778363, limb2: 0x160b4e8a7969f551, }, r1a0: u288 { limb0: 0x7b126c951fa4afc0c2ebda0c, limb1: 0x85834d2eff18413563bf9144, limb2: 0x8f905b15b3b2add, }, r1a1: u288 { limb0: 0xa595d6853747f798b16d2eca, limb1: 0x42d7941f6581b069059ed186, limb2: 0x2eb502b9a9b7169b, }, }, G2Line { r0a0: u288 { limb0: 0xe6dbfdaa4aaed35ae46b7e36, limb1: 0x954a32448a2c26964f83e2ff, limb2: 0x23fe11d86de21bf3, }, r0a1: u288 { limb0: 0x390ec78bb0c63fea5a5112ca, limb1: 0x5eaba420296488bd9ad78ba4, limb2: 0x179a2336d20f9552, }, r1a0: u288 { limb0: 0x451d421ca57949d9274eaee9, limb1: 0xd85aee99f3f7b33bdddf1b37, limb2: 0x1b83c0b80546357d, }, r1a1: u288 { limb0: 0x94c9276300f21460bd558c41, limb1: 0x89efceec3bb694f4c41487d3, limb2: 0x44375dd912e436b, }, }, G2Line { r0a0: u288 { limb0: 0xe6dbfdaa4aaed35ae46b7e36, limb1: 0x954a32448a2c26964f83e2ff, limb2: 0x23fe11d86de21bf3, }, r0a1: u288 { limb0: 0x390ec78bb0c63fea5a5112ca, limb1: 0x5eaba420296488bd9ad78ba4, limb2: 0x179a2336d20f9552, }, r1a0: u288 { limb0: 0x451d421ca57949d9274eaee9, limb1: 0xd85aee99f3f7b33bdddf1b37, limb2: 0x1b83c0b80546357d, }, r1a1: u288 { limb0: 0x94c9276300f21460bd558c41, limb1: 0x89efceec3bb694f4c41487d3, limb2: 0x44375dd912e436b, }, }, G2Line { r0a0: u288 { limb0: 0x90c98d8d59246f7ac71cbc7, limb1: 0x603dd0e0dd09fb8ad13dbbb, limb2: 0x1d068d315771a3c1, }, r0a1: u288 { limb0: 0x2bb3f34aa59b0e052ec56b80, limb1: 0xb239e8dca49685c638327d9e, limb2: 0x11e46c1f8395f739, }, r1a0: u288 { limb0: 0x2f114895453b5cf23b04678c, limb1: 0x99cdbda7fef0644b67d48e85, limb2: 0x6d8bc66cf89ee21, }, r1a1: u288 { limb0: 0x903c6ead9a344fceaab2dd24, limb1: 0x97063cfc1096d628d7979e2c, limb2: 0x49f8c496be2ccd4, }, }, G2Line { r0a0: u288 { limb0: 0x90c98d8d59246f7ac71cbc7, limb1: 0x603dd0e0dd09fb8ad13dbbb, limb2: 0x1d068d315771a3c1, }, r0a1: u288 { limb0: 0x2bb3f34aa59b0e052ec56b80, limb1: 0xb239e8dca49685c638327d9e, limb2: 0x11e46c1f8395f739, }, r1a0: u288 { limb0: 0x2f114895453b5cf23b04678c, limb1: 0x99cdbda7fef0644b67d48e85, limb2: 0x6d8bc66cf89ee21, }, r1a1: u288 { limb0: 0x903c6ead9a344fceaab2dd24, limb1: 0x97063cfc1096d628d7979e2c, limb2: 0x49f8c496be2ccd4, }, }, G2Line { r0a0: u288 { limb0: 0x3778e71e52e9cd8a2efaae30, limb1: 0x1510f4be21ae0d4ce4e9c407, limb2: 0x87f2c39614ed514, }, r0a1: u288 { limb0: 0x9425b553c85be9f8eab4827e, limb1: 0xd75d6f1a6013f310d81e5f6e, limb2: 0x188c2e53470ad6dc, }, r1a0: u288 { limb0: 0xd6715a5f7fb9d3f64160e303, limb1: 0xfb0e7cb89f7e8c3908e859f9, limb2: 0x84f3df13ca3d149, }, r1a1: u288 { limb0: 0xea46b6a8dbd35d5c7098c283, limb1: 0xff4f98d6447bac1d056ea3b3, limb2: 0xd6d18364b06a02c, }, }, G2Line { r0a0: u288 { limb0: 0x3778e71e52e9cd8a2efaae30, limb1: 0x1510f4be21ae0d4ce4e9c407, limb2: 0x87f2c39614ed514, }, r0a1: u288 { limb0: 0x9425b553c85be9f8eab4827e, limb1: 0xd75d6f1a6013f310d81e5f6e, limb2: 0x188c2e53470ad6dc, }, r1a0: u288 { limb0: 0xd6715a5f7fb9d3f64160e303, limb1: 0xfb0e7cb89f7e8c3908e859f9, limb2: 0x84f3df13ca3d149, }, r1a1: u288 { limb0: 0xea46b6a8dbd35d5c7098c283, limb1: 0xff4f98d6447bac1d056ea3b3, limb2: 0xd6d18364b06a02c, }, }, G2Line { r0a0: u288 { limb0: 0x6f6d3e211d26957a67f263c, limb1: 0x8da5874752e96d222d666c7e, limb2: 0x266336ff63f6cae, }, r0a1: u288 { limb0: 0xb3b8c3099016c6a6814524b4, limb1: 0x4b7c12934d9309f8cb6fe11, limb2: 0x24a297917e6d2286, }, r1a0: u288 { limb0: 0x29f2516e3c81dc23beb0b4a5, limb1: 0x66af1f7514ccca035bf4bd08, limb2: 0x1c93fbb41c5a080f, }, r1a1: u288 { limb0: 0x1d9a69028cdcd85247c47085, limb1: 0xca54eb95e7fb935d08e1e49, limb2: 0x25c558909e8ce210, }, }, G2Line { r0a0: u288 { limb0: 0x6f6d3e211d26957a67f263c, limb1: 0x8da5874752e96d222d666c7e, limb2: 0x266336ff63f6cae, }, r0a1: u288 { limb0: 0xb3b8c3099016c6a6814524b4, limb1: 0x4b7c12934d9309f8cb6fe11, limb2: 0x24a297917e6d2286, }, r1a0: u288 { limb0: 0x29f2516e3c81dc23beb0b4a5, limb1: 0x66af1f7514ccca035bf4bd08, limb2: 0x1c93fbb41c5a080f, }, r1a1: u288 { limb0: 0x1d9a69028cdcd85247c47085, limb1: 0xca54eb95e7fb935d08e1e49, limb2: 0x25c558909e8ce210, }, }, G2Line { r0a0: u288 { limb0: 0xa2877a17d6822fdbec0a419a, limb1: 0xff617440635bbeae917acf03, limb2: 0x302aa8c0c25edf9c, }, r0a1: u288 { limb0: 0xa0509fbe6fedb1a1d6bc0fa0, limb1: 0xb6f674c844db3046d0228a67, limb2: 0x275d1093fe789296, }, r1a0: u288 { limb0: 0x252b1469a10bf6c0e8441f2e, limb1: 0xe3f275f7dc0d10062fa24067, limb2: 0x5938d22b9b86d1f, }, r1a1: u288 { limb0: 0xfb5f636c62c36f78c5062f30, limb1: 0x150a99ab14007914780e49f1, limb2: 0x9e0bccb105b14f4, }, }, G2Line { r0a0: u288 { limb0: 0xa2877a17d6822fdbec0a419a, limb1: 0xff617440635bbeae917acf03, limb2: 0x302aa8c0c25edf9c, }, r0a1: u288 { limb0: 0xa0509fbe6fedb1a1d6bc0fa0, limb1: 0xb6f674c844db3046d0228a67, limb2: 0x275d1093fe789296, }, r1a0: u288 { limb0: 0x252b1469a10bf6c0e8441f2e, limb1: 0xe3f275f7dc0d10062fa24067, limb2: 0x5938d22b9b86d1f, }, r1a1: u288 { limb0: 0xfb5f636c62c36f78c5062f30, limb1: 0x150a99ab14007914780e49f1, limb2: 0x9e0bccb105b14f4, }, }, G2Line { r0a0: u288 { limb0: 0xc5eaebad6bd5beb92e09aade, limb1: 0xcbd48c7eb96beac635eddee1, limb2: 0x6b94aae5ea30073, }, r0a1: u288 { limb0: 0x882af1093bd174803a58f378, limb1: 0x9ec588e092fc5b155ebeec2e, limb2: 0x1ca1957381eeeaf6, }, r1a0: u288 { limb0: 0x85f75492a545f601ebdaeca3, limb1: 0xb76104e8575174401e8c88d3, limb2: 0x2f386789cd7045e0, }, r1a1: u288 { limb0: 0x21695ebadab2d91e4fdb6459, limb1: 0x76f7be32767094c83713ad27, limb2: 0x11f63fe7a6d180b6, }, }, G2Line { r0a0: u288 { limb0: 0xbff947921ed15906d7d1a15d, limb1: 0x801c1b9c79563f2e5bce21e1, limb2: 0x956f2ac3e4fe88a, }, r0a1: u288 { limb0: 0x5b2798f11186aa7db5373cdd, limb1: 0xa5023b2f0c8bab4ec100bf18, limb2: 0x13a0cace49d5eade, }, r1a0: u288 { limb0: 0x9b0527939d6c45e657273a85, limb1: 0x76cb75e8dc534ecd7e917521, limb2: 0x12e40c7aed42af34, }, r1a1: u288 { limb0: 0x77da98dd73c9603932b79af4, limb1: 0xfaac3a02aea7867b5226fa70, limb2: 0x8e2f40461279814, }, }, G2Line { r0a0: u288 { limb0: 0xc5eaebad6bd5beb92e09aade, limb1: 0xcbd48c7eb96beac635eddee1, limb2: 0x6b94aae5ea30073, }, r0a1: u288 { limb0: 0x882af1093bd174803a58f378, limb1: 0x9ec588e092fc5b155ebeec2e, limb2: 0x1ca1957381eeeaf6, }, r1a0: u288 { limb0: 0x85f75492a545f601ebdaeca3, limb1: 0xb76104e8575174401e8c88d3, limb2: 0x2f386789cd7045e0, }, r1a1: u288 { limb0: 0x21695ebadab2d91e4fdb6459, limb1: 0x76f7be32767094c83713ad27, limb2: 0x11f63fe7a6d180b6, }, }, G2Line { r0a0: u288 { limb0: 0xbff947921ed15906d7d1a15d, limb1: 0x801c1b9c79563f2e5bce21e1, limb2: 0x956f2ac3e4fe88a, }, r0a1: u288 { limb0: 0x5b2798f11186aa7db5373cdd, limb1: 0xa5023b2f0c8bab4ec100bf18, limb2: 0x13a0cace49d5eade, }, r1a0: u288 { limb0: 0x9b0527939d6c45e657273a85, limb1: 0x76cb75e8dc534ecd7e917521, limb2: 0x12e40c7aed42af34, }, r1a1: u288 { limb0: 0x77da98dd73c9603932b79af4, limb1: 0xfaac3a02aea7867b5226fa70, limb2: 0x8e2f40461279814, }, }, G2Line { r0a0: u288 { limb0: 0xac907bc1f092e5e0913e845c, limb1: 0x5964ee4cf6c9a38642dd0517, limb2: 0x1719e7b29682420d, }, r0a1: u288 { limb0: 0x74d7d423222f8b95733071c5, limb1: 0x86f3c3861a5f4d9c59281db1, limb2: 0x2e4ed8b13095cb38, }, r1a0: u288 { limb0: 0x4967b22d6ffa060c3d0f2c5f, limb1: 0x48dc68663059b322a3bdeaa4, limb2: 0x166e533bd057aeaf, }, r1a1: u288 { limb0: 0xcdd096c0af346e40e770fa2b, limb1: 0x6a8d2b8bc4369ae60bcd1a63, limb2: 0x2fd98e44a782d9d9, }, }, G2Line { r0a0: u288 { limb0: 0xac907bc1f092e5e0913e845c, limb1: 0x5964ee4cf6c9a38642dd0517, limb2: 0x1719e7b29682420d, }, r0a1: u288 { limb0: 0x74d7d423222f8b95733071c5, limb1: 0x86f3c3861a5f4d9c59281db1, limb2: 0x2e4ed8b13095cb38, }, r1a0: u288 { limb0: 0x4967b22d6ffa060c3d0f2c5f, limb1: 0x48dc68663059b322a3bdeaa4, limb2: 0x166e533bd057aeaf, }, r1a1: u288 { limb0: 0xcdd096c0af346e40e770fa2b, limb1: 0x6a8d2b8bc4369ae60bcd1a63, limb2: 0x2fd98e44a782d9d9, }, }, G2Line { r0a0: u288 { limb0: 0xcae2854ff6a3816300716e11, limb1: 0x24542ac4d609ab52f57a1cf6, limb2: 0x130bee99db1c1a6, }, r0a1: u288 { limb0: 0x7a097fcb199569eb2020a518, limb1: 0xc59e26079797276de74d2710, limb2: 0x205de761540e71f0, }, r1a0: u288 { limb0: 0xaa1ad54be641d1006740583, limb1: 0x3b2a9d3fc0122931ae274736, limb2: 0xbe53b90a6b0a84e, }, r1a1: u288 { limb0: 0xd74fcd1e68f4e37eb864c664, limb1: 0x148c5cb80d01f6a428be16e8, limb2: 0x12f83a1b869c2d94, }, }, G2Line { r0a0: u288 { limb0: 0xcae2854ff6a3816300716e11, limb1: 0x24542ac4d609ab52f57a1cf6, limb2: 0x130bee99db1c1a6, }, r0a1: u288 { limb0: 0x7a097fcb199569eb2020a518, limb1: 0xc59e26079797276de74d2710, limb2: 0x205de761540e71f0, }, r1a0: u288 { limb0: 0xaa1ad54be641d1006740583, limb1: 0x3b2a9d3fc0122931ae274736, limb2: 0xbe53b90a6b0a84e, }, r1a1: u288 { limb0: 0xd74fcd1e68f4e37eb864c664, limb1: 0x148c5cb80d01f6a428be16e8, limb2: 0x12f83a1b869c2d94, }, }, G2Line { r0a0: u288 { limb0: 0xc45d014325b07ba0dd2d4f10, limb1: 0x361ef3f040192c17167b900c, limb2: 0xf09fdc89e100ba7, }, r0a1: u288 { limb0: 0x19de05e48711d6d787de58a5, limb1: 0x52290b2ee0a6dae953c249cf, limb2: 0xf136a05d822f41d, }, r1a0: u288 { limb0: 0x17b39f9e05d9816d69d3a613, limb1: 0x643e9006b7b05faa90e6a8, limb2: 0x20e7d1e6a4c0547c, }, r1a1: u288 { limb0: 0x2fee0ea45053ae644c4e684f, limb1: 0xbb2e7afad484141b0be42479, limb2: 0x187df546a9ccfb69, }, }, G2Line { r0a0: u288 { limb0: 0xada5bca8b46adc829ca20edf, limb1: 0xa9cc28a9116efbf02609e3f2, limb2: 0xaedc7dd73b536f3, }, r0a1: u288 { limb0: 0xab9510ead48ad195261ddc88, limb1: 0xc202a7ba9dfce6d86664504e, limb2: 0x2ce423186cc9b5a9, }, r1a0: u288 { limb0: 0x8f2b148f9ab7585ea1a6c347, limb1: 0x508884251415af912a5d0a42, limb2: 0x1dbbf26d101af06d, }, r1a1: u288 { limb0: 0x68b9f7cab6f91619604f8061, limb1: 0xd94ab22c8f954516f2d2de81, limb2: 0x16aa4a653b525fb1, }, }, G2Line { r0a0: u288 { limb0: 0xc45d014325b07ba0dd2d4f10, limb1: 0x361ef3f040192c17167b900c, limb2: 0xf09fdc89e100ba7, }, r0a1: u288 { limb0: 0x19de05e48711d6d787de58a5, limb1: 0x52290b2ee0a6dae953c249cf, limb2: 0xf136a05d822f41d, }, r1a0: u288 { limb0: 0x17b39f9e05d9816d69d3a613, limb1: 0x643e9006b7b05faa90e6a8, limb2: 0x20e7d1e6a4c0547c, }, r1a1: u288 { limb0: 0x2fee0ea45053ae644c4e684f, limb1: 0xbb2e7afad484141b0be42479, limb2: 0x187df546a9ccfb69, }, }, G2Line { r0a0: u288 { limb0: 0xada5bca8b46adc829ca20edf, limb1: 0xa9cc28a9116efbf02609e3f2, limb2: 0xaedc7dd73b536f3, }, r0a1: u288 { limb0: 0xab9510ead48ad195261ddc88, limb1: 0xc202a7ba9dfce6d86664504e, limb2: 0x2ce423186cc9b5a9, }, r1a0: u288 { limb0: 0x8f2b148f9ab7585ea1a6c347, limb1: 0x508884251415af912a5d0a42, limb2: 0x1dbbf26d101af06d, }, r1a1: u288 { limb0: 0x68b9f7cab6f91619604f8061, limb1: 0xd94ab22c8f954516f2d2de81, limb2: 0x16aa4a653b525fb1, }, }, G2Line { r0a0: u288 { limb0: 0xc4a85cff6912d5bfd21136b3, limb1: 0x34488d83eff390d6a141392c, limb2: 0xdd68be1560fdaae, }, r0a1: u288 { limb0: 0x25abfb1fa590f9ccb71b8e0, limb1: 0x43c63f304c5602ef9de96df6, limb2: 0x21e65c606ce32d5a, }, r1a0: u288 { limb0: 0x6e4626b5e644b7a440e1b381, limb1: 0xa29ef58cc4acec20c08690c, limb2: 0x1eca054ddf87b2a4, }, r1a1: u288 { limb0: 0xc220eeaf9d6200717abc6724, limb1: 0x702fffe80bce126803560a40, limb2: 0x2e0f90625bd64073, }, }, G2Line { r0a0: u288 { limb0: 0xc4a85cff6912d5bfd21136b3, limb1: 0x34488d83eff390d6a141392c, limb2: 0xdd68be1560fdaae, }, r0a1: u288 { limb0: 0x25abfb1fa590f9ccb71b8e0, limb1: 0x43c63f304c5602ef9de96df6, limb2: 0x21e65c606ce32d5a, }, r1a0: u288 { limb0: 0x6e4626b5e644b7a440e1b381, limb1: 0xa29ef58cc4acec20c08690c, limb2: 0x1eca054ddf87b2a4, }, r1a1: u288 { limb0: 0xc220eeaf9d6200717abc6724, limb1: 0x702fffe80bce126803560a40, limb2: 0x2e0f90625bd64073, }, }, G2Line { r0a0: u288 { limb0: 0x59f254cb97c8a519e0461a6, limb1: 0xb4542e9c6bb21b7d9648e1d4, limb2: 0x22dc33964ee2947b, }, r0a1: u288 { limb0: 0x5e83c2931befc562e4c93cee, limb1: 0x675b3e97b43eba3f75101885, limb2: 0x11d20ed3321c48f, }, r1a0: u288 { limb0: 0x11e5d20e996d12471ceb3541, limb1: 0x229064d01b397b4af809e840, limb2: 0x21834a1301ac5984, }, r1a1: u288 { limb0: 0xbe43cdde5117c697882c850f, limb1: 0x1bc4151048af9bbd27f7e82a, limb2: 0x2501d9aca420d21e, }, }, G2Line { r0a0: u288 { limb0: 0x134b53d15a50fc2bed6d2f3d, limb1: 0xd4f8c40bf294c7e18346462d, limb2: 0x1aad2161b8c9e68e, }, r0a1: u288 { limb0: 0x88262244e0b154b0ca5b5d9a, limb1: 0xd288b3c01ba5c293f8c800f8, limb2: 0xf0ac20574e1aede, }, r1a0: u288 { limb0: 0xe5373b9b81964332b6771878, limb1: 0x80e60988bd2e9de7f4395ae6, limb2: 0x2e916f6959fa27f0, }, r1a1: u288 { limb0: 0x3f67c739560ef94c04b58369, limb1: 0x1ee07a68fb111967cd5b15b8, limb2: 0x1b7e48fae034571, }, }, G2Line { r0a0: u288 { limb0: 0x59f254cb97c8a519e0461a6, limb1: 0xb4542e9c6bb21b7d9648e1d4, limb2: 0x22dc33964ee2947b, }, r0a1: u288 { limb0: 0x5e83c2931befc562e4c93cee, limb1: 0x675b3e97b43eba3f75101885, limb2: 0x11d20ed3321c48f, }, r1a0: u288 { limb0: 0x11e5d20e996d12471ceb3541, limb1: 0x229064d01b397b4af809e840, limb2: 0x21834a1301ac5984, }, r1a1: u288 { limb0: 0xbe43cdde5117c697882c850f, limb1: 0x1bc4151048af9bbd27f7e82a, limb2: 0x2501d9aca420d21e, }, }, G2Line { r0a0: u288 { limb0: 0x134b53d15a50fc2bed6d2f3d, limb1: 0xd4f8c40bf294c7e18346462d, limb2: 0x1aad2161b8c9e68e, }, r0a1: u288 { limb0: 0x88262244e0b154b0ca5b5d9a, limb1: 0xd288b3c01ba5c293f8c800f8, limb2: 0xf0ac20574e1aede, }, r1a0: u288 { limb0: 0xe5373b9b81964332b6771878, limb1: 0x80e60988bd2e9de7f4395ae6, limb2: 0x2e916f6959fa27f0, }, r1a1: u288 { limb0: 0x3f67c739560ef94c04b58369, limb1: 0x1ee07a68fb111967cd5b15b8, limb2: 0x1b7e48fae034571, }, }, G2Line { r0a0: u288 { limb0: 0x65bb9e7438a232dad6eb7f96, limb1: 0x5cf05222319fe00305afe0bf, limb2: 0x1c6d87b3a5aabb43, }, r0a1: u288 { limb0: 0xb8e845bbd71aa9644432eaa6, limb1: 0xcdbf988db0903b19b07b9f3, limb2: 0x107ca76698ca0dcd, }, r1a0: u288 { limb0: 0x5ba7979e387e50b016321956, limb1: 0x2ee41a1e59ccbc1350611d32, limb2: 0x11a3b7b762eec2c5, }, r1a1: u288 { limb0: 0xb3f5edfecf19d6f82799dd03, limb1: 0xc0d095110dad9ebbefe29784, limb2: 0x1f63c13501eeeaf5, }, }, G2Line { r0a0: u288 { limb0: 0x65bb9e7438a232dad6eb7f96, limb1: 0x5cf05222319fe00305afe0bf, limb2: 0x1c6d87b3a5aabb43, }, r0a1: u288 { limb0: 0xb8e845bbd71aa9644432eaa6, limb1: 0xcdbf988db0903b19b07b9f3, limb2: 0x107ca76698ca0dcd, }, r1a0: u288 { limb0: 0x5ba7979e387e50b016321956, limb1: 0x2ee41a1e59ccbc1350611d32, limb2: 0x11a3b7b762eec2c5, }, r1a1: u288 { limb0: 0xb3f5edfecf19d6f82799dd03, limb1: 0xc0d095110dad9ebbefe29784, limb2: 0x1f63c13501eeeaf5, }, }, G2Line { r0a0: u288 { limb0: 0xde29dd2c7147403100fa258c, limb1: 0xbfc33c64aa2cdfd5f33f638d, limb2: 0x139edaa5713a8a73, }, r0a1: u288 { limb0: 0x8de2a4556c0698bd62bdc91d, limb1: 0x497ed1dffa7e70b6c15dad0c, limb2: 0x2cd9650c8add9b02, }, r1a0: u288 { limb0: 0x2357739dff7746f02bf5d5cd, limb1: 0x37396bdbe70cf65e7f7ed43b, limb2: 0x16571ebe2a0acf51, }, r1a1: u288 { limb0: 0x5df40d02171f3aa50f4f1b23, limb1: 0x3d504cd9327215bf089595d0, limb2: 0x2598b49390b4ab86, }, }, G2Line { r0a0: u288 { limb0: 0xde29dd2c7147403100fa258c, limb1: 0xbfc33c64aa2cdfd5f33f638d, limb2: 0x139edaa5713a8a73, }, r0a1: u288 { limb0: 0x8de2a4556c0698bd62bdc91d, limb1: 0x497ed1dffa7e70b6c15dad0c, limb2: 0x2cd9650c8add9b02, }, r1a0: u288 { limb0: 0x2357739dff7746f02bf5d5cd, limb1: 0x37396bdbe70cf65e7f7ed43b, limb2: 0x16571ebe2a0acf51, }, r1a1: u288 { limb0: 0x5df40d02171f3aa50f4f1b23, limb1: 0x3d504cd9327215bf089595d0, limb2: 0x2598b49390b4ab86, }, }, G2Line { r0a0: u288 { limb0: 0x4360e486f47a872ae0460f44, limb1: 0x7bb35bfed6fcfcf8779029e1, limb2: 0x1390b4c7cb6b52f1, }, r0a1: u288 { limb0: 0xa628a0a5b10cbbd6c74c24ee, limb1: 0x7470f4707a0cc892ebefded7, limb2: 0x1ff4ca8749a8104e, }, r1a0: u288 { limb0: 0xff60a007ec6c8b1e83574f3d, limb1: 0xce3526917a6268d71609c0a1, limb2: 0x3016dc03227dad67, }, r1a1: u288 { limb0: 0x3989e237ecb0bc27e6ad5d37, limb1: 0x91acde41c342e92417210e02, limb2: 0x2c602bf496b1e2b8, }, }, G2Line { r0a0: u288 { limb0: 0x103a372c78fa5b2a67d01204, limb1: 0x675f1cbc7aebe1140e8bed2a, limb2: 0x2532e98456a291c3, }, r0a1: u288 { limb0: 0xc0be03786bd147df08fa1ece, limb1: 0x7878592e1699337b543a6fa2, limb2: 0x9e2390310f5b3d7, }, r1a0: u288 { limb0: 0x6d973cc33a79ba068e6572ad, limb1: 0xc2fddbd0c013d321cabfbf43, limb2: 0x249b679f9a94f336, }, r1a1: u288 { limb0: 0xe20f26b34d3756b2b9519351, limb1: 0xde793f45fed2b6ad4576aaf8, limb2: 0x2cc11b280706670a, }, }, G2Line { r0a0: u288 { limb0: 0x4360e486f47a872ae0460f44, limb1: 0x7bb35bfed6fcfcf8779029e1, limb2: 0x1390b4c7cb6b52f1, }, r0a1: u288 { limb0: 0xa628a0a5b10cbbd6c74c24ee, limb1: 0x7470f4707a0cc892ebefded7, limb2: 0x1ff4ca8749a8104e, }, r1a0: u288 { limb0: 0xff60a007ec6c8b1e83574f3d, limb1: 0xce3526917a6268d71609c0a1, limb2: 0x3016dc03227dad67, }, r1a1: u288 { limb0: 0x3989e237ecb0bc27e6ad5d37, limb1: 0x91acde41c342e92417210e02, limb2: 0x2c602bf496b1e2b8, }, }, G2Line { r0a0: u288 { limb0: 0x103a372c78fa5b2a67d01204, limb1: 0x675f1cbc7aebe1140e8bed2a, limb2: 0x2532e98456a291c3, }, r0a1: u288 { limb0: 0xc0be03786bd147df08fa1ece, limb1: 0x7878592e1699337b543a6fa2, limb2: 0x9e2390310f5b3d7, }, r1a0: u288 { limb0: 0x6d973cc33a79ba068e6572ad, limb1: 0xc2fddbd0c013d321cabfbf43, limb2: 0x249b679f9a94f336, }, r1a1: u288 { limb0: 0xe20f26b34d3756b2b9519351, limb1: 0xde793f45fed2b6ad4576aaf8, limb2: 0x2cc11b280706670a, }, }, G2Line { r0a0: u288 { limb0: 0x551986dc96f0443f7ac4ba73, limb1: 0x78107a0c01ea8e3f9bd2e6fd, limb2: 0x201da6796dee986f, }, r0a1: u288 { limb0: 0xb29fe7d173b13e6ed7b96297, limb1: 0x77342f3c7dfec27fe1753e85, limb2: 0x1fa36d6151f8156e, }, r1a0: u288 { limb0: 0xcfbc59734fa247fead294d84, limb1: 0x95cf28f410134c75494cc333, limb2: 0x2fdd98603896fb30, }, r1a1: u288 { limb0: 0x225b0b0fef9e6d36d471d78e, limb1: 0x278c8534902d21f77aef3522, limb2: 0xe42d7fa7de4d6c8, }, }, G2Line { r0a0: u288 { limb0: 0x551986dc96f0443f7ac4ba73, limb1: 0x78107a0c01ea8e3f9bd2e6fd, limb2: 0x201da6796dee986f, }, r0a1: u288 { limb0: 0xb29fe7d173b13e6ed7b96297, limb1: 0x77342f3c7dfec27fe1753e85, limb2: 0x1fa36d6151f8156e, }, r1a0: u288 { limb0: 0xcfbc59734fa247fead294d84, limb1: 0x95cf28f410134c75494cc333, limb2: 0x2fdd98603896fb30, }, r1a1: u288 { limb0: 0x225b0b0fef9e6d36d471d78e, limb1: 0x278c8534902d21f77aef3522, limb2: 0xe42d7fa7de4d6c8, }, }, G2Line { r0a0: u288 { limb0: 0xd524080ad04473596afdaafb, limb1: 0x9da4392d65be1f8372c18a53, limb2: 0xbccb6baf45de67c, }, r0a1: u288 { limb0: 0x336813e1fb5e17e81b5b051b, limb1: 0xe98e855ed4992521f93709a4, limb2: 0x297b055bd5622a18, }, r1a0: u288 { limb0: 0x2e761701f878006486dedec1, limb1: 0x677ff8e5f6b82a95401407f, limb2: 0x2f5725fecfef8317, }, r1a1: u288 { limb0: 0x839358e9dd8ffc54f27fca9c, limb1: 0xa4a0948db4162fdf44aee0f6, limb2: 0x2849739e5c4e2ee3, }, }, G2Line { r0a0: u288 { limb0: 0xd524080ad04473596afdaafb, limb1: 0x9da4392d65be1f8372c18a53, limb2: 0xbccb6baf45de67c, }, r0a1: u288 { limb0: 0x336813e1fb5e17e81b5b051b, limb1: 0xe98e855ed4992521f93709a4, limb2: 0x297b055bd5622a18, }, r1a0: u288 { limb0: 0x2e761701f878006486dedec1, limb1: 0x677ff8e5f6b82a95401407f, limb2: 0x2f5725fecfef8317, }, r1a1: u288 { limb0: 0x839358e9dd8ffc54f27fca9c, limb1: 0xa4a0948db4162fdf44aee0f6, limb2: 0x2849739e5c4e2ee3, }, }, G2Line { r0a0: u288 { limb0: 0xc9cde220c427e6e795c276ea, limb1: 0xf16a4bf65aa097b4b2102d3a, limb2: 0x107f879bc0743525, }, r0a1: u288 { limb0: 0x5edbca4d3c47278b7e543edc, limb1: 0xe6280d0a1160bc4062c712a2, limb2: 0xd65ce18e50f6e9f, }, r1a0: u288 { limb0: 0x922d89859e41d74f44066e94, limb1: 0x92d65b7ea0039b0163ab463, limb2: 0x233cfba3a88b3b44, }, r1a1: u288 { limb0: 0xbaceedcb5732d6a04a4a3ba2, limb1: 0xe586d3e9d7583a9b9956674c, limb2: 0x1b35c7bee23e7274, }, }, G2Line { r0a0: u288 { limb0: 0xc9cde220c427e6e795c276ea, limb1: 0xf16a4bf65aa097b4b2102d3a, limb2: 0x107f879bc0743525, }, r0a1: u288 { limb0: 0x5edbca4d3c47278b7e543edc, limb1: 0xe6280d0a1160bc4062c712a2, limb2: 0xd65ce18e50f6e9f, }, r1a0: u288 { limb0: 0x922d89859e41d74f44066e94, limb1: 0x92d65b7ea0039b0163ab463, limb2: 0x233cfba3a88b3b44, }, r1a1: u288 { limb0: 0xbaceedcb5732d6a04a4a3ba2, limb1: 0xe586d3e9d7583a9b9956674c, limb2: 0x1b35c7bee23e7274, }, }, G2Line { r0a0: u288 { limb0: 0x7dc2872c3517c1e449fc4122, limb1: 0x705ab5ca7266a5ffa614625b, limb2: 0x166c4d11551f6f6d, }, r0a1: u288 { limb0: 0x492f67a4ba40719208859c1b, limb1: 0x7a676c7fc4295e5aab645973, limb2: 0x2d03ea35dec3ab5d, }, r1a0: u288 { limb0: 0x529cb1e346af0b40e0e2e6b9, limb1: 0xe42e697812ceb8a7c51f85b3, limb2: 0x2b5f25393ba2c781, }, r1a1: u288 { limb0: 0x3d2f685444515b3441d54cee, limb1: 0xed7dcc8e1781c6d4006bba3f, limb2: 0x26f0fac3db26fe20, }, }, G2Line { r0a0: u288 { limb0: 0x7dc2872c3517c1e449fc4122, limb1: 0x705ab5ca7266a5ffa614625b, limb2: 0x166c4d11551f6f6d, }, r0a1: u288 { limb0: 0x492f67a4ba40719208859c1b, limb1: 0x7a676c7fc4295e5aab645973, limb2: 0x2d03ea35dec3ab5d, }, r1a0: u288 { limb0: 0x529cb1e346af0b40e0e2e6b9, limb1: 0xe42e697812ceb8a7c51f85b3, limb2: 0x2b5f25393ba2c781, }, r1a1: u288 { limb0: 0x3d2f685444515b3441d54cee, limb1: 0xed7dcc8e1781c6d4006bba3f, limb2: 0x26f0fac3db26fe20, }, }, G2Line { r0a0: u288 { limb0: 0x1e691060b09334f4d4d11564, limb1: 0xc2f23d460e32ab29aac9a462, limb2: 0x1f52946e8ab57b9d, }, r0a1: u288 { limb0: 0xb8f6cec3d46206bf11579e06, limb1: 0x6b82224b4c502934276477ce, limb2: 0x4263847a3546583, }, r1a0: u288 { limb0: 0x3e02aba94130839fdfb531d3, limb1: 0x89b37e5ce7cd94f86280b704, limb2: 0x25f502760510099, }, r1a1: u288 { limb0: 0xef21ddf9cebf3491c94329fd, limb1: 0xb2577ec6fa2817d5e8a2aaad, limb2: 0x2e0a1cc9617d5d85, }, }, G2Line { r0a0: u288 { limb0: 0x8ccc1f1b7b7c84a2fb81a4d1, limb1: 0x1fd835bf3d332347a842499, limb2: 0x105f1e2419d5da43, }, r0a1: u288 { limb0: 0xce0594565bc3f6746917fac1, limb1: 0x10f45021d35f29b40306afa2, limb2: 0x175b0196bc37d977, }, r1a0: u288 { limb0: 0x3bfc77f3df29fdb7446275fd, limb1: 0x761a984dcc263e2a7230a42c, limb2: 0xdc47d8f8fd9a377, }, r1a1: u288 { limb0: 0x5310a14e6b20a87bded6741b, limb1: 0xaf75a4d44565ed067c32308e, limb2: 0x1745ddfc2f0f2db5, }, }, G2Line { r0a0: u288 { limb0: 0x1e691060b09334f4d4d11564, limb1: 0xc2f23d460e32ab29aac9a462, limb2: 0x1f52946e8ab57b9d, }, r0a1: u288 { limb0: 0xb8f6cec3d46206bf11579e06, limb1: 0x6b82224b4c502934276477ce, limb2: 0x4263847a3546583, }, r1a0: u288 { limb0: 0x3e02aba94130839fdfb531d3, limb1: 0x89b37e5ce7cd94f86280b704, limb2: 0x25f502760510099, }, r1a1: u288 { limb0: 0xef21ddf9cebf3491c94329fd, limb1: 0xb2577ec6fa2817d5e8a2aaad, limb2: 0x2e0a1cc9617d5d85, }, }, G2Line { r0a0: u288 { limb0: 0x8ccc1f1b7b7c84a2fb81a4d1, limb1: 0x1fd835bf3d332347a842499, limb2: 0x105f1e2419d5da43, }, r0a1: u288 { limb0: 0xce0594565bc3f6746917fac1, limb1: 0x10f45021d35f29b40306afa2, limb2: 0x175b0196bc37d977, }, r1a0: u288 { limb0: 0x3bfc77f3df29fdb7446275fd, limb1: 0x761a984dcc263e2a7230a42c, limb2: 0xdc47d8f8fd9a377, }, r1a1: u288 { limb0: 0x5310a14e6b20a87bded6741b, limb1: 0xaf75a4d44565ed067c32308e, limb2: 0x1745ddfc2f0f2db5, }, }, G2Line { r0a0: u288 { limb0: 0x9002fa9c872aa1591cb2e83c, limb1: 0x18092dea89807d07c96f5cee, limb2: 0x5e775cc8d0e2333, }, r0a1: u288 { limb0: 0x6e55603f23c1e2f40ecbc3be, limb1: 0x9ef6bba8f2ca071759eee99a, limb2: 0x66cf6e10d463eb6, }, r1a0: u288 { limb0: 0x30131216b55fd9bf4d2cbe86, limb1: 0xbaa5fde208b9fceda4ed5946, limb2: 0xdbb530576beae47, }, r1a1: u288 { limb0: 0xe09b26e7b2fe48a7f274d02d, limb1: 0x9e41ae04207fa2eb5f641fed, limb2: 0x511a273c2863628, }, }, G2Line { r0a0: u288 { limb0: 0x9002fa9c872aa1591cb2e83c, limb1: 0x18092dea89807d07c96f5cee, limb2: 0x5e775cc8d0e2333, }, r0a1: u288 { limb0: 0x6e55603f23c1e2f40ecbc3be, limb1: 0x9ef6bba8f2ca071759eee99a, limb2: 0x66cf6e10d463eb6, }, r1a0: u288 { limb0: 0x30131216b55fd9bf4d2cbe86, limb1: 0xbaa5fde208b9fceda4ed5946, limb2: 0xdbb530576beae47, }, r1a1: u288 { limb0: 0xe09b26e7b2fe48a7f274d02d, limb1: 0x9e41ae04207fa2eb5f641fed, limb2: 0x511a273c2863628, }, }, G2Line { r0a0: u288 { limb0: 0x9e446957265af1f6cdcb9e15, limb1: 0x6c10753b3e38581919c0cc4d, limb2: 0x3049507b97cd2ae3, }, r0a1: u288 { limb0: 0x81d9c4ec56b0c577f646eb40, limb1: 0x2e5a0918579e398c48776ad2, limb2: 0x3d00590d1493ac8, }, r1a0: u288 { limb0: 0xa5ffc6ee3bc132f1681fe84f, limb1: 0x6906fa22a16540a098a498a7, limb2: 0xd23995e1c7ff58d, }, r1a1: u288 { limb0: 0x99b1ea789cd8357bbc2d09d8, limb1: 0x2fde0375bb34e500582e9729, limb2: 0xfad5daa8506bc1, }, }, G2Line { r0a0: u288 { limb0: 0xc627fa78d0f6604cfc6262bc, limb1: 0x1a3f0695ff6e8412d1ea0eda, limb2: 0x1b1754c1a9e0cea9, }, r0a1: u288 { limb0: 0x8fbb7ca95e11dda5d5f44cc0, limb1: 0xaab02dc7e290087c8d9224dc, limb2: 0x4c39cf6e88ea4d8, }, r1a0: u288 { limb0: 0x66b308f30b0a27dfb743a053, limb1: 0xc24b32150e094160eb1e6e20, limb2: 0x16091aac6ef81c7, }, r1a1: u288 { limb0: 0x7e3aeab40b6fb8507a19662f, limb1: 0x8fa259d1ce6d3db3ba6cbcd, limb2: 0x2c175175b8686be5, }, }, G2Line { r0a0: u288 { limb0: 0x9e446957265af1f6cdcb9e15, limb1: 0x6c10753b3e38581919c0cc4d, limb2: 0x3049507b97cd2ae3, }, r0a1: u288 { limb0: 0x81d9c4ec56b0c577f646eb40, limb1: 0x2e5a0918579e398c48776ad2, limb2: 0x3d00590d1493ac8, }, r1a0: u288 { limb0: 0xa5ffc6ee3bc132f1681fe84f, limb1: 0x6906fa22a16540a098a498a7, limb2: 0xd23995e1c7ff58d, }, r1a1: u288 { limb0: 0x99b1ea789cd8357bbc2d09d8, limb1: 0x2fde0375bb34e500582e9729, limb2: 0xfad5daa8506bc1, }, }, G2Line { r0a0: u288 { limb0: 0xc627fa78d0f6604cfc6262bc, limb1: 0x1a3f0695ff6e8412d1ea0eda, limb2: 0x1b1754c1a9e0cea9, }, r0a1: u288 { limb0: 0x8fbb7ca95e11dda5d5f44cc0, limb1: 0xaab02dc7e290087c8d9224dc, limb2: 0x4c39cf6e88ea4d8, }, r1a0: u288 { limb0: 0x66b308f30b0a27dfb743a053, limb1: 0xc24b32150e094160eb1e6e20, limb2: 0x16091aac6ef81c7, }, r1a1: u288 { limb0: 0x7e3aeab40b6fb8507a19662f, limb1: 0x8fa259d1ce6d3db3ba6cbcd, limb2: 0x2c175175b8686be5, }, }, G2Line { r0a0: u288 { limb0: 0x391e6f951049b131d70e651, limb1: 0x5c0f54485e635304e14ce30e, limb2: 0x221ee8dc68dde949, }, r0a1: u288 { limb0: 0xac8ba155c82a61103e2963c1, limb1: 0x8559d1265b1f4418a886b3aa, limb2: 0x140ce9c3c2eb5374, }, r1a0: u288 { limb0: 0x73ebb164ba66b89f6ac09079, limb1: 0x3699654a08147615c793b6b5, limb2: 0xaa97a901c3147f3, }, r1a1: u288 { limb0: 0x9666d2cab8edbbffe6ede238, limb1: 0xc28b607bd98c0f9789de1cb4, limb2: 0xcb0f83e0497f81e, }, }, G2Line { r0a0: u288 { limb0: 0x391e6f951049b131d70e651, limb1: 0x5c0f54485e635304e14ce30e, limb2: 0x221ee8dc68dde949, }, r0a1: u288 { limb0: 0xac8ba155c82a61103e2963c1, limb1: 0x8559d1265b1f4418a886b3aa, limb2: 0x140ce9c3c2eb5374, }, r1a0: u288 { limb0: 0x73ebb164ba66b89f6ac09079, limb1: 0x3699654a08147615c793b6b5, limb2: 0xaa97a901c3147f3, }, r1a1: u288 { limb0: 0x9666d2cab8edbbffe6ede238, limb1: 0xc28b607bd98c0f9789de1cb4, limb2: 0xcb0f83e0497f81e, }, }, G2Line { r0a0: u288 { limb0: 0xd9cb0120b4122fb011495b79, limb1: 0xb13527eef1359006fb9859de, limb2: 0x240401f012c778a3, }, r0a1: u288 { limb0: 0x9cc1ae143c291244678b0671, limb1: 0x3f4bdf8e0d1bb7d8d2c700d7, limb2: 0x12fc2e1a9bd4d4fb, }, r1a0: u288 { limb0: 0x4d62fe7db900df0085dff093, limb1: 0x424c17123aa393f8a5520eb9, limb2: 0x8df0bf255c22f60, }, r1a1: u288 { limb0: 0x4caa438a70cd1b3862c1618e, limb1: 0x3e479829171b3521b4952056, limb2: 0x828e185bcf93935, }, }, G2Line { r0a0: u288 { limb0: 0xd9cb0120b4122fb011495b79, limb1: 0xb13527eef1359006fb9859de, limb2: 0x240401f012c778a3, }, r0a1: u288 { limb0: 0x9cc1ae143c291244678b0671, limb1: 0x3f4bdf8e0d1bb7d8d2c700d7, limb2: 0x12fc2e1a9bd4d4fb, }, r1a0: u288 { limb0: 0x4d62fe7db900df0085dff093, limb1: 0x424c17123aa393f8a5520eb9, limb2: 0x8df0bf255c22f60, }, r1a1: u288 { limb0: 0x4caa438a70cd1b3862c1618e, limb1: 0x3e479829171b3521b4952056, limb2: 0x828e185bcf93935, }, }, G2Line { r0a0: u288 { limb0: 0xb862a4ff37044dbe06e91363, limb1: 0xaf8e301a655e3e4a00bc528, limb2: 0x1b35ba3ad1783bfa, }, r0a1: u288 { limb0: 0x4d069af037c7fa2d75a8135b, limb1: 0xe23f93edb80bda1ddf6c3d8b, limb2: 0x734462d6e70bd6, }, r1a0: u288 { limb0: 0xca21499f48088a3152f20477, limb1: 0xfb6ff15c58fd656c3a068ba7, limb2: 0x129921fd1af30952, }, r1a1: u288 { limb0: 0xe182d8890b92a8c636cfc2d5, limb1: 0xcf37e9714eabfb65cd257a30, limb2: 0x19c5b0d5affa1c21, }, }, G2Line { r0a0: u288 { limb0: 0xb862a4ff37044dbe06e91363, limb1: 0xaf8e301a655e3e4a00bc528, limb2: 0x1b35ba3ad1783bfa, }, r0a1: u288 { limb0: 0x4d069af037c7fa2d75a8135b, limb1: 0xe23f93edb80bda1ddf6c3d8b, limb2: 0x734462d6e70bd6, }, r1a0: u288 { limb0: 0xca21499f48088a3152f20477, limb1: 0xfb6ff15c58fd656c3a068ba7, limb2: 0x129921fd1af30952, }, r1a1: u288 { limb0: 0xe182d8890b92a8c636cfc2d5, limb1: 0xcf37e9714eabfb65cd257a30, limb2: 0x19c5b0d5affa1c21, }, }, G2Line { r0a0: u288 { limb0: 0x8d30e8f01b6acf088a9bd5a6, limb1: 0xb440d1794eef76a66e0fdb32, limb2: 0x16655a68127499b0, }, r0a1: u288 { limb0: 0xf12061678632cd148d1be332, limb1: 0x3aa5b5ac85bb5c32e7c93d40, limb2: 0x2f885ae792f2779e, }, r1a0: u288 { limb0: 0x1de53ae1c1e6c599d4a495e4, limb1: 0x8ef188b9abb6e97a0375dee6, limb2: 0x9507d99d56d4d1d, }, r1a1: u288 { limb0: 0x9a83ce73013109f348314267, limb1: 0xffd1a4c21374ab0fcece03f4, limb2: 0x7570f2346d80d71, }, }, G2Line { r0a0: u288 { limb0: 0xffb932597fa8bdce8de82fd9, limb1: 0xc9265a1ac66f25b59b4c7222, limb2: 0x2a43f963f80117be, }, r0a1: u288 { limb0: 0x9b6456669db38b591a35fa4e, limb1: 0x31aa367c72c0f07897f7d4a4, limb2: 0x28d40172399c3b03, }, r1a0: u288 { limb0: 0xca95f93e068ff337f73f54d5, limb1: 0xabbf9fdc66cc4b10f9da741, limb2: 0x22f1e27d902fc3ff, }, r1a1: u288 { limb0: 0xd12f8d49ae60289c48850a68, limb1: 0xc27491d681fc8ec1edf9d749, limb2: 0x14e28f1895e25047, }, }, G2Line { r0a0: u288 { limb0: 0x8d30e8f01b6acf088a9bd5a6, limb1: 0xb440d1794eef76a66e0fdb32, limb2: 0x16655a68127499b0, }, r0a1: u288 { limb0: 0xf12061678632cd148d1be332, limb1: 0x3aa5b5ac85bb5c32e7c93d40, limb2: 0x2f885ae792f2779e, }, r1a0: u288 { limb0: 0x1de53ae1c1e6c599d4a495e4, limb1: 0x8ef188b9abb6e97a0375dee6, limb2: 0x9507d99d56d4d1d, }, r1a1: u288 { limb0: 0x9a83ce73013109f348314267, limb1: 0xffd1a4c21374ab0fcece03f4, limb2: 0x7570f2346d80d71, }, }, G2Line { r0a0: u288 { limb0: 0xffb932597fa8bdce8de82fd9, limb1: 0xc9265a1ac66f25b59b4c7222, limb2: 0x2a43f963f80117be, }, r0a1: u288 { limb0: 0x9b6456669db38b591a35fa4e, limb1: 0x31aa367c72c0f07897f7d4a4, limb2: 0x28d40172399c3b03, }, r1a0: u288 { limb0: 0xca95f93e068ff337f73f54d5, limb1: 0xabbf9fdc66cc4b10f9da741, limb2: 0x22f1e27d902fc3ff, }, r1a1: u288 { limb0: 0xd12f8d49ae60289c48850a68, limb1: 0xc27491d681fc8ec1edf9d749, limb2: 0x14e28f1895e25047, }, }, G2Line { r0a0: u288 { limb0: 0x473f1af712fdc704395691fd, limb1: 0xb051550f381c34c4b0734c3b, limb2: 0x268983f32c1ff74a, }, r0a1: u288 { limb0: 0xcd3e26d45de18312b60f63b3, limb1: 0x4b1cf3f0c70a35c9ed0e7627, limb2: 0x5faf0f8c5417fac, }, r1a0: u288 { limb0: 0x7186248c0f4f620c4db44b27, limb1: 0xbaee201f71b6213a513c8c05, limb2: 0x10696dfde75b0f74, }, r1a1: u288 { limb0: 0x47fce5c1d2e0b960d052202, limb1: 0x12588735814120777f589cc7, limb2: 0x755d1d035d5e613, }, }, G2Line { r0a0: u288 { limb0: 0x473f1af712fdc704395691fd, limb1: 0xb051550f381c34c4b0734c3b, limb2: 0x268983f32c1ff74a, }, r0a1: u288 { limb0: 0xcd3e26d45de18312b60f63b3, limb1: 0x4b1cf3f0c70a35c9ed0e7627, limb2: 0x5faf0f8c5417fac, }, r1a0: u288 { limb0: 0x7186248c0f4f620c4db44b27, limb1: 0xbaee201f71b6213a513c8c05, limb2: 0x10696dfde75b0f74, }, r1a1: u288 { limb0: 0x47fce5c1d2e0b960d052202, limb1: 0x12588735814120777f589cc7, limb2: 0x755d1d035d5e613, }, }, G2Line { r0a0: u288 { limb0: 0xb069903d83fafb38587039b1, limb1: 0x8c9aaa21806e5257331c422c, limb2: 0x13dd740437a116d8, }, r0a1: u288 { limb0: 0x49d24e3bc669a61d3ec25caa, limb1: 0xeca54bbcf540ef02c5af1e2d, limb2: 0x193a4e0703852e04, }, r1a0: u288 { limb0: 0x40ed8176e59843d8d045473f, limb1: 0xdb66931824221a92af499752, limb2: 0x187f887f2aa471b3, }, r1a1: u288 { limb0: 0x5fb9760acf925b445a49c759, limb1: 0xfc8fbbd94b6f146f5b998e84, limb2: 0x79720a00d9dea8a, }, }, G2Line { r0a0: u288 { limb0: 0x9ea0a9193ffeb1be07f5f80b, limb1: 0xfec5948eaf1002c198e0e6d5, limb2: 0x2a4574fe23c4019d, }, r0a1: u288 { limb0: 0x192d77825dd5d0e9571db112, limb1: 0x8b6f1079f2f153206cc2a502, limb2: 0x247f3bad9ba3c5fe, }, r1a0: u288 { limb0: 0x250463ee5fe1aecbafe35d74, limb1: 0xfb14416968302aaa18aca8dd, limb2: 0x2667d8c8779f5e63, }, r1a1: u288 { limb0: 0x933a251b9bf2654b8cde705, limb1: 0x5b666a17b42cebd66d4dc4a4, limb2: 0xfbadfc59294fbce, }, }, G2Line { r0a0: u288 { limb0: 0xb069903d83fafb38587039b1, limb1: 0x8c9aaa21806e5257331c422c, limb2: 0x13dd740437a116d8, }, r0a1: u288 { limb0: 0x49d24e3bc669a61d3ec25caa, limb1: 0xeca54bbcf540ef02c5af1e2d, limb2: 0x193a4e0703852e04, }, r1a0: u288 { limb0: 0x40ed8176e59843d8d045473f, limb1: 0xdb66931824221a92af499752, limb2: 0x187f887f2aa471b3, }, r1a1: u288 { limb0: 0x5fb9760acf925b445a49c759, limb1: 0xfc8fbbd94b6f146f5b998e84, limb2: 0x79720a00d9dea8a, }, }, G2Line { r0a0: u288 { limb0: 0x9ea0a9193ffeb1be07f5f80b, limb1: 0xfec5948eaf1002c198e0e6d5, limb2: 0x2a4574fe23c4019d, }, r0a1: u288 { limb0: 0x192d77825dd5d0e9571db112, limb1: 0x8b6f1079f2f153206cc2a502, limb2: 0x247f3bad9ba3c5fe, }, r1a0: u288 { limb0: 0x250463ee5fe1aecbafe35d74, limb1: 0xfb14416968302aaa18aca8dd, limb2: 0x2667d8c8779f5e63, }, r1a1: u288 { limb0: 0x933a251b9bf2654b8cde705, limb1: 0x5b666a17b42cebd66d4dc4a4, limb2: 0xfbadfc59294fbce, }, }, G2Line { r0a0: u288 { limb0: 0x46cedc1a7916cd4758546b8f, limb1: 0xc0301e8d2df36447a89fb4e8, limb2: 0xd2ca8656d93e09e, }, r0a1: u288 { limb0: 0xb3e000fc3f43a66bd80ccccd, limb1: 0x4f3937ef435c74591278ec30, limb2: 0x2cacd585791ab63b, }, r1a0: u288 { limb0: 0x124b8c1a597cadcb6e4cd237, limb1: 0x8ff0b0f8077033669214f5a4, limb2: 0x2d6762b5646a6eab, }, r1a1: u288 { limb0: 0x2ac1adef2ec8f4f11dc21d70, limb1: 0xa47ce6dfc3545d78d6b35874, limb2: 0x1e66cdeff84b898e, }, }, G2Line { r0a0: u288 { limb0: 0x46cedc1a7916cd4758546b8f, limb1: 0xc0301e8d2df36447a89fb4e8, limb2: 0xd2ca8656d93e09e, }, r0a1: u288 { limb0: 0xb3e000fc3f43a66bd80ccccd, limb1: 0x4f3937ef435c74591278ec30, limb2: 0x2cacd585791ab63b, }, r1a0: u288 { limb0: 0x124b8c1a597cadcb6e4cd237, limb1: 0x8ff0b0f8077033669214f5a4, limb2: 0x2d6762b5646a6eab, }, r1a1: u288 { limb0: 0x2ac1adef2ec8f4f11dc21d70, limb1: 0xa47ce6dfc3545d78d6b35874, limb2: 0x1e66cdeff84b898e, }, }, G2Line { r0a0: u288 { limb0: 0x7bded937b16de0bd513a7142, limb1: 0xcfbbf3d13e42ad1b5895e0f2, limb2: 0x1eca553e197cc436, }, r0a1: u288 { limb0: 0x1326b172ffdca7374561eaa7, limb1: 0x1b78b181955868c0feac1a4d, limb2: 0x27e90d835140fdf2, }, r1a0: u288 { limb0: 0xabe4a2e309f9a3632b4ed1ce, limb1: 0xcea1bbacd364563ad1a77ebb, limb2: 0x13127af43089e05a, }, r1a1: u288 { limb0: 0x87d1cfadbc1dc69a79324026, limb1: 0x9c9c2c5e286779e0a0d895fc, limb2: 0x111e946cf01322eb, }, }, G2Line { r0a0: u288 { limb0: 0x7bded937b16de0bd513a7142, limb1: 0xcfbbf3d13e42ad1b5895e0f2, limb2: 0x1eca553e197cc436, }, r0a1: u288 { limb0: 0x1326b172ffdca7374561eaa7, limb1: 0x1b78b181955868c0feac1a4d, limb2: 0x27e90d835140fdf2, }, r1a0: u288 { limb0: 0xabe4a2e309f9a3632b4ed1ce, limb1: 0xcea1bbacd364563ad1a77ebb, limb2: 0x13127af43089e05a, }, r1a1: u288 { limb0: 0x87d1cfadbc1dc69a79324026, limb1: 0x9c9c2c5e286779e0a0d895fc, limb2: 0x111e946cf01322eb, }, }, G2Line { r0a0: u288 { limb0: 0x9defc443a5f969707c567481, limb1: 0x55f8307d8694c3cec8cca946, limb2: 0x1279f1c85384c33f, }, r0a1: u288 { limb0: 0xc45f4019a78bd32e0bdd4a1b, limb1: 0xaf7ddf8600e2296ceaf95d02, limb2: 0xbe5e1b962492d36, }, r1a0: u288 { limb0: 0x76245039bfb721ca1e2a0ee5, limb1: 0x8645cf7b04c2c109a1286acc, limb2: 0x295c9183ac4c0896, }, r1a1: u288 { limb0: 0xc074cb54759eec430185578f, limb1: 0x5eccd5653e9f7f02ed581abc, limb2: 0x14cf7692e622fcc5, }, }, G2Line { r0a0: u288 { limb0: 0xf8027d9e6b0a7844673e1245, limb1: 0x694d9db62bf7bb9a41262f0b, limb2: 0x58b480579c361aa, }, r0a1: u288 { limb0: 0x91e7cecfe16bbaaaf0e19fda, limb1: 0xb9179883e4b271385d9f0518, limb2: 0x1b352e7a150ca82b, }, r1a0: u288 { limb0: 0xaca0ba97589ae090a84d3146, limb1: 0x6e9a896c16ec429fab404849, limb2: 0x2360e6d4bbcf90f8, }, r1a1: u288 { limb0: 0xbb779a84783aa4ae72c18ceb, limb1: 0x27e540fc9069d0a5ef39760c, limb2: 0x114c9874632415bb, }, }, G2Line { r0a0: u288 { limb0: 0x9defc443a5f969707c567481, limb1: 0x55f8307d8694c3cec8cca946, limb2: 0x1279f1c85384c33f, }, r0a1: u288 { limb0: 0xc45f4019a78bd32e0bdd4a1b, limb1: 0xaf7ddf8600e2296ceaf95d02, limb2: 0xbe5e1b962492d36, }, r1a0: u288 { limb0: 0x76245039bfb721ca1e2a0ee5, limb1: 0x8645cf7b04c2c109a1286acc, limb2: 0x295c9183ac4c0896, }, r1a1: u288 { limb0: 0xc074cb54759eec430185578f, limb1: 0x5eccd5653e9f7f02ed581abc, limb2: 0x14cf7692e622fcc5, }, }, G2Line { r0a0: u288 { limb0: 0xf8027d9e6b0a7844673e1245, limb1: 0x694d9db62bf7bb9a41262f0b, limb2: 0x58b480579c361aa, }, r0a1: u288 { limb0: 0x91e7cecfe16bbaaaf0e19fda, limb1: 0xb9179883e4b271385d9f0518, limb2: 0x1b352e7a150ca82b, }, r1a0: u288 { limb0: 0xaca0ba97589ae090a84d3146, limb1: 0x6e9a896c16ec429fab404849, limb2: 0x2360e6d4bbcf90f8, }, r1a1: u288 { limb0: 0xbb779a84783aa4ae72c18ceb, limb1: 0x27e540fc9069d0a5ef39760c, limb2: 0x114c9874632415bb, }, }, G2Line { r0a0: u288 { limb0: 0x2ec97171b355380af9597308, limb1: 0x5c98f31e4243eabcdc9c4d0a, limb2: 0x189272184abbc67e, }, r0a1: u288 { limb0: 0x70b2a249ee2b52a2be3d20c1, limb1: 0x64f57fa1aabf12824a116967, limb2: 0x2eff2b0744e46233, }, r1a0: u288 { limb0: 0x745cbcaad594ddd38a5f1f4e, limb1: 0x95d1063847bfb4d5e006aa7d, limb2: 0x16f68ed87066356e, }, r1a1: u288 { limb0: 0xf642b7b361d87b9f994ddd0d, limb1: 0xdd217c0a6997dd8ec2539a54, limb2: 0xeb46e09edaa161c, }, }, G2Line { r0a0: u288 { limb0: 0x2ec97171b355380af9597308, limb1: 0x5c98f31e4243eabcdc9c4d0a, limb2: 0x189272184abbc67e, }, r0a1: u288 { limb0: 0x70b2a249ee2b52a2be3d20c1, limb1: 0x64f57fa1aabf12824a116967, limb2: 0x2eff2b0744e46233, }, r1a0: u288 { limb0: 0x745cbcaad594ddd38a5f1f4e, limb1: 0x95d1063847bfb4d5e006aa7d, limb2: 0x16f68ed87066356e, }, r1a1: u288 { limb0: 0xf642b7b361d87b9f994ddd0d, limb1: 0xdd217c0a6997dd8ec2539a54, limb2: 0xeb46e09edaa161c, }, }, G2Line { r0a0: u288 { limb0: 0x75698f1cd702ddc2b33e1a09, limb1: 0x491bab5348fd4670d338478a, limb2: 0xf12d300f3713d8, }, r0a1: u288 { limb0: 0x7f8777ccc370604bba36f21e, limb1: 0x9249013429c123002a183f50, limb2: 0x1fcfca1835131e72, }, r1a0: u288 { limb0: 0x8847a89e94951a7f1402ca0a, limb1: 0xcf6292aefd5885587e4b501a, limb2: 0x1f79fc126e4b16c6, }, r1a1: u288 { limb0: 0x9d2a84ea463b4f6fa6bdef4f, limb1: 0x757ea11f432296fd22343447, limb2: 0x2679fc65403a5f42, }, }, G2Line { r0a0: u288 { limb0: 0x75698f1cd702ddc2b33e1a09, limb1: 0x491bab5348fd4670d338478a, limb2: 0xf12d300f3713d8, }, r0a1: u288 { limb0: 0x7f8777ccc370604bba36f21e, limb1: 0x9249013429c123002a183f50, limb2: 0x1fcfca1835131e72, }, r1a0: u288 { limb0: 0x8847a89e94951a7f1402ca0a, limb1: 0xcf6292aefd5885587e4b501a, limb2: 0x1f79fc126e4b16c6, }, r1a1: u288 { limb0: 0x9d2a84ea463b4f6fa6bdef4f, limb1: 0x757ea11f432296fd22343447, limb2: 0x2679fc65403a5f42, }, }, G2Line { r0a0: u288 { limb0: 0x34f8267fb775f59435a975a3, limb1: 0x5e24c3e432badae39861f051, limb2: 0x172b5256de7536ee, }, r0a1: u288 { limb0: 0x5c68fe19ba153dcabad4077e, limb1: 0xfcc73acc37bc3efd49f1611c, limb2: 0x23e6dc58075ef8d9, }, r1a0: u288 { limb0: 0x4459c03b4d093ccedd5d9bb8, limb1: 0xe78ba9031b31e2be3ed8f2ca, limb2: 0x22ca3c03e154d61, }, r1a1: u288 { limb0: 0xe3ddeffb8c8f1a4cffd5c3f8, limb1: 0x1241cc4c4b10d455e4d51279, limb2: 0x1198575579f06677, }, }, G2Line { r0a0: u288 { limb0: 0x34f8267fb775f59435a975a3, limb1: 0x5e24c3e432badae39861f051, limb2: 0x172b5256de7536ee, }, r0a1: u288 { limb0: 0x5c68fe19ba153dcabad4077e, limb1: 0xfcc73acc37bc3efd49f1611c, limb2: 0x23e6dc58075ef8d9, }, r1a0: u288 { limb0: 0x4459c03b4d093ccedd5d9bb8, limb1: 0xe78ba9031b31e2be3ed8f2ca, limb2: 0x22ca3c03e154d61, }, r1a1: u288 { limb0: 0xe3ddeffb8c8f1a4cffd5c3f8, limb1: 0x1241cc4c4b10d455e4d51279, limb2: 0x1198575579f06677, }, }, G2Line { r0a0: u288 { limb0: 0xb18b3c24e43743bdb2cdbd80, limb1: 0xe998c4bba97ba39223cf4a9c, limb2: 0x19dc441e0f76e9e1, }, r0a1: u288 { limb0: 0x4c5d0509f4c4d4eac63f9f95, limb1: 0x5d3dd460fa5eec27c0f1c16d, limb2: 0x1ce5fefb5da40fc0, }, r1a0: u288 { limb0: 0x817ac722e3b0875c94d0c02d, limb1: 0x92716a07a8780a22c240503b, limb2: 0x14624b4326fac880, }, r1a1: u288 { limb0: 0x8f2279554369817a9f36b5b2, limb1: 0x6b6125c5be4c3c62b2ffbe7, limb2: 0x1e71362b2df417b3, }, }, G2Line { r0a0: u288 { limb0: 0x5dbc257e7bb51557102dbe2a, limb1: 0xce362ed76472b2864c5f5b6f, limb2: 0xbd519ac92f31216, }, r0a1: u288 { limb0: 0xe24007146139cc5810b3cbd1, limb1: 0xef3e2e5013aee1213c842bfb, limb2: 0x1f9eea9d2acec058, }, r1a0: u288 { limb0: 0x913167d6677c3bc99423eaeb, limb1: 0xa2fa67dadc942e074343364, limb2: 0x264f390c803c8e6, }, r1a1: u288 { limb0: 0x96fe98ba8d3de40aa91c7cef, limb1: 0x9c98ececaf9210453a32c237, limb2: 0xbe97bca2544faec, }, }, G2Line { r0a0: u288 { limb0: 0xb18b3c24e43743bdb2cdbd80, limb1: 0xe998c4bba97ba39223cf4a9c, limb2: 0x19dc441e0f76e9e1, }, r0a1: u288 { limb0: 0x4c5d0509f4c4d4eac63f9f95, limb1: 0x5d3dd460fa5eec27c0f1c16d, limb2: 0x1ce5fefb5da40fc0, }, r1a0: u288 { limb0: 0x817ac722e3b0875c94d0c02d, limb1: 0x92716a07a8780a22c240503b, limb2: 0x14624b4326fac880, }, r1a1: u288 { limb0: 0x8f2279554369817a9f36b5b2, limb1: 0x6b6125c5be4c3c62b2ffbe7, limb2: 0x1e71362b2df417b3, }, }, G2Line { r0a0: u288 { limb0: 0x5dbc257e7bb51557102dbe2a, limb1: 0xce362ed76472b2864c5f5b6f, limb2: 0xbd519ac92f31216, }, r0a1: u288 { limb0: 0xe24007146139cc5810b3cbd1, limb1: 0xef3e2e5013aee1213c842bfb, limb2: 0x1f9eea9d2acec058, }, r1a0: u288 { limb0: 0x913167d6677c3bc99423eaeb, limb1: 0xa2fa67dadc942e074343364, limb2: 0x264f390c803c8e6, }, r1a1: u288 { limb0: 0x96fe98ba8d3de40aa91c7cef, limb1: 0x9c98ececaf9210453a32c237, limb2: 0xbe97bca2544faec, }, }, G2Line { r0a0: u288 { limb0: 0x9fdc0157c3f6d20bf1149a1e, limb1: 0x8dfe542e1b42911f5be6b44f, limb2: 0x1777319f3952635d, }, r0a1: u288 { limb0: 0x63c6acb2bb3dd9747a3a9e32, limb1: 0xc1c8cdb31066df4015d898a0, limb2: 0xa1a8086940fa431, }, r1a0: u288 { limb0: 0x26964bc2ff40bddadf582927, limb1: 0x5b95722b0f70f6745c2bdbff, limb2: 0x236b02ee4ba7fc42, }, r1a1: u288 { limb0: 0xfc468b651b4a0b741fcab682, limb1: 0x947fdb5abdbbf09b1861c9ff, limb2: 0x168fbfc692ed02, }, }, G2Line { r0a0: u288 { limb0: 0x9fdc0157c3f6d20bf1149a1e, limb1: 0x8dfe542e1b42911f5be6b44f, limb2: 0x1777319f3952635d, }, r0a1: u288 { limb0: 0x63c6acb2bb3dd9747a3a9e32, limb1: 0xc1c8cdb31066df4015d898a0, limb2: 0xa1a8086940fa431, }, r1a0: u288 { limb0: 0x26964bc2ff40bddadf582927, limb1: 0x5b95722b0f70f6745c2bdbff, limb2: 0x236b02ee4ba7fc42, }, r1a1: u288 { limb0: 0xfc468b651b4a0b741fcab682, limb1: 0x947fdb5abdbbf09b1861c9ff, limb2: 0x168fbfc692ed02, }, }, G2Line { r0a0: u288 { limb0: 0x3b05d569dd3cfe7e6ef2d371, limb1: 0x1ab213c78ac4d75edd6143b4, limb2: 0x1bb1c4d653a5216f, }, r0a1: u288 { limb0: 0x9b92fea68b4f30a46556d398, limb1: 0x83327fb29ce9aca58bde417a, limb2: 0x16153220e81ed45d, }, r1a0: u288 { limb0: 0xb0d2a345496d30460462033c, limb1: 0xa40b16c304ff5061144ae50f, limb2: 0x26721ea54af25d00, }, r1a1: u288 { limb0: 0xa5ccabe21466c944dbb14095, limb1: 0xa4c756d31e5d0f448cde68b2, limb2: 0x2ae93a053a3d338d, }, }, G2Line { r0a0: u288 { limb0: 0x3b05d569dd3cfe7e6ef2d371, limb1: 0x1ab213c78ac4d75edd6143b4, limb2: 0x1bb1c4d653a5216f, }, r0a1: u288 { limb0: 0x9b92fea68b4f30a46556d398, limb1: 0x83327fb29ce9aca58bde417a, limb2: 0x16153220e81ed45d, }, r1a0: u288 { limb0: 0xb0d2a345496d30460462033c, limb1: 0xa40b16c304ff5061144ae50f, limb2: 0x26721ea54af25d00, }, r1a1: u288 { limb0: 0xa5ccabe21466c944dbb14095, limb1: 0xa4c756d31e5d0f448cde68b2, limb2: 0x2ae93a053a3d338d, }, }, G2Line { r0a0: u288 { limb0: 0x423870b6e907bad3e53a1eb8, limb1: 0xa40d0139dec99f50870dad86, limb2: 0xb478020107ff84a, }, r0a1: u288 { limb0: 0x7955bbd3730aa19c17ab5055, limb1: 0xaa78ed37b06b1fd334e3d3cf, limb2: 0xd4f1f559a4fe8c6, }, r1a0: u288 { limb0: 0xe660ec3b96e88f895941963f, limb1: 0x58b13980728f7f2cb5a5434b, limb2: 0x10784713fb59eeec, }, r1a1: u288 { limb0: 0x90ac547745e13ed221e7ff6d, limb1: 0x72fd8ba2100b52edc8fe6adf, limb2: 0xb07cd596e668799, }, }, G2Line { r0a0: u288 { limb0: 0x423870b6e907bad3e53a1eb8, limb1: 0xa40d0139dec99f50870dad86, limb2: 0xb478020107ff84a, }, r0a1: u288 { limb0: 0x7955bbd3730aa19c17ab5055, limb1: 0xaa78ed37b06b1fd334e3d3cf, limb2: 0xd4f1f559a4fe8c6, }, r1a0: u288 { limb0: 0xe660ec3b96e88f895941963f, limb1: 0x58b13980728f7f2cb5a5434b, limb2: 0x10784713fb59eeec, }, r1a1: u288 { limb0: 0x90ac547745e13ed221e7ff6d, limb1: 0x72fd8ba2100b52edc8fe6adf, limb2: 0xb07cd596e668799, }, }, G2Line { r0a0: u288 { limb0: 0xc63bfc22e89cbddab53d25fe, limb1: 0x5bfa33f41b648419dad6ecee, limb2: 0x29f285f798b40610, }, r0a1: u288 { limb0: 0x685052730566d5e671c6896a, limb1: 0x9d632cc21dc7d36c01732c8d, limb2: 0x2d2e5f43b41debb, }, r1a0: u288 { limb0: 0xa08a1b8fcecc8a0833b4cfba, limb1: 0x72be9ff16897e8415c88d391, limb2: 0x2f11915e5dbfe4db, }, r1a1: u288 { limb0: 0x25ccf150d767c294c0340770, limb1: 0x18c22516696708d37018fa53, limb2: 0x2f6ceab98e5c92ec, }, }, G2Line { r0a0: u288 { limb0: 0x99481a4102c53eac80f3388e, limb1: 0xf5f8486ec984928173976d3f, limb2: 0x1bd283b4cb081855, }, r0a1: u288 { limb0: 0x5b874e4477dc6e06572fb2b7, limb1: 0x249ee0ef06247fa425a3fef5, limb2: 0x1ae0e74588a52b14, }, r1a0: u288 { limb0: 0xea5de795431401fb27840e3c, limb1: 0x6faf5d812e5867e03f3e342c, limb2: 0x275215ae272382f9, }, r1a1: u288 { limb0: 0x486aa5eeaec04f001c7ff5, limb1: 0xd41375319ea34adc1551d9a3, limb2: 0x3cf1dc61b974fbb, }, }, G2Line { r0a0: u288 { limb0: 0xc63bfc22e89cbddab53d25fe, limb1: 0x5bfa33f41b648419dad6ecee, limb2: 0x29f285f798b40610, }, r0a1: u288 { limb0: 0x685052730566d5e671c6896a, limb1: 0x9d632cc21dc7d36c01732c8d, limb2: 0x2d2e5f43b41debb, }, r1a0: u288 { limb0: 0xa08a1b8fcecc8a0833b4cfba, limb1: 0x72be9ff16897e8415c88d391, limb2: 0x2f11915e5dbfe4db, }, r1a1: u288 { limb0: 0x25ccf150d767c294c0340770, limb1: 0x18c22516696708d37018fa53, limb2: 0x2f6ceab98e5c92ec, }, }, G2Line { r0a0: u288 { limb0: 0x99481a4102c53eac80f3388e, limb1: 0xf5f8486ec984928173976d3f, limb2: 0x1bd283b4cb081855, }, r0a1: u288 { limb0: 0x5b874e4477dc6e06572fb2b7, limb1: 0x249ee0ef06247fa425a3fef5, limb2: 0x1ae0e74588a52b14, }, r1a0: u288 { limb0: 0xea5de795431401fb27840e3c, limb1: 0x6faf5d812e5867e03f3e342c, limb2: 0x275215ae272382f9, }, r1a1: u288 { limb0: 0x486aa5eeaec04f001c7ff5, limb1: 0xd41375319ea34adc1551d9a3, limb2: 0x3cf1dc61b974fbb, }, }, G2Line { r0a0: u288 { limb0: 0xa32359cf0ec38b184a1dcea9, limb1: 0x6bbbc5ef1267f2d51a878381, limb2: 0x28df1061f929b4db, }, r0a1: u288 { limb0: 0xd675802cc8b672fe8783e2d6, limb1: 0xbb7d5e433d79fd50d9469a7d, limb2: 0x2784b6b89b7aa3ce, }, r1a0: u288 { limb0: 0x249ea526c4c84209df18e160, limb1: 0x6b7ecab858c43a482ff55a47, limb2: 0x45d81dac9b9b8ec, }, r1a1: u288 { limb0: 0x2e044de8199d7a5654fd9506, limb1: 0x17bae9b6381270ae16b4dded, limb2: 0xfebafd1c55a0818, }, }, G2Line { r0a0: u288 { limb0: 0xa32359cf0ec38b184a1dcea9, limb1: 0x6bbbc5ef1267f2d51a878381, limb2: 0x28df1061f929b4db, }, r0a1: u288 { limb0: 0xd675802cc8b672fe8783e2d6, limb1: 0xbb7d5e433d79fd50d9469a7d, limb2: 0x2784b6b89b7aa3ce, }, r1a0: u288 { limb0: 0x249ea526c4c84209df18e160, limb1: 0x6b7ecab858c43a482ff55a47, limb2: 0x45d81dac9b9b8ec, }, r1a1: u288 { limb0: 0x2e044de8199d7a5654fd9506, limb1: 0x17bae9b6381270ae16b4dded, limb2: 0xfebafd1c55a0818, }, }, G2Line { r0a0: u288 { limb0: 0xd813dc3ba36fadef5eefdba8, limb1: 0x6d01874326cb306accf0faff, limb2: 0x1c464c65c360a4c8, }, r0a1: u288 { limb0: 0xb7d92aae88aac832f2fa8c2e, limb1: 0xf57a537d0bbdac821cb31ab3, limb2: 0x527b1aec5c0d2f1, }, r1a0: u288 { limb0: 0xa07f43936bdbdf1dec60500b, limb1: 0x742456f2a8b6a9bae91cb16, limb2: 0x1c4033eb3eba0cc5, }, r1a1: u288 { limb0: 0x94b3709ef3fc176b25617e7d, limb1: 0xaf22d45fcd3d4e3d14874fa, limb2: 0x183887caa720ba0d, }, }, G2Line { r0a0: u288 { limb0: 0x3f02b00de6315b49872daa4d, limb1: 0xc303ab1deabf850249e8315f, limb2: 0x1bdb6a8f0f0fdd3, }, r0a1: u288 { limb0: 0x92fce2a1127ff2f9b751e30d, limb1: 0x3eb729d57b891ac828eb15c3, limb2: 0x2b484f5877256bb1, }, r1a0: u288 { limb0: 0xf89b2f972cb4f7f4c599e891, limb1: 0xb4f5d2a5bde63ee512f11d9e, limb2: 0x2dcdbce01b88089, }, r1a1: u288 { limb0: 0xa7a47fc449bb8a9d2562bfcd, limb1: 0xc4e2d6ba5582860d7339459e, limb2: 0x1d55e010c99b8d6c, }, }, G2Line { r0a0: u288 { limb0: 0xd813dc3ba36fadef5eefdba8, limb1: 0x6d01874326cb306accf0faff, limb2: 0x1c464c65c360a4c8, }, r0a1: u288 { limb0: 0xb7d92aae88aac832f2fa8c2e, limb1: 0xf57a537d0bbdac821cb31ab3, limb2: 0x527b1aec5c0d2f1, }, r1a0: u288 { limb0: 0xa07f43936bdbdf1dec60500b, limb1: 0x742456f2a8b6a9bae91cb16, limb2: 0x1c4033eb3eba0cc5, }, r1a1: u288 { limb0: 0x94b3709ef3fc176b25617e7d, limb1: 0xaf22d45fcd3d4e3d14874fa, limb2: 0x183887caa720ba0d, }, }, G2Line { r0a0: u288 { limb0: 0x3f02b00de6315b49872daa4d, limb1: 0xc303ab1deabf850249e8315f, limb2: 0x1bdb6a8f0f0fdd3, }, r0a1: u288 { limb0: 0x92fce2a1127ff2f9b751e30d, limb1: 0x3eb729d57b891ac828eb15c3, limb2: 0x2b484f5877256bb1, }, r1a0: u288 { limb0: 0xf89b2f972cb4f7f4c599e891, limb1: 0xb4f5d2a5bde63ee512f11d9e, limb2: 0x2dcdbce01b88089, }, r1a1: u288 { limb0: 0xa7a47fc449bb8a9d2562bfcd, limb1: 0xc4e2d6ba5582860d7339459e, limb2: 0x1d55e010c99b8d6c, }, }, G2Line { r0a0: u288 { limb0: 0xd6632e909bb2d794dcbb2d61, limb1: 0x7457873febfef7ae91c35b58, limb2: 0x9a9ca4c4d09e546, }, r0a1: u288 { limb0: 0x94c62fe653f917fc33a9d5b5, limb1: 0x8bc51d76a334c7a433ae35ab, limb2: 0xb27ad066a166ac4, }, r1a0: u288 { limb0: 0x96db5ee9875982bf556c73e9, limb1: 0xe9f1ec9f66254c4f268a27f, limb2: 0x1eef6e016b9ca6ff, }, r1a1: u288 { limb0: 0xf6d057dbafe03b544a69128f, limb1: 0xe03743865a854f3f554c95b7, limb2: 0x29c21dd74cd29781, }, }, G2Line { r0a0: u288 { limb0: 0xb964e3c6d975ca8cf820a505, limb1: 0x58cf1dfe1e77f86538998d74, limb2: 0x253f8f7c9eb4af1, }, r0a1: u288 { limb0: 0x751409cbae1c0030ee5977d1, limb1: 0xe203b703551126fdae59e500, limb2: 0x2e4d7a2dbc83f9b5, }, r1a0: u288 { limb0: 0x3bb2d7500573a130dfcc7b70, limb1: 0x2e94772d1e8a4db8783ea2f7, limb2: 0xb43fdec6bd93bce, }, r1a1: u288 { limb0: 0xdcad2320f5fe6edb3ee742ff, limb1: 0xdb00d689081d6770c6978582, limb2: 0x6029475ae5587e5, }, }, G2Line { r0a0: u288 { limb0: 0xd6632e909bb2d794dcbb2d61, limb1: 0x7457873febfef7ae91c35b58, limb2: 0x9a9ca4c4d09e546, }, r0a1: u288 { limb0: 0x94c62fe653f917fc33a9d5b5, limb1: 0x8bc51d76a334c7a433ae35ab, limb2: 0xb27ad066a166ac4, }, r1a0: u288 { limb0: 0x96db5ee9875982bf556c73e9, limb1: 0xe9f1ec9f66254c4f268a27f, limb2: 0x1eef6e016b9ca6ff, }, r1a1: u288 { limb0: 0xf6d057dbafe03b544a69128f, limb1: 0xe03743865a854f3f554c95b7, limb2: 0x29c21dd74cd29781, }, }, G2Line { r0a0: u288 { limb0: 0xb964e3c6d975ca8cf820a505, limb1: 0x58cf1dfe1e77f86538998d74, limb2: 0x253f8f7c9eb4af1, }, r0a1: u288 { limb0: 0x751409cbae1c0030ee5977d1, limb1: 0xe203b703551126fdae59e500, limb2: 0x2e4d7a2dbc83f9b5, }, r1a0: u288 { limb0: 0x3bb2d7500573a130dfcc7b70, limb1: 0x2e94772d1e8a4db8783ea2f7, limb2: 0xb43fdec6bd93bce, }, r1a1: u288 { limb0: 0xdcad2320f5fe6edb3ee742ff, limb1: 0xdb00d689081d6770c6978582, limb2: 0x6029475ae5587e5, }, }, G2Line { r0a0: u288 { limb0: 0x44ec71963665d6ec8ad74841, limb1: 0x8403830d652edbde8339e929, limb2: 0x100fb102d85f5085, }, r0a1: u288 { limb0: 0xc055c9daf26d35310e7b1e74, limb1: 0x40cdbeaffc8383e3cdc8926, limb2: 0x6fd31831cc5c2e2, }, r1a0: u288 { limb0: 0xad2ce478f7297f6138ae1c8c, limb1: 0x4d31d6f7382542621c5b6e17, limb2: 0x7dbf7c3c0f14e33, }, r1a1: u288 { limb0: 0xe4640196247c27251483088e, limb1: 0x34dea70f9956ebc54e0606ba, limb2: 0x8b41cd44b48eaaa, }, }, G2Line { r0a0: u288 { limb0: 0x44ec71963665d6ec8ad74841, limb1: 0x8403830d652edbde8339e929, limb2: 0x100fb102d85f5085, }, r0a1: u288 { limb0: 0xc055c9daf26d35310e7b1e74, limb1: 0x40cdbeaffc8383e3cdc8926, limb2: 0x6fd31831cc5c2e2, }, r1a0: u288 { limb0: 0xad2ce478f7297f6138ae1c8c, limb1: 0x4d31d6f7382542621c5b6e17, limb2: 0x7dbf7c3c0f14e33, }, r1a1: u288 { limb0: 0xe4640196247c27251483088e, limb1: 0x34dea70f9956ebc54e0606ba, limb2: 0x8b41cd44b48eaaa, }, }, G2Line { r0a0: u288 { limb0: 0xa4dc3d37041029c7b2f1bb9, limb1: 0xf72869e330906647a7d54af8, limb2: 0x705bd30bad6ce42, }, r0a1: u288 { limb0: 0xb00eef39b09348fd65e27aec, limb1: 0xd5e053aa5ae39359fac6cdbc, limb2: 0x90e03f1f820fe9a, }, r1a0: u288 { limb0: 0x7f56704e86148b1a5595647e, limb1: 0xb8e4acc00d27e4eaf2d3de14, limb2: 0x160398dceafe1fbe, }, r1a1: u288 { limb0: 0x7c39f499101722b5d82ceec4, limb1: 0xaf99a11bb8ab6c8134832009, limb2: 0x2d7388a9d5187a36, }, }, G2Line { r0a0: u288 { limb0: 0xa4dc3d37041029c7b2f1bb9, limb1: 0xf72869e330906647a7d54af8, limb2: 0x705bd30bad6ce42, }, r0a1: u288 { limb0: 0xb00eef39b09348fd65e27aec, limb1: 0xd5e053aa5ae39359fac6cdbc, limb2: 0x90e03f1f820fe9a, }, r1a0: u288 { limb0: 0x7f56704e86148b1a5595647e, limb1: 0xb8e4acc00d27e4eaf2d3de14, limb2: 0x160398dceafe1fbe, }, r1a1: u288 { limb0: 0x7c39f499101722b5d82ceec4, limb1: 0xaf99a11bb8ab6c8134832009, limb2: 0x2d7388a9d5187a36, }, }, G2Line { r0a0: u288 { limb0: 0x26743d3c5ceab5151856abc8, limb1: 0x2bc840c6b3375132f6df6c4d, limb2: 0xf20cc4455c9206b, }, r0a1: u288 { limb0: 0x75257f283994114ee03b667e, limb1: 0xb71eada78256c22a8b22564d, limb2: 0x2c4f6002e64db7e4, }, r1a0: u288 { limb0: 0xadeaeea86f50da58c232d0b5, limb1: 0xe988059d0234448257239cec, limb2: 0x23c7423d92bbc634, }, r1a1: u288 { limb0: 0x6afee648e46e570b43f3696d, limb1: 0x9a3f1aae0067f1de3d0a489, limb2: 0xa7256957d6a8ed, }, }, G2Line { r0a0: u288 { limb0: 0x26743d3c5ceab5151856abc8, limb1: 0x2bc840c6b3375132f6df6c4d, limb2: 0xf20cc4455c9206b, }, r0a1: u288 { limb0: 0x75257f283994114ee03b667e, limb1: 0xb71eada78256c22a8b22564d, limb2: 0x2c4f6002e64db7e4, }, r1a0: u288 { limb0: 0xadeaeea86f50da58c232d0b5, limb1: 0xe988059d0234448257239cec, limb2: 0x23c7423d92bbc634, }, r1a1: u288 { limb0: 0x6afee648e46e570b43f3696d, limb1: 0x9a3f1aae0067f1de3d0a489, limb2: 0xa7256957d6a8ed, }, }, G2Line { r0a0: u288 { limb0: 0x9894b9b6df6285e00cb3ef9d, limb1: 0xc7799b231f547596527979f9, limb2: 0x1873cf42f2befcbc, }, r0a1: u288 { limb0: 0xea5b37d753c87bdd55f0ed0, limb1: 0x70d0582e29fd33896e945be5, limb2: 0x273059304eef6b83, }, r1a0: u288 { limb0: 0x1a8c1b6d717a3b41ece55725, limb1: 0x7b31c1b97f15745a6d80ea0d, limb2: 0x2cd26d3a7bbe93e6, }, r1a1: u288 { limb0: 0xe2ad8bc0279b5c304c489ca6, limb1: 0x176d1c945108ce77fcd238cd, limb2: 0xde3c7c3f1c3d01b, }, }, G2Line { r0a0: u288 { limb0: 0x3980a9ac8c34a235d2616212, limb1: 0x84c8a8ab074ce118b68f30e9, limb2: 0x13d1902579c8a95e, }, r0a1: u288 { limb0: 0x84b1be8046674b6544cdbd07, limb1: 0x198c1a70db0768c46ee0879f, limb2: 0xb7e46866f7c1d4f, }, r1a0: u288 { limb0: 0x5aa04f6da050797974642dff, limb1: 0x67018b676db95697c6fc0e94, limb2: 0x174b5365db908344, }, r1a1: u288 { limb0: 0x12ae4d7bff5800094457c75f, limb1: 0xaf7fb1cf0adfdefc0943c20d, limb2: 0x2e168cd37dc90c25, }, }, G2Line { r0a0: u288 { limb0: 0x9894b9b6df6285e00cb3ef9d, limb1: 0xc7799b231f547596527979f9, limb2: 0x1873cf42f2befcbc, }, r0a1: u288 { limb0: 0xea5b37d753c87bdd55f0ed0, limb1: 0x70d0582e29fd33896e945be5, limb2: 0x273059304eef6b83, }, r1a0: u288 { limb0: 0x1a8c1b6d717a3b41ece55725, limb1: 0x7b31c1b97f15745a6d80ea0d, limb2: 0x2cd26d3a7bbe93e6, }, r1a1: u288 { limb0: 0xe2ad8bc0279b5c304c489ca6, limb1: 0x176d1c945108ce77fcd238cd, limb2: 0xde3c7c3f1c3d01b, }, }, G2Line { r0a0: u288 { limb0: 0x3980a9ac8c34a235d2616212, limb1: 0x84c8a8ab074ce118b68f30e9, limb2: 0x13d1902579c8a95e, }, r0a1: u288 { limb0: 0x84b1be8046674b6544cdbd07, limb1: 0x198c1a70db0768c46ee0879f, limb2: 0xb7e46866f7c1d4f, }, r1a0: u288 { limb0: 0x5aa04f6da050797974642dff, limb1: 0x67018b676db95697c6fc0e94, limb2: 0x174b5365db908344, }, r1a1: u288 { limb0: 0x12ae4d7bff5800094457c75f, limb1: 0xaf7fb1cf0adfdefc0943c20d, limb2: 0x2e168cd37dc90c25, }, }, ] .span(); let hint = MPCheckHintBN254 { lambda_root: E12D { w0: u288 { limb0: 0x23ca9e30f07b55b24f193b0f, limb1: 0xe87a29af47945c59bebde6e3, limb2: 0x25202875a18b48d6, }, w1: u288 { limb0: 0x73c45803819fb7aff4be48d4, limb1: 0xbc4e8cdff399f10e04552e9e, limb2: 0xe200b0579a47bb3, }, w2: u288 { limb0: 0xb7e202dd946f1c1e893294f5, limb1: 0x9b242eecb685264d1d38f92, limb2: 0x2743277dfb400b12, }, w3: u288 { limb0: 0x713dcf49af707a72abcdd23f, limb1: 0x297d2b276e1e10592a67e028, limb2: 0x7ce37c37c9a9830, }, w4: u288 { limb0: 0x1a1e7136ddb0226444e3dd93, limb1: 0x10ec67e9ba10af63294f9067, limb2: 0x2209ca34e9632ffe, }, w5: u288 { limb0: 0x282b36f9275c1d75a96b4bba, limb1: 0xcd30a7361a37968571854966, limb2: 0x56824745ec0be7e, }, w6: u288 { limb0: 0xfd161b3f69becd983863c1f8, limb1: 0x9e173cc60a49b16b0ae54cb6, limb2: 0x21c2ff8564f4b359, }, w7: u288 { limb0: 0x83b2b95b17f74a4135c8f0ec, limb1: 0x1d49d1548ca28958a1477f77, limb2: 0x21dfaf1ab1424f7a, }, w8: u288 { limb0: 0x9f42e8c899eb37b1c750776a, limb1: 0x1d527af4bf9944d9cacfc9b6, limb2: 0x2cedae6373f81ff3, }, w9: u288 { limb0: 0x5826957af02c5ff75ecf2f7f, limb1: 0x63de3d3ed13db73b40636e33, limb2: 0x1b4e8f8bab34df27, }, w10: u288 { limb0: 0xe47acbb5fc054b575c4de206, limb1: 0x21c9659455fa7db99219fcb1, limb2: 0x1da51303ee50de45, }, w11: u288 { limb0: 0xfba59dce6d63b61b27c81f88, limb1: 0xdcca144de9ddd923bbb33c4b, limb2: 0x291ee2a6f851083a, }, }, lambda_root_inverse: E12D { w0: u288 { limb0: 0xb5c3eabbd3b1eef8ea5617f4, limb1: 0x11833d922f25b3a34d3fca8f, limb2: 0x13750c425c423ee, }, w1: u288 { limb0: 0x8983bd9d7448c89812be4350, limb1: 0xcc0a0b4ca76d768c80ff8e55, limb2: 0xfb6e764fd741485, }, w2: u288 { limb0: 0x3edb9b44088f29518c1cf962, limb1: 0x3800221baf8e4d5d69808d93, limb2: 0x14d575b46d080633, }, w3: u288 { limb0: 0x132e0ad247c2f54fbe52f5bb, limb1: 0x4b0a3207c00cd30d7bdcf774, limb2: 0x1a93653a38cb2fe4, }, w4: u288 { limb0: 0xad30ef932f284898d3a7a46b, limb1: 0x4163e6658533a807cd45d00d, limb2: 0xddb14c4f82f8631, }, w5: u288 { limb0: 0x6b8e30e4eaa63a9ed81168d8, limb1: 0x313309f6dbce4e865d4fedb1, limb2: 0x2d3f5b1fefcb56f, }, w6: u288 { limb0: 0x4ef02281cc723a6da515811a, limb1: 0x14ff8ed665651ab8ce848f43, limb2: 0x131a42012d97077d, }, w7: u288 { limb0: 0x9378001a32c652b319e017f4, limb1: 0x7adaa3bb782735807171c8ee, limb2: 0x26a3c45ea339b47e, }, w8: u288 { limb0: 0xb45f0d072cee9451b2ef6bcd, limb1: 0xb5c79d9af82faa633c46c783, limb2: 0x288162b64a95050e, }, w9: u288 { limb0: 0xb400e23dbb10336db8e3e567, limb1: 0xf8be889f6826d20f76b01fa, limb2: 0x2a6ee642f39f6ea8, }, w10: u288 { limb0: 0xaa002ca04722ef6e113c90c7, limb1: 0x4a44cfbf7d0d8a113c67d3b8, limb2: 0x1b19f196206d8a99, }, w11: u288 { limb0: 0x3b36e8198a598435a63c262d, limb1: 0x5bd67fccbd394684e1e4c572, limb2: 0x166091a34daab9c1, }, }, w: MillerLoopResultScalingFactor { w0: u288 { limb0: 0x1, limb1: 0x0, limb2: 0x0 }, w2: u288 { limb0: 0x0, limb1: 0x0, limb2: 0x0 }, w4: u288 { limb0: 0x0, limb1: 0x0, limb2: 0x0 }, w6: u288 { limb0: 0x0, limb1: 0x0, limb2: 0x0 }, w8: u288 { limb0: 0x0, limb1: 0x0, limb2: 0x0 }, w10: u288 { limb0: 0x0, limb1: 0x0, limb2: 0x0 }, }, Ris: array![ E12D { w0: u288 { limb0: 0xe2f6acee09a64156c15e3478, limb1: 0xed70b0971287f50104248a93, limb2: 0x127703e3d61d8953, }, w1: u288 { limb0: 0x3f33ed733eb4838ff43a064d, limb1: 0x261b3bb5a0d1e3b1fc2eea8d, limb2: 0x1b45799651c4e710, }, w2: u288 { limb0: 0xfef7aacba92a3760281d63cc, limb1: 0xd3c17160fa29274e8fb29068, limb2: 0xd4e6a9fe3bada06, }, w3: u288 { limb0: 0xf8318240f89419438fe2d639, limb1: 0xe998e7c29f76b508e0538e38, limb2: 0xfb03e005dbba59f, }, w4: u288 { limb0: 0x70c9890149ae3e2742c5c731, limb1: 0xe9a6d4fc61f71f5d5ed989d4, limb2: 0x2dad8e036bd59924, }, w5: u288 { limb0: 0xd7b63c2f5eed5c20e605768d, limb1: 0xb0003493ed0492f6fa50f418, limb2: 0x17228fa4697986c7, }, w6: u288 { limb0: 0xa3dc70c11244fb2deda36cb2, limb1: 0xb8fb759606fba9d97587f0e8, limb2: 0x2e2f815e063bb0, }, w7: u288 { limb0: 0x686d29a44e7110ac6c8b9505, limb1: 0x74ac5a716ee1e9d44b50960f, limb2: 0x2152b931c3859503, }, w8: u288 { limb0: 0x5868412c8c818820977a66f0, limb1: 0x2f9e83b27ce0c185c6f1c18f, limb2: 0x14fac55b88d3ce93, }, w9: u288 { limb0: 0xb78d2652e51b3c673a385a19, limb1: 0x795b0f1a23960c7aca666e05, limb2: 0x12a1f27a3602498a, }, w10: u288 { limb0: 0xaccfdbe167c5f15ccbe8a10b, limb1: 0xe7f7a9853750e8e77d47908, limb2: 0x1b9bfc8952b7f369, }, w11: u288 { limb0: 0x149b5924ec95ec9b05da4bf8, limb1: 0x7567100511e744c551a6e4ea, limb2: 0x2b223a2dfd168795, }, }, E12D { w0: u288 { limb0: 0xa72a4848e30642eded615898, limb1: 0xbef543f14f1aad5e18139eb6, limb2: 0x2c7bcf2fddd1e961, }, w1: u288 { limb0: 0x46fd177379d58e372b9b6f07, limb1: 0x517211fbf41f194c331f00e5, limb2: 0x2f5c91ca28636a00, }, w2: u288 { limb0: 0xe41a3ec01dc8bb8501df492e, limb1: 0xd7f7ab9d0f2782f2373b5314, limb2: 0x91712eca3f77452, }, w3: u288 { limb0: 0x133e5c67a8f2690bc04b91b9, limb1: 0x8582c464e09299148f27b703, limb2: 0x249bfada0b86ef33, }, w4: u288 { limb0: 0xeeb02ca00147f12d2e8458f7, limb1: 0xceaae80445f4c7407c02c1da, limb2: 0x25e046234afd2a85, }, w5: u288 { limb0: 0x64b3d4f3d18031d4235862df, limb1: 0x92f83b81871013f01b47013c, limb2: 0x15fe7761fa1f33ac, }, w6: u288 { limb0: 0x3fb298307f41db600150f88c, limb1: 0x3da094ebafc14d7eb2182997, limb2: 0x818cb4e830ba356, }, w7: u288 { limb0: 0x12ef8a22b1bc73ea237df6f6, limb1: 0x9d344aace728adbd489c9720, limb2: 0x821d3466302b0d2, }, w8: u288 { limb0: 0x638f4928fe9fe06b17f5d2db, limb1: 0x596ab928517338096d96b2f6, limb2: 0x29e68f04a0ee89be, }, w9: u288 { limb0: 0x67f1e11e7d4fea0d7745eb44, limb1: 0x105e36bfdc4442638522b7d5, limb2: 0x2593d5a9dac5df2c, }, w10: u288 { limb0: 0x453ddfce74fe7c8b9bc7ea76, limb1: 0x73264637eb39edbe0400abf1, limb2: 0x2f665b3f82c255a5, }, w11: u288 { limb0: 0xa64871f14a5c040bc6216bc1, limb1: 0xc3071982e7657ce273aafe11, limb2: 0x25c2ccc6a7f12699, }, }, E12D { w0: u288 { limb0: 0x8d5b811a09caa58be413ffdb, limb1: 0xaec13af0ff4aa5a9b3dcb582, limb2: 0xb759534e5c8811b, }, w1: u288 { limb0: 0x8bfd162f232d87d70447c4fb, limb1: 0x5b714a61f27eeeb66210a238, limb2: 0x235eb11b01463a62, }, w2: u288 { limb0: 0xa97e216801ac38c907ba52a0, limb1: 0x70ae4f1968af5555df98298f, limb2: 0x95e6702a59e1a6a, }, w3: u288 { limb0: 0x9cd4ed96bdec2348819310c, limb1: 0x4766b2e8e7e732e7970b9689, limb2: 0x149bdcbd6a7afcb9, }, w4: u288 { limb0: 0xbe702be60291c9e6e885e5c3, limb1: 0xe93a545111f29c9592a036c4, limb2: 0x1591e5e82ed4b4dc, }, w5: u288 { limb0: 0x8d199a3abe5faaff7a3bc9f8, limb1: 0x7cc933e5a020b4766ac8a761, limb2: 0x2fe6b400ae57faae, }, w6: u288 { limb0: 0xaec592ab3c28bfe83c215cfa, limb1: 0xac24f84ed0a437939c2000e9, limb2: 0x1f2843afe30b053a, }, w7: u288 { limb0: 0x6d2d0627cede31c8eb85e75e, limb1: 0x7bdddc87f039012eb3b77194, limb2: 0x178660f13401179e, }, w8: u288 { limb0: 0x62368134bd89bd0f837ed4d4, limb1: 0x6dc31aed6fb226f4b4c0f22c, limb2: 0x24e758c4f9d85d63, }, w9: u288 { limb0: 0x2f1d16930c76c2c58ded454a, limb1: 0xd31b8e954fb055fe7ca38da, limb2: 0xdc52b7ecb883c77, }, w10: u288 { limb0: 0x709c6bce583682d54711f158, limb1: 0xb32e399977ba98f1dbf49828, limb2: 0x1ff3ce291ef8cdaa, }, w11: u288 { limb0: 0xfedfcfb5ac3535fd88a15183, limb1: 0xe97e7b5d3bf6635f37dd122d, limb2: 0x22a38c2aae1e8fc9, }, }, E12D { w0: u288 { limb0: 0x4e15598d95c5f7c52c6b9226, limb1: 0x7260273fb797ec0382fc0b74, limb2: 0x1b4722521d49dd9c, }, w1: u288 { limb0: 0x41a84bd4c94bd9e253b5dbe8, limb1: 0x4f06564a6624a9a4b1f4922f, limb2: 0x154f62ec865e8ec2, }, w2: u288 { limb0: 0x25ed47681b082c51b72e1c67, limb1: 0xfdab86c84aa645fdcc31d18d, limb2: 0x824a28773085f87, }, w3: u288 { limb0: 0x725527ec8d20e00f959c8e4b, limb1: 0x5f0a9b28686d3343669aa6dd, limb2: 0x24b7b0049449f95c, }, w4: u288 { limb0: 0xbbe336284924385760066449, limb1: 0xf34b401046c192b98e0b8e64, limb2: 0x22a2832e9e2adf52, }, w5: u288 { limb0: 0x49e39158392c0ff5930f63bd, limb1: 0xdc907401ccc882dbb3d29c09, limb2: 0x135a779eb01ae2a9, }, w6: u288 { limb0: 0x27f79ea3a7d57234b676f496, limb1: 0x75257d3143963669b9c2f6a, limb2: 0x2b202d6fa27717e1, }, w7: u288 { limb0: 0xff147074bd0eb0177d13885d, limb1: 0x75c3a42b9b267b3842b6b4c7, limb2: 0x54de18ae56affbc, }, w8: u288 { limb0: 0xea9ab70d9faddee08a3d721, limb1: 0x2799218b0495f05389162288, limb2: 0x1b188d8d706d0da5, }, w9: u288 { limb0: 0xc78b4fdfd2c7f08de090785a, limb1: 0xb0ed8ae4c9d8f8cf66b189a3, limb2: 0x3ef3e9bb717b0be, }, w10: u288 { limb0: 0xa95f9089c84967d73eeb7c72, limb1: 0xfcc8b694c6dab512b6097cc7, limb2: 0x185f26ab25337e83, }, w11: u288 { limb0: 0x10a59371fd44cdb8de434ac6, limb1: 0x3c17b135fbcb13d74e419dfb, limb2: 0x278311e97f6ef4, }, }, E12D { w0: u288 { limb0: 0xe7df08107e805939ebd064d1, limb1: 0x84eaf0a72178fea0cd7fdda3, limb2: 0x1a3c2d31a8a1ee84, }, w1: u288 { limb0: 0xac6519066bbcb1864ae2773, limb1: 0xc26038949c313989e0054bbe, limb2: 0x28eb7e83ec81a257, }, w2: u288 { limb0: 0x11e340e6c9fe6671a0adb177, limb1: 0x92b97e720c203dfe72f47426, limb2: 0xb846a3ae27eaf33, }, w3: u288 { limb0: 0xe04834e31217e48f0e8eb14e, limb1: 0x8935efe701ea6319c4ec860f, limb2: 0x13f14982cf2bc20c, }, w4: u288 { limb0: 0x82dc6d9f7406f0a279ef8a56, limb1: 0x51d959b05efad385a218b2bb, limb2: 0x103a320e5b6a9452, }, w5: u288 { limb0: 0x2ed59048aebb44b229f7267a, limb1: 0xc8a4f65f52a1922dec503120, limb2: 0x2d8aad0d7b0b6937, }, w6: u288 { limb0: 0xdf4cb0cb215170ff0a6b3c1e, limb1: 0x18ee79ed0b8c2cd754f322a6, limb2: 0xbd8cb5657cc0178, }, w7: u288 { limb0: 0x440e6b453eda236f95430186, limb1: 0x39d4deb16fd3ecee0a714cf7, limb2: 0x26574156175bc55, }, w8: u288 { limb0: 0x1f4caed0971cc3ed8347723d, limb1: 0x28a247d79794bcee6045e924, limb2: 0x2657b147233a6fc4, }, w9: u288 { limb0: 0xf26b32e9d9a108813f659c6b, limb1: 0x876ed468fa80b8be08c0b09b, limb2: 0x10ca44b2c6d4f9da, }, w10: u288 { limb0: 0xa8ab369559d68eb036cd3db, limb1: 0x723fdc5ac4ca2c61a5a1ffe9, limb2: 0x12199d02a50f2c5, }, w11: u288 { limb0: 0x1a376782048bbe32096ddea0, limb1: 0xa715d036367bef48038ea78d, limb2: 0x14e09936f8a93c9e, }, }, E12D { w0: u288 { limb0: 0x5c840d64ee3e008381f3e04, limb1: 0x243b2760acc2f44649a5b24f, limb2: 0x2e6cfbab4b3fed61, }, w1: u288 { limb0: 0x9743d90c3eef67f5cdf72c19, limb1: 0xf3b5548f9d13f9dc940fa4b2, limb2: 0x13b8b4c7ca5ec4a2, }, w2: u288 { limb0: 0xf97c58447c8b03814fa6103f, limb1: 0x30d22f3e8c4c7d8523c76597, limb2: 0x872b0b5d8b48bd1, }, w3: u288 { limb0: 0x78947a908649525b01ca6334, limb1: 0xcfe0ba68f50e623a89171963, limb2: 0x29503e874bbfec29, }, w4: u288 { limb0: 0x1dae9e71040fd1230c92cbb1, limb1: 0x65a3011a3d4b8129b45eaad6, limb2: 0x81795daa56a29d3, }, w5: u288 { limb0: 0xd7376a308b09572a31465eb8, limb1: 0x9a987b8f5f86b01cd050946c, limb2: 0x1b4cef85ace274fe, }, w6: u288 { limb0: 0x121c88496e9a87e389aabc55, limb1: 0x53070d5039789dbe1ff3c5d9, limb2: 0x6f0665bfd35e8c7, }, w7: u288 { limb0: 0xdd9ddf4069428e4d4bdf5f7d, limb1: 0x6dace55e5658b1bf8c3a2093, limb2: 0x29485c58194eed74, }, w8: u288 { limb0: 0x5ee1da4b7149da261bda9305, limb1: 0x7601e480e9a8d7be7979c77e, limb2: 0x14cffa23faf832a0, }, w9: u288 { limb0: 0xb4e59ad341d4b129ba6ce9a2, limb1: 0xaa1fd997e27e7f4f5fab6918, limb2: 0x157b9b49aca1ab9, }, w10: u288 { limb0: 0xfff92978e32c48590140bfab, limb1: 0xe1cc130cb1566161f46fa326, limb2: 0x11f2a66bd21895fe, }, w11: u288 { limb0: 0x4a8d0b05c8ab2197c89b44f2, limb1: 0x48260cd32fd7d0452d9aa26, limb2: 0x1ff38242cb34892c, }, }, E12D { w0: u288 { limb0: 0x20f9010789e7b152257be743, limb1: 0x41355459a9e13ce010e9491c, limb2: 0x175f282d0d7ac03e, }, w1: u288 { limb0: 0xd61a99e14e1f68ea78858dfe, limb1: 0xdb29e70187d87a8d1f4d27a1, limb2: 0x17afeea1b34fc021, }, w2: u288 { limb0: 0x3c9e6fb3d89216edef33a1d7, limb1: 0x3dd931680d2bb7651f688b2a, limb2: 0x13e86a7233e4491b, }, w3: u288 { limb0: 0x377d4b442701faa12601d1f0, limb1: 0xfa864548c3a1a262fd21db8c, limb2: 0x8c5a91f3fe9bf24, }, w4: u288 { limb0: 0xdc1920a9ba58d700bf2b145c, limb1: 0xd46f80f0104c31aa036d6a0b, limb2: 0x1073f44a4d433e6b, }, w5: u288 { limb0: 0xbe5e796a5bd4049ddad323b0, limb1: 0xe7bc4d5004bad605fd02a27, limb2: 0x3028bf8868ed598a, }, w6: u288 { limb0: 0x40b609fabc6888cab7f4019d, limb1: 0x7bcf89f3bd29e5c43d4f02ce, limb2: 0x16a2865923d5b251, }, w7: u288 { limb0: 0x70655717bb0c1ed90589d31c, limb1: 0xd8f6e54cc87b156c80122aad, limb2: 0x1854b621bdf3aa08, }, w8: u288 { limb0: 0x25e6085c5d718fa434af198d, limb1: 0x243092e705cd68fcd328a2a3, limb2: 0xabda9d2c0c69f93, }, w9: u288 { limb0: 0x12d9ff05f7fd76b25f56ee31, limb1: 0xff2e5068668cbd41d6a8d70e, limb2: 0x30318bdd373e291, }, w10: u288 { limb0: 0x5b6d9d5299e67c2427987d3, limb1: 0x60309cea9bcde182039deaf7, limb2: 0x1eeb35c995c1375b, }, w11: u288 { limb0: 0xf6c6a575126d36fb8016d94a, limb1: 0x9a38ec893c85a4a110a3845e, limb2: 0x2992a2b7e6cd37c2, }, }, E12D { w0: u288 { limb0: 0x2513fcc1815172e2acb78c48, limb1: 0xf1fb049b85c85a858e3796f5, limb2: 0x300c791e8d042987, }, w1: u288 { limb0: 0xb5f548909a82f0ce9b151b26, limb1: 0x8087f9db3ad26d11c3dcd0d3, limb2: 0xbe98e54b599db1f, }, w2: u288 { limb0: 0x1e55ee1359e4dacd0a224ac, limb1: 0xc049969cc268c7302cbbb96, limb2: 0x292939420dc4994c, }, w3: u288 { limb0: 0x9a439ef1b4b8a3e5e0d131ee, limb1: 0x5243b76e0bffe1ad4934762b, limb2: 0x10b7c0e8f5e55d8e, }, w4: u288 { limb0: 0x472318a31d61843dc0ac35a3, limb1: 0xfdc8264ebbe6c3255fd45fbd, limb2: 0x23cab8acf199a2a6, }, w5: u288 { limb0: 0x3c5f90aa19be5ca9d586b983, limb1: 0xcba0d66ca2dc42a68f4136fa, limb2: 0x23d949165118abea, }, w6: u288 { limb0: 0x7aff327e17d6666c7f90c4a7, limb1: 0x2f133759ea769762428ca397, limb2: 0x229a3fc5c84e256a, }, w7: u288 { limb0: 0xe2793380656d37b00873ec9a, limb1: 0x1338f4f95cf705ab40325500, limb2: 0xf5ae003d907d6e1, }, w8: u288 { limb0: 0x85c6f4773db45818f2a0edfa, limb1: 0x11b541412c501fd59d939141, limb2: 0x25f1c74f47ddcbbc, }, w9: u288 { limb0: 0x79f213447462cc95732ff6eb, limb1: 0xa2d558f0e0eca18cfa84426, limb2: 0x1ab5af6e2200b5a6, }, w10: u288 { limb0: 0x7bae196bef0db195215adf17, limb1: 0xd0a4b5dc5a11d37222964f4d, limb2: 0x4f26d49b9bc199a, }, w11: u288 { limb0: 0xb16717e715fbc76c3bac66f1, limb1: 0x3ebe263de3e1a89803bc0da8, limb2: 0xfb0595b5b9d8246, }, }, E12D { w0: u288 { limb0: 0x4691a6b6d8442401fdb5fd61, limb1: 0x1a4aa6fd9f3cfbd122b2cd2b, limb2: 0x254267bcadf6ce8b, }, w1: u288 { limb0: 0xe22fbb9f0206f7b3b78be6ee, limb1: 0xf6e0deb6e65d40117da6b2fd, limb2: 0x2a4f1a801c3cd205, }, w2: u288 { limb0: 0x163800b0a0c25286cf11a38b, limb1: 0xac61df59604318c6fcd74d67, limb2: 0x1a9633d30804c9cf, }, w3: u288 { limb0: 0x7333b8203f73c7c30b504051, limb1: 0xa080c3854f1a6a8a917b0366, limb2: 0x276eac4715fb20ca, }, w4: u288 { limb0: 0x399e6af618d4d4f3d6b6df5, limb1: 0xc75b47790bdefc3a4c3f9514, limb2: 0x29d9317f2b639acd, }, w5: u288 { limb0: 0x3c127769d3815a3c70c1ee1e, limb1: 0xfd2b1eee94f11e14c21a9358, limb2: 0x350f2baa271499a, }, w6: u288 { limb0: 0x16ad4469d442f5ad7e3a969b, limb1: 0xa319c77cf65f5ddf06c79804, limb2: 0xfc01932cb22cac6, }, w7: u288 { limb0: 0xd3ec2fe1d535457c02b0abdb, limb1: 0x9336d37bd33818f9e69963f8, limb2: 0x221133208264ed33, }, w8: u288 { limb0: 0xba4ad8aa28c47ead56764d20, limb1: 0x60ea71535c537102ff8591aa, limb2: 0x99bbc9915f4f422, }, w9: u288 { limb0: 0xd10f7b7b93fff77a5af1c82a, limb1: 0x54501ad6471fd3ea73f001d2, limb2: 0x218c4075b09ef652, }, w10: u288 { limb0: 0x6656f1088f37e6bae8831fe4, limb1: 0xd3542728908036bec18ddee4, limb2: 0x16fe23702ee4af80, }, w11: u288 { limb0: 0x8bf6a24658757bdf96918d6d, limb1: 0x1e72bce9091c22a645562e32, limb2: 0x1856aa098aa33d63, }, }, E12D { w0: u288 { limb0: 0x5eaa057c5e9d338929a7ad43, limb1: 0x7ae96e982db7587ba91a1736, limb2: 0x72cb1aafef8fc8e, }, w1: u288 { limb0: 0x1bb7723ff47ccb109a4226ec, limb1: 0x328efe288a27af15b2af6381, limb2: 0x2dccf1917c988cef, }, w2: u288 { limb0: 0xcc638278fb869f3c6930e578, limb1: 0x685535107befb2dbff15dcb0, limb2: 0x1552b4647293ddad, }, w3: u288 { limb0: 0x6a2bab4ed331aeb86499d23f, limb1: 0x3e6ac194919d26afeae1c7e6, limb2: 0xa3bd7d404906b4a, }, w4: u288 { limb0: 0xd0f18a8f6bcb2c54d031eae7, limb1: 0x428e6f2b4d1b1d15ecbfeaf5, limb2: 0x2f7d795e0c7bb871, }, w5: u288 { limb0: 0x9fa385290e5a47297dba3917, limb1: 0xb79650782cdb39ff5a1f208, limb2: 0x15d475f38ea7476b, }, w6: u288 { limb0: 0x7bb49cca7dfd0cb7e3f79b2c, limb1: 0x8c7bac4c06a9d05c2accbd03, limb2: 0x1fa0d8145555736d, }, w7: u288 { limb0: 0xf736aafbbf8cd7e7c4065e91, limb1: 0x43830e9122457788cb86d1ab, limb2: 0x135aa9aaad9954db, }, w8: u288 { limb0: 0xbed546ba0b8744fcb9d52660, limb1: 0xfbc7f3baa7c7119fcce3e80, limb2: 0x15a9f9b27f95df27, }, w9: u288 { limb0: 0xb4f28322f24bab28cefc2b81, limb1: 0xbb67c1a9879e054fb1dd9bd3, limb2: 0x6dc479b44e4a35, }, w10: u288 { limb0: 0xc55900f2e2fcb03d4745b72e, limb1: 0x789b848782d349549f5f1e85, limb2: 0x13a9a01aff27a9ae, }, w11: u288 { limb0: 0xec2faefd68343ff84384d5e8, limb1: 0x1a7cf79c9cfdf71ef2008e74, limb2: 0x29c5f1ef7cfa4e48, }, }, E12D { w0: u288 { limb0: 0x7da07b86a17f90a2b01f070, limb1: 0x32e6cbe8bb76431d030b6541, limb2: 0x169136ca3fcbd52e, }, w1: u288 { limb0: 0x14b5cdc5d62216c47192de8b, limb1: 0xd1e61add783e061d23aa8b5b, limb2: 0xd15a28ca328e478, }, w2: u288 { limb0: 0xc481cc31c16863df81e8b67d, limb1: 0xe43107afa658bd6eab99baad, limb2: 0x2dbb3774b86ff414, }, w3: u288 { limb0: 0x2b792a9e9477d0720b49c556, limb1: 0x6ee0355be00472bf4c29595c, limb2: 0x1250c722f7dce651, }, w4: u288 { limb0: 0x4f155753d7ca72726d9c5ede, limb1: 0x68c513a27a582318aba863b2, limb2: 0x268c4cff2a0868af, }, w5: u288 { limb0: 0xee23384132ef355ea4c9cd2f, limb1: 0x769a778520242fa9be2b4b86, limb2: 0x619b6540902c8da, }, w6: u288 { limb0: 0xcf619319e7da22d2d87ded3b, limb1: 0x55bc420f357a9f9af7f3fc27, limb2: 0x2c6d25af354a8c0a, }, w7: u288 { limb0: 0x897b30003ba50ceffa155118, limb1: 0xcd16b98450f6e704b376af36, limb2: 0x387312925d56e5e, }, w8: u288 { limb0: 0x1547ce758af5caac5f3cba19, limb1: 0xd2759b5209f5ccde276ae2b9, limb2: 0x8bebfeee0e486ee, }, w9: u288 { limb0: 0x158e0f0bc8649c7c9458ccf5, limb1: 0xf20a2eae3793c6df722b69bb, limb2: 0xb7e139783caa97b, }, w10: u288 { limb0: 0xb214433bcc9c61f41a672fe5, limb1: 0xae856be4ca18bfeeb97256e7, limb2: 0x2ff69682f9db28ad, }, w11: u288 { limb0: 0x8cbe2f6182148a74244954ac, limb1: 0xc968190da741992ceeeac286, limb2: 0x296c04958814178f, }, }, E12D { w0: u288 { limb0: 0xaabe5805d69bcf87faaa0624, limb1: 0x478fadd1e2384b0d94ffd427, limb2: 0x1778a52ea6419cbb, }, w1: u288 { limb0: 0x3a2bb7367f836fd33e72bc42, limb1: 0x9ed4175a04e317113a9bf7cc, limb2: 0x1bd3b89c53bba237, }, w2: u288 { limb0: 0x283ba112d1a901a2963ebce9, limb1: 0xb88b6d8c90c32641cd8de77c, limb2: 0x4330ff81bbf1aaa, }, w3: u288 { limb0: 0xef466974e62e9d7175c4cb8c, limb1: 0x96bfc81d65fe336227113e7d, limb2: 0x231f3ab8575b8204, }, w4: u288 { limb0: 0x6032f7ceed8d763a3c16ca06, limb1: 0xbd357cd0947f134569dd65c, limb2: 0x24d6a3c8b70196e5, }, w5: u288 { limb0: 0x4d47e505d9d4281c38d84f9a, limb1: 0x86fdc9b122276e23bdaef6c4, limb2: 0x2d2a5a3cfec76827, }, w6: u288 { limb0: 0x10764f6301da0139409355eb, limb1: 0x169023ab7ba2af2701d8ee7, limb2: 0xa8fd0478a5bd5b3, }, w7: u288 { limb0: 0x36fbb7632c5e32ac4d439c06, limb1: 0x77e68a927e6bf7b50f468589, limb2: 0xd712970fe77ed33, }, w8: u288 { limb0: 0xc6333c4fb88e300a722635d2, limb1: 0x3bd0a9d311c8a7a2a831fc13, limb2: 0x24a2803265596f98, }, w9: u288 { limb0: 0x602f27f3c41e13f70ec306ac, limb1: 0xa2d9c70458bc21b31e4e8bbb, limb2: 0x2318628ab88e0d2e, }, w10: u288 { limb0: 0x31d07509de71e84d70fc3597, limb1: 0x63a67db560e7854c1b9ffbe6, limb2: 0x24630165d03ca7e4, }, w11: u288 { limb0: 0x7f01293d47393ed8f8faacfd, limb1: 0x693d55d27d34d8d82a45ded6, limb2: 0x2e982efc254e90e2, }, }, E12D { w0: u288 { limb0: 0x7a0151622f32149cc39127, limb1: 0xb7d82d0d7cbfc0854dc18a81, limb2: 0x15121c24c444fb2f, }, w1: u288 { limb0: 0xfe3069d46d030b7bfeb319c7, limb1: 0x92e43b1c259b05e959a29443, limb2: 0x2f82238cefd08b68, }, w2: u288 { limb0: 0xffacb1a6cd1e11dec597ebce, limb1: 0xd482f37e951b21ac15bda39, limb2: 0xd4d51a607e5c451, }, w3: u288 { limb0: 0xc8c7f69a0db529acbb725a01, limb1: 0x56ba1fcd17ca509c764236b9, limb2: 0x266c3b87a040d37e, }, w4: u288 { limb0: 0x4571f5a426917bcc6db587c7, limb1: 0x37b7677a534ffa0b66876d0b, limb2: 0x242bb826f4dad2b9, }, w5: u288 { limb0: 0x3b306aacc86c5e63e826c06, limb1: 0x71a1e66a7cf1dd9abd8f6be3, limb2: 0xf55d9b7d527f5bd, }, w6: u288 { limb0: 0xc2334694e7214460556de85d, limb1: 0x44f339ca483ed2f8e20760e0, limb2: 0x1543c07af87205ef, }, w7: u288 { limb0: 0x193cbdd9bd6c91872b1446e8, limb1: 0x390ed7d90a9e41dd08eb0563, limb2: 0x69314f2882ec9bf, }, w8: u288 { limb0: 0x3e0e5deb39dfbceb0c50cccb, limb1: 0x5359859220ecaaed1bb1d8d5, limb2: 0x2c243e59d1644b8c, }, w9: u288 { limb0: 0x63a83a2e6ee175fe65f5b650, limb1: 0x6d0dae1d5b365f909737b583, limb2: 0x2e16f1774475930e, }, w10: u288 { limb0: 0x4bf38c8f50cf94e94ac2eefe, limb1: 0x91db1898abcd99d2828dcd2b, limb2: 0x2a7826645be14d28, }, w11: u288 { limb0: 0x88d5c83684006468edcfb23a, limb1: 0x52c496f1f5f22ebee63f5006, limb2: 0xf75dc2e7a584b21, }, }, E12D { w0: u288 { limb0: 0x1d5b005c0f05c5913d89d3b8, limb1: 0x1e9c6e293e242c3b4c758f7f, limb2: 0x303cc3f8883df373, }, w1: u288 { limb0: 0x97919a6105618116083ae38, limb1: 0x548b96828190b58631bd017f, limb2: 0xd62fd4a5522751e, }, w2: u288 { limb0: 0xb90c093c24bd6b00dcaef48e, limb1: 0x332793bc6fe8daec55a499e3, limb2: 0x1a62c1adf27dcf4, }, w3: u288 { limb0: 0xed9979bdbc911880b0f2993a, limb1: 0xb9b3d9a78d1ba75a2054dcb6, limb2: 0x1139bc2af9fc7062, }, w4: u288 { limb0: 0xd01ad4e199459d8cfb34022d, limb1: 0xaa55da20d2c29e4f72e8428f, limb2: 0x19408bc263e8c5e3, }, w5: u288 { limb0: 0xe6b6ec6c97330d7bd862275e, limb1: 0xfc7647d2e15333b7f1dc16df, limb2: 0xe8505d43bbb0de1, }, w6: u288 { limb0: 0xac1553394c20ce85bac73bc9, limb1: 0xfd38aa3ace7885aeac4f9c51, limb2: 0x14bf831b8d59488a, }, w7: u288 { limb0: 0xe7b696d082fe6624d2f66473, limb1: 0x19efee72fac6dc76acb45556, limb2: 0x2c27a0376c0c6cd0, }, w8: u288 { limb0: 0x587829d461e3ac5dd4c122b0, limb1: 0x1489d76e7d359134feda6f9d, limb2: 0x2bf00f05d6d34be6, }, w9: u288 { limb0: 0x68c5607a34b7e03c4ad3e625, limb1: 0x34a43c63330e1744beef8754, limb2: 0x56191473aed3f7, }, w10: u288 { limb0: 0x9b9361a588fabd5162e75e94, limb1: 0xbca7aeef2e209ac40e230e6f, limb2: 0x241e1b5b17b02573, }, w11: u288 { limb0: 0x6466ba52d605bf43dcc711a6, limb1: 0x4fd443195501e425d1d0dc3, limb2: 0x2b1b1a35b478f840, }, }, E12D { w0: u288 { limb0: 0x37359d1ca3169479a4787c63, limb1: 0xe6959b34e4552a7091baa5c2, limb2: 0x251e2d6fc02a0dd1, }, w1: u288 { limb0: 0xff5382744072d73ab25ff20d, limb1: 0x899afcd9d3ae5e06050f28f, limb2: 0x69671dfe2d55cc2, }, w2: u288 { limb0: 0x4c5bc5ee2d1c3c29908f93b9, limb1: 0x818cc183be27df97d8e39ad3, limb2: 0x136a07953bb41b63, }, w3: u288 { limb0: 0xc8ba1092a51526df08511ece, limb1: 0xca463cae871d2aa4f117545d, limb2: 0x2ec243402bbea649, }, w4: u288 { limb0: 0x73459af87f990777dd76405b, limb1: 0x9167416ccd1679acd9c0dc19, limb2: 0x25d92fc30a1b3c13, }, w5: u288 { limb0: 0xe7d616bf546a691f57deb700, limb1: 0xb6ee6aefa4852dc03975ecac, limb2: 0xb46a9fae190dacc, }, w6: u288 { limb0: 0xc858c3ec3ca78161afa95440, limb1: 0x88e7ab9779f7b3100a561d0c, limb2: 0x4646ce8e109b9ec, }, w7: u288 { limb0: 0x6078ed80374f164838d05309, limb1: 0x49036f0001a89a5411eacecd, limb2: 0x17d15ad5a21e80c, }, w8: u288 { limb0: 0xfbf54aa1649f1360f628f647, limb1: 0x873566f2575908c732fa2601, limb2: 0x8081b2cbe570dc9, }, w9: u288 { limb0: 0xdd3685fd23d83f41b8fef63b, limb1: 0x570af8337c272785be94352a, limb2: 0x24153962f93d7ca0, }, w10: u288 { limb0: 0x6b6fc38cd84153e3d243c8eb, limb1: 0x70e90d7590bb138f44afe58a, limb2: 0x27de5024e0c84f0c, }, w11: u288 { limb0: 0x3fdd6c208244f367bff5c112, limb1: 0x91e2f705ede749a13823072b, limb2: 0xe1375efaa7677ef, }, }, E12D { w0: u288 { limb0: 0xff28b79435eb24678e3c8eb2, limb1: 0xc0ba0a6fad1811714d5c9c79, limb2: 0x303a480b499d41e7, }, w1: u288 { limb0: 0xfa7877caa1e87cb6765e080, limb1: 0xa17c36fc7d0139b6b04e701b, limb2: 0x100468da3cdddbdf, }, w2: u288 { limb0: 0x556a84f960de5f80740c18f1, limb1: 0xbc003e85b28d9419b1321c41, limb2: 0x2486957161a92fa6, }, w3: u288 { limb0: 0xee123f2e218e5fc7636d043b, limb1: 0x2b4620d525e7c98b54118214, limb2: 0x1ced0e32a4c0e974, }, w4: u288 { limb0: 0xf456e317add8dd976e4f5ec3, limb1: 0xe1f85ddcbcd7b5d860ee1fbe, limb2: 0x20bdfcffe9078da6, }, w5: u288 { limb0: 0xa2e12460aebe22abbb6623d, limb1: 0x3243bd5a49f9c15ce84b992e, limb2: 0xa794ff503d2eb58, }, w6: u288 { limb0: 0xb2013aea1419e59761f6c6b, limb1: 0x18c41d13e9b5ae46b4fbe2c5, limb2: 0x243e8aea6f4bc41f, }, w7: u288 { limb0: 0x834bff6b7ec9caf258fa8481, limb1: 0xd5e3f6fb4e5949909942a836, limb2: 0xf5651e38a53058f, }, w8: u288 { limb0: 0x2392f32d40ef4fdcb8f7bde1, limb1: 0xd92211269e6981a3796f748b, limb2: 0x1cdde6b416be4e91, }, w9: u288 { limb0: 0x627d6f1b96532fc7f042aa71, limb1: 0xbc546773f537f33e8088aa6b, limb2: 0x165110d82726d415, }, w10: u288 { limb0: 0xd218510f5366a09241344258, limb1: 0x5687f91e9d385ff162a2ca58, limb2: 0xa3e9521fd2d3236, }, w11: u288 { limb0: 0x96ab37c321ac8988f874caf6, limb1: 0x1d6deccbe79c563f085d2193, limb2: 0x2f84f7ff1d8e8ee6, }, }, E12D { w0: u288 { limb0: 0x5f32f9a8eeade34241b12810, limb1: 0x133593b9a4a6f381aada074b, limb2: 0x19a32273e388ac99, }, w1: u288 { limb0: 0xbb69e4856293ec3d92e7d805, limb1: 0x14b85538654531e02cc5932f, limb2: 0x2491b31e28bd44cb, }, w2: u288 { limb0: 0x7d82d03af6f8c76c427ba75e, limb1: 0x967b04b92b39941ab44d08d0, limb2: 0x2ed3f4a2944bbc22, }, w3: u288 { limb0: 0xa67689abcb222c5eb04f50c2, limb1: 0xe0d373c25972b07e166bbcea, limb2: 0x1a446eebcb6a1bee, }, w4: u288 { limb0: 0x144f30062c10c29bc8be47e4, limb1: 0x64ff3ba7a156ef19d36084b, limb2: 0x1cc5ff275bd1ad9f, }, w5: u288 { limb0: 0x4056c33c3a351381152ed01f, limb1: 0xb7b9abe58c58333fc5e0adf8, limb2: 0xdc9e6ce6f13cf11, }, w6: u288 { limb0: 0x859bc9e4ea2fc918100b2aac, limb1: 0xc35b40b2582eadc5a1bfe918, limb2: 0x26298d0dffc77744, }, w7: u288 { limb0: 0x291737ba242cd9b07c66d388, limb1: 0x333115d29458501e74089135, limb2: 0x19226600b340c7ad, }, w8: u288 { limb0: 0xee5f0962e034c8abc8d0ba4d, limb1: 0xc7427067383034c39b47f730, limb2: 0x2ae92f519b17a927, }, w9: u288 { limb0: 0xadcd32340a46dbcdcf713132, limb1: 0x14238f7af8998c11c93864c3, limb2: 0x2d78f33e6b135046, }, w10: u288 { limb0: 0xccce7f0390dcb48a4fc658a, limb1: 0xb02ef39422aed2a4dd9d99c7, limb2: 0x22b7c12ee728e4b0, }, w11: u288 { limb0: 0xa55e6345f04363f98e39d62c, limb1: 0x83304eb48f67c3e63068f9, limb2: 0x1b26fcc2e690d30e, }, }, E12D { w0: u288 { limb0: 0x78827305894f7d7c8cb42cd8, limb1: 0x603660b8ffde85ba43f25540, limb2: 0x1f8bbd81eceac6fa, }, w1: u288 { limb0: 0x20d1c2265d7c54a7c13d661f, limb1: 0x5a6375fef487fe0e27db784f, limb2: 0x11c961fd171a5f7f, }, w2: u288 { limb0: 0x6c3b26607fea356bde658104, limb1: 0xf70ad1941455882811fe366c, limb2: 0xbf839d2222b9e50, }, w3: u288 { limb0: 0xf2d7051b992886c2de350c7c, limb1: 0x559005099aae5b1e262c07e9, limb2: 0x1add5d82450dbff0, }, w4: u288 { limb0: 0x56cda0fca379e7b056f95ebf, limb1: 0x103bb7ec80c51b58ea745255, limb2: 0x1508ea36a5f7ad14, }, w5: u288 { limb0: 0x8ecd2696af2a0932ff92660f, limb1: 0x200362b96b74147636a81336, limb2: 0x2857fb636f1f4016, }, w6: u288 { limb0: 0xfec4a1335fdd5fd059a8dd8e, limb1: 0x75c2b9cd1be202f40e13c3d4, limb2: 0xbb3d42cdbcbd58d, }, w7: u288 { limb0: 0x4e763270d3457d2f36ffc8bb, limb1: 0xd51b5ff1fa57c35d5c9fccd7, limb2: 0xfb41479fa0f3e95, }, w8: u288 { limb0: 0xf3d9559364d6b5acabe4fd40, limb1: 0xa442dd432e5e47e74e99435c, limb2: 0x207acb81831a892, }, w9: u288 { limb0: 0xcb48f0d150ce1d5da376de1c, limb1: 0xda6dcb76b3d2babe3f7c0af3, limb2: 0x29de187ceb63f010, }, w10: u288 { limb0: 0xbd50ea4093b9a099bb8a9ef8, limb1: 0xbfb8d8b5eeda12c6a0e3711b, limb2: 0x2de77f287de6bb26, }, w11: u288 { limb0: 0xd4ac588d5c0eaafc31b2a954, limb1: 0xd4ee68fb818201cd7e229bb6, limb2: 0x4f268dcccb4c9e7, }, }, E12D { w0: u288 { limb0: 0x336e696338af25774cbde6ba, limb1: 0x69dc4b06614375293bcddb42, limb2: 0x17bed31b51d2bccf, }, w1: u288 { limb0: 0xee67b2a9992ca2297a33680b, limb1: 0x1d3067d4e8bb0562cfc0e586, limb2: 0x2cd961c43819130e, }, w2: u288 { limb0: 0xba1d54e30e624b6576fa30e4, limb1: 0xa664731781f4d006a5e8f83a, limb2: 0x1acc8a751e4fa7c5, }, w3: u288 { limb0: 0xe4c3723499688f9a8dea5008, limb1: 0x26989a78c35cc577065d49ea, limb2: 0x25aa6ae3c7e3ca0b, }, w4: u288 { limb0: 0xbf23d984a1987abc8698d6fe, limb1: 0xdd4d0bf7124d07e5bdb0ccbf, limb2: 0x120468245f03f2c5, }, w5: u288 { limb0: 0xb7ce1be795587bce1bec22d2, limb1: 0xc1741799c9616ccbda199640, limb2: 0x18e8aabf72cf2545, }, w6: u288 { limb0: 0xcf933e271bebd4985302d609, limb1: 0xe2765fd44c8c12899cdeafec, limb2: 0x2469cab8cca6a721, }, w7: u288 { limb0: 0xf4e8330657ffd4d21e3489ad, limb1: 0xeaa193edb41eca1d92439dff, limb2: 0x2bdca29cc4f5e24f, }, w8: u288 { limb0: 0xc1bbfb6aff365e98d6f377ce, limb1: 0xd798f860fbf687b45aedbcb, limb2: 0x1816a7d7508073be, }, w9: u288 { limb0: 0x1751153c6447e4dd744cb3d6, limb1: 0xb5575d0d3a63675f38f68fb7, limb2: 0xcf079455eea2772, }, w10: u288 { limb0: 0x9103d7708c70e7ca7c1afb54, limb1: 0x269475ce46651c528d3ba3b0, limb2: 0x1612bee0a4422ef0, }, w11: u288 { limb0: 0x7e74e496a46aa542d7ba3398, limb1: 0x38381d151f53772b3c7b6ac5, limb2: 0x2627da3091fe9618, }, }, E12D { w0: u288 { limb0: 0x4a472c78419727c213f1ecb7, limb1: 0x52e7713a969eea3195477e0d, limb2: 0x2452ff1793e9989f, }, w1: u288 { limb0: 0x5af2af840a414c07f88aafe7, limb1: 0x84d438781dc331e9f8dbe5c7, limb2: 0xa08c364dac40aa7, }, w2: u288 { limb0: 0x7544947cd54dce3b7db3f88a, limb1: 0xb21db0825eb2c743a0974622, limb2: 0x99e9f9e14609b3a, }, w3: u288 { limb0: 0x3df463ae1c6f6e33af40b4ed, limb1: 0x6e6bf88773cfb5481ed3a5ef, limb2: 0x18093f68aa581ebb, }, w4: u288 { limb0: 0x2e9083725e6fafe12ada88db, limb1: 0x5c7f7db97c54dd97d496e7dd, limb2: 0x169da8674967384c, }, w5: u288 { limb0: 0xc3e8ae8e4f6250be5ce5700e, limb1: 0x551ed24f2d0023c301973675, limb2: 0x4d06cb38306e620, }, w6: u288 { limb0: 0xd07fd97a4c34b22e94e00333, limb1: 0x44142bc7fa2c3c38bd001770, limb2: 0x26cb2e67195220a9, }, w7: u288 { limb0: 0x4d74de63b523c2d231d42069, limb1: 0xb755b6feb43d9e3b85679a26, limb2: 0x8ef130214a48a61, }, w8: u288 { limb0: 0x92d0adc0007a60452b2b1d1, limb1: 0x6ebdf8fb1be942eae576175e, limb2: 0x1487691fffafabad, }, w9: u288 { limb0: 0x3da0ccf413998d4af4fff3c2, limb1: 0xaae02debc708b689df0b0507, limb2: 0x24db0f80bd712d56, }, w10: u288 { limb0: 0xe0cf1a580089999c4ee222c0, limb1: 0xbf0ae87f88101f422985bd99, limb2: 0x12f407eec0475734, }, w11: u288 { limb0: 0xc8783d4bc08a2731ab3bfa93, limb1: 0x7d26093e383c18102ae4cb0b, limb2: 0x1f96be2222d525ac, }, }, E12D { w0: u288 { limb0: 0xda5fa34846746a819c442983, limb1: 0xb0cda896f70d81847cc85ed8, limb2: 0x16f7dc8dd816b6ef, }, w1: u288 { limb0: 0xd598894ff54bdafbad9f94c6, limb1: 0x67341e698880b16e06df5b4, limb2: 0xe0a2eba838a6862, }, w2: u288 { limb0: 0x2d4fdc3d1173c7dfb46e7170, limb1: 0x4a30acf8b62d37adef886fec, limb2: 0x2f262ecea836ecc8, }, w3: u288 { limb0: 0x4d2de3a485f44ce40095aca, limb1: 0x4f6ebf38f1b4a74b022a98ba, limb2: 0x2b98abba58a8b9c0, }, w4: u288 { limb0: 0x99eec2af9a4b45e84482053a, limb1: 0xdef95a01ab7f2212fd6f0ddf, limb2: 0x20ca7118bbba9b13, }, w5: u288 { limb0: 0xf62ca396c4cd4f9a37c0ec41, limb1: 0xf80e07d6f2016fced6c1a99d, limb2: 0x27e0a522003ad386, }, w6: u288 { limb0: 0x31af536e3dcc88a84fc144d, limb1: 0x48f7d70e0e9d5af9cbaf031, limb2: 0x2f1467cd5d03c065, }, w7: u288 { limb0: 0x4b8a521ef408c203f233db65, limb1: 0x50bfacca6815a45eb7cabce8, limb2: 0x1340f48baad171ef, }, w8: u288 { limb0: 0xb74e02f678431063c3f330c9, limb1: 0x48c8b7fb6de93b918a05dfa3, limb2: 0x19d05aab262398f6, }, w9: u288 { limb0: 0x4e020ba19bfe30be269bc882, limb1: 0x309357da0126dcc065d540a3, limb2: 0x1b5842e9443aad53, }, w10: u288 { limb0: 0xaf0d9cd44dcdb29271788d84, limb1: 0x655b4319e3a14fb30daf866a, limb2: 0x25d96272a676a0a5, }, w11: u288 { limb0: 0xcf12e3f075ae79dd26bf1616, limb1: 0xb383301919d9fa2d99fd0ab3, limb2: 0x229dfa1b1e366c8c, }, }, E12D { w0: u288 { limb0: 0x62979183e1e24b624116a174, limb1: 0xbdba041021322754848f1d61, limb2: 0xa476d754210008a, }, w1: u288 { limb0: 0x4287ad8fa4e3fda207b68f52, limb1: 0xcd665ac9b975b2aff1f8dd08, limb2: 0xfe07d087ed107ab, }, w2: u288 { limb0: 0x308669cfeafff59899fa785e, limb1: 0x829fc34300d1e178417143de, limb2: 0xd874d7418c3b242, }, w3: u288 { limb0: 0x675789df45cb28ed6b2f322, limb1: 0x6829dd797f7f7a6f1fc6bf04, limb2: 0x268ec7b4c8e79e67, }, w4: u288 { limb0: 0x5b0a25b74c83183bc84f5d0e, limb1: 0x6c375c7e4a8f194cfcc07c38, limb2: 0x21dd433dcc0e0ce5, }, w5: u288 { limb0: 0xa042285feb04a253194546ae, limb1: 0x36b0350cc940c7e0f0a1ec94, limb2: 0x2b85fd9d9e053b76, }, w6: u288 { limb0: 0x2b65196fb3229731e0e0639c, limb1: 0x5365707554bc24f77ea1439e, limb2: 0x73310d2feb86b4, }, w7: u288 { limb0: 0xda9afd8f517d9c0088de82a6, limb1: 0x3a334adbafdc8c0fe20dd788, limb2: 0x12bc5ca2182ea4c0, }, w8: u288 { limb0: 0x30f3db4d6495b2ae35511824, limb1: 0x96e95c10e585fe2e57ce7be8, limb2: 0x1fca4754d1120ebf, }, w9: u288 { limb0: 0x411d4e59d273304e5653544, limb1: 0x2b76a536fa12d1623f35eaa5, limb2: 0x1f9ebab7aa9085b1, }, w10: u288 { limb0: 0x21016f80ced8c3d9272193ab, limb1: 0xdd9f7de1487853a3ac2db25b, limb2: 0xfb3e5578686ac87, }, w11: u288 { limb0: 0x7c123e62ef78fe69adf00547, limb1: 0x468ac789efbe486f5b24bdae, limb2: 0x2d5f9d45750a66f9, }, }, E12D { w0: u288 { limb0: 0xf49ddda8e747747083079d37, limb1: 0x68a320e1b5f8a55def8eb451, limb2: 0x1d8d87d7afc034c6, }, w1: u288 { limb0: 0xd0e8f83930e790d0cf7aa4f3, limb1: 0xdc51e7ce79d82f0986e755e3, limb2: 0xb35f2092f80a77a, }, w2: u288 { limb0: 0xd9e56962870a50e84be40dd8, limb1: 0x9f1423b923aef765c9073547, limb2: 0x2407cef32c374634, }, w3: u288 { limb0: 0x8a6e91e2640524e91ca9e5c0, limb1: 0x60cfea5268e4f21f3c9385ba, limb2: 0x2d57872e784ffe8f, }, w4: u288 { limb0: 0x610c92d3030b34c8fe759af4, limb1: 0xccef054c52c61f91aec59117, limb2: 0x2a7fdfb70893c87f, }, w5: u288 { limb0: 0xdc3871296f6b5fb090ff3d84, limb1: 0x7a2b2003194e22958c65aad, limb2: 0x11330e4b772d813, }, w6: u288 { limb0: 0xc2c316717393e539996e2dfa, limb1: 0x6dbced58e49bc602d3ecb633, limb2: 0x2b493ea7f055a49f, }, w7: u288 { limb0: 0x4e7a8676b9ce8022f6546955, limb1: 0x8d4e830787b1fde166a8a9df, limb2: 0x1e95fcd6da158d5f, }, w8: u288 { limb0: 0x61aeabf44d5b761527cd6678, limb1: 0xdd5f062d6ff2ff617a9bade5, limb2: 0x2e9d36256b9199be, }, w9: u288 { limb0: 0x27a4291e6987daf0dbe6e8ae, limb1: 0x84b47163847a8f4d8682775a, limb2: 0x27cdc91e5d2053dc, }, w10: u288 { limb0: 0xef2510a74d7892233c254ea, limb1: 0x7cc4faf9b18401574a7fd4c7, limb2: 0x9da984836efee50, }, w11: u288 { limb0: 0x21081127deea91bde61024b2, limb1: 0xf193ac5ac85dd5ec608e1907, limb2: 0x2a555324963199e5, }, }, E12D { w0: u288 { limb0: 0x231431a681ca1912d93c493c, limb1: 0x7cd5100d863f21b7b69548cf, limb2: 0x6be1a88eb32559b, }, w1: u288 { limb0: 0x26fe843824491895c70e6492, limb1: 0xad3f2925ef00c47f85f0c5cb, limb2: 0x1c25f399327375f2, }, w2: u288 { limb0: 0x1d64a276a7ca6a07f378c73c, limb1: 0x2d2741e0d465bc545054a3d8, limb2: 0x1bf7749bd948c147, }, w3: u288 { limb0: 0xd28017558ebe08c23c711eb, limb1: 0x49b4bfd3c9086160e68f932a, limb2: 0x7c63194c9b2d822, }, w4: u288 { limb0: 0xc66f31af760d6d857ef14191, limb1: 0x3d37853c09dfc5735f6ab95a, limb2: 0x4c9d5f418fc2eca, }, w5: u288 { limb0: 0x9d28f5110dcb53d41cb6a236, limb1: 0x4b42d62aba0e8095600662f9, limb2: 0x222dbbf0d045f1e4, }, w6: u288 { limb0: 0x855491cbc4c074f566c1ff07, limb1: 0x3d2ad6ec1c1b07319336b1c0, limb2: 0x2216d43a7fc3d867, }, w7: u288 { limb0: 0xa2d181effcab2485fd0929b1, limb1: 0xbd1dbcdda521d518016ab038, limb2: 0x17da64f8a088f289, }, w8: u288 { limb0: 0x7e4609531a9a80575e4fc446, limb1: 0x7fc0249541f923b62c80b7ab, limb2: 0x1b1f3ca3a35aed95, }, w9: u288 { limb0: 0x6bde512b2db44cc14aaab80b, limb1: 0x3332a36522218d5054b2df73, limb2: 0x16cc444aacfea675, }, w10: u288 { limb0: 0x9d073f56f1ef70e1409f958f, limb1: 0x11ef505741b46c711501e196, limb2: 0x37e686418823710, }, w11: u288 { limb0: 0x7d2b23008dd91058e4fe64f9, limb1: 0x914180e46029b050930de287, limb2: 0xcae32e2fb03a1cf, }, }, E12D { w0: u288 { limb0: 0xec5d0a0dbf26b9244185606, limb1: 0x2577b931ba5d8d5cde41b68d, limb2: 0x5e96e308db4b280, }, w1: u288 { limb0: 0xbaa744f3269430ce568e50bd, limb1: 0x60f2b1523bf010f9abc7a2c8, limb2: 0x8e4f258d7ed76a4, }, w2: u288 { limb0: 0x2342a9e354749981838268ee, limb1: 0xaf2ecea58318aed3b37f5692, limb2: 0x291525813b88babf, }, w3: u288 { limb0: 0xdc734db514a13e85b5204e5d, limb1: 0x122d47c0509cc9315fcc9d29, limb2: 0x23d67f47908d3e5, }, w4: u288 { limb0: 0x56558781f1a6382f991559cb, limb1: 0xd87862bbd0f987a16c7df25d, limb2: 0x7281838826ccd22, }, w5: u288 { limb0: 0x288fc284a7951c14de8da86e, limb1: 0x69d04a96c38b3cc0548f7544, limb2: 0xf60950d3a14b67b, }, w6: u288 { limb0: 0x318952aeb73d7b08c5fe781b, limb1: 0x901f81c957993437980ea613, limb2: 0x119433627695ee93, }, w7: u288 { limb0: 0x595a69d331001fb9c7a9f006, limb1: 0x1e4cc5c97a405d3e3f5b53fe, limb2: 0x1348746ac61470a, }, w8: u288 { limb0: 0x9c061b99db93b1ebce5d9fe6, limb1: 0x1cfe992ec44f28737dff910b, limb2: 0x2ef11c4ef77570ee, }, w9: u288 { limb0: 0xea82ad0d20f75a7fcb7131a, limb1: 0xa08d4a3e487358d11c698ece, limb2: 0x1b26098d599d7ae1, }, w10: u288 { limb0: 0xc022d7a34d19af209e5bd73e, limb1: 0xe7579941b62b48517495a22, limb2: 0x4624fa9f3c5da9a, }, w11: u288 { limb0: 0xda5e34b4246623fb0f08bbeb, limb1: 0x5b88dd2c5f4e947261dbf571, limb2: 0x14fb70e3a5644ab9, }, }, E12D { w0: u288 { limb0: 0x37435bacb68ebcdf3ca0f9e6, limb1: 0x95680e9183aeea980381c2ff, limb2: 0x2e0b176a2f536c6e, }, w1: u288 { limb0: 0x5d257200e0e3f0f8260548a1, limb1: 0x43ac10e47e02c1a9d08110ee, limb2: 0x656613d14e5d850, }, w2: u288 { limb0: 0x29edc8659226397445adcfd7, limb1: 0x1cb605f25f1232c4b97003b8, limb2: 0x13a6a30088bf9a55, }, w3: u288 { limb0: 0x4837b7e02ab5c97e266a9eb2, limb1: 0xefb32f653bbae6f3eb726d8c, limb2: 0xceb8c4e50028cc4, }, w4: u288 { limb0: 0x17fdc9308535284c68a7ac7d, limb1: 0x8f766d31c197ea65a39bc4ca, limb2: 0x11acbfcb24ad2ba8, }, w5: u288 { limb0: 0x967bd60ae3efddda5dfbec81, limb1: 0xad70c14c97b8c7380a686e0f, limb2: 0x30371ad6bf543c10, }, w6: u288 { limb0: 0xd6adaf61b6d0903807ee7c9a, limb1: 0xee225f52f407d4ac976ef50a, limb2: 0x2bda417303c6e24, }, w7: u288 { limb0: 0x65b3fb8257e7965d755002d2, limb1: 0xfeb9878a646b31e21f1bc4dd, limb2: 0x3fabd669db5667, }, w8: u288 { limb0: 0xc8927e2bf2fd8606dc9b6e85, limb1: 0x9ddb06748b2b5d9c90979f30, limb2: 0x24bbdf3df96e6ea1, }, w9: u288 { limb0: 0xd7eba07d8fb5fcb950830fc7, limb1: 0x1c092ce0a8e62ed5de82e1d8, limb2: 0x7e9c4205bfb999c, }, w10: u288 { limb0: 0x22d58baa6c70b1c140f13e2b, limb1: 0x38546fe262f003b039568289, limb2: 0x13eb0f5e2523f2ca, }, w11: u288 { limb0: 0xe6fdf4239d6fe039730db80e, limb1: 0x81fc600118834bde7b210e33, limb2: 0x23e94c10560dd48f, }, }, E12D { w0: u288 { limb0: 0x126dcabb9c83e55788a421b5, limb1: 0x2e5a8020d31d184d2bd680f8, limb2: 0x176e9e74d5123bec, }, w1: u288 { limb0: 0x732eaa22202d100e390b18ca, limb1: 0x2595de575d6260fc6337efbc, limb2: 0xf59c55b16fb73c0, }, w2: u288 { limb0: 0x8454d677091dc5fd7e035f79, limb1: 0x6a2dd013fb3bc6a2e5003d7, limb2: 0x1c39b76d67404b64, }, w3: u288 { limb0: 0x4fc8609d589ce3d8c239a3dd, limb1: 0xa8f08cf1f22a3c5957b65a22, limb2: 0x241f11fcdd196ec, }, w4: u288 { limb0: 0x67e9b76b6ba40ce55cf6ab86, limb1: 0x8efa4d2d0eabda1157c2bb0d, limb2: 0x252d5836afe72740, }, w5: u288 { limb0: 0x44c643bb39ed068dead8aca2, limb1: 0xa1da68cdcb0915ecad11d33c, limb2: 0x102404f3b319bf2a, }, w6: u288 { limb0: 0xb5b9204c239db4019c1fdb3b, limb1: 0xf9e229ea94fa5218d7c1fc77, limb2: 0x143ceec4f0df474, }, w7: u288 { limb0: 0x453b36a8489031e742fad6a5, limb1: 0x9092027d3685f9f1c9d26cfb, limb2: 0x50420383217b07e, }, w8: u288 { limb0: 0x23c8b1a3576fc3fe496deedc, limb1: 0x17660d0f8467bc551b9d0bdd, limb2: 0x103804c850751821, }, w9: u288 { limb0: 0x1d3bb90042e840d2625d12ea, limb1: 0xf92dc5238204717730ffb1ce, limb2: 0x246eb81f06275fc2, }, w10: u288 { limb0: 0x53509e255bff37a25830dbe3, limb1: 0x985df0466ce0dcec904b0fd7, limb2: 0x908c8217e42cd80, }, w11: u288 { limb0: 0x3e912b9df8245fa466263f73, limb1: 0xaefb85c91fb824510a98d40a, limb2: 0xff2b69e5bfe0481, }, }, E12D { w0: u288 { limb0: 0x56b32d16ca998bb70b7788b2, limb1: 0xb01d382c48614d4ead2ee20f, limb2: 0x9a64fc7378b5983, }, w1: u288 { limb0: 0xa6231f1419290d1fe863d395, limb1: 0xa558113440db59f078ce3064, limb2: 0xae4a839007bf42e, }, w2: u288 { limb0: 0x75ef5211c2b0d3fb68e934fe, limb1: 0x4b999ebd29af21abdebfd167, limb2: 0x1300c3b30e57dd45, }, w3: u288 { limb0: 0x20db161a9639e8681ce22733, limb1: 0x59edc8f158aeb79b697b9c19, limb2: 0xf3607616f05f4f4, }, w4: u288 { limb0: 0x8e0047a94f779f1b616a665e, limb1: 0x7bf323f05fe820cd6b92f8c1, limb2: 0x255f3301a994d38, }, w5: u288 { limb0: 0x7cce5d4463609087e5be3f9b, limb1: 0xf5ba833a41f0ba18432a33f1, limb2: 0x2251cd91d4cb556a, }, w6: u288 { limb0: 0x1c4f0dfbc693f258d4248701, limb1: 0x77e4e4829a6bc521b295a18, limb2: 0xbfac02addd7ca9, }, w7: u288 { limb0: 0xfd7f0f015d04a59f87d0cc26, limb1: 0xe29e4605e3049af9e29c2f97, limb2: 0x2a8c7ce36cd38433, }, w8: u288 { limb0: 0x11d34ee47ec5a24c6604f5fc, limb1: 0x30be471321da0d345f4143f9, limb2: 0x2c5fa2db51bc0d96, }, w9: u288 { limb0: 0x1502abefbd9b920aec4bea87, limb1: 0x9639b012f620a9a4549f90ee, limb2: 0x276a2c92cd4b35c4, }, w10: u288 { limb0: 0xf17b79c9b6aeb4d04783926c, limb1: 0x9c1643fc7f0a9517dab75329, limb2: 0x147a63c2afd56d1a, }, w11: u288 { limb0: 0xe66eec94302fe7c283b5bd88, limb1: 0x727ac48a4b194db5633b8172, limb2: 0x256a4b164497e127, }, }, E12D { w0: u288 { limb0: 0xcf8cd1f2d235c546a64155e1, limb1: 0x49f94fe26f2f8dc3c32b753d, limb2: 0x90af94bddbbae6, }, w1: u288 { limb0: 0x5f46fc7fd14501d9b48e3f00, limb1: 0xd6a0531b22317d46ae0f7263, limb2: 0x29090bfeabc27bd9, }, w2: u288 { limb0: 0x5a83a53c14292881b779531a, limb1: 0xf2ea658491724e9014f110eb, limb2: 0xb760c5729a55ed5, }, w3: u288 { limb0: 0xcf101de6acf2078bfe7b48e4, limb1: 0xbf896390bca819f7001bf1c, limb2: 0x1216bca4050f3d36, }, w4: u288 { limb0: 0x1bc0ecc2ac251eaa5f21d71a, limb1: 0x587b63c9693e42ba2ecbc329, limb2: 0xe831722223e7137, }, w5: u288 { limb0: 0x6f420c9c7b0f3f6216d8b5d7, limb1: 0x2cf500acafedbc3812a974a1, limb2: 0x16c6c0d66ff0e496, }, w6: u288 { limb0: 0x6b80583ddb0da3dc147a8761, limb1: 0xd2ab1ecd4915c94f067bb706, limb2: 0x5becfa1995ffb0b, }, w7: u288 { limb0: 0x735f62f6dc9d27b0c99a7afc, limb1: 0x9b049dab7d2617bd302e6ca1, limb2: 0xc1d8f04d1a37743, }, w8: u288 { limb0: 0x1b6e19f6d80457fbd011fdf8, limb1: 0x60bdc4f77e10fdedb4718dbc, limb2: 0x250fbdefea34c70e, }, w9: u288 { limb0: 0x86a9b4513fb51e5cb981fea3, limb1: 0x3b7f9a4e04823b4667573b4e, limb2: 0x23be804fbf7fc5ba, }, w10: u288 { limb0: 0xd632f7614d5fab9d356c0fd9, limb1: 0x9a02bfc36db366078d9b9289, limb2: 0xc077e1b37c3db7, }, w11: u288 { limb0: 0xb85605ecfcfe3176c018bc6f, limb1: 0x25fddd5b4babdaf0e7ebc66c, limb2: 0x2d126fc19343eb6d, }, }, E12D { w0: u288 { limb0: 0xe0eb79ef697704f9f88009a7, limb1: 0xf84e9fd2b03ff24c279431ef, limb2: 0x1ecafc868da37277, }, w1: u288 { limb0: 0x2ac72b964e5cc678d621ba0b, limb1: 0xb71c8056e530a371916123aa, limb2: 0xa6a0ceb5f1b6d2d, }, w2: u288 { limb0: 0xb6bad8778afe2fef077674ba, limb1: 0x7a16c7fd65c6f7f2e37b1e23, limb2: 0x22a5e8a58f9c582b, }, w3: u288 { limb0: 0xb396d10dfc48fc667c7690c3, limb1: 0x16d22ca57a88a11bca38ff4a, limb2: 0x20ef9698b6d40399, }, w4: u288 { limb0: 0xa2c377682b43313850d5bceb, limb1: 0x278d711737f6ea40b0dce47c, limb2: 0x295158b2625822c, }, w5: u288 { limb0: 0xda0ba60542bf2bcbc9602228, limb1: 0x7cc8b336d9d47520093bb1ba, limb2: 0x300a142a2850796f, }, w6: u288 { limb0: 0x73fc5bdded39397faec57d1a, limb1: 0x93befe8f64a746ca03d89fb8, limb2: 0xd34647249cce294, }, w7: u288 { limb0: 0x949decf431ad41a4c35769a8, limb1: 0xe75de8c12021d75cc1efb433, limb2: 0x1a5f238d6dce3644, }, w8: u288 { limb0: 0xb63f0e9fb3fee04aeace972f, limb1: 0x5764b150d8ed8b5cdfaaee7f, limb2: 0x1154bf9d5bd93772, }, w9: u288 { limb0: 0x954e689968960d0c6a3a5be9, limb1: 0x9f6a3e9cc45fbcb1a92c2433, limb2: 0x403a6d1d9e0e3f3, }, w10: u288 { limb0: 0xe8cb3b0bc09991bdbc73f57b, limb1: 0x7b7e751a540e324065a25619, limb2: 0x2f223fa11d10f5f9, }, w11: u288 { limb0: 0xec0d73c52157b51a5163723, limb1: 0x5b46f935b0ed7732d2de6790, limb2: 0x28dfc542f18824d9, }, }, E12D { w0: u288 { limb0: 0xe2fea35c4a5b28c62048e60a, limb1: 0xaf70594c4748f6aec0400b42, limb2: 0x3ce671704d55a22, }, w1: u288 { limb0: 0x978176f558827db938ce63cb, limb1: 0x5de249f88953aba9e96e95f6, limb2: 0xd03c2c5a6e7a15d, }, w2: u288 { limb0: 0x1d20a8027dff3e64687b0caa, limb1: 0x448f6d039cfcc3132aeb2043, limb2: 0xd84a765a1ed7869, }, w3: u288 { limb0: 0x1703cf57601441d313ce9f6, limb1: 0xb4db90a6e191a4af88fe5033, limb2: 0x678587681e1f62d, }, w4: u288 { limb0: 0x36cff464be8bd512f26bce5c, limb1: 0xb716aac34db1dc56b2294b3d, limb2: 0x1bf3f2db255639d1, }, w5: u288 { limb0: 0xeac83ef4b82b4b763bac4e8b, limb1: 0xf4cde6c8121a2baa622243a6, limb2: 0xb2055633f438f3b, }, w6: u288 { limb0: 0xda63aa46e3f37283a06151c7, limb1: 0x8ee3b65ce2564d4c7b5f483f, limb2: 0x297ecb7fdeba1aa4, }, w7: u288 { limb0: 0xfb59559a190f305cac04eaf9, limb1: 0xa90e8d265b71e75a7341b23f, limb2: 0xcb8a82d979e7ea2, }, w8: u288 { limb0: 0xc58bf182be372c06687de495, limb1: 0xf4cb50f848c1e0e2072c7486, limb2: 0x2b107173b97495a9, }, w9: u288 { limb0: 0xe0eabd65692464ca0dd92b1f, limb1: 0x56abb5cb408d804cc85bf34a, limb2: 0xc80e3c37d6cad8a, }, w10: u288 { limb0: 0x2ee21b700c674b257b1831d7, limb1: 0x3d01c28bcd9b53ad28d0864f, limb2: 0x51f5ebd4bc028b9, }, w11: u288 { limb0: 0x5ec5d4da4056deda36f904a, limb1: 0x168e485c29ffe2be92bd8ea9, limb2: 0x2c51b496555823dc, }, }, E12D { w0: u288 { limb0: 0xa8471dd55603384b42066496, limb1: 0xe46eee6fcaba6ee1116284f5, limb2: 0x2575472a96ec8df, }, w1: u288 { limb0: 0x9b001b2c565f0ddfa573296c, limb1: 0x5debea2a4077e45fd6049d3e, limb2: 0x10ea438a1d19edf5, }, w2: u288 { limb0: 0x459fab1d8fcf4bb48996829, limb1: 0x1beefd7fc2a65a73c031c7f3, limb2: 0xbfde865e2af211d, }, w3: u288 { limb0: 0x127b67ab28f4648ccd7298af, limb1: 0x8d1a33c8a95c07a2d8182b51, limb2: 0x154f5a2a8978766f, }, w4: u288 { limb0: 0xa843c7b6cdbfec70273c7179, limb1: 0x451376ff143138b26508e149, limb2: 0x27ee093ad5b5641d, }, w5: u288 { limb0: 0xe46d7ddc38e93e5d4539397e, limb1: 0x10c546e7762036ef0406b68e, limb2: 0x1e5de28d570d8c23, }, w6: u288 { limb0: 0x1d71841c43b80d2bfc818be0, limb1: 0x9ed8354ed235ab98dcbafdfd, limb2: 0xc7832fd4bcfdd58, }, w7: u288 { limb0: 0x9120a99dcef073912a3fbe11, limb1: 0xc99085975b31be35943fe6de, limb2: 0x19b2aeb3f9a37fc0, }, w8: u288 { limb0: 0xfdd9ded7b646da18595ccac2, limb1: 0x7326e81c5c4d6cd485a95afc, limb2: 0xb12576c70934ed4, }, w9: u288 { limb0: 0x761820abaa0929428358b641, limb1: 0x49c5bd0dedc35fae8f0ae35e, limb2: 0x179d6cc8ca4c2127, }, w10: u288 { limb0: 0x337630f723038a58f57b249a, limb1: 0xb6754ac913be8838812111fe, limb2: 0xc811873605012b5, }, w11: u288 { limb0: 0xd311f807d8869697ae180475, limb1: 0x3184bc6814d397f313fcd460, limb2: 0x335982df9e3c62a, }, }, E12D { w0: u288 { limb0: 0xd43b4f3fddaca664aeb0609a, limb1: 0x4bfc6836c701691c4414eee0, limb2: 0x2fb3fa9c32523106, }, w1: u288 { limb0: 0x8e7ad226defaa97d7f70c6e6, limb1: 0x857e2881a21df90f085e3b8a, limb2: 0xe37b527e826d61c, }, w2: u288 { limb0: 0x30530cf277d3ac15f532bb98, limb1: 0x88cbcea6dfad7de0cfc2ba7d, limb2: 0x2eca3af594e50fbf, }, w3: u288 { limb0: 0xef4cc3ba0de6966b75295de8, limb1: 0xaf8676b848865e67c0f26489, limb2: 0x1460c0fd900d19c, }, w4: u288 { limb0: 0xc01ef62a31ee02de38d89329, limb1: 0x1d525f597b96d81d5254e48e, limb2: 0x14221da9a4fc3c02, }, w5: u288 { limb0: 0xadc48338e7db4e11166052f6, limb1: 0x9e68b555bddbd64621247d0c, limb2: 0x5a77fdfda3d9125, }, w6: u288 { limb0: 0x63d9fa8e08c9954284f16245, limb1: 0xca621cede38d19231a12d63, limb2: 0xd27fe5bd781b034, }, w7: u288 { limb0: 0x77a9046ebfaeabcd937b61aa, limb1: 0xdfa2e67db4bb78ec8cab398f, limb2: 0x1dd3f480cadc51bf, }, w8: u288 { limb0: 0xf65c9e4d2df095b6d942b195, limb1: 0xd6ebcf23f6276b9f4398ca5b, limb2: 0x1685cb6183c850a4, }, w9: u288 { limb0: 0xe5ce6d51f5c7a2aeec8cada, limb1: 0x516cacc2dabd97d328953757, limb2: 0x1974d6cc4195d3f0, }, w10: u288 { limb0: 0xc2dc450c125c4f157be8a0ed, limb1: 0x4de5175e01fcec11f2943446, limb2: 0x94d92ac291aff6d, }, w11: u288 { limb0: 0xab272482c2c48dac7030c6fb, limb1: 0xad02ca14f40e608b78e0d102, limb2: 0x1bb830e6999b29a3, }, }, E12D { w0: u288 { limb0: 0xc83eac5d253a3c206da26863, limb1: 0x1a2947347e60ca31a19b795a, limb2: 0x19d283eb90879408, }, w1: u288 { limb0: 0xfe29e4f1c7f2933ca1484bb7, limb1: 0xa467cb57c5dd3ee90eb9b1fd, limb2: 0x5af95cf457531b6, }, w2: u288 { limb0: 0x5219339ef8753869ba2e72df, limb1: 0xf6edbe19ee9528b014d5c5e4, limb2: 0x17e4d2b93b5a24d6, }, w3: u288 { limb0: 0x702d294fada771a134eda0dd, limb1: 0x6f78dce21c0fa36347352189, limb2: 0x271fd9860e85dc01, }, w4: u288 { limb0: 0xcdae44d3e06c07681ae14c73, limb1: 0xe07fa16b28b87a358d682e14, limb2: 0x1b33f9d4bedad80f, }, w5: u288 { limb0: 0x527e57b7206c1f1abed0556, limb1: 0xc5f02956f7dd77fc77040195, limb2: 0x1917515d732e83cf, }, w6: u288 { limb0: 0x821089dfaa7ef412763e67ff, limb1: 0xfd54fe4da59d3b34626aa0a3, limb2: 0x1f646c3c1ce572a3, }, w7: u288 { limb0: 0x2266b08b3a2f19ef3dfde72f, limb1: 0x8b17232a32f1d284469f812a, limb2: 0x3d46d9f79f4918e, }, w8: u288 { limb0: 0x8bc72d70c71f6a14c2015aec, limb1: 0x3e3b1d0272aeee3c95095070, limb2: 0x1401f32c5bdc074d, }, w9: u288 { limb0: 0x6b9fdcc49f933192fdd316d9, limb1: 0x51b8f8765258f14ff0b91b7f, limb2: 0x2d04765080f5aa72, }, w10: u288 { limb0: 0x282af58df7dd63615218a4db, limb1: 0xdb5b2942254b35298f473dfa, limb2: 0x19371f2e44f2642f, }, w11: u288 { limb0: 0xf656fcc4885e9bac2311a500, limb1: 0xb86e168eccc1490248a1bbcf, limb2: 0x1e94a5f389c1134f, }, }, ] .span(), big_Q: array![ u288 { limb0: 0xcd9ecd0e7e0de83876860721, limb1: 0x7a0e802a360ad60fb6b3ba6, limb2: 0x1f26bff9d463a948, }, u288 { limb0: 0xc45197a61e985bb95c93982, limb1: 0x2b04ba2a8963f7ae0fa62ce7, limb2: 0x2d01448cacdad685, }, u288 { limb0: 0x588f7a63bbaf841b308e5cb1, limb1: 0xa0de63d533eccee6a673d8f6, limb2: 0x1c044a4e0a5d5939, }, u288 { limb0: 0x3499e2c2ef45664c1c7cfc31, limb1: 0x7046243b95e70d66fd128d3d, limb2: 0x1badeff894c418b2, }, u288 { limb0: 0x9d4d9b283dda2d4cf3b482ca, limb1: 0xe8f67766ff9b89e228118e0, limb2: 0x12cf4b1f6ca74656, }, u288 { limb0: 0x7f78b962b9a9586c785bf41d, limb1: 0x942b1fd431968dcb396f0ea6, limb2: 0x21f639eb74937d42, }, u288 { limb0: 0xcf363881046546501cf425ea, limb1: 0x443c6e66796429495be332e5, limb2: 0x14e45de7b5461b27, }, u288 { limb0: 0xf6f3d82bef402316dfeb53e7, limb1: 0xda01fc4dbf0d0280eb89e6ec, limb2: 0x402be40fe8cf55d, }, u288 { limb0: 0x43ff2f5f02c99faf8526decc, limb1: 0x979a21765f207f8c3f88f9f3, limb2: 0x1a50d93e54087d54, }, u288 { limb0: 0xeae0f77e14ad1d010fed4797, limb1: 0x86a3801139a2f3b0ba5ac0, limb2: 0x1c16aa3c3908741d, }, u288 { limb0: 0xdf7f8f09db39050b510740c4, limb1: 0x88a3c866773a26b91a70377c, limb2: 0xf5dcebb0a8eb1bf, }, u288 { limb0: 0xe509b26f0280664ececb3be8, limb1: 0xdb438338837751f01dce4b67, limb2: 0x166a10efa92b6056, }, u288 { limb0: 0x82875b919a173ea8a3511d48, limb1: 0xf9b0528311202cfd6db28337, limb2: 0x1ac72f8b464f7578, }, u288 { limb0: 0x2b0709cd2f982e17d43ce465, limb1: 0x85605341bfd989b9e558a9e8, limb2: 0x29d232336b682435, }, u288 { limb0: 0xe080bdc4d14676d875f5ca74, limb1: 0xef83976d59ee48dab51aed6c, limb2: 0x2597d1c934d909c7, }, u288 { limb0: 0x4e15c1b6fd41bc38a5b7a5e0, limb1: 0x29058fd34d46cbb1d2cd7e9d, limb2: 0x153c756a13e16b87, }, u288 { limb0: 0x110465de721c0a397c95788, limb1: 0x339beb1394a74bf7fac9e22e, limb2: 0x136b97bb54329558, }, u288 { limb0: 0x4cc1dc324e163ccc6884836c, limb1: 0xee91e93251059174573ef629, limb2: 0x2e207e483b0fd5c6, }, u288 { limb0: 0xac5b393cd606a10dd8a89e51, limb1: 0xe2babe1352a2ac60c4f9033c, limb2: 0x300370ae36800f97, }, u288 { limb0: 0xebb8e75229ae08a0e0425b33, limb1: 0x78b9ecf71e5ef222976daa3, limb2: 0x154407d45ce0fcd3, }, u288 { limb0: 0x95119019b9386ee462a8ccd8, limb1: 0x431aba6ef81c2a9699eea450, limb2: 0x4564056387a17b0, }, u288 { limb0: 0x10eadf8480859a90430d0518, limb1: 0x3a4e3e5be0e7dd36aba57ad4, limb2: 0x12f4b351402098eb, }, u288 { limb0: 0xc96e5311b9a34a252ef24927, limb1: 0xc6bce3be0e5ca2a07424c205, limb2: 0x248132cfddd4df2a, }, u288 { limb0: 0x673824c0f93813a2d66d7215, limb1: 0x3e733001aa8c9dde8e5ad458, limb2: 0xba398158cb0eab8, }, u288 { limb0: 0x51a4016794c88913507629c1, limb1: 0x912fd8dee344710fdafb700c, limb2: 0x2ae28b98c05f9f6b, }, u288 { limb0: 0x79a009fe57a9b359b4adb352, limb1: 0x1372ca03aacbb433e1226a55, limb2: 0x12617bd21c0abb52, }, u288 { limb0: 0x7eaf2f952174f82c330b95e8, limb1: 0x4eb90281cfd1dd1c4671b9b, limb2: 0x20bac73e741ffc3e, }, u288 { limb0: 0x982bce06f0d39bb2cdc5accb, limb1: 0xb050fa46b9b7dd28cfa99214, limb2: 0x2af9624e1b305800, }, u288 { limb0: 0x3a27a0a47e34c1af07bee4e5, limb1: 0x4a217069cf62a8cb5dc21be0, limb2: 0x113cf013ea01537b, }, u288 { limb0: 0x397138d3414f0ce30034c150, limb1: 0x78a5fc50efeccd0380f5f953, limb2: 0x2bbf36d098bc85cb, }, u288 { limb0: 0x1dd90e3163d35b29a4df6324, limb1: 0xf4f174473f47e8f6d85260d7, limb2: 0x177ea72f9955fb3f, }, u288 { limb0: 0xf5f2e7bde58014b48317751f, limb1: 0xff017eda0d8456f5c6fbd91f, limb2: 0xbfd8d46a321cd92, }, u288 { limb0: 0x703202d10d086be3180bb09f, limb1: 0x4777e8d0e0172a43f3bc41fd, limb2: 0x86c412c67ea9a24, }, u288 { limb0: 0x828ef41cae766d576be8e58e, limb1: 0xbb9975959f9e49b0d1d47d5e, limb2: 0x214d2c6480221840, }, u288 { limb0: 0xd6fbfa1e1ce00ffa4643b274, limb1: 0xdce6d04cbe36a1f9c1f68d3b, limb2: 0x249a0a2cef1fcf37, }, u288 { limb0: 0xb9fb8ad79768b63fc7a465c4, limb1: 0x47908a6e2af2ba3361c8aaff, limb2: 0x119055b6663e7b1f, }, u288 { limb0: 0x7c1cddcc18521e4581a65fa5, limb1: 0xce811a3bf18b91a42cf807d4, limb2: 0xb9c97707c1dfb5e, }, u288 { limb0: 0x82cf50a98d6a60d98898f, limb1: 0xfb8668942142c8ed097fd49c, limb2: 0xa33341d40ab89c1, }, u288 { limb0: 0x944ad8e61fe850d38033ce23, limb1: 0x33595a089ea014ad58f9bd71, limb2: 0x2e0f1bfcb86fb4c6, }, u288 { limb0: 0x637e01f7ce86989ac3bbc8a0, limb1: 0x103ca90052a9d3cc1071872a, limb2: 0x1afb86c103e88176, }, u288 { limb0: 0x1f082eeca6098eccfcb5f394, limb1: 0xf3456368bf412757e690b18e, limb2: 0xf2df40ce38dfa9f, }, u288 { limb0: 0x334b5616731bda1e93099512, limb1: 0x9da6bbfc03dfb03d67bdf53, limb2: 0x15aa211a87b2137e, }, u288 { limb0: 0xf282c83a11343e347e30120, limb1: 0x4d683ae65f5a7e8f7c4e845d, limb2: 0x244c10d60252be9d, }, u288 { limb0: 0x86cb9a2bc80a9396e05e6a31, limb1: 0x9d91ba4be143eb493f6a7dfd, limb2: 0x22e6cb69f0e48722, }, u288 { limb0: 0xf9ce34ca7f58a460c0ab03e2, limb1: 0xb24fdc31808aa1aa652d2373, limb2: 0x16271dc397abc2d0, }, u288 { limb0: 0x90b7836ac52290f685e38858, limb1: 0x3d6bcd1716684e0f79af6add, limb2: 0x1c1d91fd1b172cf3, }, u288 { limb0: 0x61363d39d930cfa7e7efdbdf, limb1: 0xfd93b569a8206d555229c16a, limb2: 0x1e98a6aa74f629c2, }, u288 { limb0: 0x15ce60589452ecb11866120b, limb1: 0xe50dff8fe0f59568560ff039, limb2: 0x1e280d5a22136a7c, }, u288 { limb0: 0xfc490e9f2a962e6e87d9ea27, limb1: 0xae538485491902fbf60f604d, limb2: 0xba325703cb9d622, }, u288 { limb0: 0x611de88bd1e06877f38545a5, limb1: 0xde29c8fb70cabae4e03fcfc0, limb2: 0x3040033c88c2ee9f, }, u288 { limb0: 0xaae7db4415d65b00609f5931, limb1: 0x125a49ea3b009299fe42e200, limb2: 0x2f27237befc96a46, }, u288 { limb0: 0xbac1d16fd779c3681906273, limb1: 0xe5faff69c63d4509d664660e, limb2: 0x176cc60c39ad7261, }, u288 { limb0: 0x1dff6ba32886a747f4028ce1, limb1: 0x7d3dc0f77f55a160febe9533, limb2: 0x41eb1e2cc9620ef, }, u288 { limb0: 0x6f159369a14c55f116b056a1, limb1: 0x4d6a71d44a9e5f4b416bedaa, limb2: 0x1e7d1caf0a514c8, }, u288 { limb0: 0x3eaae80d65438be521ccaa8f, limb1: 0xb3cb70353f9ab7c9308878e0, limb2: 0x2d350bb0c9f123e7, }, u288 { limb0: 0xe77de25e924a9438bc2d2579, limb1: 0x3216dba677f2373aa5eda53f, limb2: 0x160132292ce63351, }, u288 { limb0: 0x5ddd066193a6571bf767252, limb1: 0xade2aa51ce1f6d0167d2cdce, limb2: 0x22b9b35dfb6453be, }, u288 { limb0: 0xf2416d3109c8288e4cb6712a, limb1: 0xde2b753d3e58b2b0c782c8a4, limb2: 0x1348223d65a12acc, }, u288 { limb0: 0xbb0d97f224dba4d652a2dabc, limb1: 0x3f95b239ab0dbaa27173d9b1, limb2: 0x2f64f705d36cc41c, }, u288 { limb0: 0x2163cdc628d8567cbda19c4d, limb1: 0xc862355b5465dbf60091c369, limb2: 0x1b9809750c79c782, }, u288 { limb0: 0x8e504e33fc82c74075eae228, limb1: 0xd3b485261c8f02eeb5ffe430, limb2: 0x304d56234330259d, }, u288 { limb0: 0x622c02a4c964ebae2e9b484d, limb1: 0x1b004d10e41ae67ddcbdbe62, limb2: 0x1c300204506d6375, }, u288 { limb0: 0x7db8b7c5992df6fb4d576bf4, limb1: 0x532d02b911256a4943d9631f, limb2: 0x20d8df68c3f824cb, }, u288 { limb0: 0xba7e5a11ed1ff84a46e8ec4b, limb1: 0xdfb9cb9359f71439d053d0f3, limb2: 0x16cea713913e18d5, }, u288 { limb0: 0x707f838159485f761efa549c, limb1: 0x88b7b4f8bdefc096d9e0d966, limb2: 0x9ef20993676422, }, u288 { limb0: 0xd539b4fa1bd35ede24476341, limb1: 0x8b7b5c055f3051248086ec57, limb2: 0x1900b53d5fa3e38a, }, u288 { limb0: 0xeb52e994f9e72556725ee062, limb1: 0xa75aba745ef74b8ee321d612, limb2: 0x1a4fac0822cb2e6e, }, u288 { limb0: 0x391de54c6399c5e314219378, limb1: 0xeab39215d590c0a5fe445627, limb2: 0x1769e948746069b6, }, u288 { limb0: 0x68e08426167cf3d52b299276, limb1: 0x3322b75fe2846840ffe8a647, limb2: 0x15f5cba7c399346d, }, u288 { limb0: 0x2c6681c92d003adf9da531d, limb1: 0x476fcd0b1bc75eb002229140, limb2: 0x2acafdaa38a9b0f1, }, u288 { limb0: 0x9f4926869a7f3a29a2b5ae6b, limb1: 0x8003f333ed5dd75a27239f34, limb2: 0x23cf0a113c266a71, }, u288 { limb0: 0xfe79de39e9ac712141eb1e79, limb1: 0xfbeef59d9f181cec39a142fa, limb2: 0x7368d16dc93dd5f, }, u288 { limb0: 0x24f569e0749e4dad272d9a85, limb1: 0xd83db10446c41cfb9739d412, limb2: 0x2744e7e08b7ef64f, }, u288 { limb0: 0x3df5b88d482d57436f3d19ad, limb1: 0xefcb6162d7d4182956c44a92, limb2: 0x2a4ba6e026f277f, }, u288 { limb0: 0x9b0cdbd6b0fa3b683b98d54, limb1: 0x64b553449acafff2c667ef40, limb2: 0x21897f20c41cdb6c, }, u288 { limb0: 0xc96e1f94e1f300b6760d2c71, limb1: 0x842b9e011fc4cc50bf23e8ad, limb2: 0x943d19d540a93ad, }, u288 { limb0: 0x2cadea54397e41ac535a4a4e, limb1: 0xd29391e14eb3c897d513cbda, limb2: 0x18f65a4c0f7ad471, }, u288 { limb0: 0x199e106b6e9655c2f2db8e94, limb1: 0xce6ea09ade8fcac3358e8f0f, limb2: 0x25abf56cb3789872, }, u288 { limb0: 0xb398fcf7c25c747f09277a93, limb1: 0xc63dee51c375ba4d24497f6b, limb2: 0x130bb5b0cd93e097, }, u288 { limb0: 0x140cb7e20f30cc4d12d7c295, limb1: 0x57c6440b63d64e81ae2910b0, limb2: 0x1d2214d2b8f5c135, }, u288 { limb0: 0xb012688dbed3bf82c34b4903, limb1: 0xdcedb9d3062e18c49b95394d, limb2: 0x1009df2e386f90b5, }, u288 { limb0: 0x93b4b0ea687383e24ae3f5f0, limb1: 0xb2788fb1d2ed1167268f40a5, limb2: 0x133f4cd254fe0509, }, u288 { limb0: 0xe358e0e21896d72a7b964dc0, limb1: 0xbf06829be21718978e1b2489, limb2: 0x225f6a4f57157620, }, u288 { limb0: 0x794f77c3b786b0961426d9dc, limb1: 0xee5580a7829747832f246f15, limb2: 0xa2122360f5b1f89, }, u288 { limb0: 0xcff3e42c1de58bc1d88dd6a7, limb1: 0x138f0628c0be5a1bb9618f00, limb2: 0x13bda44ab4916c91, }, u288 { limb0: 0x260b310379f2b1ab351836fb, limb1: 0xe945fc4f9e76930fb8782132, limb2: 0x17b4850c6f61e1bc, }, u288 { limb0: 0x29f71cc65b41fde8c310531c, limb1: 0x82110cf9b87ee0350e352128, limb2: 0x2de6c43136c2a4c0, }, u288 { limb0: 0x680cf8d39f7a4cb427d1f7e3, limb1: 0x8f36c365137d663bdc44adf6, limb2: 0x28bc55a10a79fc6e, }, u288 { limb0: 0x4f72af30c794deec4daa1aba, limb1: 0x5a61823f3ec26a66ea729460, limb2: 0xf9fcc5d60431bc4, }, u288 { limb0: 0x1b2164526ac9853b86aba042, limb1: 0x5ea6866ad965059ee3966723, limb2: 0x292923ef2a5d538, }, u288 { limb0: 0xa24eef3357935b44d2bf84f3, limb1: 0x17ede7d5dbea54ca62d39e60, limb2: 0x1d47968cd691e1b2, }, u288 { limb0: 0xd8eff186b18cd6808dc008a2, limb1: 0xb55b7c5e09af50acfb35beb8, limb2: 0x170e527baf76072a, }, u288 { limb0: 0x7f57d08ca1f28f7c01a7ec99, limb1: 0x187aacd2ee225e4e07cbf333, limb2: 0x12efa830f22aa695, }, u288 { limb0: 0x78a370809f4e58d4712c0b49, limb1: 0x9691d2a7a809482fcdea3f0, limb2: 0x2c4fe9d95a17d925, }, u288 { limb0: 0x48f0c21db44296fd6662781, limb1: 0x9bd31dd6f9ab8ba74967ddbd, limb2: 0x2eb1c82eca76f7c9, }, u288 { limb0: 0x7d5845a89d0f2b149719af0, limb1: 0x4127afef8486b02ae612a7b, limb2: 0x1e1c08ef05c131c9, }, u288 { limb0: 0x96ee5150c56e9f4b071af91, limb1: 0xb92146c9cdff145e79630861, limb2: 0x131f667026fbf033, }, u288 { limb0: 0x3651e4ded6039d3824961147, limb1: 0xd99373ccc9fae186d390715b, limb2: 0x3c013320050adb, }, u288 { limb0: 0xa8b6b4c80aa27ed10f251c4e, limb1: 0x5ede4e700c4e0dea4f455121, limb2: 0x1b4c34069918cb7, }, u288 { limb0: 0xb16c3caf794d22d7cee9b0e7, limb1: 0xb3e5ff03298b79eb38bcada9, limb2: 0x213b8b9080afe8b0, }, u288 { limb0: 0x7d76f66dbbc1bb77cc78f482, limb1: 0xf7179ed8d9b7c44ea298fe4b, limb2: 0x20c8413d71b2ad0, }, u288 { limb0: 0xdb9bca348789a70043219156, limb1: 0xb930d7bd11923cc488d3828c, limb2: 0x1f70653776068f52, }, u288 { limb0: 0x5222536f1bb172cc8d5ba1e, limb1: 0x63fa41c52cec432405a54695, limb2: 0x17ed96930067ccb4, }, u288 { limb0: 0x587fb32e628380a9fc5e8f55, limb1: 0x3848dacc82cae2187d9b68a0, limb2: 0x1e3a1e6ecea2f326, }, u288 { limb0: 0xfd92eb013caf532acaeb1353, limb1: 0x343f3adec30039d8e521932a, limb2: 0x2e539c88529ffcac, }, u288 { limb0: 0xd386bf875be26f9df6d48bd8, limb1: 0xb63f0bd1cdc223e9d8417262, limb2: 0x2b14841bc6b26d1b, }, u288 { limb0: 0x260288bdb6c3c1615d315058, limb1: 0x2d1c58cd2009e97fe4ff62a0, limb2: 0x850a0cc3be6cb02, }, u288 { limb0: 0x4eed9c68152dc32d62708d16, limb1: 0x939102ad69fcc314aee1d539, limb2: 0x13d4c22548844741, }, u288 { limb0: 0x7c7d5146604601417eb17335, limb1: 0xb1da8f9a38cb13c90227f90c, limb2: 0xc3c49f892eda484, }, u288 { limb0: 0x47563ec73200475051175427, limb1: 0xd47f031d1731c23e567c39d8, limb2: 0x26621e3ef622f8d8, }, u288 { limb0: 0x37695782b7c1a487cf5db646, limb1: 0x96c9c3e4b403f60f20bd35ef, limb2: 0x59308e19c985156, }, u288 { limb0: 0x4034b4dd6e266aaea0b0cad3, limb1: 0x96cf0e54eed6229cb778111, limb2: 0x6c53c2d4717a539, }, u288 { limb0: 0x291b550caf9cfc5e80c92e36, limb1: 0xe4664957bc677af793349b1f, limb2: 0x1dfd5ca9e7ea62c8, }, u288 { limb0: 0xd9ce00efde6e96989b41f7c0, limb1: 0x2fa252909400cac06931a877, limb2: 0x52e63695c1c39ff, }, u288 { limb0: 0x12c5a340607a0e5f8b40c8b9, limb1: 0x7230484474d5a864caa2e57f, limb2: 0x1808d958a8b06380, }, u288 { limb0: 0x20da3e69864fd0cae69fd25f, limb1: 0x46d475005b5841a7f23bad17, limb2: 0x6fc94164be62f34, }, u288 { limb0: 0x85790e9faab46ba4b144da52, limb1: 0x846cd87ae5c551a22c8d32d0, limb2: 0x1645e1cb9e8c42c4, }, u288 { limb0: 0x3aa39d1e1104cf52ed75ad61, limb1: 0x31a16fe525ae71a10e12ad9a, limb2: 0x13140bdcf11e2680, }, u288 { limb0: 0x6a76ae6a62ad31c32aa42b00, limb1: 0x65bbab5b583d0edd1e76c96c, limb2: 0x196a582a7c4ed738, }, u288 { limb0: 0x4274108f40f8b99cfc50a637, limb1: 0x5c2ad00e64005d86e3db656f, limb2: 0x27a66a769dde31fe, }, u288 { limb0: 0xb703b0977c5b4a4587bcbc73, limb1: 0x5304a3a24713a77fc5d4523f, limb2: 0x1f6edb8971bf1a02, }, u288 { limb0: 0xa4e49d165dea352da5e91073, limb1: 0x33d7a43c7b5d2f064f50cb34, limb2: 0x10f2b641213ce9b8, }, u288 { limb0: 0x7667894a30b5a1599017cafd, limb1: 0xc43504bdca87afbd1f1bf3e2, limb2: 0x26136292049cff88, }, u288 { limb0: 0xa5f6fe6950f80eea81ba60aa, limb1: 0xc496c6371972a373fd4935fc, limb2: 0x24d25939fb490f67, }, u288 { limb0: 0x6e51f17f9da9dc4e91c0211f, limb1: 0x29246cb4860c854c43456d7, limb2: 0x25cc502d181db1ac, }, u288 { limb0: 0xbb3572277d9a318ee7d1485d, limb1: 0x63539d2a5d7de813a12b1557, limb2: 0x196cd15fd6191f83, }, u288 { limb0: 0xc289a092df7b9922387772b2, limb1: 0xf6db28b743850da2cff75ad4, limb2: 0x197832651a6680e2, }, u288 { limb0: 0x33fb1942bbbc35f8d89947f8, limb1: 0xdf420e4a445363547145af3, limb2: 0x39c2dfef594fc2a, }, u288 { limb0: 0x9edb6834a304836837d7df06, limb1: 0xb957af2167687663613975ba, limb2: 0x26813386c6ae53dd, }, u288 { limb0: 0x67e42cccf219e667b8042023, limb1: 0x64c429eda86c60cf63c2345a, limb2: 0x2954387696ce9e73, }, u288 { limb0: 0x85e6ec46b51a680fc875dfdf, limb1: 0x335ec08a773887841ec1d38d, limb2: 0x5e8dcf603f60cc1, }, u288 { limb0: 0x6a645fdcb10d2601d9afb0bc, limb1: 0xd7f90625ab78b1cfd37959ea, limb2: 0xb6249433c6b5d2, }, u288 { limb0: 0x324db7a2be658d2ff7b7b813, limb1: 0xb16cedb961ccc959cc0e8abd, limb2: 0x23b29f7b86e3b291, }, u288 { limb0: 0xd680b7ddd933df47745d329d, limb1: 0x1a69d60c9611b610294540e2, limb2: 0x70e0c0c145bd457, }, u288 { limb0: 0x75fe1ca84d50716b581193ac, limb1: 0x53666a7cc64971c7cfd40fb, limb2: 0x1bc99d66e8920376, }, u288 { limb0: 0x129a6fa8aced9e86a95cda1d, limb1: 0x56c723353e4b5810f0fe54a7, limb2: 0x2e7ddf704f34aba8, }, u288 { limb0: 0xc4f5028aeb5fec91cffdcadc, limb1: 0x75c5fc2c5567dcca1609e150, limb2: 0x1ccb00903261b963, }, u288 { limb0: 0xa5b5e438511b9249c7752e1e, limb1: 0xe9b1442620cacd46ec2b1782, limb2: 0x25660cb0865db165, }, u288 { limb0: 0x21e80b75d90f4c0f0f0f8fcd, limb1: 0x75ff38de274801350e168f13, limb2: 0xe864649052a78c9, }, u288 { limb0: 0x9fbd53d1139051c58a503ee8, limb1: 0x2e171cd994c025cadf34f74c, limb2: 0x4f2f935b3244403, }, u288 { limb0: 0x3c2f06c18915794941e07541, limb1: 0x1600fd9f682e0ff99a15ea0d, limb2: 0x2b58b6bc9b85f0c1, }, u288 { limb0: 0x4e5fe68d9ba5773e7771b872, limb1: 0x7936589153302c6c592d395b, limb2: 0x219e2cee8031beeb, }, u288 { limb0: 0xccc79196e9ef9aa525f266e4, limb1: 0x3e1ae17dac5192f16e62f66a, limb2: 0x3a22caf84670270, }, u288 { limb0: 0xecded52f9fafd2633b1ad2c7, limb1: 0x98959a6c3d5399fde2d07d11, limb2: 0x290eb87cfd056bb7, }, u288 { limb0: 0x2ca6dbf8cec521166c1e97a9, limb1: 0x2e2b858c4306e88ca2e8ff59, limb2: 0x227a49d0bd01b2f4, }, u288 { limb0: 0x9ec2575cc0b5fe4256e8b852, limb1: 0x8deb570e05656ac1107314f7, limb2: 0xb2ae1edc8dc724b, }, u288 { limb0: 0xc5c4103c9ddcf67f12831332, limb1: 0x20a744564004311579d6d043, limb2: 0xa79c37f3a01eae1, }, u288 { limb0: 0xfe34d0e72860ca2604b579de, limb1: 0x788273ec407801dec428be1e, limb2: 0x2586374a9a097166, }, u288 { limb0: 0xb0fb767fc04377fe20f9dcc, limb1: 0x1ce9876fcd691843205d64b7, limb2: 0x44ae36eb57cd277, }, u288 { limb0: 0x5b74bcd56a4b675933eefc3e, limb1: 0x7e0a410a95c66196da409a3e, limb2: 0x20e165eace83395c, }, u288 { limb0: 0xc36a1f1000f2286946c1bfad, limb1: 0x2114fb0ccbaec5b7d65ed6bd, limb2: 0x27b6db404330f016, }, u288 { limb0: 0xc0d451163d2863540f542959, limb1: 0x2181f17c75d24c8ba146892a, limb2: 0x2966e3ed60cf8a57, }, u288 { limb0: 0x4b284bb776e51123d8f268e9, limb1: 0x3d372bde57b729c62f279e1b, limb2: 0xc63be6a864a95e8, }, u288 { limb0: 0xaeaf6afe5e6bb3e2122e2257, limb1: 0x28c887774a654d9c8a17d72e, limb2: 0x820b5fcbf4d2cf3, }, u288 { limb0: 0xa44798fb7ad9897db6711b2b, limb1: 0x66c91a4805eced1102bad669, limb2: 0x272054a71e48b500, }, u288 { limb0: 0x1d973d5b4a27f95cdc6f0ab5, limb1: 0x3aefb7b9886f26a604a19e82, limb2: 0x17f1944ba3e1175, }, u288 { limb0: 0x4d248b009602ad73ee032a7f, limb1: 0x2a90d813247450c741d6daba, limb2: 0x2049c006c8c998c1, }, u288 { limb0: 0xb80af382f7eb90ee32391c3a, limb1: 0x9ec80567300207085edbe9ba, limb2: 0x13ca657b7e06d07c, }, u288 { limb0: 0xf4c86461890d84e08ed7c16c, limb1: 0x116146b9f61005ec013c4d43, limb2: 0x8e8d54d9ed83293, }, u288 { limb0: 0x8318657d34c008025954ba86, limb1: 0x940231cb0f486be6f4ac6171, limb2: 0x1b7ea288cf13a06b, }, u288 { limb0: 0xc3d4eed63203aab4c38a3111, limb1: 0xfad79defa990cea7d5c200ea, limb2: 0x2210bff25e88bd73, }, u288 { limb0: 0x6fda628410202b0b14f337f7, limb1: 0x599c8a114cb4da42b053219e, limb2: 0x1f017f8c17f0c3dc, }, u288 { limb0: 0x5501887efd29362d9e6ca6c1, limb1: 0xe327a683c786b87a42361856, limb2: 0x1a6bd509d9992232, }, u288 { limb0: 0xcc19dab54c52fae73dffc82f, limb1: 0x679d43b5253684a8217099b0, limb2: 0x27494786e1544f80, }, u288 { limb0: 0x7a7b264924956990fa05c109, limb1: 0xb882e52469497eef57a26247, limb2: 0x2712898ef350edd, }, u288 { limb0: 0x9315f3b371bf19053455aef0, limb1: 0x63da3f4b148dce3e61b1a2e2, limb2: 0x26ef8ae2ac1f477a, }, u288 { limb0: 0xfbd5da98cff0c5f05048d31e, limb1: 0x9aa05823bfdbea9169923efa, limb2: 0x1e00960f3554662c, }, u288 { limb0: 0xe0a9648905d32ace43e00780, limb1: 0x588fd7f9e24dcf80a5522401, limb2: 0xa5a092184d66473, }, u288 { limb0: 0x84d9a3c6deb2713364a064b0, limb1: 0xb610b760f1001653c933a024, limb2: 0x1968e1893eb30c9b, }, u288 { limb0: 0xac7bf4cbaedf593cdb277057, limb1: 0x9336a854a2df58513e9edf63, limb2: 0xc81898868b07b79, }, u288 { limb0: 0xeecbadccd1d275e446ac3a33, limb1: 0x506cd52599c77350f42f16ee, limb2: 0x63e2586f6f6376d, }, u288 { limb0: 0xc18861e743b6b4a487b26f34, limb1: 0x4cddf18c09efe58f28311709, limb2: 0x27b189983e38077c, }, u288 { limb0: 0xa5cc95d266d8f435df7981c4, limb1: 0x9de157b88197f4675a2e363a, limb2: 0x2626992437d7f5bd, }, u288 { limb0: 0x5e069927eade8753b47fc485, limb1: 0x13bd965d6aff06b1d31c4c8c, limb2: 0x79e0d8769a2562e, }, u288 { limb0: 0x48cda8ef2853ed45f44fa16f, limb1: 0x23859acb7880001c93ba3422, limb2: 0x20d1e3a290b3743e, }, u288 { limb0: 0x6bc0f19069ecdd41c0ba5813, limb1: 0xe26d07160218d9e6ac4c1c7, limb2: 0xe500a5f059031bd, }, u288 { limb0: 0xacd2adc377d226f3c39b9bba, limb1: 0x20f87518d8ab8ba203290541, limb2: 0xf7d610d3297206a, }, u288 { limb0: 0x8aab358efa338335b31d0147, limb1: 0x5f4e5a44da9ad6c4218dfd97, limb2: 0x2f3f46e3829e99cb, }, u288 { limb0: 0xf49e59675e5c2652fc98844d, limb1: 0xd4bdc00b82ea2265bbe602dd, limb2: 0x30251b1b43b631d4, }, u288 { limb0: 0x53e92cc28af4d05059a215d7, limb1: 0xec3f188236f6a503ed4de17b, limb2: 0x21d1ac20cfce9e56, }, u288 { limb0: 0x40b7cc38ac8cba869c4afaa5, limb1: 0x6a7d5059f4ccf26c9162c85c, limb2: 0x9a20817bb9320b0, }, u288 { limb0: 0xec4e50920da4ab9fcd8e2b98, limb1: 0xfa4314350e1a3bd41ad3375a, limb2: 0x27f28542e7c4496, }, u288 { limb0: 0xc1838416f745382de4bf708, limb1: 0x7d0cb6e1d7f2f300b1d371ba, limb2: 0x22ef95e852a3eaf2, }, u288 { limb0: 0xca3ffa0e2c0bb3d1925994c8, limb1: 0x621ce4f0702f6072f260282f, limb2: 0x14426488bea03e8d, }, u288 { limb0: 0xf4e9eb97bcc3eff6268102a1, limb1: 0x79bc7b771d048af610d0167a, limb2: 0x229cc7e1937fb40d, }, u288 { limb0: 0xba9ce540f58ea008c3fa4ec3, limb1: 0x5d9219cfc8d5ca6ef93f34d, limb2: 0x2b1322f0eff448ec, }, u288 { limb0: 0x4cca24b0b778472065b78f26, limb1: 0xf97924058d24e5673c16c4aa, limb2: 0x185b829c05f1f99c, }, u288 { limb0: 0x3eee6f0043b04acd6bbf71db, limb1: 0x7c8f4c1a93ae3ea5b9ca3414, limb2: 0x1d71ed45dd37c55e, }, u288 { limb0: 0x9e1311913e9c2052a16dca48, limb1: 0xcdcaa853fb8f8267ebdfc69e, limb2: 0x2abcb6f497eeaf02, }, u288 { limb0: 0x79c438d659c0c62ac1fec12, limb1: 0x775044aec0471597922e3111, limb2: 0x6214986f36bba06, }, ], z: 0x690450caee78b3590fe0ce78a9df9ca1987c494b5ca8e9629f81245f1099f16, }; let res = multi_pairing_check_bn254_3P_2F_with_extra_miller_loop_result( pair0, pair1, pair2, precomputed_miller_loop_result, lines, hint, ); assert!(res.is_ok()); } #[test] fn test_BLS12_381_mpcheck_2P_2F() { let pair0: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { limb0: 0xfe174bb39be8658ef83c8c2d, limb1: 0xdb24ddec0e0c3b63d82efa81, limb2: 0xe360a80121d5ef96fd687003, limb3: 0x59d2a79bda5f8a941d4db9, }, y: u384 { limb0: 0x7f68344f543e52fe891285a9, limb1: 0x6f6992be16bc35f88c471acf, limb2: 0xcebb5ee96e40a033f5d3b798, limb3: 0x2df47e8cdf189985d5085bd, }, }, q: G2Point { x0: u384 { limb0: 0xa805bbefd48056c8c121bdb8, limb1: 0xb4510b647ae3d1770bac0326, limb2: 0x2dc51051c6e47ad4fa403b02, limb3: 0x24aa2b2f08f0a9126080527, }, x1: u384 { limb0: 0x13945d57e5ac7d055d042b7e, limb1: 0xb5da61bbdc7f5049334cf112, limb2: 0x88274f65596bd0d09920b61a, limb3: 0x13e02b6052719f607dacd3a0, }, y0: u384 { limb0: 0x3baca289e193548608b82801, limb1: 0x6d429a695160d12c923ac9cc, limb2: 0xda2e351aadfd9baa8cbdd3a7, limb3: 0xce5d527727d6e118cc9cdc6, }, y1: u384 { limb0: 0x5cec1da1aaa9075ff05f79be, limb1: 0x267492ab572e99ab3f370d27, limb2: 0x2bc28b99cb3e287e85a763af, limb3: 0x606c4a02ea734cc32acd2b0, }, }, }; let pair1: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { limb0: 0xde4f62a6588c9401ffefbd3, limb1: 0x9bb5f797ac6d3395b71420b5, limb2: 0xdc39e973aaf31de52219df08, limb3: 0x105dcc4dce3960447d21d3c1, }, y: u384 { limb0: 0xaefd0d854043fd325dd3c34f, limb1: 0x9b63c98d9a7845c52e1e2b0f, limb2: 0x9db0be660d847ccc58358f3f, limb3: 0x17cb6c41f0c4e1a7394ab62a, }, }, q: G2Point { x0: u384 { limb0: 0x3b3d3c305a70960906e6cb09, limb1: 0x40e5bf3ff02d81e98b75703a, limb2: 0x665a5fc010510bd690ddd7b5, limb3: 0x82dc9154807866eb0f36ccb, }, x1: u384 { limb0: 0xe6709deb0dcf81d4285e5e60, limb1: 0xb4dcf956002c4efb974ffcee, limb2: 0x4a6ceebe6375a83dd242851b, limb3: 0xdd18d077ad5bd58dabb18d8, }, y0: u384 { limb0: 0x61535fe1a90bae7e6692f9b0, limb1: 0xc91aa58105d3a281b2e84ddb, limb2: 0x197d3446652372ce5ef50e93, limb3: 0x4a468eb9e206b9833d8e8e2, }, y1: u384 { limb0: 0x27115c334e82ed4be8da6c10, limb1: 0x194fa3bf769a2e5a52535277, limb2: 0x8be8992de81f47ae3341c590, limb3: 0x198fd0ab6249082bf7007d7e, }, }, }; let lines = array![ G2Line { r0a0: u384 { limb0: 0x36701a5831c9fb39250e2ea9, limb1: 0x26ad0ec05ad6440f1df034cf, limb2: 0x67cd27cf7598a85f81c23cd9, limb3: 0x15a76ee3d8d1c3451005d560, }, r0a1: u384 { limb0: 0x9009367bbf6e6aa19488df66, limb1: 0xce5cd2ccda4704dc0e4b92b6, limb2: 0xd7656829a6a71c42deb7dd, limb3: 0x16d96e785c797fb5d6afcb14, }, r1a0: u384 { limb0: 0x9d68b0bdf431a2f53189c109, limb1: 0x70e39167384e44fdaf716fa4, limb2: 0x3768099390a3f9d581d88280, limb3: 0x4c208bdb300097927393e96, }, r1a1: u384 { limb0: 0x68ab4b88cf058f147ba2cda9, limb1: 0xce3b4d4da03cbdac75933b54, limb2: 0x1be2f7e6eaa0f1474cb64c53, limb3: 0x546ca700477f9c2f9def969, }, }, G2Line { r0a0: u384 { limb0: 0x96e0f84058018a4538d64e8b, limb1: 0xdb7b84172cb1e68ddd09eb12, limb2: 0xcf3aaa45c2b370e810ea9361, limb3: 0x14b92565b748c30f253912c6, }, r0a1: u384 { limb0: 0x9cdcddf4728a38086aebcd7, limb1: 0x7b8d9115b96656327dd79780, limb2: 0xbf914addbdcbe307142bf7cc, limb3: 0x3c50d0829bdc305ff694cc9, }, r1a0: u384 { limb0: 0xcc0dbe864e35231bdec2ef76, limb1: 0x4efa339ef551d8f751da95ba, limb2: 0xfde5910a13d5c428549ed3f5, limb3: 0x105e4803f5b8472a138e00b, }, r1a1: u384 { limb0: 0x584879d210eb30bfd6518cf2, limb1: 0xa7c4af01b40d0e68243b050c, limb2: 0xade596dd94a41e4aedec2196, limb3: 0x162a46f819eba8e3b9d215f9, }, }, G2Line { r0a0: u384 { limb0: 0x3717dfec242e39e2ff1f466e, limb1: 0x2e1a47c8b52d2a155331b3bf, limb2: 0xb9705c11a0dc1b7a21290360, limb3: 0x186349066cd6c743642100bc, }, r0a1: u384 { limb0: 0xc653dbae90aec138bdc66689, limb1: 0x84a0e18292766501cc981050, limb2: 0xcb8cbe9f0dad8baba490c814, limb3: 0x49af016994f800024ad3138, }, r1a0: u384 { limb0: 0xaae746564160600e87f79910, limb1: 0x9b0e53f36f1c737506ce80ce, limb2: 0xc88af441fe63a2b5746950e6, limb3: 0x9e6e8335a28c0593fb7797f, }, r1a1: u384 { limb0: 0x3353ff16d642750e655d9250, limb1: 0x1c83cf0f79a4997f9f673aab, limb2: 0x5ec8ef641f38e8160f0fafc8, limb3: 0xd6e97ce3437dbe7066bb16c, }, }, G2Line { r0a0: u384 { limb0: 0xebdfba548549869254397482, limb1: 0x59fe075d9bedf0d74abf57be, limb2: 0xabab1d37873d3366c37fca47, limb3: 0x1538a52f8fae05fcab86cb76, }, r0a1: u384 { limb0: 0x1d682b553c5f64f0dade7dbc, limb1: 0x3ab75e8798604af41cea2a02, limb2: 0xe905b5289633293089e66f7d, limb3: 0x1952802636ce6e28657b087, }, r1a0: u384 { limb0: 0x4634dee1af84530ccf6b310e, limb1: 0x2648d262401e3b709787473a, limb2: 0x17a30eb731c1037d19aa1fdd, limb3: 0x2d6c23a0ffe044c163492a7, }, r1a1: u384 { limb0: 0x9c68a627823ca443a9e945b, limb1: 0xb3c2ff91b20c36d112c61699, limb2: 0xc263985d3095da2f3db9773e, limb3: 0xa1e844c3f1cb15b6b809857, }, }, G2Line { r0a0: u384 { limb0: 0x6a72f085ee4e78bd4c2aef8e, limb1: 0xdec05cffe4a869aed2a64ee8, limb2: 0xd41aa908b1a833b94e768d2, limb3: 0x56ceab5d5d994dee0ca07fc, }, r0a1: u384 { limb0: 0xd23aad6cd3e84e398a4e7bc8, limb1: 0xb343a6878db6ec20bcac1275, limb2: 0x3111e14b674a67295a242cf3, limb3: 0x39b596a976f556e5ea4016a, }, r1a0: u384 { limb0: 0x19fcdcac7feb1f0edbefdbf8, limb1: 0x71bc60f1a68459eb52df6a92, limb2: 0x2827dbba9d5d8516fb557dfb, limb3: 0x4786cc02b147d13e701c1f5, }, r1a1: u384 { limb0: 0xcb7555c0db86510eb99cfadd, limb1: 0x43387d10f8329296e43e6610, limb2: 0xbf6789475132950c583823a, limb3: 0x145f508c63c10d270e027b2b, }, }, G2Line { r0a0: u384 { limb0: 0x61e12a1921e9e0192225eb47, limb1: 0xe7959ccf3ab7897b63eaea0a, limb2: 0x44172872757e4112552dfda0, limb3: 0x140a9f8fd2d77ee9ce9eda9e, }, r0a1: u384 { limb0: 0xc4bd827c5fcc80aeefab436d, limb1: 0xed5133aed1007276d5defd61, limb2: 0xeae0d97e880c76210872600, limb3: 0x12f12f5d73e707622f58355, }, r1a0: u384 { limb0: 0x641d998236970e3d020b53af, limb1: 0xe7cbadbae704bf8e96b8a6b4, limb2: 0x2b9f4df44bf2e79afe0c94f2, limb3: 0x955b0249e73e276cc78deb7, }, r1a1: u384 { limb0: 0xd8ed50e5cdfbf761b34675d9, limb1: 0xd1070d143ecc709daf022bbd, limb2: 0x5df7054bb133a14672778550, limb3: 0x17b953a66b43816b30bac24, }, }, G2Line { r0a0: u384 { limb0: 0x7bd212f8f60967471e995a8e, limb1: 0xec76fa31d0fd358f36ee756e, limb2: 0xa63e06c40964532a724817c3, limb3: 0xd860767952ed2b694b64eea, }, r0a1: u384 { limb0: 0xd18f8b1de21e64c50d3c6fc2, limb1: 0x456cec057d45521c48d0b547, limb2: 0x23fb8276293fac77c9a38c1b, limb3: 0x1469d7cf50d58855fa523aa8, }, r1a0: u384 { limb0: 0x52f1d22ea6bfc23435bf7e3b, limb1: 0x3e2d5122467bf39f2573a57b, limb2: 0x378db9e77f53b5b1e38981da, limb3: 0x1015deb442db265529d8948, }, r1a1: u384 { limb0: 0x73c44618fb7917b2596bd460, limb1: 0x598ee13313073cf3232e1b37, limb2: 0xbd63e58ae4aa477bcd459ef2, limb3: 0x272bfde06aa8302ab8c70d6, }, }, G2Line { r0a0: u384 { limb0: 0x84d7880d9c5ad98d07f1b961, limb1: 0xd5be4b6e58ad745353113073, limb2: 0x592ecc7534e44983a06d755c, limb3: 0x15d60a0d6d8a2e4543194737, }, r0a1: u384 { limb0: 0x9ba63990e4f1ea4875173006, limb1: 0xf84fa98d5f3742b3c571f427, limb2: 0xdd28189a4a2e3a70f78a170e, limb3: 0x1ad5bc82425c66f655a75db, }, r1a0: u384 { limb0: 0x49306522c22ca321950bf155, limb1: 0x369a747f27aa6472ebc5d290, limb2: 0x20d8977cbe5acf112574c70a, limb3: 0xcdc103da1aac9ec5f855b64, }, r1a1: u384 { limb0: 0x74517cbd651af3940075c057, limb1: 0x94d3802d81c93d69eb13518b, limb2: 0x76411c393dd03e5381661629, limb3: 0x16e57b05faef24ef64868a07, }, }, G2Line { r0a0: u384 { limb0: 0xaa72fbca0fc809a3c04cfe63, limb1: 0xb197b948b9fb7b1d17db7811, limb2: 0x912c914d3a6ff39a540a4f3d, limb3: 0x16cacbdaa9c89addb1ab2cbe, }, r0a1: u384 { limb0: 0xbc48a5607d4379fef56b2969, limb1: 0xc1f23a19f0081d7a3e19795d, limb2: 0xd3b68107f121763ac21a3013, limb3: 0x105753740850ad267b13b914, }, r1a0: u384 { limb0: 0x9922c12ecdd8f9f562a9ffbf, limb1: 0xd3ddfb6bca4e7fcf1de87fe4, limb2: 0x43cafb5ca79d345cd7fb414f, limb3: 0xcf76a75d055e5103c1f3bb4, }, r1a1: u384 { limb0: 0xfe0eed2060bf837fabeb633c, limb1: 0x7647ff2029a177beb2026c82, limb2: 0x6c89e5be509cdaa5d0724f48, limb3: 0x18e2495d0e738bcb51e26445, }, }, G2Line { r0a0: u384 { limb0: 0xaf7eb92e30bb53c95dbc4140, limb1: 0x9792c2287a214b5e4a26edb0, limb2: 0x9e2e1f53797f04ffeabc4a20, limb3: 0x11ffc63e88b938e0364be5e7, }, r0a1: u384 { limb0: 0x23f6838c52c8c103f492d019, limb1: 0xc28ff9b5147ad2c6e80ba89, limb2: 0x54862dd590b2cefb84f4884e, limb3: 0x137f181e7bc2d6e0858337e0, }, r1a0: u384 { limb0: 0xf25f4290fc34cdb084e88912, limb1: 0xb45c1d0b4bb37399c6f2f06f, limb2: 0x1c520b9c1f9a27c6dc5ce1f2, limb3: 0x8f5b2f168533ac53479939d, }, r1a1: u384 { limb0: 0x90f6fed4ce70be068a771f84, limb1: 0x6c083f0007d7b530d7bb7762, limb2: 0x621955ba256f0878ab3f71cf, limb3: 0x147b25e183343ffa8070b1c0, }, }, G2Line { r0a0: u384 { limb0: 0xb5abe92a46d0ff04a4205803, limb1: 0xdb760c98b7aad959e5dfc28d, limb2: 0xbea9b6e4adf41fa1060713ee, limb3: 0x75707a467e7543c28370330, }, r0a1: u384 { limb0: 0x8b0715d2f6a16be8d5828197, limb1: 0x598a8a6da7ed2bcc091f594d, limb2: 0x18cfc9c1ee8960c06ff2c240, limb3: 0x14061839f139644bb20e8647, }, r1a0: u384 { limb0: 0xd529f0561fff46258f565dec, limb1: 0x80402f61ae7ce96272aff23b, limb2: 0x883367465c3a4bde2507377a, limb3: 0x14fc234296369891318c6245, }, r1a1: u384 { limb0: 0x9fdc0242b4d20c44b72c8d49, limb1: 0x37e047238dd417acab9ea0c2, limb2: 0xc424c8845919fe27ac23e9, limb3: 0x151e87d65d95c3b1cc9b1de6, }, }, G2Line { r0a0: u384 { limb0: 0x6d3e75c7266836a5f88da38f, limb1: 0x9f0dcd126bc3eb7a57863065, limb2: 0x2dd839b48eaaf3738b6378c3, limb3: 0xaaa2a6bcd21b87d1c17c1d7, }, r0a1: u384 { limb0: 0xd751d74691ccfbf8a2e44893, limb1: 0x39dc71f7d866971a5b34a793, limb2: 0x61f4c7b07c463740fdfa24ca, limb3: 0x7aaec7413e01006276f927b, }, r1a0: u384 { limb0: 0xc02a7ffd3ac8b07a8351a74, limb1: 0x3e5cf07a7c56c9a5eb07e2e4, limb2: 0x3e8a62aa55827a8825e3a32b, limb3: 0x17607fbb8f27884431eb0d0e, }, r1a1: u384 { limb0: 0x67fe51eac141e68a4dc9a759, limb1: 0xa4ffe5ceccd1cdfd737bd38, limb2: 0x3efc4588564baa38aef1502e, limb3: 0x19a6b0517bf3ba0a12058062, }, }, G2Line { r0a0: u384 { limb0: 0x9bd8fa7a943e0e3a924e7492, limb1: 0xad948685eedfe9d3ac7315ff, limb2: 0x8148910d6004895792caa88d, limb3: 0x1deabfaeb3374b50119ecb9, }, r0a1: u384 { limb0: 0xfedf28954ae85d6e9f58c709, limb1: 0x7c01f5d8a4b9368fc9cbb8eb, limb2: 0xbe98bf07cbd25fe6f4ac154f, limb3: 0x7c9b05e8adef4de506459f7, }, r1a0: u384 { limb0: 0x71812aeba8c33457117bfb0, limb1: 0xaf1a11b5a7571775ec17c1, limb2: 0x721e08542ff85e7037b2c02f, limb3: 0x991d1db86230da71efb4475, }, r1a1: u384 { limb0: 0x4122fa433f37c5e6888de07c, limb1: 0x144d977681671d8cd0854c34, limb2: 0x93981673fae1df08d18161aa, limb3: 0x145eae6a49c250f2435d1ec8, }, }, G2Line { r0a0: u384 { limb0: 0x468d577fdfbdbc46e423962d, limb1: 0x5bee3b6cf7059efb0069632a, limb2: 0xc1effa8ed920dfc235de8974, limb3: 0x13d2fffc28b953d3ca80ffa1, }, r0a1: u384 { limb0: 0xdefb34cc5a85aabacaaacdd9, limb1: 0xfac8915a4c4373e6a38752dd, limb2: 0xbe1dce6fa4eaa80db5298aef, limb3: 0xbb539e692a1a2274f4304f4, }, r1a0: u384 { limb0: 0x615c9153f8460e09de46571d, limb1: 0x4f55bef9c25736ce73e4eec3, limb2: 0xbfe37903c95e022709a17263, limb3: 0x1d523a97a76bc409ae24135, }, r1a1: u384 { limb0: 0xeaec0a3f08b499ac07b95ea8, limb1: 0xae9a839b303953da2d3fe15c, limb2: 0x97307b6e3e3abcb8ecd98686, limb3: 0x77101a8f07adfc3ad5c763a, }, }, G2Line { r0a0: u384 { limb0: 0xa8af53d78f2fa38c6e213a84, limb1: 0xc908fd45d36e147e8a3449ea, limb2: 0x9224181cd573d3836b141129, limb3: 0x140090a04158ea562a90ed5, }, r0a1: u384 { limb0: 0x95e6526648a96a5a43488327, limb1: 0x5f5e4c24465495ee0dcb3055, limb2: 0x49f0985811804cda4142ca8c, limb3: 0x9619ac570f151f7baaa7ae, }, r1a0: u384 { limb0: 0xc2ef8275baa5e3b836a847d7, limb1: 0x9835333ce4136fda57f9c31e, limb2: 0x8392d675aba184475007124a, limb3: 0x10f9170d8f4e3130ef5a354e, }, r1a1: u384 { limb0: 0x4db131e9b2a50df6253da27e, limb1: 0x3210503344192c1a1d83234c, limb2: 0xb84a1ae100e6602d2a3eaa1d, limb3: 0x146401ace26dcc76ec7cb805, }, }, G2Line { r0a0: u384 { limb0: 0x9a29bb6c54b018b4ed75888b, limb1: 0x1437b2d93b1ecc564157059c, limb2: 0xf0add7baf8cfe1ddc30f0754, limb3: 0x86553ec1cc3cc6a38436fbb, }, r0a1: u384 { limb0: 0x516be99929795e7ae5112f30, limb1: 0xb182ffdb6110024a0018e3e7, limb2: 0x8e468869d60b7ae7fc6004bd, limb3: 0x4916e8c2d5820861e32013a, }, r1a0: u384 { limb0: 0x78554bdd8568c0e9686a510e, limb1: 0x97bc0c8b458fe7d5dcf2264c, limb2: 0xfcc4906709b359120a9e0158, limb3: 0x193f60f20d1cc7f2b1bf553c, }, r1a1: u384 { limb0: 0x2713699297ab49a2d9bf4f6d, limb1: 0xb396d1c4590471bf032b959c, limb2: 0x350113633de03c6e721c7597, limb3: 0x79ef6c98d71e95eb13fae02, }, }, G2Line { r0a0: u384 { limb0: 0x4e82e124ce1338d2ca7ee6db, limb1: 0xbf32616d15749f858b667a29, limb2: 0x3b302144f036cf4dc3b92682, limb3: 0xcc6fe5a628f46c5d62c7a31, }, r0a1: u384 { limb0: 0xecb00dceaf06cc77baed0784, limb1: 0x906e4821956579932758a3ef, limb2: 0x5e9a74901fc7ebfbf3ef3ea0, limb3: 0xf2962ecb7b0ebb3db941738, }, r1a0: u384 { limb0: 0x6297c3b80090ce9f80979905, limb1: 0xfcbfa064302ba8944f913e4e, limb2: 0x37d76df0505819fe8a947b55, limb3: 0x197300faabd06b7cc1d54ff1, }, r1a1: u384 { limb0: 0xa7da1d558e1c2417133fcd88, limb1: 0x48a63ff7ea1a7d1ad817b2ab, limb2: 0x4766bb1efe7584e02416845d, limb3: 0xadbeeec2cf952ed27e6a3d3, }, }, G2Line { r0a0: u384 { limb0: 0xeafeff598e54b30cb6c1251a, limb1: 0xafc0b2ad47726720fb51bdf8, limb2: 0x7c63073beb0d24a81f6784e7, limb3: 0x417c39c09d75dbe141715ba, }, r0a1: u384 { limb0: 0x7bc206e25555dee3daa1ee4d, limb1: 0x9c28ec5fa7bc8f485bb6cfba, limb2: 0x530c402c723fa11f1f84b46b, limb3: 0x104053ab3ea6fb21777f84fd, }, r1a0: u384 { limb0: 0xbe16b2bf7765b4bb12696340, limb1: 0x5c585ec795eaf69ee156c464, limb2: 0x494e9230ed370a9bc47be6e9, limb3: 0x75ceaee051b984083fec3e3, }, r1a1: u384 { limb0: 0xec732bc23b7b6a5b6c0490e9, limb1: 0x2108ecfe0e567019997043d, limb2: 0xe7c1c8eaeed7a6be30a560b6, limb3: 0xdc4b83fea429d673069ad66, }, }, G2Line { r0a0: u384 { limb0: 0x4396189ffbd89d01fe27fa5b, limb1: 0xe81217db1696daa3753ccd84, limb2: 0x55c6ad903c2a3e4b9f14a8da, limb3: 0x15f5f0afe4eeb7545fb13eb0, }, r0a1: u384 { limb0: 0xd3da9931ffbf361f326b7282, limb1: 0xc9d2464eda778b0051c1027e, limb2: 0xb8f5f46e2bd5fc15d81b368a, limb3: 0x1040f087e9a0b6633fa13692, }, r1a0: u384 { limb0: 0xf986f1a7ae6234649c858e8a, limb1: 0x4644ba4e2b6b06ac11907477, limb2: 0x95bcd96412c2b77c798589bf, limb3: 0x122a0d20337a4865af008b55, }, r1a1: u384 { limb0: 0x201ad08d1e12f22740a2d61f, limb1: 0x4ec7ca2abf73f04dd4d3c1cc, limb2: 0xbe2da8c0b44af69f8c08bbe5, limb3: 0x3bac9dd093b57980816b067, }, }, G2Line { r0a0: u384 { limb0: 0x6082c0eb907cf5276747f318, limb1: 0xdfacc4aee13bf3da9397c201, limb2: 0xcebd5d30c1b12b2267e81f02, limb3: 0x160e8d207ecfa4ee319cf8dc, }, r0a1: u384 { limb0: 0x885a1a2e5b088d3b11726fd3, limb1: 0xbcb3b4daf110df0f500a1339, limb2: 0xe16ba85f2dd0f2272c0b6647, limb3: 0x6822c6c8ea10aef46b89423, }, r1a0: u384 { limb0: 0x3730e4d5494e51774471ba91, limb1: 0xf1af0b885a3b8f02eaf969f6, limb2: 0x7ee91c1608eb59fffe1ae7fa, limb3: 0x149fb1c9f23c4b2da52a5247, }, r1a1: u384 { limb0: 0x85d3ce78367e3de8ca2b82fa, limb1: 0x11c52b8d92a1622e604c4ed9, limb2: 0x9638c9f8c2f0becfe2f26e25, limb3: 0xdf957915588e3d3a3b5b30a, }, }, G2Line { r0a0: u384 { limb0: 0x4527a34a70ec377ccd63a5b2, limb1: 0x351c7771105a0a1096dd87f0, limb2: 0x57630dce3b4db45cbad696a6, limb3: 0xf10733fed03fc5b7ae27fc4, }, r0a1: u384 { limb0: 0x53a208df401e3d6bf657857c, limb1: 0x306991a8af53fac94e1e9b52, limb2: 0x324634590aee6093dd239d9, limb3: 0x855b8b1eedbf578f7498f37, }, r1a0: u384 { limb0: 0x71e5471ff515d0d4982815b6, limb1: 0x9a63281835ec15935519deca, limb2: 0x17a64faa9e7e4ab574a3f785, limb3: 0x134b4a48f53fff9361e1952c, }, r1a1: u384 { limb0: 0x56dc56f73bd268799b824fa3, limb1: 0x4180514d6004cf446a366719, limb2: 0x193a82567b226e738b11a0af, limb3: 0x1498d7e7ad2a68346f7d2199, }, }, G2Line { r0a0: u384 { limb0: 0xd7496e71fc42ba4ca4a3e125, limb1: 0x3045d9e3b7e4e521f2dec347, limb2: 0x53d9d04eac9ca0b33af5f5dc, limb3: 0x6208127dc6aaedad6a3682b, }, r0a1: u384 { limb0: 0x4567073497754e2d4414c821, limb1: 0xb600e3160bc87f68920d2e38, limb2: 0xa591b968314d40db6548d766, limb3: 0x1922ebba883aa4ac7ccac6bc, }, r1a0: u384 { limb0: 0x74b133dfab8505c15b559a41, limb1: 0x63786daabceed65d189742c5, limb2: 0xdbecebda30efe3de4467f495, limb3: 0x11998abbc2dcb0074bdcf880, }, r1a1: u384 { limb0: 0xe933be0b1bb7e7a435070362, limb1: 0x107d55d6f69931a5d73cf90a, limb2: 0x1cd139553284736dd7d96a0, limb3: 0x11f10e3b6bb5601c6033673f, }, }, G2Line { r0a0: u384 { limb0: 0x6c92af226aa27e2cbe8fae21, limb1: 0xbc299acce5e8da96b6b932d, limb2: 0xec46a86181ef1ff2f8317201, limb3: 0x17900cb270764782b3eca3d2, }, r0a1: u384 { limb0: 0x82358801a5440afa7826f03e, limb1: 0xd09104615d27b1dba405157c, limb2: 0xda33c37fe337917d32826e1b, limb3: 0x1be7df7094ce56532653ce2, }, r1a0: u384 { limb0: 0xd33c9c433bdeabd28a276748, limb1: 0x5dd445f6fe3bb3070cd0d395, limb2: 0x8b092b49f4fdf2a38337a44c, limb3: 0x4e047a80a74764555b1ea3d, }, r1a1: u384 { limb0: 0xd83bc84b011c607d97684972, limb1: 0x2b14aae22370badd22ec77ba, limb2: 0xd29b9c7b77c3f08055bb8a9, limb3: 0x125b416bddff21db8d6f42ed, }, }, G2Line { r0a0: u384 { limb0: 0x5be94bbb61ae69bfb97c1797, limb1: 0x5dd4679408b689cd73c98a54, limb2: 0xe9ca66bf05d57e3775833e49, limb3: 0x1245b62efbcc482d11a1f506, }, r0a1: u384 { limb0: 0x89bc52e555d0351b5fdf9289, limb1: 0x25d5f95e819a92cfa5c9eedf, limb2: 0x868fb6bab1644af652495492, limb3: 0xfb6960d2b936f83c386e1bc, }, r1a0: u384 { limb0: 0x3682f4a1c6b6695783cdffad, limb1: 0xb200ca645c7de79024156c46, limb2: 0x6c37635d197c82752cd229bb, limb3: 0x38ca157b9d7f6458c3e568c, }, r1a1: u384 { limb0: 0x2cfee4af636c40073d3b4a1b, limb1: 0xf414198593f1ec8b43e3f792, limb2: 0xb6d0d7a2aee4516e0d748d20, limb3: 0xfa1dcda8c387ca159f89933, }, }, G2Line { r0a0: u384 { limb0: 0x6cf96397e7b79f2fc8c8275d, limb1: 0xfc7cd3706f331af3de61fabf, limb2: 0x78630a1ca624fae6d5770503, limb3: 0x15ed1256df8e5e5ca95b56c8, }, r0a1: u384 { limb0: 0xee76aa06cc2a711c9ed0f30e, limb1: 0xffa3eb442aaeb1342a8a3887, limb2: 0xcd5194bd83d804f9da8e5cda, limb3: 0xf5886abb33616f07cfac605, }, r1a0: u384 { limb0: 0x3e0ff1e7d1f926d905c0e89f, limb1: 0x3fff1943b59d697a741845cd, limb2: 0x4e362d7df69aa3269ea5a418, limb3: 0x13a520fad90f72497a67b697, }, r1a1: u384 { limb0: 0xce7bf1da23ccce53d8e13b8, limb1: 0x56957fccf1163143404a68dd, limb2: 0xd26ebbc9548a9897d0383b14, limb3: 0x329392268b1afdd087dd27b, }, }, G2Line { r0a0: u384 { limb0: 0x1af14241809b40be9e3465e5, limb1: 0xaa6af72c340012f9c342ed55, limb2: 0xbd274776fdde7d41f1c648bc, limb3: 0x139b56d4b863bf5a4ec4b049, }, r0a1: u384 { limb0: 0xfd79bc60d2afcce54c7a7d50, limb1: 0xe8aeb68543d2d716d2dc9004, limb2: 0x268109c94878da47a4fadd5c, limb3: 0x11f2684f4000c4c639319b03, }, r1a0: u384 { limb0: 0xab0257058b3ceebf3856360a, limb1: 0x83546bb85bbd4521ef2c15d7, limb2: 0xb64ba4fcc5f5017bcd494e2a, limb3: 0xb1553a9da615189266752ea, }, r1a1: u384 { limb0: 0xbdcbe0809eed404aaf6bfe78, limb1: 0xb1362562e968fe7fbea0ac52, limb2: 0xbd3b947e8a8fcf148e1a38f6, limb3: 0x11b7ca6951f2354ee8e4035b, }, }, G2Line { r0a0: u384 { limb0: 0x765ce308dd13ea9ec917f81d, limb1: 0x4c2cdefe8611811647fac337, limb2: 0x9e01fde22386755f816c125f, limb3: 0x249a870907df1494e56fc21, }, r0a1: u384 { limb0: 0xc3cd52b28123518842661348, limb1: 0x6678659f6f9ca9e64f594e30, limb2: 0xbdde01f23d77cc2219a64e1, limb3: 0xa59546d0d9d0d18614e9879, }, r1a0: u384 { limb0: 0x7e7be141202ac55eb1d4a8b8, limb1: 0x22ee295a285099a1bdc85200, limb2: 0x7d274b729c40bb351c2bdd3c, limb3: 0x105edf80625508ee7473afc3, }, r1a1: u384 { limb0: 0x8d19d95e92eb2f4d361b91e, limb1: 0xf6cc461a1b4bd0202cc3590b, limb2: 0x87ebac45146065b2dc8d4bde, limb3: 0x1375f5a114849a9f8e0c3d37, }, }, G2Line { r0a0: u384 { limb0: 0xfd9edf6f28adce5f4beebf6e, limb1: 0xf724947c45d624088ca78f8c, limb2: 0x20b6c59e637f510e8f4a8b47, limb3: 0x18088dc11568a6afa4ab3948, }, r0a1: u384 { limb0: 0x326d9eb3b7fd6666e4dfe426, limb1: 0x7fa3c89d89204877db8eea9b, limb2: 0x763eebc05a7142c40f835528, limb3: 0xbcb69318eafdf385a86d0d1, }, r1a0: u384 { limb0: 0xca94ab9874f3014495f9cda4, limb1: 0xe7794778e18217766f5e4602, limb2: 0xc91a61c5cf05cf2822345aa9, limb3: 0x792b27535901b050d8e5527, }, r1a1: u384 { limb0: 0x91ec1515549ee918829c4f28, limb1: 0xdc2b66119fcf23cb6b822b2a, limb2: 0x32919541ad67e68b00f465d2, limb3: 0xa312627d104cde1072922c0, }, }, G2Line { r0a0: u384 { limb0: 0x58f86bbd730aa1df76e95257, limb1: 0x3832640fbf5ff16fd5c86613, limb2: 0xaf56bfc4d589fd5479b90e9a, limb3: 0x3ca74026cf32fba56ec4ff, }, r0a1: u384 { limb0: 0x577775e0ba37cd47da598900, limb1: 0xf402fb94e1c54fc0073a49b0, limb2: 0x2e06dce324741a7e96cd8fcc, limb3: 0x16f491b5bd383da7e70c001, }, r1a0: u384 { limb0: 0xf906737c542dde2e8b5d7bf7, limb1: 0x93d207424c8f01f866d09071, limb2: 0x7a8dc05cf5ae45304b21d8d, limb3: 0x1d432a9b400dc09515479f5, }, r1a1: u384 { limb0: 0x533a88fd57c73a7a668d47a8, limb1: 0x11cd23f02ff6e7610e1522a9, limb2: 0xbb9e0293df841db5d616e680, limb3: 0x19f2811473fbfa9dddb16249, }, }, G2Line { r0a0: u384 { limb0: 0xb04ec27c52875dc87d300a4d, limb1: 0xbe11f68dc22d7c89a578a63, limb2: 0xb0557578664d37b4747b7a9f, limb3: 0x12f5295a85f5353593bc2be4, }, r0a1: u384 { limb0: 0xe2f1989d941ed5564cd41c3e, limb1: 0x688749fe66ae67951f20c5cd, limb2: 0x1e342023b9900ec7038c108e, limb3: 0x36e5e429874afc784f21116, }, r1a0: u384 { limb0: 0x2ee5450e51f44191eacbc602, limb1: 0x85a343b7b9054589be26e47c, limb2: 0x7f0d17d39a05bf1af4d36372, limb3: 0xdeafa2ba02325a88b4c6cbc, }, r1a1: u384 { limb0: 0x715bdc99b0a7881ac0663f5b, limb1: 0xfdc24e93292c1ee0678f2abe, limb2: 0x8c276d6704a0c9e510c84f16, limb3: 0x14796c0842ef2f1021a202cc, }, }, G2Line { r0a0: u384 { limb0: 0x453bf5d35812bbf0123c972a, limb1: 0x3a9bcdec2fe60921bf629abd, limb2: 0x8d4d0d00c4d2739ae3a0b176, limb3: 0x9a76bae205af60fb63330d3, }, r0a1: u384 { limb0: 0xa5e2fc320bd337a5e6bf6e59, limb1: 0x649bf53444907381a7d0f976, limb2: 0x57cfc1f1da9301aff5ef309c, limb3: 0x79042a88c84c694ffd3fa12, }, r1a0: u384 { limb0: 0x8149e3cbfdcb7c4749e0ba73, limb1: 0x72f87f4ff2d25e09a5eae7db, limb2: 0x1d01fadf84a7202ce4489428, limb3: 0x15652f54b134df28e3b93c7, }, r1a1: u384 { limb0: 0xa1b43fd866b4d217c50e744a, limb1: 0xce197f05b592d754e8f84093, limb2: 0xbc7dc9245b7e2113d675abe4, limb3: 0x2f8afc77fac6bc37b0c7667, }, }, G2Line { r0a0: u384 { limb0: 0x50e7013b12d7186ced76039f, limb1: 0x721a7975c8378d2a726c7ae9, limb2: 0xa73c62577fb438f12bf208de, limb3: 0x26dc14d778403bf116e912c, }, r0a1: u384 { limb0: 0x29689dc66843d300ece6c677, limb1: 0xf07525c97e59cd38bb4fbf8c, limb2: 0xd52ba746bdaa1cabecd2c22f, limb3: 0x2af3f0e70834774a2a73eac, }, r1a0: u384 { limb0: 0x7a93d76e421c2471b470689, limb1: 0xa8513b1c40dbc11e983c16dc, limb2: 0x2b12f3f2ca12077d1ce8a979, limb3: 0xe71d0fb35e1b4017a0d875c, }, r1a1: u384 { limb0: 0xa979b1ba179da53c69aed5a8, limb1: 0xf5591963958c0dc86b906f70, limb2: 0x8461006ca66ecff10d3b0159, limb3: 0x9d803979983001a16b8f24a, }, }, G2Line { r0a0: u384 { limb0: 0xa36890bfc74afe64e9f3840c, limb1: 0x8eeaf2f380047dfe3a21b11b, limb2: 0xeb84e8fad6b7625c837aa272, limb3: 0x135ff64b4d73a3a2d0f886b2, }, r0a1: u384 { limb0: 0x6fa3e40ac2853a97b01176dd, limb1: 0xcd16a519987e4aabf6bd8d1, limb2: 0xe4ee3c4f4c650fbfe5a0a370, limb3: 0xcc7efdc19164223dbcb0b43, }, r1a0: u384 { limb0: 0x9ed5597f7236b21674d039f4, limb1: 0x5cce2f4074bfb9593d07dcab, limb2: 0x1467dedd98c377f9f9b46e75, limb3: 0x89f8ba7d879e18afda115ac, }, r1a1: u384 { limb0: 0xce1eb5fb3e129849b7af9b61, limb1: 0xbb388e5edcc82d67d7e505d1, limb2: 0x37f0c598b86ce85a7ccc5e90, limb3: 0xf3dfe35088599f2eeb97849, }, }, G2Line { r0a0: u384 { limb0: 0x703411c08ba63253b98e71d2, limb1: 0x51c06ae22b02444abf9cac41, limb2: 0xa022f80a1a965f69f5d1f383, limb3: 0x12fd2662087ac6751f157414, }, r0a1: u384 { limb0: 0xa277095e594bc58c46d54dde, limb1: 0x8ca1a613e0d12d38a7cddd17, limb2: 0xf0211ed10bf0f743dbc32801, limb3: 0xebf6d5e9967bf3328026291, }, r1a0: u384 { limb0: 0xa39b2f0abb5ff02a8af6ad9d, limb1: 0x404802001d459f026e2fb9fd, limb2: 0x11cdb22b6ba1b2bad0344e21, limb3: 0x772eca503810eaefb95c2fc, }, r1a1: u384 { limb0: 0x1879ebc05549a3ea69bf9c79, limb1: 0x3d68ffd86dae89a1de6536de, limb2: 0xce0084f9fba0a4087e5191c9, limb3: 0x141788fb821ea65aed14d5a1, }, }, G2Line { r0a0: u384 { limb0: 0xb9289920fc29c178a0728467, limb1: 0xf35e17ec8a43244f4e0efb63, limb2: 0xa46135ade487bf1a95a36590, limb3: 0x4597ae1f4cfcdaacff3f6, }, r0a1: u384 { limb0: 0xe926fdfcdb55d8651b029bb7, limb1: 0x741390b7035f30b98e2dcd27, limb2: 0x697fa3901ef0c0d6f4f0693b, limb3: 0xcc420802c358e2dedfc71d4, }, r1a0: u384 { limb0: 0x404a03b34791ba0f3fa9761, limb1: 0x50d30e7876bb541f3ef689f6, limb2: 0x7eca4b1c1a04fdc1c58f3065, limb3: 0xa9e0b8c0194468d35c05fbd, }, r1a1: u384 { limb0: 0xb370e739ea46b6699276bb50, limb1: 0x39805df77c609ca4cb80f044, limb2: 0x1f93a5fc91ea7ec7048f46d8, limb3: 0x109841b0d6d23c644d831b58, }, }, G2Line { r0a0: u384 { limb0: 0x696c2443a8baa527eef5ec6e, limb1: 0x7c385a900f4614f62a38d2e7, limb2: 0xecef959f527ae42bb1b2a0ed, limb3: 0x7fac72373dec09eeaf6db37, }, r0a1: u384 { limb0: 0xc84aa165d81984cbd1d40498, limb1: 0x7ef2f6d8a1b0b82a86a8aea1, limb2: 0x9f04cb828903af563a7ce955, limb3: 0x1260f88b57dddd5bf01540db, }, r1a0: u384 { limb0: 0x7d666c3a74212ecb676ee24e, limb1: 0x8ddff061953f45de2460c7ee, limb2: 0xb69a343af7532ec4af3c8894, limb3: 0x213c5dddce502302ac58fec, }, r1a1: u384 { limb0: 0x9b68c470206e0a6b23d993d7, limb1: 0x8e64f45ab3906177fca690b, limb2: 0x6b3ba9665c9e8cdb62669c9b, limb3: 0x4535c1e41f9fe732b7c4780, }, }, G2Line { r0a0: u384 { limb0: 0x98b0e7890c15a7a839d3b10e, limb1: 0xf4700f5af67e79881b903235, limb2: 0x7f26d7f900cd57991171081b, limb3: 0xa11c46b99ac9b5f162650e0, }, r0a1: u384 { limb0: 0x8a0a163b8e5919da774d6514, limb1: 0x5b711ae4ea88feca76813413, limb2: 0x3cfe334352e602ed13efcdbe, limb3: 0x170158694b626c2fc61e87b1, }, r1a0: u384 { limb0: 0xe2bcaf25cb4ec37db7539e18, limb1: 0xf529b82b627e809c817fa0b2, limb2: 0x1fe26f773f8d5e39076934e, limb3: 0x98193b4da3aac7d8e92f5f3, }, r1a1: u384 { limb0: 0x5d20cd8b1cdf94ce27802746, limb1: 0x2877bd487e7fefe25dc052ef, limb2: 0xc8fd066838059eeb41c965ec, limb3: 0x178ed199c2fb2d36df7fcd0, }, }, G2Line { r0a0: u384 { limb0: 0x4790112971f4fd8af8c65cf3, limb1: 0x2a207f9a2516cd19d12e489, limb2: 0x9ff7a28cec268524a01123a2, limb3: 0x19c97c4cda4b8effc6fd8caf, }, r0a1: u384 { limb0: 0x186239a1ec3cf10b8286a2b2, limb1: 0x3ef3e7aabde5155a565ba9df, limb2: 0x87f2c71389dd8222c768baaf, limb3: 0x27192c74c599b1228aaf1a8, }, r1a0: u384 { limb0: 0x8f69417d578d338a6f398545, limb1: 0x7bf1e9c47453d7351c93abfd, limb2: 0x35f77c3144b037f01890517a, limb3: 0xa405425f46c150020d41e02, }, r1a1: u384 { limb0: 0x31bd174ae90756d6a59e0c49, limb1: 0x83fb482d1737f7e4d899670c, limb2: 0x9109ccd8f333598149678681, limb3: 0xa5e61d696e11d7f360e20c7, }, }, G2Line { r0a0: u384 { limb0: 0x14e4f467f4709129c1d6d6d7, limb1: 0x33e67ed9f2b5e1802523571, limb2: 0x3e76ea8acb143c96671cbc65, limb3: 0x1137f470c8f7d00baa56e5c0, }, r0a1: u384 { limb0: 0xa2a95cfa92d0088ab1308e85, limb1: 0x85a5304db0b3422f71d7ac93, limb2: 0xbc8572953d8f42a55fe99700, limb3: 0xf23701cea5719c6d8b0d3f3, }, r1a0: u384 { limb0: 0x380e418e3c32756e123587f9, limb1: 0x8a39d6b5872d774c57af0ba1, limb2: 0x11473256ad05f9eaac305647, limb3: 0xa642f0b83f002f2b82a1d3f, }, r1a1: u384 { limb0: 0xd5b5c903360b3614bde608b6, limb1: 0x407e2bf83df10c320c4ddafa, limb2: 0x3771cad615e4d7b5de69e962, limb3: 0x105334af5850345d42c10c17, }, }, G2Line { r0a0: u384 { limb0: 0x5c9c29ca75d35044e8ef21c3, limb1: 0x998cb3a19513ab7f61414601, limb2: 0xab00762e628d907a2ae1af86, limb3: 0x1169ce82fb0de161f3893d09, }, r0a1: u384 { limb0: 0xf3a9a8d35f18f808693ffd33, limb1: 0x73f3c4fd6045a7f4571f21bc, limb2: 0xdf7c2193567b491c867fdf00, limb3: 0x16e98d0dd48da5e0edfff5c3, }, r1a0: u384 { limb0: 0xaf283e3c6ef8a94336bc120, limb1: 0xf60a1f61fc714e75be0aadd4, limb2: 0x11634a0b524e6d80246509d7, limb3: 0x16e9e7d8a952a7b31c855f16, }, r1a1: u384 { limb0: 0xc775b52b48f308cf0eda40a5, limb1: 0x8e5b8d423e5aa68c1d100384, limb2: 0x60bf337ffbd88ec5c5c9f419, limb3: 0x89182d6b9c183e0d7ce7769, }, }, G2Line { r0a0: u384 { limb0: 0xe8ab375f9e79671f77c33b38, limb1: 0x32c9317a9c538a1808d10350, limb2: 0x39b7c7695d2524211d5341f3, limb3: 0x373d7203575fda92e7b4b02, }, r0a1: u384 { limb0: 0x54a74ef22bb2c45a0f0992be, limb1: 0xe9d5746328bce07da2a04f41, limb2: 0xf657d148ed56fbf731787b28, limb3: 0x7b03ee28e327f04166f5075, }, r1a0: u384 { limb0: 0x754ae620f48dd7de6afcbb5b, limb1: 0x488b7b5de47bfe76c7d7f1ce, limb2: 0x5a2e05b269b38310ba8b4159, limb3: 0x41965ba496910c39d2c8167, }, r1a1: u384 { limb0: 0xe544c97bb363e3619c50c630, limb1: 0x7fec53ec738123389016bbf, limb2: 0xb12f6ffb0998373cb04be875, limb3: 0x4bf5cef5067781b9809ec64, }, }, G2Line { r0a0: u384 { limb0: 0xbf2c9e34e6bc1bd091b45f67, limb1: 0x5c346e3b836520851797b6d8, limb2: 0x6069138a6940bb4584d47a8b, limb3: 0x1ec9cbb12630fd6ccc6c9c, }, r0a1: u384 { limb0: 0xafbc54c8ade09192bfd558f6, limb1: 0x1faee0208ac7d1e69f12c285, limb2: 0x63c00188230e79c0d80db365, limb3: 0xc8eab23b2d1473ed2b2a733, }, r1a0: u384 { limb0: 0xb63308c849127dc268a45cd6, limb1: 0x36c18af5bbec9380f565bae8, limb2: 0xf0de12a8c99254f36cf0dee2, limb3: 0x2d8f12634dcf817db2f2721, }, r1a1: u384 { limb0: 0xca376f99a70d9e829232cd97, limb1: 0x2444f064f27f2388ae65f100, limb2: 0xbbb2d21896e41edec0347853, limb3: 0x135ff883551823e93448609e, }, }, G2Line { r0a0: u384 { limb0: 0x4d2b6e4cdcfd83a0692003b0, limb1: 0x41629374ff0d1ac17362c794, limb2: 0x18b16faf0521c1c5a11c3523, limb3: 0x18b70eb629a79ff3f9834985, }, r0a1: u384 { limb0: 0xf6dd615a649c30b33d8b88ac, limb1: 0x526f609b923d7ba3b37b63c, limb2: 0x4289133e7279c670978cd569, limb3: 0x11fa0abe9f21dc673b14d917, }, r1a0: u384 { limb0: 0x7f14d726cf9a27a8c970bb68, limb1: 0xe380e6b07cde1eb0fffd95e6, limb2: 0x2c5722bd0e114b506bddd89a, limb3: 0xd3fb948d9f8e2c898c1b3c, }, r1a1: u384 { limb0: 0x86aed9389c52f71bde01a5e0, limb1: 0x4c6baca3b4494d3a4a88343a, limb2: 0xe1083c4faf04588a29999bbc, limb3: 0xcddd31531e910375fb212ff, }, }, G2Line { r0a0: u384 { limb0: 0x235a9f01452a4060e9666d57, limb1: 0xd5d02fd4f582c83fc011b621, limb2: 0x6d73a1f62f157668ad2fde7b, limb3: 0x10506e79bec17d8e51a8464e, }, r0a1: u384 { limb0: 0x18cf57bcbb92130baae8f6c2, limb1: 0x6d9d5afd47ece7697d3e9c13, limb2: 0x2e57a93ee5ece50b3fff8e9, limb3: 0xe6806ed105ec93b0fb969c2, }, r1a0: u384 { limb0: 0xf5fa5b82be86b88814b2d06d, limb1: 0x2ab27456d28150f5ee3375d6, limb2: 0x32b1ec76959111a17a5fa1fc, limb3: 0x7c1d13dcf400899c66a8e7f, }, r1a1: u384 { limb0: 0xa5626b5549a39034af1af868, limb1: 0x1bea223a1c5580bdcbda7e8a, limb2: 0xf29f63f5c820b06bb690a9d3, limb3: 0xc546ee8fac366005eb69d82, }, }, G2Line { r0a0: u384 { limb0: 0x2d6310ed50636162786d1b75, limb1: 0x5cac54906e73bae3b4359998, limb2: 0xbd428c9c44f9a83980265ddd, limb3: 0x2fc21e36ad4d0da0a00add9, }, r0a1: u384 { limb0: 0x80e8a4f63bb295c1f909c9f8, limb1: 0x76045a0b6f715c18ef69c37a, limb2: 0x8e2d6c8495568d22744ab3f3, limb3: 0x2b70c4ecc512e5b7a263f20, }, r1a0: u384 { limb0: 0x74f73dffd0f8db5344a575d1, limb1: 0x8e6d3150c6b50fb0f30b8d42, limb2: 0x1caf7885c868849e8e700707, limb3: 0x130fa43ef7b10a6b7c72a4af, }, r1a1: u384 { limb0: 0x1cd953b2a94a0b0460118689, limb1: 0x5c361d5ff78164edfe007331, limb2: 0x61315250d28c9b99d174dab6, limb3: 0x252277581829378760d4033, }, }, G2Line { r0a0: u384 { limb0: 0x47f1657643a1cbb2571eb8bb, limb1: 0x8914631858f8b77d7a349849, limb2: 0x436fcdebfd20c5f2c775777b, limb3: 0x15d2dad8f611743307bbcb8c, }, r0a1: u384 { limb0: 0x76e0666924671f3fa1e8305c, limb1: 0x99f366ed9ecdc252b3780f8b, limb2: 0xde576eafe0fb738d0ef77352, limb3: 0x900b9e3957454d7bf885b, }, r1a0: u384 { limb0: 0xc288c6a7c06ef42c5512ffbd, limb1: 0x2101acee5d3a6f42634fdb52, limb2: 0x87f97207b5422a53fa6febaa, limb3: 0x468108ffae130a39d212d39, }, r1a1: u384 { limb0: 0x71959c4ce40fbe9db7b7402c, limb1: 0xf04a57d060ab29acaba357bd, limb2: 0x88ead6a27e0673b01bc7797d, limb3: 0xe7b10501dd492414f7f5320, }, }, G2Line { r0a0: u384 { limb0: 0xf313b674fee5c83040549617, limb1: 0x864b49b4b96dc11dcb31a6b2, limb2: 0x7afa88358fa085d4db1d9e6f, limb3: 0x10b916005fc2476498beed41, }, r0a1: u384 { limb0: 0xa5f1bacd2bc2f38d4e1a34d, limb1: 0x45d1d4d76b0b03b8d7da125b, limb2: 0x74a0ba0ae49290dd243bdc61, limb3: 0x185827ff9e3c833ac46e1e16, }, r1a0: u384 { limb0: 0xffae650825626bdffd8ed424, limb1: 0x126a57866536ac1d0b34b17b, limb2: 0x517ba3e3b50188d25dc23dc8, limb3: 0x1276dc74f1b2a7173802ff0f, }, r1a1: u384 { limb0: 0xa73951cadbaab9fe957c0fed, limb1: 0xa232a5178de78c8f681635e5, limb2: 0x30adf5deb8ee4da1fcc053b2, limb3: 0xd840dfc0aae66492a176a2e, }, }, G2Line { r0a0: u384 { limb0: 0x25d4b59740f7116cb1780a57, limb1: 0xf66599aadea648fbb82567e2, limb2: 0xe3cb94f5929ba09bc594b6f3, limb3: 0x14aea73a1e5255d84243cf1b, }, r0a1: u384 { limb0: 0xb4ab235afcaa352751b232b7, limb1: 0x39d514cae45e5f1ca2163b13, limb2: 0x24d5c8e93eafc5a989dd917e, limb3: 0x3f325c33f3120c94b570157, }, r1a0: u384 { limb0: 0x19fc8f20184d782d19ad14ad, limb1: 0x25cb2fec959a766536d22d3f, limb2: 0x3c33822ddba88cb8c5660a53, limb3: 0x577aed0bad6b8ef9bc471ff, }, r1a1: u384 { limb0: 0x83e60f0903c16e1bcae23f39, limb1: 0xc6fe7fe7835463a27bac9a8c, limb2: 0x5c8c12c6fc626555c235f443, limb3: 0x265e58c13368ec3d3828fe2, }, }, G2Line { r0a0: u384 { limb0: 0x3ce32e18da41a2016fbf41b1, limb1: 0xda3e0d01e0bbb52a301585cf, limb2: 0xaf508b2248a1fe6ffc5d18d0, limb3: 0x1274aa625858db0bb675b3bf, }, r0a1: u384 { limb0: 0x4cbc0be362614fff6f6d4898, limb1: 0xdf8603dfa938bc22d0aa98e, limb2: 0xaf3784151a3a1a7585c177cf, limb3: 0xcd9b76612194b440cbd9c67, }, r1a0: u384 { limb0: 0x93de5b0d4ce155335ed8a6ff, limb1: 0x9dc6c21cddb15edd7f401cc4, limb2: 0x2601d5b08d144c3608181a8f, limb3: 0x872d334a6e81b6937f7580f, }, r1a1: u384 { limb0: 0xa90ea56305b0b457ffd7dfd9, limb1: 0x3fd7486324393fe073a67746, limb2: 0x22aaac8be67217e0e49366ff, limb3: 0xdc78f4f3c40b0984ec316e, }, }, G2Line { r0a0: u384 { limb0: 0x91b78bd7e557f93a24ee04c0, limb1: 0xd19051b09bfc86047a41c109, limb2: 0x3402bf57b1f9b24014dc32f9, limb3: 0x13e3027846c5080d9adcee97, }, r0a1: u384 { limb0: 0x7e481c05e40434785193ab1d, limb1: 0xe6af27502aacea453841adeb, limb2: 0x386742381e57d6086584e277, limb3: 0x1135a6ddee7eb562ea6e21dc, }, r1a0: u384 { limb0: 0x76c4a8400e82be43993db399, limb1: 0x9b4212fb3eacecbbe7d9d4ec, limb2: 0xc0d9b62cd322c550cdf92dd, limb3: 0x7529a6acf7161d423b23562, }, r1a1: u384 { limb0: 0xbbea5748b91520366f556220, limb1: 0x99e0ff5b1475c3a1439dcd18, limb2: 0x4927045dd9b230c874e0a4cf, limb3: 0x569e18a0165d0c89300f772, }, }, G2Line { r0a0: u384 { limb0: 0x35a50965750c7716c237772d, limb1: 0xe96b0c22d39fbbbe7f55d6bc, limb2: 0x40864a9ec51fc3fceddf7498, limb3: 0x232f7c41bf2d0ca9a4a6560, }, r0a1: u384 { limb0: 0xebd5d6880bc93e525c5283bd, limb1: 0x911e6efcf7cc8f0983f3a122, limb2: 0xeb2d53ffa24eaa0527809305, limb3: 0x126b7366a9ba4cdc1648b905, }, r1a0: u384 { limb0: 0xd7789f5359bb3bd4b674719b, limb1: 0xecaa3bff242dc5a63ed57279, limb2: 0x85e8faaf82c119cc47bdfe4d, limb3: 0x1042198c5b912b48953f03ee, }, r1a1: u384 { limb0: 0x52c926fe4d73775c8dcc54b9, limb1: 0x56410c723b730b245d2639ae, limb2: 0xe6b9bc3d2b2a15155d82e48f, limb3: 0x11772d7a9fa0b3530a88bfa, }, }, G2Line { r0a0: u384 { limb0: 0xd49d530d6471b000aaa0f15f, limb1: 0x6419093f265991b02bffc7ce, limb2: 0xa00c1451a79e01585e4326eb, limb3: 0x6346c6eff4ca91de5b05384, }, r0a1: u384 { limb0: 0xdfa15634bfcff7dadc461eb5, limb1: 0x29af4f6d3d69636b5928e5d2, limb2: 0xfde39f21b4d6e713d0d155d2, limb3: 0xca4f08ed6e2bdb29750675c, }, r1a0: u384 { limb0: 0x81ff98c5082a2bd3e42457b0, limb1: 0x63554fb7f83f1d8dad23dd52, limb2: 0x2c485af67a9cec9a384d38b5, limb3: 0xd327461f217051c60e87f40, }, r1a1: u384 { limb0: 0x3da25c53119715454f53681b, limb1: 0xc91752cc6b4bdbdfe38db6f2, limb2: 0xe72f2af727bb791caabbec47, limb3: 0x127c4a3487c7d32f6f36e4e8, }, }, G2Line { r0a0: u384 { limb0: 0x90b1d3aaedd7ae3ae5ef62ec, limb1: 0x9c2237332a12d63f617991e0, limb2: 0x88f758a89df448c1dd45282d, limb3: 0x3c52126f27d2dd758ab0770, }, r0a1: u384 { limb0: 0x8bf85f2a28b11ffbcc48f29d, limb1: 0xb79fc38b4398e2af5a4ac3f4, limb2: 0x877b0d7e053d12f91fa49c91, limb3: 0x19ee364564c01cbdf0bd4257, }, r1a0: u384 { limb0: 0xfbe824718174525ae3cbf681, limb1: 0xb434f93ab3f012e5c5fab625, limb2: 0xfaaa0bb2878017e90fb07ac6, limb3: 0x616944a1484a78b2946360a, }, r1a1: u384 { limb0: 0x84c489abf936bfadd293c732, limb1: 0xaa7ca8e76a07f14d2a712245, limb2: 0xef338c44111cd8f2538f16e0, limb3: 0x2f06c9cef716ae3e32a1bd1, }, }, G2Line { r0a0: u384 { limb0: 0xd396b680a9f4f7c6bd038aea, limb1: 0x986cf9351d6ab286ee985c18, limb2: 0x3fb1d1f309c22962f47ec31a, limb3: 0x10fb4fd3b7ad82cb7a20f545, }, r0a1: u384 { limb0: 0x1ed74a546ca919799c8dc7fc, limb1: 0xad96bb817657c40d87a9d3e0, limb2: 0xaae8cd21d5514a6bad3ed8c4, limb3: 0x8d73f64be809e1cf6c21ba3, }, r1a0: u384 { limb0: 0x5ec7fd9fa8d7f0d23ba3e8ad, limb1: 0x6b74854455e59da09187bba, limb2: 0xa36996b7529b95dae966c75d, limb3: 0xcdea79528317107cbfd85dc, }, r1a1: u384 { limb0: 0x3880ae8a1f6f37a409313c14, limb1: 0xa07694a5bc51a90f14a6c6, limb2: 0xdd33ffd933cac57b8cb1b24b, limb3: 0xc48ad7503d01f14954b7e4a, }, }, G2Line { r0a0: u384 { limb0: 0x49369971c3fc33245bb7b9cb, limb1: 0xce9896e5addb637375420be1, limb2: 0x7d4c97a8e9d64c41cf2dffa1, limb3: 0x287b1e39767a3c2d102a825, }, r0a1: u384 { limb0: 0x6f6e6c10c2da68b535025ac5, limb1: 0x9b6128f5e000427659557e1, limb2: 0xba4e1537236425a49e10a76b, limb3: 0xdccc3a8b263abdc2c1112a2, }, r1a0: u384 { limb0: 0xf0f26fb9d99f34211c52ec21, limb1: 0xb091a74cf88bb5563ee29bd1, limb2: 0xb1a3c0e6479e60ec2bf5e312, limb3: 0x6ea612bf02bd6df77f7af9a, }, r1a1: u384 { limb0: 0x773745b51d209d3643ac70f3, limb1: 0xb837418d0188d5d41911d38c, limb2: 0xae750841ca68ec61dd2fac9a, limb3: 0x9b4aec971d45aee69870aa6, }, }, G2Line { r0a0: u384 { limb0: 0x1ea080f661e3664f40e86e5c, limb1: 0x68cfee40024ac6d125d379dd, limb2: 0x629e60758e07b9b05c61ba2b, limb3: 0x1689e26966100efaf80d13ed, }, r0a1: u384 { limb0: 0x320d0999b19811ce060215db, limb1: 0xd9502d1b7afa257773be4230, limb2: 0xc988439b0216e219b7140ccb, limb3: 0x27f9715fcd39d7ac02d48f, }, r1a0: u384 { limb0: 0xc0ef32fd00dded29b70a8660, limb1: 0xaed80ea139f12376a3886fc8, limb2: 0xc3fdb8d6a2210be1cda0c165, limb3: 0x724e4ec574990cb0e7f2fff, }, r1a1: u384 { limb0: 0xf76e88a2a84b78507079bb92, limb1: 0xa85c3a62cb47c5e940583dd0, limb2: 0xcdca5b44b5708fb75e277a0b, limb3: 0x197734db8752e982455cec8, }, }, G2Line { r0a0: u384 { limb0: 0x9658e94dff575b044fd12535, limb1: 0x9e633711f24267eeff96b84c, limb2: 0xd09be055097f3f4285b74b29, limb3: 0xeba32ca0fdf04b16e700d02, }, r0a1: u384 { limb0: 0xdac31a776bf2f2a7eb8d07b1, limb1: 0x99ff3b68fe53867aeee330e, limb2: 0xfc016b0e19f5a9dafe6150af, limb3: 0x1853f7c388088cef95618ee7, }, r1a0: u384 { limb0: 0x25afd3c9e43a6bd85d8f83da, limb1: 0x6636bcf8f7c4ffb03262b3ad, limb2: 0xfab2ea835f15ffa64289aee0, limb3: 0x19a40512a2bc92b145d4a15f, }, r1a1: u384 { limb0: 0x457e5f8262a3fb1f68e2ee64, limb1: 0x2c8e29f8273ba32411548171, limb2: 0x6b7ec622d4cf5c7605c02c7f, limb3: 0x16d592d1bda21aa16790c116, }, }, G2Line { r0a0: u384 { limb0: 0xd80a4ced539c150c77292976, limb1: 0xd1018cbfc2e4ad4590fdd9c5, limb2: 0x65eef4175a5f35f468647ff1, limb3: 0xd47fd0789b1a92106cd2ad0, }, r0a1: u384 { limb0: 0xd0f1e84b8f833d7979a1154, limb1: 0x9ab45965049706c23a88af3a, limb2: 0xb0231a5c90a4e465df178981, limb3: 0x14edfc6d170bd35b2c5c4da, }, r1a0: u384 { limb0: 0xdc1d49daf3fc4c0995bc8e2d, limb1: 0x17d2159bae7cc0df66ddd2f1, limb2: 0x554dbdd1925e2b9c7e37a286, limb3: 0x1660a21b43940b8c8015db0e, }, r1a1: u384 { limb0: 0x251a422c67cfa51ded81106f, limb1: 0xae838377475ad4866ca7cf3a, limb2: 0x97c1cb95155232e345faaa6a, limb3: 0x2730486142b7fc674f5426b, }, }, G2Line { r0a0: u384 { limb0: 0x1393c1940f25665663934fc8, limb1: 0xea7d0b2339e762ea1d7417bc, limb2: 0x38e8c939bcfc597914fa0bc4, limb3: 0x10e5f821e745ef290f773399, }, r0a1: u384 { limb0: 0x3fb68057499c7406aa1ace48, limb1: 0x41257c93b17f3e38108e6f37, limb2: 0x6e97eb8687dab2a2a640c57f, limb3: 0x14df29fafe098da44c7fd33, }, r1a0: u384 { limb0: 0x59456b76c2b8257a9ee80887, limb1: 0xb92657cb2cd74cfb0e2e2af8, limb2: 0x74366a9ca17b733790bace94, limb3: 0x18a62b6be3320f12ef9121ed, }, r1a1: u384 { limb0: 0xd05f8b04255c124be737ddfb, limb1: 0xcaf73bd136dd217b40f1b669, limb2: 0xda811888424a2ec800ca2f97, limb3: 0x157c5205e1188acb79fbef71, }, }, G2Line { r0a0: u384 { limb0: 0x551d19a32197678e501a12c4, limb1: 0x3102f2c93053ce62da9a1b0b, limb2: 0x769adf2e8ae80c60c5c99139, limb3: 0x14fe0b69dfab2ad91193c4a5, }, r0a1: u384 { limb0: 0xe86cd19c62b7325309625290, limb1: 0x9512dfe7f8a0a85b5b129f5a, limb2: 0xe93b9e5ed1d785c66f3d5c64, limb3: 0x65e688294775d76e5ab924f, }, r1a0: u384 { limb0: 0x7dd30ad71ce6a81d732c1d0b, limb1: 0x352705fb9beba70b1561a320, limb2: 0x5f08143a55c4e1b470430252, limb3: 0xb8154b1f10e74f69706d330, }, r1a1: u384 { limb0: 0xc48c1339b316415bca3bb4cc, limb1: 0x510780292ce3d9843a65b76d, limb2: 0xbaba64e0ba594669eb8e95e3, limb3: 0x6a3ff7eb4d1089f7273bf29, }, }, G2Line { r0a0: u384 { limb0: 0x54863ab6d50bc9ff4874b6e6, limb1: 0x937c0d4560eae2eee4b7ce1e, limb2: 0x337805ebca15d19f40277942, limb3: 0x10ff70c91cbb8869a0659bf2, }, r0a1: u384 { limb0: 0x7b3cfe640c29faece9a85e53, limb1: 0xcddbe3decddda92adfd9039a, limb2: 0x42f145b0f85554ee195ae299, limb3: 0x1951ff3142b9a208e5e69e59, }, r1a0: u384 { limb0: 0x94a7ee20add6c18015e26733, limb1: 0xd0f2a6ab15fefff1caa7366a, limb2: 0x9c055a1d93c3f27e46d0b3da, limb3: 0x60f554e35125b7f5d7aac8b, }, r1a1: u384 { limb0: 0xd92e5b001022ee7874cbebeb, limb1: 0x4aed0fd23b92aebc139f77db, limb2: 0xd2bca1fe5ad39a274c9dfeec, limb3: 0xcfab0e5b8e8d7c7a8765b15, }, }, G2Line { r0a0: u384 { limb0: 0x101a676fbbe065b8b0413cd0, limb1: 0xd7be780e12266c035435d9ad, limb2: 0xd7fdc11fb76bab59a38fdb76, limb3: 0x188fd7a942ff955e8dedd5cc, }, r0a1: u384 { limb0: 0xf4267e2accb1a831f299e5ef, limb1: 0xc72c0e3ca886a34323f98177, limb2: 0x3944a21e29b7d7482c48c0a2, limb3: 0x19e2d02a05f168b8c487fced, }, r1a0: u384 { limb0: 0xa7c84f708c6c422e0b09d8be, limb1: 0x8262fa2f39a6188d2d55dbf1, limb2: 0xdfa1e441b0e33621ff08a9fc, limb3: 0x16835a4c15044f6074fb2395, }, r1a1: u384 { limb0: 0xe4e0728b3d36c7178fd1c85, limb1: 0x8dc9951af0d0d139b48a6a19, limb2: 0xef3bffc1480b3d46ce6884aa, limb3: 0x10cba92e51537ca3cb71c662, }, }, G2Line { r0a0: u384 { limb0: 0x21805f763874894483dc214c, limb1: 0x2c02b4ccd505fbbb8d8bd064, limb2: 0xe32a1465866e01898f1f3b14, limb3: 0x15d2f6b35415870ddc7054f2, }, r0a1: u384 { limb0: 0xf6749d4bc9865ee9e261110a, limb1: 0x81c4e72fdd8802ef73ab15ef, limb2: 0xb89ca852d2ba8b3590cd5301, limb3: 0x183abed5b2d1d128fa596426, }, r1a0: u384 { limb0: 0xf71ebb04aab85e83aec862c0, limb1: 0xf473b3e5a56fd96d60f8a264, limb2: 0x3e4b66f8493911a4a00afa1e, limb3: 0x12be1dc90541ee9c7cb4fa59, }, r1a1: u384 { limb0: 0xba5f7a9ccd0748c2fa4e54c8, limb1: 0x1640f7800984bafe7fa1a76d, limb2: 0x48e76aab062b19911f92bcd, limb3: 0x72cecd9e5c7c437cbbc1e4a, }, }, G2Line { r0a0: u384 { limb0: 0x3856dc19dfda21ef560eb176, limb1: 0x932f2c020e0784cc0b8e2582, limb2: 0x9efd70aa14438ded0e7dfcc6, limb3: 0xa60015a3a9584830c4ff86c, }, r0a1: u384 { limb0: 0x4449acbaeda777c3805d02a7, limb1: 0xc1bfdc4d4b74f4fdaf35202d, limb2: 0x4aeb28b040467a2dc5803704, limb3: 0x1993ceccd531b2a68cefc981, }, r1a0: u384 { limb0: 0x942f300d9689f481285d418a, limb1: 0x6df8e92708f641bf87425ab4, limb2: 0xcc53e2815e0e9c8c8771ecd9, limb3: 0x152fd67eeca4f89f468127f7, }, r1a1: u384 { limb0: 0x8babc72b284c008ffe395a3c, limb1: 0xa9986da25d6c33d1781a02e2, limb2: 0xfcf47ee90047077c0ecf5120, limb3: 0xb04a2d97df30a6a7673d205, }, }, G2Line { r0a0: u384 { limb0: 0x1f078a90be515d55a39025dd, limb1: 0xa69e73a9a0f2894ad32c28d8, limb2: 0x406d92af351a91a43b294110, limb3: 0xab36c91eeeaabb24820b390, }, r0a1: u384 { limb0: 0x873b5a72e8ea0e7d255b970a, limb1: 0xf64973cbec18695bfc945495, limb2: 0x533e34319846e866ad7ddd36, limb3: 0x1029fa62305109a4d20176b9, }, r1a0: u384 { limb0: 0x429cba0cb76b0c492577722a, limb1: 0x771bc089fee5e3632dbffa1a, limb2: 0xa7c64b6f38e532de16959d0d, limb3: 0xf38b71fb4269dd2e038223a, }, r1a1: u384 { limb0: 0xddc796c5033428b0b8111c4f, limb1: 0x60ad337fb316c52ef8de0b21, limb2: 0x951808daa18d3ec520bd6279, limb3: 0x3455cf600b5f6c549f38f14, }, }, G2Line { r0a0: u384 { limb0: 0xc431f00ed9ace3016fb073c9, limb1: 0x5ae25790d51ab15f49a22131, limb2: 0x901a956cb84b3957b3a84e64, limb3: 0x2e0a35d40d9a1a94b3497b6, }, r0a1: u384 { limb0: 0xc7231eba998997f68e57ceda, limb1: 0x20d31de71c175ad7214de622, limb2: 0x158aeffac71897dcc253069f, limb3: 0x16e88228b697db4f6c224b34, }, r1a0: u384 { limb0: 0xfa62c8122e911349b00f63f0, limb1: 0x45308aa0b0564ebd07848a22, limb2: 0x487ab0912d2d5ab27c7795dd, limb3: 0x11a0c48848f0d7b20b46fa15, }, r1a1: u384 { limb0: 0xe26fabf8b78e9f83692cff15, limb1: 0xf65d91db0bceb59d3adb17ae, limb2: 0x116f3ba0a3285c727189a385, limb3: 0x7587cc9d7fbe80757df4ca0, }, }, G2Line { r0a0: u384 { limb0: 0x8deb02d48f2ee3be7ae899ed, limb1: 0x4b66f01a40c86e83fded6847, limb2: 0x9c08bb4fe0abcaefc921a40, limb3: 0x8bda1d762c986632aeaca1e, }, r0a1: u384 { limb0: 0x72be08cacb4795f5ddd8497f, limb1: 0xfaddee2a55b5154b35e26966, limb2: 0x7c67f5884f061f219cb8ff55, limb3: 0x6d4fe75b0153bdec12dba82, }, r1a0: u384 { limb0: 0xc235fffbfefdf8e9ef54d2bc, limb1: 0x6581ebd151a1e73c53b163cb, limb2: 0xf60ffd0dd3608c742fba7902, limb3: 0xe9437af3be8b35cbae1f171, }, r1a1: u384 { limb0: 0xdb98cff46b3033365ae5b731, limb1: 0x19f3ec2adf9517d4533cdf7c, limb2: 0xa60fbca3376090bf8f17f4b9, limb3: 0x169bff5211482ee5e64f50ae, }, }, G2Line { r0a0: u384 { limb0: 0x7f3e552c73b94ea5aca6813a, limb1: 0x5b9fb1191df92133f21209d2, limb2: 0xed1129c457c9879b802641a3, limb3: 0x19ac6d2e632d656188368724, }, r0a1: u384 { limb0: 0x4e5019a71576de9d1b3b34e9, limb1: 0x8a250f675e1a5c87b1cafeed, limb2: 0x1f045e71d9147c0c2a877e9, limb3: 0x971468e238ef09daf2a1503, }, r1a0: u384 { limb0: 0x3da11ff3ac1dc5d5f3787156, limb1: 0x41d8b0def9b93b1a5da143b0, limb2: 0xfc9aa67ffbf77864568ad693, limb3: 0x14f2603e77b3d32b5eedb50f, }, r1a1: u384 { limb0: 0x75d221048a3c1136668545d8, limb1: 0xbf498d49345585ec9ec0151c, limb2: 0x87fab9b2ed3acc02eb3065e7, limb3: 0x4ab44ace239f75c81b269a6, }, }, G2Line { r0a0: u384 { limb0: 0x89eec90cedffb5559d9f7cd6, limb1: 0x838145c7842da8419fcaba0e, limb2: 0xa322ce58631513aed92ce0df, limb3: 0x5a79df85b0a96adf6e2dab8, }, r0a1: u384 { limb0: 0xf36133a552f9211634fe2feb, limb1: 0x712f911d31ea73387b467687, limb2: 0xfb3d98acbbe375c161f9d2a8, limb3: 0x11b7c924610a8268c34b8259, }, r1a0: u384 { limb0: 0x50e7cae27aa8b11d0d2bfe43, limb1: 0xf88979ed0a59e7daa98895c9, limb2: 0xdf00ec512e87f5862a699c22, limb3: 0xcad7fd28c40cc541a820fe4, }, r1a1: u384 { limb0: 0x936b0157ffd80fabb32930f9, limb1: 0xc6bffa14bca99e467c671b75, limb2: 0x609410c23cb1d2ce4e5e9242, limb3: 0x5aeec94c1d7d2fb257ce4f7, }, }, G2Line { r0a0: u384 { limb0: 0x25287a87c1b2c3c6b31918d2, limb1: 0xe370de594155a8f78023525d, limb2: 0xfc32f19a5634c28d0fdade43, limb3: 0x11e418fce45f7a3c6e512efa, }, r0a1: u384 { limb0: 0x75d5d71838d8ea9715fe06d7, limb1: 0xa80c2c0bffa400aba5251040, limb2: 0xc0278abc40904092e90b6e66, limb3: 0x108ef6d09cde908ef27196e3, }, r1a0: u384 { limb0: 0xea269f730e5fe202ad27713a, limb1: 0xe4c1f7d6b6c0b1f42caabd9d, limb2: 0xfe90faef2c44002d8cc77466, limb3: 0x11fc2e9b168eebd97097581e, }, r1a1: u384 { limb0: 0x36ca7984ec68a9173c99469d, limb1: 0xbbea51c381392b3f2b8b23a1, limb2: 0x24151a6b372c24850563fe68, limb3: 0xcc41f12dd415378503ddbf1, }, }, G2Line { r0a0: u384 { limb0: 0xa05df784a5a683833d2e1464, limb1: 0x544aef13d7757e76ac4a6a2c, limb2: 0x337b308d7d37a5e715e2c6a7, limb3: 0x1971f0b4a71e609b35922e78, }, r0a1: u384 { limb0: 0x9afd8643829c2749745e919d, limb1: 0x3fe5162dcc95efeedb645acb, limb2: 0x771a45a92c45f43bb070b7fd, limb3: 0x503aa962b29d72a5d9f6cf2, }, r1a0: u384 { limb0: 0x8e80c44f884a20fe7070ea42, limb1: 0x78c55b9104f9b5b599cf0cf7, limb2: 0x6aa9312bbcf5dad8ca58d47c, limb3: 0xa42156c0b189a8b23065b2c, }, r1a1: u384 { limb0: 0x507ea5597266a41fa17c0e3e, limb1: 0x61ca6c9ff959cacbd2e0502f, limb2: 0xe921d3d10d8336d32c718050, limb3: 0x15bd96df3160aaf601255ae2, }, }, G2Line { r0a0: u384 { limb0: 0xa71edee844109581d751e805, limb1: 0xb8a00b098913a289f078c56d, limb2: 0x6da478fc532b7fca09418a40, limb3: 0x1191d99b1ef0e58862d80422, }, r0a1: u384 { limb0: 0x75c2f440eb09724c5176a9d0, limb1: 0xab65773d99721ebb172611d0, limb2: 0xa99eaa66657366b3e9a3e3b5, limb3: 0x15c7e46ba45790e4ec829ff, }, r1a0: u384 { limb0: 0x12c4394ba8b401e3d2cdee10, limb1: 0x8d9953e7ef6751d3e9bea36d, limb2: 0x10a977ee7f951ac566733a4f, limb3: 0x16a460e20580c71c1c0744c2, }, r1a1: u384 { limb0: 0x9b4d92a98ad79937fb74c008, limb1: 0xa800cb5b3af4b7be504667bb, limb2: 0xb141cfd96b37e06a8df4fcdb, limb3: 0x128942ad0ff6774eac6dca11, }, }, G2Line { r0a0: u384 { limb0: 0xbb42fc51b2f0d50a3d7a6796, limb1: 0xfcbc9d2df3136cbd1a372ac4, limb2: 0xea313e60d4b8240679b0175e, limb3: 0x1657a4b33e1400ef6e296282, }, r0a1: u384 { limb0: 0xaf91b402ecc6cf1a742796cf, limb1: 0xab44b72c1fc2f89b5eaa0345, limb2: 0x9f6a20404576105e15a4930c, limb3: 0x10992497f5f8bf4451121322, }, r1a0: u384 { limb0: 0xd9355bfe72d92c6a0950eafd, limb1: 0x89de0bfbfd06c9911cb2d6fb, limb2: 0xe2092d1e99ab65a7a33ba1cd, limb3: 0x1c317a68eeef4d833e396de, }, r1a1: u384 { limb0: 0x631d3efa10e591b7ebcb8dbc, limb1: 0x6a4a0815d19cf339e4663ba9, limb2: 0xe2fb7d9878d26c7c97299a01, limb3: 0x4c4dc455aad226b744ebdd4, }, }, G2Line { r0a0: u384 { limb0: 0x363f9f6e9d53eca0328e6c4c, limb1: 0x43eec7c74e3ff2fa2180ef98, limb2: 0xc59a9948223dbc16b551291f, limb3: 0x284cfe02b07d3ff39333c3d, }, r0a1: u384 { limb0: 0xea6c388e24151607794c7237, limb1: 0x7943928adc33394fb552687f, limb2: 0x76103a90d6ab3bee6e576dbb, limb3: 0x17eec2ea2baa42a1bf9e89fb, }, r1a0: u384 { limb0: 0x93b180c3b870b89a8483888a, limb1: 0x16af0053338af8df2cd3e9ce, limb2: 0xbf7031c6cce8d2490b7ab5bb, limb3: 0x164ea73315847832dfc59d1c, }, r1a1: u384 { limb0: 0x2687d52f75d77442d4eb40fc, limb1: 0x933ac245443011fac81f5ea0, limb2: 0xa5b52ffa9e6d58739784a7fc, limb3: 0x19fe25a70e38b245e579dbf2, }, }, G2Line { r0a0: u384 { limb0: 0xe51e461db9c85f42519fea6, limb1: 0x234a9695204bd44f55ea4de6, limb2: 0xc8d34c6b4580edfc55e023b1, limb3: 0x16691c1bdf57ba041abb3d97, }, r0a1: u384 { limb0: 0xa81022cb0b3b0c523ae71819, limb1: 0x47f7df16fff0877b21676607, limb2: 0xdee4fe1d3c64b3fedec56326, limb3: 0xcfbf5ccb325675b1a3becef, }, r1a0: u384 { limb0: 0x6d42b9d9e765f92b0817551, limb1: 0x352adc09dd7760a5f4208a1e, limb2: 0x5397846e3fff77f500da6dbc, limb3: 0xe26d685c4365e342109d0ba, }, r1a1: u384 { limb0: 0x9bc1051782d84793806d878b, limb1: 0x1642edf27f040ad57feb6f89, limb2: 0x11a5d3523a88580869d28ca2, limb3: 0xd22ff50c5a9bd729115a889, }, }, G2Line { r0a0: u384 { limb0: 0xe4efea113446e8fd94f1eea8, limb1: 0xcb18c21d8448136352da4336, limb2: 0xfc8cdfdaea1682e6fd084488, limb3: 0xfc8dd7ffecc5c9c8a69491d, }, r0a1: u384 { limb0: 0x263cdfc966929543ffe7f0a1, limb1: 0xaa611b31adcfed73c638211a, limb2: 0x42cdea07a698860d491399b, limb3: 0x4d0e0f7ef49a732e7480260, }, r1a0: u384 { limb0: 0xd6d8da1b24a4d916d664dba5, limb1: 0x8eb3998d61387861f1455690, limb2: 0xae1c21768b9aa7f3e94df161, limb3: 0x3cc2fe6e6345650436278fb, }, r1a1: u384 { limb0: 0x3d6ed02228497455788a84b7, limb1: 0x5671f2ed36be99f2c0aa4b99, limb2: 0x64f760aec59aec125ee684b8, limb3: 0x72922fee279ca672ae012c, }, }, G2Line { r0a0: u384 { limb0: 0x30d36077b6d0262e218111c1, limb1: 0xc74774ca1af660eaed4d8329, limb2: 0x6448cecfde912a7d2029dbc, limb3: 0xe743528ce0c94e1a76f2f60, }, r0a1: u384 { limb0: 0xe1f8a574cee0dad622d6fead, limb1: 0xcd681358d077b827cc148be2, limb2: 0xc8fb346621601764fa91b40a, limb3: 0x133d21c52017365921207d63, }, r1a0: u384 { limb0: 0x5cb088f57e1e3f6a62571b37, limb1: 0x4089cdf0fb67a7b1d79838b3, limb2: 0x62401a2e57abb0652e0fee81, limb3: 0xcc83c46ac38241e1c33aca2, }, r1a1: u384 { limb0: 0xfd94f04ec006d63b4825ecfa, limb1: 0x96ef1f9240c32fdc393b81e2, limb2: 0x6d46c2685a1a1c50e84c8b24, limb3: 0x1528bf72bee83f2c80884dd2, }, }, G2Line { r0a0: u384 { limb0: 0x967edf63810f66378035d9a9, limb1: 0xbb41210c71a8e730070081a4, limb2: 0x2b3e319d53a9ed42860fa77f, limb3: 0x6278b145b3c7a6a3036ea47, }, r0a1: u384 { limb0: 0xaf80f0c00386668cb5abd055, limb1: 0x65fd0d8e2a2e33029c34cd23, limb2: 0x248c0e19a9bf0ed6ee322967, limb3: 0x15b221eee9671d26db719f3, }, r1a0: u384 { limb0: 0x84c7a67ad0a0908ffed8fa8d, limb1: 0x36968614bc1f3278ab15d41b, limb2: 0xafbcdf72844d192abdb3ed34, limb3: 0xb4edb23cae78d3d9b83472a, }, r1a1: u384 { limb0: 0xcd0ab14fee3b152169cc5f6a, limb1: 0xf7e829100f6fe0680a97d094, limb2: 0x733af72dfcd1b57ddb6a0304, limb3: 0x1418dc868da9b223b09467e8, }, }, G2Line { r0a0: u384 { limb0: 0x8f8bf2310745715d8e60675, limb1: 0xe7983befc104f7bd4886ad3a, limb2: 0xd6b5d3a93563b2103c29cec1, limb3: 0x1902b1e10713c8d95829b014, }, r0a1: u384 { limb0: 0x392c934ad398e9471a2a3e6f, limb1: 0xc81c0dc22eff61dca36ea27f, limb2: 0x4605027ef09f9b7d03fcc1c2, limb3: 0x142c2105c569b0e7aee457f1, }, r1a0: u384 { limb0: 0x86fc12d4ddb34349e58e0713, limb1: 0x9a132e3db41060771e480d9f, limb2: 0x6e00f3b7a9cbdf6ba01f3694, limb3: 0xf3f4843686de973131d67ee, }, r1a1: u384 { limb0: 0xf7b6328930ed21138fcd8f92, limb1: 0x354fd9f9ec8f828426279c4c, limb2: 0x3df938a725947d029e1edf6f, limb3: 0x1143440784148d84b5ae0952, }, }, G2Line { r0a0: u384 { limb0: 0xb17b80c761f951e735a2d041, limb1: 0xafc877c0c04208f63bf8a886, limb2: 0x153ba811a82f51f9aa3b6016, limb3: 0x184116d06dccf1c2017108ad, }, r0a1: u384 { limb0: 0x4c7b228ff22ef777b4f4ffe6, limb1: 0x8a18bc657a788290b4a1a781, limb2: 0x2222b3823a8b65258b2ef246, limb3: 0x55c2710bd65597460c0f6b, }, r1a0: u384 { limb0: 0x81df44a2a9b9e826d77b92d3, limb1: 0xad7a849671b36dcbfca86928, limb2: 0x18fffc9503099b88e7cac1c1, limb3: 0x315cb565ecea51d7c74a7d6, }, r1a1: u384 { limb0: 0x39e35c74aeb90d9fffb28774, limb1: 0x91c388c611ba957ed3ed4f81, limb2: 0xbfbc4f99e318cbc41997f64b, limb3: 0x862e32a5891b9194a707270, }, }, G2Line { r0a0: u384 { limb0: 0x8acd42eff277e12a1c665cd8, limb1: 0xc8dd9dfb56ea54ca5c9d26e6, limb2: 0x803b24ff12a9cd7524a26b87, limb3: 0x27b1b3c904791e3fa942dcd, }, r0a1: u384 { limb0: 0x7a880435688221e820d4164e, limb1: 0x9754d630e027f9217dd0fba6, limb2: 0xee6cbf6da2000115b0cca0d8, limb3: 0x162f5c264c2d2728aaa1f652, }, r1a0: u384 { limb0: 0x314a0d54f7db63dcd3d6c0e0, limb1: 0x793c614f53a688375ca369e8, limb2: 0x296c4ccd5f785e294abeb492, limb3: 0x20d58632925a8df2d3d48bd, }, r1a1: u384 { limb0: 0x82c581e26e2e612aceaca787, limb1: 0xe02d73cc25449c92dfd7f088, limb2: 0x732270a5ec065ff678b3666e, limb3: 0x17e813008da019a1fab544c, }, }, G2Line { r0a0: u384 { limb0: 0x73932e90ae81b714f637b41, limb1: 0xd8f3711a8fd93fd72b37a9cc, limb2: 0x8f6ada570f26c1e6a53f2861, limb3: 0x5731c6aa600bd4532b267cc, }, r0a1: u384 { limb0: 0x8a8109f0ca0fb9562c4d64ce, limb1: 0xbf3993ec4da2f3066fc4d1a8, limb2: 0x82967409e5b8929a76f60185, limb3: 0x312bc2fe319294c401a076d, }, r1a0: u384 { limb0: 0x56ddd8c196371fb0093419b, limb1: 0x806528309800613a1b0c9257, limb2: 0x807a35a60f04f01393185f4d, limb3: 0xccbed56d82049855d897609, }, r1a1: u384 { limb0: 0x2e1a6d5e5b690ebddb441dd2, limb1: 0xf56e9d8601eb09c2491a54d, limb2: 0xeb1109351a3c57b119c23f9b, limb3: 0xff06fbf0813213028c7e555, }, }, G2Line { r0a0: u384 { limb0: 0x4a074239eac7dc93b8113ddd, limb1: 0x64192efc9a09299ad173b34e, limb2: 0x3e86b7943ceda2cc678e6719, limb3: 0x13a3cf500109646aac4d69e3, }, r0a1: u384 { limb0: 0x89c20af4b5a694d4d6d9d45d, limb1: 0x76071bd0d45623a4cfe9647, limb2: 0xbaeda04445ec73fe1fd859d6, limb3: 0x12f734fc3463dc7adb90dccb, }, r1a0: u384 { limb0: 0xa12928a1d5d6408853a05ae7, limb1: 0xa8fc3f1aa38f3d6554357b31, limb2: 0xbb5e7127cb9669d52daff069, limb3: 0x525a9e909f39cb2e32cb71a, }, r1a1: u384 { limb0: 0x2bf733d3a23d1446da39720e, limb1: 0x69c363f32dc0ed3a22acc728, limb2: 0x3eb64a364ee2cb63222dc046, limb3: 0x1e78c4855ad25e4e08ba1eb, }, }, G2Line { r0a0: u384 { limb0: 0x9f063deced8ca77530af3f4c, limb1: 0x144bdfaa00467ce19a578f40, limb2: 0x3953497d0771124d9b67e427, limb3: 0x12edfb0c935168616a313c49, }, r0a1: u384 { limb0: 0x10dc1d7902422eab8ec34907, limb1: 0x12d2e25b0784cd54e8882aa, limb2: 0x6c8797bc383b2c8d8dcbe8ae, limb3: 0x9d9bc82c6c7d33addea4394, }, r1a0: u384 { limb0: 0x8ad26ea41a8e5290d3cfe9df, limb1: 0x1477ceb694cc8d76e65b3892, limb2: 0x6f7feca1d527322d8f55c7d9, limb3: 0xe209e705b596e62d29d30f5, }, r1a1: u384 { limb0: 0x388372fda80402fd47838445, limb1: 0xfc177a37cf1bab02000be775, limb2: 0xe42caa0cb14387e64244843b, limb3: 0x32e8d8f3a7bf87f74c34b23, }, }, G2Line { r0a0: u384 { limb0: 0x1ed40e3c2cfcc055cd4958d6, limb1: 0xd1453a4587d6c2ca2341043e, limb2: 0xf79c2172e21b91ba79a5ea2d, limb3: 0x65c82633f9d4d20c07f6ad4, }, r0a1: u384 { limb0: 0xc8398341fc07277f183c17d5, limb1: 0x86bc2e62775af5eae61d9aa, limb2: 0x403276e7635ed1cd34473d3d, limb3: 0x18a18bd0be954bbff600c7c1, }, r1a0: u384 { limb0: 0x8b17fbda26b7133b0600c51e, limb1: 0x48147de60df80344b55d8fb8, limb2: 0xa0e018e36cfa14e2a39e57fe, limb3: 0x70aed2d475ad180844d7587, }, r1a1: u384 { limb0: 0xf1d8e65deba9a3605b50946b, limb1: 0x3677c5769dea1762e0a3a25d, limb2: 0x5d4399ba6a9742e8f2aa1928, limb3: 0x2d57160d6c66d1e0c2f0c0, }, }, G2Line { r0a0: u384 { limb0: 0xd0df9414ab14375fa6806880, limb1: 0xca2fbde48dfa612dd7651818, limb2: 0x94d4d577683866abf9418786, limb3: 0x7276c58d38d334aeb17d21d, }, r0a1: u384 { limb0: 0x33624773e56782652526199f, limb1: 0xb8b611175cbe6c3cffc5ac81, limb2: 0xed0e2567d17dff5ac900f3cd, limb3: 0x98cb18ca7165c32cd3cc152, }, r1a0: u384 { limb0: 0x2dc597c44838dee671473465, limb1: 0x42ece025c559c8181b720c1e, limb2: 0xa5788ae10bc5c64c059e3798, limb3: 0x16539b3c5dec7ca770e60c8b, }, r1a1: u384 { limb0: 0x4910c40e6111f70dcb5d6293, limb1: 0x72177ec41f90ef3573b914af, limb2: 0xfcdb8e13aecc36bc984d7dad, limb3: 0x13b535802eb52f78f52b67aa, }, }, G2Line { r0a0: u384 { limb0: 0xe6882416d7bc0be138e4eeb2, limb1: 0x1ffc8c27a2046327376e250, limb2: 0xf96a7955cf8a3345e89477c1, limb3: 0x31ae02e34d7d21957899dbe, }, r0a1: u384 { limb0: 0x148232d34a8da37b7adc99a7, limb1: 0xd0a0095db108dfd24e92848f, limb2: 0x89fb49e1a36591a6b189f964, limb3: 0x1900bee131450e7d7a914ea4, }, r1a0: u384 { limb0: 0x97018429f16d24bc1e7f8af0, limb1: 0x1f68aaf8291a6decfb708b43, limb2: 0x1f700e88b537bffef39907e4, limb3: 0x9cb633f82c6e595f1785e5e, }, r1a1: u384 { limb0: 0xd8d9d3a12a0dd7b129ffda0, limb1: 0x7a94e9da792505fe4fbdb0da, limb2: 0xf16eaac379266d5a4210e839, limb3: 0xc24197c1ceaa3dd3de58b21, }, }, G2Line { r0a0: u384 { limb0: 0x5121ed1a88616e4d4db0595f, limb1: 0x33dbd46ed7b06175cf41f23e, limb2: 0xae1887221e200e7b0b2dd28f, limb3: 0x179fae6949c974ac074721d7, }, r0a1: u384 { limb0: 0xec69c8ab1d267c9a6a6d05f7, limb1: 0xa25badc2829f833ff2ba42c0, limb2: 0x64aa44e985590c9763d34b19, limb3: 0x13f17206143b411a732e3c25, }, r1a0: u384 { limb0: 0x33b78c61366dc7410c76b8f2, limb1: 0x3a9f753c7f24e8f6f4fd395f, limb2: 0xa6211e1c84e26ce0a0835268, limb3: 0xce1328e759d3bc77c72f6b2, }, r1a1: u384 { limb0: 0xb82a77bba83aa44b3fe6d3c5, limb1: 0x7a2266cc1586e32b4ce8c11b, limb2: 0x6faabb2d25781b305c25694d, limb3: 0x13ac4d9a6834b95da26fa06b, }, }, G2Line { r0a0: u384 { limb0: 0x6231a3597b09b6d5fda5c712, limb1: 0x3f3bd12ca9ef48ef6199a7f4, limb2: 0x6883383b5a445ca79fc407ee, limb3: 0x141accc8970ace156fe95a36, }, r0a1: u384 { limb0: 0xe0c805067330b20430c585c8, limb1: 0x8ff3e0c3028ea8f24ee6fb30, limb2: 0xa368fc9a21efabd91ace37d9, limb3: 0x18b35a8fd65ba4cbd734a0ee, }, r1a0: u384 { limb0: 0xf4e1f73d2ed7ccded6c419de, limb1: 0xf379cd28811f89aeea7aee67, limb2: 0x727c64c0e714ab6ea82391e8, limb3: 0xf454aa00efef9460f382b49, }, r1a1: u384 { limb0: 0x952793660f1fe4300657022a, limb1: 0xe8fa6c2b1aa542384940d1ec, limb2: 0x5a1f19c729b4b225b1501e31, limb3: 0xa5b1272b68436f9433d112f, }, }, G2Line { r0a0: u384 { limb0: 0xb5c7f333fb77fb640c54d364, limb1: 0xb370f382462c835aab5cc997, limb2: 0x3d5c94deb689f57008552a5c, limb3: 0x11ae8eb40f5e055e30da56e3, }, r0a1: u384 { limb0: 0x67851527c4720d34d6bcaaa8, limb1: 0x924dd3f263abdaf7b83f876b, limb2: 0xae1834310910f611638e9935, limb3: 0xc901716635675ee60505d5d, }, r1a0: u384 { limb0: 0xe65e10fdcc7035244523c278, limb1: 0x6d6579ed84fe7ac624373c96, limb2: 0x216959b27efc3c4aef7344d3, limb3: 0x16ea4125e47ade4a534b117d, }, r1a1: u384 { limb0: 0xd4486351851ac10086e252a6, limb1: 0x71da57cafc2206d7b9f3e19c, limb2: 0xa20b7261682609eedc279d10, limb3: 0x59452018f5c136620b13c6e, }, }, G2Line { r0a0: u384 { limb0: 0x7ee6a5f3ce669de80b52ba42, limb1: 0xa7d66db543d3c6a626f79dea, limb2: 0x135c684f9ac0e0a34315e044, limb3: 0xaaafef3c4298542248b3a58, }, r0a1: u384 { limb0: 0xe0b267ea1f8e8dc2b83d62e, limb1: 0xabac56946f0699334fa765e6, limb2: 0xee0060a937926e9b6d6adb90, limb3: 0x13d96385b510deff2f4d1d32, }, r1a0: u384 { limb0: 0x1271c3349afe8fbfd4d7ee54, limb1: 0xc4df31a1a0ae89c5728ee819, limb2: 0xa0de891b771af1ba8a67f8db, limb3: 0xf69200f56879e50a92ecd6e, }, r1a1: u384 { limb0: 0x3260bde1e37542b8b8465e10, limb1: 0x7c3420aa9e48318a6606ee07, limb2: 0x126b5e1ded963ffbb6adb4e2, limb3: 0x18d1f7ae28741bb590bb39a6, }, }, G2Line { r0a0: u384 { limb0: 0x181fe8e691b0734fc6c8b3e3, limb1: 0x616410c0af8a1e197fb5f75a, limb2: 0xb38eb80de6b3b0f7f71aef9, limb3: 0xcb084d46b4282aacbed6a60, }, r0a1: u384 { limb0: 0x8a6b2c47cc1ca9c98045b7f6, limb1: 0xcbe8b14d674bbf60db98d808, limb2: 0x46b9bb451cf32e861adae13a, limb3: 0x53d38b36897a4aeb430bd04, }, r1a0: u384 { limb0: 0x23a3e6d947b9435c66858403, limb1: 0xf2ec49526cefd9e1a3004d7, limb2: 0x9b3b0253588d874ed9d95a3, limb3: 0x13ab2d7c5d048283d6322ddf, }, r1a1: u384 { limb0: 0x8c68e023a6d85684960340a1, limb1: 0x779e01cddbe6c1a646dfe94e, limb2: 0xaf9acf72586d61ea2e56cbe8, limb3: 0x1978e28ea8606bfa979cd91, }, }, G2Line { r0a0: u384 { limb0: 0x95db0469c00d953ee476c048, limb1: 0xa412df73ae5febbec296a5fb, limb2: 0x16b9fdec9340c8f3aefa561c, limb3: 0xfc955cb99bde258d8760197, }, r0a1: u384 { limb0: 0x83c7d7a804031b10c844d0cb, limb1: 0xfb88180286d20648b40806c0, limb2: 0x31368cfad1bcb8ef19b9d382, limb3: 0x8fd02881a5331dfb0922a3b, }, r1a0: u384 { limb0: 0x2513b777e720406cfba171f4, limb1: 0x9d9da48be5e4bae3bd3e8c84, limb2: 0x8d75547712fc62f6f651762d, limb3: 0x5f0f52ede58374df52c0643, }, r1a1: u384 { limb0: 0x13d6b4aa8d9a46d5720e1b74, limb1: 0x5b93ebf4000945ce87c9dcf1, limb2: 0xffe34203a0c826e972d857bd, limb3: 0x1870c14dc5ad5a661156fd61, }, }, G2Line { r0a0: u384 { limb0: 0x4d1cdbf8dbab3c8928b0ea75, limb1: 0x58191227095b21b380520bca, limb2: 0xc8b2edfc1fcf1d47ba6bd853, limb3: 0x165cefae4bd7b09e83aea4ac, }, r0a1: u384 { limb0: 0x13f43fbb712c938711770d43, limb1: 0x67b7fe6c084a6b9d0d02edda, limb2: 0x7b0238d25ec12dfd2bc787a9, limb3: 0x11065816aed6fac8813b29d4, }, r1a0: u384 { limb0: 0xdf7a103b140e34e5fe400ff2, limb1: 0xad80cb5f3e6cbfca0f9ba6c2, limb2: 0xd22ace697a5990edb0d940f4, limb3: 0x185537f3f8bb62a81efb3777, }, r1a1: u384 { limb0: 0x78081d7fc6aa11ec6d3eac29, limb1: 0x4c8089e6844b749eabf183cb, limb2: 0x7005abf6c23d8902a06826c0, limb3: 0x1ec6348dffbfbdf92d2018e, }, }, G2Line { r0a0: u384 { limb0: 0x31f476324f857ca9daa71d3f, limb1: 0x5b64b681867d0f5505b9f139, limb2: 0xb89e509fc5decaef9cb221f1, limb3: 0x5b8f08ef767ca4cf5f36622, }, r0a1: u384 { limb0: 0x8f44b24a23750c8f0fa6270d, limb1: 0x554f99004f5b1f2a21b02609, limb2: 0x3710c6daa7cac50a8ca6de8, limb3: 0xa3b4aea7c32a8fc4d9a662b, }, r1a0: u384 { limb0: 0x93f0fbf4c4d931c3a733902b, limb1: 0x3a038220fa2da3a7087689cd, limb2: 0x5bc677d1583979bda5797f17, limb3: 0x11996e8759ccb1bda7042160, }, r1a1: u384 { limb0: 0x1ee1d1db6f033786016fd46, limb1: 0x2d4942546551a7b5afb1ee11, limb2: 0x5c0b006bc71d7e27359f5f02, limb3: 0x35c97a7e460075f4d915117, }, }, G2Line { r0a0: u384 { limb0: 0xc17720fe750cb299759cac, limb1: 0x3099fd19a6b92e3ee803934a, limb2: 0x346f95d569d19d6f13b360ae, limb3: 0xfe3b36652505dca379b0de1, }, r0a1: u384 { limb0: 0xe79d54704a2ac5fe8ec036b3, limb1: 0xd0c59443c6fe3cfc7ed07143, limb2: 0xd35ba6f1be9ef2a32df5ce99, limb3: 0x13c0add36a1987486340d508, }, r1a0: u384 { limb0: 0xa7dbcd98dc000e769a0c1640, limb1: 0x4669b3e3c0832faa8a1bc742, limb2: 0x7f86a3143278c34ce3f7ff7b, limb3: 0xb1d5e7632fb29ed83475f08, }, r1a1: u384 { limb0: 0x7e5b15b8d85c3ddb341f6b3b, limb1: 0xd7a537aa55ed85a2aac5ad6c, limb2: 0x188d659313156b445ea5eb05, limb3: 0x504c8faecb23614b32d77a9, }, }, G2Line { r0a0: u384 { limb0: 0x813cf8d46ec722731cb2e790, limb1: 0x3ae401e3a2c43950dd3e14a5, limb2: 0x7f1e2595a7bf3cb9644dc3a2, limb3: 0x9a64184b516425353d3342b, }, r0a1: u384 { limb0: 0x1be4ad4c913b7f23ef8afc45, limb1: 0x4b9c5ee3da9ae172d5612c39, limb2: 0x362a12402d4cd3c50c5a5bc1, limb3: 0xaf426e78303a8cf5a43520e, }, r1a0: u384 { limb0: 0x1a1fbd631479e96bc85c9b39, limb1: 0x755e043e52470551dc47fa77, limb2: 0x2fd80441adcf386b79dfadce, limb3: 0x15cdd2f908202480bb0f56fb, }, r1a1: u384 { limb0: 0x493a7937f956ab6960bb1a74, limb1: 0xec402c0b38b6cc4d5094363, limb2: 0x3d52461743a5dfe63d2e7a33, limb3: 0x92150697852cb2d08c3521b, }, }, G2Line { r0a0: u384 { limb0: 0xc944c320bf8646db058b9131, limb1: 0x31a88361a84a466aa6b36d75, limb2: 0xdac588f1f3c7445319f734c1, limb3: 0xcac64965fdc6b4f2086ec4d, }, r0a1: u384 { limb0: 0xa9525478edbdf7abe422ecde, limb1: 0x4e92c811d5f5d89e35dbfc2a, limb2: 0x5d684f4f06473e718f79f00c, limb3: 0x88952df34006bf1b7ce357a, }, r1a0: u384 { limb0: 0xa1b9405e17e76b1755dfb581, limb1: 0x30a164060d8e4bb7b88a1c77, limb2: 0x5972aaf0140f12d11fbbf2ab, limb3: 0x483fd927267aa9641997b1a, }, r1a1: u384 { limb0: 0xad6cac2f613f81aa42d4a895, limb1: 0x40f8cc01303a5997e99bda9a, limb2: 0xb01bfb6633906b1ea0a12e46, limb3: 0x101863ec8507dd5b31e4faa4, }, }, G2Line { r0a0: u384 { limb0: 0x3c31209a4897e0f66a542078, limb1: 0xaca6cfb5457ca1adc99138fe, limb2: 0x72bf4739ae7b1a8652c823a2, limb3: 0xdd9144f8c45e6091a6714d7, }, r0a1: u384 { limb0: 0xc8942e9d5abaeec4938f2308, limb1: 0x30ff4bdf679bd4a2b87fa34c, limb2: 0x21acf101ca7ff6cd9129e67a, limb3: 0xda6ef8b0ede3a09d1a5c00b, }, r1a0: u384 { limb0: 0x2c5038a7eeaa757c15d205e, limb1: 0xe9d28bbd2c18d52e1b9024f2, limb2: 0x959d4240dbbc46a2c5bbb5b, limb3: 0x9cd8b42cb440fc77607b954, }, r1a1: u384 { limb0: 0xd35f7d36be1bf213c01aba98, limb1: 0x655bc51b43c6394245778244, limb2: 0xd626d74e22844c1a8e2cc950, limb3: 0x28c4b291b492ca43266277d, }, }, G2Line { r0a0: u384 { limb0: 0xfc9082f258930992ee9bf761, limb1: 0x25180c08fdde19200beedd44, limb2: 0xc756fce25d6036e074aefc7e, limb3: 0x7d15791c8dae11ef3f925f2, }, r0a1: u384 { limb0: 0x4e583c6a2d448a423dbdf113, limb1: 0x9ba1612b6d352bf5ce49bc71, limb2: 0x351d8295b8c7a5bc97d6f32f, limb3: 0x2b7203697312b8ecf30eb04, }, r1a0: u384 { limb0: 0x356ba3cff7bdc33fc3b23217, limb1: 0xe25f4f3ce36e7bd6de98a7c, limb2: 0x217dca629473abb6c457c67b, limb3: 0x104fd19f688af37eb9fd0d17, }, r1a1: u384 { limb0: 0xd2ba6cc56638c175356a56da, limb1: 0xac2ab9c65110ca454592199, limb2: 0x87b1ec93cb67f7b775213e56, limb3: 0x102d4a4c73948b8b8ab0444e, }, }, G2Line { r0a0: u384 { limb0: 0xabb764ac8036eb503e39861f, limb1: 0x22e8fa738389a0378352e2d2, limb2: 0xab10fb803ca53103ce99fc28, limb3: 0x831ad8b93ffed9245877b44, }, r0a1: u384 { limb0: 0xf721e83ab0eb9fa28b5d9349, limb1: 0x71c18646ef565689efc545c0, limb2: 0x590ec1d6f3abfbdb3f9f8b0d, limb3: 0x17707d0e47e7a1044a4fd9c6, }, r1a0: u384 { limb0: 0x16d0a838f9b0fc16504dd27, limb1: 0x5ad87ce7ad12ae830368b776, limb2: 0x62490899b4f397e09c44152f, limb3: 0x15528a389da1580f43d95ade, }, r1a1: u384 { limb0: 0xa715dcbb03bc2faac9d64bc7, limb1: 0xbd9b3ab159baa441a3ff56ad, limb2: 0x257f876f487a6dab4fa17c81, limb3: 0xecfcaeb005ca1b7f92bf862, }, }, G2Line { r0a0: u384 { limb0: 0x84bef2ae28f4fb378ec1eeb6, limb1: 0x1189e835406150f7fbe047cd, limb2: 0x8d7fa056d5bff703455219b9, limb3: 0x17b55cffc9c559918a9ffbca, }, r0a1: u384 { limb0: 0xbcd55d1a045238c11947faae, limb1: 0xfddd35b7f062ea97fa82612f, limb2: 0x73dbd0a4863e8634338c4c3, limb3: 0xfd6b167fe3d1476b5da9dfe, }, r1a0: u384 { limb0: 0xbcf99cf3772f639491c9a228, limb1: 0x1f8ca8645ecbeb98bb9ff5ae, limb2: 0x82f62cc92f240ff8bc4fca5, limb3: 0x6b4211c4d1b18ea0c5a5e4c, }, r1a1: u384 { limb0: 0xe60a226e7c7d83e720ce3f23, limb1: 0xe357a6f93412eb508cc034c3, limb2: 0x532ca9a4ca346dd2e0913328, limb3: 0xae125a2c4b74ea5caf9317f, }, }, G2Line { r0a0: u384 { limb0: 0x81c96089bfd7744eef34464e, limb1: 0x37583018d3364f85efd0c5ec, limb2: 0x20c144a0d93e6ccdc66c38ae, limb3: 0x9751fa26963b775df8f3962, }, r0a1: u384 { limb0: 0x5c8323716b77fe057a8cb7ba, limb1: 0xc82e11ccf5b11d49ed4b32b0, limb2: 0xe56585a0b82123c633345703, limb3: 0x13f124a0518f365218b1a009, }, r1a0: u384 { limb0: 0xa093dab7e233ac8439570651, limb1: 0xd901c2049a6a54c71e11808a, limb2: 0x1e692509d6d11c02341d4d0c, limb3: 0x12fb44f950a81879a6c0334c, }, r1a1: u384 { limb0: 0x4c6dfaea5424692f1a1e29d2, limb1: 0x5abec8e383520c70a53a980e, limb2: 0xd1285ddbd456d6b3671ea61c, limb3: 0xbe7bde925a4027b9de0a86e, }, }, G2Line { r0a0: u384 { limb0: 0xcee35811d6215a2f4fbcca7e, limb1: 0x87a9f5ffd94e460a020bdc94, limb2: 0x7b4027d6083e7b569c7b1c5b, limb3: 0xfc0537dcd5dd9e6b1ad6751, }, r0a1: u384 { limb0: 0xf9d48875a4a0ea5b6dc1ccf, limb1: 0x25cc4de42d310d432c6d742a, limb2: 0x6ee89fc1eee14096b8eaced3, limb3: 0x1796255a42c0c51c278aec7a, }, r1a0: u384 { limb0: 0x25a248f2439f04533e64d80f, limb1: 0x98efa1a63ae245d749997366, limb2: 0x475443b9af6f362e8d49e2f3, limb3: 0xcac2920de98589be71736c8, }, r1a1: u384 { limb0: 0x7f87ae7bb3fbc7cd3298c3a8, limb1: 0x3a353e1542c8d7044c554347, limb2: 0x582f0c10eae19c9dbdd6b54e, limb3: 0x143d3dbcf094964341111145, }, }, G2Line { r0a0: u384 { limb0: 0x9c4a4d3c7bb2576aeac0337b, limb1: 0x8b9250b2bed82359a757e126, limb2: 0x2d7dd2e4d3d0945ac3d9cb88, limb3: 0xa0bad126c265d46d51689b7, }, r0a1: u384 { limb0: 0xf65a98dff64d2a0fc947454f, limb1: 0xa50259b7484098611c2cb9fd, limb2: 0x5a51b1c4671888accdca74af, limb3: 0x133a4335f59c0259f1a3ff19, }, r1a0: u384 { limb0: 0xdde88be699f516d731c68610, limb1: 0xce004ded1806688e8e7c458a, limb2: 0x932f3c1c8e56d4b9f19eb7e9, limb3: 0x124f291f47d76455477102fe, }, r1a1: u384 { limb0: 0xa97c633609d63d754d4a2692, limb1: 0x3c5ba5df2f9bb1cdcfb55e97, limb2: 0x19aa69b7f4751e5e39459c7e, limb3: 0x3f5780b2dcaccad745e1d15, }, }, G2Line { r0a0: u384 { limb0: 0x176b393abcd0ce4e1a0abfe6, limb1: 0xa27e43c4813e25e3825d4305, limb2: 0xa2b625e708805f3d8329056e, limb3: 0xbe9471b1fa793d178fafaa5, }, r0a1: u384 { limb0: 0x8772f1e72349ac1c28dd93f1, limb1: 0x7f3ca6e092edc430dfdae0d4, limb2: 0x99aea3d3180417f157e0a1d5, limb3: 0x107589eb5f841423b30267db, }, r1a0: u384 { limb0: 0x6f3192c426a15b366fd68e0c, limb1: 0xa09c70b764bac8ec13b8e84c, limb2: 0x9f4166c3a19ec3bade0deeba, limb3: 0x113ef2d7612b466865ed0d14, }, r1a1: u384 { limb0: 0xf51d41ee3760589f1a38cb60, limb1: 0x8366651516bb0321ba4e5071, limb2: 0xcc73dc7bd0438d3fc3993c27, limb3: 0xcddb0e17a1abc6f8779d547, }, }, G2Line { r0a0: u384 { limb0: 0xdd3830612c58d544327ca0f0, limb1: 0x1142cd575c788d8d19a24ba9, limb2: 0x45ea7f0421cb2dd4e5b4ed7b, limb3: 0xfb69c6a2cbfc9dfb9b01427, }, r0a1: u384 { limb0: 0x875ab3c75d3a4e43d10b2503, limb1: 0xf7cee1313a095fe9e31b7072, limb2: 0xe85be88d689d67e6e9835268, limb3: 0x10635d3a601f92ab21801ab8, }, r1a0: u384 { limb0: 0x9eb9ef4ae7e0f7713d97450c, limb1: 0x8dfc81038830750d79da8b26, limb2: 0xc17475937901d8cadba451ca, limb3: 0x6f9f723841ae3e1a88c34f4, }, r1a1: u384 { limb0: 0x71e84e872166781dda7182bc, limb1: 0x9dde7059d6c002a7f762da96, limb2: 0x2b9353ca4892a788389ca0fd, limb3: 0xd413552182113308d1bf463, }, }, G2Line { r0a0: u384 { limb0: 0x3d43ae9828f4d7d32e67b5b, limb1: 0xc911d37f003edcf2ffc8c9fa, limb2: 0x6c001f16c0f2e789787cbf46, limb3: 0x77e0463d05f6290d05e7dfd, }, r0a1: u384 { limb0: 0x2ec1174f60371df515bea212, limb1: 0xaa40ca6330076c4664c991be, limb2: 0xaf5afb2da2bbd96b3b9faaf4, limb3: 0x5aebe5e1b60777fd8bcbd90, }, r1a0: u384 { limb0: 0x8d11d501bb6fd58ab12db0a6, limb1: 0x789e3289a146ee25ee0a86eb, limb2: 0x8c876d8e1b63dbfcc9427e3c, limb3: 0xd8ed1716d646a39571c3cef, }, r1a1: u384 { limb0: 0x52421b90854ae1be38c267b8, limb1: 0x50070ae589f60e3c6b251b88, limb2: 0xeff601c6612d2135059bce20, limb3: 0x15001445b3ca05704edef7b7, }, }, G2Line { r0a0: u384 { limb0: 0xcc1f58585e1d7b5bd45c4c1f, limb1: 0x745110cbba12e028cd54150c, limb2: 0x2ce6cbed2508c5d828082677, limb3: 0x28a36f542a28f6997a811fc, }, r0a1: u384 { limb0: 0x541d567dcc7fbea97520cd94, limb1: 0x65d407bf06f076619981fe2e, limb2: 0xd583e9bfd967becef21bf75f, limb3: 0xac2c40f46751f043fe2833b, }, r1a0: u384 { limb0: 0x92c58aae975c98038f79305, limb1: 0x7d1ce0079826b8902c5d46d3, limb2: 0xf99d7ba5cb12513a32fb5eec, limb3: 0x7cc8363ce478f6d8f184c26, }, r1a1: u384 { limb0: 0x8397c406c8e69df7b1cea699, limb1: 0x4a543e21f4fd830fab085fcf, limb2: 0x25a94f2ddc7a920fd1361d5b, limb3: 0x16a2f7057acf7d7df785557d, }, }, G2Line { r0a0: u384 { limb0: 0x87937770aff1215b3c8aa2ef, limb1: 0x7af4729d092f8c530e0d5d53, limb2: 0x72dceca83166ae9b74e474e3, limb3: 0xe4dab5809b2b1b131aea3fc, }, r0a1: u384 { limb0: 0x149aba7a16585e9fbdfde171, limb1: 0x272eab65584693c7f1473254, limb2: 0x7ab33331899bbd8cf6d0eb1a, limb3: 0x1a698cde3793a423932d0f1, }, r1a0: u384 { limb0: 0xc1206df604eca5f7f500aaa0, limb1: 0xdd96a086a731b8db0ce56191, limb2: 0x65310d5aa0d6051cd1892f3d, limb3: 0xae6c26b6f048aaa9fb89d4e, }, r1a1: u384 { limb0: 0x32d38f22f61a778309b0d9d5, limb1: 0x6e22b0d5bae04b5bcc4f1200, limb2: 0xc486b7747b268b5e4e7c5e50, limb3: 0x1932e2f6edad976aba23c400, }, }, G2Line { r0a0: u384 { limb0: 0xf8c9e8b4405badfa94226735, limb1: 0xe35370c03766b0439ba9bc0c, limb2: 0xefd8d2d0063990aea5570748, limb3: 0x125e8f976f7536a2e85ea3cf, }, r0a1: u384 { limb0: 0x8f2d3d1bd687824c71ce27fa, limb1: 0xd5946aef2f36a4cb42aee9b, limb2: 0xce15918bb8dbd901b9685864, limb3: 0xc0299d504b8b7bb5ff23b7f, }, r1a0: u384 { limb0: 0x9a63e8f36e7127f93b5fab1e, limb1: 0x52d9ab603e72bca7b8fc5284, limb2: 0x8f734c44e7ba040f4a30952b, limb3: 0x1478222c63826742286f720, }, r1a1: u384 { limb0: 0x57fd0e62234f512c20e97da2, limb1: 0x876dd44c8838d26ecfad71b0, limb2: 0x9c591e15eb6492035916a674, limb3: 0x13830268b58006ff03775156, }, }, G2Line { r0a0: u384 { limb0: 0x3f1a504c2ca77f19997e6f9e, limb1: 0xc0280e01fb002d9cf729292a, limb2: 0x94b16f0117372c50814ed689, limb3: 0x93fcabcbff9725332fceca8, }, r0a1: u384 { limb0: 0x640748b204326bc404360efa, limb1: 0xcd8d364f90ded1150e8a1cbd, limb2: 0x5bfd4271d8985fc5165ac886, limb3: 0x808eccc45ff3c8d95d12bdf, }, r1a0: u384 { limb0: 0xc3ddbc8776cf4adad76e60c2, limb1: 0xa4d94ec522c73e9132d0828f, limb2: 0xcdc071c7519d2add39a87784, limb3: 0x999ac8cb855c030ea4823ff, }, r1a1: u384 { limb0: 0x87d3939873b4d0b73bebc618, limb1: 0x477c4bd9edf9b8d0a6814448, limb2: 0xc4785670713282577ce1b06f, limb3: 0xcbb49b77bbb8dfff876c014, }, }, G2Line { r0a0: u384 { limb0: 0x5863cf017f4f31c0054a3612, limb1: 0x5a1ef8d1d2c315dd8bc6212, limb2: 0xe33ed175b6d1a029dda7c9aa, limb3: 0x182115eb42220d34f08e487d, }, r0a1: u384 { limb0: 0xb90bfad204b39a3cbcac7b4, limb1: 0x73b8d9e10bc6022a0994e39a, limb2: 0x7f5daebc21a409de8913242d, limb3: 0xfc2db9cb25d08faf7c832, }, r1a0: u384 { limb0: 0x26d0221ad0d5ae39d7d33a8, limb1: 0xbae8e0d584ccaa52aeab179, limb2: 0x59de453ae38340185debc29f, limb3: 0xc5a021a1d3134aa31cb39ed, }, r1a1: u384 { limb0: 0x7472a64d3fccc64229059166, limb1: 0x361a6711e93f12f3d1cb0320, limb2: 0x6bf192bb96314516f10b7449, limb3: 0xcaf028327c4bc3f8af13387, }, }, G2Line { r0a0: u384 { limb0: 0xeb0944547700f042e0e585e6, limb1: 0xcb54fa1bd3a22b31e146eba9, limb2: 0x7f8b0b22ccce3ab5d4c4a6c2, limb3: 0x8db684ceb39ca0328b9483d, }, r0a1: u384 { limb0: 0x4160e63c5da74cdf92293b93, limb1: 0xcaca05d0a73b8498b9a903a0, limb2: 0xd515d294c426597840e358b6, limb3: 0x13f4bc5ec404f999bb87d398, }, r1a0: u384 { limb0: 0x6b103da093cfc45f10c1717e, limb1: 0x5adae0ed434b279585a01644, limb2: 0x8713ed279b4ef038593b6ff2, limb3: 0xc1283b57d9bf775bac4baf, }, r1a1: u384 { limb0: 0xf0902dcb78708b121be9c5e5, limb1: 0xe54c2b77058ade926b8d6d31, limb2: 0x8ff0eb114bc9ab91b267f33a, limb3: 0x3bb58ab0df4567eb62c2fb8, }, }, G2Line { r0a0: u384 { limb0: 0xd53473f5ac7b5e99de412ea4, limb1: 0xf6c216059e7a2a6b1a09d23c, limb2: 0x5de59d8956f5a84da299063e, limb3: 0x159ff2806d40ff15099d5204, }, r0a1: u384 { limb0: 0xfdccb0d7c9716c23df3ced8f, limb1: 0x14e4ca22ebdbc559a20177, limb2: 0x5b60b25f325eb68e4cbd45d, limb3: 0x69a7d5ac5a38cce584e0b0f, }, r1a0: u384 { limb0: 0x903bac45b703185c327d9669, limb1: 0xe524dad4130c677c5a3b0f31, limb2: 0x11518ec180b31fd2f516e8b1, limb3: 0x29448dd80ce3c75c8b0d685, }, r1a1: u384 { limb0: 0x134286c732f95142935a2a98, limb1: 0xc493200ca6cd119550bafdd3, limb2: 0x7008cba4cae32054d22edea4, limb3: 0x15da5ffa50e36869f0f2ac43, }, }, G2Line { r0a0: u384 { limb0: 0xe5d3fc39844c4e589e7eb492, limb1: 0xb684f2aca8ad6c2ad9ccb7b8, limb2: 0xf0b5af70fc13951f7f39d7df, limb3: 0x16d3fc0506ddb9ebfdb25df6, }, r0a1: u384 { limb0: 0xdd6f7e7bd7a0a9950245a69c, limb1: 0x3b1450c65c42587028404440, limb2: 0x3254fe16f1c0a3448b21df94, limb3: 0xa6be2d559107c2bc483a8f, }, r1a0: u384 { limb0: 0xbddf678368c48a8e85f5c779, limb1: 0x41200c401f8eab124f7a1368, limb2: 0x42f89ddb63ec260743821878, limb3: 0xb89fcbcdafbf02998d7d39c, }, r1a1: u384 { limb0: 0xdf81c700b8bbb46d56e45aba, limb1: 0xafff8fb495808b125943f958, limb2: 0x781365baaf374f6c695e0135, limb3: 0xb9f91a65aebc5ddd1c03eee, }, }, G2Line { r0a0: u384 { limb0: 0x5edf9450f71e9104f1c374e9, limb1: 0xcfd112580006deba5077fd8a, limb2: 0x289c80bcf75761bc030bda9d, limb3: 0x142182d337d4bdd0a9dc0152, }, r0a1: u384 { limb0: 0xe3f1affdcbbd3809a6881f8e, limb1: 0x55f40359611c687f96c91dbe, limb2: 0xb90435a9e7260873c34a0cd4, limb3: 0x113f465ca312058e0cd541d6, }, r1a0: u384 { limb0: 0x85f3a8c5d4928087f1ef8229, limb1: 0x62e48188da4d79f1a88f24ba, limb2: 0x58691c7e87e7ecb6e855a469, limb3: 0x25bacfd7256f159ca3eb0e5, }, r1a1: u384 { limb0: 0xfc830160c50a4b17a2dde63b, limb1: 0x1bf46813a25e8e58ff928d53, limb2: 0xe63b74e85e2032c28808627d, limb3: 0x9e218f143196d00fadb36c6, }, }, G2Line { r0a0: u384 { limb0: 0x12d7f5c02580ec2a4ba0a629, limb1: 0x1ca40d1ec830247ff1341e78, limb2: 0x593e73ea84eba1c996c852c3, limb3: 0x84ab3d52609f5caf813d26f, }, r0a1: u384 { limb0: 0xdc2b9a2a9b72f187cb411858, limb1: 0x90c4f86b4683bec50d580ed, limb2: 0x5ba5198fcbb94aa3717bd5c2, limb3: 0x5236a5b01a4fd2c95dbe588, }, r1a0: u384 { limb0: 0xdd048a19481a00e4f3165462, limb1: 0xe828205548a806450d618e75, limb2: 0x9ee5b67676d457e228884f60, limb3: 0x128250d867da43f6fb557d16, }, r1a1: u384 { limb0: 0x906239db66fe95321faa08f5, limb1: 0xd546336aeca0472ea130a9b7, limb2: 0x70ac85b42ab50da2baf4dd17, limb3: 0xaaaf2e3d7a2240eb213f3fa, }, }, G2Line { r0a0: u384 { limb0: 0x2639eca99f5b1f6e6d095faa, limb1: 0x7322d2c5cd33e33d6fd2e0ca, limb2: 0x1c7bca0054ff60c0db156676, limb3: 0x10933118bcf1940615957a6c, }, r0a1: u384 { limb0: 0x43e0d74cf14359d83cc60326, limb1: 0x3d49af8c8914a76283667614, limb2: 0xc090bf9a071c2af83528b361, limb3: 0x14ef91f0b47d2bf1313ba159, }, r1a0: u384 { limb0: 0xe45466ca7f8b6f5920570127, limb1: 0x1554654b09b57871c2ba8a9b, limb2: 0xf66b8bb3a005585c18db86b0, limb3: 0xd28c63f8635e2ca59c7dc45, }, r1a1: u384 { limb0: 0xdc559ff81728e932b3c79d12, limb1: 0xec4893ef0a2c9367a4d736d6, limb2: 0x8b0a21bcded904e222dbf14b, limb3: 0x8c51553f23145b85ca33fbe, }, }, G2Line { r0a0: u384 { limb0: 0x47c09068a72c1519575654f5, limb1: 0x2f216b499e363f8bccb9b68d, limb2: 0x8d117e630991ed6543c83bbf, limb3: 0xece81448505f80c199eedf2, }, r0a1: u384 { limb0: 0x5cfdb49df58c7449bb4d119a, limb1: 0xc86b91022e40b847d4ca6067, limb2: 0xb745a4c4e9730ab196797891, limb3: 0x853f0c583c651c57bdd903d, }, r1a0: u384 { limb0: 0xfac548de6238b1c07e9c8d34, limb1: 0xda71dff567e93e8a1d7d33c0, limb2: 0xc9cefb30737b47af261ab581, limb3: 0xbdcd5f00d079c1a871baeba, }, r1a1: u384 { limb0: 0xb52005aa240ff1c85f7c18bd, limb1: 0x435d4c338a9db0fdeadbff48, limb2: 0x1a3008b87a1d6a2d1d12b9b3, limb3: 0xf4835d66a5b1c168f6371bb, }, }, G2Line { r0a0: u384 { limb0: 0x7a3deb7872768f839060087e, limb1: 0xae5017af4c09ed67c5c2e525, limb2: 0xef2bbb3e118498031e2471f, limb3: 0x5cf357e8473bba00386d238, }, r0a1: u384 { limb0: 0x3b373a0d0a649113f5c7b2fe, limb1: 0xa3913baa2c3f8f7499ac76a6, limb2: 0x425aed5972aa5f4b4d21ffc7, limb3: 0x82938f41814229b1224b32b, }, r1a0: u384 { limb0: 0x5b130ec9295aaeb79868e7d6, limb1: 0xda6c9ffb04ff597a83b36114, limb2: 0xc09586dc17dbca59627bbce4, limb3: 0xd8431f93c66d78cf5b81228, }, r1a1: u384 { limb0: 0xe35d56023ffa020c373e6d85, limb1: 0x22972df9b6181d6397c5ee58, limb2: 0x933a967160fc487717775d67, limb3: 0x19c24474e43b997ab5364a65, }, }, G2Line { r0a0: u384 { limb0: 0xab4a47c9e460a6ab079bc9f4, limb1: 0xa52d15592f6e629c8ed4e221, limb2: 0x6770a2fbfd963ac4ba4c7711, limb3: 0x176bfba99edfa7e6ea9b4180, }, r0a1: u384 { limb0: 0x75096b535e73515e0077950, limb1: 0x4e543e3117b31ed795fc87bc, limb2: 0x3c61b46cdb8ec4196b82a6c6, limb3: 0xe180fc0b5335f6b7320f37, }, r1a0: u384 { limb0: 0x6906e7b73a18fc659f673646, limb1: 0xbf5b4487d46103b30587303e, limb2: 0x8674cc39b5d030003362b6e5, limb3: 0x11d1e6708ce7fc3ee159cced, }, r1a1: u384 { limb0: 0x99596ab37e2a0986bcf42bb7, limb1: 0x1a88d084e06ac121ef049a81, limb2: 0xd0de51ee3dda5694d8704419, limb3: 0x18c7467be5ba537fff691007, }, }, G2Line { r0a0: u384 { limb0: 0x6acbdd11b2e3bf3c4e9a8fc7, limb1: 0xa65c7c83d9e863106be2e6e, limb2: 0xba622ef466154b88c6206dc0, limb3: 0x13847679c97ef8978b3f64c9, }, r0a1: u384 { limb0: 0xa29270a27fe8eff7ff52747, limb1: 0x1b86d1ea5e2cb0e565695293, limb2: 0x5d46595304e94133e1524dc4, limb3: 0x5c65be3c6a8b37e95aaa472, }, r1a0: u384 { limb0: 0x4c113034a2b4e8c08494656, limb1: 0x113bdfa06dc6105f0cee337c, limb2: 0x5ab2297e7c609e4044c01f70, limb3: 0xe5ba46e7903db0416c5e85d, }, r1a1: u384 { limb0: 0x1af25f25f85e2fe5769d4db0, limb1: 0xc25dd758f010619bdce139cb, limb2: 0x539682ada1e9af81af49cbb4, limb3: 0x63c25d8d6ffab7a17da8252, }, }, G2Line { r0a0: u384 { limb0: 0xd9bfc7bee1ea2c4b44bdf384, limb1: 0xcae101c36024fea8c88acb5, limb2: 0x5442f686fb8c7e3cd159699e, limb3: 0x81a70f202f8c7a9ab6ac16e, }, r0a1: u384 { limb0: 0xf79e89f10551862af2ab4d, limb1: 0x9ef28d1b3d37544d0c5c2b63, limb2: 0x10755eab03732c2d03d477cf, limb3: 0xc230221d279a52930a327ec, }, r1a0: u384 { limb0: 0x4909e0184d0d6a6e27087c3e, limb1: 0x867ff3844dd99659a6660bc1, limb2: 0x63a84310b08ecb9919f0f41, limb3: 0x72f48e980ebef31c44fe110, }, r1a1: u384 { limb0: 0xed834e1b94dfdd91c8d4311d, limb1: 0xe0efd3a3e73341c128668e23, limb2: 0xad8f2be3d52a01168b375d5d, limb3: 0xa34b7e1dee43f4de567f3e3, }, }, G2Line { r0a0: u384 { limb0: 0xee48f089c7a4594a201092eb, limb1: 0xc9d8a7b7d87389e25b856b97, limb2: 0x74d54bf4748e38d3b2c782b3, limb3: 0x78af2f8549231aa92bba1b3, }, r0a1: u384 { limb0: 0x61acc46ca422be84be4fee75, limb1: 0xf425406455688e07fe496eb2, limb2: 0x1151b627d67176b268c6b18b, limb3: 0x157a7e87571314c4eeffcc64, }, r1a0: u384 { limb0: 0xd95d245c747804a8f3bd59ab, limb1: 0xb3c7108b5d8ce6d797a8ab29, limb2: 0x452fc047d47ec02830b1b9c1, limb3: 0x12ea35020ddc17232447b57c, }, r1a1: u384 { limb0: 0xb027d5b2037b8170fb63b93a, limb1: 0xf317c06fee2a5ef8113fd9d3, limb2: 0xdd1a58fc8de1d70f065c435c, limb3: 0x11d55ce218987319447cc925, }, }, G2Line { r0a0: u384 { limb0: 0xed2bfa7ce99d4f69b850d09c, limb1: 0x5efc2ec9bfecf49ff6bd1417, limb2: 0xf733724aff4a909b6a9579c4, limb3: 0x129d26f7087d748c81d164c8, }, r0a1: u384 { limb0: 0x4fe6ed09a9ce55efa63b7173, limb1: 0xacdf286e6dda680bd7f43d82, limb2: 0x157ceffdd1328af6f6e5b95c, limb3: 0x160cbfb08a54af89dfeb868a, }, r1a0: u384 { limb0: 0x4ec774d0354010b5e861fe21, limb1: 0xe9ed591725d9834344f2c119, limb2: 0x6381097476472bf91dd79d7, limb3: 0xd2c74ef03918d458f67a780, }, r1a1: u384 { limb0: 0x818639c9a397b4bf6f38e3d3, limb1: 0xa7c0dbcc3c17ee84d28afb8e, limb2: 0xe2e3c55da00c29aaff4a0571, limb3: 0x13b5dbdad3c6aeb8219944e7, }, }, G2Line { r0a0: u384 { limb0: 0x1b9ff207335fcb7b28f48654, limb1: 0xaa059fc26f53a4b15d861e5d, limb2: 0x7409e84a31ef57e217e3d45d, limb3: 0x8f022244af0b719146e8cfb, }, r0a1: u384 { limb0: 0x1fa9d79eb0320e586c2d096a, limb1: 0x8fde2d5c9ef41c1612865896, limb2: 0xec88b9f86c99799b380ebac9, limb3: 0x72c117c18b8dfa89321c27c, }, r1a0: u384 { limb0: 0x4570eb295684cad19e7cfded, limb1: 0x2e204f8114c805f866cca868, limb2: 0xba0509fc0eea7cc65c8b3dee, limb3: 0xc7c1e717bb7b078054d3851, }, r1a1: u384 { limb0: 0x25eb9fba51d76d2292c1e2bf, limb1: 0xa43de47dba6db4c3e5c3d8b8, limb2: 0x365ea08af8998db774b8b61e, limb3: 0x6367ffd71d3c44095424fc7, }, }, G2Line { r0a0: u384 { limb0: 0xbc6935d4f6d5d4aa0ec642b, limb1: 0x1d6e2d4d9106b5ecff982a66, limb2: 0x5e8531cb5f36f807288638c1, limb3: 0xa7631b901291f87b31ffb35, }, r0a1: u384 { limb0: 0x65c64711fddc1f635ae6e574, limb1: 0x9e9ea3a84804bd3fb56c4c1e, limb2: 0x91aa460ccbc52472b90ce0b3, limb3: 0x13b3c25d2edef40f806ef614, }, r1a0: u384 { limb0: 0x9b3f8b6844ada64077c6dc45, limb1: 0x78a3cdbb5ad78183e72572d, limb2: 0x34763f876de5f0004af6d3b9, limb3: 0x148f019d0a59b993e259d612, }, r1a1: u384 { limb0: 0x95843db564a4b5a94a1b14c4, limb1: 0x832d5ca2f0420c55f9007f4a, limb2: 0x56047bf28b726775ad1f126a, limb3: 0x13283203fb6b13b007258900, }, }, G2Line { r0a0: u384 { limb0: 0xd8934218abbe5eda42e0374, limb1: 0x4efa70797ab04d5777f18cae, limb2: 0x657bd72dc32622552c01c3a1, limb3: 0x86675ec3781ecc255b9b8f, }, r0a1: u384 { limb0: 0xdb3cdd784259d6f00a05188, limb1: 0x4d7d18f24dc5139d8829c6be, limb2: 0x9067fb6cb2810aa19e5e838d, limb3: 0x99b7b955ea60c02306dd019, }, r1a0: u384 { limb0: 0x9569e6a9a6dfc936dc66c37d, limb1: 0x8ce5600bf62265cce1600d14, limb2: 0xe437be1358f94ae1da7ba693, limb3: 0x26001dbd81fb98024703f0a, }, r1a1: u384 { limb0: 0x38347efb475ef26461922ce8, limb1: 0x434f13930fd2a42336fc5a71, limb2: 0xa611a973d0bf99e3535651af, limb3: 0xf623d241cf8d903d2d48305, }, }, G2Line { r0a0: u384 { limb0: 0x1bcaf5fed0bbcd1a934472b1, limb1: 0xbd468b117d710b48e9e33679, limb2: 0x705c11550a052c1bb8ccc4ea, limb3: 0x6f15de535822689ea86e65e, }, r0a1: u384 { limb0: 0x95d3b31c7228eccaeaf12838, limb1: 0xa92a1590da11c257350bbf1f, limb2: 0xd4e2202f05265990a6557be7, limb3: 0x11f8c21a8309afd4c60ea316, }, r1a0: u384 { limb0: 0xa27a54fe04de2265b2fe96e8, limb1: 0x53dcd9b100331a701e8ba5f9, limb2: 0x57845f6219e44f2109c795e5, limb3: 0x22a93fc0d0171aa6e5a89a2, }, r1a1: u384 { limb0: 0x95504a55dc0699b071a8dd33, limb1: 0x372f0a3e8d642e214174c90a, limb2: 0xcf8e1be4fec9c43ae6e6c879, limb3: 0x112c15cec305822060501913, }, }, G2Line { r0a0: u384 { limb0: 0x7464425eeb75a1d3a3486fba, limb1: 0xd4f0931c31459109811008d1, limb2: 0x5aac0cfc9b43343826136afb, limb3: 0xf16056dd2e8b5f8240d4ac7, }, r0a1: u384 { limb0: 0xee0993ef125a22747400b5ea, limb1: 0x438805278ea9e18b001cf7da, limb2: 0x11c5cbb3ae17332e06f5b415, limb3: 0x134957b7abe963c5d074abc9, }, r1a0: u384 { limb0: 0xacf8eb684fdd044dd83f813e, limb1: 0xcb5dae51f81a4969f0370c67, limb2: 0x491fc4a63ef64f17b8aa0d30, limb3: 0x188b4199d41c95a7991f2d89, }, r1a1: u384 { limb0: 0x1f69582489be9a39cb94c326, limb1: 0xdfa20ef759cc430ed060c20b, limb2: 0xeab00aeca148c6a408bcd34a, limb3: 0xd6a605bcb73c8061942fb57, }, }, G2Line { r0a0: u384 { limb0: 0x1a00fe857129fb0706afc443, limb1: 0x699bd305a05a49e5376fa125, limb2: 0x5123ef38664f302385f6e355, limb3: 0x1138d923f33a7667d3f218ec, }, r0a1: u384 { limb0: 0xa8b0789c07a18e1212c35b42, limb1: 0xe6062cdb7c672277492e486f, limb2: 0x21d77ef2efc7c58cc7f07fa, limb3: 0xe1c4f192a69167da717d052, }, r1a0: u384 { limb0: 0x1083df31373d17c10c6f96ce, limb1: 0x3c0db10e3745399ce144521, limb2: 0x4be19a961fa7762df7e8174f, limb3: 0x157ba9b5969d3125fa86ea07, }, r1a1: u384 { limb0: 0xd3bd3b38817ebc095decab10, limb1: 0x99d4b7d79829b113b4490f45, limb2: 0x205d4e72b9d31001a602b263, limb3: 0x16fedb246b41f78c5a46ac30, }, }, G2Line { r0a0: u384 { limb0: 0xed72eccb4e30eeaf3b992446, limb1: 0x14e0585cd696c72e9adb4736, limb2: 0x7df5eabb84672fab4d4a6e10, limb3: 0x2d6c8112234d7f18ea478ea, }, r0a1: u384 { limb0: 0x95586dac212579b39f39df97, limb1: 0xff0488c63a739029f85aec22, limb2: 0x38ce286aeea4511ddcb23d59, limb3: 0x444323d14c7a3549b9f6b27, }, r1a0: u384 { limb0: 0xac929d1bb6bfa0df5bd0b951, limb1: 0x9a5e39e018083d89aeeaee3d, limb2: 0xc84698d95675ba2c1b93662e, limb3: 0xa82a23fd9338c15ba09139b, }, r1a1: u384 { limb0: 0x8a89d4ebf46cc78b9a67add2, limb1: 0x1761e578b693547ecbf4817f, limb2: 0xbd9d23d081864a636a27dce, limb3: 0x40d68a72ee4363db50d3c92, }, }, G2Line { r0a0: u384 { limb0: 0x5a204b2b8496bf6fd941adbe, limb1: 0x9c069a02ba48bdf34aed625e, limb2: 0x5459c5d76fa5925ae4b04121, limb3: 0x2c12f82e0dcd33df5ac48a7, }, r0a1: u384 { limb0: 0x38870a783f4004476ddafcab, limb1: 0xa98e80effda828b7a2908d37, limb2: 0x8152285afd4302b3b87447d1, limb3: 0x183817defa2bfa474a6e1fdf, }, r1a0: u384 { limb0: 0x6bceb45fb77a9e20a0152815, limb1: 0x20636e0b8ad36f12a65176b1, limb2: 0x7ee4c1a972b5386c1303665e, limb3: 0x71199de43d6e23e8d666f51, }, r1a1: u384 { limb0: 0x4f26920f05c3d38669cade7a, limb1: 0x9028c6ddc1cd21f516bc0d4, limb2: 0xca7680b59d22ca8045eba3d1, limb3: 0xc81627ec1998db363f1c26, }, }, G2Line { r0a0: u384 { limb0: 0xbdda2d3c31051f4071ae2945, limb1: 0xbc66726ddee31b37d058d7e5, limb2: 0x9f4eb741ac78b510ccf452ab, limb3: 0x65fb0c0d47de8795557bd2f, }, r0a1: u384 { limb0: 0xb9c37518dd4a05df7a4d6dc1, limb1: 0xd4ee64da91ea67b8a4525b4, limb2: 0x73a813ffff40ee810a12214b, limb3: 0x7f9fda3fa03c5295720441d, }, r1a0: u384 { limb0: 0xaa6d391bd6b4113145484e4f, limb1: 0x86d3fa56727d8879496d1827, limb2: 0x71223351a13a9577646c0ec3, limb3: 0x5c4513dff602b8ec227f711, }, r1a1: u384 { limb0: 0xb9b127f0cbfc3172bba7a933, limb1: 0x10d730ec07d1e0f84c5c6c34, limb2: 0x693e354e2246bf96f3ebf563, limb3: 0x1163f7e15fbd10f4086aad86, }, }, G2Line { r0a0: u384 { limb0: 0x324f76ca3eb989e9ccb12696, limb1: 0xeb1a302ddcf16336370c347d, limb2: 0xcd35a0d29495cd0999ca03e2, limb3: 0xa74e5ad34004c7e57d2a14e, }, r0a1: u384 { limb0: 0x525e1ef1f8480fcfda387f8b, limb1: 0xaf0c314992fa29dd3e45eeec, limb2: 0xae09cf42c0a53751919fe1b1, limb3: 0x106562358cc0ca813815bb1f, }, r1a0: u384 { limb0: 0x19d180d969228995aa21a1e5, limb1: 0x34f6f5fbd9b098d1b3efd0b, limb2: 0x3533d5af99af7a4dc323297a, limb3: 0x1604dfd23c32fe35ae8fd03, }, r1a1: u384 { limb0: 0x95f9c758ce1e361efe4c0032, limb1: 0x910fa18b85ad81540e31e1ff, limb2: 0x564537d6beb09c576a28d18f, limb3: 0xa483de0527b3738ae218c4c, }, }, ] .span(); let hint = MPCheckHintBLS12_381 { lambda_root_inverse: E12D { w0: u384 { limb0: 0x1d4eab620cf33a8eded7fd2c, limb1: 0x45778308171f9267fab69519, limb2: 0x874b1a6540a5a24a4fd9c68f, limb3: 0x521ad898cee9071ebcbf44d, }, w1: u384 { limb0: 0xa9f581d9c26c7bc732af4135, limb1: 0x5cecf0013c8d5695a1e6a597, limb2: 0x66651ab83510fb89f6b2afe4, limb3: 0x5966d7f6d173ea01e1a5869, }, w2: u384 { limb0: 0x7a64d089a1a115a3eab1a695, limb1: 0xccdc16d44e3cbdf8393eb355, limb2: 0xccd24b9c3e637b240a4100a3, limb3: 0x110012a0987f151e6eacf408, }, w3: u384 { limb0: 0xd7d9acb3a8622465c6b1c0fe, limb1: 0xcdaab0fcd1147d96b5521ac4, limb2: 0xae897c7118bbf9c0479cff61, limb3: 0xfc350acc198fbd5b4d95cfc, }, w4: u384 { limb0: 0x32d5c3bbed4da9a68948c926, limb1: 0x6f68e9017165ef8db1a4f975, limb2: 0x8c36a4b56c817816904d0605, limb3: 0x6d44964cce393f36664dfb7, }, w5: u384 { limb0: 0x9715bc72d9969488889a609f, limb1: 0x2b0c186b4950da2943f4ad01, limb2: 0x9a49542de5fc03a989fe46f8, limb3: 0x86f3ebd100f5f5157bc57f7, }, w6: u384 { limb0: 0x54e14ea09aad1c01c5c5faac, limb1: 0x65bf572081d748820d57d62d, limb2: 0xe04c49ded673151413b8ce9b, limb3: 0x18776284b17c0858f647e075, }, w7: u384 { limb0: 0xd4ff280a7232eada165a4400, limb1: 0xf5bd8e019057fb48dad4ea34, limb2: 0xae5bd1a1ce889e14808c4ee8, limb3: 0x647bb2047c521d397fd0f7, }, w8: u384 { limb0: 0xc8266658d2a03e597cfec8fc, limb1: 0x62aae0152d3543705d87df48, limb2: 0xfc4fae663d5040baacca25a8, limb3: 0xa97b4be53ee479681acc5eb, }, w9: u384 { limb0: 0x45b2fc96a09f2ffc8b84a4dc, limb1: 0x22bbd02e82d79e84d590ca96, limb2: 0xf24bb9b22ece2fe9e392d6ff, limb3: 0x1338aeb075e78cc7505a5d70, }, w10: u384 { limb0: 0xe4354c04ab5208100a0129af, limb1: 0x4675bf96847cb9d629da62d1, limb2: 0xcbb4b845ab04d0a51ea25ee0, limb3: 0xe608702099837e04fc2e999, }, w11: u384 { limb0: 0x3cca5a2ae19eefaf128521, limb1: 0x7a10d38aa97360f22cd213ab, limb2: 0xe8162fd74d36e0786ea6a88c, limb3: 0x12c968f3ea7364e3ee21b8b2, }, }, w: MillerLoopResultScalingFactor { w0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, w2: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, w4: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, w6: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, w8: u384 { limb0: 0xf1ca42a0e74df934924892fb, limb1: 0x91e7a80fe41d8f58d83f1513, limb2: 0x8e9a0930581e2c940247cd09, limb3: 0x18bc5b99f39cbf0fd8d08768, }, w10: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }, Ris: array![ E12D { w0: u384 { limb0: 0xf63d7acf09f9e238c86f7575, limb1: 0xaf8ac67e915aa56c1f18943c, limb2: 0x1f0d89e52ce00053fb4cd271, limb3: 0x6dcf1ec2bee9d55fd7c7dd0, }, w1: u384 { limb0: 0x8c542fcbddc8a2f30326ff28, limb1: 0x93400f32912e689ef50ff729, limb2: 0x5e397600577a07eddd78a637, limb3: 0x7f05f480f32402899fc238d, }, w2: u384 { limb0: 0xfc8e47f2ce78aed551c79270, limb1: 0xb7505079976315ae30aea8c7, limb2: 0x1397705b5336a8c404e29aba, limb3: 0x71d870e4553f214175e57f7, }, w3: u384 { limb0: 0x32f0ae88611fa10260d597c0, limb1: 0x29a0888f8ce8b899253e37ae, limb2: 0x7123a17956e452893cabef6a, limb3: 0x37df42454ed3974bb2b32f9, }, w4: u384 { limb0: 0xa72f0e1e9c109d242988e116, limb1: 0x54b5dec1284a8c9177b3c945, limb2: 0x815f8322190dde62bdc8a55e, limb3: 0xba703f387adf415b877fd75, }, w5: u384 { limb0: 0x1f07d02f85fc8a875e197521, limb1: 0x5585ddebaf32dc4e03ae577f, limb2: 0x6f8907d9616c496a0f51dbcc, limb3: 0x14068f72159c932c910dd512, }, w6: u384 { limb0: 0xce6bb359366acbb7781372b9, limb1: 0x7c5e8df6083d142e2fd17ccf, limb2: 0x1174df6680c4991d4d20cc80, limb3: 0x17dfc12834ee7334831b24af, }, w7: u384 { limb0: 0x95daa3bc8b9ac34a59ff12f0, limb1: 0xa2349e79dd3de20eea74d8b, limb2: 0x90308dd36ed98b5e1d50a816, limb3: 0x17d3b0da632dabdf4ba0f6c8, }, w8: u384 { limb0: 0x4c5d01ef3358bf5ad26286cc, limb1: 0xed0c77db94e0738119993eb, limb2: 0xfd31f8f2bab3cabf17b82c77, limb3: 0x17ddaa28e29c2317b96c21b7, }, w9: u384 { limb0: 0xea817f28532b8d5198e199dd, limb1: 0x99aeb257fdcdc23c15eb5315, limb2: 0x31387bb67348f155192cf97f, limb3: 0x22b2500baf6ce28a86979f, }, w10: u384 { limb0: 0xb0e382b90ef6654c3bd2e20c, limb1: 0x4d096e4e54120fe17325dec0, limb2: 0xc2d4414912600bfec37d116a, limb3: 0x6524f53a10bd1ed1f7de6ac, }, w11: u384 { limb0: 0x8a680e766390ddaa62af47cd, limb1: 0xf23d641db780ebb70c7fbfbe, limb2: 0x531a0f1fc69bf6acd1695e9a, limb3: 0xebb85352772f284d12c95bf, }, }, E12D { w0: u384 { limb0: 0x46f601ab362202e8276c007d, limb1: 0x586b3c2927dbffdd38a1a44b, limb2: 0x6b07370100418d3fcd5ad5c5, limb3: 0x1727a4684524eb2175d31f50, }, w1: u384 { limb0: 0x73738bbe4943b6aee387caa1, limb1: 0x755dec64232750ca866647b3, limb2: 0x52a64d020d10ab12ab460dd, limb3: 0x57d77a9e8e6cd838edc1e63, }, w2: u384 { limb0: 0x5f2c12da594e423a2108737d, limb1: 0x3aa7e22e27bccb5d4840ac81, limb2: 0x40d4f01ea67f2f082b59dec0, limb3: 0x42e0115d1c7594745490233, }, w3: u384 { limb0: 0x9fe7471a196e8bd9a0db6863, limb1: 0x27379618cb58b0b55c0acff3, limb2: 0x1d61ee1f8c5c6c2e40b633da, limb3: 0x54735182a914667a25226c9, }, w4: u384 { limb0: 0xeb6d788023db42ceefa73d8b, limb1: 0x983e97ed4491a3cda57fabeb, limb2: 0x9449deaf0a40d6de94e8347d, limb3: 0x14276d83ecbbeddabdf9bf5d, }, w5: u384 { limb0: 0x411db147cc5627ef50c9210d, limb1: 0xa34577b4dcbbb76911a90cbb, limb2: 0x5523d4d906c194a134c2695b, limb3: 0xda9195159528161fa4960f2, }, w6: u384 { limb0: 0x7df4506c40e2424b24c6b69b, limb1: 0x934699dcb5cf7eab408dbe02, limb2: 0xf98880b746c6ce0f7f41377d, limb3: 0x9552828c7dcc07d56efc554, }, w7: u384 { limb0: 0x7f232224b4fe0b20245f2fd4, limb1: 0xc9d51a652303decdf4907f6e, limb2: 0x71ae0aeab8e0333d7ff3018, limb3: 0x122dcaa1ba9a8a8613064735, }, w8: u384 { limb0: 0x697c449335ca5f9d21b7f654, limb1: 0xf8a13e81943a4a18f4896097, limb2: 0xde94de861275afae359c3016, limb3: 0x112f00e12354b1ad57581a4d, }, w9: u384 { limb0: 0xfc2ecc6d437c20102b74f4ae, limb1: 0x3fc77a685f0e4ae94092405a, limb2: 0xbd067589e294b4d708407307, limb3: 0x13bbf456483cd4566ed59718, }, w10: u384 { limb0: 0x920a2dc4d6405a69dafd98b8, limb1: 0xaefdccb098674950b928bb5c, limb2: 0x2e93db68f2ed629f9872a3b1, limb3: 0xeef615cd28929e56a59bf2e, }, w11: u384 { limb0: 0x32fb24bfa3edf65997e82785, limb1: 0x11a11c3e6606acd9cd851f81, limb2: 0x55f01d098689453651a335e7, limb3: 0xebec00852daa59ee4861f6c, }, }, E12D { w0: u384 { limb0: 0x49168a1f3a22e43aa9131c14, limb1: 0x6ff87ec4e2647706b3fde592, limb2: 0x9ebb9d7748bb4b630bb9e8ad, limb3: 0x10bbd67a2e6b8bd12ca2a8fc, }, w1: u384 { limb0: 0x4dbbf2265569906a0d24b1bb, limb1: 0x4e4e1893305748d5ffd9fef1, limb2: 0xf13628a4c95b6fc55a9eef6a, limb3: 0x10b832788eae08063407690b, }, w2: u384 { limb0: 0x1acce936e2cf8c477b127acb, limb1: 0xd6ec68233a19bba472836ae0, limb2: 0x45a97406d2a99dc971e2c9eb, limb3: 0x19496c56f34ced68a7cd75ca, }, w3: u384 { limb0: 0x22cc017e588ebe02c9d8944d, limb1: 0x4a12e88d4c855c6e93e88d24, limb2: 0xac08da0adfb221ad320d929c, limb3: 0x925d1d1ef9c0beba6f0a34c, }, w4: u384 { limb0: 0x3de8b6df17b043f047eb3d95, limb1: 0xa0f7fe84c2f3b0c22ea84f0e, limb2: 0x9fc100a34798496f25a17711, limb3: 0x63551db5a468540a882a52a, }, w5: u384 { limb0: 0x6acb9303682c1c8ca5fac965, limb1: 0x5743d3be8818de60a9a1a515, limb2: 0x7df5b7b9df88e4cf55e829b7, limb3: 0x1452bf2c3fe715937d83b5c5, }, w6: u384 { limb0: 0xbe1e1ab9e46108a3da2287de, limb1: 0xe10d9eea83bb012f8e01a28e, limb2: 0x4e0f865fe70bcd3a215ac2d2, limb3: 0x159fe260119fbb98baf253f, }, w7: u384 { limb0: 0xbe7a9434b3beb015897656bd, limb1: 0x6fa097bc9669f5a4c6e33dbe, limb2: 0x7884c156e8281d85d5a0ee4e, limb3: 0x2cf0869f40402c8b1642954, }, w8: u384 { limb0: 0x95cdf327419c78b6710a6c8c, limb1: 0xd3dded1b3595c3ce4312a36a, limb2: 0xc2ccd8f589dd387f86500444, limb3: 0xd2c631a38ce47d9e8f0ee1f, }, w9: u384 { limb0: 0x7e6f24ade84350245ac9e72, limb1: 0xb504394fbc5fc5b04e7a8465, limb2: 0xc8fb3405378036f4c5867363, limb3: 0xcaa4d999eec4b8f23cb8406, }, w10: u384 { limb0: 0xe7e990c95a109a8caa63a02b, limb1: 0xde60f93bdf429d379caaf598, limb2: 0x434f9cece5b000d281057b64, limb3: 0xdca015d5a2e52becd816f7a, }, w11: u384 { limb0: 0x1b9bf5b1707249c394b385b4, limb1: 0x591ab99d664c7bb9537bd1bd, limb2: 0x663ec0365e65c06194887eb1, limb3: 0x6995ffd83bb53d7b9787c81, }, }, E12D { w0: u384 { limb0: 0x4aa7f5d7f85dd4c4af5e97a3, limb1: 0x4c65d12afeff17a68cd917da, limb2: 0x6530b54704b338c9e41d551b, limb3: 0x7f7956e7258b204e6bb76fb, }, w1: u384 { limb0: 0xc3b5ae69e8bc70cc1642be88, limb1: 0x9e9f6a61c9d21a413a15b875, limb2: 0xfb2649c3298b59c310e02346, limb3: 0x61f63de6863a0737ea4c564, }, w2: u384 { limb0: 0xe65eff130e3bf3e78e64a8d5, limb1: 0x3c7415a182a906c0c440ec19, limb2: 0xb16f94ad9149d23b673b8b03, limb3: 0xd54ccfbe6ce28ca435fb866, }, w3: u384 { limb0: 0xd59039e2f71aab9d24fe1f50, limb1: 0x77632f67dd17dd934dcdc3b3, limb2: 0x49405e14816e285681f6d108, limb3: 0x5b0b2403b504c7c3c04fa26, }, w4: u384 { limb0: 0xeef17c2cd5a8e39666056b16, limb1: 0x2a2d7664553675a1cd30ab8, limb2: 0x112482fcc1899b14e6ac805c, limb3: 0x120e02660f9058203246fbf0, }, w5: u384 { limb0: 0x224a2242169998bd45bcfecd, limb1: 0xf40bce68d096dad390d28e98, limb2: 0xd0f1e29a3fe03f4e210140c9, limb3: 0x848bb58f7c097a46b3a03e, }, w6: u384 { limb0: 0x95f2d0acc60f04b266569319, limb1: 0x7dd58a061d1a3e0141a6e2e, limb2: 0x494f27de393ef818bbd4517d, limb3: 0xdc72aced2c6f4a5c4819c14, }, w7: u384 { limb0: 0xd77df88de226de432ab03d2b, limb1: 0x333622e9b8f46b0713f2f072, limb2: 0xea5a83207f896f6abf8ab0e2, limb3: 0x4a715b7a58dc6543add0fc9, }, w8: u384 { limb0: 0xc2816abbab513ff9a9c7b5d1, limb1: 0x82fde4beda8b9e6a5885c858, limb2: 0x1f84be86960bad82590ceca, limb3: 0xc04235cb1fe7822f16be8bc, }, w9: u384 { limb0: 0xedb79bdcbaa9dc247ec2effa, limb1: 0xa269f5787fd2b0bd9ed885f0, limb2: 0x8bf6b02312251b650e69f258, limb3: 0xe44406c2cb2d23cae0a6ab3, }, w10: u384 { limb0: 0x29dfd9eaed5f6ee84dbefdc7, limb1: 0x4efb1890226e01d82c5dd985, limb2: 0x485f10c54276bce940584dc7, limb3: 0x86501a5cf1b338e3103b59e, }, w11: u384 { limb0: 0x7302b90bf0cd9d620156bc89, limb1: 0x7f5499c66dc28fbd4c320700, limb2: 0x34cc18aa5ab46c409e63ff3, limb3: 0x10a91f5f4e43b2f252c415e2, }, }, E12D { w0: u384 { limb0: 0xb719f9dec03ab8f164bb3a6b, limb1: 0x20cb7011e080d653d9dcc756, limb2: 0xe2dbfe688c03d53d6a00fef1, limb3: 0x813beb1246503c45e0f230, }, w1: u384 { limb0: 0xeb0491457c8c6edc155753c1, limb1: 0xd0271cbb54b204bf4b295f5d, limb2: 0xb26e1eb4fab09d1d4faefd5b, limb3: 0x15dd36f07b01019665228060, }, w2: u384 { limb0: 0xbaee8621d18761c3b2904a73, limb1: 0x816d9cac84eb28a5e7d9e25, limb2: 0xcd1c794f2313f6772e45355d, limb3: 0x124a87dab04b19db1b8bd588, }, w3: u384 { limb0: 0xfb0de8939a0760770b40a9cb, limb1: 0x917a039550c37cea059c85e8, limb2: 0xc5edbc8267c1b80ef97cef18, limb3: 0x324f9d878506723c60a4345, }, w4: u384 { limb0: 0x83c439e7eafe348b8671a385, limb1: 0x3bf1e6a663a56bf87b16e6f6, limb2: 0xe5ca68a4b426e6b7c000e7a0, limb3: 0xc7c38ce48b61dd7513469c4, }, w5: u384 { limb0: 0x32bad965995076769d669ace, limb1: 0xd5949cc1627771c51c0bb4d3, limb2: 0x5d34827387c8e3fa45ba7b49, limb3: 0x14a6bccbc3a0c7ead062ac2b, }, w6: u384 { limb0: 0x5221d77a4e1c87eb4fd9fcc5, limb1: 0x9aee6eec1d7ec0ce27a00cea, limb2: 0x8181e5c1b1a7a1b1e6454e58, limb3: 0x16364ed330a5e5ac2211ed9c, }, w7: u384 { limb0: 0xd0db08209c90ad48501b74ca, limb1: 0x6b1f991adece59fe7b2d5db8, limb2: 0x2a617c6295c1be2c062284a1, limb3: 0x15df50360a83866f4fa35544, }, w8: u384 { limb0: 0x4200fde82b3f83f87f7adc25, limb1: 0xba304360e4b83811e874ab86, limb2: 0xc8370b31cae44f74c2d81952, limb3: 0x113787d1e314b4473cc3f55, }, w9: u384 { limb0: 0xe403a7fa1d756ed0dba8fb34, limb1: 0xccf3814c1270f5a1212a245e, limb2: 0xdc74463c46f3f26d79630a77, limb3: 0x3dee0d30b7bb94689c6daee, }, w10: u384 { limb0: 0x3c74ad56a6efcb3c5c1d9c8b, limb1: 0x25d0f254898fb3c093097f4, limb2: 0xf5331098d7ed88bea4215633, limb3: 0x1f45a4472f7628ea0cba303, }, w11: u384 { limb0: 0x7290b9b901cdb657a706a75b, limb1: 0x54d189205a59a1173bb4f663, limb2: 0xe75abfbc13c6d01ac5579e1e, limb3: 0x345cf5c394a7ac50eee7a9f, }, }, E12D { w0: u384 { limb0: 0x344bd25fb7f83d9dfae06f6a, limb1: 0x22fde129b885f0c710ff71ac, limb2: 0x783a03d3f6609e73117cb2d7, limb3: 0xe37e60a61076748d0233945, }, w1: u384 { limb0: 0x29e60bd8298eaf694914bf96, limb1: 0x4d570c1cab177ec2719c02ba, limb2: 0x2b7031090424638824b4463e, limb3: 0xc26aba31fe7a05a5bbc7e8f, }, w2: u384 { limb0: 0x574b39c83abd56863e6172a, limb1: 0xc54b9b6afa11629a99d4636f, limb2: 0xa12f92bcc3f8005b33eec0d, limb3: 0x8d4ad3c7fa6a1b149c19888, }, w3: u384 { limb0: 0x2c11d194c9576b7f466f32d9, limb1: 0x7c55ac60cbb6cb8a927390d5, limb2: 0x57cb35bcc9af97e319be764e, limb3: 0x11c8f585011f475dce234ff7, }, w4: u384 { limb0: 0x33bff81455e77429bd4ee8aa, limb1: 0x1cba0458d1e364c2c64ece45, limb2: 0x8c03288861b89e4335b14d14, limb3: 0x64b8c93dfa5c160f9493484, }, w5: u384 { limb0: 0x2aba92419b5fd3f35844fce4, limb1: 0x429bb226e16a911555eedda0, limb2: 0xc2c54fa7a26bb7296669f9a0, limb3: 0xedb5a603fb61c4588349061, }, w6: u384 { limb0: 0x71a798b6e55ee50c3f59159e, limb1: 0x858e9f261b23e89b180b4c4a, limb2: 0x751305c885f1a21af7ed4e1e, limb3: 0x10964f9f66dc1a6d9df88ce6, }, w7: u384 { limb0: 0x15bad475a51bb3db482ae425, limb1: 0x7254f373bd19c4481767607c, limb2: 0xc11e80391c7c6aaadbfdde61, limb3: 0x15e22e3a46ee30b26a98c6d8, }, w8: u384 { limb0: 0xf78a0e313b61e2ac5105e1a3, limb1: 0x47ec84e1592e649c61bd8776, limb2: 0xe7189f594aba4ccfc6a5a11c, limb3: 0x2f7c3dbf00640bb0148a21b, }, w9: u384 { limb0: 0xc41f29e4dd6b145c6b661df5, limb1: 0x673062ba459b3d042a0cee5f, limb2: 0xcf47a3f2dfef1e55b3e97b8, limb3: 0x19a49c7db5078a54448a9c32, }, w10: u384 { limb0: 0x7da75932777016e386681a3b, limb1: 0x5dfa78392bafdfe2ea984a6e, limb2: 0xfa0b5780b4722ac13170d67, limb3: 0xdca20a45aac899ff8534471, }, w11: u384 { limb0: 0x20d272afe37306d5a752a35c, limb1: 0x3cb6565178072916bd25bcee, limb2: 0x84f886cd8d78cde2acb45c73, limb3: 0x166ebbd52543e9a2ad6f564f, }, }, E12D { w0: u384 { limb0: 0x71bb2c644889a2139f430cad, limb1: 0xf453e8802ab1059d1d517b47, limb2: 0x8e72791f4287dfbb95ce68f5, limb3: 0x19452bfa0813f110ecc74e8f, }, w1: u384 { limb0: 0x2daf0b4287be1963023f46d5, limb1: 0x534ae95e7dd740e2800fd7, limb2: 0xd5e9e2cb66b4ffcb00e4fb35, limb3: 0xca9bc3e4e55c038c84e0b99, }, w2: u384 { limb0: 0x5a1a5909ad03ea711e0f7d50, limb1: 0x4f450184eb018a3bbee2646c, limb2: 0x132d9cf05d2a74ea4af12f6a, limb3: 0xea601cf5926174f615ae34d, }, w3: u384 { limb0: 0x56009030241b25051e7c60ab, limb1: 0x49653a64f27328b24b36a431, limb2: 0xcb3f2876ee487db94d9a8c8e, limb3: 0x176ccfe7df56c88d4d77e6b0, }, w4: u384 { limb0: 0x777b0007ff8949336580dafd, limb1: 0x6240fd408535fd5d5e2a239e, limb2: 0x1a8a6e4d29d8df1d1a44f128, limb3: 0xb900c08323d8fad4afd7461, }, w5: u384 { limb0: 0x4804154f8db931d57b3d4952, limb1: 0x589692071a72e7feaab93c58, limb2: 0x4893fc502e75c3fafb3cffa2, limb3: 0x78ee6e0f71424add9367862, }, w6: u384 { limb0: 0x56f1e165c65d6701d9c8d72d, limb1: 0xc70ec69746317ab3eb2e5b49, limb2: 0xeb1c562f709f33c0e19f16e0, limb3: 0xaed371d73f9f750e9779d14, }, w7: u384 { limb0: 0xa011a3fd58c09a6e7f3f76d2, limb1: 0x5d34d82a867f4d1c3bd46279, limb2: 0xae3b42bb54a050efd9902ac0, limb3: 0x10084af27180873684abfaf8, }, w8: u384 { limb0: 0x8c40fae1d51740fbd0c540ce, limb1: 0x69fff344d5f472a1c52d83c0, limb2: 0x7b8df84c1f122b0449441a27, limb3: 0x142a792323b26d9f32f310d5, }, w9: u384 { limb0: 0x4173f4024c385b2b52eabf19, limb1: 0x4debf14fe4434f2cfa941bd8, limb2: 0x62eba10a2346416ae61c056d, limb3: 0x9baea19f3c57310aa68d30f, }, w10: u384 { limb0: 0x470c9a5918ea3b12844359f1, limb1: 0xf97a14494853215d38d3754f, limb2: 0xd23e9687409056661abb709f, limb3: 0x11394e84e3642ccb7ec05dad, }, w11: u384 { limb0: 0xe732350ab1f36f07bde5c4a7, limb1: 0x265db95a4305a9c4ee911f7a, limb2: 0x330e500f64fd18af7a3c3d78, limb3: 0x114243c10cb4e98eaa22527c, }, }, E12D { w0: u384 { limb0: 0x5c2cfc6a914fa5d7980965e, limb1: 0x80de48670c60e5949512196f, limb2: 0x23d4df1b56009e60e26dc15b, limb3: 0x9129169ad34aad0171a90d1, }, w1: u384 { limb0: 0x1b23a1da94d4d9ad13969f10, limb1: 0x96cb9baefc5a118f384b27d7, limb2: 0xa0992f485a9410d7cce6e205, limb3: 0xbb7b5611649e884b101d9c3, }, w2: u384 { limb0: 0x60891a8a266a27cee0a09a1c, limb1: 0xfd9b045e70482ec052ffd6c, limb2: 0x4a82d989d3fcfda3d23d0789, limb3: 0xbefe911ada4c0fd8150056e, }, w3: u384 { limb0: 0x7109634c22a12f03bc7575, limb1: 0x3560465146565541ff8326a4, limb2: 0x9e4388d110bae139a5146460, limb3: 0x18df1bb4889f0e8436e35316, }, w4: u384 { limb0: 0x38819b839225ab70bb79ae23, limb1: 0x2640a881db6fa15743615201, limb2: 0x61801751cd1a8742d06e98e7, limb3: 0x5b766333766879a731ad833, }, w5: u384 { limb0: 0xe3650f335d56af0a89dd5cf7, limb1: 0x5437795ba9d2867f64f5dc8f, limb2: 0x41358fb12e6a5ed63208bea, limb3: 0x1304e9875fcf1bbe0cf4984f, }, w6: u384 { limb0: 0xe06199520d32463c4895fb76, limb1: 0x239e44a1b7472bb9e3928c3, limb2: 0x3faaa7126afa86e0ccac02b4, limb3: 0xba0b261bef58dc64082d841, }, w7: u384 { limb0: 0x80579b7ecabe4b1c6bd27e7f, limb1: 0xda54e55ee34e1ce69eb01380, limb2: 0xc5e78f1b6a7bb2c57094c127, limb3: 0x3d4150c6b4a01b418d9646c, }, w8: u384 { limb0: 0xb2ecc04591fdd668de2d86e2, limb1: 0xa63ad6aa31101e6c4be44934, limb2: 0x77fa5f8d2026c8f0256fcf43, limb3: 0xea684e10899989d49474ed2, }, w9: u384 { limb0: 0x67f59a72e128d99d7b3a3bdc, limb1: 0x997cb42e388262b6a92cd769, limb2: 0xf23c7a0ea08062d3297e0143, limb3: 0xce8caed0b31565408c2a7e9, }, w10: u384 { limb0: 0x4be943eafe89a30984531544, limb1: 0xa2d077ae492d257ff11bb7ae, limb2: 0xa222ba8de8769fd438c2817, limb3: 0x2255ba650dce97fbed316b2, }, w11: u384 { limb0: 0x4d21bea6b45611509ce730eb, limb1: 0x340fb492f0558334acb4ccf8, limb2: 0x5c3040b88f05c25acb8b35ce, limb3: 0x155847f8080fd6991320f9ca, }, }, E12D { w0: u384 { limb0: 0x25d13b5892adacfaeffe2aea, limb1: 0x2aee4febbea2f40459b107eb, limb2: 0x19c5c4c41dcd61a6f4ba7579, limb3: 0x13241af723624918fd903b28, }, w1: u384 { limb0: 0x8ff9b04334f08e4c49e8ce2, limb1: 0x28c2966f31e0e08817c5cf74, limb2: 0xd60b874eea904a280be515a4, limb3: 0x18f183d3d62072e6b66f4110, }, w2: u384 { limb0: 0xa22500a03ee8ebf353a15614, limb1: 0x279f607a1d94cf8727ad1ac3, limb2: 0x9d5cc495009b0929965f222c, limb3: 0x1029d8c9b14ba02bd2caacfa, }, w3: u384 { limb0: 0xd425541781902201ec22f2a1, limb1: 0x3c388cd7504114ac6bbb4136, limb2: 0xe6bf8d9f49e199cf7eedb194, limb3: 0x11afbc718969caad2d3f7e1b, }, w4: u384 { limb0: 0x4f585eeaad43f01857265b34, limb1: 0x77e04d4ab93fd04750b8072b, limb2: 0xc00bc285a02119ea4c1da23a, limb3: 0x1382db753f8c3905e0e47311, }, w5: u384 { limb0: 0x8e61233422edad3f37a8b352, limb1: 0xd8dc773a6ff4059b9a0a4cb3, limb2: 0xeccbe35b88a061471dd93af5, limb3: 0x104353579926809447957e97, }, w6: u384 { limb0: 0x384c2b731d616e06b9706b87, limb1: 0x6184e0c8e2d7efb1e06154b8, limb2: 0x8167168429698bc7c087ab2a, limb3: 0x194e8c9db8ffa492523d7bdb, }, w7: u384 { limb0: 0xef02a778fe63a32428538720, limb1: 0x93bfb3a65c893583a3688fe, limb2: 0x1175ee9952b07130cc8b3cc9, limb3: 0xb2d14a4629987e71acd5e81, }, w8: u384 { limb0: 0xa816c07b4cc35518ff83c9ab, limb1: 0x1ccdac7487bad56114ab2569, limb2: 0xb390f4a4c15354c6338643b7, limb3: 0xe8e333eb89e659ea821952e, }, w9: u384 { limb0: 0xaeaf2010379242754f5b7f2e, limb1: 0xe2f1bb28b645f9572ab5f6c4, limb2: 0xfe5084401ff0479a6a180942, limb3: 0x18ccc973cf5a7599815ebc7f, }, w10: u384 { limb0: 0xfbcc6f1a1d48a24160749924, limb1: 0xac2ee791fd07a94084c429e, limb2: 0xaaab252962e1102b2892410a, limb3: 0x2c0dbce2c7ff58b3fb2dfa6, }, w11: u384 { limb0: 0xee87fa8cda7e1bd7d4ae31, limb1: 0x5530a68eec71db3821d5eba9, limb2: 0x7c8c0427d82dab63686794e8, limb3: 0xa033e5036049bb12eac6c9b, }, }, E12D { w0: u384 { limb0: 0x3959ad574bcacfbd805a4570, limb1: 0xaab9f932204b35ccad7fb2d7, limb2: 0x6fa101b072d1313611453bf6, limb3: 0x34e294724006c7c710d628b, }, w1: u384 { limb0: 0x155d3e49d0ccb5b95d9e1c27, limb1: 0x1b86b23f1cef30c30980eb2a, limb2: 0x874af95f2c59ddcd93d76006, limb3: 0x1112ad6169cb6e63e65235e, }, w2: u384 { limb0: 0x82ed5ab9afa68983dc9ba552, limb1: 0x9357cfcf9e6e32dd53c8c666, limb2: 0x79a16ac1fb53afd7a079392a, limb3: 0x12a89edea194c648bfaf42e7, }, w3: u384 { limb0: 0x5eca27f7deb3e9c8c10c08f8, limb1: 0x35321bd9e01f65b62ca2aecc, limb2: 0xc5cc73f3e11486f5229b5b4b, limb3: 0x78a5b9ae5119db042c5e071, }, w4: u384 { limb0: 0xf83ea19e58f36dfb00f5ce55, limb1: 0xa9e201136fafc1bff43560d8, limb2: 0x23fd58ab1bf41c10792d7ffd, limb3: 0x4ebec45d01da532c22ab1bb, }, w5: u384 { limb0: 0x684275e8d953a79f60899ccb, limb1: 0xb18e874d63bf59ce2c949011, limb2: 0x457fb3e09f148575e172066c, limb3: 0x150b00dfaa17d829b6dd5c03, }, w6: u384 { limb0: 0xd149a0d4da27002a5642c37b, limb1: 0xa71fea7579ac00de168a813d, limb2: 0x117b36766caa30b7cc54cf39, limb3: 0x5376ad503028c81c1359a67, }, w7: u384 { limb0: 0x60cf60a90b0f985ac2aacdd7, limb1: 0x20ed4c6d121128b29ca8c7f2, limb2: 0x9d9a5f70c09f70c572cdb9f8, limb3: 0x33b86259bf794af7ff4b871, }, w8: u384 { limb0: 0x247e6ab4517b16d9454b428a, limb1: 0xb3647e9f6093737762a5c15b, limb2: 0x4764994dbefe4268f940353, limb3: 0x9e9e48f06256acea0e845ea, }, w9: u384 { limb0: 0x3fa933373fcb565bb588371f, limb1: 0x53babd42743d6d401b70dc45, limb2: 0xc61d4b87a359271a9318d7c6, limb3: 0xadd5ef0316a5b7771a60136, }, w10: u384 { limb0: 0x97038a4a9cdb7d2fcec42361, limb1: 0x59ce5adedbdb2b586a82e8ad, limb2: 0xf22dbf3800a4a169d3c6c7e2, limb3: 0x173f59f580a1bedc1b8f8674, }, w11: u384 { limb0: 0xccc37b11a6abd0b1c43eca61, limb1: 0xc2e453ad058b0159b3bb8b88, limb2: 0x291724dc796ab3a452decb5e, limb3: 0x167c4d498cafbbc0709a910b, }, }, E12D { w0: u384 { limb0: 0xfb6f2dc21108c4b5151f2644, limb1: 0xb62a4d04de63665a00a57773, limb2: 0x1670b2eaf514bfc8fc53ce22, limb3: 0x130f529c90d3b568aca6e087, }, w1: u384 { limb0: 0x19d81dc0086b598004e3bef7, limb1: 0xbc1384c369a618483eaa5567, limb2: 0x6ad960cc8a498524c1ec078, limb3: 0xadf4daf613e0d097995aa8d, }, w2: u384 { limb0: 0xd29b5724f6b6860e8fa58b56, limb1: 0x8b377db541dbbe2b9fa2b31e, limb2: 0xc3478090367667b8c7c40a96, limb3: 0xd8ae4c4ab61a3b7237a8395, }, w3: u384 { limb0: 0x18098cdc0aaa9de5d90d4785, limb1: 0x415b7efa58b50be0b4e2264c, limb2: 0x93e4c08ac1b499e1f0d6f521, limb3: 0xaaf94e53139efb216ce5e0e, }, w4: u384 { limb0: 0xdf4ed64059dec768e050c2f6, limb1: 0xd3c1316e6a8799940ab2d258, limb2: 0x549413f970f60e7dc26655e2, limb3: 0x35a9aeaa9102416916b2e5f, }, w5: u384 { limb0: 0x7442c43542d7f96a0bdc28a, limb1: 0xf422506e4ba33649decea164, limb2: 0x3aebe61dd6543439953778c, limb3: 0xabdb4ce21a40381201b2705, }, w6: u384 { limb0: 0xbe15abd3c348ddad19da6a10, limb1: 0x9e7d94492b6507ff377fb04f, limb2: 0x3bf64c8180bdc3335507a487, limb3: 0xecfb1e3d52594e2d494e792, }, w7: u384 { limb0: 0x5b2b533a56d49245ab6788c6, limb1: 0xd86f1adc31c48edff72fd114, limb2: 0x9ab458995b092274677e207c, limb3: 0x23ca282bada7d44f7cfd31, }, w8: u384 { limb0: 0x3437d71285507fca4851f133, limb1: 0x54ab8dd4a4a49d8ae172e8e0, limb2: 0xdad31a35129c5da141a6a49d, limb3: 0xbc19f605351e55b755d68d7, }, w9: u384 { limb0: 0xa4b79c920e09f351a49d7de5, limb1: 0x984bf5dc7d5fde910df79900, limb2: 0xc5088d8b76f99b9fa536dc41, limb3: 0x12e688e9f1f4fad3711d14c2, }, w10: u384 { limb0: 0x9167cf28f421e605fc529bc1, limb1: 0x245b24732934cfbc08caed20, limb2: 0xc5635e145d2eef79f98fce36, limb3: 0x180e73749e24faf4fcfd3b2, }, w11: u384 { limb0: 0xde97ba398aa3a54028ab5184, limb1: 0xfa8f2784a38b5421adc6b4e4, limb2: 0xe3c7c2b40b1fe9a3e96c2c4, limb3: 0x58f95a0d10e29ba75f4abfd, }, }, E12D { w0: u384 { limb0: 0xf7cb9c74a2c111c0755ef704, limb1: 0x67a7bdc548d00ca24752db6e, limb2: 0x5fc2a7a5510431696ab76c19, limb3: 0x15249501304492c16d83291f, }, w1: u384 { limb0: 0x55f588a277bf5c8a379a1f94, limb1: 0xaecf9b67ff5e644c13cb3993, limb2: 0x6bb2f12ba2cbe23fb8247d67, limb3: 0x3ed46f7421c5162ca6ba24f, }, w2: u384 { limb0: 0x2fb039392e1e9eacfe012783, limb1: 0xcc550086b3d01a606a030eb1, limb2: 0xdfc6d4c564c0695c34dfb6e6, limb3: 0x11edbc923f8ebc5aefd70289, }, w3: u384 { limb0: 0x59e9ad36dff5f9b289a66f0b, limb1: 0xfe0cd6c3385d435faea3fe13, limb2: 0xb1111302e6d8f88878cd2fb2, limb3: 0x1073ed5e414f7f7e3aab4cc9, }, w4: u384 { limb0: 0x6d6ea80c99c8af39666df7b4, limb1: 0x87e26f50b2a298723ca31b49, limb2: 0x95aef7220ca22268bf66ed32, limb3: 0x6cc0c6596529932a385f7f9, }, w5: u384 { limb0: 0xaf8a21cc737ec216405b6b30, limb1: 0x2731f6ef5d655a1368fc7bd1, limb2: 0xd5428f0c318cd5fa09e854c5, limb3: 0xade1e414a93505d63733946, }, w6: u384 { limb0: 0x3fd711e86acf882a1f403cb2, limb1: 0x7c503cfca897c07df4c5cb3b, limb2: 0x46843cb1e9ef833a5869650d, limb3: 0xa033c2879d1aaf7a54d0c45, }, w7: u384 { limb0: 0x2236aa04d4af4cd7a32dc9e2, limb1: 0x480f9dcff78b12a690d0cb8d, limb2: 0x6fa9da69e4a1c1a4fae93140, limb3: 0x4ecc0f925cf79952426f74, }, w8: u384 { limb0: 0x281d06a57030b61135cef166, limb1: 0xb35e03f80e56523abe9bd62d, limb2: 0xbff83152f2b6238494d8da43, limb3: 0x16f23db2174fd855bbc9f573, }, w9: u384 { limb0: 0x2ae34f5f1b961e31cff788e6, limb1: 0xd5208cd2ba55b284bcb6a740, limb2: 0x8def14ec173b046b77cee877, limb3: 0x8b924b8f096c955fa87bdb, }, w10: u384 { limb0: 0xdd1563aa8adc394ba1bb510e, limb1: 0xe6a4f47eafd98a1d57f7618c, limb2: 0xf0fde0fde71032421d34c342, limb3: 0xbe1046e6670770c40f83d9e, }, w11: u384 { limb0: 0x6c23f54e964a04cc93accd7a, limb1: 0xd64796555b1e02e20e137d7a, limb2: 0xd6306e03d1e023aebfd884b0, limb3: 0xeb55ee41c0d9903f5481cfb, }, }, E12D { w0: u384 { limb0: 0x4fd806a0c08d7cb1d8f5576, limb1: 0x947475d806bb8e73d72c6bb1, limb2: 0x58fd15305c66b78a447558b5, limb3: 0xa07c3e28c6576058ea12204, }, w1: u384 { limb0: 0x58244662118b67b83218a6eb, limb1: 0xebb5e2e2db5b9e0a6b3f5b2e, limb2: 0x3e1042fb26fbbae62ffe0728, limb3: 0x15c39aa7cb6464b8bbdd9a54, }, w2: u384 { limb0: 0xf23ae0578867c5ec6121c5a0, limb1: 0x839ffceb9d2fd41b0648690c, limb2: 0x957e160add723e94eea2c76d, limb3: 0x11c8875c282e2bffa22a4025, }, w3: u384 { limb0: 0x436161c822e4491dd8ccef2a, limb1: 0xdeef4e125ba9fdcb262e6af2, limb2: 0x1402cd92e91d2d46e4a5d6ed, limb3: 0xa15d9e59cadf2cd29423a8f, }, w4: u384 { limb0: 0x689749a0ebda6921732143a0, limb1: 0x5baf655dbcffa4154f1278cd, limb2: 0x274b7ef4bb61387d8ae1f60c, limb3: 0x17824661dbd47612ae5a5460, }, w5: u384 { limb0: 0x38248e96afa3964a27770f54, limb1: 0xcdbf91a995b3b0f56e64c291, limb2: 0xd6305f44de865a7dc66ad423, limb3: 0x181c47228172dfa2880b24ee, }, w6: u384 { limb0: 0xf831ce78619934b9c066f9ad, limb1: 0xbb8b831e8ae9c18e7247d2f5, limb2: 0x9e4e8fed49a8161f9a7d6f41, limb3: 0xd6f8228befd39ea769d2e22, }, w7: u384 { limb0: 0x26f6e50a7dae368f03b9203f, limb1: 0xe8254786b607c0c264159695, limb2: 0xf8df238611d760e21a824ae9, limb3: 0xcb9d2a40bc4c198dadc7fc7, }, w8: u384 { limb0: 0xa31618232fc0a276fa8a13bc, limb1: 0xb2e5fd1cbe70792b1ae5be4e, limb2: 0xcad2bef61d3eb16dbe304133, limb3: 0x746908f8e2904c17b88295, }, w9: u384 { limb0: 0xf7fbbcd3a09d95a4b4b4271d, limb1: 0x53013b5b2cb87122125471ff, limb2: 0xb8ada555618e2cdd4bffab84, limb3: 0x9f993ee384df146cd8df4ea, }, w10: u384 { limb0: 0x7d6ce0b7c1cb3e2498f54294, limb1: 0xa261c1bd75d838bfb7082bf4, limb2: 0x4006f75c1d6b50133de4326f, limb3: 0x836a75393f4c32f8c93b0f, }, w11: u384 { limb0: 0x516f6021bc449c6442591c40, limb1: 0x846385bc47d8d5d7462de9de, limb2: 0xa46c395391341a99e731bb63, limb3: 0xe3c1b8abb46081754501420, }, }, E12D { w0: u384 { limb0: 0x7ecbc81a3c1252aed2cb5af1, limb1: 0x3383e4f86811fd96196f89a5, limb2: 0xe681090ab10830dd807c3443, limb3: 0x1ee0f0a189fe6cf9eb5af7f, }, w1: u384 { limb0: 0xedf1f516e56499b6fb02c1c8, limb1: 0xc1f92022dc8805e7d95a1106, limb2: 0xe33f8dab8d7737441529e8ac, limb3: 0x146e3b7474e409260572871b, }, w2: u384 { limb0: 0x9673e873b8a7c3418ebf8d4c, limb1: 0x7a783f69e749f4f29453c545, limb2: 0x69f350e484834de9d8fa34a, limb3: 0xe9ca5bcc844976bf619effc, }, w3: u384 { limb0: 0x5fcf82227a8ea8b3254820c9, limb1: 0xa2bd05419c073d586a41cf6e, limb2: 0xe518de71e6ac729107926d7c, limb3: 0x844ea5cfff361a9705930cc, }, w4: u384 { limb0: 0x429c3618d116a80c181685fa, limb1: 0x486ce09af708401f4a6c7ee6, limb2: 0x15bbecd706ca76d65704416c, limb3: 0x142489c0fe2e40be632effe2, }, w5: u384 { limb0: 0x6c35d18f3e06bc51f762cf95, limb1: 0x6e5f3313f423ad6904300234, limb2: 0xc28cb4900bf47d29c3fbfc30, limb3: 0x18d6a6340f2f9ddc473dcd7e, }, w6: u384 { limb0: 0x77f90efb84d14408e59f1c03, limb1: 0xb049cbfe6bcd8d08b28e8ce9, limb2: 0xbb35bf3bf049671de2d64cff, limb3: 0x173d7f74864e93e2060343f3, }, w7: u384 { limb0: 0x52c3924e0df7f728e4b119c9, limb1: 0xeec6fa434e31cf84d10575b3, limb2: 0x34fc4325ef25b4772cf88be3, limb3: 0x103bdbad7f3c5e4347f78e23, }, w8: u384 { limb0: 0x50b2cfe1dc1c01ae0e5969a, limb1: 0x2a9b3221a11e330465ef0595, limb2: 0x958ce0c16afbe3fc0276051d, limb3: 0xfabbe257f75d65c2add5f22, }, w9: u384 { limb0: 0x6b8eb7bd4aefc50c3c79931, limb1: 0xb8857fda7cc456e68b528569, limb2: 0x95a710c446e6af9dd11f75b3, limb3: 0x15f22d94f0a51b34b4dd51c3, }, w10: u384 { limb0: 0xc47dbd473089bd4709414e0f, limb1: 0xf549310959600107d2281325, limb2: 0x909324fa4a1e59755e5aca2c, limb3: 0x12f9ee461775892889de4320, }, w11: u384 { limb0: 0xd8dd2af7e3ae6a18cd4251d3, limb1: 0x41f1e4e4c3e7daf40c677808, limb2: 0x4748497b4e11c79b39dce7e3, limb3: 0x53e7ea7549b6f013ee9cb12, }, }, E12D { w0: u384 { limb0: 0x7380438f87399c7e3609ef99, limb1: 0xae251f1bb307841b8e3b97ff, limb2: 0x10586f0049d74ac499bb10f1, limb3: 0x15d69ce6494624b9dfaf148a, }, w1: u384 { limb0: 0xe70f2186c12698f57901bcc, limb1: 0x6853377d8eb10f90ffcddf81, limb2: 0x7fe7ce6260e8ccacd34aa93a, limb3: 0x11c3d29b6bed3f8ec66ccf9e, }, w2: u384 { limb0: 0x8de574f1fa8df34dd4436614, limb1: 0x3d2468e8d3fe2f1b89bb129a, limb2: 0xe5c565c90b6e45bf3d6ef92a, limb3: 0x2fdec231c7a259d6b274cc7, }, w3: u384 { limb0: 0x381afcca5edd7ab2c2ee55d3, limb1: 0xdb0d28a944c5b5e6f1de9d1a, limb2: 0xca789736a75cd4847472db80, limb3: 0xb8857429befc7d11918d904, }, w4: u384 { limb0: 0x8aae77fae75932fd56ef1ed3, limb1: 0x1dcb6c6eff6602f4efc533c2, limb2: 0xb0853b8091023746c6956eb4, limb3: 0x158e6193740bfac3349cae31, }, w5: u384 { limb0: 0xae2e48564c4d12a418a56403, limb1: 0x668c45ed4e3b77890ca488d, limb2: 0x758af6b95f421af2b9e80dda, limb3: 0x829bbd81deb660c5c410ebc, }, w6: u384 { limb0: 0x2b33f8be265845893a4d2cdf, limb1: 0xadab60575595c27d3a695f56, limb2: 0x2bb38114e26dcff01b3c7a, limb3: 0xb15f5d3fcb62c5c1cb0103d, }, w7: u384 { limb0: 0xf547b3d2ddb97a0ec597c1e4, limb1: 0x4dfe359dcb7415317a0d96c6, limb2: 0x4db32c68ccb2fff63d900b3a, limb3: 0xf40331313d149fd78f8999f, }, w8: u384 { limb0: 0xe1859718ba67a65d2f7dd9e1, limb1: 0x7f66d368473637540d2de335, limb2: 0x94d70dd4d71f90a6b8996edd, limb3: 0x7f11bf976be5160fff2b5e8, }, w9: u384 { limb0: 0xcb043aa483655ca971eb708, limb1: 0xc6514161d25e989cfe0eb910, limb2: 0x4b03463f10bd5486a5150bf6, limb3: 0x19207d670b11d96e63c9c7f3, }, w10: u384 { limb0: 0x518d10761529279fc06a4e8, limb1: 0x64139e4ea8660ee98b864aea, limb2: 0x1aa32f01ce8213c10b08030c, limb3: 0x15064a81f43178365db85227, }, w11: u384 { limb0: 0x14ddb10fd846711efe04e524, limb1: 0x34676af4100eeb93fc894295, limb2: 0x2bbf7682b985b2187e2ad98c, limb3: 0xb2c84517ed0cae95c0fd980, }, }, E12D { w0: u384 { limb0: 0x7053639bdef1a630ad4f5af6, limb1: 0x739c43473d55a600db56c9ab, limb2: 0x6a2e59a43b3e0b5a88499b12, limb3: 0xe1d00aa3380a50f80ff85d2, }, w1: u384 { limb0: 0x3f2e33d1598a70be6cb11313, limb1: 0x1486afa60b15b33b54cfb747, limb2: 0x81bf2a71d10300239b7aaf1f, limb3: 0x9b35119c385fc20a0386282, }, w2: u384 { limb0: 0x31d6979bfefd74931a576d6, limb1: 0x90a0c3530607355c33b0fd0c, limb2: 0x65fba06248d03e088f1d48a, limb3: 0x11395dbf5901f9d349f3b984, }, w3: u384 { limb0: 0x4291c385689ad964bc8bf72a, limb1: 0xb0737aaac176737a1ecf6ac3, limb2: 0xce8664f73ce5a6aaf0f10ca7, limb3: 0xb6a7d5c46340b57ed0472e5, }, w4: u384 { limb0: 0xd4e72b1d919d76e6f7c68488, limb1: 0xec2f0d04a7a2f7d4d7a31590, limb2: 0x4112c57e0a9dcfedf038c956, limb3: 0x1928f6565ead905c25593eb9, }, w5: u384 { limb0: 0x92b1d18299192443eab3cf31, limb1: 0x363339f1c99447dbe74383f3, limb2: 0xdcac6005cc60106f88576c3a, limb3: 0x261463ad40df4e97165053e, }, w6: u384 { limb0: 0x45616d4a15bc7f5c57750089, limb1: 0x19ac60bbc57465009e3dcb1b, limb2: 0x7ceb498d022dfcfcae9aec60, limb3: 0x19c44919e9fa2e772d9dccf7, }, w7: u384 { limb0: 0x74d7db77e3c5ea2003e6de14, limb1: 0x7f694b25adcf375071dc2f54, limb2: 0xf3d7f4f1a8dcb8d0debb2bcd, limb3: 0x14c0504bbd68a3b627e1d579, }, w8: u384 { limb0: 0xbf696e7d082490ab2a810909, limb1: 0xdce3d8459c86e173b9b814d9, limb2: 0x7d35e60fe95d54b4297c06ea, limb3: 0xe0428d15a83059ac75d4252, }, w9: u384 { limb0: 0xf15b4e3caed564cfc1168aa8, limb1: 0xfa6ecde037cb585b65aa3b52, limb2: 0xe2a2b5aede3c734d6530056f, limb3: 0x14109312a06f6c1e8250362, }, w10: u384 { limb0: 0x9f4a8b4546befff0a6481af8, limb1: 0xdce5e22b5ea0a42e8928c84a, limb2: 0xe59648247bf7715701129ca8, limb3: 0x1209e1d34b0c1d14ec7839cf, }, w11: u384 { limb0: 0xf2a74f539bad5a4682af3491, limb1: 0x93097b4ae591134223d3a872, limb2: 0xd33d11a3041a2bd1bbd4cfce, limb3: 0x43584ae57d4f086e437d219, }, }, E12D { w0: u384 { limb0: 0xccd3861f8b36806faafb781d, limb1: 0x6dda1400a7c6d4456935dd83, limb2: 0x20b444358405090025a9b7cf, limb3: 0xf54e285bf8f9c32d389d6db, }, w1: u384 { limb0: 0xe9b4bf3d1c5b280abc31ebfc, limb1: 0xd862307b44fcf93aae7b11ba, limb2: 0xe232ba534a45a34a7432f6ea, limb3: 0x82261cd3aeaa85fbe4c96df, }, w2: u384 { limb0: 0x2c7b8a630170b7f631239855, limb1: 0x853e2961c8b4130c85116507, limb2: 0xbf9ce9a53e945b9c6d7b5f1b, limb3: 0x145d89cb83700774a22db1bc, }, w3: u384 { limb0: 0xa74c5c7e5df8d3667adf1671, limb1: 0x52de2b913d78406ec8f99a, limb2: 0xc812988870f9f7517c79ff58, limb3: 0xb223e7cfbc3fc377b1fe75d, }, w4: u384 { limb0: 0x8cfdf31674b93a20c992a24b, limb1: 0x8f21312988d7da962d321bc0, limb2: 0x2dbf0528a791ea0d5f981e13, limb3: 0x15aac1f8e330eff4e20ab3fe, }, w5: u384 { limb0: 0xf685ec483cea983d1a69a4d7, limb1: 0xb82b746d8797df323095a302, limb2: 0x534715a12884e752ec62c600, limb3: 0x1639bc27f80a1b9be7937efa, }, w6: u384 { limb0: 0x2bfbdf97d360b348dc75d028, limb1: 0x3e93c81c56c9d7703ac2d15, limb2: 0x3ecb33be37dc97e5a75ba27, limb3: 0x14ec70fdfe7e62ee63fd9e82, }, w7: u384 { limb0: 0xecabff100ee999721d0aeedb, limb1: 0x408694288104b8240aefef54, limb2: 0xae05168387150e2c1c0b069b, limb3: 0xf14bd4f7226a16796796e6b, }, w8: u384 { limb0: 0x779e398587211c93d2d419af, limb1: 0xf33f48e9339556264944ed85, limb2: 0x641e8d0911a2129916d623a9, limb3: 0xda22254161644c0d73135b3, }, w9: u384 { limb0: 0x97edd0906ebc8269feff2745, limb1: 0x9faf40b4f990563dbb8b6a9b, limb2: 0x55e5557db5d8f738aca6cfce, limb3: 0xf13fb2d9a5e619a1e10167d, }, w10: u384 { limb0: 0x7fc2ba107c37bf200a3d128e, limb1: 0x9bb0216dec247ae73a8d8f46, limb2: 0x1ddfeeb377abfa6a56ce7bd7, limb3: 0x152f629874880c14a7fc9709, }, w11: u384 { limb0: 0x29793cf627b6c775b761a603, limb1: 0x2d71f3cf25ee0423e7c54f3c, limb2: 0x8470327513832374e529222e, limb3: 0xd8a7063ea9e13a1184eb587, }, }, E12D { w0: u384 { limb0: 0xc98374fb3b44c0e6942ba4a3, limb1: 0x67de3f6c038ef1323a6aa322, limb2: 0xb2277b3b25524d61527bacd7, limb3: 0x14d40787156e7ebfa93f6f99, }, w1: u384 { limb0: 0xced08def20a48570ef18bf4, limb1: 0xdb6983a66359c51f2ab71327, limb2: 0xe099b96500cdab825f87b7fd, limb3: 0x14e67481e4aec8ffb05fbb17, }, w2: u384 { limb0: 0x7f465e87c522bb9f7df6a9f9, limb1: 0xda4ccc6d47457fd8073dac50, limb2: 0x52533bf52010ae930ae384f3, limb3: 0x36f4d9a630f659ee0049940, }, w3: u384 { limb0: 0x9458ec32cf854cf87179a081, limb1: 0x3708fddeb7317f93acfb1b9, limb2: 0x45e25f7a68c0c63865dc7169, limb3: 0x17cc7f665ab618af9bb8ed0a, }, w4: u384 { limb0: 0x85fbbd958c9517c58a72f4eb, limb1: 0xeb94429d923c8f57aa64659d, limb2: 0x53d22d4278caae28dee0ab98, limb3: 0x77749f245b0607f9a8266dc, }, w5: u384 { limb0: 0x4a9e638a04d4cdefa92a921b, limb1: 0xa751ed26127bdae0471e4d66, limb2: 0xcaa20c710aaaf86cf3509376, limb3: 0x754e574bc910d618dc31dea, }, w6: u384 { limb0: 0x5d9f22fb58b20cb89b60a7a2, limb1: 0xa2d39e0d29c61b355f9f8221, limb2: 0x5b42ad2b0cdd40f198fb4933, limb3: 0x146b356a1037d82e3fd60a35, }, w7: u384 { limb0: 0x8c8f7c35ea3ba1960632cbb2, limb1: 0x88989dfeb7c7f7c108812866, limb2: 0x5d65fb080c6c9703c3de7da3, limb3: 0x17f80c85d8708e2c4e0f76db, }, w8: u384 { limb0: 0xe72c663563a2683a88282047, limb1: 0x9f896928b8f68240ae87318d, limb2: 0xae2fe9dae790ab09f051d396, limb3: 0x103c85e204ea356a1df02170, }, w9: u384 { limb0: 0x8b2a42e00385585058c6871d, limb1: 0xca757495dd55992019b0532e, limb2: 0xddc38038d9b6c6b0c1191c19, limb3: 0x456598325b3e07c16f6cb90, }, w10: u384 { limb0: 0xc0a98bdc8196fd8b9bf4edf2, limb1: 0x971354e815f09e434646dc35, limb2: 0x8848e0035a10ca071f522483, limb3: 0xea464fda93a90c2f0c6cbc, }, w11: u384 { limb0: 0x125314c8b22d6dc1d849816f, limb1: 0x81596b8b1354b4a79eff397b, limb2: 0x6fd4eae90dc4ca7a020c0d58, limb3: 0x633d54eba634239e2224280, }, }, E12D { w0: u384 { limb0: 0x7664507d65379e09b0cc8081, limb1: 0xa7214a05165e9dd1cb822746, limb2: 0xdaa4b32cd1894fcb5869da3e, limb3: 0x11dd5a0d713ff9a4216dc02, }, w1: u384 { limb0: 0x72c884220671860deab6fe4c, limb1: 0xf7edb308d081aad11737b2aa, limb2: 0x179a550ac8de7988cb51745f, limb3: 0x18c92348bd738ff79eb51da6, }, w2: u384 { limb0: 0xd0997e854e959e9fcf50612a, limb1: 0x731bde68fbe33e65958e25a5, limb2: 0x5c75550140147ca50f03f4c1, limb3: 0x1724f1c48007969b733593aa, }, w3: u384 { limb0: 0x8cdd8173b838cbfa5e716055, limb1: 0x7cce9c3704cca203a84d1eaf, limb2: 0x609798ba1aa28ffaff08d41, limb3: 0x17815ba1eca35154689bbbd, }, w4: u384 { limb0: 0x1c7e64b6dbfeaca240b5ce1c, limb1: 0x334cf124f9c76e1e2c54997f, limb2: 0x64e29de5338a04c86a571534, limb3: 0x4322d1d2e68ad82e5576014, }, w5: u384 { limb0: 0x8e8720162d72df7b82b54ddc, limb1: 0xf9a9d4e498d4932f72861daf, limb2: 0xa62955f8bf4d62ab5326d370, limb3: 0xe10f22c8698bbbb16ce96ab, }, w6: u384 { limb0: 0x7e12194ea7c3af3ca1f4627e, limb1: 0x57c3921b26b0c0f8ae782c80, limb2: 0x7807e0e72a965c15e92a3692, limb3: 0x10d5c83fc7687bdeda2fa6a9, }, w7: u384 { limb0: 0x6c3118b5d18f2ba8f3358410, limb1: 0xdbd08498b72968ac4f865556, limb2: 0x1606bcc23a2fefcd7b98b187, limb3: 0x1836f088bafe98f9f35b628d, }, w8: u384 { limb0: 0xb3ec8857a717227fd2e410c7, limb1: 0xf71681b713d44faee8ccade2, limb2: 0x1a889225d6c3ae543975d7ab, limb3: 0x4042e6058ba0ed258215db8, }, w9: u384 { limb0: 0x92dca3c8ef22f5c5ad68411e, limb1: 0xea04b401e31bd03c03f45391, limb2: 0xf274818f73907b389eee6555, limb3: 0x110981e160f9a1144b049f6d, }, w10: u384 { limb0: 0x7809289b28677816d3d20f51, limb1: 0x2b325b38281ca3d9447717a8, limb2: 0x750a16aae8cec71a981e64f9, limb3: 0x4c4bb16a4d45dbfcdd6de82, }, w11: u384 { limb0: 0xa19d86a548a59b31bee7330d, limb1: 0xbab4358db8efdc356098935c, limb2: 0xecf4b1e2071637cfa269d441, limb3: 0xfdc8efae68b158880892941, }, }, E12D { w0: u384 { limb0: 0x731a6668a56fb2e638b5386d, limb1: 0x2f6050b816d5da56d8b4aeac, limb2: 0x9f8cc60a1825ed2bc48ced64, limb3: 0x14d27ab7d2dd9d4dfc62f9b4, }, w1: u384 { limb0: 0x36e235511e3aba57cd7a4166, limb1: 0x651418ba41dd7e611da499af, limb2: 0xa2443f20594fb2be6da75cc3, limb3: 0xe5b76d2ac4d96fc0a324e20, }, w2: u384 { limb0: 0xd9a45f081496460d0c0ed0ac, limb1: 0x2e77975aa2352664d6adb2e4, limb2: 0x2faa41b81ca6013a7f61b19a, limb3: 0x486d9ef9a7963973b526016, }, w3: u384 { limb0: 0xa30b18466742d1c3215c7ca9, limb1: 0x76bb8e0f21ed01073e7cd26d, limb2: 0x72e300f6162dfb4f824322b3, limb3: 0x170086077deae464de32c314, }, w4: u384 { limb0: 0xb98779fe717a76947ffc64a8, limb1: 0x22829a2223d7a3c1e115868, limb2: 0xfd92daccd29c35d6e9891f91, limb3: 0xc8cd313b3bac470a84c06c, }, w5: u384 { limb0: 0xd7fb2ab79ade8db9f0753816, limb1: 0xc8e90a86892a3f9973f3a709, limb2: 0x439586d8958df5477546a8c9, limb3: 0x11c5062a433f8a665d2fec03, }, w6: u384 { limb0: 0xec349f8ca4e9628ef8ad1d0f, limb1: 0x41ed7cebf144cf0991fd449f, limb2: 0x83fd7077e122719cd9a150db, limb3: 0x4f4f8cab62516e0bd8eed4, }, w7: u384 { limb0: 0xd65b0369dac2474a3360256c, limb1: 0x73aa7477aa55f747c118bde4, limb2: 0x166c215a026d96f815575905, limb3: 0x19ef4018eacc8cec0d7c2952, }, w8: u384 { limb0: 0xaf93f1012698bd074cae6d2a, limb1: 0xf1dd95a8d7d4c5624dc77fab, limb2: 0x22ad91dc94c520bed552ce68, limb3: 0x7149e3ea5cbb31d49fa48d4, }, w9: u384 { limb0: 0x309be21144e9429149f5ea74, limb1: 0x5a23ebfb744401c93d028104, limb2: 0x1328c0e96b3dc98cf9ca2178, limb3: 0x4a0a0910ab2af1883e3bd42, }, w10: u384 { limb0: 0xd096a251af3d32c676bb4288, limb1: 0x81a2455886a5de7de17a3a3d, limb2: 0x785780c752a0fec2ab697d7f, limb3: 0x424eb933d2f578926758c8c, }, w11: u384 { limb0: 0x9bbf4ea4c5f12c0f3a80655a, limb1: 0x6c3952358a56be8b39ffc122, limb2: 0xaabdbf346cb1e900c6fa6ef7, limb3: 0xfc816c836e1f58f9bc2ee34, }, }, E12D { w0: u384 { limb0: 0x423f069d338c478ec1af9c39, limb1: 0x29b54a9a019077a85febd5b1, limb2: 0xd6c54429887f79c4f5e8537e, limb3: 0x2d645e495b1ae162900aa5d, }, w1: u384 { limb0: 0x15924967d61c029186ecddf3, limb1: 0xad51150b9a239c5f6107f3e, limb2: 0xc131c14b453f056fdeb354d0, limb3: 0x7ce2f5cee25ccf4630a4da6, }, w2: u384 { limb0: 0x24cffdd2b4963236469c595b, limb1: 0x1cedb62a0a9a9d19ec0ef73b, limb2: 0xc83e7dc874bd3671d4079d93, limb3: 0x54f10b385a7cc18a25a48e9, }, w3: u384 { limb0: 0x51156a1330e11e4107978c65, limb1: 0x126d680056df9e678c923a15, limb2: 0xc88a5e31000b304a279d33c3, limb3: 0x5add5bf0e3de07507b300e9, }, w4: u384 { limb0: 0xaabb4da106a561c89da6e640, limb1: 0x67706e7ff291eb8350fe823f, limb2: 0xa2a5b3a4109b157167daed75, limb3: 0x3a53fba9d2b86d5617419bd, }, w5: u384 { limb0: 0x49f0d1228f3483ea001e89c, limb1: 0x2904017f1a05647ad6b814bc, limb2: 0x32c50c7b36360c7072b97c5e, limb3: 0x4a4b35d842e9157f9452ef4, }, w6: u384 { limb0: 0xe910ff959aa337ba694b3103, limb1: 0x1eb7de8661a5aa726957afc5, limb2: 0xf46dc87d119c3f6b7bc26c47, limb3: 0x16d4d3eee5db3369b1cd5095, }, w7: u384 { limb0: 0x2b2ebbf8ed056759bb5ad089, limb1: 0xc997a5c29ff182751a7a4a1f, limb2: 0xd4255d635200af86412c0d3c, limb3: 0x133e3849f5abe45d50ebd4f3, }, w8: u384 { limb0: 0xc646891ae42a453618bf6946, limb1: 0x6cdba6a4c36531001a999ba9, limb2: 0x4f8028f68a1b39ea09f81c8c, limb3: 0x5a4a8424db89080f7ef2d4c, }, w9: u384 { limb0: 0xcfad8c2e4174ad2ae083acd8, limb1: 0x11fa7404e0d60cc8429a7206, limb2: 0x16f6645ea542f26a2bbb02c2, limb3: 0xe221955c928cb0869ff1e7e, }, w10: u384 { limb0: 0xa55f4a4e3b44b7435f37266c, limb1: 0xde3c9ef2eb0e12ebacbf789b, limb2: 0xec729141e4b14e595a75e170, limb3: 0x9d7eb5a60f56f8c5b9cc908, }, w11: u384 { limb0: 0x51393b6db9309927d8ab8093, limb1: 0x81b817c741b2485a83aade8b, limb2: 0x45548c3f24b4ce607a7498a1, limb3: 0x1329d0b6119a0a2fb95f1365, }, }, E12D { w0: u384 { limb0: 0x22d7122b0c05411b942f9640, limb1: 0x1bcc87de4a309fbcf7df22c1, limb2: 0x3dbff192e88552ff01ec54f2, limb3: 0x16453c594411bc9614273cb, }, w1: u384 { limb0: 0x3cdd3cbd9b5ef16b0ab5d12e, limb1: 0xc9b831682cc9f7562631eb82, limb2: 0xd8c0b4a326e6d711af1c6fcc, limb3: 0x15999f5b65933e477e527ca2, }, w2: u384 { limb0: 0x8e1e5c76737a52e34970f54a, limb1: 0x13e660457b4680094701954, limb2: 0x8ef5bfc33edf509615dba422, limb3: 0xaf25c6ba9a9da6f8d1d8d84, }, w3: u384 { limb0: 0xc6158c9388e8d4cdf213db7, limb1: 0x99bf0fc5cd55777088191fa4, limb2: 0xca9fb43a85b157663614f5e7, limb3: 0xe19f5a790b81946863c09, }, w4: u384 { limb0: 0xaaf5ae0abc93c789d2f553f5, limb1: 0xb0e4d0b4161db236bfdded84, limb2: 0xcb1b789e885ae9f7603d7597, limb3: 0x173a004b4ac0b6990ce57848, }, w5: u384 { limb0: 0xb8270359d997a568b9ca2d, limb1: 0x6c3f97a0095424bac05918c8, limb2: 0x4fc75521f68391b186c98d69, limb3: 0x179c925b368a6922c052109a, }, w6: u384 { limb0: 0x4a64cd8043d641ec589cbced, limb1: 0xc32ad31f1e72fbf5ad938a1d, limb2: 0x394ab548e7bbdcecd04cfa57, limb3: 0x1903183cfe25996781a6f138, }, w7: u384 { limb0: 0x95d6117e159fd5a627fbf3c8, limb1: 0x8bb75a8e2cca90dca43db09d, limb2: 0x52ac5959acb24c2975de0b46, limb3: 0xc733099ca61082513b739d0, }, w8: u384 { limb0: 0xc254c0d7ebcfb3e456d4db70, limb1: 0x841731cd2f31e3eb6dc2cb83, limb2: 0xbd575ed553cf9d9f4fe2d195, limb3: 0xb9b6dbbc6b7b7a3872452d6, }, w9: u384 { limb0: 0xc35f21cbc3ac37bfefbb62b, limb1: 0x6d0f6d5a72fb9754dd45e03e, limb2: 0x115c5b6547d1b15f1ab880c8, limb3: 0x49fc712ba5a255dbc3c3734, }, w10: u384 { limb0: 0x455d3b2f4797212bc3a8eb2a, limb1: 0xcb84367fab4cc67d4a608ee7, limb2: 0x27c5381bf627b1f6770fb730, limb3: 0xda5838799c2b92a9a46f93b, }, w11: u384 { limb0: 0xe377b673276f66aed0431e2e, limb1: 0x22424ab805248189df3bbc60, limb2: 0xe8df0a999d7ea73c0e5c21c6, limb3: 0xa1a1a982e74b25c855c6630, }, }, E12D { w0: u384 { limb0: 0xd8de7c0a020c2bfab98f462b, limb1: 0x4259e1a06cc5c0d48aa4b7b5, limb2: 0xa600cfba72cd0eefd68378ca, limb3: 0x16d21a98b960ac0a3ce99480, }, w1: u384 { limb0: 0x9c441104f663c6cfd27a21f, limb1: 0xa2538fbacb469c18af6f6d36, limb2: 0xaca0084cb5ce246d9e004b86, limb3: 0x1818d39bf51f5701a630cd13, }, w2: u384 { limb0: 0x83662e661b082815e9b3291e, limb1: 0x953c223a59774cd045bb2e72, limb2: 0xd965efa4e0a2b9c6d63ed7bc, limb3: 0x75910bff00e3ebfb430ea1d, }, w3: u384 { limb0: 0x21f101851b5e6a66fe5fb3cc, limb1: 0x2078ad4044a6e58b48b2fcad, limb2: 0xb95b15546d0fb95d6af37e7f, limb3: 0xc85bc26e7c69777a5b73186, }, w4: u384 { limb0: 0x2813b1a799ef66155d7a5ff5, limb1: 0x706d19aaf61ac615d8d7a776, limb2: 0x35b48c7bae00bb479924c911, limb3: 0x113f0545928ec85fc72b3b83, }, w5: u384 { limb0: 0x29ac845c79e1955587d53a3f, limb1: 0xb889fc1aef4cf20aff2f8c4f, limb2: 0x50fef6b1712a33cba0703bf4, limb3: 0x149cfd613a758a131850b749, }, w6: u384 { limb0: 0xa74862c7c240e22184bb0faa, limb1: 0xe185dab81bd7e850ecfe6e7e, limb2: 0x579166b24e863176b906fc26, limb3: 0x4d862301cdecd83870cf1d3, }, w7: u384 { limb0: 0xd63ac2c17c787ffef5f67ac5, limb1: 0x490f34bd28d97037038b425c, limb2: 0x8eaaea7d3e9970844eca0bb7, limb3: 0x12ff4861711d4f5fc6c7df52, }, w8: u384 { limb0: 0xa77d513840181e6049eb2cfd, limb1: 0x29144762781008597f248817, limb2: 0x29ddbf8ae66b47d99b8f144b, limb3: 0x33b700fe7d54ab6cc6366d8, }, w9: u384 { limb0: 0x7c605b80a783b29fbdb7913a, limb1: 0x8b972070a4c66018b2157c13, limb2: 0x9b41fbff0b39b434d4fc621e, limb3: 0x3642078114e5416bdd1743b, }, w10: u384 { limb0: 0xb65736f5f91bc2870134be37, limb1: 0xe433e5c3d68b7ae3c424715a, limb2: 0x9fd29af8fc74edec039d14b7, limb3: 0x77405e5599759db17b993e5, }, w11: u384 { limb0: 0x5ebf0ff64d839d1b21510f03, limb1: 0x2ecb8cc84c90c881b6abd4f4, limb2: 0x1cce59b581d9b2b04bdce6c0, limb3: 0x13c54e92b75b47920c1bc23c, }, }, E12D { w0: u384 { limb0: 0xd230ba8192574b8f0d2e8d0d, limb1: 0x8d46a7f9896bc752e15f2bd1, limb2: 0x4c46523f3eaeb3d3c195cc64, limb3: 0x9a8c180064d8e4aa41a3fb8, }, w1: u384 { limb0: 0x6b41258f53e02a3f4f4080b9, limb1: 0xae4efe95de593debca9447c8, limb2: 0x53fa98259797f7b69a5a740c, limb3: 0x1e723f2e6d538ec35ab098a, }, w2: u384 { limb0: 0xa82549fa15fa37278e37e54f, limb1: 0xf3e4bcc528ef5b1739c54e51, limb2: 0x23325e087bd1e6be95bc9c2, limb3: 0x3d06b79028ddad39882372, }, w3: u384 { limb0: 0xb8692892001c9cb56b90952c, limb1: 0x733b4da305705ade344a3621, limb2: 0xdfe666914d66fb6ab1d4c9bf, limb3: 0x89317029155d09a628dc7ad, }, w4: u384 { limb0: 0x92116763fe48fd34e5fcde4c, limb1: 0xbc96d0f997ba650008ac0eac, limb2: 0x770993a8f2ddc97a352efec4, limb3: 0x1584ba5015a2629d14debb7d, }, w5: u384 { limb0: 0xfcfe8c0df558699103baf566, limb1: 0x5435e711fabc8e56bf54699b, limb2: 0xeb0c73e7b22d70352bb5a564, limb3: 0x343483df7a88d987c69408a, }, w6: u384 { limb0: 0x384d80fe4e9e50d65ceae168, limb1: 0x74f4dcd19aed7592bc9593ab, limb2: 0xe493540b588ffd977f4ee0ca, limb3: 0x23ed7611ed958da6db24d3b, }, w7: u384 { limb0: 0x2eec2f1a902b21208d2243b1, limb1: 0x3ff398adc2bf7b18affd6970, limb2: 0xfe74e53e674476aad89727fe, limb3: 0x17adfbe5a9f0d328bed1b1d5, }, w8: u384 { limb0: 0xb3c26226f8db87e4acd22a19, limb1: 0x74b1ff048bb0cee38198e560, limb2: 0xf91b63c44856aa5995195c7a, limb3: 0x57ae60555c4dfbb9f119dd0, }, w9: u384 { limb0: 0x391b35c3b492a2b733913137, limb1: 0x1b718fb7d4529435ea05e0ff, limb2: 0x7628c94eae8736f7066faa73, limb3: 0x12482498758030e4cf058fa1, }, w10: u384 { limb0: 0x6fe096b1a72856d5ff144f61, limb1: 0xe7e8e20c91eb503e936201d3, limb2: 0xa873f6f582a8c5e528b7e017, limb3: 0xac11b393a2ca9b81f52d7e2, }, w11: u384 { limb0: 0xbbcfbb7847f1fc7f5c887867, limb1: 0x8ca064238b30c902565c58f4, limb2: 0x3b342400e4bf64f5cfe303f8, limb3: 0x141881c8cb4ac57fdd2421d0, }, }, E12D { w0: u384 { limb0: 0x57c1e0a314f410d7c80f0d6c, limb1: 0x188efa3af0e9a15ae09a39a6, limb2: 0x8549ddd8cee9cc24a76927f5, limb3: 0x828abb514c39b36af5e5e59, }, w1: u384 { limb0: 0x86b5e60ab6d06ad115373349, limb1: 0x30ec5eab948a288e962221e0, limb2: 0xa5ece7da90052d41645094dc, limb3: 0x292b0c29d2ca5076acaa1f7, }, w2: u384 { limb0: 0x53fa181062874a0e2952a6bd, limb1: 0x139aea9f3d57245a94f247b8, limb2: 0x13e918fdbed0933c9e1e4691, limb3: 0x129ab8b6bedb190996697c6c, }, w3: u384 { limb0: 0x8c94450ce70b11a241947381, limb1: 0xa6c255e7d67f8a5466c2d100, limb2: 0xa28b8d54a0eb9220bda7f20b, limb3: 0x9645f3081882f29208bc4ca, }, w4: u384 { limb0: 0xdb6f564cc32943107d116638, limb1: 0xd9799a7f993d67fe769b8272, limb2: 0x861d137dc34f59e9b52ea65d, limb3: 0x10da20caed9c13858e34bfd5, }, w5: u384 { limb0: 0x223bada77c016723d852006d, limb1: 0x95041b73eafb915659a2fff7, limb2: 0x36b777b400b7e9e299363ccd, limb3: 0x17c8527995c3f0b83cbe83b, }, w6: u384 { limb0: 0x387c0822da34f6001fe9f474, limb1: 0x7ca208b866f7d21734a55544, limb2: 0x7415b9fff8e87b99635abfd3, limb3: 0xcae06be69307d97643444a3, }, w7: u384 { limb0: 0x7826924ebf635fa31599f2d8, limb1: 0x255b41d4dcc5e9df82f2bc5, limb2: 0x742046a3d48ba8fd2ded46fa, limb3: 0x14e1a77687c2fafa04ad3cc5, }, w8: u384 { limb0: 0xd1861303b32847e9dfa309b, limb1: 0x95643d858f4ab818e1429eb4, limb2: 0xf5f69835e9e3219e541e489a, limb3: 0x106791b088d3043aec789d2, }, w9: u384 { limb0: 0x3fbf8473656db45761cd4577, limb1: 0x95dfb9c6f2581b80ca9c6e0d, limb2: 0x19cdeb22dd3af66c09886e0, limb3: 0x46d1856bcf6eb442eaa0dd1, }, w10: u384 { limb0: 0xfc5db242d9eef89d6b2b0ead, limb1: 0xa441afa00af0ebf9e4a5566d, limb2: 0x737340b78921c31e7d6b998b, limb3: 0x152c1e8a7645e37878c00117, }, w11: u384 { limb0: 0x707b12110eb67f3f3e25082d, limb1: 0xadfe406a34710c9b1f1a67f9, limb2: 0xcf700552ca3b4a453710e271, limb3: 0x1329ce5688848746b4cdb9c6, }, }, E12D { w0: u384 { limb0: 0x63ea02a83316ced86cff7bc3, limb1: 0xad3cc1665ec97ed103bf2a97, limb2: 0x66e914ba49a82240606bef39, limb3: 0xbe1aae2e0755468744c9cf8, }, w1: u384 { limb0: 0xdd0988f0f7381759cede6cf1, limb1: 0x8c668cf30f6b849f93e18738, limb2: 0x17677bd95c25553069f8d3bb, limb3: 0x213b88bd1d59c856f22c57a, }, w2: u384 { limb0: 0x468ebd74785e502a030b2d64, limb1: 0x99e6500a6eec17b7582c46de, limb2: 0xca602fa99428bb3096ed2234, limb3: 0x221c7127baba56f36027a78, }, w3: u384 { limb0: 0xecf5c97a4baeeec96686a951, limb1: 0x8a858ecbe3f7428c1e485263, limb2: 0x7a93d3d522c174fc7563ce8, limb3: 0x6b458b1280095fbd58dced3, }, w4: u384 { limb0: 0xf7235d01c69ea79eb8c3f3c8, limb1: 0x1e8d53af3b6a8c0d384dba87, limb2: 0x7219df5572fc6a5fb03c3640, limb3: 0x4a28cd8ddddd35c4a2bc756, }, w5: u384 { limb0: 0xea22308af0e9f3e49bc2073, limb1: 0xe16fb20226994cd501b48956, limb2: 0x8b5463f6a25ad49ef766f7c9, limb3: 0x920549318b13fd2a55438e, }, w6: u384 { limb0: 0x72d478cbbd10de13e7840523, limb1: 0x61148bd13cf2cd5f974ef513, limb2: 0x14fc5faacaf5f306eca036dd, limb3: 0xd5c18cfe88ef2a96785e79, }, w7: u384 { limb0: 0xedaaa07fbc739502463ef449, limb1: 0x8756dc3df79501b08bcfd30a, limb2: 0x41db0294140d03ab93ac331a, limb3: 0x2faf35b55c223051329f5f9, }, w8: u384 { limb0: 0xf4ddf6770b28a0e39c42e1, limb1: 0x1bc579527a6d36ebcb9c1e43, limb2: 0xd8d3dda24eb2d5c51e94fbf7, limb3: 0x1929169f16f2bb1805258a1f, }, w9: u384 { limb0: 0xb7c17acd08c863c5de00ab8e, limb1: 0xd061e541ab904021cb7415f3, limb2: 0x4e4103b8a474b65ca3b96404, limb3: 0x43f042bfe3512474ab82a6, }, w10: u384 { limb0: 0xdf4f7f352c2231ba350a5e09, limb1: 0x436f7c965c9cba8884ee1f92, limb2: 0x8820c54c22fc9835d6d63889, limb3: 0x137b29d6f48df1e1e6a859e3, }, w11: u384 { limb0: 0x213101a3e3c1d0de36762bb2, limb1: 0x2841a7df27a0c7cd8324b382, limb2: 0xf3aa170a745fb830cf57da1e, limb3: 0x34d8b8302b0f58d9d5a85e4, }, }, E12D { w0: u384 { limb0: 0xc102bc3e2c1431657103a4a8, limb1: 0x3aba49ff88c4ee3806b04d0d, limb2: 0x985c1f9d4156682f0c5aef65, limb3: 0xc0561c0e6c3d1cc794c57dd, }, w1: u384 { limb0: 0x9c02003f65c233b63f5d57df, limb1: 0x675a9896c5ebc6c86acfe082, limb2: 0xf10e29c84b756a49c862026e, limb3: 0x397c60ac478f6f3d04dd211, }, w2: u384 { limb0: 0xde0ab514224b0a09d4470108, limb1: 0x30cffe24a16eef64a4e3f8d9, limb2: 0x250e573cf0cdc9d0474a96a5, limb3: 0x320c97808c919b6bc77a6b9, }, w3: u384 { limb0: 0x22e1478aaa8dbef5b7eb5c75, limb1: 0xd73e5649b061e7dec320410, limb2: 0x9e5973e5c196af20a9522b87, limb3: 0x888405f1b7e02f51d25e4cc, }, w4: u384 { limb0: 0x7d63d9cb91c7e6ecea27bd0f, limb1: 0xafd606d67aec5132495aea6e, limb2: 0x89d9cc366cd70849bf7a6c5a, limb3: 0x6a1cdcfbb9094ed585438, }, w5: u384 { limb0: 0xc63d5979f095ce42b97ffe02, limb1: 0xf0b1958f676e488a85a463d3, limb2: 0x579f2806dc3a11e99b548e2c, limb3: 0xd3efe9be9e8ed6f0311f48a, }, w6: u384 { limb0: 0x241c2c02a7a3ed68c8347454, limb1: 0x3c2e082d9d49bc403f20af15, limb2: 0xffb91438b7adbf0fd03b8452, limb3: 0x9f4a8a1c2bd71edd80fc8fa, }, w7: u384 { limb0: 0x7a09864d807d30f8134e35af, limb1: 0x4909a61fde584e8a97843962, limb2: 0xb0ae7df0ca31783cdef766ec, limb3: 0xab6c21fb130ff409a076e98, }, w8: u384 { limb0: 0xa4cf4a4bfb9a8696346ae5f2, limb1: 0xf441ab330a1a48b023ea4b16, limb2: 0xccbedbb5d89afd778ebbe2c6, limb3: 0xba098deb3929c27bad2d7cf, }, w9: u384 { limb0: 0x15ecdee09158e723e156143a, limb1: 0x2d88661ce3e7ed32f1813f83, limb2: 0x9268f857661e69f43c1006e9, limb3: 0x1baab7bc3df8b069e7921d3, }, w10: u384 { limb0: 0x8851dedab1e371b332830bb3, limb1: 0xe53bc821c7dd0054d6f6f857, limb2: 0x46240f19ae951bc875a2c8d5, limb3: 0xe7507265782567bc614a60b, }, w11: u384 { limb0: 0x9cace8682481da13c90f59c7, limb1: 0x79b9f6744c3fa34fa7ff5e2c, limb2: 0xa95279fc2041e30178a37645, limb3: 0x1201d399c1c8c0f103f8acf8, }, }, E12D { w0: u384 { limb0: 0xfe58f82f5a9a9486897fd7e1, limb1: 0x2f004eba229cefab93da839d, limb2: 0x3002f2bb83b58880f0d25efa, limb3: 0x122600e61fb5e8a8f3a87752, }, w1: u384 { limb0: 0xdcc4e4defac8110561f0b81f, limb1: 0xe4595573f7563e76b39ecf25, limb2: 0xe9a4f842ebb4b0f21e7e6904, limb3: 0x1b7035165596268ab55405, }, w2: u384 { limb0: 0xe2a1e6ad130b5dec5a307b9c, limb1: 0xa0715f0bb37946dee0717185, limb2: 0x89926a4a4bd27b0dcb987e4, limb3: 0xfa2213bf1fa84f02b4f4886, }, w3: u384 { limb0: 0xf7a4cd53187cf70d56c22d5b, limb1: 0xe27c4a45b50546e7d688b66b, limb2: 0xfffbb1435cd3e4d84e85fca7, limb3: 0xeef721f1ff2d893b897c350, }, w4: u384 { limb0: 0xf91449f591421e2ef6a486e7, limb1: 0xeeef2201ee263b14b45d18e4, limb2: 0xbd80060590e3e6b8ea5c51c9, limb3: 0x265aec09b58dacbb7a04b17, }, w5: u384 { limb0: 0xa799249a4b8a0bf74c5885dc, limb1: 0xf3369cf6149d51d50c53050f, limb2: 0x94e0a1d05c1748dbf29dcddb, limb3: 0x1025ab4a8aff8453c776f76, }, w6: u384 { limb0: 0xab0a9cbc3226d768b05be455, limb1: 0xda1ec9b71b4492481506fcd7, limb2: 0xdc657a6b18a8b49f20be7022, limb3: 0x16501c8c3d498fdd182c68da, }, w7: u384 { limb0: 0xda69756ffc4c2cc6785aea22, limb1: 0xf61431a0fb779cd2dcd9d576, limb2: 0x13bf99c01ad490a1b53665f8, limb3: 0x18af034f82f45856ec965578, }, w8: u384 { limb0: 0xd266c249f052d3f201c1b0d2, limb1: 0x13da63c60e3566cc4f009ccc, limb2: 0x3333fc6cdb72a6194cde21f6, limb3: 0x1604d59edc49752480de7888, }, w9: u384 { limb0: 0x440a479dbe693668b173c604, limb1: 0xe7aa2e5dcfda7aacf9e06a79, limb2: 0x659ba8b7e2702424fd322b71, limb3: 0x15f91e27f1ea647ab5b891a2, }, w10: u384 { limb0: 0x7d84e72876d78a543b85f35, limb1: 0x41d7a06e4188086be325658c, limb2: 0x4a3001b914f7fb1079e14d4e, limb3: 0x167fc4dc25373f64678594d7, }, w11: u384 { limb0: 0x82563c053c16182776849317, limb1: 0x6700ae4d019967f052b9feec, limb2: 0x78546ed88fbe3f4cb7f7a30c, limb3: 0x534411f7b6d38c591965d08, }, }, E12D { w0: u384 { limb0: 0x43cfc7d230ced51564ac1d27, limb1: 0x3f27df63705e89b5887f6ef6, limb2: 0xed962f37b246373dbe286875, limb3: 0x1153ae983b4bebeb96cee574, }, w1: u384 { limb0: 0x796edbbce52298f87a09de3c, limb1: 0x28594a3a94d2643da1f44c88, limb2: 0x1122679cf2a223c7641eba1, limb3: 0xec358db63b010a5f0195832, }, w2: u384 { limb0: 0x65114260981734bbd0c401dc, limb1: 0xaece96d8df427dc37661c427, limb2: 0xee18de1e045a8e8f278623ac, limb3: 0x119fd094c25c6ad221e4b923, }, w3: u384 { limb0: 0x2260aed58c6f1839b18780e0, limb1: 0xff136cb3f7910868a9bd9f6b, limb2: 0xa8eac3560aa6f0b6e9ce27f9, limb3: 0x147713d9a2ed668c5f769433, }, w4: u384 { limb0: 0xbfa0b51b9f28c1f41615b31a, limb1: 0xafe3bdfe46e1df691c9e4a8b, limb2: 0x8ec87ae1766b9944f1d28933, limb3: 0x173b1e22848118b6d362da12, }, w5: u384 { limb0: 0x3cb1473e40e34bac4f045ec0, limb1: 0xffe3bde303763828c46764b2, limb2: 0x2b156470816c102ef2910681, limb3: 0xff3da5b54bbef112da2264a, }, w6: u384 { limb0: 0xe700fcac3096a1a6fd859886, limb1: 0x31262c27298b10b8d1a8355, limb2: 0x7a0c2177d76d700ef9d473a0, limb3: 0xf68f4e6113a631c0da8e2fa, }, w7: u384 { limb0: 0x74b654d838f7a245bee7f39f, limb1: 0x665df41d4d1641df03af8d97, limb2: 0xd3ddeee4890b0c01b82e54c5, limb3: 0x12c5046f460d2c4e5b4384dc, }, w8: u384 { limb0: 0xfccdc5d4095fc526da571897, limb1: 0x83b7338c59475d4d75e801d, limb2: 0x402d5fd5dae3ea66188e61c0, limb3: 0xa4242530cd7992d10545d7f, }, w9: u384 { limb0: 0x8f330139a313def3b14a4191, limb1: 0xbbc6ef1fb35d0f418f9f78b5, limb2: 0xbb0532bb79ba32741aed8541, limb3: 0xece0fdc026b4f6a1a0e84ea, }, w10: u384 { limb0: 0xcd423bcb1fbc2198f7bfc5bc, limb1: 0xb2829a2104116480290ac2de, limb2: 0xbab0876e094583ff5a08ffe5, limb3: 0x9566104e8e04e6378963df0, }, w11: u384 { limb0: 0xcbcb4e81ebceca9d4be2280f, limb1: 0x46236f243dc5d2907d7cb0e6, limb2: 0x886438c7d5394b0df090d49c, limb3: 0x1736df2c975b470c28a0dfb8, }, }, E12D { w0: u384 { limb0: 0x41aaffbd4ffbc921fa99dafc, limb1: 0xe10f7c7325899560c7dc1a15, limb2: 0xc24436ca6dd16b7441353e1a, limb3: 0x768fbbaedb7eb6fa18ee62a, }, w1: u384 { limb0: 0xa237ae4d25932d4ea5316730, limb1: 0x2d696a5048a33ad2fe17b0fd, limb2: 0x2748a8d213d462a9afaf75d1, limb3: 0x1537e87dbfb1af57898e5a44, }, w2: u384 { limb0: 0x77e95072df611554c6efed5a, limb1: 0xb1a40cdb1e3fd9dc0c2f0268, limb2: 0xafa4361c57a92f48e272fd3c, limb3: 0x19670062e69cf3c129c6037b, }, w3: u384 { limb0: 0x35569a07f433ce179f869383, limb1: 0x2da70c3d64dc95f2a35dc5da, limb2: 0x5b6e4b1ebc196d9275e65fcd, limb3: 0xf527e45157446612739f8ea, }, w4: u384 { limb0: 0x52794dcb5d3a71e191ca9117, limb1: 0x1081a05756e17821c1a6b318, limb2: 0x7806bbf278080f55a756ac75, limb3: 0xa02c71394733385a722a842, }, w5: u384 { limb0: 0x488205f5f0ed76726dc2e4a8, limb1: 0x2156776174a8c26fcb09988, limb2: 0x48ed81cc7d76f82b1770c797, limb3: 0x581d27120bc189525f2a93d, }, w6: u384 { limb0: 0x5bd47af3f999778815753987, limb1: 0xb6749ec4bc2deb56879c4187, limb2: 0x12f25e541c1a97a1a04db98a, limb3: 0x29634e7d8dbbf051cac5686, }, w7: u384 { limb0: 0xb63879d6fdc4ddd1f14e0d7e, limb1: 0x5502d042b5ca2ca1fd1c87d, limb2: 0xde0a342fb21dec963cb42765, limb3: 0x9e6bd948d174830a6c0bdb5, }, w8: u384 { limb0: 0xbab8115cffcdaa9e9ffdd880, limb1: 0x507a287e0529113ee7c9872a, limb2: 0x8c9a7d3cd5caf1cbf71ea4f, limb3: 0x171c19b44ea2abed89e0eee7, }, w9: u384 { limb0: 0x3bdbf8f85ceba757f787a73f, limb1: 0x55e0e28688c74db104715a2d, limb2: 0x1d8c0545ec4eb386da5973c, limb3: 0xc12462e516c1d11b83d70c0, }, w10: u384 { limb0: 0x589e9e0e262699811b884e88, limb1: 0x849f9b1f3bfbecd0815d022, limb2: 0x72e87be328e66292abc0bfa0, limb3: 0xc20248f3856e6b79db43f4f, }, w11: u384 { limb0: 0xa0d3c01dc5b590235ed2b4a8, limb1: 0x36a65d97aa5e2789abe72557, limb2: 0x4dc3c2f633d2e2bf574872ac, limb3: 0x9b01ee1082798777c0ba5ce, }, }, E12D { w0: u384 { limb0: 0x3f8f38e60deac05c2621e24f, limb1: 0xd09553fa481657f8340e5069, limb2: 0xc4822e62b67cb0f3512ed972, limb3: 0x8fdd89171a3d99d824644e3, }, w1: u384 { limb0: 0x9f974bcce04ca7c552cefc61, limb1: 0x7d1e97af057c4e8bd1237e3a, limb2: 0xf6c412a8f240fdb471a4e6e8, limb3: 0x12798c3ef22db33c453af285, }, w2: u384 { limb0: 0x351067948f68705deef729f0, limb1: 0xdac1ded2ce3421f0f1c2a824, limb2: 0x8d9e3cebc0f199ce2dba4472, limb3: 0x37aca41f4d506c7b78e5a97, }, w3: u384 { limb0: 0xb7ff11075c5dfb0889eb8cf9, limb1: 0xdd6620d6caebf6d2c4bc9fe4, limb2: 0x78ebf44c90eb026aef8a4723, limb3: 0x11df205507286f5912bb28f9, }, w4: u384 { limb0: 0x2184c9e357e8fc5938e9f91e, limb1: 0xf6b93e6931861792051e41e8, limb2: 0xfa6774f07bec91d5b9056ac0, limb3: 0x5fd1e8fcb66b2024f4770cb, }, w5: u384 { limb0: 0xd34e1ed35b4acef37cdfcfcf, limb1: 0x3a3af4aade2ca0b690f8b745, limb2: 0xf18dd5095a8e61ebe9ec15c0, limb3: 0x14ac25a5dd1932d42434e64f, }, w6: u384 { limb0: 0x8deb2453cc29535af302a32a, limb1: 0x47377a569ca788bd447d51a, limb2: 0x7473f95b420a7a96033055b2, limb3: 0x1368da24ff42c9dbaddd1fd9, }, w7: u384 { limb0: 0x8a006d92f0f659b5879128c, limb1: 0x91a706c5249b0611411ef8, limb2: 0x476806b8ff9f387448c2283f, limb3: 0x86486211f2b7a69d85e6cc, }, w8: u384 { limb0: 0x359fb6053a482fd881477b73, limb1: 0x2e56ddae282b251bd26dc277, limb2: 0x9cc9414eb0de5930e18c2aef, limb3: 0xba5c3dae029b3461c4d83e3, }, w9: u384 { limb0: 0xd0329a1bee072189c5ee820d, limb1: 0x606c86092ed3d4c42466d4ed, limb2: 0xf05b66e3549519f50780d211, limb3: 0x9a4267bb540004634129449, }, w10: u384 { limb0: 0x7aac5888cca570c157bf526f, limb1: 0x37f49ebc8a648980697e0e77, limb2: 0xf97e721d54c47e0de9076619, limb3: 0x142cb1de4579b0555e3da41c, }, w11: u384 { limb0: 0x1ed3e34a9c2bf2a76e006e02, limb1: 0x295f1656ab393d271edff1c6, limb2: 0x5420889deecb1a07595e00d9, limb3: 0x4283e729218065b6577b5e2, }, }, E12D { w0: u384 { limb0: 0x5075209593337486e18df46d, limb1: 0xf0356df4c7181711fc91a827, limb2: 0xd97a31f91df154f5bb5851cc, limb3: 0x171ad2856e94d72ca9a24f15, }, w1: u384 { limb0: 0xff1d933543c728b07bca89f9, limb1: 0xccef75c4f943b25f9239cb2d, limb2: 0x5c4ebc877307706d280a3dbb, limb3: 0x1eb968438d74e489e2b3144, }, w2: u384 { limb0: 0x8cc0fc5028083749c6f1aba5, limb1: 0xf1a9d3c2e0265d84355ba0f4, limb2: 0x335a9d47fd282d5dce169790, limb3: 0x10f93b957c6f10e331c414bc, }, w3: u384 { limb0: 0x46ec651152db5023c9f201ed, limb1: 0xfb6d11467392f49bb22c65c9, limb2: 0xa591f73affc1eab979a3e88b, limb3: 0x826052b7ce51942a2ef191e, }, w4: u384 { limb0: 0x33ba6d3afeb674e23e5875d0, limb1: 0x59f23b1c3550f6e384c0f685, limb2: 0xda5c8ec47b003492848f9ced, limb3: 0x1693006cebfdda8888546ed4, }, w5: u384 { limb0: 0xd6d0c83bf1cad49129736afe, limb1: 0x9649be7e294be8399af5d37f, limb2: 0x4aa71b90ad07b5b8a36e6c12, limb3: 0x35aec40aaf79e7d69ccbee7, }, w6: u384 { limb0: 0xdb5a92f23380dee1624ece55, limb1: 0x5134a328c29fbe8f507b8e9, limb2: 0xc945ce072ddf331a76668f54, limb3: 0x16394a30abe069b9227e1c33, }, w7: u384 { limb0: 0xa23da0b9f52799a68dc93f24, limb1: 0x87cdda8d4a6217959ec51377, limb2: 0x57249de4c45419d6599ad204, limb3: 0x42312785159ea4b25189b90, }, w8: u384 { limb0: 0xbf4121cb4d006fe76a80ea73, limb1: 0x7572811c50bd43f4651663cc, limb2: 0xe1efd672ed967d2245b943d8, limb3: 0x1787f0a67f549962e9c14900, }, w9: u384 { limb0: 0x46eeec468b79d350dd499738, limb1: 0x2ea49c3b0d31b16e48774d10, limb2: 0x310dc8b2a2ce05fee1740e93, limb3: 0xc87d0f3e5646d57ba0f3aa3, }, w10: u384 { limb0: 0x342ee816cba104cc57c6c72f, limb1: 0x786438adbb7043c5ca348854, limb2: 0x493f49c69d99c3d0ab1ba333, limb3: 0x14f90bf3e332bc9472da656d, }, w11: u384 { limb0: 0xc34c780a191b063eee244f53, limb1: 0x4e65b486457bf36ded6b97be, limb2: 0xbfc811de2f4a72e871385095, limb3: 0x8e6f83135818adcffa10fb9, }, }, E12D { w0: u384 { limb0: 0xb672236717111ed916845c5d, limb1: 0xe05ed5f5b63130ce5ed7ce8d, limb2: 0xeb31d1721af0fc01c6a57a35, limb3: 0x39032c279eab78dcba6e6ed, }, w1: u384 { limb0: 0xb5fd928b359354dc3322587b, limb1: 0xe23b26cd9dcb026a63d7bd14, limb2: 0xe0c70e5315487d5185137fc0, limb3: 0x350b47980276bd086fb0081, }, w2: u384 { limb0: 0x35f10b2645a702ea20eb8a58, limb1: 0x8daf440feacc4167bd29f29f, limb2: 0x8aa066da8142908fd9dd00b9, limb3: 0xd808b595dfc641171a4589a, }, w3: u384 { limb0: 0x1a92f884e524af5ef9c51b4f, limb1: 0xa420b70bacb14c6241ffde9b, limb2: 0x5f3bbe9b0ed979e4a113a09f, limb3: 0x9362ed73e972e33f186b81e, }, w4: u384 { limb0: 0xc38fa3335d37ad7b433afc9a, limb1: 0x233c0caa5edcf5a96d0e9df4, limb2: 0x1bd45454abb2f3b001e563ff, limb3: 0x12ccd66a1baf7b9f617dc713, }, w5: u384 { limb0: 0x113ef84207dd50c3add3fb08, limb1: 0x803162a58c79355e6436964e, limb2: 0x27dbde708a2b5bcd71d8a803, limb3: 0x111e309aec4985bdbc80882c, }, w6: u384 { limb0: 0xbd293026b3eb9df6867cb268, limb1: 0xe20ee1bf24af986d5cd083f7, limb2: 0x5ef64ec24565ce144c3829bf, limb3: 0x11dd5ad08abb5b561a3f55a9, }, w7: u384 { limb0: 0xfbabf0ed3f8a0d795e246760, limb1: 0xe9f3f24bc74110c7a273f445, limb2: 0x55201b84cd4c2ed4db4b827c, limb3: 0x7581bdc02eb21512e4e5199, }, w8: u384 { limb0: 0x50990b07d3ad07f5cda1df83, limb1: 0x632286f3bbfcad27346d18bc, limb2: 0x57ddc3d0b6196616acbbf690, limb3: 0x12cb2e180657e981fd9f6793, }, w9: u384 { limb0: 0xb4a25977ccb83376385bcc3f, limb1: 0x409e0fc5843535e7b6ed163e, limb2: 0x7ee8e7148fce7871fc278d1e, limb3: 0x10956002d20d7414b33e971d, }, w10: u384 { limb0: 0xd2cad3667d7c91db4583301f, limb1: 0xce857381a82611c73427cf30, limb2: 0xd7519dec35afa6c62fdf1a93, limb3: 0x457e7d9af1ed868a22feb53, }, w11: u384 { limb0: 0xc5f0ce046d88cc73490b1ba2, limb1: 0xfa220bea70edb53dc7864606, limb2: 0x2918cf7c1e8cc362d0e91f41, limb3: 0x12c017f62533b0ecd49a3ec7, }, }, E12D { w0: u384 { limb0: 0x4518aac78144e2db1d690fe4, limb1: 0x8ee22fb09c4090a1c02db65, limb2: 0x8a5c9ae4cbcaac8abb408bf2, limb3: 0x9651c5934720322443f5a11, }, w1: u384 { limb0: 0x6494b375c23dfcce21c4995e, limb1: 0x41ecb011428f2cb8862ef588, limb2: 0xf99f42bcd9191bca26998f29, limb3: 0xaa56757b8a17fc161800337, }, w2: u384 { limb0: 0x49ed4b52c0e1957338585f16, limb1: 0xec9df95dec8748f334e0f2e1, limb2: 0x7de0ae19ffdac0ccb39246a2, limb3: 0xfb3acdb8486b68439e30548, }, w3: u384 { limb0: 0xfef29938a4d46b29fc1ab8ec, limb1: 0xb4893ab6f86df3d65f57ba5c, limb2: 0xd0404e3bd8ec3026aa989c65, limb3: 0x271d6ebc660acd8d80a0656, }, w4: u384 { limb0: 0x61ae001710978b805f2424d7, limb1: 0x641045bf7c449640c468a29e, limb2: 0x36471cc643cd1ac29df0fecb, limb3: 0x133f2d50d17aae7195255662, }, w5: u384 { limb0: 0x9ce3fa0f813dfdc1e58f1ba3, limb1: 0xda6067cb476596387621fd0c, limb2: 0xc4e9614cae2d4dbdedf3b5c9, limb3: 0x85036d8b38d3ec0fcf70a7c, }, w6: u384 { limb0: 0xfd1f35878f06df50b774ff5c, limb1: 0x50feeff3c2321474b6452db4, limb2: 0x9f7493a63e0d85a47fd3e297, limb3: 0x62dc9eb788448f8540cd8dc, }, w7: u384 { limb0: 0xc4a0867d87c7ad51322cb810, limb1: 0xd8ef0e23b67744060ef9dfb7, limb2: 0x40fd187e3a88eb2b97cfbeb2, limb3: 0xaa2506dbbb4b40e1160280f, }, w8: u384 { limb0: 0xc1dcb7d5d062a5a166387c7c, limb1: 0x6562c45c946f18353a39c690, limb2: 0xf6e93d09b449f23d816feb2c, limb3: 0x11fcfa1ad45d21f75f769cea, }, w9: u384 { limb0: 0xc01a508042b05e97a5f4713b, limb1: 0x34d0b623b7a887b7b8cd2b48, limb2: 0x3bdf0590b650cf2abd0cb69e, limb3: 0xd40ad6f197e440c5d882cfb, }, w10: u384 { limb0: 0xda450f4ec50e45a1aa05c7df, limb1: 0x8ed297199f1e04707e165a6f, limb2: 0x9953fd6d893f944489b6f265, limb3: 0x151f722a9d71cdbbc3f64572, }, w11: u384 { limb0: 0xab94a633f81012d0aa0a1123, limb1: 0x1fee996f53b99d7f880cd81f, limb2: 0x2eba0e596f0cb217540a9f6f, limb3: 0x6a3beb6e5c4d83dac52cd9c, }, }, E12D { w0: u384 { limb0: 0xe0bce0d55a595944dab6dbfa, limb1: 0x6a8646a7ccf054a613ef1054, limb2: 0xba8e1f16cf4e8c395896994c, limb3: 0x162d381237a930f8b29e736a, }, w1: u384 { limb0: 0xf1f266735451b2d2d7f1d30a, limb1: 0xa7218efef53e9dffab65229c, limb2: 0xb7c5e4dc5293bd7f9783effc, limb3: 0x11b0811580e449f355565e71, }, w2: u384 { limb0: 0x80d5d222072028933b28d7b2, limb1: 0xee7584721937fe2ab48078cb, limb2: 0x4df768bf695ffd52b0fd1c32, limb3: 0x1855a6b25e83bf66d4356b58, }, w3: u384 { limb0: 0x3a3df0e6083bf4bbe71e8c4f, limb1: 0x4fb213df213dbee762ab39c7, limb2: 0xca84e456f84ba4f61d280ed2, limb3: 0xcfc546b353f4c6f5d27dbe7, }, w4: u384 { limb0: 0x9cfab6d9fafadbd0e1c42893, limb1: 0xb5fb4e768002cba4b920caed, limb2: 0x506afea26fc4c7c654f4e050, limb3: 0x1583e33fd9048512c2a5c9fe, }, w5: u384 { limb0: 0xb3811bd3567d02c9c8ffb739, limb1: 0xcd49c3a01653b401503ab6c0, limb2: 0x56c65a37847a8f7251aa3148, limb3: 0x900ced571b08ea59f466697, }, w6: u384 { limb0: 0x3db7e62a39526ebeabbc5d95, limb1: 0x2a409338985dd19e8c1439bf, limb2: 0xce7718a40c9c26112265bf75, limb3: 0x105d6bb94f794d207e8dccf2, }, w7: u384 { limb0: 0x4a9921138c1b9724c664dad0, limb1: 0xe16e3e800231777a1b18f5e0, limb2: 0x406d5a7ed31a84b8c7e805b, limb3: 0x119e145f07bc6e23006475a8, }, w8: u384 { limb0: 0x91390ea551d00747d4835f37, limb1: 0xe8dded89909fe1429974f19, limb2: 0x36fc694a2d1a3d77ceb70cfa, limb3: 0x19f915fd54dfc09d92f03acf, }, w9: u384 { limb0: 0xb10a5bb15622ec5835700d8, limb1: 0x989765daca6c7f7b3a9cee46, limb2: 0xeb8d07dda116e084c5d9987f, limb3: 0x4b16db66ec480015be50763, }, w10: u384 { limb0: 0x1a0cb2b253062c1b6714614c, limb1: 0x1346a04f437bbb3430c7afbc, limb2: 0x9ee70f56486f1312034e6782, limb3: 0x8c8bfb66fadd2f5708f4ac0, }, w11: u384 { limb0: 0x8e4fa36170fcf1446bb898c0, limb1: 0x4b7035e4e8270f856e5671ed, limb2: 0x8cacdde4a419ed5e07bccd6f, limb3: 0xe892aa8d03b1e9dec74558a, }, }, ] .span(), big_Q: array![ u384 { limb0: 0x445d6baafba8450dd13ed7b1, limb1: 0x290c9657f4f55cea043fdd38, limb2: 0x9325259addf718d6d8287cff, limb3: 0x1d9331cfa3c9e50315038fa, }, u384 { limb0: 0x4b3082298a1e64aeadf6bf90, limb1: 0x4073d7bf69cf718d0056a5c6, limb2: 0xe00ddf4c12751e4cfccfd895, limb3: 0x259e13c714da7cdadc58791, }, u384 { limb0: 0x3a1c999d4db095eb59dcab4, limb1: 0x2d7de69e089b90aaa2d37e93, limb2: 0xf1be9d13ca73d61ed6817074, limb3: 0x97c9b09076cb34cee98515a, }, u384 { limb0: 0xa2c1efb24769a664c8b5fd35, limb1: 0x83a2af13670211bb0d69e600, limb2: 0xb1257a3a2c065750ddb409ba, limb3: 0x8c516dd5cc0af28b42feb7a, }, u384 { limb0: 0xb842c53b0590a848831e42f9, limb1: 0xb19e34913aff2326ef7a4358, limb2: 0x326f8de9bd1da5637f27ecc9, limb3: 0xdd6b998d03b616754dd2745, }, u384 { limb0: 0x6b61729e36ac7dc6f5114f96, limb1: 0xd67d641943aaa49b670230b0, limb2: 0xa2742c61b2099b163d2f67a2, limb3: 0xaff98133b5513c388c77286, }, u384 { limb0: 0x6c662edd7ccaf9aff500ed55, limb1: 0xd9aff80b364e3e5ab855a905, limb2: 0x286b7ac3c97fda4c95bd5fc0, limb3: 0xa2a508ed4fbf2d5ed430d8a, }, u384 { limb0: 0x7d3c3e63daa6a1ba97034b14, limb1: 0xa274ec2fe88d6f6509fed56d, limb2: 0xd2e7878eda9439d8d344d66a, limb3: 0xce409e0c30a390acd5cb44c, }, u384 { limb0: 0x217d423b495dc5ae1a3ebb46, limb1: 0xbad9b357090039ce2657b4ac, limb2: 0x4b7d3dbf36446dbb89dc0a97, limb3: 0x14dbe2f3ac60d09cf4d130b8, }, u384 { limb0: 0xcb0e3cb62edd80a81422c3f, limb1: 0x284dd7b6213f74f850e5a00, limb2: 0xee16b1f7b204b3379109d597, limb3: 0x159214b5b6cdbe70787026a1, }, u384 { limb0: 0x890f89db0a2e6271f1c5b430, limb1: 0x28bec49f958bb579f22ab228, limb2: 0x4ae230efdbd46047ad515117, limb3: 0x19a91b845ba6892ce3bef339, }, u384 { limb0: 0x738e91e3ecfbd258f8fe8a6e, limb1: 0xf796d5a8506ed71d63fec016, limb2: 0x4c4e70198951e55aa23495c, limb3: 0x14cca87e427a70b85b070c0f, }, u384 { limb0: 0x1573dafb3e3cc8f7087e2baa, limb1: 0xc24144c0ef7d7c40d7cc7a28, limb2: 0xe7ec035065fef9dfdf8f89a3, limb3: 0x106c1926f28babab7d8c16cb, }, u384 { limb0: 0x22081492011aae7272771a1b, limb1: 0x5c9f5077ca48e0ee885c6ffe, limb2: 0x529b91af0e34992c4e6bcc84, limb3: 0xcc8121d3536a7a113bca097, }, u384 { limb0: 0xaf6cc43bbd7f160a7e936e79, limb1: 0x2492c5c3c94b513a864cf1e1, limb2: 0x413026ea3fcfee76f31caa1d, limb3: 0x9f639d622d22ffab05ccfb4, }, u384 { limb0: 0xa877cd8f36cb3fad2288d537, limb1: 0x6d098c614d17493d58c3c12a, limb2: 0xd3a0579b4b38d611668682d5, limb3: 0xe77527e6087815c6f095c7a, }, u384 { limb0: 0xfa0ce8e766acf11630ac4ed1, limb1: 0x12148dd86cbeb22d385c029b, limb2: 0xcc1cb77fabb58425e96a9996, limb3: 0x10239f2110b3cbb1f9fa2ec9, }, u384 { limb0: 0x750d10e2bd02a6c51086cab4, limb1: 0x9d29bb0591e7f1a185d6a776, limb2: 0x6f9be5ccb0ab1c3fe3d823d6, limb3: 0x18a3598c016c5e90fc1c8f93, }, u384 { limb0: 0x9283ce36ff033ab356f55ba, limb1: 0xf6fccbb17c45b9432dd6ca1f, limb2: 0xfa06112ff2521c21241b2f4c, limb3: 0x1778d3acef5459b9a2e97de3, }, u384 { limb0: 0x67ebade07e5471b202335db2, limb1: 0xfc73e15d09d8a445fc192c6a, limb2: 0x496a96cc7341206bc41eb57c, limb3: 0x11c3434c4f2c87f3e8015fa1, }, u384 { limb0: 0xc68e6c66eeb7b465b7a91053, limb1: 0x8d32cd1f66e178c5551f52ab, limb2: 0x6607f3d6497797b353046088, limb3: 0x14c3d0025036e6b347df5690, }, u384 { limb0: 0x70b5f2016163fb80daf98105, limb1: 0x53531c225664a31d885c9f09, limb2: 0x972f54744c8910194d46b123, limb3: 0x2dff63e76a655c07087f97c, }, u384 { limb0: 0xe6301609c8d5798ee22c1634, limb1: 0xab940f7cc6a16e27f73d7bf1, limb2: 0xd83458215932fa14abc055f3, limb3: 0xb092a78ebfefa3b0e719d2a, }, u384 { limb0: 0xa9f81870938647e39e5a22e3, limb1: 0x6c8ece4ae0c4af6863738aa4, limb2: 0xccf0c9038baa5c9ea8f6a27c, limb3: 0x3d1f8e8e7891e4c79a2b0a1, }, u384 { limb0: 0x3971f6e183c521ccc4c00f1b, limb1: 0x1c4c8c97c639b207b8334f11, limb2: 0xe680de4e5fb8abf302d2f58b, limb3: 0x17be4592af7a922cca9c9fc3, }, u384 { limb0: 0x87c35e39141341ca2e0d8508, limb1: 0x3e32e84fe81062ada2274c5e, limb2: 0x7f158c23738383ccea5ed387, limb3: 0x2acdbe9122d2488cffaad06, }, u384 { limb0: 0x53e7b760e7074537bf97d1b1, limb1: 0xbddef09a5d237ab04bc1758a, limb2: 0x796e09ce6356693c2c754faf, limb3: 0x190c405bbe626263a60ac287, }, u384 { limb0: 0x259984eb9d3cbf91b1e9a850, limb1: 0x86793adaf8b0d344f2beaabb, limb2: 0x7756383d853d7f737c71c33a, limb3: 0x19714a1835930d5c7f5cd913, }, u384 { limb0: 0xc5ae3086a997b7d18c2d4b28, limb1: 0x13ad293d82c1ac29f38ffe23, limb2: 0x31b2e0aa3407a25ed34c91f8, limb3: 0xa8f492b622aaefbdc4da524, }, u384 { limb0: 0x557ec346c69c378c38506f20, limb1: 0x29c46724103db6643eccd29c, limb2: 0xc5397b60e6ac233c35673a04, limb3: 0x19b827ff25ac18face681427, }, u384 { limb0: 0x140a82fed9826ee3a61c5da9, limb1: 0x1b69c21c770397907d5a8576, limb2: 0xb189950ab3596e8822c02df1, limb3: 0xb3fd0ef8640d326a5093267, }, u384 { limb0: 0xf584f2222babbd504f512a06, limb1: 0xb5c7167d437b911cdb124a20, limb2: 0x9d31759b776236e702a59c4, limb3: 0x5620a9e0b882123b8c43352, }, u384 { limb0: 0xb47cc9d50f5c044ef3fc54ff, limb1: 0xce9e44ddec479c872583193b, limb2: 0x1278be54a9143510810a44e2, limb3: 0x14c158919eb2b2b17ae59dcb, }, u384 { limb0: 0x6510443a881532d33252a377, limb1: 0xab07a032dad31a1fd281ece1, limb2: 0x8268c9bec54ed78904bd2ec3, limb3: 0x19b2d416d9612fc5f1270b6, }, u384 { limb0: 0xb09728c1e17000e2a3adca0f, limb1: 0x7484c18a5ae8b6cb9e65a9ca, limb2: 0x9eb0da27d0ddd54d0bff2cdd, limb3: 0x59e4c1fc0b81222a58f48af, }, u384 { limb0: 0xb3d5cfcc42af3d890070a1f6, limb1: 0x633a89c63d397a8dbd0dc25, limb2: 0xad82bbba57b2be1082e3235f, limb3: 0x12d31cdd24655dd244b0404f, }, u384 { limb0: 0x122ff70798de075749ce2d26, limb1: 0xd5b4963a1b98a82c73786fbf, limb2: 0x372484de20675fa54dc2cf9f, limb3: 0x2a445bfa7323e30a092f5b, }, u384 { limb0: 0x77f0cb8771beabc8ea2c4272, limb1: 0xe0b49b26fb8aeb933a750769, limb2: 0x84abeca7fef536bdd473ab51, limb3: 0x14851f0a498cd44b8afb6001, }, u384 { limb0: 0x6a468d6d89d57fe33804ff0, limb1: 0xc4e66bc6e60b089dae3d5ad7, limb2: 0xd3ab3db43c216558e8c77290, limb3: 0x40f13e37975ec01631d71f3, }, u384 { limb0: 0x85425db02fcadd803a092e2e, limb1: 0x28638cae2487483c84297b8f, limb2: 0x945bfcd8bee8582abc15e530, limb3: 0x13c56cdb8fcf524429af5173, }, u384 { limb0: 0xc6d332dc2c22eff4ac31e3f7, limb1: 0xab10f60e98c90fa3ec89aef0, limb2: 0xde024ec2857f5a84fc6db8c4, limb3: 0x2964e03f7fc83afe59cde96, }, u384 { limb0: 0xd4925da47f5e2e95b67a3ced, limb1: 0x6e6d8b1e0d6a29fe41045062, limb2: 0xd27a4e1e277668d8bda45b13, limb3: 0xbdf5a29b9faecbc2d3177d6, }, u384 { limb0: 0x434c8372e10401e48ec2429f, limb1: 0x69d82c824fdc0d3805790867, limb2: 0xe7ed7a57583b5216053c9db9, limb3: 0x17f4f9de7e48979601c1c2a2, }, u384 { limb0: 0xa0d11eb6a504d256679608e5, limb1: 0x29c90c255da6fbb5cfc4495f, limb2: 0xca47b1abd20a31804f8930db, limb3: 0xbbd83ec78a6166ef36aa1fb, }, u384 { limb0: 0x7289808af814df23d6c89d00, limb1: 0x43453d1ce5e8e05dbb839b05, limb2: 0xa97d31b161062d0943e6f9a6, limb3: 0x9c04f649cb1a2e07c8773e8, }, u384 { limb0: 0x20586d603e1ddff39a084aed, limb1: 0xf31785a3ac061168a03aa547, limb2: 0xf814cb5325da93c4f837d4b2, limb3: 0x81783db43513c9c522bbc62, }, u384 { limb0: 0x6fbdc21a5be36a2e3010fbfa, limb1: 0x6bc5468e17f4418d53ebd302, limb2: 0x601c35ccaad0d6f3e1b3a8ac, limb3: 0x1973786c55c0ba2f6b87f117, }, u384 { limb0: 0x78aebf2ddcc087a32daa8eca, limb1: 0xb61ae20d301ccd65afcbde1b, limb2: 0xa3a00d31127efee85171b8a8, limb3: 0x37fe11b1a206af95bb12277, }, u384 { limb0: 0x812d7f20aca719c4e96ef68c, limb1: 0xb793866373bb9784eca7769f, limb2: 0x77d685e75d4c729ee2f5aa1e, limb3: 0x96bae5729b3ff540ca2e986, }, u384 { limb0: 0xb68666a1db42879ded98f557, limb1: 0x9dd8d5a6b735fd37f11c7d0a, limb2: 0xdccd06cb933682744b6edec1, limb3: 0x13f9cffbe7dfca805ca43c1c, }, u384 { limb0: 0x3b0007fe2df3aa78e4d00825, limb1: 0x87f41fa9a1e246c025a48aae, limb2: 0x13bd23d6f9969a42cbf12ad5, limb3: 0x329bcac3396e175891f5e45, }, u384 { limb0: 0x2fd7716c4a48ac8b434706b3, limb1: 0xd21d16d7856b1674f1dc39ae, limb2: 0xb43394cda9fe62e8d377d54, limb3: 0x8ad7cfe0094ae811e0a3063, }, u384 { limb0: 0x58cf88bebce17edd906ae443, limb1: 0x94a46cad8c18eade64faded7, limb2: 0xae14dd193ff4541d23d85e17, limb3: 0x13360e00eb699cc99be490e9, }, u384 { limb0: 0x1a7e23cb5791836fe922268d, limb1: 0xde8655a6b4507b002bd271b7, limb2: 0x4710dbc3fdb420049b6c64fa, limb3: 0x2db26a62c747dc5bdd7b775, }, u384 { limb0: 0xebeafa29827e65bb15878c9d, limb1: 0x14681e2120d0cd6e6336c9e3, limb2: 0x5485292282ed8e1294af5d54, limb3: 0xa26f69d8c76f9c959e41210, }, u384 { limb0: 0xcc466e1b38a8dff604c867f8, limb1: 0x16c8fe03017f1c81ae02d22, limb2: 0xa179039f6497c0a5fc60b563, limb3: 0x19066a33a7e3ed1118e61830, }, u384 { limb0: 0xc346d0995967c29aa92807b9, limb1: 0x85f1f66d99d64af8bf82b8b0, limb2: 0x8187274b1c52c1da8f724a15, limb3: 0x18ba38267c30aba28957f941, }, u384 { limb0: 0x646086cb2ac155e1ec929d86, limb1: 0x531e5f581431c7586f5e2110, limb2: 0x93f08aaaa048fa9e4bfcad79, limb3: 0x19451eb73b51d2550bf756d1, }, u384 { limb0: 0xe873237c87e085a9d92c285c, limb1: 0xc005d71145372f35f6e41051, limb2: 0x53d935a5d3983508180a8b39, limb3: 0x29b1bb36952f26c9ab9cb09, }, u384 { limb0: 0x801be88517a11ef1b6fd18a3, limb1: 0x9e2732f2abe69238df87e036, limb2: 0xcd6b60dca61b24f8bd2a8142, limb3: 0x28b7a065b5815f550404fd3, }, u384 { limb0: 0x917514fee5ea2267d6e33cd5, limb1: 0xcc67cdf72598354987d6755f, limb2: 0x25a5303b6c2af70c314ce7a5, limb3: 0x19e3c56d8709c7c04df676ae, }, u384 { limb0: 0x26bfe1899ae9dfd5b4da3b4, limb1: 0x969e22add3fd0aab63ad293, limb2: 0x48b187c212b3c7a4e7921c71, limb3: 0x672ed7e345d5f8a631c3304, }, u384 { limb0: 0xd20189c1a4bb67316333ae21, limb1: 0xc954417d074501388e7f6f86, limb2: 0xb5bd8dfb4efa8691c82c5800, limb3: 0x222584ecf600b97d162905e, }, u384 { limb0: 0xe60621f5521bd7ad8ad8b96c, limb1: 0x22475963b9bc603f561d5380, limb2: 0xf7ac4167352d3fc0b99fdf27, limb3: 0x150dd6bc480b181487774516, }, u384 { limb0: 0x7ca855b1cb1b28d86747f5a7, limb1: 0x53c0147cb1c13d8013522d02, limb2: 0x8ec52bfd40787ffbff320a9b, limb3: 0x182a5b33ef92df1c12447743, }, u384 { limb0: 0x9114a84f9bf4bd50874294fb, limb1: 0x5c0ae0681a57917c99e1426d, limb2: 0x6ad9a76609db5dc5c675c791, limb3: 0x19c1ec699482671fcaf1b19c, }, u384 { limb0: 0x2a3fd6b81e91f29b4d984e09, limb1: 0x50d301fab9c7d2f4779f90b1, limb2: 0xe6c8ccba191f1a279aee7e85, limb3: 0x136aa0c1143935a5e1a88ffc, }, u384 { limb0: 0x80a7670da417aa6f772cbfde, limb1: 0x61a344bfe57ffda8583dce50, limb2: 0xaeff7716b9b0e2a62feb3444, limb3: 0x2d4acc5a6afcbbdd3ec1106, }, u384 { limb0: 0x676c32bbca3e50f9280e1061, limb1: 0x721511fc5f703e9ee9cc8da7, limb2: 0xe4c28b279f46d1cae3f54872, limb3: 0x15d485af475c1ec9dbe78064, }, u384 { limb0: 0xed174e0ba434acd83711140, limb1: 0x42582904c61a29492ae17412, limb2: 0x3a8c7681f1eea64ae9caf7e9, limb3: 0x114f3cbdcbb37059a0b84f27, }, u384 { limb0: 0xad20ab5616fdbbbc85cff83d, limb1: 0x6b942863e803e855a12ae040, limb2: 0x49b20e2216eeafa9f267a636, limb3: 0xe96b66c6575d66a4ca5151d, }, u384 { limb0: 0x39ee6f5f837a2777769add11, limb1: 0x6da3d6ae14650170b03ee541, limb2: 0x5b568a3fc770bbc64a7abe0f, limb3: 0x2eb487d6806532733c3d5fc, }, u384 { limb0: 0xcbd78245c1111c2acf1cef7d, limb1: 0x2911da3ac9da565e05474a87, limb2: 0xb674717dd54246d1432893f7, limb3: 0x17d72d4450da66be3e21d845, }, u384 { limb0: 0xe8768aa2b9f49c1c9b179f7d, limb1: 0x8e87b8af5558360512405719, limb2: 0x2156d221f1eb0cd2ed4dea1a, limb3: 0x100512b562db61ca04587345, }, u384 { limb0: 0x2c7c6d4b54613235e5cfdbd8, limb1: 0xba509a15aba288f06e03b94b, limb2: 0x90018281875bf77714f47bd7, limb3: 0x68ccc6e229baf5e85a3eb3a, }, u384 { limb0: 0x2fe1317b1246c3d092d82bdd, limb1: 0xea756691cedf3b7369b482a5, limb2: 0x4eb31426855d031dede7aca0, limb3: 0x19285fe3057c4fff419fa3c4, }, u384 { limb0: 0xa3e0fe5805b346066bc4765c, limb1: 0xe6925e5999a25ae2beffa0d, limb2: 0xc009e4bb5bedc77b372b3277, limb3: 0x7940eb50b0ca5cc3b3bfe6d, }, u384 { limb0: 0x893e34d59249b8ef88b06c0c, limb1: 0x5e5488f21489b1d42d4febd7, limb2: 0xab8d85a40ac50c5467e84a53, limb3: 0x130cf982003e63a5c952d9a3, }, u384 { limb0: 0x859ef9e375fa2adec571eed0, limb1: 0xb90ec8bfa8bd1f80c7e76d4, limb2: 0x8f340c9d3ba7ceeac975a64, limb3: 0xd081f665e8f9b330e06062b, }, u384 { limb0: 0x7b665812578a7a35233cb10, limb1: 0x4424006d3b8b0e80e45cce9d, limb2: 0xd8dcfef05921b7a43d2e5a2a, limb3: 0x134f53443d962f815cb5ed9d, }, u384 { limb0: 0xc834d23469e835f617f80a52, limb1: 0x5efea47890e7f384560bcf1e, limb2: 0xc90a7871da96e44eaf467fb3, limb3: 0xe142bddd0e6505216e1da4, }, ], z: 0x73e890d1574ee2b2f3ca3ceae9c940462f46109b37cd53e4f1b245027a6ccfa, }; let res = multi_pairing_check_bls12_381_2P_2F(pair0, pair1, lines, hint); assert!(res.is_ok()); } #[test] fn test_BLS12_381_mpcheck_3P_2F_with_extra_miller_loop_result() { let pair0: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { limb0: 0xe4f817e54aede0613c17035c, limb1: 0xdff1f15010392a6da1f95a6, limb2: 0xbed78d3d341e911d49f15454, limb3: 0x18154782ce0913b21588066d, }, y: u384 { limb0: 0x3d77d61326ef5a9a5a681757, limb1: 0xd3070afd4f0e121de7fcee60, limb2: 0xdf9ef4088763fe611fb85858, limb3: 0x11a612bdd0bc09562856a70, }, }, q: G2Point { x0: u384 { limb0: 0x30d2fddc2fa171cdd4d31a55, limb1: 0x92fab4f255a20d09700542e5, limb2: 0x4d92a8c02d22b8cea4ff21ab, limb3: 0x120a838699abaae7ed948194, }, x1: u384 { limb0: 0x51cd5fdc71cf4557ef606935, limb1: 0x92e1b13e2c93fc9957b17841, limb2: 0x6143a906b63b7f3476ad6819, limb3: 0x158186f6f2dd04cfa4e78547, }, y0: u384 { limb0: 0x9f1c7dcdbe4574f05d0c093b, limb1: 0xcde395f3ee4e353cf25a2e21, limb2: 0x6a44c4a6d642c3dd98128703, limb3: 0x2bd32fdfe26d866771e2180, }, y1: u384 { limb0: 0x7060005397ea11f7e9a26050, limb1: 0xeb8540654b533da9b594fc27, limb2: 0xfc83cf9d283b7231df1db3f9, limb3: 0x7ff9623d918ca12e0ff6cce, }, }, }; let pair1: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { limb0: 0xe4f817e54aede0613c17035c, limb1: 0xdff1f15010392a6da1f95a6, limb2: 0xbed78d3d341e911d49f15454, limb3: 0x18154782ce0913b21588066d, }, y: u384 { limb0: 0x3d77d61326ef5a9a5a681757, limb1: 0xd3070afd4f0e121de7fcee60, limb2: 0xdf9ef4088763fe611fb85858, limb3: 0x11a612bdd0bc09562856a70, }, }, q: G2Point { x0: u384 { limb0: 0x30d2fddc2fa171cdd4d31a55, limb1: 0x92fab4f255a20d09700542e5, limb2: 0x4d92a8c02d22b8cea4ff21ab, limb3: 0x120a838699abaae7ed948194, }, x1: u384 { limb0: 0x51cd5fdc71cf4557ef606935, limb1: 0x92e1b13e2c93fc9957b17841, limb2: 0x6143a906b63b7f3476ad6819, limb3: 0x158186f6f2dd04cfa4e78547, }, y0: u384 { limb0: 0x9f1c7dcdbe4574f05d0c093b, limb1: 0xcde395f3ee4e353cf25a2e21, limb2: 0x6a44c4a6d642c3dd98128703, limb3: 0x2bd32fdfe26d866771e2180, }, y1: u384 { limb0: 0x7060005397ea11f7e9a26050, limb1: 0xeb8540654b533da9b594fc27, limb2: 0xfc83cf9d283b7231df1db3f9, limb3: 0x7ff9623d918ca12e0ff6cce, }, }, }; let pair2: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { limb0: 0xe4f817e54aede0613c17035c, limb1: 0xdff1f15010392a6da1f95a6, limb2: 0xbed78d3d341e911d49f15454, limb3: 0x18154782ce0913b21588066d, }, y: u384 { limb0: 0x3d77d61326ef5a9a5a681757, limb1: 0xd3070afd4f0e121de7fcee60, limb2: 0xdf9ef4088763fe611fb85858, limb3: 0x11a612bdd0bc09562856a70, }, }, q: G2Point { x0: u384 { limb0: 0x30d2fddc2fa171cdd4d31a55, limb1: 0x92fab4f255a20d09700542e5, limb2: 0x4d92a8c02d22b8cea4ff21ab, limb3: 0x120a838699abaae7ed948194, }, x1: u384 { limb0: 0x51cd5fdc71cf4557ef606935, limb1: 0x92e1b13e2c93fc9957b17841, limb2: 0x6143a906b63b7f3476ad6819, limb3: 0x158186f6f2dd04cfa4e78547, }, y0: u384 { limb0: 0x9f1c7dcdbe4574f05d0c093b, limb1: 0xcde395f3ee4e353cf25a2e21, limb2: 0x6a44c4a6d642c3dd98128703, limb3: 0x2bd32fdfe26d866771e2180, }, y1: u384 { limb0: 0x7060005397ea11f7e9a26050, limb1: 0xeb8540654b533da9b594fc27, limb2: 0xfc83cf9d283b7231df1db3f9, limb3: 0x7ff9623d918ca12e0ff6cce, }, }, }; let precomputed_miller_loop_result = E12D { w0: u384 { limb0: 0xb911c83d732e7d278eca2b2, limb1: 0x371bde647281b4f0753c7b54, limb2: 0x32f3136b6412048dad82afcf, limb3: 0x276d8a09b1ef471d61e1fe9, }, w1: u384 { limb0: 0x2d08819331e98c628ad7e6a4, limb1: 0xf78975823557a6eaed403568, limb2: 0xd357bcaa08f3bcf837b69302, limb3: 0x84dc8eb534426c70fdeb97a, }, w2: u384 { limb0: 0xd8ab7356837a3539e775e8a4, limb1: 0xeac85ffce2bc7b2518fb953c, limb2: 0xdb2e7f9897c5d9aac15601e7, limb3: 0xad1ecf602d65fe881eaa6e0, }, w3: u384 { limb0: 0xb4bbd298bab0e4881a5ebb34, limb1: 0x14d8b2b539c52b38e862bb30, limb2: 0xc1ba1386389c858a2803bf51, limb3: 0xc44713fa939be012d57473a, }, w4: u384 { limb0: 0x8c8a60ac405578242750266c, limb1: 0x1f6ed0fc4768c4d33ae5bde9, limb2: 0x74356664cf5f284c5d9047dd, limb3: 0x17d27924032bad1b96b038a7, }, w5: u384 { limb0: 0xdca890b5c14238be57f05981, limb1: 0x5d5411099e394511d4bf5f21, limb2: 0x529d5c8a74ead9d439593056, limb3: 0x252d46d43966352b46ef871, }, w6: u384 { limb0: 0x1e65e90c6094915aaef973cd, limb1: 0x606ac452167328657347b203, limb2: 0x6198bb2924ef03ae600f7222, limb3: 0xdb2280eeda7144c402dfe7f, }, w7: u384 { limb0: 0x71c5034bc18b6d1c45a03c30, limb1: 0x31f94b4bb159c235c039f752, limb2: 0xdf1e1ed1387d8c002c5f3a20, limb3: 0x190ab4a19e1f1b981b892bae, }, w8: u384 { limb0: 0xf00e883b8262021a004b9fc8, limb1: 0x369f48c0083f000e7eeec362, limb2: 0x9170f7ea386763607860320a, limb3: 0x16e03a19b04611cdff78c5fd, }, w9: u384 { limb0: 0xf3b76b5dfdcf84760b96fa0c, limb1: 0x4ba7b263cc869557904c59cf, limb2: 0xbed73f63ea723c5eca33d491, limb3: 0x128d8d88c3c8616ff326a554, }, w10: u384 { limb0: 0x4380616825a3a723a4dc2b5c, limb1: 0x712262fd5e7ddfa653a4708e, limb2: 0x303031f5c1bf5e2f73d4750a, limb3: 0x36d2ef1d9b923357234e298, }, w11: u384 { limb0: 0xbe53e886831d35b55f343069, limb1: 0x34b2a5b11f48e46a872245a2, limb2: 0x6afab08a2bc52479f09c105f, limb3: 0x329f18e7852fa05613e9204, }, }; let lines = array![ G2Line { r0a0: u384 { limb0: 0xa5165654d48ad38da89955b2, limb1: 0x36388a52d2379c53735285c1, limb2: 0xb1cba90b5a7d592a905913f6, limb3: 0xf04eef4de6a895d29865a33, }, r0a1: u384 { limb0: 0x11170525e014139da401da13, limb1: 0xdfc4d38dc6621f61b8834990, limb2: 0xb86906ab9966ab43169ba396, limb3: 0x104b8a575e67290a4d8e5d0, }, r1a0: u384 { limb0: 0x2fddaa92e366f11a886242bb, limb1: 0xf7255a5c3e06de681d21207f, limb2: 0x544afd5f8c149ed0980ad33f, limb3: 0x18ff3a5ad5398470eec050cd, }, r1a1: u384 { limb0: 0x5ebc8ff3cef71a1b2b0ce5d9, limb1: 0xf4093ee74d1a5714b4562355, limb2: 0xe6d400f1614d23e5b0b3831f, limb3: 0x4e3cba1ec100020f137797e, }, }, G2Line { r0a0: u384 { limb0: 0xcf94aa0961ba244fb7b34f8, limb1: 0x9eedbbaadfb34c820b7b9046, limb2: 0xdfdb0674b62b2c9622a321e9, limb3: 0x18745455fc3b957175dbaaab, }, r0a1: u384 { limb0: 0xb18b9b496c7e76d19d0476a3, limb1: 0x532e40e737e71a727e36699d, limb2: 0x1173a4db0c906464c9c6dfe5, limb3: 0x14436970af87927ca25ab397, }, r1a0: u384 { limb0: 0x2b8bedf7ace9601914137555, limb1: 0x8e5a6616ba6b5a7c0a4b60cc, limb2: 0xeed2fb7a6b6951d08720afd2, limb3: 0x6e20b841803b78a54cb51f0, }, r1a1: u384 { limb0: 0xe2f3cc1d38637307df479c33, limb1: 0x553fbfecff64b0f8513ea53, limb2: 0xc35e934c2f0dd0dfc36fb764, limb3: 0xfe253f73265563f5da37bf0, }, }, G2Line { r0a0: u384 { limb0: 0xa5165654d48ad38da89955b2, limb1: 0x36388a52d2379c53735285c1, limb2: 0xb1cba90b5a7d592a905913f6, limb3: 0xf04eef4de6a895d29865a33, }, r0a1: u384 { limb0: 0x11170525e014139da401da13, limb1: 0xdfc4d38dc6621f61b8834990, limb2: 0xb86906ab9966ab43169ba396, limb3: 0x104b8a575e67290a4d8e5d0, }, r1a0: u384 { limb0: 0x2fddaa92e366f11a886242bb, limb1: 0xf7255a5c3e06de681d21207f, limb2: 0x544afd5f8c149ed0980ad33f, limb3: 0x18ff3a5ad5398470eec050cd, }, r1a1: u384 { limb0: 0x5ebc8ff3cef71a1b2b0ce5d9, limb1: 0xf4093ee74d1a5714b4562355, limb2: 0xe6d400f1614d23e5b0b3831f, limb3: 0x4e3cba1ec100020f137797e, }, }, G2Line { r0a0: u384 { limb0: 0xcf94aa0961ba244fb7b34f8, limb1: 0x9eedbbaadfb34c820b7b9046, limb2: 0xdfdb0674b62b2c9622a321e9, limb3: 0x18745455fc3b957175dbaaab, }, r0a1: u384 { limb0: 0xb18b9b496c7e76d19d0476a3, limb1: 0x532e40e737e71a727e36699d, limb2: 0x1173a4db0c906464c9c6dfe5, limb3: 0x14436970af87927ca25ab397, }, r1a0: u384 { limb0: 0x2b8bedf7ace9601914137555, limb1: 0x8e5a6616ba6b5a7c0a4b60cc, limb2: 0xeed2fb7a6b6951d08720afd2, limb3: 0x6e20b841803b78a54cb51f0, }, r1a1: u384 { limb0: 0xe2f3cc1d38637307df479c33, limb1: 0x553fbfecff64b0f8513ea53, limb2: 0xc35e934c2f0dd0dfc36fb764, limb3: 0xfe253f73265563f5da37bf0, }, }, G2Line { r0a0: u384 { limb0: 0xf63d5adf98504eb919404838, limb1: 0x322c7fec39e0dbb7e3fab671, limb2: 0x66a7d9554b938f680e363589, limb3: 0x168b865e60bf25b5f80efdba, }, r0a1: u384 { limb0: 0xa19475051f484344fbfcb94, limb1: 0xecab432b31e20fd481ef1641, limb2: 0x9aef0e4871833b8e86498442, limb3: 0xbfbebd5fe20e6b34cd10d52, }, r1a0: u384 { limb0: 0x3034c4ead4a9ecca97ef227f, limb1: 0x3ff722abdd9b1b4fb2ed76a2, limb2: 0x89478f4e3e947df714a9fb5e, limb3: 0xf7d15d762bc99988f9d789d, }, r1a1: u384 { limb0: 0xe7309c91453760cefb576bc9, limb1: 0xc04e0c62e92a4efd0f9d9c3b, limb2: 0xada0f0a505209353f4b17f24, limb3: 0x185b2e9615659da43b50282e, }, }, G2Line { r0a0: u384 { limb0: 0xf63d5adf98504eb919404838, limb1: 0x322c7fec39e0dbb7e3fab671, limb2: 0x66a7d9554b938f680e363589, limb3: 0x168b865e60bf25b5f80efdba, }, r0a1: u384 { limb0: 0xa19475051f484344fbfcb94, limb1: 0xecab432b31e20fd481ef1641, limb2: 0x9aef0e4871833b8e86498442, limb3: 0xbfbebd5fe20e6b34cd10d52, }, r1a0: u384 { limb0: 0x3034c4ead4a9ecca97ef227f, limb1: 0x3ff722abdd9b1b4fb2ed76a2, limb2: 0x89478f4e3e947df714a9fb5e, limb3: 0xf7d15d762bc99988f9d789d, }, r1a1: u384 { limb0: 0xe7309c91453760cefb576bc9, limb1: 0xc04e0c62e92a4efd0f9d9c3b, limb2: 0xada0f0a505209353f4b17f24, limb3: 0x185b2e9615659da43b50282e, }, }, G2Line { r0a0: u384 { limb0: 0xacd0c846fbba57a06a86174d, limb1: 0xb3559bb08ff796c300ff2163, limb2: 0xb7ebbcfa41b1f30d02874a61, limb3: 0x7a87f7612c63af0969932c, }, r0a1: u384 { limb0: 0xd4f55c22c625dddb92b73bd7, limb1: 0x681facc4bfa2b130fcf3dacd, limb2: 0x3bd92d164662bbb7f99c1b5a, limb3: 0x12ac7263968961adecde567f, }, r1a0: u384 { limb0: 0x81f5ef562d3dfd1fe4780fbf, limb1: 0xcb396419628f7f02f0f0e2f8, limb2: 0x3012e01dd8fc025163ad5e2a, limb3: 0x1c053f246178e26fa6d3dea, }, r1a1: u384 { limb0: 0xc81f62215d8116e0b580ac54, limb1: 0xef2e48f58ffbbafac5b2b827, limb2: 0xe22598ad9700d53d0ab24440, limb3: 0xeec459ce4be55ed92aa3f08, }, }, G2Line { r0a0: u384 { limb0: 0x628192ce61515a10db139388, limb1: 0xdf2fbc87bd9658e30ab5ca96, limb2: 0x81420786279bf4a2c17ecbee, limb3: 0x7cd8317980fac457217aa73, }, r0a1: u384 { limb0: 0xad2f18fc2c832eedc6828d6a, limb1: 0x2c62b1d26ffe93fb41fbf6a6, limb2: 0x54a6928b6b6cb48d95627389, limb3: 0x155b45f029858968773bd77a, }, r1a0: u384 { limb0: 0x3a4649b4ea519194273b8413, limb1: 0x39ed13d914c220a2a8621253, limb2: 0xb2c2fe85ccf72ab37ef6d3e8, limb3: 0x2f73caef28adb638d772f51, }, r1a1: u384 { limb0: 0x9a5228bb86ec7a83fc86d719, limb1: 0x7b209838f6c5a27f3b13850e, limb2: 0x2f682efc7c8f9d868bb155a0, limb3: 0x14e1ffb93bd477d5824891f6, }, }, G2Line { r0a0: u384 { limb0: 0xacd0c846fbba57a06a86174d, limb1: 0xb3559bb08ff796c300ff2163, limb2: 0xb7ebbcfa41b1f30d02874a61, limb3: 0x7a87f7612c63af0969932c, }, r0a1: u384 { limb0: 0xd4f55c22c625dddb92b73bd7, limb1: 0x681facc4bfa2b130fcf3dacd, limb2: 0x3bd92d164662bbb7f99c1b5a, limb3: 0x12ac7263968961adecde567f, }, r1a0: u384 { limb0: 0x81f5ef562d3dfd1fe4780fbf, limb1: 0xcb396419628f7f02f0f0e2f8, limb2: 0x3012e01dd8fc025163ad5e2a, limb3: 0x1c053f246178e26fa6d3dea, }, r1a1: u384 { limb0: 0xc81f62215d8116e0b580ac54, limb1: 0xef2e48f58ffbbafac5b2b827, limb2: 0xe22598ad9700d53d0ab24440, limb3: 0xeec459ce4be55ed92aa3f08, }, }, G2Line { r0a0: u384 { limb0: 0x628192ce61515a10db139388, limb1: 0xdf2fbc87bd9658e30ab5ca96, limb2: 0x81420786279bf4a2c17ecbee, limb3: 0x7cd8317980fac457217aa73, }, r0a1: u384 { limb0: 0xad2f18fc2c832eedc6828d6a, limb1: 0x2c62b1d26ffe93fb41fbf6a6, limb2: 0x54a6928b6b6cb48d95627389, limb3: 0x155b45f029858968773bd77a, }, r1a0: u384 { limb0: 0x3a4649b4ea519194273b8413, limb1: 0x39ed13d914c220a2a8621253, limb2: 0xb2c2fe85ccf72ab37ef6d3e8, limb3: 0x2f73caef28adb638d772f51, }, r1a1: u384 { limb0: 0x9a5228bb86ec7a83fc86d719, limb1: 0x7b209838f6c5a27f3b13850e, limb2: 0x2f682efc7c8f9d868bb155a0, limb3: 0x14e1ffb93bd477d5824891f6, }, }, G2Line { r0a0: u384 { limb0: 0x1aade009b16b47d1f727828e, limb1: 0xc03ad66ffa3eb3facb3162dd, limb2: 0x89fc57933c577fcb302abd31, limb3: 0x14a7ae423327b8eb4258ddc7, }, r0a1: u384 { limb0: 0xb11c5c536b7a01248a05036e, limb1: 0x4b63f65385cbfd77dd0c6b99, limb2: 0xfc1bd30c87ae38746b0ea7ed, limb3: 0xb343c5f6d66a234c16e751f, }, r1a0: u384 { limb0: 0xbfc9b6d848bfcfc1500c9e92, limb1: 0xe6aca7c5d29a818829b8fcd6, limb2: 0xf14399d2c3b586fa7369ef82, limb3: 0x16fe63f10adc6d94ef6ac666, }, r1a1: u384 { limb0: 0x788c4a6c2cc0d6d1431f8fe0, limb1: 0x6fbb017725bc437f59472864, limb2: 0x7af112586422e8b451fff86f, limb3: 0x8f33c7c0369d6bf05923ec6, }, }, G2Line { r0a0: u384 { limb0: 0x1aade009b16b47d1f727828e, limb1: 0xc03ad66ffa3eb3facb3162dd, limb2: 0x89fc57933c577fcb302abd31, limb3: 0x14a7ae423327b8eb4258ddc7, }, r0a1: u384 { limb0: 0xb11c5c536b7a01248a05036e, limb1: 0x4b63f65385cbfd77dd0c6b99, limb2: 0xfc1bd30c87ae38746b0ea7ed, limb3: 0xb343c5f6d66a234c16e751f, }, r1a0: u384 { limb0: 0xbfc9b6d848bfcfc1500c9e92, limb1: 0xe6aca7c5d29a818829b8fcd6, limb2: 0xf14399d2c3b586fa7369ef82, limb3: 0x16fe63f10adc6d94ef6ac666, }, r1a1: u384 { limb0: 0x788c4a6c2cc0d6d1431f8fe0, limb1: 0x6fbb017725bc437f59472864, limb2: 0x7af112586422e8b451fff86f, limb3: 0x8f33c7c0369d6bf05923ec6, }, }, G2Line { r0a0: u384 { limb0: 0xc8e72714e847363877b7a8f7, limb1: 0xe3e3fa798cae86df2a30d4aa, limb2: 0x7459f8d7d611e2cb2ec54a0e, limb3: 0x152cd68e17604069ec445769, }, r0a1: u384 { limb0: 0x8314b69d7f735267593148b, limb1: 0xee63002a2560cba68706d4d8, limb2: 0xfaa3112fa6d55883c688d4cb, limb3: 0x14bb5f09c9b3530802a1e99f, }, r1a0: u384 { limb0: 0x5f0624eb82fb7ea0161d7d4f, limb1: 0xd71eb5753a71df931abdea02, limb2: 0x7e9d29717cc3a362d2351d9a, limb3: 0x10bb67b2ea7e11fa4f644370, }, r1a1: u384 { limb0: 0xca7b1c09d30828e75c7c7281, limb1: 0x5c8c1483d8402202dd0de198, limb2: 0x2228fda9f92014d9870c7f11, limb3: 0x6e2f5953b1cc17a41a0cf1b, }, }, G2Line { r0a0: u384 { limb0: 0xc8e72714e847363877b7a8f7, limb1: 0xe3e3fa798cae86df2a30d4aa, limb2: 0x7459f8d7d611e2cb2ec54a0e, limb3: 0x152cd68e17604069ec445769, }, r0a1: u384 { limb0: 0x8314b69d7f735267593148b, limb1: 0xee63002a2560cba68706d4d8, limb2: 0xfaa3112fa6d55883c688d4cb, limb3: 0x14bb5f09c9b3530802a1e99f, }, r1a0: u384 { limb0: 0x5f0624eb82fb7ea0161d7d4f, limb1: 0xd71eb5753a71df931abdea02, limb2: 0x7e9d29717cc3a362d2351d9a, limb3: 0x10bb67b2ea7e11fa4f644370, }, r1a1: u384 { limb0: 0xca7b1c09d30828e75c7c7281, limb1: 0x5c8c1483d8402202dd0de198, limb2: 0x2228fda9f92014d9870c7f11, limb3: 0x6e2f5953b1cc17a41a0cf1b, }, }, G2Line { r0a0: u384 { limb0: 0xc9b70b573ab2dbee53352a96, limb1: 0xcc8c7eca86c99d50d3e90936, limb2: 0x7d70aa72c271b1f8c15ad43e, limb3: 0xe499ea04ed9644c9f31ff2c, }, r0a1: u384 { limb0: 0xa0f9073cb60f9d948336700a, limb1: 0xbcba195f8a338d4cfe326b7d, limb2: 0x830451f120569c1ba8a262fc, limb3: 0x7d35ad7c0095f289f76c6bd, }, r1a0: u384 { limb0: 0x6ef4a7e1adac7589cf5b1154, limb1: 0xaca7ecc39f53183948238de2, limb2: 0x7b65183abb9d2d0be2a6d539, limb3: 0x63e7285b3dc806c2788d0e8, }, r1a1: u384 { limb0: 0x263affe0370ee6f1853c2fb0, limb1: 0xc73621e485f5fef86ded3d9, limb2: 0x4a9c22bbb63a9b67c98dc2df, limb3: 0x10a59819d699abac0f845268, }, }, G2Line { r0a0: u384 { limb0: 0x842113d6568cc4a0ff417952, limb1: 0xbf9bf6040bcf98685b071730, limb2: 0xc764bd69e11c73f3ecaf8d07, limb3: 0xd587218a1496f9351f01e73, }, r0a1: u384 { limb0: 0xbc9127de7d6cf406424d7f15, limb1: 0x8168235c896874ad54d9512, limb2: 0xdcf79d8a1a168ae1c6dfa2e4, limb3: 0xf95426d8e89954dee065f67, }, r1a0: u384 { limb0: 0x229ab89c13125cc2bf25a72d, limb1: 0xd5a7df3aaaa0c0353dcac5a7, limb2: 0x7c94527fabc77777ff2464ab, limb3: 0x110918e757ed869ea437e672, }, r1a1: u384 { limb0: 0xe982d22571f2f17aa68f712c, limb1: 0xa48a9b75c7c89bfab5f5d1eb, limb2: 0x1b89a01e72668b0a30e747fb, limb3: 0xaa126ea871c3e3ca7d0b445, }, }, G2Line { r0a0: u384 { limb0: 0xc9b70b573ab2dbee53352a96, limb1: 0xcc8c7eca86c99d50d3e90936, limb2: 0x7d70aa72c271b1f8c15ad43e, limb3: 0xe499ea04ed9644c9f31ff2c, }, r0a1: u384 { limb0: 0xa0f9073cb60f9d948336700a, limb1: 0xbcba195f8a338d4cfe326b7d, limb2: 0x830451f120569c1ba8a262fc, limb3: 0x7d35ad7c0095f289f76c6bd, }, r1a0: u384 { limb0: 0x6ef4a7e1adac7589cf5b1154, limb1: 0xaca7ecc39f53183948238de2, limb2: 0x7b65183abb9d2d0be2a6d539, limb3: 0x63e7285b3dc806c2788d0e8, }, r1a1: u384 { limb0: 0x263affe0370ee6f1853c2fb0, limb1: 0xc73621e485f5fef86ded3d9, limb2: 0x4a9c22bbb63a9b67c98dc2df, limb3: 0x10a59819d699abac0f845268, }, }, G2Line { r0a0: u384 { limb0: 0x842113d6568cc4a0ff417952, limb1: 0xbf9bf6040bcf98685b071730, limb2: 0xc764bd69e11c73f3ecaf8d07, limb3: 0xd587218a1496f9351f01e73, }, r0a1: u384 { limb0: 0xbc9127de7d6cf406424d7f15, limb1: 0x8168235c896874ad54d9512, limb2: 0xdcf79d8a1a168ae1c6dfa2e4, limb3: 0xf95426d8e89954dee065f67, }, r1a0: u384 { limb0: 0x229ab89c13125cc2bf25a72d, limb1: 0xd5a7df3aaaa0c0353dcac5a7, limb2: 0x7c94527fabc77777ff2464ab, limb3: 0x110918e757ed869ea437e672, }, r1a1: u384 { limb0: 0xe982d22571f2f17aa68f712c, limb1: 0xa48a9b75c7c89bfab5f5d1eb, limb2: 0x1b89a01e72668b0a30e747fb, limb3: 0xaa126ea871c3e3ca7d0b445, }, }, G2Line { r0a0: u384 { limb0: 0x8856fcd611eaccb5398098b3, limb1: 0xf99e4037ab06eee76202c0a7, limb2: 0x661b47fbe6e707a1da016abb, limb3: 0x14d41350bc68e30131fda152, }, r0a1: u384 { limb0: 0xa330e089de7e62d03d0d8381, limb1: 0xb89bc0fa83c738dbed74992b, limb2: 0x76e01692ebe0ab4a7bbc1cdf, limb3: 0x119ff3df49b55e97212b9137, }, r1a0: u384 { limb0: 0x17f35432949ee63be1b62fb4, limb1: 0x558e84d6438f3f13cb52798, limb2: 0x49ae9bb91dbd154524d0b491, limb3: 0xa4ecb322f18755a2d7de6cb, }, r1a1: u384 { limb0: 0x16493c6765e497627871029a, limb1: 0x31a7d00a47e2cdb224ef5050, limb2: 0x140290a6f2fa5cb13477f571, limb3: 0x1846bb57be1afd1089f8faa2, }, }, G2Line { r0a0: u384 { limb0: 0x8856fcd611eaccb5398098b3, limb1: 0xf99e4037ab06eee76202c0a7, limb2: 0x661b47fbe6e707a1da016abb, limb3: 0x14d41350bc68e30131fda152, }, r0a1: u384 { limb0: 0xa330e089de7e62d03d0d8381, limb1: 0xb89bc0fa83c738dbed74992b, limb2: 0x76e01692ebe0ab4a7bbc1cdf, limb3: 0x119ff3df49b55e97212b9137, }, r1a0: u384 { limb0: 0x17f35432949ee63be1b62fb4, limb1: 0x558e84d6438f3f13cb52798, limb2: 0x49ae9bb91dbd154524d0b491, limb3: 0xa4ecb322f18755a2d7de6cb, }, r1a1: u384 { limb0: 0x16493c6765e497627871029a, limb1: 0x31a7d00a47e2cdb224ef5050, limb2: 0x140290a6f2fa5cb13477f571, limb3: 0x1846bb57be1afd1089f8faa2, }, }, G2Line { r0a0: u384 { limb0: 0xcab2483e7d8dd3fc04231f3e, limb1: 0x6e798d52173fbcf7011727cf, limb2: 0x3aa288e6664238899e96388, limb3: 0xbed7f1cb0f29dbd779eb4db, }, r0a1: u384 { limb0: 0xda17dc08cb341a88d345029c, limb1: 0xca9a84bc1b03f8ae6f50eb29, limb2: 0xfab0923470c6c01cd53037f7, limb3: 0x11b814eb656959f8bcd55260, }, r1a0: u384 { limb0: 0x2f5c03f8edc8ef9851eca211, limb1: 0xb8f62bffa8430def4963177c, limb2: 0x285721fd3cb9239504693349, limb3: 0x19697adae2f920497006cf60, }, r1a1: u384 { limb0: 0x8ba36c1c6a84f64c58779c66, limb1: 0xd8d040c366aee8415c83abc5, limb2: 0x80bdb025a81cc5fca162bc55, limb3: 0x132455e68b47f0c80c186c5e, }, }, G2Line { r0a0: u384 { limb0: 0xcab2483e7d8dd3fc04231f3e, limb1: 0x6e798d52173fbcf7011727cf, limb2: 0x3aa288e6664238899e96388, limb3: 0xbed7f1cb0f29dbd779eb4db, }, r0a1: u384 { limb0: 0xda17dc08cb341a88d345029c, limb1: 0xca9a84bc1b03f8ae6f50eb29, limb2: 0xfab0923470c6c01cd53037f7, limb3: 0x11b814eb656959f8bcd55260, }, r1a0: u384 { limb0: 0x2f5c03f8edc8ef9851eca211, limb1: 0xb8f62bffa8430def4963177c, limb2: 0x285721fd3cb9239504693349, limb3: 0x19697adae2f920497006cf60, }, r1a1: u384 { limb0: 0x8ba36c1c6a84f64c58779c66, limb1: 0xd8d040c366aee8415c83abc5, limb2: 0x80bdb025a81cc5fca162bc55, limb3: 0x132455e68b47f0c80c186c5e, }, }, G2Line { r0a0: u384 { limb0: 0xc339cdf7e4e5e3a44dbaacae, limb1: 0xf7b3d92dcf1e19226487efff, limb2: 0xeebbb6f12ddfff580bdaf23e, limb3: 0x885c7a835866bb3f2618531, }, r0a1: u384 { limb0: 0xfd8a9b43a96749b067da9ea7, limb1: 0x1a45ef3bc3a624fa6a875a42, limb2: 0x871092b7aae86db98a4839e3, limb3: 0x42fdd240a03c256c99338a4, }, r1a0: u384 { limb0: 0x34fac230b4cd059f4d142d09, limb1: 0x578becad930850ec442c0499, limb2: 0xdb467db9f5beceb2b12f240b, limb3: 0x8715bbc83d753dac30ee064, }, r1a1: u384 { limb0: 0xbe4bacb87a4297599bed4a75, limb1: 0x15bab163a1bec103441823b0, limb2: 0xf6b498ea628259382f611e1, limb3: 0x25cec6e6bc8e2b0ac8eaa18, }, }, G2Line { r0a0: u384 { limb0: 0xc339cdf7e4e5e3a44dbaacae, limb1: 0xf7b3d92dcf1e19226487efff, limb2: 0xeebbb6f12ddfff580bdaf23e, limb3: 0x885c7a835866bb3f2618531, }, r0a1: u384 { limb0: 0xfd8a9b43a96749b067da9ea7, limb1: 0x1a45ef3bc3a624fa6a875a42, limb2: 0x871092b7aae86db98a4839e3, limb3: 0x42fdd240a03c256c99338a4, }, r1a0: u384 { limb0: 0x34fac230b4cd059f4d142d09, limb1: 0x578becad930850ec442c0499, limb2: 0xdb467db9f5beceb2b12f240b, limb3: 0x8715bbc83d753dac30ee064, }, r1a1: u384 { limb0: 0xbe4bacb87a4297599bed4a75, limb1: 0x15bab163a1bec103441823b0, limb2: 0xf6b498ea628259382f611e1, limb3: 0x25cec6e6bc8e2b0ac8eaa18, }, }, G2Line { r0a0: u384 { limb0: 0x62ac6bd3e467b6012ed51077, limb1: 0xba3ff2d1e2f398b07962d460, limb2: 0x5f87a3069c6c9317d90fe448, limb3: 0x17828eef82575ad624b7eb8, }, r0a1: u384 { limb0: 0x60f822b2434ac1915436b6a2, limb1: 0xc280dfe322af22994c4f583a, limb2: 0x2eb22edf843a31f56924e264, limb3: 0xaa3dff436448f24891ce347, }, r1a0: u384 { limb0: 0xc957369365d1f757dc7e1b60, limb1: 0xf8fe29b2dfecfb3445695b50, limb2: 0x93b4be33129e250ba6e9d713, limb3: 0x54e2b0392e3280c73e25db7, }, r1a1: u384 { limb0: 0x147632c4b781c87049f2585a, limb1: 0xb96a476595a9eec08470167a, limb2: 0xa692b500ee1328d089d355c9, limb3: 0xe3b9ccbcbf1842377715224, }, }, G2Line { r0a0: u384 { limb0: 0x62ac6bd3e467b6012ed51077, limb1: 0xba3ff2d1e2f398b07962d460, limb2: 0x5f87a3069c6c9317d90fe448, limb3: 0x17828eef82575ad624b7eb8, }, r0a1: u384 { limb0: 0x60f822b2434ac1915436b6a2, limb1: 0xc280dfe322af22994c4f583a, limb2: 0x2eb22edf843a31f56924e264, limb3: 0xaa3dff436448f24891ce347, }, r1a0: u384 { limb0: 0xc957369365d1f757dc7e1b60, limb1: 0xf8fe29b2dfecfb3445695b50, limb2: 0x93b4be33129e250ba6e9d713, limb3: 0x54e2b0392e3280c73e25db7, }, r1a1: u384 { limb0: 0x147632c4b781c87049f2585a, limb1: 0xb96a476595a9eec08470167a, limb2: 0xa692b500ee1328d089d355c9, limb3: 0xe3b9ccbcbf1842377715224, }, }, G2Line { r0a0: u384 { limb0: 0x64d16d41b66a102c9b553ea3, limb1: 0x295cac58ddcb86c19d5085a6, limb2: 0x7e2cd8cb5856d2d8e7eed046, limb3: 0x15dbe6d70fdbc55ae84afa69, }, r0a1: u384 { limb0: 0x54565b8fd91f675d7f4459f2, limb1: 0x272f73f709855d58fb90690e, limb2: 0x55e2996b05c2d49f2a82120c, limb3: 0xec904bbad282fc6edb48286, }, r1a0: u384 { limb0: 0xb8bb51ac0ae45391324c34ee, limb1: 0x1eed107f37cd128849f36954, limb2: 0xee5c6663ab2ffe95b57e90a0, limb3: 0x10059eac9c018522626ea231, }, r1a1: u384 { limb0: 0xe2ccd1c7748f1dad4aa6574, limb1: 0x3f7f644aea9f5ef5c21d6b1d, limb2: 0x78437a492823073bab9f2f24, limb3: 0x154ca2c1025881bb42f419c9, }, }, G2Line { r0a0: u384 { limb0: 0x64d16d41b66a102c9b553ea3, limb1: 0x295cac58ddcb86c19d5085a6, limb2: 0x7e2cd8cb5856d2d8e7eed046, limb3: 0x15dbe6d70fdbc55ae84afa69, }, r0a1: u384 { limb0: 0x54565b8fd91f675d7f4459f2, limb1: 0x272f73f709855d58fb90690e, limb2: 0x55e2996b05c2d49f2a82120c, limb3: 0xec904bbad282fc6edb48286, }, r1a0: u384 { limb0: 0xb8bb51ac0ae45391324c34ee, limb1: 0x1eed107f37cd128849f36954, limb2: 0xee5c6663ab2ffe95b57e90a0, limb3: 0x10059eac9c018522626ea231, }, r1a1: u384 { limb0: 0xe2ccd1c7748f1dad4aa6574, limb1: 0x3f7f644aea9f5ef5c21d6b1d, limb2: 0x78437a492823073bab9f2f24, limb3: 0x154ca2c1025881bb42f419c9, }, }, G2Line { r0a0: u384 { limb0: 0xa148fed9dcfdb8471e37e2cf, limb1: 0x33498344be66beb21dacb6cc, limb2: 0xdb2dab4272dd7e03d560ec7c, limb3: 0x11377cdcdb4dce503806d536, }, r0a1: u384 { limb0: 0x4bdd4af2794e5ba563dea99d, limb1: 0xb686ccbe1211bc916075f1f0, limb2: 0x8275da72cc81642b581cd3c, limb3: 0xdc4f2a881416ee0d2a76b19, }, r1a0: u384 { limb0: 0xd911cc786bf78185445a5728, limb1: 0xc4fc6828294ec360441828a0, limb2: 0x5710cbd08f34cb4b1d311efd, limb3: 0x10911287680bf76d68b048fa, }, r1a1: u384 { limb0: 0xa06d07ee3f35ed581feb7120, limb1: 0x7ec15bc93962ff96203e99ef, limb2: 0x6459955c3f1acf888a31b71c, limb3: 0x163cfbb725456b1e3f8a2a52, }, }, G2Line { r0a0: u384 { limb0: 0xa148fed9dcfdb8471e37e2cf, limb1: 0x33498344be66beb21dacb6cc, limb2: 0xdb2dab4272dd7e03d560ec7c, limb3: 0x11377cdcdb4dce503806d536, }, r0a1: u384 { limb0: 0x4bdd4af2794e5ba563dea99d, limb1: 0xb686ccbe1211bc916075f1f0, limb2: 0x8275da72cc81642b581cd3c, limb3: 0xdc4f2a881416ee0d2a76b19, }, r1a0: u384 { limb0: 0xd911cc786bf78185445a5728, limb1: 0xc4fc6828294ec360441828a0, limb2: 0x5710cbd08f34cb4b1d311efd, limb3: 0x10911287680bf76d68b048fa, }, r1a1: u384 { limb0: 0xa06d07ee3f35ed581feb7120, limb1: 0x7ec15bc93962ff96203e99ef, limb2: 0x6459955c3f1acf888a31b71c, limb3: 0x163cfbb725456b1e3f8a2a52, }, }, G2Line { r0a0: u384 { limb0: 0xe681d22feda4a7f061e8f6b3, limb1: 0xad9da9a0f9e44384ff71b25a, limb2: 0x25b7987299c14b92935df59b, limb3: 0xe18539ac218e8292f772d49, }, r0a1: u384 { limb0: 0xbbab4a0c7d4380e59aaf4a14, limb1: 0x92300d61ef168a3b7f078369, limb2: 0x88740486a05e8355a2f396a6, limb3: 0x1312ea288e7ab2c682515d55, }, r1a0: u384 { limb0: 0x5cf20f4d699d245a06e981a4, limb1: 0x4ada2dc6c16584036497194a, limb2: 0x69d2a6a56d565893c5dc5cee, limb3: 0xe83ade7bf2df02d06d669f9, }, r1a1: u384 { limb0: 0xdde1fccec9bcee2c65bb7113, limb1: 0xbd3a4889309b7b362a350027, limb2: 0xab1aabdde55d523dd61bd16a, limb3: 0x8e64666e47f311366b84b22, }, }, G2Line { r0a0: u384 { limb0: 0xe681d22feda4a7f061e8f6b3, limb1: 0xad9da9a0f9e44384ff71b25a, limb2: 0x25b7987299c14b92935df59b, limb3: 0xe18539ac218e8292f772d49, }, r0a1: u384 { limb0: 0xbbab4a0c7d4380e59aaf4a14, limb1: 0x92300d61ef168a3b7f078369, limb2: 0x88740486a05e8355a2f396a6, limb3: 0x1312ea288e7ab2c682515d55, }, r1a0: u384 { limb0: 0x5cf20f4d699d245a06e981a4, limb1: 0x4ada2dc6c16584036497194a, limb2: 0x69d2a6a56d565893c5dc5cee, limb3: 0xe83ade7bf2df02d06d669f9, }, r1a1: u384 { limb0: 0xdde1fccec9bcee2c65bb7113, limb1: 0xbd3a4889309b7b362a350027, limb2: 0xab1aabdde55d523dd61bd16a, limb3: 0x8e64666e47f311366b84b22, }, }, G2Line { r0a0: u384 { limb0: 0xf9b090fdb3bf0f5be038a031, limb1: 0xec03d47d7f362f2f46b88120, limb2: 0xcf4ea7dfdbf684e0c9c3c73, limb3: 0x11dd63055f71654adf72fdf4, }, r0a1: u384 { limb0: 0x9eb8ba348aa55966b2360dbb, limb1: 0x48dd21f65324b91c93beb3f, limb2: 0x79f6c38f8f7656836cb1317d, limb3: 0x108bdc14fca7e6d3304b3f3b, }, r1a0: u384 { limb0: 0xbf74876b9993b6ea79d756e1, limb1: 0xd5e5d391946b6572594a23d1, limb2: 0xf16cf2d26319a001b024184f, limb3: 0xe47f5f42a8c539bf4c4aabc, }, r1a1: u384 { limb0: 0xd16c2d990821fee62aea0c7, limb1: 0x9fcd17773a83125f41a6e06e, limb2: 0x97ed32a632508ccadf843b41, limb3: 0xb98f51a6d9ef1cf288747c5, }, }, G2Line { r0a0: u384 { limb0: 0xf9b090fdb3bf0f5be038a031, limb1: 0xec03d47d7f362f2f46b88120, limb2: 0xcf4ea7dfdbf684e0c9c3c73, limb3: 0x11dd63055f71654adf72fdf4, }, r0a1: u384 { limb0: 0x9eb8ba348aa55966b2360dbb, limb1: 0x48dd21f65324b91c93beb3f, limb2: 0x79f6c38f8f7656836cb1317d, limb3: 0x108bdc14fca7e6d3304b3f3b, }, r1a0: u384 { limb0: 0xbf74876b9993b6ea79d756e1, limb1: 0xd5e5d391946b6572594a23d1, limb2: 0xf16cf2d26319a001b024184f, limb3: 0xe47f5f42a8c539bf4c4aabc, }, r1a1: u384 { limb0: 0xd16c2d990821fee62aea0c7, limb1: 0x9fcd17773a83125f41a6e06e, limb2: 0x97ed32a632508ccadf843b41, limb3: 0xb98f51a6d9ef1cf288747c5, }, }, G2Line { r0a0: u384 { limb0: 0xc04588c9f09fa499106bc8c9, limb1: 0x7a64ff03080c6dd7d7e9eac2, limb2: 0xf4f302730238d347b951a1f3, limb3: 0xbc95c23d2aa850d9637039c, }, r0a1: u384 { limb0: 0x982410511881122d237bcf90, limb1: 0x69908a3359202333b8494da3, limb2: 0xd8845b29dfc85657a12e1e6b, limb3: 0x861225fbc10126c68b47fbb, }, r1a0: u384 { limb0: 0x307f66feb496a692288ee79c, limb1: 0xea2a865ce7b1a83eb71f516e, limb2: 0x3acfdeb605537b1db464d091, limb3: 0x199bcae152e692669ca36f70, }, r1a1: u384 { limb0: 0x67ed8bd9d8b3671bc52dd01a, limb1: 0xa128cb4f4b3fb9f78826fa5c, limb2: 0xdc60b2aeb8989c43359f9ee4, limb3: 0x154183d7ad332d63192fd716, }, }, G2Line { r0a0: u384 { limb0: 0x4c1b7c692bcb90fc6da4682a, limb1: 0xdee0840ffe02e6822d2fbc52, limb2: 0x76f9d61c6685c1019409e2e6, limb3: 0x131589c0f041ca383a010a65, }, r0a1: u384 { limb0: 0x5f44efbb5a56642b645b251d, limb1: 0xcc0b6a435e33cf7e66f796ef, limb2: 0x2afead4ba783ddd084a2de2, limb3: 0x14fb18cfb114fe90def3b975, }, r1a0: u384 { limb0: 0x6738569610d2c81b6648b199, limb1: 0x3d70fbe299588075a3c0cd65, limb2: 0x9fb99753b8fe3603ef293640, limb3: 0xb0c1cb2bfa9049055dc042a, }, r1a1: u384 { limb0: 0xcf4196c9021ca7f093cfb891, limb1: 0xdc602f37532b7f244f265bb4, limb2: 0x2eda24acdd8ac91dba31011a, limb3: 0x831f465b19f5e211770a330, }, }, G2Line { r0a0: u384 { limb0: 0xc04588c9f09fa499106bc8c9, limb1: 0x7a64ff03080c6dd7d7e9eac2, limb2: 0xf4f302730238d347b951a1f3, limb3: 0xbc95c23d2aa850d9637039c, }, r0a1: u384 { limb0: 0x982410511881122d237bcf90, limb1: 0x69908a3359202333b8494da3, limb2: 0xd8845b29dfc85657a12e1e6b, limb3: 0x861225fbc10126c68b47fbb, }, r1a0: u384 { limb0: 0x307f66feb496a692288ee79c, limb1: 0xea2a865ce7b1a83eb71f516e, limb2: 0x3acfdeb605537b1db464d091, limb3: 0x199bcae152e692669ca36f70, }, r1a1: u384 { limb0: 0x67ed8bd9d8b3671bc52dd01a, limb1: 0xa128cb4f4b3fb9f78826fa5c, limb2: 0xdc60b2aeb8989c43359f9ee4, limb3: 0x154183d7ad332d63192fd716, }, }, G2Line { r0a0: u384 { limb0: 0x4c1b7c692bcb90fc6da4682a, limb1: 0xdee0840ffe02e6822d2fbc52, limb2: 0x76f9d61c6685c1019409e2e6, limb3: 0x131589c0f041ca383a010a65, }, r0a1: u384 { limb0: 0x5f44efbb5a56642b645b251d, limb1: 0xcc0b6a435e33cf7e66f796ef, limb2: 0x2afead4ba783ddd084a2de2, limb3: 0x14fb18cfb114fe90def3b975, }, r1a0: u384 { limb0: 0x6738569610d2c81b6648b199, limb1: 0x3d70fbe299588075a3c0cd65, limb2: 0x9fb99753b8fe3603ef293640, limb3: 0xb0c1cb2bfa9049055dc042a, }, r1a1: u384 { limb0: 0xcf4196c9021ca7f093cfb891, limb1: 0xdc602f37532b7f244f265bb4, limb2: 0x2eda24acdd8ac91dba31011a, limb3: 0x831f465b19f5e211770a330, }, }, G2Line { r0a0: u384 { limb0: 0xbead4997832000eec2d23426, limb1: 0x70326bda198a624d79fe5b6e, limb2: 0x34320ab5d9d57a16f9b3335d, limb3: 0x15ed7fcb0bbd153b17bd9ab7, }, r0a1: u384 { limb0: 0xeef082656c66bb5b7891e0fa, limb1: 0x5c3a8513f52f57cb1b0c7958, limb2: 0xcd1545fd6d3fca90cca7ddbf, limb3: 0x14a5d26055e3895cc2078189, }, r1a0: u384 { limb0: 0x51fd450f49e14cf29994d0d8, limb1: 0x352df17adf32a543695add5b, limb2: 0x620770f7a8734b83419a0015, limb3: 0x3bed8150b4306f815c54ae0, }, r1a1: u384 { limb0: 0xdcda7311d4becff3df733d35, limb1: 0x6d1b5d403a8a86fa9c0ad26b, limb2: 0x41249656cda2d1314833048c, limb3: 0x18fa645f04346cb55df845ec, }, }, G2Line { r0a0: u384 { limb0: 0xbead4997832000eec2d23426, limb1: 0x70326bda198a624d79fe5b6e, limb2: 0x34320ab5d9d57a16f9b3335d, limb3: 0x15ed7fcb0bbd153b17bd9ab7, }, r0a1: u384 { limb0: 0xeef082656c66bb5b7891e0fa, limb1: 0x5c3a8513f52f57cb1b0c7958, limb2: 0xcd1545fd6d3fca90cca7ddbf, limb3: 0x14a5d26055e3895cc2078189, }, r1a0: u384 { limb0: 0x51fd450f49e14cf29994d0d8, limb1: 0x352df17adf32a543695add5b, limb2: 0x620770f7a8734b83419a0015, limb3: 0x3bed8150b4306f815c54ae0, }, r1a1: u384 { limb0: 0xdcda7311d4becff3df733d35, limb1: 0x6d1b5d403a8a86fa9c0ad26b, limb2: 0x41249656cda2d1314833048c, limb3: 0x18fa645f04346cb55df845ec, }, }, G2Line { r0a0: u384 { limb0: 0xd9186b9c733a20289999898e, limb1: 0x6de39966328adffa7073a300, limb2: 0xf15f1d47e489cb0211ae9365, limb3: 0x130c5531b0d8c306969ed394, }, r0a1: u384 { limb0: 0xdb40370c9fc08d2498113f0e, limb1: 0x52a13a99df87505995085459, limb2: 0xef9d808d7ee6f27a05e1b801, limb3: 0x50452f33ca7e399a6020469, }, r1a0: u384 { limb0: 0x36def0c15c3f8e182c9ea44d, limb1: 0x326195297234c6d7a93109a7, limb2: 0x87a1563a69011deff0488ae7, limb3: 0x132a2fc3be8766a1177e52aa, }, r1a1: u384 { limb0: 0x62378fa1506521802106b7e5, limb1: 0xd8cc0cff92a519c933c28a36, limb2: 0xa1102e8ae53eaf25f786453b, limb3: 0x9a64df029f7f27d39d0dc0e, }, }, G2Line { r0a0: u384 { limb0: 0xd9186b9c733a20289999898e, limb1: 0x6de39966328adffa7073a300, limb2: 0xf15f1d47e489cb0211ae9365, limb3: 0x130c5531b0d8c306969ed394, }, r0a1: u384 { limb0: 0xdb40370c9fc08d2498113f0e, limb1: 0x52a13a99df87505995085459, limb2: 0xef9d808d7ee6f27a05e1b801, limb3: 0x50452f33ca7e399a6020469, }, r1a0: u384 { limb0: 0x36def0c15c3f8e182c9ea44d, limb1: 0x326195297234c6d7a93109a7, limb2: 0x87a1563a69011deff0488ae7, limb3: 0x132a2fc3be8766a1177e52aa, }, r1a1: u384 { limb0: 0x62378fa1506521802106b7e5, limb1: 0xd8cc0cff92a519c933c28a36, limb2: 0xa1102e8ae53eaf25f786453b, limb3: 0x9a64df029f7f27d39d0dc0e, }, }, G2Line { r0a0: u384 { limb0: 0x25ea37848e0ac8549a3cfea4, limb1: 0x4769da5b3fdb93516843dcc4, limb2: 0x25c2fee69d51e108950ee66c, limb3: 0xcbe02237fb28faee0f0f322, }, r0a1: u384 { limb0: 0xeb04a575e069162f1fbffeac, limb1: 0x70a494b054c8efcb93da1757, limb2: 0x47f9c06eaaca8c969afabd71, limb3: 0x161220a792413bbe47629580, }, r1a0: u384 { limb0: 0xdcd325a8ba5cef5390f5d151, limb1: 0xcdc42d134b74aa1a5062ce50, limb2: 0x60be437e1aa4a9878448da68, limb3: 0x3afadaca8a96f634f1a416c, }, r1a1: u384 { limb0: 0x2a305361b67f6592fa2a5b23, limb1: 0x60950369afb1c2180ac6372, limb2: 0x18abd84df73559c2ec121d5d, limb3: 0x30f5ef160b1fd967f8015ab, }, }, G2Line { r0a0: u384 { limb0: 0x25ea37848e0ac8549a3cfea4, limb1: 0x4769da5b3fdb93516843dcc4, limb2: 0x25c2fee69d51e108950ee66c, limb3: 0xcbe02237fb28faee0f0f322, }, r0a1: u384 { limb0: 0xeb04a575e069162f1fbffeac, limb1: 0x70a494b054c8efcb93da1757, limb2: 0x47f9c06eaaca8c969afabd71, limb3: 0x161220a792413bbe47629580, }, r1a0: u384 { limb0: 0xdcd325a8ba5cef5390f5d151, limb1: 0xcdc42d134b74aa1a5062ce50, limb2: 0x60be437e1aa4a9878448da68, limb3: 0x3afadaca8a96f634f1a416c, }, r1a1: u384 { limb0: 0x2a305361b67f6592fa2a5b23, limb1: 0x60950369afb1c2180ac6372, limb2: 0x18abd84df73559c2ec121d5d, limb3: 0x30f5ef160b1fd967f8015ab, }, }, G2Line { r0a0: u384 { limb0: 0x57e9ad17c997b15ffbad6d82, limb1: 0xb58a8d3786323d96d83553ef, limb2: 0x7ebd9eee07a5e594ba52aa95, limb3: 0x111e440bd97eda09284f64eb, }, r0a1: u384 { limb0: 0xd3b88ae51c3481402eba34a1, limb1: 0x2d45a1eeba9f7b3b15c0f834, limb2: 0xf01e42935934d35517d5917f, limb3: 0x17873198e39dea6b3fe5129f, }, r1a0: u384 { limb0: 0x2f6c420e2c5b378a9412c0d0, limb1: 0x955d38483a2f278270b22268, limb2: 0x51a730b71b201f7aae89b10b, limb3: 0x1085c28c787add8dcd06245a, }, r1a1: u384 { limb0: 0x6e0644b1126aa50e5b4773e6, limb1: 0xdcbb3ddbc7340820e35af7a2, limb2: 0x92c56f71378f46d9681bc464, limb3: 0x14e782a8eeff9d9dd580cc4, }, }, G2Line { r0a0: u384 { limb0: 0x57e9ad17c997b15ffbad6d82, limb1: 0xb58a8d3786323d96d83553ef, limb2: 0x7ebd9eee07a5e594ba52aa95, limb3: 0x111e440bd97eda09284f64eb, }, r0a1: u384 { limb0: 0xd3b88ae51c3481402eba34a1, limb1: 0x2d45a1eeba9f7b3b15c0f834, limb2: 0xf01e42935934d35517d5917f, limb3: 0x17873198e39dea6b3fe5129f, }, r1a0: u384 { limb0: 0x2f6c420e2c5b378a9412c0d0, limb1: 0x955d38483a2f278270b22268, limb2: 0x51a730b71b201f7aae89b10b, limb3: 0x1085c28c787add8dcd06245a, }, r1a1: u384 { limb0: 0x6e0644b1126aa50e5b4773e6, limb1: 0xdcbb3ddbc7340820e35af7a2, limb2: 0x92c56f71378f46d9681bc464, limb3: 0x14e782a8eeff9d9dd580cc4, }, }, G2Line { r0a0: u384 { limb0: 0xa17319d2ed4a91226b6d3089, limb1: 0x1d8f224ab570fde86c7f2048, limb2: 0xd622960850d94ec99de711af, limb3: 0x124395d2fa862d11c431fefa, }, r0a1: u384 { limb0: 0x6ddb45f997e48b97942d9c3f, limb1: 0x3d8b7f429593a772eb589e3a, limb2: 0xbd411a9a2e3bafe120332263, limb3: 0x4ae24dd579f310ebebb670a, }, r1a0: u384 { limb0: 0x700c5258e540544c8801a1d2, limb1: 0x40032ac207f46794aacd4702, limb2: 0x664658ab49940041c676ae29, limb3: 0xbba2393a3187f3acdec0862, }, r1a1: u384 { limb0: 0x1fb806ee192d153b8c48f37f, limb1: 0xd8d017e6d2d0a8aade0c5570, limb2: 0x8e857d4ca13adcefbf7a644c, limb3: 0x5eeb6818a540c068177383c, }, }, G2Line { r0a0: u384 { limb0: 0xa17319d2ed4a91226b6d3089, limb1: 0x1d8f224ab570fde86c7f2048, limb2: 0xd622960850d94ec99de711af, limb3: 0x124395d2fa862d11c431fefa, }, r0a1: u384 { limb0: 0x6ddb45f997e48b97942d9c3f, limb1: 0x3d8b7f429593a772eb589e3a, limb2: 0xbd411a9a2e3bafe120332263, limb3: 0x4ae24dd579f310ebebb670a, }, r1a0: u384 { limb0: 0x700c5258e540544c8801a1d2, limb1: 0x40032ac207f46794aacd4702, limb2: 0x664658ab49940041c676ae29, limb3: 0xbba2393a3187f3acdec0862, }, r1a1: u384 { limb0: 0x1fb806ee192d153b8c48f37f, limb1: 0xd8d017e6d2d0a8aade0c5570, limb2: 0x8e857d4ca13adcefbf7a644c, limb3: 0x5eeb6818a540c068177383c, }, }, G2Line { r0a0: u384 { limb0: 0x7ad0e4fa558ef8b11384085e, limb1: 0x4329afaeac994168fe5e0cd7, limb2: 0xb34e8702ef6b72f9a6008fa, limb3: 0x99d918594ec79185a3f5298, }, r0a1: u384 { limb0: 0xbf74c3bbc5fa4f115e66c539, limb1: 0x7da649aab4c450a071647d9d, limb2: 0x3de1249ed9c917ba907ae87e, limb3: 0x17fb63a54ba4b99d958c47f5, }, r1a0: u384 { limb0: 0x29a111bd2ddf9b91308af11b, limb1: 0xc6f5fc9404a96ca03bae4905, limb2: 0x4cf974b0c052477bbda2b847, limb3: 0x1825483020fd8780c86b1015, }, r1a1: u384 { limb0: 0xbc7ecc69f7efad3e70b125e4, limb1: 0x91fecbb081beb006bf85d061, limb2: 0xc0eb86316968cc75b5960f2b, limb3: 0xe38ff44ac8be45215c49ab0, }, }, G2Line { r0a0: u384 { limb0: 0x7ad0e4fa558ef8b11384085e, limb1: 0x4329afaeac994168fe5e0cd7, limb2: 0xb34e8702ef6b72f9a6008fa, limb3: 0x99d918594ec79185a3f5298, }, r0a1: u384 { limb0: 0xbf74c3bbc5fa4f115e66c539, limb1: 0x7da649aab4c450a071647d9d, limb2: 0x3de1249ed9c917ba907ae87e, limb3: 0x17fb63a54ba4b99d958c47f5, }, r1a0: u384 { limb0: 0x29a111bd2ddf9b91308af11b, limb1: 0xc6f5fc9404a96ca03bae4905, limb2: 0x4cf974b0c052477bbda2b847, limb3: 0x1825483020fd8780c86b1015, }, r1a1: u384 { limb0: 0xbc7ecc69f7efad3e70b125e4, limb1: 0x91fecbb081beb006bf85d061, limb2: 0xc0eb86316968cc75b5960f2b, limb3: 0xe38ff44ac8be45215c49ab0, }, }, G2Line { r0a0: u384 { limb0: 0xceb6d3ab08b373dc22ba995f, limb1: 0x43d108be275c4c77ddb43e08, limb2: 0xe516383196fb48b7d3febb1d, limb3: 0xe4c3290d4c9ba0a816475d3, }, r0a1: u384 { limb0: 0xd1fc69b97fb0e00d2934ae95, limb1: 0xfc2f8a30bfd324e8dba3d887, limb2: 0x160584b561794cc64271dc15, limb3: 0x1009e338dbc724df50993a65, }, r1a0: u384 { limb0: 0x475f046f42faf48c326b4bf1, limb1: 0xb713074989c0643fceb94c0f, limb2: 0xe26638cb83c9c26a954a45d9, limb3: 0x1754c6aae904e4e80cd79f52, }, r1a1: u384 { limb0: 0xd7db51e3579f8a30ee0b70aa, limb1: 0x25e0748f0cfe2d0aa5c0c8a0, limb2: 0x6d0c3361c1683f7dc395ddf0, limb3: 0x1348bfc584e6abb75e34a3a6, }, }, G2Line { r0a0: u384 { limb0: 0xceb6d3ab08b373dc22ba995f, limb1: 0x43d108be275c4c77ddb43e08, limb2: 0xe516383196fb48b7d3febb1d, limb3: 0xe4c3290d4c9ba0a816475d3, }, r0a1: u384 { limb0: 0xd1fc69b97fb0e00d2934ae95, limb1: 0xfc2f8a30bfd324e8dba3d887, limb2: 0x160584b561794cc64271dc15, limb3: 0x1009e338dbc724df50993a65, }, r1a0: u384 { limb0: 0x475f046f42faf48c326b4bf1, limb1: 0xb713074989c0643fceb94c0f, limb2: 0xe26638cb83c9c26a954a45d9, limb3: 0x1754c6aae904e4e80cd79f52, }, r1a1: u384 { limb0: 0xd7db51e3579f8a30ee0b70aa, limb1: 0x25e0748f0cfe2d0aa5c0c8a0, limb2: 0x6d0c3361c1683f7dc395ddf0, limb3: 0x1348bfc584e6abb75e34a3a6, }, }, G2Line { r0a0: u384 { limb0: 0xb50d817096bd5c150cd6a82b, limb1: 0x6bcc034040210fda6c8b4cff, limb2: 0x9be137b6cb13d4ebe5a30e0e, limb3: 0x84b37e667ea19363ed3ffd0, }, r0a1: u384 { limb0: 0x11c9654f31306495f8e6bc94, limb1: 0xba6a2171d247ebe2b0f7f696, limb2: 0xa6d4bf1963b95bcfb7c93d93, limb3: 0x15ac996599cf39209a84ea5a, }, r1a0: u384 { limb0: 0x8d27e960a12b8ec9372cca66, limb1: 0xaaba63010526c24d3c2840b7, limb2: 0xaa25dc5b42e3ed60c93463ce, limb3: 0x7fe44d4a1e4791800b1e0fa, }, r1a1: u384 { limb0: 0xfc3e99620792c110703978d5, limb1: 0xf4db1062eef1c755a07fbde6, limb2: 0xf570179ead4983a489316019, limb3: 0x46aaa91f573494bb66d079, }, }, G2Line { r0a0: u384 { limb0: 0xb50d817096bd5c150cd6a82b, limb1: 0x6bcc034040210fda6c8b4cff, limb2: 0x9be137b6cb13d4ebe5a30e0e, limb3: 0x84b37e667ea19363ed3ffd0, }, r0a1: u384 { limb0: 0x11c9654f31306495f8e6bc94, limb1: 0xba6a2171d247ebe2b0f7f696, limb2: 0xa6d4bf1963b95bcfb7c93d93, limb3: 0x15ac996599cf39209a84ea5a, }, r1a0: u384 { limb0: 0x8d27e960a12b8ec9372cca66, limb1: 0xaaba63010526c24d3c2840b7, limb2: 0xaa25dc5b42e3ed60c93463ce, limb3: 0x7fe44d4a1e4791800b1e0fa, }, r1a1: u384 { limb0: 0xfc3e99620792c110703978d5, limb1: 0xf4db1062eef1c755a07fbde6, limb2: 0xf570179ead4983a489316019, limb3: 0x46aaa91f573494bb66d079, }, }, G2Line { r0a0: u384 { limb0: 0xe9f685c65bd9792c8adee32, limb1: 0xecc42b0c513df20e80dfcb0c, limb2: 0xf97767f63bec29912643b18c, limb3: 0x658e5d9dd13b65d9d50e485, }, r0a1: u384 { limb0: 0xd80080e976138f1d433aee10, limb1: 0xd60db98a0a46712bf28de887, limb2: 0x9ec4a90a9b07bdfb9a8f9cac, limb3: 0x1269ede044c4c6361453dbd4, }, r1a0: u384 { limb0: 0x33266d196827c62d12d911f5, limb1: 0x3273f6ca8f6ac372356ac475, limb2: 0x3dbd80e6d1898f8e7cefbbd8, limb3: 0x17b88f8e9c438e00a591eb3, }, r1a1: u384 { limb0: 0x6bf73b94433c19c358c705da, limb1: 0xa52a6f1848089194d82c9450, limb2: 0x41a0fcd2736929e504cab889, limb3: 0xe660555872f31d5085b6c20, }, }, G2Line { r0a0: u384 { limb0: 0xe9f685c65bd9792c8adee32, limb1: 0xecc42b0c513df20e80dfcb0c, limb2: 0xf97767f63bec29912643b18c, limb3: 0x658e5d9dd13b65d9d50e485, }, r0a1: u384 { limb0: 0xd80080e976138f1d433aee10, limb1: 0xd60db98a0a46712bf28de887, limb2: 0x9ec4a90a9b07bdfb9a8f9cac, limb3: 0x1269ede044c4c6361453dbd4, }, r1a0: u384 { limb0: 0x33266d196827c62d12d911f5, limb1: 0x3273f6ca8f6ac372356ac475, limb2: 0x3dbd80e6d1898f8e7cefbbd8, limb3: 0x17b88f8e9c438e00a591eb3, }, r1a1: u384 { limb0: 0x6bf73b94433c19c358c705da, limb1: 0xa52a6f1848089194d82c9450, limb2: 0x41a0fcd2736929e504cab889, limb3: 0xe660555872f31d5085b6c20, }, }, G2Line { r0a0: u384 { limb0: 0xade8d05561fb99ceb1b398dc, limb1: 0x9e365afb0af81213414cfaf7, limb2: 0x7f77a69390559e530043141a, limb3: 0xc209c5c88e6c6f2b043351b, }, r0a1: u384 { limb0: 0x7565700ffe842d640fc1ead7, limb1: 0xd7a72ca686ca6e365e66674f, limb2: 0x74d23c8889d674ed594cdeba, limb3: 0x3b785972f83859804ba7b9f, }, r1a0: u384 { limb0: 0x6762e6916c0e2c81f7508214, limb1: 0xd0d08610571c6228f47f1451, limb2: 0x81ec1b03edd35c515bf8d1cd, limb3: 0x41a7141598d94d8d557ea13, }, r1a1: u384 { limb0: 0xc76846d9fc76bba55279cd97, limb1: 0xf475886e2b2e07119618d34c, limb2: 0x7cbf7dfaa9bdf3f6b1b6add8, limb3: 0xe697b86b1a1a256ea1fc7bd, }, }, G2Line { r0a0: u384 { limb0: 0xade8d05561fb99ceb1b398dc, limb1: 0x9e365afb0af81213414cfaf7, limb2: 0x7f77a69390559e530043141a, limb3: 0xc209c5c88e6c6f2b043351b, }, r0a1: u384 { limb0: 0x7565700ffe842d640fc1ead7, limb1: 0xd7a72ca686ca6e365e66674f, limb2: 0x74d23c8889d674ed594cdeba, limb3: 0x3b785972f83859804ba7b9f, }, r1a0: u384 { limb0: 0x6762e6916c0e2c81f7508214, limb1: 0xd0d08610571c6228f47f1451, limb2: 0x81ec1b03edd35c515bf8d1cd, limb3: 0x41a7141598d94d8d557ea13, }, r1a1: u384 { limb0: 0xc76846d9fc76bba55279cd97, limb1: 0xf475886e2b2e07119618d34c, limb2: 0x7cbf7dfaa9bdf3f6b1b6add8, limb3: 0xe697b86b1a1a256ea1fc7bd, }, }, G2Line { r0a0: u384 { limb0: 0x3e2bda3bb882029aa8c68c07, limb1: 0xa0a7e087ad38e14e08cef273, limb2: 0x5808f126af4a19c3133f879a, limb3: 0x19bd29ab402e8d268fcb24d2, }, r0a1: u384 { limb0: 0xcd0ea0d4ee5a1532a9730806, limb1: 0x7845796a605b0f7861d95340, limb2: 0x89ef8948802539a10a58b812, limb3: 0x1053849b92ac68c309e109c1, }, r1a0: u384 { limb0: 0xa3815eaa263de8563f27a5a9, limb1: 0xde94b962e70316398ed6dca9, limb2: 0xa87f14f61a4ac2b9e62df692, limb3: 0x252bb6ddefddda543bb5ffd, }, r1a1: u384 { limb0: 0x60d60e0da595356015916692, limb1: 0x4b828f50f32b12b44b33e235, limb2: 0x769ed0c50fe7fa25ffdc245a, limb3: 0x6e387748806b8214f1b79e3, }, }, G2Line { r0a0: u384 { limb0: 0x3e2bda3bb882029aa8c68c07, limb1: 0xa0a7e087ad38e14e08cef273, limb2: 0x5808f126af4a19c3133f879a, limb3: 0x19bd29ab402e8d268fcb24d2, }, r0a1: u384 { limb0: 0xcd0ea0d4ee5a1532a9730806, limb1: 0x7845796a605b0f7861d95340, limb2: 0x89ef8948802539a10a58b812, limb3: 0x1053849b92ac68c309e109c1, }, r1a0: u384 { limb0: 0xa3815eaa263de8563f27a5a9, limb1: 0xde94b962e70316398ed6dca9, limb2: 0xa87f14f61a4ac2b9e62df692, limb3: 0x252bb6ddefddda543bb5ffd, }, r1a1: u384 { limb0: 0x60d60e0da595356015916692, limb1: 0x4b828f50f32b12b44b33e235, limb2: 0x769ed0c50fe7fa25ffdc245a, limb3: 0x6e387748806b8214f1b79e3, }, }, G2Line { r0a0: u384 { limb0: 0xfd057da0cb173025ce2f998a, limb1: 0x9e4d6149a2fc05606e592731, limb2: 0x8b1847b9941797009134cfa1, limb3: 0x18da833da14d6db1d7986937, }, r0a1: u384 { limb0: 0x5eb7e3f27b2ab2f1c56f91cb, limb1: 0x3b6645812dc68a27333141f2, limb2: 0xfb06e0ba9a36c40cbd2837b9, limb3: 0xb998d9cd4e1fdb1c7673a4d, }, r1a0: u384 { limb0: 0xea6b77d2854c6efa8751c13, limb1: 0x2a8bc25dab4cbfb0083ad510, limb2: 0xc394a4e0f3acd2aa2f2e5029, limb3: 0x4737c2c084ac35ec59d139d, }, r1a1: u384 { limb0: 0xaff0146957bcf99d6005201c, limb1: 0x5cc5e1fb8259ea6e5ffe87dc, limb2: 0xd9372a44e3423a7331ac2435, limb3: 0x15d0e555bcdc0d8d48cad595, }, }, G2Line { r0a0: u384 { limb0: 0xfd057da0cb173025ce2f998a, limb1: 0x9e4d6149a2fc05606e592731, limb2: 0x8b1847b9941797009134cfa1, limb3: 0x18da833da14d6db1d7986937, }, r0a1: u384 { limb0: 0x5eb7e3f27b2ab2f1c56f91cb, limb1: 0x3b6645812dc68a27333141f2, limb2: 0xfb06e0ba9a36c40cbd2837b9, limb3: 0xb998d9cd4e1fdb1c7673a4d, }, r1a0: u384 { limb0: 0xea6b77d2854c6efa8751c13, limb1: 0x2a8bc25dab4cbfb0083ad510, limb2: 0xc394a4e0f3acd2aa2f2e5029, limb3: 0x4737c2c084ac35ec59d139d, }, r1a1: u384 { limb0: 0xaff0146957bcf99d6005201c, limb1: 0x5cc5e1fb8259ea6e5ffe87dc, limb2: 0xd9372a44e3423a7331ac2435, limb3: 0x15d0e555bcdc0d8d48cad595, }, }, G2Line { r0a0: u384 { limb0: 0x828425fca9d6cd76f222c299, limb1: 0x2b0db667ad7776a32372e139, limb2: 0x7ff7fb851413603a6f0d2fef, limb3: 0x166c41ed7430420750164f1a, }, r0a1: u384 { limb0: 0xe3788c1577b092a1a89686b2, limb1: 0x5fdf8356c68add3572e76a25, limb2: 0x37115b7994287a9b345dd0ed, limb3: 0xffcc588c7d1b96c86dc3aaf, }, r1a0: u384 { limb0: 0xbc7e65f493e052b119a9c84f, limb1: 0x11aa017bcbfc878c46a18c52, limb2: 0xa65af0bdbf93483836c11b4d, limb3: 0xd2f8087436fff404d7e6bc, }, r1a1: u384 { limb0: 0xc171d5e78129decdde583c1f, limb1: 0x300b7521c43311b00cb16b80, limb2: 0xbccbe679495d33a3fcb98e54, limb3: 0x13fe5206e449d407a961a9d0, }, }, G2Line { r0a0: u384 { limb0: 0x828425fca9d6cd76f222c299, limb1: 0x2b0db667ad7776a32372e139, limb2: 0x7ff7fb851413603a6f0d2fef, limb3: 0x166c41ed7430420750164f1a, }, r0a1: u384 { limb0: 0xe3788c1577b092a1a89686b2, limb1: 0x5fdf8356c68add3572e76a25, limb2: 0x37115b7994287a9b345dd0ed, limb3: 0xffcc588c7d1b96c86dc3aaf, }, r1a0: u384 { limb0: 0xbc7e65f493e052b119a9c84f, limb1: 0x11aa017bcbfc878c46a18c52, limb2: 0xa65af0bdbf93483836c11b4d, limb3: 0xd2f8087436fff404d7e6bc, }, r1a1: u384 { limb0: 0xc171d5e78129decdde583c1f, limb1: 0x300b7521c43311b00cb16b80, limb2: 0xbccbe679495d33a3fcb98e54, limb3: 0x13fe5206e449d407a961a9d0, }, }, G2Line { r0a0: u384 { limb0: 0xe075c3e46497811318f1aafc, limb1: 0xc9ee6637a1f378458c67a6a2, limb2: 0x584f8f6bff2beb100c77bbaa, limb3: 0xcabbaeccf33edbba456b3aa, }, r0a1: u384 { limb0: 0xf15b790c2edf5b3c99fe4876, limb1: 0x875fb1351df4569cb81efb59, limb2: 0xfacb5e54e4995b34f5ea8a9d, limb3: 0x498c1832574b066e7f66b65, }, r1a0: u384 { limb0: 0xd7010c92fd3eb8bf086d7a51, limb1: 0x43899406a876ca11b6a17538, limb2: 0x3c5f51da0ddee80dbc5b343b, limb3: 0xf44ad67280e30f4d6191d23, }, r1a1: u384 { limb0: 0xb622b3289749d00b16b02f9d, limb1: 0xbc460741ba8c03787b256be9, limb2: 0x53b5ac101f741bc6ba3a412f, limb3: 0x14610dd7fe56661dc12e7017, }, }, G2Line { r0a0: u384 { limb0: 0xe075c3e46497811318f1aafc, limb1: 0xc9ee6637a1f378458c67a6a2, limb2: 0x584f8f6bff2beb100c77bbaa, limb3: 0xcabbaeccf33edbba456b3aa, }, r0a1: u384 { limb0: 0xf15b790c2edf5b3c99fe4876, limb1: 0x875fb1351df4569cb81efb59, limb2: 0xfacb5e54e4995b34f5ea8a9d, limb3: 0x498c1832574b066e7f66b65, }, r1a0: u384 { limb0: 0xd7010c92fd3eb8bf086d7a51, limb1: 0x43899406a876ca11b6a17538, limb2: 0x3c5f51da0ddee80dbc5b343b, limb3: 0xf44ad67280e30f4d6191d23, }, r1a1: u384 { limb0: 0xb622b3289749d00b16b02f9d, limb1: 0xbc460741ba8c03787b256be9, limb2: 0x53b5ac101f741bc6ba3a412f, limb3: 0x14610dd7fe56661dc12e7017, }, }, G2Line { r0a0: u384 { limb0: 0x3289f694418a3355784156cd, limb1: 0x9e5388d5b5d0a75275470869, limb2: 0x8a84b134b920014341616e0c, limb3: 0x17e7c92f7ff289ec1b0eb4a4, }, r0a1: u384 { limb0: 0xfb2bdc0a4813315c10592f30, limb1: 0xfe0a10e2cefd8e957736628b, limb2: 0x968cc921ed9abec9269b5786, limb3: 0xb36f790715d65f359921941, }, r1a0: u384 { limb0: 0xf9994278889345a5e3e525b, limb1: 0x8279eab2379884433bc2637e, limb2: 0x73d76c8ecc39d1f8cc458824, limb3: 0xd3fe945a75801d2acc3134a, }, r1a1: u384 { limb0: 0x55d20208b88794ff0fe6ff65, limb1: 0xc346b74aab2344fca9ff5c62, limb2: 0x9dde8f58210d2b715eb4384, limb3: 0x6ab0c2780fd0aadedb1ffa6, }, }, G2Line { r0a0: u384 { limb0: 0x3289f694418a3355784156cd, limb1: 0x9e5388d5b5d0a75275470869, limb2: 0x8a84b134b920014341616e0c, limb3: 0x17e7c92f7ff289ec1b0eb4a4, }, r0a1: u384 { limb0: 0xfb2bdc0a4813315c10592f30, limb1: 0xfe0a10e2cefd8e957736628b, limb2: 0x968cc921ed9abec9269b5786, limb3: 0xb36f790715d65f359921941, }, r1a0: u384 { limb0: 0xf9994278889345a5e3e525b, limb1: 0x8279eab2379884433bc2637e, limb2: 0x73d76c8ecc39d1f8cc458824, limb3: 0xd3fe945a75801d2acc3134a, }, r1a1: u384 { limb0: 0x55d20208b88794ff0fe6ff65, limb1: 0xc346b74aab2344fca9ff5c62, limb2: 0x9dde8f58210d2b715eb4384, limb3: 0x6ab0c2780fd0aadedb1ffa6, }, }, G2Line { r0a0: u384 { limb0: 0x5a3e5e1697e09425b898db66, limb1: 0xbc1396eefa2c96a1be6ba4c4, limb2: 0x94851b8964323d7c8ed145f7, limb3: 0x89a8fd1fd59927115c38ef8, }, r0a1: u384 { limb0: 0xa410a6b40708300c5ff93622, limb1: 0x9f8390f98fd525a678892dda, limb2: 0xa799373de5c454a11e12b305, limb3: 0x101747fa8b1d04dee8f363b0, }, r1a0: u384 { limb0: 0xa807f8a5b13ceb81cda82fa8, limb1: 0xb2f165c491d5c47bfe65453, limb2: 0x215cdd59a4776d378aa1dcd3, limb3: 0x19a8a47644e2d5c48fb32261, }, r1a1: u384 { limb0: 0xacb3c56efc35cb7292cd16e7, limb1: 0x290fd760f9c8ecd7cecb08dd, limb2: 0x41a779eb8cecbc69db519618, limb3: 0x185772d8ebcc6861748d643b, }, }, G2Line { r0a0: u384 { limb0: 0x5a3e5e1697e09425b898db66, limb1: 0xbc1396eefa2c96a1be6ba4c4, limb2: 0x94851b8964323d7c8ed145f7, limb3: 0x89a8fd1fd59927115c38ef8, }, r0a1: u384 { limb0: 0xa410a6b40708300c5ff93622, limb1: 0x9f8390f98fd525a678892dda, limb2: 0xa799373de5c454a11e12b305, limb3: 0x101747fa8b1d04dee8f363b0, }, r1a0: u384 { limb0: 0xa807f8a5b13ceb81cda82fa8, limb1: 0xb2f165c491d5c47bfe65453, limb2: 0x215cdd59a4776d378aa1dcd3, limb3: 0x19a8a47644e2d5c48fb32261, }, r1a1: u384 { limb0: 0xacb3c56efc35cb7292cd16e7, limb1: 0x290fd760f9c8ecd7cecb08dd, limb2: 0x41a779eb8cecbc69db519618, limb3: 0x185772d8ebcc6861748d643b, }, }, G2Line { r0a0: u384 { limb0: 0x11845c8f378370c5ea1988eb, limb1: 0x1a26c58a1b5b3e9927e386f7, limb2: 0x1614136e352ccbeb1a708bc6, limb3: 0x14b59d16f3f82c70a6dc9542, }, r0a1: u384 { limb0: 0xa6251ffb4e4ec02c6eb099d4, limb1: 0xa1486c797b3c5efa056554a9, limb2: 0x951b07cb2f028ead174faf1d, limb3: 0x16995470027165033faaff45, }, r1a0: u384 { limb0: 0x831c44b21a6d609bdeec639d, limb1: 0xe2f69c85767b04a7d61fe433, limb2: 0x9639ab56e254ed60a9ec5dc3, limb3: 0x176c34a0e3901325d8694c42, }, r1a1: u384 { limb0: 0xd41f8075420515c9666697e6, limb1: 0xf8df73883c6237c933f15eb5, limb2: 0xb1ed39ecead4669251ce42d2, limb3: 0x1bbe08120ec3b54286df6bc, }, }, G2Line { r0a0: u384 { limb0: 0x11845c8f378370c5ea1988eb, limb1: 0x1a26c58a1b5b3e9927e386f7, limb2: 0x1614136e352ccbeb1a708bc6, limb3: 0x14b59d16f3f82c70a6dc9542, }, r0a1: u384 { limb0: 0xa6251ffb4e4ec02c6eb099d4, limb1: 0xa1486c797b3c5efa056554a9, limb2: 0x951b07cb2f028ead174faf1d, limb3: 0x16995470027165033faaff45, }, r1a0: u384 { limb0: 0x831c44b21a6d609bdeec639d, limb1: 0xe2f69c85767b04a7d61fe433, limb2: 0x9639ab56e254ed60a9ec5dc3, limb3: 0x176c34a0e3901325d8694c42, }, r1a1: u384 { limb0: 0xd41f8075420515c9666697e6, limb1: 0xf8df73883c6237c933f15eb5, limb2: 0xb1ed39ecead4669251ce42d2, limb3: 0x1bbe08120ec3b54286df6bc, }, }, G2Line { r0a0: u384 { limb0: 0x3b2682846d33d1bb2910ba03, limb1: 0x6a05f306d95cf531380ee7da, limb2: 0x21435eb65c2bd413387d1df3, limb3: 0x1982379e444b697d0a073d6e, }, r0a1: u384 { limb0: 0x8bd63863d4cfeee42b281a67, limb1: 0x53c8de84ace44e226eb06d6d, limb2: 0xe55bb6fa2841cb1731cb6a13, limb3: 0x348ea88fa28ae0657275530, }, r1a0: u384 { limb0: 0xdc0ab5703b9d7522611edee2, limb1: 0xd6e26d354a07ecb4e30de6a8, limb2: 0xbb971530e7c8c7526b599c64, limb3: 0x12e92020be3b6b2a54440bb3, }, r1a1: u384 { limb0: 0x419847bd7c1f542e3a38b0ee, limb1: 0x6d81da9fd456c7699ec5a02d, limb2: 0x7bb02418a48065d4a6fbcdd0, limb3: 0x2158e75b3ad1be8adc4f2fd, }, }, G2Line { r0a0: u384 { limb0: 0x3b2682846d33d1bb2910ba03, limb1: 0x6a05f306d95cf531380ee7da, limb2: 0x21435eb65c2bd413387d1df3, limb3: 0x1982379e444b697d0a073d6e, }, r0a1: u384 { limb0: 0x8bd63863d4cfeee42b281a67, limb1: 0x53c8de84ace44e226eb06d6d, limb2: 0xe55bb6fa2841cb1731cb6a13, limb3: 0x348ea88fa28ae0657275530, }, r1a0: u384 { limb0: 0xdc0ab5703b9d7522611edee2, limb1: 0xd6e26d354a07ecb4e30de6a8, limb2: 0xbb971530e7c8c7526b599c64, limb3: 0x12e92020be3b6b2a54440bb3, }, r1a1: u384 { limb0: 0x419847bd7c1f542e3a38b0ee, limb1: 0x6d81da9fd456c7699ec5a02d, limb2: 0x7bb02418a48065d4a6fbcdd0, limb3: 0x2158e75b3ad1be8adc4f2fd, }, }, G2Line { r0a0: u384 { limb0: 0x9ed5874a93e2a5c1167bd832, limb1: 0xb42afdb134b0481e8259c82a, limb2: 0xbb060f82ea760a3b744f9fd6, limb3: 0xdaf9adced467ce2101b44a9, }, r0a1: u384 { limb0: 0x41f8b3d63ecc95fe95813c68, limb1: 0xc4b8e88e7bab1ed199210b24, limb2: 0x74c13644333ee583f9faa830, limb3: 0x893b33fb2141519964b7dd0, }, r1a0: u384 { limb0: 0x748cf4d3df15043e0ae8f99e, limb1: 0x4766d8800a6ffc614d6443ab, limb2: 0x5aee246adbf4dda2ea418cbf, limb3: 0x9bc3664485ae5aecc3971ae, }, r1a1: u384 { limb0: 0x5983d25e0767a793c41206ca, limb1: 0xde625e19387d9ffd33198b83, limb2: 0xa98eec8506c321eaaeb033aa, limb3: 0x13fb86041982c5d065bd87e9, }, }, G2Line { r0a0: u384 { limb0: 0x9ed5874a93e2a5c1167bd832, limb1: 0xb42afdb134b0481e8259c82a, limb2: 0xbb060f82ea760a3b744f9fd6, limb3: 0xdaf9adced467ce2101b44a9, }, r0a1: u384 { limb0: 0x41f8b3d63ecc95fe95813c68, limb1: 0xc4b8e88e7bab1ed199210b24, limb2: 0x74c13644333ee583f9faa830, limb3: 0x893b33fb2141519964b7dd0, }, r1a0: u384 { limb0: 0x748cf4d3df15043e0ae8f99e, limb1: 0x4766d8800a6ffc614d6443ab, limb2: 0x5aee246adbf4dda2ea418cbf, limb3: 0x9bc3664485ae5aecc3971ae, }, r1a1: u384 { limb0: 0x5983d25e0767a793c41206ca, limb1: 0xde625e19387d9ffd33198b83, limb2: 0xa98eec8506c321eaaeb033aa, limb3: 0x13fb86041982c5d065bd87e9, }, }, G2Line { r0a0: u384 { limb0: 0xf43059462494151b4ab2087e, limb1: 0x5cd28f7ec6fd9d6b4b086f39, limb2: 0x30dd2311b5bafb9250d116c1, limb3: 0xfc6edf74dff631a32fca3fa, }, r0a1: u384 { limb0: 0x22cbcd3ea9f0d0132809d8af, limb1: 0x4cb242156a7cdc2991ee9c0e, limb2: 0x1fe80337fb837a5476523f5c, limb3: 0x7f64410e73c5db773ca6b66, }, r1a0: u384 { limb0: 0x32c05aa3eaefba532df15a8, limb1: 0x7bee89a662e4138e44da3c9a, limb2: 0xc92ee59d9405d5a905cf2fdb, limb3: 0x163a2f67158e242bfbb18c52, }, r1a1: u384 { limb0: 0x55506de03a538ff69b9622a1, limb1: 0x1883fbdba6795d64f7791ed5, limb2: 0x8d52a259f76a0498bb3b877f, limb3: 0x2cff61e78b0054925baa456, }, }, G2Line { r0a0: u384 { limb0: 0xf43059462494151b4ab2087e, limb1: 0x5cd28f7ec6fd9d6b4b086f39, limb2: 0x30dd2311b5bafb9250d116c1, limb3: 0xfc6edf74dff631a32fca3fa, }, r0a1: u384 { limb0: 0x22cbcd3ea9f0d0132809d8af, limb1: 0x4cb242156a7cdc2991ee9c0e, limb2: 0x1fe80337fb837a5476523f5c, limb3: 0x7f64410e73c5db773ca6b66, }, r1a0: u384 { limb0: 0x32c05aa3eaefba532df15a8, limb1: 0x7bee89a662e4138e44da3c9a, limb2: 0xc92ee59d9405d5a905cf2fdb, limb3: 0x163a2f67158e242bfbb18c52, }, r1a1: u384 { limb0: 0x55506de03a538ff69b9622a1, limb1: 0x1883fbdba6795d64f7791ed5, limb2: 0x8d52a259f76a0498bb3b877f, limb3: 0x2cff61e78b0054925baa456, }, }, G2Line { r0a0: u384 { limb0: 0x5468cccd649f5f50828f6f59, limb1: 0x2ff2349d16035594b6932990, limb2: 0x3a5195f740987d342be92f18, limb3: 0xa20f374eb29e01db8f41902, }, r0a1: u384 { limb0: 0xd98a436aeb477edb61c5262d, limb1: 0xc89b894c7895fd21e86b51f7, limb2: 0x926eb138e4aa840edc0e677e, limb3: 0x461388814e94e8fa2a15e40, }, r1a0: u384 { limb0: 0x684e1f1e2e72619d41ad8eb7, limb1: 0xd6782445423e580f3476f9f9, limb2: 0x235a44500a9d160446a5bddc, limb3: 0xd00713abd0c5f631c36c5e6, }, r1a1: u384 { limb0: 0xf07a607d3ecf101d58fc2489, limb1: 0xcd22610bafa804a71cdce810, limb2: 0x6a02abac5a58c663011aa1f, limb3: 0x29de1350b9fa34cc4874766, }, }, G2Line { r0a0: u384 { limb0: 0x5468cccd649f5f50828f6f59, limb1: 0x2ff2349d16035594b6932990, limb2: 0x3a5195f740987d342be92f18, limb3: 0xa20f374eb29e01db8f41902, }, r0a1: u384 { limb0: 0xd98a436aeb477edb61c5262d, limb1: 0xc89b894c7895fd21e86b51f7, limb2: 0x926eb138e4aa840edc0e677e, limb3: 0x461388814e94e8fa2a15e40, }, r1a0: u384 { limb0: 0x684e1f1e2e72619d41ad8eb7, limb1: 0xd6782445423e580f3476f9f9, limb2: 0x235a44500a9d160446a5bddc, limb3: 0xd00713abd0c5f631c36c5e6, }, r1a1: u384 { limb0: 0xf07a607d3ecf101d58fc2489, limb1: 0xcd22610bafa804a71cdce810, limb2: 0x6a02abac5a58c663011aa1f, limb3: 0x29de1350b9fa34cc4874766, }, }, G2Line { r0a0: u384 { limb0: 0x4e955be131680457999a786e, limb1: 0xb8a3466d1f50dc841f50dd53, limb2: 0x75efb94692f6d5de57fc8609, limb3: 0x1550761b0b00c8008522c3d0, }, r0a1: u384 { limb0: 0xdf2281afe41938a9891e0f2, limb1: 0x7338e84c16f4c1a3141c1382, limb2: 0x7269a9e69889291d5395227a, limb3: 0x16cbd178015a8098509e1caa, }, r1a0: u384 { limb0: 0x1cef06bbd9e71d4438a5052f, limb1: 0xf045d3479ad9aa40b16601de, limb2: 0xcedb3a06e3bf3805919beac, limb3: 0x664dfb89dd2e293c30d8a80, }, r1a1: u384 { limb0: 0x80e3d05acac0a472fad04f82, limb1: 0x583269e3d734e9b15cebbc7d, limb2: 0xea7477948d00c61ec92b10b7, limb3: 0x163a27a5089d314ab8d8cf34, }, }, G2Line { r0a0: u384 { limb0: 0x4e955be131680457999a786e, limb1: 0xb8a3466d1f50dc841f50dd53, limb2: 0x75efb94692f6d5de57fc8609, limb3: 0x1550761b0b00c8008522c3d0, }, r0a1: u384 { limb0: 0xdf2281afe41938a9891e0f2, limb1: 0x7338e84c16f4c1a3141c1382, limb2: 0x7269a9e69889291d5395227a, limb3: 0x16cbd178015a8098509e1caa, }, r1a0: u384 { limb0: 0x1cef06bbd9e71d4438a5052f, limb1: 0xf045d3479ad9aa40b16601de, limb2: 0xcedb3a06e3bf3805919beac, limb3: 0x664dfb89dd2e293c30d8a80, }, r1a1: u384 { limb0: 0x80e3d05acac0a472fad04f82, limb1: 0x583269e3d734e9b15cebbc7d, limb2: 0xea7477948d00c61ec92b10b7, limb3: 0x163a27a5089d314ab8d8cf34, }, }, G2Line { r0a0: u384 { limb0: 0x7a8b2f99201cf6096d4d4b86, limb1: 0xa896e5b0f4e93d49e8a2691b, limb2: 0xd5d910d71a5706a6f897976c, limb3: 0x10913202008b672fafa4272b, }, r0a1: u384 { limb0: 0xbcabe4aba3fd969494c6f463, limb1: 0x416f6d51b78dc628bacd84c1, limb2: 0xb92836a7855f2590720a01c6, limb3: 0x19b605e839e9850b48d8ec2c, }, r1a0: u384 { limb0: 0x49620f3d26493fcd7396493b, limb1: 0x17313fc388a7ac05a8b111bb, limb2: 0x292e458d09c07af68fcfc74e, limb3: 0x3a6acacd6cbc411d7eb7947, }, r1a1: u384 { limb0: 0xd0fdcd4eeaeb1a6ecccc011b, limb1: 0x40e42fe4d7574bcb53834b69, limb2: 0x799946d2b7b28b127a821e57, limb3: 0x351c5a26dcce6ce7fca6249, }, }, G2Line { r0a0: u384 { limb0: 0x7a8b2f99201cf6096d4d4b86, limb1: 0xa896e5b0f4e93d49e8a2691b, limb2: 0xd5d910d71a5706a6f897976c, limb3: 0x10913202008b672fafa4272b, }, r0a1: u384 { limb0: 0xbcabe4aba3fd969494c6f463, limb1: 0x416f6d51b78dc628bacd84c1, limb2: 0xb92836a7855f2590720a01c6, limb3: 0x19b605e839e9850b48d8ec2c, }, r1a0: u384 { limb0: 0x49620f3d26493fcd7396493b, limb1: 0x17313fc388a7ac05a8b111bb, limb2: 0x292e458d09c07af68fcfc74e, limb3: 0x3a6acacd6cbc411d7eb7947, }, r1a1: u384 { limb0: 0xd0fdcd4eeaeb1a6ecccc011b, limb1: 0x40e42fe4d7574bcb53834b69, limb2: 0x799946d2b7b28b127a821e57, limb3: 0x351c5a26dcce6ce7fca6249, }, }, G2Line { r0a0: u384 { limb0: 0x56de0d67449950f9a27e88fa, limb1: 0xce138b184f06c8f264650446, limb2: 0x31ca7924a667107cb9380709, limb3: 0x17960cbcef34dc014292ac06, }, r0a1: u384 { limb0: 0x31295353150179142d6ddbc1, limb1: 0x2fafe4eb2df7753c10441bf, limb2: 0x403786f898262dcd349b2eb5, limb3: 0x131cc0205e7c06e7d7dfe573, }, r1a0: u384 { limb0: 0xd79406d46f1c9d7137fcc172, limb1: 0x84793aeb8b5ca9891e9a6563, limb2: 0x4b1ab7811bfafaf6dfb745fc, limb3: 0x17c50d8fcd5f550d4a2a64ae, }, r1a1: u384 { limb0: 0x5c3d7e34c90dc48a32c70868, limb1: 0x4e1b7bc28d0de9519e604184, limb2: 0xf258c4f3f3ba0baaccfac11b, limb3: 0x11ec2c0924dee1e8967b559a, }, }, G2Line { r0a0: u384 { limb0: 0x56de0d67449950f9a27e88fa, limb1: 0xce138b184f06c8f264650446, limb2: 0x31ca7924a667107cb9380709, limb3: 0x17960cbcef34dc014292ac06, }, r0a1: u384 { limb0: 0x31295353150179142d6ddbc1, limb1: 0x2fafe4eb2df7753c10441bf, limb2: 0x403786f898262dcd349b2eb5, limb3: 0x131cc0205e7c06e7d7dfe573, }, r1a0: u384 { limb0: 0xd79406d46f1c9d7137fcc172, limb1: 0x84793aeb8b5ca9891e9a6563, limb2: 0x4b1ab7811bfafaf6dfb745fc, limb3: 0x17c50d8fcd5f550d4a2a64ae, }, r1a1: u384 { limb0: 0x5c3d7e34c90dc48a32c70868, limb1: 0x4e1b7bc28d0de9519e604184, limb2: 0xf258c4f3f3ba0baaccfac11b, limb3: 0x11ec2c0924dee1e8967b559a, }, }, G2Line { r0a0: u384 { limb0: 0xe60081576a59a2679221795e, limb1: 0x99ee512fdfcd346784f34a48, limb2: 0x735b00cd677e6e1ba38c009f, limb3: 0x178d4accb6fb9b6cbf9df577, }, r0a1: u384 { limb0: 0xcd7b2447c71a9e9b8b9db98, limb1: 0x97d5028ae6c2f7027ced11b2, limb2: 0xf8ea35a3d06f6aca9cffd3b, limb3: 0xbec0ed2f513414494bd0f6d, }, r1a0: u384 { limb0: 0xca6aca5778f88316e121b6f2, limb1: 0x23c098f55746b7d1c5e168f9, limb2: 0x4be5fc4f8b81d965ec4cd861, limb3: 0x6c156b4f517a9156e82cb14, }, r1a1: u384 { limb0: 0x59e184cdff8a20200dee525d, limb1: 0x12327d5b5691bb513688bda3, limb2: 0xa653bf47392176e8a509eb6b, limb3: 0x6302b0d5f33fc6d3799728d, }, }, G2Line { r0a0: u384 { limb0: 0xe60081576a59a2679221795e, limb1: 0x99ee512fdfcd346784f34a48, limb2: 0x735b00cd677e6e1ba38c009f, limb3: 0x178d4accb6fb9b6cbf9df577, }, r0a1: u384 { limb0: 0xcd7b2447c71a9e9b8b9db98, limb1: 0x97d5028ae6c2f7027ced11b2, limb2: 0xf8ea35a3d06f6aca9cffd3b, limb3: 0xbec0ed2f513414494bd0f6d, }, r1a0: u384 { limb0: 0xca6aca5778f88316e121b6f2, limb1: 0x23c098f55746b7d1c5e168f9, limb2: 0x4be5fc4f8b81d965ec4cd861, limb3: 0x6c156b4f517a9156e82cb14, }, r1a1: u384 { limb0: 0x59e184cdff8a20200dee525d, limb1: 0x12327d5b5691bb513688bda3, limb2: 0xa653bf47392176e8a509eb6b, limb3: 0x6302b0d5f33fc6d3799728d, }, }, G2Line { r0a0: u384 { limb0: 0x8289ee9e6820add91b6e9f3c, limb1: 0x161cccd4985697fa09846edf, limb2: 0x7a16c4169c620eab78a54ae0, limb3: 0xb43112e6bf81d6bf3265d2a, }, r0a1: u384 { limb0: 0xa19c344f64ea5350f0a08f3c, limb1: 0x4b3b0b1f34d7db6b30ab1be3, limb2: 0xdd3563e987285c49a9c0ea5f, limb3: 0xa5797654377bf54d8992f94, }, r1a0: u384 { limb0: 0xa65f6f3c877ce8e73a114724, limb1: 0x5b64b753040c29a75a01e69b, limb2: 0x628c82c1c0e09f1aaab0a61, limb3: 0x1017f0dd39c644eb0e392947, }, r1a1: u384 { limb0: 0xf8a5bcf4817c937d81f315d1, limb1: 0x21f7d8e74be6d6410e62f9e1, limb2: 0xbeafe32cf1ec912b9927be97, limb3: 0x1074d4a9995442048f5dc552, }, }, G2Line { r0a0: u384 { limb0: 0x8289ee9e6820add91b6e9f3c, limb1: 0x161cccd4985697fa09846edf, limb2: 0x7a16c4169c620eab78a54ae0, limb3: 0xb43112e6bf81d6bf3265d2a, }, r0a1: u384 { limb0: 0xa19c344f64ea5350f0a08f3c, limb1: 0x4b3b0b1f34d7db6b30ab1be3, limb2: 0xdd3563e987285c49a9c0ea5f, limb3: 0xa5797654377bf54d8992f94, }, r1a0: u384 { limb0: 0xa65f6f3c877ce8e73a114724, limb1: 0x5b64b753040c29a75a01e69b, limb2: 0x628c82c1c0e09f1aaab0a61, limb3: 0x1017f0dd39c644eb0e392947, }, r1a1: u384 { limb0: 0xf8a5bcf4817c937d81f315d1, limb1: 0x21f7d8e74be6d6410e62f9e1, limb2: 0xbeafe32cf1ec912b9927be97, limb3: 0x1074d4a9995442048f5dc552, }, }, G2Line { r0a0: u384 { limb0: 0xf5f0bc431d8e3c80c9af43ec, limb1: 0xe1bfd26afc9cc39a0566ce43, limb2: 0x56e0dd02d42fee35ff65330b, limb3: 0xcb5a49bf5f851b8dfe3526c, }, r0a1: u384 { limb0: 0x1b9c89ae090424c785c6201e, limb1: 0x9aa7a9da8db576af296e542a, limb2: 0xf2e8447430a25ab638a55680, limb3: 0xa10904e10bf2511e4345039, }, r1a0: u384 { limb0: 0x71a9bbb204d330d58a16fddc, limb1: 0xc0b0adcf1611ff894f97933e, limb2: 0x835a3a6abbb86ab551ceb573, limb3: 0x634ccea2a60cdbd34c941c1, }, r1a1: u384 { limb0: 0xb5ff392b31c0d3eaba4cd272, limb1: 0x160f3e778181730bdfd887c7, limb2: 0xea813bbe8c520a16b1e7a2c3, limb3: 0x14d73adeb7fdf6a4a22c9ffd, }, }, G2Line { r0a0: u384 { limb0: 0xf5f0bc431d8e3c80c9af43ec, limb1: 0xe1bfd26afc9cc39a0566ce43, limb2: 0x56e0dd02d42fee35ff65330b, limb3: 0xcb5a49bf5f851b8dfe3526c, }, r0a1: u384 { limb0: 0x1b9c89ae090424c785c6201e, limb1: 0x9aa7a9da8db576af296e542a, limb2: 0xf2e8447430a25ab638a55680, limb3: 0xa10904e10bf2511e4345039, }, r1a0: u384 { limb0: 0x71a9bbb204d330d58a16fddc, limb1: 0xc0b0adcf1611ff894f97933e, limb2: 0x835a3a6abbb86ab551ceb573, limb3: 0x634ccea2a60cdbd34c941c1, }, r1a1: u384 { limb0: 0xb5ff392b31c0d3eaba4cd272, limb1: 0x160f3e778181730bdfd887c7, limb2: 0xea813bbe8c520a16b1e7a2c3, limb3: 0x14d73adeb7fdf6a4a22c9ffd, }, }, G2Line { r0a0: u384 { limb0: 0xe99af5be34cdf3b6cd722b90, limb1: 0x43bcb5a3050d0fc3f1656016, limb2: 0xd9565b1e5e510b6264471bfa, limb3: 0x12ee7303ded06b9853cbddbe, }, r0a1: u384 { limb0: 0x640c586fa840c267f3b5d99, limb1: 0x9584c14b56c506ef287a149c, limb2: 0x317fe0a92bd878e9d86b616d, limb3: 0x12c415a497b04dbe9c645460, }, r1a0: u384 { limb0: 0x3b85dd33ea6b3619236bb988, limb1: 0x7ce7ce7d9b2c5af2cc87a08a, limb2: 0x677951177d5a61f6d3531b7b, limb3: 0x188a8c03315728f1526806d2, }, r1a1: u384 { limb0: 0xa585bcb857e792c9af8ddec8, limb1: 0x78f2e972ccd3af64b49ff79b, limb2: 0x10be9acf81fad9cf48dc3e12, limb3: 0x11a11578232a8dd660eaf5b6, }, }, G2Line { r0a0: u384 { limb0: 0xe99af5be34cdf3b6cd722b90, limb1: 0x43bcb5a3050d0fc3f1656016, limb2: 0xd9565b1e5e510b6264471bfa, limb3: 0x12ee7303ded06b9853cbddbe, }, r0a1: u384 { limb0: 0x640c586fa840c267f3b5d99, limb1: 0x9584c14b56c506ef287a149c, limb2: 0x317fe0a92bd878e9d86b616d, limb3: 0x12c415a497b04dbe9c645460, }, r1a0: u384 { limb0: 0x3b85dd33ea6b3619236bb988, limb1: 0x7ce7ce7d9b2c5af2cc87a08a, limb2: 0x677951177d5a61f6d3531b7b, limb3: 0x188a8c03315728f1526806d2, }, r1a1: u384 { limb0: 0xa585bcb857e792c9af8ddec8, limb1: 0x78f2e972ccd3af64b49ff79b, limb2: 0x10be9acf81fad9cf48dc3e12, limb3: 0x11a11578232a8dd660eaf5b6, }, }, G2Line { r0a0: u384 { limb0: 0xc7c0d285262c1b32ca6bc7c3, limb1: 0x66824fd1b6de7089b82d478a, limb2: 0x5e4beb5c4833b2e8f008208a, limb3: 0x11c059b33ca3f500c11ee495, }, r0a1: u384 { limb0: 0x66e0f227a61baa52b945ec8a, limb1: 0x6906fbc82d5fd92075ef1513, limb2: 0x55d0fec8a6600cb65d06bdb3, limb3: 0x179aabda1a2af5b5e7777d9a, }, r1a0: u384 { limb0: 0xcb7dee20a686dcfcda3ddff8, limb1: 0xfb1119a7914a33be6cb2a22d, limb2: 0xda5c49c13a9c6084ad1ca51d, limb3: 0x105195896eb7f46d1ac77d49, }, r1a1: u384 { limb0: 0xe1ae9ed15c3335b8f8b45b63, limb1: 0xd7d2b2b828960267ff16d106, limb2: 0x5fb6174880cb32afa5171325, limb3: 0x73634ad3a80542b79db8125, }, }, G2Line { r0a0: u384 { limb0: 0xc7c0d285262c1b32ca6bc7c3, limb1: 0x66824fd1b6de7089b82d478a, limb2: 0x5e4beb5c4833b2e8f008208a, limb3: 0x11c059b33ca3f500c11ee495, }, r0a1: u384 { limb0: 0x66e0f227a61baa52b945ec8a, limb1: 0x6906fbc82d5fd92075ef1513, limb2: 0x55d0fec8a6600cb65d06bdb3, limb3: 0x179aabda1a2af5b5e7777d9a, }, r1a0: u384 { limb0: 0xcb7dee20a686dcfcda3ddff8, limb1: 0xfb1119a7914a33be6cb2a22d, limb2: 0xda5c49c13a9c6084ad1ca51d, limb3: 0x105195896eb7f46d1ac77d49, }, r1a1: u384 { limb0: 0xe1ae9ed15c3335b8f8b45b63, limb1: 0xd7d2b2b828960267ff16d106, limb2: 0x5fb6174880cb32afa5171325, limb3: 0x73634ad3a80542b79db8125, }, }, G2Line { r0a0: u384 { limb0: 0x7f6dc6043db1a0981ac8da53, limb1: 0x3faeabcc298b965b8d17dcdc, limb2: 0x41f566c0fb60863429f76f85, limb3: 0xcb0b6d856433854a3196109, }, r0a1: u384 { limb0: 0xffba8b95da973789308c3dc5, limb1: 0xbd1b17fcc64e96fca67718a8, limb2: 0xba92704a60c4841667b06ceb, limb3: 0xa0b2c0bbf592c14ec7e5fb, }, r1a0: u384 { limb0: 0x92beda1eba9dc43fc36a6079, limb1: 0x91bbd7dad0ab28fca77a03a0, limb2: 0x44f752b68348b2e3a24d3786, limb3: 0x43b6a504a9015e8b46e81f4, }, r1a1: u384 { limb0: 0xc907c48da1cd91064530e901, limb1: 0xe87af685a6b1fb6ad930fc15, limb2: 0x4a5990c65cd9027b2c676e6e, limb3: 0x11cde272cfa72574425da27, }, }, G2Line { r0a0: u384 { limb0: 0x7f6dc6043db1a0981ac8da53, limb1: 0x3faeabcc298b965b8d17dcdc, limb2: 0x41f566c0fb60863429f76f85, limb3: 0xcb0b6d856433854a3196109, }, r0a1: u384 { limb0: 0xffba8b95da973789308c3dc5, limb1: 0xbd1b17fcc64e96fca67718a8, limb2: 0xba92704a60c4841667b06ceb, limb3: 0xa0b2c0bbf592c14ec7e5fb, }, r1a0: u384 { limb0: 0x92beda1eba9dc43fc36a6079, limb1: 0x91bbd7dad0ab28fca77a03a0, limb2: 0x44f752b68348b2e3a24d3786, limb3: 0x43b6a504a9015e8b46e81f4, }, r1a1: u384 { limb0: 0xc907c48da1cd91064530e901, limb1: 0xe87af685a6b1fb6ad930fc15, limb2: 0x4a5990c65cd9027b2c676e6e, limb3: 0x11cde272cfa72574425da27, }, }, G2Line { r0a0: u384 { limb0: 0xdaf1249cec25e1591d0f9329, limb1: 0x5531582b2fcbc58c12130411, limb2: 0xd5683ab0df6813a370dced9d, limb3: 0x16c61ae7af165d87be0cc2d5, }, r0a1: u384 { limb0: 0xb1c04d8f03fb3b2344ac4be5, limb1: 0xb587962043ba3348ccce1f0f, limb2: 0x5dd0fb61f2bcee0210d0af13, limb3: 0x17804c1f2c60a8a7264b6047, }, r1a0: u384 { limb0: 0xbb63ccb83f7ed4931470b669, limb1: 0x7fd71cdcbf8b588e2169e56, limb2: 0x497e41bd5035df06befd3d7e, limb3: 0x1106425b52985ab1472f75a9, }, r1a1: u384 { limb0: 0xf6dcb781ff977354cbaeca11, limb1: 0x69d27ee516fa1a11f4b63914, limb2: 0x9c9d283771507f24855df134, limb3: 0xf2cfee6977693a3f2b5332c, }, }, G2Line { r0a0: u384 { limb0: 0xdaf1249cec25e1591d0f9329, limb1: 0x5531582b2fcbc58c12130411, limb2: 0xd5683ab0df6813a370dced9d, limb3: 0x16c61ae7af165d87be0cc2d5, }, r0a1: u384 { limb0: 0xb1c04d8f03fb3b2344ac4be5, limb1: 0xb587962043ba3348ccce1f0f, limb2: 0x5dd0fb61f2bcee0210d0af13, limb3: 0x17804c1f2c60a8a7264b6047, }, r1a0: u384 { limb0: 0xbb63ccb83f7ed4931470b669, limb1: 0x7fd71cdcbf8b588e2169e56, limb2: 0x497e41bd5035df06befd3d7e, limb3: 0x1106425b52985ab1472f75a9, }, r1a1: u384 { limb0: 0xf6dcb781ff977354cbaeca11, limb1: 0x69d27ee516fa1a11f4b63914, limb2: 0x9c9d283771507f24855df134, limb3: 0xf2cfee6977693a3f2b5332c, }, }, G2Line { r0a0: u384 { limb0: 0x565aac3d5efc089a31139283, limb1: 0x4272752a854538f0b555ac04, limb2: 0x86a5055ded31515c6ec89ebc, limb3: 0x110c5f73e6b0b5c68282aa1a, }, r0a1: u384 { limb0: 0x6eb8fad61d6a608c85cf557f, limb1: 0x2f27ec0ec22fc4a9d189e192, limb2: 0xcce849442e970449a41aee87, limb3: 0x3388dc06a8286446a95bb74, }, r1a0: u384 { limb0: 0x29822e7214d3ae3a1eaf0881, limb1: 0xb04e459e8d569063d2f1ff84, limb2: 0x61aa79235620ec5c6168cd13, limb3: 0xdb46da5506f25a0ddd9d25e, }, r1a1: u384 { limb0: 0x4004047d6627ef4e8a047aeb, limb1: 0x73a8ed1ba044e04a43a99564, limb2: 0x664eedf108865fac5ebba6e1, limb3: 0xe6e3025f09bb9df597b5128, }, }, G2Line { r0a0: u384 { limb0: 0x6acae548b9042589a17cc95f, limb1: 0x217f1e1c11c3011715774d4d, limb2: 0x11a9fb5766b39d430b1c15d0, limb3: 0xe612d859df24842ce33c9d6, }, r0a1: u384 { limb0: 0x599285819346fb9c3c28793d, limb1: 0x4d0d0826c6e08cf5059cdc19, limb2: 0xf39b4a96ce83040bf10716ac, limb3: 0xd5c0c7d757310fec39173c7, }, r1a0: u384 { limb0: 0x473dcb1b1a73099f9b3d95d2, limb1: 0x7a7ef1c6db2665dfba32be7b, limb2: 0xccb92790901c2f7ceb7fd861, limb3: 0x1015a3839453343c9b0cbc45, }, r1a1: u384 { limb0: 0x12d333d5723a566d13e3b9ab, limb1: 0xf96f0e52139baea4bbd3f509, limb2: 0xf775f6c4aa01956effc7bac1, limb3: 0x14f9ac263962844d5d7bfd58, }, }, G2Line { r0a0: u384 { limb0: 0x565aac3d5efc089a31139283, limb1: 0x4272752a854538f0b555ac04, limb2: 0x86a5055ded31515c6ec89ebc, limb3: 0x110c5f73e6b0b5c68282aa1a, }, r0a1: u384 { limb0: 0x6eb8fad61d6a608c85cf557f, limb1: 0x2f27ec0ec22fc4a9d189e192, limb2: 0xcce849442e970449a41aee87, limb3: 0x3388dc06a8286446a95bb74, }, r1a0: u384 { limb0: 0x29822e7214d3ae3a1eaf0881, limb1: 0xb04e459e8d569063d2f1ff84, limb2: 0x61aa79235620ec5c6168cd13, limb3: 0xdb46da5506f25a0ddd9d25e, }, r1a1: u384 { limb0: 0x4004047d6627ef4e8a047aeb, limb1: 0x73a8ed1ba044e04a43a99564, limb2: 0x664eedf108865fac5ebba6e1, limb3: 0xe6e3025f09bb9df597b5128, }, }, G2Line { r0a0: u384 { limb0: 0x6acae548b9042589a17cc95f, limb1: 0x217f1e1c11c3011715774d4d, limb2: 0x11a9fb5766b39d430b1c15d0, limb3: 0xe612d859df24842ce33c9d6, }, r0a1: u384 { limb0: 0x599285819346fb9c3c28793d, limb1: 0x4d0d0826c6e08cf5059cdc19, limb2: 0xf39b4a96ce83040bf10716ac, limb3: 0xd5c0c7d757310fec39173c7, }, r1a0: u384 { limb0: 0x473dcb1b1a73099f9b3d95d2, limb1: 0x7a7ef1c6db2665dfba32be7b, limb2: 0xccb92790901c2f7ceb7fd861, limb3: 0x1015a3839453343c9b0cbc45, }, r1a1: u384 { limb0: 0x12d333d5723a566d13e3b9ab, limb1: 0xf96f0e52139baea4bbd3f509, limb2: 0xf775f6c4aa01956effc7bac1, limb3: 0x14f9ac263962844d5d7bfd58, }, }, G2Line { r0a0: u384 { limb0: 0x324273979b43f236c1b6d4b3, limb1: 0x6a44d55ac56823beb8c5cd4d, limb2: 0xf187e87ac0dea83abd11b631, limb3: 0xedbe290b2884e1a7816b064, }, r0a1: u384 { limb0: 0xb9c0ebcef8295a5127fabfde, limb1: 0xd8abaec351082a47e7dd0d50, limb2: 0xf7b036dd84a0f094aab5c7c, limb3: 0x14ba1a361d4fb86acc0430ff, }, r1a0: u384 { limb0: 0xd6a92564eca59a717cccc180, limb1: 0x7ec4e553b132cfe520138b91, limb2: 0x968b7ccf08d0a2377a2b5d51, limb3: 0x1486effacc4cfe9a2a925700, }, r1a1: u384 { limb0: 0xda73fa2984bbcd83191b529c, limb1: 0x3d2797caffd2a9f90addeb7d, limb2: 0x6ae8b01c177a54b6029803c4, limb3: 0x19cd64299c633b6e74933f98, }, }, G2Line { r0a0: u384 { limb0: 0x324273979b43f236c1b6d4b3, limb1: 0x6a44d55ac56823beb8c5cd4d, limb2: 0xf187e87ac0dea83abd11b631, limb3: 0xedbe290b2884e1a7816b064, }, r0a1: u384 { limb0: 0xb9c0ebcef8295a5127fabfde, limb1: 0xd8abaec351082a47e7dd0d50, limb2: 0xf7b036dd84a0f094aab5c7c, limb3: 0x14ba1a361d4fb86acc0430ff, }, r1a0: u384 { limb0: 0xd6a92564eca59a717cccc180, limb1: 0x7ec4e553b132cfe520138b91, limb2: 0x968b7ccf08d0a2377a2b5d51, limb3: 0x1486effacc4cfe9a2a925700, }, r1a1: u384 { limb0: 0xda73fa2984bbcd83191b529c, limb1: 0x3d2797caffd2a9f90addeb7d, limb2: 0x6ae8b01c177a54b6029803c4, limb3: 0x19cd64299c633b6e74933f98, }, }, G2Line { r0a0: u384 { limb0: 0xdb2681a0ef5cfd0962c48f6b, limb1: 0x1a2279a74c79a6421bd26c6c, limb2: 0xc48814ce2e29b2263da82a5, limb3: 0x2e3e25f56d91932935f20d, }, r0a1: u384 { limb0: 0xd677f32fe7da9736c43634f2, limb1: 0x4285e9705dd9ce8d698d1fe0, limb2: 0x2c7dd9009c4c58184aca558c, limb3: 0x3dcbe4e5594c6ab2d10c16d, }, r1a0: u384 { limb0: 0x86e822ce6a692777d529f773, limb1: 0xf92f4c24dd2d1a1ab77fcfe7, limb2: 0xc7f1f61538f225ee52b89f48, limb3: 0x7a08b05e3201602d9216d2d, }, r1a1: u384 { limb0: 0x220cfbe9c10884461876ae23, limb1: 0x9e752d4b5482e4c5bbd57488, limb2: 0x72d39a1d6f520311fd389c37, limb3: 0x52542fd6c39f0d99bd6bbd9, }, }, G2Line { r0a0: u384 { limb0: 0xdb2681a0ef5cfd0962c48f6b, limb1: 0x1a2279a74c79a6421bd26c6c, limb2: 0xc48814ce2e29b2263da82a5, limb3: 0x2e3e25f56d91932935f20d, }, r0a1: u384 { limb0: 0xd677f32fe7da9736c43634f2, limb1: 0x4285e9705dd9ce8d698d1fe0, limb2: 0x2c7dd9009c4c58184aca558c, limb3: 0x3dcbe4e5594c6ab2d10c16d, }, r1a0: u384 { limb0: 0x86e822ce6a692777d529f773, limb1: 0xf92f4c24dd2d1a1ab77fcfe7, limb2: 0xc7f1f61538f225ee52b89f48, limb3: 0x7a08b05e3201602d9216d2d, }, r1a1: u384 { limb0: 0x220cfbe9c10884461876ae23, limb1: 0x9e752d4b5482e4c5bbd57488, limb2: 0x72d39a1d6f520311fd389c37, limb3: 0x52542fd6c39f0d99bd6bbd9, }, }, G2Line { r0a0: u384 { limb0: 0xd2833c6e80915aa802028d91, limb1: 0x74d22878ec75474650117b32, limb2: 0x6cb76ac504f45d442506c3b9, limb3: 0x19a572ff9f78c5689f7e9, }, r0a1: u384 { limb0: 0x46249614d83af7e171c6172a, limb1: 0xd2a4f206fa6b7c9dc6276a1d, limb2: 0x1d37284645aeccfa7e55914e, limb3: 0xea73b1772fdeb0d8a80a54, }, r1a0: u384 { limb0: 0x985a081123f14663474d6128, limb1: 0x787c1d2cef0eaf6c17b95fa8, limb2: 0xf13630ecc0448c07d7ec98e1, limb3: 0xcd42fb0bd6ca63acd78405b, }, r1a1: u384 { limb0: 0xf78e5391e95d1455d6dd1c83, limb1: 0xb1164967a264030c2d76d419, limb2: 0xe1a6bcb4b4b9ee8fddc7315c, limb3: 0x173465e64e00f1cdec28f131, }, }, G2Line { r0a0: u384 { limb0: 0xd2833c6e80915aa802028d91, limb1: 0x74d22878ec75474650117b32, limb2: 0x6cb76ac504f45d442506c3b9, limb3: 0x19a572ff9f78c5689f7e9, }, r0a1: u384 { limb0: 0x46249614d83af7e171c6172a, limb1: 0xd2a4f206fa6b7c9dc6276a1d, limb2: 0x1d37284645aeccfa7e55914e, limb3: 0xea73b1772fdeb0d8a80a54, }, r1a0: u384 { limb0: 0x985a081123f14663474d6128, limb1: 0x787c1d2cef0eaf6c17b95fa8, limb2: 0xf13630ecc0448c07d7ec98e1, limb3: 0xcd42fb0bd6ca63acd78405b, }, r1a1: u384 { limb0: 0xf78e5391e95d1455d6dd1c83, limb1: 0xb1164967a264030c2d76d419, limb2: 0xe1a6bcb4b4b9ee8fddc7315c, limb3: 0x173465e64e00f1cdec28f131, }, }, G2Line { r0a0: u384 { limb0: 0x5a92b83a440860b31ecb39ab, limb1: 0x6bc88b2098e8aa4f2cbabe29, limb2: 0xa344268cee55846c0d67fc57, limb3: 0xbb3d9a3fd7f583599bea6c8, }, r0a1: u384 { limb0: 0x3a6a9d0f4e52f138fe7e33f8, limb1: 0x51afc01b9494c61c5bd1b11e, limb2: 0x3172b05abc177e9cce4b4f0, limb3: 0x17d8ca31211b957fcb12e805, }, r1a0: u384 { limb0: 0x6343ff0635ec4e9c9fb709b9, limb1: 0x68e8d08a9f5be219dd16fe6f, limb2: 0xf0fed78a781578b59788720b, limb3: 0xbe842e6fff90d6b069cb70, }, r1a1: u384 { limb0: 0xd037592f81aa53124684abf0, limb1: 0xe52aeb7217c82e488907f68e, limb2: 0x3bddbeccd2fae9aedaa083b6, limb3: 0xcdd8a9e7fe7cc350a576aaa, }, }, G2Line { r0a0: u384 { limb0: 0x5a92b83a440860b31ecb39ab, limb1: 0x6bc88b2098e8aa4f2cbabe29, limb2: 0xa344268cee55846c0d67fc57, limb3: 0xbb3d9a3fd7f583599bea6c8, }, r0a1: u384 { limb0: 0x3a6a9d0f4e52f138fe7e33f8, limb1: 0x51afc01b9494c61c5bd1b11e, limb2: 0x3172b05abc177e9cce4b4f0, limb3: 0x17d8ca31211b957fcb12e805, }, r1a0: u384 { limb0: 0x6343ff0635ec4e9c9fb709b9, limb1: 0x68e8d08a9f5be219dd16fe6f, limb2: 0xf0fed78a781578b59788720b, limb3: 0xbe842e6fff90d6b069cb70, }, r1a1: u384 { limb0: 0xd037592f81aa53124684abf0, limb1: 0xe52aeb7217c82e488907f68e, limb2: 0x3bddbeccd2fae9aedaa083b6, limb3: 0xcdd8a9e7fe7cc350a576aaa, }, }, G2Line { r0a0: u384 { limb0: 0x6ab1f6647ba9ba736f0839ad, limb1: 0xe8204b773672d624630e2384, limb2: 0x9ecdf669a827c29c74daf71b, limb3: 0x2627dd5786ccd48891b28cb, }, r0a1: u384 { limb0: 0xd65bc63d35cc0bfb66c2fbf5, limb1: 0xb658ffd3e2b02102a72560b5, limb2: 0x4831f5285ece22bc1c6a1869, limb3: 0x1721967f7d4fc728f65b501c, }, r1a0: u384 { limb0: 0x6794d4f4801a0974d863a911, limb1: 0xbecbc2ac5e4c8d8ccf656991, limb2: 0x9ec1f54cdfcb10932d199399, limb3: 0x2406219596075a45c6e0806, }, r1a1: u384 { limb0: 0xe78dbc09e2db8d9605dc8f23, limb1: 0xc9303fa646a2966cfd79288, limb2: 0xa61763bd756d1d418bd83966, limb3: 0x198617a89efe66f0fd26cf06, }, }, G2Line { r0a0: u384 { limb0: 0x6ab1f6647ba9ba736f0839ad, limb1: 0xe8204b773672d624630e2384, limb2: 0x9ecdf669a827c29c74daf71b, limb3: 0x2627dd5786ccd48891b28cb, }, r0a1: u384 { limb0: 0xd65bc63d35cc0bfb66c2fbf5, limb1: 0xb658ffd3e2b02102a72560b5, limb2: 0x4831f5285ece22bc1c6a1869, limb3: 0x1721967f7d4fc728f65b501c, }, r1a0: u384 { limb0: 0x6794d4f4801a0974d863a911, limb1: 0xbecbc2ac5e4c8d8ccf656991, limb2: 0x9ec1f54cdfcb10932d199399, limb3: 0x2406219596075a45c6e0806, }, r1a1: u384 { limb0: 0xe78dbc09e2db8d9605dc8f23, limb1: 0xc9303fa646a2966cfd79288, limb2: 0xa61763bd756d1d418bd83966, limb3: 0x198617a89efe66f0fd26cf06, }, }, G2Line { r0a0: u384 { limb0: 0x3d1d195f552c9f18d8d5c535, limb1: 0x1323b299172854615a455e4a, limb2: 0xf7d398cbadc32d691ed52bd6, limb3: 0x659beaad32fe55ba9df44d9, }, r0a1: u384 { limb0: 0x98c06f5573cfa234289b62d8, limb1: 0xe515dd299c6e00bc6df14c34, limb2: 0x23b66fe012eb1a443038cb88, limb3: 0x12f810746c2c45af5360d9bc, }, r1a0: u384 { limb0: 0x3aae5b2af57f0c9c94bb32, limb1: 0x777a7e6bbc9962ab6be81f76, limb2: 0x14cbce88a915fc5331313d21, limb3: 0x13a52e8a1ac3c04b42218be1, }, r1a1: u384 { limb0: 0xd2b673a0bae8bfb28cff0c45, limb1: 0xf95ff65fcc89601198dc8f91, limb2: 0xd77322bf8488715eef3f6fb1, limb3: 0xf1277bfb59098f10a9131b5, }, }, G2Line { r0a0: u384 { limb0: 0x3d1d195f552c9f18d8d5c535, limb1: 0x1323b299172854615a455e4a, limb2: 0xf7d398cbadc32d691ed52bd6, limb3: 0x659beaad32fe55ba9df44d9, }, r0a1: u384 { limb0: 0x98c06f5573cfa234289b62d8, limb1: 0xe515dd299c6e00bc6df14c34, limb2: 0x23b66fe012eb1a443038cb88, limb3: 0x12f810746c2c45af5360d9bc, }, r1a0: u384 { limb0: 0x3aae5b2af57f0c9c94bb32, limb1: 0x777a7e6bbc9962ab6be81f76, limb2: 0x14cbce88a915fc5331313d21, limb3: 0x13a52e8a1ac3c04b42218be1, }, r1a1: u384 { limb0: 0xd2b673a0bae8bfb28cff0c45, limb1: 0xf95ff65fcc89601198dc8f91, limb2: 0xd77322bf8488715eef3f6fb1, limb3: 0xf1277bfb59098f10a9131b5, }, }, G2Line { r0a0: u384 { limb0: 0x994b3340947e0dfc5f4449bf, limb1: 0xf2a54d7464f1f50b95abe9d8, limb2: 0xaa05f45202de8ae127c3d64b, limb3: 0x105819b4d71c03790bfeb092, }, r0a1: u384 { limb0: 0xdbca0a627c296fe7aad607f1, limb1: 0x7a8255ce902319b92cd065be, limb2: 0x7b50bc220077a52b59ce5307, limb3: 0xf9e05915fae54c347b88c1e, }, r1a0: u384 { limb0: 0x2cac98351a30b0b82a54b79e, limb1: 0xed07531e9f2463331277b6f3, limb2: 0x12b3ebca243e04ae826f6c33, limb3: 0x12969325aa2fdc65900e8a68, }, r1a1: u384 { limb0: 0xb0799b5a24a5ceb48429df27, limb1: 0x2ee6d0a37a7ddc7798f3bc77, limb2: 0x63ec626451e43c56ff92bafb, limb3: 0x50818d39d6234b4dc233a38, }, }, G2Line { r0a0: u384 { limb0: 0x994b3340947e0dfc5f4449bf, limb1: 0xf2a54d7464f1f50b95abe9d8, limb2: 0xaa05f45202de8ae127c3d64b, limb3: 0x105819b4d71c03790bfeb092, }, r0a1: u384 { limb0: 0xdbca0a627c296fe7aad607f1, limb1: 0x7a8255ce902319b92cd065be, limb2: 0x7b50bc220077a52b59ce5307, limb3: 0xf9e05915fae54c347b88c1e, }, r1a0: u384 { limb0: 0x2cac98351a30b0b82a54b79e, limb1: 0xed07531e9f2463331277b6f3, limb2: 0x12b3ebca243e04ae826f6c33, limb3: 0x12969325aa2fdc65900e8a68, }, r1a1: u384 { limb0: 0xb0799b5a24a5ceb48429df27, limb1: 0x2ee6d0a37a7ddc7798f3bc77, limb2: 0x63ec626451e43c56ff92bafb, limb3: 0x50818d39d6234b4dc233a38, }, }, G2Line { r0a0: u384 { limb0: 0xb67cc5f083f96e39a134d194, limb1: 0xaf9e780b6c4a7184061027d7, limb2: 0xdcda4477070e92cdf3397d43, limb3: 0x6a696f2522cc9af3d082748, }, r0a1: u384 { limb0: 0x392c02806e22eca0d48618e7, limb1: 0x8aba49a57d2d347b3df198c6, limb2: 0x754cc050d1a93ac3f85ce805, limb3: 0xe759f363f34e4784dc65a71, }, r1a0: u384 { limb0: 0xd34741277335bd3799ea321e, limb1: 0xdd6641b8fbd73a1428f041ea, limb2: 0xe38c8915296a5c201145b868, limb3: 0x105d879c98b5261f00ea9de9, }, r1a1: u384 { limb0: 0x5c96d186d5a39ffc6149aefc, limb1: 0xe4f274d1b18b7edb57fc9918, limb2: 0xea1f8cfaa190965fbae29234, limb3: 0x110e5f288f9b57423dcde8a7, }, }, G2Line { r0a0: u384 { limb0: 0xb67cc5f083f96e39a134d194, limb1: 0xaf9e780b6c4a7184061027d7, limb2: 0xdcda4477070e92cdf3397d43, limb3: 0x6a696f2522cc9af3d082748, }, r0a1: u384 { limb0: 0x392c02806e22eca0d48618e7, limb1: 0x8aba49a57d2d347b3df198c6, limb2: 0x754cc050d1a93ac3f85ce805, limb3: 0xe759f363f34e4784dc65a71, }, r1a0: u384 { limb0: 0xd34741277335bd3799ea321e, limb1: 0xdd6641b8fbd73a1428f041ea, limb2: 0xe38c8915296a5c201145b868, limb3: 0x105d879c98b5261f00ea9de9, }, r1a1: u384 { limb0: 0x5c96d186d5a39ffc6149aefc, limb1: 0xe4f274d1b18b7edb57fc9918, limb2: 0xea1f8cfaa190965fbae29234, limb3: 0x110e5f288f9b57423dcde8a7, }, }, G2Line { r0a0: u384 { limb0: 0xfd988b3fefee9bec8d580624, limb1: 0xea8b268179a0cff5e5a733de, limb2: 0xc3261de3bb0dae36dd3a12d1, limb3: 0xe0311c57778716dd26ec448, }, r0a1: u384 { limb0: 0xbd3bb91f6aebae19c756f359, limb1: 0x8ddb3cfc5cbb0a427decde5c, limb2: 0xa3ee67368948da84ef76cc9c, limb3: 0x386b903ec5f7b21375b440b, }, r1a0: u384 { limb0: 0xf101c44cc5023657f2d800ce, limb1: 0xe3c33e1823e3fbd36e6ec7f3, limb2: 0xb72b4d93169a4b6f53c98bd8, limb3: 0xfe4e73b7283c84a94493193, }, r1a1: u384 { limb0: 0x72d680350e90ad8a1b951514, limb1: 0xbcc457b76fcdb17ec8734b67, limb2: 0xc2f60e7bf5f241b7e5cee4a0, limb3: 0x16aaebbc648697f433c2261d, }, }, G2Line { r0a0: u384 { limb0: 0xfd988b3fefee9bec8d580624, limb1: 0xea8b268179a0cff5e5a733de, limb2: 0xc3261de3bb0dae36dd3a12d1, limb3: 0xe0311c57778716dd26ec448, }, r0a1: u384 { limb0: 0xbd3bb91f6aebae19c756f359, limb1: 0x8ddb3cfc5cbb0a427decde5c, limb2: 0xa3ee67368948da84ef76cc9c, limb3: 0x386b903ec5f7b21375b440b, }, r1a0: u384 { limb0: 0xf101c44cc5023657f2d800ce, limb1: 0xe3c33e1823e3fbd36e6ec7f3, limb2: 0xb72b4d93169a4b6f53c98bd8, limb3: 0xfe4e73b7283c84a94493193, }, r1a1: u384 { limb0: 0x72d680350e90ad8a1b951514, limb1: 0xbcc457b76fcdb17ec8734b67, limb2: 0xc2f60e7bf5f241b7e5cee4a0, limb3: 0x16aaebbc648697f433c2261d, }, }, G2Line { r0a0: u384 { limb0: 0x6f85133f411d25e0b5f35e4e, limb1: 0xc638badc6521e71c561777f7, limb2: 0x8353d2452d7ab56d813e41e4, limb3: 0x10bc8e7f6b5289bdc1c5fa9f, }, r0a1: u384 { limb0: 0xab5f1742cb30521d01daacc0, limb1: 0x9e56c445377075119d1596a4, limb2: 0xa72211611536639fe4976d69, limb3: 0x11f238149a22f79fa16cb32b, }, r1a0: u384 { limb0: 0x8367fe7274231c74704c80ff, limb1: 0xa8e2ad1a7f0c36a34b48cd88, limb2: 0x7faca91a72963d25472465c, limb3: 0x1311fd26e3b83c10952fb826, }, r1a1: u384 { limb0: 0xae246df1f149439c747384f1, limb1: 0x68a615ee2f9d7f8d56f2174b, limb2: 0xf64d48e37e9111200271d2ee, limb3: 0x2daa9898e27bc3d9ce26195, }, }, G2Line { r0a0: u384 { limb0: 0x6f85133f411d25e0b5f35e4e, limb1: 0xc638badc6521e71c561777f7, limb2: 0x8353d2452d7ab56d813e41e4, limb3: 0x10bc8e7f6b5289bdc1c5fa9f, }, r0a1: u384 { limb0: 0xab5f1742cb30521d01daacc0, limb1: 0x9e56c445377075119d1596a4, limb2: 0xa72211611536639fe4976d69, limb3: 0x11f238149a22f79fa16cb32b, }, r1a0: u384 { limb0: 0x8367fe7274231c74704c80ff, limb1: 0xa8e2ad1a7f0c36a34b48cd88, limb2: 0x7faca91a72963d25472465c, limb3: 0x1311fd26e3b83c10952fb826, }, r1a1: u384 { limb0: 0xae246df1f149439c747384f1, limb1: 0x68a615ee2f9d7f8d56f2174b, limb2: 0xf64d48e37e9111200271d2ee, limb3: 0x2daa9898e27bc3d9ce26195, }, }, G2Line { r0a0: u384 { limb0: 0x293cdab968151d9a88ba8197, limb1: 0x91e20a097317fbf539a50489, limb2: 0x60d594dea296004ee2824b62, limb3: 0x190b7e72bd6ee0ed0faf4962, }, r0a1: u384 { limb0: 0xb5b5a519c745663a2d0a6a22, limb1: 0xe8d8005fede56d9bb7f102ac, limb2: 0x1534acc00cf17be37afd327d, limb3: 0xb3c34b4025f50c09d86ccf1, }, r1a0: u384 { limb0: 0x8a28c9f5c487242be3157d10, limb1: 0x35adb9f220d3910e8e7e628a, limb2: 0x8a53a50706970f599abb8b1, limb3: 0x1813805985492b229d25c9c0, }, r1a1: u384 { limb0: 0x53f421abc7375d7ef5f4ea15, limb1: 0x3453e28c8b88718a6bd2122c, limb2: 0x181dbbb6144062890a582400, limb3: 0xe27d7ff293c8253269fc184, }, }, G2Line { r0a0: u384 { limb0: 0x293cdab968151d9a88ba8197, limb1: 0x91e20a097317fbf539a50489, limb2: 0x60d594dea296004ee2824b62, limb3: 0x190b7e72bd6ee0ed0faf4962, }, r0a1: u384 { limb0: 0xb5b5a519c745663a2d0a6a22, limb1: 0xe8d8005fede56d9bb7f102ac, limb2: 0x1534acc00cf17be37afd327d, limb3: 0xb3c34b4025f50c09d86ccf1, }, r1a0: u384 { limb0: 0x8a28c9f5c487242be3157d10, limb1: 0x35adb9f220d3910e8e7e628a, limb2: 0x8a53a50706970f599abb8b1, limb3: 0x1813805985492b229d25c9c0, }, r1a1: u384 { limb0: 0x53f421abc7375d7ef5f4ea15, limb1: 0x3453e28c8b88718a6bd2122c, limb2: 0x181dbbb6144062890a582400, limb3: 0xe27d7ff293c8253269fc184, }, }, G2Line { r0a0: u384 { limb0: 0x788ac954b6de3b9ef5a6c12c, limb1: 0xe13873c4ba9728c89be70b9a, limb2: 0x5d6b9d45c0985f271595d4c9, limb3: 0x1954917fe709faff9865ebc3, }, r0a1: u384 { limb0: 0x93fca181f0664865a2fc75fe, limb1: 0x535e2e42a4a967f7ca763127, limb2: 0xce90cca6dfec0e2e8fae9e3, limb3: 0xd086b29c92aaddb7245299d, }, r1a0: u384 { limb0: 0x4ef1ed09cae08920a78f3bd7, limb1: 0x6714e095d8cc53e3829f2b5a, limb2: 0x9022123e8d70a0049ccb62a6, limb3: 0xef311f53ea87dc5da3ddd33, }, r1a1: u384 { limb0: 0xbc5ec58d4c68ebde3ce5d6af, limb1: 0x91f1285170fbc3c4d812f3aa, limb2: 0x13eec60eefd5588477e432d8, limb3: 0x74a34dc5c8359340c5fe4f1, }, }, G2Line { r0a0: u384 { limb0: 0x788ac954b6de3b9ef5a6c12c, limb1: 0xe13873c4ba9728c89be70b9a, limb2: 0x5d6b9d45c0985f271595d4c9, limb3: 0x1954917fe709faff9865ebc3, }, r0a1: u384 { limb0: 0x93fca181f0664865a2fc75fe, limb1: 0x535e2e42a4a967f7ca763127, limb2: 0xce90cca6dfec0e2e8fae9e3, limb3: 0xd086b29c92aaddb7245299d, }, r1a0: u384 { limb0: 0x4ef1ed09cae08920a78f3bd7, limb1: 0x6714e095d8cc53e3829f2b5a, limb2: 0x9022123e8d70a0049ccb62a6, limb3: 0xef311f53ea87dc5da3ddd33, }, r1a1: u384 { limb0: 0xbc5ec58d4c68ebde3ce5d6af, limb1: 0x91f1285170fbc3c4d812f3aa, limb2: 0x13eec60eefd5588477e432d8, limb3: 0x74a34dc5c8359340c5fe4f1, }, }, G2Line { r0a0: u384 { limb0: 0x46d409dd77b17a23fc402a34, limb1: 0x26d0e70f78ec18c019c2f074, limb2: 0x98d531c6d1b75c297e5f3c9, limb3: 0x3a571d848cc57291ff2ffa, }, r0a1: u384 { limb0: 0x9220d2160322f603fa59c76, limb1: 0xf7811520cd515d496363e693, limb2: 0x2c5614352975026f33861c37, limb3: 0x17644f4fbe80675d0953c99d, }, r1a0: u384 { limb0: 0x4aaca6cc8c9d33c63c0f1d1b, limb1: 0xe45b1fa9442911a2857ec8fa, limb2: 0x32c9f0ff272cf03afd720f7d, limb3: 0x1e0242dad0177697c8a0aff, }, r1a1: u384 { limb0: 0x728463c48b5aea9ca697e90b, limb1: 0x7b8f08b990bfcb2db30c3193, limb2: 0x7232cfafe8d7566719d9c4af, limb3: 0x5f1c40f1c28ca2cf8f83994, }, }, G2Line { r0a0: u384 { limb0: 0x46d409dd77b17a23fc402a34, limb1: 0x26d0e70f78ec18c019c2f074, limb2: 0x98d531c6d1b75c297e5f3c9, limb3: 0x3a571d848cc57291ff2ffa, }, r0a1: u384 { limb0: 0x9220d2160322f603fa59c76, limb1: 0xf7811520cd515d496363e693, limb2: 0x2c5614352975026f33861c37, limb3: 0x17644f4fbe80675d0953c99d, }, r1a0: u384 { limb0: 0x4aaca6cc8c9d33c63c0f1d1b, limb1: 0xe45b1fa9442911a2857ec8fa, limb2: 0x32c9f0ff272cf03afd720f7d, limb3: 0x1e0242dad0177697c8a0aff, }, r1a1: u384 { limb0: 0x728463c48b5aea9ca697e90b, limb1: 0x7b8f08b990bfcb2db30c3193, limb2: 0x7232cfafe8d7566719d9c4af, limb3: 0x5f1c40f1c28ca2cf8f83994, }, }, G2Line { r0a0: u384 { limb0: 0xf6913070c37af578aa1b9a37, limb1: 0x664781917f37151d3a0d627a, limb2: 0x9d5cd2ddf7dd66c044a101e6, limb3: 0x13cc21b4e1f7c288d1b899ad, }, r0a1: u384 { limb0: 0x5607928bdfad47c77f840a3, limb1: 0xdd3d8bf376d25ba8b3a926aa, limb2: 0x35c034874a2ccd33ec0fedad, limb3: 0x176b6eb4cbcedd0416d8b2e9, }, r1a0: u384 { limb0: 0x1f81c4f93cff2721578a1cd7, limb1: 0x7908a9522938e77f3e279a41, limb2: 0x7fdc79ff7c835d873ab01ed2, limb3: 0x11e3d19be097dc7e63b49b10, }, r1a1: u384 { limb0: 0x235b99292b27c9efd6a59ff4, limb1: 0x82cb49f680a93e6e718e3689, limb2: 0x710cd7d6390eca09a291ad52, limb3: 0xf60ffe1a70c2771c44ee20f, }, }, G2Line { r0a0: u384 { limb0: 0xf6913070c37af578aa1b9a37, limb1: 0x664781917f37151d3a0d627a, limb2: 0x9d5cd2ddf7dd66c044a101e6, limb3: 0x13cc21b4e1f7c288d1b899ad, }, r0a1: u384 { limb0: 0x5607928bdfad47c77f840a3, limb1: 0xdd3d8bf376d25ba8b3a926aa, limb2: 0x35c034874a2ccd33ec0fedad, limb3: 0x176b6eb4cbcedd0416d8b2e9, }, r1a0: u384 { limb0: 0x1f81c4f93cff2721578a1cd7, limb1: 0x7908a9522938e77f3e279a41, limb2: 0x7fdc79ff7c835d873ab01ed2, limb3: 0x11e3d19be097dc7e63b49b10, }, r1a1: u384 { limb0: 0x235b99292b27c9efd6a59ff4, limb1: 0x82cb49f680a93e6e718e3689, limb2: 0x710cd7d6390eca09a291ad52, limb3: 0xf60ffe1a70c2771c44ee20f, }, }, G2Line { r0a0: u384 { limb0: 0x8b2d5026a69128c8dcd7fa01, limb1: 0xa28af7e6845ec126ce674de3, limb2: 0x74618fcee9375eaffe329a57, limb3: 0xd495764b344945c1bbf2528, }, r0a1: u384 { limb0: 0xc7191fe7d9c67d8956440c8e, limb1: 0x9886e12a6f751b086c256b4e, limb2: 0x2d800e1229e7acc62268ce86, limb3: 0x8a1766c3924e9fe41995f27, }, r1a0: u384 { limb0: 0xe95730415bdae7fa69798292, limb1: 0x550a77eda4e6fd2f0bea1e69, limb2: 0xad91cd00e401b4c4d699ac6, limb3: 0x147171fe6dce69e5291e5d4, }, r1a1: u384 { limb0: 0x3950881f65abb4ae1b59bbca, limb1: 0x588580a38b689b30f05b80bd, limb2: 0x77cb4489a340d3748044c17c, limb3: 0xda658ea95a6fefe83fa39d1, }, }, G2Line { r0a0: u384 { limb0: 0x8b2d5026a69128c8dcd7fa01, limb1: 0xa28af7e6845ec126ce674de3, limb2: 0x74618fcee9375eaffe329a57, limb3: 0xd495764b344945c1bbf2528, }, r0a1: u384 { limb0: 0xc7191fe7d9c67d8956440c8e, limb1: 0x9886e12a6f751b086c256b4e, limb2: 0x2d800e1229e7acc62268ce86, limb3: 0x8a1766c3924e9fe41995f27, }, r1a0: u384 { limb0: 0xe95730415bdae7fa69798292, limb1: 0x550a77eda4e6fd2f0bea1e69, limb2: 0xad91cd00e401b4c4d699ac6, limb3: 0x147171fe6dce69e5291e5d4, }, r1a1: u384 { limb0: 0x3950881f65abb4ae1b59bbca, limb1: 0x588580a38b689b30f05b80bd, limb2: 0x77cb4489a340d3748044c17c, limb3: 0xda658ea95a6fefe83fa39d1, }, }, G2Line { r0a0: u384 { limb0: 0xfb36382a07a0546177544af4, limb1: 0x98af0f0579819a56ea21677c, limb2: 0xaba237656261d369d5d808d6, limb3: 0xc9fb6adc6528d40d93c0da4, }, r0a1: u384 { limb0: 0x5c117b9250db1f77095f3f80, limb1: 0xda15f91e9282ff6deb2a2558, limb2: 0xaa820f7393229d9126ae7b62, limb3: 0x110c5e918c554c126361e32e, }, r1a0: u384 { limb0: 0xac056d30f948e924aa511f05, limb1: 0x31318c843660bb21180267e1, limb2: 0xb22b2d85ae7080079ab0bc7e, limb3: 0x14941dda97edcedd3d32ad23, }, r1a1: u384 { limb0: 0x876fd0749511e318e84cc37e, limb1: 0x71b4a1c6b941f0bd7731cf3a, limb2: 0x54e1fb48d3305bd534e5132f, limb3: 0x262c905d8278be2f7a9d1ea, }, }, G2Line { r0a0: u384 { limb0: 0xfb36382a07a0546177544af4, limb1: 0x98af0f0579819a56ea21677c, limb2: 0xaba237656261d369d5d808d6, limb3: 0xc9fb6adc6528d40d93c0da4, }, r0a1: u384 { limb0: 0x5c117b9250db1f77095f3f80, limb1: 0xda15f91e9282ff6deb2a2558, limb2: 0xaa820f7393229d9126ae7b62, limb3: 0x110c5e918c554c126361e32e, }, r1a0: u384 { limb0: 0xac056d30f948e924aa511f05, limb1: 0x31318c843660bb21180267e1, limb2: 0xb22b2d85ae7080079ab0bc7e, limb3: 0x14941dda97edcedd3d32ad23, }, r1a1: u384 { limb0: 0x876fd0749511e318e84cc37e, limb1: 0x71b4a1c6b941f0bd7731cf3a, limb2: 0x54e1fb48d3305bd534e5132f, limb3: 0x262c905d8278be2f7a9d1ea, }, }, ] .span(); let hint = MPCheckHintBLS12_381 { lambda_root_inverse: E12D { w0: u384 { limb0: 0x8bdaa3278720844c37567039, limb1: 0xd2f1409607d64c54b73d78aa, limb2: 0x2f6a4e683585d4ccc465352a, limb3: 0x105016815aeab4c1b10cba42, }, w1: u384 { limb0: 0xf14f1369d17825c133efc2d6, limb1: 0xece7f8c4810788c9023c2ad2, limb2: 0x8a7a3dca8c8fe5ccf68c0b23, limb3: 0xe11367a38a9da9df3424073, }, w2: u384 { limb0: 0xbf3c140b105713ed07834b4a, limb1: 0x31325aee1b1dbae62f7c153, limb2: 0xf1712c06213e43c0272585dc, limb3: 0x13e42c3e0801ac2144a06fb, }, w3: u384 { limb0: 0x713b362105bba1e8fcbb94a0, limb1: 0x7336f37c2c0d759c4ff697bf, limb2: 0xc61d5ab0a8dc2dffbaa7e2dc, limb3: 0xc759210484ca64b6a064096, }, w4: u384 { limb0: 0xdb2b0eb950e9144b7f2f02fa, limb1: 0x83f2d1513c7ce01407cbcbeb, limb2: 0x3acef2763be703fa77d90506, limb3: 0xd6a3922a006a5ac269f1105, }, w5: u384 { limb0: 0xd7a563e564895cf2511754e1, limb1: 0xc5ec4b01df1cb55da421916c, limb2: 0x6a17068bd9eb8099e645e126, limb3: 0xde779332fd6d9f465b20e6a, }, w6: u384 { limb0: 0x62b4676a303984e5006cae4a, limb1: 0xf48de62916116cc249eda468, limb2: 0x30355b613eab563b9cb9b14a, limb3: 0x92dc96c5c90e4a4e20a4cc8, }, w7: u384 { limb0: 0x2adef7cf0ce5e70667934f1c, limb1: 0x49df16aef14c96dda3795592, limb2: 0x90675022b9d62cbd8685978d, limb3: 0xe6467206b01d8ecaea8fdd, }, w8: u384 { limb0: 0x5a0918f6778263817954d908, limb1: 0xf1cea39accc8cc574af25807, limb2: 0xeb067bfcab205abe6c371677, limb3: 0x33f8a5722e1821e1f8c5f4a, }, w9: u384 { limb0: 0x5bec5a38ecbb7806f62dcc79, limb1: 0xcf4fd2a6884e312f05ffe06b, limb2: 0x59da93e49907f3bcb160ed13, limb3: 0x130fe108a81a7753e3f765d5, }, w10: u384 { limb0: 0x675bac7aed2b433f922616d3, limb1: 0x2f2f405981e6aca41db75f4d, limb2: 0x5c5e051f326dbaef7f17399b, limb3: 0xcd24160fefddfaa66c9468a, }, w11: u384 { limb0: 0x82d362ba811d62d7264e9909, limb1: 0x6e0c09afc5dbcf4dffd7fc05, limb2: 0x30ce07f0ccb46385c2b2b40a, limb3: 0x17f2b41158bbf2cb53644eae, }, }, w: MillerLoopResultScalingFactor { w0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, w2: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, w4: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, w6: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, w8: u384 { limb0: 0x79b43033d2c6148ace378dd, limb1: 0xc6a64d7c9213ad89ad6e2940, limb2: 0x6935c3e1b9cf1af588eafb63, limb3: 0x66ba50e8c99edbeedf33b87, }, w10: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }, Ris: array![ E12D { w0: u384 { limb0: 0x5e87a33f78e1f9158930afbe, limb1: 0xb03343f0ba8a9f2239714f7b, limb2: 0x9b36f2ea6a63c232dd98cdfc, limb3: 0x12fa722de4e2d3218998c810, }, w1: u384 { limb0: 0xc9f693551a877941adc4d9e5, limb1: 0x55a0971be122dcda5e5c3c8, limb2: 0x7c004df041a155e3b48cdf91, limb3: 0x959ea623e7d5b6f547c34aa, }, w2: u384 { limb0: 0x7b00e2956467ad946b1cbad4, limb1: 0xb3dddc7d363c4618d35bbfd0, limb2: 0x67f8fcf4c55fc2cd48e50cff, limb3: 0x155823e0d57749245ea41a2d, }, w3: u384 { limb0: 0xac48c31201b554c29ed60ab6, limb1: 0xd5f6cd8404db4fba9b6b1908, limb2: 0x2a12dd0e1ba2a2c71c111daa, limb3: 0xeec9f4d9359e16042385ce1, }, w4: u384 { limb0: 0x612b6944bb47d6ef40f0a521, limb1: 0x8d9728d2c62f0e796f49eef1, limb2: 0xef1cf82ad9649cdaf92b4dad, limb3: 0x16338f7d8ffc1e1319fc335b, }, w5: u384 { limb0: 0x9ea8de19e0e2a79e3da646e8, limb1: 0x71979065bb38d55f71156ee4, limb2: 0x8f7025473478c1bc198be805, limb3: 0x187985494ec2b58fdcbde38d, }, w6: u384 { limb0: 0x96686495d190b64a7ea79e6e, limb1: 0x89a11b76e803f02eb0d472b0, limb2: 0x6528eebe102cbb5374fe497f, limb3: 0xd3cc49ff4fec483e733e76d, }, w7: u384 { limb0: 0x82a3ef2511fe244c62bd5677, limb1: 0x52f0c10aafffafc1cf866828, limb2: 0x3cfe5bcd4718b63e76a65b17, limb3: 0x2e63847fb6ea974a63e85df, }, w8: u384 { limb0: 0xe04c4235ae17a9fab047b993, limb1: 0x9ade428b70a43c53f180123c, limb2: 0x892fce8b94f415a31260f4a5, limb3: 0x14939c716e672d2e4f93049d, }, w9: u384 { limb0: 0x2076170f69cca61e8266cf77, limb1: 0xa94c356ff22eb446d1816afa, limb2: 0x7b5ee869ff77574fbd075e32, limb3: 0x18c4c735d8759f9d05c97b53, }, w10: u384 { limb0: 0x87b2d06f00ce9210f880f777, limb1: 0x270fa1aa87ff48d0c7029e08, limb2: 0xd7a0a067fdef49ae272a9cee, limb3: 0x2670fa59b1931a9f41abca2, }, w11: u384 { limb0: 0x1d6670cd3b34ffaf62d4d572, limb1: 0x2a6da26183af5ba37e45e771, limb2: 0x2a68a3421c934fb0eb0a917c, limb3: 0x51f182c87581744f24c2335, }, }, E12D { w0: u384 { limb0: 0xa5f19f0768085bfad6e01cd4, limb1: 0xdb5ba1fd09ac91a4ae47652f, limb2: 0x2b13b3f3a78d5dc5c4d512a1, limb3: 0x8ce9c32b58bdfd51336a482, }, w1: u384 { limb0: 0xe2f45c49eb706f9f80de75ea, limb1: 0x2f2a290fef99d780bdbb0c7a, limb2: 0xde3a67d7d6bc965776584229, limb3: 0xddda4d389f0c2b9300d301a, }, w2: u384 { limb0: 0x48376e71dfcc68f658e47c4c, limb1: 0xcac6cb5c19f8d13b4df976d, limb2: 0x84384bb472feb3909e7ed3f8, limb3: 0xa4c6d75fd40944d23efad65, }, w3: u384 { limb0: 0x5706ae17c1b9f75e69a7e787, limb1: 0xc7cec8901103a5ee7bbd04d7, limb2: 0x8ddb584192f1250140b1ee3, limb3: 0x13d733d54618baa778469263, }, w4: u384 { limb0: 0x9050e16d385573cfaaf7154a, limb1: 0x82794a915ed9862237629b23, limb2: 0xa64cea16d0c28ec3f2bf97df, limb3: 0xa9ea911e3c1f16f11159bbe, }, w5: u384 { limb0: 0x7e65b51d042ee4735403a47b, limb1: 0x319fb8dfee0f546bd682f411, limb2: 0xc23d64d72ebcfddc3ea548e2, limb3: 0x111a1b915b3b25c5b9ec5052, }, w6: u384 { limb0: 0x7bd1cf57624895a0b3032653, limb1: 0x4961831e7409f7db175def7a, limb2: 0xb306db9676eef0f14180f0b4, limb3: 0x125ee887fc0eef7011ad0bbb, }, w7: u384 { limb0: 0x116cbb348fef5002aab5a1a0, limb1: 0xb1c8c7d1d9cff958a4004f0c, limb2: 0xb84a0ac8e21027d24b14ddc4, limb3: 0x1169229cdff8901d09902cb5, }, w8: u384 { limb0: 0x1046697d16f72172bef7ed16, limb1: 0xdb516839f9a0cbcbcc73b40b, limb2: 0xda4b81ca7038c6e7899437b4, limb3: 0x898ffff0cbbee98eed4ddfa, }, w9: u384 { limb0: 0xc57fc0dc768cc4566d475c1c, limb1: 0xcd5963a848c0b4c0417f5a2e, limb2: 0x73ecaffe0aae8b6dbac48037, limb3: 0x79fd45ff01f26c32e1a83da, }, w10: u384 { limb0: 0x1d5fdcdedff07d7317cb5f87, limb1: 0xfed3411e06c703dee8b6e5c7, limb2: 0xb5edc0395ade200d535f84ab, limb3: 0x3b6c9db7c2bec65f7929ef8, }, w11: u384 { limb0: 0x835a3107a27c76602bb8a4e9, limb1: 0x9f1a745144ee7c13c69cd736, limb2: 0xad8ace8310aa4a6b8e6fd789, limb3: 0x142320e4351ea7b89b1ea055, }, }, E12D { w0: u384 { limb0: 0xe94b430873c2411e6cd80043, limb1: 0xe30be01010b7d9c627c228d, limb2: 0x51c2c7c9b4365780e79dc3c0, limb3: 0x6f3bceeb9b996819b8ca685, }, w1: u384 { limb0: 0x95c356530e86a107434237b9, limb1: 0x4aa9d2df5c497600a1e350a1, limb2: 0x59381ea2332d5b1974e07ee9, limb3: 0x3049a4a61599e5e8113f1fe, }, w2: u384 { limb0: 0xae504a32d9b39dfef2a23777, limb1: 0xd9da3a1a5469845953c6d4d7, limb2: 0x207cdf567143514f2d7f3fc8, limb3: 0x12974191549a6a396beba2bf, }, w3: u384 { limb0: 0xa112cd0e530a494b22dfca4f, limb1: 0x18ea6ce26c166e7a7d78de70, limb2: 0x9cb0e03de354d7bf6282702a, limb3: 0x909b63c04423c5894538c19, }, w4: u384 { limb0: 0x686333c3d129ac16d5d0ad66, limb1: 0xb15463f680076cd25cc96a52, limb2: 0x208b9c263e7d649bb3ac2736, limb3: 0x48c5ece6bb71a9d77de1d17, }, w5: u384 { limb0: 0x57e69dc9f02cc1dde9971341, limb1: 0xa7297c6bef065a6a9b542e82, limb2: 0xc886c7dab888b9c5b38236bc, limb3: 0xdebc617818a9847334705f1, }, w6: u384 { limb0: 0xe6056f10696a9817a2425aec, limb1: 0xeb0c85f199cd35e58fe7cbcf, limb2: 0xa246425777e777880b8a125d, limb3: 0xda706ead9599d92c2d65149, }, w7: u384 { limb0: 0x9bf16e33aedf71df2d4615be, limb1: 0xefff1d4d74d22cd6cfaa0d54, limb2: 0x8f7e66896dad6c69fb46b6a0, limb3: 0x6025284a12405855f01f281, }, w8: u384 { limb0: 0xc7aa07b19da3addbc2b2a7ac, limb1: 0x89af564addcf5ac140968e42, limb2: 0xb0f94c85c9d1a1140317c3f9, limb3: 0x16ffce50f413f24cc8399c64, }, w9: u384 { limb0: 0xc11681d83427ac2c574dd74e, limb1: 0xa76eee7857186b0aeae75d7e, limb2: 0xeccab02a3412fbf189e977ac, limb3: 0x184a0251d3a98256bf42b0eb, }, w10: u384 { limb0: 0x2c07fdd1036592df4a6f3498, limb1: 0x10f649a440ac4b37266f2219, limb2: 0x22a63f7af99b416d9bb930a5, limb3: 0x115fdf891425fbf6a4362dd6, }, w11: u384 { limb0: 0x411ed4c1110386e3d69aaad8, limb1: 0xc92f854a1d0559c20cdf125e, limb2: 0x948d25f76bb996b92261cdc2, limb3: 0xe201b9e13565fa18bba4420, }, }, E12D { w0: u384 { limb0: 0x2ee816637d0ff936afb8192a, limb1: 0x771b55e7479b197971b078f1, limb2: 0x809429f842e6085d43c2dfd8, limb3: 0x12623c6450560ceb87d1c6ad, }, w1: u384 { limb0: 0xeb6d6091ca6ac5b35b99eba4, limb1: 0xa6a7a574ab4b881d5074fc7d, limb2: 0x43a56d15e2274855ea77e5a1, limb3: 0x16be7b0f604c838b37f1e747, }, w2: u384 { limb0: 0x555b0c9f5c07106cbb3f5fc5, limb1: 0xef42d2fe6dacaee0528364c4, limb2: 0xbd41cc43f3df8706302622af, limb3: 0xe2dcea4824247cacbfc4297, }, w3: u384 { limb0: 0x93fb255d08dc8e71b39fb796, limb1: 0x1da87c5554ed815d4aac7141, limb2: 0xbaf8fdb0836e7741b324217f, limb3: 0x19e568ec730b0d8fd4db5525, }, w4: u384 { limb0: 0x200e327ef349bbef548d1776, limb1: 0xb2d456abe3bf1e04b5899611, limb2: 0xae05f54f4449a81f4604671, limb3: 0x162689b2975c2604e0a4685c, }, w5: u384 { limb0: 0xc6b02b729ad74be636166fc8, limb1: 0x2cfefc55cda91fd7a951573a, limb2: 0x8867af21f665b7a7fd8a6f02, limb3: 0x176cd52f992ba8fed217c160, }, w6: u384 { limb0: 0x6c354775c20d8791793669d2, limb1: 0xf380243d419f9aec61c9e9e4, limb2: 0x24ab6a5a78f417f251ab18b2, limb3: 0x19f302018bfc588d7199c144, }, w7: u384 { limb0: 0x52f43e2d2f77df98fb709a0c, limb1: 0x294172d5620df7163a2e150e, limb2: 0xf24eacdd84d1f5d70b8b68c1, limb3: 0x162d18d8dab6547e5a096d2f, }, w8: u384 { limb0: 0x892c129896da39f99f72f0e2, limb1: 0x2c40af61fe531cc67546a683, limb2: 0xbccbe0a4026db352047dffba, limb3: 0x8a6b4810628e934e1415956, }, w9: u384 { limb0: 0xa206e84f0a4d23df6ff06511, limb1: 0x8cbf6576156d7285ec9f1b68, limb2: 0x116d55d1a59d130f52984060, limb3: 0x15d4804fc77d3471b7bf1405, }, w10: u384 { limb0: 0x531e0c7406043a22ea3e34ad, limb1: 0x8d1faf249e41a0a2e8ac800f, limb2: 0xad7bce015e4d3978fb0cdda1, limb3: 0xf30f8063668661ca0ebd8c2, }, w11: u384 { limb0: 0x1533da47d1c4ea429dfd2495, limb1: 0x1c5bdfdd4dc1b9d6e11ffb51, limb2: 0x853362ef8f300727f4ea8d73, limb3: 0x2619aecebc65f8daf270bae, }, }, E12D { w0: u384 { limb0: 0x616ca54bea5ef71f6286e9db, limb1: 0x6ce5a76d2b62972a2ab13707, limb2: 0x32b53a08c2162aa1ee95a837, limb3: 0x128bfd33226c297592d19ded, }, w1: u384 { limb0: 0xcc4facfcbbb91a1e3c3a9aba, limb1: 0xa590e0a709daa71b0d6fd371, limb2: 0x906ab38c0a9cfc5bd91564f2, limb3: 0x14da16be5a21292efdfabb0c, }, w2: u384 { limb0: 0x81a973e5217a805d0f888a36, limb1: 0x58274f5c6f509cde4b0f4e5a, limb2: 0xc2440a9e7e7a7a859779f0ba, limb3: 0x14521550f97d6648241075e6, }, w3: u384 { limb0: 0xb2a9bd1fcaf992c0021668eb, limb1: 0x9ccf56b74f1ab26b6d6ab9be, limb2: 0x816fe549db002a04eedb9e09, limb3: 0x169e5ef8091dccbfaa89609f, }, w4: u384 { limb0: 0x71582a7c30020dc2781a23de, limb1: 0xfa09bff3c0432c74e8fb9782, limb2: 0xc060bc37bb18f1f165fe9f21, limb3: 0xd0d60bbfe488a8943c7382, }, w5: u384 { limb0: 0xe51c7d600a303222b1443dd5, limb1: 0x2c421d1581bad4b1ce684362, limb2: 0x240e5e597ff47e268342bc08, limb3: 0x2ae81d2fb3dbf1912e36c66, }, w6: u384 { limb0: 0xf0cc1dc4593248465748b59c, limb1: 0x9a31a99ab145a54bccce7dea, limb2: 0xed2c2e4617c78555f7d61215, limb3: 0x5e6d735233a245b22780211, }, w7: u384 { limb0: 0x88de0b5fd8db35069051139b, limb1: 0x52bcf4adb04aae5a93d1eb1a, limb2: 0x5860e277e6ce67cd26925a08, limb3: 0x1541095aedd2a87a36fce5cb, }, w8: u384 { limb0: 0xb79b773a3df8822db5cc474e, limb1: 0x17206d8a558c6ec7b445f402, limb2: 0x5aeeec6a9815c02665ce217e, limb3: 0x10abc052332b3bb7fc3fadd4, }, w9: u384 { limb0: 0xeaa86f676206f32bf7169228, limb1: 0x4432637a0bd250d8204fafdb, limb2: 0xc1396d9dfe01fbec380c12d9, limb3: 0xeae8fbe6d882b3953e92e72, }, w10: u384 { limb0: 0xf618e52b9429f1e88d3f1251, limb1: 0x1c25dcfe5d75ecd687176354, limb2: 0xf37879c40f1da5f52a2cdb38, limb3: 0x81232dec101c7c15928ab21, }, w11: u384 { limb0: 0x40b603d2425b79cd710ee557, limb1: 0xdbb0b89a3646397437da8f84, limb2: 0x60e361e4ee2f67acda38b14e, limb3: 0x88d292cadc4d714c0f31fc7, }, }, E12D { w0: u384 { limb0: 0xfde925b26590efd93b29dc21, limb1: 0x79fa334e9e39f1cf6d597f85, limb2: 0x351ca1e01bd6f669cfc33a39, limb3: 0xaacd403561cecaae25da3e8, }, w1: u384 { limb0: 0xfbf49b1ca286c7f34ca70db4, limb1: 0x52ae3e3ca34e2a102d3e8acb, limb2: 0xee70f348286b4f214b7e2a44, limb3: 0x19adc6e6dd23e9b87918f0d3, }, w2: u384 { limb0: 0x360cc29b8f16a161f0bb5695, limb1: 0xe23f0c483bc3484ccfbbf75, limb2: 0x544f00069e83cfa220de35a4, limb3: 0x145f89ec3fbc9c19593fae68, }, w3: u384 { limb0: 0x32d82fd5786426e4f0249f0e, limb1: 0xaac0cc9febb225961afd999e, limb2: 0xbfd0b5657b2f0e275599ec2d, limb3: 0x64ea70d1faa0e80ec792a74, }, w4: u384 { limb0: 0x836319c6483c95a22c9308b9, limb1: 0x9d0fcdd8c80002b659c474b7, limb2: 0xc44e2984149175f867392f06, limb3: 0x13fdf1738cceefd7c77fccba, }, w5: u384 { limb0: 0x38b69c65caedae1d60f4a6b, limb1: 0x476a63341944240588cd40a, limb2: 0x2c822ad9edb35cdb9398c48a, limb3: 0xfbd30b4e1561b17fad5975c, }, w6: u384 { limb0: 0xaa5dda2031d51398be5cdaa, limb1: 0x838072096046591839743da0, limb2: 0x4b2dbad7c26ef3e750e7e8da, limb3: 0xeda6a14042c9d4e7bf9b02f, }, w7: u384 { limb0: 0xfcc892c0fbf45ec567cf21aa, limb1: 0xad6b081ad539e5b3f081e6ea, limb2: 0x9e60e7c195d26421d13f4687, limb3: 0xe642044d3f37f6ea8897f42, }, w8: u384 { limb0: 0x9d04e86c9b4834f0738e451a, limb1: 0xd9105203107ce7a46d995976, limb2: 0x9706b8693910cb373cb60d32, limb3: 0x14d8f8c68cdab040e35a108a, }, w9: u384 { limb0: 0x9210fb0d45f1817d93bd99fc, limb1: 0x23c86949a3759639599da994, limb2: 0xdda9c2a5d34994981322c82b, limb3: 0xb4dc029e7276741f11943fc, }, w10: u384 { limb0: 0xe89745492c1f82b80e23c8d0, limb1: 0xb9c873781b1837885be73f64, limb2: 0x77070c688a2a77abbe11888, limb3: 0x86daf906e8a95c38a3b481b, }, w11: u384 { limb0: 0x72251fa4e076caba8d7e2596, limb1: 0xe91daee82b59abd08a9cb5ac, limb2: 0xc5e4c8122cacedd33cea5be8, limb3: 0x2fb080bcdfe8c56c90fca2c, }, }, E12D { w0: u384 { limb0: 0x6cdf3812d7d2ec500440d2bb, limb1: 0xcde664d9abf0e6043be0c188, limb2: 0x16e42aa6f1a259a62ebff4b, limb3: 0x144527f2e63badeffe2607e, }, w1: u384 { limb0: 0xc82526bfc5a307f2b9e9e30b, limb1: 0xdf63ab3c0f39d7908dde39ce, limb2: 0x257aa1bc6dc3a1e2b2cb1136, limb3: 0x4f7492f6a900520c078efba, }, w2: u384 { limb0: 0x5ae59b52a5576a972231e4f4, limb1: 0x6fdf79c79aaa7ee533f448ae, limb2: 0x9a6dd69f434272d73d12bd40, limb3: 0xbaa39a35a43b44bce2325d5, }, w3: u384 { limb0: 0xe504a48ed83f8bcd77382d00, limb1: 0x1fdb6ea298ac1c3c0af7522d, limb2: 0x56227bf372218d4677e592a8, limb3: 0xcaec0e91d882a292e585313, }, w4: u384 { limb0: 0x4f8be2e79b7ba3a3ac9da613, limb1: 0x7219bc5c36dcdeea294b1d83, limb2: 0x9f27e9cd48a9ee4d3e2c6383, limb3: 0x308909137cc1584e7cb9186, }, w5: u384 { limb0: 0x7834a99d69b1f3e2b42bdcd3, limb1: 0x300aced389ad9948ca1d8c39, limb2: 0xfe3f888a08ed761acee1b1c, limb3: 0xdd41de0f3e2890eefbaaf79, }, w6: u384 { limb0: 0xca9ab9a1739b5f5137d4ac40, limb1: 0x9ba2e33a23bc2b27e91bc510, limb2: 0xdc366bc48c0a8720af349c88, limb3: 0xc940b71841009914f7f29dd, }, w7: u384 { limb0: 0x7711c3dd44d84334bd207762, limb1: 0xba355253aea149c9d273461c, limb2: 0x8a45011ad06e5acfea138ae1, limb3: 0xd1b7d2bb8587892435f528e, }, w8: u384 { limb0: 0xd5c10f3e091a9acaf0886474, limb1: 0x626c2a14805abbb07cae8876, limb2: 0x66356be50aa68d09b54f071c, limb3: 0x3f1c0a601bbe3f6575e7477, }, w9: u384 { limb0: 0xfb4552ccdf1883dbe077d13e, limb1: 0xd8b4b21222a465176a4c7744, limb2: 0x7347818431aab5489408c638, limb3: 0xf9d77cf7abe38162019e8df, }, w10: u384 { limb0: 0x81aadeeb9df873401f32a628, limb1: 0xb93520f726c2d052f5b116d5, limb2: 0xd00b2c5d62680f3fc93d9a6, limb3: 0x17b559291ebbfe6e0574534c, }, w11: u384 { limb0: 0x9ad70ac80ce3b8527270dc24, limb1: 0x5fbd9b265250614247c4f157, limb2: 0xf0322eaaa789d68a0f83c8f6, limb3: 0x1323275b562dca758c81b1d4, }, }, E12D { w0: u384 { limb0: 0xaba7980a06ebfac9ddd04a09, limb1: 0x26ef9c306f336efa100b11ba, limb2: 0x40393c1afce51c8f52083a5b, limb3: 0x88c312a356277e9545f6421, }, w1: u384 { limb0: 0x50fe671710174daa78e31dcf, limb1: 0x5a2428575d62b8bbdc6bdce1, limb2: 0x18dbe1b6cdb06e3ecd5497b2, limb3: 0x63e9335b2697eb47a466830, }, w2: u384 { limb0: 0x243fcb55d2e8070937b2e5f2, limb1: 0xb3f0fd54bf8cd30335f72fb8, limb2: 0xdc36b46d1bd1ccd2d5c317e6, limb3: 0x54fa05e31dcddca0b10647b, }, w3: u384 { limb0: 0x178a369ede0d5f33b4088124, limb1: 0x688173ffe450814fda34adaf, limb2: 0x679b60cfa4fa68f7064b124, limb3: 0x5c210fb56be682d3515a22c, }, w4: u384 { limb0: 0x80e33e3e2bde4084c4ecc31b, limb1: 0xcc13974ef64aef9cde3aa9f3, limb2: 0x9f66e9c5ad97d198a2226f6d, limb3: 0x25b15dff2c6064ec8a6bc71, }, w5: u384 { limb0: 0xfefac90d2c27ea76fadfbdb6, limb1: 0xe6bcda36951c314c5fd2ca9d, limb2: 0x6b32e67596b531b9529cf2e9, limb3: 0x652300a58d5cd6e4e248a96, }, w6: u384 { limb0: 0xb39dcebf1162dc60631b50e, limb1: 0x9a904262c61ce054c078710b, limb2: 0xcc950e9965a1b3d7a42d94ac, limb3: 0x83f7f8554815facc18fdac1, }, w7: u384 { limb0: 0x4628f9c8fe8de0ab7b878521, limb1: 0xd4e2dc674f4251bb6dcab9c7, limb2: 0x5e6b8ac26ebd553eca2d6af9, limb3: 0xa69e14fdd6b8c0a24bc8494, }, w8: u384 { limb0: 0xdcddcf1a486e8fa5de038782, limb1: 0xda495c8e9a173872cff839fe, limb2: 0xd503a115971a590b4ca5c531, limb3: 0x140f92b94c08399b9f00c46, }, w9: u384 { limb0: 0xf45410cf50b2db223627396f, limb1: 0x518dc7a16e20322edfd1dff7, limb2: 0xb0ad958b70aea0c767e3cf28, limb3: 0x8d2d63cfd448ce80af04fbf, }, w10: u384 { limb0: 0xa26f24a5d5acdbebb6ae2597, limb1: 0xa754c3d093f65f02627ef393, limb2: 0xc700c9fe30406f4b29029911, limb3: 0x13f157503df37670cdec5bb5, }, w11: u384 { limb0: 0xf73127358c0f9e89e02146ec, limb1: 0xee6055a98cfdb3d7bbfb9469, limb2: 0x5e382cbaff9a0c1e152cfde9, limb3: 0xd2db85a3b0103b4fd8b4beb, }, }, E12D { w0: u384 { limb0: 0xb0034c0dc0470e3bd056c655, limb1: 0x68739ef9acf49ed16185f94b, limb2: 0xe5397364df8b3c4eccbd060e, limb3: 0x12bc87cbeb825883cab4c21f, }, w1: u384 { limb0: 0x9a4f283376c9c46e6f449d80, limb1: 0x3f034aefed75e2faacf1d862, limb2: 0x7716ffd86a4f3673375706fb, limb3: 0x3346cfcd71ef93e7f3e58ec, }, w2: u384 { limb0: 0x752d55436d4f77575db3ba3a, limb1: 0x4b21615ce3a76f38e73528e1, limb2: 0x2a79467dd6ca41febd836ed5, limb3: 0xe7558f44fcb9ba3b991a46d, }, w3: u384 { limb0: 0x90b74252285317a40a980d51, limb1: 0xf625a1046957406fd64d36a3, limb2: 0xdd287597f3eb9e33e82d2677, limb3: 0x19d79ac4ee250bd2e0f365fd, }, w4: u384 { limb0: 0xe7b8ebf0928a50cdc097ca80, limb1: 0x1c75acb67a4fbd8038084a85, limb2: 0x6700cd4270fb401157a956ef, limb3: 0x11c418010389f02167f7d294, }, w5: u384 { limb0: 0xe7311b3c007c2ffeaf935df6, limb1: 0x3a969f26bacb20feb532ccae, limb2: 0xad9c7997e6a29e0dae2f57c1, limb3: 0x31d45316bbd38e161892ba1, }, w6: u384 { limb0: 0xb836ac5fff285b97a9cfaf8a, limb1: 0x11e79fa6603cfd51966395a6, limb2: 0x241907be43b9b971573a8e1, limb3: 0x50b992346863b906e942433, }, w7: u384 { limb0: 0x77884fb393767a1d533c0b8a, limb1: 0x75a3dfc2b4ed6292b7de2d3, limb2: 0x8db56997d672b7b27505e3ff, limb3: 0xfd375b7c1ed070088edeb4b, }, w8: u384 { limb0: 0x217ce46babc14c3e6f804698, limb1: 0x8d2f38976a56c1930e0f9ef2, limb2: 0x206cf46bdd9bb85ec1788dfb, limb3: 0x69879bad0032e0b666ef550, }, w9: u384 { limb0: 0xfa6e30d2ab6ea25256a7006d, limb1: 0xad6c71121a695eeb476a4cbe, limb2: 0x9ded25624cae3f7bfed45fa7, limb3: 0xbdc0cac28fed44c8a9974a6, }, w10: u384 { limb0: 0x5f32e37fb43e4fbcd4382886, limb1: 0x25a8be4ff2142fae23203a90, limb2: 0x141071f19b469cc0cdbf36e4, limb3: 0x152a566ca9d531e91f06c8d3, }, w11: u384 { limb0: 0xa9e30bf7189793c3dae917d9, limb1: 0xcecc2f8cf114f38941cc16e7, limb2: 0x55a8efcb2983963fd1c5d7ea, limb3: 0xe0d3178bc1e4a9281acc39d, }, }, E12D { w0: u384 { limb0: 0x85d69f2d431d2c6f1afe22b3, limb1: 0xeb3b3ba1d64653e590a78169, limb2: 0xf2df045d48326a6371a5bffa, limb3: 0x120ea922564a9885abce0f6e, }, w1: u384 { limb0: 0x5de8b63bf3968b010da3bef4, limb1: 0xd788608863c1a08d747106fa, limb2: 0xde6d5d9aae8e97f0c2158038, limb3: 0x1832c580f19d3f73da7dd439, }, w2: u384 { limb0: 0xf2a1d0325fe6caa419acdc37, limb1: 0x90897834506f8faa6976e0b9, limb2: 0x200e730ee8dba54a64266bdb, limb3: 0x3f427d2880d6471c9b2cec4, }, w3: u384 { limb0: 0x854fb7b9e02882e8e2d3461e, limb1: 0xc7211649b2fbdb298e6b4935, limb2: 0xaa8bc4976bc2349ad9bb313c, limb3: 0x1557211bab3b60506b310219, }, w4: u384 { limb0: 0x485d0305732c8c1f4d6b6f2a, limb1: 0xfed07e935e4f20dda4935b1, limb2: 0x2504416e43da5cbf988bf0c, limb3: 0xfd13a11b696f3d323002b0a, }, w5: u384 { limb0: 0xb39dcfe5381fa64cbe569124, limb1: 0xfcc10e3db88ee4c11ab8b90c, limb2: 0x7f3dc79e449233c3c05cd4cc, limb3: 0x1a68d8218a4a298083c7ac2, }, w6: u384 { limb0: 0x402d97fd8c450137963dc715, limb1: 0xbaabab131fbf75f84b8c4d09, limb2: 0xeac1634a2ef470848b63e082, limb3: 0x18020a7c33b6e6def47b23a7, }, w7: u384 { limb0: 0x40747eb2ed38084318c5fd6a, limb1: 0x79c80f12fd1e9512f4c815d1, limb2: 0x3a48a5fc5d3e961ef0543995, limb3: 0x5c22e5ce258b23d32382246, }, w8: u384 { limb0: 0x58fdf5cf39bed59b75a08248, limb1: 0xf73f318ea3a19e93473249fa, limb2: 0x302354c7cec45c0f4e22be73, limb3: 0x45dc87c70a7f4551180d0af, }, w9: u384 { limb0: 0xea611623da31b1471f9b932, limb1: 0x32719fa75ff0141d7348d0e9, limb2: 0xb45905063c07e8c33fb9b2e9, limb3: 0x687c2df9d7f663be99d9468, }, w10: u384 { limb0: 0xf1d27eab29c68003c6c210e1, limb1: 0xb8843060c4bc968cb7982d1b, limb2: 0xeea7620d6be4c290ade9a4fa, limb3: 0x18fe77343f6e8206f89b9744, }, w11: u384 { limb0: 0xa444a56f7e397cfafb6930c8, limb1: 0xdae564fe2862cf1cdcad16c0, limb2: 0xbc4f53f2efefa51fdfac4891, limb3: 0x551ab423ade813eabb16804, }, }, E12D { w0: u384 { limb0: 0x5e957ccda4f73f9215fb110d, limb1: 0xdc36a49661989b5a3b5d79ee, limb2: 0xdec6eba0b4700511ff1300cc, limb3: 0x124c0cd615ff328b360ee2b9, }, w1: u384 { limb0: 0xb236047e323f07b02f2ec515, limb1: 0x583e5738966fa3a8aad40f7f, limb2: 0xccd1bc05a2119220b4544232, limb3: 0x780b2230acf081408bbcdda, }, w2: u384 { limb0: 0x260e2e2d6b359ac7810e7275, limb1: 0xbd1696a0a3bd92fa7fc31844, limb2: 0x742ff3c39bf81cbb48fa4a4b, limb3: 0xfe258a1791cd92b4ef3e60e, }, w3: u384 { limb0: 0x54d88d0d9b96f02414851b3f, limb1: 0x55334650ffc5ec8e900a1d3b, limb2: 0xad3cb70cc267b5f757f7cef6, limb3: 0x794700e48a5eb285c05ed22, }, w4: u384 { limb0: 0x1b66b0589fd79fc234125121, limb1: 0xbda857f94889f518fe44cf86, limb2: 0x9370106e7bd9937a478134d4, limb3: 0x167eb12b6b3572f0a3aca9d2, }, w5: u384 { limb0: 0x375981f086e8cb4ef19fc188, limb1: 0xbdbe1a3fc397484a93a2b29c, limb2: 0x7a02a3f5fa8210e8f14b2276, limb3: 0xc67f4b31546be3553dd2985, }, w6: u384 { limb0: 0x600f009107ab2a1da4997be, limb1: 0x69994acdcbfbe38056baf6f5, limb2: 0x11ccdd90a6781a41f22c760f, limb3: 0x13c5f50c127cb29bc0d17999, }, w7: u384 { limb0: 0xffe9f03f0aa94835f9525c88, limb1: 0xfdde4a867496327c5043cc57, limb2: 0x3f6144c573c696e50855fc1, limb3: 0x6b94fcad15ff18a3c2f248f, }, w8: u384 { limb0: 0x8884346bdd2a3341fc7322cd, limb1: 0x93ab61c19fa719030de7cc2a, limb2: 0xc757ba65e13b170ca901db80, limb3: 0x100f6a0711ba91a6f1b251b2, }, w9: u384 { limb0: 0x12a6e600d76166876d9b3f52, limb1: 0x414068fe6847dd8ebae8539, limb2: 0xa76a533d9740918d76a56dcd, limb3: 0x5dc91d58b53e3e96acd6def, }, w10: u384 { limb0: 0x718ec50c1dac99c6d874f4e7, limb1: 0x16d6a04ccba7bbefb03d6951, limb2: 0xeb4c2625dd73b31f645168c4, limb3: 0x6afd115d3d01e4b290b84e5, }, w11: u384 { limb0: 0x52b5c082cd25730db3a34738, limb1: 0x6967f7eb2ca4e4a712dc0131, limb2: 0x5c5e6c3183d02ccca35ce987, limb3: 0x757bb566047196e238a8b26, }, }, E12D { w0: u384 { limb0: 0x7c9854d25a3cb0be4d2f40d7, limb1: 0x43fd00e1f4a86259c11e88ef, limb2: 0xe994cfcb5001b763f7901bb1, limb3: 0x86155b09edadffde4dfbbd7, }, w1: u384 { limb0: 0x304a578df65f91fee6b573c4, limb1: 0xec0472b755f143bbb562ab87, limb2: 0x7277a095088372ca3f0a1d27, limb3: 0x197e53f43b82cae3374c44d8, }, w2: u384 { limb0: 0xe11977e635d061e6b989c868, limb1: 0x1e500845921807459e23651b, limb2: 0xbec3e77afae83a1c5ea6abfb, limb3: 0x14e286717a22a735ed2bc0ee, }, w3: u384 { limb0: 0xa1e676b1afa2d9ce1870874d, limb1: 0x7091d51696fde538628c1f6a, limb2: 0x96df8da6c99457376c4a33a9, limb3: 0x8e98a801b4c9ab4aa5d063f, }, w4: u384 { limb0: 0xc02c8f24e55e6d222f17ca30, limb1: 0x76dd4ee9d6b6332479504760, limb2: 0x197e8f329510abb24930400a, limb3: 0x16a154ff6848bf4bfdb82d9, }, w5: u384 { limb0: 0xbba922639ae8bf28d410a19c, limb1: 0x3086e9cd8bb7de09c46ea5d1, limb2: 0x38963f320b7441e9d6a77a5a, limb3: 0x12abf3a5df31ef34b735b45b, }, w6: u384 { limb0: 0x8a1312c4fa12d188aa5a2fc5, limb1: 0xc1a534c21fe8d43d46d061c4, limb2: 0x19cca041bdb84797c38dd77c, limb3: 0x90f272bc677afbf4ea47fdb, }, w7: u384 { limb0: 0x742fc53d89d385243fcac586, limb1: 0x9f1522d5dee448f1ea0bd110, limb2: 0xa6e48bd6c1d03e300f33a7be, limb3: 0x14f218097b54f125db0fa277, }, w8: u384 { limb0: 0x4e8d1c9d0611bff11b73be65, limb1: 0x1d75932dc0fd9604caeee1db, limb2: 0xc738ab9f0ad9baad911e4207, limb3: 0x6e45511232a9e5d4095e985, }, w9: u384 { limb0: 0xd52cce486c7f42104e9f3b7a, limb1: 0x58b30b3f567ae170e66d8aa9, limb2: 0x5e34ff47bd1c3c1eeda2872d, limb3: 0xe250f5f3302568adb516219, }, w10: u384 { limb0: 0x7c9a5e6eca301db139ad106, limb1: 0xc2b3cc3e715be6a7efe28f96, limb2: 0xd6d1ca55ddaaf9abf16efb04, limb3: 0x10c5de68ac532bc3f398aed4, }, w11: u384 { limb0: 0x5256c2f9aaa56fdfffc2caff, limb1: 0x90c30061f644a4c3d03f5830, limb2: 0x851db2eca15852453ab2d70e, limb3: 0x201ae57b8bd651a9a211245, }, }, E12D { w0: u384 { limb0: 0x107a402a8e5fd3d6694e2491, limb1: 0x2fcd3a87cd5349af3c857428, limb2: 0x5e7694bbf0930a85be56591b, limb3: 0x7d93547fc3384cad47215e5, }, w1: u384 { limb0: 0x2d9484d3a15699a7a1f5cdb8, limb1: 0xf1552b9e00277c8adf417bff, limb2: 0x797fa3b98f9243d4b02d9431, limb3: 0xee3f7dfe449d9914888e159, }, w2: u384 { limb0: 0x8cb567b9cd6c029b00fc4e41, limb1: 0xa86ba8941e760df1c880b78e, limb2: 0xe39f860fa3f881c589990047, limb3: 0xcd133ff0a3d963a38f16788, }, w3: u384 { limb0: 0x6e71601b16aa6640cfd5d5de, limb1: 0x1e4d16be3edc7039f570f547, limb2: 0xe015353d569f8688f394214f, limb3: 0x59546e8ca3e361bfa7f3414, }, w4: u384 { limb0: 0xcba11f8010fcb1b7018d4942, limb1: 0x1936e2410861c27516ef1950, limb2: 0xba1a67208cba4d4c43b6eb14, limb3: 0xf3d199823dda0ca4ce0f913, }, w5: u384 { limb0: 0x4141a8ab05e48332c7a97101, limb1: 0xc11b08f6a7ade95596c91b9d, limb2: 0xc60f61f46ada4e329659dad5, limb3: 0xc713a291ca63d714b43b773, }, w6: u384 { limb0: 0xfd82de6406270dbaa131943c, limb1: 0xd30c660ecf76e1ca4ca5df67, limb2: 0x7a3ac1af7f68fe980f73984f, limb3: 0x51b9df004712c0a919c1021, }, w7: u384 { limb0: 0xca9fe85418e99c70b24bfbc9, limb1: 0x6c09ab753fa1bd7e5eb72928, limb2: 0x29ac58579f2e59649b78e304, limb3: 0x19bd14410529841d8976139b, }, w8: u384 { limb0: 0x24dbe1d4f02d7ef87c2cb830, limb1: 0x16bd5c02c49e80904866a252, limb2: 0xaf1a9309f3303d6c367356ea, limb3: 0x1e19bba8cf8459f8f4dfd36, }, w9: u384 { limb0: 0x2d779d40ef68e8d88e174d50, limb1: 0x3e8cddfef78f63c6b4492711, limb2: 0xcc77ab33895f03cb0526a45f, limb3: 0x125fdd8cf5eb4cbf87136c28, }, w10: u384 { limb0: 0xdc1c3be866980e02cb6c6552, limb1: 0xa95aa3b3e5bd3b4f9e44b20d, limb2: 0xb044b29c621e7b2dad2234c1, limb3: 0xce6623d2aafe10b6e17cfdf, }, w11: u384 { limb0: 0x60124efd5e01a25ae6df0508, limb1: 0x721f5b9120ddb48b58c45e92, limb2: 0x1dd4bdf5f24d952ff670777d, limb3: 0x19f4d3c0a17c210e64fdc0d0, }, }, E12D { w0: u384 { limb0: 0x840e3de720a4548f1da7be6e, limb1: 0x3ac07781ccebe03234a3c070, limb2: 0x60a15844dc5503c9619d9185, limb3: 0xabb0efbdafc1bf8dba79909, }, w1: u384 { limb0: 0x35e738bdafcef08554231156, limb1: 0x152ec5c04b5d82140676dcb, limb2: 0x92b8cdb4123580d2823f3463, limb3: 0x6c6271bd78c3dc0ad928081, }, w2: u384 { limb0: 0xc0885cc50b00d5788f6bfe71, limb1: 0xe0e2e4020c8e3d3aad0bb4fc, limb2: 0xa03d4b3f246f40eb91edbd0a, limb3: 0x2ad754c710d3c5a0a9c8aa7, }, w3: u384 { limb0: 0x150f44c02d8d2ece9cc20e89, limb1: 0xbe88ea3462b0ac825a3f7683, limb2: 0x392c7bdfbcadea15c9ec3776, limb3: 0xcf868bdeb3044866e335299, }, w4: u384 { limb0: 0x5e373df33b60f49f245eeeae, limb1: 0x32ccc0c3ab265f108c87af10, limb2: 0x24b304890cb346fddc8baecb, limb3: 0xa5602cbb5588e7a5347043, }, w5: u384 { limb0: 0x79a45fc3a6b3476edccb39ef, limb1: 0x699737a3f0a37ccbf1351d50, limb2: 0x628e055199d024aaae669c51, limb3: 0xb7a54344f41ac4806f963c, }, w6: u384 { limb0: 0x56763ce8241e2e4c4ebbfdf, limb1: 0xc7e7f096be44dfd4045256dc, limb2: 0x59d483ad26bd43de0be0f89b, limb3: 0x115650afb40f7cc9bfc41d67, }, w7: u384 { limb0: 0xf761296c383bc157c0dc74d2, limb1: 0xf7ae69719276fa4a8f45a7b1, limb2: 0x9519a049398c825b8591fd3e, limb3: 0x116c67cb21786e95c1a81a42, }, w8: u384 { limb0: 0xf88348b16f829f538445e4ae, limb1: 0x5c59ddf4cb31896b683c0532, limb2: 0x34a2ed13f5d41b79207f2bb2, limb3: 0xf05b669ee27d19d64a44624, }, w9: u384 { limb0: 0x60c0435be32f160a839128b2, limb1: 0x5da4368729030e6e45435c2, limb2: 0xc3225b269d34d229f0daabe4, limb3: 0x16bd338ab123444102821db2, }, w10: u384 { limb0: 0xbe99f7a76adf1a39fcd16614, limb1: 0x455ad4d2c342a9150c205cdf, limb2: 0x6c7129df025ad6c248cc3e23, limb3: 0x117d45dac2232adcc3a58865, }, w11: u384 { limb0: 0xe7227b87d84291616d163423, limb1: 0x62f024ba3b1eeea3201b342a, limb2: 0xdba6e933ce41754f118a7c3, limb3: 0xb03ee9bfce34be38e903aa0, }, }, E12D { w0: u384 { limb0: 0xacbe4cc978644dd3b66d1251, limb1: 0x8b0827e7f460731253c48669, limb2: 0xce9fb3a4b707ceedf9e4ccd5, limb3: 0x13601ecdfe890ac5b6394083, }, w1: u384 { limb0: 0xf7595a279ff9c75a51e66dfd, limb1: 0xc142b5880c07598137eae9b6, limb2: 0x7a5bc2021f658c6a85627610, limb3: 0x132b8e30cfd8515a3df346f7, }, w2: u384 { limb0: 0xf6ba0f17bd64a508a34ff8cf, limb1: 0x74707c027b3fe929fc806de9, limb2: 0x22d365a315971b9f0c206a82, limb3: 0x19dbbd0c7f94d1f4ee79356, }, w3: u384 { limb0: 0x3f626447ce3814e02b1ec0d7, limb1: 0x5c8f6f2fcf4e7e35083554c4, limb2: 0x8dbaacc8bf9b1754dfc5c7a, limb3: 0xb35d9b7d542e11dc9367339, }, w4: u384 { limb0: 0xe625bd4cf03325a6336ecd5d, limb1: 0xc3e56498d973b972df22643, limb2: 0x4da8a81d2cb2053b00ea8fcd, limb3: 0xa642ca8b89b6a1c4e9877db, }, w5: u384 { limb0: 0x90a8380dd53bc5b94dbe3c0f, limb1: 0x2903c25cab059c295574f591, limb2: 0xb2377f88137b3e6b90d7ef37, limb3: 0xb7c1e72e24735bde787a674, }, w6: u384 { limb0: 0x4773b12414a16ce9d033310f, limb1: 0x9df89f470a41a445b7748c4e, limb2: 0xa96cdf868e25c1dfa2eae25a, limb3: 0x160d60066e34bef4bf67e8ba, }, w7: u384 { limb0: 0x97741dddbadcd502d93d1ada, limb1: 0x91f945eb520c5683d7d835be, limb2: 0x3acf7014131ff4db19eab525, limb3: 0xeefb54325e312a77579cfb4, }, w8: u384 { limb0: 0x9d6c29377b2addb30bb07eb6, limb1: 0x99fdbae79fab5cf167aff047, limb2: 0x5ade5a8e1c7b6bc090eab03b, limb3: 0x11d79b9562108c1f05e613e1, }, w9: u384 { limb0: 0x2a7b85423fcc9846cbd9fe8f, limb1: 0xd29258a1f3d53096b5ef7341, limb2: 0x6962bcbf5cd737335faf272c, limb3: 0xbcf4003e7213cf0a16d92a8, }, w10: u384 { limb0: 0x283fa69586ab328da624f05a, limb1: 0xe538df54e03534989f032f90, limb2: 0x8def2c7d92aeadbb57db8dd5, limb3: 0x1023a83a0bc5f302bc4918a8, }, w11: u384 { limb0: 0xf0dd374565f0c70e62ab7914, limb1: 0xdfb1156b56c464fa271bea64, limb2: 0xfb31d547c72f0e06b7e95d05, limb3: 0x199fffdc2a5a3333d46c2722, }, }, E12D { w0: u384 { limb0: 0x8f76261cf238884bdcac039c, limb1: 0xf1a631914c8ee95d8d563038, limb2: 0x7ad15fcf82a1de05d7ca78c4, limb3: 0x17d503bf7c0186f31fb87cac, }, w1: u384 { limb0: 0x12c73d43b1d6e5e93cffbda9, limb1: 0xc8f8aebf2cdb43903aaf1fa8, limb2: 0x5f1bb59cf75e973628df5a3c, limb3: 0x133637214037ed72a089671b, }, w2: u384 { limb0: 0x99b289b7c895e0389505ae3e, limb1: 0x807d96bb7abc61490b0b2ae9, limb2: 0xe901e5c6b224704f999bc014, limb3: 0xb1762e3a5ab01513e934471, }, w3: u384 { limb0: 0xc2991401ebd01d353eff0e10, limb1: 0x3f78a46de2ae77e99130d6c4, limb2: 0xe8076c850bd55b9dc399ef14, limb3: 0x1959a68b64e006097eedd9ca, }, w4: u384 { limb0: 0x31f962a10ef81a0e881e9412, limb1: 0xed29acc9384952f5e68bda38, limb2: 0x5ad6682fe35e6be9e495e035, limb3: 0x53290025191e515d71e6a4f, }, w5: u384 { limb0: 0x1826298b7042b45f2484b705, limb1: 0xf7754a63c6f36ead9c0722a6, limb2: 0x3e19ea5d2569e83b367df44e, limb3: 0x117cde4851820ba5a6d323a7, }, w6: u384 { limb0: 0xb2c4b66f8d495051b1e92716, limb1: 0xebf594dc49b44c3275b03925, limb2: 0x3e1e370a07e830d358d9d527, limb3: 0x17f0f608ef7e255a7740e438, }, w7: u384 { limb0: 0xf7eb9970e3d485405ed26e6f, limb1: 0x55504e6108e307d4c105fb01, limb2: 0x37e5a48b0089379bc4d3a960, limb3: 0x15542f45dbe73bde5df32e74, }, w8: u384 { limb0: 0xfc2e20fbd6973e5782d582f7, limb1: 0xb0d924870a4c93a0ee8de35d, limb2: 0x554637f24083718a82311c10, limb3: 0x12764367f85796814078b42, }, w9: u384 { limb0: 0x8fd5bd83ed527a4d26c45fe3, limb1: 0x43b7d218d10ff081da67bf2b, limb2: 0xf9fc937c157ca5ee08088e73, limb3: 0x119362054157e7dc5658fc69, }, w10: u384 { limb0: 0xcd2d08d72116be874d6ee56d, limb1: 0x77c4f1eefb4d35ef0221d5b0, limb2: 0xacf3b9162ffc9c289bbf6928, limb3: 0x2e08e8400c38ac22655b3d3, }, w11: u384 { limb0: 0xf4d15b649f3d55ead568462e, limb1: 0xb567200eda805f6453c250d7, limb2: 0x7be6abfce3538971d5c5f487, limb3: 0x9d5f5b42216ceaf147ac21a, }, }, E12D { w0: u384 { limb0: 0xd347ed30451ff201af63eeca, limb1: 0xad5110b2aeba89322b006323, limb2: 0xf82434189453d69149a0c0a6, limb3: 0x80326dc5e35502bbce7ac6c, }, w1: u384 { limb0: 0xc83c82247fb95b58a4ee3810, limb1: 0x31a8674c7e68d35d98762cae, limb2: 0x9cfbb7fec0c26829164628ce, limb3: 0x16bbaaedd62985c32f4e076, }, w2: u384 { limb0: 0x2fa6372a48bfbaadfa13763e, limb1: 0x5e40bda6de39b49e34b6cddb, limb2: 0x112c3d354dca6adf2dca4bbd, limb3: 0x31f3d996a2adee764770117, }, w3: u384 { limb0: 0xff3ed33234b352e29be10777, limb1: 0xa48ea598a7173580b764c4b2, limb2: 0x4f673c656ed817dd15a35331, limb3: 0x2789ee0833b95e2a631106b, }, w4: u384 { limb0: 0x9ac4d1b96cb51db76fdbee0b, limb1: 0x803a0ddd0255fcf6dab7617c, limb2: 0xd6b0af076d77742457695aff, limb3: 0x43761452a76341901155087, }, w5: u384 { limb0: 0xbe44dbd432d048dd243c8bc3, limb1: 0x98d9d4bdc6a8954684fcdf2d, limb2: 0xcfba6c2b4124b837319047eb, limb3: 0x8a9e73497aafaafe182bc19, }, w6: u384 { limb0: 0x8a3b064f566cf7a95dbe7548, limb1: 0x3a7f64c477a6e83e434ce861, limb2: 0x9ba7cae92f44149908673e10, limb3: 0x45103051f125fedb866d95b, }, w7: u384 { limb0: 0x5ee818e7234e7272ec07f3d1, limb1: 0xdd4bc27187a7d422aa6df86c, limb2: 0xcbb7f78d9fe849c55f5caf73, limb3: 0x1862b91a119174f1c7aff149, }, w8: u384 { limb0: 0xd08c79a7c7850cbda627d11c, limb1: 0x9d4f4f86dbf4a4ac0d4606f2, limb2: 0xd464fb70944a1feb5e7f92f0, limb3: 0xd5b0522da04c9aeca0608e6, }, w9: u384 { limb0: 0x3dbd70f614fc2d3eb4edbcb8, limb1: 0xcc386604b029681e5d5de15a, limb2: 0xa03d1c9d026d090768bf5861, limb3: 0x55ff5a76816f6d652fd986a, }, w10: u384 { limb0: 0x9d633d1f35aea7549904415e, limb1: 0xb6d0d361ca6497edc9faa721, limb2: 0x6d5289bb547465b3be8c6ad9, limb3: 0x985850e8cd4013c4b6d95cc, }, w11: u384 { limb0: 0x7cb50dc102dcb28e77742892, limb1: 0xe2437d8286205ad782d6b72e, limb2: 0xda1f62195f31b4783bab661d, limb3: 0x15ecca5677df076e39049bb8, }, }, E12D { w0: u384 { limb0: 0x9d72d5db64cb7507239422e0, limb1: 0x264e7e57b7260676a8bb7688, limb2: 0x7344113fcc925f1d30d06dcb, limb3: 0x18de0ecba8fd3371b8aa34ca, }, w1: u384 { limb0: 0x1861183cc4b2f46d87979e5c, limb1: 0x6e0a01a25c6ebaf9464e11e, limb2: 0x7f2de4bc5dd520e1c25ddd85, limb3: 0xe800e85c928ae4a62b295f1, }, w2: u384 { limb0: 0x947b7670a81523ba7d89ed92, limb1: 0x14b12adacd332e3d09706640, limb2: 0x11e97f9c6bc126a2f82ea1e6, limb3: 0x10624939def344ec8c1b3cf4, }, w3: u384 { limb0: 0x3b6a7bcdd62aecc44c37866d, limb1: 0x4f090d678ea45519842d182d, limb2: 0xcebc7bf7f3c10bfd2e6639e9, limb3: 0x1631faf829d85ac9c61de59f, }, w4: u384 { limb0: 0x559cd524045548ae86151607, limb1: 0x6e006893ba4aa3699195e31e, limb2: 0xdc1c446eeecc785b43fb9a22, limb3: 0x123202194c62a4c9baccb009, }, w5: u384 { limb0: 0x11fcaa3dba1a600b6010182f, limb1: 0xf01f5f9fdeb3c498d7b7cb06, limb2: 0x882cc64b2d18415e180078fa, limb3: 0x8b267ee888fef3cd7927dfb, }, w6: u384 { limb0: 0xd6b28085df279d9394b5a7fa, limb1: 0x763cd39e04067be6fdf56c8, limb2: 0xe6dc2b118d1a64282a465791, limb3: 0xf5493b733d5896bc5700fd3, }, w7: u384 { limb0: 0x90a1f465c6e97bcd81222eee, limb1: 0x7149530fb2e4319be2323f28, limb2: 0xc88a2ea7d5e7ff07ca2ad206, limb3: 0x162bb34dcd7e91a975c63630, }, w8: u384 { limb0: 0x170a35595a61d913f682b57c, limb1: 0xf2c9e682be5246c93b4e6ec3, limb2: 0x2bf4029c422908fa4563de, limb3: 0x641187d200dfd28e8e82aa4, }, w9: u384 { limb0: 0x6fa76ba0131b78d2942cadad, limb1: 0x3bb0f673c1a7b42445c6acb0, limb2: 0x60a06dde4ec45da8ec121095, limb3: 0x20100c6e96666951b26138c, }, w10: u384 { limb0: 0xf0b483b7fa8c7e7af338816b, limb1: 0x56d359ad26375fcae41714a3, limb2: 0x873b27b4fa0b116a18158d0c, limb3: 0x12e72267a31cafa207dd8dbc, }, w11: u384 { limb0: 0x77cdf664971600615baaec2c, limb1: 0x26bf00719aa6690f5b19075, limb2: 0xdc51ab3277d503c215650c3e, limb3: 0xc0f9441d20276e0db93c8e5, }, }, E12D { w0: u384 { limb0: 0x49b8bc0bba1b3b3e63506f5f, limb1: 0x69ae08affd3b257cc0d8bdc, limb2: 0x721d9ad5b76a8ba8f139dd3a, limb3: 0xf8ac0fbc40271dc9a22eff8, }, w1: u384 { limb0: 0xe9e8035fd0a006b598845454, limb1: 0xdcc25fc32ad1942d93a350ee, limb2: 0xfd77a0ec6e37dc33615964d1, limb3: 0xb75169082563e4c6f1be90, }, w2: u384 { limb0: 0xefd32d50a707ddbd100ee51b, limb1: 0x810cdffcb09eae39f48aa1e1, limb2: 0xa18a7cf96101b979a65ff7bb, limb3: 0x6cd39500720118321f2738a, }, w3: u384 { limb0: 0x26986ba695a566d0262b9ee7, limb1: 0xaab9e0bdc5aed6c48fa8efda, limb2: 0x72f6704bebcf7ac9af380ed6, limb3: 0xe16ceb416196f23bc2560a1, }, w4: u384 { limb0: 0x7762c889e40661d695e0dffc, limb1: 0xb8bc925ae8124f3b8c369b23, limb2: 0xb522ccf634c91621e1559f97, limb3: 0x5bacf21780b28756242dcc3, }, w5: u384 { limb0: 0xf90a60c0d778d09b834b48c3, limb1: 0x3c87554e9260971b487713e2, limb2: 0x71220ad4dba9858bfc12ccac, limb3: 0x16db742f5078344568720d98, }, w6: u384 { limb0: 0x485a9dcceae19bdbf2dc0cfc, limb1: 0x8e2f65401be2d31c093c53c, limb2: 0x8238a47a96eb2cde2677e2b0, limb3: 0x6039568233497b9222dfbf5, }, w7: u384 { limb0: 0x6f64078fdd7a425f4436d862, limb1: 0x64d28a2586ab1e7f2bf280f4, limb2: 0x1f66c4e09e8145a306b09bea, limb3: 0x813c1ecd8822f2944b930ae, }, w8: u384 { limb0: 0x4060ce7fd6ea39ae7a74236c, limb1: 0xd45a1c125ec3bc1614862318, limb2: 0xa88ab4b47d71797470a4ca95, limb3: 0x68574f8aed261828f2ba0a2, }, w9: u384 { limb0: 0xc994b57f3410a4503912f0db, limb1: 0x76871514e839d62296d23629, limb2: 0x2fde71411b384900f656ab6c, limb3: 0xdeebb1943725d48b9cdc7cb, }, w10: u384 { limb0: 0xf3ef74f709c6cb45c21cd12e, limb1: 0xd720f3876bdd542b86eeeb58, limb2: 0xb85aea0cd816c09909b4d88c, limb3: 0xa3ce54f3ee833e0bae2cb1c, }, w11: u384 { limb0: 0xf8c6ec38f3b7f955775e2832, limb1: 0x716a5e0f39967a70c5bd78be, limb2: 0x61f2e36cf96f821d6a3287d1, limb3: 0xf19ea07493d608bae66bea0, }, }, E12D { w0: u384 { limb0: 0x83b19eadcea71010d1565cfa, limb1: 0x4825e294172616ab26e7eb20, limb2: 0x54d4259a351535c9cbd1c6a4, limb3: 0x241d155f21449ca4b5addf7, }, w1: u384 { limb0: 0xde3e245c2756d991ab554365, limb1: 0xded567d010568eb5ba3ce705, limb2: 0x327429176a50f14bdc580858, limb3: 0x156807de27314670790e7ca0, }, w2: u384 { limb0: 0x66bb95d7a4d98dfc50ec8fb1, limb1: 0xc3c8058f329d30723233d845, limb2: 0xd30b40aaa7eebcb481e5f715, limb3: 0x6af8fbe105e0796a8e398ed, }, w3: u384 { limb0: 0xa940b949eb2388785b224608, limb1: 0x1cec59486fc6a5cd144a91de, limb2: 0x11402b75ed1bcd6cd14590ec, limb3: 0x7f1086112d77b89f7582269, }, w4: u384 { limb0: 0x8f257f0a1e6796e78b8f951e, limb1: 0x48f84ddb963cadbfe5e55521, limb2: 0x6e427ce34296e0997e34bb67, limb3: 0x1358d67c804b33fcd6dccd26, }, w5: u384 { limb0: 0xf29a7dc92df446d59d0ae4e5, limb1: 0x823d3505088601b6a6610c21, limb2: 0xec67638c41976d4b1caf835e, limb3: 0x15c8e64bbf555ac7f232789, }, w6: u384 { limb0: 0x658317131159794cfb897b2a, limb1: 0x3efb5096028939e901d050eb, limb2: 0xb364141abe4f342b2d342e4c, limb3: 0x697dece994d9f1cfd79f309, }, w7: u384 { limb0: 0xaadcb5f26d03fad4f28df12c, limb1: 0x492f0e081e52c8c88fce9f44, limb2: 0x29717b344f24a9ce5704183b, limb3: 0x77175c6d4b377dbafe0e4fe, }, w8: u384 { limb0: 0xea668960f018818ab2dc143e, limb1: 0xd1b189a93d737c7c9df377b2, limb2: 0xc326f49a444ae09fe755412b, limb3: 0x9347fcd49e2293efb0a78de, }, w9: u384 { limb0: 0x17514b18815a49976674c5f2, limb1: 0xeadf8c7afaddb62cb39d0e85, limb2: 0xb3bad6f772ce35db00653f13, limb3: 0x17fd638fda925abc9867be18, }, w10: u384 { limb0: 0x824d407e1486549861a4f9b1, limb1: 0xd708e8188307765b7e7b5c71, limb2: 0xb458d64fdc3cfcae7d504007, limb3: 0x11376135f9107c7d85f2d49a, }, w11: u384 { limb0: 0xdd930da650b850fd475ab204, limb1: 0x6d1c787f7452a96d6fe58ed2, limb2: 0x77fc37156b99d375a7d16ca6, limb3: 0x2c52abc9192f9453d49eab3, }, }, E12D { w0: u384 { limb0: 0xa1f4bb4ceda1931c829fab23, limb1: 0x804ffc41249665a2790a0228, limb2: 0x1de01e71f91960ccaf6c410c, limb3: 0x81b2c2ac7a57744e8e9b410, }, w1: u384 { limb0: 0x130433d5494eebebcfd9df94, limb1: 0x99364cbac719f5f41ddfa380, limb2: 0x3f29270ecf71851f43731a20, limb3: 0x1145c70e232f053297295621, }, w2: u384 { limb0: 0xec442113c386176b32efde95, limb1: 0x7bd862d3003678d9531d9c1e, limb2: 0xfc594d12f8c8b42b2e4d6b90, limb3: 0xeeb75363b656d3ec3fa9b09, }, w3: u384 { limb0: 0x222852bc2d918bd1ac5f63f, limb1: 0xfe7d5faeb604de77c643a175, limb2: 0xc65d389008dc614c33e685b9, limb3: 0x180b7b07d9590c95ef7c4d32, }, w4: u384 { limb0: 0x970068a4b9eec3828487ea39, limb1: 0xd9327df1470019283e338516, limb2: 0x5952d080bc8bc07c9a246b5f, limb3: 0x188de0056afd14bfc26980e5, }, w5: u384 { limb0: 0x1f95997064e7188584c76d47, limb1: 0xba3e7e6239cb59b9630224f1, limb2: 0xd02ab63f0952c3a26ac56788, limb3: 0x6c3f71d101f157a0eb5e8c3, }, w6: u384 { limb0: 0xcf705d3f30333b45aeb056b0, limb1: 0x3ded81674542b511276368b0, limb2: 0x1a953a0af3d55e115c95e424, limb3: 0x12c2bb84d66b242ac047d7a9, }, w7: u384 { limb0: 0x1d84fb17c565be3824c9eb81, limb1: 0x983f3cef4c3580414e1c63d8, limb2: 0xc6f813385e3fce4ae1a9f4c7, limb3: 0x175fdf9433765408fdfc601a, }, w8: u384 { limb0: 0x6c61ac267d1db760fbeaf92f, limb1: 0x20b3d2e50bab22ff0da90069, limb2: 0x54860d69bdb67b696fced45c, limb3: 0x15f95850b768b8a0f63b96d5, }, w9: u384 { limb0: 0x3fa62e0c86ad1d63fbae241f, limb1: 0xb30f2dea012c94c9c26d22f, limb2: 0x61befc67d0413374617f46f8, limb3: 0x4078076119540c4a20693eb, }, w10: u384 { limb0: 0x25e4fe7a019eedeaa28ff1b, limb1: 0x9324c0e779bd0c9fcd27f7e8, limb2: 0x24d326b0d8a8c42d982f21c1, limb3: 0xdfcf7aef0bf4098ae68b1cd, }, w11: u384 { limb0: 0xfe63a0539935bee31d38ec22, limb1: 0xd033b49fee05e4d97bd6842c, limb2: 0x78d04ec2b510789e14ee988f, limb3: 0x17aba0964ab1ddcdf413639a, }, }, E12D { w0: u384 { limb0: 0x278d77a81d602afd5a52947, limb1: 0xcb5c30044228bb45093b0d90, limb2: 0x8e471498d8a8be03dade312b, limb3: 0x19beee76172ad8aa02dbf3dc, }, w1: u384 { limb0: 0x7c77ce05c4c305a7dc0e5b4d, limb1: 0x7bd3f5e81744c8fbff1e9d10, limb2: 0x30ea7f32e968b9454c93c8ca, limb3: 0x13642c30cde1dbf6af429fd5, }, w2: u384 { limb0: 0x595b8c57681cead9648c7acb, limb1: 0x689d10dae2cc8e703e53a0e, limb2: 0x29ae6fb08dc277565e3505c9, limb3: 0xcf96b5bf70d0ccc001f3322, }, w3: u384 { limb0: 0xd1b554ed5518219199f34526, limb1: 0x26ac3af216434fe1ed48aa17, limb2: 0xc07d051d9daf7c6e095e8aa3, limb3: 0xd6c203b2d9e77cc0cd40bb1, }, w4: u384 { limb0: 0xab65021306a36284149c06e7, limb1: 0x4e3f42db62b95d309ced3670, limb2: 0x76fb0b0b7954df85d0d8c050, limb3: 0x5101d7e82eade26493678b6, }, w5: u384 { limb0: 0x7a6b2765b8a9ccbaaad5c828, limb1: 0x7f4e8febb620ef2bc2d7a407, limb2: 0xd30c4bf4b5860ebfbf7e3b9d, limb3: 0x14d20e5825a0cf0631c843de, }, w6: u384 { limb0: 0x84f1594b851f0ddca968e8c5, limb1: 0x3a6491a30f5721041f7581c6, limb2: 0x9169d487e761ae399b754ba9, limb3: 0x530b8c30d14555dddbf8776, }, w7: u384 { limb0: 0x57ad58f9bd5592d446a6b748, limb1: 0x135c76ec36e730bf679e1619, limb2: 0x549cc33448758c73223137e8, limb3: 0x55d3b3769b18c8c17597c38, }, w8: u384 { limb0: 0xcb42d1d43cdf605892d0b23e, limb1: 0x2197b1bc85e160f4865d08ef, limb2: 0x37c01be0fe47d2cce9adbb3e, limb3: 0x1553b94e1939110d4b99fc57, }, w9: u384 { limb0: 0x6fbad2a03ba0aa5de69f43d3, limb1: 0x765a3a8b3a2f959e767ed7e9, limb2: 0x4316e351dc01ca2da29b0710, limb3: 0x8183e742bf50ac5b25c5617, }, w10: u384 { limb0: 0xae282d2b795b5314b7f53f0d, limb1: 0x7a64af990d741c0fe71b0b64, limb2: 0x4fecda665a2e9c0826568d87, limb3: 0x914cd3723446a757562b82a, }, w11: u384 { limb0: 0xdb326552a864fae27e34e3c0, limb1: 0xbfd09d5d1e29af9e9d992c5b, limb2: 0xd6d7663d363167d6317a28f6, limb3: 0xe66725a5996b856981dbff3, }, }, E12D { w0: u384 { limb0: 0x925f1548a2586b3c83acb844, limb1: 0x353b125c82d3547bb22e873e, limb2: 0x66e1c1174e42b65d840ce5a4, limb3: 0x16fbfde31f733d31881cdfff, }, w1: u384 { limb0: 0xf48a04b2ecb65b0ec1ee74a7, limb1: 0xd3ce0c326344e634d721fb34, limb2: 0xa30496b2da7fb2ea97b754d9, limb3: 0x107d126f58ec9e97c6cc8e71, }, w2: u384 { limb0: 0xd2ffb5a8958fd358b9a0db9b, limb1: 0x402808c39b52369ae59fd83a, limb2: 0x3fe0960e8aa72beb2fa961d9, limb3: 0x166dc226ccb9eff556343907, }, w3: u384 { limb0: 0x8df0689b8854be488ecb991, limb1: 0x4795a4cc43a8d4530c1ad931, limb2: 0xb3bc8527ab33e10f80cfde20, limb3: 0xba7ae8be240e9d11a287d8b, }, w4: u384 { limb0: 0x7f368c6c241b048fb218dbb8, limb1: 0xa2476498a10081bfa027924e, limb2: 0x56b88e4492e6f0c99fa165f0, limb3: 0x18a38fa4ee9f26ba78fec53c, }, w5: u384 { limb0: 0xe98903321b25313c95f003dc, limb1: 0x31f82952f9329bd9368402e7, limb2: 0x54ae4abaa3d2432318e04599, limb3: 0x128f6b10489dc4631361966f, }, w6: u384 { limb0: 0xd6c9252e840a0651da685774, limb1: 0x20c689e5be6b3d7db49e75c1, limb2: 0x49de02ce0f57209e965aab87, limb3: 0xb84356ad3a02a7a23840580, }, w7: u384 { limb0: 0x4feb2265d9e9cfe5347bcdef, limb1: 0xdbf93707cc036c505a681a7f, limb2: 0x991dae2fc5278d2e4c49b442, limb3: 0x581e622fe997190ffcaff05, }, w8: u384 { limb0: 0x4fed4adee961344d7de4ce04, limb1: 0xa2179aa116019af6aab8119, limb2: 0x390cfa09d93c9cf5d45a6f51, limb3: 0x301f95a1cad02ce95b9e7f4, }, w9: u384 { limb0: 0x839f077e7f1268f3969297a, limb1: 0xc6678bdf10aac686ea78af9e, limb2: 0xbded8a9b29e5e041ebcc7d56, limb3: 0x16f210725bf2a00ce33bb7ad, }, w10: u384 { limb0: 0xa0b68df81c8f7dce35651343, limb1: 0x948b8def6ecf0f2c1235607b, limb2: 0x9cacf2c2c4cebabc980ba63c, limb3: 0x88eb934296e671e6ca4b0bd, }, w11: u384 { limb0: 0x5d277be91e70605270b0736c, limb1: 0x31a5c600c967c11668a20a8e, limb2: 0x8ca866246a7e7d273c67c89c, limb3: 0x1717a1fd9cd5ec3784a48c7e, }, }, E12D { w0: u384 { limb0: 0xc0cf5bb3ddf86547fe00b03f, limb1: 0x261d5fdf16216b0b5b2fd0af, limb2: 0x5090c7ece64dea3b6ef1fe9c, limb3: 0x127241b7afea2d881250e65, }, w1: u384 { limb0: 0x6e263d81f4a3f1c877c39333, limb1: 0x1410d9bf499e755eea959c02, limb2: 0x6ae0b4fa4bdabd77d6114c95, limb3: 0x18b34ace95b722dd2f0913af, }, w2: u384 { limb0: 0x9e798a325b9b9324627d90a7, limb1: 0xe44be7d37275a6b9307a4d70, limb2: 0x60a94c03db1b4341044162b0, limb3: 0xc5e0af70498faeb66e96c7e, }, w3: u384 { limb0: 0x62c3ec64962f4b5dfd4957e2, limb1: 0x175b2e34bc0b79de8b26e5ac, limb2: 0xd00c44dfe200edc1823d4127, limb3: 0x1f9c390217fc2eab214ec8f, }, w4: u384 { limb0: 0xca1db3d196ebee4afcb49439, limb1: 0x76c891130d535411b8d13bae, limb2: 0x1346242621dc20c966481630, limb3: 0x62a4a8737ee4ed122146323, }, w5: u384 { limb0: 0xd89259ce24c1bc3c80b4c31b, limb1: 0x6916e85ee261583718b5be9c, limb2: 0x614b567f265ccea1c3bf6c88, limb3: 0xd63901d756cb9c4f6e4ebf, }, w6: u384 { limb0: 0x2854083be3f609fb5747a0a4, limb1: 0xf9363f130c8a061ad4454dca, limb2: 0x99fa1036b41a93c9bb5f04a5, limb3: 0x10be26b58c1e20556bf90eca, }, w7: u384 { limb0: 0xcaa7afbc5dd33d0090d478eb, limb1: 0x33bac5729659b2886831c90e, limb2: 0x8c228f55fb3b16a6089cfc9b, limb3: 0x1425aa18228f951444e69bbe, }, w8: u384 { limb0: 0xbd8aa0ce83f76fa3d6195952, limb1: 0xa49e1c3f96658b0c6984d0e4, limb2: 0xdfc5f4d167ad19270de11602, limb3: 0xe8f8eb7f390acecb765644f, }, w9: u384 { limb0: 0x7fa94e38426b019637ed329d, limb1: 0x8a030e40d455c8eeb294aee7, limb2: 0x62c6e010ad31dc3e8cdfd551, limb3: 0x8d9ba6f08f065d3d6b80ab7, }, w10: u384 { limb0: 0x6b2cb77e359c675839c57ed8, limb1: 0x4ece0febc3fb31c9c799768f, limb2: 0x20e25d25010860a327da0640, limb3: 0x12eb1699559e1e7b06f3d0b, }, w11: u384 { limb0: 0x5fcbf346dc790bb6c9e48356, limb1: 0x8e7801394a1a49b06320bbd9, limb2: 0x7ac8d93c05e1831764f8daf5, limb3: 0x102edca82e8f1857ed209bd, }, }, E12D { w0: u384 { limb0: 0xb15ad72f4fcb2591d1abc46c, limb1: 0x74d4a9d3481b818b70fdb5eb, limb2: 0xf8210ae9f2b7df0516a267ba, limb3: 0xd5a2800ca938c6f7c3113fb, }, w1: u384 { limb0: 0x38b065590c2e60fe7f44767f, limb1: 0x7eecabf14ae695b8a3360ed8, limb2: 0x9985104a902c20936ea57238, limb3: 0x124695215443652ba7e6cf22, }, w2: u384 { limb0: 0x1f9841b55fe2c623f1078c67, limb1: 0xb9c8a90b95c1f3344984344d, limb2: 0x2a340ad73875dff79e1352ff, limb3: 0x18bd138bc116843c32beff0, }, w3: u384 { limb0: 0x56c68b860cbcfc33006bdf0d, limb1: 0x52813de6808192f9b0c7811b, limb2: 0x4fc72a2832a54a2c1377aef, limb3: 0xc240bb809dfa30523851f3, }, w4: u384 { limb0: 0xaf85594768f62ada3aff44ff, limb1: 0xff3854a044fc5e69851ba430, limb2: 0xb47e8573d120728f31c90440, limb3: 0xcaf2c186c804f855cfa2c4d, }, w5: u384 { limb0: 0x4e380f88b214dbbab34dbebb, limb1: 0xa77d375a8f3582d99d8e771c, limb2: 0x7ff0478d6f4c30522d5cf061, limb3: 0xeda4fddf15c6de3928a7494, }, w6: u384 { limb0: 0x53c092ef68bc25c37d25fe15, limb1: 0x3fd91dbc6dc8c4ce23ddfec8, limb2: 0x2f533a2c53b9bc59f7da808b, limb3: 0x54ea204f43fc3cc511e2771, }, w7: u384 { limb0: 0x874484b23512d69c64456edc, limb1: 0x4bae99896f81ad7e8b33986f, limb2: 0x315ae13e8f7eef39bb5fc6f3, limb3: 0x2e3ddb5c86a0d7ffa46ce19, }, w8: u384 { limb0: 0x6ec7f3337526ebcca0cd7a9f, limb1: 0xd48463f9f2d1f19c3853fbb8, limb2: 0x7e348340df28aef8d2b5b0d, limb3: 0x7180eed89e074ef58739ed8, }, w9: u384 { limb0: 0xbe6bdfc582a702b560a6e04d, limb1: 0x592fe00300d974cb544bb609, limb2: 0x5585618cce120a0ca8ae3b06, limb3: 0xd8b2fbd00859855d8059c04, }, w10: u384 { limb0: 0x14bf3cd112d125e4e25a3e65, limb1: 0x811a1021fa6981370e82b3d3, limb2: 0x2458fd0cced7cade1c669de9, limb3: 0x7c3ff3ae5fd17f6a1ce0359, }, w11: u384 { limb0: 0xf1c60ca1b056ed5abf67e04d, limb1: 0xbc819ca227d2d48d19f96458, limb2: 0xb390024831387ab08e67c776, limb3: 0x5f4a62df64a479d75594956, }, }, E12D { w0: u384 { limb0: 0xf65ce3527d75962dfe24a3f9, limb1: 0x91e01eaad05aadc43322e7bc, limb2: 0x1749b8efc10800f0117b9ada, limb3: 0x63f0bc72657931f9c4c0ec6, }, w1: u384 { limb0: 0xb0a176acec5241ab58a92fe4, limb1: 0xfff6673048e856befecc052f, limb2: 0x3aabf57172cbeea4e5656e93, limb3: 0xf8b8f049c1f37ea1b91f865, }, w2: u384 { limb0: 0x591f822c01335afd1788ae6c, limb1: 0xacb21dac6272701a054407c5, limb2: 0x27c93a2906618dc8eac1c17, limb3: 0x135348203e2ab3a8030bab8e, }, w3: u384 { limb0: 0x83f8664aa234b6ef1bee1838, limb1: 0xfbe202c883895731f698255b, limb2: 0xb8ab5bee5b71245380d5a22b, limb3: 0xdd0f12d1fb706b63a83e4f6, }, w4: u384 { limb0: 0x6c00eabfeaa8a1e18d743643, limb1: 0x35082c7740b28bed8c2911c4, limb2: 0x705d87b2509c7563f2f9cd83, limb3: 0x355565388006efda83748a9, }, w5: u384 { limb0: 0x721da2148c278de04ea6b48, limb1: 0x1223b5e9df2c7ce207e3cb29, limb2: 0x9fd921169ebea2d627e0e2b4, limb3: 0xca348e51467605b1891750f, }, w6: u384 { limb0: 0x567eebe72695309b8b9fa49a, limb1: 0x9b2ed7c13fcd5218178f6c36, limb2: 0x69db0caedd82eb26178db3bb, limb3: 0x10b37cb311f6f5db3cf04ead, }, w7: u384 { limb0: 0x1c36184bcddcb3bef030a967, limb1: 0x30f09d8bdcd920ef630b29da, limb2: 0xd99cd4ca8ee16996294d6867, limb3: 0x14b4ecde21559c315401a904, }, w8: u384 { limb0: 0xbff20fece07ace4ed15c0801, limb1: 0x8c641efedb23644ab9dac1b6, limb2: 0x65ed2f82940530717a3a8f6, limb3: 0xd6faee36c1be2a6bd80aad3, }, w9: u384 { limb0: 0xa45919c319e86e4c7cf0a9aa, limb1: 0x2c3b3dbcd368facc0fa8a97d, limb2: 0x18bb74bd046abb617241aa0a, limb3: 0xe6a08b13a47fee0dea5d182, }, w10: u384 { limb0: 0xad46273f102a1a28b7ea1210, limb1: 0xbd6857d74c142f5b0750a4c, limb2: 0xa179b4418056dce93b5d5ebe, limb3: 0x8edde64f71a1e7a8d5c256b, }, w11: u384 { limb0: 0x40c84a2231765e3ccdd1fee2, limb1: 0xe23fa47d96e3019174e1e708, limb2: 0xda247b93ca36f321d7e891a8, limb3: 0xf3dec99dae8597e09aa6441, }, }, E12D { w0: u384 { limb0: 0x5c071fe7249396da8890e55b, limb1: 0x88bf9396d97ac96c8ca065b9, limb2: 0xaa1bd31d7ac0d0063932745b, limb3: 0x4f008c1e4e917d1a0388386, }, w1: u384 { limb0: 0xde583cfef9c2b34ea6b3a860, limb1: 0xe79957b07ce9cf7cc9d7b0fd, limb2: 0xf9e5d92728e5fee33eb8a4c8, limb3: 0x7921cbfbdf11fda5479b251, }, w2: u384 { limb0: 0x7fcb1d0ad133dcac3db9691a, limb1: 0x8b34904f9f4147431e803592, limb2: 0xaa188d2c64f4ffae74679611, limb3: 0x6311dfa9565d635c03e0855, }, w3: u384 { limb0: 0xc6e8d1386e240defd0c8b358, limb1: 0xd916b51af6ef639109f7f064, limb2: 0x84f668ddc480ae7a6282e8bd, limb3: 0x14514e50d271db4c38f25c17, }, w4: u384 { limb0: 0xc05129d365f445bca7481a4c, limb1: 0x732f03651202c5d590aef375, limb2: 0x861a12d79020a018d52dfb3e, limb3: 0xf5779b069bb04e8aa65b1b0, }, w5: u384 { limb0: 0x49e85a71966f4085bb96a561, limb1: 0xa90812c10e7c338efd62e260, limb2: 0xb4dc3c8f6b473eeff051c55, limb3: 0xf162180ccd92f8be4baba3, }, w6: u384 { limb0: 0x1fc53cda9e145b9f2fc0958, limb1: 0xbc91a2f7fe6c04e89954a778, limb2: 0x713a21c6c35bc119e06027c9, limb3: 0xb945c61f5ef234c3f61368b, }, w7: u384 { limb0: 0xfc851571d35721bd06ad24ba, limb1: 0xb0cc8ed633947c99cc26b4bc, limb2: 0xa96709e905b2f0a160cc731, limb3: 0x13bb465d841c0df6abe9d8e6, }, w8: u384 { limb0: 0xf420c15aaa99c651e4dcf96f, limb1: 0x27cf47ecb908e16bb29a5fd, limb2: 0x5c212064d3152d60db688c4, limb3: 0xf132a5857b7a6c50640125c, }, w9: u384 { limb0: 0xd596517bf0328136d09b30d, limb1: 0x731fc3434888560bb4aa0036, limb2: 0x89171b1a244c1520a1e52cb7, limb3: 0x13a4065c684afc1509831b34, }, w10: u384 { limb0: 0x62b192ba8953068ad2beeb13, limb1: 0xf55df8dc4798f0c1303be1fa, limb2: 0x5586b58227a76995ce18ab1c, limb3: 0x1765d0dd29b138f1e15317a2, }, w11: u384 { limb0: 0x194160a75b09ead5c093d1f, limb1: 0x55458b207983cc60044cd893, limb2: 0x2ec1346ee6df706c64efdd21, limb3: 0x1889fe7577e0886013ee76a3, }, }, E12D { w0: u384 { limb0: 0x83a64d1fbd12b2105fd006de, limb1: 0x1fed0ced58ffc1247b300226, limb2: 0x40c7a77d43046a8dc496e8f7, limb3: 0x1273d35b2a7041c0c8e09fa9, }, w1: u384 { limb0: 0xd1bc518cb9f97989e4518323, limb1: 0xfda16e1ba8f5eee22baff865, limb2: 0x2282715ec39be7c1d9c05abf, limb3: 0x14ca6298addcce08172693e7, }, w2: u384 { limb0: 0x581296f543f611452833a9af, limb1: 0x8f7d57a9ccf015a529c0274f, limb2: 0xf4cec85b20feb49320169086, limb3: 0x7294cb9fc3914e72a74f677, }, w3: u384 { limb0: 0xa0d1c30484f8d800aa47cf33, limb1: 0x7896af58662828a8134758f5, limb2: 0xf8bf1ed82532b434dd6745f9, limb3: 0x1480045d9cc01e11e67e1744, }, w4: u384 { limb0: 0xab14069003747ce311deeda8, limb1: 0x46aee3ebf1505f27b11a43d7, limb2: 0x441e3585d1d14f573a862938, limb3: 0xa693eb56c06023e67761b5c, }, w5: u384 { limb0: 0x3b5aa1d13ac4ae07439068e1, limb1: 0x6bb8a4c24c1d85a23c028385, limb2: 0x356f653ce96361ec3cb08dd8, limb3: 0x19470f3488d1b42c710e0403, }, w6: u384 { limb0: 0xc6d25ab33b45985888bbb03d, limb1: 0x2026eb4eebc11b2af25c91fe, limb2: 0x84aec238c5ba5499a91244ed, limb3: 0x16ff44f85dcd5017d4f39ab0, }, w7: u384 { limb0: 0x6357ebc232777ec4f0019a51, limb1: 0xb2cf574426b91619de6260c7, limb2: 0xf3c73b5a7864f2a9e9df5921, limb3: 0xac8b2e81bf45ba782379164, }, w8: u384 { limb0: 0x78111c1a35a4b111e381ee5b, limb1: 0x87cbda1cc35fd4ffab98097f, limb2: 0x3785ba57e275cc071106468c, limb3: 0x887d372d0e2fe0e53316176, }, w9: u384 { limb0: 0x4a426c4f5b404cf8f9058f36, limb1: 0x6f4e2e0c8dca076756efa639, limb2: 0x574294ee9354db253276ffb9, limb3: 0x16453113da3cd9edc0f268cd, }, w10: u384 { limb0: 0x980837e72a53e6da4c4922bd, limb1: 0xb4f32169b47b9f2ab0864b73, limb2: 0x85967069c73e3c636b70e667, limb3: 0xe5e15629c61068bb9a3bf3, }, w11: u384 { limb0: 0x6b4e751b6afbfdc1286e2037, limb1: 0x2dceab2a8fec6a14f9f2a926, limb2: 0x67ac3d207965577ee1e47a15, limb3: 0x16526e02b5ea0131ca58ab70, }, }, E12D { w0: u384 { limb0: 0x17309de18596c600420fa7f1, limb1: 0x6ecfdc0a3cc31fcaf8050eac, limb2: 0x609fdb67c2d4bbd1da92d235, limb3: 0x17a9bc9c95045b9efdc7f8db, }, w1: u384 { limb0: 0x1c460122fcd6b6ece46d69fe, limb1: 0xcddd726c39b803c9d61e2ff4, limb2: 0xb314bb778d464e80e5137e80, limb3: 0x15f7cda48b321f00b848ba73, }, w2: u384 { limb0: 0xdc79881f76b18acaeca0693a, limb1: 0x5ced5bc216155207131869a5, limb2: 0x25abd10b17bb130a7edae34, limb3: 0xdc3c019b632e3991d4a6b8a, }, w3: u384 { limb0: 0xbfb097d9e966f087325bf903, limb1: 0x3fb4262eebf93492bbe3ff8b, limb2: 0x997195ae28496678b778b068, limb3: 0xb656130b375669e276ed9f1, }, w4: u384 { limb0: 0xc537baabbac6f92b3d4c43ee, limb1: 0xeee6011b5932150b96520428, limb2: 0x1632d8218fb9bf323d52bc24, limb3: 0x1206adf0e4af46155081e668, }, w5: u384 { limb0: 0xf12a97149fe018fa0dd0605f, limb1: 0x27ce7eaabf9c6f26f66d2e41, limb2: 0x869e24a6417b5fbecfb2ae7c, limb3: 0x15359c4c6224b1be86a615b0, }, w6: u384 { limb0: 0xc56549e245c6bbf68d09bc30, limb1: 0x90446e06fd1130455ef711ac, limb2: 0x343d611550a4e05dc84d901a, limb3: 0x198fe7d93aad83e5f503de9f, }, w7: u384 { limb0: 0xb0c7c0f44e04ee29115cb4e8, limb1: 0xd222e0c76f9d55a44b4eaea2, limb2: 0x9ec62b435c34f660f31beca1, limb3: 0x5b9706e9f1da4dd9d3cc2e5, }, w8: u384 { limb0: 0xf05234158a8a37dc15fec48a, limb1: 0x31d75743addea81c0d768a59, limb2: 0x460db2475e22f9cd60b2af15, limb3: 0x9c8e0f3693a433d950421f2, }, w9: u384 { limb0: 0x17b4ab8ab4d7825f202b8075, limb1: 0x6cb9c1f003024631fa0a9500, limb2: 0xfa9afda884aaff4eb0ff2eee, limb3: 0x92e1623974d20acee9fa952, }, w10: u384 { limb0: 0x6c311178704be9f7e65ec330, limb1: 0x432fab41537509fdc218bc65, limb2: 0x12ee9a3189d387cff951a877, limb3: 0x19a486fdde7a19ec3f4ea4ae, }, w11: u384 { limb0: 0x848acd4e5e19ac8787ce01e, limb1: 0xe23b95c772890cc36eb7edd7, limb2: 0xa78e19bb81ea2fefc9e5ee40, limb3: 0x98b9fa87c52256357e6ce9d, }, }, E12D { w0: u384 { limb0: 0xb1832e7be4513791a1b5a318, limb1: 0xdab8acfabf82ff15fabe8bde, limb2: 0xd1448ba915158cf8dd685915, limb3: 0x8a3480406ef8ab208c666da, }, w1: u384 { limb0: 0x7dc6f41df1fa7200a0e5046, limb1: 0x82afd83d6d865f579b9d987a, limb2: 0x3010fccb8d335ce1762c467c, limb3: 0x12d4daf068c14b93bf91349a, }, w2: u384 { limb0: 0x53b9d0922336710ddf03e6e9, limb1: 0xa2f7a6a8b7ea63dc7d3e5ce8, limb2: 0x2bc0e8f29fedb1969d4e5f70, limb3: 0x19f8ad2a13f5789efa24f88d, }, w3: u384 { limb0: 0x7fc2bba69df28a5e59bcf7e2, limb1: 0x93d61d335ab812d0fb5713ef, limb2: 0x86810bcd2b84909a86b9b8c2, limb3: 0x5c4bd6acfb17dbb0de99e92, }, w4: u384 { limb0: 0xabc6617ab0841c6fdd54cf71, limb1: 0x496bdff2baf9ba636d2800ca, limb2: 0xb46135c83828d48109162fc3, limb3: 0xbe70db79d790397b600b4a7, }, w5: u384 { limb0: 0x3aa09c6a57d7e89443f7196f, limb1: 0xd3c78490ef6a135ba4118eda, limb2: 0xd35cf1052a2161b3d1d9311e, limb3: 0x3a504798d0df370f6dc9e00, }, w6: u384 { limb0: 0x946105209210749c1ad130ec, limb1: 0xe6944ce1875edfee81ba5ac, limb2: 0xe803f442e26a40d80220321b, limb3: 0xa69d4ea6d1551c43e86ec33, }, w7: u384 { limb0: 0x7725777b6dd3a778505d129, limb1: 0xcf8f223a0ba7f0d56314005, limb2: 0x50b6542d68bb7e41cbac597d, limb3: 0x6773d995348c78185a125af, }, w8: u384 { limb0: 0x47dd4b505ece4e63c6a42ab9, limb1: 0x47b66fcf40b4579f8e7dafa8, limb2: 0xe1e00a837a5913248e2bc9ec, limb3: 0x122e42c9101c0f785e0bf0ac, }, w9: u384 { limb0: 0x320bc6a9543249df447ca30b, limb1: 0xae128dc852cdae534003d880, limb2: 0x2acf697d73ce229710a1db6f, limb3: 0x169fa56b9fe0085cd1ec32e7, }, w10: u384 { limb0: 0x9c3dc69b716e4c8b8a63f106, limb1: 0x7b7677044476f901b21ea7b4, limb2: 0x42e2af7bb87210cb120f41a7, limb3: 0x179117c4bf7aeed19202d38a, }, w11: u384 { limb0: 0x578af2d1c50886a02d13c7eb, limb1: 0x1d251a678674e497bfa5141e, limb2: 0xd5efc634d0cb4c7c1807787d, limb3: 0x60538a49b6f95d8179548d1, }, }, E12D { w0: u384 { limb0: 0x14663ec8aaf41e9dac839168, limb1: 0x8320d3931ce0be5febdaa063, limb2: 0xe8a54f2801c82ff94d4af442, limb3: 0x1537d76fdb6fcc5e66d13c05, }, w1: u384 { limb0: 0xc408aeca0ef982f1d4919f16, limb1: 0xacf15993d11ed9b848098954, limb2: 0xe710b0aeaf54ebc0e4f53ef, limb3: 0x1172e3f6d60f5b8f8275f3a3, }, w2: u384 { limb0: 0x807779f90c7ea090ec58037b, limb1: 0xfa1c670f3d46124c0962b69f, limb2: 0x812e66dc9ca6554d3d5fb28e, limb3: 0xede7d1b272245097eeab0ea, }, w3: u384 { limb0: 0xfac578f3346be762844bd2ec, limb1: 0x994ad6bbf2b2282021651555, limb2: 0x20bd8715803ee77607e72467, limb3: 0x7606e734900bc75f36d5948, }, w4: u384 { limb0: 0xc1ca06dc742aede8e3ed91c5, limb1: 0x71d50ee0f44520e8b6e60d54, limb2: 0xd0e04e25c2746017e5d029b8, limb3: 0xd44f1471bc3b841396c63ee, }, w5: u384 { limb0: 0x8863d4db6f58c06706c68dc, limb1: 0xcd8010d2fe2689df15faab2c, limb2: 0xe0bcfa9b2100aa2f75a3064b, limb3: 0x198af1ae7a81661000298cf3, }, w6: u384 { limb0: 0x584eba278a62b05b865d0046, limb1: 0xfd3905d4620e04d59c9f9db3, limb2: 0xb3a6714f1f875f49e045d5fd, limb3: 0x109ae235efe54330fbaa8ef9, }, w7: u384 { limb0: 0x41056d92722bdd9ef745bb95, limb1: 0xa49b528aa11e35ff72e1fde6, limb2: 0x9a18ff2224ff861ac716668c, limb3: 0x47387893d8d042ea3a4f516, }, w8: u384 { limb0: 0x6f24529271fb5203cfe12902, limb1: 0x310663d10c2acea99de8b04, limb2: 0xb5e0fae90872f9a49eaded38, limb3: 0xd4cdc64cb2b7e85aa244f97, }, w9: u384 { limb0: 0x99ed80f6330c7657ae9b36fa, limb1: 0xb4ecf4f1f9cc32690999e417, limb2: 0xd6a74b7ae48b6f4307720772, limb3: 0xd55e06f38a04ecb830f50ec, }, w10: u384 { limb0: 0x824deee4997b239c579cdfdf, limb1: 0x64de788297270c01860e025d, limb2: 0x2c570777664a58e9ed48b38e, limb3: 0x9845b19e98f1ec8238c635f, }, w11: u384 { limb0: 0x13e8cac3d7640ddbb717cd3b, limb1: 0x2bb8aa759817d4f5a47fd7b0, limb2: 0xa1d374b7e02465a35189b692, limb3: 0x351a9dec88d73a12476d425, }, }, E12D { w0: u384 { limb0: 0xc5619e330db7753690d3e4d7, limb1: 0x47612532deb6199b29ae01f0, limb2: 0x526a20bf47a55f080f9bad08, limb3: 0xcda6894283305a7ae037814, }, w1: u384 { limb0: 0xd01df400ca021228f79039cf, limb1: 0x5079235d8e615126f16b88a7, limb2: 0x6b29bb389bdfc6cfc202e4df, limb3: 0x4c469f79ecbf88cf78fba60, }, w2: u384 { limb0: 0x392c76f20e657cca0412ccd2, limb1: 0x8a03a9b1522a799165f5ce90, limb2: 0x3f1c10daef22f593d0c939e7, limb3: 0x114680f68ccb81f99a98d2e3, }, w3: u384 { limb0: 0x1a5d475778ed021bbba71dff, limb1: 0x3c1dcef8127eb06e3d386b6d, limb2: 0xa18b55a60be13efc53be2643, limb3: 0x430d7536307562e71e3b624, }, w4: u384 { limb0: 0x33b945b9e91a613f214c281d, limb1: 0x5246a0bb4a3b5e88b2a556f7, limb2: 0x76952d20fa901063986b5af1, limb3: 0x30dc626b4efb4dcf45dda85, }, w5: u384 { limb0: 0xc91f47f926bf741f50167758, limb1: 0xb283412e7dec1abf2af4b54c, limb2: 0x819210cc10240985a197b6fd, limb3: 0x148983abd0919160ca75ab3a, }, w6: u384 { limb0: 0x3ae52b385b8d7ccd1149b186, limb1: 0xc2fdad714d3b4f3b44c34b05, limb2: 0xa2594e80b8a3d876c89a7dd2, limb3: 0x17e8e95e2e4453a999120f47, }, w7: u384 { limb0: 0x4143d9f9eae7ba680e4ce790, limb1: 0xc6428a7db6bcfe2c09ff2784, limb2: 0xb6c49338a7f200baf9ba7b62, limb3: 0x110a8b846f24a8e5a48f8df8, }, w8: u384 { limb0: 0xec6894f7048d74cc521cfa9e, limb1: 0x7a74baa8349402edd473262e, limb2: 0xa587bd8ba9d0db61105a9bfb, limb3: 0x1542de51d10ad154d14d1ab1, }, w9: u384 { limb0: 0x623d3472956a6fd9dfb57f1c, limb1: 0xbc706464f02579b27b176261, limb2: 0x5fbba85d07f3b4037c86332c, limb3: 0x389948fb6649d454eaafd78, }, w10: u384 { limb0: 0x3d6160146d3ee8bd841a82d8, limb1: 0xe798a563e2e9319cc47c6e26, limb2: 0x534d22ca0ba24f883387c567, limb3: 0x8724e1114e6e80541a91631, }, w11: u384 { limb0: 0x274eb7f12825b047a3a3289c, limb1: 0x64eaa3423e2a707806fe1205, limb2: 0xf84ab17d32acb39a3dd6c673, limb3: 0x127600c6ca9df9612df7b2e5, }, }, E12D { w0: u384 { limb0: 0x3796de51981f6024fd06174e, limb1: 0x94d83a402696f8c183f7eaa0, limb2: 0xc9225b2cfd7c3d5c24574a05, limb3: 0x10c73e67a277a6aae451031d, }, w1: u384 { limb0: 0xf896b5516da8d004534d0d5e, limb1: 0x13d040c8b2eb76307a8963e2, limb2: 0x4106bcea580d4e5cdbac42fb, limb3: 0x194bcf981b8ad069b42ef14f, }, w2: u384 { limb0: 0xa01d5085551a704cf0fc81f8, limb1: 0x6f550724287ce9ccd035e27c, limb2: 0x4ff8a38afc93789bc77d11e3, limb3: 0x15387fd205f34ad531fb7495, }, w3: u384 { limb0: 0x2d86600edfa521e03bd1e1c7, limb1: 0x91911144ee37f4bda9841ae8, limb2: 0x7013dc289771aae3049aa557, limb3: 0x1264774c7cad53e0ce2c2512, }, w4: u384 { limb0: 0x7b8d55a4e9537ae0138637b9, limb1: 0xaedbff15cf4e9d82355484c4, limb2: 0xfa1e2235cecbef2155df3ba, limb3: 0x151f2f232b2c641091433b1f, }, w5: u384 { limb0: 0x72ec4e504cfb5f2b309e1b1b, limb1: 0xb307889291791d9836f74c5c, limb2: 0xcc60fb54fe4ebb3c834028fa, limb3: 0x73d28c074b6d0a9bbb93a6e, }, w6: u384 { limb0: 0x42714ec1b398c2646a44fc8c, limb1: 0xf9c8174e936e14a688589f9b, limb2: 0x74f6aaa1b47f90087951593c, limb3: 0xf56e6232d6c70f9bfc19e5e, }, w7: u384 { limb0: 0xe304f2b0d829f6d2faa65947, limb1: 0xa26f23153498cde40f054342, limb2: 0xfba50877ef63e16fa824a815, limb3: 0x1256debfa10663438ea50adf, }, w8: u384 { limb0: 0xc757cecbeefd79b47270e6b5, limb1: 0x3fb9d4754903dc457f7597dd, limb2: 0x8a9f050e1077482a52f7bef7, limb3: 0xb1d0a3d278779c2252b7aa7, }, w9: u384 { limb0: 0x5092b50f667acdababf052a9, limb1: 0x67c7132abfda100e74791ab9, limb2: 0x679b7be1175e7dab6bbf7b8c, limb3: 0x769778649047c85b6580077, }, w10: u384 { limb0: 0xfd8979bca7fe4209f707b3a6, limb1: 0x9ec62bedcbf628a3ceb18d29, limb2: 0x319886ca998f583080ae6e1b, limb3: 0x381d855df46f8b4c2c9d6a2, }, w11: u384 { limb0: 0x5724976349a32d6f327568bb, limb1: 0x17fdebce21bdc92e64f8196b, limb2: 0xeac82f3bc4b86e5d8147ef45, limb3: 0x131358e92a4dd1ca0ddb2c80, }, }, E12D { w0: u384 { limb0: 0x35716cc42b7f43a8fc723ebf, limb1: 0x22fadd338e2c25972f85dda1, limb2: 0x46872acb9511d7767537705b, limb3: 0x155d2de74effe44cf4798599, }, w1: u384 { limb0: 0x376ac4e9b575568e825c5a73, limb1: 0x2769ef9a9f77e879b6b8a6ec, limb2: 0xa666a8e2ee113b3b4567435a, limb3: 0xc6b84a04fd0d0f116ad9e5a, }, w2: u384 { limb0: 0x59d60284544cb1eaec05d203, limb1: 0xd6cf07d6abaf48adde29bad7, limb2: 0xf08eaf520c0bc5fe6b8eb966, limb3: 0x8207e1ac978f7a918c110a2, }, w3: u384 { limb0: 0xbbdf9ed2369c8b7b97583800, limb1: 0xb649e54a0e1787927560a57f, limb2: 0xa914d51f826065538792be78, limb3: 0x16b5820f317d590fbb5896f6, }, w4: u384 { limb0: 0x43ec6635aeecccb9d2c29f78, limb1: 0x8e2372e1b0e3678817be3069, limb2: 0xd78c8144a0ea302301b30a98, limb3: 0x17a61c387bd1ad61e28354de, }, w5: u384 { limb0: 0x4c34bc4845eec9fe3a68d75b, limb1: 0x314780d022648ad56cb24a5, limb2: 0x585a32f768086f1fdd9a8da, limb3: 0x1324f29ce3b3d74e74b08b03, }, w6: u384 { limb0: 0x223401b4185f66cb102dc565, limb1: 0x46f3ebee9b04e69f007f8111, limb2: 0xf8ae83de384f52416b6be2, limb3: 0x13727dee2bab50f43deaa793, }, w7: u384 { limb0: 0xdafd089f3c769cddeb63c576, limb1: 0x4329764ad1958fba5407edb3, limb2: 0x832c80c10c3981b2d197d42f, limb3: 0x14a64986d3b0dbbf0297eac8, }, w8: u384 { limb0: 0xeec166dc39802b9c81e08f7, limb1: 0x61a05c9d1447aba4d0279bbb, limb2: 0x5a891acf231010014c92af9d, limb3: 0x42193c8d6a9bccd990e962e, }, w9: u384 { limb0: 0xdbe5765f57be1a326f0b78bd, limb1: 0x3417ea0001ea3efb8c6de325, limb2: 0x80dfc16ab0411f7cb6727faa, limb3: 0x19415881fac9b97f02c3a6f8, }, w10: u384 { limb0: 0x6440e9bb2320475c39624871, limb1: 0xc39741e3212573abf24cd446, limb2: 0xddb817e1e7237e88f9285a4d, limb3: 0x98fa9061f0a765886c03c21, }, w11: u384 { limb0: 0x91b97eb11b2b9466c4781b02, limb1: 0x98c2e0826cece826f5d1e2a, limb2: 0xffdc08767b9c38eb95323f94, limb3: 0xdb9012a8490308dfbd1ec31, }, }, E12D { w0: u384 { limb0: 0x3942fef601ca6d254a68858b, limb1: 0xea9499ac5e6f2d267cf812f6, limb2: 0x1ddc6c2df9859ff4f2adf48d, limb3: 0x2f04749264cbba7320d82c7, }, w1: u384 { limb0: 0xea370966790afa13e5a15b8b, limb1: 0xcf600ddedf1922470eb6c8f4, limb2: 0xcc3b2095a20acd637561e075, limb3: 0x1099a2649fcc6f0876de42f4, }, w2: u384 { limb0: 0xf7c03af81a901c952bb74ab0, limb1: 0x73344a8772689f0e65751dc, limb2: 0xad18a2477643704a0385cf67, limb3: 0x6d8fdc35189573632dcc97, }, w3: u384 { limb0: 0xc40e849145b8a6ac81ba9633, limb1: 0xaf7eee8a3d8b2ce1ee4f3450, limb2: 0xeb5dc70d8393cddf4b749d5e, limb3: 0x3a16616e0857c168005f567, }, w4: u384 { limb0: 0xa46376638fd600b1522df0eb, limb1: 0xd54238ba273db8846de529d5, limb2: 0x5c999239af48c2ee8edebd55, limb3: 0x4573d87029391d0d65f209d, }, w5: u384 { limb0: 0x320028c1a7a461ad9eb19b21, limb1: 0x3b1235187099e3e7eccea674, limb2: 0xc63359900cf9bea379c7c265, limb3: 0x181ece5056a99b30368a01f7, }, w6: u384 { limb0: 0x67c40b01d45218cb7c9261ed, limb1: 0x5f12224f9bc6f6b0f758ed7c, limb2: 0xfe65e99f9dba2b226f3bdb14, limb3: 0xefb00660b8c006503becde6, }, w7: u384 { limb0: 0x98835c191b00687892a50c84, limb1: 0xd4ce327a1cde229daaf91062, limb2: 0x41b55aa7f2b569fbe90125b3, limb3: 0xb5ddb3660a32eb070881b79, }, w8: u384 { limb0: 0xdf1e95ef6d2b993d5a1909e8, limb1: 0xa22871054afc0a86111e80ac, limb2: 0x65699d8354776199ea73ba7e, limb3: 0xad1800f05ab0f5361037f95, }, w9: u384 { limb0: 0x332c0317051a794c9dea2cbf, limb1: 0xf8a485eae6c2e410a7f79c41, limb2: 0xffb6acfadd9e81a1d72f7ab5, limb3: 0x4af742d5ef004df236eac2, }, w10: u384 { limb0: 0x6e7cd75aecd367d01b025d90, limb1: 0xea672964fdc59edd7195d82a, limb2: 0x9ef714a07f2ab07c12d493, limb3: 0x11a59352336ea017c4cf99eb, }, w11: u384 { limb0: 0x499742508d3b02cee2ce2e5f, limb1: 0x2a7cd0175d28e3847c94e3a7, limb2: 0xba1633b10be308ed90e705de, limb3: 0x144cf257dd87eb064641dc1d, }, }, ] .span(), big_Q: array![ u384 { limb0: 0x1bd71287e4906779ed3d3a26, limb1: 0xd6ea2055c878317e8e522dd4, limb2: 0xf4fe9582467798093d5d263c, limb3: 0x11c2da419a6a8b9d227ad990, }, u384 { limb0: 0xc4b64371b43a0cbbaf9d662e, limb1: 0xab2cfb720c7749414576a711, limb2: 0x92a2a7b9b8fe2b36c9da54d2, limb3: 0xd7d0a6b6ef80b6d591b0389, }, u384 { limb0: 0xfd068547a7981576f0c4eab4, limb1: 0xe3208a0cd42c834c885e3eba, limb2: 0xc9230cd9a7fe97e5b519d330, limb3: 0x8c3edee1458190d7fc7671f, }, u384 { limb0: 0xfec91f076649b9094b9dfb07, limb1: 0xa86247f16a24f3301ca06ee1, limb2: 0xfe14f3967c8dd011c2464c84, limb3: 0xe55d8db7f7697b9b674fb85, }, u384 { limb0: 0xa6b137189875f80342ffbaa2, limb1: 0xe37567e386092f9fb4b918e, limb2: 0x76317540dbdb5389182fdb22, limb3: 0x19535a1856bd170c6b1566d2, }, u384 { limb0: 0x9349bd150ea103338810c7eb, limb1: 0x194631f44c64118bf4948d01, limb2: 0xcddf00a5a0e0129f7c0dacf, limb3: 0x1585b63aca5869287d76ccca, }, u384 { limb0: 0xf213beca10de71d6d4bfdd63, limb1: 0x9321b3ed32e293a3d811f88b, limb2: 0x4ce2b9fe3580484b72432cbd, limb3: 0x49fc76b104fb5d550c0ce19, }, u384 { limb0: 0x9b78043b0ef59cdd195fc3e2, limb1: 0xe30e5a40e2f5d9b79d51644, limb2: 0x906317a8fb233964738a7ba6, limb3: 0x7f49e99f37b4d2d1b603da6, }, u384 { limb0: 0xc28def775de8d2f0de39828b, limb1: 0x3d548f753a65e3a014768533, limb2: 0x7715613c11ffdca201f853ad, limb3: 0x7d643af409084b57b822d69, }, u384 { limb0: 0xe0e29a0dc136aae59457c606, limb1: 0xf7d71f6b5d87524d0d943d23, limb2: 0x111166fadfc7e3a266cc28bb, limb3: 0x6af8bddb724e98e205c5283, }, u384 { limb0: 0x2697ad39910ece7d8ed5b9a, limb1: 0x7d1911eb0968e4d5eb165c0b, limb2: 0xbb4b11231e556addef54e9d6, limb3: 0x11446940cd2b7dc0d38a7ded, }, u384 { limb0: 0xef35f0e98cf3fc950bef6b82, limb1: 0xfb650be4f7bf7a60f0e3c3f0, limb2: 0x8243d4126588d55da730f0, limb3: 0x692a7966594961c2db69273, }, u384 { limb0: 0x9a390157a11eb1b42aea41bc, limb1: 0x8023ef1036cf8cf57aceff7, limb2: 0xe9a14efd71cb83b6a03bd56a, limb3: 0x171031a4b2549f628d8f557, }, u384 { limb0: 0x5fb64070f77ec2efbd1e2f60, limb1: 0x7aedac149757093b7a21fb, limb2: 0xc734391d5f1f79153379a5c4, limb3: 0x2e4431bd67ad7971fd3853c, }, u384 { limb0: 0xed6981f8f4f6e017d40251f, limb1: 0xd1ef4609f089a1fc18e6bbb9, limb2: 0xdf4659d17b22be624a57a90f, limb3: 0xebec9788a27d3a42ef67f66, }, u384 { limb0: 0xb4309c259a5e1310b40d0a24, limb1: 0xf20ffbdc1d69b685c69a1f90, limb2: 0xc8614f276879f6797faea9f2, limb3: 0xa01435953aeaef80b73e664, }, u384 { limb0: 0xe962fea520fd3cfee77322f6, limb1: 0xea0db9db4549cfbd7e654519, limb2: 0xf2f15d706dd410f74601a948, limb3: 0xb43c39da3af0262718248a9, }, u384 { limb0: 0x89af2659aec46adcbc283eb0, limb1: 0x44e22f284d8f97e7b188b4c8, limb2: 0x8f012c6f8148af4043497b90, limb3: 0x568db4fa914b292333eba0, }, u384 { limb0: 0x96fc87f0735f521fa9b6ac33, limb1: 0xb5ff33870a9f925b1ea88009, limb2: 0x7674aa497c8cf7b309ef0c5f, limb3: 0x15c240ff0b84df67ba9be747, }, u384 { limb0: 0x3858d615f050e01af6284057, limb1: 0x7052ee4a1956878719d6285d, limb2: 0x8dea5552ecfa9cc7ae5bca13, limb3: 0xc05db0ea0bfb4247a01845d, }, u384 { limb0: 0x4a0e85645dfccdbdca3a819b, limb1: 0x95ceafd93712eaa349882f33, limb2: 0x11a9b8209be7b8bda0f8bac5, limb3: 0x1187a1136ee5fc0651af6f6, }, u384 { limb0: 0xd3d4b65f6177627644271dce, limb1: 0x190991c48a2642418882b846, limb2: 0xe25f3fa16699fc7b12981b44, limb3: 0x14d3886d451365cd2ab9629f, }, u384 { limb0: 0x9dd3c016b1cda4f9a3d8dabe, limb1: 0xa1dc52d9783032e16103ff29, limb2: 0x2eeb760dfccd32e7a74e496f, limb3: 0xb0dd812d5b993d258a429f2, }, u384 { limb0: 0xc8b6b1d68bc9818f99b76bfe, limb1: 0xdadfc4ddb28936a746a4af8, limb2: 0x806e1b074865fed25de96d6c, limb3: 0x181d8d37ffb1f532bd5aa33d, }, u384 { limb0: 0x1d6e65950828510762179474, limb1: 0x7108c95801c369b0c7551ee0, limb2: 0xbeb1e03936499685cd2f0150, limb3: 0x94df4f30a2fffb4042894c7, }, u384 { limb0: 0x983c632a3e1a5947b7c7ce7d, limb1: 0x2be8a2b39940f29c12c6cd3f, limb2: 0x587797cc44e4124149751541, limb3: 0x30de53dc59c8860b9c16f7f, }, u384 { limb0: 0xeaf612b94d0bc60deb981119, limb1: 0x3b9840081665e52e3bb40328, limb2: 0xc465e07048a44b2ae6654163, limb3: 0x11c10d0e95e42b0240c50e62, }, u384 { limb0: 0xab55890011ebbaefa3538ccc, limb1: 0x5e688af48008d385303ff84b, limb2: 0x9a1e17509b5c09ca03249f9a, limb3: 0xef5fd5c3f8fe0595b598a3d, }, u384 { limb0: 0x191cf20ea760df983e8b0b72, limb1: 0x6d8cd162272dbbd1c6fff8b4, limb2: 0xaa4f764ac0b0d6f68fdbf162, limb3: 0xd84adfad72ed9e456fa601b, }, u384 { limb0: 0xd9880e4da287586fe3129b1a, limb1: 0x66e9a0d449b088f203a3ec47, limb2: 0xd84ecaf86584177be6450249, limb3: 0x3642d36fa62f740e86db979, }, u384 { limb0: 0xb4a17111e89cb47a754013b4, limb1: 0xb42368b0f282cf82e2c6cca6, limb2: 0x2a6ad63690743b24f3539bdd, limb3: 0x19658ec275b7492d1dfe64ac, }, u384 { limb0: 0x24ee1f851f58a051cd009256, limb1: 0xf9f8f3cc7d416c74a2689447, limb2: 0x7243778aab332312a96edeed, limb3: 0x191189f043eab9fb823e6b07, }, u384 { limb0: 0xae250e76dbd459da5fa132b3, limb1: 0x22355b40a8ab9531239d43f5, limb2: 0x6eb78f695a56c09d76521bf2, limb3: 0x1731d8fd2184ba4105a4a229, }, u384 { limb0: 0x671dcb205f5f18d66b176193, limb1: 0xb4756273e2d3f131ef547396, limb2: 0xb4e704610e05e40aceabf3e2, limb3: 0xe10b93d6de58686874163f6, }, u384 { limb0: 0x39638c7cf8c5ba660d53968c, limb1: 0xbc5fd36fc0bc3338f748b7a5, limb2: 0x5cb957768b2d2991b2f16ae3, limb3: 0x675685ab77f59ec1cf3447e, }, u384 { limb0: 0xb1dc8051918f43cd46dff901, limb1: 0x7c7757704dbf37b25a368fa5, limb2: 0xda3a570871cc0e84780027d, limb3: 0x6f3551123964dd05e1dafb0, }, u384 { limb0: 0x1d45fe61b35a80a2c80f592b, limb1: 0xa06d85ecc6b734969e9a0eb6, limb2: 0xbd560c030fd6d54a4a8c949e, limb3: 0x3bbdce254a4f9d715fbc81c, }, u384 { limb0: 0x3ca2ceab38f0421274b7534c, limb1: 0xf0ff90132756fbb051d8aa4b, limb2: 0x58859f8404a55bd454a5de1f, limb3: 0x9ea264eb37003ba2e196965, }, u384 { limb0: 0xb6820f9ae8020c0aa809da67, limb1: 0x8d2b765aaa3cdb50b34b1f08, limb2: 0x750249d318beb2125df15f87, limb3: 0x1edaf94fccb23ffa7f389c, }, u384 { limb0: 0x55862e3259ef6862f16ecec7, limb1: 0x7b91a3f930b0944742923ed7, limb2: 0x557d1688f2f93b98dc4b982, limb3: 0xe28648e51b39571ad532a88, }, u384 { limb0: 0x12f090e45f01ae193958c82b, limb1: 0x9037ff4c808f2367d58be5f0, limb2: 0x1bb112b91dcab6bb8fcda4d, limb3: 0x170ec6a92ff5df984ccdc533, }, u384 { limb0: 0x156d184f364ebb691c75f987, limb1: 0x6d770effc0f532318505945, limb2: 0xc8356e86afaddca62c1cc1ab, limb3: 0xcb3ee3182c3597c54eb338, }, u384 { limb0: 0xf417b27304e057bd07c46d86, limb1: 0x7e62858cbc2377e17eb40f95, limb2: 0x36954cb5ded007d2c6ca51fb, limb3: 0x4c09d37e7aeaf8b9747dce, }, u384 { limb0: 0x50fa90d805efe8914ff46ae4, limb1: 0x6ddee6e60ae8b0c12747584c, limb2: 0x931d47a2d99037715a8d213d, limb3: 0x16bc62f391ef098c5d89402a, }, u384 { limb0: 0x1552e86382234328310450ad, limb1: 0xd78438385562436267a9fe86, limb2: 0xc9d9e66c1b636e4182c42420, limb3: 0x1783646f20e293896acf90d5, }, u384 { limb0: 0x1d42fec0e646e25e77f86995, limb1: 0x137cca27775b396c26faf443, limb2: 0xe365d3c83d9c421ee1254536, limb3: 0x472b2f78d789bf9b1f2762d, }, u384 { limb0: 0x35876d82ee0d92db0478774f, limb1: 0xa8b9224db7d15be474909274, limb2: 0xad9143269ca1da1b85fc863, limb3: 0x112e2c7730637568391bd4ae, }, u384 { limb0: 0x6a0bd1f7640cbe4488273abd, limb1: 0xa11e780f3e28bdd9131da09, limb2: 0x2c35554e941b0f5de2f5c418, limb3: 0x69d31175d11988c85135109, }, u384 { limb0: 0x7f71caf4e001e1b0568f3e5, limb1: 0x92233912d20c5526fa8d42cb, limb2: 0xb162077f59fa7ac2e8cb7bf7, limb3: 0x1622697802fff915cc1e1080, }, u384 { limb0: 0xf56fd5b7f9ffd0fa52929a2a, limb1: 0xdc74cbb063c5f4a0d7b15de4, limb2: 0x449b4e9b45d4412680b742a0, limb3: 0x12d88dedc3deebd154388d55, }, u384 { limb0: 0xad8617f926733972028e1f5d, limb1: 0x55fbcaf8e6fb0c2f362206a9, limb2: 0xb81429cd318e1e736cce078d, limb3: 0x6f9c101123ba0139453231f, }, u384 { limb0: 0xd775ebee2c86b41f644f03c2, limb1: 0x531c4d620f411d55b1a94de3, limb2: 0xc155f42f31ccd7954ba6583a, limb3: 0x1387c3f8aede859d1d5b3fe4, }, u384 { limb0: 0xc86e265466fd08932ca64167, limb1: 0x88cdb047a6d4264c3cc2523e, limb2: 0xa0d9953a4266dd1d27e7a588, limb3: 0x609de67c510183f4752cba9, }, u384 { limb0: 0x59017b9249d2fcb894edec36, limb1: 0x4c8d817ddb8ecac7145a1cfe, limb2: 0x8248676e83742fa4c9460307, limb3: 0x1f84a9b31ce0a25340ef65a, }, u384 { limb0: 0xd4e57f2873f7f6cb353910c0, limb1: 0xd488f5b670d47eb81231935b, limb2: 0xc7bd11e77d109294836796bf, limb3: 0xe66dac679006b99972ead25, }, u384 { limb0: 0xc5e72ca4699a899f05679a5d, limb1: 0x2e4d56bead2c9e839241aba2, limb2: 0x5f925cd8319353aad49014a0, limb3: 0x24259652398e68d250ae008, }, u384 { limb0: 0xf94f6c9ff7c59b13c738f95f, limb1: 0x3bff0eb04836ec96a66c4618, limb2: 0x5de5f0fb1fc22054ea2768c4, limb3: 0x18b8c769a9325f433df2b3c8, }, u384 { limb0: 0xfa6cd0021653c7f8b700eb81, limb1: 0x1c3bef5f0deb705a4cfd07c, limb2: 0x3e148cd9648dbe6962737f37, limb3: 0x8c48c803b9df61d5d0f4335, }, u384 { limb0: 0x2d13228fc43fa72174e1d79d, limb1: 0x8ceee96560e7839948fd73f5, limb2: 0x7a1ff60936ba067ecf2be4e7, limb3: 0x55e59f6b053aedc954e2f64, }, u384 { limb0: 0xa7c35f69c4142f10400830bc, limb1: 0x24262150bc21dff0b6696005, limb2: 0xfce95af53cd4ddfaa700bce1, limb3: 0x11bec78b5abb2ab6854178a, }, u384 { limb0: 0x19a5ee954c07b7281089a8e6, limb1: 0xd40256b77a93b72bb5531d26, limb2: 0xadf2b131573cb69c0ae34da1, limb3: 0x16074d4792a0789dc26c48f1, }, u384 { limb0: 0xc697db24f748b0859934c9a3, limb1: 0x74969ae8603e2a72639c65c5, limb2: 0xe62e7354ec8af2959199abfe, limb3: 0x4a6f9c7648e14a2039a345f, }, u384 { limb0: 0x1b7d1e1cd9070f82a05a1151, limb1: 0x7b4bdbb15ecfa8352bf3cd5, limb2: 0xb0f6cde11169747ceec1f223, limb3: 0x50af2df26d997326dea9c7d, }, u384 { limb0: 0xd7db3a18448433fb1c4bb1d9, limb1: 0xcfdd5e74ee538dccaf44e51a, limb2: 0xba81ec9b76bf3b70626faa1f, limb3: 0x1b2ac611094f4ac2ef0cb43, }, u384 { limb0: 0x36f4653ad3f0f0630d32acf3, limb1: 0x1127cda884fd049cf5d17efb, limb2: 0x458693ee9c4582a3f9af1391, limb3: 0x1752b89881cf24240c3822d, }, u384 { limb0: 0xa52a317d238eb3eb0ff813f6, limb1: 0xa06066005cbc71d651de16eb, limb2: 0xc5b6eb4edc413750b81522e5, limb3: 0x16c66a2b3916bb88e9c219f1, }, u384 { limb0: 0xf39b6ed97d58a4149909d14e, limb1: 0xbaa4b842f39d06692eff2cd5, limb2: 0xe0d48869ae01117461e5a9ff, limb3: 0x1766de5097c23481915e97dd, }, u384 { limb0: 0xc0da9a67da5938ac5c763fc7, limb1: 0x82bc876fa2ed871c19c33af5, limb2: 0x2ba919e7c8369424a77fe5f5, limb3: 0x4ef14b10234db8ba75cf2d6, }, u384 { limb0: 0xc0f0246d30f910f7f4f7bacc, limb1: 0xa4e2b9ce9a30a297d83a0796, limb2: 0xaf667e1daa0e7696f9802aac, limb3: 0x163125067faa7ae61d3ff47f, }, u384 { limb0: 0x5cf5fda1c4d762853036b498, limb1: 0x7cd7e6647f670b4d0c2b6905, limb2: 0x88bd728ea76b8c9fe62759e2, limb3: 0xf92379c473f637bdadf46d6, }, u384 { limb0: 0x17fb595f33d4288f509c18f7, limb1: 0x76bc6f78fd2c0a0eba1f4c20, limb2: 0x160547d489f3e681f1b6fa64, limb3: 0x1330acf4ae3feafbf7aafe3b, }, u384 { limb0: 0x8d5df3e5ea678ee71e59cd1a, limb1: 0xbe91049490dfd32e6ad7a807, limb2: 0xf78eb313f65393a1a3398681, limb3: 0x16cbd3644701e09fcabd2594, }, u384 { limb0: 0x6e09472504dd5d81bce3b334, limb1: 0x41468f5dec22b70c3722d5cc, limb2: 0x374a4f7fe05f282dc2be1d52, limb3: 0xf815461ed5859eae9bb0e8b, }, u384 { limb0: 0xdd2ffdb4aba3e50f719dba69, limb1: 0x2e420ef25ff984065f707276, limb2: 0xd47eff4408dd3bdad9d78007, limb3: 0xfdee00bf00506d168704e7d, }, u384 { limb0: 0x45f6b066bbb7f0cb3c3c233e, limb1: 0xcb2d60923f67fdcee0ccb02f, limb2: 0x311b087540790fbef7288bec, limb3: 0x152f310fa6ad50b6a026dff8, }, u384 { limb0: 0x476fcbc57effe3f4a65cd4dc, limb1: 0x4e05361ceef3f561aa29e14, limb2: 0x1e4c75e1332e0af3f9a9ff9f, limb3: 0x8875888546de92902edb37a, }, u384 { limb0: 0x55f3a0cf8ed908c42e96d5be, limb1: 0xb83d0572643dd6c39126a152, limb2: 0xb2d2325f1ecdc8a4e76a4901, limb3: 0x15f5e61b210c26915de8e31f, }, u384 { limb0: 0xa43c056ead4885b2e99e75ec, limb1: 0x24de1ff766c475543e9c08ea, limb2: 0x146b120194e009008241f009, limb3: 0xd12952df98f8b8411a9ffd1, }, u384 { limb0: 0xc36c37c1fb558da5cd73cf40, limb1: 0xac52aa4a715d2825185d2ae8, limb2: 0xd1b77b6a984e9ea14a5c8ba0, limb3: 0x9267a9326170d966179a68a, }, u384 { limb0: 0x2c89cfc4db7cf43a294f8f8a, limb1: 0xeeaddf051f0015ba50ec2338, limb2: 0xde7aa569ac55a5bc8d4363c1, limb3: 0xc203f318f1bee0a7226ae73, }, u384 { limb0: 0xda5c952362d08ba865626193, limb1: 0xbbeb49ffbbf97b67c903ff69, limb2: 0xf3e184149e42b4d2dd6a5946, limb3: 0x9dd3738ac39100a3ac4c162, }, u384 { limb0: 0x56a4fa61ca2b466dc01250da, limb1: 0x63bf3d66be728d50924bc624, limb2: 0xee30c430bdd97d34263b0b28, limb3: 0xc53aab22b677ec2d4aa6710, }, u384 { limb0: 0xa074bedc692500027bedb6d3, limb1: 0x3a537d5b75de7ef92b7688cb, limb2: 0x246b5825593b5b9d56a4d9d3, limb3: 0x113c2003c37b1eb947676645, }, u384 { limb0: 0xe2af5a83acd48d45e355ac92, limb1: 0xe768b9a9dbf88555c0f48458, limb2: 0x7a72521d4206efcf74f38493, limb3: 0x14677be8d18e0941c802144e, }, u384 { limb0: 0xa974f39ec059cbedcbdc7662, limb1: 0x28a5f36c96f7b5889b559318, limb2: 0x8f0b8fe25fe2545fb6858c97, limb3: 0x951deb7764c5542e25187c9, }, u384 { limb0: 0x94a5bef76599825c390182a0, limb1: 0x778d1517e3063378cdf51734, limb2: 0x7971f91f1002849ab158bd47, limb3: 0x17a9ace9cd4d35468504f957, }, u384 { limb0: 0x96d64f9432d239fb26cdf3cc, limb1: 0x3125e568352713de99062560, limb2: 0xc34e0e636e67217f2181de15, limb3: 0x12bf8fb33bbe5c5ba6a55268, }, u384 { limb0: 0x3729d178812e993cb3d59ff2, limb1: 0x7164060bd545db0f5e55e9f0, limb2: 0xc5eb7111ea2fa2d19ed6634c, limb3: 0xb50481d3c4a6f38480415c3, }, u384 { limb0: 0xd4496c2106c96bdbc6a5235c, limb1: 0x52d7c52ddf53c605aa610286, limb2: 0x2a8d5d11ba94d192d58b0c6f, limb3: 0x119e88de0eef3cf393d8d315, }, u384 { limb0: 0xebae8c783f077fd3c2fba31, limb1: 0x9b868a30413b925f51c33114, limb2: 0x53b5d13cbde84dd58cf4e713, limb3: 0xfecf474b851e762145a27ca, }, u384 { limb0: 0x7fad2c76d54e6ac3c73eda24, limb1: 0x7428d7731e6ad0732f6b0067, limb2: 0x611f5cd79e2c44710a59f166, limb3: 0x16c032a5f08ce4f07fe6c985, }, u384 { limb0: 0xe3825ea9fcfdededa3e156be, limb1: 0x93f814ed177fcaad9542f2ce, limb2: 0x74e5e08dfc2d39d9cbe41bd4, limb3: 0x14ccd9031b038e809755fe62, }, u384 { limb0: 0x541c62f55d52bed742659afb, limb1: 0x9588890d2ba337d20a53f942, limb2: 0x5a1f5b14da9474238b147bb4, limb3: 0x7a691b3ee7c2e5c0c51c8f5, }, u384 { limb0: 0x9d12d194ef6623a00266d1dc, limb1: 0x1f5b2f36e044c804845e63f8, limb2: 0x1b5eac5cee412396c2688c55, limb3: 0x73c653497a9f8b9683aec46, }, u384 { limb0: 0xff839b6315bb41548d0f065b, limb1: 0x39d44131b83a688dea580cf1, limb2: 0x6a4a6ba320b991421349ced7, limb3: 0x15d23e4230faf11b2d12a1f7, }, u384 { limb0: 0x6761fee71ab41ad98ca781fb, limb1: 0xafe1a079c3e99036534f3b73, limb2: 0xda73c296967b61b3bbf4549, limb3: 0xbfab60cf853b369dcaf4e83, }, u384 { limb0: 0x8179f1752883102ceb7aa69e, limb1: 0xa13caa48cfe29a2a6846f284, limb2: 0x3e296b59646aec40a2e7f7f5, limb3: 0xc672f3083b9812dc0ad1d0e, }, u384 { limb0: 0xabf6b28f2c7b09f7211ff2aa, limb1: 0x1b81548b8b84cdc8196a89b, limb2: 0x48d81c0549c1cd98cd89cd7a, limb3: 0x150a4a35d24be72173ac1335, }, u384 { limb0: 0x2cd54ac23ec0fb5d623cb2c9, limb1: 0xfe8d0101b4fae5f0a71b59c2, limb2: 0x935cf0170abc1d88e0e2fb07, limb3: 0xe2dc487c52a2f677e1efec9, }, u384 { limb0: 0x29c949ec89d4ed04f794429a, limb1: 0xf1258b9d7e7d8bb80fb58b9a, limb2: 0x4d5ff9db250e0cfe18b02497, limb3: 0x10e30a2eac74c41f16474f61, }, u384 { limb0: 0x80b766999bafe7554b1ba789, limb1: 0xceab56251f7fe2864df2ce3b, limb2: 0x1f56382d890248035810f2bd, limb3: 0x7b06a1bffe3bfdea07ba2d2, }, u384 { limb0: 0x67cf0f0cedb32104ed3ec1f6, limb1: 0x9dcfa86edb05f376a6de76ef, limb2: 0x6a593cc2d259710819d92dd5, limb3: 0xd6c135c5615705b299a78e2, }, u384 { limb0: 0x8e18746f53c857e8a8383a74, limb1: 0x3dddf8b75512376fc42c2458, limb2: 0x4bdb6f1386a9f883b40de577, limb3: 0xcae1edbc64c45c95fc152b1, }, u384 { limb0: 0xed4a4581e83c76e945c984ca, limb1: 0xdae5b71fdc78f94ee5b097b0, limb2: 0xbc3d1b1b38b6d13d1629f2ec, limb3: 0x16b1a4eb022c1381f056fb61, }, u384 { limb0: 0x6a2cdf284ea9d17e237e14e4, limb1: 0xa029c79c09561485e46ea2a1, limb2: 0x82cd28ab9dc6e2ffab6e2a25, limb3: 0xca4c79a420395c8919f51ab, }, ], z: 0x52ef92c6fb1c4777cdbad00b49ca5611928c145e716dfccbc705fdd4a0b02f9, }; let res = multi_pairing_check_bls12_381_3P_2F_with_extra_miller_loop_result( pair0, pair1, pair2, precomputed_miller_loop_result, lines, hint, ); assert!(res.is_ok()); } ================================================ FILE: src/src/tests/autogenerated/rsa_tests.cairo ================================================ use core::serde::Serde; use garaga::signatures::rsa::{ RSA2048PublicKey, RSA2048SignatureWithHint, is_valid_rsa2048_sha256_signature, is_valid_rsa2048_signature_assuming_encoded_message, }; #[test] fn test_rsa2048_positive_seed_0() { let mut rsa_sig_with_hints_serialized = array![ 0x766ad7a96b6a74dcb0d4ee21, 0x3c31169ffb4c539d20a19c30, 0x4813ed39e65994f370938d52, 0x19c0d08706b4597638cc3e30, 0xc7e80539ead20295baaa808a, 0x299992cbadae99aeb97422ae, 0xb226c9a7b454cef99bca662d, 0xbf70d4a08cf48ed827e59567, 0x7f746d2d77af83b2122fa87b, 0x9aa92b2128d9725d8656dd96, 0x3b526db14be8de881d9d16f0, 0x60ef9dd9b7346128d4904a2d, 0xc956b02d42c83dcd03152b6a, 0x417242ec1b72b9d2c28b3a8e, 0x31094b84fe9156b6d0462fe, 0xaee058ad4254ba267bfa369f, 0x236079af55b0b25854deb6d, 0x1e371829465e97bdc783fbc4, 0x308ac6dcf29aabb20d05c85e, 0x250ca4cbef9a5ded24279a60, 0xc2667b7be6ec40e1236d59df, 0x92c2ffdd, 0x0, 0x0, 0xccd4d72e904d8d17594ab5f7, 0x39711006ced57a24b0b3ddc, 0x2ccfe85722998e88ce696503, 0xbb4d033f6bc441dd1a08890f, 0x126b5e07fd274f3c18f28ad6, 0x6d1e293c0af656e2d1d56a47, 0x311e4ff1497cc51e1df029af, 0x9b5c4fd21b926c416bee361d, 0xc2763b9d1cc4af2edb1ed69b, 0x38c872d56da6fbe02f39f2b1, 0xbf55fbbf55d4cc74e2b1257b, 0xe6128d2cb2c59820b674fdd2, 0xa13fdbe9e48e2bf32e68a32f, 0xa91b93a068472e0dda54fb2d, 0xddb762befe90bd234be8b786, 0x8de87eebcd0e03fcc11febb2, 0x58c09101bebc3bd1c58c0616, 0x7ebe6e4cc8aee40772b501ec, 0x8e478ff6dd4c4a4422e8f182, 0x10d134c96c1d30ec1c29823c, 0x5dda7fcba4eb273a149eb833, 0x5c6704f1, 0x0, 0x0, 0xa9dc684ea7a072c583378bdc, 0x234eebfb13b9f83dbedc9689, 0x46f68cddc2dbc0748d995ad3, 0x4338acea2099179babc1f7ab, 0xcc0fca21384a6773f735d8eb, 0x5cc17f9d3c9d8636229c1adf, 0x5af4b70e86e1d9ebcec76328, 0x73474b28f23261bbc278997f, 0x60b65df1d9c6c2025877cbc7, 0xe5f371b392daa99d60dc68f5, 0x6d459b8018d80c189e4fb2db, 0x3b782f2fb21f91af6f955e29, 0xe58e194ead8b059afb9cc6e5, 0x714a92db56aaef13c5eb239d, 0xd17462b734aae256a7c053bb, 0xc7364388960d6831d60e8379, 0xa6e642a3822390a909108133, 0xbb3455c47c1d625f04473e54, 0x473a8914fd186b8c2f53bd98, 0x56cb778707e253d5bcd9c897, 0xb212545df5bc302598e61647, 0x879e816f, 0x0, 0x0, 0xf11082a78e2349176eefb845, 0xa2c474b18dd8215e6ce79a2, 0xaf8397d226331e6fe0287b82, 0x2021be0dbe82e1d87ff0464a, 0xf9f671cbb480c9ad30e96b04, 0xbf0341d821907bf2d1714934, 0xc4133dd8b0fbec701c6bce5b, 0xab8a9912700daed15fb14efb, 0x6408b84f7f8cfcc466adb647, 0xed064d750384670cdc484c57, 0x10d17bd4d1d8b673945244cf, 0x3661fd2009f806b98f962802, 0x3ded8d1c80a858c317f106ea, 0x69490720cdaa41dd567bfd75, 0xa2e9da91a7303beb4b22e507, 0x63d845332aea5d5d79157f21, 0x1ba1ef9812c965e541b8c9e7, 0xadd80c35198e137ffef51c0c, 0xec2ddf921bd92a5be54e75d5, 0x9f260f9358d8c772581bc666, 0x49cb9677cbc1c13c5b5a6b46, 0x3a2d6680, 0x0, 0x0, 0x61ae0775f0594f0d3ec84d6c, 0xcdf82c4368c89d619ad6c4ec, 0x16634f8f537349438fbf800f, 0x18bb5fd323098da014d9e4e9, 0x3de3d2b1c1ce83174249eac3, 0xe04e43c5856d447e64fb2c49, 0x8315c17c23405e47aa9dfdaa, 0xdd3e2d06e6755e5877139c96, 0x1de63f44a100a924034140b4, 0xd1c1be2c6c01be2cb6165113, 0xb3f8ef010376c8d557dd3a74, 0x5330b322e6537546d099577, 0x50feacf7ef56d00d299880d8, 0xde8af60590cff5c21c9021e0, 0xc719c781d43d99eac9c9a446, 0xa03f627aea3b9c54fe08cb8b, 0x2fe3ddee1358fa008dcfbd75, 0x183d0552096beeda805632ba, 0xead565b3a9fd13f32d94abbf, 0x8aa3b518bf3670dc8a44dce5, 0x7ce23145e486815f1397916a, 0x836001e1, 0x0, 0x0, 0xa50443039d3dd37156158183, 0x383a7d1fe53348285bdd2f37, 0x3e634aab243fc03bdd9548c9, 0xf63f0748d8ca9bc50034c997, 0x5cc782e51c7c576b5cb62457, 0x767abde2f4d3fc3d27c8dc12, 0xc55ace8470f37a3727c4cdb6, 0xa970e7780d86111b86e8184c, 0x3b930d12e10453014f602550, 0xe86920884a33c79d586e5b08, 0xe1c35a842d9968776b9a5756, 0x2d87248120b10947502a05c9, 0xce2325942bb6cfc89ac9a16d, 0x3023e567a6aeaa0e56e67c5f, 0x931367e2e28f64cf5e67881b, 0x5086944531c4016e1b638c8f, 0x2041352d23b8eb7553c90821, 0x45e38d7e09438b118b8c8797, 0xd15618e1fa2be214b20a2b62, 0x613c5bc02562fac980d54ff6, 0x3547852fb77b7ad22f7a3809, 0x7599fbf7, 0x0, 0x0, 0x25772373859fcc1ff880a9ad, 0xb3d1a77be83203586116cc33, 0x249ddde6a735af8d54f76e5d, 0x126236052ece65c16a4f8147, 0xc14108cea2b89f8bd216819b, 0x31e5b9cd08617bfbebc340ec, 0xc533488c6e32cee86b51bb65, 0x3427cbf5c389545877454003, 0x5f471a99ed38c12709340c97, 0x782d84eec1f578cf6332df12, 0xcff0e44dab2705c3df8ed43b, 0x828932cdc82c07604ed8aa16, 0x3f3c04ef18aff4f15ecac8a6, 0xb00f3fd36e39d0b3ba293f0e, 0x98e9053c9079b132080e1433, 0x8ae039670f1f588d49b0ead0, 0x84e04057fe631a9950e3741e, 0xf0975e0d1d87294c0779e4a5, 0x9af5116c3122c9454c33abf9, 0xfc8e70dd2f1882948bfaa669, 0xc4110d0bb3e3fe5bd4aa3849, 0x63ed1112, 0x0, 0x0, 0xdde6339489f82be2a548914, 0xa6129a46e7fa08cf79fe8795, 0x4ecf9c35860837ca5cc9964c, 0xce764f24f9a04630792a3962, 0xb037bf199470e6de572c42bd, 0x956ff3546d57ee943af1668f, 0x9677e96ffddc8fb4befbe60b, 0xcc50d5f30da8488eda5e2c68, 0x5c1aee3bac6f9bfcb475b589, 0x417cbaff0027179506246182, 0x4884fa40151152ccfb8f2361, 0x5fad486584738fb532be17dd, 0xdafafed3e1c4cd027bba63c0, 0x7f443066f06aa1556dd9abb5, 0x4b627b9936231df8ae4b77a0, 0x84fb2d5a4f24cfe981dbfad0, 0xb876a978d779736ade0abc08, 0x5e6ecdc675a0b2c27e3a310, 0x68b895aa08ce6e80cc24b677, 0x933d588163cd237a200f2ec6, 0xdf366116dbf8e636789c8917, 0x440972fb, 0x0, 0x0, 0x4c43909d3df7aa01fc8f9b55, 0x573f92547eed486eaecf4fc4, 0x706df3b0fa507cf78864078e, 0x72beedac7c3f62c50da7858, 0x7b01b47908dafa52fa8f40ca, 0x42c7fe0d226b199ff3a8b27a, 0x2cd291e0f2b7259731ca1103, 0x9936fd0d86cce4683dbd3593, 0x6fa4eae97809921e2e8f1c29, 0x61bcf43cb948de83f418604c, 0x4be8bf5f7aa4f97164b57e28, 0xb2cac9559ad2a26568d798c7, 0xc9e3f5b00702b0a067b7ce6d, 0x42738b954118f7fc09daf06e, 0x936703c37dcc919aeabbf3c2, 0x8234f4da6b15efc32f91b03a, 0x51016906f1aba3d0051cc8d8, 0x29c616b65059e5257568c86a, 0x9e7959ef4cbfa69866c3ae8b, 0xad55fa216ca080ce5f33515a, 0x4010f7d945e56f9faaaeed47, 0x59c35b15, 0x0, 0x0, 0xbd7ab4dca711f0d929017d0a, 0xf6e1b23766720a08df2e064b, 0xf743a47b9ef21525e4a3851f, 0x2e9e91630551f14e278d959f, 0x450e114a827f3fe74024242e, 0x768f0b12f0fca0e28cad2d5, 0x6f7551b524fa35f7afb69fb0, 0x503e453c615811e1bce63aea, 0x89d3c0aa219ca344b32b4a69, 0x9847c02179a77916a0aad3d0, 0x363a2da6bb7cc920afd971f9, 0x105756bde27aa2e4a1654eed, 0x782316203cc0dd1bde9739bb, 0x729e9df0a4384508f628312a, 0x7c58ad79ca4ff22633b6c393, 0xc25e962083bee700b96ce224, 0x4b99b07dcff3f811dd6d63e2, 0xa07af35bb0745dd4de9d5dc1, 0x2362f99b653a6d200acdcf4c, 0x7ed1f7a32c6633f50a1a6d1f, 0xc67831f8385e2ebf6c0e15ce, 0x36e6be8d, 0x0, 0x0, 0xaf2e85f517483d20277d9fef, 0xa6c8e9ef245c3cfbe92f5583, 0xae0e652d9bfd555164f5dde9, 0xac463ea67f143f6b90484d24, 0x292d0d6d7a0f61537e241903, 0x1dbd26b03b4c300939500257, 0x38f5405d2d4eb07f94eb4174, 0xebed3bea8633f2024a17fa8b, 0xd8029bd940f48c17be9061cd, 0xdb881dc57fa541995190cffb, 0x28dbb1531a44706a35f17fe9, 0x47ad149d189b70df6962e01d, 0xe56b6feae22bea7827cf0aef, 0xca565c0873f303db366b4122, 0x18739e8523299686923d88f7, 0xe4c0c42cd30512c887141263, 0xd6664b534d1f54775647116d, 0xccdd2182bb113823e3c8cae, 0x5351a577848f05aa228c7e, 0x12209ca46ab63bc8985be0c5, 0xe39f22696539616774a946cf, 0x857b13e2, 0x0, 0x0, 0xb4b75cf7190e9fb150c78ed, 0xebb37162b1d1a0cc8ed4e70, 0x2e90eaa6bca468a75954af94, 0x921837f27c919b98ea12bd7a, 0x938d23cf452c57690e41acd9, 0xeaeb0bbd339278e588377648, 0xea059eb1bcb1327413df220f, 0xf3d015ee9a83e173bbfe05db, 0x6eca8ea01474071813e0575f, 0x478da59c5392a7c4859552b0, 0xd53538319b99b57602230736, 0xdfa5ccd9411adccaae6481fe, 0xfbb3284f1a46aab145b14e97, 0x54ac3cb4084ce72b420b1440, 0xfc0030ee568632dc99eb3e3e, 0x67838dcc7ffababee905e4cb, 0x1dccbde1880631c960965f05, 0xd92ae551a3b09f2b1914b2c9, 0xb92dfcad76ba37636909b5ba, 0x6d02704ea436775eb9eba0a1, 0x1239f0c36942aa41d0fdb583, 0x7966d36b, 0x0, 0x0, 0x2f0370e0de67e0e0204d494, 0x41e6a7ffb185c93fc567919f, 0x33b32ddef77fc52a3e1b5a8c, 0xff9cdac2a8555b74120dd0a6, 0x374fe9884c8e839da4c5b64e, 0x765771b2daeb10f3e43d714e, 0x6e482c50677c27f548576bb4, 0x1ba9ee7076cc48c2028e07d0, 0x2d544810350024a0c1b4d179, 0xb8f7bf71b996e3c125d6df41, 0xe1527c84c71956afc34f6845, 0x8c339e263df547b486a303c1, 0xd671bf4705270e96c2dcecf6, 0x8e2ab787b0d997e2c435288d, 0x5aa9c5acfa39c50a3921e905, 0x99a4f9d3b39672a4ef023e78, 0x299824406248082c032f9e88, 0x5cce13392a9c02c95f51a627, 0x8ad6ee4d053df429a6f03f9d, 0xdcf0e7cafb7fd7f3c7f87d80, 0x9aebea38b3e33b2b482c8a04, 0x8bf92cbb, 0x0, 0x0, 0x9f7d6f589e82e9756cb90734, 0x1efc494737c83d8d1e5555e6, 0xdc14db376bb2abe4ad6c5145, 0x6350095e5153267e0f7cccd6, 0x2f11b257bb2b86998a1c4fe1, 0x1b0f01fffa4cb3d342c3331d, 0x45f2b93d6b87e6c14c8bdb25, 0xe0443287f9111fd56efb078b, 0x1560ccb1b67cd638d2ab63d1, 0x48598e67a7c87a38e45761f0, 0x42e95914d4ce2835d31ffdff, 0x39b5c97ac03b49dc9f8f6118, 0x1264a7647a6a15794f811a46, 0x83c3d06dbfb2b86373c10c27, 0x930c355b5fa314b6b1620102, 0x22692e942620240d77d0c6a9, 0x7b8897708cd33be40719d6e3, 0x7df5c691973b2ebe3fad0373, 0x6703a5c064a846c40c588c44, 0x2ae4b8ea5e745d2f0c269bbe, 0xfe723d71902007fbc8a70662, 0x857fbb68, 0x0, 0x0, 0xa5af2060ca06c184e5892fdc, 0xddc0a0a99021868d6da0893d, 0x24b56567184dc2acbcf5c73e, 0x160ef95f8c1f209f220add52, 0x2534d4dbc6d040d83fdb27e, 0xe9975a62f1ec391cc7426ae, 0x491ed56f50664e259b8ebad8, 0x7fd81ec116d12e3df8c35dc6, 0x2a894fd7972edf7865cc64f0, 0xcc22be61d6c9dcd87bbd11f7, 0xfd08aef895fe6b35568a1478, 0xf859f2778a321a7653ef2225, 0xf76ab371c23da4e6581b30ba, 0xeb87317e55dee41753d04513, 0x65f710857dc2c2200f569276, 0xda8ec2912b42abfb71ff2aa0, 0xef0a6b1ecc8548494c574227, 0x91b537e4d720dfa8b9997cd2, 0x7c31d1185eca8ca5c6625a84, 0xb78354ea69a8e98692057c26, 0x8d1da54563cc19a1f35e8c2f, 0x639a0b16, 0x0, 0x0, 0xa875570c9d0284f771cce145, 0x591c0201ab939b39b4e90b8e, 0x637eda8b6d46c7f37c41ba1a, 0x4108ec753bdbd2b8355b71da, 0x3e09320343a531c8f224f413, 0x1b9bf7cf3daf215cb444a32d, 0x41ce25a20127e9fb2c094c62, 0xace162be846660ab7dbdf99c, 0x2b033b29ca496f3fd509fddb, 0x9d4c1e14a408995d3f7c5bbb, 0xa66dc01cfd2bd5f969dd2e4f, 0x627f37970e930fadd339ee01, 0xc9aff619c84d5b4d8397cab8, 0xae250d0978d29cc49ab124fa, 0x2a5d7e131b5b9e30a46c41eb, 0xd55d087936c566f14dde0f46, 0x69846557a74460713cac372f, 0x8d8ab518931b5aa875a9d0b2, 0x27710e2b2af85a3b75ea264e, 0x1d3109d2d289a899712e2dd, 0x61383d251a5299190b540559, 0x4398936f, 0x0, 0x0, 0x747e4b323bf2a87bb86f552b, 0xf7f2ab1dff8cc754dcdca592, 0x1f34a08fd4c07735a767dc51, 0xe746b680a62bfed15401f9d5, 0x97f4eb618871a00cde3631cb, 0x8339d6fbea40aa941ad85327, 0x90c5edb34de4570c96a5a8f0, 0xefd960fb4e9b509a7e987b10, 0xc05807b47e82a5d7c3825160, 0x314c4c6704487c24b8f15709, 0xc392683af214f5f11cf3b479, 0x948c6d20cd304068c11bdd9, 0x3c78b7c1b58f7f9a72fe71d9, 0x9c5e03c8abda7529065625d5, 0x1a01ea030d11b96aebb1a48b, 0x8c7d949a55df28049f8611b0, 0x9e8bf8c8d36ba12e7aa228ac, 0xb9fce7d6eefc436c65b5c89b, 0xf8136f55dfb42a001616e769, 0xeeb08cb097dcaeb0f5243d31, 0x94d23cd76a90197b1a55f77c, 0x260e3765, 0x0, 0x0, 0xcd3ba7bd04a31b040366053b, 0xe6f10c837922880344fc9e38, 0x5d689eba02224e76eb42b684, 0x6e7643cf0b82715749e94cc3, 0xd140b4dfeb987b80865ec722, 0xe94da4823df0f77f53fbe6b0, 0xa1464b2c1b416476e7472812, 0x94a7a32cff9f1d73f72e09ae, 0x4e74a3c7d9049e7e96cc9ea, 0x1110951d3cc54cf1cf14d94f, 0x67cea4b746527cab8d59000, 0x36179b0c462d4f5cf76e42a2, 0x1742726164e268484e912ab, 0x22709f163ff2cd135caf2445, 0xf81d959cb2c9f991011eaaab, 0xf4f1c1cc347528cd1a4e1e62, 0x4664c8151c0d996bd9f0420f, 0xc086ba3be97b7ee3105c59c4, 0x9672fb601d8e57065a40c748, 0x6f878822fca3f1d46f3a48d0, 0xbde69f62a7e1eb664ba1aa3c, 0x9de2bd9, 0x0, 0x0, 0x4482aeb75faa1cb499c00e9e, 0x8b344a97e26bd3b78fdf7075, 0xad4d20ca51614ca72be40048, 0xaf5d2f7ebfb641ff1b918596, 0xb6d8ec60ccce46edc936e0cb, 0x690e2923dae76b1c1a8a60a2, 0x85c2e3ef5f249cd3e100bbac, 0x4d9a6bc3931d8bac5d9ac6ee, 0x169d730a5e2e1b69821c527b, 0xc15ca47f3a1729e6c2a9ea74, 0x474fa9cf9bd7331ec6810757, 0xd422d04149b9b0debce1cb01, 0xb7efd18fc08f89555d4c11b0, 0x269d2078f1960a85fc421a70, 0x46b5771a2f9d3510c9c3769e, 0xb623a42327ee23cbcb526328, 0xbe8a45ec511d7a54c64fde80, 0x3328dfafc42b91b1c69e10fb, 0x264c1e6be83c39fecf98268d, 0x25408a50e9b65f70f5df411a, 0x41334cb48418bdccbe5c4a47, 0x5c88a46, 0x0, 0x0, 0x25316546d55f7e0dcbe6a3ac, 0xeacfb5cea96b8a320936b33c, 0x6f6812d56f2c9d3dad9d17dd, 0x684a95ba1fa821ea81a11556, 0x1641c404477985dffd7cc386, 0x871d716b23e46bc3b4cf9c86, 0x8fb05800ce27e75c87859c5f, 0xf74b57029f2826c3d32008f1, 0xd5b3c939cbb451990b332659, 0x3a958ecf6774f75eef392e66, 0x5faf5e626a2d5c1986e4531e, 0x8579929032fe8da13ad1017a, 0xf19fd7bd978667567947badb, 0x658966b7546c960300b13096, 0xaf6c205a1a8f1b46855a36e1, 0xc1c3e6045b8b25a219c1335c, 0xf0fa6ff6bf56bcbb0116f9cf, 0xbd84e957d385047457f5b35f, 0x9421fc8ca5d0f21eaa8a7af2, 0xddb3c45dacbe09d2b201c3ce, 0xd931044489e3194da19542cb, 0x3a57c4, 0x0, 0x0, 0x9c2e41e8b5c429114a80a858, 0x5a966e31657c7f8c4b03d19a, 0xf6d631a3b323e9d2d0bf9577, 0x5344cc9641e9b5f74f7112af, 0xe429d282cbf83a3a6b9d4cbd, 0xb7113a43b4dd22a6685afcef, 0x27da7f0630345d55a449bef0, 0x20d6e5d82e5c8e25fee2526f, 0xd4713cd17ed740c4e73e65e6, 0xcc3bcbff28c0d7c447d07124, 0x23305fe2dee2774c0c4edcdb, 0xd281cfaeed124f6cb215f85e, 0x9601c6e2be06ccdd44830d12, 0xe8c75f8ea6aff1231d173084, 0x590ebc020ac0a24a9767b4b3, 0xb8a534f177c2d240170ae8b4, 0x792877e41b28f602a3a9af96, 0x187312ca50914f7652ece934, 0x2d4a3f443efdb605e7461262, 0x1d7d53cf6231accf900fe2f3, 0xbc39ae48093f0259794962a7, 0x18f99fdb, 0x0, 0x0, 0xffa9482e842897e00f682bfd, 0x834c8268bdfe3fe9126289d7, 0x285ef56cdea1beface4af9b9, 0xdf26308909c6236175c8b94b, 0xd0f05616288f3037160caaf6, 0xe037d0024d1c561b107d4d59, 0xb53d73e81fea4422d6277248, 0xe198cc789000080db790ae73, 0x4a534c95b61cf17c5ba235bc, 0x908c97c0440dc62088b9a69e, 0x7ae47a71e12de983ef98db45, 0xf8562cc339b439ad34d2fc63, 0x2eb470ce422fcb4897856278, 0xd00c1f59bbf2e4200912498b, 0x46cd5901f82298f50f8f37e0, 0xda394bd5a6faa8c6f98d178d, 0x9489f43f270c6bd97a56f14e, 0xba345afd6fa08c5b66103257, 0x172117c1bd860df49c7f68f0, 0x693100c5b36bc3d8210615b0, 0x2c8d3dcfb83ac31efe164c, 0x4400815, 0x0, 0x0, 0x6505fa9f69a8798873dcbca3, 0x540522659d27e26b155741a5, 0xb2cbbe014d7b317df5281b60, 0x3159a1e8a255736027c15b00, 0xec172ec870f4885861fa715, 0x450108025ca4fdd95d3ea4be, 0xa7ca5bc05077bd9a6fe4f01e, 0xdeea885ab4bfc82189ac2b72, 0x9468616b7bb8b2d1eb378868, 0x56276a0966928b08971684af, 0xd16a3d10a6032348f539e2f7, 0xde3dc7466c581674d211cdfb, 0x5440706286f05e61df345166, 0x1cea89c8227619129efbe254, 0xf84c4b9dcc9de5cfdd1b745f, 0x7439a70edf670ccdb8757ce, 0x9a9d2a2044ce0c63c7749a64, 0xd575c9cb73c6f9d36bb8d1d7, 0x5a9ee0be1abbe2291846dc4b, 0xee674484c468ac3848193a80, 0xef5f5b67e32d2ec4ebb4cde5, 0x3080adc, 0x0, 0x0, 0xf6183ed40d6aeb397805b3da, 0x8ceb48f0508ff239d7bd175b, 0x9f0b273513d427b0a7d38648, 0x82b3956877f67e15e22f2b4a, 0xdbcdf5049103c9c7b7ee4bb5, 0xa4880f67b985ed22f3b7ca29, 0xccc0bac7846da5cc7c7ec380, 0x26fada19f84b75c2954ff0d5, 0x607e2a4f32863fead642e8c6, 0xd81931fe7d0a479f060e12a4, 0xdb46e7ef3efca9bef3b7728, 0xedba7c2de2c90177fc3f4840, 0x956ce80fa9fdea3dcc2a6ff3, 0x5a8e76cc6a2b0143634b7489, 0xff054f521cf0d1a934283a01, 0xbef59d14565d6ba48d073ae4, 0x650b2d52c1122a56007b90a, 0x7c76c9af9f608addb1afc04f, 0x2ba9ee990da5b1a115506e61, 0x56ffc7c840d5cb87a0d64779, 0xfdad49c955958334a75424e1, 0x100788, 0x0, 0x0, 0x40f427e784fe2b4a9eaef4af, 0x2f0795ae8e0911ef1df50341, 0x90df7762e822199b4e8f9dd8, 0x3a0b913a4eaf581bb478be28, 0x207103d33ce1e0b8493a8cd4, 0x8656a65ce57b0b8a4dd5622, 0x7f95bcb4d175408d176f192c, 0x3e7c781e0afc6ece0cd3fc3f, 0x399d9626316a4a703009d68a, 0xa406d4c272643c0e932ccfb, 0xbd7c66e6c97d1c5db9fa9355, 0x8eed69ec5068d7cb399c4ffa, 0x79fabd0f06e0921e6cb79d77, 0x8cbbba1bc258146680adf88d, 0x16fcaf5768364d146bb355ad, 0x225fe736e47e97ed2f956d95, 0x70d015c5a2328fda9308b98, 0x673d4d765ad984ed15b17de0, 0x1e5a5778fc5a30396b36b904, 0xe49771bd3a3478f09574b1ea, 0x35c5a852b2225574a7952926, 0x353afb31, 0x0, 0x0, 0xba3c64ce6140f14718d0875d, 0xaea551a60be2bda2d6bf6db3, 0xe8a0282d2347aeeb81e33e89, 0xb8c1ab53b1e38117bc833379, 0xf028317bd0b9336aac1c8012, 0x3c856cf187839e9d21dfc4c3, 0x880a5e18613966ff8cdd7cd8, 0x79a454208ea16d30679cf088, 0xf3ef14e5fbbed7488440d7ea, 0x418e97737d58665881d8462, 0xf4fc8d9df7440e8998f035ce, 0xdb8e672415f226facf42e72d, 0xe589c0b91168de2021f13fa8, 0xa3085040132adf68a6e77dad, 0x94431ba64e4a6e6b83409212, 0x26e5b535fb3ed44b9a28e8b5, 0x52ce3fd32264c1d47149801e, 0x9c8ef28bf945bc77a227b011, 0xabb4c1b5e2a27b69704cac21, 0xcf74f58df7e45d4826769eea, 0xb2159f7de25a0c030219cee2, 0x134e7fac, 0x0, 0x0, 0xebd8d90c934d17dd720426a4, 0x33bea95aa8ad5797da6c4efc, 0x7fac880279bd173527763ac2, 0xd909e429bd1b54225afb9391, 0xcd2c7929287c08f6773cc15b, 0x3dcde19b61dd92d44568e30c, 0xc4fe323e9fcabf11e0fef9f9, 0x2c768c0140cad8de1b3f8295, 0x5ec06f9a55af974795824dd4, 0x71249dd9d21a50f8a5dbc25, 0x9c236dd1615cc0a9f1cfed04, 0xba5a73986d84f4435169a34a, 0xa02b96c267abf2aa37dde261, 0xc2e354265ebf226db4ead96b, 0xe5ce9a686d3e5e30e5e7d927, 0xaa9aa8ff79b86b3c71463e0f, 0xc7573536e36cb43693dbd891, 0x23b6e4c59c0de1ac968462d9, 0xb20bf031108b4e72afefe016, 0x21e962fb9134282b48547ad, 0xa710aa758ef9c12b377d9d41, 0x66af5f92, 0x0, 0x0, 0xfcbe8e8bc2857c63648e74c7, 0x3c387f8020a8e593e0b552fc, 0x8ad201a4b3f0ad06ca1cad3b, 0x89172fbe0f87df535688ccce, 0xa60fd06f89622f8e0ab0e81f, 0x9d95dfbbdbfb83d920f26406, 0x3100ae331c6bcdbd5bab2863, 0x1cd23a1e15830352e125d568, 0x6d486ad849053b6f55603009, 0x119e3472ed62abc0075a2f7c, 0x66cc98c72d2681a98920289f, 0xd6eb1f2dc51f8afa59605173, 0x6c3fa021ab66060a374d7ea0, 0x723138898370b39a75ee7b1a, 0xe92d868e3a8be03af9568450, 0xf2f5f837b5321258e6bc92be, 0x27361dd77e44ebee906a0ebd, 0x7003f43a6806ccd3b189ba18, 0x97b5b27be13f5b8425e2472, 0x855e2bd2e42c6b36bb09545b, 0x7aeebee267ae270f26abcff0, 0x47d88976, 0x0, 0x0, 0x8b00c396084b4115f3b0969, 0xfc60246f4f9cfb7e951de468, 0x8022a8e11b4f620d48a3ae49, 0xd273b3ebe223884b92885a5f, 0x5f57fa057af4248d7576fa82, 0x5e57e11d3c9f89b7cc0e4431, 0xbc5bcef6f56876529e294838, 0x32c32a62b1db35b064a7a2da, 0x35bd10f3388759eb1c787e1d, 0x63c601309b69160147d3db35, 0xb1f8bdc3cb3cfd5528610a71, 0xcf31a9f03bdfed10e2e83e2d, 0xa80331587c59ced241357ea0, 0x54ba8bd269e3759998fb3358, 0xc67a073c9bfd12d1c69480cd, 0x6990cb91da39aacae8f6ce2d, 0x3073b77341d7f8914f23e232, 0x39fb609d816e019cc062f795, 0x6c58563224905c46dfc15b2e, 0x1fa29a5d77347775bad7e2d, 0x35100e5348a3d6577246b271, 0x1cd09ea0, 0x0, 0x0, 0x254f1d592f204e7e1117be57, 0x637fe9b28ec4e1f1fdb5fab3, 0xfde99837ed06ee649f6a5eb9, 0xba50e700e7ce0dd5d699c0ff, 0xb89b6c7dbb34bf4c0741c2e8, 0x2c77cbafe161b05a3f5ccf95, 0xc147dafe9d4dd839dc184d0d, 0x78ca47ed2f48eabc1b8afe82, 0x368de7c0d41674796d946bf9, 0x88a0432c9a758fd891670603, 0xb356dffba421f23219149c12, 0xc0df0de9addab73f0c677b23, 0x87fb6390c845a00a2b8c2549, 0x9b188ebfb7e3b513d5ea61d3, 0x7733b7d80a0c1f1fb3b87794, 0x308c820f6a5ab36f0492ce8b, 0x5be8d42b69166421dda3b512, 0xd55839cff5548d24ad1cace1, 0xb3cd437bd0293cff21b2402a, 0x516f98df61b6536f450f3a71, 0xf3eec531c8051639aeb8eb9b, 0x5a84fc9, 0x0, 0x0, 0x3693b7dcdad0fb1d8dae21da, 0xaa2d5a7fee71d0e906cab278, 0x5261e8b980d9f82cf85a741e, 0x805979217bb90514988dc3a1, 0x3c6a195de3e6163393f551c8, 0x25a79dcd01f7db4a73a32bdc, 0xa7176752a77cd24ee908f424, 0x4b7dd5151993ff88a4c03c25, 0x5dcf4916e368e17734f83d70, 0x2e5f1a6e9dde29cbc71f3d81, 0xf3552a7a1a4bd98489ccd41, 0x9ef5fdc24b5f5aaf500cf09f, 0xcae76c7fc41ae096aab9df71, 0x579928c3ee25c5800351522c, 0xd5e2ee4cf7c598422d6ae639, 0xd5508e83d4ad6c99e73208d7, 0x7523da007c5afd2a33842db4, 0xb293a4cb6cfef6673c866725, 0x8b23e76640f41d8d279e3da1, 0xb6493b8f9d86cd0c7a64ca1e, 0x6bf55177b0690d6f60230935, 0x8d7f18f0, 0x0, 0x0, 0xcf9b94648da0dc88d439cb42, 0xb19c1b4ed7e72d465dc45fc3, 0xe22642c00a0c25f6a008c710, 0x6dbbd01b909f016773fb145f, 0xef242bc362f4d1468c82e39, 0xe34317b99d8a82bea65e106b, 0xbc454454e26d6db44e7963ed, 0xedecd51a67f3162e0c834c5e, 0xdc830b6c09e84e9eae0a9ca7, 0xbad8f2a473274a65401c1dd5, 0x992e8052530e7b5c61f9a3d5, 0xd5315b554e0bcb21a5ace36, 0x6b83a662e5b7114044086c25, 0xff316e31ab82abcec0cc162b, 0x8c98f344a4995dbd05e66a77, 0xe81a043b3a0e65a2659c0f30, 0xb36df7f95fd54501774f350b, 0xd5e3f5af9878cda0a39a3de5, 0xe6056818952b06acb4c81ed4, 0xe54abb01d005ca29cf99a131, 0xd209bc96061f13ab6005f749, 0x886b8d88, 0x0, 0x0, 0xeb52f6df556abbdd63bf5e22, 0xaed60e75dae57df80b34ec39, 0x70fcd3e27df287e5753b20d7, 0x128b5971e45761158b8f3dcf, 0x16bb42b3873e00053132b0c4, 0x8b0245e9a0219afeafd79a79, 0xdb9e91446865bc1fc657888a, 0x25a871a4d2ab4269bbea7ac9, 0x3ddca061ceff660108ef52d4, 0xa7e61c5901838a28c34d99cd, 0x7544f5dbb3defa0163d7f17c, 0xca241d14cc49fae4a772b7f5, 0xbe29d28849a5e324aee3408c, 0x836767d43077526f48faa2a8, 0x8cd32c65af954bc68d0e493f, 0x7892b889609b1f9e6f0d79c2, 0x278ce3abbff2f5263777664b, 0x81cd003b95994a5b17a7a683, 0x9c86115d81e0632d5fc3c81a, 0x997516ed4cc19a8a483d09d3, 0x1e179242d56cd19e4f7aa60c, 0x451e7279, 0x0, 0x0, 0x1fe5390dd58ec47ccaca6165, 0xee0376fd38d66576b38407b, 0xcf065c5ede16b9078ed8b950, 0xe401e1dba006c46264e08784, 0x52c0f066ccb0e51a2836dada, 0x964e301923a41c67dc6b472c, 0x3031e417f447570565032bc9, 0x50c821279b44dc3b5b074a72, 0xcd5a7aedb746388d9305d94b, 0xe93818f4b95a48f01baaa16e, 0x9d558ad11e2bea56a6739a4a, 0x8f98e3a980cc27f5514501f9, 0x1b5009bfd2a8cf3f3dbb7737, 0x6ebe9ac5b62d601eab9605fc, 0xba78365c99e325914055aca7, 0x62889d4b8f17ddedd15ad267, 0x1fee7dce2fad2700f8aa8817, 0x5b2a16de45abfaa3ca0f804d, 0x348b77de9a9e9fdd39057b1b, 0x2d4143c1cd9b408801ac0932, 0xa3cf55f17eb11d4fb32b9426, 0x208d6195, 0x0, 0x0, 0xfc49e873313de2978312887f, 0x5fbe773faa24320f70e6ea6b, 0x4256b86e9528473bdd9e6ace, 0xd74f172dbdba542bc9ecda9, 0x96924c9de06632dece3702de, 0x69358eb612656ca3198158e2, 0x6d79a01613661779c78e0032, 0x4e3bad2411014a48f1259b42, 0xd8871b2ea785f687de8c7952, 0x4be6a0fccf274cf898f145fe, 0x17c2c3616f78801493116b78, 0x940f2f0ed4e8f04ff92ffadd, 0x9b5d10dd4a3522d51f93be51, 0x1556a11712de4fac4f6f42a6, 0x895f21afa42c4af48861ce0f, 0x226800704f911bf97dfd3f55, 0xe51750defa8db7ae997056cc, 0xe037899ffa2f92560d0555c1, 0xd2e12a9746629d0f3e5d14bf, 0xa960a9ca8b8dd7220eb506db, 0x66bbd4ab5e553d07fecab1bc, 0x3307cd8a, 0x0, 0x0, 0x67f2457b8c831d56a9929a0d, 0x96e370441e52fae5bbcae56d, 0xa93ed687236fc53206e0419a, 0x7fe79b87578b0d38b0d1c317, 0xf48d8398df15059bb792f949, 0x2514308d75b0450ea06b07c6, 0xe85e7668282416c14df6e0b7, 0x703fae82d76ba4de92480e44, 0xd86b0d011d4e5e495c06d796, 0xb329a5d9c0778130705ba25f, 0xbe8a7bef6b49924124bf136d, 0x719510f51704a78a4b63090f, 0x3be3feb5ceb690d534e57107, 0xd0a2d35b72ad6978b8bde8b3, 0x936079a39d638c5c33d6eadd, 0xe177aa16d66b4356a9f9bce2, 0x9a626604f2f0d249417e0ea9, 0x6be7c6bd4f517bd69fece5bf, 0x923735990296cdfb6fae17d6, 0xc1b535aee17900ed24102daa, 0xf2431179faa78ff59fd6503a, 0x202114b4, 0x0, 0x0, 0xa9dc684ea7a072c583378bdc, 0x234eebfb13b9f83dbedc9689, 0x46f68cddc2dbc0748d995ad3, 0x4338acea2099179babc1f7ab, 0xcc0fca21384a6773f735d8eb, 0x5cc17f9d3c9d8636229c1adf, 0x5af4b70e86e1d9ebcec76328, 0x73474b28f23261bbc278997f, 0x60b65df1d9c6c2025877cbc7, 0xe5f371b392daa99d60dc68f5, 0x6d459b8018d80c189e4fb2db, 0x3b782f2fb21f91af6f955e29, 0xe58e194ead8b059afb9cc6e5, 0x714a92db56aaef13c5eb239d, 0xd17462b734aae256a7c053bb, 0xc7364388960d6831d60e8379, 0xa6e642a3822390a909108133, 0xbb3455c47c1d625f04473e54, 0x473a8914fd186b8c2f53bd98, 0x56cb778707e253d5bcd9c897, 0xb212545df5bc302598e61647, 0x879e816f, 0x0, 0x0, ] .span(); let public_key = Serde::::deserialize(ref rsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let rsa_with_hints = Serde::< RSA2048SignatureWithHint, >::deserialize(ref rsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_rsa2048_signature_assuming_encoded_message( @rsa_with_hints, @public_key, ); assert!(is_valid); } #[test] fn test_rsa2048_tampered_message_seed_0() { let mut rsa_sig_with_hints_serialized = array![ 0x766ad7a96b6a74dcb0d4ee21, 0x3c31169ffb4c539d20a19c30, 0x4813ed39e65994f370938d52, 0x19c0d08706b4597638cc3e30, 0xc7e80539ead20295baaa808a, 0x299992cbadae99aeb97422ae, 0xb226c9a7b454cef99bca662d, 0xbf70d4a08cf48ed827e59567, 0x7f746d2d77af83b2122fa87b, 0x9aa92b2128d9725d8656dd96, 0x3b526db14be8de881d9d16f0, 0x60ef9dd9b7346128d4904a2d, 0xc956b02d42c83dcd03152b6a, 0x417242ec1b72b9d2c28b3a8e, 0x31094b84fe9156b6d0462fe, 0xaee058ad4254ba267bfa369f, 0x236079af55b0b25854deb6d, 0x1e371829465e97bdc783fbc4, 0x308ac6dcf29aabb20d05c85e, 0x250ca4cbef9a5ded24279a60, 0xc2667b7be6ec40e1236d59df, 0x92c2ffdd, 0x0, 0x0, 0xccd4d72e904d8d17594ab5f7, 0x39711006ced57a24b0b3ddc, 0x2ccfe85722998e88ce696503, 0xbb4d033f6bc441dd1a08890f, 0x126b5e07fd274f3c18f28ad6, 0x6d1e293c0af656e2d1d56a47, 0x311e4ff1497cc51e1df029af, 0x9b5c4fd21b926c416bee361d, 0xc2763b9d1cc4af2edb1ed69b, 0x38c872d56da6fbe02f39f2b1, 0xbf55fbbf55d4cc74e2b1257b, 0xe6128d2cb2c59820b674fdd2, 0xa13fdbe9e48e2bf32e68a32f, 0xa91b93a068472e0dda54fb2d, 0xddb762befe90bd234be8b786, 0x8de87eebcd0e03fcc11febb2, 0x58c09101bebc3bd1c58c0616, 0x7ebe6e4cc8aee40772b501ec, 0x8e478ff6dd4c4a4422e8f182, 0x10d134c96c1d30ec1c29823c, 0x5dda7fcba4eb273a149eb833, 0x5c6704f1, 0x0, 0x0, 0xa9dc684ea7a072c583378bdd, 0x234eebfb13b9f83dbedc9689, 0x46f68cddc2dbc0748d995ad3, 0x4338acea2099179babc1f7ab, 0xcc0fca21384a6773f735d8eb, 0x5cc17f9d3c9d8636229c1adf, 0x5af4b70e86e1d9ebcec76328, 0x73474b28f23261bbc278997f, 0x60b65df1d9c6c2025877cbc7, 0xe5f371b392daa99d60dc68f5, 0x6d459b8018d80c189e4fb2db, 0x3b782f2fb21f91af6f955e29, 0xe58e194ead8b059afb9cc6e5, 0x714a92db56aaef13c5eb239d, 0xd17462b734aae256a7c053bb, 0xc7364388960d6831d60e8379, 0xa6e642a3822390a909108133, 0xbb3455c47c1d625f04473e54, 0x473a8914fd186b8c2f53bd98, 0x56cb778707e253d5bcd9c897, 0xb212545df5bc302598e61647, 0x879e816f, 0x0, 0x0, 0xf11082a78e2349176eefb845, 0xa2c474b18dd8215e6ce79a2, 0xaf8397d226331e6fe0287b82, 0x2021be0dbe82e1d87ff0464a, 0xf9f671cbb480c9ad30e96b04, 0xbf0341d821907bf2d1714934, 0xc4133dd8b0fbec701c6bce5b, 0xab8a9912700daed15fb14efb, 0x6408b84f7f8cfcc466adb647, 0xed064d750384670cdc484c57, 0x10d17bd4d1d8b673945244cf, 0x3661fd2009f806b98f962802, 0x3ded8d1c80a858c317f106ea, 0x69490720cdaa41dd567bfd75, 0xa2e9da91a7303beb4b22e507, 0x63d845332aea5d5d79157f21, 0x1ba1ef9812c965e541b8c9e7, 0xadd80c35198e137ffef51c0c, 0xec2ddf921bd92a5be54e75d5, 0x9f260f9358d8c772581bc666, 0x49cb9677cbc1c13c5b5a6b46, 0x3a2d6680, 0x0, 0x0, 0x61ae0775f0594f0d3ec84d6c, 0xcdf82c4368c89d619ad6c4ec, 0x16634f8f537349438fbf800f, 0x18bb5fd323098da014d9e4e9, 0x3de3d2b1c1ce83174249eac3, 0xe04e43c5856d447e64fb2c49, 0x8315c17c23405e47aa9dfdaa, 0xdd3e2d06e6755e5877139c96, 0x1de63f44a100a924034140b4, 0xd1c1be2c6c01be2cb6165113, 0xb3f8ef010376c8d557dd3a74, 0x5330b322e6537546d099577, 0x50feacf7ef56d00d299880d8, 0xde8af60590cff5c21c9021e0, 0xc719c781d43d99eac9c9a446, 0xa03f627aea3b9c54fe08cb8b, 0x2fe3ddee1358fa008dcfbd75, 0x183d0552096beeda805632ba, 0xead565b3a9fd13f32d94abbf, 0x8aa3b518bf3670dc8a44dce5, 0x7ce23145e486815f1397916a, 0x836001e1, 0x0, 0x0, 0xa50443039d3dd37156158183, 0x383a7d1fe53348285bdd2f37, 0x3e634aab243fc03bdd9548c9, 0xf63f0748d8ca9bc50034c997, 0x5cc782e51c7c576b5cb62457, 0x767abde2f4d3fc3d27c8dc12, 0xc55ace8470f37a3727c4cdb6, 0xa970e7780d86111b86e8184c, 0x3b930d12e10453014f602550, 0xe86920884a33c79d586e5b08, 0xe1c35a842d9968776b9a5756, 0x2d87248120b10947502a05c9, 0xce2325942bb6cfc89ac9a16d, 0x3023e567a6aeaa0e56e67c5f, 0x931367e2e28f64cf5e67881b, 0x5086944531c4016e1b638c8f, 0x2041352d23b8eb7553c90821, 0x45e38d7e09438b118b8c8797, 0xd15618e1fa2be214b20a2b62, 0x613c5bc02562fac980d54ff6, 0x3547852fb77b7ad22f7a3809, 0x7599fbf7, 0x0, 0x0, 0x25772373859fcc1ff880a9ad, 0xb3d1a77be83203586116cc33, 0x249ddde6a735af8d54f76e5d, 0x126236052ece65c16a4f8147, 0xc14108cea2b89f8bd216819b, 0x31e5b9cd08617bfbebc340ec, 0xc533488c6e32cee86b51bb65, 0x3427cbf5c389545877454003, 0x5f471a99ed38c12709340c97, 0x782d84eec1f578cf6332df12, 0xcff0e44dab2705c3df8ed43b, 0x828932cdc82c07604ed8aa16, 0x3f3c04ef18aff4f15ecac8a6, 0xb00f3fd36e39d0b3ba293f0e, 0x98e9053c9079b132080e1433, 0x8ae039670f1f588d49b0ead0, 0x84e04057fe631a9950e3741e, 0xf0975e0d1d87294c0779e4a5, 0x9af5116c3122c9454c33abf9, 0xfc8e70dd2f1882948bfaa669, 0xc4110d0bb3e3fe5bd4aa3849, 0x63ed1112, 0x0, 0x0, 0xdde6339489f82be2a548914, 0xa6129a46e7fa08cf79fe8795, 0x4ecf9c35860837ca5cc9964c, 0xce764f24f9a04630792a3962, 0xb037bf199470e6de572c42bd, 0x956ff3546d57ee943af1668f, 0x9677e96ffddc8fb4befbe60b, 0xcc50d5f30da8488eda5e2c68, 0x5c1aee3bac6f9bfcb475b589, 0x417cbaff0027179506246182, 0x4884fa40151152ccfb8f2361, 0x5fad486584738fb532be17dd, 0xdafafed3e1c4cd027bba63c0, 0x7f443066f06aa1556dd9abb5, 0x4b627b9936231df8ae4b77a0, 0x84fb2d5a4f24cfe981dbfad0, 0xb876a978d779736ade0abc08, 0x5e6ecdc675a0b2c27e3a310, 0x68b895aa08ce6e80cc24b677, 0x933d588163cd237a200f2ec6, 0xdf366116dbf8e636789c8917, 0x440972fb, 0x0, 0x0, 0x4c43909d3df7aa01fc8f9b55, 0x573f92547eed486eaecf4fc4, 0x706df3b0fa507cf78864078e, 0x72beedac7c3f62c50da7858, 0x7b01b47908dafa52fa8f40ca, 0x42c7fe0d226b199ff3a8b27a, 0x2cd291e0f2b7259731ca1103, 0x9936fd0d86cce4683dbd3593, 0x6fa4eae97809921e2e8f1c29, 0x61bcf43cb948de83f418604c, 0x4be8bf5f7aa4f97164b57e28, 0xb2cac9559ad2a26568d798c7, 0xc9e3f5b00702b0a067b7ce6d, 0x42738b954118f7fc09daf06e, 0x936703c37dcc919aeabbf3c2, 0x8234f4da6b15efc32f91b03a, 0x51016906f1aba3d0051cc8d8, 0x29c616b65059e5257568c86a, 0x9e7959ef4cbfa69866c3ae8b, 0xad55fa216ca080ce5f33515a, 0x4010f7d945e56f9faaaeed47, 0x59c35b15, 0x0, 0x0, 0xbd7ab4dca711f0d929017d0a, 0xf6e1b23766720a08df2e064b, 0xf743a47b9ef21525e4a3851f, 0x2e9e91630551f14e278d959f, 0x450e114a827f3fe74024242e, 0x768f0b12f0fca0e28cad2d5, 0x6f7551b524fa35f7afb69fb0, 0x503e453c615811e1bce63aea, 0x89d3c0aa219ca344b32b4a69, 0x9847c02179a77916a0aad3d0, 0x363a2da6bb7cc920afd971f9, 0x105756bde27aa2e4a1654eed, 0x782316203cc0dd1bde9739bb, 0x729e9df0a4384508f628312a, 0x7c58ad79ca4ff22633b6c393, 0xc25e962083bee700b96ce224, 0x4b99b07dcff3f811dd6d63e2, 0xa07af35bb0745dd4de9d5dc1, 0x2362f99b653a6d200acdcf4c, 0x7ed1f7a32c6633f50a1a6d1f, 0xc67831f8385e2ebf6c0e15ce, 0x36e6be8d, 0x0, 0x0, 0xaf2e85f517483d20277d9fef, 0xa6c8e9ef245c3cfbe92f5583, 0xae0e652d9bfd555164f5dde9, 0xac463ea67f143f6b90484d24, 0x292d0d6d7a0f61537e241903, 0x1dbd26b03b4c300939500257, 0x38f5405d2d4eb07f94eb4174, 0xebed3bea8633f2024a17fa8b, 0xd8029bd940f48c17be9061cd, 0xdb881dc57fa541995190cffb, 0x28dbb1531a44706a35f17fe9, 0x47ad149d189b70df6962e01d, 0xe56b6feae22bea7827cf0aef, 0xca565c0873f303db366b4122, 0x18739e8523299686923d88f7, 0xe4c0c42cd30512c887141263, 0xd6664b534d1f54775647116d, 0xccdd2182bb113823e3c8cae, 0x5351a577848f05aa228c7e, 0x12209ca46ab63bc8985be0c5, 0xe39f22696539616774a946cf, 0x857b13e2, 0x0, 0x0, 0xb4b75cf7190e9fb150c78ed, 0xebb37162b1d1a0cc8ed4e70, 0x2e90eaa6bca468a75954af94, 0x921837f27c919b98ea12bd7a, 0x938d23cf452c57690e41acd9, 0xeaeb0bbd339278e588377648, 0xea059eb1bcb1327413df220f, 0xf3d015ee9a83e173bbfe05db, 0x6eca8ea01474071813e0575f, 0x478da59c5392a7c4859552b0, 0xd53538319b99b57602230736, 0xdfa5ccd9411adccaae6481fe, 0xfbb3284f1a46aab145b14e97, 0x54ac3cb4084ce72b420b1440, 0xfc0030ee568632dc99eb3e3e, 0x67838dcc7ffababee905e4cb, 0x1dccbde1880631c960965f05, 0xd92ae551a3b09f2b1914b2c9, 0xb92dfcad76ba37636909b5ba, 0x6d02704ea436775eb9eba0a1, 0x1239f0c36942aa41d0fdb583, 0x7966d36b, 0x0, 0x0, 0x2f0370e0de67e0e0204d494, 0x41e6a7ffb185c93fc567919f, 0x33b32ddef77fc52a3e1b5a8c, 0xff9cdac2a8555b74120dd0a6, 0x374fe9884c8e839da4c5b64e, 0x765771b2daeb10f3e43d714e, 0x6e482c50677c27f548576bb4, 0x1ba9ee7076cc48c2028e07d0, 0x2d544810350024a0c1b4d179, 0xb8f7bf71b996e3c125d6df41, 0xe1527c84c71956afc34f6845, 0x8c339e263df547b486a303c1, 0xd671bf4705270e96c2dcecf6, 0x8e2ab787b0d997e2c435288d, 0x5aa9c5acfa39c50a3921e905, 0x99a4f9d3b39672a4ef023e78, 0x299824406248082c032f9e88, 0x5cce13392a9c02c95f51a627, 0x8ad6ee4d053df429a6f03f9d, 0xdcf0e7cafb7fd7f3c7f87d80, 0x9aebea38b3e33b2b482c8a04, 0x8bf92cbb, 0x0, 0x0, 0x9f7d6f589e82e9756cb90734, 0x1efc494737c83d8d1e5555e6, 0xdc14db376bb2abe4ad6c5145, 0x6350095e5153267e0f7cccd6, 0x2f11b257bb2b86998a1c4fe1, 0x1b0f01fffa4cb3d342c3331d, 0x45f2b93d6b87e6c14c8bdb25, 0xe0443287f9111fd56efb078b, 0x1560ccb1b67cd638d2ab63d1, 0x48598e67a7c87a38e45761f0, 0x42e95914d4ce2835d31ffdff, 0x39b5c97ac03b49dc9f8f6118, 0x1264a7647a6a15794f811a46, 0x83c3d06dbfb2b86373c10c27, 0x930c355b5fa314b6b1620102, 0x22692e942620240d77d0c6a9, 0x7b8897708cd33be40719d6e3, 0x7df5c691973b2ebe3fad0373, 0x6703a5c064a846c40c588c44, 0x2ae4b8ea5e745d2f0c269bbe, 0xfe723d71902007fbc8a70662, 0x857fbb68, 0x0, 0x0, 0xa5af2060ca06c184e5892fdc, 0xddc0a0a99021868d6da0893d, 0x24b56567184dc2acbcf5c73e, 0x160ef95f8c1f209f220add52, 0x2534d4dbc6d040d83fdb27e, 0xe9975a62f1ec391cc7426ae, 0x491ed56f50664e259b8ebad8, 0x7fd81ec116d12e3df8c35dc6, 0x2a894fd7972edf7865cc64f0, 0xcc22be61d6c9dcd87bbd11f7, 0xfd08aef895fe6b35568a1478, 0xf859f2778a321a7653ef2225, 0xf76ab371c23da4e6581b30ba, 0xeb87317e55dee41753d04513, 0x65f710857dc2c2200f569276, 0xda8ec2912b42abfb71ff2aa0, 0xef0a6b1ecc8548494c574227, 0x91b537e4d720dfa8b9997cd2, 0x7c31d1185eca8ca5c6625a84, 0xb78354ea69a8e98692057c26, 0x8d1da54563cc19a1f35e8c2f, 0x639a0b16, 0x0, 0x0, 0xa875570c9d0284f771cce145, 0x591c0201ab939b39b4e90b8e, 0x637eda8b6d46c7f37c41ba1a, 0x4108ec753bdbd2b8355b71da, 0x3e09320343a531c8f224f413, 0x1b9bf7cf3daf215cb444a32d, 0x41ce25a20127e9fb2c094c62, 0xace162be846660ab7dbdf99c, 0x2b033b29ca496f3fd509fddb, 0x9d4c1e14a408995d3f7c5bbb, 0xa66dc01cfd2bd5f969dd2e4f, 0x627f37970e930fadd339ee01, 0xc9aff619c84d5b4d8397cab8, 0xae250d0978d29cc49ab124fa, 0x2a5d7e131b5b9e30a46c41eb, 0xd55d087936c566f14dde0f46, 0x69846557a74460713cac372f, 0x8d8ab518931b5aa875a9d0b2, 0x27710e2b2af85a3b75ea264e, 0x1d3109d2d289a899712e2dd, 0x61383d251a5299190b540559, 0x4398936f, 0x0, 0x0, 0x747e4b323bf2a87bb86f552b, 0xf7f2ab1dff8cc754dcdca592, 0x1f34a08fd4c07735a767dc51, 0xe746b680a62bfed15401f9d5, 0x97f4eb618871a00cde3631cb, 0x8339d6fbea40aa941ad85327, 0x90c5edb34de4570c96a5a8f0, 0xefd960fb4e9b509a7e987b10, 0xc05807b47e82a5d7c3825160, 0x314c4c6704487c24b8f15709, 0xc392683af214f5f11cf3b479, 0x948c6d20cd304068c11bdd9, 0x3c78b7c1b58f7f9a72fe71d9, 0x9c5e03c8abda7529065625d5, 0x1a01ea030d11b96aebb1a48b, 0x8c7d949a55df28049f8611b0, 0x9e8bf8c8d36ba12e7aa228ac, 0xb9fce7d6eefc436c65b5c89b, 0xf8136f55dfb42a001616e769, 0xeeb08cb097dcaeb0f5243d31, 0x94d23cd76a90197b1a55f77c, 0x260e3765, 0x0, 0x0, 0xcd3ba7bd04a31b040366053b, 0xe6f10c837922880344fc9e38, 0x5d689eba02224e76eb42b684, 0x6e7643cf0b82715749e94cc3, 0xd140b4dfeb987b80865ec722, 0xe94da4823df0f77f53fbe6b0, 0xa1464b2c1b416476e7472812, 0x94a7a32cff9f1d73f72e09ae, 0x4e74a3c7d9049e7e96cc9ea, 0x1110951d3cc54cf1cf14d94f, 0x67cea4b746527cab8d59000, 0x36179b0c462d4f5cf76e42a2, 0x1742726164e268484e912ab, 0x22709f163ff2cd135caf2445, 0xf81d959cb2c9f991011eaaab, 0xf4f1c1cc347528cd1a4e1e62, 0x4664c8151c0d996bd9f0420f, 0xc086ba3be97b7ee3105c59c4, 0x9672fb601d8e57065a40c748, 0x6f878822fca3f1d46f3a48d0, 0xbde69f62a7e1eb664ba1aa3c, 0x9de2bd9, 0x0, 0x0, 0x4482aeb75faa1cb499c00e9e, 0x8b344a97e26bd3b78fdf7075, 0xad4d20ca51614ca72be40048, 0xaf5d2f7ebfb641ff1b918596, 0xb6d8ec60ccce46edc936e0cb, 0x690e2923dae76b1c1a8a60a2, 0x85c2e3ef5f249cd3e100bbac, 0x4d9a6bc3931d8bac5d9ac6ee, 0x169d730a5e2e1b69821c527b, 0xc15ca47f3a1729e6c2a9ea74, 0x474fa9cf9bd7331ec6810757, 0xd422d04149b9b0debce1cb01, 0xb7efd18fc08f89555d4c11b0, 0x269d2078f1960a85fc421a70, 0x46b5771a2f9d3510c9c3769e, 0xb623a42327ee23cbcb526328, 0xbe8a45ec511d7a54c64fde80, 0x3328dfafc42b91b1c69e10fb, 0x264c1e6be83c39fecf98268d, 0x25408a50e9b65f70f5df411a, 0x41334cb48418bdccbe5c4a47, 0x5c88a46, 0x0, 0x0, 0x25316546d55f7e0dcbe6a3ac, 0xeacfb5cea96b8a320936b33c, 0x6f6812d56f2c9d3dad9d17dd, 0x684a95ba1fa821ea81a11556, 0x1641c404477985dffd7cc386, 0x871d716b23e46bc3b4cf9c86, 0x8fb05800ce27e75c87859c5f, 0xf74b57029f2826c3d32008f1, 0xd5b3c939cbb451990b332659, 0x3a958ecf6774f75eef392e66, 0x5faf5e626a2d5c1986e4531e, 0x8579929032fe8da13ad1017a, 0xf19fd7bd978667567947badb, 0x658966b7546c960300b13096, 0xaf6c205a1a8f1b46855a36e1, 0xc1c3e6045b8b25a219c1335c, 0xf0fa6ff6bf56bcbb0116f9cf, 0xbd84e957d385047457f5b35f, 0x9421fc8ca5d0f21eaa8a7af2, 0xddb3c45dacbe09d2b201c3ce, 0xd931044489e3194da19542cb, 0x3a57c4, 0x0, 0x0, 0x9c2e41e8b5c429114a80a858, 0x5a966e31657c7f8c4b03d19a, 0xf6d631a3b323e9d2d0bf9577, 0x5344cc9641e9b5f74f7112af, 0xe429d282cbf83a3a6b9d4cbd, 0xb7113a43b4dd22a6685afcef, 0x27da7f0630345d55a449bef0, 0x20d6e5d82e5c8e25fee2526f, 0xd4713cd17ed740c4e73e65e6, 0xcc3bcbff28c0d7c447d07124, 0x23305fe2dee2774c0c4edcdb, 0xd281cfaeed124f6cb215f85e, 0x9601c6e2be06ccdd44830d12, 0xe8c75f8ea6aff1231d173084, 0x590ebc020ac0a24a9767b4b3, 0xb8a534f177c2d240170ae8b4, 0x792877e41b28f602a3a9af96, 0x187312ca50914f7652ece934, 0x2d4a3f443efdb605e7461262, 0x1d7d53cf6231accf900fe2f3, 0xbc39ae48093f0259794962a7, 0x18f99fdb, 0x0, 0x0, 0xffa9482e842897e00f682bfd, 0x834c8268bdfe3fe9126289d7, 0x285ef56cdea1beface4af9b9, 0xdf26308909c6236175c8b94b, 0xd0f05616288f3037160caaf6, 0xe037d0024d1c561b107d4d59, 0xb53d73e81fea4422d6277248, 0xe198cc789000080db790ae73, 0x4a534c95b61cf17c5ba235bc, 0x908c97c0440dc62088b9a69e, 0x7ae47a71e12de983ef98db45, 0xf8562cc339b439ad34d2fc63, 0x2eb470ce422fcb4897856278, 0xd00c1f59bbf2e4200912498b, 0x46cd5901f82298f50f8f37e0, 0xda394bd5a6faa8c6f98d178d, 0x9489f43f270c6bd97a56f14e, 0xba345afd6fa08c5b66103257, 0x172117c1bd860df49c7f68f0, 0x693100c5b36bc3d8210615b0, 0x2c8d3dcfb83ac31efe164c, 0x4400815, 0x0, 0x0, 0x6505fa9f69a8798873dcbca3, 0x540522659d27e26b155741a5, 0xb2cbbe014d7b317df5281b60, 0x3159a1e8a255736027c15b00, 0xec172ec870f4885861fa715, 0x450108025ca4fdd95d3ea4be, 0xa7ca5bc05077bd9a6fe4f01e, 0xdeea885ab4bfc82189ac2b72, 0x9468616b7bb8b2d1eb378868, 0x56276a0966928b08971684af, 0xd16a3d10a6032348f539e2f7, 0xde3dc7466c581674d211cdfb, 0x5440706286f05e61df345166, 0x1cea89c8227619129efbe254, 0xf84c4b9dcc9de5cfdd1b745f, 0x7439a70edf670ccdb8757ce, 0x9a9d2a2044ce0c63c7749a64, 0xd575c9cb73c6f9d36bb8d1d7, 0x5a9ee0be1abbe2291846dc4b, 0xee674484c468ac3848193a80, 0xef5f5b67e32d2ec4ebb4cde5, 0x3080adc, 0x0, 0x0, 0xf6183ed40d6aeb397805b3da, 0x8ceb48f0508ff239d7bd175b, 0x9f0b273513d427b0a7d38648, 0x82b3956877f67e15e22f2b4a, 0xdbcdf5049103c9c7b7ee4bb5, 0xa4880f67b985ed22f3b7ca29, 0xccc0bac7846da5cc7c7ec380, 0x26fada19f84b75c2954ff0d5, 0x607e2a4f32863fead642e8c6, 0xd81931fe7d0a479f060e12a4, 0xdb46e7ef3efca9bef3b7728, 0xedba7c2de2c90177fc3f4840, 0x956ce80fa9fdea3dcc2a6ff3, 0x5a8e76cc6a2b0143634b7489, 0xff054f521cf0d1a934283a01, 0xbef59d14565d6ba48d073ae4, 0x650b2d52c1122a56007b90a, 0x7c76c9af9f608addb1afc04f, 0x2ba9ee990da5b1a115506e61, 0x56ffc7c840d5cb87a0d64779, 0xfdad49c955958334a75424e1, 0x100788, 0x0, 0x0, 0x40f427e784fe2b4a9eaef4af, 0x2f0795ae8e0911ef1df50341, 0x90df7762e822199b4e8f9dd8, 0x3a0b913a4eaf581bb478be28, 0x207103d33ce1e0b8493a8cd4, 0x8656a65ce57b0b8a4dd5622, 0x7f95bcb4d175408d176f192c, 0x3e7c781e0afc6ece0cd3fc3f, 0x399d9626316a4a703009d68a, 0xa406d4c272643c0e932ccfb, 0xbd7c66e6c97d1c5db9fa9355, 0x8eed69ec5068d7cb399c4ffa, 0x79fabd0f06e0921e6cb79d77, 0x8cbbba1bc258146680adf88d, 0x16fcaf5768364d146bb355ad, 0x225fe736e47e97ed2f956d95, 0x70d015c5a2328fda9308b98, 0x673d4d765ad984ed15b17de0, 0x1e5a5778fc5a30396b36b904, 0xe49771bd3a3478f09574b1ea, 0x35c5a852b2225574a7952926, 0x353afb31, 0x0, 0x0, 0xba3c64ce6140f14718d0875d, 0xaea551a60be2bda2d6bf6db3, 0xe8a0282d2347aeeb81e33e89, 0xb8c1ab53b1e38117bc833379, 0xf028317bd0b9336aac1c8012, 0x3c856cf187839e9d21dfc4c3, 0x880a5e18613966ff8cdd7cd8, 0x79a454208ea16d30679cf088, 0xf3ef14e5fbbed7488440d7ea, 0x418e97737d58665881d8462, 0xf4fc8d9df7440e8998f035ce, 0xdb8e672415f226facf42e72d, 0xe589c0b91168de2021f13fa8, 0xa3085040132adf68a6e77dad, 0x94431ba64e4a6e6b83409212, 0x26e5b535fb3ed44b9a28e8b5, 0x52ce3fd32264c1d47149801e, 0x9c8ef28bf945bc77a227b011, 0xabb4c1b5e2a27b69704cac21, 0xcf74f58df7e45d4826769eea, 0xb2159f7de25a0c030219cee2, 0x134e7fac, 0x0, 0x0, 0xebd8d90c934d17dd720426a4, 0x33bea95aa8ad5797da6c4efc, 0x7fac880279bd173527763ac2, 0xd909e429bd1b54225afb9391, 0xcd2c7929287c08f6773cc15b, 0x3dcde19b61dd92d44568e30c, 0xc4fe323e9fcabf11e0fef9f9, 0x2c768c0140cad8de1b3f8295, 0x5ec06f9a55af974795824dd4, 0x71249dd9d21a50f8a5dbc25, 0x9c236dd1615cc0a9f1cfed04, 0xba5a73986d84f4435169a34a, 0xa02b96c267abf2aa37dde261, 0xc2e354265ebf226db4ead96b, 0xe5ce9a686d3e5e30e5e7d927, 0xaa9aa8ff79b86b3c71463e0f, 0xc7573536e36cb43693dbd891, 0x23b6e4c59c0de1ac968462d9, 0xb20bf031108b4e72afefe016, 0x21e962fb9134282b48547ad, 0xa710aa758ef9c12b377d9d41, 0x66af5f92, 0x0, 0x0, 0xfcbe8e8bc2857c63648e74c7, 0x3c387f8020a8e593e0b552fc, 0x8ad201a4b3f0ad06ca1cad3b, 0x89172fbe0f87df535688ccce, 0xa60fd06f89622f8e0ab0e81f, 0x9d95dfbbdbfb83d920f26406, 0x3100ae331c6bcdbd5bab2863, 0x1cd23a1e15830352e125d568, 0x6d486ad849053b6f55603009, 0x119e3472ed62abc0075a2f7c, 0x66cc98c72d2681a98920289f, 0xd6eb1f2dc51f8afa59605173, 0x6c3fa021ab66060a374d7ea0, 0x723138898370b39a75ee7b1a, 0xe92d868e3a8be03af9568450, 0xf2f5f837b5321258e6bc92be, 0x27361dd77e44ebee906a0ebd, 0x7003f43a6806ccd3b189ba18, 0x97b5b27be13f5b8425e2472, 0x855e2bd2e42c6b36bb09545b, 0x7aeebee267ae270f26abcff0, 0x47d88976, 0x0, 0x0, 0x8b00c396084b4115f3b0969, 0xfc60246f4f9cfb7e951de468, 0x8022a8e11b4f620d48a3ae49, 0xd273b3ebe223884b92885a5f, 0x5f57fa057af4248d7576fa82, 0x5e57e11d3c9f89b7cc0e4431, 0xbc5bcef6f56876529e294838, 0x32c32a62b1db35b064a7a2da, 0x35bd10f3388759eb1c787e1d, 0x63c601309b69160147d3db35, 0xb1f8bdc3cb3cfd5528610a71, 0xcf31a9f03bdfed10e2e83e2d, 0xa80331587c59ced241357ea0, 0x54ba8bd269e3759998fb3358, 0xc67a073c9bfd12d1c69480cd, 0x6990cb91da39aacae8f6ce2d, 0x3073b77341d7f8914f23e232, 0x39fb609d816e019cc062f795, 0x6c58563224905c46dfc15b2e, 0x1fa29a5d77347775bad7e2d, 0x35100e5348a3d6577246b271, 0x1cd09ea0, 0x0, 0x0, 0x254f1d592f204e7e1117be57, 0x637fe9b28ec4e1f1fdb5fab3, 0xfde99837ed06ee649f6a5eb9, 0xba50e700e7ce0dd5d699c0ff, 0xb89b6c7dbb34bf4c0741c2e8, 0x2c77cbafe161b05a3f5ccf95, 0xc147dafe9d4dd839dc184d0d, 0x78ca47ed2f48eabc1b8afe82, 0x368de7c0d41674796d946bf9, 0x88a0432c9a758fd891670603, 0xb356dffba421f23219149c12, 0xc0df0de9addab73f0c677b23, 0x87fb6390c845a00a2b8c2549, 0x9b188ebfb7e3b513d5ea61d3, 0x7733b7d80a0c1f1fb3b87794, 0x308c820f6a5ab36f0492ce8b, 0x5be8d42b69166421dda3b512, 0xd55839cff5548d24ad1cace1, 0xb3cd437bd0293cff21b2402a, 0x516f98df61b6536f450f3a71, 0xf3eec531c8051639aeb8eb9b, 0x5a84fc9, 0x0, 0x0, 0x3693b7dcdad0fb1d8dae21da, 0xaa2d5a7fee71d0e906cab278, 0x5261e8b980d9f82cf85a741e, 0x805979217bb90514988dc3a1, 0x3c6a195de3e6163393f551c8, 0x25a79dcd01f7db4a73a32bdc, 0xa7176752a77cd24ee908f424, 0x4b7dd5151993ff88a4c03c25, 0x5dcf4916e368e17734f83d70, 0x2e5f1a6e9dde29cbc71f3d81, 0xf3552a7a1a4bd98489ccd41, 0x9ef5fdc24b5f5aaf500cf09f, 0xcae76c7fc41ae096aab9df71, 0x579928c3ee25c5800351522c, 0xd5e2ee4cf7c598422d6ae639, 0xd5508e83d4ad6c99e73208d7, 0x7523da007c5afd2a33842db4, 0xb293a4cb6cfef6673c866725, 0x8b23e76640f41d8d279e3da1, 0xb6493b8f9d86cd0c7a64ca1e, 0x6bf55177b0690d6f60230935, 0x8d7f18f0, 0x0, 0x0, 0xcf9b94648da0dc88d439cb42, 0xb19c1b4ed7e72d465dc45fc3, 0xe22642c00a0c25f6a008c710, 0x6dbbd01b909f016773fb145f, 0xef242bc362f4d1468c82e39, 0xe34317b99d8a82bea65e106b, 0xbc454454e26d6db44e7963ed, 0xedecd51a67f3162e0c834c5e, 0xdc830b6c09e84e9eae0a9ca7, 0xbad8f2a473274a65401c1dd5, 0x992e8052530e7b5c61f9a3d5, 0xd5315b554e0bcb21a5ace36, 0x6b83a662e5b7114044086c25, 0xff316e31ab82abcec0cc162b, 0x8c98f344a4995dbd05e66a77, 0xe81a043b3a0e65a2659c0f30, 0xb36df7f95fd54501774f350b, 0xd5e3f5af9878cda0a39a3de5, 0xe6056818952b06acb4c81ed4, 0xe54abb01d005ca29cf99a131, 0xd209bc96061f13ab6005f749, 0x886b8d88, 0x0, 0x0, 0xeb52f6df556abbdd63bf5e22, 0xaed60e75dae57df80b34ec39, 0x70fcd3e27df287e5753b20d7, 0x128b5971e45761158b8f3dcf, 0x16bb42b3873e00053132b0c4, 0x8b0245e9a0219afeafd79a79, 0xdb9e91446865bc1fc657888a, 0x25a871a4d2ab4269bbea7ac9, 0x3ddca061ceff660108ef52d4, 0xa7e61c5901838a28c34d99cd, 0x7544f5dbb3defa0163d7f17c, 0xca241d14cc49fae4a772b7f5, 0xbe29d28849a5e324aee3408c, 0x836767d43077526f48faa2a8, 0x8cd32c65af954bc68d0e493f, 0x7892b889609b1f9e6f0d79c2, 0x278ce3abbff2f5263777664b, 0x81cd003b95994a5b17a7a683, 0x9c86115d81e0632d5fc3c81a, 0x997516ed4cc19a8a483d09d3, 0x1e179242d56cd19e4f7aa60c, 0x451e7279, 0x0, 0x0, 0x1fe5390dd58ec47ccaca6165, 0xee0376fd38d66576b38407b, 0xcf065c5ede16b9078ed8b950, 0xe401e1dba006c46264e08784, 0x52c0f066ccb0e51a2836dada, 0x964e301923a41c67dc6b472c, 0x3031e417f447570565032bc9, 0x50c821279b44dc3b5b074a72, 0xcd5a7aedb746388d9305d94b, 0xe93818f4b95a48f01baaa16e, 0x9d558ad11e2bea56a6739a4a, 0x8f98e3a980cc27f5514501f9, 0x1b5009bfd2a8cf3f3dbb7737, 0x6ebe9ac5b62d601eab9605fc, 0xba78365c99e325914055aca7, 0x62889d4b8f17ddedd15ad267, 0x1fee7dce2fad2700f8aa8817, 0x5b2a16de45abfaa3ca0f804d, 0x348b77de9a9e9fdd39057b1b, 0x2d4143c1cd9b408801ac0932, 0xa3cf55f17eb11d4fb32b9426, 0x208d6195, 0x0, 0x0, 0xfc49e873313de2978312887f, 0x5fbe773faa24320f70e6ea6b, 0x4256b86e9528473bdd9e6ace, 0xd74f172dbdba542bc9ecda9, 0x96924c9de06632dece3702de, 0x69358eb612656ca3198158e2, 0x6d79a01613661779c78e0032, 0x4e3bad2411014a48f1259b42, 0xd8871b2ea785f687de8c7952, 0x4be6a0fccf274cf898f145fe, 0x17c2c3616f78801493116b78, 0x940f2f0ed4e8f04ff92ffadd, 0x9b5d10dd4a3522d51f93be51, 0x1556a11712de4fac4f6f42a6, 0x895f21afa42c4af48861ce0f, 0x226800704f911bf97dfd3f55, 0xe51750defa8db7ae997056cc, 0xe037899ffa2f92560d0555c1, 0xd2e12a9746629d0f3e5d14bf, 0xa960a9ca8b8dd7220eb506db, 0x66bbd4ab5e553d07fecab1bc, 0x3307cd8a, 0x0, 0x0, 0x67f2457b8c831d56a9929a0d, 0x96e370441e52fae5bbcae56d, 0xa93ed687236fc53206e0419a, 0x7fe79b87578b0d38b0d1c317, 0xf48d8398df15059bb792f949, 0x2514308d75b0450ea06b07c6, 0xe85e7668282416c14df6e0b7, 0x703fae82d76ba4de92480e44, 0xd86b0d011d4e5e495c06d796, 0xb329a5d9c0778130705ba25f, 0xbe8a7bef6b49924124bf136d, 0x719510f51704a78a4b63090f, 0x3be3feb5ceb690d534e57107, 0xd0a2d35b72ad6978b8bde8b3, 0x936079a39d638c5c33d6eadd, 0xe177aa16d66b4356a9f9bce2, 0x9a626604f2f0d249417e0ea9, 0x6be7c6bd4f517bd69fece5bf, 0x923735990296cdfb6fae17d6, 0xc1b535aee17900ed24102daa, 0xf2431179faa78ff59fd6503a, 0x202114b4, 0x0, 0x0, 0xa9dc684ea7a072c583378bdc, 0x234eebfb13b9f83dbedc9689, 0x46f68cddc2dbc0748d995ad3, 0x4338acea2099179babc1f7ab, 0xcc0fca21384a6773f735d8eb, 0x5cc17f9d3c9d8636229c1adf, 0x5af4b70e86e1d9ebcec76328, 0x73474b28f23261bbc278997f, 0x60b65df1d9c6c2025877cbc7, 0xe5f371b392daa99d60dc68f5, 0x6d459b8018d80c189e4fb2db, 0x3b782f2fb21f91af6f955e29, 0xe58e194ead8b059afb9cc6e5, 0x714a92db56aaef13c5eb239d, 0xd17462b734aae256a7c053bb, 0xc7364388960d6831d60e8379, 0xa6e642a3822390a909108133, 0xbb3455c47c1d625f04473e54, 0x473a8914fd186b8c2f53bd98, 0x56cb778707e253d5bcd9c897, 0xb212545df5bc302598e61647, 0x879e816f, 0x0, 0x0, ] .span(); let public_key = Serde::::deserialize(ref rsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let rsa_with_hints = Serde::< RSA2048SignatureWithHint, >::deserialize(ref rsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_rsa2048_signature_assuming_encoded_message( @rsa_with_hints, @public_key, ); assert!(!is_valid); } #[test] fn test_rsa2048_tampered_limb_seed_0() { let mut rsa_sig_with_hints_serialized = array![ 0x766ad7a96b6a74dcb0d4ee21, 0x3c31169ffb4c539d20a19c30, 0x4813ed39e65994f370938d52, 0x19c0d08706b4597638cc3e30, 0xc7e80539ead20295baaa808a, 0x299992cbadae99aeb97422ae, 0xb226c9a7b454cef99bca662d, 0xbf70d4a08cf48ed827e59567, 0x7f746d2d77af83b2122fa87b, 0x9aa92b2128d9725d8656dd96, 0x3b526db14be8de881d9d16f0, 0x60ef9dd9b7346128d4904a2d, 0xc956b02d42c83dcd03152b6a, 0x417242ec1b72b9d2c28b3a8e, 0x31094b84fe9156b6d0462fe, 0xaee058ad4254ba267bfa369f, 0x236079af55b0b25854deb6d, 0x1e371829465e97bdc783fbc4, 0x308ac6dcf29aabb20d05c85e, 0x250ca4cbef9a5ded24279a60, 0xc2667b7be6ec40e1236d59df, 0x92c2ffdd, 0x0, 0x0, 0xccd4d72e904d8d17594ab5f7, 0x39711006ced57a24b0b3ddc, 0x2ccfe85722998e88ce696503, 0xbb4d033f6bc441dd1a08890f, 0x126b5e07fd274f3c18f28ad6, 0x6d1e293c0af656e2d1d56a47, 0x311e4ff1497cc51e1df029af, 0x9b5c4fd21b926c416bee361d, 0xc2763b9d1cc4af2edb1ed69b, 0x38c872d56da6fbe02f39f2b1, 0xbf55fbbf55d4cc74e2b1257b, 0xe6128d2cb2c59820b674fdd2, 0xa13fdbe9e48e2bf32e68a32f, 0xa91b93a068472e0dda54fb2d, 0xddb762befe90bd234be8b786, 0x8de87eebcd0e03fcc11febb2, 0x58c09101bebc3bd1c58c0616, 0x7ebe6e4cc8aee40772b501ec, 0x8e478ff6dd4c4a4422e8f182, 0x10d134c96c1d30ec1c29823c, 0x5dda7fcba4eb273a149eb833, 0x5c6704f1, 0x0, 0x0, 0xa9dc684ea7a072c583378bdc, 0x234eebfb13b9f83dbedc9689, 0x46f68cddc2dbc0748d995ad3, 0x4338acea2099179babc1f7ab, 0xcc0fca21384a6773f735d8eb, 0x5cc17f9d3c9d8636229c1adf, 0x5af4b70e86e1d9ebcec76328, 0x73474b28f23261bbc278997f, 0x60b65df1d9c6c2025877cbc7, 0xe5f371b392daa99d60dc68f5, 0x6d459b8018d80c189e4fb2db, 0x3b782f2fb21f91af6f955e29, 0xe58e194ead8b059afb9cc6e5, 0x714a92db56aaef13c5eb239d, 0xd17462b734aae256a7c053bb, 0xc7364388960d6831d60e8379, 0xa6e642a3822390a909108133, 0xbb3455c47c1d625f04473e54, 0x473a8914fd186b8c2f53bd98, 0x56cb778707e253d5bcd9c897, 0xb212545df5bc302598e61647, 0x879e816f, 0x0, 0x0, 0xf11082a78e2349176eefb845, 0xa2c474b18dd8215e6ce79a3, 0xaf8397d226331e6fe0287b82, 0x2021be0dbe82e1d87ff0464a, 0xf9f671cbb480c9ad30e96b04, 0xbf0341d821907bf2d1714934, 0xc4133dd8b0fbec701c6bce5b, 0xab8a9912700daed15fb14efb, 0x6408b84f7f8cfcc466adb647, 0xed064d750384670cdc484c57, 0x10d17bd4d1d8b673945244cf, 0x3661fd2009f806b98f962802, 0x3ded8d1c80a858c317f106ea, 0x69490720cdaa41dd567bfd75, 0xa2e9da91a7303beb4b22e507, 0x63d845332aea5d5d79157f21, 0x1ba1ef9812c965e541b8c9e7, 0xadd80c35198e137ffef51c0c, 0xec2ddf921bd92a5be54e75d5, 0x9f260f9358d8c772581bc666, 0x49cb9677cbc1c13c5b5a6b46, 0x3a2d6680, 0x0, 0x0, 0x61ae0775f0594f0d3ec84d6c, 0xcdf82c4368c89d619ad6c4ec, 0x16634f8f537349438fbf800f, 0x18bb5fd323098da014d9e4e9, 0x3de3d2b1c1ce83174249eac3, 0xe04e43c5856d447e64fb2c49, 0x8315c17c23405e47aa9dfdaa, 0xdd3e2d06e6755e5877139c96, 0x1de63f44a100a924034140b4, 0xd1c1be2c6c01be2cb6165113, 0xb3f8ef010376c8d557dd3a74, 0x5330b322e6537546d099577, 0x50feacf7ef56d00d299880d8, 0xde8af60590cff5c21c9021e0, 0xc719c781d43d99eac9c9a446, 0xa03f627aea3b9c54fe08cb8b, 0x2fe3ddee1358fa008dcfbd75, 0x183d0552096beeda805632ba, 0xead565b3a9fd13f32d94abbf, 0x8aa3b518bf3670dc8a44dce5, 0x7ce23145e486815f1397916a, 0x836001e1, 0x0, 0x0, 0xa50443039d3dd37156158183, 0x383a7d1fe53348285bdd2f37, 0x3e634aab243fc03bdd9548c9, 0xf63f0748d8ca9bc50034c997, 0x5cc782e51c7c576b5cb62457, 0x767abde2f4d3fc3d27c8dc12, 0xc55ace8470f37a3727c4cdb6, 0xa970e7780d86111b86e8184c, 0x3b930d12e10453014f602550, 0xe86920884a33c79d586e5b08, 0xe1c35a842d9968776b9a5756, 0x2d87248120b10947502a05c9, 0xce2325942bb6cfc89ac9a16d, 0x3023e567a6aeaa0e56e67c5f, 0x931367e2e28f64cf5e67881b, 0x5086944531c4016e1b638c8f, 0x2041352d23b8eb7553c90821, 0x45e38d7e09438b118b8c8797, 0xd15618e1fa2be214b20a2b62, 0x613c5bc02562fac980d54ff6, 0x3547852fb77b7ad22f7a3809, 0x7599fbf7, 0x0, 0x0, 0x25772373859fcc1ff880a9ad, 0xb3d1a77be83203586116cc33, 0x249ddde6a735af8d54f76e5d, 0x126236052ece65c16a4f8147, 0xc14108cea2b89f8bd216819b, 0x31e5b9cd08617bfbebc340ec, 0xc533488c6e32cee86b51bb65, 0x3427cbf5c389545877454003, 0x5f471a99ed38c12709340c97, 0x782d84eec1f578cf6332df12, 0xcff0e44dab2705c3df8ed43b, 0x828932cdc82c07604ed8aa16, 0x3f3c04ef18aff4f15ecac8a6, 0xb00f3fd36e39d0b3ba293f0e, 0x98e9053c9079b132080e1433, 0x8ae039670f1f588d49b0ead0, 0x84e04057fe631a9950e3741e, 0xf0975e0d1d87294c0779e4a5, 0x9af5116c3122c9454c33abf9, 0xfc8e70dd2f1882948bfaa669, 0xc4110d0bb3e3fe5bd4aa3849, 0x63ed1112, 0x0, 0x0, 0xdde6339489f82be2a548914, 0xa6129a46e7fa08cf79fe8795, 0x4ecf9c35860837ca5cc9964c, 0xce764f24f9a04630792a3962, 0xb037bf199470e6de572c42bd, 0x956ff3546d57ee943af1668f, 0x9677e96ffddc8fb4befbe60b, 0xcc50d5f30da8488eda5e2c68, 0x5c1aee3bac6f9bfcb475b589, 0x417cbaff0027179506246182, 0x4884fa40151152ccfb8f2361, 0x5fad486584738fb532be17dd, 0xdafafed3e1c4cd027bba63c0, 0x7f443066f06aa1556dd9abb5, 0x4b627b9936231df8ae4b77a0, 0x84fb2d5a4f24cfe981dbfad0, 0xb876a978d779736ade0abc08, 0x5e6ecdc675a0b2c27e3a310, 0x68b895aa08ce6e80cc24b677, 0x933d588163cd237a200f2ec6, 0xdf366116dbf8e636789c8917, 0x440972fb, 0x0, 0x0, 0x4c43909d3df7aa01fc8f9b55, 0x573f92547eed486eaecf4fc4, 0x706df3b0fa507cf78864078e, 0x72beedac7c3f62c50da7858, 0x7b01b47908dafa52fa8f40ca, 0x42c7fe0d226b199ff3a8b27a, 0x2cd291e0f2b7259731ca1103, 0x9936fd0d86cce4683dbd3593, 0x6fa4eae97809921e2e8f1c29, 0x61bcf43cb948de83f418604c, 0x4be8bf5f7aa4f97164b57e28, 0xb2cac9559ad2a26568d798c7, 0xc9e3f5b00702b0a067b7ce6d, 0x42738b954118f7fc09daf06e, 0x936703c37dcc919aeabbf3c2, 0x8234f4da6b15efc32f91b03a, 0x51016906f1aba3d0051cc8d8, 0x29c616b65059e5257568c86a, 0x9e7959ef4cbfa69866c3ae8b, 0xad55fa216ca080ce5f33515a, 0x4010f7d945e56f9faaaeed47, 0x59c35b15, 0x0, 0x0, 0xbd7ab4dca711f0d929017d0a, 0xf6e1b23766720a08df2e064b, 0xf743a47b9ef21525e4a3851f, 0x2e9e91630551f14e278d959f, 0x450e114a827f3fe74024242e, 0x768f0b12f0fca0e28cad2d5, 0x6f7551b524fa35f7afb69fb0, 0x503e453c615811e1bce63aea, 0x89d3c0aa219ca344b32b4a69, 0x9847c02179a77916a0aad3d0, 0x363a2da6bb7cc920afd971f9, 0x105756bde27aa2e4a1654eed, 0x782316203cc0dd1bde9739bb, 0x729e9df0a4384508f628312a, 0x7c58ad79ca4ff22633b6c393, 0xc25e962083bee700b96ce224, 0x4b99b07dcff3f811dd6d63e2, 0xa07af35bb0745dd4de9d5dc1, 0x2362f99b653a6d200acdcf4c, 0x7ed1f7a32c6633f50a1a6d1f, 0xc67831f8385e2ebf6c0e15ce, 0x36e6be8d, 0x0, 0x0, 0xaf2e85f517483d20277d9fef, 0xa6c8e9ef245c3cfbe92f5583, 0xae0e652d9bfd555164f5dde9, 0xac463ea67f143f6b90484d24, 0x292d0d6d7a0f61537e241903, 0x1dbd26b03b4c300939500257, 0x38f5405d2d4eb07f94eb4174, 0xebed3bea8633f2024a17fa8b, 0xd8029bd940f48c17be9061cd, 0xdb881dc57fa541995190cffb, 0x28dbb1531a44706a35f17fe9, 0x47ad149d189b70df6962e01d, 0xe56b6feae22bea7827cf0aef, 0xca565c0873f303db366b4122, 0x18739e8523299686923d88f7, 0xe4c0c42cd30512c887141263, 0xd6664b534d1f54775647116d, 0xccdd2182bb113823e3c8cae, 0x5351a577848f05aa228c7e, 0x12209ca46ab63bc8985be0c5, 0xe39f22696539616774a946cf, 0x857b13e2, 0x0, 0x0, 0xb4b75cf7190e9fb150c78ed, 0xebb37162b1d1a0cc8ed4e70, 0x2e90eaa6bca468a75954af94, 0x921837f27c919b98ea12bd7a, 0x938d23cf452c57690e41acd9, 0xeaeb0bbd339278e588377648, 0xea059eb1bcb1327413df220f, 0xf3d015ee9a83e173bbfe05db, 0x6eca8ea01474071813e0575f, 0x478da59c5392a7c4859552b0, 0xd53538319b99b57602230736, 0xdfa5ccd9411adccaae6481fe, 0xfbb3284f1a46aab145b14e97, 0x54ac3cb4084ce72b420b1440, 0xfc0030ee568632dc99eb3e3e, 0x67838dcc7ffababee905e4cb, 0x1dccbde1880631c960965f05, 0xd92ae551a3b09f2b1914b2c9, 0xb92dfcad76ba37636909b5ba, 0x6d02704ea436775eb9eba0a1, 0x1239f0c36942aa41d0fdb583, 0x7966d36b, 0x0, 0x0, 0x2f0370e0de67e0e0204d494, 0x41e6a7ffb185c93fc567919f, 0x33b32ddef77fc52a3e1b5a8c, 0xff9cdac2a8555b74120dd0a6, 0x374fe9884c8e839da4c5b64e, 0x765771b2daeb10f3e43d714e, 0x6e482c50677c27f548576bb4, 0x1ba9ee7076cc48c2028e07d0, 0x2d544810350024a0c1b4d179, 0xb8f7bf71b996e3c125d6df41, 0xe1527c84c71956afc34f6845, 0x8c339e263df547b486a303c1, 0xd671bf4705270e96c2dcecf6, 0x8e2ab787b0d997e2c435288d, 0x5aa9c5acfa39c50a3921e905, 0x99a4f9d3b39672a4ef023e78, 0x299824406248082c032f9e88, 0x5cce13392a9c02c95f51a627, 0x8ad6ee4d053df429a6f03f9d, 0xdcf0e7cafb7fd7f3c7f87d80, 0x9aebea38b3e33b2b482c8a04, 0x8bf92cbb, 0x0, 0x0, 0x9f7d6f589e82e9756cb90734, 0x1efc494737c83d8d1e5555e6, 0xdc14db376bb2abe4ad6c5145, 0x6350095e5153267e0f7cccd6, 0x2f11b257bb2b86998a1c4fe1, 0x1b0f01fffa4cb3d342c3331d, 0x45f2b93d6b87e6c14c8bdb25, 0xe0443287f9111fd56efb078b, 0x1560ccb1b67cd638d2ab63d1, 0x48598e67a7c87a38e45761f0, 0x42e95914d4ce2835d31ffdff, 0x39b5c97ac03b49dc9f8f6118, 0x1264a7647a6a15794f811a46, 0x83c3d06dbfb2b86373c10c27, 0x930c355b5fa314b6b1620102, 0x22692e942620240d77d0c6a9, 0x7b8897708cd33be40719d6e3, 0x7df5c691973b2ebe3fad0373, 0x6703a5c064a846c40c588c44, 0x2ae4b8ea5e745d2f0c269bbe, 0xfe723d71902007fbc8a70662, 0x857fbb68, 0x0, 0x0, 0xa5af2060ca06c184e5892fdc, 0xddc0a0a99021868d6da0893d, 0x24b56567184dc2acbcf5c73e, 0x160ef95f8c1f209f220add52, 0x2534d4dbc6d040d83fdb27e, 0xe9975a62f1ec391cc7426ae, 0x491ed56f50664e259b8ebad8, 0x7fd81ec116d12e3df8c35dc6, 0x2a894fd7972edf7865cc64f0, 0xcc22be61d6c9dcd87bbd11f7, 0xfd08aef895fe6b35568a1478, 0xf859f2778a321a7653ef2225, 0xf76ab371c23da4e6581b30ba, 0xeb87317e55dee41753d04513, 0x65f710857dc2c2200f569276, 0xda8ec2912b42abfb71ff2aa0, 0xef0a6b1ecc8548494c574227, 0x91b537e4d720dfa8b9997cd2, 0x7c31d1185eca8ca5c6625a84, 0xb78354ea69a8e98692057c26, 0x8d1da54563cc19a1f35e8c2f, 0x639a0b16, 0x0, 0x0, 0xa875570c9d0284f771cce145, 0x591c0201ab939b39b4e90b8e, 0x637eda8b6d46c7f37c41ba1a, 0x4108ec753bdbd2b8355b71da, 0x3e09320343a531c8f224f413, 0x1b9bf7cf3daf215cb444a32d, 0x41ce25a20127e9fb2c094c62, 0xace162be846660ab7dbdf99c, 0x2b033b29ca496f3fd509fddb, 0x9d4c1e14a408995d3f7c5bbb, 0xa66dc01cfd2bd5f969dd2e4f, 0x627f37970e930fadd339ee01, 0xc9aff619c84d5b4d8397cab8, 0xae250d0978d29cc49ab124fa, 0x2a5d7e131b5b9e30a46c41eb, 0xd55d087936c566f14dde0f46, 0x69846557a74460713cac372f, 0x8d8ab518931b5aa875a9d0b2, 0x27710e2b2af85a3b75ea264e, 0x1d3109d2d289a899712e2dd, 0x61383d251a5299190b540559, 0x4398936f, 0x0, 0x0, 0x747e4b323bf2a87bb86f552b, 0xf7f2ab1dff8cc754dcdca592, 0x1f34a08fd4c07735a767dc51, 0xe746b680a62bfed15401f9d5, 0x97f4eb618871a00cde3631cb, 0x8339d6fbea40aa941ad85327, 0x90c5edb34de4570c96a5a8f0, 0xefd960fb4e9b509a7e987b10, 0xc05807b47e82a5d7c3825160, 0x314c4c6704487c24b8f15709, 0xc392683af214f5f11cf3b479, 0x948c6d20cd304068c11bdd9, 0x3c78b7c1b58f7f9a72fe71d9, 0x9c5e03c8abda7529065625d5, 0x1a01ea030d11b96aebb1a48b, 0x8c7d949a55df28049f8611b0, 0x9e8bf8c8d36ba12e7aa228ac, 0xb9fce7d6eefc436c65b5c89b, 0xf8136f55dfb42a001616e769, 0xeeb08cb097dcaeb0f5243d31, 0x94d23cd76a90197b1a55f77c, 0x260e3765, 0x0, 0x0, 0xcd3ba7bd04a31b040366053b, 0xe6f10c837922880344fc9e38, 0x5d689eba02224e76eb42b684, 0x6e7643cf0b82715749e94cc3, 0xd140b4dfeb987b80865ec722, 0xe94da4823df0f77f53fbe6b0, 0xa1464b2c1b416476e7472812, 0x94a7a32cff9f1d73f72e09ae, 0x4e74a3c7d9049e7e96cc9ea, 0x1110951d3cc54cf1cf14d94f, 0x67cea4b746527cab8d59000, 0x36179b0c462d4f5cf76e42a2, 0x1742726164e268484e912ab, 0x22709f163ff2cd135caf2445, 0xf81d959cb2c9f991011eaaab, 0xf4f1c1cc347528cd1a4e1e62, 0x4664c8151c0d996bd9f0420f, 0xc086ba3be97b7ee3105c59c4, 0x9672fb601d8e57065a40c748, 0x6f878822fca3f1d46f3a48d0, 0xbde69f62a7e1eb664ba1aa3c, 0x9de2bd9, 0x0, 0x0, 0x4482aeb75faa1cb499c00e9e, 0x8b344a97e26bd3b78fdf7075, 0xad4d20ca51614ca72be40048, 0xaf5d2f7ebfb641ff1b918596, 0xb6d8ec60ccce46edc936e0cb, 0x690e2923dae76b1c1a8a60a2, 0x85c2e3ef5f249cd3e100bbac, 0x4d9a6bc3931d8bac5d9ac6ee, 0x169d730a5e2e1b69821c527b, 0xc15ca47f3a1729e6c2a9ea74, 0x474fa9cf9bd7331ec6810757, 0xd422d04149b9b0debce1cb01, 0xb7efd18fc08f89555d4c11b0, 0x269d2078f1960a85fc421a70, 0x46b5771a2f9d3510c9c3769e, 0xb623a42327ee23cbcb526328, 0xbe8a45ec511d7a54c64fde80, 0x3328dfafc42b91b1c69e10fb, 0x264c1e6be83c39fecf98268d, 0x25408a50e9b65f70f5df411a, 0x41334cb48418bdccbe5c4a47, 0x5c88a46, 0x0, 0x0, 0x25316546d55f7e0dcbe6a3ac, 0xeacfb5cea96b8a320936b33c, 0x6f6812d56f2c9d3dad9d17dd, 0x684a95ba1fa821ea81a11556, 0x1641c404477985dffd7cc386, 0x871d716b23e46bc3b4cf9c86, 0x8fb05800ce27e75c87859c5f, 0xf74b57029f2826c3d32008f1, 0xd5b3c939cbb451990b332659, 0x3a958ecf6774f75eef392e66, 0x5faf5e626a2d5c1986e4531e, 0x8579929032fe8da13ad1017a, 0xf19fd7bd978667567947badb, 0x658966b7546c960300b13096, 0xaf6c205a1a8f1b46855a36e1, 0xc1c3e6045b8b25a219c1335c, 0xf0fa6ff6bf56bcbb0116f9cf, 0xbd84e957d385047457f5b35f, 0x9421fc8ca5d0f21eaa8a7af2, 0xddb3c45dacbe09d2b201c3ce, 0xd931044489e3194da19542cb, 0x3a57c4, 0x0, 0x0, 0x9c2e41e8b5c429114a80a858, 0x5a966e31657c7f8c4b03d19a, 0xf6d631a3b323e9d2d0bf9577, 0x5344cc9641e9b5f74f7112af, 0xe429d282cbf83a3a6b9d4cbd, 0xb7113a43b4dd22a6685afcef, 0x27da7f0630345d55a449bef0, 0x20d6e5d82e5c8e25fee2526f, 0xd4713cd17ed740c4e73e65e6, 0xcc3bcbff28c0d7c447d07124, 0x23305fe2dee2774c0c4edcdb, 0xd281cfaeed124f6cb215f85e, 0x9601c6e2be06ccdd44830d12, 0xe8c75f8ea6aff1231d173084, 0x590ebc020ac0a24a9767b4b3, 0xb8a534f177c2d240170ae8b4, 0x792877e41b28f602a3a9af96, 0x187312ca50914f7652ece934, 0x2d4a3f443efdb605e7461262, 0x1d7d53cf6231accf900fe2f3, 0xbc39ae48093f0259794962a7, 0x18f99fdb, 0x0, 0x0, 0xffa9482e842897e00f682bfd, 0x834c8268bdfe3fe9126289d7, 0x285ef56cdea1beface4af9b9, 0xdf26308909c6236175c8b94b, 0xd0f05616288f3037160caaf6, 0xe037d0024d1c561b107d4d59, 0xb53d73e81fea4422d6277248, 0xe198cc789000080db790ae73, 0x4a534c95b61cf17c5ba235bc, 0x908c97c0440dc62088b9a69e, 0x7ae47a71e12de983ef98db45, 0xf8562cc339b439ad34d2fc63, 0x2eb470ce422fcb4897856278, 0xd00c1f59bbf2e4200912498b, 0x46cd5901f82298f50f8f37e0, 0xda394bd5a6faa8c6f98d178d, 0x9489f43f270c6bd97a56f14e, 0xba345afd6fa08c5b66103257, 0x172117c1bd860df49c7f68f0, 0x693100c5b36bc3d8210615b0, 0x2c8d3dcfb83ac31efe164c, 0x4400815, 0x0, 0x0, 0x6505fa9f69a8798873dcbca3, 0x540522659d27e26b155741a5, 0xb2cbbe014d7b317df5281b60, 0x3159a1e8a255736027c15b00, 0xec172ec870f4885861fa715, 0x450108025ca4fdd95d3ea4be, 0xa7ca5bc05077bd9a6fe4f01e, 0xdeea885ab4bfc82189ac2b72, 0x9468616b7bb8b2d1eb378868, 0x56276a0966928b08971684af, 0xd16a3d10a6032348f539e2f7, 0xde3dc7466c581674d211cdfb, 0x5440706286f05e61df345166, 0x1cea89c8227619129efbe254, 0xf84c4b9dcc9de5cfdd1b745f, 0x7439a70edf670ccdb8757ce, 0x9a9d2a2044ce0c63c7749a64, 0xd575c9cb73c6f9d36bb8d1d7, 0x5a9ee0be1abbe2291846dc4b, 0xee674484c468ac3848193a80, 0xef5f5b67e32d2ec4ebb4cde5, 0x3080adc, 0x0, 0x0, 0xf6183ed40d6aeb397805b3da, 0x8ceb48f0508ff239d7bd175b, 0x9f0b273513d427b0a7d38648, 0x82b3956877f67e15e22f2b4a, 0xdbcdf5049103c9c7b7ee4bb5, 0xa4880f67b985ed22f3b7ca29, 0xccc0bac7846da5cc7c7ec380, 0x26fada19f84b75c2954ff0d5, 0x607e2a4f32863fead642e8c6, 0xd81931fe7d0a479f060e12a4, 0xdb46e7ef3efca9bef3b7728, 0xedba7c2de2c90177fc3f4840, 0x956ce80fa9fdea3dcc2a6ff3, 0x5a8e76cc6a2b0143634b7489, 0xff054f521cf0d1a934283a01, 0xbef59d14565d6ba48d073ae4, 0x650b2d52c1122a56007b90a, 0x7c76c9af9f608addb1afc04f, 0x2ba9ee990da5b1a115506e61, 0x56ffc7c840d5cb87a0d64779, 0xfdad49c955958334a75424e1, 0x100788, 0x0, 0x0, 0x40f427e784fe2b4a9eaef4af, 0x2f0795ae8e0911ef1df50341, 0x90df7762e822199b4e8f9dd8, 0x3a0b913a4eaf581bb478be28, 0x207103d33ce1e0b8493a8cd4, 0x8656a65ce57b0b8a4dd5622, 0x7f95bcb4d175408d176f192c, 0x3e7c781e0afc6ece0cd3fc3f, 0x399d9626316a4a703009d68a, 0xa406d4c272643c0e932ccfb, 0xbd7c66e6c97d1c5db9fa9355, 0x8eed69ec5068d7cb399c4ffa, 0x79fabd0f06e0921e6cb79d77, 0x8cbbba1bc258146680adf88d, 0x16fcaf5768364d146bb355ad, 0x225fe736e47e97ed2f956d95, 0x70d015c5a2328fda9308b98, 0x673d4d765ad984ed15b17de0, 0x1e5a5778fc5a30396b36b904, 0xe49771bd3a3478f09574b1ea, 0x35c5a852b2225574a7952926, 0x353afb31, 0x0, 0x0, 0xba3c64ce6140f14718d0875d, 0xaea551a60be2bda2d6bf6db3, 0xe8a0282d2347aeeb81e33e89, 0xb8c1ab53b1e38117bc833379, 0xf028317bd0b9336aac1c8012, 0x3c856cf187839e9d21dfc4c3, 0x880a5e18613966ff8cdd7cd8, 0x79a454208ea16d30679cf088, 0xf3ef14e5fbbed7488440d7ea, 0x418e97737d58665881d8462, 0xf4fc8d9df7440e8998f035ce, 0xdb8e672415f226facf42e72d, 0xe589c0b91168de2021f13fa8, 0xa3085040132adf68a6e77dad, 0x94431ba64e4a6e6b83409212, 0x26e5b535fb3ed44b9a28e8b5, 0x52ce3fd32264c1d47149801e, 0x9c8ef28bf945bc77a227b011, 0xabb4c1b5e2a27b69704cac21, 0xcf74f58df7e45d4826769eea, 0xb2159f7de25a0c030219cee2, 0x134e7fac, 0x0, 0x0, 0xebd8d90c934d17dd720426a4, 0x33bea95aa8ad5797da6c4efc, 0x7fac880279bd173527763ac2, 0xd909e429bd1b54225afb9391, 0xcd2c7929287c08f6773cc15b, 0x3dcde19b61dd92d44568e30c, 0xc4fe323e9fcabf11e0fef9f9, 0x2c768c0140cad8de1b3f8295, 0x5ec06f9a55af974795824dd4, 0x71249dd9d21a50f8a5dbc25, 0x9c236dd1615cc0a9f1cfed04, 0xba5a73986d84f4435169a34a, 0xa02b96c267abf2aa37dde261, 0xc2e354265ebf226db4ead96b, 0xe5ce9a686d3e5e30e5e7d927, 0xaa9aa8ff79b86b3c71463e0f, 0xc7573536e36cb43693dbd891, 0x23b6e4c59c0de1ac968462d9, 0xb20bf031108b4e72afefe016, 0x21e962fb9134282b48547ad, 0xa710aa758ef9c12b377d9d41, 0x66af5f92, 0x0, 0x0, 0xfcbe8e8bc2857c63648e74c7, 0x3c387f8020a8e593e0b552fc, 0x8ad201a4b3f0ad06ca1cad3b, 0x89172fbe0f87df535688ccce, 0xa60fd06f89622f8e0ab0e81f, 0x9d95dfbbdbfb83d920f26406, 0x3100ae331c6bcdbd5bab2863, 0x1cd23a1e15830352e125d568, 0x6d486ad849053b6f55603009, 0x119e3472ed62abc0075a2f7c, 0x66cc98c72d2681a98920289f, 0xd6eb1f2dc51f8afa59605173, 0x6c3fa021ab66060a374d7ea0, 0x723138898370b39a75ee7b1a, 0xe92d868e3a8be03af9568450, 0xf2f5f837b5321258e6bc92be, 0x27361dd77e44ebee906a0ebd, 0x7003f43a6806ccd3b189ba18, 0x97b5b27be13f5b8425e2472, 0x855e2bd2e42c6b36bb09545b, 0x7aeebee267ae270f26abcff0, 0x47d88976, 0x0, 0x0, 0x8b00c396084b4115f3b0969, 0xfc60246f4f9cfb7e951de468, 0x8022a8e11b4f620d48a3ae49, 0xd273b3ebe223884b92885a5f, 0x5f57fa057af4248d7576fa82, 0x5e57e11d3c9f89b7cc0e4431, 0xbc5bcef6f56876529e294838, 0x32c32a62b1db35b064a7a2da, 0x35bd10f3388759eb1c787e1d, 0x63c601309b69160147d3db35, 0xb1f8bdc3cb3cfd5528610a71, 0xcf31a9f03bdfed10e2e83e2d, 0xa80331587c59ced241357ea0, 0x54ba8bd269e3759998fb3358, 0xc67a073c9bfd12d1c69480cd, 0x6990cb91da39aacae8f6ce2d, 0x3073b77341d7f8914f23e232, 0x39fb609d816e019cc062f795, 0x6c58563224905c46dfc15b2e, 0x1fa29a5d77347775bad7e2d, 0x35100e5348a3d6577246b271, 0x1cd09ea0, 0x0, 0x0, 0x254f1d592f204e7e1117be57, 0x637fe9b28ec4e1f1fdb5fab3, 0xfde99837ed06ee649f6a5eb9, 0xba50e700e7ce0dd5d699c0ff, 0xb89b6c7dbb34bf4c0741c2e8, 0x2c77cbafe161b05a3f5ccf95, 0xc147dafe9d4dd839dc184d0d, 0x78ca47ed2f48eabc1b8afe82, 0x368de7c0d41674796d946bf9, 0x88a0432c9a758fd891670603, 0xb356dffba421f23219149c12, 0xc0df0de9addab73f0c677b23, 0x87fb6390c845a00a2b8c2549, 0x9b188ebfb7e3b513d5ea61d3, 0x7733b7d80a0c1f1fb3b87794, 0x308c820f6a5ab36f0492ce8b, 0x5be8d42b69166421dda3b512, 0xd55839cff5548d24ad1cace1, 0xb3cd437bd0293cff21b2402a, 0x516f98df61b6536f450f3a71, 0xf3eec531c8051639aeb8eb9b, 0x5a84fc9, 0x0, 0x0, 0x3693b7dcdad0fb1d8dae21da, 0xaa2d5a7fee71d0e906cab278, 0x5261e8b980d9f82cf85a741e, 0x805979217bb90514988dc3a1, 0x3c6a195de3e6163393f551c8, 0x25a79dcd01f7db4a73a32bdc, 0xa7176752a77cd24ee908f424, 0x4b7dd5151993ff88a4c03c25, 0x5dcf4916e368e17734f83d70, 0x2e5f1a6e9dde29cbc71f3d81, 0xf3552a7a1a4bd98489ccd41, 0x9ef5fdc24b5f5aaf500cf09f, 0xcae76c7fc41ae096aab9df71, 0x579928c3ee25c5800351522c, 0xd5e2ee4cf7c598422d6ae639, 0xd5508e83d4ad6c99e73208d7, 0x7523da007c5afd2a33842db4, 0xb293a4cb6cfef6673c866725, 0x8b23e76640f41d8d279e3da1, 0xb6493b8f9d86cd0c7a64ca1e, 0x6bf55177b0690d6f60230935, 0x8d7f18f0, 0x0, 0x0, 0xcf9b94648da0dc88d439cb42, 0xb19c1b4ed7e72d465dc45fc3, 0xe22642c00a0c25f6a008c710, 0x6dbbd01b909f016773fb145f, 0xef242bc362f4d1468c82e39, 0xe34317b99d8a82bea65e106b, 0xbc454454e26d6db44e7963ed, 0xedecd51a67f3162e0c834c5e, 0xdc830b6c09e84e9eae0a9ca7, 0xbad8f2a473274a65401c1dd5, 0x992e8052530e7b5c61f9a3d5, 0xd5315b554e0bcb21a5ace36, 0x6b83a662e5b7114044086c25, 0xff316e31ab82abcec0cc162b, 0x8c98f344a4995dbd05e66a77, 0xe81a043b3a0e65a2659c0f30, 0xb36df7f95fd54501774f350b, 0xd5e3f5af9878cda0a39a3de5, 0xe6056818952b06acb4c81ed4, 0xe54abb01d005ca29cf99a131, 0xd209bc96061f13ab6005f749, 0x886b8d88, 0x0, 0x0, 0xeb52f6df556abbdd63bf5e22, 0xaed60e75dae57df80b34ec39, 0x70fcd3e27df287e5753b20d7, 0x128b5971e45761158b8f3dcf, 0x16bb42b3873e00053132b0c4, 0x8b0245e9a0219afeafd79a79, 0xdb9e91446865bc1fc657888a, 0x25a871a4d2ab4269bbea7ac9, 0x3ddca061ceff660108ef52d4, 0xa7e61c5901838a28c34d99cd, 0x7544f5dbb3defa0163d7f17c, 0xca241d14cc49fae4a772b7f5, 0xbe29d28849a5e324aee3408c, 0x836767d43077526f48faa2a8, 0x8cd32c65af954bc68d0e493f, 0x7892b889609b1f9e6f0d79c2, 0x278ce3abbff2f5263777664b, 0x81cd003b95994a5b17a7a683, 0x9c86115d81e0632d5fc3c81a, 0x997516ed4cc19a8a483d09d3, 0x1e179242d56cd19e4f7aa60c, 0x451e7279, 0x0, 0x0, 0x1fe5390dd58ec47ccaca6165, 0xee0376fd38d66576b38407b, 0xcf065c5ede16b9078ed8b950, 0xe401e1dba006c46264e08784, 0x52c0f066ccb0e51a2836dada, 0x964e301923a41c67dc6b472c, 0x3031e417f447570565032bc9, 0x50c821279b44dc3b5b074a72, 0xcd5a7aedb746388d9305d94b, 0xe93818f4b95a48f01baaa16e, 0x9d558ad11e2bea56a6739a4a, 0x8f98e3a980cc27f5514501f9, 0x1b5009bfd2a8cf3f3dbb7737, 0x6ebe9ac5b62d601eab9605fc, 0xba78365c99e325914055aca7, 0x62889d4b8f17ddedd15ad267, 0x1fee7dce2fad2700f8aa8817, 0x5b2a16de45abfaa3ca0f804d, 0x348b77de9a9e9fdd39057b1b, 0x2d4143c1cd9b408801ac0932, 0xa3cf55f17eb11d4fb32b9426, 0x208d6195, 0x0, 0x0, 0xfc49e873313de2978312887f, 0x5fbe773faa24320f70e6ea6b, 0x4256b86e9528473bdd9e6ace, 0xd74f172dbdba542bc9ecda9, 0x96924c9de06632dece3702de, 0x69358eb612656ca3198158e2, 0x6d79a01613661779c78e0032, 0x4e3bad2411014a48f1259b42, 0xd8871b2ea785f687de8c7952, 0x4be6a0fccf274cf898f145fe, 0x17c2c3616f78801493116b78, 0x940f2f0ed4e8f04ff92ffadd, 0x9b5d10dd4a3522d51f93be51, 0x1556a11712de4fac4f6f42a6, 0x895f21afa42c4af48861ce0f, 0x226800704f911bf97dfd3f55, 0xe51750defa8db7ae997056cc, 0xe037899ffa2f92560d0555c1, 0xd2e12a9746629d0f3e5d14bf, 0xa960a9ca8b8dd7220eb506db, 0x66bbd4ab5e553d07fecab1bc, 0x3307cd8a, 0x0, 0x0, 0x67f2457b8c831d56a9929a0d, 0x96e370441e52fae5bbcae56d, 0xa93ed687236fc53206e0419a, 0x7fe79b87578b0d38b0d1c317, 0xf48d8398df15059bb792f949, 0x2514308d75b0450ea06b07c6, 0xe85e7668282416c14df6e0b7, 0x703fae82d76ba4de92480e44, 0xd86b0d011d4e5e495c06d796, 0xb329a5d9c0778130705ba25f, 0xbe8a7bef6b49924124bf136d, 0x719510f51704a78a4b63090f, 0x3be3feb5ceb690d534e57107, 0xd0a2d35b72ad6978b8bde8b3, 0x936079a39d638c5c33d6eadd, 0xe177aa16d66b4356a9f9bce2, 0x9a626604f2f0d249417e0ea9, 0x6be7c6bd4f517bd69fece5bf, 0x923735990296cdfb6fae17d6, 0xc1b535aee17900ed24102daa, 0xf2431179faa78ff59fd6503a, 0x202114b4, 0x0, 0x0, 0xa9dc684ea7a072c583378bdc, 0x234eebfb13b9f83dbedc9689, 0x46f68cddc2dbc0748d995ad3, 0x4338acea2099179babc1f7ab, 0xcc0fca21384a6773f735d8eb, 0x5cc17f9d3c9d8636229c1adf, 0x5af4b70e86e1d9ebcec76328, 0x73474b28f23261bbc278997f, 0x60b65df1d9c6c2025877cbc7, 0xe5f371b392daa99d60dc68f5, 0x6d459b8018d80c189e4fb2db, 0x3b782f2fb21f91af6f955e29, 0xe58e194ead8b059afb9cc6e5, 0x714a92db56aaef13c5eb239d, 0xd17462b734aae256a7c053bb, 0xc7364388960d6831d60e8379, 0xa6e642a3822390a909108133, 0xbb3455c47c1d625f04473e54, 0x473a8914fd186b8c2f53bd98, 0x56cb778707e253d5bcd9c897, 0xb212545df5bc302598e61647, 0x879e816f, 0x0, 0x0, ] .span(); let public_key = Serde::::deserialize(ref rsa_sig_with_hints_serialized) .expect('FailToDeserializePk'); let rsa_with_hints = Serde::< RSA2048SignatureWithHint, >::deserialize(ref rsa_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_rsa2048_signature_assuming_encoded_message( @rsa_with_hints, @public_key, ); assert!(!is_valid); } #[test] fn test_rsa2048_sha256_positive_seed_0() { let mut rsa_sha256_serialized = array![ 0x766ad7a96b6a74dcb0d4ee21, 0x3c31169ffb4c539d20a19c30, 0x4813ed39e65994f370938d52, 0x19c0d08706b4597638cc3e30, 0xc7e80539ead20295baaa808a, 0x299992cbadae99aeb97422ae, 0xb226c9a7b454cef99bca662d, 0xbf70d4a08cf48ed827e59567, 0x7f746d2d77af83b2122fa87b, 0x9aa92b2128d9725d8656dd96, 0x3b526db14be8de881d9d16f0, 0x60ef9dd9b7346128d4904a2d, 0xc956b02d42c83dcd03152b6a, 0x417242ec1b72b9d2c28b3a8e, 0x31094b84fe9156b6d0462fe, 0xaee058ad4254ba267bfa369f, 0x236079af55b0b25854deb6d, 0x1e371829465e97bdc783fbc4, 0x308ac6dcf29aabb20d05c85e, 0x250ca4cbef9a5ded24279a60, 0xc2667b7be6ec40e1236d59df, 0x92c2ffdd, 0x0, 0x0, 0x7f4adbc1493730e14321c70, 0x849a3d79f6c117d6751bab75, 0xdef1d75dc88702eca86351bd, 0x6aef5c1c105f674fd757aa13, 0x6124f02cbef475f1cc85d17a, 0x28803427b3731834a879e9d, 0x6cd15cf1679c35f246588d95, 0xab5a6c049666f9c22ba7d277, 0x12e89c90c000260d5490da8e, 0x25b9bbfa6c68c42f721bbe6f, 0x454e04965f51a38d060dd0fe, 0x39a9a0136648523e13fcf263, 0xce9e095c0a64109949379439, 0xd1e4d94562299517fe80da9f, 0x76f07578746961dc58bcc72b, 0x3dbe6daa287ba6415eec8541, 0x14ec3fafe6b952ef2b91f61e, 0x6d4444f0f7c59726a2fd5f33, 0x87d945fb5629131f7d73deb2, 0x980707f11d31be5557efb7c0, 0xa9c4105d7512a9dc58a59c77, 0x8f5855e2, 0x0, 0x0, 0x63daf4f0614487a857aa397, 0x4cee11531104e6d3321a6137, 0x500042073e6d1148bd2559c, 0xd0609608648016503040201, 0xffffffffffffffff00303130, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1ffff, 0x0, 0x0, 0xdba5a28d104571ccaf78c101, 0xde0117f8864376d17e88e2c9, 0x31387d8bbe690ba05421b41, 0xf673c108d61081ff7c953c48, 0xd9c9a2123806b51703d5777f, 0xe265a231a3561308fbb49d4c, 0x2ea20b01ec074f116aabcff2, 0xbd76cb54c0d3d67ad6dc8504, 0x62d001857ed90fd9c70f8fa2, 0x5212b17c0cf2b3ab8c00191e, 0x21666c4a4c652d1f4a5d52b3, 0x98a34f392a569608d8d8493c, 0xc65cd9cc53784a7c308283f7, 0x62f1d8f077885369d37c61a3, 0x9d63ecf92c1e9b9fab5ff7d7, 0xcefd87f373eac3a6af12fd2f, 0xa5f6a5771df42c025f4b0519, 0xc02c4eab0d7cfda3ab49183d, 0xdba201748a5570a32f3e6bba, 0xca3a6619ca8b60d71bdf8553, 0x34ae8309fd18234a383d2dc6, 0x8c0208b0, 0x0, 0x0, 0x9c87939cedb6fe6f3814e1df, 0xd8cd896842147c97a0490ea0, 0x213d73b8263f2f958f6663f4, 0x690232c0e0f0144d0685acac, 0xc84a114f20611bafc7bd30ee, 0x33c2ba1feafcfdb7d10cf679, 0xed8dc5f9755ef64c81b46f28, 0xa96ed77ae8898078d8bb61b7, 0x73a8776c045f5d0f7680a2bd, 0x847647dae5acf8e1b03e809, 0x463c09c16101b921ea54c4be, 0x768425bba132d55771bc78ca, 0x6e0434cfde716fd7c0ceb8b2, 0x917544da08a8b9ee878b2381, 0x9466aab26d29e7d673a164a7, 0x97cdb9d7322c80ed8d3ed134, 0x16ef46e3b67f627176ca26d8, 0xea77601794d88428cdda4f3d, 0x8664168215ef6f0f6d47c112, 0xb59493de236379caad223952, 0xc864adcd34c308060e25c4a1, 0x27880312, 0x0, 0x0, 0x1b078c215f7e30839506357a, 0xe8eeade9f2e28e0526abd509, 0x609e1db5293846d19cfd6c09, 0xda08942f4ec9833d381430bd, 0x5a39cdcfe8d9f409c73fd30c, 0xdecdb3cf727a5e776e3ce4b2, 0xf5f1c4449ed6addde3e69a97, 0xd987cbe3706bf8a2de4d75d9, 0xe1435f64a565ba527abaa25c, 0xeae4659f4f7a72a4ca8aa299, 0x457e02417fce6e0177fd025, 0x7b1d76c4aa928c4018f2687e, 0xae05806571542e12952af007, 0xfba852a24c29037dc76c8f92, 0x6486e47652c434421a6d65cc, 0x6d7626f77de17de67266bb40, 0x9cd5342b860a920e13c22b26, 0x954a74eb36626d553555d51d, 0x338c190d3c06429be7ae25e7, 0xae387d46cf8b86579ecfad40, 0x5e06aabdd4c3f2e971a0ed67, 0xaa5e56a, 0x0, 0x0, 0x3ca35f4ae5d007a57d956f87, 0xd58e44fec8e6f1e32edaae6e, 0x9036137ecb69e1ce77a61039, 0x14dd6aa90c2bdf6ce5739734, 0x10d71cbfb2aa3539aa1f56bb, 0x10f45a90aabecd18b6af19cc, 0x3a01e721289d1a8a630bc18c, 0x57c15ae4a7fc259d1eeac0d9, 0xb3e2f6623abcf9c36592977f, 0xbaa0551bed2b298958bc096a, 0x125e26df65683a7f9f496247, 0x131e1cc18846a946c21be7ce, 0x2bf4cbee40d1e4585d9983fc, 0x29612d8f2af44c050e7a6e47, 0x98d94d7b506f22f348d7b218, 0x710fdb924a0d2bd2fda56c0, 0xdd6d98342fe4f67cb05ee54f, 0x596a30326a952e6191185a6f, 0x9e6b2e0fa8aaa896014d67e9, 0x2e1d0c4aaa2cc51004adab21, 0x11879893708f3aebaf96f3e0, 0x41fd2ad7, 0x0, 0x0, 0xddc793d0f6ded76302697a39, 0xb22b4ba096bbdcedab9c16db, 0x73616c77e6e46b41f6af5bc9, 0x3ba104f3aced59dedaef1865, 0x2cc05918fb50406e83e92eff, 0x6ad12e22614f551de7c81293, 0xdefa3e8456b59a6371d910fd, 0x554cdf2c7105b45fc800d838, 0x793a679a65d68b07844e02d9, 0x1ec761c49dabab9424955eb9, 0xae7084bbd6f9337cf0aa7a5a, 0xa7fc8e7eff7a3c4b4e8c03fe, 0xb8aac4ca75210e6ea5c7ab4, 0xebbe07edb0b8334436abfb55, 0x883a0d104e6b72e1f32262cf, 0xff52ab49429dc49bf41aba2c, 0x25f95ac11682b4b14b4b4119, 0x7490f57a7dbb06fcfd03f72d, 0x90cd6913f9ebfb549d76df3a, 0xf77a906a9f1a245c92c07403, 0xffa77bde9d5166a772b0cfde, 0x1dabba6f, 0x0, 0x0, 0x5afffd9f52773bcd134e99d8, 0xcc416ef0789bac74567880f3, 0xad42778193d4679231d5f473, 0xf4f26773d02609d7633a2a61, 0xa0c22952edad9f723658f6f4, 0x93c8922499bda3bf71a994f2, 0x6f7eae52dfef16bf8ff3a67a, 0xdd467265cc3850970deba314, 0x7e8563c73bb63cdec42c041b, 0xa185c8df07c535191a340cd6, 0x6fa32662bf558974fac76df, 0x292f85f6ba2c832ee39c5ab7, 0x12a6486c242536e088258404, 0x4df8eefd4cf775f72e9ca5b9, 0x61020f7671b569c1dbe31db4, 0x1a111d0b8ce4c16d87231063, 0x57bc87bfbd8acde04a824ff8, 0xc5dcb21e8da06528633eda2, 0x9231631a3351430f2dbe84b0, 0x2b372f1d9cddade685602ff7, 0xa91f085b78fa241f56866b0d, 0x6cc4b091, 0x0, 0x0, 0x2de4528e7b943ad0b8c9f5f, 0xdea1d1df4ba169dc5a1a5776, 0xf11c9b5150d95e3f0c89ff40, 0x527cc16aae8858f5a5e4f31e, 0x448f9057581c58075994e074, 0x231063986b1cbb4bd563afd, 0x344db7ab3a2d40cec1b173a8, 0xc542682483c9d71617d2eb3d, 0x9ef98379499e539ec46f7074, 0x32e52b7738d5b58cacfc4dbe, 0xf7610b5ccb8c9c6b661a1c16, 0xc05f2c6e95d529d28382d2bf, 0x4038236c2163c7e6357585dd, 0xe3daf988dac9558969621182, 0x9873f618ff4254711dad9732, 0x3643e7c051e76dcb6518b3d0, 0x4a851f8ec41c3c830bacaddf, 0x223c145bf38736959511709c, 0x39e9b0b61980a5143db18fdb, 0x1a773aea976c808bbe1d9bf3, 0x157499a5cadea1cef829beed, 0x509c4f0b, 0x0, 0x0, 0x62852df9189fdd33a81d0901, 0x255b693e36a6c6c541ab1d7d, 0xce7cd3bd2a1a06275a258a5d, 0x1f66e4feae610347d0e0f77e, 0xba53b3e84326580d7f22858d, 0x78882c1f8d3fa0a1bc9a81ae, 0xdf99db3c39601ef65bfc1f0f, 0x496c687a779ddce8b94b6a33, 0x74378f794ffcbe7e38a80cc3, 0xc723ca3c7897199395ccb800, 0xa8f18815b946f95745fe430, 0xa2c332eb85dbebfdf5d21dd9, 0xf9f881512200e348e82a0f3a, 0xda431a30a0c8dd24f4410246, 0x62c6db75c3fc7b1dd0283ae6, 0x97023b40f4b8c97815ff92fe, 0xa2396d228e7807eb2b1bd67c, 0x410dc34640be2ca8dc373e80, 0xef567bc33ad8c2bde671e4fc, 0x75fee92add7a75af0f0eea88, 0x59ab3b009a3fef41785a844b, 0x41f8a5c7, 0x0, 0x0, 0xf8a571c5e36fd078f3ea0d88, 0xf8417b317828b6b8d59117c1, 0x2d5bfe87ca678aa61a804879, 0x7f60a51495bdb47fa2d00682, 0x3e84116b6dfefcc443ef929c, 0x4c73b96a37578eb1e3482db4, 0x55524215b93774818d8af3bb, 0x545bd195e8fe68d6f4c0c2fa, 0x18725691b86ccfd9f50b66a9, 0x6f5dc884624a880ced3a4606, 0xa5badaa83d8a7485cc1543b5, 0x7f49cc75e4a6186e6bc9b00b, 0xdd54decc49065e13394e739d, 0x10dc460007aa0bea87a3bdc9, 0xc9d8bf28956b4dc557d7b0da, 0x394f1b90b12d42bcd86d862e, 0x15e44894ede73370d08e59ad, 0x94414117d8025428f35dcf01, 0x9b0242480d2a9c54411d44c3, 0xd87b5eeae928debb12590061, 0x16f5649b2ce3e9b8d13710d, 0x1da7aa12, 0x0, 0x0, 0x906592b0bc16f5269c2ae379, 0x99256f481857af00e210dda4, 0x7777212b4f60ef1cf00617c, 0xb0f8202589e7b6100f3be304, 0x6917a8d61328f2a770ca118a, 0xa94e1ef270ac393054333f8e, 0x1c640ff00acd502c221bfef7, 0xe9d91ec74d699eedb5672d82, 0xf565e341f293d04d4ad52d06, 0xf6a5f34ed83861e28435632d, 0xa35fad7204213d1d70464b5c, 0xe637c9258eb9849d6e10248e, 0x1bdd6e25736ade18a1f5b00e, 0x7dd09d1716b62ec88e77473a, 0xcbc71657f93fe204cf3550b5, 0x921bbefe659d89b06414a332, 0xf82c2528a7f313be5959db3a, 0x7e367d7f36c8fdec7fe7ec74, 0xc23b984e4448111cf66f7c7a, 0xaa1715436760433bd6fc628c, 0x3c749f84f3eaafc9f19eb1ea, 0x67dcab54, 0x0, 0x0, 0xbca0709005dbf9a6988775b, 0x551d7b228b3033aa0e9530da, 0xcb561df63add69ef8950f6ff, 0x4e2d65f439d48d103612e959, 0xc362a4bfed1b1d12258053fc, 0x5af4caa06a794b7522b5cde3, 0xe870ff5604fa1e696647930b, 0xcedf73d1770b8d318142cb5a, 0x2f9de064cf7f23cee2e9eadb, 0xcdc20801a8162d8e8cbce3ba, 0xfc39fcb82bb701916e545c16, 0xb139103bc7e564b05c418ee7, 0xc2cee58a68a843bf9ab7564, 0x7ea65f216dd2c0e512097263, 0xeeb54e3f6f2e2971789db32c, 0xb9544c9ee089bb7a4202b84a, 0x1aed6610a32e9c3309dc0056, 0xa928799e323b7b279b851cb4, 0xba6cfaee9a097a8643582296, 0xe6deb40950fa7fd606ef3c30, 0xef0978dd3c953faa80869fce, 0x498091db, 0x0, 0x0, 0x5af2efbc9f83280d04e9d276, 0xdbb564d730b7836d466af4f5, 0x34db186845975a0c64d466, 0x1373ec6ba5b6a9e2dfa065e4, 0xdeebec96606fa9c217376709, 0x71d016398339e18787219222, 0x756c4dd9ae6db06a9cadcfed, 0x9edd20b4b4436ec9bd7ac698, 0x5316746dab22eda5439c5283, 0xccf492cfc14ced5163cc9d44, 0xdad61cba44755c34e2ea50a5, 0xdd787aab1686a30a198a3373, 0x827d1f12072427f2ef96ac8c, 0x72919ad9286ee886c633d2f9, 0x46d6c382a8887ee89055a90, 0xd555b4f214c75232da5299be, 0xd384ff140c009b4f67b0277e, 0x4f838153528eb7fa81536463, 0x43c263c48e91401a5e004b3c, 0x6f3bcdf4e7b2a7fe637fbe87, 0x9b8914d8c7eedca149026eed, 0x909454a3, 0x0, 0x0, 0x606dbe268de962f4430bd6ec, 0x34e928a361143cd5c828cea0, 0xf4e9f10d3e6af5e2c3408098, 0x8a185ca2b41d9bb0b384bdfe, 0x729f5a2dc19f622ebd647dd2, 0xeabf790a4ef25196f4ae498d, 0xb41429bf4e6a51dd18abf37f, 0xfb6808dd834c73e04e116a41, 0x716c7397bf34ae598252b95b, 0x2a52ed59c4822b2d7a1372df, 0x8a2cbecb1a10da9c7966c193, 0x18227bde9e9503568f9e9bb0, 0x24c2efa2aad6f28e1a6b8202, 0xee607f02b3b5d6d49fd1d6bf, 0xafb8bf42af8d1b7c50aadbac, 0xbcd8fe2d79e0c4065a4b681c, 0x7f1f06739621df5914fbafca, 0xdf5c338ab45983c635b3cbb5, 0xbd397656f596e27beb9dd370, 0x5a4633f0b08d6a0975c6cb28, 0x16efdc39283fcf0212b9a64, 0x8e6df810, 0x0, 0x0, 0xae292636c7a43fee960bb1f8, 0xfdaaf188278ae1ef204ac302, 0xbc49345af011ba50c25fd5fd, 0xf1a1851cd188bbcc5491b64, 0xeba9d7e9f386d800b71c8e26, 0x8f817f86eecb07b1362e536d, 0xc3b7bf2bf01f5df6becd6421, 0x36847391c28ab53b2a5ff05c, 0xd0e255810feba364ba15865d, 0x3a82dc9e268a02f132f16ce7, 0xdf7f70423ae35ea8db61d94e, 0xfa28a551d9058f8bebd74f91, 0x112c45d9b3d9b281f720b20b, 0xd2c3fe27e7f780c4104d3d1, 0xa8d13a76a001f567393324f8, 0x3c99a65b0848441e81133c20, 0xd199f84025d0889eefd46727, 0xd3a63d06644fb8e561a54ac3, 0x1b58308a612ac635943189bc, 0x78a51ce793ff96e37827421c, 0x223c97a93cacdc7eb292c7ad, 0x2cb7abe9, 0x0, 0x0, 0xec1d21f34e35d41aaf2dc12e, 0xfbfa3c5ec79bb8f3cb1b7110, 0x20f27a2831000976af11bca4, 0xf0d775d468ac9231e42e38e2, 0x2d0079dc2ad8c54371ffb7e4, 0xee7e02f8d20efc0ae8eb6c90, 0xad04cebdeea49cd3c60116d9, 0xa73bb90bfe501f9192ee97f, 0xb6b34a9c21424d68a57a6672, 0x3619defcb4a725441d3bf760, 0xebe3d22504046bf8880cbdc3, 0xfa28eca0111a0257493b886a, 0x93a50c7c721395d9a6a12944, 0xaf734caa53b8dcc1c7918d2a, 0x542c2352abf5ec1599fef5e5, 0x60281c2adb6401730c7afb39, 0x8c75b1913594aa3a81c5871b, 0x9e9f5823d8b12ca7aed5b694, 0xd4388cb59d4039dab88b73c3, 0x2982d5321902c82c52fa6361, 0x5c3ff9adbdc2dba8dbe57e09, 0xda00a79, 0x0, 0x0, 0xd6de4aa107825aeae723552, 0x551a40743b1f5265b17ea38a, 0x67bf6c3269336fc22c9c907e, 0x53f8c37c58c0045d7207758f, 0xa1b719983754b514810fecaf, 0xd03c31dd37d5327d8ef3f7e0, 0x681cd1f74348245665e7c5a6, 0x100ebd9ae191ef5c93d59436, 0xb72dae2c31c134bfc1ad2220, 0x57cc5c25aa8006bb1e3d747c, 0x308c4398dc5030cf45d8471c, 0x53286c21aa4b7b58338b26bb, 0x9bdf3087b2662da2e3668508, 0xafcdbc80c923a3d50ba414ac, 0xe59bafe7c7879e4523c5b430, 0xba67db800092de65412b8d9, 0x86724cf861597406d1e174a0, 0x83d2f4d226c14651d0cbae13, 0x3a7fdac3dc449f96dbd5b9a5, 0x5cb526c2805b7876bc2033d0, 0xac2f3eeccf1774fb9348ae32, 0x3c5fb589, 0x0, 0x0, 0xdfd726e71c0c3513ff81c5e6, 0x3121d9131877236e73a208e8, 0x96566df0832c848537c5aa0c, 0xc0d5f7303f37560ed231db1d, 0x390e08d83c5cb56ac8f76dba, 0x8ffccf98d1fd90a6d9699922, 0x297fdc5318c283e648d9307a, 0x2ebce2c6fad38f6b05046fe8, 0x7b6f08ebf3fa7127dd9ebbe8, 0xb90e446031bcfde924b52f52, 0x419d0922c0b05c7e80181313, 0xc5473a29fb09b64b272a1381, 0x846ad59a4b716e5aacc3c2fc, 0x731c33e242188262aff293da, 0x60ed6b92137356d97058082, 0x6c795f87c285918024a2ab0f, 0x8f03dc62a697462ba68b4179, 0x4d99077943f1ff184a0bb2d1, 0x9215c7b1eab149b03ca4cd23, 0xff8988e6b9c702dca5a99b1c, 0x4dbd2a2419bc1ab70fc22b62, 0x18d6113d, 0x0, 0x0, 0x764ea48bbad71a9a67f4b79e, 0x30fc39e1ff88b7555cdafb71, 0xb2a20d2ac2e81d53816f0e99, 0xe0545315cd7982230dfdaa4, 0x216c94db5dd9a74dfe44cf39, 0xe334e843f62beda17ce1a7eb, 0xc627a18e99c8026d36ca6c3a, 0x8c36c270c46bbe670a0ece17, 0xe9dc4a067e45d18153622975, 0x4f96a4cab2a12309d0a4b0d7, 0x51fe0d9634ac22d9db55ad69, 0x3dcf6ea583a2dd2cfcf4d42a, 0x522d0624f5e7bc3cc7ba4d36, 0xef8c7b3bdcbd6752cfc2f3c7, 0xe04379228cba51fc162f9b14, 0xa2b22a9f78e43bb8aba0bab4, 0x7ef79816262d274aa9beee59, 0x1f151392a6e7ad3ab4f17c11, 0x694a814a74f1e792bb77e43, 0x88862340507ffa743d469346, 0x261d5158ed2aea4fb94b2c31, 0x3e0f55f, 0x0, 0x0, 0x9d758c993f35908a3d1ac3ff, 0xd2b94a807513da92809e2af3, 0x8c7f76d167a36b770d1e8fa4, 0x89f1ab6618af73fdd32c9742, 0xd3026ac7ca72094dcdef5e43, 0x51277cad9de4188a88f05205, 0xce988cc6a462e889cffaff52, 0xbb9d54682048ff57329ce071, 0x109c4386ac03768c852f3848, 0x18369c66d96acfdfd138fc77, 0xaad15104b9bf4fdb4325f37c, 0xce473563426be11350ced0b, 0x90bf39c5762e1e14208f8c49, 0xa167ddb5eb69a2717ab77728, 0x19fd818ac22656b0ca417316, 0x4b7dd960656c1d09dc5df2e1, 0x80a10fddb4a0fce45c4c864e, 0xe1911945386c26866097a4d, 0xfb8c6404f61a0f9de33c0dd0, 0x6de8e2f0ba7315c0de88f87a, 0x37ab80ab90aa69864fadd20c, 0x1a3e25, 0x0, 0x0, 0xf2121f9ce628b5194b0cefa5, 0x6a5f463a796e10ecd42849a, 0x5d2a4286654bf665fe101638, 0x885e7b1498dfabffe72a0114, 0x8faba4649f56c58f230fb488, 0xb08f24bb73d250bf5db6c955, 0xf1921d98ca9d8aa78882d5a, 0xde67c2bba836959bf7b97c20, 0x284c59b4fc41995793ac1874, 0xc849748765ca588d1da02ba1, 0x93f0c43e3e5adcea6ccdfd05, 0x149d2a17f987b810b986de40, 0x4bcd3b49ad1d78194272f35f, 0x9deba0daae583afb085b2c4b, 0xa76986c51df2ba8b516fa6a8, 0x7d75066a98098577bb52d031, 0xd1325af69dd36c025cd1ad01, 0x6e2f3e0ffee43c228cd714b3, 0x6c53b6a8d7afbbb8fbc3f51d, 0xa0b3f87077c8ca62f57609da, 0x20e80e03dec15bb183f6b87a, 0x49b4e13a, 0x0, 0x0, 0x1122338bf96c33b2cdc51e1a, 0xf3842c58c7e88e85234cc33b, 0x118e93ada3f608f597c05576, 0x820d2fb2071bf3bd88ff1f31, 0x794cc1dcd63edadae69b8a19, 0xb9fca35d8f2504354d83fd15, 0xfaf9e42c40499105eb174ddc, 0x370da406563897ae26b6c1b5, 0xf06181c301b05608a8fdfe4f, 0x7299598267b24cac1809aaf1, 0x2568b0fcc7ccab32b30a764d, 0x32110d2a73226ac45617a6e7, 0x8509ed9c827b09cba0b49328, 0x15db7aaed73daae702d23789, 0x4b1b133af3360e316a51f0d0, 0xd70f54a3b7f67beb337c31b4, 0x3624811e36b4fc7771580301, 0xc49658f2429e8e7f49ac6290, 0xcf44ee8fa8ab3683fa652219, 0x4e83288ad7f11241e2ffd269, 0xa31b40eaf3ce320e1066f68a, 0x250450a1, 0x0, 0x0, 0x84870908709c3dab6fe072ff, 0xbf2e1910c1eeec426a2fa60d, 0xb0e14f452c55d16b7c4cc444, 0xee8ccd750ea73c3de2e82850, 0x500ea35e8db52a1b6051f685, 0x226854bc552e0877200da28d, 0xf318d9e3310ad66aaa6372cc, 0x711f695ee7feac54328be837, 0x6e68ee09cf4c96e48127691e, 0xeb6168084fda5a67368fae9a, 0x9d10a86ecc34257da7e4c573, 0xc18dbc3920f13c657979b907, 0xfbd2bc041d45131cd095b7, 0x24040e9f7ac50f4c1aede2de, 0x4f667f8bbbdd39b4c400ca1b, 0x58116778c283146864a1d725, 0x63227483f6f9a3d1c90d73f8, 0xf911d93f325613704206b4f3, 0x8ee124c2a51759408ba640b8, 0x128f8a8d3ae57f0db89a5619, 0x7274ae8fc90d232c639ce516, 0x89af86de, 0x0, 0x0, 0x2d3afffa35f4a64d88b011a4, 0x6a72c7b19e17943d45779d61, 0xf14546121e1ae073b87dbb04, 0xfcefea93fe20fe9ba6d7e269, 0x3e69d6a1bb5fd0f86e56fc16, 0x3dd3149f9ba5dfda0965692a, 0xaff401b42c729bdb3fe17190, 0x8ab45081ffc5295f73890f0e, 0x2fbc3ed733a21ceaf8b3ecd1, 0x5d1d52815d3ddcb1c15e4b26, 0x3d7e3f363a4ccac40b62215e, 0xe476e9c597a0cba31065be61, 0x969f1b3c01d5b6bae0222865, 0x3f85356074c5685da03f2b8d, 0x288892335a945169cf1f575f, 0xd2390ed4b3b3673ed84a9418, 0xfcc210117ef05c47e53fec2b, 0x9f7ef4fbf3f2b7b6eeeb9025, 0x7e59451c584b4845e5947a55, 0x840c1a26fa9560be178835b7, 0xa7a3d85a2b323f062530bbc5, 0x812bbe28, 0x0, 0x0, 0x1311e5c55dca533ae8ff5bdd, 0xc91ed1bb63c5b41390c53a4, 0xd30a95389c9bf8a33b12469d, 0x72a443acc53447f42906d77d, 0x4d48d08e2a86f28eda1436f4, 0x68a620e1b477d8abfe2d1e91, 0x5b70f922adb4e53849beb7b3, 0x128730d9ab5be441b0511d4c, 0x9dcbb43a9fb54b3aee1e3ea6, 0xd361e43fc318e81efcd2db5b, 0x68d06d367ba76425c1cc7726, 0x4ddbbd842d071d3245603b32, 0x45ab54282d4d3e77351a77e0, 0x1f56e3371f02d4a951e3bec8, 0x25a78164dc0758dc6a49607e, 0xe62463c0ddcffe7f516e1b37, 0x52bd6adc40c4246a21c684c2, 0x88e4071b1ecef5c6a7370623, 0x107634be04f731c2eb9ca6e5, 0x71b037cf14fd283826b88d28, 0x268eebfb0ae70481543bb615, 0x2ecb3fdb, 0x0, 0x0, 0x228ad4d7f125a5c4634b1466, 0xb613eae860b37f50920f6abf, 0xf0ab9f4db596def6a898d730, 0xd92438d0e40cdb17c67ff1ba, 0xfdb76d1b2f881112bcfaf280, 0x289c28eeca9b0434f2e5b9ca, 0x852ce01cc3271883b0768054, 0x67106e0d5cdbcff8277527f8, 0xb1b8a3577804682b961d40ac, 0x433a2f641eef2d53466d08d5, 0x84e43653e0e42bcfa5fdb450, 0x1e8c2a8aa2eedec5892e1776, 0x436c1e68352c53f5fef48cfb, 0x1edeff5a73e37ab057b2f38d, 0xf7bbbb410c00b81892638049, 0x8c6ef228fdb39fe535322bc0, 0xe674f4f97307541ec5fa366b, 0xf1109624569638b673c8c5f7, 0xb5b893eb13bb43a3cf1737c2, 0x6596ff86d59cf50dccac613a, 0x1d4425bbcf62d4f2a7486364, 0xeeb7fe5, 0x0, 0x0, 0x626c679fb93e38e1152067a3, 0xf5894b3b17ac906786800c2c, 0x682dbb547f9fd129275273e4, 0xadaa33f94a06e2c49096e4be, 0x53a9843eafa402c191ac52d4, 0xa09843114fbed7258d1550d0, 0x162c1ad01e86a8f9fcdb18da, 0x2868f237d3955ba2ad434e5, 0xe9ace982cdafd04fd06b1e64, 0xf55d93d36cbfd031ca5379b6, 0x7ced0068126e60248ecd8e0b, 0x47c0d7da84813c5b5436a290, 0x88da678da091c09811d45844, 0x382712da51d8204096c1a5b1, 0x7a5fc05b3d87dedc06f0ac53, 0x7ac555dadbfb13f23b13f8a3, 0x69b5a79149b02e1bf3237315, 0xc31a5209b37aeaa7024e42d4, 0x4a2d64b833d3bf5b25da4c17, 0xd27217840da833f3ca031490, 0xe6ba51dc5c9b1e335cef858e, 0x7f3020e, 0x0, 0x0, 0x77ceae4c2b60844b2c20e2b5, 0xe98658ee2e0bf9278cb7f742, 0xac62d553376ee518230cd74b, 0x79f7b1537573de2a4ea6982d, 0x6572247ce146cc339c0e8ee1, 0x8dc1388c892dbc07297d9c5a, 0x6619297249fffbb578b07cb8, 0xb473d090739a369439831f14, 0x5e36758211bd32bb0c810712, 0x3fd2530a4b6a0d4706db6db1, 0x2b4f8095fa770105f6026f2b, 0x725a3472870e49daf3a47088, 0x2f2c6284e7d6e535ae8783ad, 0x5df46bcb400acc60df3bba1c, 0x3110cc4ea7739dbcb892bedf, 0xd8fc37c1b17df8366a473e5c, 0x9c024beec23d515f672ccba6, 0xc8cfac66125f669f89b67f72, 0xb37e158aa7115d973c6df3eb, 0x8deddf9428a6ad2cdb6df56f, 0xaa7dce6f5b15deb02979ca3c, 0x6e398f, 0x0, 0x0, 0xea47369e330ae2455fcf1274, 0x9443983ce27b276ab6590698, 0x635d0621bf13934b5c5c9173, 0x9f3912332e740b9ba725cb3, 0xfd93cb852ed3653884a973d4, 0x61e5be1634839d9bf636b31d, 0x474e35474a3714020c89e488, 0x48ca2e24787a25ad9c960303, 0x76dcca8bde3a6d882447dc3e, 0x4c2860cada5514f768cbfe9e, 0x61f53b26b08c1eebdaf97907, 0xdfca4ee19639526f131edc99, 0xf31234fb5e86f130e9f35eac, 0xcca7639cfba949a6f4717459, 0xaf2e25c83dcf4e7d0b32bd86, 0x10fcd46ff86193f73287cb93, 0xf9833a4cd11692ef8d630f19, 0xeaa8d721f4fddfa3409b4345, 0x683cf50a0fe2e5df875d534c, 0xa5aa3ddd440adff4b27981d0, 0xa08bb0ad7b6549f3a77a7fbe, 0x279bde5, 0x0, 0x0, 0x606e72b70236cb25b787157, 0xd543e7423bb0a0e8a9ed8176, 0x6a3c4997523436b8c3c0d84d, 0x3cdf08fb4c1b083c14176ea, 0x197f9cf8e5acf6b1253106c1, 0x8337d584f9fd47df2c254539, 0xe3a5747a00c7add6c9746932, 0xe07f9abf4f93d5487adbc175, 0x75fd6f77331b6ca643e94cc9, 0x73971719d8b41099f5c4e24, 0xf29ce7b1de96c4c3258c5a16, 0x76ad5e8129d19353bb09bb74, 0xdddf9efe5b89ce1e2360d87a, 0x6e7b155ac21b1397605b7f5a, 0xdb2d8f1526f928e6cfe57f26, 0x835915c55f3e5c9bb2e41e7c, 0x811e1275ebd4789bfe68c316, 0x2f19cebb011c3d9771f7d3f7, 0xf18479a2846adfadf1af3407, 0xbf0a585f2e403c05b6e0cbf1, 0x890b4f52eb8897d561eade9a, 0xab09a, 0x0, 0x0, 0xfaf2885c8f07e54380fb0659, 0x1369e0c70af691c346ad0451, 0xf9d9dab7e5bf4217125091cf, 0xc94a4ddd4917d6cdaa14e17c, 0x16fc1947394f600f32bbdeb8, 0x6ec197ba0ea5948c25dcf903, 0x25b8f2adffec72402f74fc8, 0x10b5ae078726bf3ed1ab200c, 0xb7936eee2cbcaef5bdeb6082, 0x9b98e1aaf9ec32882e88eb83, 0xf1e0ce0e6d2df5c493671611, 0x56cbd12d9e9272a1b2dd4e0d, 0x4cf48df4a387c7353137d58b, 0xe164cb94753c07f1eac3f232, 0xf7c6c4badb977f9c9f72b08e, 0x3ac2f98a7a9780fb6d3cde91, 0x8d71aa7c2e2d911fc3b0d0d, 0xa63ebcb0cae8cdd3841b5a00, 0xeb50d80dd1210e3cb09476be, 0xd29f8a797919caa073068beb, 0x966eab8edeb0bc4bfe4b28f2, 0x71b86fa5, 0x0, 0x0, 0xc152caf76097ab0815045102, 0x3d98c92206b1824b7a7b26b6, 0x955bcbd1546aa595b1c70be6, 0xa2a13943bdc3876f39f39029, 0x60cae7e1c63731fa039088f7, 0xe0cd65b3d84f07e24d466ecb, 0x7ebd3729a4274ac3ab06260d, 0x99552eb3ebd2167dba704a47, 0x2f85bb7fdb8bb6ef6d7082f5, 0x59e12c5dab3d653e8d5dcae, 0x5efb1e847dac8f3c75e6b2dc, 0x5653b10a46f38289a303c60a, 0xb55b7ad35a60ee01b2a06c4a, 0x2fc9d6cc476812629f0690b4, 0x127881a109554756878eb900, 0xb64d4a9c25bc64493e8b83e7, 0x6f8220072f19c81354045b30, 0xc4b84f9f5cbfad17bb05e85f, 0x41e819c22d4771ec5f50b372, 0x6afd6a56fd002341db9aecd7, 0x8195c45613d4712c1545e7e, 0x581e31f3, 0x0, 0x0, 0x1039be0899a914834427fdaf, 0x46898826a20e11ccfcc9a6b9, 0x35ff691ea831f633237de7fd, 0xae796ca123ba5798fa00d076, 0x83e345f46082ea55b5e73ffb, 0x2c1051210027ac1a408050d8, 0xd9e8bdc02a581e56669179d0, 0xfb7f2e57b366f4297774790b, 0x9704009b7358e08261ab6a04, 0x38ede9f905cb13659162d038, 0xb27aab1efb2051983cbdcee0, 0xfdd5ea62b0b31a4c2516e8b9, 0xa4829e1cd351862e9e452ab6, 0x291f2bea88892dbe735d13b, 0xce6527df3fd6ee2cca7903ac, 0x3499269dbc455e3d447b0f5d, 0x8a245660e949239c73fa705d, 0x32794bbd8aadb6cf5290c426, 0xe68dda773520f0a862d1907c, 0x1f0329b4a262b8f4bbf513ef, 0x824202b9d0f6adc0d9791bc7, 0x168affea, 0x0, 0x0, 0x85e053b71672165b770143d9, 0x1435d4d955c76f51109fa271, 0x596f2aa4c7304743cec7e970, 0x81967cb23d3345f3da0d6483, 0xcd4ad402a7d80575069686e9, 0x9b9d2cc7150a4c07e8676a2c, 0x34dfc8eab0f7d59bcff3728e, 0xe035a0fd9108c35b2d8c53ac, 0xb5565a2c22c8b7ebc1dd0359, 0x503c2ed493799d64966c78a1, 0x9a59a23e1521bdcd93f1bd2e, 0xbafc90ae21f0818a58aa0c3c, 0x1ad7ca23fddbf265a8f7468b, 0x18dbd08c4b9e816d53551b57, 0xaea8b0fb268ba1a879fa3ead, 0xcc9019294c7af9ba8ea52429, 0x81243fc6681f4cc437df5791, 0x1c3973da8c348624795b1b35, 0x6213f497373385d11b004a0b, 0x3a15e382fec94f43fedb9fba, 0xdf2658a450ca87bc2b772dfa, 0x1604a62a, 0x0, 0x0, 0x63daf4f0614487a857aa397, 0x4cee11531104e6d3321a6137, 0x500042073e6d1148bd2559c, 0xd0609608648016503040201, 0xffffffffffffffff00303130, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0xffffffffffffffffffffffff, 0x1ffff, 0x0, 0x0, 0x0, 0x68656c6c6f20676172616761, 0xc, ] .span(); let public_key = Serde::::deserialize(ref rsa_sha256_serialized) .expect('FailToDeserializePk'); let rsa_with_hints = Serde::::deserialize(ref rsa_sha256_serialized) .expect('FailToDeserializeSig'); let message = Serde::::deserialize(ref rsa_sha256_serialized) .expect('FailToDeserializeMsg'); let is_valid = is_valid_rsa2048_sha256_signature(@rsa_with_hints, @public_key, @message); assert!(is_valid); } ================================================ FILE: src/src/tests/autogenerated/schnorr_tests.cairo ================================================ use garaga::core::circuit::u288IntoCircuitInputValue; use garaga::definitions::G1Point; use garaga::signatures::schnorr::{ SchnorrSignatureWithHint, is_valid_schnorr_signature_assuming_hash, }; #[test] #[ignore] // Ignored for auto-benchmarks fn test_schnorr_BN254() { let mut sch_sig_with_hints_serialized = array![ 0x5c724369afbc772d02aed58e, 0x2cd3bc838c66439a3d6160b, 0x72f26b55fb56be1, 0x0, 0xf14522f0e41279fa3733fed2, 0xea20efd268b756a9c0b06945, 0x7df9c9692acbd19, 0x0, 0x536c985db33c69f7c242e07a, 0xfc531bccffafcf1e59d91fb9, 0x2585e4f8a31664cb, 0x0, 0x88be2ce9ce62b465354a3799fa203a0f, 0x153a203b4df3737a1b3372ac547e5fbc, 0x12e0c8b2bad640fb19488dec4f65d4da, 0x1521f387af19922ad9b8a714e61a441c, 0x18, 0x2c40cb132c58c1528d9f95d4, 0x363f4c34cb9e9ec70646c9a0, 0x283fe6ad6138b4db, 0x0, 0x10969c686e4b6ba132f856ea, 0x9a84e9b2de29941e85990dd8, 0xce8c7dd9d8b7727, 0x0, 0x15f0bf1ccf4e04fd, 0x100000000000000004d15cba927fede3d, 0x100000000000000003fda8089c1ac8853, 0x8309133f4f176e9e, 0x2c41289f2cce1b1d98bc1c58, 0x877a1e0880ae4ac2e8cb9898, 0x1f1f91048403230b, 0x0, 0x51b26382cce36f83e9330566, 0x9303c191ab170a86a28c3ddd, 0x122b07c7aa481cb, 0x0, 0x100000000000000003a941ddef107f2c9, 0x10000000000000000002a2b771d1d6d88, 0x6f26862a18f2c12b, 0x44028f462731bd, ] .span(); let public_key = Serde::::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializePk'); let sch_with_hints = Serde::< SchnorrSignatureWithHint, >::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_schnorr_signature_assuming_hash(sch_with_hints, public_key, 0); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_schnorr_BLS12_381() { let mut sch_sig_with_hints_serialized = array![ 0xe4f817e54aede0613c17035c, 0xdff1f15010392a6da1f95a6, 0xbed78d3d341e911d49f15454, 0x18154782ce0913b21588066d, 0x73dc29ec930fa565a5979354, 0x9429c7a3a7a2e40636af119e, 0x63acb8cedd134d23d3ccba66, 0x18e6b0be5c742604e8963d45, 0xde4f62a6588c9401ffefbd3, 0x9bb5f797ac6d3395b71420b5, 0xdc39e973aaf31de52219df08, 0x105dcc4dce3960447d21d3c1, 0xb83ced7922696854920e4dce5618fd79, 0x1efa0c12855ed037f8665a14d0c63ba1, 0x12e0c8b2bad640fb19488dec4f65d4da, 0x2a43e70faf19922ad9b8a714e61a441c, 0x18, 0x99c33ff58fea7052bbb086a1, 0x1c359e13cb837e312dddb499, 0xedbe35427d90e4bb5ebcdf77, 0xb985b53c974e161da07a472, 0xde25a39170f2c0507b5ed860, 0x994e3ae48dce086260b85782, 0x7b22ea9577da0309f37f3ef9, 0x10ea8776b9541b0999d8d9cd, 0x22dbd86bddefd4d2, 0x100000000000000002092233c9decb8ff, 0xcd1dbee71ada39b7, 0x9322462863de7845, 0x95784ad2a24613cafab3e5ce, 0xdcf21fab1f76105f40e47606, 0x53de1e9b25d4c163c91db04c, 0x11a0b3d6dba83f3db716cb0e, 0x79e7b489b946a83ef4db5c0, 0x3b050ac62a98e6a19f9fe1c6, 0x93e750c788c6bfeb8566333a, 0x457b247b6591483d8dbf18b, 0x100000000000000008af4c254e183b405, 0x100000000000000004cbee0df44e8382c, 0x10000000000000000946f8bb609f9ba7d, 0x100000000000000004e77077ba28bdfd6, ] .span(); let public_key = Serde::::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializePk'); let sch_with_hints = Serde::< SchnorrSignatureWithHint, >::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_schnorr_signature_assuming_hash(sch_with_hints, public_key, 1); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_schnorr_SECP256R1() { let mut sch_sig_with_hints_serialized = array![ 0x113c8d620e3745e45e4389b8, 0x85b8ff52d905fd02fe191c3f, 0xf5d132d685201517, 0x0, 0x60c0ba1b358f375b2362662e, 0x6abfc829d93e09aa5174ec04, 0x7bc4637aca93cb5a, 0x0, 0xd3ff147ff0ee4213f51f677d, 0x431366a7732a6e4a6b942255, 0x9fe743b25d39a591, 0x0, 0x227664fcd18152d34168f6ded74ab915, 0x69b292ba7d07a7c252d76438f5ee7ec1, 0xe443df789558867f5ba91faf7a024205, 0x23a7711a8133287637ebdcd9e87a1613, 0x14, 0xe7048fa08ff83c48faafa01e, 0x4f5e1916e57a6dbf63c36e8d, 0x72872d18857fcd24, 0x0, 0x701ae40e4ba5a9f2e60e57ea, 0xadfda7abf39a0913191769f6, 0x2de1ee879affd779, 0x0, 0x434ebc818522df6c3a48fdeffa4bc338, 0x187026bb983fceb4a56a5ca9e9c969631, 0x40ab24bf96ae6fa731d65b90, 0x3d2d6da80d5ca858290e1409, 0x953b9901eec6e415, 0x0, 0x553919b2bd1f42bea69d67f3, 0x320dbca9f723841d3be6dcf9, 0x936046f4cb8c4595, 0x0, 0x3de0ac20b2665b5ee208e66433aaac05, 0x67db401fe06eea845a19e61367b76a34, ] .span(); let public_key = Serde::::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializePk'); let sch_with_hints = Serde::< SchnorrSignatureWithHint, >::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_schnorr_signature_assuming_hash(sch_with_hints, public_key, 3); assert!(is_valid); } #[test] fn test_schnorr_SECP256K1() { let mut sch_sig_with_hints_serialized = array![ 0x393dead57bc85a6e9bb44a70, 0x64d4b065b3ede27cf9fb9e5c, 0xda670c8c69a8ce0a, 0x0, 0x789872895ad7121175bd78f8, 0xc0deb0b56fb251e8fb5d0a8d, 0x3f10d670dc3297c2, 0x0, 0xfdfdc509f368ba4395773d3a, 0x8de2b60b577a13d0f83b578e, 0xc2dd970269530ba2, 0x0, 0x2cad564f3e93c6683bd94b5438ce08f0, 0xcbbfcb3b677e87eff66c9a804800a3b3, 0xe443df789558867f5ba91faf7a024205, 0x23a7711a8133287637ebdcd9e87a1613, 0x18, 0x594f9cb2a86a873bb8d4ccbd, 0xfee1700bc5d2111958ae798c, 0x4d99e99571d0a61e, 0x0, 0xf284daf0aabffcef1939ef8, 0x91753b141fbe90ddcb717736, 0x3233811221bd1d30, 0x0, 0x100000000000000000a9b06fa280b530a, 0x1000000000000000040415040c7a17610, 0x100000000000000002e35f1582f3234ce, 0x100000000000000008f635c9bcb2eefe1, 0x79a64775d37621de2372f3cb, 0xd3aa1d3b8418f14398df80f2, 0x2430232b1b17cb55, 0x0, 0x895249ed4eaf972102b5c3f5, 0xd35f2675285d8568f81ef0d, 0x1fbd9931c3f2bbf8, 0x0, 0x10000000000000000baf06a7a3e4aa015, 0x1000000000000000075adffb9c0d2b742, 0x100000000000000006f45630d920758e7, 0x13bfcc5670fee7eb, ] .span(); let public_key = Serde::::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializePk'); let sch_with_hints = Serde::< SchnorrSignatureWithHint, >::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_schnorr_signature_assuming_hash(sch_with_hints, public_key, 2); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_schnorr_ED25519() { let mut sch_sig_with_hints_serialized = array![ 0x7238f02b9f20e09c2181a557, 0x2cedcc5b0be371c337fd7e9e, 0x41f3bbeb280fe8a2, 0x0, 0xfb9073291a58a0358e22e52, 0x76d4b9ec10a3a720b1096d5b, 0xad805c90a8c77b8, 0x0, 0x82e4a33f8e4e5881e791d86b, 0xbcb062435ae8ec5fdaeac4bf, 0x179e1bae9e0f9f34, 0x0, 0xa84dfdd6e617589384812f69a2d349c1, 0xa968f5c0a623e3b190de39304eb726a, 0x12e0c8b2bad640fb19488dec4f65d4da, 0xa90f9c3af19922ad9b8a714e61a441c, 0x14, 0x5cba1348511e21f20cd92c86, 0x63fd89d574978c8364a33dc6, 0x7a1a075dacc03bb1, 0x0, 0xe16c3afd3bd9d2a736b5cb70, 0xd954e7aefbda0297b7855a5, 0x3285ce7a8018f502, 0x0, 0x3315e27d27a210cb7baa18b5f3f0f9b3, 0x10f773711dcf75ce59993cf26c4f5ebf9, 0xfbd811bae294558352d2ca8f, 0xc6b9c22af47b1e43d21ba644, 0x5c18972e38278425, 0x0, 0x6a687b6263384a17569caeb3, 0x4166dd87f125393bd27679eb, 0x13a8e31e947075f3, 0x0, 0x2ed8419cedf331ec3d387ed44220284f, 0xdbbf233e0f266b14c85329c2440c426, ] .span(); let public_key = Serde::::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializePk'); let sch_with_hints = Serde::< SchnorrSignatureWithHint, >::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_schnorr_signature_assuming_hash(sch_with_hints, public_key, 4); assert!(is_valid); } #[test] #[ignore] // Ignored for auto-benchmarks fn test_schnorr_GRUMPKIN() { let mut sch_sig_with_hints_serialized = array![ 0x86b402ce02e7c7ca81f13d51, 0x39493672733a9289a36020c1, 0x7f40d91dc5413d3, 0x0, 0x429af526e7e0a5381bccb180, 0x88f6dad23856d096b8b80e2e, 0x2684532513785230, 0x0, 0x20669ef12954f8e3bbc8b4d3, 0x396a6f7243c27ce553121ee3, 0x11438ca2ec259aed, 0x0, 0x7c7059f6158e689893dd21a94f41e410, 0x2454f3702220747f9b72cc1f2d34af71, 0x12e0c8b2bad640fb19488dec4f65d4da, 0x1521f387af19922ad9b8a714e61a441c, 0x14, 0x1619e977386f5b086cdc8857, 0x9ee9c3131ed8c4e6fb8d3b10, 0x2a23881e074bdeda, 0x0, 0x783572bfbbe358723c90aaab, 0xf40d2176448bb22e9cbc031d, 0x2be35fe4dd3f44fb, 0x0, 0x51cf7b3d0715b44af5d2f31cb1fd7677, 0x15838663fe7e8f8c16583cabb5df7308, 0xa8fc937f9ebc90a8a9a2cf09, 0x6c2d666bea9386f60b1a46c2, 0x2244eddd508f6f81, 0x0, 0x5ec6d01c41cedc947662556b, 0x4a7cb97d69bce744b75607b3, 0x2e39c1ad41f66954, 0x0, 0x19ae1fd3832d250c6410c5e4cb759edf, 0x538cc4627274d8f320bf5df15c887356, ] .span(); let public_key = Serde::::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializePk'); let sch_with_hints = Serde::< SchnorrSignatureWithHint, >::deserialize(ref sch_sig_with_hints_serialized) .expect('FailToDeserializeSig'); let is_valid = is_valid_schnorr_signature_assuming_hash(sch_with_hints, public_key, 5); assert!(is_valid); } ================================================ FILE: src/src/tests/autogenerated/tower_pairing_tests.cairo ================================================ use core::num::traits::One; use garaga::circuits::tower_circuits::{run_BLS12_381_E12T_MUL_circuit, run_BN254_E12T_MUL_circuit}; use garaga::definitions::{E12T, G1Point, G2Point, u384}; use garaga::ec_ops::G1PointImpl; use garaga::ec_ops_g2::G2PointImpl; use garaga::single_pairing_tower::{ final_exp_bls12_381_tower, final_exp_bn254_tower, miller_loop_bls12_381_tower, miller_loop_bn254_tower, }; #[test] fn test_tower_pairing_BN254_1P() { let mut res: E12T = One::one(); let p0: G1Point = G1Point { x: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, y: u384 { limb0: 0x2, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }; p0.assert_on_curve_excluding_infinity(0); let q0: G2Point = G2Point { x0: u384 { limb0: 0xf75edadd46debd5cd992f6ed, limb1: 0x426a00665e5c4479674322d4, limb2: 0x1800deef121f1e76, limb3: 0x0, }, x1: u384 { limb0: 0x35a9e71297e485b7aef312c2, limb1: 0x7260bfb731fb5d25f1aa4933, limb2: 0x198e9393920d483a, limb3: 0x0, }, y0: u384 { limb0: 0xc43d37b4ce6cc0166fa7daa, limb1: 0x4aab71808dcb408fe3d1e769, limb2: 0x12c85ea5db8c6deb, limb3: 0x0, }, y1: u384 { limb0: 0x70b38ef355acdadcd122975b, limb1: 0xec9e99ad690c3395bc4b3133, limb2: 0x90689d0585ff075, limb3: 0x0, }, }; q0.assert_on_curve_excluding_infinity(0); let (tmp0) = miller_loop_bn254_tower(p0, q0); let (res) = run_BN254_E12T_MUL_circuit(tmp0, res); let final = final_exp_bn254_tower(res); assert_eq!( final, E12T { c0b0a0: u384 { limb0: 0x898578b55e1f63739d870e95, limb1: 0xda01bde280a3ed6f87e5feb, limb2: 0x262b253feda94cfe, limb3: 0x0, }, c0b0a1: u384 { limb0: 0x918ed66b49d34b48efb8a4a, limb1: 0xa1b1f823879abbd397c4dea, limb2: 0x2e02d2cc795a200, limb3: 0x0, }, c0b1a0: u384 { limb0: 0x87ecb1fc4e135402fdbd1de0, limb1: 0xa5b1ad44b31977935fd29573, limb2: 0x13a9f2d6e29b128d, limb3: 0x0, }, c0b1a1: u384 { limb0: 0x699ce630b130b08a6ea1162b, limb1: 0x4b31984a74e68659c4b420bd, limb2: 0x40ba9fa500f1a5c, limb3: 0x0, }, c0b2a0: u384 { limb0: 0x211ce30bf5e3eeaef89eafdb, limb1: 0xbe359d7f9873f052478f590b, limb2: 0xafc2f3fd870678f, limb3: 0x0, }, c0b2a1: u384 { limb0: 0xcc5a8243f9cddbd2d98dd1f0, limb1: 0xbdc662d929e645cadda9a712, limb2: 0x1c54a530398c9064, limb3: 0x0, }, c1b0a0: u384 { limb0: 0xfd4b7aef5c0d58c5dc2429fe, limb1: 0x23794a0d856f92591ba990ec, limb2: 0x95c0fbf5d5a1ac0, limb3: 0x0, }, c1b0a1: u384 { limb0: 0x590cb4a60f8215d4b99f2b4a, limb1: 0xa31dc10f7b4053c9e9ad9ebb, limb2: 0x14d3d6ca72d8a950, limb3: 0x0, }, c1b1a0: u384 { limb0: 0x43c585fdfaf545838ca7429, limb1: 0x89dc206b4b91c85759dc1a23, limb2: 0x1dc0e7bbc3d70e66, limb3: 0x0, }, c1b1a1: u384 { limb0: 0xac16cc1b7ab2cd3ed5e22b97, limb1: 0x98a855ffc837d2a75ab90d61, limb2: 0xb53320e5a6488cb, limb3: 0x0, }, c1b2a0: u384 { limb0: 0xc42a9c0f9bd7fddaf5ebd723, limb1: 0x6c91476ef36cd1d318ce07ba, limb2: 0x13a8afd3085dae4c, limb3: 0x0, }, c1b2a1: u384 { limb0: 0x43940c383e5314859e762c97, limb1: 0xb601f3730a3afa965ceee1b3, limb2: 0xf97b5221474526, limb3: 0x0, }, }, ); } #[test] fn test_tower_pairing_BN254_2P() { let mut res: E12T = One::one(); let p0: G1Point = G1Point { x: u384 { limb0: 0xcdb6d03cb7b9a5409b7efcd8, limb1: 0xd1df87eab84852372b905c9c, limb2: 0x1d0634f3f21e7890, limb3: 0x0, }, y: u384 { limb0: 0xaa1d4f4d3021032564460978, limb1: 0xeb3f1d6ba3b10e2b53dc193b, limb2: 0x24c53532773dce26, limb3: 0x0, }, }; p0.assert_on_curve_excluding_infinity(0); let q0: G2Point = G2Point { x0: u384 { limb0: 0xf75edadd46debd5cd992f6ed, limb1: 0x426a00665e5c4479674322d4, limb2: 0x1800deef121f1e76, limb3: 0x0, }, x1: u384 { limb0: 0x35a9e71297e485b7aef312c2, limb1: 0x7260bfb731fb5d25f1aa4933, limb2: 0x198e9393920d483a, limb3: 0x0, }, y0: u384 { limb0: 0xc43d37b4ce6cc0166fa7daa, limb1: 0x4aab71808dcb408fe3d1e769, limb2: 0x12c85ea5db8c6deb, limb3: 0x0, }, y1: u384 { limb0: 0x70b38ef355acdadcd122975b, limb1: 0xec9e99ad690c3395bc4b3133, limb2: 0x90689d0585ff075, limb3: 0x0, }, }; q0.assert_on_curve_excluding_infinity(0); let (tmp0) = miller_loop_bn254_tower(p0, q0); let (res) = run_BN254_E12T_MUL_circuit(tmp0, res); let p1: G1Point = G1Point { x: u384 { limb0: 0x536c985db33c69f7c242e07a, limb1: 0xfc531bccffafcf1e59d91fb9, limb2: 0x2585e4f8a31664cb, limb3: 0x0, }, y: u384 { limb0: 0x57fa42444057cf0c1d62ae3c, limb1: 0x4f48d341183118d68ea41313, limb2: 0x1d2d2799db056ed1, limb3: 0x0, }, }; p1.assert_on_curve_excluding_infinity(0); let q1: G2Point = G2Point { x0: u384 { limb0: 0x335eb0538f718d8e6651eeb1, limb1: 0x635e573808d9d5c7178bdce7, limb2: 0x1314aaf1c372e6d7, limb3: 0x0, }, x1: u384 { limb0: 0x5289f29ccc5acf5e81526673, limb1: 0x2d4aba9e1448a8cc1048d01a, limb2: 0x14c25d3aec745e5a, limb3: 0x0, }, y0: u384 { limb0: 0x10d1d0efd5869ecd23aab8e9, limb1: 0xba7d1de6d86501d49b6a8dab, limb2: 0x397391b7b25e2f, limb3: 0x0, }, y1: u384 { limb0: 0x385a553ea12434f4eda6db36, limb1: 0xb058c1ff7e4c5c7ec7e5859b, limb2: 0x1863ac65eca09e89, limb3: 0x0, }, }; q1.assert_on_curve_excluding_infinity(0); let (tmp1) = miller_loop_bn254_tower(p1, q1); let (res) = run_BN254_E12T_MUL_circuit(tmp1, res); let final = final_exp_bn254_tower(res); assert_eq!( final, E12T { c0b0a0: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b0a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b1a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b1a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b2a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b2a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b0a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b0a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b1a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b1a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b2a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b2a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }, ); } #[test] fn test_tower_pairing_BN254_3P() { let mut res: E12T = One::one(); let p0: G1Point = G1Point { x: u384 { limb0: 0x5c724369afbc772d02aed58e, limb1: 0x2cd3bc838c66439a3d6160b, limb2: 0x72f26b55fb56be1, limb3: 0x0, }, y: u384 { limb0: 0x772ca79c580e121ca148fe75, limb1: 0xce2f55e418ca01b3d6d1014b, limb2: 0x2884b1dc4e84e30f, limb3: 0x0, }, }; p0.assert_on_curve_excluding_infinity(0); let q0: G2Point = G2Point { x0: u384 { limb0: 0xa30b422f34656d6c94e40be, limb1: 0x83069b5050fd7194c7e35d0c, limb2: 0xf0e8184945e8d34, limb3: 0x0, }, x1: u384 { limb0: 0xde9079ee8fa5e15901dfef27, limb1: 0xdb602cf367841e5047ffab14, limb2: 0x1752c7b6b35af45, limb3: 0x0, }, y0: u384 { limb0: 0x4dafbd7f615fd2aa9f5a0acc, limb1: 0x35c8bbffe201ffd56deb5dea, limb2: 0xa822a5ba029a283, limb3: 0x0, }, y1: u384 { limb0: 0xec6d9e4fafec17b8404c0341, limb1: 0x17fe961ad4b8ee3bf2ade626, limb2: 0x1228147f83e3ea5, limb3: 0x0, }, }; q0.assert_on_curve_excluding_infinity(0); let (tmp0) = miller_loop_bn254_tower(p0, q0); let (res) = run_BN254_E12T_MUL_circuit(tmp0, res); let p1: G1Point = G1Point { x: u384 { limb0: 0x5c724369afbc772d02aed58e, limb1: 0x2cd3bc838c66439a3d6160b, limb2: 0x72f26b55fb56be1, limb3: 0x0, }, y: u384 { limb0: 0x772ca79c580e121ca148fe75, limb1: 0xce2f55e418ca01b3d6d1014b, limb2: 0x2884b1dc4e84e30f, limb3: 0x0, }, }; p1.assert_on_curve_excluding_infinity(0); let q1: G2Point = G2Point { x0: u384 { limb0: 0xa30b422f34656d6c94e40be, limb1: 0x83069b5050fd7194c7e35d0c, limb2: 0xf0e8184945e8d34, limb3: 0x0, }, x1: u384 { limb0: 0xde9079ee8fa5e15901dfef27, limb1: 0xdb602cf367841e5047ffab14, limb2: 0x1752c7b6b35af45, limb3: 0x0, }, y0: u384 { limb0: 0x4dafbd7f615fd2aa9f5a0acc, limb1: 0x35c8bbffe201ffd56deb5dea, limb2: 0xa822a5ba029a283, limb3: 0x0, }, y1: u384 { limb0: 0xec6d9e4fafec17b8404c0341, limb1: 0x17fe961ad4b8ee3bf2ade626, limb2: 0x1228147f83e3ea5, limb3: 0x0, }, }; q1.assert_on_curve_excluding_infinity(0); let (tmp1) = miller_loop_bn254_tower(p1, q1); let (res) = run_BN254_E12T_MUL_circuit(tmp1, res); let p2: G1Point = G1Point { x: u384 { limb0: 0x8dcb6db105ead17484cff544, limb1: 0x95151f1c65bf4c2e698b5634, limb2: 0xc83f07e39979c6a, limb3: 0x0, }, y: u384 { limb0: 0x38cf77eafd4a4fdd9e46575, limb1: 0x3cf1e428854a9a0e559814bc, limb2: 0x15571140da88fd37, limb3: 0x0, }, }; p2.assert_on_curve_excluding_infinity(0); let q2: G2Point = G2Point { x0: u384 { limb0: 0xa30b422f34656d6c94e40be, limb1: 0x83069b5050fd7194c7e35d0c, limb2: 0xf0e8184945e8d34, limb3: 0x0, }, x1: u384 { limb0: 0xde9079ee8fa5e15901dfef27, limb1: 0xdb602cf367841e5047ffab14, limb2: 0x1752c7b6b35af45, limb3: 0x0, }, y0: u384 { limb0: 0x4dafbd7f615fd2aa9f5a0acc, limb1: 0x35c8bbffe201ffd56deb5dea, limb2: 0xa822a5ba029a283, limb3: 0x0, }, y1: u384 { limb0: 0xec6d9e4fafec17b8404c0341, limb1: 0x17fe961ad4b8ee3bf2ade626, limb2: 0x1228147f83e3ea5, limb3: 0x0, }, }; q2.assert_on_curve_excluding_infinity(0); let (tmp2) = miller_loop_bn254_tower(p2, q2); let (res) = run_BN254_E12T_MUL_circuit(tmp2, res); let final = final_exp_bn254_tower(res); assert_eq!( final, E12T { c0b0a0: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b0a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b1a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b1a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b2a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b2a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b0a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b0a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b1a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b1a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b2a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b2a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }, ); } #[test] fn test_tower_pairing_BLS12_381_1P() { let mut res: E12T = One::one(); let p0: G1Point = G1Point { x: u384 { limb0: 0xf97a1aeffb3af00adb22c6bb, limb1: 0xa14e3a3f171bac586c55e83f, limb2: 0x4fa9ac0fc3688c4f9774b905, limb3: 0x17f1d3a73197d7942695638c, }, y: u384 { limb0: 0xa2888ae40caa232946c5e7e1, limb1: 0xdb18cb2c04b3edd03cc744, limb2: 0x741d8ae4fcf5e095d5d00af6, limb3: 0x8b3f481e3aaa0f1a09e30ed, }, }; p0.assert_on_curve_excluding_infinity(1); let q0: G2Point = G2Point { x0: u384 { limb0: 0xa805bbefd48056c8c121bdb8, limb1: 0xb4510b647ae3d1770bac0326, limb2: 0x2dc51051c6e47ad4fa403b02, limb3: 0x24aa2b2f08f0a9126080527, }, x1: u384 { limb0: 0x13945d57e5ac7d055d042b7e, limb1: 0xb5da61bbdc7f5049334cf112, limb2: 0x88274f65596bd0d09920b61a, limb3: 0x13e02b6052719f607dacd3a0, }, y0: u384 { limb0: 0x3baca289e193548608b82801, limb1: 0x6d429a695160d12c923ac9cc, limb2: 0xda2e351aadfd9baa8cbdd3a7, limb3: 0xce5d527727d6e118cc9cdc6, }, y1: u384 { limb0: 0x5cec1da1aaa9075ff05f79be, limb1: 0x267492ab572e99ab3f370d27, limb2: 0x2bc28b99cb3e287e85a763af, limb3: 0x606c4a02ea734cc32acd2b0, }, }; q0.assert_on_curve_excluding_infinity(1); let (tmp0) = miller_loop_bls12_381_tower(p0, q0); let (res) = run_BLS12_381_E12T_MUL_circuit(tmp0, res); let final = final_exp_bls12_381_tower(res); assert_eq!( final, E12T { c0b0a0: u384 { limb0: 0x839c508a84305aaca1789b6, limb1: 0x3dd8e90ce98db3e7b6d194f6, limb2: 0x68d0d727272d441befa15c50, limb3: 0x1250ebd871fc0a92a7b2d831, }, c0b0a1: u384 { limb0: 0x50439f1d59882a98eaa0170f, limb1: 0xaf5af689452eafabf1a8943e, limb2: 0xa532348868a84045483c92b7, limb3: 0x89a1c5b46e5110b86750ec6, }, c0b1a0: u384 { limb0: 0x9396b38c881c4c849ec23e87, limb1: 0x16da0e22a5031b54ddff5730, limb2: 0x689ce34c0378a68e72a6b3b2, limb3: 0x1368bb445c7c2d209703f239, }, c0b1a1: u384 { limb0: 0x579973b1315021ec3c19934f, limb1: 0x7c90d8bd66065b1fffe51d7a, limb2: 0x5a50512937e0794e1e65a761, limb3: 0x193502b86edb8857c273fa07, }, c0b2a0: u384 { limb0: 0xbbaad8431dad1c1fb597aaa5, limb1: 0x185203fcca589ac719c34dff, limb2: 0x4dc4007cfbf2f8da752f7c74, limb3: 0x1b2f522473d171391125ba8, }, c0b2a1: u384 { limb0: 0xa35c8ca78beae9624045b4b6, limb1: 0x8061e55cceba478b23f7daca, limb2: 0x7a45b84546da634b8f6be14a, limb3: 0x18107154f25a764bd3c7993, }, c1b0a0: u384 { limb0: 0x86a8703e0f948226e47ee89d, limb1: 0xdea54d43b2b73f2cbb12d583, limb2: 0xc3d5a04dc88784fbb3d0b2db, limb3: 0x19f26337d205fb469cd6bd15, }, c1b0a1: u384 { limb0: 0xff02f0b8102ae1c2d5d5ab1a, limb1: 0xa7d2809d61bfe02e1bfd1b68, limb2: 0xa771b6ffd5857baaf222eb95, limb3: 0x6fba23eb7c5af0d9f80940c, }, c1b1a0: u384 { limb0: 0x1e32fac91b93b47333e2ba57, limb1: 0x7d0d15ff7b984e8978ef4888, limb2: 0x3b0b0ec5c81a93b330ee1a67, limb3: 0x11b8b424cd48bf38fcef6808, }, c1b1a1: u384 { limb0: 0xa09ffdd9be2291a0c25a99a2, limb1: 0x20c806ad360829107ba810c5, limb2: 0x6ce5771cc6a0e9786ab59733, limb3: 0x3350f55a7aefcd3c31b4fcb, }, c1b2a0: u384 { limb0: 0x66245cb9108f0242d0fe3ef, limb1: 0x1c7cdba7b3872629a4fafc05, limb2: 0x728ffd21a189e87935a95405, limb3: 0x4c581234d086a9902249b64, }, c1b2a1: u384 { limb0: 0xafe47e1efde449383b676631, limb1: 0xdeff686bfd6df543d48eaa24, limb2: 0xd01a7ec73baca4d72ca93544, limb3: 0xf41e58663bf08cf068672cb, }, }, ); } #[test] fn test_tower_pairing_BLS12_381_2P() { let mut res: E12T = One::one(); let p0: G1Point = G1Point { x: u384 { limb0: 0xfe174bb39be8658ef83c8c2d, limb1: 0xdb24ddec0e0c3b63d82efa81, limb2: 0xe360a80121d5ef96fd687003, limb3: 0x59d2a79bda5f8a941d4db9, }, y: u384 { limb0: 0x7f68344f543e52fe891285a9, limb1: 0x6f6992be16bc35f88c471acf, limb2: 0xcebb5ee96e40a033f5d3b798, limb3: 0x2df47e8cdf189985d5085bd, }, }; p0.assert_on_curve_excluding_infinity(1); let q0: G2Point = G2Point { x0: u384 { limb0: 0xa805bbefd48056c8c121bdb8, limb1: 0xb4510b647ae3d1770bac0326, limb2: 0x2dc51051c6e47ad4fa403b02, limb3: 0x24aa2b2f08f0a9126080527, }, x1: u384 { limb0: 0x13945d57e5ac7d055d042b7e, limb1: 0xb5da61bbdc7f5049334cf112, limb2: 0x88274f65596bd0d09920b61a, limb3: 0x13e02b6052719f607dacd3a0, }, y0: u384 { limb0: 0x3baca289e193548608b82801, limb1: 0x6d429a695160d12c923ac9cc, limb2: 0xda2e351aadfd9baa8cbdd3a7, limb3: 0xce5d527727d6e118cc9cdc6, }, y1: u384 { limb0: 0x5cec1da1aaa9075ff05f79be, limb1: 0x267492ab572e99ab3f370d27, limb2: 0x2bc28b99cb3e287e85a763af, limb3: 0x606c4a02ea734cc32acd2b0, }, }; q0.assert_on_curve_excluding_infinity(1); let (tmp0) = miller_loop_bls12_381_tower(p0, q0); let (res) = run_BLS12_381_E12T_MUL_circuit(tmp0, res); let p1: G1Point = G1Point { x: u384 { limb0: 0xde4f62a6588c9401ffefbd3, limb1: 0x9bb5f797ac6d3395b71420b5, limb2: 0xdc39e973aaf31de52219df08, limb3: 0x105dcc4dce3960447d21d3c1, }, y: u384 { limb0: 0xaefd0d854043fd325dd3c34f, limb1: 0x9b63c98d9a7845c52e1e2b0f, limb2: 0x9db0be660d847ccc58358f3f, limb3: 0x17cb6c41f0c4e1a7394ab62a, }, }; p1.assert_on_curve_excluding_infinity(1); let q1: G2Point = G2Point { x0: u384 { limb0: 0x3b3d3c305a70960906e6cb09, limb1: 0x40e5bf3ff02d81e98b75703a, limb2: 0x665a5fc010510bd690ddd7b5, limb3: 0x82dc9154807866eb0f36ccb, }, x1: u384 { limb0: 0xe6709deb0dcf81d4285e5e60, limb1: 0xb4dcf956002c4efb974ffcee, limb2: 0x4a6ceebe6375a83dd242851b, limb3: 0xdd18d077ad5bd58dabb18d8, }, y0: u384 { limb0: 0x61535fe1a90bae7e6692f9b0, limb1: 0xc91aa58105d3a281b2e84ddb, limb2: 0x197d3446652372ce5ef50e93, limb3: 0x4a468eb9e206b9833d8e8e2, }, y1: u384 { limb0: 0x27115c334e82ed4be8da6c10, limb1: 0x194fa3bf769a2e5a52535277, limb2: 0x8be8992de81f47ae3341c590, limb3: 0x198fd0ab6249082bf7007d7e, }, }; q1.assert_on_curve_excluding_infinity(1); let (tmp1) = miller_loop_bls12_381_tower(p1, q1); let (res) = run_BLS12_381_E12T_MUL_circuit(tmp1, res); let final = final_exp_bls12_381_tower(res); assert_eq!( final, E12T { c0b0a0: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b0a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b1a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b1a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b2a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b2a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b0a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b0a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b1a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b1a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b2a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b2a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }, ); } #[test] fn test_tower_pairing_BLS12_381_3P() { let mut res: E12T = One::one(); let p0: G1Point = G1Point { x: u384 { limb0: 0xe4f817e54aede0613c17035c, limb1: 0xdff1f15010392a6da1f95a6, limb2: 0xbed78d3d341e911d49f15454, limb3: 0x18154782ce0913b21588066d, }, y: u384 { limb0: 0x3d77d61326ef5a9a5a681757, limb1: 0xd3070afd4f0e121de7fcee60, limb2: 0xdf9ef4088763fe611fb85858, limb3: 0x11a612bdd0bc09562856a70, }, }; p0.assert_on_curve_excluding_infinity(1); let q0: G2Point = G2Point { x0: u384 { limb0: 0x30d2fddc2fa171cdd4d31a55, limb1: 0x92fab4f255a20d09700542e5, limb2: 0x4d92a8c02d22b8cea4ff21ab, limb3: 0x120a838699abaae7ed948194, }, x1: u384 { limb0: 0x51cd5fdc71cf4557ef606935, limb1: 0x92e1b13e2c93fc9957b17841, limb2: 0x6143a906b63b7f3476ad6819, limb3: 0x158186f6f2dd04cfa4e78547, }, y0: u384 { limb0: 0x9f1c7dcdbe4574f05d0c093b, limb1: 0xcde395f3ee4e353cf25a2e21, limb2: 0x6a44c4a6d642c3dd98128703, limb3: 0x2bd32fdfe26d866771e2180, }, y1: u384 { limb0: 0x7060005397ea11f7e9a26050, limb1: 0xeb8540654b533da9b594fc27, limb2: 0xfc83cf9d283b7231df1db3f9, limb3: 0x7ff9623d918ca12e0ff6cce, }, }; q0.assert_on_curve_excluding_infinity(1); let (tmp0) = miller_loop_bls12_381_tower(p0, q0); let (res) = run_BLS12_381_E12T_MUL_circuit(tmp0, res); let p1: G1Point = G1Point { x: u384 { limb0: 0xe4f817e54aede0613c17035c, limb1: 0xdff1f15010392a6da1f95a6, limb2: 0xbed78d3d341e911d49f15454, limb3: 0x18154782ce0913b21588066d, }, y: u384 { limb0: 0x3d77d61326ef5a9a5a681757, limb1: 0xd3070afd4f0e121de7fcee60, limb2: 0xdf9ef4088763fe611fb85858, limb3: 0x11a612bdd0bc09562856a70, }, }; p1.assert_on_curve_excluding_infinity(1); let q1: G2Point = G2Point { x0: u384 { limb0: 0x30d2fddc2fa171cdd4d31a55, limb1: 0x92fab4f255a20d09700542e5, limb2: 0x4d92a8c02d22b8cea4ff21ab, limb3: 0x120a838699abaae7ed948194, }, x1: u384 { limb0: 0x51cd5fdc71cf4557ef606935, limb1: 0x92e1b13e2c93fc9957b17841, limb2: 0x6143a906b63b7f3476ad6819, limb3: 0x158186f6f2dd04cfa4e78547, }, y0: u384 { limb0: 0x9f1c7dcdbe4574f05d0c093b, limb1: 0xcde395f3ee4e353cf25a2e21, limb2: 0x6a44c4a6d642c3dd98128703, limb3: 0x2bd32fdfe26d866771e2180, }, y1: u384 { limb0: 0x7060005397ea11f7e9a26050, limb1: 0xeb8540654b533da9b594fc27, limb2: 0xfc83cf9d283b7231df1db3f9, limb3: 0x7ff9623d918ca12e0ff6cce, }, }; q1.assert_on_curve_excluding_infinity(1); let (tmp1) = miller_loop_bls12_381_tower(p1, q1); let (res) = run_BLS12_381_E12T_MUL_circuit(tmp1, res); let p2: G1Point = G1Point { x: u384 { limb0: 0x6b2dbb412523879f8e3a96a0, limb1: 0x6daa411c3d8c33de611bc2fe, limb2: 0x38ff9a4921f13749974e4731, limb3: 0x2b2fcedd1d05f99449b4884, }, y: u384 { limb0: 0x845744e5af99690d2a360ec2, limb1: 0x56b0c0147f0ee90a5c1b6e41, limb2: 0xdee769045aef4994aab4b4fc, limb3: 0x32b985c03cd5519d41d0cbb, }, }; p2.assert_on_curve_excluding_infinity(1); let q2: G2Point = G2Point { x0: u384 { limb0: 0x30d2fddc2fa171cdd4d31a55, limb1: 0x92fab4f255a20d09700542e5, limb2: 0x4d92a8c02d22b8cea4ff21ab, limb3: 0x120a838699abaae7ed948194, }, x1: u384 { limb0: 0x51cd5fdc71cf4557ef606935, limb1: 0x92e1b13e2c93fc9957b17841, limb2: 0x6143a906b63b7f3476ad6819, limb3: 0x158186f6f2dd04cfa4e78547, }, y0: u384 { limb0: 0x9f1c7dcdbe4574f05d0c093b, limb1: 0xcde395f3ee4e353cf25a2e21, limb2: 0x6a44c4a6d642c3dd98128703, limb3: 0x2bd32fdfe26d866771e2180, }, y1: u384 { limb0: 0x7060005397ea11f7e9a26050, limb1: 0xeb8540654b533da9b594fc27, limb2: 0xfc83cf9d283b7231df1db3f9, limb3: 0x7ff9623d918ca12e0ff6cce, }, }; q2.assert_on_curve_excluding_infinity(1); let (tmp2) = miller_loop_bls12_381_tower(p2, q2); let (res) = run_BLS12_381_E12T_MUL_circuit(tmp2, res); let final = final_exp_bls12_381_tower(res); assert_eq!( final, E12T { c0b0a0: u384 { limb0: 0x1, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b0a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b1a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b1a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b2a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c0b2a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b0a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b0a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b1a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b1a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b2a0: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, c1b2a1: u384 { limb0: 0x0, limb1: 0x0, limb2: 0x0, limb3: 0x0 }, }, ); } #[test] fn test_tower_final_exp_BN254() { let input = E12T { c0b0a0: u384 { limb0: 0x9558867f5ba91faf7a024204, limb1: 0x37ebdcd9e87a1613e443df78, limb2: 0x8e9dc4681332876, limb3: 0x0, }, c0b0a1: u384 { limb0: 0xfb97d43588561712e8e5216a, limb1: 0x9a164106cf6a659eb4862b21, limb2: 0x967d0cae6f4590b, limb3: 0x0, }, c0b1a0: u384 { limb0: 0xbad640fb19488dec4f65d4d9, limb1: 0xd9b8a714e61a441c12e0c8b2, limb2: 0x1521f387af19922a, limb3: 0x0, }, c0b1a1: u384 { limb0: 0x19c78df48f4ff31e78de5857, limb1: 0x50f244556f25e2a25a921187, limb2: 0x28fcb26f9c6316b9, limb3: 0x0, }, c0b2a0: u384 { limb0: 0xf77383c13458a748e9bb17bc, limb1: 0x71545a137a1d50068d723104, limb2: 0x215ddba6dd84f39e, limb3: 0x0, }, c0b2a1: u384 { limb0: 0xce164dba0ff18e0242af9fc3, limb1: 0xea7e9d498c778ea6eb2083e6, limb2: 0x5f82a8f03983ca8, limb3: 0x0, }, c1b0a0: u384 { limb0: 0x66194cb1d71037d1b83e90ec, limb1: 0xc8f8e3d0d3290a4cb5d32b16, limb2: 0x28045af9ab0c1681, limb3: 0x0, }, c1b0a1: u384 { limb0: 0x7e5b1e7f9ca5499d004ae545, limb1: 0x55485822de1b372ad3fbf47a, limb2: 0x2ebce25e3e70f16a, limb3: 0x0, }, c1b1a0: u384 { limb0: 0xded733e8b421eaeb534097ca, limb1: 0xeac1c14f30e9c5cc101fbccc, limb2: 0xe30658b9148624f, limb3: 0x0, }, c1b1a1: u384 { limb0: 0xf7b0b7d2cda8056c3d15eef7, limb1: 0x8b0163c1cd9d2b7d247a8333, limb2: 0x5d67b7072ae2244, limb3: 0x0, }, c1b2a0: u384 { limb0: 0x51ef1922fe43c49e149818d1, limb1: 0xff7b118e820865d6e005b860, limb2: 0x1f507980eece328b, limb3: 0x0, }, c1b2a1: u384 { limb0: 0x8d1fd9b74d2b9deb1beb3711, limb1: 0x1ff39849b4e1357d4a84eb03, limb2: 0x154bc8ce8c25166a, limb3: 0x0, }, }; let res = final_exp_bn254_tower(input); assert_eq!( res, E12T { c0b0a0: u384 { limb0: 0xdbc3eb4cffd298b3fa7d5a31, limb1: 0x9c46ca08e6740e40f6588c03, limb2: 0x1e656501517e97b6, limb3: 0x0, }, c0b0a1: u384 { limb0: 0x5c5f9021ddc05b4e8e458180, limb1: 0xfc9ac0db94ad84f883101197, limb2: 0x10d35fc577ab954a, limb3: 0x0, }, c0b1a0: u384 { limb0: 0x8338823c5e5ac5cd9c54b10c, limb1: 0x1749d62236197afa5b52b1b2, limb2: 0xc2fb8c574d4a2aa, limb3: 0x0, }, c0b1a1: u384 { limb0: 0x3fed1e7b4d562acb92ab1a7c, limb1: 0x215c21048e64e6366563b7bd, limb2: 0x56befad9198c47f, limb3: 0x0, }, c0b2a0: u384 { limb0: 0x2e357f74fb161fde82246aaf, limb1: 0x30461114e53b7faeeabde969, limb2: 0x160bd4f153a876cc, limb3: 0x0, }, c0b2a1: u384 { limb0: 0x9953d9fc7152b696a117f008, limb1: 0x3260659f2890ee7e7fef447, limb2: 0x2c09cd97bcdf915f, limb3: 0x0, }, c1b0a0: u384 { limb0: 0x68db7596dac15cee7f675e5b, limb1: 0xd64fc7fa279a306f05a4f7bb, limb2: 0x1badb5f4113cf175, limb3: 0x0, }, c1b0a1: u384 { limb0: 0xd43446d44724e68a5d3e0ce0, limb1: 0x1ad7eb734406471bac65ff96, limb2: 0x15027bc7d1c7191b, limb3: 0x0, }, c1b1a0: u384 { limb0: 0x75668ecaf7e92d7d38d72226, limb1: 0x2f055eefa07fed95961aa90e, limb2: 0x231ea84923202c33, limb3: 0x0, }, c1b1a1: u384 { limb0: 0x5d2ac3131b5214c54a04b4ca, limb1: 0x5a879571728f9d6a335a11b6, limb2: 0x1a88b1de9b27f1fe, limb3: 0x0, }, c1b2a0: u384 { limb0: 0x1c3137fb1e4efedec89693d5, limb1: 0x90787e810e0d14fcd37605c5, limb2: 0x27a6e50c674c3d45, limb3: 0x0, }, c1b2a1: u384 { limb0: 0x36b1cc116e2ac5e8f8918e00, limb1: 0xcb7e94a03ed3261502d9cf46, limb2: 0xbec9af879f51f8, limb3: 0x0, }, }, ); } #[test] fn test_tower_final_exp_BLS12_381() { let input = E12T { c0b0a0: u384 { limb0: 0x4da5e709d4713d60c8a70639, limb1: 0x5ba91faf7a024204f7c1bd87, limb2: 0xe87a1613e443df789558867f, limb3: 0x474ee238133287637ebdcd9, }, c0b0a1: u384 { limb0: 0xc17c627923c6612f48268673, limb1: 0xcca5a5a19e4d6e3c1846d424, limb2: 0xe8e5216afcbd04c340212ef7, limb3: 0x1690c564fb97d43588561712, }, c0b1a0: u384 { limb0: 0xe6f4590b9a164106cf6a659e, limb1: 0x19488dec4f65d4d9259f4329, limb2: 0xe61a441c12e0c8b2bad640fb, limb3: 0xa90f9c3af19922ad9b8a714, }, c0b1a1: u384 { limb0: 0x19c78df48f4ff31e78de5857, limb1: 0x50f244556f25e2a25a921187, limb2: 0xe9bb17bca3f2c9bf9c6316b9, limb3: 0x11ae4620f77383c13458a748, }, c0b2a0: u384 { limb0: 0xdd84f39e71545a137a1d5006, limb1: 0xff18e0242af9fc385776e9a, limb2: 0x8c778ea6eb2083e6ce164dba, limb3: 0x2fc154703983ca8ea7e9d49, }, c0b2a1: u384 { limb0: 0x3e70f16a55485822de1b372a, limb1: 0xb421eaeb534097cabaf3897a, limb2: 0x30e9c5cc101fbcccded733e8, limb3: 0x71832c59148624feac1c14f, }, c1b0a0: u384 { limb0: 0xeece328bff7b118e820865d6, limb1: 0x4d2b9deb1beb37117d41e602, limb2: 0xb4e1357d4a84eb038d1fd9b7, limb3: 0xaa5e4678c25166a1ff39849, }, c1b0a1: u384 { limb0: 0x8a5006c1ec188efbd080e66e, limb1: 0xcca74147f6be1f723405095c, limb2: 0x966e12778c1745a79a6a5f92, limb3: 0x2eea66d71eacd0549a3e80e, }, c1b1a0: u384 { limb0: 0x6288e1a5cc45782198a6416d, limb1: 0x3dfabc08935ddd725129fb7c, limb2: 0x307bf3262f1205544a5308cc, limb3: 0x10e1c2b2fcd81b5d24bace4, }, c1b1a1: u384 { limb0: 0xa81ad477fb3675b89cdeb3e6, limb1: 0x11af923d79fdef7c42930b33, limb2: 0xc1f254b8adc0da7a16febaa0, limb3: 0x4c91dc7e07405eb215663ab, }, c1b2a0: u384 { limb0: 0x151665705b7c709acb175a5a, limb1: 0x1d878f9f9cdf5a865306f3f5, limb2: 0xa1515607964a870c7c879b74, limb3: 0x6179561d857010255d44936, }, c1b2a1: u384 { limb0: 0xbb42e0b20426465e3e37952d, limb1: 0xb490b6081dfc83524562be7f, limb2: 0xcb69ca385f3f563838701a14, limb3: 0xda2ddc3552116dd2ba4b180, }, }; let res = final_exp_bls12_381_tower(input); assert_eq!( res, E12T { c0b0a0: u384 { limb0: 0xc47661ee2c6ec195b6465492, limb1: 0x6923c966026d1a5202d2547f, limb2: 0x3ca333e30f3750a593c5dd62, limb3: 0x16211c8f3af6c885d6e7aae7, }, c0b0a1: u384 { limb0: 0x18ef376237b7b85323d0d503, limb1: 0x6e98bbb5ebf752814d657668, limb2: 0xf72474b60f257f5566c184d6, limb3: 0x6298b60c51ccfdaa550d764, }, c0b1a0: u384 { limb0: 0x348c2c399e7bd6de56256576, limb1: 0xf4a77fefb18543958b97e185, limb2: 0x5d0aab75be4368260e7d2ed9, limb3: 0x158469853e297d165ee80a77, }, c0b1a1: u384 { limb0: 0x72f3c5aec1469c18e1fdbce1, limb1: 0x51ddbb4388643f1a6efaf631, limb2: 0x34f1e1e014398ac114bd5c0, limb3: 0x10e831545a67da3f9fdf361a, }, c0b2a0: u384 { limb0: 0xf0e118cc2ee8a943979abc0c, limb1: 0x6e7b8556c21ea7bb63547b6d, limb2: 0x4479c64648fd5135f004569a, limb3: 0x9c3267b433303abded9ab0, }, c0b2a1: u384 { limb0: 0xe5fa5528617a7773128a3a1f, limb1: 0x6be496fac02353edcae1c79e, limb2: 0x4f9bbd2d6d5199cbf179da1f, limb3: 0x17f02c9ce45af7421efccde, }, c1b0a0: u384 { limb0: 0xd2192367be40c767eecd94f0, limb1: 0x5a094323a3c2b121fc6db025, limb2: 0xe70f56b994092e1f7d106f54, limb3: 0x12ac5958b941614ac10d5ff6, }, c1b0a1: u384 { limb0: 0x96dcae9f5d11d83ff8ee58e0, limb1: 0x1539f36298c543196ff7521, limb2: 0xf4f41990abca0c681a3221f6, limb3: 0x11aa8e62757ec2cbf6c16ffc, }, c1b1a0: u384 { limb0: 0xffb243b8fb10435f6ea824db, limb1: 0x1bda384d4058fd317cf9270f, limb2: 0x3f176c05329fa1b37897428a, limb3: 0x9ffc940d1185cb35015aa48, }, c1b1a1: u384 { limb0: 0x74d71b12604949416f2e7fad, limb1: 0x84b612cd1cafbc9b8af3e707, limb2: 0xe4855dd3d16e5ae18223225e, limb3: 0x801946300201b84e305ee6, }, c1b2a0: u384 { limb0: 0xbb3b943ceffbff6187a09c3a, limb1: 0x8c71050ce550d5e89695deb2, limb2: 0x2fd70aa73c133a3e0e483ef2, limb3: 0x7f835c51a9434870d20cedf, }, c1b2a1: u384 { limb0: 0xcb5beb0bdcff8c233260205d, limb1: 0x987fe621d66e1a6dca01005b, limb2: 0xf19f8ff647ec05851ed472a9, limb3: 0x9f783e3dcba8af017c07469, }, }, ); } ================================================ FILE: src/src/tests/calldata_tests.cairo ================================================ use crate::utils::calldata::deserialize_full_proof_with_hints_bls12_381; #[test] fn test_deserialize_full_proof_with_hints_bls12_381() { // garaga calldata --system groth16 --proof // hydra/garaga/starknet/groth16_contract_generator/examples/proof_bls.json --vk // hydra/garaga/starknet/groth16_contract_generator/examples/vk_bls.json --format array let mut serialized = array![ 77971247423532365748231213480, 68566630218281092565267874044, 69218241659544231899447836734, 5210713370446757553310648104, 29975532048713345346728513874, 60131236376572367113577691315, 66829595643973230840624156168, 851093425154653346347584866, 36988298159079040949455438986, 57841331206497126486942833902, 78394969930433492883730279315, 5168616600757658063044848131, 71996036696940156226136278626, 39908840363606579425569960997, 37427347626246260567577938253, 7711402467582346430323174384, 61866231490764965852336666920, 1485446282956182122235189114, 24505774892507781812596026670, 166936301920675049843325984, 14142961460712467494187312601, 59336570766763966042896958993, 33125257106653746636063844303, 6336617002331687822928929267, 76208108071419754504567488535, 67522218240854508687713598507, 60778260558056083193758028786, 6994315738203844514307689821, 39109476850504384255101416373, 4563203902324250838004362280, 74008827421754500938243422144, 4588649057457317000305384776, 1, 162188267535021012914933874695527094689, 74351682113781394910510902205804837421, 32194719649307445341132812807, 7279752730359835541367473802, 47710710288577935245284447693, 1419950009495443211853955399, 3647836096884217263029835403, 56321839293630983331949256555, 48457408484169336698114154298, 4033250274037303739812601995, 37791419294239366654696089744, 70998552777774589024396988311, 39915671134059625140321314026, 3809343904542700736033250473, 33829996627126998929524224821, 61676065104950018712089150876, 68439794587965551511766573689, 2865007045925431983911439426, 27112224452789409282270111183, 66906936443170431587936776481, 29509391152443426525913329789, 2942044231372461502017727018, 31524594061511080573222581436, 14986353866705479312904394863, 71972723636501966110222074452, 5344092690743570953559106774, 4765507480019605351198077835, 14908496520367678240933103306, 24908591596218651556279785125, 3944092145422224742714103693, 8429801903301466479642247085, 16057780532905072011846247931, 17399093308238050206590708045, 5139994617788050452861167220, 73754063866928330632151581570, 73714290802177719414194343911, 22445364163983035216803177788, 6366889707934883191084004393, 3491039030479184294747549822, 51732121100147969073250799890, 27386944946323904500348273181, 4385913456436807188041388171, 63406929780934892902085432865, 13024244925354710667504340948, 9818759060015048768231121209, 3940387827675730450538662159, 9498746512908964047922834279, 53170642112366515401625025220, 54395118314665947463893798725, 1288128069358204676876048440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43248345015923410511418527918, 2339359598397411241327981188, 73890304341590518017447068133, 6484088522357121612563628351, 0, 0, 0, 0, 35, 30027838756051553592474048858, 54101158246873281893268851782, 16252313257754462986798756494, 6730039006201148461101016722, 59166942355452517793514621311, 29611964699459785437591579035, 8519817219883889074793807703, 5634861121456970087752773730, 31628006324283734577903836259, 10539101379075759086036605267, 14510051136041346261035086002, 1788279434461014558870064366, 50538859019818205318127166575, 24101814558253546467372316153, 36861647121021098091587437350, 2109509723737426726090214104, 50995296157422730826447535567, 34115639409343349990007173687, 39889791167462707668956600355, 7139454304258571058057145968, 5677486451271889915150751900, 49381072058996141057339648450, 45236818714965917096073435257, 5410014512167636985502543724, 52851369230184844446011095835, 26956742559940204615504752861, 10586594386753721807366226964, 5285237918858329369750056736, 72491064846101162851502169694, 16357430162813483087252302988, 2776322324062868736865069294, 7691450961040902460162854352, 28070630466005464928724117413, 64187001067926917335528887714, 46788419336828522044462049855, 4382033612830061984319085754, 8034583862966778503247220961, 56096742313325232975868774585, 68585550580565240665212971182, 4476353455202817151691083445, 310085044230562831031036615, 60617887746516426241306123887, 37826463078236280791329443240, 1011833944445122731301232013, 9746904122117636655601728898, 27966741000383526869167288219, 21209996526299107239973360442, 3103923575483653836603642308, 72934753446937741447647845012, 47190295587938652246440505693, 63247625434314253446260470906, 4162213667224368104349214158, 44116566986492106261260643145, 36663164458555541551023132397, 21443211471927538917929059805, 29364840375223351024347720, 69133722904601054637541361174, 5824483258086841476910730082, 68503634142372854073292211203, 1937841124855622741132428093, 16342922410047931143944537196, 65970020997323617011530981603, 35057865146334572145945070096, 3451750236012488220190472699, 4311306230156727887087261132, 8695412623966263837937733798, 77176357502616542704656042128, 6101454099849957954515297657, 26622917829487454213461225101, 58605703673705566057178169233, 33113413176132064837543231640, 995773979584154924305479998, 31053677400349199753754451188, 40713559952895299870148850462, 62418803868553690327027026698, 93382446560968940373702036, 37712776509346478393543844243, 49864030905083736886253329472, 50632088155738237480407451318, 4206148787912257087329709277, 63375650005341941504168657969, 29297861299097956601364333997, 33763825508232552291739922496, 1985797962564307174288266194, 66696036047918564881956507309, 77167968750690188742636584677, 65054228210931679861446554657, 285937451162313357308376487, 73651724253810292011419259430, 70485925834587700255097149228, 77910644048681279676827387407, 5794027271286644917142723998, 14033893853278077343078387793, 33280173313783426060203760416, 48372060495225247258877841260, 3603717336592238868900693842, 35456068715660483094487770530, 16554550064157054487441106354, 14326732948379501626951591875, 3698282433453704050453631894, 19146564924553830738333216240, 25020931864070774283275229299, 22211845828645492626018913178, 5083210263577039175223654275, 41952074144039335942222955181, 55663683689078188645088175554, 60496493342305037524741110278, 4304619539671921717172032133, 50858649693567842098042385967, 52165707910425217246618470427, 41339315330087377357294597117, 6539089028599035740094380703, 72053127906157009580161741600, 22157559310014076427322619430, 70125657965596091683801708562, 3022877841189616397537213489, 6934534485162623435238541802, 47165543872991109029877011528, 2566259322647998968241017753, 7067362300862537521110073710, 35413603792063749196537285749, 11933166219420367971739694184, 40765194826541066033934446797, 7129410806727453756625011822, 29662307088543837149206305134, 65727977531111266904340756978, 42496286358276282218467101201, 7747883663466642582384665508, 17669369957595764186984839002, 40677642819188609359029355170, 59164559721383814161088328323, 6448449646684808231497776519, 25619368862892179391009855646, 26381527199732177089152363916, 14850373154740658284833360333, 1076564188815688551187118834, 32887175812143566285910166960, 13249683844989241745607228921, 36456117534193488400480016588, 170141990863262138143052988, 61760824788503155462102203539, 67320570476006959596849012803, 7766127653453634897585163528, 5812689405665018357313789116, 28344794854282756958093754, 5269947778693928801263573956, 53963701928114333840090271243, 4234461668157274586969416989, 20644958011919486212644357036, 26027812993954453814277748447, 275941194480212844069522943, 3538313684263000688182076336, 32801747500662710107225666753, 72682974215035517456530493687, 11581356430328319373161672017, 4533402135467029581720881425, 44058220463589537079385810011, 9333160639543932900599272247, 34172223003063687035350629785, 4794543240810738112240156944, 66965669599092548335505382683, 7238580231678608477454713965, 594337166918393597453047263, 573384765934888290368105125, 5298611690427555842434593544, 72410071650016602831108419020, 62739255899796079018370306360, 7849113008352889379633423443, 25258471464787299307135994029, 55762491168129233861203453862, 34626239502635003182102731944, 4480270938899930929063085116, 38884223664535909069137747383, 60280836569594947747629168214, 32856950205705764745608993213, 2392129868089939474880361662, 37838992250108998686527194786, 37288434055699776877846613558, 7949422721057160329636737842, 8036696326455776379012768983, 827077001344265445859285175, 13012960033941055488017688611, 25173972490487079546640335690, 1925414097850431151291670446, 58595610619929099032787293815, 59496529594755496148283316365, 13875217823643943649398141619, 7372094443240058558285115189, 15308212201423385157221091191, 32595930911053677946031331419, 61379406643649190572985248884, 2996375498768731539234628958, 46936883038348260351614004847, 75148696570210889440602146167, 25106178939001538254192127116, 7167710891023322575832224224, 100723146502372083165311896, 55751937316279468177742802836, 13871905808263810908577369544, 3737876825512892199597660458, 63816212289840684036461122375, 17733810278901303208048721488, 3351835079747659573922533568, 3046359189407291089286136161, 13044104993142686637496395172, 9282845231912569956252516712, 5761562488028695340583952910, 5921232933352375862448457265, 21518340125394465148399554843, 5982470152449697525125353289, 57053181264227943937678085503, 6292711021140480762840428167, 20076579190065982979764971926, 53780374660066758165656920782, 36805613003594702952829511499, 6547759856425411111890981980, 47512071241281773216035110875, 56022529648726063889428729621, 30858618567768404792580768416, 5757919197631638054742627364, 15669019961284650462106553953, 66639617563672338978768140574, 8082266105417603982291825844, 4564626181978619405084267045, 26009201212564438460739797336, 64572665731556470248113629014, 59252263505414064169597193741, 7883562242748919475083180284, 56470253812221414253305276776, 4498045693294739345032368018, 8301015289726367266397191053, 5348409005514905968887450762, 51387389277124520529090934476, 56941222593669910106396786388, 42622730933944117660047364473, 173196935167601629026012489, 41345835421790350935003416835, 21667287315177218504729214260, 22489091250914396077676341317, 2742300185381864076197017486, 47167411505437997622504473369, 38171590942991972995898002181, 45230515905390045720039559055, 6190428625729966894895772964, 22421896522252105799597726706, 22767691098362212992825587837, 8272539897093289253906939946, 6624376755118367265034331918, 15661111081153176052555263530, 76520770728514633564622590654, 7514263970502628885483842834, 4161399108172689732299496968, 60499668660768151028227772386, 47180509148512048563055856732, 54947867068696841243448279979, 3892308014696337859766042527, 52579604138530131332831897276, 23848195015190911842220533856, 23144083113629883183090117996, 8039822788758490597926641553, 29984552573156797877940033032, 66562098176719407889244652079, 49437533671009460826493634846, 1156205892955632813090181532, 50340753975243539886466578963, 71600268508272898437620580476, 7749173236713132109818996799, 937217378878921200898898681, 61530787830163118334408183838, 46718403155930865835143965039, 3360479066512207989279511115, 1242095274119975861215890980, 25631398301122740779039338607, 8684240449838525915272645580, 56524280049856107750242803162, 447558878172142624222306080, 36697831213375122858015827821, 31628650890081021735794393291, 10505167761437020089256195553, 7979550648404801060728402084, 15222854946553811809213857382, 362368517711213651621254492, 74279206026608922070481420749, 3092794960790330037616934773, 71047308711017187045446833286, 48750249070047357381136640563, 7790155946834425688504778499, 3708264891132854036323403697, 56842018338849698060111848357, 50802117932022113483041384324, 37336874720048034806794350614, 4895588030745850609058601494, 15115777534288762562360003423, 57880827992436710768134894883, 78908802965706590657916340447, 1290804119042034420664915621, 75590233536273098476854528382, 77636907662155293244169600949, 33351005534815941322095884730, 1170478044630016756590912765, 10509912641747086730664610520, 22133964085404487253238919615, 20911161981958331544968806625, 6637212360591556329346544666, 73177486431845160137729883466, 44026662558935744568710650580, 14495791361037296145418236591, 5295181413216706710953951660, 68037346221445832564644846512, 60300435330735533486581728723, 33625526396640207342361775872, 7045784054069475782743166166, 59924021955096443019291797424, 11245715857680265690633355746, 62074117146746076415496043143, 6449638004223019640871772699, 23831108704622803002148189075, 55258494757818576261759340480, 43878401466933980305871450343, 51011497341785935180716406, 30236711454569494355448163050, 58281189425116526815714389572, 2650824469217319436473037935, 6177711757602291324489909454, 42321857842994798624832326055, 75062592133961958274086094500, 42630972474476375312971690647, 7822879903927915344780500810, 15270877324564499082516257218, 28304670718246938558626287080, 15177089762194746266155761435, 4323287471190366948611609135, 63529578509746165721467979416, 18684091350467491952671501580, 31801058421355694835986212594, 6167034365774045482528400881, 68187492780300056455073976993, 33736798874529518945031665359, 47114121371788285997810630643, 1501014936570666792373955430, 52041900751405202855029540034, 53399799398114617616917177467, 60599973595634520941119986919, 2471509822842938738154871328, 32930906669861914550471992850, 62459907696276343575769050930, 20973769229046719271897096677, 2216765118571989035021197653, 2444469515114379190117267117, 1593615121718257466706426841, 35200699556016095687892135576, 2025123411791789833882395552, 16837608098747876337971505429, 9017071291289141045978976272, 40652821268431873022960365718, 5957992888410817226660287072, 37300311417672933426256048528, 75917638299572906377644069694, 70536739359881221754063443648, 7340858359327208778779981552, 11093409205821450748648408933, 38585830861482896222093530158, 54170792296898185502622272969, 1346877905588929391750158895, 30696269915566471195120909262, 55530173509916245012994256678, 51697488410632794923205428700, 4385361327700098888857863882, 7478442493004130455880814380, 57470192341053200803877254389, 44233141764886973843416787445, 4627148621413194083359758027, 32470416808412418616335658410, 19715789860892330796109358945, 58600670889565152340643330729, 38164712154690634450460350, 9572753909158173136633883269, 59397895876836589909855646747, 49485505921090242276800948287, 1433743816046259638551369964, 22208809910595598502283304313, 26810099712011058097080267500, 56535210505227237217071136136, 5738256825149767963650869515, 37942602700947594161825950483, 2527860273039176414025701008, 34598424551400376889619841691, 2004299399674635239141912098, 57179841527777873233441150606, 62878085519407360815563731468, 59345469106849910581475320465, 3395334403266530602449977877, 10117251411206732658303264377, 22810493895674076366896510863, 54938126211464289763762282544, 6209015132996004403752243947, 6896155642293351607797683255, 63108443924953726899515307288, 29636751124222599189321690910, 5007235456804803077885075293, 58576233410791600617515833462, 12383688749840845605088023298, 21582798689876911995275140027, 421900104999151544997246484, 23926685495743689049607347005, 19188298000098357089737886993, 40453937398777810582476803280, 2643002570339911223448370193, 6902218623068530992109134156, 79110408071587025128757944463, 66007647577498342186247690738, 4928186256994335695446980557, 1053586193107435120194577293, 4321786709468376691869005657, 41118220338438369959484838696, 5451899238899767192385697375, 77707861581359676195259042580, 66874846464796293707670342079, 55015576382136489126629428626, 7465186542558750462337564016, 43919127541821056535296486231, 51086119772406614856178635862, 57614227244027104278058575056, 2701005355288941622474441680, 35659563140779643976746402067, 19225613912579408702412355208, 74769032093715755415961920118, 7367796381570513984292315602, 12332512853959473145696010197, 32862843041063193438202837637, 32555926040716524681024536859, 4543167046852320892161923933, 21570270237029720084908450527, 61319428376232904425905363976, 7188337897207955025248863773, 7353644398306746046201284117, 19147961767837133928532157144, 58632057793931142519448749925, 13151077578807166196696979291, 749628129226871373746552107, 47889370124980937447965596511, 36889787006777689854972369946, 12825736468238633184048375989, 4025224920561400495701050576, 61695831237722750750456526799, 14096012890956808627406409983, 54924240087595531592120419468, 1668015521666605703539863330, 63001231767956487367787152697, 36993905627445116468569302991, 70244001995775991219395482875, 3888677350578961294104557513, 27560913159461371436648821802, 57968214974510965961588009478, 68172750856178926541876979990, 6551603694095947465932822646, 60069425225524883161646020002, 30620811870008527524810233198, 22104282873713410129525303520, 6211829194275426404783328990, 47203612852457379943172159874, 78660393474497217621015559462, 23163234729202121451962096141, 3990413213471548193142233260, 14176896513277304339137699299, 43350905519129868463569945158, 32258473390503962845656421956, 4495515813044869824572796314, 50117859028814034199322760851, 4893566796594666124620650351, 36003246299541333366137064141, 2506340157917168943012639450, 40087125654745598011122668381, 72521426115674872416423668925, 53228566160901782773515914351, 6020868016867097223859386519, 11552146036223575832468601002, 62863555513398212891795545788, 49550261182503599966672535214, 441032065833442510814515264, 35700882222579625253103742918, 63259542829611034377084589542, 51222555645417832181260315547, 6208705469225124585110106374, 59347925002096645277625969819, 16099347358444960246399607247, 70121080253549453764522067970, 288509819528328823274714509, 28524683391338205570308547828, 6060914935282736155897510887, 65152016006116685450027022554, 4507592977334063580246146598, 64742588416344634786668165237, 37139047174998085844464007572, 75703358133982836983872846642, 2230901962785229393726300242, 16744409644381213700851045873, 55243968790310431950325242914, 66442797228837637650356905704, 932667172795866966417288118, 50048277616620645571940332464, 53207414961018849164875552601, 3734931238461097519386140759, 7850435637117549087955310166, 64538713991666482472565636572, 10185924500183202381214610142, 69596760191143493193649165071, 4464680104681501105481338855, 55228529312861734136732576499, 27867546798013737089683952227, 4148010261128211463338577713, 2078307967726869314004844840, 79033943338501838103926770529, 40907135521898580705325753790, 9526153234645939642619248228, 4052103842956369094946306493, 12480895153317466350436373002, 69883535836489094909415221138, 20987741728014481056464712963, 7129208000896903230012860206, 51208100182633173749631257292, 69176395624520824636740892815, 23479696282877929541658510975, 5283369300217105948869216085, 39419137741684870720661954463, 26198135770033597809184771139, 49301114166813678200369197380, 106767274894989460509358523, 61423000119926091049301807944, 3835701576275847581883728851, 62226893743200573589730519218, 3295694451341911469313936720, 37299871618170554548336444774, 58860076621284075843482753282, 41403697964044073021372728017, 739694273004429771580734356, 68567383455466550415424616503, 49726978207887644321659271274, 24169072215317942206944032330, 6144262048701641316092031599, 65979274232291901343705200595, 24053477315330997264623564221, 911053262565199814055775789, 5056376156992768528182474481, 32429423372909103399033668781, 20666944500770492575578752712, 55233615917788141387479418067, 6363163953313799557857270977, 36794541303589632153444858749, 43551694206121333946110534740, 44438555154363875159348259941, 7014883505703533420762221000, 7895319651597099005928734072, 76314170344906857245909474720, 49212582158600760960955464823, 4166561417178306508156125727, 34523631725264394594468331877, 12358440483671435961034629222, 49188011806891398603938073241, 2669959877213742953869840437, 52121931910412164258933444406, 19387280907093010244009431383, 3060661826370758197353498470, 7729298768743175493638432549, 52375200752330531126508359923, 7814239644658421996715334952, 13486826543358352031938246186, 1180206440622175292296681267, 47423328109294781705109400879, 37224688650990800439077870683, 50619844949847788182762742359, 234289386690392372496677064, 24822516268969423068144007068, 8676192756242455340896830974, 44424023484854292639160109139, 7520330869784748969251204995, 47027447109887956820397546558, 47952287250142395075074942791, 34702269642031399472961001348, 5272406340445671781254194380, 49002653750812487058194412402, 14189515943337095285455036035, 15594777859833512486122714453, 4575119918859572755328730785, 70667572542077992135744783734, 47931518937596671324910133738, 75149930960996312243986767410, 4931930589940708239429688709, 53888909917495276371051957910, 30254689805192687147224026623, 79124675839132139896587428915, 4665399039207455897522809723, 43969933827139894792391296397, 60721893884063623951088192623, 6832998928656789868139147596, 6341057381954365290740221107, 47547615846688881888539789063, 1597187503631053906407013570, 70529817558016860194132642626, 6281591102804816031003827628, 46804588257362599456845071391, 52180742308509094407719667301, 56157018841917044449401244421, 713805028033245250444279290, 63074414654665066431610736961, 70924954912677026606046086559, 18423433620356294627502817162, 3783333642658038195670859551, 34726647287110953644809676969, 53048029159587756480581917663, 49371483198087063361754908426, 3958493133881163148019374449, 73328974511424071664732962987, 79103331378031831535358812141, 44572501644392743585306892940, 6912995223036113470006096191, 72397913909313782932697216309, 36279637543965033892539960129, 54260721244570527763003141688, 1130505984659580498899897208, 48948441671997059202292767851, 78687020857518535838917734328, 21864902280038004944569043520, 3894008781385305260431476365, 26693949420975006721912234580, 33931157160750599146579788986, 73359293612452277074768179246, 4771051306902223733466117725, 31478408421776983581628051684, 73704779061508240798972114057, 18406339402953850435063690278, 4456541726440093425186251167, 24131850833636716475252975233, 58023647367857143964938957441, 36531175382223289401918027597, 4835347104138798746431561378, 34194263264879300706435841779, 25341196325130118124477100100, 63632880766207887878317934541, 1591280285792601412830392604, 35174264770386591892159063428, 15210719376018373635969713829, 63933591383979047010344476762, 1235651865271418123193105285, 66664090145363350527777166434, 33510588946402501353800056849, 51508945042542768848752634445, 11349950186235885035022820, 54441240230402789568837481356, 51617467771851481179299043535, 39698160865638708812321934696, 4115003290562156738589165653, 55662313630126984341604954539, 54568433470890282748101437846, 60047785989276458363201201048, 1871332627579000945430151212, 25008978972475971289584474872, 7957090116906922265001984660, 48257251238146685995098375475, 5682571893777405885524814301, 5319979159019651815194755387, 64938643244502276086071585724, 71443718379545620736644552789, 6343972408146499239294447762, 44411603833315453496988438312, 24629381206761819292516363598, 9960944947777546706873517798, 7289609385162930776977215615, 13236771400819019552681449350, 57128158527259609438490215362, 23566648289377613863977797460, 4655391629280433138709429400, 70421375518334181678525848488, 65565261894064879462176556473, 8875152260481080948394065172, 4002427658026702485758422672, 24129332213805361046093978475, 14694630628094025063749956951, 51786484659045963934936587896, 5956326526644152241760205494, 41339185168416912111961074032, 41473902249179974856489041372, 66705118553934319551354363130, 3840100462943874650020434382, 68151104952954154215194420867, 31803432075277113069022985827, 73262440130576443803446560946, 3750539396653714253142175583, 12062204684148180906586973409, 73748858396045179673262900931, 66855989872540047791771763868, 5344178217780099655971982188, 35902522755189301046992420962, 48196672551884195228232879484, 30200222050731679596081846193, 3380506235499974405983381389, 76760921922026120097486738903, 16177291366459199284695630998, 51286704543747517988670312498, 1614432411867339489603303019, 14764890264814636299333500260, 7267190588477583853813508919, 48335613504689232946911340191, 3719597349373111452826170793, 68287397276414940168756336806, 10735829461158517864885030495, 20088455873539725922369875867, 7247898390543313699644545019, 67593496427376753864339545945, 35779617903847381792215924133, 43185436168149622949150250218, 1536870322602783949810075911, 79089934764359252407750353955, 19100067334677852208179288818, 49147833990627819967395974560, 7133263439373553839195111742, 9034429335242996905074335258, 24110573461381644055888165844, 4351882227802499529071348483, 4187764228518782386110599333, 36940079339823793091314118357, 68002921560262211027627264381, 70937544992863141242010560964, 2004676793665162744447737175, 56735515803963123424806722187, 59991971713887647911858199390, 1765968087522342288445564344, 7626900568205763832886389430, 26157974971955720664455679790, 30906146864529970262285612389, 3505661151637249187556098562, 64589872946195118243935899, 60987943171734305522209246953, 11859781344490962880800321764, 5099739585235902484910184936, 5092726637124800870902367566, 77164491185124746659002908097, 7557394268218098333109909464, 56652593104913857580548712725, 2719260376570248598643524355, 14147405863190491490513178945, 4744616284389165439811047863, 19273106980030716005667704311, 2920367520843411911089479097, 75187879959085740765720067616, 11793479709481719262576646598, 55559010446300459805240298178, 2326396620363262873663106594, 49641849777288750686395777465, 1554148868725290990031772025, 52653719172610587047505091534, 1792003191002954972567101759, 2937066288062868253640724492, 65852858606786721122490841777, 24876120216578310434188392651, 2303776070757838336608115652, 35343710167441654147004198429, 59459890005073091311766479009, 63276783814016177162687693650, 5164066369473238516854645876, 33412244602938822639124389889, 69431925178283750485811767957, 76130502568103946940194797605, 3337891617925438254160570302, 4313930788702638770937674622, 39834804577732353950509563162, 23824100384272717298830268474, 370659842348319131914372421, 33525006046599749009292183549, 50806844257120604264100169703, 64816799202473431890323280253, 6286486899655800745773680447, 14096126968390557034601839748, 76168731695387377210762633792, 31755672355291238818462919729, 1364820500297519390042066220, 50966712027316799958131209303, 72126313200019759301895678823, 69496808351202675952540797659, 2973085798761279807248728399, 51262932594107243029246745517, 4835829402085974455989230573, 18600418370299690609656079430, 6741105510021350381862174668, 5766428207153539920378004487, 66976854393193827999622636893, 1796253414948670083289979436, 5842681502837107188987016298, 78350650073328357310735642816, 7459405170208280109817802536, 42950480827821794979342832131, 6050679913126654393421396200, 26974315874812646778206686765, 74253592459318364639561686993, 32279743267120378905314631765, 880106527360265616785136799, 31892667357610003473218571051, 15742610921929308127369015541, 69050953407284695677579678029, 2622883266983245218352159930, 48519703488668492889415476310, 27667559731546966903921049451, 11665329888055869766529323620, 5608925413750154485366937285, 57069011538281864283512955921, 17288342336006392053729890228, 57224971317160350805206188205, 2089188018400347436468308847, 13273689224995891035972765332, 1599651155376326347479857334, 53213806380442534216627001490, 1008189372127389936438600676, 61432096144179460556968271618, 19790184152939380901235777063, 72357705696325647452435841621, 6536459830846823300435099573, 12919483759578460669331334569, 58472648080731143327580950627, 14553824480595299370095285813, 5979759151317874476373563507, 70809916954375147149762042322, 42622500958994689383239645423, 47083634209957915176104292848, 5127606445581701002485440428, 73009609727466074924442341639, 48307782828952017980724212502, 74062586523989694656680696062, 7777867756662908008835227140, 59557729122833215643938094404, 14370884944994698736014464171, 41206569217598102680974304191, 7021017865995142522345157073, 16429334509466703847476461005, 44647348738623546424071062365, 27327953836183590891851090587, 5360858143403109429073297927, 52463088659549712053637105628, 64674263064987927072158370856, 35166671347577276097942720835, 6848309544546644639843914043, 49831473703460286373445640536, 62031855807478803364852436330, 4051326450395650742179043264, 588822488356827452733672780, 60878309648242227014530048695, 71136675850986940091992403800, 57298939440074352081267507956, 5921152746283898378565158356, 37778716037427177558866556013, 13823977452794933927402817904, 68155252455369147638002518837, 2009211036490542063322965042, 57287385075002031334336523780, 61991846912554166428547665587, 48080729362860486404556189793, 6050909615272918990699900698, 10165199715393992304186292186, 7435165746364075470335326497, 75424923021332657146863810264, 6752406765621654843924334709, 57162530546543572953296078218, 9232802719876436293385137627, 64592359921068921341901497275, 1504710175595182075705794636, 2765088708712613135711798999, 10541648327222443543409395269, 68586881864347362094546768128, 2875959990843272307549726074, 59068795357693294581656186952, 41075683849519086768141207126, 41783069423162958072613493797, 2486644955368670166095829693, 38698064291954889950609566, 617686573589646302680660620, 36806842984856617812209454609, 5772172132882767315611295649, 43122207868533312343983940548, 64192069402451601692678237374, 69007230247565397450126478655, 288598039940475262334552820, 25840502059668293749040851358, 55730475133898741325040860789, 46035247317502560912643932565, 3123627699924025592966355825, 17946599243073859443705940410, 69692434544573612852523159070, 55270919746471220721572455098, 4891601178834625792622708165, 1304326483617123795854833210, 27940211484893373627255333378, 37164847450336166385557401264, 5279878979459530058781504826, 4715333492760935318276663743, 64360039864334907980384705211, 15213098303812791703194631549, 4443205260883079496845534443, 42178254959429471820923153121, 42627034203456845012667580042, 34549859621573647565248790399, 1607013709487986067854467119, 24713920813379585209215171957, 34947869895448348760075958709, 20398085969562276297663739443, 4497496117855686608591627925, 65642396509339063447470252162, 51958322891070320905344176094, 53356092615283470215978282753, 5795507882228606523555569265, 61381117354884250352818429971, 77586652446402999359350174280, 59030550255077879682918655034, 4512003360238204173051505907, 50968433248094052175103851509, 10972699326111792122616474506, 77421284460326005681444712579, 6611553969431502413774360740, 67720852498012315538062755182, 62000067674072868879854789130, 31862408143045511219621588802, 2382988192232504726318747451, 64001503677910105372924827978, 35959375662987282321020312424, 11176499274479087509468535555, 131699368033483410059991331, 77458325587492436336047947691, 63419896531366545899413566583, 55518488706761527554795887207, 3574160575625377832706582801, 69672419758400166702593993562, 51783400285798519303181250795, 7777447636309048250771186755, 6778245906985264530568799420, 23724678757573504248853269557, 53158575210279661893951193458, 49505123838572745940025168110, 6821765416731099475222962225, 70416530680724964762976778585, 11630259774114850854604064698, 70086193137126065257547996498, 1758658780430020399428014867, 42574547673809884975945981445, 63396458136673329222696717930, 13846015426629849896859247333, 3339556394711807629779362334, 31781051552324736936456252664, 45611384025461071988165970339, 8086346118465515446411954439, 7407391238619454801719291274, 57355293852749153854904735328, 17738194997585182774428248794, 42979156704757230879140471483, 1337063892112511176289001438, 1007495712458249500606327031, 65243575552736979906232611852, 51157257685563209540772327447, 1984095853911792538773346076, 55616883595526800439829906729, 12342115663804998085951027805, 75894363678189995911682013518, 4032638648100176424502527217, 26001300838081501293210517652, 78810918472946027279749452032, 3446736312504960345966149188, 618976503544868083511371388, 9060657806461788511848499035, 18113446745121681701656466950, 74709795540999949055038768352, 2611886565404968140827323071, 28104870632436054067144640382, 54687145360229752490360986758, 66827381151878701282619531089, 4406583573717425557085607342, 55043360061446929619112205266, 77668385262136639305873057588, 68012546818512935592739160660, 6599361251263630842895956231, 33832504916706341817478697401, 46291966377288089175587650380, 33980583779770110062591928201, 1990226132008350026562878280, 31574626629582059011363563953, 13635571232742231691640590292, 33158364802795479142189157265, 4828324889455591787564274411, 17535037855892814653994147271, 20058923716022727602161269624, 17965304158922622822371532036, 3437724273501538515813973656, 5220329545171532114453860688, 43149560117134015660036973156, 77768760376940006554501816092, 1560641474828953350618248150, 49772354542680213329364161531, 10186718009711474772536285464, 77238697002232050997683508980, 3768784510358097156808588419, 60313870131660341747914054935, 2737593067669786014995952971, 71114833240771828878461290615, 5582034700355973553501527194, 32428914664109601732106993331, 12644252551235508049763570571, 32235832766126530373362996949, 3579392766767924136122105858, 26436016027875746601335420197, 28400568183586126780487789998, 40069374804302449594302545304, 5942004056200041491247449089, 56677726280248516116610262997, 8083019231537342525176389160, 71108519020278109402233138629, 7640651636624409037446070506, 62625648703470528044106777444, 8573897220413372044668896719, 32424961759343376875946757947, 4035726646661086128176689808, 4581909083445845684417286160, 33492967701254852330376186937, 65840342692211093198609557093, 2817452449465778677742087267, 13114958703162729716128072069, 13669381091054403618604230447, 42580609566336668909554031313, 6774242679859832243781246616, 9895387497564933011984618804, 73733921755884084444627331637, 5719780092358981497498631560, 7958268352957165391035571795, 74139835533605485947854274690, 49928791077337063484670643897, 58099619086346814728372753431, 1146756898805037830387038279, 3054468717560843589634303623, 742973120951618748167502777, 54693244994833183215153363857, 712374248268113212243058944, 21900319248305098099176017563, 34753741121713052921498103470, 62855666892853422266070391693, 3520180218554612705778139279, 20545248296462811957342431994, 1086208826407783581132064164, 63829050164887523802980679793, 2239699351573858731612767881, 10510884088677399352465376223, 65872785479848895113212254890, 74530510286524659923214657527, 165591837595344844721608765, 67445823819940957958131292292, 9067613173788365667376354239, 39898309519633019184442266614, 7197562398390026648320130226, 22401388610763922844725963254, 71848841418173962748110876738, 20853769040755743534931528220, 1729462624269424252463262417, 10690116855626646489042826241, 28851766118161729849414225451, 50093965520599608378564849787, 4937509564575665846919809456, 14893059938262461155602639929, 54649418109339915539580493866, 49602276349062797137475581365, 3303129251476821872384850312, 4605736969133232196516935300, 12649665587015950479974977497, 66993153972993440233736465915, 2332813691977292035128943549, 50059248894297640017291628371, 73926617083839669459021812147, 73707011449207209203240087017, 3943080403221213575829690506, 58583926686623467347050519359, 2745950976692498690655108754, 68628017127050096876626577307, 2038311385646063504641442085, 77281303315719493661004238461, 71014079461583021844718656776, 36985645918473975347261232173, 5601753096628627807241601239, 34335204382936982122815650234, 44655378179225359287281948510, 46110517666645847212965162251, 3776140837617677150853994117, 21459856318267971300627885381, 31745109944971358940424143555, 24660534133536600858508517795, 4601943352971946800491761870, 16015718385828647436684121781, 46862312578221842081948535383, 56820596435483345269258247196, 38780825164957739803764182, 66630132986715194984012994311, 35542885872096341633520608925, 32494981052434762207930529379, 3909915731319864608805721624, 41144760195043080522562471177, 77443500903802878169210491197, 20290899958132242160159859577, 5400131778565579215618654350, 51030893304994402097060654017, 30003756502955825266116641188, 36638046942398940070832719265, 6838758091455912386063709233, 20446507430349648310920066026, 55099055067317898375636952109, 47287287690799511385922507535, 6440581987154883286897660150, 56544227315405679784505551888, 68521080039099228123811716217, 11883625069340275270211624345, 529414625845451057546960825, 43768868073121938847187752134, 70823817269398922154026515307, 54773748440281546854025286869, 263440217610563024379414639, 419315345844854050309579563, 52767063291503661900485153895, 75095310528229039511405007783, 5470510498301762510085114502, 43419626036644518021751079298, 48825108719944268854360740942, 11937139940217452636117172545, 922423178666560794182430461, 32231858607265970628638643905, 78817736055747559269229886371, 27308872962103991636206567217, 4228237623032271891603635127, 45154499047018327863026707233, 40797821102671142764554345672, 61695559890360431477191112817, 813077244531636479855087784, 71409658479442892951253950920, 35073610158058113023788752287, 23634250214170899770433381421, 6453163343594193687194125001, 44067460666702446403354124, 52720120567775761149591550937, 25600044481140266836769985935, 6478021601028584188834558030, 38083351210275630438054776030, 46610101620577710353191668064, 53889567793435001656750700637, 5389122893158458685707275512, 72450273097109485147088821330, 17232366887626586741177523789, 24140511581167074692941817402, 1145954671193807618352049555, 6392432165864826946735921221, 33388533391088073407784470271, 7222036367563667407682996626, 5298205191728933693443000385, 22609933760619970882647592018, 52503192645522673943821415021, 74247656491318970322256050692, 975988721683014372187781097, 62910543686645521696183470812, 61413168785921710629967294890, 55975782389961742805061380902, 2512465647614165105457685749, 39720863631497607290777189, 16609069296328749855938649541, 57120516272208300619127292405, 1963988715833336718657873514, 66348849301178717125882845547, 26061896183681054227612716301, 78360141719980111344704357251, 4293620864042213931833654443, 57403478491873699486529608580, 22405583288136848069452783675, 20530983627314307746554051912, 3291690265651152478876469729, 69607428639324492139189237317, 9918118695602444656242012183, 74112687948635895678350022925, 3730597912600903812564137994, 27649167265638358253014429498, 5358378731585711301910973895, 4108581923008231311889563138, 3428881697086601295210380662, 19649734304252372209581107481, 25057980709573227316821743228, 23296603295330099662809446347, 3295663710121858317492776138, 56653272914040430762541686724, 45204438723072110463053947499, 1967481027022321570327781064, 7164760637202241270987955081, 36172708366960597143934768288, 77585639880796437262658498458, 46243261497119834011959179393, 1643679813635229031218617215, 23743995866860270441568039262, 64102912337351786587630466692, 17369019086059592745361915380, 4918904120594348956263063373, 2523988036813926354410683386, 41257430407029791433456521048, 73196129096162632801179312154, 1143880680408001362264661917, 32195623022190543413428375697, 31030049161763952302223745036, 13503071893370970140898688918, 939917594949113938980429033, 52811882316400864453705338526, 2815286615841341143663457429, 41992545876615030799195817476, 1818481472437100653664691657, 34987691943414107968134744852, 40878801470062288314762248298, 55005697820460466671633894779, 6764685233443065517164397490, 79137524665127844464682568957, 15297186351819484478792032785, 24087156059087139417906163677, 5556016778993591697165639420, 16200903511171413487609584181, 30870253544145312022886336217, 26296489880647376114885834094, 3401412580056458052115504941, 17915414154629727586750206765, 67774848999585074196315058076, 15220972798896684984768384723, 2329777072247811645741631336, 36742934017992906746164876399, 7265831854207327421111099289, 20014651329844495389619549518, 7460667841389298953618829324, 22794349671985817609614005944, 23572212611610986511548237800, 71320424350678856466874421645, 7941172209436578575908653318, 5499984639108981829388731957, 52852804981679000924197542938, 14922036241730437756087936054, 96521867833115396474702337, 35403169172926574366305222973, 14420642188561375117886944280, 56907852012997764855810904811, 804005036742096544914802893, 34397447825967925984498641757, 77665859389825109045915683770, 41454079762234904500297784432, 4961647032331507187329670924, 77380570097195891066244149264, 75985620214896891825333397268, 13537883249188898383107375715, 6817133864511212498366745415, 38565639835003983751895836, 5388135464840096083713865046, 73079208967064900404190968610, 2168401541985350016536004704, 44331792313615495822089523746, 45228015122067175889013749854, 21291826705134395778131984195, 158817786977130603135972819, 78937151238428489313752454449, 47852829011551372777516068279, 56231973786443926868846519392, 970013318790119295476087699, 66725178863183197620370204142, 39131135066468106450845732685, 47309715496012417623698057241, 113265448674245540763942617, 2615732528173447746984356354, 31637152253735177259026595443, 17667418927364429160911210876, 5384257139527135367423313157, 2927733559426126489357703919, 45996109688963325876331313580, 37308602146515261785465678223, 3619601998642510821185236744, 49700123893072691024830229256, 31195539511323778278118125938, 24518740102054722009497506150, 345290004122793200958565085, 50311606249724371395846489843, 18287977436220244007032901982, 74160620075539302942013148324, 7778608160451970017294857039, 6379796592398156915836369417, 44868969698900743831040899164, 56796698225844745631732624047, 5040474255292116400606266315, 1155453101237490726964292903, 57723821429642422631781984957, 77942597047743092619042378902, 2650140955012459459827579312, 13388636687467698491604091834, 12330235428390297342985732601, 479971211624294725086179764, 420279034989139212955075921, 61501838956547927422319606941, 53697226978174870157454785705, 78206311853929228287189379757, 1262646840330366285138556365, 19792364398909804851416022304, 35186186211818003075676783740, 70008984979026718031891338970, 6870117216435495996800098082, 23423611029252176245034709149, 49059640829156436668544739175, 60861325491172325792820713981, 5002096035496660432994692393, 24539992314468884769924667573, 65995201699619382900680248097, 6375328264358795084797332711, 83632214262819946507498841, 20945964158832437453334676628, 10162910035574165168052231625, 20780541101648242166533793073, 6228484446721223719386620164, 25688620659294618951728173083, 64855233088252483204529593255, 51212506230171808156432848018, 8039311641308787010498509441, 38848685132122890414829582185, 70400282338174065197342744713, 2057145576813986050550970382, 3521460735344622493041619455, 36777408727014947738481614393, 23428702022065339443091040789, 65450096559657761187905698092, 5479757468067807993915876905, 66091376596739195194925267478, 60090394155296560628708983537, 11081125536383530458463230503, 4831532029357403488503298864, 63002198602282433919492096093, 50491262007579117667162941296, 51853643405753793018981801330, 1631071258714018251014592085, 15340012709609678578254712087, 21781225216135288631806926316, 72182920758203106611570060527, 2547872850143442774684331541, 75616566127235858162997442709, 52447530161257077313031234009, 76132503493569341060237569365, 126930751227008939941232438, 18221612743024186000223903186, 9901877825016811357542038891, 53886734601264135257532533301, 3197079857400242689429942861, 23357988387387192307327806081, 38576455061337411801829771271, 4658332176429907196457996351, 2252532177278711702692416668, 12204050214017207932762103846, 12957225015551734129220877642, 37519284047513204564058835932, 3727342192262660800883297275, 53128773532433853680677116654, 30598535758166493757895575993, 75255659677709333928390665421, 1295752185515089023111379423, 71998014491681310045420650777, 43242986272615679579633907924, 31598804946813437060658131839, 5140187780250210454368509967, 56686369375806058019376847645, 10735978527746931041711706636, 35269877803484595245653086850, 6275468727283328128222991023, 51113726952648489981268517765, 9131675114044160326329666126, 2652036813932860468456338238, 138347312785956000827003164, 54073288904655783638240970490, 36535136317031713874324393577, 24500919991591773574093995518, 7082584300517979306238687034, 44700836391407559287705076792, 22127749464885295834211752091, 49705459724296084486619515011, 6033508345494092819025038411, 58201136430380105046811470494, 56603346016848334041217437230, 51444909462204577598058844534, 4787966017207094853771683111, 34723032734996368331688696922, 35988226078044733732911630064, 57873948250585762640876027425, 7295918603225574426553572521, 74300390063782725584199322425, 76290572937038450314483714210, 66199656157205336430839356777, 4994474849695407675762824637, 24998822133757583982004722931, 59738097399408101286361900203, 27284442029434015536398842338, 4753012387375130020682397448, 40181555844209964641649455025, 73807997668374361537705962353, 55416681170176816867959440129, 7853567437740190513628097921, 22574140969975299320189475982, 36030772356694162951074232068, 36844614396816803657096810588, 3721630715395751264527173973, 8575277412439791895532785126, 33808970360207452577775049037, 10179898088334562113328562772, 3894634630293701680835880049, 2829641840354882715376606299, 55046456379595324305573921313, 61908504541849150463636733053, 3668933823929448729073653151, 3454811573890510037638485196, 15223276567699016690955341790, 51233285994134270409743850035, 5288791552749099157842839295, 12928044618889204464167470364, 61882333743347925090067385283, 16035154674495698726353024770, 7821232909086408256335935123, 19781382991465993766754254473, 39735755608718942643795998249, 42701532154681642931856399512, 7390187142611032603025084440, 57709543692432530758927673133, 41790403874013309940821045779, 59409920922052760174072706972, 2028074353963744831258094142, 18626042023178516160414689731, 26340691142186367706328132877, 74419148385451143701530302539, 7709802561430352689451013781, 23401141773496132509508935372, 68251899931694847129006922451, 8369080501910040330268302411, 4745143029867161526255219134, 10905570767412679720280037618, 25264149765886313250159150514, 46334599857447896670903170760, 3522933108246036992029970832, 34840160578207577665918358073, 47069374867957070988350983030, 59911598892298675458282900261, 1799569691127526516404343592, 48041798736446332161335570650, 6523209482320907397905463019, 48562549634441655693759140782, 2021572909204703367938645791, 49157649887187583372577123573, 12914270604240255295658487679, 47909464082672218664520492892, 977186176154142369512998041, 52432458160519067291109127235, 20139985850045880598931339879, 28391153932265829616910657377, 1917155728214362387794112812, 49907856608581995462519363567, 67308622951642606481802010814, 62017396281584102623188669698, 5406665524418610806319257513, 4334020903340659492689973973, 62708595377500444335721341309, 28351749961736128192845915853, 412540683073870586896916883, 18453329457008298679606348176, 31892783753562858776707768870, 16930474036344999136165815917, 6771817435866936430451785240, 26777095032085545061747283439, 69988319504100277226426572043, 7664258337008088055565707182, 1603078236012739893317807393, 48874198478203735279038227216, 28674946668287783618333308663, 45158794232697752524814989289, 111491677857059302242472051, 76742841162123068548132488826, 1427613579816606026745502988, 51377383104572637706143115784, 1187043648577596062616529798, 44001689212682430303086905767, 28448872384398522308739989171, 28225461909390354750519545939, 6343501096470810559201856886, 18650610314406046221539691299, 53156726602301634312358976395, 65731950520592927105673970550, 6589769835146985603718663456, 79116012777178517412401962242, 46153895774180913197806098721, 1621859782927758121978690046, 4710709632323947019158176758, 5603882919346817606792404775, 56898420608961791113682106778, 28522160877083391715617121065, 4405678069529122100100321219, 56891621628997791375601569669, 77388436951549194815491354160, 41454074574001043199061016212, 3735620113066552402358000225, 45757187740470657347781811445, 1993465267243524127680203734, 21844099709058409805503137081, 763007871069664479987169822, 71954468741987594673578299567, 15529822540426134812143309890, 24510539149738767951355265254, 1925066770800010170667074679, 76818283277495551585155220287, 52770368523908589185632582873, 7530205527034263491056222638, 7840665559774872594382369808, 30393187796009946619000627275, 40195936715542864797941423965, 54429792051118291031018131184, 844224739628446582631492082, 72542900238400306529861264186, 9760347851423872372435020632, 49644582701954152265109623450, 4372320622446800335960624865, 9455822816736114282915785299, 77474549593779357248452583763, 32959568992026965674418678110, 2647211828385677003549549946, 4173496134517854605134975358, 11414795704442402006252296348, 78647154787716830585881033380, 137290262090624202932262448, 72850622024021382817619671452, 50987527561781487473169224209, 55414606479067708732149778735, 5349025964929487316416066949, 71603654272716691861235267247, 65212014909960454576855921738, 46756013401355075076709782549, 1236809561924080500705073010, 18039339724163619011398110126, 59620412087130777769066780955, 6550882104282349709081151350, 6799934861809531242869508711, 37132319630173765004679159427, 1275730058144055754140472956, 16679093963139019840126830671, 6041459975942820774259567412, 36667725709264320141658706606, 57462809047973763587644779220, 61714746869769338916293441377, 4995020140076354005295896578, 39711527656155686751828805000, 61785470334744594838319088951, 9975747533533352729197279381, 5989967557280574787532063447, 20688339051488581561768106192, 60328826383283824290398796359, 71154871809075511074416130998, 675478839761961322159340433, 33935186420306002622319551570, 75650071675037333827499727639, 7978391470928213060547861402, 55229897326522455778577151, 5341363232463531648409618164, 4828813981589234029148700730, 17391825957729986968250489839, 6728939778814093150028581603, 68759666322420075904381308479, 63745526148382525316646186217, 6587167241272766633522681592, 7512842484572317262403448000, 71691906250804315260058274251, 22160977991607270792960555007, 74461720445039025630356520159, 7111288948743235820070879461, 64384284204592218680838426113, 54290651891501761279382499399, 58920686762254700488328005493, 5690102562593053951804362350, 72671979669695885127389166687, 3917098364426562043467829755, 30879331403071621185820121104, 3299557160250951397747581959, 33734520293259984621021768456, 22247617303580972379383123637, 57064457128121982288576938807, 7729329557670245500980121111, 17354970979125391548455335457, 42144218951768969120850558833, 11653720027700183604427347594, 950553603085270778976560560, 51517197863846271602443943087, 68726799395261570374862497622, 35300152692907580905476964352, 6929994638181078704120425638, 37616288574193235794440892560, 71337323622897422153624339189, 61791040319096322990455877510, 3907991303356398894544454121, 21636909569355359565771442253, 43048426297338813121594957461, 40538861026956853332103124614, 7924573068477480543999362796, 43780939195326928198099606819, 17760911997681000120987283723, 79001414550744121433700084461, 6473279825833230557398328121, 44073232209691244252351074665, 62715530708434665036435095442, 28808727381105276073494313745, 6894872971632851942397002962, 49218162033435703332324726850, 76892980589304011712615965932, 63743137676739485280227658560, 2758129353444927133229491833, 30682049436777618766050059286, 66104898373648169915303932340, 39599143153597424397398701513, 4722941368969259037631729675, 30920580508168487540467896345, 45985939018732626454781452643, 31362170661621610998496058500, 2655458178999222998344262026, 27759321959521580336995914024, 55643311922326059969051323107, 79016524687682117370833681096, 3652245498914180690702957441, 66387995740340845800365743122, 23850782478992075824609254378, 27644688107042638446980691176, 7251352189696564493074424815, 18922994830427180062320520161, 57460375473831887570039215560, 25317783527478725180058839357, 2967666455544655950687476640, 36833795296224305156121231564, 35175654147200484592801963226, 68576511938554066088113627757, 3815143819723157622804171891, 32420183186668328614678705960, 76971791924206157349199812130, 35029211973561312461522054006, 2659298902548053776616719971, 38178705022087104087895280199, 16491142366407870392745525780, 57471257290520324075928397801, 4644104179700536167148728521, 29377835816500910970998555635, 5490222456511355044671593417, 23163064843591028835795983864, 6670504722161960240531516398, 77913860937730890477034301602, 31596836924010321165035152101, 46200520805046091656143035270, 428693402328928798056554327, 70694224629462102885501367213, 30475084998968019261522587276, 15478690021513148253969947288, 7814279447346914064306280223, 6986467113613220958358912195, 17746542625444392163736271209, 23187568597672532035007180224, 4342862020753968697993315680, 74437127397760668256799691260, 6545940320811808411226632934, 63845923844196235924174019284, 3698939782733250683814007624, 4036734324126862158420917011, 71343874733480892530699901206, 54487211614737150255729706012, 1203829091081599764080517600, 32403792967710163877425295294, 77908630207553479193425901643, 32447467337232535348842579642, 144929526500698796355239829, 78652667009715699366867409402, 43904630508002691663995738065, 74552803138400173553807774720, 7434255625032443648471308381, 8779801362273925028965699247, 8302946271464005465223225932, 40829483796607666727034350548, 218985591658292190617650598, 28182775541016175617178150693, 35854141543878247900510347682, 16696830838113034205193365134, 3994091707695842966783521997, 105, 57569957471772298309985677194, 20841347015807125027101251874, 52454682515082664006363377803, 4390640560175615680642904186, 30284098542364417924104472585, 68030772574172999207502174285, 15125041933463746059667904858, 7538429599490899187344673149, 24776432571679306442237297131, 77534931994803495171322974876, 45031575052415837991172017, 3808374045438580476672720996, 14654321193266796325253566857, 47647536351453110959053793457, 29546843809807196686467002605, 3737330214546749177848574375, 71264515295546311159929215983, 64208859128949973401652706745, 16981613276024328884112155551, 7000081801124001517240136386, 34581855103687045984719534197, 31327332270004409420693372054, 75617574277578932830958015216, 1260433202343396221922634466, 28101907824058411241613361659, 22714071559724996721334494380, 75754774047528210837896988180, 7884680867620871967668093982, 37737135964750224165451434137, 71625407088551334923463439763, 54180158865216069424123277591, 4654174475822459457617052644, 56368977538640097788172454212, 29019208332947350707492966660, 41632282174472597803021959304, 703937115578829223520272769, 54519099811379762585347732484, 17515723328350251062555892557, 58116677835002675708714785004, 7879829267706386479425531267, 32344627528181534677973586780, 62880196590146259979239203151, 4695993195560909077958709085, 991636292339584748697301403, 9608307570283642921588093058, 29432326224297586876416736032, 47691184690128852854041230570, 1142954025102108672587749075, 35320961937940548229635328568, 41951455906903482073631116019, 48005398781827351209200134374, 2270283740097886546409331992, 5352667027544882920489144841, 72463999891013882382553996391, 5558332468265685238256375376, 4688687795717711095041272263, 43816802591506672096554971031, 19430783454911637435153301840, 4117459716970098973891994358, 5554041728686274542594300737, 22890882121506216432737144098, 67323870082432596390563455355, 71837005490605602883568026715, 6398259231318494667244915967, 17481088676555627107063222740, 39497288637622370199097974267, 9563502008480222686223429252, 5044167521032245584504661204, 7230407927652202413936552904, 44715978549099569859521752308, 35096552720860616720414232487, 2806167346110575915832767610, 478450080628773755963622477, 46253743600233108918870166286, 43067288465784178514715840161, 170100288806390428152539429, 20397053483705631633514139645, 47658194061255073516102851312, 62256260380255249353748598962, 3820831218277786656964321984, 58095294591667453748812323502, 41674326759270639033254966683, 56171198445694792218531599332, 545450790238813969361922637, 65499468664997908604682171605, 62045366970510216527975656485, 62418911008908659246219830605, 1758084253965484837747474043, 37161928560513417365138149017, 61456688364315264978489722441, 13866573997073829975828894057, 1101971680556257421366473291, 42238565234501307844565222075, 39092645856164347341218619001, 15413012042771176567531261097, 5176308567174431214895492875, 23313780721338148342748085426, 74348701442646605960131636721, 54041371037788265965572113400, 4966464828039834339439832006, 16162672594497134876297237160, 6557194192784011729221382080, 20904766877202324114454636539, 5145894224619201901543114267, 60139574499071955706704108521, 7426961792096724021504737625, 62000751472662839080706207680, 7485207025036210933168349545, 66279778652984732597134690095, 72903019643825089232335281931, 73386605339332318343485159895, 4039441090047586797679360760, 3455631921468245812647047445, 11162497567765394911227272845, 56311330767021156127371568324, 5002575456543662471866957506, 16034018106658403834177061217, 10093498259766328409313876049, 52200758194300589654259495432, 4784204094467720714230496620, 36360583612891222140243734767, 59403116285188244931894058304, 22298954752981142062958720656, 774064557597856823551809951, 22975415485210204807018085068, 76665313511437498347079416568, 34528671015935834177902491853, 6284483241995564867578236670, 55336989551664458051514852290, 4895639363360157662244382680, 15981115433901249347718394196, 1996504551121155675691277796, 10162755981333210334252781268, 61563436246602998466527891707, 13105763504547067518011957632, 6026245014278050069473961153, 6597656178928834850947296343, 7203082069907764528861731020, 24689036614111271810941222359, 5339531751434462347831936257, 29324077287061664848097151181, 16398364951733306447937806987, 9629375497507687302672539707, 2169559704401979002213266511, 40954366589761532326288006283, 59807622928067214155279140681, 38803421665805242245162616520, 3165461809483398372584290804, 8697901618707046586081246251, 61431711486843020173292981886, 62188532232871833000256017826, 1624460184206126299189365074, 78151219457189566464403149783, 46934105919414094592197867582, 47503134093831854454196080452, 1699677133641776368278641, 65532811718170939799620388807, 40762762651263932739996658957, 67850649046684864745635779053, 3902278812446426359890716540, 34832411601019705173078629511, 933722803367990924793174908, 69070399278291785909020328655, 5569126727446776730707303878, 54645661552735677329975336121, 32675490301821238256100836047, 50311157742839489317399778210, 5918173616071926280217401432, 20750103384670827060213064823, 28350939018889075072300846868, 50012318082932582318202118939, 3324354507868066052703049589, 47026169626090593110260716301, 71253303767706426101810317192, 1858833577213356545552677961, 7089387668183075944837551750, 3847051164069809384766196444, 64311647288962200846443052785, 30755058091291626139758761239, 7086759067844953278048408167, 50231377188737956453764891643, 75622792809805106545120727394, 61281356573713382327959059299, 3607000079439546736961268310, 78599385250755698818523324357, 46158010841662604308336464954, 47776660208559614332281101688, 7187080050173543354801377213, 69279470175525517466563000382, 78255268272330400545143471558, 63376919325157122447485666216, 3665150979503379414660591145, 53589297160884127863650539816, 63161587236359944048459512560, 27666260091704453600317488044, 3159458683044602623326611611, 47930087031147562031208033368, 7153479503935125555173537233, 12480260155906701755859205437, 5327057652332958138856475229, 6267843991441604267108186942, 6430167272385532105652199485, 55680441468620597607984410415, 2024061331455076594032052922, 60936829448490367859385855847, 70119603717884493224611908509, 38930411112739657989265772559, 3487026885456939735206198355, 10966253105485435198055842960, 41206085612313279566266780851, 74039303117606003656574848553, 3953615799954577808790635607, 65194235440642422557196002129, 77140671826742690083158189903, 22324632480124754871911986261, 5748856202633665892634393662, 51694543686516374380563310045, 71507147819456607695613571082, 42550497015381296320285891717, 6365642150386338374029374069, 71371324871093116466967797532, 42621007360610670856002431927, 68999158743530494158709149218, 7579459710600662571577115739, 79214422400618272032980457485, 19968606810806258968888584149, 5828247810899057654918759825, 6337455962993824297299548028, 13572289853426002768302330818, 33962244086126136035230793013, 68321539669192944660393676306, 3646886582156193931180533147, 14038587961748795478683323288, 695380606258031592094476120, 60140039125568208282071806873, 4171815851405786362525535829, 64512879831817828218671641753, 34312184808473484977006420452, 46777909319851559726869806641, 795679437296864567762387412, 4214109726787996314527983333, 9164619329761235560329844791, 60800501598821333423038526537, 7296665179423728747448978962, 58005490863714333636624297557, 63166456180006620783615100124, 36924168066314960251336626545, 6853538191058898807594460233, 48192699657892552272001071175, 66207645018610352616799496843, 63164833714233397767442100606, 2191163149728417599020953007, 61171096677204442929961848900, 34688083595214957086962399174, 41983398412040587452130345639, 884437460770174909969686116, 54643665223393105859741104476, 12493522734008592226788688384, 5497697929110909657992588628, 570314447736526203265130543, 26737719476081985211399695188, 70211272043060667685833634598, 21648364972664990563306703227, 6694819143910656914580013114, 28822375247878771241912329446, 21902922234308918939036022699, 60927794564237371652774413065, 7108573136398440490780407188, 171409236099598647927471782, 71342831510116737332024685259, 28050618890488807750776868414, 4614750561975905278847102664, 74149762004238934846960361996, 67135212843686137988560777666, 42261437695558421128762561934, 7708796892063309385208905808, 24546906949960588443148668250, 59570589205781355058971623777, 15410917122720372447426093430, 6927842825394446202938705386, 14805080493062986537203694149, 21510650262766978816046428852, 33078300342581100420966174050, 7257313754528569037963798456, 3937404544144598378083857932, 27752308049903025961744288847, 39402326853196034949729231474, 349103933095947443284057756, 62537170469502213699698434723, 52290975588857441461668935992, 48895485112302456741763495608, 2484236911201439585423716223, 73889469296204351320679005190, 43743934441762401466281648681, 75150421101855792911947751028, 7682795315773254238986260360, 38668643724630532773958823596, 73456148051787752711644299632, 7552805754028345565483019452, 2292563396593553538797380922, 304387165043884855927344817, 44558137965911900603527819120, 35543732514097989421851573973, 843768238483642450596369855, 48754036476748603797221220954, 167881729809505939832828515, 17646930318624261778934651222, 2224597870370737441488125433, 53448025959626443497958108843, 63936110208100227552449502836, 67165485183383006560856274864, 1466780171191186047987577195, 16202402599002751378943224829, 62294207847347172074620681173, 13523435353688632549377920685, 7309577892509863023640856834, 10932162770803347477428610918, 63505201569702085662947102709, 36860233577201731369502825301, 7589973108912111105911438758, 20753788432755689128162714385, 5745843313173529637598197337, 25357323099305210324209963596, 330894952411496347338920192, 15214369847968626928483565639, 150828347698451724331724810, 24427052518300640692526562237, 4924116368144352932400256860, 23473662036715933185233019684, 44763303856708287728147229983, 8231926890847753945185860184, 73766220597013929845666337, 3890159043544797159982570930, 16662939536687215380046873036, 7707367316452616086372923656, 34348342013042460483661408, 42609990796076350298696272897, 35093478742760970004998950305, 12164184558869976573407706014, 6214741244108422667459410876, 39129728758893851951241957322, 39533781885891249294044484448, 47179015355225274532101979779, 7493709948243950555168689335, 21446427452332739882001837344, 63663556763573993421957977376, 15278503831101530506906606574, 1654527047285377043056387038, 57837175518583143845909552947, 61053390519012638777112872953, 43544397516813489464938986449, 4963688095975488297555038710, 23391805919740709924554264016, 1632831928130573449262077438, 53184059087579340785154585728, 2310921454884237285232601827, 60249190940644023992741276756, 63491790167675541476511767267, 49079498066429671278855114931, 564055877718191746237317877, 73732261431628513704988464994, 17325968930561705548462899459, 72464741485148004170902957119, 2999278546301872075674610238, 35696581146285889693745623528, 26406794318009386380128961902, 50514295361424859447077405749, 2916353450614086899119500877, 52952980576381310393344559023, 46509316566702344413835645439, 30371041607920161854672541305, 43530656068927029016641767, 72338843549834960227348703730, 50240304795663297396524514661, 48351238362419983661397662361, 5241891724579335472956155632, 16462561091582058726790962386, 42602169289891202813669678566, 71185270322964803188555772080, 1701859228417122038397188257, 28835284678614357453774314744, 51290354492169392653046170608, 53001535446705559977175304502, 2172878038377862178665191418, 12155766974048670590529868002, 4510793860354689659531903916, 17866041145099813977301185821, 2303555036270224435333906139, 39417356407044317169745083809, 76806008522698936486979882348, 64923008705597471291748350054, 3340710008466835035564458096, 44778228453572876370750336606, 11241298013215380720452226152, 238158315980484730688736716, 6948873747953010723409202558, 65338151784520803668145704102, 44532371581130946301588525287, 40337404130101800437088977954, 5975657711197055080422110372, 12021898650700678680217721976, 26928805862739227022169730045, 6292369161450680010926501031, 372209286126994193500065262, 36479489711866011592460305471, 34065619796930938121732339697, 66443649579102238669388697374, 5442186522203701522736734422, 24408781584332586598513677854, 47064685144829238673430848813, 43496644836301989277872256443, 5248310386799227518353474750, 831405378488370047932888917, 49347858366983301500572664748, 6561740100325473314625035282, 6821352382034051627623180896, 29671552608295196949489172151, 24240140311428708882692262989, 47285802444526084105023757224, 6936446177149881725945942594, 3286725750790949516837023925835623603544975291305806739637631881177674914554, 12, 50502739391530308824430229837, 60655675897463081423873680591, 66236366336699955268664361355, 6487040436002879903850334703, 49461443923296839145664642703, 67622669909088564412041393317, 7996524410717796873717795934, 3816626839411767063346110786, 340282366920938463477330667205218768792, 670240716356234401, 340282366920938463466433545813091659183, 340282366920938463470044337965307187856, ] .span(); let _ = deserialize_full_proof_with_hints_bls12_381(serialized); } ================================================ FILE: src/src/tests/proof_calldata.txt ================================================ 0xf80739ea729635128f87c9db 0x8bd62cf3413ae30ccb5cb124 0x3a67b2b92ec8075 0x0 0xbada4d3959a1d0e421bd8617 0xc89c329c82695448393ef4a1 0xd73627973ff2282 0x0 0xdd0ccfe5917761ef3d5cee7a 0x9c21c25b35bf74ac737c8c23 0xbaa720e442de1c1 0x0 0xcfed88053163a2ac94869e18 0x36c0fb4ba2bac814885c06d0 0x4d40dd04d20f4e1 0x0 0x4bc54e609ca3e5cb25e3afc6 0x5027f40e289a48ce76fa8371 0x9d21063f8f4c60 0x0 0xd2a77bf9fbcf68c8cdec9b6c 0x95e2f10d7943fa1caf07f9bb 0xab9f6dc9b4e5ef4 0x0 0xc88a87cbf7023df41fa14c0e 0x221fafd6e9cb82c03c04bf0c 0x2745103dee46695a 0x0 0xee684a4bbf22a139e56f2b17 0x73292c17bae969c87e752af1 0x158b03356b5595a5 0x0 0x99d2856198792afcc16af2182c56515 0xe00f8bf845ce217630ab77a3351d3f 0x3 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0xa 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x37 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x59 0x722eb85ba595ee4a5653d198 0x93fe6e1d18c33c34e96bc4cf 0x13de8cf3b7f90a4a 0xd7ed6e3bb7e8ed4b796ab5b0 0xe8dbeccb00ea189954d32682 0x2b4151c4fe6f8709 0x41e1961c729c2f10319d41b1 0xfa72fa5bca35d172179c34d6 0x1861229c1fd50a13 0x72057ba2bc6fe43049b3d305 0x96f0233c2a944df5f0a9650c 0x25c663fc11975f31 0xa63a3350751315476c2fb401 0xb135be310271eff0d8fde8de 0xf0af755e989ede4 0xfe4bd9e9f2889230409280e0 0x96dffc3684889560085bfed 0x344cee4acb08a9 0xc695823e6e83d3096e236a9c 0x695eb72c8dc80dd7b9edcc6e 0xc2c3eb404b4659f 0xaf037e0208896f5e9f98f116 0xcf92a7f6b11b3876c22e2f34 0x15d17a7d1ff495d2 0xfc915071a01eda9c0f0162a 0x3e97caaec2e42a8018031a9d 0x176cd09f53add701 0x13d313c7ad7d5b744f4dca27 0xd8cee2412a1c68754169322a 0x723ea6b9d6dcd9c 0x831c33c4b18ec243cee69300 0xf39157f7826c5efafe344373 0x157fde2c65713426 0x7fb81be436ced44825c8beda 0xc3347df75f7ea57a4b08cb9d 0x9805414cbec7f00 0xfe5f88429f733a5c29ef76a6 0x3c7620f86d49b62b47497d2f 0x146bdc58364967f1 0xceca5a22b2301be7079d6da2 0x845a7d2d53ec0b6398611002 0x2f6fef0717bae93a 0x1c2fe7659bbaf32af4d4a289 0xf58c851287415ff970ea1023 0x2b329329d4d1fdac 0xd5ba07de90ba5ae2a654113f 0xff114b8d2ffc83fa5b1d8ab8 0x43d9e5ad0ba80f8 0xcd02c79cf4794fc934733285 0xe2606ba3b42204c9a79c6cca 0xd78088291f2194e 0x23971fc0976965130ab9fa09 0x18f434f521b4f14660db42f1 0x5b7a1f4483dac54 0x23772d9fafe650a5f0769aea 0x53f4c017797bea0f3f756d1f 0x2d7f9bb9603f8ad4 0x516bf66b5c72092ca1531b81 0x7e4a2de688e3b63de724050b 0x19edf89a0e062ef4 0x6caaf8c108277c1cf82c4d6f 0x4a7477e833ad44eb8a53586 0x1d2c22701f6deb4b 0x9686a854f8305703c2968011 0x6b3f8cf3f643cef8e53c7fe2 0x4d848f76289cd30 0xb531d669bf24ad0daea89bb8 0xb47334a823714044f6819b26 0x1c9da3a885502b19 0x1e16ef52cca23d9719d90a6b 0x8a720ca0043f7a41cf63ab0e 0x20cac68e1b9a5427 0x1 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x22 0x899f96c818ac403a0eea08ff 0x4612678c14001edab0a2283a 0x1608fe4d3f110f38 0xf276c0ef6bdb1c5f18bd88ea 0xd372ad96ab02e51d8fac5089 0x1e4da800f74aa5a1 0x237c71a842df80e4ae92d536 0x989da96f2fd2c33a75549111 0x2a1bb484bddb021e 0x67d59d7a0eb0d9110f8a4d11 0x3eaedb500a0a3cc79b67156 0x21c0a7203cf660c8 0xe32d2bf92aecb60f3bf997da 0xef0960fa4713cb57d808ce5e 0x2221c072912b2421 0xb1aa8945e3d4112df5139ddb 0xfd13eb75d45fd4f36a5632df 0x2e71922a84e4ffd5 0xb7058d32b4743d1067ea67fd 0xda59a5a1cd290f9a74246939 0xad2d9eb98c7cf07 0xcf7433be69fe9284ca6f1c84 0x546d2e640083e4d37fa407f9 0x1c4217a24775cfe0 0xc0aeaeac5efa2b7e93e81bf2 0x1b7a06cd2b85e00e54f60def 0x90c4716824967a 0x206926270cc804f7b3d80d6f 0xf3c6a2ca8205175bc3516ff 0x1e5a76eacaea5c78 0xe8ed69b1a18d75a3b02789bc 0xa42519fa8be45e6e67a78ebe 0x30a32f24e37c538 0x47bdff9b2034f6ea0897fb6a 0x5a3c5f9de776fc99364dd86e 0x28eaee212f62dece 0xe8c25e968ae2a22dff93d638 0xedb7d4ae1f1129eba574bdc 0x26d7ad2e1618b573 0xc0127bbca3d571e0dcec54fa 0x9e23e31aad3906a3a468152c 0xd3c9da60bef18c 0xbee3e8e626283ae85f136a 0x52c41e6e4521301d9cd1ce3a 0x532fc80b14887c8 0xe19b85f3fc091152b64278b 0x9866806a6e92d1864ad6c19b 0x71418d935c98815 0xb9573ea3907be3c0cc2e8da 0x985e757f7c58b10b32e6cb41 0x2cbc76b5842cafcf 0x4517ebf3bda6f74c07976fa7 0xa55f969bcb80139f5cc61a87 0x15744f5627fd8603 0xc40cff2e678ff7054556a986 0x559e28a0a270a94d69c69a3b 0xaf3e46064dd3a24 0xd8629b812542e77bdb8abe2c 0xff70cc97946349457e59db1c 0x2edf6bcd3005a0b2 0xaaa652cb3986f89357ca2b8e 0x1196f2c81ea1138debab00b2 0x1da1250d000c756e 0xfff3f23fd6ec6bb7b5bcf975 0x2382bbfa1883abf27f95343e 0x170d7fec766c11aa 0x4a475e6f2d59f7af2601149a 0xb35e18fce0380b9e9a268080 0x1c77c6b1d0d29488 0xeb7cc28be61636214fe6d034 0x3e6b7ffc307884efd9039657 0x147f4dcf0da1df88 0xf123a8fb61d453f457ba102d 0xa1d566d9cf749657164b282c 0x1f8fafbc70fe5c25 0xc70dca82225b4a1416e1024a 0xfa61fd6f0d1c52e57b5cd186 0x1e5d6c4cd413a9ae 0x3cf67c128cab7a4b8295c2ba 0x9eb55fe22a57dec38727bfed 0x16df456d8ed02937 0xa9f76a5f29744dbe699ffe03 0x9afd0d9f14be821fa04299ca 0x23cc6746fe097a54 0xe811a025108cad439f8bec7f 0x3105f366aea4a9a06f69b87a 0x1436e4e2b9eb072c 0x21fb73d34adc475bf3e9d237 0x5bf29b79076d6576f2bc0b26 0x75140d15ffc302e 0x31a8fb1c07b22ec88bcc2f4 0x736948de3a66884c8600ae2e 0x2538a773eba2fded 0xedd0f29c5bb9d35e57e52540 0x33b1a86d2f0a7c2a96721837 0x12ec69e6d85a75f 0xea5f2dd2229b2b57688fd156 0x23c45650d708b828fe479e71 0x1b6c1a075d4dcd18 0x82bfa2719566106791c37da8 0x4b992b52e994beb5eaa2aab5 0x1cde51590a621851 0x8aa5c70e30936567cf59cb5c 0xd8457831d0d903625d5845ca 0x284597b9cd2d9adb 0x7b0b09377318013cfad7da79 0xfc2b52907dd2beb7f316167e 0x1c0c62a48ef5d551 0xa0d1aca5ecc18769ced60cbf 0xea549c80f0e07d47f54fb4e0 0x1e501a2dd31d9444 0x91b4c6c859fd94d2e077cf93 0x41199218d8f749007871412 0x19cfa3917d5e0359 0xcd3f86e757d4aa535f959fdb 0x161bc39ffbf028b906bf5f61 0x1375195249b7f051 0xc4f623f948e0aa5dd5d6929 0x68bdff335b0cca459de37ac4 0xb5a131868345af9 0x4bb0b947dee1825c0bb108fb 0x8cf9a47ea942fcc600bfaca8 0x2c026828ade7dfa8 0x15d6b482c1023197253e7e1a 0xb2537c5396aceec626b63f02 0x2f18df721137c9bf 0x640214f7013afb31e0bdab63 0xc643538f55b38f3cbff0354 0x2b391aed098e6ce0 0x993fd6a74059cd2cc9d2e06b 0x18e00062ef908b856b8a9bca 0x431a5b174dc0326 0xd94a5c873c7aad7596aa65eb 0xdff93e1d4497383737f6df4e 0x24d8dbb2b146e438 0x696d2a2a17cb460915be7cba 0xbaccf943804e927ad666cceb 0x163ba394cc43cf91 0xb74f2e6f3f6f018cfd7d5bca 0xe5427aca317baff75d2f9f7e 0x225efe1e7d1c833 0x8de98cb20848d7f66b9eed77 0x50bd297812bee675b6c1819 0x2656c1096f6b9ab9 0xae77b1e75b5a0f7a7642b32 0xb3c24d54f4edb5710d719f0a 0x1b4b45963c363e4 0xe0ba1bf61dce8dd5d329dc01 0x957fc3e7c35c766e8361673b 0x8a56d77f79ee088 0x7fd5d24cbc990b8a9bcfbb13 0x4867dc9789f0c46d6e7d884 0x1129ad24b450cb41 0x678484ffde0521034191f186 0xd62fbe112a529424ab45f93c 0x2966825289f74409 0x73c35cc9f59af6de638c5bc 0xd1a2ae7bd5c68c073eb6475c 0x2678734594e23df8 0x609d037843c4542ef411f05b 0xb62e6b352be8ef6f59608396 0x7bbc722e2c0057e 0x718e2c6dcc1a131dcb7ff8a9 0x343d635e263f5533943e038b 0x2e15cc7c276791e1 0xaf70094d05924eb44ccc972a 0xe2305b6b40e39c5ac32e2418 0xea868b3fa750b92 0xc27db91f7f14ba30a04772f4 0xcef52cdfc9fa9f4cb688fc78 0x2453a69d3d875fbe 0xed9834e28c1e5e6600fd9d45 0x62ebdfb861269c4ed8344896 0x16bc13ba7b402ca7 0xc6f0a10c9c7ab7d73b336e1 0x3733fc46abd68ceab848079a 0x198fbfb653d4f214 0x265b172d4cb50f6ce5e43271 0xdf9c550d1c7df6a7efa184d8 0xced263da575209a 0x686a5cd5edf3dbee8ba290a 0xbafee505d302ca0b9736bcbc 0x2faf4e066b0f299d 0xbea264e301b0d73c4f14a880 0x8b14cfdaf988859edfbc0845 0x2b877e3930d66443 0xc65cf2020dd51d1acd35dc56 0x712bbf43c098d915acc9adcd 0x228b3c57c78fe6c8 0x3a9f27c3f8ea3671676faea6 0x2f35074ff6f6c30a8e0bd4a9 0x2c4e0ee110697f25 0x17c9c8e6a743ba87226e6b0a 0x55d2967e82a536795c57cd47 0x1d88d669fdf058f5 0x903d34aaca87a3a5856282aa 0x84375e9139ba261a44d853b 0x19898994470db313 0xe97c9a7356212c024fa245da 0x379e8c74b26e040d9d39edbe 0x2c91a6a570bc0b4b 0x8a73b6c68c1d9ae58acb21b5 0x611b70c069c563e67ff41373 0x2edfcc446cafac1c 0xe145cad2675d653ff4228db7 0x1e1596ec3208aa709731ebdf 0xcff4fc63cba1162 0x31655928805b085a5c349a68 0x71dbbbc7caff1d373d145041 0x290ca8cadadfa760 0x367128a4d2c59c333393d53a 0x9d3428463cc8773b39d36fe 0x1cf4bd0b1f0873ce 0xe14a381ffda69240bb20f4d7 0xcc3ae4d6eab12c4ac47258b0 0x2e028e13a3c776fe 0x16b9d220bda66d7f39a53bd9 0xae704908bfe5dde1379a30eb 0xe8bfc3d658559f7 0xf5525a9d15717b048416f77a 0x177c1d6ceac11ddd763cd999 0x2d026a2be17e15a2 0xfe41ab70c728df169f53b4aa 0x44b62b4a000774d319165bbd 0x17e21b07c2c93d3d 0x990b7aaca84eb5b53a578cbf 0xb15394cde47df013bbe7aa44 0x192d1f968026cb7d 0x22adcc1c517f64262c7c4f24 0xc3eb90a368efffa8afe65969 0x24ab842108d98c44 0xb050aa0e75fce4c0d4c4cb51 0x163f5720a8e720053fbff6d7 0x251b9a13eb6410ea 0xef10402a6fa8df96dff5e4b5 0x37103aa8251e6298f38e5672 0x2fba38a05a666245 0x49d8f5909e924b20c2ff45c0 0xfde01f585366083dfeef111d 0x7965352b7384e79 0x60195359a2cd5d4649468db0 0x6c60e667e0fa405ad3a9f82a 0xd0a242ac096b5fe 0x81fc1570c5b9454eee71e297 0x4cd01dace91180a6753eb951 0xe4f6816980e76f4 0x43a2b93b448a3c6c0a0c125d 0xf8dcc724da05d1c6387c8be8 0xcf05f6b0dda23f9 0xc72ec170a7b958cdfb44ad6d 0x89fe02bf6d3fb3d3a0ecde60 0x39daa9c34386935 0x579077636d557340cb5e382d 0xbb7d5ab032a1c23d990168be 0x1598b0bba0073ba1 0xf1ea522ca4f4eaecdaae14d9 0x573d20d09124cb5ed418fdb1 0x10ae5cb62763d1a 0xcbffb5d2bd865703108c1c07 0xa6d75cf8045f2f3dbfc4fc9a 0x1c3f437caefbaa55 0x7cc163cabebe795d001836a 0xf1e26d6e828923d6198e06a2 0x1d6eeefdfe21276f 0x8c9e835a5724dae55017b7a8 0xfe5a5456d10395f482f29015 0x3855cdde54606b9 0xf62fbf77b268e83c2b3a031c 0x8f80e99ef13a631a67b917e9 0x616b3b10a32d31b 0x2f97d43837cc24ebfad0f37b 0x82149dad8bcd5bf8a6c80bd 0xed804eb36802ba2 0x807315006f4d57ae0bc1e23d 0xbe47112e5d2343610117935a 0x1647184f2954768c 0x4e4edf65dd72abe6d3ce11c4 0x1032a9352976a46d9d0926b9 0x2c1828c81959f006 0x4b894fbfb7a79662d25da13 0xcd74233f3e68b96f1ee69a9c 0x18b2d969379328df 0x97aa6b296d138b59ea43e543 0x4b54e388cb0f6f2c97c110cf 0x4adc7ed0e6ccbe8 0x7645fcf6f89a43bf706798f9 0xdced018326dc665006813b52 0x2c65dc9b3b3fecec 0xb407a9b59f8520741d48a863 0xd9d8ca2ec62047158a8f484c 0x20fd292afd18238c 0x3c5592f184a4d6c0dad8620a 0x9d6bbb8823683fdbfd5b8268 0x29d59da2627aacc4 0x76b7409170f9ad694f997067 0xbf2171a60d3e044b05f8925b 0x5f26d82e0c97521 0xa34b126c402dfc992551e029 0x3939d7178989118b59c761a5 0x1812f58277cdd348 0x43bd3130e9e2692cfb839980 0xd0bf613e380b4d0123268b00 0xe5395aeb3b4580e 0xe31c940941ad463c0488747e 0x8de3002883f66792a235acb2 0x12c1893d70aab237 0xf96b11060bbe1b6330c866e1 0x236dbc1b990d70f89801f2f1 0xc800fd953cfd23d 0x1a1e40df4ec2febe0d7aa08c 0xae1ea99ece01cb0f03d10d52 0x122cc804195df92 0xfdd3fe027645ff4a266df359 0xac78684e8a91bbdd4a13c19e 0x22e918fcc1822531 0x3fc1cf1ae95a7023041fbc98 0xb810c8b8a4439d086c52c4c2 0x1cce950f07cd49ca 0x8208234f570da172edcba043 0xc45c875972f7e2fb154cb1c 0x1653b9cbe0a6b6ff 0xe081ea0d72e8e68564485110 0x6e201ce6e3d99d83686d1d0f 0xe304a2188060bf0 0xedf366ed6a90e7bdfc8275c 0xe6e0b44480a0b5b88ed3d222 0x20744034b46b848c 0x512ea166de2a0d30491b3616 0xf11f499b0ce1a73fa659f918 0x25af2b04ad9852b6 0xc73a891fb15e7e756c015c10 0xc967309fbde7c7df49e2393f 0x621fda63242329d 0x9ffada851de4411116872085 0x90058ddb651c3d96ff7b0e8c 0x58a5ef17789b73a 0xc165c96062a899f5d92859bf 0xc08dcbbdbd79575ac1dbdc44 0x1c4d509281e0102e 0x89efdf3f9b0fc52a187b0147 0x1f68bcb1f9210c3f95bf3125 0xa4b0399fa5b5b61 0xdca72dd925a41ed7198d1f38 0xf8c2faf05ea0823dd3f1064b 0x270733c9dad76420 0x612b006fff2faeec0a2d7248 0x8a5eb4349d1e4922896712fb 0x273cec4e6308f5a5 0x5d19c579e42748c160125218 0x668e00641a2aa8edaf2de293 0x2482335395750ece 0x8c70cabfd031645fb3b6acf2 0x43a9863a0e6c32b306b8ffa8 0x2a06d620f1bbe8e1 0xca6fa3e323826e3d7e9995a3 0xfd3e01109a20c2f81f030588 0x1b657605ea22d422 0xb405e6392bcf4e5f8eef6689 0xb0956028b6f44c32639e7ed4 0x29c661490fe6e13f 0x9b4e1418b86c6ac60b9a6e7e 0xa91614e993ad36faf52efa36 0x39cff397df3f9c7 0x2ea0d1c6fce5417747201c46 0xd071e99bff9d7b19aedb5dad 0x27b592ecb0d3fa67 0x989e62a700a17a499f9dc30f 0xc46ec56c7e343568b1efc15a 0x2f506fa533746c29 0x104ed06b6cab1581945397a3 0xd0c1e65c0c677eb9d430e4bb 0xb3fddf55b72b817 0xeeabbe91ab1ddb6e9b13a57d 0x55ac257409d21598d4143464 0x2002ba34651a82c4 0xf688ac401fb5aa1270a2342b 0x9557250595ea1d3de4d63931 0x2a054a62077b16ef 0x9946f8f5ea70b41d9a6ebcc5 0x5e39fc62260d47ed671e3929 0x131102025bf8dfa2 0xdea36b81b9bbcc87169642a1 0x3b6f8832b932d7064e2e379c 0x100197149579f7b0 0x44c2eed475abd3af1f8c787 0x5dd37f8b5f1aed2edf5dbf0f 0x6e368bc2faf8847 0x6d0be0de8b690332a0a90b3a 0x924f6e2c99e15f9d474b311d 0x2bf0bdfd4f4db9ff 0xc35a3d261dab1e12d57045bf 0xe4960927e056a8d9a261a040 0xfa2222feaaae1c5 0x7ba2978ea62f71b12291d0a5 0x76d98b6ea773ef1849719d5e 0x16f4de07484d8737 0x9cfefc70c1b8f7b418c3d39c 0x884d482af9c008f25f17583d 0x1dddc0c35b1476f1 0xe493836538c6bfd27b38910b 0x57280417108953863c898753 0x2edcfd52c9324e15 0x74a86f278a1136542a0ff1ff 0xce4c8bb59ce9d03aea7e645d 0x112d75db5c4f29fd 0xb8ffa255ccc2b61ebd7b6bc3 0xc8efc77e902bc6a315667786 0xcf4723cc3e7012b 0xa22c2f05fdc5c4f3da7332dd 0x7a817c8e967493806674a973 0x118a5ce561aa21af 0xa02c862db92a7038b0581975 0x18fd1ab7c4e38c1eea7b1949 0x1a2210e469ebcba6 0x7e5408aeecdcead7b9b9d89d 0xc5210931ec51a818dc7d4b79 0x97c126391df727 0xa92ae086447d0237e6b065b0 0x9019f9a361162bf66ee5630a 0xca6d960085e1031 0xa5349f651d1635d4104c8717 0xcdda4a07863829cf5f21d5b4 0xa3a5c2ca87fcd65 0xc137370e728fbf79edc5fb97 0x87a2e081933e0ff3451e2230 0x186d2ad5dd9a7a02 0xe684f4dd204232e0b3db7243 0x4dd9b992fd13b27c89f06c90 0x11d9b9faf7e7fcca 0x2953cd3526857c2ec60b406 0xafb4f73ec710aca029f476d7 0xd61f6a1aed4bb79 0x72325823bf7a466f2fab2f4f 0xbcba2142f345dff3530245ff 0x19ed75c425caa3ae 0xd333ee25a3049a73239fdaa2 0xa65360fec31886da5edd6c98 0x1ab54213832c02b 0x757a779503f52ce05040eb20 0x6d78a51f36be4581ad7a589d 0x273677d970845959 0x196de6c5621eb15721d45038 0x811b8cc0c0981be925e4ab0 0x111281cb83813039 0xca21bde88b9e1f9045fea2f8 0xfaa1c535b61903cb77c59815 0x130b61c8bff9124a 0xc1b6d4048fe956b84b50daf2 0xc8e6fa2184e4f32fa573cbd4 0x28d693c7c1c21116 0xfd60ed2372e2084a4d4af9c6 0xd8f3363039a7cdbcc5869598 0x5bd9e106aae104c 0xde0233c7afed414d0be0f658 0x2c4f578b11fd9ce3b2df914b 0x85f148cad3e119 0x848d7282bb37a09d0dc6d6f1 0x5cfb52d8ba06e1449f15f956 0x247cadb8a17b182e 0xc131bcdde35f0e048fa6b050 0x84f22229e00682e8f9959bc6 0x243c2123487b8109 0x887947cf0d2c74c79662e6f0 0xd09fd14ab371badd309d987e 0xd64e162ca979f6b 0x6def6a7d6a1f97a6eac17898 0x3fcee63459462ab71fbd50a7 0x77ced2302cea795 0x3ce80865574a0ac894fe67f0 0xc147a8869bb9993037a3175e 0x25a384e430d8d66 0xef10dbf874449062778a2a67 0x56c850bbecc848ca096d4f0 0xa2b6baa0f5c0067 0xd08c7fff71e191b5bf4c5618 0xa86a508100d0e11217200db3 0x1d15d7e3098242cc 0xf3897745221b33a6975aa18c 0xeb419c2bd629c305aafc0da9 0x28481b994e774e99 0x55b30ae9545a26d41a60941 0x5bfb93342169bd939f538e69 0x1cbc7a6778b5168b 0xedfbc1c8b33430c90444b894 0x92b034ae625357ecd2acea0 0x2ed0e273469fdb70 0x4714af33077172eb839a1ba7 0x8f3d52c634fba83070c5d07 0x9ddb2c219a4978e 0xb9680f1799b45e150afecd93 0x6089e118a2cf7f2028d4cce8 0x8caecb0e4513e6f 0xc0130cdccb9b36bb3bd7f39c 0x533cf7ecaef4da99c5c78f1 0x217edc48ed8be519 0xe8a35534af48ae63208d4b7f 0xcef6bf025c532b2256706697 0x126a9ec58c625061 0xb7de0a7ba3ee337a76adb78b 0x2bfd43b48a3c3543f4f6a2bc 0x1a32096355c7e1d3 0xc31a614fd9a48fc474d63753 0x868c276abc6e4a027a8b8009 0x192361c679be3429 0xfbcfcbbc85d6259f284bb529 0xc83d14faaf080e66dcb7c147 0x29c1fa8fdbc0e8de 0x5889afbc6690df78ad0e10c8 0xd5e1cf6c4d6b6a5d922a0cc9 0x2ee9628dda46db5d 0x6768a79f3ecb36a7f51c16e2 0x28011fd46670778b45019867 0xa26c6be06a77a99 0x1aa8180e672d30fcbd791a01 0x321dc60a6b314f15424acf09 0x52098e7616279bc 0x7d07183d759a4bf20e7dfb69 0x2f348c12af7899cbeb2aef53 0x724a487c702fc67 0xde35accf42d29f796b7fbe6e 0xce54e4dec438e9e390abbc45 0x2a131a2d991d9218 0xbbbd5aef61b25f7a2916dd11 0xa2f6d3270daf3b452c077639 0x2d8b2bb64de3513f 0x67e967a991e04f1830ffc518 0x8027af404094c1220c50ab8c 0xcccba1e004153fb 0x27a28d5bc4f0444586079c72 0xa2c9dbe4a2ebe45322e762a9 0x2341181eb21fa521 0x84c8378248825ed26da3d385 0x344cc6971136e567995aed7e 0x2b91ed7ec7342d55 0x5e57def4e27f10d04b050129 0x7ba6446829ce29864342aefc 0x10037325ed9a36d2 0xc78b901bc423ab046d77b209 0xfb6a80ca7440fb59b9248e24 0xa97edb9c6c05b1e 0x5ca43f21eb994c062587605d 0x1cb0b82801609fc50985666 0xdcebc89c0ed6cd7 0xd30c5f266d4c31e82b5188c9 0xee74a67ed51970b8288b17c4 0xc4a667ceebea976 0xfbc6a91a3b3792e0ae615988 0x31b0a52429b550d3f2796a2a 0x25e2fc9d0bda2f12 0x6fae3acc78f7beb46f8ff26 0xdb2149e7e413730bf4989c91 0xbfe8345a1822ee 0xb29973aafa428b7af5420743 0x470b56f6d6f708b16462ee84 0x22c8eeee81515ac 0x2338cd552ef00a8c37238ecf 0xb41bc418ca5d7b5af2bbf5f4 0x1d088c091bb0785f 0xadb84a430613666d323cedae 0x671bf042a6262f93391b689c 0x1389e46a0d08d6a7 0xf4b5fc67ef4899edca0cb81c 0x9539ee0a07570a47c21e014f 0x19c89fe28f4f5992 0x8ebb79cd4044d7f4f4e3083f 0x470d31ba83170166a04527a2 0x1371a783cac91ab2 0xb2c4d70abe37744838467725 0xe506a9656fd6a4b9eb3cae94 0x2196a1ee1d26802a 0x7d5c92cabaf1fe2086f93e6 0xf0880388490a9d251d0da3d2 0x268ea94b49f0acab 0x183e7a5769e14afcd0828ae9 0x642ed41000331c4a1f22015f 0x105a635ef54687b2 0xf5c106f27dc72d21ac4adcba 0x9628560defaae8b312862b4c 0x12def98b8967708f 0xa7932947493ab0600d70e3d9 0x74d94f5e29c708d430847132 0x281c4a75c88fff7a 0xf1e3d1da393a1222feaa59cf 0x31e56034818fc6196aec575a 0x99056270b7575e0 0x24152a9b82318904fd6fc751 0x695753cac34b3b3305656622 0x17a56b921b40b334 0x5189030aa6e499745f8318a3 0x312c2d594c2ad4312e827563 0xf4397377a9fea83 0x2ccd5168473a73643cf3c781 0xbf52dc07c3cac2192171ba68 0x261bc025608bd4a3 0x1679f8646851790a3f69aa19 0x4e80550f555efa2191f792d8 0x17433555e0985d13 0x912414a09ee06a153822d38e 0xf5f6b3fbcf0ff3c53b7acf17 0x7c5d58f8511e650 0x69f88a30f8e7d99b5ec815c0 0xe5235407cf1faff1db2b8b30 0x6db6485eb892335 0x2da464efef2c1fc9a35bceb6 0x68055a937b607a665830b148 0x144c334a9643585a 0x1be7261a3fca6648bb819b74 0x5bf3881892b9e70660472534 0x949bf01b05b54c0 0x5375ca73fb2432dc642ff267 0x46035ad5dffc3c279e618494 0x17957e8aecd4b872 0x6704db1b062889383b273356 0x6004db19f5d997dea7ee9655 0x65c9e90ee078172 0x7e806e5d549b8309709acc00 0xb6919212213c939e4a5f2dbe 0x2940c7fc992a1929 0x5b22a68aa123a504def7876c 0xd9e2d34b769b942ef6eebd6c 0x23bcd34e0b372330 0xd5ccd186bfcbf63b4d51e741 0x79ae5611bc1a7e7507cb8078 0x51b989a016fe267 0xc4454c62ffb407b1740e73a1 0xf51be8124d8587de942e1d4 0x19002ee92e783a6d 0xa1eb00f79986de1c14674d27 0x86215fd4433817724e8987e 0x1f3d64de237593d 0x283ae7d7bdb2751213873a76 0xede9af6f345769d843b3d3a5 0x221b62dbc4779393 0xae455db401f4de2f990f2225 0x43c171f6fdd109342c354605 0x162c996715afb38f 0xcf537c11f4b0716789d43f10 0x6ff540f2e4ac08f04c4353f7 0x27ff4a20cac58f18 0xa49c8e1a2d4fa32384de3a36 0x2eb2bd5dbc7065314bb68189 0x1b969a0633423e6 0x2dbd2169007fdacbc2384c2c 0x2bc72b8e9c7adf3f21f41ed0 0xfbead7960c857d9 0xb3e05191ae500caa04f1033f 0x717984e06e5b10555b4a8cdc 0x1547e3fa47dee36d 0x6a81da4ffc7d398413f19ded 0x401a256e0854c04050152073 0x2267f1c12ad8cf3c 0xc7bff013fdee93752cc2ca9f 0x400d59d1113e3c06220eee5a 0x1609a0ddb68761d 0x3a8f88cc8750b5cbed8a7fca 0x5b7efcd3764341c61959f764 0x13a4e013af8e3885 0x1704c8053c3ec164154f3442 0xa0928f712cb9af363f14665d 0x2c30b42e76ebaa32 0xbe3677221041f957c027a327 0xbf1e1f05be077695c723fdb4 0xe260e5bfc4fdde9 0x7b1f81983bb326a72722d926 0x9779cc0c0c388fb633855040 0x1c0a6002422d51e8 0xb7f722a61b64593289f231a3 0x89c1e26ccae5d33f4ef6cda1 0x20984f632348231e 0x9ab69b21d54f7116a6c92ef2 0x8dcd788a37c32585a6a89695 0x2b83e25d2944c223 0x7a26dba3db81220259b6e766 0x8b0181ce01411894b5c6c041 0x2034301a3c912af5 0x24dc7a2865665209f4bd74c0 0x21ae016438a2cb65e77707e2 0x1d3be23470fafad4 0x6ef57b548e848493fc24f0af 0xad5f50801058656bd0db4a66 0x1ef86ec97ff23215 0x2a9a21c8d59afcf1e02b6cec 0x240cc89f76ada418e87f1ca7 0x6c0418eea2786c7 0x288bbca31d5b6d14a95b067d 0x86bd5e20565a28b11b1d836e 0x11d668866fec65f0 0x5b8f3eae665ae81878f22b8 0x7811b33a4d64ffcf1bf96d25 0x2542d88c9c5608f4 0x9e01917430efbfc17fe90c7e 0x637f569a49dc573939722bf5 0x1d4761a0ca0eaf8a 0x3bd04c09f1dbcaabf00479bf 0x308abbfde0fda94c811d160 0x1a14923c9c1fe249 0xbf1622313debedfaa72f6b85 0xb72ffbc2c3f4a0bf6452393c 0x2317d7ea98b006e2 0x8f064709acb61eeae10cc45d 0x8d091f21145a6c47231fe0f6 0x1d17a1053fa6554c 0x6183336f72fd9c58436a9932 0x73f0aaaca97575bd48b69773 0x2ba812d0a34b84f3 0x8f3a9c7bc9e27c1476c2c852 0x7f7960fc437785039e7554a9 0x29142258ddf5c09f 0xf06844acd69ba713a6982bbd 0xf04f28bb9eb42ab47f9bf628 0x2864a1cbbffcfa31 0xfef4b46a1e34929bec8f0a3b 0x38205fa508f4f577b8ed1cb9 0x2e846ddccb4605ae 0x7e11c2a573979331e6070e2c 0x567e039a0a2784fc989bddb1 0x13cdd838fb3858b5 0xb42ae7da57191801a0debe3f 0x1e1564ef05bcbc41caf9f0ea 0x1ded154d16804cb1 0x1ddf1a9e8fe3cd4a9b5605b9 0x16718979dbdb88e349681aec 0x14ef6160079c68d4 0xb6ec468611f383558c1f7909 0x336950d272f6c63bc26e4279 0x1b3f7b8d803a53f5 0x2fdc81b4dc65ba42c43dadc 0x3e59d5ae9c22e958ba00831 0x1b7408466df74781 0x488c417f89bee60fd58198de 0x5ae8aae42c54c8062e0cf537 0x25a85b6fd0dfbde0 0xbce10ac393f56398e447f1d 0x90943f6af4d7e45fcfc67d50 0x1899b9ac2f78817d 0xc24e0e268981b78942e84ec6 0xa3e003154c3e7d96be5df7fb 0x1aa4b7d55ee56ab 0x65172348b4c24c53d2fd4da4 0x82ad7b612fa165a4b80830d 0x1e3929646dd4dbcc 0x6e941bc3335d9c0d91b72c 0x3262ef3b429cccdbb3697f8a 0x1d4396ba7cf59137 0x3bad2642b6b18b66a69d2d42 0xc3e43c8d079c0e401c02dd18 0x28b37445a14f5790 0xc259b53b28eb11dfe8d0ec6f 0xf709c3ca09de11d0166a9784 0x1d2a2fa81699be1b 0xcc5a6d6d9f807af2fbc048d3 0xe97ef4f3fc6b85af3b84c42b 0x1af954cf211c7cb 0x97ecce00da988041769fd8e8 0x78165f49a657855397920aa4 0x530a7b08d8157d0 0xa5017f7d923b376355ab52f8 0x4e61da80790c217c382a70b9 0xea63416221fa7d2 0x4a587bc08aa15377afd06467 0xe88d572857738fdc07604a3c 0x2bbfdf03cda5ff9b 0xaca4a8b7012f473564a24cb6 0x15da6ea54c89a717e9831620 0x185b3b746bedab7e 0x2c5ab4a8da80685b0d49ad30 0x3ac8ac13cebaefb57ccd74b3 0x279f44f570d29e6d 0x801b0f03f2160d86b5063e2a 0x4df5e6cbc3e7eadbdf255318 0xc234ffc20382722 0x4ae8014ec6b10f7e1e53716a 0x813276b8e614ad9ed24bee44 0x2801c04903bfd5f1 0xb11132fdb6970def145af512 0xb5c34bb9956e15ee3f782e0c 0x1f3c382f6f535fa2 0x5e1da39d8fe2a2bffc1f1b56 0xf7de7072e5487eee300d7f0f 0x2c538b427a36287e 0x1cebb5bfe6b3d75547092810 0x8750c27f9a48c32b2fa096d6 0x129702ff58cccd64 0x783ed1ba8636522e6c4d7eba 0x3f6dc8f246dae0f83aeced17 0x8217b5743e92cfb 0x8df55a5bbab8863989556ab8 0xd5debed19451b25e31695365 0x17ac76c824b1d6ac 0x4a14f367cf1e041bf486e412 0xb3766cc489e7e0d88689af 0xac9b6abe7d58653 0x23f203c844d8e112794dcf0e 0x5392969676a28db4d1c55198 0x7fa4d2ed16a4471 0x315cfb24de5a8449b4bc2eed 0x131f9b76bc663dd8b1c0e443 0x1552acd863cd7d5c 0x8dc6082e16bd97600b81f248 0x91c05deb215d5af4e250b572 0x24f74b92e0284861 0x9c5584452a429436ff1068ba 0xd0411e5f9655ede680d2ebb 0x84d4c13c6bf6b31 0x5caa82d907a23dbe8e3b743c 0x7ee6e722664098690011e681 0x2e114d5aacd431c6 0x8beb8286185b24dafc9eb019 0x5cb03a79bf1394c93c6e3539 0x2aa2dd9b0229859 0xf02cc88ec1bd9dd7a7e72594 0x7c9915828bdb184d57d2cf2b 0x15c680c55ab2aac6 0x93fe87bdb385f9ab0482d6ee 0x9edd130d1d34b7ae1f01f613 0x1eff76f8e78973f7 0xdab7b4a10cb750257277648 0xcaf6d957a30cbbbe532a8c12 0x312630bfb2c6c28 0xb414a644ab865a4424602e9 0x4e43c89e87d83d4834d6424b 0xde5875e886d945 0x607fb784b0f65bfb723be3d3 0xc0a54b2414a264cf91a848f4 0x2818746ff3058edd 0x9d74ac5e24757b5791234d18 0x2fc9be67eec1012d92dc12c5 0x189c1bde64fae37a 0x740f42486fb6f770abfd1e2 0x22e84dcb2e96aea7d84533ad 0x247da657d6bb9d21 0xd724d0ada9aeeb98cc575db4 0x393ea029a46e01be02936d41 0x267ffa4b3db51695 0x8f1d5152ac05f71ecb65768e 0x31ab915cb54078f10cf72421 0x13128ccc8969675b 0xad2da25e0a748725b5e9828e 0xd8c268b6f799d6eb4f939753 0x31f64168fb6221c 0x3849c7b67c25210b3d47e181 0xa45bbcbca4a9b2fd199c55b 0x3b149a318d0e31b 0xc5fcdf2c91c2cc29cbead35e 0xe7bb966938e5c0495befd8da 0x2ba912ffd280de44 0xe0e7d84fc171425e523a2d3 0x9e0b0644774b98a085d80ebd 0xdbeee035875fb89 0x9555a3d8987157b6871ecafe 0x97cf53c6ff274a5a8d9ef931 0x24f04e899895bb87 0xaacc52aa3213484c145381c9 0x4db74b2c41335f35c4598556 0x2b1c332747b7f2ec 0x2e22af926b2e056d070e1f0c 0x69e5c4ec6559c8690997ba52 0x20e462cd4ab31249 0x94b4f169560e8ff91f6e85ed 0xf80fe6f2ea96ace8925fe10b 0xfcfffc4d9d32ded 0x3b5827d20dbd464c64728b33 0x178c90cf3a5e75e3cbc72a93 0x2d8ce391f092fe2b 0xed2eda335d938146e6ce4f29 0x459f4323c1ca6d043a2c1971 0x27743ff7caea6101 0xf0322141de03fe236a25bb03 0x8c3a62f9a1ff90db90fe06ab 0x228d3bae3c2c1630 0x7cfe5085bb7d3b65aec99fc3 0x32522c5a20211ab4c4cadd0b 0x14fddf1df5704350 0x89a9e45783e29f8e9371f17f 0x582ec1311b37deac6ae82842 0x2f9a591f329684ed 0x3bb94877c61dffa1bf778cc5 0xb5146ff42c9c7307846d1e5f 0x85597b478313589 0xb7b954ada5ae823395131f3d 0x943a042957d8f0cf0d7e7d74 0x1ab94002b4272940 0x5e2ec92d5557a8a497466fed 0x8955323d70cad9abd6a8d6b3 0x26d6c63d7bd39531 0x4841cb047fc9b1dbfd1d85c4 0xd72496add337e78973db46fb 0xedbacae16247e9d 0xd7e6c5572d02a96938438f84 0x42cc2050148d481e7587878a 0x209048e571ea55ea 0xa5e0345c4300eb3e632720de 0x46d4e1678adfd0b1c52b3f8 0x11bd0523263dc8be 0xe878f1242eb9c9331bff664c 0x1c09a240da01a443e60a9b85 0xf9a759cfe3b71cf 0x55f57708115a1ea4d27ef44e 0xeeda9c1a044f4b864fef072e 0x1c05a44abaa91dc6 0x6e42a673bf10a09d17179819 0xf68337f5157221bf30d92874 0x813b2b831a7dc2c 0xfa46032b3829b6c53bfca212 0xa49904296095be35cfe72f67 0x2639f45cc6577e86 0xbea4597d8b05074ce2425818 0xcaba97e086a1f0267355ef90 0x2e2b19d78c7294d6 0xdc10af95812eb400d76bbaed 0xf966b5b1861fb3824dc9a739 0x2b182d0a55c0eb4a 0x9d57d6211ccf51e3a4a841cc 0xb9a04e1e316c990e4e5874bc 0x2621c7463b2e5dc4 0x57b9f879ed8903f8799ddff1 0xb8671a65c6d38cedec4ea1d2 0x199efe09ba018c2d 0xc3187c4591d98a971c0c059d 0xa3ae351051466d76033d7210 0x32e02bb63abe0db 0x9126af1857fe5ca8c664d684 0x2fcda9e260bece5becb61438 0x2f0b3a05592c3ff6 0x10850b0149e031cdcafb1a8b 0xba9c6cf959d3451e4e10c397 0xa6953fe001c512 0x79332fbfb16397af2b5440d6 0xaa3913817479db7e180b036f 0xbde229d827dae78 0x1c3c8076ad0a700f19f36a08 0x147bbd40344a904884bdc822 0xc3a374c5f86bc4a 0x5cf63c2bb60644ad5615a821 0xdc9e07ee1fde97376e9690eb 0xcfef261178358b4 0x3bd13ac6a9a555b679682ab5 0x338187fcfc3a56f6a08ad949 0x1c224f124d6cd6fa 0x72695ddd8d05d28af117c8e0 0x784a66b23b7fadbc14d524f7 0x1d2348e7a9d64418 0x85cc8cffa5504bbe4415a076 0x57927b36cd32935eb3a2d688 0x2bedd8289c48f616 0xafcd7ad59fe90c6c2a581bec 0xf589c73393d771874cc62dbd 0xd81036daa0bd7b3 0x734e674c490678e48c2590ef 0xd4b962dae92b0883059b0136 0x215dae8917ca2cf9 0x950476cc7c54d9c80c11c753 0xc6807bdff946e86408549518 0x25242d06d2b50c91 0x358e4a5513223683b09fa55 0x65925c7f4f57eae4d8d86c1e 0xedcaa900b79fe4f 0x665ed16fdfacd61e588e9850 0xbaa114a46f354c0e338f0f4a 0x1ef99bc6a5d6bc58 0xe36840d69b21202d191528dd 0x16dffe4fc610ae03ab7cb5e 0xc101b76b698836 0x26c2a06b7e86c1eccc4cce0b 0x5aeab217427adfff179dd966 0x17ae4d419cdfc968 0x761b6576ef526213d6f4f8df 0x371edd0e1f1e49b5758c8e4c 0x203845e57573ba21 0x8c7df991457e06b12b6aa814 0xc696b893f1ac91c1321ee60e 0x1fece27b81f7ae5f 0xded0914fe7db94eb9588f8a6 0xe369074b93bcd2d71f72ee62 0x1e03877f03d90413 0x8fb01b06fa1c2655ae57d185 0x4091630061c56250367ed10 0x25bbcc77100ffb77 0x11c9647760fc6144fdfe9112 0x9c47303a455232c14618fc1f 0xe00ac5871a29e27 0x1f97525859af535f915259da 0x9d1ac403c41514282f162979 0x280ff4108194889d 0x3c3a850755e1b57bb620c9e7 0x320c90661e186770ab810b46 0x1f27a585641a6fa 0x3c9b727b050c515a4716c1fd 0x8445f3449a8e2246f0156f45 0x7a6d8a7c20b2504 0x40983304063d49ea6aff0cd9 0x9a9b237d18104faa4320c3ef 0x1c9649abb745878d 0x623b2f2c1d20024ebe205240 0xaaccd602a40f769b7731280d 0x29c4407d098125ed 0x9bba89b933217f950a4da736 0xcc9c61a00e91168e545f0df8 0x125a34f9ff08c637 0x36bd45a2bf84aea1d8a9795e 0x3b1d3d0b449614a122769f4e 0x232ac6080a75f09d 0x81a015e6c0b1b0ca9895c8da 0x55ee3b739b61f2d9ab51dec9 0x2b7e549999ad844a 0xa0ff12f798bcc48218d3138b 0x63334053a94db9a94b4163fb 0x2c5c1df3ef8cac3f 0x7738a1472561d6573d1fc4da 0x10f00f9c240982772730fefd 0x1d71cd17987c7d60 0x44cb61785b134fd33802a26d 0xe7d350e990859bdf7977032a 0x14329903439280fa 0x49eec0d4bfaf77580b5924d7 0xff7123a5a8974320928a792f 0x2aa793accd2f8882 0x893d4e71b776435fe3b3c5d4 0xe55ec6aaad9cbc7660241ef6 0x26870e3428da1554 0xefaac0b02c700f362e2227ff 0xc338f0040dc47aaf465981ab 0x132115432cb86f40 0x68cdebce41d60087fa5fd98c 0x44b38a56e685ddb44b598584 0x2b80f095f3ad33d2 0xb6a669ba36387bc94f5c4586 0xa7f733dc381f34f63f1aef74 0x304781252960882a 0xe2bcbc20ef0d2698590edafa 0x59df5b21ceb704ff1f81ab08 0x691df3ef70e4c68 0x6859787674d56fa1f279683a 0xa6dde101487c8d3d4ef27aff 0x2d37984c87cf2993 0xd01bf7832a5fa8e39da576b8 0x7152ca583c2b0c6331a67ee4 0x25996b84e8b8164d 0x69fbc1b478cf571076963dfe 0x82ebf6cd223ef57d10db8404 0x1f0e24d3a0e03fed 0x3639e8cedcbe61638cbd2eae 0x89581f998205186f5e120242 0x4014ba767175617 0x6ce16184f687054c016e9798 0x3a9dddad43ae8521ee90f063 0x1e4cce27b86e8a8a 0xecb53f23d247a8673c85ce67 0x39f224726d34d6a5d8be92bd 0x23dec6a0bf17079b 0x67829d5c95509bc701ed8e31 0xa5ce64b51f0b3f957b599a91 0x1055e299ca971f0b 0xf87944623325a5fcf0c0750a 0x8fc3642971a490c061bcab3b 0x19cd3d838710bd3 0xe8dd30e98c2f99a2e7310a36 0x9c1d96ef0a1322964798a8e5 0xf085168e8f773eb 0xfbe7d58789c96830e4ac640c 0x7016112502832eed0ed0096c 0x2d6d5007439f9d97 0x134dbd278fa0a0d95bbf592b 0x879e248f11f855957bb2b194 0xcd66e35c09aea79 0x99df7e97033200844c071ab1 0x1d1ee8f7fb674ebe685bdb2d 0x24f5c744aa0a131a 0x85f8c1c0930be32f88117596 0x7c95e8b1db3fb30abef6fb26 0x96d8a5f03a54b09 0x808e85ac20267965b75bcffa 0x82cbd81df1399af668609688 0x14224ae99184541c 0xf7fe82f1432ba2575962935a 0x6580ddbb6a2b6e2d5c8263e7 0xe82df38a8bae887 0x6992c6d0b53eb105bfdf5179 0x9a24e1c948113ff672baa83f 0x28bda09af7ad28d8 0x3a16bbd39848da8396c116ec 0x9687e58af9bc7aaf3eb185fb 0x16bf096d88fa2c7 0x2fe377c3070a70a6b8405f46 0x4db52166ee3c9a86d8f5bb98 0x1a9581dc1e7dc478 0x962b9ae5414d0952107262c6 0x92be066a538b616850bf0c8b 0x1f268529727f9ced 0x785de58d7d65850ab1a67f4f 0x6f26a391259de6171b157f8f 0x836fe6173cebce3 0xf694d63000bc4774ae6a421b 0x5be1747085a01b52844f539e 0x1aa51ed5071168e0 0xd260cbfa5d22806f37ce740a 0x24c6b1057922340739abf774 0x176232f9e5f013bb 0xe9b7571e383ff47fb09add39 0xaf4420a8d73dd5dbe0ecfdee 0x3f49ea506d56749 0xcd2167431f21a02e22e7ea6 0x1d0457d350e8a33fb8e3322e 0x2721b33bf2de3ec8 0x8e618476a9602b8b724b1d0b 0xdd23b0b566848b52587bb601 0x1c28ccb53ba82319 0x3a162e02bebd26eabdabbad0 0x904e7b96f67faff25f8b8182 0xe4ba702a3bd3518 0xaf446eeb21cbd75867d8ab0b 0xf857ed65a14893fe063622e4 0x3ceec7fb4107619 0x7a0b5002b69a9cff60db1bf1 0xde1ca28733e763c0a2257c60 0xcc26495aedda7e3 0x7dc08152689d72bd29aa1bc3 0x918dace64c1ac126bc4be2ac 0x36ecbf90d70c8b3 0x4a829f5dca00bf5b53ce32ea 0x32285165f0770f1cb522f94b 0x28d832cf7123c742 0x4c4d4a223eeff05c647e9753 0xfdc59aab9f9b22c3deabf819 0x12b56baf284df18a 0x82925cb29e7fd70da6666d12 0xdef73a6032b5b962c7a475d9 0x13ecd18e2d3dd4d1 0x5c6b3b642f6984f7d8314eaa 0xa374aca2cd9d868069e926ad 0x407df336d23501b 0x5a1773bf1f8aa7b497d00b4e 0x4219d81ee475e43842fc5fe0 0x1479bad1ba5c13d7 0x3dba9cb83fa6d249e2b350f1 0xd169df072d10dab404c1f9bb 0x2345f61f97a2b2a6 0x631f8592fad0ef5a56b5ad24 0xe6481289b9585d6f16d3d9da 0xe4edf1d289e2022 0x464605440b200f65d95ed837 0x46e65bf42304c063c8f15b94 0x16a10296f33ef73e 0xb042fdaee355a6b893f738da 0x1fd39a155850789440e003a7 0x2b3d4573f08f84ec 0x3233a8a13de8825eac4a9ae2 0x9fe57847387e651d4885374b 0x2db5e13315c86603 0x457f10a07cc4846a5753fe7d 0x90ff323c9c98cdac6c2108a9 0x27c3b81298af5557 0x108f7010e5f2c71a6a65166b 0xecac05acb9ec29235d367471 0xdb3069a79dfb67e 0x215dd9e074d4f42cd554f625 0x22c0d60a9347784a79198be3 0x245ceaa355b40370 0x879dc30e3229c5ecb30c80a8 0x441d4907e3afd914aa660b6d 0x32869537e4ba43c 0x84a64842d7592d98a90087fc 0xe96d9754d6b9259412d9a8a4 0x19c04a58bb729898 0x1a99f5f667582a8cd1c8e622 0xae3bc938dc68c438865282ac 0x15b37df75cf88b3b 0x9e682a2cdcd21d5b89d76ad3 0x221b131e7dfe00e18ca94e8a 0x75f107f7d34b703 0xbf26c4cdb4009452df2660d7 0xc07d30f48b619765d81eb2e4 0x25ac8efa3d6226e2 0xc9a4a6bb6c4b566a4f8c9a70 0x7df5fd630d6b548cbcf73f4a 0x6c6ada69107e50e 0xde90504eed3ef46bbbf5285b 0x75b4b1694e001edbd165a9e0 0x20a3664e01ca877f 0xc1bc16a7dd7df2195401f344 0xc86897b3ded28770a8c26913 0x26a99eb7d0dfea28 0xb0ebb4304a0735b4a5b8432 0x839a687b8ca279512edbaea8 0x15ed2943bcb5a067 0x1aaacb51418bdb0fdf7a2dbf 0x4d26120382c6ae4e42f5d745 0x286780475a68cba0 0x61d0d9b8fe4578cd7b59ce48 0x851b7352155e2723c7f4e979 0xd6d4f74564c0b78 0x90ae6e88c152f0cf9e6e9719 0x4fa10e5cf7ceec3c01a7a983 0x1af0d8e0d2fe7441 0x40310bdf2e1c36843424c4d9 0xd571481ae42176264fc0c4d 0x949c7387b5a03ce 0x889dc625aeb982be4e0905ab 0x88e5ea7055abc4d11ef35df 0x2d63f0dbaf73313 0xd4f6b873eb3791972cf80e81 0xfc8e09bafb3a24aa0ae2afb7 0x6b2cb7776f95fc6 0x73b66ba15956713210538ab1 0xce98a490bd41331bd01767ff 0x12bb56a5bd167902 0xaab97d4ef2fe0e653cd4db4f 0x7d58276b9a7931fa939eb2c 0x8a4ab1543939f83 0x15d46cd1982d465c94f3cace 0xaf3364c56f88efd69fa68ef6 0x1fc56209c60d69b9 0x17bebcee6f60ea826280fe81 0xd4c85995cf2c350c84168c53 0x270f38fe74462990 0x53b5f30eeff5f44a120a2e81 0x85c53f285b5770bd950d195e 0x2c03292c76a439cd 0xa200272423cfb2890c16fef3 0x17aafbbc105cb92da904fd56 0x2ae3f14102d27c3 0x9b5ef8fe7a12c7002f8cb0bc 0xbdf2add7d81f44e714e4bdb0 0x3014b6636c18185e 0xbe 0xf470b5a840e53edc7b7fe7bf 0xd03fc86552fe5f6c7049e527 0x1ffa3b3b7d027f27 0x5d65e18cd1a19d22e037c1b9 0xb2d2392531237936b1cf4a82 0x1cdc43984dda8137 0x407faf8f4e769815d734c48 0x51c12e9f92b1a26dec2a386d 0x2baa55e6f96e544c 0x861937d3564b7b6855e00f27 0xa33a3930c7ef9d1fa85688ff 0x29370d3e73fd48f1 0xb52c170fb2887cc3b858cb48 0xe1b3f67b4287365a78cb0b3 0x234766f2460abfc0 0xc0618429dc34b1d9ab218736 0x2044a50d5fc7f906d83936e2 0x1e063226b8aed800 0xac4bb04fb4c670e797dacd55 0xb472d9b02e5dc9975b6edcc2 0x29b19fab8807d8d0 0x46b9e755767fd6c69bde1468 0xd423bfb71daa47cc7afd2182 0x1e5e5103e6971574 0xd6058a0ceff2ba1192e8ed23 0xffb36c7ccb391f4296c3ca3e 0x23a958d148e68acb 0x35e74e6fcd2809ce8b563090 0x1969659221ff4fcaa7f521fb 0x1f6ba8eb4a232f40 0xf37b2228fc0ba7e9f1bfc611 0x10c8955e052cb0e5c791ad72 0x18e3c1b0db1d1ea2 0x8be4634bdc8b1aaa60622393 0xf60839d02b912390202e5a50 0x2c8d205159dee1b 0x697cb2ba1717027e9959223c 0x86bd5a91e38a2f3c13593f19 0x2c0cb959d187b996 0xb22efe7699ccafda14124ae 0xa17a008f2a565fae6b904854 0x14009f26f8557e5 0x2a31a28b1b718460e68894c 0x72c03ef081e5754c9ebc8d7f 0x2a47892f7ac0f6c0 0x422013274584cb774ccef21e 0xb46a2199295f1ac83e852f51 0x1b1c2ea00512b225 0x5f883c0d3737dc672e5b1200 0xebce4d4d207090298eab8137 0x67eb673edc70bd6 0xbea765872117f3501ac0949f 0x25cf00e246cbec82ff5b5f75 0x9e2ba76487b9d1f 0xfe8011d81334218f1abc304d 0x50f6c9549bc7ddb61daa993a 0x1b21997403112dc4 0x9692ab9cd391f5ae03b17c2 0x4be6a364e751d9973f2f42e4 0xd8571172c1cc0e5 0x58b31858f294ad4ef0a8261e 0xd82a6dda36cbfba1ceee5df1 0xcc8155be30b1d3b 0x31009dfe4878216d5d9c62ea 0x23d50f0e7e27dfe69a6f130c 0x15e6ea6528811799 0x3f8d606d63cfb9bc2b7e1b31 0xe6df5f9893ee193cf1acc1cd 0x15c9e05458716f1a 0x796af64a9c13971a6845add3 0xe8cfae955dd17bdb8583f0ae 0x163e6f39093ef8a1 0x4c360e0e96d7fe250eb35a8b 0xff32fc8a83ecf3b211c51de 0x28079af20595672e 0x7db765b45a3202b8171b2c8c 0x5bb3f16a9f62e657f56f9adf 0x10e2a4acc97eb125 0x97ff2eb45b2384c2fbcc7476 0x111cca274772bcdae061ac7d 0x19bd496c6eeaf10a 0x5a6ae0d284e820a945c61760 0xa357835a31baa944fd79b388 0x2d0629966da3aeaa 0xfb9b2c8df95a44faef22b228 0xdd21a031e564cd29ccb092dd 0x2bf4b110f5a16239 0xe0d6d8b43552c9f4a674ddea 0xe319bd156b7010ca77374e30 0x12fbd6bca06e6455 0x7bb5275a45047c2ed8bfb06e 0x7e87bdada507bc4972b2eca7 0x2c65e565a9c1190a 0xc56b450f32a15b93ce874be3 0xd4b2606427f4b51405ae0787 0x11343b3173b0e724 0xb5467e42aef4eff709decd1e 0xa9d73ec61fc34b313a4cffc9 0x285fa5070a8d516b 0xac65359a0633f1fd7a41ea87 0x6b6919c8f8d677cc53766c0b 0x1abd8bea5f8c68ad 0xb6435d41cac408ee2a8a9521 0x86965ed350dd3ea91c56bb30 0xceb0dd2b3d7b7b6 0x4236412bce75f2042fe7f9b2 0xdf192cba0c3aa1682aa1f79f 0x6f6848c47029e62 0x1dd1fc5416b0675a2a9b8309 0x257fac8977dd826e10d9a690 0x9aefeb6837c0e3a 0x9a42eb8d9e13dc00d109d688 0x2c8f7a2e8139f5dddbb05a5c 0x3b45156b4bde0c0 0x6589eaa166da56bf788c68e3 0x133a767524b8a1eceb9cc96e 0x7fa469e89867c46 0x8bcce6c0b36bf4cd7ed6d22b 0x1b367f9243cae1b0874ae26c 0x2b920081cb333081 0xe18f90596086bf9fd0de9544 0xa97c40432125ddab558e370a 0xae702b61ede4f83 0x6297e7bf21daebbf3f2e4911 0x37a4ccf8a80a56ceeac9d390 0x1f90b2521a7bae49 0xc6a746498655b71a6860996c 0x313aa25afa40ecbbc0fde520 0x14d043c9834e3885 0xa437dc48ebaf674f4ef058b3 0x94f7fac798127edaa6870608 0x1345e0ab5d9c4b7a 0x48adb73db63f2438d18079d9 0x89ca8b521a2fabf1610a83a2 0x16d2774a5acc5558 0x8f3e6d9e6cbb50dd32518590 0x415e5d5a31358cb7d0aff02b 0x21b85d4eca7b34b9 0x2fcdaf92e74a10b7b38d6008 0xb018b3cfd5eebd707994002d 0x210395ff3c92c2eb 0xc713162a32e0ee938eb72f13 0x790ed0aa7c1600ba4b84c625 0x8c9a4a49462c7ca 0x755d59c67ac5eb3c9ea1bd8d 0xfea82335621244d346d9f8bf 0x2a065d2aab28df13 0x3d8178ec8320ba573a433e18 0x1fb9e7dc8635b21435f9da9b 0x2c28da8cc47fdca 0xaa48d08260bdc4b6ab2eec15 0x44060d93d8b6e2987b975393 0x151566663eeff36f 0x711fbcad6367050c55df9144 0x970c2a4548b985bd0d517537 0x2cbd8f5967ac91cf 0x4dc1628424273b9441a0f559 0x2f34c1dfe4984b2cb25c3097 0x19efc9317e805e05 0x7e53cc1ac917977b235f2914 0x6a45c9440336bee473a130ca 0x213771203aed2b15 0xc4646c86117fb7860e9945f7 0xf84372e2e922f7c042352eb1 0x23d5e89244eb035e 0x78a3ed4c0ede18f0f186ae13 0x774a4cc9adfccbdfb8a843e3 0x30312d2b5ca9186b 0x5fbc954e96b526320a875010 0xe53533acc8f9f807b5b84927 0x2cb4ae99766ccb51 0xdefe31b08ff6d18ea6df83f8 0x34a3743cbe7e47c91186e757 0x2c742915f70ad8b4 0xbf792b6ddaf718aa3d445b0c 0x297c820b52b3a8052f8660d2 0x1a81e3eeacf3f1d9 0x882206ca505a215590106d81 0xedfd38b2e63038783a526c12 0x26d5706e8f10e914 0xb99d5177de8a116dfd1ebeae 0x30fb7a4fac7704142929890f 0x8557fb7e96c916e 0x38baebf50050ad7e785da0a9 0x251f03e026b72806a002a5e3 0x11eff1b2f7ab72af 0xf6e58b58d257b4dd34409df2 0x7db07056f744040ea27d11fa 0x14d8a19ee3ae90ac 0xbbf70e34dd9cc6cb915394e 0xeac3f337b01d1a9dec6b2ffb 0x2fbc7c263356b017 0xa2a3488ee53a49565db5154f 0x94a744e7e4afde39562c4905 0xc80f41a269bfe8a 0xd19639cfe34292ef497191d4 0x87e2ca0e07fad504e063814c 0x303d0a4228f627e1 0x7b7b4626f06a2b0c3f740483 0x4544c2a1641b48c8df41dc9d 0x54c4cb94fe71fb8 0x1e682fa8a53949ade33f5885 0x2c1f46f84fa329f810ec9659 0x14a724ab1850f68a 0x1662d1b16910280aee82412c 0xbe4cb9dbc8220f2d6ae15c0 0xa32ed9fa2b38a55 0xc37b4073da276ef0808e336d 0x7a6ff6026b128f3820ee3ac6 0x20628628465b28e4 0x781a62c95ad5916c4895fa0f 0x1acfc8b9f93c3e36d8af2dd5 0x13671a91e3338a39 0xd5c874039402d5e95277c5af 0x6dc909a7755e8e7d64ecb574 0x2c28d760d412cd21 0x6ec9f68223e26c3894b66131 0x5db7cd8e925f27ba18ab0e12 0x2efca34fe528442d 0xc21e68d7555c840b43c76f11 0xf094b109e9345cf60db2d395 0xb5f25c313d7a1e2 0x848f9079fdcf4742cc97081f 0x247411f954779cef6474c370 0x1da7b3db01436cf2 0xd3deaff8a59b896349f9634 0xac30f7c31e7eefbd7ab5d1e3 0x167c9aca3dcfbf71 0x1c13f78525bd5c5883492251 0x3ff7cf50e203332a9a48edc 0x1d14defe30453e33 0xbd26776b2438522bc2fb7bc5 0x16c38ddb25608a1646049a65 0x248bb157197a2a18 0x787ceb1b528e1521d944e6fc 0x82a114d50b2a9702290f5f50 0x255d4c367b902449 0xcd905c26d107b415378c208 0x9b76013379cbbef88920d0d9 0x396c5b405bc4736 0xfb43f9e5ef990e75a303b374 0xf63b9b4b7977402fd0a23751 0x1230224b725fd5ee 0xfa7a5fcf11912db0be52cf1f 0x7f02f266825bac8c3452fda6 0x303260e4f06a89ac 0x46c82b69353402cd1fd49329 0xa49addbfc889c238948b9fbe 0x1f411a8b9fb84b93 0xf9069012654d17c7e0d5160a 0xaebd2cf0260e5ee0b190d26c 0x24b0c79ce5bf9e07 0x595a902149fdaeea343e3502 0xe8729dfff844ea89a783df06 0x224ac3c19ee6df45 0xa9ba6d412f5eb905bdd03b85 0x7664025ef70118bf822fc2f 0x1b0f633d74983dd6 0x251e84992c4434e6dea326d6 0xcdd859dcc9ffd480f1aa3927 0x157a9aaaa67a88e0 0x705e0ce60bd43b52857675f7 0x5634b19e69e196061473baf2 0x20edee5bc0d966cb 0x7edde2f4b5dc15102295b041 0x25479423df9cc1f4c4da2a6d 0x1d536c0f2d592251 0xe0e58e26102a1efd481fa427 0x47c056fcfa8345ddb395b181 0x41463579b410649 0x8671c276c337f0d67fd4b767 0xa390f4e34273481042abcfa9 0x19082adb22a76785 0x48f2f66d70c49948254fcada 0x18a7b26cdb8cfcd29a5af574 0xd385dfc1725db8a 0x9731a3524738fb2a2ade94 0xf18a0f2be181c0e2d5799772 0xa9a508d149df77 0x2cac25654f6f3520d41f51bc 0xae1e97a02a8c207a2362d5ef 0x2854822a831df60 0xb3a273493fc56f969d02689d 0xda944401898f74137792a47e 0xbe5ecba66570e8a 0x47ded35e5fd09eaaae983289 0x3be3c65ad326be966f5b3bdf 0x9b73fec43d95360 0xa9c94e9eb1e01eab1738ec93 0x1ac99cab2f7f8a7610f4c6bb 0x78789fdabaafef1 0x13810136a81289c29b48b095 0xd0d069eb9e68c67777f7091a 0x1fca0d795ecfa7e0 0x22d7af31cf897ad63c5f5213 0x47c7030cee042059b6e3577b 0x1c8c21105f7cd6ff 0xd4414517bb1b22c4a83284bc 0x28908dde3ae29858a27f895a 0xb2d6655a08012dd 0xcea0bc1ab656b46fc243392d 0xa0456c77a73015926f7288d3 0x1c362fc86f8c1d0f 0x2e565ee8af739e4bbd5e38db 0xbce29a4d55d14a24f4129745 0xd3c12d9d9d739c7 0x7d97750dc38f3abfd3d95cf7 0x989aaf3ea9ceda9955020b38 0xae8e94f9a303122 0x1067f352610a5f0a8359abb8 0xf9ad807f6761d7c81c4847e2 0x24c07d9328ac93a7 0x2ef3565be909a8969147aec4 0xbc3e2434900f2c41623aae66 0x198795b30a138234 0xef23931e156aff3085ffa169 0x4a2768ef7cac473b0a7675e5 0x2ae2aec518df716e 0x23fdf80d710a58367fced932 0x4b3110f77861b2235b13938f 0x22b3451e2aba5fa4 0x489f16ab0f6615b7c0d19f73 0x74974a86ef5fc0bc57aff13 0x1cd61166b6ccb3ec 0x30dc186ddcb7aef6adaa8674 0xf8d1438e18cb683bd92427a4 0x1fbccc2ab592ed23 0x5d7738ec9f55c1f7643f66f5 0xfd42f4cf748188230b046ca7 0x24ce5c478d90b4f1 0xbace1eca3d4eedee40223e0c 0x97063b3d2a16f38bd39c2164 0x295c982feff17dd5 0xebb080a465c9384cc9a14706 0x3c085a42d48e4b5ab4e6e451 0x17f3b5c5fa4b6067 0xc39d3a58152588cf25e876d 0x3fbecb7fde8c8dde6be615d9 0x1fb8449a8c0ddbe6 0x78b44711a98a3f7009635c04 0x58f519c3e9c701820dde1e46 0x326955c70081484 0x308a812b0d52741fb86e6e36 0xdc2c0f279347d4ffa4b66b94 0x18bbcc3129b8f07e 0xe939b4923f0f4cad3cc8bab9 0x42aa047c4599f8c097081310 0x14637f70dfd9744c 0x12c7d7250728f78b7c6ae4fc 0xf52054abda265b632548f41 0xd4400c7e62b2e17 0xbd07a8c650163a134c9dcd21 0xee43185686c4140abae3c04f 0xfa5bda5f5845a30 0xf12af166986aa927d3bee4fa 0x64946727a0147461cd2fbbae 0x28eff8b0dd117cdd 0x625e1ebb0a467d2fa3e160f2 0x5d9bc850a4c1ace51b330faa 0x274890368da93ec7 0x262e259ade4489612ab93dfe 0xebba03f70326e4f8866942c0 0xeae132e1272d51b 0xd779f287f4a7e8bc6af4fe21 0xa0944d836d4948e34522a7f1 0x901e46c5763df96 0x2fee4d9e836a0b206611e20b 0xf9aa57aec56c665085871187 0x6e5c856bec75f11 0x9052dda690ce2b0b5e035adb 0x6774eba392a4bf969f69c092 0x168d77fe201f9d8e 0x1912d68caf290a5619283e2c 0x33d2feeded410bfcdadf368a 0x7370e0483bcf693 0x559e6057b3343663f5d100c0 0x314e98ffbf39d185a406f2da 0x1d6356ef82b6ef58 0x4eda86f5a76b4ec05d118838 0x4564ccaff026990f3fdf2514 0xfe99d9b2692ba5 0x3cd06c15e90bdcb9f7108c8f 0x5f5edb0776fc6741a4c9e1cc 0x72691274c56ff9b 0xd7bb60005edd4b46c84915e2 0xa5f6dadb8bd2473bf8109b9d 0x2c85db152ac96a94 0xca504f5b903ca6c7be8f3e41 0x2cd2faec6e2d119b70e8a76f 0x1e289334b44620e2 0x80c7c03cba28c8a5de7537e5 0xa0bf9053f68500eec3a5e445 0x7dd3a63e1689f58 0x32a6e0f5726cc4862bcd3115 0xef4dde28bfa4777eaea30e28 0x5d51ee1fea2599d 0x2f917c0e966f4d66bf9c409d 0x41ed268e84f09ee650f8dba7 0x1cd82511b8140c50 0x14011024f00040a44f515220 0xfc037721b586c8e64ec3f4bb 0x9e6f577b268e123 0x33f3b6f4c03e2f9675225200 0x5eb48a3d8a0c6ae9de530884 0x1802f58b01f0f9df 0xb33c0a8df8425f666dc4a325 0x1fd604a845d97b9d1a6abfb1 0x10d0263aa3966f27 0x47647f8d8cda848cc561ee70 0x504552e8bcd10aac1d22c5de 0xecf446ccf8f2507 0x14e4e90342ae39a37239bcec 0x9c591b8b49c877601edaaf34 0x184d75f770ddfd6a 0x7bd5d8ae454f82eef8f784ca 0x3136eb38d4d6f42c2709ba07 0x4a631f41a61899a 0x12d3ecd8ce3de9235f6db4d6 0x8a385bde7951bdad96522d83 0x118fcc33fcd8f29 0x8fa37cac496982e16c3f3d1c 0x2a4775dbbedb9aa90c5ca0c9 0xfeeb07d13d4d072 0x87d4967981eaebab0c1848b9 0x34dbf89140716d3cb59d1178 0xfd17f7470bed0b2 0x438964daee329d9d4f25635e 0xe6b8fecbfc3b43ca353a4d85 0x1f6454550d171aec 0x86bd256783731516e12d841 0xf3a598073bf43db491a7ca3b 0xb8d0fd39c29ad34 0xc322648f1f8fc1b0b11f16c2 0xd462aba8b2e1061e934ada71 0x8cd28f07fbfe3b3 0x371992bb4d9396c9b2cee390 0xe37d5a103d9ac2a543195846 0x20a1dfe540458fa7 0x42ea5e8dadd6a35ab38d7dc6 0xb5695e750bd6e42c94448842 0x18aea7fbd858d7a2 0xd22e5fb9111c7a4e515fd735 0xbcc80764c54f3f43444f8596 0x1c9781b871a806e3 0xa819835f4834271f322968d 0x4c385d52da43811c2246627f 0x1e5ff805517fb116 0x794fa21a1f5ac6ca184ea627 0x595a6a323af35cca759c3022 0x28efa74764481358 0x944f97f4d2ba4fd0fe09bc2f 0x3346308efa509373a3ae1b9c 0x29489bda26dc69aa 0x92848583e6fa55d983f09f18 0x4b4c7be1024b959816864a15 0x1f1ab8c96a6318ff 0x7a90edcec14e5366e19b9250 0xedafa59eca62897f3b575240 0x55913467a8c2d8 0x5595f7da741a6503432db33f 0xc782ef6c0294a8c48bd8da0d 0x4aaca22a142e7fa 0xa2ecc10ae40d2a3ae2694ab3 0x1dc61a1e67fb10cc2c256d87 0x28556a88b4cb9d27 0x3755f77f66f035f10a4c4a01 0x77dc2f78fd85d999768dd34d 0xb0ebb5c09d4a7ab 0xba7e4177c34a7041ce32ab87 0x3a82f6fdb9d328cedbee81a8 0x28e44212b76c8e7a 0xaefc515320ad28e6e4f50b5e 0x96e6277fab17d4ed41b99141 0x290842a16b803039 0xac7b0a68c88913a1a6f1f7b3 0x68271e5e6619548927764e7 0x9a11b9fc9cfc754 0x9a81714765462ecba535da3f 0xb89b810842412e0cc586b937 0x5b5d02efc51ef81 0xfb97b4b0992aaebb846c6fdb 0xb86d2ca524bbc80fb3c1d943 0x16b5c4b6b4933781 0xd972323f473dddbcd8df4f4d 0x18ab92ec7e9eef9a159ca19f 0x27014ac03ab89e14 0x65f36423ab5df1f1e1fc1fad 0x88674a98287a5b2a1d6493e 0x2e7c3173d63d41b5 0xf871297b6d892ea871e53557 0x2d8f695465ded4e336fec31f 0x268c4dcf343a92f3 0xf036ccbbf28d705dd9fe9076 0x1672dd197835b11387aebdb4 0x3dd3a39ac3a495e 0xe568ba118f673c080e058705 0xd2e6a20ecec0853f945ad9b1 0x16ff71f399a0ce1c 0x1136522a60e986a1a4d4ed42 0xb982a6539a0de41eca4683bf 0x1207b96faae43d8b 0x520494130f3a3e1abb6a86f4 0x635fb9cc241c4f4213358c58 0xf4c2021b1a24b4d 0x6c152bd72142c5eb9660c538 0xd54b21f3d7500b5a1c7cc8ec 0x14ba01b0d4b40025 0xd7fa7ba63bcadedb1376e198 0x1a1eef38199512c00b0c15e5 0x2b7421ac7df102a2 0x5adce44194063b3ed83e489e 0x4b2341d78ad8a2ec6c894a44 0x127b49eb604a949d 0xa7cdfb61a1dde38f2de5ed 0xa7d86489ee8e6e4d52b95aa9 0x1ae739c94714210 0x94fcfbe072d4728e6c94a8f3 0xc3e2f291c7ecf69cf872a0bb 0x2b0b42733730fa9a 0xfc08e38fd67c2ad89ec0ae77 0xc6c0450a50b5f23b52e9d60c 0xafed6a937030032 0xf5b21edeb8e9b0ef2f2dd9ab 0x75851ae62a77710331623683 0x1f27587d48a0456e 0xbf901a94eefdc040906cb24c 0xb55d40312466f8da61007aac 0x1adc712e34758e00 0x3a2c084122861c501124eef5 0x30726fc80ea80e4bb353974c 0x26ecf462327a7e8 0x24224013052382ced90c0d0c 0x8c516df74309ad6dc958e6e7 0x714b668ffe2762a 0x65d34a86ca1ae8cd1830cdcc 0x1dcca70d674776424611e81 0x206bd9adf1f75c97 0x65f06d57efed4a19c0a2bbf7 0xc69f4aed70b9ce639b29056a 0x246ca03381f4edab 0x903c8a1eb37dd63ba43d3946 0x3defe3d0f3c682012e000a95 0x178b3c81a4bc29a7 0xdc1434ea6fc2f75323ff89f3 0xa5bbf0df6d19f9521e915bab 0xd9d8984228ce313 0xb7024ea8308e553bad8cc9ae 0xaf6d832a4f2eef3cb50589bf 0x22be7b5b5e64063b 0xfa162854b71a190b2e84f641 0x7e122ea55ed555664c35abf4 0x2c7604dadfbdd847 0x7d49177e77ba789d67779320 0x236d372954f47d635192158a 0xf3331a562103059 0x81b7ba4b5d4b33bdfebed111 0x662a8ed34d3e3de1332d04e4 0x192771d71469b6d0 0xa47332ac89e859511fb66294 0x1fd9c5112304c42740e9f46a 0x520322f3ba7f38a 0xb907e30e19d48cffb09fbcf7 0x2b59e7d4dafc891f08a24416 0x1e71e1c05c6e4a55 0x7839ecfb6b9e94ff4c3e9bb1 0xd36a7eae912afdfce4d6d262 0x1d6a1da9a2327b0b 0x1cb355493739dedb1ef42d51 0xe01e5c211a1f46f2e4094597 0x269bce40e53ea050 0x59da2615d5a3b91e937d89159f7380b9669858cc437cebe74adc09d93c99329 0x18 0x2a683c7d878585763f8267ea 0xead8f10ef81f7901ed274b24 0x25ec385810beaa87 0x0 0xf28f9a5faaa6546f997e0949 0xcd3ecab431257f8b80b8dc77 0x154e8dd3aac3d42c 0x0 0x100000000000000005c19a465cc7cbb28 0x3378cd034f0d9ebb 0x24df6021ce19cb18 0x9c6a591e71b87b32 0x970e2d83fd3ed91e6df39f2c 0x85294ea4088b8c3ca50dcf1e 0x3a237bdbf87287c 0x0 0xd13f9298545a1d77942e20d7 0xa85510aa9d5e7b357755b5d6 0x15c764c1c5380102 0x0 0x100000000000000003aa0eb9486eaea7c 0x100000000000000003ed064b9068afd7b 0x100000000000000004e76be5e17f551d8 0x100000000000000008d717becec440328 ================================================ FILE: src/src/tests/sha512_tests.cairo ================================================ use garaga::hashes::sha_512::{Word64WordOperations, sha512}; fn get_lorem_ipsum() -> Array { let mut input: Array = array![ 0x4C, 0x6F, 0x72, 0x65, 0x6D, 0x20, 0x69, 0x70, 0x73, 0x75, 0x6D, 0x2C, 0x20, 0x6F, 0x72, 0x20, 0x6C, 0x73, 0x69, 0x70, 0x73, 0x75, 0x6D, 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x6F, 0x6D, 0x65, 0x74, 0x69, 0x6D, 0x65, 0x73, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x2C, 0x20, 0x69, 0x73, 0x20, 0x64, 0x75, 0x6D, 0x6D, 0x79, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x6C, 0x61, 0x79, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x75, 0x74, 0x20, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x2C, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x6F, 0x72, 0x20, 0x77, 0x65, 0x62, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x73, 0x2E, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x61, 0x6E, 0x20, 0x75, 0x6E, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x31, 0x35, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6E, 0x74, 0x75, 0x72, 0x79, 0x20, 0x77, 0x68, 0x6F, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x6F, 0x75, 0x67, 0x68, 0x74, 0x20, 0x74, 0x6F, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x73, 0x63, 0x72, 0x61, 0x6D, 0x62, 0x6C, 0x65, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x43, 0x69, 0x63, 0x65, 0x72, 0x6F, 0x27, 0x73, 0x20, 0x44, 0x65, 0x20, 0x46, 0x69, 0x6E, 0x69, 0x62, 0x75, 0x73, 0x20, 0x42, 0x6F, 0x6E, 0x6F, 0x72, 0x75, 0x6D, 0x20, 0x65, 0x74, 0x20, 0x4D, 0x61, 0x6C, 0x6F, 0x72, 0x75, 0x6D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x6E, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x6D, 0x65, 0x6E, 0x20, 0x62, 0x6F, 0x6F, 0x6B, 0x2E, 0x20, 0x49, 0x74, 0x20, 0x75, 0x73, 0x75, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, ]; input } #[test] fn test_sha512_lorem_ipsum() { let msg = get_lorem_ipsum(); let res = sha512(msg).span(); assert_eq!( res, array![ 0xd5, 0xa2, 0xe1, 0x4e, 0xf4, 0x20, 0xf8, 0x2d, 0x68, 0x2b, 0x19, 0xc3, 0xd0, 0x70, 0xf4, 0x81, 0x14, 0xcb, 0xb9, 0x74, 0x7c, 0x7d, 0xb1, 0x15, 0xce, 0xa5, 0x41, 0x3e, 0xf8, 0xcb, 0x8f, 0xba, 0xc6, 0x90, 0x17, 0xc5, 0x17, 0x0f, 0x01, 0xc4, 0x77, 0xb3, 0xdf, 0x3d, 0xfb, 0x34, 0xd3, 0x50, 0x8f, 0xa0, 0xb2, 0xb1, 0x37, 0xd4, 0xcb, 0x54, 0x60, 0x9e, 0x63, 0x3d, 0x14, 0x45, 0x82, 0xc9, ] .span(), ); } #[test] fn test_sha512_size_one() { let mut arr: Array = array![49]; let res = sha512(arr).span(); assert_eq!( res, array![ 0x4d, 0xff, 0x4e, 0xa3, 0x40, 0xf0, 0xa8, 0x23, 0xf1, 0x5d, 0x3f, 0x4f, 0x01, 0xab, 0x62, 0xea, 0xe0, 0xe5, 0xda, 0x57, 0x9c, 0xcb, 0x85, 0x1f, 0x8d, 0xb9, 0xdf, 0xe8, 0x4c, 0x58, 0xb2, 0xb3, 0x7b, 0x89, 0x90, 0x3a, 0x74, 0x0e, 0x1e, 0xe1, 0x72, 0xda, 0x79, 0x3a, 0x6e, 0x79, 0xd5, 0x60, 0xe5, 0xf7, 0xf9, 0xbd, 0x05, 0x8a, 0x12, 0xa2, 0x80, 0x43, 0x3e, 0xd6, 0xfa, 0x46, 0x51, 0x0a, ] .span(), ); } #[test] fn test_size_zero() { let msg = array![]; let res = sha512(msg).span(); assert_eq!( res, array![ 0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1, 0x54, 0x28, 0x50, 0xd6, 0x6d, 0x80, 0x07, 0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc, 0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce, 0x47, 0xd0, 0xd1, 0x3c, 0x5d, 0x85, 0xf2, 0xb0, 0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f, 0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81, 0xa5, 0x38, 0x32, 0x7a, 0xf9, 0x27, 0xda, 0x3e, ] .span(), ); } ================================================ FILE: src/src/tests/sp1_groth_16_tests.cairo ================================================ use garaga::apps::sp1::{deserialize_full_proof_with_hints_sp1, verify_groth16_sp1}; use snforge_std::fs::{FileTrait, read_txt}; #[test] fn test_verify_sp1_groth16_proof_bn254() { let file = FileTrait::new("src/tests/proof_calldata.txt"); let calldata = read_txt(@file).span(); assert(main(calldata).is_ok(), 'Proof verification failed'); } #[executable] pub fn main(full_proof_with_hints: Span) -> Result, felt252> { let fph = deserialize_full_proof_with_hints_sp1(full_proof_with_hints); return verify_groth16_sp1(fph); } ================================================ FILE: src/src/utils/calldata.cairo ================================================ use core::circuit::u384; use corelib_imports::bounded_int::downcast; pub use garaga::definitions::{E12D, G1Point, G2Point, MillerLoopResultScalingFactor, u288}; pub use garaga::groth16::{Groth16Proof, Groth16ProofRaw}; pub use garaga::pairing_check::{MPCheckHintBLS12_381, MPCheckHintBN254}; #[derive(Drop)] pub struct FullProofWithHintsBN254 { pub groth16_proof: Groth16Proof, pub mpcheck_hint: MPCheckHintBN254, pub msm_hint: Span, } #[derive(Drop, Debug)] pub struct FullProofWithHintsBLS12_381 { pub groth16_proof: Groth16Proof, pub mpcheck_hint: MPCheckHintBLS12_381, pub msm_hint: Span, } const U288_N_LIMBS: usize = 3; const U384_N_LIMBS: usize = 4; #[inline(always)] fn downcast_u288(l0: felt252, l1: felt252, l2: felt252) -> u288 { u288 { limb0: downcast(l0).unwrap(), limb1: downcast(l1).unwrap(), limb2: downcast(l2).unwrap(), } } #[inline(always)] fn downcast_u384(l0: felt252, l1: felt252, l2: felt252, l3: felt252) -> u384 { u384 { limb0: downcast(l0).unwrap(), limb1: downcast(l1).unwrap(), limb2: downcast(l2).unwrap(), limb3: downcast(l3).unwrap(), } } #[inline(always)] pub fn _deserialize_groth16_proof_points(ref serialized: Span) -> Groth16ProofRaw { let [ a_x_l0, a_x_l1, a_x_l2, a_x_l3, a_y_l0, a_y_l1, a_y_l2, a_y_l3, b_x0_l0, b_x0_l1, b_x0_l2, b_x0_l3, b_x1_l0, b_x1_l1, b_x1_l2, b_x1_l3, b_y0_l0, b_y0_l1, b_y0_l2, b_y0_l3, b_y1_l0, b_y1_l1, b_y1_l2, b_y1_l3, c_x_l0, c_x_l1, c_x_l2, c_x_l3, c_y_l0, c_y_l1, c_y_l2, c_y_l3, ] = (*serialized .multi_pop_front::<32>() .unwrap()) .unbox(); let a = G1Point { x: downcast_u384(a_x_l0, a_x_l1, a_x_l2, a_x_l3), y: downcast_u384(a_y_l0, a_y_l1, a_y_l2, a_y_l3), }; let b = G2Point { x0: downcast_u384(b_x0_l0, b_x0_l1, b_x0_l2, b_x0_l3), x1: downcast_u384(b_x1_l0, b_x1_l1, b_x1_l2, b_x1_l3), y0: downcast_u384(b_y0_l0, b_y0_l1, b_y0_l2, b_y0_l3), y1: downcast_u384(b_y1_l0, b_y1_l1, b_y1_l2, b_y1_l3), }; let c = G1Point { x: downcast_u384(c_x_l0, c_x_l1, c_x_l2, c_x_l3), y: downcast_u384(c_y_l0, c_y_l1, c_y_l2, c_y_l3), }; return Groth16ProofRaw { a: a, b: b, c: c }; } #[inline(always)] pub fn _deserialize_E12D_u288(ref serialized: Span) -> E12D { let [ w0l0, w0l1, w0l2, w1l0, w1l1, w1l2, w2l0, w2l1, w2l2, w3l0, w3l1, w3l2, w4l0, w4l1, w4l2, w5l0, w5l1, w5l2, w6l0, w6l1, w6l2, w7l0, w7l1, w7l2, w8l0, w8l1, w8l2, w9l0, w9l1, w9l2, w10l0, w10l1, w10l2, w11l0, w11l1, w11l2, ] = (*serialized .multi_pop_front::<36>() .unwrap()) .unbox(); E12D { w0: downcast_u288(w0l0, w0l1, w0l2), w1: downcast_u288(w1l0, w1l1, w1l2), w2: downcast_u288(w2l0, w2l1, w2l2), w3: downcast_u288(w3l0, w3l1, w3l2), w4: downcast_u288(w4l0, w4l1, w4l2), w5: downcast_u288(w5l0, w5l1, w5l2), w6: downcast_u288(w6l0, w6l1, w6l2), w7: downcast_u288(w7l0, w7l1, w7l2), w8: downcast_u288(w8l0, w8l1, w8l2), w9: downcast_u288(w9l0, w9l1, w9l2), w10: downcast_u288(w10l0, w10l1, w10l2), w11: downcast_u288(w11l0, w11l1, w11l2), } } #[inline(always)] pub fn deserialize_full_proof_with_hints_bn254( mut serialized: Span, ) -> FullProofWithHintsBN254 { let groth16_proof_raw = _deserialize_groth16_proof_points(ref serialized); let n_public_inputs: u32 = (*serialized.pop_front().unwrap()).try_into().unwrap(); let mut public_inputs = array![]; for _ in 0..n_public_inputs { public_inputs .append( u256 { low: (*serialized.pop_front().unwrap()).try_into().unwrap(), high: (*serialized.pop_front().unwrap()).try_into().unwrap(), }, ); } let groth16_proof = Groth16Proof { raw: groth16_proof_raw, public_inputs: public_inputs.span(), }; let mpcheck_hint = _deserialize_mpcheck_hint_bn254(ref serialized); let msm_hint = serialized; return FullProofWithHintsBN254 { groth16_proof, mpcheck_hint, msm_hint }; } #[inline(always)] pub fn _deserialize_mpcheck_hint_bn254(ref serialized: Span) -> MPCheckHintBN254 { let lambda_root = _deserialize_E12D_u288(ref serialized); let lambda_root_inverse = _deserialize_E12D_u288(ref serialized); let [ w0_l0, w0_l1, w0_l2, w2_l0, w2_l1, w2_l2, w4_l0, w4_l1, w4_l2, w6_l0, w6_l1, w6_l2, w8_l0, w8_l1, w8_l2, w10_l0, w10_l1, w10_l2, ] = (*serialized .multi_pop_front::<18>() .unwrap()) .unbox(); // full_len -= 18; // assert(full_len == serialized.len(), 'F'); let w = MillerLoopResultScalingFactor { w0: downcast_u288(w0_l0, w0_l1, w0_l2), w2: downcast_u288(w2_l0, w2_l1, w2_l2), w4: downcast_u288(w4_l0, w4_l1, w4_l2), w6: downcast_u288(w6_l0, w6_l1, w6_l2), w8: downcast_u288(w8_l0, w8_l1, w8_l2), w10: downcast_u288(w10_l0, w10_l1, w10_l2), }; // usize_assert_eq(mpcheck_hint.Ris.len(), 34); // 34 * 12 * 3 = 1224 let mut ris_slice = serialized.slice(1, 1224); // println!("ris_slice.len(): {}", ris_slice.len()); let end = serialized.len(); serialized = serialized.slice(1225, end - 1224 - 1); // println!("serialized.len(): {}", serialized.len()); let mut Ris = array![]; while let Option::Some(ri) = ris_slice.multi_pop_front::<36>() { let [ w0l0, w0l1, w0l2, w1l0, w1l1, w1l2, w2l0, w2l1, w2l2, w3l0, w3l1, w3l2, w4l0, w4l1, w4l2, w5l0, w5l1, w5l2, w6l0, w6l1, w6l2, w7l0, w7l1, w7l2, w8l0, w8l1, w8l2, w9l0, w9l1, w9l2, w10l0, w10l1, w10l2, w11l0, w11l1, w11l2, ] = (*ri) .unbox(); Ris .append( E12D { w0: downcast_u288(w0l0, w0l1, w0l2), w1: downcast_u288(w1l0, w1l1, w1l2), w2: downcast_u288(w2l0, w2l1, w2l2), w3: downcast_u288(w3l0, w3l1, w3l2), w4: downcast_u288(w4l0, w4l1, w4l2), w5: downcast_u288(w5l0, w5l1, w5l2), w6: downcast_u288(w6l0, w6l1, w6l2), w7: downcast_u288(w7l0, w7l1, w7l2), w8: downcast_u288(w8l0, w8l1, w8l2), w9: downcast_u288(w9l0, w9l1, w9l2), w10: downcast_u288(w10l0, w10l1, w10l2), w11: downcast_u288(w11l0, w11l1, w11l2), }, ) } // usize_assert_eq(mpcheck_hint.big_Q.len(), 190); let mut big_q_slice = serialized.slice(1, 190 * 3); let end = serialized.len(); serialized = serialized.slice(190 * 3 + 1, end - 190 * 3 - 1); let mut big_q = array![]; while let Option::Some(q) = big_q_slice.multi_pop_front::<3>() { let [l0, l1, l2] = (*q).unbox(); big_q.append(downcast_u288(l0, l1, l2)) } let z = (*serialized.pop_front().unwrap()).try_into().unwrap(); let mpcheck_hint = MPCheckHintBN254 { lambda_root: lambda_root, lambda_root_inverse: lambda_root_inverse, w: w, Ris: Ris.span(), big_Q: big_q, z: z, }; return mpcheck_hint; } pub fn deserialize_mpcheck_hint_bls12_381(ref serialized: Span) -> MPCheckHintBLS12_381 { let [ w0l0, w0l1, w0l2, w0l3, w1l0, w1l1, w1l2, w1l3, w2l0, w2l1, w2l2, w2l3, w3l0, w3l1, w3l2, w3l3, w4l0, w4l1, w4l2, w4l3, w5l0, w5l1, w5l2, w5l3, w6l0, w6l1, w6l2, w6l3, w7l0, w7l1, w7l2, w7l3, w8l0, w8l1, w8l2, w8l3, w9l0, w9l1, w9l2, w9l3, w10l0, w10l1, w10l2, w10l3, w11l0, w11l1, w11l2, w11l3, ] = (*serialized .multi_pop_front::<48>() .unwrap()) .unbox(); let lambda_root_inverse = E12D { w0: downcast_u384(w0l0, w0l1, w0l2, w0l3), w1: downcast_u384(w1l0, w1l1, w1l2, w1l3), w2: downcast_u384(w2l0, w2l1, w2l2, w2l3), w3: downcast_u384(w3l0, w3l1, w3l2, w3l3), w4: downcast_u384(w4l0, w4l1, w4l2, w4l3), w5: downcast_u384(w5l0, w5l1, w5l2, w5l3), w6: downcast_u384(w6l0, w6l1, w6l2, w6l3), w7: downcast_u384(w7l0, w7l1, w7l2, w7l3), w8: downcast_u384(w8l0, w8l1, w8l2, w8l3), w9: downcast_u384(w9l0, w9l1, w9l2, w9l3), w10: downcast_u384(w10l0, w10l1, w10l2, w10l3), w11: downcast_u384(w11l0, w11l1, w11l2, w11l3), }; let [ w0_l0, w0_l1, w0_l2, w0_l3, w2_l0, w2_l1, w2_l2, w2_l3, w4_l0, w4_l1, w4_l2, w4_l3, w6_l0, w6_l1, w6_l2, w6_l3, w8_l0, w8_l1, w8_l2, w8_l3, w10_l0, w10_l1, w10_l2, w10_l3, ] = (*serialized .multi_pop_front::<24>() .unwrap()) .unbox(); let w = MillerLoopResultScalingFactor { w0: downcast_u384(w0_l0, w0_l1, w0_l2, w0_l3), w2: downcast_u384(w2_l0, w2_l1, w2_l2, w2_l3), w4: downcast_u384(w4_l0, w4_l1, w4_l2, w4_l3), w6: downcast_u384(w6_l0, w6_l1, w6_l2, w6_l3), w8: downcast_u384(w8_l0, w8_l1, w8_l2, w8_l3), w10: downcast_u384(w10_l0, w10_l1, w10_l2, w10_l3), }; // assert!(hint.Ris.len() == 35, "Wrong Number of Ris for BLS12-381 3-Pairs Paring check"); // 35 * 12 * 4 = 1680 let end_ris = 1680; let mut ris_slice = serialized.slice(1, end_ris); let end = serialized.len(); serialized = serialized.slice(end_ris + 1, end - end_ris - 1); let mut Ris = array![]; while let Option::Some(ri) = ris_slice.multi_pop_front::<48>() { let [ w0l0, w0l1, w0l2, w0l3, w1l0, w1l1, w1l2, w1l3, w2l0, w2l1, w2l2, w2l3, w3l0, w3l1, w3l2, w3l3, w4l0, w4l1, w4l2, w4l3, w5l0, w5l1, w5l2, w5l3, w6l0, w6l1, w6l2, w6l3, w7l0, w7l1, w7l2, w7l3, w8l0, w8l1, w8l2, w8l3, w9l0, w9l1, w9l2, w9l3, w10l0, w10l1, w10l2, w10l3, w11l0, w11l1, w11l2, w11l3, ] = (*ri) .unbox(); Ris .append( E12D { w0: downcast_u384(w0l0, w0l1, w0l2, w0l3), w1: downcast_u384(w1l0, w1l1, w1l2, w1l3), w2: downcast_u384(w2l0, w2l1, w2l2, w2l3), w3: downcast_u384(w3l0, w3l1, w3l2, w3l3), w4: downcast_u384(w4l0, w4l1, w4l2, w4l3), w5: downcast_u384(w5l0, w5l1, w5l2, w5l3), w6: downcast_u384(w6l0, w6l1, w6l2, w6l3), w7: downcast_u384(w7l0, w7l1, w7l2, w7l3), w8: downcast_u384(w8l0, w8l1, w8l2, w8l3), w9: downcast_u384(w9l0, w9l1, w9l2, w9l3), w10: downcast_u384(w10l0, w10l1, w10l2, w10l3), w11: downcast_u384(w11l0, w11l1, w11l2, w11l3), }, ) } let big_q_len: u32 = (*serialized.pop_front().unwrap()).try_into().unwrap(); let biq_len_n_limbs = big_q_len * 4; let mut big_q_slice = serialized.slice(0, biq_len_n_limbs); serialized = serialized.slice(biq_len_n_limbs, serialized.len() - biq_len_n_limbs); let mut big_q = array![]; while let Option::Some(q) = big_q_slice.multi_pop_front::<4>() { let [l0, l1, l2, l3] = (*q).unbox(); big_q.append(downcast_u384(l0, l1, l2, l3)) } let z = *serialized.pop_front().unwrap(); let mpcheck_hint = MPCheckHintBLS12_381 { lambda_root_inverse: lambda_root_inverse, w: w, Ris: Ris.span(), big_Q: big_q, z: z, }; return mpcheck_hint; } pub fn deserialize_full_proof_with_hints_bls12_381( mut serialized: Span, ) -> FullProofWithHintsBLS12_381 { let groth16_proof_raw = _deserialize_groth16_proof_points(ref serialized); let n_public_inputs: u32 = (*serialized.pop_front().unwrap()).try_into().unwrap(); let mut public_inputs = array![]; for _ in 0..n_public_inputs { public_inputs .append( u256 { low: (*serialized.pop_front().unwrap()).try_into().unwrap(), high: (*serialized.pop_front().unwrap()).try_into().unwrap(), }, ); } // full_len -= (1 + 2 * n_public_inputs); // assert(full_len == serialized.len(), 'C'); let groth16_proof = Groth16Proof { raw: groth16_proof_raw, public_inputs: public_inputs.span(), }; // Deserialize mpcheck_hint let mpcheck_hint = deserialize_mpcheck_hint_bls12_381(ref serialized); let msm_hint = serialized; return FullProofWithHintsBLS12_381 { groth16_proof, mpcheck_hint, msm_hint }; } ================================================ FILE: src/src/utils/hashing.cairo ================================================ use core::circuit::u384; pub use core::poseidon::hades_permutation; use garaga::definitions::{E12D, G1G2Pair, G1Point, MillerLoopResultScalingFactor, u288}; pub const TWO_POW_96: felt252 = 79228162514264337593543950336; #[derive(Copy, Drop)] pub struct PoseidonState { pub s0: felt252, pub s1: felt252, pub s2: felt252, } #[inline(always)] pub fn hash_u384(elmt: u384, base: felt252, s: PoseidonState) -> PoseidonState { let in_1 = s.s0 + elmt.limb0.into() + base * elmt.limb1.into(); let in_2 = s.s1 + elmt.limb2.into() + base * elmt.limb3.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, s.s2); return PoseidonState { s0: _s0, s1: _s1, s2: _s2 }; } #[inline(always)] pub fn hash_u288(elmt: u288, base: felt252, s: PoseidonState) -> PoseidonState { let in_1 = s.s0 + elmt.limb0.into() + base * elmt.limb1.into(); let in_2 = s.s1 + elmt.limb2.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, s.s2); return PoseidonState { s0: _s0, s1: _s1, s2: _s2 }; } #[inline(always)] pub fn hash_quadruple_u288( elmt0: u288, elmt1: u288, elmt2: u288, elmt3: u288, base: felt252, s: PoseidonState, ) -> PoseidonState { let in_1 = s.s0 + elmt0.limb0.into() + base * elmt0.limb1.into(); let in_2 = s.s1 + elmt0.limb2.into() + base * elmt1.limb0.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, s.s2); let in_1 = _s0 + elmt1.limb1.into() + base * elmt1.limb2.into(); let in_2 = _s1 + elmt2.limb0.into() + base * elmt2.limb1.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); let in_1 = _s0 + elmt2.limb2.into() + base * elmt3.limb0.into(); let in_2 = _s1 + elmt3.limb1.into() + base * elmt3.limb2.into(); let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, _s2); return PoseidonState { s0: _s0, s1: _s1, s2: _s2 }; } // Apply sponge construction to a transcript of u384 elements #[inline(always)] pub fn hash_u384_transcript(transcript: Span, mut s: PoseidonState) -> PoseidonState { let base: felt252 = TWO_POW_96; // 2**96 for elmt in transcript { s = hash_u384(*elmt, base, s); } return s; } #[inline(always)] pub fn hash_u288_transcript(transcript: Span, mut s: PoseidonState) -> PoseidonState { let base: felt252 = TWO_POW_96; // 2**96 let (n_quadruples, rest) = DivRem::div_rem(transcript.len(), 4); let n_quadruples_index = n_quadruples * 4; let mut transcript_quadruples = transcript.slice(0, n_quadruples_index); while let Some(fours) = transcript_quadruples.multi_pop_front::<4>() { let [elmt0, elmt1, elmt2, elmt3] = fours.unbox(); let _s = hash_quadruple_u288(elmt0, elmt1, elmt2, elmt3, base, s); s = _s; } let mut rest_transcript = transcript.slice(n_quadruples_index, rest); for elmt in rest_transcript { s = hash_u288(*elmt, base, s); } return s; } // Apply sponge construction to a E12D element from an initial state (s0, s1, s2) pub fn hash_E12D_u384(elmt: E12D, mut s: PoseidonState) -> PoseidonState { let base: felt252 = TWO_POW_96; // 2**96 let _s = hash_u384(elmt.w0, base, s); let _s = hash_u384(elmt.w1, base, _s); let _s = hash_u384(elmt.w2, base, _s); let _s = hash_u384(elmt.w3, base, _s); let _s = hash_u384(elmt.w4, base, _s); let _s = hash_u384(elmt.w5, base, _s); let _s = hash_u384(elmt.w6, base, _s); let _s = hash_u384(elmt.w7, base, _s); let _s = hash_u384(elmt.w8, base, _s); let _s = hash_u384(elmt.w9, base, _s); let _s = hash_u384(elmt.w10, base, _s); let _s = hash_u384(elmt.w11, base, _s); return _s; } pub fn hash_E12D_u288(elmt: E12D, mut s: PoseidonState) -> PoseidonState { let base: felt252 = TWO_POW_96; // 2**96 let _s = hash_quadruple_u288(elmt.w0, elmt.w1, elmt.w2, elmt.w3, base, s); let _s = hash_quadruple_u288(elmt.w4, elmt.w5, elmt.w6, elmt.w7, base, _s); let _s = hash_quadruple_u288(elmt.w8, elmt.w9, elmt.w10, elmt.w11, base, _s); return _s; } // Hash a E12D element known to be 1 pub fn hash_E12D_one_u384(s: PoseidonState) -> PoseidonState { let in_1 = s.s0 + 1; let in_2 = s.s1; let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, s.s2); // 1 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 2 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 3 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 4 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 5 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 6 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 7 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 8 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 9 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 10 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 11 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 12 return PoseidonState { s0: _s0, s1: _s1, s2: _s2 }; } // Hash a E12D element known to be 1 pub fn hash_E12D_one_u288(s: PoseidonState) -> PoseidonState { let in_1 = s.s0 + 1; let in_2 = s.s1; let (_s0, _s1, _s2) = hades_permutation(in_1, in_2, s.s2); // 1 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 2 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 3 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 4 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 5 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 6 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 7 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 8 let (_s0, _s1, _s2) = hades_permutation(_s0, _s1, _s2); // 9 return PoseidonState { s0: _s0, s1: _s1, s2: _s2 }; } // Apply sponge construction to a MillerLoopResultScalingFactor element from an initial state (s0, // s1, s2) #[inline(always)] pub fn hash_MillerLoopResultScalingFactor_u384( elmt: MillerLoopResultScalingFactor, s: PoseidonState, ) -> PoseidonState { let base: felt252 = TWO_POW_96; // 2**96 let _s = hash_u384(elmt.w0, base, s); let _s = hash_u384(elmt.w2, base, _s); let _s = hash_u384(elmt.w4, base, _s); let _s = hash_u384(elmt.w6, base, _s); let _s = hash_u384(elmt.w8, base, _s); let _s = hash_u384(elmt.w10, base, _s); return _s; } #[inline(always)] pub fn hash_MillerLoopResultScalingFactor_u288( elmt: MillerLoopResultScalingFactor, s: PoseidonState, ) -> PoseidonState { let base: felt252 = TWO_POW_96; // 2**96 let _s = hash_quadruple_u288(elmt.w0, elmt.w2, elmt.w4, elmt.w6, base, s); let _s = hash_u288(elmt.w8, base, _s); let _s = hash_u288(elmt.w10, base, _s); return _s; } // Apply sponge construction to a sequence of E12D elements from an initial state (s0, s1, s2) #[inline(always)] pub fn hash_E12D_u384_transcript( transcript: Span>, mut s: PoseidonState, ) -> PoseidonState { let base: felt252 = TWO_POW_96; // 2**96 for elmt in transcript { let elmt = *elmt; let _s = hash_u384(elmt.w0, base, s); let _s = hash_u384(elmt.w1, base, _s); let _s = hash_u384(elmt.w2, base, _s); let _s = hash_u384(elmt.w3, base, _s); let _s = hash_u384(elmt.w4, base, _s); let _s = hash_u384(elmt.w5, base, _s); let _s = hash_u384(elmt.w6, base, _s); let _s = hash_u384(elmt.w7, base, _s); let _s = hash_u384(elmt.w8, base, _s); let _s = hash_u384(elmt.w9, base, _s); let _s = hash_u384(elmt.w10, base, _s); let _s = hash_u384(elmt.w11, base, _s); s = _s; } return s; } #[inline(always)] pub fn hash_E12D_u288_transcript( transcript: Span>, mut s: PoseidonState, ) -> PoseidonState { let base: felt252 = TWO_POW_96; // 2**96 for elmt in transcript { let elmt = *elmt; let _s = hash_quadruple_u288(elmt.w0, elmt.w1, elmt.w2, elmt.w3, base, s); let _s = hash_quadruple_u288(elmt.w4, elmt.w5, elmt.w6, elmt.w7, base, _s); let _s = hash_quadruple_u288(elmt.w8, elmt.w9, elmt.w10, elmt.w11, base, _s); s = _s; } return s; } // Apply sponge construction to a pair of G1 and G2 points from an initial state (s0, s1, s2) // #[inline(always)] pub fn hash_G1G2Pair(pair: G1G2Pair, s: PoseidonState) -> PoseidonState { let base: felt252 = TWO_POW_96; // 2**96 let _s = hash_u384(pair.p.x, base, s); let _s = hash_u384(pair.p.y, base, _s); let _s = hash_u384(pair.q.x0, base, _s); let _s = hash_u384(pair.q.x1, base, _s); let _s = hash_u384(pair.q.y0, base, _s); let _s = hash_u384(pair.q.y1, base, _s); return _s; } pub fn hash_G1Point(point: G1Point) -> felt252 { let base: felt252 = TWO_POW_96; // 2**96 let in_1: felt252 = point.x.limb0.into() + base * point.x.limb1.into(); let in_2: felt252 = point.x.limb2.into() + base * point.x.limb3.into(); let (s0, s1, s2) = hades_permutation(in_1, in_2, 2); let in_1 = s0 + point.y.limb0.into() + base * point.y.limb1.into(); let in_2 = s1 + point.y.limb2.into() + base * point.y.limb3.into(); let (s0, _, _) = hades_permutation(in_1, in_2, s2); return s0; } ================================================ FILE: src/src/utils/neg_3.cairo ================================================ use core::circuit::u384; use corelib_imports::bounded_int::{ AddHelper, BoundedInt, DivRemHelper, UnitInt, bounded_int, upcast, }; use garaga::definitions::get_min_one; const STARK_MINUS_1_HALF: u256 = 180925139433306560684866139154753505281553607665798349986546028067936010240; // (STARK-1)//2 // Returns the sign of a felt252. // num is considered positive if num <= (STARK-1)//2 // num is considered negative if num > (STARK-1)//2 pub fn sign(num: felt252) -> felt252 { if num.into() <= STARK_MINUS_1_HALF { return 1; } else { return -1; } } // Maps a sign returned by sign() to a u384 modulo the prime of a given curve index. pub fn sign_to_u384(sign: felt252, curve_index: usize) -> u384 { if (sign == -1) { return get_min_one(curve_index); } else { return u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }; } } pub fn u256_array_to_low_high_epns( scalars: Span, scalars_digits_decompositions: Option, Span)>>, ) -> (Array<(felt252, felt252, felt252, felt252)>, Array<(felt252, felt252, felt252, felt252)>) { let mut epns_low: Array<(felt252, felt252, felt252, felt252)> = ArrayTrait::new(); let mut epns_high: Array<(felt252, felt252, felt252, felt252)> = ArrayTrait::new(); match scalars_digits_decompositions { Option::None(_) => { for scalar in scalars { epns_low.append(scalar_to_epns(*scalar.low)); epns_high.append(scalar_to_epns(*scalar.high)); } }, Option::Some(decompositions) => { let mut i = 0; for scalar in scalars { match decompositions.get(i) { Option::Some(decompositions) => { let (decomposition_low, decomposition_high) = decompositions.unbox(); epns_low .append(scalar_to_epns_with_digits(*scalar.low, *decomposition_low)); epns_high .append(scalar_to_epns_with_digits(*scalar.high, *decomposition_high)); }, Option::None(_) => { epns_low.append(scalar_to_epns(*scalar.low)); epns_high.append(scalar_to_epns(*scalar.high)); }, } i += 1; } }, } return (epns_low, epns_high); } pub fn u128_array_to_epns( scalars: Span, scalars_digits_decompositions: Option>>, ) -> Array<(felt252, felt252, felt252, felt252)> { let mut epns: Array<(felt252, felt252, felt252, felt252)> = ArrayTrait::new(); match scalars_digits_decompositions { Option::None(_) => { for scalar in scalars { epns.append(scalar_to_epns(*scalar)); } }, Option::Some(decompositions) => { let mut i = 0; for scalar in scalars { match decompositions.get(i) { Option::Some(decomposition) => { let decomposition = decomposition.unbox(); epns.append(scalar_to_epns_with_digits(*scalar, *decomposition)); }, Option::None(_) => { epns.append(scalar_to_epns(*scalar)); }, } i += 1; } }, } return epns; } const THREE: felt252 = 3; const THREE_NZ_TYPED: NonZero> = 3; const POW128_DIV_3: felt252 = 113427455640312821154458202477256070485; // ((2^128-1) // 3) const POW128: felt252 = 0x100000000000000000000000000000000; impl DivRemU128By3 of DivRemHelper, UnitInt> { type DivT = BoundedInt<0, { POW128_DIV_3 }>; type RemT = BoundedInt<0, { THREE - 1 }>; } impl AddOneHelper of AddHelper, BoundedInt<0, 1>> { type Result = BoundedInt<0, { POW128_DIV_3 + 1 }>; } // From a 128 bit scalar, returns the positive and negative multiplicities of the scalar in base // (-3) // scalar = sum(digits[i] * (-3)^i for i in [0, 81]) // scalar = sum_p - sum_n // Where sum_p = sum(digits[i] * (-3)^i for i in [0, 81] if digits[i]==1) // And sum_n = sum(digits[i] * (-3)^i for i in [0, 81] if digits[i]==-1) // Returns (abs(sum_p), abs(sum_n), p_sign, n_sign) pub fn scalar_to_epns(mut _scalar: u128) -> (felt252, felt252, felt252, felt252) { let mut sum_p: felt252 = 0; let mut sum_n: felt252 = 0; let mut base_power: felt252 = 1; // Init to (-3)^0 let mut scalar: BoundedInt<0, { POW128 - 1 }> = upcast(_scalar); while scalar != 0 { let (q0, r0) = bounded_int::div_rem(scalar, THREE_NZ_TYPED); let r0: felt252 = r0.into(); if r0 == 0 { scalar = upcast(q0); } else if r0 == 2 { scalar = upcast(bounded_int::add(q0, 1)); sum_n += base_power; } else { scalar = upcast(q0); sum_p += base_power; } base_power = base_power * (-3); let (q1, r1) = bounded_int::div_rem(scalar, THREE_NZ_TYPED); let r1: felt252 = r1.into(); if r1 == 0 { scalar = upcast(q1); } else if r1 == 2 { scalar = upcast(bounded_int::add(q1, 1)); sum_p += base_power; } else { scalar = upcast(q1); sum_n += base_power; } base_power = base_power * (-3); } let sign_p = sign(sum_p); let sign_n = sign(sum_n); return (sign_p * sum_p, sign_n * sum_n, sign_p, sign_n); } pub fn scalar_to_epns_with_digits( scalar: u128, mut digits: Span, ) -> (felt252, felt252, felt252, felt252) { assert!(digits.len() <= 82, "The number of digits must be <= 82 for u128"); let mut sum_p = 0; let mut sum_n = 0; let mut base_power = 1; // Init to (-3)^0 while let Option::Some(digit) = digits.pop_front() { let digit = *digit; if digit != 0 { if digit == 1 { sum_p += base_power; } else { sum_n += base_power; } } base_power = base_power * (-3); } assert!( scalar.into() == sum_p - sum_n, "The scalar must be equal to the sum of the positive and negative digits", ); let sign_p = sign(sum_p); let sign_n = sign(sum_n); return (sign_p * sum_p, sign_n * sum_n, sign_p, sign_n); } #[cfg(test)] mod tests { use super::scalar_to_epns; #[test] fn test_scalar_to_epns() { let (sum_p, sum_n, sign_p, sign_n) = scalar_to_epns(12); assert_eq!(sum_p, 9); assert_eq!(sum_n, 3); assert_eq!(sign_p, 1); assert_eq!(sign_n, -1); let (sum_p, sum_n, sign_p, sign_n) = scalar_to_epns(35); assert_eq!(sum_p, 9); assert_eq!(sum_n, 26); assert_eq!(sign_p, 1); assert_eq!(sign_n, -1); let (sum_p, sum_n, _, _) = scalar_to_epns(0); assert_eq!(sum_p, 0); assert_eq!(sum_n, 0); let (sum_p, sum_n, sign_p, sign_n) = scalar_to_epns( 170141183460469231731687303715884105728, ); //2**127 assert_eq!(sum_p, 164253760949568696627221936579612523510); assert_eq!(sum_n, 5887422510900535104465367136271582218); //using STARK field assert_eq!(sign_p, 1); assert_eq!(sign_n, -1); let (sum_p, sum_n, sign_p, sign_n) = scalar_to_epns( 85070591730234615865843651857942052864, ); //2 **126 assert_eq!(sum_p, 97865891762673628272143863189949020615); assert_eq!(sum_n, 12795300032439012406300211332006967751); assert_eq!(sign_p, 1); assert_eq!(sign_n, 1); let (sum_p, sum_n, sign_p, sign_n) = scalar_to_epns( 85070591730234615865843651857942052874, ); //2 **126 + 10 assert_eq!(sum_p, 97865891762673628272143863189949020623); assert_eq!(sum_n, 12795300032439012406300211332006967749); assert_eq!(sign_p, 1); assert_eq!(sign_n, 1); } #[test] fn test_scalar_to_epns_single() { let (sum_p, sum_n, sign_p, sign_n) = scalar_to_epns( 170141183460469231731687303715884105728, ); //2**127 assert_eq!(sum_p, 164253760949568696627221936579612523510); assert_eq!(sum_n, 5887422510900535104465367136271582218); assert_eq!(sign_p, 1); assert_eq!(sign_n, -1); } } ================================================ FILE: tests/benchmarks_compiled.py ================================================ import inspect import pandas as pd from tabulate import tabulate from garaga.curves import CurveID from hydra.garaga.precompiled_circuits.all_circuits import ALL_CAIRO_CIRCUITS def benchmark_all_cairo_circuits(): """ For each circuit class in ALL_CAIRO_CIRCUITS: - Instantiate the circuit (with any params, for each listed curve_id). - Safe-construct them by removing any kwargs that aren't accepted by their __init__. - finalize the circuit (if not already done). - gather the summary info (MULMOD, ADDMOD, etc.). Then we mark circuits as "GENERIC" if they have the same MULMOD/ADDMOD on multiple curves. """ results = [] for circuit_id, circuit_info in ALL_CAIRO_CIRCUITS.items(): # If no curve_ids present, default to [BN254, BLS12_381] curve_ids = circuit_info.get("curve_ids", [CurveID.BN254, CurveID.BLS12_381]) # If params is None, turn that into a list of length 1 containing None params_list = circuit_info["params"] or [None] circuit_class = circuit_info["class"] # Use inspect to see valid parameters on the circuit class's __init__ init_signature = inspect.signature(circuit_class.__init__) valid_params = set(init_signature.parameters.keys()) for curve_id in curve_ids: for param in params_list: # Build default kwargs kwargs = { "name": f"{circuit_class.__name__}_bench", "curve_id": curve_id.value, "auto_run": True, "compilation_mode": 1, } # Possibly update with param dict if isinstance(param, dict): kwargs.update(param) # Remove any keys the constructor doesn't accept safe_kwargs = {k: v for k, v in kwargs.items() if k in valid_params} # Now instantiate the circuit safely circuit_instance = circuit_class(**safe_kwargs) # Summarize summary = circuit_instance.circuit.summarize() # Build row for DataFrame, including separate columns for the class, param, curve row = { "circuit_class": circuit_class.__name__, "param": str(param) if param else "", "curve_id": curve_id.name, "MULMOD": summary.get("MULMOD", 0), "ADDMOD": summary.get("ADDMOD", 0), } results.append(row) # Create a DataFrame df = pd.DataFrame(results) # If you want to compute a simple "~steps" metric: costs = {"MULMOD": 8, "ADDMOD": 4} def compute_steps(row): return sum(row[op] * wt for op, wt in costs.items()) df["~steps"] = df.apply(compute_steps, axis=1) # Sort by ~steps first df.sort_values(by="~steps", inplace=True, ignore_index=True) # 1) Group by (circuit_class, param, MULMOD, ADDMOD). # 2) If multiple distinct curves appear in a group, mark curve_id as "GENERIC". df["curve_id"] = df.groupby(["circuit_class", "param", "MULMOD", "ADDMOD"])[ "curve_id" ].transform(lambda g: "GENERIC" if g.nunique() > 1 else g) # Drop duplicates, so "GENERIC" appears only once per group df_unique = df.drop_duplicates( subset=["circuit_class", "param", "MULMOD", "ADDMOD", "curve_id"], keep="first" ) print("\n===== Benchmark Summaries (Filtered) =====\n") print(tabulate(df_unique, headers="keys", tablefmt="github", showindex=False)) if __name__ == "__main__": benchmark_all_cairo_circuits() ================================================ FILE: tests/benchmarks_manual.py ================================================ import random from random import randint from garaga.algebra import ModuloCircuitElement from garaga.curves import CURVES, STARK, Curve, CurveID, PyFelt, get_base_field from garaga.extension_field_modulo_circuit import ExtensionFieldModuloCircuit, WriteOps from garaga.hints import neg_3 from garaga.hints.ecip import zk_ecip_hint from garaga.hints.io import padd_function_felt, split_128 from garaga.hints.tower_backup import E12 from garaga.points import G1G2Pair, G1Point, G2Point, direct_to_tower from garaga.precompiled_circuits.ec import BasicEC, DerivePointFromX, ECIPCircuits from garaga.precompiled_circuits.final_exp import FinalExpTorusCircuit, test_final_exp from garaga.precompiled_circuits.multi_miller_loop import MultiMillerLoopCircuit random.seed(0) def test_extf_mul(curve_id: CurveID, extension_degree: int): curve: Curve = CURVES[curve_id.value] p = curve.p X = [PyFelt(randint(0, p - 1), p) for _ in range(extension_degree)] Y = [PyFelt(randint(0, p - 1), p) for _ in range(extension_degree)] circuit = ExtensionFieldModuloCircuit( f"Fp{extension_degree} MUL", curve_id=curve_id.value, extension_degree=extension_degree, hash_input=False, ) X = circuit.write_elements(X, WriteOps.INPUT) Y = circuit.write_elements(Y, WriteOps.INPUT) circuit.extf_mul([X, Y], extension_degree) circuit.finalize_circuit() return circuit.summarize(), circuit.ops_counter def test_extf_square(curve_id: CurveID, extension_degree: int): curve: Curve = CURVES[curve_id.value] p = curve.p X = [PyFelt(randint(0, p - 1), p) for _ in range(extension_degree)] circuit = ExtensionFieldModuloCircuit( f"Fp{extension_degree} SQUARE", curve_id=curve_id.value, extension_degree=extension_degree, hash_input=False, ) X = circuit.write_elements(X, WriteOps.INPUT) circuit.extf_mul([X, X], extension_degree) circuit.finalize_circuit() return circuit.summarize(), circuit.ops_counter def test_extf_mul_circuit_full(curve_id: CurveID, extension_degree: int): curve: Curve = CURVES[curve_id.value] p = curve.p X = [PyFelt(randint(0, p - 1), p) for _ in range(extension_degree)] circuit = ExtensionFieldModuloCircuit( f"{curve_id.name}_mul_zpow_verif_Fp{extension_degree}", curve_id=curve_id.value, extension_degree=extension_degree, ) X = circuit.write_elements(X, WriteOps.INPUT) circuit.extf_mul(X, X, extension_degree) circuit.finalize_circuit() circuit.values_segment = circuit.values_segment.non_interactive_transform() circuit.print_value_segment() return circuit.summarize(), circuit.ops_counter def test_square_torus_amortized(curve_id: CurveID, extension_degree: int): curve: Curve = CURVES[curve_id.value] p = curve.p X = [PyFelt(randint(0, p - 1), p) for _ in range(extension_degree)] circuit = FinalExpTorusCircuit( f"Fp{extension_degree} SQUARE_TORUS", curve_id=curve_id.value, extension_degree=extension_degree, hash_input=False, ) X = circuit.write_elements(X, WriteOps.INPUT) circuit.square_torus(X) circuit.finalize_circuit() return circuit.summarize(), circuit.ops_counter def test_mul_torus(curve_id: CurveID, extension_degree: int): curve: Curve = CURVES[curve_id.value] p = curve.p X = [PyFelt(randint(0, p - 1), p) for _ in range(extension_degree)] Y = [PyFelt(randint(0, p - 1), p) for _ in range(extension_degree)] circuit = FinalExpTorusCircuit( f"Fp{extension_degree} MUL_TORUS", curve_id=curve_id.value, extension_degree=extension_degree, hash_input=False, ) X = circuit.write_elements(X, WriteOps.INPUT) Y = circuit.write_elements(Y, WriteOps.INPUT) circuit.mul_torus(X, Y) circuit.finalize_circuit() return circuit.summarize(), circuit.ops_counter def test_final_exp_circuit(curve_id: CurveID): part1, part2 = test_final_exp(curve_id) summ1 = part1.summarize() summ1["circuit"] = summ1["circuit"] summ2 = part2.summarize() summ2["circuit"] = summ2["circuit"] # part1.print_value_segment() # part1.compile_circuit() summ = { "circuit": summ1["circuit"], "MULMOD": summ1["MULMOD"] + summ2["MULMOD"], "ADDMOD": summ1["ADDMOD"] + summ2["ADDMOD"], "ASSERT_EQ": summ1["ASSERT_EQ"] + summ2["ASSERT_EQ"], "POSEIDON": summ1["POSEIDON"] + summ2["POSEIDON"], "RLC": summ1["RLC"] + summ2["RLC"], } ops_counter = { key: part1.ops_counter.get(key) + part2.ops_counter.get(key) for key in set(part1.ops_counter) | set(part2.ops_counter) if key != "Circuit" } ops_counter["Circuit"] = part1.ops_counter["Circuit"] return summ, ops_counter def test_miller_n(curve_id, n): order = CURVES[curve_id.value].n field = get_base_field(curve_id.value) pair_list = [] pairs = [] for k in range(n): n1, n2 = randint(1, order), randint(1, order) p1, p2 = G1Point.get_nG(curve_id, n1), G2Point.get_nG(curve_id, n2) pair_list.append(G1G2Pair(p1, p2)) pairs.extend([p1.x, p1.y, p2.x[0], p2.x[1], p2.y[0], p2.y[1]]) c = MultiMillerLoopCircuit(f"Miller n={n} {curve_id.name}", curve_id.value, n) c.write_p_and_q_raw([field(x) for x in pairs]) f = c.miller_loop(n_pairs=n) f_tower = E12( direct_to_tower([x.felt for x in f], curve_id.value, 12), curve_id.value ) cofactor = CURVES[curve_id.value].final_exp_cofactor f = f_tower ** ( cofactor * (CURVES[curve_id.value].p ** 12 - 1) // CURVES[curve_id.value].n ) res = G1G2Pair.pair(pair_list).value_coeffs c.finalize_circuit() for i, (rg, fv) in enumerate(zip(res, f.value_coeffs)): assert rg == fv, f"Mismatch at index {i}: {rg=} != {fv=}, {curve_id} {n}" return c.summarize(), c.ops_counter def test_derive_point_from_x(curve_id: CurveID): field = get_base_field(curve_id.value) c = DerivePointFromX( "Derive Point From X", curve_id.value, ) x = c.write_element(field(randint(0, STARK - 1))) a = c.write_element(field(CURVES[curve_id.value].a)) b = c.write_element(field(CURVES[curve_id.value].b)) g = c.write_element(field(CURVES[curve_id.value].fp_generator)) c._derive_point_from_x(x, a, b, g) return c.summarize(), None def test_msm_n_points(curve_id: CurveID, n: int): order = CURVES[curve_id.value].n field = get_base_field(curve_id.value) points_g1 = [G1Point.get_nG(curve_id, i + 1) for i in range(n)] points_values = [(p.x, p.y) for p in points_g1] scalars = [randint(1, order) for _ in range(n)] scalars_split = [split_128(s) for s in scalars] scalars_low, scalars_high = zip(*scalars_split) circuit: ECIPCircuits = ECIPCircuits(f"MSM {n} points", curve_id.value) A0 = G1Point.gen_random_point(curve_id) # A0 = G1Point( # 18428833980079511615272996143804193211436754676692982772704777987001013940329, # 11912813278234620045155380611021998667623598196864500681264424672047345567217, # curve_id, # ) A0: tuple(ModuloCircuitElement, ModuloCircuitElement) = ( circuit.write_element(field(A0.x)), circuit.write_element(field(A0.y)), ) A_weirstrass = circuit.write_element(field(CURVES[curve_id.value].a)) m_A0, b_A0, xA0, yA0, xA2, yA2, coeff0, coeff2 = ( circuit._slope_intercept_same_point(A0, A_weirstrass) ) points = [ (circuit.write_element(field(x)), circuit.write_element(field(y))) for x, y in points_values ] def msm_inner(points, scalars): epns = [ neg_3.positive_negative_multiplicities(neg_3.neg_3_base_le(s)) for s in scalars ] first_B = points[0] if isinstance(first_B, G1Point): points_g1 = points elif isinstance(first_B, tuple): if isinstance(first_B[0], int): points_g1 = [G1Point(B[0], B[1], curve_id) for B in points] else: points_g1 = [G1Point(B[0].value, B[1].value, curve_id) for B in points] else: raise ValueError("Invalid Bs type") Q, SumDlog = zk_ecip_hint(points_g1, scalars) rhs_acc = circuit.write_element(field(0)) for index, (point, epn) in enumerate(zip(points, epns)): # print(f"RHS INDEX : {index}") ep = circuit.write_element(field(abs(epn[0]))) en = circuit.write_element(field(abs(epn[1]))) p_sign = circuit.write_element(field(epn[0] // abs(epn[0]))) n_sign = circuit.write_element(field(epn[1] // abs(epn[1]))) rhs_acc = circuit._accumulate_eval_point_challenge_signed_same_point( rhs_acc, (m_A0, b_A0), xA0, point, ep, en, p_sign, n_sign ) # print(f"\trhs_acc_intermediate: {rhs_acc.value}") Q = (Q.x, Q.y) if Q != (0, 0): Q = (circuit.write_element(field(Q[0])), circuit.write_element(field(Q[1]))) rhs_acc = circuit._RHS_finalize_acc(rhs_acc, (m_A0, b_A0), xA0, Q) a_num, a_den, b_num, b_den = padd_function_felt(SumDlog, n) a_num, a_den, b_num, b_den = ( circuit.write_elements([field(x) for x in a_num], WriteOps.INPUT), circuit.write_elements([field(x) for x in a_den], WriteOps.INPUT), circuit.write_elements([field(x) for x in b_num], WriteOps.INPUT), circuit.write_elements([field(x) for x in b_den], WriteOps.INPUT), ) lhs = circuit._eval_function_challenge_dupl( (xA0, yA0), (xA2, yA2), coeff0, coeff2, a_num, a_den, b_num, b_den ) assert lhs.value == rhs_acc.value, f"{lhs.value} != {rhs_acc.value}" if Q == (0, 0): return G1Point.infinity(curve_id) return G1Point(Q[0].value, Q[1].value, curve_id) # print(f"\tlhs: {lhs.value}") # print(f"\trhs_acc_final: {rhs_acc.value}") Q_low = msm_inner(points, scalars_low) Q_high = msm_inner(points, scalars_high) Q_shift = msm_inner( [ ( circuit.write_element(field(Q_high.x)), circuit.write_element(field(Q_high.y)), ) ], [2**128], ) scalar_mul_low = G1Point.msm(points_g1, scalars_low) scalar_mul_high = G1Point.msm(points_g1, scalars_high) scalar_mul = G1Point.msm(points_g1, scalars) assert Q_low == scalar_mul_low, f"{Q_low} != {scalar_mul_low}" assert Q_high == scalar_mul_high, f"{Q_high} != {scalar_mul_high}" assert Q_high.scalar_mul(2**128) == Q_shift assert Q_low.add(Q_shift) == scalar_mul basic_ec = BasicEC("Basic EC", curve_id.value) final_res = basic_ec.add_points( basic_ec.write_elements([field(Q_low.x), field(Q_low.y)], WriteOps.INPUT), basic_ec.write_elements([field(Q_shift.x), field(Q_shift.y)], WriteOps.INPUT), ) assert G1Point(final_res[0].value, final_res[1].value, curve_id) == Q_low.add( Q_shift ) ec_summary = basic_ec.summarize() circuit.values_segment = circuit.values_segment.non_interactive_transform() summary = circuit.summarize() summary["MULMOD"] = summary["MULMOD"] + ec_summary["MULMOD"] summary["ADDMOD"] = summary["ADDMOD"] + ec_summary["ADDMOD"] summary["POSEIDON"] = n * 2 # N points summary["POSEIDON"] += n * 2 # N scalars (spliited in low_high) summary["POSEIDON"] += 3 * 2 # 3 Q result points summary["POSEIDON"] += 2 * (4 * n + 10) # 2 * Total # of coefficients in SumDlogDiv summary["POSEIDON"] += ( 4 + 10 ) # Total # of coefficients in SumDlogDivShifted (1 point MSM) return summary, None if __name__ == "__main__": import pandas as pd from tabulate import tabulate pd.set_option("display.max_rows", None) # None means show all rows pd.set_option("display.max_columns", None) # None means show all columns pd.set_option("display.width", None) # None means auto-detect the display width pd.set_option("display.max_colwidth", None) # None means show full width of columns builtin_ops_data = [] builtin_ops_data.append( { "circuit": "BLS12FinalExp Fp12 Karabina No EXTF Trick", "MULMOD": 7774, "ADDMOD": 26038 + 16964, # ADD + SUBS. "ASSERT_EQ": 0, "POSEIDON": 0, "RLC": 0, } ) final_exp_data = {CurveID.BN254: None, CurveID.BLS12_381: None} sub_circuit_count = [] # print(f"Running...") for curveID in [CurveID.BN254, CurveID.BLS12_381]: builtin_ops, sub_circuits = test_final_exp_circuit(curveID) builtin_ops_data.append(builtin_ops) final_exp_data[curveID] = builtin_ops sub_circuit_count.append(sub_circuits) # Sub circuits. Same values for both curves for test_func, curve_id, ext_degree in [ (test_extf_square, CurveID.BLS12_381, 12), (test_mul_torus, CurveID.BLS12_381, 6), (test_square_torus_amortized, CurveID.BLS12_381, 6), (test_extf_mul, CurveID.BLS12_381, 12), ]: builtin_ops, _ = test_func(curve_id, ext_degree) builtin_ops_data.append(builtin_ops) for test_func, curve_id in [ (test_derive_point_from_x, CurveID.BN254), ]: builtin_ops, _ = test_func(curve_id) builtin_ops_data.append(builtin_ops) for n in [1, 2, 3]: for curve_id in [CurveID.BLS12_381, CurveID.BN254]: # print(f"Running {curve_id} {n}") builtin_ops, sub_circuits = test_miller_n(curve_id, n) builtin_ops_data.append(builtin_ops) builtin_ops_data.append( { "circuit": f"MultiPairing {n=} {curve_id.name}", "MULMOD": builtin_ops["MULMOD"] + final_exp_data[curve_id]["MULMOD"], "ADDMOD": builtin_ops["ADDMOD"] + final_exp_data[curve_id]["ADDMOD"], "ASSERT_EQ": builtin_ops["ASSERT_EQ"] + final_exp_data[curve_id]["ASSERT_EQ"], "POSEIDON": builtin_ops["POSEIDON"] + final_exp_data[curve_id]["POSEIDON"], "RLC": builtin_ops["RLC"] + final_exp_data[curve_id]["RLC"], } ) sub_circuit_count.append(sub_circuits) for n in [1, 2, 3, 10, 50]: builtin_ops, _ = test_msm_n_points(CurveID.BN254, n) builtin_ops_data.append(builtin_ops) df = pd.DataFrame(builtin_ops_data) costs = [ { "OP": "MULMOD", "Weight in steps": 8, "Comment": "Equivalent cost of a*b % p with the modulo builtin in VM steps", }, { "OP": "ADDMOD", "Weight in steps": 4, "Comment": "Equivalent cost of a+b % p with the modulo builtin in VM steps", }, { "OP": "ASSERT_EQ", "Weight in steps": 2, "Comment": "Equivalent cost of a==b % p with the modulo builtin in VM steps", }, { "OP": "POSEIDON", "Weight in steps": 16, "Comment": "Cost of hashing the first 3 limbs of 384 bits emulated field element with Poseidon", }, { "OP": "RLC", "Weight in steps": 28, "Comment": "Cost of writing a field element to the value segment and retrieving random coefficients", }, ] def get_poseidon_cost(curve_name: CurveID) -> int: poseidon_costs = { CurveID.BN254: 14, CurveID.BLS12_381: 17, } return poseidon_costs.get(curve_name, 0) # Default to 0 if curve_name not found def calculate_row_cost(row): total_cost = 0 for _row in costs: op, weight = _row["OP"], _row["Weight in steps"] if "POSEIDON" in op: # Dynamically adjust Poseidon cost based on the 'circuit' column for curve_id in CurveID: if curve_id.name in row["circuit"]: weight = get_poseidon_cost(curve_id) break # Stop checking once the first matching CurveID is found total_cost += row[op] * weight return total_cost # Apply the function to each row to calculate the total cost df["~steps"] = df.apply(calculate_row_cost, axis=1) pd.set_option("display.colheader_justify", "center") print("\n\n") costs = [cost for cost in costs if cost["OP"] != "POSEIDON"] costs.extend( [ { "OP": "POSEIDON 4 LIMBS", "Weight in steps": 17, "Comment": "Cost of hashing the 4 limbs of 384 bits emulated field element with Poseidon", }, ] ) df_costs = pd.DataFrame(costs) print(tabulate(df_costs, headers="keys", tablefmt="github", showindex=False)) print("\n") df.sort_values(by="~steps", inplace=True) print( tabulate( df, headers="keys", tablefmt="github", showindex=False, floatfmt=".2f", ) ) df_sub_circuits = ( pd.DataFrame(sub_circuit_count) .set_index("Circuit") .fillna(0) .astype(int) .transpose() ) # print("\n") # print( # tabulate( # df_sub_circuits, # headers="keys", # tablefmt="github", # showindex=True, # ) # ) # print("\n") ================================================ FILE: tests/conftest.py ================================================ import os from pathlib import Path # Configure Hypothesis to store all its data in the .cargo/hypothesis directory build_path = Path(__file__).parent.parent / ".cargo" / "hypothesis" build_path.mkdir( parents=True, exist_ok=True ) # Ensure the .cargo/hypothesis directory exists # Set the environment variable before importing hypothesis os.environ["HYPOTHESIS_STORAGE_DIRECTORY"] = str(build_path) from hypothesis import settings from hypothesis.database import DirectoryBasedExampleDatabase # Also set the database for good measure settings.register_profile("default", database=DirectoryBasedExampleDatabase(build_path)) settings.load_profile("default") pytest_plugins = [ "tests.contracts_e2e.fixtures.accounts", "tests.contracts_e2e.fixtures.clients", "tests.contracts_e2e.fixtures.devnet", ] ================================================ FILE: tests/contracts_e2e/__init__.py ================================================ ================================================ FILE: tests/contracts_e2e/e2e_test.py ================================================ from pathlib import Path import pytest from starknet_py.contract import ( Contract, ContractFunction, InvokeResult, PreparedFunctionInvokeV3, ) from starknet_py.hash.address import compute_address from starknet_py.hash.utils import pedersen_hash from starknet_py.net.account.account import Account, BaseAccount from starknet_py.net.client_errors import ContractNotFoundError from garaga.curves import ProofSystem from garaga.hints.io import to_int from garaga.precompiled_circuits.zk_honk import honk_proof_from_bytes from garaga.starknet.cli.smart_contract_project import ( Groth16SmartContract, SmartContractProject, ) from garaga.starknet.groth16_contract_generator.generator import ECIP_OPS_CLASS_HASH from garaga.starknet.groth16_contract_generator.parsing_utils import ( find_item_from_key_patterns, ) from garaga.starknet.honk_contract_generator.calldata import ( HonkVk, get_ultra_flavor_honk_calldata_from_vk_and_proof, ) from garaga.starknet.tests_and_calldata_generators.drand_calldata import ( drand_encrypt_to_calldata, drand_round_to_calldata, ) CONTRACTS_PATH = Path("src/contracts") CONTRACTS_PATH_AUTOGENERATED = CONTRACTS_PATH / "autogenerated" GROTH16_EXAMPLES_PATH = Path( "hydra/garaga/starknet/groth16_contract_generator/examples" ) NOIR_EXAMPLES_PATH = Path("hydra/garaga/starknet/honk_contract_generator/examples") ALL_GROTH16_CONTRACTS = [ { "contract_project": Groth16SmartContract( smart_contract_folder=CONTRACTS_PATH_AUTOGENERATED / "sp1_verifier_bn254", vk_path=GROTH16_EXAMPLES_PATH / "vk_sp1.json", ), "proof_path": GROTH16_EXAMPLES_PATH / "proof_sp1.json", }, { "contract_project": Groth16SmartContract( smart_contract_folder=CONTRACTS_PATH_AUTOGENERATED / "risc0_verifier_bn254", vk_path=GROTH16_EXAMPLES_PATH / "vk_risc0.json", ), "proof_path": GROTH16_EXAMPLES_PATH / "proof_risc0.json", }, { "contract_project": Groth16SmartContract( smart_contract_folder=CONTRACTS_PATH_AUTOGENERATED / "groth16_example_bls12_381", vk_path=GROTH16_EXAMPLES_PATH / "vk_bls.json", ), "proof_path": GROTH16_EXAMPLES_PATH / "proof_bls.json", }, { "contract_project": Groth16SmartContract( smart_contract_folder=CONTRACTS_PATH_AUTOGENERATED / "groth16_example_bn254", vk_path=GROTH16_EXAMPLES_PATH / "vk_bn254.json", ), "proof_path": GROTH16_EXAMPLES_PATH / "proof_bn254.json", }, ] ECIP_CONTRACT = SmartContractProject( smart_contract_folder=CONTRACTS_PATH / "universal_ecip" ) DEPLOYER_ADDRESS = 0x41A78E741E5AF2FEC34B695679BC6891742439F7AFB8484ECD7766661AD02BF async def get_contract_if_exists( account: Account, contract_address: int ) -> Contract | None: try: res = await Contract.from_address(contract_address, account) return res except ContractNotFoundError: return None @pytest.mark.asyncio @pytest.mark.parametrize("contract_info", ALL_GROTH16_CONTRACTS) async def test_groth16_contracts(account_devnet: BaseAccount, contract_info: dict): account = account_devnet contract_project: Groth16SmartContract = contract_info["contract_project"] proof_path: Path = contract_info["proof_path"] print(f"ACCOUNT {hex(account.address)}, NONCE {await account.get_nonce()}") for i in range(2): print(f"\n\nROUND {i}") # Declare the ECIP contract ecip_class_hash, _ = await ECIP_CONTRACT.declare_class_hash(account) assert ( ecip_class_hash == ECIP_OPS_CLASS_HASH ), f"ECIP hardcoded class hash is not up to date, got {hex(ecip_class_hash)}, expected {hex(ECIP_OPS_CLASS_HASH)}" # Declare the groth16 contract groth16_class_hash, groth16_abi = await contract_project.declare_class_hash( account ) print(f"Declared contract class hash: {hex(groth16_class_hash)}") # Deploy the groth16 contract precomputed_address = compute_address( class_hash=groth16_class_hash, constructor_calldata=[], salt=pedersen_hash(to_int(account.address), 1), deployer_address=DEPLOYER_ADDRESS, ) try_contract = await get_contract_if_exists(account, precomputed_address) if try_contract is None: deploy_result = await Contract.deploy_contract_v3( account=account, class_hash=groth16_class_hash, abi=groth16_abi, deployer_address=DEPLOYER_ADDRESS, auto_estimate=True, salt=1, cairo_version=1, ) await deploy_result.wait_for_acceptance() contract = deploy_result.deployed_contract else: print(f"Contract already deployed at {hex(precomputed_address)}") contract = try_contract print(f"Deployed contract address: {hex(contract.address)}") print(f"Deployed contract: {contract.functions}") function_call: ContractFunction = find_item_from_key_patterns( contract.functions, ["verify"] ) prepare_invoke = PreparedFunctionInvokeV3( to_addr=function_call.contract_data.address, calldata=contract_project.generate_calldata( proof_path=proof_path, public_inputs_path=None ), selector=function_call.get_selector(function_call.name), _contract_data=function_call.contract_data, _client=function_call.client, _account=function_call.account, _payload_transformer=function_call._payload_transformer, resource_bounds=None, ) invoke_result: InvokeResult = await prepare_invoke.invoke(auto_estimate=True) await invoke_result.wait_for_acceptance() print(f"Invoke result : {invoke_result.status}") receipt = await account.client.get_transaction_receipt(invoke_result.hash) print( f"Execution resources: {contract_project.smart_contract_folder} \n{receipt.execution_resources}" ) @pytest.mark.asyncio @pytest.mark.parametrize( "contract_info", [ { "contract_project": SmartContractProject( smart_contract_folder=CONTRACTS_PATH / "drand_quicknet" ) }, ], ) async def test_drand_contract(account_devnet: BaseAccount, contract_info: dict): account = account_devnet contract_project: SmartContractProject = contract_info["contract_project"] print(f"ACCOUNT {hex(account.address)}, NONCE {await account.get_nonce()}") drand_class_hash, drand_abi = await contract_project.declare_class_hash(account) print(f"Declared contract class hash: {hex(drand_class_hash)}") # Deploy the drand contract precomputed_address = compute_address( class_hash=drand_class_hash, constructor_calldata=[], salt=pedersen_hash(to_int(account.address), 1), deployer_address=DEPLOYER_ADDRESS, ) try_contract = await get_contract_if_exists(account, precomputed_address) if try_contract is None: deploy_result = await Contract.deploy_contract_v3( account=account, class_hash=drand_class_hash, abi=drand_abi, deployer_address=DEPLOYER_ADDRESS, auto_estimate=True, salt=1, cairo_version=1, ) await deploy_result.wait_for_acceptance() contract = deploy_result.deployed_contract else: print(f"Contract already deployed at {hex(precomputed_address)}") contract = try_contract print(f"Deployed contract address: {hex(contract.address)}") print(f"Deployed contract: {contract.functions}") function_call: ContractFunction = find_item_from_key_patterns( contract.functions, ["verify"] ) for drand_round in range(1, 5): prepare_invoke = PreparedFunctionInvokeV3( to_addr=function_call.contract_data.address, calldata=drand_round_to_calldata(drand_round), selector=function_call.get_selector(function_call.name), _contract_data=function_call.contract_data, _client=function_call.client, _account=function_call.account, _payload_transformer=function_call._payload_transformer, resource_bounds=None, ) invoke_result: InvokeResult = await prepare_invoke.invoke(auto_estimate=True) await invoke_result.wait_for_acceptance() @pytest.mark.asyncio @pytest.mark.parametrize( "contract_info", [ { "verifier_project": SmartContractProject( smart_contract_folder=CONTRACTS_PATH / "drand_quicknet" ), "decrypt_project": SmartContractProject( smart_contract_folder=CONTRACTS_PATH / "drand_decrypt_quicknet" ), }, ], ) async def test_drand_decrypt_contract(account_devnet: BaseAccount, contract_info: dict): account = account_devnet # Step 1: Declare the verifier class (not deployed) and generate decrypt constants verifier_project: SmartContractProject = contract_info["verifier_project"] verifier_class_hash, _ = await verifier_project.declare_class_hash(account) print(f"Declared verifier class hash: {hex(verifier_class_hash)}") from garaga.starknet.tests_and_calldata_generators.drand_calldata import ( generate_drand_decrypt_constants, ) decrypt_project: SmartContractProject = contract_info["decrypt_project"] generate_drand_decrypt_constants( verifier_class_hash, decrypt_project.smart_contract_folder ) # Step 2: Declare and deploy the decrypt contract decrypt_class_hash, decrypt_abi = await decrypt_project.declare_class_hash(account) precomputed_address = compute_address( class_hash=decrypt_class_hash, constructor_calldata=[], salt=pedersen_hash(to_int(account.address), 2), deployer_address=DEPLOYER_ADDRESS, ) try_contract = await get_contract_if_exists(account, precomputed_address) if try_contract is None: deploy_result = await Contract.deploy_contract_v3( account=account, class_hash=decrypt_class_hash, abi=decrypt_abi, deployer_address=DEPLOYER_ADDRESS, auto_estimate=True, salt=2, cairo_version=1, ) await deploy_result.wait_for_acceptance() contract = deploy_result.deployed_contract else: contract = try_contract print(f"Deployed decrypt contract at: {hex(contract.address)}") print(f"Functions: {contract.functions}") verify_fn: ContractFunction = find_item_from_key_patterns( contract.functions, ["verify"] ) decrypt_fn: ContractFunction = find_item_from_key_patterns( contract.functions, ["decrypt"] ) # Step 3: Verify round 1 via library_call invoke = PreparedFunctionInvokeV3( to_addr=verify_fn.contract_data.address, calldata=drand_round_to_calldata(1), selector=verify_fn.get_selector(verify_fn.name), _contract_data=verify_fn.contract_data, _client=verify_fn.client, _account=verify_fn.account, _payload_transformer=verify_fn._payload_transformer, resource_bounds=None, ) result = await invoke.invoke(auto_estimate=True) await result.wait_for_acceptance() print("Round 1 verified via library_call") # Step 4: Decrypt for round 1 (signature already stored) decrypt_calldata = drand_encrypt_to_calldata( 1, b"0000000000000000", b"0000000000000000" ) invoke = PreparedFunctionInvokeV3( to_addr=decrypt_fn.contract_data.address, calldata=decrypt_calldata, selector=decrypt_fn.get_selector(decrypt_fn.name), _contract_data=decrypt_fn.contract_data, _client=decrypt_fn.client, _account=decrypt_fn.account, _payload_transformer=decrypt_fn._payload_transformer, resource_bounds=None, ) result = await invoke.invoke(auto_estimate=True) await result.wait_for_acceptance() print("Round 1 decrypted (stored sig)") # Step 5: Decrypt for round 2 (combined: verify inline + decrypt) encrypt_cd = drand_encrypt_to_calldata(2, b"0000000000000000", b"0000000000000000") verify_cd = drand_round_to_calldata(2) combined_data = encrypt_cd[1:] + verify_cd[1:] combined_calldata = [len(combined_data)] + combined_data invoke = PreparedFunctionInvokeV3( to_addr=decrypt_fn.contract_data.address, calldata=combined_calldata, selector=decrypt_fn.get_selector(decrypt_fn.name), _contract_data=decrypt_fn.contract_data, _client=decrypt_fn.client, _account=decrypt_fn.account, _payload_transformer=decrypt_fn._payload_transformer, resource_bounds=None, ) result = await invoke.invoke(auto_estimate=True) await result.wait_for_acceptance() print("Round 2 verified + decrypted in one tx") HONK_CONTRACTS = [ { "contract_project": SmartContractProject( smart_contract_folder=CONTRACTS_PATH_AUTOGENERATED / "noir_ultra_keccak_zk_honk_example", ), "vk_path": NOIR_EXAMPLES_PATH / "vk_ultra_keccak.bin", "public_inputs_path": NOIR_EXAMPLES_PATH / "public_inputs_ultra_keccak.bin", "proof_path": NOIR_EXAMPLES_PATH / "proof_ultra_keccak_zk.bin", "system": ProofSystem.UltraKeccakZKHonk, }, ] @pytest.mark.asyncio @pytest.mark.parametrize("contract_info", HONK_CONTRACTS) async def test_honk_contracts(account_devnet: BaseAccount, contract_info: dict): account = account_devnet contract_project: SmartContractProject = contract_info["contract_project"] vk_path: Path = contract_info["vk_path"] proof_path: Path = contract_info["proof_path"] public_inputs_path: Path = contract_info["public_inputs_path"] system: ProofSystem = contract_info["system"] vk = HonkVk.from_bytes(open(vk_path, "rb").read()) proof = honk_proof_from_bytes( open(proof_path, "rb").read(), open(public_inputs_path, "rb").read(), vk, system ) print(f"ACCOUNT {hex(account.address)}, NONCE {await account.get_nonce()}") # Declare the honk contract honk_class_hash, honk_abi = await contract_project.declare_class_hash(account) print(f"Declared contract class hash: {hex(honk_class_hash)}") # Deploy the honk contract precomputed_address = compute_address( class_hash=honk_class_hash, constructor_calldata=[], salt=pedersen_hash(to_int(account.address), 1), deployer_address=DEPLOYER_ADDRESS, ) try_contract = await get_contract_if_exists(account, precomputed_address) if try_contract is None: deploy_result = await Contract.deploy_contract_v3( account=account, class_hash=honk_class_hash, abi=honk_abi, deployer_address=DEPLOYER_ADDRESS, auto_estimate=True, salt=1, cairo_version=1, ) await deploy_result.wait_for_acceptance() contract = deploy_result.deployed_contract else: print(f"Contract already deployed at {hex(precomputed_address)}") contract = try_contract print(f"Deployed contract address: {hex(contract.address)}") print(f"Deployed contract: {contract.functions}") function_call: ContractFunction = find_item_from_key_patterns( contract.functions, ["verify"] ) prepare_invoke = PreparedFunctionInvokeV3( to_addr=function_call.contract_data.address, calldata=get_ultra_flavor_honk_calldata_from_vk_and_proof( vk=vk, proof=proof, system=system ), selector=function_call.get_selector(function_call.name), _contract_data=function_call.contract_data, _client=function_call.client, _account=function_call.account, _payload_transformer=function_call._payload_transformer, resource_bounds=None, ) invoke_result: InvokeResult = await prepare_invoke.invoke(auto_estimate=True) await invoke_result.wait_for_acceptance() print(f"Invoke result : {invoke_result.status}") receipt = await account.client.get_transaction_receipt(invoke_result.hash) print( f"Execution resources: {contract_project.smart_contract_folder} \n{receipt.execution_resources}\n" ) @pytest.mark.asyncio async def test_risc0_sample_app(account_devnet: BaseAccount): account = account_devnet lib_contract_project = Groth16SmartContract( smart_contract_folder=CONTRACTS_PATH_AUTOGENERATED / "risc0_verifier_bn254", vk_path=GROTH16_EXAMPLES_PATH / "vk_risc0.json", ) contract_project = SmartContractProject( smart_contract_folder=CONTRACTS_PATH / "risc0_sample_app" / "fibonacci_sequencer", ) proof_path = CONTRACTS_PATH / "risc0_sample_app" / "fibonacci_prover" / "proof.json" src_path = ( CONTRACTS_PATH / "risc0_sample_app" / "fibonacci_sequencer" / "src" / "lib.cairo" ) print(f"ACCOUNT {hex(account.address)}, NONCE {await account.get_nonce()}") # Declare the ECIP contract ecip_class_hash, _ = await ECIP_CONTRACT.declare_class_hash(account) assert ( ecip_class_hash == ECIP_OPS_CLASS_HASH ), f"ECIP hardcoded class hash is not up to date, got {hex(ecip_class_hash)}, expected {hex(ECIP_OPS_CLASS_HASH)}" # Declare the risc0 verifier contract lib_groth16_class_hash, _ = await lib_contract_project.declare_class_hash(account) print(f"Declared contract class hash: {hex(lib_groth16_class_hash)}") assert ( hex(lib_groth16_class_hash) in open(src_path).read() ), f"risc0_verifier_bn254 hardcoded class hash is not up to date, expected {hex(lib_groth16_class_hash)}" # Declare the risc0 sample app contract groth16_class_hash, groth16_abi = await contract_project.declare_class_hash(account) print(f"Declared contract class hash: {hex(groth16_class_hash)}") # Deploy the risc0 sample app contract precomputed_address = compute_address( class_hash=groth16_class_hash, constructor_calldata=[], salt=pedersen_hash(to_int(account.address), 1), deployer_address=DEPLOYER_ADDRESS, ) try_contract = await get_contract_if_exists(account, precomputed_address) if try_contract is None: deploy_result = await Contract.deploy_contract_v3( account=account, class_hash=groth16_class_hash, abi=groth16_abi, deployer_address=DEPLOYER_ADDRESS, auto_estimate=True, salt=1, cairo_version=1, ) await deploy_result.wait_for_acceptance() contract = deploy_result.deployed_contract else: print(f"Contract already deployed at {hex(precomputed_address)}") contract = try_contract print(f"Deployed contract address: {hex(contract.address)}") print(f"Deployed contract: {contract.functions}") function_call: ContractFunction = find_item_from_key_patterns( contract.functions, ["verify"] ) prepare_invoke = PreparedFunctionInvokeV3( to_addr=function_call.contract_data.address, calldata=lib_contract_project.generate_calldata( proof_path=proof_path, public_inputs_path=None ), selector=function_call.get_selector(function_call.name), _contract_data=function_call.contract_data, _client=function_call.client, _account=function_call.account, _payload_transformer=function_call._payload_transformer, resource_bounds=None, ) invoke_result: InvokeResult = await prepare_invoke.invoke(auto_estimate=True) await invoke_result.wait_for_acceptance() print(f"Invoke result : {invoke_result.status}") receipt = await account.client.get_transaction_receipt(invoke_result.hash) print(receipt.execution_resources) ================================================ FILE: tests/contracts_e2e/fixtures/__init__.py ================================================ ================================================ FILE: tests/contracts_e2e/fixtures/accounts.py ================================================ # pylint: disable=redefined-outer-name from dataclasses import dataclass from typing import List, Optional, Tuple import pytest import pytest_asyncio from starknet_py.contract import Contract from starknet_py.hash.address import compute_address from starknet_py.net.account.account import Account from starknet_py.net.account.base_account import BaseAccount from starknet_py.net.client_models import PriceUnit from starknet_py.net.full_node_client import FullNodeClient from starknet_py.net.http_client import HttpMethod, RpcHttpClient from starknet_py.net.models import AddressRepresentation, StarknetChainId from starknet_py.net.signer.key_pair import KeyPair from tests.contracts_e2e.fixtures.constants import ( DEVNET_PRE_DEPLOYED_ACCOUNT_ADDRESS, DEVNET_PRE_DEPLOYED_ACCOUNT_PRIVATE_KEY, MAX_RESOURCE_BOUNDS, ) from tests.contracts_e2e.utils import ( AccountToBeDeployedDetails, _get_random_private_key_unsafe, _new_address, get_deploy_account_transaction, prepay_account, ) @dataclass class AccountPrerequisites: address: AddressRepresentation salt: int calldata: list[int] key_pair: KeyPair async def devnet_account_details( client: FullNodeClient, class_hash: int, devnet, ) -> Tuple[str, str]: """ Deploys an Account and adds fee tokens to its balance (only on devnet). """ private_key = _get_random_private_key_unsafe() key_pair = KeyPair.from_private_key(private_key) salt = 1 address = compute_address( class_hash=class_hash, constructor_calldata=[key_pair.public_key], salt=salt, deployer_address=0, ) await mint_token_on_devnet(devnet, address, int(1e30), PriceUnit.WEI.value) await mint_token_on_devnet(devnet, address, int(1e30), PriceUnit.FRI.value) deploy_account_tx = await get_deploy_account_transaction( address=address, key_pair=key_pair, salt=salt, class_hash=class_hash, client=client, ) account = Account( address=address, client=client, key_pair=key_pair, chain=StarknetChainId.SEPOLIA, ) res = await account.client.deploy_account(deploy_account_tx) await account.client.wait_for_tx(res.transaction_hash) return hex(address), hex(key_pair.private_key) async def mint_token_on_devnet(url: str, address: int, amount: int, unit: str): http_client = RpcHttpClient(url) await http_client.request( http_method=HttpMethod.POST, address=f"{url}/mint", payload={"address": hex(address), "amount": amount, "unit": unit}, ) @pytest.fixture(name="account_devnet", scope="package") def full_node_account(client_devnet: FullNodeClient) -> BaseAccount: """ Returns a new Account created with FullNodeClient. """ address = DEVNET_PRE_DEPLOYED_ACCOUNT_ADDRESS private_key = DEVNET_PRE_DEPLOYED_ACCOUNT_PRIVATE_KEY return Account( address=address, client=client_devnet, key_pair=KeyPair.from_private_key(int(private_key, 0)), chain=StarknetChainId.SEPOLIA, ) @dataclass class AccountToBeDeployedDetailsFactory: class_hash: int eth_fee_contract: Contract strk_fee_contract: Contract async def get( self, *, class_hash: Optional[int] = None, calldata: Optional[List[int]] = None, ) -> AccountToBeDeployedDetails: key_pair = KeyPair.from_private_key(_get_random_private_key_unsafe()) calldata = calldata if calldata is not None else [] class_hash = class_hash if class_hash is not None else self.class_hash if calldata == []: calldata = [key_pair.public_key] address, salt = _new_address( class_hash=class_hash, calldata=calldata, ) await prepay_account( address=address, eth_fee_contract=self.eth_fee_contract, strk_fee_contract=self.strk_fee_contract, ) return address, key_pair, salt, class_hash @pytest_asyncio.fixture(scope="package") async def deploy_account_details_factory( account_with_validate_deploy_class_hash: int, eth_fee_contract: Contract, strk_fee_contract: Contract, ) -> AccountToBeDeployedDetailsFactory: """ Returns AccountToBeDeployedDetailsFactory. The Factory's get() method returns: address, key_pair, salt and class_hash of the account with validate deploy. Prefunds the address with enough tokens to allow for deployment. """ return AccountToBeDeployedDetailsFactory( class_hash=account_with_validate_deploy_class_hash, eth_fee_contract=eth_fee_contract, strk_fee_contract=strk_fee_contract, ) @pytest.fixture(scope="package") def pre_deployed_account_with_validate_deploy(client) -> BaseAccount: """ Returns an Account pre-deployed on specified network. Used to deploy other accounts. """ address = DEVNET_PRE_DEPLOYED_ACCOUNT_ADDRESS private_key = DEVNET_PRE_DEPLOYED_ACCOUNT_PRIVATE_KEY return Account( address=address, client=client, key_pair=KeyPair.from_private_key(int(private_key, 16)), chain=StarknetChainId.SEPOLIA, ) @pytest_asyncio.fixture(scope="function") async def argent_account_v040_data( argent_account_v040_class_hash, eth_fee_contract: Contract, strk_fee_contract: Contract, ) -> AccountPrerequisites: key_pair = KeyPair.from_private_key(_get_random_private_key_unsafe()) # Based on ABI definition documentation constructor_calldata = [ 0, key_pair.public_key, 1, ] address, salt = _new_address(argent_account_v040_class_hash, constructor_calldata) await prepay_account( address=address, eth_fee_contract=eth_fee_contract, strk_fee_contract=strk_fee_contract, ) return AccountPrerequisites(address, salt, constructor_calldata, key_pair) @pytest_asyncio.fixture(scope="package") async def argent_account_v040( argent_account_v040_class_hash, eth_fee_contract: Contract, strk_fee_contract: Contract, client, ) -> BaseAccount: key_pair = KeyPair.from_private_key(_get_random_private_key_unsafe()) # Based on ABI definition documentation constructor_calldata = [ 0, key_pair.public_key, 1, ] address, salt = _new_address(argent_account_v040_class_hash, constructor_calldata) await prepay_account( address=address, eth_fee_contract=eth_fee_contract, strk_fee_contract=strk_fee_contract, ) deploy_result = await Account.deploy_account_v3( address=address, class_hash=argent_account_v040_class_hash, salt=salt, key_pair=key_pair, client=client, constructor_calldata=constructor_calldata, resource_bounds=MAX_RESOURCE_BOUNDS, ) await deploy_result.wait_for_acceptance() return deploy_result.account ================================================ FILE: tests/contracts_e2e/fixtures/clients.py ================================================ import pytest from starknet_py.net.full_node_client import FullNodeClient from tests.contracts_e2e.fixtures.constants import SEPOLIA_RPC_URL @pytest.fixture(name="client_devnet", scope="package") def create_full_node_client_devnet(devnet) -> FullNodeClient: return FullNodeClient(node_url=devnet + "/rpc") @pytest.fixture(name="client_sepolia", scope="package") def create_full_node_client_sepolia() -> FullNodeClient: return FullNodeClient(node_url=SEPOLIA_RPC_URL) ================================================ FILE: tests/contracts_e2e/fixtures/constants.py ================================================ import os from pathlib import Path from dotenv import load_dotenv from starknet_py.net.client_models import ResourceBounds, ResourceBoundsMapping load_dotenv(dotenv_path=Path(os.path.dirname(__file__)) / "../test-variables.env") def _get_env_or_throw(env_name: str) -> str: env = os.getenv(key=env_name) if env is None: raise ValueError( f"{env_name} environmental variable is not set. " f"Update it manually or set it in `starknet_py/tests/e2e/test-variables.env` file. " f"More info here: https://starknetpy.readthedocs.io/en/latest/development.html#setup" ) return env def _get_env_lambda(env_name): return lambda: _get_env_or_throw(env_name) # -------------------------------- SEPOLIA TESTNET ------------------------------------- SEPOLIA_ACCOUNT_PRIVATE_KEY = _get_env_lambda("SEPOLIA_ACCOUNT_PRIVATE_KEY") SEPOLIA_ACCOUNT_ADDRESS = _get_env_lambda("SEPOLIA_ACCOUNT_ADDRESS") SEPOLIA_RPC_URL = _get_env_lambda("SEPOLIA_RPC_URL") EMPTY_CONTRACT_ADDRESS_SEPOLIA = ( "0x06524771cb912945bf2db355b5a12355ca2e2ff05e15ee35366336a602293f2d" ) # ----------------------------------------------------------------------------- DEVNET_PRE_DEPLOYED_ACCOUNT_ADDRESS = ( "0x260a8311b4f1092db620b923e8d7d20e76dedcc615fb4b6fdf28315b81de201" ) DEVNET_PRE_DEPLOYED_ACCOUNT_PRIVATE_KEY = "0xc10662b7b247c7cecf7e8a30726cff12" STRK_FEE_CONTRACT_ADDRESS = ( "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d" ) STRK_CLASS_HASH = "0x04ad3c1dc8413453db314497945b6903e1c766495a1e60492d44da9c2a986e4b" MAX_RESOURCE_BOUNDS_L1 = ResourceBounds( max_amount=int(1e5), max_price_per_unit=int(1e13) ) MAX_RESOURCE_BOUNDS = ResourceBoundsMapping( l1_gas=ResourceBounds(max_amount=int(1e5), max_price_per_unit=int(1e13)), l2_gas=ResourceBounds(max_amount=int(1e10), max_price_per_unit=int(1e20)), l1_data_gas=ResourceBounds(max_amount=int(1e5), max_price_per_unit=int(1e13)), ) MAX_RESOURCE_BOUNDS_SEPOLIA = ResourceBoundsMapping( l1_gas=ResourceBounds(max_amount=int(1e4), max_price_per_unit=int(1e15)), l2_gas=ResourceBounds(max_amount=int(1e6), max_price_per_unit=int(1e10)), l1_data_gas=ResourceBounds(max_amount=int(1e4), max_price_per_unit=int(1e15)), ) MOCK_DIR = Path(os.path.dirname(__file__)) / "../mock" TYPED_DATA_DIR = MOCK_DIR / "typed_data" CONTRACTS_DIR = MOCK_DIR / "contracts" CONTRACTS_COMPILED_V0_DIR = MOCK_DIR / "contracts_compiled" # PRECOMPILED_CONTRACTS are contracts compiled with various Sierras # They are mainly used to verify if we compute class_hash for older Sierras correctly PRECOMPILED_CONTRACTS_DIR = MOCK_DIR / "precompiled_contracts" CONTRACTS_V2_COMPILED = MOCK_DIR / "contracts_v2/target/dev" CONTRACTS_V2_ARTIFACTS_MAP = ( CONTRACTS_V2_COMPILED / "contracts_v2.starknet_artifacts.json" ) CONTRACTS_V1_COMPILED = MOCK_DIR / "contracts_v1/target/dev" CONTRACTS_V1_ARTIFACTS_MAP = ( CONTRACTS_V1_COMPILED / "contracts_v1.starknet_artifacts.json" ) ================================================ FILE: tests/contracts_e2e/fixtures/devnet.py ================================================ import socket import subprocess import time from contextlib import closing from pathlib import Path from typing import Generator, List import pytest from tests.contracts_e2e.fixtures.constants import SEPOLIA_RPC_URL def get_available_port() -> int: with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock: sock.bind(("", 0)) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) return sock.getsockname()[1] def start_devnet(fork_mode: bool = False): devnet_port = get_available_port() start_devnet_command = get_start_devnet_command(devnet_port, fork_mode=fork_mode) # pylint: disable=consider-using-with proc = subprocess.Popen(start_devnet_command) time.sleep(5) return devnet_port, proc def get_start_devnet_command(devnet_port: int, fork_mode: bool = False) -> List[str]: devnet_path = Path(__file__).parent.parent / "devnet" / "bin" / "starknet-devnet" start_command = [ str(devnet_path), "--port", str(devnet_port), "--accounts", # deploys specified number of accounts str(1), "--seed", # generates same accounts each time str(1), "--state-archive-capacity", "full", "--block-generation-on", "transaction", "--initial-balance", "1000000000000000000000000000000000000000000000000000000000000000000", ] if fork_mode: start_command.extend( [ "--fork-network", str(SEPOLIA_RPC_URL()), ] ) return start_command @pytest.fixture(scope="package") def devnet() -> Generator[str, None, None]: """ Runs devnet instance once per module and returns it's address. """ devnet_port, proc = start_devnet() yield f"http://localhost:{devnet_port}" proc.kill() @pytest.fixture(scope="package") def devnet_forking_mode() -> Generator[str, None, None]: """ Runs devnet instance once per module and returns its address. """ devnet_port, proc = start_devnet(fork_mode=True) yield f"http://localhost:{devnet_port}" proc.kill() ================================================ FILE: tests/contracts_e2e/install_devnet.sh ================================================ #!/bin/bash set -e DEVNET_INSTALL_DIR="$(git rev-parse --show-toplevel)/tests/contracts_e2e/devnet/bin" DEVNET_REPO="https://github.com/0xSpaceShard/starknet-devnet" DEVNET_VERSION="v0.5.1" require_cmd() { if ! command -v "$1" >/dev/null 2>&1; then echo "$1 is not available" echo "Please install $1 and run the script again" exit 1 fi } get_architecture() { local _ostype _cputype _arch _clibtype _ostype="$(uname -s)" _cputype="$(uname -m)" _clibtype="gnu" if [ "$_ostype" = Linux ] && ldd --_requested_version 2>&1 | grep -q 'musl'; then _clibtype="musl" fi if [ "$_ostype" = Darwin ] && [ "$_cputype" = i386 ] && sysctl hw.optional.x86_64 | grep -q ': 1'; then _cputype=x86_64 fi case "$_ostype" in Linux) _ostype=unknown-linux-$_clibtype ;; Darwin) _ostype=apple-darwin ;; *) err "unsupported OS type: $_ostype" ;; esac case "$_cputype" in aarch64 | arm64) _cputype=aarch64 ;; x86_64 | x86-64 | x64 | amd64) _cputype=x86_64 ;; *) err "unknown CPU type: $_cputype" ;; esac _arch="${_cputype}-${_ostype}" RETVAL="$_arch" } require_cmd curl require_cmd tar get_architecture SYSTEM_TRIPLET="$RETVAL" mkdir -p "${DEVNET_INSTALL_DIR}" curl -L "${DEVNET_REPO}/releases/download/${DEVNET_VERSION}/starknet-devnet-${SYSTEM_TRIPLET}.tar.gz" | tar -xz -C "${DEVNET_INSTALL_DIR}" || exit 1 echo "All done!" exit 0 ================================================ FILE: tests/contracts_e2e/test-variables.env.template ================================================ SEPOLIA_RPC_URL=URL SEPOLIA_ACCOUNT_PRIVATE_KEY=0xabcdef SEPOLIA_ACCOUNT_ADDRESS=0xfedcba SEPOLIA = ================================================ FILE: tests/contracts_e2e/utils.py ================================================ import random from typing import List, Tuple from starknet_py.constants import EC_ORDER from starknet_py.contract import Contract from starknet_py.hash.address import compute_address from starknet_py.net.account.account import Account from starknet_py.net.client import Client from starknet_py.net.http_client import HttpClient, HttpMethod from starknet_py.net.models import DeployAccountV3, StarknetChainId from starknet_py.net.signer.key_pair import KeyPair from starknet_py.net.udc_deployer.deployer import _get_random_salt from tests.contracts_e2e.fixtures.constants import MAX_RESOURCE_BOUNDS AccountToBeDeployedDetails = Tuple[int, KeyPair, int, int] def _new_address( class_hash: int, calldata: List[int], ): salt = _get_random_salt() return ( compute_address( salt=salt, class_hash=class_hash, constructor_calldata=calldata, deployer_address=0, ), salt, ) async def prepay_account( *, address: int, eth_fee_contract: Contract, strk_fee_contract: Contract, ): """ Transfer fees from system contracts (ETH and STRK) to address specified. :param address: Address of the account to send funds to. :param eth_fee_contract: Contract for prefunding deployments in ETH. :param strk_fee_contract: Contract for prefunding deployments in STRK. """ transfer_wei_res = await eth_fee_contract.functions["transfer"].invoke_v3( recipient=address, amount=int(1e40), resource_bounds=MAX_RESOURCE_BOUNDS ) await transfer_wei_res.wait_for_acceptance() transfer_fri_res = await strk_fee_contract.functions["transfer"].invoke_v3( recipient=address, amount=int(1e40), resource_bounds=MAX_RESOURCE_BOUNDS ) await transfer_fri_res.wait_for_acceptance() async def get_deploy_account_transaction( *, address: int, key_pair: KeyPair, salt: int, class_hash: int, client: Client ) -> DeployAccountV3: """ Get a signed DeployAccount transaction from provided details """ account = Account( address=address, client=client, key_pair=key_pair, chain=StarknetChainId.SEPOLIA, ) return await account.sign_deploy_account_v3( class_hash=class_hash, contract_address_salt=salt, constructor_calldata=[key_pair.public_key], resource_bounds=MAX_RESOURCE_BOUNDS, ) def _get_random_private_key_unsafe() -> int: """ Returns a private key in the range [1, EC_ORDER). This is not a safe way of generating private keys and should be used only in tests. """ return random.randint(1, EC_ORDER - 1) async def create_empty_block(http_client: HttpClient) -> None: url = http_client.url[:-4] if http_client.url.endswith("/rpc") else http_client.url await http_client.request( address=f"{url}/create_block", http_method=HttpMethod.POST, ) ================================================ FILE: tests/ed25519_test_vectors.json ================================================ [ { "secret_key": "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", "public_key": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", "message": "", "signed": "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", "signature": "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b" }, { "secret_key": "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb", "public_key": "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", "message": "72", "signed": "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c0072", "signature": "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00" }, { "secret_key": "c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7", "public_key": "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025", "message": "af82", "signed": "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40aaf82", "signature": "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a" }, { "secret_key": "0d4a05b07352a5436e180356da0ae6efa0345ff7fb1572575772e8005ed978e9", "public_key": "e61a185bcef2613a6c7cb79763ce945d3b245d76114dd440bcf5f2dc1aa57057", "message": "cbc77b", "signed": "d9868d52c2bebce5f3fa5a79891970f309cb6591e3e1702a70276fa97c24b3a8e58606c38c9758529da50ee31b8219cba45271c689afa60b0ea26c99db19b00ccbc77b", "signature": "d9868d52c2bebce5f3fa5a79891970f309cb6591e3e1702a70276fa97c24b3a8e58606c38c9758529da50ee31b8219cba45271c689afa60b0ea26c99db19b00c" }, { "secret_key": "6df9340c138cc188b5fe4464ebaa3f7fc206a2d55c3434707e74c9fc04e20ebb", "public_key": "c0dac102c4533186e25dc43128472353eaabdb878b152aeb8e001f92d90233a7", "message": "5f4c8989", "signed": "124f6fc6b0d100842769e71bd530664d888df8507df6c56dedfdb509aeb93416e26b918d38aa06305df3095697c18b2aa832eaa52edc0ae49fbae5a85e150c075f4c8989", "signature": "124f6fc6b0d100842769e71bd530664d888df8507df6c56dedfdb509aeb93416e26b918d38aa06305df3095697c18b2aa832eaa52edc0ae49fbae5a85e150c07" }, { "secret_key": "b780381a65edf8b78f6945e8dbec7941ac049fd4c61040cf0c324357975a293c", "public_key": "e253af0766804b869bb1595be9765b534886bbaab8305bf50dbc7f899bfb5f01", "message": "18b6bec097", "signed": "b2fc46ad47af464478c199e1f8be169f1be6327c7f9a0a6689371ca94caf04064a01b22aff1520abd58951341603faed768cf78ce97ae7b038abfe456aa17c0918b6bec097", "signature": "b2fc46ad47af464478c199e1f8be169f1be6327c7f9a0a6689371ca94caf04064a01b22aff1520abd58951341603faed768cf78ce97ae7b038abfe456aa17c09" }, { "secret_key": "78ae9effe6f245e924a7be63041146ebc670dbd3060cba67fbc6216febc44546", "public_key": "fbcfbfa40505d7f2be444a33d185cc54e16d615260e1640b2b5087b83ee3643d", "message": "89010d855972", "signed": "6ed629fc1d9ce9e1468755ff636d5a3f40a5d9c91afd93b79d241830f7e5fa29854b8f20cc6eecbb248dbd8d16d14e99752194e4904d09c74d639518839d230089010d855972", "signature": "6ed629fc1d9ce9e1468755ff636d5a3f40a5d9c91afd93b79d241830f7e5fa29854b8f20cc6eecbb248dbd8d16d14e99752194e4904d09c74d639518839d2300" }, { "secret_key": "691865bfc82a1e4b574eecde4c7519093faf0cf867380234e3664645c61c5f79", "public_key": "98a5e3a36e67aaba89888bf093de1ad963e774013b3902bfab356d8b90178a63", "message": "b4a8f381e70e7a", "signed": "6e0af2fe55ae377a6b7a7278edfb419bd321e06d0df5e27037db8812e7e3529810fa5552f6c0020985ca17a0e02e036d7b222a24f99b77b75fdd16cb05568107b4a8f381e70e7a", "signature": "6e0af2fe55ae377a6b7a7278edfb419bd321e06d0df5e27037db8812e7e3529810fa5552f6c0020985ca17a0e02e036d7b222a24f99b77b75fdd16cb05568107" }, { "secret_key": "3b26516fb3dc88eb181b9ed73f0bcd52bcd6b4c788e4bcaf46057fd078bee073", "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", "message": "4284abc51bb67235", "signed": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa084284abc51bb67235", "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08" }, { "secret_key": "edc6f5fbdd1cee4d101c063530a30490b221be68c036f5b07d0f953b745df192", "public_key": "c1a49c66e617f9ef5ec66bc4c6564ca33de2a5fb5e1464062e6d6c6219155efd", "message": "672bf8965d04bc5146", "signed": "2c76a04af2391c147082e33faacdbe56642a1e134bd388620b852b901a6bc16ff6c9cc9404c41dea12ed281da067a1513866f9d964f8bdd24953856c50042901672bf8965d04bc5146", "signature": "2c76a04af2391c147082e33faacdbe56642a1e134bd388620b852b901a6bc16ff6c9cc9404c41dea12ed281da067a1513866f9d964f8bdd24953856c50042901" }, { "secret_key": "4e7d21fb3b1897571a445833be0f9fd41cd62be3aa04040f8934e1fcbdcacd45", "public_key": "31b2524b8348f7ab1dfafa675cc538e9a84e3fe5819e27c12ad8bbc1a36e4dff", "message": "33d7a786aded8c1bf691", "signed": "28e4598c415ae9de01f03f9f3fab4e919e8bf537dd2b0cdf6e79b9e6559c9409d9151a4c40f083193937627c369488259e99da5a9f0a87497fa6696a5dd6ce0833d7a786aded8c1bf691", "signature": "28e4598c415ae9de01f03f9f3fab4e919e8bf537dd2b0cdf6e79b9e6559c9409d9151a4c40f083193937627c369488259e99da5a9f0a87497fa6696a5dd6ce08" }, { "secret_key": "a980f892db13c99a3e8971e965b2ff3d41eafd54093bc9f34d1fd22d84115bb6", "public_key": "44b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f", "message": "3486f68848a65a0eb5507d", "signed": "77d389e599630d934076329583cd4105a649a9292abc44cd28c40000c8e2f5ac7660a81c85b72af8452d7d25c070861dae91601c7803d656531650dd4e5c41003486f68848a65a0eb5507d", "signature": "77d389e599630d934076329583cd4105a649a9292abc44cd28c40000c8e2f5ac7660a81c85b72af8452d7d25c070861dae91601c7803d656531650dd4e5c4100" }, { "secret_key": "5b5a619f8ce1c66d7ce26e5a2ae7b0c04febcd346d286c929e19d0d5973bfef9", "public_key": "6fe83693d011d111131c4f3fbaaa40a9d3d76b30012ff73bb0e39ec27ab18257", "message": "5a8d9d0a22357e6655f9c785", "signed": "0f9ad9793033a2fa06614b277d37381e6d94f65ac2a5a94558d09ed6ce922258c1a567952e863ac94297aec3c0d0c8ddf71084e504860bb6ba27449b55adc40e5a8d9d0a22357e6655f9c785", "signature": "0f9ad9793033a2fa06614b277d37381e6d94f65ac2a5a94558d09ed6ce922258c1a567952e863ac94297aec3c0d0c8ddf71084e504860bb6ba27449b55adc40e" }, { "secret_key": "940c89fe40a81dafbdb2416d14ae469119869744410c3303bfaa0241dac57800", "public_key": "a2eb8c0501e30bae0cf842d2bde8dec7386f6b7fc3981b8c57c9792bb94cf2dd", "message": "b87d3813e03f58cf19fd0b6395", "signed": "d8bb64aad8c9955a115a793addd24f7f2b077648714f49c4694ec995b330d09d640df310f447fd7b6cb5c14f9fe9f490bcf8cfadbfd2169c8ac20d3b8af49a0cb87d3813e03f58cf19fd0b6395", "signature": "d8bb64aad8c9955a115a793addd24f7f2b077648714f49c4694ec995b330d09d640df310f447fd7b6cb5c14f9fe9f490bcf8cfadbfd2169c8ac20d3b8af49a0c" }, { "secret_key": "9acad959d216212d789a119252ebfe0c96512a23c73bd9f3b202292d6916a738", "public_key": "cf3af898467a5b7a52d33d53bc037e2642a8da996903fc252217e9c033e2f291", "message": "55c7fa434f5ed8cdec2b7aeac173", "signed": "6ee3fe81e23c60eb2312b2006b3b25e6838e02106623f844c44edb8dafd66ab0671087fd195df5b8f58a1d6e52af42908053d55c7321010092748795ef94cf0655c7fa434f5ed8cdec2b7aeac173", "signature": "6ee3fe81e23c60eb2312b2006b3b25e6838e02106623f844c44edb8dafd66ab0671087fd195df5b8f58a1d6e52af42908053d55c7321010092748795ef94cf06" }, { "secret_key": "d5aeee41eeb0e9d1bf8337f939587ebe296161e6bf5209f591ec939e1440c300", "public_key": "fd2a565723163e29f53c9de3d5e8fbe36a7ab66e1439ec4eae9c0a604af291a5", "message": "0a688e79be24f866286d4646b5d81c", "signed": "f68d04847e5b249737899c014d31c805c5007a62c0a10d50bb1538c5f35503951fbc1e08682f2cc0c92efe8f4985dec61dcbd54d4b94a22547d24451271c8b000a688e79be24f866286d4646b5d81c", "signature": "f68d04847e5b249737899c014d31c805c5007a62c0a10d50bb1538c5f35503951fbc1e08682f2cc0c92efe8f4985dec61dcbd54d4b94a22547d24451271c8b00" }, { "secret_key": "0a47d10452ae2febec518a1c7c362890c3fc1a49d34b03b6467d35c904a8362d", "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", "signed": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500cc942fa7ac6b23ab7ff612fdc8e68ef39", "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c" }, { "secret_key": "f8148f7506b775ef46fdc8e8c756516812d47d6cfbfa318c27c9a22641e56f17", "public_key": "0445e456dacc7d5b0bbed23c8200cdb74bdcb03e4c7b73f0a2b9b46eac5d4372", "message": "7368724a5b0efb57d28d97622dbde725af", "signed": "3653ccb21219202b8436fb41a32ba2618c4a133431e6e63463ceb3b6106c4d56e1d2ba165ba76eaad3dc39bffb130f1de3d8e6427db5b71938db4e272bc3e20b7368724a5b0efb57d28d97622dbde725af", "signature": "3653ccb21219202b8436fb41a32ba2618c4a133431e6e63463ceb3b6106c4d56e1d2ba165ba76eaad3dc39bffb130f1de3d8e6427db5b71938db4e272bc3e20b" }, { "secret_key": "77f88691c4eff23ebb7364947092951a5ff3f10785b417e918823a552dab7c75", "public_key": "74d29127f199d86a8676aec33b4ce3f225ccb191f52c191ccd1e8cca65213a6b", "message": "bd8e05033f3a8bcdcbf4beceb70901c82e31", "signed": "fbe929d743a03c17910575492f3092ee2a2bf14a60a3fcacec74a58c7334510fc262db582791322d6c8c41f1700adb80027ecabc14270b703444ae3ee7623e0abd8e05033f3a8bcdcbf4beceb70901c82e31", "signature": "fbe929d743a03c17910575492f3092ee2a2bf14a60a3fcacec74a58c7334510fc262db582791322d6c8c41f1700adb80027ecabc14270b703444ae3ee7623e0a" }, { "secret_key": "ab6f7aee6a0837b334ba5eb1b2ad7fcecfab7e323cab187fe2e0a95d80eff132", "public_key": "5b96dca497875bf9664c5e75facf3f9bc54bae913d66ca15ee85f1491ca24d2c", "message": "8171456f8b907189b1d779e26bc5afbb08c67a", "signed": "73bca64e9dd0db88138eedfafcea8f5436cfb74bfb0e7733cf349baa0c49775c56d5934e1d38e36f39b7c5beb0a836510c45126f8ec4b6810519905b0ca07c098171456f8b907189b1d779e26bc5afbb08c67a", "signature": "73bca64e9dd0db88138eedfafcea8f5436cfb74bfb0e7733cf349baa0c49775c56d5934e1d38e36f39b7c5beb0a836510c45126f8ec4b6810519905b0ca07c09" }, { "secret_key": "8d135de7c8411bbdbd1b31e5dc678f2ac7109e792b60f38cd24936e8a898c32d", "public_key": "1ca281938529896535a7714e3584085b86ef9fec723f42819fc8dd5d8c00817f", "message": "8ba6a4c9a15a244a9c26bb2a59b1026f21348b49", "signed": "a1adc2bc6a2d980662677e7fdff6424de7dba50f5795ca90fdf3e96e256f3285cac71d3360482e993d0294ba4ec7440c61affdf35fe83e6e04263937db93f1058ba6a4c9a15a244a9c26bb2a59b1026f21348b49", "signature": "a1adc2bc6a2d980662677e7fdff6424de7dba50f5795ca90fdf3e96e256f3285cac71d3360482e993d0294ba4ec7440c61affdf35fe83e6e04263937db93f105" }, { "secret_key": "0e765d720e705f9366c1ab8c3fa84c9a44370c06969f803296884b2846a652a4", "public_key": "7fae45dd0a05971026d410bc497af5be7d0827a82a145c203f625dfcb8b03ba8", "message": "1d566a6232bbaab3e6d8804bb518a498ed0f904986", "signed": "bb61cf84de61862207c6a455258bc4db4e15eea0317ff88718b882a06b5cf6ec6fd20c5a269e5d5c805bafbcc579e2590af414c7c227273c102a10070cdfe80f1d566a6232bbaab3e6d8804bb518a498ed0f904986", "signature": "bb61cf84de61862207c6a455258bc4db4e15eea0317ff88718b882a06b5cf6ec6fd20c5a269e5d5c805bafbcc579e2590af414c7c227273c102a10070cdfe80f" }, { "secret_key": "db36e326d676c2d19cc8fe0c14b709202ecfc761d27089eb6ea4b1bb021ecfa7", "public_key": "48359b850d23f0715d94bb8bb75e7e14322eaf14f06f28a805403fbda002fc85", "message": "1b0afb0ac4ba9ab7b7172cddc9eb42bba1a64bce47d4", "signed": "b6dcd09989dfbac54322a3ce87876e1d62134da998c79d24b50bd7a6a797d86a0e14dc9d7491d6c14a673c652cfbec9f962a38c945da3b2f0879d0b68a9213001b0afb0ac4ba9ab7b7172cddc9eb42bba1a64bce47d4", "signature": "b6dcd09989dfbac54322a3ce87876e1d62134da998c79d24b50bd7a6a797d86a0e14dc9d7491d6c14a673c652cfbec9f962a38c945da3b2f0879d0b68a921300" }, { "secret_key": "c89955e0f7741d905df0730b3dc2b0ce1a13134e44fef3d40d60c020ef19df77", "public_key": "fdb30673402faf1c8033714f3517e47cc0f91fe70cf3836d6c23636e3fd2287c", "message": "507c94c8820d2a5793cbf3442b3d71936f35fe3afef316", "signed": "7ef66e5e86f2360848e0014e94880ae2920ad8a3185a46b35d1e07dea8fa8ae4f6b843ba174d99fa7986654a0891c12a794455669375bf92af4cc2770b579e0c507c94c8820d2a5793cbf3442b3d71936f35fe3afef316", "signature": "7ef66e5e86f2360848e0014e94880ae2920ad8a3185a46b35d1e07dea8fa8ae4f6b843ba174d99fa7986654a0891c12a794455669375bf92af4cc2770b579e0c" }, { "secret_key": "4e62627fc221142478aee7f00781f817f662e3b75db29bb14ab47cf8e84104d6", "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", "signed": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70ad3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a" }, { "secret_key": "6b83d7da8908c3e7205b39864b56e5f3e17196a3fc9c2f5805aad0f5554c142d", "public_key": "d0c846f97fe28585c0ee159015d64c56311c886eddcc185d296dbb165d2625d6", "message": "6ada80b6fa84f7034920789e8536b82d5e4678059aed27f71c", "signed": "16e462a29a6dd498685a3718b3eed00cc1598601ee47820486032d6b9acc9bf89f57684e08d8c0f05589cda2882a05dc4c63f9d0431d6552710812433003bc086ada80b6fa84f7034920789e8536b82d5e4678059aed27f71c", "signature": "16e462a29a6dd498685a3718b3eed00cc1598601ee47820486032d6b9acc9bf89f57684e08d8c0f05589cda2882a05dc4c63f9d0431d6552710812433003bc08" }, { "secret_key": "19a91fe23a4e9e33ecc474878f57c64cf154b394203487a7035e1ad9cd697b0d", "public_key": "2bf32ba142ba4622d8f3e29ecd85eea07b9c47be9d64412c9b510b27dd218b23", "message": "82cb53c4d5a013bae5070759ec06c3c6955ab7a4050958ec328c", "signed": "881f5b8c5a030df0f75b6634b070dd27bd1ee3c08738ae349338b3ee6469bbf9760b13578a237d5182535ede121283027a90b5f865d63a6537dca07b44049a0f82cb53c4d5a013bae5070759ec06c3c6955ab7a4050958ec328c", "signature": "881f5b8c5a030df0f75b6634b070dd27bd1ee3c08738ae349338b3ee6469bbf9760b13578a237d5182535ede121283027a90b5f865d63a6537dca07b44049a0f" }, { "secret_key": "1d5b8cb6215c18141666baeefcf5d69dad5bea9a3493dddaa357a4397a13d4de", "public_key": "94d23d977c33e49e5e4992c68f25ec99a27c41ce6b91f2bfa0cd8292fe962835", "message": "a9a8cbb0ad585124e522abbfb40533bdd6f49347b55b18e8558cb0", "signed": "3acd39bec8c3cd2b44299722b5850a0400c1443590fd4861d59aae7496acb3df73fc3fdf7969ae5f50ba47dddc435246e5fd376f6b891cd4c2caf5d614b6170ca9a8cbb0ad585124e522abbfb40533bdd6f49347b55b18e8558cb0", "signature": "3acd39bec8c3cd2b44299722b5850a0400c1443590fd4861d59aae7496acb3df73fc3fdf7969ae5f50ba47dddc435246e5fd376f6b891cd4c2caf5d614b6170c" }, { "secret_key": "6a91b3227c472299089bdce9356e726a40efd840f11002708b7ee55b64105ac2", "public_key": "9d084aa8b97a6b9bafa496dbc6f76f3306a116c9d917e681520a0f914369427e", "message": "5cb6f9aa59b80eca14f6a68fb40cf07b794e75171fba96262c1c6adc", "signed": "f5875423781b66216cb5e8998de5d9ffc29d1d67107054ace3374503a9c3ef811577f269de81296744bd706f1ac478caf09b54cdf871b3f802bd57f9a6cb91015cb6f9aa59b80eca14f6a68fb40cf07b794e75171fba96262c1c6adc", "signature": "f5875423781b66216cb5e8998de5d9ffc29d1d67107054ace3374503a9c3ef811577f269de81296744bd706f1ac478caf09b54cdf871b3f802bd57f9a6cb9101" }, { "secret_key": "93eaa854d791f05372ce72b94fc6503b2ff8ae6819e6a21afe825e27ada9e4fb", "public_key": "16cee8a3f2631834c88b670897ff0b08ce90cc147b4593b3f1f403727f7e7ad5", "message": "32fe27994124202153b5c70d3813fdee9c2aa6e7dc743d4d535f1840a5", "signed": "d834197c1a3080614e0a5fa0aaaa808824f21c38d692e6ffbd200f7dfb3c8f44402a7382180b98ad0afc8eec1a02acecf3cb7fde627b9f18111f260ab1db9a0732fe27994124202153b5c70d3813fdee9c2aa6e7dc743d4d535f1840a5", "signature": "d834197c1a3080614e0a5fa0aaaa808824f21c38d692e6ffbd200f7dfb3c8f44402a7382180b98ad0afc8eec1a02acecf3cb7fde627b9f18111f260ab1db9a07" }, { "secret_key": "941cac69fb7b1815c57bb987c4d6c2ad2c35d5f9a3182a79d4ba13eab253a8ad", "public_key": "23be323c562dfd71ce65f5bba56a74a3a6dfc36b573d2f94f635c7f9b4fd5a5b", "message": "bb3172795710fe00054d3b5dfef8a11623582da68bf8e46d72d27cece2aa", "signed": "0f8fad1e6bde771b4f5420eac75c378bae6db5ac6650cd2bc210c1823b432b48e016b10595458ffab92f7a8989b293ceb8dfed6c243a2038fc06652aaaf16f02bb3172795710fe00054d3b5dfef8a11623582da68bf8e46d72d27cece2aa", "signature": "0f8fad1e6bde771b4f5420eac75c378bae6db5ac6650cd2bc210c1823b432b48e016b10595458ffab92f7a8989b293ceb8dfed6c243a2038fc06652aaaf16f02" }, { "secret_key": "1acdbb793b0384934627470d795c3d1dd4d79cea59ef983f295b9b59179cbb28", "public_key": "3f60c7541afa76c019cf5aa82dcdb088ed9e4ed9780514aefb379dabc844f31a", "message": "7cf34f75c3dac9a804d0fcd09eba9b29c9484e8a018fa9e073042df88e3c56", "signed": "be71ef4806cb041d885effd9e6b0fbb73d65d7cdec47a89c8a994892f4e55a568c4cc78d61f901e80dbb628b86a23ccd594e712b57fa94c2d67ec266348785077cf34f75c3dac9a804d0fcd09eba9b29c9484e8a018fa9e073042df88e3c56", "signature": "be71ef4806cb041d885effd9e6b0fbb73d65d7cdec47a89c8a994892f4e55a568c4cc78d61f901e80dbb628b86a23ccd594e712b57fa94c2d67ec26634878507" }, { "secret_key": "8ed7a797b9cea8a8370d419136bcdf683b759d2e3c6947f17e13e2485aa9d420", "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", "signed": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790ba750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b" }, { "secret_key": "f2ab396fe8906e3e5633e99cabcd5b09df0859b516230b1e0450b580b65f616c", "public_key": "8ea074245159a116aa7122a25ec16b891d625a68f33660423908f6bdc44f8c1b", "message": "5a44e34b746c5fd1898d552ab354d28fb4713856d7697dd63eb9bd6b99c280e187", "signed": "a06a23d982d81ab883aae230adbc368a6a9977f003cebb00d4c2e4018490191a84d3a282fdbfb2fc88046e62de43e15fb575336b3c8b77d19ce6a009ce51f50c5a44e34b746c5fd1898d552ab354d28fb4713856d7697dd63eb9bd6b99c280e187", "signature": "a06a23d982d81ab883aae230adbc368a6a9977f003cebb00d4c2e4018490191a84d3a282fdbfb2fc88046e62de43e15fb575336b3c8b77d19ce6a009ce51f50c" }, { "secret_key": "550a41c013f79bab8f06e43ad1836d51312736a9713806fafe6645219eaa1f9d", "public_key": "af6b7145474dc9954b9af93a9cdb34449d5b7c651c824d24e230b90033ce59c0", "message": "8bc4185e50e57d5f87f47515fe2b1837d585f0aae9e1ca383b3ec908884bb900ff27", "signed": "16dc1e2b9fa909eefdc277ba16ebe207b8da5e91143cde78c5047a89f681c33c4e4e3428d5c928095903a811ec002d52a39ed7f8b3fe1927200c6dd0b9ab3e048bc4185e50e57d5f87f47515fe2b1837d585f0aae9e1ca383b3ec908884bb900ff27", "signature": "16dc1e2b9fa909eefdc277ba16ebe207b8da5e91143cde78c5047a89f681c33c4e4e3428d5c928095903a811ec002d52a39ed7f8b3fe1927200c6dd0b9ab3e04" }, { "secret_key": "19ac3e272438c72ddf7b881964867cb3b31ff4c793bb7ea154613c1db068cb7e", "public_key": "f85b80e050a1b9620db138bfc9e100327e25c257c59217b601f1f6ac9a413d3f", "message": "95872d5f789f95484e30cbb0e114028953b16f5c6a8d9f65c003a83543beaa46b38645", "signed": "ea855d781cbea4682e350173cb89e8619ccfddb97cdce16f9a2f6f6892f46dbe68e04b12b8d88689a7a31670cdff409af98a93b49a34537b6aa009d2eb8b470195872d5f789f95484e30cbb0e114028953b16f5c6a8d9f65c003a83543beaa46b38645", "signature": "ea855d781cbea4682e350173cb89e8619ccfddb97cdce16f9a2f6f6892f46dbe68e04b12b8d88689a7a31670cdff409af98a93b49a34537b6aa009d2eb8b4701" }, { "secret_key": "ca267de96c93c238fafb1279812059ab93ac03059657fd994f8fa5a09239c821", "public_key": "017370c879090a81c7f272c2fc80e3aac2bc603fcb379afc98691160ab745b26", "message": "e05f71e4e49a72ec550c44a3b85aca8f20ff26c3ee94a80f1b431c7d154ec9603ee02531", "signed": "ac957f82335aa7141e96b59d63e3ccee95c3a2c47d026540c2af42dc9533d5fd81827d1679ad187aeaf37834915e75b147a9286806c8017516ba43dd051a5e0ce05f71e4e49a72ec550c44a3b85aca8f20ff26c3ee94a80f1b431c7d154ec9603ee02531", "signature": "ac957f82335aa7141e96b59d63e3ccee95c3a2c47d026540c2af42dc9533d5fd81827d1679ad187aeaf37834915e75b147a9286806c8017516ba43dd051a5e0c" }, { "secret_key": "3dff5e899475e7e91dd261322fab09980c52970de1da6e2e201660cc4fce7032", "public_key": "f30162bac98447c4042fac05da448034629be2c6a58d30dfd578ba9fb5e3930b", "message": "938f0e77621bf3ea52c7c4911c5157c2d8a2a858093ef16aa9b107e69d98037ba139a3c382", "signed": "5efe7a92ff9623089b3e3b78f352115366e26ba3fb1a416209bc029e9cadccd9f4affa333555a8f3a35a9d0f7c34b292cae77ec96fa3adfcaadee2d9ced8f805938f0e77621bf3ea52c7c4911c5157c2d8a2a858093ef16aa9b107e69d98037ba139a3c382", "signature": "5efe7a92ff9623089b3e3b78f352115366e26ba3fb1a416209bc029e9cadccd9f4affa333555a8f3a35a9d0f7c34b292cae77ec96fa3adfcaadee2d9ced8f805" }, { "secret_key": "9a6b847864e70cfe8ba6ab22fa0ca308c0cc8bec7141fbcaa3b81f5d1e1cfcfc", "public_key": "34ad0fbdb2566507a81c2b1f8aa8f53dccaa64cc87ada91b903e900d07eee930", "message": "838367471183c71f7e717724f89d401c3ad9863fd9cc7aa3cf33d3c529860cb581f3093d87da", "signed": "2ab255169c489c54c732232e37c87349d486b1eba20509dbabe7fed329ef08fd75ba1cd145e67b2ea26cb5cc51cab343eeb085fe1fd7b0ec4c6afcd9b979f905838367471183c71f7e717724f89d401c3ad9863fd9cc7aa3cf33d3c529860cb581f3093d87da", "signature": "2ab255169c489c54c732232e37c87349d486b1eba20509dbabe7fed329ef08fd75ba1cd145e67b2ea26cb5cc51cab343eeb085fe1fd7b0ec4c6afcd9b979f905" }, { "secret_key": "575be07afca5d063c238cd9b8028772cc49cda34471432a2e166e096e2219efc", "public_key": "94e5eb4d5024f49d7ebf79817c8de11497dc2b55622a51ae123ffc749dbb16e0", "message": "33e5918b66d33d55fe717ca34383eae78f0af82889caf6696e1ac9d95d1ffb32cba755f9e3503e", "signed": "58271d44236f3b98c58fd7ae0d2f49ef2b6e3affdb225aa3ba555f0e11cc53c23ad19baf24346590d05d7d5390582082cf94d39cad6530ab93d13efb3927950633e5918b66d33d55fe717ca34383eae78f0af82889caf6696e1ac9d95d1ffb32cba755f9e3503e", "signature": "58271d44236f3b98c58fd7ae0d2f49ef2b6e3affdb225aa3ba555f0e11cc53c23ad19baf24346590d05d7d5390582082cf94d39cad6530ab93d13efb39279506" }, { "secret_key": "15ffb45514d43444d61fcb105e30e135fd268523dda20b82758b179423110441", "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", "signed": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08" }, { "secret_key": "fe0568642943b2e1afbfd1f10fe8df87a4236bea40dce742072cb21886eec1fa", "public_key": "299ebd1f13177dbdb66a912bbf712038fdf73b06c3ac020c7b19126755d47f61", "message": "c59d0862ec1c9746abcc3cf83c9eeba2c7082a036a8cb57ce487e763492796d47e6e063a0c1feccc2d", "signed": "d59e6dfcc6d7e3e2c58dec81e985d245e681acf6594a23c59214f7bed8015d813c7682b60b3583440311e72a8665ba2c96dec23ce826e160127e18132b030404c59d0862ec1c9746abcc3cf83c9eeba2c7082a036a8cb57ce487e763492796d47e6e063a0c1feccc2d", "signature": "d59e6dfcc6d7e3e2c58dec81e985d245e681acf6594a23c59214f7bed8015d813c7682b60b3583440311e72a8665ba2c96dec23ce826e160127e18132b030404" }, { "secret_key": "5ecb16c2df27c8cf58e436a9d3affbd58e9538a92659a0f97c4c4f994635a8ca", "public_key": "da768b20c437dd3aa5f84bb6a077ffa34ab68501c5352b5cc3fdce7fe6c2398d", "message": "56f1329d9a6be25a6159c72f12688dc8314e85dd9e7e4dc05bbecb7729e023c86f8e0937353f27c7ede9", "signed": "1c723a20c6772426a670e4d5c4a97c6ebe9147f71bb0a415631e44406e290322e4ca977d348fe7856a8edc235d0fe95f7ed91aefddf28a77e2c7dbfd8f552f0a56f1329d9a6be25a6159c72f12688dc8314e85dd9e7e4dc05bbecb7729e023c86f8e0937353f27c7ede9", "signature": "1c723a20c6772426a670e4d5c4a97c6ebe9147f71bb0a415631e44406e290322e4ca977d348fe7856a8edc235d0fe95f7ed91aefddf28a77e2c7dbfd8f552f0a" }, { "secret_key": "d599d637b3c30a82a9984e2f758497d144de6f06b9fba04dd40fd949039d7c84", "public_key": "6791d8ce50a44689fc178727c5c3a1c959fbeed74ef7d8e7bd3c1ab4da31c51f", "message": "a7c04e8ba75d0a03d8b166ad7a1d77e1b91c7aaf7befdd99311fc3c54a684ddd971d5b3211c3eeaff1e54e", "signed": "ebf10d9ac7c96108140e7def6fe9533d727646ff5b3af273c1df95762a66f32b65a09634d013f54b5dd6011f91bc336ca8b355ce33f8cfbec2535a4c427f8205a7c04e8ba75d0a03d8b166ad7a1d77e1b91c7aaf7befdd99311fc3c54a684ddd971d5b3211c3eeaff1e54e", "signature": "ebf10d9ac7c96108140e7def6fe9533d727646ff5b3af273c1df95762a66f32b65a09634d013f54b5dd6011f91bc336ca8b355ce33f8cfbec2535a4c427f8205" }, { "secret_key": "30ab8232fa7018f0ce6c39bd8f782fe2e159758bb0f2f4386c7f28cfd2c85898", "public_key": "ecfb6a2bd42f31b61250ba5de7e46b4719afdfbc660db71a7bd1df7b0a3abe37", "message": "63b80b7956acbecf0c35e9ab06b914b0c7014fe1a4bbc0217240c1a33095d707953ed77b15d211adaf9b97dc", "signed": "9af885344cc7239498f712df80bc01b80638291ed4a1d28baa5545017a72e2f65649ccf9603da6eb5bfab9f5543a6ca4a7af3866153c76bf66bf95def615b00c63b80b7956acbecf0c35e9ab06b914b0c7014fe1a4bbc0217240c1a33095d707953ed77b15d211adaf9b97dc", "signature": "9af885344cc7239498f712df80bc01b80638291ed4a1d28baa5545017a72e2f65649ccf9603da6eb5bfab9f5543a6ca4a7af3866153c76bf66bf95def615b00c" }, { "secret_key": "0ddcdc872c7b748d40efe96c2881ae189d87f56148ed8af3ebbbc80324e38bdd", "public_key": "588ddadcbcedf40df0e9697d8bb277c7bb1498fa1d26ce0a835a760b92ca7c85", "message": "65641cd402add8bf3d1d67dbeb6d41debfbef67e4317c35b0a6d5bbbae0e034de7d670ba1413d056f2d6f1de12", "signed": "c179c09456e235fe24105afa6e8ec04637f8f943817cd098ba95387f9653b2add181a31447d92d1a1ddf1ceb0db62118de9dffb7dcd2424057cbdff5d41d040365641cd402add8bf3d1d67dbeb6d41debfbef67e4317c35b0a6d5bbbae0e034de7d670ba1413d056f2d6f1de12", "signature": "c179c09456e235fe24105afa6e8ec04637f8f943817cd098ba95387f9653b2add181a31447d92d1a1ddf1ceb0db62118de9dffb7dcd2424057cbdff5d41d0403" }, { "secret_key": "89f0d68299ba0a5a83f248ae0c169f8e3849a9b47bd4549884305c9912b46603", "public_key": "aba3e795aab2012acceadd7b3bd9daeeed6ff5258bdcd7c93699c2a3836e3832", "message": "4f1846dd7ad50e545d4cfbffbb1dc2ff145dc123754d08af4e44ecc0bc8c91411388bc7653e2d893d1eac2107d05", "signed": "2c691fa8d487ce20d5d2fa41559116e0bbf4397cf5240e152556183541d66cf753582401a4388d390339dbef4d384743caa346f55f8daba68ba7b9131a8a6e0b4f1846dd7ad50e545d4cfbffbb1dc2ff145dc123754d08af4e44ecc0bc8c91411388bc7653e2d893d1eac2107d05", "signature": "2c691fa8d487ce20d5d2fa41559116e0bbf4397cf5240e152556183541d66cf753582401a4388d390339dbef4d384743caa346f55f8daba68ba7b9131a8a6e0b" }, { "secret_key": "0a3c1844e2db070fb24e3c95cb1cc6714ef84e2ccd2b9dd2f1460ebf7ecf13b1", "public_key": "72e409937e0610eb5c20b326dc6ea1bbbc0406701c5cd67d1fbde09192b07c01", "message": "4c8274d0ed1f74e2c86c08d955bde55b2d54327e82062a1f71f70d536fdc8722cdead7d22aaead2bfaa1ad00b82957", "signed": "87f7fdf46095201e877a588fe3e5aaf476bd63138d8a878b89d6ac60631b3458b9d41a3c61a588e1db8d29a5968981b018776c588780922f5aa732ba6379dd054c8274d0ed1f74e2c86c08d955bde55b2d54327e82062a1f71f70d536fdc8722cdead7d22aaead2bfaa1ad00b82957", "signature": "87f7fdf46095201e877a588fe3e5aaf476bd63138d8a878b89d6ac60631b3458b9d41a3c61a588e1db8d29a5968981b018776c588780922f5aa732ba6379dd05" }, { "secret_key": "c8d7a8818b98dfdb20839c871cb5c48e9e9470ca3ad35ba2613a5d3199c8ab23", "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", "signed": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b" }, { "secret_key": "b482703612d0c586f76cfcb21cfd2103c957251504a8c0ac4c86c9c6f3e429ff", "public_key": "fd711dc7dd3b1dfb9df9704be3e6b26f587fe7dd7ba456a91ba43fe51aec09ad", "message": "29d77acfd99c7a0070a88feb6247a2bce9984fe3e6fbf19d4045042a21ab26cbd771e184a9a75f316b648c6920db92b87b", "signed": "58832bdeb26feafc31b46277cf3fb5d7a17dfb7ccd9b1f58ecbe6feb979666828f239ba4d75219260ecac0acf40f0e5e2590f4caa16bbbcd8a155d347967a60729d77acfd99c7a0070a88feb6247a2bce9984fe3e6fbf19d4045042a21ab26cbd771e184a9a75f316b648c6920db92b87b", "signature": "58832bdeb26feafc31b46277cf3fb5d7a17dfb7ccd9b1f58ecbe6feb979666828f239ba4d75219260ecac0acf40f0e5e2590f4caa16bbbcd8a155d347967a607" }, { "secret_key": "84e50dd9a0f197e3893c38dbd91fafc344c1776d3a400e2f0f0ee7aa829eb8a2", "public_key": "2c50f870ee48b36b0ac2f8a5f336fb090b113050dbcc25e078200a6e16153eea", "message": "f3992cde6493e671f1e129ddca8038b0abdb77bb9035f9f8be54bd5d68c1aeff724ff47d29344391dc536166b8671cbbf123", "signed": "69e6a4491a63837316e86a5f4ba7cd0d731ecc58f1d0a264c67c89befdd8d3829d8de13b33cc0bf513931715c7809657e2bfb960e5c764c971d733746093e500f3992cde6493e671f1e129ddca8038b0abdb77bb9035f9f8be54bd5d68c1aeff724ff47d29344391dc536166b8671cbbf123", "signature": "69e6a4491a63837316e86a5f4ba7cd0d731ecc58f1d0a264c67c89befdd8d3829d8de13b33cc0bf513931715c7809657e2bfb960e5c764c971d733746093e500" }, { "secret_key": "b322d46577a2a991a4d1698287832a39c487ef776b4bff037a05c7f1812bdeec", "public_key": "eb2bcadfd3eec2986baff32b98e7c4dbf03ff95d8ad5ff9aa9506e5472ff845f", "message": "19f1bf5dcf1750c611f1c4a2865200504d82298edd72671f62a7b1471ac3d4a30f7de9e5da4108c52a4ce70a3e114a52a3b3c5", "signed": "c7b55137317ca21e33489ff6a9bfab97c855dc6f85684a70a9125a261b56d5e6f149c5774d734f2d8debfc77b721896a8267c23768e9badb910eef83ec25880219f1bf5dcf1750c611f1c4a2865200504d82298edd72671f62a7b1471ac3d4a30f7de9e5da4108c52a4ce70a3e114a52a3b3c5", "signature": "c7b55137317ca21e33489ff6a9bfab97c855dc6f85684a70a9125a261b56d5e6f149c5774d734f2d8debfc77b721896a8267c23768e9badb910eef83ec258802" }, { "secret_key": "960cab5034b9838d098d2dcbf4364bec16d388f6376d73a6273b70f82bbc98c0", "public_key": "5e3c19f2415acf729f829a4ebd5c40e1a6bc9fbca95703a9376087ed0937e51a", "message": "f8b21962447b0a8f2e4279de411bea128e0be44b6915e6cda88341a68a0d818357db938eac73e0af6d31206b3948f8c48a447308", "signed": "27d4c3a1811ef9d4360b3bdd133c2ccc30d02c2f248215776cb07ee4177f9b13fc42dd70a6c2fed8f225c7663c7f182e7ee8eccff20dc7b0e1d5834ec5b1ea01f8b21962447b0a8f2e4279de411bea128e0be44b6915e6cda88341a68a0d818357db938eac73e0af6d31206b3948f8c48a447308", "signature": "27d4c3a1811ef9d4360b3bdd133c2ccc30d02c2f248215776cb07ee4177f9b13fc42dd70a6c2fed8f225c7663c7f182e7ee8eccff20dc7b0e1d5834ec5b1ea01" }, { "secret_key": "eb77b2638f23eebc82efe45ee9e5a0326637401e663ed029699b21e6443fb48e", "public_key": "9ef27608961ac711de71a6e2d4d4663ea3ecd42fb7e4e8627c39622df4af0bbc", "message": "99e3d00934003ebafc3e9fdb687b0f5ff9d5782a4b1f56b9700046c077915602c3134e22fc90ed7e690fddd4433e2034dcb2dc99ab", "signed": "18dc56d7bd9acd4f4daa78540b4ac8ff7aa9815f45a0bba370731a14eaabe96df8b5f37dbf8eae4cb15a64b244651e59d6a3d6761d9e3c50f2d0cbb09c05ec0699e3d00934003ebafc3e9fdb687b0f5ff9d5782a4b1f56b9700046c077915602c3134e22fc90ed7e690fddd4433e2034dcb2dc99ab", "signature": "18dc56d7bd9acd4f4daa78540b4ac8ff7aa9815f45a0bba370731a14eaabe96df8b5f37dbf8eae4cb15a64b244651e59d6a3d6761d9e3c50f2d0cbb09c05ec06" }, { "secret_key": "b625aa89d3f7308715427b6c39bbac58effd3a0fb7316f7a22b99ee5922f2dc9", "public_key": "65a99c3e16fea894ec33c6b20d9105e2a04e2764a4769d9bbd4d8bacfeab4a2e", "message": "e07241dbd3adbe610bbe4d005dd46732a4c25086ecb8ec29cd7bca116e1bf9f53bfbf3e11fa49018d39ff1154a06668ef7df5c678e6a", "signed": "01bb901d83b8b682d3614af46a807ba2691358feb775325d3423f549ff0aa5757e4e1a74e9c70f9721d8f354b319d4f4a1d91445c870fd0ffb94fed64664730de07241dbd3adbe610bbe4d005dd46732a4c25086ecb8ec29cd7bca116e1bf9f53bfbf3e11fa49018d39ff1154a06668ef7df5c678e6a", "signature": "01bb901d83b8b682d3614af46a807ba2691358feb775325d3423f549ff0aa5757e4e1a74e9c70f9721d8f354b319d4f4a1d91445c870fd0ffb94fed64664730d" }, { "secret_key": "b1c9f8bd03fe82e78f5c0fb06450f27dacdf716434db268275df3e1dc177af42", "public_key": "7fc88b1f7b3f11c629be671c21621f5c10672fafc8492da885742059ee6774cf", "message": "331da7a9c1f87b2ac91ee3b86d06c29163c05ed6f8d8a9725b471b7db0d6acec7f0f702487163f5eda020ca5b493f399e1c8d308c3c0c2", "signed": "4b229951ef262f16978f7914bc672e7226c5f8379d2778c5a2dc0a2650869f7acfbd0bcd30fdb0619bb44fc1ae5939b87cc318133009c20395b6c7eb98107701331da7a9c1f87b2ac91ee3b86d06c29163c05ed6f8d8a9725b471b7db0d6acec7f0f702487163f5eda020ca5b493f399e1c8d308c3c0c2", "signature": "4b229951ef262f16978f7914bc672e7226c5f8379d2778c5a2dc0a2650869f7acfbd0bcd30fdb0619bb44fc1ae5939b87cc318133009c20395b6c7eb98107701" }, { "secret_key": "6d8cdb2e075f3a2f86137214cb236ceb89a6728bb4a200806bf3557fb78fac69", "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", "signed": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b" }, { "secret_key": "47adc6d6bf571ee9570ca0f75b604ac43e303e4ab339ca9b53cacc5be45b2ccb", "public_key": "a3f527a1c1f17dfeed92277347c9f98ab475de1755b0ab546b8a15d01b9bd0be", "message": "ce497c5ff5a77990b7d8f8699eb1f5d8c0582f70cb7ac5c54d9d924913278bc654d37ea227590e15202217fc98dac4c0f3be2183d133315739", "signed": "4e8c318343c306adbba60c92b75cb0569b9219d8a86e5d57752ed235fc109a43c2cf4e942cacf297279fbb28675347e08027722a4eb7395e00a17495d32edf0bce497c5ff5a77990b7d8f8699eb1f5d8c0582f70cb7ac5c54d9d924913278bc654d37ea227590e15202217fc98dac4c0f3be2183d133315739", "signature": "4e8c318343c306adbba60c92b75cb0569b9219d8a86e5d57752ed235fc109a43c2cf4e942cacf297279fbb28675347e08027722a4eb7395e00a17495d32edf0b" }, { "secret_key": "3c19b50b0fe47961719c381d0d8da9b9869d312f13e3298b97fb22f0af29cbbe", "public_key": "0f7eda091499625e2bae8536ea35cda5483bd16a9c7e416b341d6f2c83343612", "message": "8ddcd63043f55ec3bfc83dceae69d8f8b32f4cdb6e2aebd94b4314f8fe7287dcb62732c9052e7557fe63534338efb5b6254c5d41d2690cf5144f", "signed": "efbd41f26a5d62685516f882b6ec74e0d5a71830d203c231248f26e99a9c6578ec900d68cdb8fa7216ad0d24f9ecbc9ffa655351666582f626645395a31fa7048ddcd63043f55ec3bfc83dceae69d8f8b32f4cdb6e2aebd94b4314f8fe7287dcb62732c9052e7557fe63534338efb5b6254c5d41d2690cf5144f", "signature": "efbd41f26a5d62685516f882b6ec74e0d5a71830d203c231248f26e99a9c6578ec900d68cdb8fa7216ad0d24f9ecbc9ffa655351666582f626645395a31fa704" }, { "secret_key": "34e1e9d539107eb86b393a5ccea1496d35bc7d5e9a8c5159d957e4e5852b3eb0", "public_key": "0ecb2601d5f7047428e9f909883a12420085f04ee2a88b6d95d3d7f2c932bd76", "message": "a6d4d0542cfe0d240a90507debacabce7cbbd48732353f4fad82c7bb7dbd9df8e7d9a16980a45186d8786c5ef65445bcc5b2ad5f660ffc7c8eaac0", "signed": "32d22904d3e7012d6f5a441b0b4228064a5cf95b723a66b048a087ecd55920c31c204c3f2006891a85dd1932e3f1d614cfd633b5e63291c6d8166f3011431e09a6d4d0542cfe0d240a90507debacabce7cbbd48732353f4fad82c7bb7dbd9df8e7d9a16980a45186d8786c5ef65445bcc5b2ad5f660ffc7c8eaac0", "signature": "32d22904d3e7012d6f5a441b0b4228064a5cf95b723a66b048a087ecd55920c31c204c3f2006891a85dd1932e3f1d614cfd633b5e63291c6d8166f3011431e09" }, { "secret_key": "49dd473ede6aa3c866824a40ada4996c239a20d84c9365e4f0a4554f8031b9cf", "public_key": "788de540544d3feb0c919240b390729be487e94b64ad973eb65b4669ecf23501", "message": "3a53594f3fba03029318f512b084a071ebd60baec7f55b028dc73bfc9c74e0ca496bf819dd92ab61cd8b74be3c0d6dcd128efc5ed3342cba124f726c", "signed": "d2fde02791e720852507faa7c3789040d9ef86646321f313ac557f4002491542dd67d05c6990cdb0d495501fbc5d5188bfbb84dc1bf6098bee0603a47fc2690f3a53594f3fba03029318f512b084a071ebd60baec7f55b028dc73bfc9c74e0ca496bf819dd92ab61cd8b74be3c0d6dcd128efc5ed3342cba124f726c", "signature": "d2fde02791e720852507faa7c3789040d9ef86646321f313ac557f4002491542dd67d05c6990cdb0d495501fbc5d5188bfbb84dc1bf6098bee0603a47fc2690f" }, { "secret_key": "331c64da482b6b551373c36481a02d8136ecadbb01ab114b4470bf41607ac571", "public_key": "52a00d96a3148b4726692d9eff89160ea9f99a5cc4389f361fed0bb16a42d521", "message": "20e1d05a0d5b32cc8150b8116cef39659dd5fb443ab15600f78e5b49c45326d9323f2850a63c3808859495ae273f58a51e9de9a145d774b40ba9d753d3", "signed": "22c99aa946ead39ac7997562810c01c20b46bd610645bd2d56dcdcbaacc5452c74fbf4b8b1813b0e94c30d808ce5498e61d4f7ccbb4cc5f04dfc6140825a960020e1d05a0d5b32cc8150b8116cef39659dd5fb443ab15600f78e5b49c45326d9323f2850a63c3808859495ae273f58a51e9de9a145d774b40ba9d753d3", "signature": "22c99aa946ead39ac7997562810c01c20b46bd610645bd2d56dcdcbaacc5452c74fbf4b8b1813b0e94c30d808ce5498e61d4f7ccbb4cc5f04dfc6140825a9600" }, { "secret_key": "5c0b96f2af8712122cf743c8f8dc77b6cd5570a7de13297bb3dde1886213cce2", "public_key": "0510eaf57d7301b0e1d527039bf4c6e292300a3a61b4765434f3203c100351b1", "message": "54e0caa8e63919ca614b2bfd308ccfe50c9ea888e1ee4446d682cb5034627f97b05392c04e835556c31c52816a48e4fb196693206b8afb4408662b3cb575", "signed": "06e5d8436ac7705b3a90f1631cdd38ec1a3fa49778a9b9f2fa5ebea4e7d560ada7dd26ff42fafa8ba420323742761aca6904940dc21bbef63ff72daab45d430b54e0caa8e63919ca614b2bfd308ccfe50c9ea888e1ee4446d682cb5034627f97b05392c04e835556c31c52816a48e4fb196693206b8afb4408662b3cb575", "signature": "06e5d8436ac7705b3a90f1631cdd38ec1a3fa49778a9b9f2fa5ebea4e7d560ada7dd26ff42fafa8ba420323742761aca6904940dc21bbef63ff72daab45d430b" }, { "secret_key": "de84f2435f78dedb87da18194ff6a336f08111150def901c1ac418146eb7b54a", "public_key": "d3a92bbaa4d63af79c2226a7236e6427428df8b362427f873023b22d2f5e03f2", "message": "205135ec7f417c858072d5233fb36482d4906abd60a74a498c347ff248dfa2722ca74e879de33169fadc7cd44d6c94a17d16e1e630824ba3e0df22ed68eaab", "signed": "471ebc973cfdaceec07279307368b73be35bc6f8d8312b70150567369096706dc471126c3576f9f0eb550df5ac6a525181110029dd1fc11174d1aaced48d630f205135ec7f417c858072d5233fb36482d4906abd60a74a498c347ff248dfa2722ca74e879de33169fadc7cd44d6c94a17d16e1e630824ba3e0df22ed68eaab", "signature": "471ebc973cfdaceec07279307368b73be35bc6f8d8312b70150567369096706dc471126c3576f9f0eb550df5ac6a525181110029dd1fc11174d1aaced48d630f" }, { "secret_key": "ba4d6e67b2ce67a1e44326494044f37a442f3b81725bc1f9341462718b55ee20", "public_key": "f73fa076f84b6db675a5fda5ad67e351a41e8e7f29add16809ca010387e9c6cc", "message": "4bafdac9099d4057ed6dd08bcaee8756e9a40f2cb9598020eb95019528409bbea38b384a59f119f57297bfb2fa142fc7bb1d90dbddde772bcde48c5670d5fa13", "signed": "57b9d2a711207f837421bae7dd48eaa18eab1a9a70a0f1305806fee17b458f3a0964b302d1834d3e0ac9e8496f000b77f0083b41f8a957e632fbc7840eee6a064bafdac9099d4057ed6dd08bcaee8756e9a40f2cb9598020eb95019528409bbea38b384a59f119f57297bfb2fa142fc7bb1d90dbddde772bcde48c5670d5fa13", "signature": "57b9d2a711207f837421bae7dd48eaa18eab1a9a70a0f1305806fee17b458f3a0964b302d1834d3e0ac9e8496f000b77f0083b41f8a957e632fbc7840eee6a06" }, { "secret_key": "0d131c45aea6f3a4e1b9a2cf60c55104587efaa846b222bf0a7b74ce7a3f63b6", "public_key": "3c6729dbe93b499c4e614a2f21beb729438d498e1ac8d14cbad9717a5dbd97cd", "message": "b4291d08b88fb2f7b8f99d0dce40079fcbab718bbd8f4e8eabc3c1428b6a071fb2a3c8eba1cacccfa871b365c708bef2685bc13e6b80bc14a5f249170ffc56d014", "signed": "a9c5ee86fb06d9e46b379c32dda7c92c9c13db274dc24116fbdd878696045488cc75a52fff67d1a5113d06e333ac67ff664b3f2a405fa1d14dd5bbb97409b606b4291d08b88fb2f7b8f99d0dce40079fcbab718bbd8f4e8eabc3c1428b6a071fb2a3c8eba1cacccfa871b365c708bef2685bc13e6b80bc14a5f249170ffc56d014", "signature": "a9c5ee86fb06d9e46b379c32dda7c92c9c13db274dc24116fbdd878696045488cc75a52fff67d1a5113d06e333ac67ff664b3f2a405fa1d14dd5bbb97409b606" }, { "secret_key": "a75e3b6b4170e444781be4eeac3e0fdaa4b4356f705486bcb071a325ae071fba", "public_key": "993d38a7d72f0aee15ff6f4fdc37ca7724fd1373a3766b275dbc77e647980e0a", "message": "4037866f6548b01cc6bcf3a940e3945aa2d188b4b7f182aa77ec4d6b0428ab5b84d85df192a5a38ada089d76fa26bf67736a7041a5eb8f0c5719eb396693c45160f8", "signed": "a5db4d3d3329abe3697959e6b5947ea8601b03ef8e1d6fe202144931272ca0a09b5eb0f390572ea7ef03c6131e9de5f16bf0b034244f7e104ff5311bbf663a0d4037866f6548b01cc6bcf3a940e3945aa2d188b4b7f182aa77ec4d6b0428ab5b84d85df192a5a38ada089d76fa26bf67736a7041a5eb8f0c5719eb396693c45160f8", "signature": "a5db4d3d3329abe3697959e6b5947ea8601b03ef8e1d6fe202144931272ca0a09b5eb0f390572ea7ef03c6131e9de5f16bf0b034244f7e104ff5311bbf663a0d" }, { "secret_key": "bcbcf561ecc05a41c7d7e55e696d32ce39b4d03c1f5f3f3a8927fe5e62e844b2", "public_key": "4ddf53fad6a7a9ed30f3afecca136fd7843b72c243090891ae4021a32cadff1a", "message": "6f6716b6784740980aebc3248807e31c1286ac7b681c00b66c88ff7a336d441fa5c3eb256d20cf6d1ac92ccfe4be6dcc41b1aff846d360c243001cabdfbf1a9b240455", "signed": "9ff15115f6661f3211d7a40764967629ba6a5263951bdc3c6a4c90d070f7be00024b80d83b6bc27587fcff5f5ccc0eb3cde1497cf56895147a063f61f08adf0b6f6716b6784740980aebc3248807e31c1286ac7b681c00b66c88ff7a336d441fa5c3eb256d20cf6d1ac92ccfe4be6dcc41b1aff846d360c243001cabdfbf1a9b240455", "signature": "9ff15115f6661f3211d7a40764967629ba6a5263951bdc3c6a4c90d070f7be00024b80d83b6bc27587fcff5f5ccc0eb3cde1497cf56895147a063f61f08adf0b" }, { "secret_key": "210532805fa9cc9be916d213cac374e3cd6fc2602a544d0c1ce29d30105d69ab", "public_key": "10699e499be99e2b11b98f6f86b67cdc4ccf69f3c53ce094875647d2d0d0ecc5", "message": "9fc4d28cfd25e6c0c5e724e19ca39d71e53bf4aa2796c54c3351f108fc70f2611a62e0ab90af6ade5216788e9eb2a873059b1e79d7d59debd68f2d4d80ffe31bf74b928c", "signed": "4c2d31d5bbc42e026dc1e079ecc4dd072c5d2cce65e3db8d8a1dd9057faa0371727f727231a0f060fa27097533b6db3b8f6252f2793d75662caadf5f0fcc710e9fc4d28cfd25e6c0c5e724e19ca39d71e53bf4aa2796c54c3351f108fc70f2611a62e0ab90af6ade5216788e9eb2a873059b1e79d7d59debd68f2d4d80ffe31bf74b928c", "signature": "4c2d31d5bbc42e026dc1e079ecc4dd072c5d2cce65e3db8d8a1dd9057faa0371727f727231a0f060fa27097533b6db3b8f6252f2793d75662caadf5f0fcc710e" }, { "secret_key": "185d64b69479e0ba0a5844a10ad84125ba11c4b40d63eda2c57afc7e019c8e0c", "public_key": "a5764f6398a5ae2266a38f9714533c4bbd8d07826f63e204cbac374b0acef1bd", "message": "4a0824fe70d4315413d0a0cafbf4f5fe117d5e07e1c3a4effb9d0ae91490234878ccf6792a91f68c6a520de16071f08abe35dc5ea428f1957b663371ce24c609dd55b8f493", "signed": "43e0387da5ba09a190f6e7b2680578d889769bcc445e5ef571b492871c155c5b9f620bfacfbf2df1fd87444604b71b2e237baaa7ee2093ede4a601edf883e3074a0824fe70d4315413d0a0cafbf4f5fe117d5e07e1c3a4effb9d0ae91490234878ccf6792a91f68c6a520de16071f08abe35dc5ea428f1957b663371ce24c609dd55b8f493", "signature": "43e0387da5ba09a190f6e7b2680578d889769bcc445e5ef571b492871c155c5b9f620bfacfbf2df1fd87444604b71b2e237baaa7ee2093ede4a601edf883e307" }, { "secret_key": "cfa9d9164b3c4f6f722635d2066cd7ea5e5533d2c74f8add669c371faa476426", "public_key": "41169a66f9a63f285782a6c2db81cc3f70b3ada21a68c84745c88a74c3b0a2de", "message": "757621b1675db7cacef7f2782587ff3af51a3ef2f4bcf9279c4ce94002e1f00424bf0eb621982cc85cb4d171e564a0c2f6e3567a1aae2cddb7e9b25f47dc20a51050542969ca", "signed": "01d7c9b5701af71e2f4877ffc9b7b5305f52816d4458e37e41c7719fac1d76a01fff3f50fe1a5875ccc3fb70001c947a33fc8b207de13572ccdb8ba98933ab01757621b1675db7cacef7f2782587ff3af51a3ef2f4bcf9279c4ce94002e1f00424bf0eb621982cc85cb4d171e564a0c2f6e3567a1aae2cddb7e9b25f47dc20a51050542969ca", "signature": "01d7c9b5701af71e2f4877ffc9b7b5305f52816d4458e37e41c7719fac1d76a01fff3f50fe1a5875ccc3fb70001c947a33fc8b207de13572ccdb8ba98933ab01" }, { "secret_key": "1acb4a256c2f8993ca24de1e0014606d668b5e756032d269f1d24d351c8eea4a", "public_key": "cbbdcd8cbc885ab43a057e5f9579f1161954159e7b562ea26cd9a43c88d3f96d", "message": "c46a6d61aa0aed1c1d8547a70b89b7196475d5a4870881b1ecd0f0cb9c745f8a2adc8024e2dc55b53aa5d383a81aabc1a47e8d07d00b7f0b56ceddbfb1f424bb5c02184678a666", "signed": "05aa76f7fe51892303d78914715995e7d768ff7714ce270f175e56af17ae018d3fa939f5f620de82bcd1549687b205c7871203e624238c4e309fab7f92fbaa05c46a6d61aa0aed1c1d8547a70b89b7196475d5a4870881b1ecd0f0cb9c745f8a2adc8024e2dc55b53aa5d383a81aabc1a47e8d07d00b7f0b56ceddbfb1f424bb5c02184678a666", "signature": "05aa76f7fe51892303d78914715995e7d768ff7714ce270f175e56af17ae018d3fa939f5f620de82bcd1549687b205c7871203e624238c4e309fab7f92fbaa05" }, { "secret_key": "ace3c46424823622979fc3a84a7da69c1d527d8312e8fb018375bd3a96c29c18", "public_key": "937cf34136d9e1cce0de11b12c70cbfb7455448421e92c82e7c40934bff8c676", "message": "a9f137bc9021bf105aee25be21cd9ee5b3547cf10cc5f98476fb588bd70e2d6d6b0834e842e4ee94303cf96b09c1715381b36e14a491b80f895ea421b8ec2b1d3c187e02935c5526", "signed": "feb8896dd3fe6001ffea171b37b788a69f7f850193a63406f56376dd263d099aef80ece67e2c43f40eca462c6b71e79406b18db74ae5d49844e3b132bc2a1307a9f137bc9021bf105aee25be21cd9ee5b3547cf10cc5f98476fb588bd70e2d6d6b0834e842e4ee94303cf96b09c1715381b36e14a491b80f895ea421b8ec2b1d3c187e02935c5526", "signature": "feb8896dd3fe6001ffea171b37b788a69f7f850193a63406f56376dd263d099aef80ece67e2c43f40eca462c6b71e79406b18db74ae5d49844e3b132bc2a1307" }, { "secret_key": "88f681934e33c35c07dc6e5a832942ae3d59903ccde2f76ccb7587cea7ec41b6", "public_key": "6a4e8aa5adb63d22fd7b14a26fdb03b7c8aa6ccd5a196f2c54b0465adb5092e1", "message": "6e8bac1f853b81fef94707e18cc61c6f0a9cbc2a41d078dcc83fc0229c7f8dbe6dbdd90854b1f1ae2b9f2b120b86a8786b4e78ce23ab86baaf88754af0f3d88881dae0bc5261bfd038", "signed": "45b27bf1b9eac06b62b686f6d546563b2dfe5b175dbef32bf78c35a16c958a9d4f26d291de9bb2066c0a286113cc09172d40a36d4cbd951708860226eb30cd056e8bac1f853b81fef94707e18cc61c6f0a9cbc2a41d078dcc83fc0229c7f8dbe6dbdd90854b1f1ae2b9f2b120b86a8786b4e78ce23ab86baaf88754af0f3d88881dae0bc5261bfd038", "signature": "45b27bf1b9eac06b62b686f6d546563b2dfe5b175dbef32bf78c35a16c958a9d4f26d291de9bb2066c0a286113cc09172d40a36d4cbd951708860226eb30cd05" }, { "secret_key": "48050a6e0158f6ad253412e4497cff62d5ee555edffe59e4dc401522813295ce", "public_key": "975e010abb9a3e56659137b0506057f283982f886ca172c7bc2c500ed9bd26c1", "message": "ed6eec29fb7049dff707f0a4426ebc8f5b350e95870b9d6198c8139e9c3e1e409937d1a858a0dea482a5cb1a854ed3b5a9397acb63bff6b64039ef2eb1159e99858310bbbd86125c3e0e", "signed": "7216ab60c35168187d0fce4753c86e80058d540b76bf95843a5898841060a99a44de6f439625a3f6365f59c377bf45909bbfef5c50b25f3194e5fbd34ea5e706ed6eec29fb7049dff707f0a4426ebc8f5b350e95870b9d6198c8139e9c3e1e409937d1a858a0dea482a5cb1a854ed3b5a9397acb63bff6b64039ef2eb1159e99858310bbbd86125c3e0e", "signature": "7216ab60c35168187d0fce4753c86e80058d540b76bf95843a5898841060a99a44de6f439625a3f6365f59c377bf45909bbfef5c50b25f3194e5fbd34ea5e706" }, { "secret_key": "18d13d0c00e8e3386a5cfb30a9e79fe88b1861ed2d1201eb170038e194770403", "public_key": "a4afc833401876090d9b880c41267d68cbbeeaa38afb20884e27328f3b7f535e", "message": "910f6c272dd97931ac47310d244cadb43251365e02ba9f6a5b3c3226be9d7d3a74a2ba4906e8e71a4bf3d3556ebdfc666cd6b12f20c4a00834b88fbb244575199286b0b9344cf334aff007", "signed": "033988154c5d79d2510be83e778015dfe2fb85b8111f7ec139918b5400e3d656ee80a9f5c9072b5b467a5cc5a57cc8ad1062b5bff10862d9d369dde2cc966701910f6c272dd97931ac47310d244cadb43251365e02ba9f6a5b3c3226be9d7d3a74a2ba4906e8e71a4bf3d3556ebdfc666cd6b12f20c4a00834b88fbb244575199286b0b9344cf334aff007", "signature": "033988154c5d79d2510be83e778015dfe2fb85b8111f7ec139918b5400e3d656ee80a9f5c9072b5b467a5cc5a57cc8ad1062b5bff10862d9d369dde2cc966701" }, { "secret_key": "4adc8c28646a93a817293a14d29b48e2c6d712a68993547a5c5e4d1452acbc3a", "public_key": "7f40473628f23fc0dff0021afd487740d4916a9122e6c97d36433e5ebf04f88c", "message": "09fb5501f1688f80a0ab9e22d778ae130acaf74d7f5185b4da198c6b9edac4302e2b753e578766e17d4056dc40d95cf4ca8bcc6565795e97d68bcda79fa77c493397716356164caab5d19cfd", "signed": "6d3b4e90ec408311f9b15b9253d3d95c5d152620c260d56302555a8804a5104ba5e8d29ee108e764a64219297298ab7674bbca784dee28773b34e185a386c20809fb5501f1688f80a0ab9e22d778ae130acaf74d7f5185b4da198c6b9edac4302e2b753e578766e17d4056dc40d95cf4ca8bcc6565795e97d68bcda79fa77c493397716356164caab5d19cfd", "signature": "6d3b4e90ec408311f9b15b9253d3d95c5d152620c260d56302555a8804a5104ba5e8d29ee108e764a64219297298ab7674bbca784dee28773b34e185a386c208" }, { "secret_key": "f26e1c84697a4908151b447dcf6c7c7a38b04081db9e7c7738e6fec900bed0c1", "public_key": "a86e1422c1235ff8e1aa083470d5e42288cb007ab50e795dd0b4ff87394966c4", "message": "54ed47606a1487c2f900cefb6e899dbaf6c31cc88ebe3558b83b93f6d422c31e888e48e520eeaedd7e554a9cd40c2c519d533b6144cee484c389e976b1e4022b50e7dbb87ead7e541a2004daf7", "signed": "44f3344b9566c9dfd22d6198e1cbf95d9e28f2982fc7f166ab25dda30c46f768c558e0394fb9ab3e1d4db4cf487c17641a13f3f48939e0c64827a75103c5740654ed47606a1487c2f900cefb6e899dbaf6c31cc88ebe3558b83b93f6d422c31e888e48e520eeaedd7e554a9cd40c2c519d533b6144cee484c389e976b1e4022b50e7dbb87ead7e541a2004daf7", "signature": "44f3344b9566c9dfd22d6198e1cbf95d9e28f2982fc7f166ab25dda30c46f768c558e0394fb9ab3e1d4db4cf487c17641a13f3f48939e0c64827a75103c57406" }, { "secret_key": "cc0c33f3a86f5a17d30c186ce0f3b740bafa5fe3c7090f143541e2b2c1e534bc", "public_key": "967a71c7cf9b82cc78cbe109104d8b438a8d1fd71d260d029046a9a4526866ff", "message": "1944e5e155d75e0d0be92e1be14cec370ad13791f2bfd40f271214e94fcf213c71bc20d7ce0c7584421ac4efc451883cc3f4956f21f73a4216720438bc38ff2cfdf3709905a50a9d94b1d9e7932b", "signed": "e277b3dd655c33ff75fa920af1fcc859401e6c7a6ef4c6bfbfac5069638f19ca115baf13c09c82af793facb6abd0cd58e8481b08c1b68ad7a2665c4a614a28061944e5e155d75e0d0be92e1be14cec370ad13791f2bfd40f271214e94fcf213c71bc20d7ce0c7584421ac4efc451883cc3f4956f21f73a4216720438bc38ff2cfdf3709905a50a9d94b1d9e7932b", "signature": "e277b3dd655c33ff75fa920af1fcc859401e6c7a6ef4c6bfbfac5069638f19ca115baf13c09c82af793facb6abd0cd58e8481b08c1b68ad7a2665c4a614a2806" }, { "secret_key": "f0bc979375a7073068dba7f6c094db6598b4e45df7d549583c22fded8048fa2e", "public_key": "b42b6c57a78f1d90090a7181ab2ae09f426cbc2be96eb2cf27abc70d7d32a4b3", "message": "27ab3049b5c6351f6cfe38b13a059f5037257ee3d65d6079656856edc876ea081fd8a9480466f8839478088466f51ecbfaf2d65def25f0c4dd8d08588202812232f57945df8a6fa161ed8c0343b583", "signed": "19dbc3027f9fae707deb76f588f9fd07aa8eae29bd4e1d04c2c984388286b3b122248a6c03ed67eca35df4db3dc1e4237f267892518497d9552a21de19b5140f27ab3049b5c6351f6cfe38b13a059f5037257ee3d65d6079656856edc876ea081fd8a9480466f8839478088466f51ecbfaf2d65def25f0c4dd8d08588202812232f57945df8a6fa161ed8c0343b583", "signature": "19dbc3027f9fae707deb76f588f9fd07aa8eae29bd4e1d04c2c984388286b3b122248a6c03ed67eca35df4db3dc1e4237f267892518497d9552a21de19b5140f" }, { "secret_key": "3022975f298c0ad5ddbe90954f20e63ae0c0d2704cf13c221f5b3720af4dba32", "public_key": "b845bce38e26ab027b8247463d437a71bbddca2a2381d81fad4c297df9140bd5", "message": "9aa19a595d989378cdc06891887ef5f9c246e5f83c0b658710673e4e7db760c76354c4f5d1e90db04a23b4fb434c69384593d010e312b11d299c9f97482de887cecfe82ea723bca79a1bd64d03ef19ee", "signed": "ae14a860fad0051b3eb72b3721a82f7b9546b2867261e2b7b638979e2561bdeb89b600768f82450a66c8b0481283fa21cb6c53bde350effb68a7d1114bfdb2039aa19a595d989378cdc06891887ef5f9c246e5f83c0b658710673e4e7db760c76354c4f5d1e90db04a23b4fb434c69384593d010e312b11d299c9f97482de887cecfe82ea723bca79a1bd64d03ef19ee", "signature": "ae14a860fad0051b3eb72b3721a82f7b9546b2867261e2b7b638979e2561bdeb89b600768f82450a66c8b0481283fa21cb6c53bde350effb68a7d1114bfdb203" }, { "secret_key": "0f710b6c481f71449589753312ef64932b4652ebe0e07597f7da1c4f3dcffb80", "public_key": "6973ff2932ccddfc1d16c4c0da50c8b29fe6452d1ee84d52064ebf3d628d403e", "message": "85d85744ad55e9ef9a65ca91e85c8a4f80e4c58f8e4e9354e833986098b7d9fe9fdc0dedb0d75d2539fba00034fc0c2e84344d1edaa09d4f63d5546d67803dd6b54ddcc0b1d3f2582dd75289e31de42e69", "signed": "02a8d26aee11420fb4f09d1163e14b867df7c6f6c8f8dc7a78034659f0401cad0aa90397efdd0704b798db1936503026e2a1adc297e27974d4be312a3753f80485d85744ad55e9ef9a65ca91e85c8a4f80e4c58f8e4e9354e833986098b7d9fe9fdc0dedb0d75d2539fba00034fc0c2e84344d1edaa09d4f63d5546d67803dd6b54ddcc0b1d3f2582dd75289e31de42e69", "signature": "02a8d26aee11420fb4f09d1163e14b867df7c6f6c8f8dc7a78034659f0401cad0aa90397efdd0704b798db1936503026e2a1adc297e27974d4be312a3753f804" }, { "secret_key": "7a05f121f60112dd16fee8c91bc2a11479f4b67ee33456042c8de167fc588017", "public_key": "b3b05be989cea7197505d4b54335e5e1d77a4b52ba7282604bbc1cf6c4e87a6c", "message": "d9c59e8cc4ede537be2122ab492a5b915a9b0a114b2ade356fc0457ef98722d5f567b86211e28369d14168ec4a3c804076e154adc70a668cf64a20d13cf190d115cd688d036e46938251df4964dc3517b10c", "signed": "d30ce8a322b450a2fb1afd329cec8559ccf112bd83965f9ec4736270a0914e061196bf5209778c9f8ccf39c4668bbf0e1363f81afe45dd74e80d5875ddbf6f01d9c59e8cc4ede537be2122ab492a5b915a9b0a114b2ade356fc0457ef98722d5f567b86211e28369d14168ec4a3c804076e154adc70a668cf64a20d13cf190d115cd688d036e46938251df4964dc3517b10c", "signature": "d30ce8a322b450a2fb1afd329cec8559ccf112bd83965f9ec4736270a0914e061196bf5209778c9f8ccf39c4668bbf0e1363f81afe45dd74e80d5875ddbf6f01" }, { "secret_key": "bf381f8dfb5d0c6d64e416ac23e0d0fcb86ebb899b1d146abd911b92a7808eb6", "public_key": "863fad8d1f1bc630a15f6fe8ecefe6b4497b60b21ae8830da46742045fef156f", "message": "8654f2f5c6dcd2cfcbb6ed8d2bc5fb5fec53e3effb0de65aac507fa56c897732395aa09946d3b6586a92edd6dc99315e1ba74c6a0247c4ba7760b948eb3c0932d9fe1f0e9fea6eb61a548a9ab48ffdf1547329", "signed": "99b75378738fcac8067669e8509b5d2607e1ef76af9004e13fe5d3932df60b168216f58565340fa4d638055a89044ee7d45e2bd082a53382289a34700648980e8654f2f5c6dcd2cfcbb6ed8d2bc5fb5fec53e3effb0de65aac507fa56c897732395aa09946d3b6586a92edd6dc99315e1ba74c6a0247c4ba7760b948eb3c0932d9fe1f0e9fea6eb61a548a9ab48ffdf1547329", "signature": "99b75378738fcac8067669e8509b5d2607e1ef76af9004e13fe5d3932df60b168216f58565340fa4d638055a89044ee7d45e2bd082a53382289a34700648980e" }, { "secret_key": "36983241a0a8e60ce02a61b3fafab15a7313a5a270d015b9c9ec070dc42deeda", "public_key": "6647984d42b9a5b3b1afa3b7f8f49d4c2b05e38984e99cea8fd68235d2ae4627", "message": "cebb9e404451818253c0392a4554ee7323c5d5b8b226775700b806ed5b91337916ea7ecbc3d4103fc65e5372ae7e5f9ba2d8f5aee24ccf6e631ae20c4af9b5f728cdf89e8189def1a5b3d35347aa203525ea1d2e", "signed": "ee37df8af422f91f85dfe43efe79f62378068ccdbaf3916eecbc3adfed0508bdebaf5ce06b3bc279f78087f0db8db3c6823edfb32c12217830be723d8872b30ccebb9e404451818253c0392a4554ee7323c5d5b8b226775700b806ed5b91337916ea7ecbc3d4103fc65e5372ae7e5f9ba2d8f5aee24ccf6e631ae20c4af9b5f728cdf89e8189def1a5b3d35347aa203525ea1d2e", "signature": "ee37df8af422f91f85dfe43efe79f62378068ccdbaf3916eecbc3adfed0508bdebaf5ce06b3bc279f78087f0db8db3c6823edfb32c12217830be723d8872b30c" }, { "secret_key": "d06899f93a408dacb41c969718346f1e289bb5ea65e283ff79c705a074517c35", "public_key": "46bf2a08a076c47d7f11b733f8141c355363ed85d7def26ba6a0ce15ac5f2be8", "message": "0864c39ac4fda8eb9048597bd40be0401021fd2dd3a3390a8facce984b260a13fa2c7cfc00d192fadf134a0ad5a181ee89eff0c795eaa0fbfe2f3b26115d07168db42ed21a51303b1958e4a42dc065b22ce48f17a6", "signed": "6f89de92a66bc5f4144339124950bdf588144cb372f6736245351c9476becc59a258f9a933ffff2bef4b46cd1057395225799fd09dede6823db0e325dbc8140d0864c39ac4fda8eb9048597bd40be0401021fd2dd3a3390a8facce984b260a13fa2c7cfc00d192fadf134a0ad5a181ee89eff0c795eaa0fbfe2f3b26115d07168db42ed21a51303b1958e4a42dc065b22ce48f17a6", "signature": "6f89de92a66bc5f4144339124950bdf588144cb372f6736245351c9476becc59a258f9a933ffff2bef4b46cd1057395225799fd09dede6823db0e325dbc8140d" }, { "secret_key": "eebca7966970ee9f2cc4d74c6f1d8e0ebff7c45aebad349fb9f86df628dfff0e", "public_key": "89101e0309f767e64ae9c98c4a5d8d2328fb3ef262d082f49b64ca209e1990f6", "message": "0fac790adb9f59e5cb0ddcb2b667172f2a21034d93bcaddf188606fa9e776db33a8fcc6bd7f5567883fc0de351aa9afaa36d2075b1ba853bada849b8661d5c8154e7b0afea656dd15e01a9c5ba21589b02f8fc5481c2", "signed": "7d447ee5328c9fe7f11936cc42998754a56cd1d2a6951af4fee7c4a8eb319d4923707c793c55d79067f822d5b16bb5776e38dffabc67237a916a81a63339b0030fac790adb9f59e5cb0ddcb2b667172f2a21034d93bcaddf188606fa9e776db33a8fcc6bd7f5567883fc0de351aa9afaa36d2075b1ba853bada849b8661d5c8154e7b0afea656dd15e01a9c5ba21589b02f8fc5481c2", "signature": "7d447ee5328c9fe7f11936cc42998754a56cd1d2a6951af4fee7c4a8eb319d4923707c793c55d79067f822d5b16bb5776e38dffabc67237a916a81a63339b003" }, { "secret_key": "3820b6b15939d0afe18c9cb3d9a2a08f167dd458eb6c7e3f1558b0c6db4c6890", "public_key": "80b85c6559fea8b400e1999cc5bfed507ad7fc294cd9ba0ce2dd2584a91089b0", "message": "3e5ad92d44b40e8614d8087c9c743de0c0861a07f1f5146d71cac2f3740024e841cc2d46027cf5d261d3ee7c1875b39551017b5fb1468114fc3e098a899cdbd558b39f098e156b6e9801ebcdd65fed56dbfcaf2c8c787b", "signed": "823ee2c0c8d87faa0ec0141e9ce08b51e57c839792d1fbd97a967207fd415849ebfb5dadb5a1dc2c0a8b7fc63fc354857b8c90c44720e13f45cd01e7aa23140c3e5ad92d44b40e8614d8087c9c743de0c0861a07f1f5146d71cac2f3740024e841cc2d46027cf5d261d3ee7c1875b39551017b5fb1468114fc3e098a899cdbd558b39f098e156b6e9801ebcdd65fed56dbfcaf2c8c787b", "signature": "823ee2c0c8d87faa0ec0141e9ce08b51e57c839792d1fbd97a967207fd415849ebfb5dadb5a1dc2c0a8b7fc63fc354857b8c90c44720e13f45cd01e7aa23140c" }, { "secret_key": "0d20fa4a37ff30c4dcc3e44ea7ac501137e5807e9781330ac310982cc3d39dbd", "public_key": "67bb0a01bc8617b491eff1a326c1c70f7d0c5b95a5ad48241aedce1c6f0883cf", "message": "35e0f4b4a517f9c7aa4514f03e6d65f19b27c62cc069f6bf07dd6378bd6afe2b766560006cbd5730a00919ed11191fb0c8dac56e153fc1cea4bdce5046cccb717759a4083e1c16f740763264cc804de0d0e1a4b5a23067af", "signed": "deab12ed82ba94b469ca98b66fa20444b4b7881c4f0f853409c9a1504a5b2b6d7860f26ada6bf73459b9cdb573c8017121338efa60f4148086d7a3a8ed59bb0735e0f4b4a517f9c7aa4514f03e6d65f19b27c62cc069f6bf07dd6378bd6afe2b766560006cbd5730a00919ed11191fb0c8dac56e153fc1cea4bdce5046cccb717759a4083e1c16f740763264cc804de0d0e1a4b5a23067af", "signature": "deab12ed82ba94b469ca98b66fa20444b4b7881c4f0f853409c9a1504a5b2b6d7860f26ada6bf73459b9cdb573c8017121338efa60f4148086d7a3a8ed59bb07" }, { "secret_key": "bee161881d819b370d240d509ba46b06fb828e20310d9f6b309780703e98927b", "public_key": "10854380de89162bfb9f7835a2716a3a6e0265671b250b389d01c3bcc03736b8", "message": "5a6fe599b6b09b05c0ba6a622df3a92b3d376d24d04ea85ebe767bc2ec4d14e83e6937dc0b914b4809fdb607906841a6fd1dcdf61aaea8f9bb81b2ccaa32df412989ae53646680a71a211c8440eab0f1aec5e4fc00e6a2c96d", "signed": "b07d072eb3831fae8a06effa9201797496dce126b8e11fef2fa07f664dc5cf3d4bf9c38a8b3c09fb5f14fa2deb219e7d852fdd27c7ba32d309942f2746dfe4045a6fe599b6b09b05c0ba6a622df3a92b3d376d24d04ea85ebe767bc2ec4d14e83e6937dc0b914b4809fdb607906841a6fd1dcdf61aaea8f9bb81b2ccaa32df412989ae53646680a71a211c8440eab0f1aec5e4fc00e6a2c96d", "signature": "b07d072eb3831fae8a06effa9201797496dce126b8e11fef2fa07f664dc5cf3d4bf9c38a8b3c09fb5f14fa2deb219e7d852fdd27c7ba32d309942f2746dfe404" }, { "secret_key": "70150e9516164a3d7b7e8b6f255b65cac9f07459b32d11bb94b3d277208abc99", "public_key": "2328bec8e40351047882e8b43bc1ab085386fa47987e46ea87608814c5da713c", "message": "77be8eceaab431a13c2a28d0d1556489d8c392fd7ae41157f7caf082cb54e45f08626be0076be844d38fde901a5eab0e8832d69dac22fb8507fb8ec4faf7c88fd26da308461afe385987972b5e760a34a5e18b9a82b4aaa529b7", "signed": "eda3f5033ea7953a0d583c6457522e84ad78445304d48e577d4d69e8641febe15248d8d90ce0944a8f801d39099bc77494bac4ce2a20b38369c6adfb71e03d0f77be8eceaab431a13c2a28d0d1556489d8c392fd7ae41157f7caf082cb54e45f08626be0076be844d38fde901a5eab0e8832d69dac22fb8507fb8ec4faf7c88fd26da308461afe385987972b5e760a34a5e18b9a82b4aaa529b7", "signature": "eda3f5033ea7953a0d583c6457522e84ad78445304d48e577d4d69e8641febe15248d8d90ce0944a8f801d39099bc77494bac4ce2a20b38369c6adfb71e03d0f" }, { "secret_key": "3f87fcfdb421422a9c5fb98268313c15128c78844ef9eb3b3713fa77b6718903", "public_key": "533ec59228374bd03a4699e3a8896b86182fcf8fc3085fdb8f5c4671524d6fe0", "message": "c00fed2d689468bcbacccd446e8d8f299e2a86925e62e59709afaf4857469ff1e006d00fa3e18a3615f8f06b6ebdff785dde58851d2c239038a0c344dce985bd1fc8deb4779ae5f8932e2f9ed5990b6472dbe4e6fef6917657e0b5", "signed": "f6519d7edb6134111974033f03b8d89e9c76caec8965a8e17cd45fff19de2615d73eccdb4a6664a8f0e23adf98988e96251bf26eb7a4ccaac1079f0a772f9b05c00fed2d689468bcbacccd446e8d8f299e2a86925e62e59709afaf4857469ff1e006d00fa3e18a3615f8f06b6ebdff785dde58851d2c239038a0c344dce985bd1fc8deb4779ae5f8932e2f9ed5990b6472dbe4e6fef6917657e0b5", "signature": "f6519d7edb6134111974033f03b8d89e9c76caec8965a8e17cd45fff19de2615d73eccdb4a6664a8f0e23adf98988e96251bf26eb7a4ccaac1079f0a772f9b05" }, { "secret_key": "44ceef044ff998d4abeaaf374eb41d086718b63097b1e35f89634c14897132ea", "public_key": "e83c86677d03ed3a5e8c95f41f0b325ff4333702f2ff6936f57ff30aa31485c7", "message": "8d3e2dec4644c7b51633b13e6375ca42ff9138465f43d7800c7313199f67c9cf1b520b1820bd630ecf1c992e2767b38eb5bbc441a4ab8d317db441db35a0fe3abe7a9e4541881c2d7b1a2612306959815d1da41267d9649dd4494ace", "signed": "554552d6b790d421d06b0a67f8e002ad7a1ed01c06cf00cbeaec2a268bda29f1183f0ceafc625fa5fdb847dc86fae1a20406e459d4a0177cb515220a568e08008d3e2dec4644c7b51633b13e6375ca42ff9138465f43d7800c7313199f67c9cf1b520b1820bd630ecf1c992e2767b38eb5bbc441a4ab8d317db441db35a0fe3abe7a9e4541881c2d7b1a2612306959815d1da41267d9649dd4494ace", "signature": "554552d6b790d421d06b0a67f8e002ad7a1ed01c06cf00cbeaec2a268bda29f1183f0ceafc625fa5fdb847dc86fae1a20406e459d4a0177cb515220a568e0800" }, { "secret_key": "98ef2a44d4c8476dff05aa78dcf9c6dc086cb2f622a06745d60cbf223faaba66", "public_key": "42fdb1daa39f0159119beec1bedf6f0394b26a2a29bd1fde081eccdadecc226a", "message": "c8b5fcfc3c18c7d95957b668e91c731d50c7fcea4f9575bbf784625870e238df546e2cb1a19d2808dd5b230d3871fdec16100ee1fbf9b722fa3744a750a3b396b05f9c21b8c0f61ead57a78c5ecf72b579cfe88a3f404c8acf524f9ab9", "signed": "ab5e8724a3e6ff76058cfb214d574e04d05574ecdd4ffe8c07c7af396e882687c5d79ef1e62fbb4c5f1bd06b9bd897826edde0d111d918e8ef961ff2a00d7700c8b5fcfc3c18c7d95957b668e91c731d50c7fcea4f9575bbf784625870e238df546e2cb1a19d2808dd5b230d3871fdec16100ee1fbf9b722fa3744a750a3b396b05f9c21b8c0f61ead57a78c5ecf72b579cfe88a3f404c8acf524f9ab9", "signature": "ab5e8724a3e6ff76058cfb214d574e04d05574ecdd4ffe8c07c7af396e882687c5d79ef1e62fbb4c5f1bd06b9bd897826edde0d111d918e8ef961ff2a00d7700" }, { "secret_key": "93a8c792a239c931917c114824a0174f8bc4ebbf98af8c7e321e0f5bea4015ec", "public_key": "9b2eaa8a9c2c25ff4f6e13bb12bae5d06fda0eb1105fafae5880ff168740bb74", "message": "901bf4e041caf16e04f2ffde8d6fe97e93d0900f6bc0fc09a9a0179d137b4b7788e57eb92766a9c634f35adb5c2988af1e86208f461998f59cfec99204b484fbcad3951e7ee4405523705d9739b44307db03f713fda78db421ef3121b3ba", "signed": "cfe32c4435d911d772dc0727e78d689d0164c5069597cb441b22c1d26236479f1afd7089121b9ab4f61bbb1fae1ab42f7635a92a53784d7170916b703aa5cc09901bf4e041caf16e04f2ffde8d6fe97e93d0900f6bc0fc09a9a0179d137b4b7788e57eb92766a9c634f35adb5c2988af1e86208f461998f59cfec99204b484fbcad3951e7ee4405523705d9739b44307db03f713fda78db421ef3121b3ba", "signature": "cfe32c4435d911d772dc0727e78d689d0164c5069597cb441b22c1d26236479f1afd7089121b9ab4f61bbb1fae1ab42f7635a92a53784d7170916b703aa5cc09" }, { "secret_key": "7001fa0c4404c28aa5b5fcff30a961f21a22f5b85a9e382e07aea8a8924d0ec1", "public_key": "daebb63c4d8f40ceba8ec35e3dd946a6b75bc74fcb29ade7b55eee3cc3aea5ca", "message": "44f48cfb02f08777a57873855f96be4c0291323f2739b275d90757a15472e5750436e0107408fe3026c00625689983f990eba9becbfce403ccd56356ad2741fd21445dfb23d76112e578b3395cf9d960955f1da8f399ca286f21390e25a59a", "signed": "64eac9ce87460618636b41fd2decc1673bfc48c5f479dfacb51e86686407374b1d10bf65d6d7474214d7770c9e5c7f806c80d53d48b720870e5e78f32e3a7e0544f48cfb02f08777a57873855f96be4c0291323f2739b275d90757a15472e5750436e0107408fe3026c00625689983f990eba9becbfce403ccd56356ad2741fd21445dfb23d76112e578b3395cf9d960955f1da8f399ca286f21390e25a59a", "signature": "64eac9ce87460618636b41fd2decc1673bfc48c5f479dfacb51e86686407374b1d10bf65d6d7474214d7770c9e5c7f806c80d53d48b720870e5e78f32e3a7e05" }, { "secret_key": "3adce3a3d3fbc977dd4b300a74749f13a3b04a5d73a2cd75a994e3195efebdac", "public_key": "6ff19b1f18d64851d5c74845c6407f0bf596a52e385e020127e83e54cff5ac19", "message": "fe6c1a31068e332d12aab37d99406568deaa36bdb277cee55304633bd0a267a850e203bb3fabe5110bcc1ca4316698ab1cf00f0b0f1d97ef2180887f0ec0991e8c1111f0c0e1d2b712433ad2b3071bd66e1d81f7fa47bb4bb31ac0f059bb3cb8", "signed": "7dda89f85b40539f5ad8c6de4953f7094a715b63dda30ec7cf65a785ceae5fc688707ee00be682cecbe7ee37d8fc39ee6d83c64409681708a0898a183b288a06fe6c1a31068e332d12aab37d99406568deaa36bdb277cee55304633bd0a267a850e203bb3fabe5110bcc1ca4316698ab1cf00f0b0f1d97ef2180887f0ec0991e8c1111f0c0e1d2b712433ad2b3071bd66e1d81f7fa47bb4bb31ac0f059bb3cb8", "signature": "7dda89f85b40539f5ad8c6de4953f7094a715b63dda30ec7cf65a785ceae5fc688707ee00be682cecbe7ee37d8fc39ee6d83c64409681708a0898a183b288a06" }, { "secret_key": "14803c1f23a47fcdd35e5d146e20ca630cd712c047d5330b652e31857acbc9e8", "public_key": "36f2d5bd6d8324fa6e9db7f7d854ebe48c0e6299998122e9d44b8adbef54f093", "message": "555983679d026e5354b4cc055ae1bc14653c7281ec722372f3feb778e841da821b3d0b8ee7a9a9129ea06824be8379fbbdcb0748f423721ccb172a1bafa1d5ae9fc1c51e93d41dd551c3086079b620286c1c40c1223bbcbb76722e92ca21d8410a", "signed": "07a7de6ce97664b3ea0928e1385c3309be08a47cbf4daa9186a1b948c86fbba39c4efcfcb7a0a3866bc94c6788ffe6be0d4972e56d0c3292d1cc6e25447b9904555983679d026e5354b4cc055ae1bc14653c7281ec722372f3feb778e841da821b3d0b8ee7a9a9129ea06824be8379fbbdcb0748f423721ccb172a1bafa1d5ae9fc1c51e93d41dd551c3086079b620286c1c40c1223bbcbb76722e92ca21d8410a", "signature": "07a7de6ce97664b3ea0928e1385c3309be08a47cbf4daa9186a1b948c86fbba39c4efcfcb7a0a3866bc94c6788ffe6be0d4972e56d0c3292d1cc6e25447b9904" }, { "secret_key": "1a61154d3472cd96b328ee674beb4fc86763a969fb410494e0678414e31a46a6", "public_key": "7576d93ac85d0fc61f258c55cf90bd87a635099c0e810ed0b937258d13b42559", "message": "64c565efbcb8b9528ed47253f3c6a4035db781d6f0976b5e5ba8447d4ed54b04105293ef4c000d8b2e1b5b75e727e5d2a077743b50d183b491764801a2504d16ee6d7d8ac4fe40e6bfc2a8129c7285a5ac691c35e642ed162cf7fbc64516733a23b3", "signed": "ada1666c9c3b8284b8a21c4f2618ef0808a646f3f10941e470f738e1785e2de9fdd9c8cb526f945c7a8c6994f151b7d066581b1d755307947c62befc8ab7070f64c565efbcb8b9528ed47253f3c6a4035db781d6f0976b5e5ba8447d4ed54b04105293ef4c000d8b2e1b5b75e727e5d2a077743b50d183b491764801a2504d16ee6d7d8ac4fe40e6bfc2a8129c7285a5ac691c35e642ed162cf7fbc64516733a23b3", "signature": "ada1666c9c3b8284b8a21c4f2618ef0808a646f3f10941e470f738e1785e2de9fdd9c8cb526f945c7a8c6994f151b7d066581b1d755307947c62befc8ab7070f" }, { "secret_key": "f215d34fe2d757cff9cf5c05430994de587987ce45cb0459f61ec6c825c62259", "public_key": "1ed506485b09a6450be7c9337d9fe87ef99c96f8bd11cd631ca160d0fd73067e", "message": "fbed2a7df418ec0e8036312ec239fcee6ef97dc8c2df1f2e14adee287808b788a6072143b851d975c8e8a0299df846b19113e38cee83da71ea8e9bd6f57bdcd3557523f4feb616caa595aea01eb0b3d490b99b525ea4fbb9258bc7fbb0deea8f568cb2", "signed": "cbef65b6f3fd580969fc3340cfae4f7c99df1340cce54626183144ef468871634b0a5c0033534108e1c67c0dc99d3014f01084e98c95e1014b309b1dbb2e6704fbed2a7df418ec0e8036312ec239fcee6ef97dc8c2df1f2e14adee287808b788a6072143b851d975c8e8a0299df846b19113e38cee83da71ea8e9bd6f57bdcd3557523f4feb616caa595aea01eb0b3d490b99b525ea4fbb9258bc7fbb0deea8f568cb2", "signature": "cbef65b6f3fd580969fc3340cfae4f7c99df1340cce54626183144ef468871634b0a5c0033534108e1c67c0dc99d3014f01084e98c95e1014b309b1dbb2e6704" }, { "secret_key": "8c9f95083075a43fe426d19f1e87719b40043de88eb0ee971f70e10c7694ce4e", "public_key": "e91d167aa3ebc23e70aab45dabe905e416262f910e2a955dd8619efc74c24e85", "message": "b69d70e860f55c427ef2a71df36e05bbc43bb2e06463aa5de34419c6a614eea6695335a87526c1226488d842891d0574df343c9c1e17aed6958ecee87474221eb77a599ecb059344c0d052c0002a66e5a6013185af69a01ba5dbc660d36cae235f67fe0e", "signed": "cac555222dafec76a0b47b9d2c586b3b3b9b3b9c8364beb3cae1e8dd7f1ae9dd74f22b8dd4ad2b290f81351a415a99f030f10778be4cda85d1d353331e70f109b69d70e860f55c427ef2a71df36e05bbc43bb2e06463aa5de34419c6a614eea6695335a87526c1226488d842891d0574df343c9c1e17aed6958ecee87474221eb77a599ecb059344c0d052c0002a66e5a6013185af69a01ba5dbc660d36cae235f67fe0e", "signature": "cac555222dafec76a0b47b9d2c586b3b3b9b3b9c8364beb3cae1e8dd7f1ae9dd74f22b8dd4ad2b290f81351a415a99f030f10778be4cda85d1d353331e70f109" }, { "secret_key": "d7eb1fba424feed100777eedb4874bf20810ad686b67e31d27ecf610609a33f5", "public_key": "a25acb11a6c825713a085fa754692886a87d07fb9be1a53eb961728bb66c9060", "message": "a1d0f81e3d59089cc2b19e07d2fce43db4cf171faa642f3b0bbde77ae3d53af5c02bf8fc12ffb4e57f7c8a015d6c2d178944fae9f7c8fc969d4b77bea51876ae99d59e94ad2456e0ed72c52cf4e5340da17c44dbff86457a519b6fffe269066290d629fe69", "signed": "2bf719682b07cc5ecc0480f37e9d123ff6f44c26e6958e59f080466f9cd373a16500daf123dc3f1334774bfc9fa84503b16dbf21a815c1ada6ebef4920461702a1d0f81e3d59089cc2b19e07d2fce43db4cf171faa642f3b0bbde77ae3d53af5c02bf8fc12ffb4e57f7c8a015d6c2d178944fae9f7c8fc969d4b77bea51876ae99d59e94ad2456e0ed72c52cf4e5340da17c44dbff86457a519b6fffe269066290d629fe69", "signature": "2bf719682b07cc5ecc0480f37e9d123ff6f44c26e6958e59f080466f9cd373a16500daf123dc3f1334774bfc9fa84503b16dbf21a815c1ada6ebef4920461702" }, { "secret_key": "4f6aeb35fce14fbcbb9aa8a4f6451bf95b98df047fa8c43f1ead3b404d3f928f", "public_key": "bf66a9edd09481db8444a176c8ce0578d2934f0cdc9734e86fcaac05bf3330f1", "message": "2dfbb3f59e19ea17d44a5bde4ad227a1a351dda17af840ee0a75da21a5cca89b6d1c567c333e9cc910e2157e05e86ad5d931145064594c47baeea8663a34649c43e90eb95ca10f7d51597b378a722f1f704adf9f22e9f885b89d1f938006a2efcdb42aaff5e3", "signed": "6adb07e364f2a455cb05867abc511acd9d658977f0cacafc92828e7b724f6bbf98bf0bfb29f4e5e6c74738d4fdd816d9252407ae4f3afc574c4f00614824e2032dfbb3f59e19ea17d44a5bde4ad227a1a351dda17af840ee0a75da21a5cca89b6d1c567c333e9cc910e2157e05e86ad5d931145064594c47baeea8663a34649c43e90eb95ca10f7d51597b378a722f1f704adf9f22e9f885b89d1f938006a2efcdb42aaff5e3", "signature": "6adb07e364f2a455cb05867abc511acd9d658977f0cacafc92828e7b724f6bbf98bf0bfb29f4e5e6c74738d4fdd816d9252407ae4f3afc574c4f00614824e203" }, { "secret_key": "ef4a6762b400975204ccc13abb47344015454906850ff14940cbb83aa22414ae", "public_key": "eaca450996f50cfaf2bd7f9d7fa7087f09ad49664206a80bc2e5bbbb85bb668e", "message": "a4b63eaed5a64a94f2cad212ce2ae71092fd3ea744f5bd89562b2fc2a6c9e4d7aa27add56264a5a55016610be6c19ff7d4989e9504740853012715a79ece9e12c301b3317c7d9b6730db862a4a1d28058e0f8b5ddd9738c7c62ea572cfe59eae08e2b8b6593b58", "signed": "02697d44cad862f1daf5708205f450d408525b10c01ffd06cfee80374f3db16fa9a49c19a9844b345f2f9559ea74aab173baa078c54370a5166700c6dafb780aa4b63eaed5a64a94f2cad212ce2ae71092fd3ea744f5bd89562b2fc2a6c9e4d7aa27add56264a5a55016610be6c19ff7d4989e9504740853012715a79ece9e12c301b3317c7d9b6730db862a4a1d28058e0f8b5ddd9738c7c62ea572cfe59eae08e2b8b6593b58", "signature": "02697d44cad862f1daf5708205f450d408525b10c01ffd06cfee80374f3db16fa9a49c19a9844b345f2f9559ea74aab173baa078c54370a5166700c6dafb780a" }, { "secret_key": "55017e5f61f0c5bafbcde6f849f42a31e5e7a878c1d3f9126fc569fd417ea9f2", "public_key": "66914f74ed932fc881ff0166683f675a7c28a926fddd6469cdb3f28e6dec42cc", "message": "2fc84a0998fa6e168a866410bb68105df249a28cfc76604be94fd7dffff2fc1dedd220199465575e8df860190f16aca4084169be16c6ba32eb67042ffd4f230316a26b2624a42f8f90ad57f6916486fa91fd94ed68aded4e632430ef719446979bfaf345409c387f", "signed": "b1a5e7c49b8fc6b4331e0416ce7e4ed59edd56300b802e0d72abca4a6fcb876c03bf331579124ae0d3fe43f7898bc87e93fc2da3970fc8638957d18c6613c8082fc84a0998fa6e168a866410bb68105df249a28cfc76604be94fd7dffff2fc1dedd220199465575e8df860190f16aca4084169be16c6ba32eb67042ffd4f230316a26b2624a42f8f90ad57f6916486fa91fd94ed68aded4e632430ef719446979bfaf345409c387f", "signature": "b1a5e7c49b8fc6b4331e0416ce7e4ed59edd56300b802e0d72abca4a6fcb876c03bf331579124ae0d3fe43f7898bc87e93fc2da3970fc8638957d18c6613c808" }, { "secret_key": "0553fba866942341217cf278ac57cb21acd09d9916cc6af0ac46941ea139d545", "public_key": "840c66e57c2d4f52a4a2796d2a53c5709b96a628c2e063fe6efd47f283ef5e82", "message": "c1fae6262a0e98a6b1235fcb62283b7f0a097f9d002416d318fefc60c5a1584f900ad0ab26ccfae0d6d84aa9aa2df16d4c117ea2724676cb866d4870a872fc829a7c2a5d21ba83340adb339a34c5184c7f5ead0f077289b33677ed6a1ba34be1994e25763bd1d9faec", "signed": "bc3364c152ee5c808ac340f49ea2cc404e93517121220cce6f7c30a22500e41bcdb6e820480f8fccdd22ff9ad96da532802f431e94240fb83d4bceaa09b92b0dc1fae6262a0e98a6b1235fcb62283b7f0a097f9d002416d318fefc60c5a1584f900ad0ab26ccfae0d6d84aa9aa2df16d4c117ea2724676cb866d4870a872fc829a7c2a5d21ba83340adb339a34c5184c7f5ead0f077289b33677ed6a1ba34be1994e25763bd1d9faec", "signature": "bc3364c152ee5c808ac340f49ea2cc404e93517121220cce6f7c30a22500e41bcdb6e820480f8fccdd22ff9ad96da532802f431e94240fb83d4bceaa09b92b0d" }, { "secret_key": "7a5ac602de19f3c21040bcddbff42f6aee6f95c1b093868f48e50482dbf4f9c7", "public_key": "fbb6c7531cda21e7d17ea903c4d14be6c68b4ca803a16bd87120f5aaf7dce1d4", "message": "bd1685419279eb81e4cf3c909031f0f09c5ffae7e2ce6ba9d96c2bce87b8ba0dd763231001e532c7ddd62103abf701288e19dd8f5302e8f5d31b64cc339bd8b7a95550c8a116fd486948772bd5af8dfd46001c59767b0d6bdce383a7078992d1022fbcaf90710687b9aa", "signed": "84101dd4b5e8ca3ed98c1e8a06e11d7e424b0d12ca714ee7374b64c29d51a2021cc77ac75389d9b0a646a447623d7d04d1241866b0ca6edd1b7ac015666b700dbd1685419279eb81e4cf3c909031f0f09c5ffae7e2ce6ba9d96c2bce87b8ba0dd763231001e532c7ddd62103abf701288e19dd8f5302e8f5d31b64cc339bd8b7a95550c8a116fd486948772bd5af8dfd46001c59767b0d6bdce383a7078992d1022fbcaf90710687b9aa", "signature": "84101dd4b5e8ca3ed98c1e8a06e11d7e424b0d12ca714ee7374b64c29d51a2021cc77ac75389d9b0a646a447623d7d04d1241866b0ca6edd1b7ac015666b700d" }, { "secret_key": "50414cf549bcc55b5b6b75ea3782b2ea7c087b6a0106175e469ca2cc764aeb01", "public_key": "d0f30c12e997f96e7aeecd1bff6a012ec388ebf8f3f4af664804d1638e4c346a", "message": "75ad77e8c54b0b05fb2d162e7cadb8a7528081b863f76a441b374469413e5714edf54f800496af0157c17e425583414d4361f2134171c0b87c22ce6820a4850ab49d99a9badce9e36110e7f3060118b3590f82b43771e9fbb081afe62227e024d98de6cdec028d7c49490d", "signed": "b309800160de43a63a89a0acb8a6050059589b3eaecac20b256fece438042f69415d8a56883ee3836d3134a7fc1de64fa8c8cecc3ce27589f606058820857a0c75ad77e8c54b0b05fb2d162e7cadb8a7528081b863f76a441b374469413e5714edf54f800496af0157c17e425583414d4361f2134171c0b87c22ce6820a4850ab49d99a9badce9e36110e7f3060118b3590f82b43771e9fbb081afe62227e024d98de6cdec028d7c49490d", "signature": "b309800160de43a63a89a0acb8a6050059589b3eaecac20b256fece438042f69415d8a56883ee3836d3134a7fc1de64fa8c8cecc3ce27589f606058820857a0c" }, { "secret_key": "93cb00d8fe9c9777a683631f39ba0f48761482cf1c366bd863cf715101532555", "public_key": "87e94a1ea5258d61180cb828590ff1418a87d01e702686ba8abc2692c8dc3c91", "message": "88d8538d31867813d88fef7228d49a7e950d738396f116dda1025f7913547c5d1dc5677a6de4b4a5880507b361780b61b43f7795263db22ff341645f2f5914fd6088c2811211ed4756ac019a6035d66e3170c1d82bfaa30596b396b3260cc1d10d413dd47ebe6daa0c30dc42", "signed": "09824fa2dfbc4d6ef76a9e4145961116769130553b3edffa50d04f39b8b79facbd237acf71354a53a6e5fee754e823b0b290f9619320a13d561269a221639f0388d8538d31867813d88fef7228d49a7e950d738396f116dda1025f7913547c5d1dc5677a6de4b4a5880507b361780b61b43f7795263db22ff341645f2f5914fd6088c2811211ed4756ac019a6035d66e3170c1d82bfaa30596b396b3260cc1d10d413dd47ebe6daa0c30dc42", "signature": "09824fa2dfbc4d6ef76a9e4145961116769130553b3edffa50d04f39b8b79facbd237acf71354a53a6e5fee754e823b0b290f9619320a13d561269a221639f03" }, { "secret_key": "2b4cae380e95ce694c26ac7957447347f98e31b4bf02d744e131529071e2301d", "public_key": "e6fc705a79c98e115b4e28d3aa1506b74ee74276c5fc1109a7f4d89c6fafb889", "message": "e0b8250e27b7c0291dbc47a6da6f1268987afdf0a1e90be69bcbc4370865217830d5208693be7b7045099a22ea27f952eb3f79a9a0f1b5a87b19367790788d34c219c2e2a6b834020fb4fd149dc56b544fddbb42071a162fc7cb33c146cac05a31b183e9daadc616f3af449b17", "signed": "555e45656ba9cfbf5155d0e52576e5197abbbc9dd233993eec2a1ee7f6a86409c0b71b0a661978ff5e0acdc9463dc449906f474f8e79bb86168bf70741e34b02e0b8250e27b7c0291dbc47a6da6f1268987afdf0a1e90be69bcbc4370865217830d5208693be7b7045099a22ea27f952eb3f79a9a0f1b5a87b19367790788d34c219c2e2a6b834020fb4fd149dc56b544fddbb42071a162fc7cb33c146cac05a31b183e9daadc616f3af449b17", "signature": "555e45656ba9cfbf5155d0e52576e5197abbbc9dd233993eec2a1ee7f6a86409c0b71b0a661978ff5e0acdc9463dc449906f474f8e79bb86168bf70741e34b02" }, { "secret_key": "b56491e54999bb5a1715ebfa2feb14a545a3a43c2fdfd4be0c95fc11819ad695", "public_key": "cd42bf414f9bfc72ec069882a800557cdf31bc3464fb102c310e6dbd3ae20863", "message": "eb4418ba30683ec7959bdb1ec7b263f83e81f054ddcdbe0a6738ca7763e246935bac419026c22bfbdd1236336cc16107c53513e3ddf34e120846962c3bdd54f5ad5749597208f15a8bb56667baa895f08340db89b85c435e770931928d8abc99262f839aedd9be2aa138c9259adf", "signed": "e3be3e71a89852df3cffd72d68207869dd3eceb49b1f029493eccbb932444ebe8c8c6db5f0a5a67e2194408df9841913a5ac1a606896419a668f4f47c56c2b08eb4418ba30683ec7959bdb1ec7b263f83e81f054ddcdbe0a6738ca7763e246935bac419026c22bfbdd1236336cc16107c53513e3ddf34e120846962c3bdd54f5ad5749597208f15a8bb56667baa895f08340db89b85c435e770931928d8abc99262f839aedd9be2aa138c9259adf", "signature": "e3be3e71a89852df3cffd72d68207869dd3eceb49b1f029493eccbb932444ebe8c8c6db5f0a5a67e2194408df9841913a5ac1a606896419a668f4f47c56c2b08" }, { "secret_key": "6579c247dd2cd02ba2f7d7a950a330752681e92c0dc62984bbea279ea521c381", "public_key": "0b087bea1a1b3d15805cb604f4bb8d68edde274faf521fe6df50c55f8ad4a70d", "message": "df7c552ffc89374b9571a6024a8d0471d7eb6be8dfca6f4166b581b65479015a0568129074cc04d6342c758ca18f7987dec536b7033d5f9681504340e20986f027b8cf1f263be76db3525d173422950ea8dceddc585640918aa9d25ca89cba701c2020153873f46108c772cb388d55", "signed": "eccaf801ae0a912e21c6b83a5f0e4e88d4b2713459ff93449fc0b21a9f416050113cbae4e814d20c0a798f76d2f9d326ed83959ea02abdc1ab350a467123f709df7c552ffc89374b9571a6024a8d0471d7eb6be8dfca6f4166b581b65479015a0568129074cc04d6342c758ca18f7987dec536b7033d5f9681504340e20986f027b8cf1f263be76db3525d173422950ea8dceddc585640918aa9d25ca89cba701c2020153873f46108c772cb388d55", "signature": "eccaf801ae0a912e21c6b83a5f0e4e88d4b2713459ff93449fc0b21a9f416050113cbae4e814d20c0a798f76d2f9d326ed83959ea02abdc1ab350a467123f709" }, { "secret_key": "18fba60c5026f3c9dd7aedc04209d5260361de400e190aeb60169e05a3367c9f", "public_key": "dfff347f3dd255530bf7fb34d02ba486d112bb46e950e2ef80e517014cc95734", "message": "34f08a804d7829cc3914f000ce1a3288acce2149c8a02086b9f67afccd83a178b0bcfd4970c056997da7dc3d47562f16663cedc52f82d710850cf4050379efdac23bee17c330a383ad137f788473b2b0723603b6deb1fdbf6c523fc948a0ccc4ff100fb946d874c1f990436ae8c4f3b2", "signed": "4bc011e40f0f59c618f6bbe230b6f7bc2f50e3617c7faab7f4c21cb84f77eba994cb7c2a1bf10b01bb20084497fdf0a6ab5d9bcd22c4a2c5a78f79926825940f34f08a804d7829cc3914f000ce1a3288acce2149c8a02086b9f67afccd83a178b0bcfd4970c056997da7dc3d47562f16663cedc52f82d710850cf4050379efdac23bee17c330a383ad137f788473b2b0723603b6deb1fdbf6c523fc948a0ccc4ff100fb946d874c1f990436ae8c4f3b2", "signature": "4bc011e40f0f59c618f6bbe230b6f7bc2f50e3617c7faab7f4c21cb84f77eba994cb7c2a1bf10b01bb20084497fdf0a6ab5d9bcd22c4a2c5a78f79926825940f" }, { "secret_key": "073cc15b0536285933b2be39253cf4fd696b81610f5dd3adac2e9cbf338ef2f6", "public_key": "00b551d371544375dac5c4e96cd1f0215207e8e166a1fe49d5b0a51ac18443ec", "message": "c285362bc8ef628f7aedf654231ee51acdf2cf69a886b942bb9bfed8155105d9209ded2af24f169ad5fcd451370f5827a85111c7a52e032c5038617c0c0170e2a6c231dc401d12062edb186036114e38793b79089077581b9783f40007103ef17472491c00e7138aecc5084d3c85010470", "signed": "3aa52a83062a8f28a5d6b7607f484b66cc374896b766123126333c579581316c742806f627b5bc55cad705cc1d4782b044080c8ac840f38c0c50d35e345c7803c285362bc8ef628f7aedf654231ee51acdf2cf69a886b942bb9bfed8155105d9209ded2af24f169ad5fcd451370f5827a85111c7a52e032c5038617c0c0170e2a6c231dc401d12062edb186036114e38793b79089077581b9783f40007103ef17472491c00e7138aecc5084d3c85010470", "signature": "3aa52a83062a8f28a5d6b7607f484b66cc374896b766123126333c579581316c742806f627b5bc55cad705cc1d4782b044080c8ac840f38c0c50d35e345c7803" }, { "secret_key": "fd894a1e8232203b289505d5c68c68791ffc0e54f2a87530fbba5b3a3f2caf00", "public_key": "e95ab565945c7ae5d533df5d0cccc7e9abbc838e20a0b61c930f5d41d81a6fe7", "message": "2669624a94f2c44a05b7dc3ebf93e58a4bf3a01c273657e7e7878976f6b6ea737fa3f22cc8365b8b220c007d5b642726a408fe2fab69ebb3bd072b349f4dc3377ee7cc752934254215d23989bd3cd02ce999adec9784993f4c19940815f39c9e229247f5205c36cba44e714266369289b4a7", "signed": "f51102219e8804be713e556df4e4afa2f8866fe86541a1c2a0934d24c3c9beb280a70dd8d527fe8b7e0b948214d5f2f9638619914b72d55dc198b0229a8487082669624a94f2c44a05b7dc3ebf93e58a4bf3a01c273657e7e7878976f6b6ea737fa3f22cc8365b8b220c007d5b642726a408fe2fab69ebb3bd072b349f4dc3377ee7cc752934254215d23989bd3cd02ce999adec9784993f4c19940815f39c9e229247f5205c36cba44e714266369289b4a7", "signature": "f51102219e8804be713e556df4e4afa2f8866fe86541a1c2a0934d24c3c9beb280a70dd8d527fe8b7e0b948214d5f2f9638619914b72d55dc198b0229a848708" }, { "secret_key": "18ef464e28f87ffcfa4d3a9c09a22910951b8c719fdacdb56de62c4b406df00c", "public_key": "c5064c9d43ee2da75b06bb09c77267dbd0d39128f1cdc6bfa451a03e93af4a70", "message": "9c825707d9358365ab9d38f7e728d628aa722a4f1a20a38e47c999fff8fc32417fbe072f96eb6a0e11e4da9b6de9615445280e93c77a3634d3d2c6879856c248f9800f60a0d38dc1cea8b7f31f286cb0374827b4c6ba144a6694f2b908ead68d18340124cb59cf1701863bd4f3efc709f3627a", "signed": "d1e7f16e8e597d428adea65591d551b54b667aff2020c464f7f4e53c4773f70433249a3c71b4d11c89c3faa892809227b9f29ef4f7f5d020d4674d40213594059c825707d9358365ab9d38f7e728d628aa722a4f1a20a38e47c999fff8fc32417fbe072f96eb6a0e11e4da9b6de9615445280e93c77a3634d3d2c6879856c248f9800f60a0d38dc1cea8b7f31f286cb0374827b4c6ba144a6694f2b908ead68d18340124cb59cf1701863bd4f3efc709f3627a", "signature": "d1e7f16e8e597d428adea65591d551b54b667aff2020c464f7f4e53c4773f70433249a3c71b4d11c89c3faa892809227b9f29ef4f7f5d020d4674d4021359405" }, { "secret_key": "c911bdf2f9e7cc5fff35c96e15cc12eafd05ab0db31f649f7408acd0cada76e0", "public_key": "de44696cd6bd2cbe9b11a0ef18b88164801a969d5e06ed453eb4008cce9a5725", "message": "76c471241d17192984b00362696e4d9d4d2b7f839c2064117e50a1598f3a1172b16c55e5396866084752024f3a7eb68bb3ffdb80979a0af6d0f6af26b6f0bc0c0384433bcfd44c75eb654a8a8225cb9c4a7fb3c824c3af6125fd46db287e70492d154632cb8f62432659d958d6281d04a54f5f5f", "signed": "d584b5da371ae4f5c9859b25f70dc56c1b7b4e02d1ae6636283b1b7b11217afdcdf65d1b49ca2c8ef17966e9bc65f10c310b77bb5df7aff5ec1b379a2ce55d0d76c471241d17192984b00362696e4d9d4d2b7f839c2064117e50a1598f3a1172b16c55e5396866084752024f3a7eb68bb3ffdb80979a0af6d0f6af26b6f0bc0c0384433bcfd44c75eb654a8a8225cb9c4a7fb3c824c3af6125fd46db287e70492d154632cb8f62432659d958d6281d04a54f5f5f", "signature": "d584b5da371ae4f5c9859b25f70dc56c1b7b4e02d1ae6636283b1b7b11217afdcdf65d1b49ca2c8ef17966e9bc65f10c310b77bb5df7aff5ec1b379a2ce55d0d" }, { "secret_key": "d3703299c41db36d77dd3a49541f3fb21d0b2bad1f6e074affd96f1c40d0f927", "public_key": "862c5ef616a5f066fd87758a56ab45056fea4bd33f008be24f7b540e095e148e", "message": "ac92edbe22257bb06d94aa950e62d18ca2ac0a8fc106000d2231f8a13b8d7a209ccd8cc49a6cd68a7f36c02fb8f728d15595167f0ba8cfe95c8a1e435f327513014ac428b75d4f72e7c834dd70e1a448f1847d3498475f74e3d9334dc7dcc4fed72bf6c7fe3b1d4f53d429616f1df44f19733158b6", "signed": "df28277121eac44630084cce75917ae9f6bec65af5572dc30719bde661cf696b85b8672dd4983cab30bd05cc3a119d7db9babd522d7b3a6bcf3886ecd25e080fac92edbe22257bb06d94aa950e62d18ca2ac0a8fc106000d2231f8a13b8d7a209ccd8cc49a6cd68a7f36c02fb8f728d15595167f0ba8cfe95c8a1e435f327513014ac428b75d4f72e7c834dd70e1a448f1847d3498475f74e3d9334dc7dcc4fed72bf6c7fe3b1d4f53d429616f1df44f19733158b6", "signature": "df28277121eac44630084cce75917ae9f6bec65af5572dc30719bde661cf696b85b8672dd4983cab30bd05cc3a119d7db9babd522d7b3a6bcf3886ecd25e080f" }, { "secret_key": "d411cd33576d0efe9ec413ccdaabd4fcbafec01a3af4b3cbe34f8b05ef8b59ba", "public_key": "e870344df98dd3a8702c4519bf9e8b35a9d189e746f7203dbbf9bbfab22d6f63", "message": "11d2c2a7f0190988126696431b4bbcd90ab7b56a32da6404ae446aa762a4ddc66094971538eeb85bde0470a510be0d6d85780ee730a9854138728ae6816162268da852858eaed4ec74c7ac62e6e7096dc002df0bdf5fa40da565b41d181a3f0ad0c5e0b976743e315d9db8ed4160abe69c13a2b3f09a", "signed": "83460d15461d6717710bafd6a47a1eaa900a80f2bf8b8aae2468773614ee84bd628c9717476368ef3640cf760acac83ad60232a76963b7d52588b11dc004d70d11d2c2a7f0190988126696431b4bbcd90ab7b56a32da6404ae446aa762a4ddc66094971538eeb85bde0470a510be0d6d85780ee730a9854138728ae6816162268da852858eaed4ec74c7ac62e6e7096dc002df0bdf5fa40da565b41d181a3f0ad0c5e0b976743e315d9db8ed4160abe69c13a2b3f09a", "signature": "83460d15461d6717710bafd6a47a1eaa900a80f2bf8b8aae2468773614ee84bd628c9717476368ef3640cf760acac83ad60232a76963b7d52588b11dc004d70d" }, { "secret_key": "e10a2f1380c3e4720e8a8707a9bcb25a0f58270d7059cd7626c7153447edfb87", "public_key": "a3c717acab366a40b51187bbf35b2d15e97cfeacd7349c06ef1c91ac93e90656", "message": "135212a9cf00d0a05220be7323bfa4a5ba7fc5465514007702121a9c92e46bd473062f00841af83cb7bc4b2cd58dc4d5b151244cc8293e795796835ed36822c6e09893ec991b38ada4b21a06e691afa887db4e9d7b1d2afc65ba8d2f5e6926ff53d2d44d55fa095f3fad62545c714f0f3f59e4bfe91af8", "signed": "094bf6f953ca0eb77df45129b7bf10d192cf6ddeae94ad6202b8eacfbec119e5291578fe64a084ae600fe07efdb8a782610dbdb0b49eb5f2a46c432355552f01135212a9cf00d0a05220be7323bfa4a5ba7fc5465514007702121a9c92e46bd473062f00841af83cb7bc4b2cd58dc4d5b151244cc8293e795796835ed36822c6e09893ec991b38ada4b21a06e691afa887db4e9d7b1d2afc65ba8d2f5e6926ff53d2d44d55fa095f3fad62545c714f0f3f59e4bfe91af8", "signature": "094bf6f953ca0eb77df45129b7bf10d192cf6ddeae94ad6202b8eacfbec119e5291578fe64a084ae600fe07efdb8a782610dbdb0b49eb5f2a46c432355552f01" }, { "secret_key": "b2e697b3d3efec976ef3369530c792717bdbb428d9ed0c11ec0ea9b2e5f39f82", "public_key": "c4d2e4b3c236d6c9b8c74fa384612c4710d83aa16ad7ef01fbb7421d4fb3f0f6", "message": "7b436232ac2111a84059510c48362588fcb7383426be5e6f62f372e4f7cca83c81c2357f9b54f4a15291065b6d41aad1ea93cffa776b9acaa58afe2b51644b97af9a3e53f84e40aa6d86051e6914cd039d4170a9a526dd69955ff507c33f74e2176591fb0b3cd7f00ee418f2c258a9981cccee72f01c8430", "signed": "5047fa38197b8328e78dd8a10e966afb7bd3d43608280f1c257d25ca43bc1c06e94a5747ab6215ece54cdeff8c56567d70d2f91f9ec8c260aa1080a6ab5a7a027b436232ac2111a84059510c48362588fcb7383426be5e6f62f372e4f7cca83c81c2357f9b54f4a15291065b6d41aad1ea93cffa776b9acaa58afe2b51644b97af9a3e53f84e40aa6d86051e6914cd039d4170a9a526dd69955ff507c33f74e2176591fb0b3cd7f00ee418f2c258a9981cccee72f01c8430", "signature": "5047fa38197b8328e78dd8a10e966afb7bd3d43608280f1c257d25ca43bc1c06e94a5747ab6215ece54cdeff8c56567d70d2f91f9ec8c260aa1080a6ab5a7a02" }, { "secret_key": "19a679a7a905a1e2b3038e6e418b3da97c3089c7cd351ea07bc8d1af64eacc46", "public_key": "19f08361f469b4ae1e0ceb94f47a7de7317410a92dd013b16ae0d0532fa4b3ef", "message": "980c7b4d2939061ac7b9ba441117a19485661781a4083067c55acf93026c082a93cc124f095e1b4f2c3f6c135412a5096228e8a071e8b4b668ba9d9644ea9f4dabfc54a9856c3e965e6363395ab709037dda229baf927cd01f9af5e039afc42f3cec634f5d832d2ab7c7cad3ad7b8cf27ebdac698431ad8236", "signed": "4347b7b4f7c3c4dd315b8384a0b0caeed84bdabe24b2915f12512dfd04770fc996a1bfb729afef9edd611447081a5330617eaea1c1dab1bf13cea8997204910c980c7b4d2939061ac7b9ba441117a19485661781a4083067c55acf93026c082a93cc124f095e1b4f2c3f6c135412a5096228e8a071e8b4b668ba9d9644ea9f4dabfc54a9856c3e965e6363395ab709037dda229baf927cd01f9af5e039afc42f3cec634f5d832d2ab7c7cad3ad7b8cf27ebdac698431ad8236", "signature": "4347b7b4f7c3c4dd315b8384a0b0caeed84bdabe24b2915f12512dfd04770fc996a1bfb729afef9edd611447081a5330617eaea1c1dab1bf13cea8997204910c" }, { "secret_key": "f03b8363ee5b0eef7018a49bc02adf731da54ee50a7f03b88a29a2082b189c43", "public_key": "31287ef5a2e64104ab7790b312f35c7ad4af6beb0d7ceb8a58f36a54ce272c3e", "message": "24191b5464b35ac7bcf4a375f033efba8943b09b9ff0fc403ca7aae702a3cbf396c5131bc008132cf5f12910d586dc1db9c084574a96babee95642f922371c0382ec0402a26feb142e4146bbd3360c2b36834fe45af5e2868d4d56fdd504cebf0c2d7f5791b4429417c8b65a98e0b15c466c137f410524fce737", "signed": "e8fa967e6afadf6a877d87e5f5c52bb634b75a7804199a2bc9d027b63a35654d9ddd06830455641dbfb49edce42e20e7d4104a071c2cbbec23018c297ced990824191b5464b35ac7bcf4a375f033efba8943b09b9ff0fc403ca7aae702a3cbf396c5131bc008132cf5f12910d586dc1db9c084574a96babee95642f922371c0382ec0402a26feb142e4146bbd3360c2b36834fe45af5e2868d4d56fdd504cebf0c2d7f5791b4429417c8b65a98e0b15c466c137f410524fce737", "signature": "e8fa967e6afadf6a877d87e5f5c52bb634b75a7804199a2bc9d027b63a35654d9ddd06830455641dbfb49edce42e20e7d4104a071c2cbbec23018c297ced9908" }, { "secret_key": "11086b0d11e415ab1ce02aaf8f0621b54430f6fb135c74f40d38e8c64737064b", "public_key": "7166dfbc691eb8c201114ba0d1a2c7b87f7a1fd8d0b36058b0d7dcabe1ae30da", "message": "4b5b2936c5e360a38455503721078f8adb404a7ee7ecc14801dc87a67a152b769569fbeac0afa25a2070a1686b900ac1633d499808cdb2e81ce3916d5a3c04d19c5bb2699a662b8aba4af94d390bac7ccc8ec910ed2acdf86ebb71adb601877885eef3c91662fc30738e352cc74353ccf8d8edeefacc042c10a0e5", "signed": "e907459d5adcd0d0c36418581f19d0eebda7138ebd9faa0b262201f458c856310bb77f4c7de922495dcfe8b248eda2ad0df6a73f47bbfb894baa7d88698758024b5b2936c5e360a38455503721078f8adb404a7ee7ecc14801dc87a67a152b769569fbeac0afa25a2070a1686b900ac1633d499808cdb2e81ce3916d5a3c04d19c5bb2699a662b8aba4af94d390bac7ccc8ec910ed2acdf86ebb71adb601877885eef3c91662fc30738e352cc74353ccf8d8edeefacc042c10a0e5", "signature": "e907459d5adcd0d0c36418581f19d0eebda7138ebd9faa0b262201f458c856310bb77f4c7de922495dcfe8b248eda2ad0df6a73f47bbfb894baa7d8869875802" }, { "secret_key": "efce7667a8ef91228caed14eb477a345e5e8239234080848760ed0970713fa86", "public_key": "9193055a84df1eacca28ce2a08c2a07a50f04c024ecf1fe4a47d2efbaf63ed58", "message": "aa1bc80d7bcc1d94a23a57cedf5027482477dc46b86890bc0e5ac29ae6c91bbc43130348797305f75543580a8a069b348a7bd8fc3e015230b7c1940c7f80a82b12900910dbcf0630da03f081d44c7f955d4a1172f56ecc7c5ac646696bffdf4eb6d88bdd9cc3843528b72583abb3bad02e56ef7646eed5139551cdeb", "signed": "e5a63124db1696b64140b6e9612fa9587b3eef710109398d44ba0ca63c0ebad06f0a6c8994ea34b3a2af91a89bf41ae614d7727d716fd42f8b92e1ac64fdbf03aa1bc80d7bcc1d94a23a57cedf5027482477dc46b86890bc0e5ac29ae6c91bbc43130348797305f75543580a8a069b348a7bd8fc3e015230b7c1940c7f80a82b12900910dbcf0630da03f081d44c7f955d4a1172f56ecc7c5ac646696bffdf4eb6d88bdd9cc3843528b72583abb3bad02e56ef7646eed5139551cdeb", "signature": "e5a63124db1696b64140b6e9612fa9587b3eef710109398d44ba0ca63c0ebad06f0a6c8994ea34b3a2af91a89bf41ae614d7727d716fd42f8b92e1ac64fdbf03" }, { "secret_key": "88fccaa96ad884d1165be71dd0c4f5f8f4421c60fbfa498bfee9b967462443bd", "public_key": "c75cb0e0237b45b8656eea9f3d1a9d4acd01a103aa269bb24fd54122fd81f2ac", "message": "9d0eac98556bfa8672c35705d1d61ac4d0fca19dc0d993015877857d27fd80f74acace666c563485d81e53603a6aef40875fa551cc105f2cc10b39694679cdf4a6b073bc88645fc51a36da179d3d1e3c7722454c5e73577c61aa7d148c4ba50ea46c56a1c3b3b3c470f93100494e08bc5514ac763a85483c42c7cdc27c", "signed": "27d3a197cc9994212063bce8d799e77b6853b7355ebe369bcf1889a418a82caa3a7987a663f621defe86b3ac4ad44faeed16c9116ace28fccf915557fa7799039d0eac98556bfa8672c35705d1d61ac4d0fca19dc0d993015877857d27fd80f74acace666c563485d81e53603a6aef40875fa551cc105f2cc10b39694679cdf4a6b073bc88645fc51a36da179d3d1e3c7722454c5e73577c61aa7d148c4ba50ea46c56a1c3b3b3c470f93100494e08bc5514ac763a85483c42c7cdc27c", "signature": "27d3a197cc9994212063bce8d799e77b6853b7355ebe369bcf1889a418a82caa3a7987a663f621defe86b3ac4ad44faeed16c9116ace28fccf915557fa779903" }, { "secret_key": "670b30626fe367d8b45f43733d6f25b37eccbcb551963f0ac8b666b48041c72d", "public_key": "65aa4c6d4ba0ab34bc75b39f09527ca6f2425f52415cdffdf2dff273f8ea612c", "message": "d00bcca7e184d10e1f1fe420b50639e1d5deba52a751236e68c59bb4bff9802f5fc165ed42fd6d534670a7c6fb60e4307d947915a248bf2f93465c2cb44d8f453d2c015afbc8ed58818ea51726a25177930e9ea192ef4514f4bb0eb4e0f5d4ae3c46e357c81187f7ed174733fff959c3f9fae6486cfa1356a95699211de5", "signed": "1b6b4377d2b98e0f9d24ae8dfe30e2396e2004380d3431488e5843cf8d2d7a0070ab21f8a3b51ce84d2f4ba209f739f922bebf798096693f5622873d79ae6f04d00bcca7e184d10e1f1fe420b50639e1d5deba52a751236e68c59bb4bff9802f5fc165ed42fd6d534670a7c6fb60e4307d947915a248bf2f93465c2cb44d8f453d2c015afbc8ed58818ea51726a25177930e9ea192ef4514f4bb0eb4e0f5d4ae3c46e357c81187f7ed174733fff959c3f9fae6486cfa1356a95699211de5", "signature": "1b6b4377d2b98e0f9d24ae8dfe30e2396e2004380d3431488e5843cf8d2d7a0070ab21f8a3b51ce84d2f4ba209f739f922bebf798096693f5622873d79ae6f04" }, { "secret_key": "813c4daed67a190d68bb635d73af6da74f32fdf7c48cca6e59262946b8e8c71f", "public_key": "a2095457d7697020e2b884d95a96578c2a900a7666ac0dc7bd38f1931d7945d8", "message": "ce54cb0450e689a0dbef785308b3177472fcd6d38203e58a0590b31fa253f9ea590be5368a922de88b63450102684443fb8189e601282003323b89c81e92eaef2b5ddc4a55c53fa3cfad4160248b3c286ff80d31d161b7b8dee713552b56f1507fb72eadfa89054e9d1600ac874c4b0a961004eb6d0d4bfd2ecb9c734f00ba", "signed": "b446574ff6a4bd2b572e487c4ab443ca641075168aa4e1092f71f30bdb068ce46a395efee1ee660b9fac26d54109722c15cdb791bfb87fff63c6596ad4f2270cce54cb0450e689a0dbef785308b3177472fcd6d38203e58a0590b31fa253f9ea590be5368a922de88b63450102684443fb8189e601282003323b89c81e92eaef2b5ddc4a55c53fa3cfad4160248b3c286ff80d31d161b7b8dee713552b56f1507fb72eadfa89054e9d1600ac874c4b0a961004eb6d0d4bfd2ecb9c734f00ba", "signature": "b446574ff6a4bd2b572e487c4ab443ca641075168aa4e1092f71f30bdb068ce46a395efee1ee660b9fac26d54109722c15cdb791bfb87fff63c6596ad4f2270c" }, { "secret_key": "8400962bb769f63868cae5a3fec8db6a9c8d3f1c846c8dceeb642b6946efa8e3", "public_key": "98be21001993a7eb1a1277ff74c15504183d25fdfcc05f0d4dea892f6e301890", "message": "f7e67d982a2ff93ecda4087152b4864c943b1ba7021f5407043ccb4253d348c27b9283acb26c194fd1cbb79e6afc32ff686b55b0b3617218dcf39316b4b66b3c8c0d67267a86db8adf3750801bcf9327d4c25441b96197832b4cde0eac3ff22892a2f0bc17c2c213c02377a333e308ed271658049383b7e2e57b6b8b125512e0", "signed": "0ad71b0025f3d9a50db338414d6d670e7799b7270a8444f6ae7f12ae7eb71bd03ffd3c4f36631f69fdcc4061468ff582ede495243ef1361a3b3295fa813ba205f7e67d982a2ff93ecda4087152b4864c943b1ba7021f5407043ccb4253d348c27b9283acb26c194fd1cbb79e6afc32ff686b55b0b3617218dcf39316b4b66b3c8c0d67267a86db8adf3750801bcf9327d4c25441b96197832b4cde0eac3ff22892a2f0bc17c2c213c02377a333e308ed271658049383b7e2e57b6b8b125512e0", "signature": "0ad71b0025f3d9a50db338414d6d670e7799b7270a8444f6ae7f12ae7eb71bd03ffd3c4f36631f69fdcc4061468ff582ede495243ef1361a3b3295fa813ba205" }, { "secret_key": "6288722035d1ea699bc7cfdf18d89625423180b683fa74639f4f30f15359cc85", "public_key": "e17faa019572861a064e1bc571256dea1468f3a48590a89138aaa85925080cd7", "message": "8b6caacac51d8949fb86acbcb1b99d859ff67c64147bc1216909dcab07ee6ef09f403863327394689dc34abc778fcb5c1f5091acf5a08f9d842211d1ae2eb40be9bb8d6679077471547a6c71ff77b519d4b7108e32bc46251c60dee8e332b6229316e6d57c22ab826ff1bc33f2b0213807c19280af110fd26ee27468201cff49cb", "signed": "9dec92b6e89adbe8f4e1b5e93ac4fcf957de7d1970a226770ec4eda647c8e3b3dffb2731a39e16e4a0119d3662a937e560522491ec7a1696be04c076b12e35018b6caacac51d8949fb86acbcb1b99d859ff67c64147bc1216909dcab07ee6ef09f403863327394689dc34abc778fcb5c1f5091acf5a08f9d842211d1ae2eb40be9bb8d6679077471547a6c71ff77b519d4b7108e32bc46251c60dee8e332b6229316e6d57c22ab826ff1bc33f2b0213807c19280af110fd26ee27468201cff49cb", "signature": "9dec92b6e89adbe8f4e1b5e93ac4fcf957de7d1970a226770ec4eda647c8e3b3dffb2731a39e16e4a0119d3662a937e560522491ec7a1696be04c076b12e3501" }, { "secret_key": "13038a3a65ef32759a9cd903acb554b252de00e7cdb77bbed1970b20680ee17b", "public_key": "b6a308e67f9b46c66499456ab5cd135cb2fe84a32eb045358626604da4122c8f", "message": "ddf00b4033a2a088022dabe93356432f50ddc6c6e1a659dc1a93124a4c2ffffd182765a2f56c43ea0bfd8de8015060889ae6941c3f3e255d4421a1c36201be846a2738a71f120cad598ca8527d70ff8d5a0993b55cb5153517110a41962daff42250158f2096d1ddaf7186e50298cbe51fcb429cbea411293f8a7bd9cf069fa237e4", "signed": "5261558ecc3c98ff36351f42f504cad4a32ffda5a744560960b4c106e4492f02e20478887afee4f770f05597a7e388caceae805ae351e0e45e8e578e6a6ff20cddf00b4033a2a088022dabe93356432f50ddc6c6e1a659dc1a93124a4c2ffffd182765a2f56c43ea0bfd8de8015060889ae6941c3f3e255d4421a1c36201be846a2738a71f120cad598ca8527d70ff8d5a0993b55cb5153517110a41962daff42250158f2096d1ddaf7186e50298cbe51fcb429cbea411293f8a7bd9cf069fa237e4", "signature": "5261558ecc3c98ff36351f42f504cad4a32ffda5a744560960b4c106e4492f02e20478887afee4f770f05597a7e388caceae805ae351e0e45e8e578e6a6ff20c" }, { "secret_key": "b9de5b063d3ca3a773f114941b2e4227c07511c0f5c06017b9c8845018f23432", "public_key": "5295243c8646e096674dda15979b322b9dd0faf27d024a0ed5771334e1179ed2", "message": "9493cc23896b84096046ae1053afe39499e9424254b366fe143f4da321e2dc9e4784208e12a542d899828dde7eff625a7f12416990c2841ffb095bf94c0c610e5a663918b689031ccd6b519349d04de1c212ca2a9d7abf52e1b4fd467bb665b6919ef8f91617e205565bf56647e5f8d508ea200a84467f8fa122e74bc3b9979f1174e5", "signed": "92ba760d14d1415cfaf218ca847014088ae51ad821113a6f8630356f7ba85c005e2330f1066d0df464806052a4174610050462f3e013d702e7c77185a032580b9493cc23896b84096046ae1053afe39499e9424254b366fe143f4da321e2dc9e4784208e12a542d899828dde7eff625a7f12416990c2841ffb095bf94c0c610e5a663918b689031ccd6b519349d04de1c212ca2a9d7abf52e1b4fd467bb665b6919ef8f91617e205565bf56647e5f8d508ea200a84467f8fa122e74bc3b9979f1174e5", "signature": "92ba760d14d1415cfaf218ca847014088ae51ad821113a6f8630356f7ba85c005e2330f1066d0df464806052a4174610050462f3e013d702e7c77185a032580b" }, { "secret_key": "8ff0297cc08842b5e67552ec2843e04353a34d74ef89b8565d97205b74ca133a", "public_key": "0f7ef98c5ba4af984dfb77bc4e537b2b39e6273bb3e7b95fe1b7e6781952bd4a", "message": "2bdc3a486c5e4ea62dcfec8a9d4fcf9ea9490dbcc715615d58490a72ce833fa22387ca50a0052508cf0aff1ca727f0fed46ffa7d3c8e23c5bb01d47e90ff06d3858a557d9926481579daf4384aea50e96ec615d2a3bf3c1122f1f24dd6ed98a5de421883589c213998ca5432373e68bbbe89428ca9885d0593d5e6215116b8266386452b", "signed": "0783737f706e6ff36614f850074fca1f485f24fcde2a28af544f37abd69b7a581defd8c771b031e108d19d788c74c5f20bb3f1c21cd92be317bacd8f650b49052bdc3a486c5e4ea62dcfec8a9d4fcf9ea9490dbcc715615d58490a72ce833fa22387ca50a0052508cf0aff1ca727f0fed46ffa7d3c8e23c5bb01d47e90ff06d3858a557d9926481579daf4384aea50e96ec615d2a3bf3c1122f1f24dd6ed98a5de421883589c213998ca5432373e68bbbe89428ca9885d0593d5e6215116b8266386452b", "signature": "0783737f706e6ff36614f850074fca1f485f24fcde2a28af544f37abd69b7a581defd8c771b031e108d19d788c74c5f20bb3f1c21cd92be317bacd8f650b4905" }, { "secret_key": "050d553d282dca3269c83c181768ec067b81c9fe0c94f2a0ebbb0c942d0fcd7c", "public_key": "63e230b003c53a5672e832ff7f24430be223e497de840233f595a3e200c7127e", "message": "15e13b8c01004f6aa5b236dbb281677f746d81e548e0aa80f0e414521521d856cd694e7c9152bb5e43776b60f6b560ed1ad3e4b390dbf3e46ef9257443f39c149e0240a02d021e1e3d7d046b26fd004eee7ca16a8059e126c74cb3f2194db47bf60465ecef5c704d2e2c75e2e50060ea2a31cb72b7b3c6b1b5ec72ab38004085281a22fe86", "signed": "3f0e83765b31bbe8e1fb92e9678d6cde571a03ba7f1dcc1128461f708525457f4e0e2353aa2b598c063ff1bffdac916b5a2200655156904b0585577a1628560d15e13b8c01004f6aa5b236dbb281677f746d81e548e0aa80f0e414521521d856cd694e7c9152bb5e43776b60f6b560ed1ad3e4b390dbf3e46ef9257443f39c149e0240a02d021e1e3d7d046b26fd004eee7ca16a8059e126c74cb3f2194db47bf60465ecef5c704d2e2c75e2e50060ea2a31cb72b7b3c6b1b5ec72ab38004085281a22fe86", "signature": "3f0e83765b31bbe8e1fb92e9678d6cde571a03ba7f1dcc1128461f708525457f4e0e2353aa2b598c063ff1bffdac916b5a2200655156904b0585577a1628560d" }, { "secret_key": "69497cd7b4e868cfa0328d92bd6052d772b2767395c14595b279851a9cdd31aa", "public_key": "5d276d626e230d18e7bcd61141cb93c90ef0f79e01321212d838ec71457b1aac", "message": "53cd080a0c61f1a093d3b3a74571c296303f363b4107edbe880b7aa9dfe44ab5d5dc5f74be9c8d876f04d754653491ab51b135fc953f71287b62ff41b67c742bd3445671a9d4f2dc174ca1b0335f78627a0dd4b30650504178039e7393638510ffe84091b57298d3ac9001c367c1452fbcb33dc54a5dc316fb2a5270764a2ac820a0b63fbdc6", "signed": "beafa58340960908e8d86e40329e3a4523fc7be770addb86e34c3772f84cd9fb338d1f3b65bfcdb09f35c6da36d1a3adf8f91f1ffd5782cc830206433a08410d53cd080a0c61f1a093d3b3a74571c296303f363b4107edbe880b7aa9dfe44ab5d5dc5f74be9c8d876f04d754653491ab51b135fc953f71287b62ff41b67c742bd3445671a9d4f2dc174ca1b0335f78627a0dd4b30650504178039e7393638510ffe84091b57298d3ac9001c367c1452fbcb33dc54a5dc316fb2a5270764a2ac820a0b63fbdc6", "signature": "beafa58340960908e8d86e40329e3a4523fc7be770addb86e34c3772f84cd9fb338d1f3b65bfcdb09f35c6da36d1a3adf8f91f1ffd5782cc830206433a08410d" }, { "secret_key": "2165a486b612bbff529cd00346964a3cb8cdcffa51dc3d524dd5adc5ac936d68", "public_key": "7ebc839a465e14f5892476e4a13b3988f83b3cd27ef79e193f86fa16f34a1ce1", "message": "b728da7a36167c6085bd2d962cf63959facd95c9ad4542028afba90ec9c6c0760bdae935429c3feb3933e2f00042c672ad2cd7348d92bc33f81751e294ae9171b945b193144ef8acb9a1bd9abf0475ce0d0ac789b200c32e9c9a2736b168369ce5f97b1e8d2e7900e1a759178441f1fc430564ae129bae7857740511a668f32c0a3b077a9d8b19", "signed": "7ec6fba56ba52460a1b4f2738689c1883dda9aaffc8bde17cb6029bdce3a0ebe2fffda55939b70bbd07fdbf6fc5cda87fed8ba58575f894a366e45e5705eea09b728da7a36167c6085bd2d962cf63959facd95c9ad4542028afba90ec9c6c0760bdae935429c3feb3933e2f00042c672ad2cd7348d92bc33f81751e294ae9171b945b193144ef8acb9a1bd9abf0475ce0d0ac789b200c32e9c9a2736b168369ce5f97b1e8d2e7900e1a759178441f1fc430564ae129bae7857740511a668f32c0a3b077a9d8b19", "signature": "7ec6fba56ba52460a1b4f2738689c1883dda9aaffc8bde17cb6029bdce3a0ebe2fffda55939b70bbd07fdbf6fc5cda87fed8ba58575f894a366e45e5705eea09" }, { "secret_key": "1c64ad63dd147034598e128f7406ec0530746ea1c5b72ecf79e888065486fa1b", "public_key": "baa6bcc1c3d8d3b11ffc1587adddc58bfd96c2b992b6c6f59fcc50ccbcdd0eb9", "message": "9ebd8e337893bb053ef2b9e3269df54848494f03cd63576b33e64b1080be4be015264a403fb9602bbf90ca19b241a9b66863909b9008ce1b2ffcf236efa4c2668f0f47db9ff5fa157d9cb605412be7dd8b07ea878cccae6bf50f935b86d19e1b648b69e528553a56d8afb78221ad53307b7a4ec8d2fd4861b55dc5dae8e93ef387fbbe0b4ce7f788", "signed": "7477e54158f13b7128c0a110ca6b65f42514fb70cd5cf28a8b1cc6110ea06fcf94290da13f85a11c2351d3bbccbb4c64e0215d6d0f0099e7f27bc94e949b150b9ebd8e337893bb053ef2b9e3269df54848494f03cd63576b33e64b1080be4be015264a403fb9602bbf90ca19b241a9b66863909b9008ce1b2ffcf236efa4c2668f0f47db9ff5fa157d9cb605412be7dd8b07ea878cccae6bf50f935b86d19e1b648b69e528553a56d8afb78221ad53307b7a4ec8d2fd4861b55dc5dae8e93ef387fbbe0b4ce7f788", "signature": "7477e54158f13b7128c0a110ca6b65f42514fb70cd5cf28a8b1cc6110ea06fcf94290da13f85a11c2351d3bbccbb4c64e0215d6d0f0099e7f27bc94e949b150b" }, { "secret_key": "55abbc5dac4128134dc8c6018a213ed4b60fcc8e90cbd41db2d21eda5373e936", "public_key": "251afaa2646926b2a371f2a09d5865b98c9a5eb6ca047cd0d8ee36e5e0416974", "message": "47010e1398ad55fabe371dd8648f768d90df4b965a3b396100b303b40a17518bed6d86b09f734ab7c10b5f3a01b53deec5f8534b70c79f3f29b284fdec486f22f44c22ccd5c6463594415267baa611f70b1b316caa1b68b5e0e99b31c5bb0ce13679a23c31a63999698164cbf37d103ba92490188be59937f123043ec786efe3d411f9b0623a6ad972", "signed": "f6a61c2e661a9eb7bde182e38ec99af985f61698a5d7fa430d16e3f1a93709b75522320de48afcc595ab209122ae0ce132cdf4b0391746e7ff341177570c810847010e1398ad55fabe371dd8648f768d90df4b965a3b396100b303b40a17518bed6d86b09f734ab7c10b5f3a01b53deec5f8534b70c79f3f29b284fdec486f22f44c22ccd5c6463594415267baa611f70b1b316caa1b68b5e0e99b31c5bb0ce13679a23c31a63999698164cbf37d103ba92490188be59937f123043ec786efe3d411f9b0623a6ad972", "signature": "f6a61c2e661a9eb7bde182e38ec99af985f61698a5d7fa430d16e3f1a93709b75522320de48afcc595ab209122ae0ce132cdf4b0391746e7ff341177570c8108" }, { "secret_key": "f2dcf4a1a0d46ddb2d72f8fdd80bbec5b7dea5913da4966c2f4d12c261f0bf98", "public_key": "d39570a25ca59f2257f93f96600df4f63e684bf63ae8dffd914e4629c3d5095f", "message": "3b00e808fca4c11651d853d6b90f952ccf5647e102d4ee0ad7a5d181d5b4258c523cd39e3d9825298d84c8cba09f43dbba119988222c76059caf17b4bf9931c45e617448aeade151181497b24552367e52bc45ac79088806d3368207aafefd3057845dce819d5aaaa77b218e2aed3da76d40c1f07699f8172e4a5c803f7a2aceb9a47a8952e1b2f053f2", "signed": "42882a811dad2d851885e4cbe9044708d91a86f15dfa1d66c3eb304314531f3015208c711b9bdbc5fb233951e569b59d34e415eec4b37ffd374d412c9a360d0c3b00e808fca4c11651d853d6b90f952ccf5647e102d4ee0ad7a5d181d5b4258c523cd39e3d9825298d84c8cba09f43dbba119988222c76059caf17b4bf9931c45e617448aeade151181497b24552367e52bc45ac79088806d3368207aafefd3057845dce819d5aaaa77b218e2aed3da76d40c1f07699f8172e4a5c803f7a2aceb9a47a8952e1b2f053f2", "signature": "42882a811dad2d851885e4cbe9044708d91a86f15dfa1d66c3eb304314531f3015208c711b9bdbc5fb233951e569b59d34e415eec4b37ffd374d412c9a360d0c" }, { "secret_key": "2246bfb06155859e10a748ff8f5919ad5d1daab756f01057b790d07474775f4f", "public_key": "fa6349b62dc8c6a2feeef6ffc33ae085c649795c1c9d9898e75c13ae1625db34", "message": "63ee1c7bbb15cebe1c22532d481682754bdaf58b8bc997ae30a34c9d23c33f1690c346ab0a7365ff62457424b6105f8421eca0ce3c630acfeb9a1cc416390edf4920e22b2367e9fb5d2ab25bee56da03ea55e3f57882d48b89229314d734cb83c79f4e17ee64bae6f7addbe9b525fcd03a91409a2dde907751db8cc97e08d0ea89c4d18718d26d0b897b64", "signed": "2be4915a352f7785483046d8ae9625b8b63257af57c073691256ee076d6e1b972a101f551c705d3f96157c33b56ea049be4af4dc561cbe3c1ec5072d7f134e0763ee1c7bbb15cebe1c22532d481682754bdaf58b8bc997ae30a34c9d23c33f1690c346ab0a7365ff62457424b6105f8421eca0ce3c630acfeb9a1cc416390edf4920e22b2367e9fb5d2ab25bee56da03ea55e3f57882d48b89229314d734cb83c79f4e17ee64bae6f7addbe9b525fcd03a91409a2dde907751db8cc97e08d0ea89c4d18718d26d0b897b64", "signature": "2be4915a352f7785483046d8ae9625b8b63257af57c073691256ee076d6e1b972a101f551c705d3f96157c33b56ea049be4af4dc561cbe3c1ec5072d7f134e07" }, { "secret_key": "c088a3dd2cb8bd5d684db8538dc22473b6f014f64fe86af168b4bb01b90a1dd0", "public_key": "aad615a9c28759f03d373abe666691dead8b84f9b8b50a67f8f0aa4a701580d1", "message": "74906ae05a5af8e9968b6feb498569d6345a24f9711befb136e6c3b5ed49339e59a7938b4ba1a118f169b9ace0f7842a26a645f14c0ad22ebbcda93e67e4c348efc3d9ecbb1419e6262d0436a58ea82c2202389065ccf67c4f550e45b5f6a12a6c011b2e0a30101d5c62328bbf99c8c95563a6e33bdd9cce72b1f720139c2fd3e04913146ae5bac5288e0e3e", "signed": "3bb459d1ac575a180c1728d8b8924970492a0c8d2a378c29d1d41785c8379a58e2ba3606785e1c5da29e5527552bc6dc89a2b69c27fe51ed253a9f3b565b270074906ae05a5af8e9968b6feb498569d6345a24f9711befb136e6c3b5ed49339e59a7938b4ba1a118f169b9ace0f7842a26a645f14c0ad22ebbcda93e67e4c348efc3d9ecbb1419e6262d0436a58ea82c2202389065ccf67c4f550e45b5f6a12a6c011b2e0a30101d5c62328bbf99c8c95563a6e33bdd9cce72b1f720139c2fd3e04913146ae5bac5288e0e3e", "signature": "3bb459d1ac575a180c1728d8b8924970492a0c8d2a378c29d1d41785c8379a58e2ba3606785e1c5da29e5527552bc6dc89a2b69c27fe51ed253a9f3b565b2700" }, { "secret_key": "45667d1e7b5910979c4a328317968371c864d564a661c5cce557c9ecc61bab9e", "public_key": "edcdf5e1a170e00c8c687e7e9c18f9893b5fe495cd2977ceb7f446c0149aa9d3", "message": "cd66cec476c87c8dbf47ec91dac48fb5b42db1282a573e0a5cf0b91768986608e1d7ebd05f5251bcf8b47a17093229acefbd44beb21c0c0c928dd3cd3f8966ecce6910331c508ea76baf904d8c21f6c17c2c58d00afd3259b8bf794c146b12b995cddd1c4289c5be3168ebd616b384c281ce1b38a10e1807808853c681a640a009b4d2acd7934f8c6d07578161", "signed": "6de668f1ca6f292814625289a0808020c87c89ac94f5b0508e557bdf8000a5ca808f021c9679b50ee2f320064c95a464a8439379828c3b76cfa766455e128c0bcd66cec476c87c8dbf47ec91dac48fb5b42db1282a573e0a5cf0b91768986608e1d7ebd05f5251bcf8b47a17093229acefbd44beb21c0c0c928dd3cd3f8966ecce6910331c508ea76baf904d8c21f6c17c2c58d00afd3259b8bf794c146b12b995cddd1c4289c5be3168ebd616b384c281ce1b38a10e1807808853c681a640a009b4d2acd7934f8c6d07578161", "signature": "6de668f1ca6f292814625289a0808020c87c89ac94f5b0508e557bdf8000a5ca808f021c9679b50ee2f320064c95a464a8439379828c3b76cfa766455e128c0b" }, { "secret_key": "24897428ae6546d85b3190ebe3f1f7bf7c712528ac851a588b07d5c8f94eecd1", "public_key": "5f348fe3ea5b2c023d0af7ede60e55f91aa55199699da15a11c3791d68d710bd", "message": "5201d9725f1dffa1863fa4d84c301861141acdfb64be1fbfdd5b9386db20ef394099eebcfdfecc62c6268607a84d55c55cd0efdc372ecf3067343e7b0731c2685461e24b953f99949e59ba3e67ed0f0848313793962a292c459814c5e28690ec1f45171f1abab86fdd14568b00caf48581115ee5ea83b000282fbbf0c0b2a1116039a35cfa3f201422207a3d4948", "signed": "1b5e75def49f51d6b2de008c71fc1a909bd42ca813298dce4eeef717815d7a6c078c2f3d9a3fce1ab5b3ad8ef8d45cdf2eb4901c32eea2d5e018dcf2833cad0c5201d9725f1dffa1863fa4d84c301861141acdfb64be1fbfdd5b9386db20ef394099eebcfdfecc62c6268607a84d55c55cd0efdc372ecf3067343e7b0731c2685461e24b953f99949e59ba3e67ed0f0848313793962a292c459814c5e28690ec1f45171f1abab86fdd14568b00caf48581115ee5ea83b000282fbbf0c0b2a1116039a35cfa3f201422207a3d4948", "signature": "1b5e75def49f51d6b2de008c71fc1a909bd42ca813298dce4eeef717815d7a6c078c2f3d9a3fce1ab5b3ad8ef8d45cdf2eb4901c32eea2d5e018dcf2833cad0c" }, { "secret_key": "7b04aca7cf926216cb960a3890786339d0a615967680190123fda3b60c6aeb11", "public_key": "cdbc3e70e4e8fd13d0cce2852a3b9372c3a6160cd6deaba90f9b3022f70c91f9", "message": "1cb09624b1f14a0260c7f56d8c60b5fe45837114232551ef5966386e0c2b441b75cfdb8df2185785d22cf526fa9df7fd45d9d83881b66c1feee0913e238121eedbb7ab504da0bee8998016684535031991f11bfcd9b95690aad2d19bd6a9de1844ed1362302df4217230b25c0552ce277534c650cae526577f25d8b1fe9f9febca2c814670d4805b21adef852daf94", "signed": "25d2d361751d52b4fe66ea18e4b9866bde3d121a7312fd9e28a1e295e087e3176c94c874a2e81600f24c4654f43d1b67d47b64822648590ce5ce44f3b5ddc5021cb09624b1f14a0260c7f56d8c60b5fe45837114232551ef5966386e0c2b441b75cfdb8df2185785d22cf526fa9df7fd45d9d83881b66c1feee0913e238121eedbb7ab504da0bee8998016684535031991f11bfcd9b95690aad2d19bd6a9de1844ed1362302df4217230b25c0552ce277534c650cae526577f25d8b1fe9f9febca2c814670d4805b21adef852daf94", "signature": "25d2d361751d52b4fe66ea18e4b9866bde3d121a7312fd9e28a1e295e087e3176c94c874a2e81600f24c4654f43d1b67d47b64822648590ce5ce44f3b5ddc502" }, { "secret_key": "ea73bf64a1a97877c3c3e7ca4644b71aaa66314c8f1b66bafaebd5edfb888bcd", "public_key": "caac93902e5764ade47294edd51faa14620940c668b5c1c392a6928325d4c3fd", "message": "362eec68b912852786bb4f9afff9ecf7cb28c9de6b18422a8ca940b0d7e6dcb83aa44be0afb5f1806d43f0e31d71f922f853615a26e287a27f08a04fbce3d45a0c6c311d4b7cb17e425bbeb0a6b410b5d6dbb7ac11df9850a131a691e3b60b0b214ebe044106e982433287595267b031b5d4a09262ded8934fdfdf964d868ef9a2c842f804eafddefcb71d9f16a59bf8", "signed": "bd86cb9c70a055279a86a9e64870988b8a7345c3cd2948a0fabcfb38abce3c420b4d5521618e11d2de827d9de569f6bc3be66aad40636cdaa64760ded3b7c209362eec68b912852786bb4f9afff9ecf7cb28c9de6b18422a8ca940b0d7e6dcb83aa44be0afb5f1806d43f0e31d71f922f853615a26e287a27f08a04fbce3d45a0c6c311d4b7cb17e425bbeb0a6b410b5d6dbb7ac11df9850a131a691e3b60b0b214ebe044106e982433287595267b031b5d4a09262ded8934fdfdf964d868ef9a2c842f804eafddefcb71d9f16a59bf8", "signature": "bd86cb9c70a055279a86a9e64870988b8a7345c3cd2948a0fabcfb38abce3c420b4d5521618e11d2de827d9de569f6bc3be66aad40636cdaa64760ded3b7c209" }, { "secret_key": "b8123c116b33bad0dcbc2c4dc06a3d66850dab360cdb5a033c14895c4ee31bfb", "public_key": "bdca151ba32c6bb31531b05fdf86c6d78c8cd1935611d5ff111a0f00635b1885", "message": "7970f6666634548c848bb52338817b26a4d0ca68df3d28afff207c2d028067a18e4c9543025f5b0228aa691e5088513151a94494e15d1f54210328e0df159b352c30aaa7a844f18a9f4c395dcbb3fb9fcfbed1103e0706fbf9c35fe2666848fa35dc2cf5227ebee89e7d3bcfae2721b25fdec3d3174ea7ce267a55dd61d58201e96bda303cf418edf6e32fb92f5dc1a0b1", "signed": "9cf13eba3dcc37b8fc70ccb2327436b9f08855e726aa7ed82bd5cb7df45fdf9ec1f96afad193f47572d770444b65b74a37cc034fc514cb3f91b2d8ada5b020067970f6666634548c848bb52338817b26a4d0ca68df3d28afff207c2d028067a18e4c9543025f5b0228aa691e5088513151a94494e15d1f54210328e0df159b352c30aaa7a844f18a9f4c395dcbb3fb9fcfbed1103e0706fbf9c35fe2666848fa35dc2cf5227ebee89e7d3bcfae2721b25fdec3d3174ea7ce267a55dd61d58201e96bda303cf418edf6e32fb92f5dc1a0b1", "signature": "9cf13eba3dcc37b8fc70ccb2327436b9f08855e726aa7ed82bd5cb7df45fdf9ec1f96afad193f47572d770444b65b74a37cc034fc514cb3f91b2d8ada5b02006" }, { "secret_key": "b18e1d0045995ec3d010c387ccfeb984d783af8fbb0f40fa7db126d889f6dadd", "public_key": "77f48b59caeda77751ed138b0ec667ff50f8768c25d48309a8f386a2bad187fb", "message": "916c7d1d268fc0e77c1bef238432573c39be577bbea0998936add2b50a653171ce18a542b0b7f96c1691a3be6031522894a8634183eda38798a0c5d5d79fbd01dd04a8646d71873b77b221998a81922d8105f892316369d5224c9983372d2313c6b1f4556ea26ba49d46e8b561e0fc76633ac9766e68e21fba7edca93c4c7460376d7f3ac22ff372c18f613f2ae2e856af40", "signed": "6bd710a368c1249923fc7a1610747403040f0cc30815a00f9ff548a896bbda0b4eb2ca19ebcf917f0f34200a9edbad3901b64ab09cc5ef7b9bcc3c40c0ff7509916c7d1d268fc0e77c1bef238432573c39be577bbea0998936add2b50a653171ce18a542b0b7f96c1691a3be6031522894a8634183eda38798a0c5d5d79fbd01dd04a8646d71873b77b221998a81922d8105f892316369d5224c9983372d2313c6b1f4556ea26ba49d46e8b561e0fc76633ac9766e68e21fba7edca93c4c7460376d7f3ac22ff372c18f613f2ae2e856af40", "signature": "6bd710a368c1249923fc7a1610747403040f0cc30815a00f9ff548a896bbda0b4eb2ca19ebcf917f0f34200a9edbad3901b64ab09cc5ef7b9bcc3c40c0ff7509" }, { "secret_key": "93649c63910b35718e48c590d261c48e4ef8336613f6aa077b462676b3ba8829", "public_key": "06a685898b855212ebc289915d105a4320d620d85771b8c6b15bf10a1be6e9b8", "message": "2cd1a951056c9ebae1399b6bd2d82c0ae277856290d06920ac56cac8fb42435101c72aa9c08dd2d12426325562c2f0a49cd821b11b939aafa593b4095c021bcb4827b107b9664d68282888bc4a44af3e3bdc861be6af309044c3daab57b77023dc902d47ebc326f9bdd02dbc02cd540ff81b2ddf7cf679a41193dfe5f8c8ca1aaefc41ef740280d9823e30a354717c8431f5d8", "signed": "6274f2d4f431d5affefa35e7cf584a599017193da99094ca908b75acb608d1bf981857be93a7dafb0fadb3ff0906f48a5ee950456f782c2d605b14095ba0ff0f2cd1a951056c9ebae1399b6bd2d82c0ae277856290d06920ac56cac8fb42435101c72aa9c08dd2d12426325562c2f0a49cd821b11b939aafa593b4095c021bcb4827b107b9664d68282888bc4a44af3e3bdc861be6af309044c3daab57b77023dc902d47ebc326f9bdd02dbc02cd540ff81b2ddf7cf679a41193dfe5f8c8ca1aaefc41ef740280d9823e30a354717c8431f5d8", "signature": "6274f2d4f431d5affefa35e7cf584a599017193da99094ca908b75acb608d1bf981857be93a7dafb0fadb3ff0906f48a5ee950456f782c2d605b14095ba0ff0f" }, { "secret_key": "1c15cbeb89362d69476a2aa4a5f3ef2089cf87286349e0dfe0e72d9e3e5a66c7", "public_key": "13a882a1064182582c211847e19b4dac59722c9ffd34826d96f33113400fac7a", "message": "091c9b9b116ae83d23d01a6295211785d446b6228dd687ddf79bd0d5a4daa8c79d2cbfc37365f1f285e361738123e34e2bcbfc664ce1253a11d9e4a7982e58cf9468e1017ea14d2cc6d0865d40fde8cb560241e96ac1617c791f0ca7c6410cadf328611b18aef333d8350ac497f0a4ae2d03fdf0e23e426d34f4514780d1474e113583541f3c043672057172618cb2059eaaed56", "signed": "5998b2808adfdeeaebe2c3eac026d3f825f9c7f2af97ca324fbd57aac1bedff78a8ee621d037ee3ad2a712e9a009c58ea3e6f2a828f74b86da275a44a4b1e50b091c9b9b116ae83d23d01a6295211785d446b6228dd687ddf79bd0d5a4daa8c79d2cbfc37365f1f285e361738123e34e2bcbfc664ce1253a11d9e4a7982e58cf9468e1017ea14d2cc6d0865d40fde8cb560241e96ac1617c791f0ca7c6410cadf328611b18aef333d8350ac497f0a4ae2d03fdf0e23e426d34f4514780d1474e113583541f3c043672057172618cb2059eaaed56", "signature": "5998b2808adfdeeaebe2c3eac026d3f825f9c7f2af97ca324fbd57aac1bedff78a8ee621d037ee3ad2a712e9a009c58ea3e6f2a828f74b86da275a44a4b1e50b" }, { "secret_key": "11241ffdf34ae8ab875475e94c6cc3291f0b8820dc85e20f32fc53b24ae68978", "public_key": "09c045e4bd5137314c0ec1d031faf914910c45a4676f5a3cd8f581bcccb03c97", "message": "3b89deccb7023e4b2b7aff2c3951870af413a9b04dd86ac78b7c8fd887492d8dde49d8fda149edd54781ae2b508030d14416a9a38bed2b9aebbbb20250b3c931acd4e32fbeeec5a26501beab7268d144fce8951a101c4b5178166fbb5927b1dfb1e1ce90d1d123068e3f472c888fdb01fdf70e7f8de9b0adb284b7119f55354316f84ed090030f9c2662061ca48447cc0aef964126", "signed": "72ce9f91be2e66cfc90f952595946ffc90bfce53087d49e5dd7c087f3faa8f18f2356de971e4429d985a99194b4f92ced3ef47cd7114379e0b3267a9f8b1e7063b89deccb7023e4b2b7aff2c3951870af413a9b04dd86ac78b7c8fd887492d8dde49d8fda149edd54781ae2b508030d14416a9a38bed2b9aebbbb20250b3c931acd4e32fbeeec5a26501beab7268d144fce8951a101c4b5178166fbb5927b1dfb1e1ce90d1d123068e3f472c888fdb01fdf70e7f8de9b0adb284b7119f55354316f84ed090030f9c2662061ca48447cc0aef964126", "signature": "72ce9f91be2e66cfc90f952595946ffc90bfce53087d49e5dd7c087f3faa8f18f2356de971e4429d985a99194b4f92ced3ef47cd7114379e0b3267a9f8b1e706" }, { "secret_key": "3bdb162465eaceff98d69c86f70039c517d168aefe6bb101b4f769a86b17c972", "public_key": "d76cb7be74328289fd1c64be747cca5bb30295dfaccd0f2e43f51703fd5d3683", "message": "fbf368feaeba87918b1b8c7b8a26832be6e7fc1cbdb8902519281a0654ec73de0bb07101a9d603f745d4ec2357aee9870cb19a56cb44fbd9c91fc34752612fbd83d6fc1a16bf8a85a215d0148e4af37d298467e5cc486b131352ce092182ce8284159a3812b30bacbff595863811bf9a30a9da494565c3ac1814430018ea0eeed39cdbca27f93140e46949db570bfa2ed4f4073f8833", "signed": "6f1362a402063791f950984f544928e616a4ef79bbeb6854e9615aab9cdbaec483fb9a04bf22de5d97a15bda2d390483c7f61dbee07bb5141fc173b1aa47650dfbf368feaeba87918b1b8c7b8a26832be6e7fc1cbdb8902519281a0654ec73de0bb07101a9d603f745d4ec2357aee9870cb19a56cb44fbd9c91fc34752612fbd83d6fc1a16bf8a85a215d0148e4af37d298467e5cc486b131352ce092182ce8284159a3812b30bacbff595863811bf9a30a9da494565c3ac1814430018ea0eeed39cdbca27f93140e46949db570bfa2ed4f4073f8833", "signature": "6f1362a402063791f950984f544928e616a4ef79bbeb6854e9615aab9cdbaec483fb9a04bf22de5d97a15bda2d390483c7f61dbee07bb5141fc173b1aa47650d" }, { "secret_key": "d5efe51d5cd8e108bd922fc0ea126190a94628ffa53c433a518022792ddc78ef", "public_key": "426b01cc61ff5e0e724da1d3b297f5325c18c62f64d5eb48d4a5216a8e9a4073", "message": "9d17bcfe2dfc742f411cb53a94f359c001abf096c741f34af48679f281e7ce6bbd9e87709fc0728a563db2b9cf8ea4fbdcc344c1848e653ce970c6ce29de2ccd520300649adcddfc753971f846aac1ba42ae4528952d94980aa7c6cfa2142907647f894ae974a74d59035a73ef56a10b6612624809520190ace661c3a47095e0322efd781d50d1163598f2da32f31bc9c4f913d1b14861", "signed": "2306f58fcd4cff2222d81b05a475532b8b19dc67e6d78ddb4205a3b7621cc5aef0b393d5d24dd96c88ccbc53a3208da323be4587d5ec067c820f0723aa44e90e9d17bcfe2dfc742f411cb53a94f359c001abf096c741f34af48679f281e7ce6bbd9e87709fc0728a563db2b9cf8ea4fbdcc344c1848e653ce970c6ce29de2ccd520300649adcddfc753971f846aac1ba42ae4528952d94980aa7c6cfa2142907647f894ae974a74d59035a73ef56a10b6612624809520190ace661c3a47095e0322efd781d50d1163598f2da32f31bc9c4f913d1b14861", "signature": "2306f58fcd4cff2222d81b05a475532b8b19dc67e6d78ddb4205a3b7621cc5aef0b393d5d24dd96c88ccbc53a3208da323be4587d5ec067c820f0723aa44e90e" }, { "secret_key": "18af89025ebfa76bd557cfb2dff148245214641fd5bda159f73da04b08e87c88", "public_key": "0c584459b9ebcccad587b272160bc60b27f4f772b4321de7723afef577edc7b4", "message": "e82f46652ab914af535d8fb720b557ac95018d9f2a3fcce85771bb40ab14cb9a986e096f3afe5bee829dfd8b97335c536ac971a21655af16a2f8fdba183a4e18564c21492956537a419abbbbb02a4bbdc01481f5c6e658ecf3c34f011ad846f5edcd4939195df85e41303fb9a88fdfbd704396f7559a327318b952b3e60ce8ddde56378579232faf950c78e7f0b17c3b8dece36b788a8473", "signed": "26bb0882297c2c08a752d3981145dcde55893a11df77f8aa4c19d0b9ed6e5220ed12e9fac3af13d0f0c71568f4a547d30114a6599a236806c4beee6765284408e82f46652ab914af535d8fb720b557ac95018d9f2a3fcce85771bb40ab14cb9a986e096f3afe5bee829dfd8b97335c536ac971a21655af16a2f8fdba183a4e18564c21492956537a419abbbbb02a4bbdc01481f5c6e658ecf3c34f011ad846f5edcd4939195df85e41303fb9a88fdfbd704396f7559a327318b952b3e60ce8ddde56378579232faf950c78e7f0b17c3b8dece36b788a8473", "signature": "26bb0882297c2c08a752d3981145dcde55893a11df77f8aa4c19d0b9ed6e5220ed12e9fac3af13d0f0c71568f4a547d30114a6599a236806c4beee6765284408" }, { "secret_key": "0c93d99815fff8fe22b9e45aa02b3e6445ce1d6bf5a65dce3da107aa1055940e", "public_key": "4d27a47b0fc80800d84d244eebb1deb4436d97633a83e67125ad52ea01685057", "message": "11e877de58c134eaf4c9f1b53c3dc451d3c055f16b09622725b279768512fe10a7adb0765b689ec21d5b6efaa19f1b9d36254df0a9367f441b26bdb90b28cbc403e5074082fa1fed58e140dac97aeaf483e2c13f3cc560abffaba05b763feedb51e60698151cf56efdf1d37d6ce0564486210f052e937f2ea26f63efa5d247ff188329bb1aa83ce3f4f35a3d7dec14599e5feb7b6d5fe4296a", "signed": "7dc4467abcf6431adb7ccfe868eac8cd8a615a0ff65f6a9e338375b1aae3c49a126c9eba79426d1641c6b97c3e92c194e5ee4431efa2439fd450f2cd018c870011e877de58c134eaf4c9f1b53c3dc451d3c055f16b09622725b279768512fe10a7adb0765b689ec21d5b6efaa19f1b9d36254df0a9367f441b26bdb90b28cbc403e5074082fa1fed58e140dac97aeaf483e2c13f3cc560abffaba05b763feedb51e60698151cf56efdf1d37d6ce0564486210f052e937f2ea26f63efa5d247ff188329bb1aa83ce3f4f35a3d7dec14599e5feb7b6d5fe4296a", "signature": "7dc4467abcf6431adb7ccfe868eac8cd8a615a0ff65f6a9e338375b1aae3c49a126c9eba79426d1641c6b97c3e92c194e5ee4431efa2439fd450f2cd018c8700" }, { "secret_key": "989e99945635192c023cc5186fc25bbaef47240775d15a56195d88cd07c3748e", "public_key": "ca0beafdf731d89301f7723c5bb7e5a1c3ff3eab27c97d711bcd76e42054bee4", "message": "c48414f5c757d03c523ef3f3b8510771b0ff3b4b97de279625d349ec185a29927a66b9593ba19338c2f5e4131f1ac07ea46d2c1b6e4ab5229280b2e2bb9d140d1ef7af7b1692bf2d097b80f811adcfa95d5cbf9eee92a1641c552b4be4a0d734f0afd470b9d7f4e45778951e21fc534f200a128b96adb8373f10cecec2dac2996a062fb3c294315965a9d5d7b077c4b013c64a38429769d23eab", "signed": "aef756bfb8a7266e17d15f3f11ee50ed25be420e95a0742271ebd12294e2cb96ead083b8ff0b829d2edeb14da86e402ef25e6d4a5a7958c184ed10c176cb570bc48414f5c757d03c523ef3f3b8510771b0ff3b4b97de279625d349ec185a29927a66b9593ba19338c2f5e4131f1ac07ea46d2c1b6e4ab5229280b2e2bb9d140d1ef7af7b1692bf2d097b80f811adcfa95d5cbf9eee92a1641c552b4be4a0d734f0afd470b9d7f4e45778951e21fc534f200a128b96adb8373f10cecec2dac2996a062fb3c294315965a9d5d7b077c4b013c64a38429769d23eab", "signature": "aef756bfb8a7266e17d15f3f11ee50ed25be420e95a0742271ebd12294e2cb96ead083b8ff0b829d2edeb14da86e402ef25e6d4a5a7958c184ed10c176cb570b" }, { "secret_key": "6bdbbe06d9f4219eea6403a357b25e561992fae0f0f614561dd86d23de415a43", "public_key": "ed52dd1cce32d9b485e0940746421d36b9fde6cdf0211545b634044d4b3cb8f1", "message": "582ada13d69293e49bbd461032dfea1ca2025b52e013a33a0387fcfc5f7c0b8ec955982607fc901e1b7f636a9d371e1f91fe476bdd44856e275d67efa14238164354c231124c84de8f5b89d5a58ea6744b4d3b3d7906905233cce694a64d696f5a7024fc9033b1ce390899a3b441a48e53c7c9b30ba12e7d61f35f15e658c7cc4407e2f689ea8a55d01bf5dbacb11954754f920f09dbd48409bbb5", "signed": "950206605b0f417c90843e2c8d8e66c828bb10b99b36eeeee8caf2e0e5484d93fe02bf533405f4bb74a50e5585fa0daef4821f0301d01b46321baa31e1f08d03582ada13d69293e49bbd461032dfea1ca2025b52e013a33a0387fcfc5f7c0b8ec955982607fc901e1b7f636a9d371e1f91fe476bdd44856e275d67efa14238164354c231124c84de8f5b89d5a58ea6744b4d3b3d7906905233cce694a64d696f5a7024fc9033b1ce390899a3b441a48e53c7c9b30ba12e7d61f35f15e658c7cc4407e2f689ea8a55d01bf5dbacb11954754f920f09dbd48409bbb5", "signature": "950206605b0f417c90843e2c8d8e66c828bb10b99b36eeeee8caf2e0e5484d93fe02bf533405f4bb74a50e5585fa0daef4821f0301d01b46321baa31e1f08d03" }, { "secret_key": "d761c8c5a9601b9145b7d051249b004107e452e563100c6c788038c9ee8adad7", "public_key": "e6488775d6407efc7b2bca890a7fc62266fc54cdac893343b4f59a196d948898", "message": "84ead5eabd2fd4b7c79a9a928ab8ee0a16a5fd667a057f8a254663d56daae156d1a49affb2996137b9d8b340e635732f9d2b4c60218442541e72d2b00e1ee7a73c3f67caa499fa9d070b57d076dcde96b0764723c3c659c7a00c1b78b15ccc2223890b51067fc81e23e9458ab0683ba626a53d0c3793a58a9857bb44b3bd85bb6ce53a85694e7f53cc1bd46d50eda37d81f5381b513d1f38339d291b", "signed": "7ab78b64e6db359a2dc8302e1092ed66fa736b536253a1cd90fdb8c10efd78300225e191963599ba549cc859209df0ff61cd069b03d254e6e7d76c798440f90784ead5eabd2fd4b7c79a9a928ab8ee0a16a5fd667a057f8a254663d56daae156d1a49affb2996137b9d8b340e635732f9d2b4c60218442541e72d2b00e1ee7a73c3f67caa499fa9d070b57d076dcde96b0764723c3c659c7a00c1b78b15ccc2223890b51067fc81e23e9458ab0683ba626a53d0c3793a58a9857bb44b3bd85bb6ce53a85694e7f53cc1bd46d50eda37d81f5381b513d1f38339d291b", "signature": "7ab78b64e6db359a2dc8302e1092ed66fa736b536253a1cd90fdb8c10efd78300225e191963599ba549cc859209df0ff61cd069b03d254e6e7d76c798440f907" }, { "secret_key": "c5e0c7a7bb8b7ca07bf0a05ea67eff6deebfe3714ee3e1a227f4dc8e242a2fa0", "public_key": "5135efcd9052bec57a4431caabe82680eec0a33afd59b30203b280ba12be485c", "message": "3770a6786652c4b78a043edce07f3e204d81997c42afc22331f75a5494a826d7cb69ab4314a473721058a1839981d5b7022d0cd8670377daf3320476d25b9f559561d66ee0a709fe17361e2a52898f5753c4fb43bd0c98b368f512adc09cd927c6622676926d8c2d91a14aca32f226f70036c1c858bcffc2b59f54c1c37bf81eb52ecb3f00da602c94361b52a5afddbfd7e05036e377503050333be512", "signed": "2e7fdeb3484d0a5e8dce94448979496b0642cabc3733a51f8c3c5c51c19ae319018da91091c2385f2f4e9a59edbca2abd0d085ee40d3f0d42061a5a9832a370c3770a6786652c4b78a043edce07f3e204d81997c42afc22331f75a5494a826d7cb69ab4314a473721058a1839981d5b7022d0cd8670377daf3320476d25b9f559561d66ee0a709fe17361e2a52898f5753c4fb43bd0c98b368f512adc09cd927c6622676926d8c2d91a14aca32f226f70036c1c858bcffc2b59f54c1c37bf81eb52ecb3f00da602c94361b52a5afddbfd7e05036e377503050333be512", "signature": "2e7fdeb3484d0a5e8dce94448979496b0642cabc3733a51f8c3c5c51c19ae319018da91091c2385f2f4e9a59edbca2abd0d085ee40d3f0d42061a5a9832a370c" }, { "secret_key": "11bb4748d2547e6196be823c9be7aa18150c204b12ca8d73c1bd46b11a54b475", "public_key": "efeb42da28d764966403dd300d9f9451b258ab1c80df06fe5943153f5301cccb", "message": "f4b765b258ba35b427525c7f10a46f0bccd357ec1ad52a5b139417a9d3894c512d89eb88e681b1f30aac4c115ccf36545e83f37834c82e8300cc1eb289af4375968c29c0ffefb40e156c20c0432669ac8dc0a83c13b1e855a84ad0133c40c82c87ee1e7dd4084d741c80de8a7a9f7759e843a562099c4d7df875352039ff4d3824651386c97759ff7dba52064e6d3112e080819aee8ce723a1a2aa464d8a", "signed": "44c58da49d2365d27029d1eebb3bebf7c032d858aa07e0756b1c26a5412d22691176031341ad37d7bb7843289eb39db491584c1b2a1da2e4a2649c2293826606f4b765b258ba35b427525c7f10a46f0bccd357ec1ad52a5b139417a9d3894c512d89eb88e681b1f30aac4c115ccf36545e83f37834c82e8300cc1eb289af4375968c29c0ffefb40e156c20c0432669ac8dc0a83c13b1e855a84ad0133c40c82c87ee1e7dd4084d741c80de8a7a9f7759e843a562099c4d7df875352039ff4d3824651386c97759ff7dba52064e6d3112e080819aee8ce723a1a2aa464d8a", "signature": "44c58da49d2365d27029d1eebb3bebf7c032d858aa07e0756b1c26a5412d22691176031341ad37d7bb7843289eb39db491584c1b2a1da2e4a2649c2293826606" }, { "secret_key": "7452a00156d794edebff4adb1f7a7eec26217fef67c3d268352b2b5460a7dc25", "public_key": "5f4dc338cfbd384b5f1c14c226701446b52b1e3e2a3cba1a40ee2825080d1de6", "message": "8c4ee2867656e33f5269414d77b42d8e4750dba93c418bacca10938cc3b570c6603d52c2344488607b2f934f6d269fcb2ad966219b1ab11472f42c672ce20592490ec5baf6a2d2fc8a3ee35374b1902fdefc7870b1b626fa46b12b6cee241f601a9b3fe4c50812e573e6752ce2c7644e3367a6a6b77758d8e4934b58af23abae8fecac25edd734030ee7cf39907e3eed8186a19a807103a9fc49d38f4c8460", "signed": "a8f9fa24a3dea1022e73f0d88b1c37d06d0f0b20bbff0ecdb4a40c86d7e475617c03570a7419d74ba0f1327096bf19f0d0cf9f51d483112f26922378682f48078c4ee2867656e33f5269414d77b42d8e4750dba93c418bacca10938cc3b570c6603d52c2344488607b2f934f6d269fcb2ad966219b1ab11472f42c672ce20592490ec5baf6a2d2fc8a3ee35374b1902fdefc7870b1b626fa46b12b6cee241f601a9b3fe4c50812e573e6752ce2c7644e3367a6a6b77758d8e4934b58af23abae8fecac25edd734030ee7cf39907e3eed8186a19a807103a9fc49d38f4c8460", "signature": "a8f9fa24a3dea1022e73f0d88b1c37d06d0f0b20bbff0ecdb4a40c86d7e475617c03570a7419d74ba0f1327096bf19f0d0cf9f51d483112f26922378682f4807" }, { "secret_key": "880ef106733f04e76195eba280b3fadda0f25dcf96a6a99c8ccf842c68afdae5", "public_key": "70cee33d41c728ce7b141931e6e8524567d7601eb79f67fdcd07b9d682c650f0", "message": "f4f38d077f2b03da821bd36fde673d666e52f4832e1c0dcfeef049328acb7bd71ad2bfc49c123516e196c470df0847b3848a45a2c69bea03e2afa7e58205b63b523814fc8e242f059c69ff7e40f97be8125b70a54fdaf35aeafac79114a7b419e6bb9e70bf07adb559819600dc25e51b4b700d27ca5472a0e7cbbfd14e099faa3a72002da538cbe45d621ef0d5252ba29d83f8b3ec8389c9ceb6c6b2e8d8a20f", "signed": "ff6caedd8a468aa07d4c6e7131bbda76182ba958649376e711f44c7bbacba6077bea878ba5949cdeeef05cfd4983b0057d275ea3e18c32659468c30c47ac8f0bf4f38d077f2b03da821bd36fde673d666e52f4832e1c0dcfeef049328acb7bd71ad2bfc49c123516e196c470df0847b3848a45a2c69bea03e2afa7e58205b63b523814fc8e242f059c69ff7e40f97be8125b70a54fdaf35aeafac79114a7b419e6bb9e70bf07adb559819600dc25e51b4b700d27ca5472a0e7cbbfd14e099faa3a72002da538cbe45d621ef0d5252ba29d83f8b3ec8389c9ceb6c6b2e8d8a20f", "signature": "ff6caedd8a468aa07d4c6e7131bbda76182ba958649376e711f44c7bbacba6077bea878ba5949cdeeef05cfd4983b0057d275ea3e18c32659468c30c47ac8f0b" }, { "secret_key": "a2d88f37ecc2b2c05dd6cb3159962c5f646a9815b2fb37791fc7b606e2913ed5", "public_key": "58dd67d7a15d4ca0341a4c869566cad8c4ee16e583a10b4824173b08290d92d1", "message": "d1b87e9e886dfbbdc8ca8ab9010ecf9bbaf23f72ab3cbe769db1d43c2a474a81651c464e9fb92734634641c9485a0239b3110771e7f75e05252e4d8f4c0aa1ba08626d7e96317c20acde2ad99b23bdadfd6f17468eb402ec5eefa57b47caf972b3dd21d89f0e2989ff87d51ed2e2d639c1644e698cbe0221b8e179f3cfb04a20cb2470216a6882fb4ff799e11536cf64219f0c075176bc7cf0f6c5b7925fcd6155", "signed": "ccf2400cd673e1effd20161d7b68a5fb87c1e99d3635d78c2da1b509fac33346c069163a6c46c7826a48bbbd03b05e6e2351fa62bf89bf7ccf9a9024bd157d07d1b87e9e886dfbbdc8ca8ab9010ecf9bbaf23f72ab3cbe769db1d43c2a474a81651c464e9fb92734634641c9485a0239b3110771e7f75e05252e4d8f4c0aa1ba08626d7e96317c20acde2ad99b23bdadfd6f17468eb402ec5eefa57b47caf972b3dd21d89f0e2989ff87d51ed2e2d639c1644e698cbe0221b8e179f3cfb04a20cb2470216a6882fb4ff799e11536cf64219f0c075176bc7cf0f6c5b7925fcd6155", "signature": "ccf2400cd673e1effd20161d7b68a5fb87c1e99d3635d78c2da1b509fac33346c069163a6c46c7826a48bbbd03b05e6e2351fa62bf89bf7ccf9a9024bd157d07" }, { "secret_key": "42aafd0ae26df1e7aa0276860d752783af97280439bb23eae46e3f84caac78de", "public_key": "daa2350adb55dba9df7d7af5101998fe515d311c3cba3eeab9138233190c3b4e", "message": "72131b80ad599b6f5ff698547d16e7499d71275e4e9b30526a5aac0b0c8b14fa4a540cfb1145fc004418bcd318c1a70e6269a3fb69baed86f363f5b8f97f569c20d4f4990e7bb4d0c39921268d636ed0554bd62acfcacd3b8e030217aafac3044c037e0f94da18c6b9a0932c3c5875d3a93fbdadcf67964eec9ec2be69b48f020f6c9874de5f8a5167b5ee024a2c2efd0cdcd2acd8c1f787814141e30b38b163175b", "signed": "116143650b6c133d617859db2429c2913579790b2197d7b7b1b4962b328721032ceeca58b2d56439e233bb84dc525e284ff8df2bde1db4986fafd21b3d7d6a0a72131b80ad599b6f5ff698547d16e7499d71275e4e9b30526a5aac0b0c8b14fa4a540cfb1145fc004418bcd318c1a70e6269a3fb69baed86f363f5b8f97f569c20d4f4990e7bb4d0c39921268d636ed0554bd62acfcacd3b8e030217aafac3044c037e0f94da18c6b9a0932c3c5875d3a93fbdadcf67964eec9ec2be69b48f020f6c9874de5f8a5167b5ee024a2c2efd0cdcd2acd8c1f787814141e30b38b163175b", "signature": "116143650b6c133d617859db2429c2913579790b2197d7b7b1b4962b328721032ceeca58b2d56439e233bb84dc525e284ff8df2bde1db4986fafd21b3d7d6a0a" }, { "secret_key": "b69c33b11ba67841c3d4e6f9234e35370a28b47662ac560b27c078b66ab1b021", "public_key": "9df68e9acf67379261744db5d1e377892f2b692ed5a38b37073c04de5d226737", "message": "f9ea126d3ab21961aa2433900a3982b83e0ef86d52d13440afa4817f9b822fb582cc3932bf450d4677c9188181fe7526ad6fe5abc61d0ae759f215013c0b2b41064cb6278ba7e39e2f4c10d6cc9605b3869e169d7da42e88eb857870fe6118bb02bc08c8055f0c189b62f79fb146b4c543aa30cc0cd57f037e9ef7a63711f66e6f2878931702202702614277d513f0850b758549336b30cf40ab8bd460e60e12deed04", "signed": "24368fee5bd848b4c661a3be4f310cfc436e79ec4a78501b81095fe51614231b6ca1ab1269996ad2e98e299781af8e29804b24fe5679ca3ba650c5c4cc58ce01f9ea126d3ab21961aa2433900a3982b83e0ef86d52d13440afa4817f9b822fb582cc3932bf450d4677c9188181fe7526ad6fe5abc61d0ae759f215013c0b2b41064cb6278ba7e39e2f4c10d6cc9605b3869e169d7da42e88eb857870fe6118bb02bc08c8055f0c189b62f79fb146b4c543aa30cc0cd57f037e9ef7a63711f66e6f2878931702202702614277d513f0850b758549336b30cf40ab8bd460e60e12deed04", "signature": "24368fee5bd848b4c661a3be4f310cfc436e79ec4a78501b81095fe51614231b6ca1ab1269996ad2e98e299781af8e29804b24fe5679ca3ba650c5c4cc58ce01" }, { "secret_key": "7b63613f6dae01cdcd5e6b37686971cd8d8a99542f6329a12854a9d8ff8105ac", "public_key": "72ec43faf34d8730177d1f0743c74c20bf72c2394b8a7d471ffe2a04ab00811c", "message": "1816488f1fc83e1ed5911637dd42ba2077657dfe1ae422ad0aee59df9dd56a2763c2dd0ef61a12bb825b0dac1eda5fbb691c5ed58f3fb325050b4563a4042099982fffa5d6ed742d95823da8e1787cf746ef63b3fbb0e88a6c0beae4f7318366936b4917f507336068b194680900a7bf4a6fb69a5c387b97e31bc7f9be53c2a89e3651ce1de41b10e921b206ebf32e5621ef8081616dcd7a2059437efad014bb8e2c8221", "signed": "76f50b2b9c2ad97bfb9499ee41928ac072da5e8bc71d0212550942332b62e70c8bfe1c722542394688decd917aec8f95353e1d72624b70ebed5d17f6c54977021816488f1fc83e1ed5911637dd42ba2077657dfe1ae422ad0aee59df9dd56a2763c2dd0ef61a12bb825b0dac1eda5fbb691c5ed58f3fb325050b4563a4042099982fffa5d6ed742d95823da8e1787cf746ef63b3fbb0e88a6c0beae4f7318366936b4917f507336068b194680900a7bf4a6fb69a5c387b97e31bc7f9be53c2a89e3651ce1de41b10e921b206ebf32e5621ef8081616dcd7a2059437efad014bb8e2c8221", "signature": "76f50b2b9c2ad97bfb9499ee41928ac072da5e8bc71d0212550942332b62e70c8bfe1c722542394688decd917aec8f95353e1d72624b70ebed5d17f6c5497702" }, { "secret_key": "3558d3a74395bdcba560e2c45a91960cec6cb3edbcd30e722f7f055210f37b51", "public_key": "534f43eba403a84f25967c152d93a0175ec8293e6f4375319eadf957401fbbd2", "message": "be75444f9ce6be1d83af622a8c478d510127db56f1de6eb8a5126522b09fdc6ca0862cec0b8b2aafa31c17a2cc477da533d276a1ae4f8e0759d6afa0b17411b5170b52f20547c72f3e88d48cb456fe625b62feb0f81317edf1ec09ece534b9f500d4e1b1bda2db21982aa95094226ee9f5b0a65da83f91121c96b3b4010ae7826c9e80636cba00f70c3c8a279b01b95294cb850f91709f4376662a580b15ac2981afe9f854", "signed": "b365b5561a13a54517cf90d88b35eb0967d6d58414b8c1547e693159e01378563654c50fb42323f09dd78ffe28056ddfa54febf44891e8a741b6a1687d728605be75444f9ce6be1d83af622a8c478d510127db56f1de6eb8a5126522b09fdc6ca0862cec0b8b2aafa31c17a2cc477da533d276a1ae4f8e0759d6afa0b17411b5170b52f20547c72f3e88d48cb456fe625b62feb0f81317edf1ec09ece534b9f500d4e1b1bda2db21982aa95094226ee9f5b0a65da83f91121c96b3b4010ae7826c9e80636cba00f70c3c8a279b01b95294cb850f91709f4376662a580b15ac2981afe9f854", "signature": "b365b5561a13a54517cf90d88b35eb0967d6d58414b8c1547e693159e01378563654c50fb42323f09dd78ffe28056ddfa54febf44891e8a741b6a1687d728605" }, { "secret_key": "a35b92f244063a19bb5e3ed4d699ed2069607116d2bd08113f0d8373613f35b7", "public_key": "7ec93601864ee4995a4f7abcd3dfc101e9e7f369e63de1ae68a07aa7f075b329", "message": "65cd36dae0168d69974f95f09dd9a59db799f911e1a15b85a00893b8c9a3d48a2f58ac126bfaa0a606c05d94701d273abf7d68817f2c71b1c541795c4f6095e26c9dff803f032f75663fd1698edd97ff3a0e72e1b7c9948b08bacb5f7de502b2fea67ca2fef190d60eae92d15158da444a49d2e9d5a573e8e177e8bbf7e6c49f907136e71d2a66cb07636d48768ff417c8beccf4323181fefb3124e434049ea45dd5019e40b4", "signed": "a23dbe3757e478dbc84d3db3a933b0428cedb6b01b86d8d73f3959878dae6f0588f505cd4d39f2ab4677b64805d629652a22529825c3a91d043749fc71f0370665cd36dae0168d69974f95f09dd9a59db799f911e1a15b85a00893b8c9a3d48a2f58ac126bfaa0a606c05d94701d273abf7d68817f2c71b1c541795c4f6095e26c9dff803f032f75663fd1698edd97ff3a0e72e1b7c9948b08bacb5f7de502b2fea67ca2fef190d60eae92d15158da444a49d2e9d5a573e8e177e8bbf7e6c49f907136e71d2a66cb07636d48768ff417c8beccf4323181fefb3124e434049ea45dd5019e40b4", "signature": "a23dbe3757e478dbc84d3db3a933b0428cedb6b01b86d8d73f3959878dae6f0588f505cd4d39f2ab4677b64805d629652a22529825c3a91d043749fc71f03706" }, { "secret_key": "72d4a564ca15499b5e4e75d8ac0f28217d32114a0c649a7c8eaadd0cc78c520b", "public_key": "c766bd73837c4faa5215502f1efc90c003f711bbef55170091028a34493408a9", "message": "6c7e7b62eb244a45d78436e2970dcd6c0f7db82297a86140ea58dd22c2195adbc956d4c4ec05354b21efe24cfcfe10e17622368848180d2c4680cc215e8ceea6cce222161f1e092239253b9746f7887df2425ab5a880bdba98153be786dc838cbeca016b1d06524bd6bfba809a8bb37adab15d42415f86ec0358365ea87b8150b05441d9d49846871485caae6de359736c27189736d8f1765f3e5c5f6b92168396390bee94cfbd", "signed": "8fc4f179330b642dd86ca9362651b83b006d8375ccef811d3c6706f91594651df2769953723046ccb9bfe66a667e0d11fc3ea2d8226234fdd5164765260f7b056c7e7b62eb244a45d78436e2970dcd6c0f7db82297a86140ea58dd22c2195adbc956d4c4ec05354b21efe24cfcfe10e17622368848180d2c4680cc215e8ceea6cce222161f1e092239253b9746f7887df2425ab5a880bdba98153be786dc838cbeca016b1d06524bd6bfba809a8bb37adab15d42415f86ec0358365ea87b8150b05441d9d49846871485caae6de359736c27189736d8f1765f3e5c5f6b92168396390bee94cfbd", "signature": "8fc4f179330b642dd86ca9362651b83b006d8375ccef811d3c6706f91594651df2769953723046ccb9bfe66a667e0d11fc3ea2d8226234fdd5164765260f7b05" }, { "secret_key": "2e5aaab298e66c2dc1d77ea7421ff895255f9d900db0450d63f9f79c1a7013cf", "public_key": "0381f3f19045719b9e8ceb562f0e965dc07b09f371a963a281c749c2532f654a", "message": "3df0e54c711e3132d7ae953deb7b66869ee531ee40b63ce693206cdb2f4bda0a2569e913ac3e6532c5d9648efd4627780fb8a31d107e033f054d19ed8b7c49dc407d2e949de25f99307221d35843f6d5eb7de5cdf41b91dbbf34cb6c9c530021014b56abc44ac2300313615608a7b4a235e99c14cef8050887032209488b9eaeaa82c09405fc75bec94dd42d6ff1b599a63ee5742f3364093ac92cabab3035822aa867ae56dcc99d", "signed": "7c7430305b361a9e35b2780c4d4408071b2130931d39830ec8d313aafbc83a65dae19cb747d9d1c4ce3f359cc824ea8c92f66a42b8614e7848b884ac8aa4ae023df0e54c711e3132d7ae953deb7b66869ee531ee40b63ce693206cdb2f4bda0a2569e913ac3e6532c5d9648efd4627780fb8a31d107e033f054d19ed8b7c49dc407d2e949de25f99307221d35843f6d5eb7de5cdf41b91dbbf34cb6c9c530021014b56abc44ac2300313615608a7b4a235e99c14cef8050887032209488b9eaeaa82c09405fc75bec94dd42d6ff1b599a63ee5742f3364093ac92cabab3035822aa867ae56dcc99d", "signature": "7c7430305b361a9e35b2780c4d4408071b2130931d39830ec8d313aafbc83a65dae19cb747d9d1c4ce3f359cc824ea8c92f66a42b8614e7848b884ac8aa4ae02" }, { "secret_key": "b636a02448003543db864b40b5d8d6dd9ad611624c9b0fc6890c51ea5592c790", "public_key": "1ef360495968e56e6d3fe740b1c84c4e4490ed682deb4305afd596efb280223b", "message": "4aa85aac25034f614ed44f7adcdbeeec25fcc2a9eea32ab6a8699506f7a1cad3bc892e9dce934e75b0a8cd14642b778599286cfd8f50a9e4f2edf9f9d6291a2e2979cf1806b93ed8c9a78fae199b2854a03ec406ab3f720835ee263fbbc91cb4ef0758d775fc784c7d5b251ac8937919a9e67be88c9e44cf2ec7f560269aa0f1113d91b84401db15a3c48c7dacff4939ee01babb982fb95625c6c3ad78749060551bfde8cce4fb8a29", "signed": "d4ba80300d5cb51353c03f28c44fd0a424ffe1e40d78ed7bb1133e8fe4e187505293b20a391da962c6a8ac0acec9c67226af3b6195dabe39b3662294da3e0e094aa85aac25034f614ed44f7adcdbeeec25fcc2a9eea32ab6a8699506f7a1cad3bc892e9dce934e75b0a8cd14642b778599286cfd8f50a9e4f2edf9f9d6291a2e2979cf1806b93ed8c9a78fae199b2854a03ec406ab3f720835ee263fbbc91cb4ef0758d775fc784c7d5b251ac8937919a9e67be88c9e44cf2ec7f560269aa0f1113d91b84401db15a3c48c7dacff4939ee01babb982fb95625c6c3ad78749060551bfde8cce4fb8a29", "signature": "d4ba80300d5cb51353c03f28c44fd0a424ffe1e40d78ed7bb1133e8fe4e187505293b20a391da962c6a8ac0acec9c67226af3b6195dabe39b3662294da3e0e09" }, { "secret_key": "5ca0543c71f568a00eedf50a9520f4c15b526e3fb0da816c29ea3d50b2f62a12", "public_key": "d4a2933ce19454e331b5280100209a6ce8e569f993c2acab51dbe864c5cb2563", "message": "4ef8496978d28c10abd54a26356ee55921ceb350dd4b742c4161fbeba8a1601f8ad0484b21a8cf5a294fac00ec8a6f59e3362e47bfae1e28a2e6d017c5caa75fb0f48482808037ca21476954d778ff1a0586da3ef69d6cef6d2d8df4ae7a85442a1e46c998cf407a6ad4c5463a43c248f3b6937fdbc845b60c6d85e0563cc16ba9675d364f525f669aaac95f428bb58205099f9e4a6dbbd0151fb65babe123e5393ad64026935cb488aa", "signed": "436823eeff3edce5d8587d68e5473ef3d8dc9465b558b6e8e7cd3137eccc80b4c4e806edf13619d8e717e69f48d7061b68de02c8209be1f7ac26ba8edf606d024ef8496978d28c10abd54a26356ee55921ceb350dd4b742c4161fbeba8a1601f8ad0484b21a8cf5a294fac00ec8a6f59e3362e47bfae1e28a2e6d017c5caa75fb0f48482808037ca21476954d778ff1a0586da3ef69d6cef6d2d8df4ae7a85442a1e46c998cf407a6ad4c5463a43c248f3b6937fdbc845b60c6d85e0563cc16ba9675d364f525f669aaac95f428bb58205099f9e4a6dbbd0151fb65babe123e5393ad64026935cb488aa", "signature": "436823eeff3edce5d8587d68e5473ef3d8dc9465b558b6e8e7cd3137eccc80b4c4e806edf13619d8e717e69f48d7061b68de02c8209be1f7ac26ba8edf606d02" }, { "secret_key": "5f87117da9bbb6091c94da6b230b7d8f6de0ed2a076413b92eacdc43abbc6897", "public_key": "aa786a146226832aa73c434b0edc2d41d2558f820ab8f87e09e6cda91072b9b6", "message": "2297c40a2e8365bae4c5f0630c50b13bdd9ad9770a5d9a9451d00874b023d25ecd468b96571b2f16dcb1b0d3d756c1f044fcddd1c51f27727a0369c9cf25bd6aa59551b5b07cf8f807d92b159198639704740fe6eda0f26dba7e75d4530b2800f03fb6aa677d84df75d68d4fbb64ad21001e3fc87b609b9c251e8ccb12bbca927447e2054e07688eb8a20521a52249e7b943bed60e6a93c01e3eb621f0460c18a690b6f6b66edc6e8743a6", "signed": "0f19e6ea0c05f38185c01c2d6477995daf5065ba9d80173fa6bb23a774dc88b3aae879d8a62471d2d304cc3dc66278a7abcb0bb0771cd278e11e7b932e9f9b0f2297c40a2e8365bae4c5f0630c50b13bdd9ad9770a5d9a9451d00874b023d25ecd468b96571b2f16dcb1b0d3d756c1f044fcddd1c51f27727a0369c9cf25bd6aa59551b5b07cf8f807d92b159198639704740fe6eda0f26dba7e75d4530b2800f03fb6aa677d84df75d68d4fbb64ad21001e3fc87b609b9c251e8ccb12bbca927447e2054e07688eb8a20521a52249e7b943bed60e6a93c01e3eb621f0460c18a690b6f6b66edc6e8743a6", "signature": "0f19e6ea0c05f38185c01c2d6477995daf5065ba9d80173fa6bb23a774dc88b3aae879d8a62471d2d304cc3dc66278a7abcb0bb0771cd278e11e7b932e9f9b0f" }, { "secret_key": "b53a644c92ba2dc7108b16833f09ad5917846437225a773d32d79c97733c0a58", "public_key": "515818c69c0e0a1706b04143842f3e9e271448fbaf3a899119c32f42566ffd33", "message": "13036daaee45fcfde0c53e06d05aa9c01ea94a67e86c6c538ccb283b368daf7078d3fbab580c76ecf82b4e9660f068dcbb500b80595017c5be3c448fbd8a17d97c5643197890e167b35345bf65e75b82c8d65229f2f60aae2772581bc99c49d416bc3d78746ef830f1af944f4a6715ab4ffb01591bac2857f1a9c9d1700888780006a31607338f7af7bedf6efe0b57299ac915526fe5e1e101298708c6e61b84220afe95b53f895987456152", "signed": "13d2cbac7976ad27f0bf669ad588efb2c91bab8507d57fb16bfea9caff2b0964e75625c4d808d7bbb78c5b464edffe4949ecfbc8b95ff6fdb1bdca274206810013036daaee45fcfde0c53e06d05aa9c01ea94a67e86c6c538ccb283b368daf7078d3fbab580c76ecf82b4e9660f068dcbb500b80595017c5be3c448fbd8a17d97c5643197890e167b35345bf65e75b82c8d65229f2f60aae2772581bc99c49d416bc3d78746ef830f1af944f4a6715ab4ffb01591bac2857f1a9c9d1700888780006a31607338f7af7bedf6efe0b57299ac915526fe5e1e101298708c6e61b84220afe95b53f895987456152", "signature": "13d2cbac7976ad27f0bf669ad588efb2c91bab8507d57fb16bfea9caff2b0964e75625c4d808d7bbb78c5b464edffe4949ecfbc8b95ff6fdb1bdca2742068100" }, { "secret_key": "d27c9eafcf88151990bb5b2fa8443e709b5fd8d78d233803322dc86d93d93295", "public_key": "08e0eff529776714686196d817fdf71eb5b6e8326516ef489bfe186ac5c5bf6d", "message": "77c35bda32a5967d8b302fa7a47583ceab89c9a609a667b753155fa6996f8631d0ebedfe0ac364c77e85ba37311f0de57a0dc2c1e9e400d58b424a322e1d5771e0a9fd9502ad0232ce544f07d8c66e7c3147f8607ac6189bb69066f2fad631185f457f467eba33228ecc40e894a77b571698a9bfac841a54eac5219da99c6a9125c469a22fe81f3b951433896f19ce39b373fd7e5c7b650a5ef2365ae7510b0da5e49d7c07073cf166a98387e8", "signed": "c254e371445633137442eefe40ad4a82e69b1ebf48a685a2bc6ffbac126d228487b2e3537c97ef7410342091962e50c0cb85de7b39ceb41ac4078d40f340710677c35bda32a5967d8b302fa7a47583ceab89c9a609a667b753155fa6996f8631d0ebedfe0ac364c77e85ba37311f0de57a0dc2c1e9e400d58b424a322e1d5771e0a9fd9502ad0232ce544f07d8c66e7c3147f8607ac6189bb69066f2fad631185f457f467eba33228ecc40e894a77b571698a9bfac841a54eac5219da99c6a9125c469a22fe81f3b951433896f19ce39b373fd7e5c7b650a5ef2365ae7510b0da5e49d7c07073cf166a98387e8", "signature": "c254e371445633137442eefe40ad4a82e69b1ebf48a685a2bc6ffbac126d228487b2e3537c97ef7410342091962e50c0cb85de7b39ceb41ac4078d40f3407106" }, { "secret_key": "70213d3a79c65d6dbba542a3679635003a682af5fa58de6b0d65bfa24184901c", "public_key": "4402fb92cc1249dd1ae1690f03b3ec4f1e9bdab0de5bfd289f10296830fd403e", "message": "cd6e1cd9c90f566de043d75d7244ecfdb38e8bde2f9a6cd5a4fdac72b5ede6af62d981918c5e610a38789274fa10e527f85fad209b76ca1c281ad5890f9c96d35de522f1ddccb539b8798a0067acdd45b6e344a5d9a97731f545ffa4b17b875c67b48e9d4c4ba72c98a4505583fdbf1e12f22b5a7a494746cc9b6c1b571906c67fcc883a9c15a3806875b659e5816b4276c3190e25cc1ac3de47bf99c49965388f54f3ef8eb569906c6008e5fbbd", "signed": "5b6ce2774d400ecea8a808f5fd0a797ffc6116752376cd7bfa3b2cca3a84d5593f5c03ad3eec1d89532275c47b7ce2a0e9c59cc4028a8a65e5bb9097ea71c208cd6e1cd9c90f566de043d75d7244ecfdb38e8bde2f9a6cd5a4fdac72b5ede6af62d981918c5e610a38789274fa10e527f85fad209b76ca1c281ad5890f9c96d35de522f1ddccb539b8798a0067acdd45b6e344a5d9a97731f545ffa4b17b875c67b48e9d4c4ba72c98a4505583fdbf1e12f22b5a7a494746cc9b6c1b571906c67fcc883a9c15a3806875b659e5816b4276c3190e25cc1ac3de47bf99c49965388f54f3ef8eb569906c6008e5fbbd", "signature": "5b6ce2774d400ecea8a808f5fd0a797ffc6116752376cd7bfa3b2cca3a84d5593f5c03ad3eec1d89532275c47b7ce2a0e9c59cc4028a8a65e5bb9097ea71c208" }, { "secret_key": "5d540b3b14f0c0175c047eaf026c9070659ef13e9d28e0c5c516a428269b14eb", "public_key": "1d2d4d551a57c6fb2b04181049d4039d575cf80c0bc6ec7033067f27309344de", "message": "e4c9e8706898cad4ac68d73c130efa04a54f8ca25919ea6bfaa54c8c720ced854c5e9509102c7b885aeddffbd1b7f2c5922583677ac9eea9a108c7e83e8871aed5a084f5440b0f391ad7ffc6bab4574af1b96770f4370e8e988e85ecb1a8d6034fc3d7f49f7422023b9dab5d0c16beab5f5d37b0a4d7de197ad87cd4ff8ce78eb12e1daf739d8b47ab380abe9093356db5b59717751a49e1948472fdacc259ffffc8c1dbae592607d4ec71cc6a8f6b", "signed": "32527da755312889935dd5ee91b1bb117a5d377dd23ef5b7e15baffae9a54391a3fd234bdce073e098c58d05bf195b4c3cc63972383ba4b51072971aebcb620de4c9e8706898cad4ac68d73c130efa04a54f8ca25919ea6bfaa54c8c720ced854c5e9509102c7b885aeddffbd1b7f2c5922583677ac9eea9a108c7e83e8871aed5a084f5440b0f391ad7ffc6bab4574af1b96770f4370e8e988e85ecb1a8d6034fc3d7f49f7422023b9dab5d0c16beab5f5d37b0a4d7de197ad87cd4ff8ce78eb12e1daf739d8b47ab380abe9093356db5b59717751a49e1948472fdacc259ffffc8c1dbae592607d4ec71cc6a8f6b", "signature": "32527da755312889935dd5ee91b1bb117a5d377dd23ef5b7e15baffae9a54391a3fd234bdce073e098c58d05bf195b4c3cc63972383ba4b51072971aebcb620d" }, { "secret_key": "ca41769caf1717b4e45c93c121dc82a534fbc6ec0986662c3222d71492bd1176", "public_key": "af3f89f6187dbcf9217750c67ef89ed47b039f9eb062ffec9df64ab52b0b45cb", "message": "9de8476c5813848ab1451537841cc178002181a2182af305b12e5f7c3b1d56b22cf46ae6276d1826ec0a8c9a7d9f68083b7225bbfaefce82b3b64594052a7700f309233a79fffdfccc5c21400c91cc0e418d5141d486b5219901d6dd2447c1f7b7cf5a0879e70e1dd658d0f2ecf31ebeee11a5c74440c63b9d8b45318c3465d7ff03365edd0385edf80d4fded51f0f7533ee4099f19e93bc9d08dadcd13485db239522ffc81e2c051f8796d62e979fcf", "signed": "5cda872f7ed6d7c90218ac10bee8e214f3b34d15d25c39255ec9e6b0177aa3cb7368d11cb8ed6ff5cf0c04281d06bc4272b8bc09c23f6f4cd5a810ddc7b9c1039de8476c5813848ab1451537841cc178002181a2182af305b12e5f7c3b1d56b22cf46ae6276d1826ec0a8c9a7d9f68083b7225bbfaefce82b3b64594052a7700f309233a79fffdfccc5c21400c91cc0e418d5141d486b5219901d6dd2447c1f7b7cf5a0879e70e1dd658d0f2ecf31ebeee11a5c74440c63b9d8b45318c3465d7ff03365edd0385edf80d4fded51f0f7533ee4099f19e93bc9d08dadcd13485db239522ffc81e2c051f8796d62e979fcf", "signature": "5cda872f7ed6d7c90218ac10bee8e214f3b34d15d25c39255ec9e6b0177aa3cb7368d11cb8ed6ff5cf0c04281d06bc4272b8bc09c23f6f4cd5a810ddc7b9c103" }, { "secret_key": "fedd63ffd4cfbf618894962e121a9025eea318a80a1adf169d6490445d2e02a0", "public_key": "542f2244bdb7d84b87e628a8e6a12f17bf74a9a6d0ea46c595dbfdc680c04b26", "message": "2e2ae584641be03dd48f9c618077aeaa18212a4241f0c0194ed23e370d741a3ae11a5fec3b040c16eafa4ac8d18abaa7ce8f286967337189f0495ffdd61995cde31dd8dfc3df5700b57a7a29980e9c823fee85d61451176729e72787c6109b47359b93dfd62e1e5a2d642c057242dae500a94ca1a93bc57be1ade76fe4501c0f6377ed0e9246179aecdd9946b671e8190e1ed23f966e96409b948222d8ea5839de904fc51348073b8f40edbd9b4a4b2275", "signed": "ed59d9e23dec3494b0fbc5d10cd02bab86b3eb35abbf9e4d4a926479f134583a44ce72dc4122aca377a4072b7156462b74e8df46b686698636836ef203179c072e2ae584641be03dd48f9c618077aeaa18212a4241f0c0194ed23e370d741a3ae11a5fec3b040c16eafa4ac8d18abaa7ce8f286967337189f0495ffdd61995cde31dd8dfc3df5700b57a7a29980e9c823fee85d61451176729e72787c6109b47359b93dfd62e1e5a2d642c057242dae500a94ca1a93bc57be1ade76fe4501c0f6377ed0e9246179aecdd9946b671e8190e1ed23f966e96409b948222d8ea5839de904fc51348073b8f40edbd9b4a4b2275", "signature": "ed59d9e23dec3494b0fbc5d10cd02bab86b3eb35abbf9e4d4a926479f134583a44ce72dc4122aca377a4072b7156462b74e8df46b686698636836ef203179c07" }, { "secret_key": "38f2184eaa553656ee2902706bcec4acb5af25157ca0f6a2d48de85285fa3bc0", "public_key": "7ff03fb4c82e9c15d659df424b3e73ed1d78006f3e0b79eb64d98c13aec6ba37", "message": "c2df77c9e479f61983b6c7483ef93fb85a103b213923926523065ebff2257e85427e05cdc27582ef6c16be353a3b250372d6370eecb6c8962917eb656f2641690189d172a111051557abc2494e32cab65ed0633affe92408b55c4ed8af65e2c5e7aab887a3cc8d28c52e9e1336d0b7bb3fe2cd843e7fa1680342f8a4aafa02c4ab252f08c3d46d5f00fd01484263ee635284f6db26d6298de5b0dd238da40a8d2a93376da0302783a0e3be23d9e7f990d25b", "signed": "4a6413c2c87f2b3856a8decbce493adeae0c69c94134707fb0f18f3049fd3e3d051abdb9d4bee253c6107c02d57ad7cc9f3101db660afac2b7981938e9564f01c2df77c9e479f61983b6c7483ef93fb85a103b213923926523065ebff2257e85427e05cdc27582ef6c16be353a3b250372d6370eecb6c8962917eb656f2641690189d172a111051557abc2494e32cab65ed0633affe92408b55c4ed8af65e2c5e7aab887a3cc8d28c52e9e1336d0b7bb3fe2cd843e7fa1680342f8a4aafa02c4ab252f08c3d46d5f00fd01484263ee635284f6db26d6298de5b0dd238da40a8d2a93376da0302783a0e3be23d9e7f990d25b", "signature": "4a6413c2c87f2b3856a8decbce493adeae0c69c94134707fb0f18f3049fd3e3d051abdb9d4bee253c6107c02d57ad7cc9f3101db660afac2b7981938e9564f01" }, { "secret_key": "8bfca48462d2536f74b84f6af59f5d8582ff8f7ec28745d672e72eb72e79d3e9", "public_key": "9d10d275c3d3fe459f7fe2901bce389191cc8483c0f51140d9c62b08fade81bb", "message": "81ee4cb9c45da691dacd7dd09aff59737267bb55c3ade1ba32c17b7d0d2d0c6079c39d5fd5b29ba5f9c1762097709843eee5612bd20bc8185bf64d5c934184e13624e6f877a2a5dda15c0df62afbb97057cc91cac9a18406a0e0109cc39b2e3f812e227a4062d5ef81c92c22a7dc797c845d71eb6ea9e42ec8417fba90a96d2bb1439418330b4bb2f99c6d63d304a0e506dca9653e5de0dd56e309db1a76a0faabab163774f000088cef3d1b7a6cf661d2e1d9", "signed": "44d77e439ef6ca5eb940c60ff8732ddc16269ea023bb2613bd447eba7fd69851226c4819ce8d44985a49f3f41ac7af33c47ffe5f89304a3256e445f8d686e30781ee4cb9c45da691dacd7dd09aff59737267bb55c3ade1ba32c17b7d0d2d0c6079c39d5fd5b29ba5f9c1762097709843eee5612bd20bc8185bf64d5c934184e13624e6f877a2a5dda15c0df62afbb97057cc91cac9a18406a0e0109cc39b2e3f812e227a4062d5ef81c92c22a7dc797c845d71eb6ea9e42ec8417fba90a96d2bb1439418330b4bb2f99c6d63d304a0e506dca9653e5de0dd56e309db1a76a0faabab163774f000088cef3d1b7a6cf661d2e1d9", "signature": "44d77e439ef6ca5eb940c60ff8732ddc16269ea023bb2613bd447eba7fd69851226c4819ce8d44985a49f3f41ac7af33c47ffe5f89304a3256e445f8d686e307" }, { "secret_key": "d7480d4272bcb1557b1bbee04915c126a52ca6d6a8bb5314a0e1a52b59bfc99c", "public_key": "99c839d36d8f5b8652618ed7b0fe9ec3d94efff4c453c540631476a5979bbbe0", "message": "615cc19f942017365ba8bfa256ceccc85ee289a1c34bb1442acc0716c7fc2caeb76a9de19adec106371e47a30d2e1239ce1f7dca25526d604bdd647659d942bcbac368911349c3b946a97da10a42dbcf3c73416d2e6ba22bd29d9f705672e9e338944cef01ad21f009742e07bcd888ca31e1ee953e8c1b1fd954b7dcf1a0b1d5a069065a66cb721adc020f4efe1abdd16742746939285780d753137ae0140bb410fb6ce33676c27aeec593a88cbc73afd9f40511", "signed": "e04dc8442d352173e931818e290858de85688a4649ea3e3c3ae74edaa54ad01b64622ad8a090b6ad60adfd01881882828d39078bb5b2714fd3ea8397a342fd04615cc19f942017365ba8bfa256ceccc85ee289a1c34bb1442acc0716c7fc2caeb76a9de19adec106371e47a30d2e1239ce1f7dca25526d604bdd647659d942bcbac368911349c3b946a97da10a42dbcf3c73416d2e6ba22bd29d9f705672e9e338944cef01ad21f009742e07bcd888ca31e1ee953e8c1b1fd954b7dcf1a0b1d5a069065a66cb721adc020f4efe1abdd16742746939285780d753137ae0140bb410fb6ce33676c27aeec593a88cbc73afd9f40511", "signature": "e04dc8442d352173e931818e290858de85688a4649ea3e3c3ae74edaa54ad01b64622ad8a090b6ad60adfd01881882828d39078bb5b2714fd3ea8397a342fd04" }, { "secret_key": "3c2d3650735b41ef9006bb45e4be2e0aa5cde851aeac421ee9c1b492d87aa18a", "public_key": "3e46ddce298844fcafa00a1b47eaf3de70596df1bbee3c809d1be7dd94080e34", "message": "1425d8d218da1a10a80b6a9c3c2750efe41657984abd5100f451ba949db01046b7126be8402334ed57528bac05622553a86b726722695a8fb331d8565417c4ff0f251a320ad06dedbb750def35d521c3c4cd571a45ada8450653d5e81fe0beb53aaae787b3eb653c2381ed55aaf2590ee5ed8b6626f1c4b0430a54f39658624e6635fefc98fee8fc3e1cc7ff3dd420de9da11a62fcae0e0cb454fc6f7df03954291d26202f1b188b657b3bae07389449b75e67422f", "signed": "3f2af01ad5377ac39040d41a41e36e7b93fa7235b841791f432ecd7f91a3b21ab7196c883ad5a7db446f6c06672460f3f63ef863d9432be9caeabb79e87e22081425d8d218da1a10a80b6a9c3c2750efe41657984abd5100f451ba949db01046b7126be8402334ed57528bac05622553a86b726722695a8fb331d8565417c4ff0f251a320ad06dedbb750def35d521c3c4cd571a45ada8450653d5e81fe0beb53aaae787b3eb653c2381ed55aaf2590ee5ed8b6626f1c4b0430a54f39658624e6635fefc98fee8fc3e1cc7ff3dd420de9da11a62fcae0e0cb454fc6f7df03954291d26202f1b188b657b3bae07389449b75e67422f", "signature": "3f2af01ad5377ac39040d41a41e36e7b93fa7235b841791f432ecd7f91a3b21ab7196c883ad5a7db446f6c06672460f3f63ef863d9432be9caeabb79e87e2208" }, { "secret_key": "74965996268cdc4c09220bd31ce07b217a03826ee981fa89f3a2359ced095ef1", "public_key": "4096d027c1c5ee4cbfc04b9d534174029fdb50cf5610d3021ef933b4caf33985", "message": "45b2f064615bf774fce97f51c464685d7b3e4fefff9231240a719b3b0621cd4ad83305675cd6eaaebff791000b0b1fa31d82d8181b7fe57c5e00cec56ff9022e9ce8db66356e408e3ee262fe627789e65535ef1a63e8fec933be3dee34d2facdb8928cc456abf2f3e8cab47eff1ca42e8b0e48d2c73e7bcc5de3f1056fc523dfef6b0023f32889ed394eeda032abf6bcaadaa7f3ee74118760ab6d91df528bdc5807972c85fa7cb56e387d7332e779e52d0dd7db0cfb", "signed": "8c6628344317a63aca6f78cfaea965b3aa5522ce914195141c08870a1b8dacf34b79c7abc693cd9e5ebe1a2e86f0332d2048db3cbdef01687962d6df249e380045b2f064615bf774fce97f51c464685d7b3e4fefff9231240a719b3b0621cd4ad83305675cd6eaaebff791000b0b1fa31d82d8181b7fe57c5e00cec56ff9022e9ce8db66356e408e3ee262fe627789e65535ef1a63e8fec933be3dee34d2facdb8928cc456abf2f3e8cab47eff1ca42e8b0e48d2c73e7bcc5de3f1056fc523dfef6b0023f32889ed394eeda032abf6bcaadaa7f3ee74118760ab6d91df528bdc5807972c85fa7cb56e387d7332e779e52d0dd7db0cfb", "signature": "8c6628344317a63aca6f78cfaea965b3aa5522ce914195141c08870a1b8dacf34b79c7abc693cd9e5ebe1a2e86f0332d2048db3cbdef01687962d6df249e3800" }, { "secret_key": "0abf069c08b2691c3a26f79dc8ed05cb71d220ff78f3a5c5780ae9da18e45643", "public_key": "9ef3b5cc016cc82dbdda705766aa448bd61fa1aaf1170efe9149daa9fe64a1ae", "message": "0d055291b2e861eae19ea0fb2069d8c9eef4f1347f3576d78411ae7c0b1c1caf31fde736dc8accacb662df76b620b62ce90b9f92c83309128621d057cf845805949088e938ddbc3d41c5e5541fec8298687ad2f79acda01aa215d25821436eac9d268716d4cd6050260cb4ef6aada4835e073a845821ff211ae2baadceb6e57f06f88345edbf93bfdf54fb74123b57c0fb4a79608d8db6740889e15733507799f7a1fd3017bcd77b28a2bb6c91ecd154e9c5a5ffa0eb62", "signed": "c7566fb3b4d8def667e040f276d3ed98d36dff460126a75b4cc2100386bb01c642f6d8de7e649be6e0818b08d77ce60f4ee5e7717a50884bdee02034ecf1cd0c0d055291b2e861eae19ea0fb2069d8c9eef4f1347f3576d78411ae7c0b1c1caf31fde736dc8accacb662df76b620b62ce90b9f92c83309128621d057cf845805949088e938ddbc3d41c5e5541fec8298687ad2f79acda01aa215d25821436eac9d268716d4cd6050260cb4ef6aada4835e073a845821ff211ae2baadceb6e57f06f88345edbf93bfdf54fb74123b57c0fb4a79608d8db6740889e15733507799f7a1fd3017bcd77b28a2bb6c91ecd154e9c5a5ffa0eb62", "signature": "c7566fb3b4d8def667e040f276d3ed98d36dff460126a75b4cc2100386bb01c642f6d8de7e649be6e0818b08d77ce60f4ee5e7717a50884bdee02034ecf1cd0c" }, { "secret_key": "f3fd5ec5e230b6dad1ac3d3aebadc7863ff89de2a1317f424d15989a3efb0afd", "public_key": "f99e5d5eeeaed1205cfb5c2cc4e5e9f6b4e7f64129f860104ca6244eb9feb564", "message": "71f28973ed3df05945fa0bdb23e9beca651d3ee6bf9fa45ffdc6061e42fa2e8d76235f0e9e2daa65e52631fc3bead33da055bb492e4758e598a030a33b3c40b34371459b233ccc043cccc3a3cbce549e20e0b2b43305b64aec661aadba6556b17d76e3bbed62c4a4eac4f88603996752d2363c8d4a2789d128f6e959945c68c30146d194ccb6839ec65344601652c18b0074e2bc7668311697d960c7066597924d704d02a0193fafbfdf571ee0dfe414dc2f52896912bc32", "signed": "44b0124663adb0c73aed49f73403461fcb19111b0ba17aa996566f477e37d524b0e1f107612fc52a7c767b181fbf4d629bddc08f30584dec6124c5d39d42310271f28973ed3df05945fa0bdb23e9beca651d3ee6bf9fa45ffdc6061e42fa2e8d76235f0e9e2daa65e52631fc3bead33da055bb492e4758e598a030a33b3c40b34371459b233ccc043cccc3a3cbce549e20e0b2b43305b64aec661aadba6556b17d76e3bbed62c4a4eac4f88603996752d2363c8d4a2789d128f6e959945c68c30146d194ccb6839ec65344601652c18b0074e2bc7668311697d960c7066597924d704d02a0193fafbfdf571ee0dfe414dc2f52896912bc32", "signature": "44b0124663adb0c73aed49f73403461fcb19111b0ba17aa996566f477e37d524b0e1f107612fc52a7c767b181fbf4d629bddc08f30584dec6124c5d39d423102" }, { "secret_key": "738f1310a4e08f917a0a5c1fbaf4ef72f95ee62fcded50868a3daf98856a448d", "public_key": "42272c2c8b08470ee5dd8af8849c01b7508d3a3c65b0330e695c841d5dccb2f5", "message": "f0e7ef6782d04c6943b19eb66ff6226b736e3b0940c09bb126bfc4c4ca7a5e7016c286b7bfd73aa6a79a96031bc81cb5da68cec71a6a0d39780cbe6a0cd4774d3aa06a881610444a8c9d19102294e5f635187aa6f48d11912c7094b38833028d570cb110db60625bb1bdc37affa25ea3c8f8dbfc2514f4365c62b2989a66d27c80384e74ae5fba8c1c2af9c72c4971e64fa6a1dc2517b31ea57ccb0815a7fe2da0f146caa08431d25d151662d9d26e95229d0c62823664123c", "signed": "ce1e3577b6a21016b9dd0b517baa0ccb107bc199b8bbaef68f950c8ed58013c853b4d338eedc675079ab1390462ffefa6a959b043f8b5651c6ca375ce0b4a403f0e7ef6782d04c6943b19eb66ff6226b736e3b0940c09bb126bfc4c4ca7a5e7016c286b7bfd73aa6a79a96031bc81cb5da68cec71a6a0d39780cbe6a0cd4774d3aa06a881610444a8c9d19102294e5f635187aa6f48d11912c7094b38833028d570cb110db60625bb1bdc37affa25ea3c8f8dbfc2514f4365c62b2989a66d27c80384e74ae5fba8c1c2af9c72c4971e64fa6a1dc2517b31ea57ccb0815a7fe2da0f146caa08431d25d151662d9d26e95229d0c62823664123c", "signature": "ce1e3577b6a21016b9dd0b517baa0ccb107bc199b8bbaef68f950c8ed58013c853b4d338eedc675079ab1390462ffefa6a959b043f8b5651c6ca375ce0b4a403" }, { "secret_key": "8841d22aded69c131ef5ee0a10ab0a9b77cb754ede8d257a5372726e2b499c6e", "public_key": "715ecca63681bc6e9e31d18848902f4d96feaf43b95d008642903b1763bc9fb8", "message": "087ca6be2a950c024b3e7467fe00a7d364555d5dc6770f5ebd260642525bd3c0f965db36d7b229a57421eec64e4d991cdde59123034470553f4eb0be81ad2936c8ca26bcab4e5d79040e29798728601684a468323cf3baae4d948d0a1fd905effe16dc44642088df53f6388bc480edf4aa207d0ed161eda345712b4c00cb05fcf635ec2588785bfb8a27cdc28996a1db3e6787023393c075d83c9038fed7899c55fec307de3249c14bda49e8b895860942c36d640bb893779142", "signed": "bb2bab7003f1311be9b8c883fc4fd528adfd51a9c99db3dca8da0fca958da19a10eb22332667b1a0065d3dbc0d06269a1259b6a890484aa2143a52695f145b0a087ca6be2a950c024b3e7467fe00a7d364555d5dc6770f5ebd260642525bd3c0f965db36d7b229a57421eec64e4d991cdde59123034470553f4eb0be81ad2936c8ca26bcab4e5d79040e29798728601684a468323cf3baae4d948d0a1fd905effe16dc44642088df53f6388bc480edf4aa207d0ed161eda345712b4c00cb05fcf635ec2588785bfb8a27cdc28996a1db3e6787023393c075d83c9038fed7899c55fec307de3249c14bda49e8b895860942c36d640bb893779142", "signature": "bb2bab7003f1311be9b8c883fc4fd528adfd51a9c99db3dca8da0fca958da19a10eb22332667b1a0065d3dbc0d06269a1259b6a890484aa2143a52695f145b0a" }, { "secret_key": "c02135e7b65aac72f63c32bf5bef5b68c7f3b8ed56208e59e4752070e9d07095", "public_key": "dcf600f244037a75203ae11ac316e8dbe9986f0dce23473939334bf5cea48b0d", "message": "86d9491350d2566e708ed356185d610c73465b2a5c7012919958af2cf76af995230d360de400b7137170dd0835f10fcbec224ee4e42c7d1cebb7f580fea8ed6223163bacdd1923a572cbb6dc26ca8b17ade68c6d2808c4ca1eca28eae9a145f68d4079d8d59d140e958228e7e99520e342dbd7457a9159740f48bdc27b93bdabeba465cbf0c8df5ef2c0f9386eebe656f5d749d5f9147f525266910d7b80396a90be5cc188a9a945f93e753fc99bafa18ee0a6dff79bf8484898ef", "signed": "dd5cbae479eb5e229574c21ec3bed911113a57a1916d3313457515d55cc5b6e6ebc52c93f821d13988dbba8df5096d55ff9c39e7f9d561cb58930c96a7a5d60b86d9491350d2566e708ed356185d610c73465b2a5c7012919958af2cf76af995230d360de400b7137170dd0835f10fcbec224ee4e42c7d1cebb7f580fea8ed6223163bacdd1923a572cbb6dc26ca8b17ade68c6d2808c4ca1eca28eae9a145f68d4079d8d59d140e958228e7e99520e342dbd7457a9159740f48bdc27b93bdabeba465cbf0c8df5ef2c0f9386eebe656f5d749d5f9147f525266910d7b80396a90be5cc188a9a945f93e753fc99bafa18ee0a6dff79bf8484898ef", "signature": "dd5cbae479eb5e229574c21ec3bed911113a57a1916d3313457515d55cc5b6e6ebc52c93f821d13988dbba8df5096d55ff9c39e7f9d561cb58930c96a7a5d60b" }, { "secret_key": "154a47eba1b8c38362ea61faeb0c0ad7e61e412a3cba4688af0db2a487208b1c", "public_key": "16de2c894a50cbd4ca90419a4ca64942cb14bd335c5d3f4a53e239c280bda725", "message": "bf607e8b6e14d9c8acd96815af0c035ac73c4104c93786ccc1c9f859395dd781900320ebf356aa991cdc9f503fcee9f83675888a7d592002d2a54a573a96994b3fa865538c617ed8ad1ff62018288a674f449be0aab5222f74c4fd475ed6a8dfb27f45287b22b2b6c3bd15179f267d157d7d8a4159679be85b25c2bb2ba850aaed9ae3ae571be4f75836329cf36f412c1c80f1413b7661eab4a8e11b6024244fc62323ff02e38aceb1737bd474bf1e98015dbc788b027bbe217cf4e7", "signed": "f4b6eb1a8d950e887fd2f30f70a23b41871495bfa5b8a4ad3996cd9bf51eb742e07f4c4d2da4b01ab087367a50e2b65b3cef514e40d837540b8c89966485910fbf607e8b6e14d9c8acd96815af0c035ac73c4104c93786ccc1c9f859395dd781900320ebf356aa991cdc9f503fcee9f83675888a7d592002d2a54a573a96994b3fa865538c617ed8ad1ff62018288a674f449be0aab5222f74c4fd475ed6a8dfb27f45287b22b2b6c3bd15179f267d157d7d8a4159679be85b25c2bb2ba850aaed9ae3ae571be4f75836329cf36f412c1c80f1413b7661eab4a8e11b6024244fc62323ff02e38aceb1737bd474bf1e98015dbc788b027bbe217cf4e7", "signature": "f4b6eb1a8d950e887fd2f30f70a23b41871495bfa5b8a4ad3996cd9bf51eb742e07f4c4d2da4b01ab087367a50e2b65b3cef514e40d837540b8c89966485910f" }, { "secret_key": "d3028431ce2eef73bd940ab84ca29f13fb26436aa25e1b7bf26cb33f17fdf817", "public_key": "63df203e2860bac4d352e722c1c91fe3776e1cbcae8553a4f19890260bf0e457", "message": "086335d61275d168eaac0540477f50d4b15f9e50b9be693921ed54a9941bc40643cda62e1d805d0250a81146bd5fe2d39e81444d21e2b21b031c111306cacbf52717f6fb4cd3416f1215f8dddcedd2f0096b0fcfa0a6cc2cde7a2bab7f1e32790b5361df3671424cc722f231bf71895bcdcb7b22ee074e8fb4a9678504e735366c172f07637b7a93149bb21f38883378a1db273fc23239e35337f9ce566d8ddf3b3133cad7f2ce81edb503ce1d27c5a657160b78dca9aeaea379be9c85", "signed": "ce9729a96c3ed28943b27839c73382ecd572960c1f9e90c5eff9dd499ff48f17d25edd1268effe41ee6a81ce48d84de513df9c41442621b2f5491e346be18c04086335d61275d168eaac0540477f50d4b15f9e50b9be693921ed54a9941bc40643cda62e1d805d0250a81146bd5fe2d39e81444d21e2b21b031c111306cacbf52717f6fb4cd3416f1215f8dddcedd2f0096b0fcfa0a6cc2cde7a2bab7f1e32790b5361df3671424cc722f231bf71895bcdcb7b22ee074e8fb4a9678504e735366c172f07637b7a93149bb21f38883378a1db273fc23239e35337f9ce566d8ddf3b3133cad7f2ce81edb503ce1d27c5a657160b78dca9aeaea379be9c85", "signature": "ce9729a96c3ed28943b27839c73382ecd572960c1f9e90c5eff9dd499ff48f17d25edd1268effe41ee6a81ce48d84de513df9c41442621b2f5491e346be18c04" }, { "secret_key": "ee8985dc27504440a8758d4c53e4225215797a00cd8631d59bd93bc66f373d5e", "public_key": "cd647bb065693d486589156a9fa261437534dc86f46f72d0a800399a7af010f7", "message": "f2220485addfebce02a833aca33381d1df917ed609950ed24f85e3b02b2b994b4d939784e332f41064c8b4a2630ab36961742aa1cffdcb08c144eeaedeafd48b5dbe96bf24350e14fd68286bc08eeaef8bc6ad9e195d1484afcd30afa8ced4848126d56c81b43c27a5dbbdec1a50c11062ce21c61d860c25a862fbb75c3bd51c8dc07636668669bbf751eacaccb3b51d2c0d4140316cfce2eb18d2908cecd5a188679bc5f5de290f548e7ebc57d41b589a24ce88ee48d97e8d0c7c769960", "signed": "5bd60ad5e9bad9932ca9c75f231a76889ae7a8b864b91d1fcba5c5d4bfa1d92838adb974842a0710779b3e3094044909e92c7cf046ce519f4c68e8f19ec03c02f2220485addfebce02a833aca33381d1df917ed609950ed24f85e3b02b2b994b4d939784e332f41064c8b4a2630ab36961742aa1cffdcb08c144eeaedeafd48b5dbe96bf24350e14fd68286bc08eeaef8bc6ad9e195d1484afcd30afa8ced4848126d56c81b43c27a5dbbdec1a50c11062ce21c61d860c25a862fbb75c3bd51c8dc07636668669bbf751eacaccb3b51d2c0d4140316cfce2eb18d2908cecd5a188679bc5f5de290f548e7ebc57d41b589a24ce88ee48d97e8d0c7c769960", "signature": "5bd60ad5e9bad9932ca9c75f231a76889ae7a8b864b91d1fcba5c5d4bfa1d92838adb974842a0710779b3e3094044909e92c7cf046ce519f4c68e8f19ec03c02" }, { "secret_key": "80dfe2bf7387bad4654eb076f8dae9595163e40127f5df492dad7df04c7221c4", "public_key": "d1783ceeb9cf8e4d07764c473fa4061b8274397103f2076d703249d758b8fbd5", "message": "aa09d784bb09dc999931ebb4c00e424cefeca104818d8eaf0661f09728ad025ef47393210571f17404e9aa6d8cbd5fd88cd7dfb8e2e8a108c05de206f3408234a3b463dbe71a07d05587324524b7326ee79d3348ddbed7871b86fcb488031dc9ea93f6b8d7fda6239348a562444faf1e72d31af35443e9df53e762f3e56b48668f9784b3368ab278a48ef4546a26cfad0d0a5161698f26ee8d34fc2b3d6dfb93b009ac296f6afe487ee335eac9f02cfcae5fcbd1a16ba4e71be1b112562fc2", "signed": "27279e3cdcb03ef557a5defc2f6c58128a6dc3f8b0385958014e709c1f61b0ae6b403576f0e454d5e4c64c173138ee4bbd5fe7b60d06c5abe23fe99ee3b46a00aa09d784bb09dc999931ebb4c00e424cefeca104818d8eaf0661f09728ad025ef47393210571f17404e9aa6d8cbd5fd88cd7dfb8e2e8a108c05de206f3408234a3b463dbe71a07d05587324524b7326ee79d3348ddbed7871b86fcb488031dc9ea93f6b8d7fda6239348a562444faf1e72d31af35443e9df53e762f3e56b48668f9784b3368ab278a48ef4546a26cfad0d0a5161698f26ee8d34fc2b3d6dfb93b009ac296f6afe487ee335eac9f02cfcae5fcbd1a16ba4e71be1b112562fc2", "signature": "27279e3cdcb03ef557a5defc2f6c58128a6dc3f8b0385958014e709c1f61b0ae6b403576f0e454d5e4c64c173138ee4bbd5fe7b60d06c5abe23fe99ee3b46a00" }, { "secret_key": "da1f868542cd7cce7a5ca3fa3c24081b4d2344b21a157f0264a347132d19659d", "public_key": "cb3a25a53f272ea813804468d6500e96a1eaf822705b7790a8ac3e98cc4e524b", "message": "c6987ef380d5d0e74196443aaa3a32356cbc02636c5a4b6d62a8114b2111bc1abddd9e44b3672c18b58d4ef591af4562e020049f8e1274688e1f8e5296d2f9252e7fc84cd1d0c58e98f0f160530aa22c871eef652e71974ce91b4a65fc25fd09fa1b6c32086e98ec708d9abcb1d9cc8e1a089ed8db2206ee9570236ad69b3de6821862fd2c70cd83a32a68b0486229553d928de48d03a104e87381964abea76683976d527c84163a12eee0a55986cf1431e9c86cba8182ca94689bacd165fbce", "signed": "75c517ade4f08d7746305743d1a776c3c55eb5eedfdfcb5eb1d5634a1bdaf7a4b8d24187d6c8850e3ced6567a03c4c59389a4cf47114ce5473160f230546e60dc6987ef380d5d0e74196443aaa3a32356cbc02636c5a4b6d62a8114b2111bc1abddd9e44b3672c18b58d4ef591af4562e020049f8e1274688e1f8e5296d2f9252e7fc84cd1d0c58e98f0f160530aa22c871eef652e71974ce91b4a65fc25fd09fa1b6c32086e98ec708d9abcb1d9cc8e1a089ed8db2206ee9570236ad69b3de6821862fd2c70cd83a32a68b0486229553d928de48d03a104e87381964abea76683976d527c84163a12eee0a55986cf1431e9c86cba8182ca94689bacd165fbce", "signature": "75c517ade4f08d7746305743d1a776c3c55eb5eedfdfcb5eb1d5634a1bdaf7a4b8d24187d6c8850e3ced6567a03c4c59389a4cf47114ce5473160f230546e60d" }, { "secret_key": "f13daec0ef33ddd133c7d244d10fd27ddb23705280ff5f1815f0f656d836fe84", "public_key": "2dc7f1367de672c51e005c74f876f982593996873acba079292734c209c2b111", "message": "ec02ff1804b2b309af3158b66272a14a3aad83c41a719846f7088ca9792af575c78913c432759f0b9a748bdc5568496e41658cc1cdb8da6c91d07c3ec2f4af504249b996aa00c0071cdfa793f82d0ec5d267262f518fc029b88e20b6201fb9e05abd3f9524c5da2fa8978ff2efd48120cf00822d1bee90df816125d8edc0cfb5de66d16be63896a412a62b031b7118ac13fe2c9faa6b1a3342f9ccf7884166cf489a84de26b5ce5b21856a3af289bc6622c0aab9f2142d393f5d4b236779dbb066", "signed": "db771833f7fdbacdab2b5cc80eed50afdf13783b7fe5e903d5dbb4c2e535316a6eef4c34f004d2b9a4e2700bd6e2acdd564c3c80cc68a303f5fb091cb4340f0aec02ff1804b2b309af3158b66272a14a3aad83c41a719846f7088ca9792af575c78913c432759f0b9a748bdc5568496e41658cc1cdb8da6c91d07c3ec2f4af504249b996aa00c0071cdfa793f82d0ec5d267262f518fc029b88e20b6201fb9e05abd3f9524c5da2fa8978ff2efd48120cf00822d1bee90df816125d8edc0cfb5de66d16be63896a412a62b031b7118ac13fe2c9faa6b1a3342f9ccf7884166cf489a84de26b5ce5b21856a3af289bc6622c0aab9f2142d393f5d4b236779dbb066", "signature": "db771833f7fdbacdab2b5cc80eed50afdf13783b7fe5e903d5dbb4c2e535316a6eef4c34f004d2b9a4e2700bd6e2acdd564c3c80cc68a303f5fb091cb4340f0a" }, { "secret_key": "42dc16c57fb6f128945fa101e05bbf548ef7d97726b692fe404069cc57ccefa0", "public_key": "0a1ba5df523996f954b34ddcfabad3f3dee21a5fa7a4ce322d216bd8ccaf438c", "message": "f2714c23a3a6fc11ad15c980b7350fc84217877661188055ff750d82c49c5fef7bc8e6aac574a1b79a3f26d16969c0f406eeab3e9e12850a55709745e30dffa62a69dfb2b64b3c1bd2bc3586e26d4eea714d2a7b71cf79fb8ffbf2aaad00ca3e4f2b6f503cc1fef2eab3656fb44f8d62a8db8ab58f394693949eea57fafecf005f6ebf1287dba4d2d623c02ea171f567e526add20709ebcab962f83d98ef668ebd01ef20488b3665e3a446fbfb13d34050942c749bb2dffc766367fd452e68e5b0c6", "signed": "c75977e83bcfe9df7292a860ed972555b5c24416fd4b7ee3285388fa5b1447608e4a347813cfe093512a7651e422e9867db7b97c0b0867f0b8c7b7f4f02c310df2714c23a3a6fc11ad15c980b7350fc84217877661188055ff750d82c49c5fef7bc8e6aac574a1b79a3f26d16969c0f406eeab3e9e12850a55709745e30dffa62a69dfb2b64b3c1bd2bc3586e26d4eea714d2a7b71cf79fb8ffbf2aaad00ca3e4f2b6f503cc1fef2eab3656fb44f8d62a8db8ab58f394693949eea57fafecf005f6ebf1287dba4d2d623c02ea171f567e526add20709ebcab962f83d98ef668ebd01ef20488b3665e3a446fbfb13d34050942c749bb2dffc766367fd452e68e5b0c6", "signature": "c75977e83bcfe9df7292a860ed972555b5c24416fd4b7ee3285388fa5b1447608e4a347813cfe093512a7651e422e9867db7b97c0b0867f0b8c7b7f4f02c310d" }, { "secret_key": "90b455c6bb9cec83e137357065339d030525d0ea7f5b923a2d5972c3c12aa37b", "public_key": "5cef038c16bfa4b4c923a0fe70cd7f25c8bc837fdf5a7efb9d95f21b96be925a", "message": "c62cfdb9d21eee6be47f30727aaee51f0703789a431d32228533350217a93a18900669c95956f3f2ae90dc745a71e18340d058d16b4c6fe33b64af8dad973fe5dc02e8520705c7a8bb3ccbe1838c6c249337f9b6a4c0e1f8a4e5d103196fa79998923d0422e9d079a72cc2a8f86d659031a607d4cca0b947b3abeeeef64c28da420d05de665a5510fe55f77598ecad7faa0ac284800b53829394c4ae90be66678ff04ab46da265ae06402d8c83cad84d61a051de0260559888e779f74b72a5d71c132f", "signed": "c9345eec2c4a0aec732386494a69a3fce8b8a1be366bbed1659f131fe97cc037fb1b7c1b68b0f3023945d20090a0cd2c1553a47faec4d66fd816ce121168f309c62cfdb9d21eee6be47f30727aaee51f0703789a431d32228533350217a93a18900669c95956f3f2ae90dc745a71e18340d058d16b4c6fe33b64af8dad973fe5dc02e8520705c7a8bb3ccbe1838c6c249337f9b6a4c0e1f8a4e5d103196fa79998923d0422e9d079a72cc2a8f86d659031a607d4cca0b947b3abeeeef64c28da420d05de665a5510fe55f77598ecad7faa0ac284800b53829394c4ae90be66678ff04ab46da265ae06402d8c83cad84d61a051de0260559888e779f74b72a5d71c132f", "signature": "c9345eec2c4a0aec732386494a69a3fce8b8a1be366bbed1659f131fe97cc037fb1b7c1b68b0f3023945d20090a0cd2c1553a47faec4d66fd816ce121168f309" }, { "secret_key": "dc185c2ba0b378dfe5dda510c32feff535ca2e8a02434b326e0158bc878e8848", "public_key": "33d6cc05a434e419280d5864a1af209a2c676814b70f72f8141ac7e0573ee63e", "message": "e276b11912cca5a84bba650c172aef3a4d5f91ac722913bb891a3ab0424ab07ea709cb8bba3a3d11f82f51c2af0162a82f7219ce27b35a30507d536a930817e40f85a22a5a432b94d192c3c8911777cfdb7fe937a67502770d6d75753d3ae88229e08f1ed23b4328d862ac61863c063ea9848f8ab96a0213d7b936c48fe754836c98487859d199b3d940392716a1d569e6c0cb1ba918932cf88525e256c8abb11aaf0b454655d5db55713cebba287ae202651ac872bfc80feaa7e00d47c0be38e658f7c5", "signed": "f1e44514d2ecbcc8d1a7e84bf584ce731835e9894f88974f098d456b60718f575ef4d8062f2182504250cf83bb2af2a79b1f58a6a97bd98da467132d7bec2f05e276b11912cca5a84bba650c172aef3a4d5f91ac722913bb891a3ab0424ab07ea709cb8bba3a3d11f82f51c2af0162a82f7219ce27b35a30507d536a930817e40f85a22a5a432b94d192c3c8911777cfdb7fe937a67502770d6d75753d3ae88229e08f1ed23b4328d862ac61863c063ea9848f8ab96a0213d7b936c48fe754836c98487859d199b3d940392716a1d569e6c0cb1ba918932cf88525e256c8abb11aaf0b454655d5db55713cebba287ae202651ac872bfc80feaa7e00d47c0be38e658f7c5", "signature": "f1e44514d2ecbcc8d1a7e84bf584ce731835e9894f88974f098d456b60718f575ef4d8062f2182504250cf83bb2af2a79b1f58a6a97bd98da467132d7bec2f05" }, { "secret_key": "90721c43bc366f24bf4e8c993e138024682f1029dba35abeb0d60c7fa710021c", "public_key": "7c63a2f13b7b220a0bb752e3800753b8b6b32669378ce131bb77a9a8d230e9ae", "message": "651c9617cac958c7edd4a5f3fedfb83dc971abfbb69a31e898cca8472ef068034a6d2376ee0e72d0a9bfee275796c3795adac8ebe1d12b66ec268f6b75fa3941154f99e223faf2cbab5b92e2b3ba7b79be7700ef9dba69253cce5356b0c4e74703cfcafdb5546850b46232675c90c02d5e426d33d60cebf0c7930182379dbb007f536163c8ddbbd3157bb2da62340133f00ae2682ec6baa6416b5a01521cc10e04695295f2e5b94c05f00383ffe954830797f6df823172532f98165fe314ab325929af8385", "signed": "d2064a6d6c99c6c3f152d2d435f24e34b5459b082ef11e944a77ff54ddf9862737ecb2ac8d54207d36c51ad41f36490a111ba80e126bfecb09def6accbdf880e651c9617cac958c7edd4a5f3fedfb83dc971abfbb69a31e898cca8472ef068034a6d2376ee0e72d0a9bfee275796c3795adac8ebe1d12b66ec268f6b75fa3941154f99e223faf2cbab5b92e2b3ba7b79be7700ef9dba69253cce5356b0c4e74703cfcafdb5546850b46232675c90c02d5e426d33d60cebf0c7930182379dbb007f536163c8ddbbd3157bb2da62340133f00ae2682ec6baa6416b5a01521cc10e04695295f2e5b94c05f00383ffe954830797f6df823172532f98165fe314ab325929af8385", "signature": "d2064a6d6c99c6c3f152d2d435f24e34b5459b082ef11e944a77ff54ddf9862737ecb2ac8d54207d36c51ad41f36490a111ba80e126bfecb09def6accbdf880e" }, { "secret_key": "9cec246758e412e7378b4579eafe9fac5a25d5405f9270b5d7e543414ec3d5da", "public_key": "975a9e6a152caebb2f9dd0deb76dd922b6dc77055dda03fbae9e7c685d073aa1", "message": "17ec9bd47add6ccfbd787af0d9013e9cc979aaf850e09426d3b28edfd71296eb31ff8b21c5fe7be050f536324c3ec48850e0b508a36bb4cb7e754b327183a1b394d88a7941d1ce8dac62a5d8291874d78485e51f29ed05865a206e52ecb12c5d107d4ff96f25d3c5d181d2c4ba6463600db1cca32857fcf597cbdfb2fda2708a8aba281b43c3d28c4a4e7983361509f61a1074e6f0ad6101c7b567ee4078e9839c47f46531b729ff0efeef7c9d1a8d833d9c0f42812a34187c3a778c165c09d6459c9c7ceaa2", "signed": "9bad1e3b1279ef658f4d071644c63ae2b7a780357e9dc426f1650ec0634dfc520f8eda9dc8f10aa7324c5942d2347ff8802bd90e95fcec313352cdae64f32a0417ec9bd47add6ccfbd787af0d9013e9cc979aaf850e09426d3b28edfd71296eb31ff8b21c5fe7be050f536324c3ec48850e0b508a36bb4cb7e754b327183a1b394d88a7941d1ce8dac62a5d8291874d78485e51f29ed05865a206e52ecb12c5d107d4ff96f25d3c5d181d2c4ba6463600db1cca32857fcf597cbdfb2fda2708a8aba281b43c3d28c4a4e7983361509f61a1074e6f0ad6101c7b567ee4078e9839c47f46531b729ff0efeef7c9d1a8d833d9c0f42812a34187c3a778c165c09d6459c9c7ceaa2", "signature": "9bad1e3b1279ef658f4d071644c63ae2b7a780357e9dc426f1650ec0634dfc520f8eda9dc8f10aa7324c5942d2347ff8802bd90e95fcec313352cdae64f32a04" }, { "secret_key": "d1403f63202e080525843bde255eeb6b6783c1caae9d6ed00ba60805bed1941f", "public_key": "238aea3ad6d6f27783e70516bbfcca4770366b50ed0fe6a4e966b53af121a721", "message": "c4f17d442fba4ca0df8dc1d0628d7d7f36b60b5758d7c13b80b8f97a62124d96a23b279565495a8accab5997115b13a4ba220a73957eb7930520acbbfb6f54cf68726b6450c6ffa9470b055ea262914e2bc612633f1ac3d0618a23dff188a733d76bcbcc460f52ab61e19938f9c8caaa792c208d1f6c754728905fda51d881a347a53da744d3baadc0a76c474c558680269095f9084a74471d5c09ffc29141b5bfaf4954dfacbca663d037b17ebf9559882233e5ca5a8bf75cca4fc9c5a4109f32e145f3853b17", "signed": "8e60e73c063816795e29f5d64ece1159f1b5d5021a6f8f655e261a4d0026f5b94ff2923250499d995298480512e4126276aa4a226d015a95827b3ce692e23302c4f17d442fba4ca0df8dc1d0628d7d7f36b60b5758d7c13b80b8f97a62124d96a23b279565495a8accab5997115b13a4ba220a73957eb7930520acbbfb6f54cf68726b6450c6ffa9470b055ea262914e2bc612633f1ac3d0618a23dff188a733d76bcbcc460f52ab61e19938f9c8caaa792c208d1f6c754728905fda51d881a347a53da744d3baadc0a76c474c558680269095f9084a74471d5c09ffc29141b5bfaf4954dfacbca663d037b17ebf9559882233e5ca5a8bf75cca4fc9c5a4109f32e145f3853b17", "signature": "8e60e73c063816795e29f5d64ece1159f1b5d5021a6f8f655e261a4d0026f5b94ff2923250499d995298480512e4126276aa4a226d015a95827b3ce692e23302" }, { "secret_key": "bdf6bdc31ab0b5313784483abeca6ea5e9cdc68f81b21f350d09c3907bb9b6a1", "public_key": "03627712b755e5069fb9ab8f9e899724029a7f268af9398821eeec9360c9285b", "message": "90a66aafa5642a98e79f0d88147080167b11e4466518f195cddd8940d12ee4918d31a6d4cb77d0bf5af29983bbe5085610a79daf0c75a78ccbcffbbdab2189c394ae24e265bd8c55fd3f4098e1b175577549518e7a4dcf7452086dd1278dd58ea4c0aa690e917951ef39fcff60cbfa1e90910bab5374928d4722f702bf5ad6028ffda6541fa5ba1a3779ec78b0a95fe3850c748b6c8f42f330ec79541a52a1cf57db72df4f92ce7f748aeef1af33bc5ae0a82c89dff216f23aec168a7dbb510aa632daabcc971b3f", "signed": "38fac603ed246f833f1c0fd4585698b0a71305eff0d14a0049b3cef073bd036dd451b3dabadaaeaea2aeaf83d395746f4e86866ada971cbe482edb0419332f0e90a66aafa5642a98e79f0d88147080167b11e4466518f195cddd8940d12ee4918d31a6d4cb77d0bf5af29983bbe5085610a79daf0c75a78ccbcffbbdab2189c394ae24e265bd8c55fd3f4098e1b175577549518e7a4dcf7452086dd1278dd58ea4c0aa690e917951ef39fcff60cbfa1e90910bab5374928d4722f702bf5ad6028ffda6541fa5ba1a3779ec78b0a95fe3850c748b6c8f42f330ec79541a52a1cf57db72df4f92ce7f748aeef1af33bc5ae0a82c89dff216f23aec168a7dbb510aa632daabcc971b3f", "signature": "38fac603ed246f833f1c0fd4585698b0a71305eff0d14a0049b3cef073bd036dd451b3dabadaaeaea2aeaf83d395746f4e86866ada971cbe482edb0419332f0e" }, { "secret_key": "57b3b14ace1cd0cd603e6328bd219ee7d9d094487fa668f28aeec02b43c909a7", "public_key": "24e6b6395f97ea0e237186d469b71923d2113adf403beeeb4a2d27909aaf3eda", "message": "b2e0dedd802eed996dbd5836bf8688b0d1201bf5442ff9bbd351aeefe1a0c21fea2b5c9fe5edee47e921099b05aedaa80367c1ce08821d783a5b64cf059c0f4335083986a5a6ecff8c84fd40e0ba5dd5e5d2f01112a84ce5cf8e0db78beb182d9139c0b0f3e0060a3fa73869e96423f170df9af1cb9c35566d87dff542223f6d439bdb54729d366aff637b0f36a5d14b15d612bd03076cc4d04c1f25b3ba84e0d1fe474e5718d1a17d5a488465662ee4c3f664b4c9274b649d78cea4e85243f3713239048a908ce3e1", "signed": "fc79fdc6d090887a61e43c6b9187b657d2e4d9cbafd6e7caeb7ebdea842825b78fb949d2c49a0cf38b6c73296d82c8ddeb1fe2d40aaddd7964da68acf8c66f0eb2e0dedd802eed996dbd5836bf8688b0d1201bf5442ff9bbd351aeefe1a0c21fea2b5c9fe5edee47e921099b05aedaa80367c1ce08821d783a5b64cf059c0f4335083986a5a6ecff8c84fd40e0ba5dd5e5d2f01112a84ce5cf8e0db78beb182d9139c0b0f3e0060a3fa73869e96423f170df9af1cb9c35566d87dff542223f6d439bdb54729d366aff637b0f36a5d14b15d612bd03076cc4d04c1f25b3ba84e0d1fe474e5718d1a17d5a488465662ee4c3f664b4c9274b649d78cea4e85243f3713239048a908ce3e1", "signature": "fc79fdc6d090887a61e43c6b9187b657d2e4d9cbafd6e7caeb7ebdea842825b78fb949d2c49a0cf38b6c73296d82c8ddeb1fe2d40aaddd7964da68acf8c66f0e" }, { "secret_key": "018a2c3deea50ab506751f9c2adaadfd9e2192121609931684eb265e193e7f89", "public_key": "af410bdddefc644ef12c9899ff71b9e1d0dfa3d69d8c2cd676c1916b34591cfd", "message": "cf7813efac12ad1c7c7322ccbe54aa0e9a8ba4fd4345b06e4ce7a35c8b1cd5e3f7f0688533849ba2cf4c75b6f20926a1194a72df0e1b1b34456a2133112d006722fe811d5e40c4121159ded88990c0ac2bfd34f35af4f07cc402e9a381a675d03fec7ec438c4ad9d929aec8f242def023c993c9e8ba18c7428e88fde68a4711e506d7969f63c8e0bc83ff0de4e1336106c05e09d5922400e8a81bf54885667899785882b70f20dd8fb1e75f5855b765a256da4341bf23ea0ffa18aadda381816946001045669c8d04df0", "signed": "7a44e6a31932dee6dc2d8394e29a6551d13e6c6ffdfa218fa5b998668d8439db5e05379fbfa0da5b563ed966435ae2c54e3ad16e1a9fca1f5a157a080704ab03cf7813efac12ad1c7c7322ccbe54aa0e9a8ba4fd4345b06e4ce7a35c8b1cd5e3f7f0688533849ba2cf4c75b6f20926a1194a72df0e1b1b34456a2133112d006722fe811d5e40c4121159ded88990c0ac2bfd34f35af4f07cc402e9a381a675d03fec7ec438c4ad9d929aec8f242def023c993c9e8ba18c7428e88fde68a4711e506d7969f63c8e0bc83ff0de4e1336106c05e09d5922400e8a81bf54885667899785882b70f20dd8fb1e75f5855b765a256da4341bf23ea0ffa18aadda381816946001045669c8d04df0", "signature": "7a44e6a31932dee6dc2d8394e29a6551d13e6c6ffdfa218fa5b998668d8439db5e05379fbfa0da5b563ed966435ae2c54e3ad16e1a9fca1f5a157a080704ab03" }, { "secret_key": "bea445e9b6d3f21235912cd6c42ec0577297ca20a10357880c2b846dd8e2cc77", "public_key": "024174966221699ea4b0a37e517ff9b16598ae4d4e83bfa3ca50bc616841f595", "message": "4743c7c099ab815927b3674d0054b6de59af2811abc2cf7fde08f62929185adc238fadd5e75ae3ba0036ff565a79405b424f6552331e2789d9709ac1ecbd839aa1e91c854817597958cc4bd91d07377507c2c8d3c006cfeb6c0a6c5a50eee115e21153dd198ea0a3aff62b7075d5a461788783f050e659c572963d7a59e5afaa2b9c501f43c6ac08ab4797c4566d22b93cdf65a99a2a1d638e79f72b5f4631fe5e9e5f968f6db7a1880df51d8febc14942672f8ea6fc3a72814a44d66d148420a69000f68c330de5b80fc6", "signed": "6964b9c5903e74e99328acef036558eecd3369150a52e2cbad4bbb97d461b3dfc6b3e8455813a4f4bdca46302e02e683ecea1820171c538e54c3de6c954aa4074743c7c099ab815927b3674d0054b6de59af2811abc2cf7fde08f62929185adc238fadd5e75ae3ba0036ff565a79405b424f6552331e2789d9709ac1ecbd839aa1e91c854817597958cc4bd91d07377507c2c8d3c006cfeb6c0a6c5a50eee115e21153dd198ea0a3aff62b7075d5a461788783f050e659c572963d7a59e5afaa2b9c501f43c6ac08ab4797c4566d22b93cdf65a99a2a1d638e79f72b5f4631fe5e9e5f968f6db7a1880df51d8febc14942672f8ea6fc3a72814a44d66d148420a69000f68c330de5b80fc6", "signature": "6964b9c5903e74e99328acef036558eecd3369150a52e2cbad4bbb97d461b3dfc6b3e8455813a4f4bdca46302e02e683ecea1820171c538e54c3de6c954aa407" }, { "secret_key": "6447540ed7be0a11c2a8de793d83c6e244983db18d78ec9d75f1729c92e0fdf1", "public_key": "391212c8edc4d334a5bec860ef0f5ebb5ec44e8bb51c0f6741998959b2b379fc", "message": "a4381c7638c48799e9b5c43f67fc3aa3cbb5ec4234f37e70ccccced1627a57683d1e53f4e0883d8b462bf83f1308630368c89b491533ddb8c9a5b9e8155002fdd581a9a5be0e430b9086a6beac4720210f87b14e862d97e5cc69286786a7586723f231ef0e3e1b932dbba3a18a0cb221cb07f80e6a8e1300056c13e702b23bfb3250ec7cc864d5c7ec5786240709c56024ea6be5f7b15a4fa5555e39a744a1dc557df5b948db220b3d5745746691dacb4421641cdcc12e7ec0450293f19ec57b09cff135847aabe446a61332", "signed": "3ab5f88e2f7276b5b6583dffba5639993a905dbf9b88ceeaaaae3335800e4a5f10f83da6d6225a8dbe99ae80075009dd508786b3975113db478e14ba101bee0fa4381c7638c48799e9b5c43f67fc3aa3cbb5ec4234f37e70ccccced1627a57683d1e53f4e0883d8b462bf83f1308630368c89b491533ddb8c9a5b9e8155002fdd581a9a5be0e430b9086a6beac4720210f87b14e862d97e5cc69286786a7586723f231ef0e3e1b932dbba3a18a0cb221cb07f80e6a8e1300056c13e702b23bfb3250ec7cc864d5c7ec5786240709c56024ea6be5f7b15a4fa5555e39a744a1dc557df5b948db220b3d5745746691dacb4421641cdcc12e7ec0450293f19ec57b09cff135847aabe446a61332", "signature": "3ab5f88e2f7276b5b6583dffba5639993a905dbf9b88ceeaaaae3335800e4a5f10f83da6d6225a8dbe99ae80075009dd508786b3975113db478e14ba101bee0f" }, { "secret_key": "0c587a811add88b994458c3c808ac4e3a83afab26d4cff5c961b9df0b5c83344", "public_key": "06783b0cdcc5028c5638bd748f0bc76f7e94d1aa2015ca948738a3500460aca0", "message": "f56dc6b76076325b2126ed11d1f09decef9d15c31d0e90cdb1a27e089cc56329f6ec3f665eb6739ec5678b3f37ee1fb37deb9e240092b7a88fd25525acd55e294eb1046f9b1b69a847eb9ceb7b1593b9f6978ef618c15de4e059ecc3bfda3297a19c2df202adf72155cf21eabd03948df15198e8a68b0884f93ad5e36eb0983cca30e45a8b4b5fb8136fdea8a3341dd7877540a557debf7530cc33aeeef6271c3f0af6d09787e815f2f1dd25ce4d2fd09ffa9f53081b469c500da4d44180c04eb1869329cbf2d823187e831c24", "signed": "33b4f4274f20008a721d1e8d054a2b4e95327e38bb07b33c4bee7e1ce020a442fb2627eda3b7ac93cd3ab0b12b99935a1a9233111604da4acffb5315b907120bf56dc6b76076325b2126ed11d1f09decef9d15c31d0e90cdb1a27e089cc56329f6ec3f665eb6739ec5678b3f37ee1fb37deb9e240092b7a88fd25525acd55e294eb1046f9b1b69a847eb9ceb7b1593b9f6978ef618c15de4e059ecc3bfda3297a19c2df202adf72155cf21eabd03948df15198e8a68b0884f93ad5e36eb0983cca30e45a8b4b5fb8136fdea8a3341dd7877540a557debf7530cc33aeeef6271c3f0af6d09787e815f2f1dd25ce4d2fd09ffa9f53081b469c500da4d44180c04eb1869329cbf2d823187e831c24", "signature": "33b4f4274f20008a721d1e8d054a2b4e95327e38bb07b33c4bee7e1ce020a442fb2627eda3b7ac93cd3ab0b12b99935a1a9233111604da4acffb5315b907120b" }, { "secret_key": "66cf401a2142fcf4a8018046cf4140bca18d76ef6266e7a024757df172a5d653", "public_key": "67d48dfd23743cc2ca40e4dfd6b8cc5d84be82dd2b1120cc476e6af6f25ecc98", "message": "daa8efb3fd41f12fbc55bd60464157a26d718632d882aedb6bf98e47dd2337879e0b46452e062e6dfbff3e7bca7289e4ef6b3f41d4b03bdc2c842afe97f3029883ed45f6054dde9690649abb2b8dc28f5fe8cecf80fc1ea411bfc40bbf4fd20b218cf47ea8ee118d4d5aefa5c1bfa08a8fb1b30d6de0977cd15e50292c501f2e71ce2740ff828b8432da5a594bab5223760b64792ed3a69dd75e2829234943656513df1a17a2a067a9a8eaa64e19569f46939d34b99271ae50a47d7dbca3620c81255b0e1fd1f3cec851f1b11b35", "signed": "d6b0e80e60bc1b29ab8f74808fc460847795ccb887bac0ecaa8e135297a85097712b24b0a1fbaf7a67c5d530a47d0643fc8702c059d215fb112dbe475e5bca0ddaa8efb3fd41f12fbc55bd60464157a26d718632d882aedb6bf98e47dd2337879e0b46452e062e6dfbff3e7bca7289e4ef6b3f41d4b03bdc2c842afe97f3029883ed45f6054dde9690649abb2b8dc28f5fe8cecf80fc1ea411bfc40bbf4fd20b218cf47ea8ee118d4d5aefa5c1bfa08a8fb1b30d6de0977cd15e50292c501f2e71ce2740ff828b8432da5a594bab5223760b64792ed3a69dd75e2829234943656513df1a17a2a067a9a8eaa64e19569f46939d34b99271ae50a47d7dbca3620c81255b0e1fd1f3cec851f1b11b35", "signature": "d6b0e80e60bc1b29ab8f74808fc460847795ccb887bac0ecaa8e135297a85097712b24b0a1fbaf7a67c5d530a47d0643fc8702c059d215fb112dbe475e5bca0d" }, { "secret_key": "5dbf885aa598e895571f5f65090b72323e9d70b0f58110687afbbc383afedcac", "public_key": "fa17eba76e3bc3ea6dab3a5b120dc5ecb9ae6f00138f7d36dda9268bc4722174", "message": "1e0b6cf15ce03337179c02d65408df5be9200c3782b6004af94ea4decb257999d6fdff301d11d00c98c372fac0d026cb56dfefe3def7eb99ac68d6968e17124d8446f53e8d2d3dd890d37a23c7e0b83a484b3c93bddf6c118e0281959d27bd87d37e843d5785f4a40771398494e6c4322fbb675c1d479321032148f7fe52564ddf7ae7ac269d0cd2e552fec589aeae0fb93fe3eeaef0856096cf4f6b3497e7235cc8494d810a0b46c5eac87f187e505bb7764f8045c9541983f7b025698009a23d9df0bd1a473cbee4cf5e9488ecbc", "signed": "e1429dab2e42cd035b7fc602efd6baf94706f16eaf2f8b5fed329239e875605fb172f5dd9ae2bc2eb42eb474567e292f5206e82e694bca0d6d433b867634cb0d1e0b6cf15ce03337179c02d65408df5be9200c3782b6004af94ea4decb257999d6fdff301d11d00c98c372fac0d026cb56dfefe3def7eb99ac68d6968e17124d8446f53e8d2d3dd890d37a23c7e0b83a484b3c93bddf6c118e0281959d27bd87d37e843d5785f4a40771398494e6c4322fbb675c1d479321032148f7fe52564ddf7ae7ac269d0cd2e552fec589aeae0fb93fe3eeaef0856096cf4f6b3497e7235cc8494d810a0b46c5eac87f187e505bb7764f8045c9541983f7b025698009a23d9df0bd1a473cbee4cf5e9488ecbc", "signature": "e1429dab2e42cd035b7fc602efd6baf94706f16eaf2f8b5fed329239e875605fb172f5dd9ae2bc2eb42eb474567e292f5206e82e694bca0d6d433b867634cb0d" }, { "secret_key": "84b3aedd4797a565c351de7dfa0700b9ff7c4d7291c8808d8a8ae505cdd22590", "public_key": "d7ad72caa7c22209ec4678d11d5590a6cb28a07117fe5aef57b50751583201a5", "message": "532567ffa53b5c0fcd29c39499d2e78ecd20e63123499240e775088b394dc65c8baaa0fe8f6aa7e70181f9e10add8b4a8beb0b2ec38a43309f100cd4be91c6f48e79dc0aee93a15c9403773b354a8d42ed48d8f276230fa6de5ada501ee0a653b4458f0ecf6d5b3c33e2141c662f6ea055f741e54586917d2e0c4eb2b56621f9665fef3246f0bd800b533e3bc615c4021f8d0e2ad233a11e7736c493acc31faee76a097dc40db9efc22446eacf1cc18f51fd10236a2f942d0a53c3ce209108b5938c0a9e536b89ef0ad6b405a10f22c3", "signed": "9220f0edaaaee1b876350dbe9266061767b86296c351d4cac99d07cd612c6efb24f8f9b0b975f95c42c5b6afedc892f87efedd39d5160294c27658bdcf42850b532567ffa53b5c0fcd29c39499d2e78ecd20e63123499240e775088b394dc65c8baaa0fe8f6aa7e70181f9e10add8b4a8beb0b2ec38a43309f100cd4be91c6f48e79dc0aee93a15c9403773b354a8d42ed48d8f276230fa6de5ada501ee0a653b4458f0ecf6d5b3c33e2141c662f6ea055f741e54586917d2e0c4eb2b56621f9665fef3246f0bd800b533e3bc615c4021f8d0e2ad233a11e7736c493acc31faee76a097dc40db9efc22446eacf1cc18f51fd10236a2f942d0a53c3ce209108b5938c0a9e536b89ef0ad6b405a10f22c3", "signature": "9220f0edaaaee1b876350dbe9266061767b86296c351d4cac99d07cd612c6efb24f8f9b0b975f95c42c5b6afedc892f87efedd39d5160294c27658bdcf42850b" }, { "secret_key": "6950bfcf480b98ea18a2d5ae5ba6e7668f4c283ff2711357740ffe32cf25819a", "public_key": "8e4c6f233f7b86321c9d6799bac28aafcd2503d7aa0a7bded8722727fbbcaeb8", "message": "a401b922aba57ee0c6ac1c8f1b48296a8562eef137526893886a08306e2203667788618b939864467a31f16edce152a42c25546b640ea8bed189a4f89886a37f106911eae1f50081bf795e70c6504437d2a80cb839479ecbb87c129bcc5fe31d716ef978c206d7f08a793466594f4d75e215bb6374596f8e7d00eea724780943e89bd3863c951bbd24efee23c97c2c797c7fafbf8f2c8b43f37a5f881129a09573fa7a034a285e80dc4ba4bc9564a4dcedeb33167e0b30c5a00b9a109a2231cfa0012b29b2b3450b892eccef0808e503f8", "signed": "94de5df7a25ecd70205d40bc9499fc7cd7136568060a419a93be6e318664bb6dfce60e2d4e633f7ec148fe4f834ed277c1fec4c4e2a86f44c4589c817888db00a401b922aba57ee0c6ac1c8f1b48296a8562eef137526893886a08306e2203667788618b939864467a31f16edce152a42c25546b640ea8bed189a4f89886a37f106911eae1f50081bf795e70c6504437d2a80cb839479ecbb87c129bcc5fe31d716ef978c206d7f08a793466594f4d75e215bb6374596f8e7d00eea724780943e89bd3863c951bbd24efee23c97c2c797c7fafbf8f2c8b43f37a5f881129a09573fa7a034a285e80dc4ba4bc9564a4dcedeb33167e0b30c5a00b9a109a2231cfa0012b29b2b3450b892eccef0808e503f8", "signature": "94de5df7a25ecd70205d40bc9499fc7cd7136568060a419a93be6e318664bb6dfce60e2d4e633f7ec148fe4f834ed277c1fec4c4e2a86f44c4589c817888db00" }, { "secret_key": "61b260f5b848b271ef48e5a56d297432d89f2ab85bd538fa668870d0560220e5", "public_key": "6086fe8735f399f1af2e395e0fdfb5629ebcb04b6ed4a54a9e47052c6e8191d4", "message": "2826295d79945f675476bc4d45ef800d80b1f0398e4be60e3de4571ed108df989f032de6c2345d9948d677927ea0b8cf1a5ca36fd5f23c25dc0d2ab5bd565a54af46fd97d338d770e3a7b47efb54c07a1664707771eb4e37d9d70ba779251dcdcd3bf6d1248adec53f787259c4d594d5fd4ced8e3db7621d4965d48298178124931a3d0cd269b2d53b7cd261b96d370c5d9693c8ad133ed58945ee3540e10625d924aeba9bdafc656100aab276fa996b1db477bf85ea559081d5b4c7307dc1595654aca82f7b6d2ddaf7357c15a4d7d8b908", "signed": "9828fec8ff5cf85a98f450770b5bdb4b80daca44379d8f53c91c348e22df64ac48f2b6e2a7b3b642bc8193a194316229e69447ed241cd423d83b6fe7b2d44b002826295d79945f675476bc4d45ef800d80b1f0398e4be60e3de4571ed108df989f032de6c2345d9948d677927ea0b8cf1a5ca36fd5f23c25dc0d2ab5bd565a54af46fd97d338d770e3a7b47efb54c07a1664707771eb4e37d9d70ba779251dcdcd3bf6d1248adec53f787259c4d594d5fd4ced8e3db7621d4965d48298178124931a3d0cd269b2d53b7cd261b96d370c5d9693c8ad133ed58945ee3540e10625d924aeba9bdafc656100aab276fa996b1db477bf85ea559081d5b4c7307dc1595654aca82f7b6d2ddaf7357c15a4d7d8b908", "signature": "9828fec8ff5cf85a98f450770b5bdb4b80daca44379d8f53c91c348e22df64ac48f2b6e2a7b3b642bc8193a194316229e69447ed241cd423d83b6fe7b2d44b00" }, { "secret_key": "936dc1cef6a310747f350088055a39aa762d9a4b52c8c8e4c682794380c2725c", "public_key": "03b31800412df4d56f1532c05828c0b72528a67a781bef4c06c1fb6ff2ce324b", "message": "eb58fe86c4ef349c29ae6fb04f10850e38c6823dbe64a09a5bf1e0ce600d394efa6fb96ed6a8f2c9d4bec05e6a5ebd5a1bf4d0c51db934e57b79e5c6a879d975197dbb10475f65c7f8a8c6a77a420384b5062a2740f1401740ee0f5e043aad7a2a2b4260c5d907f705edaf65b0e375dfc7b00bd660db6147f2ebe870a0ee18dc2ba3c92b0b76fae2b90932cdb6c149e46f3feecf4c26f0441f3a9e006678aecff8ccaecaeda73a18a68ac988b62e83a9bb5188aede38df77a9a164abbdd9d58e52a6caf7222389f198e85fbf966236dcdbd4c1", "signed": "3f994b8ef528f6421c6a6a22e977ade5cee887263de38b719acd12d469bfd8c3f68e7ac07d2fae80a2092778df0b463537ad3a0551997a3d5b51f832d9c8230beb58fe86c4ef349c29ae6fb04f10850e38c6823dbe64a09a5bf1e0ce600d394efa6fb96ed6a8f2c9d4bec05e6a5ebd5a1bf4d0c51db934e57b79e5c6a879d975197dbb10475f65c7f8a8c6a77a420384b5062a2740f1401740ee0f5e043aad7a2a2b4260c5d907f705edaf65b0e375dfc7b00bd660db6147f2ebe870a0ee18dc2ba3c92b0b76fae2b90932cdb6c149e46f3feecf4c26f0441f3a9e006678aecff8ccaecaeda73a18a68ac988b62e83a9bb5188aede38df77a9a164abbdd9d58e52a6caf7222389f198e85fbf966236dcdbd4c1", "signature": "3f994b8ef528f6421c6a6a22e977ade5cee887263de38b719acd12d469bfd8c3f68e7ac07d2fae80a2092778df0b463537ad3a0551997a3d5b51f832d9c8230b" }, { "secret_key": "f89eed09dec551361fa46f375973d4fbfa5c5c12f1b5e5abf45cfa05ff31a340", "public_key": "3e0efdca3919fa10d4a849cef1de428851bd08efd248594fd89cdeb9deee43b0", "message": "4cf9773da05fd322fc147be900ef5cf256c88afdad4b08c230dfc8981fb69f476f7d45ef7c9006bc10032ba53436ac22843e0d76289cf68f9818fa64031d4b40955059aa69110915889f5e22732a1343912581ab3b11a3bae7a471359508596575f888160beef966e5708f0e3147eacfcec1caa3ef240c5e0a14c186546c8eeb64658350b1affc0cfd2ac213af670afca7bbc9dddd28a465b586e69c388cd73478d68efb322bdf86d9213011e711b2b95fefa7bb9b5939761706aa7121024906420bddf1d8800a4338d938fa137cf27e9ffc51c6", "signed": "897e6f2797c3f326d2cdb1d2673d360631f063304580ff5b4eb43d39ad6851834c9cf891d9f0905bf8de075f7635dfca601adc0f14e7b2c76f7571bfa468ed0c4cf9773da05fd322fc147be900ef5cf256c88afdad4b08c230dfc8981fb69f476f7d45ef7c9006bc10032ba53436ac22843e0d76289cf68f9818fa64031d4b40955059aa69110915889f5e22732a1343912581ab3b11a3bae7a471359508596575f888160beef966e5708f0e3147eacfcec1caa3ef240c5e0a14c186546c8eeb64658350b1affc0cfd2ac213af670afca7bbc9dddd28a465b586e69c388cd73478d68efb322bdf86d9213011e711b2b95fefa7bb9b5939761706aa7121024906420bddf1d8800a4338d938fa137cf27e9ffc51c6", "signature": "897e6f2797c3f326d2cdb1d2673d360631f063304580ff5b4eb43d39ad6851834c9cf891d9f0905bf8de075f7635dfca601adc0f14e7b2c76f7571bfa468ed0c" }, { "secret_key": "400796ef60c5cf4084dee1801c4a1975e482e70aef961cd42e2fd5a3fa1a0fbe", "public_key": "f47da38128f2d012cc5797571d479c83e7d8a3409802f9a7d976c27067cbbe43", "message": "c473325e785b27df4471eefb9ebebd6461d570800181100ff36caf3c38f67c1921b157ec8e6126f955aebd90ea3fe5385f8042cd704b27cc1d6978c0e2a296695f5ef97b7c2e16ae4ff4d063c688d7f46e964e1f0a00503f357345977683d6e4c3423d56bdb6ce864b6987e085e83e70c7c1a14e0e413f592a72a71e017d505b64c24f1a1a6b813e064e6e0cf8bd4571d0ff2f267a6a13e0cd430463b6ca3b88f0cd40b0fb83d5bedf6f7d47e170e87d0a750093693eda232a6daf98125727b9588ecb894ae373bae3a445a106306469a4c2cd77ff", "signed": "84d3aa3f361844396754d80d9fa05b8b2fa4abf3a0f36b639bee9cfb5c8530a3a9cc34677f92a913c41e800f2e8041f7666d07ed85f16a57d817b1241fc5ee04c473325e785b27df4471eefb9ebebd6461d570800181100ff36caf3c38f67c1921b157ec8e6126f955aebd90ea3fe5385f8042cd704b27cc1d6978c0e2a296695f5ef97b7c2e16ae4ff4d063c688d7f46e964e1f0a00503f357345977683d6e4c3423d56bdb6ce864b6987e085e83e70c7c1a14e0e413f592a72a71e017d505b64c24f1a1a6b813e064e6e0cf8bd4571d0ff2f267a6a13e0cd430463b6ca3b88f0cd40b0fb83d5bedf6f7d47e170e87d0a750093693eda232a6daf98125727b9588ecb894ae373bae3a445a106306469a4c2cd77ff", "signature": "84d3aa3f361844396754d80d9fa05b8b2fa4abf3a0f36b639bee9cfb5c8530a3a9cc34677f92a913c41e800f2e8041f7666d07ed85f16a57d817b1241fc5ee04" }, { "secret_key": "6703a6232c5e2e65e0ab3b92e2aaf9f5fbd33fb46988047d6f4d0ff5387fa029", "public_key": "047cffca8b7b11ac6eacc0eaa0c5b73c75b9c637956973af9d97b2dd5b605d6f", "message": "a26b30a769197932a3a62854968d760151612366778dc994576a2e0e0355496b46200e506948a0d102b6651b2e7334ca6c6eaef8bca44b425970a0b37d6bde0da9d3c1b9f51cbb25bc335cd6fa928a74f2c0dc2c6e99d37a12863a474d4df43aad35415ffcaa24d8c29f914572ab2abec3892db49e679c5ea220c2f519a7d033ac1a2c5a467869e30eda3d2635ca863431473f958d552bdc5582352c290d0ce4fa9cfd0ad42799c227ec90b7c9e5db9f5a7b6d569212eed94d323326805f2b3a0010d6c11eb4107c8283037652f50dc067b6dc81f4db", "signed": "cae96879e5b603be866609d4a053bfa12a51378e99b2a2812e4789267d8f32f473243f8af74b9be73f47dea50f0d165ebf49458b73e53d88580c191a182d1904a26b30a769197932a3a62854968d760151612366778dc994576a2e0e0355496b46200e506948a0d102b6651b2e7334ca6c6eaef8bca44b425970a0b37d6bde0da9d3c1b9f51cbb25bc335cd6fa928a74f2c0dc2c6e99d37a12863a474d4df43aad35415ffcaa24d8c29f914572ab2abec3892db49e679c5ea220c2f519a7d033ac1a2c5a467869e30eda3d2635ca863431473f958d552bdc5582352c290d0ce4fa9cfd0ad42799c227ec90b7c9e5db9f5a7b6d569212eed94d323326805f2b3a0010d6c11eb4107c8283037652f50dc067b6dc81f4db", "signature": "cae96879e5b603be866609d4a053bfa12a51378e99b2a2812e4789267d8f32f473243f8af74b9be73f47dea50f0d165ebf49458b73e53d88580c191a182d1904" }, { "secret_key": "e0e72f8f178633626733bcbda2ad2a50e653890f15359b6c22fc7345ad333109", "public_key": "d13cee540d84b5667d516fe7ec7239bf8da91546ee791f84edd8ffcf3a083e76", "message": "791fd613c1095292c8a4a2c86b47ae026155b8465b607dbb416477ef79a297c9d7758ce34af9dcbf1c68474f30909fbe74b7ba429632f2403aad832b486b72c23054ad42f7653a9ddb456cc791f348886a7ae5dcec7c0ba815f7a93a10fe331e903b970f7b5028be49d14bc5620d63792672b98b9488c67ae16646693e112047f0ac8921ff561c92dd0596d32df0a6e507ac1b07de516c98428d570a37db9bcd7c7e61c6948ab3fe91250dd1d5bd671275df9a972f22c2ba36804747aec1ea2416c1f41ab87befde31629b2d43317ce41cda03626286c0", "signed": "14552171b95245ac0f0e5a6e7a2f541721068db650c6dada04c28cab7c49195f6436712144cb31913c562e30c39d8a8549fb64ffea81c7445143b5f23286da05791fd613c1095292c8a4a2c86b47ae026155b8465b607dbb416477ef79a297c9d7758ce34af9dcbf1c68474f30909fbe74b7ba429632f2403aad832b486b72c23054ad42f7653a9ddb456cc791f348886a7ae5dcec7c0ba815f7a93a10fe331e903b970f7b5028be49d14bc5620d63792672b98b9488c67ae16646693e112047f0ac8921ff561c92dd0596d32df0a6e507ac1b07de516c98428d570a37db9bcd7c7e61c6948ab3fe91250dd1d5bd671275df9a972f22c2ba36804747aec1ea2416c1f41ab87befde31629b2d43317ce41cda03626286c0", "signature": "14552171b95245ac0f0e5a6e7a2f541721068db650c6dada04c28cab7c49195f6436712144cb31913c562e30c39d8a8549fb64ffea81c7445143b5f23286da05" }, { "secret_key": "544dafd9960d829756c6d4b3eadd44375fe78051876bf978a381b0decaaa8096", "public_key": "ae4f6425c1b67ccb77f9aacfea28eaef769c8cacee035205cdcd787e8d07629d", "message": "447fe7344cad1fae09d6a7d05f09d503c1b3d3d5dfa584810c35bc41e4955693706154e2d751b2f1b525e1a14547ba7f8b232088a6fc922702d93a11cd82949c27bed645dc351fb4c1242cf41d01575412e792aed214531d94fd66e03dd32e972fd77f6947a353e1ae5e00f5a6ca77992472f096b6e7475fe534e913a77bcb0d681fdfb3a7a0dcb56d274df4aa109d4a8a37794a9276f50006696ff12ca4d0254039df0fb3f72a960da05c9872f2e33ee81d1cf7a6f48bbce0aa18c7c0f06ba55e67689e0af587b500eab79cc7f9640bca104b7fbf31f08e", "signed": "a2ae117c8de4ca6d6fe75e466023bd550c26fedd3e74ca13adb625f272e175f14d5df550ace7d82288efefabf96311a123bee23889ad3711bff2b8087946bf0e447fe7344cad1fae09d6a7d05f09d503c1b3d3d5dfa584810c35bc41e4955693706154e2d751b2f1b525e1a14547ba7f8b232088a6fc922702d93a11cd82949c27bed645dc351fb4c1242cf41d01575412e792aed214531d94fd66e03dd32e972fd77f6947a353e1ae5e00f5a6ca77992472f096b6e7475fe534e913a77bcb0d681fdfb3a7a0dcb56d274df4aa109d4a8a37794a9276f50006696ff12ca4d0254039df0fb3f72a960da05c9872f2e33ee81d1cf7a6f48bbce0aa18c7c0f06ba55e67689e0af587b500eab79cc7f9640bca104b7fbf31f08e", "signature": "a2ae117c8de4ca6d6fe75e466023bd550c26fedd3e74ca13adb625f272e175f14d5df550ace7d82288efefabf96311a123bee23889ad3711bff2b8087946bf0e" }, { "secret_key": "bfbcd867027a199978d53e359d70318fc78c7cc7bb5c7996ba797c8554f3f0f0", "public_key": "7c5ae3bab9201199dfbe74b7d1ec157125bdbaa4520f501da3f248579dc6c22d", "message": "117fae13e78777b6219f020214c1b87c57046d1c09ce82ee2b5629898d9b0de74a15cfe99f80548ba913d7036c56285a4cba493b52d2cb70d6365ace3da12b1f34a2778af36ef52ab82ede04cacaf2793f5f89831e3b205a9ee4c1d6fbdab4ba4d9fae65dd79a5fe76b4b39a3092cc7148d211e85ee82ab463d34dcee9061d9c21ded2051bbd50b413f0e21a0e48d1ffa8dcae240b3495be25d93151b57aa271ab99aa708ca28080cab4804fcefa929f5f1ef3f4c6c0fbfb40bef7ea1b509b36ba1260323512379d7bc3fdbb5d3faac9b00e21f12ea1ca2e29", "signed": "e48615b65633e61993b0aaa1fafb74b9629c384fd592bd735fa1f62c5cad11291fcd8c2e91a50bfe0b03b43502fff3a5c382b9c2821907efc34da5ba054af00e117fae13e78777b6219f020214c1b87c57046d1c09ce82ee2b5629898d9b0de74a15cfe99f80548ba913d7036c56285a4cba493b52d2cb70d6365ace3da12b1f34a2778af36ef52ab82ede04cacaf2793f5f89831e3b205a9ee4c1d6fbdab4ba4d9fae65dd79a5fe76b4b39a3092cc7148d211e85ee82ab463d34dcee9061d9c21ded2051bbd50b413f0e21a0e48d1ffa8dcae240b3495be25d93151b57aa271ab99aa708ca28080cab4804fcefa929f5f1ef3f4c6c0fbfb40bef7ea1b509b36ba1260323512379d7bc3fdbb5d3faac9b00e21f12ea1ca2e29", "signature": "e48615b65633e61993b0aaa1fafb74b9629c384fd592bd735fa1f62c5cad11291fcd8c2e91a50bfe0b03b43502fff3a5c382b9c2821907efc34da5ba054af00e" }, { "secret_key": "df2df8a9d66d5638cdee09324e7b10f8ed29ab91387e3147b7dc03f7cd800508", "public_key": "5c042e157fb7fb12d4d4fef2847141ecfb57c1253e14eaf3004d6513f52fe625", "message": "21576615c9346a63dccf0c50ecbd7c6d72ad452cfed43ea73202cc7a98576056b9664b54622905a1e7221720730ac685d3bd3977ec3959d446bfa941e725b6fe16afe5432c4b4bdee7aa0fd8030948ed6fcba7c0bdb40c2e517da97456e74e1f93d5ed676de0f4a8b0aea449404bd15b6da79dc1b813965fe5572410d76f5b5eac663050570311dc9842b6fbf8806aec03151715cacf7f21802e8bf5e98a89c0d7d0d098b73c6efc09962e36b4e030c1a64b5d349f5f2042c74428671e4a2c7fea0caee2422d85c4fcddfed32213859a69955d4e3ebb7e1b2022", "signed": "9a1074531ed43d07bffc7f2b6c13b8838fc75cba02c7d1ec7ba38bca3cef20dc9badf3a3064a2c93b1842441420b6a8d421a960d70dfb7c70eec295f21f83f0a21576615c9346a63dccf0c50ecbd7c6d72ad452cfed43ea73202cc7a98576056b9664b54622905a1e7221720730ac685d3bd3977ec3959d446bfa941e725b6fe16afe5432c4b4bdee7aa0fd8030948ed6fcba7c0bdb40c2e517da97456e74e1f93d5ed676de0f4a8b0aea449404bd15b6da79dc1b813965fe5572410d76f5b5eac663050570311dc9842b6fbf8806aec03151715cacf7f21802e8bf5e98a89c0d7d0d098b73c6efc09962e36b4e030c1a64b5d349f5f2042c74428671e4a2c7fea0caee2422d85c4fcddfed32213859a69955d4e3ebb7e1b2022", "signature": "9a1074531ed43d07bffc7f2b6c13b8838fc75cba02c7d1ec7ba38bca3cef20dc9badf3a3064a2c93b1842441420b6a8d421a960d70dfb7c70eec295f21f83f0a" }, { "secret_key": "e8ee065f9907f1efa2daecb23a0425f353094da02bc2c931f0a587efc0d13de1", "public_key": "c72651b7fb7ac0337a172977496fd7f2a72aea889385835e563c6b6053a32dc1", "message": "a2f0c1373473a305d8f1d99138b06b9a9694ffaa8a88222de9f729bee1305175dfb17001cc77f67b6d40c90c1a28fb226c11286db4a13e45e69211242bcdd01cb6e2c454e76c0cab881b4d2d9d3ab100a5d61d1725d866e4fdb66d93d77f5b308693b9b5a333e57fa25d1e5d2e38df6e4e9ec84159bbee1ffea926836a0101c91483bd5bc88a6f1cc4d4e7f008ad08453a0123429dd335781c7cbf8d685a8999ed1177607004a13c4cb5ea4908c542607d3f2cd6690cf1f2a7455bbd38f538f07a103964317efbcee37eb46931c027cf153ef86e43d78281ebd710", "signed": "a510dff42d4559a19a7bf0fe0bea53d3e1f22dfa6be55039895e12a5d07da5f2e37713ccb2eb216011628f6983f871fee286e66fff4be7582c961a1ed7568404a2f0c1373473a305d8f1d99138b06b9a9694ffaa8a88222de9f729bee1305175dfb17001cc77f67b6d40c90c1a28fb226c11286db4a13e45e69211242bcdd01cb6e2c454e76c0cab881b4d2d9d3ab100a5d61d1725d866e4fdb66d93d77f5b308693b9b5a333e57fa25d1e5d2e38df6e4e9ec84159bbee1ffea926836a0101c91483bd5bc88a6f1cc4d4e7f008ad08453a0123429dd335781c7cbf8d685a8999ed1177607004a13c4cb5ea4908c542607d3f2cd6690cf1f2a7455bbd38f538f07a103964317efbcee37eb46931c027cf153ef86e43d78281ebd710", "signature": "a510dff42d4559a19a7bf0fe0bea53d3e1f22dfa6be55039895e12a5d07da5f2e37713ccb2eb216011628f6983f871fee286e66fff4be7582c961a1ed7568404" }, { "secret_key": "c72e67d8c3fec004ff618718a9099eb8ad7b06ff3b8c542a7e8b9847313475e1", "public_key": "4eb002d3cceb188c6658fec51cb479a65264ac555c75cdc2249cf1ce3defc16d", "message": "a8f34135c0132ec95b64b0cbf51d66900143370406791fbb55f2b8ca953cc74a46e08b002fa2da21b951b8871f7a29bc6d38790afc66a329c397d9f9250bae0e30ae3426e08d8ead0179a3b313c908839192f289a3f3b6e960b4c5cebef0a09daa9c7a15c19d4ebc6fc2ac3cd02232e832b234edd7965d687bfeb758f70fa7963841b7859bb97c971bd557bc8769524ac4c6eeb3579793334b522d176bc62f86b4d5c0d4017036d2b6bd4e4384416ef8263139691a8606170d73c93d6417dcc1a08a537c9ed4400471a46f52907b46b10a8b6889dbb4647a8bbc7149", "signed": "2d7bab8ebda7fca5bb3c25f51dc51b73e6ff6a3bb1b52acc7811a7d2595cd6fdaf730494418e2f57efdc5617b066fd7b6207680d94fb8c43d3d4740b41cb6901a8f34135c0132ec95b64b0cbf51d66900143370406791fbb55f2b8ca953cc74a46e08b002fa2da21b951b8871f7a29bc6d38790afc66a329c397d9f9250bae0e30ae3426e08d8ead0179a3b313c908839192f289a3f3b6e960b4c5cebef0a09daa9c7a15c19d4ebc6fc2ac3cd02232e832b234edd7965d687bfeb758f70fa7963841b7859bb97c971bd557bc8769524ac4c6eeb3579793334b522d176bc62f86b4d5c0d4017036d2b6bd4e4384416ef8263139691a8606170d73c93d6417dcc1a08a537c9ed4400471a46f52907b46b10a8b6889dbb4647a8bbc7149", "signature": "2d7bab8ebda7fca5bb3c25f51dc51b73e6ff6a3bb1b52acc7811a7d2595cd6fdaf730494418e2f57efdc5617b066fd7b6207680d94fb8c43d3d4740b41cb6901" }, { "secret_key": "696450b557ec3c94cf1af1326475634aa81def3814ff30a02ba7f2044b59c0fe", "public_key": "8584773c566b0eed3f43281705b575a434e47d6cf6b251b89803fef53534cb29", "message": "cc257829f30a5f90dfdbc247d42e388738b76c41ef8a82a5e0225ddf1e386d77080b3b9df86c54b85cdf2c32f367aba0c3b6bf888a5a6903529b6aeb4d5407a10180149114130228fc4356ccf366b77be89796a9e71a0c693f31e584a4f143097ba370363b67b2f2e2fd8d6fe8b4e8dbf0d7dcc1a8360041158aa2aff7e2a325b8e518f193a28bae05e3d52b26621af402026d7f250e86dcee301a58b631eadf4527e958f02a61587f0bb516cefac009fe51052fff53336dbd94e7266d3b43caba8a1b38e5d871c2a24a4c412fff3f7a9a52a8ab23bac9791b2b5a669a", "signed": "ce8b0a5779f4f5f401e84d65927a0c28df829e95d09bfa97111b8700078ff894cf7277e34a716144d55306fc9e2f64cd287583cc8003be0e8faf26af7640140ecc257829f30a5f90dfdbc247d42e388738b76c41ef8a82a5e0225ddf1e386d77080b3b9df86c54b85cdf2c32f367aba0c3b6bf888a5a6903529b6aeb4d5407a10180149114130228fc4356ccf366b77be89796a9e71a0c693f31e584a4f143097ba370363b67b2f2e2fd8d6fe8b4e8dbf0d7dcc1a8360041158aa2aff7e2a325b8e518f193a28bae05e3d52b26621af402026d7f250e86dcee301a58b631eadf4527e958f02a61587f0bb516cefac009fe51052fff53336dbd94e7266d3b43caba8a1b38e5d871c2a24a4c412fff3f7a9a52a8ab23bac9791b2b5a669a", "signature": "ce8b0a5779f4f5f401e84d65927a0c28df829e95d09bfa97111b8700078ff894cf7277e34a716144d55306fc9e2f64cd287583cc8003be0e8faf26af7640140e" }, { "secret_key": "a8dd35f054fb6ff6f0ab094a0d3d1c262832181df35ccd5192545ebd6a9cf529", "public_key": "ca412338d3814b886d964b71925e1aabb3ffd07834dbe7dc512568882b53e4a3", "message": "55a7ad9132d63ac161e7adb132b9189fdd84c361c1e4f5419a6df73df4d7aeb29a8dc4bf01490d4f484e2d12077517f5fc7ad0bdeda20a6cb0227942290b08c3fe33ab9b2135bc38a6579a54bd982f7d1417ce867117aea918dbd3dd476e7eb5b5d3c3e48a864a2f942a31501aa2b29b53b80513c95d6a411844f0dedf16a29ac267d331e53bdc2539bfcf32dc9b5d640f1231e2cafb0ae94bb5189426863364262efb47b5b5ccdbbc93324216a799b6f50d3704f15ed59af6cc7d910cf062d1be632dca5df213d487d8564f2b2bd7d818bba27c364013d92d7f72625462", "signed": "fa709fbc8382af83d11812618dfaca452eab83e4c53fe9e5858467d07b6767e17975c1e06393d6dde15a34d9473d1cf4d6d8c2d57394520080fac4e43448be0755a7ad9132d63ac161e7adb132b9189fdd84c361c1e4f5419a6df73df4d7aeb29a8dc4bf01490d4f484e2d12077517f5fc7ad0bdeda20a6cb0227942290b08c3fe33ab9b2135bc38a6579a54bd982f7d1417ce867117aea918dbd3dd476e7eb5b5d3c3e48a864a2f942a31501aa2b29b53b80513c95d6a411844f0dedf16a29ac267d331e53bdc2539bfcf32dc9b5d640f1231e2cafb0ae94bb5189426863364262efb47b5b5ccdbbc93324216a799b6f50d3704f15ed59af6cc7d910cf062d1be632dca5df213d487d8564f2b2bd7d818bba27c364013d92d7f72625462", "signature": "fa709fbc8382af83d11812618dfaca452eab83e4c53fe9e5858467d07b6767e17975c1e06393d6dde15a34d9473d1cf4d6d8c2d57394520080fac4e43448be07" }, { "secret_key": "ae1d2c6b171be24c2e413d364dcda97fa476aaf9123d3366b0be03a142fe6e7d", "public_key": "d437f57542c681dd543487408ec7a44bd42a5fd545ce2f4c8297d67bb0b3aa7b", "message": "9e6c2fc76e30f17cd8b498845da44f22d55bec150c6130b411c6339d14b39969ab1033be687569a991a06f70b2a8a6931a777b0e4be6723cd75e5aa7532813ef50b3d37271640fa2fb287c0355257641ea935c851c0b6ac68be72c88dfc5856fb53543fb377b0dbf64808afcc4274aa456855ad28f61267a419bc72166b9ca73cd3bb79bf7dd259baa75911440974b68e8ba95a78cbbe1cb6ad807a33a1cce2f406ff7bcbd058b44a311b38ab4d4e61416c4a74d883d6a6a794abd9cf1c039028bf1b20e3d4990aae86f32bf06cd8349a7a884cce0165e36a0640e987b9d51", "signed": "909008f3fcfff43988aee1314b15b1822caaa8dab120bd452af494e08335b44a94c313c4b145eadd5166eaac034e29b7e6ac7941d5961fc49d260e1c4820b00e9e6c2fc76e30f17cd8b498845da44f22d55bec150c6130b411c6339d14b39969ab1033be687569a991a06f70b2a8a6931a777b0e4be6723cd75e5aa7532813ef50b3d37271640fa2fb287c0355257641ea935c851c0b6ac68be72c88dfc5856fb53543fb377b0dbf64808afcc4274aa456855ad28f61267a419bc72166b9ca73cd3bb79bf7dd259baa75911440974b68e8ba95a78cbbe1cb6ad807a33a1cce2f406ff7bcbd058b44a311b38ab4d4e61416c4a74d883d6a6a794abd9cf1c039028bf1b20e3d4990aae86f32bf06cd8349a7a884cce0165e36a0640e987b9d51", "signature": "909008f3fcfff43988aee1314b15b1822caaa8dab120bd452af494e08335b44a94c313c4b145eadd5166eaac034e29b7e6ac7941d5961fc49d260e1c4820b00e" }, { "secret_key": "0265a7944baccfebf417b87ae1e6df2ff2a544ffb58225a08e092be03f026097", "public_key": "63d327615ea0139be0740b618aff1acfa818d4b0c2cfeaf0da93cdd5245fb5a9", "message": "874ed712a2c41c26a2d9527c55233fde0a4ffb86af8e8a1dd0a820502c5a26932bf87ee0de72a8874ef2eebf83384d443f7a5f46a1233b4fb514a2469981824894f325bf86aa0fe1217153d40f3556c43a8ea9269444e149fb70e9415ae0766c565d93d1d6368f9a23a0ad76f9a09dbf79634aa97178677734d04ef1a5b3f87ce1ee9fc5a9ac4e7a72c9d7d31ec89e28a845d2e1103c15d6410ce3c723b0cc2209f698aa9fa288bbbecfd9e5f89cdcb09d3c215feb47a58b71ea70e2abead67f1b08ea6f561fb93ef05232eedabfc1c7702ab039bc465cf57e207f1093fc8208", "signed": "b6c445b7eddca5935c61708d44ea5906bd19cc54224eae3c8e46ce99f5cbbd341f26623938f5fe04070b1b02e71fbb7c78a90c0dda66cb143fab02e6a0bae306874ed712a2c41c26a2d9527c55233fde0a4ffb86af8e8a1dd0a820502c5a26932bf87ee0de72a8874ef2eebf83384d443f7a5f46a1233b4fb514a2469981824894f325bf86aa0fe1217153d40f3556c43a8ea9269444e149fb70e9415ae0766c565d93d1d6368f9a23a0ad76f9a09dbf79634aa97178677734d04ef1a5b3f87ce1ee9fc5a9ac4e7a72c9d7d31ec89e28a845d2e1103c15d6410ce3c723b0cc2209f698aa9fa288bbbecfd9e5f89cdcb09d3c215feb47a58b71ea70e2abead67f1b08ea6f561fb93ef05232eedabfc1c7702ab039bc465cf57e207f1093fc8208", "signature": "b6c445b7eddca5935c61708d44ea5906bd19cc54224eae3c8e46ce99f5cbbd341f26623938f5fe04070b1b02e71fbb7c78a90c0dda66cb143fab02e6a0bae306" }, { "secret_key": "6bce4dfd53bfa5506f2f554d2d994a0dc40cafcdec7e1be050006e5c5a4b38a1", "public_key": "c890023728d8397070291771e65e034d34d4aae5e247653e4ff4c074591da702", "message": "3239190747ee33d40bf870ac9ad49d88ee320f63c05257e8ab2c60306597ce76d1f1e792ab6a65caa544fbec20892fd4960594f31b3763ef07d4982eae4a2dbf3377dcc1e3f95e46ed39b7f0222f04bb5c3b434c8f9f310de9f122a29f8241e81e206549ae628d2b8ad768972c98847c1188ad04c835356378bef79cd126869405b129fdbdc3bc489cbd1399505dadef7617b5be5da173d3e80e5838c99e349276242729e0219bd7476ae5c4f81a12878fb483a6c0e9b0df2962eb0bf00157782cf768a1b71c010169ee8522def0024ad7e45775a290639c53aaf48198c42de75c", "signed": "99ae6782ff27646c27f61e23636ae1881521cfa5ed256f70bce7ce00b68280ce8e0c82aa765afb8b5a1ff2fe42c57441e458e443dc8b123477ae33d884888c0b3239190747ee33d40bf870ac9ad49d88ee320f63c05257e8ab2c60306597ce76d1f1e792ab6a65caa544fbec20892fd4960594f31b3763ef07d4982eae4a2dbf3377dcc1e3f95e46ed39b7f0222f04bb5c3b434c8f9f310de9f122a29f8241e81e206549ae628d2b8ad768972c98847c1188ad04c835356378bef79cd126869405b129fdbdc3bc489cbd1399505dadef7617b5be5da173d3e80e5838c99e349276242729e0219bd7476ae5c4f81a12878fb483a6c0e9b0df2962eb0bf00157782cf768a1b71c010169ee8522def0024ad7e45775a290639c53aaf48198c42de75c", "signature": "99ae6782ff27646c27f61e23636ae1881521cfa5ed256f70bce7ce00b68280ce8e0c82aa765afb8b5a1ff2fe42c57441e458e443dc8b123477ae33d884888c0b" }, { "secret_key": "17861a8d4154acd4fa9c8fc947c1886c11290be222872ff4f8cd25939e4d1361", "public_key": "43773f4449065eaebaf8937baf758560b0c4d2de46977839b3b873d5d7d5fd8f", "message": "184df5ea3215ebe180390b0ff042ba2381155a038dc732f76a01c7e70f82d1ccc9de9a0596b3fee447209c992684f643df21f4cf9d179262790e8623e42472dc351997e6da189c07e1e8882c07f86c6337ec0113912cf92215c8de1982b8fc57bfabc55a3e8736f73610429d97feb51d794f505d0c5a0b3abd48ef7f55a628f90b8567a1c15ea9d190d7bf4ec2bc9334ada6cb92808dfc2064836fcfa46b96fd7a5d6f4b054dab09b73595feb89ed005b9ec9d3188121de69696d64e7c7bbdfc1c469faf148c38a7785970afe1acd06a92c99478fe44974e3bb2095e4467e9b2e996", "signed": "a5ee024ccdbdd4c21a24709ec53dccb7ee17626dd00a093d0884f5b45c4c9d1691840151c33c8aa07b69b34e16f61647ebe793ae4daa70cff48e6ab42ffdbc00184df5ea3215ebe180390b0ff042ba2381155a038dc732f76a01c7e70f82d1ccc9de9a0596b3fee447209c992684f643df21f4cf9d179262790e8623e42472dc351997e6da189c07e1e8882c07f86c6337ec0113912cf92215c8de1982b8fc57bfabc55a3e8736f73610429d97feb51d794f505d0c5a0b3abd48ef7f55a628f90b8567a1c15ea9d190d7bf4ec2bc9334ada6cb92808dfc2064836fcfa46b96fd7a5d6f4b054dab09b73595feb89ed005b9ec9d3188121de69696d64e7c7bbdfc1c469faf148c38a7785970afe1acd06a92c99478fe44974e3bb2095e4467e9b2e996", "signature": "a5ee024ccdbdd4c21a24709ec53dccb7ee17626dd00a093d0884f5b45c4c9d1691840151c33c8aa07b69b34e16f61647ebe793ae4daa70cff48e6ab42ffdbc00" }, { "secret_key": "0a84baa54f11cf17090fec61f3f9401508a3a03887aca1a7939394b1ee40a925", "public_key": "309a73c62d23d740f2e93c18587ac15e7ec480d25ac0794e10f8cd461cc2b130", "message": "fe70017b14678b0d3ad03e183d6f53314378379ab3da65b3511257b3d54086e86f2031139021391af9d72085ff7c3dc8c1e2d91e53333855423d0f785e2cc5f8b7799fcf1b70e6becb788e53e9020f2995ddb0c383a1f81038fc3d543ce0a38c9c288a9bc4077f4277dcc6c5642263fcfe19688005a603f57675d2434f3ed1f46d32f14eaeb073e83ee7086da2fb67659d3fb68c62320b7727b3b8ea006576bc2c7e6b5f1ecefa8b92e70c92c88951d0c12d91de801c38b7ca5a0a04b4c3429aba86386e96e06afd20d4c5c2fe2b9b4273eb05201a79273abdbeb37ed1830d226b6bdb", "signed": "4d870bd53af8f13f214d9934ec903ac48284092cd9b162a44ccec851fa942de715ccda07b7991d712723e7a4d5b4f0374ab85ac3867e0b53ebc46b530f9fed05fe70017b14678b0d3ad03e183d6f53314378379ab3da65b3511257b3d54086e86f2031139021391af9d72085ff7c3dc8c1e2d91e53333855423d0f785e2cc5f8b7799fcf1b70e6becb788e53e9020f2995ddb0c383a1f81038fc3d543ce0a38c9c288a9bc4077f4277dcc6c5642263fcfe19688005a603f57675d2434f3ed1f46d32f14eaeb073e83ee7086da2fb67659d3fb68c62320b7727b3b8ea006576bc2c7e6b5f1ecefa8b92e70c92c88951d0c12d91de801c38b7ca5a0a04b4c3429aba86386e96e06afd20d4c5c2fe2b9b4273eb05201a79273abdbeb37ed1830d226b6bdb", "signature": "4d870bd53af8f13f214d9934ec903ac48284092cd9b162a44ccec851fa942de715ccda07b7991d712723e7a4d5b4f0374ab85ac3867e0b53ebc46b530f9fed05" }, { "secret_key": "38379423dafdbf25e19d7231bddd80b4cefcfe2aed932584dfa0cc3c9f9232de", "public_key": "597e81dcee9448b77de6829e7921c8a390535d89a0849430aed66364ee140d8b", "message": "36125ca66668802906237e63a2fe5ae610f11a7cf92520d19e6690a3adfafd5d07a784bc1a0e185273d11d340d5eff901597dedf450c4699d43f3fb168d557f6c9c03077c3cdc370d34832ccdf2a8e3d75796490ed0242899d25ddf44bfc66f329cf4c45168703c31bc9202d890f3969ffd3ac35a12818dca751ceb8808fe81efa26a5e0d200c5ec1d94a5097ea74b6498fe288f30c48d727e9d3d35c8e12d85420702556f2861484ffd09b4f12265cc9abafeb82cf590028895a7d050ff57ccf5f28022d016ab4094b062e48b66fd36d1e19626e5215efa40fb7e3b7062f81e954830c9", "signed": "d8b50a88aed6f2a96d082213adf8b2519f6a0bbd30dd3cb0f3fd3ce1c643fc029946cd43462ed22513f1d65fca24bde3818166baa86daa798792afafe0c1a10a36125ca66668802906237e63a2fe5ae610f11a7cf92520d19e6690a3adfafd5d07a784bc1a0e185273d11d340d5eff901597dedf450c4699d43f3fb168d557f6c9c03077c3cdc370d34832ccdf2a8e3d75796490ed0242899d25ddf44bfc66f329cf4c45168703c31bc9202d890f3969ffd3ac35a12818dca751ceb8808fe81efa26a5e0d200c5ec1d94a5097ea74b6498fe288f30c48d727e9d3d35c8e12d85420702556f2861484ffd09b4f12265cc9abafeb82cf590028895a7d050ff57ccf5f28022d016ab4094b062e48b66fd36d1e19626e5215efa40fb7e3b7062f81e954830c9", "signature": "d8b50a88aed6f2a96d082213adf8b2519f6a0bbd30dd3cb0f3fd3ce1c643fc029946cd43462ed22513f1d65fca24bde3818166baa86daa798792afafe0c1a10a" }, { "secret_key": "f925d274aaf1fe1a21656237385e97f7783e78090c5d4217fece7057c80f426d", "public_key": "3b0fc370be3a4b19a88ab998c59504ffb59a87606338e673df5b3fab4d9bfb8d", "message": "143caafa5f62b13e43dffa49d420fa99f771b1926d40d6cb2bbb427f27b6c266eb3deb2d8bbbd47b8214ad40251cb1907ad65eb94193e54ad85c6700b4189e80f1cc0154c63ed151a8bbbd30e01637ca58e70aa3ee52ef75d0873078a405014f786eb2d77b7f4422f927823e475e05b24245f9068a67f14f4f3cfb1eb30bfede7b3262230ced9e31361db19636b2c12fdf1b9c14510acd5bc18c0ddf7635e003503e6f71e1c365cdfb4c65ee75b4de0694af87076374d631e6c4b8e240fa51dab5e1f80ca2a06c49f42ea09e0475defb184d9cde9f58f959e64092aac8f2027e468126f2fb", "signed": "79549a317d10a0be322a94a151ad11e77efc4836cc8006a85081273d7602a638963a9caf19c3edf1e25fad1e9d68701a71dea727da6a5c5bcac9339589224b05143caafa5f62b13e43dffa49d420fa99f771b1926d40d6cb2bbb427f27b6c266eb3deb2d8bbbd47b8214ad40251cb1907ad65eb94193e54ad85c6700b4189e80f1cc0154c63ed151a8bbbd30e01637ca58e70aa3ee52ef75d0873078a405014f786eb2d77b7f4422f927823e475e05b24245f9068a67f14f4f3cfb1eb30bfede7b3262230ced9e31361db19636b2c12fdf1b9c14510acd5bc18c0ddf7635e003503e6f71e1c365cdfb4c65ee75b4de0694af87076374d631e6c4b8e240fa51dab5e1f80ca2a06c49f42ea09e0475defb184d9cde9f58f959e64092aac8f2027e468126f2fb", "signature": "79549a317d10a0be322a94a151ad11e77efc4836cc8006a85081273d7602a638963a9caf19c3edf1e25fad1e9d68701a71dea727da6a5c5bcac9339589224b05" }, { "secret_key": "971f806be6f07d41be8830ff8dae704b08638ad6cff722d8432538127b769625", "public_key": "af6ac98dce2078a6c73f6097bab63f205caf6953afa284d042bd50a4fce96cb4", "message": "013455d049aa54ed995fbd94e6369955495395e4438822259b1060e9a34779042a1a69211f6ea2077399dd234806ba0b353cd79a57e1c49b250ab27106dcde576ecfa115eae461febb12d2da25ffcf17b715f8d95c2f0c425d5a81f700115b70d49e1cfe49fcaa14fa205e28ec85247f1a6e7128bf3bb3060dc08464bda6538540d0ac472093e5a0720fde2f3dc4788e0e9b0dbfe2a2b5f1a0f3f80de984025b15c65af77f671e1c5e2840444de5c7eda025e6dc1a3ff16e26cc54cdeed56be73f9b01ab2b1bc16c8ef58a5b76dd47287807e5c50f0d7c0a5b8120dfde645a012c5cf11491bc", "signed": "2037a0a7674b84ff27d0b22f62b4bac65e2dc0f5fdc899feb7800f25c29981dee641c5a50f8b9410970b49d2d53658c89ee16961dccf5391a6918f2a84eada0b013455d049aa54ed995fbd94e6369955495395e4438822259b1060e9a34779042a1a69211f6ea2077399dd234806ba0b353cd79a57e1c49b250ab27106dcde576ecfa115eae461febb12d2da25ffcf17b715f8d95c2f0c425d5a81f700115b70d49e1cfe49fcaa14fa205e28ec85247f1a6e7128bf3bb3060dc08464bda6538540d0ac472093e5a0720fde2f3dc4788e0e9b0dbfe2a2b5f1a0f3f80de984025b15c65af77f671e1c5e2840444de5c7eda025e6dc1a3ff16e26cc54cdeed56be73f9b01ab2b1bc16c8ef58a5b76dd47287807e5c50f0d7c0a5b8120dfde645a012c5cf11491bc", "signature": "2037a0a7674b84ff27d0b22f62b4bac65e2dc0f5fdc899feb7800f25c29981dee641c5a50f8b9410970b49d2d53658c89ee16961dccf5391a6918f2a84eada0b" }, { "secret_key": "2bb0652f8fff6901991148c68a3267877271006ae9589149bb206850cdf52fb0", "public_key": "c03b77be983e74a234c1986496b292e139992eb7529e70b3afad7ae4fdcf8a66", "message": "b923ca67e396d8656fa3dbce8289a38bd3c128cefb30efc1862bb944b4507805419824ce2b83d690ef4cf107492817143bf64c024989af1a7d2e1f5ac97874f86bb0d3773ff840f514d9a1394a3959b011d3a6b816a3fae5de17b2a9ff349863d27fbbb50cca734108751000d6358ca0647a93eb49e2e7af06287d48f2c09d5c1c73e4d8f77ea2bcaa7356795b26728719bed5ffdb821578bd5d66bf92edaf8b238b2bbd7d1e2c30a787f901a33d0a76669a9c3c7f2b552ccb8349c7ded5e1a46170cf28e359e2fdd54b05a562f528c68a56974df82d466637c8e53246a7217e4386801e0e3266", "signed": "4e158deaaec3d88941296af2d27341012b0241d4e0f46e435e375c9875e89f5e32c057b527bc3411af096a77bfceb45b983efe455e3f03155d6bc7b0acc8e60cb923ca67e396d8656fa3dbce8289a38bd3c128cefb30efc1862bb944b4507805419824ce2b83d690ef4cf107492817143bf64c024989af1a7d2e1f5ac97874f86bb0d3773ff840f514d9a1394a3959b011d3a6b816a3fae5de17b2a9ff349863d27fbbb50cca734108751000d6358ca0647a93eb49e2e7af06287d48f2c09d5c1c73e4d8f77ea2bcaa7356795b26728719bed5ffdb821578bd5d66bf92edaf8b238b2bbd7d1e2c30a787f901a33d0a76669a9c3c7f2b552ccb8349c7ded5e1a46170cf28e359e2fdd54b05a562f528c68a56974df82d466637c8e53246a7217e4386801e0e3266", "signature": "4e158deaaec3d88941296af2d27341012b0241d4e0f46e435e375c9875e89f5e32c057b527bc3411af096a77bfceb45b983efe455e3f03155d6bc7b0acc8e60c" }, { "secret_key": "db9b812cb3c7c03b977f487d3d65ccd9cd2f3dee11602067dbfb72b589ff3f79", "public_key": "ffa038ad8c3b378ce75d65844d08e3d6a92d194a1b7862e9d9720d20679b2944", "message": "a70092c7697cd4a209567c38ba7fb71aa8f15e5827a20876923943fd6adc659c9867ac6f58a61dc7cec3d362411682000c1a9ad1295eb8b70f242d86b5865eb76b87e3f2c6941d2612ee3bcde8f19765566733152ef54e95690943285f78b375f4036585d4739deedeef6d946db61ca458ef4f650da963c385e29dfdee415fe495845f55197a870f8cdeb5a010ba6bbb32bf1a588cc774d4890184c4b2924a5b8073313bce226585f1adfc229c90bc6cc9d212e62f05d33bedac961d77cf8c2620e451de817f8c1bb16a2c59ff804b635a73a8cf8c181b3f9401c3b643d18a2f706ea9cae47071a6", "signed": "a628a77421b2abab576eed35d2ee3d14561b21fa14a6e2fac263c3eadd79f2fc0669f9429b910b8422b4b29ac026a42e98d181be3507c5ed7c748a1fdcf1d807a70092c7697cd4a209567c38ba7fb71aa8f15e5827a20876923943fd6adc659c9867ac6f58a61dc7cec3d362411682000c1a9ad1295eb8b70f242d86b5865eb76b87e3f2c6941d2612ee3bcde8f19765566733152ef54e95690943285f78b375f4036585d4739deedeef6d946db61ca458ef4f650da963c385e29dfdee415fe495845f55197a870f8cdeb5a010ba6bbb32bf1a588cc774d4890184c4b2924a5b8073313bce226585f1adfc229c90bc6cc9d212e62f05d33bedac961d77cf8c2620e451de817f8c1bb16a2c59ff804b635a73a8cf8c181b3f9401c3b643d18a2f706ea9cae47071a6", "signature": "a628a77421b2abab576eed35d2ee3d14561b21fa14a6e2fac263c3eadd79f2fc0669f9429b910b8422b4b29ac026a42e98d181be3507c5ed7c748a1fdcf1d807" }, { "secret_key": "ce379bbe2fa8abcba51c7a7543de5b7180771b3c44bc6b41892e7b88979bab90", "public_key": "7f3cff89f41babf4fa64cba33a5bb17f413bbf2a1e112b50a8e9b1f821d849bf", "message": "001a74f095c814d3beed67a8d15fc18efe235dc3f6457812a4039b7a46fe9a0e9de81a7a4e5fbab5ebe9e1e4801bd11b45c9f7ad0636a09bff42164be5749a04c02f0ab61f0ecfdfef799b827da6a274c8d3b39f2e3805a6791287eedb2314d3f842b558b9b489afe1ed37bbbcfc5e60a431d5ac60b39e946d903d6bf6b140e12c7e07f9ed7ac46a3999c6245c8ab1bdb21879a317a3dcd257a5c4f349b7f59e4e43d62d9f1cd16f518f1ca6cad37e2cb20f2598c4134291c6b8a98aae5247e26eefb76aa38c9c8231c17e9dbf271cec80fba5b4a834bd9be81ea841637aa9cdd4c4bf26d7ad24ca3c", "signed": "da98dfb189385b2c853b6cf375738046a8f27ef27974abcecea1db02989b951fe433a6ce1e225b3fa82032fe060a7d3f6c183fd1157f791a064b407650571600001a74f095c814d3beed67a8d15fc18efe235dc3f6457812a4039b7a46fe9a0e9de81a7a4e5fbab5ebe9e1e4801bd11b45c9f7ad0636a09bff42164be5749a04c02f0ab61f0ecfdfef799b827da6a274c8d3b39f2e3805a6791287eedb2314d3f842b558b9b489afe1ed37bbbcfc5e60a431d5ac60b39e946d903d6bf6b140e12c7e07f9ed7ac46a3999c6245c8ab1bdb21879a317a3dcd257a5c4f349b7f59e4e43d62d9f1cd16f518f1ca6cad37e2cb20f2598c4134291c6b8a98aae5247e26eefb76aa38c9c8231c17e9dbf271cec80fba5b4a834bd9be81ea841637aa9cdd4c4bf26d7ad24ca3c", "signature": "da98dfb189385b2c853b6cf375738046a8f27ef27974abcecea1db02989b951fe433a6ce1e225b3fa82032fe060a7d3f6c183fd1157f791a064b407650571600" }, { "secret_key": "2b2ee809d647023e7b77fc541f44875a35fa941d37f7c5b21fd34934d2391935", "public_key": "2c29d53e1bf2c7879d73d20ba88ca07a0b216d7f6d05d93663a65c3d9e10633a", "message": "c4147d64ebfda41a1be5977262958104e940c3876bcd5b6956acfdec32c660914d62623c210663cb2cbe6249d7f5274991c60e950e8e2809049953c69581d2469f4fe982c7434fedd9d4e00ae08896d62cc1fb984dd233150cc2483e159cff4097df8c036bb633003abbfbe18c8fa79b5a22270838123fc9be39b8892c80384a385028c1a81ec58c8f21060e78afd2c04bfd2d30ca3977c6edad518cc1e2004cdc14bf3d15f5f528e5af277fa182275870e5c012f5f82fb1afd04edde4578ddd2160a1a3dbc050e80bdd811bc88ead79bf93f010cd0fd4433d0bc348dacfd0947cceda62bfa49711d013", "signed": "12d90685775572c9eabc9be2574ca9ae66f0e652e578b21736cd6e654f7c6b1545883d56bf760ccfc3cf87544e0004c798061257e130030cb997a788369a9a05c4147d64ebfda41a1be5977262958104e940c3876bcd5b6956acfdec32c660914d62623c210663cb2cbe6249d7f5274991c60e950e8e2809049953c69581d2469f4fe982c7434fedd9d4e00ae08896d62cc1fb984dd233150cc2483e159cff4097df8c036bb633003abbfbe18c8fa79b5a22270838123fc9be39b8892c80384a385028c1a81ec58c8f21060e78afd2c04bfd2d30ca3977c6edad518cc1e2004cdc14bf3d15f5f528e5af277fa182275870e5c012f5f82fb1afd04edde4578ddd2160a1a3dbc050e80bdd811bc88ead79bf93f010cd0fd4433d0bc348dacfd0947cceda62bfa49711d013", "signature": "12d90685775572c9eabc9be2574ca9ae66f0e652e578b21736cd6e654f7c6b1545883d56bf760ccfc3cf87544e0004c798061257e130030cb997a788369a9a05" }, { "secret_key": "4ea18d6b4af8053b885ec188be48deb86ffb2a69a4cec86637bbd7b41b807c46", "public_key": "e5986059976233ed77382c3d9959f34e317962696553e86ed1e5902c4bedd167", "message": "e9c89a1a1119373206ce40ede3b89a82f89462a1dee9e789e9845eec21f571c0faefd430ad338e4a72c047a39a4259580387fb9aacaddc36a2b51e7b60a87ca1321ff806794cd6dd4549a4df45c2dae3e539c4d7d06b6e6e9f466ffca2fa4978ce3dc792e44a6283880cd138a75a226f985da41ffdc0e32a5a85c85fe9a43ae78fcfe57f4dd7540a6dd3924a49ab39eb69950d421151d96b1e4fd3935890f634cd52a73a755f5c2fb72f9cd5a2e67ea930915e133b47cf6b7c10a9d889c6af6b5f1f4f51094d27fbba228ac2268b344027fd49e426343cc0134399b4b510aaea50234df42c37fa1c4f4d0e", "signed": "27570c002a487d000ca3928b83cb4319722c46dfb4cca260de790ec0e3c1932688f87362952818b54f51bc7aeeb263f960bc0da8964bf312ef93e81f06c80b04e9c89a1a1119373206ce40ede3b89a82f89462a1dee9e789e9845eec21f571c0faefd430ad338e4a72c047a39a4259580387fb9aacaddc36a2b51e7b60a87ca1321ff806794cd6dd4549a4df45c2dae3e539c4d7d06b6e6e9f466ffca2fa4978ce3dc792e44a6283880cd138a75a226f985da41ffdc0e32a5a85c85fe9a43ae78fcfe57f4dd7540a6dd3924a49ab39eb69950d421151d96b1e4fd3935890f634cd52a73a755f5c2fb72f9cd5a2e67ea930915e133b47cf6b7c10a9d889c6af6b5f1f4f51094d27fbba228ac2268b344027fd49e426343cc0134399b4b510aaea50234df42c37fa1c4f4d0e", "signature": "27570c002a487d000ca3928b83cb4319722c46dfb4cca260de790ec0e3c1932688f87362952818b54f51bc7aeeb263f960bc0da8964bf312ef93e81f06c80b04" }, { "secret_key": "fc1b75d17d3807217351d2aa40d9b04f525b89ed3f5fcdb311bec2aec5cb7ece", "public_key": "55e484e774a4392a9d6eeff835a8fbb232cf6276a89c74fc0d1bb2045a8b21be", "message": "d031bd11da308097e3beb6ffdb2600ee6a193ca6d8324501c972b1a25166fa7a369f5bc882ea45612cf02580254d21b40b0363237e835dae2656c1b7f4736e88be53d6b119c07f5729bbd82f67de03588322879243c5990a7e61f56907b24171a57cbb0bbefba2316277af9326f9cbf3538bcbf6780be41825a2ca774b41bdb1cd5c608851ec2339eb2f4feeddaa891a6326b29d97d7fbf311e3bb749c5d4c058dcc14f452f9334991e271c16d6508c818633927f429804ca7a38170f1b9f6bd73ed675e11e8c0d321fac912730b4ba2f7c428534adcaa4dad314c55807e6c642d494c6b2f0e8cd129775cc0", "signed": "9a68d151fea3909893359e60b96b68b2a3e2946f2b47b875398a1e39eb01463d35eae7d976f833a762b51f2726ee0dccad5ce3600564fd9dd58c23807fdffd05d031bd11da308097e3beb6ffdb2600ee6a193ca6d8324501c972b1a25166fa7a369f5bc882ea45612cf02580254d21b40b0363237e835dae2656c1b7f4736e88be53d6b119c07f5729bbd82f67de03588322879243c5990a7e61f56907b24171a57cbb0bbefba2316277af9326f9cbf3538bcbf6780be41825a2ca774b41bdb1cd5c608851ec2339eb2f4feeddaa891a6326b29d97d7fbf311e3bb749c5d4c058dcc14f452f9334991e271c16d6508c818633927f429804ca7a38170f1b9f6bd73ed675e11e8c0d321fac912730b4ba2f7c428534adcaa4dad314c55807e6c642d494c6b2f0e8cd129775cc0", "signature": "9a68d151fea3909893359e60b96b68b2a3e2946f2b47b875398a1e39eb01463d35eae7d976f833a762b51f2726ee0dccad5ce3600564fd9dd58c23807fdffd05" }, { "secret_key": "0d0bf4d42ef810b179eb841771de6dbde76361caf894e42a14b1e09787ea3e06", "public_key": "7171510b43fc17efa80b15e320b1b0a408332542e0d36e4ab9a649cd941b5aed", "message": "8e2179975d0a8e5a69fe875a3cb1e79aec49c3853e30dd0320fe3ebfb638b82f89ad1643036b37e56e0b55e0a9e22a4e283d7a27485ce9102db6787d6628b77913e10896774e495c26e8bab26e7f9a94d29aaa36aec9c26ad3f50e5d8c0b7698bb5f01b876d0d65fcf5e9e32cd7b89829ed05b0b8f63a93858985bc9569fce429fd37a211abed650f585c3b55900443b6c5d6e8a48ba67deeed07b76e969fc88430fce2709c0bb5ce926ab7f44e0cd79f4ec359ef76748883fcc3d026edd06c8b9cba54b990d30aa41f1448a10893fb0539280c599d42361433a34cdafd8ebdd92efb9c38a36daf4c74060c696", "signed": "24446bdf03416a4d08614466fb851db50e91a623cacd1b0b35660f3cf933200e15308708da3499a5ad25f0f0306b7942762e20a765b7ca9b901c750b3a95320a8e2179975d0a8e5a69fe875a3cb1e79aec49c3853e30dd0320fe3ebfb638b82f89ad1643036b37e56e0b55e0a9e22a4e283d7a27485ce9102db6787d6628b77913e10896774e495c26e8bab26e7f9a94d29aaa36aec9c26ad3f50e5d8c0b7698bb5f01b876d0d65fcf5e9e32cd7b89829ed05b0b8f63a93858985bc9569fce429fd37a211abed650f585c3b55900443b6c5d6e8a48ba67deeed07b76e969fc88430fce2709c0bb5ce926ab7f44e0cd79f4ec359ef76748883fcc3d026edd06c8b9cba54b990d30aa41f1448a10893fb0539280c599d42361433a34cdafd8ebdd92efb9c38a36daf4c74060c696", "signature": "24446bdf03416a4d08614466fb851db50e91a623cacd1b0b35660f3cf933200e15308708da3499a5ad25f0f0306b7942762e20a765b7ca9b901c750b3a95320a" }, { "secret_key": "57b5194d26abe4ab2116c0f03d23dbe116d48825a25e77d64648b43692ae25bf", "public_key": "499c02dbad2a4eab3b6ff1aba3944b91c3f273a382c548a6f3a19c83f0a86724", "message": "b4813c9d13215fe9f63a78ff7ac95173eb810b4613f0f48d6876b2bd3b2c72bc7d98cb1ac32bc41ca47f09896f79204ecfb8264ce8f3c3e76dc124da8ddc6e0dfc1e13b5a529f20c82613fb9a82e5f5d77326a861faedabc7325c59af33dae6744025e649774fc4f79134bf9f6e3d5875dd91bc8a14cc36a66283d01d8d108c13327eca53057ba50bf210c19f139de6494982646198a1246c271b0a368c10aab95cd8961235d742df4545be68bd010dc0db23b673e623609e420ee76b1056c520f9ce8fbe8ee1863df97d17b7174636c3a2b612295091948810d1d4b8a5843760a2887dc55ef512af041ec54fad3", "signed": "4c7345960c8fd48a7dead71dbd61908468efa865a135568c8f9ca0055483468617a7e335840f57c6cd8f2c9805cd47a9d7cdfde53da8ef4f1adbb6f698aaf100b4813c9d13215fe9f63a78ff7ac95173eb810b4613f0f48d6876b2bd3b2c72bc7d98cb1ac32bc41ca47f09896f79204ecfb8264ce8f3c3e76dc124da8ddc6e0dfc1e13b5a529f20c82613fb9a82e5f5d77326a861faedabc7325c59af33dae6744025e649774fc4f79134bf9f6e3d5875dd91bc8a14cc36a66283d01d8d108c13327eca53057ba50bf210c19f139de6494982646198a1246c271b0a368c10aab95cd8961235d742df4545be68bd010dc0db23b673e623609e420ee76b1056c520f9ce8fbe8ee1863df97d17b7174636c3a2b612295091948810d1d4b8a5843760a2887dc55ef512af041ec54fad3", "signature": "4c7345960c8fd48a7dead71dbd61908468efa865a135568c8f9ca0055483468617a7e335840f57c6cd8f2c9805cd47a9d7cdfde53da8ef4f1adbb6f698aaf100" }, { "secret_key": "068d27b21e2acfcc19c3e9673dd44142d98aacae894930e20ca067439e749a79", "public_key": "e22ddd396f955bb90e284776aa76e921e50699d0ca8914a9b7b841eb5ff47d6d", "message": "1c6815423d1a2c5ebe8828d1646527c17b2006e547f016b5350f010d79b13df4fb8c6ed57ba9c26c3cb0e0a64178b650a3ea5444a4fad5b20a3eb8caa702634011cf7892a0727b6e8150b0770429a37a8a0bb3a7edb891a7c90240bc0360b14e6dd770a990b31b31f33ddbf653988f82742e5eec31b27368eb0e4f1ecf4d676f49214a520d1e5b2bbb59ac2e13267e07a0cbacbed9f94d7473ed697828b0928fcc616ee02e51fcd8db4d8f7533b7b139a05e06f9e0eae32993e3025aef0590b3fbb4292a3ac40765e8584ead00266acdcbdde1457a03b7d57bd5c9e64fb06b64a50f35f0a1ec34b6ddbde767b96ffd", "signed": "0c173c488ad001cbb9c43d7b30a7c071a2fdb08cf7f37daf71d7ae7128dc0d43f0f095b2929c54b773ed4a1f0bf0dc4f364f0601e8d5ae062f5b78c05bfbc7021c6815423d1a2c5ebe8828d1646527c17b2006e547f016b5350f010d79b13df4fb8c6ed57ba9c26c3cb0e0a64178b650a3ea5444a4fad5b20a3eb8caa702634011cf7892a0727b6e8150b0770429a37a8a0bb3a7edb891a7c90240bc0360b14e6dd770a990b31b31f33ddbf653988f82742e5eec31b27368eb0e4f1ecf4d676f49214a520d1e5b2bbb59ac2e13267e07a0cbacbed9f94d7473ed697828b0928fcc616ee02e51fcd8db4d8f7533b7b139a05e06f9e0eae32993e3025aef0590b3fbb4292a3ac40765e8584ead00266acdcbdde1457a03b7d57bd5c9e64fb06b64a50f35f0a1ec34b6ddbde767b96ffd", "signature": "0c173c488ad001cbb9c43d7b30a7c071a2fdb08cf7f37daf71d7ae7128dc0d43f0f095b2929c54b773ed4a1f0bf0dc4f364f0601e8d5ae062f5b78c05bfbc702" }, { "secret_key": "a34d52563159e0723e9f3fd133bd96e20adae623f8c798013bc36b441489bdc2", "public_key": "1fb658e645de6d3efdb083a73fbd592fcd4b800e03c7bd681aeae6576bfbbe2f", "message": "1d215f85c089f35f307a746c66c7c1e41d6ba37730d759e6e5622d6c6a198e40f63d37873b715df7518b3c6bb5e95a467726b97c9a0f8f5dfcdbfd1e0de357661ddeab555042b945fd899fad6d382d7917da9e12dfbda0d69900b3975165a73d0ac9de01fd3048b8fe5f0b90be67e03dc22f653a0a13eb4b0b753f3f3bbf787369ebd8bf5e00eb78bf0b3515a91e68b1d5fc6920bf4f4259f8a730efc7f1016d501ef6fb7cb8366fc8e716cfa50ea8b203cca1a316707e0b0fc57eafce82d62f7ff3ae04ac8fd041b55b19a352a69e6d4b79d0e650175168e34fa3358eac816cecf2c8dd1bf2a589113e91bb818f91f8", "signed": "5fab5a7140d47873684305aa6353d3862f5fc13e54a40c9563cceac8f74008c6c445631fa864e0f1c345b5954f80056aeba25662b78827b5e8e3a9437813720f1d215f85c089f35f307a746c66c7c1e41d6ba37730d759e6e5622d6c6a198e40f63d37873b715df7518b3c6bb5e95a467726b97c9a0f8f5dfcdbfd1e0de357661ddeab555042b945fd899fad6d382d7917da9e12dfbda0d69900b3975165a73d0ac9de01fd3048b8fe5f0b90be67e03dc22f653a0a13eb4b0b753f3f3bbf787369ebd8bf5e00eb78bf0b3515a91e68b1d5fc6920bf4f4259f8a730efc7f1016d501ef6fb7cb8366fc8e716cfa50ea8b203cca1a316707e0b0fc57eafce82d62f7ff3ae04ac8fd041b55b19a352a69e6d4b79d0e650175168e34fa3358eac816cecf2c8dd1bf2a589113e91bb818f91f8", "signature": "5fab5a7140d47873684305aa6353d3862f5fc13e54a40c9563cceac8f74008c6c445631fa864e0f1c345b5954f80056aeba25662b78827b5e8e3a9437813720f" }, { "secret_key": "58dfe768bf52118494b29975154cf452bd9746dc7de1d6bcd18ee6a05acfd858", "public_key": "0f1476c6cc2a1b4764af75805e77341f14a0d8b09c6a5b2ea287fd517c3fa6b9", "message": "609794201c4f6faf488790d61dbff3f41b328c5b0695cbe9aa8a136d72b4977b21b500f216e9f32168ada8c13bff25327647e30d8a244d74d88303abc90b7f71aa07ca04d17bc8a0167d6e63fb88baa1dab81d50f1e91f46f5af77f2e8408b826336a35052efffdf4af79596af1bb2259f83c1bc109cfdc3dd50fd96d310f27ea4c6c7690f21815ea92bd79389680cfe3ed40c80181190688d24222d9a1ed52ce6a16b41dbd9107eb6d2e3594e4494d75dd7c089e3b26ffd00d1003c92c4c39ae5382ef9291491a880ca4ec3ac2b86e66719b92b6f7cea2cb0bbb1cf624d0d1abeae556e5f73909dd546277037ec972fd4", "signed": "977137a38af44f4b262abff7e07282433c58926d562fbc6180bde6cd9497861fb6d955cf383d999fa1037b8b1754ce888c9ffc1560a451d0e9db8d74d2940604609794201c4f6faf488790d61dbff3f41b328c5b0695cbe9aa8a136d72b4977b21b500f216e9f32168ada8c13bff25327647e30d8a244d74d88303abc90b7f71aa07ca04d17bc8a0167d6e63fb88baa1dab81d50f1e91f46f5af77f2e8408b826336a35052efffdf4af79596af1bb2259f83c1bc109cfdc3dd50fd96d310f27ea4c6c7690f21815ea92bd79389680cfe3ed40c80181190688d24222d9a1ed52ce6a16b41dbd9107eb6d2e3594e4494d75dd7c089e3b26ffd00d1003c92c4c39ae5382ef9291491a880ca4ec3ac2b86e66719b92b6f7cea2cb0bbb1cf624d0d1abeae556e5f73909dd546277037ec972fd4", "signature": "977137a38af44f4b262abff7e07282433c58926d562fbc6180bde6cd9497861fb6d955cf383d999fa1037b8b1754ce888c9ffc1560a451d0e9db8d74d2940604" }, { "secret_key": "5a63ef9bd7dbf0e89fef155983659e8a0a6ca002bc42fad5a45af8e0281923f4", "public_key": "e632f4dc994231cc1790c21afadaa977a589b0eb0da19fcb2792911b15ecf8af", "message": "796bc8361c6e8eec39838b24f53971e820f82361e0510eb4def1db2512387d6bf35bbdfa318879209435d6887b1410b3ebc1455f91f985e0fab1ce1c505c455576bca03539d048ad3a0ed1f11c73bac6809e2ea147975bee27c65261aca117df0fae7008e2c3c130bec5533ab89351c2140c9d1a62bdf688629787f954e1c610cbb75edb86209d7c357cd06ef41931dd5dfd1c7d407fa4ee1ef29393beab5713173802cce2d56229cfa76b601662c4d9a84a4936c52abb1981378b717eb55cb604a68d34f03b219f32226ca0e669348a2d8d2453930eb6e9c2bf66fa4e92c75136e148cdb034130d3f646382e1c71579ac70", "signed": "75461f99650c0368058113a15ba16bd2337b2e633da38112878c4834fac9ba2e307c866c02af79bea33659614cbb4465c57ec3effd4c478ae38a34a05cf1ed07796bc8361c6e8eec39838b24f53971e820f82361e0510eb4def1db2512387d6bf35bbdfa318879209435d6887b1410b3ebc1455f91f985e0fab1ce1c505c455576bca03539d048ad3a0ed1f11c73bac6809e2ea147975bee27c65261aca117df0fae7008e2c3c130bec5533ab89351c2140c9d1a62bdf688629787f954e1c610cbb75edb86209d7c357cd06ef41931dd5dfd1c7d407fa4ee1ef29393beab5713173802cce2d56229cfa76b601662c4d9a84a4936c52abb1981378b717eb55cb604a68d34f03b219f32226ca0e669348a2d8d2453930eb6e9c2bf66fa4e92c75136e148cdb034130d3f646382e1c71579ac70", "signature": "75461f99650c0368058113a15ba16bd2337b2e633da38112878c4834fac9ba2e307c866c02af79bea33659614cbb4465c57ec3effd4c478ae38a34a05cf1ed07" }, { "secret_key": "8b2f06141e401163f90f674b04dc90dcb6dd3386419339662ecb0dffadf2500b", "public_key": "54da934a659119198553fd4566b660d8d610adc3290cb84829c894148cf3f67e", "message": "1deb25d43458690323a7d26a26695090993474f467c6fde5ddb34da945be3cea2f6b75652ae21cbc4fd22763a1b45583e1c3e88bbb5fea2049b7336c91159988c01526824ca3bef16b362b9202b8b9754185bd61bea8f539aadf4a1ab135fbc31d2a8e33178073106cbbc02d4cd0d3c8feaa8eb733084356251795afbd78ac3c4f8a3ba19aed755c646f35569c7a6c675b6d6918e834969aca03f71a2e72ccb17003bb75b62e852aaf58b3baea89bcd64a32eb14a6b9e10de48971e53d0e9ac99a78f42de0382ef0e80ed3cfa343f35e4a9983b9aeed986d3a57f47e5e46d40e9d677302809a2d37e4ec011f051b4d031ed600", "signed": "d68e3750dc56432397401c98ff1529db9ed48fea246dd4ed383ec74c1a463aeb784c87b1fda8bbce970fc97aa9807ddbe95d41fb022ea68c1e311654fa1da2071deb25d43458690323a7d26a26695090993474f467c6fde5ddb34da945be3cea2f6b75652ae21cbc4fd22763a1b45583e1c3e88bbb5fea2049b7336c91159988c01526824ca3bef16b362b9202b8b9754185bd61bea8f539aadf4a1ab135fbc31d2a8e33178073106cbbc02d4cd0d3c8feaa8eb733084356251795afbd78ac3c4f8a3ba19aed755c646f35569c7a6c675b6d6918e834969aca03f71a2e72ccb17003bb75b62e852aaf58b3baea89bcd64a32eb14a6b9e10de48971e53d0e9ac99a78f42de0382ef0e80ed3cfa343f35e4a9983b9aeed986d3a57f47e5e46d40e9d677302809a2d37e4ec011f051b4d031ed600", "signature": "d68e3750dc56432397401c98ff1529db9ed48fea246dd4ed383ec74c1a463aeb784c87b1fda8bbce970fc97aa9807ddbe95d41fb022ea68c1e311654fa1da207" }, { "secret_key": "dc649fbb1bee0a44814d6d9e9080d5d90c1fc173ab5fefed826a74723a774e0a", "public_key": "0214c89f3867ad2e8870e50f8c2a6254986d9c220e3338411300cd9c6404d4b1", "message": "328700a8ae581c1edc4e2c00c78bf4606097f9bd75aade205a243c5fd7434d6222da937e2881a2e3c574356d4d5679301da99e11cf749c27921c8caa2ab2a564d87c5df8ecf1a72b680184824f6986022e3fc98bd2a21c3455abf1154954fb30c89882947b02f35af7b1bfad05237d242e2b74832fc536196f2e59d1acd0c1db6f1943d0f6043bbd6a769083ed66ba0e05a50feb0acf72b6c16ba9af039afb7fe2a4aaeb4d06181c5a1878689e67a3f5d0ad39e794d6239a7e0a12ce820c5be60fd5f1dd79702f49d02b79755fe873f5785c72f74625cd7e2428262597d31482c2c0508801fd96319d61b91ba253a5e722f414cf", "signed": "0e0c5e4e184375da4ef7e2a2e4888050cd84e2fe21d08e84a852db2be3fbc372c472de0954dcd1dc11aec493c569f40fc6f77f03ee524fb06ec40faa1d6cc10f328700a8ae581c1edc4e2c00c78bf4606097f9bd75aade205a243c5fd7434d6222da937e2881a2e3c574356d4d5679301da99e11cf749c27921c8caa2ab2a564d87c5df8ecf1a72b680184824f6986022e3fc98bd2a21c3455abf1154954fb30c89882947b02f35af7b1bfad05237d242e2b74832fc536196f2e59d1acd0c1db6f1943d0f6043bbd6a769083ed66ba0e05a50feb0acf72b6c16ba9af039afb7fe2a4aaeb4d06181c5a1878689e67a3f5d0ad39e794d6239a7e0a12ce820c5be60fd5f1dd79702f49d02b79755fe873f5785c72f74625cd7e2428262597d31482c2c0508801fd96319d61b91ba253a5e722f414cf", "signature": "0e0c5e4e184375da4ef7e2a2e4888050cd84e2fe21d08e84a852db2be3fbc372c472de0954dcd1dc11aec493c569f40fc6f77f03ee524fb06ec40faa1d6cc10f" }, { "secret_key": "39b8062da43e64e1676765d62c7fb8e0a99c4fd417d6f7e3319bb13044205f3b", "public_key": "6227cefe88ea4fb27b37b5f797778bd72fdafeadccd9aeb67ad437ce08fba6a8", "message": "740af679e3069fad059fa4825fa41c59fbd484aa649303c27c4f7a94711c5b713b2a6b8987859e2271a6a71eb0b4a15abde4f5168f6cb9dbdc6a27a2a13d52c9720896a1f4ce3a5345ee793b6cc3ad80d7d58163d5455b9cbd073e2b7adbff95590c7172271bd91fefdbd01657ee1750651036cdc3560b444ca2184bf4f3ea89fc973aab6fb4a8ee5704bbe5a71c99fa3b5ef0d0396249758297699ae202b819690dc7ac4692770346907845e2210d5363adeec03f0fc7761b7e0ec0fea1bcf6b04fc54b3e4c40d19b8fa649ac8479e8f80730c0c94e9f4a1ad506f2bcab0c49540f6decaa77b3d657dc38a02b28a977ece482545a", "signed": "c5f626490c0ef4e1efc3edeb0cbc3f7de267057fb7b6eb8f0c813584965bc5c421feedf54241cae001ec6d5e25c9b1fba0385e5dbd95a06ec1d8ae519144960d740af679e3069fad059fa4825fa41c59fbd484aa649303c27c4f7a94711c5b713b2a6b8987859e2271a6a71eb0b4a15abde4f5168f6cb9dbdc6a27a2a13d52c9720896a1f4ce3a5345ee793b6cc3ad80d7d58163d5455b9cbd073e2b7adbff95590c7172271bd91fefdbd01657ee1750651036cdc3560b444ca2184bf4f3ea89fc973aab6fb4a8ee5704bbe5a71c99fa3b5ef0d0396249758297699ae202b819690dc7ac4692770346907845e2210d5363adeec03f0fc7761b7e0ec0fea1bcf6b04fc54b3e4c40d19b8fa649ac8479e8f80730c0c94e9f4a1ad506f2bcab0c49540f6decaa77b3d657dc38a02b28a977ece482545a", "signature": "c5f626490c0ef4e1efc3edeb0cbc3f7de267057fb7b6eb8f0c813584965bc5c421feedf54241cae001ec6d5e25c9b1fba0385e5dbd95a06ec1d8ae519144960d" }, { "secret_key": "52f4675d8ccd0eb909df0a516648db26fa033ba41d43fc3845896d456e14265f", "public_key": "f39e7dafc97b0a84dcbf7fa14a9403ee1fa92b85e5a7e5d05f031b44ddf1f794", "message": "74427110857cb4af0a3342c2b52997bce1a0db6405c74e9651c5b85979acb071e567fe70412c4e0d8c9fa421914f6a62f2ae420b7b2f4cf80c90574221222288b65867eaa66e7e0a0557a26c549f9a7a4e70838ba4074b4cd7a9d758b378b88dd49441df802a444dcbc30624933b59922f33c20f019fe78ee24b8fba79a682f388505ac9c97f4eb87c611880026b4c23306b865173f5d716abc6cd9a9906db3430136f754129c443b20c42be2fbcbcd44034d714f58a4ba8e756607a02b608ef49648f2ad0cea99e7ab30a8dd7814004f725f49301d7b304dcda625c296d928cb581736ab739c86b469241a8259351fd37b4780a9993", "signed": "4bf668827a720af68898a06ea7b44545a34ca896ecf311feea47e0686d911fadaa03118997153c65361fea15de9bb891b8909872045508ffad0cd9eab21a970274427110857cb4af0a3342c2b52997bce1a0db6405c74e9651c5b85979acb071e567fe70412c4e0d8c9fa421914f6a62f2ae420b7b2f4cf80c90574221222288b65867eaa66e7e0a0557a26c549f9a7a4e70838ba4074b4cd7a9d758b378b88dd49441df802a444dcbc30624933b59922f33c20f019fe78ee24b8fba79a682f388505ac9c97f4eb87c611880026b4c23306b865173f5d716abc6cd9a9906db3430136f754129c443b20c42be2fbcbcd44034d714f58a4ba8e756607a02b608ef49648f2ad0cea99e7ab30a8dd7814004f725f49301d7b304dcda625c296d928cb581736ab739c86b469241a8259351fd37b4780a9993", "signature": "4bf668827a720af68898a06ea7b44545a34ca896ecf311feea47e0686d911fadaa03118997153c65361fea15de9bb891b8909872045508ffad0cd9eab21a9702" }, { "secret_key": "bad73c9fda4ceb9da6c701c2a6e2efc0467afa0a74f8750c52cf1fd4c8e7489a", "public_key": "bb0f027a9035376e1aa3206c3d774475e351f5767ef86ef48a72c037c24cce62", "message": "74b966cb780771aee63d734df3756702d1d5fdeddf32136c6358b836318a4f984fe71e7716adddbd649eba44cd4282e0055d8c1ed2d35123d66e5a98f1c0838ded563b9a20eb8007538fc7b0713e7e485e3c28f6ebc421a29dce2524db7f29205761036ada62e5b0b7d5b7f294ff17f338232fa5fd42b6f7253304092d848f50735248595da0f7ef28e568e9916bfc56d7ed0d811b59d5d891ae43e1b198071306bf525c678c6343998005fbb7869d1c40f8cac807fe2ef03f3d5b933f58978ef2906fccf7444a2936e63d928c690926c9c994ed3d666263e956fdfea27764bc5f74125bc46bc102dd3e5ff93b5e123e4b38bdef697e15", "signed": "197d6b6cc88a98c06dfca0c01225edfe38a0b2289f29f8a44ec0816a952d585e2d59b5b08de100c0606296ccf5e92a99e093623144b8b22db87d92922554600574b966cb780771aee63d734df3756702d1d5fdeddf32136c6358b836318a4f984fe71e7716adddbd649eba44cd4282e0055d8c1ed2d35123d66e5a98f1c0838ded563b9a20eb8007538fc7b0713e7e485e3c28f6ebc421a29dce2524db7f29205761036ada62e5b0b7d5b7f294ff17f338232fa5fd42b6f7253304092d848f50735248595da0f7ef28e568e9916bfc56d7ed0d811b59d5d891ae43e1b198071306bf525c678c6343998005fbb7869d1c40f8cac807fe2ef03f3d5b933f58978ef2906fccf7444a2936e63d928c690926c9c994ed3d666263e956fdfea27764bc5f74125bc46bc102dd3e5ff93b5e123e4b38bdef697e15", "signature": "197d6b6cc88a98c06dfca0c01225edfe38a0b2289f29f8a44ec0816a952d585e2d59b5b08de100c0606296ccf5e92a99e093623144b8b22db87d929225546005" }, { "secret_key": "707327a431dba77639b3966b2bc095f8eedf57f7a200e3b0077ce420389c92fe", "public_key": "ee2496910864189fdaa3c7757eb3cda9ab1e70fc9e7f71a38a0bfc845931c95a", "message": "32ef31b64eee700fca2ab21a267f8d9d3bdc689c7538fe959bf713fa995db2c0ad36dde430a8417d437b72c74e26dbe31d93701d4617fe51825cff7a544fc9f44e4345e14b4b11e15f26ffc2af8035f3f970e4dda44c0ebc0363c2b56fde218663bf78839092538fc2f39153d4eb29da0c1a08aa966601cc68ca96e993b01b173a261b2ef327650382f568fe944855b0f4fd9d15e752ac74dcfd37b3786fffcef23339c21e9270dce8891dd5eeeba9608fdc7b6fbcc99fa1b5903daa0968e1b691d19d06f215ded047ef9d76610f5de220f5041b313faf9e96c9fd7db54b5225726af435f9cbd9fd87ab40ce8f2c6940b55f0faae87850ca", "signed": "fb99029feca387a5d765961e361d7172b98b7e0f11290bb1e5b57b51bc2123d0bce29020392a4fec9ae6a72c4c386cea1857cb8f9c50aa9a76d7f1687fcf290032ef31b64eee700fca2ab21a267f8d9d3bdc689c7538fe959bf713fa995db2c0ad36dde430a8417d437b72c74e26dbe31d93701d4617fe51825cff7a544fc9f44e4345e14b4b11e15f26ffc2af8035f3f970e4dda44c0ebc0363c2b56fde218663bf78839092538fc2f39153d4eb29da0c1a08aa966601cc68ca96e993b01b173a261b2ef327650382f568fe944855b0f4fd9d15e752ac74dcfd37b3786fffcef23339c21e9270dce8891dd5eeeba9608fdc7b6fbcc99fa1b5903daa0968e1b691d19d06f215ded047ef9d76610f5de220f5041b313faf9e96c9fd7db54b5225726af435f9cbd9fd87ab40ce8f2c6940b55f0faae87850ca", "signature": "fb99029feca387a5d765961e361d7172b98b7e0f11290bb1e5b57b51bc2123d0bce29020392a4fec9ae6a72c4c386cea1857cb8f9c50aa9a76d7f1687fcf2900" }, { "secret_key": "6aa5c9f008f990473ba4a6286a416614026661f11e1a24efa81ac35852d1d070", "public_key": "605ac9b4dbdd5033d6c828bfafa93c0039440aa11ca724ae834043e07bd032d5", "message": "b5165d3963f6e6f9ea5657e9f07ff3a321eb338f9a8c3d3c42306b2b278978b31c623a631be3b04c41edfdeddf538e1b765bc8785401c1af29d0467a64411c497395d755dca03ae3272f4bc1fb1918dcc1ed6f04d6498404a8ce1409d447f570a4359522cc54629202ebe507ab693843141bd5ea0573b20f321a483ff383a46897f5926fe0b8afc25572707b63eeed283532928a4144196497942c572ac547605139256b0aa0eaf04db1a256012ed453b173ee19ad6e9b1af3f45ff3044a641f8c8eb0ac7bb45abbded47286b2a069d3908694ee06f2fbd0ef605a7911026ea9ea3c4913f38c04d8b69565a7027867ab3092d05f4cfb18fc7c", "signed": "9756303b90655e935251032ab19cfc95ca1c2a2c3ea28b033bd47066cbd4c7d8982a8b9886f1b9cd02e88a65564da8dcc34f308ba9f10144ba469c2efa49e004b5165d3963f6e6f9ea5657e9f07ff3a321eb338f9a8c3d3c42306b2b278978b31c623a631be3b04c41edfdeddf538e1b765bc8785401c1af29d0467a64411c497395d755dca03ae3272f4bc1fb1918dcc1ed6f04d6498404a8ce1409d447f570a4359522cc54629202ebe507ab693843141bd5ea0573b20f321a483ff383a46897f5926fe0b8afc25572707b63eeed283532928a4144196497942c572ac547605139256b0aa0eaf04db1a256012ed453b173ee19ad6e9b1af3f45ff3044a641f8c8eb0ac7bb45abbded47286b2a069d3908694ee06f2fbd0ef605a7911026ea9ea3c4913f38c04d8b69565a7027867ab3092d05f4cfb18fc7c", "signature": "9756303b90655e935251032ab19cfc95ca1c2a2c3ea28b033bd47066cbd4c7d8982a8b9886f1b9cd02e88a65564da8dcc34f308ba9f10144ba469c2efa49e004" }, { "secret_key": "8efb8b79742be21e6d31de678bc81450ba8621082cd6f0003e22861e2291c481", "public_key": "33381e356c4fd386a3f7b969afd9f5c00d2067b698b3f1f00f3784202d3084cf", "message": "6b750325d3a0f08a147700b51a9b3725571094818ed69d1f761013eb86f323f73c49f5e439877c2783b336d1f1a674ef3e431fc1ae0180082df5fca69f848139fe6ab6739a0592ebd6d4705c7f0136b22189a11d60d4d3c9bc80fe7d7c00952d5742f9c0c2121fe792df133f221db991fc960ee64b9d32e0178e542bce8efa8d03ac8026cd77ba8bf0b24215b9faed2eaec920e925d5ec46fff6bde725e91c8280e4ada232a5433ae9680ebb53eb55553147c93370574854896154514299c093219a111dca4e637ad5001338c6d4d5ee9098c65832f7af835bcb622128423036c79a5737738a7539f8d4a6b8b221b56d1401aeb74d4571bc009d", "signed": "923005cb4848402aa8f9d5da74030b009444924c214ad600ddbab4c153a6ff022b53cf6364cd7ee99bef34fe144da964edfc38a0ba633312650ebf0e55a060096b750325d3a0f08a147700b51a9b3725571094818ed69d1f761013eb86f323f73c49f5e439877c2783b336d1f1a674ef3e431fc1ae0180082df5fca69f848139fe6ab6739a0592ebd6d4705c7f0136b22189a11d60d4d3c9bc80fe7d7c00952d5742f9c0c2121fe792df133f221db991fc960ee64b9d32e0178e542bce8efa8d03ac8026cd77ba8bf0b24215b9faed2eaec920e925d5ec46fff6bde725e91c8280e4ada232a5433ae9680ebb53eb55553147c93370574854896154514299c093219a111dca4e637ad5001338c6d4d5ee9098c65832f7af835bcb622128423036c79a5737738a7539f8d4a6b8b221b56d1401aeb74d4571bc009d", "signature": "923005cb4848402aa8f9d5da74030b009444924c214ad600ddbab4c153a6ff022b53cf6364cd7ee99bef34fe144da964edfc38a0ba633312650ebf0e55a06009" }, { "secret_key": "ed046d688b2b0a1bc3daf2119dd321a607b16d2a2d1d963add1209c665b5ccba", "public_key": "8734f1ffcbd71cfde290017ea6253e580d59e65b541b46521f5e5ec1451eaec6", "message": "b9cc90fd8de2a141f95116db3b04be83e98522597ec2174964245180b9a473767d6d470a217db5ff5a1ab777e1e28a0b16975e2bacb873020444b47ed8326421b90ebb503688f090c11b3b13617c5c5052c297a41e2893775e34d59ada49d994c0e4a9f5220e9f0315a67705a3ec08af0dc724b5cf67ff34fada8ba7109ed2b5a8907bb403fb1a838b4b059f18c792d7bfec05dee0c9cbbf1753409d7db3aceaf47b4c61398497b0eca6c1f8ac08a7ea1eb9c40bc4e92e888212f7d9ee14fdb73158160944ff9bcdfef1a7469cc70f9474e5f24dfffea585f09eaaab4be2afebbe8e6cf86d35680dc5d1b92913e848256ec736316fd0a2142063b0", "signed": "721bfd4776cfba13330fd37269e979c1d7b6ce54a51b82f456e137378e582f192a12089da5aba76a7b161813dce56b72892a35330c94f7ff21d09cf09e553504b9cc90fd8de2a141f95116db3b04be83e98522597ec2174964245180b9a473767d6d470a217db5ff5a1ab777e1e28a0b16975e2bacb873020444b47ed8326421b90ebb503688f090c11b3b13617c5c5052c297a41e2893775e34d59ada49d994c0e4a9f5220e9f0315a67705a3ec08af0dc724b5cf67ff34fada8ba7109ed2b5a8907bb403fb1a838b4b059f18c792d7bfec05dee0c9cbbf1753409d7db3aceaf47b4c61398497b0eca6c1f8ac08a7ea1eb9c40bc4e92e888212f7d9ee14fdb73158160944ff9bcdfef1a7469cc70f9474e5f24dfffea585f09eaaab4be2afebbe8e6cf86d35680dc5d1b92913e848256ec736316fd0a2142063b0", "signature": "721bfd4776cfba13330fd37269e979c1d7b6ce54a51b82f456e137378e582f192a12089da5aba76a7b161813dce56b72892a35330c94f7ff21d09cf09e553504" }, { "secret_key": "76ac8e570a39b3a0232c45497537fb2155acec3617865ed1df210f00b49d1b8d", "public_key": "312a3ad899ae6a25507ae6e4524e10b63a6e7ae53d9cffd39cf28521d93533d6", "message": "53ced9db2b479e59d3ed643f7cc3784c24b8bd4c63206c72e23fa850028899a41ce1a8bdc003f12b7c29972c9a08bcd231fe0e1a0fef0bafbfa4e0e027d72004075ba37d490eb9964e783bb98f9e503e9c1fd3d23fb0017cc7c7a9f86d171f041e2355d8c5e6229d34c7eeacb6358cf3060d5d265bae2004a558878659a30dfed5f2ec788b4e14397b5d00c29db5d4ebf16639a8df292a3d24f6983cbca760d903e976f5b698642ba1fed49e79c38f4bb3946efccc9d6aefad336d558f78e4f205422e10384a4e531e75807efb389d2af4cab43825fb87f196a9080769fe7585782970a6918affe10d20d629b705845597418d699de3f1de854f94bd", "signed": "cf03f525913c44303b2f80079393c21c1158146ecf99636f5d97adfdd9f35839804c23804cbf1e553cfd4b73f689a9143aec298f8276e1e4ee0891f1ba75de0453ced9db2b479e59d3ed643f7cc3784c24b8bd4c63206c72e23fa850028899a41ce1a8bdc003f12b7c29972c9a08bcd231fe0e1a0fef0bafbfa4e0e027d72004075ba37d490eb9964e783bb98f9e503e9c1fd3d23fb0017cc7c7a9f86d171f041e2355d8c5e6229d34c7eeacb6358cf3060d5d265bae2004a558878659a30dfed5f2ec788b4e14397b5d00c29db5d4ebf16639a8df292a3d24f6983cbca760d903e976f5b698642ba1fed49e79c38f4bb3946efccc9d6aefad336d558f78e4f205422e10384a4e531e75807efb389d2af4cab43825fb87f196a9080769fe7585782970a6918affe10d20d629b705845597418d699de3f1de854f94bd", "signature": "cf03f525913c44303b2f80079393c21c1158146ecf99636f5d97adfdd9f35839804c23804cbf1e553cfd4b73f689a9143aec298f8276e1e4ee0891f1ba75de04" }, { "secret_key": "f64a66ba0f0819f3001416c220bf52d860130a19764aa8ab38d15b2aa75ac022", "public_key": "8125253cd337e00d45b45079b585349561e5f542a81f6d2fcfd985c10feab2af", "message": "8072862ed0ab35921db5ec2cba8e6aedb0441fdf47491006c01e6456ad70fae3c4152dcfbfdbb8f0fddec5e96b12bf67989ba96793f4861a11b63909ce8d19b8ca64a544b31ce051fbc88e062806d9965cbd2967b01614e86b532fbf59843218dc9c19c80315f044731719371092a3da38878bc4cf77de972e860466b8fc45e465dc3d0ebf94bdea60ef0b9891ced41b997b11b31ee4167db60c9cfc8b85beacfe223cc1829213774085d7c06d2b2e632cc21cd9660df47c4fa918bdd596ddf622dcb652642b67527ba8ed15a819a8e21f48d7ee70247f5200e37c259dffd17eec8c232f970cb03182fe3964132993f6ecb7c4db18ccef390c9eb3639e", "signed": "4de6f5250822d7c9d5bb98582500b5c085f541ebdc450ed1acaf83684827ed1dc77147aae4b19e14a7dc5bbe1f1e4f5771d8a6e4f2351739afb08c806d5587018072862ed0ab35921db5ec2cba8e6aedb0441fdf47491006c01e6456ad70fae3c4152dcfbfdbb8f0fddec5e96b12bf67989ba96793f4861a11b63909ce8d19b8ca64a544b31ce051fbc88e062806d9965cbd2967b01614e86b532fbf59843218dc9c19c80315f044731719371092a3da38878bc4cf77de972e860466b8fc45e465dc3d0ebf94bdea60ef0b9891ced41b997b11b31ee4167db60c9cfc8b85beacfe223cc1829213774085d7c06d2b2e632cc21cd9660df47c4fa918bdd596ddf622dcb652642b67527ba8ed15a819a8e21f48d7ee70247f5200e37c259dffd17eec8c232f970cb03182fe3964132993f6ecb7c4db18ccef390c9eb3639e", "signature": "4de6f5250822d7c9d5bb98582500b5c085f541ebdc450ed1acaf83684827ed1dc77147aae4b19e14a7dc5bbe1f1e4f5771d8a6e4f2351739afb08c806d558701" }, { "secret_key": "8439b1d60aa48460135eb1002cc112792995079a77e6e8ab020b9abaca8920b4", "public_key": "eadc3e0c5bddbc3052c3b2f8b0a94566c2b2c879ed17034ac0e6a45f2b3e32d2", "message": "5419f6d24eb46635d4a7f8eab803cfd0d04de092afbd86f2a6961a8d1eb8c0d197ba55ee08c991822a5aa702bae0337abd5ca7faa15e1f1ae369946e9b81216c0f5fc22bbd4433c3de93c5caa2741683bbd0e1a78df28dda19174101876334d40339659f021ae766162c6cc5421b79cf9d5c090ed4af07ec84493035bd0b2421b533684295bbe76a70fec596ef8c89c5c9dda3c33b7735d2d2f20b28f1a5402e72d04ba291dd59f14af08adf56eeb086d769c6bec3451891372345fd6bd02dcf95e803af0353150e182e323aaf683e036d9a135d2e6f98cb4d327e2ce7d54247f3592ed067b4ce7627174f996f28165c9c11f07e5ee9cee63851c6b68ea2", "signed": "62da81e16440821b593b6ee6540e15d1aea75d23e0a1bbfedc808c9548f87e8bbf36915a39a74716f645cca5714d170af907576d4f3705e543d2adddc5ff23035419f6d24eb46635d4a7f8eab803cfd0d04de092afbd86f2a6961a8d1eb8c0d197ba55ee08c991822a5aa702bae0337abd5ca7faa15e1f1ae369946e9b81216c0f5fc22bbd4433c3de93c5caa2741683bbd0e1a78df28dda19174101876334d40339659f021ae766162c6cc5421b79cf9d5c090ed4af07ec84493035bd0b2421b533684295bbe76a70fec596ef8c89c5c9dda3c33b7735d2d2f20b28f1a5402e72d04ba291dd59f14af08adf56eeb086d769c6bec3451891372345fd6bd02dcf95e803af0353150e182e323aaf683e036d9a135d2e6f98cb4d327e2ce7d54247f3592ed067b4ce7627174f996f28165c9c11f07e5ee9cee63851c6b68ea2", "signature": "62da81e16440821b593b6ee6540e15d1aea75d23e0a1bbfedc808c9548f87e8bbf36915a39a74716f645cca5714d170af907576d4f3705e543d2adddc5ff2303" }, { "secret_key": "3a046397f0afc072bc7f907c74d38fd1b9afdf27e14a3534768b0dd2df3a1c22", "public_key": "99cd70ef3be342493393872f54c47deaa081021892d11a3268f3145ed4f3abe5", "message": "f08ddef46cc6c34179820c9861375172fddf774f8dc3f7d64aa432da8e5fae644c0a8a9e6908517d505debd612868ac6daf95cd7e1699750022ccd4b88dbae2bbf73546ee4b835d319a842dae8b9ed683323f31e5cc57919bc9dbe3bcfffb2ada48072697ff4a7d310c91adbca81faf26a0eb7bb0c404ac9d8dfec63e9c64e2f420c07d323b7c0dc3b73507283aeb1cee51db4e1a83a692c7c1ea398f6f30940fab85e2138d4b85aa4e231e5424f5b064ed026f0ccb99d1c85a9eb15f5934a11359d411cf94ae8ffa3361a224f46bab852d184a248b4c31fe3a7e7f5134c051031a9f328a7be4a7cbbb1d8d863a400fd2d58daa44f1b9d8e9ddf961ce6322f", "signed": "5024ce60257965687080c5b1fc7d1301c32aa6fcc835497d9cb23a74a6ca2724f55353c1b757827ca5440c9ef8f8c1050913e20aabec35c497b56041b5deb209f08ddef46cc6c34179820c9861375172fddf774f8dc3f7d64aa432da8e5fae644c0a8a9e6908517d505debd612868ac6daf95cd7e1699750022ccd4b88dbae2bbf73546ee4b835d319a842dae8b9ed683323f31e5cc57919bc9dbe3bcfffb2ada48072697ff4a7d310c91adbca81faf26a0eb7bb0c404ac9d8dfec63e9c64e2f420c07d323b7c0dc3b73507283aeb1cee51db4e1a83a692c7c1ea398f6f30940fab85e2138d4b85aa4e231e5424f5b064ed026f0ccb99d1c85a9eb15f5934a11359d411cf94ae8ffa3361a224f46bab852d184a248b4c31fe3a7e7f5134c051031a9f328a7be4a7cbbb1d8d863a400fd2d58daa44f1b9d8e9ddf961ce6322f", "signature": "5024ce60257965687080c5b1fc7d1301c32aa6fcc835497d9cb23a74a6ca2724f55353c1b757827ca5440c9ef8f8c1050913e20aabec35c497b56041b5deb209" }, { "secret_key": "124f7416a80453e4cf1cd7b5e050a9761418258bf7d27beb7f23238c4540be2d", "public_key": "0da34ab173990150df7399b6bcddba93c6dbcbf4d176941cb5071e8734c5dc92", "message": "9dcb9873ff054db11d0a9b19de6885ffba7f0e681cf7fb8f6cd950c48328d1f919ca46054eeee6c9e57843ebdda7b24bc3503c4d612abb1a314f39f58221d2b54dc755acca7969740e7fa8b1a9523b8c7379fd395253f4e6cd054ee24b75613c3581d49e19246a7b3be1cecb334be44f3d626fe3b7b269e628d44580c20636eba2642f2744b959e65757d0ee601843f188e95d17253fef567068a5405a3a9e677fea3d7d55f7ead19a3f30c5f985671b55fa120cb9d05f471b6e1e8d779a2c803a19e6d0d7cd507887ed647c2a95483f933991ed45ae301a2b0e954a5703d248c78810aa0b199cc2bebb2f1d71cc40487dbd42eee0f745f7d285685b1fb31b15", "signed": "b0572104aa69e529e3465a6fd28f404a4ec20276a993b1725eb8c5f650b4a216f1871b24e368cc46cd1ee0174cda1b5e4ae2200aa9fc44522d975a9c518149089dcb9873ff054db11d0a9b19de6885ffba7f0e681cf7fb8f6cd950c48328d1f919ca46054eeee6c9e57843ebdda7b24bc3503c4d612abb1a314f39f58221d2b54dc755acca7969740e7fa8b1a9523b8c7379fd395253f4e6cd054ee24b75613c3581d49e19246a7b3be1cecb334be44f3d626fe3b7b269e628d44580c20636eba2642f2744b959e65757d0ee601843f188e95d17253fef567068a5405a3a9e677fea3d7d55f7ead19a3f30c5f985671b55fa120cb9d05f471b6e1e8d779a2c803a19e6d0d7cd507887ed647c2a95483f933991ed45ae301a2b0e954a5703d248c78810aa0b199cc2bebb2f1d71cc40487dbd42eee0f745f7d285685b1fb31b15", "signature": "b0572104aa69e529e3465a6fd28f404a4ec20276a993b1725eb8c5f650b4a216f1871b24e368cc46cd1ee0174cda1b5e4ae2200aa9fc44522d975a9c51814908" }, { "secret_key": "25d13b3837601b07a975693e5a33d5337c34c1127fe4c27490612aaf7f642e9a", "public_key": "3a07cd68ee2692d51cfad1a80e7763b18a043c74f4e1b01edc55ba9a9e07795a", "message": "115b3220b45ca8f36c7ff5b53887d47e669b78dac13b98cc7aaca5c2e19fce81ec8617ca410e11c9a9118a668453b329ffb718eaec739172f0a849a0848192a5bdea18ab4f60d8d1a0d338952d77b2cc13efe83c76e8dd58803b1d8b3c9729ef102b20835b7de872bef3010f15a4caddf07cf7bdd222d84b174bc21527cffb1b7ffde81e281d30cb7bce25ea3dffb6ea1fbb06cb70569a95ed1a07e97ca42de70aa218159efd608fa9b0896e0b58518a322f251d133e58c8fc1428ab0a170ed845c75fb403f1ffb97d2d2a6d4f277911d326c1cabbb8516cbc17908ab81ff8d79af44611ea1d05879c1ec81d06936e0f4a0aef6d5748e181d30ec25236597a973d", "signed": "20cbf08392fea6a99cf446a95c199caa0c0f9813cc217b8d228e2ed90bab95ea92cd73ac95834764d33e42243c80a7603491c8d3e49ac715fd8a5b9e4789bb03115b3220b45ca8f36c7ff5b53887d47e669b78dac13b98cc7aaca5c2e19fce81ec8617ca410e11c9a9118a668453b329ffb718eaec739172f0a849a0848192a5bdea18ab4f60d8d1a0d338952d77b2cc13efe83c76e8dd58803b1d8b3c9729ef102b20835b7de872bef3010f15a4caddf07cf7bdd222d84b174bc21527cffb1b7ffde81e281d30cb7bce25ea3dffb6ea1fbb06cb70569a95ed1a07e97ca42de70aa218159efd608fa9b0896e0b58518a322f251d133e58c8fc1428ab0a170ed845c75fb403f1ffb97d2d2a6d4f277911d326c1cabbb8516cbc17908ab81ff8d79af44611ea1d05879c1ec81d06936e0f4a0aef6d5748e181d30ec25236597a973d", "signature": "20cbf08392fea6a99cf446a95c199caa0c0f9813cc217b8d228e2ed90bab95ea92cd73ac95834764d33e42243c80a7603491c8d3e49ac715fd8a5b9e4789bb03" }, { "secret_key": "7b3a76decaea60c41e95b05877a7da82064c27278c8d7df5f0bb95f0ad2d0435", "public_key": "f80db5c28721b1c611bd87eb145a98bbf383b068045df2458d1a6fda099f7fc2", "message": "375fadaedd9cac49b64e1574028046069f4c83654c8a7011abdb64db16b47fa311798172f9072217b0a6a43e5df6ffcc1154bcec1c68e1d35ec05880d012ce76e4cebf301bb2ec983d00b4a0540c937ff1c6df9441c61bdb3be8e0c7c11a35d49b6f55c381269a0e768efbd453447fe48b75ac39646ca82eca7d149304423491871c10dbcfc5973a57fab8371c30cbc4e90becc0b67152226ee177b4ff368ec879b391eb95e36dcbb07b2c16ba395545d4529f727b1a11ef65d120976b7ccc86af4bd204cb9489c921e43ba5e850cfe59899f1c1ec4aa5c92b6dac6914b1952b53dcb540b409231381568987bb2236bc40895df3f17eab7c0274f2244f958612e88e", "signed": "2cd26fb3c4f7440a72affe93564f6f6559adb15cc7a2ba10879fb7d67e47d4ebd02fe4823698a5fbd4a907fd69184c255a170e5f1747fce968102dc219b50d02375fadaedd9cac49b64e1574028046069f4c83654c8a7011abdb64db16b47fa311798172f9072217b0a6a43e5df6ffcc1154bcec1c68e1d35ec05880d012ce76e4cebf301bb2ec983d00b4a0540c937ff1c6df9441c61bdb3be8e0c7c11a35d49b6f55c381269a0e768efbd453447fe48b75ac39646ca82eca7d149304423491871c10dbcfc5973a57fab8371c30cbc4e90becc0b67152226ee177b4ff368ec879b391eb95e36dcbb07b2c16ba395545d4529f727b1a11ef65d120976b7ccc86af4bd204cb9489c921e43ba5e850cfe59899f1c1ec4aa5c92b6dac6914b1952b53dcb540b409231381568987bb2236bc40895df3f17eab7c0274f2244f958612e88e", "signature": "2cd26fb3c4f7440a72affe93564f6f6559adb15cc7a2ba10879fb7d67e47d4ebd02fe4823698a5fbd4a907fd69184c255a170e5f1747fce968102dc219b50d02" }, { "secret_key": "5ff8d4052608eb033a5e94b603ce384d8452f60a26498b9112567f3410c18666", "public_key": "c4900de24d9af2482763109926af7c481380fabcda9440c1a53ea1cdc27e6568", "message": "138c60557c2e9008afc03d45bec71f961149a0835926751c8ff3935c7d652d83e1b0b1da7d5bbe0b8e171a4e49aae06fd8a9deff78dcde4d25b1aa899998a0f99e1df6f9337a3ea2f24b76c317a7014db4e5283191795a70d8821d217846490f958701d39dc2c8ce47d928938874d87b3558989bc77af820979a351eef9594aa5b94f3341eded4ea20b08c3e7c5610d43267818dfac0a87ddf527fbce8512bbf85b66c9bb5d62f0fe84048f23b19604a5c8d82b1f25a8da02731feb2ecae489b8475f7bd326ddf1a08189e46c08cf50538c2a363e2f4eb2c01a204c7ffbc0b981adc0fd997aafdf2a222ee84c309f6e95ec7de4fa85d4768d5c003165028225e22e09e", "signed": "b737d4e5be27deb6d87729c636dff7a406c013f313c38cf683fe14f75a3b3005d9535d7e5815c8f8b37c51d6927111c979f7d9d81a347aa9cc09ed4e6c18e90f138c60557c2e9008afc03d45bec71f961149a0835926751c8ff3935c7d652d83e1b0b1da7d5bbe0b8e171a4e49aae06fd8a9deff78dcde4d25b1aa899998a0f99e1df6f9337a3ea2f24b76c317a7014db4e5283191795a70d8821d217846490f958701d39dc2c8ce47d928938874d87b3558989bc77af820979a351eef9594aa5b94f3341eded4ea20b08c3e7c5610d43267818dfac0a87ddf527fbce8512bbf85b66c9bb5d62f0fe84048f23b19604a5c8d82b1f25a8da02731feb2ecae489b8475f7bd326ddf1a08189e46c08cf50538c2a363e2f4eb2c01a204c7ffbc0b981adc0fd997aafdf2a222ee84c309f6e95ec7de4fa85d4768d5c003165028225e22e09e", "signature": "b737d4e5be27deb6d87729c636dff7a406c013f313c38cf683fe14f75a3b3005d9535d7e5815c8f8b37c51d6927111c979f7d9d81a347aa9cc09ed4e6c18e90f" }, { "secret_key": "eedefc1757e3a7e5ed3946dbedc396a362f683d2c51b0b9f60765d4bfc5134de", "public_key": "a9872bc2192fc02b189ceed403ab9f270a032a835fdebfaf1c9d6934ed8304bc", "message": "b194db73f994cbdc3cbe630ba72c47c2249bc0592ab547942b1d1b882b44f5b3855e568bdddf92ef05022d88fcfc294e76b64a00e9c74355373763e49a4ebc47243d48a9ad588994a518f80f8615c2b31da587a53e529d435a8697350dfcde02d20cce7d5eeefe3f5ab2aac601259cda38538a1b8301f9832e75ab90f8a932f267eac181003965d5266f206180c6c380ece803577ccb46176bf607159486f24259747e2ca6fb1912db7b78a973b2846387c1208030ee1f400d0c5b5e8bde9635ae55638ba17c734de8638bb85dfcd76629a7f9f40d6ab954d55bf8575fc9c9a595097e0893db5a7b8a6c455ecbd3d22d725e19de2941f467f9eb93d66a0e2bbdbf92ed1c", "signed": "d5bea8ea9a5fe9ed6d2bf839930c0c6cd5039e988f551fdedb5437e1c1af0ed7b3897c035711c3c51926be8d1b32024d5cd582f5f8369ad84d18b12502652f07b194db73f994cbdc3cbe630ba72c47c2249bc0592ab547942b1d1b882b44f5b3855e568bdddf92ef05022d88fcfc294e76b64a00e9c74355373763e49a4ebc47243d48a9ad588994a518f80f8615c2b31da587a53e529d435a8697350dfcde02d20cce7d5eeefe3f5ab2aac601259cda38538a1b8301f9832e75ab90f8a932f267eac181003965d5266f206180c6c380ece803577ccb46176bf607159486f24259747e2ca6fb1912db7b78a973b2846387c1208030ee1f400d0c5b5e8bde9635ae55638ba17c734de8638bb85dfcd76629a7f9f40d6ab954d55bf8575fc9c9a595097e0893db5a7b8a6c455ecbd3d22d725e19de2941f467f9eb93d66a0e2bbdbf92ed1c", "signature": "d5bea8ea9a5fe9ed6d2bf839930c0c6cd5039e988f551fdedb5437e1c1af0ed7b3897c035711c3c51926be8d1b32024d5cd582f5f8369ad84d18b12502652f07" }, { "secret_key": "09d22bbaa5956cfacbbf9fd5510975128686c40c6ea96b89ef4c0f0c649bcd7f", "public_key": "e559ea8acbdc61b6709a7d83ae15849a6c78b203923dd0a299239ee4886930ba", "message": "1c26a0f3a1a5b2d7d5b297af8a6a689d7c62a25267e197d23becd2f2b816c4de92fbdaffb941c3fc8db7a84335a84cfbc92cb3ac806ed58df16b6b8e119a48df4f27c71e931a5938e7d002734885e13a258a15b6e1136efba72f1d096b689f7618f49c968063e8f991fa0b55601e430eee13492a1b09413eb23813591a7a9f070cc396ca9d1facdd4f4ce37c40f7245f55035e10fad6b85b5f01a1daacc0df94069f7de8f6467f96d1fb98648e8a0520a8cd723c98e9dc2dd4b2934d8228f0ae1a415bd3a7cda38d7a9983ce1af6f8c970a2a591635fe12b917536ef815eaf1a3138d70ce70a794264d7c986d9ee3290445f15a9248f2765271e5a992196ae331abd4164bf", "signed": "e65275c4328a70ad62408ed7fb1728be87a73a814fee8ebd94f2665c71bc66ab0c1b07a600b30bc081a74c536857c20610384be268d9af3e3ecddd3eb0c14c0c1c26a0f3a1a5b2d7d5b297af8a6a689d7c62a25267e197d23becd2f2b816c4de92fbdaffb941c3fc8db7a84335a84cfbc92cb3ac806ed58df16b6b8e119a48df4f27c71e931a5938e7d002734885e13a258a15b6e1136efba72f1d096b689f7618f49c968063e8f991fa0b55601e430eee13492a1b09413eb23813591a7a9f070cc396ca9d1facdd4f4ce37c40f7245f55035e10fad6b85b5f01a1daacc0df94069f7de8f6467f96d1fb98648e8a0520a8cd723c98e9dc2dd4b2934d8228f0ae1a415bd3a7cda38d7a9983ce1af6f8c970a2a591635fe12b917536ef815eaf1a3138d70ce70a794264d7c986d9ee3290445f15a9248f2765271e5a992196ae331abd4164bf", "signature": "e65275c4328a70ad62408ed7fb1728be87a73a814fee8ebd94f2665c71bc66ab0c1b07a600b30bc081a74c536857c20610384be268d9af3e3ecddd3eb0c14c0c" }, { "secret_key": "77826ed351a3f09254ae5692885d774cb3f24410a4809fd90f8a00da9aee9903", "public_key": "3eac8f41ee73e6ef136821f7957a1c27e15638d0e3916e6caac6fb7beb7bcfb0", "message": "1ff06c0b3999cecb1900a47d267beafbb35d93d14cb2c8925e3e3fe5d967586925ee4baa41998edd0103205810aad5c0bbdc77874476810246d13089a64db576424fae0bed9664a42a491147d1ee3b9c3b1ba4875be15462392540f9978d9a4630ba4c525499751a45efc299ec7d73b17f9ad275ee71a687e72690d7320242d2dc2bd4d5c5cf0f17a465185dcf60f8efff53903f20b0c2ab2192d44368f2f2fb36048af071f7aa857b14ad1d11461205bebe17e02be2e3ccb6092821885c4e0d4811be3f45b1fea088453e022432f562562b43a355cb56270cedb6c2c42dbf9be850e77192fdc65cfd36834be988dbe9a93e2518c138b090fb9da827cb1c91c8fe52fe7c57f7", "signed": "977adccdb829b40bbd8e53856a783db346a39dff62041a2972d29009f1c9ff81b8ad54cb901e497c1d3021b50b6c69ee73558fd7be05d625f5727f9af2ce87021ff06c0b3999cecb1900a47d267beafbb35d93d14cb2c8925e3e3fe5d967586925ee4baa41998edd0103205810aad5c0bbdc77874476810246d13089a64db576424fae0bed9664a42a491147d1ee3b9c3b1ba4875be15462392540f9978d9a4630ba4c525499751a45efc299ec7d73b17f9ad275ee71a687e72690d7320242d2dc2bd4d5c5cf0f17a465185dcf60f8efff53903f20b0c2ab2192d44368f2f2fb36048af071f7aa857b14ad1d11461205bebe17e02be2e3ccb6092821885c4e0d4811be3f45b1fea088453e022432f562562b43a355cb56270cedb6c2c42dbf9be850e77192fdc65cfd36834be988dbe9a93e2518c138b090fb9da827cb1c91c8fe52fe7c57f7", "signature": "977adccdb829b40bbd8e53856a783db346a39dff62041a2972d29009f1c9ff81b8ad54cb901e497c1d3021b50b6c69ee73558fd7be05d625f5727f9af2ce8702" }, { "secret_key": "99a99531c3cd6e3e9c900a9eeb26267e72f09d11b651a897ebb79be016f64c6e", "public_key": "9bf9f8b48a2728e02608fc19899d219656839d1cc1e9a8984df674ec26662f41", "message": "7a89c0c1952fdc4298dcaea854efc134656be147e9e8e82fc9a449059d80570f75676b81c4a94f76a968200cdeb0988c73f59afc72ad4c3103e19fe63b7e95e140b5cb2efc7b97a6ffbb6c298ddace3be6d2ed3d598b8bdf0c2fe6c97602142a76e978514c196c1b9a88efdc1925fc506155cff9a2f21ab634e2b93e96928a5d8f7ce4cb7326d9689469242ba9c6a01b77496badef87578f5a17284e900a72df141c6199b0e71ab5da4375037617ec6196d4f4e23ae2916a72d0fce796022305ac9fbbbbe4705b340e42b78e1c02bb1001860cdcaf71ed89255dd56cc0b31c59d4596dcef84e22234be562bd801e94111d83a78064c90f9d82fce91f68abb03c73b6bd8d7e02d4", "signed": "0e89da5d949cf2bf40c7e17c2d0f9ceabc88a092eb4d49cfbfeab7c8bff43245c67b9e2e92f9bcb9b34b3fcf8b01fa2ea7a9649f814c3aa98b3dd04540c31d097a89c0c1952fdc4298dcaea854efc134656be147e9e8e82fc9a449059d80570f75676b81c4a94f76a968200cdeb0988c73f59afc72ad4c3103e19fe63b7e95e140b5cb2efc7b97a6ffbb6c298ddace3be6d2ed3d598b8bdf0c2fe6c97602142a76e978514c196c1b9a88efdc1925fc506155cff9a2f21ab634e2b93e96928a5d8f7ce4cb7326d9689469242ba9c6a01b77496badef87578f5a17284e900a72df141c6199b0e71ab5da4375037617ec6196d4f4e23ae2916a72d0fce796022305ac9fbbbbe4705b340e42b78e1c02bb1001860cdcaf71ed89255dd56cc0b31c59d4596dcef84e22234be562bd801e94111d83a78064c90f9d82fce91f68abb03c73b6bd8d7e02d4", "signature": "0e89da5d949cf2bf40c7e17c2d0f9ceabc88a092eb4d49cfbfeab7c8bff43245c67b9e2e92f9bcb9b34b3fcf8b01fa2ea7a9649f814c3aa98b3dd04540c31d09" }, { "secret_key": "aa58403e763bac405db065eb11eb6be3e3b6cf00ec4a222b52bff4b6e3d156ac", "public_key": "167f9b9a4665f93f5d7d3016ace6fbd13420b2e51e72bde59eedf26993b66cae", "message": "3baa0998ff02b32b90b51f9a840c7b5c5870cfb1810a9b0f77b55909d47ad335147a991c29fbebfc592e9307175c1964129a2d5efc6215807453bcd726969781222bcad1c99a49748b9ee667c4d0c82889e2f50064c115dbd8fb483d72ab0ccadf76bddb2dc727dbc3fa5c4624c283d8921c8aa4425110dcdd69c05e5ed59b359625eeaaec1e27eafe9d9a5ce736c3f9c527ea547818b9bca6811be4cc15058a6f5b683303b80c90c94a83b8b15869713a66b1e0f656331b286d1ef7698834ab3e138417aad6bb3ab3bd9fc78761a482dfc654f3f8628c8d9fc16018898f1641e8622bd272e38d41706cb9cebe6ee5e173576bf61bb1188cf2f39c62220bba88fcb4de4898b25b04", "signed": "64b598ca5b8f9ae742e46ee0d8c1aaf31458b50c25d267a677e44be5b755f14d51801a30399bfcc38d14071aa0ae93da825a581ab6c20725a0a910b4735dfa0b3baa0998ff02b32b90b51f9a840c7b5c5870cfb1810a9b0f77b55909d47ad335147a991c29fbebfc592e9307175c1964129a2d5efc6215807453bcd726969781222bcad1c99a49748b9ee667c4d0c82889e2f50064c115dbd8fb483d72ab0ccadf76bddb2dc727dbc3fa5c4624c283d8921c8aa4425110dcdd69c05e5ed59b359625eeaaec1e27eafe9d9a5ce736c3f9c527ea547818b9bca6811be4cc15058a6f5b683303b80c90c94a83b8b15869713a66b1e0f656331b286d1ef7698834ab3e138417aad6bb3ab3bd9fc78761a482dfc654f3f8628c8d9fc16018898f1641e8622bd272e38d41706cb9cebe6ee5e173576bf61bb1188cf2f39c62220bba88fcb4de4898b25b04", "signature": "64b598ca5b8f9ae742e46ee0d8c1aaf31458b50c25d267a677e44be5b755f14d51801a30399bfcc38d14071aa0ae93da825a581ab6c20725a0a910b4735dfa0b" }, { "secret_key": "1044ee3708c0b0e909a8cb2ba2cd0af8d28a5de01d962e826087fb232df7b2d2", "public_key": "46d241ea0c702c1889d44655824629b67284d4e644a48fa45455d27ac5f62529", "message": "b8a445455fb66e17e3143d35204c9ea93474eebeef93963ee5c1d377ca217acd4ca63e5755da08fbffdbd4352bf165193896c8d6f76bb4cd3bc2d3a476a4e320824a1210ce74d0014d747f111eec310c5c89ed4d0850e811f80a8bb28dcaf6f411df83e2c1dfd90c4ad23561454eb5d756b63b4ea7f37dc5d466c16ef70d11190c4f5316fe2aa8597440e88bbebaeb35ea5f04f07b0339264158ef909ad5163bfc248cd724133e274f812695f290e57176a96b9393d07bb310299f5d2a6b6dd1dabcb51bf29c5afa7ebb0701c6c84767ac137793091fe0ed6e47d780628a32c84f83e00e9c16742a523ecb63c24f4a338ed299a06194924f44c5a5d3c937ff9b0945982ad24a2d1c79", "signed": "7d6bed7f87d090abe013c31e1203903bac9c93445d06c7b53d31d15f970d88647a7ed2c3a63050ba19d68043aadd18bd861de1ac4715b8e828b2b16f8a92b001b8a445455fb66e17e3143d35204c9ea93474eebeef93963ee5c1d377ca217acd4ca63e5755da08fbffdbd4352bf165193896c8d6f76bb4cd3bc2d3a476a4e320824a1210ce74d0014d747f111eec310c5c89ed4d0850e811f80a8bb28dcaf6f411df83e2c1dfd90c4ad23561454eb5d756b63b4ea7f37dc5d466c16ef70d11190c4f5316fe2aa8597440e88bbebaeb35ea5f04f07b0339264158ef909ad5163bfc248cd724133e274f812695f290e57176a96b9393d07bb310299f5d2a6b6dd1dabcb51bf29c5afa7ebb0701c6c84767ac137793091fe0ed6e47d780628a32c84f83e00e9c16742a523ecb63c24f4a338ed299a06194924f44c5a5d3c937ff9b0945982ad24a2d1c79", "signature": "7d6bed7f87d090abe013c31e1203903bac9c93445d06c7b53d31d15f970d88647a7ed2c3a63050ba19d68043aadd18bd861de1ac4715b8e828b2b16f8a92b001" }, { "secret_key": "95dd1a5e658fa6c8d42507b3e5b8edb5baeca62deb00fc5d4dca8e1ab5835e59", "public_key": "3a5323dd1e07f323bb6d83e9c2db92a29f62e2e003ee0deacd7e2e4e030d8d27", "message": "9b7afd48c474604c26367531556840c388668b0f3840063dfc9869ad5b901274b931293d04f3c8e8f7f8eab815a641d7c351284e8bb0437ac551bb29438964e6a7c7ba772344b333f9eda5a77568c8931ddcaf21e32e07b10bf4820fb859bcf87b81c4bff426f24a4d468f2e9aeda8f17d939709970db11df76247e98a39eb8b38f5949f349f2ae05ab48c018517c48fa0205dc7f1566453e105e48c52eb455c0c40802f797b3eefb1e2f3b1f84315aed5b0711c6499a691b74b91f12ef70f76c4c05c1aa1a993e2f3e528ab343dd2368162f4036a61a13a88045dcdefa85d68532275bcf5b8f5f00efdea999a95783175d9ee95a925d48a544934d8c6b262225b6ebea35415dd44df1f", "signed": "d02a7523dcbd29576ba809b531037774df41734a41175813119c6a6a788cd9b8ad780865678667699ae66d010919a966a051c08163df67a977ee6e220d0dc30f9b7afd48c474604c26367531556840c388668b0f3840063dfc9869ad5b901274b931293d04f3c8e8f7f8eab815a641d7c351284e8bb0437ac551bb29438964e6a7c7ba772344b333f9eda5a77568c8931ddcaf21e32e07b10bf4820fb859bcf87b81c4bff426f24a4d468f2e9aeda8f17d939709970db11df76247e98a39eb8b38f5949f349f2ae05ab48c018517c48fa0205dc7f1566453e105e48c52eb455c0c40802f797b3eefb1e2f3b1f84315aed5b0711c6499a691b74b91f12ef70f76c4c05c1aa1a993e2f3e528ab343dd2368162f4036a61a13a88045dcdefa85d68532275bcf5b8f5f00efdea999a95783175d9ee95a925d48a544934d8c6b262225b6ebea35415dd44df1f", "signature": "d02a7523dcbd29576ba809b531037774df41734a41175813119c6a6a788cd9b8ad780865678667699ae66d010919a966a051c08163df67a977ee6e220d0dc30f" }, { "secret_key": "1abc0b9aa01dc57ca53efe7380962b1a88d50a964f5cd98640982c74393f2926", "public_key": "8d4fd14394d7c1405700306983fbf76ea9f171b15a6b56612a1feb1cbdae5dd5", "message": "da2dd940d5e1db6e80bf7e2b782e7e745cd4fd252e981517975887dd05ac77ed837d082961575efedf301fdf24b70718b991b8d92bdd2e6bee17c8aa4bc694a727bcfc78fd85195c42caf883a2c38d161cadd79cfda9a39110e1264d30bd4c5c4a5876777f233b071b1b0b408935f0468954cc744af8063b004ede56cd981c4dd5608abffeaec9e58f3fafaa671467804b7fa2558f4f95174201f183d80a5914065fed53115b41ebc338f78df050053b8a4e75ea7c6fdc354dad27bfd8a2e66fcd7ae2f587d24be0d4a33da30a220e51bc05fa4e412b959fd95d89ea6ec0162516c096a9433a9e7cf599c928bd5305c2173bf7493ed0c1c603cd03f082cce44237a79ffd8be9a672c2ebaa", "signed": "f738af2d3e290b3d23d9aff7414bfc5ffa47235dc053687a8ba5c8541b8511f781566cdaa130e0677db55fa8be9d81a092cb58923a8628494d2f62d95c167100da2dd940d5e1db6e80bf7e2b782e7e745cd4fd252e981517975887dd05ac77ed837d082961575efedf301fdf24b70718b991b8d92bdd2e6bee17c8aa4bc694a727bcfc78fd85195c42caf883a2c38d161cadd79cfda9a39110e1264d30bd4c5c4a5876777f233b071b1b0b408935f0468954cc744af8063b004ede56cd981c4dd5608abffeaec9e58f3fafaa671467804b7fa2558f4f95174201f183d80a5914065fed53115b41ebc338f78df050053b8a4e75ea7c6fdc354dad27bfd8a2e66fcd7ae2f587d24be0d4a33da30a220e51bc05fa4e412b959fd95d89ea6ec0162516c096a9433a9e7cf599c928bd5305c2173bf7493ed0c1c603cd03f082cce44237a79ffd8be9a672c2ebaa", "signature": "f738af2d3e290b3d23d9aff7414bfc5ffa47235dc053687a8ba5c8541b8511f781566cdaa130e0677db55fa8be9d81a092cb58923a8628494d2f62d95c167100" }, { "secret_key": "cbffce2c9bd3e23e406e5f66e632dcfa726654d29a955cec983173235fa359d0", "public_key": "49653edd64a55f7cd40eaf3f8e72eb96dbcdee398f34817f2c95867949710b14", "message": "1ffde6826e4f0c24a7961f191e74cc0bbc928e3f1aec3efab32765c2501cbc1620e7ee6f61fccfb00cfca9fb98143b529bcc8c3d0fdf89ee7c342f101815fabf7deaf9f302a288fe175826d590d99ee6fd92da74f9596b783c0e7d47d711a32f39ea4165e5212431441b498c6b70db3b09d1f4e4a14a6bae39da5088bb85b3285ce9df2f90681af2c74dece439aeb91e1c1b0712eddbee8d72569828f37cb720c509d02aec476070484e9b16ec7179947ac96caf0e1be8b6b74f372d7235fe6e3999df733bccd482dfe2e631f56b582667dce5e3121763adfacf3b18cf2095f7394dee4927fc2bea6b5824d90cd59e854ec5872b4551b02efaba5ad54a9b7a8f6de5d7cda5825b325b076ded", "signed": "e7ced4fa2a7dff73f1068bbad0ec9a1109043c97a62effa148876f0969ed4dc608e28bce797af3b82532c94dec4d6811b7f563679129facf17bb73d69375eb051ffde6826e4f0c24a7961f191e74cc0bbc928e3f1aec3efab32765c2501cbc1620e7ee6f61fccfb00cfca9fb98143b529bcc8c3d0fdf89ee7c342f101815fabf7deaf9f302a288fe175826d590d99ee6fd92da74f9596b783c0e7d47d711a32f39ea4165e5212431441b498c6b70db3b09d1f4e4a14a6bae39da5088bb85b3285ce9df2f90681af2c74dece439aeb91e1c1b0712eddbee8d72569828f37cb720c509d02aec476070484e9b16ec7179947ac96caf0e1be8b6b74f372d7235fe6e3999df733bccd482dfe2e631f56b582667dce5e3121763adfacf3b18cf2095f7394dee4927fc2bea6b5824d90cd59e854ec5872b4551b02efaba5ad54a9b7a8f6de5d7cda5825b325b076ded", "signature": "e7ced4fa2a7dff73f1068bbad0ec9a1109043c97a62effa148876f0969ed4dc608e28bce797af3b82532c94dec4d6811b7f563679129facf17bb73d69375eb05" }, { "secret_key": "9f91231497484cab39b9e20f861181d397908577bbb2968242d071bca4813ffb", "public_key": "8824bc6cd6a6f15a5f41668f2b3bae8fc4967383078d08b51d6d1b2b93a1071f", "message": "21d4fbc98163c3fb6e09f775c2ab7b18b18792340bafedacb49605622e3c08aa3b2b8d0e0902f361aa1c0f652e2732b10a0c5c6a05098996b588267cc8951a78b5d431e7222bbb508eeef1b5e8b8d01d3991e18dddc6ca8d222ef177ce62938d1810eecf06f4738b28f440946ccad2a12e39d38611bed3a39f93419a179ec2b1b52d5fe5c80c23b84d8803755f5146092cc199b4bdcea5bcf2037bd53ff6346694155f027d8ce2baffe30a5666596c00783aaeade9c77fc8637942ece017d6484c2899b1918d3a480bd5157678d4772d271f9b99768ee1bcc46b2489ae87cd030f47d1333c7672cb902cb4f5fe746e853de57940ba2264d3e629644d653a5b7af78ce64a993f36250f8cb7cb45", "signed": "0a1c706dd8a13077ab18386c65fa97cf9dfc43542d1846ecbddeb7b3c93f3c66f3ccd0447aacdd4dad8fbf736c4ff9dbdb62bfc14d8883e385bce9bac56a350c21d4fbc98163c3fb6e09f775c2ab7b18b18792340bafedacb49605622e3c08aa3b2b8d0e0902f361aa1c0f652e2732b10a0c5c6a05098996b588267cc8951a78b5d431e7222bbb508eeef1b5e8b8d01d3991e18dddc6ca8d222ef177ce62938d1810eecf06f4738b28f440946ccad2a12e39d38611bed3a39f93419a179ec2b1b52d5fe5c80c23b84d8803755f5146092cc199b4bdcea5bcf2037bd53ff6346694155f027d8ce2baffe30a5666596c00783aaeade9c77fc8637942ece017d6484c2899b1918d3a480bd5157678d4772d271f9b99768ee1bcc46b2489ae87cd030f47d1333c7672cb902cb4f5fe746e853de57940ba2264d3e629644d653a5b7af78ce64a993f36250f8cb7cb45", "signature": "0a1c706dd8a13077ab18386c65fa97cf9dfc43542d1846ecbddeb7b3c93f3c66f3ccd0447aacdd4dad8fbf736c4ff9dbdb62bfc14d8883e385bce9bac56a350c" }, { "secret_key": "1e2bd5487c5f5ced461f604dccb4e78eb91608f0b821f5afc4e3e534f7960392", "public_key": "ef825475cf2051a2017ae532f077d96774347d2767ea7b45f9c1b860ab993506", "message": "1dbbbb13cdad88854b809ceded273343d306a8deabf3ff02c9cec6f002b8e9e10ef5d1b0f5711f33267aa91c171b61e960f740457b81d751a473f44f750a080cab80af7ccca7dffcfac9ee4c39dc85cbdf51259ccd3470d9bad3ad30f4ee5dbd4fac6bd5c6c4df7311a470044695a7e1a7e18572207588afa57eebcd4d575b6d424457ee92465ce1863e3c677cf875fdb98d4078ebe7144260807052577144cb8e0359aa42ad155d79dae3deb99c4632c191c799cbfe587d954787068d663bdfc0fab1334f1876bf498c4db5c53db7b0204ed5a521c62f09eaca8d0189f3b394143f29c421cb5c8d07bd751baf4cbe3bf4be1701df4b2207dfb2904d84f4dbda51cba576d5a5bb16efe698edd608", "signed": "4d33c96a2e3a5db7391adf65c1cc3565fe76eeafd0b5c7abb0b492a0b51e1fa33639946a243b2ddef357552298ce0aa95eac6fbfe660988271877eb2a7da18061dbbbb13cdad88854b809ceded273343d306a8deabf3ff02c9cec6f002b8e9e10ef5d1b0f5711f33267aa91c171b61e960f740457b81d751a473f44f750a080cab80af7ccca7dffcfac9ee4c39dc85cbdf51259ccd3470d9bad3ad30f4ee5dbd4fac6bd5c6c4df7311a470044695a7e1a7e18572207588afa57eebcd4d575b6d424457ee92465ce1863e3c677cf875fdb98d4078ebe7144260807052577144cb8e0359aa42ad155d79dae3deb99c4632c191c799cbfe587d954787068d663bdfc0fab1334f1876bf498c4db5c53db7b0204ed5a521c62f09eaca8d0189f3b394143f29c421cb5c8d07bd751baf4cbe3bf4be1701df4b2207dfb2904d84f4dbda51cba576d5a5bb16efe698edd608", "signature": "4d33c96a2e3a5db7391adf65c1cc3565fe76eeafd0b5c7abb0b492a0b51e1fa33639946a243b2ddef357552298ce0aa95eac6fbfe660988271877eb2a7da1806" }, { "secret_key": "f78db14d6d1a643dd7735baf2635321244e7ec8ca72c5c38c98c809db9cb5a55", "public_key": "5414f75f52f3864afb0c79c2c5c1d06b4bce400fbddf17fe9cfb2a8bac47a0dd", "message": "05caf1b8edc3b173fbc1ed29b95e2bf06d814ba2407d4b31c728d04ec273d25394423ac7d4fff2ca36ee90273093c756e2bd13c96d4a3dc7f5be1759fcd328eb66c5882b58fa4588e5b2a3713a4154a2340d0b06ad019601b0e028e497f898256b028af95cd8168df5e58a57cd1ebfc0a0c91ced61dbb480aca7df8dca91eb16e98007cd2cd1a2045b0e4477d12d5a4072f365426567c9d61577f3485c8f46605e7f475ef04a3948f60dba8c5508d14bfddb9b11dd044ef2d84c16b9a9038d8e78eda43b91297df35f4361a383b41d49677a687d5b344ad1ab0fc73017b3bebf32306fb3fd7b3d5071f3ab5f6e49aa15540cad6503bea7784cf9421801ce1385839893362a97fae121300d6783af0f", "signed": "d7cbd4181f67712007b7f0e18452e0a024464d9dc9b5ff9cf669d1b91169d7573262f83336b97c861bfab3fcf669223ce8caf319f21d23f1fa331a2d89b6ca0b05caf1b8edc3b173fbc1ed29b95e2bf06d814ba2407d4b31c728d04ec273d25394423ac7d4fff2ca36ee90273093c756e2bd13c96d4a3dc7f5be1759fcd328eb66c5882b58fa4588e5b2a3713a4154a2340d0b06ad019601b0e028e497f898256b028af95cd8168df5e58a57cd1ebfc0a0c91ced61dbb480aca7df8dca91eb16e98007cd2cd1a2045b0e4477d12d5a4072f365426567c9d61577f3485c8f46605e7f475ef04a3948f60dba8c5508d14bfddb9b11dd044ef2d84c16b9a9038d8e78eda43b91297df35f4361a383b41d49677a687d5b344ad1ab0fc73017b3bebf32306fb3fd7b3d5071f3ab5f6e49aa15540cad6503bea7784cf9421801ce1385839893362a97fae121300d6783af0f", "signature": "d7cbd4181f67712007b7f0e18452e0a024464d9dc9b5ff9cf669d1b91169d7573262f83336b97c861bfab3fcf669223ce8caf319f21d23f1fa331a2d89b6ca0b" }, { "secret_key": "7dfa328e90a1b849c219e3da832df9ed77448234f0d89ea5d17a3d64e7883daf", "public_key": "e30ce6fd5f5800389a70cd117364f59945afb180f229927360b06b4835f8dc91", "message": "e5e495d663f47236714532687a24308f942ca9c33e088f7f106a5a723518cacbbef4a68c939a6950b2dc2589f82d354e575272d42b1383d315ab8a20aa0cdc9d4df678ab3b26612b5dca66e71f9f3fa7d9e731dc481e2bc7127cea3b6203ca6cd8162e90886a73dc46c83ddefc4b9e2d53d29dd387c624e08bd8d53be928a40a9aa8ae8b1c8d0fb6a7bd6dce5f62315b7a2181f627f256bbe7e2a95bf464e6132204c174209629840235b2c39913301a4b40325d118d384bc7ac028cd4f12702e161191b149e4209058a55122bbb8b22b24683ba4f8e2e6ccfc08dc8c8b1bcfb6d60bd8f062196933df319ab16906d085730eba1720d4b02c67daf38cce6aba38e25d68ef95b2f521913a1d77d5eb650", "signed": "1c61d53b872f8cde598609682c79f6c5df007c513a71cfb3a06dcb82d85c4b00ccc40b00e59f595393088b4cd0432855c67a207da71f87e72c409b3e50279507e5e495d663f47236714532687a24308f942ca9c33e088f7f106a5a723518cacbbef4a68c939a6950b2dc2589f82d354e575272d42b1383d315ab8a20aa0cdc9d4df678ab3b26612b5dca66e71f9f3fa7d9e731dc481e2bc7127cea3b6203ca6cd8162e90886a73dc46c83ddefc4b9e2d53d29dd387c624e08bd8d53be928a40a9aa8ae8b1c8d0fb6a7bd6dce5f62315b7a2181f627f256bbe7e2a95bf464e6132204c174209629840235b2c39913301a4b40325d118d384bc7ac028cd4f12702e161191b149e4209058a55122bbb8b22b24683ba4f8e2e6ccfc08dc8c8b1bcfb6d60bd8f062196933df319ab16906d085730eba1720d4b02c67daf38cce6aba38e25d68ef95b2f521913a1d77d5eb650", "signature": "1c61d53b872f8cde598609682c79f6c5df007c513a71cfb3a06dcb82d85c4b00ccc40b00e59f595393088b4cd0432855c67a207da71f87e72c409b3e50279507" }, { "secret_key": "6ce13d3c2ec71fed83131a69d5d030314ab49e6565ef68163fff09ac5d9b47e7", "public_key": "9c7b1118fab91e0e7b192a23d95fb877cb7936cc6c8a330592f48e6784edc292", "message": "10bbc311eb2a765e0167ff37618ff70e13f02d7b0617ae4ac06befbbe149c972a994f680ca4dc9a92ec7efa53997fad356b9ff4ebdee629541d1f4dea62ed0d2494f9ccfdf07a9310491f61c4b3e2700b4a3c668d678329a38c2eff9d8cba431fb959e7f7655bd0fbd77d53bbbc2eb8dc51dd718ed98728a181686be122b844d3da331e329d3959b5923f7734325a021026e2754e17a15108be801465ad958dbcf21df890cfe5d5b883ca43c61cedccbdb58b849ea75374f1e918e803e577a5dc7a1c17936eccfcd3481bd2b1eb075b83237ca6f3c07c19e9af9731267be82d4898eee96ebc900d48b059d51b0dd415b1c890660a88d25f5c5f35d8e45e523e0ce3336923ab43670e35c5057d56c758876", "signed": "608b2bf6f6da05c2ac5bbfd795a2ac32c79c74153f9431dea59768ff4c225e3b693b645a506766b860850ee97ea43032b05b69e56767e8eb9d1918df9afba80510bbc311eb2a765e0167ff37618ff70e13f02d7b0617ae4ac06befbbe149c972a994f680ca4dc9a92ec7efa53997fad356b9ff4ebdee629541d1f4dea62ed0d2494f9ccfdf07a9310491f61c4b3e2700b4a3c668d678329a38c2eff9d8cba431fb959e7f7655bd0fbd77d53bbbc2eb8dc51dd718ed98728a181686be122b844d3da331e329d3959b5923f7734325a021026e2754e17a15108be801465ad958dbcf21df890cfe5d5b883ca43c61cedccbdb58b849ea75374f1e918e803e577a5dc7a1c17936eccfcd3481bd2b1eb075b83237ca6f3c07c19e9af9731267be82d4898eee96ebc900d48b059d51b0dd415b1c890660a88d25f5c5f35d8e45e523e0ce3336923ab43670e35c5057d56c758876", "signature": "608b2bf6f6da05c2ac5bbfd795a2ac32c79c74153f9431dea59768ff4c225e3b693b645a506766b860850ee97ea43032b05b69e56767e8eb9d1918df9afba805" }, { "secret_key": "d45ee69a5f1a7cfdd0343f8770d1c6bc026f067a70dbe839a86f2aa068c33f81", "public_key": "fc8d9fb0e4f34793090755e0328096e01e281ea351b8d95cd9116e131a5ca54e", "message": "eb5ed8ab79cbfe61c25981b9d1d6b70f10b60194b4161fe17d11aff1767994aa0813e9ece2f4c5d531b99e8adf1888c30a63893eb451aaf55acd5a52ad8c401faa88d6eacf3e49470566114fd0c6a274e9544846b0ae9bfa124d7951eb26715e19253ff7edc8a70965776f23ce46031e034a200723ba3d11e11d353d7e7cd84aede267ff64bed418cb9f28c61cd0f63b6ce2ecae14b20bc6bdaed8c428bad18be4b7d66338364acd8042a8256f258a69969b8d3ca2eab3aea3706e5f21c3b1efcc254a824bb4e7ea7aba8827c8eb82786c665aa973821931ff990a63fd34a74a6d8c22a882b0b935152ccb36fcc76f4eca65d67c8680942f75dfad073439c0916065e83877f7ba209303f33548d9e40d4a6b", "signed": "156c51c5f915d89b8d1400350f8f217a5c02e2629ede9f4a30b6e71d1ea7a953cc6db31ba5c778c269920b649fb4221c6d38cf2cea2a7de3ad423e04faaa0607eb5ed8ab79cbfe61c25981b9d1d6b70f10b60194b4161fe17d11aff1767994aa0813e9ece2f4c5d531b99e8adf1888c30a63893eb451aaf55acd5a52ad8c401faa88d6eacf3e49470566114fd0c6a274e9544846b0ae9bfa124d7951eb26715e19253ff7edc8a70965776f23ce46031e034a200723ba3d11e11d353d7e7cd84aede267ff64bed418cb9f28c61cd0f63b6ce2ecae14b20bc6bdaed8c428bad18be4b7d66338364acd8042a8256f258a69969b8d3ca2eab3aea3706e5f21c3b1efcc254a824bb4e7ea7aba8827c8eb82786c665aa973821931ff990a63fd34a74a6d8c22a882b0b935152ccb36fcc76f4eca65d67c8680942f75dfad073439c0916065e83877f7ba209303f33548d9e40d4a6b", "signature": "156c51c5f915d89b8d1400350f8f217a5c02e2629ede9f4a30b6e71d1ea7a953cc6db31ba5c778c269920b649fb4221c6d38cf2cea2a7de3ad423e04faaa0607" }, { "secret_key": "8a76eaab3a21ec5a975c8b9e197a989e8e030899eb45d78968d0fb697b92e46d", "public_key": "2d9c813d2d81e2730b0d17d8512bb8b5d33f436cabaa13e141ca1cb785014344", "message": "c6c78f2e2080461aed9f12b4f77c989b19716780fab60e6ecb9793b4bc7ed69e5f70fa6bdba16e9bd3194969eea6665abfd630deeefa3d717b6d254dd24bc97dde21f0f29f9ed34b8bd7a013380f4f82c984fdbd95af9805b744bcd952c5a71fbb57d11f411c18cc30bc3594f7ad8228cb6099394a1b6b0a818581bdf93cce58f3a4a23e55db3e69ca9d60cfb3a907fb68329e2ffb6c65f1e828d28127109c9e9fb70160f2ef82a2ee9f9bd170c51e13fd3fc1866b22c79fe6d5101217979dbe2724dcad8a9bc69acc42c112dc697bd271eea550e9e50406bfd28245b83b8f012d34db6dbdd55ae6e575745c153d6e7534901027eadc2fcc33a5287ddbca6d3aeab8972294dc6c712b9942547277340e7ad19e", "signed": "fceecca4b014fecd90b921b0fa3b15aeaa4e62caa1fb22729c70269232c33cef0d0aeea66432c128afb9a3646bc7f03a12774da8758398c2a0dcce0bbbf6740ac6c78f2e2080461aed9f12b4f77c989b19716780fab60e6ecb9793b4bc7ed69e5f70fa6bdba16e9bd3194969eea6665abfd630deeefa3d717b6d254dd24bc97dde21f0f29f9ed34b8bd7a013380f4f82c984fdbd95af9805b744bcd952c5a71fbb57d11f411c18cc30bc3594f7ad8228cb6099394a1b6b0a818581bdf93cce58f3a4a23e55db3e69ca9d60cfb3a907fb68329e2ffb6c65f1e828d28127109c9e9fb70160f2ef82a2ee9f9bd170c51e13fd3fc1866b22c79fe6d5101217979dbe2724dcad8a9bc69acc42c112dc697bd271eea550e9e50406bfd28245b83b8f012d34db6dbdd55ae6e575745c153d6e7534901027eadc2fcc33a5287ddbca6d3aeab8972294dc6c712b9942547277340e7ad19e", "signature": "fceecca4b014fecd90b921b0fa3b15aeaa4e62caa1fb22729c70269232c33cef0d0aeea66432c128afb9a3646bc7f03a12774da8758398c2a0dcce0bbbf6740a" }, { "secret_key": "18a8f93648cdcf47133630af1e11c0ceea3de07327314c96580df775597d7a9c", "public_key": "2912f41ab4c87e3937a03331802cba87716b4eea14b9fba6f546d0ac2c0973df", "message": "592093ac7cd671d6070b0027edac1fb015cc205d78bb603f378eb9f8aa388ca830db3cb23420c7e852db0b55241eb88a02cc627aa94143be439aab4bf2634757470406e842f20eb10f0700e3c2da364f588a8000f23850c12ce976f326d2df1bac13e95020b412b175bf74bd7ebbacf3ae55c0daebb5c010bf804feee1d7d49fae050bea55996f53cfe1f15a0cf20727db4ee311c260bad9682d7b965e27a9491f471d4a473aff646c7d424d5a0bdcbb8a0233f4b3060dd04c98ec98dfd05ec7247884e2d8e152d4ae52b3d5865d9efd6706a60e088e1e7c9f624510abc7a2045a2c7a7588e2535e73191dd5cf05421563f556a13e8236670343cd5ba4d466e245c4ee3b5a41e70c9a0f5e6ea2c559ebe61ba81e", "signed": "3b77394cd69f8b45d00cfe3a79a7900628a56518b379ed8a11581fc3a376e5d66807df11e70904f696c741d21d139310fa1b89a93bdc4d2c3997991f5220ee00592093ac7cd671d6070b0027edac1fb015cc205d78bb603f378eb9f8aa388ca830db3cb23420c7e852db0b55241eb88a02cc627aa94143be439aab4bf2634757470406e842f20eb10f0700e3c2da364f588a8000f23850c12ce976f326d2df1bac13e95020b412b175bf74bd7ebbacf3ae55c0daebb5c010bf804feee1d7d49fae050bea55996f53cfe1f15a0cf20727db4ee311c260bad9682d7b965e27a9491f471d4a473aff646c7d424d5a0bdcbb8a0233f4b3060dd04c98ec98dfd05ec7247884e2d8e152d4ae52b3d5865d9efd6706a60e088e1e7c9f624510abc7a2045a2c7a7588e2535e73191dd5cf05421563f556a13e8236670343cd5ba4d466e245c4ee3b5a41e70c9a0f5e6ea2c559ebe61ba81e", "signature": "3b77394cd69f8b45d00cfe3a79a7900628a56518b379ed8a11581fc3a376e5d66807df11e70904f696c741d21d139310fa1b89a93bdc4d2c3997991f5220ee00" }, { "secret_key": "206cd2b8114aae188d81862ccec4cb92c4ef5fc78c24435a19f9ed9b8a22f47e", "public_key": "97a67ac2811f529456df532737d76bed7e387da83bd55459372fdfb27ffacff3", "message": "480c4800f68c79f5dfc0c3666c0ac429b30fe0c5fe848750db2171380b80c8e9fec0a054b16d08674cefe2f64ec28bb6b0596b35235575f189bee259aca766c222ac0a46cf2af75774da4e34a0b54fc2ac49ec8bedf4887cd9b7be4fdb7f686902ddfab04627e26ea2dc3d97d62a4b1546180218ed8fa113334819b5275cc54afdee44309008596507971675e6d8b8a8edec4718f2d4bd735213cbbd18791faa8054174907a7ac17d7143a4757e493beeec4849d0b836f18bb2b3c9016f25af47fb96199251720549f15d149503d41095e25f26209daac39154485c3ded7cb1a8c3e83a52f5a06ec09cf83df00726b7968f64c0cbae299512fb438560f04b3b644346f938ac8e90486614cd844b54eae078bf678b3", "signed": "73a40d9da08fb98ea25b67e721557a1a51225294d316b53149af895fa4d63cb4a3f56f688566ef6da42fd2941dffa06d497aa902165d50213a6214116299a90c480c4800f68c79f5dfc0c3666c0ac429b30fe0c5fe848750db2171380b80c8e9fec0a054b16d08674cefe2f64ec28bb6b0596b35235575f189bee259aca766c222ac0a46cf2af75774da4e34a0b54fc2ac49ec8bedf4887cd9b7be4fdb7f686902ddfab04627e26ea2dc3d97d62a4b1546180218ed8fa113334819b5275cc54afdee44309008596507971675e6d8b8a8edec4718f2d4bd735213cbbd18791faa8054174907a7ac17d7143a4757e493beeec4849d0b836f18bb2b3c9016f25af47fb96199251720549f15d149503d41095e25f26209daac39154485c3ded7cb1a8c3e83a52f5a06ec09cf83df00726b7968f64c0cbae299512fb438560f04b3b644346f938ac8e90486614cd844b54eae078bf678b3", "signature": "73a40d9da08fb98ea25b67e721557a1a51225294d316b53149af895fa4d63cb4a3f56f688566ef6da42fd2941dffa06d497aa902165d50213a6214116299a90c" }, { "secret_key": "59b144a708abec972729a04a6c13f0ea020b4ed4a48298023a568958c21215ec", "public_key": "c4f4720092ed6179a082ae4d6145df3771786efca9bd9bb79c9f6667d2cb56b3", "message": "3857bd260b8aad9d073f06765d37fe893a3f53e23de866ddac33495a39ad33ee9e9d5c22502bc1c4b5470d0e3f3a585223fe4cb93cc4ad2b5ba6d78826a53fc0253dc580a2018cc9ff1cfedbd3ac0b53292deefbc14e589acf496cb5f7670130fdbb6cf38d208953c015a0474675b724bd109f7cb89c33016751fe7aa785d099d09ab20dd5258cd764ac8daf343ce4790ead0863af43121aa527a37a11628f47869668f8eac00d80b6bf9906663d7a2899c1cb678cd7b3eb3bc80226b8b13b6e46877f38f07c3d9c86d3368baac4a6f6b93ccebcec9811474b6a6a4da5c3a5966571eed05edcc0e3fe7cd15915c91f44eee8c149ae451f375518a79fb600a971a39b9433dfa19f91931b1932275747c262eedcbd27f1", "signed": "1a80850fcbd6e643c6ba8eb684dbef7df015159228daedcf0604709186054db185aa7baacb09d6caad01638eff8e468735a60124de0c5376e94340e541a980073857bd260b8aad9d073f06765d37fe893a3f53e23de866ddac33495a39ad33ee9e9d5c22502bc1c4b5470d0e3f3a585223fe4cb93cc4ad2b5ba6d78826a53fc0253dc580a2018cc9ff1cfedbd3ac0b53292deefbc14e589acf496cb5f7670130fdbb6cf38d208953c015a0474675b724bd109f7cb89c33016751fe7aa785d099d09ab20dd5258cd764ac8daf343ce4790ead0863af43121aa527a37a11628f47869668f8eac00d80b6bf9906663d7a2899c1cb678cd7b3eb3bc80226b8b13b6e46877f38f07c3d9c86d3368baac4a6f6b93ccebcec9811474b6a6a4da5c3a5966571eed05edcc0e3fe7cd15915c91f44eee8c149ae451f375518a79fb600a971a39b9433dfa19f91931b1932275747c262eedcbd27f1", "signature": "1a80850fcbd6e643c6ba8eb684dbef7df015159228daedcf0604709186054db185aa7baacb09d6caad01638eff8e468735a60124de0c5376e94340e541a98007" }, { "secret_key": "8d1621eeab83270de857335c665bbf5726e3722225fd016e23bf90ab47aeec3d", "public_key": "becdbc024dae6a94ed4e29c80f2aff796aed8feb2c1b3790a8c72d7b048a2c61", "message": "97facddc82cccccf788c31b3305e93eba956f89613e6e53542b043267fee544c2b0a8ae8886a31b9d321a63c27623baefea840b2a8af5b2330193ffb5baf873c335528afeae2160163c851c5a2e58154a1b0569c2d1366c0710437623b0e08c686e54fc279ed4c45f3e856868375f78224c777b13d75de10d79173552425d15a561904155f2117b2f14713eb0b04648a3bdeb3302167d1973e788a06cb00d48ccb269fa71af8ba68eae55dbbfd9594d5c2b4dc13ae0321718561acdf67dc8cfcc25bc46bb66e096a1941d9335207d3f7d11e8904904fabe3a50a3883e7078047df252f38b67cd28a6ac45c7d7a1d2a1de8d45747cf09301e01cdafd0cd99a6e91b704d509fce692fbdef2f71a5ce0b35bc15c65f876824", "signed": "e08d6caa5f39327d6e6652ed74dd1a37844b979f5cce747a606f5679f4898bbb7643df7e931b54a2b40ebdefe83003f61ca0f11112f023c6a3e8cc18cafe5f0d97facddc82cccccf788c31b3305e93eba956f89613e6e53542b043267fee544c2b0a8ae8886a31b9d321a63c27623baefea840b2a8af5b2330193ffb5baf873c335528afeae2160163c851c5a2e58154a1b0569c2d1366c0710437623b0e08c686e54fc279ed4c45f3e856868375f78224c777b13d75de10d79173552425d15a561904155f2117b2f14713eb0b04648a3bdeb3302167d1973e788a06cb00d48ccb269fa71af8ba68eae55dbbfd9594d5c2b4dc13ae0321718561acdf67dc8cfcc25bc46bb66e096a1941d9335207d3f7d11e8904904fabe3a50a3883e7078047df252f38b67cd28a6ac45c7d7a1d2a1de8d45747cf09301e01cdafd0cd99a6e91b704d509fce692fbdef2f71a5ce0b35bc15c65f876824", "signature": "e08d6caa5f39327d6e6652ed74dd1a37844b979f5cce747a606f5679f4898bbb7643df7e931b54a2b40ebdefe83003f61ca0f11112f023c6a3e8cc18cafe5f0d" }, { "secret_key": "f2735d50ee3a9a65b58c8acf551663e98809ec406f73e3e7f4e73bc4ea923874", "public_key": "df48a5b94a07af3c2c99b8388762243233c850dc175317d602638e5b86ab49ed", "message": "ae31e94e7197e4e4d0239348025ed6681e513ce1a6e0aa0e5b979373912150ef113e50ef0569c483f7568c4bbc4703c5dacaa80a0de4e738383fa1f10d6d4071a31b99e6485143972316c86522e37c6887a1c307b29b0dd6f9f1b438310af9d8d7346fb41f9b2dd2e80b14c45eb87d4ed48e37a5260b52257b3e99787a13c55392ba930c08e0240e960def0c29b8550745cf149dee53a5d174ec065d2d6677dee1fc42057062c34e27ea5dbcdb861b9f670c6032c7846cec8e87a7c9520e27967b0186ee71b77ed6d029bbdd70949cec4a709329fa37fee002490cc1bc4c2df6f763f9858f33d750c5b505a67e237063c0486f9456d3c620d9ac7c98f1381de0effe41c18259504a150d68a6a28b0a3eea803b855315c9e0", "signed": "6942a7696417efaa591b95e11f02d763bef5279b932a8e2a7cbb9f583695c14ce5cc556bec66799b33cb592da4df2735f9eef2c3ceca4362164b6cc93da4e105ae31e94e7197e4e4d0239348025ed6681e513ce1a6e0aa0e5b979373912150ef113e50ef0569c483f7568c4bbc4703c5dacaa80a0de4e738383fa1f10d6d4071a31b99e6485143972316c86522e37c6887a1c307b29b0dd6f9f1b438310af9d8d7346fb41f9b2dd2e80b14c45eb87d4ed48e37a5260b52257b3e99787a13c55392ba930c08e0240e960def0c29b8550745cf149dee53a5d174ec065d2d6677dee1fc42057062c34e27ea5dbcdb861b9f670c6032c7846cec8e87a7c9520e27967b0186ee71b77ed6d029bbdd70949cec4a709329fa37fee002490cc1bc4c2df6f763f9858f33d750c5b505a67e237063c0486f9456d3c620d9ac7c98f1381de0effe41c18259504a150d68a6a28b0a3eea803b855315c9e0", "signature": "6942a7696417efaa591b95e11f02d763bef5279b932a8e2a7cbb9f583695c14ce5cc556bec66799b33cb592da4df2735f9eef2c3ceca4362164b6cc93da4e105" }, { "secret_key": "cad9d21a01c7e1d15df2fbd79c516eb8c3401e9fe28467cc7b21679d4e331a3d", "public_key": "a7b55c15d6790b40536fcae5ad2892cd66b18689f499c1fdeea66d4a7df39424", "message": "70702bf19c919f9836defd7b846fd9992d8b7eb2e106aeb71e60a31b4ea25a41b212dc7de7c91cbd613d58d0595db833cfe7e50584f25569602c7744fa675d156d0f63cd2b7c089c8a00686a437169826a12dc485b38c068a8007142e5163747011a07a415683622ab1e23ce577c732ba14f401fbc3043e0693a9205c19a92298a3d9b08fb7afafae0a9f016bc750ee631a5f5da5db6f9ba2692c74caaaeb4d097e90e3c02d2e3a7fb3aa000040b7c17b74564e646bea16bad611ebc0859a3828804ab4f5cfba417d254515ca3620a3ad683c46ca6267bb49539bb30e369087e67438e9489562750dccba3aa0b1b0a6c267032d20c2adb75e68df1123b5259bfe4eac6cadca6778138a37318adb30e8d669f3bc9692cc74b68", "signed": "31927d01db9f2472f4df6f63c18ebd83c2b1aaf88d580e848854df8cba6395d3da7bd6bb9edc1fce1c7d7e1360558fcddfa93915be076efb8ea2dc5ea7b20d0a70702bf19c919f9836defd7b846fd9992d8b7eb2e106aeb71e60a31b4ea25a41b212dc7de7c91cbd613d58d0595db833cfe7e50584f25569602c7744fa675d156d0f63cd2b7c089c8a00686a437169826a12dc485b38c068a8007142e5163747011a07a415683622ab1e23ce577c732ba14f401fbc3043e0693a9205c19a92298a3d9b08fb7afafae0a9f016bc750ee631a5f5da5db6f9ba2692c74caaaeb4d097e90e3c02d2e3a7fb3aa000040b7c17b74564e646bea16bad611ebc0859a3828804ab4f5cfba417d254515ca3620a3ad683c46ca6267bb49539bb30e369087e67438e9489562750dccba3aa0b1b0a6c267032d20c2adb75e68df1123b5259bfe4eac6cadca6778138a37318adb30e8d669f3bc9692cc74b68", "signature": "31927d01db9f2472f4df6f63c18ebd83c2b1aaf88d580e848854df8cba6395d3da7bd6bb9edc1fce1c7d7e1360558fcddfa93915be076efb8ea2dc5ea7b20d0a" }, { "secret_key": "d9be842255e9a16b0a51a8674218cee7cd9a8bdf343508397f4ddb05f3fa0082", "public_key": "7931bc6dfa3324943aab183d1285515919399ffe0b710677f0915d3a5be51e92", "message": "ac6c55b134663e41f02a6dcb8549eaa1c013f59658d81d812f95b74009513723671945e1324f90f8a3f971369181b587bab45665f788d663ab78140c5a22c1c18d4afedc7448a748afe5bf2387003c1d65ab18482ef98922b470da80ad14c944951ce4aed37390cce79a8e01b24c7dfc1141c0eca2c7f773ed4b11806a34615513486e4ee11af08078a1b4054cf9880298608dd9b3faa1a242a452fe511604b3102c313d14cc27c6f0f8471d94555317eaa264cdf52c69e18f461e47903d21298716b172ee9cb178f08ff2d3c9c162121c2ed21d8734b2f0630d399146cbf76e028a143f2bf7bb50af0f57b9ba8021d264b00c6662f84c86cb6d5952b3d241f7dc3e700c96616cbcfb0d0e753ffd5d21ee320e65e97e25cb8609", "signed": "c93845658c9560d2c0e28f282adbd4652bafd3bb2edec17c94878f7b94d3c77afec906ed292a8dfbf5f8e7c118e8f2ca33dda7909d9b695b8ff5a1c0e97ac807ac6c55b134663e41f02a6dcb8549eaa1c013f59658d81d812f95b74009513723671945e1324f90f8a3f971369181b587bab45665f788d663ab78140c5a22c1c18d4afedc7448a748afe5bf2387003c1d65ab18482ef98922b470da80ad14c944951ce4aed37390cce79a8e01b24c7dfc1141c0eca2c7f773ed4b11806a34615513486e4ee11af08078a1b4054cf9880298608dd9b3faa1a242a452fe511604b3102c313d14cc27c6f0f8471d94555317eaa264cdf52c69e18f461e47903d21298716b172ee9cb178f08ff2d3c9c162121c2ed21d8734b2f0630d399146cbf76e028a143f2bf7bb50af0f57b9ba8021d264b00c6662f84c86cb6d5952b3d241f7dc3e700c96616cbcfb0d0e753ffd5d21ee320e65e97e25cb8609", "signature": "c93845658c9560d2c0e28f282adbd4652bafd3bb2edec17c94878f7b94d3c77afec906ed292a8dfbf5f8e7c118e8f2ca33dda7909d9b695b8ff5a1c0e97ac807" }, { "secret_key": "cfc48cc6f65811fe7d7bba85d1cd84858fd6f7edd638f4f552363ee7685f69ca", "public_key": "d29c10694c5e8e3f3447ed78d34dbd74a2b301373ba871b5850c333dff7bf8d0", "message": "8e7defb9d16d036bd642cf226e32773e605361c5ec4b951255788db0a042c63e5a4367d61524f10e6258991325a39ab6b03612260c3fe3df20b34202d34395bd4ed40bd61373df781a4c8bcfbd15301060f07437732333d8e49736322dee6b22438e787d8856b70c26ec57d6dade9c3c28e27220c5670e393544ed095937298dc3adc73865f777e90037bdef834716476d78f4e6cb4961a4c68a8a836338a9f5da179c4d5e93c3f70dd35eec709653dd8de37996b12056d4eefcb4b6b3c13ba984d832275c4386ebf4a8ff7f078be3d428c1e0d9b162381f06a5b7bb12704003d91f25d1d8fd43626ce70fff59d2927768a76bf7f9ef76ff95489f38edcd1c9e9b8a8b0ef66c32805776d5ae9fbd84a7af4fa6563ec70ac5733a44", "signed": "80c5d51e96d1cac8efd3459825e79c1e9f65af701d1d29e1f95b036707113b77984b7b3350f04077333c957f8fbc7d9b040c362651417b9899027cd33edb11038e7defb9d16d036bd642cf226e32773e605361c5ec4b951255788db0a042c63e5a4367d61524f10e6258991325a39ab6b03612260c3fe3df20b34202d34395bd4ed40bd61373df781a4c8bcfbd15301060f07437732333d8e49736322dee6b22438e787d8856b70c26ec57d6dade9c3c28e27220c5670e393544ed095937298dc3adc73865f777e90037bdef834716476d78f4e6cb4961a4c68a8a836338a9f5da179c4d5e93c3f70dd35eec709653dd8de37996b12056d4eefcb4b6b3c13ba984d832275c4386ebf4a8ff7f078be3d428c1e0d9b162381f06a5b7bb12704003d91f25d1d8fd43626ce70fff59d2927768a76bf7f9ef76ff95489f38edcd1c9e9b8a8b0ef66c32805776d5ae9fbd84a7af4fa6563ec70ac5733a44", "signature": "80c5d51e96d1cac8efd3459825e79c1e9f65af701d1d29e1f95b036707113b77984b7b3350f04077333c957f8fbc7d9b040c362651417b9899027cd33edb1103" }, { "secret_key": "15c9f7c4d84a5a479041952e6a8cac24e76fd2d275c197e6b521929b43ba6c5d", "public_key": "8633c1829d29091df71fd5c0ef640572e4b64974cd097dbebbcddeba041647c0", "message": "11730dd45dda80d84d080d92e9bddaeea6878e4a0b3b512d9ea733808e1cef51d49048d6c78116a4bde3c64aceaa52beca86b331ab59e9185c70286a02bb5dd04f5c7f4e9c7e445e77458565f159c783dfd4d976a910e937789d2141d416ed3a7f608d26737a86b20b624e3c36af18d25c7d59b8d7427ec6c4d3d438d7ae0949dd7d748c1ffd6f28e8285d440422d22a3761202e9584f5cdb3504547aa4b685730c982cba213de08020a5e4e46a95fac4b481bea0b630abd030ddd335a20fe2cf7094aef4813956991913c6821f4b5410df4f133fe63e22c08092a0a65972722a27ae42011a807c327b417237c540114eecb9f0e96cda5dcf0246f1d2717f49b9cea9dc6a3da9b396f0270529226f5dcba6499918a6c289fe055fec8", "signed": "1e36bea5a583767ebd80306cab233155b7b42814b43473cf45cdc5039c939744a9694b87220daf4ccd29f25cea405e7c08db2ef17f3f034dbb49cff60283e30611730dd45dda80d84d080d92e9bddaeea6878e4a0b3b512d9ea733808e1cef51d49048d6c78116a4bde3c64aceaa52beca86b331ab59e9185c70286a02bb5dd04f5c7f4e9c7e445e77458565f159c783dfd4d976a910e937789d2141d416ed3a7f608d26737a86b20b624e3c36af18d25c7d59b8d7427ec6c4d3d438d7ae0949dd7d748c1ffd6f28e8285d440422d22a3761202e9584f5cdb3504547aa4b685730c982cba213de08020a5e4e46a95fac4b481bea0b630abd030ddd335a20fe2cf7094aef4813956991913c6821f4b5410df4f133fe63e22c08092a0a65972722a27ae42011a807c327b417237c540114eecb9f0e96cda5dcf0246f1d2717f49b9cea9dc6a3da9b396f0270529226f5dcba6499918a6c289fe055fec8", "signature": "1e36bea5a583767ebd80306cab233155b7b42814b43473cf45cdc5039c939744a9694b87220daf4ccd29f25cea405e7c08db2ef17f3f034dbb49cff60283e306" }, { "secret_key": "6d2d0d823f294746b9a5512e14e73c1d855b5e4bca65fe817729810cc5ef840d", "public_key": "1b6480a6a90dfb472984855cef6f1ab31eb7b3f13c8ac00fa556d20b53e5ae17", "message": "8772721f72eaf7f73040c068a7c3753bffca7dc2d0930c6525f425e6005c25cd4c0ff5095c9c61a5d8a1967b8c86010c884e509e6b1670f79046e22979ebd354734090d3ada21435c1f8254f7b5222cd5564f064e977640366449f4e5008f870f9c4840565bf4fb5f574c9774ba2568e71a9ccd82ffc59b694f26e7de4ce2e3fd880a0eef387931333ede00dcb065e6d0f79591a2aa956df1948a265cb95750d8a233b15c288a05487c515663f93e740fb1570fbe4bd80c68e8d9297345a8a01cdbd88f4a39bed9c5ef09f144bce5de568bf3733bc53b2039a29cb3e194501adc1c10e86383aac8b0f85c67a6689bbe1470a392476313439ca88d98c021c0eaec25fb2f9a160ce5c786170be0238fb8785dd33bfa9059a6c3702d0de05", "signed": "b515f49eb32ad478692df88f07b7802c6e0e5327aa08a6366e4cb1d1e26f9e65fc81abebe2215d649100f27598273a412b624e842d8130403797e57dec975a0a8772721f72eaf7f73040c068a7c3753bffca7dc2d0930c6525f425e6005c25cd4c0ff5095c9c61a5d8a1967b8c86010c884e509e6b1670f79046e22979ebd354734090d3ada21435c1f8254f7b5222cd5564f064e977640366449f4e5008f870f9c4840565bf4fb5f574c9774ba2568e71a9ccd82ffc59b694f26e7de4ce2e3fd880a0eef387931333ede00dcb065e6d0f79591a2aa956df1948a265cb95750d8a233b15c288a05487c515663f93e740fb1570fbe4bd80c68e8d9297345a8a01cdbd88f4a39bed9c5ef09f144bce5de568bf3733bc53b2039a29cb3e194501adc1c10e86383aac8b0f85c67a6689bbe1470a392476313439ca88d98c021c0eaec25fb2f9a160ce5c786170be0238fb8785dd33bfa9059a6c3702d0de05", "signature": "b515f49eb32ad478692df88f07b7802c6e0e5327aa08a6366e4cb1d1e26f9e65fc81abebe2215d649100f27598273a412b624e842d8130403797e57dec975a0a" }, { "secret_key": "c0cf799af7395bf27bafa36cab437045e39c903bf807548319ce44f287494fbb", "public_key": "afbf550ca290c905bdd92fc8831ebe3dfeb6daae4f56005253cc50951e50edc2", "message": "dbe65780e968de9e40ffb57cf59a60fd93b3f9a5e7d8ed5180adbc578ca1bc48bd9fb60a1324c9c2c1141479a0dcf0f1d07e84936526df42333c0d773e3fed9e4038de5b95ad905c92cbe040487bf55e10e1edb429a0ecc4e0e8d00a988a9cd53e2eb372f4fc4cd9537b269ba3a23cefbc8df6476e75434b81d93e8891bf417c82e363f3e4abf80a4f73aca84ac7df6337f536d63d939d92cba64be742221116069ef251abba0b00af01718bb580ddbeb79973ef10a68b4d0fa023d6ebd3079d6b32a1aa20a21e9202f27590c3f0c0cc253073c3f822aac459d39f50758b70c00710a3c98438416508522e512adaa0afd503a7ceb04fb94a4a932ce80cd5a7f11bb861263f58e5749d542a110de7c7689dfcb0c51afa9d54a58ff89f3f67", "signed": "5bba01a4c7b25542d06912de70aa1e220423fdf8338a9e693395cb6f0dc1fbfd018e3c77e50aef90a9080f30f1f5792b2431078fe6e3e00464245e17cd8dc107dbe65780e968de9e40ffb57cf59a60fd93b3f9a5e7d8ed5180adbc578ca1bc48bd9fb60a1324c9c2c1141479a0dcf0f1d07e84936526df42333c0d773e3fed9e4038de5b95ad905c92cbe040487bf55e10e1edb429a0ecc4e0e8d00a988a9cd53e2eb372f4fc4cd9537b269ba3a23cefbc8df6476e75434b81d93e8891bf417c82e363f3e4abf80a4f73aca84ac7df6337f536d63d939d92cba64be742221116069ef251abba0b00af01718bb580ddbeb79973ef10a68b4d0fa023d6ebd3079d6b32a1aa20a21e9202f27590c3f0c0cc253073c3f822aac459d39f50758b70c00710a3c98438416508522e512adaa0afd503a7ceb04fb94a4a932ce80cd5a7f11bb861263f58e5749d542a110de7c7689dfcb0c51afa9d54a58ff89f3f67", "signature": "5bba01a4c7b25542d06912de70aa1e220423fdf8338a9e693395cb6f0dc1fbfd018e3c77e50aef90a9080f30f1f5792b2431078fe6e3e00464245e17cd8dc107" }, { "secret_key": "cdaa50e8527dc7a50fb37e28fa8b9568c37e8567e0b499997b9aed676180c3b0", "public_key": "7c56e164510268c182b423747904f1d3a5809330f6e1b29266ec46e73be1550f", "message": "94fcfbaaa303dece7b908f874cc5f095061f1754bb35780db666b63ab8290811bf1c521a7f8f785ea270dfb39d0d6ed95ab71955a11ffaeaa268e081ff3e4f2425b41880a987151e678e89111350942d820c3eec36212426663be175e5286b4ad1cc804e3e3a03b9fa3e82838ebbc2615a645f2ca1468ac4a1cdbe523761e83f4381b0c8550ae5e8c8cd1fda57191436e27cb883bc64be86a9dc6110ef3401d88a7debd1b701d9c257a6826cf01e9e2922e3ae577f2834275fb0ecda80ed8cf1801e0bc5e01e26a77c48bdf46a5c4894d22ab53e741827e24bed5f0750ffad05e53f1d5e61dfd316b191d9797ef713131a8b430abe3fac5f3c4a2ca021878b15adc8c5f542114260e687a9d199d230c4e0d3fc696993b59ccfa3ffa9d8d2fb", "signed": "137bd10a50ef609384fe668768fb871de741ca0f53ff8477d7ebfa90aafd5e2681fdf1b89250463c15db8e17a58825fe9427de089c34de13cd07bba18d4aa40d94fcfbaaa303dece7b908f874cc5f095061f1754bb35780db666b63ab8290811bf1c521a7f8f785ea270dfb39d0d6ed95ab71955a11ffaeaa268e081ff3e4f2425b41880a987151e678e89111350942d820c3eec36212426663be175e5286b4ad1cc804e3e3a03b9fa3e82838ebbc2615a645f2ca1468ac4a1cdbe523761e83f4381b0c8550ae5e8c8cd1fda57191436e27cb883bc64be86a9dc6110ef3401d88a7debd1b701d9c257a6826cf01e9e2922e3ae577f2834275fb0ecda80ed8cf1801e0bc5e01e26a77c48bdf46a5c4894d22ab53e741827e24bed5f0750ffad05e53f1d5e61dfd316b191d9797ef713131a8b430abe3fac5f3c4a2ca021878b15adc8c5f542114260e687a9d199d230c4e0d3fc696993b59ccfa3ffa9d8d2fb", "signature": "137bd10a50ef609384fe668768fb871de741ca0f53ff8477d7ebfa90aafd5e2681fdf1b89250463c15db8e17a58825fe9427de089c34de13cd07bba18d4aa40d" }, { "secret_key": "0fdea9bee6288f947e0adbdda4dfb2baa03891af25024a5e138ac77984d00507", "public_key": "70abd86430d7e8d63209c8b373ec4e4b79e989e6725facefbade3c7574d23cd0", "message": "cf72c1a180a2bc37d8478d9a7a39acf03bf2a50790f7902f81121222d31d3ec916f4f24cef9d7c41dc021b0e8487bb892e47305e54520303e89b30b263dac4a9ba375d46c40fcf400535c959d2b746a7fc970cf65b472e84b5f1d0ebadcfa1aed6fc47facce16a366a3b1d6e516813c1960975f8f2b43042fb4eeaabe63c6f65db45ddb7db888a19a9d7ba6ca479fcd70c5d1e970f12c14f4d24fb7e2f357bd3a94aa1b868ccc0847f2eef21853e253bafbf07c4e6176a1ef077167841ebbe5629337157f39f75c71d21e7e96c51a1b16fa8dc60f0b1279fcda2641fc8591e3c492f15bf83caf1d95b2cd91332f1b4202fe72862ca2ea2ef92c11db831d82f8fc3d41fe29a76c211a758e2f71bd89d2c6610f201429f348d56e10e3b7af53e27", "signed": "80c42dd5df03b285a86ac95ce6669f786a978a813a9d7b8c6a23de76fbd09bdb66c5dd1cc9f1a176cba388d5051764a32fa27f0028ba4898068bd01a3ee17208cf72c1a180a2bc37d8478d9a7a39acf03bf2a50790f7902f81121222d31d3ec916f4f24cef9d7c41dc021b0e8487bb892e47305e54520303e89b30b263dac4a9ba375d46c40fcf400535c959d2b746a7fc970cf65b472e84b5f1d0ebadcfa1aed6fc47facce16a366a3b1d6e516813c1960975f8f2b43042fb4eeaabe63c6f65db45ddb7db888a19a9d7ba6ca479fcd70c5d1e970f12c14f4d24fb7e2f357bd3a94aa1b868ccc0847f2eef21853e253bafbf07c4e6176a1ef077167841ebbe5629337157f39f75c71d21e7e96c51a1b16fa8dc60f0b1279fcda2641fc8591e3c492f15bf83caf1d95b2cd91332f1b4202fe72862ca2ea2ef92c11db831d82f8fc3d41fe29a76c211a758e2f71bd89d2c6610f201429f348d56e10e3b7af53e27", "signature": "80c42dd5df03b285a86ac95ce6669f786a978a813a9d7b8c6a23de76fbd09bdb66c5dd1cc9f1a176cba388d5051764a32fa27f0028ba4898068bd01a3ee17208" }, { "secret_key": "03d5e466f8298ab5438a30976d1322a7215a642dd5fb4c3f8519409a7522f092", "public_key": "4b3ed4db080e2a452e16912c14504424920a60975604e4f379258d1c8b193d6f", "message": "1b47b70013cb53e1f8f4971e0f39563ce87edbc2cedd99e5a35585df8b00a852f7b9c97c7e4a5465fc5605ae8c5c36570a99201a7ad6031287ef0c7b2ba6e57b056d0fc8d6ca43bf6cbdab098934b403197b525d22d45e6b29c78f8d6183e41ffe197dae25ba22b06669ae05badd7e1da6932a7d054cbab3f54e5146223ad8671231bc16fe62679bd2817a6b80e653998c4949f81ff53b6173163e11da3e6d3c76d84c713225b4173d6bf06a85b6988a48be4359cb515503ca563f4353f8e7d45e4d94462c89a04a00f1b3b0ca6422d5db029c507d464834a20c78a713661d84edffc496d69282619894437b4487954cbea2aa7261e6a62b6851154a5d25fb6b4f09c59473d385ce03e91ba865eab66c58c0abb0b7a78e4be927e55460ccd70d82", "signed": "6d7e4658f26f337c98e03f13542e2f39440ff7bf8d88f3f6dfa4d64948cd96b79051492fc28f65f2cc0d23a0c4d5e2307bb1c47e11e53b371f091b69f80dbd051b47b70013cb53e1f8f4971e0f39563ce87edbc2cedd99e5a35585df8b00a852f7b9c97c7e4a5465fc5605ae8c5c36570a99201a7ad6031287ef0c7b2ba6e57b056d0fc8d6ca43bf6cbdab098934b403197b525d22d45e6b29c78f8d6183e41ffe197dae25ba22b06669ae05badd7e1da6932a7d054cbab3f54e5146223ad8671231bc16fe62679bd2817a6b80e653998c4949f81ff53b6173163e11da3e6d3c76d84c713225b4173d6bf06a85b6988a48be4359cb515503ca563f4353f8e7d45e4d94462c89a04a00f1b3b0ca6422d5db029c507d464834a20c78a713661d84edffc496d69282619894437b4487954cbea2aa7261e6a62b6851154a5d25fb6b4f09c59473d385ce03e91ba865eab66c58c0abb0b7a78e4be927e55460ccd70d82", "signature": "6d7e4658f26f337c98e03f13542e2f39440ff7bf8d88f3f6dfa4d64948cd96b79051492fc28f65f2cc0d23a0c4d5e2307bb1c47e11e53b371f091b69f80dbd05" }, { "secret_key": "76cc18a1dafffa100586c06a7b40f79c35fe558c339c2999a5f43875cfade03e", "public_key": "4b9da8d2f137dc6c857a99a5998dd89dd5f05971a21e8c776670eb47bc1270a5", "message": "4522b1d82373f7a318221e7e57617503ddf44fd53997522a1d963c85b708d0b245de372ad52ec7f54f6213d271f7c91d5a1d36d134db389df0b081a06bc0c7a4875f724092793172c9115641c6d054f1d992e0fae4df58695f0ea3449d7a4b3a8857e19803fe49b6d52c9ff3746a574a2756956579f9fb809a0edec92c55e95ffefa3d05f165822f464a21999f29691f6744ac5a3ee49017880645e837edebfd2e0f24997f041145a72e2376ada283186ca2b836362977195baee30a3acc81b243f3ee376a2c4764c783667a4b1177e7951d3e3c7be4f1bd7ae8c60fd5fb0fd91f0c1c14d0d2327e8f20d92c0dfcc53870e9d99fdbf9dd9a17e882509ae7baa8653e39edc8ee569000d624cb93a0754a798d1f811f6a0ef5501a17bcf25fd0f91626", "signed": "db74751c66e6b1866044dd9ae99f19e6334f179e79d8b8e0c8cd71d22cefb9eab7e3e7a9c2da225f2a9d93a313d1cbf1b7fe2597b8d702bf3017a6a6bc7b7b064522b1d82373f7a318221e7e57617503ddf44fd53997522a1d963c85b708d0b245de372ad52ec7f54f6213d271f7c91d5a1d36d134db389df0b081a06bc0c7a4875f724092793172c9115641c6d054f1d992e0fae4df58695f0ea3449d7a4b3a8857e19803fe49b6d52c9ff3746a574a2756956579f9fb809a0edec92c55e95ffefa3d05f165822f464a21999f29691f6744ac5a3ee49017880645e837edebfd2e0f24997f041145a72e2376ada283186ca2b836362977195baee30a3acc81b243f3ee376a2c4764c783667a4b1177e7951d3e3c7be4f1bd7ae8c60fd5fb0fd91f0c1c14d0d2327e8f20d92c0dfcc53870e9d99fdbf9dd9a17e882509ae7baa8653e39edc8ee569000d624cb93a0754a798d1f811f6a0ef5501a17bcf25fd0f91626", "signature": "db74751c66e6b1866044dd9ae99f19e6334f179e79d8b8e0c8cd71d22cefb9eab7e3e7a9c2da225f2a9d93a313d1cbf1b7fe2597b8d702bf3017a6a6bc7b7b06" }, { "secret_key": "71ad980d58ad8e7d33306689358936a372d5190b24ec7f9bde749cb81150efda", "public_key": "fd35a75fe5abc20104691a24a4659440b55aeaea902ac3be274af27aa8312869", "message": "e87ae073ff5dcc5485a19940e4e3ff263a0618a9025ad4032dfb36d171ce881f71c18a49210eb45819806142e2f00db3041835bf2c3bccf1dba02b8b5a5bdaf8fea316c0623dd48a564ec166f037d587c8c01684e5e5c0ba9dba4d23b49a0309244e282a51408622edb05704747e0cdeec976893777071098972c113a8ab639c31f1613233ee460eea8a8c10e1e6e152214529878cf1adaeaf78cf19bac71361815bf57955498fab4f0f2b7586c86f9f4c2ddf8972f9b9e0eb636d84bcc14385b2d038be55a963702efe225a50bdd0c4da92a2a6a09100ea04a211d396458dceb4487116837d139eb0f122538ed3986ad0af4da2dffc89f3269ca88538086e691e5beae9581e7c63d8e612da2c47f74dde1d94951eadb0df60c3897d2a3095c506093b", "signed": "81670b1029e481e9ff3c171f05c16861c846ee79cdf2e21e3bf952bcfac97565f2b1dcedf69d2e7eb35caf5662e8bc671fbb96756a63a596264d1b7f4af97e06e87ae073ff5dcc5485a19940e4e3ff263a0618a9025ad4032dfb36d171ce881f71c18a49210eb45819806142e2f00db3041835bf2c3bccf1dba02b8b5a5bdaf8fea316c0623dd48a564ec166f037d587c8c01684e5e5c0ba9dba4d23b49a0309244e282a51408622edb05704747e0cdeec976893777071098972c113a8ab639c31f1613233ee460eea8a8c10e1e6e152214529878cf1adaeaf78cf19bac71361815bf57955498fab4f0f2b7586c86f9f4c2ddf8972f9b9e0eb636d84bcc14385b2d038be55a963702efe225a50bdd0c4da92a2a6a09100ea04a211d396458dceb4487116837d139eb0f122538ed3986ad0af4da2dffc89f3269ca88538086e691e5beae9581e7c63d8e612da2c47f74dde1d94951eadb0df60c3897d2a3095c506093b", "signature": "81670b1029e481e9ff3c171f05c16861c846ee79cdf2e21e3bf952bcfac97565f2b1dcedf69d2e7eb35caf5662e8bc671fbb96756a63a596264d1b7f4af97e06" }, { "secret_key": "61594e24e75f996b4fb6b3e563f6a4f9915cfa65ddb199b01fed7f8ed7824ecb", "public_key": "8627d2141579cd2521aa076800ac354b9e3a47d71cedc8547434268225e33005", "message": "bc01b08c7caa236100a012a726477d0ec389dbfadac73d5106424c5d1f3d1cef1695cfd93a7062ec8bf1067047854920162f651357bedf1cd5a92ec29bdb5dff716e8f6025515a9549ba36cdc35ced7c5c0c368e6cd92f2f10ae146a20728c374bba509641ce88cb42fff0cedfd9fd67f310f9d01a3f3690eb21db17bce67ae35c4cd24c209f09f044759d8d5a7d248e2bd966524ba8c0c28974726b43bd05de843433cc400598922974623d9acbfdc761c4c04375a952ce54caffaa96acff6d9dc278742af476e1865cb8c20d13d1c1900863bca231e44c6b0d47cb41d510f7958f48f304d03da033484a3e1f273faf6983375b7d3be03d8a0a002def6365beb2fa8ccf1a94987adcd33d0da1177fc5159b6e56d004301e921dbc12ec0a73f413cf2c48", "signed": "6302b3ff2710be306c92b9aae30d23c3d4beff394e63201e6ad11713345c4fcb5cc8d3dd10adfb82bb11a189ce7ec3e4222727624fc17881c14788d2710e1608bc01b08c7caa236100a012a726477d0ec389dbfadac73d5106424c5d1f3d1cef1695cfd93a7062ec8bf1067047854920162f651357bedf1cd5a92ec29bdb5dff716e8f6025515a9549ba36cdc35ced7c5c0c368e6cd92f2f10ae146a20728c374bba509641ce88cb42fff0cedfd9fd67f310f9d01a3f3690eb21db17bce67ae35c4cd24c209f09f044759d8d5a7d248e2bd966524ba8c0c28974726b43bd05de843433cc400598922974623d9acbfdc761c4c04375a952ce54caffaa96acff6d9dc278742af476e1865cb8c20d13d1c1900863bca231e44c6b0d47cb41d510f7958f48f304d03da033484a3e1f273faf6983375b7d3be03d8a0a002def6365beb2fa8ccf1a94987adcd33d0da1177fc5159b6e56d004301e921dbc12ec0a73f413cf2c48", "signature": "6302b3ff2710be306c92b9aae30d23c3d4beff394e63201e6ad11713345c4fcb5cc8d3dd10adfb82bb11a189ce7ec3e4222727624fc17881c14788d2710e1608" }, { "secret_key": "54e6bbfbf8c06ff2c066318c2ebf03d506547bf43c2d7a5d4df305a3032b7138", "public_key": "3b71aa1def666d9188f403f82ed30454aba5bc9f470f6eb988da187c92523284", "message": "0318d7cb4805af9821dd3f914b0e076fea04a7d2db3a59a00affead3325a2be40c1f87f53276a8552604f228b976e288b9be906a7bd25b2ffab8a8af5d0f6e08786fd034e2fe1eb7ee033979860dd1e5327287e9e615f5dc5a960f17026b56842fc8d44cad002edc8501cfb956001502e4ddc81a7700d9c0be88eb4aaa64a6cbc39de82f13c11086de1a4270d3af97284bac1caef1d3edaa1071666bd83b2ede3962d98b9d93497ddfd8e97dab3089950cf30ed11db77ad1437a0af5889d8efc44e612420e3907267df3acff4bd3fb6e8ca5badf8e72f9de39528653058524456a81da5f84982afac34bef5f71e91f8f90938a6f5f1f287716de56a0946d261e87bc775ce189e41a77baede7320a3c608fc971e55d0a773c4d848d428637f11b4e4460390c", "signed": "3df4d09079f830e3f982283681ba37b50f3c73de2c5d22a291358ebb1fb854e510f63f9a48e9fff7fd8311302ea3e969394e6d49c9e3182054942f6a744cee030318d7cb4805af9821dd3f914b0e076fea04a7d2db3a59a00affead3325a2be40c1f87f53276a8552604f228b976e288b9be906a7bd25b2ffab8a8af5d0f6e08786fd034e2fe1eb7ee033979860dd1e5327287e9e615f5dc5a960f17026b56842fc8d44cad002edc8501cfb956001502e4ddc81a7700d9c0be88eb4aaa64a6cbc39de82f13c11086de1a4270d3af97284bac1caef1d3edaa1071666bd83b2ede3962d98b9d93497ddfd8e97dab3089950cf30ed11db77ad1437a0af5889d8efc44e612420e3907267df3acff4bd3fb6e8ca5badf8e72f9de39528653058524456a81da5f84982afac34bef5f71e91f8f90938a6f5f1f287716de56a0946d261e87bc775ce189e41a77baede7320a3c608fc971e55d0a773c4d848d428637f11b4e4460390c", "signature": "3df4d09079f830e3f982283681ba37b50f3c73de2c5d22a291358ebb1fb854e510f63f9a48e9fff7fd8311302ea3e969394e6d49c9e3182054942f6a744cee03" }, { "secret_key": "6862061be0de9dfd998118204b2b98db3ce7d7e819dbc10794af0ab2b06e8434", "public_key": "9c5f7c2265dde1b25e4f27ec71580d52dc89f2c3a712bc1ad5d6d69e711e08d4", "message": "1740dde8434a0d689925679b0c180300cdbd0cf6a89ad8fde34653316cee4c571a4105c9e9e0284238fef2c38a09157c5db94340571b390adfb69ff4c0dc5053253a679d42cc1f1bf1ff429229ea0a5044c6f79564e0dd287f53f015b83187d9ad27d91039af062c437b1575a0eab6aeb8aa0d27b27665d6dea9041ff9963a3118b3298a8544e3fd69ac6877e3e4052fe4422bf03560b2c57ec531ee8b5ff53c28dbde35bb45c35077636e6f841b59d7eb77bc7791b6093858a3a80a3aa6d778dbf53db9d06119c50b71c791c0495c576d1b59d396873ed871485352c8299a359da5ee9d7f36ed1455f89851a30851bea719685aecd08f25562609dd106630735277e1d6519bb1687de8b8c68b9671452edbb3491da264cdfa0017c512d2769759cb925fb664", "signed": "965edb34e8ab8bc3204a3201d22186372de4242600297cfdb57aa1df074ec50ddf10105e9d4c89a266c34db7772aa94cba946429e68ba62bf9a0ac90f5f05b021740dde8434a0d689925679b0c180300cdbd0cf6a89ad8fde34653316cee4c571a4105c9e9e0284238fef2c38a09157c5db94340571b390adfb69ff4c0dc5053253a679d42cc1f1bf1ff429229ea0a5044c6f79564e0dd287f53f015b83187d9ad27d91039af062c437b1575a0eab6aeb8aa0d27b27665d6dea9041ff9963a3118b3298a8544e3fd69ac6877e3e4052fe4422bf03560b2c57ec531ee8b5ff53c28dbde35bb45c35077636e6f841b59d7eb77bc7791b6093858a3a80a3aa6d778dbf53db9d06119c50b71c791c0495c576d1b59d396873ed871485352c8299a359da5ee9d7f36ed1455f89851a30851bea719685aecd08f25562609dd106630735277e1d6519bb1687de8b8c68b9671452edbb3491da264cdfa0017c512d2769759cb925fb664", "signature": "965edb34e8ab8bc3204a3201d22186372de4242600297cfdb57aa1df074ec50ddf10105e9d4c89a266c34db7772aa94cba946429e68ba62bf9a0ac90f5f05b02" }, { "secret_key": "b2250bbcb268d2477c8312b1900fd99982baa29a68974fbf8778a1228dc97550", "public_key": "44aa8df1181674b05ade980f7eddbaf3bd7422a920287cb2d2db59a063eebf74", "message": "7ef0ae1336a6fab37f99da5fa7d0dec7409c072623ead84f241d53d0596b461705fb1b3c537d36b89e8960febb4cdc0d427ce2fc1be58dbbce151e35acd8b6ace40a19822914a4bd8c4af632f136418ac49b184d55193ebcc32d0d798709b1a8fe294fba8a1fe72d976b4400d4a393242311b0f8cc994e89475b0038ae5d8914938e8f6e87c6f50b9d656c45d7b14231efed97f3c90668913670bf5be2efd5c270c7cbaf01e8572e9800978dfe2e10a2fc0440b855629bf9cd409ea941cb69226cac771b15ea77c0326848806ff8d2e201e6e26cd5f45430dadcff8f59c321c1c9c6a29b94882935447d3e6c2e8804b1161576bdf0320fe53c307d9cde426077a7677cde3c1bc83e18e60a0c4ee6dccd877c213a8e4cca640ee04929804570ae1f96157c04357a", "signed": "f2b8d92ed51ebd1000bf9dd3411a9fa9e7aee54c4c86e24ad0f9ad5c55643a12d680019ca03f216bd4bd32c9ce1cd8a528c3ffaa5d5b1dc91a4be56f0e2c5e067ef0ae1336a6fab37f99da5fa7d0dec7409c072623ead84f241d53d0596b461705fb1b3c537d36b89e8960febb4cdc0d427ce2fc1be58dbbce151e35acd8b6ace40a19822914a4bd8c4af632f136418ac49b184d55193ebcc32d0d798709b1a8fe294fba8a1fe72d976b4400d4a393242311b0f8cc994e89475b0038ae5d8914938e8f6e87c6f50b9d656c45d7b14231efed97f3c90668913670bf5be2efd5c270c7cbaf01e8572e9800978dfe2e10a2fc0440b855629bf9cd409ea941cb69226cac771b15ea77c0326848806ff8d2e201e6e26cd5f45430dadcff8f59c321c1c9c6a29b94882935447d3e6c2e8804b1161576bdf0320fe53c307d9cde426077a7677cde3c1bc83e18e60a0c4ee6dccd877c213a8e4cca640ee04929804570ae1f96157c04357a", "signature": "f2b8d92ed51ebd1000bf9dd3411a9fa9e7aee54c4c86e24ad0f9ad5c55643a12d680019ca03f216bd4bd32c9ce1cd8a528c3ffaa5d5b1dc91a4be56f0e2c5e06" }, { "secret_key": "b809361f55cfe8137fbda880fc62cbe44c216e141893346302b336045de21878", "public_key": "fd23e42ff06644ead347abcc1b3e03b0e88593b61254981dd8ae59454e61b3e0", "message": "17ace197d083aaf1726f53e5ef81b5a8c09222f260ee5f1f5404ab78d900d489688449b843bad3c498aac6d80b4639b76e6e81c55276a6f9c7cecd70b71aaaf2018ef76c0e30154aae86a5c86d4e8d0e4ec68cc427060bd56514f7238086bbef5bfca1f5671b18041838fd013572443dba48fbdd95ca740b0daa4327164a1e34677249708f77bd793e7caa6638b5dc9fbe6f0dfd4120209097209c93cedfaf21b6bf59ca6e99e6209639444f0e827bbcc0a61c3a237ca22a283213223ab658e712c7556238d3a5fe31722d65f5706ef6d64d73232d3043220f14e5cfd3c2c83a83d68e20274b6f96b29de040cec8475030b6a8a87d29808dd381795c3d22acf5dc193b720d95a752d9f123c209ffba004e48dd06dd8c9e172bc9e087d80bc5216c0b0b6e77031241", "signed": "b5b5950d3772d2eef88e1b0f5df5ffae2f2103885e71446d346fbb5daef94967a6b7b6e4be885110065876c665b7812de46ad31ec3bfcbeaee13ed0c1e0b300e17ace197d083aaf1726f53e5ef81b5a8c09222f260ee5f1f5404ab78d900d489688449b843bad3c498aac6d80b4639b76e6e81c55276a6f9c7cecd70b71aaaf2018ef76c0e30154aae86a5c86d4e8d0e4ec68cc427060bd56514f7238086bbef5bfca1f5671b18041838fd013572443dba48fbdd95ca740b0daa4327164a1e34677249708f77bd793e7caa6638b5dc9fbe6f0dfd4120209097209c93cedfaf21b6bf59ca6e99e6209639444f0e827bbcc0a61c3a237ca22a283213223ab658e712c7556238d3a5fe31722d65f5706ef6d64d73232d3043220f14e5cfd3c2c83a83d68e20274b6f96b29de040cec8475030b6a8a87d29808dd381795c3d22acf5dc193b720d95a752d9f123c209ffba004e48dd06dd8c9e172bc9e087d80bc5216c0b0b6e77031241", "signature": "b5b5950d3772d2eef88e1b0f5df5ffae2f2103885e71446d346fbb5daef94967a6b7b6e4be885110065876c665b7812de46ad31ec3bfcbeaee13ed0c1e0b300e" }, { "secret_key": "eeef8074c2eb9a1cee2f2d3bb05325546a9fb7cbe44b599461fc5885f5fd9cac", "public_key": "9b892941a0573b7a1673ef480f081168d9b7496a81f9177dc427ca1f84cbbf7d", "message": "9ae39feade905affcbedd2e72a6f2429b3d1108e5bc1a9dbaf490a6299bccd94acc413adacc918b14afa85c78bc168cc00740c3da0e08183915f79b7fe3868ce2a7e886b32ad45009805bfb81b8c07b3b1022420c0f009b889d7fc22fd1997ae34198438ca94778575122fcaaf96e6502c33a75a129a2d0dbb073d93820d9c96683db318990be3fef4cafc890afbd9b1504c7439a08a065e7814ee4f9b6f57ee16baed3f0e3aa35dd23d3528a458919ad77048b4e2e6172346be249a50af02bc6c853304c208ae0ba02771262a0d8a465f71fa0635e53eb2ef0a847d56a0bcd7dd3fe077c92bcdca3069a4a682a2859928315ce3eb445c6072a71492ee82e172a20be0b648b756e6c775376f0c7c3df8e64288089c2f81ce9593c6e08bb1cc1b27fcbd392fc7952c55", "signed": "6f7101984fd6892e2144b7d45619830caeb6713bfab4eebbe217c5becd249bd9d752eb76e9fa995e7c71ff7df86bb260cdda173ff5deec6af204b7dde011de099ae39feade905affcbedd2e72a6f2429b3d1108e5bc1a9dbaf490a6299bccd94acc413adacc918b14afa85c78bc168cc00740c3da0e08183915f79b7fe3868ce2a7e886b32ad45009805bfb81b8c07b3b1022420c0f009b889d7fc22fd1997ae34198438ca94778575122fcaaf96e6502c33a75a129a2d0dbb073d93820d9c96683db318990be3fef4cafc890afbd9b1504c7439a08a065e7814ee4f9b6f57ee16baed3f0e3aa35dd23d3528a458919ad77048b4e2e6172346be249a50af02bc6c853304c208ae0ba02771262a0d8a465f71fa0635e53eb2ef0a847d56a0bcd7dd3fe077c92bcdca3069a4a682a2859928315ce3eb445c6072a71492ee82e172a20be0b648b756e6c775376f0c7c3df8e64288089c2f81ce9593c6e08bb1cc1b27fcbd392fc7952c55", "signature": "6f7101984fd6892e2144b7d45619830caeb6713bfab4eebbe217c5becd249bd9d752eb76e9fa995e7c71ff7df86bb260cdda173ff5deec6af204b7dde011de09" }, { "secret_key": "61faeb15f857f6557862c8b8c7ef41f80545520996fcc1127b8c2491822201ae", "public_key": "60a290c0fc425a0874673d94f9bb1400f9dacde9954f9f5b05dd48ab747a3950", "message": "253b566eccb563bd6e480c69739b8e372519a3437254e0e5029cac86c71638f2df2a6cf9e56db2569934deba90db75547e3671747df64d6f2aaf3c110fa67a7094ccbe4cc5355f0d43235136ee26dbe37f4225d3bbfe245595280585fb548f894e86c516102580291fa7a02859557fb98eb588870828b0990ae9d74f3831da58946bc7a5ce1ba498b4e8be8989a3b50d7e8789f56b8b4fecbc2a33bfa3ef591a0fbcd932fa93e19f3a812ae5e4e3b4b242be7705a5874af73be310b0058266a378f23c1348524715b0ccc18d6634b23636c316ba6a1dd2fd5092c06716a717b54d0eb9fc7f636f85bbf225a2cf035b4b7cfddd75351682c0576c6b3ba5a1c0b25ec594e7709dd09a0079772ff3acc67fb6c1b37bb3742b726e77e80561d9ab73160b73362581da5b9c7f", "signed": "31f90f50b2dc705f1d92f12ca9975d76f1b2826ada3cc185b0ed6c83860777bd8c489b59855a91f64839d49ba467985abb376c47a4908b271b8f77c58d01fd04253b566eccb563bd6e480c69739b8e372519a3437254e0e5029cac86c71638f2df2a6cf9e56db2569934deba90db75547e3671747df64d6f2aaf3c110fa67a7094ccbe4cc5355f0d43235136ee26dbe37f4225d3bbfe245595280585fb548f894e86c516102580291fa7a02859557fb98eb588870828b0990ae9d74f3831da58946bc7a5ce1ba498b4e8be8989a3b50d7e8789f56b8b4fecbc2a33bfa3ef591a0fbcd932fa93e19f3a812ae5e4e3b4b242be7705a5874af73be310b0058266a378f23c1348524715b0ccc18d6634b23636c316ba6a1dd2fd5092c06716a717b54d0eb9fc7f636f85bbf225a2cf035b4b7cfddd75351682c0576c6b3ba5a1c0b25ec594e7709dd09a0079772ff3acc67fb6c1b37bb3742b726e77e80561d9ab73160b73362581da5b9c7f", "signature": "31f90f50b2dc705f1d92f12ca9975d76f1b2826ada3cc185b0ed6c83860777bd8c489b59855a91f64839d49ba467985abb376c47a4908b271b8f77c58d01fd04" }, { "secret_key": "e6b9cd4da07cb34f30391cf68f0d87c7cfcf68f810ffa40f9739c95deb037f71", "public_key": "569ede0f04630b43a04c5a66b6a5636b766c75965984a7477e15491960fdd864", "message": "69def0523afda696f8448f9c1143abc26533e68695a090df0d9e43d0c0eff43583e6f709d2043c815fbb3f96ba2b0dc3be6fecad5dd38148788e4a0385a9fe7a921fcb8ccee0e4d3aed4bc3d216d84b414f9580b02820c03d92e675e685c4b5851f363bb4df97b417c3fd90022eeafa20dfbe82964f2ff073d255758fbe567c76b2c35e2b09f8a8d7afa32c6f5ad01bc3ebf6e210606db038ecb6820ce1ea4dd529fc1adfbc2a138565ac6d0f4a4109bdd47b8aa6ef4b8bede454680d1dbdb75fe1eb2e548d5de7cb6d792fef3aa0d8480a6030b30f104d7e76b58e9f476ebf2cc832923b50c50c111c3515fc518852323426ca778a596d3195da8585d8c3aa92083313a6e6585b70c98b185b472798a61cde77e62ec272f14b0d9eb4f22f9c7c05817da6fdefe7879a584", "signed": "1e375c94bd809ca0cdd02f89ecec4e437732dd20a0a84b254eae889d8070e682d113b0be22e41e6cdc3be877680e7eeb7f0995e6622dc0b434fb0949dd994b0c69def0523afda696f8448f9c1143abc26533e68695a090df0d9e43d0c0eff43583e6f709d2043c815fbb3f96ba2b0dc3be6fecad5dd38148788e4a0385a9fe7a921fcb8ccee0e4d3aed4bc3d216d84b414f9580b02820c03d92e675e685c4b5851f363bb4df97b417c3fd90022eeafa20dfbe82964f2ff073d255758fbe567c76b2c35e2b09f8a8d7afa32c6f5ad01bc3ebf6e210606db038ecb6820ce1ea4dd529fc1adfbc2a138565ac6d0f4a4109bdd47b8aa6ef4b8bede454680d1dbdb75fe1eb2e548d5de7cb6d792fef3aa0d8480a6030b30f104d7e76b58e9f476ebf2cc832923b50c50c111c3515fc518852323426ca778a596d3195da8585d8c3aa92083313a6e6585b70c98b185b472798a61cde77e62ec272f14b0d9eb4f22f9c7c05817da6fdefe7879a584", "signature": "1e375c94bd809ca0cdd02f89ecec4e437732dd20a0a84b254eae889d8070e682d113b0be22e41e6cdc3be877680e7eeb7f0995e6622dc0b434fb0949dd994b0c" }, { "secret_key": "4d9044f17b5a0977dc5aa9916a924300a244a1ef7f060277ad4978351ea64291", "public_key": "ab9c0692a606b2567c19c30f9faa3b4cfe72fb237077767b76d3b2ae1490a6d4", "message": "7c8c7189af67327af1c6dd2c30e975f190e3b38d008b4585167e0d450740d46734587f6d208784245cc5cb062a2a277f17ebb2746f9bdf4a8237ca479ab0a430177e19ed7dd3622576b14cdc08282214fe5ee4d76b43c16ac90864c51be8aed45d7b980df7917f290fdf795846465f27fcb7e5730637944f0577c92f32375e995bc0cda9d7196f2c0c1ac8b80d12a0439963ebd2254c347703575816e7964c13d44d629280c312ea265344de38f3b18d9150f8f924afb44b6bfb9eda513d59e65e2ef18666e6c2a21c4018665befe92cae581d3cb14e23e97d830002cb90931ae0210068af394ebe351be5b817f3674bfbf40049030e4fe505d34a1d502a2c50d8e638e926c230676b7edefb6bec77b1c0ce609325287ba5fdd7a9976987bd07fc6a4344956ebf818f08586c", "signed": "6fa48aea4d5b9af65af964cdb709443a11fa84f7d44acddab16e04a6fcefb27ae33c05b36da13c23de517d6e6ac574a03ea630ba4fbb958131129aa7f1354c017c8c7189af67327af1c6dd2c30e975f190e3b38d008b4585167e0d450740d46734587f6d208784245cc5cb062a2a277f17ebb2746f9bdf4a8237ca479ab0a430177e19ed7dd3622576b14cdc08282214fe5ee4d76b43c16ac90864c51be8aed45d7b980df7917f290fdf795846465f27fcb7e5730637944f0577c92f32375e995bc0cda9d7196f2c0c1ac8b80d12a0439963ebd2254c347703575816e7964c13d44d629280c312ea265344de38f3b18d9150f8f924afb44b6bfb9eda513d59e65e2ef18666e6c2a21c4018665befe92cae581d3cb14e23e97d830002cb90931ae0210068af394ebe351be5b817f3674bfbf40049030e4fe505d34a1d502a2c50d8e638e926c230676b7edefb6bec77b1c0ce609325287ba5fdd7a9976987bd07fc6a4344956ebf818f08586c", "signature": "6fa48aea4d5b9af65af964cdb709443a11fa84f7d44acddab16e04a6fcefb27ae33c05b36da13c23de517d6e6ac574a03ea630ba4fbb958131129aa7f1354c01" }, { "secret_key": "75ad76bb4c0c229a5adc79e444b13f88a96459862c8cf0ba498d0c996af94a7a", "public_key": "f074dd2b9c1c309105ec951bb5812a91ddb54023b3809ab379c56af0461af617", "message": "0ca8c1c74128d74e9d0a7bf8964291d074917f2f9920efb911520567642a50a615abcbd00aed4abbfef1a983cce333e1d0df3e6404fb9043c6803914cd5fffbc66a0790c7878a24089a571f895662a1d18be3f01ff97fb3323334b6f5baf96551448e4090d033c464294d09133b151d5b5c6321b50e2241de0ef6f882889ccf4ad3540d5a1e3f7548fb13be71c16516606e79d0449c2a08e5dc23148843c84e97ed24069161c8e75208f33e95b3e10d1d49a2faef9d986ab62809f62ad39c7cc871f375a4f5a6faf104d7e11b890cfb0589902685216ec07cb8e8e9e7a7c43635e23212b69ca3b7ed54f0b97949e3d9a6662f8e4b3ab09cd495294c331c047d86ee785ff658bcd7fcf9c480605ce05e810068d60fc9b26b5f063eb9000d2657a5094284ac80f1375d0b66d6f5f", "signed": "0c4643a8be6dc22f4beb6bcc70c6172ec7608378653cb4e99f3ae795eadf4e982a297609ca7938f5df632b095628cb75062d3d51fc0f3323bfa7b22ec4d472050ca8c1c74128d74e9d0a7bf8964291d074917f2f9920efb911520567642a50a615abcbd00aed4abbfef1a983cce333e1d0df3e6404fb9043c6803914cd5fffbc66a0790c7878a24089a571f895662a1d18be3f01ff97fb3323334b6f5baf96551448e4090d033c464294d09133b151d5b5c6321b50e2241de0ef6f882889ccf4ad3540d5a1e3f7548fb13be71c16516606e79d0449c2a08e5dc23148843c84e97ed24069161c8e75208f33e95b3e10d1d49a2faef9d986ab62809f62ad39c7cc871f375a4f5a6faf104d7e11b890cfb0589902685216ec07cb8e8e9e7a7c43635e23212b69ca3b7ed54f0b97949e3d9a6662f8e4b3ab09cd495294c331c047d86ee785ff658bcd7fcf9c480605ce05e810068d60fc9b26b5f063eb9000d2657a5094284ac80f1375d0b66d6f5f", "signature": "0c4643a8be6dc22f4beb6bcc70c6172ec7608378653cb4e99f3ae795eadf4e982a297609ca7938f5df632b095628cb75062d3d51fc0f3323bfa7b22ec4d47205" }, { "secret_key": "adc6e9b2e103b62c24ad4346410e83a1a0bd253e4abf77911850c6d9666e09f9", "public_key": "fce316e33c910821beeddd634bedc58ee57999a76ece384605283b99b543b78b", "message": "8cccd98ebbf2439ffdfac41687638faa444e1ca4b63d13e898eaa8355492f28813ab813fd01510e112be106b2045d30f63335d248904d521de181abac03e3d2cb2d16c44b3b012a0c51f9901aef9056c724d7a2c6b2acb0a07555940e4c6e21154890611adeb6489f461d3e5ecd1af5a4d2b0adaf41747436eb414757a8fe4775674e3c6e5de4569d6fc6c788e10905eba32c270a393e6f721a765294e2ac99a9b6e534d3df08d1db97d602ac3195cb0b77f5bd4acaf737fadd6991f0688abc74918047574eac28289739a664e0e0e20574a2c25fde49d14539db1cedd4a9204a70acff0a62c8f25cd768ffab15c4db316840a4d1bc92e212670be07c5bdcf537590607dfbbbb4d9f98b89da0b4df7d88f3eca4814d16bfa20c8d2fa94f9f259f2ee2d3a83c9e4171b1a262c4b99", "signed": "cb017d6d2682c9854366259aa35f30d491cfaa930998c297dbddc6aded5b3d401cf76d80d8a2764de131718b6e0c481d7196bc72579716b0c0f6ff053e68c50c8cccd98ebbf2439ffdfac41687638faa444e1ca4b63d13e898eaa8355492f28813ab813fd01510e112be106b2045d30f63335d248904d521de181abac03e3d2cb2d16c44b3b012a0c51f9901aef9056c724d7a2c6b2acb0a07555940e4c6e21154890611adeb6489f461d3e5ecd1af5a4d2b0adaf41747436eb414757a8fe4775674e3c6e5de4569d6fc6c788e10905eba32c270a393e6f721a765294e2ac99a9b6e534d3df08d1db97d602ac3195cb0b77f5bd4acaf737fadd6991f0688abc74918047574eac28289739a664e0e0e20574a2c25fde49d14539db1cedd4a9204a70acff0a62c8f25cd768ffab15c4db316840a4d1bc92e212670be07c5bdcf537590607dfbbbb4d9f98b89da0b4df7d88f3eca4814d16bfa20c8d2fa94f9f259f2ee2d3a83c9e4171b1a262c4b99", "signature": "cb017d6d2682c9854366259aa35f30d491cfaa930998c297dbddc6aded5b3d401cf76d80d8a2764de131718b6e0c481d7196bc72579716b0c0f6ff053e68c50c" }, { "secret_key": "37fc1beda4060b6c57883ddba0776c2bcf5ac28a651326021cca97723730fbb0", "public_key": "7bd7bf1c99dc82e06f08bb454d8fb288a57927e07ff1b12af15ee2c12fbb6b3d", "message": "3dfcac0265a024a83cb932674489a163aac314bf3d969f27596e451733b99deba5eeb779210baf95bf545a1ae6b8a915860693ee890f939320e06a844483d18c6a1bcd03c638bb7d1fe2a82eb448a311b1302ea6428f54a39f45a4d560be1557a2b254c45c137f45cc68356836e21bed0b7f73a518ce09db0be393927c339bf2a4b5987539404ce650284de12e3b553b262efe23848332ccfdc35e791a0ab43f139c71ed0fcb2d173bb377ee46b1a9dca9277e77df855f2830251e31e26acd86763c8d7eac22c882fc174f2b5e75ca6ad1ade03f942bb2a13bf541906159158c68363c7480c5b27a99320f8283a2699d4369c071c50dbd90b7792e4772efbc0b195bce84cc4dcfff7072a48968db69f9feddd0f9ced659eb5db7167f35f988cec114887dcbfdf27d02d300b3e1abec", "signed": "a01dd65fada27039f168b123419d8abfbda48c572ece24fda06e1a5ec31e084f4ee1cbf9961e88ed51e189fcb7f5f235de1e5b28d08f2bfca190b0f019ecc2073dfcac0265a024a83cb932674489a163aac314bf3d969f27596e451733b99deba5eeb779210baf95bf545a1ae6b8a915860693ee890f939320e06a844483d18c6a1bcd03c638bb7d1fe2a82eb448a311b1302ea6428f54a39f45a4d560be1557a2b254c45c137f45cc68356836e21bed0b7f73a518ce09db0be393927c339bf2a4b5987539404ce650284de12e3b553b262efe23848332ccfdc35e791a0ab43f139c71ed0fcb2d173bb377ee46b1a9dca9277e77df855f2830251e31e26acd86763c8d7eac22c882fc174f2b5e75ca6ad1ade03f942bb2a13bf541906159158c68363c7480c5b27a99320f8283a2699d4369c071c50dbd90b7792e4772efbc0b195bce84cc4dcfff7072a48968db69f9feddd0f9ced659eb5db7167f35f988cec114887dcbfdf27d02d300b3e1abec", "signature": "a01dd65fada27039f168b123419d8abfbda48c572ece24fda06e1a5ec31e084f4ee1cbf9961e88ed51e189fcb7f5f235de1e5b28d08f2bfca190b0f019ecc207" }, { "secret_key": "8d42f4ddd2bbd2b827b0a0d31d8f758ebd13a1b9b3712228948ca610bb8858e5", "public_key": "b7354898794f9db0a8af6eeafcdbdf011d3fbef0212ad938a4a4ad27ab16ebbf", "message": "e3a2bebc0496d8974a8f4061880369314ed9e440c1b77e26fe5071ce694ffd2136db0c4d5e880e6000083a75c90d3cf72b9cf5a2b1a9002c2701a2ff59b0699a8f42d79dd8a5fb71a8125453d91fb80080a3f0a16584282f17ec7dfdc2e5c69c4d9bdf484d55944dae273f211cfb76ad37da45871365439af35eea1fbecd4ca679b59b5e01bacf49c7f4e5efaa406ba1daeb085482af5ded89dc6885ffbe3d14d2931b83897e28ad06e5564e2789baea81bd932aa279fe8e324b9a8ef111c2abe2f137d4bb50d8ab76cebc0bd982a23919751ad4d49e88eb14173d3310289a872317e4a451e88d54320891870f15b2d53324430877a9fb5b49bb929f211c5b89764dd9c3a595a1451e9f85a238540002566e53a99ed1e6ddc9b4853f455edb4cf1980d56bbdc1313a36e76ea9cbb048a", "signed": "70764be39c6dca0f067abe1eca490fda951fd4e9499695266e270b9b05eae706ca8d1ca6a92d7c488ec6ad8ba11457a42a5e31702a9c2bce892dc40535c09f01e3a2bebc0496d8974a8f4061880369314ed9e440c1b77e26fe5071ce694ffd2136db0c4d5e880e6000083a75c90d3cf72b9cf5a2b1a9002c2701a2ff59b0699a8f42d79dd8a5fb71a8125453d91fb80080a3f0a16584282f17ec7dfdc2e5c69c4d9bdf484d55944dae273f211cfb76ad37da45871365439af35eea1fbecd4ca679b59b5e01bacf49c7f4e5efaa406ba1daeb085482af5ded89dc6885ffbe3d14d2931b83897e28ad06e5564e2789baea81bd932aa279fe8e324b9a8ef111c2abe2f137d4bb50d8ab76cebc0bd982a23919751ad4d49e88eb14173d3310289a872317e4a451e88d54320891870f15b2d53324430877a9fb5b49bb929f211c5b89764dd9c3a595a1451e9f85a238540002566e53a99ed1e6ddc9b4853f455edb4cf1980d56bbdc1313a36e76ea9cbb048a", "signature": "70764be39c6dca0f067abe1eca490fda951fd4e9499695266e270b9b05eae706ca8d1ca6a92d7c488ec6ad8ba11457a42a5e31702a9c2bce892dc40535c09f01" }, { "secret_key": "b62de5a1acfe4ca2d1f0c132afcbdae66fb29a02f297fbc2407fadbbf2454200", "public_key": "b63b2d0bf355f7b6d0bac07403411c40afbbb2f707503b3fc2cee8a1c7d0a838", "message": "e659e51d7b193c4b8e2b3ed73a9d7557ed2bab6153883ab723592f730a914567142b3fa435db3219f83a542dc7a4bd805af666ea865b853146f8e3a9fe870711f90d12b0693492af2a1edf99a16458f781f1266ec437a5296a822ca9d69ce844b5c59097a2a56f3eb8fd273a636116db774300922d45b744657a692f5e8bfbcb06d2422818aeb51e7cda68acfbeda16e7c79580dcccde24e8e3d601b16e063b43a6d0d1407552f7504f5be19882e4ffe32344f5f473e73a8f6ed37b0d8d9e5e0a0dc9828395bcbd8f3a4e3124869249d058be0e045de0b1e12b1c83ba0aa227c95b82bf742c3eac0152b33e6d19be8b33a35bf705daab10622a90aed022ea6e439ed50a9308437929924ba3ab111ad0caa6feb0a6eb165824ebdb0866571efc07e5222ed8686b14d9270bf76b945d52014", "signed": "5cdb00e98de73eab480be42f8a8a6163809a0d37101b6a5a4eed6a0c92030d09a5562c729080ce6f6594c8fafb1f594772db7a90a9e7da15896e82f70569390de659e51d7b193c4b8e2b3ed73a9d7557ed2bab6153883ab723592f730a914567142b3fa435db3219f83a542dc7a4bd805af666ea865b853146f8e3a9fe870711f90d12b0693492af2a1edf99a16458f781f1266ec437a5296a822ca9d69ce844b5c59097a2a56f3eb8fd273a636116db774300922d45b744657a692f5e8bfbcb06d2422818aeb51e7cda68acfbeda16e7c79580dcccde24e8e3d601b16e063b43a6d0d1407552f7504f5be19882e4ffe32344f5f473e73a8f6ed37b0d8d9e5e0a0dc9828395bcbd8f3a4e3124869249d058be0e045de0b1e12b1c83ba0aa227c95b82bf742c3eac0152b33e6d19be8b33a35bf705daab10622a90aed022ea6e439ed50a9308437929924ba3ab111ad0caa6feb0a6eb165824ebdb0866571efc07e5222ed8686b14d9270bf76b945d52014", "signature": "5cdb00e98de73eab480be42f8a8a6163809a0d37101b6a5a4eed6a0c92030d09a5562c729080ce6f6594c8fafb1f594772db7a90a9e7da15896e82f70569390d" }, { "secret_key": "9732059d7bf0200f5f30412430336be4ef1e3cae62938ad08729ce3ba714cfd4", "public_key": "0de8425f5e30b2b8aebb8072009a30cf0411c3c8238f4e4208760c56c33e434f", "message": "1a13e7ab603b48eb896fe17173fb31950b0dcd5a35ffdbe1371c7a5bfba593317589d9652d88797729180b8d0e515abfe6548f160421e537d5c94aef2b34c7ebb097420003bc0f361b423e7e14630a803c118202540049f68c9cf46fae0368d162e400d77bb4523cf6c753b975c245bc99ed2f413a9d06c2da6ce0cc0987b6406b809e8eb319033d2de9131dee3b1b7b5c95d653ced8fccf998da1768511eca4d3c5f735adab96503b3551803e4922635095ef811be4c08a6cbac917cbe6cd91a4ae5a330ccec0e8e815371217a3de62f2d2d61466219833f33447132f4d43350c58cbaf422475edb128c56d80a495726b1fdbc56551eb72d0f4fec26ba8bff5eed6774b85039a5292834b5d1cc1b09ba0a3954d29323673f5e71276a12ac4c579355bf1ecca48e6a716b9fcecdc565c51b9", "signed": "fba1749b641dd4df34664bc43c00468c7d75e84afad72de473fd1e9c87da15ea604fc2549a1a867fa80850e9c2a59cd99053886760a8d9764b84dd672676720d1a13e7ab603b48eb896fe17173fb31950b0dcd5a35ffdbe1371c7a5bfba593317589d9652d88797729180b8d0e515abfe6548f160421e537d5c94aef2b34c7ebb097420003bc0f361b423e7e14630a803c118202540049f68c9cf46fae0368d162e400d77bb4523cf6c753b975c245bc99ed2f413a9d06c2da6ce0cc0987b6406b809e8eb319033d2de9131dee3b1b7b5c95d653ced8fccf998da1768511eca4d3c5f735adab96503b3551803e4922635095ef811be4c08a6cbac917cbe6cd91a4ae5a330ccec0e8e815371217a3de62f2d2d61466219833f33447132f4d43350c58cbaf422475edb128c56d80a495726b1fdbc56551eb72d0f4fec26ba8bff5eed6774b85039a5292834b5d1cc1b09ba0a3954d29323673f5e71276a12ac4c579355bf1ecca48e6a716b9fcecdc565c51b9", "signature": "fba1749b641dd4df34664bc43c00468c7d75e84afad72de473fd1e9c87da15ea604fc2549a1a867fa80850e9c2a59cd99053886760a8d9764b84dd672676720d" }, { "secret_key": "9c7f6f379e3857007e2ac6324cbbced57ac9eee4477813f83a81fc8cefa964d5", "public_key": "a54ba396d687634d3eccf41c5782494f5f10a521a1e5d388523d80eeba5b0b2b", "message": "3f2d3072fe7383e541551ea9abdbaeae6a464ae6b9f0ba786a441b2d08da5bcada3c5424dc6931d6b39523e2de0a0c2e4e6b5b8cda925e5eac938416a2c51bf13d49531d7ec7114b1c82feaf90f3f87591e397d02702f8ec1b30d99f5be7d2203e4fe4db2ea47e7b4589d8ac506248d7347466edbc96ea32bf3a6ea7502dd60c9e84902715ab2c6ca68f5b00e1d909d83aa6ab662d8aea870ecd861fec69f2eec0ae677d2995b0ed688faa8ef78244e0d1195697b07122ceaa11f5a6ea58fbdfa2e2ec2df9d18693ae96d47127556e91f0864982c13419b04a63f208e730d26951882aefe001bca3408bd9862748c6cc876c28cac3bb2eb3395818c2091e0fbd7a0b4468c6b0d00cd008c11c3c3ad01080a1f5a40ae2e4b0c3a071efc8e1d1ba6ace6d4df0ff19829b0c680b3aeb759177ed34", "signed": "65685f9ca5982e15a22ba3c83a0348348482dfae57cea178f0780c057baebe4af632f984540a26019a7fb34253c9ece7ff308ada233ce0686347ab5b21ce570b3f2d3072fe7383e541551ea9abdbaeae6a464ae6b9f0ba786a441b2d08da5bcada3c5424dc6931d6b39523e2de0a0c2e4e6b5b8cda925e5eac938416a2c51bf13d49531d7ec7114b1c82feaf90f3f87591e397d02702f8ec1b30d99f5be7d2203e4fe4db2ea47e7b4589d8ac506248d7347466edbc96ea32bf3a6ea7502dd60c9e84902715ab2c6ca68f5b00e1d909d83aa6ab662d8aea870ecd861fec69f2eec0ae677d2995b0ed688faa8ef78244e0d1195697b07122ceaa11f5a6ea58fbdfa2e2ec2df9d18693ae96d47127556e91f0864982c13419b04a63f208e730d26951882aefe001bca3408bd9862748c6cc876c28cac3bb2eb3395818c2091e0fbd7a0b4468c6b0d00cd008c11c3c3ad01080a1f5a40ae2e4b0c3a071efc8e1d1ba6ace6d4df0ff19829b0c680b3aeb759177ed34", "signature": "65685f9ca5982e15a22ba3c83a0348348482dfae57cea178f0780c057baebe4af632f984540a26019a7fb34253c9ece7ff308ada233ce0686347ab5b21ce570b" }, { "secret_key": "a478f35abb73727b6be6ee5e56eec323c9517882fd6919360ebbbf5d5cb8b83a", "public_key": "7a6e266a54d135dda0009ccda8a94a4712ae5cb14761e8436e97c4b7814d8e8c", "message": "0173a34050b43748061ff8f5a3d7c43b6360847786e8bb75e536fb47b645b214f221ba24d83d28bc025024663e534f90f6e83a93d8bddeda2cd8808155652a908c437c2db6f3ed4912f57ca5b97928a73be964af59df4439854bb006fc295a87b7b72239c7fadfec40715509d98579daadfb8d524b4cec6620705efd4104c297144aea722974e12c5ecee5391ef2d93ac2b124e4ac496147c8b70363585d7078ccc53e2ae593350bc25548a0542526ab00afe477a0f4b27397c72bc74a8a8ab156e62b8bb47c3fbb4b34913e459687476bf33142c614702107ffe2cc01e25fa30275e1e2e63cea9168e4a47c02de097d4d853b27675c5bb330b94a974ead85e2bdee8ee17cbb5653346658df2f91f6bd739491dd71988b3a976a3e2e7a9d137410f4acba9feb5f11798c9a43b6adce14365a7c6d", "signed": "9d16fd40b9f8dd9b4a1a8c6d703b9fccbb940b1e0ae77a5970374af0cf726f4479fd30d7dff5cf53494d9a296ab6b9e46ea6c136b4db2c71c21b97c1c8254d0a0173a34050b43748061ff8f5a3d7c43b6360847786e8bb75e536fb47b645b214f221ba24d83d28bc025024663e534f90f6e83a93d8bddeda2cd8808155652a908c437c2db6f3ed4912f57ca5b97928a73be964af59df4439854bb006fc295a87b7b72239c7fadfec40715509d98579daadfb8d524b4cec6620705efd4104c297144aea722974e12c5ecee5391ef2d93ac2b124e4ac496147c8b70363585d7078ccc53e2ae593350bc25548a0542526ab00afe477a0f4b27397c72bc74a8a8ab156e62b8bb47c3fbb4b34913e459687476bf33142c614702107ffe2cc01e25fa30275e1e2e63cea9168e4a47c02de097d4d853b27675c5bb330b94a974ead85e2bdee8ee17cbb5653346658df2f91f6bd739491dd71988b3a976a3e2e7a9d137410f4acba9feb5f11798c9a43b6adce14365a7c6d", "signature": "9d16fd40b9f8dd9b4a1a8c6d703b9fccbb940b1e0ae77a5970374af0cf726f4479fd30d7dff5cf53494d9a296ab6b9e46ea6c136b4db2c71c21b97c1c8254d0a" }, { "secret_key": "ffe825148c0959b3a68de86ad8e8af7fa5e078f363dc124213c90020da0c9089", "public_key": "139152a0bd22962dd919ae3e0b1620e03c033c2ad0a3979ec6bcd1705e23d598", "message": "f125780d0cd088530f0c87b70bd42ebab56adb5ad4345f929ae5deae07fb55322153a8f023d38843bf5d6a93fe993eee71bc2ee563b25a50918f03efdb5dbf7269add69ded3e66953895620d9b6cf46ba2348f8d66d7f092235e378c1e3edfebeb78084bc8dea013f9933aae14a041948276d01f1cb5834b0e590e13d931d19292bb1d8041ff2fe2e1171a2e0b9a059821d0924dde7f3b1bb59813f5e3c63520aafb8801ba62c7097d4d8cf437a568a7f0087c6ea0fce6e568c4883f1cd12c749d06a6feb278f1086a8b04769921f78a9959062ab06f98ee80c2c7854ffa760f86a89ee1a51266053d195e61bb1dbd18dd89ff394e408ace0f641a395d56118ea72b7d8adf78b1655ecece7e8250e8a3a91cb8fca0d9ce0baf8980a387c5ed4318663280e5b4531f3187c47eaea7c329728ddd0e40", "signed": "fe4e89ee31786c0a3d3de3649bb93f0b8aef1caf5a832ec5e4067810705adddf539b8f4e05ad08cf3479e45b42c96528f6d59a4625703ddbf15b63093965d80df125780d0cd088530f0c87b70bd42ebab56adb5ad4345f929ae5deae07fb55322153a8f023d38843bf5d6a93fe993eee71bc2ee563b25a50918f03efdb5dbf7269add69ded3e66953895620d9b6cf46ba2348f8d66d7f092235e378c1e3edfebeb78084bc8dea013f9933aae14a041948276d01f1cb5834b0e590e13d931d19292bb1d8041ff2fe2e1171a2e0b9a059821d0924dde7f3b1bb59813f5e3c63520aafb8801ba62c7097d4d8cf437a568a7f0087c6ea0fce6e568c4883f1cd12c749d06a6feb278f1086a8b04769921f78a9959062ab06f98ee80c2c7854ffa760f86a89ee1a51266053d195e61bb1dbd18dd89ff394e408ace0f641a395d56118ea72b7d8adf78b1655ecece7e8250e8a3a91cb8fca0d9ce0baf8980a387c5ed4318663280e5b4531f3187c47eaea7c329728ddd0e40", "signature": "fe4e89ee31786c0a3d3de3649bb93f0b8aef1caf5a832ec5e4067810705adddf539b8f4e05ad08cf3479e45b42c96528f6d59a4625703ddbf15b63093965d80d" }, { "secret_key": "49aff421a7cd12722aa84c48c1fb1c5f8d9e277d0a99ecbc9348c3aaa74be422", "public_key": "88d2c26266f493bc67578ca0b1f51160cf0fdb6a09a906db9faa686f11f8208d", "message": "70a1ac144b75fda75586a79c36fd39cce5f5cae2e6375852d3b62a9630336a293ea6d2ac6e5b57da21ef364a595bb0750f5bf4d2b320676423870e4b8e0869601f16680619048c4ede276da69f205a70176e25ea04bd089763e709ba343fc8831e52044eabf9441e6997f8ba1aeb9ef0f491170667a7f5fc9627cbd0551b76be27283a4b0c5f667846688226a115ee8020df08042b19b59fe551316a6cb6916860b9ecd74154b4051038a17352372ec14d3c957d2ef50ff786189a8aeb9c08f45eeb5eb8b040339974aa9798c425d7becb228c447a6d0b3cef271893e0f7076e223a7e87c6a3d270a033bc97a4565edce0aa91ffc3f7801775a6f29b230245bd71fa034353de372395d1bfcbdebba081330f7c076be99c2cf4867f15b78d52f46fc7391c9cb95e5d64643baffe72a8e3a650667fbb3e", "signed": "749181284df05dbe5974b91782a1a76ea08642cb0f0c98db586c575c210cdc8b651bd34b757ae38e4b6be9465235bd0eca430e26c3eede561c6e824dfa200e0a70a1ac144b75fda75586a79c36fd39cce5f5cae2e6375852d3b62a9630336a293ea6d2ac6e5b57da21ef364a595bb0750f5bf4d2b320676423870e4b8e0869601f16680619048c4ede276da69f205a70176e25ea04bd089763e709ba343fc8831e52044eabf9441e6997f8ba1aeb9ef0f491170667a7f5fc9627cbd0551b76be27283a4b0c5f667846688226a115ee8020df08042b19b59fe551316a6cb6916860b9ecd74154b4051038a17352372ec14d3c957d2ef50ff786189a8aeb9c08f45eeb5eb8b040339974aa9798c425d7becb228c447a6d0b3cef271893e0f7076e223a7e87c6a3d270a033bc97a4565edce0aa91ffc3f7801775a6f29b230245bd71fa034353de372395d1bfcbdebba081330f7c076be99c2cf4867f15b78d52f46fc7391c9cb95e5d64643baffe72a8e3a650667fbb3e", "signature": "749181284df05dbe5974b91782a1a76ea08642cb0f0c98db586c575c210cdc8b651bd34b757ae38e4b6be9465235bd0eca430e26c3eede561c6e824dfa200e0a" }, { "secret_key": "703a6e2b62d0090c61d8659b6a963e03c9d62c1b38f7d70e5f9ff05590cd0360", "public_key": "370c21de6ef2fab534ada999869c90bc9b92ccbf249b79d39d95441d1ede210a", "message": "d42a1756e84df4b4e9773f86f7674a2cd78e71e40aa8f644e6702dfbc2c2c5ca90fc242e9cb0099cc8f2c2d3136baafc0ff695482fdacdef9f565610b6e1900722f435c6385b35e9f6c436ca037e03f64e2233dffa58db3b91cc1daa0bb0c54c8a43e469d2cff7fa2bf8f5d1d877931089c82ed89aba42f2ee2b86e445cfd09f4cd78b35191bf467e784eef75dc987e046d37d4d4e8e9bbe14af80d03a1f40898384b9d3279fac9c57fd9c7eecbe19a5acc15033b84e07fd0e409bdbd5a57f65641183a6c0a8ec426d1f1d223166ff0a1900b2e92b7d85835d019d17775e5093ccd126f90f63cb7d15cbeb531324219cd64ded6714b21a65371af07210dfdf0e4e58ddc7d59f4cfa65c421d814ee2c9bf6dbf64873d579b09ee5dcedd733063e039ac9a5f9ca4c2525a4cc8e984da7185e2d64fad81c8a", "signed": "e5fd64da028800c6ceed068a5e596f1621c70a8cb138b31b32647eb4b07bd2ecc5942c18844f367033f67398e314ba2c7ccf299c069787777025d845f2aad60ed42a1756e84df4b4e9773f86f7674a2cd78e71e40aa8f644e6702dfbc2c2c5ca90fc242e9cb0099cc8f2c2d3136baafc0ff695482fdacdef9f565610b6e1900722f435c6385b35e9f6c436ca037e03f64e2233dffa58db3b91cc1daa0bb0c54c8a43e469d2cff7fa2bf8f5d1d877931089c82ed89aba42f2ee2b86e445cfd09f4cd78b35191bf467e784eef75dc987e046d37d4d4e8e9bbe14af80d03a1f40898384b9d3279fac9c57fd9c7eecbe19a5acc15033b84e07fd0e409bdbd5a57f65641183a6c0a8ec426d1f1d223166ff0a1900b2e92b7d85835d019d17775e5093ccd126f90f63cb7d15cbeb531324219cd64ded6714b21a65371af07210dfdf0e4e58ddc7d59f4cfa65c421d814ee2c9bf6dbf64873d579b09ee5dcedd733063e039ac9a5f9ca4c2525a4cc8e984da7185e2d64fad81c8a", "signature": "e5fd64da028800c6ceed068a5e596f1621c70a8cb138b31b32647eb4b07bd2ecc5942c18844f367033f67398e314ba2c7ccf299c069787777025d845f2aad60e" }, { "secret_key": "76849c188e3edd0ff5f8fb874dc0456645518445e41a7d6833e616c3c48c9868", "public_key": "d670e2ea07db60c22ab79a93ebf49d22a6245ee3af07b3be584eda694c37729e", "message": "1eccb0bc8eca3ab5bee68c5f8caa34536766c705f50827db7ac375d4fe30b58ffb7e2fe490cc71a8ff86c006d6174d05793ab8a55dd51b06de417bc0ac452cdc7cfb0bb00362b6765d20db23eb1848027064a1d9091d3b10ed776f28b76768bdfc08f0bc511f76faeba76cfc4cb5c83dc9ebe8a8d79edca923eccd524009cafedc90e3ad87d1392e1fccf4e60ccab95dc0ab54bf44245a007a96d46634b1b2965b829c3d7daa765972b54a7b365b6f34d77d7176acd8d894f6b417091b6c00edb7a4e81379988bfcecb692e9c3c4310a7e240e5c1063cde113f22a684a50a112ff47d3898812efb92637072b86163ad89316d221195acbfad0a03a1fbc2d967fe83f84c8459fccd490b9c5b3e55d27e9484e943c417f2128d73701da28f49fd3683f33a39cdee234bd305b9491e2f3eb621be3dd1dbbb31b", "signed": "7141399d51daa6eb4519bf3f01b233920fa908fefa612f0cd7d5af8a9a3c44190e3f6384a8d14d37c97030ef5018cf8aee8aeb1569a73d84862a59b7df72fe091eccb0bc8eca3ab5bee68c5f8caa34536766c705f50827db7ac375d4fe30b58ffb7e2fe490cc71a8ff86c006d6174d05793ab8a55dd51b06de417bc0ac452cdc7cfb0bb00362b6765d20db23eb1848027064a1d9091d3b10ed776f28b76768bdfc08f0bc511f76faeba76cfc4cb5c83dc9ebe8a8d79edca923eccd524009cafedc90e3ad87d1392e1fccf4e60ccab95dc0ab54bf44245a007a96d46634b1b2965b829c3d7daa765972b54a7b365b6f34d77d7176acd8d894f6b417091b6c00edb7a4e81379988bfcecb692e9c3c4310a7e240e5c1063cde113f22a684a50a112ff47d3898812efb92637072b86163ad89316d221195acbfad0a03a1fbc2d967fe83f84c8459fccd490b9c5b3e55d27e9484e943c417f2128d73701da28f49fd3683f33a39cdee234bd305b9491e2f3eb621be3dd1dbbb31b", "signature": "7141399d51daa6eb4519bf3f01b233920fa908fefa612f0cd7d5af8a9a3c44190e3f6384a8d14d37c97030ef5018cf8aee8aeb1569a73d84862a59b7df72fe09" }, { "secret_key": "83ae48ad70da0bb3cdf87481ee2c0c8571c2ca986712f8bc2329e9a3e33383c5", "public_key": "b785309000df95f5a04f7d89c4113301057adaeeb29bcd28d99371b537bba2f6", "message": "b7521d3f71c679fa7037fe7488a641f6b97c49454acc8e36b903d8f9ebb54d89cb56efd19e04ba6a7c8f48a7d3ec9decd3f1cd0faf6e978118e6adce9c6c6be63c6a6a1ae21651828479a46bc9a0f7943040f940a0d470c8e577c5d575cb53c1bf3ab1feb050dcb6fef0ba4447f299fdb9f27ecb0714ecfefd74bad7b122a462c24a209848a03389074578c5bdc36396d809b0f14018da64917e6bf87ef405c8f3e333ff9c3baf6339667620794bb4743f0514b5de7d7fdd947a7e3501ee88efad159e33a1072fbb99c7c71e9d13a502d5a07c4f817eeb7f0c5319aa41a96d5ff4f15a73c29b571fe211090e172c8db518624612a5c371a9d7cef6de35ebef96e88e1a78af3bd5dd35251ab54d73718f3e70d2d59021531dc73184f0fc69c2e92965844ec27c1c02af5e9a3469de355db2256e0ec2a4eba30a", "signed": "43332351d3fb7b45fcf37c607d442ea80dbda2cb69c2884f424e65ea3a331ed8472d4368405cb736b2d6685ad782e239fe833ed789a2923185166f608342ee05b7521d3f71c679fa7037fe7488a641f6b97c49454acc8e36b903d8f9ebb54d89cb56efd19e04ba6a7c8f48a7d3ec9decd3f1cd0faf6e978118e6adce9c6c6be63c6a6a1ae21651828479a46bc9a0f7943040f940a0d470c8e577c5d575cb53c1bf3ab1feb050dcb6fef0ba4447f299fdb9f27ecb0714ecfefd74bad7b122a462c24a209848a03389074578c5bdc36396d809b0f14018da64917e6bf87ef405c8f3e333ff9c3baf6339667620794bb4743f0514b5de7d7fdd947a7e3501ee88efad159e33a1072fbb99c7c71e9d13a502d5a07c4f817eeb7f0c5319aa41a96d5ff4f15a73c29b571fe211090e172c8db518624612a5c371a9d7cef6de35ebef96e88e1a78af3bd5dd35251ab54d73718f3e70d2d59021531dc73184f0fc69c2e92965844ec27c1c02af5e9a3469de355db2256e0ec2a4eba30a", "signature": "43332351d3fb7b45fcf37c607d442ea80dbda2cb69c2884f424e65ea3a331ed8472d4368405cb736b2d6685ad782e239fe833ed789a2923185166f608342ee05" }, { "secret_key": "39e56a65623a0aebade0da12ce1df378bc924073f73a549effaebc465d1a78e2", "public_key": "83da8ad50bad09eb3e94c725df3cc3a119736adc859ca1a10503f48ff2fec596", "message": "a96dc2ea3fa1351492a4619d9194681f8ec400a97158244482653838ccb7e156a82d564368f83a6ee1be46bc34b817200e8464c3d12b5ef2c50b19565b881c4c3d4563fb947eb47c3ee9c1ee7853269874455bfacba305f307d1ac5309eeae5c07fa5c4d428edbc8b9528c4415243a9ef580aff8fcfb12000a71fceee89de97f90279529bcc822ed3cb34c82ba5fec15f4945663636d67b5feceacc31d25f98aea07f7800d5a1034251cb91dd0963ec2c1a54773a4d96c18357f8d101de58e932f8c6cdde8e3cfcef5a7443fdba7b78320403c0196844724a612183e34bdd808ce7b958861ca37115730eaede1fd0baabe976efefd0365fdf926776c536f47ff80de5c18291bb7e9f1b913ffd1d94468b789752fae6ca897c0cca53ef1e731d00c8bdbe8929ea6b1dce1f31a20688d37b0f3a2b4153b306bdba1", "signed": "398e8260011f57d8ac8c58d5457bc652c7414aaf6fb2f426b7899056605c0afc28392423b2b571f5e6c3c7f6d60245e53ebd03bdc5ad3c1ad8738cb32214d00fa96dc2ea3fa1351492a4619d9194681f8ec400a97158244482653838ccb7e156a82d564368f83a6ee1be46bc34b817200e8464c3d12b5ef2c50b19565b881c4c3d4563fb947eb47c3ee9c1ee7853269874455bfacba305f307d1ac5309eeae5c07fa5c4d428edbc8b9528c4415243a9ef580aff8fcfb12000a71fceee89de97f90279529bcc822ed3cb34c82ba5fec15f4945663636d67b5feceacc31d25f98aea07f7800d5a1034251cb91dd0963ec2c1a54773a4d96c18357f8d101de58e932f8c6cdde8e3cfcef5a7443fdba7b78320403c0196844724a612183e34bdd808ce7b958861ca37115730eaede1fd0baabe976efefd0365fdf926776c536f47ff80de5c18291bb7e9f1b913ffd1d94468b789752fae6ca897c0cca53ef1e731d00c8bdbe8929ea6b1dce1f31a20688d37b0f3a2b4153b306bdba1", "signature": "398e8260011f57d8ac8c58d5457bc652c7414aaf6fb2f426b7899056605c0afc28392423b2b571f5e6c3c7f6d60245e53ebd03bdc5ad3c1ad8738cb32214d00f" }, { "secret_key": "4b9921852f409a323ae38175e8d76a211fc4d9c654178eea3baa7a767a6fda06", "public_key": "4c723e436b6bd97f44af52503b21cc50d5f6ad6cfc8288345dde8054e995582e", "message": "3f33d8fb83e68741090a37bedd745cf141aaaed8c92ffa742a52561777885805ace14246ab98a8cb598c9ce3de9b29bae5fa04b1cf828de11aff80a7ef8a3a38aede4f3c3563a25d049badcad5ed7e47fdbba6e111307eebe9ef4906bc989728b76e84afe808e6653b271e21104aa665f1898dd2aab23090e22b4e344a2616fbd8ee4ad8ed8108395eba817fbd14fec5c17dcf56b8220856b2b833e091407d5089b35ddf34b86ff7dc9fde52b21ef12176ef3370b7f3a0a8cb1b058a51aefff3d279d80f51a68bfb592587b45c5c63a7e4d625b887de486a118316c3b6a238575f92ac5b1c94c3f5dbbd96686000d6d39cccd558d420e4d447a8cbc4bc7b8c6a03af0f0034fb3518d93800f0f713e4b13732e16ada51801d7e559cf839d1058f64955698311399345416850dddcc5601a684fd09e6afd3944f5e19", "signed": "cbf1f1642df950eb71fd09590d34c265922c58bd8026bba3fc0e594a6bb1f2b90da3dc1d5f6b6d5b405a896d1dbb71b8685c4dfc444acaffe65ab8331789f5073f33d8fb83e68741090a37bedd745cf141aaaed8c92ffa742a52561777885805ace14246ab98a8cb598c9ce3de9b29bae5fa04b1cf828de11aff80a7ef8a3a38aede4f3c3563a25d049badcad5ed7e47fdbba6e111307eebe9ef4906bc989728b76e84afe808e6653b271e21104aa665f1898dd2aab23090e22b4e344a2616fbd8ee4ad8ed8108395eba817fbd14fec5c17dcf56b8220856b2b833e091407d5089b35ddf34b86ff7dc9fde52b21ef12176ef3370b7f3a0a8cb1b058a51aefff3d279d80f51a68bfb592587b45c5c63a7e4d625b887de486a118316c3b6a238575f92ac5b1c94c3f5dbbd96686000d6d39cccd558d420e4d447a8cbc4bc7b8c6a03af0f0034fb3518d93800f0f713e4b13732e16ada51801d7e559cf839d1058f64955698311399345416850dddcc5601a684fd09e6afd3944f5e19", "signature": "cbf1f1642df950eb71fd09590d34c265922c58bd8026bba3fc0e594a6bb1f2b90da3dc1d5f6b6d5b405a896d1dbb71b8685c4dfc444acaffe65ab8331789f507" }, { "secret_key": "1bff652a2c8309a393ac11da3aa97fb078bb284ed5e1b8ccc983652ef8556cd0", "public_key": "aaabdc091fc3682354201744e9b73fd2a6cfb281914bf2c70ec3dc1dec7216b0", "message": "48d02698a97bdcb3ef078dcfcf5750005f1702d300e7e89bc436e381113401f852b8b4acff60ffbd4ab46d202168d98b8735e79cb350e35b070ff6bdcafd954b551969b6b1a70c9131ebd40d96140291d8d2b091540a8b18d8e5465915c25dbc6b5c9a687942533c372c8b4e95a953677169b950edd3464375cd43132ff9bd541ee22bd418ce23195f65d8b289f633ec8d71e1a801b06c3c827f627e723d2199100ce73e8e4a4440e778317a474910793b47b10ffb55db7f281c7d7a033bd80048b82673b87cf95e99422ba628688f3c971890ca15d12f572fa1977a17307069da304ead3026eb01042668890d17008cd1e92c46cbe9c857e7193de3aba3911e4f86fe0a1698ab7cdb9251a8424b2848b96ad81ea239d365fdea92ea5c0473d0a6bb1e371356bdfad2d0350336d3e1947c936fd0c25195445011731b", "signed": "93c9c33493fc64172d51e16a0a1cd729a0d99e3cb864e89a42987f39dd8cd26545fdfe37581911e803677da4c55b0a683ddf62b728f8f30685ae58f628ebe60948d02698a97bdcb3ef078dcfcf5750005f1702d300e7e89bc436e381113401f852b8b4acff60ffbd4ab46d202168d98b8735e79cb350e35b070ff6bdcafd954b551969b6b1a70c9131ebd40d96140291d8d2b091540a8b18d8e5465915c25dbc6b5c9a687942533c372c8b4e95a953677169b950edd3464375cd43132ff9bd541ee22bd418ce23195f65d8b289f633ec8d71e1a801b06c3c827f627e723d2199100ce73e8e4a4440e778317a474910793b47b10ffb55db7f281c7d7a033bd80048b82673b87cf95e99422ba628688f3c971890ca15d12f572fa1977a17307069da304ead3026eb01042668890d17008cd1e92c46cbe9c857e7193de3aba3911e4f86fe0a1698ab7cdb9251a8424b2848b96ad81ea239d365fdea92ea5c0473d0a6bb1e371356bdfad2d0350336d3e1947c936fd0c25195445011731b", "signature": "93c9c33493fc64172d51e16a0a1cd729a0d99e3cb864e89a42987f39dd8cd26545fdfe37581911e803677da4c55b0a683ddf62b728f8f30685ae58f628ebe609" }, { "secret_key": "002fdd1f7641793ab064bb7aa848f762e7ec6e332ffc26eeacda141ae33b1783", "public_key": "77d1d8ebacd13f4e2f8a40e28c4a63bc9ce3bfb69716334bcb28a33eb134086c", "message": "5ac1dfc324f43e6cb79a87ab0470fa857b51fb944982e19074ca44b1e40082c1d07b92efa7ea55ad42b7c027e0b9e33756d95a2c1796a7c2066811dc41858377d4b835c1688d638884cd2ad8970b74c1a54aadd27064163928a77988b24403aa85af82ceab6b728e554761af7175aeb99215b7421e4474c04d213e01ff03e3529b11077cdf28964b8c49c5649e3a46fa0a09dcd59dcad58b9b922a83210acd5e65065531400234f5e40cddcf9804968e3e9ac6f5c44af65001e158067fc3a660502d13fa8874fa93332138d9606bc41b4cee7edc39d753dae12a873941bb357f7e92a4498847d6605456cb8c0b425a47d7d3ca37e54e903a41e6450a35ebe5237c6f0c1bbbc1fd71fb7cd893d189850295c199b7d88af26bc8548975fda1099ffefee42a52f3428ddff35e0173d3339562507ac5d2c45bbd2c19cfe89b", "signed": "0df3aa0d0999ad3dc580378f52d152700d5b3b057f56a66f92112e441e1cb9123c66f18712c87efe22d2573777296241216904d7cdd7d5ea433928bd2872fa0c5ac1dfc324f43e6cb79a87ab0470fa857b51fb944982e19074ca44b1e40082c1d07b92efa7ea55ad42b7c027e0b9e33756d95a2c1796a7c2066811dc41858377d4b835c1688d638884cd2ad8970b74c1a54aadd27064163928a77988b24403aa85af82ceab6b728e554761af7175aeb99215b7421e4474c04d213e01ff03e3529b11077cdf28964b8c49c5649e3a46fa0a09dcd59dcad58b9b922a83210acd5e65065531400234f5e40cddcf9804968e3e9ac6f5c44af65001e158067fc3a660502d13fa8874fa93332138d9606bc41b4cee7edc39d753dae12a873941bb357f7e92a4498847d6605456cb8c0b425a47d7d3ca37e54e903a41e6450a35ebe5237c6f0c1bbbc1fd71fb7cd893d189850295c199b7d88af26bc8548975fda1099ffefee42a52f3428ddff35e0173d3339562507ac5d2c45bbd2c19cfe89b", "signature": "0df3aa0d0999ad3dc580378f52d152700d5b3b057f56a66f92112e441e1cb9123c66f18712c87efe22d2573777296241216904d7cdd7d5ea433928bd2872fa0c" }, { "secret_key": "25b0f0bb3dcb422a6f3c6c220eaadb11dbfe489c2d455b276cefe8cba057f9f3", "public_key": "fe03c9c4394adc74b13f47654bead8bc855958b4194fdab2097ac1b157933c05", "message": "54d99f969efa8870fc20fa9a962bb372619c324439728af3139c2a07e8c1b29c1e4eedc2d40ba722f63ce37670362af6f5202add668c4fb4d62fa8bacbc7d07ff3bd38c15a01064259cc34134861632967460541a99b8d5182bf59347b5a59879aa3b091a1f3e04135bd6301be5226d4895e5e9c2b15e48e5ecdf44129e6122853a606fc118466fa720b5ab165635c3bde04d74289274fa03547accbde780e1fa0bf2c56f8436a53e73878a424a29aa9de385dba419ae6a5d12e004276152b58d325b302400a55333c38cde4908ae1d0121cbeca950809c543314277c1485e68d9f9c0a962d1b1e0dda1d4a52b56f8308a80b92acc9f4ebc3ed45d91a129da8675621af676703def3b84113183b2e3a8c56157f243f13980f3d1756fea7668c91503d35c839a2120c79ec954fb546d7b542f987289534ffdef62d47fd5ec", "signed": "da50d5242bf51c3951780cafd926d67bdf5640d5d3bb08433831d56e48e2592a1c375968bb4d2fbea56145abf2d82991363b1565fa1effe214011a686e39950e54d99f969efa8870fc20fa9a962bb372619c324439728af3139c2a07e8c1b29c1e4eedc2d40ba722f63ce37670362af6f5202add668c4fb4d62fa8bacbc7d07ff3bd38c15a01064259cc34134861632967460541a99b8d5182bf59347b5a59879aa3b091a1f3e04135bd6301be5226d4895e5e9c2b15e48e5ecdf44129e6122853a606fc118466fa720b5ab165635c3bde04d74289274fa03547accbde780e1fa0bf2c56f8436a53e73878a424a29aa9de385dba419ae6a5d12e004276152b58d325b302400a55333c38cde4908ae1d0121cbeca950809c543314277c1485e68d9f9c0a962d1b1e0dda1d4a52b56f8308a80b92acc9f4ebc3ed45d91a129da8675621af676703def3b84113183b2e3a8c56157f243f13980f3d1756fea7668c91503d35c839a2120c79ec954fb546d7b542f987289534ffdef62d47fd5ec", "signature": "da50d5242bf51c3951780cafd926d67bdf5640d5d3bb08433831d56e48e2592a1c375968bb4d2fbea56145abf2d82991363b1565fa1effe214011a686e39950e" }, { "secret_key": "bf5ba5d6a49dd5ef7b4d5d7d3e4ecc505c01f6ccee4c54b5ef7b40af6a454140", "public_key": "1be034f813017b900d8990af45fad5b5214b573bd303ef7a75ef4b8c5c5b9842", "message": "16152c2e037b1c0d3219ced8e0674aee6b57834b55106c5344625322da638ecea2fc9a424a05ee9512d48fcf75dd8bd4691b3c10c28ec98ee1afa5b863d1c36795ed18105db3a9aabd9d2b4c1747adbaf1a56ffcc0c533c1c0faef331cdb79d961fa39f880a1b8b1164741822efb15a7259a465bef212855751fab66a897bfa211abe0ea2f2e1cd8a11d80e142cde1263eec267a3138ae1fcf4099db0ab53d64f336f4bcd7a363f6db112c0a2453051a0006f813aaf4ae948a2090619374fa58052409c28ef76225687df3cb2d1b0bfb43b09f47f1232f790e6d8dea759e57942099f4c4bd3390f28afc2098244961465c643fc8b29766af2bcbc5440b86e83608cfc937be98bb4827fd5e6b689adc2e26513db531076a6564396255a09975b7034dac06461b255642e3a7ed75fa9fc265011f5f6250382a84ac268d63ba64", "signed": "279cace6fdaf3945e3837df474b28646143747632bede93e7a66f5ca291d2c24978512ca0cb8827c8c322685bd605503a5ec94dbae61bbdcae1e49650602bc0716152c2e037b1c0d3219ced8e0674aee6b57834b55106c5344625322da638ecea2fc9a424a05ee9512d48fcf75dd8bd4691b3c10c28ec98ee1afa5b863d1c36795ed18105db3a9aabd9d2b4c1747adbaf1a56ffcc0c533c1c0faef331cdb79d961fa39f880a1b8b1164741822efb15a7259a465bef212855751fab66a897bfa211abe0ea2f2e1cd8a11d80e142cde1263eec267a3138ae1fcf4099db0ab53d64f336f4bcd7a363f6db112c0a2453051a0006f813aaf4ae948a2090619374fa58052409c28ef76225687df3cb2d1b0bfb43b09f47f1232f790e6d8dea759e57942099f4c4bd3390f28afc2098244961465c643fc8b29766af2bcbc5440b86e83608cfc937be98bb4827fd5e6b689adc2e26513db531076a6564396255a09975b7034dac06461b255642e3a7ed75fa9fc265011f5f6250382a84ac268d63ba64", "signature": "279cace6fdaf3945e3837df474b28646143747632bede93e7a66f5ca291d2c24978512ca0cb8827c8c322685bd605503a5ec94dbae61bbdcae1e49650602bc07" }, { "secret_key": "65de297b70cbe80980500af0561a24db50001000125f4490366d8300d3128592", "public_key": "ba8e2ad929bdcea538741042b57f2067d3153707a453770db9f3c4ca75504d24", "message": "131d8f4c2c94b153565b86592e770c987a443461b39aa2408b29e213ab057affc598b583739d6603a83fef0afc514721db0e76f9bd1b72b98c565cc8881af5747c0ba6f58c53dd2377da6c0d3aa805620cc4e75d52aabcba1f9b2849e08bd1b6b92e6f06615b814519606a02dc65a8609f5b29e9c2af5a894f7116ef28cfd1e7b76b64061732f7a5a3f8aa4c2e569e627a3f9749aa597be49d6b94436c352dd5fa7b83c92d2610faa32095ca302152d91a3c9776750e758ee8e9e402c6f5385eaa5df23850e54beb1be437a416c7115ed6aa6de13b55482532787e0bee34b83f3084406765635497c931b62a0518f1fbc2b891dc7262c7c6b67eda594fa530d74c9329bad5be94c287fbcde53aa80272b83322613d9368e5904076fdbcc88b2c0e59c10b02c448e00d1b3e7a9c9640feffb9523a8a60e1d83f04a4b8df69153b", "signed": "7a9b736b01cc92a3349f1a3c32dbd91959825394ff443c567405e899c8185ce8fad9500e1fce89d95a6253c00477435acf04bff993de1b00495def0834ee1f07131d8f4c2c94b153565b86592e770c987a443461b39aa2408b29e213ab057affc598b583739d6603a83fef0afc514721db0e76f9bd1b72b98c565cc8881af5747c0ba6f58c53dd2377da6c0d3aa805620cc4e75d52aabcba1f9b2849e08bd1b6b92e6f06615b814519606a02dc65a8609f5b29e9c2af5a894f7116ef28cfd1e7b76b64061732f7a5a3f8aa4c2e569e627a3f9749aa597be49d6b94436c352dd5fa7b83c92d2610faa32095ca302152d91a3c9776750e758ee8e9e402c6f5385eaa5df23850e54beb1be437a416c7115ed6aa6de13b55482532787e0bee34b83f3084406765635497c931b62a0518f1fbc2b891dc7262c7c6b67eda594fa530d74c9329bad5be94c287fbcde53aa80272b83322613d9368e5904076fdbcc88b2c0e59c10b02c448e00d1b3e7a9c9640feffb9523a8a60e1d83f04a4b8df69153b", "signature": "7a9b736b01cc92a3349f1a3c32dbd91959825394ff443c567405e899c8185ce8fad9500e1fce89d95a6253c00477435acf04bff993de1b00495def0834ee1f07" }, { "secret_key": "0826e7333324e7ec8c764292f6015d4670e9b8d7c4a89e8d909e8ef435d18d15", "public_key": "ffb2348ca8a018058be71d1512f376f91e8b0d552581254e107602217395e662", "message": "7f9e3e2f03c9df3d21b990f5a4af8295734afe783accc34fb1e9b8e95a0fd837af7e05c13cda0de8fadac9205265a0792b52563bdc2fee766348befcc56b88bbb95f154414fb186ec436aa62ea6fcabb11c017a9d2d15f67e595980e04c9313bc94fbc8c1134c2f40332bc7e311ac1ce11b505f8572ada7fbe196fba822d9a914492fa7185e9f3bea4687200a524c673a1cdf87eb3a140dcdb6a8875613488a2b00adf7175341c1c257635fa1a53a3e21d60c228399eea0991f112c60f653d7148e2c5ceb98f940831f070db1084d79156cc82c46bc9b8e884f3fa81be2da4cdda46bcaa24cc461f76ee647bb0f0f8c15ac5daa795b945e6f85bb310362e48d8095c782c61c52b481b4b002ad06ea74b8d306eff71abf21db710a8913cbe48332be0a0b3f31e0c7a6eba85ce33f357c7aeccd30bfb1a6574408b66fe404d31c3c5", "signed": "4bac7fabec8724d81ab09ae130874d70b5213492104372f601ae5abb10532799373c4dad215876441f474e2c006be37c3c8f5f6f017d0870414fd276a8f428087f9e3e2f03c9df3d21b990f5a4af8295734afe783accc34fb1e9b8e95a0fd837af7e05c13cda0de8fadac9205265a0792b52563bdc2fee766348befcc56b88bbb95f154414fb186ec436aa62ea6fcabb11c017a9d2d15f67e595980e04c9313bc94fbc8c1134c2f40332bc7e311ac1ce11b505f8572ada7fbe196fba822d9a914492fa7185e9f3bea4687200a524c673a1cdf87eb3a140dcdb6a8875613488a2b00adf7175341c1c257635fa1a53a3e21d60c228399eea0991f112c60f653d7148e2c5ceb98f940831f070db1084d79156cc82c46bc9b8e884f3fa81be2da4cdda46bcaa24cc461f76ee647bb0f0f8c15ac5daa795b945e6f85bb310362e48d8095c782c61c52b481b4b002ad06ea74b8d306eff71abf21db710a8913cbe48332be0a0b3f31e0c7a6eba85ce33f357c7aeccd30bfb1a6574408b66fe404d31c3c5", "signature": "4bac7fabec8724d81ab09ae130874d70b5213492104372f601ae5abb10532799373c4dad215876441f474e2c006be37c3c8f5f6f017d0870414fd276a8f42808" }, { "secret_key": "00ad6227977b5f38ccda994d928bba9086d2daeb013f8690db986648b90c1d45", "public_key": "91a4ea005752b92cbebf99a8a5cbecd240ae3f016c44ad141b2e57ddc773dc8e", "message": "cb5bc5b98b2efce43543e91df041e0dbb53ed8f67bf0f197c52b2211e7a45e2e1ec818c1a80e10abf6a43535f5b79d974d8ae28a2295c0a6521763b607d5103c6aef3b2786bd5afd7563695660684337bc3090739fb1cd53a9d644139b6d4caec75bda7f2521fbfe676ab45b98cb317aa7ca79fc54a3d7c578466a6aa64e434e923465a7f211aa0c61681bb8486e90206a25250d3fdae6fb03299721e99e2a914910d91760089b5d281e131e6c836bc2de08f7e02c48d323c647e9536c00ec1039201c0362618c7d47aa8e7b9715ffc439987ae1d31154a6198c5aa11c128f4082f556c99baf103ecadc3b2f3b2ec5b469623bc03a53caf3814b16300aedbda538d676d1f607102639db2a62c446707ce6469bd873a0468225be88b0aef5d4020459b94b32fe2b0133e92e7ba54dd2a5397ed85f966ab39ed0730cca8e7dacb8a336", "signed": "dc501db79fd782bc88cae792557d5d273f9ba560c7d90037fe84ac879d684f612a77452c4443e95c07b8be192c35769b17bbdfca42280de796d92119d833670dcb5bc5b98b2efce43543e91df041e0dbb53ed8f67bf0f197c52b2211e7a45e2e1ec818c1a80e10abf6a43535f5b79d974d8ae28a2295c0a6521763b607d5103c6aef3b2786bd5afd7563695660684337bc3090739fb1cd53a9d644139b6d4caec75bda7f2521fbfe676ab45b98cb317aa7ca79fc54a3d7c578466a6aa64e434e923465a7f211aa0c61681bb8486e90206a25250d3fdae6fb03299721e99e2a914910d91760089b5d281e131e6c836bc2de08f7e02c48d323c647e9536c00ec1039201c0362618c7d47aa8e7b9715ffc439987ae1d31154a6198c5aa11c128f4082f556c99baf103ecadc3b2f3b2ec5b469623bc03a53caf3814b16300aedbda538d676d1f607102639db2a62c446707ce6469bd873a0468225be88b0aef5d4020459b94b32fe2b0133e92e7ba54dd2a5397ed85f966ab39ed0730cca8e7dacb8a336", "signature": "dc501db79fd782bc88cae792557d5d273f9ba560c7d90037fe84ac879d684f612a77452c4443e95c07b8be192c35769b17bbdfca42280de796d92119d833670d" }, { "secret_key": "1521c6dbd6f724de73eaf7b56264f01035c04e01c1f3eb3cbe83efd26c439ada", "public_key": "2f61a26ffb68ba4f6e141529dc2617e8531c7151404808093b4fa7fedaea255d", "message": "3e3c7c490788e4b1d42f5cbcae3a9930bf617ebdff447f7be2ac2ba7cd5bcfc015760963e6fe5b956fb7cdb35bd5a17f5429ca664f437f08753a741c2bc8692b71a9115c582a25b2f74d329854d60b7817c079b3523aaff8793c2f72fff8cd10592c54e738df1d6452fb72da131c6731ea5c953c62ea177ac1f4735e5154477387109afae15f3ed6eeb08606e28c81d4386f03b9376924b6ef8d221ee29547f82a7ede48e1dc17723e3d42171eeaf96ac84bedc2a01dd86f4d085734fd69f91b5263e439083ff0318536adff4147308e3aafd1b58bb74f6fb0214a46fdcd3524f18df5a719ce57319e791b4ea606b499bfa57a60e707f94e18f1fed22f91bc79e6364a843f9cbf93825c465e9cae9072bc9d3ec4471f21ab2f7e99a633f587aac3db78ae9666a89a18008dd61d60218554411a65740ffd1ae3adc06595e3b7876407b6", "signed": "a817ed23ec398a128601c1832dc6af7643bf3a5f517bcc579450fdb4759028f4966164125f6ebd0d6bf86ff298a39c766d0c21fdb0cbfdf81cd0eb1f03cd8a083e3c7c490788e4b1d42f5cbcae3a9930bf617ebdff447f7be2ac2ba7cd5bcfc015760963e6fe5b956fb7cdb35bd5a17f5429ca664f437f08753a741c2bc8692b71a9115c582a25b2f74d329854d60b7817c079b3523aaff8793c2f72fff8cd10592c54e738df1d6452fb72da131c6731ea5c953c62ea177ac1f4735e5154477387109afae15f3ed6eeb08606e28c81d4386f03b9376924b6ef8d221ee29547f82a7ede48e1dc17723e3d42171eeaf96ac84bedc2a01dd86f4d085734fd69f91b5263e439083ff0318536adff4147308e3aafd1b58bb74f6fb0214a46fdcd3524f18df5a719ce57319e791b4ea606b499bfa57a60e707f94e18f1fed22f91bc79e6364a843f9cbf93825c465e9cae9072bc9d3ec4471f21ab2f7e99a633f587aac3db78ae9666a89a18008dd61d60218554411a65740ffd1ae3adc06595e3b7876407b6", "signature": "a817ed23ec398a128601c1832dc6af7643bf3a5f517bcc579450fdb4759028f4966164125f6ebd0d6bf86ff298a39c766d0c21fdb0cbfdf81cd0eb1f03cd8a08" }, { "secret_key": "17e5f0a8f34751babc5c723ecf339306992f39ea065ac140fcbc397d2dd32c4b", "public_key": "4f1e23cc0f2f69c88ef9162ab5f8c59fb3b8ab2096b77e782c63c07c8c4f2b60", "message": "c0fad790024019bd6fc08a7a92f5f2ac35cf6432e2eaa53d482f6e1204935336cb3ae65a63c24d0ec6539a10ee18760f2f520537774cdec6e96b55536011daa8f8bcb9cdaf6df5b34648448ac7d7cb7c6bd80d67fbf330f8765297766046a925ab52411d1604c3ed6a85173040125658a32cf4c854ef2813df2be6f3830e5eee5a6163a83ca8849f612991a31e9f88028e50bf8535e11755fad029d94cf25959f6695d09c1ba4315d40f7cf51b3f8166d02faba7511ecd8b1dded5f10cd6843455cff707ed225396c61d0820d20ada70d0c3619ff679422061c9f7c76e97d5a37af61fd62212d2dafc647ebbb979e61d9070ec03609a07f5fc57d119ae64b7a6ef92a5afae660a30ed48d702cc3128c633b4f19060a0578101729ee979f790f45bdbb5fe1a8a62f01a61a31d61af07030450fa0417323e9407bc76e73130e7c69d62e6a7", "signed": "efe2cb63fe7b4fc98946dc82fb6998e741ed9ce6b9c1a93bb45bc0a7d8396d7405282b43fe363ba5b23589f8e1fae130e157ce888cd72d053d0cc19d257a4300c0fad790024019bd6fc08a7a92f5f2ac35cf6432e2eaa53d482f6e1204935336cb3ae65a63c24d0ec6539a10ee18760f2f520537774cdec6e96b55536011daa8f8bcb9cdaf6df5b34648448ac7d7cb7c6bd80d67fbf330f8765297766046a925ab52411d1604c3ed6a85173040125658a32cf4c854ef2813df2be6f3830e5eee5a6163a83ca8849f612991a31e9f88028e50bf8535e11755fad029d94cf25959f6695d09c1ba4315d40f7cf51b3f8166d02faba7511ecd8b1dded5f10cd6843455cff707ed225396c61d0820d20ada70d0c3619ff679422061c9f7c76e97d5a37af61fd62212d2dafc647ebbb979e61d9070ec03609a07f5fc57d119ae64b7a6ef92a5afae660a30ed48d702cc3128c633b4f19060a0578101729ee979f790f45bdbb5fe1a8a62f01a61a31d61af07030450fa0417323e9407bc76e73130e7c69d62e6a7", "signature": "efe2cb63fe7b4fc98946dc82fb6998e741ed9ce6b9c1a93bb45bc0a7d8396d7405282b43fe363ba5b23589f8e1fae130e157ce888cd72d053d0cc19d257a4300" }, { "secret_key": "0cd7aa7d605e44d5ffb97966b2cb93c189e4c5a85db87fad7ab8d62463c59b59", "public_key": "4889855fe4116b4913927f47f2273bf559c3b394a983631a25ae597033185e46", "message": "28a55dda6cd0844b6577c9d6da073a4dc35cbc98ac158ab54cf88fd20cc87e83c4bba2d74d82ce0f4854ec4db513de400465aaa5eee790bc84f16337072d3a91cde40d6e0df1ba0cc0645f5d5cbbb642381d7b9e211d25267a8acf77d1edb69c3a630f5b133d24f046a81bf22ff03b31d8447e12c3f7b77114a70cbd20bbd08b0b3827a6bbcf90409e344447a7fbc59bdd97d729071f8d71dcc33e6ef2cbab1d411edf13734db1dd9703276f5eb2d6aa2cb8952dd6712bfae809ce08c3aa502b8135713fac0a9c25b1d45b6a5831e02421bba65b81a596efa24b0576bd1dc7fdfb49be762875e81bd540722bc06140b9aa2ef7b84a801e41ded68d4546ac4873d9e7ced649b64fadaf0b5c4b6eb8d036315233f4326ca01e03393050cd027c24f67303fb846bd2c6b3dba06bed0d59a36289d24bd648f7db0b3a81346612593e3ddd18c557", "signed": "bf9115fd3d02706e398d4bf3b02a82674ff3041508fd39d29f867e501634b9261f516a794f98738d7c7013a3f2f858ffdd08047fb6bf3dddfb4b4f4cbeef300328a55dda6cd0844b6577c9d6da073a4dc35cbc98ac158ab54cf88fd20cc87e83c4bba2d74d82ce0f4854ec4db513de400465aaa5eee790bc84f16337072d3a91cde40d6e0df1ba0cc0645f5d5cbbb642381d7b9e211d25267a8acf77d1edb69c3a630f5b133d24f046a81bf22ff03b31d8447e12c3f7b77114a70cbd20bbd08b0b3827a6bbcf90409e344447a7fbc59bdd97d729071f8d71dcc33e6ef2cbab1d411edf13734db1dd9703276f5eb2d6aa2cb8952dd6712bfae809ce08c3aa502b8135713fac0a9c25b1d45b6a5831e02421bba65b81a596efa24b0576bd1dc7fdfb49be762875e81bd540722bc06140b9aa2ef7b84a801e41ded68d4546ac4873d9e7ced649b64fadaf0b5c4b6eb8d036315233f4326ca01e03393050cd027c24f67303fb846bd2c6b3dba06bed0d59a36289d24bd648f7db0b3a81346612593e3ddd18c557", "signature": "bf9115fd3d02706e398d4bf3b02a82674ff3041508fd39d29f867e501634b9261f516a794f98738d7c7013a3f2f858ffdd08047fb6bf3dddfb4b4f4cbeef3003" }, { "secret_key": "33371d9e892f9875052ac8e325ba505e7477c1ace24ba7822643d43d0acef3de", "public_key": "35929bded27c249c87d8b8d82f59260a575327b546c3a167c69f5992d5b8e006", "message": "27a32efba28204be59b7ff5fe488ca158a91d5986091ecc4458b49e090dd37cbfede7c0f46186fabcbdff78d2844155808efffd873ed9c9261526e04e4f7050b8d7bd267a0fe3d5a449378d54a4febbd2f26824338e2aaaf35a32ff0f62504bda5c2e44abc63159f336cf25e6bb40ddb7d8825dff18fd51fc01951eaedcd33707007e1203ca58b4f7d242f8166a907e099932c001bfb1ec9a61e0ef2da4e8446af208201315d69681710d425d2400c387d7b9df321a4aec602b9c656c3e2310bff8756d18b802134b15604f4edc111149a9879e31241dd34f702f4c349617b13529769a772f5e52a89c098e0dca5920667893a250061b17991626eb9319298685be46b6a8b68422444fa5a36bcf3a687e2eccb9322c87dc80165da898930850b98fc863cada1aa99c6d61c451b9ccf4874c7f0e75b0a0c602f044812c71765adaf02025395b0", "signed": "985ca446ddc007827cc8f2852cbd8115ef8c5975e9d7ce96d74dfed859aa14a4c15254006bea5e08359efe2625d715e0897ee5a16f151203be5010418637de0527a32efba28204be59b7ff5fe488ca158a91d5986091ecc4458b49e090dd37cbfede7c0f46186fabcbdff78d2844155808efffd873ed9c9261526e04e4f7050b8d7bd267a0fe3d5a449378d54a4febbd2f26824338e2aaaf35a32ff0f62504bda5c2e44abc63159f336cf25e6bb40ddb7d8825dff18fd51fc01951eaedcd33707007e1203ca58b4f7d242f8166a907e099932c001bfb1ec9a61e0ef2da4e8446af208201315d69681710d425d2400c387d7b9df321a4aec602b9c656c3e2310bff8756d18b802134b15604f4edc111149a9879e31241dd34f702f4c349617b13529769a772f5e52a89c098e0dca5920667893a250061b17991626eb9319298685be46b6a8b68422444fa5a36bcf3a687e2eccb9322c87dc80165da898930850b98fc863cada1aa99c6d61c451b9ccf4874c7f0e75b0a0c602f044812c71765adaf02025395b0", "signature": "985ca446ddc007827cc8f2852cbd8115ef8c5975e9d7ce96d74dfed859aa14a4c15254006bea5e08359efe2625d715e0897ee5a16f151203be5010418637de05" }, { "secret_key": "beedb8073df58f8c1bffbdbd77ec7decb2c82a9babecefc0331507bdc2c2a7e7", "public_key": "b27e908b805e296fc30d2e474b060cd50c0f6f520b3671712183bd89d4e733e9", "message": "35ca57f0f915e5209d54ea4b871ffb585354df1b4a4a1796fbe4d6227d3e1aba5171ed0391a79e83e24d82fdafd15c17b28bf6c94d618c74d65264e58faaacd2902872fdd0efa22e8d2d7ce8e3b8197f0c3615b0a385235fa9fd8e4564ee6e6b1650b4cfb94d872c805c32d4f3a18f966461d3adbb605fa525884f8eb197627396ba4d995d78ac02948a0eaabb58519b9a8e2e7985cd1de2c71d8918d96a0168660ce17cddf364e3ec0d4bd90f2104751a1927ee1d23f3e7a69840ed040b00e5f6e4866ec58813149cc382aebf6162608c79574d553f47230e924a0ef1ebf55d8e1a52abb62a2d7ac86027c7c03cc83fa1949da29e2f3037ab986fd2fffe650e3149babae5a50b1ee9696f3babec72e29697c82422814d272085500fd837fe3c7a973ef4c169af12dd7f02700620bb045bdbf84623f326350570b3cadbc9aea4200b28287e17ab", "signed": "8c890cccadc7760e1e82e43c44b3dc0b685a48b479ae13cc0a6b0557d0fb1cbabba63d2a96843412ea8d36c50acbf52b92cfb2dce49dc48af6ddcf8ee47a860835ca57f0f915e5209d54ea4b871ffb585354df1b4a4a1796fbe4d6227d3e1aba5171ed0391a79e83e24d82fdafd15c17b28bf6c94d618c74d65264e58faaacd2902872fdd0efa22e8d2d7ce8e3b8197f0c3615b0a385235fa9fd8e4564ee6e6b1650b4cfb94d872c805c32d4f3a18f966461d3adbb605fa525884f8eb197627396ba4d995d78ac02948a0eaabb58519b9a8e2e7985cd1de2c71d8918d96a0168660ce17cddf364e3ec0d4bd90f2104751a1927ee1d23f3e7a69840ed040b00e5f6e4866ec58813149cc382aebf6162608c79574d553f47230e924a0ef1ebf55d8e1a52abb62a2d7ac86027c7c03cc83fa1949da29e2f3037ab986fd2fffe650e3149babae5a50b1ee9696f3babec72e29697c82422814d272085500fd837fe3c7a973ef4c169af12dd7f02700620bb045bdbf84623f326350570b3cadbc9aea4200b28287e17ab", "signature": "8c890cccadc7760e1e82e43c44b3dc0b685a48b479ae13cc0a6b0557d0fb1cbabba63d2a96843412ea8d36c50acbf52b92cfb2dce49dc48af6ddcf8ee47a8608" }, { "secret_key": "9184ef618816832592bc8eb35f4ffd4ff98dfbf7776c90f2aad212ce7e03351e", "public_key": "687b7726010d9bde2c90e573cd2a2a702ff28c4a2af70afc7315c94d575601e5", "message": "729eb7e54a9d00c58617af18c345b8dc6e5b4e0f57de2f3c02e54a2ec8f1425ec2e240775b5ab0c10f84ac8bafda4584f7e21c655faecd8030a98906bd68398f26b5d58d92b6cf045e9bd9743c74c9a342ec61ce57f37b981eac4d8bf034608866e985bb68686a68b4a2af88b992a2a6d2dc8ce88bfb0a36cf28bbab7024abfa2bea53313b66c906f4f7cf66970f540095bd0104aa4924dd82e15413c22679f847e48cd0c7ec1f677e005fec0177fbd5c559fc39add613991fbaeae4d24d39d309ef74647f8192cc4c62d0642028c76a1b951f6bc9639deb91ecc08be6043f2109705a42c7eae712649d91d96ccbbfb63d8d0dd6dd112160f61361ecdc6793929ca9aef9ab56944a6fa4a7df1e279eaf58ce8323a9cf62c94279fff7440fbc936baa61489c999330badcb9fc0e184bc5093f330cbb242f71fb378738fea10511dd438364d7f76bcc", "signed": "b3c24e75132c563475422d5ea412b5c1e8e6e5ea1c08ead1393c412da134c9a1638284ea7e2ca032fe3d3e32a9066a8c8839903f6ef46e966bb5e492d8c2aa00729eb7e54a9d00c58617af18c345b8dc6e5b4e0f57de2f3c02e54a2ec8f1425ec2e240775b5ab0c10f84ac8bafda4584f7e21c655faecd8030a98906bd68398f26b5d58d92b6cf045e9bd9743c74c9a342ec61ce57f37b981eac4d8bf034608866e985bb68686a68b4a2af88b992a2a6d2dc8ce88bfb0a36cf28bbab7024abfa2bea53313b66c906f4f7cf66970f540095bd0104aa4924dd82e15413c22679f847e48cd0c7ec1f677e005fec0177fbd5c559fc39add613991fbaeae4d24d39d309ef74647f8192cc4c62d0642028c76a1b951f6bc9639deb91ecc08be6043f2109705a42c7eae712649d91d96ccbbfb63d8d0dd6dd112160f61361ecdc6793929ca9aef9ab56944a6fa4a7df1e279eaf58ce8323a9cf62c94279fff7440fbc936baa61489c999330badcb9fc0e184bc5093f330cbb242f71fb378738fea10511dd438364d7f76bcc", "signature": "b3c24e75132c563475422d5ea412b5c1e8e6e5ea1c08ead1393c412da134c9a1638284ea7e2ca032fe3d3e32a9066a8c8839903f6ef46e966bb5e492d8c2aa00" }, { "secret_key": "354e13152ee1fe748a1252204c6527bdc1b1eb2eb53678150e6359924708d812", "public_key": "d45ff6c5fb83e7bb9669aa8960deb7dbc665c988439b6c9ef672c6811dc8bcf6", "message": "8e5fccf66b1ba6169cb685733d9d0e0190361c90bcab95c163285a97fe356d2bdcde3c9380268805a384d063da09ccd9969cc3ff7431e60a8e9f869cd62faa0e356151b280bc526e577c2c538c9a724dc48bf88b70321d7e1eeedb3c4af706748c942e67bdabdb41bec2977b1523069e31e29b76300288f88a51b384b80cc2526f1679340ddec3881f5cd28b0378d9cd0a812b68dd3f68f7a23e1b54bee7466ac765cf38df04d67441dfa498c4bffc52045fa6d2dbcdbfa33dfaa77644ffccef0decdb6790c70a0d734ec287cc338cb5a909c0055189301169c4f7702c05c0911a27b16ef9ed934fa6a0ca7b13e413523422535647968030edc40cd73e7d6b345b7581f438316d68e3cd292b846d3f4f7c4862bc7e6b3fb89a27f6f60cd7db2e34ec9aae1013fe37acff8ad888cb9a593ef5e621eae5186c58b31dcfde22870e336d33f440f6b8d49a", "signed": "de2b46e65f3decef34332e500f2e11306fbdcf1be85a1c1ee68ba3045dcec2c7be608d22927da1f44c0e2083ae622cf3c29d893887994efcfa2ca594f5051f038e5fccf66b1ba6169cb685733d9d0e0190361c90bcab95c163285a97fe356d2bdcde3c9380268805a384d063da09ccd9969cc3ff7431e60a8e9f869cd62faa0e356151b280bc526e577c2c538c9a724dc48bf88b70321d7e1eeedb3c4af706748c942e67bdabdb41bec2977b1523069e31e29b76300288f88a51b384b80cc2526f1679340ddec3881f5cd28b0378d9cd0a812b68dd3f68f7a23e1b54bee7466ac765cf38df04d67441dfa498c4bffc52045fa6d2dbcdbfa33dfaa77644ffccef0decdb6790c70a0d734ec287cc338cb5a909c0055189301169c4f7702c05c0911a27b16ef9ed934fa6a0ca7b13e413523422535647968030edc40cd73e7d6b345b7581f438316d68e3cd292b846d3f4f7c4862bc7e6b3fb89a27f6f60cd7db2e34ec9aae1013fe37acff8ad888cb9a593ef5e621eae5186c58b31dcfde22870e336d33f440f6b8d49a", "signature": "de2b46e65f3decef34332e500f2e11306fbdcf1be85a1c1ee68ba3045dcec2c7be608d22927da1f44c0e2083ae622cf3c29d893887994efcfa2ca594f5051f03" }, { "secret_key": "7ff62d4b3c4d99d342d4bb401d726b21e99f4ef592149fc311b68761f5567ff6", "public_key": "7fdfdb9eca29d3f01d9486d7e112ce03aa37b91326a4283b9c03999c5eda099a", "message": "99c44c796572a4823fc6c3807730839173774c05dbfc1492ed0d00509a95a1de37274b3135ed0456a1718e576597dc13f2a2ab37a45c06cbb4a2d22afad4d5f3d90ab3d8da4dcdaa06d44f2219088401c5dceee26055c4782f78d7d63a380608e1bef89eeef338c2f0897da106fafce2fb2ebc5db669c7c172c9cfe77d3109d239fe5d005c8ee751511b5a88317c729b0d8b70b52f6bd3cda2fe865c77f36e4f1b635f336e036bd718bec90ee78a802811510c4058c1ba364017253aa842922e1dd7d7a0f0fc9c69e43fc4eaeffaaf1ae5fa5d2d73b43079617baba030923fe5b13d2c1c4fe6fac3f2db74e2020a734b6121a0302fce820ba0580ce6135348fdf0632e0008df03ee112168f5cfa0037a26a1f69b1f1317edf2a3ab367455a77e00691215d7aa3133c2159d3da2b134cf04f0defbf07a6064011e64dd14d4f8f064356655428804c2771a", "signed": "058f79927fbf6178724815c7b11c63baaa90bcc15d7272be082f8a9141861c816433055f6cf6491424853f9ec78bb91ace913a93411b4e5ed58bc4ba5715c60a99c44c796572a4823fc6c3807730839173774c05dbfc1492ed0d00509a95a1de37274b3135ed0456a1718e576597dc13f2a2ab37a45c06cbb4a2d22afad4d5f3d90ab3d8da4dcdaa06d44f2219088401c5dceee26055c4782f78d7d63a380608e1bef89eeef338c2f0897da106fafce2fb2ebc5db669c7c172c9cfe77d3109d239fe5d005c8ee751511b5a88317c729b0d8b70b52f6bd3cda2fe865c77f36e4f1b635f336e036bd718bec90ee78a802811510c4058c1ba364017253aa842922e1dd7d7a0f0fc9c69e43fc4eaeffaaf1ae5fa5d2d73b43079617baba030923fe5b13d2c1c4fe6fac3f2db74e2020a734b6121a0302fce820ba0580ce6135348fdf0632e0008df03ee112168f5cfa0037a26a1f69b1f1317edf2a3ab367455a77e00691215d7aa3133c2159d3da2b134cf04f0defbf07a6064011e64dd14d4f8f064356655428804c2771a", "signature": "058f79927fbf6178724815c7b11c63baaa90bcc15d7272be082f8a9141861c816433055f6cf6491424853f9ec78bb91ace913a93411b4e5ed58bc4ba5715c60a" }, { "secret_key": "6cabadd03f8a2e6ebab96a74f80e18164e4d1b6baa678f5a82e25604af989aaf", "public_key": "2a4a3179564194e00100c18bc35351d8b135bbae5b32b28fce1d7b6766ca4b32", "message": "279f78cf3b9ccfc6e1b01e1a82f50ed172e9a8e1e702bb15661dd7dc3a456ff7a7a7fdfb081db3867079630c7f70fd753292ec60ecbf50632e9aa45b996505c66e6dc3c6ae892e21b6a8705e4bbae8f16a3378554b31fdb0139dcd15c96a8a7e4b88756a86d18db5dc74fd7691197dd88e2c7d5df52b049344cdc477c9cd7e89eda99ccfb1d00814d0152b9654df3279372ca5f18b1c946f2894a76b079ddb1c3cd61fbb969aeec9193a6b88fb7d136c07f9821e5c1074b4e93bcaf6fa14d0d1d7e1707589d77ec1337206e53a1f06cc26672ff95c13d5ff444766931ba30a0afdcdadd2098e9c41fd87a3f23cd16dbb0efbf8092ce33e327f42610990e1cee6cb8e54951aa081e69765ae4009aeed758e768de50c23d9a22b4a06dc4d19fc8cbd0cdef4c983461755d0a3b5d6a9c12253e09568339ff7e5f78c5fdf7ec89f9186a621a8c0eed11b67022e", "signed": "4e65c6c1d493045e8a9250e397c1d1d30ffed24db66a8961aa458f8f0fcb760c39fe8657d7ab8f84000b96d519717cff71f926522c1efec7f8b2624eae55f60c279f78cf3b9ccfc6e1b01e1a82f50ed172e9a8e1e702bb15661dd7dc3a456ff7a7a7fdfb081db3867079630c7f70fd753292ec60ecbf50632e9aa45b996505c66e6dc3c6ae892e21b6a8705e4bbae8f16a3378554b31fdb0139dcd15c96a8a7e4b88756a86d18db5dc74fd7691197dd88e2c7d5df52b049344cdc477c9cd7e89eda99ccfb1d00814d0152b9654df3279372ca5f18b1c946f2894a76b079ddb1c3cd61fbb969aeec9193a6b88fb7d136c07f9821e5c1074b4e93bcaf6fa14d0d1d7e1707589d77ec1337206e53a1f06cc26672ff95c13d5ff444766931ba30a0afdcdadd2098e9c41fd87a3f23cd16dbb0efbf8092ce33e327f42610990e1cee6cb8e54951aa081e69765ae4009aeed758e768de50c23d9a22b4a06dc4d19fc8cbd0cdef4c983461755d0a3b5d6a9c12253e09568339ff7e5f78c5fdf7ec89f9186a621a8c0eed11b67022e", "signature": "4e65c6c1d493045e8a9250e397c1d1d30ffed24db66a8961aa458f8f0fcb760c39fe8657d7ab8f84000b96d519717cff71f926522c1efec7f8b2624eae55f60c" }, { "secret_key": "0fa0c32c3ae34be51b92f91945405981a8e202488558a8e220c288c7d6a5532d", "public_key": "d6aee62bd91fc9453635ffcc02b2f38dcab13285140380580ccdff0865df0492", "message": "53f44be0e5997ff07264cb64ba1359e2801def8755e64a2362bddaf597e672d021d34fface6d97e0f2b1f6ae625fd33d3c4f6e9ff7d0c73f1da8defb23f324975e921bb2473258177a16612567edf7d5760f3f3e3a6d26aaabc5fde4e2043f73fa70f128020933b1ba3b6bd69498e9503ea670f1ed880d3651f2e4c59e79cabc86e9b703394294112d5d8e213c317423b525a6df70106a9d658a262028b5f45100cb77d1150d8fe461eed434f241015f3276ad7b09a291b4a7f35e3c30051cbf13b1d4a7fa0c81a50f939e7c49673afdc87883c9e3e61f5a1df03755470fda74bf23ea88676b258a97a280d5f90b52b714b596035bae08c8d0fe6d94f8949559b1f27d7116cf59dd3cfbf18202a09c13f5c4fbc8d97225492887d32870c2297e34debd9876d6d01ac27a16b088b079079f2b20feb02537cda314c43cb2dca371b9df37ed11ec97e1a7a6993a", "signed": "7e9ab85ee94fe4b35dcb545329a0ef25923de5c9dc23e7df1a7e77ab0dcfb89e03f4e785ca6429cb2b0df50da6230f733f00f33a45c4e576cd40bdb84f1ae00153f44be0e5997ff07264cb64ba1359e2801def8755e64a2362bddaf597e672d021d34fface6d97e0f2b1f6ae625fd33d3c4f6e9ff7d0c73f1da8defb23f324975e921bb2473258177a16612567edf7d5760f3f3e3a6d26aaabc5fde4e2043f73fa70f128020933b1ba3b6bd69498e9503ea670f1ed880d3651f2e4c59e79cabc86e9b703394294112d5d8e213c317423b525a6df70106a9d658a262028b5f45100cb77d1150d8fe461eed434f241015f3276ad7b09a291b4a7f35e3c30051cbf13b1d4a7fa0c81a50f939e7c49673afdc87883c9e3e61f5a1df03755470fda74bf23ea88676b258a97a280d5f90b52b714b596035bae08c8d0fe6d94f8949559b1f27d7116cf59dd3cfbf18202a09c13f5c4fbc8d97225492887d32870c2297e34debd9876d6d01ac27a16b088b079079f2b20feb02537cda314c43cb2dca371b9df37ed11ec97e1a7a6993a", "signature": "7e9ab85ee94fe4b35dcb545329a0ef25923de5c9dc23e7df1a7e77ab0dcfb89e03f4e785ca6429cb2b0df50da6230f733f00f33a45c4e576cd40bdb84f1ae001" }, { "secret_key": "7b06f88026fa86f39fce2426f67cc5996bedd0cfc4b5ebb1b5e3edbb47e080aa", "public_key": "3f1469ee6a2e7867e2e9012d402cf5a4861497c01df879a1deb1c539830b58de", "message": "71175d4e21721297d9176d817f4e785d9600d923f987fe0b26fd79d33a5ea5d1e818b71f0f92b8c73afddabdcc27f6d16e26aafa874cfd77a00e06c36b041487582bb933760f88b419127345776ea418f83522254fed33819bc5c95f8f8404cc144ebf1486c88515409d3433aaf519d9920f5256e629419e9a95580a35b069b8d25533dfcbc98ad36404a951808e01378c03266326d120046975fde07daef3266caacd821c1403499d7fdf17c033c8d8c3f28f162b5f09dfdaca06285f00c6cb986dfdf5151aa6639608b5b13e78d65a4368585b16138754fbd113835a686cd066c2b89bb0953c24d50e77bf0fc457c1e0fcf5d44da8db9a88f062be3b688d5cdcff1d1c00e81ec9d413882295b341fee8fa427dc109adeb5f284eec202f1bef115bf96b1782d3ccdeb682b69bf92d170c007d5df80e1ed962f677dc24a145a1e4e829e8dec0104e5f78365944", "signed": "42f133e34e3eb7032a133ed781537ec62e44a5ce8381e5e0bf9e13a914a4b2c757811d6d3b1e86672424ea4230d10f7c610abb7069e61e319b4066a2bd7bc90071175d4e21721297d9176d817f4e785d9600d923f987fe0b26fd79d33a5ea5d1e818b71f0f92b8c73afddabdcc27f6d16e26aafa874cfd77a00e06c36b041487582bb933760f88b419127345776ea418f83522254fed33819bc5c95f8f8404cc144ebf1486c88515409d3433aaf519d9920f5256e629419e9a95580a35b069b8d25533dfcbc98ad36404a951808e01378c03266326d120046975fde07daef3266caacd821c1403499d7fdf17c033c8d8c3f28f162b5f09dfdaca06285f00c6cb986dfdf5151aa6639608b5b13e78d65a4368585b16138754fbd113835a686cd066c2b89bb0953c24d50e77bf0fc457c1e0fcf5d44da8db9a88f062be3b688d5cdcff1d1c00e81ec9d413882295b341fee8fa427dc109adeb5f284eec202f1bef115bf96b1782d3ccdeb682b69bf92d170c007d5df80e1ed962f677dc24a145a1e4e829e8dec0104e5f78365944", "signature": "42f133e34e3eb7032a133ed781537ec62e44a5ce8381e5e0bf9e13a914a4b2c757811d6d3b1e86672424ea4230d10f7c610abb7069e61e319b4066a2bd7bc900" }, { "secret_key": "c3f5e149968a24f4de9119531975f443015ccca305d7119ed4749e8bf6d94fc7", "public_key": "39aaccdb948a4038538a4588322f806bb129b5876c4bec51271afe4f49690045", "message": "c46370e37f2e0cadcf93402f1f0cb048f52881ba750b7a43f56ab11ce348732fb57e7f9aaf8dfcbe455e14e983c248d026a27e7f148d5db5a53f94635702b895127771047a876d14107386c5e0ff8933345bbd7a936d990d33efa28c2ec4e4864ffd2ff576f7c88f954cfc1c459e883bb712dae3cdf6632066f1f4d13a509615b3360cadc5a307f23e52a51b40a6feebe0b18d0e9ee4e348f33cd81a8def222f6a59b12861d335bd9af85cc004be46f1d3a424f4870ae9dc587e5a4ade136b9370649348c33ac3bf1febeebffea37085ed59cac9d9e696470b234609e9a10a9d431ff91e69cb5135fd117ff58a36539744ebe70cea6973c00c7a4d57b62f4a7136d731b8e46ff18ec0ed69070031905075d8541d568cfce6eeb76242b7819a7b6a93552111bb88f165527cfa6966d39fcbe0a7dea008e39c7a3e577ab307cd1d0ea326833d52654e172955f3fcd4", "signed": "5fa2b531677b00b85b0a313cbd479f55f4ab3ec5cfce5e454d2b74176ccc3399c899f9d6b51ed4c1e76185ac9fe730c4b4014044f7041185bc3c85722eb2ea02c46370e37f2e0cadcf93402f1f0cb048f52881ba750b7a43f56ab11ce348732fb57e7f9aaf8dfcbe455e14e983c248d026a27e7f148d5db5a53f94635702b895127771047a876d14107386c5e0ff8933345bbd7a936d990d33efa28c2ec4e4864ffd2ff576f7c88f954cfc1c459e883bb712dae3cdf6632066f1f4d13a509615b3360cadc5a307f23e52a51b40a6feebe0b18d0e9ee4e348f33cd81a8def222f6a59b12861d335bd9af85cc004be46f1d3a424f4870ae9dc587e5a4ade136b9370649348c33ac3bf1febeebffea37085ed59cac9d9e696470b234609e9a10a9d431ff91e69cb5135fd117ff58a36539744ebe70cea6973c00c7a4d57b62f4a7136d731b8e46ff18ec0ed69070031905075d8541d568cfce6eeb76242b7819a7b6a93552111bb88f165527cfa6966d39fcbe0a7dea008e39c7a3e577ab307cd1d0ea326833d52654e172955f3fcd4", "signature": "5fa2b531677b00b85b0a313cbd479f55f4ab3ec5cfce5e454d2b74176ccc3399c899f9d6b51ed4c1e76185ac9fe730c4b4014044f7041185bc3c85722eb2ea02" }, { "secret_key": "42305c9302f45ea6f87e26e2208fd94b3c4ad037b1b6c83cf6677aa1096a013c", "public_key": "3b97b1f11ce45ba46ffbb25b76bfc5ad7b77f90cc69ed76115dea4029469d587", "message": "d110828d449198d675e74e8e39439fd15e75bf2cc1f430abfb245836885bafc420f754b89d2fbbf6dd3490792e7a4f766073cfe3b302d089831ace869e2730fde45c2121ec3ef217aa9c43fa7cc7e9ed0a01ad9f1d2fc3613638ca9fc193c98b37455bf5dbf8f38b64708dfdca6c21f0975f1017c5da5f6434bda9f033cec2a631ab50318e017b170b240bf01eb8b36c7e1cb59e7736ac34444208132a8f59e4f313d65d849c6a4fdf13e20ecaee3823e589a171b39b2489497b06e6ff58c2c9f1dc5d3aa3bd10e6443e22d42d07b783f79fd43a46e1cde314b663a95f7246dea131fcd46d1dc333c5454f86b2c4e2e424dea405cc2230d4dcd39a2eab2f92845cf6a7994192063f1202749ef52dcb96f2b79ed6a98118ca0b99ba2285490860eb4c61ab78b9ddc6acc7ad883fa5e96f9d029171223abf7573e36230e0a81f6c1311151473ee264f4b842e923dcb3b", "signed": "18d05e5d01668e83f40fa3bbee28b388acf318d1b0b5ad668c672f345c8eda14c2f884cd2a9039459ce0810bc5b580fe70d3964a43edb49e73a6ff914bbf040cd110828d449198d675e74e8e39439fd15e75bf2cc1f430abfb245836885bafc420f754b89d2fbbf6dd3490792e7a4f766073cfe3b302d089831ace869e2730fde45c2121ec3ef217aa9c43fa7cc7e9ed0a01ad9f1d2fc3613638ca9fc193c98b37455bf5dbf8f38b64708dfdca6c21f0975f1017c5da5f6434bda9f033cec2a631ab50318e017b170b240bf01eb8b36c7e1cb59e7736ac34444208132a8f59e4f313d65d849c6a4fdf13e20ecaee3823e589a171b39b2489497b06e6ff58c2c9f1dc5d3aa3bd10e6443e22d42d07b783f79fd43a46e1cde314b663a95f7246dea131fcd46d1dc333c5454f86b2c4e2e424dea405cc2230d4dcd39a2eab2f92845cf6a7994192063f1202749ef52dcb96f2b79ed6a98118ca0b99ba2285490860eb4c61ab78b9ddc6acc7ad883fa5e96f9d029171223abf7573e36230e0a81f6c1311151473ee264f4b842e923dcb3b", "signature": "18d05e5d01668e83f40fa3bbee28b388acf318d1b0b5ad668c672f345c8eda14c2f884cd2a9039459ce0810bc5b580fe70d3964a43edb49e73a6ff914bbf040c" }, { "secret_key": "c57a43dcd7bab8516009546918d71ad459b7345efdca8d4f19929875c839d722", "public_key": "2083b444236b9ab31d4e00c89d55c6260fee71ac1a47c4b5ba227404d382b82d", "message": "a4f6d9c281cf81a28a0b9e77499aa24bde96cc1264374491c008294ee0af6f6e4bbb686396f59068d358e30fe9992db0c6f16680a1c71e27a4a907ac607d39bdc3258c7956482fb37996f4beb3e5051b8148019a1c256e2ee999ebc8ce64c54e07fedb4fbd8953ebd93b7d69ce5a0082edd6209d12d3619b4fd2eae916461f72a4ce727157251a19209bbff9fbdbd289436f3fcacc6b4e1318521a47839cba4b14f7d7a21e7b5d6b6a753d5804afcd2b1eb7779b92abab8afa8aa4fa51caec0b85dcd0fc2a0676036d3f56630a831ffeb502861dd89161c708a9c006c73c930ce5b94756426ff18aa112fb4eb9a68500b48d4eedbd4167b6ffd0a11d49443a173ce9d949436748fc0634f06bb08b8f3423f4463dba7b4d199b64df578117f0a2645f0b2a1e2ada27d286f76733f25b82ed1d48a5c3898d4ad621e50ed9060daad40a39532e4d1bf162ce36804d5d4e2d", "signed": "1edef9bc036971f1fa88edf45393c802e6c1a1631c8a06871a09a320821dce40beca97e53a0361a955a4c6d60b8ca8e400c81340911ccb4f56284041cdbb1804a4f6d9c281cf81a28a0b9e77499aa24bde96cc1264374491c008294ee0af6f6e4bbb686396f59068d358e30fe9992db0c6f16680a1c71e27a4a907ac607d39bdc3258c7956482fb37996f4beb3e5051b8148019a1c256e2ee999ebc8ce64c54e07fedb4fbd8953ebd93b7d69ce5a0082edd6209d12d3619b4fd2eae916461f72a4ce727157251a19209bbff9fbdbd289436f3fcacc6b4e1318521a47839cba4b14f7d7a21e7b5d6b6a753d5804afcd2b1eb7779b92abab8afa8aa4fa51caec0b85dcd0fc2a0676036d3f56630a831ffeb502861dd89161c708a9c006c73c930ce5b94756426ff18aa112fb4eb9a68500b48d4eedbd4167b6ffd0a11d49443a173ce9d949436748fc0634f06bb08b8f3423f4463dba7b4d199b64df578117f0a2645f0b2a1e2ada27d286f76733f25b82ed1d48a5c3898d4ad621e50ed9060daad40a39532e4d1bf162ce36804d5d4e2d", "signature": "1edef9bc036971f1fa88edf45393c802e6c1a1631c8a06871a09a320821dce40beca97e53a0361a955a4c6d60b8ca8e400c81340911ccb4f56284041cdbb1804" }, { "secret_key": "2dddb6b8fd04fa90ece1a709f8418f2e5d0c9c43afe7cfce19e6ad15a73476f7", "public_key": "8059de6a7c4776489ecc2e7d707ffce30285bf30a23f78d72db49cfd6ed0d492", "message": "474baa590a4cd72d5424e51d8257b3d44325bc4c5063a0033c86ebbe99ed7212184c19944d082a115379dd4cece973faa0bca6485bd25f3744a719e70aa0291e1b5a96e637c140616a98263357c76b6eb0083fe51414e386870d0fdc7dd9abe4ff6fb5bbf1e7b15dac3e08e2615f655c3104ceb32a4cc2c9e9c43cf282d346ac253ccc46b635ae040973b49735720ffb890469a567c5824e0c00d7ccd5509a718092a906461c4d6163eaf422418f5fc6e009fc3f529ac61a2f89bb8e0ed45d940c4c2331ff8d8e1d6d58d417d8fc2656a02e8701aee75aed918724eebe4a2cf4744c5c401e217023df68a6f6a0228bd05a679a697d8de7036b9ed269090d3c65486afb91e27954eb15b964665ede7ad008f12fb3a9d0e69c13b4254f43819e0818a4195f68b8a38ae81f3fcb1879c95ab4cd0ffc38e381089260cca967ace5a085b457ab5eb363852101377570f9ac9e38", "signed": "c634ea7bf72e895a2e796e2834201415b8b45e05e045559284eb9052c0e84f62a5a9f0c9764f7576788c7228b19ef517c195497325a48a9344b147c12fd75509474baa590a4cd72d5424e51d8257b3d44325bc4c5063a0033c86ebbe99ed7212184c19944d082a115379dd4cece973faa0bca6485bd25f3744a719e70aa0291e1b5a96e637c140616a98263357c76b6eb0083fe51414e386870d0fdc7dd9abe4ff6fb5bbf1e7b15dac3e08e2615f655c3104ceb32a4cc2c9e9c43cf282d346ac253ccc46b635ae040973b49735720ffb890469a567c5824e0c00d7ccd5509a718092a906461c4d6163eaf422418f5fc6e009fc3f529ac61a2f89bb8e0ed45d940c4c2331ff8d8e1d6d58d417d8fc2656a02e8701aee75aed918724eebe4a2cf4744c5c401e217023df68a6f6a0228bd05a679a697d8de7036b9ed269090d3c65486afb91e27954eb15b964665ede7ad008f12fb3a9d0e69c13b4254f43819e0818a4195f68b8a38ae81f3fcb1879c95ab4cd0ffc38e381089260cca967ace5a085b457ab5eb363852101377570f9ac9e38", "signature": "c634ea7bf72e895a2e796e2834201415b8b45e05e045559284eb9052c0e84f62a5a9f0c9764f7576788c7228b19ef517c195497325a48a9344b147c12fd75509" }, { "secret_key": "5547f1004baedfce5cfc0850b05302374aad24f6163994ecd751df3af3c10620", "public_key": "7ce620787385ee1951ac49a77352ee0d6f8c5cd47df74e9e3216a6324fc7cf7f", "message": "a6c17eeb5b8066c2cd9a89667317a945a0c7c96996e77ae854c509c6cd0631e922ad04503af87a3c4628adafed7600d071c078a22e7f64bda08a362b38b26ca15006d38acf532d0dedea4177a2d33f06956d80e963848ec791b2762fa99449b4f1a1ed9b3f2580be3ac7d7f52fb14421d6222ba76f807750c6cbb0b16f0895fc73d9dfc587e1a9e5d1e58375fbab705b8f0c1fd7df8b3ad446f2f08459e7ed1af59556fbc966dc249c1cf604f3e677c8a09d4363608774bf3811bef0642748c55c516c7a580fa3499050acb30eed870d0d91174cb623e98c3ad121cf81f04e57d49b008424a98a31eeaaf5f38e000f903d48d215ed52f862d636a5a73607de85760167267efe30f8a26ebc5aa0c09f5b258d3361ca69d1d7ee07b59648179ab2170ec50c07f6616f216872529421a6334a4a1ed3d2671ef47bc9a92afb58314e832db8a9003408a0487503fe4f67770dd4b6", "signed": "29df3ad589009c667baa5e72dabb4e53cb7876de4e7efe5cc21ead7fa878db57f97c1103ddb39a861eb88653c1d4ec3b4306e4584b47b8bc90423119e7e4af00a6c17eeb5b8066c2cd9a89667317a945a0c7c96996e77ae854c509c6cd0631e922ad04503af87a3c4628adafed7600d071c078a22e7f64bda08a362b38b26ca15006d38acf532d0dedea4177a2d33f06956d80e963848ec791b2762fa99449b4f1a1ed9b3f2580be3ac7d7f52fb14421d6222ba76f807750c6cbb0b16f0895fc73d9dfc587e1a9e5d1e58375fbab705b8f0c1fd7df8b3ad446f2f08459e7ed1af59556fbc966dc249c1cf604f3e677c8a09d4363608774bf3811bef0642748c55c516c7a580fa3499050acb30eed870d0d91174cb623e98c3ad121cf81f04e57d49b008424a98a31eeaaf5f38e000f903d48d215ed52f862d636a5a73607de85760167267efe30f8a26ebc5aa0c09f5b258d3361ca69d1d7ee07b59648179ab2170ec50c07f6616f216872529421a6334a4a1ed3d2671ef47bc9a92afb58314e832db8a9003408a0487503fe4f67770dd4b6", "signature": "29df3ad589009c667baa5e72dabb4e53cb7876de4e7efe5cc21ead7fa878db57f97c1103ddb39a861eb88653c1d4ec3b4306e4584b47b8bc90423119e7e4af00" }, { "secret_key": "3dd7203c237aefe9e38a201ff341490179905f9f100828da18fcbe58768b5760", "public_key": "f067d7b2ff3a957e8373a7d42ef0832bcda84ebf287249a184a212a94c99ea5b", "message": "db28ed31ac04b0c2decee7a6b24fc9a082cc262ca7ccf2a247d6372ec3e9120ecedb4542ea593fea30335c5ab9dd318a3b4fd5834299cf3f53d9ef46137b273c390ec3c26a0b4470d0d94b77d82cae4b24587837b167bb7f8166710baeb3ee70af797316cb7d05fa57e468ae3f0bd449404d8528808b41fcca62f5e0a2aa5d8f3acab008cc5f6e5ab02777bdcde87f0a10ef06a4bb37fe02c94815cf76bfb8f5cdd865cc26dcb5cf492edfd547b535e2e6a6d8540956dcba62cfea19a9474406e934337e454270e01036ac45793b6b8aceda187a08d56a2ce4e98f42ea375b101a6b9fcb4231d171aa463eeb43586a4b82a387bcddaf71a80fd5c1f7292efc2bd8e70c11eaa817106061b6c461c4883d613cc06c7e2a03f73d90fc55cdc07265eefd36be72270383d6c676cae37c93691f1ae3d927b3a1cd963e4229757ae5231eea73a9f71515628305410ac2593b325cc631", "signed": "4c036935a96abc0d050d907bedbe9946fb97439f039c742e051ccf09add7df44d17da98c2ca01bdc2424da1e4debf347f8fff48ac8030d2cc07f9575c044be04db28ed31ac04b0c2decee7a6b24fc9a082cc262ca7ccf2a247d6372ec3e9120ecedb4542ea593fea30335c5ab9dd318a3b4fd5834299cf3f53d9ef46137b273c390ec3c26a0b4470d0d94b77d82cae4b24587837b167bb7f8166710baeb3ee70af797316cb7d05fa57e468ae3f0bd449404d8528808b41fcca62f5e0a2aa5d8f3acab008cc5f6e5ab02777bdcde87f0a10ef06a4bb37fe02c94815cf76bfb8f5cdd865cc26dcb5cf492edfd547b535e2e6a6d8540956dcba62cfea19a9474406e934337e454270e01036ac45793b6b8aceda187a08d56a2ce4e98f42ea375b101a6b9fcb4231d171aa463eeb43586a4b82a387bcddaf71a80fd5c1f7292efc2bd8e70c11eaa817106061b6c461c4883d613cc06c7e2a03f73d90fc55cdc07265eefd36be72270383d6c676cae37c93691f1ae3d927b3a1cd963e4229757ae5231eea73a9f71515628305410ac2593b325cc631", "signature": "4c036935a96abc0d050d907bedbe9946fb97439f039c742e051ccf09add7df44d17da98c2ca01bdc2424da1e4debf347f8fff48ac8030d2cc07f9575c044be04" }, { "secret_key": "282775df9ebbd7c5a65f3a2b096e36ee64a8f8ea719da77758739e4e7476111d", "public_key": "a2b49646033a13937cad6b0e914e3cec54989c252ca5643d076555d8c55e56e0", "message": "14cc50c2973ea9d0187a73f71cb9f1ce07e739e049ec2b27e6613c10c26b73a2a966e01ac3be8b505aeaad1485c1c2a3c6c2b00f81b9e5f927b73bfd498601a7622e8544837aad02e72bf72196dc246902e58af253ad7e025e3666d3bfc46b5b02f0eb4a37c9554992abc8651de12fd813177379bb0ce172cd8aaf937f979642bc2ed7c7a430cb14c3cd3101b9f6b91ee3f542acdf017f8c2116297f4564768f4db95dad8a9bcdc8da4d8fb13ef6e2da0b1316d3c8c2f3ed836b35fe2fd33effb409e3bc1b0f85225d2a1de3bfc2d20563946475c4d7ca9fddbaf59ad8f8961d287ae7dd803e7af1fa612329b1bdc04e225600ae731bc01ae0925aed62ac50d46086f3646cf47b072f0d3b044b36f85cec729a8bb2b92883ca4dfb34a8ee8a0273b31af50982bb6131bfa11d55504b1f6f1a0a00438ca26d8ab4f48bcddc9d5a38851abede4151d5b70d720732a00abea2c8b979", "signed": "15763973859402907d8dcb86adc24a2a168ba3abf2246173d6348afed51ef60b0c0edeff4e10bcef4c6e5778c8bc1f5e9ee0237373445b455155d23de127a20214cc50c2973ea9d0187a73f71cb9f1ce07e739e049ec2b27e6613c10c26b73a2a966e01ac3be8b505aeaad1485c1c2a3c6c2b00f81b9e5f927b73bfd498601a7622e8544837aad02e72bf72196dc246902e58af253ad7e025e3666d3bfc46b5b02f0eb4a37c9554992abc8651de12fd813177379bb0ce172cd8aaf937f979642bc2ed7c7a430cb14c3cd3101b9f6b91ee3f542acdf017f8c2116297f4564768f4db95dad8a9bcdc8da4d8fb13ef6e2da0b1316d3c8c2f3ed836b35fe2fd33effb409e3bc1b0f85225d2a1de3bfc2d20563946475c4d7ca9fddbaf59ad8f8961d287ae7dd803e7af1fa612329b1bdc04e225600ae731bc01ae0925aed62ac50d46086f3646cf47b072f0d3b044b36f85cec729a8bb2b92883ca4dfb34a8ee8a0273b31af50982bb6131bfa11d55504b1f6f1a0a00438ca26d8ab4f48bcddc9d5a38851abede4151d5b70d720732a00abea2c8b979", "signature": "15763973859402907d8dcb86adc24a2a168ba3abf2246173d6348afed51ef60b0c0edeff4e10bcef4c6e5778c8bc1f5e9ee0237373445b455155d23de127a202" }, { "secret_key": "4730a5cf9772d7d6665ba787bea4c95252e6ecd63ec62390547bf100c0a46375", "public_key": "f9f094f7cc1d40f1926b5b22dce465784468b20ab349bc6d4fdf78d0042bbc5b", "message": "e7476d2e668420e1b0fadfbaa54286fa7fa890a87b8280e26078152295e1e6e55d1241435cc430a8693bb10cde4643f59cbfcc256f45f5090c909a14c7fc49d37bfc25af11e8f4c83f4c32d4aabf43b20fa382bb6622a1848f8ffc4dff3408bb4ec7c67a35b4cdaee5e279c0fc0a66093a9f36a60fdd65e6334a804e845c8530b6fda363b5640337d027243ccfb3c177f43e717896e46ead7f72ca06aa0ff1e77247121baf48be9a445f729ca1390fc46151cbd33fcbd7373f27a6ba55c92cbf6945b09b44b9a4e5800d403070ae66048997b2197f02181a097e563f9b9acc841139258a258bc610d3bd891637356b2edc8c184c35c65af91aaf7b1c16d74a5f5f862548139254ecf550631d5f8849afdb5b64cf366ff2633a93f3a18c39b5150245fb5f33c9e4e2d94af6963a70b88f9e7e519f8fa2a0f2e3749de883d0e6f052a949d0fc7153a8693f6d801d7352eb2f7a465c0e", "signed": "552c7347bdfe131646ce0932d82a36d2c1b76d7c30ee890e0592e19f9d18b9a56f48d7a9b68c017da6b550c943af4a907baf317e419fbbc96f6cf4bfad42de00e7476d2e668420e1b0fadfbaa54286fa7fa890a87b8280e26078152295e1e6e55d1241435cc430a8693bb10cde4643f59cbfcc256f45f5090c909a14c7fc49d37bfc25af11e8f4c83f4c32d4aabf43b20fa382bb6622a1848f8ffc4dff3408bb4ec7c67a35b4cdaee5e279c0fc0a66093a9f36a60fdd65e6334a804e845c8530b6fda363b5640337d027243ccfb3c177f43e717896e46ead7f72ca06aa0ff1e77247121baf48be9a445f729ca1390fc46151cbd33fcbd7373f27a6ba55c92cbf6945b09b44b9a4e5800d403070ae66048997b2197f02181a097e563f9b9acc841139258a258bc610d3bd891637356b2edc8c184c35c65af91aaf7b1c16d74a5f5f862548139254ecf550631d5f8849afdb5b64cf366ff2633a93f3a18c39b5150245fb5f33c9e4e2d94af6963a70b88f9e7e519f8fa2a0f2e3749de883d0e6f052a949d0fc7153a8693f6d801d7352eb2f7a465c0e", "signature": "552c7347bdfe131646ce0932d82a36d2c1b76d7c30ee890e0592e19f9d18b9a56f48d7a9b68c017da6b550c943af4a907baf317e419fbbc96f6cf4bfad42de00" }, { "secret_key": "2770aadd1d123e9547832dfb2a837eba089179ef4f23abc4a53f2a714e423ee2", "public_key": "3c5fbb07530dd3a20ff35a500e3708926310fed8a899690232b42c15bd86e5dc", "message": "a5cc2055eba3cf6f0c6332c1f2ab5854870913b03ff7093bc94f335add44332231d9869f027d82efd5f1227144ab56e3222dc3ddccf062d9c1b0c1024d9b416dfa3ee8a7027923003465e0ffaefb75b9f29dc6bcf213adc5e318fd8ba93a7aa5bfb495de9d7c5e1a196cd3a2d7721f8ba785aa9052a1811c7fcc8f93932765059cab9c9b718945895ef26f3ac048d4cabf91a9e6aa83ac14d43156827837914eb763a23cba53f60f150f4b70203ec1833ff105849457a8da7327661fb23a554164e05fcf0146b10674964be6f6aa0acc94c41ad57180e5180d199bd9102f55d740e81789b15671bbd0670e6de5d97e1ae626d8a0ebc32c8fd9d24737274e47d2dd5941a272e72a598928ad109cde937bf248d57f5d2942983c51e2a89f8f054d5c48dfad8fcf1ffa97f7de6a3a43ca15fc6720efaec69f0836d84223f9776d111ec2bbc69b2dfd58be8ca12c072164b718cd7c246d64", "signed": "f267715e9a84c7314f2d5869ef4ab8d2149a13f7e8e1c728c423906293b49ce6283454dd1c7b04741df2eabedc4d6ab1397dc95a679df04d2c17d66c79bb7601a5cc2055eba3cf6f0c6332c1f2ab5854870913b03ff7093bc94f335add44332231d9869f027d82efd5f1227144ab56e3222dc3ddccf062d9c1b0c1024d9b416dfa3ee8a7027923003465e0ffaefb75b9f29dc6bcf213adc5e318fd8ba93a7aa5bfb495de9d7c5e1a196cd3a2d7721f8ba785aa9052a1811c7fcc8f93932765059cab9c9b718945895ef26f3ac048d4cabf91a9e6aa83ac14d43156827837914eb763a23cba53f60f150f4b70203ec1833ff105849457a8da7327661fb23a554164e05fcf0146b10674964be6f6aa0acc94c41ad57180e5180d199bd9102f55d740e81789b15671bbd0670e6de5d97e1ae626d8a0ebc32c8fd9d24737274e47d2dd5941a272e72a598928ad109cde937bf248d57f5d2942983c51e2a89f8f054d5c48dfad8fcf1ffa97f7de6a3a43ca15fc6720efaec69f0836d84223f9776d111ec2bbc69b2dfd58be8ca12c072164b718cd7c246d64", "signature": "f267715e9a84c7314f2d5869ef4ab8d2149a13f7e8e1c728c423906293b49ce6283454dd1c7b04741df2eabedc4d6ab1397dc95a679df04d2c17d66c79bb7601" }, { "secret_key": "4fdab7c1600e70114b11f533242376af7614b4d5da046ac4bedea21d8a361598", "public_key": "a25c9a94d6e4ecd95a4bd6805f762eb1c457a8d45d243238b1839cbba8f441cc", "message": "da405890d11a872c119dab5efcbff61e931f38eccca457edc626d3ea29ed4fe3154fafec1444da74343c06ad90ac9d17b511bcb73bb49d90bafb7c7ea800bd58411df1275c3cae71b700a5dab491a4261678587956aa4a219e1ac6dd3fb2cb8c46197218e726dc7ed234526a6b01c0d72cb93ab3f4f38a08e5940b3f61a72ad2789a0532000fac1d2d2e3ad632ac8b62bb3ff5b99d53597bf4d44b19674924df9b3db3d0253f74627ccab30031c85e291c58b5fa9167522a46746fc307036745d4f9817786e5d300e6c5d503125fea01dec3e3fedbf3861ca2627a0518fb2b24e5a7a014178719e9b345f7b249ce3a413280c8deb674f59a25be92a8ab6400c7c52b0728ae34e22b2ec200c1cbaba2ccd8af29249d17af60c36007a722fc80258a7bebab1cdaad7462a8b7588c2f7e27c6d07afcf60117fed11bd6859e75e3b4fcee3981881e95dd116827dd4b369af069d3c8f2676f8a", "signed": "5075c090cfbeb6b01802af7f4da5aa4f434d5ee2f3530eebb75c85e08621f83edc08aa96693894a4277633ba81e19e9e55af5c495daa5e1a6f8cbb79c01c7207da405890d11a872c119dab5efcbff61e931f38eccca457edc626d3ea29ed4fe3154fafec1444da74343c06ad90ac9d17b511bcb73bb49d90bafb7c7ea800bd58411df1275c3cae71b700a5dab491a4261678587956aa4a219e1ac6dd3fb2cb8c46197218e726dc7ed234526a6b01c0d72cb93ab3f4f38a08e5940b3f61a72ad2789a0532000fac1d2d2e3ad632ac8b62bb3ff5b99d53597bf4d44b19674924df9b3db3d0253f74627ccab30031c85e291c58b5fa9167522a46746fc307036745d4f9817786e5d300e6c5d503125fea01dec3e3fedbf3861ca2627a0518fb2b24e5a7a014178719e9b345f7b249ce3a413280c8deb674f59a25be92a8ab6400c7c52b0728ae34e22b2ec200c1cbaba2ccd8af29249d17af60c36007a722fc80258a7bebab1cdaad7462a8b7588c2f7e27c6d07afcf60117fed11bd6859e75e3b4fcee3981881e95dd116827dd4b369af069d3c8f2676f8a", "signature": "5075c090cfbeb6b01802af7f4da5aa4f434d5ee2f3530eebb75c85e08621f83edc08aa96693894a4277633ba81e19e9e55af5c495daa5e1a6f8cbb79c01c7207" }, { "secret_key": "264504604e70d72dc4474dbb34913e9c0f806dfe18c7879a41762a9e4390ec61", "public_key": "eb2b518ce7dc71c91f3665581651fd03af84c46bf1fed2433222353bc7ec511d", "message": "901d70e67ed242f2ec1dda813d4c052cfb31fd00cfe5446bf3b93fdb950f952d94ef9c99d1c264a6b13c3554a264beb97ed20e6b5d66ad84db5d8f1de35c496f947a23270954051f8e4dbe0d3ef9ab3003dd47b859356cecb81c50affa68c15dadb5f864d5e1bb4d3bada6f3aba1c83c438d79a94bfb50b43879e9cef08a2bfb22fad943dbf7683779746e31c486f01fd644905048b112ee258042153f46d1c7772a0624bcd6941e9062cfda75dc8712533f4057335c298038cbca29ebdb560a295a88339692808eb3481fd9735ea414f620c143b2133f57bb64e44778a8ca70918202d157426102e1dfc0a8f7b1ae487b74f02792633154dfe74caa1b7088fda22fa8b9bc354c585f1567706e2955493870f54169e0d7691159df43897961d24a852ea970c514948f3b48f71ee586e72ec78db820f253e08db84f6f312c4333bd0b732fe75883507783e9a1fd4fbab8e5870f9bf7ad58aa", "signed": "eea439a00f7e459b402b835150a779eed171ab971bd1b58dcc7f9386dadd583de8dc69e267121dde41f0f9493d450b16219cdf3c22f09482ce402fe17ca49e08901d70e67ed242f2ec1dda813d4c052cfb31fd00cfe5446bf3b93fdb950f952d94ef9c99d1c264a6b13c3554a264beb97ed20e6b5d66ad84db5d8f1de35c496f947a23270954051f8e4dbe0d3ef9ab3003dd47b859356cecb81c50affa68c15dadb5f864d5e1bb4d3bada6f3aba1c83c438d79a94bfb50b43879e9cef08a2bfb22fad943dbf7683779746e31c486f01fd644905048b112ee258042153f46d1c7772a0624bcd6941e9062cfda75dc8712533f4057335c298038cbca29ebdb560a295a88339692808eb3481fd9735ea414f620c143b2133f57bb64e44778a8ca70918202d157426102e1dfc0a8f7b1ae487b74f02792633154dfe74caa1b7088fda22fa8b9bc354c585f1567706e2955493870f54169e0d7691159df43897961d24a852ea970c514948f3b48f71ee586e72ec78db820f253e08db84f6f312c4333bd0b732fe75883507783e9a1fd4fbab8e5870f9bf7ad58aa", "signature": "eea439a00f7e459b402b835150a779eed171ab971bd1b58dcc7f9386dadd583de8dc69e267121dde41f0f9493d450b16219cdf3c22f09482ce402fe17ca49e08" }, { "secret_key": "2ca7447a3668b748b1fd3d52d2080d30e34d397bb2846caf8f659ac168788ca5", "public_key": "ab331cd40a31d0173c0c8c1c17002532807bf89e3edb6d34c2dd8294632b9fbc", "message": "a82bcd9424bffda0f2f5e9eae17835dbe468f61b785aab82934737a91c5f602cb7c617cdffe87cad726a4972e15a7b8ee147f062d2a5a4d89706b571fa8aa2b95981c78abeaaae86203fa2c0e07297406ea8c27111a86dbe1d5a7c3b7ae930904d9890f6d4abebd1412a73ad5feea64acf065d3e63b5cbe20cf20bbd2d8b94f9053ed5f66633482530124446605918de66455e8cf4b101a127233c4e27d5d55bf95bd3195d0340d43531fc75faf8dded5275bf89750de838fd10c31745be4ca41fa871cb0f9b016706a1a7e3c44bb90ac7a8ad51e272389292fd6c98ad7a069e76e3f5f3e0cc770b9e9b35a765d0d93712d7cdabd17e5d01dd8183af4ad9365db0a0fa41381fce60a081df1c5ab0f8c18f95a7a8b582dfff7f149ea579df0623b33b7508f0c663f01e3a2dcd9dfbee51cc615220fdaffdab51bdae42cb9f7fa9e3b7c69cc8ada5ccd642529ba514fdc54fcf2720b8f5d08b95", "signed": "f93ada15ae9cd2b54f26f86f0c28392aed5eb6b6b44d01a4e33a54e7da37c38e8d53366f73fd85be642e4ec81236d163f0d025e76c8bbdd65d43df49f09c1f01a82bcd9424bffda0f2f5e9eae17835dbe468f61b785aab82934737a91c5f602cb7c617cdffe87cad726a4972e15a7b8ee147f062d2a5a4d89706b571fa8aa2b95981c78abeaaae86203fa2c0e07297406ea8c27111a86dbe1d5a7c3b7ae930904d9890f6d4abebd1412a73ad5feea64acf065d3e63b5cbe20cf20bbd2d8b94f9053ed5f66633482530124446605918de66455e8cf4b101a127233c4e27d5d55bf95bd3195d0340d43531fc75faf8dded5275bf89750de838fd10c31745be4ca41fa871cb0f9b016706a1a7e3c44bb90ac7a8ad51e272389292fd6c98ad7a069e76e3f5f3e0cc770b9e9b35a765d0d93712d7cdabd17e5d01dd8183af4ad9365db0a0fa41381fce60a081df1c5ab0f8c18f95a7a8b582dfff7f149ea579df0623b33b7508f0c663f01e3a2dcd9dfbee51cc615220fdaffdab51bdae42cb9f7fa9e3b7c69cc8ada5ccd642529ba514fdc54fcf2720b8f5d08b95", "signature": "f93ada15ae9cd2b54f26f86f0c28392aed5eb6b6b44d01a4e33a54e7da37c38e8d53366f73fd85be642e4ec81236d163f0d025e76c8bbdd65d43df49f09c1f01" }, { "secret_key": "494ea9bcce26885b7d17d1fc114448f239f0ce46e5f247b4c999fa8629692472", "public_key": "6901e5efae57536ba5fdd96b59657359065f25d391a1aa8cdc0d38bb5d53c139", "message": "3badbfa5f5a8aa2cce0a60e686cdce654d24452f98fd54872e7395b39464380a0e185557ea134d095730864f4254d3dd946970c10c804fcc0899dfa024205be0f80b1c75449523324fe6a0751e47b4ff4822b8c33e9eaf1d1d96e0de3d4acd89696b7fcc03d49f92f82b9725700b350db1a87615369545561b8599f5ea920a310a8bafc0e8d7468cbf6f3820e943594afdd5166e4e3309dddd7694ef67e694f34fc62724ff96ac3364176f34e8a02b4cf569db5b8f77d58512aedabf0bcd1c2df12db3a9473f948c5c3243309aae46c49efd088b60f31a8a72ad7e5a35acc5d89fa66807eb5d3ba9cdf08d4753cb85089ee36f5c96b432b6928352afad58012225d6157f9e3611426df921b6d1d8374628a63031e9ffb90e42ffbba021f174f68503155430152c9155dc98ffa26c4fab065e1f8e4622c2f28a8cb043110b617441140f8e20adc16f799d1d5096b1f50532be5042d21b81ea46c7", "signed": "548a093a680361b7dc56f14503b55eeec3b3f4fd4ca99d6aedce0830f7f4ae2f7328539b34c48fc9760922333dae9c7c017e7db73b8faa6c06be05e347992b063badbfa5f5a8aa2cce0a60e686cdce654d24452f98fd54872e7395b39464380a0e185557ea134d095730864f4254d3dd946970c10c804fcc0899dfa024205be0f80b1c75449523324fe6a0751e47b4ff4822b8c33e9eaf1d1d96e0de3d4acd89696b7fcc03d49f92f82b9725700b350db1a87615369545561b8599f5ea920a310a8bafc0e8d7468cbf6f3820e943594afdd5166e4e3309dddd7694ef67e694f34fc62724ff96ac3364176f34e8a02b4cf569db5b8f77d58512aedabf0bcd1c2df12db3a9473f948c5c3243309aae46c49efd088b60f31a8a72ad7e5a35acc5d89fa66807eb5d3ba9cdf08d4753cb85089ee36f5c96b432b6928352afad58012225d6157f9e3611426df921b6d1d8374628a63031e9ffb90e42ffbba021f174f68503155430152c9155dc98ffa26c4fab065e1f8e4622c2f28a8cb043110b617441140f8e20adc16f799d1d5096b1f50532be5042d21b81ea46c7", "signature": "548a093a680361b7dc56f14503b55eeec3b3f4fd4ca99d6aedce0830f7f4ae2f7328539b34c48fc9760922333dae9c7c017e7db73b8faa6c06be05e347992b06" }, { "secret_key": "00d735ebaee75dd579a40dfd82508274d01a1572df99b811d5b01190d82192e4", "public_key": "ba02517c0fdd3e2614b3f7bf99ed9b492b80edf0495d230f881730ea45bc17c4", "message": "59c0b69af95d074c88fdc8f063bfdc31b5f4a9bc9cecdffa8128e01e7c1937dde5eb0570b51b7b5d0a67a3555b4cdce2bca7a31a4fe8e1d03ab32b4035e6dadbf1532059ee01d3d9a7633a0e706a1154cab22a07cd74c06a3cb601244cf3cf35a35c3100ba47f31372a2da65dcff0d7a80a1055d8aa99212e899aad7f02e949e6fee4d3c9cefa85069eaff1f6ad06fc300c871ab82b2bedb934d20875c2a263242cdb7f9be192a8710b24c7ea98d43daec8baa5553c678a38f0e0adf7d3ff2dcc799a1dbad6eab1c3d9458a9db922f02e75cfab9d65c7336dae71895d5bb15cac203f2b38b9996c410f8655ad22d3c091c20b7f926d45e780128f19747462abc5c58932fbb9e0bc62d53868802f1b083f183b8a1f9434986d5cf97c04e2f3e145730cba98779c7fed0cab1c05d5e4653c6c3f6736260bc78ee4372862ffe9e90371d762c7432781f35ced884a4baca05653ef25f25a6f3d5628308", "signed": "dcdc54611937d2bd06cacd9818b3be15ce7425427a75f50d197a337a3b8ba6714ef48866f243bd5ac7415e914517a2c1c5a953f432b99db0e620d64f74eb850559c0b69af95d074c88fdc8f063bfdc31b5f4a9bc9cecdffa8128e01e7c1937dde5eb0570b51b7b5d0a67a3555b4cdce2bca7a31a4fe8e1d03ab32b4035e6dadbf1532059ee01d3d9a7633a0e706a1154cab22a07cd74c06a3cb601244cf3cf35a35c3100ba47f31372a2da65dcff0d7a80a1055d8aa99212e899aad7f02e949e6fee4d3c9cefa85069eaff1f6ad06fc300c871ab82b2bedb934d20875c2a263242cdb7f9be192a8710b24c7ea98d43daec8baa5553c678a38f0e0adf7d3ff2dcc799a1dbad6eab1c3d9458a9db922f02e75cfab9d65c7336dae71895d5bb15cac203f2b38b9996c410f8655ad22d3c091c20b7f926d45e780128f19747462abc5c58932fbb9e0bc62d53868802f1b083f183b8a1f9434986d5cf97c04e2f3e145730cba98779c7fed0cab1c05d5e4653c6c3f6736260bc78ee4372862ffe9e90371d762c7432781f35ced884a4baca05653ef25f25a6f3d5628308", "signature": "dcdc54611937d2bd06cacd9818b3be15ce7425427a75f50d197a337a3b8ba6714ef48866f243bd5ac7415e914517a2c1c5a953f432b99db0e620d64f74eb8505" }, { "secret_key": "8c34b905440b61911d1d8137c53d46a1a76d4609af973e18eb4c5709295627bb", "public_key": "b69a8b2fdf5c20e734c2ffb294bc8ae1011d664f11afe7fbc471925cf72fa99d", "message": "30b57a389b48a0beb1a48432bff6b314bded79c4a1763a5acb57cea1bfb4c6d016cf090f5bd05bbd114e33ae7c17782dfa264f46c45f8c599c603016fe9ff05b6b5a99e92fe713a4cd5c41b292ed2bb2e9cf33a440542e821ec82cbf665c3f02e3dc337d7fdb58e31b27cb2954541468814698510df18c85c81fad12db11ec6b966f4930da5646b991db97445097da30dab61cda53a41083cb96add19de6c5eec323bca9d3530e38c00b35af7360077601be6ac97f3030f930a27b90fe8b6911bae389065adc15e1882300e2a003274d23182d5efd5ba4b9130c07bd5c65fecb8b5cb7eb38836b318befdfd77de4d6ca0181f77ae5740891683225f549dd8426145c97c5818c319f7ab2d868e1a41ceab64c085116069897bf2ca3667652406155ed0646431b6de1ccc03b4279ae4d326679265dce82048e7298e1f87fcec0768ac0f5d8ff84f7210be54d411af8edea7217f4e59413121e148c60da", "signed": "3e0b72073dc9375eedcca6c4fc1cd315938a050c92716bd2284f4629a962beec0b7d7cf16ab923d58f5b90d3901a8e5c75c8f17dab9998e007d8c49511973d0e30b57a389b48a0beb1a48432bff6b314bded79c4a1763a5acb57cea1bfb4c6d016cf090f5bd05bbd114e33ae7c17782dfa264f46c45f8c599c603016fe9ff05b6b5a99e92fe713a4cd5c41b292ed2bb2e9cf33a440542e821ec82cbf665c3f02e3dc337d7fdb58e31b27cb2954541468814698510df18c85c81fad12db11ec6b966f4930da5646b991db97445097da30dab61cda53a41083cb96add19de6c5eec323bca9d3530e38c00b35af7360077601be6ac97f3030f930a27b90fe8b6911bae389065adc15e1882300e2a003274d23182d5efd5ba4b9130c07bd5c65fecb8b5cb7eb38836b318befdfd77de4d6ca0181f77ae5740891683225f549dd8426145c97c5818c319f7ab2d868e1a41ceab64c085116069897bf2ca3667652406155ed0646431b6de1ccc03b4279ae4d326679265dce82048e7298e1f87fcec0768ac0f5d8ff84f7210be54d411af8edea7217f4e59413121e148c60da", "signature": "3e0b72073dc9375eedcca6c4fc1cd315938a050c92716bd2284f4629a962beec0b7d7cf16ab923d58f5b90d3901a8e5c75c8f17dab9998e007d8c49511973d0e" }, { "secret_key": "77a83e18c9f000eeff7deeac959ecba2206c0aa39d2f0e2aed5729482a7a0229", "public_key": "62b1b316135596bfbca6037ed847c61fb7f09fa36ce90abb7789b86f768b59dd", "message": "f3d5fa2acaefd858f1df26e03059cdcbc2468ad74afc993d0db9c4cde4113f8d55c7da71d38ba06520531c61fddb5f33d5f0353be2376e580711be45c0a30b1fa01b55e228c6fa35e3f95b67909fc7df3fd464d93d661a926f9d11f7550c17fbcc3496526e8f10e0c8916677b2be5b319b688f21e81aaa9482e5c93e64ce8c437b9c1e14fefed70a3fee568811dc31cadab3d5b220254465336dc4d97a3bd096b5e065e0cfbe82849e2c1905aca486533f0da7a61f1e9a55b8e2a83262deeb59f2b13d3a8aef5700845b83b25ae2183c0ddac0ce42f8d25674cb0d0d220a6de7c1858bb07d59a3372344d944602aa451d2b937db0fe6feca0beba81721fc361ea7509e2b6d397e1c191b56f54ab436d0d27ab4c061bd661ad1a4452387e8735754d07fa7ef4d4548b172582425b299046e6301b5ba6b914418f149cf722e10bde2e0d41700f12c8429fc897b7819da92292240cd45565458c9a7b29c12", "signed": "1eaad8420ac12c99ac1ff4476678e3cbbe94da6a797f174664d5ee0f641433fb1e7cb2f5613e10805df8654cd8e0d45d96230932bc7f20b04eae836435134309f3d5fa2acaefd858f1df26e03059cdcbc2468ad74afc993d0db9c4cde4113f8d55c7da71d38ba06520531c61fddb5f33d5f0353be2376e580711be45c0a30b1fa01b55e228c6fa35e3f95b67909fc7df3fd464d93d661a926f9d11f7550c17fbcc3496526e8f10e0c8916677b2be5b319b688f21e81aaa9482e5c93e64ce8c437b9c1e14fefed70a3fee568811dc31cadab3d5b220254465336dc4d97a3bd096b5e065e0cfbe82849e2c1905aca486533f0da7a61f1e9a55b8e2a83262deeb59f2b13d3a8aef5700845b83b25ae2183c0ddac0ce42f8d25674cb0d0d220a6de7c1858bb07d59a3372344d944602aa451d2b937db0fe6feca0beba81721fc361ea7509e2b6d397e1c191b56f54ab436d0d27ab4c061bd661ad1a4452387e8735754d07fa7ef4d4548b172582425b299046e6301b5ba6b914418f149cf722e10bde2e0d41700f12c8429fc897b7819da92292240cd45565458c9a7b29c12", "signature": "1eaad8420ac12c99ac1ff4476678e3cbbe94da6a797f174664d5ee0f641433fb1e7cb2f5613e10805df8654cd8e0d45d96230932bc7f20b04eae836435134309" }, { "secret_key": "73b03373ef1fd849005ecd6270dd9906f19f4439e40376cdbc520902bc976812", "public_key": "663719e08ba3ba1666f6069a3f54991866b18cc6be41991b02eb3026ff9e155f", "message": "d5c2deaba795c30aba321bc7de6996f0d90e4d05c747fb4dae8f3451895def6e16e72f38eace756f36635f8fb0b72a3a0c1f54663817a94d4fd346f835ab0e657f001a6f2cecb86d0825bd02639254f7f7f38ca99dbb86c64a633f73baf933aae3563281f4005e2d0e7cec9fbde8e588a957e211068be65b3d3d35bf4e8d5bb3478333df9ced9b2abaf48697994a145e9321499fc5ee560f4fbb6849e1ae8eb3d1de0083a21a03f6a6b28176f0130d3895e50e75e3d7d0947a7bc2c5b9ff69895d27791442ba8d0f2180712b567f712ea912f3b0d92c19342e0106ff1d87b46ad33af300b90855ba9769d366e79425d98e4de19905a04577707cbe625b84691781cd26bf62260b4a8bd605f77af6f970e1b3a112e8918344bd0d8d2e41dfd2ce9895b0246e50887aa3a577ff73be4b6ae60feb0ca36f6a5f8171ed209e5c566529c0940d9b4bd744ccee56e54a9a0c6e4da520dd315c2872b02db563703e", "signed": "a40abe98fc69da8a1ff9ff5c2cca93632e975980ee8b82c3c376022d6524ab736d01b072f2b681b5f1cd3ea067012ed6d074e949c42327a366caa9e4750a3c08d5c2deaba795c30aba321bc7de6996f0d90e4d05c747fb4dae8f3451895def6e16e72f38eace756f36635f8fb0b72a3a0c1f54663817a94d4fd346f835ab0e657f001a6f2cecb86d0825bd02639254f7f7f38ca99dbb86c64a633f73baf933aae3563281f4005e2d0e7cec9fbde8e588a957e211068be65b3d3d35bf4e8d5bb3478333df9ced9b2abaf48697994a145e9321499fc5ee560f4fbb6849e1ae8eb3d1de0083a21a03f6a6b28176f0130d3895e50e75e3d7d0947a7bc2c5b9ff69895d27791442ba8d0f2180712b567f712ea912f3b0d92c19342e0106ff1d87b46ad33af300b90855ba9769d366e79425d98e4de19905a04577707cbe625b84691781cd26bf62260b4a8bd605f77af6f970e1b3a112e8918344bd0d8d2e41dfd2ce9895b0246e50887aa3a577ff73be4b6ae60feb0ca36f6a5f8171ed209e5c566529c0940d9b4bd744ccee56e54a9a0c6e4da520dd315c2872b02db563703e", "signature": "a40abe98fc69da8a1ff9ff5c2cca93632e975980ee8b82c3c376022d6524ab736d01b072f2b681b5f1cd3ea067012ed6d074e949c42327a366caa9e4750a3c08" }, { "secret_key": "eab179e41ed5c889ffe6aabdc054faf1307c395e46e313e17a14fe01023ffa30", "public_key": "86f34746d3f7a01ddbe322f1aca56d22856d38733a3a6900bb08e776450ec803", "message": "971095cebe5031530224387c5c31966e389b8566390054cf45264b44e18964b7be52c33c4ffb259af16283438fa15dd66bc7791b7533ef10cb0beab524a6437626f4cc74512851adcc2fb129055a482c61107383fb7c5241831d5551634eef0dc0b8f9053a00971aa8fa1ae0898e4b481b6707e97c0f942040b339d92fc17bbade74675af243d8b2dafb15b1db55d12415b85f3037291930ab61600ba3431f8eb425be4491614728af101e81c091f348bc5ffd1bde6ae6cad5c15b3aa7358078cc4effb54a86e7f0e0c55e4cfe0a54605ed443fdf2aaba016585da617e77341d52889d75dd540d39fe8b7993ed705cfddea0cb0d5a731d6bfcdb816afaff47e963eedebdf241af5593353d6d401a34f029a8cdeb1904cc2caa4f9635cc2ba6b7b1a29da625ffc383be2f5a8f1fa4f39b2d4b4f4c2d8838ce258a04d4a120493fdf07f68c0ffd1c16b768a35c55fea2cac696b5c20efc10865cde8a64627dcd", "signed": "143cb28027c2f82e375e5f340e7fe6e60ce7bd51000b49c74168af85e26ed2ed630ed2672090164cc54b052da694ebdd21a21b3053f4dcfd7895ea5f6c8aa80d971095cebe5031530224387c5c31966e389b8566390054cf45264b44e18964b7be52c33c4ffb259af16283438fa15dd66bc7791b7533ef10cb0beab524a6437626f4cc74512851adcc2fb129055a482c61107383fb7c5241831d5551634eef0dc0b8f9053a00971aa8fa1ae0898e4b481b6707e97c0f942040b339d92fc17bbade74675af243d8b2dafb15b1db55d12415b85f3037291930ab61600ba3431f8eb425be4491614728af101e81c091f348bc5ffd1bde6ae6cad5c15b3aa7358078cc4effb54a86e7f0e0c55e4cfe0a54605ed443fdf2aaba016585da617e77341d52889d75dd540d39fe8b7993ed705cfddea0cb0d5a731d6bfcdb816afaff47e963eedebdf241af5593353d6d401a34f029a8cdeb1904cc2caa4f9635cc2ba6b7b1a29da625ffc383be2f5a8f1fa4f39b2d4b4f4c2d8838ce258a04d4a120493fdf07f68c0ffd1c16b768a35c55fea2cac696b5c20efc10865cde8a64627dcd", "signature": "143cb28027c2f82e375e5f340e7fe6e60ce7bd51000b49c74168af85e26ed2ed630ed2672090164cc54b052da694ebdd21a21b3053f4dcfd7895ea5f6c8aa80d" }, { "secret_key": "fbf146ebd51075570ec51ac410ae9f391db75b610ada6362b4dbd949656cfb66", "public_key": "be7c2f5b21d746c8ea3245ce6f268e9da74e00fa85c9c475260c68fa1af6361f", "message": "cd7ad4f17fcff73acc402dc102d09079b29aaf2a0f4b27cf6beeb1e2b23d19ab47deb3ae1becd68861ea279c46691738f4fff47c43047c4f8b56b6bbcc3fde0723d44120dcd307a6310dc4f366b8f3cd52db19b8266a487f7872391c45fe0d3248a7abf2c20022d3769547f683067dcc363cd22fd7cda3cadc15804056f0e2aa2b795008c598be7a961805e6df291ba3041c47ff5640275f46e6ae82092d21abcbcfba11e730216008822de3ce462400596da79f7ae5d1df8389112ad98868fa94fb0546bfe6a67aa8d28c4d32072d2eadd6256255f18c2382e662dfa922a680e06a43622c4871d27d1807f7b2703070c83db8dd929c06038b2183cb8e2b9ec4c778d7ecf9e9ffac77fa7737b055feac2e7982aeeec0b72f1bbca2424e1a844bbac79cb2e7400f81dc449d0560b521a7c16bb4167e6696586058a9b8ed2e5116690b77f2a17e5c0b16a83dcbd2e24552293e258b32ba7f844944379342698627", "signed": "6768006fe0f201b217dd10eb05d4b82adcfeb2ecfc8373c3308f4150394811eb60491881a2e53d1289d96478e18a64c34b2a19832cdccfd96a2e4a0c469fdc0bcd7ad4f17fcff73acc402dc102d09079b29aaf2a0f4b27cf6beeb1e2b23d19ab47deb3ae1becd68861ea279c46691738f4fff47c43047c4f8b56b6bbcc3fde0723d44120dcd307a6310dc4f366b8f3cd52db19b8266a487f7872391c45fe0d3248a7abf2c20022d3769547f683067dcc363cd22fd7cda3cadc15804056f0e2aa2b795008c598be7a961805e6df291ba3041c47ff5640275f46e6ae82092d21abcbcfba11e730216008822de3ce462400596da79f7ae5d1df8389112ad98868fa94fb0546bfe6a67aa8d28c4d32072d2eadd6256255f18c2382e662dfa922a680e06a43622c4871d27d1807f7b2703070c83db8dd929c06038b2183cb8e2b9ec4c778d7ecf9e9ffac77fa7737b055feac2e7982aeeec0b72f1bbca2424e1a844bbac79cb2e7400f81dc449d0560b521a7c16bb4167e6696586058a9b8ed2e5116690b77f2a17e5c0b16a83dcbd2e24552293e258b32ba7f844944379342698627", "signature": "6768006fe0f201b217dd10eb05d4b82adcfeb2ecfc8373c3308f4150394811eb60491881a2e53d1289d96478e18a64c34b2a19832cdccfd96a2e4a0c469fdc0b" }, { "secret_key": "dff0eb6b426dea2fd33c1d3fc24df9b31b486facb7edb8502954a3e8da99d9fd", "public_key": "c245085ece69fb9aa560d0c27fdb634f7a840d41d8463660fbe82483b0f3cc3a", "message": "e7c9e313d86160f4c74aa0ae07369ee22b27f81b3f69097affae28dae48483fb52a5c062306b59610f5cdbff6332b1960cd6f2b8f7b41578c20f0bc9637a0fdfc739d61f699a573f1c1a0b49294506cf4487965e5bb07bbf81803cb3d5cb3829c66c4bee7fc800ede216150934d277dea50edb097b992f11bb669fdf140bf6ae9fec46c3ea32f888fde9d154ea84f01c51265a7d3fef6eefc1ccdbffd1e2c897f05546a3b1ca11d9517cd667c660ec3960f7a8e5e80202a78d3a388b92f5c1dee14ae6acf8e17c841c9557c35a2eeced6e6af6372148e483ccd06c8fe344924e1019fb91cbf7941b9a176a073415867210670410c5dbd0ac4a50e6c0a509ddfdc555f60d696d41c77db8e6c84d5181f872755e64a721b061fcd68c463db4d32c9e01ea501267de22879d7fc12c8ca0379edb45abaa6e64dda2af6d40ccf24fbebad7b5a8d3e52007945ecd3ddc1e3efeb522581ac80e98c863ba0c590a3ed95cd1", "signed": "6b48b10f545ddb7a89cd5829f4e5b20146cf6bc96e550d06f65de8bdae7ccdded26cd630f86c9266bccf88e924033e04f83a54f8290d7f734cf8673cca8f9703e7c9e313d86160f4c74aa0ae07369ee22b27f81b3f69097affae28dae48483fb52a5c062306b59610f5cdbff6332b1960cd6f2b8f7b41578c20f0bc9637a0fdfc739d61f699a573f1c1a0b49294506cf4487965e5bb07bbf81803cb3d5cb3829c66c4bee7fc800ede216150934d277dea50edb097b992f11bb669fdf140bf6ae9fec46c3ea32f888fde9d154ea84f01c51265a7d3fef6eefc1ccdbffd1e2c897f05546a3b1ca11d9517cd667c660ec3960f7a8e5e80202a78d3a388b92f5c1dee14ae6acf8e17c841c9557c35a2eeced6e6af6372148e483ccd06c8fe344924e1019fb91cbf7941b9a176a073415867210670410c5dbd0ac4a50e6c0a509ddfdc555f60d696d41c77db8e6c84d5181f872755e64a721b061fcd68c463db4d32c9e01ea501267de22879d7fc12c8ca0379edb45abaa6e64dda2af6d40ccf24fbebad7b5a8d3e52007945ecd3ddc1e3efeb522581ac80e98c863ba0c590a3ed95cd1", "signature": "6b48b10f545ddb7a89cd5829f4e5b20146cf6bc96e550d06f65de8bdae7ccdded26cd630f86c9266bccf88e924033e04f83a54f8290d7f734cf8673cca8f9703" }, { "secret_key": "9f32958c7679b90fd5036056a75ec2eb2f56ec1effc7c012461dc89a3a167420", "public_key": "1d7269dcb6d1f584e662d4ce251de0aba290ef78b97d448afb1e5333f1976d26", "message": "a56ba86c71360504087e745c41627092ad6b49a71e9daa5640e1044bf04d4f071ad728779e95d1e2460584e6f0773545da82d4814c9189a120f12f3e3819813e5b240d0f26436f70ee353b4d20cea54a1460b5b8f1008d6f95f3aa2d8f1e908fced50d624e3a096938b9353854b96da463a2798a5a312ec790842c10c446e3350c764bf5c972593b9987bf23256daa8894d47f22e85b97607e66fc08a12c789c4746080368d321bb9015a1155b65523ad8e99bb989b44eac756b0734acd7c6357c70b59743246d1652d91b0f9896965141345b9945cf34980452f3502974edb76b9c785fb0f4395266b055f3b5db8aab68e9d7102a1cd9ee3d142504f0e88b282e603a738e051d98de05d1fcc65b5f7e99c4111cc0aec489abd0ecad311bfc13e7d1653b9c31e81c998037f959d5cd980835aa0e0b09bcbed634391151da02bc01a36c9a5800afb984163a7bb815edbc0226eda0595c724ca9b3f8a71178f0d20a5a", "signed": "9881a5763bdb259a3fefbba3d957162d6c70b804fa94ab613406a6ec42505b8789465ca1a9a33e1895988842270c55e5bdd5483f6b17b31781b593507a6c1808a56ba86c71360504087e745c41627092ad6b49a71e9daa5640e1044bf04d4f071ad728779e95d1e2460584e6f0773545da82d4814c9189a120f12f3e3819813e5b240d0f26436f70ee353b4d20cea54a1460b5b8f1008d6f95f3aa2d8f1e908fced50d624e3a096938b9353854b96da463a2798a5a312ec790842c10c446e3350c764bf5c972593b9987bf23256daa8894d47f22e85b97607e66fc08a12c789c4746080368d321bb9015a1155b65523ad8e99bb989b44eac756b0734acd7c6357c70b59743246d1652d91b0f9896965141345b9945cf34980452f3502974edb76b9c785fb0f4395266b055f3b5db8aab68e9d7102a1cd9ee3d142504f0e88b282e603a738e051d98de05d1fcc65b5f7e99c4111cc0aec489abd0ecad311bfc13e7d1653b9c31e81c998037f959d5cd980835aa0e0b09bcbed634391151da02bc01a36c9a5800afb984163a7bb815edbc0226eda0595c724ca9b3f8a71178f0d20a5a", "signature": "9881a5763bdb259a3fefbba3d957162d6c70b804fa94ab613406a6ec42505b8789465ca1a9a33e1895988842270c55e5bdd5483f6b17b31781b593507a6c1808" }, { "secret_key": "f86d6f766f88b00717b7d6327eb26cf3ceeba5385184426f9cfd8295e2421ff2", "public_key": "cb1d250504754183704dbe21c323d66f9f9011758f6d8dab6f597b199662145b", "message": "da8423a6b7a18f20aa1f90ed2331b17b24067c40175bc25d8109e21d87ac00528eb3b2f66a2b52dc7ef2f8cecb75c76099cfa23db8da897043ba1cce31e2dfea46075f5e073203eaeb3d62c84c107b6dab33a14eaf149aa61850c15f5a58d88a15aba9196f9e495e8dbecbcf7e8444f5dd72a08a099d7f6209990b562974ea829ef11d29a920e3a799d0d92cb50d50f817631ab09de97c31e9a05f4d78d649fcd93a83752078ab3bb0e16c564d4fb07ca923c0374ba5bf1eea7e73668e135031feafcbb47cbc2ae30ec16a39b9c337e0a62eecdd80c0b7a04924ac3972da4fa9299c14b5a53d37b08bf02268b3bac9ea9355090eeb04ad87bee0593ba4e4443dda38a97afbf2db9952df63f178f3b4c52bcc132be8d9e26881213abdeb7e1c44c4061548909f0520f0dd7520fc408ea28c2cebc0f53063a2d30570e05350e52b390dd9b67662984847be9ad9b4cd50b069ffd29dd9c62ef14701f8d012a4a70c8431cc", "signed": "ec61c0b292203a8f1d87235ede92b74723c8d23408423773ae50b1e9bc4464e03e446da9dce4c39f6dd159bea26c009ed00120bc36d4a247dc0d24bcefcc110cda8423a6b7a18f20aa1f90ed2331b17b24067c40175bc25d8109e21d87ac00528eb3b2f66a2b52dc7ef2f8cecb75c76099cfa23db8da897043ba1cce31e2dfea46075f5e073203eaeb3d62c84c107b6dab33a14eaf149aa61850c15f5a58d88a15aba9196f9e495e8dbecbcf7e8444f5dd72a08a099d7f6209990b562974ea829ef11d29a920e3a799d0d92cb50d50f817631ab09de97c31e9a05f4d78d649fcd93a83752078ab3bb0e16c564d4fb07ca923c0374ba5bf1eea7e73668e135031feafcbb47cbc2ae30ec16a39b9c337e0a62eecdd80c0b7a04924ac3972da4fa9299c14b5a53d37b08bf02268b3bac9ea9355090eeb04ad87bee0593ba4e4443dda38a97afbf2db9952df63f178f3b4c52bcc132be8d9e26881213abdeb7e1c44c4061548909f0520f0dd7520fc408ea28c2cebc0f53063a2d30570e05350e52b390dd9b67662984847be9ad9b4cd50b069ffd29dd9c62ef14701f8d012a4a70c8431cc", "signature": "ec61c0b292203a8f1d87235ede92b74723c8d23408423773ae50b1e9bc4464e03e446da9dce4c39f6dd159bea26c009ed00120bc36d4a247dc0d24bcefcc110c" }, { "secret_key": "a5b34cefab9479df8389d7e6f6c146aa8affb0bec837f78af64624a145cc344e", "public_key": "7b0f4f24d9972bc6fe83826c52716ad1e0d7d19f123858cb3e99fa636ac9631a", "message": "e21e98af6c2bac70557eb0e864da2c2b4d6c0a39a059d3477251f6178a39676f4749e7fbea623f148a43a8b0fe0610506fa658abd2f5fa39198f2636b724db22d1aebc2ab07b2b6dbffdee8cece81e1af1493ec1964e16bf86ab258ca0feb77e3c8717e44038abe152c14be15660bf93b2d48d92c4ed7074d2494210621bcf204fba88c654d5ffe01e1a53d08f70bb237089dc807216ff6a85dbec3102237d42590778acf6c1dc566d5a2bb9a63bc21c329c272e5965baeeb0fe891de3cc8cbfa8e541a8881df68942e7ff8dc656bd08575f6aaf924a176d663b1a1f43574d11768c701b269561e55438dbebfd443d2115cb933d1cde4a915b54c325c27f499ef02bd012ff1f9a36390922887600fe712bcdc23eb5974a305372ad52951f83f0e58cc49e289841621917f1fcb0235147240dae4cf3b99b6ac6d8de94efe7c4436714508bcd0114c56068ff1b7c16d51bd906437874d6549ab5d8087896872ec8a09d7412", "signed": "2fbd899d72b6d39e4f45b8b62cbbd5f3c0acb1ad8540913fa585877e91ccfef7bee50a4b0f9fedf5cc1e0d1953ad399c8389a93391e1b7c929af6d6f3b796c08e21e98af6c2bac70557eb0e864da2c2b4d6c0a39a059d3477251f6178a39676f4749e7fbea623f148a43a8b0fe0610506fa658abd2f5fa39198f2636b724db22d1aebc2ab07b2b6dbffdee8cece81e1af1493ec1964e16bf86ab258ca0feb77e3c8717e44038abe152c14be15660bf93b2d48d92c4ed7074d2494210621bcf204fba88c654d5ffe01e1a53d08f70bb237089dc807216ff6a85dbec3102237d42590778acf6c1dc566d5a2bb9a63bc21c329c272e5965baeeb0fe891de3cc8cbfa8e541a8881df68942e7ff8dc656bd08575f6aaf924a176d663b1a1f43574d11768c701b269561e55438dbebfd443d2115cb933d1cde4a915b54c325c27f499ef02bd012ff1f9a36390922887600fe712bcdc23eb5974a305372ad52951f83f0e58cc49e289841621917f1fcb0235147240dae4cf3b99b6ac6d8de94efe7c4436714508bcd0114c56068ff1b7c16d51bd906437874d6549ab5d8087896872ec8a09d7412", "signature": "2fbd899d72b6d39e4f45b8b62cbbd5f3c0acb1ad8540913fa585877e91ccfef7bee50a4b0f9fedf5cc1e0d1953ad399c8389a93391e1b7c929af6d6f3b796c08" }, { "secret_key": "ad75c9ce299c4d59393367d77a4c9f8df8dcec765c6dbd25b527fb7669913604", "public_key": "b9910548fe6312a119c9993eebcfb9dc90030ffb0e4de2b7ccd23cbeb4fef71b", "message": "62fc5ab67deb1fee9ab6cca3b88a1df1e589f0fd4a88f4aa7738948761fe84372c5b18e4655220c1d84d52acad32e229a5c756c20fc62fe4b4b4e5fd7077ae4ed5397aa796f2307ceedb6505b39297856f4aeb5e70938e36ee24a0ac7d9868306f6b53910623b7dc89a6672ad738576ed5d88831dd338321c8902bc2061f65e94d452fdfa0dc665cefb92308e52301bd4627006b363d06b775a395914d8c863e95a00d6893f3376134c429f56478145e4456f7a12d65bb2b8965d728cb2ddbb708f7125c237095a92195d92fa727a372f3545ae701f3808fee802c8967a76e8a940e55fb2d810bfb47ada156f0eda1829b159cf05c7f36cf3847d7b21de84c3dc0fe658347f79396a01139a508b60022db1c0e5aeef47e445e66f783e62c96597bdb16f209c08a9132c7573136170ee3ebf24261265a89fb4f10333375e20b33ab7403464f5249461c6853c5fddb9f58af816892910393a7077b799fdc3489720998feea86", "signed": "6b7ef27bcfbf2b714985033764fccff555e3f5bc44610d6c8c62117cb3831a07f4a8bddb0eaed1d46b0289b15de1aa4dcc17d71be96a09e66ba4dc4627c7870562fc5ab67deb1fee9ab6cca3b88a1df1e589f0fd4a88f4aa7738948761fe84372c5b18e4655220c1d84d52acad32e229a5c756c20fc62fe4b4b4e5fd7077ae4ed5397aa796f2307ceedb6505b39297856f4aeb5e70938e36ee24a0ac7d9868306f6b53910623b7dc89a6672ad738576ed5d88831dd338321c8902bc2061f65e94d452fdfa0dc665cefb92308e52301bd4627006b363d06b775a395914d8c863e95a00d6893f3376134c429f56478145e4456f7a12d65bb2b8965d728cb2ddbb708f7125c237095a92195d92fa727a372f3545ae701f3808fee802c8967a76e8a940e55fb2d810bfb47ada156f0eda1829b159cf05c7f36cf3847d7b21de84c3dc0fe658347f79396a01139a508b60022db1c0e5aeef47e445e66f783e62c96597bdb16f209c08a9132c7573136170ee3ebf24261265a89fb4f10333375e20b33ab7403464f5249461c6853c5fddb9f58af816892910393a7077b799fdc3489720998feea86", "signature": "6b7ef27bcfbf2b714985033764fccff555e3f5bc44610d6c8c62117cb3831a07f4a8bddb0eaed1d46b0289b15de1aa4dcc17d71be96a09e66ba4dc4627c78705" }, { "secret_key": "1ced574529b9b416977e92eb39448a8717cac2934a243a5c44fb44b73ccc16da", "public_key": "85e167d5f062fee82014f3c8b1beaed8eefb2c22d8649c424b86b21b11eb8bda", "message": "1b3b953cce6d15303c61ca707609f70e7250f6c0deba56a8ce522b5986689651cdb848b842b2229661b8eeabfb8570749ed6c2b10a8fbf515053b5ea7d7a9228349e4646f9505e198029fec9ce0f38e4e0ca73625842d64caf8ced070a6e29c743586aa3db6d82993ac71fd38b783162d8fe04ffd0fa5cbc381d0e219c91937df6c973912fc02fda5377312468274c4bee6dca7f79c8b544861ed5babcf5c50e1473491be01708ac7c9ff58f1e40f855497ce9d7cc47b9410f2edd00f6496740243b8d03b2f5fa742b9c630867f77ac42f2b62c14e5ebddc7b647a05fff43670745f2851eff4909f5d27d57ae87f61e965ee60fdf97724c59267f2610b7ad5de919856d64d7c212659ce8656149b6a6d29d8f92b312be50b6e2a431d36ae022b00a6fe360e3af65432899c43be0427e36d21cfec81f21aa53b33db5ed2c37da8f96ac3e7dc67a1de37546cf7de1008c7e1adbe0f34fa7eb2434d94e6a13f4cf86a98d497622f", "signed": "e0303aefe08a77738dcc657afbb9b835ed279613a53c73fdc5ddbfb350e5cff4d6c9bb43dc07c95bf4e23b64c40f8804c7169952e3c8d59a7197241bfed0740f1b3b953cce6d15303c61ca707609f70e7250f6c0deba56a8ce522b5986689651cdb848b842b2229661b8eeabfb8570749ed6c2b10a8fbf515053b5ea7d7a9228349e4646f9505e198029fec9ce0f38e4e0ca73625842d64caf8ced070a6e29c743586aa3db6d82993ac71fd38b783162d8fe04ffd0fa5cbc381d0e219c91937df6c973912fc02fda5377312468274c4bee6dca7f79c8b544861ed5babcf5c50e1473491be01708ac7c9ff58f1e40f855497ce9d7cc47b9410f2edd00f6496740243b8d03b2f5fa742b9c630867f77ac42f2b62c14e5ebddc7b647a05fff43670745f2851eff4909f5d27d57ae87f61e965ee60fdf97724c59267f2610b7ad5de919856d64d7c212659ce8656149b6a6d29d8f92b312be50b6e2a431d36ae022b00a6fe360e3af65432899c43be0427e36d21cfec81f21aa53b33db5ed2c37da8f96ac3e7dc67a1de37546cf7de1008c7e1adbe0f34fa7eb2434d94e6a13f4cf86a98d497622f", "signature": "e0303aefe08a77738dcc657afbb9b835ed279613a53c73fdc5ddbfb350e5cff4d6c9bb43dc07c95bf4e23b64c40f8804c7169952e3c8d59a7197241bfed0740f" }, { "secret_key": "f0790d93e2d3b84f61ef4c807147aba410e415e72b71b0d61d01026fed99da3d", "public_key": "efdf649fb033cf328e0b287796f8a25e9c6e2e871b33c2c21a4028a8a25a4b28", "message": "7973e9f32d74805992eb65da0d637335e50eff0ce68ea2d1f3a02de704492b9cfbe7e7ba96fdb42bb821a513d73fc60402e92c855deaed73ffeaf70952029062c833e14ec1b14f144e2207f6a0e727e5a7e3cbab27d5972970f69518a15b093e740cc0ce11bf5248f0826b8a98bde8bf2c7082c97aff158d08371118c89021cc3974ae8f76d86673c3f824b62c79c4b41f40eaa8943738f03300f68cbe175468eb235a9ff0e6537f8714e97e8f08ca444e41191063b5fabd156e85dcf66606b81dad4a95065584b3e0658c20a706eaf4a0777da4d2e0cd2a0fca60109c2b4403db3f03cd4781c1fbb0272202bcb11687808c50cb98f64b7f3fd3d43333bb5a061b9e377090abb1e0a885cb26b73c163e63ff6451ff2f4ec8249c7e152bd03973a1e964e2b5b235281a938399a112a24529e383a560dc50bb1b622ad74ef35658dcb10ffe022568ac3ffae5b465a8ed7643e8561b352ee9944a35d882c712b187788a0abae5a22f", "signed": "08773a6a78762cbb1e25fcbb29139941bdf16f4e09a1fa08fc701f32f933edd74c0ae983c12a0a5b020b6bcf44bb719dde8ed0781a8298265640e1608c98b3017973e9f32d74805992eb65da0d637335e50eff0ce68ea2d1f3a02de704492b9cfbe7e7ba96fdb42bb821a513d73fc60402e92c855deaed73ffeaf70952029062c833e14ec1b14f144e2207f6a0e727e5a7e3cbab27d5972970f69518a15b093e740cc0ce11bf5248f0826b8a98bde8bf2c7082c97aff158d08371118c89021cc3974ae8f76d86673c3f824b62c79c4b41f40eaa8943738f03300f68cbe175468eb235a9ff0e6537f8714e97e8f08ca444e41191063b5fabd156e85dcf66606b81dad4a95065584b3e0658c20a706eaf4a0777da4d2e0cd2a0fca60109c2b4403db3f03cd4781c1fbb0272202bcb11687808c50cb98f64b7f3fd3d43333bb5a061b9e377090abb1e0a885cb26b73c163e63ff6451ff2f4ec8249c7e152bd03973a1e964e2b5b235281a938399a112a24529e383a560dc50bb1b622ad74ef35658dcb10ffe022568ac3ffae5b465a8ed7643e8561b352ee9944a35d882c712b187788a0abae5a22f", "signature": "08773a6a78762cbb1e25fcbb29139941bdf16f4e09a1fa08fc701f32f933edd74c0ae983c12a0a5b020b6bcf44bb719dde8ed0781a8298265640e1608c98b301" }, { "secret_key": "4cb9df7ce6fae9d62ba09e8eb70e4c969bdeafcb5ec7d7024326e6603b0621bf", "public_key": "018069dd0eb44055a35cd8c77c37ca9fb1ad2417271385e134b2f4e81f52033c", "message": "14627d6ea0e7895460759476dc74c42800ceef994327518151490d9df23067914e44788a12768ccb25471b9c3ba9d14fb436dcba38429b3a0456877763c49175d0e082683e07a9058f3685c6279307b2303d1221b9c29793d8a4877f6df51587384dadf751c5f7bfbd207d519622c37b51ceeee2c20d8269f8cb88d3fe43d6d434d5bbd0e203c1532d97ba552147227496c87f67b50bb76193add0144df1c176657585408362ca2ed04ad62acf1c25e341dfd1498d85b4b1349a8b0b9b02c43523c55853419bfed37d5a2cdf17dfbf1a3bd7759d6ae180f9d27dcd9a8933e29a7c0a30771eea7c2e0fa242925d2336dce585629057d844323964f6d3d11ff0b3f829a3be8c9f0468a6823d8e70ab5a2da21e15fa8b041a29812222e9c30b2bd9a12d1fdee6f87876e8ce81009637a8bb2236129a47ca74289ee4aad429ffe29f47430241ca8cc3848b7200fd6e1470651a9a0a6f72c9033e831df051408a6260f65cbaf6e012b18e", "signed": "e33c07836c537d6bfbd0f4592d6e35b163499ba78dc7ffcec565d04f9a7db781943e29e6ce76763e9baddf57437fd9c6b03239a6e6850e4502a356c2e12c370514627d6ea0e7895460759476dc74c42800ceef994327518151490d9df23067914e44788a12768ccb25471b9c3ba9d14fb436dcba38429b3a0456877763c49175d0e082683e07a9058f3685c6279307b2303d1221b9c29793d8a4877f6df51587384dadf751c5f7bfbd207d519622c37b51ceeee2c20d8269f8cb88d3fe43d6d434d5bbd0e203c1532d97ba552147227496c87f67b50bb76193add0144df1c176657585408362ca2ed04ad62acf1c25e341dfd1498d85b4b1349a8b0b9b02c43523c55853419bfed37d5a2cdf17dfbf1a3bd7759d6ae180f9d27dcd9a8933e29a7c0a30771eea7c2e0fa242925d2336dce585629057d844323964f6d3d11ff0b3f829a3be8c9f0468a6823d8e70ab5a2da21e15fa8b041a29812222e9c30b2bd9a12d1fdee6f87876e8ce81009637a8bb2236129a47ca74289ee4aad429ffe29f47430241ca8cc3848b7200fd6e1470651a9a0a6f72c9033e831df051408a6260f65cbaf6e012b18e", "signature": "e33c07836c537d6bfbd0f4592d6e35b163499ba78dc7ffcec565d04f9a7db781943e29e6ce76763e9baddf57437fd9c6b03239a6e6850e4502a356c2e12c3705" }, { "secret_key": "a136e009d53e5ef59d0946bc175663a86bc0fcd29eadd95cfc9d266037b1e4fb", "public_key": "9c1806ec0454f58314eb8397d64287dee386640d8491aba364607688841715a0", "message": "a49d1c3d49e13c2eda56868a8824aa9f8d2bf72f21955ebafd07b3bdc8e924de20936cee513d8a64a47173a3bd659eff1accff8244b26aae1a0c27fa891bf4d85e8fb1b76a6cab1e7f74c89ee07bb40d714326f09b3fd40632fad208ea816f9072028c14b5b54ecc1c5b7fc809e7e0786e2f11495e76017eb62aa4563f3d00ee84348d9838cd17649f6929a6d206f60e6fc82e0c3464b27e0e6abd22f4469bdfd4cb54f77e329b80f71bf42129ec13c9dfe192adfaa42ee3ddeeda385816fbad5f411938c63b560f4ecd94534be7d98725cd94c99ce492f0f069ba0ec08f877a7812ef27ae19d7a77be63f66bcf8d6cf3a1a61fc9cfef104c7462a21ca7f03afb5bb1ac8c75124b554e8d044b810d95ff8c9dd09a34484d8c4b6c95f95c3c22823f52ce844293724d5259191f1ba0929e2acdbb8b9a7a8adf0c52e78acdfdf057b0985881afbed4dbebdebbdae0a2b63bd4e90f96afdcbbd78f506309f9bdb650013cb73faed73904e", "signed": "bc094ba91c115dee15d753361a75f3f03d6af45c92157e95dbe8d32194b6c5ce72b9dc66f73df12dca0b639f3e791d478616a1f8d7359a42c8eae0dda16b1606a49d1c3d49e13c2eda56868a8824aa9f8d2bf72f21955ebafd07b3bdc8e924de20936cee513d8a64a47173a3bd659eff1accff8244b26aae1a0c27fa891bf4d85e8fb1b76a6cab1e7f74c89ee07bb40d714326f09b3fd40632fad208ea816f9072028c14b5b54ecc1c5b7fc809e7e0786e2f11495e76017eb62aa4563f3d00ee84348d9838cd17649f6929a6d206f60e6fc82e0c3464b27e0e6abd22f4469bdfd4cb54f77e329b80f71bf42129ec13c9dfe192adfaa42ee3ddeeda385816fbad5f411938c63b560f4ecd94534be7d98725cd94c99ce492f0f069ba0ec08f877a7812ef27ae19d7a77be63f66bcf8d6cf3a1a61fc9cfef104c7462a21ca7f03afb5bb1ac8c75124b554e8d044b810d95ff8c9dd09a34484d8c4b6c95f95c3c22823f52ce844293724d5259191f1ba0929e2acdbb8b9a7a8adf0c52e78acdfdf057b0985881afbed4dbebdebbdae0a2b63bd4e90f96afdcbbd78f506309f9bdb650013cb73faed73904e", "signature": "bc094ba91c115dee15d753361a75f3f03d6af45c92157e95dbe8d32194b6c5ce72b9dc66f73df12dca0b639f3e791d478616a1f8d7359a42c8eae0dda16b1606" }, { "secret_key": "ff0f1c57dd884fbeea6e2917282b79ba67f8a6851267b9f4636dafda33bd2b5b", "public_key": "fef6378ad12a7c252fa6eb742b05064b41530ff019dc680ab544c027ea2836e7", "message": "522a5e5eff5b5e98fad6878a9d72df6eb318622610a1e1a48183f5590ecef5a6df671b28be91c88cdf7ae2881147fe6c37c28b43f64cf981c455c59e765ce94e1b6491631deaeef6d1da9ebca88643c77f83eae2cfdd2d97f604fe45081d1be5c4ae2d875996b8b6fecd707d3fa219a93ba0488e55247b405e330cfb97d31a1361c9b2084bdb13fb0c058925db8c3c649c9a3e937b533cc6310fa3b16126fb3cc9bb2b35c5c8300015488a30fadca3c8871fa70dfdc7055bf8e631f20c9b2528311e324a7c4edd5462079f3441c9ecf55fa999e731372344fdc0d413e417aaa001a1b2d3d9bc000fec1b02bd7a88a812d9d8a66f9464764c070c93041eefb17ce74eff6d4aff75f0cbf6a789a9ecde74abe33130fca0da853aa7c3313ada3f0ae2f595c6796a93685e729dd18a669d6381825ab3f36a391e7525b2a807a52fa5ec2a030a8cf3b77337ac41fceb580e845eed655a48b547238c2e8137c92f8c27e585caad3106eee3814a", "signed": "d5008486726cce330a29dd7e4d7474d735798201afd1206feb869a112e5b43523c06976761be3cf9b2716378273c94f93572a7d2b8982634e0755c632b449008522a5e5eff5b5e98fad6878a9d72df6eb318622610a1e1a48183f5590ecef5a6df671b28be91c88cdf7ae2881147fe6c37c28b43f64cf981c455c59e765ce94e1b6491631deaeef6d1da9ebca88643c77f83eae2cfdd2d97f604fe45081d1be5c4ae2d875996b8b6fecd707d3fa219a93ba0488e55247b405e330cfb97d31a1361c9b2084bdb13fb0c058925db8c3c649c9a3e937b533cc6310fa3b16126fb3cc9bb2b35c5c8300015488a30fadca3c8871fa70dfdc7055bf8e631f20c9b2528311e324a7c4edd5462079f3441c9ecf55fa999e731372344fdc0d413e417aaa001a1b2d3d9bc000fec1b02bd7a88a812d9d8a66f9464764c070c93041eefb17ce74eff6d4aff75f0cbf6a789a9ecde74abe33130fca0da853aa7c3313ada3f0ae2f595c6796a93685e729dd18a669d6381825ab3f36a391e7525b2a807a52fa5ec2a030a8cf3b77337ac41fceb580e845eed655a48b547238c2e8137c92f8c27e585caad3106eee3814a", "signature": "d5008486726cce330a29dd7e4d7474d735798201afd1206feb869a112e5b43523c06976761be3cf9b2716378273c94f93572a7d2b8982634e0755c632b449008" }, { "secret_key": "0bc6af64de5709d3dbc28f7ef6d3fe28b6de529f08f5857ccb910695de454f56", "public_key": "fb491fc900237bdc7e9a119f27150cd911935cd3628749ff40ef41f3955bc8ac", "message": "ac7886e4f4172a22c95e8eea37437b375d72accedcee6cc6e816763301a2d8ef4d6f31a2c1d635818b7026a395ce0dafd71c5180893af76b7ea056c972d680eca01dcbdbae6b26f1c5f33fc988b824fbbe00cacc316469a3bae07aa7c8885af7f65f42e75cef94dbb9aab4825143c85070e7716b7612f64ef0b0166011d23eb5654aa098b02d8d71e57c8fa17bff2fe97dc8193177eadc09fb192d80aa92afa98720d4614817ff3c39d3acce18906fa3de09618931d0d7a60c4429cbfa20cf165c947929ac293ae6c06e7e8f25f1264291e3e1c98f5d93e6ecc2389bc60dbbf4a621b132c552a99c95d26d8d1af61138b570a0de4b497ebe8051c7273a98e6e7876d0b327503af3cb2cc4091ce1925cb2f2957f4ec56ee90f8a09dd57d6e83067a356a4cfe65b1b7a4465da2ab133b0efb5e7d4dbb811bcbbde712afbf0f7dd3f326222284b8c74eac7ad6257fa8c632b7da2559a6266e91e0ef90dbb0aa968f75376b693fcaa5da342221", "signed": "dbc7134d1cd6b0813b53352714b6df939498e91cf37c324337d9c088a1b998347d26185b430900412929e4f63e910379fc42e355a4e98f6fee27dafad1957206ac7886e4f4172a22c95e8eea37437b375d72accedcee6cc6e816763301a2d8ef4d6f31a2c1d635818b7026a395ce0dafd71c5180893af76b7ea056c972d680eca01dcbdbae6b26f1c5f33fc988b824fbbe00cacc316469a3bae07aa7c8885af7f65f42e75cef94dbb9aab4825143c85070e7716b7612f64ef0b0166011d23eb5654aa098b02d8d71e57c8fa17bff2fe97dc8193177eadc09fb192d80aa92afa98720d4614817ff3c39d3acce18906fa3de09618931d0d7a60c4429cbfa20cf165c947929ac293ae6c06e7e8f25f1264291e3e1c98f5d93e6ecc2389bc60dbbf4a621b132c552a99c95d26d8d1af61138b570a0de4b497ebe8051c7273a98e6e7876d0b327503af3cb2cc4091ce1925cb2f2957f4ec56ee90f8a09dd57d6e83067a356a4cfe65b1b7a4465da2ab133b0efb5e7d4dbb811bcbbde712afbf0f7dd3f326222284b8c74eac7ad6257fa8c632b7da2559a6266e91e0ef90dbb0aa968f75376b693fcaa5da342221", "signature": "dbc7134d1cd6b0813b53352714b6df939498e91cf37c324337d9c088a1b998347d26185b430900412929e4f63e910379fc42e355a4e98f6fee27dafad1957206" }, { "secret_key": "2f5e83bd5b412e71ae3e9084cd369efcc79bf6037c4b174dfd6a11fb0f5da218", "public_key": "a22a6da29a5ef6240c49d8896e3a0f1a4281a266c77d383ee6f9d25ffacbb872", "message": "b766273f060ef3b2ae3340454a391b426bc2e97264f8674553eb00dd6ecfdd59b611d8d662929fec710d0e462020e12cdbf9c1ec8858e85671acf8b7b14424ce92079d7d801e2ad9acac036bc8d2dfaa72aa839bff30c0aa7e414a882c00b645ff9d31bcf5a54382def4d0142efa4f06e823257ff132ee968cdc6738c53f53b84c8df76e9f78dd5056cf3d4d5a80a8f84e3edec48520f2cb4583e708539355ef7aa86fb5a0e87a94dcf14f30a2cca568f139d9ce59eaf459a5c5916cc8f20b26aaf6c7c029379aedb05a07fe585ccac60307c1f58ca9f859157d06d06baa394aace79d51b8cb38cfa2598141e245624e5ab9b9d68731173348905315bf1a5ad61d1e8adaeb810e4e8a86d7c13537b0be860ab2ed35b73399b8808aa91d750f77943f8a8b7e89fdb50728aa3dbbd8a41a6e00756f438c9b9e9d55872df5a9068add8a972b7e43edad9ced2237ca1367be4b7cdb66a54ea12eef129471158610eaf28f99f7f686557dcdf644ea", "signed": "9f80922bc8db32d0cc43f9936affebe7b2bc35a5d82277cd187b5d50dc7fc4c4832fffa34e9543806b485c04548e7c75429425e14d55d91fc1052efd8667430bb766273f060ef3b2ae3340454a391b426bc2e97264f8674553eb00dd6ecfdd59b611d8d662929fec710d0e462020e12cdbf9c1ec8858e85671acf8b7b14424ce92079d7d801e2ad9acac036bc8d2dfaa72aa839bff30c0aa7e414a882c00b645ff9d31bcf5a54382def4d0142efa4f06e823257ff132ee968cdc6738c53f53b84c8df76e9f78dd5056cf3d4d5a80a8f84e3edec48520f2cb4583e708539355ef7aa86fb5a0e87a94dcf14f30a2cca568f139d9ce59eaf459a5c5916cc8f20b26aaf6c7c029379aedb05a07fe585ccac60307c1f58ca9f859157d06d06baa394aace79d51b8cb38cfa2598141e245624e5ab9b9d68731173348905315bf1a5ad61d1e8adaeb810e4e8a86d7c13537b0be860ab2ed35b73399b8808aa91d750f77943f8a8b7e89fdb50728aa3dbbd8a41a6e00756f438c9b9e9d55872df5a9068add8a972b7e43edad9ced2237ca1367be4b7cdb66a54ea12eef129471158610eaf28f99f7f686557dcdf644ea", "signature": "9f80922bc8db32d0cc43f9936affebe7b2bc35a5d82277cd187b5d50dc7fc4c4832fffa34e9543806b485c04548e7c75429425e14d55d91fc1052efd8667430b" }, { "secret_key": "722a2da50e42c11a61c9afac7be1a2fed2267d650f8f7d8e5bc706b807c1b91d", "public_key": "fd0b964562f823721e649c3fedb432a76f91e0aead7c61d35f95ed7726d78589", "message": "173e8bb885e1f9081404acac999041d2ecfcb73f945e0db36e631d7cd1ab999eb717f34bf07874bf3d34e2530eb6085f4a9f88ae1b0f7d80f221456a8e9a8890b91a50192deaaacc0a1a615a87841e2c5a9e057957af6e48e78cc86198e32e7aa24dcf6cffa329bc72606d65b11682c8ba736cce22a05785df1146331e41609cf9ca711cf464958297138b58a9073f3bbf06ad8a85d135de66652104d88b49d27ad41e59bcc44c7fab68f53f0502e293ffcabaaf755927dfdffbfde3b35c080b5de4c8b785f4da64ef357bc0d1466a6a96560c3c4f3e3c0b563a003f5f95f237171bce1a001771a04ede7cdd9b8ca770fd36ef90e9fe0000a8d7685fd153cc7282de95920a8f8f0898d00bf0c6c933fe5bb9653ff146c4e2acd1a2e0c23c1244844dacf8652716302c2032f9c114679ed26b3ee3ab4a7b18bc4e3071f0977db57cd0ac68c0727a09b4f125fb64af2850b26c8a484263334e2da902d744737044e79ab1cf5b2f93a022b63d40cd", "signed": "c2695a57172aaa31bd0890f231ca8eeec0287a87172669a899ad0891cea4c47579b50420e791cdec8c182c8a0e8dde21b2480b0cfd8111e28e5603347a352d04173e8bb885e1f9081404acac999041d2ecfcb73f945e0db36e631d7cd1ab999eb717f34bf07874bf3d34e2530eb6085f4a9f88ae1b0f7d80f221456a8e9a8890b91a50192deaaacc0a1a615a87841e2c5a9e057957af6e48e78cc86198e32e7aa24dcf6cffa329bc72606d65b11682c8ba736cce22a05785df1146331e41609cf9ca711cf464958297138b58a9073f3bbf06ad8a85d135de66652104d88b49d27ad41e59bcc44c7fab68f53f0502e293ffcabaaf755927dfdffbfde3b35c080b5de4c8b785f4da64ef357bc0d1466a6a96560c3c4f3e3c0b563a003f5f95f237171bce1a001771a04ede7cdd9b8ca770fd36ef90e9fe0000a8d7685fd153cc7282de95920a8f8f0898d00bf0c6c933fe5bb9653ff146c4e2acd1a2e0c23c1244844dacf8652716302c2032f9c114679ed26b3ee3ab4a7b18bc4e3071f0977db57cd0ac68c0727a09b4f125fb64af2850b26c8a484263334e2da902d744737044e79ab1cf5b2f93a022b63d40cd", "signature": "c2695a57172aaa31bd0890f231ca8eeec0287a87172669a899ad0891cea4c47579b50420e791cdec8c182c8a0e8dde21b2480b0cfd8111e28e5603347a352d04" }, { "secret_key": "5fe9c3960ed5bd374cc94d42357e6a24dc7e3060788f726365defacf13cd12da", "public_key": "0ce7b155c8b20ebdaacdc2aa23627e34b1f9ace980650a2530c7607d04814eb4", "message": "c9490d83d9c3a9370f06c91af001685a02fe49b5ca667733fff189eee853ec1667a6c1b6c787e9244812d2d532866ab74dfc870d6f14033b6bcd39852a3900f8f08cd95a74cb8cbe02b8b8b51e993a06adfebd7fc9854ae5d29f4df9642871d0c5e470d903cfbcbd5adb3275628f28a80bf8c0f0376687dae673bf7a8547e80d4a9855ae2572fc2b205dc8a198016ddc9b50995f5b39f368f540504a551803d6dd5f874828e5541ded052894d9e2dc5e6aa351087e790c0dd5d9c4decb217e4db81c98a184b264e6daeac0f11e074cae2bfc899f54b419c65dcc22664a915fbfffac35cee0f286eb7b144933db933e16c4bcb650d537722489de236373fd8d65fc86118b6def37ca4608bc6ce927b65436ffda7f02bfbf88b045ae7d2c2b45a0b30c8f2a04df953221088c555fe9a5df260982a3d64df194ee952fa9a98c31b96493db6180d13d67c36716f95f8c0bd7a039ad990667ca34a83ac1a18c37dd7c7736aa6b9b6fc2b1ac0ce119ef77", "signed": "379f9c54c413af0d192e9bc736b29da9d521e7ba7841d309f9bcc1e742ec4308fe9f7ba51e0b22aed487cb4aa3913b9bebfb3aacd38f4039f9bbbebe1ad80002c9490d83d9c3a9370f06c91af001685a02fe49b5ca667733fff189eee853ec1667a6c1b6c787e9244812d2d532866ab74dfc870d6f14033b6bcd39852a3900f8f08cd95a74cb8cbe02b8b8b51e993a06adfebd7fc9854ae5d29f4df9642871d0c5e470d903cfbcbd5adb3275628f28a80bf8c0f0376687dae673bf7a8547e80d4a9855ae2572fc2b205dc8a198016ddc9b50995f5b39f368f540504a551803d6dd5f874828e5541ded052894d9e2dc5e6aa351087e790c0dd5d9c4decb217e4db81c98a184b264e6daeac0f11e074cae2bfc899f54b419c65dcc22664a915fbfffac35cee0f286eb7b144933db933e16c4bcb650d537722489de236373fd8d65fc86118b6def37ca4608bc6ce927b65436ffda7f02bfbf88b045ae7d2c2b45a0b30c8f2a04df953221088c555fe9a5df260982a3d64df194ee952fa9a98c31b96493db6180d13d67c36716f95f8c0bd7a039ad990667ca34a83ac1a18c37dd7c7736aa6b9b6fc2b1ac0ce119ef77", "signature": "379f9c54c413af0d192e9bc736b29da9d521e7ba7841d309f9bcc1e742ec4308fe9f7ba51e0b22aed487cb4aa3913b9bebfb3aacd38f4039f9bbbebe1ad80002" }, { "secret_key": "ec2fa541ac14b414149c3825eaa7001b795aa1957d4040dda92573904afa7ee4", "public_key": "71b363b2408404d7beecdef1e1f511bb6084658b532f7ea63d4e3f5f01c61d31", "message": "2749fc7c4a729e0e0ad71b5b74eb9f9c534ebd02ffc9df4374d813bdd1ae4eb87f1350d5fdc563934515771763e6c33b50e64e0cd114573031d2186b6eca4fc802cddc7cc51d92a61345a17f6ac38cc74d84707a5156be9202dee3444652e79bae7f0d31bd17567961f65dd01a8e4bee38331938ce4b2b550691b99a4bc3c072d186df4b3344a5c8fbfbb9fd2f355f6107e410c3d0c798b68d3fb9c6f7ab5fe27e70871e86767698fe35b77ead4e435a9402cc9ed6a2657b059be0a21003c048bbf5e0ebd93cbb2e71e923cf5c728d1758cd817ad74b454a887126d653b95a7f25e5293b768c9fc5a9c35a2372e3741bc90fd66301427b10824bb4b1e9110bfba84c21a40eb8fed4497e91dc3ffd0438c514c0a8cb4cac6ad0256bf11d5aa7a9c7c00b669b015b0bf81425a21413e2ffb6edc0bd78e385c44fd74558e511c2c25fee1fec18d3990b8690300fa711e93d9854668f0187065e76e7113ae763c30ddd86720b5546a6c3c6f1c43bc67b14", "signed": "84d18d56f964e3776759bba92c510c2b6d574555c3cddade212da90374554991e7d77e278d63e34693e1958078cc3685f8c41c1f5342e351899638ef612114012749fc7c4a729e0e0ad71b5b74eb9f9c534ebd02ffc9df4374d813bdd1ae4eb87f1350d5fdc563934515771763e6c33b50e64e0cd114573031d2186b6eca4fc802cddc7cc51d92a61345a17f6ac38cc74d84707a5156be9202dee3444652e79bae7f0d31bd17567961f65dd01a8e4bee38331938ce4b2b550691b99a4bc3c072d186df4b3344a5c8fbfbb9fd2f355f6107e410c3d0c798b68d3fb9c6f7ab5fe27e70871e86767698fe35b77ead4e435a9402cc9ed6a2657b059be0a21003c048bbf5e0ebd93cbb2e71e923cf5c728d1758cd817ad74b454a887126d653b95a7f25e5293b768c9fc5a9c35a2372e3741bc90fd66301427b10824bb4b1e9110bfba84c21a40eb8fed4497e91dc3ffd0438c514c0a8cb4cac6ad0256bf11d5aa7a9c7c00b669b015b0bf81425a21413e2ffb6edc0bd78e385c44fd74558e511c2c25fee1fec18d3990b8690300fa711e93d9854668f0187065e76e7113ae763c30ddd86720b5546a6c3c6f1c43bc67b14", "signature": "84d18d56f964e3776759bba92c510c2b6d574555c3cddade212da90374554991e7d77e278d63e34693e1958078cc3685f8c41c1f5342e351899638ef61211401" }, { "secret_key": "6132692a5ef27bf476b1e991e6c431a8c764f1aebd470282db3321bb7cb09c20", "public_key": "7a2d166184f9e5f73bea454486b041ceb5fc2314a7bd59cb718e79f0ec989d84", "message": "a9c0861665d8c2de06f9301da70afb27b3024b744c6b38b24259294c97b1d1cb4f0dcf7575a8ed454e2f0980f50313a77363415183fe9677a9eb1e06cb6d34a467cb7b0758d6f55c564b5ba15603e202b18856d89e72a23ab07d8853ff77da7aff1caebd7959f2c710ef31f5078a9f2cdae92641a1cc5f74d0c143ec42afbaa5f378a9e10d5bf74587fa5f49c156233247dafd3929acde888dc684337e40cdc5932e7eb73ffcc90b85c0ad460416691aefbd7efd07b657c350946a0e366b37a6c8089aba5c5fe3bbca064afbe9d47fbc83914af1cb43c2b2efa98e0a43be32ba823202001def36817251b65f9b0506cef6683642a46ed612f8ca81ee97bb04d317b517343ade2b77126d1f02a87b7604c8653b6748cf5488fa6d43df809faa19e69292d38c5d397dd8e20c7af7c5334ec977f5010a0f7cb5b89479ca06db4d12627f067d6c42186a6b1f8742f36ae709ba720e3cd898116666d81b190b9b9d2a72202cb690a03f3310429a71dc048cde", "signed": "eb677f3347e1a1ea929efdf62bf9105a6c8f4993033b4f6d03cb0dbf9c742b270704e383ab7c0676bdb1ad0ce9b16673083c9602ec10ae1dd98e8748b336440ba9c0861665d8c2de06f9301da70afb27b3024b744c6b38b24259294c97b1d1cb4f0dcf7575a8ed454e2f0980f50313a77363415183fe9677a9eb1e06cb6d34a467cb7b0758d6f55c564b5ba15603e202b18856d89e72a23ab07d8853ff77da7aff1caebd7959f2c710ef31f5078a9f2cdae92641a1cc5f74d0c143ec42afbaa5f378a9e10d5bf74587fa5f49c156233247dafd3929acde888dc684337e40cdc5932e7eb73ffcc90b85c0ad460416691aefbd7efd07b657c350946a0e366b37a6c8089aba5c5fe3bbca064afbe9d47fbc83914af1cb43c2b2efa98e0a43be32ba823202001def36817251b65f9b0506cef6683642a46ed612f8ca81ee97bb04d317b517343ade2b77126d1f02a87b7604c8653b6748cf5488fa6d43df809faa19e69292d38c5d397dd8e20c7af7c5334ec977f5010a0f7cb5b89479ca06db4d12627f067d6c42186a6b1f8742f36ae709ba720e3cd898116666d81b190b9b9d2a72202cb690a03f3310429a71dc048cde", "signature": "eb677f3347e1a1ea929efdf62bf9105a6c8f4993033b4f6d03cb0dbf9c742b270704e383ab7c0676bdb1ad0ce9b16673083c9602ec10ae1dd98e8748b336440b" }, { "secret_key": "f219b2101164aa9723bde3a7346f68a35061c01f9782072580ba32df903ba891", "public_key": "f66b920d5aa1a6085495a1480539beba01ffe60e6a6388d1b2e8eda23355810e", "message": "015577d3e4a0ec1ab25930106343ff35ab4f1e0a8a2d844aadbb70e5fc5348ccb679c2295c51d702aaae7f6273ce70297b26cb7a253a3db94332e86a15b4a64491232791f7a8b082ee2834af30400e804647a532e9c454d2a0a7320130ab6d4d860073a34667ac25b7e5e2747ba9f5c94594fb68377ae260369c40713b4e32f23195bf91d3d7f1a2719bf408aad8d8a347b112e84b118817cb06513344021763035272a7db728a0ccdaa949c61715d0764140b3e8c01d20ff1593c7f2d55c4e82a1c0cb1ea58442bf80a741bca91f58ab0581b498ee9fe3c92ca654148ef75313543d1aff382befe1a93b02190ce0102175158e2071d02bacad8dbe9fb940fcb610c105ad52c80feb1ec4e524f4c0ec7983e9ce696fa4fcf4bf0514b8f0432b17d5448fc426fea2b01ac7b26c2aed769927534da22576fc1bba726e9d65be01b59f60a648ace2fc3e5e275789fa637cbbd84be3d6ac24457a6292cd656c7b569a52ffea7916b8d04b4f4a75be7ac95142f", "signed": "17f0127ca3bafa5f4ee959cd60f772be87a0034961517e39a0a1d0f4b9e26db1336e60c82b352c4cbacdbbd11771c3774f8cc5a1a795d6e4f4ebd51def36770b015577d3e4a0ec1ab25930106343ff35ab4f1e0a8a2d844aadbb70e5fc5348ccb679c2295c51d702aaae7f6273ce70297b26cb7a253a3db94332e86a15b4a64491232791f7a8b082ee2834af30400e804647a532e9c454d2a0a7320130ab6d4d860073a34667ac25b7e5e2747ba9f5c94594fb68377ae260369c40713b4e32f23195bf91d3d7f1a2719bf408aad8d8a347b112e84b118817cb06513344021763035272a7db728a0ccdaa949c61715d0764140b3e8c01d20ff1593c7f2d55c4e82a1c0cb1ea58442bf80a741bca91f58ab0581b498ee9fe3c92ca654148ef75313543d1aff382befe1a93b02190ce0102175158e2071d02bacad8dbe9fb940fcb610c105ad52c80feb1ec4e524f4c0ec7983e9ce696fa4fcf4bf0514b8f0432b17d5448fc426fea2b01ac7b26c2aed769927534da22576fc1bba726e9d65be01b59f60a648ace2fc3e5e275789fa637cbbd84be3d6ac24457a6292cd656c7b569a52ffea7916b8d04b4f4a75be7ac95142f", "signature": "17f0127ca3bafa5f4ee959cd60f772be87a0034961517e39a0a1d0f4b9e26db1336e60c82b352c4cbacdbbd11771c3774f8cc5a1a795d6e4f4ebd51def36770b" }, { "secret_key": "fc180035aec0f5ede7bda93bf77ade7a81ed06de07ee2e3aa8576be81608610a", "public_key": "4f215e948cae243ee3143b80282ad792c780d2a6b75060ca1d290ca1a8e3151f", "message": "b5e8b01625664b222339e0f05f93a990ba48b56ae65439a17520932df011721e284dbe36f98631c066510098a68d7b692a3863e99d58db76ca5667c8043cb10bd7abbaf506529fbb23a5166be038affdb9a234c4f4fcf43bddd6b8d2ce772dd653ed115c095e232b269dd4888d2368cb1c66be29dd383fca67f66765b296564e37555f0c0e484504c591f006ea8533a12583ad2e48318ff6f324ecaf804b1bae04aa896743e67ef61ca383d58e42acfc6410de30776e3ba262373b9e1441943955101a4e768231ad9c6529eff6118dde5df02f94b8d6df2d99f27863b517243a579e7aaff311ea3a0282e47ca876fabc2280fce7adc984dd0b30885b1650f1471dfcb0522d49fec7d042f32a93bc368f076006ea01ec1c7412bf66f62dc88de2c0b74701a5614e855e9fa728fb1f1171385f96afbde70dea02e9aa94dc21848c26302b50ae91f9693a1864e4e095ae03cdc22ad28a0eb7db596779246712fab5f5da327efec3e79612de0a6ccaa536759b8e", "signed": "a43a71c3a19c35660dae6f31a254b8c0ea3593fc8fca74d13640012b9e9473d4afe070db01e7fb399bf4ca6070e062180011285a67dd6858b761e46c6bd32004b5e8b01625664b222339e0f05f93a990ba48b56ae65439a17520932df011721e284dbe36f98631c066510098a68d7b692a3863e99d58db76ca5667c8043cb10bd7abbaf506529fbb23a5166be038affdb9a234c4f4fcf43bddd6b8d2ce772dd653ed115c095e232b269dd4888d2368cb1c66be29dd383fca67f66765b296564e37555f0c0e484504c591f006ea8533a12583ad2e48318ff6f324ecaf804b1bae04aa896743e67ef61ca383d58e42acfc6410de30776e3ba262373b9e1441943955101a4e768231ad9c6529eff6118dde5df02f94b8d6df2d99f27863b517243a579e7aaff311ea3a0282e47ca876fabc2280fce7adc984dd0b30885b1650f1471dfcb0522d49fec7d042f32a93bc368f076006ea01ec1c7412bf66f62dc88de2c0b74701a5614e855e9fa728fb1f1171385f96afbde70dea02e9aa94dc21848c26302b50ae91f9693a1864e4e095ae03cdc22ad28a0eb7db596779246712fab5f5da327efec3e79612de0a6ccaa536759b8e", "signature": "a43a71c3a19c35660dae6f31a254b8c0ea3593fc8fca74d13640012b9e9473d4afe070db01e7fb399bf4ca6070e062180011285a67dd6858b761e46c6bd32004" }, { "secret_key": "a2836a65427912122d25dcdfc99d7046fe9b53d5c1bb23617f11890e94ca93ed", "public_key": "8c12bda214c8abb2286acffbf8112425040aab9f4d8bb7870b98da0159e882f1", "message": "813d6061c56eae0ff53041c0244aa5e29e13ec0f3fb428d4beb8a99e04bca8c41bddb0db945f487efe38f2fc14a628fafa2462f860e4e34250eb4e93f139ab1b74a2614519e41ee2403be427930ab8bc82ec89ceafb60905bd4ddbbd13bdb19654314fc92373140b962e2258e038d71b9ec66b84ef8319e03551cb707e747f6c40ad476fbefdce71f3a7b67a1af1869bc6440686e7e0855e4f369d1d88b8099fba54714678627bba1aff41e7707bc97eddf890b0c08dce3e9800d24c6f61092ce28d481b5dea5c096c55d72f8946009131fb968e2bc8a054d825adab76740dcf0d758c8bf54ff38659e71b32bfe2e615aaabb0f5293085649cf60b9847bc62011ce3878af628984a5840a4ad5dae3702db367da0f8a165fed0517eb5c442b0145330241b97eeca733ba6688b9c129a61cd1236aff0e27bcf98c28b0fbeea55a3d7c7193d644b2749f986bd46af8938e8faaeafbd9cec3612ab005bd7c3eeafe9a31279ca6102560666ba16136ff1452f850adb", "signed": "e6a9a6b436559a4320c45c0c2c4a2aedecb90d416d52c82680ac7330d062aebef3e9ac9f2c5ffa455c9be113013a2b282e5600fd306435ada83b1e48ba2a3605813d6061c56eae0ff53041c0244aa5e29e13ec0f3fb428d4beb8a99e04bca8c41bddb0db945f487efe38f2fc14a628fafa2462f860e4e34250eb4e93f139ab1b74a2614519e41ee2403be427930ab8bc82ec89ceafb60905bd4ddbbd13bdb19654314fc92373140b962e2258e038d71b9ec66b84ef8319e03551cb707e747f6c40ad476fbefdce71f3a7b67a1af1869bc6440686e7e0855e4f369d1d88b8099fba54714678627bba1aff41e7707bc97eddf890b0c08dce3e9800d24c6f61092ce28d481b5dea5c096c55d72f8946009131fb968e2bc8a054d825adab76740dcf0d758c8bf54ff38659e71b32bfe2e615aaabb0f5293085649cf60b9847bc62011ce3878af628984a5840a4ad5dae3702db367da0f8a165fed0517eb5c442b0145330241b97eeca733ba6688b9c129a61cd1236aff0e27bcf98c28b0fbeea55a3d7c7193d644b2749f986bd46af8938e8faaeafbd9cec3612ab005bd7c3eeafe9a31279ca6102560666ba16136ff1452f850adb", "signature": "e6a9a6b436559a4320c45c0c2c4a2aedecb90d416d52c82680ac7330d062aebef3e9ac9f2c5ffa455c9be113013a2b282e5600fd306435ada83b1e48ba2a3605" }, { "secret_key": "f051af426d0c3282fafc8bf912ade1c24211a95ad200e1eef549320e1cb1a252", "public_key": "fa87955e0ea13dde49d83dc22e63a2bdf1076725c2cc7f93c76511f28e7944f2", "message": "b48d9f84762b3bcc66e96d76a616fa8fe8e01695251f47cfc1b7b17d60dc9f90d576ef64ee7d388504e2c9079638165a889696471c989a876f8f13b63b58d531fea4dd1229fc631668a047bfae2da281feae1b6de3ebe280abe0a82ee00fbfdc22ce2d10e06a0492ff1404dfc094c40b203bf55721dd787ed4e91d5517aaf58d3bdd35d44a65ae6ba75619b339b650518cefcc17493de27a3b5d41788f87edbde72610f181bf06e208e0eb7cdfe881d91a2d6cc77aa19c0fcf330fedb44675d800eb8cff9505d8887544a503cbe373c4847b19e8f3995726efd6649858595c57ccaf0cbc9eb25de83ba046bc9f1838ac7b8953dd81b81ac0f68d0e9338cb55402552afb6bc16949351b926d151a82efc695e8d7da0dd55099366789718ccbf36030bd2c3c109399be26cdb8b9e2a155f3b2cb1bfa71ab69a23625a4ac118fe91cb2c19788cf52a71d730d576b421d96982a51a2991daec440cda7e6cc3282b8312714278b819bfe2387eb96aa91d40173034f428", "signed": "b8f713578a64466719aceb432fce302a87cf066bf3e102a350616921a840964bfc7e685d8fd17455ac3eb4861edcb8979d35e3a4bd82a078cd707721d733400eb48d9f84762b3bcc66e96d76a616fa8fe8e01695251f47cfc1b7b17d60dc9f90d576ef64ee7d388504e2c9079638165a889696471c989a876f8f13b63b58d531fea4dd1229fc631668a047bfae2da281feae1b6de3ebe280abe0a82ee00fbfdc22ce2d10e06a0492ff1404dfc094c40b203bf55721dd787ed4e91d5517aaf58d3bdd35d44a65ae6ba75619b339b650518cefcc17493de27a3b5d41788f87edbde72610f181bf06e208e0eb7cdfe881d91a2d6cc77aa19c0fcf330fedb44675d800eb8cff9505d8887544a503cbe373c4847b19e8f3995726efd6649858595c57ccaf0cbc9eb25de83ba046bc9f1838ac7b8953dd81b81ac0f68d0e9338cb55402552afb6bc16949351b926d151a82efc695e8d7da0dd55099366789718ccbf36030bd2c3c109399be26cdb8b9e2a155f3b2cb1bfa71ab69a23625a4ac118fe91cb2c19788cf52a71d730d576b421d96982a51a2991daec440cda7e6cc3282b8312714278b819bfe2387eb96aa91d40173034f428", "signature": "b8f713578a64466719aceb432fce302a87cf066bf3e102a350616921a840964bfc7e685d8fd17455ac3eb4861edcb8979d35e3a4bd82a078cd707721d733400e" }, { "secret_key": "a103e92672c65f81ea5da1fff1a4038788479e941d503a756f4a755201a57c1d", "public_key": "ee63a5b69641217acbaf3339da829ec071b9931e5987153514d30140837a7af4", "message": "b1984e9eec085d524c1eb3b95c89c84ae085be5dc65c326e19025e1210a1d50edbbba5d1370cf15d68d687eb113233e0fba50f9433c7d358773950c67931db8296bbcbecec888e87e71a2f7579fad2fa162b85fb97473c456b9a5ce2956676969c7bf4c45679085b62f2c224fc7f458794273f6d12c5f3e0d06951824d1cca3e2f904559ed28e2868b366d79d94dc98667b9b5924268f3e39b1291e5abe4a758f77019dacbb22bd8196e0a83a5677658836e96ca5635055a1e63d65d036a68d87ac2fd283fdda390319909c5cc7680368848873d597f298e0c6172308030ffd452bb1363617b316ed7cd949a165dc8abb53f991aef3f3e9502c5dfe4756b7c6bfdfe89f5e00febdd6afb0402818f11cf8d1d5864fe9da1b86e39aa935831506cf2400ea7ed75bd9533b23e202fe875d7d9638c89d11cb2d6e6021ae6bd27c7754810d35cd3a61494f27b16fc794e2cd2f0d3453ada933865db78c579571f8fc5c5c6be8eaffce6a852e5b3b1c524c49313d427abcb", "signed": "2aa2035c2ce5b5e6ae161e168f3ad0d6592bcf2c4a049d3ed342fceb56be9c7cb372027573ae0178e8878ebefca7b030327b8aad41857de58cb78e1a00cbac05b1984e9eec085d524c1eb3b95c89c84ae085be5dc65c326e19025e1210a1d50edbbba5d1370cf15d68d687eb113233e0fba50f9433c7d358773950c67931db8296bbcbecec888e87e71a2f7579fad2fa162b85fb97473c456b9a5ce2956676969c7bf4c45679085b62f2c224fc7f458794273f6d12c5f3e0d06951824d1cca3e2f904559ed28e2868b366d79d94dc98667b9b5924268f3e39b1291e5abe4a758f77019dacbb22bd8196e0a83a5677658836e96ca5635055a1e63d65d036a68d87ac2fd283fdda390319909c5cc7680368848873d597f298e0c6172308030ffd452bb1363617b316ed7cd949a165dc8abb53f991aef3f3e9502c5dfe4756b7c6bfdfe89f5e00febdd6afb0402818f11cf8d1d5864fe9da1b86e39aa935831506cf2400ea7ed75bd9533b23e202fe875d7d9638c89d11cb2d6e6021ae6bd27c7754810d35cd3a61494f27b16fc794e2cd2f0d3453ada933865db78c579571f8fc5c5c6be8eaffce6a852e5b3b1c524c49313d427abcb", "signature": "2aa2035c2ce5b5e6ae161e168f3ad0d6592bcf2c4a049d3ed342fceb56be9c7cb372027573ae0178e8878ebefca7b030327b8aad41857de58cb78e1a00cbac05" }, { "secret_key": "d47c1b4b9e50cbb71fd07d096d91d87213d44b024373044761c4822f9d9df880", "public_key": "f4e1cb86c8ca2cfee43e58594a8778436d3ea519704e00c1bbe48bbb1c9454f8", "message": "88d7009d51de3d337eef0f215ea66ab830ec5a9e6823761c3b92ad93ea341db92ece67f4ef4ceb84194ae6926c3d014b2d59781f02e0b32f9a611222cb9a5850c6957cb8079ae64e0832a1f05e5d1a3c572f9d08f1437f76bb3b83b52967c3d48c3576848891c9658d4959eb80656d26cdba0810037c8a18318ff122f8aa8985c773cb317efa2f557f1c3896bcb162df5d87681bb787e7813aa2dea3b0c564d646a92861f444ca1407efbac3d12432cbb70a1d0eaffb11741d3718fedee2b83036189a6fc45a52f74fa487c18fd264a7945f6c9e44b011f5d86613f1939b19f4f4fdf53234057be3f005ad64eebf3c8ffb58cb40956c4336df01d4424b706a0e561d601708d12485e21bcb6d799d8d1d044b400064ec0944501406e70253947006cabbdb2dd6bd8cee4497653d9113a44d4de9b68d4c526fca0b9b0c18fe50fb917fdd9a914fb816108a73a6b3fff9e654e69c9cfe02b05c6c1b9d15c4e65cf31018b8100d784633ee1888eee3572aafa6f189ea22d0", "signed": "627e7ca7e34ed6331d62b9541c1ea9a9292be7b0a65d805e266b5122272a82db7d765acc7e2a290d685804922f91ed04a3c382c03ff21a1768f584413c4e5f0088d7009d51de3d337eef0f215ea66ab830ec5a9e6823761c3b92ad93ea341db92ece67f4ef4ceb84194ae6926c3d014b2d59781f02e0b32f9a611222cb9a5850c6957cb8079ae64e0832a1f05e5d1a3c572f9d08f1437f76bb3b83b52967c3d48c3576848891c9658d4959eb80656d26cdba0810037c8a18318ff122f8aa8985c773cb317efa2f557f1c3896bcb162df5d87681bb787e7813aa2dea3b0c564d646a92861f444ca1407efbac3d12432cbb70a1d0eaffb11741d3718fedee2b83036189a6fc45a52f74fa487c18fd264a7945f6c9e44b011f5d86613f1939b19f4f4fdf53234057be3f005ad64eebf3c8ffb58cb40956c4336df01d4424b706a0e561d601708d12485e21bcb6d799d8d1d044b400064ec0944501406e70253947006cabbdb2dd6bd8cee4497653d9113a44d4de9b68d4c526fca0b9b0c18fe50fb917fdd9a914fb816108a73a6b3fff9e654e69c9cfe02b05c6c1b9d15c4e65cf31018b8100d784633ee1888eee3572aafa6f189ea22d0", "signature": "627e7ca7e34ed6331d62b9541c1ea9a9292be7b0a65d805e266b5122272a82db7d765acc7e2a290d685804922f91ed04a3c382c03ff21a1768f584413c4e5f00" }, { "secret_key": "fc0c32c5eb6c71ea08dc2b300cbcef18fdde3ea20f68f21733237b4ddaab900e", "public_key": "47c37d8a080857eb8777a6c0a9a5c927303faf5c320953b5de48e462e12d0062", "message": "a7b1e2db6bdd96b3d51475603537a76b42b04d7ebd24fe515a887658e4a352e22109335639a59e2534811f4753b70209d0e4698e9d926088826c14689681ea00fa3a2fcaa0047ced3ef287e6172502b215e56497614d86b4cb26bcd77a2e172509360ee58893d01c0d0fb4d4abfe4dbd8d2a2f54190fa2f731c1ceac6829c3ddc9bfb2ffd70c57ba0c2b22d2326fbfe7390db8809f73547ff47b86c36f2bf7454e678c4f1c0fa870bd0e30bbf3278ec8d0c5e9b64aff0af64babc19b70f4cf9a41cb8f95d3cde24f456ba3571c8f021d38e591dec05cb5d1ca7b48f9da4bd734b069a9fd106500c1f408ab7fe8e4a6e6f3ed64da0ed24b01e33df8475f95fa9ed71d04dd30b3cd823755a3401bf5afae10ee7e18ec6fe637c3793fd434b48d7145130447e00299101052558b506554ec9c399f62941c3f414cbc352caa345b930adecfaddac91ee53d1451a65e06201026325de07c931f69bba868a7c87ee23c604ec6794332917dfe2c5b69669b659706917f71eddf96", "signed": "6887c6e2b98a82af5ee3dfa7ca2cb25d9c10745620a82956acba85cb57c8ec24279fa42f092359a1b6bbeafba050f14b6288209e6ef7bc1e0a2b872c1138f305a7b1e2db6bdd96b3d51475603537a76b42b04d7ebd24fe515a887658e4a352e22109335639a59e2534811f4753b70209d0e4698e9d926088826c14689681ea00fa3a2fcaa0047ced3ef287e6172502b215e56497614d86b4cb26bcd77a2e172509360ee58893d01c0d0fb4d4abfe4dbd8d2a2f54190fa2f731c1ceac6829c3ddc9bfb2ffd70c57ba0c2b22d2326fbfe7390db8809f73547ff47b86c36f2bf7454e678c4f1c0fa870bd0e30bbf3278ec8d0c5e9b64aff0af64babc19b70f4cf9a41cb8f95d3cde24f456ba3571c8f021d38e591dec05cb5d1ca7b48f9da4bd734b069a9fd106500c1f408ab7fe8e4a6e6f3ed64da0ed24b01e33df8475f95fa9ed71d04dd30b3cd823755a3401bf5afae10ee7e18ec6fe637c3793fd434b48d7145130447e00299101052558b506554ec9c399f62941c3f414cbc352caa345b930adecfaddac91ee53d1451a65e06201026325de07c931f69bba868a7c87ee23c604ec6794332917dfe2c5b69669b659706917f71eddf96", "signature": "6887c6e2b98a82af5ee3dfa7ca2cb25d9c10745620a82956acba85cb57c8ec24279fa42f092359a1b6bbeafba050f14b6288209e6ef7bc1e0a2b872c1138f305" }, { "secret_key": "a8d73d639a23cc6a967ef31bcabb5d063e53e1eab8fcc7cab9bc3a17fde9c2f8", "public_key": "8daa9f4c8b1a44691bf44521f2f7ca45dc7fc61f6a4ce6f98faa41c2a74977d1", "message": "fd1fac3d53313b11acd29f5a83ac11896dab2530fa47865b2295c0d99dd67c36ed8e5fa549150c794c5549efb5c1d69114d5d607b23285b7212afaab57846a54ae67b9e880e07b6586607cecf6d4eed516a3a75511fe367d88eb871e6d71b7d6aa1367a01421b1088fc2d75e44954b73625c52da8a3a183c60be9da6050f59a453caa53520593671728d431877bfaac913a765fb6a56b75290b2a8aaac34afb9217ba1b0d5850ba0fdabf80969def0feee794ceb60614e3368e63ef20e4c32d341ec9b0328ea9fe139207ed7a626ff08943b415233db7cfcc845c9b63121d4ed52ec3748ab6a1f36b2103c7dc7e9303acea4ba8af7a3e07184fb491e891ede84f0dc41cadc3973028e879acd2031afc29a16092868e2c7f539fc1b792edab195a25ab9830661346b39ef53915de4af52c421eaf172e9da76a08c283a52df907f705d7e8599c5baae0c2af380c1bb46f93484a03f28374324b278992b50b7afa02552cafa503f034f8d866e9b720271dd68ccb685a85fffd1", "signed": "c4dcef1a2453939b364b340250c3129431431d5ba3f47670ab07ce680c69bf28b678627c76a6360fc40dc109aa7dea371b825e46134f624572182acf3957e70ffd1fac3d53313b11acd29f5a83ac11896dab2530fa47865b2295c0d99dd67c36ed8e5fa549150c794c5549efb5c1d69114d5d607b23285b7212afaab57846a54ae67b9e880e07b6586607cecf6d4eed516a3a75511fe367d88eb871e6d71b7d6aa1367a01421b1088fc2d75e44954b73625c52da8a3a183c60be9da6050f59a453caa53520593671728d431877bfaac913a765fb6a56b75290b2a8aaac34afb9217ba1b0d5850ba0fdabf80969def0feee794ceb60614e3368e63ef20e4c32d341ec9b0328ea9fe139207ed7a626ff08943b415233db7cfcc845c9b63121d4ed52ec3748ab6a1f36b2103c7dc7e9303acea4ba8af7a3e07184fb491e891ede84f0dc41cadc3973028e879acd2031afc29a16092868e2c7f539fc1b792edab195a25ab9830661346b39ef53915de4af52c421eaf172e9da76a08c283a52df907f705d7e8599c5baae0c2af380c1bb46f93484a03f28374324b278992b50b7afa02552cafa503f034f8d866e9b720271dd68ccb685a85fffd1", "signature": "c4dcef1a2453939b364b340250c3129431431d5ba3f47670ab07ce680c69bf28b678627c76a6360fc40dc109aa7dea371b825e46134f624572182acf3957e70f" }, { "secret_key": "79c7dcb7d59a8df6b2b2ba0413059d89680995c20e916da01b8f067dc60cdeb4", "public_key": "298743c73918bd556b28f8d4824a09b814752a7aeae7ee04875c53f4d6b108d9", "message": "5fe202f5b33b7788810d2508a13b3114d69b8596e6eacda05a04a2eb597fa3279c208b5a5b65daacb699f144e1d660e78e139b578331abec5c3c35334454f03e832c8d6e2984df5d450ecb5d33582a78808a9c78f26ebcd1244ef52e3fa6dca115c1f0cb56e38eae0e5b39f5fd863dffd0b2fb5b958f2d739db312fc667a17b031c4c9f8c5a2ad577984cc4146c437580efd2152173fe0d5782cc2ae9831a8d9a04177256018ff7631e0b0d8a99cb28f008b320421e27a74c31359188663456d85e098c1ebd281701097b6ae5a871e5ccc02058a501416cb91c12cef5be6f1914370e563f1a1b2aa41f4b8ee84cd32a1d509e529787d14a445438d807ecd620e2fa26de0da6426864784d4a28f54103e609283b99ee9b2b699c980bbb7882c3ea68ddc90802ac232f2c8e84291987bf3c5240921b59cfa214969317673d0be7f34b1ca0e15ea73c7175401ce550be106b49e62f8db68695e740e0f3a3556a19f3c8e6b91ac1cc23e863fcd0f0d9eb7047aa631e0d2eb9bcc6b", "signed": "7b7cbe44c771e4371bae13b0722babcc1064155732962f407cba2acd35381d42210bece822f4681121fd4dab745a1f3077922fba1a78045b712902baccac660e5fe202f5b33b7788810d2508a13b3114d69b8596e6eacda05a04a2eb597fa3279c208b5a5b65daacb699f144e1d660e78e139b578331abec5c3c35334454f03e832c8d6e2984df5d450ecb5d33582a78808a9c78f26ebcd1244ef52e3fa6dca115c1f0cb56e38eae0e5b39f5fd863dffd0b2fb5b958f2d739db312fc667a17b031c4c9f8c5a2ad577984cc4146c437580efd2152173fe0d5782cc2ae9831a8d9a04177256018ff7631e0b0d8a99cb28f008b320421e27a74c31359188663456d85e098c1ebd281701097b6ae5a871e5ccc02058a501416cb91c12cef5be6f1914370e563f1a1b2aa41f4b8ee84cd32a1d509e529787d14a445438d807ecd620e2fa26de0da6426864784d4a28f54103e609283b99ee9b2b699c980bbb7882c3ea68ddc90802ac232f2c8e84291987bf3c5240921b59cfa214969317673d0be7f34b1ca0e15ea73c7175401ce550be106b49e62f8db68695e740e0f3a3556a19f3c8e6b91ac1cc23e863fcd0f0d9eb7047aa631e0d2eb9bcc6b", "signature": "7b7cbe44c771e4371bae13b0722babcc1064155732962f407cba2acd35381d42210bece822f4681121fd4dab745a1f3077922fba1a78045b712902baccac660e" }, { "secret_key": "b9ced0412593fefed95e94ac965e5b23ff9d4b0e797db02bf497994d3b793e60", "public_key": "c1629a723189959337f5535201e5d395ba0a03ea8c17660d0f8b6f6e6404bb12", "message": "555bb39c1899d57cabe428064c2d925f5fc4cf7059b95fb89a8e9e3a7e426c6c922d9e4d76984ea2383cabb4f2befd89c1f20eaa8a00dbe787cfa70ae2ae6aa90331cbbe580fa5a02184ed05e6c8e89d576af28aeeaf7c4e2500f358a00971a0a75920e854849bf332142975404f598c32e96982043d992bcd1a4fe819bb5634ad03467afc4ce05073f88ba1ba4ae8653a04665cf3f71690fe13343885bc5ebc0e5e62d882f43b7c68900ac9438bf4a81ce90169ec129ee63e2c675a1a5a67e27cc798c48cc23f51078f463b3b7cc14e3bcfd2e9b82c75240934cbdc50c4308f282f193122995606f40135100a291c55afdf8934eb8b61d81421674124dec3b88f9a73110a9e616f5b826b9d343f3ac0e9d7bdf4fd8b648b40f0098b3897a3a1cd65a64570059b8bc5c6743883074c88623c1f5a88c58969e21c692aca236833d3470b3eb09815e1138e9d0650c390eee977422193b00918be8a97cc6199b451b05b5730d1d13358cf74610678f7ac7f7895cc2efc456e03873b", "signed": "f1b797ded8a6942b12626848340fb719fcddafd98f33e2992d357bfdd35933c7ac561e5b2f939464338c5666854ca885c4d046eb2c54e48a1b5ed266ad34de05555bb39c1899d57cabe428064c2d925f5fc4cf7059b95fb89a8e9e3a7e426c6c922d9e4d76984ea2383cabb4f2befd89c1f20eaa8a00dbe787cfa70ae2ae6aa90331cbbe580fa5a02184ed05e6c8e89d576af28aeeaf7c4e2500f358a00971a0a75920e854849bf332142975404f598c32e96982043d992bcd1a4fe819bb5634ad03467afc4ce05073f88ba1ba4ae8653a04665cf3f71690fe13343885bc5ebc0e5e62d882f43b7c68900ac9438bf4a81ce90169ec129ee63e2c675a1a5a67e27cc798c48cc23f51078f463b3b7cc14e3bcfd2e9b82c75240934cbdc50c4308f282f193122995606f40135100a291c55afdf8934eb8b61d81421674124dec3b88f9a73110a9e616f5b826b9d343f3ac0e9d7bdf4fd8b648b40f0098b3897a3a1cd65a64570059b8bc5c6743883074c88623c1f5a88c58969e21c692aca236833d3470b3eb09815e1138e9d0650c390eee977422193b00918be8a97cc6199b451b05b5730d1d13358cf74610678f7ac7f7895cc2efc456e03873b", "signature": "f1b797ded8a6942b12626848340fb719fcddafd98f33e2992d357bfdd35933c7ac561e5b2f939464338c5666854ca885c4d046eb2c54e48a1b5ed266ad34de05" }, { "secret_key": "81da168f02d46bb87cda845da43f8a6cba2c016878d6f49c6f061a60f155a04a", "public_key": "aff86e98093ca4c71b1b804c5fe451cfdf868250dea30345fa4b89bb09b6a53b", "message": "6bc6726a34a64aae76ab08c92b179e54ff5d2e65eb2c6c659ae8703cc245cbc2cf45a12b22c468ae61fd9a6627ad0626c9b1e5af412cb483eaee1db11b29f0a510c13e38020e09ae0eee762537a3e9d1a0c7b033d097fdc1f4f82629a9de9ef38da1cf96a940357d5f2e0e7e8dbc29db728a1e6aad876e5e053113d06420272b87cf0c40dfe03a544de96c7aea13ba0029b57b48d99dcc6a650492d78c4cdd1b28e1a115a7e3e7a7cb21333d4ff80858dfb67782c16354b8716596560d7d8e389eb15a052a0bf5d16eb54fb3e4973ad4984e72a187f5347d5b262c32b1647e42b6a53837096cc78c2a05ce1c6e12493a03f1a667584cb97f4fcd57ee944c65b7eed25f7ae0f3f6cede173fdfacf5af1db143730d18096664914ba4cfc6966f392022781c66a9417ca2680b51f63e4fba424ecfdbc6a2f01787d0e7484f8a8ab390aeaa6d1f7ed325d82feaa1692a4984fae43da87329b045da8f0a4f56b695aa935de152ce0385153720979a2b7006d405fcb0fba09e23b85fd19b", "signed": "4aaca947e3f22cc8b8588ee030ace8f6b5f5711c2974f20cc18c3b655b07a5bc1366b59a1708032d12cae01ab794f8cbcc1a330874a75035db1d69422d2fc00c6bc6726a34a64aae76ab08c92b179e54ff5d2e65eb2c6c659ae8703cc245cbc2cf45a12b22c468ae61fd9a6627ad0626c9b1e5af412cb483eaee1db11b29f0a510c13e38020e09ae0eee762537a3e9d1a0c7b033d097fdc1f4f82629a9de9ef38da1cf96a940357d5f2e0e7e8dbc29db728a1e6aad876e5e053113d06420272b87cf0c40dfe03a544de96c7aea13ba0029b57b48d99dcc6a650492d78c4cdd1b28e1a115a7e3e7a7cb21333d4ff80858dfb67782c16354b8716596560d7d8e389eb15a052a0bf5d16eb54fb3e4973ad4984e72a187f5347d5b262c32b1647e42b6a53837096cc78c2a05ce1c6e12493a03f1a667584cb97f4fcd57ee944c65b7eed25f7ae0f3f6cede173fdfacf5af1db143730d18096664914ba4cfc6966f392022781c66a9417ca2680b51f63e4fba424ecfdbc6a2f01787d0e7484f8a8ab390aeaa6d1f7ed325d82feaa1692a4984fae43da87329b045da8f0a4f56b695aa935de152ce0385153720979a2b7006d405fcb0fba09e23b85fd19b", "signature": "4aaca947e3f22cc8b8588ee030ace8f6b5f5711c2974f20cc18c3b655b07a5bc1366b59a1708032d12cae01ab794f8cbcc1a330874a75035db1d69422d2fc00c" }, { "secret_key": "af2e60da0f29bb1614fc3f193cc353331986b73f3f9a0aec9421b9473d6a4b6a", "public_key": "c8bfe2835822199c6127b806fabeef0cb9ff59f3c81ff0cb89c556f55106af6a", "message": "7dbb77b88bda94f344416a06b096566c6e8b393931a8243a6cab75c361fde7dc536aec40cded83296a89e8c3bef7d787cfc49401a7b9183f138d5000619ff073c05e2f841d6008358f10a2da7dcfac3d4d70c20d2ec34c7b6d5cd1a734d6bbb11c5fd8d2bce32ac810ef82b4188aa8ea3cfc3032233dc0e2600e9db6e18bc22b10044a31c15baceaf5554de89d2a3466807f244414d080ff2963956c6e83c8e144ed0066088b476ddcb564403447d9159f9089aba2b4d5575c4d8ae66fc8690e7349ed40832e6369c024563ec493bfcc0fc9ac787ac841397fe133167283d80c42f006a99d39e82979da3fa9334bd9ede0d14b41b7466bcebbe8171bc804a645d3723274a1b92bf82fd993358744de92441903d436fd47f23d40052a3829367f202f0553b5e49b76c5e03fa6ce7c3cf5eeb21de967bec4dd355925384ebf96697e823762bac4d43a767c241a4cef724a970d00ff3a8ab3b83eed840075c74e90f306e330013260962161e9d0910de183622ce9a6b8d5144280550fc7", "signed": "50f9f941a8da9f6240f76d2fa3b06dd6b2292ed32d1c05218097d34d8a19dfe553f76ae3c6b4a2ed20852128461540decf418f52d38e64037eec7771bd1afe007dbb77b88bda94f344416a06b096566c6e8b393931a8243a6cab75c361fde7dc536aec40cded83296a89e8c3bef7d787cfc49401a7b9183f138d5000619ff073c05e2f841d6008358f10a2da7dcfac3d4d70c20d2ec34c7b6d5cd1a734d6bbb11c5fd8d2bce32ac810ef82b4188aa8ea3cfc3032233dc0e2600e9db6e18bc22b10044a31c15baceaf5554de89d2a3466807f244414d080ff2963956c6e83c8e144ed0066088b476ddcb564403447d9159f9089aba2b4d5575c4d8ae66fc8690e7349ed40832e6369c024563ec493bfcc0fc9ac787ac841397fe133167283d80c42f006a99d39e82979da3fa9334bd9ede0d14b41b7466bcebbe8171bc804a645d3723274a1b92bf82fd993358744de92441903d436fd47f23d40052a3829367f202f0553b5e49b76c5e03fa6ce7c3cf5eeb21de967bec4dd355925384ebf96697e823762bac4d43a767c241a4cef724a970d00ff3a8ab3b83eed840075c74e90f306e330013260962161e9d0910de183622ce9a6b8d5144280550fc7", "signature": "50f9f941a8da9f6240f76d2fa3b06dd6b2292ed32d1c05218097d34d8a19dfe553f76ae3c6b4a2ed20852128461540decf418f52d38e64037eec7771bd1afe00" }, { "secret_key": "605f90b53d8e4a3b48b97d745439f2a0807d83b8502e8e2979f03e8d376ac9fe", "public_key": "aa3fae4cfa6f6bfd14ba0afa36dcb1a2656f36541ad6b3e67f1794b06360a62f", "message": "3bcdcac292ac9519024aaecee2b3e999ff5d3445e9f1eb60940f06b91275b6c5db2722ed4d82fe89605226530f3e6b0737b308cde8956184944f388a80042f6cba274c0f7d1192a0a96b0da6e2d6a61b76518fbee555773a414590a928b4cd545fccf58172f35857120eb96e75c5c8ac9ae3add367d51d34ac403446360ec10f553ea9f14fb2b8b78cba18c3e506b2f04097063a43b2d36431cce02caf11c5a4db8c821752e52985d5af1bfbf4c61572e3fadae3ad424acd81662ea5837a1143b9669391d7b9cfe230cffb3a7bb03f6591c25a4f01c0d2d4aca3e74db1997d3739c851f0327db919ff6e77f6c8a20fdd3e1594e92d01901ab9aef194fc893e70d78c8ae0f480001a515d4f9923ae6278e8927237d05db23e984c92a683882f57b1f1882a74a193ab6912ff241b9ffa662a0d47f29205f084dbde845baaeb5dd36ae6439a437642fa763b57e8dbe84e55813f0151e97e5b9de768b234b8db15c496d4bfcfa1388788972bb50ce030bc6e0ccf4fa7d00d343782f6ba8de0", "signed": "dd0212e63288cbe14a4569b4d891da3c7f92727c5e7f9a801cf9d6827085e7095b669d7d45f882ca5f0745dccd24d87a57181320191e5b7a47c3f7f2dccbd7073bcdcac292ac9519024aaecee2b3e999ff5d3445e9f1eb60940f06b91275b6c5db2722ed4d82fe89605226530f3e6b0737b308cde8956184944f388a80042f6cba274c0f7d1192a0a96b0da6e2d6a61b76518fbee555773a414590a928b4cd545fccf58172f35857120eb96e75c5c8ac9ae3add367d51d34ac403446360ec10f553ea9f14fb2b8b78cba18c3e506b2f04097063a43b2d36431cce02caf11c5a4db8c821752e52985d5af1bfbf4c61572e3fadae3ad424acd81662ea5837a1143b9669391d7b9cfe230cffb3a7bb03f6591c25a4f01c0d2d4aca3e74db1997d3739c851f0327db919ff6e77f6c8a20fdd3e1594e92d01901ab9aef194fc893e70d78c8ae0f480001a515d4f9923ae6278e8927237d05db23e984c92a683882f57b1f1882a74a193ab6912ff241b9ffa662a0d47f29205f084dbde845baaeb5dd36ae6439a437642fa763b57e8dbe84e55813f0151e97e5b9de768b234b8db15c496d4bfcfa1388788972bb50ce030bc6e0ccf4fa7d00d343782f6ba8de0", "signature": "dd0212e63288cbe14a4569b4d891da3c7f92727c5e7f9a801cf9d6827085e7095b669d7d45f882ca5f0745dccd24d87a57181320191e5b7a47c3f7f2dccbd707" }, { "secret_key": "9e2c3d189838f4dd52ef0832886874c5ca493983ddadc07cbc570af2ee9d6209", "public_key": "f68d3b81e73557ee1f08bd2d3f46a4718256a0f3cd8d2e03eb8fe882aab65c69", "message": "19485f5238ba82eadf5eff14ca75cd42e5d56fea69d5718cfb5b1d40d760899b450e66884558f3f25b7c3de9afc4738d7ac09da5dd4689bbfac07836f5e0be432b1ddcf1b1a075bc9815d0debc865d90bd5a0c5f5604d9b46ace816c57694ecc3d40d8f84df0ede2bc4d577775a027f725de0816f563fa88f88e077720ebb6ac02574604819824db7474d4d0b22cd1bc05768e0fb867ca1c1a7b90b34ab7a41afc66957266ac0c915934aaf31c0cf6927a4f03f23285e6f24afd5813849bb08c203ac2d0336dcbf80d77f6cf7120edfbcdf181db107ec8e00f32449c1d3f5c049a92694b4ea2c6ebe5e2b0f64b5ae50ad3374d246b3270057e724a27cf263b633ab65ecb7f5c266b8007618b10ac9ac83db0febc04fd863d9661ab6e58494766f71b9a867c5a7a4555f667c1af2e54588f162a41ce756407cc4161d607b6e0682980934caa1bef036f7330d9eef01ecc553583fee5994e533a46ca916f60f8b961ae01d20f7abf0df6141b604de733c636b42018cd5f1d1ef4f84cee40fc", "signed": "38a31b6b465084738262a26c065fe5d9e2886bf9dd35cde05df9bad0cc7db401c750aa19e66090bce25a3c721201e60502c8c10454346648af065eab0ee7d80f19485f5238ba82eadf5eff14ca75cd42e5d56fea69d5718cfb5b1d40d760899b450e66884558f3f25b7c3de9afc4738d7ac09da5dd4689bbfac07836f5e0be432b1ddcf1b1a075bc9815d0debc865d90bd5a0c5f5604d9b46ace816c57694ecc3d40d8f84df0ede2bc4d577775a027f725de0816f563fa88f88e077720ebb6ac02574604819824db7474d4d0b22cd1bc05768e0fb867ca1c1a7b90b34ab7a41afc66957266ac0c915934aaf31c0cf6927a4f03f23285e6f24afd5813849bb08c203ac2d0336dcbf80d77f6cf7120edfbcdf181db107ec8e00f32449c1d3f5c049a92694b4ea2c6ebe5e2b0f64b5ae50ad3374d246b3270057e724a27cf263b633ab65ecb7f5c266b8007618b10ac9ac83db0febc04fd863d9661ab6e58494766f71b9a867c5a7a4555f667c1af2e54588f162a41ce756407cc4161d607b6e0682980934caa1bef036f7330d9eef01ecc553583fee5994e533a46ca916f60f8b961ae01d20f7abf0df6141b604de733c636b42018cd5f1d1ef4f84cee40fc", "signature": "38a31b6b465084738262a26c065fe5d9e2886bf9dd35cde05df9bad0cc7db401c750aa19e66090bce25a3c721201e60502c8c10454346648af065eab0ee7d80f" }, { "secret_key": "31010d1d67eb616348e84792b92d5dc128553cb52f6368159fe7b816cd0e7c37", "public_key": "266543d96787ca901fcff06e6e434491ae0970880a5a187d535edb19db5cabeb", "message": "39f89a5e7aa530b5463d498f8035b9909d55da527cdbd4de6d228379f089e608a9207a2c5b9c42051a60c8ca3fb97a1c06cd747d9d0739970ceb88ce526f971140ea2ec21f090ba075bf8975faa508b1cc10efa494dc172e6d3d3f3f75dc8e0e96f05c0cccb2f96e911cfa7a2c82c9845018bb1f9d75f82e3dfe1139347b2ac058b014ac93760c90f5567ab5c4eba04b49fb09ddadd305be511dfe05c96ebc86fd67b5d0ab57d85f4fe5e2f0fa9d88a68f0f6b6bc8bb944eb3c0b17557e55d5ea187d922a42813e69057c9b6a7f75e49921b7079e58f8a63719ee3e1ad10cf0e8a70c4f1540218b70494bd029ee02ff9727a7d85d377919ec4051479b70f7cd6767723fe42c1c7899c2b7c1f702dd6b4d13b672d488f34a0e969db79cc2cb2524a948a8de4c5b623ecd90d6e82d97033c125637d1cd8c84803d8fbc012846ffe484f6c02149258f9462fa1e99c307dd0062fe0b6f11eee40c2629ef7c0f6a5107259ea5b9ffb6f29f12c32f7b5228cabc986ab66450af9dcc3da09d0e0b9a4", "signed": "7b1eb677c3e5e6a8b4ba69fcb7f6b1870e42a8d58958a35c674e2db82107481c4c7b37f0f689d39d9f51e181b17b1108c15a3e27b29df3a4315dcc4faf12220539f89a5e7aa530b5463d498f8035b9909d55da527cdbd4de6d228379f089e608a9207a2c5b9c42051a60c8ca3fb97a1c06cd747d9d0739970ceb88ce526f971140ea2ec21f090ba075bf8975faa508b1cc10efa494dc172e6d3d3f3f75dc8e0e96f05c0cccb2f96e911cfa7a2c82c9845018bb1f9d75f82e3dfe1139347b2ac058b014ac93760c90f5567ab5c4eba04b49fb09ddadd305be511dfe05c96ebc86fd67b5d0ab57d85f4fe5e2f0fa9d88a68f0f6b6bc8bb944eb3c0b17557e55d5ea187d922a42813e69057c9b6a7f75e49921b7079e58f8a63719ee3e1ad10cf0e8a70c4f1540218b70494bd029ee02ff9727a7d85d377919ec4051479b70f7cd6767723fe42c1c7899c2b7c1f702dd6b4d13b672d488f34a0e969db79cc2cb2524a948a8de4c5b623ecd90d6e82d97033c125637d1cd8c84803d8fbc012846ffe484f6c02149258f9462fa1e99c307dd0062fe0b6f11eee40c2629ef7c0f6a5107259ea5b9ffb6f29f12c32f7b5228cabc986ab66450af9dcc3da09d0e0b9a4", "signature": "7b1eb677c3e5e6a8b4ba69fcb7f6b1870e42a8d58958a35c674e2db82107481c4c7b37f0f689d39d9f51e181b17b1108c15a3e27b29df3a4315dcc4faf122205" }, { "secret_key": "8ff2398cd51f51d4c2c57869a2218b8486822031f400729f4ac4d5909c48bafe", "public_key": "a5a88704b68677be3d16c3dc0052cfee6e2b30e08609059d4cba52c6d96061fb", "message": "993953e47a341188bc592942e1557af29546e4e9368e2f1a5ee9806e2baf66b6190191fc5d2b7e47de37ff054fb2bbb1f031684ada5d607adda3d65433122fa904e0456faa84109bbc517f8ad39660876382adcfed0f7620cf1164622eacd91eb37a8596462ebe9ebe26bdc1e32cc34ad46fb1cea420e73c31215408e6d35425f44a829b132f631a3f6dd4b873a000667e19eb22fffd5903aaa7d4c8fdf21953c3c6178f5f8cb2aa6bff92894ead835888df060a3c9043026e0e2cef275497e7d105df3b644a98f26bf00105c99413ee0af8851954d65ceb8d79ad3071b8bb87f0b19743d2556ffd9819830b6eebf7ecc7e045661f43570ce9fdbbe2d252406fa90d04236f222c429ec16b1287224ada1a532161ae8b481bcab8d47afb3ed0445b3060fd6759179856f4085c1e585fd7c1409799af693cf427bd1d3dc10b5ae3447a8d2a18dc3a12a6860b22175dd5eb53a0950432e2d7aefece8af0ade3d8567743de43690f2d253723c5d7e48bd30d2937593701cecde9154b7665cb611d7d", "signed": "417a647829c92898e520ff5311daa0a139cd8fffcb25a18e6d9b50cb52cbc35424c39ebbb5d5ac6a6d63f1f53c4df212f7025a8aaef8e36493c874c3ce341a0e993953e47a341188bc592942e1557af29546e4e9368e2f1a5ee9806e2baf66b6190191fc5d2b7e47de37ff054fb2bbb1f031684ada5d607adda3d65433122fa904e0456faa84109bbc517f8ad39660876382adcfed0f7620cf1164622eacd91eb37a8596462ebe9ebe26bdc1e32cc34ad46fb1cea420e73c31215408e6d35425f44a829b132f631a3f6dd4b873a000667e19eb22fffd5903aaa7d4c8fdf21953c3c6178f5f8cb2aa6bff92894ead835888df060a3c9043026e0e2cef275497e7d105df3b644a98f26bf00105c99413ee0af8851954d65ceb8d79ad3071b8bb87f0b19743d2556ffd9819830b6eebf7ecc7e045661f43570ce9fdbbe2d252406fa90d04236f222c429ec16b1287224ada1a532161ae8b481bcab8d47afb3ed0445b3060fd6759179856f4085c1e585fd7c1409799af693cf427bd1d3dc10b5ae3447a8d2a18dc3a12a6860b22175dd5eb53a0950432e2d7aefece8af0ade3d8567743de43690f2d253723c5d7e48bd30d2937593701cecde9154b7665cb611d7d", "signature": "417a647829c92898e520ff5311daa0a139cd8fffcb25a18e6d9b50cb52cbc35424c39ebbb5d5ac6a6d63f1f53c4df212f7025a8aaef8e36493c874c3ce341a0e" }, { "secret_key": "ef816c8f5ec34ef41f68831d90cd29e52de8973782d003ee4edada2ada2691d6", "public_key": "47f9b363a88a45053a05bb72160852bfe8f7dfefc2f37283de346752caf092cc", "message": "9593c35cdec535bebb6965da68eab0b646bffcfbd04883bc4cef90d5d01f018c63c9b0ddfb3cef5e786284d5218caaaf060e9288952f16301ed8a4c1bcee256356a0c8bda359fbaa2782b10c86d18e20f7a0ec99b27a0b4dbefc0a262a3bf68fe81444dcae5f693eb0f16e6ee03f8fcbf3a3398146d20ec4d2657761fd0320fee7ea703c49a6a543bc9bba911e7925038710e8c36552d476d6027f58b2c52ba51ad65ea4f039c78f96b889102bb4bdd69b68e9c3d45b5176a2d82b0b95dc321016370dae30c3936515db0464c41774301c74e42d89b8bf4b9c19ed554b12febac0f60ddb3219ccc5603531dbf2eb5f293425d72ccefa0c7f144aba89347b296be87ff18994b4a0c70c930f059303b5dd4c8fe1e6bbc3cd68c6c0d84246dc6e6140a2abd1780b13f1594a6019d1778b7cbb3a3e3a34bfae7297f0b3edc376941c32352a4be314b84a9d8d6d7f1f38a0ad3798020aa2a331a402be9c704484744a730cbdedcb904b6fde708fbd14bfdc29efd461d1d0b5825de0bc79422b69a2722f", "signed": "65c5d10ea7bfdbb38d55364a9968f82b548224dff3363b2ddcf585163dea27dc63b0563eb1a8dfbee951d3c9b33fcd6bbf0921c3abb21786b229069bd9ca000a9593c35cdec535bebb6965da68eab0b646bffcfbd04883bc4cef90d5d01f018c63c9b0ddfb3cef5e786284d5218caaaf060e9288952f16301ed8a4c1bcee256356a0c8bda359fbaa2782b10c86d18e20f7a0ec99b27a0b4dbefc0a262a3bf68fe81444dcae5f693eb0f16e6ee03f8fcbf3a3398146d20ec4d2657761fd0320fee7ea703c49a6a543bc9bba911e7925038710e8c36552d476d6027f58b2c52ba51ad65ea4f039c78f96b889102bb4bdd69b68e9c3d45b5176a2d82b0b95dc321016370dae30c3936515db0464c41774301c74e42d89b8bf4b9c19ed554b12febac0f60ddb3219ccc5603531dbf2eb5f293425d72ccefa0c7f144aba89347b296be87ff18994b4a0c70c930f059303b5dd4c8fe1e6bbc3cd68c6c0d84246dc6e6140a2abd1780b13f1594a6019d1778b7cbb3a3e3a34bfae7297f0b3edc376941c32352a4be314b84a9d8d6d7f1f38a0ad3798020aa2a331a402be9c704484744a730cbdedcb904b6fde708fbd14bfdc29efd461d1d0b5825de0bc79422b69a2722f", "signature": "65c5d10ea7bfdbb38d55364a9968f82b548224dff3363b2ddcf585163dea27dc63b0563eb1a8dfbee951d3c9b33fcd6bbf0921c3abb21786b229069bd9ca000a" }, { "secret_key": "45eb0c4dfafa2a7690ef579c095456ceedcd32f0b6144d0c380f87fb744a0b1f", "public_key": "fc85632c98384b5f9682aed9cd664cf1f48e588be2d568e5c734494df4c712b8", "message": "6f66d847405a03d7bd6f8d2897dbdf04e76d7df2d9470a4996b7dd6db88500f8f4f83e960e219a2486e24545add13614550414d827c41a9b08318daf01b15214c64a4266cbf8a5717ada3e62c26729073e16ddbd66f2d520e1e09935de05e4db11c396d477010aec66aafb762e69238d0b9e76b452454bf9e451e76ac79e6990d41b932bc32917093783c91bc9cf0bbe3b514070a1e692ff34fd06b66ea11f39e10af933ee96d8e9b677cb03737e7964eeaa725f121207f9c1b26a96c616df7cb7caef47bda901368ff2ea586e422e65bf21a691bdd2c13e67fff58cfbfed81782049dafa0f727df88623f2f7e8f262daf939542a187b8720a9b6b2b09890e54876b28a43874abbe3bfa981f8138b772c5d51736885f86acac2215a0b010dfc2c6b150845d4f8296252586a3e115f303c3d8a582e20fd2d43f6c446e5d00280ec179823b7fb4c1b0feb94eb4ef1707f5184e3b52461a7562d1f307cb751cdbbf6eae49ffae91862358e74e9548822b8a049fec6bf4c7a99cabbe09206577b657e31f", "signed": "55851de8e1092f78944f6c6dd95bf07e2dbc8df7f57ad576829b978e3af58a7a8e94ed4dccbc0182467edf0bad4bae7ca84aa9a0c17c61a9e0ddff1d7525d7046f66d847405a03d7bd6f8d2897dbdf04e76d7df2d9470a4996b7dd6db88500f8f4f83e960e219a2486e24545add13614550414d827c41a9b08318daf01b15214c64a4266cbf8a5717ada3e62c26729073e16ddbd66f2d520e1e09935de05e4db11c396d477010aec66aafb762e69238d0b9e76b452454bf9e451e76ac79e6990d41b932bc32917093783c91bc9cf0bbe3b514070a1e692ff34fd06b66ea11f39e10af933ee96d8e9b677cb03737e7964eeaa725f121207f9c1b26a96c616df7cb7caef47bda901368ff2ea586e422e65bf21a691bdd2c13e67fff58cfbfed81782049dafa0f727df88623f2f7e8f262daf939542a187b8720a9b6b2b09890e54876b28a43874abbe3bfa981f8138b772c5d51736885f86acac2215a0b010dfc2c6b150845d4f8296252586a3e115f303c3d8a582e20fd2d43f6c446e5d00280ec179823b7fb4c1b0feb94eb4ef1707f5184e3b52461a7562d1f307cb751cdbbf6eae49ffae91862358e74e9548822b8a049fec6bf4c7a99cabbe09206577b657e31f", "signature": "55851de8e1092f78944f6c6dd95bf07e2dbc8df7f57ad576829b978e3af58a7a8e94ed4dccbc0182467edf0bad4bae7ca84aa9a0c17c61a9e0ddff1d7525d704" }, { "secret_key": "709d2e199006f5369a7a0bdd34e74dc784be33880ea3c5dd10ed5c94451e7972", "public_key": "06f989202ba2cbc9c150be611262aca00c45f012f89fbaf89f8ceccba0b1934a", "message": "62f003140fa09e0387d187a0ff96c4563df9f4e28c2282c0183ac3eede1312354921f780fca5361d3068d29949630b7530cd5914ace0468d014b6f53d839b82e38817dbf2d8392c3ce3424eab86a24d804c7acb1ce7acfe0a1cda4393924283105da4a7741196e027550047f85b7a0a01d454124efc0e299f0ef9ad14350543053482261528baa56e65999ac802c00a336267c635106b26403c19f391d53bd82861d6d48a4380b3043aa91d649536881204eccb0de20d43e5a3755b7f600916eccae42a0c9053b462d9417a13d67d778264a896e8eaf90baf66d29e5438a716781123a89fa9b8beef91d965af2f4a1a5bd5d2e2aaf46d5c94b7709cdd38d05feee4bfb76a359077c16bc4be9116e69001271cda565bc19bf47d4f986bd9c0d184cd8a3520ca1bdb4b505aaf7cb4ec9f94789779d30714e79116dd5019d59b28b17dad96f4e2155ad9c61274addc6b638109504e9ed19f4eda5377762648c4098224e3391043e4c2ad591654c9e7f974efdf0b0504b6fa5f646cecf44cd372412372505", "signed": "629bf97b0c78ee6a9c8759fbea28224e27abbb6cbe4dea5bb797e6e0fe80c913f953e3a9b623352d13acf4ce6250fb029a1e198d72bd5e7402e60e9e48ca350162f003140fa09e0387d187a0ff96c4563df9f4e28c2282c0183ac3eede1312354921f780fca5361d3068d29949630b7530cd5914ace0468d014b6f53d839b82e38817dbf2d8392c3ce3424eab86a24d804c7acb1ce7acfe0a1cda4393924283105da4a7741196e027550047f85b7a0a01d454124efc0e299f0ef9ad14350543053482261528baa56e65999ac802c00a336267c635106b26403c19f391d53bd82861d6d48a4380b3043aa91d649536881204eccb0de20d43e5a3755b7f600916eccae42a0c9053b462d9417a13d67d778264a896e8eaf90baf66d29e5438a716781123a89fa9b8beef91d965af2f4a1a5bd5d2e2aaf46d5c94b7709cdd38d05feee4bfb76a359077c16bc4be9116e69001271cda565bc19bf47d4f986bd9c0d184cd8a3520ca1bdb4b505aaf7cb4ec9f94789779d30714e79116dd5019d59b28b17dad96f4e2155ad9c61274addc6b638109504e9ed19f4eda5377762648c4098224e3391043e4c2ad591654c9e7f974efdf0b0504b6fa5f646cecf44cd372412372505", "signature": "629bf97b0c78ee6a9c8759fbea28224e27abbb6cbe4dea5bb797e6e0fe80c913f953e3a9b623352d13acf4ce6250fb029a1e198d72bd5e7402e60e9e48ca3501" }, { "secret_key": "5151617421aadc9c95a442b45e7ff6de06a2c733b85bd789fbad414ee3c91add", "public_key": "14941d559761b30ab0a86d47e0f7d1896b33784527c80af41cb84810cbff9dbf", "message": "216e9d40bcdc3b2650188d121c9f8ef29e914facd022fe01b90ed11225f2eb93538e5fcee5ab8045e9199aa76a16bdd0616805660e247fecd7e22821b69b1f8e8a58ac3fb85691d75d5957a1daf53ff9ee6476d7c4bc541e6ad38e3a34ea90fc52a48b9399f92d17c9bb0d7fc3104c55d0efb4ea5b831ff9490b3f79f4d9d699594b741566f2b50a8fc78cc403fa40f5abb6638a32f449a8b3ef029c402f46931ad2bd3e8e683108714c989ae21689e9c444b9f55b81119bb5035bcf73e97ce43a2218c7bc3e430d1e814f34dee057265d3194b9f43875d8381f525f78576e64ce692584faa30fb743a12d1b77614d2e10a6b856b52be27cdb630ba1f0d3a6f8ea9844542e584ea0a2777527d0c52aca949aacda45ad83d16d5c83d663adb79cad6f3e39e990fe282a14c353aa2379d7f06adab74cea021b8983a57f1d0cf703292eb05ece89c53f3a1265610e0c1ea8ddd444d1ffd6bc3d03f0a6e4d0df5c5b8dc1f95d9f5558b118afe6bea0f6c2931363f03ab34e757d49364174f658efbbf38dc177", "signed": "fae4773b334460c77bf01ec6366c4fe61c0cab57d8a4b03909c619e11ee3461c13fa21576f63870e423dd04181e4a7013a7524f246fe33853c674162a7815104216e9d40bcdc3b2650188d121c9f8ef29e914facd022fe01b90ed11225f2eb93538e5fcee5ab8045e9199aa76a16bdd0616805660e247fecd7e22821b69b1f8e8a58ac3fb85691d75d5957a1daf53ff9ee6476d7c4bc541e6ad38e3a34ea90fc52a48b9399f92d17c9bb0d7fc3104c55d0efb4ea5b831ff9490b3f79f4d9d699594b741566f2b50a8fc78cc403fa40f5abb6638a32f449a8b3ef029c402f46931ad2bd3e8e683108714c989ae21689e9c444b9f55b81119bb5035bcf73e97ce43a2218c7bc3e430d1e814f34dee057265d3194b9f43875d8381f525f78576e64ce692584faa30fb743a12d1b77614d2e10a6b856b52be27cdb630ba1f0d3a6f8ea9844542e584ea0a2777527d0c52aca949aacda45ad83d16d5c83d663adb79cad6f3e39e990fe282a14c353aa2379d7f06adab74cea021b8983a57f1d0cf703292eb05ece89c53f3a1265610e0c1ea8ddd444d1ffd6bc3d03f0a6e4d0df5c5b8dc1f95d9f5558b118afe6bea0f6c2931363f03ab34e757d49364174f658efbbf38dc177", "signature": "fae4773b334460c77bf01ec6366c4fe61c0cab57d8a4b03909c619e11ee3461c13fa21576f63870e423dd04181e4a7013a7524f246fe33853c674162a7815104" }, { "secret_key": "38bed445556de74482bf5fec0506f9af330b151e50d4774dfe8591d7b7e0276b", "public_key": "4c0f9c49a42f4047bfe6885551c5e4b856cf771a67af3f89dbf602f9db9220f3", "message": "0ff0031df0beeff3710c6b763f9b8ec81719bfa1528ce46519adf3d3412d93fb188fd497d5d17091c0f0345960dd0eb0c09fc4005173665d4d97f95c13828bc76b3492b87a4b64253c8b5fa47aa75fa3b86d5abeea8de5959a602289136f60a69b309e773b2255cde19ed2a2e199c33db11c16ade08a319750b851d92c692924fc9859be523431cbe78ec092db1129210ebbeaa7c2a2c000eeb105ca0301a48f3e45fdfb15b275cbab83ca5c99d737a585320e9e3b317179bd86467fa9694fcdb2ac6ad36ed7144843dbc34e423d35afd7d8972a1c43c199a191abd6ceba4936d395c995a3eb13cb057f88a9dc9490fe98845ee5d26a89fb642a2a516dc3056c54d3637213363a8628a42a395d942b954a89e8ef7a744d8ae5adac88c616efaa90e2077205a60baffede5c87bb14dead306229495f698f3e490616966b1636387d0d86183f945b24a9dcfccf4d36722cd12ebb6bd8e78325752afa2b1abd13c4bdbcadd170869136826242acfb721de5ff27ba8aa0c018b225ed3404803ce9fa2d508d8944", "signed": "f702d0d463282fc7fd5f8f9029b89c626cafd83450c3bb9dd8f6589f0c4b4b71f649ea212e5e33487c59c168ea3ad83150f1fcdfe8c53eba65adc2023c25830f0ff0031df0beeff3710c6b763f9b8ec81719bfa1528ce46519adf3d3412d93fb188fd497d5d17091c0f0345960dd0eb0c09fc4005173665d4d97f95c13828bc76b3492b87a4b64253c8b5fa47aa75fa3b86d5abeea8de5959a602289136f60a69b309e773b2255cde19ed2a2e199c33db11c16ade08a319750b851d92c692924fc9859be523431cbe78ec092db1129210ebbeaa7c2a2c000eeb105ca0301a48f3e45fdfb15b275cbab83ca5c99d737a585320e9e3b317179bd86467fa9694fcdb2ac6ad36ed7144843dbc34e423d35afd7d8972a1c43c199a191abd6ceba4936d395c995a3eb13cb057f88a9dc9490fe98845ee5d26a89fb642a2a516dc3056c54d3637213363a8628a42a395d942b954a89e8ef7a744d8ae5adac88c616efaa90e2077205a60baffede5c87bb14dead306229495f698f3e490616966b1636387d0d86183f945b24a9dcfccf4d36722cd12ebb6bd8e78325752afa2b1abd13c4bdbcadd170869136826242acfb721de5ff27ba8aa0c018b225ed3404803ce9fa2d508d8944", "signature": "f702d0d463282fc7fd5f8f9029b89c626cafd83450c3bb9dd8f6589f0c4b4b71f649ea212e5e33487c59c168ea3ad83150f1fcdfe8c53eba65adc2023c25830f" }, { "secret_key": "055460b32dd04d7f4b2311a89807e073fd556565a4771857d882794130a2fe5d", "public_key": "260f8fed4bba30b9e12ad8523fbb6f57f0a7a882550061f1da46fbd8ea442221", "message": "7407f96ee3e79c69d36ce1f64e4f188655ea68b947e7e2be97b05ebc6d4439e950276ef3f0e6a03dd48b24f66929b49c1580eb468807e1e7a25eb9b94da340c53f984f8b81603efb61047bf3f14b686d9798003d2f68589a79ebfad54409c71c90ff67c11fbd76cc72c2d145f458e42f88b75d250eadcafe66bf37ffc837b62ff006685b7f85a9d875fc078c82e61fe35d1922527a551dab62f9e477499146bad912203e664c417c3679c02d872abac0032f8cc77f77bfe54d3326fdee9276a48ea4eb251350406882d08c830e7649fe6854558a7513ab2d8d2ac3e5ced8a808d2aee454779edabd1aa63bb19f718f470bdc8451cd9b294941e3497063b1e39b6ca184562fe838cbfeee922de24ddfcf9882c5e615b11bf904817fbd647139db80b4e8feb37f11e1852d7e876db9cb63c94d7ee34192f7200b5bc77a0311ae43b806ebd4c2896c53f58f7ebc1625cb20d7107ef9db0da28788523de991ef6c5866b18d8de83a954d3281e06dbf27c4f2382e08cd0e0f6ebae3f961b77fce5a95a9b0621b756f", "signed": "23f4f1627fbabd7891d7d8489631c7231d22de71864e262ab4da84ea8a13a60feac4dcfb1812f1200444b775f121d7266d755ce9b6a9ad796559c0a26b516d027407f96ee3e79c69d36ce1f64e4f188655ea68b947e7e2be97b05ebc6d4439e950276ef3f0e6a03dd48b24f66929b49c1580eb468807e1e7a25eb9b94da340c53f984f8b81603efb61047bf3f14b686d9798003d2f68589a79ebfad54409c71c90ff67c11fbd76cc72c2d145f458e42f88b75d250eadcafe66bf37ffc837b62ff006685b7f85a9d875fc078c82e61fe35d1922527a551dab62f9e477499146bad912203e664c417c3679c02d872abac0032f8cc77f77bfe54d3326fdee9276a48ea4eb251350406882d08c830e7649fe6854558a7513ab2d8d2ac3e5ced8a808d2aee454779edabd1aa63bb19f718f470bdc8451cd9b294941e3497063b1e39b6ca184562fe838cbfeee922de24ddfcf9882c5e615b11bf904817fbd647139db80b4e8feb37f11e1852d7e876db9cb63c94d7ee34192f7200b5bc77a0311ae43b806ebd4c2896c53f58f7ebc1625cb20d7107ef9db0da28788523de991ef6c5866b18d8de83a954d3281e06dbf27c4f2382e08cd0e0f6ebae3f961b77fce5a95a9b0621b756f", "signature": "23f4f1627fbabd7891d7d8489631c7231d22de71864e262ab4da84ea8a13a60feac4dcfb1812f1200444b775f121d7266d755ce9b6a9ad796559c0a26b516d02" }, { "secret_key": "e9f6d31b936942c526e0f9ec4f5a7ac25fa789e0c434bcd9199d720c743c84c4", "public_key": "32126d26e28231c5b585b13f43a01c6fe542946b07d3a91e57d281523f5cb45c", "message": "e88133f3d17642d5c22779a85316ba0df34c792b4efee49ed7dd93ca3322ef47c72e5b2e4595c77800434b60719adf54e4c1a34c89fa1e27ee8d35a0921f9755ac4a77a6c1684ea0f5c8ee5f759ce59bfe8315800a67aa6c64ddfaac92eabe6c2c613779784b3affafcc620f2a6dc5cb8d8dc7d74aa4d79494678494e5e6394c433c14809ff40c9a592d0d694a81103b44531e1f48bc13965d15af8bf3340488f8cd58f09ae1a6616bf85ac9de7e0c6696aa2f1bec15e17a44da4a84edb4ec6d77247788ba0de3ae12a155cbedc0da2f568eef0b75a877ea5b0c2c0d4bf2c61d468a46faadfaece35fc263a9be9987f4f7f78f05c707784378c7b8f7daf9ac3a122aad39a1677966da9ef286c9e062c4f439ad0bddea26e54b2f7388e238b2a64928450d34564c5a447e7afbbedd1085f1f24c11ae084322d1a32cf8aa473941f00d56b1618213cab3900aa606463d9f800e926f9f42d4b082d8c5ec3a4a025b45f9aadc8bcbd17091b3da49e9453dc55e89b5b5fe6b31f5eddad10b6601572568d8e205d3251a", "signed": "7e3b1c4c716c808e90b974458915f3b2239c42077119fe270788fae520578bd7da6488044132e1bef23e3b23c34d9c1862744f28fcaecda6cac0fd72b93b6a0fe88133f3d17642d5c22779a85316ba0df34c792b4efee49ed7dd93ca3322ef47c72e5b2e4595c77800434b60719adf54e4c1a34c89fa1e27ee8d35a0921f9755ac4a77a6c1684ea0f5c8ee5f759ce59bfe8315800a67aa6c64ddfaac92eabe6c2c613779784b3affafcc620f2a6dc5cb8d8dc7d74aa4d79494678494e5e6394c433c14809ff40c9a592d0d694a81103b44531e1f48bc13965d15af8bf3340488f8cd58f09ae1a6616bf85ac9de7e0c6696aa2f1bec15e17a44da4a84edb4ec6d77247788ba0de3ae12a155cbedc0da2f568eef0b75a877ea5b0c2c0d4bf2c61d468a46faadfaece35fc263a9be9987f4f7f78f05c707784378c7b8f7daf9ac3a122aad39a1677966da9ef286c9e062c4f439ad0bddea26e54b2f7388e238b2a64928450d34564c5a447e7afbbedd1085f1f24c11ae084322d1a32cf8aa473941f00d56b1618213cab3900aa606463d9f800e926f9f42d4b082d8c5ec3a4a025b45f9aadc8bcbd17091b3da49e9453dc55e89b5b5fe6b31f5eddad10b6601572568d8e205d3251a", "signature": "7e3b1c4c716c808e90b974458915f3b2239c42077119fe270788fae520578bd7da6488044132e1bef23e3b23c34d9c1862744f28fcaecda6cac0fd72b93b6a0f" }, { "secret_key": "6bf4caaabb96854a38a572f4ce6c7838f7e750118c73f2723582618e2307f838", "public_key": "08126373d056f00e54b8d43d77c35f5f919833e90d8aafd6c8246d27917ad091", "message": "4776e9d60085481fa537bf295bdabd8b1cf632a8cd40bce6bd325c129f977000e88468ebf2dc158ac0f207212db00fb60b8ec8bae229372e9a6b01530a7ed1bc9d389ec8913f59030d5b54af56ae1ccc28f37cc96a8e53204e92a677766adfaada99b0281f867f61ac9ff7d972ee3ed427d72faae75d4aec01b5ffc37061b6f0f7e5714c4cf30d5b731b0746065f19e4c8922dde642f80fe24a3c8dcb2e5f1c266e2af6c37decf55a2baa54f0d5cf0839370c3e0b4e77a4f36bbb3162014933a4a4ebcae8c60961ac6dcf134f30828d31402ae74e7e8513c9d2ad8ee46b7a9d53a1f87ebfce04f461bded1749b6fc4c4f25793525692d7a0e426c84e06082cc3e6abb51368370cbb106c7a0897f66d92c9739cff9f2706d6a2980ecea3ac4945f0f47e656bd9637777e853d2a839104327dc049ebc34f049d6c2f80eca99db7b418424acef752260d2d427949323997cd9617edf50d441d0088b1d47912e35cf542315265829f383f45860d3b45e735bb2f8586dcf58db4f2acfb4a68853a96eed7b89769d365613", "signed": "d2113f80d6cf928486a250a679d6e74b35ea9d26061fa94d769e1a8fbfa0a734227f55537e4ebff59336db141cf5d6d482a0711f1e9fc72ff70956a11b4fb9094776e9d60085481fa537bf295bdabd8b1cf632a8cd40bce6bd325c129f977000e88468ebf2dc158ac0f207212db00fb60b8ec8bae229372e9a6b01530a7ed1bc9d389ec8913f59030d5b54af56ae1ccc28f37cc96a8e53204e92a677766adfaada99b0281f867f61ac9ff7d972ee3ed427d72faae75d4aec01b5ffc37061b6f0f7e5714c4cf30d5b731b0746065f19e4c8922dde642f80fe24a3c8dcb2e5f1c266e2af6c37decf55a2baa54f0d5cf0839370c3e0b4e77a4f36bbb3162014933a4a4ebcae8c60961ac6dcf134f30828d31402ae74e7e8513c9d2ad8ee46b7a9d53a1f87ebfce04f461bded1749b6fc4c4f25793525692d7a0e426c84e06082cc3e6abb51368370cbb106c7a0897f66d92c9739cff9f2706d6a2980ecea3ac4945f0f47e656bd9637777e853d2a839104327dc049ebc34f049d6c2f80eca99db7b418424acef752260d2d427949323997cd9617edf50d441d0088b1d47912e35cf542315265829f383f45860d3b45e735bb2f8586dcf58db4f2acfb4a68853a96eed7b89769d365613", "signature": "d2113f80d6cf928486a250a679d6e74b35ea9d26061fa94d769e1a8fbfa0a734227f55537e4ebff59336db141cf5d6d482a0711f1e9fc72ff70956a11b4fb909" }, { "secret_key": "5d9585736ab209b0abe8bf74aca4eea4f6d1650b532550a223e044580f8e20de", "public_key": "e77729edfd2144b2b12078765417fa21f1594f09b269e9b6706802b4f3bdfe85", "message": "08693591e6c58a5ead9c85fe8ec58508f81a3467636c2d34fcc1f466e5c6dafdc37c35cbee35589c6997e2b15448132744e5a1e131bb49bf5c2563f87ead3efe01e88cbf24cc1769c78cdfc167e378215b15859c7a28ece70e188fa330267d3fc57b4ace6c1520ec67875067fd33be86f4a1967afb3eb164c797cf28d8072aa69d82afa38374f8e5797c4c28471b7d69f5b9c7b4acdbc19f3c5c5d400808a982a47837aed1b3841d69890eeb31494e10e3e513d12d0ca686c7ce651778092703fef0dcc0214077dfb361251bdea4364dd41b97bceb0fb1475a50e4708f47f7878c74401e9771cc3fceace89169981aa77250850090d181d8358ebba65e290acb0352bece8c579832a601551816d1c05621ccbbee0fbe39ea2f195393199e69c234c2fb1c37e474840860ce609161fcfce2869574be0d38f95e20f4f8725247b9627b46e834905101ac12b934cbf87cb2d190d2f51490a82c4e810eddb81f956a9f36bda497bca506a49ee9cd47fda5b7f2b884a3648cadd12ab61898ada46ecc970f81dc9f876845db", "signed": "e7b08e1d5809fdd8529443d65ada5dd655ea55b5415a011393be7071676486d358e8d2a460ebe075b0e701b24c9e3ab5f2b033592d4de3b7f37fd541f692090908693591e6c58a5ead9c85fe8ec58508f81a3467636c2d34fcc1f466e5c6dafdc37c35cbee35589c6997e2b15448132744e5a1e131bb49bf5c2563f87ead3efe01e88cbf24cc1769c78cdfc167e378215b15859c7a28ece70e188fa330267d3fc57b4ace6c1520ec67875067fd33be86f4a1967afb3eb164c797cf28d8072aa69d82afa38374f8e5797c4c28471b7d69f5b9c7b4acdbc19f3c5c5d400808a982a47837aed1b3841d69890eeb31494e10e3e513d12d0ca686c7ce651778092703fef0dcc0214077dfb361251bdea4364dd41b97bceb0fb1475a50e4708f47f7878c74401e9771cc3fceace89169981aa77250850090d181d8358ebba65e290acb0352bece8c579832a601551816d1c05621ccbbee0fbe39ea2f195393199e69c234c2fb1c37e474840860ce609161fcfce2869574be0d38f95e20f4f8725247b9627b46e834905101ac12b934cbf87cb2d190d2f51490a82c4e810eddb81f956a9f36bda497bca506a49ee9cd47fda5b7f2b884a3648cadd12ab61898ada46ecc970f81dc9f876845db", "signature": "e7b08e1d5809fdd8529443d65ada5dd655ea55b5415a011393be7071676486d358e8d2a460ebe075b0e701b24c9e3ab5f2b033592d4de3b7f37fd541f6920909" }, { "secret_key": "60b142f165114143ca30a604fef51c686436aa1b9afdb266b3e398ccb3c4d855", "public_key": "eaf6c5a76ca99bf7306498888c3b7a1feae98bf8988d7f2e1547f8f53a4528aa", "message": "1815dee1173b78264720d35b7cc2454a000a65fff214e2473e20bc83f3ecde9c04c1e0696ce6e55519dd2a75ce0464bf601adc381e793ecb9f8ce7ab87b6ca2a3e410f639069451978d14873d3390fab8623969713c3dfcd58d86d124073761ee09a652a48767f9646cb726ac454ac9a1bc5faed3026b703982bc2b1e0758210e1d62519230eb2b2f4a486bc55168560c4363df5ff5adfda11ac7ef51b18196c94337c07aef117990f770c0f1e8c0f88eb6ffc40e8ed7c3a80a632db1e7f63b63096e2ac49e57792b31143e2f4faabceae66b27471681c36fc1139007f9b548cdc6e3b8fbbdaba7a8adb843431238bb461ba24f6e09f62c72d6377b4048cb0134c25a5411a20bfcfc13e48d80e36bfb0da7e0185d33f1928636e15dee0e5df8992a16572b13ea8f7cf85cae32d529f66e8f6d2fb2ad0bbfe7199169b2567ba00c781b20a48e1d70df9fa3119cd7e5bbe58884b0b51218940fa815f85625fa203471cee8084780eb0b9356f9f3d4f6df740301d707ef1ffb3519e3f90b8064b98e70f375d071426881718", "signed": "a621f084ea1a36ef812a9755c9afbb53dadaae6b3a53fa8344ca40d3612a268a35fed0fd398ab75bcd639c547937c94155ab1a7a3467dd4bfddfacab1655e9081815dee1173b78264720d35b7cc2454a000a65fff214e2473e20bc83f3ecde9c04c1e0696ce6e55519dd2a75ce0464bf601adc381e793ecb9f8ce7ab87b6ca2a3e410f639069451978d14873d3390fab8623969713c3dfcd58d86d124073761ee09a652a48767f9646cb726ac454ac9a1bc5faed3026b703982bc2b1e0758210e1d62519230eb2b2f4a486bc55168560c4363df5ff5adfda11ac7ef51b18196c94337c07aef117990f770c0f1e8c0f88eb6ffc40e8ed7c3a80a632db1e7f63b63096e2ac49e57792b31143e2f4faabceae66b27471681c36fc1139007f9b548cdc6e3b8fbbdaba7a8adb843431238bb461ba24f6e09f62c72d6377b4048cb0134c25a5411a20bfcfc13e48d80e36bfb0da7e0185d33f1928636e15dee0e5df8992a16572b13ea8f7cf85cae32d529f66e8f6d2fb2ad0bbfe7199169b2567ba00c781b20a48e1d70df9fa3119cd7e5bbe58884b0b51218940fa815f85625fa203471cee8084780eb0b9356f9f3d4f6df740301d707ef1ffb3519e3f90b8064b98e70f375d071426881718", "signature": "a621f084ea1a36ef812a9755c9afbb53dadaae6b3a53fa8344ca40d3612a268a35fed0fd398ab75bcd639c547937c94155ab1a7a3467dd4bfddfacab1655e908" }, { "secret_key": "734ba47033c6140232dd4a7a14f1a7743eefe9070bad9662491630cc9d28c1f3", "public_key": "2fa5df3026d60742e2aff6b57842c7126846c8a7bbe9266efa7b3f2398c357ea", "message": "5d3c659810c3fea52a6df3861e5cdc5b703cc1cef48558c61d8c51d0edea5a1479cfe5063d82ded9ca681e5748887c40ecfb9e1a9a8b7f8509d10776461c3923399693a78189089178d5aabd15f8c846642be47d6d4caf13824edcefb809868fa72ddf035c4de8ef0a9c832264f66f012761ce6955bc3c416e93e29188025ebbb13a553258c1d7c499c9a4aeb10bb36f61d1bb4cec5ae55d175722b9a9696df881951e35200b9653cf6ed4b3d15de087a9d1c319fce8582156bebf3fc91e0e610ff7a15308fd1d2c6069fbbb2947d3110731d245ae2963014bd76dea42db125cecc493c8e9091a76646577729aed4966fce9699fe12e367d665df9e95a9193e1133e143af92f82b66ac7764e5033178690521809a7107d8ae9b88e0ed1f35b1719901b930ad0e1cbce7fb30267b1155204f605f525e49de2988ea7f74be8815177fd976a1bcc126d9c9c135c5b4276d38019c34aefb7a0220f7f5aeff380aed627b070c2c9e21533bb35c08e394c85ae25e6862942599c65dbae5977a584a88180e0c8c71e5a8409e04ef7", "signed": "9bd074d1d0bd28001baf7d2d4e82435df08c4264d8cbb1c381183c2f01223f79f94923ca178cac75564e16c7f56079088f7ed885de4d509fbc78f438fba3f6075d3c659810c3fea52a6df3861e5cdc5b703cc1cef48558c61d8c51d0edea5a1479cfe5063d82ded9ca681e5748887c40ecfb9e1a9a8b7f8509d10776461c3923399693a78189089178d5aabd15f8c846642be47d6d4caf13824edcefb809868fa72ddf035c4de8ef0a9c832264f66f012761ce6955bc3c416e93e29188025ebbb13a553258c1d7c499c9a4aeb10bb36f61d1bb4cec5ae55d175722b9a9696df881951e35200b9653cf6ed4b3d15de087a9d1c319fce8582156bebf3fc91e0e610ff7a15308fd1d2c6069fbbb2947d3110731d245ae2963014bd76dea42db125cecc493c8e9091a76646577729aed4966fce9699fe12e367d665df9e95a9193e1133e143af92f82b66ac7764e5033178690521809a7107d8ae9b88e0ed1f35b1719901b930ad0e1cbce7fb30267b1155204f605f525e49de2988ea7f74be8815177fd976a1bcc126d9c9c135c5b4276d38019c34aefb7a0220f7f5aeff380aed627b070c2c9e21533bb35c08e394c85ae25e6862942599c65dbae5977a584a88180e0c8c71e5a8409e04ef7", "signature": "9bd074d1d0bd28001baf7d2d4e82435df08c4264d8cbb1c381183c2f01223f79f94923ca178cac75564e16c7f56079088f7ed885de4d509fbc78f438fba3f607" }, { "secret_key": "45e34d0ef4c196fa6d572b6b1774b5218f7c3291304c13500df7070d90e8039e", "public_key": "13a7304dff423359177abafa5e6508d26769ca99cf8af45c383f3ff634406003", "message": "3d9ed5c64b75e135df2f5e85300d90f21b363935e2817556fc9311751ba7535477dec8356ec385efb82b414062f35bb6d3edeafde305f9900a25e9813c9ee0237d46409650cdcdb5dfa2301a8e2647f8d3819d86f7b7e3070d33440f82c4054b1ab5edebeb27f95b3c4c6fdd468f21600f03b3494da200bab9293c38d02fc44048e52ff5fd0f7217a04d4ce912a180d1628f368280b6892672e8ff98d4629ac28b60c02a301e6c6026c1b9e9ef21cf0392df225008d5a0e0284b282631ad1710f811615697066c98296519948a7cfed5aeeb454ee7a61cc271bd3d499be17df09d3a0e790ee6b9bd99e1b919bed4a063b8d1a34f1afd2e952b9dfefd770969c8b2fc37977abb0fee6317253a23ecc97578168973334c8f91763ab97f29c49baeee7b35f3ae7f5cd3a4a6e697ef255a3c2ec0c752a3396f69f663ca1fc2b332dfe6c0faf78afe9c68d99571e8e896c5093085e9863a27648a9e58f3a9a84cbbfe2b41ca3633dd5cf6e82cb77cecacad8d78b353f48db42d99c36bcad170ea9e98abb2788c33a3c706268f3631", "signed": "b42c1f925f4baccd129efb109db354aca31c6898f4f451294749a26a6da1677bd3a5c04119e35f47319f20cfdfc08bb4528b21009e00bd41ebc0f46863bed10b3d9ed5c64b75e135df2f5e85300d90f21b363935e2817556fc9311751ba7535477dec8356ec385efb82b414062f35bb6d3edeafde305f9900a25e9813c9ee0237d46409650cdcdb5dfa2301a8e2647f8d3819d86f7b7e3070d33440f82c4054b1ab5edebeb27f95b3c4c6fdd468f21600f03b3494da200bab9293c38d02fc44048e52ff5fd0f7217a04d4ce912a180d1628f368280b6892672e8ff98d4629ac28b60c02a301e6c6026c1b9e9ef21cf0392df225008d5a0e0284b282631ad1710f811615697066c98296519948a7cfed5aeeb454ee7a61cc271bd3d499be17df09d3a0e790ee6b9bd99e1b919bed4a063b8d1a34f1afd2e952b9dfefd770969c8b2fc37977abb0fee6317253a23ecc97578168973334c8f91763ab97f29c49baeee7b35f3ae7f5cd3a4a6e697ef255a3c2ec0c752a3396f69f663ca1fc2b332dfe6c0faf78afe9c68d99571e8e896c5093085e9863a27648a9e58f3a9a84cbbfe2b41ca3633dd5cf6e82cb77cecacad8d78b353f48db42d99c36bcad170ea9e98abb2788c33a3c706268f3631", "signature": "b42c1f925f4baccd129efb109db354aca31c6898f4f451294749a26a6da1677bd3a5c04119e35f47319f20cfdfc08bb4528b21009e00bd41ebc0f46863bed10b" }, { "secret_key": "888ce2ecceda9ca2b948ac1443c2aedd7595aacf36edaf27255bde7a6991dcc0", "public_key": "016e572b4f98417c6ee297abd784ea48226ff4fbf0050a5ade8806e7046d3ba3", "message": "5c801a8e664e7660760a25a5e1431a62159fc3f3aa713780ae7cbce23b8564782799bf2be4817ee2921965bab7e1d44833824c1628d42dcee3e46ae42b2816d0a432a1ab0bd21fcf30adb63d8dd76569544343d0035c760522ca68bea72c404edda1e9095ec90f3325681c6de0f4c12d1afbcba2c7871a1b1e1f19c35b0bed9ec2a87c043d36d819396bd5d099e1aa090391297c733f65a8c5d2120c67635316fab25b4d4847a45fc3f76f2e2426dbee4629975062fce14e2189dba27fb1ded2453f001debfaa899c11660612d2ce2ad2f762ea5dee7e71e58adcdcefa79e8e8b27fc4ccf89aabf176b5d34f82dd15d889f9f087dc9ae8a42a72f3b83583616e170637cd1adf38aa6551cbacca3602bdc7ae210c4a446b3af8db2720e549bbedb8bed215ae00f19da29d8fb0b642d27b2d88575f0ee84f3d129eb774d20f537a1c0fdcf717bdebcfe47f8331a341864346fa6a1c6bbfd178819e387a0d5499a68e81cc9f82ad39e31e4dfe71952d5ea5cc8052a3ceed1751f59dc7ecc9742fad144e18dda8d0582e74e39ca8c4", "signed": "99d83f148a236ebbef1cad88cb3c7694f4986c9250e21c3603a0d941bff199cf77d6ce99efdb20533188d68ad133de033a1fb3468abb706d2b8b4fbac08dfe035c801a8e664e7660760a25a5e1431a62159fc3f3aa713780ae7cbce23b8564782799bf2be4817ee2921965bab7e1d44833824c1628d42dcee3e46ae42b2816d0a432a1ab0bd21fcf30adb63d8dd76569544343d0035c760522ca68bea72c404edda1e9095ec90f3325681c6de0f4c12d1afbcba2c7871a1b1e1f19c35b0bed9ec2a87c043d36d819396bd5d099e1aa090391297c733f65a8c5d2120c67635316fab25b4d4847a45fc3f76f2e2426dbee4629975062fce14e2189dba27fb1ded2453f001debfaa899c11660612d2ce2ad2f762ea5dee7e71e58adcdcefa79e8e8b27fc4ccf89aabf176b5d34f82dd15d889f9f087dc9ae8a42a72f3b83583616e170637cd1adf38aa6551cbacca3602bdc7ae210c4a446b3af8db2720e549bbedb8bed215ae00f19da29d8fb0b642d27b2d88575f0ee84f3d129eb774d20f537a1c0fdcf717bdebcfe47f8331a341864346fa6a1c6bbfd178819e387a0d5499a68e81cc9f82ad39e31e4dfe71952d5ea5cc8052a3ceed1751f59dc7ecc9742fad144e18dda8d0582e74e39ca8c4", "signature": "99d83f148a236ebbef1cad88cb3c7694f4986c9250e21c3603a0d941bff199cf77d6ce99efdb20533188d68ad133de033a1fb3468abb706d2b8b4fbac08dfe03" }, { "secret_key": "617390857dc10cdf82b5c94261f58ce2d44aa2f57d298f08a2d6c74d28147daf", "public_key": "89e0c3e0a0f130d1916e0e3849b7286fa2e3ac4c17bd1f716ee5a72f0257fb8d", "message": "1fd9e7453eaffd7c9b54055622dde170dd58b71cb945de75351d5fceb1f536bde25158f03786155f953dc207a1708f90d95b15aca0aee3097fdcaae85e4ab1c2cdb705c53e6c2ed21a994b304a75caf2ce4fc7d61f561e74e297397e2cde5cc69056940343aa81375d0af18d17d2f34c0a71dcf1de3c4fc488a14c5fa6b3337a3174b1da7958fb00bd5955148221427c60dba04117c80d2488656dbd5343de891287b50ef4df9825eda76b4977f3acd4ab6d3102fa56878306cd76561491bcfdaa1da567e677f7f03bae5dbf4426c3c4a6c3d082f9178b2efdd2bd49eee97ef4dcf3f0f51bbdeffe5ae6601e28019518f827f02e51f6679b8715978bec3e69d577156dd719959371baf034219fbbd17a2369a8541490f6a02013e33e74f4769be37aefa4defb6bfb3f351c2a261482c2fbec49f85f8445456e8f5a474030cd72d095ef6a622030e1e43a0c5debb034731d2f5e8e4ba3990f077d0c162649d1fa3ea4fe1e81d74aa849e21b059d966cbad4c493ca10bafe7a69243e3c0a6ebfd13d697906303392ba65d4fe06b6a5", "signed": "63e90a6afbbbb0ee696bfb56efd679d68a9851a8947640a97f41f68edfeadd216ed8698e2e43c820c9044caa7adaab5b76762b681831a9f760476a8443c43c061fd9e7453eaffd7c9b54055622dde170dd58b71cb945de75351d5fceb1f536bde25158f03786155f953dc207a1708f90d95b15aca0aee3097fdcaae85e4ab1c2cdb705c53e6c2ed21a994b304a75caf2ce4fc7d61f561e74e297397e2cde5cc69056940343aa81375d0af18d17d2f34c0a71dcf1de3c4fc488a14c5fa6b3337a3174b1da7958fb00bd5955148221427c60dba04117c80d2488656dbd5343de891287b50ef4df9825eda76b4977f3acd4ab6d3102fa56878306cd76561491bcfdaa1da567e677f7f03bae5dbf4426c3c4a6c3d082f9178b2efdd2bd49eee97ef4dcf3f0f51bbdeffe5ae6601e28019518f827f02e51f6679b8715978bec3e69d577156dd719959371baf034219fbbd17a2369a8541490f6a02013e33e74f4769be37aefa4defb6bfb3f351c2a261482c2fbec49f85f8445456e8f5a474030cd72d095ef6a622030e1e43a0c5debb034731d2f5e8e4ba3990f077d0c162649d1fa3ea4fe1e81d74aa849e21b059d966cbad4c493ca10bafe7a69243e3c0a6ebfd13d697906303392ba65d4fe06b6a5", "signature": "63e90a6afbbbb0ee696bfb56efd679d68a9851a8947640a97f41f68edfeadd216ed8698e2e43c820c9044caa7adaab5b76762b681831a9f760476a8443c43c06" }, { "secret_key": "877d017436369ec2453fed46e977d6acc3a7be60d31395ad6e7ea9e07480e4c9", "public_key": "4e65422fed334a55e8b673893eba7c181dd724dda002817b0bae28acdc3f7fc0", "message": "4ed3f5bdbd41d0e3b0a8a7fc3752eea496d6141678cbfe06757f61e1a168d761b6da83052f7994950d24626f004fbe9b8c9562e0c955fb3b5c08fd2d3d258393a349030c8e156205b40483038be1959f1cba490a87fe13899e4f3752063b68fe3e1c5071f7db0002f01494b4a3ee2e07992bdd200db4316629ee8a95ca347f0b28d6402a6da8b53e6b32581c3691e11ae9b6e0f0494894e649a92d03eb49c4d6833fa1f54f8dcd91d06936a6e62d491e2cea46dd07d9f02d3254b850bc9749f258a61ad3b9cc24b03287331b85a24143aaf8fcccac5f18bfc72dec75c0233516aa6e4589c78c665a186ed902091df97b0d04e83a2d74d789891aea2cacf813fffb5efaf78dbcd7af54ef55c77b1c4c8ace9e9278adc23d76c779d64b3bbbd1fb33b09836ea64a71e4711e89e8da0f709213342176ae22c6e7852c3973b60d9f98889b442aa48d7bfdfdef64c36c586c4fb2ad2e27ebe479f6d722f069fd6106b0d08975d5f721547c3b9c52f9fc5f45bb45b5b632188e80626518a79056bdc4ee1d2be6c6542a21fadea92c6dfb776", "signed": "7688f3f2401eacaf2dd88e170ff1c4d7e94822a77f6b550b569e82152bbbb434057e01230b05ce58ee1dee5226b5c7cdbe5a8ade3b9465f59aed74145d14330c4ed3f5bdbd41d0e3b0a8a7fc3752eea496d6141678cbfe06757f61e1a168d761b6da83052f7994950d24626f004fbe9b8c9562e0c955fb3b5c08fd2d3d258393a349030c8e156205b40483038be1959f1cba490a87fe13899e4f3752063b68fe3e1c5071f7db0002f01494b4a3ee2e07992bdd200db4316629ee8a95ca347f0b28d6402a6da8b53e6b32581c3691e11ae9b6e0f0494894e649a92d03eb49c4d6833fa1f54f8dcd91d06936a6e62d491e2cea46dd07d9f02d3254b850bc9749f258a61ad3b9cc24b03287331b85a24143aaf8fcccac5f18bfc72dec75c0233516aa6e4589c78c665a186ed902091df97b0d04e83a2d74d789891aea2cacf813fffb5efaf78dbcd7af54ef55c77b1c4c8ace9e9278adc23d76c779d64b3bbbd1fb33b09836ea64a71e4711e89e8da0f709213342176ae22c6e7852c3973b60d9f98889b442aa48d7bfdfdef64c36c586c4fb2ad2e27ebe479f6d722f069fd6106b0d08975d5f721547c3b9c52f9fc5f45bb45b5b632188e80626518a79056bdc4ee1d2be6c6542a21fadea92c6dfb776", "signature": "7688f3f2401eacaf2dd88e170ff1c4d7e94822a77f6b550b569e82152bbbb434057e01230b05ce58ee1dee5226b5c7cdbe5a8ade3b9465f59aed74145d14330c" }, { "secret_key": "4f0b3607d70b0f2698327ef4f1982c5b4b94be78f50c76f43bd642f1f0ede39b", "public_key": "942b43089fd031cec0f99e5e550d65307fb6c3e793449fb390ff730fffd7c74b", "message": "9f700a1d2560f69d9bc105bc83bff539e4258c0248602013a959b978a19cc273280d90c0178089578b50518e06ad1eab790ffe710c63d78887a95569144f3e58a8837f93dd516fcddd22bc97a7f14411d424b2e8e9aa7c280119ad94ce92533fc7fea6c66248644ac3e1beef2553a6f61e91b9379b0fe0c68b40681455b311f40df0c97f53fc954242c375e7708d61bad9f51296247274fa01a7328fa5009d9995f501ae8683552b11a49d2638116723b1319450a90138d278cd9512b80ca5792ed16c683bef92ec87884c9f07f137dc47a13146e511065c2e1b4b80efde88ae12e29431beb7aee365c16d80506b99afa6a1406edb061766875832dba473e519dd7018f402eb1bb3014b7cee4f02e980b1b17127e7d25dfe0c168c5344f1c90044f827707dca03070e4c43cc460047ff62870f075f34591816e4d07ee302e7b2c2ca9255a35e8adec03530e86a13b1bdfa1498813098f9ba59f8187abcafe21ba09d7c4aaa1ad10a2f28334ab53996147c2459c01b6a10839e0301123d91a35ced7af89afbac7d9cf8ac9a38ceebef83", "signed": "f396a11f2f03c61439684f79001bd4f346a348dcf1d3beb2d3bfe33ea73a5ad4eb97506acfbffb784e77548189cd599f8ccf17355dde80e75024ef2a78d5fa039f700a1d2560f69d9bc105bc83bff539e4258c0248602013a959b978a19cc273280d90c0178089578b50518e06ad1eab790ffe710c63d78887a95569144f3e58a8837f93dd516fcddd22bc97a7f14411d424b2e8e9aa7c280119ad94ce92533fc7fea6c66248644ac3e1beef2553a6f61e91b9379b0fe0c68b40681455b311f40df0c97f53fc954242c375e7708d61bad9f51296247274fa01a7328fa5009d9995f501ae8683552b11a49d2638116723b1319450a90138d278cd9512b80ca5792ed16c683bef92ec87884c9f07f137dc47a13146e511065c2e1b4b80efde88ae12e29431beb7aee365c16d80506b99afa6a1406edb061766875832dba473e519dd7018f402eb1bb3014b7cee4f02e980b1b17127e7d25dfe0c168c5344f1c90044f827707dca03070e4c43cc460047ff62870f075f34591816e4d07ee302e7b2c2ca9255a35e8adec03530e86a13b1bdfa1498813098f9ba59f8187abcafe21ba09d7c4aaa1ad10a2f28334ab53996147c2459c01b6a10839e0301123d91a35ced7af89afbac7d9cf8ac9a38ceebef83", "signature": "f396a11f2f03c61439684f79001bd4f346a348dcf1d3beb2d3bfe33ea73a5ad4eb97506acfbffb784e77548189cd599f8ccf17355dde80e75024ef2a78d5fa03" }, { "secret_key": "b8a0010c784d8d002a31da11d022d30188a4197a1d5f14ea4c0dab29a2e40668", "public_key": "8bdc63e50bede13c91a41e4b4b7857b9e553f484e3c1ec167dc04c281ea86622", "message": "5c6ccb298be216808b811e56d972f456b69ad39594eee354701ca6b3e38d1f41a359e5512af98a3a0873265fe5191f4f2ecaf66bee75a3ac0b71a4ddf2a759ebdddbd88a6a1c6fd0fcf7d7cb92a84e3307b4a4f98c710abf4f553dee74f652d2ac64bc30f72bf4354ef7e806a19071a051bcfcfb27e37fddd41eceaec1758e94695c670ef4c5a5902178329db9585c65ef0fa3cd62449bb20b1f13aecfdd1c6cf78c51f568ce9fb85259aad05b38c6b485f6b86076928ddb4e2036f45e7b9c6a7ff24ae1776030e2576825019ab463ebf7103a33072033eacbb5b503f53266afb82f9b2454b8dc057d84f30d9d2cb7c3a31a7dbdfba5b8e49231c231396c47ca042c8e48a1a5e3ec9afe4020595390f9990dfb874e0825ae9ae5e752af63af6fd3e787e75e8d8dc4c66302277ac01b30a18a56cb82c8a7ebdc915b7153255a1fedc492e49660262bb249780d173e1fd20d18c4f6b0b69aa2eca024bf3c80d7d5962cc4a129a7943b27f33cc799a36045541275a2cdb92a40e485ba8b737a04b43d29c3e25f76cb3d93a6b94461f88f5696", "signed": "b3f6cf4c0e0f9074ff2c2c47e163202f1e9d6ee117cf757633e4abe74423aa70008ada1509ec1dc117c1c230e9b23786f3d0f29b73aa284536e9580106a8a70c5c6ccb298be216808b811e56d972f456b69ad39594eee354701ca6b3e38d1f41a359e5512af98a3a0873265fe5191f4f2ecaf66bee75a3ac0b71a4ddf2a759ebdddbd88a6a1c6fd0fcf7d7cb92a84e3307b4a4f98c710abf4f553dee74f652d2ac64bc30f72bf4354ef7e806a19071a051bcfcfb27e37fddd41eceaec1758e94695c670ef4c5a5902178329db9585c65ef0fa3cd62449bb20b1f13aecfdd1c6cf78c51f568ce9fb85259aad05b38c6b485f6b86076928ddb4e2036f45e7b9c6a7ff24ae1776030e2576825019ab463ebf7103a33072033eacbb5b503f53266afb82f9b2454b8dc057d84f30d9d2cb7c3a31a7dbdfba5b8e49231c231396c47ca042c8e48a1a5e3ec9afe4020595390f9990dfb874e0825ae9ae5e752af63af6fd3e787e75e8d8dc4c66302277ac01b30a18a56cb82c8a7ebdc915b7153255a1fedc492e49660262bb249780d173e1fd20d18c4f6b0b69aa2eca024bf3c80d7d5962cc4a129a7943b27f33cc799a36045541275a2cdb92a40e485ba8b737a04b43d29c3e25f76cb3d93a6b94461f88f5696", "signature": "b3f6cf4c0e0f9074ff2c2c47e163202f1e9d6ee117cf757633e4abe74423aa70008ada1509ec1dc117c1c230e9b23786f3d0f29b73aa284536e9580106a8a70c" }, { "secret_key": "efc86cbe40363abfbb2a4b1fcce5fd6084da96e7e814de71aadf9a618f303625", "public_key": "22f295cee727d28d2b9317153e7d9412da1065c1b16ae2a251dd1fb431c62b01", "message": "9e4fa45dc026710f6bef4ed0f07c544b0bb0d88fa79e7177d8448bc209d71cfe9743c10af0c9937d72e1819e5b531d661c58c63141ce8662c8839e664db79e16c54d113abb02a75bdf11b3453d071825bc415741e99483546b8e1e6819de53017092e4ef871f1ca0d3508f937828a4667db11ffff9416eebb94bf9b84d654603094834a99ca70b90f562a86823624dfe9cb2f9e88c173f13464d4ce255f222db50dd63ab42465734e75295c064b64cc3f15e6237e37f33d615f7c243e4ba308960cfd4393402525500bb7902970b3931d48b35666a2d4d2ab08fa12af366a004346c9dd93d39fb1b7340f104e51fedbb533605b5ff39cf6d59513f12856dcfa198d793b0fc875cdea0741f1455746d8a19c3e9d928f0021b01c25131811e48c3c75c6f41422a8810c6c81f35b454eeae8cd17cf3f2e6f0bcd9f290984f496578623ab8e2738d2d10840eb91d101cb4a23722b72e3dd185440c3b9f44d46a393a34c187a20d610bb698c50531741efe96323512329800772a408065a7ef8e4e4105eb1f5bf6d3fd6b217fd836d89f53b96f45", "signed": "f8818310228ca76111524ce94bfcb0246ea63508cee9306592b2f77548edefcf76bd1454508ea715042cec169cea5115ab54235cb1097b10702aa38378028e0c9e4fa45dc026710f6bef4ed0f07c544b0bb0d88fa79e7177d8448bc209d71cfe9743c10af0c9937d72e1819e5b531d661c58c63141ce8662c8839e664db79e16c54d113abb02a75bdf11b3453d071825bc415741e99483546b8e1e6819de53017092e4ef871f1ca0d3508f937828a4667db11ffff9416eebb94bf9b84d654603094834a99ca70b90f562a86823624dfe9cb2f9e88c173f13464d4ce255f222db50dd63ab42465734e75295c064b64cc3f15e6237e37f33d615f7c243e4ba308960cfd4393402525500bb7902970b3931d48b35666a2d4d2ab08fa12af366a004346c9dd93d39fb1b7340f104e51fedbb533605b5ff39cf6d59513f12856dcfa198d793b0fc875cdea0741f1455746d8a19c3e9d928f0021b01c25131811e48c3c75c6f41422a8810c6c81f35b454eeae8cd17cf3f2e6f0bcd9f290984f496578623ab8e2738d2d10840eb91d101cb4a23722b72e3dd185440c3b9f44d46a393a34c187a20d610bb698c50531741efe96323512329800772a408065a7ef8e4e4105eb1f5bf6d3fd6b217fd836d89f53b96f45", "signature": "f8818310228ca76111524ce94bfcb0246ea63508cee9306592b2f77548edefcf76bd1454508ea715042cec169cea5115ab54235cb1097b10702aa38378028e0c" }, { "secret_key": "33556c60de2f2c9a9303b99add378592060505f8e49861085a4b15f072a7ef28", "public_key": "231ec8cd845859f69961275119dbe4f715e5ec5aa98bb8741675b3c2d0c89fee", "message": "96af540ea2b1923f5fd0aad321ac032070c2d65ba13d164e75c3469758fcf31bb31655cb3a721f9cb34be2c90c77eb65be37f606d32a917a4cb9a709ac0705229930ef6eb6fdb0fa3c0fd3a90ce171674ee3ed06354bafc3c7075467a57445b80385640447902be39262894b1f64fea58287dc322d19875972a7c8be91d31f021c70eb682fdf11a10f8f582a126e064794838c69fdf64f5b6e8ba59d48b4384f8e9fb5c087cc7738295cd32344ba3b697ee6b6a8b78ee7a9575c97972a4d1bb18486f9037a0f3c6f471a90f86498dbc0df5232c07e8c01b690bee75302992a7a36fb4437c25a8bf5e34cf7d5b55572c700a079848d381364f9946a91eb1603ff3de5ebdd523bd92564818e237a53e8f522deaa2c29b897e961586e100ed0fc0ad70d160934e694027e5c957920bc0546e901be39a84535597e1f280c222267abe97f41205d8171820dd2faafc0699419321a9160f69b99fd41180945b62d2dd105cc7bbe821d28605e098edfa8b2309aeb0534e756377f59937c67463fd87c8b92ab58119cf4ce6c665af572fbae1de4a2cc71", "signed": "e06a7a414457bbbef2bac3775ccad087dacb1fa4bf938894e8c929118e09e678dd19938bc88f43ed0f7d31cc6a0e602c4e4d1fee33d41e74a119fa2d1e4e340f96af540ea2b1923f5fd0aad321ac032070c2d65ba13d164e75c3469758fcf31bb31655cb3a721f9cb34be2c90c77eb65be37f606d32a917a4cb9a709ac0705229930ef6eb6fdb0fa3c0fd3a90ce171674ee3ed06354bafc3c7075467a57445b80385640447902be39262894b1f64fea58287dc322d19875972a7c8be91d31f021c70eb682fdf11a10f8f582a126e064794838c69fdf64f5b6e8ba59d48b4384f8e9fb5c087cc7738295cd32344ba3b697ee6b6a8b78ee7a9575c97972a4d1bb18486f9037a0f3c6f471a90f86498dbc0df5232c07e8c01b690bee75302992a7a36fb4437c25a8bf5e34cf7d5b55572c700a079848d381364f9946a91eb1603ff3de5ebdd523bd92564818e237a53e8f522deaa2c29b897e961586e100ed0fc0ad70d160934e694027e5c957920bc0546e901be39a84535597e1f280c222267abe97f41205d8171820dd2faafc0699419321a9160f69b99fd41180945b62d2dd105cc7bbe821d28605e098edfa8b2309aeb0534e756377f59937c67463fd87c8b92ab58119cf4ce6c665af572fbae1de4a2cc71", "signature": "e06a7a414457bbbef2bac3775ccad087dacb1fa4bf938894e8c929118e09e678dd19938bc88f43ed0f7d31cc6a0e602c4e4d1fee33d41e74a119fa2d1e4e340f" }, { "secret_key": "7a5c74314e1183334a4b6226b9a82d70fc2a124e3f87db6a2283ee05b68e34e0", "public_key": "beae7d3dd97c67f6273bfaa066131fed8ace7f535fe6464e65791c7e5398576c", "message": "98bac6724755912992adc2a48b5442376f2d927997a040fb98efe544eb0c8e1866b9616e298d3360316ed976bd946a411fdd3a6b625c0c1a37af0f41cf6569a7884ab8467491a987df3ea7a0b7ebc4692569a34ce3a2ea3503495b2c02d49d7d7db579d13a82cf0cf7a9547a6eaebe68e7267d45a60b8d4772455228cca4036e282e1a1216f34cef7ea68f938270bdb04293c885d005f9f7e638a8b4ead2626c0945174ff2a3e2d6e15a4c0338c09e1260f0928ca9d3499824f3fedc4785da49c5c34a56855e241facc6347a399ddcac4399a8b158198c151461a3b189e58ec1f7efcf2ab2031fb17b6f035ba1f092e9eee2e92c2d6cc2032287f854b41e70fc61c8d11a2e4f0708f02eebd02e8c7e8c7b38a57bfa1a745f3a86c23909f6f89ab16ce7e1813c1d20147f31b4cf2ad0b606fb17e5ac1ab51ef4a7d8093cee9a655f471dc5b146bd1b93e540a3d3d3e2de8105911c10d6ab5ff79c2d06027f7a54561f2071414bd330a8785442251c810e232f83c367f0be7799a93f5238f7f17b5be829fd89123c04833af8b77e5a4363047ceca7", "signed": "c2ab1f6f5114a84f218502582c567b37a8bdbcdf6340fa4622873be89106f0a90b4829505f72129df0ab3d8513268774a34df3ad21ce254b464488addd6c9b0498bac6724755912992adc2a48b5442376f2d927997a040fb98efe544eb0c8e1866b9616e298d3360316ed976bd946a411fdd3a6b625c0c1a37af0f41cf6569a7884ab8467491a987df3ea7a0b7ebc4692569a34ce3a2ea3503495b2c02d49d7d7db579d13a82cf0cf7a9547a6eaebe68e7267d45a60b8d4772455228cca4036e282e1a1216f34cef7ea68f938270bdb04293c885d005f9f7e638a8b4ead2626c0945174ff2a3e2d6e15a4c0338c09e1260f0928ca9d3499824f3fedc4785da49c5c34a56855e241facc6347a399ddcac4399a8b158198c151461a3b189e58ec1f7efcf2ab2031fb17b6f035ba1f092e9eee2e92c2d6cc2032287f854b41e70fc61c8d11a2e4f0708f02eebd02e8c7e8c7b38a57bfa1a745f3a86c23909f6f89ab16ce7e1813c1d20147f31b4cf2ad0b606fb17e5ac1ab51ef4a7d8093cee9a655f471dc5b146bd1b93e540a3d3d3e2de8105911c10d6ab5ff79c2d06027f7a54561f2071414bd330a8785442251c810e232f83c367f0be7799a93f5238f7f17b5be829fd89123c04833af8b77e5a4363047ceca7", "signature": "c2ab1f6f5114a84f218502582c567b37a8bdbcdf6340fa4622873be89106f0a90b4829505f72129df0ab3d8513268774a34df3ad21ce254b464488addd6c9b04" }, { "secret_key": "da8006adc492ca5dc86c2959437a75deb6120ff787d2ecb9c20c30b52c26bc41", "public_key": "ff113bf0aa58d546f2385d444ecb7888f8caba43a174a89fd6065f2b7dc17bf0", "message": "3eb4324dbc0149d2e7d6df632bb0cbe9a9f6dfa83e227fc07bde1b577b3611fb921c9f8313f068e6295d4913a8196be530f6a01f57c09c028491444b784720e909ea1fb69c1c1dd6304400327b7731b33cc46deb046cdab6ad1b53f1749a0c65cb9a7e376ffa02230f536584aea243c639103adbba764321649d7e0126f82e0b4fd9dcb86c731cbcc517f2016841e916bcd5fde871dc098cd913dc546284d1b2165c63e88f32a2789a500856371b50d22fb8c87d1a3caedcdfd01ee5f870a53c284181d632ec66d48b6bdd5646ac39c9e75338a520212062bc3466ef5c58765570b905f63a93d07f8f1baac3526b016da799f3e9e03a4f7f81355e0f7a76f30a42b807322051b71c626a7a296d75b9d9d1a23bcb13c9ef48a912dc057325d3bcfb3f9fadaf0c249b102aeb854aa3631e34f69ad90c2ab2ed33bacc40b9ed1037fae67cdf799d5a9b43785961127d62f8e0bc1589fd1a06fca2aea7cfc012cbf7b5b207ddc4e677d8ae4aec100045ce36c00b74d1d28250791236dc5dcc1ed313c8c246172666f75217437c6034acd64198cd96df2a", "signed": "1f5375dcb3ad2baaff956d8554ecb424176be9a6eb9ea54e814e0a73df2a5d848ada26ba8e1805cd51c5e16950c1ff7d4d2764daa6f4c7502fb865cbe55aaf0b3eb4324dbc0149d2e7d6df632bb0cbe9a9f6dfa83e227fc07bde1b577b3611fb921c9f8313f068e6295d4913a8196be530f6a01f57c09c028491444b784720e909ea1fb69c1c1dd6304400327b7731b33cc46deb046cdab6ad1b53f1749a0c65cb9a7e376ffa02230f536584aea243c639103adbba764321649d7e0126f82e0b4fd9dcb86c731cbcc517f2016841e916bcd5fde871dc098cd913dc546284d1b2165c63e88f32a2789a500856371b50d22fb8c87d1a3caedcdfd01ee5f870a53c284181d632ec66d48b6bdd5646ac39c9e75338a520212062bc3466ef5c58765570b905f63a93d07f8f1baac3526b016da799f3e9e03a4f7f81355e0f7a76f30a42b807322051b71c626a7a296d75b9d9d1a23bcb13c9ef48a912dc057325d3bcfb3f9fadaf0c249b102aeb854aa3631e34f69ad90c2ab2ed33bacc40b9ed1037fae67cdf799d5a9b43785961127d62f8e0bc1589fd1a06fca2aea7cfc012cbf7b5b207ddc4e677d8ae4aec100045ce36c00b74d1d28250791236dc5dcc1ed313c8c246172666f75217437c6034acd64198cd96df2a", "signature": "1f5375dcb3ad2baaff956d8554ecb424176be9a6eb9ea54e814e0a73df2a5d848ada26ba8e1805cd51c5e16950c1ff7d4d2764daa6f4c7502fb865cbe55aaf0b" }, { "secret_key": "a284e26b97e538839c808d45bde6f012a354454aef81caa8c55914624f2b7d66", "public_key": "5ae46e34695efaf463a4208fc4e35b81f2c63593238a56f2444b850f058c3c5c", "message": "9ebfe910b50a5cb719d95b961e5905f00ec7943b55468ab5956692017645b366071f8fbb77eb49ec73ea7d64511405b90de22db98c3eae39c4039c7a133430e8010bdd39a00fd1a528b113dae149cfad3ae340da27dcc507782ecd8929237517afe7463eca2473c7acf6f7aa04efc9f266ae7b6d63bb8cc2a438b344827f0713d1f1736f0cbb65b99353f20355fa0230d4fa707328a8662654e83ad0530a10f9a69e17c099e1e2b5db18e5f6f1dceda5883e8cab79701a5e9089562ed153ad08c674f097c28e4d16633e092969a8f0bdac54527c0ee03bc200e5be612e3d1eabd87091101b4962afa07b310806992f373076d76a58185118137c9d26ee2cd4c618c18283dd19f0e7a089ee37305b6b9518a78d8098436ef62be7d699808acecf67939d61b3e02937cd8c5f1e746d4274334bc9c37fdcba234c166fd712893f3a040832ec5425e57d80f11ef9ca5fbcd6c147fbbf5e2fae746e0ddb605867e3bd050483c3cd1329abe57a60bf88898dc7e80ede0f4517de8fc807e888b621a00f663084ff94b99996628f3b11690a60f0918cb5c9a7ef", "signed": "bf110e2e9cecbc31fa3e0c2438cd1f4321f92cd287005a48528addf76cad8d88bb22719ef91b139562a1511838682674faa9ff7e7ade6c9d573f845036d189059ebfe910b50a5cb719d95b961e5905f00ec7943b55468ab5956692017645b366071f8fbb77eb49ec73ea7d64511405b90de22db98c3eae39c4039c7a133430e8010bdd39a00fd1a528b113dae149cfad3ae340da27dcc507782ecd8929237517afe7463eca2473c7acf6f7aa04efc9f266ae7b6d63bb8cc2a438b344827f0713d1f1736f0cbb65b99353f20355fa0230d4fa707328a8662654e83ad0530a10f9a69e17c099e1e2b5db18e5f6f1dceda5883e8cab79701a5e9089562ed153ad08c674f097c28e4d16633e092969a8f0bdac54527c0ee03bc200e5be612e3d1eabd87091101b4962afa07b310806992f373076d76a58185118137c9d26ee2cd4c618c18283dd19f0e7a089ee37305b6b9518a78d8098436ef62be7d699808acecf67939d61b3e02937cd8c5f1e746d4274334bc9c37fdcba234c166fd712893f3a040832ec5425e57d80f11ef9ca5fbcd6c147fbbf5e2fae746e0ddb605867e3bd050483c3cd1329abe57a60bf88898dc7e80ede0f4517de8fc807e888b621a00f663084ff94b99996628f3b11690a60f0918cb5c9a7ef", "signature": "bf110e2e9cecbc31fa3e0c2438cd1f4321f92cd287005a48528addf76cad8d88bb22719ef91b139562a1511838682674faa9ff7e7ade6c9d573f845036d18905" }, { "secret_key": "cc97a96301ceed0f922731b685bad8ad4f06207be340f5a44fd187f29903ec20", "public_key": "eb563a7bce12db97f1891d0f610bebd55101a3125ca8dbb50b25a6b5050d3784", "message": "b9ea3b3df7187ea415a3c335e0834e10f440915b2ad41c71f255d6950a4e9120e4d494fd9e672ce53206fdc417d865897b47ac1054e1ca1068195232d4297435e44e1224e66a912d9d7d182946ff5a9f085bb8ba19c54d16b586a9b30461b6773b93950311e1619886f5a5b3f111aaad094bae31c48f1941080968bd0277bb6fa92eebf324b192df5cc969516c78c7b2d12159b4d1c8eb03160c4cd1907f62ed4b854c569ecc481c08e636f44ed7c390e58b5937d2906b2817bc3769dad9da1b0f79391b55942063055da0d6f249a3e452baddaa032998d7f73398ccd0151bfc92c5e2fdfa9b14855e6b0d3746dce248e219672987252ec747df2747fd3fbd8b714c882d707ee302a904950c34754f85350e1aa3f8ea6293cf01f717cefb6b83a22126df5c4f5698aafd06a2244ad7d01f34017ca0ece6f21040048aba6ca4aeb04325b9402bcd43ab130a105788ac3d7b7da01ea9426dd0ea1933a8189933a6c0c6cd648ea316a7469a5fdc6e7c934d9186586097b55dd51ac487bb80ed11d4df8d33626bbce95e4f13bd49922f00c920223f4cbf93cb", "signed": "ffbdd3244181cdf6034f4a450fdd95dee4971a933f8be022bb0a4106aef39af3055b721881c9b54d1e99b9409096fbe6dc2c9966e3679964bd7ef4c808cabf01b9ea3b3df7187ea415a3c335e0834e10f440915b2ad41c71f255d6950a4e9120e4d494fd9e672ce53206fdc417d865897b47ac1054e1ca1068195232d4297435e44e1224e66a912d9d7d182946ff5a9f085bb8ba19c54d16b586a9b30461b6773b93950311e1619886f5a5b3f111aaad094bae31c48f1941080968bd0277bb6fa92eebf324b192df5cc969516c78c7b2d12159b4d1c8eb03160c4cd1907f62ed4b854c569ecc481c08e636f44ed7c390e58b5937d2906b2817bc3769dad9da1b0f79391b55942063055da0d6f249a3e452baddaa032998d7f73398ccd0151bfc92c5e2fdfa9b14855e6b0d3746dce248e219672987252ec747df2747fd3fbd8b714c882d707ee302a904950c34754f85350e1aa3f8ea6293cf01f717cefb6b83a22126df5c4f5698aafd06a2244ad7d01f34017ca0ece6f21040048aba6ca4aeb04325b9402bcd43ab130a105788ac3d7b7da01ea9426dd0ea1933a8189933a6c0c6cd648ea316a7469a5fdc6e7c934d9186586097b55dd51ac487bb80ed11d4df8d33626bbce95e4f13bd49922f00c920223f4cbf93cb", "signature": "ffbdd3244181cdf6034f4a450fdd95dee4971a933f8be022bb0a4106aef39af3055b721881c9b54d1e99b9409096fbe6dc2c9966e3679964bd7ef4c808cabf01" }, { "secret_key": "679e3e34773abe4ae25cae7d07ccd0eb3b0ec0a35d570257d62570de58ea2516", "public_key": "18acffce253b27259579ed9924f479cae312167bcd876edba88b5d1d73c43dbe", "message": "fb2b648ebb16688244f78b2ee9a273599d56b6198900d438a9e99c191425c72bec4f235847e18e47f57c3cb396655f778921f908580e8e83c96c108b20dd416678021bca259b98518fabb2d3532e4851d9d52add2542c0cb3efa3857a17e512438bc0ec4762e2f9baba429c03e99bec4038e6b0ca42bff5b233b24c333b4caead2de374a87b2ab5d80d6e49e4456329d51ae973bc83d7862f3d315e514481b12854a9dfc09e7d14f0d022c0ba3022578eba8f874deba4aa8c833f2b132861d4d51e50fe9aa4b787bd2f051aac50c375390cbbcfba2002b80ad00cdc12980f8ba8bcb7064afc04d5c4682c1029b10a6d45fe6ecd704245faf598c4659597c5d68a192cc1cd4fa45e84b549e8e5e67daa879ae5a520a6b5550519876a562ac49c6db0aa76ec69bb64dd6b5e1a3af2e131e722e7cdd05be34b5fcc6259aa124ccf814cf5b500d176be28ebc40bb21f03e24ccc131e0f41daa1ca02e6b00c9c53fad1248614e940d4b237760ab7569a767b7515dd2d623e57a2841b7d2441cf43049e4698d2f9c9eae7b2910f6ad65edf9cb2bdbd9b29f606e0d", "signed": "1a51022628ccbb88eae9b21773c3f830b7b6e5bc36c9903ce70fbcf459d6a1ed8a1dceff5b19269ebf5a6fd3d8958860f554461f0e9fc0e29af9b1fb1744a80bfb2b648ebb16688244f78b2ee9a273599d56b6198900d438a9e99c191425c72bec4f235847e18e47f57c3cb396655f778921f908580e8e83c96c108b20dd416678021bca259b98518fabb2d3532e4851d9d52add2542c0cb3efa3857a17e512438bc0ec4762e2f9baba429c03e99bec4038e6b0ca42bff5b233b24c333b4caead2de374a87b2ab5d80d6e49e4456329d51ae973bc83d7862f3d315e514481b12854a9dfc09e7d14f0d022c0ba3022578eba8f874deba4aa8c833f2b132861d4d51e50fe9aa4b787bd2f051aac50c375390cbbcfba2002b80ad00cdc12980f8ba8bcb7064afc04d5c4682c1029b10a6d45fe6ecd704245faf598c4659597c5d68a192cc1cd4fa45e84b549e8e5e67daa879ae5a520a6b5550519876a562ac49c6db0aa76ec69bb64dd6b5e1a3af2e131e722e7cdd05be34b5fcc6259aa124ccf814cf5b500d176be28ebc40bb21f03e24ccc131e0f41daa1ca02e6b00c9c53fad1248614e940d4b237760ab7569a767b7515dd2d623e57a2841b7d2441cf43049e4698d2f9c9eae7b2910f6ad65edf9cb2bdbd9b29f606e0d", "signature": "1a51022628ccbb88eae9b21773c3f830b7b6e5bc36c9903ce70fbcf459d6a1ed8a1dceff5b19269ebf5a6fd3d8958860f554461f0e9fc0e29af9b1fb1744a80b" }, { "secret_key": "9bfa60923a43ed0c24e2f12f5b86a0716329f93d4d8d3e06238002893278c19a", "public_key": "fb1c00687781b55b893d6b2f4f49cf5f73d2903c316d1eee75991d983a1868c0", "message": "a99028b0f4a3aa5e79abef6c0df4a783ef470f1a29ba51eba00f6214e840fe19e5b6dc6021ab599bb2ee3699576015d79a7939af823535b630e3938c723f6e0b9229d46bb3379acdba587c238567e3d89bc3bd3519b727fc694fff1118bf22c8bc8bc82c4df7f5ad38de05fe9f762999ecaa795f3ae630a9a316d26dce9f1568ffa3f22b0295214020b3d3f5337c149568192218132a90709279c01d23baefa669e1c4e42038173f1319c212da144f1c4ea4c52c005cbc0b5bc283e74483a0dca69279deb17ae5b29cfafa7d0063f4e1bc93537efd937e58a8aca737228f937ff2a741890e96c5725da11b45c413a9bbb4180a419987bbf046bfd346295d62f081c76daf2b0e1eb4f6712feebe6f0a92e358e7ddb85896507c340a01f68d1b0f085778b7c44b014aa6673e501796959a17a688db0959058488a7112572f23cf9cdb53b5eb4b45f5953ba0c0c690f86bd75e89a047bebaf847c1dfc345a4f3c7d3beec98b84b0219003e819f5c2adb45f8717903d1f5bd5d71914c56fcabc7a290f9c41699c95584d6a3a16340cb17baa1fc5e5467af7ac3221", "signed": "55f202efb2a57be8b4e4fd894dcc11a4fc5f8276618ef5cd34a4495adb016a298e6480a35cfc53edb25ff1499fc532a33061cc01a250458aa5e4f7f16f51440da99028b0f4a3aa5e79abef6c0df4a783ef470f1a29ba51eba00f6214e840fe19e5b6dc6021ab599bb2ee3699576015d79a7939af823535b630e3938c723f6e0b9229d46bb3379acdba587c238567e3d89bc3bd3519b727fc694fff1118bf22c8bc8bc82c4df7f5ad38de05fe9f762999ecaa795f3ae630a9a316d26dce9f1568ffa3f22b0295214020b3d3f5337c149568192218132a90709279c01d23baefa669e1c4e42038173f1319c212da144f1c4ea4c52c005cbc0b5bc283e74483a0dca69279deb17ae5b29cfafa7d0063f4e1bc93537efd937e58a8aca737228f937ff2a741890e96c5725da11b45c413a9bbb4180a419987bbf046bfd346295d62f081c76daf2b0e1eb4f6712feebe6f0a92e358e7ddb85896507c340a01f68d1b0f085778b7c44b014aa6673e501796959a17a688db0959058488a7112572f23cf9cdb53b5eb4b45f5953ba0c0c690f86bd75e89a047bebaf847c1dfc345a4f3c7d3beec98b84b0219003e819f5c2adb45f8717903d1f5bd5d71914c56fcabc7a290f9c41699c95584d6a3a16340cb17baa1fc5e5467af7ac3221", "signature": "55f202efb2a57be8b4e4fd894dcc11a4fc5f8276618ef5cd34a4495adb016a298e6480a35cfc53edb25ff1499fc532a33061cc01a250458aa5e4f7f16f51440d" }, { "secret_key": "6e3af45e66e22890c3f3c934f523a4d69427976e6e52625f8bad558993963219", "public_key": "e097364e76ff9f2e1d167f6b20c1bc5830085e7ec993c138f8b1b2175637e741", "message": "5cfc2f4b559f8205b39102087617f4d86c7ce6cb251e5f89601dfc88ed28e8d7a670ec0087d2ea5d893021c7044da2899a22d776fe90170e51c203250690d37a294555e74af9234cbf1ad8f22cee8974828a0d09e9554b71ee3bcf880ab98325f706272194eb2e80c701d441b5f8668561b88849f827af703ab0954105fd3c54b3f6ec5493596d0e3bc67818048310c4a3e0c556bc80675f201f9bb9c6538a41d99aa40c886fc431467218d819c23e78498aed0613fa6f973e2211df9fb87f44116f3fe4c26d6cb2fa334c87f78c08ca8c9b9041d83a1230677e0af788598a42e44cfdf6964a4ee80e38402ba67c73a581e552baa2282425cb2ca17ca92edfbf98299102fba761b9b71a5452141bb9c18dd95febc2a782de9ceec08bd2ee3f7f0c1bd8946dba99cf9ea086abafd37c9ca60213f0de17c61ff9c391c9818ed5cd8571778b7dcc13224962386fb8ca14f861e99f3b18edac8a5f130f7bfcd45d045d0ff34c81572a512363d6530f93813e5fb10e9cb8338a7f93800491006f4463e89f0ed4530e5f12df674f598904780ad0812b1e3521fcd0f83e", "signed": "26ba562e8a4065708207c25e239b780aee38794cf983a37acbb9d557a65ceed3c0da47d17f3e8b8f4eeb1b65a2c182ea6f29623b63bb0f1c72592683b126b9015cfc2f4b559f8205b39102087617f4d86c7ce6cb251e5f89601dfc88ed28e8d7a670ec0087d2ea5d893021c7044da2899a22d776fe90170e51c203250690d37a294555e74af9234cbf1ad8f22cee8974828a0d09e9554b71ee3bcf880ab98325f706272194eb2e80c701d441b5f8668561b88849f827af703ab0954105fd3c54b3f6ec5493596d0e3bc67818048310c4a3e0c556bc80675f201f9bb9c6538a41d99aa40c886fc431467218d819c23e78498aed0613fa6f973e2211df9fb87f44116f3fe4c26d6cb2fa334c87f78c08ca8c9b9041d83a1230677e0af788598a42e44cfdf6964a4ee80e38402ba67c73a581e552baa2282425cb2ca17ca92edfbf98299102fba761b9b71a5452141bb9c18dd95febc2a782de9ceec08bd2ee3f7f0c1bd8946dba99cf9ea086abafd37c9ca60213f0de17c61ff9c391c9818ed5cd8571778b7dcc13224962386fb8ca14f861e99f3b18edac8a5f130f7bfcd45d045d0ff34c81572a512363d6530f93813e5fb10e9cb8338a7f93800491006f4463e89f0ed4530e5f12df674f598904780ad0812b1e3521fcd0f83e", "signature": "26ba562e8a4065708207c25e239b780aee38794cf983a37acbb9d557a65ceed3c0da47d17f3e8b8f4eeb1b65a2c182ea6f29623b63bb0f1c72592683b126b901" }, { "secret_key": "5f1f271844d9ed5a6a6f209a21408daea470f6fd53ba6479d7407105b7de4d65", "public_key": "6085d7fb5a9b2ed806c1fd30a2afde760961f7a36b48f4875246e615a2bd9928", "message": "eed6b4475dc263bd2207fe9d41d48282b713f680f2e037384f18b4bf224347f5e4c4b060b808d412eaabcf733dc39a40c6bda0505ce71fa823bd1b1794847678dc034e7999c16369340bc60c64d09bb9187b2e326055a053f8e505ea4196861471622db0e46f0f8954d8a1f07332da4d8ac55712626009912f8a15a9cd63a74a03c92f246cb63cc73f92e51dad1bc9715b1ed3fe5f2e1b2959b9b71e0e37360eb29536cf797147fab10864d6146c36b82335a0ce931408479c7ede484ff73e2dbfffc6c9227e16d7a23f4d90f15584514c39594e17bfbb295de9d62adadb589dbbe0b06dc8dac5b3bf517b24c1837b39472a6dd38931ffbbff5b763638805b4e22321f7afe92cdf502fb63d109ddcd9e4051ad6f45598532be179523710851d3931e887d02c345c79c489fc106a4ae162f7df71ab90b751da7038a6df7616cfc11887e21068fb9e33be566402be504f3fc2742b881509bd4fe6a0fc722649883f8cb655598a15a1d4c229dd86b5caeb711a028defd431154bba46b48172a4d8cbd45bc90aaf874b6085fa284f5fed655ad6fa17d67b3b9a796fa3e", "signed": "319bb4deb2178112241b3fb8f46e105c3b8e4ef721eb200d762ef363e2716f2a89f80b5b9e89970890a09892ad6a58808b477e943b3cfa77774a3645bc745f03eed6b4475dc263bd2207fe9d41d48282b713f680f2e037384f18b4bf224347f5e4c4b060b808d412eaabcf733dc39a40c6bda0505ce71fa823bd1b1794847678dc034e7999c16369340bc60c64d09bb9187b2e326055a053f8e505ea4196861471622db0e46f0f8954d8a1f07332da4d8ac55712626009912f8a15a9cd63a74a03c92f246cb63cc73f92e51dad1bc9715b1ed3fe5f2e1b2959b9b71e0e37360eb29536cf797147fab10864d6146c36b82335a0ce931408479c7ede484ff73e2dbfffc6c9227e16d7a23f4d90f15584514c39594e17bfbb295de9d62adadb589dbbe0b06dc8dac5b3bf517b24c1837b39472a6dd38931ffbbff5b763638805b4e22321f7afe92cdf502fb63d109ddcd9e4051ad6f45598532be179523710851d3931e887d02c345c79c489fc106a4ae162f7df71ab90b751da7038a6df7616cfc11887e21068fb9e33be566402be504f3fc2742b881509bd4fe6a0fc722649883f8cb655598a15a1d4c229dd86b5caeb711a028defd431154bba46b48172a4d8cbd45bc90aaf874b6085fa284f5fed655ad6fa17d67b3b9a796fa3e", "signature": "319bb4deb2178112241b3fb8f46e105c3b8e4ef721eb200d762ef363e2716f2a89f80b5b9e89970890a09892ad6a58808b477e943b3cfa77774a3645bc745f03" }, { "secret_key": "048ac9ec3ecb30a3b1bfda9b3b79a48c0793b490879e3c8a5e23ee2babcd9b7c", "public_key": "946c186feafc3580a58ddd526ff229c04720250f4cf6bde0271eef9b12b1c3f3", "message": "d68be8ef7b4c7a4289f2b18b16ade97f4e4fa16452976afb581693380cc54de38a07587f32e2d4549f26595fee2393bd062e9b00bae72498e4148c8b882a8840e15b585c82b5c0defb233518409916615deb3a55a5f84e6b3aab93844de3b1e4d86e09f889ac71c324eb12d0fbd861cc31229540e843a34f8d5be47c0ec0d23df43e06813fca309439904c167d1043c0dcd444b004be1ff27b7862b00eba9433b94b0fcdc67521da0c1d5358636c78f530431164dde20a1cf164f51e29b8e63eacdecc869b41392c667664d91680d9ac516af548f09e60564e814e36e0b563dbae55c627ffc14158a56d8eb3609e174381b21de4ba82344466dd577f4d1103c43c27fb83cb833d87afdf7412b4090909b1dde264daddce967f496bf6f17112bf351e417db5953b13b8f0fcccbf30f5bcf376861c12ef20eec89ed23cf384ee78dc6eb40fd5811a7b23927c13e7dc5da3a921b883a9b2b1155970fb0da7d2993dcdfd4343642a9d5a6347e43c193b5793e4453ac1537aa3d04dc9f774e840934881d78a39ba250438c507250eed2f6e07cc953f783d6b72b1cc619981", "signed": "2ecf5b8a59a8e27d25890a2aa32f4a0673275d539b174afa7b2cebf2e76280dffc338ede85ac8f614039560e2806d9e1e3cf9cce2ceb7874ffe1a7e80cdef40bd68be8ef7b4c7a4289f2b18b16ade97f4e4fa16452976afb581693380cc54de38a07587f32e2d4549f26595fee2393bd062e9b00bae72498e4148c8b882a8840e15b585c82b5c0defb233518409916615deb3a55a5f84e6b3aab93844de3b1e4d86e09f889ac71c324eb12d0fbd861cc31229540e843a34f8d5be47c0ec0d23df43e06813fca309439904c167d1043c0dcd444b004be1ff27b7862b00eba9433b94b0fcdc67521da0c1d5358636c78f530431164dde20a1cf164f51e29b8e63eacdecc869b41392c667664d91680d9ac516af548f09e60564e814e36e0b563dbae55c627ffc14158a56d8eb3609e174381b21de4ba82344466dd577f4d1103c43c27fb83cb833d87afdf7412b4090909b1dde264daddce967f496bf6f17112bf351e417db5953b13b8f0fcccbf30f5bcf376861c12ef20eec89ed23cf384ee78dc6eb40fd5811a7b23927c13e7dc5da3a921b883a9b2b1155970fb0da7d2993dcdfd4343642a9d5a6347e43c193b5793e4453ac1537aa3d04dc9f774e840934881d78a39ba250438c507250eed2f6e07cc953f783d6b72b1cc619981", "signature": "2ecf5b8a59a8e27d25890a2aa32f4a0673275d539b174afa7b2cebf2e76280dffc338ede85ac8f614039560e2806d9e1e3cf9cce2ceb7874ffe1a7e80cdef40b" }, { "secret_key": "2f057d20b1678531611f48f003b7d22eba5dbbd7e2dd41b7c79d09071f85e993", "public_key": "620fc4eaa34d787df675ccbf7e893204828db92ead17a1165ac7fa1ab42719d8", "message": "6e35f6eaa2bfee06ea6f2b2f7ab15fa97c5180958af2e90af918adfb3db8323f447c7bf26dc534997c38b7fc977f642de288cdf253071cacf3564e3b8ed6dce57ddfba9ff783bad2e76df124828fc1031acfadf01a44d41b42161ad9060301c1af1928b9e5b73b9bd21cac60a842b504dc3cc311c522e3bb048bf221444f53ceb08e77e948590e94ed98f1b604cb9eadc93bbe7431c1149b23193ff93e8569f113e1684d8976ecae6f09e0103614be418a472ef55bb8890d72b341cdd7505b50a45522ab63ed791ce8f82feddd7a620a4f6fb1d2fb0ed0c4560d78446d83b3d1b1bb56b366d196020d0624b1fbdb75ce735dd43e8e8df163c44e236993dca341f5132d825d0a4e393a19d38f61e11e0cf392cb9b646ea23c58099824dd8d9fbe26a49e33b23df80607abf19715799c19acc722ed9bcf94a0c29ad24b78b0b035b3241c64cd86edeac810e66745694b5eb1625060edf2d949de0d34f522df2dc60ae694a193f3b82c1d6f83a0cbb840f46c49a3d7d1cf06deaf96c64f8f9e17bd9ad512ae6309c486d9e2a78dceeca473a0421dd1b643c78754271b53ce", "signed": "30df7b0b1c04fb1efa3517e928d6d57c2ca0d07f4e04ffb1f08b4792c5937dd271ccabdc00dce850afe50af5990f224e8420a681d95f9f7f515afec102efd10e6e35f6eaa2bfee06ea6f2b2f7ab15fa97c5180958af2e90af918adfb3db8323f447c7bf26dc534997c38b7fc977f642de288cdf253071cacf3564e3b8ed6dce57ddfba9ff783bad2e76df124828fc1031acfadf01a44d41b42161ad9060301c1af1928b9e5b73b9bd21cac60a842b504dc3cc311c522e3bb048bf221444f53ceb08e77e948590e94ed98f1b604cb9eadc93bbe7431c1149b23193ff93e8569f113e1684d8976ecae6f09e0103614be418a472ef55bb8890d72b341cdd7505b50a45522ab63ed791ce8f82feddd7a620a4f6fb1d2fb0ed0c4560d78446d83b3d1b1bb56b366d196020d0624b1fbdb75ce735dd43e8e8df163c44e236993dca341f5132d825d0a4e393a19d38f61e11e0cf392cb9b646ea23c58099824dd8d9fbe26a49e33b23df80607abf19715799c19acc722ed9bcf94a0c29ad24b78b0b035b3241c64cd86edeac810e66745694b5eb1625060edf2d949de0d34f522df2dc60ae694a193f3b82c1d6f83a0cbb840f46c49a3d7d1cf06deaf96c64f8f9e17bd9ad512ae6309c486d9e2a78dceeca473a0421dd1b643c78754271b53ce", "signature": "30df7b0b1c04fb1efa3517e928d6d57c2ca0d07f4e04ffb1f08b4792c5937dd271ccabdc00dce850afe50af5990f224e8420a681d95f9f7f515afec102efd10e" }, { "secret_key": "3a3d27970fe2acb6951edd5ca90dda0fc6dd229c0a56df6eb11a9c54d242dbbf", "public_key": "564f0dc3dc4720e68e44dd16711e049e6112000098fa62a1b98c288042f7c3bd", "message": "4374f61c2cd88a3b8972249bfa79b36ab69e3ed484cc60e5d9541fa7686cf4eed1210c5d0dcf42dd25972501909193ca76ae6eb7f471d8bd0d5fb5a6b431bc3de0e0318d50514524de87c4b83005dfb41245fb1af79b84a97b83d3cac7ad7a53364e2e9b21c97b769bdc57f0703116168380f3cc883689eb4a7fa3b26dbe12bc28f8c40381af64df4b5361d174cf75acbd46428740b0d1322d32bbe94845215966ae588777a8c05336e352306d49278d328e496db65e9ecf6ce6405ed1c893490bc48c13a134e1fb6e80debe6d32fce6ef74783c8d77980a441a26aeb4fd83cc855352cedc188f5279ce211f744a40b23ce7ff24437a1dd3373ec5b290da1f94f43a07a3ffea5b5f67b52c196185bce9e9a858257fcd7a8ebaf9040ed091face5a155aa447fa15e12122d25e8fc36eaee2137c7b3aa30b7e3ff6cc86b6dcb9eaf49c9576f0f462008439cb1a3aba013e897a0faf994cb7d59ede5774bb144774f73ca30e6414a7cc7c74b20c51a1404ddc419ef7624593e9bcfb37c0a762eab68faca5863443e16edb759dbc8788732b9e4f59c11192c3fcc872af55f32d", "signed": "22eb8ea0507349b6a0ace25cf9180cb08e0357b04502905fbe69b4e21b2bd94e22cfbdb851ae716a5c253c70d5e2b24ea78f35bc213292543d94e14110b241064374f61c2cd88a3b8972249bfa79b36ab69e3ed484cc60e5d9541fa7686cf4eed1210c5d0dcf42dd25972501909193ca76ae6eb7f471d8bd0d5fb5a6b431bc3de0e0318d50514524de87c4b83005dfb41245fb1af79b84a97b83d3cac7ad7a53364e2e9b21c97b769bdc57f0703116168380f3cc883689eb4a7fa3b26dbe12bc28f8c40381af64df4b5361d174cf75acbd46428740b0d1322d32bbe94845215966ae588777a8c05336e352306d49278d328e496db65e9ecf6ce6405ed1c893490bc48c13a134e1fb6e80debe6d32fce6ef74783c8d77980a441a26aeb4fd83cc855352cedc188f5279ce211f744a40b23ce7ff24437a1dd3373ec5b290da1f94f43a07a3ffea5b5f67b52c196185bce9e9a858257fcd7a8ebaf9040ed091face5a155aa447fa15e12122d25e8fc36eaee2137c7b3aa30b7e3ff6cc86b6dcb9eaf49c9576f0f462008439cb1a3aba013e897a0faf994cb7d59ede5774bb144774f73ca30e6414a7cc7c74b20c51a1404ddc419ef7624593e9bcfb37c0a762eab68faca5863443e16edb759dbc8788732b9e4f59c11192c3fcc872af55f32d", "signature": "22eb8ea0507349b6a0ace25cf9180cb08e0357b04502905fbe69b4e21b2bd94e22cfbdb851ae716a5c253c70d5e2b24ea78f35bc213292543d94e14110b24106" }, { "secret_key": "06d498318da456242b9c3b9ab6d532a128fce044f53882682e9262149c165288", "public_key": "413517aa63200a17173209a4b3e78ab9383cb4e39efd6794c46a2d13fafa99c0", "message": "3fe30ecd55077a6e50df54bb1bf1248bea4063e3fa755f65fcd1159ee046efd0eb5f2fbb38b5c00947c97dc879b36b9e536192286086d0dc12053610386174a7c56f22a85b73ff208c5944f393236c32415809da036e73cad8fc3c30378064a76afa930a3baae9aa357061a8c5e8e756a9cecf94b72df43facd88fa49cb4948c6368318a6b1e5cff52e587ecdfaefdb69081f28c2d13bf8eab81dbaa5e3728c4317fb793dd196bca0fe54a6c242cf26e2d129ba0d82a2c3a45bc8d1dfd6f54f8da4f5189c91ac214fdabf4c597381b2e5c40cc71fa7051cf2ea93906a37d57df12d5c7e5cd77c907e442566315bae51a2222d62e3f42d1767882637d66a1d5305ab4010a0e49c57def69dcea839e1b76a41135ba952cc424950e8d3aac19e1d93de7757c15ff9997b3d2a8613cd9a164781d1be331799fa6109cef614305a1958f62903c8c9ea0b23ba706d49c54baccc1e63cb4bf14785fc7b062a9800349bdb0bb927260b677b60f10e62c8780f3ebb5eb6ff0360263d457ab52fd1125c9ce046a95d89d287350c804cfd4ff2b2ddd18a9e13519f20b4d1e051af624640f", "signed": "8250f76dc599c5128787e4f6d3da23173330ce3320dba959bd714cc8cc07c67945d63e75662c075e267460ab7bf561f24faae3b41dbf676899191e3b02b5af0a3fe30ecd55077a6e50df54bb1bf1248bea4063e3fa755f65fcd1159ee046efd0eb5f2fbb38b5c00947c97dc879b36b9e536192286086d0dc12053610386174a7c56f22a85b73ff208c5944f393236c32415809da036e73cad8fc3c30378064a76afa930a3baae9aa357061a8c5e8e756a9cecf94b72df43facd88fa49cb4948c6368318a6b1e5cff52e587ecdfaefdb69081f28c2d13bf8eab81dbaa5e3728c4317fb793dd196bca0fe54a6c242cf26e2d129ba0d82a2c3a45bc8d1dfd6f54f8da4f5189c91ac214fdabf4c597381b2e5c40cc71fa7051cf2ea93906a37d57df12d5c7e5cd77c907e442566315bae51a2222d62e3f42d1767882637d66a1d5305ab4010a0e49c57def69dcea839e1b76a41135ba952cc424950e8d3aac19e1d93de7757c15ff9997b3d2a8613cd9a164781d1be331799fa6109cef614305a1958f62903c8c9ea0b23ba706d49c54baccc1e63cb4bf14785fc7b062a9800349bdb0bb927260b677b60f10e62c8780f3ebb5eb6ff0360263d457ab52fd1125c9ce046a95d89d287350c804cfd4ff2b2ddd18a9e13519f20b4d1e051af624640f", "signature": "8250f76dc599c5128787e4f6d3da23173330ce3320dba959bd714cc8cc07c67945d63e75662c075e267460ab7bf561f24faae3b41dbf676899191e3b02b5af0a" }, { "secret_key": "8e8e1db5b1102e22a95c47af3661469f000a33f13b8b87b115d2452a411f6f39", "public_key": "56d7b3169a95c22998ec937925bd7cad13cc65808cd5d34a6c4da870eaf32364", "message": "b24634fbdd1b7661315d9dc153ba90d66a88622a4158f8bcff25ba9c29e65f297f8e60311800b7331b69fc20c9f85bb7c184bd4086b3a9f9a27102b62362bdb4fa5b201594250fc628fd2e0e0d1be03dcf818c6094c4c29121cb2bf6d908ed8aab427c3771c0c95f0ac1469a0810b603a470282e5980a60729197fe6c20ef681cd1b96932d2058f896ea7416422a7e541f224a5f04253080741c5d4e3eb039db6ba051b4ca5417ce8afdc70214ba4dcc85b623d11e681c6009aee4e6130a83edd0d2c99fb0647e11ede7301ae56b59904ef7025732cde038801ec7e8d90a9a1bba047fe628351b3b89d0bc5ae665a700891f09ebeec05591842adfcc25adc3c71c1ebc4a312e5471be67253b0e9428b0cae37645a0f7ecb89dd79fbd9be2875433667ae07d74a7983c4cea601e72e975c21df993e7fa22a9fabd45455d45e37031558e13a7a4f5f497ea78fb7399f8838c0fd5de4ebb66db290f43a4867d505309f1c1bc27e9fabcbba71302fc1204715ce3fcb0905bfa411c9d1c9ab4a39954e50b8e0cf736c10289563bdfa967553c36cd9e555bc8cc56be594847de9f26f9", "signed": "f6ee5e13cfaa362c8971d5a4a879a7e36966525ccd86c5a48cba08d913ece1a79c4cd146b8e9c65125fbadf17bac1cabcde8fd17cfd68fa1f9c44ea61c08a405b24634fbdd1b7661315d9dc153ba90d66a88622a4158f8bcff25ba9c29e65f297f8e60311800b7331b69fc20c9f85bb7c184bd4086b3a9f9a27102b62362bdb4fa5b201594250fc628fd2e0e0d1be03dcf818c6094c4c29121cb2bf6d908ed8aab427c3771c0c95f0ac1469a0810b603a470282e5980a60729197fe6c20ef681cd1b96932d2058f896ea7416422a7e541f224a5f04253080741c5d4e3eb039db6ba051b4ca5417ce8afdc70214ba4dcc85b623d11e681c6009aee4e6130a83edd0d2c99fb0647e11ede7301ae56b59904ef7025732cde038801ec7e8d90a9a1bba047fe628351b3b89d0bc5ae665a700891f09ebeec05591842adfcc25adc3c71c1ebc4a312e5471be67253b0e9428b0cae37645a0f7ecb89dd79fbd9be2875433667ae07d74a7983c4cea601e72e975c21df993e7fa22a9fabd45455d45e37031558e13a7a4f5f497ea78fb7399f8838c0fd5de4ebb66db290f43a4867d505309f1c1bc27e9fabcbba71302fc1204715ce3fcb0905bfa411c9d1c9ab4a39954e50b8e0cf736c10289563bdfa967553c36cd9e555bc8cc56be594847de9f26f9", "signature": "f6ee5e13cfaa362c8971d5a4a879a7e36966525ccd86c5a48cba08d913ece1a79c4cd146b8e9c65125fbadf17bac1cabcde8fd17cfd68fa1f9c44ea61c08a405" }, { "secret_key": "3884b8b79abfd3be6c13985eb859ab743f157cd9deb81b2fe97ea4d6173e46f5", "public_key": "bd7fd9a8def13a542ed2f2fb048886885ba9b5ce59cb7019fb54667986eebc26", "message": "12adafe30eaf2b9c7203ca5d44b97ffed4bf6517a49988e4e676c8e314adbdbe23d8f2d3e2b081a7024fa525ab5aae26e60057c101e8f368d3addb9376c4682c1f4224d7f149a8474bb9a8f663ef210e9572ce829da388d8aae72a467141adc153473be3653baaa64b5b1e2e30683f6f06dac2784d5bbf0d082aab47305ed8a8efd0886ce63a179315225d1e4d4ffcf1f24ac2f464cf5ed3a8b6d3998454f1c02cdbf0a444ee2b59ddbe0a174a0d937fa62865088ac647499957d281c6949803a5fbdfdd0dd9e91b6976861f3c5f2126f39aac935be09f4b9715bd4f0d5c55df73a6b9f2c0ad26ce49d822bf85bfa2346f3165b03859a71c3d2a7b86db6e9f2e5d7b169a910eeb7ef38fbdfbbec43a9a25f04bc3acfd3b0691542ab6de9db6f03058f9584024f9918edecd90fbb85735d6dcec5bd593ae63e2cc96553599a310f8f2009ba95371196b4d5b80e7559637f22926778be5e1ccef5126e2443fa939c2a53dddb04961eefd34e538cd8d7f0bec2bff1ef0d3a4bdd358317637f42d595538c1122251a94e963d1f81e7b9aeb164f95da9a4ed7529b845ebc961b27b5c19", "signed": "f4206fcd34502441d54a73323f33a5dbb4c98557319f21246f260ffbbe5844886db567f4b63c47943dbb78fc35657d7c04d4feb042ff8536f672925c319efb0912adafe30eaf2b9c7203ca5d44b97ffed4bf6517a49988e4e676c8e314adbdbe23d8f2d3e2b081a7024fa525ab5aae26e60057c101e8f368d3addb9376c4682c1f4224d7f149a8474bb9a8f663ef210e9572ce829da388d8aae72a467141adc153473be3653baaa64b5b1e2e30683f6f06dac2784d5bbf0d082aab47305ed8a8efd0886ce63a179315225d1e4d4ffcf1f24ac2f464cf5ed3a8b6d3998454f1c02cdbf0a444ee2b59ddbe0a174a0d937fa62865088ac647499957d281c6949803a5fbdfdd0dd9e91b6976861f3c5f2126f39aac935be09f4b9715bd4f0d5c55df73a6b9f2c0ad26ce49d822bf85bfa2346f3165b03859a71c3d2a7b86db6e9f2e5d7b169a910eeb7ef38fbdfbbec43a9a25f04bc3acfd3b0691542ab6de9db6f03058f9584024f9918edecd90fbb85735d6dcec5bd593ae63e2cc96553599a310f8f2009ba95371196b4d5b80e7559637f22926778be5e1ccef5126e2443fa939c2a53dddb04961eefd34e538cd8d7f0bec2bff1ef0d3a4bdd358317637f42d595538c1122251a94e963d1f81e7b9aeb164f95da9a4ed7529b845ebc961b27b5c19", "signature": "f4206fcd34502441d54a73323f33a5dbb4c98557319f21246f260ffbbe5844886db567f4b63c47943dbb78fc35657d7c04d4feb042ff8536f672925c319efb09" }, { "secret_key": "ecd519f287ad395052b0b30deac341d2a9df13d6567c891c813a0c9ca52e871e", "public_key": "8ee94c588e0b343585fc6748fd1b54b5770c64e9937a56357a48d44ae2f51824", "message": "aa71be5f557e10c9fb5f091a3a274453947c07a0e25b26f9509224541dff76f4d96effd0d5a41d319bc9321a86667d55cf49432fb5c3e715388f3f106c9174b1610c8f3075d5931c290099385ce9249e235128e907c53390036fbf5da968f8d012336958de90c5e8e6b1016ad43fb57c8e288dafe14e90e64b63791e5cbe557e02df8ac9370642a71faf851075e5565f6f9a267f4f6b454ce4c5474810b804844dda38392939719793246aa47454b9b0e82e9803c09935d0027f3995cca9713069bb31027f7b2af12fe5feec7eeb06843d8296ec5682262a07dae747ed7bc821ec17018d899fd167b36a7e3773b427499d99dc583bbe4b429afa6a26593953f943e4673bdd0d2a844256131603cd0903256f334d4f8ec82de115b6ca5338c75c8baa44b4ba963c7c78510d8de9b2a5852f42f3463c685fb3a6da61a8e0892662d6a250fcaa6fef74d450fc457b9871d08bb5be3011294ac888fce215d535c3b1a43bb47efe3ad25da159191aed55195469c59093ffb24f65d60c4020bfbe647ff5db7ab8a01d5e487b0b1b64ef25da156db142e6ad872a4dc1ee9ba668465265379e", "signed": "e8f51be73fc4e0235aa153a2e1b354e9c5d2d33a11ae0e333478de1d8e6c4456d2e250824c3246ca0e8d6ae3e16677a97344144108c13b959e1daf51cf0fe501aa71be5f557e10c9fb5f091a3a274453947c07a0e25b26f9509224541dff76f4d96effd0d5a41d319bc9321a86667d55cf49432fb5c3e715388f3f106c9174b1610c8f3075d5931c290099385ce9249e235128e907c53390036fbf5da968f8d012336958de90c5e8e6b1016ad43fb57c8e288dafe14e90e64b63791e5cbe557e02df8ac9370642a71faf851075e5565f6f9a267f4f6b454ce4c5474810b804844dda38392939719793246aa47454b9b0e82e9803c09935d0027f3995cca9713069bb31027f7b2af12fe5feec7eeb06843d8296ec5682262a07dae747ed7bc821ec17018d899fd167b36a7e3773b427499d99dc583bbe4b429afa6a26593953f943e4673bdd0d2a844256131603cd0903256f334d4f8ec82de115b6ca5338c75c8baa44b4ba963c7c78510d8de9b2a5852f42f3463c685fb3a6da61a8e0892662d6a250fcaa6fef74d450fc457b9871d08bb5be3011294ac888fce215d535c3b1a43bb47efe3ad25da159191aed55195469c59093ffb24f65d60c4020bfbe647ff5db7ab8a01d5e487b0b1b64ef25da156db142e6ad872a4dc1ee9ba668465265379e", "signature": "e8f51be73fc4e0235aa153a2e1b354e9c5d2d33a11ae0e333478de1d8e6c4456d2e250824c3246ca0e8d6ae3e16677a97344144108c13b959e1daf51cf0fe501" }, { "secret_key": "193f3c630f0c855b529f34a44e944970f4a6972e6c3859359c2e0c8762ba9eaf", "public_key": "3256f2c82e7c801201210140569faf18507e60338c2cc4118bb1ce605b0ebe61", "message": "98623f651698085bde02762e8c3321f14da1619b5c3f7c1a568e8c26ff0c62fdcc412475912eb8e8c4b0d30918b8ffeef3509315e58da359cdc2f26bebfb5703953be16b8f3beb1e54a1abee0aebe24e64dbe873402e156f37dfc168eaf8a114ce08a6795d3f64f5151e9a8b8275cc7b49a6b8d8a66b6d4b7632ef80740dc1c1b0a38d1a28f7c1b29fa44541c1aad354d4590c231dae687a2a8fed09e8c1ebbfcc38f347bf06d94577e49ad139f710ed8bb1fd07663c0320846fbb455ab837ef964ae7d4eceea45fd7bd8d509f821e6eb027494efd8dd8e992b88698eec2ebc5e03025be789c18013f201f77aa2d34f5686460e43fb489e08776f98bcde2ceeb9d4fafdffe0375604371ec32f46b81fec474382908e9d250a0ba2780a7d6df407bd2b1eb126748d72511b9b069eb1cd44270f29fe84b9a717751831d04c2818e408f22789376c61c2ca45e32e788ead3a7536bf09da8af4703902f5516a020d89263e93701a2565eef1270418925f35a288e327bab628ac2f0248cfbca3482e265d1621cc343c31f65493f064bad0d7602460715fa486f29426346af53e333b75f5905", "signed": "b12510ac5f2f6d33360cddc67291d6c270fd9ee62dc086b38d932d26473fe9a24efbd4248867ea7e915a30c5bfb3b8b19aa01aa2febf0dac6cfd6638a2ba7e0c98623f651698085bde02762e8c3321f14da1619b5c3f7c1a568e8c26ff0c62fdcc412475912eb8e8c4b0d30918b8ffeef3509315e58da359cdc2f26bebfb5703953be16b8f3beb1e54a1abee0aebe24e64dbe873402e156f37dfc168eaf8a114ce08a6795d3f64f5151e9a8b8275cc7b49a6b8d8a66b6d4b7632ef80740dc1c1b0a38d1a28f7c1b29fa44541c1aad354d4590c231dae687a2a8fed09e8c1ebbfcc38f347bf06d94577e49ad139f710ed8bb1fd07663c0320846fbb455ab837ef964ae7d4eceea45fd7bd8d509f821e6eb027494efd8dd8e992b88698eec2ebc5e03025be789c18013f201f77aa2d34f5686460e43fb489e08776f98bcde2ceeb9d4fafdffe0375604371ec32f46b81fec474382908e9d250a0ba2780a7d6df407bd2b1eb126748d72511b9b069eb1cd44270f29fe84b9a717751831d04c2818e408f22789376c61c2ca45e32e788ead3a7536bf09da8af4703902f5516a020d89263e93701a2565eef1270418925f35a288e327bab628ac2f0248cfbca3482e265d1621cc343c31f65493f064bad0d7602460715fa486f29426346af53e333b75f5905", "signature": "b12510ac5f2f6d33360cddc67291d6c270fd9ee62dc086b38d932d26473fe9a24efbd4248867ea7e915a30c5bfb3b8b19aa01aa2febf0dac6cfd6638a2ba7e0c" }, { "secret_key": "a88ad0048d38c44cebe735ea3802ca576e37121c7d4d760dfd88de1663064abb", "public_key": "14dd8bb306803e5a758ed68ad21d07d88161d50f1c74713777da1209afbaea0b", "message": "2ce8bca26178913b1676e90ffefd945bc561982660e2a75d482ff30aaba1ba43f82d2e6b909ec10fc09789ff5cf32a5180b601ea80fadece6d7e7baeef481dc6979e2f658ae0f6d8e416b93298f7d34031bb76f716ed991a16d09a582e58ba4003ac17be8b4469e1a889b2fbb2289e98af1c6d5bbee77756713c0778b0dc446a1f6c48c4d40818ec799905f069bc95341657ca5d02b7a539a13a02cd0376a50e8343c0dc20346de5275b1dcd4ad7af725131ac75e954825d30eaa57a68bb98dfc41cafe5710556647b387d9b7fd4e47651e5138050798f6d40f4ee7120b58f74da94d73cacbfd393d1347388ee00b79b8dbfeb57814121bdda60c627dce147d4d568d79052e97b9a5f3eb5407cc46461a55e18a960d8094a5fea48b6937529cc4ec919cdbedf9185456dc00e8d98ad1537ee10a057f4eec4b81dc60392fc9188d3e561785965092e44317f2a48e36605fc583fc173b05db9dcbc7557d06487390fbbba77af3a014e1ac35139caa1c53a8d17347f178e1c54d0f52b40e91042c93e7e481d792e288fc27e4c2fcf111fe97d9e2337d2fc1c3098f06684a31d55ebf362c027", "signed": "1341a148da4593c88ebc5a58821eef77f92186390ff633e76207084e7874ccf0eb1f9ec70a3a3f96b58934bcb061ff920124f7e580fa2b0b279583adf9232d0c2ce8bca26178913b1676e90ffefd945bc561982660e2a75d482ff30aaba1ba43f82d2e6b909ec10fc09789ff5cf32a5180b601ea80fadece6d7e7baeef481dc6979e2f658ae0f6d8e416b93298f7d34031bb76f716ed991a16d09a582e58ba4003ac17be8b4469e1a889b2fbb2289e98af1c6d5bbee77756713c0778b0dc446a1f6c48c4d40818ec799905f069bc95341657ca5d02b7a539a13a02cd0376a50e8343c0dc20346de5275b1dcd4ad7af725131ac75e954825d30eaa57a68bb98dfc41cafe5710556647b387d9b7fd4e47651e5138050798f6d40f4ee7120b58f74da94d73cacbfd393d1347388ee00b79b8dbfeb57814121bdda60c627dce147d4d568d79052e97b9a5f3eb5407cc46461a55e18a960d8094a5fea48b6937529cc4ec919cdbedf9185456dc00e8d98ad1537ee10a057f4eec4b81dc60392fc9188d3e561785965092e44317f2a48e36605fc583fc173b05db9dcbc7557d06487390fbbba77af3a014e1ac35139caa1c53a8d17347f178e1c54d0f52b40e91042c93e7e481d792e288fc27e4c2fcf111fe97d9e2337d2fc1c3098f06684a31d55ebf362c027", "signature": "1341a148da4593c88ebc5a58821eef77f92186390ff633e76207084e7874ccf0eb1f9ec70a3a3f96b58934bcb061ff920124f7e580fa2b0b279583adf9232d0c" }, { "secret_key": "3f59d6a018f50a822117e5b473609e30cd64920ca1c2750dcb09eaab807a3eac", "public_key": "457d0e59c11f348f3bfbdd3f327de78c0a7577c0aeef42d4c1e56700d108808b", "message": "7d103a6c6ba2d09087eef2254c1c903f067695a54c4515e4d13bc1fbfb54d6e7a167349c14809976da04a7e58d96b40aac3b2bdd14b9b50322bb11645f05e5e978bc7fbd02492ef88f87d668280fd708373207ff670fcda97df8485d5e46dc3bd04347f4d7527eab2718f7d93d132ba7758218894e75a7deabe693335ba0dc73bf26c288bfe9be8a736d75e5e0eaa7bbe8d0b77abdd5146e0fc9b30db9f07cf4bf36260a1f41410331f8b47c6b38338c6dc9e801ffe1d585f9b7fc31e9778bca3027c232c074cb18e5b72997005ffeee4bf37c8f874b1b246a6345415dacaca7075a60443ac3319236e23cf6b7544740807052114984b8d8f7e857dcc6faec8869cf96b997dfa9af9184ad623f1d90b8ca759b448eabfce18c17cfdf9a3e3312e63e5f084cea904c1c909913cc4b19d044a3720034973c7384949bd6f9ba9256f98cd394c566da83c31180109f16d10347b7e3e9dd6be3bd3c77ff1a7996a078dcf89dcdce2d1b615695f4cc9f8f4f2a08804641bca82662ce88faa53145b6a45955aec8cc2af81cccb5d7c64f9ece1c9983326484a1e5ece4ce36544d63735f7776f21a20", "signed": "d7425ea194a6715c452ec4f6d6c76e6dd374d3ca7ae7a11995d02b942d4a31870dd734c12fca89a8eb0213eb139c14a87a6a33e818603b2e313023fa58737d0e7d103a6c6ba2d09087eef2254c1c903f067695a54c4515e4d13bc1fbfb54d6e7a167349c14809976da04a7e58d96b40aac3b2bdd14b9b50322bb11645f05e5e978bc7fbd02492ef88f87d668280fd708373207ff670fcda97df8485d5e46dc3bd04347f4d7527eab2718f7d93d132ba7758218894e75a7deabe693335ba0dc73bf26c288bfe9be8a736d75e5e0eaa7bbe8d0b77abdd5146e0fc9b30db9f07cf4bf36260a1f41410331f8b47c6b38338c6dc9e801ffe1d585f9b7fc31e9778bca3027c232c074cb18e5b72997005ffeee4bf37c8f874b1b246a6345415dacaca7075a60443ac3319236e23cf6b7544740807052114984b8d8f7e857dcc6faec8869cf96b997dfa9af9184ad623f1d90b8ca759b448eabfce18c17cfdf9a3e3312e63e5f084cea904c1c909913cc4b19d044a3720034973c7384949bd6f9ba9256f98cd394c566da83c31180109f16d10347b7e3e9dd6be3bd3c77ff1a7996a078dcf89dcdce2d1b615695f4cc9f8f4f2a08804641bca82662ce88faa53145b6a45955aec8cc2af81cccb5d7c64f9ece1c9983326484a1e5ece4ce36544d63735f7776f21a20", "signature": "d7425ea194a6715c452ec4f6d6c76e6dd374d3ca7ae7a11995d02b942d4a31870dd734c12fca89a8eb0213eb139c14a87a6a33e818603b2e313023fa58737d0e" }, { "secret_key": "a1212b34dbca63b7093612d05dab7b4cc8f7b676a934ad01f659851b3bb44e4e", "public_key": "ba2fccea9a080591be71268d7e951f250dedc00416e5f3f908db6cc571254925", "message": "07c37c46be3c68d05689577aa64a932b906446b29baf12f6174a6b42bbaefd1f1f373e0bccc473ddfcee1a7f21b96a6260ef0aa1f2d8b2959e71d12c953358a2774cc5e6f379a313e435ed69dfd6d4a59adee3cc7ec4bacbdbb3fee5430b73f6051a6096c60e9bc92cc8fa059fac2a93ef7007d64fbe50064964d5a0ad601175cd9caba453f9103b25485545d301f03c5f9f9478bdf9d414bf1dca3b1c1d9daa9971f9e617fbfaf5b02a7fbd5d4fb894c0975c54592b49a0fc85dd0853f30c51502d98fc1ab85a17cc58961aae9764570ba5cbdbc96dfceb8d11da53364b4025fe0b8ba8a353ad23686720169fe973432ffe291a4b11dedda0aac79a5e42620a64587d2059e787013b40ceec599208f66ed0ca6e1be9092ec27db216ee6dadfebc21705bc4a85aee577e57d239af586efeec22cf38d1cfb3cd74dd0d9a3381aa81e6a297e39b819137ad27d475e2bf54aa426dc29c4ca8176df343137a2d79d12ef9aa7be1cf6775e5d8a4430a85c33db61cd2f35187b4f6ea9ebdd753d1c4ef72471159ff07b77870906496249d4278e3f3ca6bcbf37a265b896539190f9a31f1e7b4b65cd1", "signed": "fa93ed6595bc958dc042ce1645167b79e8f6734c46f80f631fd5484908f5e51a22427ee686f564ff982f6ef4d2ca1f0ca5624910cdd63c11a3c2b16d40973c0707c37c46be3c68d05689577aa64a932b906446b29baf12f6174a6b42bbaefd1f1f373e0bccc473ddfcee1a7f21b96a6260ef0aa1f2d8b2959e71d12c953358a2774cc5e6f379a313e435ed69dfd6d4a59adee3cc7ec4bacbdbb3fee5430b73f6051a6096c60e9bc92cc8fa059fac2a93ef7007d64fbe50064964d5a0ad601175cd9caba453f9103b25485545d301f03c5f9f9478bdf9d414bf1dca3b1c1d9daa9971f9e617fbfaf5b02a7fbd5d4fb894c0975c54592b49a0fc85dd0853f30c51502d98fc1ab85a17cc58961aae9764570ba5cbdbc96dfceb8d11da53364b4025fe0b8ba8a353ad23686720169fe973432ffe291a4b11dedda0aac79a5e42620a64587d2059e787013b40ceec599208f66ed0ca6e1be9092ec27db216ee6dadfebc21705bc4a85aee577e57d239af586efeec22cf38d1cfb3cd74dd0d9a3381aa81e6a297e39b819137ad27d475e2bf54aa426dc29c4ca8176df343137a2d79d12ef9aa7be1cf6775e5d8a4430a85c33db61cd2f35187b4f6ea9ebdd753d1c4ef72471159ff07b77870906496249d4278e3f3ca6bcbf37a265b896539190f9a31f1e7b4b65cd1", "signature": "fa93ed6595bc958dc042ce1645167b79e8f6734c46f80f631fd5484908f5e51a22427ee686f564ff982f6ef4d2ca1f0ca5624910cdd63c11a3c2b16d40973c07" }, { "secret_key": "d9682086fe7dda30b87111060193d847566ab94cfd9c97ab6b43e7a8d3f79382", "public_key": "8b0b1372d88733ef7233f6379790d1e46e1e07e9d3fb8b0be252ed04c5fa163d", "message": "e8814be124be3c63cc9adb03af493d442ff20d8b200b20cd249367f417f9a9d893fbbbe85a642be2701d1d1b3cd48a85cf58f159a197273143a578f42e8bcc8b6240f93271900538ffc187c0afc8dbcc492bcd679baaef3af5088434a94586f94b49970bba18f5ea0ebf0d27ee482aa83ad0dd0ee609df59d37f818b2c8d7c15f0f6f544dd4c7e7cb3a16724324f77d58948f8475a60d53e5bd510c17137c99e1cfa515af9bc85569d212a21190729f2817de8c46915e021df70ff6d60215f614fc21139904df3b292b749dc4dea02518b62d15862c92d2a4c996701cdecaed84ab628ee984fc111eecb59e48444efc0d456e2c852518441c3db7630ddd5156249a28730983838ae59ac4cc7110fd6de68101ea5b2ff69fd364e3c9448defefe175bcbe117cc11b4ff7549c33e1025b6b592048a8e31969e818dcc188bb19d7a2440a3baba4eb1b81c45679db46b31bcde7776757d9931ec2063fc6f1fcd761ecc57a7d030a85ea273ef1825b05092ab9645359a444ff7d166b575fac298308d9faa68463d1d0f7b7df8a51c6815d37159adc0b593224a818321d7219f09686cfc952259718dfc", "signed": "1793e497eb521ca74e35d14a63868cbe9499da2f21b4eb5260340fca3c1feca78dbe5b14ac10f3fa76fa2e71e4c91461aa75977e5e70792670ef7ff0e6a28708e8814be124be3c63cc9adb03af493d442ff20d8b200b20cd249367f417f9a9d893fbbbe85a642be2701d1d1b3cd48a85cf58f159a197273143a578f42e8bcc8b6240f93271900538ffc187c0afc8dbcc492bcd679baaef3af5088434a94586f94b49970bba18f5ea0ebf0d27ee482aa83ad0dd0ee609df59d37f818b2c8d7c15f0f6f544dd4c7e7cb3a16724324f77d58948f8475a60d53e5bd510c17137c99e1cfa515af9bc85569d212a21190729f2817de8c46915e021df70ff6d60215f614fc21139904df3b292b749dc4dea02518b62d15862c92d2a4c996701cdecaed84ab628ee984fc111eecb59e48444efc0d456e2c852518441c3db7630ddd5156249a28730983838ae59ac4cc7110fd6de68101ea5b2ff69fd364e3c9448defefe175bcbe117cc11b4ff7549c33e1025b6b592048a8e31969e818dcc188bb19d7a2440a3baba4eb1b81c45679db46b31bcde7776757d9931ec2063fc6f1fcd761ecc57a7d030a85ea273ef1825b05092ab9645359a444ff7d166b575fac298308d9faa68463d1d0f7b7df8a51c6815d37159adc0b593224a818321d7219f09686cfc952259718dfc", "signature": "1793e497eb521ca74e35d14a63868cbe9499da2f21b4eb5260340fca3c1feca78dbe5b14ac10f3fa76fa2e71e4c91461aa75977e5e70792670ef7ff0e6a28708" }, { "secret_key": "b52b249a7aeae0fbd94ffcf9a9fde10de61c3f4cbda14b289fe01f82707334ca", "public_key": "735163bfcfd54f9d352e1c2f3c0170c95c1842ccc7421623ae0496980cee791c", "message": "1d445e8ee36f6e1064ee1281e6b4a4cec50a91c2b667c8305d1e9a5f7b73a3445882581fb0c11e64f6ee92e811f9f2d6c59c6344be7691d116dda493cade51c0ce77372b61a7c4fbb633401333cbf71372ad2f044e992ac035f5879c053004f8223f237a24a409b7894f6ad518e046b8a84c3f4c6260e6169fd944d57fbcf9ba2775f2d60ed772c46ccd63c850b80d587c5208dfb1a25878c02dece3e602e9632fc3c2c79b25ab41034c6e26b869255357a686781dfe6e644beba9b627da1fcb5ec0be497cf188e1ef1af0601bf16b2911fd9ff34f0e97ac95a7fe2cf90ea6ced33ccb0ed1ef2d4160efb07c591a5cb16c70ca1694fb36f2ca19eba52be3d4ad895abcada4b36f0261d65f59e0cfd2a6148a8892ddbb45810db3bf4a9e26e92c15ea2618cfeeb462d8628f254f54d2af27113bab4f9a7d06791811942bdc32f845922d7b2ddba959140928f8c28d98b44e1d19b97fd39cc0f9a5236d349fc835ac492192462e40ac629bebffd2eba72d2788b244bb777ad0f7b7f96f23412399fc1d87a1d087ba089027eabbc05edafee43379e893291331b460bfa7332e0842ec2573393de95306", "signed": "6f48a9f7f0fa192b66d12175a333612303e180b9fab18edabebcdf6674fdfcc53607089bf980ce35894c2f9babdc4438667ab3297a6248ec0269faa99c7248071d445e8ee36f6e1064ee1281e6b4a4cec50a91c2b667c8305d1e9a5f7b73a3445882581fb0c11e64f6ee92e811f9f2d6c59c6344be7691d116dda493cade51c0ce77372b61a7c4fbb633401333cbf71372ad2f044e992ac035f5879c053004f8223f237a24a409b7894f6ad518e046b8a84c3f4c6260e6169fd944d57fbcf9ba2775f2d60ed772c46ccd63c850b80d587c5208dfb1a25878c02dece3e602e9632fc3c2c79b25ab41034c6e26b869255357a686781dfe6e644beba9b627da1fcb5ec0be497cf188e1ef1af0601bf16b2911fd9ff34f0e97ac95a7fe2cf90ea6ced33ccb0ed1ef2d4160efb07c591a5cb16c70ca1694fb36f2ca19eba52be3d4ad895abcada4b36f0261d65f59e0cfd2a6148a8892ddbb45810db3bf4a9e26e92c15ea2618cfeeb462d8628f254f54d2af27113bab4f9a7d06791811942bdc32f845922d7b2ddba959140928f8c28d98b44e1d19b97fd39cc0f9a5236d349fc835ac492192462e40ac629bebffd2eba72d2788b244bb777ad0f7b7f96f23412399fc1d87a1d087ba089027eabbc05edafee43379e893291331b460bfa7332e0842ec2573393de95306", "signature": "6f48a9f7f0fa192b66d12175a333612303e180b9fab18edabebcdf6674fdfcc53607089bf980ce35894c2f9babdc4438667ab3297a6248ec0269faa99c724807" }, { "secret_key": "782a93efe0ef06cb2534330efd0e9684e9969b5258123e490239bf24bf9f6523", "public_key": "942fa1406ee2683e29377e49f7ba757cf50ef0723707d4403d2862257045de87", "message": "46a4e319a670ac993994a53300c3f79144c2f7fec1116eeeb3621c76ac35da79dbff6e189ca9dbfc9abbda054847b2971b02facebbe926d469eb0a860389ac744162bf6fb13b42cb9bb8c9d72607138e7800121ee0cd633ed535c7ae5f4060bbdd271c9d110abff5e060ea6ee83890b1e92a9256d7b2ba982a3114bb6deffee2696f0a2f9c21aaa5b2defa11aab7076de6e57e86f284bb67f5a49ee685921032c95b74e7e3eac723f175af082c858e0dfa01728c38fbbb4c83581f81ace6c63c6bdaac5620eb9a568e7ebb7b72b3d1a164ef524e7b9f00799ab086715976c14d0df65f7b96bf9ebcda7feeef113422001a03a7633df5e49939a121db899d9b8ac2db4fad0c30cf0b8bdbc9e9802a797c8238e46511ff24068cadcff2448cc0bff92769223348d45d6b6f2c8f1593388c0bbbf44b6ddb50b98cd7f09c730f7de4d008156cb3cde0cab3ad0a58a83954e234a0a8a04b573c9a8e9b929ed38b8b228bf55a3c6e2c6b51f682652fbb708e74640e3313e17b4694d7fdf0111f90608c1b5af422dcdecad9ddb7f50d1bf5bc6378ccaffc3201e6c787b48c443ba240d9d50ff6c0e9df7f1a5b", "signed": "93e7405a4044510166c8ac264ce3b5ba6665d68bad458712dc93c2c390568d7402ef7d57f549b8a1042f7f69a679aa855f34f801d57d79895deb8deadb35230846a4e319a670ac993994a53300c3f79144c2f7fec1116eeeb3621c76ac35da79dbff6e189ca9dbfc9abbda054847b2971b02facebbe926d469eb0a860389ac744162bf6fb13b42cb9bb8c9d72607138e7800121ee0cd633ed535c7ae5f4060bbdd271c9d110abff5e060ea6ee83890b1e92a9256d7b2ba982a3114bb6deffee2696f0a2f9c21aaa5b2defa11aab7076de6e57e86f284bb67f5a49ee685921032c95b74e7e3eac723f175af082c858e0dfa01728c38fbbb4c83581f81ace6c63c6bdaac5620eb9a568e7ebb7b72b3d1a164ef524e7b9f00799ab086715976c14d0df65f7b96bf9ebcda7feeef113422001a03a7633df5e49939a121db899d9b8ac2db4fad0c30cf0b8bdbc9e9802a797c8238e46511ff24068cadcff2448cc0bff92769223348d45d6b6f2c8f1593388c0bbbf44b6ddb50b98cd7f09c730f7de4d008156cb3cde0cab3ad0a58a83954e234a0a8a04b573c9a8e9b929ed38b8b228bf55a3c6e2c6b51f682652fbb708e74640e3313e17b4694d7fdf0111f90608c1b5af422dcdecad9ddb7f50d1bf5bc6378ccaffc3201e6c787b48c443ba240d9d50ff6c0e9df7f1a5b", "signature": "93e7405a4044510166c8ac264ce3b5ba6665d68bad458712dc93c2c390568d7402ef7d57f549b8a1042f7f69a679aa855f34f801d57d79895deb8deadb352308" }, { "secret_key": "6fe7bcf7a684423de1076fd76da783423373b381329efd6157424ec4b2655a94", "public_key": "7740e91afe45324f8bb990ca2a341279ddaf232c3bb415f178b6092fba195fec", "message": "0baf0ad440612b4c5a136c3a42be1ca2b7c319862a44a9fd50c4ee73541c5e6457efa81825b6dd4a72194a2968688bd49e5a8f4c04dbafc2e7884c0c70c208d4e954cd1675da8e74c65c497cf9dc69424965bdcba5de52936f925f62e201f99505d3777beb3c2e08b2ec9a873e5a9c21fb4a2f3e861f3cf4d6b5dcd1c88bcd9163539ac62cd0659f4ef232c2ce57fc77f90285eb350169edc6a806ff50f61c7e0beeebecec63bfc9d3983f5bb4b261c746471fcbf2892c6108970b68db5e43c4504ddae2d0ffffa28b6759ae1128e16f66d492ad61e3722c960f88692be81a9f412890ffa346e702c867dfa259703b73f525074f3227c49cec1b645a103bd4471f33f9f1bac327d7917861d0ad91abee60222ea2a3c8cac052ae9a2cbd90855d733d5319133f9541bd0b61f0995268351e2863c1ca2ca51e3c976383f5c4c11ff410036fd51d5ac56b023ce9029c620f22557019ad9b4264ed4d71b434f4a4d17a7d5769fa1e14a69f7ae419ccf5947f8c7682697116c2405f5a1959c54b48f0872f596ed45964488ddec12bdb636d0b349e749eb66092ff4511fba59b5962cb93cc85515cc86ab0c6b2", "signed": "9914cc50fef0935efb89b3d64e3c1c3412aed659b90166222c0d13ec1ce3a68ae6281b7efd9d4ec64b82e73e14479f03fbac8fa3abdb41ea4215c4a4d4949d090baf0ad440612b4c5a136c3a42be1ca2b7c319862a44a9fd50c4ee73541c5e6457efa81825b6dd4a72194a2968688bd49e5a8f4c04dbafc2e7884c0c70c208d4e954cd1675da8e74c65c497cf9dc69424965bdcba5de52936f925f62e201f99505d3777beb3c2e08b2ec9a873e5a9c21fb4a2f3e861f3cf4d6b5dcd1c88bcd9163539ac62cd0659f4ef232c2ce57fc77f90285eb350169edc6a806ff50f61c7e0beeebecec63bfc9d3983f5bb4b261c746471fcbf2892c6108970b68db5e43c4504ddae2d0ffffa28b6759ae1128e16f66d492ad61e3722c960f88692be81a9f412890ffa346e702c867dfa259703b73f525074f3227c49cec1b645a103bd4471f33f9f1bac327d7917861d0ad91abee60222ea2a3c8cac052ae9a2cbd90855d733d5319133f9541bd0b61f0995268351e2863c1ca2ca51e3c976383f5c4c11ff410036fd51d5ac56b023ce9029c620f22557019ad9b4264ed4d71b434f4a4d17a7d5769fa1e14a69f7ae419ccf5947f8c7682697116c2405f5a1959c54b48f0872f596ed45964488ddec12bdb636d0b349e749eb66092ff4511fba59b5962cb93cc85515cc86ab0c6b2", "signature": "9914cc50fef0935efb89b3d64e3c1c3412aed659b90166222c0d13ec1ce3a68ae6281b7efd9d4ec64b82e73e14479f03fbac8fa3abdb41ea4215c4a4d4949d09" }, { "secret_key": "dda48a0d15a29eba9a76305d360e466e72d8040efe2e89c04b6461315a9b8bf4", "public_key": "4f5cc36a809416b58e15d24cc57968cb573b76ad90887a8ef36cde7eca400fcc", "message": "f5ac19b81f2111a0db0ae30d1513ed343e7f57f7f77d65b8ac7ce3a601174baed9bfa136035976f516d5a870f45db1919f1eb1cbecbe88ec32d191e9248821a7e7681fe3abec11584bdb33de1b4ca94891eb66dcb8539ac41163736ccfd69abb83814dd38cd60381318728052a25cb665471058650ccc75756dbee688ab826ecad4ad5a7db57e8f65f1b64abff82dd53334b797ac40228dd817f239d3ee804a19aeac8cfe33eb657ec9ce923d6b388914cfba2e72bfc2bc3d6f985c0d97534db958eede57b16491ffb755c1a58d78ab377faec0d311818e899260e3ebd1ccd29246fa82d0b76622b2c4bc52f549fee72a30f554f331f36d2a74d999ec10a08294f002b4361e590279c2fb1bda4312ccb24d75282ce7c061a0ca5520c74f6f6333b18c4b541cb6c51e01575ba80512ffa7ce0accd22d14027c53aba1f7437835f1114d68e3acf3ff8de94c8e4ef6d3ab312c91d02970157508f54a5816f467a214e9b1284300289e65f365a610a8ea284666cfe5518e435bccd21627501c725f0b8eb5725e0e06e0cef5db201b48ec91ebf878dd57ce8dac7334848a1bc82c18b065955e4f59be3398594dc", "signed": "ce71bc82d531d0f93b57bfdc2f7316cf404ee09af88f33bf806c7cad6b8ffa366236ba74e75c15096ddaa6e3a62a8f5eb1c8c3f6b6c94a6a349fc7c0cbfb190df5ac19b81f2111a0db0ae30d1513ed343e7f57f7f77d65b8ac7ce3a601174baed9bfa136035976f516d5a870f45db1919f1eb1cbecbe88ec32d191e9248821a7e7681fe3abec11584bdb33de1b4ca94891eb66dcb8539ac41163736ccfd69abb83814dd38cd60381318728052a25cb665471058650ccc75756dbee688ab826ecad4ad5a7db57e8f65f1b64abff82dd53334b797ac40228dd817f239d3ee804a19aeac8cfe33eb657ec9ce923d6b388914cfba2e72bfc2bc3d6f985c0d97534db958eede57b16491ffb755c1a58d78ab377faec0d311818e899260e3ebd1ccd29246fa82d0b76622b2c4bc52f549fee72a30f554f331f36d2a74d999ec10a08294f002b4361e590279c2fb1bda4312ccb24d75282ce7c061a0ca5520c74f6f6333b18c4b541cb6c51e01575ba80512ffa7ce0accd22d14027c53aba1f7437835f1114d68e3acf3ff8de94c8e4ef6d3ab312c91d02970157508f54a5816f467a214e9b1284300289e65f365a610a8ea284666cfe5518e435bccd21627501c725f0b8eb5725e0e06e0cef5db201b48ec91ebf878dd57ce8dac7334848a1bc82c18b065955e4f59be3398594dc", "signature": "ce71bc82d531d0f93b57bfdc2f7316cf404ee09af88f33bf806c7cad6b8ffa366236ba74e75c15096ddaa6e3a62a8f5eb1c8c3f6b6c94a6a349fc7c0cbfb190d" }, { "secret_key": "ec57b941adf3ca13e77a780577cfd0df5b49edc85351052da34e99f8a9bf3208", "public_key": "2859c071978a04b7f5407b6d22401a78efd0394bb966b9a04da6b5ef819de3fa", "message": "d2bcbd1bc361ab32c66d72fd48a8e227dc6b8d6b150848ba715ff47dd35c8e49381bb4e2933f42cd26b75b14d9c0039282b62b8556aaa11cd691e828382be306889fc9205137b169d3bf17b7f37693fce286039f03809d7d9d98c8fde46f1101942a279c516706f50191a9112f6a24630e1a26c321e46c9ccc85b6ef942f353a642b9e7ef998c0fce2d3a75b999eeb77f31f9b0813a97e3014c3a86e2558734621a3066dae35845031e35665f1922907dbb739786a8b7658ab60276f2d921d1a51230fc74d19e80184a4f10e9e834abc9a36c429726bc055dc8c063f0eca9c61a8a970bd4bb5f424ee4d04bfc295e3bb1f34becbd9920fe2e77fcf36763f32fc9cfd5e465979c167cabf5a1244b491fc06b8946419046ba516c5b233c414ddefb6da04f2e13daff7a9a0c02a518ede57ad9521de64eddf6f49a9670f632d3f7d42425207d053604fe39d13b9f52c8bc292b0076ea42a560056df25de51ad35881d08543224d7fa5d70b8603ef23ce06339d6cd09e22a95749e50dfbd3b8ad69fd30496b984d1c0a199c8594805f38ba44631a2c59eadc6554d19f9bc98366dfdec2a121d0e4814d2cd3f5871", "signed": "118e1462126b45b8c6803523755c56dfc4e123e4acbb66ba0ba6fe3e053da4119f5719295e0c82ac64d7c5cb1ac898df263ddfd360f3008d91018b26f6a1730ad2bcbd1bc361ab32c66d72fd48a8e227dc6b8d6b150848ba715ff47dd35c8e49381bb4e2933f42cd26b75b14d9c0039282b62b8556aaa11cd691e828382be306889fc9205137b169d3bf17b7f37693fce286039f03809d7d9d98c8fde46f1101942a279c516706f50191a9112f6a24630e1a26c321e46c9ccc85b6ef942f353a642b9e7ef998c0fce2d3a75b999eeb77f31f9b0813a97e3014c3a86e2558734621a3066dae35845031e35665f1922907dbb739786a8b7658ab60276f2d921d1a51230fc74d19e80184a4f10e9e834abc9a36c429726bc055dc8c063f0eca9c61a8a970bd4bb5f424ee4d04bfc295e3bb1f34becbd9920fe2e77fcf36763f32fc9cfd5e465979c167cabf5a1244b491fc06b8946419046ba516c5b233c414ddefb6da04f2e13daff7a9a0c02a518ede57ad9521de64eddf6f49a9670f632d3f7d42425207d053604fe39d13b9f52c8bc292b0076ea42a560056df25de51ad35881d08543224d7fa5d70b8603ef23ce06339d6cd09e22a95749e50dfbd3b8ad69fd30496b984d1c0a199c8594805f38ba44631a2c59eadc6554d19f9bc98366dfdec2a121d0e4814d2cd3f5871", "signature": "118e1462126b45b8c6803523755c56dfc4e123e4acbb66ba0ba6fe3e053da4119f5719295e0c82ac64d7c5cb1ac898df263ddfd360f3008d91018b26f6a1730a" }, { "secret_key": "cbfd91d7695c1f270f69246ab3df90edb21401101ca7f8f26c6d00f4dcb7233e", "public_key": "513879cf79d2f46df4b85a5c0949eb2116abf981735a303164cbd85adf20b752", "message": "264a933f7d0aecbac13eef644b0b53dd53a1280904100dbc1ab87b51148998f9da0b3a0a6337f5e3486c2b7e548d211259397aaa194ee4695bf98c2d5f4487699f7397e5d3a7e6d5f628fbd05497c556a50a4d05e2b712cdbc351068e42af19538901b8825310e343e1a17a1867dde0eb47ddab456d316f3521554937bf808ae4e4bc1c3c5b4756e4a165ad9e8827f5316f748cac6998ed2d2104f268407c135e62f26a922460eab6d851639a00e5f08b34765ea0244f475bbfeac183e3b5bd1aab798522798a08ec6bf2257d4692f5b03cdd0a2133de970603e3251475aad8d934af6b2bfc7a650b91bdec143f8ad254cfa506bbff28a03beb659ef5e5ddffe76e23230c4ccd46310b37dd91fa6aa68167f62a55c8a69f9ed1ec6cdb144dd81ab0bcbd62643420bcae67869f64c0b169f3cdf3c905895b7d35b6fafda25ccf23c3d10de32e7f271e300d39597da8f843722ef08364a5f7a105b9655172df7c82d7374f98264c9cdccb496f2e10fd8262fb1a9a9965b0b841ac0d0e9c1a3d9493ea7aa600205b8f900be0d7abb4d98a06583d2295c276318be28d421982dedd5bfc33b8865d94ef747d626af99", "signed": "f336137dfe6f42a6669b55f74b80b3035a040367f90656fcef0a644c52272ddc39273cd7726010ebcd8a30a05201ab70b8ff97d0288a2cb94cbc49020647390b264a933f7d0aecbac13eef644b0b53dd53a1280904100dbc1ab87b51148998f9da0b3a0a6337f5e3486c2b7e548d211259397aaa194ee4695bf98c2d5f4487699f7397e5d3a7e6d5f628fbd05497c556a50a4d05e2b712cdbc351068e42af19538901b8825310e343e1a17a1867dde0eb47ddab456d316f3521554937bf808ae4e4bc1c3c5b4756e4a165ad9e8827f5316f748cac6998ed2d2104f268407c135e62f26a922460eab6d851639a00e5f08b34765ea0244f475bbfeac183e3b5bd1aab798522798a08ec6bf2257d4692f5b03cdd0a2133de970603e3251475aad8d934af6b2bfc7a650b91bdec143f8ad254cfa506bbff28a03beb659ef5e5ddffe76e23230c4ccd46310b37dd91fa6aa68167f62a55c8a69f9ed1ec6cdb144dd81ab0bcbd62643420bcae67869f64c0b169f3cdf3c905895b7d35b6fafda25ccf23c3d10de32e7f271e300d39597da8f843722ef08364a5f7a105b9655172df7c82d7374f98264c9cdccb496f2e10fd8262fb1a9a9965b0b841ac0d0e9c1a3d9493ea7aa600205b8f900be0d7abb4d98a06583d2295c276318be28d421982dedd5bfc33b8865d94ef747d626af99", "signature": "f336137dfe6f42a6669b55f74b80b3035a040367f90656fcef0a644c52272ddc39273cd7726010ebcd8a30a05201ab70b8ff97d0288a2cb94cbc49020647390b" }, { "secret_key": "51a4197ab7686f82f6003a0c32f39d0f2e47555f4e9f8deee75bcb1bd1ef69e5", "public_key": "06386df86b61f1f8f4dc45b73edaa841920968bbd131cc5ca1c5294eeed5c8ba", "message": "2aedb7e82f1fe4ce469ada48345d006d1b3bff40eb21867f51fce965640c409ec13ad4d52f891bd79066d6b4d944ca868d8986d242b57eccc4c4a488291b159c8de4392be4b86febaa75eac5d22d3c4f8d6bef79adb9b92b4914d5ea07c7f021e2c29f58d07be8a084100bc152d51ca897d7c131644d0895322e9440a8339e1aa390a7f4fcb51ddfb6df48aaf5676337d87ddd85b1d925e1a9c29fe0818f514ef72f747a674946476907a7ca99e9db8d209641057a7f44a317b90974bc86f9617a968a76a6b8387cf5853e608190c1a79f1e1d686e0de22db6cd9aeb8532c5c85cc90b5a018579f28e502a770a4ec675263d0dd781b4fa53c9dbf8098d57b33ae2afbaeb3e68266ad9aab7174ba68c6479883992670ccf3e5ac6a17e65e31e1fdc85e269c80935ef574f20d239568486e7d94a4f724ab7006098b24f3f61587691435c7f29ce4e5ca71b2b1874556433a358c8c5ef3c880843030c2d13d51b78c9bf1a8824e62e111844396f5af2e25c3126ef3626e26efafacf99830aa41212332f378a167233a0b42213afe36d83dc4582a79693b9d571a57712a08b8566d361ac902647afc886603e24283efb", "signed": "2c072969ff4719212a121938b506c602995b4d02a22e6198d6e87dd6ae076225ac70bb25ef8c0ee81eb6fe953df6b1815949e8ed0506cb012e873cd36cd09b0a2aedb7e82f1fe4ce469ada48345d006d1b3bff40eb21867f51fce965640c409ec13ad4d52f891bd79066d6b4d944ca868d8986d242b57eccc4c4a488291b159c8de4392be4b86febaa75eac5d22d3c4f8d6bef79adb9b92b4914d5ea07c7f021e2c29f58d07be8a084100bc152d51ca897d7c131644d0895322e9440a8339e1aa390a7f4fcb51ddfb6df48aaf5676337d87ddd85b1d925e1a9c29fe0818f514ef72f747a674946476907a7ca99e9db8d209641057a7f44a317b90974bc86f9617a968a76a6b8387cf5853e608190c1a79f1e1d686e0de22db6cd9aeb8532c5c85cc90b5a018579f28e502a770a4ec675263d0dd781b4fa53c9dbf8098d57b33ae2afbaeb3e68266ad9aab7174ba68c6479883992670ccf3e5ac6a17e65e31e1fdc85e269c80935ef574f20d239568486e7d94a4f724ab7006098b24f3f61587691435c7f29ce4e5ca71b2b1874556433a358c8c5ef3c880843030c2d13d51b78c9bf1a8824e62e111844396f5af2e25c3126ef3626e26efafacf99830aa41212332f378a167233a0b42213afe36d83dc4582a79693b9d571a57712a08b8566d361ac902647afc886603e24283efb", "signature": "2c072969ff4719212a121938b506c602995b4d02a22e6198d6e87dd6ae076225ac70bb25ef8c0ee81eb6fe953df6b1815949e8ed0506cb012e873cd36cd09b0a" }, { "secret_key": "b1119c36118b7a065a195bfb8b79a5c287e09bd287c2daac5e6b01164c5d737f", "public_key": "88f218ecba99e770ed214a8d01a92a10400acaf1f6eed420067e136ee2c0c670", "message": "8816b1eb206d5f6dcc2e4cc391d23209006de935e318152e93fc8c2cf08e26432bad9adb3203d898df0a2e7f1f83dc2f3ed3205bec8efcfd31adc1aca5755db9bd4efe54cc17073077de4a3fdd11996e84b6a052f034b41099226c9c272eae12528f16581b91b812850c207144dbff3e850cca848ec2b1dd164744d7b59337d7e3efef008162e680bd4a0899ced60b171f8cbeb48c5158df6cbfdb26240881bd58ebb8b6a079587279679cb5ad82f371b53c8013804c35596c887e436d23926f994e09d98fbb8ce2704174ef38b68262a7f1a712da0ef0dec639606814b3bdcaf253ff31c48e8a752c111bd7101031cc3d38efb0c9c7f19c59081584a0e015ee7c75b10a4c51ff543a30e52d5f94d8188c6b08e9df1e84a4e2c807170ac124a771b99465a0d38b1f1c6330403c82543582c5bb61b220de1b9e0ef69bdae26023181ba4cc077a5f0d425732ace132ae0c6ff0bb18baea83e8877afbe650fe0bd02093f00a7b5365728dcb66fbb881f592945058a5b350665af91c557a547250ad295e68b4fb72457cfb9d5ea1a7b2a39c9ab7d7ace0af5d51669cb6c2c4c07b2256d10e5ffc6b97c660006313c4eb8d", "signed": "24ec1e54fc7e722d37551d02cf135d33f5d3ff535773e02991ee85ffd3aa29997f9c464470197fee81dce110609f870b27c18dfbcfd9320548525e93148e22058816b1eb206d5f6dcc2e4cc391d23209006de935e318152e93fc8c2cf08e26432bad9adb3203d898df0a2e7f1f83dc2f3ed3205bec8efcfd31adc1aca5755db9bd4efe54cc17073077de4a3fdd11996e84b6a052f034b41099226c9c272eae12528f16581b91b812850c207144dbff3e850cca848ec2b1dd164744d7b59337d7e3efef008162e680bd4a0899ced60b171f8cbeb48c5158df6cbfdb26240881bd58ebb8b6a079587279679cb5ad82f371b53c8013804c35596c887e436d23926f994e09d98fbb8ce2704174ef38b68262a7f1a712da0ef0dec639606814b3bdcaf253ff31c48e8a752c111bd7101031cc3d38efb0c9c7f19c59081584a0e015ee7c75b10a4c51ff543a30e52d5f94d8188c6b08e9df1e84a4e2c807170ac124a771b99465a0d38b1f1c6330403c82543582c5bb61b220de1b9e0ef69bdae26023181ba4cc077a5f0d425732ace132ae0c6ff0bb18baea83e8877afbe650fe0bd02093f00a7b5365728dcb66fbb881f592945058a5b350665af91c557a547250ad295e68b4fb72457cfb9d5ea1a7b2a39c9ab7d7ace0af5d51669cb6c2c4c07b2256d10e5ffc6b97c660006313c4eb8d", "signature": "24ec1e54fc7e722d37551d02cf135d33f5d3ff535773e02991ee85ffd3aa29997f9c464470197fee81dce110609f870b27c18dfbcfd9320548525e93148e2205" }, { "secret_key": "cbb587514e0a34ffc34cbc04f28c9b4f6465f1eb225cca19b864876daef37d7f", "public_key": "6b705d4677d2d849b6744b1ebed167dbcbf645924b1ff2e6360794bdd0e09788", "message": "bdf7d17c706796efd3489559b527b1c0584b9022c9cbda3aac5146da340d9cea69f916037cd21b3eb1104348880fd5c5b7c65ff820f7499346016951cb715d8df2b41c88cd3c66105458b7b590c21c1ae2f6ea9ddea7470f25e02027d171e0e574a2bb21642f8f9da508e21d8e7335b5ace5935299407bd1b01bdd1423133ef045234e701f55549434ade94a60be1e1406ca5c758c36799ce1703084476e484fb1740530aee84266d07adfb4cc689f3265133a59cdf992fbb9a4b12defbe241ddbf65d12b2fbddfc05af0fb8de42080775bad29c6b0459841cbb648a9a95e48d6e36ac514480a3deb4b36554d8da620808ae9d47329710d20aaa6e5d7f547d81ad30f84c0e3d239cde5b169d9ddf294832d67a8060ba329c4ef39be94ac46434dd2185931d1231f9b6df878a5af0831e0e9d8a08d08069ded6a961ef7f39fad501ffd17d6d9b7c654653c1f58fcee1a6cd803d2aef166c78ef5514a3276d6998dc7c09a3fa982e427c785aa6a9e256f7ba72d5a6ba33eb46f1f9fe9be2bfc14109f64773c00c063b4d5cb4f4f8a0beca92a9a016c4f540feea9c3a31e313bbcbc2ff5eca9967857f5f8a909a29d7f20d", "signed": "1274d6f356eb641472b6b9e5b3ce65d2654e6cb87d3a83fb49d0f7da9c44be2b532604465f6089d680d2d94b0edd2b6b2b805c5e84c379efc059673d31007a09bdf7d17c706796efd3489559b527b1c0584b9022c9cbda3aac5146da340d9cea69f916037cd21b3eb1104348880fd5c5b7c65ff820f7499346016951cb715d8df2b41c88cd3c66105458b7b590c21c1ae2f6ea9ddea7470f25e02027d171e0e574a2bb21642f8f9da508e21d8e7335b5ace5935299407bd1b01bdd1423133ef045234e701f55549434ade94a60be1e1406ca5c758c36799ce1703084476e484fb1740530aee84266d07adfb4cc689f3265133a59cdf992fbb9a4b12defbe241ddbf65d12b2fbddfc05af0fb8de42080775bad29c6b0459841cbb648a9a95e48d6e36ac514480a3deb4b36554d8da620808ae9d47329710d20aaa6e5d7f547d81ad30f84c0e3d239cde5b169d9ddf294832d67a8060ba329c4ef39be94ac46434dd2185931d1231f9b6df878a5af0831e0e9d8a08d08069ded6a961ef7f39fad501ffd17d6d9b7c654653c1f58fcee1a6cd803d2aef166c78ef5514a3276d6998dc7c09a3fa982e427c785aa6a9e256f7ba72d5a6ba33eb46f1f9fe9be2bfc14109f64773c00c063b4d5cb4f4f8a0beca92a9a016c4f540feea9c3a31e313bbcbc2ff5eca9967857f5f8a909a29d7f20d", "signature": "1274d6f356eb641472b6b9e5b3ce65d2654e6cb87d3a83fb49d0f7da9c44be2b532604465f6089d680d2d94b0edd2b6b2b805c5e84c379efc059673d31007a09" }, { "secret_key": "8bde3ff61a16995ab9d539f6053219081bcaea1d458ec33684fc1c01fb565bfa", "public_key": "cd9d782a356e847b7a04c885a9b0907cc33ba97ad5390d4ea5fee5eb198d08b3", "message": "a1f40ec5807e7a27069a43b1aebff583ef037028c02c859525eb8fa4c3ba95a901ff3aed78c4f87752fb795522f5bf715be7e3defac10fcf17e3fa5c54b20089a472333327252ec945718fb455e3f27ccfdef823d12d406e62a4aeba3cb9d1c61b2b17e49e200a8418f935f26eeb57602c7aa3b3a24f7e6238d3e08d2d609f2eada0332bc8cb12916cb03b0d4f9cd602002586d3e4cc7e0e0381c045ad2e1ee28298ae7fcf0c10f212808565296f158d2c32e8cb28156581af52bfc3470c3c9582138d2255e8426d648ca237d7aad2856f171638558241d8ae3f62ba92db596568edee3ec0ef370f83626aa0445af08f967863660e8fba5a41c8e8ede1c960514a14687a4a81e776ae0e8e777fb0f250d51a83b55f8c1ffdd78df3bdc97ff177afeca046c72d72af924ad0d0ab2bfc11b7f4abded51c3987a8bb94d640c8710e5fc9a4190e8a008363d7419cea17c40dea20ea5156029f3debf05241918f54af5039e2c4cf2ca2e139f60e45cc65595cdf54a67d92b6ac66fc0c5a290495ca57b07ef5750d05f57d87d0c228f7e4e15ad0ba0178730f951c697583481c66cbfcd48032544aa8d50908304bd81940308706", "signed": "7464df0b67eb90b4b73ff082ad0d60ebfe0660dae97069b52c3727223bf70e29e48711a2bbb438f5f8d8a33bb9c48fe7b628fa8a542ff0b5ae36269d4007a505a1f40ec5807e7a27069a43b1aebff583ef037028c02c859525eb8fa4c3ba95a901ff3aed78c4f87752fb795522f5bf715be7e3defac10fcf17e3fa5c54b20089a472333327252ec945718fb455e3f27ccfdef823d12d406e62a4aeba3cb9d1c61b2b17e49e200a8418f935f26eeb57602c7aa3b3a24f7e6238d3e08d2d609f2eada0332bc8cb12916cb03b0d4f9cd602002586d3e4cc7e0e0381c045ad2e1ee28298ae7fcf0c10f212808565296f158d2c32e8cb28156581af52bfc3470c3c9582138d2255e8426d648ca237d7aad2856f171638558241d8ae3f62ba92db596568edee3ec0ef370f83626aa0445af08f967863660e8fba5a41c8e8ede1c960514a14687a4a81e776ae0e8e777fb0f250d51a83b55f8c1ffdd78df3bdc97ff177afeca046c72d72af924ad0d0ab2bfc11b7f4abded51c3987a8bb94d640c8710e5fc9a4190e8a008363d7419cea17c40dea20ea5156029f3debf05241918f54af5039e2c4cf2ca2e139f60e45cc65595cdf54a67d92b6ac66fc0c5a290495ca57b07ef5750d05f57d87d0c228f7e4e15ad0ba0178730f951c697583481c66cbfcd48032544aa8d50908304bd81940308706", "signature": "7464df0b67eb90b4b73ff082ad0d60ebfe0660dae97069b52c3727223bf70e29e48711a2bbb438f5f8d8a33bb9c48fe7b628fa8a542ff0b5ae36269d4007a505" }, { "secret_key": "da59bbc523404f07646add7908294977e46645bc8a38bad2809641a23de3b15a", "public_key": "b22c0f21aa1c2d45f4b2e56cc9b5e02f9e31a2eaa367ecb482f874cbd8e9fe34", "message": "097106c3624d774dde2551e0c27e19504e6518cc86369ab26ff810969e7de24abc68b4b53f11d945d49ef078eb4f6ba6bf257ff7b608afdcb30a5c59a756fd77a6c1247f6f2a41100d99fc5206af3bcc6de1d3e4968e28fba0123f6045a1b54d693a42bdfa071b2b914b3c3c0c29b2593d07e8bdc86ca42ac555b7dcd9439df9fbd4bbec730d6327bfae4fc41ed498b4f04a0eb14cee608283aaa6e6aa46676bc88aed5d9939037aad4915661af94bb5f6e653a2cac123287073270e0b13fda1dd4871af6a92f992f539df881712fefb038540d41191123b6b3b4b6ff87ffc929a6be53c6cef02f48f2f0cf2fe64a45fd66025cc2d7ee55ebe2316c000855661165e2a5ba41afc2097957b6fe4c55221204b6fc1f317dd3ba13cac39924026bdb66be4542268875631d277f210107a33767f6d9596e25742d7a90ea791ea4bc9ee84a67fd328b80f791ede96d89663e937f0b755baa9d52bda210cee1db339ff1d3c4b000b653b9bde338049af84364e2177f80dd51e2a1672ee555d6317589f6f1d5abe6c2877358bf94b0b808ff857363fbfbe32e97337e4b8a8c221a9e75962a8dc9b5a3d7ca5f9c9b61c73c1469a72bd", "signed": "1472459cbbae2cf21ce44a15bae9fc85dca40b8182da7d52cbf56ed538d18e03477c140a3ddd0efba43c96aa92f5f9bcdf3481286ce762a7e2bd1e779ba99b0d097106c3624d774dde2551e0c27e19504e6518cc86369ab26ff810969e7de24abc68b4b53f11d945d49ef078eb4f6ba6bf257ff7b608afdcb30a5c59a756fd77a6c1247f6f2a41100d99fc5206af3bcc6de1d3e4968e28fba0123f6045a1b54d693a42bdfa071b2b914b3c3c0c29b2593d07e8bdc86ca42ac555b7dcd9439df9fbd4bbec730d6327bfae4fc41ed498b4f04a0eb14cee608283aaa6e6aa46676bc88aed5d9939037aad4915661af94bb5f6e653a2cac123287073270e0b13fda1dd4871af6a92f992f539df881712fefb038540d41191123b6b3b4b6ff87ffc929a6be53c6cef02f48f2f0cf2fe64a45fd66025cc2d7ee55ebe2316c000855661165e2a5ba41afc2097957b6fe4c55221204b6fc1f317dd3ba13cac39924026bdb66be4542268875631d277f210107a33767f6d9596e25742d7a90ea791ea4bc9ee84a67fd328b80f791ede96d89663e937f0b755baa9d52bda210cee1db339ff1d3c4b000b653b9bde338049af84364e2177f80dd51e2a1672ee555d6317589f6f1d5abe6c2877358bf94b0b808ff857363fbfbe32e97337e4b8a8c221a9e75962a8dc9b5a3d7ca5f9c9b61c73c1469a72bd", "signature": "1472459cbbae2cf21ce44a15bae9fc85dca40b8182da7d52cbf56ed538d18e03477c140a3ddd0efba43c96aa92f5f9bcdf3481286ce762a7e2bd1e779ba99b0d" }, { "secret_key": "40ea82da41fd15b06ffeb99cd616dc6bc8c1b21477ea239466088e2849bf1016", "public_key": "5910e580bf412c31a87451d9ddf32b3ab713f9e4a22c590c641c14a5dfbbe0d7", "message": "a06c4e02b83ab7e191ad818cb8187b52a8da004fe838db333c4e02548db6bdf791444642e57fdbc8594e59d7023280bbae82986f399805434bb072c8a27a2dcd5aa62f065bc58b0621fcd365f6cdbf4d57d577d91150301fa48f182f87e8dca7ce45a7d64845ff434d1bab0534ccc83aa0974e88b38fc2508cefcbbc82135b73b384c80eccb8a09e2873cc07129021d81ce129a9df65e613410af950197dbf9afc28edc4e65c3e84da40d2ef841b886bc44719a5d59db2c6dc776401c895e2b3c83783d7817bba68baff59470d6015bba8d975f0eb712f3b8902912805523aa71c90499de689d31ae44e210b8446f2484727cc491b92a8e8b199d628e1df79a28c561e5a7d882e30787d08fb2d5196ba61196309b3bf0c5824a3548c700003fe9913befe12223150012685e90720e9ec6bc4db607425aec531c4fa36086d3b9be391a3f04635a8077a447a16a6fd89afbb9a72d0d355cb0b22d562f43f59d4e37128b3e2d906c8ae23d0aa599c70d3778a076c1a39728f1d6937bd48b978740850566138d34852b63075e89a8e2280edba6f4ee8f61511e9b768e95c78d197b693b109e88818b486a9dfdb74b4c5550acdfbd5", "signed": "d298fcc9a8ecb76a98d4a71dfb01d276ab2d9670a95bab34cf1d8364516d1ebdb23903460215307125afd09c758e981a452da95c0ac2c0b958c6917e6874190da06c4e02b83ab7e191ad818cb8187b52a8da004fe838db333c4e02548db6bdf791444642e57fdbc8594e59d7023280bbae82986f399805434bb072c8a27a2dcd5aa62f065bc58b0621fcd365f6cdbf4d57d577d91150301fa48f182f87e8dca7ce45a7d64845ff434d1bab0534ccc83aa0974e88b38fc2508cefcbbc82135b73b384c80eccb8a09e2873cc07129021d81ce129a9df65e613410af950197dbf9afc28edc4e65c3e84da40d2ef841b886bc44719a5d59db2c6dc776401c895e2b3c83783d7817bba68baff59470d6015bba8d975f0eb712f3b8902912805523aa71c90499de689d31ae44e210b8446f2484727cc491b92a8e8b199d628e1df79a28c561e5a7d882e30787d08fb2d5196ba61196309b3bf0c5824a3548c700003fe9913befe12223150012685e90720e9ec6bc4db607425aec531c4fa36086d3b9be391a3f04635a8077a447a16a6fd89afbb9a72d0d355cb0b22d562f43f59d4e37128b3e2d906c8ae23d0aa599c70d3778a076c1a39728f1d6937bd48b978740850566138d34852b63075e89a8e2280edba6f4ee8f61511e9b768e95c78d197b693b109e88818b486a9dfdb74b4c5550acdfbd5", "signature": "d298fcc9a8ecb76a98d4a71dfb01d276ab2d9670a95bab34cf1d8364516d1ebdb23903460215307125afd09c758e981a452da95c0ac2c0b958c6917e6874190d" }, { "secret_key": "28bb81a17d4584754d52818cd0f1f21baa777e695844a15122ac05344dddc027", "public_key": "d5f61d519944d13b84bfa7cd67cb0bea4ef2281efa461f22ade4ba882d11b252", "message": "92e84c7a55b0bea03e17cfb65f7085ce3f445b1542bae997de5f092a24ff243380286d137091a598f35e6dae1a1c648f5a494c819dfb240652ff908381f32d70bc513100aca16fe7220295b1c71835f16d9310a9d27a04a980ace297d5af3f7cb7c78b24997ccb41f54ecbab507eb73ea6a3ed470e49590509f5d1e6032a2605db87f4a9b9ec91602583f14e2fe1bdb900ecb8971196b55c0d433489f26be9ca157cbd56572887ba859f39674a8e0ca08f2dbb0f27073551d0b1990685178b1ae9e7885499143d9d72c8571d11e0d85bf58df94e2a74d9b6846557f9125ca0944ce5718d2cbae1672ba02b847c17a6f6b445634d2f0175a75cf6883c62e5b521c57141f218b2fb0994b372a716c4a217434beab75740b8e91c622187d03c85da001e00247312a465225f5d6af232064a427d3018700ded774b9026777a5275fc04754606c86600297bf7b71aaff8b9a746677a3662f3750e81b50166f6237000051ffa15868defdf090057722ae229964a4ea085e0dbc04ce1997722c5bb65d2b47ecb746fd83a9f6a69c81545a9b502f5e76d3130c5afcb1c9af99d918740837ce89d7cd213fef2fd062ce8850f69659e4ad327", "signed": "9ce45a07dbd28d3f6f1b35630a3fd56f1d548f84ffb1c6ae64b21498ae38e596916e77f79905e609fb1ae0da36138a80f242122167068092cc605796c5669e0692e84c7a55b0bea03e17cfb65f7085ce3f445b1542bae997de5f092a24ff243380286d137091a598f35e6dae1a1c648f5a494c819dfb240652ff908381f32d70bc513100aca16fe7220295b1c71835f16d9310a9d27a04a980ace297d5af3f7cb7c78b24997ccb41f54ecbab507eb73ea6a3ed470e49590509f5d1e6032a2605db87f4a9b9ec91602583f14e2fe1bdb900ecb8971196b55c0d433489f26be9ca157cbd56572887ba859f39674a8e0ca08f2dbb0f27073551d0b1990685178b1ae9e7885499143d9d72c8571d11e0d85bf58df94e2a74d9b6846557f9125ca0944ce5718d2cbae1672ba02b847c17a6f6b445634d2f0175a75cf6883c62e5b521c57141f218b2fb0994b372a716c4a217434beab75740b8e91c622187d03c85da001e00247312a465225f5d6af232064a427d3018700ded774b9026777a5275fc04754606c86600297bf7b71aaff8b9a746677a3662f3750e81b50166f6237000051ffa15868defdf090057722ae229964a4ea085e0dbc04ce1997722c5bb65d2b47ecb746fd83a9f6a69c81545a9b502f5e76d3130c5afcb1c9af99d918740837ce89d7cd213fef2fd062ce8850f69659e4ad327", "signature": "9ce45a07dbd28d3f6f1b35630a3fd56f1d548f84ffb1c6ae64b21498ae38e596916e77f79905e609fb1ae0da36138a80f242122167068092cc605796c5669e06" }, { "secret_key": "24bfd4fc45d5093585678101cf563ab8011fd6430de155f2a425f0633ee3b7cd", "public_key": "9cf5c5fc0ccfaeb28a08ba67707b18dc84ea0698ffbdbc169a09c28123e6c2ac", "message": "ba54128f45be2001dbb060d5dcc47144997415d4294f6eba8dceba4f6cf2234683c4265f88032205296e9b27d68506232d57b688407648f87ceb342052bde9d0065542ff1715c942027e67482af4bc278ff71966fb3f62a2a5323cb1b4bae1e7b8fedcbc73ea05b4076421b0b4fae8bc3337416a17fe124e7ee465ebb38d8792306429d8279a1bd54c37bee8f9c85eebe3afd1f64489d4e53ac5f50657bb6ffb97120744b75d47c6226d5a9c9c264ee3e6a6ded05062ca1006669118454550010919c2633cf086950345e514af3843148e5c64352e69037dfe60d4a8eab3eb8cb54bd39af2f353d5ded2e2bc8b11c09f612e128c6efa41f6eb2c958087be34c6335a43005d11a9d3b5a529c2d1b0642f77afdd8c6b1d6fb2a9dcb65f42f4eca8ea9a054058be8613667610e3eed8d1df0739eca171954117989d1b12189ab57904aa960b0ca85541746385efa985be9d97b5a9029989a9c71498dfabdb813681f57e276b64db491b8f082a885145469a531b7f9f04ca0a2c2f8dff20ccb99c2861f54e5eafa962cc53eaf18d3d5e50d337af485f19975f05930700a8a7253f11f184130d0aee70969d96fe08f216951d9dced52388", "signed": "dc935b60fde44359af8f50ed7f919f483ce3f24e2320c55ba92f3e7617c19bfb54701903ff183b42cbedfef0875f42b12875d36a0aeec73ffd09509d92b28b0dba54128f45be2001dbb060d5dcc47144997415d4294f6eba8dceba4f6cf2234683c4265f88032205296e9b27d68506232d57b688407648f87ceb342052bde9d0065542ff1715c942027e67482af4bc278ff71966fb3f62a2a5323cb1b4bae1e7b8fedcbc73ea05b4076421b0b4fae8bc3337416a17fe124e7ee465ebb38d8792306429d8279a1bd54c37bee8f9c85eebe3afd1f64489d4e53ac5f50657bb6ffb97120744b75d47c6226d5a9c9c264ee3e6a6ded05062ca1006669118454550010919c2633cf086950345e514af3843148e5c64352e69037dfe60d4a8eab3eb8cb54bd39af2f353d5ded2e2bc8b11c09f612e128c6efa41f6eb2c958087be34c6335a43005d11a9d3b5a529c2d1b0642f77afdd8c6b1d6fb2a9dcb65f42f4eca8ea9a054058be8613667610e3eed8d1df0739eca171954117989d1b12189ab57904aa960b0ca85541746385efa985be9d97b5a9029989a9c71498dfabdb813681f57e276b64db491b8f082a885145469a531b7f9f04ca0a2c2f8dff20ccb99c2861f54e5eafa962cc53eaf18d3d5e50d337af485f19975f05930700a8a7253f11f184130d0aee70969d96fe08f216951d9dced52388", "signature": "dc935b60fde44359af8f50ed7f919f483ce3f24e2320c55ba92f3e7617c19bfb54701903ff183b42cbedfef0875f42b12875d36a0aeec73ffd09509d92b28b0d" }, { "secret_key": "2fc2f9b2050ad7d139273e93e2a0451c7b5cce57599aa6b08d3edc5bb07590c8", "public_key": "ffe5a17880d718cc7988c2fd9825b03b93450ac1deb8fbd1f1bf3b8f87805954", "message": "dc1297990cc027d56d1fee265c09bcf207a9583e6bab8d32478228e0bc305b9818154c338ceec34b04c4ade7ac61dcb09bfac8ade00d1f29de317060b8a4daf1987de409ca2c3fe4380088073ccf485e9a69516b5bbb4130f20be69b2dd6a9b465159cca1ac88b328b80c51b66af7f4c50f6228772f28734693ce4805a4163dff14b4d039811ee3fce65935444a6ea9a72d78b915c9c3b766c60b7e0329e43c9c57ede94b91525ce5a075a7297219772ef3c029649b586a95a73bbdf16d8fc20368de4ba44de1064be5826b376be31a86ca478a52efb98f1fa333157719bd6e0da80ed68d0efeafee5a13bcc3b457525258f1f7e031f7b403a461506927b1e6c7d4a0c8d84b5f3dd0eb8bdb13edc2b514a81d088eb077a52c8a831861feee8110e41a325dce206b2d67d25f90ef57e0fde709f3e5a39c04eed31e57c193b283e2da7279ee3f1eed482b3bbcd373902c1df811ac33e1de06429e8f8443f602019650bdc2ee8d7f650036a7a22b8fd88517511229c729a3269b3a3e8fc72b01b5a4b3e33f5272f3ad21629d08b1f717935e9e104add2f0f2033432bec82e2121d98c9c1a58e0daba25536a1be8e5088347f4a14e48d8e3", "signed": "7aff162a3c0d28dff41715a974af07ecac2132fc18bc43a198fe664659050da19ae22758d52c9cbb94f1358bb02610a8a351c2116279e7245adf69675dfd360adc1297990cc027d56d1fee265c09bcf207a9583e6bab8d32478228e0bc305b9818154c338ceec34b04c4ade7ac61dcb09bfac8ade00d1f29de317060b8a4daf1987de409ca2c3fe4380088073ccf485e9a69516b5bbb4130f20be69b2dd6a9b465159cca1ac88b328b80c51b66af7f4c50f6228772f28734693ce4805a4163dff14b4d039811ee3fce65935444a6ea9a72d78b915c9c3b766c60b7e0329e43c9c57ede94b91525ce5a075a7297219772ef3c029649b586a95a73bbdf16d8fc20368de4ba44de1064be5826b376be31a86ca478a52efb98f1fa333157719bd6e0da80ed68d0efeafee5a13bcc3b457525258f1f7e031f7b403a461506927b1e6c7d4a0c8d84b5f3dd0eb8bdb13edc2b514a81d088eb077a52c8a831861feee8110e41a325dce206b2d67d25f90ef57e0fde709f3e5a39c04eed31e57c193b283e2da7279ee3f1eed482b3bbcd373902c1df811ac33e1de06429e8f8443f602019650bdc2ee8d7f650036a7a22b8fd88517511229c729a3269b3a3e8fc72b01b5a4b3e33f5272f3ad21629d08b1f717935e9e104add2f0f2033432bec82e2121d98c9c1a58e0daba25536a1be8e5088347f4a14e48d8e3", "signature": "7aff162a3c0d28dff41715a974af07ecac2132fc18bc43a198fe664659050da19ae22758d52c9cbb94f1358bb02610a8a351c2116279e7245adf69675dfd360a" }, { "secret_key": "8afe33a0c08aa3487a97df9f01f05b23277df0bb7e4ce39522aec3d17816e467", "public_key": "d004370e6edc34b3e8818667216f5b226b0ff75a58484c8616e1a866444cab57", "message": "86fb741f1b9708929195031aa1645fb709a8ae323fff85e5470194452e11b7b1279194b5e2427ce23e1d749c3ddf910b017e4f2dff86dbe482c91bd994e8493f2e6824bba3bc7d7a845f217ae9760b3cd00226d9ff2616d452751a90c3d0d3c36d4ab4b2520f67288171bd3a34b2eacae8d44c1e153dda1f90bcd3595dad37713b8d340156ea90a4e135951ba7169ac175578b81e97a541ab9bfb76328798d7d631c14df2ad613e9c6e1147a0e84062ddba035859d46bade5fadd9b32b43dad483c6b8023b32391e51ef1520c68c6191326c494423080c623dc4ad0aa074748d826c29644c38986a77002f0cab9068e6c9ec73cc2e0c584b80e0bc375721f7a8fc35317a5e240e8c66092fb6305b012c70e17aeaff13386d5e28d06430ca585b0c85b274e7fcbb63e3423a982579e5a64a0262c41908e55dbe43dac1e5cc1bb7298be428720a12e3b072559ec2675d457aaf8f13252e28aad63c1513f5f239564d363c8505ffa4e50f6648c1cb82bba852bff0acb030cbe73f059dd87bbd7318c5586e708618a4f4c9f3bec3f4f07c609eebb24ba878c6bf1e4f2d0fd1450ab94e31755217786fb15182760ffbe5a267cbe998a4ff90a2", "signed": "63a8aeac025f2dde9a73286e56c2d62dcb79a241ba0b2e2dbaca8752ed2fc8cc7ab8e6600b67645fb5e818a4e82c29180a6b2c3f58d099cb635ce52bdc15700486fb741f1b9708929195031aa1645fb709a8ae323fff85e5470194452e11b7b1279194b5e2427ce23e1d749c3ddf910b017e4f2dff86dbe482c91bd994e8493f2e6824bba3bc7d7a845f217ae9760b3cd00226d9ff2616d452751a90c3d0d3c36d4ab4b2520f67288171bd3a34b2eacae8d44c1e153dda1f90bcd3595dad37713b8d340156ea90a4e135951ba7169ac175578b81e97a541ab9bfb76328798d7d631c14df2ad613e9c6e1147a0e84062ddba035859d46bade5fadd9b32b43dad483c6b8023b32391e51ef1520c68c6191326c494423080c623dc4ad0aa074748d826c29644c38986a77002f0cab9068e6c9ec73cc2e0c584b80e0bc375721f7a8fc35317a5e240e8c66092fb6305b012c70e17aeaff13386d5e28d06430ca585b0c85b274e7fcbb63e3423a982579e5a64a0262c41908e55dbe43dac1e5cc1bb7298be428720a12e3b072559ec2675d457aaf8f13252e28aad63c1513f5f239564d363c8505ffa4e50f6648c1cb82bba852bff0acb030cbe73f059dd87bbd7318c5586e708618a4f4c9f3bec3f4f07c609eebb24ba878c6bf1e4f2d0fd1450ab94e31755217786fb15182760ffbe5a267cbe998a4ff90a2", "signature": "63a8aeac025f2dde9a73286e56c2d62dcb79a241ba0b2e2dbaca8752ed2fc8cc7ab8e6600b67645fb5e818a4e82c29180a6b2c3f58d099cb635ce52bdc157004" }, { "secret_key": "6dc7ccf329378e8131b6defcd89370301068946336b0b762ac5ea51487dbd39e", "public_key": "04e90d275e79df5f2b6ef4a31505aac05a69459baf2c581b3ce3db29f0f1fc14", "message": "20cebbe98401ac8934c3e65a5738cb0ec0cdc75fdb09dc96312894b187c0a46d2c38f4855be3eeccdcdcc56d926a8c08ce6e748e2a858f53532e7e5fc5f7014c8c6f86310cc26efef30ae525a5157940ab535ed8e403112b08e35e2bb3dd91a9ae8f772d2aff37d8c40d2b5cc887a6f15050a0f5bcf0360c3a9d12d5918655edc3c13c86ba6f4a2fa3bfcd405ed38f871cf7dff0f75daf2c321084ee9fa81211adb105b25c2288f0f2f7f93ef656b2de190122e7a4bfd4a1bd9893a8485b509ff0bc46cc961051c1db5a12490c7e741922ccc0a665496470276f69c7b77098c1e670af6b9f851252996875eb8035a817fa9be07f2be0bbb12025e0565414c817e9421ac700373893862f24cb165f9a271a64fd2305c6672c46767f8f075be5d2d4079bfadc3956288b0215605311b5bf32f0037b7c5ad502013e82ae3419d9d8f39c545b5888f47106c94d5fd6084d26034a99f5dcbf26a84eb4ee149c62a0410d8c707b1a9b071f74ed23932585072ce6cbd33d4d54ee917916f5dfc64d26a498018438b455739345dd60ae0f4750625915cc829ab6822d6f05f6d2bda0a7bf5601e9a2ed6de960371d17e6f43709c9678ca743adfbdb45", "signed": "04509db003a1a6ed3fbcec21ac44ec10cc06d79f2714960882170316275df80423a1c1a112d881fc24d2812526079058aa8b608bfc6b5e57632240c636d6eb0020cebbe98401ac8934c3e65a5738cb0ec0cdc75fdb09dc96312894b187c0a46d2c38f4855be3eeccdcdcc56d926a8c08ce6e748e2a858f53532e7e5fc5f7014c8c6f86310cc26efef30ae525a5157940ab535ed8e403112b08e35e2bb3dd91a9ae8f772d2aff37d8c40d2b5cc887a6f15050a0f5bcf0360c3a9d12d5918655edc3c13c86ba6f4a2fa3bfcd405ed38f871cf7dff0f75daf2c321084ee9fa81211adb105b25c2288f0f2f7f93ef656b2de190122e7a4bfd4a1bd9893a8485b509ff0bc46cc961051c1db5a12490c7e741922ccc0a665496470276f69c7b77098c1e670af6b9f851252996875eb8035a817fa9be07f2be0bbb12025e0565414c817e9421ac700373893862f24cb165f9a271a64fd2305c6672c46767f8f075be5d2d4079bfadc3956288b0215605311b5bf32f0037b7c5ad502013e82ae3419d9d8f39c545b5888f47106c94d5fd6084d26034a99f5dcbf26a84eb4ee149c62a0410d8c707b1a9b071f74ed23932585072ce6cbd33d4d54ee917916f5dfc64d26a498018438b455739345dd60ae0f4750625915cc829ab6822d6f05f6d2bda0a7bf5601e9a2ed6de960371d17e6f43709c9678ca743adfbdb45", "signature": "04509db003a1a6ed3fbcec21ac44ec10cc06d79f2714960882170316275df80423a1c1a112d881fc24d2812526079058aa8b608bfc6b5e57632240c636d6eb00" }, { "secret_key": "ccae07d2a021fe3e6ee23836a711b97b04e0a441f169607572731cb08c269488", "public_key": "a32265e5328a4f49cf06b467a98b9f9d5b997b85dfb7523ca6a0a1d627d32891", "message": "a4bf8297d0dc5e4c92bd00ad5b9c09b1238b503d619116ef74260378349a9282b41f3f4676a6215e3ce6d02238480a96043b2942b3feed12620b1fa97f7703b3eb683c1601bd2f51825c450df4fd1f33b0bf9c23c03223789e06e24cf136d3b557403a66981f4b777dcfe890d2ba96da4a4742aeeddd6a611d05fc215694a5d89a5de6760b1d9415155044c049cb02291a1514faa2e77d2ae33d44585bdac6365bf481d9c97833937eab636ed65742a0d5973b24d54089b2daf084d5414765105e4eca14aaadd1053338a8470505232e4ac633345c5cdee1e4653d1d93583af11854b1d9b65fc20281838c56df1148f35ccf9bfe2f3f80ab73f5b791cbed2d920644cf0316f0cb5d3662b9120647da56afbeb47a952953bc1a37de857e4b39fd92b632b85159f46cd05b6abc2338d4632d48e9a178860de8f65d9bc23f24507b7c5629e0bdaac067c476c9c3941d86f788944d744852a61da716f95f3b04f0783a562941bcdda439590fd186b2a8ebf19a5a7e4f4a3aaab7a87a434524fbc9799c9931eb8ce4e34e99b608cac94ab7e74495668df136185f487d9fbcb6605ad725345403ec57f3f6db364a87f38fea4b4c271552e9f2e4a1be", "signed": "0eec754105447f97d4a9cd246c7eede3fd069018f0d01a41dfabca3e90a741835ea4a9d682342267b250fc1c8c547c89632d9f689af536c7929004ded0d96f09a4bf8297d0dc5e4c92bd00ad5b9c09b1238b503d619116ef74260378349a9282b41f3f4676a6215e3ce6d02238480a96043b2942b3feed12620b1fa97f7703b3eb683c1601bd2f51825c450df4fd1f33b0bf9c23c03223789e06e24cf136d3b557403a66981f4b777dcfe890d2ba96da4a4742aeeddd6a611d05fc215694a5d89a5de6760b1d9415155044c049cb02291a1514faa2e77d2ae33d44585bdac6365bf481d9c97833937eab636ed65742a0d5973b24d54089b2daf084d5414765105e4eca14aaadd1053338a8470505232e4ac633345c5cdee1e4653d1d93583af11854b1d9b65fc20281838c56df1148f35ccf9bfe2f3f80ab73f5b791cbed2d920644cf0316f0cb5d3662b9120647da56afbeb47a952953bc1a37de857e4b39fd92b632b85159f46cd05b6abc2338d4632d48e9a178860de8f65d9bc23f24507b7c5629e0bdaac067c476c9c3941d86f788944d744852a61da716f95f3b04f0783a562941bcdda439590fd186b2a8ebf19a5a7e4f4a3aaab7a87a434524fbc9799c9931eb8ce4e34e99b608cac94ab7e74495668df136185f487d9fbcb6605ad725345403ec57f3f6db364a87f38fea4b4c271552e9f2e4a1be", "signature": "0eec754105447f97d4a9cd246c7eede3fd069018f0d01a41dfabca3e90a741835ea4a9d682342267b250fc1c8c547c89632d9f689af536c7929004ded0d96f09" }, { "secret_key": "db5d5f41fddd6768709747ab8239bb4f42a31d34b4fa88824d94bf78d3149264", "public_key": "03858ce6b2d24079eead66ca0dfe772ecda9af4d46bc9b5edfdc286b95fe9716", "message": "67ee03de45c3e7030db5246ee5b51bf298bba3e4d0934937fc12d9a629604c53c070e30d611999a9cddaf2d9acda6a9f67202b352369d48260eebce0e78e4d5ae54f677521f84a7be0017fab278b2b57275efc5fa57c617186fc1ba49edfbd3308634878d864f2da1583ca8d56ce9fae77c462039abc32d0539c0a60b7bbba5029e9329d275683d9c4ce77d0b908ade98b0e32b4420d9aee2cc10e4be922f9572582dd8967141c1d402e215f20aee0a890e2368e406dea11bd11177f2e038aa2f1a0dff51a128d955d5e5f8d5d0009aaa82440a96864d6c697f910d1df230f467f0e02a2e02bf9e45da95f255410cc5aab8d85f449a5de99aabd44fd763ec14629f3dbab1a247bffb7174648e43b9fb1eb0df5e4109b7a88e05512b20865bad39f9ea79d52f5188e7ca5194405bfb1a09727617f3f6c88192008edbc0c6585dbf261f149dffb593d42716e5a5777f5462beeb1e9a56a2c76e6cb735117cc1183a38d1e00b303d174aa9cf5c731b2c70edd79cc5dc96f4018f1d71d7198bbb7d134cd2ff8c15f9a04280db26a8fa9997eb86b133c022eda15d8ad5e77cc9f62615960bac2f9bbc3ebbd198f72c572b97156fa7fa229a98014e170", "signed": "5b3d0da7102355486be4d69cfd65886c9d9c8738b293cafb23b2104bfdac8d7d01298eeb18fde3ded6491d41b419cc663752c4e67dbe8986833d20e4ef34180b67ee03de45c3e7030db5246ee5b51bf298bba3e4d0934937fc12d9a629604c53c070e30d611999a9cddaf2d9acda6a9f67202b352369d48260eebce0e78e4d5ae54f677521f84a7be0017fab278b2b57275efc5fa57c617186fc1ba49edfbd3308634878d864f2da1583ca8d56ce9fae77c462039abc32d0539c0a60b7bbba5029e9329d275683d9c4ce77d0b908ade98b0e32b4420d9aee2cc10e4be922f9572582dd8967141c1d402e215f20aee0a890e2368e406dea11bd11177f2e038aa2f1a0dff51a128d955d5e5f8d5d0009aaa82440a96864d6c697f910d1df230f467f0e02a2e02bf9e45da95f255410cc5aab8d85f449a5de99aabd44fd763ec14629f3dbab1a247bffb7174648e43b9fb1eb0df5e4109b7a88e05512b20865bad39f9ea79d52f5188e7ca5194405bfb1a09727617f3f6c88192008edbc0c6585dbf261f149dffb593d42716e5a5777f5462beeb1e9a56a2c76e6cb735117cc1183a38d1e00b303d174aa9cf5c731b2c70edd79cc5dc96f4018f1d71d7198bbb7d134cd2ff8c15f9a04280db26a8fa9997eb86b133c022eda15d8ad5e77cc9f62615960bac2f9bbc3ebbd198f72c572b97156fa7fa229a98014e170", "signature": "5b3d0da7102355486be4d69cfd65886c9d9c8738b293cafb23b2104bfdac8d7d01298eeb18fde3ded6491d41b419cc663752c4e67dbe8986833d20e4ef34180b" }, { "secret_key": "7f048dfcc2650cda59491d4ce2b2533aecc89cc4b336885194b7ad917db5cd14", "public_key": "08001b5d40958bcb270beea9baba3387e3a4b900fc42275657c6c691a2e264f2", "message": "917519cdb33519680bcae04faa790771ce7d1397c345f1b03dd7625776f3f195809932618b1c64acd93ad000ead09654a33d14f748b46b67aae0ff12df3cc163280f47cedc16a8579034e49884296772ecbdbb71ca29c166233533c8de54012b412ca13cc258f7c5465d83422f524e4c05f806313478319fd143cf5088e69837697d3615d80a7fa7e7443fca65e753ac1b11d8eff3476636ae02d7a20f4b2388dad684002f5ce957caddd2053d0ed533132a81ca19bb080bd43be932028cb5f6b964f008b5b1c1c5993bc9b5485b22bbef701f0a26a3e675ea31122bbae91d864b54d895afdc79ca58d4fe449213353b149f3143b5144d747c5b4697479ae68528485384044aa2c99ba4b17b184e94982269bde2de0b17705d0bfc46d6906a90edefe89195de6bb8f3fb6a374186c7cd086d13d1b3525a3994dc8020e1a00554ac8a82d6047c5bff5e7f12450f4865da161e1a021fd9be8bd33a32bb54a4ddf874512e74b5cfd3fc3cd9ac11edd878433668e3fcc782b97b6d905adb0ebec42c9254ac90f35822c00f97ff3f0c7c39ed3c7cb3920f5608bb45838bb242a52a8637d7cecdcf489fa183b45451c6c9fcbbbf914f5f7e6b223bcb4675", "signed": "583370971d24652ad213c42615911938fa9aa3d9b7196940e6eb08151200c7b6729d1eff8f4f0904074dab3ddda6af1e4e562b7d6220c1a562683beab268f80e917519cdb33519680bcae04faa790771ce7d1397c345f1b03dd7625776f3f195809932618b1c64acd93ad000ead09654a33d14f748b46b67aae0ff12df3cc163280f47cedc16a8579034e49884296772ecbdbb71ca29c166233533c8de54012b412ca13cc258f7c5465d83422f524e4c05f806313478319fd143cf5088e69837697d3615d80a7fa7e7443fca65e753ac1b11d8eff3476636ae02d7a20f4b2388dad684002f5ce957caddd2053d0ed533132a81ca19bb080bd43be932028cb5f6b964f008b5b1c1c5993bc9b5485b22bbef701f0a26a3e675ea31122bbae91d864b54d895afdc79ca58d4fe449213353b149f3143b5144d747c5b4697479ae68528485384044aa2c99ba4b17b184e94982269bde2de0b17705d0bfc46d6906a90edefe89195de6bb8f3fb6a374186c7cd086d13d1b3525a3994dc8020e1a00554ac8a82d6047c5bff5e7f12450f4865da161e1a021fd9be8bd33a32bb54a4ddf874512e74b5cfd3fc3cd9ac11edd878433668e3fcc782b97b6d905adb0ebec42c9254ac90f35822c00f97ff3f0c7c39ed3c7cb3920f5608bb45838bb242a52a8637d7cecdcf489fa183b45451c6c9fcbbbf914f5f7e6b223bcb4675", "signature": "583370971d24652ad213c42615911938fa9aa3d9b7196940e6eb08151200c7b6729d1eff8f4f0904074dab3ddda6af1e4e562b7d6220c1a562683beab268f80e" }, { "secret_key": "9feb3df88c494a99849c6fca194201477a2fa7564e29fb06cb44c1154e8cea3a", "public_key": "c35628ca6ee28ec1c239ddc5bba2a9e09e4846816b143c74dfa2aec1f62551b6", "message": "95fb7581bd25ffd442c3ae38a19bea7349c7b7683ba6767e148f0afc15373f67c16d471781202e6da8054ed7fb9ee204cc0f63c210a670a5f9ced4294588196330d31b8e8392bef6b48fe3c92078fae11284b4c3ba20d937e2719de7bf67c00669ad23e61384ebdf8c6e60735428c084fe217fdb4709ccb6083fc0ae4a05273eef739023d34bb73f662dacdf110b6dbd3e74fc1491e8c96596075fae5c36aabe2a0a53052bf77c4462438063aa7bc0c50ab920c9eb288671560ca5ba7af44a53db2e2ff43ca56069ea5517cb214e76faa53dbda100003c4f6175414041be74de22ce155d2281b6f4035be39841afdb96dd89aa808e6865bae62d6bedd919d3e86510b9fa5fedd1977c4131b2b86e0f48d7215eb13d5498ca5d2368f81895ed855a527124657ec9539efe3b2499a3b0b338262f26340e22554c79f4fad2b4e419c70bc1a2107d206456b6368781be4b5e2c54da42d336040fb7ba49c32d752321adcd92986e78bedb226ceac50292089bb579027f702217745afe06a5be136b3998a3604c9ff2acd6fa3f3f71633d3102fbf03047c5486f84c4dc2447d863796383d55f08c981fd4dd7dc1cb72b8ba4435af6abdd74e6f6e6798f1ae2", "signed": "a1c2607835bec1a1d87872fd8ee488d0ae9ed23d49fd6786fc4996725e49b3262118babb4834877c7f78fbeac02df40ab091b8b420dc9951381e3bcda067050295fb7581bd25ffd442c3ae38a19bea7349c7b7683ba6767e148f0afc15373f67c16d471781202e6da8054ed7fb9ee204cc0f63c210a670a5f9ced4294588196330d31b8e8392bef6b48fe3c92078fae11284b4c3ba20d937e2719de7bf67c00669ad23e61384ebdf8c6e60735428c084fe217fdb4709ccb6083fc0ae4a05273eef739023d34bb73f662dacdf110b6dbd3e74fc1491e8c96596075fae5c36aabe2a0a53052bf77c4462438063aa7bc0c50ab920c9eb288671560ca5ba7af44a53db2e2ff43ca56069ea5517cb214e76faa53dbda100003c4f6175414041be74de22ce155d2281b6f4035be39841afdb96dd89aa808e6865bae62d6bedd919d3e86510b9fa5fedd1977c4131b2b86e0f48d7215eb13d5498ca5d2368f81895ed855a527124657ec9539efe3b2499a3b0b338262f26340e22554c79f4fad2b4e419c70bc1a2107d206456b6368781be4b5e2c54da42d336040fb7ba49c32d752321adcd92986e78bedb226ceac50292089bb579027f702217745afe06a5be136b3998a3604c9ff2acd6fa3f3f71633d3102fbf03047c5486f84c4dc2447d863796383d55f08c981fd4dd7dc1cb72b8ba4435af6abdd74e6f6e6798f1ae2", "signature": "a1c2607835bec1a1d87872fd8ee488d0ae9ed23d49fd6786fc4996725e49b3262118babb4834877c7f78fbeac02df40ab091b8b420dc9951381e3bcda0670502" }, { "secret_key": "bff68955dd6ae0e8ba85ab0d0cdaf04a9f5befd5ef6014f49994a78363dc17f7", "public_key": "0ad9493af80b15f07a521ccd674fe9e5212a4a28c17c74f6605ffef78a4aed72", "message": "d8f5650aa3581c4d39bd1b8afc96c1ad7c4bf723426f9d7fabd1a5c8ac1d2fe54a971fac765e05af6e407d7269bab661b3432292a484f952c11095bbd20a15d77c41f8f3731a504d518ee10cd006c96ee57372de5bea348ec8ba159162170c63e970f1c7a3465a3d592e1d56c6540fbdb60228e340909646320c95f25698cd4896bdff58e2561e3b3d9a73b89747912a1cf467d63e41455fda77477f46fe6937bb0e79d92ccd52e82dba908a05a57c7ecf49554ab44c0b718e3bdd5fc0bf7070d9c58f860591c18bca8b3a9a148a06548e0f01602b1e6f686037c94ff732e155d52d5b0b44703b3d11163e3f56e3b9c1b86476e4dcbfc53fa05984e8c75dd21843cf96f9e494abbae7184aa42736633e3811aeff402b2fcb7d7f702e447241e22a58842fd6d0c03d33ff5b8c792200e173daa7b217e4b2f4433e6c020acce501b9323aa0241144434b08e9d2469139ff67342208900546200fd971a65dbd6db6c21e3ef9172abba1ea9ea2a249addf1a1eaa3ce11938b13e30913cd0dad491fcbb3285ea378b8ef9227f3fa80b586ecfeae137066f8448acdfb78d6d3e9ef4a6b362df4241ad9ae253b8e1597d656e000cea447a02fa4933328609bba0", "signed": "9319eef740633ada1af0e137644c61fb3e11ba4b01d3c6f25392dc9367872a23be56310d312efcb91bdbab78a75e576ebe9081972415f562db41baf5e2338b07d8f5650aa3581c4d39bd1b8afc96c1ad7c4bf723426f9d7fabd1a5c8ac1d2fe54a971fac765e05af6e407d7269bab661b3432292a484f952c11095bbd20a15d77c41f8f3731a504d518ee10cd006c96ee57372de5bea348ec8ba159162170c63e970f1c7a3465a3d592e1d56c6540fbdb60228e340909646320c95f25698cd4896bdff58e2561e3b3d9a73b89747912a1cf467d63e41455fda77477f46fe6937bb0e79d92ccd52e82dba908a05a57c7ecf49554ab44c0b718e3bdd5fc0bf7070d9c58f860591c18bca8b3a9a148a06548e0f01602b1e6f686037c94ff732e155d52d5b0b44703b3d11163e3f56e3b9c1b86476e4dcbfc53fa05984e8c75dd21843cf96f9e494abbae7184aa42736633e3811aeff402b2fcb7d7f702e447241e22a58842fd6d0c03d33ff5b8c792200e173daa7b217e4b2f4433e6c020acce501b9323aa0241144434b08e9d2469139ff67342208900546200fd971a65dbd6db6c21e3ef9172abba1ea9ea2a249addf1a1eaa3ce11938b13e30913cd0dad491fcbb3285ea378b8ef9227f3fa80b586ecfeae137066f8448acdfb78d6d3e9ef4a6b362df4241ad9ae253b8e1597d656e000cea447a02fa4933328609bba0", "signature": "9319eef740633ada1af0e137644c61fb3e11ba4b01d3c6f25392dc9367872a23be56310d312efcb91bdbab78a75e576ebe9081972415f562db41baf5e2338b07" }, { "secret_key": "1ba919c066bb56e640c3335968e1d1b5bcc093383e2d7cf8b5fff5c61ec47a77", "public_key": "804c90bdc2b3618b01f075e041fa971b83c5b6cfa3b6b3974f3fa43599beacab", "message": "87c5c75d8ad07d52acd781d1bb95f78c70e21c2dd66f7aa44234152f98234d128358a8aee98ea903a77b441db1447ae6ff3432ddd4570f7f58036122c1fdcc93cb21573739c19ccaa411508e08de2606f3d8f2db89df6a44a46133d57018462627e22f57ef36d1de024de3d4ae41b752df4821155934b447b2effe512487521be0356832a74ce0e2d8301b79f93175e8b6b961b1df637d8acadc884543c6864f8025ececec7c6e4fe0fecfc40dcd95e8d6ab93ce25595384436b598b73c74b03d49ed5002c0f858cfd9d0df61ede937cc41659d6708b96fc5aaadee109e2a68846baf2c246dfcf3d27c28bd1371e35fc9412631442ee75f38c6e4958070a74f6e6a220f75c7280eab4737d97e37882f3624811675f16caf60cb944bce92e75884c56483c61f26b6371b1b51237621a06543eb4abea7becc4fc31dbb5475b3deb9bb3c8992387104830c6072afe1af244bf681a40329c9b37772b09c5e88e78f7dffbc04549ffa13b4144ddfa538fc4b3300540ad830215e25f11446d289f33122c2c880de3da71c453d7e88f7ca4ea3d1255e82f4bc9e5533dc401c33040e16940b2cf9cf21feaca1c2c6c33337cf75e1884b483bf801536d304089115a0", "signed": "503eb7ed6de1b776c952f255bbd4bcfb0e48bc70c2cc2f1f72bf6881479040c47524ec542ae13f6005ca5016b58b736a50898dd0569d4d38ad298630d68adb0b87c5c75d8ad07d52acd781d1bb95f78c70e21c2dd66f7aa44234152f98234d128358a8aee98ea903a77b441db1447ae6ff3432ddd4570f7f58036122c1fdcc93cb21573739c19ccaa411508e08de2606f3d8f2db89df6a44a46133d57018462627e22f57ef36d1de024de3d4ae41b752df4821155934b447b2effe512487521be0356832a74ce0e2d8301b79f93175e8b6b961b1df637d8acadc884543c6864f8025ececec7c6e4fe0fecfc40dcd95e8d6ab93ce25595384436b598b73c74b03d49ed5002c0f858cfd9d0df61ede937cc41659d6708b96fc5aaadee109e2a68846baf2c246dfcf3d27c28bd1371e35fc9412631442ee75f38c6e4958070a74f6e6a220f75c7280eab4737d97e37882f3624811675f16caf60cb944bce92e75884c56483c61f26b6371b1b51237621a06543eb4abea7becc4fc31dbb5475b3deb9bb3c8992387104830c6072afe1af244bf681a40329c9b37772b09c5e88e78f7dffbc04549ffa13b4144ddfa538fc4b3300540ad830215e25f11446d289f33122c2c880de3da71c453d7e88f7ca4ea3d1255e82f4bc9e5533dc401c33040e16940b2cf9cf21feaca1c2c6c33337cf75e1884b483bf801536d304089115a0", "signature": "503eb7ed6de1b776c952f255bbd4bcfb0e48bc70c2cc2f1f72bf6881479040c47524ec542ae13f6005ca5016b58b736a50898dd0569d4d38ad298630d68adb0b" }, { "secret_key": "9b36247c17710e95261a7d702f57fe81f2971117a50c87920193b386d494ca97", "public_key": "29ae39f273e35fb3f611da091600650efbc4fc4d1e7b4c76aced5a83f82634f3", "message": "e8d9d53ba27e98edd55df3c6b245eacddc8a40e3efb007bc918ec5a869178a170bb4a635b7f8f742e37ad45d14a74344a6b522830a522106eb960daf192dc1e0fd70f16160e122516892d0e2abd0d4ae0f0d2e5adcc99ad55302e251b3e7a4d0cb33774a497049905c33de1fbbc1ad2b6c645295fe416b4d12b232efe0a33cd2ad8732eba1c3cb0eaeb0b2a57fa03ec567ca29210bf6ff9542a766f496fe68058aa983806cbe7ab10a47920bac8248818e54a41551c9a0959e8994cac60fc868ad48b5a24d5f24a7a5a3fd90b847e817ad3dd5d0d6f8de2d204f642483bd53585a92ef925415a9b38fbbf07fc0f35e707569cf488b205453ce5433eba6fde8781af72b52bfbcab85ead385d9d3175e21ad3373ad535cf0e357ed6b5383ef3829a9d5095b87dc9aadbe0ca7abadf33ec3b6ffd6eb94afdcc12e8d66a6fc05acf97368db0f69565dcd8fef4d1e49d7dd4ac053c218f5240c812d4ebba440dc54cacddb1c39329e5bd0c3c80dc3259a80f059f94679aa0794ca0115cc62af25e124cb8a9d4160eace6d22c7b1c44544f81142a19ebb02a9bda6429c50e783db4a07f0219e857c8d3c5655a582831c8eabc3f19b59ad8d2c714adeaf4039d5cf70", "signed": "035970a672e93f87eb42cc396f6ea7e1b3dd5c5951572826d1075a15c2d7e454df195b51aae8dc61ef7ab895485f64e5989573d98a062e67ae7356fe5c9e3b0fe8d9d53ba27e98edd55df3c6b245eacddc8a40e3efb007bc918ec5a869178a170bb4a635b7f8f742e37ad45d14a74344a6b522830a522106eb960daf192dc1e0fd70f16160e122516892d0e2abd0d4ae0f0d2e5adcc99ad55302e251b3e7a4d0cb33774a497049905c33de1fbbc1ad2b6c645295fe416b4d12b232efe0a33cd2ad8732eba1c3cb0eaeb0b2a57fa03ec567ca29210bf6ff9542a766f496fe68058aa983806cbe7ab10a47920bac8248818e54a41551c9a0959e8994cac60fc868ad48b5a24d5f24a7a5a3fd90b847e817ad3dd5d0d6f8de2d204f642483bd53585a92ef925415a9b38fbbf07fc0f35e707569cf488b205453ce5433eba6fde8781af72b52bfbcab85ead385d9d3175e21ad3373ad535cf0e357ed6b5383ef3829a9d5095b87dc9aadbe0ca7abadf33ec3b6ffd6eb94afdcc12e8d66a6fc05acf97368db0f69565dcd8fef4d1e49d7dd4ac053c218f5240c812d4ebba440dc54cacddb1c39329e5bd0c3c80dc3259a80f059f94679aa0794ca0115cc62af25e124cb8a9d4160eace6d22c7b1c44544f81142a19ebb02a9bda6429c50e783db4a07f0219e857c8d3c5655a582831c8eabc3f19b59ad8d2c714adeaf4039d5cf70", "signature": "035970a672e93f87eb42cc396f6ea7e1b3dd5c5951572826d1075a15c2d7e454df195b51aae8dc61ef7ab895485f64e5989573d98a062e67ae7356fe5c9e3b0f" }, { "secret_key": "6fede7396c462033189acd23d2f9d02b68898d35f3a01a798fc24d488de93a78", "public_key": "b34062060b2c20076a98fea939b3b3a50451a5f49f8351c0ad7591dbbebb130f", "message": "5abcc14b9d8578de08321de0d415e3d40e9de31e1888137475ce62bc6fbee8fdd03b9d47c7b88bbceb804444490bf6a3ccb7a273261e24004ea67cefa3d5d173576d01e38f76c1e0e515083c97e79914acf2be4160ef9360bbe986b36e9ff93346b0e70691d934e47f8a503fa933ab2a50426947cda8e810c9ebe3b36982f09aee6092739fa2358b613c7f129db0dcbe368bee52f2f7f1dfe3d2434605b5afcf256071717d924fd0803bbd0dd1f9555ce834dac781df4cc7aa19e7f11da9fb99cb9e6b9e1e6fb4f7e8dcb2236c28aeb6cbc55a130e03c1b17a991cca1b794e6c13732d5b0a66f6eba860ecb98555aa4c218d112b116bce238295de142741f687be0b2487f58ffc5c12a0a519f1e23793242ef857ed398a20699d4351453fc2f092762abde34f4da2dbe0ce2aabaf6bc4c0159f3fe1aea16a036f7eaecd629538f3e0eed83c9a4dc1abc238f90daaf489fd61b34d937b6f4607a788baa82061943dbab26c1d384d8d49f99348800bf361f871f5d6cda18f689918cec31ad158f1863d13ffac5405c162c32de06e32994cc4106f95bb4fffdbefe7d629ec7797394609fdbfeadb46927370a11fb38471540f951b93c6eb238668dc006c21660ba2", "signed": "88a83e2012d209ca03b8ebf6de5bb7ef4ccb5e3df5cac78954aa694930e4de82544ef5083c4892db9f05d77bf63f4fdfce15a4d1c3f85bae8077062bec0e7b075abcc14b9d8578de08321de0d415e3d40e9de31e1888137475ce62bc6fbee8fdd03b9d47c7b88bbceb804444490bf6a3ccb7a273261e24004ea67cefa3d5d173576d01e38f76c1e0e515083c97e79914acf2be4160ef9360bbe986b36e9ff93346b0e70691d934e47f8a503fa933ab2a50426947cda8e810c9ebe3b36982f09aee6092739fa2358b613c7f129db0dcbe368bee52f2f7f1dfe3d2434605b5afcf256071717d924fd0803bbd0dd1f9555ce834dac781df4cc7aa19e7f11da9fb99cb9e6b9e1e6fb4f7e8dcb2236c28aeb6cbc55a130e03c1b17a991cca1b794e6c13732d5b0a66f6eba860ecb98555aa4c218d112b116bce238295de142741f687be0b2487f58ffc5c12a0a519f1e23793242ef857ed398a20699d4351453fc2f092762abde34f4da2dbe0ce2aabaf6bc4c0159f3fe1aea16a036f7eaecd629538f3e0eed83c9a4dc1abc238f90daaf489fd61b34d937b6f4607a788baa82061943dbab26c1d384d8d49f99348800bf361f871f5d6cda18f689918cec31ad158f1863d13ffac5405c162c32de06e32994cc4106f95bb4fffdbefe7d629ec7797394609fdbfeadb46927370a11fb38471540f951b93c6eb238668dc006c21660ba2", "signature": "88a83e2012d209ca03b8ebf6de5bb7ef4ccb5e3df5cac78954aa694930e4de82544ef5083c4892db9f05d77bf63f4fdfce15a4d1c3f85bae8077062bec0e7b07" }, { "secret_key": "d559580134ab050aca446ea7750ef6b371d92d7645ec7635fe7851100bc4e51e", "public_key": "de5020cd21a8b32339decbedff24664d9580326327aedf09c5ec6b3fe5405226", "message": "6842e3190a110eee96c507d4bcb4c548c3a0ed7b1a8ed77dd93b38613b23c73e830b205e62651921ad8296b08d1e1008ad78f2996e3c7f38032e467cffecd77b8525e243cec021f85296afd545d7be1a62568bb0cfcdb90d614ed798bfb7efc655326816a61082251df01613aac88efcea1e0ea2961b8f921ebe1558dee83374a0113a78c55857ce2055bb2c48badbd3d8f4cb19734d00d0604b619073020d72a99a1923e6160a09946567fd4bda66442ef5a7360786d178dae44922f350ce2edc6af73d1bd80dc03ec3ca7005f4109d10c6d4f7d8fa61735110f8dbaedf91a0bad7d7fb5c04d706373c15c645063ff4b4fbd2d559b0afad432d4c496cd8abfea286fa675dc076726ec522b3a3c2f47aecc539f48a792169c4cc8cd41cd2cb6b63ddbc19373ac9691c2bc2f78f22603d5513715a16d4574e7acc4bea6dcd8ca7f19865a49d3664a210dfad290774b10b7188f255b3be4dc8fa86f8da3f73a4e7c929951df30fe66a17c8cee23e4f2ed2063f0b02ab40372cbe54b9a708df7c48a06566d39b19434c6c766987b3ebb00675f44c4b3c1e9f4504e7a9270589c0d0f4cb734235a58ef074cf9decf3601aeeca9f1d8e356cb2db5fce79cbc36143f34b", "signed": "6fcb1ac9290ab767d59b598c9a24ecdb6c05bb023ec36014a40d908ef0dc378a4528b3760d889a79174e21cae35df45d427ba6ea812bddca16e35a69b5e79f0a6842e3190a110eee96c507d4bcb4c548c3a0ed7b1a8ed77dd93b38613b23c73e830b205e62651921ad8296b08d1e1008ad78f2996e3c7f38032e467cffecd77b8525e243cec021f85296afd545d7be1a62568bb0cfcdb90d614ed798bfb7efc655326816a61082251df01613aac88efcea1e0ea2961b8f921ebe1558dee83374a0113a78c55857ce2055bb2c48badbd3d8f4cb19734d00d0604b619073020d72a99a1923e6160a09946567fd4bda66442ef5a7360786d178dae44922f350ce2edc6af73d1bd80dc03ec3ca7005f4109d10c6d4f7d8fa61735110f8dbaedf91a0bad7d7fb5c04d706373c15c645063ff4b4fbd2d559b0afad432d4c496cd8abfea286fa675dc076726ec522b3a3c2f47aecc539f48a792169c4cc8cd41cd2cb6b63ddbc19373ac9691c2bc2f78f22603d5513715a16d4574e7acc4bea6dcd8ca7f19865a49d3664a210dfad290774b10b7188f255b3be4dc8fa86f8da3f73a4e7c929951df30fe66a17c8cee23e4f2ed2063f0b02ab40372cbe54b9a708df7c48a06566d39b19434c6c766987b3ebb00675f44c4b3c1e9f4504e7a9270589c0d0f4cb734235a58ef074cf9decf3601aeeca9f1d8e356cb2db5fce79cbc36143f34b", "signature": "6fcb1ac9290ab767d59b598c9a24ecdb6c05bb023ec36014a40d908ef0dc378a4528b3760d889a79174e21cae35df45d427ba6ea812bddca16e35a69b5e79f0a" }, { "secret_key": "9d4ce975547876636fea25437c2880c9aa8ee6b270d1b2da197c8d7f95e7dccc", "public_key": "bde4993c030477c35890aae82bb5087e914e64b94ffc64e2d7a5a7c919e2d902", "message": "ea0fa32a4a288811301b9ee533fa351fdfbf6bc1d0555a7402767a3a9198558f74bba7031857995b9f326226f1dd5df107b06342203eb8d40c5f1dc95b4f3f88975aa24af8769e2670c46671bebb7a0f1b7568729aee477e8988af9c749f3202708171fd94b337ae67ed21a6c44174014b0b0eb5ba71c277978d488c24c4a7841309846b4e30a4fbbcfc45078d7e14014114b1ac64f7c33c9ac25ea5626c2c819fbaa2a4de8a2bf5f1365d6b70407e8094f99197ce1f0c35e11a98fbe372414ea2064a3a12d1cd5c8df8fc0e79f5b770b58f477f91976ca0139895120e246baab5a026f2d39c687dc0788334b5c626d52cdebe05eaf30864b413eebdc5581ef00d439276e52f479c9c05b116395826b60490b3ce700cc0027f61e46ca2f6fbc2c9de2e800806550afb06d4a08eac7a758e24582a4d6d428b433d365fc31d4444607afb64f15e370794005a3a2244e666d5d4c38ad2009c769a51cdbf738d235942f412d07feeb73b3657d0b0c91cb5940bad6a706e14edcdc34225b1c1f38b1abecb2adcaf819155a94fe190fd556822d559d9c470854d3a43bfb868dadd6e443d98ee87e4d8284f5cf3a6dafaf295b902836c640511e610ae7d0cb1b1d3d6079fe6", "signed": "be17444cd465a87a971df84eb102f9c7a626a7c4ff7aea51d32c81353d5dbc07393ca03db897d1ff09945c4d91d98c9d91acbdc7cc7f34144d4d69eb04d81f0cea0fa32a4a288811301b9ee533fa351fdfbf6bc1d0555a7402767a3a9198558f74bba7031857995b9f326226f1dd5df107b06342203eb8d40c5f1dc95b4f3f88975aa24af8769e2670c46671bebb7a0f1b7568729aee477e8988af9c749f3202708171fd94b337ae67ed21a6c44174014b0b0eb5ba71c277978d488c24c4a7841309846b4e30a4fbbcfc45078d7e14014114b1ac64f7c33c9ac25ea5626c2c819fbaa2a4de8a2bf5f1365d6b70407e8094f99197ce1f0c35e11a98fbe372414ea2064a3a12d1cd5c8df8fc0e79f5b770b58f477f91976ca0139895120e246baab5a026f2d39c687dc0788334b5c626d52cdebe05eaf30864b413eebdc5581ef00d439276e52f479c9c05b116395826b60490b3ce700cc0027f61e46ca2f6fbc2c9de2e800806550afb06d4a08eac7a758e24582a4d6d428b433d365fc31d4444607afb64f15e370794005a3a2244e666d5d4c38ad2009c769a51cdbf738d235942f412d07feeb73b3657d0b0c91cb5940bad6a706e14edcdc34225b1c1f38b1abecb2adcaf819155a94fe190fd556822d559d9c470854d3a43bfb868dadd6e443d98ee87e4d8284f5cf3a6dafaf295b902836c640511e610ae7d0cb1b1d3d6079fe6", "signature": "be17444cd465a87a971df84eb102f9c7a626a7c4ff7aea51d32c81353d5dbc07393ca03db897d1ff09945c4d91d98c9d91acbdc7cc7f34144d4d69eb04d81f0c" }, { "secret_key": "0273868232f5be48592cfa05134e8d5554ed1f9a57bc7e3982a330c57e5a7f3a", "public_key": "f172208782db66d466cbe4f4417f6fc477b7349f2a98db56c03a47227546bc5a", "message": "f7a1d4614cc64a3bc48f00c6276304f34d4dfd15e0617b93ccef126c5c638c9d9953aabb7df42df4e0aaa7eac96a4b38c7ba758d860c90d05e3d14e479e545f319b0e5a85ad8f0991b43d6e49c24fa060e3e5df95c98d9451ab833e12aa97f404611bba359496265a6db11917d0da5c6a702d0b102de36dd0c98df5b54806ce626bb96374475f68a6060eb350a7d2aae3204b3dfdf9f1e31be81f7170f8a1b9385413ff8f6881e10c1e8da4c88afb50639ab44887aca2abeecedf110d2958c13fd3390d1b96a762d16ce196920ce85f6c415bed545b1445302a6f001eb8d00e97c751887868d481a0b1e4dfa04b6f761086ee8e697b019e017104bafb98fca242e334c6f18f1db5b6f295f05c559361c6831dabc42c2110703f9d1f64e12ddf26a8679854e9f8ef8479e1f12c35447aac02ea7f242e58632cf2fd063fe665070445b80f3dc6a3303bba96e05fa88eec201c5c2d00ca81b8da6969d0a4dd0483b3477d325a71facd6fa2209b48cb4f6525da73c9c05b2d9789b01448e1527e56a09a9bc6136d9837243c2077b925bbb933f8fb1daac963398c5802aeda3bbca8ae3b8f4a9a871f7ea8e2c0ce898c566217b5c06ff55ff9f4fe78398ae7973641eafb521", "signed": "15e8d8dc7d5d25359d6a10d04ee41918a9c9df4c87be269fa832434d5301db022481bfa395a3e3466f9554ceee0532a8183a0d0550e7d1abe99fc694c6ff9301f7a1d4614cc64a3bc48f00c6276304f34d4dfd15e0617b93ccef126c5c638c9d9953aabb7df42df4e0aaa7eac96a4b38c7ba758d860c90d05e3d14e479e545f319b0e5a85ad8f0991b43d6e49c24fa060e3e5df95c98d9451ab833e12aa97f404611bba359496265a6db11917d0da5c6a702d0b102de36dd0c98df5b54806ce626bb96374475f68a6060eb350a7d2aae3204b3dfdf9f1e31be81f7170f8a1b9385413ff8f6881e10c1e8da4c88afb50639ab44887aca2abeecedf110d2958c13fd3390d1b96a762d16ce196920ce85f6c415bed545b1445302a6f001eb8d00e97c751887868d481a0b1e4dfa04b6f761086ee8e697b019e017104bafb98fca242e334c6f18f1db5b6f295f05c559361c6831dabc42c2110703f9d1f64e12ddf26a8679854e9f8ef8479e1f12c35447aac02ea7f242e58632cf2fd063fe665070445b80f3dc6a3303bba96e05fa88eec201c5c2d00ca81b8da6969d0a4dd0483b3477d325a71facd6fa2209b48cb4f6525da73c9c05b2d9789b01448e1527e56a09a9bc6136d9837243c2077b925bbb933f8fb1daac963398c5802aeda3bbca8ae3b8f4a9a871f7ea8e2c0ce898c566217b5c06ff55ff9f4fe78398ae7973641eafb521", "signature": "15e8d8dc7d5d25359d6a10d04ee41918a9c9df4c87be269fa832434d5301db022481bfa395a3e3466f9554ceee0532a8183a0d0550e7d1abe99fc694c6ff9301" }, { "secret_key": "336a83b55abf4c02e25e540329b5275843c2ecb8df69395b5a5e241bd0d8c10d", "public_key": "dd60569844570c9f0a82643f446478b5ac6fc542214231a7ca656a92b5fdaa54", "message": "9afee8ab482010e29264b406d9b49453d1ce6d550939072182863e4665284ab05d86258e0623b18754c4785238f697f075adfb9e1d31a42e85934ec071ddddecc2e6c2f61334a79526788b4952190716906dde17fba556eea4c8b59727514f6f5615a19ca36da358fae6a6c54f7f4b7a929e31ba7cc71bde7882fa9ffd87300136409caf3ca64eefea616aed58da5dfbf28b668ec1cccffcef6e2e14f8109e9cbf76cfa414f91ac00f48e93eada385dd3d5c16e1a39ea3dd55c761fca361b428f516c05e694fe5c3c345cd94457187a8e604b200a1a0f937ae89f4d6b5421dffcf7ca15f2e2c25378a4113233f7613f4570aa4b909a9135eae4c7b9ead458007ae17126a11d145258af9563db2f7e8925431878b0eeca8affc01ac5913bf5bac4fa3a857c54cc8906d6af77de6b9326b6506151099e87e99b1e819c6fbe082688f34b803d588e416d853169765d62f7e0bdf72c5cd66669a0335562336735e7efb734a2fada327f858bec602d0da08eba4479e7f6dc4def6e4ebdbb730ee91a33445cadc9df52c825ad36149cefbc51ab102033530814bafa7e87961b06367ff896f08ae334a9b1aad703da686706c11a04943ea75e12992dcf6106e372077cd0311029f", "signed": "d263f56d59cb9b2896a947267c2ed78a945bac5abdbf3c14dc3ad092b2308cb9315c464942a0a20b2024511d766e85c936499a149cd0bbb209150a16432652009afee8ab482010e29264b406d9b49453d1ce6d550939072182863e4665284ab05d86258e0623b18754c4785238f697f075adfb9e1d31a42e85934ec071ddddecc2e6c2f61334a79526788b4952190716906dde17fba556eea4c8b59727514f6f5615a19ca36da358fae6a6c54f7f4b7a929e31ba7cc71bde7882fa9ffd87300136409caf3ca64eefea616aed58da5dfbf28b668ec1cccffcef6e2e14f8109e9cbf76cfa414f91ac00f48e93eada385dd3d5c16e1a39ea3dd55c761fca361b428f516c05e694fe5c3c345cd94457187a8e604b200a1a0f937ae89f4d6b5421dffcf7ca15f2e2c25378a4113233f7613f4570aa4b909a9135eae4c7b9ead458007ae17126a11d145258af9563db2f7e8925431878b0eeca8affc01ac5913bf5bac4fa3a857c54cc8906d6af77de6b9326b6506151099e87e99b1e819c6fbe082688f34b803d588e416d853169765d62f7e0bdf72c5cd66669a0335562336735e7efb734a2fada327f858bec602d0da08eba4479e7f6dc4def6e4ebdbb730ee91a33445cadc9df52c825ad36149cefbc51ab102033530814bafa7e87961b06367ff896f08ae334a9b1aad703da686706c11a04943ea75e12992dcf6106e372077cd0311029f", "signature": "d263f56d59cb9b2896a947267c2ed78a945bac5abdbf3c14dc3ad092b2308cb9315c464942a0a20b2024511d766e85c936499a149cd0bbb209150a1643265200" }, { "secret_key": "88409172618b490393db27d960171cbc187eaf4dd8b320b3d2f824980043718f", "public_key": "ce2e7c5839ef5632a123dc373dc14b1f0505766e9675407604ca7cf54e8d44b2", "message": "fb3e82f11bc286267e123817ad8864e077d9f7a8e7a163ac7eeaf93d55dd111de8083b66b53ce7bc771fc5071a2d7ac2f85d6fc6adcfcec446e16aa1046df37209ad7a29cf9665b439a54d6f8d942f89bdaa56f2f11260cc95993038b0e8fbdb3214f142e6c90b61a1d2b142076206af30ac35784a6dc15a1e79251a8c7731a1c53978038f8d76d70c6c1cdf529fbdb84d1507dcffdd42873dfa6a8fe6bd6f7fd29c80e4b2f933d2b6c9e62c9457e665472655059b63b618e2a9a8e5b9e41c3646173a892b8e6d4bcad6a62a6fccd3455890b58ec2681a95cc9776a9fce83c54a9ef312a331959c7ef3f79ee576eb7b79469c9234b1eaef609884708fe4bb0efac662da871ba61ddabb3fcbdeb8f635657dd9a5d7311e639a824858b9a9868d3f9384da612c7f2e771a46bd2624c99ea2b6ccbca996c1d9c375554f2a551619ce6d5e6e4d6b844a4dbea83ba732331fcf46572c1fb0e257ce1041b265df02e690a92814bbf3b5ecac69ee998766a02b0d2f908b3c15f952699616f2c07d589198989e6056c16319aab6cf8771902c078046a88b2570c13bc5edeba2ed1e3ba131daf94e6891862bb3de7d1063fe405307a5cd975693e9d58e17c690eeef4a2603cafc68c2b", "signed": "93b6e29d63945d5c427387d006c7f0b01956a95fc0436ed42b46d0f17b5bb193ea8c0ebbf3d6d13bb539e35c91f3f0f9fa3414a0223c9060bac83653c6fcd906fb3e82f11bc286267e123817ad8864e077d9f7a8e7a163ac7eeaf93d55dd111de8083b66b53ce7bc771fc5071a2d7ac2f85d6fc6adcfcec446e16aa1046df37209ad7a29cf9665b439a54d6f8d942f89bdaa56f2f11260cc95993038b0e8fbdb3214f142e6c90b61a1d2b142076206af30ac35784a6dc15a1e79251a8c7731a1c53978038f8d76d70c6c1cdf529fbdb84d1507dcffdd42873dfa6a8fe6bd6f7fd29c80e4b2f933d2b6c9e62c9457e665472655059b63b618e2a9a8e5b9e41c3646173a892b8e6d4bcad6a62a6fccd3455890b58ec2681a95cc9776a9fce83c54a9ef312a331959c7ef3f79ee576eb7b79469c9234b1eaef609884708fe4bb0efac662da871ba61ddabb3fcbdeb8f635657dd9a5d7311e639a824858b9a9868d3f9384da612c7f2e771a46bd2624c99ea2b6ccbca996c1d9c375554f2a551619ce6d5e6e4d6b844a4dbea83ba732331fcf46572c1fb0e257ce1041b265df02e690a92814bbf3b5ecac69ee998766a02b0d2f908b3c15f952699616f2c07d589198989e6056c16319aab6cf8771902c078046a88b2570c13bc5edeba2ed1e3ba131daf94e6891862bb3de7d1063fe405307a5cd975693e9d58e17c690eeef4a2603cafc68c2b", "signature": "93b6e29d63945d5c427387d006c7f0b01956a95fc0436ed42b46d0f17b5bb193ea8c0ebbf3d6d13bb539e35c91f3f0f9fa3414a0223c9060bac83653c6fcd906" }, { "secret_key": "e571189b5cd9e788302de3919d850c227dcbb615022e568bdaeb37ac5b2939c5", "public_key": "edda890f42dd5fbc7316a5fadfbec38556f23f51b8efd2625437f6b5069f1ee5", "message": "b62c867ad6227435bfa6dab830684e38d196e1f861aade0fd6a7699b6d60901fefb2d799c35c6f3d8bb94deee834403981866bab84946ae9476c75e9f1d3602b42cb2db437bff33a775822f0d6a257d4b75400eba5b8abb314b71fc6b46f8a34e861a9a62abf33de8482f63f9d7169e773a2dcebee03705dac117fd1499b68e7414f51ff9437f253a1d9901ec3b0bba86965a19383655487b58010f804909de1ffb2212c0252ddd9bf2a56ac46bd59c0c34dd59e46598b6babd4e5f3fffde55e48dab0398c22af9e26baddf77275e5f017b35a9b8f8435f9631936b391cb95d7adf35d1d8545a0fd066412d508967bbe9a20245a269e3be2777117e75fbac170dba352be69b254d353b3b2cb3b7e21b721aa9fe044f8916b4b2a6f8c28f8abe66ac92b91323ac73afd93dfbeeaeef26d19bd9f67e99d48cd2ad2d3e55e45d24d54b50f44a39b90e242ebe9b42bebdb230c470bdfde1bc7721c3120008477393dcc2e15fd22b251feb0e18b02883c078aee4fb760655a671dc7b8aadb9a562420a3c2efa2d342e1e0099d951b42242984f594e6914fe282b1ee128735984ef93a669e6ecba26c9fcb9f09f09256645617f1392d35908917cb8d29e0897c7503cddd5de1959686", "signed": "7f797a31715d7c356f8f1f783700aa9974bb936d661661ad968c7cde1ac9e767be56a2dd49b9230e90110c67c0ed187cb7e75c3053ece844984d296f0d85cb07b62c867ad6227435bfa6dab830684e38d196e1f861aade0fd6a7699b6d60901fefb2d799c35c6f3d8bb94deee834403981866bab84946ae9476c75e9f1d3602b42cb2db437bff33a775822f0d6a257d4b75400eba5b8abb314b71fc6b46f8a34e861a9a62abf33de8482f63f9d7169e773a2dcebee03705dac117fd1499b68e7414f51ff9437f253a1d9901ec3b0bba86965a19383655487b58010f804909de1ffb2212c0252ddd9bf2a56ac46bd59c0c34dd59e46598b6babd4e5f3fffde55e48dab0398c22af9e26baddf77275e5f017b35a9b8f8435f9631936b391cb95d7adf35d1d8545a0fd066412d508967bbe9a20245a269e3be2777117e75fbac170dba352be69b254d353b3b2cb3b7e21b721aa9fe044f8916b4b2a6f8c28f8abe66ac92b91323ac73afd93dfbeeaeef26d19bd9f67e99d48cd2ad2d3e55e45d24d54b50f44a39b90e242ebe9b42bebdb230c470bdfde1bc7721c3120008477393dcc2e15fd22b251feb0e18b02883c078aee4fb760655a671dc7b8aadb9a562420a3c2efa2d342e1e0099d951b42242984f594e6914fe282b1ee128735984ef93a669e6ecba26c9fcb9f09f09256645617f1392d35908917cb8d29e0897c7503cddd5de1959686", "signature": "7f797a31715d7c356f8f1f783700aa9974bb936d661661ad968c7cde1ac9e767be56a2dd49b9230e90110c67c0ed187cb7e75c3053ece844984d296f0d85cb07" }, { "secret_key": "371744ab63c115613929a343709bb019b7357dff72d2a149f1d0f71d3a201efe", "public_key": "e58abfad4a13859f0acb05d0e47d59638f7b1b4936100b988d61e6e70e22667d", "message": "c219de1e8d7ad8df08c49377396fe7c1f2d57bd2170633a00d708faadee180ceba92849a7778506cbb366875bf9124701894cecdb3385147d0671843922a649aff7c435eb5a9c74927503072d0067978716dc80be1545a2dbf5a1c38536e12bd7720c1965d3803a4e8aa55765192a13b705ca1059ded0e806362fc5bbe6c76a1c9674bb853790f7e90af00753e00436da48cd082ead64fddb689890162082f8482924f33acd604640f69927352b43f64402d27a883fa6b72aa70d241dffaa1701a25cf1079358260793875f76a2978e9f9f9d68634eb3f5f01bde1ce49e5921252f949f082795e4eafed7be5b49a9f95edbb4a13532e3f3b3be62e2652231253a20c1d5477e8f4bc57ed76fa19eaf03a11bba429b6496ce76246170e043bc14f2d2f703d968f1deb09388715c37cb4752da8d464e348e0313c8993e24133a7c545284e3c9c907d01b260c4883f9cb3e3dc5b6f7fb6d75536365f2132eaeddab570e7273afac0bff5c9fc0b820f2078e0336052e1fe7bdec86674d0998ec78da1c3f34751f886727695f35eca1304b14734766ab05c1186306ded9db3eef65d3c0456cdae8181afee04b296c6722a88c7ef3088d26f7fe74bc89cf5285c688f027b7e68600486af", "signed": "5eae4ac72af0174ab256527b7cd337a0e5482e615af068db21dae35a64640742604df73fd4ca02ed9515a5608d73195230fadca7b426f02a2fbfd02061af3600c219de1e8d7ad8df08c49377396fe7c1f2d57bd2170633a00d708faadee180ceba92849a7778506cbb366875bf9124701894cecdb3385147d0671843922a649aff7c435eb5a9c74927503072d0067978716dc80be1545a2dbf5a1c38536e12bd7720c1965d3803a4e8aa55765192a13b705ca1059ded0e806362fc5bbe6c76a1c9674bb853790f7e90af00753e00436da48cd082ead64fddb689890162082f8482924f33acd604640f69927352b43f64402d27a883fa6b72aa70d241dffaa1701a25cf1079358260793875f76a2978e9f9f9d68634eb3f5f01bde1ce49e5921252f949f082795e4eafed7be5b49a9f95edbb4a13532e3f3b3be62e2652231253a20c1d5477e8f4bc57ed76fa19eaf03a11bba429b6496ce76246170e043bc14f2d2f703d968f1deb09388715c37cb4752da8d464e348e0313c8993e24133a7c545284e3c9c907d01b260c4883f9cb3e3dc5b6f7fb6d75536365f2132eaeddab570e7273afac0bff5c9fc0b820f2078e0336052e1fe7bdec86674d0998ec78da1c3f34751f886727695f35eca1304b14734766ab05c1186306ded9db3eef65d3c0456cdae8181afee04b296c6722a88c7ef3088d26f7fe74bc89cf5285c688f027b7e68600486af", "signature": "5eae4ac72af0174ab256527b7cd337a0e5482e615af068db21dae35a64640742604df73fd4ca02ed9515a5608d73195230fadca7b426f02a2fbfd02061af3600" }, { "secret_key": "498b6ee6492d53231b3532d193578ba75d6a894e2e530034e21ab8ad8d2c0d1f", "public_key": "d124665b28facd2d17946a04dfe3d129a4561a2b24eb326d84b62b422e44dbcf", "message": "0498a59b87cdae28695547e10863bce804d97de0ac8008f3d5fb652c1757419fdc9e0f9736f4c59a34f21cfc74599fa788fcc10c6730c7df8c3d2c1b6a786d1230b65585719d1cb5c490359b94435d6dd671f54d6e9a19b9b5aaad7e0f233f8797df997828d88cd92ef089ef7dbf1e95277894a2f7c2fd0c8e4dfdfa6d3d14589ff01916dbf9ddd811c2f5e01e94298990a145a6cfc26895614c7c963fef308a4e3856c32dd3e359bc56d2cca496ad199ff1a568d6430ac5cd208e0e2d07803ca523e0d813ad3733ab50bdcadcb988aee758ea50439bf38ee649997604f151c602c82900a8205d8f6f670c8684bf5abb5f75ff29a37eb9bf8105199fbbfb4707e162e64c715270f853e648b0aa26fea0f6db562896bf424a9ffcb292fae85b76cefb8bd5a4b3ce1fb39bd2a50d0c9e6d933e167ff629b8a494f2a9b774eb303c781ea02aff1a8afadc2465cc616968015ed6a5a33c3120b945ed5351981e32fb9fb96b2212dcf8fe9ac56e3cf41dc524f800631020b025919178ce074eef078d6842012a276efa628db54058d1eb5b5b705f1e1818d2df5164baabb0c61956ecdb8c706e562fc4fd64052870530ae425b221f89dd6f90dab882e763e7a7ffa141bbaa8bf7a3f21b0", "signed": "112f5c6d3bcb3dd99346d32ad69cbfac3e653bef29c68a33f43231f66cea1d0a195427d6e10c0e77c5d55fe2794287ee32e5e22bafbbd8052ad3606b90f945050498a59b87cdae28695547e10863bce804d97de0ac8008f3d5fb652c1757419fdc9e0f9736f4c59a34f21cfc74599fa788fcc10c6730c7df8c3d2c1b6a786d1230b65585719d1cb5c490359b94435d6dd671f54d6e9a19b9b5aaad7e0f233f8797df997828d88cd92ef089ef7dbf1e95277894a2f7c2fd0c8e4dfdfa6d3d14589ff01916dbf9ddd811c2f5e01e94298990a145a6cfc26895614c7c963fef308a4e3856c32dd3e359bc56d2cca496ad199ff1a568d6430ac5cd208e0e2d07803ca523e0d813ad3733ab50bdcadcb988aee758ea50439bf38ee649997604f151c602c82900a8205d8f6f670c8684bf5abb5f75ff29a37eb9bf8105199fbbfb4707e162e64c715270f853e648b0aa26fea0f6db562896bf424a9ffcb292fae85b76cefb8bd5a4b3ce1fb39bd2a50d0c9e6d933e167ff629b8a494f2a9b774eb303c781ea02aff1a8afadc2465cc616968015ed6a5a33c3120b945ed5351981e32fb9fb96b2212dcf8fe9ac56e3cf41dc524f800631020b025919178ce074eef078d6842012a276efa628db54058d1eb5b5b705f1e1818d2df5164baabb0c61956ecdb8c706e562fc4fd64052870530ae425b221f89dd6f90dab882e763e7a7ffa141bbaa8bf7a3f21b0", "signature": "112f5c6d3bcb3dd99346d32ad69cbfac3e653bef29c68a33f43231f66cea1d0a195427d6e10c0e77c5d55fe2794287ee32e5e22bafbbd8052ad3606b90f94505" }, { "secret_key": "cefcfcd1cff4d8910749279131830b1da19dfc5245f78ca68b8c3c1b622b4551", "public_key": "1d394abd1b4ed1aedf966a60efd3ff882140a7e56b428374ecb443289a9c7f00", "message": "5ec94ed06fc1257ae9c183ce56271207aca37a23fdb4b0e74ac9307a1bb112e05ed5a5d047c93109e2e59477b03378346422de36714c2961bb9736a513ca3671c603a68c2be7317b1b52a076dae2aff7bc88cd5eea0aa268faaadae539c938bb4fd4b6069b1945eb6af0c9e6c8aa5ee4a4af37e90c67e248e8d27bd7f9589c4d30e905651baf45364fa049957ea5d9b7146ca68204e5e973d0f1c91a1c4bded66115028a71114f0f4f851bd115faeb954e3f71a01470b2481a0098d99f9d74898c8ba0287cc7834155214173d1fcbafcfe9b08250384439476055883833816c9524cfd5744aaa259db7ebd3a6aa20b5a6546dadefd140668eb0eccb5f668db9fc62983df980850c9d19882a17550d5dca3542cd36003a0d03cffb04575a3e8e1d07015c7b30eca9115cd2b72e46dfddf6a4dda1faa2dbdc89000d433f6ec9adc46146d939f32121b99b28983d98b9dde8c3f6e5779f2b0700cb023db13de656e0aed1da2d5c6ba2652343648ad420f6ab9e55a97482a1a22b3bc2ee598629abad9547edb5ff790990564bd871f81b24b12f2bf8dbdfe7a88375fad9ccbd9fc0ba1d3bba5e3c4813c18a0348aad83fb1b82689054d99b4600dd1760d0dcce44757467bec1946406d530", "signed": "7d83ff66ec79307b1c0c093fda3968a96cf6044f5c802888584018845e7caf2a135ac6f1677e84d22e458e227e4f930209919bc11b12f7aaf2b8c94302d642005ec94ed06fc1257ae9c183ce56271207aca37a23fdb4b0e74ac9307a1bb112e05ed5a5d047c93109e2e59477b03378346422de36714c2961bb9736a513ca3671c603a68c2be7317b1b52a076dae2aff7bc88cd5eea0aa268faaadae539c938bb4fd4b6069b1945eb6af0c9e6c8aa5ee4a4af37e90c67e248e8d27bd7f9589c4d30e905651baf45364fa049957ea5d9b7146ca68204e5e973d0f1c91a1c4bded66115028a71114f0f4f851bd115faeb954e3f71a01470b2481a0098d99f9d74898c8ba0287cc7834155214173d1fcbafcfe9b08250384439476055883833816c9524cfd5744aaa259db7ebd3a6aa20b5a6546dadefd140668eb0eccb5f668db9fc62983df980850c9d19882a17550d5dca3542cd36003a0d03cffb04575a3e8e1d07015c7b30eca9115cd2b72e46dfddf6a4dda1faa2dbdc89000d433f6ec9adc46146d939f32121b99b28983d98b9dde8c3f6e5779f2b0700cb023db13de656e0aed1da2d5c6ba2652343648ad420f6ab9e55a97482a1a22b3bc2ee598629abad9547edb5ff790990564bd871f81b24b12f2bf8dbdfe7a88375fad9ccbd9fc0ba1d3bba5e3c4813c18a0348aad83fb1b82689054d99b4600dd1760d0dcce44757467bec1946406d530", "signature": "7d83ff66ec79307b1c0c093fda3968a96cf6044f5c802888584018845e7caf2a135ac6f1677e84d22e458e227e4f930209919bc11b12f7aaf2b8c94302d64200" }, { "secret_key": "d107cf26f527db71a206e41d17955321013225bb20f93e12df3dc7399e720ca3", "public_key": "186bf453c95dc0a2fd589a78e2c80040b3f6ddf9a6f8681d146036cf2146e8fc", "message": "78eb9e13789928a74f360141728ede98389685c836b91fafbf1a7e8c19cfbe21bd3c3d6c6ed83c409ef693f1d735da3fa466497e19f38e30fba2a1023785459070e6e92c1cb7c9bd0c9ba61220157866c3bed2b01e6e6b9b8dd3f0c47c02f181346a0a9b9b5d3d7e18a94d6956855e16e8eaaaab71b10302f35bd8fb1f9b5847304160324926645b0582c2f2f1533a24281461514241db2850ef31c5763b2e3d4fb18fc6d8c1d7e52f7c13392c17e27019ff60008e431f1714370bc0efd9452a61f5c56488d91a185037f1f647f72fa785010d5d78f0a11587ccf66b8088e0e635fff3774193b2edeffd92d6e8a0321128ae64cdb862e631e2ee5ba0da44bbd589dc392b5a113b86a727a8ddb698a334cc668b39b1cde199b88837ca5f00f553f89c622834273641d39bc10c6a24e1eb42587542f03fc1627524ed6b749391f11028706c42364425b2caf20180e1b802c744b49b7bcd9bf7b15c23a0bf1c6965960d341554e1966b6ef82fcfbbe41d1e09d741e309254446777f13c29a67b8bdebc5f7f04d160d60e332e3d0441a0f2f7b192c3e2bdf6dadec2a424f88669806236ee04dea692bd8bb6f91ca0682ece349142575358b9b7be70600b3cb81e1456ba0799fdc01ffd68623", "signed": "8071d97f324f10358f13ac8c61d424b4f300dd0419571c39e40d99aea5f03140e62ab4c97127ab33e98269966ae1d4557e459bf7f597b313f351a20122f0660e78eb9e13789928a74f360141728ede98389685c836b91fafbf1a7e8c19cfbe21bd3c3d6c6ed83c409ef693f1d735da3fa466497e19f38e30fba2a1023785459070e6e92c1cb7c9bd0c9ba61220157866c3bed2b01e6e6b9b8dd3f0c47c02f181346a0a9b9b5d3d7e18a94d6956855e16e8eaaaab71b10302f35bd8fb1f9b5847304160324926645b0582c2f2f1533a24281461514241db2850ef31c5763b2e3d4fb18fc6d8c1d7e52f7c13392c17e27019ff60008e431f1714370bc0efd9452a61f5c56488d91a185037f1f647f72fa785010d5d78f0a11587ccf66b8088e0e635fff3774193b2edeffd92d6e8a0321128ae64cdb862e631e2ee5ba0da44bbd589dc392b5a113b86a727a8ddb698a334cc668b39b1cde199b88837ca5f00f553f89c622834273641d39bc10c6a24e1eb42587542f03fc1627524ed6b749391f11028706c42364425b2caf20180e1b802c744b49b7bcd9bf7b15c23a0bf1c6965960d341554e1966b6ef82fcfbbe41d1e09d741e309254446777f13c29a67b8bdebc5f7f04d160d60e332e3d0441a0f2f7b192c3e2bdf6dadec2a424f88669806236ee04dea692bd8bb6f91ca0682ece349142575358b9b7be70600b3cb81e1456ba0799fdc01ffd68623", "signature": "8071d97f324f10358f13ac8c61d424b4f300dd0419571c39e40d99aea5f03140e62ab4c97127ab33e98269966ae1d4557e459bf7f597b313f351a20122f0660e" }, { "secret_key": "af7ea8e41c8937a4ec475ad81371a171d3d0f9fd7519a04c751ed4ad8ff8fef9", "public_key": "15dfc71585bac71ef20f374987c555a3f2f07d6b9c787066c10d63cf06e02ab0", "message": "05f2263f0245ecb9faeb14e57aca436668308c8125df3116c4ee20501d0cde701b366e2b50a1c5edf484144ce16bfb1f7d26dc4275ea9732e264ba4d4a362b40275ba47377dbc332cb65e2f4c8853894aa878a4c175dc5b3b2a757ff3c8d7de660973b89dadf076e2e4fc76239b7bc752a229d44e000ceb667104cb0746bfcf59d69603ae7fc1bcf11d2e33f61dc497ec1b0bd5e4f1dbef435f2f291f30b00a85e833946c8b10484e4abd7d60bdbb1fe6dff5807a53bb89382153013b70ca08efc91b7e9fc5b5dbbb6af123b57be2e140fc471a45d89fa8284cc27e0a1fe771f55598bbdcf068d506dad0a592179ceca39ee9526f9e4fe47bf2bb14fb1486a677d4d7b99a520545676a0f1fa809049aa2414ae7b817d9a036e5c157886e8341d4e819c092a3b48b3606b03acb727c6c2217d0af30121546a94af6b49caa2a8c9b1786fa0c2a524ec7a023e924b5f8a89a53780c7f8781c5b8e869430caa0e6d0437967e3aed44f45c901cbcf1026fbbd4e3dd9a091ecf8b34f7dd5038e543dc7eb6ad5494efb145cf63ec0d355bb8e172f455d8a6b13dacaaddbc56e47de3cf762a1a738ef092f1436680467b5cd82e9e36e2d2b6842b3bd5dce77180ddaf0b643378e698599dd47f5cdbb", "signed": "c0f1739167274bf91831c74beb645af790459b28bb3f21325365130f409acb66df1d223759a9758e08fd7253737484e285a6fb47404abe2eba5ef249fd025c0a05f2263f0245ecb9faeb14e57aca436668308c8125df3116c4ee20501d0cde701b366e2b50a1c5edf484144ce16bfb1f7d26dc4275ea9732e264ba4d4a362b40275ba47377dbc332cb65e2f4c8853894aa878a4c175dc5b3b2a757ff3c8d7de660973b89dadf076e2e4fc76239b7bc752a229d44e000ceb667104cb0746bfcf59d69603ae7fc1bcf11d2e33f61dc497ec1b0bd5e4f1dbef435f2f291f30b00a85e833946c8b10484e4abd7d60bdbb1fe6dff5807a53bb89382153013b70ca08efc91b7e9fc5b5dbbb6af123b57be2e140fc471a45d89fa8284cc27e0a1fe771f55598bbdcf068d506dad0a592179ceca39ee9526f9e4fe47bf2bb14fb1486a677d4d7b99a520545676a0f1fa809049aa2414ae7b817d9a036e5c157886e8341d4e819c092a3b48b3606b03acb727c6c2217d0af30121546a94af6b49caa2a8c9b1786fa0c2a524ec7a023e924b5f8a89a53780c7f8781c5b8e869430caa0e6d0437967e3aed44f45c901cbcf1026fbbd4e3dd9a091ecf8b34f7dd5038e543dc7eb6ad5494efb145cf63ec0d355bb8e172f455d8a6b13dacaaddbc56e47de3cf762a1a738ef092f1436680467b5cd82e9e36e2d2b6842b3bd5dce77180ddaf0b643378e698599dd47f5cdbb", "signature": "c0f1739167274bf91831c74beb645af790459b28bb3f21325365130f409acb66df1d223759a9758e08fd7253737484e285a6fb47404abe2eba5ef249fd025c0a" }, { "secret_key": "0c57cbfcebde10ede02d1cb01df360d41f2e66a50443d58b5d4f0828c9a18bb7", "public_key": "c4d761ba189971b9462c61bf46a765f88e2ecaa5bf2211220afb00ac657f7ce5", "message": "337703243ab5b4e4d3481ee8dd1f4494507174412658a93988b5c30403a7b7ed8522ceb46fa1ee02753a874ef0675d397c575da0b08caa8cee3393784d0f0db8459837af90b9056df4e38e417f3ad2eb1a100ef207ce2ca6c610018021661e307099f2b7c4ae875991140bdd3f0f99ad2c5d55aacb84cc1cdcd579e08072b6951fd45ed289ac9ff7f0986ac88a4fbb9dc9203d9baf180c90edf937258c9d0a6d48e220f72d250c7f2c777eaa7fb9fa11d50a5798772f9fd976b00599f1f0276f3a2e4d988ae92125467a8dedb7a16f9e3a56e8d00662b3eb67a35b9b60e73bd935077ee238df8f6e833b9a5523386826c1f2917b1c3ec98e0a5fde89c48b1d446da5d0c885fef0e374bff30a997c7bafd5e743c85d0c6aaa6ef10a061211a2327c6d84eb747a56e9bf60fcd5b553b798834d0c5ccadb9d4b54e7237d12c679c193a287bb2f511cd4ee2a2d8549b44b21c11fbe5723381c6c5f784687fd90cebc5b495af9e414f2961b06a1c8433b9aa3292bcff4241c227167f8d1de054ba33ad81da3eb3ec6e40a6e26854af349540171b75d75fb9a8d12937827fd594d317b7a8d9f1c2fcabda56375568c3e9e514c2efffc3878363dcfad9fd95436b022e8772a88cb71e803bf90381962", "signed": "8af7bbe01b8ab93951d16fca05a9c967d1c52c974bea151ea72e4cebaa20cc783bb61d8d69385cac5bc6d72dbd162beef1fcb5dd0e0a08b48ca0b9f6d9a9880c337703243ab5b4e4d3481ee8dd1f4494507174412658a93988b5c30403a7b7ed8522ceb46fa1ee02753a874ef0675d397c575da0b08caa8cee3393784d0f0db8459837af90b9056df4e38e417f3ad2eb1a100ef207ce2ca6c610018021661e307099f2b7c4ae875991140bdd3f0f99ad2c5d55aacb84cc1cdcd579e08072b6951fd45ed289ac9ff7f0986ac88a4fbb9dc9203d9baf180c90edf937258c9d0a6d48e220f72d250c7f2c777eaa7fb9fa11d50a5798772f9fd976b00599f1f0276f3a2e4d988ae92125467a8dedb7a16f9e3a56e8d00662b3eb67a35b9b60e73bd935077ee238df8f6e833b9a5523386826c1f2917b1c3ec98e0a5fde89c48b1d446da5d0c885fef0e374bff30a997c7bafd5e743c85d0c6aaa6ef10a061211a2327c6d84eb747a56e9bf60fcd5b553b798834d0c5ccadb9d4b54e7237d12c679c193a287bb2f511cd4ee2a2d8549b44b21c11fbe5723381c6c5f784687fd90cebc5b495af9e414f2961b06a1c8433b9aa3292bcff4241c227167f8d1de054ba33ad81da3eb3ec6e40a6e26854af349540171b75d75fb9a8d12937827fd594d317b7a8d9f1c2fcabda56375568c3e9e514c2efffc3878363dcfad9fd95436b022e8772a88cb71e803bf90381962", "signature": "8af7bbe01b8ab93951d16fca05a9c967d1c52c974bea151ea72e4cebaa20cc783bb61d8d69385cac5bc6d72dbd162beef1fcb5dd0e0a08b48ca0b9f6d9a9880c" }, { "secret_key": "fe7172278364194bcfefb4783142b79f59d5fd978b1e47c314d78d4cb3f61c8a", "public_key": "2e82cce47910c7e2a79bc1f419dc3c3df54f23291fc8193e8258ccd2fd38d548", "message": "23509451a059969f2b4bdfcee5388957e9456d1fc0cd857e4f4d3c25a4155d5ee91c2053d558062eea6827950de863bc9c3df9672cde8ba741744ebbddb45ec1f4284570fd0aacd07ea58c581be2afc95ae444e678edc2a02439f387cec982ea3a44814a8a302bb3bfe8228d58de039debdf7c2a7eddb4e71ca474f94f7e2bd89dc65b1610733c91fff89bd499f40154a6198fdf5ec7ad3722d925b292196c429499075be0c5b6da9c090c0791a7019eb5e7366be6ce58ab2f04fecd9127c42718047bf47030691521312c0877aa3f36cc5fbc9caae0fde3945d2a868ee2502a3833208eb850a163cfcbf6da9ee6ad9fe067fe241986fe4436d6ae4edc61561938e2a33f4a33db63f69d3f1a8850ed40028869164103488fb795cd82ca067fe1b4897caa49a7ca9a80f3a8151fd13bbb7ff350e8579f565dc1c4a9ca938d27b15b3f858ef45d3dd78b2c358635356315f55a97528ecfec5d11a5b721503107faa406c17034e601474b3b60cf48692e269261158fc353d4df4274381357790b7756087b00cc79e3b9d28a3f2439febf199e64a8b37c91b5a4334e3354e8faf3a361e856c54bdaa43bfdcd6ee6c9f9679588f6069950832348aacba2bfeebacaa2071ddc7d77898ef0f68793cd25", "signed": "f6c2a4296b9a3407c6d7a5679dae8666b503d1a17eacf71df493791b8ff0c0aa8eed36b327a29ab7828f46f22de868b628b1cfd501e8599fa31693b15f61080f23509451a059969f2b4bdfcee5388957e9456d1fc0cd857e4f4d3c25a4155d5ee91c2053d558062eea6827950de863bc9c3df9672cde8ba741744ebbddb45ec1f4284570fd0aacd07ea58c581be2afc95ae444e678edc2a02439f387cec982ea3a44814a8a302bb3bfe8228d58de039debdf7c2a7eddb4e71ca474f94f7e2bd89dc65b1610733c91fff89bd499f40154a6198fdf5ec7ad3722d925b292196c429499075be0c5b6da9c090c0791a7019eb5e7366be6ce58ab2f04fecd9127c42718047bf47030691521312c0877aa3f36cc5fbc9caae0fde3945d2a868ee2502a3833208eb850a163cfcbf6da9ee6ad9fe067fe241986fe4436d6ae4edc61561938e2a33f4a33db63f69d3f1a8850ed40028869164103488fb795cd82ca067fe1b4897caa49a7ca9a80f3a8151fd13bbb7ff350e8579f565dc1c4a9ca938d27b15b3f858ef45d3dd78b2c358635356315f55a97528ecfec5d11a5b721503107faa406c17034e601474b3b60cf48692e269261158fc353d4df4274381357790b7756087b00cc79e3b9d28a3f2439febf199e64a8b37c91b5a4334e3354e8faf3a361e856c54bdaa43bfdcd6ee6c9f9679588f6069950832348aacba2bfeebacaa2071ddc7d77898ef0f68793cd25", "signature": "f6c2a4296b9a3407c6d7a5679dae8666b503d1a17eacf71df493791b8ff0c0aa8eed36b327a29ab7828f46f22de868b628b1cfd501e8599fa31693b15f61080f" }, { "secret_key": "a951e4e6ba9f1f0b354831c986942448faede37e11b0f247da2706dceef73ac7", "public_key": "30362014974bf75c8495c2e271e713d57384384d0a5da88edeea79279c0c58ec", "message": "20577dcac89174885eedb062489cd512fa72863ec5438e31e95878b75ce2772aee6290a0ba3c8f642c1d0ef55da8d5bc1484f83bb9876c7a8c0b6b609b94d112a06fc83ce8d2c1e08ed6c735e57b244aad6ecf7075363d565ba47865695c8423510909e0a3db4b61ed7aa67a7471331e83a0c58b8220a6245f65661549c1a12d4c0d50c326fb94917cbd07be51e83fe8bb3e46ca01b0a260daaf1d6abe3703d6a925113bb4d57ea1a48b4c7dbdaa03eea814a4b5f02e1dfb545cc623fe17a3bb18e4373f5f7ec2fb5217d23e4fed54a772e11323e730aad7efca8c464400e7679055fcc125a876ef7b8b9de186e229a7abf191d0c56d91815f67872e957bfbc7634aac403576a58f427bdbb30e8c4b6fc6c447741024ebb503a5a9025124a4887f825a43ee940f210a1bd5ae4f6732d60f95f2b83201c4c6dfe279412d7502a5211f8f48f800db30fc3776c4ed3a38bb4634822c98a6d6dd3233be60e42cca45a3163cc84e9e8da647c0711bc4c6ccd65aa1e972c07404d103e74bcc31a7e2c3eea5ac9257ab428947ab3dd3fb153d90694a4073373c4dd9ceb131154fe877473fd996f424f33e316e4eb02b8c7513be6998e516cbba54d94cd0a435e0ffcc2c0a8ef72b630ec24781066aa5efb9", "signed": "0278c86a15208d9be5b1e1574761861b8af72ae08d40cdcbec354e65a9c3d0a06b5fcbb297d09bef397462395986c3093eeb22644c003c3078178cdf674e990a20577dcac89174885eedb062489cd512fa72863ec5438e31e95878b75ce2772aee6290a0ba3c8f642c1d0ef55da8d5bc1484f83bb9876c7a8c0b6b609b94d112a06fc83ce8d2c1e08ed6c735e57b244aad6ecf7075363d565ba47865695c8423510909e0a3db4b61ed7aa67a7471331e83a0c58b8220a6245f65661549c1a12d4c0d50c326fb94917cbd07be51e83fe8bb3e46ca01b0a260daaf1d6abe3703d6a925113bb4d57ea1a48b4c7dbdaa03eea814a4b5f02e1dfb545cc623fe17a3bb18e4373f5f7ec2fb5217d23e4fed54a772e11323e730aad7efca8c464400e7679055fcc125a876ef7b8b9de186e229a7abf191d0c56d91815f67872e957bfbc7634aac403576a58f427bdbb30e8c4b6fc6c447741024ebb503a5a9025124a4887f825a43ee940f210a1bd5ae4f6732d60f95f2b83201c4c6dfe279412d7502a5211f8f48f800db30fc3776c4ed3a38bb4634822c98a6d6dd3233be60e42cca45a3163cc84e9e8da647c0711bc4c6ccd65aa1e972c07404d103e74bcc31a7e2c3eea5ac9257ab428947ab3dd3fb153d90694a4073373c4dd9ceb131154fe877473fd996f424f33e316e4eb02b8c7513be6998e516cbba54d94cd0a435e0ffcc2c0a8ef72b630ec24781066aa5efb9", "signature": "0278c86a15208d9be5b1e1574761861b8af72ae08d40cdcbec354e65a9c3d0a06b5fcbb297d09bef397462395986c3093eeb22644c003c3078178cdf674e990a" }, { "secret_key": "38a9b2d49ba8b82f301a5772cea0efc2218455c8b218b22cbaa2aad2d7ad3b35", "public_key": "9df5ea1f78f810a521774602bbba4942f0459238966c8bcd21900afbf3d84293", "message": "1778167c49b3a44d4a5ba838b7388553b1e13d36ea4f86d30242e1a822a3bbaff5cea63e2ae2a4635be236fef2b8135d14fb621c0bb773c9c17753f80926eb55d0f115bd09a885d844b818c9f04489a331bb5e032b8e58cda36949c5a8d08b55bb8de965e1f90d3b9cfeecfc6ad9a4ee5cb4047e9450acdc64640166a8c069ea849aebddac1ae4afec91ddd17fa5553fa87c56f7e51ec1cd6b5cc23351d057a4ce4a8923c8ae6ac7a8afdcc0881c0e74ebb024ef7296162cb93c68e50bbb074e651ac87dac9ea59d4c3fbf0fe379f3e97a24566ecae54303bcfb6f0cc9f15f6639430e66b19a427849fdfff833df02689e9de44006c903c559183459b9f4a97f54a0f2a28df7b0e9deeda8239d7b516977f5e7d6971b4502e9885f750af8d1a6669e25e77d5f327c77c87a86e0a1872bc96a76060f5f8a0c40cc973bfc7fe6ed9bca78f884e6a2828b94d489d32a0fd337e69db83fb8789afd4e8ef54c22a78c2587468b9ae071bae3b202d3183ad5f0f8e842e5a8de85bfff49e03c8381bca7fd4278ddccaf0134fb5593a395a77a5cbd434593bc4ad0ff4b8400ec674c4ecaf1d57754be0cb2fa9a6441a9abad7b42197ad82e50827e4a4245573a8f0ef87f58228a2867f4b3b834b6635037940a", "signed": "e19e62ac539a9ca251d12d4c71055b0a3f581d19f2682e672404c78ac1f12bbefc91519276a5cbe16f520cf7a7f687a240f0329157c59f50026a58dcdc50fc081778167c49b3a44d4a5ba838b7388553b1e13d36ea4f86d30242e1a822a3bbaff5cea63e2ae2a4635be236fef2b8135d14fb621c0bb773c9c17753f80926eb55d0f115bd09a885d844b818c9f04489a331bb5e032b8e58cda36949c5a8d08b55bb8de965e1f90d3b9cfeecfc6ad9a4ee5cb4047e9450acdc64640166a8c069ea849aebddac1ae4afec91ddd17fa5553fa87c56f7e51ec1cd6b5cc23351d057a4ce4a8923c8ae6ac7a8afdcc0881c0e74ebb024ef7296162cb93c68e50bbb074e651ac87dac9ea59d4c3fbf0fe379f3e97a24566ecae54303bcfb6f0cc9f15f6639430e66b19a427849fdfff833df02689e9de44006c903c559183459b9f4a97f54a0f2a28df7b0e9deeda8239d7b516977f5e7d6971b4502e9885f750af8d1a6669e25e77d5f327c77c87a86e0a1872bc96a76060f5f8a0c40cc973bfc7fe6ed9bca78f884e6a2828b94d489d32a0fd337e69db83fb8789afd4e8ef54c22a78c2587468b9ae071bae3b202d3183ad5f0f8e842e5a8de85bfff49e03c8381bca7fd4278ddccaf0134fb5593a395a77a5cbd434593bc4ad0ff4b8400ec674c4ecaf1d57754be0cb2fa9a6441a9abad7b42197ad82e50827e4a4245573a8f0ef87f58228a2867f4b3b834b6635037940a", "signature": "e19e62ac539a9ca251d12d4c71055b0a3f581d19f2682e672404c78ac1f12bbefc91519276a5cbe16f520cf7a7f687a240f0329157c59f50026a58dcdc50fc08" }, { "secret_key": "9a1717873689a03c112dd6b4d76ae73b89b416a598ceec209e27961e7bb1ee8a", "public_key": "eecad1e0e4b863291881a8c241db9ccfffe4e55d8b5a42f307b4436acd0649a6", "message": "e26580470901a07ab0931aa23829802ce04da59fdc2f773bc567f1e65b4f2e2d4a1a6aec1f54158adfce9b099790b503a13d22097ae23ebccf923f3bb1986d6e49111a8cf0d4eb8236bfe0d7c9e93a5efc7feb8e6a9cd1b8d921efa21e449ff49e06c1ccfea31f93e033c3c2a54ddb0f653a09fbd18a70b56315f193e7be56e5168f59563821d4bc3bbb0eaa2048286bbeee5aa3f3e7536cf2b750fd322602bb3847ceca39b75474322d76b1de80fa2eadba152d6f8f020d4d931c53f0a2801224d35deb6ec13b014873e689903607de96d9b7a743a887d2f48daf2ed2eefb202abf6082796981123b966e936dcf3483e2d24d694ecb865fbeb6969f347027fb8b175d24a4c045c0bb4ab5e02ddcbe77d4756c46d137b094473a02307a108340acad9d03bae8403af199cb75cae3162f3815813cc68bf2a5e499e594921149f3bbd214da5137e756521559dc80d9a4b74a0f4943022c7cd5fca42315e0bceeae9069615ce67a04382412313a31d67b346c329ad82e742c0a6ce0a6a02454c113e52022f3cc03fda691ebdfe14c53c8ce5ca9b932ca1a386e3eb4e90a4dc6e8ad8533b5af1aaef5003128655ca64f67fcd97c6ac803002404900bc0fae98463bcc31409f9981748789ade2d07783bc32b", "signed": "1af8be095538965800d8eff6d723d028d65d0e9c6eb5e9d125bb3b1783f11ef7079a49a807e27ef1260be26a3b231d03b2ae151e49f6f189f15b1c83eab01c02e26580470901a07ab0931aa23829802ce04da59fdc2f773bc567f1e65b4f2e2d4a1a6aec1f54158adfce9b099790b503a13d22097ae23ebccf923f3bb1986d6e49111a8cf0d4eb8236bfe0d7c9e93a5efc7feb8e6a9cd1b8d921efa21e449ff49e06c1ccfea31f93e033c3c2a54ddb0f653a09fbd18a70b56315f193e7be56e5168f59563821d4bc3bbb0eaa2048286bbeee5aa3f3e7536cf2b750fd322602bb3847ceca39b75474322d76b1de80fa2eadba152d6f8f020d4d931c53f0a2801224d35deb6ec13b014873e689903607de96d9b7a743a887d2f48daf2ed2eefb202abf6082796981123b966e936dcf3483e2d24d694ecb865fbeb6969f347027fb8b175d24a4c045c0bb4ab5e02ddcbe77d4756c46d137b094473a02307a108340acad9d03bae8403af199cb75cae3162f3815813cc68bf2a5e499e594921149f3bbd214da5137e756521559dc80d9a4b74a0f4943022c7cd5fca42315e0bceeae9069615ce67a04382412313a31d67b346c329ad82e742c0a6ce0a6a02454c113e52022f3cc03fda691ebdfe14c53c8ce5ca9b932ca1a386e3eb4e90a4dc6e8ad8533b5af1aaef5003128655ca64f67fcd97c6ac803002404900bc0fae98463bcc31409f9981748789ade2d07783bc32b", "signature": "1af8be095538965800d8eff6d723d028d65d0e9c6eb5e9d125bb3b1783f11ef7079a49a807e27ef1260be26a3b231d03b2ae151e49f6f189f15b1c83eab01c02" }, { "secret_key": "43bd924db8156008c6b3994a8130d427d514db8a613b84dfb0b8e0de6ac30676", "public_key": "1b3461c269d5b0062d5df6fa654a2586f647a0684218a06e5e2f7badfb394131", "message": "6184e6480c42e96cc877269b16371545ff9523c45ea88e76a1348c68ae7f318b088fe4610928239185b6b55bfa0f43644c4a4c97c56ed77d08b1f4aad2f4aa069994abeca96b7bf81b8064ea4350d8a8b02297a51308b61c57c8f1873c6f97007aca3180429e730a6643f28733547bcf7b9adfe327e85736bd04af7f1d9f4fb84a7f3affdf4e22b574ecb4bc8836b10b8453aeaa5c1bf132248b826cc5230f75e075fac9f037561136e00643d08253e7ad652f702c0d15b6d7d48aa6f8e9b5f5cc146e3f156fb2522751c3710041bd922f37a50377e028b0c4e4bc3465d7c84af6a5fb427acb3b41378b102bda46d8f6f203a5ffcf395d435e93458a0b0a4c2e7782fafe119f769f67058c6677f6d10d9cf5cb8748e1805798ed233f6f930eee0e5075bc58b97af9177fda75d53708beb04dc4f19a43e768074609f14065f48fdad5077ce109bacc357174a6b7956f6e7f32e38415be526370fa58c3c0b31f51e6cd4b2cf27f8bcbc21259d9e5c3b5c2946a9fc1b00d9d15c3b7d80bfd9d05db91d249d3e42d8956682044548d83bda8d5cc9212442f30b45cf4aead80cce9b3512c39c5c737d3f8d747afbab265af5eeef8ca9362ec76e943b0a0d7a39f3db11eca14458a7b592e5e4ff2275dd48b2853", "signed": "d2a05d88d9d543d94d57ec88ae55681750f20b9be9c1e918cdaf457767f2948dd629e94f068edcf3d9927e330234badc3a02fa5ad3d9d85e948cb0b0cb3cd70a6184e6480c42e96cc877269b16371545ff9523c45ea88e76a1348c68ae7f318b088fe4610928239185b6b55bfa0f43644c4a4c97c56ed77d08b1f4aad2f4aa069994abeca96b7bf81b8064ea4350d8a8b02297a51308b61c57c8f1873c6f97007aca3180429e730a6643f28733547bcf7b9adfe327e85736bd04af7f1d9f4fb84a7f3affdf4e22b574ecb4bc8836b10b8453aeaa5c1bf132248b826cc5230f75e075fac9f037561136e00643d08253e7ad652f702c0d15b6d7d48aa6f8e9b5f5cc146e3f156fb2522751c3710041bd922f37a50377e028b0c4e4bc3465d7c84af6a5fb427acb3b41378b102bda46d8f6f203a5ffcf395d435e93458a0b0a4c2e7782fafe119f769f67058c6677f6d10d9cf5cb8748e1805798ed233f6f930eee0e5075bc58b97af9177fda75d53708beb04dc4f19a43e768074609f14065f48fdad5077ce109bacc357174a6b7956f6e7f32e38415be526370fa58c3c0b31f51e6cd4b2cf27f8bcbc21259d9e5c3b5c2946a9fc1b00d9d15c3b7d80bfd9d05db91d249d3e42d8956682044548d83bda8d5cc9212442f30b45cf4aead80cce9b3512c39c5c737d3f8d747afbab265af5eeef8ca9362ec76e943b0a0d7a39f3db11eca14458a7b592e5e4ff2275dd48b2853", "signature": "d2a05d88d9d543d94d57ec88ae55681750f20b9be9c1e918cdaf457767f2948dd629e94f068edcf3d9927e330234badc3a02fa5ad3d9d85e948cb0b0cb3cd70a" }, { "secret_key": "8fb086206dd95a2621f598560ccb281f8273c8fc72e23611089baac89d3c3c78", "public_key": "20276ef479f4d4523ab77420d424e8819c33c83779ed80c7f666e8f4403f94d7", "message": "f02903ed4266e849a4485205954fffa8a108c323b7e3f84331043514e48556ab019497233a5a127bff3cd7c97086becef538b3f339d7d06e532dc7325e597ae357f816dea42a6a22c79d22074a2e1ad8023c424b7e096e5ad8897b05ef7d00d30a04aaf2981eddff2b347f1e27e20aabbe7e7a9544978e092b00cce420aba06187374ffbb37b4c22d75f04e57590f610a27347286c298312a6c9b1bdf24fbda8513c4f8356ccf757068ffc11bc65113783a5dde7722faf4ceb19fbb62f40702e2c6e6a8bb49ef40446450c4c59a2990944da4744f6ee770b930c246669813ce5a9f5a47dd80388981bfcc3a56b5be2c4c7e659a2e9182dec0aaafe9031aa3954d4fe7c431196a561a5b78eaba64f3db1b586c53b16f679a84921a642c260e4653a61de108ebde6f7053afa2cb3f3668ede121020dd1bace8418aebac3a5bd5142f105ac26fe49e5fb140c19b22d54a6291dfc954670247881646874defad814995519f6260e9774a8d185c37881b4f2543c4b63fbf1985016ab41c4d728cbc90b3ab876267bed41d0c0902f6b50e8fa906fc4788f7b820467306e0fe9e036a0a00f804f91c3ca718b95ff6d9e2204bc3161bf70fcc17b2964b56bc612e29402d96f50986514bc7d831d58e42793786d5806f", "signed": "a9305e001600d597d05ef671699bf09f0dcc0c44475d3ca31e7ff1bffedc0c67daa1f3b76a035948c59cd87f82453a40950a1c9703c2e7d9280e7303966da301f02903ed4266e849a4485205954fffa8a108c323b7e3f84331043514e48556ab019497233a5a127bff3cd7c97086becef538b3f339d7d06e532dc7325e597ae357f816dea42a6a22c79d22074a2e1ad8023c424b7e096e5ad8897b05ef7d00d30a04aaf2981eddff2b347f1e27e20aabbe7e7a9544978e092b00cce420aba06187374ffbb37b4c22d75f04e57590f610a27347286c298312a6c9b1bdf24fbda8513c4f8356ccf757068ffc11bc65113783a5dde7722faf4ceb19fbb62f40702e2c6e6a8bb49ef40446450c4c59a2990944da4744f6ee770b930c246669813ce5a9f5a47dd80388981bfcc3a56b5be2c4c7e659a2e9182dec0aaafe9031aa3954d4fe7c431196a561a5b78eaba64f3db1b586c53b16f679a84921a642c260e4653a61de108ebde6f7053afa2cb3f3668ede121020dd1bace8418aebac3a5bd5142f105ac26fe49e5fb140c19b22d54a6291dfc954670247881646874defad814995519f6260e9774a8d185c37881b4f2543c4b63fbf1985016ab41c4d728cbc90b3ab876267bed41d0c0902f6b50e8fa906fc4788f7b820467306e0fe9e036a0a00f804f91c3ca718b95ff6d9e2204bc3161bf70fcc17b2964b56bc612e29402d96f50986514bc7d831d58e42793786d5806f", "signature": "a9305e001600d597d05ef671699bf09f0dcc0c44475d3ca31e7ff1bffedc0c67daa1f3b76a035948c59cd87f82453a40950a1c9703c2e7d9280e7303966da301" }, { "secret_key": "afa1b846c210b52300e97696f81b8ea774d1df12e612527c55747f29c1937396", "public_key": "b609566bbd1947bd7afaceb14389e836227169215fab66851aa5d70d6e2e3b89", "message": "4cac1b1f4bd48284dcc9afc8b5955b64b436db704b0335d9755cc1f97477f8d323cb6410ef146ab8a9efb9526d8b62e3bbad1f7295f47ba9f0de958f8ec9b77ab42232437ed974856444cd22e20be35e91813bff4b016f810d0f61d89f6b614db33f34bd09985b593fe3e06e065b7bc6cd39d55c2cfbec7b6d59c0b37dd1d0d35135ab1d1b04f2f30c2f04f4ba2b36582738081cf59190f528363db944ed612931d1d514c6214f9ab92abb1833926183ac52fba2a4551e20e4c0ac959a49ddb167a381e0241d40c086e90e52aca017258975dbab2ba451ee539a718f076a58709c6697418d9c6f13e4d391368bf0e8bd8f2932dd95ceaf7aaca1241147d341a3acd08dc32905483572b89a80cc47231468ab8de359dd525a6257cf196c2ecb82fa8a78aa3a851c7c96ca25bf7ca3dcf3ca21453d0dfd3323d5a422dec84316102f684c359f226bb53779c0b9950939281ef79a58c011993eace085497afa4daf64c9687b0a11aa116cfa7b03936241a5567b646e7e42e9fb592405b8fa3c0a821fc3121b45b1753cec9a83947d211a45499bd63790b87f01472fe566d87696efedbb74ed00048c384ba7f027b3aa4298dc4110349fedf52a96cd05d08bd635771ed4510738d8f07a6021244d1903579a3ea739", "signed": "98b0c6313cecaf7c82cbdeb3d0280641c61a060f65e563aa93ce18300a9b58272dc8680b485e8cd11cf80fdca868fab365378384a142727f2f844f87cfdf19054cac1b1f4bd48284dcc9afc8b5955b64b436db704b0335d9755cc1f97477f8d323cb6410ef146ab8a9efb9526d8b62e3bbad1f7295f47ba9f0de958f8ec9b77ab42232437ed974856444cd22e20be35e91813bff4b016f810d0f61d89f6b614db33f34bd09985b593fe3e06e065b7bc6cd39d55c2cfbec7b6d59c0b37dd1d0d35135ab1d1b04f2f30c2f04f4ba2b36582738081cf59190f528363db944ed612931d1d514c6214f9ab92abb1833926183ac52fba2a4551e20e4c0ac959a49ddb167a381e0241d40c086e90e52aca017258975dbab2ba451ee539a718f076a58709c6697418d9c6f13e4d391368bf0e8bd8f2932dd95ceaf7aaca1241147d341a3acd08dc32905483572b89a80cc47231468ab8de359dd525a6257cf196c2ecb82fa8a78aa3a851c7c96ca25bf7ca3dcf3ca21453d0dfd3323d5a422dec84316102f684c359f226bb53779c0b9950939281ef79a58c011993eace085497afa4daf64c9687b0a11aa116cfa7b03936241a5567b646e7e42e9fb592405b8fa3c0a821fc3121b45b1753cec9a83947d211a45499bd63790b87f01472fe566d87696efedbb74ed00048c384ba7f027b3aa4298dc4110349fedf52a96cd05d08bd635771ed4510738d8f07a6021244d1903579a3ea739", "signature": "98b0c6313cecaf7c82cbdeb3d0280641c61a060f65e563aa93ce18300a9b58272dc8680b485e8cd11cf80fdca868fab365378384a142727f2f844f87cfdf1905" }, { "secret_key": "c85913a6877877131001623ccda9cdc12b9d4043b8a83793c44696632cd6421c", "public_key": "9cc67c6948f7bf6e556d0849d3b8d203457a7b61549b36681d754f1dc0841e96", "message": "91b5009e83d0f6103399c2d3feec0084973a305bf4176ec782537560472db187a11b4dcb4b2ffb7f0644feb394b28e5bfe97247c4a4a231cf6e916bf99344ccda88a7f5d831d6de3d563dd102eaeb108c5bdce44e0632d17e6fa55b18067df2fa8d200a9869f6aff920c51d46a1ced2d903b1d9b6b075facbf91cd05eb41ad811a8ef40d9118261012c72b8979f15153dbb8561293da9f8b77c8ff14f75387536f0036d1713a72ce8c35b1062f2c6732aebf32936799b51c2cbcd6572413e7dfaab8641a02c150237381cf7a14e22c74c6c20009de7d3b7e69cd1b4584ac2c01babaf973c56b3814bb0089720e41968106cf26509d4aa546fcad5534af303ffca42b16ae6c93ee06bc3cace12e4ec718844bd30d2224cc486d106d1c456bfa165ea0120fab3df2c5ab3a523bbfa789deed44032ab0be86eb7cc09cdb7c07aa948dd5277c3df1d9d1843567dec84f9288e085b05ae4b8af2cea5d9a184d50bef85550c836613d5d3af5f9c2928e6a89660fa62719ebff773e46b77e34bc0470da4d2cdbc7071da758c4d39fe65201c88aaa8e6603d0bbe7c3e9b2d9e41b634682092f147341ad6d667f20c64e81a68d629467a54dd86e1ce12c560a6f9b64512d6f3886cbb9f37c37eb3985c8ac38dd6682f48fe1", "signed": "01fccfdb1fb6888b0310a913170f7e366816daebe7650d72513d9506e66f7d62208a49ece0af1871497f4541ef605bde711c9e0a1205ef48f26c03dc1ad4af0391b5009e83d0f6103399c2d3feec0084973a305bf4176ec782537560472db187a11b4dcb4b2ffb7f0644feb394b28e5bfe97247c4a4a231cf6e916bf99344ccda88a7f5d831d6de3d563dd102eaeb108c5bdce44e0632d17e6fa55b18067df2fa8d200a9869f6aff920c51d46a1ced2d903b1d9b6b075facbf91cd05eb41ad811a8ef40d9118261012c72b8979f15153dbb8561293da9f8b77c8ff14f75387536f0036d1713a72ce8c35b1062f2c6732aebf32936799b51c2cbcd6572413e7dfaab8641a02c150237381cf7a14e22c74c6c20009de7d3b7e69cd1b4584ac2c01babaf973c56b3814bb0089720e41968106cf26509d4aa546fcad5534af303ffca42b16ae6c93ee06bc3cace12e4ec718844bd30d2224cc486d106d1c456bfa165ea0120fab3df2c5ab3a523bbfa789deed44032ab0be86eb7cc09cdb7c07aa948dd5277c3df1d9d1843567dec84f9288e085b05ae4b8af2cea5d9a184d50bef85550c836613d5d3af5f9c2928e6a89660fa62719ebff773e46b77e34bc0470da4d2cdbc7071da758c4d39fe65201c88aaa8e6603d0bbe7c3e9b2d9e41b634682092f147341ad6d667f20c64e81a68d629467a54dd86e1ce12c560a6f9b64512d6f3886cbb9f37c37eb3985c8ac38dd6682f48fe1", "signature": "01fccfdb1fb6888b0310a913170f7e366816daebe7650d72513d9506e66f7d62208a49ece0af1871497f4541ef605bde711c9e0a1205ef48f26c03dc1ad4af03" }, { "secret_key": "fa1e11dc8364208d8e1cb66a361be7e84c5e368166587d4fdb06aced7f62e17c", "public_key": "4d8e6f4b3415df6cedabfb295c1984fd419923c6ac41764e32d22daf372c50fc", "message": "294e63bacccb801bbf04c1f19d0aee16f5650a6e8eea6fe41110663ec01532bd4960a527f15eca4af2f4e6b7b0fc340cf97aa234e92cf7d69d50e4009c2496e3ed4d9aff000f9e185275b817d26a0bab69b7f7ee1ea30daec8bcee387ae46b4b299c27bdc06eea63f24dbee955a6c0969037eef91c34321e3c5c972fde993183b7d23f6e019c3e0cac7589ae4a1521af87ea42df8c22c2270ec23d6d140f9cf6d4d52fac1b9d6c8939ef8131cb62a035c5261538bcdfd6db419a55ef9fe5d7a5ac44579de700858d74a3434844f28342c565892722e27f407d7f17b74a5934be915b20c2400643235f8ab5795f324e33c50644a04033542cb3816d770fa899e7311c14301c1bd0f5aa60a2eb3165680c720e1efa8096fc25d2779275f1842b2db53b4da0ad3e59c07540c28460cec1fdd3cdb7a3478b91a9caf9ac891cdf3aeaeeca9a9656ac1307259922fca74c5cc69f7e25c6bf587973a4b7d3e3ac0635b0db22a0093a79076881c71736ee1d4d45f8ed2d29a0671a64e6ca2f7a5ef404b1edeb842034f571b699bc59e5a37df02054e8482bf1e7b77d8e8397da15d89d7355a5dce86b1683a9ac4e406c08a94a6eb00e5ae16d96722972e5c50c7bee4a84d0697bbe67ceb7ef295f06aaea5abba44466be0f67", "signed": "e857db087e28d6750bf54e53797251d8439989576c12da2d9c811a14877c3bd46c4efab861a10eebe7da04c0b0b445c7a390a50c13de36f3a3c7ae0157022c0e294e63bacccb801bbf04c1f19d0aee16f5650a6e8eea6fe41110663ec01532bd4960a527f15eca4af2f4e6b7b0fc340cf97aa234e92cf7d69d50e4009c2496e3ed4d9aff000f9e185275b817d26a0bab69b7f7ee1ea30daec8bcee387ae46b4b299c27bdc06eea63f24dbee955a6c0969037eef91c34321e3c5c972fde993183b7d23f6e019c3e0cac7589ae4a1521af87ea42df8c22c2270ec23d6d140f9cf6d4d52fac1b9d6c8939ef8131cb62a035c5261538bcdfd6db419a55ef9fe5d7a5ac44579de700858d74a3434844f28342c565892722e27f407d7f17b74a5934be915b20c2400643235f8ab5795f324e33c50644a04033542cb3816d770fa899e7311c14301c1bd0f5aa60a2eb3165680c720e1efa8096fc25d2779275f1842b2db53b4da0ad3e59c07540c28460cec1fdd3cdb7a3478b91a9caf9ac891cdf3aeaeeca9a9656ac1307259922fca74c5cc69f7e25c6bf587973a4b7d3e3ac0635b0db22a0093a79076881c71736ee1d4d45f8ed2d29a0671a64e6ca2f7a5ef404b1edeb842034f571b699bc59e5a37df02054e8482bf1e7b77d8e8397da15d89d7355a5dce86b1683a9ac4e406c08a94a6eb00e5ae16d96722972e5c50c7bee4a84d0697bbe67ceb7ef295f06aaea5abba44466be0f67", "signature": "e857db087e28d6750bf54e53797251d8439989576c12da2d9c811a14877c3bd46c4efab861a10eebe7da04c0b0b445c7a390a50c13de36f3a3c7ae0157022c0e" }, { "secret_key": "24a914ceb499e375e5c66777c1ed2043be56549d5e502a844710364042ba9acb", "public_key": "20d21ee764b1f35f94568200d63bd5828aca8c5d3e9047d23f478b925295fa2e", "message": "3ff9f66fa2646ec66a1bf933c2b4cc0fbf912b4d6db50534257f97d01e698d05485747de2544e9f5a4a4a075388cf4400ab89b0353ce86198202db3a903767b879a2af9daa155843111af15a2bc35efe41bcc92c8207e00113b04f1303007949ffb6ce8df4b0b34248fedf5d9cb2cee94b812ed58ece2a0ce0454cf14c20e49e09fe664d6e25762e87895932cd5cd32eb6a3abb38ee163078c133e93588791dbf6af499a31ea4453bbcc7a85e406c9848a664052f11113fbb4ffa760dee4c261e396942491119da29a33582f821d4125e0b4162f28beb066031a652d05749aa7244dd4f3d3bb15d268328d6a02fce2501815257f8ad5af4ecbe7cb8ae9661e344f9072318791f3e859091121e08aefca8982eaaf66259d9de4f46a31e716dc033d0f95d1fa936b6c6079b137dd1158d1def113018c73f8ebb9807e0f7415404ea9c78544ace7ce463cd1d1c57e31f4091bc091804cbcddad0e15a40ca91acbe1c6224ed13cafb4df2c84ac9f0c3c9b546007d9dd6e524c467072563d4ac0d700cc1bf30febb334313dae5761745ec0a5e9e8815025958f00fa2e58060d7e9a5f2b727f48699f929c8459930892573f784fef5692518b5ca268e2a73ebead6ebdeb7ec24eac92aa7dcb41b598bd6eff3632d069726291", "signed": "3ae0cc7bca8d73be83a9b809b13338c12706aaef75c4d1a478178f9dc565514c7529e298043ea78d21a5a09dd04f10ae87441e5686a933c92c75548427ad3a033ff9f66fa2646ec66a1bf933c2b4cc0fbf912b4d6db50534257f97d01e698d05485747de2544e9f5a4a4a075388cf4400ab89b0353ce86198202db3a903767b879a2af9daa155843111af15a2bc35efe41bcc92c8207e00113b04f1303007949ffb6ce8df4b0b34248fedf5d9cb2cee94b812ed58ece2a0ce0454cf14c20e49e09fe664d6e25762e87895932cd5cd32eb6a3abb38ee163078c133e93588791dbf6af499a31ea4453bbcc7a85e406c9848a664052f11113fbb4ffa760dee4c261e396942491119da29a33582f821d4125e0b4162f28beb066031a652d05749aa7244dd4f3d3bb15d268328d6a02fce2501815257f8ad5af4ecbe7cb8ae9661e344f9072318791f3e859091121e08aefca8982eaaf66259d9de4f46a31e716dc033d0f95d1fa936b6c6079b137dd1158d1def113018c73f8ebb9807e0f7415404ea9c78544ace7ce463cd1d1c57e31f4091bc091804cbcddad0e15a40ca91acbe1c6224ed13cafb4df2c84ac9f0c3c9b546007d9dd6e524c467072563d4ac0d700cc1bf30febb334313dae5761745ec0a5e9e8815025958f00fa2e58060d7e9a5f2b727f48699f929c8459930892573f784fef5692518b5ca268e2a73ebead6ebdeb7ec24eac92aa7dcb41b598bd6eff3632d069726291", "signature": "3ae0cc7bca8d73be83a9b809b13338c12706aaef75c4d1a478178f9dc565514c7529e298043ea78d21a5a09dd04f10ae87441e5686a933c92c75548427ad3a03" }, { "secret_key": "5532e09b937ffd3d5f4c1d9f1ffcded26ee74d4da075264844690bd9c8613994", "public_key": "5093969f377bec3e35f59efda01ab4186c5d2a36740cf022675e01096b1a3f0a", "message": "add4d7a9ce3f63d1f946e8679065545d8c7bf0a2cc3a4c00b8f142f0945ae362c4c9462a7576a4059d57861662884bd80b96d90d279a952eda952d37d4f95cf0d70da98f4fbaca39e169f9d945d41f872397bbdd5701454303d77d31e86348271da40a1b8f1e57c36fcd803e14fa17716c5631efa01d3a795dc20b2bde36ab73ff6a2d533bc15cce22328713c3c9ccd072c3e450d7f22c0c9f94919752cbfe45ee655d1b53676593cdb448704102631caaa976952eaa1f6c2e876564e420f0c646a0f88365f76415b4085f60a338b29c51633e540f0bf32d4087e7d0fb685be88c7595dc531c99b489584560ad8234b18e39a107cf5d842dabd421e77d26ea5e0f1405ce35fe792714eb4ee1a8017648ac1ae739a33d7b1e089105d1e5add27a62ce64154570340af9eb14e7fdfc2f9a2c2fcfcdac3cc4227763f4d629497479f849216e5d90ec16dfa36b72517f7b5486baee7fda4450c352cffbbae73926c843224f8ce44b38dae53f3ead21890b52a7801075291684fd5910ed86ad33e8a007f6c3f85c16b209293740184f5890874d431cd4e0ea4087c49c3471d789c813c6dc9a78699363a1d87197d3b92c0286689311823f4df22ce8035e75732cdea7f5621f67db0e2a4ca6616193221c0aa3d6de50d85282ee", "signed": "d527ff0d4a219d61f418121206a54ae4985854a310482744486e4d130a7de97c319df8372c82828c936e6a8afd9c5de1828573d8261ae9365b8f237676182402add4d7a9ce3f63d1f946e8679065545d8c7bf0a2cc3a4c00b8f142f0945ae362c4c9462a7576a4059d57861662884bd80b96d90d279a952eda952d37d4f95cf0d70da98f4fbaca39e169f9d945d41f872397bbdd5701454303d77d31e86348271da40a1b8f1e57c36fcd803e14fa17716c5631efa01d3a795dc20b2bde36ab73ff6a2d533bc15cce22328713c3c9ccd072c3e450d7f22c0c9f94919752cbfe45ee655d1b53676593cdb448704102631caaa976952eaa1f6c2e876564e420f0c646a0f88365f76415b4085f60a338b29c51633e540f0bf32d4087e7d0fb685be88c7595dc531c99b489584560ad8234b18e39a107cf5d842dabd421e77d26ea5e0f1405ce35fe792714eb4ee1a8017648ac1ae739a33d7b1e089105d1e5add27a62ce64154570340af9eb14e7fdfc2f9a2c2fcfcdac3cc4227763f4d629497479f849216e5d90ec16dfa36b72517f7b5486baee7fda4450c352cffbbae73926c843224f8ce44b38dae53f3ead21890b52a7801075291684fd5910ed86ad33e8a007f6c3f85c16b209293740184f5890874d431cd4e0ea4087c49c3471d789c813c6dc9a78699363a1d87197d3b92c0286689311823f4df22ce8035e75732cdea7f5621f67db0e2a4ca6616193221c0aa3d6de50d85282ee", "signature": "d527ff0d4a219d61f418121206a54ae4985854a310482744486e4d130a7de97c319df8372c82828c936e6a8afd9c5de1828573d8261ae9365b8f237676182402" }, { "secret_key": "eb36511009d37a9c46c4d1374d0bbd0d9981e78cee7d188c5aab983ec239e10c", "public_key": "b1cc212b4521bbe7b19a7693878a558440eec36205d8439d040a46a9902fbf55", "message": "ba2466e56c1df77f22b6f0241fc7952ae9bc24756419a9446dd2b49e2cb9df594e5b6c77a95aa5fbd9dc57fec83962c7751eebb4ba218253f916a922a5139663e3203e3be482be379ca151c463d9ada21446135f356994fa5449f084478f5bb4f5ba6145c5158eb7b1c43c32ebea25e09c900f01ef91e92f88c03c76504ace9646016ffc2789559d0f3cc9d00fb61bdc6af7d3940f302e588e04f79f7b3d4b91a5d193a4f8222bfeb69bf0347d98ad81ef99d130ebc7b36b0783394eea92a38ddd5e7480d2add4e4def53eb99c449bff94e4718b09f2ea9b1f2b886594a95c33a69e0333154e440ab34b7b6c1134d8179b6f0c56251a9ad8e1b6b0f9b8a5c97081a7f8fd05d0b0affc82dbddc8b0c0ab7e833f300626d4b973b3f60feac55571e89cda0f2b441ed2faa669a70d556cb48f9b1d1cbce32ede5d166b1143e264b11ea327681cb559edd13c364bd2baf1fd54bb781807bd59c868b0e4795a779e67f0bd0d14b5a6b9e440b57a5823328b59affbd027eda7dd785079c5f02b5e32890b038730986a39a5a9834a3fed868b6f45cbdd28acb2709aff556263864f9ae1e757b3278c288dbe2932825712773e431f7c29329857fdaea798ed93920893631402e6b13bab62b4855461edb94620f2d1751865f445c466", "signed": "9f583724de552eae82f254ac6e2ed483ec1a07346266735c490920690c1e3fb2a9e9a34194ed6473733b300d4f23c9aec0da5a2022054ca43885a15a2984320eba2466e56c1df77f22b6f0241fc7952ae9bc24756419a9446dd2b49e2cb9df594e5b6c77a95aa5fbd9dc57fec83962c7751eebb4ba218253f916a922a5139663e3203e3be482be379ca151c463d9ada21446135f356994fa5449f084478f5bb4f5ba6145c5158eb7b1c43c32ebea25e09c900f01ef91e92f88c03c76504ace9646016ffc2789559d0f3cc9d00fb61bdc6af7d3940f302e588e04f79f7b3d4b91a5d193a4f8222bfeb69bf0347d98ad81ef99d130ebc7b36b0783394eea92a38ddd5e7480d2add4e4def53eb99c449bff94e4718b09f2ea9b1f2b886594a95c33a69e0333154e440ab34b7b6c1134d8179b6f0c56251a9ad8e1b6b0f9b8a5c97081a7f8fd05d0b0affc82dbddc8b0c0ab7e833f300626d4b973b3f60feac55571e89cda0f2b441ed2faa669a70d556cb48f9b1d1cbce32ede5d166b1143e264b11ea327681cb559edd13c364bd2baf1fd54bb781807bd59c868b0e4795a779e67f0bd0d14b5a6b9e440b57a5823328b59affbd027eda7dd785079c5f02b5e32890b038730986a39a5a9834a3fed868b6f45cbdd28acb2709aff556263864f9ae1e757b3278c288dbe2932825712773e431f7c29329857fdaea798ed93920893631402e6b13bab62b4855461edb94620f2d1751865f445c466", "signature": "9f583724de552eae82f254ac6e2ed483ec1a07346266735c490920690c1e3fb2a9e9a34194ed6473733b300d4f23c9aec0da5a2022054ca43885a15a2984320e" }, { "secret_key": "7dbc81902e4eaab3077540f559995c387403cac306d486e959c5eb59e431c0a8", "public_key": "e03066139082f613448bdbc27fe53aa3f88994c31ddce002e36bbb2963df3ec8", "message": "dff798b1557b17085a0634371ded5ddf7a5acb996ef9035475e6826336f64ad8b84b882e30badec2b4a711998752f4a1574bc1f89d4325cf2b39861044dd03691e71d07768b5933a3052cc7c81d571a9de061dc19026c2f1e701f2dcf26a88d3401bc99fb81559dca76d8a31a92044a273587d622a08d1cce61c8f948a34ded1acb318881c9b49f6f37c30a65d495b02d5429e7ab4040d8bebeb78794ff736d1511031a6d67a22cdf341b980811c9d775fb19c6478f05ed98430103ea24c0f414d4cc07d860b72dc542ff22d83845a42f8ba45ca7ff3aab0b1e7de2b1094deac08d16eee01969f91bc16fec29ccc061c54db5345ba64842dacc99ee7729468d80a3f095583d8e8012408519d582cc3ff9a2eb7aebaa22db81ffc78ee90ef4ec589dcce87118dab31a6328e409ad5059a5132c82df3cefe2e4014e476f04c3a7018e45267ec5018ecd7bff1dda9267e90666b6b1417e89ddacb5085943befc7ad2f4df5f1ee0af9431aeeb6b24a5515b93dbcf68640f7daf8c961e567d7534900205c3df2184b6ac2da961c4c1d2bc49b4ea96b8154ffd4efffdc5e55a7119cb8af429e85105dffd41fe4a2ebba48168aa05fa7df27c4298735ff868f1496beb4b2ed0b8980c75ffd939ddd1a17e44a44fe3b02795339b08c8d", "signed": "5b7f652f08f229fda1b0bd759377b3fb726c1b9c9a10ef63426d352dd0869bd54d876c3092f1cd411c3757d3c6b6ea942aa70c3aaeb4217a4c7364d18e76e50fdff798b1557b17085a0634371ded5ddf7a5acb996ef9035475e6826336f64ad8b84b882e30badec2b4a711998752f4a1574bc1f89d4325cf2b39861044dd03691e71d07768b5933a3052cc7c81d571a9de061dc19026c2f1e701f2dcf26a88d3401bc99fb81559dca76d8a31a92044a273587d622a08d1cce61c8f948a34ded1acb318881c9b49f6f37c30a65d495b02d5429e7ab4040d8bebeb78794ff736d1511031a6d67a22cdf341b980811c9d775fb19c6478f05ed98430103ea24c0f414d4cc07d860b72dc542ff22d83845a42f8ba45ca7ff3aab0b1e7de2b1094deac08d16eee01969f91bc16fec29ccc061c54db5345ba64842dacc99ee7729468d80a3f095583d8e8012408519d582cc3ff9a2eb7aebaa22db81ffc78ee90ef4ec589dcce87118dab31a6328e409ad5059a5132c82df3cefe2e4014e476f04c3a7018e45267ec5018ecd7bff1dda9267e90666b6b1417e89ddacb5085943befc7ad2f4df5f1ee0af9431aeeb6b24a5515b93dbcf68640f7daf8c961e567d7534900205c3df2184b6ac2da961c4c1d2bc49b4ea96b8154ffd4efffdc5e55a7119cb8af429e85105dffd41fe4a2ebba48168aa05fa7df27c4298735ff868f1496beb4b2ed0b8980c75ffd939ddd1a17e44a44fe3b02795339b08c8d", "signature": "5b7f652f08f229fda1b0bd759377b3fb726c1b9c9a10ef63426d352dd0869bd54d876c3092f1cd411c3757d3c6b6ea942aa70c3aaeb4217a4c7364d18e76e50f" }, { "secret_key": "91b095c8a999e03f3ed749cd9f2faacc0076c3b477a87ab5ccd6631738767446", "public_key": "dad174d359daecca9c6b389ba096452ab5ca91e6383c6d042a284ece16ba97b6", "message": "9b0d8b00299852d68bbf497fe603961a485466a99a5484005db73d4e4bad814e8574efd54d648bd5c91ae8483c54b2f998b02e1abd6f401a25526843a5f2a23a97bd589d1f7e1ab14915b1e359a396d352c360ae6584325ae4bb7d624f61255c5c7bf0a67acab46c3b57b34534c0ee8431d260576606cbd84d8d1839e73da6fe4b0b8b78f0f958827c2f1d93ba7a346dcc75cb563dffde26f997598e8b5c2f1617c6fefc9be4b28b5401b0006413a251690d1203aaae4f6d8a3fb21f24009ab3bff13737a8a7e6646c02732d9ec5a4a510469e2d299e4cc1ad6480a482aa956f89ddcccc64a136fb15b876b6ecd88c7c86a4dfc60e666207c604167d163440ca9ab9cf87a5e0f7bbc5517de4dee876c037f8cc9d959c8ff5dbe944ff54cd91a771e29231f8b5f17d61de904c955fe2025dc52ed480fb3cc90f232459c607ef7e2adb52c7482becd67ad2149a4128f984038b58aa90176782393604aac74c18209a3d6a78630c01955a7cece5da8384da3baf63aa2ddf5963fae05ba3b81c6a03d86a00ef78edb4184fdc89b1d6bfeb310fd1b5fcce1e219524a3cfb2e972577f06b1dddeba00865dae4979000c008ad99f3b638cceb8e8c7a0f998d34d92143d81c0e1c096a925ceba65c43003ee18d494d003e9c61f77d65759", "signed": "64ee9efdb0c2601a835f418520641e436c7dd47c333d9fc30cfbb9e390fe764530654708b40b03581899a9ac870efd766ffbb4637152f8ff277964fe354252099b0d8b00299852d68bbf497fe603961a485466a99a5484005db73d4e4bad814e8574efd54d648bd5c91ae8483c54b2f998b02e1abd6f401a25526843a5f2a23a97bd589d1f7e1ab14915b1e359a396d352c360ae6584325ae4bb7d624f61255c5c7bf0a67acab46c3b57b34534c0ee8431d260576606cbd84d8d1839e73da6fe4b0b8b78f0f958827c2f1d93ba7a346dcc75cb563dffde26f997598e8b5c2f1617c6fefc9be4b28b5401b0006413a251690d1203aaae4f6d8a3fb21f24009ab3bff13737a8a7e6646c02732d9ec5a4a510469e2d299e4cc1ad6480a482aa956f89ddcccc64a136fb15b876b6ecd88c7c86a4dfc60e666207c604167d163440ca9ab9cf87a5e0f7bbc5517de4dee876c037f8cc9d959c8ff5dbe944ff54cd91a771e29231f8b5f17d61de904c955fe2025dc52ed480fb3cc90f232459c607ef7e2adb52c7482becd67ad2149a4128f984038b58aa90176782393604aac74c18209a3d6a78630c01955a7cece5da8384da3baf63aa2ddf5963fae05ba3b81c6a03d86a00ef78edb4184fdc89b1d6bfeb310fd1b5fcce1e219524a3cfb2e972577f06b1dddeba00865dae4979000c008ad99f3b638cceb8e8c7a0f998d34d92143d81c0e1c096a925ceba65c43003ee18d494d003e9c61f77d65759", "signature": "64ee9efdb0c2601a835f418520641e436c7dd47c333d9fc30cfbb9e390fe764530654708b40b03581899a9ac870efd766ffbb4637152f8ff277964fe35425209" }, { "secret_key": "8c568b310ace7d1f0edecefd603a884000544c792565d481c3d3e06e2d82ca96", "public_key": "5fa6e267c766736841411072d1983d1900acf01d48c3ce11770b26f78da979f7", "message": "b59f5fe9bb4ecff9289594721f2647047b0da5e0e4941bbe57c5b722b476723f0ac5970b4111f893bcaa411f28fceb4f585a2a7187018a904b70ef8fe1f6569a54d00ada37b69cb5e9c9d26c16a903518148e04a1b936a32329c94ee1a8fb6b591892c3aff00bf6e44dd0a762babe89d7060c17b90390d23bf9d360a293b8308383086916e1182b1ba4336f001b8d20deae9a029f7e85397a9ae5cf3ca10c7f3875588b8ffabb063c00ca26f580f69edc527a1accf4f41397b33766bcf6d55eb8de081a48c981d05c066617b80d8f6f5e60e59dd9b930bc4d04586403bb868df75933bdd86230e447036c175a10de9bb39953dcb1966a1f11912078e358f48c5b209a636c7f783f4d36a93ad2cc2e3244519078e99de1d5158b3961e0fc5a4f260c25f45f5e8585e601db08ba058d2909a1bf4995f4813460d369503c6873685ebcd3330a130b75f2365fb2a5a34ea63d958a2a867e90552d2cec8c390084be0c108b0fd2d83cb9284db5b842cbb5d0c3f6f1e2603c9c30c0f6a9b118e1a143a15e319fd1b607152b7cc0547497954c1f729199d0b23e53865403b0ad680e9b45369a6aa38d6685abd397f07fbca40627ecaf8d8d30133a6d9d5af009192751c9c45f77c0bc011268800bf552512730e69973c5bf362ab164894bf", "signed": "debdd8e5d3112fd77b394aa0e36e9426bac91df126fa9c317cea7c9d45957cdd96a45ae3ad760413ee1205afd71a29f9c3cb586cd2d7cd1e93bc1652fc34dc04b59f5fe9bb4ecff9289594721f2647047b0da5e0e4941bbe57c5b722b476723f0ac5970b4111f893bcaa411f28fceb4f585a2a7187018a904b70ef8fe1f6569a54d00ada37b69cb5e9c9d26c16a903518148e04a1b936a32329c94ee1a8fb6b591892c3aff00bf6e44dd0a762babe89d7060c17b90390d23bf9d360a293b8308383086916e1182b1ba4336f001b8d20deae9a029f7e85397a9ae5cf3ca10c7f3875588b8ffabb063c00ca26f580f69edc527a1accf4f41397b33766bcf6d55eb8de081a48c981d05c066617b80d8f6f5e60e59dd9b930bc4d04586403bb868df75933bdd86230e447036c175a10de9bb39953dcb1966a1f11912078e358f48c5b209a636c7f783f4d36a93ad2cc2e3244519078e99de1d5158b3961e0fc5a4f260c25f45f5e8585e601db08ba058d2909a1bf4995f4813460d369503c6873685ebcd3330a130b75f2365fb2a5a34ea63d958a2a867e90552d2cec8c390084be0c108b0fd2d83cb9284db5b842cbb5d0c3f6f1e2603c9c30c0f6a9b118e1a143a15e319fd1b607152b7cc0547497954c1f729199d0b23e53865403b0ad680e9b45369a6aa38d6685abd397f07fbca40627ecaf8d8d30133a6d9d5af009192751c9c45f77c0bc011268800bf552512730e69973c5bf362ab164894bf", "signature": "debdd8e5d3112fd77b394aa0e36e9426bac91df126fa9c317cea7c9d45957cdd96a45ae3ad760413ee1205afd71a29f9c3cb586cd2d7cd1e93bc1652fc34dc04" }, { "secret_key": "3d09afcee3c432fdfb6bdcead54e3da5b1b4165c50d6d310b7fad787b444d680", "public_key": "b0d9028c4d1487d293ed585a76bc94fffbafe2c65d980c494e141e4810a35cb9", "message": "767165caae0e578f16537e1750be7de87a789a51ff2de11838f564e2580b2391362d2868a5a4708af15d2e2db7b9be39c16adcc1200b34e6b4d4027ddffc1a2a3595e29e855ec5261b20bd55c428b01309badb59e2ca3edb967fc2f4bac0729ddf54fb6c20057bdda9e7af7cbfc092fba865fd3275b9d3bcb0c346b951d170ac9aa650a86df49855d48a1b37ce56c9f27389f5c8b15f5c2c900c4f107c064f603e4f867ef2e9c10a1b74210e6b89bb011793aa85ded43b51b749ba7f70287b6bc1b89434db8b8c8b5d73b214b41e36b528005bfbfe002e21b1006fb9d24babd72106d093e3c7093b3138aea719d69479084647498cd6c9bbb744509cd7da8dd61a627100f03c21e750acb3fcf4631d7c0f618154d2e5fa6656fb76f74c24795047bbce4579eb110643fa98e1f776ca76d7a2b7b7b8678173c773f4be7e182fd24dd76291ac67d9f26a28c5e3cb025c6813a378b383224642b4aefad0c76a6579517b8f360797dd22613ee682b179381950fb71609a5fb5494d2d57dcb00f26d1e72956f4d6672830e05c01b3779677c07ea00953c6b8f0dc204c8dbdccb381bc01b89c5c261db189ab1f54e46bc3edc4de5ad4f0eb29c0a120e437cd8f37ac67d48c7f0e730278708f02b54aee62b72952bc1c0eb437ca8bd5655437", "signed": "89739fe441ca0ced08a6eb5796e9bdda0e74fb473528fd4907edb659aab44d3343229046716368faf88e85c1644af66ff2dcaf0b17ac93ca13819f3f241dd300767165caae0e578f16537e1750be7de87a789a51ff2de11838f564e2580b2391362d2868a5a4708af15d2e2db7b9be39c16adcc1200b34e6b4d4027ddffc1a2a3595e29e855ec5261b20bd55c428b01309badb59e2ca3edb967fc2f4bac0729ddf54fb6c20057bdda9e7af7cbfc092fba865fd3275b9d3bcb0c346b951d170ac9aa650a86df49855d48a1b37ce56c9f27389f5c8b15f5c2c900c4f107c064f603e4f867ef2e9c10a1b74210e6b89bb011793aa85ded43b51b749ba7f70287b6bc1b89434db8b8c8b5d73b214b41e36b528005bfbfe002e21b1006fb9d24babd72106d093e3c7093b3138aea719d69479084647498cd6c9bbb744509cd7da8dd61a627100f03c21e750acb3fcf4631d7c0f618154d2e5fa6656fb76f74c24795047bbce4579eb110643fa98e1f776ca76d7a2b7b7b8678173c773f4be7e182fd24dd76291ac67d9f26a28c5e3cb025c6813a378b383224642b4aefad0c76a6579517b8f360797dd22613ee682b179381950fb71609a5fb5494d2d57dcb00f26d1e72956f4d6672830e05c01b3779677c07ea00953c6b8f0dc204c8dbdccb381bc01b89c5c261db189ab1f54e46bc3edc4de5ad4f0eb29c0a120e437cd8f37ac67d48c7f0e730278708f02b54aee62b72952bc1c0eb437ca8bd5655437", "signature": "89739fe441ca0ced08a6eb5796e9bdda0e74fb473528fd4907edb659aab44d3343229046716368faf88e85c1644af66ff2dcaf0b17ac93ca13819f3f241dd300" }, { "secret_key": "41c1a2df9369cdc927164aa5adf7757136abe51395604266334cc5460ad5683e", "public_key": "40557834cce8e043580a4272a8804d4f926e88cb10d1df0c5e28b9b67e1b63da", "message": "b64b14ba77d239e6f81abe060accef85f0442b650c44015efc43a0aa2ba10bf48d3018b1953ddfffbcda5bf3bbe0b6b3e4b0d9a32c6b725bbb231e0a2704471ee8bc1d594f5c54226f5dd9dfa163cfc1452c61f93e4f8139ab4ce4476f07ec933661eae91b6d500bf508ac63e4baaf1ffc8f0007d802e005f1b4fc1c88bee4d5e9e76384f5a7043bd660cce71f3b67f01f6ab844298531aac73a39d045370088855005a09c6d04238ea478dfacad1e6b22b2be4c46b0d59b1eba1f060bf7da5d1566cf1fdb5c543a33926af63f01a0db86e1a6711c473dc795ab283c8d93facfb5701fa2f2f6bb99f9b7e3749b071d58607be44a7089bcb503ec1495b5feedb399961fd3677d7493eaa3b3e9cc5e3642f40d47de9bfee7c20b0e519c4eb4a40f4da446ed6ac7aaca053e759c97dabe0a8ec2f58e7f2f9b2072762f9f794a6a4e36060b8872bd2c18d06a85c2c141a78293773ee8cfbf154b9930cd39da31b497e737a7750c90a13f5aaa147cd0dc4311f2e34941252ef198b0c1f50827e56c9f16f595aced6d2a69346531495a6499774d360766ca9be5ed8881c0db26ed7c5e6ff3a4f9b73cd8b654640dc96bf43bd426a0f28c9b25fa704d62ff0288fcceffaaebd3ea3097bcbbd778420ebc520a417730a1b5b3b8c96cda9f4e177d", "signed": "b8b2752a097196c289849d78f811d9a62fc767278f0c46628b521f62ed2759d74462a175da22403f15020445cae06da3ed61cca6203b7006362a0e198963d20eb64b14ba77d239e6f81abe060accef85f0442b650c44015efc43a0aa2ba10bf48d3018b1953ddfffbcda5bf3bbe0b6b3e4b0d9a32c6b725bbb231e0a2704471ee8bc1d594f5c54226f5dd9dfa163cfc1452c61f93e4f8139ab4ce4476f07ec933661eae91b6d500bf508ac63e4baaf1ffc8f0007d802e005f1b4fc1c88bee4d5e9e76384f5a7043bd660cce71f3b67f01f6ab844298531aac73a39d045370088855005a09c6d04238ea478dfacad1e6b22b2be4c46b0d59b1eba1f060bf7da5d1566cf1fdb5c543a33926af63f01a0db86e1a6711c473dc795ab283c8d93facfb5701fa2f2f6bb99f9b7e3749b071d58607be44a7089bcb503ec1495b5feedb399961fd3677d7493eaa3b3e9cc5e3642f40d47de9bfee7c20b0e519c4eb4a40f4da446ed6ac7aaca053e759c97dabe0a8ec2f58e7f2f9b2072762f9f794a6a4e36060b8872bd2c18d06a85c2c141a78293773ee8cfbf154b9930cd39da31b497e737a7750c90a13f5aaa147cd0dc4311f2e34941252ef198b0c1f50827e56c9f16f595aced6d2a69346531495a6499774d360766ca9be5ed8881c0db26ed7c5e6ff3a4f9b73cd8b654640dc96bf43bd426a0f28c9b25fa704d62ff0288fcceffaaebd3ea3097bcbbd778420ebc520a417730a1b5b3b8c96cda9f4e177d", "signature": "b8b2752a097196c289849d78f811d9a62fc767278f0c46628b521f62ed2759d74462a175da22403f15020445cae06da3ed61cca6203b7006362a0e198963d20e" }, { "secret_key": "a00611489467122c4c164bfb6a616e6a619b9f83c4367206b85d3fbec38cd62c", "public_key": "57ab58babb41dc0da0bcd506059aac9f46eca91cd35a61f1ba049a9ac227f3d9", "message": "34db02ed7512bf8c67d359e7203a2ea441e20e729766c15aa00fa249a3518fc29ef8905aa5b4670958c6a460d77b3a80efcb473859bbaff862223eee52fe58acfd3315f150f3c6c27ff48fca76552f98f6585b5e793308bf5976bad6ee327b4a7a313214b9ae04b9651b63cd8d9f5b3bec689e0fd000dd501770dd0e99b8f99eafa09c396a245a4a96e56896a29b24190b1ef11063f39b63ee3a586b07627dd3500c4e170b835dc0ec236fa5a35c44184707565c4a50662d8dbccfff7f9a7a68d021b4af64d532b7c3d2747418c2d717bb6aca6b58747ae4dd5641d826f79a8a315c38211a538a929e5b451f623f4fcbbcacdb86c8752ea13a617ab414ab653eb2e68d5420df7c6df92438168dcf9c066581dfe7b2c468194a23707de4659bd67eb634ff024741c5fc8698fd4dc41fe5dfc6299b7a08e6ffca37109c0210c8f94ea2d3ddc977ffc0b3794fe6ba4337c7aab434a68ac665484ea8243a84b79aa181ee6ab5aa37a32d879725edc018f8552181816d7d272ca8818a7b92e6ee4454d1f7828dd8afba1a790364b4ff28d84e028597353ebbef24837bc319e1ae8f2b0b6a851b489c3e170eef53e065f7032653cd6b46d8e57e4e111b789ba950c4230aba35e569e06615403407bce0369aaab4eafaef0cae109ac4cb838fb6c1", "signed": "c771ba0a3d3c4a7b064bd51ad05c9ff27fd326610fbfa09183039e5edf35472dded8fc2275bbcc5df1bf129860c01a2c1311da602fbaffc8b79c249c9cc9550234db02ed7512bf8c67d359e7203a2ea441e20e729766c15aa00fa249a3518fc29ef8905aa5b4670958c6a460d77b3a80efcb473859bbaff862223eee52fe58acfd3315f150f3c6c27ff48fca76552f98f6585b5e793308bf5976bad6ee327b4a7a313214b9ae04b9651b63cd8d9f5b3bec689e0fd000dd501770dd0e99b8f99eafa09c396a245a4a96e56896a29b24190b1ef11063f39b63ee3a586b07627dd3500c4e170b835dc0ec236fa5a35c44184707565c4a50662d8dbccfff7f9a7a68d021b4af64d532b7c3d2747418c2d717bb6aca6b58747ae4dd5641d826f79a8a315c38211a538a929e5b451f623f4fcbbcacdb86c8752ea13a617ab414ab653eb2e68d5420df7c6df92438168dcf9c066581dfe7b2c468194a23707de4659bd67eb634ff024741c5fc8698fd4dc41fe5dfc6299b7a08e6ffca37109c0210c8f94ea2d3ddc977ffc0b3794fe6ba4337c7aab434a68ac665484ea8243a84b79aa181ee6ab5aa37a32d879725edc018f8552181816d7d272ca8818a7b92e6ee4454d1f7828dd8afba1a790364b4ff28d84e028597353ebbef24837bc319e1ae8f2b0b6a851b489c3e170eef53e065f7032653cd6b46d8e57e4e111b789ba950c4230aba35e569e06615403407bce0369aaab4eafaef0cae109ac4cb838fb6c1", "signature": "c771ba0a3d3c4a7b064bd51ad05c9ff27fd326610fbfa09183039e5edf35472dded8fc2275bbcc5df1bf129860c01a2c1311da602fbaffc8b79c249c9cc95502" }, { "secret_key": "de1634f3460e02898db53298d6d3821c60853adee2d7f3e8edd8b0239a48cfaf", "public_key": "9dc1465b3383f37de00ea2d3c70f2c8fac815f0172029c3f579579c984a5895e", "message": "d10c3e4de7fa2989dba87537e00593d0eed4d75ee65846dab1498b4749d64f40e34b5911c5ce3b53a7e37d2d02bb0dae38ed962a4edc86c00207bee9a8e456eccae8bdf4d87a76746014201af6caffe10566f08d10daaf077160f011feaca25b9c1f6eca9fc53314a80547951754355525257d09a7fdad5bc321b72aa28d1e02d8696d4f9eb0ad3b2196f8bcfaeb1d6148287a3faefef91a7a3e0609c28ce59d0ca14d0b3050dd4f096b7bc2513988ba212128d5026daaa7188846db21c5c1d179ab9487c1a5bd346588127c20398d362d4c759cfab2a677750b9e45676a1e7e092ef02edbf278fb19a58e9bf6c9e996e24edad73f3ce31fa04b6d8533436bf80b4b2f805ed91e7fcda3bc2bab3b2bb157158af0ea8e3f0731dfad459d2e79b6d3715fe7bf1eafc5397593208857e57b7feb2f7387943a8e0913470c161aef4fe205d3637f23177ff26304a4f64eba3fe6f7f272d234a67206a388ddd0366e894eaa4bb05d73a475f1b34ca222bbce1685b1b56e034e43b3c40e81fff79682c19f32aa3f2a895c0709f9f74a4d59d3a49029ecfcb283082b067f1a0d9505750fd867321999484249efa725f52c94c7596206a911f3f505d63f0313254bd445f05be3996b58fe1819af87352e7f0a2ca320d9cc00a5fe77ad41640d50be8436", "signed": "d20506eb846923a0b16ff82fb2c3923b00c1b3bcc6e2f6482fba24807521e8e0223f692e62eac993f498f67102a04fd1acf9c7e3888d857c9a080b8af6361006d10c3e4de7fa2989dba87537e00593d0eed4d75ee65846dab1498b4749d64f40e34b5911c5ce3b53a7e37d2d02bb0dae38ed962a4edc86c00207bee9a8e456eccae8bdf4d87a76746014201af6caffe10566f08d10daaf077160f011feaca25b9c1f6eca9fc53314a80547951754355525257d09a7fdad5bc321b72aa28d1e02d8696d4f9eb0ad3b2196f8bcfaeb1d6148287a3faefef91a7a3e0609c28ce59d0ca14d0b3050dd4f096b7bc2513988ba212128d5026daaa7188846db21c5c1d179ab9487c1a5bd346588127c20398d362d4c759cfab2a677750b9e45676a1e7e092ef02edbf278fb19a58e9bf6c9e996e24edad73f3ce31fa04b6d8533436bf80b4b2f805ed91e7fcda3bc2bab3b2bb157158af0ea8e3f0731dfad459d2e79b6d3715fe7bf1eafc5397593208857e57b7feb2f7387943a8e0913470c161aef4fe205d3637f23177ff26304a4f64eba3fe6f7f272d234a67206a388ddd0366e894eaa4bb05d73a475f1b34ca222bbce1685b1b56e034e43b3c40e81fff79682c19f32aa3f2a895c0709f9f74a4d59d3a49029ecfcb283082b067f1a0d9505750fd867321999484249efa725f52c94c7596206a911f3f505d63f0313254bd445f05be3996b58fe1819af87352e7f0a2ca320d9cc00a5fe77ad41640d50be8436", "signature": "d20506eb846923a0b16ff82fb2c3923b00c1b3bcc6e2f6482fba24807521e8e0223f692e62eac993f498f67102a04fd1acf9c7e3888d857c9a080b8af6361006" }, { "secret_key": "c738ef5f0935281ba625fa4014d4a4d0be7e28fed779a9cf658e21dba43cebc1", "public_key": "95799faf706d195e544c76cafddf09d02d1beafc42c9d6c9ead4c1845587d39e", "message": "168d0bc5598be02f5443bfe7dfb8829985ca5d282af9cf1b1482602f243d486bd82ba039a0750909e9b3c7d4d5f8b8baf45718af0311854f4d1c7837f31d8ee68d3558e7e51e0c646a4a637596ee90057b01ed0a17daa3950b81ab47ae8b94c17d40746913c46ba1478bfca51b167628fc3ee1e22f2f19d6d8daf93df6540cedb7a859d1a2ba5911ba71766e8b7fce0c0e8663616d0180697d78ce3040d438131982f3f8112acca29ae53e539ff8c9ec4106d132f402018518308485f2aa6c9e8d1e62fed60cb249457db33c6fd1fe07445361f08194a2b5a057cb03cc754e5c7d4a7eea53a7f7d207cacca5e68cafa969a3521dbb810399a17f328ee767cf55926b2bd5f029549d3b464579c42655265398472e1c77cc8dd9aff187f7ac34dd456ace999a736ecca6d405d4922c779c600c47b84c9c1df5e5f8ed3b2811d351339113f8453cca4c4411688cb0388258ebbd1872b83610042249494ed560d4cda6a68455d957e806dd0bdd83004c4ca80774b8a0a1665866f17085014eadb3eae7382fa870deb29dd8c931b53019625740e28392f38575c0e2a9e504fc35bd95df56439a898230a2398cd2225c766ef36f12ae7e49b30a9c0aad469d5895bbf721cc0ff51d840c802d4a7eefba84fe5205a2c2f14011922dde561456f79e6161", "signed": "f44371e6c3391639d457ed14648184809411e80a3201f8811670e500fcad92f300aabf7fc68e440191e881d6c3474efd6d28f09dc44312fcfcb82701ba3c290a168d0bc5598be02f5443bfe7dfb8829985ca5d282af9cf1b1482602f243d486bd82ba039a0750909e9b3c7d4d5f8b8baf45718af0311854f4d1c7837f31d8ee68d3558e7e51e0c646a4a637596ee90057b01ed0a17daa3950b81ab47ae8b94c17d40746913c46ba1478bfca51b167628fc3ee1e22f2f19d6d8daf93df6540cedb7a859d1a2ba5911ba71766e8b7fce0c0e8663616d0180697d78ce3040d438131982f3f8112acca29ae53e539ff8c9ec4106d132f402018518308485f2aa6c9e8d1e62fed60cb249457db33c6fd1fe07445361f08194a2b5a057cb03cc754e5c7d4a7eea53a7f7d207cacca5e68cafa969a3521dbb810399a17f328ee767cf55926b2bd5f029549d3b464579c42655265398472e1c77cc8dd9aff187f7ac34dd456ace999a736ecca6d405d4922c779c600c47b84c9c1df5e5f8ed3b2811d351339113f8453cca4c4411688cb0388258ebbd1872b83610042249494ed560d4cda6a68455d957e806dd0bdd83004c4ca80774b8a0a1665866f17085014eadb3eae7382fa870deb29dd8c931b53019625740e28392f38575c0e2a9e504fc35bd95df56439a898230a2398cd2225c766ef36f12ae7e49b30a9c0aad469d5895bbf721cc0ff51d840c802d4a7eefba84fe5205a2c2f14011922dde561456f79e6161", "signature": "f44371e6c3391639d457ed14648184809411e80a3201f8811670e500fcad92f300aabf7fc68e440191e881d6c3474efd6d28f09dc44312fcfcb82701ba3c290a" }, { "secret_key": "5fea38739c61ca83bf7b4ad175a2117627b971a634a305a84fa57fecb8035624", "public_key": "ddd14b0fc06768d5104c50764bfd3b952352a34007c50d5ddd224ff51afcdf9c", "message": "1013c60a73953549e5ed105bdea150b91e60ec39200d43721304bfc8ec439d39609613c2d878044a9da01b26d86d6d65db93d91a137e9c4808a97d4ef286a903f3f1382cc6d1294216b9fafc013c86b9ff68b55a50ea3766e61dc1ce38348e91d62ce732c152d766b9335c68d6cad77be2b4a0cd50b9a1ec632ba55648a6e7e11a14c06853c02aec4809bd147a5ddd9fbc3be9f0c8158d84ab6795d771b42b1814a17a3c7a6ca0f4a8f7b3a0db1c73ba13b16400dfecbd03d216650e4d69704a707246444d5791fa273752f59cb5ae9fd416a5186613d66afdbd1ce691a87bd7d8b67190e9ac687062a080d2ec39fe76ed8335058251872839e85eb62f18ece187caba55b5f7d5edcade01cdc543cc677e50238b89c5635ad5c8fc220f5e0be1bc667d20989753a6d616fa69f8b12940b8ca9e2c48577132d8691b053779a152cbacff3b8b1bd7af692e56c73bbae4634776cfc213c99b9ae458df1befc8c877742664b0a0bb1f6915c8dae3b3f55dd75aba6a3bcc4176b4e3ba03d0c1c04c3c6408778b2b8e5a8a3eb52ed32a7428c00a98a589d8ca9390a210f4a7ac004fa1fe4c6da694f12276e320b41b0b59f75d264a396d450b631ab353f1612709e7a2e6a50d01cb110e53040546dd3b1e11d25732813aa76be5e81fcf7a5773f6815bbd", "signed": "f4e274823f2c396f3a329486aa6410c5ff19266f0770fd04fb14a7602d2b69a4a2b00928e9e1d92389f8033359ed6fb2146467aa154cba597dec6a84173f8d071013c60a73953549e5ed105bdea150b91e60ec39200d43721304bfc8ec439d39609613c2d878044a9da01b26d86d6d65db93d91a137e9c4808a97d4ef286a903f3f1382cc6d1294216b9fafc013c86b9ff68b55a50ea3766e61dc1ce38348e91d62ce732c152d766b9335c68d6cad77be2b4a0cd50b9a1ec632ba55648a6e7e11a14c06853c02aec4809bd147a5ddd9fbc3be9f0c8158d84ab6795d771b42b1814a17a3c7a6ca0f4a8f7b3a0db1c73ba13b16400dfecbd03d216650e4d69704a707246444d5791fa273752f59cb5ae9fd416a5186613d66afdbd1ce691a87bd7d8b67190e9ac687062a080d2ec39fe76ed8335058251872839e85eb62f18ece187caba55b5f7d5edcade01cdc543cc677e50238b89c5635ad5c8fc220f5e0be1bc667d20989753a6d616fa69f8b12940b8ca9e2c48577132d8691b053779a152cbacff3b8b1bd7af692e56c73bbae4634776cfc213c99b9ae458df1befc8c877742664b0a0bb1f6915c8dae3b3f55dd75aba6a3bcc4176b4e3ba03d0c1c04c3c6408778b2b8e5a8a3eb52ed32a7428c00a98a589d8ca9390a210f4a7ac004fa1fe4c6da694f12276e320b41b0b59f75d264a396d450b631ab353f1612709e7a2e6a50d01cb110e53040546dd3b1e11d25732813aa76be5e81fcf7a5773f6815bbd", "signature": "f4e274823f2c396f3a329486aa6410c5ff19266f0770fd04fb14a7602d2b69a4a2b00928e9e1d92389f8033359ed6fb2146467aa154cba597dec6a84173f8d07" }, { "secret_key": "60f9a14cce5d43fd9aab4ee8cc8379d575949152693bf29a6790b035e42a44de", "public_key": "bd4a70740d5acabe49f9a2152082fa2025330e6440437f1d047f313de490dca5", "message": "dd7f44f9eb728ab48de54ecde6b6184bd5ddd8707545a0129f2e905905b55d3e7fd57e28485d258148f6605e2377d5b267d2eaf4cd4b46e454962219868232b6f41f88a797f9cdd5c39ada51a641214fb9db2c2a9b5a5b16e303575318b625cca970b74348727902a1cf268bd16e107113161c8cbc99303c2b9f235541a7b31e433120feba14febe4bcb0f5b936c7edddd0ecfc72c8d38f64cdb6cfc2910bc29a521c50a51abcbc2aabf789de822cb04f5728fee153dd5501b2db59c59f50cab17c29216d66951019e145b36fd7e841bfbb0a328554b44dd7ef51468c3d5b7d3a1f7b9def58d8cf9d9bcafe92c86cf6d6119e98dba6f38ea57e322ddc9c2198d4bbc3b94ea1329db0d458e01c7081b33925a3e287f599a858c50c3a8f18cc2aa634df63e7f10e403adeab2f41db5578790c3b4f041a8b7a4f69cd6e06215df8201ae5b3e1d1d25a0a39bfc3d041a2f98213ef4141245792a76f06d4de25f6467a0e56f2f5cf69400d22117de7b46149554b70c75b9f99484a4f6f035ad3f10e3753cb14f4f398dcf6a64d10cf6c4fac07c91193cc0f54f0de58c6343e9caaa6b4f475ef91a59e083f9f211f5bc8e7e4516b45cf06bf50beb8fc4ab579d86d4a4190eeac748d06e0852c4b9ba8cfc50dd0a037a7bad7fad55af309a5f13d4c91ed3e0", "signed": "72f54bb8bdd17e9e422cd339631dd39f57355015d4cbd15acab7542efd784a321c1f6125764c0d154045b32e70dc2e03fbfe1117468ac3e73127b5fac8d42102dd7f44f9eb728ab48de54ecde6b6184bd5ddd8707545a0129f2e905905b55d3e7fd57e28485d258148f6605e2377d5b267d2eaf4cd4b46e454962219868232b6f41f88a797f9cdd5c39ada51a641214fb9db2c2a9b5a5b16e303575318b625cca970b74348727902a1cf268bd16e107113161c8cbc99303c2b9f235541a7b31e433120feba14febe4bcb0f5b936c7edddd0ecfc72c8d38f64cdb6cfc2910bc29a521c50a51abcbc2aabf789de822cb04f5728fee153dd5501b2db59c59f50cab17c29216d66951019e145b36fd7e841bfbb0a328554b44dd7ef51468c3d5b7d3a1f7b9def58d8cf9d9bcafe92c86cf6d6119e98dba6f38ea57e322ddc9c2198d4bbc3b94ea1329db0d458e01c7081b33925a3e287f599a858c50c3a8f18cc2aa634df63e7f10e403adeab2f41db5578790c3b4f041a8b7a4f69cd6e06215df8201ae5b3e1d1d25a0a39bfc3d041a2f98213ef4141245792a76f06d4de25f6467a0e56f2f5cf69400d22117de7b46149554b70c75b9f99484a4f6f035ad3f10e3753cb14f4f398dcf6a64d10cf6c4fac07c91193cc0f54f0de58c6343e9caaa6b4f475ef91a59e083f9f211f5bc8e7e4516b45cf06bf50beb8fc4ab579d86d4a4190eeac748d06e0852c4b9ba8cfc50dd0a037a7bad7fad55af309a5f13d4c91ed3e0", "signature": "72f54bb8bdd17e9e422cd339631dd39f57355015d4cbd15acab7542efd784a321c1f6125764c0d154045b32e70dc2e03fbfe1117468ac3e73127b5fac8d42102" }, { "secret_key": "a39053c5c58bf31d462b27a620b0b37b8052c6b1c4102b6145663aa15e978718", "public_key": "3642ac2a3280dce52ad8dfcfd3709436edc4e7e4ae1b452d9b220780b08679fa", "message": "f65540d3abeb1ee5ea987062c1b579516d3c29c39cbc6b09d60e18fe274c2befe0f5fe7dbd57c2d5835229bb754ec4341394765776d6a9178c4e6a312cd74bdbaca0e88270628cd84100f472b075f93692830122f00f9bd91ac582836c8bfa714aa48e977003556e1b696df328ef584f413f8ab614760699c4d147c3eea1da0435835c9bf7ad54606f0213eb74a1b476141506ae2cd124cd51d66e7e7e579560576305c5fbe8430be3ebebaacba3f9989dd7d199f5a455a50cdb3755037e1a70674a4fef40b4a3aaf7bd3c95b1ab41bb206211c3a1276d3e37d8a3a5c3d5d0f36ef5b4f3de26b7f20f6b2900716dcc22ab734ebaf1e8d00020e5f019551653b9c2f70a4038dfb2f12d25d6d84e79073a6548fe15e4828fe5de83ac3d8d98b7daf92710482c37f7bd2431a8114c6137657bb177882d8a3c76babf1c671a7055365fe90866167a2d1dbc870be83b3601f09d4a317ae254cac9f98dcc7aead9224cd9c9d8a200abc80a2dd108af28fd46ad7080ae741b50054b9b9a9201efb7838bc4c5c2cc3d76ba0fcc49c46e792c26292b7d0312aff955a9f8edf0c696a70a614f3553ad3869bfde48d26a4d367b6cec057e62a4e548554b48b53ecda790ba7a0ab2e3de587bdc22b02f5947634d73099f547db22ec1bbf82343f9a2ca38bce4eb59be", "signed": "f7383e966cb2309deedf860100183aaefac672ca16d5419cd6422ca70e16b3976f5f165afc2786117c868234ba1109ede031f8979b50e567358bd4f8bd958202f65540d3abeb1ee5ea987062c1b579516d3c29c39cbc6b09d60e18fe274c2befe0f5fe7dbd57c2d5835229bb754ec4341394765776d6a9178c4e6a312cd74bdbaca0e88270628cd84100f472b075f93692830122f00f9bd91ac582836c8bfa714aa48e977003556e1b696df328ef584f413f8ab614760699c4d147c3eea1da0435835c9bf7ad54606f0213eb74a1b476141506ae2cd124cd51d66e7e7e579560576305c5fbe8430be3ebebaacba3f9989dd7d199f5a455a50cdb3755037e1a70674a4fef40b4a3aaf7bd3c95b1ab41bb206211c3a1276d3e37d8a3a5c3d5d0f36ef5b4f3de26b7f20f6b2900716dcc22ab734ebaf1e8d00020e5f019551653b9c2f70a4038dfb2f12d25d6d84e79073a6548fe15e4828fe5de83ac3d8d98b7daf92710482c37f7bd2431a8114c6137657bb177882d8a3c76babf1c671a7055365fe90866167a2d1dbc870be83b3601f09d4a317ae254cac9f98dcc7aead9224cd9c9d8a200abc80a2dd108af28fd46ad7080ae741b50054b9b9a9201efb7838bc4c5c2cc3d76ba0fcc49c46e792c26292b7d0312aff955a9f8edf0c696a70a614f3553ad3869bfde48d26a4d367b6cec057e62a4e548554b48b53ecda790ba7a0ab2e3de587bdc22b02f5947634d73099f547db22ec1bbf82343f9a2ca38bce4eb59be", "signature": "f7383e966cb2309deedf860100183aaefac672ca16d5419cd6422ca70e16b3976f5f165afc2786117c868234ba1109ede031f8979b50e567358bd4f8bd958202" }, { "secret_key": "e0c29df4de45c47539e0896b3a59bc3de6b802fd14dbdc9f25e717ac82c328f3", "public_key": "a69002b0f5ef354ce3b2d6b8d8ba70ab778432b22f144dc9c2eb92d99d99dd2a", "message": "6a37cb4c749c583590c8d849bce3fa657f10009190cad9be41ede19bf2fdb3c562a6101f27bd37f223cab13ced245a1cedf852f551f857aad9727f62c967c0a921df116f48a80a6040b3c723ab5cb594c4507a3d20cd60514e22164a82b74f19dcfdd83c57bc3652375517414af5d18e0a64ccab36699768d07cf40b7063a83e43d5f607964b1bf0840a45ad50abf83dbc849f40e5b4cfb6a3347b29fec50774046a4b50041032aa4d567e8564b3eed1642040682dd8ae7d7179286cf6e1853dc87d27c3e9e60fa47cf8cb2da0181d53eec40614b07331a4fb7028086d0b1ce2e1115b73a162c527bdd7cab5335b863d108be047bdbca112cc6e776bb453c317314388bb9653efb4444bf5cf1ec8da23b711ba71796c0ae02ba1dcc838455078c3897f07e9e13b76e49274c2e207506b00a0b558883aa122b667db9d670508606a3f54320636cd19f973917fb1875f4363e220f1e12398cc6afd79094743338456813a5826ad3f1aba7cd7beab1fe183859c0cc9ef40a5eab912caf515a8d4c3b93d641b7ab3e76b16c12971ace88ff33e5a1ed9b44e45db8f3085dbf070b256b0d7512ee1069432603d73095db8749ca547963bd71a8a684ab8516b146c4187176386afdf6cb1368a3dd8fcb2cfff77056aaf7823f800b266acce72bf643c6d0c28f0ab", "signed": "bb3b8c5c27591fd8b9c5ba489d6b6ee5b0fb4a7b0de51f1639afc673d0e5f75e313aa7e1d0009081dbca7435b687ccd12f64f74a386e772b9e24781b925c8c0c6a37cb4c749c583590c8d849bce3fa657f10009190cad9be41ede19bf2fdb3c562a6101f27bd37f223cab13ced245a1cedf852f551f857aad9727f62c967c0a921df116f48a80a6040b3c723ab5cb594c4507a3d20cd60514e22164a82b74f19dcfdd83c57bc3652375517414af5d18e0a64ccab36699768d07cf40b7063a83e43d5f607964b1bf0840a45ad50abf83dbc849f40e5b4cfb6a3347b29fec50774046a4b50041032aa4d567e8564b3eed1642040682dd8ae7d7179286cf6e1853dc87d27c3e9e60fa47cf8cb2da0181d53eec40614b07331a4fb7028086d0b1ce2e1115b73a162c527bdd7cab5335b863d108be047bdbca112cc6e776bb453c317314388bb9653efb4444bf5cf1ec8da23b711ba71796c0ae02ba1dcc838455078c3897f07e9e13b76e49274c2e207506b00a0b558883aa122b667db9d670508606a3f54320636cd19f973917fb1875f4363e220f1e12398cc6afd79094743338456813a5826ad3f1aba7cd7beab1fe183859c0cc9ef40a5eab912caf515a8d4c3b93d641b7ab3e76b16c12971ace88ff33e5a1ed9b44e45db8f3085dbf070b256b0d7512ee1069432603d73095db8749ca547963bd71a8a684ab8516b146c4187176386afdf6cb1368a3dd8fcb2cfff77056aaf7823f800b266acce72bf643c6d0c28f0ab", "signature": "bb3b8c5c27591fd8b9c5ba489d6b6ee5b0fb4a7b0de51f1639afc673d0e5f75e313aa7e1d0009081dbca7435b687ccd12f64f74a386e772b9e24781b925c8c0c" }, { "secret_key": "198b5fd1c03827e0994ad5bfee9b5b7be9966c9c3a267e4d7430343767403c67", "public_key": "6682c6f1a866b49b2f8ee97f2e532fa91666bf38da1b4dd65543a1777794cbee", "message": "3fdaa15c46f25143db972079d7013c7f69a136f45f3f6ba2ced8b828468eb3daa6b50b4f8d3380fec64a0343be116f6f83b6ee64cc4c1b1d08d54fd42029e4285cfc6c6dd5cd181ab533ffcd411f23a1003da94ec9340e2ec71199d678540d5182e139ffcbc505a170b8f07f4a7e694ca92f58320c0a078564ce9de99b0fa8e66b0d822e467a5aeb83567996a48b89db25cade6457794e5414d67e9d4ab7cd6cc2058bb7a513abd709f4caf24bb67ce1c03ab62dbdfe309ec7db0fa3ea7aae8236f259b922d4536115a63bc89acb2051d09e731cbb0df157d9d345bd9109973c2b594f148efc6f3377de5163b7f69869ffef853eaefeb402e23529594fbd65ca05fe4062c529d8e321abc05200cac1e839e87b1fd3fdf021d68cbb3a4142b69cc3af6f632edd65b83f5aa4cb17da5b6ba3fc03edb17c2a3cb5b04836e7660e63c8a0483e243983371dfa9839f9164ad4da0d5953655e3a9518e136da745737c79243c355fc125cbdcc76aec92216846c4574f4f7f298bcde54fd2444ad3025955c100315de5a4e27c333a00284b2f702fdd3de22ac6c240dbc14bf71e62d131b62f2db992473f2f913f60c916ecf57df5f3f021fb330834395b79472caff19fcfa0a271795c76d69b4db3f85b8d2e5c3441965484dcc39aba59b701274f7fc425246856069", "signed": "f454f35b18538f877e5d614a76b5276a27fc0b433f215dc4e963b3f047694c780c515c6ef6fe2db4b009009bc2733aec4fd46e615357cc0bcc9f1f7fc21e3c023fdaa15c46f25143db972079d7013c7f69a136f45f3f6ba2ced8b828468eb3daa6b50b4f8d3380fec64a0343be116f6f83b6ee64cc4c1b1d08d54fd42029e4285cfc6c6dd5cd181ab533ffcd411f23a1003da94ec9340e2ec71199d678540d5182e139ffcbc505a170b8f07f4a7e694ca92f58320c0a078564ce9de99b0fa8e66b0d822e467a5aeb83567996a48b89db25cade6457794e5414d67e9d4ab7cd6cc2058bb7a513abd709f4caf24bb67ce1c03ab62dbdfe309ec7db0fa3ea7aae8236f259b922d4536115a63bc89acb2051d09e731cbb0df157d9d345bd9109973c2b594f148efc6f3377de5163b7f69869ffef853eaefeb402e23529594fbd65ca05fe4062c529d8e321abc05200cac1e839e87b1fd3fdf021d68cbb3a4142b69cc3af6f632edd65b83f5aa4cb17da5b6ba3fc03edb17c2a3cb5b04836e7660e63c8a0483e243983371dfa9839f9164ad4da0d5953655e3a9518e136da745737c79243c355fc125cbdcc76aec92216846c4574f4f7f298bcde54fd2444ad3025955c100315de5a4e27c333a00284b2f702fdd3de22ac6c240dbc14bf71e62d131b62f2db992473f2f913f60c916ecf57df5f3f021fb330834395b79472caff19fcfa0a271795c76d69b4db3f85b8d2e5c3441965484dcc39aba59b701274f7fc425246856069", "signature": "f454f35b18538f877e5d614a76b5276a27fc0b433f215dc4e963b3f047694c780c515c6ef6fe2db4b009009bc2733aec4fd46e615357cc0bcc9f1f7fc21e3c02" }, { "secret_key": "4392f7d4fbd68fe154e4ba38ad5207612a0648556056c39ac116ad468f89bd2d", "public_key": "cbeaef41acac02bf1f780ce934aabd631364b369567be1be28e3906f9db120fa", "message": "cf1709dc9a0867ee908721b136cb93a84229e83b46204777ca8194d08b7a3ca9c912eb243e5bdabfeed352349d20be801b722af0892238e72edf190e6361f57572781ad3c2590b197357641c805383baa1d4972f76c65448532c110834a0baa8f48863e166b706653708cd4057d3a4f9fcb2ceb4120001277d38c43847d822822b777c2bb4da4015a1c24d416d5062a8718491d855aaa5dbf5579c164d8e524a9f2fa3f22eb09861ffe6ad659fe36eb40431222c22d7137a6cabca8db786e39d81f661afde4e39589b4db4d3c51ca53590a14e115d0afc3a877b839a9638bece80c32c19e51b7532024845f76cfe9bfb2ac05130f6758bf7fe993aa93aa272e4e6bd0c75c14099d43e652a223e5bcd64c362d4b8f4b95e016f9350c7fa74e653525d08011558b2c6e9bf4fdf9dbd5ef9b09bbc846afc2bcbc86c4ccc315f6d1ccd489b0cf8ed0d93f2f532a426265c590ba3a59023347d819d9b281ef85310b05316d46c8a8c0365d068a8708664ea4d77ac0cd150a65a56586babd34b74365bb8fe3e6187262284d64432e4c81ea4c0e57c1d71ae980c7f4d1d871032e188bbf9d1758cdc1dff989f2d1288fef4e205e99e7cbf2cc324b8c93046f476c59d3d0a59db6fe37382dc79c5ec16056ab3934a52f7d2880d0471a377b6a8ae84d56ac22d1d54551c", "signed": "86e7ccf06e79362d40cdb7fb75a98978bbd334a1db7590367d60849bd53e2fb1a4bdae590d1f47b5490d8702e7c1a87268b8ee9db612de7bdc2e38fa6deb7e05cf1709dc9a0867ee908721b136cb93a84229e83b46204777ca8194d08b7a3ca9c912eb243e5bdabfeed352349d20be801b722af0892238e72edf190e6361f57572781ad3c2590b197357641c805383baa1d4972f76c65448532c110834a0baa8f48863e166b706653708cd4057d3a4f9fcb2ceb4120001277d38c43847d822822b777c2bb4da4015a1c24d416d5062a8718491d855aaa5dbf5579c164d8e524a9f2fa3f22eb09861ffe6ad659fe36eb40431222c22d7137a6cabca8db786e39d81f661afde4e39589b4db4d3c51ca53590a14e115d0afc3a877b839a9638bece80c32c19e51b7532024845f76cfe9bfb2ac05130f6758bf7fe993aa93aa272e4e6bd0c75c14099d43e652a223e5bcd64c362d4b8f4b95e016f9350c7fa74e653525d08011558b2c6e9bf4fdf9dbd5ef9b09bbc846afc2bcbc86c4ccc315f6d1ccd489b0cf8ed0d93f2f532a426265c590ba3a59023347d819d9b281ef85310b05316d46c8a8c0365d068a8708664ea4d77ac0cd150a65a56586babd34b74365bb8fe3e6187262284d64432e4c81ea4c0e57c1d71ae980c7f4d1d871032e188bbf9d1758cdc1dff989f2d1288fef4e205e99e7cbf2cc324b8c93046f476c59d3d0a59db6fe37382dc79c5ec16056ab3934a52f7d2880d0471a377b6a8ae84d56ac22d1d54551c", "signature": "86e7ccf06e79362d40cdb7fb75a98978bbd334a1db7590367d60849bd53e2fb1a4bdae590d1f47b5490d8702e7c1a87268b8ee9db612de7bdc2e38fa6deb7e05" }, { "secret_key": "0bea98abe7d63f158390ee668aa050e84a25d2893e49fc83f079f9bba6a55a75", "public_key": "22192ec0d32ef9835665a61bc88bcf4e1604637921152c116af503365bf6be42", "message": "c178e38d4e83ed2be57ce1c3ab64253a8171e610008181fbfc6d752269f7f1c5a9ec62cb27f19ad99ce1f5116a363d96fdc5a42f358b6dbe7cabdfc9f60718e4012c1bb1f842c5560811ba8374a0637747ff92eac21ca65ddeaf43e9989b7de2d432520afee364ecfba4da669ad4893d0bf69f9f81e7df69657be22b92069745f216c242ccd46d02d35616e16c755e0e37f961a6f3637752534f6dfab8805ab759a032a4e7e4c81953325a2f686bb69a029ce4e03becb3605637c5a65b52e331c26c926ed4711a504d3733bb53c97b80eafe4e75ddd9f415362888c3d4d37bae0e63fa11bf755666437d72f58c91d7a2f8cb619b7620a070b26b18b4d50184c5818712110e36d3e2830f6a8576ba57f9cccb8fff4028bf8ef9cb814825bbca827d649547bf6f2bef931704ca7f6df15f780155ed46eaa7ca7d72e22434ca0483bfb2f7902dc787f617eb9bd41ed4520adfd430948c710805a73c1ba5492e96484c4baa7da24c7435c46a052bf3515d33e42dcef517caa45f36c879121078c688dd10d76656a119762b6a834136fa1f8a643224b9224c543cf0470b3f8ee017d620dbdcc84d985154e9d1ae80e5f14387b88a0f6a5c35905aa57fb3abeb0ea6eccddb004474633cc483b56b8a8e20e8f2e09e979aa09893087875c6b117b5f13847ad8fc05604c4", "signed": "7eb3139b880fdf66376a2090818840049767c837f3ad0036b141667052b33609817ca5e240ed8cdf3ccf3aee29274534594db0b4ccc5c6e5bba3280b873f2901c178e38d4e83ed2be57ce1c3ab64253a8171e610008181fbfc6d752269f7f1c5a9ec62cb27f19ad99ce1f5116a363d96fdc5a42f358b6dbe7cabdfc9f60718e4012c1bb1f842c5560811ba8374a0637747ff92eac21ca65ddeaf43e9989b7de2d432520afee364ecfba4da669ad4893d0bf69f9f81e7df69657be22b92069745f216c242ccd46d02d35616e16c755e0e37f961a6f3637752534f6dfab8805ab759a032a4e7e4c81953325a2f686bb69a029ce4e03becb3605637c5a65b52e331c26c926ed4711a504d3733bb53c97b80eafe4e75ddd9f415362888c3d4d37bae0e63fa11bf755666437d72f58c91d7a2f8cb619b7620a070b26b18b4d50184c5818712110e36d3e2830f6a8576ba57f9cccb8fff4028bf8ef9cb814825bbca827d649547bf6f2bef931704ca7f6df15f780155ed46eaa7ca7d72e22434ca0483bfb2f7902dc787f617eb9bd41ed4520adfd430948c710805a73c1ba5492e96484c4baa7da24c7435c46a052bf3515d33e42dcef517caa45f36c879121078c688dd10d76656a119762b6a834136fa1f8a643224b9224c543cf0470b3f8ee017d620dbdcc84d985154e9d1ae80e5f14387b88a0f6a5c35905aa57fb3abeb0ea6eccddb004474633cc483b56b8a8e20e8f2e09e979aa09893087875c6b117b5f13847ad8fc05604c4", "signature": "7eb3139b880fdf66376a2090818840049767c837f3ad0036b141667052b33609817ca5e240ed8cdf3ccf3aee29274534594db0b4ccc5c6e5bba3280b873f2901" }, { "secret_key": "c25878b0d1e0925c8f5f04a1e5799080963c413a1399c118afb1687c797f4839", "public_key": "13ac2cad41908c255f671f93934ae5d7be325346725c8b40dc39ea80d70ddf34", "message": "6856cc7144b6bddcc4b58954d1a2e7101d6584b5d5e719a0aea0fbbdf221c2a2aacbacdc4020c5c8ce681ff7381acd607b0f5239692335700655be2d94c53d7b5148e92a2bc16338c2f4c1a7d1c595af622c240ce579a5e0f5b651bf562518cec8aa2ce4b4aadb1f2fda6cf6295bc37803b5377dab65c9b9a2949fdd49bf9ddc8f96d260ff951bf8e8ccf9827e6869c44bfd973358cefdb010db5e1fe5dbd9f5d2b2ca393c17d446f637059e692d7a91aadcc7689f5f9e1b3052175d9b6b208f9026787fdb66783f45372a24946b1bd1687bf0cfcc8174ebe4d32e43284fc78d7844de0fa22e2065e07528baabaf015cb34d629c3596ad040de31c5620eb266defa7533ac0401998e5673a754365047debfcf7e137a20d16cdd6a5521982f444cfc3429397c641bd7e74a770bb11fcb29483e337bae5169ee82da9a91adf3af67cd814c2825d29018ef035ea86f8de4c7563aaf66e0c75d17ca68f49f0758ec2d9c5179d01aaed7d4515e91a222b0b06fbde4f07a7d9df2de3bcae37ca2c8460c2a6b3749e9bda36d08e66bcc356b390434b4a18cfa45af557dca3d857ff3ad347cfb07e2358c2acfd5cd53b3b0ea2a41ee5c0802fd473db5f30526334da41eb4bc7518383898a0b7507ad4ca289d66c5e2eb75cf255dff312cb1e04eebeb47f2930b90d5e002eb0", "signed": "06f55198b4191914b74306f38e381316eac40b5b5adb8a312464f67175ecf612e0147b1cef46c2518750a5606bb03bc6467bb9321514f69dcbebce8f690580026856cc7144b6bddcc4b58954d1a2e7101d6584b5d5e719a0aea0fbbdf221c2a2aacbacdc4020c5c8ce681ff7381acd607b0f5239692335700655be2d94c53d7b5148e92a2bc16338c2f4c1a7d1c595af622c240ce579a5e0f5b651bf562518cec8aa2ce4b4aadb1f2fda6cf6295bc37803b5377dab65c9b9a2949fdd49bf9ddc8f96d260ff951bf8e8ccf9827e6869c44bfd973358cefdb010db5e1fe5dbd9f5d2b2ca393c17d446f637059e692d7a91aadcc7689f5f9e1b3052175d9b6b208f9026787fdb66783f45372a24946b1bd1687bf0cfcc8174ebe4d32e43284fc78d7844de0fa22e2065e07528baabaf015cb34d629c3596ad040de31c5620eb266defa7533ac0401998e5673a754365047debfcf7e137a20d16cdd6a5521982f444cfc3429397c641bd7e74a770bb11fcb29483e337bae5169ee82da9a91adf3af67cd814c2825d29018ef035ea86f8de4c7563aaf66e0c75d17ca68f49f0758ec2d9c5179d01aaed7d4515e91a222b0b06fbde4f07a7d9df2de3bcae37ca2c8460c2a6b3749e9bda36d08e66bcc356b390434b4a18cfa45af557dca3d857ff3ad347cfb07e2358c2acfd5cd53b3b0ea2a41ee5c0802fd473db5f30526334da41eb4bc7518383898a0b7507ad4ca289d66c5e2eb75cf255dff312cb1e04eebeb47f2930b90d5e002eb0", "signature": "06f55198b4191914b74306f38e381316eac40b5b5adb8a312464f67175ecf612e0147b1cef46c2518750a5606bb03bc6467bb9321514f69dcbebce8f69058002" }, { "secret_key": "0b2ec62763f687593135da1961ef29a288089696d944b265a5f96893cd2d8225", "public_key": "c1e234fa8bc96d268e7aad028b03f0a911b697715db3a21c2fc7df48ecda8875", "message": "a83434c68693d5fced91bda10213fcd50c48920b90cee9b73a9c61081a0974933f4fdb0a67e671f8351b0ed5ec0fe7b5fb0c87586fe582ffb1bfa2db5fcedd3302428234b2bb0e726dedf45b13a70cd35ab3e299d13f34503508278c4458eea5b7351b05836bdad5b05f60e445fc65737ae27d2e52df9c39e5da0286392d08fff7ecb7066820fc90fc8a44d5616561c50b52714702302bca5874de85dba045045f9f0e604eb86d6d7fbd775f72ea493b2c4ef7c3be16db2ca7e4d8bd79eb20cfb5f0f6f05336b75cc86d219f3b8f2e91ba7d52b64fdd6a6664f04f2fbab758cdf984168691c32f53e8616b49f76ab7b192b900903082cc89656a9705804cc9b9288a3e42170984f8dc454e0864b9341672686a178c060050178a36c6d906b2ce070d8faaacd9a58c794a5ea4108b4a485c65811c2dca2ee7bb10bffff75d4586b990f43763a16fbc0b48ae1fafb08a9a36fa4326845dba5ba2fbd32bbf66505c5e8657ed0107e3e16144ef31fa6aae72e774097483f5480aa45540568fd08cba0d577768004f58ae9b95be374ed7f0299fe721275e476e0b9ab72dc06ea328384e39bf3ac331c625484312cd9b06b15a2954d33e7aaba6be2261886ca811db96b1143d06dd6e0f3cba7a1ae9b94eaf67771bb2d24e2f94de9c470fcde7bfdb32f410198b5aa9698e32", "signed": "ff701f34b3594de3b80045f429e5e32dd88d6051d4195f1685be783766e80119368f56b3749725b913f1223f87fb0fb24d9dfa0841d6a0e2eb1fddf775c2d205a83434c68693d5fced91bda10213fcd50c48920b90cee9b73a9c61081a0974933f4fdb0a67e671f8351b0ed5ec0fe7b5fb0c87586fe582ffb1bfa2db5fcedd3302428234b2bb0e726dedf45b13a70cd35ab3e299d13f34503508278c4458eea5b7351b05836bdad5b05f60e445fc65737ae27d2e52df9c39e5da0286392d08fff7ecb7066820fc90fc8a44d5616561c50b52714702302bca5874de85dba045045f9f0e604eb86d6d7fbd775f72ea493b2c4ef7c3be16db2ca7e4d8bd79eb20cfb5f0f6f05336b75cc86d219f3b8f2e91ba7d52b64fdd6a6664f04f2fbab758cdf984168691c32f53e8616b49f76ab7b192b900903082cc89656a9705804cc9b9288a3e42170984f8dc454e0864b9341672686a178c060050178a36c6d906b2ce070d8faaacd9a58c794a5ea4108b4a485c65811c2dca2ee7bb10bffff75d4586b990f43763a16fbc0b48ae1fafb08a9a36fa4326845dba5ba2fbd32bbf66505c5e8657ed0107e3e16144ef31fa6aae72e774097483f5480aa45540568fd08cba0d577768004f58ae9b95be374ed7f0299fe721275e476e0b9ab72dc06ea328384e39bf3ac331c625484312cd9b06b15a2954d33e7aaba6be2261886ca811db96b1143d06dd6e0f3cba7a1ae9b94eaf67771bb2d24e2f94de9c470fcde7bfdb32f410198b5aa9698e32", "signature": "ff701f34b3594de3b80045f429e5e32dd88d6051d4195f1685be783766e80119368f56b3749725b913f1223f87fb0fb24d9dfa0841d6a0e2eb1fddf775c2d205" }, { "secret_key": "8960d7bee8c6b39ca5934d7cddd16f16b3663e6e03e833c057e2181e4597cb68", "public_key": "43409095d4f50f5eddbd5cd4d2012298cb41a40e99492d5a2db08be5377ea183", "message": "308d84c7a5f786e563e5c1ea57aab5e555c00997749d15aee35439efa645da2c3967703115c6c63ed7f94785c5478f38467b86e7626e8fffa4d51a2dc45e6df2a35cec99555eabc9f7a93e2e2b689459b4e0c92b351562c417b1997113754ea59e4a91510728ff3071a2bbd1f465a687f67dae955615031a8ad551fe738a260bbc446b48dca1d979051ab5840832e19d473b666217a9183980d6b27e3d3c76d93665ba2393e6ab1a42c3904d4025932d601a202a59a4c49fdb77f0e02868247de5afdfaa1b894208ac00d77c6bb54c6b2a73a47657e44c85137963b57521af20976248eb261482147cdf7a145c3643e29e0588bfdae6a082904853ce5a10d24970ebdfb7f59d5efdd6a5e7e0d287971c846acd54d84dd45468a4110bab6ef8d9a5b4b2426788900b7e1adfe0624344f98fe59ef8a1e6c405b344eb97bb204773744b6a2d8c6e65d17cea07de03b7f0fe49f1a55c33d5f15ce55df7c9561b251c6ac807a92553e1ce917012dccfd69e7dbd038c7eeecae98623f18fbb650e2218a0bc0fff43a75a116448bb7362f527ee6bc8e10761cccf9bcfc0d000f2127b4cc19211d095a0bdaa4e4be4519e6c8445eab9b3144a45cab9996135bf7f75a78d22275900f4ce1f0a9eac136364103062893dad4390422b77e5f5d1d94d7029c6097b35ca64a7a476fcc7", "signed": "7213dd4a79fd54dec0c548ef42e6cae015be77802bf515cd2582768f72f563ebb2da36af4aaeac56bbffc9932c2e24ec95daff00a5f7a0acab9c8bd3c23bb40c308d84c7a5f786e563e5c1ea57aab5e555c00997749d15aee35439efa645da2c3967703115c6c63ed7f94785c5478f38467b86e7626e8fffa4d51a2dc45e6df2a35cec99555eabc9f7a93e2e2b689459b4e0c92b351562c417b1997113754ea59e4a91510728ff3071a2bbd1f465a687f67dae955615031a8ad551fe738a260bbc446b48dca1d979051ab5840832e19d473b666217a9183980d6b27e3d3c76d93665ba2393e6ab1a42c3904d4025932d601a202a59a4c49fdb77f0e02868247de5afdfaa1b894208ac00d77c6bb54c6b2a73a47657e44c85137963b57521af20976248eb261482147cdf7a145c3643e29e0588bfdae6a082904853ce5a10d24970ebdfb7f59d5efdd6a5e7e0d287971c846acd54d84dd45468a4110bab6ef8d9a5b4b2426788900b7e1adfe0624344f98fe59ef8a1e6c405b344eb97bb204773744b6a2d8c6e65d17cea07de03b7f0fe49f1a55c33d5f15ce55df7c9561b251c6ac807a92553e1ce917012dccfd69e7dbd038c7eeecae98623f18fbb650e2218a0bc0fff43a75a116448bb7362f527ee6bc8e10761cccf9bcfc0d000f2127b4cc19211d095a0bdaa4e4be4519e6c8445eab9b3144a45cab9996135bf7f75a78d22275900f4ce1f0a9eac136364103062893dad4390422b77e5f5d1d94d7029c6097b35ca64a7a476fcc7", "signature": "7213dd4a79fd54dec0c548ef42e6cae015be77802bf515cd2582768f72f563ebb2da36af4aaeac56bbffc9932c2e24ec95daff00a5f7a0acab9c8bd3c23bb40c" }, { "secret_key": "ef6b9b51fd4f8586ca62658e042fc09a83b943033526ffc326c65eb3a5fb594b", "public_key": "1d6eece805e0887821876b7ed6ed5b0714d646fbecda38764f94c8155e61d004", "message": "a8f3f19665de2390d5cc52b064b4851273677486d8f5563bb7c95fa94db3356161ee622221f10cbb1fa195aac7231ea716d74b46b37bc85a70dba3dfaa1675217b351199e74a971028f729b7ae2b74ae8c6b3a0679c3e3296802844ad5bba343f6f9f7c4661b4a29b44f17e89e114fb220e984cd980e94c3d2bf9873e0605c92301744a3035ef046bad2666b5c63ebecf93cc140291946c0fa170340ce395092deed79841352fbfee03a927eb458f2a633ed3271652f5b0f9960cdf9015d56fdabd89ee71e259af6eb514b4c1bd4a666f5b5a35c90f35b149457af2944dd0aa8d9b542283a7e5412b775e421d2126f89bebc3ca37f73071621f1321eee52e9690486a33cd7ff9c9967fb65ee4e907b6b852211473d21e9d91a93362ac761760e8c7bbea486c3d605f9e11b86136819a7ab3f32f13ffca16817fed197ff880b4d6d9a808f7f878763a045728df72faaa963e4cb1c09cc2b2da920280c8366b7d18bf8972df16cc23448fbe6b2e6e16cbbf0745129854053189637ce115d2398433c15d6f116a205334824af282fa758494c47868ea8f4dfadc705e861aad2eb8ef3dbbed2a4569e15834a760cce0cbbc84b289e779b988346b9069c744c97ab2bf42b086d2fb0a411f5ce99f0819a3086b4fe9d96c7c9908dce28df1ddd30f3501ddaf78110734f9dcdfec3", "signed": "71d171071cd0fea1c6a9cfad1f7fd835e85ff906778bc6345a4dec4313ecc2bff755a717ebd912a5e02840ac073842f9bfcaa58913e260e3c73393d36685c70ea8f3f19665de2390d5cc52b064b4851273677486d8f5563bb7c95fa94db3356161ee622221f10cbb1fa195aac7231ea716d74b46b37bc85a70dba3dfaa1675217b351199e74a971028f729b7ae2b74ae8c6b3a0679c3e3296802844ad5bba343f6f9f7c4661b4a29b44f17e89e114fb220e984cd980e94c3d2bf9873e0605c92301744a3035ef046bad2666b5c63ebecf93cc140291946c0fa170340ce395092deed79841352fbfee03a927eb458f2a633ed3271652f5b0f9960cdf9015d56fdabd89ee71e259af6eb514b4c1bd4a666f5b5a35c90f35b149457af2944dd0aa8d9b542283a7e5412b775e421d2126f89bebc3ca37f73071621f1321eee52e9690486a33cd7ff9c9967fb65ee4e907b6b852211473d21e9d91a93362ac761760e8c7bbea486c3d605f9e11b86136819a7ab3f32f13ffca16817fed197ff880b4d6d9a808f7f878763a045728df72faaa963e4cb1c09cc2b2da920280c8366b7d18bf8972df16cc23448fbe6b2e6e16cbbf0745129854053189637ce115d2398433c15d6f116a205334824af282fa758494c47868ea8f4dfadc705e861aad2eb8ef3dbbed2a4569e15834a760cce0cbbc84b289e779b988346b9069c744c97ab2bf42b086d2fb0a411f5ce99f0819a3086b4fe9d96c7c9908dce28df1ddd30f3501ddaf78110734f9dcdfec3", "signature": "71d171071cd0fea1c6a9cfad1f7fd835e85ff906778bc6345a4dec4313ecc2bff755a717ebd912a5e02840ac073842f9bfcaa58913e260e3c73393d36685c70e" }, { "secret_key": "bad47cd4bd89849067cce1e63c3d91e9b787aea8584edb07f3451ef67e7bd79b", "public_key": "ab0ce9ba1d29bdfb85a0e66b76b5e2e05ff732569e4375ccd75098e9e71d17bf", "message": "b5a61e19e4863e0bb5f3fab6c4970d878596895521fa1e7f678cafa2de53322fd458a98aa6e35805429f651291b95bd9950e155f3ada0b609159a4abda5990c04bc2e764422fb49ef42f12529ff6f6a82029ff0185662e658f83c546eed09f06b5a68e857cdad0eb9ec4eecbfd88f34bc80990f8644a9bfdde1d9f3a90d557a8b828d5ce06a64e3b238582bb4cbeba30edc49e8122c55e95badcf502cc567869c09e9f46c6ff3f6878986b1de00b72a1858046fcd3a6e9cdaf5b073c56f2025063a2d178bd4c1e8cbc1e6e671aa97fb2cb4cc8a62c20be41c776372c8e7be63b482e6c63fa85d7cffbc1b2820bae1fc128343a1e20fcf1bc3502eee81358cc9a74c72af63530f96a25a604648ff570df1eb89d1fddbab28679ba2e9b41977e9a9c1caecdbfc361a1dd055ec51620a9bbdbbaf718c9cc136d2007710399536d13332485ec38879785e0c9ce9915a80251373990a59bce440326031ab1b458bfa5b8a4793da4ee11ab7af20de2a118c9ae521a417b68207fc885e109d8463e9f022787cc730db0b1faaed257bed901710885b74e994f54f6f2aeb64f0f60b59efbf2e3bb6515424603a113c0b8a31ba3c1e9a9b8118c87ec6949b75f49627ea7b1328889391104d4f4a3892cf00f26a73cda2a40f9b7157afc40667f4a04f647dbf93906b84c9a35164e1bc902", "signed": "e5724a1dd463a97d1222c518c4925d322202d10f04cd078e771e0fb3951dbc1493a234460754c3aae3df93008dbbfb310c99592bede735a4aeab0323a1210d0eb5a61e19e4863e0bb5f3fab6c4970d878596895521fa1e7f678cafa2de53322fd458a98aa6e35805429f651291b95bd9950e155f3ada0b609159a4abda5990c04bc2e764422fb49ef42f12529ff6f6a82029ff0185662e658f83c546eed09f06b5a68e857cdad0eb9ec4eecbfd88f34bc80990f8644a9bfdde1d9f3a90d557a8b828d5ce06a64e3b238582bb4cbeba30edc49e8122c55e95badcf502cc567869c09e9f46c6ff3f6878986b1de00b72a1858046fcd3a6e9cdaf5b073c56f2025063a2d178bd4c1e8cbc1e6e671aa97fb2cb4cc8a62c20be41c776372c8e7be63b482e6c63fa85d7cffbc1b2820bae1fc128343a1e20fcf1bc3502eee81358cc9a74c72af63530f96a25a604648ff570df1eb89d1fddbab28679ba2e9b41977e9a9c1caecdbfc361a1dd055ec51620a9bbdbbaf718c9cc136d2007710399536d13332485ec38879785e0c9ce9915a80251373990a59bce440326031ab1b458bfa5b8a4793da4ee11ab7af20de2a118c9ae521a417b68207fc885e109d8463e9f022787cc730db0b1faaed257bed901710885b74e994f54f6f2aeb64f0f60b59efbf2e3bb6515424603a113c0b8a31ba3c1e9a9b8118c87ec6949b75f49627ea7b1328889391104d4f4a3892cf00f26a73cda2a40f9b7157afc40667f4a04f647dbf93906b84c9a35164e1bc902", "signature": "e5724a1dd463a97d1222c518c4925d322202d10f04cd078e771e0fb3951dbc1493a234460754c3aae3df93008dbbfb310c99592bede735a4aeab0323a1210d0e" }, { "secret_key": "caba8e0533113a4be173408ba83c0db74260802f9186c391402655acde6015cb", "public_key": "2d7bef6164c279fa1028a9788e3e8ee8ac15edcf92a5855062952310b4684547", "message": "2413a32bca5ce6e230e565eb858493d5d04e6d2e2a7ab1f89a3b423311676bfa93c67daafd1cfc7109e040bac52cbfe07c28280bb6acf6e3a31073dab2965378dd77f61fe9247135c1a631b79ad668c9ea1cd4112d8d3a064cc21df32aeac7dd718b091fb6915b8bc063bb5815c376e01476312a2e5433417a7a9315d65999b02ff464a474a597e53988773670eca46a6e26cf96e9488e9e6344bc783ddfb535e76bb3b9a603ff4c59c7dbe2d8b6198d5b24490b4ea96c95959ffbf3d8218e760daf20e01e2f36c84bb097115abddee92bed82d16b15a9e192e9893ac638461df507207b0cf595884d8a99fb9c7045f9bff7b73f00ca3fd595a5cec292adb458bd9463be1204d01678d2f4389b8720115fa597c402b4ff694b71ce4f3d330d5e2f3c3ad6d96a9b3439230fc53a44794cda595557c406ca1589bc7be81e2d79636033253fa7bdd600c67fc55936bd96ce0428c3eb97bad1de0a5fbb9b675157de5f18bc62a7c22c9483e2802e679b5b8f89db0fc37f7c7150ad5ac8722ceb999b2435e6997217092336ef1c8a2292dab9a46ff8a9e10d3355765cac9d6598770f4f01ea639125fd031609dd1a507d96280c7d01a3ee987e9b210ec8744cd48c74f8afee961e8ef221f826a1fe6e7df0cb15ad7c7ef4a91f9d0f4c2e1bdea635d275fac8c4bc0601f490dbdbc734", "signed": "ec35ec32c8a4008827e178492b3b8bee22a4954fc6b25f4f225dd7ed23698900de8156756a8edc35c51d10f82b830a2a659676eac911f960244766e0c3c607052413a32bca5ce6e230e565eb858493d5d04e6d2e2a7ab1f89a3b423311676bfa93c67daafd1cfc7109e040bac52cbfe07c28280bb6acf6e3a31073dab2965378dd77f61fe9247135c1a631b79ad668c9ea1cd4112d8d3a064cc21df32aeac7dd718b091fb6915b8bc063bb5815c376e01476312a2e5433417a7a9315d65999b02ff464a474a597e53988773670eca46a6e26cf96e9488e9e6344bc783ddfb535e76bb3b9a603ff4c59c7dbe2d8b6198d5b24490b4ea96c95959ffbf3d8218e760daf20e01e2f36c84bb097115abddee92bed82d16b15a9e192e9893ac638461df507207b0cf595884d8a99fb9c7045f9bff7b73f00ca3fd595a5cec292adb458bd9463be1204d01678d2f4389b8720115fa597c402b4ff694b71ce4f3d330d5e2f3c3ad6d96a9b3439230fc53a44794cda595557c406ca1589bc7be81e2d79636033253fa7bdd600c67fc55936bd96ce0428c3eb97bad1de0a5fbb9b675157de5f18bc62a7c22c9483e2802e679b5b8f89db0fc37f7c7150ad5ac8722ceb999b2435e6997217092336ef1c8a2292dab9a46ff8a9e10d3355765cac9d6598770f4f01ea639125fd031609dd1a507d96280c7d01a3ee987e9b210ec8744cd48c74f8afee961e8ef221f826a1fe6e7df0cb15ad7c7ef4a91f9d0f4c2e1bdea635d275fac8c4bc0601f490dbdbc734", "signature": "ec35ec32c8a4008827e178492b3b8bee22a4954fc6b25f4f225dd7ed23698900de8156756a8edc35c51d10f82b830a2a659676eac911f960244766e0c3c60705" }, { "secret_key": "9bf3fbc7308b46f6036bade0c3ca199fac662b07f103bf75181d52ba6a58be05", "public_key": "2f6ac6fc33bc060c1dc3cb9d1a2b9115845addb16c4b84be37ed33adb3b3d3a8", "message": "d65e36a6a38195ecb91de3c848b51f639245fa2baba8a6f85947159dec0ed3fae80c5a0f8c66ff24793c89c0c687543bc633547a1f37f730d97012ebbdc7ac339c4890c0856bbfe2ba29b25a7aa6b089c033fecb76db62dd3c00f6421b9e76dd0ea366eb2d4a052ee6cc736e3819191d5ad7a66d2be042cc6539e5f35652b155a727f3888d93f93a9102598f7538a9ab7c777eec79426a6075d6f38d64c485520f6413ff4d358a8a9cbdab01adf4db02adaea26494d1f5d617637f277f8b0e6e7e61e2eeccdd337de2baf0ca264c14c8cb8368000b9c714385f413737d6816e212cae2aecfffc32fd16d46c3ecee6ab074c0d768bdfe99b86cbbc8df9c47cd586d465871268d4a9d1c877236ab78f8859c114e251cabc4be0f8bc25d148c5f543e290745d11803e49f5b53193fe39969c039b3f249b32f2b8598b6acf4ed64d5752bb772ff4ee00ce0f85ecbb4cfc4ce07daf2809868c2903b781e12a274105f06181029e47f2bfb21f49480aa1e444715c0b9ff07ead88975d93585d2ff424832a9783d94906a60f877ae1c85ff15317badca1e61317433c7ce96279b678ec9d174dd0870080b234154f626a53462cfd547842eab8705605b8ee885729ee78d1833aa43f55ac22731989fdeda7dc5fa9c01985f2661e6c7326d346e6db27e6f921fae7c93a2170e10dd0c460bdc", "signed": "0c3136e01f9bcd99e10d3d124b0cdb0772bec18a864be81bd1daa44d818c3d470dfaa8ab6e9a761cf03f93ef9cc78291096ed6d10c08fa2fba3bac04dde20f0cd65e36a6a38195ecb91de3c848b51f639245fa2baba8a6f85947159dec0ed3fae80c5a0f8c66ff24793c89c0c687543bc633547a1f37f730d97012ebbdc7ac339c4890c0856bbfe2ba29b25a7aa6b089c033fecb76db62dd3c00f6421b9e76dd0ea366eb2d4a052ee6cc736e3819191d5ad7a66d2be042cc6539e5f35652b155a727f3888d93f93a9102598f7538a9ab7c777eec79426a6075d6f38d64c485520f6413ff4d358a8a9cbdab01adf4db02adaea26494d1f5d617637f277f8b0e6e7e61e2eeccdd337de2baf0ca264c14c8cb8368000b9c714385f413737d6816e212cae2aecfffc32fd16d46c3ecee6ab074c0d768bdfe99b86cbbc8df9c47cd586d465871268d4a9d1c877236ab78f8859c114e251cabc4be0f8bc25d148c5f543e290745d11803e49f5b53193fe39969c039b3f249b32f2b8598b6acf4ed64d5752bb772ff4ee00ce0f85ecbb4cfc4ce07daf2809868c2903b781e12a274105f06181029e47f2bfb21f49480aa1e444715c0b9ff07ead88975d93585d2ff424832a9783d94906a60f877ae1c85ff15317badca1e61317433c7ce96279b678ec9d174dd0870080b234154f626a53462cfd547842eab8705605b8ee885729ee78d1833aa43f55ac22731989fdeda7dc5fa9c01985f2661e6c7326d346e6db27e6f921fae7c93a2170e10dd0c460bdc", "signature": "0c3136e01f9bcd99e10d3d124b0cdb0772bec18a864be81bd1daa44d818c3d470dfaa8ab6e9a761cf03f93ef9cc78291096ed6d10c08fa2fba3bac04dde20f0c" }, { "secret_key": "64e89304a335e903cb36c0bdf1a6412ef368468006b73d3d2d61cb030cc5f8d1", "public_key": "a180ef3a661c3c479d5f69807c902748e35e7f725121e37a5d91b8bec88d83a6", "message": "2f51074d981bdafafb02a40fe826c45f3171c1b3184d8c260b82b8411fc625cb02ccfe755dc29dc7895bf759e61b2450da1a656a38d4f70d2ee748c518c6420306e5f01ec7a0ffe0e9dceb93f6c077b12662881584f98ce6ab945f87fc6d123c45d6cdfd8237a1ce3635b623a79d020df44c74b89ac14a321fbf33a8c0a2559fea1c2b156076b813908f842ebe4c2b949089e52b1ae40dc6e4b2abbc439a0bf72369679aab6f4c00018be147f7c0a67b9679ee88a53819c49f7b675e30a8b5af39661ee8db21010411294968f88e5d604d0d88d76a7e4864fad3a56f5f624ba1b34ea9cb720850aad3bd4f0a882a7d25fbec2bb7ca86da616da96c1562c6d6a1abcc641e1b58b2c178e1c3bc8a3b36ec9e144dd2e75b0bc8c08ccb0d6e3427b0322b3d6ab93f3f60b9cc5b61dad02385a14949f9b87a8e3af1e0e0fab7a9a928c753fc6110444af7ccaf8027ed641b9ed87fa5d8e1f76cae465d57a70dad9ebfdd3ce7576ac4de89d98f42e282ad87ad6a5042577cbbbc4d951e2a8676fedc8cb1b1bdf76c3a38846385a85aa24706c20a8b38465fe2ae0e41f78e614b8e9642fe2471a9015747db976e0c7848c23ff3f417cb05a8d5ef40130adf855c998a62104d7e2fb7c0f9aa2a496075623ced2c0f7eec10147ff9608a8a042ef98117459b93837fd1b8d5ef03978eada74cac", "signed": "92eb4454814001ecfc18025d6421f64645a5bcbb5cb8fd85c14d772617c503e8be7d3bcf117f5e6801d1c3b96f9090a66ddc67f8cf8ff0f1c125b16b15e2ce072f51074d981bdafafb02a40fe826c45f3171c1b3184d8c260b82b8411fc625cb02ccfe755dc29dc7895bf759e61b2450da1a656a38d4f70d2ee748c518c6420306e5f01ec7a0ffe0e9dceb93f6c077b12662881584f98ce6ab945f87fc6d123c45d6cdfd8237a1ce3635b623a79d020df44c74b89ac14a321fbf33a8c0a2559fea1c2b156076b813908f842ebe4c2b949089e52b1ae40dc6e4b2abbc439a0bf72369679aab6f4c00018be147f7c0a67b9679ee88a53819c49f7b675e30a8b5af39661ee8db21010411294968f88e5d604d0d88d76a7e4864fad3a56f5f624ba1b34ea9cb720850aad3bd4f0a882a7d25fbec2bb7ca86da616da96c1562c6d6a1abcc641e1b58b2c178e1c3bc8a3b36ec9e144dd2e75b0bc8c08ccb0d6e3427b0322b3d6ab93f3f60b9cc5b61dad02385a14949f9b87a8e3af1e0e0fab7a9a928c753fc6110444af7ccaf8027ed641b9ed87fa5d8e1f76cae465d57a70dad9ebfdd3ce7576ac4de89d98f42e282ad87ad6a5042577cbbbc4d951e2a8676fedc8cb1b1bdf76c3a38846385a85aa24706c20a8b38465fe2ae0e41f78e614b8e9642fe2471a9015747db976e0c7848c23ff3f417cb05a8d5ef40130adf855c998a62104d7e2fb7c0f9aa2a496075623ced2c0f7eec10147ff9608a8a042ef98117459b93837fd1b8d5ef03978eada74cac", "signature": "92eb4454814001ecfc18025d6421f64645a5bcbb5cb8fd85c14d772617c503e8be7d3bcf117f5e6801d1c3b96f9090a66ddc67f8cf8ff0f1c125b16b15e2ce07" }, { "secret_key": "6f634387ca2c0cb167a740d6afd89e2a28f5307184e81cba3c037046a5ede23c", "public_key": "011f2a9a111c38f3490cad1685be78eceedc6fac4a3221301c69c84b1ec7b3a7", "message": "865c20a94ac3f2e3bd5cb85bec9d33726671fe01f9c537017d59c8d5106e43360bf76fc06186705980c8a87ba3633a4a170426ecc0defb6db2670f5f592533774cda50052ae597d48deacc2637063bfd519f2e79bac81775beccb1ab2f5b39712e2e829469b75a2d2dbd08aa6d24723404b25eb948a4834c55246c8079a82ec64354e8c2388f8c5a616b3cdc371e6263fabc9f6099219e861585fe82a67d610dd1eb5c81c96b5cb354a689fd8aac8db76c433f0cb0b31cf1d855b6a30a3d2a212e9b4f7d7afe619951f98d2f1ba2c101085ba81f49b36037cd6457a7eaa8f4f3bedf68d09fc9fa25a9d754db65360285412d1a6da53788905fcf4efa8a80cd86ca48b845633d8c31c2ae06f16c4c6bbbe9cd1afb59e101be50e03535dd8a65e45bba46d45cb14badfc8e93ab5267f4e492ab1f9a95e61fcab81cbf2bd867a3ec7b4baa189a0f08567075596129dcf9ff1c502d3279e8aa6ce56eaf134582a9e430a5aa8ca10c3da8bc793d0256ad19aea7149f0ea7ea95facfac1c5cfd29d7a3fe1a417975739e14da8edc819900472ca8c69716328e8a299f974edff741aabc1c074a761b3ec8761dda2e7eed7af33ef00409849d415497c5ed5dfaa2259a31d076398170b2d9d210208b4a4c7db8c626d1c533562a1f95489f9819e4985fc4e1d1a707be5e82b005481d86377f424e", "signed": "fd17c618cdbb5d459ea2aca886f0512c623251284aae3a83eb5d7f60da1d9b2ba083c455a5e2583a3cba736e7b961ba19c1cc8dd90745da82a15dfc662e8e10d865c20a94ac3f2e3bd5cb85bec9d33726671fe01f9c537017d59c8d5106e43360bf76fc06186705980c8a87ba3633a4a170426ecc0defb6db2670f5f592533774cda50052ae597d48deacc2637063bfd519f2e79bac81775beccb1ab2f5b39712e2e829469b75a2d2dbd08aa6d24723404b25eb948a4834c55246c8079a82ec64354e8c2388f8c5a616b3cdc371e6263fabc9f6099219e861585fe82a67d610dd1eb5c81c96b5cb354a689fd8aac8db76c433f0cb0b31cf1d855b6a30a3d2a212e9b4f7d7afe619951f98d2f1ba2c101085ba81f49b36037cd6457a7eaa8f4f3bedf68d09fc9fa25a9d754db65360285412d1a6da53788905fcf4efa8a80cd86ca48b845633d8c31c2ae06f16c4c6bbbe9cd1afb59e101be50e03535dd8a65e45bba46d45cb14badfc8e93ab5267f4e492ab1f9a95e61fcab81cbf2bd867a3ec7b4baa189a0f08567075596129dcf9ff1c502d3279e8aa6ce56eaf134582a9e430a5aa8ca10c3da8bc793d0256ad19aea7149f0ea7ea95facfac1c5cfd29d7a3fe1a417975739e14da8edc819900472ca8c69716328e8a299f974edff741aabc1c074a761b3ec8761dda2e7eed7af33ef00409849d415497c5ed5dfaa2259a31d076398170b2d9d210208b4a4c7db8c626d1c533562a1f95489f9819e4985fc4e1d1a707be5e82b005481d86377f424e", "signature": "fd17c618cdbb5d459ea2aca886f0512c623251284aae3a83eb5d7f60da1d9b2ba083c455a5e2583a3cba736e7b961ba19c1cc8dd90745da82a15dfc662e8e10d" }, { "secret_key": "4b2e1ae60fa5d383baba54edc168b9b05e0d05ee9c181321dbfddd1983959154", "public_key": "36c020b18552345619ef8837eb8d5494840e85f46809343b4d6f406125da557d", "message": "fab98b2bbf86aeb05086812a4b0049a1042abb76df9cd2908755706303efedb1ad21e8bc8d7562349e1e98ce0d752f4b3d99e677368bd08c78fe7425ec3b560e383bd42af6499886c35add80a5828b61d6644d7dc443ba2c06f9bad2eccb983d24458f6ada1b10bb5b77172c5cdd56d273d1e41010b25cf48a7d58d7255702ac12f2a6fe2918466395f460d15236d035ae9410ca86c4605128299faaf09015f1adee7768ee1a8f8ca06d10dd7f95c46fa10253065f9d6f90295908809fd779571be29e0ae66e0bcbdeb7913d2bbb76ac302f3452c55ef199a48eceb0e3596c7b4c0386dae7101ea244a33c4cdc830672df83655b35338052307b94d223cab1af69e07f78e58cbb0cb3c5351e3a6b0c4a927f7562c598d2d3df90569f61db1a3cb0140b56ea02cf7745fbeec2028673d67f1ec5f7daf9715f754a9d8ed46a7a63ef722ee0d5899331b63c974fa880429435767f96254ef46c9968f3fedaafeaf3e8f45634b54f5e0a5fc2d2373ab9e98d9acfe3697e642a18e0dfd9fbc2f094866d401f0a4ca2a456edf6a1a77b9c296c3922067eb3d5a5ca0a77f430e4c8611d8f05a1baac1635ef7ba83dfc69d301949856be4d2c8ab61de29cf39250c5794cbf5750cda95d0468afa2b7f23dba4ef5f5295a3bf4140018b7ed061884444f5bb1b7d239312dd739999536c684456ea06b", "signed": "2220119e83d69a6a3eed95fa166d1d1128a3f232ca1b78bc94b4d476c4779443614b8772aa2232cb0720a055eb71d8407f3ab19baa1d962c052c84c0bd589608fab98b2bbf86aeb05086812a4b0049a1042abb76df9cd2908755706303efedb1ad21e8bc8d7562349e1e98ce0d752f4b3d99e677368bd08c78fe7425ec3b560e383bd42af6499886c35add80a5828b61d6644d7dc443ba2c06f9bad2eccb983d24458f6ada1b10bb5b77172c5cdd56d273d1e41010b25cf48a7d58d7255702ac12f2a6fe2918466395f460d15236d035ae9410ca86c4605128299faaf09015f1adee7768ee1a8f8ca06d10dd7f95c46fa10253065f9d6f90295908809fd779571be29e0ae66e0bcbdeb7913d2bbb76ac302f3452c55ef199a48eceb0e3596c7b4c0386dae7101ea244a33c4cdc830672df83655b35338052307b94d223cab1af69e07f78e58cbb0cb3c5351e3a6b0c4a927f7562c598d2d3df90569f61db1a3cb0140b56ea02cf7745fbeec2028673d67f1ec5f7daf9715f754a9d8ed46a7a63ef722ee0d5899331b63c974fa880429435767f96254ef46c9968f3fedaafeaf3e8f45634b54f5e0a5fc2d2373ab9e98d9acfe3697e642a18e0dfd9fbc2f094866d401f0a4ca2a456edf6a1a77b9c296c3922067eb3d5a5ca0a77f430e4c8611d8f05a1baac1635ef7ba83dfc69d301949856be4d2c8ab61de29cf39250c5794cbf5750cda95d0468afa2b7f23dba4ef5f5295a3bf4140018b7ed061884444f5bb1b7d239312dd739999536c684456ea06b", "signature": "2220119e83d69a6a3eed95fa166d1d1128a3f232ca1b78bc94b4d476c4779443614b8772aa2232cb0720a055eb71d8407f3ab19baa1d962c052c84c0bd589608" }, { "secret_key": "b216cebf878024c20dfc86ce4b37bdc47aa28f29203b5b44925065d993a259fe", "public_key": "c36edbb6254a913f08fe259e238780638f72ec0b3007264bcc60a9e81ee9298f", "message": "9c8717cc86fe02480bfd9e922bd76bffee2170c4cb1b13df834ac01d45006086297f1b8a26f2ba674d33e1d162f19367feba97352b7df2e75b309d4b6f8b07cc0eb6777e81e268e02d07f2a08f8f39d5a8320bfc01fc8c9227d2cf05e12891ff4de885a1c93371a0910ba53392aff9ba2eed9a2055977ec4157bd65b34df79372f4d50edbc48924353cfa1692319d88a7a5bb726254c209291e9b1d2c1a6c8236398109c59ed42a0ac9e7633c520734eccfea4fea95a47a8f0a068b4275000439cc97c57871e105cc0790e9dcc9c25d5af7063ffd05c4f3780e7bca4c456d0170da709fc6cb3faa72bdcf562908ae9340aef4d0c8b91f0fbccbcf1cd898b1c716f4f1474c3aa316242abdf6368e57a247ff2fd5ce23d187f694f11e38dfbfbc3d9db20903b4ebb449b9049ee020f6e2f508e8b2b165bad7464dbdd178cbd423233765d371e7ae1c3e878cdb5b824b20cb309867c0e473c067e6744008527b6bc076d077f4867622aeed1c253dbde7c6a76c7015962fb73391698600bb318ffa7b0136ee4ccb07daaf01f40ff9c194f98681f9faef8b6f9e99f95df0080da8966a8ba7a9474c537b92df9799e2fd16f788dad7a7bcc745226e1e6371f52ebcdbd144044ddfe632dfc0a43d3a450923170ebc7ae219e50e078a511bc12ef14cd14b5309f38abd65db2b2a7af2243b229c9fd2e", "signed": "b7389ee78dd9763f9d2892912edcbe3e8a236b8bdc25f44b9cfdc8c47cd58168ab56eb0402a5bd752ac8f4978d2ea2b65d2fa85265966b9f57227ef4a59ae0099c8717cc86fe02480bfd9e922bd76bffee2170c4cb1b13df834ac01d45006086297f1b8a26f2ba674d33e1d162f19367feba97352b7df2e75b309d4b6f8b07cc0eb6777e81e268e02d07f2a08f8f39d5a8320bfc01fc8c9227d2cf05e12891ff4de885a1c93371a0910ba53392aff9ba2eed9a2055977ec4157bd65b34df79372f4d50edbc48924353cfa1692319d88a7a5bb726254c209291e9b1d2c1a6c8236398109c59ed42a0ac9e7633c520734eccfea4fea95a47a8f0a068b4275000439cc97c57871e105cc0790e9dcc9c25d5af7063ffd05c4f3780e7bca4c456d0170da709fc6cb3faa72bdcf562908ae9340aef4d0c8b91f0fbccbcf1cd898b1c716f4f1474c3aa316242abdf6368e57a247ff2fd5ce23d187f694f11e38dfbfbc3d9db20903b4ebb449b9049ee020f6e2f508e8b2b165bad7464dbdd178cbd423233765d371e7ae1c3e878cdb5b824b20cb309867c0e473c067e6744008527b6bc076d077f4867622aeed1c253dbde7c6a76c7015962fb73391698600bb318ffa7b0136ee4ccb07daaf01f40ff9c194f98681f9faef8b6f9e99f95df0080da8966a8ba7a9474c537b92df9799e2fd16f788dad7a7bcc745226e1e6371f52ebcdbd144044ddfe632dfc0a43d3a450923170ebc7ae219e50e078a511bc12ef14cd14b5309f38abd65db2b2a7af2243b229c9fd2e", "signature": "b7389ee78dd9763f9d2892912edcbe3e8a236b8bdc25f44b9cfdc8c47cd58168ab56eb0402a5bd752ac8f4978d2ea2b65d2fa85265966b9f57227ef4a59ae009" }, { "secret_key": "afcecea92439e44a43ed61b673043dcbc4e360f2f30cd07896cda20cb988d4e3", "public_key": "d231f69235a2e3a1dd5f6c2a9aaf20c03454b9a29f4e3a29ab94689d0d723e50", "message": "0b05f89ebb3397947687afbef0ede87cf3810676277037521d952a3bbbbdc8565988a095d8d4f6f59be572d3d821dd789977ef77a2fd7110ceeed9f3756ed8e188267b97a30ef8957c78aea3a2963deca61860545e0c40824881ebb1db10f607e10ddbddce400ea236ba4745aa99a05641976766789ed0da7db55fdab459ebd4b441a6282f7cfd5a20ea06effa335955e5fd29181671bc92c00052f7f75c39277c9a43b787ac9fb1516e996232a509774d1dc21d8c0513f7844b0a5b5f18957581f99044a14223ccda8a284de12fd424265fe57b270215f8fa9ff2bea517934e4800a47d346fb6c361cfbabeffabd9c4164f45156e245c977edb473642c3940be5ad6fd1a7119a7b18e98d6dc843e0d254c93d0146d18e5c62ede1490f89a605eb454f974778cfae20932e95477bd03bcdb97d5bcb76335942e92ee668f231e69c570ac5446d0f774066737fdf49f10ceb1b52d6d8a4639846a3373a7c6f3b4b3159fe2e7af7eee2f0df172d94d255d017651da3009005e5eac3176c09389ee40d70383bd37117eca083598a1801f592d057186e568e247c252be4b14f723ab7ddb97ae9768c2682fd63acc300779fe04e2b88874751346c9e0f97a2a216772ff9625c33bd7e29fed8003a08dbd33b5d17899c943c25e95ad754fb632e047c112af7f7ceba72362e1a3ddd2935aaf7f818a27c", "signed": "a65545cf3df456b28d83a6d94c036a19d0d29fb065edc27e5e93a1f40279897e1c6f25959a725ababc87cf2ae727f3467b79570e902711917191d9cb0d2d660c0b05f89ebb3397947687afbef0ede87cf3810676277037521d952a3bbbbdc8565988a095d8d4f6f59be572d3d821dd789977ef77a2fd7110ceeed9f3756ed8e188267b97a30ef8957c78aea3a2963deca61860545e0c40824881ebb1db10f607e10ddbddce400ea236ba4745aa99a05641976766789ed0da7db55fdab459ebd4b441a6282f7cfd5a20ea06effa335955e5fd29181671bc92c00052f7f75c39277c9a43b787ac9fb1516e996232a509774d1dc21d8c0513f7844b0a5b5f18957581f99044a14223ccda8a284de12fd424265fe57b270215f8fa9ff2bea517934e4800a47d346fb6c361cfbabeffabd9c4164f45156e245c977edb473642c3940be5ad6fd1a7119a7b18e98d6dc843e0d254c93d0146d18e5c62ede1490f89a605eb454f974778cfae20932e95477bd03bcdb97d5bcb76335942e92ee668f231e69c570ac5446d0f774066737fdf49f10ceb1b52d6d8a4639846a3373a7c6f3b4b3159fe2e7af7eee2f0df172d94d255d017651da3009005e5eac3176c09389ee40d70383bd37117eca083598a1801f592d057186e568e247c252be4b14f723ab7ddb97ae9768c2682fd63acc300779fe04e2b88874751346c9e0f97a2a216772ff9625c33bd7e29fed8003a08dbd33b5d17899c943c25e95ad754fb632e047c112af7f7ceba72362e1a3ddd2935aaf7f818a27c", "signature": "a65545cf3df456b28d83a6d94c036a19d0d29fb065edc27e5e93a1f40279897e1c6f25959a725ababc87cf2ae727f3467b79570e902711917191d9cb0d2d660c" }, { "secret_key": "b834c6e0facbff580dd3b23753959a4c2154c219521b3d27035d071f6599bd02", "public_key": "d1c384715e3b3d02c13e090605534c7db740da2aa560f53200a3ced8beae8cf8", "message": "6cf147b1605528a36be75716a14b420bcf067c03f1cfe9c4402f14987fbfc9d3ecc3ccf4f8d2d03a55900b8dc79af3b6e77436f69b1417ad4b68fd44e5e333ed90ea7943fbd1122609ec8ff6bb25e42e9914f5920fc72c4d013b6a9685c996fbd8352aafb184c22d9e47871a5280e4ab7dd6a5cfd10a5994a200f670e0b622a9394d4793d0a420e7d8806cb127c7ac690d45a2e94166cea672bcd982b0e9baad56312d2570ddde7e0b9e7f47136f0481d00f66a2aaca4d1b09d7ce6c5a98a76b68cd97d5793968d667073f8217f9054735340f9b149c0dce845b099e88d0709680f0f77603ff0a2331c558fc36d5f24da9a62d69af5190d21b5c857a1e08f014c6d456468665a7f845c66f9111f9c098c68940efcd87b657070cb9164bc9743aceb7439a0d01c0062a11af2e11349397f5d152872b13c5ab32f51cc58f1475ec82ac671561dcbd343cfb3c5f78d0fc73053c6004b0a4ca3f2043ff4b0c54275c4fcb9cadc6baabe57b1d5acd531e972ef9335136cd1d65512ba1f5b6ccc4b66b4250aafa2967dd4211a2742e0f177d8f4063899f61815cbe6d8fbfcdf74812bd40cc10084e46a99ac128058eaf16a49a24b6ae228ecf0109c52dfc06e37d6a333bcb24aba312164c6c0290485d251280538ce9541c0916640e36d6929dcd9588eb99577f5f6d82bcbb198826267e49f5daff2c0d", "signed": "0f19b7066d5792328a9800d9d4f8f67d5b089b541226a167dacd439fa485b0025a5dc7f2c7e23fc4a5c6869e7619d356399700c93650e89cd25b90fb9925e3046cf147b1605528a36be75716a14b420bcf067c03f1cfe9c4402f14987fbfc9d3ecc3ccf4f8d2d03a55900b8dc79af3b6e77436f69b1417ad4b68fd44e5e333ed90ea7943fbd1122609ec8ff6bb25e42e9914f5920fc72c4d013b6a9685c996fbd8352aafb184c22d9e47871a5280e4ab7dd6a5cfd10a5994a200f670e0b622a9394d4793d0a420e7d8806cb127c7ac690d45a2e94166cea672bcd982b0e9baad56312d2570ddde7e0b9e7f47136f0481d00f66a2aaca4d1b09d7ce6c5a98a76b68cd97d5793968d667073f8217f9054735340f9b149c0dce845b099e88d0709680f0f77603ff0a2331c558fc36d5f24da9a62d69af5190d21b5c857a1e08f014c6d456468665a7f845c66f9111f9c098c68940efcd87b657070cb9164bc9743aceb7439a0d01c0062a11af2e11349397f5d152872b13c5ab32f51cc58f1475ec82ac671561dcbd343cfb3c5f78d0fc73053c6004b0a4ca3f2043ff4b0c54275c4fcb9cadc6baabe57b1d5acd531e972ef9335136cd1d65512ba1f5b6ccc4b66b4250aafa2967dd4211a2742e0f177d8f4063899f61815cbe6d8fbfcdf74812bd40cc10084e46a99ac128058eaf16a49a24b6ae228ecf0109c52dfc06e37d6a333bcb24aba312164c6c0290485d251280538ce9541c0916640e36d6929dcd9588eb99577f5f6d82bcbb198826267e49f5daff2c0d", "signature": "0f19b7066d5792328a9800d9d4f8f67d5b089b541226a167dacd439fa485b0025a5dc7f2c7e23fc4a5c6869e7619d356399700c93650e89cd25b90fb9925e304" }, { "secret_key": "2269a5d8f7ac2cd9048f5f49e349e5c435a159b319fe3b30bfac8d0d505943f4", "public_key": "1c817943dc39c24b01da38a487b175482460c609e4726349a9aa7aea9bc0fb34", "message": "7153d4d9e641aa61920db0ff4bd537a6d6130a396554cc94537698f9cad16b99eebefa5f2776f2feaff6bd9a6904120c67e0883f6b96bbbb195e95aec753b699bab3d03944c13c72fc84e3f2cbf6296f645549111c93fae1a759bfcd16fc09e60bb9785535ad27da244ef2f857f2de99a6e92188890e452c7f5b9e3a4b968e11743b6fc7faf1275e5360a5468941797894d770fa7da364a337302239fe83ae0b0d084aa12acdc63462524e0eb10fefe81ba96f71f275f3449a3f8db21d58749a38853d39b0ad8e69891bd204dfca8f6c239dc9a0ac27f54db4238d4706df11d607369dc7f704da1d39f2e82af8c283d220c12431f56d803069b4acb77081c031ae3319fc77fca7845097fd727ad0d080895bba23e873d2def8cdc216c3eed61b08761bb9ebce0282cf502aaf6ce7e8c058637958c3ea1b72fe6e8df8d37ac055db6992587fabbdc467f52475644f918863af620492f34680f2056cbcab75e2323626c094759c0e0e99ef19759527250646ad760120ba386699d53934f956b8bbc7395bb496ceb2dd223c7b501b92d36a95f8f0a02eb5ba4dddf166b9b95b4a59e72a30c63cf21e6085751923d54b30281e52a09618e6f023ba0a21675e7f989b8991588c96c2b56a78f5d2945a7baeb6a0c1bbd5d95af3ee830f5809c794a15ab4b5f89dd2be2dfdcd8fe0520fda2b3f02a1ac0155", "signed": "be0fb3308a076a61a4a92a97f6ac55327190e1341d6dd410d86b41bdaf2d3374093ef720bdb77feb7014e0f77d3b809623c7ca53e2ae4b097113e96db77a2d087153d4d9e641aa61920db0ff4bd537a6d6130a396554cc94537698f9cad16b99eebefa5f2776f2feaff6bd9a6904120c67e0883f6b96bbbb195e95aec753b699bab3d03944c13c72fc84e3f2cbf6296f645549111c93fae1a759bfcd16fc09e60bb9785535ad27da244ef2f857f2de99a6e92188890e452c7f5b9e3a4b968e11743b6fc7faf1275e5360a5468941797894d770fa7da364a337302239fe83ae0b0d084aa12acdc63462524e0eb10fefe81ba96f71f275f3449a3f8db21d58749a38853d39b0ad8e69891bd204dfca8f6c239dc9a0ac27f54db4238d4706df11d607369dc7f704da1d39f2e82af8c283d220c12431f56d803069b4acb77081c031ae3319fc77fca7845097fd727ad0d080895bba23e873d2def8cdc216c3eed61b08761bb9ebce0282cf502aaf6ce7e8c058637958c3ea1b72fe6e8df8d37ac055db6992587fabbdc467f52475644f918863af620492f34680f2056cbcab75e2323626c094759c0e0e99ef19759527250646ad760120ba386699d53934f956b8bbc7395bb496ceb2dd223c7b501b92d36a95f8f0a02eb5ba4dddf166b9b95b4a59e72a30c63cf21e6085751923d54b30281e52a09618e6f023ba0a21675e7f989b8991588c96c2b56a78f5d2945a7baeb6a0c1bbd5d95af3ee830f5809c794a15ab4b5f89dd2be2dfdcd8fe0520fda2b3f02a1ac0155", "signature": "be0fb3308a076a61a4a92a97f6ac55327190e1341d6dd410d86b41bdaf2d3374093ef720bdb77feb7014e0f77d3b809623c7ca53e2ae4b097113e96db77a2d08" }, { "secret_key": "e965b3f257356685c98b42b964a253fc495399cc94b099c2445fc81c759c68e5", "public_key": "689f5410c8e0f4d37bc07c85d7cce6c9b63601f9bdafecaa448a5eed64afc8c6", "message": "6f20a9ad27e30dac76b30d4c19a5bd6dfd6d049213f4becdd963d72b8b2dad687b003808201d50f7dd6e599ef58ceb6068c545ed99b9e763f9b0ec1db5fcbd7d490a121ecec6bba1eb5edbd6de85364707c55e300c8b16bb2530f70898136689c988591d5391d9cc347d7931061a9b7696e2c9f35bc0d304a81c2cf954d9c3a88a22e1d67bbe0a85308477f62918c25db504e4762f0e3b4246007908ac701779006b77d72510edc69e17d0f6394c77e5551875a446f81233415d0a91a0460b51c413d644e850f8557281c46699e53b22a7c73b068ea38652cff3b0a7b8ba30971eab18fdbbd8739ee1ee0cd5cbfb7d5d41757b6331271fb7809751e203513c9970f66d91bc0ce062f4fcb28be0a699867b79594c6458a0d307acac91f413c4615877dc53e1b018da5cfce1b63f40be1e55274c4374cdfc21524499a683a231adef779d1921440e5d3fdbd5033dc983cfc931abe638c35d5a95869e9fe3d93eb90bd1861f855ce1f608b7bcad6b5e1bd97edc95ed5ddcbcb715d919f5ff77df2da438f7a3a98286dbd5b6e043fc7372f69704f09d865530f4f0edd3300f185b6d73d8716d32d32b1c9ac2ddf4f902d3f216d35a33f368095ded10be94bb53d6f256560fac2f4af0edf5c5c702143777126e7de32d07493932662129ba0e7fc7cfb36fd2ca531646e8cd2211854fc510af3b1e8cafde7a", "signed": "8d2bc4e1cd256aad8a151dec010dc93a5e5cca58298dec49cbc9c4717b5cfb5460d430be726b0f302cbd926beea19aa3c93aeb452a44f6007af49adf2f05bb046f20a9ad27e30dac76b30d4c19a5bd6dfd6d049213f4becdd963d72b8b2dad687b003808201d50f7dd6e599ef58ceb6068c545ed99b9e763f9b0ec1db5fcbd7d490a121ecec6bba1eb5edbd6de85364707c55e300c8b16bb2530f70898136689c988591d5391d9cc347d7931061a9b7696e2c9f35bc0d304a81c2cf954d9c3a88a22e1d67bbe0a85308477f62918c25db504e4762f0e3b4246007908ac701779006b77d72510edc69e17d0f6394c77e5551875a446f81233415d0a91a0460b51c413d644e850f8557281c46699e53b22a7c73b068ea38652cff3b0a7b8ba30971eab18fdbbd8739ee1ee0cd5cbfb7d5d41757b6331271fb7809751e203513c9970f66d91bc0ce062f4fcb28be0a699867b79594c6458a0d307acac91f413c4615877dc53e1b018da5cfce1b63f40be1e55274c4374cdfc21524499a683a231adef779d1921440e5d3fdbd5033dc983cfc931abe638c35d5a95869e9fe3d93eb90bd1861f855ce1f608b7bcad6b5e1bd97edc95ed5ddcbcb715d919f5ff77df2da438f7a3a98286dbd5b6e043fc7372f69704f09d865530f4f0edd3300f185b6d73d8716d32d32b1c9ac2ddf4f902d3f216d35a33f368095ded10be94bb53d6f256560fac2f4af0edf5c5c702143777126e7de32d07493932662129ba0e7fc7cfb36fd2ca531646e8cd2211854fc510af3b1e8cafde7a", "signature": "8d2bc4e1cd256aad8a151dec010dc93a5e5cca58298dec49cbc9c4717b5cfb5460d430be726b0f302cbd926beea19aa3c93aeb452a44f6007af49adf2f05bb04" }, { "secret_key": "bc3b1e0bf8d69ea5b4cbbf10bb33fc955adcbe13fc20af8a10872ce9df39d6bd", "public_key": "accd2628155919bbc7f9d86f91dafec35c711a78c79ad360eddb88fa8a180b2d", "message": "4c73e04abe0819de1f84d70541eb1bb61c4f42920e1f2d1d9e6281a8a2e8b3eb45537d83969027f99ef0ea27ca085b13f9db480f00c02f3fd7429dd567708953bbf3b9e8e2c6ac4d321ff8f9e4a3154723085a54e9c9573cc7350c09f8973f948b08730373597a5fd0349821ae0a3cd6c84992b189128f3490987e1e9ad4f6574ca538fdfd83284c1eb0953f24c08f74932d4364dbbef922542440dae80424a92eaef27c1889bd08c44f9df03a3af30dffb48fae445e625f4d9265cf387a1da35fe4c231504535db72ea81a186805f856ebe6a6a65241432530fe6c960c5f9be6c22957060304e9dd8efbc1e482e7ddbd8af03bf2382899c986d916611e4f27ae52f817ef01b6a141fe4f685d94dc8cd52830043934587704c1e642e8fe56be6d6b85bf4a6feb2b6858f1f007f99d39ea04c9fe5fa7ef1b91f495ed0e7fa4213dd68cea42b6729f95031907e27c44098094386fabfb04ab9b4de3d6861de462312c59b27c76f7b6a4fc71ea0d5daf6b7320521a67e5cb37504976ad73dae2d649feb75e2eadd3401a7f2f36e16dfbfbdb2af5716cba1bce20cd47ce1c1d7be00697001fbbeb4915aa6e5393b5ab20e0f31f5119149a2cb4c4d452c8156113ac7824f84f09aeb81202e8dd3dac0aa89399b5a38b1e218301960a37d52632eeaefe3687455464288eb17d9e19a3a72ed9de32c17be79a3b9", "signed": "6ef7f0e91f2cc6715f8e5a98574b4400c261a643e0545ff26747f8e1739899d76640b6451c43c1d03a4775b54fcf9bce18ed3fccad338b7764024fdfa2de82014c73e04abe0819de1f84d70541eb1bb61c4f42920e1f2d1d9e6281a8a2e8b3eb45537d83969027f99ef0ea27ca085b13f9db480f00c02f3fd7429dd567708953bbf3b9e8e2c6ac4d321ff8f9e4a3154723085a54e9c9573cc7350c09f8973f948b08730373597a5fd0349821ae0a3cd6c84992b189128f3490987e1e9ad4f6574ca538fdfd83284c1eb0953f24c08f74932d4364dbbef922542440dae80424a92eaef27c1889bd08c44f9df03a3af30dffb48fae445e625f4d9265cf387a1da35fe4c231504535db72ea81a186805f856ebe6a6a65241432530fe6c960c5f9be6c22957060304e9dd8efbc1e482e7ddbd8af03bf2382899c986d916611e4f27ae52f817ef01b6a141fe4f685d94dc8cd52830043934587704c1e642e8fe56be6d6b85bf4a6feb2b6858f1f007f99d39ea04c9fe5fa7ef1b91f495ed0e7fa4213dd68cea42b6729f95031907e27c44098094386fabfb04ab9b4de3d6861de462312c59b27c76f7b6a4fc71ea0d5daf6b7320521a67e5cb37504976ad73dae2d649feb75e2eadd3401a7f2f36e16dfbfbdb2af5716cba1bce20cd47ce1c1d7be00697001fbbeb4915aa6e5393b5ab20e0f31f5119149a2cb4c4d452c8156113ac7824f84f09aeb81202e8dd3dac0aa89399b5a38b1e218301960a37d52632eeaefe3687455464288eb17d9e19a3a72ed9de32c17be79a3b9", "signature": "6ef7f0e91f2cc6715f8e5a98574b4400c261a643e0545ff26747f8e1739899d76640b6451c43c1d03a4775b54fcf9bce18ed3fccad338b7764024fdfa2de8201" }, { "secret_key": "10718fa6e2d7f6ed38fd66cb6dbfa087e8f1e8a8a24fab58d79d7954b8720c3e", "public_key": "870d4f666d06fda9f9511b58602eec050d754ea6d8e79cdd19f601c477df1aa0", "message": "41259b6eef13d6ffe33cdde799b995c40be782cf978440b66be51c440582abd42f526696bb3cb92265b1ed0e4bba764cae2839830a252635dc80ce5f73d521b3d6ff03ac30e198ad20567e75a34fa825ebf9841508da84cd674236ca7b43de3564c94ab079408fd94137ce3f90a5dd5d3ac39a05ec86715a8f025e4539a7640ab88836f4efbabd5e1652c49ea21613acfe343a880ee5a42f2f9134ef4e3716b16d134a9c4c71c39b3c1a857d3c89439783eef1edd71bf4492d05fd18673a5242ff4187b9de47ad4968da49dba5a6092e95ea27ddfc7448dcf5972d9d228d63e5291ba6e6fbd07e3241f9366ca4976bb04b22d01f0dbae794fa9c1d9029f88a83602b0e0ec55e22c37b201125cadb5341ef73f6da1abbe2b1c475f0750345b1be4259d8c28531ffe7788667c410dac339918c869b00ab80f20bf7990d366f9b3d5e8eb2f48d7ed0e64b85dc9fe3bb998b1eecd1231e902d2d152e09da2d2592bdb32c8cd2e2c489496b2980c03dbb09ec7f8a4ea2c7020f2a0faa657cd6ced48d6da27864cf5e97eea9b3c2f0f34abf8d87bd2adeb60c7272fc4306d955bdc8023d7d3dc2f3dafe9ebe8a8d138965a7f6ce93517cd2099663f67c34552176ddb595ac6ea5609febcf24c7d69d412709e578670a21ac8afccb8bf2b18ff3af7de21dc71d50d60d37b6ed729db04beff7d34b2920d87551ce15", "signed": "e1659186f1f76fe43ac8a11703360fbeff53b5e57b5974aaa08e2575579c27084cf6802e7c206347314475b603197494e7d61fe4b1ee7b78e18d94469352df0c41259b6eef13d6ffe33cdde799b995c40be782cf978440b66be51c440582abd42f526696bb3cb92265b1ed0e4bba764cae2839830a252635dc80ce5f73d521b3d6ff03ac30e198ad20567e75a34fa825ebf9841508da84cd674236ca7b43de3564c94ab079408fd94137ce3f90a5dd5d3ac39a05ec86715a8f025e4539a7640ab88836f4efbabd5e1652c49ea21613acfe343a880ee5a42f2f9134ef4e3716b16d134a9c4c71c39b3c1a857d3c89439783eef1edd71bf4492d05fd18673a5242ff4187b9de47ad4968da49dba5a6092e95ea27ddfc7448dcf5972d9d228d63e5291ba6e6fbd07e3241f9366ca4976bb04b22d01f0dbae794fa9c1d9029f88a83602b0e0ec55e22c37b201125cadb5341ef73f6da1abbe2b1c475f0750345b1be4259d8c28531ffe7788667c410dac339918c869b00ab80f20bf7990d366f9b3d5e8eb2f48d7ed0e64b85dc9fe3bb998b1eecd1231e902d2d152e09da2d2592bdb32c8cd2e2c489496b2980c03dbb09ec7f8a4ea2c7020f2a0faa657cd6ced48d6da27864cf5e97eea9b3c2f0f34abf8d87bd2adeb60c7272fc4306d955bdc8023d7d3dc2f3dafe9ebe8a8d138965a7f6ce93517cd2099663f67c34552176ddb595ac6ea5609febcf24c7d69d412709e578670a21ac8afccb8bf2b18ff3af7de21dc71d50d60d37b6ed729db04beff7d34b2920d87551ce15", "signature": "e1659186f1f76fe43ac8a11703360fbeff53b5e57b5974aaa08e2575579c27084cf6802e7c206347314475b603197494e7d61fe4b1ee7b78e18d94469352df0c" }, { "secret_key": "c1d4724c6cb1bc6723b2b43034278b3c5b48fed7f8a3cc2318033e7552047351", "public_key": "c27e392e7c3664b9061ea76d2575dd7c41eaf1da3a65f3a986e0a57f6c40c17e", "message": "deee99d7a77d4300c17aec1ab323c571c6e9e73a43491a3c7888b76fc03ec43d07af42a05a2aa322d00c8560acef314106b10b9bd12654357ffa26f2390050da63d668c9e2df548f87639e096a35853f82e761fd711d2a265438f5d4db5e32775708150da6cb686a2b4ca211d7f00dc0abcb2ca150e791116a10a5efcff3514dab8ed80a7092c3a015152cb25d9f86ec0d1ca67ddab44d64eeb1f931bfab2ab188956c743db4814808c5cde1b0745b3edd340eb03ffcc80a78f3db310f4f5c20009fc0279c2c1bcb3cedf990bd0e20c6f9fb7515ad6e933b07e99da6ac32b97141187ef63bdb1062e37220a4dcd419d6244cdcc34ea41d0bcbc3138b1d54aefc0190e30b187db073aa7d6cfe04bd3fd2ac00313e3ddd64a181935ca4b8b2a85d36bc27d97b7626767b93ee38def8b6b2c8da9b00263614342faa9d3e738d2713c45ffbeef8c84bcdbc8da4309c8445530f5c617dc866251f548950a14f075aa3117f96e41f899dbe7340b1d90a1352d3b8fb41b79f16a82bc2e4a193b8a7232400996b73b1fc00b2ec1c667577f82824d39fb7f6e7692dcd97b1d8ce94083ca197e9a5d40fadff0b9ac57e9de761c156e6d31d52c332d513e9f58697dcbdd80a5e42c551702c3de7beccc3db845b1a04c8cbd41695ea7428abba89e0dce3e3d9e70230ae9147c2b88559dc695d6809a51ccbc1dd9e089c585f", "signed": "d37a6ec82ed45ca9b4855de9cb942564e883ff70a79b8e712d5f604ec8974de5363ac849cbab28e7aeeff28ed3f2d14b608b3146c2efe0735ad815c7d75a1a01deee99d7a77d4300c17aec1ab323c571c6e9e73a43491a3c7888b76fc03ec43d07af42a05a2aa322d00c8560acef314106b10b9bd12654357ffa26f2390050da63d668c9e2df548f87639e096a35853f82e761fd711d2a265438f5d4db5e32775708150da6cb686a2b4ca211d7f00dc0abcb2ca150e791116a10a5efcff3514dab8ed80a7092c3a015152cb25d9f86ec0d1ca67ddab44d64eeb1f931bfab2ab188956c743db4814808c5cde1b0745b3edd340eb03ffcc80a78f3db310f4f5c20009fc0279c2c1bcb3cedf990bd0e20c6f9fb7515ad6e933b07e99da6ac32b97141187ef63bdb1062e37220a4dcd419d6244cdcc34ea41d0bcbc3138b1d54aefc0190e30b187db073aa7d6cfe04bd3fd2ac00313e3ddd64a181935ca4b8b2a85d36bc27d97b7626767b93ee38def8b6b2c8da9b00263614342faa9d3e738d2713c45ffbeef8c84bcdbc8da4309c8445530f5c617dc866251f548950a14f075aa3117f96e41f899dbe7340b1d90a1352d3b8fb41b79f16a82bc2e4a193b8a7232400996b73b1fc00b2ec1c667577f82824d39fb7f6e7692dcd97b1d8ce94083ca197e9a5d40fadff0b9ac57e9de761c156e6d31d52c332d513e9f58697dcbdd80a5e42c551702c3de7beccc3db845b1a04c8cbd41695ea7428abba89e0dce3e3d9e70230ae9147c2b88559dc695d6809a51ccbc1dd9e089c585f", "signature": "d37a6ec82ed45ca9b4855de9cb942564e883ff70a79b8e712d5f604ec8974de5363ac849cbab28e7aeeff28ed3f2d14b608b3146c2efe0735ad815c7d75a1a01" }, { "secret_key": "37c070d4a53b13be760635110d1bd4f01920225afabec576faaec910f2926d1a", "public_key": "0aa85f2ab1dff895d1fad0c119f2bf57126aab601c528d37698e97702d35f525", "message": "10c646447f81ad94d015d86d0d98b2452dca60a47ab35264035e33a0942b954e3e23b91d8123b8593c6af7c8d3ecd290e0e5ee36fd4e53b7be633a6cf027a5ac3f0f679eb1bdd210a38ea6e48b0558e303010af474e7f6df2a4e457699fc38e36938b05ffcaa1b694e32f3d1b2cc5d00cf256f12184c873e519089ec1df15b0dc76e7bfe90780df58136fe597fce894ca563e08efa0f2d4d208bede9a874882873d251baf019fe46d1d6504b3bcd243b795351f34d2e7606aa975528ee50d59efb6ee6992a89b2426956c2ca4247e0df0129852983e9767a8eed1bc7335ffca8d0289f04807f67ca7da971f58db8b9bc9fdbe4f83cfe9a00f1ca584798bc71d851ff7cd6c51b8990aaba4d38b416b92240dfb70ee3c12b5e731057762ef90823fbf683ca06d05c20d3ae2b97a83ebe70ae17afff9d16609d546d8d3c74bc281884894f3d49e083f10ae7c11c1dca0effefcfa6e0f1535081fac3a2819fd2e3265527182ae9d391b232bb7542e68455cd267760db652d19e22fb2ed11cd1305ba8d98c1ebf2d1969b24d64f3e319af74e092006d2a3ff744872a20ebf18d17748ab7110805096ea136bce2f968b205e650b803c531d06775ae5ceea28bb92e9a0edec8951ce2009a88ee1b64d9b9e89f69051203384210a102a44d2d6703173b68507dceadd3bf6510df2a5cefd9c80e4f385b2f9e6215813ed32", "signed": "9da60cc4a64d07dee1346bd3d3010995ce2738208ab35b34c2a8fd1787ae3a1e207fe784525154fae4f5794cd8503045fea85cf77fd92f6a70cd0c5a52c0810e10c646447f81ad94d015d86d0d98b2452dca60a47ab35264035e33a0942b954e3e23b91d8123b8593c6af7c8d3ecd290e0e5ee36fd4e53b7be633a6cf027a5ac3f0f679eb1bdd210a38ea6e48b0558e303010af474e7f6df2a4e457699fc38e36938b05ffcaa1b694e32f3d1b2cc5d00cf256f12184c873e519089ec1df15b0dc76e7bfe90780df58136fe597fce894ca563e08efa0f2d4d208bede9a874882873d251baf019fe46d1d6504b3bcd243b795351f34d2e7606aa975528ee50d59efb6ee6992a89b2426956c2ca4247e0df0129852983e9767a8eed1bc7335ffca8d0289f04807f67ca7da971f58db8b9bc9fdbe4f83cfe9a00f1ca584798bc71d851ff7cd6c51b8990aaba4d38b416b92240dfb70ee3c12b5e731057762ef90823fbf683ca06d05c20d3ae2b97a83ebe70ae17afff9d16609d546d8d3c74bc281884894f3d49e083f10ae7c11c1dca0effefcfa6e0f1535081fac3a2819fd2e3265527182ae9d391b232bb7542e68455cd267760db652d19e22fb2ed11cd1305ba8d98c1ebf2d1969b24d64f3e319af74e092006d2a3ff744872a20ebf18d17748ab7110805096ea136bce2f968b205e650b803c531d06775ae5ceea28bb92e9a0edec8951ce2009a88ee1b64d9b9e89f69051203384210a102a44d2d6703173b68507dceadd3bf6510df2a5cefd9c80e4f385b2f9e6215813ed32", "signature": "9da60cc4a64d07dee1346bd3d3010995ce2738208ab35b34c2a8fd1787ae3a1e207fe784525154fae4f5794cd8503045fea85cf77fd92f6a70cd0c5a52c0810e" }, { "secret_key": "1126496a582ce58d3d618dd8a3933547aa7a8a30fb54063b8dfdd31671c6c73d", "public_key": "e10229c623fa8ad8982c3e4c36ff52df0f219b57915b6e980e5fe72ea0962e22", "message": "6a4b52d730ddab829b2a179590cbd4c372498e9f439977c0a10dc13c0ae1736eaaff063371434fd0da80360ec5890607d2fae1c9a2e1ab0b7f3d667f5b1b9c418f18b10c9e6fd669d3ebec168efef44163e577a2ebd0f2cb768f80c23188e86069e4d10f410306cedd7a341a61e0f4f3bc25041bc2f922ed073e1e2f1b709c579d10630f33071754d707894a1c62190de18882c564dc4c01dc545dd8966404ed78fa3267a9469f63b6120abb65f9b3ba3eee28d79c2eb4e7020cc6987dfc5c29672f8c0fa3e690d584fe000c64f352610179621bfd5ff3eb30d18f1a0250416db93b1c1e93cf8a3646517560d1cc8fff822b51ef27b200e987b592390753453ef138bd3d29db7cb1b5f45e4795b89c53f49704192752237c6ab274849f9594ee9777f6efe70483129d067f97199d9ae36090703864f7ca4750a6f3b6ff83824c910484394d1e2eceba18446fe4e994ce07433a740ddd05f0e396d482894e6f14acf7b97bae6c7eb88703039fa785d60a3af78b13243a4f88dde1d998617f2e3fa7eafc2f435dd4ac1ea9c238407aa09b4eea8ed434927b406674ac270458cfb3bf29c347f94559613179b9502192321b88e9af0a90e9a4ab9eddaae382e3734d1415ebe32499c34e6fdeaf15b0d9787985e08dfe495460c54f6743d81ff16881e5e30c51f4b092373783f12423c3e1ae8591130a269980caa1cb5c", "signed": "b30eb56ca9b120bf849a3a9d56af033de8a590c9e1240c1e36dbc6cf0a71b78a11ec143fb9959a8f25b57711d6a90a67e01be3a4da2b69394869bb8d64b87e0f6a4b52d730ddab829b2a179590cbd4c372498e9f439977c0a10dc13c0ae1736eaaff063371434fd0da80360ec5890607d2fae1c9a2e1ab0b7f3d667f5b1b9c418f18b10c9e6fd669d3ebec168efef44163e577a2ebd0f2cb768f80c23188e86069e4d10f410306cedd7a341a61e0f4f3bc25041bc2f922ed073e1e2f1b709c579d10630f33071754d707894a1c62190de18882c564dc4c01dc545dd8966404ed78fa3267a9469f63b6120abb65f9b3ba3eee28d79c2eb4e7020cc6987dfc5c29672f8c0fa3e690d584fe000c64f352610179621bfd5ff3eb30d18f1a0250416db93b1c1e93cf8a3646517560d1cc8fff822b51ef27b200e987b592390753453ef138bd3d29db7cb1b5f45e4795b89c53f49704192752237c6ab274849f9594ee9777f6efe70483129d067f97199d9ae36090703864f7ca4750a6f3b6ff83824c910484394d1e2eceba18446fe4e994ce07433a740ddd05f0e396d482894e6f14acf7b97bae6c7eb88703039fa785d60a3af78b13243a4f88dde1d998617f2e3fa7eafc2f435dd4ac1ea9c238407aa09b4eea8ed434927b406674ac270458cfb3bf29c347f94559613179b9502192321b88e9af0a90e9a4ab9eddaae382e3734d1415ebe32499c34e6fdeaf15b0d9787985e08dfe495460c54f6743d81ff16881e5e30c51f4b092373783f12423c3e1ae8591130a269980caa1cb5c", "signature": "b30eb56ca9b120bf849a3a9d56af033de8a590c9e1240c1e36dbc6cf0a71b78a11ec143fb9959a8f25b57711d6a90a67e01be3a4da2b69394869bb8d64b87e0f" }, { "secret_key": "9c167aff3b1b788f133d422de8ca9a64316409f9e35bfe22032ec417ae9abc6d", "public_key": "efb534f0d47c068e77b28a906d95ad8d213a4d4fc1c70542f01e596d57b5f019", "message": "68ac0fc2b607ba38e377fae845c808c8f9fa614eb1f31158a9620a937d3e301e85acaa69144bc349a39dfb582041c4a197ae99b4d4d59b7a2ca3d16228b5591cbf57c18a781efd19193c47b16c6023a3a8ba3d668f05a37f1e83b0d7febdd10f63e48ef7a20e015b1c6725d4c300a986c60e3a115469c8e52ba05b51c05d0af40d89fd9ed76f36950aee3c7819898a903cfe0361a91c69100b495141e86ee79d63d17403fb1a1629ef63cb7e9d2720cbfff0002b190bcdc26794124dd38d42bcaa7175405eb0bbcf8e37d65d05a37195b479371fa2bbbb167d91cee88235dd72ea88fc73ce3ce43d33b715f25f192ec215dac124899c5e7586e86340d8cbe53735defbe02e4cc9fde69fb9794d1db72b98c0f19766ee5138bbfa78909aa299b4913c499deaf54b4841d5044829984936700dcf92f36542b2fc7e86441b9925f5d0b78c17a85cfcfcb20b0fd751349c27463abde4d27df74265288713f96dea013b945521808b4996b1b2dc0338b6d236efd6d2b27dafda46ec5fa32b965e8bb5e8bb61bd966edeb774681e0ea8c17b8c99fa7d660f0f66c9bc6d95cbd7dc094724098eb05191b53a3df6566b9c90e0d7dff2943848b61a20d48c22b6d3c958e293d709c8f48110230ff51918562877daf6d920c85a82e07c451fe7ae9759c0a77e97bb298b5d0592a41d08f67a4ed5a1bb41e937b6a68aeb38fd5be9", "signed": "c9ae67fd6415dcbab292fab394ca6c3b7d90ca244dc6a7764e74fd202bf4b2905bd2030e6beb914c3c238db371b1cba6d9261aa392ec871a4b8b12fe9c1c970e68ac0fc2b607ba38e377fae845c808c8f9fa614eb1f31158a9620a937d3e301e85acaa69144bc349a39dfb582041c4a197ae99b4d4d59b7a2ca3d16228b5591cbf57c18a781efd19193c47b16c6023a3a8ba3d668f05a37f1e83b0d7febdd10f63e48ef7a20e015b1c6725d4c300a986c60e3a115469c8e52ba05b51c05d0af40d89fd9ed76f36950aee3c7819898a903cfe0361a91c69100b495141e86ee79d63d17403fb1a1629ef63cb7e9d2720cbfff0002b190bcdc26794124dd38d42bcaa7175405eb0bbcf8e37d65d05a37195b479371fa2bbbb167d91cee88235dd72ea88fc73ce3ce43d33b715f25f192ec215dac124899c5e7586e86340d8cbe53735defbe02e4cc9fde69fb9794d1db72b98c0f19766ee5138bbfa78909aa299b4913c499deaf54b4841d5044829984936700dcf92f36542b2fc7e86441b9925f5d0b78c17a85cfcfcb20b0fd751349c27463abde4d27df74265288713f96dea013b945521808b4996b1b2dc0338b6d236efd6d2b27dafda46ec5fa32b965e8bb5e8bb61bd966edeb774681e0ea8c17b8c99fa7d660f0f66c9bc6d95cbd7dc094724098eb05191b53a3df6566b9c90e0d7dff2943848b61a20d48c22b6d3c958e293d709c8f48110230ff51918562877daf6d920c85a82e07c451fe7ae9759c0a77e97bb298b5d0592a41d08f67a4ed5a1bb41e937b6a68aeb38fd5be9", "signature": "c9ae67fd6415dcbab292fab394ca6c3b7d90ca244dc6a7764e74fd202bf4b2905bd2030e6beb914c3c238db371b1cba6d9261aa392ec871a4b8b12fe9c1c970e" }, { "secret_key": "e9948805eb341b2867479c668fd3532c309941c0ad4cb2e54231756e6a1bdecb", "public_key": "5447a8e34d6a640002d8d60bcf1ddc711e4c465c94c34b50bdef358960ff81f1", "message": "91cffd7eb1cf6bd4756bce6a30af9dfba26ddd1cce0394c194a3e39cc3d1cbc221b7eb70bea18d29c267457176a3c9e53c18e47d10a67c464505197702e6b2470d38869db5174b158f9992e4435d02246f540258dedd3ce33df582555a681fb76ecaccb1c2989b177e3b7e454aaa529de59bf5a03123d571df2e7f7cb830805c58b74a653bac0e5a888e08dc2236d6cd496aa06d0d67cf3b335e218c49dedad82fc1be9ef20cac61905c30eb132d739b16ca8a8c906619c0e0d8b33985327e36f3d4b8fda387c186cc50443104db761f7ff9301270204a713e58902101fad000ce931647c577fdec148dca95cdc08918ebed037c60332fadf088f036083ebc92e173b7ddcc30c493f27e69cd17a20d30b78f83a72e4f5a747d86d96c5e1bb7a438166204013e2164d6aabc0d562f54015c365c80445607145e5692ee34f6353077fab7452d88ce3eb01d2b3797dc91b341a3a726301516baae18e851f74dfbdf0866bb2376867de55231e362c472c52116544cd4f81e93571c4ec820e7e653f4e21be0a942576c9de91e7d1251683d859de448f822dcf3d2cf55ede2f9c71b6063d1373061f8f5936b698d1384e65459ea2bc26ec96775ef425207432dda0ac1fe28526c5e4559349c3d8df9918230f4044683cc2c1b858d141ab8d0805bb9336067522aa89c810f3eaa7ac2d8dd28c3751225a19ecec8bcca52439946", "signed": "d3dc62d6ce9c766f2abaf9a7fbe09d6bdb07a4747b56080db09beb4a4e804a70d7ddf4119475c7be834f31956f4a71dad029cdf2363dd0365ce22dc27f07800391cffd7eb1cf6bd4756bce6a30af9dfba26ddd1cce0394c194a3e39cc3d1cbc221b7eb70bea18d29c267457176a3c9e53c18e47d10a67c464505197702e6b2470d38869db5174b158f9992e4435d02246f540258dedd3ce33df582555a681fb76ecaccb1c2989b177e3b7e454aaa529de59bf5a03123d571df2e7f7cb830805c58b74a653bac0e5a888e08dc2236d6cd496aa06d0d67cf3b335e218c49dedad82fc1be9ef20cac61905c30eb132d739b16ca8a8c906619c0e0d8b33985327e36f3d4b8fda387c186cc50443104db761f7ff9301270204a713e58902101fad000ce931647c577fdec148dca95cdc08918ebed037c60332fadf088f036083ebc92e173b7ddcc30c493f27e69cd17a20d30b78f83a72e4f5a747d86d96c5e1bb7a438166204013e2164d6aabc0d562f54015c365c80445607145e5692ee34f6353077fab7452d88ce3eb01d2b3797dc91b341a3a726301516baae18e851f74dfbdf0866bb2376867de55231e362c472c52116544cd4f81e93571c4ec820e7e653f4e21be0a942576c9de91e7d1251683d859de448f822dcf3d2cf55ede2f9c71b6063d1373061f8f5936b698d1384e65459ea2bc26ec96775ef425207432dda0ac1fe28526c5e4559349c3d8df9918230f4044683cc2c1b858d141ab8d0805bb9336067522aa89c810f3eaa7ac2d8dd28c3751225a19ecec8bcca52439946", "signature": "d3dc62d6ce9c766f2abaf9a7fbe09d6bdb07a4747b56080db09beb4a4e804a70d7ddf4119475c7be834f31956f4a71dad029cdf2363dd0365ce22dc27f078003" }, { "secret_key": "b01753efa73bb3de7aa778be7afcbff66a5d3e2c2f8b5aa2b048844050996965", "public_key": "d0cc6cf109c999fbf6d16f471fafd0232b0a68d4c46406ec7545dbaba8194158", "message": "684e612f27eead0d34844cc81ba911c28aaf6d66e71229e8cc3462f7c7a050daa30cb74471150f07dad459b5a91358476c0598255d8a642dd7c0802811bd88e4cac597efe41ebd96cd0f3b5ce72db4be1a3dbd6b84f5446e3da600d3b1d2b460a009bd31cacd98a91518ce33e9a703d404288736ccc43103fc69e67974f31652fa3dadef3337f6c897a3d201303c8f03597b4a87c98f291ccd58a3f1e898332aa5993b47fcb5ddaa1c0868b643742d0e4a4b9cd427038b3b74999bc89ac3484c0ca13f25aae8e78ae1ccee6218accab81a4f694f5324a347629d49b55e4037504a9acc8df58c6841dddcd4fc4347f7b6f1fd9de0564577e6f329ed951a0a6b9124ff63e22eb36d3a8863bc1bf69cea24c605967e7d8948953f27d5c4c75f0849f872a3e3d16d422fa5a11e1b9a74df6f38b90f277d81fce8437a14d99d2bef189d7cac83ddc61377ed348b3c4fc09ec2b9005925d04a71e26d641667bdf549294331c6ea01cd5c0bd1b6a7ecfda20b0f1929582b74697cb262c3927d6b223f4b5f3043aa6eb4571a78e9da11c2b36f64552580caa7b5fa6b90f929e0162e608d1240d7242cd2f47025c03debe059b1dc94770232bc6765148480bb1d9f50da1ee6448cf9c88b19dd459932c06ed811c4a64a12d5938bd1c757bcfaeaee8933fe5fff21763de740482bcf1ba59afdc8fcf873c3d507bb394e32e45f736519", "signed": "16b7421227ae09130685cbb1a0c60aa57a5e1afe1bbe6bacea0c281bcc8998e6824a772c3208a6b6b4d236695505c9be82700cf93a783985a39e16e377a7410e684e612f27eead0d34844cc81ba911c28aaf6d66e71229e8cc3462f7c7a050daa30cb74471150f07dad459b5a91358476c0598255d8a642dd7c0802811bd88e4cac597efe41ebd96cd0f3b5ce72db4be1a3dbd6b84f5446e3da600d3b1d2b460a009bd31cacd98a91518ce33e9a703d404288736ccc43103fc69e67974f31652fa3dadef3337f6c897a3d201303c8f03597b4a87c98f291ccd58a3f1e898332aa5993b47fcb5ddaa1c0868b643742d0e4a4b9cd427038b3b74999bc89ac3484c0ca13f25aae8e78ae1ccee6218accab81a4f694f5324a347629d49b55e4037504a9acc8df58c6841dddcd4fc4347f7b6f1fd9de0564577e6f329ed951a0a6b9124ff63e22eb36d3a8863bc1bf69cea24c605967e7d8948953f27d5c4c75f0849f872a3e3d16d422fa5a11e1b9a74df6f38b90f277d81fce8437a14d99d2bef189d7cac83ddc61377ed348b3c4fc09ec2b9005925d04a71e26d641667bdf549294331c6ea01cd5c0bd1b6a7ecfda20b0f1929582b74697cb262c3927d6b223f4b5f3043aa6eb4571a78e9da11c2b36f64552580caa7b5fa6b90f929e0162e608d1240d7242cd2f47025c03debe059b1dc94770232bc6765148480bb1d9f50da1ee6448cf9c88b19dd459932c06ed811c4a64a12d5938bd1c757bcfaeaee8933fe5fff21763de740482bcf1ba59afdc8fcf873c3d507bb394e32e45f736519", "signature": "16b7421227ae09130685cbb1a0c60aa57a5e1afe1bbe6bacea0c281bcc8998e6824a772c3208a6b6b4d236695505c9be82700cf93a783985a39e16e377a7410e" }, { "secret_key": "4f4b20d899366f2f23ee628f229b236cf80f43ba183177c97ee34829546f1742", "public_key": "c94576641f4a893cdfcee7b39fc21929b86b349976d7b0a46d39a588bcfe4357", "message": "db8ef02e3033e6b96a56cab05082fb4695f4a1c916250dd75173f430a10c9468817709d37623346ae8245b42bda0da6b60462ccfdfc75a9ab994e66c9ab9fecdd8599610910affe4f10215cb280bf8f9f2700a444796dae93e06c6bea7d8b4fe1301baa79ccec769368feb2442c7de84f095e6b3bff63d388cbafb2b9809dc38e9b12ebd039c0a57f4d522e91ec8d1f2b8d23a4a0ae059af85393bb0a15f749110f6774a1fd731a6ec213e4ff435daab546d31ed9ec3b6d8cc2edacebf4facc5566556eea92e5b3f2542239b25e28012dd4ef40072eebf83ed2a255181f3a442189d68c6c609f4dfdf3db7d67d087a2fcd6d2dc50bbfed8bfbbfcb74d3c41f02a87865b13b8efcf5c3581257be0aa913f60c370527bde11a475c136a17c5eefeb03f5bff28693ed841e8ed1f7c29102f5599dd444009bcea6a92d5574152458e0caf8a36aa72b5dc4908a6461c9b741453005c8fbcc68113ae184208ee14b835480c6efafed18a76000b38e5858290f4d51f52f096cbe490e1eb5cacb226ec495a55a7fa457843d57fab67f8be7e209334785bdd665d7b63e4daf57b6e78928b603c8c0f9bc85464733b61273ef9e2b8a0cd7c3bf8ee0a6872e34d5a27a625e35eaf7ff5440b8b141af704df70c9c18623bd11209513192505105cd7bcfa5f0d919da706948fbe1f761f315846aa3b4813dd9ba3d81b9204e5409c0382b6eb", "signed": "0f80ff5d17488fe26f93c543b04ed959b5f0643fc61c7f2c3bc60132ba9c6210c8b250ea5e84d07b01de68bc174414eeeb31fdc2ba6823e231e312a91ededd02db8ef02e3033e6b96a56cab05082fb4695f4a1c916250dd75173f430a10c9468817709d37623346ae8245b42bda0da6b60462ccfdfc75a9ab994e66c9ab9fecdd8599610910affe4f10215cb280bf8f9f2700a444796dae93e06c6bea7d8b4fe1301baa79ccec769368feb2442c7de84f095e6b3bff63d388cbafb2b9809dc38e9b12ebd039c0a57f4d522e91ec8d1f2b8d23a4a0ae059af85393bb0a15f749110f6774a1fd731a6ec213e4ff435daab546d31ed9ec3b6d8cc2edacebf4facc5566556eea92e5b3f2542239b25e28012dd4ef40072eebf83ed2a255181f3a442189d68c6c609f4dfdf3db7d67d087a2fcd6d2dc50bbfed8bfbbfcb74d3c41f02a87865b13b8efcf5c3581257be0aa913f60c370527bde11a475c136a17c5eefeb03f5bff28693ed841e8ed1f7c29102f5599dd444009bcea6a92d5574152458e0caf8a36aa72b5dc4908a6461c9b741453005c8fbcc68113ae184208ee14b835480c6efafed18a76000b38e5858290f4d51f52f096cbe490e1eb5cacb226ec495a55a7fa457843d57fab67f8be7e209334785bdd665d7b63e4daf57b6e78928b603c8c0f9bc85464733b61273ef9e2b8a0cd7c3bf8ee0a6872e34d5a27a625e35eaf7ff5440b8b141af704df70c9c18623bd11209513192505105cd7bcfa5f0d919da706948fbe1f761f315846aa3b4813dd9ba3d81b9204e5409c0382b6eb", "signature": "0f80ff5d17488fe26f93c543b04ed959b5f0643fc61c7f2c3bc60132ba9c6210c8b250ea5e84d07b01de68bc174414eeeb31fdc2ba6823e231e312a91ededd02" }, { "secret_key": "d2e01d2578b625a7060aabc25765f168c680cef767aa97ca0e5eb3d667474b2a", "public_key": "191ac223575424aa354b255b812dd3025d70ed829e0826c01629f9df3545082b", "message": "20d5dd699b2853302a6817094d5ea512bdf8534504cb289c602467410740ec7eb8ea6442c80f145935068f9122fdf4a39f2010f33db55b814d97bf2e5872329f1126d4eb95b806ca1973113165b116be8716371f81331779dc79a5cb3942081ab5f207f6b53db0e0038107d63ca97708181982dcb5f3b93010ec6edfb2cfd31cab00090b3c38515f9781769686cb17ab81d54a8b775754d42fbad086b80b28d636f78b7eb77ed9ca35b6843a510f0ad0ac1b20267a000301b3c707a20f0214d59b5b8199c2f9ee25d32060ace3e0f2594650416a00716cd3f98604a5e104b33310fdae94c314013cdca5ba2414409eb7f1901394f007d6fa0a29dbe8ec3df98c393c8d72695877cc9baf491ef30ef7db3371608ca97cc621562520ee581d5d1cdbc78232d6c7e43937b2cc8549e6f1e08df5f2eac844fe0f822b2483ad0a5de33be64089490e77d69800fae2589ee58712ac15a3f19e6ffdbca42fe1894e889b94c04b04240dafb0b2730c236b8cceb2cb97afd1d515dc19d1067fd4aba8ce297fd6d110b35a21bd3c075c577d93fe1df77d648f7119492099b017af44eba09c807f11a4c3f4a11a2fff306a728ba78983323c92a2fd5fcc80c18d423426f823a73fe04094955284293f5f6b3ca4ff1080dbb1e4c6f74c1d935ed21e30094c7de336b82dd8200b0d659583c5bfd5470f9db342e70ec4000742c5640a214e3c2e", "signed": "87a010394a9f2c904effefca9fb4d5ce13793301a4925ba51db119123a4d730abf764ce065e48d90a79d907d7254c40cc358987a46949e928bbb3cd085dfab0620d5dd699b2853302a6817094d5ea512bdf8534504cb289c602467410740ec7eb8ea6442c80f145935068f9122fdf4a39f2010f33db55b814d97bf2e5872329f1126d4eb95b806ca1973113165b116be8716371f81331779dc79a5cb3942081ab5f207f6b53db0e0038107d63ca97708181982dcb5f3b93010ec6edfb2cfd31cab00090b3c38515f9781769686cb17ab81d54a8b775754d42fbad086b80b28d636f78b7eb77ed9ca35b6843a510f0ad0ac1b20267a000301b3c707a20f0214d59b5b8199c2f9ee25d32060ace3e0f2594650416a00716cd3f98604a5e104b33310fdae94c314013cdca5ba2414409eb7f1901394f007d6fa0a29dbe8ec3df98c393c8d72695877cc9baf491ef30ef7db3371608ca97cc621562520ee581d5d1cdbc78232d6c7e43937b2cc8549e6f1e08df5f2eac844fe0f822b2483ad0a5de33be64089490e77d69800fae2589ee58712ac15a3f19e6ffdbca42fe1894e889b94c04b04240dafb0b2730c236b8cceb2cb97afd1d515dc19d1067fd4aba8ce297fd6d110b35a21bd3c075c577d93fe1df77d648f7119492099b017af44eba09c807f11a4c3f4a11a2fff306a728ba78983323c92a2fd5fcc80c18d423426f823a73fe04094955284293f5f6b3ca4ff1080dbb1e4c6f74c1d935ed21e30094c7de336b82dd8200b0d659583c5bfd5470f9db342e70ec4000742c5640a214e3c2e", "signature": "87a010394a9f2c904effefca9fb4d5ce13793301a4925ba51db119123a4d730abf764ce065e48d90a79d907d7254c40cc358987a46949e928bbb3cd085dfab06" }, { "secret_key": "7cd7ec99dd03aede1ff1073ec2ca7010276e947e2aa9b0e65f877e4ccf1b3a14", "public_key": "e4c39dbe9493176b8213f1422a9de7c74fb6a59190fcdbf637c7ad5ee165c04f", "message": "a6034aa3c2484923e80e90e5a8e1748350b4f2c3c8319faf1a2e3295150a68e1eeca1bc84954cc89d4731a7f6512af01464fdbce5df68ee8066ad9a2fd21c0835a76559ca1c7449a933bcb15af90223d925ff61cd83eb935698347a57072709a86b4e5a7a626e07a3f2e7e341c7783a540f84aa73e917e867bb80bace6254705a9d1a1185de56e1a4e78aaf539e749b8f765bd052c4cd15b638bf8ecf87d9814606fed5a69f4dae9da47f3806dd90be64fccd3365cbe9e01c588fe65d6b603280740962aa8ddb95a3f4f674c03bc4043092c544595568270a2c2a8aa06e3f67c31998c50b9a58acad00690d3848114cb193293c8ac21016fd996f5c64214064f82167b2c920cd8a839755852ac77c3d90526dd3adb96837cf4e726f34bd02955cbac5b82c92cf4aa8b54bb6e436dae9bf893ef050c6f135a7e62fcd834dac1d2be8b8e59d696131811701c4318bb6e9b5a20bec656fd2ba192e2732f422963bed4a4fd1ec9326398dce290e0848c70ea236c04c7dbb3b67921440c98d72753f6a332eaad59fd0f57742923fb625fef070f34225ea06c2363d123666b99ac7d5e550da1e404e526b5b229cb130b84b1903e431cdb15b33770f5811d49fbd50d60a3474c0c35fc021d8681819ec794cc32a634bc46a955aa0246b4ff1124623cbafb3cb9d3b92a90fde648e414636192952a92291e5f86efddb89ca078aea7717fc7", "signed": "6f99202770964535e483a0ee01a529442eb321303fa805d475604d7fc728a9103fb7b558b955f4d03719eefaa3b7ed5b0da75710bb98787f5c2282ed66e9f60ca6034aa3c2484923e80e90e5a8e1748350b4f2c3c8319faf1a2e3295150a68e1eeca1bc84954cc89d4731a7f6512af01464fdbce5df68ee8066ad9a2fd21c0835a76559ca1c7449a933bcb15af90223d925ff61cd83eb935698347a57072709a86b4e5a7a626e07a3f2e7e341c7783a540f84aa73e917e867bb80bace6254705a9d1a1185de56e1a4e78aaf539e749b8f765bd052c4cd15b638bf8ecf87d9814606fed5a69f4dae9da47f3806dd90be64fccd3365cbe9e01c588fe65d6b603280740962aa8ddb95a3f4f674c03bc4043092c544595568270a2c2a8aa06e3f67c31998c50b9a58acad00690d3848114cb193293c8ac21016fd996f5c64214064f82167b2c920cd8a839755852ac77c3d90526dd3adb96837cf4e726f34bd02955cbac5b82c92cf4aa8b54bb6e436dae9bf893ef050c6f135a7e62fcd834dac1d2be8b8e59d696131811701c4318bb6e9b5a20bec656fd2ba192e2732f422963bed4a4fd1ec9326398dce290e0848c70ea236c04c7dbb3b67921440c98d72753f6a332eaad59fd0f57742923fb625fef070f34225ea06c2363d123666b99ac7d5e550da1e404e526b5b229cb130b84b1903e431cdb15b33770f5811d49fbd50d60a3474c0c35fc021d8681819ec794cc32a634bc46a955aa0246b4ff1124623cbafb3cb9d3b92a90fde648e414636192952a92291e5f86efddb89ca078aea7717fc7", "signature": "6f99202770964535e483a0ee01a529442eb321303fa805d475604d7fc728a9103fb7b558b955f4d03719eefaa3b7ed5b0da75710bb98787f5c2282ed66e9f60c" }, { "secret_key": "e3ca3713a2fd412ad5336bc356b77be027d5b70815b3ac2aecd8340ef5f889b1", "public_key": "1d516cb8bef116a0c1b6929009933f6eb62c23050745fe7e8d3c631623778111", "message": "dd99baf295e013eed107ba8af81121aaf1835a3cca24f8e464b4cfcaa3c7bffe6f9536016d1c8cf375038c9327e8e21b004066f5eac0f76a3e8edfb07be8bd2f6bc79c3b456de82595e2c2105bb1b0aaba5eeee1adef752167d633b322ebf8f7cd5fbf59508fdbdbecf25e657a9c7050af26a80a085b0817c6217e39acd54cb9fa09540fc7bdc5226d6a276d492cc8a3dffc2abc6d0b9fb08cbccdd9432e449821a5dc98cfb3a418e539c890fe5a0446b9f81d306700927ade61cfdcc0624f13b5840748774604805731d92e77d5def66be44cc817946f1cd758196cf480f99e7117835c4c87cbd64077a562a80cf11d8ca65be7a94d92b9ddaea997e93f1448577ed6d8436b2f3144692c1fd7d28a03e9274bc9e8669d8575f5de20cfbdbcb04e9f39f3451d7048375e2698e722846cb4f2d19a810c53d4c1a6c3b770fb402df0530e7b2907223fd0899e00cb188ca80c1531b4e37fba176c17a2b8f5a3ddc7a9188d48ffc2b272c3da9c9b89dfe53f2fe7e3672f91d11818491ace140adcae98502e114f4b352b90e2e7fbd333b2459e7f15dd0764c9c34e4cb7cc095500cda035e8e2e4e3c8fd5df5f3aa579a735dd8a9f19ef336fa971114e46618734a4c13d30c81128ca21def47330103d23d80ffe67421a6ccf9f36a93f05603c599ee10b03451f36b2133c187a79ad9e6fdfbb12595ab73bb3e2e2e43030fd37e591cf55d", "signed": "b3857ea61baa9e62838c4e3a996502d3364fe1ec594258355073dd10e497c600befb1f8f233fd6e3b2c87f10dcb7261aaf3481bfd0902605accc900fef84d407dd99baf295e013eed107ba8af81121aaf1835a3cca24f8e464b4cfcaa3c7bffe6f9536016d1c8cf375038c9327e8e21b004066f5eac0f76a3e8edfb07be8bd2f6bc79c3b456de82595e2c2105bb1b0aaba5eeee1adef752167d633b322ebf8f7cd5fbf59508fdbdbecf25e657a9c7050af26a80a085b0817c6217e39acd54cb9fa09540fc7bdc5226d6a276d492cc8a3dffc2abc6d0b9fb08cbccdd9432e449821a5dc98cfb3a418e539c890fe5a0446b9f81d306700927ade61cfdcc0624f13b5840748774604805731d92e77d5def66be44cc817946f1cd758196cf480f99e7117835c4c87cbd64077a562a80cf11d8ca65be7a94d92b9ddaea997e93f1448577ed6d8436b2f3144692c1fd7d28a03e9274bc9e8669d8575f5de20cfbdbcb04e9f39f3451d7048375e2698e722846cb4f2d19a810c53d4c1a6c3b770fb402df0530e7b2907223fd0899e00cb188ca80c1531b4e37fba176c17a2b8f5a3ddc7a9188d48ffc2b272c3da9c9b89dfe53f2fe7e3672f91d11818491ace140adcae98502e114f4b352b90e2e7fbd333b2459e7f15dd0764c9c34e4cb7cc095500cda035e8e2e4e3c8fd5df5f3aa579a735dd8a9f19ef336fa971114e46618734a4c13d30c81128ca21def47330103d23d80ffe67421a6ccf9f36a93f05603c599ee10b03451f36b2133c187a79ad9e6fdfbb12595ab73bb3e2e2e43030fd37e591cf55d", "signature": "b3857ea61baa9e62838c4e3a996502d3364fe1ec594258355073dd10e497c600befb1f8f233fd6e3b2c87f10dcb7261aaf3481bfd0902605accc900fef84d407" }, { "secret_key": "29a63dcd48a351771411fddcab46bb071e91498576e8d02f8b6044f5bdd3ed90", "public_key": "3923fdcc2a9fe5cabf6e9932e46dbd2b7f3632500f9d95552db2b045bc41166f", "message": "ff18ca0c204c8386a4aa74ec4573c7b69216b31470daedd96a4f2302116c7955d72dacc88e3714550c09e6f7b9a8586260dc7e63da4c633bae0162e116e5c1797b78d87d47ffeea3d7819df9c852f0ff30936a105d3af5531a8f89549711c14c2d3ee11564e7c8525bd58864009762a05541d8e07ad841a55a6a9a007ef209ccec4b5640babe35651b61df42de4d910ee73a933c0b74e995757e84a99eb034f41807183c90ca4ea8d84cdba478613c8e587cb5f8fb6a055081da6e90220d5d86e34e5f91e488bd12c7a1a6b3c9fce5305e85346658effa810d0e8a2a039db4a4c94965be4011f9d5e5da266233e6c4e18ed4f8a25a57e40a591c7ed590c0f8b1a119c7c9747f691b02196cd18e6945213f1d4c8c9579c6e0a2ac45924128d6d92c8e4c66065320353d48d1d5e13194d905f837078f8dac0b68cf96ae9e70554c14b2fa29b19630e4b0f5d2a767e190efbc5992c709dcc99aa0b5aaf4c49d5513e174fd604236b05b48fcfb55c9af10596927bcfad30bacc99b2e0261f97cf297c177f1929da1f68db9f99ac62ff2de3bb40b186aa7e8c5d6123980d759927a3a07aa208beeb736795ae5b849d5dae5e3573710aaa24e96d5791e2730d0270f5b0a2705ba515d14aa7e6fa6622375377f9aba64d02569a209d33de686e089ec60118e4814ffc6c0778c6427bce2b6b844cfcd5a7ced0e35303f50a0dfe5df5dde1a2f23", "signed": "12bf629593e2caadc910ec40bfe2b7a62514126b16ba3a438d88e2d21f595aaee8abfa4af2ec870361d0ea04dfc8c6a330fb2841c2d8211a64fa1e7e7d273800ff18ca0c204c8386a4aa74ec4573c7b69216b31470daedd96a4f2302116c7955d72dacc88e3714550c09e6f7b9a8586260dc7e63da4c633bae0162e116e5c1797b78d87d47ffeea3d7819df9c852f0ff30936a105d3af5531a8f89549711c14c2d3ee11564e7c8525bd58864009762a05541d8e07ad841a55a6a9a007ef209ccec4b5640babe35651b61df42de4d910ee73a933c0b74e995757e84a99eb034f41807183c90ca4ea8d84cdba478613c8e587cb5f8fb6a055081da6e90220d5d86e34e5f91e488bd12c7a1a6b3c9fce5305e85346658effa810d0e8a2a039db4a4c94965be4011f9d5e5da266233e6c4e18ed4f8a25a57e40a591c7ed590c0f8b1a119c7c9747f691b02196cd18e6945213f1d4c8c9579c6e0a2ac45924128d6d92c8e4c66065320353d48d1d5e13194d905f837078f8dac0b68cf96ae9e70554c14b2fa29b19630e4b0f5d2a767e190efbc5992c709dcc99aa0b5aaf4c49d5513e174fd604236b05b48fcfb55c9af10596927bcfad30bacc99b2e0261f97cf297c177f1929da1f68db9f99ac62ff2de3bb40b186aa7e8c5d6123980d759927a3a07aa208beeb736795ae5b849d5dae5e3573710aaa24e96d5791e2730d0270f5b0a2705ba515d14aa7e6fa6622375377f9aba64d02569a209d33de686e089ec60118e4814ffc6c0778c6427bce2b6b844cfcd5a7ced0e35303f50a0dfe5df5dde1a2f23", "signature": "12bf629593e2caadc910ec40bfe2b7a62514126b16ba3a438d88e2d21f595aaee8abfa4af2ec870361d0ea04dfc8c6a330fb2841c2d8211a64fa1e7e7d273800" }, { "secret_key": "c7188fdd80f4cd31839ec958671e6dd08b21f9d7528c9159143734f94b169883", "public_key": "019752ff829b6859b9058d00c2795e835655440675753f37e85eb7bc5839c4ca", "message": "4af5dfe3feaabe7f8fcd38308e0bd385cad3811cbdc79c944ebfe3cd675cf3afbef4542f542975c2e2a6e66e26b32ac3d7e19ef74c39fa2a61c56841c2d8212e2bd7fb49cfb25cc3609a693a6f2b9d4e22e2099f80b777d3d05f33ba7db3c5ab55766ceb1a1322af726c565516ce566329b98fc5dc4cbd93cefb627688c977af9367b5c69659e43cb7ee754711d665c0032ae22934f44c71d31178ef3d9810912874b62fa5e4020e6d5d6458183732c19e2e89685e0464e91a9b1c8d5251e24e5f91813f5019a740a04b5d91cbb8309e5161bba79dcab38239a091f50e099ff819e3a7b5205fe907cdfe9c0dc3ee85e32d7bcd3ce02635e2058388031e317fbf22ab9f39f7f7e3cd1a11a9c1f45f4e1e42d2536c122c591837911847108ceafd990813c2b6344cffc34be37161dd815626900e8fcb85c21afb4f6be8ad01516a31c2a6580315857c6a216735ca991009dbc2ea5034160747a869d5cadb0b47ffbd5d3ac97fdd0526cae6eaa35cff7a16eaf4fb950ca31511346fea6141999a3f754e6281cfba15e8a826932c589c5d247c909d94b4eab7ebcb09077648af065c2d86611eb588453ed7c24780d73c689c8744afd533a86d9ee9e3365732cbd0c351e436f898b7043292097e03e6081a23ac865e19dc8858969b999d01fa65ef200c3f269c818e30b9365ecc683bcfe69c203b4e0ab6fe0bb871e8ecaaae82d3acd35d5b50", "signed": "35c170dd0c6dc2920a595775d8e2dd65243e9c1bf96ef42779001ed45f01b7dfebd6f6a7dc2d386ef4d2a56779ebe77f54e5aecfda2d54a068476b24dbd78b0c4af5dfe3feaabe7f8fcd38308e0bd385cad3811cbdc79c944ebfe3cd675cf3afbef4542f542975c2e2a6e66e26b32ac3d7e19ef74c39fa2a61c56841c2d8212e2bd7fb49cfb25cc3609a693a6f2b9d4e22e2099f80b777d3d05f33ba7db3c5ab55766ceb1a1322af726c565516ce566329b98fc5dc4cbd93cefb627688c977af9367b5c69659e43cb7ee754711d665c0032ae22934f44c71d31178ef3d9810912874b62fa5e4020e6d5d6458183732c19e2e89685e0464e91a9b1c8d5251e24e5f91813f5019a740a04b5d91cbb8309e5161bba79dcab38239a091f50e099ff819e3a7b5205fe907cdfe9c0dc3ee85e32d7bcd3ce02635e2058388031e317fbf22ab9f39f7f7e3cd1a11a9c1f45f4e1e42d2536c122c591837911847108ceafd990813c2b6344cffc34be37161dd815626900e8fcb85c21afb4f6be8ad01516a31c2a6580315857c6a216735ca991009dbc2ea5034160747a869d5cadb0b47ffbd5d3ac97fdd0526cae6eaa35cff7a16eaf4fb950ca31511346fea6141999a3f754e6281cfba15e8a826932c589c5d247c909d94b4eab7ebcb09077648af065c2d86611eb588453ed7c24780d73c689c8744afd533a86d9ee9e3365732cbd0c351e436f898b7043292097e03e6081a23ac865e19dc8858969b999d01fa65ef200c3f269c818e30b9365ecc683bcfe69c203b4e0ab6fe0bb871e8ecaaae82d3acd35d5b50", "signature": "35c170dd0c6dc2920a595775d8e2dd65243e9c1bf96ef42779001ed45f01b7dfebd6f6a7dc2d386ef4d2a56779ebe77f54e5aecfda2d54a068476b24dbd78b0c" }, { "secret_key": "38ba0621704d2155fc2f78555196575de06d80255c35e9dc965b6fe96a4d5389", "public_key": "4388f7f68a9effbc366e42d907015604daced1727cd1d89d74adcc789fd7e6e1", "message": "ed4c2683d644b05b39b048ef1f8b7025f280ca7e8ff72cb7eda99329fb7954b700400705275f20b858cf7e349a3510665b630609c5e2e62069263ab9c55e4123a564dca6348c8a01332075e7a5bec9c20a03807957fefa910e60c35ae579778ce2ce42e6a69a1b647681e43ec4b63bd5fbefabb31712cb3d6419ead78dd41c8a92aaceb63cbfa89d2af39606de010a397e302053a615c16e5e95ad9935c079a0b8103125789471a1e3574f429b29e4d225c7723fbb3cf88cbd73823d9f0b6c7d05d00bdeb0fb0ad3d7132033183e21f6c1e8d8e4c0a3e4f52f5001da687171345c6dc8b42c42a60d1f1ffa8fe3e7bcece59a035878f9d4d81127e22496a49bfcf6bf8b46a80bd562e65255071f9d11a9eb0481f4626d4d71ffc38afe6e358a4b289179cbce9764d86b57ac0a0c827e8ff078813306a1d5fadd32b46a1fbcd789ff8754063eecfe45313beb6601c3a3010e8eb97c8effbd140f1e688311092d273c4defca47da6f1f0825744676f9a280b6c2a814fa47fabc1980d0b37f087a53ca8778f39ffb474ff5f1171b442c76dd008d92182f644a714a0f011e215a78b97af37b33520ebf43372a5ab0cf70dcc1dc2f99d9e4436658f8e07cdf0b9ea4dd6224c209e7521b981ee351c3c2df3a50040527fcd72804176046405db7f6734e85c5d390f520b0c08dcbfa98b8742480d5e46f9be893f6d6614340f8161611d5053df41ce4", "signed": "42bed6a98786f664715f39bb643c405ae1750056460e700469c810389504c51cffd9e1a94c38f692fb316265316d8f4dc3ad1cdd8a6d5991ef010cd1489d7c09ed4c2683d644b05b39b048ef1f8b7025f280ca7e8ff72cb7eda99329fb7954b700400705275f20b858cf7e349a3510665b630609c5e2e62069263ab9c55e4123a564dca6348c8a01332075e7a5bec9c20a03807957fefa910e60c35ae579778ce2ce42e6a69a1b647681e43ec4b63bd5fbefabb31712cb3d6419ead78dd41c8a92aaceb63cbfa89d2af39606de010a397e302053a615c16e5e95ad9935c079a0b8103125789471a1e3574f429b29e4d225c7723fbb3cf88cbd73823d9f0b6c7d05d00bdeb0fb0ad3d7132033183e21f6c1e8d8e4c0a3e4f52f5001da687171345c6dc8b42c42a60d1f1ffa8fe3e7bcece59a035878f9d4d81127e22496a49bfcf6bf8b46a80bd562e65255071f9d11a9eb0481f4626d4d71ffc38afe6e358a4b289179cbce9764d86b57ac0a0c827e8ff078813306a1d5fadd32b46a1fbcd789ff8754063eecfe45313beb6601c3a3010e8eb97c8effbd140f1e688311092d273c4defca47da6f1f0825744676f9a280b6c2a814fa47fabc1980d0b37f087a53ca8778f39ffb474ff5f1171b442c76dd008d92182f644a714a0f011e215a78b97af37b33520ebf43372a5ab0cf70dcc1dc2f99d9e4436658f8e07cdf0b9ea4dd6224c209e7521b981ee351c3c2df3a50040527fcd72804176046405db7f6734e85c5d390f520b0c08dcbfa98b8742480d5e46f9be893f6d6614340f8161611d5053df41ce4", "signature": "42bed6a98786f664715f39bb643c405ae1750056460e700469c810389504c51cffd9e1a94c38f692fb316265316d8f4dc3ad1cdd8a6d5991ef010cd1489d7c09" }, { "secret_key": "ae331fc2a14759b73f1cd965e48514e12b29f63b06ccfc0ad49f36820e57ec72", "public_key": "08803d48238eda3f9cebb628530121de00f0f0468c202d88528b8bcec687a903", "message": "5716003390e4f5216598a03d7c430dbf495ee3a7557b580632ba59f15198b6180a42469c237db5bc81f29cfaab0aff3c9966309ab06958c9d7126add78e3b32459ff8a0e0bdef874b58e6083668f38ad7d63aae1f12e26a613348f9f03ea5d205f045d78cc8902d47f81e8b52293e70e86c9803d4dacea86c3b67458ae3579bc11113b5490bcf3e1cd4e7979c264d835161fd55efe953b4c26395dd92ca4930920e904fadc0889bb7822b1dfc4452604840df024db0821d2d5e96785a5c37dbfd2c375983283e9b5b43a3207a6a9b833948329d5de41e45008bcbad493de5754dd83decc440e5166edaae0208f000c5f6d9c372153209e5b7578116f89cf2f8b1004d1307ea79ed37480f3194a7e17983a230465ccc30fcc1a62d280fbbaccf006dc4dee0ea796b81accc61a063e2c083daec039bd9a64a77024af82ec1b0898a3154329fdf61673c36e4cc81f7a4126e56290e4b456819bdebf48cb5a40955bab297c2bbcb018adbf24828660a5d12a0613bf3ccb5eeb9a17fb0a0547db8da24d2efb87ba1b843142a75e4ca0b0a333e4a14fab35a62669329ca8753f016ac70cd997e8bc19ee448aeaf0f4bf3ce5230550578ab64c19019446ce2d9c01a03d889a9909860aef76f067c50b61c3d0f12cc8686f5c31bf032a841015cfeff1cfdae94f6b21dae941b335dc821f3284ce31508f5db5c448ffaa3773e9be1a4c85a1c58b009fa3", "signed": "75f739088877e06dc56daec8f1e4d211b754e3c3edbfa7eda444f18c49b69c5a142db45a0a7650e47d10550ba681ff45dd4463c4ac48bf44b73034bd5659220e5716003390e4f5216598a03d7c430dbf495ee3a7557b580632ba59f15198b6180a42469c237db5bc81f29cfaab0aff3c9966309ab06958c9d7126add78e3b32459ff8a0e0bdef874b58e6083668f38ad7d63aae1f12e26a613348f9f03ea5d205f045d78cc8902d47f81e8b52293e70e86c9803d4dacea86c3b67458ae3579bc11113b5490bcf3e1cd4e7979c264d835161fd55efe953b4c26395dd92ca4930920e904fadc0889bb7822b1dfc4452604840df024db0821d2d5e96785a5c37dbfd2c375983283e9b5b43a3207a6a9b833948329d5de41e45008bcbad493de5754dd83decc440e5166edaae0208f000c5f6d9c372153209e5b7578116f89cf2f8b1004d1307ea79ed37480f3194a7e17983a230465ccc30fcc1a62d280fbbaccf006dc4dee0ea796b81accc61a063e2c083daec039bd9a64a77024af82ec1b0898a3154329fdf61673c36e4cc81f7a4126e56290e4b456819bdebf48cb5a40955bab297c2bbcb018adbf24828660a5d12a0613bf3ccb5eeb9a17fb0a0547db8da24d2efb87ba1b843142a75e4ca0b0a333e4a14fab35a62669329ca8753f016ac70cd997e8bc19ee448aeaf0f4bf3ce5230550578ab64c19019446ce2d9c01a03d889a9909860aef76f067c50b61c3d0f12cc8686f5c31bf032a841015cfeff1cfdae94f6b21dae941b335dc821f3284ce31508f5db5c448ffaa3773e9be1a4c85a1c58b009fa3", "signature": "75f739088877e06dc56daec8f1e4d211b754e3c3edbfa7eda444f18c49b69c5a142db45a0a7650e47d10550ba681ff45dd4463c4ac48bf44b73034bd5659220e" }, { "secret_key": "82435f39790106b3af72f91f14c928d2465f98cdd10084c4a44d19af71a1927c", "public_key": "c52a92646f5adb21c6dde0de58786837f8a3414c09aedfc27c812218a7e7239e", "message": "f3d6c46ac5248d5386b6b68462597d647039f544bb01ac2d1067daaaa397d2dbaf125a1cf8fdf280a6afec324d5311f543688a156c849819bb046b911c42ea3ca01b99808c4d1f3b8b15da3efe2f32523ec3b09c84b48cffd13c17c9e26c912d9c3e9346dfae3fd0c56c8858780782f61a4c4dbfff1e9cb4b362cd8001f9cdfeb1a72082dce9c9ade52effc9744688ac0b86c88266b53d895c17ead9e89ed8d24d40642f3ad3b9bf9bbc4dda7966ef8328289fb31e17c81fd028ef1bd9a1d4c792e86ec2dbdce3f937eecc3eeb5188d325941919bbf75b4388e2399507a3d7fb387502a95f421c85826c1c9176c923e316310a4ba45c8a5ef7557cf87b77020b24f5ba2bfd1228109566307fea65ec015019691217bce69aee16f76249c58bb3e52171cfefd5254e5e0f397169186dc7cd9c1a85c81034e037183d6ea22aee8bb74720d34ac7a5af1e92fb8185ace01d9bf0f0f9006101fcfac8bbad171b437036ef16cdae1881fc3255ca359bba1e94f79f645555950c4783bab0a944f7de8df69258b6afe2b5932217195da245fee12ac343824a0b6403dfe462d43d288db31f99097ec3edc6e76547a3742f03c777efb158f58d4053fa6cc8d68b196af4f9de516fd9fb7a6d5d9ee4a89f9b9bce1e4dee357a1e52c0544cfb35b7092d1aa5a6f7f4c7602610e9c00ef5b8761bc72279ba228a18b8400bd76d5b2bfd7c3c04aac4436dae2e98", "signed": "1daa44ef06d4c10ddb48678423c5f103a1b568d42b20cc64af110fce9d7679a2dee412b4980585c26c320dbaa601c472defc3c85415daecdd6d2d9eacac85e07f3d6c46ac5248d5386b6b68462597d647039f544bb01ac2d1067daaaa397d2dbaf125a1cf8fdf280a6afec324d5311f543688a156c849819bb046b911c42ea3ca01b99808c4d1f3b8b15da3efe2f32523ec3b09c84b48cffd13c17c9e26c912d9c3e9346dfae3fd0c56c8858780782f61a4c4dbfff1e9cb4b362cd8001f9cdfeb1a72082dce9c9ade52effc9744688ac0b86c88266b53d895c17ead9e89ed8d24d40642f3ad3b9bf9bbc4dda7966ef8328289fb31e17c81fd028ef1bd9a1d4c792e86ec2dbdce3f937eecc3eeb5188d325941919bbf75b4388e2399507a3d7fb387502a95f421c85826c1c9176c923e316310a4ba45c8a5ef7557cf87b77020b24f5ba2bfd1228109566307fea65ec015019691217bce69aee16f76249c58bb3e52171cfefd5254e5e0f397169186dc7cd9c1a85c81034e037183d6ea22aee8bb74720d34ac7a5af1e92fb8185ace01d9bf0f0f9006101fcfac8bbad171b437036ef16cdae1881fc3255ca359bba1e94f79f645555950c4783bab0a944f7de8df69258b6afe2b5932217195da245fee12ac343824a0b6403dfe462d43d288db31f99097ec3edc6e76547a3742f03c777efb158f58d4053fa6cc8d68b196af4f9de516fd9fb7a6d5d9ee4a89f9b9bce1e4dee357a1e52c0544cfb35b7092d1aa5a6f7f4c7602610e9c00ef5b8761bc72279ba228a18b8400bd76d5b2bfd7c3c04aac4436dae2e98", "signature": "1daa44ef06d4c10ddb48678423c5f103a1b568d42b20cc64af110fce9d7679a2dee412b4980585c26c320dbaa601c472defc3c85415daecdd6d2d9eacac85e07" }, { "secret_key": "1bea7726d912c55ec78b0c161a1ad3c9dd7bc329f85d26f62b92e31d16d83b48", "public_key": "c9ddb42106ccef4e0ef4794551d21df94a6306872f231663e47e241f77cc3e82", "message": "b11283b1f0ce549e5804730ac3207ac00332d2aacf9c310d3832d879f9634bd8a58adf199e4b863bb17481d28acb2da0e1557b8336a400f6295625031d09e4df4d319bbc1e8f6e9232d23053bb3ffac4fe2c70ce3077fc0060a5cb4692a1cf0b3e62fe454802ae10b83ded61b6bf454ca75e4cdad5532f20b70654f12ba906f003a8b9e986f15a39419deb2ea1ead7598290eeebf9252b0c27605a7a73a6abebb42271d71a3c197a46bcc8db11d9242842f378364a37eecaa34e982135be34182c69ca8e6e3c8c90e1b4b2b475815a178377ae0165a764c8ba2889b5ab290949d8487a88e0d3d2bc7e2520176aa6ff9ff0c409ff80515f4f0b83c5e82c23fd3326cdd6b76252e7fddcd6e4770978cd503ed2d6b480101167d3f191fed8d6d74d74a2007db1092e46a23ddecddcdb984664047b8dd7cc8a576e1a806f52cb027a9480a95cc44b1e6f2e286e9b7a6bf7b396fa5496b7a5b1c03d9c5c27da1a42990d10b12fb8640e1596f26b366d270ba64f99afffe3fece05a9b0254b208c7997cdb512fc77527954a1cb50fdab1cc9a45162741fd6f9d3fd5f2e382853d7335dba1e6b2959dd86e125e67b53dc8e453c810bc01bf20bce7b618dd5d1ed784106ee06a3ecaf6b3bee0b56833b0b813139c5a696000a449c97906a2fbddc2d9de9406ea282ac4ee5ef8bf3854c74a6b7173dd2f79c7a126f3c7b0433fd4ea26e877a14831dd415a19d", "signed": "f9b04517bd4fd8ef90f2140fc95dc16620d1602ab36c9b165fff3aba978d59767110bb4e07a48f45121447ac0c1abac585d391d4042041898628a2d2dcc2510db11283b1f0ce549e5804730ac3207ac00332d2aacf9c310d3832d879f9634bd8a58adf199e4b863bb17481d28acb2da0e1557b8336a400f6295625031d09e4df4d319bbc1e8f6e9232d23053bb3ffac4fe2c70ce3077fc0060a5cb4692a1cf0b3e62fe454802ae10b83ded61b6bf454ca75e4cdad5532f20b70654f12ba906f003a8b9e986f15a39419deb2ea1ead7598290eeebf9252b0c27605a7a73a6abebb42271d71a3c197a46bcc8db11d9242842f378364a37eecaa34e982135be34182c69ca8e6e3c8c90e1b4b2b475815a178377ae0165a764c8ba2889b5ab290949d8487a88e0d3d2bc7e2520176aa6ff9ff0c409ff80515f4f0b83c5e82c23fd3326cdd6b76252e7fddcd6e4770978cd503ed2d6b480101167d3f191fed8d6d74d74a2007db1092e46a23ddecddcdb984664047b8dd7cc8a576e1a806f52cb027a9480a95cc44b1e6f2e286e9b7a6bf7b396fa5496b7a5b1c03d9c5c27da1a42990d10b12fb8640e1596f26b366d270ba64f99afffe3fece05a9b0254b208c7997cdb512fc77527954a1cb50fdab1cc9a45162741fd6f9d3fd5f2e382853d7335dba1e6b2959dd86e125e67b53dc8e453c810bc01bf20bce7b618dd5d1ed784106ee06a3ecaf6b3bee0b56833b0b813139c5a696000a449c97906a2fbddc2d9de9406ea282ac4ee5ef8bf3854c74a6b7173dd2f79c7a126f3c7b0433fd4ea26e877a14831dd415a19d", "signature": "f9b04517bd4fd8ef90f2140fc95dc16620d1602ab36c9b165fff3aba978d59767110bb4e07a48f45121447ac0c1abac585d391d4042041898628a2d2dcc2510d" }, { "secret_key": "d01a0ead9d694833283b9cd7299a7bd75fa90b1d2d7884e4557b33c998772a68", "public_key": "a0f757479ba627efef95d6ec7a931dfac4373df33daaf4ddc4ec6894c8261ed7", "message": "7627534e9a83d1e406ab948d30d1da9c6a5db08e0feb7fc5ba5cbf76849ee8add4847ef5ca5a0dae411aca097451cb4c2b498c947097407007640dc19ed938e3b91bf51c9581168df860bd94751668dabd721dc73998400be20c9a563d5051ef70e3546fee673312b52a274041057e70848eb7c5a21644c97e448abd7640207d7cdafcf45da6df3494d3585b0e18ac5ac9081cb7a407a39a877705cbaf79a01b915f736eb025c58b4b5d807fb7b7566c5969787c1d6ca4eba97d509ef7fb3550d21d377eceffcf0eb6681895adbd246ee7bf3c935a006478b832ece46de6118b17e466a27fc2a44a896baae272f9ecf018c65cb50cfbfc8d260994a18a832d971928c449675724585131c871533c9897d8f80f9c0416b718786b10fea8eb5bd813a269a1b677b7a2507a44b713d705086530995e59335ddc2855e847e4f4db06c91f1d54023d8a10f69f9e61bdce4b686fb617bd5030e755cadb1f644e1ddd91619b96ecd605b00198b9a6eddb5a84ebd3692b665979766637c677378c1c77041fd4a6b3555c1dc8a83fe9013bb6106cc18a2b037c9377b7a1a5a5d0dcc54918eaad7e32c880767b26fd2ea2d68b0405f5e074f55a19d8a39ffbb7dc32faee6a7f9532aec8a0776c3ff83ae3a4627738496a371eb9e090b74e0eddecfcd41bed0c0ce581275243472d26da8c998e4b6d6b44fc88ba2ab54642225417120294417805742bdb33b7b122", "signed": "9a0ff7f35174ec3f66d22a6f06df60e09c8f623a5aca810e23a88d0e6a31cb6f1ce1c1f9dccc9e1484b68dd004ac53597e29ad6ab72e8ce2b75ad5b80eb848037627534e9a83d1e406ab948d30d1da9c6a5db08e0feb7fc5ba5cbf76849ee8add4847ef5ca5a0dae411aca097451cb4c2b498c947097407007640dc19ed938e3b91bf51c9581168df860bd94751668dabd721dc73998400be20c9a563d5051ef70e3546fee673312b52a274041057e70848eb7c5a21644c97e448abd7640207d7cdafcf45da6df3494d3585b0e18ac5ac9081cb7a407a39a877705cbaf79a01b915f736eb025c58b4b5d807fb7b7566c5969787c1d6ca4eba97d509ef7fb3550d21d377eceffcf0eb6681895adbd246ee7bf3c935a006478b832ece46de6118b17e466a27fc2a44a896baae272f9ecf018c65cb50cfbfc8d260994a18a832d971928c449675724585131c871533c9897d8f80f9c0416b718786b10fea8eb5bd813a269a1b677b7a2507a44b713d705086530995e59335ddc2855e847e4f4db06c91f1d54023d8a10f69f9e61bdce4b686fb617bd5030e755cadb1f644e1ddd91619b96ecd605b00198b9a6eddb5a84ebd3692b665979766637c677378c1c77041fd4a6b3555c1dc8a83fe9013bb6106cc18a2b037c9377b7a1a5a5d0dcc54918eaad7e32c880767b26fd2ea2d68b0405f5e074f55a19d8a39ffbb7dc32faee6a7f9532aec8a0776c3ff83ae3a4627738496a371eb9e090b74e0eddecfcd41bed0c0ce581275243472d26da8c998e4b6d6b44fc88ba2ab54642225417120294417805742bdb33b7b122", "signature": "9a0ff7f35174ec3f66d22a6f06df60e09c8f623a5aca810e23a88d0e6a31cb6f1ce1c1f9dccc9e1484b68dd004ac53597e29ad6ab72e8ce2b75ad5b80eb84803" }, { "secret_key": "df648940b578bc31d2a652965f30391caf06d5f251599a737ce10be55f4a9d0d", "public_key": "27de920419c186b01be54279fb8f9be4bb4b2cad75ca7e8f792bfa7bb97c7f41", "message": "1ae520beeb4ad0722b43067fa7cd2874abcf34dd9237b4478eae9772aea297a67fb79b33070204baee440b9c87e2fbcbeb76801dddea5e4530d89e11583179939a00a32f811332c52291cc7ac91e5a970cd5aa708b1da26be9fe432a9bbda1319e31e4bcc9f1666a05b5c05b876bfd1f766687ccea4e4482e924329aface5ee52e9879fd69b76e0f7e452ec4713bff216d00c82599d27ca481f73aae136f0875c88a66b1b6f34c50523ab602e9d4ebb7eeb9e043a65e41899d79752a279d2ed46993926f3621e7c32c9a9b3b59d8dd57beca39285434de991cbd2dfcbc5ca62a7779f475d0cef2f3e562f29acd474f3c99ec5bd8de01101bed2e0c9b60e2d70fd432c892fc66f8d4619a911b5625163e9a42bf9ea38586d8e764001564d335411225fcb0a06dc2a82da0779a3c444eb7864201b43ebb72b921f34d3c13089df2f4fac366ff1e3c0b96f93d2b4d726a5ce4d6916d82c78be354a1230c2cf0418c78a1913e454f648cc92c8dd0e184645fe3781d263cff69f5c60b1ebb52005a8b78a515c7e8886ffe054dab428e2e221d9d76aff42654168d833b88178293e1fedd15d46cd609483129c4d2d84432a99d31ffe9bdb566f8c75ce65e18288e4df8c16731a0f3fdde1cca6d8ede0435ff7436ca17d0aeb88e98e8065cbcbfd0ff83043a357cd1b082d1703d461881872cdf741e4f99bd146745ba703974be40f579bf5c4dba5bdb8c941bce", "signed": "62bc991c45ba9b26bf440116264162c34c88597885e9605083c604b5f5d8fa6f662ba214f76e6cf84e5ec04df1beefc5f25d3a3b72f98b5069831916a63296011ae520beeb4ad0722b43067fa7cd2874abcf34dd9237b4478eae9772aea297a67fb79b33070204baee440b9c87e2fbcbeb76801dddea5e4530d89e11583179939a00a32f811332c52291cc7ac91e5a970cd5aa708b1da26be9fe432a9bbda1319e31e4bcc9f1666a05b5c05b876bfd1f766687ccea4e4482e924329aface5ee52e9879fd69b76e0f7e452ec4713bff216d00c82599d27ca481f73aae136f0875c88a66b1b6f34c50523ab602e9d4ebb7eeb9e043a65e41899d79752a279d2ed46993926f3621e7c32c9a9b3b59d8dd57beca39285434de991cbd2dfcbc5ca62a7779f475d0cef2f3e562f29acd474f3c99ec5bd8de01101bed2e0c9b60e2d70fd432c892fc66f8d4619a911b5625163e9a42bf9ea38586d8e764001564d335411225fcb0a06dc2a82da0779a3c444eb7864201b43ebb72b921f34d3c13089df2f4fac366ff1e3c0b96f93d2b4d726a5ce4d6916d82c78be354a1230c2cf0418c78a1913e454f648cc92c8dd0e184645fe3781d263cff69f5c60b1ebb52005a8b78a515c7e8886ffe054dab428e2e221d9d76aff42654168d833b88178293e1fedd15d46cd609483129c4d2d84432a99d31ffe9bdb566f8c75ce65e18288e4df8c16731a0f3fdde1cca6d8ede0435ff7436ca17d0aeb88e98e8065cbcbfd0ff83043a357cd1b082d1703d461881872cdf741e4f99bd146745ba703974be40f579bf5c4dba5bdb8c941bce", "signature": "62bc991c45ba9b26bf440116264162c34c88597885e9605083c604b5f5d8fa6f662ba214f76e6cf84e5ec04df1beefc5f25d3a3b72f98b5069831916a6329601" }, { "secret_key": "c8ac234558aa69816b368b77b7cccb5c8d2a33ec53aeef2ce2287143bd98c175", "public_key": "5364baf1fdb2c63840b30d4031cf83a2e18e620793bae59d1035c0ede55e528b", "message": "ce488d26975c1c9328b47fa92e19561330041b23a0e57a4b8bca89eb5f615e73dd7fae69c2380e3212f9b73341c356db75a6256d7a20a97f759d4cba7197178ea724dd932949360e96c50a4b3ba55a953372c397b0969c2b14d3609e0a852d484df70eaab11249ebeb3237921f0a39a55d7dccfef205d94ec80d9e1fd6a2c1efd29844101dfe2c5f668adb7975915dedd086500cee2c1e233e8e48855cc1a6f287d63dce10addd13cac7b7a187efe47e12d1c35bb3974052b23a73668d3e4c87db4841af846e808672c43d0a1522e2965f083951b2b2b0c409548ee6182f0c9850514c9e6c102f54ba4124c92a90274f405891e662f5ebb3771b85783156e9e5836734d09d1baf5b2134c93162eec4be03bd12f603cd27be8b76accc6e8b8bac020cba3479651c9ffa53ce4eb77a77313bc1265ddab803ef7a6563ba6f799d1ef30ef5a0b412965fdac0b9dab842c78ee2cc628e3d7d4061e34ede3797e154b06e8c66cebdf2ded0f81b60f9f5cdda675a435277ba1524557e67f5cefafce929291dce89ecb08a17b67a60c582b487bf2f6169626615f3c2fe3b67388b713d35b9066669960de4db413cd8528ee56ed173e976a3c974ac633a7134cce38319735f857b7d71ba07f477ef85848aa8f39e118118779ed87b4f42aa358a89f7ec844a451e7e8fc0af418b85bc9bf2f26d1ea137d335ec7ee757b70ae2fdd9cc134932f0e5425bf37fb915e79e", "signed": "32250361df6ed283485f95f3d357a4f1c33a8cf91658327cd453d49c953665510870aa454cfa3b83245220a827d0ec7477f9eceb79c4a29f301f953cc8caac07ce488d26975c1c9328b47fa92e19561330041b23a0e57a4b8bca89eb5f615e73dd7fae69c2380e3212f9b73341c356db75a6256d7a20a97f759d4cba7197178ea724dd932949360e96c50a4b3ba55a953372c397b0969c2b14d3609e0a852d484df70eaab11249ebeb3237921f0a39a55d7dccfef205d94ec80d9e1fd6a2c1efd29844101dfe2c5f668adb7975915dedd086500cee2c1e233e8e48855cc1a6f287d63dce10addd13cac7b7a187efe47e12d1c35bb3974052b23a73668d3e4c87db4841af846e808672c43d0a1522e2965f083951b2b2b0c409548ee6182f0c9850514c9e6c102f54ba4124c92a90274f405891e662f5ebb3771b85783156e9e5836734d09d1baf5b2134c93162eec4be03bd12f603cd27be8b76accc6e8b8bac020cba3479651c9ffa53ce4eb77a77313bc1265ddab803ef7a6563ba6f799d1ef30ef5a0b412965fdac0b9dab842c78ee2cc628e3d7d4061e34ede3797e154b06e8c66cebdf2ded0f81b60f9f5cdda675a435277ba1524557e67f5cefafce929291dce89ecb08a17b67a60c582b487bf2f6169626615f3c2fe3b67388b713d35b9066669960de4db413cd8528ee56ed173e976a3c974ac633a7134cce38319735f857b7d71ba07f477ef85848aa8f39e118118779ed87b4f42aa358a89f7ec844a451e7e8fc0af418b85bc9bf2f26d1ea137d335ec7ee757b70ae2fdd9cc134932f0e5425bf37fb915e79e", "signature": "32250361df6ed283485f95f3d357a4f1c33a8cf91658327cd453d49c953665510870aa454cfa3b83245220a827d0ec7477f9eceb79c4a29f301f953cc8caac07" }, { "secret_key": "2c47f2b8b9d2cee9e6f654bc24658f9eaf439c23beaa0a79bf35cc8cd2debaf4", "public_key": "444af2f34fd32e5a19f61f87d03e107627a3eeb8bd94d2faeaa348b05dea1980", "message": "044c8faa8c8aaf9f2b8186a6b9b33847ec7b452423b22a91743d2e597ecc1e1e22ae60053e9ee6233b044e775920e4e3d66719901325cfdd39bb532f8aa469aab42e9608c21260c04c27413a7a94e466f63c4952e90ef90c12814b3451b1cad7da9147f8409220f6498cc0a67fef4bc04fc06e1d898a5515591e8be0c43d75a6fe425b7cbefb1b91b1bd78b5bec7829056982efdc5be24af6678006adc6f0446202e7ec3a2d6979cb0df7e25d74233914d9c58b81cf55be06967d3a595c1b9672869994cfba67162833a2143aa91cc93acdafa5b45208df3e88ccc01a2a4d220e360098d9154d225a7ca5f2f1e52b1003d106650a77b283b95e4baf1e7336fa9a747a2b3823d360910412e76db725ce1ab1e1d189d0d3abef82d7666bcf1b76669e0643b44f74e90ceafa0c8371b57c58f3b370a547c60958f0fcf461b3150f848c470fa07e29bf5f0d4b59efa5ab0d0341e0451d0abb29d7414cddc46cc6d74cf3dc233d0d1707387bd8c7780ff78e546fb77294d58a5dda5f05c1297e3d1771156d285635bf7ecedb38a9e5e77449804f3899ea46a50266b255aeb52d18e0fa136e535cc9026f678552fa3ee2146081d999685e24bf7807cc47c130436c544d35b4b875bd8afa312ce3ae17cf1c7f5ea1ececb50f95344720cecf088434ff8e0ba044ec19c98ada7782116304cbeac1c3e35f5a4f44313354dc9a40ece5a0f9ad3a2025acef262c5679d64", "signed": "8554b01d09ed86e61395b91a2b1ee18715c42f9c7e7f0700d79ff9fb5781293d61c558dd5b431c93718dcc0f98fb652b596f18c30f82215e8e63e4f6568c8800044c8faa8c8aaf9f2b8186a6b9b33847ec7b452423b22a91743d2e597ecc1e1e22ae60053e9ee6233b044e775920e4e3d66719901325cfdd39bb532f8aa469aab42e9608c21260c04c27413a7a94e466f63c4952e90ef90c12814b3451b1cad7da9147f8409220f6498cc0a67fef4bc04fc06e1d898a5515591e8be0c43d75a6fe425b7cbefb1b91b1bd78b5bec7829056982efdc5be24af6678006adc6f0446202e7ec3a2d6979cb0df7e25d74233914d9c58b81cf55be06967d3a595c1b9672869994cfba67162833a2143aa91cc93acdafa5b45208df3e88ccc01a2a4d220e360098d9154d225a7ca5f2f1e52b1003d106650a77b283b95e4baf1e7336fa9a747a2b3823d360910412e76db725ce1ab1e1d189d0d3abef82d7666bcf1b76669e0643b44f74e90ceafa0c8371b57c58f3b370a547c60958f0fcf461b3150f848c470fa07e29bf5f0d4b59efa5ab0d0341e0451d0abb29d7414cddc46cc6d74cf3dc233d0d1707387bd8c7780ff78e546fb77294d58a5dda5f05c1297e3d1771156d285635bf7ecedb38a9e5e77449804f3899ea46a50266b255aeb52d18e0fa136e535cc9026f678552fa3ee2146081d999685e24bf7807cc47c130436c544d35b4b875bd8afa312ce3ae17cf1c7f5ea1ececb50f95344720cecf088434ff8e0ba044ec19c98ada7782116304cbeac1c3e35f5a4f44313354dc9a40ece5a0f9ad3a2025acef262c5679d64", "signature": "8554b01d09ed86e61395b91a2b1ee18715c42f9c7e7f0700d79ff9fb5781293d61c558dd5b431c93718dcc0f98fb652b596f18c30f82215e8e63e4f6568c8800" }, { "secret_key": "887fdb4870681d4fb06a936259f75cae0517f501af646bc07a4d72bee7fb1c73", "public_key": "c762ebd48b2ce02d06384e38554b825ad322ebea74d259df1547a4d547ce0024", "message": "c5dc779f3f3fac06dd28e5a67e0e524af5b5dc3b34409657b63dface9471e9a41e1132175a0b569c8fea9d2eef2cf5d5962c7e0b6145a9e7a0c1aa33772044f9c3998c5a8c4886458b4e586f9307608361f511e7ab5092ac41ec76e0586ef5b9c236fcf5ca2fc8dd6aaeb789367f2e7c990932555dc52261e44e49423498b524419183b6c1f1d42c45464eccb0c2f7e25177fe5cd463502b403e06d511fcf9dcb64012e0f20b34c2ea7c004d9e484a7ed81f3260c41c8b1953529f47f71e867843cc3c332ad0366a63817ed12dd4730d3dfdbd7572b9ff798045940dd19fad0c8aea0b4ab61c4016de32799c73aa2b92d2c25ee9b72d46fe8f0693c58775efb05e9e17a5c346a81265d35be69a22d095de186066a5c6d8c07a3d38d002a10e5efdb866da4a9bdd54f5092661b6c2d743f5aeaa4c6c318fb59323903057e49c237b45f67542a4f27caf65b57cfcf88b71203d43d7f95322160f95c232dd10abb113b721ddba2226b063229bb44102336b10bf1656551161249786d454f4e0909d500017f6c7564f733c831af4e5ec94dfd3bf8ff5f3021b70a5ca5d28c6dfb8a2c18a1a662a33359f264d169698c1ab55783faca73bd68c0f79d1d04ae0ecdb52ae761892c02493ff35f3d84f66e236fc58134ad6a77d92254905d773900d9ddf2654c70b46f341dacb4793ca51eede45533eaeeb6e3323bc3e6c85a7940651c4f6f98191c618c891ea4e220ea4", "signed": "410a5af3c59b7c6bdb214b166cb79d96f830cf98bf52dad7b6ff2979c97fea4fed5ef7d3d49f03097279b9a099226e2a08dd30c60786254e2da8dee240bfc308c5dc779f3f3fac06dd28e5a67e0e524af5b5dc3b34409657b63dface9471e9a41e1132175a0b569c8fea9d2eef2cf5d5962c7e0b6145a9e7a0c1aa33772044f9c3998c5a8c4886458b4e586f9307608361f511e7ab5092ac41ec76e0586ef5b9c236fcf5ca2fc8dd6aaeb789367f2e7c990932555dc52261e44e49423498b524419183b6c1f1d42c45464eccb0c2f7e25177fe5cd463502b403e06d511fcf9dcb64012e0f20b34c2ea7c004d9e484a7ed81f3260c41c8b1953529f47f71e867843cc3c332ad0366a63817ed12dd4730d3dfdbd7572b9ff798045940dd19fad0c8aea0b4ab61c4016de32799c73aa2b92d2c25ee9b72d46fe8f0693c58775efb05e9e17a5c346a81265d35be69a22d095de186066a5c6d8c07a3d38d002a10e5efdb866da4a9bdd54f5092661b6c2d743f5aeaa4c6c318fb59323903057e49c237b45f67542a4f27caf65b57cfcf88b71203d43d7f95322160f95c232dd10abb113b721ddba2226b063229bb44102336b10bf1656551161249786d454f4e0909d500017f6c7564f733c831af4e5ec94dfd3bf8ff5f3021b70a5ca5d28c6dfb8a2c18a1a662a33359f264d169698c1ab55783faca73bd68c0f79d1d04ae0ecdb52ae761892c02493ff35f3d84f66e236fc58134ad6a77d92254905d773900d9ddf2654c70b46f341dacb4793ca51eede45533eaeeb6e3323bc3e6c85a7940651c4f6f98191c618c891ea4e220ea4", "signature": "410a5af3c59b7c6bdb214b166cb79d96f830cf98bf52dad7b6ff2979c97fea4fed5ef7d3d49f03097279b9a099226e2a08dd30c60786254e2da8dee240bfc308" }, { "secret_key": "88b3b463dfc30d015eefbbbdd50e24a1f7277775bcef14a6be6b73c8c5c7303e", "public_key": "f2b6284c930d4ad32d0ac719040ee7886b34722edf53da801acb5f931969e119", "message": "17c317fa6bc90c5532328f02ccfb6c099e6fe1000174f2af3a3a9309428506717c5c4335bdd7c367ff4e448a9c047503afba68fd8f7987237be7f7fbdc6d73f24c6421cab422b3fb25f67b2d71042e71570df2af37bfe5c114211fd5524b6c1c6cc52fabc3cd7fb464cd580bb74071cb300f8c9f8a46208e5aa5ddfea5fe90697aa2f14c607950c98f2312a9e16ef6346a8fd129232733827e1501a660c77c29c56d2fdd1c5597f8bc89aaefe3713734fe82858201891a1147efaf1d78a471f920defc880344553eb716cce3260e86a1bc0be28373a6a066116e8ecb10a0c4a70ca2b5364e119f84aec60deced3a4eff1fe688c5e3e251470ab516fa964a4b6f28368dd1e283597934064dc0c5b5691062cb2e267bd15fd422bcfefb83ccef7aa9a2275ef57e473149988c1578fd18708d2ff69f8e5980aa826a82cab7d8b92bb53bdd46db046ecdfc8cd7ae5ce44f3c5b8c0565b5d3c072c76b95ce900ac3ee5510db0e75d3a4150a98f3ccccc69e930c6ba741dbb0eb9fb3196871ba206a58e0dae39c8d6bb72a82399c4b7b9da38577ac17ff1524d653c0bf33679323ca7eef4e9228729031560ed8f2e5193c640b2f5e608075a2ed61428dfccdc00050ba4b99ed6d1536d5ac1e939674b41d16312ae5b07def1bf53589bed4400602ee11b850330f38aad33ef04170a3905c28b50ecc57dccf4f29d0c00f713d32ffc857956588a6326b9549edb0e4fe6185", "signed": "825aff71f79303bf4592bd8da4d7d9437ff267976f746437655988ddcf29379465a3b48c9fb0f31cef03e6368861c369b4364fb8e4b0c72e26a9a9dded1c250417c317fa6bc90c5532328f02ccfb6c099e6fe1000174f2af3a3a9309428506717c5c4335bdd7c367ff4e448a9c047503afba68fd8f7987237be7f7fbdc6d73f24c6421cab422b3fb25f67b2d71042e71570df2af37bfe5c114211fd5524b6c1c6cc52fabc3cd7fb464cd580bb74071cb300f8c9f8a46208e5aa5ddfea5fe90697aa2f14c607950c98f2312a9e16ef6346a8fd129232733827e1501a660c77c29c56d2fdd1c5597f8bc89aaefe3713734fe82858201891a1147efaf1d78a471f920defc880344553eb716cce3260e86a1bc0be28373a6a066116e8ecb10a0c4a70ca2b5364e119f84aec60deced3a4eff1fe688c5e3e251470ab516fa964a4b6f28368dd1e283597934064dc0c5b5691062cb2e267bd15fd422bcfefb83ccef7aa9a2275ef57e473149988c1578fd18708d2ff69f8e5980aa826a82cab7d8b92bb53bdd46db046ecdfc8cd7ae5ce44f3c5b8c0565b5d3c072c76b95ce900ac3ee5510db0e75d3a4150a98f3ccccc69e930c6ba741dbb0eb9fb3196871ba206a58e0dae39c8d6bb72a82399c4b7b9da38577ac17ff1524d653c0bf33679323ca7eef4e9228729031560ed8f2e5193c640b2f5e608075a2ed61428dfccdc00050ba4b99ed6d1536d5ac1e939674b41d16312ae5b07def1bf53589bed4400602ee11b850330f38aad33ef04170a3905c28b50ecc57dccf4f29d0c00f713d32ffc857956588a6326b9549edb0e4fe6185", "signature": "825aff71f79303bf4592bd8da4d7d9437ff267976f746437655988ddcf29379465a3b48c9fb0f31cef03e6368861c369b4364fb8e4b0c72e26a9a9dded1c2504" }, { "secret_key": "427d6e423917896831601b8f4e21561db6108571be009e29dca49a5960ff314b", "public_key": "8d9e6360fdef249975df27b3106a71120587722df3270a85a13a8c3bb8c9809e", "message": "9c2cc7f2462e09c4c58c2709ab4259885a4e887d9fa531881505aaf203c163fb3a0dc028f4ada60670638d4a9727a39083bedbaced58edb779e1ce6ccdfb428c362bb1db0c1053006bd8f4bef89a1a9de01c774e357f910e5c39b22477555e5f7c0498b5b28f369e5d3fa42ab360e4f451c69f81ba0f3cced43a559db600104278f868796b2c911b3b032b729f4b22ac149dc467a0cae48d19e9d985b42b62549de171ff566e1d1e9bb8e56cfd1ae8f7bddcfd8a2341827dbe89c882ab3e498339ff681c7dc1104de738b480316943109f703d471ab86e4ca4287e4cd74c312ff7d037395606fb25f871e7277078a787d02f31cc9e815be8600a7c47c6fdd82331ae9c496a547bdb235b8a56d53259e6296124a32c3b625d202419d064b9a4e83efa87f13537b4f513b916a84fc866d8a899804c7833eaa019e0d7e0e8075bd6b5cb6ffc766479f3f6e20e481e6ab27bd808ad906cdcc7827430e312f740f275ddf51dd83248fa057c43c9cb77557b2fd9c2d52824ff9e146deac1e6691d450213bc590a49bec72d52e38f6b4dc6cca951eef2184d2425031ad59b242effa68b6c72c54c9dfdb419c02eb43ef3f34d338d2a9dd03a78cfdd014098e249259e77282e0c3fc1010b02a67ff851e9cfd9749c1cd8f06cf462e6ade995ac466fab5c795e9eff13e55b4350b94c7316aa498df9fdee9958047793e3bbb89fb81da85f4b9d43e4b0d43b381b94cdc9a99d06", "signed": "d1c9a01c56e33960f49df37eab963bc5a99f25c600446ce2ca48d9139da5733b718fbf1a987393f6e5823c2d130c7ce60ea3db3543c8854ef12b98d33adde7059c2cc7f2462e09c4c58c2709ab4259885a4e887d9fa531881505aaf203c163fb3a0dc028f4ada60670638d4a9727a39083bedbaced58edb779e1ce6ccdfb428c362bb1db0c1053006bd8f4bef89a1a9de01c774e357f910e5c39b22477555e5f7c0498b5b28f369e5d3fa42ab360e4f451c69f81ba0f3cced43a559db600104278f868796b2c911b3b032b729f4b22ac149dc467a0cae48d19e9d985b42b62549de171ff566e1d1e9bb8e56cfd1ae8f7bddcfd8a2341827dbe89c882ab3e498339ff681c7dc1104de738b480316943109f703d471ab86e4ca4287e4cd74c312ff7d037395606fb25f871e7277078a787d02f31cc9e815be8600a7c47c6fdd82331ae9c496a547bdb235b8a56d53259e6296124a32c3b625d202419d064b9a4e83efa87f13537b4f513b916a84fc866d8a899804c7833eaa019e0d7e0e8075bd6b5cb6ffc766479f3f6e20e481e6ab27bd808ad906cdcc7827430e312f740f275ddf51dd83248fa057c43c9cb77557b2fd9c2d52824ff9e146deac1e6691d450213bc590a49bec72d52e38f6b4dc6cca951eef2184d2425031ad59b242effa68b6c72c54c9dfdb419c02eb43ef3f34d338d2a9dd03a78cfdd014098e249259e77282e0c3fc1010b02a67ff851e9cfd9749c1cd8f06cf462e6ade995ac466fab5c795e9eff13e55b4350b94c7316aa498df9fdee9958047793e3bbb89fb81da85f4b9d43e4b0d43b381b94cdc9a99d06", "signature": "d1c9a01c56e33960f49df37eab963bc5a99f25c600446ce2ca48d9139da5733b718fbf1a987393f6e5823c2d130c7ce60ea3db3543c8854ef12b98d33adde705" }, { "secret_key": "be935209f62dea6012ecda6a6156cd166a4d761150deed456816eaf0ce78a7f6", "public_key": "d39a89af72293948b13421fb883bbe372af9089c224d42b901979f7e2804e1c0", "message": "117f427cb68150cafcfa462c42206141427c4dcea1c8eacc2d30bed1e90207d5ae305e1fc16c54e4c54cc6878cdbedc9f51fe18461ec37c557b115d13c8682c4e15f505296a1760e1e75f5ab27a5c15a1357d2c8c40dd5355f7c82fea5d27e28876358c12e9113ee2983ea6f09c64e06e297dd96b34d9b5ed49fc47a8839549c66b002fe945e8f94e7d2315c50ca4dc098be4b3289812fbea96b47ce604540bde0e5ab0b1bc036be9b6a95e09c81e898640c8f05d60ad94218d0e66ceb85a26b78292220bfd061dd073512923b90c79dcf5a1935fafe8e01ef8bf81b4d37c5a571b50c421f9bd2194bef3586fcb8584877bb7e0481655b05c7b643b1e45b04036272841852e31940ef8f3b6d4feb5df079d176f979c18a11a66d1214e52f687e9063c1c2b7277b685d5c72ad569f7873838f910257a053131c83ebce86e69d736362bebc96bbfa35fcba1cb527e748e5f579929fd40c56b1a51a222e863302705c86f7b54ebfbb9482f7e280f7bec8caf3a6b5671ac30cd1be529288797c013ce56bd186de7dfc1828691425c147c5174a290d80cbd59c19da7adf77918882a7b2a9a64e6d76b48b92f2a266eee6e251d2e817652b88b502de7399782d7529a81d0a363996b9df68b15a7630904c8c246081fa4f09299f15757958e089a901c3564615c0f7cf2752b8b9e521338d836e3dae4ce2374642253c4c9831974e5d8c2842f49007b71775093dfe57f44492f0", "signed": "08e098a749fce6d12354395878a8be35fe9edf72684dd8281224899b1caea4ed687785dff55a19989e03636e1666386f22c3f443ecf6fd34d599ff3ec2faf101117f427cb68150cafcfa462c42206141427c4dcea1c8eacc2d30bed1e90207d5ae305e1fc16c54e4c54cc6878cdbedc9f51fe18461ec37c557b115d13c8682c4e15f505296a1760e1e75f5ab27a5c15a1357d2c8c40dd5355f7c82fea5d27e28876358c12e9113ee2983ea6f09c64e06e297dd96b34d9b5ed49fc47a8839549c66b002fe945e8f94e7d2315c50ca4dc098be4b3289812fbea96b47ce604540bde0e5ab0b1bc036be9b6a95e09c81e898640c8f05d60ad94218d0e66ceb85a26b78292220bfd061dd073512923b90c79dcf5a1935fafe8e01ef8bf81b4d37c5a571b50c421f9bd2194bef3586fcb8584877bb7e0481655b05c7b643b1e45b04036272841852e31940ef8f3b6d4feb5df079d176f979c18a11a66d1214e52f687e9063c1c2b7277b685d5c72ad569f7873838f910257a053131c83ebce86e69d736362bebc96bbfa35fcba1cb527e748e5f579929fd40c56b1a51a222e863302705c86f7b54ebfbb9482f7e280f7bec8caf3a6b5671ac30cd1be529288797c013ce56bd186de7dfc1828691425c147c5174a290d80cbd59c19da7adf77918882a7b2a9a64e6d76b48b92f2a266eee6e251d2e817652b88b502de7399782d7529a81d0a363996b9df68b15a7630904c8c246081fa4f09299f15757958e089a901c3564615c0f7cf2752b8b9e521338d836e3dae4ce2374642253c4c9831974e5d8c2842f49007b71775093dfe57f44492f0", "signature": "08e098a749fce6d12354395878a8be35fe9edf72684dd8281224899b1caea4ed687785dff55a19989e03636e1666386f22c3f443ecf6fd34d599ff3ec2faf101" }, { "secret_key": "6818c60bb6439ac2eee2d4e128e9d8691d4ad5d363fed7d6577a62b6569994a4", "public_key": "7345ec11bccc056fc4effa3e4ef670996aa26a1bb1b83391babc39a1a59601f9", "message": "b2ae658b3c13c3cdeb1dc993b0f45d63a2ea9abd0b7a04f1f5ce5932806c2ca9b7a204fbf8d066b7f0fe6ae0d1da68c885ee11f6f6db7e8320a2ea650b533851cdd99d903aa0b3faa3c950f702f04e86b4eeb3a1c7bc854b2514fa5b4766d375b4f1ad61075378dd92fd626c2b47e01383ea72987959262c562862b45b7557671413b66614bcc9f7bdb9ee46cbed8965bfa505315090c7204bea89175be5f20802e3deddcbd8dd64cfef7ee6a6e3860ce1e5799df5d810d5ecf32e615d16dff87abd4a636ea17aa4ece5b6b2c046b65b5af749862b45790c39176820b36901be649cf4169df7e923956d96064950c555f45acb94507cfd0c3b33b080785e35c0d2b0addc4c0ad3fb216ac2e601c9c7e617dabda333dae603cc9db1fc62ae4e0e45e3ccdd166a6781e243b7daa138806632f538844ee3d140b7a8bb2b540100778c458e066170705e5fb2c88029098b992c39bc9ff6330bfcfe7752320e6ea0949d2c871aedc187be27fef7db5f72a6a773edde0dc52ae2ed931cb26817b85b1545894d92298aaf87ccbc783e8dd6d16493f56ead2ba852ee9c7d10074406440d2a279abc874f15468dd66a717bace37be7b7055dd9681f8be81329ee7af97e3abc434ac1c93aec582f23fd1ec0fa5aafcf7bfbda00ffa97ae317ae918d349d21a7f4619142ba23dacef7b390ae26a17e2e2962ae27005376b72d4da9e2979653a66325a14617638dbe1a5540b683ac0017", "signed": "1505967a27b9f86e9242444002a1e3197d74ddcd89659ec5140202aac794b8adc193e7d30f3382642990f6fed7a999cac8c61eaa39b7d90816f1d738744be101b2ae658b3c13c3cdeb1dc993b0f45d63a2ea9abd0b7a04f1f5ce5932806c2ca9b7a204fbf8d066b7f0fe6ae0d1da68c885ee11f6f6db7e8320a2ea650b533851cdd99d903aa0b3faa3c950f702f04e86b4eeb3a1c7bc854b2514fa5b4766d375b4f1ad61075378dd92fd626c2b47e01383ea72987959262c562862b45b7557671413b66614bcc9f7bdb9ee46cbed8965bfa505315090c7204bea89175be5f20802e3deddcbd8dd64cfef7ee6a6e3860ce1e5799df5d810d5ecf32e615d16dff87abd4a636ea17aa4ece5b6b2c046b65b5af749862b45790c39176820b36901be649cf4169df7e923956d96064950c555f45acb94507cfd0c3b33b080785e35c0d2b0addc4c0ad3fb216ac2e601c9c7e617dabda333dae603cc9db1fc62ae4e0e45e3ccdd166a6781e243b7daa138806632f538844ee3d140b7a8bb2b540100778c458e066170705e5fb2c88029098b992c39bc9ff6330bfcfe7752320e6ea0949d2c871aedc187be27fef7db5f72a6a773edde0dc52ae2ed931cb26817b85b1545894d92298aaf87ccbc783e8dd6d16493f56ead2ba852ee9c7d10074406440d2a279abc874f15468dd66a717bace37be7b7055dd9681f8be81329ee7af97e3abc434ac1c93aec582f23fd1ec0fa5aafcf7bfbda00ffa97ae317ae918d349d21a7f4619142ba23dacef7b390ae26a17e2e2962ae27005376b72d4da9e2979653a66325a14617638dbe1a5540b683ac0017", "signature": "1505967a27b9f86e9242444002a1e3197d74ddcd89659ec5140202aac794b8adc193e7d30f3382642990f6fed7a999cac8c61eaa39b7d90816f1d738744be101" }, { "secret_key": "6d1da5b483e64b0365990ff09381fb1702fd8ec3a1a369cd52e4c56713a314a5", "public_key": "08055c261f26e02a658f66d9ba01fcde53e9ade3edc6bf815e4a6802e1677ab3", "message": "79a2c37055f189f3247f1f8cea19b2ea40d858db1f5d1392ee6d411c7802ee23de52ad02811725a94d76675da89a96b5d07abcee233a1a2e1fa324fff9e78a4c196147f8570b0b13713d96aa5d750a15d7cd162e7ba2e75333607dd698eb4773c7e91f7668ff8b62f04640eb12ecf122fce6b832e0d0df928eefd2c2002364af6bb55291d3f54929085be338342f09da73e279c87c8324555819ed57e78d7ac40951d33f65b94aa1e555e92a063d11f1ff7b12694341e3fe444933d01aa36753ed3cdda890bdf95a8205b5d893221991c795ad0a4a946f58d40a453451af214fd465e28d3e2f0a56aa56def8dc04aad35713abfc8bd7856d5a9dc3f60a3f2bd3e6366f1f244e941d6aea892f6a88931fe1c313e09078e90bc6392d490533c9ea3ff6deaf3aadfa8dfdc4e90f64af47589ea65a87acd2199602351d3afc2103196e0394ed523aa799d31e11d34fff546d44f436b34859f9cfbc9ce403de5a9830ec3d453f0d45970f572c144f191b2fbb2d0ea6cc9c8e24d9c0b2183b278072ebb0be2d70d037fd2e8ec18dc4c9b21abdc6a4ce8d4668a220eebd6934f04baf0e88a488d2dfc735a7c5a70dbb0166a21ae011fc6e7da10fc320336271d9eead510a6f7032f2296692be508021bc98c170be4235f7ce31f2bcd6341163683376ae2c5662cb4770c96e018ef1bf47913319c9a09b9e965ab5c3e97bbc756a5666b4567f2cff2d0c3a6a4026158cb9f90f950056", "signed": "a5b8b44a91444c64374b523cb4dcb0cef4ce52408b98126d7e1ae8bdc28cf51470ce4e253e0be62bd68ebf5fa6bce1585eccfa9256c073ee03e54c525bbe2d0a79a2c37055f189f3247f1f8cea19b2ea40d858db1f5d1392ee6d411c7802ee23de52ad02811725a94d76675da89a96b5d07abcee233a1a2e1fa324fff9e78a4c196147f8570b0b13713d96aa5d750a15d7cd162e7ba2e75333607dd698eb4773c7e91f7668ff8b62f04640eb12ecf122fce6b832e0d0df928eefd2c2002364af6bb55291d3f54929085be338342f09da73e279c87c8324555819ed57e78d7ac40951d33f65b94aa1e555e92a063d11f1ff7b12694341e3fe444933d01aa36753ed3cdda890bdf95a8205b5d893221991c795ad0a4a946f58d40a453451af214fd465e28d3e2f0a56aa56def8dc04aad35713abfc8bd7856d5a9dc3f60a3f2bd3e6366f1f244e941d6aea892f6a88931fe1c313e09078e90bc6392d490533c9ea3ff6deaf3aadfa8dfdc4e90f64af47589ea65a87acd2199602351d3afc2103196e0394ed523aa799d31e11d34fff546d44f436b34859f9cfbc9ce403de5a9830ec3d453f0d45970f572c144f191b2fbb2d0ea6cc9c8e24d9c0b2183b278072ebb0be2d70d037fd2e8ec18dc4c9b21abdc6a4ce8d4668a220eebd6934f04baf0e88a488d2dfc735a7c5a70dbb0166a21ae011fc6e7da10fc320336271d9eead510a6f7032f2296692be508021bc98c170be4235f7ce31f2bcd6341163683376ae2c5662cb4770c96e018ef1bf47913319c9a09b9e965ab5c3e97bbc756a5666b4567f2cff2d0c3a6a4026158cb9f90f950056", "signature": "a5b8b44a91444c64374b523cb4dcb0cef4ce52408b98126d7e1ae8bdc28cf51470ce4e253e0be62bd68ebf5fa6bce1585eccfa9256c073ee03e54c525bbe2d0a" }, { "secret_key": "5146f5b7f1baa19fc8cd785c896e0f90f9f659b77b1b9bb4adcab5a6267205e4", "public_key": "688a8de64eff33ba6bbe36cdd6a384bb67b3f42636db234ff5efe0b31743c7e6", "message": "97bd99f518ee0788d576d99c043b449dfc242ac5eeaec344a19432b345962ec412ce55362b3b851d98119fceb9328347f6fcc68dbf56a2814db09e9385843a931189ea3e72da9d79a45693053c035701dc5551240f95b303fba16f89aa53a43882b0f1381202c78f9c7419899f2351eca95e20bfee76351c48d00499f591da56a99524bb74fe1c834ee91077139f1edf67315c07a3fd97f80b7c276b6cf6b5cc36be363b731217f6319f5129ba7b14d054c8d81d8e3a3f3be62ac31ff62df6a3b2ee2596969b991704b31c689997ab4628bc2660c67872132e85da0c4fcf567965f1254a8f432692a17bb86cb3c1dcbaac939552f09e50ec5b0de2ef85e0ac253a4165655db5b5c49803821d859c60961e061d58278b827dd4d3bc47f1c22de094906bdbbf3badbdde22ba24255855eb86d1d7f37082059311dc0728ebeaf26c4473bad1fa9e614b533b811b6bcb0650c06d879a5245788f3401b46197300774a9aa73cd978c0530c81a53bdb3fc932414b3e30440dc127441eff1605e7fd9ac8c632e82bf1b453d4f33a57e4b67b0b6fcf6ed5555b5f5a300a14a00d0385a33750525b00edb312c6bfdd64edd3b5316d19f958c517634f013b008936d34e9b5e1e9283a5f0fd7783377c0e5090641bb9d338cf3133acd0b971e537904f17af92911afad72ee97f9a8283a16a7e26ab428416c1017dae9b1a99c4c3320ad163bdcfc328bfaf9b8d5d7d26d41d1ef21a5208f01", "signed": "4bdbd7c64f13e278c23969e7eb386bbe499dbdefc3ff4e30cfac5cf86f216c24c9e6cde20e529d147fb7ea08f2593ad50903b5edbf86b4d28f2eb32ef137f00c97bd99f518ee0788d576d99c043b449dfc242ac5eeaec344a19432b345962ec412ce55362b3b851d98119fceb9328347f6fcc68dbf56a2814db09e9385843a931189ea3e72da9d79a45693053c035701dc5551240f95b303fba16f89aa53a43882b0f1381202c78f9c7419899f2351eca95e20bfee76351c48d00499f591da56a99524bb74fe1c834ee91077139f1edf67315c07a3fd97f80b7c276b6cf6b5cc36be363b731217f6319f5129ba7b14d054c8d81d8e3a3f3be62ac31ff62df6a3b2ee2596969b991704b31c689997ab4628bc2660c67872132e85da0c4fcf567965f1254a8f432692a17bb86cb3c1dcbaac939552f09e50ec5b0de2ef85e0ac253a4165655db5b5c49803821d859c60961e061d58278b827dd4d3bc47f1c22de094906bdbbf3badbdde22ba24255855eb86d1d7f37082059311dc0728ebeaf26c4473bad1fa9e614b533b811b6bcb0650c06d879a5245788f3401b46197300774a9aa73cd978c0530c81a53bdb3fc932414b3e30440dc127441eff1605e7fd9ac8c632e82bf1b453d4f33a57e4b67b0b6fcf6ed5555b5f5a300a14a00d0385a33750525b00edb312c6bfdd64edd3b5316d19f958c517634f013b008936d34e9b5e1e9283a5f0fd7783377c0e5090641bb9d338cf3133acd0b971e537904f17af92911afad72ee97f9a8283a16a7e26ab428416c1017dae9b1a99c4c3320ad163bdcfc328bfaf9b8d5d7d26d41d1ef21a5208f01", "signature": "4bdbd7c64f13e278c23969e7eb386bbe499dbdefc3ff4e30cfac5cf86f216c24c9e6cde20e529d147fb7ea08f2593ad50903b5edbf86b4d28f2eb32ef137f00c" }, { "secret_key": "5e6fdac9351a637b99f33a264e1287697e2abab0cca16621792484f5606f44c1", "public_key": "57e5f88acddc8cde7dd07a3146fb1d4f7a9b6383a8f6b2b8d9b07ebc3fc4dd20", "message": "4d6cd3bc2f86266b8bb1b61d0e1caa9bd2d4a180361aef3a18d390b10f7e860f697e247eb6c3e51d3b976bf0ca183d01a69880f15c94b875668ca30dada0895bedd4d705a0e03304d063dea87c7fdec98b89c06f130dd5bd586b54d9ba737826bb405cd8ac8bbc9500acda3c07461d009440af0b2531e72f3ff5016ae2d86d69b87fb273d1e8dd5f6a264beebb2f885996741ffda277a0fbf8ef08f81f22ee5961d9d3fc938362e1ca12004a91d9b5f7a6833a6c22955ac0cda3390671910cbd51e685fe095973e415fc2db8adf10b147ec7080c3b8ebd07d21bb9556da85430a268eed8486b1e31c94313b01649fe91b222f85adee15eb77707d78ffcb660926544d33be9994a297620dc7aed97f392639053f388b0b3aa3bd0ac5b033cb414be520b43df6826b976890d0c53b97b6c92e7d1a1573d0c7494d747e0cad9bd8ea538d62ad59801ad0716f170193e3009d9959c55d2ff64799bd959359abb94ca9723b5ffc24c9507f8c5fd6e88eaae7a70add84d744ccf8b98363788f0bfb1a02522025751e534710d40a2d38a791194eba293fd2046cc14dd3876d168fc6e236cbe146d6369d225bfa67e53979865f78873a9fcf03c186fa8521f0a5545accee80d1e55107221e21f0f2291c143de023e88d7330cc87d4c51ff29a3090605e9739490c1dcee713495f231c2a36b11ab235547fb6328f747336d9b1ef25a8ab99ceda957b2dccee4075b0d03381b94ae18d041ea", "signed": "987e32e00a8a1632f47b503194355c980cb22adeb326b4e3115ecab04b704d186cd92e3c3ac7b4e2936cbd07cb794ec0cfe91a97872ff2b41376f5f18f55b8054d6cd3bc2f86266b8bb1b61d0e1caa9bd2d4a180361aef3a18d390b10f7e860f697e247eb6c3e51d3b976bf0ca183d01a69880f15c94b875668ca30dada0895bedd4d705a0e03304d063dea87c7fdec98b89c06f130dd5bd586b54d9ba737826bb405cd8ac8bbc9500acda3c07461d009440af0b2531e72f3ff5016ae2d86d69b87fb273d1e8dd5f6a264beebb2f885996741ffda277a0fbf8ef08f81f22ee5961d9d3fc938362e1ca12004a91d9b5f7a6833a6c22955ac0cda3390671910cbd51e685fe095973e415fc2db8adf10b147ec7080c3b8ebd07d21bb9556da85430a268eed8486b1e31c94313b01649fe91b222f85adee15eb77707d78ffcb660926544d33be9994a297620dc7aed97f392639053f388b0b3aa3bd0ac5b033cb414be520b43df6826b976890d0c53b97b6c92e7d1a1573d0c7494d747e0cad9bd8ea538d62ad59801ad0716f170193e3009d9959c55d2ff64799bd959359abb94ca9723b5ffc24c9507f8c5fd6e88eaae7a70add84d744ccf8b98363788f0bfb1a02522025751e534710d40a2d38a791194eba293fd2046cc14dd3876d168fc6e236cbe146d6369d225bfa67e53979865f78873a9fcf03c186fa8521f0a5545accee80d1e55107221e21f0f2291c143de023e88d7330cc87d4c51ff29a3090605e9739490c1dcee713495f231c2a36b11ab235547fb6328f747336d9b1ef25a8ab99ceda957b2dccee4075b0d03381b94ae18d041ea", "signature": "987e32e00a8a1632f47b503194355c980cb22adeb326b4e3115ecab04b704d186cd92e3c3ac7b4e2936cbd07cb794ec0cfe91a97872ff2b41376f5f18f55b805" }, { "secret_key": "fcfff0932dc86ea5902a8d33073329960cd8188a075dd0bcdfa8382c20b0e78f", "public_key": "0c9205a90bbe7f2d505e17fa3d080b522a1d7a152cad2d85d31b34a0471c0d4c", "message": "3d4b76122373e212a346d19a66bbfc4b623292649bd0ce5cf6bb135648bd01db7403b3d0bdd1697ff4e6e908904116754d370c40d700cdb664c46a91dd84a358b9d2381443e60f2c3f5640261b6b858ba8f828b0971f4122b20288a26ba2090ba14fd276360cc68679cd8419ae19c6d4dc7b6614c06df5e5c0510e2cb686de0ebd75e5210a215562589b28c9ccc7d272b98bd4bf93495efe4fc5b78defecfbcaa9fe126bad30e89b3a389b4256f6a48a76c345de5a36a1449f08345b9a5e6a001da1ff9cd433709348e9aefbc78ba52d3ab3b46986935eba8ecf81edc43c5b2e3b5eb38d9a165e9e7f72f617605463bedba973ebfdcdf2b0889c71412f8f850c7a3b5518ecd89d2e25c0c1c30f085a0ffe540ef9c0e88fc7ec4af1948a4e6f7a6e256b307a1127b71ba686efeadca0e4860947cf674fced6caf7310ccbaa8d9047daed30fd5585d41ddeae4df2fed4b6228032c3e4ae2380e87ec6cd72e4d74b8b4c3813fb043389391e9c13f7d33c3aab5a78fc4c6a634c61a70f02a940548da177c65df6ab17cd9683f37ea821c740889d82e88c834e7d5dc11662ea78b13c6a4b6218d31784219a4767595b1a56216525cd68938b22bdb1f8c5a7f1701afeb961888e2e0ec0c838cd620cb7dd8a1493a02cd56b545125e4700c0889fa2644e644a3af531d1cd6bc95e5df9175f137f28408cb699c7ae66f65d1d2930fac57ca8a60e6311a4078488c9ea404948a9debeb9d5e10", "signed": "37ddd83f98b057b7cb3208a832c58aa90694563c23548d432291380b73591301f274b04cee2ef78c06d96c3d9b7c17521aae1a8ca50d347c09c3cf703bc8830b3d4b76122373e212a346d19a66bbfc4b623292649bd0ce5cf6bb135648bd01db7403b3d0bdd1697ff4e6e908904116754d370c40d700cdb664c46a91dd84a358b9d2381443e60f2c3f5640261b6b858ba8f828b0971f4122b20288a26ba2090ba14fd276360cc68679cd8419ae19c6d4dc7b6614c06df5e5c0510e2cb686de0ebd75e5210a215562589b28c9ccc7d272b98bd4bf93495efe4fc5b78defecfbcaa9fe126bad30e89b3a389b4256f6a48a76c345de5a36a1449f08345b9a5e6a001da1ff9cd433709348e9aefbc78ba52d3ab3b46986935eba8ecf81edc43c5b2e3b5eb38d9a165e9e7f72f617605463bedba973ebfdcdf2b0889c71412f8f850c7a3b5518ecd89d2e25c0c1c30f085a0ffe540ef9c0e88fc7ec4af1948a4e6f7a6e256b307a1127b71ba686efeadca0e4860947cf674fced6caf7310ccbaa8d9047daed30fd5585d41ddeae4df2fed4b6228032c3e4ae2380e87ec6cd72e4d74b8b4c3813fb043389391e9c13f7d33c3aab5a78fc4c6a634c61a70f02a940548da177c65df6ab17cd9683f37ea821c740889d82e88c834e7d5dc11662ea78b13c6a4b6218d31784219a4767595b1a56216525cd68938b22bdb1f8c5a7f1701afeb961888e2e0ec0c838cd620cb7dd8a1493a02cd56b545125e4700c0889fa2644e644a3af531d1cd6bc95e5df9175f137f28408cb699c7ae66f65d1d2930fac57ca8a60e6311a4078488c9ea404948a9debeb9d5e10", "signature": "37ddd83f98b057b7cb3208a832c58aa90694563c23548d432291380b73591301f274b04cee2ef78c06d96c3d9b7c17521aae1a8ca50d347c09c3cf703bc8830b" }, { "secret_key": "a1e4fcfde044f1bb0e7bbc631a831a8d07e90ae08a966ad627b620b1e28c42cf", "public_key": "25560f31168bd4b72552ededd08bb6bf79a94063c1f1e1d304869dd1ce049b95", "message": "8c1454d4e08a1401646bf7a8859e8a145e85eeeb40db38ff0169709641212c81b67390749c01a79807f3ccadbbd2256f36ffc180cf9ba44bf4a7612d441c23b2e25d33c48a73e16ce357562758adb00553c3142fb8176b6ae8fb610a60f923b0911814b10f5679936c3677b70e846e218f587567f2019c7d282a107f3cc84763adaec88993c0cc5003e77af60d67db53f8cb727aa6672de004498c3b3e222aa7082d91f98a1a068374c510ff53a5e559cbe2d6c7c3442d7238907c811d58aa7f5a46b8311244f0dbe1b9c0e944dda1d8010864949c59396c6b346a11f3aa866d6bceadfc909038d22efbc8f1dac810a9f2fafcce7c0389eb0a56c0f68cae24ae3ddbdff7116d2fadeb9b0e7509536fdc3b83e71354da6a1aed16887490dc2f4df57bbaa7244528fa3094b99e867581acef906270b2cf4deda6b8fd9dbb79add7bea8f86fcb1f64dfd50e385b4209ec0b1a9f6d2e519068297a2b5c405c216b4a2ed983ff69c59b530effa60c0367051267dd2bbd1e86a9ab5a114dd4f69b540bfabfe97c0403b8fcbb27625761eda3e2ad8e625cfe4b615b7025531a498918c24e02a00e797bbafd14f9d3f6827e390063c436080688d037a6e2993c56d3a8e95f375c10040bf04f030c972623d9e3801c13b4ec8d01cf183855f5935f10ddb2c54c51c80cbed0c24db56e1ed148931d89161c5ea37c2f9787f88ef7330e5dcd0e43d81bfc8bf23ddf7983cc1d733843a33ccb395dfc", "signed": "c8001527bd902c15c3dd5ae18180525b5e8202be66711f82885c8222a15f060092a2a6e2f7d7e980311209191b32b8ade48d3ea98cf245f0fad62c009c5a71088c1454d4e08a1401646bf7a8859e8a145e85eeeb40db38ff0169709641212c81b67390749c01a79807f3ccadbbd2256f36ffc180cf9ba44bf4a7612d441c23b2e25d33c48a73e16ce357562758adb00553c3142fb8176b6ae8fb610a60f923b0911814b10f5679936c3677b70e846e218f587567f2019c7d282a107f3cc84763adaec88993c0cc5003e77af60d67db53f8cb727aa6672de004498c3b3e222aa7082d91f98a1a068374c510ff53a5e559cbe2d6c7c3442d7238907c811d58aa7f5a46b8311244f0dbe1b9c0e944dda1d8010864949c59396c6b346a11f3aa866d6bceadfc909038d22efbc8f1dac810a9f2fafcce7c0389eb0a56c0f68cae24ae3ddbdff7116d2fadeb9b0e7509536fdc3b83e71354da6a1aed16887490dc2f4df57bbaa7244528fa3094b99e867581acef906270b2cf4deda6b8fd9dbb79add7bea8f86fcb1f64dfd50e385b4209ec0b1a9f6d2e519068297a2b5c405c216b4a2ed983ff69c59b530effa60c0367051267dd2bbd1e86a9ab5a114dd4f69b540bfabfe97c0403b8fcbb27625761eda3e2ad8e625cfe4b615b7025531a498918c24e02a00e797bbafd14f9d3f6827e390063c436080688d037a6e2993c56d3a8e95f375c10040bf04f030c972623d9e3801c13b4ec8d01cf183855f5935f10ddb2c54c51c80cbed0c24db56e1ed148931d89161c5ea37c2f9787f88ef7330e5dcd0e43d81bfc8bf23ddf7983cc1d733843a33ccb395dfc", "signature": "c8001527bd902c15c3dd5ae18180525b5e8202be66711f82885c8222a15f060092a2a6e2f7d7e980311209191b32b8ade48d3ea98cf245f0fad62c009c5a7108" }, { "secret_key": "bed1bbcae18643d6f6aac34f3d9b6a1478394d02b931cff006d85f21b7dbc747", "public_key": "4f528b38185a424c6fdece46511a0c29b7c04b32eb0483abb52d5f8eb6b352eb", "message": "ff7c6413e618a056de401ee10c40ade3d7c0e6861495d97c2689ec6abb69dd2ae701fdcac8f08331ea5c5f5d805b5789ee5e241ff4ac8b960f4f2b9fef6a727fad86dcd432de9fad6ba45e00aa3687b0ceeb2c0d430b7d5fde63b4f6b982c4f9e03c430abad9044d06dc49e89df481405d8febbb0653e9686948aad2d9072544df9424fd487f4e24ba7f2455ddec4105828c3981bddbb1b7fbdbac155903e960fcd94c0716e736f519867fbc52c51260f571d7edcb081a23550ad8c70bb268864ab276aa2cc2dbf62383bb66030ebe94354174ccec2d2a907578556444507cbf8488bb23c62423a3a98da7cc968f599d3dc84dca3afad7f14ec306e1db534143216aa22ad18074c719570805ea46bc86b71a8ff58e41e73cb29ad5750fcfc9a1c54292b64b47ec9538f53816e36ed0d0c1ae5ead06d477aa975ecebaf62d9023b77e50e7b6d4abdaa485ea34ec766beb1d9ba03c9c067186e2e38266c6e2531e97480214638a2bb31431ac2086797155fc775b3aad8d5a0b904c381edd0c6bc23c66a1904955ed450a9cbd16459c32f5ca354bbc2da7b1a4d814f1b8710aadb2ccc4f397758b7e9d91f3a91e5825ab8682ff5e41702e07841ac7698c3da9f558edd01f86ce2c506bf4c2149ac9c195a59c7dd7d4ecf93c90b4423b4350588d41672cedc8510a7ad53b4b7edcaf23e43e05669d27a1fe97b78730d3fc060bd4edd9872cffb96285351bef148ef783ab392116bd7b907bad", "signed": "0fc99dd3b9a0e8b1fc6e635af5c64006b67200fe958f53cce1b9b091a4e70669b593f15594bc0842e5576259f9a6859a0db22d740f9f8024b5baf1ef6f958c05ff7c6413e618a056de401ee10c40ade3d7c0e6861495d97c2689ec6abb69dd2ae701fdcac8f08331ea5c5f5d805b5789ee5e241ff4ac8b960f4f2b9fef6a727fad86dcd432de9fad6ba45e00aa3687b0ceeb2c0d430b7d5fde63b4f6b982c4f9e03c430abad9044d06dc49e89df481405d8febbb0653e9686948aad2d9072544df9424fd487f4e24ba7f2455ddec4105828c3981bddbb1b7fbdbac155903e960fcd94c0716e736f519867fbc52c51260f571d7edcb081a23550ad8c70bb268864ab276aa2cc2dbf62383bb66030ebe94354174ccec2d2a907578556444507cbf8488bb23c62423a3a98da7cc968f599d3dc84dca3afad7f14ec306e1db534143216aa22ad18074c719570805ea46bc86b71a8ff58e41e73cb29ad5750fcfc9a1c54292b64b47ec9538f53816e36ed0d0c1ae5ead06d477aa975ecebaf62d9023b77e50e7b6d4abdaa485ea34ec766beb1d9ba03c9c067186e2e38266c6e2531e97480214638a2bb31431ac2086797155fc775b3aad8d5a0b904c381edd0c6bc23c66a1904955ed450a9cbd16459c32f5ca354bbc2da7b1a4d814f1b8710aadb2ccc4f397758b7e9d91f3a91e5825ab8682ff5e41702e07841ac7698c3da9f558edd01f86ce2c506bf4c2149ac9c195a59c7dd7d4ecf93c90b4423b4350588d41672cedc8510a7ad53b4b7edcaf23e43e05669d27a1fe97b78730d3fc060bd4edd9872cffb96285351bef148ef783ab392116bd7b907bad", "signature": "0fc99dd3b9a0e8b1fc6e635af5c64006b67200fe958f53cce1b9b091a4e70669b593f15594bc0842e5576259f9a6859a0db22d740f9f8024b5baf1ef6f958c05" }, { "secret_key": "c718823f43db2217c66ab2899704165d208573de60f33bc0b9338d880f193fb5", "public_key": "2940b879b63f2cb1f6e3ef9c9d333ba91770fe18cc5a347fdf12b0efc5ca2ec9", "message": "050e6877f65ec726eec701863fab140b994aa1e92a487db1a18701312057db44bfde70911ec26eaa28632d03794d545dfcb2aed4340cab7d092595cd59ed23994043f50ba696e9802bd64990121397286457ae69d76cb8e34d7c1ab245cb07b1b408f2bbbfdf33a1bdd559636702c918f982c2ac0221f7f94db91edefce28118259f89d994dad5bb013c678c1c338b65396b15e8899c169921f278859ce0c856d889b8c63418ebc573d2d625d5b5938839f2b169b6916d8e40dde70d3b72887ad2478ef6fb1284fa0e4fc524e3c6fa1dd22ba6b81def8279f382bcb45048851b17cd659d59409f571fa8a920a20934d9dbe1022d635840965400240f870aceffd5db7c7df08af89e47e1b9e20bb99f96ab073edf53694c7482890e3631340217e687ab27c984b60825169457d435a5409ad8e42da0aa63e20c2bc67bd8b9a267f39673a77f7f3136dc5cb2d24948dbe7bcd7129318c68c6fe95dd4dd4fe942286831ea53352fbb252a1288bcd838921356785d072134cb820f6279cc71461f431be9d3014724321c92fdc576320137705cffb2c23664b705e9be60ae1a190f3e3484f70058e702407b056d7fe5d31cee9c2a6ac6eada3516abc5517256df1243780a03bb00ba00ce248076eeca6fee91d5ef9eb907b801af097f3e9eb256bdcde81efe4baf8189b0399e36f1eaa3ab626617cf3b47dd89caf69c64c5b8f68bd917fe03e4668538460a1be88d9a846cef39934627d474734f", "signed": "4c9cdb1ad46509560d871d3089afb8734648201b10acc953e8b61f2cce2dbae0fb9b868ac957432b7222dbf7e4cf0bc75309bea360b263abbde188532dda2504050e6877f65ec726eec701863fab140b994aa1e92a487db1a18701312057db44bfde70911ec26eaa28632d03794d545dfcb2aed4340cab7d092595cd59ed23994043f50ba696e9802bd64990121397286457ae69d76cb8e34d7c1ab245cb07b1b408f2bbbfdf33a1bdd559636702c918f982c2ac0221f7f94db91edefce28118259f89d994dad5bb013c678c1c338b65396b15e8899c169921f278859ce0c856d889b8c63418ebc573d2d625d5b5938839f2b169b6916d8e40dde70d3b72887ad2478ef6fb1284fa0e4fc524e3c6fa1dd22ba6b81def8279f382bcb45048851b17cd659d59409f571fa8a920a20934d9dbe1022d635840965400240f870aceffd5db7c7df08af89e47e1b9e20bb99f96ab073edf53694c7482890e3631340217e687ab27c984b60825169457d435a5409ad8e42da0aa63e20c2bc67bd8b9a267f39673a77f7f3136dc5cb2d24948dbe7bcd7129318c68c6fe95dd4dd4fe942286831ea53352fbb252a1288bcd838921356785d072134cb820f6279cc71461f431be9d3014724321c92fdc576320137705cffb2c23664b705e9be60ae1a190f3e3484f70058e702407b056d7fe5d31cee9c2a6ac6eada3516abc5517256df1243780a03bb00ba00ce248076eeca6fee91d5ef9eb907b801af097f3e9eb256bdcde81efe4baf8189b0399e36f1eaa3ab626617cf3b47dd89caf69c64c5b8f68bd917fe03e4668538460a1be88d9a846cef39934627d474734f", "signature": "4c9cdb1ad46509560d871d3089afb8734648201b10acc953e8b61f2cce2dbae0fb9b868ac957432b7222dbf7e4cf0bc75309bea360b263abbde188532dda2504" }, { "secret_key": "2543d166c9f5f7427ff3034ffa8103cb117bf472331a73d9a2f1bc0a02a6ff1b", "public_key": "42678cf3857021aa5567706db031e792715ccaf8abb02a042bad17db3d5fa103", "message": "746d7abf0bfb2662c25ab5c5e4612c306f16d13e44d0db394a0015676ce609784f0323da1dfa94d2b2f1f6e02444a936d019b143021f73c79df9309e7bdff39daeec4caca00cba4ef31c8310c1a08ef4b36f81c377846b5b90acd411aa671ed7af278a24229b7893c1b415d79888d7637f5cb5c9c6c631ae5ffa29f1340e444096ab533617fdcb80ff81da0a7c6c142ee0fe5ea82f68cc3ea38b56f272b0d80fd5f4f55ca9348c161881435813c3fa9fff66a2ee6d5bd3edba0d2f9aa74b1c44bfd0e64678d3715124963ac575ffb09ee16437da484b3ba58e5aeb8ed8c5c0f47b59908fe580f37ec1de266b295d6be85e62358e9bbdc78964fb837eea29fdb7de86cc56f48bd9a3e6e2be51d8a1dcff3ca4d56ea934c682772bcafb51497be5d0f2a23dd4970c02c44c09ad897b4241acd7d6ab12d8f00c9aadc334b431fec5bb69a285b7550a639ece96952682b7334b68c65152e893b1c8100c694d8c5cfe26ac03c1f3914e65c84f0e777290c76f6acce340bff66da7220f73175e94af52f9f19e61f80dc1f35716b3f48dfa5025c9ebef7382e055830f5bbf15c6f6a95032909c892c0f89c8c15fc3ea40a20ee1a4529b521951df44d9d79d74e0c4c2e0fed849b8785206dbe62bfa2ca21087a912e9b184551659cd8a587e95b04317192596bb0b7fc9f7bbb6ee049c8b02fdd758b4e79882073b71eaab18aa293701c17d55f9ec46c52de1e886b6750fb0fbcd64f4568a210ae451e9", "signed": "20ea9368a2ccd08bf9cbf48d4a2f7d03f0db08a54b87679cda03e296af9ef378be9b8f04b4065b009da6db016f3df9db64825873e2fb4de30449915cd73c4609746d7abf0bfb2662c25ab5c5e4612c306f16d13e44d0db394a0015676ce609784f0323da1dfa94d2b2f1f6e02444a936d019b143021f73c79df9309e7bdff39daeec4caca00cba4ef31c8310c1a08ef4b36f81c377846b5b90acd411aa671ed7af278a24229b7893c1b415d79888d7637f5cb5c9c6c631ae5ffa29f1340e444096ab533617fdcb80ff81da0a7c6c142ee0fe5ea82f68cc3ea38b56f272b0d80fd5f4f55ca9348c161881435813c3fa9fff66a2ee6d5bd3edba0d2f9aa74b1c44bfd0e64678d3715124963ac575ffb09ee16437da484b3ba58e5aeb8ed8c5c0f47b59908fe580f37ec1de266b295d6be85e62358e9bbdc78964fb837eea29fdb7de86cc56f48bd9a3e6e2be51d8a1dcff3ca4d56ea934c682772bcafb51497be5d0f2a23dd4970c02c44c09ad897b4241acd7d6ab12d8f00c9aadc334b431fec5bb69a285b7550a639ece96952682b7334b68c65152e893b1c8100c694d8c5cfe26ac03c1f3914e65c84f0e777290c76f6acce340bff66da7220f73175e94af52f9f19e61f80dc1f35716b3f48dfa5025c9ebef7382e055830f5bbf15c6f6a95032909c892c0f89c8c15fc3ea40a20ee1a4529b521951df44d9d79d74e0c4c2e0fed849b8785206dbe62bfa2ca21087a912e9b184551659cd8a587e95b04317192596bb0b7fc9f7bbb6ee049c8b02fdd758b4e79882073b71eaab18aa293701c17d55f9ec46c52de1e886b6750fb0fbcd64f4568a210ae451e9", "signature": "20ea9368a2ccd08bf9cbf48d4a2f7d03f0db08a54b87679cda03e296af9ef378be9b8f04b4065b009da6db016f3df9db64825873e2fb4de30449915cd73c4609" }, { "secret_key": "85e0a80f3b30c20199d9c1ec662e392fdf1546377343f12471db2a0310a705bd", "public_key": "540a3a1d83672e495034cff408e1fbe82e538f0917e8a1c7d17aab58e043d3c6", "message": "d2802f1596f8383b64edbdc594060bff0e7013d5b7c85d830fae11aeb34dd594959da624e044474c5409c0059673bdc61a671ef5b0b8a26f30100b3b73968d8e4d83a72f25b513448d2f6b6a4475fdf89e31ca9268a30705af3f649e3fe01dde0cf4b29ec2da5436444af091d62730acd4cab608f0df26f088c6b9b9673794f0747dab2ce190f90592009fdce5464b3661b7e8620bad65509a6c752b727a8dc8d3efa584fde0272c451d65a93bece4f59d87dc6fbeb451401e3e2e003c6aca7b3d3f92719150c6778f015aff2a59bfbf2e91b21b0ad6877536eb54567059f587f54d4e2a6fe1fdcdd6a7fdcb8515575bcc3705d77859352fa0b044166e3c318846a5df33563003cb20bc942d30391093e8d583e8e64dec570ee1c4138762f6483898d32e2032bde9bbe07ec2c3eb47d96876f0fc0f024d753ceb34ff8480b4cf576230bb8263dd80eeac662eba31d8a61f309e175f4c0143e28a852b1c3061ce78efbd16a2873dd28198a46ec0a800b30dc8a93b8dbb81a730de450b864dea7680e509d800e82329c261b07e72aa80ee16ec375ddbbb6fe3d8d47b0e3c5a9f23c4d20b724c1df59835d830dd22d10403d8f15c102c4b3769c41666c3ab8c7e80b940d0bbb58652d10a3ffe8d44df1012a3ddc4e1c518d49019f7c5d3d9f95ed93a319746d1e543ffa69edb49bb3439f8a325ac6a0cb4edd65ba60080a0447c674faa72d8aebdb5d2544f2f2d847c72c2dfa6057a690adc5c441a", "signed": "185ef2246aba2b1a568032c7df93c667799b8a521a6f97321ead5866b4cb9c65b64a1c40b9b6a910e742dc32a7e66d11ea45dbeaacae9f09511b8101f8af0c0cd2802f1596f8383b64edbdc594060bff0e7013d5b7c85d830fae11aeb34dd594959da624e044474c5409c0059673bdc61a671ef5b0b8a26f30100b3b73968d8e4d83a72f25b513448d2f6b6a4475fdf89e31ca9268a30705af3f649e3fe01dde0cf4b29ec2da5436444af091d62730acd4cab608f0df26f088c6b9b9673794f0747dab2ce190f90592009fdce5464b3661b7e8620bad65509a6c752b727a8dc8d3efa584fde0272c451d65a93bece4f59d87dc6fbeb451401e3e2e003c6aca7b3d3f92719150c6778f015aff2a59bfbf2e91b21b0ad6877536eb54567059f587f54d4e2a6fe1fdcdd6a7fdcb8515575bcc3705d77859352fa0b044166e3c318846a5df33563003cb20bc942d30391093e8d583e8e64dec570ee1c4138762f6483898d32e2032bde9bbe07ec2c3eb47d96876f0fc0f024d753ceb34ff8480b4cf576230bb8263dd80eeac662eba31d8a61f309e175f4c0143e28a852b1c3061ce78efbd16a2873dd28198a46ec0a800b30dc8a93b8dbb81a730de450b864dea7680e509d800e82329c261b07e72aa80ee16ec375ddbbb6fe3d8d47b0e3c5a9f23c4d20b724c1df59835d830dd22d10403d8f15c102c4b3769c41666c3ab8c7e80b940d0bbb58652d10a3ffe8d44df1012a3ddc4e1c518d49019f7c5d3d9f95ed93a319746d1e543ffa69edb49bb3439f8a325ac6a0cb4edd65ba60080a0447c674faa72d8aebdb5d2544f2f2d847c72c2dfa6057a690adc5c441a", "signature": "185ef2246aba2b1a568032c7df93c667799b8a521a6f97321ead5866b4cb9c65b64a1c40b9b6a910e742dc32a7e66d11ea45dbeaacae9f09511b8101f8af0c0c" }, { "secret_key": "82a2c6493f11ba80e4b8b3b43841be970e2a10a94d2249d8ac6f5414cf5a3cb5", "public_key": "4c2ee01cdea07db3635f5d4c1082b92f298deb17d0f905df71b66fb2274eae99", "message": "09854d13684950419e0bb16464e09988905c0217183aa1e48adb147bfcc2eb57c2300b0dfc39d4896655a57ae20415408bb5f2c238013955f0a4fc782e0c993fe42cb08cd8cf415ccbd6cf1cee2e8097f04e8f09ae5da5f415b16c2cb30cb2ab6652ba50ebbcae4a59e31fe11e7ef3699ca90aafa586bb242c89cd2e332b2bfa2f8142accaf436f89b6453bb4805a1e7f3ab6270f0daf89389e717d1b70175ec5707c8f512c40ab924c457e9f0914791750dc292bb27d6f63ba8ccf54b90d3eba7f19eb300d9eb8f3b72032ba93037f552b409b580a5f65116faffe0fdfdc6db3881386c3cbc16b67eb25763d7ae3aac0b85aa1e9aa22e4959609d4381e4b6d7159ff3e3b2d37b640f88cfbe4f8a77f8016457228ba6d3af5c4e33125d48bcfcf3678c163b698e52e85617ab1a75ff20c690ab07155ee757598578072d4a09dfc6c6c094ec048567d513ce2b1834e163df1545319d8061e0e57f58ef041b7bffc4966ac1660331b97abbc97be21ae2bc58c6c3274a8adad5fd2c3bc16b92e1f8de877b6a26f0c6ab7162e8aab93af8d85918c13d3e235a273748c62f0d22cb1c93e134a495b1b5ef8f1a1134512d53b7a211263177f7a60bdf474691f224a3b5bac4006db345ca6725f5ee703eca0dea10d712676f63ef3e537e63abd2608cb4fbe200e15f18209153496072908044c95a4e9c5356aae8ed5f0959eac091e227a0b81f5803276b3b3bf4b6865a55fc6782f62ea6d63990f9befe01", "signed": "68a91d4f8d241c1defbd5ca9e9e1ed8274419506751c967947b10d50118bbfabc765ffd7b31a0167c4fd8b1175332412df19d8aa1a909590861320923dbcb20409854d13684950419e0bb16464e09988905c0217183aa1e48adb147bfcc2eb57c2300b0dfc39d4896655a57ae20415408bb5f2c238013955f0a4fc782e0c993fe42cb08cd8cf415ccbd6cf1cee2e8097f04e8f09ae5da5f415b16c2cb30cb2ab6652ba50ebbcae4a59e31fe11e7ef3699ca90aafa586bb242c89cd2e332b2bfa2f8142accaf436f89b6453bb4805a1e7f3ab6270f0daf89389e717d1b70175ec5707c8f512c40ab924c457e9f0914791750dc292bb27d6f63ba8ccf54b90d3eba7f19eb300d9eb8f3b72032ba93037f552b409b580a5f65116faffe0fdfdc6db3881386c3cbc16b67eb25763d7ae3aac0b85aa1e9aa22e4959609d4381e4b6d7159ff3e3b2d37b640f88cfbe4f8a77f8016457228ba6d3af5c4e33125d48bcfcf3678c163b698e52e85617ab1a75ff20c690ab07155ee757598578072d4a09dfc6c6c094ec048567d513ce2b1834e163df1545319d8061e0e57f58ef041b7bffc4966ac1660331b97abbc97be21ae2bc58c6c3274a8adad5fd2c3bc16b92e1f8de877b6a26f0c6ab7162e8aab93af8d85918c13d3e235a273748c62f0d22cb1c93e134a495b1b5ef8f1a1134512d53b7a211263177f7a60bdf474691f224a3b5bac4006db345ca6725f5ee703eca0dea10d712676f63ef3e537e63abd2608cb4fbe200e15f18209153496072908044c95a4e9c5356aae8ed5f0959eac091e227a0b81f5803276b3b3bf4b6865a55fc6782f62ea6d63990f9befe01", "signature": "68a91d4f8d241c1defbd5ca9e9e1ed8274419506751c967947b10d50118bbfabc765ffd7b31a0167c4fd8b1175332412df19d8aa1a909590861320923dbcb204" }, { "secret_key": "e55b343a0fa1fb747189cb00dbc3a6aa2dcf5b86e57d7693f307420389761153", "public_key": "23a14460ea983cf997c782eb4582ab3c8aa6dde53325b977b78e33d2dc5f27aa", "message": "36289b5eaff2a85a7c6d575bd15ea594b2fd8510874a469b52109163696d85b68c5b211d2964efdc66e625abe8aafe4cd9220cdb341107ffa8276ed4b370fe376c1482687167dbc8f7b205a3f3301a1664d9072877d9f98b8f69831301df9994717fc88969242391d9b0517d6efb271701eab3f4a9b1204213e8cd13f9d099048b8207562f2e4ebc653cc65e9d5512d65b41022c79b4eb37298769aeaa6efed69e9a8cb445c7012274de62f509f4e4814adcbf4453b4fab85d7c8fd845e00830ef5b7b1e63c67613984caefe915a548e18e505622cb2b39299f427f4d83983ba2aa00d53bee1f59aec8318c5ea345d294252369792762add3e56fcfa6e7797f028c799479045edb2e205eb6dd6ca04eee56f9496d2bf26099357c973835b9936024911e4655d3e22c811c8d4dbd1b04f78973f077523a389b6f28f6f54216142cb93e33d72b4a5052d27e4911e41e6cec7bebe1b0a5113e6b70b479d2abeedf69b7564e5a573b352d16cec890701bb383d3f6656eda0892f8ccc70940f62dbe528a65e31ac538826c138ac66524e331637ba2d37730358e6c732cff8fee940afd22c39ae381e5d8826739b23fdc1b80aea5a62a2cf0ff1525e446cf31046195051d58503eed1befd793eeae1d5d1b62a5c9845157a095cdc08a1d77ba47e84a5a739980f0f5be7aaec9a215b204b4bb7cb1b386ded58d7aaf7285341907c63336ee3e6ef077ad111b974e7504bd989f566fda1b1b59abaa91c78bb40", "signed": "07266c18650ecf0632e225624ec4c97fc387dc374687a61956dccce72894ee138aabc80cfc90c9eea6dd4c59af4502ee29635a92880786678b14a3931a69f90736289b5eaff2a85a7c6d575bd15ea594b2fd8510874a469b52109163696d85b68c5b211d2964efdc66e625abe8aafe4cd9220cdb341107ffa8276ed4b370fe376c1482687167dbc8f7b205a3f3301a1664d9072877d9f98b8f69831301df9994717fc88969242391d9b0517d6efb271701eab3f4a9b1204213e8cd13f9d099048b8207562f2e4ebc653cc65e9d5512d65b41022c79b4eb37298769aeaa6efed69e9a8cb445c7012274de62f509f4e4814adcbf4453b4fab85d7c8fd845e00830ef5b7b1e63c67613984caefe915a548e18e505622cb2b39299f427f4d83983ba2aa00d53bee1f59aec8318c5ea345d294252369792762add3e56fcfa6e7797f028c799479045edb2e205eb6dd6ca04eee56f9496d2bf26099357c973835b9936024911e4655d3e22c811c8d4dbd1b04f78973f077523a389b6f28f6f54216142cb93e33d72b4a5052d27e4911e41e6cec7bebe1b0a5113e6b70b479d2abeedf69b7564e5a573b352d16cec890701bb383d3f6656eda0892f8ccc70940f62dbe528a65e31ac538826c138ac66524e331637ba2d37730358e6c732cff8fee940afd22c39ae381e5d8826739b23fdc1b80aea5a62a2cf0ff1525e446cf31046195051d58503eed1befd793eeae1d5d1b62a5c9845157a095cdc08a1d77ba47e84a5a739980f0f5be7aaec9a215b204b4bb7cb1b386ded58d7aaf7285341907c63336ee3e6ef077ad111b974e7504bd989f566fda1b1b59abaa91c78bb40", "signature": "07266c18650ecf0632e225624ec4c97fc387dc374687a61956dccce72894ee138aabc80cfc90c9eea6dd4c59af4502ee29635a92880786678b14a3931a69f907" }, { "secret_key": "3973038fa2ef6a278d3c1cff9a225669e465a69d0750503de748c002dbf9278a", "public_key": "c75e77c78149d9d2dbc263ddf8ac4d654d1ff455cb1897e1c3ce31b94cfe3210", "message": "3392e02f3c84661eaf81a5ff04357f212e92361c5c220739d96b4d3d9c22d18df48be6b55126f581601ffe0da63f38e19cbb12726ca0a6aa325567a003a7849d06783992eb9eb92853297d7228dba980b250bb110f63d0b84670e5ecb319cbfd61278f1f4cabf1fcb3f701f12f6ef8d3cc4282fcbe589eb5659503a2ddd8bba38e5eff092dfaf539fd804f21f73a90adf569a00bf9d25a9ad3a63309cc6093142471a478f0b8992286de023c68efd49987ec270bd946f6db48f684f1c2adeee26d68dce95a55e4cb27bc60523080df6ba2b199996b1f1da6920d1559f79bfde9fa1a02deae1480c76f947f9d213fc43bb2880a1b4d03bb14f5b044a0fd83ce0492f49ca3af25211b86faa5735ad7feaf31a1a7491e708b41829d68e32414f68352b71d1cd23c8e12fb02da711484f6ef97528a00d24fcf91d4e06e9badae9a44dbdb3f778041768d863704d736810400e7f2931efb85c8724a593426aa2af1ec5b664f85c2254896fdcf316db0924e11aae8d683e9a021929d0a9d6fecb4594b1b3fbc16b176d29d1efb1819a4a423fbe0ca0559c57e9e5449f14bce91360dafda6a427ce4a0993dd03082ddee066533f6d3bda5660f42fd7757690d670598ec7096f475a01a519950341a831fc9a281c0947a863f1f6e03bba774de77adc23fbe525cae6ccce47a0ec4979e8bec86f332fc6a5736e3b98fb332e9e8244e68a100455e6499ba8dbae98b92ba3d9c6b4ff980343e4c8ef4d5a4aacf8b1a", "signed": "fc0c5453839ea99296fffa501d58366628df89f616766942d5040a056056dab18b4405c04abf9059c30868d79c936cccc84c4fbd6fd30b60f8bcbd7a664042023392e02f3c84661eaf81a5ff04357f212e92361c5c220739d96b4d3d9c22d18df48be6b55126f581601ffe0da63f38e19cbb12726ca0a6aa325567a003a7849d06783992eb9eb92853297d7228dba980b250bb110f63d0b84670e5ecb319cbfd61278f1f4cabf1fcb3f701f12f6ef8d3cc4282fcbe589eb5659503a2ddd8bba38e5eff092dfaf539fd804f21f73a90adf569a00bf9d25a9ad3a63309cc6093142471a478f0b8992286de023c68efd49987ec270bd946f6db48f684f1c2adeee26d68dce95a55e4cb27bc60523080df6ba2b199996b1f1da6920d1559f79bfde9fa1a02deae1480c76f947f9d213fc43bb2880a1b4d03bb14f5b044a0fd83ce0492f49ca3af25211b86faa5735ad7feaf31a1a7491e708b41829d68e32414f68352b71d1cd23c8e12fb02da711484f6ef97528a00d24fcf91d4e06e9badae9a44dbdb3f778041768d863704d736810400e7f2931efb85c8724a593426aa2af1ec5b664f85c2254896fdcf316db0924e11aae8d683e9a021929d0a9d6fecb4594b1b3fbc16b176d29d1efb1819a4a423fbe0ca0559c57e9e5449f14bce91360dafda6a427ce4a0993dd03082ddee066533f6d3bda5660f42fd7757690d670598ec7096f475a01a519950341a831fc9a281c0947a863f1f6e03bba774de77adc23fbe525cae6ccce47a0ec4979e8bec86f332fc6a5736e3b98fb332e9e8244e68a100455e6499ba8dbae98b92ba3d9c6b4ff980343e4c8ef4d5a4aacf8b1a", "signature": "fc0c5453839ea99296fffa501d58366628df89f616766942d5040a056056dab18b4405c04abf9059c30868d79c936cccc84c4fbd6fd30b60f8bcbd7a66404202" }, { "secret_key": "c71cc10ad2d443e025ad0625686b123503e590193a2bc8cc57a7b9b4158de6cb", "public_key": "fc06acaab53ad08e9762dd11cd2122b31599bd2598ce6f248795e732219c2fc7", "message": "2e0846536dc6cce19ccf82dc2d0cd21bd4e1ca7bc317067af8d90ee4818c8518bc3ef960ce112a41d2b9979a282ae13d706a005e0034f06b39ff4b0a5afaed70b561bcceb1bbd2ec19f97448eaed4be620e36a962d878c6f80172b9fad43eed07ff93db9b9ca2262d5a3c229c54e30a45e73660892f048e363f37144ed1921f72992b4d01529870cfe373b7e7cbedaf969269fb70aa783d1e74417c7bae0fe03d951fdb8c71c62e9be7fdd5d233e39f46fed057e49b6f34068459148da3d424161ad2c869508602e9c0bb30bfb88acd5f4dfdffd473503cdfedabc4442b743be075e7c6f610e64ffc2e53187745cd719658fc6e62a5be518437c5bd6a4feba94ae3f44f2f29308e831feefed676909ce5e80c84cbdcac47e47d27c9712a01f6bc5daedc02e6414407e911c0a5a53e5328a5a5fd9f040aa7fb70b79b31cd1b6fd9bd5029040bd22ae222fd2f6870d07f435322639cf3193ca5709b882b07a58f952a9963e568f8c5a584a6b9e275c5c07957a4d2cdaa9f1eb444ed1224bac6563b2f9273e80301d44d50ae383b597213b00da5bf27e5d1fe240cc3bb65aa5030d651b6b5b31761d53ce0c6d74a15dad5479f31c915ccf446659853b89a51a28ee8976853553fd2e02fe7243538d00b4ed07d8b8a80b5c165cd46341ffd8163c555702663a4e6ab2952b7e7443d0f6b123b6946721aa63e87b1155eca8a6a1bc9fd25c6762e52742c86bca1ba9d8370415244f0edfdbe0932b5ca0611509c9", "signed": "2eb33bc2d5deb7f3a2dcc377b0c6a862134bf3191ec40fc128ac28abf2316ef1401649b8f4cfa1a936de79b532dc043b6d36024b4c37bba29290ac9f449ba60d2e0846536dc6cce19ccf82dc2d0cd21bd4e1ca7bc317067af8d90ee4818c8518bc3ef960ce112a41d2b9979a282ae13d706a005e0034f06b39ff4b0a5afaed70b561bcceb1bbd2ec19f97448eaed4be620e36a962d878c6f80172b9fad43eed07ff93db9b9ca2262d5a3c229c54e30a45e73660892f048e363f37144ed1921f72992b4d01529870cfe373b7e7cbedaf969269fb70aa783d1e74417c7bae0fe03d951fdb8c71c62e9be7fdd5d233e39f46fed057e49b6f34068459148da3d424161ad2c869508602e9c0bb30bfb88acd5f4dfdffd473503cdfedabc4442b743be075e7c6f610e64ffc2e53187745cd719658fc6e62a5be518437c5bd6a4feba94ae3f44f2f29308e831feefed676909ce5e80c84cbdcac47e47d27c9712a01f6bc5daedc02e6414407e911c0a5a53e5328a5a5fd9f040aa7fb70b79b31cd1b6fd9bd5029040bd22ae222fd2f6870d07f435322639cf3193ca5709b882b07a58f952a9963e568f8c5a584a6b9e275c5c07957a4d2cdaa9f1eb444ed1224bac6563b2f9273e80301d44d50ae383b597213b00da5bf27e5d1fe240cc3bb65aa5030d651b6b5b31761d53ce0c6d74a15dad5479f31c915ccf446659853b89a51a28ee8976853553fd2e02fe7243538d00b4ed07d8b8a80b5c165cd46341ffd8163c555702663a4e6ab2952b7e7443d0f6b123b6946721aa63e87b1155eca8a6a1bc9fd25c6762e52742c86bca1ba9d8370415244f0edfdbe0932b5ca0611509c9", "signature": "2eb33bc2d5deb7f3a2dcc377b0c6a862134bf3191ec40fc128ac28abf2316ef1401649b8f4cfa1a936de79b532dc043b6d36024b4c37bba29290ac9f449ba60d" }, { "secret_key": "0a4f5e1670f1e24bfa37b73c994330b36e7daaf930161b78a4a84866ff25e3d5", "public_key": "9dcbba903981594c7b677ea8002001d664cff7ce8e5cfae58840cf74aff0d3a9", "message": "f4b05b3efdcb1d5c07da950c46565528440bb48835ee4c13f43d7a1618de119ebbb259ea7480a5048174faecc1055b32dc01ac7156344321e8eba698f302ee1643b5f04b8e7ecca63b91561ce3514abe7851b6fb17fc943bdc94da308c8e4769fec20fadf4fa8e7f62b6ffb5f170d644ed29355ebd22cb3aa1486b1e367c729dd3f79bcd40ffd08af28cebc8d776e1a483e911d79bc613e09cc621cadeb034dd6f72374771985127f7a3a1aa786a523ae6e34ee433dc30c375987cff50bdcbc997fcd51c94567a67aefb6ef5edf9bdd65964d464be9ebdfb88c0e231b07ff6405c00f82531e961bfc5ead266bcc08718878cafb1d37536f183e48bf38d3f6be900252d1fb419e6a2ac5896039f63c31401fff932ce9814b085ab20416972a2b351c815a62de509674628b0d3566fc9c2e0a9237b93f9bbb2deedf02bff83bf6d868b6399326d4809d0419f31b2f3a481285b94078b47061ce91dad583dd5b13bd010fb30f2495bb70420183a930159e4db193df6acd124423e039a67f15688aec50c5927fb271822aaa66f294bc805d3bc7c8341878a541009f30da99fcc0085079ce7fc55e0011685562abdb3a9471ffde6176300ef5b31e0df609a54a1ee6624070da99c8776891fdf6aa78b4d55b1f5dadfc061add5af00fd3adedb448c559bfff204068043a5d1d6214748628c3ebc5f0224326ca18ef048425da9300133fb695d4f263165ac22f3619d405af271a71a9afb198bf631241d3459b95398", "signed": "dcf353b2b99a4ef45f3fdf6528632e8abdc433342476a8c2b37900404a4e333d387814235757ef7ad03858a0f35d4615e8aba484fd64f1112ec1b1aed2cb640ef4b05b3efdcb1d5c07da950c46565528440bb48835ee4c13f43d7a1618de119ebbb259ea7480a5048174faecc1055b32dc01ac7156344321e8eba698f302ee1643b5f04b8e7ecca63b91561ce3514abe7851b6fb17fc943bdc94da308c8e4769fec20fadf4fa8e7f62b6ffb5f170d644ed29355ebd22cb3aa1486b1e367c729dd3f79bcd40ffd08af28cebc8d776e1a483e911d79bc613e09cc621cadeb034dd6f72374771985127f7a3a1aa786a523ae6e34ee433dc30c375987cff50bdcbc997fcd51c94567a67aefb6ef5edf9bdd65964d464be9ebdfb88c0e231b07ff6405c00f82531e961bfc5ead266bcc08718878cafb1d37536f183e48bf38d3f6be900252d1fb419e6a2ac5896039f63c31401fff932ce9814b085ab20416972a2b351c815a62de509674628b0d3566fc9c2e0a9237b93f9bbb2deedf02bff83bf6d868b6399326d4809d0419f31b2f3a481285b94078b47061ce91dad583dd5b13bd010fb30f2495bb70420183a930159e4db193df6acd124423e039a67f15688aec50c5927fb271822aaa66f294bc805d3bc7c8341878a541009f30da99fcc0085079ce7fc55e0011685562abdb3a9471ffde6176300ef5b31e0df609a54a1ee6624070da99c8776891fdf6aa78b4d55b1f5dadfc061add5af00fd3adedb448c559bfff204068043a5d1d6214748628c3ebc5f0224326ca18ef048425da9300133fb695d4f263165ac22f3619d405af271a71a9afb198bf631241d3459b95398", "signature": "dcf353b2b99a4ef45f3fdf6528632e8abdc433342476a8c2b37900404a4e333d387814235757ef7ad03858a0f35d4615e8aba484fd64f1112ec1b1aed2cb640e" }, { "secret_key": "b855c81805c7087410e69f96b0240271dc76c1e4ade38c6a9278e3c94fbea256", "public_key": "6adb025a40260f569884b8cab3752b4f255c373e2b424b6287ebb510fa06fff0", "message": "85a9bdb70a6c752897e43a91106ee9a99c2ca94ff7b4461a44a39174c17ecd99df46eecd81c3f52513dc9d547dad3721c6d5ee1f8fac0ba5afb3687044739ed535b844008704c09fe1e5d785d4c9c3d0b05889b9c20fc3fd68df12dbeb2c34f6f7ec1c6fb7fa811ff846b5a61fa5fe55379ee63abcd373fed00254ebd06bc8b22f7fbf2f727a5fad88514159e26d78dfdb0957f6efaf51a8e80b585e838b9621d051074a4f5867b4ae2f2ff6d62b85bccec0b4aaa4791637388c0901fd49dcccce7204859f81eefc639fed92280456e69a1509b4b1bd7624447d862c45a0c8b0c5bb2c4ca512cbc037f51b780982b183a5cafa15297585c947a25be8c2240ebfb6868ece5ea2aab2c239c83754c7d594b3725aceef344ba7e6aef49f7f313b0ae82ccacad387a6e9337f05f8c799efe7829b27b4d5b201fd5ae5834351690759f3ea175fd4741be228d807fb54df4a741038faee47edf1f561652598601f27155fc50d9d5011433711c106d4b60785a5cc93b3fdd1dad70c0c8eaa33f1512e35a541745e376c15167fa8f6b3b2c4c3a366fc41497d297357816ae795a804c980e7cbfb0c74d8835d929ae3bb52bab12964566d746bd2c1d132b6233fa34f75e268edee775eb3ce132e6beb2e8d71f0c8762991cde4e26f71439dfa83978f995603861bc0b1d9060bbccaccf86f8745ad96994d5d007d52e83aa5e69412964bdbfbe4780aaa8de41be1298abbe9894c0d57e97fcacc2f9bbd6315d3fcd0eaf82a", "signed": "3caa813273e753542ffbfeb21bc3e2cf8ca7d920faac7c49dc2aa9911768c7ad43b38b0236db27f3eeae0b1206001e665a607078c522ed7a9dc468853463590085a9bdb70a6c752897e43a91106ee9a99c2ca94ff7b4461a44a39174c17ecd99df46eecd81c3f52513dc9d547dad3721c6d5ee1f8fac0ba5afb3687044739ed535b844008704c09fe1e5d785d4c9c3d0b05889b9c20fc3fd68df12dbeb2c34f6f7ec1c6fb7fa811ff846b5a61fa5fe55379ee63abcd373fed00254ebd06bc8b22f7fbf2f727a5fad88514159e26d78dfdb0957f6efaf51a8e80b585e838b9621d051074a4f5867b4ae2f2ff6d62b85bccec0b4aaa4791637388c0901fd49dcccce7204859f81eefc639fed92280456e69a1509b4b1bd7624447d862c45a0c8b0c5bb2c4ca512cbc037f51b780982b183a5cafa15297585c947a25be8c2240ebfb6868ece5ea2aab2c239c83754c7d594b3725aceef344ba7e6aef49f7f313b0ae82ccacad387a6e9337f05f8c799efe7829b27b4d5b201fd5ae5834351690759f3ea175fd4741be228d807fb54df4a741038faee47edf1f561652598601f27155fc50d9d5011433711c106d4b60785a5cc93b3fdd1dad70c0c8eaa33f1512e35a541745e376c15167fa8f6b3b2c4c3a366fc41497d297357816ae795a804c980e7cbfb0c74d8835d929ae3bb52bab12964566d746bd2c1d132b6233fa34f75e268edee775eb3ce132e6beb2e8d71f0c8762991cde4e26f71439dfa83978f995603861bc0b1d9060bbccaccf86f8745ad96994d5d007d52e83aa5e69412964bdbfbe4780aaa8de41be1298abbe9894c0d57e97fcacc2f9bbd6315d3fcd0eaf82a", "signature": "3caa813273e753542ffbfeb21bc3e2cf8ca7d920faac7c49dc2aa9911768c7ad43b38b0236db27f3eeae0b1206001e665a607078c522ed7a9dc4688534635900" }, { "secret_key": "95b9c8a6ef80ebd5cbd47a04ca54387373df4d67a2b475597765ac89fcf93e93", "public_key": "f2c947b18adc3ea6a23f7abca364b9853ae85a2b0c8c26f0d3173c2732c3c7ff", "message": "7855bc392630ccf531d3061606ddfc81a0fd9294c54791b5f9559b6827254aa1f25c540b7d7df3ec9cdf14256629dbcf9b725feb3412ebf35f0ef9379e4131cc77e0f0fb6f7459a738361a99ae4ccb2b60a99fe92bd6c3a53d6f454ee9005bcec5aedcfa82347392efcf1175e578396a8d800daba0f4c2cf4d4913b0528620e3baa0f6d86e0628e47c0ca26df3b0c788c4e16557f7fc28df820c12fbb6ffbfecb9829ddb65ef8d63e90d68fc7194b5b885913f08edee84567647ffa3f0d0d325d082600ce71a2345c77d65bd96252003e5c125a718a07370c31b5708075cf1837c6925635cc68dd1b751e40ab608b0d9d8852c18d3069219ef807b76d288f92c29a93e3d75b5b2e53681671d3ae0145ac03ccad3162e44703b0401d3eb167cd8ddc1e1a5a326b728b1e0c00a94d86de61352a661e40897175d28d341e4d1d9962e35f4de18a54017611ad05359ce08b97bfedbfbe3992ed58ed40f517aab01c0fefe8b63643da1a454152730bf99af8740adf98a77b8d73adb08e609e00ce9b1ccdfef3e9a9b05aa56e0bc79b6bbba80dd8e461af7cb202892d89b2d05a4458ab3fa54b474b8f8f581795d6c2739e59d0fe062400bae2d2d534b340bb8e2615777a9a5615bb2cf437ba525e00e7038f22a57882ac520b333e75c3c92a8b9f0e37f671c94b15dd8182a08d7c143e94e9262b3cc5544c294f5f335c2b28ac119fea00f9634db063993988b5f150579c7cc25b6a1fb0dde94804fa6ef66ff79fb9107", "signed": "2c8bf543e2a3e00415ee4f107b2f5a6687176f5d521117759ceb561751bcc77d9b08a6a631f6447cd901de96699aebb168bf97500dc54a0543ef14e4b5a081067855bc392630ccf531d3061606ddfc81a0fd9294c54791b5f9559b6827254aa1f25c540b7d7df3ec9cdf14256629dbcf9b725feb3412ebf35f0ef9379e4131cc77e0f0fb6f7459a738361a99ae4ccb2b60a99fe92bd6c3a53d6f454ee9005bcec5aedcfa82347392efcf1175e578396a8d800daba0f4c2cf4d4913b0528620e3baa0f6d86e0628e47c0ca26df3b0c788c4e16557f7fc28df820c12fbb6ffbfecb9829ddb65ef8d63e90d68fc7194b5b885913f08edee84567647ffa3f0d0d325d082600ce71a2345c77d65bd96252003e5c125a718a07370c31b5708075cf1837c6925635cc68dd1b751e40ab608b0d9d8852c18d3069219ef807b76d288f92c29a93e3d75b5b2e53681671d3ae0145ac03ccad3162e44703b0401d3eb167cd8ddc1e1a5a326b728b1e0c00a94d86de61352a661e40897175d28d341e4d1d9962e35f4de18a54017611ad05359ce08b97bfedbfbe3992ed58ed40f517aab01c0fefe8b63643da1a454152730bf99af8740adf98a77b8d73adb08e609e00ce9b1ccdfef3e9a9b05aa56e0bc79b6bbba80dd8e461af7cb202892d89b2d05a4458ab3fa54b474b8f8f581795d6c2739e59d0fe062400bae2d2d534b340bb8e2615777a9a5615bb2cf437ba525e00e7038f22a57882ac520b333e75c3c92a8b9f0e37f671c94b15dd8182a08d7c143e94e9262b3cc5544c294f5f335c2b28ac119fea00f9634db063993988b5f150579c7cc25b6a1fb0dde94804fa6ef66ff79fb9107", "signature": "2c8bf543e2a3e00415ee4f107b2f5a6687176f5d521117759ceb561751bcc77d9b08a6a631f6447cd901de96699aebb168bf97500dc54a0543ef14e4b5a08106" }, { "secret_key": "b786ccfb586d43b8c46bb97b96c918731bc2cc119277f123671e30148158d2ed", "public_key": "90c7004600f3dce409fdeadc8ed018f9ea263f75160a74ab54f4c2399a90ca78", "message": "babf48bd55ea91bd0c93b970241b529d9db43d4927fea5f1a1f7082dd6cb50a52b094b3129fcd903a44fec8bfdb5c86c002a2a452887ca25a60eceb5e1f9f5c93dc59423c7afe747c6bf407cacadeccf5d787970cb0617bb3cfe7fd17563d3a0dc91631f71b84be24ae800113750f031d01fd05364b4f27f86f8dc3ad7407e1ae9e768154e3dde58e867129e2474547b408217964844858d056b31c374991b7f161f52f088b806e0f313d68a15c5401ed55b2b77deea586cb054dcd71af2ab6ab11e84b30c539345de3eb43fb7b3a3b48987c3bfa70655d599f2e31d12ad23cc96e86d380bfda812feff3dd3024292916907022891e119bfc3ed9c25546cd19fc992d8a61e6059ca3ce7802af1118756620b87a7242bd83897c94dd5a36ed40fc0f34c2c93110b37d17dd96a22062590bcdb546742ef7218adccc5ad28f4fce6ecf705835f4113d82ea533903aec8c3820fe4b4715f37e20cebc1e71519aa0b240b4840aa4fdcfb52467fedd8f4d1f9bc33ee114f3ef85f5fdb09ca884af388ad3adf84c793f386efe6ff8a46ed81e5d45a37c25cd80f2d7363f43ae45e3772c0df89f11447939806c096ef933a13944f0890d887c2e5bbb6b12ea950b09b8fe425289377352f35f84cc4dcd4d7a449489fa9251c03113489225809cdf3cb63475f10d341709371c6fd4bb7a949483d1bc2b31ddf4d963a07de7ea5c3fee9a0e33f0769f2faa40612a546974bde0b7339179e4124a447bd42879ccda5c8ad1819c53", "signed": "52ba9658a1a0b3e98ed5209e393e420066a37d3714daa73d5c671d33075a5f5727fe4e081ee0fa3c2133dc953a2da620291371f00ccb57d8792eb596a2ff8101babf48bd55ea91bd0c93b970241b529d9db43d4927fea5f1a1f7082dd6cb50a52b094b3129fcd903a44fec8bfdb5c86c002a2a452887ca25a60eceb5e1f9f5c93dc59423c7afe747c6bf407cacadeccf5d787970cb0617bb3cfe7fd17563d3a0dc91631f71b84be24ae800113750f031d01fd05364b4f27f86f8dc3ad7407e1ae9e768154e3dde58e867129e2474547b408217964844858d056b31c374991b7f161f52f088b806e0f313d68a15c5401ed55b2b77deea586cb054dcd71af2ab6ab11e84b30c539345de3eb43fb7b3a3b48987c3bfa70655d599f2e31d12ad23cc96e86d380bfda812feff3dd3024292916907022891e119bfc3ed9c25546cd19fc992d8a61e6059ca3ce7802af1118756620b87a7242bd83897c94dd5a36ed40fc0f34c2c93110b37d17dd96a22062590bcdb546742ef7218adccc5ad28f4fce6ecf705835f4113d82ea533903aec8c3820fe4b4715f37e20cebc1e71519aa0b240b4840aa4fdcfb52467fedd8f4d1f9bc33ee114f3ef85f5fdb09ca884af388ad3adf84c793f386efe6ff8a46ed81e5d45a37c25cd80f2d7363f43ae45e3772c0df89f11447939806c096ef933a13944f0890d887c2e5bbb6b12ea950b09b8fe425289377352f35f84cc4dcd4d7a449489fa9251c03113489225809cdf3cb63475f10d341709371c6fd4bb7a949483d1bc2b31ddf4d963a07de7ea5c3fee9a0e33f0769f2faa40612a546974bde0b7339179e4124a447bd42879ccda5c8ad1819c53", "signature": "52ba9658a1a0b3e98ed5209e393e420066a37d3714daa73d5c671d33075a5f5727fe4e081ee0fa3c2133dc953a2da620291371f00ccb57d8792eb596a2ff8101" }, { "secret_key": "dd1a9774f7584d8589b19f92ab6939ac485602fe1644cee2f6f3cd60fbd58400", "public_key": "4bea7d0b0f4bd590f9e3579f0c5fa4cef4d60a49d2c437a0aaead9d43a73d4a3", "message": "e5dc3ed26c1f693cf852465a05e3048b505db5116d9e31592205a9c3d4720bc10b6c20639a0ee2f0e147225b5b19ea511cfba0c21aac10715a2f232f10c2c8aad41112b6b012e75a4155f8c6926253ca2b4ddb7bfe7f86e90a53dbc0cba89e485ceca8fd26e50c7f282a253573cb0a8fa88cc44623e82e8fa2edb6cbc7538ac92c11e4c5b1ea5f68966d15d93c34f396d27572f864382ab76a7be65a557b139766368a207d98bc0c20926370dea27048160363ed85f4099e7cd66d12d0988cfc9e2f16aa565f8f33b39e978c0587371f92db5056317564411bd8a3b6fea09d3487aaf734034918ffed1c9fba7bdec6fe68876fc7360cc5629b92104027fe5759c5ab365354751e7969116c3b9a21b152330a96a9381af730d17822d78ad6ea860006915b5cab447a759372e05d495ebb328e75d248daa02f5d2eb978d2710cf1c5fb824876770e32ca6de2c730564892415bcb53e5981d707add961c5f37fdafa1399af8aea960458d2ca310553f7c9866ccbe8e9d88e08a446872ea66fc308c824514b7dace0334db735e6f14c85b5e619a5d605648a881e876c78dbe0657233d4f7f3bfddf63b445311d6abc476347ec4fb43c8946f9d17c369381d1c564ffcfe2dc7b4726fd57387f0b44db8ef95a0b4e32a7bedf319e53a9e7126c2811f9829d1f4ae9abd9d5f42efef2075f47051c63a4f8202040ec4723686382c6033127c1fbfff4bc82373508752d431dc473f52ddeab0342dc4f5447f8f25738ef65d78556", "signed": "1959bde0a697a63993ec47d158223739fe65871fa05870d7de0d38086591202a51b174d1c6182808c6ce62631d81dba34ebed4af2f29b06c00a57a3cb6663606e5dc3ed26c1f693cf852465a05e3048b505db5116d9e31592205a9c3d4720bc10b6c20639a0ee2f0e147225b5b19ea511cfba0c21aac10715a2f232f10c2c8aad41112b6b012e75a4155f8c6926253ca2b4ddb7bfe7f86e90a53dbc0cba89e485ceca8fd26e50c7f282a253573cb0a8fa88cc44623e82e8fa2edb6cbc7538ac92c11e4c5b1ea5f68966d15d93c34f396d27572f864382ab76a7be65a557b139766368a207d98bc0c20926370dea27048160363ed85f4099e7cd66d12d0988cfc9e2f16aa565f8f33b39e978c0587371f92db5056317564411bd8a3b6fea09d3487aaf734034918ffed1c9fba7bdec6fe68876fc7360cc5629b92104027fe5759c5ab365354751e7969116c3b9a21b152330a96a9381af730d17822d78ad6ea860006915b5cab447a759372e05d495ebb328e75d248daa02f5d2eb978d2710cf1c5fb824876770e32ca6de2c730564892415bcb53e5981d707add961c5f37fdafa1399af8aea960458d2ca310553f7c9866ccbe8e9d88e08a446872ea66fc308c824514b7dace0334db735e6f14c85b5e619a5d605648a881e876c78dbe0657233d4f7f3bfddf63b445311d6abc476347ec4fb43c8946f9d17c369381d1c564ffcfe2dc7b4726fd57387f0b44db8ef95a0b4e32a7bedf319e53a9e7126c2811f9829d1f4ae9abd9d5f42efef2075f47051c63a4f8202040ec4723686382c6033127c1fbfff4bc82373508752d431dc473f52ddeab0342dc4f5447f8f25738ef65d78556", "signature": "1959bde0a697a63993ec47d158223739fe65871fa05870d7de0d38086591202a51b174d1c6182808c6ce62631d81dba34ebed4af2f29b06c00a57a3cb6663606" }, { "secret_key": "66f5ea8cdb95ee1a75e32467d7c83c59447742c85ddd499c43c08673e149053a", "public_key": "a8ad04b9c144b97fe867374d4fe57d7ec0c249183e43bdfb5d52644e7fbe1df3", "message": "c0d01dceb0a2d17191101879abb093fb077571b521be7b93a117c696c0872f70ea1139ab628329ee5655fc0aa77e8111d2fc884748c1f267b9eb09dc26f57fc402d61ba36f63f4d589aae63c76eeee15bf0f9e2dcde4e4e3e78fc6c29e3a93f3ff0e9a6e0b356645953890debf62dbeaf4905178d4f0a5a592c19294eeba7c21cf8f1bb3f4512187376de72f1136a48ac2dfaf32d0f37de064592592b6e1bc0c512cf4d2d85d16797853a80933b09c2f7bfb9e54a69e51a8e423a91c3e5fdeb4790533e87a4b1c0e0e23a9db9573ac17ab6ec7014d8b7c4486e15725f8d264eea3050e835ae0ac449db334502a6d97358fa859106ad0f6f4295f2344920adf9355a6949d8d145c25628a46a104ca099bd9dde941119c83820cdc2cb2d09722694901043c37cf0ae879be2030d0373158b9c4b0718298be45f630f6fcdc190f7b2926d87655a18bb797ac50757fcd3655c9e41d5163293d9a13d984f591f75b7e4e5cadb64c4c9fdfef76cab69381d0f60b483f804bb3b33364df8cffacb3c9b13ff4c8d8d4ea40766a7d42d8256c6b1c11c191daba1b8ef21593e47b18858ec19d817358678d8548ff1535d5fcf4414b6a11d34a3742f8d7149fa681383a9408887f1c0a98ed521e72793277824d6f746d49b63d444e312e6d9b986611258196a5b012b88faa29f9a6c67ed25df87b2dbf0dbd2dc3080c5b8d15a37d34729098ed0de92d75807429b2cae5d7283c4e5c9bd196d1ad436c7c34f3c9466e5cb3196b443f4b", "signed": "ec5c7e8392fa8b61bc829681866e45ac8be4b5b7b6a822c1bcd0f2cc2c8c44c33cf83fa42d43a2f1884141b4a59aaff47f9be07e632e2018759324eac9d14900c0d01dceb0a2d17191101879abb093fb077571b521be7b93a117c696c0872f70ea1139ab628329ee5655fc0aa77e8111d2fc884748c1f267b9eb09dc26f57fc402d61ba36f63f4d589aae63c76eeee15bf0f9e2dcde4e4e3e78fc6c29e3a93f3ff0e9a6e0b356645953890debf62dbeaf4905178d4f0a5a592c19294eeba7c21cf8f1bb3f4512187376de72f1136a48ac2dfaf32d0f37de064592592b6e1bc0c512cf4d2d85d16797853a80933b09c2f7bfb9e54a69e51a8e423a91c3e5fdeb4790533e87a4b1c0e0e23a9db9573ac17ab6ec7014d8b7c4486e15725f8d264eea3050e835ae0ac449db334502a6d97358fa859106ad0f6f4295f2344920adf9355a6949d8d145c25628a46a104ca099bd9dde941119c83820cdc2cb2d09722694901043c37cf0ae879be2030d0373158b9c4b0718298be45f630f6fcdc190f7b2926d87655a18bb797ac50757fcd3655c9e41d5163293d9a13d984f591f75b7e4e5cadb64c4c9fdfef76cab69381d0f60b483f804bb3b33364df8cffacb3c9b13ff4c8d8d4ea40766a7d42d8256c6b1c11c191daba1b8ef21593e47b18858ec19d817358678d8548ff1535d5fcf4414b6a11d34a3742f8d7149fa681383a9408887f1c0a98ed521e72793277824d6f746d49b63d444e312e6d9b986611258196a5b012b88faa29f9a6c67ed25df87b2dbf0dbd2dc3080c5b8d15a37d34729098ed0de92d75807429b2cae5d7283c4e5c9bd196d1ad436c7c34f3c9466e5cb3196b443f4b", "signature": "ec5c7e8392fa8b61bc829681866e45ac8be4b5b7b6a822c1bcd0f2cc2c8c44c33cf83fa42d43a2f1884141b4a59aaff47f9be07e632e2018759324eac9d14900" }, { "secret_key": "ed2558e5c56784bcfb4f4ddea3c0dfbef8d96ff1cabf158ec4abe60aff66999e", "public_key": "1edc991012ac6f888fa7e6045777e9ba1d4c03c40292d2da6b722b4ad0a3ed74", "message": "2c6433e9bfbf4cfd4e071f15ce6b129d780a4b3de014fac034e0d44ef772e2c8b0d6a3481d7b3ddeb237632673553313deac1efafe3702a7a4411e12bd341e8d8e96c59c5e30c36807a8385a538e9b66907d6a528400bd9f95eedc5216b28fd7437d8f4a029fdbdc7c938e4eb9812fec05ea693229629ace6acc7af6ba4c238e7722f312f7896b004922f7067ede106f8e70154d783fb41291f3c7e2e4826045b5741bcb4a8838f87a32e0049704e9b53234c224ff898a756e529134c1a9bf50fd029819b2238b60b2aec1128f34d21f9d66983bed398659d808b67a2e501b5a1f25f71f0f0c1eb2fea0ab42d82ff3bc9358bb20c27520c144cf2116f4a49cbc61994d2d710546694c4f602dc406e0b0c27e5f5e64667e95c2ec9df2d6529cf53622ea10b956b345ec55b6c39a1e6ed88ae66e5b457179425d1a849037b07c46cf5f363301095837ce811bff4960bf9cbd15201c1b6740bd70102140744c3327aca9d6d6d154936798ac381fa639db436ee8165667d538a6c74a233c124bf604fdad51984c4170b8200d2df73c29bb1e376affc314dde3e86af9d2c2e6c3a6524d321bce93e21fc965564faf77d0cd1accb4d7629485f564c79f4d8a2fdefb465454028c6dd1428042805370743363bb18476a3f2320db2589c72133cf5e29dafb7d07aa69a9b581bab5a83f403eef917afa14b764c39a13c0c5ea7019d2fdfbd7f3f7d40eb63b2a084da921895fe48f4fd594017f82569b467ab901169eb5da9c40171d5f", "signed": "ab9e01166524fd288e5c689e56d730d4983000551030493334a3984e2223dc9f7a5b910c61760c6157990a4c335e348e3a7bc8223e09c10c5e520c8d61aff5002c6433e9bfbf4cfd4e071f15ce6b129d780a4b3de014fac034e0d44ef772e2c8b0d6a3481d7b3ddeb237632673553313deac1efafe3702a7a4411e12bd341e8d8e96c59c5e30c36807a8385a538e9b66907d6a528400bd9f95eedc5216b28fd7437d8f4a029fdbdc7c938e4eb9812fec05ea693229629ace6acc7af6ba4c238e7722f312f7896b004922f7067ede106f8e70154d783fb41291f3c7e2e4826045b5741bcb4a8838f87a32e0049704e9b53234c224ff898a756e529134c1a9bf50fd029819b2238b60b2aec1128f34d21f9d66983bed398659d808b67a2e501b5a1f25f71f0f0c1eb2fea0ab42d82ff3bc9358bb20c27520c144cf2116f4a49cbc61994d2d710546694c4f602dc406e0b0c27e5f5e64667e95c2ec9df2d6529cf53622ea10b956b345ec55b6c39a1e6ed88ae66e5b457179425d1a849037b07c46cf5f363301095837ce811bff4960bf9cbd15201c1b6740bd70102140744c3327aca9d6d6d154936798ac381fa639db436ee8165667d538a6c74a233c124bf604fdad51984c4170b8200d2df73c29bb1e376affc314dde3e86af9d2c2e6c3a6524d321bce93e21fc965564faf77d0cd1accb4d7629485f564c79f4d8a2fdefb465454028c6dd1428042805370743363bb18476a3f2320db2589c72133cf5e29dafb7d07aa69a9b581bab5a83f403eef917afa14b764c39a13c0c5ea7019d2fdfbd7f3f7d40eb63b2a084da921895fe48f4fd594017f82569b467ab901169eb5da9c40171d5f", "signature": "ab9e01166524fd288e5c689e56d730d4983000551030493334a3984e2223dc9f7a5b910c61760c6157990a4c335e348e3a7bc8223e09c10c5e520c8d61aff500" }, { "secret_key": "b72798b811e2338431256d2480fe7a3663acecbbe6e6c1b9191e9d9a22447940", "public_key": "ce491daad296b55727b09513df02ba5928a371737cd35841e5f735acab7c5df8", "message": "a5d46298b0790610aedc0970fea2a7075081847266f22f12478b93d7e674c6c517f3c14ed061269d170ac31e2a64f9754a565bac1dd9757322c11132e7bbee5f32818e0e3063ab64e552d09b0fd1757639b9b9d1c770016b677465872b669dd48be038665751674dd2f40a966a26748fd3e5dbfd92265eb936f55b094286c010629904347cb4c526e377470aa96e8169a6f211633807a50030e7ff68e38911b3555e728ed8590b2dc45fea69945cc0c9a3d3e6c954b3e80106a5c91d3d22e89e8c0e1de902058e9cd0f8ce806eac4f893ee0429900fb5487b8fd36dbdcb34f2d54fc6cc74a923951b863da70f1b692bf0438484366cd85eeb880b279f8fca9d3242c558330f1ca57c6a58608cdbc0773e16082bca964ddc40347da8a36b2a9328c2f46609e092fd64b4134eee1d099813e1246489e8ee5b19b3d3b891c28f30b38b6a28ec1d3e9b005dec9c63f8b9813bc1de4aaf995f1779dded15c7a430d70ca46e7cafd4e9a543804446ab0807d64f255e201ef428a474dae8a0a75021b62ad3988ffb81cd8221b243085a0ad046fdc16c67f17b9f81820095953a5b98acbdf93ebcf80bc9c99af5fbffacb61a9251c5aafdb22b1129bfc60c98e0f175263bdf93dc9a08b8efc2e8cdaf0f83d6c49ec901645eac5a4ff63385a6f1af2071897662a372219c9301f545a2ebb8f5917db7f29ca13fc861af38d90c35c03ac9184c122e57b057cde426fd76dca79e25e64dbb41c8414a0450da4905b902ae98d2da4ba792801", "signed": "dcfc6fd47799fec772c2099b3c6437246c3ad07229fc740e05311a206b18b02ecdb026c926f49c6552e347fd35dfde06cb639a797c50612f98e2478a92aaf609a5d46298b0790610aedc0970fea2a7075081847266f22f12478b93d7e674c6c517f3c14ed061269d170ac31e2a64f9754a565bac1dd9757322c11132e7bbee5f32818e0e3063ab64e552d09b0fd1757639b9b9d1c770016b677465872b669dd48be038665751674dd2f40a966a26748fd3e5dbfd92265eb936f55b094286c010629904347cb4c526e377470aa96e8169a6f211633807a50030e7ff68e38911b3555e728ed8590b2dc45fea69945cc0c9a3d3e6c954b3e80106a5c91d3d22e89e8c0e1de902058e9cd0f8ce806eac4f893ee0429900fb5487b8fd36dbdcb34f2d54fc6cc74a923951b863da70f1b692bf0438484366cd85eeb880b279f8fca9d3242c558330f1ca57c6a58608cdbc0773e16082bca964ddc40347da8a36b2a9328c2f46609e092fd64b4134eee1d099813e1246489e8ee5b19b3d3b891c28f30b38b6a28ec1d3e9b005dec9c63f8b9813bc1de4aaf995f1779dded15c7a430d70ca46e7cafd4e9a543804446ab0807d64f255e201ef428a474dae8a0a75021b62ad3988ffb81cd8221b243085a0ad046fdc16c67f17b9f81820095953a5b98acbdf93ebcf80bc9c99af5fbffacb61a9251c5aafdb22b1129bfc60c98e0f175263bdf93dc9a08b8efc2e8cdaf0f83d6c49ec901645eac5a4ff63385a6f1af2071897662a372219c9301f545a2ebb8f5917db7f29ca13fc861af38d90c35c03ac9184c122e57b057cde426fd76dca79e25e64dbb41c8414a0450da4905b902ae98d2da4ba792801", "signature": "dcfc6fd47799fec772c2099b3c6437246c3ad07229fc740e05311a206b18b02ecdb026c926f49c6552e347fd35dfde06cb639a797c50612f98e2478a92aaf609" }, { "secret_key": "1fe7327ea907d3ff179b117811d30193fcba4c347b90657feed98deeecda9ac9", "public_key": "eef301b16fd7bf3c7b640bf5ee8700ac5a87169eab5f56015b3f499d955e07eb", "message": "19a832f26fbb0239f0d9d26a2ebded2403c2a406dd1f68318d677afa64f35043316a5efd729783c7f9d18c09824614652091886cc954be9f9312d4586bf36f3035ac703438b0cfe3dec5077813c710d1447561ab6157bc7ad5eab5b0c0afdcc9db77e66fa8071366829c501096c3d3a938218a6e4207109d1eb81f7d88bd6fbb2aefb1adef3594aae57c46b7b984db9468cd962c6184fb976f0e2aa84152deb1c76aea75ae488442943a80ba7d98a28cb864b5e87cdb284ad6e8d7aadc6b75d69d3bd345783b3ebb676ff95d7b4191e599851c9628835c7c01197e7c8f86f9c8fb49fe3e28458ba9b0236219bd46c28df6532496994ac9ba733c0105a02a269a2be8b7cb40074b881602ef9247052de9d637089188bd4c185ccae258a2ae9856a2cbf8451117683ce341f8096e1d91e874c5cb8a4e0939eb77373a9a0eb791645b8f5460472d669d8014681a5e778706cb5566bbd4727d1716b23c620d228b5d4dc2b352b423931f8a7e8fb59edad8ae42458729861a98e0c850a77ed655e7fcfe4fe36f9772df1ac3c643ad31db5630d571df9fcc9c50de7622108411962bbf72defbf49e997059c7311bd9ddd5b338a9851938d37e7a262108a291e2016803bbeff4f9c776125ceb7e7272b51c7c33461d8089f8408d8dda92506d5002084d4f414d8a4d28d3694c88630e31801990d95271cef47aa5c263f97b7daca1788701436329b5bfaf72653c166db087708130c5c0d78cc4e9064f860680271afe4c409853c2fad675", "signed": "9c7fdb53fd606bc7c9c223fe9431e1ad009546d00098812a495197f2541e87f8d6f5da22ecefcbb7da56662a7309d10a6c4a4f7f299278d51bbd11e0cc1b870919a832f26fbb0239f0d9d26a2ebded2403c2a406dd1f68318d677afa64f35043316a5efd729783c7f9d18c09824614652091886cc954be9f9312d4586bf36f3035ac703438b0cfe3dec5077813c710d1447561ab6157bc7ad5eab5b0c0afdcc9db77e66fa8071366829c501096c3d3a938218a6e4207109d1eb81f7d88bd6fbb2aefb1adef3594aae57c46b7b984db9468cd962c6184fb976f0e2aa84152deb1c76aea75ae488442943a80ba7d98a28cb864b5e87cdb284ad6e8d7aadc6b75d69d3bd345783b3ebb676ff95d7b4191e599851c9628835c7c01197e7c8f86f9c8fb49fe3e28458ba9b0236219bd46c28df6532496994ac9ba733c0105a02a269a2be8b7cb40074b881602ef9247052de9d637089188bd4c185ccae258a2ae9856a2cbf8451117683ce341f8096e1d91e874c5cb8a4e0939eb77373a9a0eb791645b8f5460472d669d8014681a5e778706cb5566bbd4727d1716b23c620d228b5d4dc2b352b423931f8a7e8fb59edad8ae42458729861a98e0c850a77ed655e7fcfe4fe36f9772df1ac3c643ad31db5630d571df9fcc9c50de7622108411962bbf72defbf49e997059c7311bd9ddd5b338a9851938d37e7a262108a291e2016803bbeff4f9c776125ceb7e7272b51c7c33461d8089f8408d8dda92506d5002084d4f414d8a4d28d3694c88630e31801990d95271cef47aa5c263f97b7daca1788701436329b5bfaf72653c166db087708130c5c0d78cc4e9064f860680271afe4c409853c2fad675", "signature": "9c7fdb53fd606bc7c9c223fe9431e1ad009546d00098812a495197f2541e87f8d6f5da22ecefcbb7da56662a7309d10a6c4a4f7f299278d51bbd11e0cc1b8709" }, { "secret_key": "5f9dcd93fb140610b0e211b39addb1eb87ba97804877afbcc381388cad650845", "public_key": "182a237d878c581933332b4178b67ec408b3194d44e4e69392ef800b267c2949", "message": "c38b874d3ff010fff1a6613bfa134257b24833cb536de3e74992c3cb01fe3bbdeed97dc3c4596fa44061442bd31a9d4aa8c81e34ad9888718206635509b133b1ba69cb1aa0e75c7a1893c080161d26152acef40f6ef4210e952a49828b5cdde804bcb536cdc349a8e831b4b69d3785a76bd9fb27080565972d0b8fbd16f3f960a6bf3ba0c5b9c404967ec1affe59b8c4ecc650fdde1cb06b70595ad4d325da0fab4c5540a7a8d5ebeacc4e99bd0dc96bde82f2bd7d9586308465e55b1cc388d750486bdd5c7264d54f5614d48726d99e44d7778d9ed0323958ab9858e2b25df2bf994ba3e625e2803b6c6931e7a9926f1e61ed862403ce392ab83b7d1b66085dcc06d82dbf176d016d9f44cdcb5072d004591e92d0459ef05a51b8f54ba17251e16621ebb753e5b1590c02d21e40f4b75eee4602860b9741fbbc0d2e385b8daca83cce68c34a99bde6a60d13ba64347d0a38d64b2ade250f38852c4eda2e2e4f303c3de1a8a9d4ab3300c9e63622879fc8537ffc63b18561fa1fff65531241515a62bb9b08b80af37667a601ae04171793cc83b11adf9c30ca9f4dabc7b401e16a1814cfc750248cc2f77e03f9c4334465ff6a2c83cbb56db4b734751043832c4000972ee3232f929f23337eba5e651e34cbddfe68ba219b632e7acdbd4630a031bf1689fbbc7fbbb210dbf25ee87e2ef2b3cbaf8d9ebd8fc92c3a58d3c05b1385a76c87791d7cd3741b71b6c329de9a9d7508a0c156a9521a9020563099a82b8770ae9a944a7e94", "signed": "c1915e052b664797e0d5faadc78f2a009d6fbcfde03f3aaad59b9f4588e7fc3b21990c5208d3d76b4aa95bd934e88d3c98c591930a59de2a056701d9f7577400c38b874d3ff010fff1a6613bfa134257b24833cb536de3e74992c3cb01fe3bbdeed97dc3c4596fa44061442bd31a9d4aa8c81e34ad9888718206635509b133b1ba69cb1aa0e75c7a1893c080161d26152acef40f6ef4210e952a49828b5cdde804bcb536cdc349a8e831b4b69d3785a76bd9fb27080565972d0b8fbd16f3f960a6bf3ba0c5b9c404967ec1affe59b8c4ecc650fdde1cb06b70595ad4d325da0fab4c5540a7a8d5ebeacc4e99bd0dc96bde82f2bd7d9586308465e55b1cc388d750486bdd5c7264d54f5614d48726d99e44d7778d9ed0323958ab9858e2b25df2bf994ba3e625e2803b6c6931e7a9926f1e61ed862403ce392ab83b7d1b66085dcc06d82dbf176d016d9f44cdcb5072d004591e92d0459ef05a51b8f54ba17251e16621ebb753e5b1590c02d21e40f4b75eee4602860b9741fbbc0d2e385b8daca83cce68c34a99bde6a60d13ba64347d0a38d64b2ade250f38852c4eda2e2e4f303c3de1a8a9d4ab3300c9e63622879fc8537ffc63b18561fa1fff65531241515a62bb9b08b80af37667a601ae04171793cc83b11adf9c30ca9f4dabc7b401e16a1814cfc750248cc2f77e03f9c4334465ff6a2c83cbb56db4b734751043832c4000972ee3232f929f23337eba5e651e34cbddfe68ba219b632e7acdbd4630a031bf1689fbbc7fbbb210dbf25ee87e2ef2b3cbaf8d9ebd8fc92c3a58d3c05b1385a76c87791d7cd3741b71b6c329de9a9d7508a0c156a9521a9020563099a82b8770ae9a944a7e94", "signature": "c1915e052b664797e0d5faadc78f2a009d6fbcfde03f3aaad59b9f4588e7fc3b21990c5208d3d76b4aa95bd934e88d3c98c591930a59de2a056701d9f7577400" }, { "secret_key": "925ebe04c6eac49b26738d6c1300f31fd4828478cbe97dab18bb889642e1e110", "public_key": "cd7231b6eb74e1fe9f926f00d8de2c513d49640525b0795cab893d0c8929e3e0", "message": "e6c0bad23a92ae8b1d85778288157ac6c617c63363341d777870341bb10a8d3dfc89be4f55ad4f64e83bf2499b69fdf72174d2844e6bd289daaa035fec5bf7cf45522119dc7a8c811d79578c5bb0f6d34db507ad1fb6dbfff997b79dacfb3da50a415e350c998c0a02800aa50ffdfe5f4276d8e6bb82ebf047fe48711daf7a893bdc7537bdaedf3dcb4dec5d24586811f59b25b19e83ca61e5592fedc08ca54473cea2ec121baa0e77fb2d9d765657de67980ed57f2f177858b6decf84ff90212d9647f41eed9b9d0ea3d8d621e4bb4041acc5146e96dfcf14ea962d30c8ccb39ea2be958c9b8774451bfeb7ddce716e94923cc85fbd3a3130780e2b3b2bb76da5341912a4e994cafa19bba19732f2ea402d71d3d8a969679b9d104243d9839c69ee9e955e1c60449788d1f4f6651f4bc9b94d73522ec0cf72cacfcf19f1f03ad6232104b55cbb8b5bb1e21344713d482742d6abc5a957174f623b8495272cc1e2b8315e5c80f947f500c83d8544f7cd4f65348949ef4420d7fc831fa4ae2ee18dbba614925ce1d767c177a626c4527a8154b57292186b044cbf92894253b00fd9343f9e697b1412eba43597eb72a669aaa2d77eacb968c20fe19505a38074158621b606f77d97bc6ebe50e7589293db27fc7dfe631a4bee83b22682a77328c36d9d7d1d891d65217cc47864f680dc8b5fd1a01a0f7c34430f77060b691a1ad213d22868e61bbd38f43f0c8b4da68a58318666c099766170c2db766aaf417f556cc9a0a3934e9fcef1", "signed": "2c4d69bed5ad8b9584d849cf3df2bac72282b5f30de266b14f533ca96e9550c4b854c154bdc17aa880cf001a6454ffafaa2e50178de21216ed126b63f77f2d02e6c0bad23a92ae8b1d85778288157ac6c617c63363341d777870341bb10a8d3dfc89be4f55ad4f64e83bf2499b69fdf72174d2844e6bd289daaa035fec5bf7cf45522119dc7a8c811d79578c5bb0f6d34db507ad1fb6dbfff997b79dacfb3da50a415e350c998c0a02800aa50ffdfe5f4276d8e6bb82ebf047fe48711daf7a893bdc7537bdaedf3dcb4dec5d24586811f59b25b19e83ca61e5592fedc08ca54473cea2ec121baa0e77fb2d9d765657de67980ed57f2f177858b6decf84ff90212d9647f41eed9b9d0ea3d8d621e4bb4041acc5146e96dfcf14ea962d30c8ccb39ea2be958c9b8774451bfeb7ddce716e94923cc85fbd3a3130780e2b3b2bb76da5341912a4e994cafa19bba19732f2ea402d71d3d8a969679b9d104243d9839c69ee9e955e1c60449788d1f4f6651f4bc9b94d73522ec0cf72cacfcf19f1f03ad6232104b55cbb8b5bb1e21344713d482742d6abc5a957174f623b8495272cc1e2b8315e5c80f947f500c83d8544f7cd4f65348949ef4420d7fc831fa4ae2ee18dbba614925ce1d767c177a626c4527a8154b57292186b044cbf92894253b00fd9343f9e697b1412eba43597eb72a669aaa2d77eacb968c20fe19505a38074158621b606f77d97bc6ebe50e7589293db27fc7dfe631a4bee83b22682a77328c36d9d7d1d891d65217cc47864f680dc8b5fd1a01a0f7c34430f77060b691a1ad213d22868e61bbd38f43f0c8b4da68a58318666c099766170c2db766aaf417f556cc9a0a3934e9fcef1", "signature": "2c4d69bed5ad8b9584d849cf3df2bac72282b5f30de266b14f533ca96e9550c4b854c154bdc17aa880cf001a6454ffafaa2e50178de21216ed126b63f77f2d02" }, { "secret_key": "4dd3b478ebdc59472bab14a8cdd0c2fdac5723ee04dd8917c7cfe7a536485c77", "public_key": "5bccb37e68c234bead49337de208afbaf611811d965859a06d31301247d66acf", "message": "1cdbd28556ec44e8705afda92bd5a53f95d8fe8b0ffe463373633316c52274c11edcd61551e3199e494dff6d906a739e7b324303fc47827e56def0bdcc46b816017c712305370263babd2c71be478f41ce30b1df63bedd3b2e6a519c53df515852c4137bc1aca49bf4c4631fd6564657d11cd83ea73cc3d0cf9e3b3c3e7ca99b4f12a9c9b67c8798148e0a0dc1ef8bf58642a14f97a572135514c10b19aabec25a9c6b35aa4034a57aae1b6d05bde2b6330f251d78db0993f0ca4c26386e3489a2092833b8acbbc4f4917fd3093df582fff71ece219d3672455582609c0db8d96a70fc8aed6798de54bfb2b3ee6c5d328db163593f58019f38f339fd3753f896a4a2cca8c1400a77ea391935f34e2639c560860810bbbe4be1d16e012c11490aa84f2964c877c293b300f43d379f3eba9af391dee510856a4ddcf76e0a0ae06a6a7c0f9c5e3fa1b8354fe8977b4ea3b20661491fa4613ba62f556d5d5da8213d0121de2c8725df0aae048ac891abbc06bdcef3c3effdf5a31749476f814db9457945f0d91e14080056be921a16aa964a9298221b157594973e32969993310c8707e19f3143abc4fda7c8ad0160acf031aba652801aa81a016b3137039e27d6738d02800a93a86f9f5585c518dfa9e7d8ac727f37437e56d2788386e11653a04e165169f903972a01484751e7cb38632590ec80d5fce4541601a0e095785a9ee8d359edf26b9946e798da5998cbb736f94eb713463f79f561759bbcb4c4ac693cabf2e1e036b2d0b0879a", "signed": "5788e79e843bde9ef11a9dfac970196a567c6308c348e5174b387795046d590a47491fd71d97aeaa78c1615971b83490e8592820f9592ac76269b9d2ba7029011cdbd28556ec44e8705afda92bd5a53f95d8fe8b0ffe463373633316c52274c11edcd61551e3199e494dff6d906a739e7b324303fc47827e56def0bdcc46b816017c712305370263babd2c71be478f41ce30b1df63bedd3b2e6a519c53df515852c4137bc1aca49bf4c4631fd6564657d11cd83ea73cc3d0cf9e3b3c3e7ca99b4f12a9c9b67c8798148e0a0dc1ef8bf58642a14f97a572135514c10b19aabec25a9c6b35aa4034a57aae1b6d05bde2b6330f251d78db0993f0ca4c26386e3489a2092833b8acbbc4f4917fd3093df582fff71ece219d3672455582609c0db8d96a70fc8aed6798de54bfb2b3ee6c5d328db163593f58019f38f339fd3753f896a4a2cca8c1400a77ea391935f34e2639c560860810bbbe4be1d16e012c11490aa84f2964c877c293b300f43d379f3eba9af391dee510856a4ddcf76e0a0ae06a6a7c0f9c5e3fa1b8354fe8977b4ea3b20661491fa4613ba62f556d5d5da8213d0121de2c8725df0aae048ac891abbc06bdcef3c3effdf5a31749476f814db9457945f0d91e14080056be921a16aa964a9298221b157594973e32969993310c8707e19f3143abc4fda7c8ad0160acf031aba652801aa81a016b3137039e27d6738d02800a93a86f9f5585c518dfa9e7d8ac727f37437e56d2788386e11653a04e165169f903972a01484751e7cb38632590ec80d5fce4541601a0e095785a9ee8d359edf26b9946e798da5998cbb736f94eb713463f79f561759bbcb4c4ac693cabf2e1e036b2d0b0879a", "signature": "5788e79e843bde9ef11a9dfac970196a567c6308c348e5174b387795046d590a47491fd71d97aeaa78c1615971b83490e8592820f9592ac76269b9d2ba702901" }, { "secret_key": "074d9218c1217e75823c90e010484c2adb88ecccd2bdf0120aa3edffcfcbd4bf", "public_key": "3735ad1919033d1617b85bda04b16121da1d861b404154fa961d4946e55ecd83", "message": "6b5aa40e9167bfdb847daa7d2786e28e7533e1d6ac53beb6f69b5953795a2bf59bbf7d141926968f50969bad742a4fb579d3250fb1be4c57ebf4f9112c70cd9f72a00db1c8896fe2b5bda7c7030f497c0b001ea25ba0d447f08c36db8b907c2f2abbbb620d3e8a2c66e4171285adcaadd1c14fe239bc595f098396aa8780ffb80fe1446a07001ec234d82abdcd8100793915b0b3f80d84e20e51eabc797806f3be8108a4f437550b06694050a82931ac40c0a48977edf6ced2428d7cfea8205506de86408065d1a19870fa33a7081037b3ee4491b6e7f3d10b14a30c209159a1c81231a35f0365b47d3e0da04a32c95d98333c44f572cdaaa905d069197f6e861b5dfcdfb9db6c7b0d0cb00f37c916a1c4c0b8985b09f334095e1283edfdd4e62a2941099a2b693696604d994311e3d5f6106683e1d7a1c7e53df7b790947a9a801a0ccd484395f6cbfd9ca4d9804f18d52bb0f946d1a89f97a6fb0680a8c4c057b6062b2b9de7c0374879b8a6a6d2c10aef780508eb28bb569a08350944c82f6ef28db2304db697c3ae1af43a500b0b974803e9f46ea2a02e85ed27dda616d24d6db3cc4f5aed8240b1aea3dcf69dee5f14f95e6e72987bbe6189bc2045f0d783a7b47bfc19830bc7f4e798abe90245fbd43f37c3f036d1cbf1e73dcb1d9daa87379b1106973481a215c1f4f46c1603a5d5cd97b7076f1f5dc789aa6a71e72ef54ed328a4ab64340539ffd164d0ec645f322d1bc37112dc08d8c8079d19d37abb2353f48b5c492f806ed2", "signed": "b1f71c3bd1b6bec43337e26dee655a8d5f4a8dad84a51184b775b686fad31d8029e3876927f9576e90c3624875fc0029a5c10a8a0af75d7a880c6844a4a83a006b5aa40e9167bfdb847daa7d2786e28e7533e1d6ac53beb6f69b5953795a2bf59bbf7d141926968f50969bad742a4fb579d3250fb1be4c57ebf4f9112c70cd9f72a00db1c8896fe2b5bda7c7030f497c0b001ea25ba0d447f08c36db8b907c2f2abbbb620d3e8a2c66e4171285adcaadd1c14fe239bc595f098396aa8780ffb80fe1446a07001ec234d82abdcd8100793915b0b3f80d84e20e51eabc797806f3be8108a4f437550b06694050a82931ac40c0a48977edf6ced2428d7cfea8205506de86408065d1a19870fa33a7081037b3ee4491b6e7f3d10b14a30c209159a1c81231a35f0365b47d3e0da04a32c95d98333c44f572cdaaa905d069197f6e861b5dfcdfb9db6c7b0d0cb00f37c916a1c4c0b8985b09f334095e1283edfdd4e62a2941099a2b693696604d994311e3d5f6106683e1d7a1c7e53df7b790947a9a801a0ccd484395f6cbfd9ca4d9804f18d52bb0f946d1a89f97a6fb0680a8c4c057b6062b2b9de7c0374879b8a6a6d2c10aef780508eb28bb569a08350944c82f6ef28db2304db697c3ae1af43a500b0b974803e9f46ea2a02e85ed27dda616d24d6db3cc4f5aed8240b1aea3dcf69dee5f14f95e6e72987bbe6189bc2045f0d783a7b47bfc19830bc7f4e798abe90245fbd43f37c3f036d1cbf1e73dcb1d9daa87379b1106973481a215c1f4f46c1603a5d5cd97b7076f1f5dc789aa6a71e72ef54ed328a4ab64340539ffd164d0ec645f322d1bc37112dc08d8c8079d19d37abb2353f48b5c492f806ed2", "signature": "b1f71c3bd1b6bec43337e26dee655a8d5f4a8dad84a51184b775b686fad31d8029e3876927f9576e90c3624875fc0029a5c10a8a0af75d7a880c6844a4a83a00" }, { "secret_key": "d2ea2dff7af0ba2a6bed7f6cc68c0df664a6b10ce801c42ed5bbe617bcc8b84a", "public_key": "ab44706344026ed35e21982964f7b4dbbbe207fd27c46799701c19a4d88d1d72", "message": "03ab5daebc6e70d352977932a03107879bd55dafd0c6ba7ad9697a17b127b3a74a3eaebabd0f8eeebfc0483d63fedde52deb46a3752449c9c4495c51a1c91f57e3ad2e6d01a13d0c470c5291b8e912288340970fbb85787b8b376d72175250e8cd90c07888bfef5ebf5086c8ff2abcdd12d214b9c45d120873b4602e57a6aab0b828d1084dffaa3651ee35662695b7f3433f4ab530c29ac6cc5bb43eccd1b6898b9ef7aec6d5aec68d5c1114bb5df7820966594c994d640891b8f2dc5d25638de43549d86d34306ff3f574575116405b9e8e286ee0cd978a76002c4435feaac6e84eae1654f339a567d8d04fcfa3eb6a04b9adc666021300e9ee5972b3df5d4d0dd4bf7921dc98de82cef2d1b1d61b797fc9968e118484c41342416ddc6adc4ee5d687d94a40ce572f42a2048668c175cf7b1f24c4efd020554fc6f642e14a57baec23e95c2514306d0a6d33648841497eac48eabd96d04731bab08bf5ea9d43e0cf9a37faafa732869d68e7d5fe6954f8a319ef55da1e178e43e84a3b9aa3ad00c29b1d161163df4b79f288e9391d70a2f8813d66622e8ac333fa6aa5311eabec383ba4cc122815de008877efbe6e12c322c975434afad173ebe24203d916d57578bd2bcacc78f6e2564513f8d113a833c2c226eb97ba2e23361a5d02664ab377f964c4300be2d77b62d9240823a09884df307eff3be5664d72d11ad513e1bc5610dbfd1009db39f0cbfe470555ec1b56b871670793d3b704fb06ee950b1ad2a4d7297ca58bbad810c3fad4", "signed": "9abdb9dd2ab77b6f5e1b91ba0b613f5f360efb500d3fe99290ef7ca14bd2b330f405a4f7dcdaef4923d3111d40bf0320353386f634b40de6f04de9190ad51c0803ab5daebc6e70d352977932a03107879bd55dafd0c6ba7ad9697a17b127b3a74a3eaebabd0f8eeebfc0483d63fedde52deb46a3752449c9c4495c51a1c91f57e3ad2e6d01a13d0c470c5291b8e912288340970fbb85787b8b376d72175250e8cd90c07888bfef5ebf5086c8ff2abcdd12d214b9c45d120873b4602e57a6aab0b828d1084dffaa3651ee35662695b7f3433f4ab530c29ac6cc5bb43eccd1b6898b9ef7aec6d5aec68d5c1114bb5df7820966594c994d640891b8f2dc5d25638de43549d86d34306ff3f574575116405b9e8e286ee0cd978a76002c4435feaac6e84eae1654f339a567d8d04fcfa3eb6a04b9adc666021300e9ee5972b3df5d4d0dd4bf7921dc98de82cef2d1b1d61b797fc9968e118484c41342416ddc6adc4ee5d687d94a40ce572f42a2048668c175cf7b1f24c4efd020554fc6f642e14a57baec23e95c2514306d0a6d33648841497eac48eabd96d04731bab08bf5ea9d43e0cf9a37faafa732869d68e7d5fe6954f8a319ef55da1e178e43e84a3b9aa3ad00c29b1d161163df4b79f288e9391d70a2f8813d66622e8ac333fa6aa5311eabec383ba4cc122815de008877efbe6e12c322c975434afad173ebe24203d916d57578bd2bcacc78f6e2564513f8d113a833c2c226eb97ba2e23361a5d02664ab377f964c4300be2d77b62d9240823a09884df307eff3be5664d72d11ad513e1bc5610dbfd1009db39f0cbfe470555ec1b56b871670793d3b704fb06ee950b1ad2a4d7297ca58bbad810c3fad4", "signature": "9abdb9dd2ab77b6f5e1b91ba0b613f5f360efb500d3fe99290ef7ca14bd2b330f405a4f7dcdaef4923d3111d40bf0320353386f634b40de6f04de9190ad51c08" }, { "secret_key": "7a60cdf1870460de8ae7781176d5127e71207faf2f210bd4dc547385b667f2f2", "public_key": "ead67a9cf34d0ff14e79afa46f2dc996e9ac0e3e076322fbb4009767b133f01b", "message": "9dc023a525d01ba3513798b738c79162926ebccc0adf1e57ac47c20dea6ce1375c3d2aaa1733b7f0c3bd945c335ff3576112bbdc10b6783ba654e8c61047f2773aa229bf846922a89c6a73d5f1051e8d96ed36d7d6747e063a7ac602f19fc52e021a4bbc28b03514fbd51c7b3fd659f12d547d0592dd09f873c9ecc6439c7e931ad0e4856be31c605def2ed9b5d13c5942b2f325397dac6c9760e9b1bb0c06f713cb920c234bccfee9f0b85dd020f7988f3be1cc66e9e51babe2fee237eb84ec7eff9409aa91c194e30db1e065015955de9746bba03f7edf9a587512409a4161fa77ea62ccf431602dcdcf365ed6bf0aeddd32f7c844e3a34d266e28382f4062fd4d6f8214252104d643a9bfd8071716371ccbb54c8cc8db79add65bcbcea0d080d8402803fe232df70f76577247a63d5583bbd5642767bc63f3c5a7bb3a47eb12984e4541f41fdb55869a08fade66c20f69a5a9de25f6b36ba18ace5b4ac336bb2a8ebf630ad03e8bb8731d01e84b91d024d117459a74892e93d53b61e6b8068e4f04b4181f0387b4567ccd45e1b8718a2d7d787872f3dcf87a15935ad7daaa744ed68a28666a51a10d39fc139cdfe9a6873076f7c425009c38faee135e513207b06e7ba35685f5072da34b6045b57cd5d1b1a1fdf017b8aa8ebd27522bc95e47908734e41722a767905c5ecc30c72481b6c12bf4ace94d5bb3a3155691b7075b40ebf5968fdd903d8fd3cc50b8d6464859b10f755132c6d9b6dad1d6f14c4185b264d3497a4e549877fe946e", "signed": "b2e08142bdd62b786592c091f5fe6a9b7f30ce134c3b236fbc6dfe6734f88270ac58f6d74b4fd99c22451ca465a42c006db25af215ed241af1189627c6050f009dc023a525d01ba3513798b738c79162926ebccc0adf1e57ac47c20dea6ce1375c3d2aaa1733b7f0c3bd945c335ff3576112bbdc10b6783ba654e8c61047f2773aa229bf846922a89c6a73d5f1051e8d96ed36d7d6747e063a7ac602f19fc52e021a4bbc28b03514fbd51c7b3fd659f12d547d0592dd09f873c9ecc6439c7e931ad0e4856be31c605def2ed9b5d13c5942b2f325397dac6c9760e9b1bb0c06f713cb920c234bccfee9f0b85dd020f7988f3be1cc66e9e51babe2fee237eb84ec7eff9409aa91c194e30db1e065015955de9746bba03f7edf9a587512409a4161fa77ea62ccf431602dcdcf365ed6bf0aeddd32f7c844e3a34d266e28382f4062fd4d6f8214252104d643a9bfd8071716371ccbb54c8cc8db79add65bcbcea0d080d8402803fe232df70f76577247a63d5583bbd5642767bc63f3c5a7bb3a47eb12984e4541f41fdb55869a08fade66c20f69a5a9de25f6b36ba18ace5b4ac336bb2a8ebf630ad03e8bb8731d01e84b91d024d117459a74892e93d53b61e6b8068e4f04b4181f0387b4567ccd45e1b8718a2d7d787872f3dcf87a15935ad7daaa744ed68a28666a51a10d39fc139cdfe9a6873076f7c425009c38faee135e513207b06e7ba35685f5072da34b6045b57cd5d1b1a1fdf017b8aa8ebd27522bc95e47908734e41722a767905c5ecc30c72481b6c12bf4ace94d5bb3a3155691b7075b40ebf5968fdd903d8fd3cc50b8d6464859b10f755132c6d9b6dad1d6f14c4185b264d3497a4e549877fe946e", "signature": "b2e08142bdd62b786592c091f5fe6a9b7f30ce134c3b236fbc6dfe6734f88270ac58f6d74b4fd99c22451ca465a42c006db25af215ed241af1189627c6050f00" }, { "secret_key": "3379d25c1117cf802ec79c06575d18e6bece4c7093dd43fdee03685c70b2fa9f", "public_key": "8525156fe29fc2fbf661ba50182be20c8998d941493d5933dca4d8b41fb442d5", "message": "7acdb39f1226bd3abffa50350a1497d761f8f0aaefbfbbbb925ff563e38976aa172d407b61ffdfb1cd538a4cd000b57818a0bc92c0e0cd0a5abfcf578300f5f4e6cefa267275d17845da7066fd4e18010027960cd395e682ad71af349bbdad5ebaa0f11a7761e19ea1bef6610743164b17141453b472ae2c8f36ce6b080f1c0745352454ce5aeae11c9d75de3c08004265fc4ca80d33b26eae1400dfd8977bf723a616daeb6d42199010b73e193ab72a58bdd248a7f4111ca50c1de646bfea7b4d5baf0f93dd973ee93649e21ec0c6c4fcca8cd6ff69df761612021d85ff1fb2a95337da4805a76d347ee71ef19c0dffb59f15f650293abb9721053f7406905ae683f96c83a3a7447b1afb14e1208c639f37a9750ba21da5552cc204eac453ca036282f7e0961093c39ec118138dcf71cf2d28fb96a24962b52d3393f880653bcba2c9b9d57b77c522f421fcf5ad75fba9cf3389b123aa97521713fff88467deb8c8991d4b57c1438170537cb50cdcc657e50e5c480e12c0d44939b6399944e7c71e186c2abb81fc57348836d5e57b72b224a6b71b6caf721aca73478cb6cf5fb89071ae3a398202dbb38c30812563bb9a23406657a956d305a3449a60cc8641b62175a7170c23bd5a25f0f12e15a7ed91fada6a4a2f0e7b155a3d6485ec03ce6e34df7e216240bb28a2dd732ff790d2286e200b33c29a31a5e19ad2cd02974badc4bc22deb7504c15241fc1060c8acef4fbb25ec7602fce36a27bb87b6e6423e6b4f6e36fc76d125de6be7aef5a", "signed": "4c36bfc81eef00b9cb3ab514c6d451b993361e09a4be4b5040926feb0e0d9b52f03de468e7bad83f379154bf2c437a71f754f3f40798eeebd62e55f2be7714037acdb39f1226bd3abffa50350a1497d761f8f0aaefbfbbbb925ff563e38976aa172d407b61ffdfb1cd538a4cd000b57818a0bc92c0e0cd0a5abfcf578300f5f4e6cefa267275d17845da7066fd4e18010027960cd395e682ad71af349bbdad5ebaa0f11a7761e19ea1bef6610743164b17141453b472ae2c8f36ce6b080f1c0745352454ce5aeae11c9d75de3c08004265fc4ca80d33b26eae1400dfd8977bf723a616daeb6d42199010b73e193ab72a58bdd248a7f4111ca50c1de646bfea7b4d5baf0f93dd973ee93649e21ec0c6c4fcca8cd6ff69df761612021d85ff1fb2a95337da4805a76d347ee71ef19c0dffb59f15f650293abb9721053f7406905ae683f96c83a3a7447b1afb14e1208c639f37a9750ba21da5552cc204eac453ca036282f7e0961093c39ec118138dcf71cf2d28fb96a24962b52d3393f880653bcba2c9b9d57b77c522f421fcf5ad75fba9cf3389b123aa97521713fff88467deb8c8991d4b57c1438170537cb50cdcc657e50e5c480e12c0d44939b6399944e7c71e186c2abb81fc57348836d5e57b72b224a6b71b6caf721aca73478cb6cf5fb89071ae3a398202dbb38c30812563bb9a23406657a956d305a3449a60cc8641b62175a7170c23bd5a25f0f12e15a7ed91fada6a4a2f0e7b155a3d6485ec03ce6e34df7e216240bb28a2dd732ff790d2286e200b33c29a31a5e19ad2cd02974badc4bc22deb7504c15241fc1060c8acef4fbb25ec7602fce36a27bb87b6e6423e6b4f6e36fc76d125de6be7aef5a", "signature": "4c36bfc81eef00b9cb3ab514c6d451b993361e09a4be4b5040926feb0e0d9b52f03de468e7bad83f379154bf2c437a71f754f3f40798eeebd62e55f2be771403" }, { "secret_key": "ef38c3fc74f054ae43e8d29d6ba6dc80b5af848270d4af58844d24bcf987414e", "public_key": "0ae1478b05fb329965ea0fa928dcbe81a0bdbb6ff66c811671635e4388888051", "message": "bf290db3dda8763937ae4c83746705327295c2c248068f5ab85c8b5d756f4e3e34062b5549387261476bcbd1e7331990f11910d11f94607c2b71f65b771aacabdc10f42ae918dd2594ac71051c85b330779c47af00a5b98191b56cbcf7efe41a27e87c677168c8abe9496eb2e7abbd0b1604286ed1a1b18d264d733de87d0d3f8055528c4d426d7f8e6ed024a74140abd354007962a2a97a5c2ff976546a8d1ac4924c09223d348ddcd8710a3799f91bb870b3f46d51f1e7f6892d6b08b991748a037a867ecc39ee8d6462a7614488edd3c2ba615ca2e37854889441b13dc835c36b38653f6598616f35783e2e158384bb931c901b703acb3991fb7aa5ba69d9a5bd0570242961a71a52470315e982e341a61c64a619bd16fe8119aae0d7503ce7d7e926146b91c2892f131669d1e39e5b75e9c72452618099a57dc2ee377be65875ee01bb88ed526fc394e2f5c8127a5f69125e67385ef94b1f33ad52629d720e31c02ae0b582339ff0f0bb07ff2b030f48fa7b692716501ad7773ad3151204a2a540fa9436bdd4202a157309ec36cecbe58b33eff557fd33e03fd3eb19009bd7a2dea9efeef8785567aab2a4c98bd1f2a81011b343a9f20c44c577a452fd54ba21029d4706813b2987c76bb242ab2620843c2260b669ad358efee7f9830dc9c7d478a2de4a2cf8c43da770e288e2edbb6d73bcf2ecb023de6b2dcc6b166e87a385eb0adc305665c5bfa57f250fe223ad7ff4518de39c79e87dc101a9faa6821a74442bfcfdf0a9e63a509e2a2e76", "signed": "1d3ac6b6bf18ab5309148799485b276d20401c6af5f9b2f6032395a3c2f4b673b7140c07cc26f4fc56a5ee00b0746b2a80da6fdad17edd114920101d2c89c30ebf290db3dda8763937ae4c83746705327295c2c248068f5ab85c8b5d756f4e3e34062b5549387261476bcbd1e7331990f11910d11f94607c2b71f65b771aacabdc10f42ae918dd2594ac71051c85b330779c47af00a5b98191b56cbcf7efe41a27e87c677168c8abe9496eb2e7abbd0b1604286ed1a1b18d264d733de87d0d3f8055528c4d426d7f8e6ed024a74140abd354007962a2a97a5c2ff976546a8d1ac4924c09223d348ddcd8710a3799f91bb870b3f46d51f1e7f6892d6b08b991748a037a867ecc39ee8d6462a7614488edd3c2ba615ca2e37854889441b13dc835c36b38653f6598616f35783e2e158384bb931c901b703acb3991fb7aa5ba69d9a5bd0570242961a71a52470315e982e341a61c64a619bd16fe8119aae0d7503ce7d7e926146b91c2892f131669d1e39e5b75e9c72452618099a57dc2ee377be65875ee01bb88ed526fc394e2f5c8127a5f69125e67385ef94b1f33ad52629d720e31c02ae0b582339ff0f0bb07ff2b030f48fa7b692716501ad7773ad3151204a2a540fa9436bdd4202a157309ec36cecbe58b33eff557fd33e03fd3eb19009bd7a2dea9efeef8785567aab2a4c98bd1f2a81011b343a9f20c44c577a452fd54ba21029d4706813b2987c76bb242ab2620843c2260b669ad358efee7f9830dc9c7d478a2de4a2cf8c43da770e288e2edbb6d73bcf2ecb023de6b2dcc6b166e87a385eb0adc305665c5bfa57f250fe223ad7ff4518de39c79e87dc101a9faa6821a74442bfcfdf0a9e63a509e2a2e76", "signature": "1d3ac6b6bf18ab5309148799485b276d20401c6af5f9b2f6032395a3c2f4b673b7140c07cc26f4fc56a5ee00b0746b2a80da6fdad17edd114920101d2c89c30e" }, { "secret_key": "7e7b39af69380cf44660e2c1ff308334e8250feeb88be0d43aabe5e68b8ef171", "public_key": "ccef9daed92523533d4a2dab6d2419f6d08604db64ce37e32904ac77b9b4a01c", "message": "d4a3976dbf8320185667b5a8236640f2ebc9e45e6d5f2a8d92997927dd9bc5db95f44634bd654eefece10d99d92b46715791645004accc6d140f32a1c872e54aa9a7493af94588b7bb400d94d458d43292307c5a1a3882a1c8a6a78d9a945f79d64b3294a28c3d59d82022b009cc4d2da93a16b071c9ab8ee9a3663d72ed344f151d68c666a4b49652d97a46d142a4741127f3c57f1551c40976cd1381a82aeae7bc5adb398720eb433f0899487ed2378446b1a8dc6a33fcd4537a05fb603ec0a90a27532300242b2000108621b65ab000bc06381530f690d7e56f81604dacff1910715040410aa1f944c92dd9bbaa5bd08ea00c8442df94f085eb3de97335b6005e6f84f823d43470ab1c67da12ad449936c6b55f9ffd203dfd6e3f33309e8a9945a59320e66734c79c4814dba5a1c14095c62925a1e1733efd94817a25ef9e479dd9ccde6ca8adb7a8053c1b55134697504af8053d595b844640b61e93168075468450eb5de0358697c104afa6a3796a509c26b4c277c23fff42df146de55e95d0d4b80a7aa177d99227ecb2a0594deedebb9cafb1a458aca8072cc7d77c7175f610ca300efd7af9388346498c22991564500e0b0aa4d2946f18e6f5375a848286f36954c1ca22684c6928c2a25c7fe21aba4a7111d7e05bc8d70b3dcb4f6aaec064845eef5525f85024c2570f3b78698c4bcec0d71aad5378d8819e1fac44ee416370212dbaaae54d2af2939b82cbaae7f42ff485d45b3acc21090f5ba41ec0da309e52ef2838d1de471e0b7cf985", "signed": "1062a2dc9cd5379675c04f5e21338dcfb77dfbabcedd62b2607100d7649a05e80871e96123214f80f4f73b0d9b06e2d31f56119cea69da2347da84a275b7b207d4a3976dbf8320185667b5a8236640f2ebc9e45e6d5f2a8d92997927dd9bc5db95f44634bd654eefece10d99d92b46715791645004accc6d140f32a1c872e54aa9a7493af94588b7bb400d94d458d43292307c5a1a3882a1c8a6a78d9a945f79d64b3294a28c3d59d82022b009cc4d2da93a16b071c9ab8ee9a3663d72ed344f151d68c666a4b49652d97a46d142a4741127f3c57f1551c40976cd1381a82aeae7bc5adb398720eb433f0899487ed2378446b1a8dc6a33fcd4537a05fb603ec0a90a27532300242b2000108621b65ab000bc06381530f690d7e56f81604dacff1910715040410aa1f944c92dd9bbaa5bd08ea00c8442df94f085eb3de97335b6005e6f84f823d43470ab1c67da12ad449936c6b55f9ffd203dfd6e3f33309e8a9945a59320e66734c79c4814dba5a1c14095c62925a1e1733efd94817a25ef9e479dd9ccde6ca8adb7a8053c1b55134697504af8053d595b844640b61e93168075468450eb5de0358697c104afa6a3796a509c26b4c277c23fff42df146de55e95d0d4b80a7aa177d99227ecb2a0594deedebb9cafb1a458aca8072cc7d77c7175f610ca300efd7af9388346498c22991564500e0b0aa4d2946f18e6f5375a848286f36954c1ca22684c6928c2a25c7fe21aba4a7111d7e05bc8d70b3dcb4f6aaec064845eef5525f85024c2570f3b78698c4bcec0d71aad5378d8819e1fac44ee416370212dbaaae54d2af2939b82cbaae7f42ff485d45b3acc21090f5ba41ec0da309e52ef2838d1de471e0b7cf985", "signature": "1062a2dc9cd5379675c04f5e21338dcfb77dfbabcedd62b2607100d7649a05e80871e96123214f80f4f73b0d9b06e2d31f56119cea69da2347da84a275b7b207" }, { "secret_key": "a9048af0c20a125f5d39c50f22b805ae742cf64f1fe8dfbe8dfdaa511aaa576f", "public_key": "158655db94b15ca72983877b6db231a5843df5dbca2810a7e496fb59ab7104ca", "message": "8eef2d9f5d59709959c924f87c22789767393a155d5c87de488cef50b7bf7da870e3adc300aee6603b2ef08764d99d9e7751e5dce92aaa71aa18a69cc823134e8552d959a0dbb41117e0a593c31833b6ec2172ddafaf7848ddd18d28d0d4ed33237ec804f65938aed8e8a3280d42e353d01be0187b1301f83d89849067b04a9031f7e0f33e3416240c53d9265ed0663959971f417cb5f210cdc5aebcb5e1db7dfb82df435876a6e98f415b0df869f0d8851535375645eef70faec744ee0dc3acbcb040f68d502c2c62c8db45ebe54854a4b36f43feb49a6d1c2c2ea79914a7c23c60baaa67cb47b2178e12dce76b004c87b7b8346efadf380b9e1e41f63148da51781d75cec040e4268820211f3c462501d80899894e79d618de42461d785aeace53ae14b79d33501ed5629bbdd07128156db0725f5b4bed593a952947830384f61df00ee0aa099099c3cd9765a9c1c7e8a6a83430b8d9867c8e17920ad0ff64d8cd2ff5f114388ce6d43eec1715d035f022fa97969e1a5dd9f58d896b17c1221c9e6c8555597235eeda6ec41b0c117612b00c5f0ed1816b057363582707a8aa0d98d4d4be5e8fa32d6c9d278221ef3067b8ba1516d9e051d2f68b7d1b151f74a3534e7812c051e5f2b63b3035f8e5703b5f68fd2d65bb7565e8aa67bfd2a12caf0bc5481197a9ff89d77df7a0e9655ef029b43dd906d0b888e313ae9d1c7e9368a01352d00c6680dd0f1f574a5877348a7ea2c0b9e8e2727510bf0c9ef744f369eb3c6c4fc16adeb6e1945be8287d0f30", "signed": "18a312b20d86ac339a58ef2b852d467c23bb2cb1227cb15338af07fd04b9a711e856ee5b2c82e366c17f861713d1088c1b2144d1c37d05bdc00d7396738520008eef2d9f5d59709959c924f87c22789767393a155d5c87de488cef50b7bf7da870e3adc300aee6603b2ef08764d99d9e7751e5dce92aaa71aa18a69cc823134e8552d959a0dbb41117e0a593c31833b6ec2172ddafaf7848ddd18d28d0d4ed33237ec804f65938aed8e8a3280d42e353d01be0187b1301f83d89849067b04a9031f7e0f33e3416240c53d9265ed0663959971f417cb5f210cdc5aebcb5e1db7dfb82df435876a6e98f415b0df869f0d8851535375645eef70faec744ee0dc3acbcb040f68d502c2c62c8db45ebe54854a4b36f43feb49a6d1c2c2ea79914a7c23c60baaa67cb47b2178e12dce76b004c87b7b8346efadf380b9e1e41f63148da51781d75cec040e4268820211f3c462501d80899894e79d618de42461d785aeace53ae14b79d33501ed5629bbdd07128156db0725f5b4bed593a952947830384f61df00ee0aa099099c3cd9765a9c1c7e8a6a83430b8d9867c8e17920ad0ff64d8cd2ff5f114388ce6d43eec1715d035f022fa97969e1a5dd9f58d896b17c1221c9e6c8555597235eeda6ec41b0c117612b00c5f0ed1816b057363582707a8aa0d98d4d4be5e8fa32d6c9d278221ef3067b8ba1516d9e051d2f68b7d1b151f74a3534e7812c051e5f2b63b3035f8e5703b5f68fd2d65bb7565e8aa67bfd2a12caf0bc5481197a9ff89d77df7a0e9655ef029b43dd906d0b888e313ae9d1c7e9368a01352d00c6680dd0f1f574a5877348a7ea2c0b9e8e2727510bf0c9ef744f369eb3c6c4fc16adeb6e1945be8287d0f30", "signature": "18a312b20d86ac339a58ef2b852d467c23bb2cb1227cb15338af07fd04b9a711e856ee5b2c82e366c17f861713d1088c1b2144d1c37d05bdc00d739673852000" }, { "secret_key": "f8c9183f23105fad0c6e5103358b583288f9ff6c7dfc91106d07987ff69ce1eb", "public_key": "4c79628c958cde0cc3cf686095b8a2f44b7193c616f51b21b670b038ce6f67ff", "message": "b1d60595323ff3c844874190e1836e4101409cbceae28d5da81fad298fe47f6bdf44745b7cd0d37131c3ec365b92f5a1a69c09fe2d9e81da10cf19d85ff5ff26f9e7db9f0793b25ab26e6a74f44eb8c4f078eb7ad18e65a16210d5c844d3cef75f1daf44eee558f90e524a032b6cae6c8d23367c28ce1c75fc25ac87433977d597533c92ae65f2913a18907ac7d9543df24127743943fefd9cf83ed833f63ec8367233d897bfa12d466d2c4a9ad70d5a672fc10775ea2d204e636de7010788da271df03881a25c8dfa5af73ee559f81b529b35aa127fdc0ee8fd369c7a0436623986aa6407fa67a1420c46f3211ab84f84466dd58bb79508a1feb0a5a5dc3bb0c1b248098262a064f37bb2f019e290c60afaa1206651a2697caacc3ecc02ecfc077f272e8f75cea71c3bc3356d2b5807276f1955001cfe10a61716b4082bd6f84cae4bb0d9a4b75a4b5762f81079f19d7d19eaff8631c924885bd3a64e129f4cf6b79c7a9829665511e9d85c745eb22c1b7cb2a17a49b6285cce37b3de415940328323efe24a1a07ee87468f6510e42dd206fe7f09e3d433fb52156ae348383115648863e45bf6a371b17e70e19f9627d7f0a58b95c6a4788d5fd7862f1612c0347325b797651be30c3e1e60ea4ae60b5745a38b6a9d4eb4935d6f3cb8d71ad3f39adda5e42e2219de0d381909c9cd317dd4379421a2a84268a7ea7180a64c129be1e5e8fcbbf5ed659e9f7e763ce84f630d5407954f9f755750a6dbf9f7660717de8e2adc1e9ac9ee31654d1837cee39795", "signed": "c6a8bc7a0d5c6185b6ecd6033e42321d5c871bf889be72bd54cc0083ed60a470b2cc0fb4682c894c75b0df95f1ecfbba2d5acef3e1aafe54b9f7e803a1d0150ab1d60595323ff3c844874190e1836e4101409cbceae28d5da81fad298fe47f6bdf44745b7cd0d37131c3ec365b92f5a1a69c09fe2d9e81da10cf19d85ff5ff26f9e7db9f0793b25ab26e6a74f44eb8c4f078eb7ad18e65a16210d5c844d3cef75f1daf44eee558f90e524a032b6cae6c8d23367c28ce1c75fc25ac87433977d597533c92ae65f2913a18907ac7d9543df24127743943fefd9cf83ed833f63ec8367233d897bfa12d466d2c4a9ad70d5a672fc10775ea2d204e636de7010788da271df03881a25c8dfa5af73ee559f81b529b35aa127fdc0ee8fd369c7a0436623986aa6407fa67a1420c46f3211ab84f84466dd58bb79508a1feb0a5a5dc3bb0c1b248098262a064f37bb2f019e290c60afaa1206651a2697caacc3ecc02ecfc077f272e8f75cea71c3bc3356d2b5807276f1955001cfe10a61716b4082bd6f84cae4bb0d9a4b75a4b5762f81079f19d7d19eaff8631c924885bd3a64e129f4cf6b79c7a9829665511e9d85c745eb22c1b7cb2a17a49b6285cce37b3de415940328323efe24a1a07ee87468f6510e42dd206fe7f09e3d433fb52156ae348383115648863e45bf6a371b17e70e19f9627d7f0a58b95c6a4788d5fd7862f1612c0347325b797651be30c3e1e60ea4ae60b5745a38b6a9d4eb4935d6f3cb8d71ad3f39adda5e42e2219de0d381909c9cd317dd4379421a2a84268a7ea7180a64c129be1e5e8fcbbf5ed659e9f7e763ce84f630d5407954f9f755750a6dbf9f7660717de8e2adc1e9ac9ee31654d1837cee39795", "signature": "c6a8bc7a0d5c6185b6ecd6033e42321d5c871bf889be72bd54cc0083ed60a470b2cc0fb4682c894c75b0df95f1ecfbba2d5acef3e1aafe54b9f7e803a1d0150a" }, { "secret_key": "16089a1b932f8d14995688b48dd841edae3da5cfd2cb16555306f3fe8bd3edb9", "public_key": "9ecd9fdd7e0b923deff5d887b242585d9d41cd2c7c10f9c345b39f633f4ab903", "message": "58500232388d9aa4b5faf85b0233247e717fd16840de9bfd0ef86e01e61302775513e224125e0d20420ea949f6c26425f70077911f9711310cd6fd8bff27cdea11480c73e8f8b3c37641e7e8dd8607c1640218fec80a020928b93d4d557ebe82ec0bb17538867d2cb14d44d3ea727fdd52820b0da944de21cd5da303d776fe99cbc2648365e6a0a98d4db150842661768be84c68507a5c45d207840b033537786cb21dadad5fbab9c5cfc1e3547de550d313631dd4fbb7ca8f71938627608d2ebf655db4325abf3ed504dc183058f9de1e449312d904c846a184a028f364c028b27eb4946427e31c21e1051df364d499f477bf51e7a8893183e5ecf77d513a1a76b1a6fdfb16be90d74be4c4345a4f9f87ee441a1022d67ee844789f21b0c31adcc0d95663cdfb40a895b922dce8069b932c802fd3ab1ef0ce6bffdcc5653b1cd5257e19a0951687e545faf4aa66065a55c4b4191e34e8047d6a4ab52d1b06c369a426ca2d16b51a0271f27f8d744c711fce3aad9d4ac038ee700e4e971b21ca489ff2b8c778a3721adf47c1ae5a41b9a27fa742fd0f18164ef3c26b8ae7d1fa29b7c0cc4683be65025c96537a12d5fcebbd05e930c3693ebbba0a78adf59d8a3b598a348eaa9f47caf531fe449652db5b20d68994e35afec2c25709055a1de26082e3912d497c647720a3f873621456e6a5b9eb613acb43b66d47d0b954c69e8fbf2c5e634c486e5724930e0b56a516940c8cb0e775274deff97cbb7759ce90a2b93e9efaa624e6b38a39849dca1df612736f", "signed": "7878ab741ebae2747c7897cbb1d105482f37be2f5f91795232cdfbccc526608918e2756ddb7536b3680c162cf8a1ef38a341b9362bfe5d468b4bce21df234f0f58500232388d9aa4b5faf85b0233247e717fd16840de9bfd0ef86e01e61302775513e224125e0d20420ea949f6c26425f70077911f9711310cd6fd8bff27cdea11480c73e8f8b3c37641e7e8dd8607c1640218fec80a020928b93d4d557ebe82ec0bb17538867d2cb14d44d3ea727fdd52820b0da944de21cd5da303d776fe99cbc2648365e6a0a98d4db150842661768be84c68507a5c45d207840b033537786cb21dadad5fbab9c5cfc1e3547de550d313631dd4fbb7ca8f71938627608d2ebf655db4325abf3ed504dc183058f9de1e449312d904c846a184a028f364c028b27eb4946427e31c21e1051df364d499f477bf51e7a8893183e5ecf77d513a1a76b1a6fdfb16be90d74be4c4345a4f9f87ee441a1022d67ee844789f21b0c31adcc0d95663cdfb40a895b922dce8069b932c802fd3ab1ef0ce6bffdcc5653b1cd5257e19a0951687e545faf4aa66065a55c4b4191e34e8047d6a4ab52d1b06c369a426ca2d16b51a0271f27f8d744c711fce3aad9d4ac038ee700e4e971b21ca489ff2b8c778a3721adf47c1ae5a41b9a27fa742fd0f18164ef3c26b8ae7d1fa29b7c0cc4683be65025c96537a12d5fcebbd05e930c3693ebbba0a78adf59d8a3b598a348eaa9f47caf531fe449652db5b20d68994e35afec2c25709055a1de26082e3912d497c647720a3f873621456e6a5b9eb613acb43b66d47d0b954c69e8fbf2c5e634c486e5724930e0b56a516940c8cb0e775274deff97cbb7759ce90a2b93e9efaa624e6b38a39849dca1df612736f", "signature": "7878ab741ebae2747c7897cbb1d105482f37be2f5f91795232cdfbccc526608918e2756ddb7536b3680c162cf8a1ef38a341b9362bfe5d468b4bce21df234f0f" }, { "secret_key": "94d50915144c7e7dd0f85fef87eddc2206c1569ed1431c8c5a153e32e1cb2fb7", "public_key": "3bb098cf160f3aec3170b57d6add4f56739270e4b3a8ef7966ec30619b299102", "message": "4d915f27332dd75051719a24ae8d0e9c30da790999e22d9b587ef20321bee4c07d0a12494ffe599f47f96925f5d92517fc3e5f041d0c709f2a9783125eeca6652997201c429aa6f1ce2f07a0d4a0a18cf20b3e9a4f7663ea5262cad8f949411b05ff5c5edd7b30b217d75d8c86c94e5f92c16734374e8cead61b0b27bb4bf5f43a313c1dd5b83e0ea933b6cadfedd7a64aa5dd5b5d02c695ea20e091fdaa72ef4e7ca40f38395be8bf7a255c6d06a632d7d785d9e047f232aa50fa14529f986f9ef9d7b580a03965b0154788822a225bb5ab3438b89a5c28744ab0bc0b2014e5796acb4935a81b02a04632acb88caa7e39e069c7c8e1758291094a53e362fcedaaa583eca766efebf69b38e8cde9ce58e012c60ec88e8c42beadfa838cfe440fa0c01d659c9634576d7d7a2d3a044f99c6e4263d4c0b374a388a2acf38eff29c777e9daa60d598035a7d9edf67a502c3f573207b119cacac3fa71e2a0207c601cc0dd637ef562bacc35c57042738f1f55815a5268082cd6a508292fa29e34e9645d87a1a2b6e58adb7f4a57fbb53e9213ef3dc873f29396258a1ea546fb5952ce343cee9bbb90c1cda72c65a7c8e40312b328e231920c233077dca34d04f9d89daa9a2f43459165fd102ff5643c7175230b39ec7c3c475650ef131609d3220f5a294a403b1e1c42cfa162cd426f0ae43fd6b7ab547a62b7d5f847403c4e5987953877158cfdee23c04f751c7c86d078e824ca63b5e65543e978b6b0cc689ef664412b01b8ff165e7dbde3c099bf4f34ebddcb4c4", "signed": "59a1ce55f5a6badc1b9391263620542cfcae87a0f2b9502250cfe4bdcbf76c461977c334a48d916edebd56c21ce217c35a6444cfbfd3b11a3d48fa2edb6eb40f4d915f27332dd75051719a24ae8d0e9c30da790999e22d9b587ef20321bee4c07d0a12494ffe599f47f96925f5d92517fc3e5f041d0c709f2a9783125eeca6652997201c429aa6f1ce2f07a0d4a0a18cf20b3e9a4f7663ea5262cad8f949411b05ff5c5edd7b30b217d75d8c86c94e5f92c16734374e8cead61b0b27bb4bf5f43a313c1dd5b83e0ea933b6cadfedd7a64aa5dd5b5d02c695ea20e091fdaa72ef4e7ca40f38395be8bf7a255c6d06a632d7d785d9e047f232aa50fa14529f986f9ef9d7b580a03965b0154788822a225bb5ab3438b89a5c28744ab0bc0b2014e5796acb4935a81b02a04632acb88caa7e39e069c7c8e1758291094a53e362fcedaaa583eca766efebf69b38e8cde9ce58e012c60ec88e8c42beadfa838cfe440fa0c01d659c9634576d7d7a2d3a044f99c6e4263d4c0b374a388a2acf38eff29c777e9daa60d598035a7d9edf67a502c3f573207b119cacac3fa71e2a0207c601cc0dd637ef562bacc35c57042738f1f55815a5268082cd6a508292fa29e34e9645d87a1a2b6e58adb7f4a57fbb53e9213ef3dc873f29396258a1ea546fb5952ce343cee9bbb90c1cda72c65a7c8e40312b328e231920c233077dca34d04f9d89daa9a2f43459165fd102ff5643c7175230b39ec7c3c475650ef131609d3220f5a294a403b1e1c42cfa162cd426f0ae43fd6b7ab547a62b7d5f847403c4e5987953877158cfdee23c04f751c7c86d078e824ca63b5e65543e978b6b0cc689ef664412b01b8ff165e7dbde3c099bf4f34ebddcb4c4", "signature": "59a1ce55f5a6badc1b9391263620542cfcae87a0f2b9502250cfe4bdcbf76c461977c334a48d916edebd56c21ce217c35a6444cfbfd3b11a3d48fa2edb6eb40f" }, { "secret_key": "0d81926f513db4b25dfa1e52b5dca678f828a61c7c913c828247c2eb0422b7d1", "public_key": "0f32411ef91d4e4b6941dfcaab142ef3bec160983993a5262ccf27fadd2af890", "message": "a93837522f7ec2e93a2e4b4c8b46de926a81ada2d248bcd33b39b6c95fb62a61dbbeda1aa85a21d9b96a08510d8d3a658cf320a10928695999d2c0d605c7f95a12f56a8718507db0f497e3ead613132ab092cbf19d2260358630358d9b26e68d50ddae37c8af0bb7d2741fd2929c21279a78d10e2c5f3c5bf4a42a3617036d54743647765afd8cd910f81b38ced72390630ee68944a37d29c2fecada1cc59ec544075bdbc14c63c6234b884049000c27c73406035604fca8760b49a5e2109ef91285adc4ec48c819d62d948faca90f62cfaef0b07d6fe576d762bfd0eef94cf6b5332c4d422511607f2facc7ac046a59b9617e8383d1029cc91ac592b52084413032be841baa9bf96251a6bda671d4cd4b125da658a4e5a50f4428eebf2614fb0ce5febe80f721a5f4c0325506d27a8d31e33d86253870dd63c08edc7302b280e9b9bdc28beef05c7dcb30d4c162e9be832e1c785e37551218421eec852c4298213b2f27f8f8c706d391b9c69a56db7ce5d81548fca5fed456f2d8afd0b75f79f85868316f4a0921f0c6639926516b3c3e52a9cb22554546ef70e14c77ecbdcd5c0d59a81769b30d5d131f2fb449c996b8de8ac7f8084f8499e1a56f7cd29db6aaefccae8a60e75616a1f702c3bc8deaa1004a8dae0392a59cee54810c6e940eee25fb2e5d573267044b893ffde378fe75ac2613373d84a0ca8187af4a3358e50a994ed03367de645e10390fea4c33bb1a6c0c39858b8db4a69fe894a4223d45af69b36c6117c4dc25de49a63017002ba9ae551ef9", "signed": "e0cb6c71ebf8d705e50cad9f0b8cba3ecf4b9e3793400092aa5b121e7dbbc8bea71df29528ca9b47abf87c198a8dc4e14d5180ce932dd2114a3cdaa5552cc205a93837522f7ec2e93a2e4b4c8b46de926a81ada2d248bcd33b39b6c95fb62a61dbbeda1aa85a21d9b96a08510d8d3a658cf320a10928695999d2c0d605c7f95a12f56a8718507db0f497e3ead613132ab092cbf19d2260358630358d9b26e68d50ddae37c8af0bb7d2741fd2929c21279a78d10e2c5f3c5bf4a42a3617036d54743647765afd8cd910f81b38ced72390630ee68944a37d29c2fecada1cc59ec544075bdbc14c63c6234b884049000c27c73406035604fca8760b49a5e2109ef91285adc4ec48c819d62d948faca90f62cfaef0b07d6fe576d762bfd0eef94cf6b5332c4d422511607f2facc7ac046a59b9617e8383d1029cc91ac592b52084413032be841baa9bf96251a6bda671d4cd4b125da658a4e5a50f4428eebf2614fb0ce5febe80f721a5f4c0325506d27a8d31e33d86253870dd63c08edc7302b280e9b9bdc28beef05c7dcb30d4c162e9be832e1c785e37551218421eec852c4298213b2f27f8f8c706d391b9c69a56db7ce5d81548fca5fed456f2d8afd0b75f79f85868316f4a0921f0c6639926516b3c3e52a9cb22554546ef70e14c77ecbdcd5c0d59a81769b30d5d131f2fb449c996b8de8ac7f8084f8499e1a56f7cd29db6aaefccae8a60e75616a1f702c3bc8deaa1004a8dae0392a59cee54810c6e940eee25fb2e5d573267044b893ffde378fe75ac2613373d84a0ca8187af4a3358e50a994ed03367de645e10390fea4c33bb1a6c0c39858b8db4a69fe894a4223d45af69b36c6117c4dc25de49a63017002ba9ae551ef9", "signature": "e0cb6c71ebf8d705e50cad9f0b8cba3ecf4b9e3793400092aa5b121e7dbbc8bea71df29528ca9b47abf87c198a8dc4e14d5180ce932dd2114a3cdaa5552cc205" }, { "secret_key": "6c8c53b56bbcb4c0a25dc40c18240b6a5c7576b89dde45ef13fb158ea17f8ed9", "public_key": "238e51d6a44fa7ac64268801261ea35b62638a006cc452bddb9f16fc5803060c", "message": "b60df2944ba015759802d3c587bcfebe521a7e77b9985b761c9676454d24a664af0b0d44225a557512e1c1cd7dd8335c8f6adf928e18f89fd5eedf6f411dcdaf996912e8c3e23d1cb95eca4b9e24e7539c3b98bf3d07ec251392096c19ac5374dcba526132b6d9bb8f6c859ce985d584c7bba5b02a81034b6d8b521bd280e50d77daa2b2413ed679834f8161d5d0573bdd476ac3cd0a3a7d8db45334e89c00ab66bc368a07b423e246434636272aa4e4637a5306b2c3397992781f30238de79ec104acc7200defad960883d391443e70efbd22f1cfceec5112fe9e8e13bb941c083468dd71ffca976cd51ce161793110ef00aff5ee2ccb7706a512b85beb94ac49d19afb6333655cf3aea535a6f9c75e034841e763c5a249b4704e1be78b0ecac6802c343c1b7e7b5770de4c93a3a79c46e6835da8ae5db3838e1796b564a480a4f290b60a1c63a725ff3fef434d2a0b3d8931978742b525c83bae6794ae64193794b370c289ba35ed79d37072a8dcfcadb46d5ffaeeba1bfd4f87d766b504e62b4acdd77446e79ba994d6dbf4765ebd74b0365100da56162c36fe5a95077f6b4265e81796b4a57443782970b96cb4569ba985c55fe3a718380bca39f16624f8e47cc63c1b6fa1bde1aeba9c51f94b702b13108cc1481d42e6fa981e3ebfe064d2dca7420c74595792312ae3fb9101d4b66d9916dfd6c13ae883e661c628228be9794cf60345076db26184b617e272298cd4183f27bd52d40510bb015d2097d4cc76e76c0a62bbfdaf53c7268775bbfbdb8870eb9bab", "signed": "4bf1e7d49cd4d5c3c1fd4a4bc48ff6b6e52fd9510a411812296996e4fec56be44514c567d1d33477bd5dc083c3958bd95bfe599c153f21ae26252967b7326003b60df2944ba015759802d3c587bcfebe521a7e77b9985b761c9676454d24a664af0b0d44225a557512e1c1cd7dd8335c8f6adf928e18f89fd5eedf6f411dcdaf996912e8c3e23d1cb95eca4b9e24e7539c3b98bf3d07ec251392096c19ac5374dcba526132b6d9bb8f6c859ce985d584c7bba5b02a81034b6d8b521bd280e50d77daa2b2413ed679834f8161d5d0573bdd476ac3cd0a3a7d8db45334e89c00ab66bc368a07b423e246434636272aa4e4637a5306b2c3397992781f30238de79ec104acc7200defad960883d391443e70efbd22f1cfceec5112fe9e8e13bb941c083468dd71ffca976cd51ce161793110ef00aff5ee2ccb7706a512b85beb94ac49d19afb6333655cf3aea535a6f9c75e034841e763c5a249b4704e1be78b0ecac6802c343c1b7e7b5770de4c93a3a79c46e6835da8ae5db3838e1796b564a480a4f290b60a1c63a725ff3fef434d2a0b3d8931978742b525c83bae6794ae64193794b370c289ba35ed79d37072a8dcfcadb46d5ffaeeba1bfd4f87d766b504e62b4acdd77446e79ba994d6dbf4765ebd74b0365100da56162c36fe5a95077f6b4265e81796b4a57443782970b96cb4569ba985c55fe3a718380bca39f16624f8e47cc63c1b6fa1bde1aeba9c51f94b702b13108cc1481d42e6fa981e3ebfe064d2dca7420c74595792312ae3fb9101d4b66d9916dfd6c13ae883e661c628228be9794cf60345076db26184b617e272298cd4183f27bd52d40510bb015d2097d4cc76e76c0a62bbfdaf53c7268775bbfbdb8870eb9bab", "signature": "4bf1e7d49cd4d5c3c1fd4a4bc48ff6b6e52fd9510a411812296996e4fec56be44514c567d1d33477bd5dc083c3958bd95bfe599c153f21ae26252967b7326003" }, { "secret_key": "69b320fbd4774030a29767a0cc1550d10b749b44d619d41dce1146f7ac80a755", "public_key": "dc508a79c6b8ab866cd117a5a84dd9d931fda450bec29335344d0d219216d65e", "message": "217e33f88622c96f8d092c9e26664fe9efc0d8d2eb59a036fa464cee65ce4489caf903dce17afafbc4f18dc9bbfd6c1a4be7b83485a6ca947defb1d35125d0773962a344a38b6dca9a40c31c1c4eb2d7f6818f978e573d66b990921b92b777471a4f6f05477ebc353ace1d86b00cc251777aaf6af3aa1179bff78df5048e5ef29968670e535483568d6bb16da829568f81c799b9afd4aad6ef085252c0ce3ac01ac21a9ea69bd58eadc66968f55dee386b653f3334efc398ef3c37a38ce93b21f107cc54dec26f53fee5604eb09a36afe6b665b6324a84c7da7b7dd01d9278e472f15a5ce9ff0fd93d0aa0604dd2df8d5bf6a912734ec51de77f0ce099ba11670210a6a206106b0ede2ded858a6bc411e7613e6f80e1aa52c323e30fa849951cc9b776e4cc58c90cfc8f442df64151a7fd4a3dd61a4336da21d03944635d3fd667be741ef45b1f7cb276d9f4de8107de64582f7917c6eab38e0a8890a4bee48bc92617a361cc7b1d25e089453ce0a52544f868dcb3249de761e79df63efa0794e3c4618c554753ee281c52ac8ad78d5338f0dac360a769381bb4a39f190b887b4723806ac4a4f2ff304bc6f9337ab54c866e6ba51df50c43eab52e2b39794c9917e0c31433f03681d2f1d93a0436018caaae20206a3458ad6c037acb511ef128f6dcd05305f07049a13b6c6c3c5b8170f158c8f12d46e160931ba18bd59ae129ec07a0655fa482ebbd3b850d36b832bbb775f538e3c1b3a43ecf94ca630ca15d502813eed3e35e8fd23d2ab638600427d1597cb29da2a5", "signed": "697d4d897e0e2cc02bc1c2dda57f0dda620b37e861822bb7f1a701935e959ea0d8453f746fb92c087ed65d980eea1d6fdbf23e99b289aae0dcbb128ef836640a217e33f88622c96f8d092c9e26664fe9efc0d8d2eb59a036fa464cee65ce4489caf903dce17afafbc4f18dc9bbfd6c1a4be7b83485a6ca947defb1d35125d0773962a344a38b6dca9a40c31c1c4eb2d7f6818f978e573d66b990921b92b777471a4f6f05477ebc353ace1d86b00cc251777aaf6af3aa1179bff78df5048e5ef29968670e535483568d6bb16da829568f81c799b9afd4aad6ef085252c0ce3ac01ac21a9ea69bd58eadc66968f55dee386b653f3334efc398ef3c37a38ce93b21f107cc54dec26f53fee5604eb09a36afe6b665b6324a84c7da7b7dd01d9278e472f15a5ce9ff0fd93d0aa0604dd2df8d5bf6a912734ec51de77f0ce099ba11670210a6a206106b0ede2ded858a6bc411e7613e6f80e1aa52c323e30fa849951cc9b776e4cc58c90cfc8f442df64151a7fd4a3dd61a4336da21d03944635d3fd667be741ef45b1f7cb276d9f4de8107de64582f7917c6eab38e0a8890a4bee48bc92617a361cc7b1d25e089453ce0a52544f868dcb3249de761e79df63efa0794e3c4618c554753ee281c52ac8ad78d5338f0dac360a769381bb4a39f190b887b4723806ac4a4f2ff304bc6f9337ab54c866e6ba51df50c43eab52e2b39794c9917e0c31433f03681d2f1d93a0436018caaae20206a3458ad6c037acb511ef128f6dcd05305f07049a13b6c6c3c5b8170f158c8f12d46e160931ba18bd59ae129ec07a0655fa482ebbd3b850d36b832bbb775f538e3c1b3a43ecf94ca630ca15d502813eed3e35e8fd23d2ab638600427d1597cb29da2a5", "signature": "697d4d897e0e2cc02bc1c2dda57f0dda620b37e861822bb7f1a701935e959ea0d8453f746fb92c087ed65d980eea1d6fdbf23e99b289aae0dcbb128ef836640a" }, { "secret_key": "66da8b254a37067378f68138afedd66496596a0585524c716bde2b3124c3e7d1", "public_key": "85bde28a922ab5eeaa4a6294521a2ccac0ef2303dcdf8c7fee228fb4552012e7", "message": "3fae36638837d0edc8dcee517e43c488ed57fa6c9853a745aaedfb109ec1409fb8a2fe51d23e0dd9fbfd94f91c18e6114d808901bf617d2667ceebd205c5c66f5d7534fd2ec33dbfe580ad919f504204eaf242af8700b138cfbe0f372919c06b861a27d720d09df20f4fb7b748e718b0fc486dbdfcb694cb3f1420035ac1be55d31f30f997a043d04708a5c542ee37c0f7fe0b3211d18a87033dcb15c79e6681c4970593d32a13c48f0a3af8bfc136e0f9b56a123b86c4c640b650cb7dee9a89e82aeeee773b5cb032fca41c20c407328bfed29244e46055a83114614d3db56581604b115fba14f618e102a1e16cb036ea69df9275b977a0858118c91a34b9a8519bd0dac3b61434ea088f381ba08bc1583189a4a7c8b6ad18f732d74eff3acef4b6904df58c6469432151372df9327ae71a0f356c94468dcfc2e4a5c0e4ec0b166d90cd465f9260ebd6a7a62ce6c715bcc715be0c7e1f28c4456012d33177a7d4113c9a5a22acfaf2d6b63309078fc1b1baa8f36c7e866c1f972a6500a5eea79201651a7305208b6c93c492bc77cacbc99c9cded179e664a2f4e16938cc26fca8b433eb8012f7b3ad19ba1fb858fe4a00fb3d1f8fd0eddf0c37dcdb2e5d35c2546f22e8c0f8ce90e2df8abf24827a019b2c33fc590bbe712f019287002bc2217c0dc0931dc8ed8f50bb442f8b2de27857362ce5a9fd97f0fd1b2b9251cad2a4aca1a94de2e953902d7228142407443b1d517107648a7bab83074987d0978bc61d419bc84591c969c3d6f4e86fc4738737bc0558755c110a", "signed": "4082a5bc730fb54b6bd0bcd2a044ed5d3d327dc19ceac8825e629b9e6423cb1c614236f097a6b73d473947cb81c4e270852ee5f13a5b03dc18e1c9c27a9a68023fae36638837d0edc8dcee517e43c488ed57fa6c9853a745aaedfb109ec1409fb8a2fe51d23e0dd9fbfd94f91c18e6114d808901bf617d2667ceebd205c5c66f5d7534fd2ec33dbfe580ad919f504204eaf242af8700b138cfbe0f372919c06b861a27d720d09df20f4fb7b748e718b0fc486dbdfcb694cb3f1420035ac1be55d31f30f997a043d04708a5c542ee37c0f7fe0b3211d18a87033dcb15c79e6681c4970593d32a13c48f0a3af8bfc136e0f9b56a123b86c4c640b650cb7dee9a89e82aeeee773b5cb032fca41c20c407328bfed29244e46055a83114614d3db56581604b115fba14f618e102a1e16cb036ea69df9275b977a0858118c91a34b9a8519bd0dac3b61434ea088f381ba08bc1583189a4a7c8b6ad18f732d74eff3acef4b6904df58c6469432151372df9327ae71a0f356c94468dcfc2e4a5c0e4ec0b166d90cd465f9260ebd6a7a62ce6c715bcc715be0c7e1f28c4456012d33177a7d4113c9a5a22acfaf2d6b63309078fc1b1baa8f36c7e866c1f972a6500a5eea79201651a7305208b6c93c492bc77cacbc99c9cded179e664a2f4e16938cc26fca8b433eb8012f7b3ad19ba1fb858fe4a00fb3d1f8fd0eddf0c37dcdb2e5d35c2546f22e8c0f8ce90e2df8abf24827a019b2c33fc590bbe712f019287002bc2217c0dc0931dc8ed8f50bb442f8b2de27857362ce5a9fd97f0fd1b2b9251cad2a4aca1a94de2e953902d7228142407443b1d517107648a7bab83074987d0978bc61d419bc84591c969c3d6f4e86fc4738737bc0558755c110a", "signature": "4082a5bc730fb54b6bd0bcd2a044ed5d3d327dc19ceac8825e629b9e6423cb1c614236f097a6b73d473947cb81c4e270852ee5f13a5b03dc18e1c9c27a9a6802" }, { "secret_key": "276548290f3e0f900515dc63366c03fe0fc6ee130c21fb60a4df9cf464797cda", "public_key": "7e2a3578000a087edcc9e94fde509fc4be05ca0dd090df01ae1121123536f72a", "message": "f0db442de29a7a1ded550d120002cc12abfff98b1f576d65bde16deaba687e4e0b0d5a8748d7503da2969c64d6a7c28d27b6c93ad257ce32ecdaee375f43fff97c432d453f7196c709c3bdfb7388d4d8eaf139f182940ce17b4552e2d20aed5557ba4d2acbf845730c0a66b45b40950baf6a946437af6c9e3b33a79e04dceae57c2a549542eabd216bf13948d41ffb9483fe29801fc8c1782840deeb3fb4da3192785bca13ed0a9eff57d6136bafbf9dec697b832447b2b6e730fa7f9995bac6b7832eaa09905ee49d465a5ee450f52d1a6d364c618144e886e8ef633dc79d0af893d16b3eeda0fefefd8759f2a0da1930170dd19eb78f0d7a7b74515403375a95bdbcce018bc1edb08d897bb798a95e7e86a52af3d9b8a4a14b0371d63498dcb2016248ebd0be800e9f21d549e5e0e7b4895ca5cb725a0cab27da8a8b1299be38a4260900ae10df5baba11ae2bab7179dd8453969429ccc4d416055f2bcb93c1cac6d7e804cf812df1462f22ee9e833a9769e8e677550402c4094df212fd2c5fcc09a72c7ce0077510073090d0e63db637d43d4c21f8619d34da5db08033f686ce8b8a0821222f95434ac4e6f703094edded6fb1b846e979650979d3c77453f40f7fee7c3e88a96fd1d702e81c2a4f3f3753c7964842dfd9d3958a743da063d1d648e51b210a28ed2487f14d5f1bc6f339b2dd17a661c39736da99e4a4f07360342d237e3813ea3998d66eb31a2d708af065c32b927f757c37a800660674e9717ba58f280eb2aa464fa74402108a5d5662e8d0feaf329687a", "signed": "88a146261ad111c80fa4299577e710f6859cf0d1ca80e512a552c725b8384037eecf6465ce97585c9d660a41ab9104e5f7c9b2f8ec6fb21f1ddd50d65b9b660ef0db442de29a7a1ded550d120002cc12abfff98b1f576d65bde16deaba687e4e0b0d5a8748d7503da2969c64d6a7c28d27b6c93ad257ce32ecdaee375f43fff97c432d453f7196c709c3bdfb7388d4d8eaf139f182940ce17b4552e2d20aed5557ba4d2acbf845730c0a66b45b40950baf6a946437af6c9e3b33a79e04dceae57c2a549542eabd216bf13948d41ffb9483fe29801fc8c1782840deeb3fb4da3192785bca13ed0a9eff57d6136bafbf9dec697b832447b2b6e730fa7f9995bac6b7832eaa09905ee49d465a5ee450f52d1a6d364c618144e886e8ef633dc79d0af893d16b3eeda0fefefd8759f2a0da1930170dd19eb78f0d7a7b74515403375a95bdbcce018bc1edb08d897bb798a95e7e86a52af3d9b8a4a14b0371d63498dcb2016248ebd0be800e9f21d549e5e0e7b4895ca5cb725a0cab27da8a8b1299be38a4260900ae10df5baba11ae2bab7179dd8453969429ccc4d416055f2bcb93c1cac6d7e804cf812df1462f22ee9e833a9769e8e677550402c4094df212fd2c5fcc09a72c7ce0077510073090d0e63db637d43d4c21f8619d34da5db08033f686ce8b8a0821222f95434ac4e6f703094edded6fb1b846e979650979d3c77453f40f7fee7c3e88a96fd1d702e81c2a4f3f3753c7964842dfd9d3958a743da063d1d648e51b210a28ed2487f14d5f1bc6f339b2dd17a661c39736da99e4a4f07360342d237e3813ea3998d66eb31a2d708af065c32b927f757c37a800660674e9717ba58f280eb2aa464fa74402108a5d5662e8d0feaf329687a", "signature": "88a146261ad111c80fa4299577e710f6859cf0d1ca80e512a552c725b8384037eecf6465ce97585c9d660a41ab9104e5f7c9b2f8ec6fb21f1ddd50d65b9b660e" }, { "secret_key": "972c0616556ef22c214868fdd822c55739e1f96a93ae83512afda9ca7aa74cd2", "public_key": "9e1c6d4107f8ab8161c5db5b88a37ca1de9f4e291367abb1efc84f83f7076953", "message": "8689e2f95c8fd50dc44664a18fb1a9f2c8f3ee73c0f9587ee28bfa35c9231c75bfd3d9534174e5ad3fa9f092f259942a0ff0ba2ca2cb59043d192ca8e3c8869bedd2354cbc5ac782d727c0b69407f68d1326df65a60c4d32f87f19a10f3d765ff923434f5511d134d397c4fef6bb1953abfce60827c359aa4b54f912aa8b17b83dcc7e3bcbc505ba046fe57c16dacf4ee2fad538bc06817c9b9d8dbc5f9d9bbf9f4a934f14a42c29e0e2f3a49f46b20ee76cfe20dea1e97450eb6a8fda048168dd827810207f005a3caa93ca11f4ee608a7a9355494313aec8d7075afc94c7cccc75c2319bb458c0ce373e9d007f753b33b52793d58496b2d25cd1dcd7832aac5ddb38f4db19c427219e1a0420ead47ba95ab6d89c65939041cc734c08eb6b476caf7fc76c598d947ff444b10770f62945ae65044f78098299e2626b638a7328d1b7daa5889e8db94bbff2ded62e14463760227c3f326ed493565ddf0a1761b8e4bb7d2410fa0fdbf35684397eefea95895889a0a9dffc5e02c092383b7ce74d2d90939916f26b71afd265f8bec74f0de247c9643905583df3cee23537d6b568c8338ce5fee42f7dd15dad5247f009acbfd5d769b6366959cd0ae150f58f7c80fa10d989ed90119372e5fea5da48a4e8ea9c727875dc4a2005b0dc2e3f697c0ce0a4bdb2f750c04fbc0c27d02dd8286e54c9c3959b6ffbdb1de2affe9e782651e5168a500afed037b3e1790ddd593851a6a6ccca9fffb4a99e27df43818871536ab04f14a06a1c7cb47bed6241ce7430ad3e640a726752fa06a9", "signed": "54dd06fbb3d7c63f8cdaf783c2d7bac16b4c826e2d1b1807c84e049f64e271b21cfa3e37c344260287805d718806b62c56b47f6d5c508125c9fb5d5ea35fd5018689e2f95c8fd50dc44664a18fb1a9f2c8f3ee73c0f9587ee28bfa35c9231c75bfd3d9534174e5ad3fa9f092f259942a0ff0ba2ca2cb59043d192ca8e3c8869bedd2354cbc5ac782d727c0b69407f68d1326df65a60c4d32f87f19a10f3d765ff923434f5511d134d397c4fef6bb1953abfce60827c359aa4b54f912aa8b17b83dcc7e3bcbc505ba046fe57c16dacf4ee2fad538bc06817c9b9d8dbc5f9d9bbf9f4a934f14a42c29e0e2f3a49f46b20ee76cfe20dea1e97450eb6a8fda048168dd827810207f005a3caa93ca11f4ee608a7a9355494313aec8d7075afc94c7cccc75c2319bb458c0ce373e9d007f753b33b52793d58496b2d25cd1dcd7832aac5ddb38f4db19c427219e1a0420ead47ba95ab6d89c65939041cc734c08eb6b476caf7fc76c598d947ff444b10770f62945ae65044f78098299e2626b638a7328d1b7daa5889e8db94bbff2ded62e14463760227c3f326ed493565ddf0a1761b8e4bb7d2410fa0fdbf35684397eefea95895889a0a9dffc5e02c092383b7ce74d2d90939916f26b71afd265f8bec74f0de247c9643905583df3cee23537d6b568c8338ce5fee42f7dd15dad5247f009acbfd5d769b6366959cd0ae150f58f7c80fa10d989ed90119372e5fea5da48a4e8ea9c727875dc4a2005b0dc2e3f697c0ce0a4bdb2f750c04fbc0c27d02dd8286e54c9c3959b6ffbdb1de2affe9e782651e5168a500afed037b3e1790ddd593851a6a6ccca9fffb4a99e27df43818871536ab04f14a06a1c7cb47bed6241ce7430ad3e640a726752fa06a9", "signature": "54dd06fbb3d7c63f8cdaf783c2d7bac16b4c826e2d1b1807c84e049f64e271b21cfa3e37c344260287805d718806b62c56b47f6d5c508125c9fb5d5ea35fd501" }, { "secret_key": "e0405d37893e89f53811d6d446e1f193f51afa1bbba725f95eb48033424a2509", "public_key": "45104d595e443e8ce654de9d655054bf0a99d35613d77d57454ca2d1c899b517", "message": "df58c4fd0702a20fafa3d1d4fe7d85938b120fc11e8d41b601f0e60e42236a49f126813bd512ee71359061e13eb314d417f56d6d560285fa8991213284c42bc2cef2dc937bdc0b5e9dc2269afab32db30e6849855951cfbc53ecfa01643863e0328995fe850c0db55421bfa564601b8c9db7552c7e6aa7adfa15a58021a84266e9595c65fca4a15fa70f55f5d212c9e277ffb830f4cad1861f3f495a9d672f5691310639c12dcd07e3ef17a23750bcb46b7ad7eac462eb512225f3be7e32f8f4987a11df341166062b43c63ab858a600497667fbb88e93c7e2e0aab41c09c023eb902ec3baf679e25b96e106921a914fd5de200a47889de23e7b65d0ccdf0c29036467a1210c0030309a2d04ec256d5a4d8b97d46a3e15f345b667170803cdacf6cb48add0a13462dd30fa062bd4566641da07d7f61e063686edd96bfe8f97b986b7c0e44249cd2d7317472999b8ee4ea80c902f3b188936712e89d8bf02ce8ae77b6b31abb0632065455ddd9f9d1cd953a4a49aac1a15169e687d4fd3f7c2edfb3aabc3b66155f7d315f8a294faddffdb4951367a0cb870759e85a838af66ba3fc103da2babc3f381696ef8882d85a8278d5fac3a72f16eb119ee9900b1fd986c2a9f94eed8e0d4f273697e4363a975ff6a7b80d5b4ec5355bf63b42b71cd4842401d38b5e00cc97bfda40e456653683bc8e6dade7dcf985a97b0b5776c4d72ca13a1474e4eb2eccfcd428786ddd0246d73a6377a79cb8da720e226c19489bd10cedde74b49fac2cfa207129c6a108aa164be9d809c4d31147360", "signed": "77ddd491ca662ebffb12f7f492d7fbc1a1b447f6c85998f2f7cc9adce67de63b6eebd08117845a0302f7349714ba9db2af58048b85837d7660ec3debeee2d00fdf58c4fd0702a20fafa3d1d4fe7d85938b120fc11e8d41b601f0e60e42236a49f126813bd512ee71359061e13eb314d417f56d6d560285fa8991213284c42bc2cef2dc937bdc0b5e9dc2269afab32db30e6849855951cfbc53ecfa01643863e0328995fe850c0db55421bfa564601b8c9db7552c7e6aa7adfa15a58021a84266e9595c65fca4a15fa70f55f5d212c9e277ffb830f4cad1861f3f495a9d672f5691310639c12dcd07e3ef17a23750bcb46b7ad7eac462eb512225f3be7e32f8f4987a11df341166062b43c63ab858a600497667fbb88e93c7e2e0aab41c09c023eb902ec3baf679e25b96e106921a914fd5de200a47889de23e7b65d0ccdf0c29036467a1210c0030309a2d04ec256d5a4d8b97d46a3e15f345b667170803cdacf6cb48add0a13462dd30fa062bd4566641da07d7f61e063686edd96bfe8f97b986b7c0e44249cd2d7317472999b8ee4ea80c902f3b188936712e89d8bf02ce8ae77b6b31abb0632065455ddd9f9d1cd953a4a49aac1a15169e687d4fd3f7c2edfb3aabc3b66155f7d315f8a294faddffdb4951367a0cb870759e85a838af66ba3fc103da2babc3f381696ef8882d85a8278d5fac3a72f16eb119ee9900b1fd986c2a9f94eed8e0d4f273697e4363a975ff6a7b80d5b4ec5355bf63b42b71cd4842401d38b5e00cc97bfda40e456653683bc8e6dade7dcf985a97b0b5776c4d72ca13a1474e4eb2eccfcd428786ddd0246d73a6377a79cb8da720e226c19489bd10cedde74b49fac2cfa207129c6a108aa164be9d809c4d31147360", "signature": "77ddd491ca662ebffb12f7f492d7fbc1a1b447f6c85998f2f7cc9adce67de63b6eebd08117845a0302f7349714ba9db2af58048b85837d7660ec3debeee2d00f" }, { "secret_key": "5756e752dff69e3eed848e4a49c7a8baca12154f9431dec35626ef8d75a44514", "public_key": "5910ef00a5b354143c46561da62c41aa13d29c18dc6153bf8e502e0114007728", "message": "eb2190a3219c792b6666b2752733ad9f86fc390155c4b438be196959383b25f3a749530d5a4b15ebe2c18d99178e6d45bb4aa2120f95a352e0406c63ac867248d9efba124231064873c82fe995dd031c7cbc7d15ec191fbb6c474dc4c777e8f457841eb4624841c152d15ede26e78479a6a25ffa335563f1064ef09558b910e2608418820f49554b670c6bab34d1d60984dea50ed6a375f45a74beadfb04bd9300bd594e2e20ea5d3052bb7ddc51a949a0047972682ebe66d38aac62927270de42150d58221d03b8ace3589933487bf23d29c5c2c843aefa2e1ca22f9d1680f80c766d143ce5ecef253a745cb71e72f6504ad911f7cb4a819cd074863a92706929a3142f8db7ac164102ac2ca0d2e19a725e1b5f81f443c73e0484f26a45a3aef84f1f3fa04a4ac695d2dab6efba456a281a3973cc186e680a66df521a4d1f9edf4dfb274a427097bf863281cfb0ed80f8d7676638d6cdac937843efbcfce91de1df6c52b594571b9315600e4b6552defb8437a807ba21298e3d972212ba314692917f40075311acd009395241b9f1b256c515735dc674f8e866d1eeb4c328548aee71231c4c9d5bd22e39de88d19fabf49f0b9869cbf835214b15522a93d3a5007b11f0b50e5228d4eebb4571b35da84f4f687e3f43793d54f3825b37a509ea564bdf217ff4adf6847bbea4316a1dbcc7448ecd5363eaabc128decf054ee1a0ee2d871979f8a63b2692b09f6e986a138e7f68f60aa426a1c9b01a4902e13b17bc8312410c28bed29b601b0fc9f3bc2d223f875251100f869c6b5844", "signed": "8157d8334ded1a32699b350ac0d4120028cd8ef8189448934850e50ee4999d8fa2cd257646d92fba5d662a823e62208ab4fbe01714a848a0b90b55adcd246902eb2190a3219c792b6666b2752733ad9f86fc390155c4b438be196959383b25f3a749530d5a4b15ebe2c18d99178e6d45bb4aa2120f95a352e0406c63ac867248d9efba124231064873c82fe995dd031c7cbc7d15ec191fbb6c474dc4c777e8f457841eb4624841c152d15ede26e78479a6a25ffa335563f1064ef09558b910e2608418820f49554b670c6bab34d1d60984dea50ed6a375f45a74beadfb04bd9300bd594e2e20ea5d3052bb7ddc51a949a0047972682ebe66d38aac62927270de42150d58221d03b8ace3589933487bf23d29c5c2c843aefa2e1ca22f9d1680f80c766d143ce5ecef253a745cb71e72f6504ad911f7cb4a819cd074863a92706929a3142f8db7ac164102ac2ca0d2e19a725e1b5f81f443c73e0484f26a45a3aef84f1f3fa04a4ac695d2dab6efba456a281a3973cc186e680a66df521a4d1f9edf4dfb274a427097bf863281cfb0ed80f8d7676638d6cdac937843efbcfce91de1df6c52b594571b9315600e4b6552defb8437a807ba21298e3d972212ba314692917f40075311acd009395241b9f1b256c515735dc674f8e866d1eeb4c328548aee71231c4c9d5bd22e39de88d19fabf49f0b9869cbf835214b15522a93d3a5007b11f0b50e5228d4eebb4571b35da84f4f687e3f43793d54f3825b37a509ea564bdf217ff4adf6847bbea4316a1dbcc7448ecd5363eaabc128decf054ee1a0ee2d871979f8a63b2692b09f6e986a138e7f68f60aa426a1c9b01a4902e13b17bc8312410c28bed29b601b0fc9f3bc2d223f875251100f869c6b5844", "signature": "8157d8334ded1a32699b350ac0d4120028cd8ef8189448934850e50ee4999d8fa2cd257646d92fba5d662a823e62208ab4fbe01714a848a0b90b55adcd246902" }, { "secret_key": "b904acb19e5cf872d3640cd18ddf3c0b6657e0117ce659dbf50259015d3fbf32", "public_key": "e04a8aa56d1818483b10d0a7c919e1d5d8001e35510e1ec62f7114dbe81ae0be", "message": "83f4124d5af955139b1bc5441e97c5fac491b4ea911407e15420a0347ed7fa1f8819e36c8ed5740c99d4505a78b619d560749af50b0573510816d61322cda976a5d4ca3205f5f0e60e759a5df1a0bdf36dfe9717906ac57cbfc970ab43b6fa18e6c0006c84fc7254470a0b774727bf5f8e679423a531e41cb5310f9bcbf5a5445ebc39fbd909ce11e97bc2f66a4a1bb6c2f167f2c6e80eb9b8b72df3e8cfd4e51448dc14c0b837f2949693d1d054c8f95bff7f1e364567d034f2223e1594772a43dcfe0597fd6d133b3f2e96ffc5667dd5928f23ec3c750f845993a34e9776159a6830d6fd9013ee7aeaa1fccd69b96df284704fd08888b15b64e2e90d578c5cfc0f95693f6ab65c6947446a857c029c7ca66080b754c7734b78998abe9b7cc6efd09a4418194d88b34ec6c33af630db81de5b99fe65aac8b73362379119c700d107edfc19f270760468ee8e5f155d9a347e57b5930f327a8d11c6674ddd020f9e7d9b761dba5b83a87302f1833e5abd49526d66391e5bf0e35b4453d630bf7d0adbfe501aef81e6c5938f92cb752f5f14d2806f90ae1546051ccc7f913c5d6a38ff3b7b9a23662ef1f00808edb2fa31ecba5c8d3387e87541cd0616edbf3aaa35a537922861f44cbd9f992b8246d9c64c419881701ab43f7fd464210d802ba656d95c0f24a34599b20b1ec20011485cfcb3186b7bcf69d74581a7a3eed6134c4eecd65574a4320d9c57a849c4e78c8a5ce82505004a54f19d4bdc8223401b34946b7d66e47e63cf9d0f57d0945491384bc6868c4b478690e550021df1", "signed": "9aaf8ac97140d5508d58f5ac82b7fd47e6b1f68a7c78a2ac06f0416ef8e991953f62c47fd5fbc6c1e01bae1c92a33ef52b7efa5f17bb8633bdc1aeebce318f0f83f4124d5af955139b1bc5441e97c5fac491b4ea911407e15420a0347ed7fa1f8819e36c8ed5740c99d4505a78b619d560749af50b0573510816d61322cda976a5d4ca3205f5f0e60e759a5df1a0bdf36dfe9717906ac57cbfc970ab43b6fa18e6c0006c84fc7254470a0b774727bf5f8e679423a531e41cb5310f9bcbf5a5445ebc39fbd909ce11e97bc2f66a4a1bb6c2f167f2c6e80eb9b8b72df3e8cfd4e51448dc14c0b837f2949693d1d054c8f95bff7f1e364567d034f2223e1594772a43dcfe0597fd6d133b3f2e96ffc5667dd5928f23ec3c750f845993a34e9776159a6830d6fd9013ee7aeaa1fccd69b96df284704fd08888b15b64e2e90d578c5cfc0f95693f6ab65c6947446a857c029c7ca66080b754c7734b78998abe9b7cc6efd09a4418194d88b34ec6c33af630db81de5b99fe65aac8b73362379119c700d107edfc19f270760468ee8e5f155d9a347e57b5930f327a8d11c6674ddd020f9e7d9b761dba5b83a87302f1833e5abd49526d66391e5bf0e35b4453d630bf7d0adbfe501aef81e6c5938f92cb752f5f14d2806f90ae1546051ccc7f913c5d6a38ff3b7b9a23662ef1f00808edb2fa31ecba5c8d3387e87541cd0616edbf3aaa35a537922861f44cbd9f992b8246d9c64c419881701ab43f7fd464210d802ba656d95c0f24a34599b20b1ec20011485cfcb3186b7bcf69d74581a7a3eed6134c4eecd65574a4320d9c57a849c4e78c8a5ce82505004a54f19d4bdc8223401b34946b7d66e47e63cf9d0f57d0945491384bc6868c4b478690e550021df1", "signature": "9aaf8ac97140d5508d58f5ac82b7fd47e6b1f68a7c78a2ac06f0416ef8e991953f62c47fd5fbc6c1e01bae1c92a33ef52b7efa5f17bb8633bdc1aeebce318f0f" }, { "secret_key": "8a3501b76953603c9033e3bcbf3ec378d257011a6c50b89762d491eaa72c5e0d", "public_key": "778f2019dcd8dbb86c6737cc8dc190c5a04c50b5bf4588bc29fa2a47af252672", "message": "e609f1224a6a451140cbc0254d432ce5fddd08a8e912f81c412fdfd5182ff6ac2f13c576c8145b15f25b409d853f914409e4e02cefc39d9bef4a2a060498570b2d3a2838c9b0b8e3af4fc37e1915f804a80188585b30b68a3ffb2e960c7320e827d2fe36e6a328cc6e7806348adb0b773b784de529bb6f64751b2105859494fd49db0bc7f62df46b9d7ce676975cc5f43856498436812e04f26fb8b8ab7eba12f1d56722eb82ebfafa4735977a26681cb03fa4bc6951ab9cbdf787e3278f2f57f29e12095f8ca2a178cfa7571337f0274237669f97657d4badb39436d786492580fd55d86be3a0cd17d16057017baaaea00c1e14552159bcabc0e666bad3418e4ec13bfe163be256f0c89bc2344a8ddf99ca8160b189875ad322d90f581325281d5389965c0a7b7bcae2294a3cbe35a4e4e83b54c4276353960fad118532d49b7076f25ad190ab5694914f7108b0ab6969a19128fb0aef00e65a04fc832d07696167b9342b355ec57737ca37cbff3bb31931cb58712a4c468952c6459d567a26e79501e4e31b1b0953537632029e9b490f72e5a6e057ddb4b31756fd9704218b1b8f4dcb5430c025042f47169bfc7c80d71cab8ca07f340afa008abbe2e3a0abe141da8d41ca6bd69d36fdb11a41ce0b72fabc00d97ea605270010b259df8e10dd22dc17c13990a05f0233e3ca856b40971cb3e21c8b3950b13fc84e1f266c2a6fbece88d59725c3cfb2225dbc1ee95b686db704fc937b766f0a9bfe95a42b9010f1229c610d7ede095712c8f0f1fb0047c040a870306cd8dc74c4da51bf", "signed": "a8a309ba52125e76a4a61eb43fd4135c41ab11799b91cc54ffc9c6a20f050cc595b28143c874bdb928beed261d9c0f12aa192e6640bfdad54ba0d478426bce09e609f1224a6a451140cbc0254d432ce5fddd08a8e912f81c412fdfd5182ff6ac2f13c576c8145b15f25b409d853f914409e4e02cefc39d9bef4a2a060498570b2d3a2838c9b0b8e3af4fc37e1915f804a80188585b30b68a3ffb2e960c7320e827d2fe36e6a328cc6e7806348adb0b773b784de529bb6f64751b2105859494fd49db0bc7f62df46b9d7ce676975cc5f43856498436812e04f26fb8b8ab7eba12f1d56722eb82ebfafa4735977a26681cb03fa4bc6951ab9cbdf787e3278f2f57f29e12095f8ca2a178cfa7571337f0274237669f97657d4badb39436d786492580fd55d86be3a0cd17d16057017baaaea00c1e14552159bcabc0e666bad3418e4ec13bfe163be256f0c89bc2344a8ddf99ca8160b189875ad322d90f581325281d5389965c0a7b7bcae2294a3cbe35a4e4e83b54c4276353960fad118532d49b7076f25ad190ab5694914f7108b0ab6969a19128fb0aef00e65a04fc832d07696167b9342b355ec57737ca37cbff3bb31931cb58712a4c468952c6459d567a26e79501e4e31b1b0953537632029e9b490f72e5a6e057ddb4b31756fd9704218b1b8f4dcb5430c025042f47169bfc7c80d71cab8ca07f340afa008abbe2e3a0abe141da8d41ca6bd69d36fdb11a41ce0b72fabc00d97ea605270010b259df8e10dd22dc17c13990a05f0233e3ca856b40971cb3e21c8b3950b13fc84e1f266c2a6fbece88d59725c3cfb2225dbc1ee95b686db704fc937b766f0a9bfe95a42b9010f1229c610d7ede095712c8f0f1fb0047c040a870306cd8dc74c4da51bf", "signature": "a8a309ba52125e76a4a61eb43fd4135c41ab11799b91cc54ffc9c6a20f050cc595b28143c874bdb928beed261d9c0f12aa192e6640bfdad54ba0d478426bce09" }, { "secret_key": "42b53652d08b5d766e66ad8f3ebf693cfd77907cadd98b5466df77dfa2c637ad", "public_key": "88463bb8a4b6388d924cb86209834195435d79d77f8c02f46bbd16d82efe42b3", "message": "9ee913c74ee3c5e8c90d64b8ae3a60049fc765e176060bcd1cd09f0eda60bf23badb8a1caac3d66ebc5268146ee4a54e1eb231ed25eff95b90a6e98337a540a3f48449794a4873bfc2e84728966bb7c6ff676a2ff57311c1c25e15fbf3d40e9f25ab5db91fddb7a0ae436c8ec070754b6d743aa1d6048fb5bd7f5b8e4ccad20328389530f11374a489b1d50531a39c9b32b40369626006d264a99eec4fac1341f4e74679457b418e6bbfba233f1ca158f7b29d40d50301f9d92536fdc5c23fe5dee4d6df0ebf13dfa3754a14c856009adea1dda409304c1f60d25330fb10957947a00508f2fd76422eac694cc39fa8ae7fcc77a02fd9ee5f910d93e8aac68f145dd878876ba8eda0a49fcb209c34ea220d4d0605546fc4a809baf010d533e45d17b0e16a46e91ea6fec2cdc5a8b3ec5014b25e92d8e5c928ab06993d4fe23ac8d45c890378dd133f00edb937c071f75cfc13a402e3e429a848652a175c9b6f6eac86f6188a4448a96ce2872e5f65f9bdb87166c9b87a7e958e80bb6566e3fcf871190cf4a867e612cfc1e4371d2b73d2a0ad0aa400ba69e66336233b0f3c52b8a68bca05125601255046e6f49d688d2db85c7b821270516e3c0613f3f23f9c57cb4c8714285cdf95e106a3b5afcaeb81b72f343e87bd92f1581dcf9aa90a024fa4a1048059e30de8ff0d16794dcd745d2b2d534c520f8278538674a934c6f14a8428e3da018a36e45aa5827cf4b15284346fd69363149219bb0d1bc927d8d193c482692f97dc88d8ed337d0c9dc99c7a5e111dced42250d580e20692bb7b88", "signed": "30c4b99e68ec3351308fbc76d9caf0af6221b596b7017fe10cc633023ba97f023896fe322baa347660610e05fa493d218fa360f18d93e275d1eff666b63db2049ee913c74ee3c5e8c90d64b8ae3a60049fc765e176060bcd1cd09f0eda60bf23badb8a1caac3d66ebc5268146ee4a54e1eb231ed25eff95b90a6e98337a540a3f48449794a4873bfc2e84728966bb7c6ff676a2ff57311c1c25e15fbf3d40e9f25ab5db91fddb7a0ae436c8ec070754b6d743aa1d6048fb5bd7f5b8e4ccad20328389530f11374a489b1d50531a39c9b32b40369626006d264a99eec4fac1341f4e74679457b418e6bbfba233f1ca158f7b29d40d50301f9d92536fdc5c23fe5dee4d6df0ebf13dfa3754a14c856009adea1dda409304c1f60d25330fb10957947a00508f2fd76422eac694cc39fa8ae7fcc77a02fd9ee5f910d93e8aac68f145dd878876ba8eda0a49fcb209c34ea220d4d0605546fc4a809baf010d533e45d17b0e16a46e91ea6fec2cdc5a8b3ec5014b25e92d8e5c928ab06993d4fe23ac8d45c890378dd133f00edb937c071f75cfc13a402e3e429a848652a175c9b6f6eac86f6188a4448a96ce2872e5f65f9bdb87166c9b87a7e958e80bb6566e3fcf871190cf4a867e612cfc1e4371d2b73d2a0ad0aa400ba69e66336233b0f3c52b8a68bca05125601255046e6f49d688d2db85c7b821270516e3c0613f3f23f9c57cb4c8714285cdf95e106a3b5afcaeb81b72f343e87bd92f1581dcf9aa90a024fa4a1048059e30de8ff0d16794dcd745d2b2d534c520f8278538674a934c6f14a8428e3da018a36e45aa5827cf4b15284346fd69363149219bb0d1bc927d8d193c482692f97dc88d8ed337d0c9dc99c7a5e111dced42250d580e20692bb7b88", "signature": "30c4b99e68ec3351308fbc76d9caf0af6221b596b7017fe10cc633023ba97f023896fe322baa347660610e05fa493d218fa360f18d93e275d1eff666b63db204" }, { "secret_key": "14cfe00fa7190ae810888ae2bbd0ff6412cf1fd408a308294383a19453b59073", "public_key": "4e61afe8c174b6ee1a29fa09cf87b4008139f1070bc8531b6d06f54c9562a4f3", "message": "bc66f801daa829858e740293d4d2187b8e1a5afba5fd67b10956c65346aca94429d32e4cfb3584ab0e005d0dd742781d47e89447c4e1d81bf7e6154f8f73af03361ad56ea3c06000754b9f327d4edeacc4d348afb54823e1c9d49cd8ff2b19f42021b40d580c39ce3d243661b85421fec915ba9dd2762f850bd208fdbf20ffaba56a468660f17c00fb1c0f4e8527a509dd4eec13360cf6e3cac542b875182f2a7ce7be0a33302fe26d3629629384e35c06789de634e90e964fbda8cbba98111e22e8d0762684266aab76aeba4a380778696814a1e311943cb3505892640c44e3aac4530c50ac604a8d2ccc7ceabffea4aa3d7f48a66dcd7588b80209dbc173f0c663e8fc87a36e892ec9a3ff8f60d2e0d8704e5b6cbb873275151ad4cc0057165031905039651ca10a95c6fda3b27827a657ef9a5fc3eb5b53cac61ddaf5a41704c878570cbc3c41c475b117c05eab0bb196bcb7c43334debd64b9e37450d23f5c10161ec5ab4fccd7cf308e2a9995cc9e578b85e8285a5208b9efd42af9cf2ac2b3b7464254889a2187317e32499709b913953ad46f1c23e1b6b56f024c4a7d48461192c01c56c54c564791ec0a67b61acbf957e6d0d7da8053ed13a41893d767fc5737cd195553da5d5b07065f47d72a35c42b001eb6dbd0f8e77a4b76a6266192647f4155ea11bd1237ba77c87c62bf4b01149fc58bc28f0b5a286485d3717d323964046218e70c7e38b7d5e74ba6b12b022f18197d92c13bca89335c856cbc5756aa3b64ec1f46e396b1161c871cd2dfded1a4ec9192742937c0704531c7", "signed": "f785a46f69bbd099fa011124ba9032c189742c9e001dbb8781d8223345a9569dc144ca694d90245e0e513e88ab023f7f0f99b7416159758dd034e7a89cff3600bc66f801daa829858e740293d4d2187b8e1a5afba5fd67b10956c65346aca94429d32e4cfb3584ab0e005d0dd742781d47e89447c4e1d81bf7e6154f8f73af03361ad56ea3c06000754b9f327d4edeacc4d348afb54823e1c9d49cd8ff2b19f42021b40d580c39ce3d243661b85421fec915ba9dd2762f850bd208fdbf20ffaba56a468660f17c00fb1c0f4e8527a509dd4eec13360cf6e3cac542b875182f2a7ce7be0a33302fe26d3629629384e35c06789de634e90e964fbda8cbba98111e22e8d0762684266aab76aeba4a380778696814a1e311943cb3505892640c44e3aac4530c50ac604a8d2ccc7ceabffea4aa3d7f48a66dcd7588b80209dbc173f0c663e8fc87a36e892ec9a3ff8f60d2e0d8704e5b6cbb873275151ad4cc0057165031905039651ca10a95c6fda3b27827a657ef9a5fc3eb5b53cac61ddaf5a41704c878570cbc3c41c475b117c05eab0bb196bcb7c43334debd64b9e37450d23f5c10161ec5ab4fccd7cf308e2a9995cc9e578b85e8285a5208b9efd42af9cf2ac2b3b7464254889a2187317e32499709b913953ad46f1c23e1b6b56f024c4a7d48461192c01c56c54c564791ec0a67b61acbf957e6d0d7da8053ed13a41893d767fc5737cd195553da5d5b07065f47d72a35c42b001eb6dbd0f8e77a4b76a6266192647f4155ea11bd1237ba77c87c62bf4b01149fc58bc28f0b5a286485d3717d323964046218e70c7e38b7d5e74ba6b12b022f18197d92c13bca89335c856cbc5756aa3b64ec1f46e396b1161c871cd2dfded1a4ec9192742937c0704531c7", "signature": "f785a46f69bbd099fa011124ba9032c189742c9e001dbb8781d8223345a9569dc144ca694d90245e0e513e88ab023f7f0f99b7416159758dd034e7a89cff3600" }, { "secret_key": "ac0f7f0418de67e348fa6d5686c46d21ca72622ee69eaabe00d5c9075a34f179", "public_key": "feabde08f00a2b682bce9d45990bf45afc958339dc44106dad33b2c490ef7090", "message": "e8d0e8325335e0f35a85467beed1e11c6a2078c35ae4a4a10543ede40c1712bc952012d2f8fec105aef7c6c65b3634b4a74b22b498b913507d1f6cfde83858e6830c0af4f464a6899d5c4e279aff36754c21da80a1bbd1dcf46220375b1e112a5a72f1ab6e8f641942f66d9bbdbb179cf0139ea8deb0f4b814f50c513329a1a0e267c4433a233182bc4a2acb2c6d4f00b24094d3bdc0eb81cf37d38260c2107dd9490613d276ee1f72266c6e4acca5249811a0f8a7dae66aedb75c3df4c8ca3cb5d9c567ba541ee5a9140c50587272af34530ab8b08b9ec032eac06039e692630e2d554df77c1a0388b3caaa3be3754a84961fb299e402227158ce363eac26478d479775e5685adbf828bb355e3c89cce241503c15366432ba94cd3cd95479144b636e0de70b3f16d1a3ca518e399009a4c247a7f96367c7146608aacc0014fc35b84af9933f09babb89937abb8ced111891343ddb79f60b78898ab5938f8ba3814bd8002605b1dfd297fa07c475a0d4f8f4451acd707de8af6c0e8818833a3abe5c96d1a8c6c96e2cb63328eba44dd1d34684e412f288e065209d11eb8094d22e4cc802629ccba33926bf1ad36a6285138abee05c5a39a475f3fdd0b3ec8c370cd957a8379ec2cdaf03e895c1ba12b449d6cd8be0f35d99e2b7fbaa92dd54e64e7c35ceb88a71a680527cb373afe14cdd158a0b90bf2daec80d2edbdc3128cd6b63fa532a1c278cdfe0f8ebb4abba5e1a82bc5c3fed15c5795bd9ffb576082cc479fa1b04c5c5afcad269a0f1addfe76042c3a8f1f25377b6cb72ec1614eb6383", "signed": "7591cf8257bead39a1ad3ba1918d518e6724356bf625a573eae501d1af946c13c290cb63156ec9d362726ee50b39fc0a7a2bbd69d4a81b75932a90f8c7ac7d03e8d0e8325335e0f35a85467beed1e11c6a2078c35ae4a4a10543ede40c1712bc952012d2f8fec105aef7c6c65b3634b4a74b22b498b913507d1f6cfde83858e6830c0af4f464a6899d5c4e279aff36754c21da80a1bbd1dcf46220375b1e112a5a72f1ab6e8f641942f66d9bbdbb179cf0139ea8deb0f4b814f50c513329a1a0e267c4433a233182bc4a2acb2c6d4f00b24094d3bdc0eb81cf37d38260c2107dd9490613d276ee1f72266c6e4acca5249811a0f8a7dae66aedb75c3df4c8ca3cb5d9c567ba541ee5a9140c50587272af34530ab8b08b9ec032eac06039e692630e2d554df77c1a0388b3caaa3be3754a84961fb299e402227158ce363eac26478d479775e5685adbf828bb355e3c89cce241503c15366432ba94cd3cd95479144b636e0de70b3f16d1a3ca518e399009a4c247a7f96367c7146608aacc0014fc35b84af9933f09babb89937abb8ced111891343ddb79f60b78898ab5938f8ba3814bd8002605b1dfd297fa07c475a0d4f8f4451acd707de8af6c0e8818833a3abe5c96d1a8c6c96e2cb63328eba44dd1d34684e412f288e065209d11eb8094d22e4cc802629ccba33926bf1ad36a6285138abee05c5a39a475f3fdd0b3ec8c370cd957a8379ec2cdaf03e895c1ba12b449d6cd8be0f35d99e2b7fbaa92dd54e64e7c35ceb88a71a680527cb373afe14cdd158a0b90bf2daec80d2edbdc3128cd6b63fa532a1c278cdfe0f8ebb4abba5e1a82bc5c3fed15c5795bd9ffb576082cc479fa1b04c5c5afcad269a0f1addfe76042c3a8f1f25377b6cb72ec1614eb6383", "signature": "7591cf8257bead39a1ad3ba1918d518e6724356bf625a573eae501d1af946c13c290cb63156ec9d362726ee50b39fc0a7a2bbd69d4a81b75932a90f8c7ac7d03" }, { "secret_key": "b5a7c767936380b3e98751cafd3ea89b388a32cf828b321c5bd0cc8dd85baf00", "public_key": "be7fa65f1f6be51027f8b848db7a8c404961bf1e21a23df23bb8ce05850cdaa1", "message": "6b67c795d66fac7bac8442a6c0992cb5758843b3e3939e3c276c6e9008da82007677bf9e67e9ac5a1a0f486beac0d856191fae25a127392bed469bc78deb0c4b893f67f1716d83509077e4a1bfd4136d03152dcc3b76d9524940a6064c669fbf51f6b91034b6d5f2898678a13a2470f6641ec802457c0102c3ebf6345c327e741b80644b3a99bf72b59ab8016f35d25188a085750dc060e5a8d524ae213f078f288c7b34bc41f3ce356bf2dafdd2e0db4fb8d7c2c319f9906005971702e49ca62e8050540d4121d242f2eeab1bd134e60bf11b3ec71f7765a97c0e098455e59d2235d6b37e7c9f5b21fa112c3ba39e4ea200614f58dfb3eb7b836f0bec1ddd438d1422450ae7ded1df9d71e5d9bc8fa3b6e6f78446ce7c79d0bcfb1c2d26c6fece68682dffc60a9c6e0ad05f2a09f21d7523251cb0c3d08efbbf8ac16339d717024d676024c1ee3c1f62c5aeab7fff937c57454df7bd96f9844a2a399958418aaa6f1848bebf7bf1292c24eb5cd8ea56340c5beb2688024a6953275be6efd1b71ba8be6eb77f0c65a7c5111b96c4c1f39cb7aaf83fdaae8d148d7a8af40ae9e651919f7ce28c8b2b6e45e4d3d56fdd54d00c2412790cbd6f80e10819e0b8f37c84fa004988adafccbbc21c63d6bf2e732d9dd63bd49b0412b9674e1e88f6142f7f867f1f26891b22430423cec4db91b61c2abc5c8fbd46b8b93596fc5160683136e21129822796eb5ea088e0a7d8121b25572e3ec37743d1ff6d8d1c3536439a10e84a665f2c75ee73cdc6ffac4cc28724469f7970b47507df3e1b14d477aec2bb20", "signed": "60e4d23f1f08fce466c9915dded93256b52b327e5f81fbb31d1d10d321c390366ef001fd759aa9d0a55162d5364d918b48c7327e77cf5358bc4319e325cdd6086b67c795d66fac7bac8442a6c0992cb5758843b3e3939e3c276c6e9008da82007677bf9e67e9ac5a1a0f486beac0d856191fae25a127392bed469bc78deb0c4b893f67f1716d83509077e4a1bfd4136d03152dcc3b76d9524940a6064c669fbf51f6b91034b6d5f2898678a13a2470f6641ec802457c0102c3ebf6345c327e741b80644b3a99bf72b59ab8016f35d25188a085750dc060e5a8d524ae213f078f288c7b34bc41f3ce356bf2dafdd2e0db4fb8d7c2c319f9906005971702e49ca62e8050540d4121d242f2eeab1bd134e60bf11b3ec71f7765a97c0e098455e59d2235d6b37e7c9f5b21fa112c3ba39e4ea200614f58dfb3eb7b836f0bec1ddd438d1422450ae7ded1df9d71e5d9bc8fa3b6e6f78446ce7c79d0bcfb1c2d26c6fece68682dffc60a9c6e0ad05f2a09f21d7523251cb0c3d08efbbf8ac16339d717024d676024c1ee3c1f62c5aeab7fff937c57454df7bd96f9844a2a399958418aaa6f1848bebf7bf1292c24eb5cd8ea56340c5beb2688024a6953275be6efd1b71ba8be6eb77f0c65a7c5111b96c4c1f39cb7aaf83fdaae8d148d7a8af40ae9e651919f7ce28c8b2b6e45e4d3d56fdd54d00c2412790cbd6f80e10819e0b8f37c84fa004988adafccbbc21c63d6bf2e732d9dd63bd49b0412b9674e1e88f6142f7f867f1f26891b22430423cec4db91b61c2abc5c8fbd46b8b93596fc5160683136e21129822796eb5ea088e0a7d8121b25572e3ec37743d1ff6d8d1c3536439a10e84a665f2c75ee73cdc6ffac4cc28724469f7970b47507df3e1b14d477aec2bb20", "signature": "60e4d23f1f08fce466c9915dded93256b52b327e5f81fbb31d1d10d321c390366ef001fd759aa9d0a55162d5364d918b48c7327e77cf5358bc4319e325cdd608" }, { "secret_key": "e136f398a605d13457848cead07c7286f42e2f28df8c128a3d0bb72b29aacc19", "public_key": "6aa5045a66f772a571fe3e42d117efcdf6c49591996186012fa98f7c48e0cda7", "message": "d328579de4c5372f3b382c48011b2d4c6029f904f3a33e07d083d7e2b03756af2c4c97a2d66c10ec4154d874792042b646e4aae5101d501bd1bf6f511751d0aaf821cd7c0b3ee6d0d7c690a2777fe16bdc7e49b7da4bbb4cce3b618ee9b6f2e3a19240cdb70733b984b1c940ec66960b728cbb874b80643123722db9dbbe88322008931b1c894ef5d21099e63e7c65007acd61784db4994a2fb40c3efe9c47fad63763dde06fa017a26b82e71b9daabc4ff0f6c79b8ca7ccb4dc2031bef1087367c7086974a00566de41a71e11d993abe433569892b8f75d7637993245c884478abe3f95f44b0a4bbedefef8906b75e0d34020ae536455b0e06f9bfee11ec9b8604bac2cc6ebe08c8fd5f5cccccbc1617b7cf69a3c512e1f0bdb585df5e12743061f7c2053bc37144361c0b35fd39d56b1efaf92c610360193ec20598b82858050a6d99e082bcefdbd5318ee5efb3b260f3276f3c73f9c24ce0cda33c7acc50ca5dd61bdb85d793825f6732a6e330ce672ac44fe6b2b9afe6e2e965c02d2a1fe0b57cb1b317c1d313efdc356492fe896fd149dae51c95ccdbb7d11f7d610e0c6e2fd3e57fcfef1c57c7119a0af6c7821fecdb89d80302b49fad41743f3d2d7a075154b3143e51aeb947d4b5e8b7e4ca86fec3e80bd9a786e4e46ed1e6e9f7e0b635266d9fa097aa9e20f32e3d2772d7c1f008bcdd3f92c7283c57790c3622cbad3ca35803c45c869dc377ff36bd7c0e6f1bb892f7329a6e08df1dbebc81dc7b115f852e36ae5d928725fa7c6fb9f28b0fb394f9e38fd87625c5fa23aaba47054e8cfea", "signed": "75a45c6b9566899829b41ee517b7045a473a4f7a2641439b5d7c5673e00d8f5c066f1291f85deada0502bd16e9709f827d4751f2873862e8219e57746a19a900d328579de4c5372f3b382c48011b2d4c6029f904f3a33e07d083d7e2b03756af2c4c97a2d66c10ec4154d874792042b646e4aae5101d501bd1bf6f511751d0aaf821cd7c0b3ee6d0d7c690a2777fe16bdc7e49b7da4bbb4cce3b618ee9b6f2e3a19240cdb70733b984b1c940ec66960b728cbb874b80643123722db9dbbe88322008931b1c894ef5d21099e63e7c65007acd61784db4994a2fb40c3efe9c47fad63763dde06fa017a26b82e71b9daabc4ff0f6c79b8ca7ccb4dc2031bef1087367c7086974a00566de41a71e11d993abe433569892b8f75d7637993245c884478abe3f95f44b0a4bbedefef8906b75e0d34020ae536455b0e06f9bfee11ec9b8604bac2cc6ebe08c8fd5f5cccccbc1617b7cf69a3c512e1f0bdb585df5e12743061f7c2053bc37144361c0b35fd39d56b1efaf92c610360193ec20598b82858050a6d99e082bcefdbd5318ee5efb3b260f3276f3c73f9c24ce0cda33c7acc50ca5dd61bdb85d793825f6732a6e330ce672ac44fe6b2b9afe6e2e965c02d2a1fe0b57cb1b317c1d313efdc356492fe896fd149dae51c95ccdbb7d11f7d610e0c6e2fd3e57fcfef1c57c7119a0af6c7821fecdb89d80302b49fad41743f3d2d7a075154b3143e51aeb947d4b5e8b7e4ca86fec3e80bd9a786e4e46ed1e6e9f7e0b635266d9fa097aa9e20f32e3d2772d7c1f008bcdd3f92c7283c57790c3622cbad3ca35803c45c869dc377ff36bd7c0e6f1bb892f7329a6e08df1dbebc81dc7b115f852e36ae5d928725fa7c6fb9f28b0fb394f9e38fd87625c5fa23aaba47054e8cfea", "signature": "75a45c6b9566899829b41ee517b7045a473a4f7a2641439b5d7c5673e00d8f5c066f1291f85deada0502bd16e9709f827d4751f2873862e8219e57746a19a900" }, { "secret_key": "97b6702e246805dbcfc7fa424a8caabcf262d466a05e0dd2d4e7c374d57d5251", "public_key": "a716c3d5ce78f4d9c5bee3447ddaf4881c986efdf667ac8977b4fb69b5a7110a", "message": "eaa86cf76fcb65c6f9fc208ac36f28b200d3b403aca73207461d8d96afa246d7c69d17a7a9bf77f05543563a7d3eca1d4079e22938aba1f6e9e04b49fbc8ed6f63b599730de9979831c02f8cba61e55560d7110d4c6e61679706a7155d5a673c54d16fe4d228c2eca7546faa1339f26d7a0bb4ee339611afdec9a68f5ff5b5d203b600533ad5a3b368c85da11563f098cc26871e7fa99aefd38cc26151db3b0bae38db6a87b6789e5840b10884af511f3ecb3ecbf94ff86fdb905505a8c34b2aa61ff2ec9ec8febd1dfed0965b6fc5b9f8869dc3a47559974a8822996706daefbc6c5bf984ce06b0d32b31cf9d8ad136aed4b052586dce7073b767b234e4a37bebbc393dd2e0f7d155173548c38a1583ef94e0aa84e7fce04fcc9b4e300ad099449a49232abdcf3d1a6e6fcab696f5996f9bd1b9485d074755ac5b4297fee3124c7c03976a40d570beaec2fac992339f885f74d40ed4ac87a4f40cefbc4864f44c3683aa8f1026e2c37aeffcebfdfe24dd0b019c36a79888203004b2ad83e89221f3f636f455bb64e17d1754c7c6dd7fc09a0d65dddded4622fc4f9fba072b45103435e10220a586f15226d2eb377f4064d3ff37cbb4705a1faaf5b348f8c0ef7fd1564d428688f58f3392967cf396a8ff2fd9e7b517b7d6a5ede7440373d8cc1a839900e84d42254283d9699c7ca37e477692a3494008b80444c5cf614cbbc169bfb9296303c645e2ce28d168dc6cbaefae9c73191f57151aa473009d29e1800b10f4c498609ba11520985c78092058696fdbca9c020e2dfb8a043a3de8e452d58cd1ad", "signed": "90005541dcc1d7ab837f4de5393fadd6a92b26a7d93af3f669e0f1bfd621cbd00c8a23056d2da6786557c828a49be1e4021d99311235ac0d4d56eefc7c953605eaa86cf76fcb65c6f9fc208ac36f28b200d3b403aca73207461d8d96afa246d7c69d17a7a9bf77f05543563a7d3eca1d4079e22938aba1f6e9e04b49fbc8ed6f63b599730de9979831c02f8cba61e55560d7110d4c6e61679706a7155d5a673c54d16fe4d228c2eca7546faa1339f26d7a0bb4ee339611afdec9a68f5ff5b5d203b600533ad5a3b368c85da11563f098cc26871e7fa99aefd38cc26151db3b0bae38db6a87b6789e5840b10884af511f3ecb3ecbf94ff86fdb905505a8c34b2aa61ff2ec9ec8febd1dfed0965b6fc5b9f8869dc3a47559974a8822996706daefbc6c5bf984ce06b0d32b31cf9d8ad136aed4b052586dce7073b767b234e4a37bebbc393dd2e0f7d155173548c38a1583ef94e0aa84e7fce04fcc9b4e300ad099449a49232abdcf3d1a6e6fcab696f5996f9bd1b9485d074755ac5b4297fee3124c7c03976a40d570beaec2fac992339f885f74d40ed4ac87a4f40cefbc4864f44c3683aa8f1026e2c37aeffcebfdfe24dd0b019c36a79888203004b2ad83e89221f3f636f455bb64e17d1754c7c6dd7fc09a0d65dddded4622fc4f9fba072b45103435e10220a586f15226d2eb377f4064d3ff37cbb4705a1faaf5b348f8c0ef7fd1564d428688f58f3392967cf396a8ff2fd9e7b517b7d6a5ede7440373d8cc1a839900e84d42254283d9699c7ca37e477692a3494008b80444c5cf614cbbc169bfb9296303c645e2ce28d168dc6cbaefae9c73191f57151aa473009d29e1800b10f4c498609ba11520985c78092058696fdbca9c020e2dfb8a043a3de8e452d58cd1ad", "signature": "90005541dcc1d7ab837f4de5393fadd6a92b26a7d93af3f669e0f1bfd621cbd00c8a23056d2da6786557c828a49be1e4021d99311235ac0d4d56eefc7c953605" }, { "secret_key": "d1528c1406a6e494a02f635305fa74d745c69327fd31b7d2c2623de2c030ed85", "public_key": "0cfe369cf93daf6d53ef028ddb9f000443b0972fe2532f83a41ce657c1836ca3", "message": "abb3673f3fa17a33a7aff76eac54e7687c04bc84f766651a8b24ba22947908b04ca459feb98ace7cab1e7433a6a6beffd8d9504e2991daa0644d61b8b2e45448f54df8813f50c418b48f49e1034e851cbec3ef0a1850ef726733afaf68e1a461041651c138d54e4ef78187af9a7342f7128727f903bf4fc5ef3e40c64ec26f892f59add98fe394765aaa7d09cae81b9f699a9dd8bf2e2fe8e1ec78fc884eaa0d2dbdbfb8c168833ee0d21803cc35dc628d7c07e04404fb60e8c490a8dd34edbcbaaf80ccdae3f7d3739e0e897023eeb5b1a8c00a9673c59258240ddd4420650fe5771f7e28cb2399f5e1e02ad0b6432d9b49608fcf0b1c0d7c412a445255b8badc5321c24c1ac92c79a0baccb9deffed02d12f5536cd595dc66083b33a3603a9d16ecea2bf38c4f2aaf570f30d21162b2efd7e4d5ebf1ecae9588eee36dd9d3d8e3be7bc6d4bc2185622f11d1da7c49c93e623ac56fee7e3706db8313cf926be92e5c8a539fd16b0f438da8e51a51f2d27640356124ef7be2f91ffa1796a91b12301934ddef0c7938a7a45f36f53b6322d9c8f9d275e1cd2c0f129f8ab8d74155b5d9e5c15c015b0b00003b2bddfa0bcfcc693a1dfcb4f53daec126d1669f33f39ad05519ef7c5ce40e6f4573c247a32c4a0162831352f6d558ff5836a5317dbc4515b3df269a8ac76d6436f264b64561e7968b5822108487b045c92d6c6142a1c2855b38beebd642565123cc827cb1831199e6f12a7e4236856b94dad738f69d1106e7735d711f7c6a3a3378041fc7a21103bbf866907d4edddafa0e7f1bb5ffd41a60d64", "signed": "b8399bc3326cba0a93a42497168bf57f9106ee43d39bf0fc86685199dc6e0a13b9c724ef17e7882af8c2eb70f6c9e42dfa2fbf0c1cb5002b58f1086619733e02abb3673f3fa17a33a7aff76eac54e7687c04bc84f766651a8b24ba22947908b04ca459feb98ace7cab1e7433a6a6beffd8d9504e2991daa0644d61b8b2e45448f54df8813f50c418b48f49e1034e851cbec3ef0a1850ef726733afaf68e1a461041651c138d54e4ef78187af9a7342f7128727f903bf4fc5ef3e40c64ec26f892f59add98fe394765aaa7d09cae81b9f699a9dd8bf2e2fe8e1ec78fc884eaa0d2dbdbfb8c168833ee0d21803cc35dc628d7c07e04404fb60e8c490a8dd34edbcbaaf80ccdae3f7d3739e0e897023eeb5b1a8c00a9673c59258240ddd4420650fe5771f7e28cb2399f5e1e02ad0b6432d9b49608fcf0b1c0d7c412a445255b8badc5321c24c1ac92c79a0baccb9deffed02d12f5536cd595dc66083b33a3603a9d16ecea2bf38c4f2aaf570f30d21162b2efd7e4d5ebf1ecae9588eee36dd9d3d8e3be7bc6d4bc2185622f11d1da7c49c93e623ac56fee7e3706db8313cf926be92e5c8a539fd16b0f438da8e51a51f2d27640356124ef7be2f91ffa1796a91b12301934ddef0c7938a7a45f36f53b6322d9c8f9d275e1cd2c0f129f8ab8d74155b5d9e5c15c015b0b00003b2bddfa0bcfcc693a1dfcb4f53daec126d1669f33f39ad05519ef7c5ce40e6f4573c247a32c4a0162831352f6d558ff5836a5317dbc4515b3df269a8ac76d6436f264b64561e7968b5822108487b045c92d6c6142a1c2855b38beebd642565123cc827cb1831199e6f12a7e4236856b94dad738f69d1106e7735d711f7c6a3a3378041fc7a21103bbf866907d4edddafa0e7f1bb5ffd41a60d64", "signature": "b8399bc3326cba0a93a42497168bf57f9106ee43d39bf0fc86685199dc6e0a13b9c724ef17e7882af8c2eb70f6c9e42dfa2fbf0c1cb5002b58f1086619733e02" }, { "secret_key": "512340f961f142d1915e85fe4fa0f551f80892e75accce7cd1869e6e2c9e8015", "public_key": "0ca02604fa87e2c20506251f0792cd2125856f0ab16d663f2811963b1f2d8172", "message": "af37b2c7587a8d5bc895cd357746ab03552a0a561a293dc7164e39b6a1333a920bb6daca6006676e99bb7e928f9ea391e54802a8d31596289fb9bfe30000cf52ebf0c124a5895bce3398c1bf5356be82619b8ddc15a77ca922494bdb04f5c2e1b6e8ff77ae749faf2b8a41d822c17c06dfb7a5f9434d8bd715ec8778e80b81d2e8d06298748690c6555283c98bb9b19b9246667bc41046ff98c2c35d161e1f4d69d254ec5a076f25bd5c7e2c98ca3c09d80833962cf9660287884096eb30c46c54174106af4e2979a112f3e8944eaaf7669c40d5afb91a024abbeb14664e308903e4d26d7009446ee2e830ab5eca0dbbc513fb4e04351df2f6741864fb2371b2502be43dc15fc04431fff5eb8d4b68d72462ae322e57ba2d4adddf15a1902c2113aebd3b5d612917c1bb73e708ad5418e7d45e4b7280fc8896ab80853ff5f8e98f26553fc78e30b3b0d727bf6d064a8f32888768c51ebb61b2c600b4028a77060febbb02eb3d201780e74566c86a34031836bce9eada81e5d0f33960cb2df08aff3c974921fc9b7d3aa7c81e9c671ed6d33e7ae5ed03a5417d7e5cd6faac91b54b8f792f48283c60647de3da816ca9756c5bfe1bb8b5979e575401bda34e9cbc4d77e711d6b73b82da19da473b55e8e72d341b2d8503e48609be0fe291444c283669e5deadeaf52aa8ec48da83f5328cc099fb41f82becdd58d04b1d66203d737bed06cf21c97819ac13ed711ca217a57cf7d80ff082aa1a1cf8fea555cd2e47e4ddab5e3f9941ad4f775f49419dcadb5b004b68caf45b27ef49ba14fb52b09f1b185be9f9c7", "signed": "6bb4d975afaef41ea9ef085a68c568a05da37ef21dad464ed86ac0d4080e7d0129fb023131eca5f7adb2586a18be40562fa2764ca807e670a0596a5c547bc001af37b2c7587a8d5bc895cd357746ab03552a0a561a293dc7164e39b6a1333a920bb6daca6006676e99bb7e928f9ea391e54802a8d31596289fb9bfe30000cf52ebf0c124a5895bce3398c1bf5356be82619b8ddc15a77ca922494bdb04f5c2e1b6e8ff77ae749faf2b8a41d822c17c06dfb7a5f9434d8bd715ec8778e80b81d2e8d06298748690c6555283c98bb9b19b9246667bc41046ff98c2c35d161e1f4d69d254ec5a076f25bd5c7e2c98ca3c09d80833962cf9660287884096eb30c46c54174106af4e2979a112f3e8944eaaf7669c40d5afb91a024abbeb14664e308903e4d26d7009446ee2e830ab5eca0dbbc513fb4e04351df2f6741864fb2371b2502be43dc15fc04431fff5eb8d4b68d72462ae322e57ba2d4adddf15a1902c2113aebd3b5d612917c1bb73e708ad5418e7d45e4b7280fc8896ab80853ff5f8e98f26553fc78e30b3b0d727bf6d064a8f32888768c51ebb61b2c600b4028a77060febbb02eb3d201780e74566c86a34031836bce9eada81e5d0f33960cb2df08aff3c974921fc9b7d3aa7c81e9c671ed6d33e7ae5ed03a5417d7e5cd6faac91b54b8f792f48283c60647de3da816ca9756c5bfe1bb8b5979e575401bda34e9cbc4d77e711d6b73b82da19da473b55e8e72d341b2d8503e48609be0fe291444c283669e5deadeaf52aa8ec48da83f5328cc099fb41f82becdd58d04b1d66203d737bed06cf21c97819ac13ed711ca217a57cf7d80ff082aa1a1cf8fea555cd2e47e4ddab5e3f9941ad4f775f49419dcadb5b004b68caf45b27ef49ba14fb52b09f1b185be9f9c7", "signature": "6bb4d975afaef41ea9ef085a68c568a05da37ef21dad464ed86ac0d4080e7d0129fb023131eca5f7adb2586a18be40562fa2764ca807e670a0596a5c547bc001" }, { "secret_key": "b1b636e957574c21a957a45bd195c6f9fe4cc1c57e84134d39b42e1a84329edb", "public_key": "95e77b15dda47caf69b72888dd69961bacbec3bc75353003e8bff0a43ddf4b7a", "message": "e25d329cad8364d2dec24373e92d9d50fc7abe8fdc3d0b4ee57e1cfa5b7cd58c23be918f05179ba841b61e180034ca7e74d49b0a1a2cebb4be65344c913c46d32652336e6bda4efa3f58730d39a633a14ca3d9a62abb0a7398cc29aff916eeea2e7caac80845562f73d4030f9cab0bf1c6407f5401513ef87fe6dc099dbc5dfc3352911c07af6c523bef4cca78379659e8803f585904ee6ef6fde77366d96d2ccf248a5320d9b8298b2a73363879107a02b47f57213a85203abbca5a4195f8af3e3593ed2fa3504bb76a3e1be24b66d355662932cb67dc88503afaf762bff741ba1cace97ac58bafad5d36c3aa02e0cbe20e5f3dc8092c512eaa9c4943474aad41990076721ad3f53fb08ac22982ed9b15c751a9e23382f6a69c72e6e244e0eb681e6dd228d3774fccb37eb6232f825d169a2ac8b7e18a42cdaa4f2cf05890bb0c598cf8c31f829ef8ca2435bdcceb0e6193ada7841ee692f30aedf88b627311b138ac78b3913e06f7c321cafb39d901dfe17430b1a20bc437a555a578fa31e4b6807954456bd4b04d5d887987bdf04e0f14af3141b24c3a7b9ac75aa32e2fcd2171a12609e15e73094fd09221b4d27090e73219b648bcaabf3807c9280b6c4ad750a468be0e1ad3e6e63016cb5cec3aaddc5689c2955a2a8d5b8984d7c44376fdd94d3f5ff1298f78172b565913704e90e5ac038cb1720e19b080f81b53d6a45d4528530711b63dfe1e4781c24d74aeb2bd8a73fd2a993c5b0891392196ac32c523699960d8b23e01664cf9021d93928050caf97fb985554580e33336a4563247df59ef6cae53", "signed": "763c7d0d46878e5c7ecf7104fc1f2230e46178a27c75f196169c0279edb01c28fcde3b0d5b8635cfe339fb232774b2206dab8a460ce417abf490bbfa785c0205e25d329cad8364d2dec24373e92d9d50fc7abe8fdc3d0b4ee57e1cfa5b7cd58c23be918f05179ba841b61e180034ca7e74d49b0a1a2cebb4be65344c913c46d32652336e6bda4efa3f58730d39a633a14ca3d9a62abb0a7398cc29aff916eeea2e7caac80845562f73d4030f9cab0bf1c6407f5401513ef87fe6dc099dbc5dfc3352911c07af6c523bef4cca78379659e8803f585904ee6ef6fde77366d96d2ccf248a5320d9b8298b2a73363879107a02b47f57213a85203abbca5a4195f8af3e3593ed2fa3504bb76a3e1be24b66d355662932cb67dc88503afaf762bff741ba1cace97ac58bafad5d36c3aa02e0cbe20e5f3dc8092c512eaa9c4943474aad41990076721ad3f53fb08ac22982ed9b15c751a9e23382f6a69c72e6e244e0eb681e6dd228d3774fccb37eb6232f825d169a2ac8b7e18a42cdaa4f2cf05890bb0c598cf8c31f829ef8ca2435bdcceb0e6193ada7841ee692f30aedf88b627311b138ac78b3913e06f7c321cafb39d901dfe17430b1a20bc437a555a578fa31e4b6807954456bd4b04d5d887987bdf04e0f14af3141b24c3a7b9ac75aa32e2fcd2171a12609e15e73094fd09221b4d27090e73219b648bcaabf3807c9280b6c4ad750a468be0e1ad3e6e63016cb5cec3aaddc5689c2955a2a8d5b8984d7c44376fdd94d3f5ff1298f78172b565913704e90e5ac038cb1720e19b080f81b53d6a45d4528530711b63dfe1e4781c24d74aeb2bd8a73fd2a993c5b0891392196ac32c523699960d8b23e01664cf9021d93928050caf97fb985554580e33336a4563247df59ef6cae53", "signature": "763c7d0d46878e5c7ecf7104fc1f2230e46178a27c75f196169c0279edb01c28fcde3b0d5b8635cfe339fb232774b2206dab8a460ce417abf490bbfa785c0205" }, { "secret_key": "10ca413d70eb3db6e337f0f11abc075c95859e825f876176076952d2f1888030", "public_key": "5028ba38afecc242635f6e353d5f4afd123f860a0425220e966552a057880823", "message": "ea7faf79f6ff5d78a823a754347134f1b3c3e91ce518fdd633feb4f05d125f05cb54336ef560e92deb685112a5ffcd3dfd3964b2758ce4785f6a34bfeb39784f0aee55955aebd12ddda641d05769f74402f706dad201c44c91081c7d7f65e7aa4246de6dc3ed6496d10f4a412060d493bac9aed5be4f6d74229e3c55eb6876e3bb2ed41fa4504b6670dda8c798f6daa280d1aa72021174f6c01aec49b321d87f53acbcadcc4607d5b1e45d63fc481a6d90576c87c1880b2e8ff3e590a96beee1804768c756beb86bf1de8adc408b1b8d666f74ba28630822f92d18b056ae37ce0293ee61b9e80f33ac269671bd62a4059b24f7c1a440807440d5d538a65458adc8158724b25c12127aa0349e55f6e55bc92078fd1ef274c2aa791905766be394a2628f7bbd1a32da5e487446bbefae88fa6cf3f7b499f131fa19313d13b280adca50f77802d17331b381683b5e7edab99473edd31d77443488214135fd6f26445093e9e2aff7d7e892337fdc8779065d4d97d6d673576794958dbfa6c50b1b13ac39607c1e66ef9629761071155fbca6f36eb02ceeae16367feac07476908c847c9a533ef68c94311fa089ff28fbd87809b0d3876b431d9a18b202f9a4049a0577b8177610dd02e5c520eca955e803c3ad4f50976f7c2ea8aa3ee4836a1985df0a4f16ef46981595419897993560af82651c2b494e680b37802e7537ef68a575c34f8588063ee0197206d9a32bb4890e7c216a4d33feca36b549e532fea68556e7540a4fb169d49fc553b2e6700ae42d9a516e68160acf6b270c77ca5ec26e5ad5dc75c2c393e299", "signed": "6aec02dc6bdfcb67f0efc1fd31e23e69e371ab3802505b3201a95dd525417ed1a128db4e182cb37c28f62806667099a8ad480b0ac9e94c2a7d5a0e96e2a7360dea7faf79f6ff5d78a823a754347134f1b3c3e91ce518fdd633feb4f05d125f05cb54336ef560e92deb685112a5ffcd3dfd3964b2758ce4785f6a34bfeb39784f0aee55955aebd12ddda641d05769f74402f706dad201c44c91081c7d7f65e7aa4246de6dc3ed6496d10f4a412060d493bac9aed5be4f6d74229e3c55eb6876e3bb2ed41fa4504b6670dda8c798f6daa280d1aa72021174f6c01aec49b321d87f53acbcadcc4607d5b1e45d63fc481a6d90576c87c1880b2e8ff3e590a96beee1804768c756beb86bf1de8adc408b1b8d666f74ba28630822f92d18b056ae37ce0293ee61b9e80f33ac269671bd62a4059b24f7c1a440807440d5d538a65458adc8158724b25c12127aa0349e55f6e55bc92078fd1ef274c2aa791905766be394a2628f7bbd1a32da5e487446bbefae88fa6cf3f7b499f131fa19313d13b280adca50f77802d17331b381683b5e7edab99473edd31d77443488214135fd6f26445093e9e2aff7d7e892337fdc8779065d4d97d6d673576794958dbfa6c50b1b13ac39607c1e66ef9629761071155fbca6f36eb02ceeae16367feac07476908c847c9a533ef68c94311fa089ff28fbd87809b0d3876b431d9a18b202f9a4049a0577b8177610dd02e5c520eca955e803c3ad4f50976f7c2ea8aa3ee4836a1985df0a4f16ef46981595419897993560af82651c2b494e680b37802e7537ef68a575c34f8588063ee0197206d9a32bb4890e7c216a4d33feca36b549e532fea68556e7540a4fb169d49fc553b2e6700ae42d9a516e68160acf6b270c77ca5ec26e5ad5dc75c2c393e299", "signature": "6aec02dc6bdfcb67f0efc1fd31e23e69e371ab3802505b3201a95dd525417ed1a128db4e182cb37c28f62806667099a8ad480b0ac9e94c2a7d5a0e96e2a7360d" }, { "secret_key": "1f0a10a2cb111917b9a67a2a1f38fb86f8ed52607d1d653a457d7f4718d9a7de", "public_key": "70c075b2e94c4c02f45e73044f24399741b161feb6f69eab635417282a4a9368", "message": "4f6a434bd5fc77f0f1b7049c91853ccbd89439962a6078a674b867543b6b7d10552ec1758c5283042bd6b4cea88c9520db04746f089cf3a260fb0f33858efd6f680de5b72d9876324ba590299138f85a76f5be0e05e8859c02b23512559c8beafc9cfe901b283e15d16c792eb03b92880f6ff97aa38eeead3f4fd6c0a9214323aa39a1c16515e30dbd08b833ee40a814a28809c870e1d0a62c37932d5408fc6afc63e79a655c5fe3d4026ef09e0299fbde5ab34fceab14130dc4be007e8e6444d7aaaec62c873df77e8010743c31e8757f1eae9edb5597a1b5d84bd77ae7642e1aca99873a152ffde068a8e4ad9240b903332795e40bb32865e5ce034307a6c9fe339a1c93770df5ca46329f6b09419785cbf2847b0c6832837123853ad952653265c5b5740d194e00f23f9e966791f005f8bf55c388c2be9e21538925f8555e0dbd83be073df765af4940e59a3790b9836bab7909e5676fbf1c2126fe226d781a44330cc01d32830ff8ae00b9792e398c2cbb4fb83a1005c245549a89063fbe06c62a48dac43c5101249994e95e37f24c1d8b3bc673538c46055f800db1c0f956869b6b297d990f44f05b50c7ad6b856f46212858471dd0d39372b0db751573ddb6b5b56ba01e371c78fe58dcd1be53112a6a73da9a6bac75d3c39a1a705a36f640fcfad8cd04077594d59685f6e30de71dfd4a44c4e7c04d6ec7c2e8be12785bb05b29b39151d329f587fdc381c2df0cef73fe0e3fd9208d7ccb6e08d02f42d1feed27561d5e323aa148624e552abe87532de15b7f42c22c98e40525b1747cbd758bfb26fd3eed3b", "signed": "a4245aa3395e7bada2bcdf1603147cc5f3f0ba91f40fdad8f6d371c3ebefb4c1501d07875b576f40797806a484c7a3f70569e232b0c99d29ca23a233b68edb0c4f6a434bd5fc77f0f1b7049c91853ccbd89439962a6078a674b867543b6b7d10552ec1758c5283042bd6b4cea88c9520db04746f089cf3a260fb0f33858efd6f680de5b72d9876324ba590299138f85a76f5be0e05e8859c02b23512559c8beafc9cfe901b283e15d16c792eb03b92880f6ff97aa38eeead3f4fd6c0a9214323aa39a1c16515e30dbd08b833ee40a814a28809c870e1d0a62c37932d5408fc6afc63e79a655c5fe3d4026ef09e0299fbde5ab34fceab14130dc4be007e8e6444d7aaaec62c873df77e8010743c31e8757f1eae9edb5597a1b5d84bd77ae7642e1aca99873a152ffde068a8e4ad9240b903332795e40bb32865e5ce034307a6c9fe339a1c93770df5ca46329f6b09419785cbf2847b0c6832837123853ad952653265c5b5740d194e00f23f9e966791f005f8bf55c388c2be9e21538925f8555e0dbd83be073df765af4940e59a3790b9836bab7909e5676fbf1c2126fe226d781a44330cc01d32830ff8ae00b9792e398c2cbb4fb83a1005c245549a89063fbe06c62a48dac43c5101249994e95e37f24c1d8b3bc673538c46055f800db1c0f956869b6b297d990f44f05b50c7ad6b856f46212858471dd0d39372b0db751573ddb6b5b56ba01e371c78fe58dcd1be53112a6a73da9a6bac75d3c39a1a705a36f640fcfad8cd04077594d59685f6e30de71dfd4a44c4e7c04d6ec7c2e8be12785bb05b29b39151d329f587fdc381c2df0cef73fe0e3fd9208d7ccb6e08d02f42d1feed27561d5e323aa148624e552abe87532de15b7f42c22c98e40525b1747cbd758bfb26fd3eed3b", "signature": "a4245aa3395e7bada2bcdf1603147cc5f3f0ba91f40fdad8f6d371c3ebefb4c1501d07875b576f40797806a484c7a3f70569e232b0c99d29ca23a233b68edb0c" }, { "secret_key": "7f05baacf167583cf2fe9562a506991ed987f68ffb71567c7ccce3fcc59b78b0", "public_key": "0dec3952852b96fd75587e97743f9e41c09fbe6ba981bfceb4ebb8892d986a16", "message": "a27d1eab05150920ded1b1c2578af582b294f7837fe4fb1a3169c25efb70634ba66c7e2991b3e75cc5124826a03e057259b5cb706228780cbc8275c339f8340e402a665032a4ab657827b1c3481f7566d369735b82db7628c022b212730db1e47c9b2d9bc4d81b2342d89c6eafc3e0b6de50d484ccef11238c8e2d240dd595dcef8b2fc57b54ff9a8a74111f61f8a652f20ea012c1ade3e280ecde294c0e35717190162ec6a2265e7e6f3f0704cf8ab1a03e5cc953e2926291ccd4b0590d5c20568f94f9ff0fe2ab78cf9ae2c38bcd491e518f23e9b636f880615fc56078e512d7577e09497c1183453d5081fd4737f280ec5e267c4586b78b70fffdfd730d809df560f2e3772191847bbc3f604fb7f8ca49eed318b5e7d1f2b83a10da0c8594b339b6871a5772dd64168ecc27e240a45c76725e7d55bef37e135e3d9e0e34e36c16e34d77459a552f4074d067a31a3ed2a48cdea4895b10bdf1656f4b7a413c6a088c649fc9d7bc56abf64435491214192a6670cb8b9c917f8e1bc7b2cfce78d28fbc3afc2a50e98213e7e026378e4ea711d151adaaa719beb8974656c10ebc7de46b19ec82951ef46a8c68e7f436e1b3ebedb2d09b0575c9914ead2796b53e0061e212994ac5026aea81ec37c81378f4ccfc467700087968597da38fed52fa48093ae4ba1066c31e3c7d8508095bb45c280120f4aa69a24f3efef1f767985aa1a30e140856f76d1520732878487be53f712dbd7d779e315101588fd7dbdb132f92c27575ac1486f176c790661b0148394e92ffa3ae6f8afb2faa2b7f4fbd0ad91e759a702b3c702b4d", "signed": "0deed2df82acf4529c408a02931f676bec5cb7ade84ebdcd578f70f971382cf311bb83097300456a558bc4c09d8983ff13493fd611eb66c043bf019bad6f3302a27d1eab05150920ded1b1c2578af582b294f7837fe4fb1a3169c25efb70634ba66c7e2991b3e75cc5124826a03e057259b5cb706228780cbc8275c339f8340e402a665032a4ab657827b1c3481f7566d369735b82db7628c022b212730db1e47c9b2d9bc4d81b2342d89c6eafc3e0b6de50d484ccef11238c8e2d240dd595dcef8b2fc57b54ff9a8a74111f61f8a652f20ea012c1ade3e280ecde294c0e35717190162ec6a2265e7e6f3f0704cf8ab1a03e5cc953e2926291ccd4b0590d5c20568f94f9ff0fe2ab78cf9ae2c38bcd491e518f23e9b636f880615fc56078e512d7577e09497c1183453d5081fd4737f280ec5e267c4586b78b70fffdfd730d809df560f2e3772191847bbc3f604fb7f8ca49eed318b5e7d1f2b83a10da0c8594b339b6871a5772dd64168ecc27e240a45c76725e7d55bef37e135e3d9e0e34e36c16e34d77459a552f4074d067a31a3ed2a48cdea4895b10bdf1656f4b7a413c6a088c649fc9d7bc56abf64435491214192a6670cb8b9c917f8e1bc7b2cfce78d28fbc3afc2a50e98213e7e026378e4ea711d151adaaa719beb8974656c10ebc7de46b19ec82951ef46a8c68e7f436e1b3ebedb2d09b0575c9914ead2796b53e0061e212994ac5026aea81ec37c81378f4ccfc467700087968597da38fed52fa48093ae4ba1066c31e3c7d8508095bb45c280120f4aa69a24f3efef1f767985aa1a30e140856f76d1520732878487be53f712dbd7d779e315101588fd7dbdb132f92c27575ac1486f176c790661b0148394e92ffa3ae6f8afb2faa2b7f4fbd0ad91e759a702b3c702b4d", "signature": "0deed2df82acf4529c408a02931f676bec5cb7ade84ebdcd578f70f971382cf311bb83097300456a558bc4c09d8983ff13493fd611eb66c043bf019bad6f3302" }, { "secret_key": "d00c216426710d194a3d11cfc90a17a86212e7a0e54baa49b0169e57fff83d61", "public_key": "cfe6ae8903c6c701aa304695c651bfd850331f9ad481633ae370c86d7bd13fb9", "message": "82f97841b3ba22dd9a4450837ea7bf8d27a9731470cabb0c2078034bf24e4c1a6290c03f4002b86fa09f07b5209f1f53d0ecf4d9e9223bec125a954551fe8bff718f5e264868e207f701194e41de39971fd385f49a4b4adda911eba55259fc6836653273f656f4af60b20664956d4f2135d90d09e9037d5366a0253444e022c7212af5fd4fccd74237d2885338e2fd721522de6763c2549028c623b9cf387d234ab5e7fcbe5a47c685b79e75a57b09574082a02221df64a2e841618087e722a21bac1ba4f0d7d87bdc510aaa8fbd10757f6c029ca820371fc74c3bc50bd898c55d8167f73ada377aecc91629d64c360c2c241c5cb42e3a518c5dabf0f418b2a7f3d82eefd92026d31e8b8160358eae821f730ecafe7ace647bff8741de2f6a131d11c969e9787cfe6a2fab37bf8d1c7f4a2f364d2f1a76ef046c1843e63ec00cf7920ffaae561e7370b719fc16fcebca3cfdfaba43f4f090c46f477303a660ee88dd4e89bf14b9f804b6fd495cb1412753474a056a0d8931cd9ccbd64f8fcc7a3123467c5d47f690679e8871288093734fd6a1326038658156413696594c134d73887f34ee67609ae8ffb3266c16d87f15345a476f72950c158796a88bbb444f1aa809cad875b85fb9151a0e2eef2e00e80d6b7a9ba406c0519effdd94126232fdf6f1e7b9bbc0362aa77516fdf939e7906aab01307128cf824c102c09b929c9b2d7af8f85b7d7f9a838b2aed0c697e8bdfee66ee016bb1bf35eff6b2f7ef4b91b1fc04fac9f116e2edff40f95c15b77c31ee522f3937c7fa0047d6225e0c8e55e278c8103911feab2b7f4", "signed": "15c45c194297e887029f49d8bdf9d610dd8c34799e1e9230269e7a58928938cf396a02cd42205490391e1c64353fb06b9f8e9b818a9a361c204a386995bf3b0382f97841b3ba22dd9a4450837ea7bf8d27a9731470cabb0c2078034bf24e4c1a6290c03f4002b86fa09f07b5209f1f53d0ecf4d9e9223bec125a954551fe8bff718f5e264868e207f701194e41de39971fd385f49a4b4adda911eba55259fc6836653273f656f4af60b20664956d4f2135d90d09e9037d5366a0253444e022c7212af5fd4fccd74237d2885338e2fd721522de6763c2549028c623b9cf387d234ab5e7fcbe5a47c685b79e75a57b09574082a02221df64a2e841618087e722a21bac1ba4f0d7d87bdc510aaa8fbd10757f6c029ca820371fc74c3bc50bd898c55d8167f73ada377aecc91629d64c360c2c241c5cb42e3a518c5dabf0f418b2a7f3d82eefd92026d31e8b8160358eae821f730ecafe7ace647bff8741de2f6a131d11c969e9787cfe6a2fab37bf8d1c7f4a2f364d2f1a76ef046c1843e63ec00cf7920ffaae561e7370b719fc16fcebca3cfdfaba43f4f090c46f477303a660ee88dd4e89bf14b9f804b6fd495cb1412753474a056a0d8931cd9ccbd64f8fcc7a3123467c5d47f690679e8871288093734fd6a1326038658156413696594c134d73887f34ee67609ae8ffb3266c16d87f15345a476f72950c158796a88bbb444f1aa809cad875b85fb9151a0e2eef2e00e80d6b7a9ba406c0519effdd94126232fdf6f1e7b9bbc0362aa77516fdf939e7906aab01307128cf824c102c09b929c9b2d7af8f85b7d7f9a838b2aed0c697e8bdfee66ee016bb1bf35eff6b2f7ef4b91b1fc04fac9f116e2edff40f95c15b77c31ee522f3937c7fa0047d6225e0c8e55e278c8103911feab2b7f4", "signature": "15c45c194297e887029f49d8bdf9d610dd8c34799e1e9230269e7a58928938cf396a02cd42205490391e1c64353fb06b9f8e9b818a9a361c204a386995bf3b03" }, { "secret_key": "dd123972e628584acc46293b8e4ce2b2dd469cc4ede14ef39521cf08373585b3", "public_key": "3522f7ae596eedb217035d95395e448dbd6ffbf42585eaeb307026541c78a651", "message": "2b2857f45280173e2e0ef9d594e6083f1dc7a65492975b837def6cadd8c8545031ee9d68369a9393cc7b792feb98040b21f1eb84665f878537ce412e9db680d29fbd8ffc7731eae91a20b47548996204fb06ad740e78f0fc590b6791dc7a0f2659286cc16d02c5117b565836b4b8738cf40e285c69c50e412911292367352dfdaed9982d0f899a23c0ab51812b3ec678f6882ea427cdc93ab4b24824377054aa25d82246653340078cf11d14a51f0e686d7e018b36741668fce7458d169293361dd16b3debbed19e1bef7c36934e20f33a09ad3e82b53ab4e94c255d041898b97737df99584af14e404058d0c93bcae7bbbc06395a2aefbdefa7b2ed17cebd1513fa390fe9a9b0ce68cecc2b9e129b7a29f49b6d18c28bacd3af39dc39ca972f0e0d06855d57c2b5fcac2f79cb8c05799e4f65734668dad6aa7a43a11856e23b1e732d00e5fe3885b7dad42ec18ac8e096a080f7d55070fdcff607bc0b852d8a080d2a7405d59414695f2eb7fb0aca23c8635742f8ae57f13780316e280872374e6929598d028a33c05d831cdabd029493c3cc859fff1a67d56216f02a2295665365887a350a80afaa0c367a74d3701ae88f59d8a9d3a1dce0cfd2eabe2af5065a1c7fca4aadcf8e51e75612a1371b4dc8ffc0c0b9c4fadb2f081e2e032d96818e55737adde3e1ac121f56cc86fb58a0a582692f62ce58acce17aafec7bcb7e44f839258cd4a851fc01344ee9f1bd03eb94344f4778693c171dd2892b2426a8829ab0cfe33a7d4a36eb4017f7fcfd24134ab8a45f23717cd138aa6000172e37b4064dc9b6d1e1ef3af84971d", "signed": "8965a889d54cd8076d35bc2e12b009d56b0704c894f912a0d1d30720c232fe4404bf3009541e8f3283e89ea86f678afbdf1c21c924b23a52b4ca6d63f48fc2032b2857f45280173e2e0ef9d594e6083f1dc7a65492975b837def6cadd8c8545031ee9d68369a9393cc7b792feb98040b21f1eb84665f878537ce412e9db680d29fbd8ffc7731eae91a20b47548996204fb06ad740e78f0fc590b6791dc7a0f2659286cc16d02c5117b565836b4b8738cf40e285c69c50e412911292367352dfdaed9982d0f899a23c0ab51812b3ec678f6882ea427cdc93ab4b24824377054aa25d82246653340078cf11d14a51f0e686d7e018b36741668fce7458d169293361dd16b3debbed19e1bef7c36934e20f33a09ad3e82b53ab4e94c255d041898b97737df99584af14e404058d0c93bcae7bbbc06395a2aefbdefa7b2ed17cebd1513fa390fe9a9b0ce68cecc2b9e129b7a29f49b6d18c28bacd3af39dc39ca972f0e0d06855d57c2b5fcac2f79cb8c05799e4f65734668dad6aa7a43a11856e23b1e732d00e5fe3885b7dad42ec18ac8e096a080f7d55070fdcff607bc0b852d8a080d2a7405d59414695f2eb7fb0aca23c8635742f8ae57f13780316e280872374e6929598d028a33c05d831cdabd029493c3cc859fff1a67d56216f02a2295665365887a350a80afaa0c367a74d3701ae88f59d8a9d3a1dce0cfd2eabe2af5065a1c7fca4aadcf8e51e75612a1371b4dc8ffc0c0b9c4fadb2f081e2e032d96818e55737adde3e1ac121f56cc86fb58a0a582692f62ce58acce17aafec7bcb7e44f839258cd4a851fc01344ee9f1bd03eb94344f4778693c171dd2892b2426a8829ab0cfe33a7d4a36eb4017f7fcfd24134ab8a45f23717cd138aa6000172e37b4064dc9b6d1e1ef3af84971d", "signature": "8965a889d54cd8076d35bc2e12b009d56b0704c894f912a0d1d30720c232fe4404bf3009541e8f3283e89ea86f678afbdf1c21c924b23a52b4ca6d63f48fc203" }, { "secret_key": "3335ea928117cfeefbeeae146003881bdc8889d6580eed1352370820ad1f584f", "public_key": "cb20d4fd7561848013111c3e97617f34181d2e7fbcf1bb2a2cd2e8c1775b8b03", "message": "0fa7f6a6fca981429b572a6704871bed140dab93ee1992006e9a3bb2e6cc9a09d4c9cf17066b32ff7ef5b6b2e7911178ed7462c4c175603171ca613668b3be193d94c3521e588913b5948b550be99d82d966197d710acfd95914cf3e197536e83e68230dc3d67e67dcdbdee04f0d9c480237ecd28f74338db5f3f697d3d07ff33613bbce542acc9a7fed5d12490b9bfe1d109540f863800dd356da841a45a3cd8a08a945bfa3aa98e1712312c4c0f0d9dd64f6efcf736bd97deafca9dcaa3f06d87f2ed72aeb6a94f3280000c4bf728a01c1862dafd9fc5c7d5a46ec7d3a87af59a11d87f7ff84407d37010e1d946cf225d6b3b1edee2e8bbf1e079e47fb1f66669394fbf2fa68fc56fc89820a6809c251dd62f5b865c547b14fbd3a19504244ffbc7e5240f88d4360f9cacaaf5f82433d3344fcaee0acdeb7beb9c0b3c769eac920ef4f09abc2a2095512045943eccc53b1c03ed24e567f3d7a71977cab9840ce898ee58ed5c73f6adea823394c5c8e3658a6bf5acbbf0055992c312c26c79c5cfbea3860b8764a6d8ffe4491f8a5b8a215e0117a9a68164aee25f8c0bb381195b2400bcb4644ebce1cde5a9a26582cab9dc7f43c33eae350db65aa7dd22a079bdddcf56d848deb0cfa50b3bd732d9da9e8d8ab79e93469de5802b6dff5ac2aa8482bb0b036d8f9d595b8ead94bb8d7418e2ea43192efcbfc05c467bde0a868a516a7c14a889b72c5b73e7d85c2bae902e4e68d1f3ceab2b2773af5bbaee6a00d08063e7833cd4e295347e58f5d1b3397f640c159cc60a674a227b4cd8c10f1dbaed516ccacdd295f11b08147", "signed": "f7c39f9247d22f018999247f0e0005cd63076ccf2fee4163421f86407a41698c405816647351c04e93b54415b62fc03fc8c25e20f7541dab03197dc900b29c0c0fa7f6a6fca981429b572a6704871bed140dab93ee1992006e9a3bb2e6cc9a09d4c9cf17066b32ff7ef5b6b2e7911178ed7462c4c175603171ca613668b3be193d94c3521e588913b5948b550be99d82d966197d710acfd95914cf3e197536e83e68230dc3d67e67dcdbdee04f0d9c480237ecd28f74338db5f3f697d3d07ff33613bbce542acc9a7fed5d12490b9bfe1d109540f863800dd356da841a45a3cd8a08a945bfa3aa98e1712312c4c0f0d9dd64f6efcf736bd97deafca9dcaa3f06d87f2ed72aeb6a94f3280000c4bf728a01c1862dafd9fc5c7d5a46ec7d3a87af59a11d87f7ff84407d37010e1d946cf225d6b3b1edee2e8bbf1e079e47fb1f66669394fbf2fa68fc56fc89820a6809c251dd62f5b865c547b14fbd3a19504244ffbc7e5240f88d4360f9cacaaf5f82433d3344fcaee0acdeb7beb9c0b3c769eac920ef4f09abc2a2095512045943eccc53b1c03ed24e567f3d7a71977cab9840ce898ee58ed5c73f6adea823394c5c8e3658a6bf5acbbf0055992c312c26c79c5cfbea3860b8764a6d8ffe4491f8a5b8a215e0117a9a68164aee25f8c0bb381195b2400bcb4644ebce1cde5a9a26582cab9dc7f43c33eae350db65aa7dd22a079bdddcf56d848deb0cfa50b3bd732d9da9e8d8ab79e93469de5802b6dff5ac2aa8482bb0b036d8f9d595b8ead94bb8d7418e2ea43192efcbfc05c467bde0a868a516a7c14a889b72c5b73e7d85c2bae902e4e68d1f3ceab2b2773af5bbaee6a00d08063e7833cd4e295347e58f5d1b3397f640c159cc60a674a227b4cd8c10f1dbaed516ccacdd295f11b08147", "signature": "f7c39f9247d22f018999247f0e0005cd63076ccf2fee4163421f86407a41698c405816647351c04e93b54415b62fc03fc8c25e20f7541dab03197dc900b29c0c" }, { "secret_key": "32a1883eff57a3a7ecdb310221ee83c4de92b722159613ecf816e382437b60b9", "public_key": "82dd1a03e5852062ba4a8b6b3b93c5e9c43ff6995bd2aac72606fac85802c682", "message": "ed2b123b5dd7f5e718e026c79cfa6111924902d189a406ef2b2e56a9ee5573a76ddd1d0629ebcdecf2aaa74e84fcd0208f14eea2e171e7c8608b818feff4dbea52db354227d023250b1f01cb4cc8c52132a98d4acf55a54fee81e094aed66fa0d6b6a200b6b87414402278538b90529a8c603d927eddda97bc4b8cb95d04b5337fa22ceafc8b340c46fef67198d1fd98d89c65cd089e23f53dbdca967798b5cd923205ad511edf706f1225f4648c985e009ef8a2f6a0117cdbe14e75312d8ac1f03d046b37cdee7d69c0f25ccf18145a688a8b3ca8875fe8d90baf86d43969e4d610214f1ac5dbba87a1ef10377e40d7806fd9d23457fc9df29899239fd1d278849681a943ad9c91fd1bbd92b73cb177a878f9059ee07af7a8731613e33d59df3d97796079d5631ed85eb2245106a5ff6a2bca40df5c6e87473b2c08c2212f56fc2933a969a3c958d37c5343ba2760c813a7a5165d231c5feaae62b755df49feca80041a6535f7e03bc48e5f27f9be26ef53673eb7c37a2b64744a6cf17e887734ae010bf40eea03cda212f512fba0585947179640bcc4544b8deb4ead129bc3322800adf98818f99574befd9b0016d4eec81a8e78dc3a2af13cab01649ae2e33d516b9d4208ad6613d8e278c393baa882340ef461ff4f94423d55cf3cedd2a6b56e88365531dd29d68273adbfe369402e6a7cee053da1f100540091a00929252983449024b1c3391110650082f0e7dfddb8edc2042f3c1713c6944ba514ee7407d32bf06c858efec42a78bee97746e5b4879141a13d9fc5cb123b783273b84d57ad3526b7da3c68b839efd23f5f", "signed": "8309cbe72f804bd9521def5dad4d8bc13886b1d4f662c9bb5b97ba4790f44b801f3195ead0d4ddb660818ecbf9a683cacf85f1dcc9e82c09116d733658091a00ed2b123b5dd7f5e718e026c79cfa6111924902d189a406ef2b2e56a9ee5573a76ddd1d0629ebcdecf2aaa74e84fcd0208f14eea2e171e7c8608b818feff4dbea52db354227d023250b1f01cb4cc8c52132a98d4acf55a54fee81e094aed66fa0d6b6a200b6b87414402278538b90529a8c603d927eddda97bc4b8cb95d04b5337fa22ceafc8b340c46fef67198d1fd98d89c65cd089e23f53dbdca967798b5cd923205ad511edf706f1225f4648c985e009ef8a2f6a0117cdbe14e75312d8ac1f03d046b37cdee7d69c0f25ccf18145a688a8b3ca8875fe8d90baf86d43969e4d610214f1ac5dbba87a1ef10377e40d7806fd9d23457fc9df29899239fd1d278849681a943ad9c91fd1bbd92b73cb177a878f9059ee07af7a8731613e33d59df3d97796079d5631ed85eb2245106a5ff6a2bca40df5c6e87473b2c08c2212f56fc2933a969a3c958d37c5343ba2760c813a7a5165d231c5feaae62b755df49feca80041a6535f7e03bc48e5f27f9be26ef53673eb7c37a2b64744a6cf17e887734ae010bf40eea03cda212f512fba0585947179640bcc4544b8deb4ead129bc3322800adf98818f99574befd9b0016d4eec81a8e78dc3a2af13cab01649ae2e33d516b9d4208ad6613d8e278c393baa882340ef461ff4f94423d55cf3cedd2a6b56e88365531dd29d68273adbfe369402e6a7cee053da1f100540091a00929252983449024b1c3391110650082f0e7dfddb8edc2042f3c1713c6944ba514ee7407d32bf06c858efec42a78bee97746e5b4879141a13d9fc5cb123b783273b84d57ad3526b7da3c68b839efd23f5f", "signature": "8309cbe72f804bd9521def5dad4d8bc13886b1d4f662c9bb5b97ba4790f44b801f3195ead0d4ddb660818ecbf9a683cacf85f1dcc9e82c09116d733658091a00" }, { "secret_key": "22ecef6dabe58c0669b804664973e457c05e4777f781c52522af76b95481a914", "public_key": "d4784010ef0403eddc5a62d5d45bb243b80b4b9d69c39ca387c6f5cba028640f", "message": "c535c13d779fc0985973d6bcd552d81734e92bdf10994b00cd4d53ce365fad8c7cfa96206adb62d4567be5e46631323853e38ce4bdc16d7b8f632a3ad9e02619eff37174eac3f0bf2f7a7517d4b82de6aa1af0063819d5e1f9278fb4f24c8cc002afb15f334c04fadb00303013c01667f4932a6c4b97d39cd4a4598506c0bd740ea9f11696357d7d17fe4d75f9d74241a7af71f9d869ef6cd695687c03fc34ad65a68a4888a1a74126cb55cf7da9cb4a6717f6eb88484089d2c5189ae381f25e7b3bc3b23d0c9d9f9cdbbeecfd1e72a05e67bb483a9764d9fc75ad69e4ab1270fb40f3958fea4da559b43980b24681313e8591e68546a3bf76ee34b339709295a8d46fb2432dda2f221812df692895e67cb29cbf6ff4502b439a4e9e43639ec067bc90ae814a293a7bd46968e656787642300a0ff2697e3313f6a418d3d12a5f7c51a4c57b63385f2d2a21d5d1d763fc8d1b93c13435f9e47ee7a425980a6ae6f1a9d007607476783c6d0c7887380f868c65b382d4cc8c04478bbd79a1d9a964b78171d6bcf0b8eec50a06a4ea234d1c23465d3e75b88bc540dade74ed42675b07f7cf078211e907f86d0dc4b978623d9f08738af928695e542ec2980e55a1de49e25247fa0a09678118e3930bc4d24b3214d6dcfb6ebdf4906c928deb37bb9ba29c8de1bb9418db718b2853ba57ad8cae4677addfd18b6c7e8c242621b35c7f0efe8dd5eb26ff75fd5748b1d783f6d68a7d9d56da2c1a978ac25f84fbb2be5568d91e70938221c102aee60409bcbec0c82e12ddb425eeb6ecd11551ecd1d33ddae871ae0c8f24d0d18018732b5e0e", "signed": "5d0d2af678b3d1b677516d08a79aafd36ec67c14caf5bcdaaeaacc51a14fb805cf2904e8721db271b20df709bee1a4fbfe62565073b2a7e942724461f927930dc535c13d779fc0985973d6bcd552d81734e92bdf10994b00cd4d53ce365fad8c7cfa96206adb62d4567be5e46631323853e38ce4bdc16d7b8f632a3ad9e02619eff37174eac3f0bf2f7a7517d4b82de6aa1af0063819d5e1f9278fb4f24c8cc002afb15f334c04fadb00303013c01667f4932a6c4b97d39cd4a4598506c0bd740ea9f11696357d7d17fe4d75f9d74241a7af71f9d869ef6cd695687c03fc34ad65a68a4888a1a74126cb55cf7da9cb4a6717f6eb88484089d2c5189ae381f25e7b3bc3b23d0c9d9f9cdbbeecfd1e72a05e67bb483a9764d9fc75ad69e4ab1270fb40f3958fea4da559b43980b24681313e8591e68546a3bf76ee34b339709295a8d46fb2432dda2f221812df692895e67cb29cbf6ff4502b439a4e9e43639ec067bc90ae814a293a7bd46968e656787642300a0ff2697e3313f6a418d3d12a5f7c51a4c57b63385f2d2a21d5d1d763fc8d1b93c13435f9e47ee7a425980a6ae6f1a9d007607476783c6d0c7887380f868c65b382d4cc8c04478bbd79a1d9a964b78171d6bcf0b8eec50a06a4ea234d1c23465d3e75b88bc540dade74ed42675b07f7cf078211e907f86d0dc4b978623d9f08738af928695e542ec2980e55a1de49e25247fa0a09678118e3930bc4d24b3214d6dcfb6ebdf4906c928deb37bb9ba29c8de1bb9418db718b2853ba57ad8cae4677addfd18b6c7e8c242621b35c7f0efe8dd5eb26ff75fd5748b1d783f6d68a7d9d56da2c1a978ac25f84fbb2be5568d91e70938221c102aee60409bcbec0c82e12ddb425eeb6ecd11551ecd1d33ddae871ae0c8f24d0d18018732b5e0e", "signature": "5d0d2af678b3d1b677516d08a79aafd36ec67c14caf5bcdaaeaacc51a14fb805cf2904e8721db271b20df709bee1a4fbfe62565073b2a7e942724461f927930d" }, { "secret_key": "8de86330b256095e1114b6529bedce182c166f67a91539cebc4bec25add7a4a9", "public_key": "33cb054b55bb790ac0f3afdd9a6e7c050efe9006c24f60b8044fd08a5c106c11", "message": "39e61e0eccec929c87b8b22d4fd18aeabf42e9ce7b015f2a8cac92a52448a42fed4cbadc085bbb4c03712ae72cfcb800b978350669b0990084f2dab76eca606d1a49fc55c529e1e7dadf39122dd5bd733893858b0523ef62df4f134cf6c26eed02fdbcb30ce474b1ada3f060769f934bbe686ccebd60883ecec9ce3ffb8ac4a0678cdc5b005ae3dba7e4fe8bc045739957d849f69c1474057b428c5425f3cc2516e8bbe3be81afd4e7b575abe88c87f2f03b56f69f9e3b61b3788120daa495ef0e50eb970a645c13d213c7cfb7d0ad555c920a1e5dbcb46797d939fe0401f547bfd17543221a53010de01f25b64519c8f03963e4b9ca58b0113627c05b9608eeaa7b9ae6305c96188160000ee3a7ade96e0b4bde9d0ed6a0ced765d786840a48175a6e090a38af6adeaa1486a9cb5c8c8c9223ee0ae4c6c02691a3547e32582a5b7059d2ee66fa9cd965615c315b476fd861279cd1dd7607743fc5561296312f11e465ca40bce3cf0b1f1d5a30af6087de4de96ce43965a46c4fcca15f281149b5c1a0c88fdbf27409a134ed4f1fb730fa191816ea784d986cc9ec4b694402de1dcca9ccc64fbd07b07e54e931de827a842460ca0bf6b04ebb571fa77787e3884be22f1e402cf2b8a96a5d39770ec4a843036142a0be970bb1ab165a6374dcf43deb8b9830b2c49db9cdfe4b5242e36f95e0c3e077e8d238fa6a8ac0d586bf61b8248fb3a79a270ab22be8a9da055ff3d5bb2d1ca9bc25f7014b96407719de344c3e73b8c114f792075a5c22fdd416154d3494ec3f02fb112ee5737f70704c1b6b07eacbf94562ca7b90dd84d98c3edf", "signed": "6d01d237dd2bb4188d29bfdec387976a71be7adfbf9e23639b216d0aa0c11932235edccb3b42adcdb6291a0d299aed648de8b1957949b9d1cf2e50493030a40f39e61e0eccec929c87b8b22d4fd18aeabf42e9ce7b015f2a8cac92a52448a42fed4cbadc085bbb4c03712ae72cfcb800b978350669b0990084f2dab76eca606d1a49fc55c529e1e7dadf39122dd5bd733893858b0523ef62df4f134cf6c26eed02fdbcb30ce474b1ada3f060769f934bbe686ccebd60883ecec9ce3ffb8ac4a0678cdc5b005ae3dba7e4fe8bc045739957d849f69c1474057b428c5425f3cc2516e8bbe3be81afd4e7b575abe88c87f2f03b56f69f9e3b61b3788120daa495ef0e50eb970a645c13d213c7cfb7d0ad555c920a1e5dbcb46797d939fe0401f547bfd17543221a53010de01f25b64519c8f03963e4b9ca58b0113627c05b9608eeaa7b9ae6305c96188160000ee3a7ade96e0b4bde9d0ed6a0ced765d786840a48175a6e090a38af6adeaa1486a9cb5c8c8c9223ee0ae4c6c02691a3547e32582a5b7059d2ee66fa9cd965615c315b476fd861279cd1dd7607743fc5561296312f11e465ca40bce3cf0b1f1d5a30af6087de4de96ce43965a46c4fcca15f281149b5c1a0c88fdbf27409a134ed4f1fb730fa191816ea784d986cc9ec4b694402de1dcca9ccc64fbd07b07e54e931de827a842460ca0bf6b04ebb571fa77787e3884be22f1e402cf2b8a96a5d39770ec4a843036142a0be970bb1ab165a6374dcf43deb8b9830b2c49db9cdfe4b5242e36f95e0c3e077e8d238fa6a8ac0d586bf61b8248fb3a79a270ab22be8a9da055ff3d5bb2d1ca9bc25f7014b96407719de344c3e73b8c114f792075a5c22fdd416154d3494ec3f02fb112ee5737f70704c1b6b07eacbf94562ca7b90dd84d98c3edf", "signature": "6d01d237dd2bb4188d29bfdec387976a71be7adfbf9e23639b216d0aa0c11932235edccb3b42adcdb6291a0d299aed648de8b1957949b9d1cf2e50493030a40f" }, { "secret_key": "bab5fa49187da1cab1d291900019e6cbafeccd27bf7ecbf1262a700516e7c29f", "public_key": "f6fb1985ec591f69e3bac807b2eabf263990cdfa09b17809e48e385da065ec21", "message": "5cf8ff587e52cccd2984f34791ee6843e77017c3b55ad45c44450965b75d836e78fbd7a1d1729eff6d6d340a903f3cf17d9e2aecaaff2a321fcdde0abcfbbcbcc09f4086f812c46efb01b78343afbe48309f917478455f32000c6a69f79fe211b99f037f5956d72275a7fe7b45296b5f739aa451ff0575bc705885aa5631b0d0850bc2b12c4192435ae5d2f52bc54386497c4a24b8b6db516be09d8ccf1eca785bde97e9be1ac064f094e2afcc307c0e06b4c564cd9a9a95305b37b81f434611dca55caaa031e88495d5dc5a04ff5fafdf0a82a0c03aff1bfbf4ffebae71824e35e751b09270007669860b580035659e23ace76b3b369fa306f2bed95799fafabc2e69c141beb0bacac7eaa347e77be5af3fcdbe7b364a7f9a66d5e17a07df6202fd98c14bfee2ca6f0745651f0c8550f9ffffcafb96ffb3f103e652e78f53916cd6f1dd05b3fe99b34201b07eac2652f5253571fd3822c695d265c7dfdd6c6b14a80b6e87183e6e032e5f2401cd238cdd3769bb6e390823438f5673ea9a479e5c63fe07a07f4e14f57757c4d7d22b35d71c44eaad4873c8eca6f6b21dcfa95520ff9614abf7a0e1885309f2ced3bcdfc319363a2da46ded79a5cc7b6f69383f94ab35c250629cb915d667b6281186754895803e4b95e7418289a6ac3bcdb6e1e7f6f1dc38e77d281914cc404f97cff14fb2c4fd81412d101c1bfb368ce59311e892a8b9cdca86936f3bca7ec79163eddf1cee68f49f1ebaa27ec50f490d61601ca35f8d6ed266054aeb9b199f933bffd6e0050f261b4e13d5ebfe2caa6557c32ddeaeebc2a11f0aa233240da1c7e40f76", "signed": "e316038d6aa15b1c1b61c1a16b36904fe8a289c8d602becc514d99220086b267859f5bf6e9c0863559ac623a56d7532344e8d2f28b3f9df92089708b1b0590085cf8ff587e52cccd2984f34791ee6843e77017c3b55ad45c44450965b75d836e78fbd7a1d1729eff6d6d340a903f3cf17d9e2aecaaff2a321fcdde0abcfbbcbcc09f4086f812c46efb01b78343afbe48309f917478455f32000c6a69f79fe211b99f037f5956d72275a7fe7b45296b5f739aa451ff0575bc705885aa5631b0d0850bc2b12c4192435ae5d2f52bc54386497c4a24b8b6db516be09d8ccf1eca785bde97e9be1ac064f094e2afcc307c0e06b4c564cd9a9a95305b37b81f434611dca55caaa031e88495d5dc5a04ff5fafdf0a82a0c03aff1bfbf4ffebae71824e35e751b09270007669860b580035659e23ace76b3b369fa306f2bed95799fafabc2e69c141beb0bacac7eaa347e77be5af3fcdbe7b364a7f9a66d5e17a07df6202fd98c14bfee2ca6f0745651f0c8550f9ffffcafb96ffb3f103e652e78f53916cd6f1dd05b3fe99b34201b07eac2652f5253571fd3822c695d265c7dfdd6c6b14a80b6e87183e6e032e5f2401cd238cdd3769bb6e390823438f5673ea9a479e5c63fe07a07f4e14f57757c4d7d22b35d71c44eaad4873c8eca6f6b21dcfa95520ff9614abf7a0e1885309f2ced3bcdfc319363a2da46ded79a5cc7b6f69383f94ab35c250629cb915d667b6281186754895803e4b95e7418289a6ac3bcdb6e1e7f6f1dc38e77d281914cc404f97cff14fb2c4fd81412d101c1bfb368ce59311e892a8b9cdca86936f3bca7ec79163eddf1cee68f49f1ebaa27ec50f490d61601ca35f8d6ed266054aeb9b199f933bffd6e0050f261b4e13d5ebfe2caa6557c32ddeaeebc2a11f0aa233240da1c7e40f76", "signature": "e316038d6aa15b1c1b61c1a16b36904fe8a289c8d602becc514d99220086b267859f5bf6e9c0863559ac623a56d7532344e8d2f28b3f9df92089708b1b059008" }, { "secret_key": "74ca122ab60de50cdc04a8e2eda45d9631061bf187d316be5b7cc06f020c483e", "public_key": "787defd4fb24a399bd2a4e76dff7d603ed0acb3269813e4df690bbf5b2bc696e", "message": "a80b46079fa775f8c1a19fa0829be666bdfdca079cad43d70e0842183bc0db95468a539f0db2aea3ab9c7073b45d228a9bde232897a6eb6fc9edf7365e7101ba97c446a519a3649cf527c8a6de7251b92806815ac2fa0082eff75e2582cbca7e1e4da2a446ea233e7cf7cedfb0e2398eb6e11bbaefe3f7ec89f5d73dd34bd47fbcb4d7b22f2aaee373785651841135cd8661a701b21084a316deac3074e24a2e35a0330f7d1479b932f285277c18a441787224fbbe46c62e834a1851ed237998d48dce20ba114d11e941be29d56d02f7370c8f6d6d7e50248dcd8ec89d3b22f4f58778129fafd4bb92ede17714bf022a5bf92be479f18e63852ecdcf8c4211f530dd30f79cbf4bfa5737f0bad3b0106067f41327c3189e6f206f0d4f3c704bf2bd0b161f018fd21cddfb418bac4d52ef02c41c8792e413b04f0836cea1f86c92e5d5703bee2b5c5899e285992024f64e0d16c60ad0fd92547932d0c5cb98d8da22feebdbba8d1de1e7e9bb219a92eb6c1c698d3b33a37f9b8197d26b550febd2601e7a643ea7e1d9e448ae037f629a306ce417aeb79f2e3ca44d8db3848a811f1846811cbcb874f8af09e0fd0173cf175f304115476bf2c6c2d2f332eba534f46aae801c2692c2d2faddfeacc0f1dace440abc2ae5e5a49d578fd7f9de2a841ad6b6769c32b144ceea16d0f3c0cb3a8ee694c38c28073595096c813762cc2c5ec4b0d8d723dd660853278fc72fd6bd9d1272933dd2a38ed9d04b1390ffe4b294a6fffa721ee3bba33a03a149c4a0345265c01ce015e94db419cff7049852ee000048a85758f6d7b1c59c5089ee018ed09b52", "signed": "bcb4b850696011997eb5dfe143f1a3d5628ef1a5407691ee48c79d69abe4d533f817ad7313b5795e46e595f3ae3a9165b1b6fddae86164ffcba376249837f609a80b46079fa775f8c1a19fa0829be666bdfdca079cad43d70e0842183bc0db95468a539f0db2aea3ab9c7073b45d228a9bde232897a6eb6fc9edf7365e7101ba97c446a519a3649cf527c8a6de7251b92806815ac2fa0082eff75e2582cbca7e1e4da2a446ea233e7cf7cedfb0e2398eb6e11bbaefe3f7ec89f5d73dd34bd47fbcb4d7b22f2aaee373785651841135cd8661a701b21084a316deac3074e24a2e35a0330f7d1479b932f285277c18a441787224fbbe46c62e834a1851ed237998d48dce20ba114d11e941be29d56d02f7370c8f6d6d7e50248dcd8ec89d3b22f4f58778129fafd4bb92ede17714bf022a5bf92be479f18e63852ecdcf8c4211f530dd30f79cbf4bfa5737f0bad3b0106067f41327c3189e6f206f0d4f3c704bf2bd0b161f018fd21cddfb418bac4d52ef02c41c8792e413b04f0836cea1f86c92e5d5703bee2b5c5899e285992024f64e0d16c60ad0fd92547932d0c5cb98d8da22feebdbba8d1de1e7e9bb219a92eb6c1c698d3b33a37f9b8197d26b550febd2601e7a643ea7e1d9e448ae037f629a306ce417aeb79f2e3ca44d8db3848a811f1846811cbcb874f8af09e0fd0173cf175f304115476bf2c6c2d2f332eba534f46aae801c2692c2d2faddfeacc0f1dace440abc2ae5e5a49d578fd7f9de2a841ad6b6769c32b144ceea16d0f3c0cb3a8ee694c38c28073595096c813762cc2c5ec4b0d8d723dd660853278fc72fd6bd9d1272933dd2a38ed9d04b1390ffe4b294a6fffa721ee3bba33a03a149c4a0345265c01ce015e94db419cff7049852ee000048a85758f6d7b1c59c5089ee018ed09b52", "signature": "bcb4b850696011997eb5dfe143f1a3d5628ef1a5407691ee48c79d69abe4d533f817ad7313b5795e46e595f3ae3a9165b1b6fddae86164ffcba376249837f609" }, { "secret_key": "65eea9ffb75612bde1d9ba3ea4fb5eda0aa6f2556ab15bf1817cee3b95bbba12", "public_key": "5b3936dc749b6b9239f15798accafd884c3659ee01b2d17d74fc7da78274e7e6", "message": "c06936323ce3253cac5ab4f6b83270cd4cfe85d0bf8bac1e1b8d5f0b153f541c8e8ed95f28d5c85a2315cd931b7cf3edae50f92830599162804b1363d3ac0da0abd09751023bddc16288944e616d21d91271978bb782d3ebed7fa61284c7490d27593ca8a3d5b475623307010abc1fbf793a816aaab5e0924dec79d60498965cf7f80ab59fc029f782166755b72b869075434ab606cc870a7c0bc8bf29aee033fa9cc122ed7c8e069b547dbae25901b9e249b41fea0bf8daf3826866bcaed2753b5e91ae937e717b508a0acf4c3b061ff0cb9cfd380e2494500951a662fd4928fc5fcaf6c18e84b1d378e49bd9d59686d087ebd552d07fa9ba816fa5402ca9e7252a648d106cfe6c431cc2a053e2294637cdb99d96abe689edabc5ca070f77c1ecd1d52d5385289f17ced768c3971671b9c0b2f855b8461c1e746c7b38f77896b85afbbedd08375fe922984614dd849fe2cb89ae7149dcd1d37f4936e67b1440be72e009398be6f083bf9611480b592fe2f0118e253db5d2e9e4b4541c11da00f7161a736e5f0bb934208e3ef4e0b9a52258203f060d18a195159e5e268aa28053c834f7bd5db9bd71f507d91370b3ffcabbd4acb3071d3f6d52c349acf35095348cebf5a86f8c59ddc965eff610ac425804c0e2f6be42853f5b46434a2c31d9ac99539bfdc04ecf2fefd04598fa63c139ff6c6d88410e73bd328cc4349ab4bb86f2e2ed7c73de96520ef7730ef38345e0f972a84c5388103687e68c50f9d8c9af903bc632d43204062a4f502e214c07059c2cbef72a54110dbf73e425402d17e978ec199b518cec0310bfbf7d9ad300434a4a", "signed": "baa7113155358c924fed57488a6567f8723850a9f5c03a0d7de85fccd8fb4d17d7753523b00c0d8adb884dc0c8a7a44dc2a60083aa5b3c5b94a8d880f2a94d09c06936323ce3253cac5ab4f6b83270cd4cfe85d0bf8bac1e1b8d5f0b153f541c8e8ed95f28d5c85a2315cd931b7cf3edae50f92830599162804b1363d3ac0da0abd09751023bddc16288944e616d21d91271978bb782d3ebed7fa61284c7490d27593ca8a3d5b475623307010abc1fbf793a816aaab5e0924dec79d60498965cf7f80ab59fc029f782166755b72b869075434ab606cc870a7c0bc8bf29aee033fa9cc122ed7c8e069b547dbae25901b9e249b41fea0bf8daf3826866bcaed2753b5e91ae937e717b508a0acf4c3b061ff0cb9cfd380e2494500951a662fd4928fc5fcaf6c18e84b1d378e49bd9d59686d087ebd552d07fa9ba816fa5402ca9e7252a648d106cfe6c431cc2a053e2294637cdb99d96abe689edabc5ca070f77c1ecd1d52d5385289f17ced768c3971671b9c0b2f855b8461c1e746c7b38f77896b85afbbedd08375fe922984614dd849fe2cb89ae7149dcd1d37f4936e67b1440be72e009398be6f083bf9611480b592fe2f0118e253db5d2e9e4b4541c11da00f7161a736e5f0bb934208e3ef4e0b9a52258203f060d18a195159e5e268aa28053c834f7bd5db9bd71f507d91370b3ffcabbd4acb3071d3f6d52c349acf35095348cebf5a86f8c59ddc965eff610ac425804c0e2f6be42853f5b46434a2c31d9ac99539bfdc04ecf2fefd04598fa63c139ff6c6d88410e73bd328cc4349ab4bb86f2e2ed7c73de96520ef7730ef38345e0f972a84c5388103687e68c50f9d8c9af903bc632d43204062a4f502e214c07059c2cbef72a54110dbf73e425402d17e978ec199b518cec0310bfbf7d9ad300434a4a", "signature": "baa7113155358c924fed57488a6567f8723850a9f5c03a0d7de85fccd8fb4d17d7753523b00c0d8adb884dc0c8a7a44dc2a60083aa5b3c5b94a8d880f2a94d09" }, { "secret_key": "08dabd4e5c119ea907ce45f0a7af9e62c0c3f1c9ec61ad10567d79362854c557", "public_key": "945406b85d7b32e0b1ab1200b94222de1aaa68624c60bb4716b0bce9df005771", "message": "6c4719a5a2a6894835c4ac1ed69159e5ebb5692ad8eaada439f79e96684b36cecfb44b89015631663e0644f6c7ab713989d742da27427253318a52432dfab2121d1e9233ead719e2c86a6be07363d002173f205446ca95fc17b24635827fe315f222408e45e833f29ff08ff31dac583a4bec7076d5cc78cfc94451cbf4f7e2fc5b5ed8070f4ef808be1d8a680ecdff59010f39b1de80bef1719f1e218e0ce0a1e393a566c51764d2370d95a61191d8f7af740dc208fa7831b210670512cd73766e609e9b780021ebb20cc8790d8da5f10f5b6a114a1db88f66766501802d9c366ea3fa6f1b1e1e8b0420943413cc6feab28c6b683cd2b333069c8951bc45e8a13bd522578351c882f7c342fe4331b921f533c92ec04a49b292bc569ddcefcab5727f9b5625b167a902dc896d8bc7d8e99920f5db8dd767839c43e3cdf947080dec954214a6fbbe0487a2f32cd17a6b000370bd414484fb73c510ea0124c6cf0fe56c0846a79bfc59779d3b07a1bd2c7fb7e2d0039f0bd21c8a308fb0f58fdbf94efa0857ac3bdddd86d5763e205ee1b221f060cedb8bc05f031b606cc74dadc5db04232748865a73d6ccddb4d5e930d528348c5be9088bfe34458487a67b19a18eca25c0d3fbe2195eb91707b65d9161ea93eddd64a634b23280195fdb0d1388f6998e1858a45b886999b844e6795d83d31837e4411f71699226de1ba0245608000dcf223dd18359b7c6d459a65dbe66c90f5cb8c09122187a3046a16dd179c3f4373e57cf5ee0eab6a212cc9ed8b54bf37f1d27fbd79848e4ec1f567243ab8740a05149d9602eada920a46d610d3cc823b56498", "signed": "33adbfcd4ed4fa67c58b5cb59e16987148697812660b3531ff6a21c749b9601660baeee2489b82b4cde132b6e62f2f90d8f9927860aaad25281d03eb17a9520f6c4719a5a2a6894835c4ac1ed69159e5ebb5692ad8eaada439f79e96684b36cecfb44b89015631663e0644f6c7ab713989d742da27427253318a52432dfab2121d1e9233ead719e2c86a6be07363d002173f205446ca95fc17b24635827fe315f222408e45e833f29ff08ff31dac583a4bec7076d5cc78cfc94451cbf4f7e2fc5b5ed8070f4ef808be1d8a680ecdff59010f39b1de80bef1719f1e218e0ce0a1e393a566c51764d2370d95a61191d8f7af740dc208fa7831b210670512cd73766e609e9b780021ebb20cc8790d8da5f10f5b6a114a1db88f66766501802d9c366ea3fa6f1b1e1e8b0420943413cc6feab28c6b683cd2b333069c8951bc45e8a13bd522578351c882f7c342fe4331b921f533c92ec04a49b292bc569ddcefcab5727f9b5625b167a902dc896d8bc7d8e99920f5db8dd767839c43e3cdf947080dec954214a6fbbe0487a2f32cd17a6b000370bd414484fb73c510ea0124c6cf0fe56c0846a79bfc59779d3b07a1bd2c7fb7e2d0039f0bd21c8a308fb0f58fdbf94efa0857ac3bdddd86d5763e205ee1b221f060cedb8bc05f031b606cc74dadc5db04232748865a73d6ccddb4d5e930d528348c5be9088bfe34458487a67b19a18eca25c0d3fbe2195eb91707b65d9161ea93eddd64a634b23280195fdb0d1388f6998e1858a45b886999b844e6795d83d31837e4411f71699226de1ba0245608000dcf223dd18359b7c6d459a65dbe66c90f5cb8c09122187a3046a16dd179c3f4373e57cf5ee0eab6a212cc9ed8b54bf37f1d27fbd79848e4ec1f567243ab8740a05149d9602eada920a46d610d3cc823b56498", "signature": "33adbfcd4ed4fa67c58b5cb59e16987148697812660b3531ff6a21c749b9601660baeee2489b82b4cde132b6e62f2f90d8f9927860aaad25281d03eb17a9520f" }, { "secret_key": "e0f7d00824c5f3701e5517a4abc13e2f2c0b138c836977843bbd1eeffabd968a", "public_key": "52fddae3e018a68473b3168d0764cfe274dcc834c90a91fb4fe74b939dd238b1", "message": "b39e3ac75a221adcced09a8591ac5e2fe15dfed5b919cbaf14c65eb7cd93086ddee3f7472547e66ddc70062b976297d1a3c170ee525c9c53ba93a4c4fdb23572b7ca6ed13853e70db1d72edeb9944bbc354a520e77ae591f318092efd5e66d9c0981c4a4bda98aa4e59045ff9c4b4ca3acb2ffd893201c70b34a77f24eda54549dc84ad134a35532553815888ae3dd9e241ec4ebbff86f8c1e8adbaac4b91afd18228cbbd5dd805acabf0a1e290ce5dda0251adfb37cb714c139b5a3242d88c64484a37655cc8fcbecffa97fbd14d64d512bf8f6305f89c50922de541692158fb547fd539f1e5877cc649495166332ea2b685cfa3f602019df2ab2c25ed96b68745e9ae89c948da11ad8a830df8b00f2e668192dadf2c5620d35c6e81a2853f841e375a0d9fca2d296efce2ac38d40b030b57560ae6e8341339b3d3c2d061164124319598688fca618fc64c9e8f5f831097a053af19d7dbd61218d926742c2e9a42a79cc1b148912722d8cd5ca793a1ad73b5f141b41809c2fc0530b7630e80390c6b338c71868dacc59bf463ffc489016bf67f9c9d5553c1ede17152813fe0b264b65dca1b2b38e4b809f8c9725ac5b1d8d2e56bec9649fe55c7583ff23b043d6f3768628f1f0516337824a5a56b409520a6a6cb77e4f5fc20b9f6899e00ab22db10d182f09b81e94f3ad568a0b81244df3f1855c6ef222a41a51b62a4649bb82690ab65facac0d81d6fe02601170a8db62cbc5ec9955d7711a1c39656a9f6e1fb6bc183d9bea1503531f17362768bb841f9d21f13a2c991e55dff7f2b336e29eb29507638bdcad7bb31c69e909207ebabcc653ff", "signed": "ccdfe18ad6d0b65d086d632f83cc46ff3b3f2c07bb8e769d0fb4e82df8a3873f9aee35fdd18a5783603180a95c9f74ced9db5146afcfbbdd40df29e04201200cb39e3ac75a221adcced09a8591ac5e2fe15dfed5b919cbaf14c65eb7cd93086ddee3f7472547e66ddc70062b976297d1a3c170ee525c9c53ba93a4c4fdb23572b7ca6ed13853e70db1d72edeb9944bbc354a520e77ae591f318092efd5e66d9c0981c4a4bda98aa4e59045ff9c4b4ca3acb2ffd893201c70b34a77f24eda54549dc84ad134a35532553815888ae3dd9e241ec4ebbff86f8c1e8adbaac4b91afd18228cbbd5dd805acabf0a1e290ce5dda0251adfb37cb714c139b5a3242d88c64484a37655cc8fcbecffa97fbd14d64d512bf8f6305f89c50922de541692158fb547fd539f1e5877cc649495166332ea2b685cfa3f602019df2ab2c25ed96b68745e9ae89c948da11ad8a830df8b00f2e668192dadf2c5620d35c6e81a2853f841e375a0d9fca2d296efce2ac38d40b030b57560ae6e8341339b3d3c2d061164124319598688fca618fc64c9e8f5f831097a053af19d7dbd61218d926742c2e9a42a79cc1b148912722d8cd5ca793a1ad73b5f141b41809c2fc0530b7630e80390c6b338c71868dacc59bf463ffc489016bf67f9c9d5553c1ede17152813fe0b264b65dca1b2b38e4b809f8c9725ac5b1d8d2e56bec9649fe55c7583ff23b043d6f3768628f1f0516337824a5a56b409520a6a6cb77e4f5fc20b9f6899e00ab22db10d182f09b81e94f3ad568a0b81244df3f1855c6ef222a41a51b62a4649bb82690ab65facac0d81d6fe02601170a8db62cbc5ec9955d7711a1c39656a9f6e1fb6bc183d9bea1503531f17362768bb841f9d21f13a2c991e55dff7f2b336e29eb29507638bdcad7bb31c69e909207ebabcc653ff", "signature": "ccdfe18ad6d0b65d086d632f83cc46ff3b3f2c07bb8e769d0fb4e82df8a3873f9aee35fdd18a5783603180a95c9f74ced9db5146afcfbbdd40df29e04201200c" }, { "secret_key": "6acd939e422226cc5443d4aabf58c11af650cb40b9648b4da38b927bff9a58db", "public_key": "4c0b91756b9e206f7863b155ffc5509bb52477ceacd01ca011435153678646cc", "message": "8250d531cf2b66aac2b378d54bc57fd329ad5a414a599255898b3c3b45bf9c0d2c77547566b660eecc76a695a2d608abf11a5f6db3e607fd5a21714b0fad5d814c015ebf48bb73ad75da9c03c4af5489e782b6bf7908a1bd528d7ce788a18ba3528e3537aa7bbf75f6524bbd19a5304ba2a4a3ee58c41fec3132ee6501641215eff746d7800c4d33f52be8357e0ee758041d91cfe43c60c3cedc09b0d46d4cfb9ae2a0239b6f33c6941cff35372670eef5c8859ab65b6e9f7ebce32fa15a9a477aecdc9683a1e33a1edcdc90d420a31e78c153d26020871daa4fff28acc3f11a7206788806b6fa023468ea5a3d186d10f0dd567796663ba37c832fe75aae7dccebf319f93600c46a22f57223812ddd0a68d76baf5e27a9fc8bd68cc10b5b5151d62b41f9348e21b715352f2630b617f813b0c28996285904cf294e9c2856b17ba35f9a82198b8214a035e2896d6568be42392ccef32cd4ebfeebf12be0125206bbe89336d3e762991dfab68fc99dc1649b891383db31fab649e628823f4598cb636a38fe1df73e68d7425fc5d2eb55a0fd1bc9f5ceaabd6dd41f23e4f086c692633dc3c4619a97ab0eada171f84adf20ecc8ecd47c51cca3e59dd809b0aeaa730df94be3bacfd8ee888bba9d570850652cd4d5e6c552a57e9f48a2b06aacdc708d84a376fbc6c94ba6bf64a5f018800a7cc851245aedb20378b329acebb2977c1398082b3a0e5e2a9c2484fa301d3037a8224ddcc095b1dbd8a2315b55bf3318c27810efc3d8e25fa7a8789b73a4f55059080b08abb3699b7b8626cb2a780d97cc1ca8032851baf4ed8b64fc4330865f84ccb12a3dae", "signed": "79995877ed24c791684f2984bdf9609c3f7b576c57d162ee622d4ce8f36d9c5573169d8801216f1c46ffe2f6e2c09048e47d4beb997e9abc4abb129f9b79690a8250d531cf2b66aac2b378d54bc57fd329ad5a414a599255898b3c3b45bf9c0d2c77547566b660eecc76a695a2d608abf11a5f6db3e607fd5a21714b0fad5d814c015ebf48bb73ad75da9c03c4af5489e782b6bf7908a1bd528d7ce788a18ba3528e3537aa7bbf75f6524bbd19a5304ba2a4a3ee58c41fec3132ee6501641215eff746d7800c4d33f52be8357e0ee758041d91cfe43c60c3cedc09b0d46d4cfb9ae2a0239b6f33c6941cff35372670eef5c8859ab65b6e9f7ebce32fa15a9a477aecdc9683a1e33a1edcdc90d420a31e78c153d26020871daa4fff28acc3f11a7206788806b6fa023468ea5a3d186d10f0dd567796663ba37c832fe75aae7dccebf319f93600c46a22f57223812ddd0a68d76baf5e27a9fc8bd68cc10b5b5151d62b41f9348e21b715352f2630b617f813b0c28996285904cf294e9c2856b17ba35f9a82198b8214a035e2896d6568be42392ccef32cd4ebfeebf12be0125206bbe89336d3e762991dfab68fc99dc1649b891383db31fab649e628823f4598cb636a38fe1df73e68d7425fc5d2eb55a0fd1bc9f5ceaabd6dd41f23e4f086c692633dc3c4619a97ab0eada171f84adf20ecc8ecd47c51cca3e59dd809b0aeaa730df94be3bacfd8ee888bba9d570850652cd4d5e6c552a57e9f48a2b06aacdc708d84a376fbc6c94ba6bf64a5f018800a7cc851245aedb20378b329acebb2977c1398082b3a0e5e2a9c2484fa301d3037a8224ddcc095b1dbd8a2315b55bf3318c27810efc3d8e25fa7a8789b73a4f55059080b08abb3699b7b8626cb2a780d97cc1ca8032851baf4ed8b64fc4330865f84ccb12a3dae", "signature": "79995877ed24c791684f2984bdf9609c3f7b576c57d162ee622d4ce8f36d9c5573169d8801216f1c46ffe2f6e2c09048e47d4beb997e9abc4abb129f9b79690a" }, { "secret_key": "4deff647cbc45ecaedc3f7ddf22c167af24e3d63da22b0e6a5b8439c0f3b1934", "public_key": "0c27c9d77ac8c725bb0663933ab30d1aad09cbcf2cd7116c6085a8499f701402", "message": "d6201ebc21cec1e9bc28f957c9d029cc38f9e85e06dfc90bf297e61f2b73b407d982a66b91e94a24e91d06ab8a5c079d0f69be5788ea8feacebd917291192233862e6acda1e8cf9a48bffb5491dd65af541b6c72af681a81823d98a0abeeb6ba9f95465b8411f99e119cd28479da984259bdf86c9fef3cca34e224691f183cf095037727da9cad29f242f83eb4f736e27fdf67018d711b74c45b2955a6a76ec15330df5bad8030c6b3a88d72f28447652ac8902b5b76cbf6b945ceabfec04a9b8cb30f43d9eb773e6705594f0de1b70f1a20c99fc4b1221f8c81b0bc30da12cd5dea8f4d90f13a811a2cc11a96846aafb4c42a00e9ae7da256a0d22b198afc25cc1041d24e056cf387601d7bf7eb3182d605fe5e63b18d531a5f84e5dbd0184a76c6c467a8263a98b5c005fcb2aaf989f5cbd0a9d903fcfc609d6e57d9c439021cea93e4c4e991f193caf3243770b32578748076b7f4cb97f17c17a79b82253c2423db698cd0a33ab33bb09b0b08cb8ceadca1e29c5de2fc12b2407b6cc5af5ae976dd3ec630d8339b7dd11fa34caac150c7c4791d8c427b0ad92e0529067a88d52011e1e0a18299b969896f8b8360f75c45c496da47b09b450f9822bcbcd43f4293c516802bf747c4abeedfaa3e79cb9103d3770f5607b77516e5b1ce0f64b6eec7bec3c647c006956dc55b6c79f6afb39d1fc3ecf11b974b44aedb72aed1316635083c2124502e5c72d86ecab6ac90243eb39a6aa9cb9480da38e1edb8d28ff90924c05d5d21af5af95957b8020781378711a29d0920acad8ccb39a311693278c9900b470da2bd4c12a01d73962644017b6034713b2a", "signed": "dd5489fde4ba87d1173d4cee0682afdd4bad80dd770ea7d0dcebaf21acc61dd6324aca295ed0e23a915ecfdad50f175ebc516f1be5b6d87d90bbe38622495302d6201ebc21cec1e9bc28f957c9d029cc38f9e85e06dfc90bf297e61f2b73b407d982a66b91e94a24e91d06ab8a5c079d0f69be5788ea8feacebd917291192233862e6acda1e8cf9a48bffb5491dd65af541b6c72af681a81823d98a0abeeb6ba9f95465b8411f99e119cd28479da984259bdf86c9fef3cca34e224691f183cf095037727da9cad29f242f83eb4f736e27fdf67018d711b74c45b2955a6a76ec15330df5bad8030c6b3a88d72f28447652ac8902b5b76cbf6b945ceabfec04a9b8cb30f43d9eb773e6705594f0de1b70f1a20c99fc4b1221f8c81b0bc30da12cd5dea8f4d90f13a811a2cc11a96846aafb4c42a00e9ae7da256a0d22b198afc25cc1041d24e056cf387601d7bf7eb3182d605fe5e63b18d531a5f84e5dbd0184a76c6c467a8263a98b5c005fcb2aaf989f5cbd0a9d903fcfc609d6e57d9c439021cea93e4c4e991f193caf3243770b32578748076b7f4cb97f17c17a79b82253c2423db698cd0a33ab33bb09b0b08cb8ceadca1e29c5de2fc12b2407b6cc5af5ae976dd3ec630d8339b7dd11fa34caac150c7c4791d8c427b0ad92e0529067a88d52011e1e0a18299b969896f8b8360f75c45c496da47b09b450f9822bcbcd43f4293c516802bf747c4abeedfaa3e79cb9103d3770f5607b77516e5b1ce0f64b6eec7bec3c647c006956dc55b6c79f6afb39d1fc3ecf11b974b44aedb72aed1316635083c2124502e5c72d86ecab6ac90243eb39a6aa9cb9480da38e1edb8d28ff90924c05d5d21af5af95957b8020781378711a29d0920acad8ccb39a311693278c9900b470da2bd4c12a01d73962644017b6034713b2a", "signature": "dd5489fde4ba87d1173d4cee0682afdd4bad80dd770ea7d0dcebaf21acc61dd6324aca295ed0e23a915ecfdad50f175ebc516f1be5b6d87d90bbe38622495302" }, { "secret_key": "5a19bf6c941f394e93bd3625fb81cd9da81c9020b1c531257a7b5957bb079211", "public_key": "20e8699d087ce5e8151d28053dce66c23f28081f35bd26819bbe85d38a09d702", "message": "f721ca3a32c1e81c9c6f46d5e1fb50e7ce2f4e709333ca2b550d5213b6773d670ca59a2b5086a443843ac50813b244c9c9fac6d119698927813512c84fe30a89553010138f91e8176f5cf25789d7281ddb83a246705dccb999c4cd0ae219c645f6d71d451ae1f8d2f9891af8ccce03f438559fb83667b8077fbe435a744af019d6d1399fd2137f5afb8ef3f47bcf735e7c9ed8a54ba0c1c656b6650bb30adb1d57ecd2074639494231a2e9e2f985ed8422ee03cb3fd738c735a1b82806047460ed84f7468c3c64b35db06bc58de4bba463e638a94133df106ac4f470361ccde44157299d225b17798891baf5921986a2bae326dda0b89617c677bd1408ba2748baa67c8a2c5a969bc00cb40dbf490e07e22c913afdde6304a07fc9e60846992456bfb0663a09def68def67a16d29e98c7b55351848a8cf92310c7463c475f249c6f7557fd0d755ca88f877847fe0765756ac34a23f7840d95c3d294e663bb1518b75927c410757e0f5c07c5a7fb215dc7207433ebf791edfcec90e930f8e3ba9dbbb985413c223be87873bd323997581804d8896da386a6e9120050a0eaed31240aa17c7b6694c30cbcc3c6956a6820fc9ab21875533963dc3b0d88358271276c6056528910dd989ae0c330d1798f7d8e7d1184b84a81434325b8c302edf601dc5e6f847fbacbdeeff78c6621d1dafdc239b18b8c1afdcb4b9dabd5d3a92a932ea1599546e625f96d6ec6fb1cccb76b476b330ac59259c634fac9b3fa7de7ae7053773b5befa001b04929f74b71241e1b257696d65a26c1b4ac86b7b1fbd6957fb9b95084ce7d70090f55d44534694305e91769a82941304", "signed": "2a2fd6054ef4e79b72191a0ccbd2b18aebabe8b9a71861ded98b7cdcb6a6255328bc1aecb0c9335721a9a96ee4b5b43f90d322ecf835f78b264dae6e387bfb04f721ca3a32c1e81c9c6f46d5e1fb50e7ce2f4e709333ca2b550d5213b6773d670ca59a2b5086a443843ac50813b244c9c9fac6d119698927813512c84fe30a89553010138f91e8176f5cf25789d7281ddb83a246705dccb999c4cd0ae219c645f6d71d451ae1f8d2f9891af8ccce03f438559fb83667b8077fbe435a744af019d6d1399fd2137f5afb8ef3f47bcf735e7c9ed8a54ba0c1c656b6650bb30adb1d57ecd2074639494231a2e9e2f985ed8422ee03cb3fd738c735a1b82806047460ed84f7468c3c64b35db06bc58de4bba463e638a94133df106ac4f470361ccde44157299d225b17798891baf5921986a2bae326dda0b89617c677bd1408ba2748baa67c8a2c5a969bc00cb40dbf490e07e22c913afdde6304a07fc9e60846992456bfb0663a09def68def67a16d29e98c7b55351848a8cf92310c7463c475f249c6f7557fd0d755ca88f877847fe0765756ac34a23f7840d95c3d294e663bb1518b75927c410757e0f5c07c5a7fb215dc7207433ebf791edfcec90e930f8e3ba9dbbb985413c223be87873bd323997581804d8896da386a6e9120050a0eaed31240aa17c7b6694c30cbcc3c6956a6820fc9ab21875533963dc3b0d88358271276c6056528910dd989ae0c330d1798f7d8e7d1184b84a81434325b8c302edf601dc5e6f847fbacbdeeff78c6621d1dafdc239b18b8c1afdcb4b9dabd5d3a92a932ea1599546e625f96d6ec6fb1cccb76b476b330ac59259c634fac9b3fa7de7ae7053773b5befa001b04929f74b71241e1b257696d65a26c1b4ac86b7b1fbd6957fb9b95084ce7d70090f55d44534694305e91769a82941304", "signature": "2a2fd6054ef4e79b72191a0ccbd2b18aebabe8b9a71861ded98b7cdcb6a6255328bc1aecb0c9335721a9a96ee4b5b43f90d322ecf835f78b264dae6e387bfb04" }, { "secret_key": "b506c01d69746eb4bc6358720e438ad330c88b605aad652f4799573ab0a1aaf9", "public_key": "7ac8b68863bd69151583789d864a7357e3a045fa86522a9daa6e26fb79ed6d23", "message": "f7fc18066ed04b30e633d9865da3214beca60bd796019cd7ecc91866f9ef2446c1fab06d8651be7f101aec7bb84ee21e71ad020215fcfb36f2d11e4579ac39f8e2b1290e3896d522bcf513aaa06771f86ee228cff3a20a1f10c564339589bba9605344c0a6e682ad5ba40d1041941bc46f98b9d09ca17f8f044e983b8a4908933df2263cf78811c24c8f4814354f6f4c68b7ee7b78308293bf78fd0ff122f095c14a73a59797172ae05cfcec19563eb18d2bc5300ed4bf6bdc443ea9b8bc1cbede94cab905eda5a6a931597de402146fac9cf8cd6a8d104669f913fa834001ca4d090fb7949d3109a63c0549b03f151b7117c4f46974ba59c68296edfdde7692ee432acef7610647e0957865e62c1a0cf05659823a55452dd5e471b31c5a49ab05b5aafd5a0e530e896b58cc522ecf19e52ec82fa147f9e385174c7ec33d1d9b86934aeb4f6c5700f7d5eb33ff73c9fc6aa47df51e09229e6ae894e86c818bef065f825971a4cb90adfefb31ebd9d1b79422dc9868f9f74e7a32cd4071efb69b27233e6e5c60dedcd5321c030a46cd26f5602cac747ee4b522d857a3321a03f403a6006250406361e48815afba77ce08903441845ba87225d8b24046745d4065645a1b98410cac48d137cbbb8ab1eba50da9c231e9acf322a6dbec0ef416a446c3b610d93569fdf45aa6cdc1b640d8f301d78693b2826cc6ed468568ad9a0f94aa9b9fb92f7e78d484fdf5d8d45c991e28074dcdd680d3b1f189ef6bdc320ee6e64dd1f80d9264d83042d2c43d83581ef0394b1b5d1f69f3bbbf04b7c808ba34c1580f16f76537b6a7ebd0a1908be9494d3fcaa9871db15750", "signed": "17a19d2691b7b046d7b19669ad73140db92f0c978c7f61bc3867d92ca9d47580a0380b5901bad82af45f676f74287301980f71871a42261dbe0802950336e60bf7fc18066ed04b30e633d9865da3214beca60bd796019cd7ecc91866f9ef2446c1fab06d8651be7f101aec7bb84ee21e71ad020215fcfb36f2d11e4579ac39f8e2b1290e3896d522bcf513aaa06771f86ee228cff3a20a1f10c564339589bba9605344c0a6e682ad5ba40d1041941bc46f98b9d09ca17f8f044e983b8a4908933df2263cf78811c24c8f4814354f6f4c68b7ee7b78308293bf78fd0ff122f095c14a73a59797172ae05cfcec19563eb18d2bc5300ed4bf6bdc443ea9b8bc1cbede94cab905eda5a6a931597de402146fac9cf8cd6a8d104669f913fa834001ca4d090fb7949d3109a63c0549b03f151b7117c4f46974ba59c68296edfdde7692ee432acef7610647e0957865e62c1a0cf05659823a55452dd5e471b31c5a49ab05b5aafd5a0e530e896b58cc522ecf19e52ec82fa147f9e385174c7ec33d1d9b86934aeb4f6c5700f7d5eb33ff73c9fc6aa47df51e09229e6ae894e86c818bef065f825971a4cb90adfefb31ebd9d1b79422dc9868f9f74e7a32cd4071efb69b27233e6e5c60dedcd5321c030a46cd26f5602cac747ee4b522d857a3321a03f403a6006250406361e48815afba77ce08903441845ba87225d8b24046745d4065645a1b98410cac48d137cbbb8ab1eba50da9c231e9acf322a6dbec0ef416a446c3b610d93569fdf45aa6cdc1b640d8f301d78693b2826cc6ed468568ad9a0f94aa9b9fb92f7e78d484fdf5d8d45c991e28074dcdd680d3b1f189ef6bdc320ee6e64dd1f80d9264d83042d2c43d83581ef0394b1b5d1f69f3bbbf04b7c808ba34c1580f16f76537b6a7ebd0a1908be9494d3fcaa9871db15750", "signature": "17a19d2691b7b046d7b19669ad73140db92f0c978c7f61bc3867d92ca9d47580a0380b5901bad82af45f676f74287301980f71871a42261dbe0802950336e60b" }, { "secret_key": "e1ccb80a262ff8af1eda075c972c8e941e77cef57bdb0a82572c28200b493ca3", "public_key": "3d37e2a5027effdee07fa511e423b2bc56edcea075b41649766725c6b30a10f4", "message": "cfdc5497b023afa62a7fe592caa92b875c7705747834002f7784ff166189398815d4e8a7a0038e1fdadddeba51057327ad1960e859cee56526bbb4127b6a5f90d04d08b15eee66c9ccf88b4b7d1ee9d3b8b8c6f42db3c34e59048a15c6041f142c4079368b7b11e29970118b99e5670ae31fccfdff1399142ee06b2e3e2b3c9707dd64119786e2fab47e0bad2cc8b558d963bb48a49ad2c637dd35b25db54bc5a2630222fa2acece9ce12ab0813077f7659f5074429ca6b494331032ae792a599c425ee297451dcf5ee195290312742e647a7795b84dcc664ddae2a1fbf8c4548a37fd82d810e2145f01df1a6d3bcc42a91a10768e091f3d69329a7bad6c072cac6d89afa31c029056d6b62212165cebcd49ac672e3830267af9f28ea319bd042f6c59de4701e58248736c8d976acf93b99d2f4647a547d392447a48dac11181e16b1501a94c9316e5a67c990b35810b4cda0473a6a4e57614215868e2e002c6058b42e4eeec84139dc19edf5f80aeeffa4f5b07e8fd23139edda31899ebe6fee78643ce686b2963a32072bd3b3bba68485a05c2cc0456c3da50c7c8c651a3066d13a3660bd47ab6dfec49e01557a6742896aa4bc6363a797dbad1a409cd4a50911e70ea007af8e9b1bb7e3ab56215a575c90f739c2d48b3b34694b5acdf07980ae528de0621edfac8b8fa84954d56dbb4d03082b984f13e5dbe9c7112ff9716f55053064662ce0fb81ea35f98fd2cd51137a46f64e0c1caf44e5407dc961760b2597f7f9200617d471340cf15176c3da880fe4e0e93a72fb94926faed865dfdc772e185292c1e36b1211781c3e938e3d4f24e29af517a379683", "signed": "fda34b652b79746f897e222d37b77aa250d02c527c4833df80ea41d52189d50700e128b78ee8149c9b19f3abf755acef5348f5fbaf1ceb41c038906ac5946001cfdc5497b023afa62a7fe592caa92b875c7705747834002f7784ff166189398815d4e8a7a0038e1fdadddeba51057327ad1960e859cee56526bbb4127b6a5f90d04d08b15eee66c9ccf88b4b7d1ee9d3b8b8c6f42db3c34e59048a15c6041f142c4079368b7b11e29970118b99e5670ae31fccfdff1399142ee06b2e3e2b3c9707dd64119786e2fab47e0bad2cc8b558d963bb48a49ad2c637dd35b25db54bc5a2630222fa2acece9ce12ab0813077f7659f5074429ca6b494331032ae792a599c425ee297451dcf5ee195290312742e647a7795b84dcc664ddae2a1fbf8c4548a37fd82d810e2145f01df1a6d3bcc42a91a10768e091f3d69329a7bad6c072cac6d89afa31c029056d6b62212165cebcd49ac672e3830267af9f28ea319bd042f6c59de4701e58248736c8d976acf93b99d2f4647a547d392447a48dac11181e16b1501a94c9316e5a67c990b35810b4cda0473a6a4e57614215868e2e002c6058b42e4eeec84139dc19edf5f80aeeffa4f5b07e8fd23139edda31899ebe6fee78643ce686b2963a32072bd3b3bba68485a05c2cc0456c3da50c7c8c651a3066d13a3660bd47ab6dfec49e01557a6742896aa4bc6363a797dbad1a409cd4a50911e70ea007af8e9b1bb7e3ab56215a575c90f739c2d48b3b34694b5acdf07980ae528de0621edfac8b8fa84954d56dbb4d03082b984f13e5dbe9c7112ff9716f55053064662ce0fb81ea35f98fd2cd51137a46f64e0c1caf44e5407dc961760b2597f7f9200617d471340cf15176c3da880fe4e0e93a72fb94926faed865dfdc772e185292c1e36b1211781c3e938e3d4f24e29af517a379683", "signature": "fda34b652b79746f897e222d37b77aa250d02c527c4833df80ea41d52189d50700e128b78ee8149c9b19f3abf755acef5348f5fbaf1ceb41c038906ac5946001" }, { "secret_key": "4fc512efd86e3a63b395eaff1ba011e1590fb9326ad3ffede7876dcc3e9fabdc", "public_key": "26c2a22f9bfad90606dc613ff107021fcddbec7237066660b488964349e0c828", "message": "07cd1e9bfa38a7d8853465a93c77ab4f30faf914e48bc4763ba07bf96ba808c1f59ad4ce9b7d921fbbc779659d7ca36edb7dd3acf7a29452a845b49fb6543a3b6c5c1c293aff618485a10eea60ee9649ac9d481e6949967d3938b52fe09c36b9ade07581db4eb542a97f5ac8ac73d3eea184722556760cf483090564553061b90a0b6d2dff4707be763937a10594a82b766bb2cf6daa52fa8d7b48f32127c431ad9aaed3bfdeb99ad42118a1b4de7b992134ed9cdad0b5296d197a485e493ecfeca3653ad2ce0f9241aabc096d7c4ba603ba7ddd07a8b257fe523276417073a65fa4434256fd1f239ec1de5da1a0a8c5e686ee14d9dfa438c53b99c954afab2f79e60b7126f2cb58a26e290da1dccfc301f239748ede7bcf1bb7ccb4720e692f57e53e6f59075399e1080ac8aa9a61a568c4c569d36e76a2d7271f2c44de4e363a8c916a4e446b027b64392e90ceabf6b6071bc47a1379b6aa6344763b2a0e7ff7c4a27bff3106721c253e4c1d67c37fa3d7c1ecd055b8e929d52a8e45ed89fb180f74b552fe06f066c7e4318ca2f915946e8320d5806561472fb8ff7fa8072d8e6fd1ce63cf87382f7b9404540c1d406c70b226853677092645ce996922e7345dc07fb7339f9a54ff07352dd2b993063c2c83d1281a4fd178e5a5f80a5b33c229d0578367d44192e9a4d21e9734d3bda083b70f47103fd125177021df3e53d79986efea2dc04f02c0ac278788319ef3a9132e6232ea6db39ca5870855f9592fff6c209ad2f1c29dd168552898979ecff8c81127248f8310515300656129d9b7acbb7ed1e46bc98c04d1a35b18913738e9dde4d2b065f4184242d8", "signed": "82c824a7d1139ec73ae1d023adf62811441e968287f1a580b859cd66cb33b58e409bdeb2a874bf4c23610bd44f693147f2f7c29d443a905084f3eaafd9330e0407cd1e9bfa38a7d8853465a93c77ab4f30faf914e48bc4763ba07bf96ba808c1f59ad4ce9b7d921fbbc779659d7ca36edb7dd3acf7a29452a845b49fb6543a3b6c5c1c293aff618485a10eea60ee9649ac9d481e6949967d3938b52fe09c36b9ade07581db4eb542a97f5ac8ac73d3eea184722556760cf483090564553061b90a0b6d2dff4707be763937a10594a82b766bb2cf6daa52fa8d7b48f32127c431ad9aaed3bfdeb99ad42118a1b4de7b992134ed9cdad0b5296d197a485e493ecfeca3653ad2ce0f9241aabc096d7c4ba603ba7ddd07a8b257fe523276417073a65fa4434256fd1f239ec1de5da1a0a8c5e686ee14d9dfa438c53b99c954afab2f79e60b7126f2cb58a26e290da1dccfc301f239748ede7bcf1bb7ccb4720e692f57e53e6f59075399e1080ac8aa9a61a568c4c569d36e76a2d7271f2c44de4e363a8c916a4e446b027b64392e90ceabf6b6071bc47a1379b6aa6344763b2a0e7ff7c4a27bff3106721c253e4c1d67c37fa3d7c1ecd055b8e929d52a8e45ed89fb180f74b552fe06f066c7e4318ca2f915946e8320d5806561472fb8ff7fa8072d8e6fd1ce63cf87382f7b9404540c1d406c70b226853677092645ce996922e7345dc07fb7339f9a54ff07352dd2b993063c2c83d1281a4fd178e5a5f80a5b33c229d0578367d44192e9a4d21e9734d3bda083b70f47103fd125177021df3e53d79986efea2dc04f02c0ac278788319ef3a9132e6232ea6db39ca5870855f9592fff6c209ad2f1c29dd168552898979ecff8c81127248f8310515300656129d9b7acbb7ed1e46bc98c04d1a35b18913738e9dde4d2b065f4184242d8", "signature": "82c824a7d1139ec73ae1d023adf62811441e968287f1a580b859cd66cb33b58e409bdeb2a874bf4c23610bd44f693147f2f7c29d443a905084f3eaafd9330e04" }, { "secret_key": "0b7dfad05ba665111e1681bdc0bc8ba973767cb85877020a2dbf918325571d9f", "public_key": "9505d9e86dcef56c9db76f2862b90e1f2773202f1750405e7ee5aed0fc54f8b9", "message": "c43fd34bb1424cca4e4dfba75c28be801844446ca089020885c748382547164a9d4a7f9570d3d171ad6981ab50eeee08a4a6c66d7699d23edbe1faaf44660c72f4552d87d265ace8792823474b90a5d7f7401deb9377627f60b036b36e044eb76bf132fddfcc0ef5704a633d845e962b47517f0baa34d3d6e9a8b9f8168bcdc84c6d2b30c6f343e75357f7f2c0039bd254b244d36cd61675581fb834570ed4113a78e606f145a111992c2c6b61c4267628ec87cd88c36a3c84706e44ae96a96e0c8480318546d6ea6a6df18a2b4f19f8360cfbce4e9d1cf1011ffea5633a66619aa4a65cf69be4459617945e4359a9d43260ca1a20f4ed7c1ae5ffff3bd92294ea70abbae0385b0935cd1c0eb5183029c585a0294b7999e32ef7a290fcb095675dc4f601e8f2c96f35b7349a37057509f4ec70c9f50f6011f1f5e6b061c091d11c0ed5dec8ece881aa340508f696d9e9cc7298e6bccd7c210e2ce0ded83592a3cfa13e8078fdb3258b39f1d11cdfe09670c1e60a3910a4fff51c6c7f7d6624f4c93df8888c526f484f9b13e0a7f62964783978684e292679800ed5eb280e287c7e639e85faa53fba2fa2045ce27d8fb308360726550df9752db305f8f06647970d014691999afa97b6193ffcc6d532f4fa69e133a1d10f3047fc00381f4997bb84e5b6cd6028c62132cfc024bfeb980301f29512bbd109d089ace182cf9c2ffab1b17eb00b6eb46ae198da993f5efe7c1dc22d25047c1ee5246517e7f5758f996abd83f13da22c13dd205ee191b55afd4831ef078bb6ea073a625bc97c81296160bbf2559b275cc37ccf01b91fd87d4d99a367aa9978dadd0689f8a6", "signed": "415adbb2f2b9840577fd1841f9aae252afe8f5a72236017d50db22d228cdee9f5b3e8fe9a17a4d4e98b7341381e8d8625cdcea956d253b74e02dacb84920a009c43fd34bb1424cca4e4dfba75c28be801844446ca089020885c748382547164a9d4a7f9570d3d171ad6981ab50eeee08a4a6c66d7699d23edbe1faaf44660c72f4552d87d265ace8792823474b90a5d7f7401deb9377627f60b036b36e044eb76bf132fddfcc0ef5704a633d845e962b47517f0baa34d3d6e9a8b9f8168bcdc84c6d2b30c6f343e75357f7f2c0039bd254b244d36cd61675581fb834570ed4113a78e606f145a111992c2c6b61c4267628ec87cd88c36a3c84706e44ae96a96e0c8480318546d6ea6a6df18a2b4f19f8360cfbce4e9d1cf1011ffea5633a66619aa4a65cf69be4459617945e4359a9d43260ca1a20f4ed7c1ae5ffff3bd92294ea70abbae0385b0935cd1c0eb5183029c585a0294b7999e32ef7a290fcb095675dc4f601e8f2c96f35b7349a37057509f4ec70c9f50f6011f1f5e6b061c091d11c0ed5dec8ece881aa340508f696d9e9cc7298e6bccd7c210e2ce0ded83592a3cfa13e8078fdb3258b39f1d11cdfe09670c1e60a3910a4fff51c6c7f7d6624f4c93df8888c526f484f9b13e0a7f62964783978684e292679800ed5eb280e287c7e639e85faa53fba2fa2045ce27d8fb308360726550df9752db305f8f06647970d014691999afa97b6193ffcc6d532f4fa69e133a1d10f3047fc00381f4997bb84e5b6cd6028c62132cfc024bfeb980301f29512bbd109d089ace182cf9c2ffab1b17eb00b6eb46ae198da993f5efe7c1dc22d25047c1ee5246517e7f5758f996abd83f13da22c13dd205ee191b55afd4831ef078bb6ea073a625bc97c81296160bbf2559b275cc37ccf01b91fd87d4d99a367aa9978dadd0689f8a6", "signature": "415adbb2f2b9840577fd1841f9aae252afe8f5a72236017d50db22d228cdee9f5b3e8fe9a17a4d4e98b7341381e8d8625cdcea956d253b74e02dacb84920a009" }, { "secret_key": "78188df8c754785621e27ae58e100d5080e16e0a15e277051f95f080900ec0d3", "public_key": "a1bdeee98b0757ba9c2d8409b87424e64e42f9932acfa9bc71fb3f8ca0e11d52", "message": "cf70cca57feb1beefe985ad5af9d4348d3a46a63de1075381fb3639a044fd6e6091f5db9c94d39be0f13ade6d9a074e67ba706b3a8806295f6b654865728c58ca6e9419d5d043f2110814bbf36fc4070e4d9454965c251202ca395efe3fdbd544feb187e34ca3c80795179552fce9aa804430e5b6c8685341e91d5889fbf3f981904620ffe7013f53b939e17443d614e7e6bb57ad674f3b4b001630526cf7302a7d0afe7dc24d6dadef6feba3f96973aa5b8d6275262e430a82f678696971a8b60e38d3b2bcc170d5bc20302a39c596d27fee39e5da5b10ea9f382299e19819717a718d37d155f13923182b5b7a1c54ca109b22ca8e8b26ca5ca3f3b9062219461bace97e890c94e41ca3d84587fbdf6e240c35ccab71d58477d28168e93372686d42aad324a3f16afe0e9b89ee20e485fe6c864b5013ba88399eeaa159835a8b2bb2f25f579ca3bae675c63da1b50d99d4ed978692e5600233f38ab7e7a5ae0fbf8c0b69cc38bd30eabd977efa05ee2c83514302bd40c4bdce7a4110afbb6579c620e97f8cf2e9bab2dcc7c33f196e57fe761a050122894b7a75a929531996ddaad78de1d4d924cd93a61df227776bc1c39fbb8de1c4438868b6a3a2cd94c07b29e3f6b23cc7e0b63689009d9d0bae1606bafc7a808f2d2fa2562b8dc093842c01fdb840da4860aced3fc525ca334edcf65948bc416f98c450f0012a6107dd7f8ede40e1c48c9e8a565a810b9cfd20356db19f1dbde598921332e0d813f0cb87684370388772ff3cbfcbfa299c198c97bfb9617768a05161f4169ff5de5d9f40062090fb882984d9d5c7aa78eddcb9634e466b8853d512b4a546d7423", "signed": "b94114eda46ccfc22a4471a64d790892e59c5d505618eb0e701392c709613e2d503a5c2b66601e636a3c1c7d49b1ac798d9089b0f9ccd0579bb90634d0bd750ecf70cca57feb1beefe985ad5af9d4348d3a46a63de1075381fb3639a044fd6e6091f5db9c94d39be0f13ade6d9a074e67ba706b3a8806295f6b654865728c58ca6e9419d5d043f2110814bbf36fc4070e4d9454965c251202ca395efe3fdbd544feb187e34ca3c80795179552fce9aa804430e5b6c8685341e91d5889fbf3f981904620ffe7013f53b939e17443d614e7e6bb57ad674f3b4b001630526cf7302a7d0afe7dc24d6dadef6feba3f96973aa5b8d6275262e430a82f678696971a8b60e38d3b2bcc170d5bc20302a39c596d27fee39e5da5b10ea9f382299e19819717a718d37d155f13923182b5b7a1c54ca109b22ca8e8b26ca5ca3f3b9062219461bace97e890c94e41ca3d84587fbdf6e240c35ccab71d58477d28168e93372686d42aad324a3f16afe0e9b89ee20e485fe6c864b5013ba88399eeaa159835a8b2bb2f25f579ca3bae675c63da1b50d99d4ed978692e5600233f38ab7e7a5ae0fbf8c0b69cc38bd30eabd977efa05ee2c83514302bd40c4bdce7a4110afbb6579c620e97f8cf2e9bab2dcc7c33f196e57fe761a050122894b7a75a929531996ddaad78de1d4d924cd93a61df227776bc1c39fbb8de1c4438868b6a3a2cd94c07b29e3f6b23cc7e0b63689009d9d0bae1606bafc7a808f2d2fa2562b8dc093842c01fdb840da4860aced3fc525ca334edcf65948bc416f98c450f0012a6107dd7f8ede40e1c48c9e8a565a810b9cfd20356db19f1dbde598921332e0d813f0cb87684370388772ff3cbfcbfa299c198c97bfb9617768a05161f4169ff5de5d9f40062090fb882984d9d5c7aa78eddcb9634e466b8853d512b4a546d7423", "signature": "b94114eda46ccfc22a4471a64d790892e59c5d505618eb0e701392c709613e2d503a5c2b66601e636a3c1c7d49b1ac798d9089b0f9ccd0579bb90634d0bd750e" }, { "secret_key": "73cb02b0bf26a015da1dc301fc125d7e6c30b63c9e6eee9e065d4e847132c325", "public_key": "ac9e3dd2ceb9b23e748c04ba7577fedf7ceab9ed87dc430b5fe22eac50950e0d", "message": "0a2b61ba35e96e5819b88bfdb28b7ce02e64ae9cf572b21f13552c0db10f3960d44ba3472f43abc4e6295bdf790bd933ba3975fd4465fa3e2fe2db02b6377752223dec98fcb2404f3aba43265a6fa7976b6c6cb6868b881bd6f3d25cd9d6f70e512f8089c8ef26fd58245053779e59c4725aefa26467c9f500e17f3e1573f1a855e9b8b21925ea0527f3ce8d88fb54a47abeed14f399cc2d9f1fe54665fae0a8f0c68872a600046d1dc36397d310ce393fceafe87c17ebe122fdb543aea71085baec98273f41ac96698c150cf911d0e5de2392d84841d01276aefbfe9995e10a6d46efdc2678d456c9f36b2e10114d1187e7aca739037ea51f85fd62a29429ba529cdd8ad91347497487ed7e8709d4776ef68670792d0615bc96da5178d606db63e4e5cb172acfbc1cbe20269350f1b605f35dcd479135bd30fb4b5a39176cff744ddbb306c9e7b4167de0379a6166be5aaa74d7157fac957d88dc57597cfef23eb5108b3ce53fc632dad1b972a29da5de32d20d8ecede67ff00da4a08a0cc1a98bee7a94e3cb32fee94ae25a413544702c37b3e1778a070cdd4840bd39f5f45795192a867863876ed0d130d46e2913935082809f7e15a496710f255d783da3d016a654c15ff5df907a3ccaf37cfe11c8c3d496507d6760c053820f0f594c3d01ca269178aca525ab2821ef55f92d85fe685ea34472ed1398171064d74a422ec91d1a670618fc9f32424bcb11a77f6fb4e2fefd2c4e8a73c452886e931664d1a83bd927329c04d250b83521d7dc13c91cee1ec050e11d42a4b0c8c069b61c4422d3a49c07eff2905b7bc7f4a5b43e6b0d61dfb50e4eea2e90d298a781d05", "signed": "1a5dd4c891c8e132570187c23b9a1e4b26f05460e875673819396df561c8af0e48333b62c77729d49fc40e174a7f3c21f85ef4d339ceb80bd2e037d803af560e0a2b61ba35e96e5819b88bfdb28b7ce02e64ae9cf572b21f13552c0db10f3960d44ba3472f43abc4e6295bdf790bd933ba3975fd4465fa3e2fe2db02b6377752223dec98fcb2404f3aba43265a6fa7976b6c6cb6868b881bd6f3d25cd9d6f70e512f8089c8ef26fd58245053779e59c4725aefa26467c9f500e17f3e1573f1a855e9b8b21925ea0527f3ce8d88fb54a47abeed14f399cc2d9f1fe54665fae0a8f0c68872a600046d1dc36397d310ce393fceafe87c17ebe122fdb543aea71085baec98273f41ac96698c150cf911d0e5de2392d84841d01276aefbfe9995e10a6d46efdc2678d456c9f36b2e10114d1187e7aca739037ea51f85fd62a29429ba529cdd8ad91347497487ed7e8709d4776ef68670792d0615bc96da5178d606db63e4e5cb172acfbc1cbe20269350f1b605f35dcd479135bd30fb4b5a39176cff744ddbb306c9e7b4167de0379a6166be5aaa74d7157fac957d88dc57597cfef23eb5108b3ce53fc632dad1b972a29da5de32d20d8ecede67ff00da4a08a0cc1a98bee7a94e3cb32fee94ae25a413544702c37b3e1778a070cdd4840bd39f5f45795192a867863876ed0d130d46e2913935082809f7e15a496710f255d783da3d016a654c15ff5df907a3ccaf37cfe11c8c3d496507d6760c053820f0f594c3d01ca269178aca525ab2821ef55f92d85fe685ea34472ed1398171064d74a422ec91d1a670618fc9f32424bcb11a77f6fb4e2fefd2c4e8a73c452886e931664d1a83bd927329c04d250b83521d7dc13c91cee1ec050e11d42a4b0c8c069b61c4422d3a49c07eff2905b7bc7f4a5b43e6b0d61dfb50e4eea2e90d298a781d05", "signature": "1a5dd4c891c8e132570187c23b9a1e4b26f05460e875673819396df561c8af0e48333b62c77729d49fc40e174a7f3c21f85ef4d339ceb80bd2e037d803af560e" }, { "secret_key": "db05606356bacf23aff6cddd42b2c694352b5a0fec560aff54d9bd9710efe06a", "public_key": "32a5c7cc4909786b48a53f31093f549a9f1730ca6690383fdb5f14c2666e3132", "message": "1bc9c2833f37cdf1356fad166768642717701b38a0ab0c2f581a26d222d65ccee4bf0f6dfe64d33bc0239f71d4b82644b01625a1a35fe798676239e0ca779ef23138eebe3bd19de2d8f7c15b4d96f13e51bc633bea5d61225bca1d6339ba53e81f7d8d24c5d60f04ce8c726761d264584f1c7e5b5b6992456c1c76892d6352111e3b926fe025c0009db67ce0ddc7f764e0c9adb0481bc2795484d96373a962a7b74a5596f527a73476498c7823dffa6c8543b07971b5aa271c12255e0918dd73f50c30c9a85ac7c2993dd655da59431263f5914be706374be9c07585c2871328b4dbc39401c95707387e6e069d44b9d8fb058f22e315aa0d5b4f1168fc107962b064f7d845af8e2131951d1cd66dc84dba46d200af4f4c5f51221bc9b2196942f8b40e7ddbc9aeb3d9afc071259513135a016f2866099fa10f4c3b73500bd55c477b2415e10a279ba110d294f3dd1842177d0b4bfb1734dd0ccb7e394b43d16f0b7548362280f434764da57f19ed3e302e5370fba49664c230057433cc647eb27cd2c7c18c7d66906f088246c22f7f790399deb4c5fbb906181769bef5afbe8ad1f5de55be588f52f69c54d4ef5a969a0d995c27407b23edd9243d2499fdf29473b1955c84b3f7cbdcd81b7656ec0be9e0fdb3381356960fd0ca70e7ea74b646fcd313948e6ddb47609476fb6fa4842fa788a0d57be3b0a6ca1819f71614760043ec4904881939968a43b5d1928f84a5919093bc3841588171a9cd390f8fcd61538b54e6ef99770573e1986d150fa96b7a07e1d194af1c0b405500acb3d10e3be647c89862006fa78583e76166842920160eb57f0b2a6edf193c44c5eeacf4", "signed": "53099b766adf2944b6821374842c25d6e67b0ccde9c637fecb11b8b8b07203e3075732805f4f14aeae73bd62e308b5887d689e29cd89b23a476943110717b1001bc9c2833f37cdf1356fad166768642717701b38a0ab0c2f581a26d222d65ccee4bf0f6dfe64d33bc0239f71d4b82644b01625a1a35fe798676239e0ca779ef23138eebe3bd19de2d8f7c15b4d96f13e51bc633bea5d61225bca1d6339ba53e81f7d8d24c5d60f04ce8c726761d264584f1c7e5b5b6992456c1c76892d6352111e3b926fe025c0009db67ce0ddc7f764e0c9adb0481bc2795484d96373a962a7b74a5596f527a73476498c7823dffa6c8543b07971b5aa271c12255e0918dd73f50c30c9a85ac7c2993dd655da59431263f5914be706374be9c07585c2871328b4dbc39401c95707387e6e069d44b9d8fb058f22e315aa0d5b4f1168fc107962b064f7d845af8e2131951d1cd66dc84dba46d200af4f4c5f51221bc9b2196942f8b40e7ddbc9aeb3d9afc071259513135a016f2866099fa10f4c3b73500bd55c477b2415e10a279ba110d294f3dd1842177d0b4bfb1734dd0ccb7e394b43d16f0b7548362280f434764da57f19ed3e302e5370fba49664c230057433cc647eb27cd2c7c18c7d66906f088246c22f7f790399deb4c5fbb906181769bef5afbe8ad1f5de55be588f52f69c54d4ef5a969a0d995c27407b23edd9243d2499fdf29473b1955c84b3f7cbdcd81b7656ec0be9e0fdb3381356960fd0ca70e7ea74b646fcd313948e6ddb47609476fb6fa4842fa788a0d57be3b0a6ca1819f71614760043ec4904881939968a43b5d1928f84a5919093bc3841588171a9cd390f8fcd61538b54e6ef99770573e1986d150fa96b7a07e1d194af1c0b405500acb3d10e3be647c89862006fa78583e76166842920160eb57f0b2a6edf193c44c5eeacf4", "signature": "53099b766adf2944b6821374842c25d6e67b0ccde9c637fecb11b8b8b07203e3075732805f4f14aeae73bd62e308b5887d689e29cd89b23a476943110717b100" }, { "secret_key": "1d139b1ad0c3af1d5b8be31a4ecb878ec667736f7d4fa8363a9809b6d1dabfe3", "public_key": "2428cf1deb20fbad1fdc665d825b614122df101fbe1473a79996baf6967434b8", "message": "8df2d2df9b984da84433486a813c98c5973a696c11624610b23aa438083464f65a76796615b728c2ed4e60715855afc239450d5bc0911ff2a85230205c6f1349ba5bd87ea6f720db6ba70b77421788e0c654aebc23074c5f41d2290772140d981a6bc4fe709a268e64172a026b270118b4db51ab6a13c99b063186d8d5b338e977eddc6bb5fd7dd57d9845a3c3fe76177d5738dca16a8f9102857500174f23ff4c3bf3c8536f11580ef8514a409f5bbc9c0296f12e3478d4087f95efaa6c636071d21157bf11774bbfe7693306ca7213da4713ebaaab3554edf08011a5ff73da120375aed19628670f28ab24b6f5d5a1d570480f65d3c152bff1b47bf0666929cb7c99d9033faae8534fc35da730b811ebcc25ae10a195aab12c326aa45bf805c62dd4cd5f868623c04a8e1c6aa72f1ea4400c60867dff622f316434f1ec89503c6f9f65c137b4944cbcb35f086c74cceafa2242acca6ffe611c4b5587f5b75ffad349f00bf96e4a580a875b92654069b62eeac0bf78e5aedd71869ee05b9a94e1c98e35a97800a4a21220b039cd5ebbb756d40b4042e2c84a2ae98182511dae8ed3b89f4fa00fb8ed946316459710052ad4c02f63df05d3bb1ace33672151bdf5dab46c7b583db373899d4f035b6c111258b4e5a9e707a11d215e44e68ef1a6f053809aa51bd902e13ca99c1b1cecc83b9c235c710e797d2b1a249b2ea079b5c1674ed7169f1b6e67f1ac77f86b743298969335a772440f7fbfa72513500d84166114a8fd54139464d42b995530d32370b69bffc7589d6dcc97e0bf17856cc3bf4164dbeccc8a881d414d6a62029276c5f8137c0b3c68bc8f4bd4e7cff65ef2", "signed": "dd645e51edab04db31e33172cf27aceeedcc0463a963914a0eac8efd5a34341f6bbc52e042baaf3b40c89a57efb64574e69677fce955246c1fc0f269ef8190008df2d2df9b984da84433486a813c98c5973a696c11624610b23aa438083464f65a76796615b728c2ed4e60715855afc239450d5bc0911ff2a85230205c6f1349ba5bd87ea6f720db6ba70b77421788e0c654aebc23074c5f41d2290772140d981a6bc4fe709a268e64172a026b270118b4db51ab6a13c99b063186d8d5b338e977eddc6bb5fd7dd57d9845a3c3fe76177d5738dca16a8f9102857500174f23ff4c3bf3c8536f11580ef8514a409f5bbc9c0296f12e3478d4087f95efaa6c636071d21157bf11774bbfe7693306ca7213da4713ebaaab3554edf08011a5ff73da120375aed19628670f28ab24b6f5d5a1d570480f65d3c152bff1b47bf0666929cb7c99d9033faae8534fc35da730b811ebcc25ae10a195aab12c326aa45bf805c62dd4cd5f868623c04a8e1c6aa72f1ea4400c60867dff622f316434f1ec89503c6f9f65c137b4944cbcb35f086c74cceafa2242acca6ffe611c4b5587f5b75ffad349f00bf96e4a580a875b92654069b62eeac0bf78e5aedd71869ee05b9a94e1c98e35a97800a4a21220b039cd5ebbb756d40b4042e2c84a2ae98182511dae8ed3b89f4fa00fb8ed946316459710052ad4c02f63df05d3bb1ace33672151bdf5dab46c7b583db373899d4f035b6c111258b4e5a9e707a11d215e44e68ef1a6f053809aa51bd902e13ca99c1b1cecc83b9c235c710e797d2b1a249b2ea079b5c1674ed7169f1b6e67f1ac77f86b743298969335a772440f7fbfa72513500d84166114a8fd54139464d42b995530d32370b69bffc7589d6dcc97e0bf17856cc3bf4164dbeccc8a881d414d6a62029276c5f8137c0b3c68bc8f4bd4e7cff65ef2", "signature": "dd645e51edab04db31e33172cf27aceeedcc0463a963914a0eac8efd5a34341f6bbc52e042baaf3b40c89a57efb64574e69677fce955246c1fc0f269ef819000" }, { "secret_key": "4d22e331e0cf6f6a272db4d20687ffb059f1225d81e41123b8c89b074de76a3b", "public_key": "b1e4cfaeadd67b12d7b9dbfc0f88edd0373f9a88c7fa33fb7f2b1e475eccb61b", "message": "9c8e3f5b4d704030e1ba71f02efc4b87d6fffb55bc3d8d03818f915624fcf701c54adfafa2b694b87751cb9f69918c0f050f4c105d5ccb40100b28dfd4f411d591c12019176ac2016bfbfdf0ddf11db8a7e39aa7b9e216f667c0a15fb977eaa9ba3bc455cc58945f3e944b8ac2fbf4d24fe7e1e619cdbeee3e5e12a9a527d28f5fd7cfd9220f1308d897b6d4314a5a0187864a2d621cf1b2844261247bf520bafa9bf226e115681ecd77427980cd12b08c359cecd1de3f5545f807f81ed76302ffd6477f89b958cdf12954cf70c142532993831647eacab0b4807bfdadb4389d7dff2c4ef0ef5a5c61d0df762e2e9080a7181cecd06a53199f0dfef702627adecf5fcd9b3e68c72333161727f871c7d1c43051ff1c921fd53b642238b97880d64e25fac512ab954bedbca540f5b20091ec72e67f88770afc32f2125ca0da4fe87b56aac9177f1f4f67c851725c5e8afe64f664799833fd79100b77ead25838879fff4747aa0d5672ec0a94348134bdbd4bb39b0c67a0cd30602edf4fec6f7af0cc2bdae126cea842dfaa4391dc5ddea938e1792168240c2d8b25352f9f3a644235ce36fefeb6992ad88e287ad2d85bd850396fc2e517a15209f5920ac98c532b1f4d869beb08bb03cf7c91af3ffced68d5fbfef86ff94ece6e2ead3484ce080db17bbe40f1db432ec1650ed24fdd250f3345745c9b7b9198c9109a37261fc5ecbbb12f83a0e1220a1867d45fddfea81dcf75f4ec7fdb5250e57754d6dea270b628a79530ec28b619bca9493e6305cfc4414c1c1de3389e890197c85f28404f3fa96a1e2fd9206b472e8a0a0d32af55606bb083f76a19b8eae3479ae51d98a99a62", "signed": "c366b802f682fcd70525264fb1a3cbcd0ee35ecff5977c2a554da939229f17819a961ea74c3d7a7881ac5c1fa16bf984d9456a1388d3463c4494429b1dc454029c8e3f5b4d704030e1ba71f02efc4b87d6fffb55bc3d8d03818f915624fcf701c54adfafa2b694b87751cb9f69918c0f050f4c105d5ccb40100b28dfd4f411d591c12019176ac2016bfbfdf0ddf11db8a7e39aa7b9e216f667c0a15fb977eaa9ba3bc455cc58945f3e944b8ac2fbf4d24fe7e1e619cdbeee3e5e12a9a527d28f5fd7cfd9220f1308d897b6d4314a5a0187864a2d621cf1b2844261247bf520bafa9bf226e115681ecd77427980cd12b08c359cecd1de3f5545f807f81ed76302ffd6477f89b958cdf12954cf70c142532993831647eacab0b4807bfdadb4389d7dff2c4ef0ef5a5c61d0df762e2e9080a7181cecd06a53199f0dfef702627adecf5fcd9b3e68c72333161727f871c7d1c43051ff1c921fd53b642238b97880d64e25fac512ab954bedbca540f5b20091ec72e67f88770afc32f2125ca0da4fe87b56aac9177f1f4f67c851725c5e8afe64f664799833fd79100b77ead25838879fff4747aa0d5672ec0a94348134bdbd4bb39b0c67a0cd30602edf4fec6f7af0cc2bdae126cea842dfaa4391dc5ddea938e1792168240c2d8b25352f9f3a644235ce36fefeb6992ad88e287ad2d85bd850396fc2e517a15209f5920ac98c532b1f4d869beb08bb03cf7c91af3ffced68d5fbfef86ff94ece6e2ead3484ce080db17bbe40f1db432ec1650ed24fdd250f3345745c9b7b9198c9109a37261fc5ecbbb12f83a0e1220a1867d45fddfea81dcf75f4ec7fdb5250e57754d6dea270b628a79530ec28b619bca9493e6305cfc4414c1c1de3389e890197c85f28404f3fa96a1e2fd9206b472e8a0a0d32af55606bb083f76a19b8eae3479ae51d98a99a62", "signature": "c366b802f682fcd70525264fb1a3cbcd0ee35ecff5977c2a554da939229f17819a961ea74c3d7a7881ac5c1fa16bf984d9456a1388d3463c4494429b1dc45402" }, { "secret_key": "a5228ff9bbb6f232327eb8d879d7f8b277ca72bae1f9a9d0e260dd90571db4f9", "public_key": "d82f6a6974f51c8808d9d617f4cec2d8a37eb11a14237c9ab9cf11ebc80ff6c0", "message": "1df7a6835e3310983ee7ec731125f5b5cf117af0e36b3685bf54ace1c48c46300560a45e9f9bdd96a0bc4d14e89d4b5721a2caff6618b182edb1202f3d0c5d118d09b61812c010e8b196344541cdeefe5fd1f961c5dd75459555ab72ef2aa7a759a4f3ad3caed44f4c9a8ef95b76ed9a99b55dd8a260ba08010d29ff819f2af3513c1a640d6ccdde4999205f9fca8857115d8b5db9f70a62e5eea0d5af065de153f2ededeec63e15c8e09a92582182ac07d81ca63ca4aa597a2220e70481957d415264e258bc263e1cc36e53478aac5ca01694ccb09b4ffd84739972c7dccf3defeafdede162ab6c58a1df27371e3f5493067fc9e2067e579623c009fc825eef0e010fd1ccf2a8d3fbbb3156f9dfde0c7cbbaf8433098517491b78db9698614ea40e0b1e6a1e36b900453a16ea276f3442bbd27a7ecb981511f5c9209eb096e28588b65b96b50188c0381ff712bc06b2c655cca0751c095d8016251585851e677434dc3efd087a12680fc22e5b8310a10e32caac9b71c876eed31ef09f7fa012ba08dfd2ad68c1e147f50598e550467ef99f295a318faa507ebe776ce55c4da164323c30a5e72dbe027c3ccf96c70197a6fb1b74af133a8be2b03c1b99fd25b3ced51fe3882021a3afd9229f641bc6cad4e1d3cb6ed9b6b68a25f1e1397289981f78924bff24c8dee6a18a0421fa32ae3ab60a0d933a6af4ff704874b09b0739e2f29d8f252d79055f89d3bff10a22c54ac3d8afeece818353a6abe2b7fb8e8e0da5b7ac1cfc985df97580b18211a4e3edff95afdda061547d3ae0406d3286cd305bdfd2c3abf8f74af9a03420e5b03f825e9c53907e13a5812174be42898645149d", "signed": "97650fae3f59ca76477f2547167749c5830248883225e354ff46c7e381965220d9bef2c2057c7d1990f08bca4cfde877fff2b4aa813d9c4b84fb79eced81ef051df7a6835e3310983ee7ec731125f5b5cf117af0e36b3685bf54ace1c48c46300560a45e9f9bdd96a0bc4d14e89d4b5721a2caff6618b182edb1202f3d0c5d118d09b61812c010e8b196344541cdeefe5fd1f961c5dd75459555ab72ef2aa7a759a4f3ad3caed44f4c9a8ef95b76ed9a99b55dd8a260ba08010d29ff819f2af3513c1a640d6ccdde4999205f9fca8857115d8b5db9f70a62e5eea0d5af065de153f2ededeec63e15c8e09a92582182ac07d81ca63ca4aa597a2220e70481957d415264e258bc263e1cc36e53478aac5ca01694ccb09b4ffd84739972c7dccf3defeafdede162ab6c58a1df27371e3f5493067fc9e2067e579623c009fc825eef0e010fd1ccf2a8d3fbbb3156f9dfde0c7cbbaf8433098517491b78db9698614ea40e0b1e6a1e36b900453a16ea276f3442bbd27a7ecb981511f5c9209eb096e28588b65b96b50188c0381ff712bc06b2c655cca0751c095d8016251585851e677434dc3efd087a12680fc22e5b8310a10e32caac9b71c876eed31ef09f7fa012ba08dfd2ad68c1e147f50598e550467ef99f295a318faa507ebe776ce55c4da164323c30a5e72dbe027c3ccf96c70197a6fb1b74af133a8be2b03c1b99fd25b3ced51fe3882021a3afd9229f641bc6cad4e1d3cb6ed9b6b68a25f1e1397289981f78924bff24c8dee6a18a0421fa32ae3ab60a0d933a6af4ff704874b09b0739e2f29d8f252d79055f89d3bff10a22c54ac3d8afeece818353a6abe2b7fb8e8e0da5b7ac1cfc985df97580b18211a4e3edff95afdda061547d3ae0406d3286cd305bdfd2c3abf8f74af9a03420e5b03f825e9c53907e13a5812174be42898645149d", "signature": "97650fae3f59ca76477f2547167749c5830248883225e354ff46c7e381965220d9bef2c2057c7d1990f08bca4cfde877fff2b4aa813d9c4b84fb79eced81ef05" }, { "secret_key": "c04dc09f119d670fb1eae0136fcc06085f290f4ad1aa1ffc9c160ea5cf47f09d", "public_key": "ff498ce8c9db7867f6d0276452a466724887e6172f6681671b8ae035f5865ea3", "message": "1e42297f8aeef29a842e0e21f5dbae068e2c9ddaa6fd348e48881f0d42c50bf0ecf1706b94a5d19817ca02d83e9ab2f99d8bfaaa5c85ad39a150b225ad3eafa067815b74672fe026c3ccc677255440b684a76e128ca2ccc429f152577d25b69f40db582d49479afae680712dc0fd1fe1418839687ca60cdde974140462f96148295df1ce43a977351c77f2f0b09a6b26d6fe965fceae17d7b8620371402428544fdf91690b44e9afc2e9088c83ca48dc8576f628724798dc90323174c44996596502a35df8b982c570a6cb51b9a197d431af33f02b80011567fe50cf45ac111b3d556f8c8ce5ae8c9972f2a9936b1a012b9c339e30c97312b65ea59c100f79d795b8a24b31a0a97dc25cced6b8ff5ae145339a048ca12a579017fae8d5cbcb61d52e314dd7c2e72010c47217b1d06878bf2818ca188e8e307960c1689d7dfc0202973cd29f2f7ba743469e685e0e704b04baca4fab5488448a922eabf40be581c1994d74d13a366ce857fb40a6e05da8553694172cc3fd28062f538250aa8c11f68139e79cd1191ba3314b5cea0864437ed2e4b6fbd75b9ded0987b41c202a58ec0254d9d371a795f1dbecddac112be8d09e2d7b9ca5752f406cffb911ca36450bc05f1ec1ca3ca8d35124d1286c55f10f61334e46ece4183b92219a9dcd0e5e78ef2a76cfe9a9ab3795dfdcb44f63d45f5f48ffb4156133ad2e9950884c5bbd2c1cb8729e40a8787f784969fa880c07ffcc97d5c0d2d488085e9116d7107cd5db16ceccdead55025eea2edee93c1b106427618ee09dc3dad1e05676a2368069c8045c3ebc6c67afa52d59398248efcf15e904c7142304ff61971f4d9bf6460c1d6417", "signed": "4bd19f3d9c5116ec6ae0024d0f246d2ce250d9e0634a232ba06fd3566aed55cbe59f12332cbad65d4349a9d22e7d6e46d2fbdc71d5c8f9da15dfbf17ba2251071e42297f8aeef29a842e0e21f5dbae068e2c9ddaa6fd348e48881f0d42c50bf0ecf1706b94a5d19817ca02d83e9ab2f99d8bfaaa5c85ad39a150b225ad3eafa067815b74672fe026c3ccc677255440b684a76e128ca2ccc429f152577d25b69f40db582d49479afae680712dc0fd1fe1418839687ca60cdde974140462f96148295df1ce43a977351c77f2f0b09a6b26d6fe965fceae17d7b8620371402428544fdf91690b44e9afc2e9088c83ca48dc8576f628724798dc90323174c44996596502a35df8b982c570a6cb51b9a197d431af33f02b80011567fe50cf45ac111b3d556f8c8ce5ae8c9972f2a9936b1a012b9c339e30c97312b65ea59c100f79d795b8a24b31a0a97dc25cced6b8ff5ae145339a048ca12a579017fae8d5cbcb61d52e314dd7c2e72010c47217b1d06878bf2818ca188e8e307960c1689d7dfc0202973cd29f2f7ba743469e685e0e704b04baca4fab5488448a922eabf40be581c1994d74d13a366ce857fb40a6e05da8553694172cc3fd28062f538250aa8c11f68139e79cd1191ba3314b5cea0864437ed2e4b6fbd75b9ded0987b41c202a58ec0254d9d371a795f1dbecddac112be8d09e2d7b9ca5752f406cffb911ca36450bc05f1ec1ca3ca8d35124d1286c55f10f61334e46ece4183b92219a9dcd0e5e78ef2a76cfe9a9ab3795dfdcb44f63d45f5f48ffb4156133ad2e9950884c5bbd2c1cb8729e40a8787f784969fa880c07ffcc97d5c0d2d488085e9116d7107cd5db16ceccdead55025eea2edee93c1b106427618ee09dc3dad1e05676a2368069c8045c3ebc6c67afa52d59398248efcf15e904c7142304ff61971f4d9bf6460c1d6417", "signature": "4bd19f3d9c5116ec6ae0024d0f246d2ce250d9e0634a232ba06fd3566aed55cbe59f12332cbad65d4349a9d22e7d6e46d2fbdc71d5c8f9da15dfbf17ba225107" }, { "secret_key": "6791bd74d3b4620ef5f1ff56406432c26ab646f6d5e9dda6842ed69052275392", "public_key": "da9915a7552f110faea12d47920a09601443d4000a9c7e218d5ba72b74989fa6", "message": "36a20e66bb29155161ad85eefe893b53ac5ade165f089a77190b0c239dec8a201685b076b4ded4a10aa459b980a8cca47d5f8de4d2a662e446d5f7fb70ed9be05db1cceadd130b3346d9409f9d6ef52824c764ac6fb1cd156dbd6a473ae722d0ebb25638c51265a22febbb14967d6dd8253c1d038895c6737f067c8f73c3c1cbe6cda4369632d7f4c9acebe87d0571c81a58cfd72cce4a5cf53a1e75259f4c993e67efc8d9c3576c43af04a5caf33d856f7f2755d3a975ab2b685c6f65680cba9ac879f3a8c9a4765b879c0ade1e4bd0d4a70bb6f92b24d429dc746cc78f84811f076f32c61e3585cc8aade9b0ca15224bfbfe18be10a33643600f6612bf013f0efcca837246a0ee5b03c02f1573624c4a44a90f9e423d4e56061a71d0144f5a887a8cd4a9d6f247904e26795951959da121c83c6c941e2b6b9ab76209ffe9178591ead68230b94ae97df58f9f172428c95067598ac582ffb950840d826630c4625f5deaddec1305203b4db6b945f991ed7cd3d6fabca51e2166adad0aad5117336d52d59422f0135c8fa8cdd0884be73586bf284e5ddddbcb95b411f98568526fbe71a5592b56ad5a7345f2874db1d57beab43e8cc69547520629f0ee76dbf432a376fad28bfc77e14d840f0c02d478f1e2337c23b89e73e5279108b5609b18e80db0de11cfa94ecf7239bcff59c54118e4ede4fbfc0823ae546016f774c52198a963b5545a3489b89df7626fd11ed4658d715a4657994035d403b3370d14eed9718d598db675f042592fea89056544b32e5b9c8062828aaa3cf59cb476ad36db1daa2482227a9b7afbc153ce93253d1b39da95eb96f83128ff2554a547e34eea4a0000", "signed": "b1e8d481065bd5121bb3bf569600bcc26df40c499fbaa954b39a619dc40b9590c31756b8b63f860151694b95765d697b2e1ade0806e92a06c4a559e90fcfa50636a20e66bb29155161ad85eefe893b53ac5ade165f089a77190b0c239dec8a201685b076b4ded4a10aa459b980a8cca47d5f8de4d2a662e446d5f7fb70ed9be05db1cceadd130b3346d9409f9d6ef52824c764ac6fb1cd156dbd6a473ae722d0ebb25638c51265a22febbb14967d6dd8253c1d038895c6737f067c8f73c3c1cbe6cda4369632d7f4c9acebe87d0571c81a58cfd72cce4a5cf53a1e75259f4c993e67efc8d9c3576c43af04a5caf33d856f7f2755d3a975ab2b685c6f65680cba9ac879f3a8c9a4765b879c0ade1e4bd0d4a70bb6f92b24d429dc746cc78f84811f076f32c61e3585cc8aade9b0ca15224bfbfe18be10a33643600f6612bf013f0efcca837246a0ee5b03c02f1573624c4a44a90f9e423d4e56061a71d0144f5a887a8cd4a9d6f247904e26795951959da121c83c6c941e2b6b9ab76209ffe9178591ead68230b94ae97df58f9f172428c95067598ac582ffb950840d826630c4625f5deaddec1305203b4db6b945f991ed7cd3d6fabca51e2166adad0aad5117336d52d59422f0135c8fa8cdd0884be73586bf284e5ddddbcb95b411f98568526fbe71a5592b56ad5a7345f2874db1d57beab43e8cc69547520629f0ee76dbf432a376fad28bfc77e14d840f0c02d478f1e2337c23b89e73e5279108b5609b18e80db0de11cfa94ecf7239bcff59c54118e4ede4fbfc0823ae546016f774c52198a963b5545a3489b89df7626fd11ed4658d715a4657994035d403b3370d14eed9718d598db675f042592fea89056544b32e5b9c8062828aaa3cf59cb476ad36db1daa2482227a9b7afbc153ce93253d1b39da95eb96f83128ff2554a547e34eea4a0000", "signature": "b1e8d481065bd5121bb3bf569600bcc26df40c499fbaa954b39a619dc40b9590c31756b8b63f860151694b95765d697b2e1ade0806e92a06c4a559e90fcfa506" }, { "secret_key": "234ce4d39b5ebabe9a2c1e71970d718138dcb530cfd296023427d892bf88f8a4", "public_key": "cb73930db421f6d24536837bd0bff6fa75bbd141c98a405d4244a3c424550779", "message": "77730cf8c8f96b9187902acff9ff0b21746ccaf0a382a7b343d1c72027ae3c3168a73a6b8f49bc8798141e15c2732b6a6b3f757f8a8e86c7a4bacb39551c54874d6bf716897ee4af13253aa5bb79a192104f44dcb3de960745a8e6aa9880524a629fb510a4ce4cbda7e2957dff1d62e705606a2cc84f91850beaac5e5846e1420bc91dcdd2427b69cfa46ae38a4fef4146eae35f9c22e967cb14a1af9cabf83b180465bed6ef2cda382a84d9994aad655d8952e0fbb0f96fc8089f2e7489497facdcd656a8a451b928c11e7a4075072aafbf17d8f1054c9196288ded3ae21f9afd5810a100d8e4d84c4a35a98b30d3e18524438dd4402dfd8e7675f09d080cd915f14af4372f7ce58384972d5d111079651b2acf39d2a167c6a00b2b17ce0b268791bd2be5178fe0f82d64dacdde377a1e8be9e7d8dfc82b08644537bdc870c5819286fd51f6792dc5f67b54be336d44d54febf81b8df8dec5d8686db12f164d0e8ff1aa2c16bacc9806010ec8e91196597ef06a4cf1707def5067a04889d8e48a9bc2c0bef664f5acd1b4f5bc2da7da43dcb5f963245ba552fd493001d870a9517a179c2f0de85be0c682d057488e35c7816ff4ba529aefd7c66091f206f5f4d75cac8bd209ec2fa55be74af231e2f389dcc2d668bf695ed267c3594bad9efc00217c7a0e9e7b6a56a33079a30e73c3733f2d24efecdde87f72f948d277d6b6d5b035b4c53180d23d66cc0ff17c15dd468585e389d91a4c97fd80110b218a0bf7a5e0353f4609d2cf018a065571001c7888555eedbd3622c3b1769cd13f33374772aa6c8a8f588102017d4ee4e50dcbbdb1d610c32670934a6d9e6d9b784bbfe71862bb38", "signed": "f6d060ed7d18273f18f7a69cd1d8126e478e88a1d7294ff6040846d46107c3e41a423babb2417139fe587d2910271a357fe5bf57c92ee3a7b77533729d0ac20d77730cf8c8f96b9187902acff9ff0b21746ccaf0a382a7b343d1c72027ae3c3168a73a6b8f49bc8798141e15c2732b6a6b3f757f8a8e86c7a4bacb39551c54874d6bf716897ee4af13253aa5bb79a192104f44dcb3de960745a8e6aa9880524a629fb510a4ce4cbda7e2957dff1d62e705606a2cc84f91850beaac5e5846e1420bc91dcdd2427b69cfa46ae38a4fef4146eae35f9c22e967cb14a1af9cabf83b180465bed6ef2cda382a84d9994aad655d8952e0fbb0f96fc8089f2e7489497facdcd656a8a451b928c11e7a4075072aafbf17d8f1054c9196288ded3ae21f9afd5810a100d8e4d84c4a35a98b30d3e18524438dd4402dfd8e7675f09d080cd915f14af4372f7ce58384972d5d111079651b2acf39d2a167c6a00b2b17ce0b268791bd2be5178fe0f82d64dacdde377a1e8be9e7d8dfc82b08644537bdc870c5819286fd51f6792dc5f67b54be336d44d54febf81b8df8dec5d8686db12f164d0e8ff1aa2c16bacc9806010ec8e91196597ef06a4cf1707def5067a04889d8e48a9bc2c0bef664f5acd1b4f5bc2da7da43dcb5f963245ba552fd493001d870a9517a179c2f0de85be0c682d057488e35c7816ff4ba529aefd7c66091f206f5f4d75cac8bd209ec2fa55be74af231e2f389dcc2d668bf695ed267c3594bad9efc00217c7a0e9e7b6a56a33079a30e73c3733f2d24efecdde87f72f948d277d6b6d5b035b4c53180d23d66cc0ff17c15dd468585e389d91a4c97fd80110b218a0bf7a5e0353f4609d2cf018a065571001c7888555eedbd3622c3b1769cd13f33374772aa6c8a8f588102017d4ee4e50dcbbdb1d610c32670934a6d9e6d9b784bbfe71862bb38", "signature": "f6d060ed7d18273f18f7a69cd1d8126e478e88a1d7294ff6040846d46107c3e41a423babb2417139fe587d2910271a357fe5bf57c92ee3a7b77533729d0ac20d" }, { "secret_key": "103d118c7dd65d07e8d5582e45042a75792417c692001ee6bd9a927b2b3d9016", "public_key": "b45cc94514a6ad672496cd4eb9fdafc1d4a167072c6874dc8ff16d761fb66986", "message": "5a8ee079186b51cf4629834de0c6bd7334855039a7631d6887652a7728995972e362c1c409f084f5aaf2986ae3f536be0070c4baf459ef60a015ef9d70dfa3ea96711cbb18e92af50c527d7ed457877a07ab83721518c89f7a864191b1e97433b7c6cd634a832e19891e76c62122a49dbffd83498aa416acccb7737fe75f4fb2c35328e6f6ececaaa42e43dba5bc9689673dab96f0befa3c83eb41d4d887b3a117d055e30bb87fbe7c719472f6c7a4cc45f628f5faddc48ca344f77b733c0e3b9f5079dbd07af3a3847af141719cca2f6a766552b45d0fdcdb9868f2c762b6d4933ba10836f95bff71cb88040024c90534c4d7a95a2303b04c2961012af58bc784a96327bbfed039d0802a05262d8e663b78508e92508bc1f2ea2b9be7580bde10a4d663d0d25b0e973b8c5ded59debf19bb044aff1c60c70ea1aefe85f6d15c2c1b84753b59576a49473d65af3ed941a3d514b5c4522c141bdbeed9cb339695b2e02dc07000867f1bf8ed8cfd3b1afe688fbca80e2f9ba5c0b188a19adaff6686ca0ff0edd444661291fa27ca1fc529429a5d8ff79ed2027c60ffe3b2c03fb8a66a3985417ba4ace7d14fd0e2371edf5d71bc02b9052767c7f72c4e6f3f30e0638276b9c420aa4333095d31313033090582e3ac4d9fd3203120ba2514973ab9d1c7fc42290116b51dae9fd579410ae078ed320a5a1b49aa7b5fefcd756395213af8641e29b0ebb5b83e3780e5d10e9d3d11998148f6c6f86c4d4eb252e28c70fa3a55c43d4d7faafcbcdd45ad2637f215e81549eb8a4cde4715b7107207503a79595060b83ace8feb673b997968469dd9b4ad6a7ea81c6e61810033f3edfc137d974209575c", "signed": "2fafc13c43afe5054372b923d24f292b283afca3aca3b3e432380684961713c8d23e86b3580495dfbae424b767e4795a0f922f71b50f5d7a369ab8c6e880420c5a8ee079186b51cf4629834de0c6bd7334855039a7631d6887652a7728995972e362c1c409f084f5aaf2986ae3f536be0070c4baf459ef60a015ef9d70dfa3ea96711cbb18e92af50c527d7ed457877a07ab83721518c89f7a864191b1e97433b7c6cd634a832e19891e76c62122a49dbffd83498aa416acccb7737fe75f4fb2c35328e6f6ececaaa42e43dba5bc9689673dab96f0befa3c83eb41d4d887b3a117d055e30bb87fbe7c719472f6c7a4cc45f628f5faddc48ca344f77b733c0e3b9f5079dbd07af3a3847af141719cca2f6a766552b45d0fdcdb9868f2c762b6d4933ba10836f95bff71cb88040024c90534c4d7a95a2303b04c2961012af58bc784a96327bbfed039d0802a05262d8e663b78508e92508bc1f2ea2b9be7580bde10a4d663d0d25b0e973b8c5ded59debf19bb044aff1c60c70ea1aefe85f6d15c2c1b84753b59576a49473d65af3ed941a3d514b5c4522c141bdbeed9cb339695b2e02dc07000867f1bf8ed8cfd3b1afe688fbca80e2f9ba5c0b188a19adaff6686ca0ff0edd444661291fa27ca1fc529429a5d8ff79ed2027c60ffe3b2c03fb8a66a3985417ba4ace7d14fd0e2371edf5d71bc02b9052767c7f72c4e6f3f30e0638276b9c420aa4333095d31313033090582e3ac4d9fd3203120ba2514973ab9d1c7fc42290116b51dae9fd579410ae078ed320a5a1b49aa7b5fefcd756395213af8641e29b0ebb5b83e3780e5d10e9d3d11998148f6c6f86c4d4eb252e28c70fa3a55c43d4d7faafcbcdd45ad2637f215e81549eb8a4cde4715b7107207503a79595060b83ace8feb673b997968469dd9b4ad6a7ea81c6e61810033f3edfc137d974209575c", "signature": "2fafc13c43afe5054372b923d24f292b283afca3aca3b3e432380684961713c8d23e86b3580495dfbae424b767e4795a0f922f71b50f5d7a369ab8c6e880420c" }, { "secret_key": "47eee2024dbe09953e981f6986520f666082aa9ef4892dfdfbdbd250d2a1df28", "public_key": "9f13cd8ebf5080347975159f360296a7164014d8d069e831dab0332607997cde", "message": "c133f033cf3bec6cd19212ea47dbecb13f2c6018f9e0878ac884bfb575c0f5d3fc5b4999580eb8acbcaac83ae9ac9b443e6d1cff449c3689b433d50900b2e8b71d00e119c8b875094bdab916adaab75bcc852959d8d759795bbd6b360ee484afe47b1ad28391f25afb8d4e3afe0c5b600498a12833fe2a1a5483df940b173ba0d9d8c4d1321fa4b733334b0f6d878a0e5a76f4f180ac119a82082acb1488e49bbca7a0369c191bd6d0c5d445656821a99ccbc945949eca8136cc6e127d9de92ef64f174a6c04c8b5e52495f0dd674bb5ca128a9209968fd450dce319913fd6a30c3382798163e6585f58ef208be4d0c6a2513a752388397a4ae444838c8466dbc36fbc36ae08bec88eeda131c14d06366b673151454100dea1118150fbe441b1e7826e545d9868242e899f5ea53e434c37936ce6fd06146283e8fbd536480de55a16102c44754bc554d5bc2de2f25e19e567a023df4640e74ff3a49e4dd30e0e2558b3dbc2aab92fdd5e79425ecbc4c699fe1f161965f1d0b45d8bdab52ec9bf7a69d8aa0bd171e755ce7b8d0718f7267afb733efca54b213e6f5adab4c9d76c867fcb69ae05c74bd21516cf342c6161f6fc9eccacf970ebce540cd892bc106c6bd563610298b70968f091bcc6e1f7ab4a5b2c6374a1903f4d3ad5e1bd8643a9c2f878c3d7a4dc49ef3197edbcda7bb91e7e06606087d4e981bfab93a6024977962e45262517f338b6857eec2158a297b2aa91524b677a21aac57be0b63a8074fe54e7a9dc70c5a5c3de728b9c17ec1212ab1130eb17622cd7b22ab6eba9185e8d67be6c47a2e5adc663d4642cc120222e299fe134fd7fcd00adabcfaa642fe2e08dd52e2c3f32", "signed": "5defae0e173ecc18d5f01ec9291be160d5eabff63fd5423f2bc66e3f6408c196353502dcef21effa4b9c14bf27b687d1b6e86b2a205a89eb35c376a3a325690dc133f033cf3bec6cd19212ea47dbecb13f2c6018f9e0878ac884bfb575c0f5d3fc5b4999580eb8acbcaac83ae9ac9b443e6d1cff449c3689b433d50900b2e8b71d00e119c8b875094bdab916adaab75bcc852959d8d759795bbd6b360ee484afe47b1ad28391f25afb8d4e3afe0c5b600498a12833fe2a1a5483df940b173ba0d9d8c4d1321fa4b733334b0f6d878a0e5a76f4f180ac119a82082acb1488e49bbca7a0369c191bd6d0c5d445656821a99ccbc945949eca8136cc6e127d9de92ef64f174a6c04c8b5e52495f0dd674bb5ca128a9209968fd450dce319913fd6a30c3382798163e6585f58ef208be4d0c6a2513a752388397a4ae444838c8466dbc36fbc36ae08bec88eeda131c14d06366b673151454100dea1118150fbe441b1e7826e545d9868242e899f5ea53e434c37936ce6fd06146283e8fbd536480de55a16102c44754bc554d5bc2de2f25e19e567a023df4640e74ff3a49e4dd30e0e2558b3dbc2aab92fdd5e79425ecbc4c699fe1f161965f1d0b45d8bdab52ec9bf7a69d8aa0bd171e755ce7b8d0718f7267afb733efca54b213e6f5adab4c9d76c867fcb69ae05c74bd21516cf342c6161f6fc9eccacf970ebce540cd892bc106c6bd563610298b70968f091bcc6e1f7ab4a5b2c6374a1903f4d3ad5e1bd8643a9c2f878c3d7a4dc49ef3197edbcda7bb91e7e06606087d4e981bfab93a6024977962e45262517f338b6857eec2158a297b2aa91524b677a21aac57be0b63a8074fe54e7a9dc70c5a5c3de728b9c17ec1212ab1130eb17622cd7b22ab6eba9185e8d67be6c47a2e5adc663d4642cc120222e299fe134fd7fcd00adabcfaa642fe2e08dd52e2c3f32", "signature": "5defae0e173ecc18d5f01ec9291be160d5eabff63fd5423f2bc66e3f6408c196353502dcef21effa4b9c14bf27b687d1b6e86b2a205a89eb35c376a3a325690d" }, { "secret_key": "b6c88b4c90fd19a149d381671953b9b16d428f6361cf503a110477e297f8d2f8", "public_key": "8ebfb084f997b2ea7932a2353b2c8b16bd825e1af587a8ebc51a6c45aea343ae", "message": "7f4bf4f52173eff072f818d0aa97e6935d8baccf4839663253b2414fe6b1f34cf43ab120155a1a3aea7b4819ddd1031673b8a7a6bd0b9dda4adefe692a56162c646180794264c5122115eb90a6d3054f084302dce3d836ac3de820638bd89a86bf0a4c01547cfdc543d676fe1639ef72c5b845c494e07814cec8a47d03df73be4e33c05afe9a190dda043360496be4cf3a6319da9ab06481677f1a4374d60d3d3b6394f8843c869b0f41a1e81c2b1a54bf5aacbd98207c8dbacb36422a3aa013d5e849e044af928545c046097caf149d970215115dea0b5a85401ff672e02ed40bd0f5a440cd56494053c896c3bd32606349f7cbe7ece2a2230cf236dac59f7817965f3fa80fb48aa30b0b19efa9a96591646bd25e67c185f77e21d6630b288d4e55146b2abc15e95088d936080775618154bbdda115702a2afd6fd5f56b923e188833ec448944d30283e337254242c5812d7245a4e92670bce3546efaed22d274e1e6048b5a0f01efbf895dc42494baf1747185cb1a4b88fdf1e6099baabc6a5ab5a2727b1e248789d170caa2449671a8f6e094c11332ea0ac2afe88132c644ff883d0c499ad76a93df472fa013eaa27ab4dad679d2511b5049c4e98baa2e7b00a534891e290265edb076f7dca8e6fef3f433034a16575f0e53da4577e6b13f0cb0d785870d0d098d5d80f413a268ba84e0431a786923771378cd57b8192258e2633cdbe03cc316a0950970526fd3e09376bcef0d03b7074e59a5a84fc64e795a812156d960567650bb1e1424b3cc9a4d99d57ba858dd1a0cad3532e998146e79264045e28ebbfd75a426b0bb851a244ad6be7bd5765af493dfc44ee378cd04daf3917eef2a6206", "signed": "7447a20181b02cf1b6ad529569ce437c2a0508116f50205c41e6378b74fe2fc53630aa0dc4b80c31cb26c8f09bf8fab27e3abc8f1f604a5ec06631a84f6f2e067f4bf4f52173eff072f818d0aa97e6935d8baccf4839663253b2414fe6b1f34cf43ab120155a1a3aea7b4819ddd1031673b8a7a6bd0b9dda4adefe692a56162c646180794264c5122115eb90a6d3054f084302dce3d836ac3de820638bd89a86bf0a4c01547cfdc543d676fe1639ef72c5b845c494e07814cec8a47d03df73be4e33c05afe9a190dda043360496be4cf3a6319da9ab06481677f1a4374d60d3d3b6394f8843c869b0f41a1e81c2b1a54bf5aacbd98207c8dbacb36422a3aa013d5e849e044af928545c046097caf149d970215115dea0b5a85401ff672e02ed40bd0f5a440cd56494053c896c3bd32606349f7cbe7ece2a2230cf236dac59f7817965f3fa80fb48aa30b0b19efa9a96591646bd25e67c185f77e21d6630b288d4e55146b2abc15e95088d936080775618154bbdda115702a2afd6fd5f56b923e188833ec448944d30283e337254242c5812d7245a4e92670bce3546efaed22d274e1e6048b5a0f01efbf895dc42494baf1747185cb1a4b88fdf1e6099baabc6a5ab5a2727b1e248789d170caa2449671a8f6e094c11332ea0ac2afe88132c644ff883d0c499ad76a93df472fa013eaa27ab4dad679d2511b5049c4e98baa2e7b00a534891e290265edb076f7dca8e6fef3f433034a16575f0e53da4577e6b13f0cb0d785870d0d098d5d80f413a268ba84e0431a786923771378cd57b8192258e2633cdbe03cc316a0950970526fd3e09376bcef0d03b7074e59a5a84fc64e795a812156d960567650bb1e1424b3cc9a4d99d57ba858dd1a0cad3532e998146e79264045e28ebbfd75a426b0bb851a244ad6be7bd5765af493dfc44ee378cd04daf3917eef2a6206", "signature": "7447a20181b02cf1b6ad529569ce437c2a0508116f50205c41e6378b74fe2fc53630aa0dc4b80c31cb26c8f09bf8fab27e3abc8f1f604a5ec06631a84f6f2e06" }, { "secret_key": "7949a9472f725ce7c68d7ea8fc16e13d9e0e0a58f58c24f9228c88e80264090d", "public_key": "a370f82833f88b4f5f5310b918e6af93bb724bfbdf3c02c503780b2c83ab6cc6", "message": "955386b92dd6bf92601bf81e84d25144b5fc0bcd7d23c76e7deb5f5ba6316bb61a5d8e74185b012967f0a4438b531696deb4b8101089e0c0482adf13c0613191b977f77b0419814147f5da64a1d3beb1275b9849d1297ba8532ae0a647a8ace395ae0ed00f67348c5ee5ea19b5f1c5bd2e622818e8adcba3c17c27987e4e3d6d910a56c7e5149d3f5574fc06009bf4dd3e37cfe3ebda2c2116d366dd88ce5ea72ab387490585443b086e8aa38d11d3820b72c658e463cdb59c5393011d4a8f4cb6a195229304e76239fa5e8c2cbe0f39dcad138a0ecb3c51579ec9a120a51607eefebfa59a44620ea5b1916087ea338533fc132ff2e4a43d052fd08b6b1b24fb672f73c9b9ba20b7c1c41ea24d912de9b555b6e5682b970608ff229ad3086f431f9be190ec39224ba2ed8acb4c8eac8582e23aaa79827c44e248c5ba092ddac0f2f79684aa93fc061073e1821a56afb9bfec952df2719a9c7a403e6a93f7a656d74b61c1d19083f8d3f19e659fa2b718e0bd04b693d63dafb86adbee5d87c75b7d129122f178a0e669eb035ca4d8eb45397f1851264e2cf0a0cdd30720c5e139cd6a573f1fa241cae9425805ac79603e8de350efdb0b9bc95ba7b085c1ed92c12acf53f5d4a1137598008f2a3672c84e5f769a25c7a4a16579d86288774972606e4e7d85263ad217e0dbcf343fe554c109c5d9409b7939073ac55a03420fec289b114a5c54c20b45ea69938533ade7b3ae85e1a783dd97897c3ae8254183cc54045c2a18ecbe521691f2619d9b8f1fb347ca055a7b0b4c24f64d1773e01416441efe159923217a84874b9c4ec265cdaab643908068497812c1af15c188071e78f597fedfce91c5d4c6", "signed": "e02898cc7c30ee01648247497be8a9c6378593dc8820bf7c17ffcd18118af09879a769f539dd9237e96821166634998f946da65e6dbad8271511669e2d6cad02955386b92dd6bf92601bf81e84d25144b5fc0bcd7d23c76e7deb5f5ba6316bb61a5d8e74185b012967f0a4438b531696deb4b8101089e0c0482adf13c0613191b977f77b0419814147f5da64a1d3beb1275b9849d1297ba8532ae0a647a8ace395ae0ed00f67348c5ee5ea19b5f1c5bd2e622818e8adcba3c17c27987e4e3d6d910a56c7e5149d3f5574fc06009bf4dd3e37cfe3ebda2c2116d366dd88ce5ea72ab387490585443b086e8aa38d11d3820b72c658e463cdb59c5393011d4a8f4cb6a195229304e76239fa5e8c2cbe0f39dcad138a0ecb3c51579ec9a120a51607eefebfa59a44620ea5b1916087ea338533fc132ff2e4a43d052fd08b6b1b24fb672f73c9b9ba20b7c1c41ea24d912de9b555b6e5682b970608ff229ad3086f431f9be190ec39224ba2ed8acb4c8eac8582e23aaa79827c44e248c5ba092ddac0f2f79684aa93fc061073e1821a56afb9bfec952df2719a9c7a403e6a93f7a656d74b61c1d19083f8d3f19e659fa2b718e0bd04b693d63dafb86adbee5d87c75b7d129122f178a0e669eb035ca4d8eb45397f1851264e2cf0a0cdd30720c5e139cd6a573f1fa241cae9425805ac79603e8de350efdb0b9bc95ba7b085c1ed92c12acf53f5d4a1137598008f2a3672c84e5f769a25c7a4a16579d86288774972606e4e7d85263ad217e0dbcf343fe554c109c5d9409b7939073ac55a03420fec289b114a5c54c20b45ea69938533ade7b3ae85e1a783dd97897c3ae8254183cc54045c2a18ecbe521691f2619d9b8f1fb347ca055a7b0b4c24f64d1773e01416441efe159923217a84874b9c4ec265cdaab643908068497812c1af15c188071e78f597fedfce91c5d4c6", "signature": "e02898cc7c30ee01648247497be8a9c6378593dc8820bf7c17ffcd18118af09879a769f539dd9237e96821166634998f946da65e6dbad8271511669e2d6cad02" }, { "secret_key": "d68a5e3c47eedb3099dffc804cf19c5e74bf7bf5f01f54d4d91d7574f3d3dc7c", "public_key": "46467fe9ce3acfd0d74346be21c46216db81aece6ce0308fb8dc6386fc3446cf", "message": "596c03d0873f572f45c3b16f0ef4b52ad2bf59ec76d3c0e534d62c1f84164ddaa425fb85c9548485b7064677e99d04c39b6eba04c966397ba6a5f4ebaa69a241df95a6e44502509d6350557ebfea60264b62ad7f74d16e5d25d45970cfebeb33e7b1bac3348dd03a8e99133b26bbfd7aa722c2587f72d5526e980da9eebdf108211dae50bbe8c65f9abee69a1bbf84c03e40448babad03d3cf3b7de4887d2b47737702796482d2265c566b0f623b53c8671bd3719edec0ffd5f49b49b072c1564a57f9bab6b92d1f068d756639a4331452e61aa7b218a88b9db77a19fb82f13e9868edb798d5beeca55d1ab095b316225f3f6390f89578f0160428747bcd21be6ae1d86991b48ef80d569250858febf3276bd5de3db65a245c8bdcf1488c4825968945786bed63f3d13f1409363b948560476858b396bce588e40b311ddfc22ad622ca7d1e69561464dda5009e638aa5ec9f4c039293aaec75001ffc68a7cb3ae01874dc7f39d75027f59a28965fc19530c0752fe99b153da7c0e542bda76ca1e10b7ea158efb4d821fbc65e7271ad9941095315447abcad0880a0075dd04b1325c72633acbcb261fcb407c264a34d70bf1f044feead069af5a87dd352f4bd8110fa178adbd8dbf23c6b575cdd5df22cc9a5cdd37d9c8faab81a4cb3fb5c4fe7ff629dbaa9fc06b80c1fb691c28655955cfe5ca44149b150b3cf140d9acacb14313a72c84098de72bacc0272d79ed6617f72dec88e19b84425492a429ec6d2ec08b86346dfbf20ea2a3619e77b6ac64230ebe25fa0067abb5f33ee49adc7c44bda7046d7f224f2e7a4895683fca8684ed6a031844f5786bcda48b5042394487b52402a09907788a1e140", "signed": "896fc3caba7fd3fc285d5eddddc0120cd46da7c6efabe66b150b002760b8414a89ac9e7f1f7b7c7b33598f61f45718e4ff4ac368ff129614b4fe9219f237b009596c03d0873f572f45c3b16f0ef4b52ad2bf59ec76d3c0e534d62c1f84164ddaa425fb85c9548485b7064677e99d04c39b6eba04c966397ba6a5f4ebaa69a241df95a6e44502509d6350557ebfea60264b62ad7f74d16e5d25d45970cfebeb33e7b1bac3348dd03a8e99133b26bbfd7aa722c2587f72d5526e980da9eebdf108211dae50bbe8c65f9abee69a1bbf84c03e40448babad03d3cf3b7de4887d2b47737702796482d2265c566b0f623b53c8671bd3719edec0ffd5f49b49b072c1564a57f9bab6b92d1f068d756639a4331452e61aa7b218a88b9db77a19fb82f13e9868edb798d5beeca55d1ab095b316225f3f6390f89578f0160428747bcd21be6ae1d86991b48ef80d569250858febf3276bd5de3db65a245c8bdcf1488c4825968945786bed63f3d13f1409363b948560476858b396bce588e40b311ddfc22ad622ca7d1e69561464dda5009e638aa5ec9f4c039293aaec75001ffc68a7cb3ae01874dc7f39d75027f59a28965fc19530c0752fe99b153da7c0e542bda76ca1e10b7ea158efb4d821fbc65e7271ad9941095315447abcad0880a0075dd04b1325c72633acbcb261fcb407c264a34d70bf1f044feead069af5a87dd352f4bd8110fa178adbd8dbf23c6b575cdd5df22cc9a5cdd37d9c8faab81a4cb3fb5c4fe7ff629dbaa9fc06b80c1fb691c28655955cfe5ca44149b150b3cf140d9acacb14313a72c84098de72bacc0272d79ed6617f72dec88e19b84425492a429ec6d2ec08b86346dfbf20ea2a3619e77b6ac64230ebe25fa0067abb5f33ee49adc7c44bda7046d7f224f2e7a4895683fca8684ed6a031844f5786bcda48b5042394487b52402a09907788a1e140", "signature": "896fc3caba7fd3fc285d5eddddc0120cd46da7c6efabe66b150b002760b8414a89ac9e7f1f7b7c7b33598f61f45718e4ff4ac368ff129614b4fe9219f237b009" }, { "secret_key": "31e82bc1cc5ced21cdc8bfc2dbbb976b08780afc6944af7e88e50e67874d84f1", "public_key": "8df977e2b040acebd3dafd67b87f9216e8c371beced618fef3a496d651a5d7b5", "message": "69d461b6b7a866e94cd59a5a23bba4a1276602f042baa850d5b29249d6743ada04d3d938219abbc22ada66a1778197f70bf80b597a8b4ae00bdb876812d3ab4ec011df73341c85053eebcc2df0acfc21548283b553ecde0154828ed5af47571985f89767b005b622c9e7c079dde694e49dc0550c7918cc515c274dbd9c5469d2f18ecd90de664e03ca41e53be20b96e25af40c54ab0f7cbe9e05ca3fa5a37c1aa8ebfb6444a32c496efc68157c69f358c15f6ac09d46efef9a685df7e8dd63b304bd3c638ccf532fe901f11cf97c5b1cbed33c70637c721b0289adf6bb6d87c30479fa926e043074302b76f1157d0a81dec493e87a3c643e7a20b7a41525a38db04e78dae5e7797066bfae2cf448a447e9004cce8e41f0987991fad30311ddaa459a2644f4b941c068c0d6c0771afcf42bf9139a684da298486ecf67523bf8509a45ba5cb8b3864ad22c0c6a828c6db72e371de410b47dac49ae9d3b5702b1739b8d760ce98611c07d88df5f04683808a21afc2e61713fc2c025cb25fcc4ee941841083b22f61e2656fb3b8dad41c262c89d2f17610309f2d5c29589a2df61e55149895032ca981e4557e130a237fc0826fc872529861bbb8328d673f39b58b73d060ec596bf22e7ee081f44e92c02a5677679520e2a2b4d22c77f2b212d5aaf050bf2c141e3e28b8571d4321937426235c7a646d647e3efe183c27b7492565ecacd7f43c67a74453f4780e88711ba2dd4a3941b12ddd3909270fb3debd422436ab6166f08c99c886cc0e8e3cecd0642e44285b8864aa416943c5a186974f464535a870a012861bc2e587149cae971624e61c31d8a507e3ad82773e723bcb75df54bef847a407bcb7b1d57", "signed": "240702ac6c68d597d222da949d0c47d16b390a477d1fb579e9d8948adf9b3b6a7fd4458ae6385b7e2b684a05b55c63fa6cd087bb90113cbab8e4af142fcf810e69d461b6b7a866e94cd59a5a23bba4a1276602f042baa850d5b29249d6743ada04d3d938219abbc22ada66a1778197f70bf80b597a8b4ae00bdb876812d3ab4ec011df73341c85053eebcc2df0acfc21548283b553ecde0154828ed5af47571985f89767b005b622c9e7c079dde694e49dc0550c7918cc515c274dbd9c5469d2f18ecd90de664e03ca41e53be20b96e25af40c54ab0f7cbe9e05ca3fa5a37c1aa8ebfb6444a32c496efc68157c69f358c15f6ac09d46efef9a685df7e8dd63b304bd3c638ccf532fe901f11cf97c5b1cbed33c70637c721b0289adf6bb6d87c30479fa926e043074302b76f1157d0a81dec493e87a3c643e7a20b7a41525a38db04e78dae5e7797066bfae2cf448a447e9004cce8e41f0987991fad30311ddaa459a2644f4b941c068c0d6c0771afcf42bf9139a684da298486ecf67523bf8509a45ba5cb8b3864ad22c0c6a828c6db72e371de410b47dac49ae9d3b5702b1739b8d760ce98611c07d88df5f04683808a21afc2e61713fc2c025cb25fcc4ee941841083b22f61e2656fb3b8dad41c262c89d2f17610309f2d5c29589a2df61e55149895032ca981e4557e130a237fc0826fc872529861bbb8328d673f39b58b73d060ec596bf22e7ee081f44e92c02a5677679520e2a2b4d22c77f2b212d5aaf050bf2c141e3e28b8571d4321937426235c7a646d647e3efe183c27b7492565ecacd7f43c67a74453f4780e88711ba2dd4a3941b12ddd3909270fb3debd422436ab6166f08c99c886cc0e8e3cecd0642e44285b8864aa416943c5a186974f464535a870a012861bc2e587149cae971624e61c31d8a507e3ad82773e723bcb75df54bef847a407bcb7b1d57", "signature": "240702ac6c68d597d222da949d0c47d16b390a477d1fb579e9d8948adf9b3b6a7fd4458ae6385b7e2b684a05b55c63fa6cd087bb90113cbab8e4af142fcf810e" }, { "secret_key": "cc56bc7cdfa611924e72b07f68abc6ca5b85ff8bbacdff406e51ba720d09a866", "public_key": "5ffee221ab4d0fe6f4c9346c5e5a4b8a636a6a0badce9667be739f4c9e6733c1", "message": "088304f22e1a286062defbebb1827a64b76a14e87015e7f646178777aba79704688d7bf32e1efac97a9fc339810ebd3df93e4ea024686953ed91fa6d2ab6e07ec7811a6d91ca91b098db4725df65846a95b808635a8d0c5fe5ace25f0780e896177bc1bba1cdb4449251c01b482f023862f88e072e79cde5dbd6c1d9ad9c07c606f5df85a6eca2966cbfe0a1673968112f26a317053f167f611af297efa802e0a94b3e1f33a27b73e5597abb224115ebe75e294a1bcdcd979255b0a80265c089aaa7d6bed2e3d0c918f56f4a55f448d863365c6c5846fb9b2b9bb55f6b7c6dff5847b71bfdd4bb5b9bb2e4249bc0243a02ab4d22ba78a43d182195aed78fece84cb1ddaeb9eff68156045b2932e638d7731d0e8b4c9c8c383b0d6d392d21fc640762c87d3692b1810bcc4a42392ff13d45169ecbf0135055093105098c869b68887e934e2b9da5232ac6c9373800f70b64ec64a4aa0ca044c0777ca3a3acaa138c14249672a55b24ddfe4dc357573241e14ad0ac16475a8e3867886d41eea35fe7932ba9aeaa0c86c9eb6db7808049ade7b5cc1a40822c66dea93ad22d44b9e42904b5b83684ae2931fe36c608ff7096f1b09f811b02672804406e08ed9e7745676ce047f0f7f64708e49bb78754720b8aa226f5556abf05b56584645292dad08e2473639a8ce5475e0ce9192f8ba2dd32ce14c91975ab602f7c13538c52952d0396158c7cc6b942be7d923eeb523a73b5b411966d14ac96e5b096a52932a416292eccddb91071c88560e70ecd4fe2fe24d523fafcb98e4021502f4190a0515edcb24019eaca09ec2615a9bfdeb60eb354c84a1f3cec7ffd7e65a5515d47959a4c4ec48d8021b1754ae2bf84", "signed": "9b86a192b64f4f044ffbf87b41c7ee52f7a721aa320e7bad6425995990315cdd502be4e1116019d131a9218d19614ad95543b1889af0a97ed4d256dc33d76e08088304f22e1a286062defbebb1827a64b76a14e87015e7f646178777aba79704688d7bf32e1efac97a9fc339810ebd3df93e4ea024686953ed91fa6d2ab6e07ec7811a6d91ca91b098db4725df65846a95b808635a8d0c5fe5ace25f0780e896177bc1bba1cdb4449251c01b482f023862f88e072e79cde5dbd6c1d9ad9c07c606f5df85a6eca2966cbfe0a1673968112f26a317053f167f611af297efa802e0a94b3e1f33a27b73e5597abb224115ebe75e294a1bcdcd979255b0a80265c089aaa7d6bed2e3d0c918f56f4a55f448d863365c6c5846fb9b2b9bb55f6b7c6dff5847b71bfdd4bb5b9bb2e4249bc0243a02ab4d22ba78a43d182195aed78fece84cb1ddaeb9eff68156045b2932e638d7731d0e8b4c9c8c383b0d6d392d21fc640762c87d3692b1810bcc4a42392ff13d45169ecbf0135055093105098c869b68887e934e2b9da5232ac6c9373800f70b64ec64a4aa0ca044c0777ca3a3acaa138c14249672a55b24ddfe4dc357573241e14ad0ac16475a8e3867886d41eea35fe7932ba9aeaa0c86c9eb6db7808049ade7b5cc1a40822c66dea93ad22d44b9e42904b5b83684ae2931fe36c608ff7096f1b09f811b02672804406e08ed9e7745676ce047f0f7f64708e49bb78754720b8aa226f5556abf05b56584645292dad08e2473639a8ce5475e0ce9192f8ba2dd32ce14c91975ab602f7c13538c52952d0396158c7cc6b942be7d923eeb523a73b5b411966d14ac96e5b096a52932a416292eccddb91071c88560e70ecd4fe2fe24d523fafcb98e4021502f4190a0515edcb24019eaca09ec2615a9bfdeb60eb354c84a1f3cec7ffd7e65a5515d47959a4c4ec48d8021b1754ae2bf84", "signature": "9b86a192b64f4f044ffbf87b41c7ee52f7a721aa320e7bad6425995990315cdd502be4e1116019d131a9218d19614ad95543b1889af0a97ed4d256dc33d76e08" }, { "secret_key": "7a57f2dda0ad0338ab9a13c9a3497e9c75238c1531589789227cd2749bc6e950", "public_key": "6f738dc5e7d9e240c9f4d0c06a5e021747568b69a75d507a2e0be7ea613526c5", "message": "8c8575a11d2ff2c238e419ccb00633d04e8b8bd7742901d588dd6a2f00aa12f08ae41dcaa9338f8c47e95312192cf6b245a00ce688a029da56dd1b1deb0d34b5414fe1c21d6b63d06b8534ace8e866c933fd7c5a65eda95a1737a9ecdb17859149ac696951b82c230e8275e96dd02fd455ea675379e67ba63484b6283831fe3ffe52d6ec49b709106705c9d19b859de9fd200887cb44d8fdfe6961fa4ca2340944c764c704491208257e735482af8cb69041dde685241d3fbf46fda057248b8987be1f80b54eb54009f324dc450e886e79f912585b91c9dfafe9012262c471403b1e8b5c31fc5375a1ddf99b68edf9ed70af8594f7d84b2cc4911fe90500c6eebfbac085553550e35bd2e52514e979e7241e9f8e34cdf8513abe72510dff3cfec7e2bc6488641cfd0a65ae0e09ebe99b15b29d45ea67a57aad554d4f8bfce1386ace228839e3a8a534140eec3d37d51be361f5ea1883739f56615f75b055a06a91471be98bc9453783c358382bd0555ae9eb0bdcd66629a611fc1a11c653c82214587dec12ba120e2513070fe69e982f7a80ad159f6a325d977d01d050d116a62a4f8acab6c3d69ff6c878213c60a94845cae106de6c5d6fe2508d94565b7ba75d58d1ad47d76a20defa7568cb7fd66f57cf3774a21d3ffa7d8aa6d86dc284b70e0f17e7630bfc10cd1fc9a8d9c592d39f24a7b5c8e8aff353577e6ac9008690c7a159a7e83be5a6ae8fca9644bddfa37a92b07055f9fac9fa97fb3e8f5f4d917dda5c6dc6ea34b64d302405bc38062e07ce93a1a88aed5fbaf995a09b45b28ad4a6b273dec1413c5404529d825b5edc2e27a390eb7e8c2b43905e116d887ab5fb993dfe150ebdcf817ae62e03", "signed": "989123761d93563278fd0a78aed64e2de6f4a700fc9a70d2187748ac06d9c2c377d1995f89c7727fe2f120784e4171c42d6353ac3d4e3f620c639c75786c460a8c8575a11d2ff2c238e419ccb00633d04e8b8bd7742901d588dd6a2f00aa12f08ae41dcaa9338f8c47e95312192cf6b245a00ce688a029da56dd1b1deb0d34b5414fe1c21d6b63d06b8534ace8e866c933fd7c5a65eda95a1737a9ecdb17859149ac696951b82c230e8275e96dd02fd455ea675379e67ba63484b6283831fe3ffe52d6ec49b709106705c9d19b859de9fd200887cb44d8fdfe6961fa4ca2340944c764c704491208257e735482af8cb69041dde685241d3fbf46fda057248b8987be1f80b54eb54009f324dc450e886e79f912585b91c9dfafe9012262c471403b1e8b5c31fc5375a1ddf99b68edf9ed70af8594f7d84b2cc4911fe90500c6eebfbac085553550e35bd2e52514e979e7241e9f8e34cdf8513abe72510dff3cfec7e2bc6488641cfd0a65ae0e09ebe99b15b29d45ea67a57aad554d4f8bfce1386ace228839e3a8a534140eec3d37d51be361f5ea1883739f56615f75b055a06a91471be98bc9453783c358382bd0555ae9eb0bdcd66629a611fc1a11c653c82214587dec12ba120e2513070fe69e982f7a80ad159f6a325d977d01d050d116a62a4f8acab6c3d69ff6c878213c60a94845cae106de6c5d6fe2508d94565b7ba75d58d1ad47d76a20defa7568cb7fd66f57cf3774a21d3ffa7d8aa6d86dc284b70e0f17e7630bfc10cd1fc9a8d9c592d39f24a7b5c8e8aff353577e6ac9008690c7a159a7e83be5a6ae8fca9644bddfa37a92b07055f9fac9fa97fb3e8f5f4d917dda5c6dc6ea34b64d302405bc38062e07ce93a1a88aed5fbaf995a09b45b28ad4a6b273dec1413c5404529d825b5edc2e27a390eb7e8c2b43905e116d887ab5fb993dfe150ebdcf817ae62e03", "signature": "989123761d93563278fd0a78aed64e2de6f4a700fc9a70d2187748ac06d9c2c377d1995f89c7727fe2f120784e4171c42d6353ac3d4e3f620c639c75786c460a" }, { "secret_key": "32ef6d789a1ea393f1bf9f11de34f57d653c4e77d51e6050fef4e8d7bf183db5", "public_key": "c1aa181e620f60525c2b17da8d290bae5d339e17eabceab58cd76ae066f41179", "message": "11a9c3c1ba7cfb61ad103305c25886de9f8815c6c21f17a8733a024f9497da0540db3603a671aae837dbbba19e19f82ddfc8af855980a70125fc61cd7ffd10777e366e5e9569927af0f245d4f39b3fd0f45879c253401412855e5761905ed6ef318b6a06ea6e9f906f9bd016bcb694a0df65a016bdfe845a09f23e5086c5aaf375efeb86da51239ddc350bac0cdb03b874db1507e6ad4e2c9f46028ca2388363541493b6cb92c1dfcaa3efd68c6b4e91efb46751d23f4c48a973f0a5c7c6fe2a1269d2a69e9fc4ab8ba3b92f796449ba3dc70245ed505cc0eeee1636647a68c7679d0b6d651bba35c29b81478d17ca3685707ad616e6e5604381f84ee52b25ad02fc0dfb85432efb1fecd090c02ad002c1857fced88fdfb2ff26dd0f5018fb47d813581f6508ca637c7365177c513d1ee05879a65c5b676b3aa873a1935c5437eadcb66dfb052a5e7c3e81d44b3daf698f42244ee2ee4b6ed2b7e6e56e61ff9cb45e719fd746198bf2a7de6d25af3bc6c7b0ed8abe3cb389afd84ffa2a230d93bc0c29d5a9419cbff11b7883329921480b5844655d996c7cab29dfb2a3927b82ba7c306c4577b6f8b5dbe2afaf9bf14a8f9554cd01a69a991bf212828de1e63172e833de06698cdb3b28716380314572bf5bcfd34ef52a6fadda87babe6bacdb20ce63c725cb0ff61fe30c1b51dbda2c2625f99dfeb029a3e58cba7d01905111caf42f27025e720e18eeb07dae9155c55aa300e22eb5e94dc7a0a84ee67d91a960ae08ca632dbb1737fc9a43dbcfb3a879eb9fbffd7299338e264bc1237ab6a5bc2a263cfa99e8544439d96331639fe9408e54a350610ff01de3f85799adeb73d82be938074dea858ea636b63abd", "signed": "88f3a6e0bbaa3e060bc9d91fe2968c61126b20317f59842e4ae48711cdbaf62c6c0207405d1c4849950271f0aaa7593091109e478d13f356964f7dbab729af0011a9c3c1ba7cfb61ad103305c25886de9f8815c6c21f17a8733a024f9497da0540db3603a671aae837dbbba19e19f82ddfc8af855980a70125fc61cd7ffd10777e366e5e9569927af0f245d4f39b3fd0f45879c253401412855e5761905ed6ef318b6a06ea6e9f906f9bd016bcb694a0df65a016bdfe845a09f23e5086c5aaf375efeb86da51239ddc350bac0cdb03b874db1507e6ad4e2c9f46028ca2388363541493b6cb92c1dfcaa3efd68c6b4e91efb46751d23f4c48a973f0a5c7c6fe2a1269d2a69e9fc4ab8ba3b92f796449ba3dc70245ed505cc0eeee1636647a68c7679d0b6d651bba35c29b81478d17ca3685707ad616e6e5604381f84ee52b25ad02fc0dfb85432efb1fecd090c02ad002c1857fced88fdfb2ff26dd0f5018fb47d813581f6508ca637c7365177c513d1ee05879a65c5b676b3aa873a1935c5437eadcb66dfb052a5e7c3e81d44b3daf698f42244ee2ee4b6ed2b7e6e56e61ff9cb45e719fd746198bf2a7de6d25af3bc6c7b0ed8abe3cb389afd84ffa2a230d93bc0c29d5a9419cbff11b7883329921480b5844655d996c7cab29dfb2a3927b82ba7c306c4577b6f8b5dbe2afaf9bf14a8f9554cd01a69a991bf212828de1e63172e833de06698cdb3b28716380314572bf5bcfd34ef52a6fadda87babe6bacdb20ce63c725cb0ff61fe30c1b51dbda2c2625f99dfeb029a3e58cba7d01905111caf42f27025e720e18eeb07dae9155c55aa300e22eb5e94dc7a0a84ee67d91a960ae08ca632dbb1737fc9a43dbcfb3a879eb9fbffd7299338e264bc1237ab6a5bc2a263cfa99e8544439d96331639fe9408e54a350610ff01de3f85799adeb73d82be938074dea858ea636b63abd", "signature": "88f3a6e0bbaa3e060bc9d91fe2968c61126b20317f59842e4ae48711cdbaf62c6c0207405d1c4849950271f0aaa7593091109e478d13f356964f7dbab729af00" }, { "secret_key": "0a5525a4598f60992f86ba1ab9eee6e2675622f943284fc0553e4446ac5a4c53", "public_key": "db60d7ea29f8d60dad33d02ec5f42232057bd1c4bd6180a242cb7ab6f4426781", "message": "f787321b42c08d4052449a488593d885b4e0c34a5d64149fa8b9c85ee54bcbecb50909b2a86b88258a10e07e8f8c2d068a89fb165a6ace7e64998ba57d89d9bf2b8b38a1f6d8364aee05ce3348bed48b88c2473bf5f2665f51ca073a5305358eaad4365d58b83bc9814e25f54c37cd9b68a808a57d6c2d7d7b6deb5fe20f4f96fe725f8de65c29a4f1ccefd7c2c6f2fc0116d58676acbc58691c79c2b006785a0975a31d8d3c949161596a068aaf2226ab842550e9c0b2610a29531d1f3f7f00826bb6c7dbe04e28ae1b9ff6f888a49d82812f452e1b32740b234ddd9642e18f32ad9a9af7f8952528674a2cda25b4f7ba867007ffa7f78f163db8f36914956bfaecd50f6d1af4ee133275a8eaab94bbc0ae52b6d9b2832634232ec0e8b5f8022d3ef1ead9b79ef9a16564277194f2380d9021e1f17b184b8d3a7a34d15139a39c7728c22e1a3a67a27a6ca4b8a8a0636c6054d0f741f046673619fc6b070e62ff4862f59d269007f3431339637a89f564c0db3d9bcfcd19fc25138ac66d474d80f4ad79f6d1e7844408e88034eeaff4a790338d546bfcd7424c119e211f363cb89c888749346a89d32f023bb6b0366a1ede4325032aa35f52e9df938a5027ebee9688ae480dde1a9c9b42d1a9c08f719223dfae1cfcd49dd1053aaa381c24cc9c7abfcf8f6d86d6af72eef05304412f3db2585aa9e0f3a4f1b6d710d02ab11db1fc90ad4de25d04299f3129c212e9cb73c0047953455bf98ec8fd2674e47b949957deeda018badc9f2f68a1b18ef5c583b095e08dd906da5f220da029b9c400e3ca91c7cbd87f3430c742337f61cf54745b0622bcb90762c6bafef87e1ec888c364fad646c33acc22af5438b84cd5", "signed": "8fa6b0aeac71132ad882975868f1bdb8c11f1a6c1b9c54594e0e46286ea6c9a5d6d5b0eaeaca9ae3af74e72326b3b6f2eaa893c0ec42a49c56ef514f75c77f01f787321b42c08d4052449a488593d885b4e0c34a5d64149fa8b9c85ee54bcbecb50909b2a86b88258a10e07e8f8c2d068a89fb165a6ace7e64998ba57d89d9bf2b8b38a1f6d8364aee05ce3348bed48b88c2473bf5f2665f51ca073a5305358eaad4365d58b83bc9814e25f54c37cd9b68a808a57d6c2d7d7b6deb5fe20f4f96fe725f8de65c29a4f1ccefd7c2c6f2fc0116d58676acbc58691c79c2b006785a0975a31d8d3c949161596a068aaf2226ab842550e9c0b2610a29531d1f3f7f00826bb6c7dbe04e28ae1b9ff6f888a49d82812f452e1b32740b234ddd9642e18f32ad9a9af7f8952528674a2cda25b4f7ba867007ffa7f78f163db8f36914956bfaecd50f6d1af4ee133275a8eaab94bbc0ae52b6d9b2832634232ec0e8b5f8022d3ef1ead9b79ef9a16564277194f2380d9021e1f17b184b8d3a7a34d15139a39c7728c22e1a3a67a27a6ca4b8a8a0636c6054d0f741f046673619fc6b070e62ff4862f59d269007f3431339637a89f564c0db3d9bcfcd19fc25138ac66d474d80f4ad79f6d1e7844408e88034eeaff4a790338d546bfcd7424c119e211f363cb89c888749346a89d32f023bb6b0366a1ede4325032aa35f52e9df938a5027ebee9688ae480dde1a9c9b42d1a9c08f719223dfae1cfcd49dd1053aaa381c24cc9c7abfcf8f6d86d6af72eef05304412f3db2585aa9e0f3a4f1b6d710d02ab11db1fc90ad4de25d04299f3129c212e9cb73c0047953455bf98ec8fd2674e47b949957deeda018badc9f2f68a1b18ef5c583b095e08dd906da5f220da029b9c400e3ca91c7cbd87f3430c742337f61cf54745b0622bcb90762c6bafef87e1ec888c364fad646c33acc22af5438b84cd5", "signature": "8fa6b0aeac71132ad882975868f1bdb8c11f1a6c1b9c54594e0e46286ea6c9a5d6d5b0eaeaca9ae3af74e72326b3b6f2eaa893c0ec42a49c56ef514f75c77f01" }, { "secret_key": "2d5ddffa2e58c90451ea05de47b8c49234e26ced54854e3acef11d8ee6852da7", "public_key": "7bfd1c8a4a0bbb4606d2e5bc090f56b20d58f2204b6aed831d3df4d406b47605", "message": "4f1c5b4e6fac3baa3e9010f3bf293c779e61fd7bbe05a586f5aaf08026371627a209acd188afb2dbe0311547940559711640f78aea9a62818962f445a8e7ed6fe6c5f49162e7435d1b625b88ba39dab0ad56fd2c0ad6512661362bf78afe5a1416b647f3b88a056c9e7289c9b0cc3afb43402198563493e737b1da052506b6c9306d75ad6693db6d1571f96f6f52990c4df19665a6bb63073fdd9f55596896a2e9c2622f2b0c2cc99ddd1b649fb0318058d74794e38ec657ebc82abd5bedf8b3f4bba3bb6c9935fdf6826502b769046b36d96dc695d7c85404284d2a2ab7fcf3b02f68a1493dd383ca6339fac1cde47f53c5e026d0869faffe40abdb98195230f17d0cfaa533315afdbfe7d1afc3a615b4f75090233a503f8861e32374e1ea9557674231d9d737d477b33ff82ac0b2c0ba93c11fb523e613618ed370524a60f4d4c83694c033606d1d069d544dccd3900c37a3b3363efbcf6697f9f762b33b1294583953fc53773ef56726eeb470ebe92149b73648a16161d494120a318bfb080cc38e4996f4b263ffe78c7877fe13c2fc55219f44260e8f253bdd379d870e6c91048b1d8d4e88b88218b2b049fef53b2ae1f8c921ed2bcb434669e3975dcc3fe4520ca8024842f7ff2ba1e22cfeb5d4c9e435eada601ff183b26364eee1faa59d19e6aa4f0975238496a709e46bf68336b068bd80b346f11faa3817a07d1cbd84382b2102986f295a1398077ba291d6b5f5bd860ec6177273468f0ee0f2591b575c4366e189b224e9ffa35bc78a4aa8c06954fe33d080ffc0b23e209fd0e79421f1bde818a86890cf172236db211657d1003119fe91d4e27c524ccc11fade0a25f57a7a1d677e1da0b9c043d02fca38", "signed": "ced9d61010339c471ddf9fefcaa82d1eab3a2e0e60278553b4dd9f395be58149c91594e5618b0b10bf3aab94f159b530f64463eed66fa2ace54fd92572a06a0e4f1c5b4e6fac3baa3e9010f3bf293c779e61fd7bbe05a586f5aaf08026371627a209acd188afb2dbe0311547940559711640f78aea9a62818962f445a8e7ed6fe6c5f49162e7435d1b625b88ba39dab0ad56fd2c0ad6512661362bf78afe5a1416b647f3b88a056c9e7289c9b0cc3afb43402198563493e737b1da052506b6c9306d75ad6693db6d1571f96f6f52990c4df19665a6bb63073fdd9f55596896a2e9c2622f2b0c2cc99ddd1b649fb0318058d74794e38ec657ebc82abd5bedf8b3f4bba3bb6c9935fdf6826502b769046b36d96dc695d7c85404284d2a2ab7fcf3b02f68a1493dd383ca6339fac1cde47f53c5e026d0869faffe40abdb98195230f17d0cfaa533315afdbfe7d1afc3a615b4f75090233a503f8861e32374e1ea9557674231d9d737d477b33ff82ac0b2c0ba93c11fb523e613618ed370524a60f4d4c83694c033606d1d069d544dccd3900c37a3b3363efbcf6697f9f762b33b1294583953fc53773ef56726eeb470ebe92149b73648a16161d494120a318bfb080cc38e4996f4b263ffe78c7877fe13c2fc55219f44260e8f253bdd379d870e6c91048b1d8d4e88b88218b2b049fef53b2ae1f8c921ed2bcb434669e3975dcc3fe4520ca8024842f7ff2ba1e22cfeb5d4c9e435eada601ff183b26364eee1faa59d19e6aa4f0975238496a709e46bf68336b068bd80b346f11faa3817a07d1cbd84382b2102986f295a1398077ba291d6b5f5bd860ec6177273468f0ee0f2591b575c4366e189b224e9ffa35bc78a4aa8c06954fe33d080ffc0b23e209fd0e79421f1bde818a86890cf172236db211657d1003119fe91d4e27c524ccc11fade0a25f57a7a1d677e1da0b9c043d02fca38", "signature": "ced9d61010339c471ddf9fefcaa82d1eab3a2e0e60278553b4dd9f395be58149c91594e5618b0b10bf3aab94f159b530f64463eed66fa2ace54fd92572a06a0e" }, { "secret_key": "4df5e11dec80ecd882837554fa3135b9d5029df42027aa3b3c929246329fee96", "public_key": "efd928898fa144c2d1c8334fa2e6b5b6a325a7102a2c344a145541ee9a6c046d", "message": "fbd6f371b4c8b152c9ce0c6396a77c0fe480bc02007f336ac58fd4addda9d69855ac9e93a45d3e350f41ff502aa1d8fe159ce89b064802a0a1890f6a40a7ef57c6e5e5ed040280df07e7f48fe819be63176710757cb6e440b4f78b5759dce028bf585b3c3feca1cf5981dadadfd27ea124af45ef638542a8617ff49f9470ac2285943c7c3b1163b903955ab99b6eab17f4d49ffa87207abbfc111c4b91f5413dfc9bea31843d115ddeb1da40b45f58f47c417b5e77d5818934e730eba9c4557bbf48cb7fd4e664558af4fb44ee3d94c16e883631f38476f4837db94d54122fa134ca51a525aad5e24b76018fee9a2e8f60e2bb48d24ab8b146f84ffa9820120e7c50d45c0cfbe35c8c31419b078e90712cfe934c3be3a94ff2158873aefe34dc6e36902b1675e1a47cb608dfe960fb4da8d2a8490cc38ebadc73a1003c4941fda8fae944a1de8e3b10ef6d9e67ceec745977d333ac9e71214121ede8892295e27799f206675a9d54ac12159d3a1f954fd0eeffbd30a31904fb2eee77a8aa9dc4ccbbe2851096146a4ce0e81fb9c62498dbd83bf83b55029a5e900086b9531ce3247a98f8654efd8fe7a836431f75daf0868f0108326e23026d2db4a72124ec4e39d4bbf3d846c9f51ca3cc31eb1d02c2ba321e4619f2b659c0bf0fe5c19b213f3c79124f3643f74dd0ff9ce5d27727be6c6958159c164404f43301fe1742e279de9efd441e73e4ea7a842587a79d115d36eca9c03c90ff0d147474109fc20a91d7b3cc22ebcbb8c7f71bd61e8cae47c5050cec1d4849a1d4a8e7a6f845548437706c25331c9e57c2cc6da117f2e5a0f4b368c4cb206265c4178e0655ff675ffc1d4c58eceb9edb4da3ad2c5f62cd13ab48", "signed": "62545e6c07801fde95b461e2e753c4b6c84c25124eb330a2725989d5e340dcef0c7456d4c7c6a178a221b6328348253db787a9e5510ab9cc278515ae3e58fb01fbd6f371b4c8b152c9ce0c6396a77c0fe480bc02007f336ac58fd4addda9d69855ac9e93a45d3e350f41ff502aa1d8fe159ce89b064802a0a1890f6a40a7ef57c6e5e5ed040280df07e7f48fe819be63176710757cb6e440b4f78b5759dce028bf585b3c3feca1cf5981dadadfd27ea124af45ef638542a8617ff49f9470ac2285943c7c3b1163b903955ab99b6eab17f4d49ffa87207abbfc111c4b91f5413dfc9bea31843d115ddeb1da40b45f58f47c417b5e77d5818934e730eba9c4557bbf48cb7fd4e664558af4fb44ee3d94c16e883631f38476f4837db94d54122fa134ca51a525aad5e24b76018fee9a2e8f60e2bb48d24ab8b146f84ffa9820120e7c50d45c0cfbe35c8c31419b078e90712cfe934c3be3a94ff2158873aefe34dc6e36902b1675e1a47cb608dfe960fb4da8d2a8490cc38ebadc73a1003c4941fda8fae944a1de8e3b10ef6d9e67ceec745977d333ac9e71214121ede8892295e27799f206675a9d54ac12159d3a1f954fd0eeffbd30a31904fb2eee77a8aa9dc4ccbbe2851096146a4ce0e81fb9c62498dbd83bf83b55029a5e900086b9531ce3247a98f8654efd8fe7a836431f75daf0868f0108326e23026d2db4a72124ec4e39d4bbf3d846c9f51ca3cc31eb1d02c2ba321e4619f2b659c0bf0fe5c19b213f3c79124f3643f74dd0ff9ce5d27727be6c6958159c164404f43301fe1742e279de9efd441e73e4ea7a842587a79d115d36eca9c03c90ff0d147474109fc20a91d7b3cc22ebcbb8c7f71bd61e8cae47c5050cec1d4849a1d4a8e7a6f845548437706c25331c9e57c2cc6da117f2e5a0f4b368c4cb206265c4178e0655ff675ffc1d4c58eceb9edb4da3ad2c5f62cd13ab48", "signature": "62545e6c07801fde95b461e2e753c4b6c84c25124eb330a2725989d5e340dcef0c7456d4c7c6a178a221b6328348253db787a9e5510ab9cc278515ae3e58fb01" }, { "secret_key": "85d32330e2e073a46030ca0ee2df2f8eb874a9fddf5624c8031775111f11eea2", "public_key": "6ea7de2ed5ea5cdf50bfffee77f7bd2fcc21d48666bb1f4890c76a69cc7ba4e8", "message": "ae6107f38ff94ed0327903cbaf6c3e3a3498c47abb2989a8b37b3a19df88c6de790accb4b7258177b9151d1fe04063577d3c3acdb4c929968afdad6f252a67ed4ca89d060f1a4653983f7ab58ddb93e2878fbab0637dbbeb95d25c5986839de2748d9f34027aeebf1d9eb936cb6770e08d45b8095bac9cbb71db14e8a34222b1f2237b9f0bc9766a231a6d102799f7c081d500fbeade603cdcdd7d5b965fbace4be5c2cd932dcf5f6ed31722f41d5a363b34babf3f636fb303824aa701dfe1d3e41263078c1ebbdcb1f73f1245b83e3fa70ab8e3f1413e6b06bdae022b714d60a401d57480dc64e7aac6d3de85fc94d853ca13b7e67415579d5c672123a5af194bee14ae35dc2724ff209f1166638661f881b1194aa4e31b42a527964781591504ba76103f97b7f5520315473ec94bb017a16667b22a8576a7cc2ac0b7756303c756f0ddaae9d0189e6c8de349f91957c72a529e9f7e9b9456524840ba02344f55ad3c11a0b259901439f2655ab9f8c6c8e8e960c057d9c7dafe425c75d4a33b801d4547cd0551a6802a8005dd72424764dcf57e4aa22290ea4f5baac51d7939c05342882ee14380ef2d4704b41949b2282a1e1a3fa7ddea9fe83b9fc51d4eefa2ebac722e4c0a7c599b6925f01b8a2066dc0c26f92196f4f503e887c1e6efb093f1531387bd88c691997b9b89e3cdf7da12d3734183a4b6126be9e0774704b529659b5548f1b87512cc1878ca4ef55990b483c9af6aa97635f4f07949727065abf21e21e32990b1a7d07d74e02d9b07ec639931bf9e2ca3941f2ba6b5ef14dcc2a247d2117e9cb41efa3fcca24716641452beed2f92657c2fb731f0b94e8c892a81bba91f639df43796acd3013ac044f608", "signed": "414363fead6e59a3438ce5a3a277d62bdd00fa2efac6463dd13fcdded93a7f108ae1f528ffc8ff4eca331dab91ae5b1416e2ddb73b6daf853b03c81e9936560aae6107f38ff94ed0327903cbaf6c3e3a3498c47abb2989a8b37b3a19df88c6de790accb4b7258177b9151d1fe04063577d3c3acdb4c929968afdad6f252a67ed4ca89d060f1a4653983f7ab58ddb93e2878fbab0637dbbeb95d25c5986839de2748d9f34027aeebf1d9eb936cb6770e08d45b8095bac9cbb71db14e8a34222b1f2237b9f0bc9766a231a6d102799f7c081d500fbeade603cdcdd7d5b965fbace4be5c2cd932dcf5f6ed31722f41d5a363b34babf3f636fb303824aa701dfe1d3e41263078c1ebbdcb1f73f1245b83e3fa70ab8e3f1413e6b06bdae022b714d60a401d57480dc64e7aac6d3de85fc94d853ca13b7e67415579d5c672123a5af194bee14ae35dc2724ff209f1166638661f881b1194aa4e31b42a527964781591504ba76103f97b7f5520315473ec94bb017a16667b22a8576a7cc2ac0b7756303c756f0ddaae9d0189e6c8de349f91957c72a529e9f7e9b9456524840ba02344f55ad3c11a0b259901439f2655ab9f8c6c8e8e960c057d9c7dafe425c75d4a33b801d4547cd0551a6802a8005dd72424764dcf57e4aa22290ea4f5baac51d7939c05342882ee14380ef2d4704b41949b2282a1e1a3fa7ddea9fe83b9fc51d4eefa2ebac722e4c0a7c599b6925f01b8a2066dc0c26f92196f4f503e887c1e6efb093f1531387bd88c691997b9b89e3cdf7da12d3734183a4b6126be9e0774704b529659b5548f1b87512cc1878ca4ef55990b483c9af6aa97635f4f07949727065abf21e21e32990b1a7d07d74e02d9b07ec639931bf9e2ca3941f2ba6b5ef14dcc2a247d2117e9cb41efa3fcca24716641452beed2f92657c2fb731f0b94e8c892a81bba91f639df43796acd3013ac044f608", "signature": "414363fead6e59a3438ce5a3a277d62bdd00fa2efac6463dd13fcdded93a7f108ae1f528ffc8ff4eca331dab91ae5b1416e2ddb73b6daf853b03c81e9936560a" }, { "secret_key": "66590d369984c6f5ad3a89c78ddfca10a0a7657995dc0188b6b57ac3164731a4", "public_key": "98873ab13346ee48677c4f8612db31ebd13db58b2b034fd155afa8720f4e93e8", "message": "2ec1c6b0829737832c9c798a92eb490b23d334c3bbe627cb582d17a9e42960efcdc7d34750e0b4aa864c204fb8d62b47992e91dbfcfd69f51d937dc06c48c0ad43e8598371cd0e3bbce416bfd44b0944b993aa2993fdea487134cde42277723e0683ec98e69595e9b7b14c8cf9617a1e30ddb8060eacba48d88253b165336108de0cb02ff20f5424b567830869c9b4329c9945f0bf2f3c7acd1e774358930cd890fd9cb864d950935ad8a4a3beccae8f833f6356191371c32633dcf882709b0d98bd807b383aed8d7bb097b6e262ef700c9d768f4b5690e3a1a8f21755d658db2d1bfd2f7071e0caec7c2c5381c5ef5c2c2281c6bcedc867390b90f3b27b0f0f64a33658578a5c0d66e211e6fff6e86488acf82bc0f5e2664b83699046037c0d33d340ff98ed6263354c24273136ff0e4f0f233a6c8254fc0c90764330e3b1057b1e666d5ecd5a2efeaa6a105bfc858431b88ed7fe551eb32ac0af27c66a9803a3bcf87634c66c7066dd0197a3cbd2d6f4e65cfdb8f3daf9f3ca5c4f4e0add45f5541aa18d041f706e4fa87c34e9a223d88572eb50083ee8c7c475df568bc73bd08c0f0deaa374afb1c178d0dddb236e15a8bc2385ed3f52b8761e637887407a20aec3e99ec830dae3167ef0cdb3f3ffd200d83b75b749690b9e25e2171d072ca56f71baecd21f7d45a12c91b2c0fb3fea3b158e54648284bb0095b36244b0b121f9f1384ce9004365e7772fa30828250f51985f1b17b2d2f80a33e8fc6d8565ea15cdaacd42a87bd7c9408b1fe1c770665bdded754bc2ff2ef91b973a86b99f1059c6f227246a698b38541509dd5449fce60d386224183b7dce1b3884f7bae1c2e4eb594510b5ca585279d9041df8817b0619", "signed": "f0db63a1bc7624161ca0063853b2dee45fccd22471e012366f868a4a9c74654e13f1a315ad83916ebfb8dc31a420f83cf645c4c9d16bb4d5d99d23c7b43e23002ec1c6b0829737832c9c798a92eb490b23d334c3bbe627cb582d17a9e42960efcdc7d34750e0b4aa864c204fb8d62b47992e91dbfcfd69f51d937dc06c48c0ad43e8598371cd0e3bbce416bfd44b0944b993aa2993fdea487134cde42277723e0683ec98e69595e9b7b14c8cf9617a1e30ddb8060eacba48d88253b165336108de0cb02ff20f5424b567830869c9b4329c9945f0bf2f3c7acd1e774358930cd890fd9cb864d950935ad8a4a3beccae8f833f6356191371c32633dcf882709b0d98bd807b383aed8d7bb097b6e262ef700c9d768f4b5690e3a1a8f21755d658db2d1bfd2f7071e0caec7c2c5381c5ef5c2c2281c6bcedc867390b90f3b27b0f0f64a33658578a5c0d66e211e6fff6e86488acf82bc0f5e2664b83699046037c0d33d340ff98ed6263354c24273136ff0e4f0f233a6c8254fc0c90764330e3b1057b1e666d5ecd5a2efeaa6a105bfc858431b88ed7fe551eb32ac0af27c66a9803a3bcf87634c66c7066dd0197a3cbd2d6f4e65cfdb8f3daf9f3ca5c4f4e0add45f5541aa18d041f706e4fa87c34e9a223d88572eb50083ee8c7c475df568bc73bd08c0f0deaa374afb1c178d0dddb236e15a8bc2385ed3f52b8761e637887407a20aec3e99ec830dae3167ef0cdb3f3ffd200d83b75b749690b9e25e2171d072ca56f71baecd21f7d45a12c91b2c0fb3fea3b158e54648284bb0095b36244b0b121f9f1384ce9004365e7772fa30828250f51985f1b17b2d2f80a33e8fc6d8565ea15cdaacd42a87bd7c9408b1fe1c770665bdded754bc2ff2ef91b973a86b99f1059c6f227246a698b38541509dd5449fce60d386224183b7dce1b3884f7bae1c2e4eb594510b5ca585279d9041df8817b0619", "signature": "f0db63a1bc7624161ca0063853b2dee45fccd22471e012366f868a4a9c74654e13f1a315ad83916ebfb8dc31a420f83cf645c4c9d16bb4d5d99d23c7b43e2300" }, { "secret_key": "41cf071f4842ecd494191b8cf28cc0923185ef1b07458a79a59a296d3549822e", "public_key": "6dc8e446db1da353b58d0c45d8b4d816ba59e25bb680712d62d6d3dbf78d0698", "message": "daeb5f0e84f1590bca2b9d9719ef5d1cfa79e0583446332f18e9e4feb0b1f15340297ac9ad6724c85bb16558ea54eb5d702a47248badc6252a804371b74cfe1062d1dba1ec68fd1d4dd029cb55034bbf61068251eff3983636f6debd5727be91993b3e4d0abc96ec196421a47b7893f83986d6c0323f0d19aaf2cde9d3565c104c9d3176ecb5ed5e173fee52b5a0c42b6ab2fcb1ccba9649c2c67c520e9b96cea693df3e58609ad6a0bd522efaaf03858d245dd0a38f84a2fb1020f4dd97c3aeef0e24477d30d256701e900bef26a8a6269ab660d74293a2bf1d20c2cfaebb7c2820f5f5b07453bb69ee769b52391539f0c606d22eb3923ee6f5a1d46050af90f011f851ace76327d3d18c48170a9a25b04b770fd938ef8a30b7bd03391dd36c516b62f0cb78670740e00e69595c418d967253820b754c4fd666e3cce16ee0c94183bbea706fe298e1c99ddb821217ed9008cc8e8b83bc8b819915b07b146fe745024ac3c46116cb4cce5e32ec5d7524a2388d9fe297eb02811af4546fcd5860e14c0d13f03dd75a4249615900078a3c358c5342962bc1beacf68c246821a459ab5321ec9f574f49d10389f40f14ddfc8513ffe3deaa7336035a675fa5858b490c5d247780064adbaf75a76335eec9ab918771b0b1df5147642aef4a166ab172ed601fed210f6c0cffd91869f7490b57e7c65241863e7e8c0a26eba63b5342d0fd8214ac731e1c438d0177115f6a19e0935c7af6bc7dbeb75511d9bd8e63e3e2f47ab0dd1cedd7b180d74a4b44d461197aefdd3620465166a39b45395043ce8874cdd72c602bd3d2eecbad3466b5cb1aa41ae92a8afef2d764cec0c449d27efac437938f280bea9c50a582e57c27f9b3de872f0c", "signed": "41052bc417b24dc48383966af0143f9c0ba85bbefbdaf791b16a4dad1f570eb80703c0a2cdeb2f7ad6dcd3fa7bdb5c225e869cd8fb278dff0667d38accf3db08daeb5f0e84f1590bca2b9d9719ef5d1cfa79e0583446332f18e9e4feb0b1f15340297ac9ad6724c85bb16558ea54eb5d702a47248badc6252a804371b74cfe1062d1dba1ec68fd1d4dd029cb55034bbf61068251eff3983636f6debd5727be91993b3e4d0abc96ec196421a47b7893f83986d6c0323f0d19aaf2cde9d3565c104c9d3176ecb5ed5e173fee52b5a0c42b6ab2fcb1ccba9649c2c67c520e9b96cea693df3e58609ad6a0bd522efaaf03858d245dd0a38f84a2fb1020f4dd97c3aeef0e24477d30d256701e900bef26a8a6269ab660d74293a2bf1d20c2cfaebb7c2820f5f5b07453bb69ee769b52391539f0c606d22eb3923ee6f5a1d46050af90f011f851ace76327d3d18c48170a9a25b04b770fd938ef8a30b7bd03391dd36c516b62f0cb78670740e00e69595c418d967253820b754c4fd666e3cce16ee0c94183bbea706fe298e1c99ddb821217ed9008cc8e8b83bc8b819915b07b146fe745024ac3c46116cb4cce5e32ec5d7524a2388d9fe297eb02811af4546fcd5860e14c0d13f03dd75a4249615900078a3c358c5342962bc1beacf68c246821a459ab5321ec9f574f49d10389f40f14ddfc8513ffe3deaa7336035a675fa5858b490c5d247780064adbaf75a76335eec9ab918771b0b1df5147642aef4a166ab172ed601fed210f6c0cffd91869f7490b57e7c65241863e7e8c0a26eba63b5342d0fd8214ac731e1c438d0177115f6a19e0935c7af6bc7dbeb75511d9bd8e63e3e2f47ab0dd1cedd7b180d74a4b44d461197aefdd3620465166a39b45395043ce8874cdd72c602bd3d2eecbad3466b5cb1aa41ae92a8afef2d764cec0c449d27efac437938f280bea9c50a582e57c27f9b3de872f0c", "signature": "41052bc417b24dc48383966af0143f9c0ba85bbefbdaf791b16a4dad1f570eb80703c0a2cdeb2f7ad6dcd3fa7bdb5c225e869cd8fb278dff0667d38accf3db08" }, { "secret_key": "a2c8e161a8d9d6e888c3d09b0b972737307a2cbd2acd7ccd804d2431ac6c58d2", "public_key": "3a325775886732deca406857a8056010aaea2875545ba6f3df30754571386992", "message": "83a3bebcac5f28c5433e3c4f1e7bf5d2e4dcd2f5e59dbee0a83b07025715350746f85675f1dfea374aa7d794287b892ef9097ff6d2e122f0a656fba0798cdcfcb3645dfcfd788c740c0fd04520e7a06a02a05829630a2bf0cdfe2ecca009ec44049946bb1d2326ddd61d7ec640bf69eb44fb23cc1ff478c570c75db7e766e35b7c43db73680d1407a94399fb621baf3845745c1c4ed0b9f0b485be2d53c568545ddf18775a837a05d9c9157b084e8cd01fc324f07f116877e4075dba2432c8a7752e9e939586ad93f0c0aa5edac94b8d82e5449997b15b8c8961589c442821aa83b60239ec5f158c3f5e9ec5bea5115d5fed61918e8fcd5bce61c777f20b6bfe803a69c6fc794ab8c57df271da863872a61335b1fa29f4608ff037f712069809ca642a0307c79aa92e10cb893a29d17201a0b6d1b46a7212b3baec9703c0b0392ba6b76e5c9c10f83599b81ea22283f9547aacdaa7f30896d1ff731e11fb9e56ad06030417119805bab63521496c3bb92a12f5e55afcf60ed4217737f3046b16ca506657a6d696d75a6d8e18e9efe2b08c8b1fa0728238e27cfb322166eee4ee76968b777b50ee6a2b804e1e9b46016620132b6588718d978ca2c0026979c400d3c5336751210f0b00d269ec8f4e2f9559e180332dd270e50cc9465c5558936355521bc3c9560fc19ec14242121e6bb2fff8f50337fc264acf1ac1704328334b3b52cba96d9303b1b5db859dae31d80f1711fba251e10b4d122128f9faff6872d0c0b81eef59541f832b0a9df3a4cdd591c87736b1aecf242c275a10c3fd67839dad4ef399b9494ecd77f7ba5b5d4f2ca304e5b22921307cb18fa64aa3d01c4411c8369ccede465ee369ee637d43d28826bf60ddde", "signed": "560d01b94df11d83347752ff51b3545ef55c5632ae7c8efb11aadd8312def72562e8f5d75ece10ad46bc96c860deece39e634a5f50654d4cdba84a8e6f70240a83a3bebcac5f28c5433e3c4f1e7bf5d2e4dcd2f5e59dbee0a83b07025715350746f85675f1dfea374aa7d794287b892ef9097ff6d2e122f0a656fba0798cdcfcb3645dfcfd788c740c0fd04520e7a06a02a05829630a2bf0cdfe2ecca009ec44049946bb1d2326ddd61d7ec640bf69eb44fb23cc1ff478c570c75db7e766e35b7c43db73680d1407a94399fb621baf3845745c1c4ed0b9f0b485be2d53c568545ddf18775a837a05d9c9157b084e8cd01fc324f07f116877e4075dba2432c8a7752e9e939586ad93f0c0aa5edac94b8d82e5449997b15b8c8961589c442821aa83b60239ec5f158c3f5e9ec5bea5115d5fed61918e8fcd5bce61c777f20b6bfe803a69c6fc794ab8c57df271da863872a61335b1fa29f4608ff037f712069809ca642a0307c79aa92e10cb893a29d17201a0b6d1b46a7212b3baec9703c0b0392ba6b76e5c9c10f83599b81ea22283f9547aacdaa7f30896d1ff731e11fb9e56ad06030417119805bab63521496c3bb92a12f5e55afcf60ed4217737f3046b16ca506657a6d696d75a6d8e18e9efe2b08c8b1fa0728238e27cfb322166eee4ee76968b777b50ee6a2b804e1e9b46016620132b6588718d978ca2c0026979c400d3c5336751210f0b00d269ec8f4e2f9559e180332dd270e50cc9465c5558936355521bc3c9560fc19ec14242121e6bb2fff8f50337fc264acf1ac1704328334b3b52cba96d9303b1b5db859dae31d80f1711fba251e10b4d122128f9faff6872d0c0b81eef59541f832b0a9df3a4cdd591c87736b1aecf242c275a10c3fd67839dad4ef399b9494ecd77f7ba5b5d4f2ca304e5b22921307cb18fa64aa3d01c4411c8369ccede465ee369ee637d43d28826bf60ddde", "signature": "560d01b94df11d83347752ff51b3545ef55c5632ae7c8efb11aadd8312def72562e8f5d75ece10ad46bc96c860deece39e634a5f50654d4cdba84a8e6f70240a" }, { "secret_key": "d3d188b390baccd95024526146b82b9184e197e46a9340a0e6ec18bf75be7fc5", "public_key": "d8f794948aa6986100214e9b7b9024420806b4c67846d5bd506113b353a2ea3d", "message": "5e65658e420375433fd7c1f6be678841e58104f10b4c676359d84fce7992f5c57557d738f830b505fa0c2b9eabf8d1a9f81fe8f315d662e2b84ce95299ebf4e503b5e1f7f8cdb668ae733f3d0cdd4c742ab5f272bea4f18d183e8923847662f9a39cd4b14ec76d11032fe573c26201aef66601cec683e34b89afd964e987801c706a85e27bab33701cd109bcf07b27ca67f022c494a04cbe5a9c6d63aad936cdf1a180fd05865198b96f06a78da95799d3aa4df3b170033c69e8fb04288c3546553b579c0ae3938062d3d8421cfa66268529bec0271e53b4ee7d099e7148a802df80fe5eedee1c903ae8ed4d640ead761262dd4014f25f9397ba3f1c08d83a3c485cfb55f89919aa972d6b7e7711be9e30c1eb96a0c3845309fb23dbc75b6991dd6e48cdde90e04f228e8ccf3ba23f2747cfb9d3381a9305f816f26cdde41c0220fad228ff6a8b095c77b6bae8fa3368142724bf1f5e0f6fbca5320c215b6ba86b91e3a8acf750e93fa7eaa65c4f785ef8421a19c1e27bc24b428e08a90242abac9bd4aa03c656f8f46dc40b36152c1bd0def1acfc0da10a2fa1dc3da7ace5a8fd76227bb1a602390fe57afd32efe281f2ea6b2e4d2545cb88d2308d72691c9a52b4ca25231a0107f25d117cc935397621c683bdc8f22e810340f2cbac4ceaa3468665261879f0074200743e0de5f3e58308b98b04b8c7148a4e004e667e832b0084b5f2bdc6fdc959f2fc28a8d31d9a9e78e5d5f9c0b119e5ff1f68f7c0daf0c0f16947cca5b7ced09601e2ebed282ef2bf8fe9a27ed27fc5bcda8aed6c71bee3e7751004472689bbf6d9d07952a242ff870d7c3f5e1ffc2c1f40fc9ab7579b392b554f3dc588c03ab957431fe5d02cbc711ad489fe", "signed": "16976b267de96e38dddc8478075f6bdd7159e56334b2d2d1920946294f33cd6b7f9c50f8057f496cab5d94bb4dca262f9f0fdf9b1b64741f4b722d32efa822035e65658e420375433fd7c1f6be678841e58104f10b4c676359d84fce7992f5c57557d738f830b505fa0c2b9eabf8d1a9f81fe8f315d662e2b84ce95299ebf4e503b5e1f7f8cdb668ae733f3d0cdd4c742ab5f272bea4f18d183e8923847662f9a39cd4b14ec76d11032fe573c26201aef66601cec683e34b89afd964e987801c706a85e27bab33701cd109bcf07b27ca67f022c494a04cbe5a9c6d63aad936cdf1a180fd05865198b96f06a78da95799d3aa4df3b170033c69e8fb04288c3546553b579c0ae3938062d3d8421cfa66268529bec0271e53b4ee7d099e7148a802df80fe5eedee1c903ae8ed4d640ead761262dd4014f25f9397ba3f1c08d83a3c485cfb55f89919aa972d6b7e7711be9e30c1eb96a0c3845309fb23dbc75b6991dd6e48cdde90e04f228e8ccf3ba23f2747cfb9d3381a9305f816f26cdde41c0220fad228ff6a8b095c77b6bae8fa3368142724bf1f5e0f6fbca5320c215b6ba86b91e3a8acf750e93fa7eaa65c4f785ef8421a19c1e27bc24b428e08a90242abac9bd4aa03c656f8f46dc40b36152c1bd0def1acfc0da10a2fa1dc3da7ace5a8fd76227bb1a602390fe57afd32efe281f2ea6b2e4d2545cb88d2308d72691c9a52b4ca25231a0107f25d117cc935397621c683bdc8f22e810340f2cbac4ceaa3468665261879f0074200743e0de5f3e58308b98b04b8c7148a4e004e667e832b0084b5f2bdc6fdc959f2fc28a8d31d9a9e78e5d5f9c0b119e5ff1f68f7c0daf0c0f16947cca5b7ced09601e2ebed282ef2bf8fe9a27ed27fc5bcda8aed6c71bee3e7751004472689bbf6d9d07952a242ff870d7c3f5e1ffc2c1f40fc9ab7579b392b554f3dc588c03ab957431fe5d02cbc711ad489fe", "signature": "16976b267de96e38dddc8478075f6bdd7159e56334b2d2d1920946294f33cd6b7f9c50f8057f496cab5d94bb4dca262f9f0fdf9b1b64741f4b722d32efa82203" }, { "secret_key": "61917a975cb7ec564c708a565388c57236a66b697dcd5a7f10bae671572ac7f0", "public_key": "ecc0f0b99276e528f82b42f2efce8579f83e638c6acefd072828c04e434f55af", "message": "6e970e0b1c92a7f496a82d8ae80cfd0ccef1d2c799d41728f35ddcd603b421c2a5ab3b489e78f4b62297de437c5ad1a9683ff87fa28eb3cc38ce242af59419f9fd43fcaa54fc398992f8c8e31f2b33dcccd0ee11ba7b388e8d2a36ead067c6beced5890ab7d4a94f55dab92128a0f814c0e68971df57bd5078a7403175c7c2fdd4a52447153ab37456729aee33e5fc93db8e7f480309875ecf6db07ce7f3cac5de49e361275ca50b6b719f4b715b3e30863cbb3b7164ba9eb96ef3304b19ad4d74dce4bd25e77bbbbeff1ee7d1fb55b9c4f7fc4cd9bd55108afcf99c1a41cd6f6b1adb297b106c8ba24e3134f87dd8efe5cf85492291b94d6600958c28b9122fe6e01bd3e329e42d1926b89f7a8c40a49867e5aa3ad749bd98dae7d006b453609e7dae26364d9172be7283330121ed2b4027e0885118743a6ea0cb7dc27409a9b2820bcc242ea10a00937bf849201e0fb6199421f163e9794f2dd4b332014a09d3ee8071da787747f990f5179919027ddff7cab0f55e9afa8eccb16cc2dd3cbbead7ff7ec818c253393f748741f55407f7408ee33a42ae2d6ecb3fb600a71f30ab630606e553b43678e59854f3a2947bcf4ea0fcfedc314d8370d1266395fda3c9105e975952f60e3086bb82481513d6fe8adb4f95efb9a95b66d480d2bb171078cf40684ac69a789c7fb7fa425333d705db00066755df728de02df25bae34f1d7d49caffc51e9ba2b10b98fe4cd9d22b7764ed931edb5f0b554496e995391e0af0b8d1c7a8295a8d15a7c6556d29cb19e0855ca505ad01d2aa30928a84bc48959576d812d9b27b8e88879faa2806c0841360ecd0fe83f5b848fc12f658f1e7f40e561c2e78d3b0125210a92061c2db21ba660e8608ff5", "signed": "6abb3e377b5c80b74f77219c1a9e096fba0eb68990817acff12dba7f61c77ccf595fb6608552003cead06ca1317c9cd51ac4724b29f40921fb928433768764016e970e0b1c92a7f496a82d8ae80cfd0ccef1d2c799d41728f35ddcd603b421c2a5ab3b489e78f4b62297de437c5ad1a9683ff87fa28eb3cc38ce242af59419f9fd43fcaa54fc398992f8c8e31f2b33dcccd0ee11ba7b388e8d2a36ead067c6beced5890ab7d4a94f55dab92128a0f814c0e68971df57bd5078a7403175c7c2fdd4a52447153ab37456729aee33e5fc93db8e7f480309875ecf6db07ce7f3cac5de49e361275ca50b6b719f4b715b3e30863cbb3b7164ba9eb96ef3304b19ad4d74dce4bd25e77bbbbeff1ee7d1fb55b9c4f7fc4cd9bd55108afcf99c1a41cd6f6b1adb297b106c8ba24e3134f87dd8efe5cf85492291b94d6600958c28b9122fe6e01bd3e329e42d1926b89f7a8c40a49867e5aa3ad749bd98dae7d006b453609e7dae26364d9172be7283330121ed2b4027e0885118743a6ea0cb7dc27409a9b2820bcc242ea10a00937bf849201e0fb6199421f163e9794f2dd4b332014a09d3ee8071da787747f990f5179919027ddff7cab0f55e9afa8eccb16cc2dd3cbbead7ff7ec818c253393f748741f55407f7408ee33a42ae2d6ecb3fb600a71f30ab630606e553b43678e59854f3a2947bcf4ea0fcfedc314d8370d1266395fda3c9105e975952f60e3086bb82481513d6fe8adb4f95efb9a95b66d480d2bb171078cf40684ac69a789c7fb7fa425333d705db00066755df728de02df25bae34f1d7d49caffc51e9ba2b10b98fe4cd9d22b7764ed931edb5f0b554496e995391e0af0b8d1c7a8295a8d15a7c6556d29cb19e0855ca505ad01d2aa30928a84bc48959576d812d9b27b8e88879faa2806c0841360ecd0fe83f5b848fc12f658f1e7f40e561c2e78d3b0125210a92061c2db21ba660e8608ff5", "signature": "6abb3e377b5c80b74f77219c1a9e096fba0eb68990817acff12dba7f61c77ccf595fb6608552003cead06ca1317c9cd51ac4724b29f40921fb92843376876401" }, { "secret_key": "7ba25f2797a2836f379d6bbcbe9abf4f2def5e52f72bd9e0b006571022fac2f3", "public_key": "6c2ed4e8c0124d5d0540796d3945d1de71aa6969e6abea0f1b0e6fc429c7046f", "message": "171a3409878097b3b22b2c00660b46e542c2164c00bbee54554837940e70f03da9916a40f9bde8288f45e47bef7ffe4e557cd4474045e740fd959d984f4ec81da88d44a373c1eda0cfc6b08e351373d3b82ab0902df8063fd908e703e0cbec410ab5cdfeaae00188ce2ad42b8bf04f7daa5f0ee333a6f9311b4ad9810952d5d5a64b20f37e845415fc3cdd616febec50db296fb3f3bb7f6b366bbe52e4897a05617bf7c981a62edcbbbe5da4c39cafa869aa2b2734e6cfed90ed8be75949390ee44566892455b890cf568b945aabb758d3854be6539f3b86bf01d188e48cf2626a0d7d381703be6ed1290dfb947bc2e0f83dbc58703080d7f5b9ef19aef930908f68f0c80010a9401b303a9f6da805bb8a0ed0f39413eefedf919ffd8ea6391bf95d4229604e49457b8e23bec611484cc7f9832dd95bdc3ad177c050f4ab633dcdb3e691f5902873b38cb0720b9113357fe0cfb98a68cccb5d5f0809d59a375cf7b5a275d43c4c34ff68e448526e8e1aad44e20008a232afbcf532a42b50a025a1b2ee4e077eb0125a593d51a200ec20d872c05838ad36aaaeeccc3ed9ef41f6d122670217d5c08f6e13c172194589acc3c59f7ef790c7c85aa6d5eb69d4c89a72f5e7c9246985c1ac0c5d197f76a73e3774839d4aa2096aca190a30f4aac54057b64f358e0e06400c0df2f876412d34484c4344f4d7c866517d3efba4a90fa7144c9ba5db3361db5769403ec81626a511f93e30f8586eadfcafd9a36ecff8d24b42079ada8e579ac30851177bce9038b0e1300072d68efdd723f6355064843275815a66b9d73a1299aa59a1812f6452fb4115ea2b1f9ff4a99690596e3f2022d81ed874dd67e6189ca0e68b9304e993a95b66665e0d074c", "signed": "f1f590a907ba980eb0d648ab4ded5f92faf7cb851d81d858a78fa6b77cbbe12f64d20df52771a7d5e539a152d731e1903d4211fdcfef9a48b46c8fd5394ca009171a3409878097b3b22b2c00660b46e542c2164c00bbee54554837940e70f03da9916a40f9bde8288f45e47bef7ffe4e557cd4474045e740fd959d984f4ec81da88d44a373c1eda0cfc6b08e351373d3b82ab0902df8063fd908e703e0cbec410ab5cdfeaae00188ce2ad42b8bf04f7daa5f0ee333a6f9311b4ad9810952d5d5a64b20f37e845415fc3cdd616febec50db296fb3f3bb7f6b366bbe52e4897a05617bf7c981a62edcbbbe5da4c39cafa869aa2b2734e6cfed90ed8be75949390ee44566892455b890cf568b945aabb758d3854be6539f3b86bf01d188e48cf2626a0d7d381703be6ed1290dfb947bc2e0f83dbc58703080d7f5b9ef19aef930908f68f0c80010a9401b303a9f6da805bb8a0ed0f39413eefedf919ffd8ea6391bf95d4229604e49457b8e23bec611484cc7f9832dd95bdc3ad177c050f4ab633dcdb3e691f5902873b38cb0720b9113357fe0cfb98a68cccb5d5f0809d59a375cf7b5a275d43c4c34ff68e448526e8e1aad44e20008a232afbcf532a42b50a025a1b2ee4e077eb0125a593d51a200ec20d872c05838ad36aaaeeccc3ed9ef41f6d122670217d5c08f6e13c172194589acc3c59f7ef790c7c85aa6d5eb69d4c89a72f5e7c9246985c1ac0c5d197f76a73e3774839d4aa2096aca190a30f4aac54057b64f358e0e06400c0df2f876412d34484c4344f4d7c866517d3efba4a90fa7144c9ba5db3361db5769403ec81626a511f93e30f8586eadfcafd9a36ecff8d24b42079ada8e579ac30851177bce9038b0e1300072d68efdd723f6355064843275815a66b9d73a1299aa59a1812f6452fb4115ea2b1f9ff4a99690596e3f2022d81ed874dd67e6189ca0e68b9304e993a95b66665e0d074c", "signature": "f1f590a907ba980eb0d648ab4ded5f92faf7cb851d81d858a78fa6b77cbbe12f64d20df52771a7d5e539a152d731e1903d4211fdcfef9a48b46c8fd5394ca009" }, { "secret_key": "d1e1b22de5e04c9be4651dd73995a3666cb5352c65ac7b7051b366fe1ac0c310", "public_key": "12fe56f1012d5c12f135ed5982f382ae5f1143bc90e8cb8c93051754551ee90a", "message": "c7f218b5aa7aae1799625a56c4d7d7b02637e572f1411a6122f113791aa3c628e819602fb4f0335a6123013fa64e9fdc4e4ae497bd169c2fa77bc236129717f462886b410893fa7809cbfdc892223b40ee041ebd4ec7ddab55be6081a1646643a9120baa46289acba15b3b48af3b7adecd69f43eede79d9b1957e1d8c3129e0fa0579d3d395370461b0e1255c9caa94e4725601cb9d0e2d60244d15b64e1f7bc9015590ad0991f12f8267311206e9eb5d16add0ba5218fce5fffe1c9ce5ffe1f731132f4b12cacb02f97451710846b7f824f4fa9e08919266469789c00ce0d94d38fa8fec3f51f2f886e9db09b804470b19ec9e80663f155b4984d2bbd0b2ce99302e06c64444b696e3129fcef34c3dd00f7ab5beda747a3fc6339192b740f3569b67dbd6ffa39e271faa400d9616bff86ec49a659def2e7f5d451f2a2b35e662a6e7cc22f1e5cdcde8a59988135b7e76562743c1e6a099901b3ef97cbff23f209bd7088c2f03245279a1dc78dddc1bb0c1d35100357882126b328d3d94e0871b60be253fd1b6ecf03c1db731d9eed0edf2b2643230780a4d66e99179aad1b82402e55f6d785ebc80f8dd2fd2beb09f31035df62c17f428ed0b2d56508db31e6d2dd5fb69ebeeea3257070cf2fe67d42d28816a55dbae0b185db4421bbfdaefc79c08cdc1accf71642562ec70036da2bbafa4a891954c4ee4049b55c640e91930e39e3ef1018dc1647f26942c6dbdf4d56e41eb2c898c821fac17cc273e8e4aa5608a812cf4b82f96019c252d56e7805298ccbe8ce40b0bd0f933b884c0faf97a958b20408b8a5297cce5527b2ca212806e72a3264457a7fac8662b82ca233e1c7758dc6e4f1b9995863f25f747bcee43b639b1f8f2026d2d2", "signed": "abaab4fa6aeb0a0b34ee0d613a0af049edb4cedbfe9d3bebe9c00618b115b9d1fa524ec3495e1330b0936181eabb14299faccc40eaa8cca57ed324b7a6420c0ec7f218b5aa7aae1799625a56c4d7d7b02637e572f1411a6122f113791aa3c628e819602fb4f0335a6123013fa64e9fdc4e4ae497bd169c2fa77bc236129717f462886b410893fa7809cbfdc892223b40ee041ebd4ec7ddab55be6081a1646643a9120baa46289acba15b3b48af3b7adecd69f43eede79d9b1957e1d8c3129e0fa0579d3d395370461b0e1255c9caa94e4725601cb9d0e2d60244d15b64e1f7bc9015590ad0991f12f8267311206e9eb5d16add0ba5218fce5fffe1c9ce5ffe1f731132f4b12cacb02f97451710846b7f824f4fa9e08919266469789c00ce0d94d38fa8fec3f51f2f886e9db09b804470b19ec9e80663f155b4984d2bbd0b2ce99302e06c64444b696e3129fcef34c3dd00f7ab5beda747a3fc6339192b740f3569b67dbd6ffa39e271faa400d9616bff86ec49a659def2e7f5d451f2a2b35e662a6e7cc22f1e5cdcde8a59988135b7e76562743c1e6a099901b3ef97cbff23f209bd7088c2f03245279a1dc78dddc1bb0c1d35100357882126b328d3d94e0871b60be253fd1b6ecf03c1db731d9eed0edf2b2643230780a4d66e99179aad1b82402e55f6d785ebc80f8dd2fd2beb09f31035df62c17f428ed0b2d56508db31e6d2dd5fb69ebeeea3257070cf2fe67d42d28816a55dbae0b185db4421bbfdaefc79c08cdc1accf71642562ec70036da2bbafa4a891954c4ee4049b55c640e91930e39e3ef1018dc1647f26942c6dbdf4d56e41eb2c898c821fac17cc273e8e4aa5608a812cf4b82f96019c252d56e7805298ccbe8ce40b0bd0f933b884c0faf97a958b20408b8a5297cce5527b2ca212806e72a3264457a7fac8662b82ca233e1c7758dc6e4f1b9995863f25f747bcee43b639b1f8f2026d2d2", "signature": "abaab4fa6aeb0a0b34ee0d613a0af049edb4cedbfe9d3bebe9c00618b115b9d1fa524ec3495e1330b0936181eabb14299faccc40eaa8cca57ed324b7a6420c0e" }, { "secret_key": "df294e477b1b91c5ac5b98c330d222d7cd2d53e7d0bc0ca403df4ec75327a274", "public_key": "5f0bd22f2f1896d1563b4f6940c7df89efc258c0ff6c2fcd674daf4f59fcdb60", "message": "3e42d668409630cbb84812ac7ff1154f70fca8bdff3f1a040fa3af868aa1c4e91508b1aefdf5c3a8b4b077a4d162d2c05bd364fbbe8c5a08314c2e07dffbd6e8dd2e08a0dcc96ea92ddd4c97f79db9425a6c6b34c46043d09a68b7687236a918d21a561610a13ac5e446e0881bb26cc8e28aad1654f867ad82ae33f8f7a78a65be57699475516a1a8746843e93a1a294354624fac04d452ccfbe4fdd92a951aaa07d26676d5cb077a5000d439c124276c0dbcf86e7aa153cc24b5aff677c6badc261c289f4a4ae519b2e2fff312fbf0f5b4c4698f6aedd8fcb1d2348942de3fb73ba27f6db14c2f09180356e5fcae1adf65e22425f8c27f19e989483506e5df57a1b613a22e345038b3ea91c0f78ffff46383f38c72225358a34570d6f664a17454a151613f01cba777f62ec831875ec5e27d257f180b6366cb183107c40f50b01b2b9bf91b3b5549ed931a3537aa41689f72b257a6aa39cdc6fcedf143983be5bffe3ae2b29f82f882122d66a7925f5a710826c0dadb7e4fa4ec079ba2e76dada433f3077cb1ef74613fc5dbf8258b6da7c73c866372457ed500f97f9907e1fc26353c70ba3bd9c36151d46865d2c65986562485cf8421febbe777c73e6cd0026d66d35128b9f8f33264aeb56bd3e4b8d1f5266411ef3b23b76b36d4c9df3c512fd560c2be52ac523c19377ad2adc0e8c309cf5bbf72d9eb85d65a94847d497d8d102424fb84381666ecb1c35a3725d7d9e9284fdebb6b362aa6a9c6fb37aba87357f574c0e63b4497d498ffbb7d0692d784b4b18ce9f9150c146d3d18c382eda04938c69d0778f2902d5235a5652b97cef6d5f60da6bd7ed4ff97cd94d4939caca3b6baa3cfdac04cda95596f467cbc6cbcd9264167743eac1", "signed": "9945ab73b58562b355dabc4e2b6be7e05f37f89571440ccc32c1a94737095b7866747d21007000a0f0e351114b88e0138b55df44fe72ebe9591410e707fa9d023e42d668409630cbb84812ac7ff1154f70fca8bdff3f1a040fa3af868aa1c4e91508b1aefdf5c3a8b4b077a4d162d2c05bd364fbbe8c5a08314c2e07dffbd6e8dd2e08a0dcc96ea92ddd4c97f79db9425a6c6b34c46043d09a68b7687236a918d21a561610a13ac5e446e0881bb26cc8e28aad1654f867ad82ae33f8f7a78a65be57699475516a1a8746843e93a1a294354624fac04d452ccfbe4fdd92a951aaa07d26676d5cb077a5000d439c124276c0dbcf86e7aa153cc24b5aff677c6badc261c289f4a4ae519b2e2fff312fbf0f5b4c4698f6aedd8fcb1d2348942de3fb73ba27f6db14c2f09180356e5fcae1adf65e22425f8c27f19e989483506e5df57a1b613a22e345038b3ea91c0f78ffff46383f38c72225358a34570d6f664a17454a151613f01cba777f62ec831875ec5e27d257f180b6366cb183107c40f50b01b2b9bf91b3b5549ed931a3537aa41689f72b257a6aa39cdc6fcedf143983be5bffe3ae2b29f82f882122d66a7925f5a710826c0dadb7e4fa4ec079ba2e76dada433f3077cb1ef74613fc5dbf8258b6da7c73c866372457ed500f97f9907e1fc26353c70ba3bd9c36151d46865d2c65986562485cf8421febbe777c73e6cd0026d66d35128b9f8f33264aeb56bd3e4b8d1f5266411ef3b23b76b36d4c9df3c512fd560c2be52ac523c19377ad2adc0e8c309cf5bbf72d9eb85d65a94847d497d8d102424fb84381666ecb1c35a3725d7d9e9284fdebb6b362aa6a9c6fb37aba87357f574c0e63b4497d498ffbb7d0692d784b4b18ce9f9150c146d3d18c382eda04938c69d0778f2902d5235a5652b97cef6d5f60da6bd7ed4ff97cd94d4939caca3b6baa3cfdac04cda95596f467cbc6cbcd9264167743eac1", "signature": "9945ab73b58562b355dabc4e2b6be7e05f37f89571440ccc32c1a94737095b7866747d21007000a0f0e351114b88e0138b55df44fe72ebe9591410e707fa9d02" }, { "secret_key": "70c6859f08cf42b4bda9eb62979dffb7cb08eb3dabe93fe94b01384617cf6730", "public_key": "401c9e2033e2259fb6383b3e8b9e17b3f2062746bbe648cf484516db0f2f1b06", "message": "dd0609ea159921395d11fb2da8ea4f747d7f74b58052e01cad40a271fa0bbeed91020f4f0c0846c4f07778a6aa768eb51712294e9e1f32a602b152514f5e6d39f9e08f7a7812bd900c10a91469e47e8a78e54cd4bd7cfededec171ef373f1c4f9bbc2c81402fb14ed0bfac8d043f117d6124521afae0916a510d568acfa3aa3301bc979ac28d551dbbea6ceac4c212aa8c8492b3613ae7395dd4125fc4c25d5b4d99230821d4b17ec2ee6be7d604195a2154333b973526580ca7ef9e30c6c1dd42ef2afe42b11b1aa49b9ccabaca17091eeb380ec5e34ad1e3827cc60dacf144286c7892590bd2671a8dc5f3a702c1de7cd3b42c1b150b09c3e58ef6943b45d89d41df361f1d5c25565591b6ac8deaa73676531f6e5abe5804b0097f8d45ea2939177333cacef12e4b71fe4936bafe00747a8930bcea55b8fd84a01f6df84e7acb931fc7c01ddfd63deec3ad3e69dfa2b73550583d5747eee96c5536368797e247f23f537d79079ab6da314102c7443d41960e3a3d8c359c4a4ec626fcc44e110ea744d417aa850db8ecdbfe340a962db0d8c57dc517be8b40d14de97b1e9e0426447fde0a04e50679c53ba1aa3cdc38c7ede6db6c054b1e9ce7deadaf93ebdd470791535f3ecfabf3416355f7a18a38afe6bfe507ef08c4373a4a69dee1fcb65b1631a0de1488649d0bb2679a9a45f67820b2a4a1e5a548072da7032d172555e788cc9860ebb3c0c359493751b0c2c950a7fcf4803c147f9340fc93d85f1efa57b39081b92d93473fd23516c4950ed4b29a2ed3a042ae3d92a1e52cb709636fc7272fd747208bee2b16d191e4c6deb27672aa34e43914cff2055ca4ee8ba3e1dc58a679c7f7dee2c1d53e28750970f57d85eab1c26b89bb73e0b1", "signed": "0f03a4f15c339b4f7b88b4e21ad9e3d6bbf3effb7b678ffa500d47383b71a7454f62907b56f59f9b9af6d5b2a0fc1c737a64105195089899f57a2c9dba509e0add0609ea159921395d11fb2da8ea4f747d7f74b58052e01cad40a271fa0bbeed91020f4f0c0846c4f07778a6aa768eb51712294e9e1f32a602b152514f5e6d39f9e08f7a7812bd900c10a91469e47e8a78e54cd4bd7cfededec171ef373f1c4f9bbc2c81402fb14ed0bfac8d043f117d6124521afae0916a510d568acfa3aa3301bc979ac28d551dbbea6ceac4c212aa8c8492b3613ae7395dd4125fc4c25d5b4d99230821d4b17ec2ee6be7d604195a2154333b973526580ca7ef9e30c6c1dd42ef2afe42b11b1aa49b9ccabaca17091eeb380ec5e34ad1e3827cc60dacf144286c7892590bd2671a8dc5f3a702c1de7cd3b42c1b150b09c3e58ef6943b45d89d41df361f1d5c25565591b6ac8deaa73676531f6e5abe5804b0097f8d45ea2939177333cacef12e4b71fe4936bafe00747a8930bcea55b8fd84a01f6df84e7acb931fc7c01ddfd63deec3ad3e69dfa2b73550583d5747eee96c5536368797e247f23f537d79079ab6da314102c7443d41960e3a3d8c359c4a4ec626fcc44e110ea744d417aa850db8ecdbfe340a962db0d8c57dc517be8b40d14de97b1e9e0426447fde0a04e50679c53ba1aa3cdc38c7ede6db6c054b1e9ce7deadaf93ebdd470791535f3ecfabf3416355f7a18a38afe6bfe507ef08c4373a4a69dee1fcb65b1631a0de1488649d0bb2679a9a45f67820b2a4a1e5a548072da7032d172555e788cc9860ebb3c0c359493751b0c2c950a7fcf4803c147f9340fc93d85f1efa57b39081b92d93473fd23516c4950ed4b29a2ed3a042ae3d92a1e52cb709636fc7272fd747208bee2b16d191e4c6deb27672aa34e43914cff2055ca4ee8ba3e1dc58a679c7f7dee2c1d53e28750970f57d85eab1c26b89bb73e0b1", "signature": "0f03a4f15c339b4f7b88b4e21ad9e3d6bbf3effb7b678ffa500d47383b71a7454f62907b56f59f9b9af6d5b2a0fc1c737a64105195089899f57a2c9dba509e0a" }, { "secret_key": "c5962961815b57cd162403ce08e4105ddb8aae2d3f533fb49cc236b5ff504d6e", "public_key": "dbade72236ba12d4977ba46c364bb69a887ff402de91d47afa9b93c95be71e7e", "message": "4ae4148d79ca9425592aa240bd153424a3bf4ae27395872ce5728ac7613596a77d5ce8565d8d6e1b5935b3906cafe1ff888ebc9815e04a624dfc4c6907b85f6f1a0dbddff62e9151220d474462cb9f13d89d3a93a00ba2b60f7e7ca63da17a6379d673551e790b5911727c906dc94f86d8277546c1564a45573a7743bb8a138cde87b3b2f28e5e245940a51e7c458cf8c5f0a70275962553e0d2390d171db44c2f7a5c9e9f93b90f7a5f54f191b0d875bad7e0beb980c2a3365cd7b9208724f4654418117e16ef7134e3e2794b6f9e80ecabeca3254e704c21b7ad30c5dee017ea2533fcd94251e55ae75a8cc6db6674b39c88ca42006043d6bd9b00ecf64ceafeeb402b1f22fd891f2d11c515c1aba6a2d4c0bd2181a48e43fd1c0af91f9b7b7d37f3dcd9e4c0a759748467d348a8b116df6a4eacf178aecccd3066e92dca45da7a3e319f3771eb3490022193c5b652f045687e1705f2e5691c134be4006353d7ecd0e918d5de0f3b87809fca4acfab94e1148ff7cf07f7cfd0c745dd2be01a24a5e069280698bc3f5400a6dcd08e44595c0388e44833768fc49104ee115bdcb02bfbda179d164ce969936629f2335601b56fe8f785cca3805f0403872c62f73c3ce80563d070e976d8ecc51124e2cace7ee18699047cb0f8fb8d9c59b8a60d12c08a09fce58fd92cd36db6a8e89d118cf88a92dc8a2600bd95f5a8e85db5cdbb249ca812ca209c7618051c4564a3a0e192b7e45992456c87d17412c11adead526ab8db21452f7471d17f2ebc90015450edf4f0a44fb2f4905f74d70275ccd89b93a650473c02a7da0cbc67915ceb7a1ea59fa8884472dc917ee9d246339c5926843ecf53fafdc56a695601a276c23a843e4d30f89c97c9eee6dfc7", "signed": "8101baef004eb6f5ad4de0979ff36d3439b8212bdc928942e431915b3fd18bc2ad67b26f18941dcb16d2c29191421e779fed622fd9f582644eaadb3fe5c098034ae4148d79ca9425592aa240bd153424a3bf4ae27395872ce5728ac7613596a77d5ce8565d8d6e1b5935b3906cafe1ff888ebc9815e04a624dfc4c6907b85f6f1a0dbddff62e9151220d474462cb9f13d89d3a93a00ba2b60f7e7ca63da17a6379d673551e790b5911727c906dc94f86d8277546c1564a45573a7743bb8a138cde87b3b2f28e5e245940a51e7c458cf8c5f0a70275962553e0d2390d171db44c2f7a5c9e9f93b90f7a5f54f191b0d875bad7e0beb980c2a3365cd7b9208724f4654418117e16ef7134e3e2794b6f9e80ecabeca3254e704c21b7ad30c5dee017ea2533fcd94251e55ae75a8cc6db6674b39c88ca42006043d6bd9b00ecf64ceafeeb402b1f22fd891f2d11c515c1aba6a2d4c0bd2181a48e43fd1c0af91f9b7b7d37f3dcd9e4c0a759748467d348a8b116df6a4eacf178aecccd3066e92dca45da7a3e319f3771eb3490022193c5b652f045687e1705f2e5691c134be4006353d7ecd0e918d5de0f3b87809fca4acfab94e1148ff7cf07f7cfd0c745dd2be01a24a5e069280698bc3f5400a6dcd08e44595c0388e44833768fc49104ee115bdcb02bfbda179d164ce969936629f2335601b56fe8f785cca3805f0403872c62f73c3ce80563d070e976d8ecc51124e2cace7ee18699047cb0f8fb8d9c59b8a60d12c08a09fce58fd92cd36db6a8e89d118cf88a92dc8a2600bd95f5a8e85db5cdbb249ca812ca209c7618051c4564a3a0e192b7e45992456c87d17412c11adead526ab8db21452f7471d17f2ebc90015450edf4f0a44fb2f4905f74d70275ccd89b93a650473c02a7da0cbc67915ceb7a1ea59fa8884472dc917ee9d246339c5926843ecf53fafdc56a695601a276c23a843e4d30f89c97c9eee6dfc7", "signature": "8101baef004eb6f5ad4de0979ff36d3439b8212bdc928942e431915b3fd18bc2ad67b26f18941dcb16d2c29191421e779fed622fd9f582644eaadb3fe5c09803" }, { "secret_key": "dee6866c7874c127029e96e025bffd35fcfdf4dc36966c15ee6293368013d379", "public_key": "08c94da351bb2bee72e6e196be748807583762c5296e05b1e529c47c6bbacec6", "message": "f1aa1977f5311b538b940ae442a3abc89aaccdcd0a79380a24258d4a9f1ce638fc2f5ba2e53f8e1fa6176f178d9024a77894c28cad42d629c793d68a02be9411b527acadae7e5c3851babb45b5fece329e29034cd42571083727f35aecad7c9be5954ec64e8f6ecab7cc0590e54156a4e1a45303849f7897e72cf2fbcd84f56c72f941dbb0b09a32e6386fbe18a43bb9bd8b793e4b9edd532103eab54d627117d28139b64e60fb0b81d09001bb2404d925e265babdc69f96b135e9e6ab7febb1ed3075d6aa2abd2bbf9b65fa9b3b7191ef37b633605910ee88f66eada79f00f536d380b82f2f4b5985112de004a56603f4436d8ff300f42bf5acdc7a4bf1ea9d4196c480495bacb0067630fcc000b4f279dd3f30f353276092d152c3f43efdc041deaa0bc5aaaba7f8bbd85e69c13742d678dbb65360aaf7b548a044c0ec60a57af650bc31973f832f961265bc2318f80775afd51f55194c42423f7bf4e0052f98cb206913ffea4886ecd27a4179b13773f947502e181bf1a1f2c62c6f08c20359f06df2b18127043b1070d0194ef5e5bfd37d227984cfb10989f21c71ad0fe3b81227d3a71789455eda383c22f4d2fcc72579f465e066f3d38befc024efef6c2e329649ce434d627367a900d07fe6234235c84656eac5dd0d788cf4cb31871824d66ae4bc89edeba1b36701298453e8da1e69cfb868095c3be6ed2182da1cff4905afd20731ac1ed984164737903c7d8bb0ad16aecf2fae337404fe35664515d93b701e2f878664454c0decd1c6558adace3cdb227507a51606f0a54df8dfaa420205dd57c65242ff24a405ef85c92d602886932b35fabe9c3bcebfc6235639e873fc2dd084c52cd6a7413b831d1cc99931373aabd847620eb69bb0fa", "signed": "b78ebd6d65b175d4bbd3d9a2082a0efe6e991cb2e403521eece00f418f2e956b66907880658b9e8e47699653d159132380d9ce1109af9c2757daf4cdf18c9c0af1aa1977f5311b538b940ae442a3abc89aaccdcd0a79380a24258d4a9f1ce638fc2f5ba2e53f8e1fa6176f178d9024a77894c28cad42d629c793d68a02be9411b527acadae7e5c3851babb45b5fece329e29034cd42571083727f35aecad7c9be5954ec64e8f6ecab7cc0590e54156a4e1a45303849f7897e72cf2fbcd84f56c72f941dbb0b09a32e6386fbe18a43bb9bd8b793e4b9edd532103eab54d627117d28139b64e60fb0b81d09001bb2404d925e265babdc69f96b135e9e6ab7febb1ed3075d6aa2abd2bbf9b65fa9b3b7191ef37b633605910ee88f66eada79f00f536d380b82f2f4b5985112de004a56603f4436d8ff300f42bf5acdc7a4bf1ea9d4196c480495bacb0067630fcc000b4f279dd3f30f353276092d152c3f43efdc041deaa0bc5aaaba7f8bbd85e69c13742d678dbb65360aaf7b548a044c0ec60a57af650bc31973f832f961265bc2318f80775afd51f55194c42423f7bf4e0052f98cb206913ffea4886ecd27a4179b13773f947502e181bf1a1f2c62c6f08c20359f06df2b18127043b1070d0194ef5e5bfd37d227984cfb10989f21c71ad0fe3b81227d3a71789455eda383c22f4d2fcc72579f465e066f3d38befc024efef6c2e329649ce434d627367a900d07fe6234235c84656eac5dd0d788cf4cb31871824d66ae4bc89edeba1b36701298453e8da1e69cfb868095c3be6ed2182da1cff4905afd20731ac1ed984164737903c7d8bb0ad16aecf2fae337404fe35664515d93b701e2f878664454c0decd1c6558adace3cdb227507a51606f0a54df8dfaa420205dd57c65242ff24a405ef85c92d602886932b35fabe9c3bcebfc6235639e873fc2dd084c52cd6a7413b831d1cc99931373aabd847620eb69bb0fa", "signature": "b78ebd6d65b175d4bbd3d9a2082a0efe6e991cb2e403521eece00f418f2e956b66907880658b9e8e47699653d159132380d9ce1109af9c2757daf4cdf18c9c0a" }, { "secret_key": "523623555995baaf2a27adcb1ebafaa802d23ef7abfa9775f2c9bfa07d64e0ac", "public_key": "d34deae6523e619dd1bfc8f3c4ca4b78b368c0f720035e144c3f2fc105d4ce21", "message": "0553e69ef211652d62bf281bfbdd37be22769d819746361c7d65ddd0fad677cc0438b301d1514578e0da58e55f729fa8e66ddeb7f973a818d24ed8fe027b8491179d07773fb5d2bb96aa85d6b3750454e50de91f9b88aee8aa68e6bb53edc66677b41e601a46ab4bb1e656e7fa5f0179933680a6ec9504275e7adf7a3248e63a0fc9c1ea5ae96cd0c65a89a77cec2b1fd8f4537e82c1c488a69a0ef64f58734d9e73478e1d1f123114ef66085e0ba319cb810b66af96d1308b1a2bd92ba2c265aa309ecd5557d402c3802cae8d7e95007fe610c2aa75fc66196c3fadfe997d6d5998e18d260e9da31da9218cbad103cbfc2c7547765d67e81f24ac83022ef51c6cc50864366a35f6b9b9af94e84caa9fd3d767c831f0967a61462fbcfcc803f12e3739039acd5dbe9366f05a33dbeaf360e2ddcbe5c443f80ef2ad62e03c1d5b70cdeab4a7dd41553064c8d152709deff82076b9071192376f51d4c2c71a84e89f2d9401320c2e459b3e243cca7c26fd098c264ac88ef638921d980b0ae9e512d372037d81adc48126d7c9e4b5afa57ec265d401b9653e928afb7dff9b48e295e470d6b52e88b39d0a40cb8eba249f8b13d81113db1d3e01ef75c722f269488e963cc8182704f8ca018e73dc0714e9a9fc79bc4363c28cb3984374f73b2aa8786e74e0159507a29883fe0ed1c600f525885f2f10ea006c39e59b925b765b1ede534257a1f40f2846584f069746b52f5600430a2863d7936095fbc22a6ada674d41b374e2b8b9a19fa712b5944533bb6d6ec43b89d4971b70205a6acd72a899da12618204db0c3e8267b845791693e0ae6a35f14da1f8f4dd174bce0318fb5a00f672ede42304cf04a62760577590f27e2dfa6e5e2795d66053b30af7f1bf", "signed": "b1871729fec83aea0aaa472b700acd094813fb7d57b909e0eaaf21ee931847addedd2be8533d0c305cb9cfe5080e76c2808b6e51c9826290ddb7b94b6f7d580b0553e69ef211652d62bf281bfbdd37be22769d819746361c7d65ddd0fad677cc0438b301d1514578e0da58e55f729fa8e66ddeb7f973a818d24ed8fe027b8491179d07773fb5d2bb96aa85d6b3750454e50de91f9b88aee8aa68e6bb53edc66677b41e601a46ab4bb1e656e7fa5f0179933680a6ec9504275e7adf7a3248e63a0fc9c1ea5ae96cd0c65a89a77cec2b1fd8f4537e82c1c488a69a0ef64f58734d9e73478e1d1f123114ef66085e0ba319cb810b66af96d1308b1a2bd92ba2c265aa309ecd5557d402c3802cae8d7e95007fe610c2aa75fc66196c3fadfe997d6d5998e18d260e9da31da9218cbad103cbfc2c7547765d67e81f24ac83022ef51c6cc50864366a35f6b9b9af94e84caa9fd3d767c831f0967a61462fbcfcc803f12e3739039acd5dbe9366f05a33dbeaf360e2ddcbe5c443f80ef2ad62e03c1d5b70cdeab4a7dd41553064c8d152709deff82076b9071192376f51d4c2c71a84e89f2d9401320c2e459b3e243cca7c26fd098c264ac88ef638921d980b0ae9e512d372037d81adc48126d7c9e4b5afa57ec265d401b9653e928afb7dff9b48e295e470d6b52e88b39d0a40cb8eba249f8b13d81113db1d3e01ef75c722f269488e963cc8182704f8ca018e73dc0714e9a9fc79bc4363c28cb3984374f73b2aa8786e74e0159507a29883fe0ed1c600f525885f2f10ea006c39e59b925b765b1ede534257a1f40f2846584f069746b52f5600430a2863d7936095fbc22a6ada674d41b374e2b8b9a19fa712b5944533bb6d6ec43b89d4971b70205a6acd72a899da12618204db0c3e8267b845791693e0ae6a35f14da1f8f4dd174bce0318fb5a00f672ede42304cf04a62760577590f27e2dfa6e5e2795d66053b30af7f1bf", "signature": "b1871729fec83aea0aaa472b700acd094813fb7d57b909e0eaaf21ee931847addedd2be8533d0c305cb9cfe5080e76c2808b6e51c9826290ddb7b94b6f7d580b" }, { "secret_key": "575f8fb6c7465e92c250caeec1786224bc3eed729e463953a394c9849cba908f", "public_key": "71bfa98f5bea790ff183d924e6655cea08d0aafb617f46d23a17a657f0a9b8b2", "message": "2cc372e25e53a138793064610e7ef25d9d7422e18e249675a72e79167f43baf452cbacb50182faf80798cc38597a44b307a536360b0bc1030f8397b94cbf147353dd2d671cb8cab219a2d7b9eb828e9635d2eab6eb08182cb03557783fd282aaf7b471747c84acf72debe4514524f8447bafccccec0a840feca9755ff9adb60301c2f25d4e3ba621df5ad72100c45d7a4b91559c725ab56bb29830e35f5a6faf87db23001f11ffba9c0c15440302065827a7d7aaaeab7b446abce333c0d30c3eae9c9da63eb1c0391d4269b12c45b660290611ac29c91dbd80dc6ed302a4d191f2923922f032ab1ac10ca7323b5241c5751c3c004ac39eb1267aa10017ed2dac6c934a250dda8cb06d5be9f563b827bf3c8d95fd7d2a7e7cc3acbee92538bd7ddfba3ab2dc9f791fac76cdf9cd6a6923534cf3e067108f6aa03e320d954085c218038a70cc768b972e49952b9fe171ee1be2a52cd469b8d36b84ee902cd9410db2777192e90070d2e7c56cb6a45f0a839c78c219203b6f1b33cb4504c6a7996427741e6874cf45c5fa5a38765a1ebf1796ce16e63ee509612c40f088cbceffa3affbc13b75a1b9c02c61a180a7e83b17884fe0ec0f2fe57c47e73a22f753eaf50fca655ebb19896b827a3474911c67853c58b4a78fd085a23239b9737ef8a7baff11ddce5f2cae0543f8b45d144ae6918b9a75293ec78ea618cd2cd08c971301cdfa0a9275c1bf441d4c1f878a2e733ce0a33b6ecdacbbf0bdb5c3643fa45a013979cd01396962897421129a88757c0d88b5ac7e44fdbd938ba4bc37de4929d53751fbb43d4e09a80e735244acada8e6749f77787f33763c7472df52934591591fb226c503c8be61a920a7d37eb1686b62216957844c43c484e58745775553", "signed": "903b484cb24bc503cdced844614073256c6d5aa45f1f9f62c7f22e5649212bc1d6ef9eaa617b6b835a6de2beff2faac83d37a4a5fc5cc3b556f56edde2651f022cc372e25e53a138793064610e7ef25d9d7422e18e249675a72e79167f43baf452cbacb50182faf80798cc38597a44b307a536360b0bc1030f8397b94cbf147353dd2d671cb8cab219a2d7b9eb828e9635d2eab6eb08182cb03557783fd282aaf7b471747c84acf72debe4514524f8447bafccccec0a840feca9755ff9adb60301c2f25d4e3ba621df5ad72100c45d7a4b91559c725ab56bb29830e35f5a6faf87db23001f11ffba9c0c15440302065827a7d7aaaeab7b446abce333c0d30c3eae9c9da63eb1c0391d4269b12c45b660290611ac29c91dbd80dc6ed302a4d191f2923922f032ab1ac10ca7323b5241c5751c3c004ac39eb1267aa10017ed2dac6c934a250dda8cb06d5be9f563b827bf3c8d95fd7d2a7e7cc3acbee92538bd7ddfba3ab2dc9f791fac76cdf9cd6a6923534cf3e067108f6aa03e320d954085c218038a70cc768b972e49952b9fe171ee1be2a52cd469b8d36b84ee902cd9410db2777192e90070d2e7c56cb6a45f0a839c78c219203b6f1b33cb4504c6a7996427741e6874cf45c5fa5a38765a1ebf1796ce16e63ee509612c40f088cbceffa3affbc13b75a1b9c02c61a180a7e83b17884fe0ec0f2fe57c47e73a22f753eaf50fca655ebb19896b827a3474911c67853c58b4a78fd085a23239b9737ef8a7baff11ddce5f2cae0543f8b45d144ae6918b9a75293ec78ea618cd2cd08c971301cdfa0a9275c1bf441d4c1f878a2e733ce0a33b6ecdacbbf0bdb5c3643fa45a013979cd01396962897421129a88757c0d88b5ac7e44fdbd938ba4bc37de4929d53751fbb43d4e09a80e735244acada8e6749f77787f33763c7472df52934591591fb226c503c8be61a920a7d37eb1686b62216957844c43c484e58745775553", "signature": "903b484cb24bc503cdced844614073256c6d5aa45f1f9f62c7f22e5649212bc1d6ef9eaa617b6b835a6de2beff2faac83d37a4a5fc5cc3b556f56edde2651f02" }, { "secret_key": "03749ca20458a35a37a8d7a26f959f0d59f6dc9973fa363c1ff8ca4e638c2cd3", "public_key": "eaeb94f406bde6a7cf8bde2adf3081f8375b87d9335d496c71d042cd2eaa166c", "message": "eef5ceebd0445e9c9181aff9c6f2660128fcfb63691a42cfa443d6a649efc5fad8c20803763ee97d1dba08e63e08a2616da05077489f2fa2c56b7534f9402619251fdf9c320de7af109e2fd8b2565ce8a7524c9405ec0f8fcaa7149a6d210efde83b111cf82dc0835cf94f20cdb021b73bd262666555e6d62707b46ee42fa900b4f4f705de33d3dbdc68a88d1a4d0ae933566db6c6237ec8abe1024dac4b7f46d407be16594d9046c7312dda6614d9bcdb01fb8324fc62b8eeaf0abc23cd570e304fca08e88c735e5d31592409ceb583862e6b0a767729f7556fa2c053644d36c8337c0274e749202982fb4a171acac196c02b7f16a8da49071c8ab8076dd5d3abadfe3af82ca85da02dcc1c4a6f2e1930bee2009eee0d971e40dd12175c8d00694f0325a3b3133c0d0bd382a5194fb21422ce67c78a5a6e1537e3b97d5e204e5d195696390f77d19024c1bf6b5125a0cdbf7b9880036181c98e1ac2e5165bd496cf997451a1c12102e66946b1676abd4cbdd2c11673f4f2cd5f3c9a434d747fa05b40fbc72268b4eb2842e4741f51b7709b6accc47fcaf70d9c1c4c35867119d81cb3ff1f16081133f1659aed85f63bc901989e2617fcce153c2978d708fd02449ae4d538d122ddb8527c0a76a102eeff6edb65dba298d3c217f6551814eddeece1aef5f371a54f12bffd6b4961819a0f244ff0d7d8694c14422de9822c13179e4eeb81595079b9dd2ad1e7c39bd303cc44ae3f3634881577a266fd6bb7917812b999dc809dc09c3d7019dacd28e43013a2f9e4f94bb0bf7124ef091783f796397f6463bf1efb39cd46f3790a1d9b6a7c30f149b5e66c2937e39cb9744ddc66ab561bad4e6fa8534d69883822643d63d8bd7b181621a267e955e758d1792b44", "signed": "78a3877e02bdfd015e7f86a327a48cc3a5230bbdb1243f1a8cf227f78ab5e7680de301a915dc11b336fb5f6566848b42500adb5d673969122ba8f0053cd3060beef5ceebd0445e9c9181aff9c6f2660128fcfb63691a42cfa443d6a649efc5fad8c20803763ee97d1dba08e63e08a2616da05077489f2fa2c56b7534f9402619251fdf9c320de7af109e2fd8b2565ce8a7524c9405ec0f8fcaa7149a6d210efde83b111cf82dc0835cf94f20cdb021b73bd262666555e6d62707b46ee42fa900b4f4f705de33d3dbdc68a88d1a4d0ae933566db6c6237ec8abe1024dac4b7f46d407be16594d9046c7312dda6614d9bcdb01fb8324fc62b8eeaf0abc23cd570e304fca08e88c735e5d31592409ceb583862e6b0a767729f7556fa2c053644d36c8337c0274e749202982fb4a171acac196c02b7f16a8da49071c8ab8076dd5d3abadfe3af82ca85da02dcc1c4a6f2e1930bee2009eee0d971e40dd12175c8d00694f0325a3b3133c0d0bd382a5194fb21422ce67c78a5a6e1537e3b97d5e204e5d195696390f77d19024c1bf6b5125a0cdbf7b9880036181c98e1ac2e5165bd496cf997451a1c12102e66946b1676abd4cbdd2c11673f4f2cd5f3c9a434d747fa05b40fbc72268b4eb2842e4741f51b7709b6accc47fcaf70d9c1c4c35867119d81cb3ff1f16081133f1659aed85f63bc901989e2617fcce153c2978d708fd02449ae4d538d122ddb8527c0a76a102eeff6edb65dba298d3c217f6551814eddeece1aef5f371a54f12bffd6b4961819a0f244ff0d7d8694c14422de9822c13179e4eeb81595079b9dd2ad1e7c39bd303cc44ae3f3634881577a266fd6bb7917812b999dc809dc09c3d7019dacd28e43013a2f9e4f94bb0bf7124ef091783f796397f6463bf1efb39cd46f3790a1d9b6a7c30f149b5e66c2937e39cb9744ddc66ab561bad4e6fa8534d69883822643d63d8bd7b181621a267e955e758d1792b44", "signature": "78a3877e02bdfd015e7f86a327a48cc3a5230bbdb1243f1a8cf227f78ab5e7680de301a915dc11b336fb5f6566848b42500adb5d673969122ba8f0053cd3060b" }, { "secret_key": "53cbd6f68cee27b9f7bc059b803b447949bbc9c5d5a38652d7789ca15420dea1", "public_key": "6116990b5331e2165f82743f01d8e7bd5d7088b30159833fa7b939cfb1cc04d7", "message": "306f8e1df0a4ca78bd77e8e1191c94deaa82648355c2aecb7e82fc56d64c504619247e7cf8943328d11f3db4b1dc148e8ef6f6c3bc355969662a281a65576391242b7bd5a62f8fa7acb604e3a344ae1a9d732a254315f31a0464c1e6587462d29212c40e5ecf061e269aa0b90390ba41040721684bf2aa9582d83066221db60d0f7ae2f149a36e16952704fb1f3a982eac6b4583665c63e5a8996f24a566dd506a33d4ec8a02b2bd34b714c745000c0128a3c89d942506d12f4beb900e2903cdb34b35ca9b6d3ad9b350ac99f41db3acfe7fe55a28c0f006b844c9dc4853fd98535ada79416dca5fee5803a2d9f5d68e6b80539ff302e973f24e9bc88b7c4194117ddb9f932b32d5ec74868a13631ece68814b931421dc890249570341f4b423e86e8ee081b22702f649a6c7a0b7bdf5fb756202bd10b0bb2215c7d6597effd852f0b89abec15ea82257689df81e338254f93e81cbf061729d483eb5cf649805d78ed892dd0bd248ca1e252bea51847e1e82d39af58050dc4afbf9115a3a60493e8c0ba2e86e0898cd0d430891b9eb0a40f87431e25f41538a030f884fab36ad11165d267e8dd94dcb05b93a5ae77969430e1810134e157251b982df343dffae6123a99aa0562d5df72408f1a6e29c4059a5a8aaa4e621528fc63a9cbe1f4c0fef25fe3f8e18157774097a9d91020a9006b6c860ec1ee10d521d203a1f8bb82561296faad4b2203da53b207a459b29c18bc0649332b1807c13ca61acfaf90779febbc7f3242164797e6f572cb15a9be5887343455e26b910c8befee42aeb047f9abe6b3750dbd7de99202a0bb576ce1489e61c1f5d27c6792e63218edbfdb9b3dc515b4254d82c859e52ce6bd7ad296dd0e3709d4c466362f90265e99da7d0b701", "signed": "d82504405ff16ba6443dc482367263a8e200360acaaa83fc4e4b72bd249f16103ec7e5a7e9ca17198f888eaca16b740cc3f5c3b7b617a34b9491c3ed76aab30d306f8e1df0a4ca78bd77e8e1191c94deaa82648355c2aecb7e82fc56d64c504619247e7cf8943328d11f3db4b1dc148e8ef6f6c3bc355969662a281a65576391242b7bd5a62f8fa7acb604e3a344ae1a9d732a254315f31a0464c1e6587462d29212c40e5ecf061e269aa0b90390ba41040721684bf2aa9582d83066221db60d0f7ae2f149a36e16952704fb1f3a982eac6b4583665c63e5a8996f24a566dd506a33d4ec8a02b2bd34b714c745000c0128a3c89d942506d12f4beb900e2903cdb34b35ca9b6d3ad9b350ac99f41db3acfe7fe55a28c0f006b844c9dc4853fd98535ada79416dca5fee5803a2d9f5d68e6b80539ff302e973f24e9bc88b7c4194117ddb9f932b32d5ec74868a13631ece68814b931421dc890249570341f4b423e86e8ee081b22702f649a6c7a0b7bdf5fb756202bd10b0bb2215c7d6597effd852f0b89abec15ea82257689df81e338254f93e81cbf061729d483eb5cf649805d78ed892dd0bd248ca1e252bea51847e1e82d39af58050dc4afbf9115a3a60493e8c0ba2e86e0898cd0d430891b9eb0a40f87431e25f41538a030f884fab36ad11165d267e8dd94dcb05b93a5ae77969430e1810134e157251b982df343dffae6123a99aa0562d5df72408f1a6e29c4059a5a8aaa4e621528fc63a9cbe1f4c0fef25fe3f8e18157774097a9d91020a9006b6c860ec1ee10d521d203a1f8bb82561296faad4b2203da53b207a459b29c18bc0649332b1807c13ca61acfaf90779febbc7f3242164797e6f572cb15a9be5887343455e26b910c8befee42aeb047f9abe6b3750dbd7de99202a0bb576ce1489e61c1f5d27c6792e63218edbfdb9b3dc515b4254d82c859e52ce6bd7ad296dd0e3709d4c466362f90265e99da7d0b701", "signature": "d82504405ff16ba6443dc482367263a8e200360acaaa83fc4e4b72bd249f16103ec7e5a7e9ca17198f888eaca16b740cc3f5c3b7b617a34b9491c3ed76aab30d" }, { "secret_key": "8b6574f6d7396981e223a4837bc339c3fd659419845a2121bf85be2e695d860d", "public_key": "e3811aca70634f5a9ce4b592a17bb5cfda53442422e203cda9504c9d65b263e8", "message": "a48aacc0495fa0f1259b27865d3d75dc52c2c828ea8c4c2ad78577072fef7270f6a4d582bb7b962f4c3fd149a60a06bc8efd2970ef03148ddf6198b9b695a69fadb5340951cb75398ac51a4fd55430378cd5da8885210bfd2146f95c627632fe8be06de01a7c27b89deefd67efc69c9b5c62b38108f776229143dae660c10cbea3cd4f7ee53dc3692ed01177e4a6f7e424b5666f7f495f2a65602c7d08c5d572234a567cb6c38afd79cab5c4036d62637aefab5588769a448ab4c65e24554bd4158050e09eb58f99ab40777b0356709b7c025ae5ae5422acf87444931ae4d9a8b3d94476881128ba1eb7328fafc75f6b9dacc96d3b6487ddef7c59262dcada426aacb13922935411566235e058372622d885bd0cc04958dcfb17e08fcd7f147e20156c8e26af85530f5511a68db43dafc4e6a23f667df3743eedd71a3f07f76f94d1688afc8463bfa5a439ae311469948e7447064f0b0506f36719c13466a1b98776d967ec58208ba674037303dfc6190da783ff27303b86b5fc3211f01c915e83a6ad0121447911cbe1cf696f618f60236643f2e94e155db657182944c1a43bdc7bd5eaf3481fe1284092cb3789a892bd79a111fd410143cf91ae332860b1d29aa041d177b50d6cc2b9660d328c0f230a3515e6a0d688709c0cd347ad2ff32d61d1e1e9ba76f81e873a6c420f1707f3841db5196cb53f506f0006352c7c44c080f3096801a57a49cfe84205bdd7a9801f843cf26b9558a2db788ef1b237915d587b9ba9779890f61fdc91e03e4f4cdbefe417cc22d522a86adddb53f3747450ab62b576565db32e0cd44276547d9a16653c279659dd4d17ec04827c533e33390fe94f793509256db67531736ab3fcee2a301ac3f0a24d3b108d7e75c32a5aba36d6", "signed": "2fd0905475a2cec3e76f9909b8afd83beb8daefa77afcda34cb4f11728ef15fc9c1d7f6f6afffc28f3874f913e17980f0e8e3d5ad23951df2b32efaf6219ce0da48aacc0495fa0f1259b27865d3d75dc52c2c828ea8c4c2ad78577072fef7270f6a4d582bb7b962f4c3fd149a60a06bc8efd2970ef03148ddf6198b9b695a69fadb5340951cb75398ac51a4fd55430378cd5da8885210bfd2146f95c627632fe8be06de01a7c27b89deefd67efc69c9b5c62b38108f776229143dae660c10cbea3cd4f7ee53dc3692ed01177e4a6f7e424b5666f7f495f2a65602c7d08c5d572234a567cb6c38afd79cab5c4036d62637aefab5588769a448ab4c65e24554bd4158050e09eb58f99ab40777b0356709b7c025ae5ae5422acf87444931ae4d9a8b3d94476881128ba1eb7328fafc75f6b9dacc96d3b6487ddef7c59262dcada426aacb13922935411566235e058372622d885bd0cc04958dcfb17e08fcd7f147e20156c8e26af85530f5511a68db43dafc4e6a23f667df3743eedd71a3f07f76f94d1688afc8463bfa5a439ae311469948e7447064f0b0506f36719c13466a1b98776d967ec58208ba674037303dfc6190da783ff27303b86b5fc3211f01c915e83a6ad0121447911cbe1cf696f618f60236643f2e94e155db657182944c1a43bdc7bd5eaf3481fe1284092cb3789a892bd79a111fd410143cf91ae332860b1d29aa041d177b50d6cc2b9660d328c0f230a3515e6a0d688709c0cd347ad2ff32d61d1e1e9ba76f81e873a6c420f1707f3841db5196cb53f506f0006352c7c44c080f3096801a57a49cfe84205bdd7a9801f843cf26b9558a2db788ef1b237915d587b9ba9779890f61fdc91e03e4f4cdbefe417cc22d522a86adddb53f3747450ab62b576565db32e0cd44276547d9a16653c279659dd4d17ec04827c533e33390fe94f793509256db67531736ab3fcee2a301ac3f0a24d3b108d7e75c32a5aba36d6", "signature": "2fd0905475a2cec3e76f9909b8afd83beb8daefa77afcda34cb4f11728ef15fc9c1d7f6f6afffc28f3874f913e17980f0e8e3d5ad23951df2b32efaf6219ce0d" }, { "secret_key": "29b2881b8caadb336e7880c510b80085f4b1221860b301eb4525650752a6d289", "public_key": "0c5c44ed29d21bcadee21cbde61a9cdb6d5936009ba2f5b2e777c924ddfb6751", "message": "1974a2e2b47949f467a931d1d9dd5ce116e9f5030ad09a8cc728d1aeb148bbf9acf59874da80e708d53c668f2f14d7522071e909808427b2ab5a05f8b94f21505cd26abc53458978c784d479ea6dab105c4f7984a0fb9790e50624f4734b551905aa5ffa60184cd201cf2b26c9795da6e7e08d6a0bc7722400fef94fc21038be89d34bcd14c427b85b6866737196152d4eeb66d05b245ae84bdc7787c14a8bec2eea5360f042433d70794467d47393b93757f331cf2b53c660d71c29582aeea79b12527a28b0c5e110df6f854eead9a2b00d42542ca8276bb8bf988baab8565996fee50cf31b2459c4c50ab475265e83e2285d43fe1f752a55b2dbc49fca04a810f0413bf6bd81b79ac64ee1f89b97bd7d26d62512273e24a6bab2d5f7d2226baaab7b111209bb03733d8a60dfa31a516f4a8c7699d8285c1065159a6c7331c1defb47a30ef5858c50b7d045124a09813d1cfda5c9cc3bb5bfae73c984197f8f857f186c41ab87fb7962b631f4d007cfbee221fc6572784a551194c19777b08e6b596757e7cba7a0e27fe453f90dc59cc08c6472431c020e8dd0917590e79c1f207383afb39076ad24da8ee52486739453a2590e51bfc89b13c2033cfa5f8903cbe9961a8598ba556232869dfab4d56edf4f05e8b77d05871895e63b5351f76cb2d2c8385c109d7306192a25446e4d62dc7d624f0c6673986be0628b2c2d73eb941d35a3433090f59b28a5979d56dbc9fd6973f63647642cd903b0cf7a6acd330d87e2292710de99e0c179ca78929ccaecfaedbf2742414f176b6090c0d59a9db781c9967e28fa4e77d2a082e42f52169167e92d4fdd82e2cc05dd9184c7dfee490a237fdad4dfebc01868e0a4353a2954d090928461821a7a848d1b60817fc3bdefa1", "signed": "99e996e85a494f1980cb07de9ca6165e7de104d39fe3c3226735c5daa569516fcaf1b6e4dfad0d389b6db0ec8a8f20dd2c602656b5e761c8f3a65583821519091974a2e2b47949f467a931d1d9dd5ce116e9f5030ad09a8cc728d1aeb148bbf9acf59874da80e708d53c668f2f14d7522071e909808427b2ab5a05f8b94f21505cd26abc53458978c784d479ea6dab105c4f7984a0fb9790e50624f4734b551905aa5ffa60184cd201cf2b26c9795da6e7e08d6a0bc7722400fef94fc21038be89d34bcd14c427b85b6866737196152d4eeb66d05b245ae84bdc7787c14a8bec2eea5360f042433d70794467d47393b93757f331cf2b53c660d71c29582aeea79b12527a28b0c5e110df6f854eead9a2b00d42542ca8276bb8bf988baab8565996fee50cf31b2459c4c50ab475265e83e2285d43fe1f752a55b2dbc49fca04a810f0413bf6bd81b79ac64ee1f89b97bd7d26d62512273e24a6bab2d5f7d2226baaab7b111209bb03733d8a60dfa31a516f4a8c7699d8285c1065159a6c7331c1defb47a30ef5858c50b7d045124a09813d1cfda5c9cc3bb5bfae73c984197f8f857f186c41ab87fb7962b631f4d007cfbee221fc6572784a551194c19777b08e6b596757e7cba7a0e27fe453f90dc59cc08c6472431c020e8dd0917590e79c1f207383afb39076ad24da8ee52486739453a2590e51bfc89b13c2033cfa5f8903cbe9961a8598ba556232869dfab4d56edf4f05e8b77d05871895e63b5351f76cb2d2c8385c109d7306192a25446e4d62dc7d624f0c6673986be0628b2c2d73eb941d35a3433090f59b28a5979d56dbc9fd6973f63647642cd903b0cf7a6acd330d87e2292710de99e0c179ca78929ccaecfaedbf2742414f176b6090c0d59a9db781c9967e28fa4e77d2a082e42f52169167e92d4fdd82e2cc05dd9184c7dfee490a237fdad4dfebc01868e0a4353a2954d090928461821a7a848d1b60817fc3bdefa1", "signature": "99e996e85a494f1980cb07de9ca6165e7de104d39fe3c3226735c5daa569516fcaf1b6e4dfad0d389b6db0ec8a8f20dd2c602656b5e761c8f3a6558382151909" }, { "secret_key": "42afe89dac83e7d38996c0dbce0c9874c00927babd77ca8ceac34e564474282b", "public_key": "a4c5f5e3803f0a03d5c1c906caec9cc6d2851407f1ca29f72a45f233e6656244", "message": "e710a163ad2885aeb7658eb374f118b76842ec36ef3b010c3c6b9559e8b160c2628ded0b8511eb4907180da4b621e9aa4a322288888a1c09130f69f890597a9293e74f9289bdaa5c91b6fd24aa044ab9fcb3402f7abc48d2ab7b3880a048daa448645ad2ecb55b3caee2d68a8bedb5d1865d5e211de39b0eaf22e5daf10f7168203aa15b85aa47bbd3cc4169cbc1fe80b4700b625871edabcd4fe74a3e965569ce245cfcde4209cc8abcd6797d44185b4f96c0181bbd27008783e9358a5394fe3a34a06871d379da35b20bb57eef9e5524ee7912a6f41b4a1f684c3919cfcdc00f4580baf9e09d316cefa0f465dca5d8eec514e95e5a57bbcd27e41f8119b264ae14a319d8c3859babf1f4a6b6b77e442c861d6ee28ad12b82362e90db0c3672b0e0d9ff58146fd159aa8fa99dc755fc85b90cf9419279c0624b93e75eda0ef7c09695ae93bd7282419377b76ca8bdc0521cfee6f6d729c3adff894687b177ef19529a6bdace70b685c6d7a5d74a08e2a9e724035975c80d18cb369470de7299cbd6b0a27c9232c7eabac86d5093a65ffe0b40d40befe80b68cd9dce1ea1e657e45e9c499d0b690f74455fb47096ed8c18d1517f90442901a6c410b7f6415f20ae48c58ade8d675b6c058df16ae7698fceae95aa771b4cd88a0b3f22c51f98c71c1eb46b264bf97a300ecb1fd26226ad8e87a058cf3e708e260f566b685314045133f4a5e8fbc34561b9a0f1ff9339f55231076b736b6e11524319a272bd4453a0af1493daa09167e84643d207a02fee98fb223b01a99aa5cef2b7001e470f6f94a5dc208edfc0cb8cf3114a919600f061172f0efe039036bf4dddbfd0d45f91443bf26f8e15ed7db8e55f086a4a4583f4bda0f556284dcf71292fe70fcaa8259b9faff3", "signed": "4fba2d6cc1b7193d3562f8c8bfe6905c829db265a5427c5c265714785b83f69514c5e30e28b56684c82dae2637581bf3f4ef271420bc7e6010613a38fa101a0de710a163ad2885aeb7658eb374f118b76842ec36ef3b010c3c6b9559e8b160c2628ded0b8511eb4907180da4b621e9aa4a322288888a1c09130f69f890597a9293e74f9289bdaa5c91b6fd24aa044ab9fcb3402f7abc48d2ab7b3880a048daa448645ad2ecb55b3caee2d68a8bedb5d1865d5e211de39b0eaf22e5daf10f7168203aa15b85aa47bbd3cc4169cbc1fe80b4700b625871edabcd4fe74a3e965569ce245cfcde4209cc8abcd6797d44185b4f96c0181bbd27008783e9358a5394fe3a34a06871d379da35b20bb57eef9e5524ee7912a6f41b4a1f684c3919cfcdc00f4580baf9e09d316cefa0f465dca5d8eec514e95e5a57bbcd27e41f8119b264ae14a319d8c3859babf1f4a6b6b77e442c861d6ee28ad12b82362e90db0c3672b0e0d9ff58146fd159aa8fa99dc755fc85b90cf9419279c0624b93e75eda0ef7c09695ae93bd7282419377b76ca8bdc0521cfee6f6d729c3adff894687b177ef19529a6bdace70b685c6d7a5d74a08e2a9e724035975c80d18cb369470de7299cbd6b0a27c9232c7eabac86d5093a65ffe0b40d40befe80b68cd9dce1ea1e657e45e9c499d0b690f74455fb47096ed8c18d1517f90442901a6c410b7f6415f20ae48c58ade8d675b6c058df16ae7698fceae95aa771b4cd88a0b3f22c51f98c71c1eb46b264bf97a300ecb1fd26226ad8e87a058cf3e708e260f566b685314045133f4a5e8fbc34561b9a0f1ff9339f55231076b736b6e11524319a272bd4453a0af1493daa09167e84643d207a02fee98fb223b01a99aa5cef2b7001e470f6f94a5dc208edfc0cb8cf3114a919600f061172f0efe039036bf4dddbfd0d45f91443bf26f8e15ed7db8e55f086a4a4583f4bda0f556284dcf71292fe70fcaa8259b9faff3", "signature": "4fba2d6cc1b7193d3562f8c8bfe6905c829db265a5427c5c265714785b83f69514c5e30e28b56684c82dae2637581bf3f4ef271420bc7e6010613a38fa101a0d" }, { "secret_key": "10f009aa887d91ced809afe192d78e4799d9037762f4a9d3a429fde0f39f7b7a", "public_key": "cf5116b921212e9b78829a0263463691c6fbccdc0c118be141c96f8c88053dd3", "message": "2edf14d6cd56896eeaa770211c4984bed80eca8d6534d5d510884f55f11f99ffa9f89b586ffe7b1ec7eaab6a9dc1a24a3ee3c7a6ab44ade9917883264ede2f1361be7d7a3817f29dec9581c319f18f95d5be26d9118be678340037a68abfc5efbb9a3f3f3878aae3721ffef5bb6a26c7b1a3a56d2bda6c6e860eb41fd8d8371174d91c74c5eb67c3855c630d641d2e571a9a51c6402cfe1842cef38980cb8d0a64bcc89be3189e6811f47e8f4d0063a5b1601f44fda20c1c4c2fc49cbe27a4137dc4638c2ad2d0a5474747229c568e3805431fa36eeba785f7b97844b5e319fa6a09cc5ae8403474bb91dd896c1ec2bac73d2e505efc62bd502b5ceb08d16e832ec5dc4f98b51b9d0738b9fb28f3abe8966bf22375a0b22c471a9e58e3fd700de15c5296373c1bc9d4640eb7816e1dc9c8ce8619a81183009ec974871e8f0a9772ede0a638b3574bf75d8f55987f3cfa6fec68970bfe00b23b59fb5bf4996ea5d7704fcf2effcc0fd7f3d8e6056008097f26caffd5415a282a276a9b2645e5cab12968872eb052f4d7c10cc7c21d5161818bb44cc856b0de769d559c55df64ad9adc16c0ac65838f660da81386b70b93525ec2f40f6f63f8ea5d4830b9646c46183bb4e6f27047bda2a546bd34bd4db5fb88fd8ab7c75f652e15d5aaa6b46a8acf6e448bf2dd64dee3c105647c7f83ad200d8097c444a158d85a54f0e5dbb12b43de943af1a81856ac969f52a0bd454381bd265041a2691d1a4a0d819fa79092c8803521fa53689ab852f1fbabe00c94b7f682d121cff54391322529c8d5ad7bbb98eafe300ab922f1c89240a1e633cf56a7b02f74a29214e569a057bd585e404d7cd5352041456e6cf90c15342e025670f4fccdf98783b6853214cac3fa808a66c27b653c", "signed": "c37bb7b73b1105be086ff3076972077262df4d7332f608c7b2b9d978d474cbbc271046080035f396ee36479b7a6711c68e2561c741c0ec5fc9eca1734e811f042edf14d6cd56896eeaa770211c4984bed80eca8d6534d5d510884f55f11f99ffa9f89b586ffe7b1ec7eaab6a9dc1a24a3ee3c7a6ab44ade9917883264ede2f1361be7d7a3817f29dec9581c319f18f95d5be26d9118be678340037a68abfc5efbb9a3f3f3878aae3721ffef5bb6a26c7b1a3a56d2bda6c6e860eb41fd8d8371174d91c74c5eb67c3855c630d641d2e571a9a51c6402cfe1842cef38980cb8d0a64bcc89be3189e6811f47e8f4d0063a5b1601f44fda20c1c4c2fc49cbe27a4137dc4638c2ad2d0a5474747229c568e3805431fa36eeba785f7b97844b5e319fa6a09cc5ae8403474bb91dd896c1ec2bac73d2e505efc62bd502b5ceb08d16e832ec5dc4f98b51b9d0738b9fb28f3abe8966bf22375a0b22c471a9e58e3fd700de15c5296373c1bc9d4640eb7816e1dc9c8ce8619a81183009ec974871e8f0a9772ede0a638b3574bf75d8f55987f3cfa6fec68970bfe00b23b59fb5bf4996ea5d7704fcf2effcc0fd7f3d8e6056008097f26caffd5415a282a276a9b2645e5cab12968872eb052f4d7c10cc7c21d5161818bb44cc856b0de769d559c55df64ad9adc16c0ac65838f660da81386b70b93525ec2f40f6f63f8ea5d4830b9646c46183bb4e6f27047bda2a546bd34bd4db5fb88fd8ab7c75f652e15d5aaa6b46a8acf6e448bf2dd64dee3c105647c7f83ad200d8097c444a158d85a54f0e5dbb12b43de943af1a81856ac969f52a0bd454381bd265041a2691d1a4a0d819fa79092c8803521fa53689ab852f1fbabe00c94b7f682d121cff54391322529c8d5ad7bbb98eafe300ab922f1c89240a1e633cf56a7b02f74a29214e569a057bd585e404d7cd5352041456e6cf90c15342e025670f4fccdf98783b6853214cac3fa808a66c27b653c", "signature": "c37bb7b73b1105be086ff3076972077262df4d7332f608c7b2b9d978d474cbbc271046080035f396ee36479b7a6711c68e2561c741c0ec5fc9eca1734e811f04" }, { "secret_key": "4578c65a7ca48f2774050a7b0ce7a4fd5ad4e696b2b8af2396164a1c7e1b7bd7", "public_key": "15bf9dbd3b8173e6f03dcfd575d909845f038eaa09c5d908fef908a97458b3ef", "message": "506f32b96814243e4dd8870a8fd60ddef09bb8c563151070d9bcb2b160a3eabd71a044d71ec93fba95288ed6fe1a7b921651604307d65a45ec5d3f2631ace40e58d53c72e526886e16972f6e0db94d57b55634fd39d55e9bb7f212afab00f7746409267e8d565ff5c2257333c3d04152174fe12de6a57bea057dc219e2fba5f191ed8141c018969de19472d6aaf763f19ec554702bb3dcbe13ca9b23b2418c99e71838a88cf454728cf9208a16c84ea39829b4ba9b4c77e176112bfe1bf35f95c4028c7db80b36faa29d2b89e9e862f31000065f139b3da77d9d868530574b7e391ed97b34f878164f6b8d87b406c7dc7860a5175f920e5a62dc1fc82ed8452543b107360d35d2b4c4239eab466d32bfda34f51037a6fae76f6d8b83e8f7f489dd4c1b49c38f53576e62172c17dee3665fde8cbf015af9665b0f1da2fb77b134f04be271e402f31537c2fc05c2f9b6fc3ffe47de3369133867c69d10e7f537bae4567d468e0f2ed806fe335f939c75994f363ce3b70daa7d5bd2317c833851fd8cc97251ec419023d9d0174d84d5609a6918a1740eb1e309bd127366deb9c5ab12992e9902e015fe58d6adbf52d22a760acd63e1edd8f138e9fb0137188601e1978e7d04fb2ada2b2aee12f49f2836c6842d88cf48c866e3d33fcd269c275c89c25e3669ca90de7b67a7e7a382cb7efa47e9c2bf76571c79a25085ef020487152f06bfa133015a1b8f1c0f6a9f0eae1ba62bf104f1c16ac14e1e96c4ebdf061e0cc7101d38da7e9e0994daf0f322aa3cfef91b616c2d000689ab18ed45268dcd275094f656ba3cf515261024741f7444ab7fc4decce16756032a1be270ff0b0317542ba02662260a376fc912cbb029cac54515f5a551364f6a99ffad0b9cbcd0e693b7a521cb", "signed": "a1c242b45e94fd180f054c7101e55b396568f483db6f0dfc4168b69b59d385814c19eb3075237d1fbb1feebbfea50c56813c8c39c22752e02db7e57f3e3fbf0d506f32b96814243e4dd8870a8fd60ddef09bb8c563151070d9bcb2b160a3eabd71a044d71ec93fba95288ed6fe1a7b921651604307d65a45ec5d3f2631ace40e58d53c72e526886e16972f6e0db94d57b55634fd39d55e9bb7f212afab00f7746409267e8d565ff5c2257333c3d04152174fe12de6a57bea057dc219e2fba5f191ed8141c018969de19472d6aaf763f19ec554702bb3dcbe13ca9b23b2418c99e71838a88cf454728cf9208a16c84ea39829b4ba9b4c77e176112bfe1bf35f95c4028c7db80b36faa29d2b89e9e862f31000065f139b3da77d9d868530574b7e391ed97b34f878164f6b8d87b406c7dc7860a5175f920e5a62dc1fc82ed8452543b107360d35d2b4c4239eab466d32bfda34f51037a6fae76f6d8b83e8f7f489dd4c1b49c38f53576e62172c17dee3665fde8cbf015af9665b0f1da2fb77b134f04be271e402f31537c2fc05c2f9b6fc3ffe47de3369133867c69d10e7f537bae4567d468e0f2ed806fe335f939c75994f363ce3b70daa7d5bd2317c833851fd8cc97251ec419023d9d0174d84d5609a6918a1740eb1e309bd127366deb9c5ab12992e9902e015fe58d6adbf52d22a760acd63e1edd8f138e9fb0137188601e1978e7d04fb2ada2b2aee12f49f2836c6842d88cf48c866e3d33fcd269c275c89c25e3669ca90de7b67a7e7a382cb7efa47e9c2bf76571c79a25085ef020487152f06bfa133015a1b8f1c0f6a9f0eae1ba62bf104f1c16ac14e1e96c4ebdf061e0cc7101d38da7e9e0994daf0f322aa3cfef91b616c2d000689ab18ed45268dcd275094f656ba3cf515261024741f7444ab7fc4decce16756032a1be270ff0b0317542ba02662260a376fc912cbb029cac54515f5a551364f6a99ffad0b9cbcd0e693b7a521cb", "signature": "a1c242b45e94fd180f054c7101e55b396568f483db6f0dfc4168b69b59d385814c19eb3075237d1fbb1feebbfea50c56813c8c39c22752e02db7e57f3e3fbf0d" }, { "secret_key": "c21e70c46ede66e68a8873bbc64ba51209303a0ac4fc49b1d83e8193ad46c037", "public_key": "9fbf80a42505d2c952f89f4558c3e6d187a7bc1ef446b2e3732343c13b33d200", "message": "f55aa570ce4fc95f73f51720d254e4695fcdc81aaa040130c7687f039b8ba59ed857ceb29c121025a857feacb4a01f38e01178310ae6e35c998ebf89dd79057b4afc6db340601c81703c87a8c40e5cebb0441df78a6de13a447cb016c65e741bb7df304d83056b72c682c731fac0a0c70b7811ca14a50154613099c2c437521c404b6361de3621f8ea56b08ebfdb07b4f2bb8ba2ecc164336da8efc942766ef0c74dfd3b49e087e9a27ae54a7a2b98281b9af93dc11aa2f09224ab5a730f0218f4a6e1ea4885a77fbd93a1c58277d9e01be73a25cda918fc27dddb453a5da6902ad02ba05775c67e07bea4df86913466744365c1326e0ab5e1254c17967447d591ba5ed1b63a42543b87fed41459a089bceaff219802a87a872a763e692333ce1cc7397825084b2b831e93d80d6737f32980f2f3ae82c62190fe3fa700c5b7329d6d50042bdf831f37548fcc80b11f57cf20f67a3bb651a7beffcc48b70d17eb60f7259cc53bf7ff6080eb2bd0923b0483aa3065a8955f01d23ba80951e0aefd2a9372191572bc52916aa22a2aec393767fafd086839e236fe0460ce6d639c7ce69fe7f9d3aad2130573443570443be6bab93a06a54b8ac29bf33ff9949bc92158e6924b6b68ecda5f6f3aaf42b3d22df6d5e67d5cb3ab71eb8ee0b0e66732e1daca6cd60d9aa74305fcd570076d228d446d5ee542b10488bf8aa988f451faebe74ab669d604d9ddb15106620ea02e8db38ce639b5747812bb9048ee8bf72b1a951a05dffac95417cb43b06dce61ee3da6f2832ee83b2e7288ddd62eeb5893f7f2f6c8090d99e336c9f9069e1815985841bdd505b5f83d895e879593dadee72ceb9765699bf80bd06a5c55331b2545527d0c7caece96584ce3ec7fe02260f20b8a1c0635763ff4", "signed": "0ae343bb84e3a299078e2434ba220022f3160f968ac04482bf8cad13b423f2670f01fb5f7b32c597520f84607e0f79c075fa7078e6e69d3cec319265d466080bf55aa570ce4fc95f73f51720d254e4695fcdc81aaa040130c7687f039b8ba59ed857ceb29c121025a857feacb4a01f38e01178310ae6e35c998ebf89dd79057b4afc6db340601c81703c87a8c40e5cebb0441df78a6de13a447cb016c65e741bb7df304d83056b72c682c731fac0a0c70b7811ca14a50154613099c2c437521c404b6361de3621f8ea56b08ebfdb07b4f2bb8ba2ecc164336da8efc942766ef0c74dfd3b49e087e9a27ae54a7a2b98281b9af93dc11aa2f09224ab5a730f0218f4a6e1ea4885a77fbd93a1c58277d9e01be73a25cda918fc27dddb453a5da6902ad02ba05775c67e07bea4df86913466744365c1326e0ab5e1254c17967447d591ba5ed1b63a42543b87fed41459a089bceaff219802a87a872a763e692333ce1cc7397825084b2b831e93d80d6737f32980f2f3ae82c62190fe3fa700c5b7329d6d50042bdf831f37548fcc80b11f57cf20f67a3bb651a7beffcc48b70d17eb60f7259cc53bf7ff6080eb2bd0923b0483aa3065a8955f01d23ba80951e0aefd2a9372191572bc52916aa22a2aec393767fafd086839e236fe0460ce6d639c7ce69fe7f9d3aad2130573443570443be6bab93a06a54b8ac29bf33ff9949bc92158e6924b6b68ecda5f6f3aaf42b3d22df6d5e67d5cb3ab71eb8ee0b0e66732e1daca6cd60d9aa74305fcd570076d228d446d5ee542b10488bf8aa988f451faebe74ab669d604d9ddb15106620ea02e8db38ce639b5747812bb9048ee8bf72b1a951a05dffac95417cb43b06dce61ee3da6f2832ee83b2e7288ddd62eeb5893f7f2f6c8090d99e336c9f9069e1815985841bdd505b5f83d895e879593dadee72ceb9765699bf80bd06a5c55331b2545527d0c7caece96584ce3ec7fe02260f20b8a1c0635763ff4", "signature": "0ae343bb84e3a299078e2434ba220022f3160f968ac04482bf8cad13b423f2670f01fb5f7b32c597520f84607e0f79c075fa7078e6e69d3cec319265d466080b" }, { "secret_key": "f2c10577f7df77f0c1157a8c331a7bd2ae6386670eb65f0fae122331690f828a", "public_key": "0d4c340fc231aafb3b6f74b89bcef7eeaa0b04f293ec8544247bfc3f2d57c1e0", "message": "38ea1e028a493d1c60ec70749f14d436eb3a2b2de54f213d01a645b580430ecd8ece6b5569cc017a4943e5595c5ed6e48c9443f2fa5eb2227ffe56d211f269bc8f6fa9ee8cd56f6b8470539208afe29ab0a195044d957b31f93e184a9cbef1a14e14f808bbf589ac7770084f998e1b254da59ca6d3e62e7be1790716d2560f015f399cbbce48cfd0391ead1993446f6b2493977d93d7b09a07a79a59ce15dce7a1da9c646f45af2ccad55ba158e638c4a30c5d30e9ac6e3a3339c243426d86491b2d92dac1478e8d74ff0bf149bdb5e09e3fb6b8262eb0687981554ae2cb47196339079da0a1a57239c19bf781f62fdaf4e31560a84317ef030492cf1bb1305ba8518ebaf2b434d3641672c8f6ea2defa696dc7e4f39efc08d288d1c966a6c7148c012eec439f7e12dbab5b87cfa44c9ae1900f8386f24444e1092b23a274c138e95c661e9377e8ad2d1fcaf1939ec9a632a873f7eadbe687b4a033b92a477f2e02e9ed92ce4f95cf170b3901518a062143e56db054df4e4431544785a6dfa24eec0f0de7a699ccf286dadfad85903612250764f25cdea8127d0078d554825ea6e7371c438bc46f29fb8937f8d9a39cf8849052d43ecbff6c4a3762a5f400c1514e85e91384fef9b40f4314e223a9d68c526acc70227d62b8b637a342df113d318202c51edd3c1efd1ff20b1ff078b32068e794d928133037f1e3a34689e629e43fd2b8e88eab50d7e7ab0647014ab5e4ad582006567eff72b5af2dac536892ccc871f8a80b5cb79d90bcc6b77d4cd08f876184ef58c064ae430bb79a6b9e96b0ad87368aa838a8dccffac0cd8ce9ea0d0ec4c4b0f42673416659c984992cf53b1e445431007640d47ece26dee4a2943aa7097dd356cff4754f21ac07f6b3f73c469055512f37aba", "signed": "60b703115a322ab892c276bfd18f70a9eb0c7323e2c0a6eb5fc7e330b0bc3b07a578a082846264f032c6191d040bd98e5d5a4d4f076fb9062acd36bea40c910238ea1e028a493d1c60ec70749f14d436eb3a2b2de54f213d01a645b580430ecd8ece6b5569cc017a4943e5595c5ed6e48c9443f2fa5eb2227ffe56d211f269bc8f6fa9ee8cd56f6b8470539208afe29ab0a195044d957b31f93e184a9cbef1a14e14f808bbf589ac7770084f998e1b254da59ca6d3e62e7be1790716d2560f015f399cbbce48cfd0391ead1993446f6b2493977d93d7b09a07a79a59ce15dce7a1da9c646f45af2ccad55ba158e638c4a30c5d30e9ac6e3a3339c243426d86491b2d92dac1478e8d74ff0bf149bdb5e09e3fb6b8262eb0687981554ae2cb47196339079da0a1a57239c19bf781f62fdaf4e31560a84317ef030492cf1bb1305ba8518ebaf2b434d3641672c8f6ea2defa696dc7e4f39efc08d288d1c966a6c7148c012eec439f7e12dbab5b87cfa44c9ae1900f8386f24444e1092b23a274c138e95c661e9377e8ad2d1fcaf1939ec9a632a873f7eadbe687b4a033b92a477f2e02e9ed92ce4f95cf170b3901518a062143e56db054df4e4431544785a6dfa24eec0f0de7a699ccf286dadfad85903612250764f25cdea8127d0078d554825ea6e7371c438bc46f29fb8937f8d9a39cf8849052d43ecbff6c4a3762a5f400c1514e85e91384fef9b40f4314e223a9d68c526acc70227d62b8b637a342df113d318202c51edd3c1efd1ff20b1ff078b32068e794d928133037f1e3a34689e629e43fd2b8e88eab50d7e7ab0647014ab5e4ad582006567eff72b5af2dac536892ccc871f8a80b5cb79d90bcc6b77d4cd08f876184ef58c064ae430bb79a6b9e96b0ad87368aa838a8dccffac0cd8ce9ea0d0ec4c4b0f42673416659c984992cf53b1e445431007640d47ece26dee4a2943aa7097dd356cff4754f21ac07f6b3f73c469055512f37aba", "signature": "60b703115a322ab892c276bfd18f70a9eb0c7323e2c0a6eb5fc7e330b0bc3b07a578a082846264f032c6191d040bd98e5d5a4d4f076fb9062acd36bea40c9102" }, { "secret_key": "041a97906b5956b9d340f2e0d7a1dcbfefe663e9bb4026f8cc1ae7e2a14de27e", "public_key": "f382d32e88c3a72c7caddafcf8aa699e21db7a6bf4edd6e49a005aad702e6a79", "message": "71a75957411544975a48cf103aa1f8e2ad15244459cdc0e336966eb8b26c97f2169e5d78537037efc077e86f06e05e9c1dc3418288c0a2be6ba34b3a04ab20bae7f3621094b87d78a7eacb864d4078cb4efcbac5add937a2c6012ee1a8b256cc276b65d5e92b4d00b9b11fad884991dec4c1cb9dce1863c8b0a210161ae6b3f8bf9cc4dce4adfdc8ed57d83e95ab9dd2d92658dfbd3afa99e3f8951e2ad74a148f6f597eb2c945c1f1b94461ae0745481fd0edf838c6286035e36f011238875dbba2289d3d6a3942a7f9554c644305244ddb77c117cb4b56237729dde428b8bb42df9ce29e144dfc96cf6c6767b1ee6d053ce4f8bb2056ab7810aa1368a8910f2f69e061c19d8847184fed534f98758d703a76885f91eb752a21954a10c6f6b4da10464ded36b00089f662915421bfdad496753689ccd03b624021080761e68176b10697dac878e4c3db2fd0b28c655335d98016f19f265bb0b2434cb4637844d91ed0ce05ed2591fd998965f83f3197d10eef448850e792032724701da305cb6d794669483fc3dc6f686b183e2999130c8fc0058dcabbc9188f26b2d63ebd6cb1e18a097c7704a59b5e187e0142593b7083f7400afa9b1bf0c1cc6c356bc4334af772e67153b45b331b990920c24eede2c6e323703f52ecd60735b23bf22b81ee775927c37e53dad7596ea65a73bb96775f3b87c8b3c088ec695bc3a7502c0c510f020bf9aca3cbb7a2c011c67ff27d634caf1dcfc58e5e397e6658252272011c8ffdd64230a93241fff68372c4ba85382bbb229309652922db68836631e55be69ab6adb8e4335357fc923efe154afcc222d60d07f56990a3e5a214b227aecff2cd1bb6f0c79ff545f70a616141a9d53f922a02443f7d2a4689c35b095dd394d50bf49f9680a5f7d9", "signed": "a23f032e6692a0e8bfee5b2d30b414cb16c35ad08da31f696d461a02857822c4ef357f0ccf31025a4dc95ced30a994f41edd1d087afcaaf3e8e875708320f80c71a75957411544975a48cf103aa1f8e2ad15244459cdc0e336966eb8b26c97f2169e5d78537037efc077e86f06e05e9c1dc3418288c0a2be6ba34b3a04ab20bae7f3621094b87d78a7eacb864d4078cb4efcbac5add937a2c6012ee1a8b256cc276b65d5e92b4d00b9b11fad884991dec4c1cb9dce1863c8b0a210161ae6b3f8bf9cc4dce4adfdc8ed57d83e95ab9dd2d92658dfbd3afa99e3f8951e2ad74a148f6f597eb2c945c1f1b94461ae0745481fd0edf838c6286035e36f011238875dbba2289d3d6a3942a7f9554c644305244ddb77c117cb4b56237729dde428b8bb42df9ce29e144dfc96cf6c6767b1ee6d053ce4f8bb2056ab7810aa1368a8910f2f69e061c19d8847184fed534f98758d703a76885f91eb752a21954a10c6f6b4da10464ded36b00089f662915421bfdad496753689ccd03b624021080761e68176b10697dac878e4c3db2fd0b28c655335d98016f19f265bb0b2434cb4637844d91ed0ce05ed2591fd998965f83f3197d10eef448850e792032724701da305cb6d794669483fc3dc6f686b183e2999130c8fc0058dcabbc9188f26b2d63ebd6cb1e18a097c7704a59b5e187e0142593b7083f7400afa9b1bf0c1cc6c356bc4334af772e67153b45b331b990920c24eede2c6e323703f52ecd60735b23bf22b81ee775927c37e53dad7596ea65a73bb96775f3b87c8b3c088ec695bc3a7502c0c510f020bf9aca3cbb7a2c011c67ff27d634caf1dcfc58e5e397e6658252272011c8ffdd64230a93241fff68372c4ba85382bbb229309652922db68836631e55be69ab6adb8e4335357fc923efe154afcc222d60d07f56990a3e5a214b227aecff2cd1bb6f0c79ff545f70a616141a9d53f922a02443f7d2a4689c35b095dd394d50bf49f9680a5f7d9", "signature": "a23f032e6692a0e8bfee5b2d30b414cb16c35ad08da31f696d461a02857822c4ef357f0ccf31025a4dc95ced30a994f41edd1d087afcaaf3e8e875708320f80c" }, { "secret_key": "4bc5e05aa003a4492f4bad102a5390f7cebab3d3eca9152142ad5ef7d84030ae", "public_key": "6751d3ad8bb6c64d6a17d7e447a27da22f5f0403f437bac9449f13cc853dd840", "message": "a8f794db1795667d28d24b70ac2200a6239a34e2438ced1d03f97ed48beb4d6bea67c14338f7736419dcd2a2a7973726572e6afe7edfef22c99be8b069f04f6dc61a13b343c6e585abad2214d85c36f02996fabb46bb91b5176ac708e49a0b053017048fbb55453f2b8208d6678d1a8cf6a1ee9ad7a91e380325635d1e236a6ca1d6cc7f6b59f2a2bf184f5ee451d6799f69ba11a0cd6bc04be8a351a80e725b5fc4563e45bd4749ecbc45205229105b9de73261498527f3d4ecfbb583ff532753d07c38526bb482d171a261b9cf89906a7dea8cbd7e726ba31ea68803a6b004f6dcd19e671950463738cca78bb0dffa3d6457e4aeca657ec649b97ee30e97c8cbe6ce43c2aa9a69958e9dc881e4aa7b3278074e787ace5fb601d7faf7ca5103ecbbd3bd554eb1b066f8296d2cc57e8c8a32e9c0e6a926964d6df2d8645864b322c322f1ca8073cedf2b556711a7a20b77c0a1ed277a9a6ca2c07154e863fef5a404e3e89f0d7f30f218ec4de7a53aeb9c41eeaaf6ce749649c9998fd62bcba2872338e19c94e59dd5e2dd776f53719d21746976932ef11abf7a32ae6b0744665d0e0ce513955a9e68531d8ee4de9a8d35ddfb88eb5a486ad63137e8892fd7c689d4f9e7021b1173bb3752a5eecf2992e3fd4642263c7b3d815c29b466ab69285ffe4b8dafcbf3d01d635553ab7575a7a3471edc7be412d3d01e6fe8e3cdc3fa04d2a7599381e22bba49c5539d79c62b52bb0eca33f74255e41a9526a89289b15f1850d9afa87e6b6fa127101c1a6d88d433e0c86aa60bba8fe7100ed61d5a9d00a00764513eb1c7f5f5c3b3efc4532a36b407fe2d17cfb4e6fcd6049cff3a355623a3a41390ea48f42120d897949111be3d169b2d2ef45bdb894fe20b1a95ef66149427a9d8f80a9b2e", "signed": "a24fee11f7ec6da3e9dfaf6c858ac004b4531abd1c9d3bb64f40dd247f00359350e43b2d4b8fbec5f6b241ecf9f1101485cf418735b05f712018335b20068308a8f794db1795667d28d24b70ac2200a6239a34e2438ced1d03f97ed48beb4d6bea67c14338f7736419dcd2a2a7973726572e6afe7edfef22c99be8b069f04f6dc61a13b343c6e585abad2214d85c36f02996fabb46bb91b5176ac708e49a0b053017048fbb55453f2b8208d6678d1a8cf6a1ee9ad7a91e380325635d1e236a6ca1d6cc7f6b59f2a2bf184f5ee451d6799f69ba11a0cd6bc04be8a351a80e725b5fc4563e45bd4749ecbc45205229105b9de73261498527f3d4ecfbb583ff532753d07c38526bb482d171a261b9cf89906a7dea8cbd7e726ba31ea68803a6b004f6dcd19e671950463738cca78bb0dffa3d6457e4aeca657ec649b97ee30e97c8cbe6ce43c2aa9a69958e9dc881e4aa7b3278074e787ace5fb601d7faf7ca5103ecbbd3bd554eb1b066f8296d2cc57e8c8a32e9c0e6a926964d6df2d8645864b322c322f1ca8073cedf2b556711a7a20b77c0a1ed277a9a6ca2c07154e863fef5a404e3e89f0d7f30f218ec4de7a53aeb9c41eeaaf6ce749649c9998fd62bcba2872338e19c94e59dd5e2dd776f53719d21746976932ef11abf7a32ae6b0744665d0e0ce513955a9e68531d8ee4de9a8d35ddfb88eb5a486ad63137e8892fd7c689d4f9e7021b1173bb3752a5eecf2992e3fd4642263c7b3d815c29b466ab69285ffe4b8dafcbf3d01d635553ab7575a7a3471edc7be412d3d01e6fe8e3cdc3fa04d2a7599381e22bba49c5539d79c62b52bb0eca33f74255e41a9526a89289b15f1850d9afa87e6b6fa127101c1a6d88d433e0c86aa60bba8fe7100ed61d5a9d00a00764513eb1c7f5f5c3b3efc4532a36b407fe2d17cfb4e6fcd6049cff3a355623a3a41390ea48f42120d897949111be3d169b2d2ef45bdb894fe20b1a95ef66149427a9d8f80a9b2e", "signature": "a24fee11f7ec6da3e9dfaf6c858ac004b4531abd1c9d3bb64f40dd247f00359350e43b2d4b8fbec5f6b241ecf9f1101485cf418735b05f712018335b20068308" }, { "secret_key": "a3bed9fe2354bd2860149a3db75a85b129cf83e9d73e6317ba7054521933f896", "public_key": "5ac03b4f13d91d066b2ce359e9bb1dfb6bfa5afa382fd1ccd72aef1176079f89", "message": "db853808686d6d21f4c57b541e5ad63394d465e60078643cab1e065c9f306c500078f0cc41ef0f9542b5fe356aec4777ef8a95554c97b6a44099e9bd6404fb0b2e41f91914b074d12237cd442ebd40b51b8bc8bbe437a2c53332d2beb2281bf7324a0cf5b741bbf98d1eb9858be926e915a78e8d314b4144f3d20dfc6cb7f48c23af90f871c6cda90845a41aff1707a87b4e5516f18e8bd7683cfd74070803e888338c9a18f792c8d3a704170ff982bffc9e8ec9ea5d1a62592f1688d4f2b01e11f9f88774c47ac1d58f690bcf288cf8a473d350a8239df9d3a62881dadd338531fdce7615807ce965496d6f35d6c042f0ce7f21efe5ce6425185941ed5636b8ae913a75d21ab9dbdb3c3b6687a45e044938a9f1c13a330ea9761e283e61d4a320e1f559882f34b607fefe32c343174abcdc77b065a92904b42d961db8ed916c01464ffd43f93c1077f1df7ee65031cfe05d780d01d08ee036f22a2b0512193b0c0f3801e0a0208eef245c9e519352d2b0096382f2cba06eb2a01dacf619eabbc883c5d4f2fd7c3423179c0f5ffdaf8cafff5c46b34a09c3c50e2949c06000207d70d37d65a743075fdc2be62d412aa63e363706ca90e6ef44e152ea4dc5c2893ecd08d796d41f172254c3d1d14bb067b53a0897bbd73c9954d9648b2af10d9c2703e38b6c62469f6f958a1ca0a320c12339e90cf768c87b4738c219f8093bff4c2cfd29459f6d3281349378e915a3b0e724c74d2bd7a851ac7c6b48e8afc7124fdcbcab5ff80d1dee30a6c024cb4331972366ebab26bbb9f608caac7e51914df058b9b3745d98c5d27e97105475ec017377e6316198ece4ec5909f04fc27e7b382e66adb62ac8a977f376fd5dae434fb55175249ca1ab6bb02dec0696f089be3454887a0c32361d172bd2", "signed": "33bc1e0bf1b493e0cfb7ea40480a1423e091f7145745013173787df47a10db24c165d00596fab70e68c94c104e8a7407cf695cd3fbe585b5b176b85ccca4fd08db853808686d6d21f4c57b541e5ad63394d465e60078643cab1e065c9f306c500078f0cc41ef0f9542b5fe356aec4777ef8a95554c97b6a44099e9bd6404fb0b2e41f91914b074d12237cd442ebd40b51b8bc8bbe437a2c53332d2beb2281bf7324a0cf5b741bbf98d1eb9858be926e915a78e8d314b4144f3d20dfc6cb7f48c23af90f871c6cda90845a41aff1707a87b4e5516f18e8bd7683cfd74070803e888338c9a18f792c8d3a704170ff982bffc9e8ec9ea5d1a62592f1688d4f2b01e11f9f88774c47ac1d58f690bcf288cf8a473d350a8239df9d3a62881dadd338531fdce7615807ce965496d6f35d6c042f0ce7f21efe5ce6425185941ed5636b8ae913a75d21ab9dbdb3c3b6687a45e044938a9f1c13a330ea9761e283e61d4a320e1f559882f34b607fefe32c343174abcdc77b065a92904b42d961db8ed916c01464ffd43f93c1077f1df7ee65031cfe05d780d01d08ee036f22a2b0512193b0c0f3801e0a0208eef245c9e519352d2b0096382f2cba06eb2a01dacf619eabbc883c5d4f2fd7c3423179c0f5ffdaf8cafff5c46b34a09c3c50e2949c06000207d70d37d65a743075fdc2be62d412aa63e363706ca90e6ef44e152ea4dc5c2893ecd08d796d41f172254c3d1d14bb067b53a0897bbd73c9954d9648b2af10d9c2703e38b6c62469f6f958a1ca0a320c12339e90cf768c87b4738c219f8093bff4c2cfd29459f6d3281349378e915a3b0e724c74d2bd7a851ac7c6b48e8afc7124fdcbcab5ff80d1dee30a6c024cb4331972366ebab26bbb9f608caac7e51914df058b9b3745d98c5d27e97105475ec017377e6316198ece4ec5909f04fc27e7b382e66adb62ac8a977f376fd5dae434fb55175249ca1ab6bb02dec0696f089be3454887a0c32361d172bd2", "signature": "33bc1e0bf1b493e0cfb7ea40480a1423e091f7145745013173787df47a10db24c165d00596fab70e68c94c104e8a7407cf695cd3fbe585b5b176b85ccca4fd08" }, { "secret_key": "88a24f0df3ae2914df79da50ecf8ecb42f68c7baad3b6c3a2e0cc9c25d09d142", "public_key": "12e6603f713b2305358568710018685e141553c47591396fb4259e42dc53b9c9", "message": "654e9edc69fe634c2308ba8c46a955e882456286eae3593cae739c44866c0de9edcbbf0db1c44149668467709dc9706298dd2eac3301dabad5bd8e93c5e8a93f194e0fc1d9f376c144c293aefda086b2218f2e9dfd7c2dc52ba33eb229dcf7bb68ce0f876c5fd4e81afd80169f73cf264e5dc0ce16e1b876cd11c7ad89058ee0820c40005d01f119f8be6f1afbe24ca4aedc18e97896827c3ed67fc45630e7903b7fee9c990e361937bf4ea0a4d8d16cf6d9cf0381e9065e3625148f8ae0491a0341d0ff9f727be1f310ca1ec3f0104aa054321784dd24d53c985b28d44082f8e1c108a44109638ff5116edd85aeb86b6ea512a19b602edd9d211070d044af5bedb6c8527ba3491e345bacc130b36960282ae737b85c769274f0f7c588f40e6625b236bdc1a3b87320460eeeada278124b5668874f39f59c2e6aa208c3b6a9b845c4d0a27a0546786fa13e51cc98b73fd7ee327b6215ec6b629f4cc7e4bd3c0a3db78a21fffe24c70438716bc37b8da7c5ff7c3688a90339c22eb50b7c2cd36b68831fd5939175689bd3e22c3881af337ee14435709e351040ef3da955724e51c24a5e2c09f891808393fbf8ef7f1f5f0298deebdcd8d666cbcf3e866c718999ab6b1feec9c47e02e7d63540f89963d542c5d01fb6fc30768968ae81b20c354b4000c132774764d6d443add64f6dd748f5fb5b7f6eba401db4318be993989fcc2577961fa5ad31f6a2a9d6a755285865cd5dc3a88cfb5aba7d923baf78b5d131b4c214df55b6171f45209e21ca6645490d3a3644dda6dc929c7c409576d37164755ef8aaf3dcd4d22775ee7dea0e565bd54727921c649bc51f20c1f68c1fdeac455c67d71a1cb8837f4691448bf0bf044a46f1685fbe22b1e01877f7477d3499408c4c316510ce2e55b98005", "signed": "1707cc009186bf3f03f7bb9e3cd4cf6b737b7a6baade7fc6c3ff5c1225dbb2baf54f47c85eafa132c31eaca03e6aec1447733facd37149b7c6cf0cd41f611404654e9edc69fe634c2308ba8c46a955e882456286eae3593cae739c44866c0de9edcbbf0db1c44149668467709dc9706298dd2eac3301dabad5bd8e93c5e8a93f194e0fc1d9f376c144c293aefda086b2218f2e9dfd7c2dc52ba33eb229dcf7bb68ce0f876c5fd4e81afd80169f73cf264e5dc0ce16e1b876cd11c7ad89058ee0820c40005d01f119f8be6f1afbe24ca4aedc18e97896827c3ed67fc45630e7903b7fee9c990e361937bf4ea0a4d8d16cf6d9cf0381e9065e3625148f8ae0491a0341d0ff9f727be1f310ca1ec3f0104aa054321784dd24d53c985b28d44082f8e1c108a44109638ff5116edd85aeb86b6ea512a19b602edd9d211070d044af5bedb6c8527ba3491e345bacc130b36960282ae737b85c769274f0f7c588f40e6625b236bdc1a3b87320460eeeada278124b5668874f39f59c2e6aa208c3b6a9b845c4d0a27a0546786fa13e51cc98b73fd7ee327b6215ec6b629f4cc7e4bd3c0a3db78a21fffe24c70438716bc37b8da7c5ff7c3688a90339c22eb50b7c2cd36b68831fd5939175689bd3e22c3881af337ee14435709e351040ef3da955724e51c24a5e2c09f891808393fbf8ef7f1f5f0298deebdcd8d666cbcf3e866c718999ab6b1feec9c47e02e7d63540f89963d542c5d01fb6fc30768968ae81b20c354b4000c132774764d6d443add64f6dd748f5fb5b7f6eba401db4318be993989fcc2577961fa5ad31f6a2a9d6a755285865cd5dc3a88cfb5aba7d923baf78b5d131b4c214df55b6171f45209e21ca6645490d3a3644dda6dc929c7c409576d37164755ef8aaf3dcd4d22775ee7dea0e565bd54727921c649bc51f20c1f68c1fdeac455c67d71a1cb8837f4691448bf0bf044a46f1685fbe22b1e01877f7477d3499408c4c316510ce2e55b98005", "signature": "1707cc009186bf3f03f7bb9e3cd4cf6b737b7a6baade7fc6c3ff5c1225dbb2baf54f47c85eafa132c31eaca03e6aec1447733facd37149b7c6cf0cd41f611404" }, { "secret_key": "184d0ce2e9db7f257a8bf4646d16d2c5efc2702ced026b6906d3c8c0118f2261", "public_key": "e9dab8fd9d94dc9b24cc79c635cc57ce66518982ba3e2447240741bac0730ec5", "message": "6a9b876b0bf4189b3cc15f9eb4fbe7932b5577892a22200ce107156853d6d3ca363f025ad7a2d862aadc742d9415bd8d1fca13c9dca3586044e55a8cf5dee1ce564576e3e8e365540546501b34ca675cf200e0771a818c73d37fcda8cb15e48d5a0b9ea3beec0ff6610b2a8a214ca4f7efac0e71381052d9bf3c00c329593474ebd0a687a0b41d144b5e7ab1412b970a74baba4d274bb0dbfdb02b11f7f63964ba6f3ba0ad23341d083b91a4308239e33d50824396126588de72a2390c1c0fc06747c28772f630bf4d143f7a1159f028c093404894e6d16f634635d4fc330f3d7a7313ef756f5d49d8f6205eb1c792a9495da131b43345a0090c12ca56e6adac5be0cbcac3609d69f72415f6c37f3cfb2cf76b3e65f3c93ac92b63f2baa466249075bca69d4c1d1f3ade24ab31effcb90469c24bb410ab4723e1b7e1c88b3a36433563f71a99aad58fe80568f9c102da89bad97963e77d6622483166f3ae261f32a52a86101ebd645f6142c982e2cd3625cf8b46b9b2891246920f697fcaed397cb922c274945167a0e619b0b506377606db045783b0b88ea04e932d21ffc064a12a40ebe9b480f1a2c7ddd395a9b15efdc495c9714f36fa996f79f8eb8efa52d99a24abfef43b32a237c5bc0018da3b162f59b8d3d474e2ce08fa8024c58acc0a99ff614e6cd7fdd9ca4e8f41a1449aa618d03337e8a374d56055b207a9dbe69f5948f901ca7db0410f01aa373d9e0227623599bc212845b006e942fabc582cd726db5c443eb2dffbc9e3e7f0e5cb6744f7ad716050fdf2c60c7c77c253ab745db9c8552655683ea7ea680aa4af34df1325c29b8874b61be23de4ffba25424f4619ec682c26b3a67bda9bc4c94b79a9fc4d82d340495b437a1cbd6b60307cfcb10026f964a017623e33dbf233", "signed": "b1e3bf5fa74d7e442ced9a98d927d8c45e0e64d874f8ea5920a360a4bf42d83ce18a924ac796e1a77d1b0208294b50f822177fdbdd458c74356fcf6bd79451066a9b876b0bf4189b3cc15f9eb4fbe7932b5577892a22200ce107156853d6d3ca363f025ad7a2d862aadc742d9415bd8d1fca13c9dca3586044e55a8cf5dee1ce564576e3e8e365540546501b34ca675cf200e0771a818c73d37fcda8cb15e48d5a0b9ea3beec0ff6610b2a8a214ca4f7efac0e71381052d9bf3c00c329593474ebd0a687a0b41d144b5e7ab1412b970a74baba4d274bb0dbfdb02b11f7f63964ba6f3ba0ad23341d083b91a4308239e33d50824396126588de72a2390c1c0fc06747c28772f630bf4d143f7a1159f028c093404894e6d16f634635d4fc330f3d7a7313ef756f5d49d8f6205eb1c792a9495da131b43345a0090c12ca56e6adac5be0cbcac3609d69f72415f6c37f3cfb2cf76b3e65f3c93ac92b63f2baa466249075bca69d4c1d1f3ade24ab31effcb90469c24bb410ab4723e1b7e1c88b3a36433563f71a99aad58fe80568f9c102da89bad97963e77d6622483166f3ae261f32a52a86101ebd645f6142c982e2cd3625cf8b46b9b2891246920f697fcaed397cb922c274945167a0e619b0b506377606db045783b0b88ea04e932d21ffc064a12a40ebe9b480f1a2c7ddd395a9b15efdc495c9714f36fa996f79f8eb8efa52d99a24abfef43b32a237c5bc0018da3b162f59b8d3d474e2ce08fa8024c58acc0a99ff614e6cd7fdd9ca4e8f41a1449aa618d03337e8a374d56055b207a9dbe69f5948f901ca7db0410f01aa373d9e0227623599bc212845b006e942fabc582cd726db5c443eb2dffbc9e3e7f0e5cb6744f7ad716050fdf2c60c7c77c253ab745db9c8552655683ea7ea680aa4af34df1325c29b8874b61be23de4ffba25424f4619ec682c26b3a67bda9bc4c94b79a9fc4d82d340495b437a1cbd6b60307cfcb10026f964a017623e33dbf233", "signature": "b1e3bf5fa74d7e442ced9a98d927d8c45e0e64d874f8ea5920a360a4bf42d83ce18a924ac796e1a77d1b0208294b50f822177fdbdd458c74356fcf6bd7945106" }, { "secret_key": "d02bbf70d51351e3b47ad8e5ed263dbf556d1498fa9bd5dbd99fb4269009dced", "public_key": "8ce4b59f94ced6ec9614d67d3066d9d3a0df7a46b37b4c1725ef1e57bc68a0d1", "message": "554560f7a7fd1ae7758a2fce7d780f6b3f043d3af89d4f19ef573c34997554df243faf2aaab65b2afdd28610d4a51e9a4b464db6db09ebf73b7d24054cc9b12814bb29ee99e1a73bd603898360f9dcf01e670836286f8236ed8cef075f3d563312c16c73fc37eedf252f8f42d30a13e7fba3b165238c7f81eaaeb53190f3ec3b5d63f0ee03e3987e390d1d81e8277e9f6c1ee6ec4ec3fa0d720e9f53f9c26f04aa2ed2b5ef3160895999eace29cf5dc254ad71106bb7e8bc29a5b1d2412593d08194e88e1659a73159a2a22033ab066e8d3d8c3bc86b7b01de81a8c66047b07fe24ed240318ba37ba3efb6cf632604ca4f446a75fd8e70c453f0c60ee16ecaf524e703f47df5c282ca3289b3af61dee4709ee085323b1e5c8a6bc0766201c635031446891f3494e9db20dd4e9e0838249a67e138d13ee2c96f61e771061542aa16ef20d81e3a0f4e4521a6cd6c92fc26feef03b66c70e035cafcc19c96fb9d82918fe197780eff0eda6e2512c56e2a73d77032b768919bea9772f5989c8b6c65c3d1e97a2180cc3a37579da70ce9806ac1285a3eab415c0607d88cb86542eab90b9d2d67fafffcad23a714000ee59ed68c956e81c445428882f97af74db362e45c0d1bd8856eed166e4aec4bfdf95eadb251e2a1ef804852a9ea77d34577fe70831a928b101b60ac613e7ba2e6ba0a94013a64c2f8219fd30bff409099667a786f99327bb03e2f2187f445b46beedab6d325afd904e39543e93f4b6c5443249d744b2d1a43e141e4768bd40aabe4057244e1eadd9daec175719e51a093ace32fe82b2eacb5ecb0da6c1ffe98c8cee7886e301670dff87113efed4282471afb6b8a0fdb505e2e8e7dbc1a08a22e9680bd098bf1275802bdb459413a3b237d7713a1bbf597e6adf2b60eaf823791b3", "signed": "6e7c66acc954ffd9dd4c1c6335ab4fe79dbbed782c4a47ec30d848d8bb2b4f1069dc62e522a1e8017f54a6345e1728c073af6447856d8c1ed35878b571e5230d554560f7a7fd1ae7758a2fce7d780f6b3f043d3af89d4f19ef573c34997554df243faf2aaab65b2afdd28610d4a51e9a4b464db6db09ebf73b7d24054cc9b12814bb29ee99e1a73bd603898360f9dcf01e670836286f8236ed8cef075f3d563312c16c73fc37eedf252f8f42d30a13e7fba3b165238c7f81eaaeb53190f3ec3b5d63f0ee03e3987e390d1d81e8277e9f6c1ee6ec4ec3fa0d720e9f53f9c26f04aa2ed2b5ef3160895999eace29cf5dc254ad71106bb7e8bc29a5b1d2412593d08194e88e1659a73159a2a22033ab066e8d3d8c3bc86b7b01de81a8c66047b07fe24ed240318ba37ba3efb6cf632604ca4f446a75fd8e70c453f0c60ee16ecaf524e703f47df5c282ca3289b3af61dee4709ee085323b1e5c8a6bc0766201c635031446891f3494e9db20dd4e9e0838249a67e138d13ee2c96f61e771061542aa16ef20d81e3a0f4e4521a6cd6c92fc26feef03b66c70e035cafcc19c96fb9d82918fe197780eff0eda6e2512c56e2a73d77032b768919bea9772f5989c8b6c65c3d1e97a2180cc3a37579da70ce9806ac1285a3eab415c0607d88cb86542eab90b9d2d67fafffcad23a714000ee59ed68c956e81c445428882f97af74db362e45c0d1bd8856eed166e4aec4bfdf95eadb251e2a1ef804852a9ea77d34577fe70831a928b101b60ac613e7ba2e6ba0a94013a64c2f8219fd30bff409099667a786f99327bb03e2f2187f445b46beedab6d325afd904e39543e93f4b6c5443249d744b2d1a43e141e4768bd40aabe4057244e1eadd9daec175719e51a093ace32fe82b2eacb5ecb0da6c1ffe98c8cee7886e301670dff87113efed4282471afb6b8a0fdb505e2e8e7dbc1a08a22e9680bd098bf1275802bdb459413a3b237d7713a1bbf597e6adf2b60eaf823791b3", "signature": "6e7c66acc954ffd9dd4c1c6335ab4fe79dbbed782c4a47ec30d848d8bb2b4f1069dc62e522a1e8017f54a6345e1728c073af6447856d8c1ed35878b571e5230d" }, { "secret_key": "aa0fdae2a5a4c9c04521913004cd89efbc88b2dadf5abb246f3ca7f6923544af", "public_key": "bffcb17c35c1304cdd9d624ff69bee60ec7c9ec327d12350d70fac12b47cc25c", "message": "b14184cfdc4a5f0c7f83f94a832f588507e2d72a89329870078571d208a0c4960c2fdc4c236cf88229981d12b10a1b6884c8650ddaf1d4b2eb981575b1e019fe3f60423676f8856a992cce36d6d0a3d026631c8c1e1ffe34134b296f40842b6df4f86f833e0175bae50e86bf856d1ee79925f434b8bf2c84519f1f5d25386049ce3ca61777e30b700a602d395250b60fc64ac6f8db027e8da8b9550f24ed11a11d9f9f9c5e0af145b8659751ac6b55861f6388a64336b31efe45c0802d76a53486a81eba07314b4d961c141ab34e2f76edac0e6de31422df792af081e769c7ed05da9a5af2fdf36f141769908b700937f0e1068c131f176eb96c67afdbe78f40d86007fbcd47e49e2e4c4ce049936adff1ce3eac42b96b3429b5626b1aa62acde07f45a13ce1bd211f32bd7efe4790c8371ebf87c164477a5c9fa3e78c2f88077b097344cffa031c4429c7f42dca07737850ee7a769b36d0f0625adf120ea23ff4e393a4fdcb6558dbf9b266a032e3b0599b9d6692fcebd815a3897607856325fcd0115dc310db3a8792fbebd399494c8371e585727b3d632414496893d03813ba1f99661bceb9dc18ec5dc27f52670318687769fc678ddc7e40227c200522013f5c0eec0e4781e6fc153a0c2f4f3f95e517c8419924ab39992af8c19465057f134486696ba7fd4651768b4e749ef36f02444617cf97f0a423e4c13b7b66ba2b6c456878b0b50ce2ee5ec564ed8854f782aa1d1c6aa760f2522c7d97b9b1abe0ba810959d7aa403a99375aa3e39a115d1fc6fedd002f3830a50a837dc720329ec0c73d5bfd500385c736838287e19201525d189c3a084cd5a3f359875e3b8325289ced18b63b00ff9cd070c3e67444bd3d8346174085cc45135caa0c67b3226e4a52e9a1c55aed7ec5fade6bf16c19", "signed": "f937298969ca34d97584448907358b0f47841f3023afc7ef7681521c5be0f5e5628a8f607e2f31636ef63646b0e9898a72ad355706d2c8060fbc640efb3d6605b14184cfdc4a5f0c7f83f94a832f588507e2d72a89329870078571d208a0c4960c2fdc4c236cf88229981d12b10a1b6884c8650ddaf1d4b2eb981575b1e019fe3f60423676f8856a992cce36d6d0a3d026631c8c1e1ffe34134b296f40842b6df4f86f833e0175bae50e86bf856d1ee79925f434b8bf2c84519f1f5d25386049ce3ca61777e30b700a602d395250b60fc64ac6f8db027e8da8b9550f24ed11a11d9f9f9c5e0af145b8659751ac6b55861f6388a64336b31efe45c0802d76a53486a81eba07314b4d961c141ab34e2f76edac0e6de31422df792af081e769c7ed05da9a5af2fdf36f141769908b700937f0e1068c131f176eb96c67afdbe78f40d86007fbcd47e49e2e4c4ce049936adff1ce3eac42b96b3429b5626b1aa62acde07f45a13ce1bd211f32bd7efe4790c8371ebf87c164477a5c9fa3e78c2f88077b097344cffa031c4429c7f42dca07737850ee7a769b36d0f0625adf120ea23ff4e393a4fdcb6558dbf9b266a032e3b0599b9d6692fcebd815a3897607856325fcd0115dc310db3a8792fbebd399494c8371e585727b3d632414496893d03813ba1f99661bceb9dc18ec5dc27f52670318687769fc678ddc7e40227c200522013f5c0eec0e4781e6fc153a0c2f4f3f95e517c8419924ab39992af8c19465057f134486696ba7fd4651768b4e749ef36f02444617cf97f0a423e4c13b7b66ba2b6c456878b0b50ce2ee5ec564ed8854f782aa1d1c6aa760f2522c7d97b9b1abe0ba810959d7aa403a99375aa3e39a115d1fc6fedd002f3830a50a837dc720329ec0c73d5bfd500385c736838287e19201525d189c3a084cd5a3f359875e3b8325289ced18b63b00ff9cd070c3e67444bd3d8346174085cc45135caa0c67b3226e4a52e9a1c55aed7ec5fade6bf16c19", "signature": "f937298969ca34d97584448907358b0f47841f3023afc7ef7681521c5be0f5e5628a8f607e2f31636ef63646b0e9898a72ad355706d2c8060fbc640efb3d6605" }, { "secret_key": "7162fef0aca4974b094a6a08054395f877ff9433f1e33e20e88eaa90f938997d", "public_key": "a280640f139f45c35a4871537eefe6ef9db02de785ee9fd54f805fb57d3746ef", "message": "c90f450bda1c6efd8d1278debd7ae03e2eac2740a5a963fcf96c504e31d4d6fcc5e2b52a2518d2741c55e9591867b2423228f9c19f33c6f38705c62036d480ff53df12077e38fdb073c673105da1e11619ba5321a71b5f4993234a11948ea110cfa242bc23fac9aae462606e39641ca7147eebba1eec553fce94e53e4e01b073dd780a2ff678b31572ca11ee0877e756bcdb6653e5e1b4cbfb569a9d60e3ee336182dcb9b25d1be6dbf9b5c7146d775585834cabde0278aee5d57c85e983f84d8833a9e15bcc11198e1c1da6ba59282129f1db966f5460c8fb6530fbc3a98a31fc0f4e9b337366eec1dce108c826d49045abfa12ee88797f08f0683fef77edaa3543b91cb118e424d9c408da547431125107d9b0744c2443ce9917e1e328d81850babbc94d920a1d06e524dbb6c23dd82e1787822d71c4cdc409ae85ba4deb581f934748f75e7a769b9d68c4589e594e65cb6c8f4903ffbabd5a326e89441a542f8ac264ccc64e95a8982a710b6c56ff7d10916afc409ea8a41b74679dd6a766f59c52b9305ba733b13c9e811ee13083925f4200682bd05dea339532522970aa149d004a2ea20ff461e9ec0f3b62565c1a106259c836605cc27cadc9515cb9979e89af287c027d75edbf87d5cff63a7fec9bd10e7877ab9bf868d734bd3a2374cef7025cc4dab710e254806685a136ecd03e36770346513a15145b890eeef47b80ea08e46c81d202e533e9a06a38a6f76ef57a9c736ec78d00b808e3ffd9c79b9dc7a2e589907656c932ab8a8b57da1a495ba7452015e7924b5269ab1f67bdb43a35831487ab9002f52d78b134cd3751925aaab0b45c8e6b0f2bf0cc9a4659317108fba9136aabb0921a58fbb9b50e51243f9b531847dc9657e96fbaf7aa698fe6fe44f90590144c70337250c58bc5dd", "signed": "ae161cce95403384b65c6bc9b393eb072564c35f3a6c04fa517ab068bcd23767cc0c8edd92b1a13ae9a9ce4864137fb89c1f37b748cfc9134b6741ba1b22280dc90f450bda1c6efd8d1278debd7ae03e2eac2740a5a963fcf96c504e31d4d6fcc5e2b52a2518d2741c55e9591867b2423228f9c19f33c6f38705c62036d480ff53df12077e38fdb073c673105da1e11619ba5321a71b5f4993234a11948ea110cfa242bc23fac9aae462606e39641ca7147eebba1eec553fce94e53e4e01b073dd780a2ff678b31572ca11ee0877e756bcdb6653e5e1b4cbfb569a9d60e3ee336182dcb9b25d1be6dbf9b5c7146d775585834cabde0278aee5d57c85e983f84d8833a9e15bcc11198e1c1da6ba59282129f1db966f5460c8fb6530fbc3a98a31fc0f4e9b337366eec1dce108c826d49045abfa12ee88797f08f0683fef77edaa3543b91cb118e424d9c408da547431125107d9b0744c2443ce9917e1e328d81850babbc94d920a1d06e524dbb6c23dd82e1787822d71c4cdc409ae85ba4deb581f934748f75e7a769b9d68c4589e594e65cb6c8f4903ffbabd5a326e89441a542f8ac264ccc64e95a8982a710b6c56ff7d10916afc409ea8a41b74679dd6a766f59c52b9305ba733b13c9e811ee13083925f4200682bd05dea339532522970aa149d004a2ea20ff461e9ec0f3b62565c1a106259c836605cc27cadc9515cb9979e89af287c027d75edbf87d5cff63a7fec9bd10e7877ab9bf868d734bd3a2374cef7025cc4dab710e254806685a136ecd03e36770346513a15145b890eeef47b80ea08e46c81d202e533e9a06a38a6f76ef57a9c736ec78d00b808e3ffd9c79b9dc7a2e589907656c932ab8a8b57da1a495ba7452015e7924b5269ab1f67bdb43a35831487ab9002f52d78b134cd3751925aaab0b45c8e6b0f2bf0cc9a4659317108fba9136aabb0921a58fbb9b50e51243f9b531847dc9657e96fbaf7aa698fe6fe44f90590144c70337250c58bc5dd", "signature": "ae161cce95403384b65c6bc9b393eb072564c35f3a6c04fa517ab068bcd23767cc0c8edd92b1a13ae9a9ce4864137fb89c1f37b748cfc9134b6741ba1b22280d" }, { "secret_key": "dea180c91b533aaf736bc5d3c8e474d5e5d475b75b92cde6bd1d10f3b8f55ad4", "public_key": "30b20fb320b00e77c4e0a8eb3730af3c0b1c5f5ed9ee2b0562707e4f55c4938b", "message": "606144b7d4f96bef7f112b6d41bcb500d2136c134ceda220e24d0f1524eca12c30f2b102c7f378d6bba259c5b4a5ef8ec9309d5c8da7e8d2ded3792aeeea2108f77d66b23045938ed64751f20d48326be2fb99628cfb1873d7dd27581c105ec13249a952a50784b8b34cb3b2c1a004fa8b628a0767fa9abf058d955df85d134a0fc7f4b7d7fb0c8d31bce345dd0a4282145afb2ff19751f2cc3a1caea242baaf538749bf388000e3dc1d739359dfebae64ae1e10fb6fc17cc9fb950535c2de129587a86859b7be36dfe9b6c1141b25e0915c8d4aa1cceae7046b3d7cfa940bc98d4d69fc5a30dde1dee42fb5272281bf8f8e7f3e1a04397fb4f3adefc57532ddbde36833a676e6f39c82aff6bf4832ec971e03be3829c02a203c82d9eb8c1630ee9693f45d26f5f51a3103ca64d468eceac1b29af4c42eb216d76ec8994836b4bec76489ca5070680c2c2eb457210a77c47fdcbf600172073a53f1453bb5c80439c882f0736de40637b4f5ab1f761ff355c6e9bd4abde7560d5fc113c830159a1b77c4e87bc2c69880a40c5805ecc8aaaf57575bccd8177fc6b83569233c0f5ca223ac4013ca106cac2854706aead714fa29f2860a5f9753268a3671d9f59cde6048cf0b8986050f7f549e4fd7557f2fc3fcdccddcefda586a64b3006e5825f27ca31687caf663bd90a05b1152d7c88d7f1051a9d791748651d888a6a12f22d6c8c3f78c2b86eaf5394b4ef7eefb89797b25e542dc93102d021a1d0bed6a7dcdd8102b8f0430a0bc21d904a3c9346c018343dd9937cb35250007a284825db08e9a11fee31cff7a314c48c42d8b314acc27822af03d1954c7cc8bf9ad4e9e98f4ad4efb355288daa8c90de9037e64a7861f5ee43ada9f0fccde34d0bcf50288550f700f215a7944a5380e2a8e3f04f2b4f5", "signed": "d083333fb84e79c9b33e55e8192d571ffc8dc50745b6b5fdd8c44d92a63fd178c4e57c2ab3a1211c0ba2d39da30b06629d8d1cc1d9f2593263d524fa5a2ebc03606144b7d4f96bef7f112b6d41bcb500d2136c134ceda220e24d0f1524eca12c30f2b102c7f378d6bba259c5b4a5ef8ec9309d5c8da7e8d2ded3792aeeea2108f77d66b23045938ed64751f20d48326be2fb99628cfb1873d7dd27581c105ec13249a952a50784b8b34cb3b2c1a004fa8b628a0767fa9abf058d955df85d134a0fc7f4b7d7fb0c8d31bce345dd0a4282145afb2ff19751f2cc3a1caea242baaf538749bf388000e3dc1d739359dfebae64ae1e10fb6fc17cc9fb950535c2de129587a86859b7be36dfe9b6c1141b25e0915c8d4aa1cceae7046b3d7cfa940bc98d4d69fc5a30dde1dee42fb5272281bf8f8e7f3e1a04397fb4f3adefc57532ddbde36833a676e6f39c82aff6bf4832ec971e03be3829c02a203c82d9eb8c1630ee9693f45d26f5f51a3103ca64d468eceac1b29af4c42eb216d76ec8994836b4bec76489ca5070680c2c2eb457210a77c47fdcbf600172073a53f1453bb5c80439c882f0736de40637b4f5ab1f761ff355c6e9bd4abde7560d5fc113c830159a1b77c4e87bc2c69880a40c5805ecc8aaaf57575bccd8177fc6b83569233c0f5ca223ac4013ca106cac2854706aead714fa29f2860a5f9753268a3671d9f59cde6048cf0b8986050f7f549e4fd7557f2fc3fcdccddcefda586a64b3006e5825f27ca31687caf663bd90a05b1152d7c88d7f1051a9d791748651d888a6a12f22d6c8c3f78c2b86eaf5394b4ef7eefb89797b25e542dc93102d021a1d0bed6a7dcdd8102b8f0430a0bc21d904a3c9346c018343dd9937cb35250007a284825db08e9a11fee31cff7a314c48c42d8b314acc27822af03d1954c7cc8bf9ad4e9e98f4ad4efb355288daa8c90de9037e64a7861f5ee43ada9f0fccde34d0bcf50288550f700f215a7944a5380e2a8e3f04f2b4f5", "signature": "d083333fb84e79c9b33e55e8192d571ffc8dc50745b6b5fdd8c44d92a63fd178c4e57c2ab3a1211c0ba2d39da30b06629d8d1cc1d9f2593263d524fa5a2ebc03" }, { "secret_key": "9daf6dbb7f762966e7a57c2ec1996e9f5b555b9866b8e31deaab4356eb13816e", "public_key": "f021b55a36d9fbfbf2978bc0df736b289c8241d6435309841a134b07d47ce4ed", "message": "544523900daa6778c0391ae4044a51c0c4a5e444133fbd7747d539a744fa60ab5dc54e1819dc8e56899c56efd7ef3da341790ecc49645ef325c6568ae971d30d21bb7f23464f46a24b80d49bb93c6e91de79b24331d0707f43d0665d0197743adff690d615a1c9258777fc47d0217142426a4734892eb622ab8e50bb128ec3a895266a3861a39768bc76096f581fd082df9b7223e85a8afbdb5caa4922af2a014bf8a5cd11e5c5ea93e91cd46d5a1b99b85a2670e321de2e32255afd67fe2c37fd932caca22d241faf4ccefeff58d6bd04cfaf11dedd29c8719ffcb02ef65c5d3eb78b4fc0d170a2e3432cc812f0d041d9760c13c12f7c7f2f84fe5e0f700c10b1a69ca466a70bdeff8dbec7d318fb09ddd827ef61caa6910bbc061cbda2b527ef2e59ed4c17229972f89567d705de9231924b41bb6e7c01fe854264474fa76b1f88cd57eac311171af103d23078424a12675f2fa36c2de0bf53c295feeb3157de958922986e32513dfa33b35e15c394a11c0fcc55b82d6dd0597cddd27ede7de12985a616e64026befb5d690482b3ff22c0dd21f27a086d37a0499ea36fe2c4b5a959d10e9a610cab1fe0d28cf1013dcae63d8fdee0ecbd8b4e19d5d040e2fad7d0413a38e8c4e73552ad46047b5bbdd15c09cc0d34e48b91fdbae2a9d162d4b21ee20a1ef535ea883595bc4951692a67163454c7367f134bf645d48f9969e3d4f0f9eaf4144ce980a0a2e3342c746c2bdc3ccdc2f8a7da57a0e8028782d30af5857d9efb37666df65d7cc384716661e61ff5c09752595e94112ca1a840d6e4f6ec0e55494c5b44f7c0f0d4a99cd70905bf8485561748f4dc0fd7a44a1b139113c38a1e8eb5c7a20f3e952eaea8ce38b207c28ed972718f031f477c6207ce433c515f5ac2840f4974f1f16989626c76bc98", "signed": "49b6bc46b7abb5694da94215efc4b30eea04ae2e73eb2da8e8c9ef9be2222498b17e13939646c29e32d645584640641590b1bbdbfe24f36c6f694bf87238ee04544523900daa6778c0391ae4044a51c0c4a5e444133fbd7747d539a744fa60ab5dc54e1819dc8e56899c56efd7ef3da341790ecc49645ef325c6568ae971d30d21bb7f23464f46a24b80d49bb93c6e91de79b24331d0707f43d0665d0197743adff690d615a1c9258777fc47d0217142426a4734892eb622ab8e50bb128ec3a895266a3861a39768bc76096f581fd082df9b7223e85a8afbdb5caa4922af2a014bf8a5cd11e5c5ea93e91cd46d5a1b99b85a2670e321de2e32255afd67fe2c37fd932caca22d241faf4ccefeff58d6bd04cfaf11dedd29c8719ffcb02ef65c5d3eb78b4fc0d170a2e3432cc812f0d041d9760c13c12f7c7f2f84fe5e0f700c10b1a69ca466a70bdeff8dbec7d318fb09ddd827ef61caa6910bbc061cbda2b527ef2e59ed4c17229972f89567d705de9231924b41bb6e7c01fe854264474fa76b1f88cd57eac311171af103d23078424a12675f2fa36c2de0bf53c295feeb3157de958922986e32513dfa33b35e15c394a11c0fcc55b82d6dd0597cddd27ede7de12985a616e64026befb5d690482b3ff22c0dd21f27a086d37a0499ea36fe2c4b5a959d10e9a610cab1fe0d28cf1013dcae63d8fdee0ecbd8b4e19d5d040e2fad7d0413a38e8c4e73552ad46047b5bbdd15c09cc0d34e48b91fdbae2a9d162d4b21ee20a1ef535ea883595bc4951692a67163454c7367f134bf645d48f9969e3d4f0f9eaf4144ce980a0a2e3342c746c2bdc3ccdc2f8a7da57a0e8028782d30af5857d9efb37666df65d7cc384716661e61ff5c09752595e94112ca1a840d6e4f6ec0e55494c5b44f7c0f0d4a99cd70905bf8485561748f4dc0fd7a44a1b139113c38a1e8eb5c7a20f3e952eaea8ce38b207c28ed972718f031f477c6207ce433c515f5ac2840f4974f1f16989626c76bc98", "signature": "49b6bc46b7abb5694da94215efc4b30eea04ae2e73eb2da8e8c9ef9be2222498b17e13939646c29e32d645584640641590b1bbdbfe24f36c6f694bf87238ee04" }, { "secret_key": "7186f8d168d9ddf17edbaf0e7b1abcb26da3e4c0272d9879c7fdff6421c4ea50", "public_key": "96b4a656232029fc1b8364703cbea7a5d7387518a88ced1a915ec8d886848132", "message": "a3e6cb6b84cc5cf1fb1a848b4b8ea7cb7c87e0445750c61f9aa5d77deddf949463ecd39bfc71f2610c2a9424847fb76f84c5da1fa10ef718a34566cec1b3e899e7252e8d4d346016498ff119972750061660baed312827583181073d1dc74b76c430ca30d409e4e8439c0fc48c00680629d43ae2a77d69228f7f8a1253af15bd2cb6bb1c1696550c4c790f449869630ab92b9c11cde1f961aa2103ec23f7d9f0fe9c3c4132582efa79a66ae3426e5105b80bfe5e04dc8bb1e38a3110cd72984b3ef02a0ca62ab638cbcfbc8a6b593d2613dc06ec86fee34f6518d4a3fbdc157237174564daeb6674cdc34f4d6537cf81d8aa9bddbf3aeda312daaeee336f9ed8bff81e294bc7d44d25cd787072e6cb414b65fb7a846fc065367ba8e37beffdf0b7ba8f98cdf1eb870f4e8b7130fa3429d2e24bce5994daf1aa65e5f603b631053dc510b2f097e86e9b9b552302757968d0136ee6754c42a32c990add9cb529bc89751dfa4e5e3a0badaf4cc40b6a09507f9fcd24c3ca72259599c6ee58d857b3a189e048902e885a3607426093cb0fab437c0fb0ed2f1e96e9441a7e954fe3ef7646e26a39a07033d0a1555dfeed9a6f57794af3a2abf0057e9f853ae5c30138fd80e2f29c2f4a93ad3145da10a3e31ce9ff9786ac65d86037d98b7aa6d11de8800010e133869eb67a5039b9b8feb6ef903d0cc746412607da725ce2dc6a352109dbc6a5e40b170c23050bc4fb1efa0c34fec00eae3219c29040e8f5978c9384ee915d8c9398dd120d5c3cba38f8526b06197cb2c261dec7d726ae130f9bee17261700e99931fac4b4dca0f758701acbf3707d47df5321130ec10bb3b13078c4dc5de3470f158b57dbeb878b3a8524e0ed2c9547545f0fddf13125e45bb23d6a7b383a187f4c5d54a7b4c83d5957f2cd7e6fbc", "signed": "a9c0499fc216a14532d736365c6355f938f8d8194fa1132848f83e490454d4bbf69269f12259fc6c074c1015e425e4f4f27c029c93334951361a35ad1176540ea3e6cb6b84cc5cf1fb1a848b4b8ea7cb7c87e0445750c61f9aa5d77deddf949463ecd39bfc71f2610c2a9424847fb76f84c5da1fa10ef718a34566cec1b3e899e7252e8d4d346016498ff119972750061660baed312827583181073d1dc74b76c430ca30d409e4e8439c0fc48c00680629d43ae2a77d69228f7f8a1253af15bd2cb6bb1c1696550c4c790f449869630ab92b9c11cde1f961aa2103ec23f7d9f0fe9c3c4132582efa79a66ae3426e5105b80bfe5e04dc8bb1e38a3110cd72984b3ef02a0ca62ab638cbcfbc8a6b593d2613dc06ec86fee34f6518d4a3fbdc157237174564daeb6674cdc34f4d6537cf81d8aa9bddbf3aeda312daaeee336f9ed8bff81e294bc7d44d25cd787072e6cb414b65fb7a846fc065367ba8e37beffdf0b7ba8f98cdf1eb870f4e8b7130fa3429d2e24bce5994daf1aa65e5f603b631053dc510b2f097e86e9b9b552302757968d0136ee6754c42a32c990add9cb529bc89751dfa4e5e3a0badaf4cc40b6a09507f9fcd24c3ca72259599c6ee58d857b3a189e048902e885a3607426093cb0fab437c0fb0ed2f1e96e9441a7e954fe3ef7646e26a39a07033d0a1555dfeed9a6f57794af3a2abf0057e9f853ae5c30138fd80e2f29c2f4a93ad3145da10a3e31ce9ff9786ac65d86037d98b7aa6d11de8800010e133869eb67a5039b9b8feb6ef903d0cc746412607da725ce2dc6a352109dbc6a5e40b170c23050bc4fb1efa0c34fec00eae3219c29040e8f5978c9384ee915d8c9398dd120d5c3cba38f8526b06197cb2c261dec7d726ae130f9bee17261700e99931fac4b4dca0f758701acbf3707d47df5321130ec10bb3b13078c4dc5de3470f158b57dbeb878b3a8524e0ed2c9547545f0fddf13125e45bb23d6a7b383a187f4c5d54a7b4c83d5957f2cd7e6fbc", "signature": "a9c0499fc216a14532d736365c6355f938f8d8194fa1132848f83e490454d4bbf69269f12259fc6c074c1015e425e4f4f27c029c93334951361a35ad1176540e" }, { "secret_key": "e86e8c62566e15753bd5577eaae7f24105b74055a25629580708bfc83aebf06c", "public_key": "8c8ce882d5f76586d8ddccc5579bcc1cdf4cfd7162304cb10e7696026e707f17", "message": "12fa631b0e482e9b9d633e94b82d8ab436fe548e5b95da92624623d13f2c70da775ba136c5229c16a0c7a6fa914b2feda564e17219e47370f9515bb1d59de6e9586204d943dc560d73e2e757f7eb39bbc7111bb46bc643c13f602112739bec778d7d4f49d092563d68f5776e430e3b0bf2dc1b01beb3040196da6302908bfe91e0fc38e04c150ef907dc736c445ff21fdbd2dc1eac0a0f5d00a30af028afe2ff61162b758c7da9a776666a112359431c48856a87ca82d3dd1c8af376598635432bf891becbc33a8fda44ce883ea8af4ad8b91a9261ce76b9e939c461fac53ae0f076e82d879aace8f38f120bc9b04d8125ed24bcd779d9d24386b1dd2017ebee8197376e8c36fa3aef8c1e713e2b8bce4966d84888681ba78495fbd1d6cca58626e6854cda606b83d6293d01e8e3e13bbf4aac851d9a1e00d0024e26993b0b3091be7e8061bcbb3cbb2302ceab96897a8e1ff367ec8625693cf31534124a9d5d725bcae001d67bc2111d0ab8111fa1d24e4ed06d63583ce690f2a04626d791d29e3e315a415bf2e853a5f2974c833a3fe2e2909cf669c73c1f59392d30c37f3b9c5a3ddcfd75621fda36e4ba2f16147858f6f206b9a140f1ddc1466c9a53ed73f82490bc95322c955f61d11cb51d5e8a58c6b3cb0fdf0419763201beea93a8512b1405245bfc384155adc5ce778aa74d00a322726465119af79501f040dd0a7a84060001ca89d2fe5e9cf9779a547e3ebd3bf8642990a3690e2b2c3e54cb7eeeeabc242b4dd99274c425a867931c929ca70808601c3908cfd788867d687dc366e976350c9e70584bd390d67eeb7cfea26c42686d3d9620f62f64104ef41ed1d130d79e325938486296b7ab2d2adb78526743e400acb2b7af09628d68cf9475101625c20e1dc051d73c997c952e12812c805b68ff", "signed": "54d2fd44acf9e209bc7e433372bd73074d07806a77c6ce228e9be994418b00c7ecbcb7ac006c294aec9de668572add517c06b4eb4fe2ff3523bf043df44d3d0d12fa631b0e482e9b9d633e94b82d8ab436fe548e5b95da92624623d13f2c70da775ba136c5229c16a0c7a6fa914b2feda564e17219e47370f9515bb1d59de6e9586204d943dc560d73e2e757f7eb39bbc7111bb46bc643c13f602112739bec778d7d4f49d092563d68f5776e430e3b0bf2dc1b01beb3040196da6302908bfe91e0fc38e04c150ef907dc736c445ff21fdbd2dc1eac0a0f5d00a30af028afe2ff61162b758c7da9a776666a112359431c48856a87ca82d3dd1c8af376598635432bf891becbc33a8fda44ce883ea8af4ad8b91a9261ce76b9e939c461fac53ae0f076e82d879aace8f38f120bc9b04d8125ed24bcd779d9d24386b1dd2017ebee8197376e8c36fa3aef8c1e713e2b8bce4966d84888681ba78495fbd1d6cca58626e6854cda606b83d6293d01e8e3e13bbf4aac851d9a1e00d0024e26993b0b3091be7e8061bcbb3cbb2302ceab96897a8e1ff367ec8625693cf31534124a9d5d725bcae001d67bc2111d0ab8111fa1d24e4ed06d63583ce690f2a04626d791d29e3e315a415bf2e853a5f2974c833a3fe2e2909cf669c73c1f59392d30c37f3b9c5a3ddcfd75621fda36e4ba2f16147858f6f206b9a140f1ddc1466c9a53ed73f82490bc95322c955f61d11cb51d5e8a58c6b3cb0fdf0419763201beea93a8512b1405245bfc384155adc5ce778aa74d00a322726465119af79501f040dd0a7a84060001ca89d2fe5e9cf9779a547e3ebd3bf8642990a3690e2b2c3e54cb7eeeeabc242b4dd99274c425a867931c929ca70808601c3908cfd788867d687dc366e976350c9e70584bd390d67eeb7cfea26c42686d3d9620f62f64104ef41ed1d130d79e325938486296b7ab2d2adb78526743e400acb2b7af09628d68cf9475101625c20e1dc051d73c997c952e12812c805b68ff", "signature": "54d2fd44acf9e209bc7e433372bd73074d07806a77c6ce228e9be994418b00c7ecbcb7ac006c294aec9de668572add517c06b4eb4fe2ff3523bf043df44d3d0d" }, { "secret_key": "a5cab2727e2f131a4d63facee799336663930aa07afda6bd5a8e985a02deb1ea", "public_key": "ac355f95260fbfea778c55b5af8b3fd1f24d2693da35de4ee508a27ed350391f", "message": "483439154dd5e5d109857c24d1c4e7fbbefd2f38651da81289f2ad3d6154306538b82ac7dba9210e740776ede4ccf51d4f63094b03e46ad3aa3c31947d8c36ce6f94e85296bdedcc1ead62eaa1441ecde0a225d0bf02edcacf865014899af66d9808040c2d02000a0f5ce4f1683c1a495276d9c4d728c9ecd6f078db8a0cfc267187238562ab1a1ea2813fb4f12e878e1ba143f4d06a3bc8100c3550118d69dae67b55ed692acf9444daa5c3e3c0a98ee28cf172de0c584c9f2ec9bb6e9b57f572a86ff8729f65f4c65b7feaccaa21720ed79e90618bcafbfd9533da85232b450883aa919f827f04c4a97bf51390d4f8569c191726f44f7e39fb3db73bfc415b6ffca8b91acaad69238572f14b49985ea03c98d7b1d44b3a6554765b19abf9b25274e97e4634e4b0f9e802eb6f743fff950757ee013a6988221881a7443f1f32bccb007e99379c7ca4f906d5fe11cb12f66b53a3d21ac947be0c8150bcd04f1c816b3f0c07c5fbc0905a7136956849da03836daec25c3e1a06ec3aeb205648176f89f4a291fac4f1d3899f56c9065eebb8768b84b31b7cc03108bd0888338d1774994970292d935031fea335d9e7908fe0254889c0b171cfe0af2e6fde7a5ea3de1fdcdae537b6313119c27f772024ef36e45c8b89f26c93d9eea13725e12d810cf9824aea04cb802da7e458e842ca375e3671346e0089dec571be169b0d90966bf368fe3698fd3e72bf16249dd900af6d29ffa48351360f12241714585f7a9b4c7bafc952226735de1462743d78abad0f6711f2495f3313ad4e0ba216b0dea5dc1516a9549f7dfcfeb93e591abeda5ea3c7045906523b40868ca5735d6a3371c3c294c11126d097f4c708e90464c1ad9142fa0bedf07dfc5f4cb67d6ed80f1bfe72683cfb2ad66530dc43d7023f3790ff42d95bd8", "signed": "138c7a8eca5b5c37158813843c9a904e5f530ad971ee432a44f344f8c64bbfaf102ff41daa5cf722a4bc6640588759b8f36f9c059eab936cc45ed4796394a002483439154dd5e5d109857c24d1c4e7fbbefd2f38651da81289f2ad3d6154306538b82ac7dba9210e740776ede4ccf51d4f63094b03e46ad3aa3c31947d8c36ce6f94e85296bdedcc1ead62eaa1441ecde0a225d0bf02edcacf865014899af66d9808040c2d02000a0f5ce4f1683c1a495276d9c4d728c9ecd6f078db8a0cfc267187238562ab1a1ea2813fb4f12e878e1ba143f4d06a3bc8100c3550118d69dae67b55ed692acf9444daa5c3e3c0a98ee28cf172de0c584c9f2ec9bb6e9b57f572a86ff8729f65f4c65b7feaccaa21720ed79e90618bcafbfd9533da85232b450883aa919f827f04c4a97bf51390d4f8569c191726f44f7e39fb3db73bfc415b6ffca8b91acaad69238572f14b49985ea03c98d7b1d44b3a6554765b19abf9b25274e97e4634e4b0f9e802eb6f743fff950757ee013a6988221881a7443f1f32bccb007e99379c7ca4f906d5fe11cb12f66b53a3d21ac947be0c8150bcd04f1c816b3f0c07c5fbc0905a7136956849da03836daec25c3e1a06ec3aeb205648176f89f4a291fac4f1d3899f56c9065eebb8768b84b31b7cc03108bd0888338d1774994970292d935031fea335d9e7908fe0254889c0b171cfe0af2e6fde7a5ea3de1fdcdae537b6313119c27f772024ef36e45c8b89f26c93d9eea13725e12d810cf9824aea04cb802da7e458e842ca375e3671346e0089dec571be169b0d90966bf368fe3698fd3e72bf16249dd900af6d29ffa48351360f12241714585f7a9b4c7bafc952226735de1462743d78abad0f6711f2495f3313ad4e0ba216b0dea5dc1516a9549f7dfcfeb93e591abeda5ea3c7045906523b40868ca5735d6a3371c3c294c11126d097f4c708e90464c1ad9142fa0bedf07dfc5f4cb67d6ed80f1bfe72683cfb2ad66530dc43d7023f3790ff42d95bd8", "signature": "138c7a8eca5b5c37158813843c9a904e5f530ad971ee432a44f344f8c64bbfaf102ff41daa5cf722a4bc6640588759b8f36f9c059eab936cc45ed4796394a002" }, { "secret_key": "cb6319613779a4ef66be14144b2840ad0167c03f3b8d04ff592cd1d2d722e330", "public_key": "18eb03f0a334b080e1af4399d8376d83c533316dc687cf341f0afab450965299", "message": "874a6c81d6db7133a79169760c84d36eea3d42ea0892b7c8dde844a3a6b60aa9f2660726c9c4dd26a01f4ed0dc1c53ba6005463f7ea64a1ec63953bc3d81052a2f1084389a7706df74ed4136082ab5c6e8c7f411df9d3a0f3c40f5a60e2d21a8548e7a25dee34030b3c3e75caa93ddaa9c190cb6deda2413d54e373d4353dba43d39491a2f56c8b36d45016f77d7471691634539e76c4fb41913472b0a23054f548f54b1e7109c8b6521b57ae981d050316a33c49c7116268dcc4b78c2bae53a3ae4dd178bb8b76bb3befe19e41a2cf12cebb71168f971f202461c63f7d6eef107f5b1030edd4e75009e9116c3cd0e8bddc299b41f1a45e784efa646dada64068e9248ec988f232634ad3d5aab19560e830a5bd665457c94295e1af0160fbce272ef4845ddf0c4f24d976f518690ea1f82ff4dfa4813641a67598ea98401e0ff10a0e582e2b90867b4e6232c34ea499c169909a44126f377d8cc1c11905866340efd1e7b077dc7456d59c9b96a124aac3b33bb227441bb7a52e6c3140d7a4f67ca05bbc93c93775b929119a224ed8f39005820f420cc6c530e61e20adca01e939cc031df49cdb1ec8ff493c9efbcad34c57108efd764558966fb1470b0745e6966191a9a9e44581b09faf469f951537203d926bc8a55d080a805181dd7296ed20a818268f755eaa66b082242f4d020f7cd6720890484c01c757fe35d87b5bc906deacc2e3071de4601bcf0dd6b837c433106047fd8ec9bd0e98c9ee806f7ec8c5a10ea2136f1f90f900b853f953f00b076bd1ebd929d08a38bec68d866435047bcb6721e06b64085dc0558c1fa85a2c83b0caf4c816084f10a4c5885295bca15ff7c18e596c62c92ee9921a27c29d195bd282213ff3660b6e7546b4eaa777ce39fc5d20484c71ed6ca06f9b77ab1d872393ab2d10255", "signed": "c1b399cdc198e9a159e684fc26686de660da54cfe312ca7345df0c7d15a35743014410bd2f6cd11eef33a89b3d15cbc17c7a358937fd997205051f9257c25609874a6c81d6db7133a79169760c84d36eea3d42ea0892b7c8dde844a3a6b60aa9f2660726c9c4dd26a01f4ed0dc1c53ba6005463f7ea64a1ec63953bc3d81052a2f1084389a7706df74ed4136082ab5c6e8c7f411df9d3a0f3c40f5a60e2d21a8548e7a25dee34030b3c3e75caa93ddaa9c190cb6deda2413d54e373d4353dba43d39491a2f56c8b36d45016f77d7471691634539e76c4fb41913472b0a23054f548f54b1e7109c8b6521b57ae981d050316a33c49c7116268dcc4b78c2bae53a3ae4dd178bb8b76bb3befe19e41a2cf12cebb71168f971f202461c63f7d6eef107f5b1030edd4e75009e9116c3cd0e8bddc299b41f1a45e784efa646dada64068e9248ec988f232634ad3d5aab19560e830a5bd665457c94295e1af0160fbce272ef4845ddf0c4f24d976f518690ea1f82ff4dfa4813641a67598ea98401e0ff10a0e582e2b90867b4e6232c34ea499c169909a44126f377d8cc1c11905866340efd1e7b077dc7456d59c9b96a124aac3b33bb227441bb7a52e6c3140d7a4f67ca05bbc93c93775b929119a224ed8f39005820f420cc6c530e61e20adca01e939cc031df49cdb1ec8ff493c9efbcad34c57108efd764558966fb1470b0745e6966191a9a9e44581b09faf469f951537203d926bc8a55d080a805181dd7296ed20a818268f755eaa66b082242f4d020f7cd6720890484c01c757fe35d87b5bc906deacc2e3071de4601bcf0dd6b837c433106047fd8ec9bd0e98c9ee806f7ec8c5a10ea2136f1f90f900b853f953f00b076bd1ebd929d08a38bec68d866435047bcb6721e06b64085dc0558c1fa85a2c83b0caf4c816084f10a4c5885295bca15ff7c18e596c62c92ee9921a27c29d195bd282213ff3660b6e7546b4eaa777ce39fc5d20484c71ed6ca06f9b77ab1d872393ab2d10255", "signature": "c1b399cdc198e9a159e684fc26686de660da54cfe312ca7345df0c7d15a35743014410bd2f6cd11eef33a89b3d15cbc17c7a358937fd997205051f9257c25609" }, { "secret_key": "b298adf38a6708f8d18ff1ed96bfbab421540d096c4e4351b92209b5e6aaab65", "public_key": "770edf42b8a039c6cab9ba65ebfb135abc2da314a4c309f46a8f325b52d06593", "message": "9df4d5d7565d2c052262dd34d6007d86d9c0f07c7089af6119e304f4d8011d7eaad77b3ef70cc280847d59f297202b7e1861aef334bf38de14740e8073c955a851d2cf3dadc3edce15be490eaa845ba553fc6e8746e52915e655af4b86c629d4c522783635d464a2825777d89d7097677ef0e5eeae38537ecb656e3b28dd07358fd9fb2cd462517286659aefc79d374d1d13ed93967c530cdea4f314a0f91d6289b4c7a4279b6f4c4abca33357f69ed84b9119637adb7c18e694cb3c56e73637da910735d43c38aa8086675a06ad370e5726881da5e1a1dc6144d6a62aff7fb0c352d88dc971a3d72d3071e14b47425356af1b019233538261451a99a6cf4a07ce9ab1c3990de6ab8de2116c756105c512b7a3eeb3157b158b321e444e806d890b3890ed9ddc869f1711723bb99a72bdb923d131ba4edbfbb6dae99a5c7b328d310df9a6d1dcd85918962833e89e20f5c5e6333ac861094ae9e799c8641b9baea11a2e0ec234be5930e02880859cdec0d978237cbea5c7c32c111bafdd4bfbffe4fb3485effecd51bd195a71404ca5b59afa252d7b5ff9d030f48c6faadbdba918f21a0cd39af56966dccfa25fb5a5cf9a4b26a7f5441df6e320e34b27393de2ecfbd69a1594909a6c685ec645fcf3048d0148fa38d3e8a64dc3c21ae44da7e46a5ea7936c2ba083689a78ca3ac60b87be6d23ea40f5961583742842e37525a49c5fe8fd15d7b0c9e8fccd07936d19538212f7373dbbf3df7d46adf9d9f5db09524c65b883ae6f6cefa24b19ec48ce28cfa734d9bd6e77837d1a14d6a19d345bfbea559e7e6bfb71ddad83cd8deeab687fe73c057488f8f2b3e2e26d13009f4d23e6619a23c0692af76669217d5ebd46085b398890e5c91fdb4db5ba40e7773d518d3cf00c0a5b5a4b0f1b85d62916a59e5607b7b1eb80", "signed": "e55f8d304122dc175cf0274674fc9dedfec2b5f8a2eeb1e3e7f8e0dfba0dac2d32f4e704ce91cd599184133c3bf1063d2fae63d73acc5772d718d811833186029df4d5d7565d2c052262dd34d6007d86d9c0f07c7089af6119e304f4d8011d7eaad77b3ef70cc280847d59f297202b7e1861aef334bf38de14740e8073c955a851d2cf3dadc3edce15be490eaa845ba553fc6e8746e52915e655af4b86c629d4c522783635d464a2825777d89d7097677ef0e5eeae38537ecb656e3b28dd07358fd9fb2cd462517286659aefc79d374d1d13ed93967c530cdea4f314a0f91d6289b4c7a4279b6f4c4abca33357f69ed84b9119637adb7c18e694cb3c56e73637da910735d43c38aa8086675a06ad370e5726881da5e1a1dc6144d6a62aff7fb0c352d88dc971a3d72d3071e14b47425356af1b019233538261451a99a6cf4a07ce9ab1c3990de6ab8de2116c756105c512b7a3eeb3157b158b321e444e806d890b3890ed9ddc869f1711723bb99a72bdb923d131ba4edbfbb6dae99a5c7b328d310df9a6d1dcd85918962833e89e20f5c5e6333ac861094ae9e799c8641b9baea11a2e0ec234be5930e02880859cdec0d978237cbea5c7c32c111bafdd4bfbffe4fb3485effecd51bd195a71404ca5b59afa252d7b5ff9d030f48c6faadbdba918f21a0cd39af56966dccfa25fb5a5cf9a4b26a7f5441df6e320e34b27393de2ecfbd69a1594909a6c685ec645fcf3048d0148fa38d3e8a64dc3c21ae44da7e46a5ea7936c2ba083689a78ca3ac60b87be6d23ea40f5961583742842e37525a49c5fe8fd15d7b0c9e8fccd07936d19538212f7373dbbf3df7d46adf9d9f5db09524c65b883ae6f6cefa24b19ec48ce28cfa734d9bd6e77837d1a14d6a19d345bfbea559e7e6bfb71ddad83cd8deeab687fe73c057488f8f2b3e2e26d13009f4d23e6619a23c0692af76669217d5ebd46085b398890e5c91fdb4db5ba40e7773d518d3cf00c0a5b5a4b0f1b85d62916a59e5607b7b1eb80", "signature": "e55f8d304122dc175cf0274674fc9dedfec2b5f8a2eeb1e3e7f8e0dfba0dac2d32f4e704ce91cd599184133c3bf1063d2fae63d73acc5772d718d81183318602" }, { "secret_key": "e9cf16d696f63b59e5e25c9ee2d75bb05ed2baa591a7557f9fb129cf983de0ba", "public_key": "6d1ae385e80a3955e8d0c593a81f431cd432671e78cdbafe83fe58dbcdb98560", "message": "a10fea8fc93eccfe2a6b7826079563adf8aa9a666444932200cca9447dd027c5c7204ea62bf8f5e2e39145ac3948ab3f3186887b30bc60233024b483f3f519036a3e94c8d7510a853ac6e20c6e526ee3cdb76de663f67305ad80df2342c8501b4f4a8ee3665a798fc437dd814e4e47e7a466890e0ffa8f510f3e6e19c9c969f70a76e5cf3054d17de459ac8ee99550bd38319f36e433434a926ad68b961e0ca10add4ba992b3650660a2c3c26f5d740a31afb7763f542f723b8a3c92d8ae92a567764efc70530312baabdd3fbbd527fe0fcbca3f6a7064cdde1856e97ab786af7d7022a9d46a338e8e1754afd9adac856a38de2a4c9766dee8dbc709b0671a6a6e6e1e5d12074d22245cd73beeeb1bd8ecfc1e85a21bde253f7c465abc1feaa961c0ff5cff2d896472ae17ab8488e33ffefdb72c105e204f944ada51ee13981a136c0f38426e3e49b0e91841c32794d52f1335dfa637f151c7e40f9b830aed539ac5731b81cde3264d22bead31a6cc68d1a73143b5ba4816139232f3f7f97983f4ecba64c49553be9d6d943f91dfe03d1ee8618cd40d2fb7238a31d1bc38e76a551f9eee22e73a27d7a48b408772ea72c3ed637bb4b168f9d7aead94ea03bc11109901c889927d51cdacf962125962559979d3e4c8e3b5ae582f2dbad4998802856c4df69e8fb54917e2f36bb67a19a26e9a9a9485bce98dbfff0d2b02b9377a9137a734e57b5ce665053017e992677a1aa079240d2cf963cdf9bfea8d460091232daf89801fd75171a6195a5c046815914be1f62868783d6f2cf28af9378d6c6893e75de641111c684727effa31b8bc9b0a01db9c9e81ccd8f4d4e875d4bd90d253f58989a8a52a203a77a496d697986b031e9f699bc6a16cd5f9c36018ebdaa36bad0e014f4cf3b4b746171bf89314e8b72cbd47cc616a", "signed": "8112ac37eafb749d3f4a1ea1484379df3e383b019c12de8515e349e4f6f998632e30968347a1d15b09da2eb800b03d819d202bd10a6a463bb02b366d6855fe0ea10fea8fc93eccfe2a6b7826079563adf8aa9a666444932200cca9447dd027c5c7204ea62bf8f5e2e39145ac3948ab3f3186887b30bc60233024b483f3f519036a3e94c8d7510a853ac6e20c6e526ee3cdb76de663f67305ad80df2342c8501b4f4a8ee3665a798fc437dd814e4e47e7a466890e0ffa8f510f3e6e19c9c969f70a76e5cf3054d17de459ac8ee99550bd38319f36e433434a926ad68b961e0ca10add4ba992b3650660a2c3c26f5d740a31afb7763f542f723b8a3c92d8ae92a567764efc70530312baabdd3fbbd527fe0fcbca3f6a7064cdde1856e97ab786af7d7022a9d46a338e8e1754afd9adac856a38de2a4c9766dee8dbc709b0671a6a6e6e1e5d12074d22245cd73beeeb1bd8ecfc1e85a21bde253f7c465abc1feaa961c0ff5cff2d896472ae17ab8488e33ffefdb72c105e204f944ada51ee13981a136c0f38426e3e49b0e91841c32794d52f1335dfa637f151c7e40f9b830aed539ac5731b81cde3264d22bead31a6cc68d1a73143b5ba4816139232f3f7f97983f4ecba64c49553be9d6d943f91dfe03d1ee8618cd40d2fb7238a31d1bc38e76a551f9eee22e73a27d7a48b408772ea72c3ed637bb4b168f9d7aead94ea03bc11109901c889927d51cdacf962125962559979d3e4c8e3b5ae582f2dbad4998802856c4df69e8fb54917e2f36bb67a19a26e9a9a9485bce98dbfff0d2b02b9377a9137a734e57b5ce665053017e992677a1aa079240d2cf963cdf9bfea8d460091232daf89801fd75171a6195a5c046815914be1f62868783d6f2cf28af9378d6c6893e75de641111c684727effa31b8bc9b0a01db9c9e81ccd8f4d4e875d4bd90d253f58989a8a52a203a77a496d697986b031e9f699bc6a16cd5f9c36018ebdaa36bad0e014f4cf3b4b746171bf89314e8b72cbd47cc616a", "signature": "8112ac37eafb749d3f4a1ea1484379df3e383b019c12de8515e349e4f6f998632e30968347a1d15b09da2eb800b03d819d202bd10a6a463bb02b366d6855fe0e" }, { "secret_key": "238a6d4979321a14a997236f4585046cf7a05c0adc6ba1fdb19ec2a32f62beeb", "public_key": "0b4ba674e401665b6790cfda080704cd90e2f3d3efab253ed8dcfbd18e406789", "message": "97cd619a2251eda916646431d4cd1598c2d44d06af3e48bd18e3de7fb4bd4f78e00a69eeabde3f82065cfee6cd711f07d22637161ff685f65a7ddf54553197fd31c5c6b71d9e365a941dce4c3e225d19cc633a7e12862cd23ebb7c74a704850f761ac0241be517ce7c360936ce07250d9f2eb2787115eec377e1134dc08f44eb0a2a2a2716f00144a49f012a57b3cd06efeb3fae920f285cffd9a401a0b986594e17b2c9c8fdab835d9f3f5d474be733c1925ee6f09386711066c3fcd645eeb0fbe7054169eb709d4a3f0d16f28a1ff5066c842bc63e359e92485b38757ff46c27f79d0cdcf0e16e97e3c7b7e2178dffd270282dd61205d5854d841f0e3fc0e482cc1ee48552cfe658935b5427c366230aef79aef4021d6fab5f1875cc849e321a75500e9e1ba5dd596b438cf88b235b01a67625c4bf84d0724ae6880a3785e33bd9235fd0f5981804d21cbd633cb180f34456460207a290a254d9fe61063d40634ca3872f0935fa28328795ca41b006a2111fc5932b1e779ce966cc47adb7c0dd987333ba7529a1a4996ce9f56e051981fe1f553e578f43c3ba94beacc93c3e739667c7a7c6fa27e1e081695d20ba705c3f10b20df530cbb0ecb87456501109687019318452785d38e766b3cd35b007d7e3cfe0b2cca8aa6ef7395599dcb9c4d28bcc35c76dfc35343cb1348ba3e962f10ee86f86f5b6d4cae2e8c2b185e3eaa1aeb87bcfcf2fb76cc7fcc6895071b168e8b7f6caa0fd6398e778cc07912ff5d6e61021a8a59ae0352160f56d5488fe2f2acc9403da9a9ffc661c1e9dc5be88c420db0fd77d845dc8dd9d8e58f9961b79afc68624baa86aa643a8a3c7edf71d553cc0d3224a6069ec674f52da29a1cb60c4192301a24347a8aa8326269e0a14780c9583cdff515927fd5bef528f9d23787aeb803d70eb916b", "signed": "2942f708c0ede4cb0ddef13b85d71d7213e0383dd294f534135fd69cafbcfc0e33090a2a0ca3fa572c72cdf5592de903b1584495ab63998150f2b393a3b3400c97cd619a2251eda916646431d4cd1598c2d44d06af3e48bd18e3de7fb4bd4f78e00a69eeabde3f82065cfee6cd711f07d22637161ff685f65a7ddf54553197fd31c5c6b71d9e365a941dce4c3e225d19cc633a7e12862cd23ebb7c74a704850f761ac0241be517ce7c360936ce07250d9f2eb2787115eec377e1134dc08f44eb0a2a2a2716f00144a49f012a57b3cd06efeb3fae920f285cffd9a401a0b986594e17b2c9c8fdab835d9f3f5d474be733c1925ee6f09386711066c3fcd645eeb0fbe7054169eb709d4a3f0d16f28a1ff5066c842bc63e359e92485b38757ff46c27f79d0cdcf0e16e97e3c7b7e2178dffd270282dd61205d5854d841f0e3fc0e482cc1ee48552cfe658935b5427c366230aef79aef4021d6fab5f1875cc849e321a75500e9e1ba5dd596b438cf88b235b01a67625c4bf84d0724ae6880a3785e33bd9235fd0f5981804d21cbd633cb180f34456460207a290a254d9fe61063d40634ca3872f0935fa28328795ca41b006a2111fc5932b1e779ce966cc47adb7c0dd987333ba7529a1a4996ce9f56e051981fe1f553e578f43c3ba94beacc93c3e739667c7a7c6fa27e1e081695d20ba705c3f10b20df530cbb0ecb87456501109687019318452785d38e766b3cd35b007d7e3cfe0b2cca8aa6ef7395599dcb9c4d28bcc35c76dfc35343cb1348ba3e962f10ee86f86f5b6d4cae2e8c2b185e3eaa1aeb87bcfcf2fb76cc7fcc6895071b168e8b7f6caa0fd6398e778cc07912ff5d6e61021a8a59ae0352160f56d5488fe2f2acc9403da9a9ffc661c1e9dc5be88c420db0fd77d845dc8dd9d8e58f9961b79afc68624baa86aa643a8a3c7edf71d553cc0d3224a6069ec674f52da29a1cb60c4192301a24347a8aa8326269e0a14780c9583cdff515927fd5bef528f9d23787aeb803d70eb916b", "signature": "2942f708c0ede4cb0ddef13b85d71d7213e0383dd294f534135fd69cafbcfc0e33090a2a0ca3fa572c72cdf5592de903b1584495ab63998150f2b393a3b3400c" }, { "secret_key": "59d501393dc5999723810706fad7d6efd163c44710c741c185c27e0425e3c05b", "public_key": "8265d43cfb0735b5d7250fcf0fcbd154bfc0eecb13b7ad93b6b02940588b843b", "message": "564ed22c172f5c3afbb0b95ad2fc64e4be6d4db1ebb8d399c43a5e16048e7f8732181e5d0eed8e638ef2a55aa0d7b681fe02bb5423af94bd352d3c2ddec0f84760a4112b4fe017cfbc502f9543cfa41fb2aae75a3a081f8c499033d1fae5d9c50cb44dbc63605a54398fbf079852eba86f2fdfc272d0c4179d7c13cbc1c2a3da0b82845cf1a46ebbe31e79b6009733c7bfe7aa4f9ffd719c77dc7d748e492e14ee5e4179bfa9e649cf0d89534186385ee99410051d6656e623438cc7b2e707e48c84915549ae8d67a306c67b106b7a25f45f8e10dd7dd3eaac31f1052257eb6a7576b685cb9e6c1cd0d73c7a3ced5a8dd27308ae00f95eabdae9d1c4aa8934e2424c9328a5228f4f82dd4a66556d8217c5a22b2beb86a2a43413ee5e10f883f2cd6c2e8749b5508842ecae5ffccb796d9633e87ef4a96c0df7ef47b283d096723ba3135bad75b2e19ec04f70a478428ad5d0aac0dd2ab9905913e7e5ade408801d5d3c54d9cf7b8f0f0c5eb054c1475cc210a2c798d8bd89932ff9f360421858053a707b8bbd32055c44b20712a2678a9a6af9e36d04dcff44f431cf1930cd18fc935d2267775c69096725ed89a291dd60e21ac0b0128734072992823ef87b5efa6cc5b050177f55f4cec92a08a65bcadcab9a41c36086370b7b9dd6298ac7b0ae6a09c9710abb4676a8fc87a3651290144b6b30ef4f6fbe5b9ad25237fe0605e3b9f18a7718ac9fca6f325ea55f49a807fb80a2402ae13423080d327758649023798d5728e0dc64ac88a6e2945dbb3e3ffa9fdb4c7b58fba3f5fbd67c686b2971bbd8ba4d275d573eb796eb9146775d8cdcd5fd3eb5a88ea5a930ec3244e6a37c81f6a2554e5ba787f0e45319fe4b8a2ffbfed50770e7827b3e7bc2b44ce512ae6051b6f9f13931ea6acc096b8dcb0196be422484db5fcb299d", "signed": "e646f164cfed8c2e060710dcfbc3e9fa5eb396376813190184e346f52bb0ba5746ccb6b59522b1aff9830f2f98b9e5dafcd832077883c44e8a35388f718bf40c564ed22c172f5c3afbb0b95ad2fc64e4be6d4db1ebb8d399c43a5e16048e7f8732181e5d0eed8e638ef2a55aa0d7b681fe02bb5423af94bd352d3c2ddec0f84760a4112b4fe017cfbc502f9543cfa41fb2aae75a3a081f8c499033d1fae5d9c50cb44dbc63605a54398fbf079852eba86f2fdfc272d0c4179d7c13cbc1c2a3da0b82845cf1a46ebbe31e79b6009733c7bfe7aa4f9ffd719c77dc7d748e492e14ee5e4179bfa9e649cf0d89534186385ee99410051d6656e623438cc7b2e707e48c84915549ae8d67a306c67b106b7a25f45f8e10dd7dd3eaac31f1052257eb6a7576b685cb9e6c1cd0d73c7a3ced5a8dd27308ae00f95eabdae9d1c4aa8934e2424c9328a5228f4f82dd4a66556d8217c5a22b2beb86a2a43413ee5e10f883f2cd6c2e8749b5508842ecae5ffccb796d9633e87ef4a96c0df7ef47b283d096723ba3135bad75b2e19ec04f70a478428ad5d0aac0dd2ab9905913e7e5ade408801d5d3c54d9cf7b8f0f0c5eb054c1475cc210a2c798d8bd89932ff9f360421858053a707b8bbd32055c44b20712a2678a9a6af9e36d04dcff44f431cf1930cd18fc935d2267775c69096725ed89a291dd60e21ac0b0128734072992823ef87b5efa6cc5b050177f55f4cec92a08a65bcadcab9a41c36086370b7b9dd6298ac7b0ae6a09c9710abb4676a8fc87a3651290144b6b30ef4f6fbe5b9ad25237fe0605e3b9f18a7718ac9fca6f325ea55f49a807fb80a2402ae13423080d327758649023798d5728e0dc64ac88a6e2945dbb3e3ffa9fdb4c7b58fba3f5fbd67c686b2971bbd8ba4d275d573eb796eb9146775d8cdcd5fd3eb5a88ea5a930ec3244e6a37c81f6a2554e5ba787f0e45319fe4b8a2ffbfed50770e7827b3e7bc2b44ce512ae6051b6f9f13931ea6acc096b8dcb0196be422484db5fcb299d", "signature": "e646f164cfed8c2e060710dcfbc3e9fa5eb396376813190184e346f52bb0ba5746ccb6b59522b1aff9830f2f98b9e5dafcd832077883c44e8a35388f718bf40c" }, { "secret_key": "839fb132e69250ca1ad94510087f92ce068769213a19b2a6c89490f1f578807a", "public_key": "eb586619b44a15379acc4621a2ac71ea58970026c28e2409fc1ba2bd8b236d1d", "message": "c57232fe32f11e894b437d40456207cc306db48169b20e0781103affe802f5aabe8582952ca8e95745e9940d535e00ff65ab3c64bed3d1173a0f3d70ce4ebe2b50d048bb47164d2a2cd9d95a10cf0d073ed1c41b3de333528ee32968223a0d847cadbb5b69f382164e9a28d23ec9bde9a828e8771c9eb49220af54185508aa073a839195f103bc2f32fe04f951ca45bfbf30d2fb8114056a736addf27ecd9af0f6e5e97e5773c4fa902268c32a151410955f3c76aae255549e0f033f89e1a78f265cbab6beb7516d4badc49cda4588316225b4c85ea9fa99c7d6766e9490c49de59da717f667653530071dd2f0c53e31d8768156feb08faf00db0a04533df97957a84aa46aeb7e36c0b0be69018946f1538a6aea71df536f1442c2444a43a043d046abde1a782b0f4f5c6aa720aa60afed947c0cee477dbec00557b37212d93357ca2b6b6f82715ba0e484f6daf2d0b7a98c033519ce38263586796d5d31cb2bc3d1125bc0ccd329a5c21fd27a218ded607a0e7515b571f192c33f5fba514afe4d458100f3ccba3f38eb430b4fc88faef999fa71eee488228903be29f24df81dc911044e924cdaa017cc7d87e56a6cba8760859bd63dd2d4f581b955ec924a49afb47ca0d63e7826fdc712b4943b739e1857755a33c6503675fddeae062706e34f744fd932648a5608ce608a61995783f3339ca3fe107e1972744bf6d4edafbf47ce021e05821fb124c7083930e68e6f5c32d2d9fc4a884c0bc88404e4cfe3c1a2420d41823a385fb3288db65c89545f6e73f0d8004b2ba12a4e07727523ef085670daffaf41c28a4c1157bdd245e68750dd200e023af90c67561e0fe4ba340c433f755eefabd4b039bfc323dc11adb75aecc448a869c7f2a58b9d8617c64b8f89fc583f8c948e2df0251a6c7d8c738c3b5a42b749ad5e8e986bd8", "signed": "66437b6bc05e75dd1626c3c4ff1f72e6db381ba1590948f8f16ad4d66e5991659aa84405568cfbc0a77c025e59e43fd53ab9ffabba7b258f78796239f90d4501c57232fe32f11e894b437d40456207cc306db48169b20e0781103affe802f5aabe8582952ca8e95745e9940d535e00ff65ab3c64bed3d1173a0f3d70ce4ebe2b50d048bb47164d2a2cd9d95a10cf0d073ed1c41b3de333528ee32968223a0d847cadbb5b69f382164e9a28d23ec9bde9a828e8771c9eb49220af54185508aa073a839195f103bc2f32fe04f951ca45bfbf30d2fb8114056a736addf27ecd9af0f6e5e97e5773c4fa902268c32a151410955f3c76aae255549e0f033f89e1a78f265cbab6beb7516d4badc49cda4588316225b4c85ea9fa99c7d6766e9490c49de59da717f667653530071dd2f0c53e31d8768156feb08faf00db0a04533df97957a84aa46aeb7e36c0b0be69018946f1538a6aea71df536f1442c2444a43a043d046abde1a782b0f4f5c6aa720aa60afed947c0cee477dbec00557b37212d93357ca2b6b6f82715ba0e484f6daf2d0b7a98c033519ce38263586796d5d31cb2bc3d1125bc0ccd329a5c21fd27a218ded607a0e7515b571f192c33f5fba514afe4d458100f3ccba3f38eb430b4fc88faef999fa71eee488228903be29f24df81dc911044e924cdaa017cc7d87e56a6cba8760859bd63dd2d4f581b955ec924a49afb47ca0d63e7826fdc712b4943b739e1857755a33c6503675fddeae062706e34f744fd932648a5608ce608a61995783f3339ca3fe107e1972744bf6d4edafbf47ce021e05821fb124c7083930e68e6f5c32d2d9fc4a884c0bc88404e4cfe3c1a2420d41823a385fb3288db65c89545f6e73f0d8004b2ba12a4e07727523ef085670daffaf41c28a4c1157bdd245e68750dd200e023af90c67561e0fe4ba340c433f755eefabd4b039bfc323dc11adb75aecc448a869c7f2a58b9d8617c64b8f89fc583f8c948e2df0251a6c7d8c738c3b5a42b749ad5e8e986bd8", "signature": "66437b6bc05e75dd1626c3c4ff1f72e6db381ba1590948f8f16ad4d66e5991659aa84405568cfbc0a77c025e59e43fd53ab9ffabba7b258f78796239f90d4501" }, { "secret_key": "adc1e56c3ac94e6cda0411cbc3ce2af128d185a2a273bdb2af8d7e50fb96b526", "public_key": "5dcfec1f9112751564ecb60715ebb2c517b5ec37b2534fd6329924429b7fd5c5", "message": "d4f959474e0b89e2dcd02066984f88d739dd1134a33309f0a8b7802eaf013303c13515dfeb461ea3d248e998b9a4e54dae5b00190a45e70dc67e98f3d4cf906c214d4f636d2952925e22b1a86a1aabb3a892a9f8ed454f39c63d35b71e87a2da55a8e167ac83a866ad167a17aed183c08518c15e6be34858b4cee2b8427314760fffddd5923854b1747f796e1a5249fb3044894ed646829f654316ee52f4010c8dd321fa1dec397e50145ed9e31686fd5203f7233b8da780acaa91ee0b5b47207866aad85f837e03b4e6f6de8c04acafd707bdc1dd45500ab564801bee9a58ece360d004828baaf523e2f5ab69326a03aabe010878fd43ffaa56872244d7681f1618e623e3d474c73af8b080a61821a574ef2fd752d23b605ec521c19c1550de980c094d05e0238f3e008e6b195abfdd4028ee1ee1d6c66a76f178f0b431e4af44ddccfc5290edff36ece63e8385567013f43a2aebb67e3ef406308c20488a76d58a214f3139d983b19afb12e3283607fd75107bd31feb6256174b7a18aecac9f8562582018b0e6de40535e35bef2b562553885129397562900d3417f98cdd1e29d731ff48933f2952958163ba67d59561811b83772bd05710b6e3cc0434609937507223abb71a6a8c838fecdb1d2d37c95dc806f65f3f9663d99f06e6c0f3c32e95af1dd708e81108636a26b968e98339c74128b6cf671335884ac72f75b637195ea9eca053608996c32ed445410f67fa104b39f0fdf3c9b5c6157b76803756b27f4c3ba1b47f328576248e9bc53e7b8ab0b2ed97c2f9998bcc7dfe39e264aad30c6cfef2b5553ffb5a699aa4bd0eabe438ce0522cc91fe4e72bf7eacba4771ccf63a37aafcadbfbf99dd76b85b80ee075d3a7d1a90a55b7729a5416e5be696bf9fb7f3158cfdb5cfdacdde8172ee1ab9486e24ccead29b457acf43", "signed": "f02e5dbcb68704afad03aca81061dbdb998570049f10ce650ec7a2eff15c793ddf5a272cb683c22c87257c59bdef39efea79bd679556ea1505ed0036cb46040cd4f959474e0b89e2dcd02066984f88d739dd1134a33309f0a8b7802eaf013303c13515dfeb461ea3d248e998b9a4e54dae5b00190a45e70dc67e98f3d4cf906c214d4f636d2952925e22b1a86a1aabb3a892a9f8ed454f39c63d35b71e87a2da55a8e167ac83a866ad167a17aed183c08518c15e6be34858b4cee2b8427314760fffddd5923854b1747f796e1a5249fb3044894ed646829f654316ee52f4010c8dd321fa1dec397e50145ed9e31686fd5203f7233b8da780acaa91ee0b5b47207866aad85f837e03b4e6f6de8c04acafd707bdc1dd45500ab564801bee9a58ece360d004828baaf523e2f5ab69326a03aabe010878fd43ffaa56872244d7681f1618e623e3d474c73af8b080a61821a574ef2fd752d23b605ec521c19c1550de980c094d05e0238f3e008e6b195abfdd4028ee1ee1d6c66a76f178f0b431e4af44ddccfc5290edff36ece63e8385567013f43a2aebb67e3ef406308c20488a76d58a214f3139d983b19afb12e3283607fd75107bd31feb6256174b7a18aecac9f8562582018b0e6de40535e35bef2b562553885129397562900d3417f98cdd1e29d731ff48933f2952958163ba67d59561811b83772bd05710b6e3cc0434609937507223abb71a6a8c838fecdb1d2d37c95dc806f65f3f9663d99f06e6c0f3c32e95af1dd708e81108636a26b968e98339c74128b6cf671335884ac72f75b637195ea9eca053608996c32ed445410f67fa104b39f0fdf3c9b5c6157b76803756b27f4c3ba1b47f328576248e9bc53e7b8ab0b2ed97c2f9998bcc7dfe39e264aad30c6cfef2b5553ffb5a699aa4bd0eabe438ce0522cc91fe4e72bf7eacba4771ccf63a37aafcadbfbf99dd76b85b80ee075d3a7d1a90a55b7729a5416e5be696bf9fb7f3158cfdb5cfdacdde8172ee1ab9486e24ccead29b457acf43", "signature": "f02e5dbcb68704afad03aca81061dbdb998570049f10ce650ec7a2eff15c793ddf5a272cb683c22c87257c59bdef39efea79bd679556ea1505ed0036cb46040c" }, { "secret_key": "db89df6a23d890b7f00260e81f4ad98fd09440365131e85e22c7951a187b0218", "public_key": "c96763672ee4a2cc5a93b6a683df9b5de4d9386a790835681d1217d19296bdc8", "message": "54c1c5111e08c98245ba4f1318ba1db1dcc74d14a5c98ab9689cba1c802c68bcfc81fd87ffc61caa942f66d7e5157f65538c7e7b33170484b4b6543f3620ff29638b64d4dae7b02221cf7783f187ec4231e6b6946d82762074f09c32781c2f3846de3e8217f6e1b6e0d2b5595d742e2c4e325a2841924044dfcf12b479eb69f1bbd40eabddd1ff54a9184d366dff9d8f2d863e378a41f10cd1dae922cd7fbb2a544e47eabf47ca0a38abba34454919bb9a4ef044bfb97b708c2f7428d68f9c57c0ee7e7925f7a2b5c6e7df82bb2680c862dc7cc68b0f54530e64afe2763d9c7baf45cc6fe612d1f7827739c4411398888f7367c3d4377907acc06a06f93f887226798f48aa5464f601c2c1edda77edfeb9b9b5d5f9cb6fed37900547477fca1d09ab52d63e491feb12fd6dc805a78cee3baade4352982061dea5a2653db8e7607772e834b3a505c16dd6e7c71b911e842eba925d77a33c5c57ce1184098078ca2e6a3f69aa6a14639dc97b4b30c99dc4fa3e2cf63c701c306c5e253c5113854c185ebc8b4798f68d1fd780054d3eed2f394c454304966bddbd12280834ec9b40c1e98bc2d98f4845f6eb44f25315eedb3b79ffca4180c1bddd97d0c9affbac58814937682680076fe5a3babb65d28f2517036c0cfb42f0293eb2acb13949fe91e0ad0678aa243d7734a89d997870bf9a6a584ed6e628163e39d8aa610d46b9285b9e1dd7e8f807fdf5ca2bbf6de5e5e68af7cb7ebd43ecce227cd70c7bf4ee1433edfcfe886614670cdd196343fb91e15416d2f6acbae3eadc030231ee9d2ecc52a88ce8dc7d098e7fac77685b4eb540e3019307143221b8ef77f3632c893d556e0bb743a1963ec15886c8545e87c95cc825f200d0f3cf4f55a3d660a536a23aefcc428a43203485ee84342f5c001ee8404e759017006282ab8ba8903e", "signed": "80b7fc8b6ae6eece8166b7ea534cb5b214c9ea9973921ed05de40c78e14f162b09e978ca6d86ee434d984b8b0070409dd2ad11b53178e239dab5bc39c7ba460d54c1c5111e08c98245ba4f1318ba1db1dcc74d14a5c98ab9689cba1c802c68bcfc81fd87ffc61caa942f66d7e5157f65538c7e7b33170484b4b6543f3620ff29638b64d4dae7b02221cf7783f187ec4231e6b6946d82762074f09c32781c2f3846de3e8217f6e1b6e0d2b5595d742e2c4e325a2841924044dfcf12b479eb69f1bbd40eabddd1ff54a9184d366dff9d8f2d863e378a41f10cd1dae922cd7fbb2a544e47eabf47ca0a38abba34454919bb9a4ef044bfb97b708c2f7428d68f9c57c0ee7e7925f7a2b5c6e7df82bb2680c862dc7cc68b0f54530e64afe2763d9c7baf45cc6fe612d1f7827739c4411398888f7367c3d4377907acc06a06f93f887226798f48aa5464f601c2c1edda77edfeb9b9b5d5f9cb6fed37900547477fca1d09ab52d63e491feb12fd6dc805a78cee3baade4352982061dea5a2653db8e7607772e834b3a505c16dd6e7c71b911e842eba925d77a33c5c57ce1184098078ca2e6a3f69aa6a14639dc97b4b30c99dc4fa3e2cf63c701c306c5e253c5113854c185ebc8b4798f68d1fd780054d3eed2f394c454304966bddbd12280834ec9b40c1e98bc2d98f4845f6eb44f25315eedb3b79ffca4180c1bddd97d0c9affbac58814937682680076fe5a3babb65d28f2517036c0cfb42f0293eb2acb13949fe91e0ad0678aa243d7734a89d997870bf9a6a584ed6e628163e39d8aa610d46b9285b9e1dd7e8f807fdf5ca2bbf6de5e5e68af7cb7ebd43ecce227cd70c7bf4ee1433edfcfe886614670cdd196343fb91e15416d2f6acbae3eadc030231ee9d2ecc52a88ce8dc7d098e7fac77685b4eb540e3019307143221b8ef77f3632c893d556e0bb743a1963ec15886c8545e87c95cc825f200d0f3cf4f55a3d660a536a23aefcc428a43203485ee84342f5c001ee8404e759017006282ab8ba8903e", "signature": "80b7fc8b6ae6eece8166b7ea534cb5b214c9ea9973921ed05de40c78e14f162b09e978ca6d86ee434d984b8b0070409dd2ad11b53178e239dab5bc39c7ba460d" }, { "secret_key": "00e6bb17af3c2df652b34f9abe19f99019074233686c7114e3a0edf08309934f", "public_key": "7b8232a66cec2f915aaa7951d29d2b9ee93d321d15b203c51e61e8ce83d187f8", "message": "063281e41e8ba9703ed09ef3bf0ea46e4cabdd6ebd769d05dc045d4f990d69fc554130a4e61aa21e2de4c92db48a20a37b1747a7eac5ebb2735a8938197f139fad1497b351ad064c0f18f8faf1fe11f63979a69968e24cf91e58a3ab032669e4efee274f96b58be7d9e391f36fcf0709b2cb2d22694a6ceb17246945ebb3bc7f0f03bf0b08dc9626e3e715c991671d53ebb9ae83a7d08d44f63635c40f8d4817f58de9eb77cb25b2acd6def969ab569e974a8adac11a86b58fe6c10067499fc914dff56902cbc393a71cc25e8f05c03c94f13b84a2b01a58c10dbcbb60ebcee487f529177466299925da50e2da5b5557f0aeee3fd7f47b5c2e3f84cefab4679691394dd122303bb769afb3adfe8358b02b679273b35abdc6402576ccce5e10442a137ef9456939b289ef4e417b1cc6239f7ceedd68f1a8264180e068b4966fd67f2bad6edd8b4a1e8d2b542daf26db831f1fb51eb86ffadeccd9ac3d664f346e7d046c33a572841ea8334e7f2f417a05712a9e334e487fd3ae175455162fe8f49cc026a640c6cf93cf58875052f41cc9820615653ea2d084c896eafe5ad4725579653084994f956d5c94590a2409581b6fc86e40aa58bf6e6057a6f90af3b87aeaf32994a55a54f79bdf3dbbf5ce0ff812e486b0545d9e9c2b0bce0d4c3647b1827262498834e198a3ec70f3b03d6aad2c49eb80b5e2051439225fd9ce9468d69af70a262ee3b8b62a8e5b41346da3012ffb45816b7becb0e79a60bff71636a3e4bb1b35caf195f55117280f787217b3caa2e793726fc5a74d1160dcad868904c197381134ed8c3db3750b7556f69ccce18b77388b58c5b8113e590ad6eac5b91ece5a6705025c80353ceb1ed84aaa1cc48a416bc016aef173bb80b2ba28c57960c6b011b6b495a3f3311e79fe46bdb6a4c381fb9dc4628b0a83023558f1", "signed": "04b3b8501e396c4a788e14ac49f6174cdb5c855e651203cf68d1efa89aa58678d4d1f303a9877a3786d203c355b09d5286c1ca0df04a89aa06cc3f9d0fd30504063281e41e8ba9703ed09ef3bf0ea46e4cabdd6ebd769d05dc045d4f990d69fc554130a4e61aa21e2de4c92db48a20a37b1747a7eac5ebb2735a8938197f139fad1497b351ad064c0f18f8faf1fe11f63979a69968e24cf91e58a3ab032669e4efee274f96b58be7d9e391f36fcf0709b2cb2d22694a6ceb17246945ebb3bc7f0f03bf0b08dc9626e3e715c991671d53ebb9ae83a7d08d44f63635c40f8d4817f58de9eb77cb25b2acd6def969ab569e974a8adac11a86b58fe6c10067499fc914dff56902cbc393a71cc25e8f05c03c94f13b84a2b01a58c10dbcbb60ebcee487f529177466299925da50e2da5b5557f0aeee3fd7f47b5c2e3f84cefab4679691394dd122303bb769afb3adfe8358b02b679273b35abdc6402576ccce5e10442a137ef9456939b289ef4e417b1cc6239f7ceedd68f1a8264180e068b4966fd67f2bad6edd8b4a1e8d2b542daf26db831f1fb51eb86ffadeccd9ac3d664f346e7d046c33a572841ea8334e7f2f417a05712a9e334e487fd3ae175455162fe8f49cc026a640c6cf93cf58875052f41cc9820615653ea2d084c896eafe5ad4725579653084994f956d5c94590a2409581b6fc86e40aa58bf6e6057a6f90af3b87aeaf32994a55a54f79bdf3dbbf5ce0ff812e486b0545d9e9c2b0bce0d4c3647b1827262498834e198a3ec70f3b03d6aad2c49eb80b5e2051439225fd9ce9468d69af70a262ee3b8b62a8e5b41346da3012ffb45816b7becb0e79a60bff71636a3e4bb1b35caf195f55117280f787217b3caa2e793726fc5a74d1160dcad868904c197381134ed8c3db3750b7556f69ccce18b77388b58c5b8113e590ad6eac5b91ece5a6705025c80353ceb1ed84aaa1cc48a416bc016aef173bb80b2ba28c57960c6b011b6b495a3f3311e79fe46bdb6a4c381fb9dc4628b0a83023558f1", "signature": "04b3b8501e396c4a788e14ac49f6174cdb5c855e651203cf68d1efa89aa58678d4d1f303a9877a3786d203c355b09d5286c1ca0df04a89aa06cc3f9d0fd30504" }, { "secret_key": "fbddf6e61e20d806e55917756de60d0c9a99976f646716ff2ff1312c54dd971d", "public_key": "ac538fabad4380e60e977126e7695eeda5417d85f7d23db21bd0ad111116f05d", "message": "3e9953ca55d0cd233b98833eb1bc79d3b55f18c8fa1c42027bca25579153b55da0c5a178b8386956d9a54183b24c91dc4be994847237d3666a0a0130fe19924bc0ee50896c35a2e16a29e2e2acf180bdd9379354687f0ece6882d26e980e686698043bb1b01213aa644a4f8d61f9b613e62eaa3576cea0b0b83f05ce2558ff6356495c45ede4a8f65b814ab8a7309403dfd43cbea90893939b7800aa00232b5f6b7714ebdcd8bcf34a5a7e822ac7b1b099ac615f135f8c351dc41ae5f66d5f9c2600454ca01c009ba6de04162ae5f1f270893ca3907aff7f78e03396e32b622ff340537bf123e55995e9209609330b2eee51127484a40e250700823feb0bc97bb509ff732675dec32ecb635ed92c7d78fe3050200cf1d941d6b388800a8419d96a595eced5ec4efdcb6f987f5472a5c43058d3a3a7bb56d7980365ed43dbc2be48f1d18ce76a89185426fd5c69df7e9291ab7823c23a76941ed3836aac7b58c0d5fb6b636c42471a4d1703516f03e935f31f195450e537b2a07d545ba4b68afb0638c65bb0ffaa0cfd69d7104819796619d483a0245b4fd9017f62a7d3a5fc3b7289d75735f287ca0a951ad58344b2ab7d7df8dbd7922a5abb8d7c2e79147e6d36ee31f930473b0727dcfd58d644d7d70a0ed31ca6a13ed9dbd224492efda19e4f8eed46180fe750f07bbe8e99854d13f58ba968ce3859d61189cd2b667f3b2d0665b574c4bac19d9e37e5b7a80eb334e36810530aa5d1766393f8115a52090c91823428c897a5f35e12a8af2cd4fb13907ca6603a4f76f5c2e02374a8dc3a47c1be6f1d1c8ebc59b36d1cfa0ab23e9b0ae9b0e637eeedb9c66bea62dc630cdefa718239617e3118e5b6deb7c294475282e8abe24fd5a54b786fff9028c5a033384e4bc8014dec8da100a94b178ef88ec357b66d2b9098ab64791696b1a66b", "signed": "8c9b77aa0f1cf52e8f7a918b21b468e62335911bc59306b30ce77bf692c11059b0ee9c5daaf6839bb81373c61d28d072702b595e4dce28cb993822b24813040b3e9953ca55d0cd233b98833eb1bc79d3b55f18c8fa1c42027bca25579153b55da0c5a178b8386956d9a54183b24c91dc4be994847237d3666a0a0130fe19924bc0ee50896c35a2e16a29e2e2acf180bdd9379354687f0ece6882d26e980e686698043bb1b01213aa644a4f8d61f9b613e62eaa3576cea0b0b83f05ce2558ff6356495c45ede4a8f65b814ab8a7309403dfd43cbea90893939b7800aa00232b5f6b7714ebdcd8bcf34a5a7e822ac7b1b099ac615f135f8c351dc41ae5f66d5f9c2600454ca01c009ba6de04162ae5f1f270893ca3907aff7f78e03396e32b622ff340537bf123e55995e9209609330b2eee51127484a40e250700823feb0bc97bb509ff732675dec32ecb635ed92c7d78fe3050200cf1d941d6b388800a8419d96a595eced5ec4efdcb6f987f5472a5c43058d3a3a7bb56d7980365ed43dbc2be48f1d18ce76a89185426fd5c69df7e9291ab7823c23a76941ed3836aac7b58c0d5fb6b636c42471a4d1703516f03e935f31f195450e537b2a07d545ba4b68afb0638c65bb0ffaa0cfd69d7104819796619d483a0245b4fd9017f62a7d3a5fc3b7289d75735f287ca0a951ad58344b2ab7d7df8dbd7922a5abb8d7c2e79147e6d36ee31f930473b0727dcfd58d644d7d70a0ed31ca6a13ed9dbd224492efda19e4f8eed46180fe750f07bbe8e99854d13f58ba968ce3859d61189cd2b667f3b2d0665b574c4bac19d9e37e5b7a80eb334e36810530aa5d1766393f8115a52090c91823428c897a5f35e12a8af2cd4fb13907ca6603a4f76f5c2e02374a8dc3a47c1be6f1d1c8ebc59b36d1cfa0ab23e9b0ae9b0e637eeedb9c66bea62dc630cdefa718239617e3118e5b6deb7c294475282e8abe24fd5a54b786fff9028c5a033384e4bc8014dec8da100a94b178ef88ec357b66d2b9098ab64791696b1a66b", "signature": "8c9b77aa0f1cf52e8f7a918b21b468e62335911bc59306b30ce77bf692c11059b0ee9c5daaf6839bb81373c61d28d072702b595e4dce28cb993822b24813040b" }, { "secret_key": "8a55e77bb0c8740b8c2e8ddfdfdb40f27e45fe81fe457111bf1c8730eab616b4", "public_key": "9ff1fd0c50eb24f99fe2f7711d52872dfc900380dddcdb86fe6f4a5f350a8743", "message": "20fb414e264a954784f112bace7e0474b39cb3c9e53dee0a21f4cf6d4a99b9347ddffbe281a6c230a75d63a72fd05f6db53ea7014ef7709d18ff970f485fe83ba1d37147338aded6da4cfdacc1e69d2f3e0ef362f47b5bcfb78a1e179eb5c5b106c8d82a0a0b290df075ab27436929cde656f02309f95750eb676583262e5f2f69f0ff72a8e057266382269205318740bfe06bf5c2cb4533908ef9f9f2869a75b9533579820e3bc0caffd646171c8286c3a4aba1ff0915d93611205e230f39ff4c4caf3f333e753fce2b71213e53d608415ee17fd48212eedd8840f337101ef0d0b6f7be4bffc06eeefe8066dd27a0541a468831acddc4902e2fefefbed19c308e5621e0bf46bcd538aa13faf04d380759c0e107e912001839dfd0b635440e9638f5377ca8450f350c01129ee33764415c53cb2ffbf968df78b742fd0665e78a34abf4decd1fd386289a1364e64555eec58b0af9a4cd6b36d1d5c611a2846dfb5589344bbbb02560241b74b993a25bef50fb1e7319086e6a23986300834ed2dba98a168721c2f784dfb8d3800d06a054aef14d1772b6c574af2563d193ef2e51bdc62d2abce2eebeada79203498e6686c287f37bd88aeb166f7dffc3e6ad0294117ef6ee9da8479ed8a16fe9be246d266804f29658db75e7a0873be71dc7d407e39fabd66f988b457477427fad8130f09ab665f1597c9046e7373af9a8352a86830cb92a804488700fe6891924fe2a7201733d95e591ee0a1fef1c2636078d370e7ad3b6a944fed2cf2b30aba2d56f3495b2849c03bb614f48bc4e507c395a6c35d3eed4c7be8e680f2d45a310b187eb88cf0e8ed4de7d37246a50a6367b97ee3784322c0b71131a283198da4804de751dcf70c4bad00dd98d873a69dd1a09cf69ddfad7ae603500b6a462258098d8b66b85293594e208829b5228fae2fafc39", "signed": "8aaeba535c511c31d3f8e95cb077a9a7ec7d08441e5342a6abe0bf2a5d7fc930b43dac3d1e8ef2cb034552eb4d0839bc8bf294551dd2d80c53fd6279351ac20c20fb414e264a954784f112bace7e0474b39cb3c9e53dee0a21f4cf6d4a99b9347ddffbe281a6c230a75d63a72fd05f6db53ea7014ef7709d18ff970f485fe83ba1d37147338aded6da4cfdacc1e69d2f3e0ef362f47b5bcfb78a1e179eb5c5b106c8d82a0a0b290df075ab27436929cde656f02309f95750eb676583262e5f2f69f0ff72a8e057266382269205318740bfe06bf5c2cb4533908ef9f9f2869a75b9533579820e3bc0caffd646171c8286c3a4aba1ff0915d93611205e230f39ff4c4caf3f333e753fce2b71213e53d608415ee17fd48212eedd8840f337101ef0d0b6f7be4bffc06eeefe8066dd27a0541a468831acddc4902e2fefefbed19c308e5621e0bf46bcd538aa13faf04d380759c0e107e912001839dfd0b635440e9638f5377ca8450f350c01129ee33764415c53cb2ffbf968df78b742fd0665e78a34abf4decd1fd386289a1364e64555eec58b0af9a4cd6b36d1d5c611a2846dfb5589344bbbb02560241b74b993a25bef50fb1e7319086e6a23986300834ed2dba98a168721c2f784dfb8d3800d06a054aef14d1772b6c574af2563d193ef2e51bdc62d2abce2eebeada79203498e6686c287f37bd88aeb166f7dffc3e6ad0294117ef6ee9da8479ed8a16fe9be246d266804f29658db75e7a0873be71dc7d407e39fabd66f988b457477427fad8130f09ab665f1597c9046e7373af9a8352a86830cb92a804488700fe6891924fe2a7201733d95e591ee0a1fef1c2636078d370e7ad3b6a944fed2cf2b30aba2d56f3495b2849c03bb614f48bc4e507c395a6c35d3eed4c7be8e680f2d45a310b187eb88cf0e8ed4de7d37246a50a6367b97ee3784322c0b71131a283198da4804de751dcf70c4bad00dd98d873a69dd1a09cf69ddfad7ae603500b6a462258098d8b66b85293594e208829b5228fae2fafc39", "signature": "8aaeba535c511c31d3f8e95cb077a9a7ec7d08441e5342a6abe0bf2a5d7fc930b43dac3d1e8ef2cb034552eb4d0839bc8bf294551dd2d80c53fd6279351ac20c" }, { "secret_key": "163b0cb6a12e8f07b0c29d6a63f6a652ce497270b5e46fcf833c99bd843f8c64", "public_key": "68a35de4ba6f0f82ecf4b1e0df8e24cb4f18f2103ff04dc1b5333991b6d314ba", "message": "56a1603f725be07613058cdb3acdc52354e3bb1ff2bed13f895175b15c8c5a90ffbe46b11a06cfe362dadf7323c940417255aa7aa54312103e71463daa0b5cdaebd0be723c732273e3c3f5bf7aa3519d69df6f4770daa1df8280bb3cd2c714ac030200546579f56c60b91ae11f4cf874a35fc59b354bed80f56e11a6cd62a88ce6b4f6bf39d64ce3d80409825f90162c3d96d10e478607365f7a241e71af980042fec2d68891e0c8a37c58ec4e600fd581e790b0aae8e09f35d4cc1876df434b80eee05369f848fc4930577d1684275888f3259cb47376c5169c9937f855a96a9e748ad0a69ae4ab2f2f1744a392f9acc6209975b784984cb12f98292c36a53221994abc56f9a66dae4560b79356ff47e128c0796a7fb0e0bbc9600af48e49eaa9427cf6eb6620b10cd2c085b0b342004d5b0d3edc11d29242a4638780762c9dc6069b66bd84973b5011961ce56db58bdaf48e6be12ab9ad24416297004d02914b959f54e092f8cd4365fa6ab78ddbff4ce8dad4e2f53a05c0cc499bfb47814a2713551dcd19d447f627576ea4ea4bbda8bae18a6465ced747ea17180b009f01212160482b0433aac68e67644d00f41fdf9990b9e11117634deb139b1a40ad3fce4299a17fe1dd225301c7f8d8010a796dc79c13307d3ff992a88be664d4c886d68ca9e4470cfbe63ebffc424010e372b6922aa95c801d1e9406da4bc188ca82066405bcdb3eafc937629b3263dc7d50ee5278ccec6f11d5517f56bc269c873691e7eb53faeff07564ab46b403f15d9e0e692486ee098e7b51b42813469b8235042233ca3f9c4f8ff24a571f47e0adf9144aea488a2d2dd001e31fc961e05c3e85f0d981407c873158bb0d35bafe4b60422e67551e970165ce3fc599d0fcc92b16ac36a92b2c1dc6b3f033fe310cd196da04a4e639031177cd27d7c2fbec65a00b", "signed": "17738f5726550780651d60199fda39d9c4768db5917e32393631c54a419d59f18ef960ddd439380dabc314761bd0cdb57cce481e6109fed095dea6e865aa670b56a1603f725be07613058cdb3acdc52354e3bb1ff2bed13f895175b15c8c5a90ffbe46b11a06cfe362dadf7323c940417255aa7aa54312103e71463daa0b5cdaebd0be723c732273e3c3f5bf7aa3519d69df6f4770daa1df8280bb3cd2c714ac030200546579f56c60b91ae11f4cf874a35fc59b354bed80f56e11a6cd62a88ce6b4f6bf39d64ce3d80409825f90162c3d96d10e478607365f7a241e71af980042fec2d68891e0c8a37c58ec4e600fd581e790b0aae8e09f35d4cc1876df434b80eee05369f848fc4930577d1684275888f3259cb47376c5169c9937f855a96a9e748ad0a69ae4ab2f2f1744a392f9acc6209975b784984cb12f98292c36a53221994abc56f9a66dae4560b79356ff47e128c0796a7fb0e0bbc9600af48e49eaa9427cf6eb6620b10cd2c085b0b342004d5b0d3edc11d29242a4638780762c9dc6069b66bd84973b5011961ce56db58bdaf48e6be12ab9ad24416297004d02914b959f54e092f8cd4365fa6ab78ddbff4ce8dad4e2f53a05c0cc499bfb47814a2713551dcd19d447f627576ea4ea4bbda8bae18a6465ced747ea17180b009f01212160482b0433aac68e67644d00f41fdf9990b9e11117634deb139b1a40ad3fce4299a17fe1dd225301c7f8d8010a796dc79c13307d3ff992a88be664d4c886d68ca9e4470cfbe63ebffc424010e372b6922aa95c801d1e9406da4bc188ca82066405bcdb3eafc937629b3263dc7d50ee5278ccec6f11d5517f56bc269c873691e7eb53faeff07564ab46b403f15d9e0e692486ee098e7b51b42813469b8235042233ca3f9c4f8ff24a571f47e0adf9144aea488a2d2dd001e31fc961e05c3e85f0d981407c873158bb0d35bafe4b60422e67551e970165ce3fc599d0fcc92b16ac36a92b2c1dc6b3f033fe310cd196da04a4e639031177cd27d7c2fbec65a00b", "signature": "17738f5726550780651d60199fda39d9c4768db5917e32393631c54a419d59f18ef960ddd439380dabc314761bd0cdb57cce481e6109fed095dea6e865aa670b" }, { "secret_key": "8c839381b6a7ce2649c1ea464ae3c2d3fdb1ec666d7b4be4e2a941ab6d6557a7", "public_key": "5c724a30c6fb32815343a80ddee6eee544516418ea95e1bac80afc8040d63fc6", "message": "cbcf89c3548964c38d70fd8f68e8ece36cc39755c971d14d7e056f39b023ef166d17f2438522f010d6d835d886e71f474c6727a4221fd03a7574578289ed5493ac4c0947e3f428d8fe064006a256cef21811d72678f5dfc6ba66ac29ecd1b32ff5557cb08c5f130559217a0413b759c24d83388a2bb9b29b6b91d1f3101ed625211e4d73805193478cf995396c10b1c5affacb00899da04e3cce193b494e2a933c4eebe0a37bfb8f1b8371bde5fda09e804e940f344896a529467adee45a8febf85ab036cab880143be4f59b7741d8e450278b06365578d40b19dcecc6e1ee3da34ab29013fa3af7729272962110e385ab9a022fae4146f89716f7bab9d3dc682f4fac7736d3e08973c685bbb275bbf8f217419e5cae0219eba5166a5de1b11e3f9a908b8ac7e65bcd623f8c18bb024f605dcbacda790d8362957444a95c130a37ee9d563d0cbb4cb2b0ff71591d9390b6c8fc28753a0e402d6487cfac607135927d89267512b34f877057d9271bccc024dfedccc6c32edf75c8b7551cdf80154ee8e08a0cc43044e1036bae017eb48b6502c7a9d60c8b370cf3799c464f964a69ee659501223e789a6497b63496df1ada2e808d2434fc8bb9794e5e2a20bbf4d6925cb3c5bb14842f19200905ba9354e00dc33cff5b42d4e9d9668b34e661d44bef76fefe2ed51f94423a933ac94f1523bf37823a238d616c6b17973441e35f9405a04d99eaa8f504534c8b5fa5e8e335c743bcf21f5d492b7112e00fd8642cb12bfec849df62120dbb06bfc2946a5601e25be75011c6f00c65d35f44a46af9e4f7809e5789a3a61ba0a3b213890497296c81e42e88f0ec0f5defc1f5d39ff2a48b7e3026c9e547202edc7eb738c34ad3a15d373ef82a4c1d181f285a98bd3314c2c1947c9e2c60aca51750ee7f943caf0c4e1e5c7df7291e973b1f936b73707619", "signed": "5d2110d1d2f3edd683bdfdbea3ffa7cf5528a40b8b3d8d8c9bfd22aeac28bad471666e062f7d38ceda8bb37397a1c5c3f733b537967045706478437d4d187a0acbcf89c3548964c38d70fd8f68e8ece36cc39755c971d14d7e056f39b023ef166d17f2438522f010d6d835d886e71f474c6727a4221fd03a7574578289ed5493ac4c0947e3f428d8fe064006a256cef21811d72678f5dfc6ba66ac29ecd1b32ff5557cb08c5f130559217a0413b759c24d83388a2bb9b29b6b91d1f3101ed625211e4d73805193478cf995396c10b1c5affacb00899da04e3cce193b494e2a933c4eebe0a37bfb8f1b8371bde5fda09e804e940f344896a529467adee45a8febf85ab036cab880143be4f59b7741d8e450278b06365578d40b19dcecc6e1ee3da34ab29013fa3af7729272962110e385ab9a022fae4146f89716f7bab9d3dc682f4fac7736d3e08973c685bbb275bbf8f217419e5cae0219eba5166a5de1b11e3f9a908b8ac7e65bcd623f8c18bb024f605dcbacda790d8362957444a95c130a37ee9d563d0cbb4cb2b0ff71591d9390b6c8fc28753a0e402d6487cfac607135927d89267512b34f877057d9271bccc024dfedccc6c32edf75c8b7551cdf80154ee8e08a0cc43044e1036bae017eb48b6502c7a9d60c8b370cf3799c464f964a69ee659501223e789a6497b63496df1ada2e808d2434fc8bb9794e5e2a20bbf4d6925cb3c5bb14842f19200905ba9354e00dc33cff5b42d4e9d9668b34e661d44bef76fefe2ed51f94423a933ac94f1523bf37823a238d616c6b17973441e35f9405a04d99eaa8f504534c8b5fa5e8e335c743bcf21f5d492b7112e00fd8642cb12bfec849df62120dbb06bfc2946a5601e25be75011c6f00c65d35f44a46af9e4f7809e5789a3a61ba0a3b213890497296c81e42e88f0ec0f5defc1f5d39ff2a48b7e3026c9e547202edc7eb738c34ad3a15d373ef82a4c1d181f285a98bd3314c2c1947c9e2c60aca51750ee7f943caf0c4e1e5c7df7291e973b1f936b73707619", "signature": "5d2110d1d2f3edd683bdfdbea3ffa7cf5528a40b8b3d8d8c9bfd22aeac28bad471666e062f7d38ceda8bb37397a1c5c3f733b537967045706478437d4d187a0a" }, { "secret_key": "aabbb2efedb599424a5f3e08f90fa8826c5c92170be501a1181fe8e8df974e0e", "public_key": "ce7319ef88b242420666ca697ba8501d274ec4a5dcf844596608b9dd5a8a3acd", "message": "fcc15cc57970569e9ccfa5a778fc7aed71978a3f5624577b6f57fa3f167ea223ef31764c488d059d06531d016bcb17d544d46977aa241f8e07af4787a0810f98d766460c0841ad81b88f4d5d8164485a1258a94622c5492428d6d575943715766c2b0a865bedba167d5d340edb579c47aa32459b8fc98a79bb0bed1c960b4ccb7f2d4b5681a2a70d505b85b81e3d99672714e4eab41f3ab0ca874f417186feb69ed13fb911f49d1584758b2d18b4673edfae495e68dad513a7ac0d47b2753cb4eda78fb431f04dda8fe8030d7bb4e8dbccb969d7f580d9c1ef935d074d7a41d1f8b9dc45c9a2e4106a5529a98b95529ab0edea0b5722dd686f5a7f3cd8fb2624ab26c42df11f510a103d8a929830ad85f52124e3d5827ba60bfbcd736cb6c590ee777ead7aa2224d7ae46d257a90407247960c9cb03860aeaa7f54c1a8e11160d11bb473065e19b70721c8f072e1909d539e9ac94185904bbbfe54873754ae1ca7bced6f40561af4b505f03ac972a6f0bfa73b5f832fe23b898b2bbb0574a6662ee93b3b360da1ec7e838eb2c77c7cb7fc164f7c4627010489c858900752c92d9d75ad547167e4bdd11a07d28b651aa30f16a850e060dd2882fb820919a398e805eb63699f4ff595f991524731641ece25fb3f8e89ada501192b1eddaecbacc8b898528f2d5b3312694f5ec2dc9142e1513f777a5c833409c171633ff9fa2609d0497f5df4fbf48ef2b77d55e25519d2ee79b5fe9d8fa46000decdb4f25dfb3f2bafb19fbe2cbdac002a359a954bc69bdfe2fb36adfd9a1509f3e3a4c6b1f3f36e7cf80d583d440ff2a144643098974d71493ecb6417c0b8065bd2c21c1e34af09243fb49e9d35297eb0a52d56dd270fea6dc5c080a05599f78581e90fd8cc4cd11a505edde84b892d8953bdbb2379d33aad64658ae20607dd35b0bf3a2637d20c3f86", "signed": "a0b19cfa6c80de77bfcd321030bf8c03893e2b21ace6c6ba1ff7408e6ff07d847e6b2b688d4fd51aa932701db6402ef22322e6e9fc7e320abb4d24e1acc6cf06fcc15cc57970569e9ccfa5a778fc7aed71978a3f5624577b6f57fa3f167ea223ef31764c488d059d06531d016bcb17d544d46977aa241f8e07af4787a0810f98d766460c0841ad81b88f4d5d8164485a1258a94622c5492428d6d575943715766c2b0a865bedba167d5d340edb579c47aa32459b8fc98a79bb0bed1c960b4ccb7f2d4b5681a2a70d505b85b81e3d99672714e4eab41f3ab0ca874f417186feb69ed13fb911f49d1584758b2d18b4673edfae495e68dad513a7ac0d47b2753cb4eda78fb431f04dda8fe8030d7bb4e8dbccb969d7f580d9c1ef935d074d7a41d1f8b9dc45c9a2e4106a5529a98b95529ab0edea0b5722dd686f5a7f3cd8fb2624ab26c42df11f510a103d8a929830ad85f52124e3d5827ba60bfbcd736cb6c590ee777ead7aa2224d7ae46d257a90407247960c9cb03860aeaa7f54c1a8e11160d11bb473065e19b70721c8f072e1909d539e9ac94185904bbbfe54873754ae1ca7bced6f40561af4b505f03ac972a6f0bfa73b5f832fe23b898b2bbb0574a6662ee93b3b360da1ec7e838eb2c77c7cb7fc164f7c4627010489c858900752c92d9d75ad547167e4bdd11a07d28b651aa30f16a850e060dd2882fb820919a398e805eb63699f4ff595f991524731641ece25fb3f8e89ada501192b1eddaecbacc8b898528f2d5b3312694f5ec2dc9142e1513f777a5c833409c171633ff9fa2609d0497f5df4fbf48ef2b77d55e25519d2ee79b5fe9d8fa46000decdb4f25dfb3f2bafb19fbe2cbdac002a359a954bc69bdfe2fb36adfd9a1509f3e3a4c6b1f3f36e7cf80d583d440ff2a144643098974d71493ecb6417c0b8065bd2c21c1e34af09243fb49e9d35297eb0a52d56dd270fea6dc5c080a05599f78581e90fd8cc4cd11a505edde84b892d8953bdbb2379d33aad64658ae20607dd35b0bf3a2637d20c3f86", "signature": "a0b19cfa6c80de77bfcd321030bf8c03893e2b21ace6c6ba1ff7408e6ff07d847e6b2b688d4fd51aa932701db6402ef22322e6e9fc7e320abb4d24e1acc6cf06" }, { "secret_key": "c2e074faa234e99ab20adbbeae11b8109723b708c54586df652b402c35cdd127", "public_key": "5e524ece1c696e705a3514dd0082b840795a59c36a96cbc482bff5ab4ef515d1", "message": "31290338e46d1cc25ce99cbacc40160341b785823c823c4ab9baee3b612579f1c011716796e56e2693f6ddad43922aa7847cbb4148101651bbe62d50be90825e8eab777aa4b8026dc5385a97d3df76160191f922cdd2f07ba5f85e95f45db22928f90734ff520c44dc8fe3903b4c51cd23e064f01c829ec74fbffe25fd0d369d2765740f43856bd7398a1911ad749836160fd98d04b28ee87e111d40718b5a166f05c9a471a41566557069f7a14de988bbbf6777521fcba6dd65de4c06674a11853af83accb70fb328dd8fd6105a7df5269c9faec8d900147e928d970c36cd834bd6054f70650dface94b7629d16e3703d766ce7638d0ad1e17b77469b958d2ba2a1e631a1635efdcb006ebc6e5d8b9faf7e5fb989dc0896c561a26f3c25f055716b367138ea5da1f81dc72cff7a55afaee5839ef5aa822b2970aa18a8982163bf5eed1b677ccaac1224ff6c6cf256374780ae65803bf5c6e23c80bacd76ec3e2ddd3ab71997506448e19db198efadc9f757491f1b0972c82db29410e1e8bb67bbb23d53563b8807e5e0c2e32ee596b5b4402328f9e179e9ce856d3bd199d58de6c5c252e7a6124d81fc9eeaf23d347d2ab88917aa684450dd58303516c1a4d2bdcdde220c9ae3790f298d7d384b70c2fe258807848fc35320b578b33503b75f38a1df630bd33e6a85a4dd4df9f6e55a6e6867c73801e593e1d591db89ba9a9af0fc292e06fb515ac8a5e8e343a821335575ba48fbaae3fb12deeaaee60f4b3d317ec0a554ddd425c84932c27a7a12f29d6371510783bd75e60e2f6da20052069ed71e695a943182193cb6851a7d2fa3c666c193028015ac8b7e7daa6c5204f77a6232b88b4abffc5362fde7dec36b9d454880849283b1156339ea2e8c3b10e51bfabdf72578c726419a38542cf8649df9a0909f582debad5fd89d8c81f83d9e423e7503", "signed": "657c3826b3483fd42ab6df869d1b77a8c4df67a6a590c7c6772969e3df3312ae0654fb83847af221935a0512291636ec0595700879ebdba8a1467c53d40c230631290338e46d1cc25ce99cbacc40160341b785823c823c4ab9baee3b612579f1c011716796e56e2693f6ddad43922aa7847cbb4148101651bbe62d50be90825e8eab777aa4b8026dc5385a97d3df76160191f922cdd2f07ba5f85e95f45db22928f90734ff520c44dc8fe3903b4c51cd23e064f01c829ec74fbffe25fd0d369d2765740f43856bd7398a1911ad749836160fd98d04b28ee87e111d40718b5a166f05c9a471a41566557069f7a14de988bbbf6777521fcba6dd65de4c06674a11853af83accb70fb328dd8fd6105a7df5269c9faec8d900147e928d970c36cd834bd6054f70650dface94b7629d16e3703d766ce7638d0ad1e17b77469b958d2ba2a1e631a1635efdcb006ebc6e5d8b9faf7e5fb989dc0896c561a26f3c25f055716b367138ea5da1f81dc72cff7a55afaee5839ef5aa822b2970aa18a8982163bf5eed1b677ccaac1224ff6c6cf256374780ae65803bf5c6e23c80bacd76ec3e2ddd3ab71997506448e19db198efadc9f757491f1b0972c82db29410e1e8bb67bbb23d53563b8807e5e0c2e32ee596b5b4402328f9e179e9ce856d3bd199d58de6c5c252e7a6124d81fc9eeaf23d347d2ab88917aa684450dd58303516c1a4d2bdcdde220c9ae3790f298d7d384b70c2fe258807848fc35320b578b33503b75f38a1df630bd33e6a85a4dd4df9f6e55a6e6867c73801e593e1d591db89ba9a9af0fc292e06fb515ac8a5e8e343a821335575ba48fbaae3fb12deeaaee60f4b3d317ec0a554ddd425c84932c27a7a12f29d6371510783bd75e60e2f6da20052069ed71e695a943182193cb6851a7d2fa3c666c193028015ac8b7e7daa6c5204f77a6232b88b4abffc5362fde7dec36b9d454880849283b1156339ea2e8c3b10e51bfabdf72578c726419a38542cf8649df9a0909f582debad5fd89d8c81f83d9e423e7503", "signature": "657c3826b3483fd42ab6df869d1b77a8c4df67a6a590c7c6772969e3df3312ae0654fb83847af221935a0512291636ec0595700879ebdba8a1467c53d40c2306" }, { "secret_key": "b9da4e6af07e398ab4d21752a32c8ffa9be0c310d35059fb661bd73afa97e2a8", "public_key": "f862803c96cc42adc8252884547230b970047b7e5da996260ccc0240ab71a6ec", "message": "6b95af0eebb6a08afadaa19621f76a839be80851c6dd315e8276f501995d4ce6d134df5e798ed517a2f0e62aa1d6c98c36ef14bb1e5ddfc98d5a7fcc81140a13c20d2ca0c4b40e6e6a03eed8c899f9d1f792468152199f4b95a432668947a51d7b8e104d8d1f12aacd967e08b08c41c3c8ca3feedaa5b8b63bcec0613864d953d81143ec81425bde29164a0876f23f37ac9ac9473672ce11a08bd5476f6f66d665e9ad617e34eb32ee56ffa459f20d1b9353d7821298545750c6eff3e7d4073dc3185ede0391cce0575f8ba637d800068d9d7e5403ba7038d2db77da144784f2e8ea76aedfe521e7dc6a674ede35579595993fb20d44b4052783f56c8c0bbd0440b69eabde84468dd13c671fb1bbd5cb022c2a4fcf3542d8b3bb518e5adebddc84e714b13be52c56b282b42ac0892a5459281be7160729f4112c7d99df9be5434f823a9ce0501789de1d550ad50bb18c8d89a33668270bff7b91ff118f5cd9909addde90c024a3ad713915174674f28aaa9f94a322baa543738edab4973312b5bfa12155debcee163cfe2b04ac9c122ac8a4e1bc418c14955d9610455bd945e9793b916267c9c5f9e53ac04518926ec98ecb84a4f0445dcb1236c76c3a678c69abe4e92c22971d62217201a1bdf05c04df8420a3de6a917a85e71e2b9725e77b522915d4c9946077637c2d8813f010b9491cf0eddc3d4668cc0f8bc8a683579be543934da2853a16f5715724f779819f44439e1debcaa4270d9b8594ba4c86e1063b3ce479d71a5409bef27ef4e5c1d1c96e8be13865af7bb43f09162ccbc83a2ca9e9b8a2324e6d996575eefed37ef49908185738b8eae43f8adca330c99bc66cc1fd52c530d7371c60869ce42c197dca0ad128b85f61c8758f0d542f3d3298b65e93c6e8a68fa0e9a1d5e8c5fec805b83aff4390e115eb64f3f078a0b9b66c273843fc6c", "signed": "625e1f42c87434a25d622d80d12532806afb2509332449e696b65e1e5888508f11c4ac25f59b8d94d0bf27e4c8d1867007c408da573082dcf19d15a9d5cccb0c6b95af0eebb6a08afadaa19621f76a839be80851c6dd315e8276f501995d4ce6d134df5e798ed517a2f0e62aa1d6c98c36ef14bb1e5ddfc98d5a7fcc81140a13c20d2ca0c4b40e6e6a03eed8c899f9d1f792468152199f4b95a432668947a51d7b8e104d8d1f12aacd967e08b08c41c3c8ca3feedaa5b8b63bcec0613864d953d81143ec81425bde29164a0876f23f37ac9ac9473672ce11a08bd5476f6f66d665e9ad617e34eb32ee56ffa459f20d1b9353d7821298545750c6eff3e7d4073dc3185ede0391cce0575f8ba637d800068d9d7e5403ba7038d2db77da144784f2e8ea76aedfe521e7dc6a674ede35579595993fb20d44b4052783f56c8c0bbd0440b69eabde84468dd13c671fb1bbd5cb022c2a4fcf3542d8b3bb518e5adebddc84e714b13be52c56b282b42ac0892a5459281be7160729f4112c7d99df9be5434f823a9ce0501789de1d550ad50bb18c8d89a33668270bff7b91ff118f5cd9909addde90c024a3ad713915174674f28aaa9f94a322baa543738edab4973312b5bfa12155debcee163cfe2b04ac9c122ac8a4e1bc418c14955d9610455bd945e9793b916267c9c5f9e53ac04518926ec98ecb84a4f0445dcb1236c76c3a678c69abe4e92c22971d62217201a1bdf05c04df8420a3de6a917a85e71e2b9725e77b522915d4c9946077637c2d8813f010b9491cf0eddc3d4668cc0f8bc8a683579be543934da2853a16f5715724f779819f44439e1debcaa4270d9b8594ba4c86e1063b3ce479d71a5409bef27ef4e5c1d1c96e8be13865af7bb43f09162ccbc83a2ca9e9b8a2324e6d996575eefed37ef49908185738b8eae43f8adca330c99bc66cc1fd52c530d7371c60869ce42c197dca0ad128b85f61c8758f0d542f3d3298b65e93c6e8a68fa0e9a1d5e8c5fec805b83aff4390e115eb64f3f078a0b9b66c273843fc6c", "signature": "625e1f42c87434a25d622d80d12532806afb2509332449e696b65e1e5888508f11c4ac25f59b8d94d0bf27e4c8d1867007c408da573082dcf19d15a9d5cccb0c" }, { "secret_key": "143f7b4247d549f6b7c0917266c50f962c28a2ea24762f537aa06ad15e40b35a", "public_key": "c9959f90a2d5feacbae2c4c803ded5deab86987637064337aa2a0b0ddef2fd86", "message": "e274202347a0d057a48bf2a1f6e9f6cb4256079d800374093c020cbf520e5fa27fe996ff07f33ad3b21f74ab0cd93c86475ff37cf622d3f9fa4d13bc99f013e8502b24e46cc87c47e6b2c3662b50e979a0f345b784ff21a8a4d92adc65e86e33b4dbe17f528ccdf5b4864664ba94ffdb7c7d2412b438e6e43fa9668147ee3328224d1f52a3f5b54359b4f7fef69af8f867b478f130a147bea42ed39803bcbc2557bca8c3999f1d24f0a6b03c98846011f9ec74f666417b95020eb1fb2fb88b6312e5008cff03e2d77a26aa532d1780b5077f9e8b828674455d6bc957975f7b2a50e7fd7c1612ce02362efa4c555a1eef68ec34a5c006a6da008a31d4193dc2cc647685ad3cfa3bd7c560b7aed45f0f1a3d1b5b362268de532857055ab9d1d5d858d9ae9a759a51bb9478e8f0ee93c984b576b8b4ab460280be3de205a32f1dc3d572923fb213ac1512d80eb5ad5c18944be77fc17def13a61bbd31bc71acc23d250ec5894ebc214cfec0c1b906516d32d836adc838802e8de30dd76df6e61c1bc438b68d2b025a84f211facf3f1384d2612d0faef5d17131cfe0cfe833fe950e479bc29cbe7fd6da0cce307cf0b1bd92c80e878e432f636ea0cd42480c07e8b8e57e69b2f938b78120f6af4abebf7d4b05cacd6eed854491c029755c4e66338993ed2ac25d19a0c5b40f5e32c8a8b1bce369718186c91d60edff24a8377a9969757599067dd31263a06d6a61154781f29611ab812ff82e813739646263704cd6046357a23c045e2407b7a89508259391314f2fbee49aef0855c6e5e63d912a19df15b11ece34e276dcb88bf2f2e4756358f34a0ee3952b686fcd17578a884176d34ea2916c5d9fcd00eb9e0aa9f2cf0f16e2564bfd28b6ab5968b8448f068320e4187160f8665781b1e2ed9d049e1b54a7d72720ff9d4f073051996a9db6f0c6821c424fa51d", "signed": "c1cfae58515713ea728cfa09090e8942f8df18621ba7090e3a3376c3802775a1ecaf436b184978041ebb75226f970df71d6ad353c0fb465023f9e298f64a7002e274202347a0d057a48bf2a1f6e9f6cb4256079d800374093c020cbf520e5fa27fe996ff07f33ad3b21f74ab0cd93c86475ff37cf622d3f9fa4d13bc99f013e8502b24e46cc87c47e6b2c3662b50e979a0f345b784ff21a8a4d92adc65e86e33b4dbe17f528ccdf5b4864664ba94ffdb7c7d2412b438e6e43fa9668147ee3328224d1f52a3f5b54359b4f7fef69af8f867b478f130a147bea42ed39803bcbc2557bca8c3999f1d24f0a6b03c98846011f9ec74f666417b95020eb1fb2fb88b6312e5008cff03e2d77a26aa532d1780b5077f9e8b828674455d6bc957975f7b2a50e7fd7c1612ce02362efa4c555a1eef68ec34a5c006a6da008a31d4193dc2cc647685ad3cfa3bd7c560b7aed45f0f1a3d1b5b362268de532857055ab9d1d5d858d9ae9a759a51bb9478e8f0ee93c984b576b8b4ab460280be3de205a32f1dc3d572923fb213ac1512d80eb5ad5c18944be77fc17def13a61bbd31bc71acc23d250ec5894ebc214cfec0c1b906516d32d836adc838802e8de30dd76df6e61c1bc438b68d2b025a84f211facf3f1384d2612d0faef5d17131cfe0cfe833fe950e479bc29cbe7fd6da0cce307cf0b1bd92c80e878e432f636ea0cd42480c07e8b8e57e69b2f938b78120f6af4abebf7d4b05cacd6eed854491c029755c4e66338993ed2ac25d19a0c5b40f5e32c8a8b1bce369718186c91d60edff24a8377a9969757599067dd31263a06d6a61154781f29611ab812ff82e813739646263704cd6046357a23c045e2407b7a89508259391314f2fbee49aef0855c6e5e63d912a19df15b11ece34e276dcb88bf2f2e4756358f34a0ee3952b686fcd17578a884176d34ea2916c5d9fcd00eb9e0aa9f2cf0f16e2564bfd28b6ab5968b8448f068320e4187160f8665781b1e2ed9d049e1b54a7d72720ff9d4f073051996a9db6f0c6821c424fa51d", "signature": "c1cfae58515713ea728cfa09090e8942f8df18621ba7090e3a3376c3802775a1ecaf436b184978041ebb75226f970df71d6ad353c0fb465023f9e298f64a7002" }, { "secret_key": "0d1fe9d8b9a2f04c22bbb0edea3833a0ce43339347531fdb67ed513a13d36b39", "public_key": "67c49f410f4853293d0c4d39f4c1b3d6c6103c5cfe20a9a59b53932043517369", "message": "64217ac841fd4d6459bfc4a49b8801d6929bf19b408e8a53790ceb51ec341f9b46a351e8c2e59d887e1eaccb914231cdca1d3e5c47d166b4cdb9b58c013c59a3bd283ad10f6bd62c0f15f764ce14f3b265f537c63e73b6c4fa65e06ce1e1f4ae0d11489dd2602f95fc402b7712052abc84bdc778c19f10001b4e0d5fbe463090e83ef438fe068f3bb6fbc2c139af0678ed2a11faa1b9e49aaa4620abfc08439fbfe2c61840769e5fda2677f8e2f0a14564f9f504232a9fc0d9da471e67fbc574c3d56d2aeb937a586ed5583556308a998eb1dc476a014f5a08228dbed95a1208bc1d1f5d76b4e8d0b2434b995ad458e429ee6142a0c971768cc40c40bcb08e9603f09611474471b3859d7fd584219f02657b430e9e56955b3467ac56ff2eab22cc498489036a574120e2db769a3b21500389142c78a87d069f0e2576cafda8cddd7915a9228773d2ac9a075cb387f2a898617213b2cc5059d11941bc4fe58641e7c1750267e53e99c421cb4cf21d098ca2d1f41644f7908983eb174a23a781cf15ef38eb9116eda4123a1522f53b81fb7368e8075fb83859d2cf98d921535a709fafa9873c4a039aae682f7e6286b899257c0924016ca5bf6d3169099211a9a4a6745cdd3198f1337f60928227ce3c7d60960b53dedf011a8940f5c468207a3894bb0872b333ccdec9d5ecd911ecbbb96c9bc4bd4875320e4d3e9c02d9dc76109ec45e61d1cf5ac729f2e34a9647b95bce70b0c633171adaf0dfdb5afba4035b3cce8cb7141ad142bb7add4fc3f961d42d7203754a4e313221d487831e32947da91138ab648b5952ef6956e27aa5d2c175794bf81ef277faa6b905e14502866887d87880606e81b27af01bb263ecf2c5820585ea6ce8d8b391d86fcedadcd11fdbb566fdf147f402010fc35f5157e036146b3736c8a43359127c261f6bf0cad3bd8a34cb1509f7", "signed": "b05725e7371ed0a91ebc89f3c30baa99183763edb4ce34fe901af3731e001cc54f287118915e90365d91aca8feb1708769f9f1d6eef5aa113bee00b5efab270464217ac841fd4d6459bfc4a49b8801d6929bf19b408e8a53790ceb51ec341f9b46a351e8c2e59d887e1eaccb914231cdca1d3e5c47d166b4cdb9b58c013c59a3bd283ad10f6bd62c0f15f764ce14f3b265f537c63e73b6c4fa65e06ce1e1f4ae0d11489dd2602f95fc402b7712052abc84bdc778c19f10001b4e0d5fbe463090e83ef438fe068f3bb6fbc2c139af0678ed2a11faa1b9e49aaa4620abfc08439fbfe2c61840769e5fda2677f8e2f0a14564f9f504232a9fc0d9da471e67fbc574c3d56d2aeb937a586ed5583556308a998eb1dc476a014f5a08228dbed95a1208bc1d1f5d76b4e8d0b2434b995ad458e429ee6142a0c971768cc40c40bcb08e9603f09611474471b3859d7fd584219f02657b430e9e56955b3467ac56ff2eab22cc498489036a574120e2db769a3b21500389142c78a87d069f0e2576cafda8cddd7915a9228773d2ac9a075cb387f2a898617213b2cc5059d11941bc4fe58641e7c1750267e53e99c421cb4cf21d098ca2d1f41644f7908983eb174a23a781cf15ef38eb9116eda4123a1522f53b81fb7368e8075fb83859d2cf98d921535a709fafa9873c4a039aae682f7e6286b899257c0924016ca5bf6d3169099211a9a4a6745cdd3198f1337f60928227ce3c7d60960b53dedf011a8940f5c468207a3894bb0872b333ccdec9d5ecd911ecbbb96c9bc4bd4875320e4d3e9c02d9dc76109ec45e61d1cf5ac729f2e34a9647b95bce70b0c633171adaf0dfdb5afba4035b3cce8cb7141ad142bb7add4fc3f961d42d7203754a4e313221d487831e32947da91138ab648b5952ef6956e27aa5d2c175794bf81ef277faa6b905e14502866887d87880606e81b27af01bb263ecf2c5820585ea6ce8d8b391d86fcedadcd11fdbb566fdf147f402010fc35f5157e036146b3736c8a43359127c261f6bf0cad3bd8a34cb1509f7", "signature": "b05725e7371ed0a91ebc89f3c30baa99183763edb4ce34fe901af3731e001cc54f287118915e90365d91aca8feb1708769f9f1d6eef5aa113bee00b5efab2704" }, { "secret_key": "c10b5ac6055a1ddbca28552e5c72ebd05278c92239b2fcd0c1353651a8e559a0", "public_key": "b2183e1b00816d29305f7468e7e45eed3fd8f23c15b305f9fda93e812d65bc27", "message": "3594905f9ea464615f41b87abb9d167337f29d45d97f7a1464ec9f2ee50f90f2e67339874d3f2093be9226107701ec1aab941c4e059f1bb26ce86e148d1d9f0da2a2a0f9829a364fb4f13f58b960d0f8d72323283c4490efdf57878645890ff7bc5065dad6e51dd1e5b9a5075150978b3367f1ba84e45ff1f1276c576e4bc72be8aa8e405fc2b27f8146b999845faaa0595d3cb70e5d3712ed54a0fb3e322d45380b5de3609b967b959bca5a583cc520cdcb7bcbb829aa25d7932095ecb303923c2560afc3fd7324b7b7acd089a9f00c03a73d043dc0cf0ba0d8411e2b1b18d21d2a32a726a53059140f784f7cedf2f33cec66fe4ad5cc9eaccbe4ae10036ac3523bac700a113a98b598e6df0304c6fa3212acc04c4e3c7f6687362ef86d617c6dd483f8d80cea66d1951127428a61c1e155a6850bb2afb7f91c82d73eb2b0543ee8fc1f38e1dcdb3c503ddc9ba0812456a5ce2e11d556487a646974a7bbf86e806c58c68c4269a7c9bbcac0ffef9835b33dc449a75479ecd23f6d149c1e5ea8b69208ff36e5fbd68295550318bfa0d3b1d6c1ad4270bcab0904ae53491f9b1ca502e012eed77c427d49a0962f1055125dd7b53733d8528934b5580dd5fd5bbe854978bae3d25bb4ae944e9065e8e2e07946518a6f548e36e056be824d9e02a7a3eaadd37929f58101cb1853be3d7547f58f49e38b018a748d3f19c48582abbdbe953a8a25ba9d365dea835935899c19fb0b51906aa972c5ac45e99c40b3b76e35d327e321e8ae2306a6eb3d8cb6ec2fa5399add19ea0028a01792c08e27c16cf4f85aaaae72f986b099f9ebe4ad0b25d06d3de44a8bfa52844be4a93944833ce2add51bb554b356a7dc49748dd45ae7ec9e8db426c97a25da5edd3b621e4adbde48197a3314de1c50f4d6002027dd7519dde3e15729e486955ac40d9d66876f90668c689d8ab598", "signed": "8a9a3217fdf0643aaaa5c8fb2a88a556398859b8feefbcb48ccd88e585a167c94dbb5c0cad24d15bcabbc1edb21f02a8c457c56120a3234ac33577b9af2ddc013594905f9ea464615f41b87abb9d167337f29d45d97f7a1464ec9f2ee50f90f2e67339874d3f2093be9226107701ec1aab941c4e059f1bb26ce86e148d1d9f0da2a2a0f9829a364fb4f13f58b960d0f8d72323283c4490efdf57878645890ff7bc5065dad6e51dd1e5b9a5075150978b3367f1ba84e45ff1f1276c576e4bc72be8aa8e405fc2b27f8146b999845faaa0595d3cb70e5d3712ed54a0fb3e322d45380b5de3609b967b959bca5a583cc520cdcb7bcbb829aa25d7932095ecb303923c2560afc3fd7324b7b7acd089a9f00c03a73d043dc0cf0ba0d8411e2b1b18d21d2a32a726a53059140f784f7cedf2f33cec66fe4ad5cc9eaccbe4ae10036ac3523bac700a113a98b598e6df0304c6fa3212acc04c4e3c7f6687362ef86d617c6dd483f8d80cea66d1951127428a61c1e155a6850bb2afb7f91c82d73eb2b0543ee8fc1f38e1dcdb3c503ddc9ba0812456a5ce2e11d556487a646974a7bbf86e806c58c68c4269a7c9bbcac0ffef9835b33dc449a75479ecd23f6d149c1e5ea8b69208ff36e5fbd68295550318bfa0d3b1d6c1ad4270bcab0904ae53491f9b1ca502e012eed77c427d49a0962f1055125dd7b53733d8528934b5580dd5fd5bbe854978bae3d25bb4ae944e9065e8e2e07946518a6f548e36e056be824d9e02a7a3eaadd37929f58101cb1853be3d7547f58f49e38b018a748d3f19c48582abbdbe953a8a25ba9d365dea835935899c19fb0b51906aa972c5ac45e99c40b3b76e35d327e321e8ae2306a6eb3d8cb6ec2fa5399add19ea0028a01792c08e27c16cf4f85aaaae72f986b099f9ebe4ad0b25d06d3de44a8bfa52844be4a93944833ce2add51bb554b356a7dc49748dd45ae7ec9e8db426c97a25da5edd3b621e4adbde48197a3314de1c50f4d6002027dd7519dde3e15729e486955ac40d9d66876f90668c689d8ab598", "signature": "8a9a3217fdf0643aaaa5c8fb2a88a556398859b8feefbcb48ccd88e585a167c94dbb5c0cad24d15bcabbc1edb21f02a8c457c56120a3234ac33577b9af2ddc01" }, { "secret_key": "061bddab280b0fdcb26bfd9a0fc721f68f88343b5d3983a16b6dfaa5e76969f3", "public_key": "815578bba6e7070ebdeca117568bd77ebff9e14cb8bc200c32bd87db1fb37d6c", "message": "ee76b40cd429eac7bc12839ca2f7cd31f1e0098a39c5fc19805be0331f44799e318d12571f06e2993753a3685cd2a96b2301e20024209adc5adf7479ff90c477c3695abb99bd28579dbc7831a192beed0ce17b038b20764800653af7af024e2a104ed0f3e52d4bbd3e109cf126291f49b0a21be433c1c5a2589ea572997f63d2bb3972d532be35a0471ef0573d795c072b6a8685b95e47b09ea9f475d93bf12bbd77b7d2bf5d5bddf0ae02375371d1d799ea9204be389e6a8e5deedcd49202e92df7c3e761f92ef8d79fa738d2c5bc280ed32879832ff2b026424589cdbd52d15b60f2aa3526b898849a34a85ff1c47dc6554b85ac76aa7935cbf3f7bc80ad009192a875ca209b40feb047cc446968f970da47b8cd67da7eb4e54a0e5ab20cb35bc6fb7f13307ce67eb6204a67ce9bb1d139c1b4bd5dbed58010c87bf831e6522ee182dad945804b767c4df2554f15b9e9afd2599ef258c67a22caeb92a57988006bbc72c104fac7e5413cd3d3b802c83e639eafe212a38bb7ef779af1a94ee137f6c60667bc48f27bf4a22241bc44bb6033836239bd6eaf3e2e223187841e4641b0f4e9ff8d5a41ddbeabb4138f6b585ace0fb6b53dc3c9edc0373b6047f27d835e8e246644fd832ccfe0df25c3d7da187c9fa05420d43455f2d08b571929386b59c6e0e10a35601da899b1b4dc3d95b67dd9a83818b0a318bfdda06464b4a42d3cb985f30ec97d6a2af13291155d60cec57cbd58d5cfcb35c18535e8d299b5b007590892ea949d1b137a62b39a436cd7e5b9f8d1b6938dbaa62c2268d459c6220a3e6fcbf80ba0118acd2342563fbdbc1f7c9dba7ea2c072afc8ae2128e3ebca0644ffd8163e80a1a557d9d39034ccd9dbd12c8855a6f9165b0801839cf6e07a9fba4c64d9c099e15410e290e677031b65cf7deb0079bdadc573cc056d7666d95d033a0b6bdba7ec", "signed": "b83297ccdd6d0098ebf5d132d174de1958311a766bcc4da15f864d801f38e09d613e7aa8c336302735d75be4166d73b0184b0e0bc5ef39edbccb6e0e61afeb0cee76b40cd429eac7bc12839ca2f7cd31f1e0098a39c5fc19805be0331f44799e318d12571f06e2993753a3685cd2a96b2301e20024209adc5adf7479ff90c477c3695abb99bd28579dbc7831a192beed0ce17b038b20764800653af7af024e2a104ed0f3e52d4bbd3e109cf126291f49b0a21be433c1c5a2589ea572997f63d2bb3972d532be35a0471ef0573d795c072b6a8685b95e47b09ea9f475d93bf12bbd77b7d2bf5d5bddf0ae02375371d1d799ea9204be389e6a8e5deedcd49202e92df7c3e761f92ef8d79fa738d2c5bc280ed32879832ff2b026424589cdbd52d15b60f2aa3526b898849a34a85ff1c47dc6554b85ac76aa7935cbf3f7bc80ad009192a875ca209b40feb047cc446968f970da47b8cd67da7eb4e54a0e5ab20cb35bc6fb7f13307ce67eb6204a67ce9bb1d139c1b4bd5dbed58010c87bf831e6522ee182dad945804b767c4df2554f15b9e9afd2599ef258c67a22caeb92a57988006bbc72c104fac7e5413cd3d3b802c83e639eafe212a38bb7ef779af1a94ee137f6c60667bc48f27bf4a22241bc44bb6033836239bd6eaf3e2e223187841e4641b0f4e9ff8d5a41ddbeabb4138f6b585ace0fb6b53dc3c9edc0373b6047f27d835e8e246644fd832ccfe0df25c3d7da187c9fa05420d43455f2d08b571929386b59c6e0e10a35601da899b1b4dc3d95b67dd9a83818b0a318bfdda06464b4a42d3cb985f30ec97d6a2af13291155d60cec57cbd58d5cfcb35c18535e8d299b5b007590892ea949d1b137a62b39a436cd7e5b9f8d1b6938dbaa62c2268d459c6220a3e6fcbf80ba0118acd2342563fbdbc1f7c9dba7ea2c072afc8ae2128e3ebca0644ffd8163e80a1a557d9d39034ccd9dbd12c8855a6f9165b0801839cf6e07a9fba4c64d9c099e15410e290e677031b65cf7deb0079bdadc573cc056d7666d95d033a0b6bdba7ec", "signature": "b83297ccdd6d0098ebf5d132d174de1958311a766bcc4da15f864d801f38e09d613e7aa8c336302735d75be4166d73b0184b0e0bc5ef39edbccb6e0e61afeb0c" }, { "secret_key": "2cab5bf55ffa914e9ad07622190d343ec55c13cd91b388cb7500ffe06df7c180", "public_key": "b61e432bb97cbae388a2578a7484998e00e9ad3ddfd6cab8d3a5fc5ba04307c8", "message": "2c2d04dc3ad1982359ecd5bc3ee035f3498eedff6104a93c602af2179aeb2cb1f41c5cdb0a77b124f946aa8a824aa3076c2e1acfd48f68070b26276a656b4a4758ab151a6a9c41bd74e09bbd9adcce1e87a0a80d17fd92e85e4bda472c988b6bb1183b7ee59a09d80570466db90dd3749579c4eb19ab75fc152ecdcd68cd1078ef06e593c73516fa8291481a667d3f95bfeb144bab59d6ddc73a2795c1017e09536b3162e4bc58f8ead38957018cfec72badbf22819ab0b406c64730fc73fd9ee61f74187eda91ed4e7993e66884af43ef4c6bf7f7c379e8f0f63dcb8041e26b8b8292b6b6d190e4adf430fa82dd74c57385b919c446db37b5e8767e4a0c95013be89b2bc4e9fd62754a844418400968aed2dd328d7b1dc91e1a2b3009dc7ad140a0686f673168a60e88d80c520fc2dcfc56ca9d4b0c88859099230714dec83d26b4630554dcb9c4901895f78f3834b09766b67a465de8c9490065bf568339243399fdc9d5100324667c5ab28f35c00f6125638e61dab70d1eec48951de0fb3f7b23d3cd982437c63473415bef374a663296f2986b1ae9579b9ffce71ec35eeca116d194f8fba9a45a91bae27ac455db71a6b01a729d0c135fcdcbc23e504a2943c00aa42070519d9cd77ae6754f31eb46a3e5be9eeb3fc8d31ff182da9b087be3462c8459126e862909232fd5f2d89c01815957611e6ae7caa98b6053776a7715c2f93ccf030887030c56c2b8226dae2977995a6d3f1e9d7911a9c9d2a303f0e01f32338efdaf8ee63fc41b25399cffd0b35f7ee5676bd8fd3da2cbee4ae2ea9808d7e73583d99433993146674a4040f42f63d1b3135cc797a8d8f0b88573a32890696cac9439d1e15d196d9090b62b6db7e63c96472d946e668cbda1f4db889300cdcc25e84c9f3857d1d9e53241cf625f3909af1c8aaff4309f68f654b7a15b67711c5b7f9de76775", "signed": "4cf08f4fabbd06dccbcce2a7a5941fe9afddc4d2d0bc80802e93b12cb135d3acf6511e0fe4113c5e3c5541b27d3a2150a757742ac65f95a9ce6673ff0cd21c0f2c2d04dc3ad1982359ecd5bc3ee035f3498eedff6104a93c602af2179aeb2cb1f41c5cdb0a77b124f946aa8a824aa3076c2e1acfd48f68070b26276a656b4a4758ab151a6a9c41bd74e09bbd9adcce1e87a0a80d17fd92e85e4bda472c988b6bb1183b7ee59a09d80570466db90dd3749579c4eb19ab75fc152ecdcd68cd1078ef06e593c73516fa8291481a667d3f95bfeb144bab59d6ddc73a2795c1017e09536b3162e4bc58f8ead38957018cfec72badbf22819ab0b406c64730fc73fd9ee61f74187eda91ed4e7993e66884af43ef4c6bf7f7c379e8f0f63dcb8041e26b8b8292b6b6d190e4adf430fa82dd74c57385b919c446db37b5e8767e4a0c95013be89b2bc4e9fd62754a844418400968aed2dd328d7b1dc91e1a2b3009dc7ad140a0686f673168a60e88d80c520fc2dcfc56ca9d4b0c88859099230714dec83d26b4630554dcb9c4901895f78f3834b09766b67a465de8c9490065bf568339243399fdc9d5100324667c5ab28f35c00f6125638e61dab70d1eec48951de0fb3f7b23d3cd982437c63473415bef374a663296f2986b1ae9579b9ffce71ec35eeca116d194f8fba9a45a91bae27ac455db71a6b01a729d0c135fcdcbc23e504a2943c00aa42070519d9cd77ae6754f31eb46a3e5be9eeb3fc8d31ff182da9b087be3462c8459126e862909232fd5f2d89c01815957611e6ae7caa98b6053776a7715c2f93ccf030887030c56c2b8226dae2977995a6d3f1e9d7911a9c9d2a303f0e01f32338efdaf8ee63fc41b25399cffd0b35f7ee5676bd8fd3da2cbee4ae2ea9808d7e73583d99433993146674a4040f42f63d1b3135cc797a8d8f0b88573a32890696cac9439d1e15d196d9090b62b6db7e63c96472d946e668cbda1f4db889300cdcc25e84c9f3857d1d9e53241cf625f3909af1c8aaff4309f68f654b7a15b67711c5b7f9de76775", "signature": "4cf08f4fabbd06dccbcce2a7a5941fe9afddc4d2d0bc80802e93b12cb135d3acf6511e0fe4113c5e3c5541b27d3a2150a757742ac65f95a9ce6673ff0cd21c0f" }, { "secret_key": "dd7b59a33d970bef62e0e21a7b6e4c30960686f17f49afdb4a9f4e808e355c7f", "public_key": "53a0e57277d9bbeecf99c4d138fd66fafcaec7bc5f567f8320800c4e584ff82e", "message": "75580367930518168b0a764d0958bec4fc46cf591999eb3737e42a02ea72d210daad53e54a7c2c134a6d478337d2633368548170edef0d85179f3023e1503868a6e5e2775e412ac05f0589d42a377e75aa6b8f5220a7699ae8aff01094ec469d6361d3e8f38615edcda4d2d5289acf73db6456985780c92e07f62c77a909fb6ef598822062bd572bf7058dcb835ef3443d3e47b5c603d92736dd1df26be4b9283b76e321d55ce2b638cde22577ca59c963c2479556c575ccb0d6d18c804e2eb01ff53581eb040ffd2cc46760737a74672ea6bf78058a6a0a1f5ebf56decbf94b54afb23c11d34179bf0976b4158017d407c95a401fa6f9624d77135eae8141ebea9f35d5f51b3ded995c7f70c025b094adef2b071f971155d7796d613a550d09e7f4dfc34517b3f8fa4393286a2b228017daf2e015387e13527f63661d3c13e78e90fb2955eee345739119b791f05b07c8f42a436efcad1ec5ea10f308f8e23ca98bc65a5fd9393efaafe5cdefba81058170cc5493c00cedf254097435d2e2fde55f866bb82dbdfb9154344974866359167b466caa909b91530c9c7ee8c53fa90164bbd0b1fadbdcd08127f19be5033071518d3cf10ae6bd6f9827e1206f5ec095c1986170e8d5d8e72e57d4228701df2a48c954873056cfdfbaafb10e46a0c1f144b1a0eacdd2cb66bb912ac471787dabe48353859120b03403567c415ddb88fc0d7fba4069bbfef406eed724a11abc041e8e7beb663d0dc99dcef3ac6a149007b42dd1f22a77dd52901814325172224a2778f366fb9eb02c812b842a42842561c68f2ac231c26ce9e8b19ae91ebfad3c0e9f66363a13ecd8b897a3d00a26d257648d56c6747441ca1c6ee99f08ddad25d116dfadab0383000d3d7225cf2eff7076b2adab9522292555f3193206786000d42ca34d708dc04284a94d174cc92f102efddf3148c2996916d4", "signed": "87294d22d4ad0d0814e2d6d5faf55749e9b39803b4d4b7879e60b777c1fc41584fe15135ba1123ff5f200db35a3468dd4d58dad77bd96ee2b888a5a8b18c320475580367930518168b0a764d0958bec4fc46cf591999eb3737e42a02ea72d210daad53e54a7c2c134a6d478337d2633368548170edef0d85179f3023e1503868a6e5e2775e412ac05f0589d42a377e75aa6b8f5220a7699ae8aff01094ec469d6361d3e8f38615edcda4d2d5289acf73db6456985780c92e07f62c77a909fb6ef598822062bd572bf7058dcb835ef3443d3e47b5c603d92736dd1df26be4b9283b76e321d55ce2b638cde22577ca59c963c2479556c575ccb0d6d18c804e2eb01ff53581eb040ffd2cc46760737a74672ea6bf78058a6a0a1f5ebf56decbf94b54afb23c11d34179bf0976b4158017d407c95a401fa6f9624d77135eae8141ebea9f35d5f51b3ded995c7f70c025b094adef2b071f971155d7796d613a550d09e7f4dfc34517b3f8fa4393286a2b228017daf2e015387e13527f63661d3c13e78e90fb2955eee345739119b791f05b07c8f42a436efcad1ec5ea10f308f8e23ca98bc65a5fd9393efaafe5cdefba81058170cc5493c00cedf254097435d2e2fde55f866bb82dbdfb9154344974866359167b466caa909b91530c9c7ee8c53fa90164bbd0b1fadbdcd08127f19be5033071518d3cf10ae6bd6f9827e1206f5ec095c1986170e8d5d8e72e57d4228701df2a48c954873056cfdfbaafb10e46a0c1f144b1a0eacdd2cb66bb912ac471787dabe48353859120b03403567c415ddb88fc0d7fba4069bbfef406eed724a11abc041e8e7beb663d0dc99dcef3ac6a149007b42dd1f22a77dd52901814325172224a2778f366fb9eb02c812b842a42842561c68f2ac231c26ce9e8b19ae91ebfad3c0e9f66363a13ecd8b897a3d00a26d257648d56c6747441ca1c6ee99f08ddad25d116dfadab0383000d3d7225cf2eff7076b2adab9522292555f3193206786000d42ca34d708dc04284a94d174cc92f102efddf3148c2996916d4", "signature": "87294d22d4ad0d0814e2d6d5faf55749e9b39803b4d4b7879e60b777c1fc41584fe15135ba1123ff5f200db35a3468dd4d58dad77bd96ee2b888a5a8b18c3204" }, { "secret_key": "d880d2fb06262f57ab8778e33d16b473060978a6549cdbcd5586ba8105f5aca8", "public_key": "0de486d2115faf2d547266772e430fd9727bdcace6ecbf2fe23ab60f7b5254b1", "message": "114743e82a0993cec9705067abd77c168b53677ede5c159fad36f06fc1a14acd77f883799ed9883f9915aea638ec1741f3f4215855fb5b07df3793bbe5b568eb3594391a9ef5727fab93e57469b37de125b1e9f2e6fe2c3d1a10ecf87b6c0a665c6d460a170eefb9bf716cd8faea9764f579ff34ebfa9c4cfb34706d8dd7c9eb1d10b2df460a46bb5789430bf449158b5824f2a3a7b918b33acf2d9ebe90216d1b7cbf4af770c5db95fc62ff3a3c385c3a8217853b7346634aaf30607288db0c483bd4c222eb332cb89dc4a217e6334a268413a390bb371aec355fbe4c736f7da75f9c887541a2b7d0dac018b6138f021e77266ddece8468452ada39f5e63d0209b9d6dabf975413256dcaa15ac14b6068e177056c7bf0f0f7c884a3402032298cd559a6312039400632327f9c0e763e52798cb177da4475e4b2405c157ca427741108d33ed0b7a3f53438ce6b725c6dd5814af51cfa45dbced557f726db130d55cde7533bc2092d6b699c2c870af282731e18d651ae85b3db4ba02853f8c87fd5e3ab69bc57b08b81f83c239ccf22e817e2ada4d0ad14487ed14612c8b0973ec0650a55f6bf9af4ae9256ad3546a3f67dd35d987ef21909a94c50f0ef0640e755b1c4e1a012af0d31766eeb5df31cd104c64eb62eb4efb139cf305769401d213f96a488d5ee7e3ce32b0192ee8f0831bfbe8fe95de956886b524d3319b73fd56dc60e9f1c72d78155a97c6f43697b20466b3e7aebd357b91696e7348f4599b34f3591eddfce2a7bd849ab16f7b43ebb16e23d6f5210efa30ab3ba8d32c40662b8662fd911544bc2458c6569ef75a9b9df6a0f6d80d658ba86b241ca19ce9a6fcf01d3daa95afb59c3d89a18b948621394327fc5e920a75f98f5e2b3d6c95fd852adf567b6d37c54d2970856a599f749e2c55dac7c23e3fb1a63bb4cc47b8b94f3d589ac4beef0aad4e6292f", "signed": "4c00a71668d3213c29c7041c5a037edf13c6514bd0ebc880c909caff1506a45d27809fb74e6602ea2aad0f842831b74fb3d6900ccc520652da28368fd90ca30e114743e82a0993cec9705067abd77c168b53677ede5c159fad36f06fc1a14acd77f883799ed9883f9915aea638ec1741f3f4215855fb5b07df3793bbe5b568eb3594391a9ef5727fab93e57469b37de125b1e9f2e6fe2c3d1a10ecf87b6c0a665c6d460a170eefb9bf716cd8faea9764f579ff34ebfa9c4cfb34706d8dd7c9eb1d10b2df460a46bb5789430bf449158b5824f2a3a7b918b33acf2d9ebe90216d1b7cbf4af770c5db95fc62ff3a3c385c3a8217853b7346634aaf30607288db0c483bd4c222eb332cb89dc4a217e6334a268413a390bb371aec355fbe4c736f7da75f9c887541a2b7d0dac018b6138f021e77266ddece8468452ada39f5e63d0209b9d6dabf975413256dcaa15ac14b6068e177056c7bf0f0f7c884a3402032298cd559a6312039400632327f9c0e763e52798cb177da4475e4b2405c157ca427741108d33ed0b7a3f53438ce6b725c6dd5814af51cfa45dbced557f726db130d55cde7533bc2092d6b699c2c870af282731e18d651ae85b3db4ba02853f8c87fd5e3ab69bc57b08b81f83c239ccf22e817e2ada4d0ad14487ed14612c8b0973ec0650a55f6bf9af4ae9256ad3546a3f67dd35d987ef21909a94c50f0ef0640e755b1c4e1a012af0d31766eeb5df31cd104c64eb62eb4efb139cf305769401d213f96a488d5ee7e3ce32b0192ee8f0831bfbe8fe95de956886b524d3319b73fd56dc60e9f1c72d78155a97c6f43697b20466b3e7aebd357b91696e7348f4599b34f3591eddfce2a7bd849ab16f7b43ebb16e23d6f5210efa30ab3ba8d32c40662b8662fd911544bc2458c6569ef75a9b9df6a0f6d80d658ba86b241ca19ce9a6fcf01d3daa95afb59c3d89a18b948621394327fc5e920a75f98f5e2b3d6c95fd852adf567b6d37c54d2970856a599f749e2c55dac7c23e3fb1a63bb4cc47b8b94f3d589ac4beef0aad4e6292f", "signature": "4c00a71668d3213c29c7041c5a037edf13c6514bd0ebc880c909caff1506a45d27809fb74e6602ea2aad0f842831b74fb3d6900ccc520652da28368fd90ca30e" }, { "secret_key": "585871941cc282e333d57bbfc3d4aeda862cfa0a375030cd594b3692848c5f00", "public_key": "4f343816cd48050b678d3adf70008877c9fcf5cb662cc4ad2b93864c02090707", "message": "651c101b3e2dfef0783ce9f61bd0a8bdc9307ac0488b9dd70cd90a7ed8f179a78935556295b91cc2b97211e3b981b8dafcb3d06b76d0b6eda7fc61945c0ee2652c5ac454256496cb82f98cc1cc92d81893b1082b31b47e6d22a2de609de4ce8d7cc4f4a152c47f410d7fc37d38ccd629a4b33e6221896081797d0753dd4faa8a8b44d6c4677166dfb4d5215446360a3c28d8f68e38ab54608b98821b83c187b5393ad874a76f4f5d729493a1fd74cc7719caea991d229c5d0c8c4c5f89d8e4345f4f52214313410b8c06b3315f45ed0c2f9138ab966aec0a645b6dba76380a539123e0f33b97f3d060394a3053581ffdef3e6d36531166b553a9dde03105c04af697d95e95217fd6dc968bf3b448d5f3a8e4f5ae7edc30ec78b1aea4f0db189a949a122138cdfb5f9693db004baed1a421dc44122f327287f727cf989fcae3cf3be3e3dd9b9f53502cf5d9fb186de791d310d122869c9fc3b695dec1607477f3e149e52b63cfdfb0d983e89af2f75a8f489843ec05c5ea5f0e721acab387c68025f20abe0d27b4ce29f4a64fb7f8e8a332873d3ed121fb493414b8cb0c00ad3ab616c5be5241471adee9f8f46974eae84a4a8ce6fabb7f5d9a6b75a7e670456fcdcd1d982e8f827a4bbb69dec7e3053dfe835b70301b7b763f0004bc906e145542f487b4dba2ed561bd1a20306236af4b36e4068e8c007b9454f8741a5f8f079ec1db8835eb6544290d6adb52a70d7675d85df4a9a1255bfd936c331fe51c0977d124b5a506d29c6eec33caa25d8eb28952d6ffb9d6e3da890382d888796d374607f6643b89e7326d9edc49a0f53bdcb8cc76ffd393a7706522d04170036ccb66330dbac9da7e6168caa88cb62181e55a7b6d521a2115e23e202ee2480b587be4501447979a8d736f9012ecf00e67b31e8104f6e7df08a9683cdc89c03a4e37ee22928d45fa19094e0d6e7b40b", "signed": "298856e570188aefcad81bb970f076965770c26762fe29e6554dc7afcdb801723bf6c763b4ccd65f4e15d7d8ea38fcf67ea9d28590c79255c1cfeba7b5e45a00651c101b3e2dfef0783ce9f61bd0a8bdc9307ac0488b9dd70cd90a7ed8f179a78935556295b91cc2b97211e3b981b8dafcb3d06b76d0b6eda7fc61945c0ee2652c5ac454256496cb82f98cc1cc92d81893b1082b31b47e6d22a2de609de4ce8d7cc4f4a152c47f410d7fc37d38ccd629a4b33e6221896081797d0753dd4faa8a8b44d6c4677166dfb4d5215446360a3c28d8f68e38ab54608b98821b83c187b5393ad874a76f4f5d729493a1fd74cc7719caea991d229c5d0c8c4c5f89d8e4345f4f52214313410b8c06b3315f45ed0c2f9138ab966aec0a645b6dba76380a539123e0f33b97f3d060394a3053581ffdef3e6d36531166b553a9dde03105c04af697d95e95217fd6dc968bf3b448d5f3a8e4f5ae7edc30ec78b1aea4f0db189a949a122138cdfb5f9693db004baed1a421dc44122f327287f727cf989fcae3cf3be3e3dd9b9f53502cf5d9fb186de791d310d122869c9fc3b695dec1607477f3e149e52b63cfdfb0d983e89af2f75a8f489843ec05c5ea5f0e721acab387c68025f20abe0d27b4ce29f4a64fb7f8e8a332873d3ed121fb493414b8cb0c00ad3ab616c5be5241471adee9f8f46974eae84a4a8ce6fabb7f5d9a6b75a7e670456fcdcd1d982e8f827a4bbb69dec7e3053dfe835b70301b7b763f0004bc906e145542f487b4dba2ed561bd1a20306236af4b36e4068e8c007b9454f8741a5f8f079ec1db8835eb6544290d6adb52a70d7675d85df4a9a1255bfd936c331fe51c0977d124b5a506d29c6eec33caa25d8eb28952d6ffb9d6e3da890382d888796d374607f6643b89e7326d9edc49a0f53bdcb8cc76ffd393a7706522d04170036ccb66330dbac9da7e6168caa88cb62181e55a7b6d521a2115e23e202ee2480b587be4501447979a8d736f9012ecf00e67b31e8104f6e7df08a9683cdc89c03a4e37ee22928d45fa19094e0d6e7b40b", "signature": "298856e570188aefcad81bb970f076965770c26762fe29e6554dc7afcdb801723bf6c763b4ccd65f4e15d7d8ea38fcf67ea9d28590c79255c1cfeba7b5e45a00" }, { "secret_key": "0588acd4e09ba90274c8f3d1575b2bf364a776884a9aeb4103415e163ba0bf81", "public_key": "3ecae697b425d87e34a1d944098e3d32e2c1ec56c3627df80ba2b8a43ddc1903", "message": "f828f8c9dad298c5b719daa852b17e762598a70f4ecd16a2fc596eb0263899e983d44edcc7bd240cb07610600ae96aac0dfc3be387b616850899b5cf44e1767ffaca3df38158598424f8071414c704e60b422ad77377fa7f6a8c5d0ebc0235e2d43a984f3adf759eb10447f3c2f6b80d5a11ef41d3a09852c0932a1b9ac23e6f40a167de21041bec8885f9433eb80b95c9785958046cdb7bf147a79947823b4149ae0521d7e5aabc1564fa4044106e2e392e9c344457e9929376ea9b4229c6e7738fe79008d554c429396914c36387f579b46bab146f6a9510eb6f8c85551cbd84c7dc0d0b1c010ccba5963a7f39f181e44dbc98e495aa63c01059cbe6a99b07b449e7759c9af9e0f8d9054a67a348fa19d7f91ec0a4d4f2c7026c3b849259a350417fd86cab2142e4cfe3c0afbf25182a2d52bd2e0bc920e85080832b91b927b62948a67c317eb09091461d493eea5ffc47bf085582968258a3c8dd81a858270bddafe7925684a15ffb51bcfaab931afa465e3090e86be41e3547cba234b85fe7db700496a505002df3ca4eaec7b96278c7d1a77db834a91797bbb826d092aa28b49545ed3b1eda23be11a3f528b955cb0c4fa66e16e957e5704cf319e5f79cc09f2d054e6daf19e2926b11e1e413ff822ca141f7c3d385ae95dd20b346e583cfb0c229ec39cf889a5419cd37bc184ef5fb144622080a302d9d7745c451f7d88242cc26b916a3569abc7d1f216d57797a472bc621761758e840eb8e29bc8efcb7aafc7cf8f4e59330d35ee107496dec6e714b1fa4309837bb47eb3a06b4604dd20733cc0eaac2649e18c07342ef55d19b8d039591ac2869acc34b6c3c1ca3cf263ff84ca43a5f6465ba34888c109013b32bfc0d0d15f5a76cec270ab3ac9a106331312f5a0a84282c3a3d4aea1e7cf53dbf8b240bdd111c34d2a93dfd1258fe9267133f7554dcc21a8f439c165d", "signed": "a111b9706d242cd36d6e8741cbb097b9e2fffa40f43fd6f2d3d91693667332b5f2db5ee3ea20b83291b8405795b74d633d46f475ab7c47617118535b8051d907f828f8c9dad298c5b719daa852b17e762598a70f4ecd16a2fc596eb0263899e983d44edcc7bd240cb07610600ae96aac0dfc3be387b616850899b5cf44e1767ffaca3df38158598424f8071414c704e60b422ad77377fa7f6a8c5d0ebc0235e2d43a984f3adf759eb10447f3c2f6b80d5a11ef41d3a09852c0932a1b9ac23e6f40a167de21041bec8885f9433eb80b95c9785958046cdb7bf147a79947823b4149ae0521d7e5aabc1564fa4044106e2e392e9c344457e9929376ea9b4229c6e7738fe79008d554c429396914c36387f579b46bab146f6a9510eb6f8c85551cbd84c7dc0d0b1c010ccba5963a7f39f181e44dbc98e495aa63c01059cbe6a99b07b449e7759c9af9e0f8d9054a67a348fa19d7f91ec0a4d4f2c7026c3b849259a350417fd86cab2142e4cfe3c0afbf25182a2d52bd2e0bc920e85080832b91b927b62948a67c317eb09091461d493eea5ffc47bf085582968258a3c8dd81a858270bddafe7925684a15ffb51bcfaab931afa465e3090e86be41e3547cba234b85fe7db700496a505002df3ca4eaec7b96278c7d1a77db834a91797bbb826d092aa28b49545ed3b1eda23be11a3f528b955cb0c4fa66e16e957e5704cf319e5f79cc09f2d054e6daf19e2926b11e1e413ff822ca141f7c3d385ae95dd20b346e583cfb0c229ec39cf889a5419cd37bc184ef5fb144622080a302d9d7745c451f7d88242cc26b916a3569abc7d1f216d57797a472bc621761758e840eb8e29bc8efcb7aafc7cf8f4e59330d35ee107496dec6e714b1fa4309837bb47eb3a06b4604dd20733cc0eaac2649e18c07342ef55d19b8d039591ac2869acc34b6c3c1ca3cf263ff84ca43a5f6465ba34888c109013b32bfc0d0d15f5a76cec270ab3ac9a106331312f5a0a84282c3a3d4aea1e7cf53dbf8b240bdd111c34d2a93dfd1258fe9267133f7554dcc21a8f439c165d", "signature": "a111b9706d242cd36d6e8741cbb097b9e2fffa40f43fd6f2d3d91693667332b5f2db5ee3ea20b83291b8405795b74d633d46f475ab7c47617118535b8051d907" }, { "secret_key": "7d14023eb48bbd437649a241877905a3c932f14640f29a0fb134114e8f33f582", "public_key": "ea5c11b4b2c5ef4ab706cca3475043c95818eb565a797e33688afeacd68adcca", "message": "9001db31f279be505319b8e72bde1199512980df65f0d8a9b4930467413a997b97a362b572a4b44bc940487f18b208ce6ac5c68716d3af1bcef170383b5c4b5c47e44737726f9383bc4f144768bf5cafb4e9dfe39761e6ed478971d1c70e6dab2fd0499dff9293b239d16c960261c68218b9f5b1bee690f0d240c1b3db711f9e821f0809bbeb9aaf249ccb168c67d965562d24f848516140bfd9fc050d4f20da5a1794468a9c0725ea5c669d5c630d9310e5745107dad37261b5d91e38e08512e6f373ec5dcad5ca09072907c8fb7bf3b926c3339490b3f51f7644e73ae2ec01d61be7c6526536b4ffd1ab6849fe0c2f40d3bda2a49e5550b8df979081da85168d0f71582b903677526d1f1b1511e138b684fc46aac8bd80c3def7ee8138190461807c5536125cb0e2c3d083a187c7269cb531ec3678787b32555cf04ab093c9002e7d792b4d933f2e3070f39ac8ccf8d5f5455f12109d8a8aeb4e212fad4a70b147c04a7b918460b1316376e64020859517eb7ee30c290be8b8d6f9673915256c3b04b9d9054b52338e0d360785e46a182844c5c3766aea8ed311b2d481c0b7b2114e418ed17f8debf01a83ff37517024ee9e28e0c90dce6d059ffee413d27cd62783a8b8b5016ad276e39dfd8f8f3ddfc428101818ce507f003eb58c9a5cc8b1aff05aab8f0d7f1d1f6d4b871dbced1f3d2866239752fb13f6e18034bb2b5a6635caa6ecc462e058ebe2fa651d3d0f36e20a31f765e4b958270bd825c6818aac1ad7563135aeedf14a2b6d398b6e34008401b218461820071c5af77846cb9c328190c061d5aa6e0ecde7ef5856b0e6814f833f704096df0825fa4b46dcdacfa27cd87bd7bfeff7f8cae166a3a04d437c7be716c49045c7bd3d1349627c9cbd04c15f00a696e3cffbb45af29122627e7ed33b4249913bec00f0e28aa11298cce8b649081fe3b169b4aaeaca485bda", "signed": "31339dce23336df5b2b193522aa3dd2d4114a66af1656289c952bc11c9b210f77a54d46161f4e0c52b3013e40b9e9e8427d851325bd71c4d99353eeed751080d9001db31f279be505319b8e72bde1199512980df65f0d8a9b4930467413a997b97a362b572a4b44bc940487f18b208ce6ac5c68716d3af1bcef170383b5c4b5c47e44737726f9383bc4f144768bf5cafb4e9dfe39761e6ed478971d1c70e6dab2fd0499dff9293b239d16c960261c68218b9f5b1bee690f0d240c1b3db711f9e821f0809bbeb9aaf249ccb168c67d965562d24f848516140bfd9fc050d4f20da5a1794468a9c0725ea5c669d5c630d9310e5745107dad37261b5d91e38e08512e6f373ec5dcad5ca09072907c8fb7bf3b926c3339490b3f51f7644e73ae2ec01d61be7c6526536b4ffd1ab6849fe0c2f40d3bda2a49e5550b8df979081da85168d0f71582b903677526d1f1b1511e138b684fc46aac8bd80c3def7ee8138190461807c5536125cb0e2c3d083a187c7269cb531ec3678787b32555cf04ab093c9002e7d792b4d933f2e3070f39ac8ccf8d5f5455f12109d8a8aeb4e212fad4a70b147c04a7b918460b1316376e64020859517eb7ee30c290be8b8d6f9673915256c3b04b9d9054b52338e0d360785e46a182844c5c3766aea8ed311b2d481c0b7b2114e418ed17f8debf01a83ff37517024ee9e28e0c90dce6d059ffee413d27cd62783a8b8b5016ad276e39dfd8f8f3ddfc428101818ce507f003eb58c9a5cc8b1aff05aab8f0d7f1d1f6d4b871dbced1f3d2866239752fb13f6e18034bb2b5a6635caa6ecc462e058ebe2fa651d3d0f36e20a31f765e4b958270bd825c6818aac1ad7563135aeedf14a2b6d398b6e34008401b218461820071c5af77846cb9c328190c061d5aa6e0ecde7ef5856b0e6814f833f704096df0825fa4b46dcdacfa27cd87bd7bfeff7f8cae166a3a04d437c7be716c49045c7bd3d1349627c9cbd04c15f00a696e3cffbb45af29122627e7ed33b4249913bec00f0e28aa11298cce8b649081fe3b169b4aaeaca485bda", "signature": "31339dce23336df5b2b193522aa3dd2d4114a66af1656289c952bc11c9b210f77a54d46161f4e0c52b3013e40b9e9e8427d851325bd71c4d99353eeed751080d" }, { "secret_key": "e8306bada6d55eb188d9f75c815cc914e93c9c7222391c15bbaeaf9354437935", "public_key": "bf2798b8e554f51e2286c3034a88e577ff23fa32a67244ea8245912e8bf46da4", "message": "d7043809c3e3dc00b17efd52c9130b11b786f1e257b5e22f81a7faae600bbcdfd518537fe852c642359762fb75e8ad859249e6ab49ce1bb04f2492f2aac35446ba6eb03e76de3abd2d5fc7e6146843add042860a4a16b59bdd7d038378a35e1a04b1217a55710d937e2c9032232ea2cdd1d25a0bff71ef5d3e0c056b29cb92f6df692bde14dfa50e132bebd89e9f1833880b657a781e94ecb603041756e5517d4423c56fadc13e2b318088feddf3b5c83c20b46fddbba92305e48606dab748ce3848b843f4711f370c3ec7d5e19ab4c0ac1ae15aaaf23d65fecedabc08049b9e29113e5761ed9d1c62eb075cabb2674cdbe1e3a889bae4b1dd31b6a5b2ea1b8dedcc3c515edc4467c30231176cd44bec8a057951ab5cd39a9623f8af8473cd27d93302bf8aa624c9c3c5799da1dc494494ef8ff1dbe0187ea5162670b8d098c3a94919398dadf79e6c2491c444392c29cd50d57435063290842bfa0e8530faebc006d6ea7801117e0a3f019ee28fb3792235402e2f69b87a43dc227f9de316029756c3167d64a3a3f6d73160331d5a18eee5b0e6e22a663efdcc8d67af3bced041ea843a5641603ec72efd644e173d199a8c830b2ea5fec0378027c37225afcb604c4cdcf409be1c509c9a377be0d0524107c6d92b5f09a29efb7109295670bb1a1dd3ea008bb79185f09b98f020c43f1439685b96f6199311a090870f0d9b10d495cd410aa95b7e53749be3a6c0fbc729f96cf8564397b09c13514016825f72f14eb93294d7010accfd11f17a6ac8f544263d6038d5c7db29486291b30ea49b6b54cf88826dd252cd9dbb57d841b5a4cf702a3264faa4dccc86ab14daf124ef3d5335a6878d065c6ba29991045765ee5542cc9f5d9f354dcd2c6e0cf7ff3a30f649b5912d971d633578f1e9f263874d0565c247301dcbd15d76211ae2d3d506fc64deb7e042565d438e2bfb249243b7", "signed": "cc6627308e2f424383fa70594f575791600540027a2751619b283affeaebc9c9d29ac6db286dd2c1b596587b878d1df4781d436bb570c1c0f0d33368dc66520bd7043809c3e3dc00b17efd52c9130b11b786f1e257b5e22f81a7faae600bbcdfd518537fe852c642359762fb75e8ad859249e6ab49ce1bb04f2492f2aac35446ba6eb03e76de3abd2d5fc7e6146843add042860a4a16b59bdd7d038378a35e1a04b1217a55710d937e2c9032232ea2cdd1d25a0bff71ef5d3e0c056b29cb92f6df692bde14dfa50e132bebd89e9f1833880b657a781e94ecb603041756e5517d4423c56fadc13e2b318088feddf3b5c83c20b46fddbba92305e48606dab748ce3848b843f4711f370c3ec7d5e19ab4c0ac1ae15aaaf23d65fecedabc08049b9e29113e5761ed9d1c62eb075cabb2674cdbe1e3a889bae4b1dd31b6a5b2ea1b8dedcc3c515edc4467c30231176cd44bec8a057951ab5cd39a9623f8af8473cd27d93302bf8aa624c9c3c5799da1dc494494ef8ff1dbe0187ea5162670b8d098c3a94919398dadf79e6c2491c444392c29cd50d57435063290842bfa0e8530faebc006d6ea7801117e0a3f019ee28fb3792235402e2f69b87a43dc227f9de316029756c3167d64a3a3f6d73160331d5a18eee5b0e6e22a663efdcc8d67af3bced041ea843a5641603ec72efd644e173d199a8c830b2ea5fec0378027c37225afcb604c4cdcf409be1c509c9a377be0d0524107c6d92b5f09a29efb7109295670bb1a1dd3ea008bb79185f09b98f020c43f1439685b96f6199311a090870f0d9b10d495cd410aa95b7e53749be3a6c0fbc729f96cf8564397b09c13514016825f72f14eb93294d7010accfd11f17a6ac8f544263d6038d5c7db29486291b30ea49b6b54cf88826dd252cd9dbb57d841b5a4cf702a3264faa4dccc86ab14daf124ef3d5335a6878d065c6ba29991045765ee5542cc9f5d9f354dcd2c6e0cf7ff3a30f649b5912d971d633578f1e9f263874d0565c247301dcbd15d76211ae2d3d506fc64deb7e042565d438e2bfb249243b7", "signature": "cc6627308e2f424383fa70594f575791600540027a2751619b283affeaebc9c9d29ac6db286dd2c1b596587b878d1df4781d436bb570c1c0f0d33368dc66520b" }, { "secret_key": "363c1ea7c32ea328a055af7bd8b3bfd204fb0bbd4bf42ffe262f3a5ebd54da55", "public_key": "7a83ecca51ef6e5aa043a5ce04d9288add49a277548bd3016b693ffa79a22edc", "message": "c41c1e1fb75954a0ae0ebc29090b9fc533e693e7c7105cfe40ef526e4e12a7405221f218c7ac019e1d4c92da2853f2d726aa62277924df0c343fc3d47cd5a99a3e279b26a1b13b1f2aa36f7ccb4b54fbef18bd87a55f1bc40ce7b2029145ee7aab391795ac68de6199f50594fc79611b85131c143021f26fa358da0c7c6a65dde076dab488675b722309e5ed9746d18a89309906a7a9df237dd27bd590ccc77c402ef6e19ca63cc86b85160330ee6e1f1f47a2ff807eefadc00963520a1c600a3e45aa7fb2554f47d897bd86d81c3b0877101222fa7850b80ce3bc06c9e58c0c96e32fec8530c9fa1e4163f0ef8456952bf6dd58045a363d61880e9ac976a3603ef77a4c395e6a07e342f6023b8af10225cff240efc0366a799fd86e9d062060d8724033bdf67588cd73ac284de4c6943cf45ee4f75f5937d97d78105f0bbece04d3dcb5e424eff89b773e5d6b4f37efa9a0654cb3ef345278a62d876cfef9a3dcdceb7081441877ebd5fa30c9d954e3684fa476a4f485d426fd3c8c32bea0f9cc20b15e8fdfc3ca4b302c074f508132d15de625c10ae0737811463dcc55fcc4014b20208fffcefa9dd452119b1652de41348f69f2c488f5cc1856d6e78a5cbe3e373dd4598e2d39f876eb94e0b01b21fa9129ef41b639f4e05e69deb1835ed44b9112a6862a5bcea072c6e1b8f0f058f46bac2a845a582d148f17760b9e0a2ba60bbbf3884af94dd4c7ec9db08e9a5bcc6dde1346442ee1f4707d1f79b69ba867f418dc279173f77adbc58ab85ea393b9dc68261900c1caa82d2f50474c42aec911314278c0affa2a6b6c36d1ff88f3b49fb2b7c339d2a7c2b3049f8c0a08d16a9e8df93d130da484bdba6dbec534cd51097a048221106bab48d67f951b7505a1484892b85779c5a3111702124d957acf2dc352ef9ba247bc80e2ce96269ce85e78b9ebda989076dd5ff73e1eb275e5d7", "signed": "5fd1e5f9922a12f636b72a7d6217091f948a55bcb1826b8fcaf99d26416c7ab1351c10f4093ffd8a2af86914a0a98184ec7e06d2dee87fdc0f4a47f8c63cf501c41c1e1fb75954a0ae0ebc29090b9fc533e693e7c7105cfe40ef526e4e12a7405221f218c7ac019e1d4c92da2853f2d726aa62277924df0c343fc3d47cd5a99a3e279b26a1b13b1f2aa36f7ccb4b54fbef18bd87a55f1bc40ce7b2029145ee7aab391795ac68de6199f50594fc79611b85131c143021f26fa358da0c7c6a65dde076dab488675b722309e5ed9746d18a89309906a7a9df237dd27bd590ccc77c402ef6e19ca63cc86b85160330ee6e1f1f47a2ff807eefadc00963520a1c600a3e45aa7fb2554f47d897bd86d81c3b0877101222fa7850b80ce3bc06c9e58c0c96e32fec8530c9fa1e4163f0ef8456952bf6dd58045a363d61880e9ac976a3603ef77a4c395e6a07e342f6023b8af10225cff240efc0366a799fd86e9d062060d8724033bdf67588cd73ac284de4c6943cf45ee4f75f5937d97d78105f0bbece04d3dcb5e424eff89b773e5d6b4f37efa9a0654cb3ef345278a62d876cfef9a3dcdceb7081441877ebd5fa30c9d954e3684fa476a4f485d426fd3c8c32bea0f9cc20b15e8fdfc3ca4b302c074f508132d15de625c10ae0737811463dcc55fcc4014b20208fffcefa9dd452119b1652de41348f69f2c488f5cc1856d6e78a5cbe3e373dd4598e2d39f876eb94e0b01b21fa9129ef41b639f4e05e69deb1835ed44b9112a6862a5bcea072c6e1b8f0f058f46bac2a845a582d148f17760b9e0a2ba60bbbf3884af94dd4c7ec9db08e9a5bcc6dde1346442ee1f4707d1f79b69ba867f418dc279173f77adbc58ab85ea393b9dc68261900c1caa82d2f50474c42aec911314278c0affa2a6b6c36d1ff88f3b49fb2b7c339d2a7c2b3049f8c0a08d16a9e8df93d130da484bdba6dbec534cd51097a048221106bab48d67f951b7505a1484892b85779c5a3111702124d957acf2dc352ef9ba247bc80e2ce96269ce85e78b9ebda989076dd5ff73e1eb275e5d7", "signature": "5fd1e5f9922a12f636b72a7d6217091f948a55bcb1826b8fcaf99d26416c7ab1351c10f4093ffd8a2af86914a0a98184ec7e06d2dee87fdc0f4a47f8c63cf501" }, { "secret_key": "db2228ffffa9d2534aef918fb85b821ad360e2d39dec5aeb2db0df02497f9416", "public_key": "6d0195777f8105ff523b79c59e3c3081fe89db6f87033f094fa5a940cef84bb4", "message": "fc07cd99040f13e5a84f94746d6bb868f752b448b62d99593ef29e43cc8245f0470f65552d643220f6719285e15c37a6d174aef76088ccda5f88685b52dae284c65b380da345a2e1af2ed76480d269cb934b4317620b792ebb39b2a678247d6d815f2a5cb9aa560e4bf6deba4c0a0ddc82d0e5a5a65acbc478e1ec6b064d7bb7388a73f6eda30b0b6b73dd8f879263ad1a0348671dcf211cb96ed08ed52f3317da68185d6bb2589dc11d755d47a3b6f6a0386a8594d9570b2e9b0d4b5e13dccd9bb7acbef0ab276a7aebe12931be67f10de267a029895301f5662530ad8ab3d230b3b6d7093acdfbf274757a9078e20c23bc822deffa61005486102c01ab82bdc8cdcf1bb37f9b56d39e50fd5a6895416e767f4e36c1a41778908125b5ca3f92a90da9addff155fb1fd7768808a80f203ed737ef007763bd2fea9ff28c84b43551c9fc438ffc47fcfcf64dc7700613aa8b3af8633ae8b6987437c0aa4781be1e821396c536cb3005d05549b1cba70135afb7fe3068961cad3a1463cc0b5560684e27bba77aef419d823868e0cebad1f1ce0ae902744a152dd29451a17e28a89a7158a1836efce4a3e5c7d1faa4c3875bc46c4d9be22d66d366ac6f59538a00b275b02fac6da755a854081997d5d1d0e6e568a5958cf334c518cd517ab9d73c48d6cbc4ae4eea4353113e7e4a7c05920e686bf07afbfb8dd2ec4f18fa7138e57d332cd7a4228fea73bc09252f24427294ebd3645ee0996c2e851a8aa51a7cd9fc2eab47c0ab213f4f51d216091ed089e4592e9bb0828b858f84f60b93ad84a0a22827cbd27414b781322a04d3960828f638df2834c7f7839d70db126bee5af2ee7559a8ac4c01a6c391396af93fa0608940297ddf8900c5ddb466340ae51c60c7ead762447e76d8bccb573997cf6614d188a0b9a2f56eed9b0f9d463a19787f4092581a65c6bf781b93c56087e54ee1343aab", "signed": "82189d340bc11ceaa400410e08bae9d901af059125e953786f8a043ddf11f7b2f8e3b617accd78e2939adfabf2d2471fafd6f5bc45b14075b328e34d8075b207fc07cd99040f13e5a84f94746d6bb868f752b448b62d99593ef29e43cc8245f0470f65552d643220f6719285e15c37a6d174aef76088ccda5f88685b52dae284c65b380da345a2e1af2ed76480d269cb934b4317620b792ebb39b2a678247d6d815f2a5cb9aa560e4bf6deba4c0a0ddc82d0e5a5a65acbc478e1ec6b064d7bb7388a73f6eda30b0b6b73dd8f879263ad1a0348671dcf211cb96ed08ed52f3317da68185d6bb2589dc11d755d47a3b6f6a0386a8594d9570b2e9b0d4b5e13dccd9bb7acbef0ab276a7aebe12931be67f10de267a029895301f5662530ad8ab3d230b3b6d7093acdfbf274757a9078e20c23bc822deffa61005486102c01ab82bdc8cdcf1bb37f9b56d39e50fd5a6895416e767f4e36c1a41778908125b5ca3f92a90da9addff155fb1fd7768808a80f203ed737ef007763bd2fea9ff28c84b43551c9fc438ffc47fcfcf64dc7700613aa8b3af8633ae8b6987437c0aa4781be1e821396c536cb3005d05549b1cba70135afb7fe3068961cad3a1463cc0b5560684e27bba77aef419d823868e0cebad1f1ce0ae902744a152dd29451a17e28a89a7158a1836efce4a3e5c7d1faa4c3875bc46c4d9be22d66d366ac6f59538a00b275b02fac6da755a854081997d5d1d0e6e568a5958cf334c518cd517ab9d73c48d6cbc4ae4eea4353113e7e4a7c05920e686bf07afbfb8dd2ec4f18fa7138e57d332cd7a4228fea73bc09252f24427294ebd3645ee0996c2e851a8aa51a7cd9fc2eab47c0ab213f4f51d216091ed089e4592e9bb0828b858f84f60b93ad84a0a22827cbd27414b781322a04d3960828f638df2834c7f7839d70db126bee5af2ee7559a8ac4c01a6c391396af93fa0608940297ddf8900c5ddb466340ae51c60c7ead762447e76d8bccb573997cf6614d188a0b9a2f56eed9b0f9d463a19787f4092581a65c6bf781b93c56087e54ee1343aab", "signature": "82189d340bc11ceaa400410e08bae9d901af059125e953786f8a043ddf11f7b2f8e3b617accd78e2939adfabf2d2471fafd6f5bc45b14075b328e34d8075b207" }, { "secret_key": "66b50f692e395eb83386e027c82ce3fdee3bd899b0d3179db086fbf524f57459", "public_key": "448536e982408437ce89674053e3c589c98c095c60021a118178c6261d8810fe", "message": "7428a964212bcbe8df7d59e48e923480aa0ee09b910d04efb6903662efc3107ac8fdc0c5f39272740cd877e16cd71c549238c337220ce2f6b5a1fc6f7b0a1cd4ed21d93889081e34fb7fdecf4178bbd431e611e539d900c3d0ac3dc7107b36b41d6d0d5d32c19727f908b6eb367febb352a493581ff128b56c4caf6fb8e09981f0d37957d1282017fbb807614c20f465dc02b0cd969983bd5ae1ebf6578d7ff3ceff320e25562199dee934757cc1f58d5540c41aac1ce4f211f0b8ec4107174030e702bc6a8a9c85c505c9316aefea3e4372242de019b35e2bd3c5a956521971c106a3adbbc13cdc4f7f9d3c58b96a344b4ac3ef6bd8aca6ed9876b43e6497faf7fa4cf27fbcb665730c091e13aaf7e9efe7dd10e14eb19a9200424210ec8b8fba7e69444ce1a9e3a7b26c11f6b7145b6983a7805776484031bff52e81ae769b70a282b094ffb5fb5525dc1a872e207e827a2e11f4ecf7b5308c748a9278ea7bd66188194400430c8cd596ebb87221e536f6afe1f1505d6a59f41d16a2f014e1cfa513f7a69731d7bfdb2affcefe0537d42c796e3fd27e41b7ca72051bef28bb7bde7010dcfed8aa16ef676db6e520c3cef8d6f58a9a2813cff0f7041f87fbfb8431e020ede1d4eaf19e23b983445c5915b54adfb557fc20d0058f40f5e09825dba8d8f20c00f43b3aeebb6157be32ec54627d5d42ab813cf97f095d26db8036c12e82cb963e8001167e61ab393b4cca755ecea869954e323fa5262c5fda3e0be9a51e5af51fa6444824fb837cc67be537a87569c30cf0114d39a03942de4e1cd523355dab1af36080a9a9a548be1c2a7fbe5433772315d283e5156df648bee4b7dcda74f15905d542be54873c15c53ff42acabf8c56f257d764722db4e9c718e12098a3457486a6c947ac2de0af53e82cf950bb37ca29c8dadfa3646db4982af572d39b268c7f96b03ef6b653c87945f29bc5", "signed": "bd13f6362c07078922f30c6330751bf6e7cf42a76916ee653eb17accff1fbbca35258c4cbc582a5e8cc94fd2c7edeb53762f1fc23123d7f4f145409b31cd38027428a964212bcbe8df7d59e48e923480aa0ee09b910d04efb6903662efc3107ac8fdc0c5f39272740cd877e16cd71c549238c337220ce2f6b5a1fc6f7b0a1cd4ed21d93889081e34fb7fdecf4178bbd431e611e539d900c3d0ac3dc7107b36b41d6d0d5d32c19727f908b6eb367febb352a493581ff128b56c4caf6fb8e09981f0d37957d1282017fbb807614c20f465dc02b0cd969983bd5ae1ebf6578d7ff3ceff320e25562199dee934757cc1f58d5540c41aac1ce4f211f0b8ec4107174030e702bc6a8a9c85c505c9316aefea3e4372242de019b35e2bd3c5a956521971c106a3adbbc13cdc4f7f9d3c58b96a344b4ac3ef6bd8aca6ed9876b43e6497faf7fa4cf27fbcb665730c091e13aaf7e9efe7dd10e14eb19a9200424210ec8b8fba7e69444ce1a9e3a7b26c11f6b7145b6983a7805776484031bff52e81ae769b70a282b094ffb5fb5525dc1a872e207e827a2e11f4ecf7b5308c748a9278ea7bd66188194400430c8cd596ebb87221e536f6afe1f1505d6a59f41d16a2f014e1cfa513f7a69731d7bfdb2affcefe0537d42c796e3fd27e41b7ca72051bef28bb7bde7010dcfed8aa16ef676db6e520c3cef8d6f58a9a2813cff0f7041f87fbfb8431e020ede1d4eaf19e23b983445c5915b54adfb557fc20d0058f40f5e09825dba8d8f20c00f43b3aeebb6157be32ec54627d5d42ab813cf97f095d26db8036c12e82cb963e8001167e61ab393b4cca755ecea869954e323fa5262c5fda3e0be9a51e5af51fa6444824fb837cc67be537a87569c30cf0114d39a03942de4e1cd523355dab1af36080a9a9a548be1c2a7fbe5433772315d283e5156df648bee4b7dcda74f15905d542be54873c15c53ff42acabf8c56f257d764722db4e9c718e12098a3457486a6c947ac2de0af53e82cf950bb37ca29c8dadfa3646db4982af572d39b268c7f96b03ef6b653c87945f29bc5", "signature": "bd13f6362c07078922f30c6330751bf6e7cf42a76916ee653eb17accff1fbbca35258c4cbc582a5e8cc94fd2c7edeb53762f1fc23123d7f4f145409b31cd3802" }, { "secret_key": "55328be4b370822733ff3989a6a3282d65fe8f207ab7270d7c2e727ca3cfaac4", "public_key": "518e02eef52f5aaebde3d108ea79ecadfc4d994ce1953621e54b7b3b121ff8ff", "message": "6c24c9afbbf12dcaee6f10e4089252f2c60b2ab93a02c1602fb5de4ce3bd923eb02fe1039fdc15996a446915e767dee0176dddb78e9d6bbf069675775a829dd808d376b0cf7920bf1a66e1303ba52419785f25f28bb33899ebde840c0ab14b919a6580cbaac3a805627b9c4a77baa16f825a9eac2d6d3641651493370e50eee94c74049764365605ab4dac1a030227a330aa178f2f8da377af73f0bb040bac12366e65e0591055f9f23eaca35e9688d837a3c0d99c168fd886acc922cf37a7118ef8a44bb0a4fa4288049309a7dc1bed80621e1063e3e592c0fba42d7398eb15f74028ac15d7ed65a6368a13b7f956d19547eb506ce7ec90734eb949cff1d98ce414f10adcba8c007320018750a71bd36d3b6bfd6127054508e3ef65d99848514d33d68b58e3a4b224f79b6e34dd480340467fe7f025cc88213d808fbb5b91e2e43cf9d950640798659273d47a25f1f0132f6882faadbafba28fee5fa17272c1a9001172b3ab6ff2c315f26c07734405b5ee8b5e4f08e1e3b8aea019467fb071887f191901a21c5976c1ca8aaf0a1d4a2e698e7623e9bbe9ca2a67a153a16f895e6dd9ea924441b4bd0b674552e398b8d970343a9bc776a3a3fc1a8660c5625d6081b5d87f0f8ac9f07ab5abe77cdb8e30d2fd1f6f46525c75dd0dd1ca3281cc89346fb3e6d7388ebee154cb59bd9e95ed6a41d5df668b59ea137868eb120b8a2cfdf4674414fd279699f28b5a5ccc2e2fc802a4c9e0b85b76f20f6bce2a4954886fc402670a71efd261f5dd7bca16884a287c622fd445f68d44151cc0134b229da38daaab81b5c960d57700ca92b26d0b142134ce94b7be6c18610ea2136f8ba8329a2e8c000b8f02fe05bcf72cb71f8c72535ffcd818e38e7992a8f0c32ac62177d1522ae552c60c1ee616b75e4b3442e79657e4a333c0b3d744eaf260d0c336931686a6d668c64fef440052352c2b258cfb65", "signed": "f58db19fd834e15194c3c0f8a6a50ebc4cf074e80ea2e70cdaf1e169bd51ebd0990bad77c4fa208b8dd1e2c8574c01b5f596c8dfa6bb8e6ae3a47ff412e7e2096c24c9afbbf12dcaee6f10e4089252f2c60b2ab93a02c1602fb5de4ce3bd923eb02fe1039fdc15996a446915e767dee0176dddb78e9d6bbf069675775a829dd808d376b0cf7920bf1a66e1303ba52419785f25f28bb33899ebde840c0ab14b919a6580cbaac3a805627b9c4a77baa16f825a9eac2d6d3641651493370e50eee94c74049764365605ab4dac1a030227a330aa178f2f8da377af73f0bb040bac12366e65e0591055f9f23eaca35e9688d837a3c0d99c168fd886acc922cf37a7118ef8a44bb0a4fa4288049309a7dc1bed80621e1063e3e592c0fba42d7398eb15f74028ac15d7ed65a6368a13b7f956d19547eb506ce7ec90734eb949cff1d98ce414f10adcba8c007320018750a71bd36d3b6bfd6127054508e3ef65d99848514d33d68b58e3a4b224f79b6e34dd480340467fe7f025cc88213d808fbb5b91e2e43cf9d950640798659273d47a25f1f0132f6882faadbafba28fee5fa17272c1a9001172b3ab6ff2c315f26c07734405b5ee8b5e4f08e1e3b8aea019467fb071887f191901a21c5976c1ca8aaf0a1d4a2e698e7623e9bbe9ca2a67a153a16f895e6dd9ea924441b4bd0b674552e398b8d970343a9bc776a3a3fc1a8660c5625d6081b5d87f0f8ac9f07ab5abe77cdb8e30d2fd1f6f46525c75dd0dd1ca3281cc89346fb3e6d7388ebee154cb59bd9e95ed6a41d5df668b59ea137868eb120b8a2cfdf4674414fd279699f28b5a5ccc2e2fc802a4c9e0b85b76f20f6bce2a4954886fc402670a71efd261f5dd7bca16884a287c622fd445f68d44151cc0134b229da38daaab81b5c960d57700ca92b26d0b142134ce94b7be6c18610ea2136f8ba8329a2e8c000b8f02fe05bcf72cb71f8c72535ffcd818e38e7992a8f0c32ac62177d1522ae552c60c1ee616b75e4b3442e79657e4a333c0b3d744eaf260d0c336931686a6d668c64fef440052352c2b258cfb65", "signature": "f58db19fd834e15194c3c0f8a6a50ebc4cf074e80ea2e70cdaf1e169bd51ebd0990bad77c4fa208b8dd1e2c8574c01b5f596c8dfa6bb8e6ae3a47ff412e7e209" }, { "secret_key": "7da05f04e5d38b989b83f72f7ab26c138776758f4f577e49dc73d6013ff43759", "public_key": "b1de5167f4d330804eec9eb565ef4055f1b64dd95e1c9b27c67ffef91482cca8", "message": "a6a861d8947c5cd6ad0819602e32ea7681c8f73010eee553e5defbf7982098b5f7b39924bb7959ad64c30326bed560bf51e9983cda5dff4f311eea24cbe68c6106ceac9b843aa4e2ad1b6f8ae1e4f96871fc025be4a616385ff2d4b7f56829abefaf6aacbb780d6cbbc951b6e05a787f885e3325611665ecc924274aa531bc133f62c76cb3ad148f3c9579a815a14200b7648dae0b07b327d3bfccdb6fe3b6cbd70ea65e6c0cc2516a896696d07b2e77713b0bee3b92fb1b6f75b0820a5cb62c5fe6204003943e24857166fbdf571f115d45f42e75901df8b12c32618aacb0d24286c8d30396051fc272aa17f4d2d47461152aacd3faa2b7b208312278e809240592d1d1aa585c56280e66ffd92b5717d0cd1eb9fb7401def879487c374e5c530b6febf911122574d24fe104b4f45c7c601e6c917d3c1882c1ad3c555d8f2ce955b5a10db0d5a8b8ac7a6266b2e6b27ad0ee34f47ad857367d52f7096d4bacef0e46725488424b93b89acd429ffb5ef33a0b081dd09479679196023c3967f44ad41eb1a2395527fd3b79768f1b885f0429b495ab60525691be84650632a2f66cb63ad5bf2f6ae70b668c5a193f7499fc4fc42cf8cb308ce5029a5027babef55d1925ecfba9f27eb6081619ed0df8569fd80e9da104db39b5b8140bfebebd29085440065819deba8d469ae8b3ea6d3bac5891f9a4ddfb7f1f06d13c31a07ee53fb54bc97bd08696394c38e7f3680c0f02f975f469921147a409859097813b4c3fa43d174ac402f1a528cb5fc4b807518432eff33407a111ca3a3d7e9e84135abac8a8f52ea631c86d74a1c6e5749edd1491c0024e7de7fe52856829b72fd13da63a1a2343349df662ab3163536032346e5347f043fff528bf67150922fff2026bab742db9cae7cb2e3c74580719652c28447c5e2098231797ee6ef1231f5792054bc3359a32c86d2f94f85fa7d4a7419dd241ff662a", "signed": "05f117f9bc3ea55d455e9ef135e92e7665d18070d8f5e375df67be1817ce14357a55e70166f326b77d85243227cf67d8f2e0bf8440cabfb05275b373f1e1190ea6a861d8947c5cd6ad0819602e32ea7681c8f73010eee553e5defbf7982098b5f7b39924bb7959ad64c30326bed560bf51e9983cda5dff4f311eea24cbe68c6106ceac9b843aa4e2ad1b6f8ae1e4f96871fc025be4a616385ff2d4b7f56829abefaf6aacbb780d6cbbc951b6e05a787f885e3325611665ecc924274aa531bc133f62c76cb3ad148f3c9579a815a14200b7648dae0b07b327d3bfccdb6fe3b6cbd70ea65e6c0cc2516a896696d07b2e77713b0bee3b92fb1b6f75b0820a5cb62c5fe6204003943e24857166fbdf571f115d45f42e75901df8b12c32618aacb0d24286c8d30396051fc272aa17f4d2d47461152aacd3faa2b7b208312278e809240592d1d1aa585c56280e66ffd92b5717d0cd1eb9fb7401def879487c374e5c530b6febf911122574d24fe104b4f45c7c601e6c917d3c1882c1ad3c555d8f2ce955b5a10db0d5a8b8ac7a6266b2e6b27ad0ee34f47ad857367d52f7096d4bacef0e46725488424b93b89acd429ffb5ef33a0b081dd09479679196023c3967f44ad41eb1a2395527fd3b79768f1b885f0429b495ab60525691be84650632a2f66cb63ad5bf2f6ae70b668c5a193f7499fc4fc42cf8cb308ce5029a5027babef55d1925ecfba9f27eb6081619ed0df8569fd80e9da104db39b5b8140bfebebd29085440065819deba8d469ae8b3ea6d3bac5891f9a4ddfb7f1f06d13c31a07ee53fb54bc97bd08696394c38e7f3680c0f02f975f469921147a409859097813b4c3fa43d174ac402f1a528cb5fc4b807518432eff33407a111ca3a3d7e9e84135abac8a8f52ea631c86d74a1c6e5749edd1491c0024e7de7fe52856829b72fd13da63a1a2343349df662ab3163536032346e5347f043fff528bf67150922fff2026bab742db9cae7cb2e3c74580719652c28447c5e2098231797ee6ef1231f5792054bc3359a32c86d2f94f85fa7d4a7419dd241ff662a", "signature": "05f117f9bc3ea55d455e9ef135e92e7665d18070d8f5e375df67be1817ce14357a55e70166f326b77d85243227cf67d8f2e0bf8440cabfb05275b373f1e1190e" }, { "secret_key": "1b8ec65880edbf039a13e970b15aa67e192aa02ca65cff9ada17d4558f40137d", "public_key": "12c1191e4de3bd44d039070153adb7b581f600e9a1dd69aa89f277c7069e76f8", "message": "37f18b7f64c5133479d6dae3bef679cdc21ece3f5b579a6a9c3fa2e59e9be87d2009f74e1cfdaccb1ce37d00702369bd169d94fdcf85af9fa3217d27e6ed6d1d8e5df7615e8e37ea55de1fd0b06d77b4c83b929d80586fa0694be72ec8b365ad2cbcdd2b1ad8cf7f036dfa4daa1a9036cdb120432227b1f07b8866b122120309eb914ab84cddeba1dec48ab92636728588fedb3aaad7e7dbb2ac30e63c6f5f90fc6ce62d6d3bd88b0d5aacfa61de9f3267b300917b57a48036ab20c9a05446b8767494af249e7de7bc507a2207cc956f7184555a7d5d8883bb4b3e93f2dcfc57b0da8638658dcdce885d44d9cc68b1d8170a3677cc5e50cbf33d543ebae4477d9239cf83384ec59b4233e8ff3343f06f301877729a53d420bf01c62e66ab7fe55dd87ee823a58fcb87870e1f52e879177cd439c533f5a223e5a3436fe9d6426548dacfc86a0846d3ed23ac042563e887ff46aad005f4e1dee3ee0ee4c27a7251709ae40abc5e256864e4785a4edd8b2adf1bc5b4018e28d0b175867b02d052a6e17e411a3d8beb2a4208b76cc621fd18be148e235d55aa7127706557dec053a13f1a47dfda405b3fe5bd28ef5d348619f51e595ef5055f839efaf110e4901631ac31a02f4f7ee424a3a2c3e00d2602d2cc1e492906eea420a9268238ac6622a08974e5730292e6ed510256efde667e0d9a0ff2213f54120ccd81ffaa6b7cc48141a2b729852af583d26aa51fbde67be4df14e520c2257a73c5c2e3c3d87dfb25361175fd18abd7e99aa09b85f88f19c8d82d45858f3144c5dfb7a49ede45b4efd8710592a3720636e7e889c7e22ad13b2d44bb7e2b47b2963a5fa3f2557b85bc0c693de3d22ef9464f7b814a20a4676ad26fcaa03544c6aad41283095fcd1210aa8cc029ff5a26005a891226c298e94a52aa7133913ec9d22a5b2ac0bc6f15b251d0b93889213cd1b1e5c6fd08f1a8f5cbd4215329a3", "signed": "bff269a35d6c8e552ce716d1638181ce8583b45c0ec593b4e58c40ac76e7f85ca1dafffd68541e623a1e35a7c0972688b25eed72f4da57eca16857a8263caa0b37f18b7f64c5133479d6dae3bef679cdc21ece3f5b579a6a9c3fa2e59e9be87d2009f74e1cfdaccb1ce37d00702369bd169d94fdcf85af9fa3217d27e6ed6d1d8e5df7615e8e37ea55de1fd0b06d77b4c83b929d80586fa0694be72ec8b365ad2cbcdd2b1ad8cf7f036dfa4daa1a9036cdb120432227b1f07b8866b122120309eb914ab84cddeba1dec48ab92636728588fedb3aaad7e7dbb2ac30e63c6f5f90fc6ce62d6d3bd88b0d5aacfa61de9f3267b300917b57a48036ab20c9a05446b8767494af249e7de7bc507a2207cc956f7184555a7d5d8883bb4b3e93f2dcfc57b0da8638658dcdce885d44d9cc68b1d8170a3677cc5e50cbf33d543ebae4477d9239cf83384ec59b4233e8ff3343f06f301877729a53d420bf01c62e66ab7fe55dd87ee823a58fcb87870e1f52e879177cd439c533f5a223e5a3436fe9d6426548dacfc86a0846d3ed23ac042563e887ff46aad005f4e1dee3ee0ee4c27a7251709ae40abc5e256864e4785a4edd8b2adf1bc5b4018e28d0b175867b02d052a6e17e411a3d8beb2a4208b76cc621fd18be148e235d55aa7127706557dec053a13f1a47dfda405b3fe5bd28ef5d348619f51e595ef5055f839efaf110e4901631ac31a02f4f7ee424a3a2c3e00d2602d2cc1e492906eea420a9268238ac6622a08974e5730292e6ed510256efde667e0d9a0ff2213f54120ccd81ffaa6b7cc48141a2b729852af583d26aa51fbde67be4df14e520c2257a73c5c2e3c3d87dfb25361175fd18abd7e99aa09b85f88f19c8d82d45858f3144c5dfb7a49ede45b4efd8710592a3720636e7e889c7e22ad13b2d44bb7e2b47b2963a5fa3f2557b85bc0c693de3d22ef9464f7b814a20a4676ad26fcaa03544c6aad41283095fcd1210aa8cc029ff5a26005a891226c298e94a52aa7133913ec9d22a5b2ac0bc6f15b251d0b93889213cd1b1e5c6fd08f1a8f5cbd4215329a3", "signature": "bff269a35d6c8e552ce716d1638181ce8583b45c0ec593b4e58c40ac76e7f85ca1dafffd68541e623a1e35a7c0972688b25eed72f4da57eca16857a8263caa0b" }, { "secret_key": "e75388026a6a6d6c6d199e362993a5b1044901e18a76c2fac7261a6d1c19a4f3", "public_key": "b9ce14251c0cdf3bddb206dc6b8b2b7f5b7e4dd1be2ce1863ff18806ae00f1ee", "message": "b99cdc847211c06642dd111bc5e0beca53a74ffba2e3ac93afb4b0947518e8323527330a4efefbe4bafa00bafecb434ab1e5b7ce65656f7a4fd856aa6c385ed8d7bd6285580d7dd60882e69c19da076909d647de095a80e98ad89b814aadcbbf6f033c49202f656c0910503959cf97cd0fa82d5f6d22fba3389951294c4f7cdc21eb8244bd6560637a5eca62a8eba1f4a933d187a75f86711643af358831c8c16a9a0f09e253b2395e9cb371611eecdd66b4ab521aa94b3f20237eae41cd10c5e21a452d48e748187f354a67adf681b0fe61cdaec94a5eaf01269fceb570d514ff3c55ff1dba2fd2df17f86a8aeb747838113dee94a43b1384cbe133cdf6427e8d122e4e933704da6e26cfcee97fe3f629b60b91b2dd863867fa79801e2b916ec4c0fb62e07159421e657974307a1d02f7f2ed4724a8b521a861f55f35521e8b2e1a84904c428cfc5b6014bb0f8ba8434c2209bd40aca31130db97743333597d2351d5f6811741f62688973bd773d30266fd1efbd89d47a964f9d01997153d087d92696616dd103a934ccbac4c1d142f2075d4e22c3da4a0e973b23863196287b79174fa29755fc6d9b5e100ace0a45975e503b254d3f195c261710910fef106892c08bb296d230cdea9f5a11f91acaa6e7c05e92c281d2b3155fe4480b0aa5e0db41d10e05cfdefa4364051cb755dc72ffa978c00b94a5f212dc691f839b49de97e0139d65e8d73b2b289b26a12c6ccd8edc04adb452af7ff094aa901eaf57651eb1b87b833d0a09b4a4a6462f40664623769e95079f3c962850cc3b401bb0058b8475b10c862f32f300a2b143b3dea269ddcbea7be7dd2426d0d4204eb66a39f1318822dcb9c561398637f4ab8de196768ace74f348c012dd1babec17f5300ffe0d7aaaeafef7db650a8f2f309a9793f52c685c7e1d5133274915784899c481d485c9bd30e99fcdc97d96ef07487da663befe68299df", "signed": "6d0f83d9c55d84bcf9a86147d9b6ba9ad537832fd0f99dae7e72c8139afcb30c7b24f6b292e32f9847097551b7fbfd510c84e89be98254441457bd08e5f05302b99cdc847211c06642dd111bc5e0beca53a74ffba2e3ac93afb4b0947518e8323527330a4efefbe4bafa00bafecb434ab1e5b7ce65656f7a4fd856aa6c385ed8d7bd6285580d7dd60882e69c19da076909d647de095a80e98ad89b814aadcbbf6f033c49202f656c0910503959cf97cd0fa82d5f6d22fba3389951294c4f7cdc21eb8244bd6560637a5eca62a8eba1f4a933d187a75f86711643af358831c8c16a9a0f09e253b2395e9cb371611eecdd66b4ab521aa94b3f20237eae41cd10c5e21a452d48e748187f354a67adf681b0fe61cdaec94a5eaf01269fceb570d514ff3c55ff1dba2fd2df17f86a8aeb747838113dee94a43b1384cbe133cdf6427e8d122e4e933704da6e26cfcee97fe3f629b60b91b2dd863867fa79801e2b916ec4c0fb62e07159421e657974307a1d02f7f2ed4724a8b521a861f55f35521e8b2e1a84904c428cfc5b6014bb0f8ba8434c2209bd40aca31130db97743333597d2351d5f6811741f62688973bd773d30266fd1efbd89d47a964f9d01997153d087d92696616dd103a934ccbac4c1d142f2075d4e22c3da4a0e973b23863196287b79174fa29755fc6d9b5e100ace0a45975e503b254d3f195c261710910fef106892c08bb296d230cdea9f5a11f91acaa6e7c05e92c281d2b3155fe4480b0aa5e0db41d10e05cfdefa4364051cb755dc72ffa978c00b94a5f212dc691f839b49de97e0139d65e8d73b2b289b26a12c6ccd8edc04adb452af7ff094aa901eaf57651eb1b87b833d0a09b4a4a6462f40664623769e95079f3c962850cc3b401bb0058b8475b10c862f32f300a2b143b3dea269ddcbea7be7dd2426d0d4204eb66a39f1318822dcb9c561398637f4ab8de196768ace74f348c012dd1babec17f5300ffe0d7aaaeafef7db650a8f2f309a9793f52c685c7e1d5133274915784899c481d485c9bd30e99fcdc97d96ef07487da663befe68299df", "signature": "6d0f83d9c55d84bcf9a86147d9b6ba9ad537832fd0f99dae7e72c8139afcb30c7b24f6b292e32f9847097551b7fbfd510c84e89be98254441457bd08e5f05302" }, { "secret_key": "5b323fc01a16c45d1064667d2ea4a7ea59d20342562d12fbc598d5aa7300688e", "public_key": "d4141b455d301642bada2814afcb1620d5eb56d92b1185fe5dadef559625fa71", "message": "ad24669ef55c540a8ed162ce1d28f01760a60719a0377336eb00b1ecbe6f61601cd564f92c956804f9bed4e1476b94e5ea8cca80cb49a304ef851f7f675abe58e6681dc012ad55e51b021d9828569d0bcc9e0527a3fc03c891d17a90e6337a1ea67f2f08810587693837081e4c08a3d72c536c2140da200ba456c376f61d05651f0c5f395711f41c0d6eae98c906764d1ebef3f9046cb7c8622640fcafafbfb8f62e1cd32c66ee1c55509489a538ab612999e7997b779c6422eff109da4df82920930d8d363d7830908795a3888f25d667e14d155ed44581be430f7973b574e2bc0b134cf139fb4bb01dbda41b67b98147d8012f40677f4b80ce4a534c90adeabf484b21fa994b7a175f8a8b8a4075564478ddb05024580bab038cd9eaa1dfda552fb31229429b614fa1d80c52614e84faa2217f260ff7ccea8c7b06e3d77ff874eb81fc8597e5fcdcec951b5fe64a1af86e73193a882469eb3ba3c382734b2887b419316ea448afc282478c25f7bca18429cbbffd8871177c5ecc7d8aa9a1b9ec87192d29a52539c081c3593332444cbe66872cf3d0e197292b82b0be5fcd858cd6ca48b53ee5b61641bcaaf31d819c7e1cedaf9ee6b07e09caedfb30b9204a1d4ddb70560cbe1eb0c0ec43f1d178201b290819fcdc92c63e0db60fb87dff00e512648c8958a847efc36346073f1a4f1f2317060f1c543e6f01b42485beeb56cab3bab26e6a0ca6935802c762b799159e320f36b5e83d4aca8962aa2c3c2b7a3870e9e04731f3948cf941e21d50964e5d635a35a53e299811b8cadfcb4416c57598a3fd05410910dbc0ea2c78fdb92574997d58796279eaaa78b36dcef1c9a129eeff82399a26d008ffa3bf0418ff7d39b6427f341895024d16e22a0c62a82beba2e2bac23dee18cfcd5db2397f378c5367309082c44eb43cedc15220253a62320399665f71349cc1b944f58c73a10a0bbfd4caf12891e3", "signed": "e2eff607f0227a29d582d69f3458acadd3226fceaac0abbdaed52675c51630073cd3a901707ecf05e893f2c36daaf0cc4901116946b5770dc038125f6d131b09ad24669ef55c540a8ed162ce1d28f01760a60719a0377336eb00b1ecbe6f61601cd564f92c956804f9bed4e1476b94e5ea8cca80cb49a304ef851f7f675abe58e6681dc012ad55e51b021d9828569d0bcc9e0527a3fc03c891d17a90e6337a1ea67f2f08810587693837081e4c08a3d72c536c2140da200ba456c376f61d05651f0c5f395711f41c0d6eae98c906764d1ebef3f9046cb7c8622640fcafafbfb8f62e1cd32c66ee1c55509489a538ab612999e7997b779c6422eff109da4df82920930d8d363d7830908795a3888f25d667e14d155ed44581be430f7973b574e2bc0b134cf139fb4bb01dbda41b67b98147d8012f40677f4b80ce4a534c90adeabf484b21fa994b7a175f8a8b8a4075564478ddb05024580bab038cd9eaa1dfda552fb31229429b614fa1d80c52614e84faa2217f260ff7ccea8c7b06e3d77ff874eb81fc8597e5fcdcec951b5fe64a1af86e73193a882469eb3ba3c382734b2887b419316ea448afc282478c25f7bca18429cbbffd8871177c5ecc7d8aa9a1b9ec87192d29a52539c081c3593332444cbe66872cf3d0e197292b82b0be5fcd858cd6ca48b53ee5b61641bcaaf31d819c7e1cedaf9ee6b07e09caedfb30b9204a1d4ddb70560cbe1eb0c0ec43f1d178201b290819fcdc92c63e0db60fb87dff00e512648c8958a847efc36346073f1a4f1f2317060f1c543e6f01b42485beeb56cab3bab26e6a0ca6935802c762b799159e320f36b5e83d4aca8962aa2c3c2b7a3870e9e04731f3948cf941e21d50964e5d635a35a53e299811b8cadfcb4416c57598a3fd05410910dbc0ea2c78fdb92574997d58796279eaaa78b36dcef1c9a129eeff82399a26d008ffa3bf0418ff7d39b6427f341895024d16e22a0c62a82beba2e2bac23dee18cfcd5db2397f378c5367309082c44eb43cedc15220253a62320399665f71349cc1b944f58c73a10a0bbfd4caf12891e3", "signature": "e2eff607f0227a29d582d69f3458acadd3226fceaac0abbdaed52675c51630073cd3a901707ecf05e893f2c36daaf0cc4901116946b5770dc038125f6d131b09" }, { "secret_key": "be1c112f78cf13aefc5ce7e33764aca4481f9f88b018e122db9f8dac14624605", "public_key": "ae389936bbf6d16e3c1eeb6474298970866e12ec9c1d6aea2fd9db6b56aa59c4", "message": "d77f9aeea0fe98ed7fb74d582a402bcb7931474b4a95d523f3fb769fb7097d2be4c6ec1052140163222553aa8f4f89e421730014ec73469720cea967f88b6a48d02a2ddc1a121fdffb8ae127738e293c4d6b1b74ad03844de6bfe821506b3a7a81d19c37a7f01ca481471219efe2a7b92c4bd2ac07743b4975696441714b84d63c549d7a6fb61f16fbcdb72b914d7882d091f9706da38c1a81a1c6a40fbec0d8e238b5d56d460e909f85479f7ad8b119f35455e34010caa7e5d01f38e301ad37e8005f6ed29e4a102db3f61d84093f78c49a9648c977bf4d5b689f71f406f8ad7b9aeb1ae22133a84ce1b278b2cdde465901b23a179d072a80879d0a24d2af197b322a07bf5d40eeab3af12117f13021dfc1681aba5c083f2596e37f1123422bbdca3b2c32cb594f56c325e0c564a1733288053459c62488925cd80e7c944db998c3c7be546bf89d7a511ccdba4b809eee0fc2873dad72b4cf3ba051289bb3f4e9925732e45ae7741058c8fd11599dd843927e3d14598bb83052d33569cfb02af0c88fa7aea4bb46841cd2ddbdf5988fcf325ff104a5dfc4a30d269d2a949730c3613bddd3673b42f6090e6a60e4a253062463a65d7e7fc0030bba769ca344bfa9ac823f58cb5cee8a5fc0ca37228de5a4d93e0ecf7f10821659a2261f7ef1596eda4e411cf3c9669d81de74547ce4bf833eb432f385ce9038fe848a8c96da7f01fd95bea06d1d747c8ae736495bba2285be5c32afea449520cfe8e1ce25f9077ed0ec0f6598a9b8f7386f15358170ccefc3d5ffb009288154de877c2409ae5fd8fef0093f1c36b3a8f547432cd0f62c4033242ad9921a8f11c00f366da9396930a80c997df429a4f5f4e45c7a6d7e02af033186757c73cbe64d2d4e78eaafe27539528035f2cfcf8eaf0a42bd25f88b2fc69e42668fae6677c9ac9091d9d15a41f3ace65d90a0229873dcf254256cca449ed4c17d5435bae4", "signed": "f5fc5acb17e9957ea304f123b650e144c9e4377283509d431da6a2bbd527beb382c9f58745a3e56dcc655bd2ebb7aeefc93edc3f20d8d3c37923031eec0cb407d77f9aeea0fe98ed7fb74d582a402bcb7931474b4a95d523f3fb769fb7097d2be4c6ec1052140163222553aa8f4f89e421730014ec73469720cea967f88b6a48d02a2ddc1a121fdffb8ae127738e293c4d6b1b74ad03844de6bfe821506b3a7a81d19c37a7f01ca481471219efe2a7b92c4bd2ac07743b4975696441714b84d63c549d7a6fb61f16fbcdb72b914d7882d091f9706da38c1a81a1c6a40fbec0d8e238b5d56d460e909f85479f7ad8b119f35455e34010caa7e5d01f38e301ad37e8005f6ed29e4a102db3f61d84093f78c49a9648c977bf4d5b689f71f406f8ad7b9aeb1ae22133a84ce1b278b2cdde465901b23a179d072a80879d0a24d2af197b322a07bf5d40eeab3af12117f13021dfc1681aba5c083f2596e37f1123422bbdca3b2c32cb594f56c325e0c564a1733288053459c62488925cd80e7c944db998c3c7be546bf89d7a511ccdba4b809eee0fc2873dad72b4cf3ba051289bb3f4e9925732e45ae7741058c8fd11599dd843927e3d14598bb83052d33569cfb02af0c88fa7aea4bb46841cd2ddbdf5988fcf325ff104a5dfc4a30d269d2a949730c3613bddd3673b42f6090e6a60e4a253062463a65d7e7fc0030bba769ca344bfa9ac823f58cb5cee8a5fc0ca37228de5a4d93e0ecf7f10821659a2261f7ef1596eda4e411cf3c9669d81de74547ce4bf833eb432f385ce9038fe848a8c96da7f01fd95bea06d1d747c8ae736495bba2285be5c32afea449520cfe8e1ce25f9077ed0ec0f6598a9b8f7386f15358170ccefc3d5ffb009288154de877c2409ae5fd8fef0093f1c36b3a8f547432cd0f62c4033242ad9921a8f11c00f366da9396930a80c997df429a4f5f4e45c7a6d7e02af033186757c73cbe64d2d4e78eaafe27539528035f2cfcf8eaf0a42bd25f88b2fc69e42668fae6677c9ac9091d9d15a41f3ace65d90a0229873dcf254256cca449ed4c17d5435bae4", "signature": "f5fc5acb17e9957ea304f123b650e144c9e4377283509d431da6a2bbd527beb382c9f58745a3e56dcc655bd2ebb7aeefc93edc3f20d8d3c37923031eec0cb407" }, { "secret_key": "bd8523eda899b984230e328875b9672edc9fcd24ea5cc12d7b572da4be01fb7b", "public_key": "02b734ebbe88c13bfa95a5d964fc7ef9d395bd6303f065dc4ee17b3ac1548b7b", "message": "16c216c9be9f0d4b115410bdfd1593c8e262221ab97a2a395a12198f95c30205b08962d4893118ba9ff99ab1c7a6e1f2f175191070ac945327ad6c470babf7928b07dd788c85b64b712e0aae6c0ea20281e42fd561e83e3fbac67f14000ee56d981d2a2f0b9ca00a9ea47ca2f6fc8dca1035fceb142c3f26f20e3c732207ffff11b79695bdafa415214a4499302326605cf0b8c82f2b11392ecc90cd74a7b411b6d907a3d5c130c879b7cf880f22bbd7f0e95933718e96d7d16caea9f2c39e89b13cd52266273604a96b51d6e34f706735ddd9fca44d09cd86bb7217600e0d34d416ac249f2e41bd0f4abcbd2580adae21d7eba5fa44f39d780f17eb85ccbef58fef903a280d95f8f3210789fa12e120e21b6e8cad917835bbdcc3b07e84693954e23a94f99f937ddb0d4a18d42c3ea8fca7d1ea6ed53a00246f99ea520e6405bd2aa549b06e7da722c1ba74aa1c136e8ea58baaf8d37658693f3e0b44f631dd6d08ffdf4f09189d3035a3f03468e29696ef05e02cc1aabfecbda2301b540cb0eb0a75bcce73db9273a9161a98ad898fcd6579fb7e4b3279544f2e0bd774dd1a8157daa88a70321167703c60a608a4b54216590375e597fe21aea97b52185d0e37a53b6388a707a2bc24acf94425f84f3d56bc9f7ee7412a9e1833ad55b7eae6da581698166383a2eba8b6f53920f517a5c80bd3e03faad4087e3ee8fec9a79a01c779512133d7b6e5f1dec766300dc405cc21a8c583fb73bc90cf24385b086049d3bf20c300983c0b351538dccb227a14fafd23ac4b26be81a2b120cf216fc58354f9dcbf05f66339ad6ddc2cac14677b90e247ebb6c5c229007dc60f374a06d404eb23eb1ec49907c6e881629e1867268ca6fffa59aa3ca8f6c295162b9536c2be22bbe3b72380ef11b61b357a6253100e30a586818ba003fa3ffd1fc919881c05022f94848598f217fea222507220d108a28fc7bc39a8a11c", "signed": "fcfcdb088dcbd0a51bd301e3e1561671935d8b6f719c5d92690640d3c91e775bf4054132efc05a2122fc209db3c3343233ff8aecebd52daa2b3b21eeb15fd10216c216c9be9f0d4b115410bdfd1593c8e262221ab97a2a395a12198f95c30205b08962d4893118ba9ff99ab1c7a6e1f2f175191070ac945327ad6c470babf7928b07dd788c85b64b712e0aae6c0ea20281e42fd561e83e3fbac67f14000ee56d981d2a2f0b9ca00a9ea47ca2f6fc8dca1035fceb142c3f26f20e3c732207ffff11b79695bdafa415214a4499302326605cf0b8c82f2b11392ecc90cd74a7b411b6d907a3d5c130c879b7cf880f22bbd7f0e95933718e96d7d16caea9f2c39e89b13cd52266273604a96b51d6e34f706735ddd9fca44d09cd86bb7217600e0d34d416ac249f2e41bd0f4abcbd2580adae21d7eba5fa44f39d780f17eb85ccbef58fef903a280d95f8f3210789fa12e120e21b6e8cad917835bbdcc3b07e84693954e23a94f99f937ddb0d4a18d42c3ea8fca7d1ea6ed53a00246f99ea520e6405bd2aa549b06e7da722c1ba74aa1c136e8ea58baaf8d37658693f3e0b44f631dd6d08ffdf4f09189d3035a3f03468e29696ef05e02cc1aabfecbda2301b540cb0eb0a75bcce73db9273a9161a98ad898fcd6579fb7e4b3279544f2e0bd774dd1a8157daa88a70321167703c60a608a4b54216590375e597fe21aea97b52185d0e37a53b6388a707a2bc24acf94425f84f3d56bc9f7ee7412a9e1833ad55b7eae6da581698166383a2eba8b6f53920f517a5c80bd3e03faad4087e3ee8fec9a79a01c779512133d7b6e5f1dec766300dc405cc21a8c583fb73bc90cf24385b086049d3bf20c300983c0b351538dccb227a14fafd23ac4b26be81a2b120cf216fc58354f9dcbf05f66339ad6ddc2cac14677b90e247ebb6c5c229007dc60f374a06d404eb23eb1ec49907c6e881629e1867268ca6fffa59aa3ca8f6c295162b9536c2be22bbe3b72380ef11b61b357a6253100e30a586818ba003fa3ffd1fc919881c05022f94848598f217fea222507220d108a28fc7bc39a8a11c", "signature": "fcfcdb088dcbd0a51bd301e3e1561671935d8b6f719c5d92690640d3c91e775bf4054132efc05a2122fc209db3c3343233ff8aecebd52daa2b3b21eeb15fd102" }, { "secret_key": "33a85ae150bbf552f41663b21521c296d246dd6cf8195df851c695bd15f4a502", "public_key": "c8c9c42521008d5efff576c7e4a56083ced9a928da6fd5cf93fda572a5a2d0c0", "message": "937e05f2f1fdbd41731553e77cf181b5079758940aee8e92623fb1d5f07128b7d7f17e4842707a562c45ba69264c0f730a821c7db6bf82990dc651269b296c335179113053d6f85bb096b2911165fa3900cb102416487ba8078679c6b336dff38763c08dcd20fa66dda45c575df150d851165a4804973830f436df60b81319f9cfb564c0652896ed5f1849cb3354f50f0012f286e8a30c213528693474004e8504012b945560c074a6a163432cf4ac4ba7175cf26005db7199ee96d893cd1aad3fdf5d57460ef02dda6d3a140825196f3f8e2f37da36b6fdad184f2740f116de758a92917030c5fb80f0262496d2df93c7e276f25da7dbed8eb8dd4c563aba55b82af6ba3a70ca5f858b44a033cfb795604ddee746e7c8ae79d272fb9a2341a2a202df5eac08de75ad80c6580d92b169f2e1318857b1b1421c30f3dd461093de2d345ede7404b72a450de07b16eee68ce62887b6eaa436eee684be75ce0e1f96263e8d8736f9ba000d88e9e5860f328ae1e2dc73099d32fceb1bd2c0123698a49bead190a00ec9a6f87133eddd45316f65eb0d329b07b9a66bb9fe42588bf7b8d06efec1986b82a081ed3f6802e9be73464784559a4f2c097ba14b0bfd5d7e0aff65cb69abd03f8616cd7edf7ec368219edcf893e9ee71dad9f18d79e568265ddc6716223213235bb928e908dea827784cd1af396d590c81f4eacdfcf89c5cac96fa050064a22841ea715f8c89d6d5afbf597a4d005dbc6b13856d335b42a9a82edcb949835cca20b0a23de51cc3aec35566eff0c5ae1ab3751320d2c310495238eda383c38a4163152b8815690b8ff015035d1d00ea4a0d6caf324bb71a664a1bed31480784a68f438caa359e8d2673c857d4b8c0b6c695847b86800ea3d734b5ecc4d52b507ac69b3a6778916016ebc2315f44c90bf0c3e7dae01d49cbc303402bbc634ae1191f3f6fd63d303b0c0be033a47b90f8d3a77f0a44", "signed": "bbe4cd63676e26d675a191151d30db72b5b84d461eec6564af867ab41bae9931147885519ec9d7e6c818743c8ef6d5167b35b421363c09b357367fe8de443a06937e05f2f1fdbd41731553e77cf181b5079758940aee8e92623fb1d5f07128b7d7f17e4842707a562c45ba69264c0f730a821c7db6bf82990dc651269b296c335179113053d6f85bb096b2911165fa3900cb102416487ba8078679c6b336dff38763c08dcd20fa66dda45c575df150d851165a4804973830f436df60b81319f9cfb564c0652896ed5f1849cb3354f50f0012f286e8a30c213528693474004e8504012b945560c074a6a163432cf4ac4ba7175cf26005db7199ee96d893cd1aad3fdf5d57460ef02dda6d3a140825196f3f8e2f37da36b6fdad184f2740f116de758a92917030c5fb80f0262496d2df93c7e276f25da7dbed8eb8dd4c563aba55b82af6ba3a70ca5f858b44a033cfb795604ddee746e7c8ae79d272fb9a2341a2a202df5eac08de75ad80c6580d92b169f2e1318857b1b1421c30f3dd461093de2d345ede7404b72a450de07b16eee68ce62887b6eaa436eee684be75ce0e1f96263e8d8736f9ba000d88e9e5860f328ae1e2dc73099d32fceb1bd2c0123698a49bead190a00ec9a6f87133eddd45316f65eb0d329b07b9a66bb9fe42588bf7b8d06efec1986b82a081ed3f6802e9be73464784559a4f2c097ba14b0bfd5d7e0aff65cb69abd03f8616cd7edf7ec368219edcf893e9ee71dad9f18d79e568265ddc6716223213235bb928e908dea827784cd1af396d590c81f4eacdfcf89c5cac96fa050064a22841ea715f8c89d6d5afbf597a4d005dbc6b13856d335b42a9a82edcb949835cca20b0a23de51cc3aec35566eff0c5ae1ab3751320d2c310495238eda383c38a4163152b8815690b8ff015035d1d00ea4a0d6caf324bb71a664a1bed31480784a68f438caa359e8d2673c857d4b8c0b6c695847b86800ea3d734b5ecc4d52b507ac69b3a6778916016ebc2315f44c90bf0c3e7dae01d49cbc303402bbc634ae1191f3f6fd63d303b0c0be033a47b90f8d3a77f0a44", "signature": "bbe4cd63676e26d675a191151d30db72b5b84d461eec6564af867ab41bae9931147885519ec9d7e6c818743c8ef6d5167b35b421363c09b357367fe8de443a06" }, { "secret_key": "ba9e686204975c3bded4c1e9f74c7e4c7a7e3c9981d01bfca0ad0115c3f0f5c3", "public_key": "4990fce6952e8b7d0afcf4bf9dba9bce1bc4815e37511da7c2ad4892581de03a", "message": "46bb48952ae58f2bf58f5be8df4f316b50f363ec84eed8f82ff4c04b0692d03aef26e8e1e6c9549a2247d540a6e22feb11e57f4b808a2097e8a7b6b3b7af3769e6d81d64886e6962372f4f39e49cd46c1b5f735f380f7c277d099776ed1aeaa57a359c0aa8c72f40eb91a1bf07ea157f5ddb30409d6e3af98990ce7f30affdac5e22010646dca96a540060fc908a3125b000ad1ed3a0f255cd34f15d7dd1fd681c3c35a1cd652056ecc5264d39aaf72a9bb83a551cc934887ae107afdfef063217270d9596891418bd461bba63de65be067b1b7864fe46484c7c9e96349a7c03a80fa055050aa18ace2a44b4a03c947824172b30e21011159443ca3cefaf696a7aa8f98011260c9436bf48991f41d4d507b96ce7323e531adcf66347c55c8855673a9f2ec89b5c8024460617ec7271773b36d64fc14eb5d82652c53a3031457227093d118fd8eb9384e80229041a96a6493450f97e6736263abf1ecd9e9fb9a4f0f6d667fa824151485edc37b34acf3d8c35f9c1be48b5e96a12af8e2d35c23a03580f211da6316b34c56bee872d47641bca77da640fdbbad5a9ad8ab9dc7957913da734ad37492ba4de8cf136cccdeb6ba3f1bd3f003be7263c4f2a40c33f24ca3339596e6c3428338100ebcc0722d4f50d30b33b912d4e7c1a9fe65f6658a6f239140a62c3261e10392ed1930aa917652d3bd2be4e8a08ab97e145b920abb31ee4bcd5a0d71f638180f61c245823a399a734a4dcde0997880245ed71eb9bc65e3c6fc95ab920b8024c17d44ced0037d04a133c2641782f1d622df45269b491d3fa2a1227579eaa386de3e7de7bc455c6a154eee5727fff0437a20076c5c3b0577cac5b4b6934e269380222461a60f954e48979c0671217f16f7027983034121093186c78705fc27dc92e2eda4116a6bf7d23e0548d62b67b25c41ed06192bc26ef1397bf1601f3a6e2a0e7f661fb0505ee382f27aec2805a3e2117", "signed": "c7d23a58e2fb2a8d4b8ed1e9eae91e1129c2af8bd05f0bd572abebbe0f30825925f0df71cfb7218c686e5548d9427710a690366ba85541c79101a58a10e8af0a46bb48952ae58f2bf58f5be8df4f316b50f363ec84eed8f82ff4c04b0692d03aef26e8e1e6c9549a2247d540a6e22feb11e57f4b808a2097e8a7b6b3b7af3769e6d81d64886e6962372f4f39e49cd46c1b5f735f380f7c277d099776ed1aeaa57a359c0aa8c72f40eb91a1bf07ea157f5ddb30409d6e3af98990ce7f30affdac5e22010646dca96a540060fc908a3125b000ad1ed3a0f255cd34f15d7dd1fd681c3c35a1cd652056ecc5264d39aaf72a9bb83a551cc934887ae107afdfef063217270d9596891418bd461bba63de65be067b1b7864fe46484c7c9e96349a7c03a80fa055050aa18ace2a44b4a03c947824172b30e21011159443ca3cefaf696a7aa8f98011260c9436bf48991f41d4d507b96ce7323e531adcf66347c55c8855673a9f2ec89b5c8024460617ec7271773b36d64fc14eb5d82652c53a3031457227093d118fd8eb9384e80229041a96a6493450f97e6736263abf1ecd9e9fb9a4f0f6d667fa824151485edc37b34acf3d8c35f9c1be48b5e96a12af8e2d35c23a03580f211da6316b34c56bee872d47641bca77da640fdbbad5a9ad8ab9dc7957913da734ad37492ba4de8cf136cccdeb6ba3f1bd3f003be7263c4f2a40c33f24ca3339596e6c3428338100ebcc0722d4f50d30b33b912d4e7c1a9fe65f6658a6f239140a62c3261e10392ed1930aa917652d3bd2be4e8a08ab97e145b920abb31ee4bcd5a0d71f638180f61c245823a399a734a4dcde0997880245ed71eb9bc65e3c6fc95ab920b8024c17d44ced0037d04a133c2641782f1d622df45269b491d3fa2a1227579eaa386de3e7de7bc455c6a154eee5727fff0437a20076c5c3b0577cac5b4b6934e269380222461a60f954e48979c0671217f16f7027983034121093186c78705fc27dc92e2eda4116a6bf7d23e0548d62b67b25c41ed06192bc26ef1397bf1601f3a6e2a0e7f661fb0505ee382f27aec2805a3e2117", "signature": "c7d23a58e2fb2a8d4b8ed1e9eae91e1129c2af8bd05f0bd572abebbe0f30825925f0df71cfb7218c686e5548d9427710a690366ba85541c79101a58a10e8af0a" }, { "secret_key": "5907a8c084043875238edbdcb7832fbba4c05ea3c5f88a96f1fbf950401ec164", "public_key": "e2f49509d1007f618efe4f1fd67eaa6e2ab18afb2decced5a0b2ba8363789260", "message": "433b2478e18fad5cb81067061d225528229778307885475460fbe3137a5b44024894ddbe56fa6ed021496f0786e42bc6c2d2797ea0a6bf355e88115faa55cd92ed42133d9dcda6b9ebf63ce4a994d1a82d2a49267558be54182a6f85112bd12b247adacf1405fc7ec7a015d43ab40b82c677f7f85a0e48197c5b96576199f4c3343ff7654d523a30c43a054c3e464451278034b7f196c366768c628af94fc0ccfc9a2955f9d32338b944780f8e327085b103781868e4fb79d56122d7f3f5ab309e5d634add15da382c0d2358e647182be4de6e9a9e43e6a3a3b8215b204d9507610d461621000fb1893707af7d2595bfef8a8c5c5cd08f309a5fb55e45519aea9b84748ca5c672bfecd30d25651234a3cc319b43dfcefc1a07b55b4aca714c2e7ef9638fe7884a77b22253a01a2229500e9ce10fda73a843c19cc09626d2456c22a9c901881d521f4b15d2f613cb469d304d579223bc5ff73804df6371517ebaa5b677ea910ff1a02a26fafe48fef469ed799bed6d56ce961834a2edc2e23c0d9426eccdcc934f4c220e37815f7c334b7383607d430520946a881a08325b4164979d5e82cd8134d78cec4861c019f6de301c1b9aec52bb982033fb79b2e9731bab2968bc3f93fa5604b893c6028c204c36bb8c6b074be28c964d2849b5bb19d7e0ba24e22a204d4fda83b10131d383f10b136bd0dba39ec26af30e3ffb4dbc0c921f0cc9910715d51c81fe4c62950e855549a17cd73a09ac91e06d461518376d0fcfa123df0a837103458d9ce221808d1f9ef2edc5cd2e6823145b524894ea48526d985eefd3f60679399548e1edeadb5395b43d87044b2bfe7c6037029b346a402227eab81f333e10e77f1dbc06a211d43b82558676c2dcff9082b1dd53368df002de1329af3000b171a6914389bb80ec0c9f3e412a441b800afceb0486709adac66cafeef248839331f5d892197e25420f1e37d7c0247f669f5fcbf0", "signed": "8c4912c0f885d76c914059505373a64bddd67dd468369ab918f23ea28e04c19177a8d461144f0a8b51d215176cb08bd65301c3c46237b61bb1498ca79d4be70e433b2478e18fad5cb81067061d225528229778307885475460fbe3137a5b44024894ddbe56fa6ed021496f0786e42bc6c2d2797ea0a6bf355e88115faa55cd92ed42133d9dcda6b9ebf63ce4a994d1a82d2a49267558be54182a6f85112bd12b247adacf1405fc7ec7a015d43ab40b82c677f7f85a0e48197c5b96576199f4c3343ff7654d523a30c43a054c3e464451278034b7f196c366768c628af94fc0ccfc9a2955f9d32338b944780f8e327085b103781868e4fb79d56122d7f3f5ab309e5d634add15da382c0d2358e647182be4de6e9a9e43e6a3a3b8215b204d9507610d461621000fb1893707af7d2595bfef8a8c5c5cd08f309a5fb55e45519aea9b84748ca5c672bfecd30d25651234a3cc319b43dfcefc1a07b55b4aca714c2e7ef9638fe7884a77b22253a01a2229500e9ce10fda73a843c19cc09626d2456c22a9c901881d521f4b15d2f613cb469d304d579223bc5ff73804df6371517ebaa5b677ea910ff1a02a26fafe48fef469ed799bed6d56ce961834a2edc2e23c0d9426eccdcc934f4c220e37815f7c334b7383607d430520946a881a08325b4164979d5e82cd8134d78cec4861c019f6de301c1b9aec52bb982033fb79b2e9731bab2968bc3f93fa5604b893c6028c204c36bb8c6b074be28c964d2849b5bb19d7e0ba24e22a204d4fda83b10131d383f10b136bd0dba39ec26af30e3ffb4dbc0c921f0cc9910715d51c81fe4c62950e855549a17cd73a09ac91e06d461518376d0fcfa123df0a837103458d9ce221808d1f9ef2edc5cd2e6823145b524894ea48526d985eefd3f60679399548e1edeadb5395b43d87044b2bfe7c6037029b346a402227eab81f333e10e77f1dbc06a211d43b82558676c2dcff9082b1dd53368df002de1329af3000b171a6914389bb80ec0c9f3e412a441b800afceb0486709adac66cafeef248839331f5d892197e25420f1e37d7c0247f669f5fcbf0", "signature": "8c4912c0f885d76c914059505373a64bddd67dd468369ab918f23ea28e04c19177a8d461144f0a8b51d215176cb08bd65301c3c46237b61bb1498ca79d4be70e" }, { "secret_key": "6020ae273e0e0537bac881d7549d923eb1cc200d49ca65d4be635e39173df9da", "public_key": "daaf0e699a12a92c16e0ded3eb3450a36311824577e361f05696603300166297", "message": "6a8011de09aac00db16ff7e55c2de67d8c9883fcb2040dedbc1e321caba7bb036971530176d1dbbaa927520bdfccbed8840126043edc44cbb7fa3528680e5f1b5664951dc90109aea4b9c336ca043d8221a4c8d2011656bf944efd36ba0a10a4b389196055750b0e388fb52870bbec8c55198131443945c09f3aace3e6915014374073266f34887442d74f468f8d7078bba0bd814cd6dd423c97b56905587b152d1fcfba0eb9fde2112691dafaf4f921562f241b62841001834f6ce36685f82a8faa3b7afad73a5e59bf5f9e713e59163f31dbe696118af33506d2ffea3d9c1556fb152fd2b321c31757d0c3c0f60ee113edac02d67efbb303dce6fa88f7b9746ca110e6a0cd099c0831f53c55c28b6c82af446456b842b2c950a553ee2c765e9729e6b0c546bfc26bd6d42d06b2ed5d4c8cbbc75f2a3ad8129395793d979c031fce7e20b38bd89c9b624748b2013423cebada02cde2052da5664c6c6426cbfc88f84ff602e2e20df9678fbba577a4c134517ee050681151580f7c5c9787b96e55c4075a26f4f8ccffbbb6ea18de1b2cc8c4496b16042770b7ec6eb5429e7ac1891232aa4e47467f4e9a985d80547ecc4c6fd9f59763ede91671f2aa5736a5d148e3a8ffc88e61253a85b0953654958eb2d69401cbeae775f8cb8c3ca42d21693ebe298838df94c1d77b126a1205cc47d50d5367b6f276ec8db6b95324a31e8fd2ed2e43420c4ad02ea277dd948a55193d0f0b4d1cf28386c725975ce5c12d2a6f35673cc22a0694cca4daf6afbfd326d88c1850f834c42ff0e292ba4f13e5ef0774a596d33904c0262d31df2c584a0a4f453f6ae4a88a275f7de79c13ae1a73115be02f425c6f177a1ec4639c42a792809a2b0919ebd321e316001d5b2f84894fcebd50a1dcf44d702b924532fc0e4d3f9ff8486c0ed180eecc3e09e2272a94dc7d24a4e87a931fe2495cbf992c0aae9201e0796298f9363dbac475e8ed", "signed": "b1ba88fed7e5f4b757f3fa4d1ed9b19e498e5d2f5e6cd46e426fe8f039882f1be77ac9e5a9265cbf7e3cd2a9e9926c18199143798da5be47a4086440496ba00f6a8011de09aac00db16ff7e55c2de67d8c9883fcb2040dedbc1e321caba7bb036971530176d1dbbaa927520bdfccbed8840126043edc44cbb7fa3528680e5f1b5664951dc90109aea4b9c336ca043d8221a4c8d2011656bf944efd36ba0a10a4b389196055750b0e388fb52870bbec8c55198131443945c09f3aace3e6915014374073266f34887442d74f468f8d7078bba0bd814cd6dd423c97b56905587b152d1fcfba0eb9fde2112691dafaf4f921562f241b62841001834f6ce36685f82a8faa3b7afad73a5e59bf5f9e713e59163f31dbe696118af33506d2ffea3d9c1556fb152fd2b321c31757d0c3c0f60ee113edac02d67efbb303dce6fa88f7b9746ca110e6a0cd099c0831f53c55c28b6c82af446456b842b2c950a553ee2c765e9729e6b0c546bfc26bd6d42d06b2ed5d4c8cbbc75f2a3ad8129395793d979c031fce7e20b38bd89c9b624748b2013423cebada02cde2052da5664c6c6426cbfc88f84ff602e2e20df9678fbba577a4c134517ee050681151580f7c5c9787b96e55c4075a26f4f8ccffbbb6ea18de1b2cc8c4496b16042770b7ec6eb5429e7ac1891232aa4e47467f4e9a985d80547ecc4c6fd9f59763ede91671f2aa5736a5d148e3a8ffc88e61253a85b0953654958eb2d69401cbeae775f8cb8c3ca42d21693ebe298838df94c1d77b126a1205cc47d50d5367b6f276ec8db6b95324a31e8fd2ed2e43420c4ad02ea277dd948a55193d0f0b4d1cf28386c725975ce5c12d2a6f35673cc22a0694cca4daf6afbfd326d88c1850f834c42ff0e292ba4f13e5ef0774a596d33904c0262d31df2c584a0a4f453f6ae4a88a275f7de79c13ae1a73115be02f425c6f177a1ec4639c42a792809a2b0919ebd321e316001d5b2f84894fcebd50a1dcf44d702b924532fc0e4d3f9ff8486c0ed180eecc3e09e2272a94dc7d24a4e87a931fe2495cbf992c0aae9201e0796298f9363dbac475e8ed", "signature": "b1ba88fed7e5f4b757f3fa4d1ed9b19e498e5d2f5e6cd46e426fe8f039882f1be77ac9e5a9265cbf7e3cd2a9e9926c18199143798da5be47a4086440496ba00f" }, { "secret_key": "932a200ecee7223f24146283a4048c67a6a2d2fc4ba0f9248bdffd82c6cce3cb", "public_key": "ec9bfb7a6d04e726fc1ea0c424610dcb7967bf15d6d6626858d411198d40e239", "message": "df953207048213afb8e2af452c889a21ca136a68c929bdc824f9a89ac596dcb90019a46fb682bcfd962fccb27d00baf8eccaf9d9a7d8183cabd7dfa506f7bafb4935ab045931ff8faeb71631f9ed6bb8f8473ad6290d7cf519db310a4442c461118f67d1a6d103bae6f2697c94b7426d9e02e3cb9522fd0b44aef600c962feff5873d98c2790887b8e88d160824f1bba22017639f8dce68f743480deea1f92aa1fd4135dd06457a60f36b7d7f517d40c94c0dddc2e465847d909b9f68245ff2b421d5919001aae5aef24e02c002da907e8605f160ea6096b580b75cea022d402f7f5fdc464f87f78c7906a01e8e48fb5b35174612b48ac8bc750e0f3aeb0a12f7dfc09b0842c1780a5fd9c54afb9399b9408baaccda20afbe3d682248d7bf1efdef4905a319b0ffb108b753b71cc97e9e21ec9b3dd28cee039d9418a1135f0add092aa66312ea2913300d1cc8916524302bd3d1b09e6b29c6857cbdc56ef4b3f35d8ee677208effa846fdb066b05eb717b4d45120cab72a7db7a7ca846e87b16b69047eb76d8f18da8e1399ec0a8c9c328cbe60e0bf42044d2ebf2818b3c047588452fcd2b3efc1e1009ae07688727db8fb6df2a2fe75d1cf22f32bac09c82a6a3d7eed7d00508cbe5b72460ecfcdd3ee911efe5898dbd8e4ce8591326dd1522f9d255da861bf9eb2a1d5725d7d5d427340341945e7bca8cf2ff8a997450953e77d203683e4b0dafc330e05672d2ecd13a3f442df137044e0f556ffbceffea26cbae26cba6f2568cf39f908489e1a92e76afbf297995da4b2cb1abc9ee1fe4dca5aa838b2fbdc109e89bef3ce5a36e5b2f712ac4c889438248fa5a2150cac6c977b5e0543f4010b7314732fd18e7fd5982e83276519e78725e5a5eeb86f4892084ae52da3849c228c809edbf69a2cc47c478d18719f111d737887c7a2eb3250898db34e5e5076fab9f4a9e6e1929a3480836dea07ba4d63fcefce5543430a8", "signed": "cd1e4bdf4a3e4a31d65254333c8cc4087e4cc40b02e2a347d09a3dde698490c087d7109ad0209c53e987589cbf3ce26412a2b02cb8a3bc93fec75ab5d2c38703df953207048213afb8e2af452c889a21ca136a68c929bdc824f9a89ac596dcb90019a46fb682bcfd962fccb27d00baf8eccaf9d9a7d8183cabd7dfa506f7bafb4935ab045931ff8faeb71631f9ed6bb8f8473ad6290d7cf519db310a4442c461118f67d1a6d103bae6f2697c94b7426d9e02e3cb9522fd0b44aef600c962feff5873d98c2790887b8e88d160824f1bba22017639f8dce68f743480deea1f92aa1fd4135dd06457a60f36b7d7f517d40c94c0dddc2e465847d909b9f68245ff2b421d5919001aae5aef24e02c002da907e8605f160ea6096b580b75cea022d402f7f5fdc464f87f78c7906a01e8e48fb5b35174612b48ac8bc750e0f3aeb0a12f7dfc09b0842c1780a5fd9c54afb9399b9408baaccda20afbe3d682248d7bf1efdef4905a319b0ffb108b753b71cc97e9e21ec9b3dd28cee039d9418a1135f0add092aa66312ea2913300d1cc8916524302bd3d1b09e6b29c6857cbdc56ef4b3f35d8ee677208effa846fdb066b05eb717b4d45120cab72a7db7a7ca846e87b16b69047eb76d8f18da8e1399ec0a8c9c328cbe60e0bf42044d2ebf2818b3c047588452fcd2b3efc1e1009ae07688727db8fb6df2a2fe75d1cf22f32bac09c82a6a3d7eed7d00508cbe5b72460ecfcdd3ee911efe5898dbd8e4ce8591326dd1522f9d255da861bf9eb2a1d5725d7d5d427340341945e7bca8cf2ff8a997450953e77d203683e4b0dafc330e05672d2ecd13a3f442df137044e0f556ffbceffea26cbae26cba6f2568cf39f908489e1a92e76afbf297995da4b2cb1abc9ee1fe4dca5aa838b2fbdc109e89bef3ce5a36e5b2f712ac4c889438248fa5a2150cac6c977b5e0543f4010b7314732fd18e7fd5982e83276519e78725e5a5eeb86f4892084ae52da3849c228c809edbf69a2cc47c478d18719f111d737887c7a2eb3250898db34e5e5076fab9f4a9e6e1929a3480836dea07ba4d63fcefce5543430a8", "signature": "cd1e4bdf4a3e4a31d65254333c8cc4087e4cc40b02e2a347d09a3dde698490c087d7109ad0209c53e987589cbf3ce26412a2b02cb8a3bc93fec75ab5d2c38703" }, { "secret_key": "5c483e837eb01ed5a4ad5db3792699824df13e576be967d12115c85e0286e628", "public_key": "fe1aa8b069da56e676ef3a57d9bba88305ea032808ee635273b37c5c635def4e", "message": "58d5e2cd899ba985378b3ec33e9a869822b23d5d896a28f424fcd6e4cc28b80d4aaf2de804367efdf5e423b1234d821d63ac05eaed12c73e8e3608af0ddccc8386b7d842b12e60d30cede32553945e7829e9b23f5ccc2e7103a08f2cdd9e75a7b36f5e63720ef0d49b2592bef3740268c89c86a6cbdfe201de0db9985ceb19399c9a1d5bb0586af3c8cdf2713299eb0443a541a47384607243c54a05915058367d3f2db380ed317a8c12c7a63e809c2e84d4acb9d9eef54c6f5af7ab59cb9168b1068f9d2ccd978fe721bad68a669ffedea3e92c76b32e3166658ee3bd0deb1b084194ce35d9a741c57fc2241e68efaa65320b23a1dd19ea8b7ec81e76f1e9163f9592eeee5af8eced0272f33512d0d4ca067f05551b265396e10014783cacac79437b19842de6ab91b9d923bbeb503325bc54869f663e6ea4ae6897701be7e11d16cdfae0eee861862000e7a4160781547e42526af51ba9698d234aaf510da81a0dbf264366153d7a6d5eb3fb08b9bb5ea065c2f5e5b6bb679d2e210b5b40e2bc82f78dc9ab5824b74aadadd89bf8a8b73a0a2f43ac748378921a73a252704a4adbf740cb99c1e1594c37ac9acc19f52315c6a846a57b36128c64d767af44e9c86305bf18ba7cd52680523a3b102fba6fe55567069d2047cbdd9605ea12c8877d399c1e66e33817731f50b84f817d1f0760a40f97468618934105eb00ec50c76db3c53fcf43fe1702907d9a756bcf439f8831d0bfac92e7058fb157be3e591d37eb34165e3c6fc60e72294c083e477626f9001c1d737c290377dfa58ea4ead3028fc762ce8a3afec2e6e132c662df6034ab554f93efac657ad34f6107d347fc5c5e53f3733e178b76014d2f9bbd06ef2dfe60e2083d8865f7f5b2acc025d912e5cf6cda6e798143e9dbbc70a0211d8e4003d78b383d66a6ad29717ca24eddef7df7cd3a7ef652aba5487afe5d026c9b102807294eb27d9824eeb6b40f083de7", "signed": "c17c2fbf8c00bcea3035bf0a62d30229db742cab1199677c7eb4eb0ef5c7b51ad487a4971b631e794a58bb0823cc0fe62610fda6a9e03f8c4c3381cb154cef0b58d5e2cd899ba985378b3ec33e9a869822b23d5d896a28f424fcd6e4cc28b80d4aaf2de804367efdf5e423b1234d821d63ac05eaed12c73e8e3608af0ddccc8386b7d842b12e60d30cede32553945e7829e9b23f5ccc2e7103a08f2cdd9e75a7b36f5e63720ef0d49b2592bef3740268c89c86a6cbdfe201de0db9985ceb19399c9a1d5bb0586af3c8cdf2713299eb0443a541a47384607243c54a05915058367d3f2db380ed317a8c12c7a63e809c2e84d4acb9d9eef54c6f5af7ab59cb9168b1068f9d2ccd978fe721bad68a669ffedea3e92c76b32e3166658ee3bd0deb1b084194ce35d9a741c57fc2241e68efaa65320b23a1dd19ea8b7ec81e76f1e9163f9592eeee5af8eced0272f33512d0d4ca067f05551b265396e10014783cacac79437b19842de6ab91b9d923bbeb503325bc54869f663e6ea4ae6897701be7e11d16cdfae0eee861862000e7a4160781547e42526af51ba9698d234aaf510da81a0dbf264366153d7a6d5eb3fb08b9bb5ea065c2f5e5b6bb679d2e210b5b40e2bc82f78dc9ab5824b74aadadd89bf8a8b73a0a2f43ac748378921a73a252704a4adbf740cb99c1e1594c37ac9acc19f52315c6a846a57b36128c64d767af44e9c86305bf18ba7cd52680523a3b102fba6fe55567069d2047cbdd9605ea12c8877d399c1e66e33817731f50b84f817d1f0760a40f97468618934105eb00ec50c76db3c53fcf43fe1702907d9a756bcf439f8831d0bfac92e7058fb157be3e591d37eb34165e3c6fc60e72294c083e477626f9001c1d737c290377dfa58ea4ead3028fc762ce8a3afec2e6e132c662df6034ab554f93efac657ad34f6107d347fc5c5e53f3733e178b76014d2f9bbd06ef2dfe60e2083d8865f7f5b2acc025d912e5cf6cda6e798143e9dbbc70a0211d8e4003d78b383d66a6ad29717ca24eddef7df7cd3a7ef652aba5487afe5d026c9b102807294eb27d9824eeb6b40f083de7", "signature": "c17c2fbf8c00bcea3035bf0a62d30229db742cab1199677c7eb4eb0ef5c7b51ad487a4971b631e794a58bb0823cc0fe62610fda6a9e03f8c4c3381cb154cef0b" }, { "secret_key": "b0d0abdd8444e10f293754ac9f16e31bdcdd97b7067128aae8e4d7f11289e2cd", "public_key": "1c78cc01bea15352b63c5697f1cfe12ffdd16ddc1d59e77951b6e9408ee228ad", "message": "aa276cc543fcc62d70a704608d98ce51b645b5c24a640a5df10a5591417d108926df3f0ce1b921033309eb8d8659f489fd6f79aa1bf4882d72ac69cc58d3bce0fa89b16411e9753eb40c6c4d598dc8f4abb0bc48f1370371326c9a86bbc2ac6214478e78a38408bddafaa9592600c49a129c05392f8a7d642b49137a20f3fe9f11ee17cfa3afd2af71565e9c40080b60cd0dbc378eda062c7cbc7fe972bde4509a1de95f14df482f48aacc463cd594f66d648d3794738ad6ab496e2da50b0db2ba7b659185e4587f182e833de750faacddf21af5e0cf4c9af385b04f7be231498ad0b742d5a87c06115db230973a51427f202fa39afb9828b5f03fa327cbd52dfec66d71ea319865dcf6810f1858472d8bea3e447adfb4b60758e86b48133709732d2bcf51c76caa847b6537fcb05bb8c87dc5e9fb022b3260c1d71b149859c9663dbdae6a7bbfd6deb9d123809c241401af10719cf91a6bed16084c444607359ed8f018db111511892b46bdac6c9c613841ded886b9dec06c01e80487e48fbe778e9e97508ffda0577853aabdcaca8b0bab6ce41557aab9631c96d60977e35718b60595273fdba140f5500a8d3576f5a9fc8f3ca4c02c167af2e03d25750b42adb03b1417f2b6d219be5f8429331a26a449b5d4db2b1a09152eea2b25d2df7ef6fe0a32e25fae79360a9aee1511fda8064550937a7130971930c673bb358e5f55951f50b146d85d383f3e01c151ece6c06d836701253280fdcff4e139d3319ab2e2ca71bcc3fa0faf7c702c9c604e5651de4af5700e9ede7258b9bc148d5595cd34170e3e5cf292828390908fda961f2230ac0b8cac64739732706ce2d5e59abd6d5e207bdafea74d28d7a758f2200e4e00a0bcf0306a3cabda47024fabeae488ab5c323715cf3ca7720af9ebbf8582e1158a099d736b569b9d40295817ea2554068bef32442c111ec814c6ed415919ba73526334df30bac666084e5601c2281c", "signed": "64408bdd2d0fc892a5b62b5acf8e3b3c73c0b5c4fa2a72e39dd608d4937f9332f73e14d08badc6270114d1f1a556cc6ee8488abb907f79ae175c352e9f11ee05aa276cc543fcc62d70a704608d98ce51b645b5c24a640a5df10a5591417d108926df3f0ce1b921033309eb8d8659f489fd6f79aa1bf4882d72ac69cc58d3bce0fa89b16411e9753eb40c6c4d598dc8f4abb0bc48f1370371326c9a86bbc2ac6214478e78a38408bddafaa9592600c49a129c05392f8a7d642b49137a20f3fe9f11ee17cfa3afd2af71565e9c40080b60cd0dbc378eda062c7cbc7fe972bde4509a1de95f14df482f48aacc463cd594f66d648d3794738ad6ab496e2da50b0db2ba7b659185e4587f182e833de750faacddf21af5e0cf4c9af385b04f7be231498ad0b742d5a87c06115db230973a51427f202fa39afb9828b5f03fa327cbd52dfec66d71ea319865dcf6810f1858472d8bea3e447adfb4b60758e86b48133709732d2bcf51c76caa847b6537fcb05bb8c87dc5e9fb022b3260c1d71b149859c9663dbdae6a7bbfd6deb9d123809c241401af10719cf91a6bed16084c444607359ed8f018db111511892b46bdac6c9c613841ded886b9dec06c01e80487e48fbe778e9e97508ffda0577853aabdcaca8b0bab6ce41557aab9631c96d60977e35718b60595273fdba140f5500a8d3576f5a9fc8f3ca4c02c167af2e03d25750b42adb03b1417f2b6d219be5f8429331a26a449b5d4db2b1a09152eea2b25d2df7ef6fe0a32e25fae79360a9aee1511fda8064550937a7130971930c673bb358e5f55951f50b146d85d383f3e01c151ece6c06d836701253280fdcff4e139d3319ab2e2ca71bcc3fa0faf7c702c9c604e5651de4af5700e9ede7258b9bc148d5595cd34170e3e5cf292828390908fda961f2230ac0b8cac64739732706ce2d5e59abd6d5e207bdafea74d28d7a758f2200e4e00a0bcf0306a3cabda47024fabeae488ab5c323715cf3ca7720af9ebbf8582e1158a099d736b569b9d40295817ea2554068bef32442c111ec814c6ed415919ba73526334df30bac666084e5601c2281c", "signature": "64408bdd2d0fc892a5b62b5acf8e3b3c73c0b5c4fa2a72e39dd608d4937f9332f73e14d08badc6270114d1f1a556cc6ee8488abb907f79ae175c352e9f11ee05" }, { "secret_key": "498497fdcc6a105891e023ff32d75f7c3748d8c52d87dd3b2775aefd8160a143", "public_key": "2d79ae9cee4ac6275b05749c438ebe552b413d873cc07f14f5fa130177214c54", "message": "be38bc8cdf46190e304ab53dd29c2bc40954fd4c6d2bb990f93b2b5c691fdf0527c260f5066187f2d0f31f43a08b360ea1ed8200651764b8fa49595a1594109e496759ab6623fa33378d800e6117e079e13fe85c81b63ebe247b3df6c1584bc7cffbdfa45f2a2ce7c237aaafef8cbca70bcabce0b847d551f46a7d15ce2a0d3d545abacc5930010c53648887d476e0d13a34fc1c54df09d106ed758deedc761d557a73b2bcdddefba4ed005997b19279b9d2de37d041fe013eef05a2e11c9a234e87cc0e16c0c6da42aaa5bf996417bf64e5b785d67dc32547c1f052178d694cf20f1698589e7ed49be29dd59fd5c01ba1d9f5fb06a75895b7b1e15895097ebde84cad6303aa0a86dbc324747d97245d70c5203be01b06cbde06ae037204d23730cd696189f7ac267cf202179929ce5410e0e3ade513d2201bfd20fefa40b4476f27bf907c762eb7262a5be13cfc047a846d20a9f2311b6469b06ab545f0ec9fc446ea250cd3b73a7b6b960c10ca4c2d6c64a156a18c9fb810e49afd0c36daab8b8b856643a4ccafa9ad886e91e544535b8edda27c90c06ab6bcc53628be18d7d6369ca1801f91c2e0b95f36d702f77234b4100719c059951e45b1f916983934e32b4d4d8f29c0a373f8d8f0918b967865cd0e4beca01327c99d5fded4c1a69ac2d4d9b78ffb8305670021040250cc27737e75df75760fec8b8d30b245654f3c12f1f7cea0bce78ab3693578af3ea61ffccdf9baf7c3ea65b88fc854128126476796892c663bd14518c9918629a1095f614e0492446c3d84b16ec94f7ecadaeb6b659bbb4867b579061714fd5bb0faa4ad6be0ffb3888bea447e4e3438c8f0eae644fbd45a3802dc40ec451b212bd592dacd4da96686dc8b2024257f25e9c830bff795eee85d87a090c1a42321e710555764ed8257c9415c7f224b537558cefdc615129f28350267c01ba0403e07f5c6067f91c85a2c50c866dc4388af38d2160203", "signed": "b0a36a2c934756348eb47c25a32c3f2a5ddbd58fcc72a08c3cead1a2d900335c3001e35bfe1f3fb5a555009ba8e96874494b97e8b09700edcb1f2584b9d0fe03be38bc8cdf46190e304ab53dd29c2bc40954fd4c6d2bb990f93b2b5c691fdf0527c260f5066187f2d0f31f43a08b360ea1ed8200651764b8fa49595a1594109e496759ab6623fa33378d800e6117e079e13fe85c81b63ebe247b3df6c1584bc7cffbdfa45f2a2ce7c237aaafef8cbca70bcabce0b847d551f46a7d15ce2a0d3d545abacc5930010c53648887d476e0d13a34fc1c54df09d106ed758deedc761d557a73b2bcdddefba4ed005997b19279b9d2de37d041fe013eef05a2e11c9a234e87cc0e16c0c6da42aaa5bf996417bf64e5b785d67dc32547c1f052178d694cf20f1698589e7ed49be29dd59fd5c01ba1d9f5fb06a75895b7b1e15895097ebde84cad6303aa0a86dbc324747d97245d70c5203be01b06cbde06ae037204d23730cd696189f7ac267cf202179929ce5410e0e3ade513d2201bfd20fefa40b4476f27bf907c762eb7262a5be13cfc047a846d20a9f2311b6469b06ab545f0ec9fc446ea250cd3b73a7b6b960c10ca4c2d6c64a156a18c9fb810e49afd0c36daab8b8b856643a4ccafa9ad886e91e544535b8edda27c90c06ab6bcc53628be18d7d6369ca1801f91c2e0b95f36d702f77234b4100719c059951e45b1f916983934e32b4d4d8f29c0a373f8d8f0918b967865cd0e4beca01327c99d5fded4c1a69ac2d4d9b78ffb8305670021040250cc27737e75df75760fec8b8d30b245654f3c12f1f7cea0bce78ab3693578af3ea61ffccdf9baf7c3ea65b88fc854128126476796892c663bd14518c9918629a1095f614e0492446c3d84b16ec94f7ecadaeb6b659bbb4867b579061714fd5bb0faa4ad6be0ffb3888bea447e4e3438c8f0eae644fbd45a3802dc40ec451b212bd592dacd4da96686dc8b2024257f25e9c830bff795eee85d87a090c1a42321e710555764ed8257c9415c7f224b537558cefdc615129f28350267c01ba0403e07f5c6067f91c85a2c50c866dc4388af38d2160203", "signature": "b0a36a2c934756348eb47c25a32c3f2a5ddbd58fcc72a08c3cead1a2d900335c3001e35bfe1f3fb5a555009ba8e96874494b97e8b09700edcb1f2584b9d0fe03" }, { "secret_key": "d962a6719e5cc7724ca4a1d559536812b4e22aa7bcb13e4fb1722d28e045217c", "public_key": "a944592dbc7d77039d720256c3fd340d34db892ab13e4812d662e2840c28b6d0", "message": "a6aa7a190d003ab175332b8f58e7caeb690854d9db56dbb6957b3fb654e2e0da991f3154214204135df1e1104317c9e3c58eedff1fc61aba57744c0c7ef486000a70b2c142ebaddc07ab065e2a855daf198a6803ac24ef3724487c1351ddeda0513913457d76860d78a9b6bc3dba66c40e5fc349a873ad6065ce7d7fdc2cc483b3aefbf2f03dd669bd9cb8f63cee47785cacb09d872c9aeb83e9868405254324037982e08613455d9521d88ea2fda020be730cfc8c07cb0b37614ccba2fa3ec498b815bb5adb996e848b38c015a6a5c752ebdac7b9eed8b69619d8c846b66f7816d1df1ebc21071cef0b251e2eab59827f6d6055084370fd27c203e86a189f1ee11e8403abdcbd1f45341a820525d8637dc484a5185d6551cb882a96b9981a5f1a821f27b656fff90e7f69bf286f752f970ffca5c53e0850b20b94f9431627094acea912a880b749a6f80bb206ccaa746fa70c833c9f323089ce0558c9dc200d5739d1e499634f2c16e54b7f6d7819c47071b60bd54dd0f273a319750fd3c510a49ab56f630c7ce6d8023d97862346859bc0b4d605224969708903760301409c60ab25175611f0be98b23a8cd8ac535e3513bc77e1452193dadf4435e63c3629b666a5ea4c4bad36eacad2601404eabd8d9a07956ec2b4b7bb6336ed75b8df8f16de42c0fcae93652e3c407cbd45e8d413ef51e8542df62512ee793e41358a1de19246c6586b3c1407410421f6e865c75a9f4a6a4788f84a9c781d8f8024bfdbe25bdc7d4b69cbaa7719628c0b07ec2c4a234fff4ac3d4935b9ce4c8a16947abe7951ff8d9ac9215e338fa0fe9124176d17bac1e05592c439868ae5a4f75fd1ea82aa454c20a939deda729a0e19646cebd822049c825c7e31c6efad45e306f2d9f0569e0717331f48004c26ebfe68f3843e90f8067032d21e786c8539e01be3ceac5954a0546c84b734d999456a7c45f8cebaa478e548007f9d3af836f754de4123f2f", "signed": "dfb9b635ac0edf83b7b59d0b8409af475f66fc9946af0b7c63ab8cf5929d4701a1bf66959cde62fbcf59a48ab3bbaf0b9a61b6e00b2181eb934282070a5d5300a6aa7a190d003ab175332b8f58e7caeb690854d9db56dbb6957b3fb654e2e0da991f3154214204135df1e1104317c9e3c58eedff1fc61aba57744c0c7ef486000a70b2c142ebaddc07ab065e2a855daf198a6803ac24ef3724487c1351ddeda0513913457d76860d78a9b6bc3dba66c40e5fc349a873ad6065ce7d7fdc2cc483b3aefbf2f03dd669bd9cb8f63cee47785cacb09d872c9aeb83e9868405254324037982e08613455d9521d88ea2fda020be730cfc8c07cb0b37614ccba2fa3ec498b815bb5adb996e848b38c015a6a5c752ebdac7b9eed8b69619d8c846b66f7816d1df1ebc21071cef0b251e2eab59827f6d6055084370fd27c203e86a189f1ee11e8403abdcbd1f45341a820525d8637dc484a5185d6551cb882a96b9981a5f1a821f27b656fff90e7f69bf286f752f970ffca5c53e0850b20b94f9431627094acea912a880b749a6f80bb206ccaa746fa70c833c9f323089ce0558c9dc200d5739d1e499634f2c16e54b7f6d7819c47071b60bd54dd0f273a319750fd3c510a49ab56f630c7ce6d8023d97862346859bc0b4d605224969708903760301409c60ab25175611f0be98b23a8cd8ac535e3513bc77e1452193dadf4435e63c3629b666a5ea4c4bad36eacad2601404eabd8d9a07956ec2b4b7bb6336ed75b8df8f16de42c0fcae93652e3c407cbd45e8d413ef51e8542df62512ee793e41358a1de19246c6586b3c1407410421f6e865c75a9f4a6a4788f84a9c781d8f8024bfdbe25bdc7d4b69cbaa7719628c0b07ec2c4a234fff4ac3d4935b9ce4c8a16947abe7951ff8d9ac9215e338fa0fe9124176d17bac1e05592c439868ae5a4f75fd1ea82aa454c20a939deda729a0e19646cebd822049c825c7e31c6efad45e306f2d9f0569e0717331f48004c26ebfe68f3843e90f8067032d21e786c8539e01be3ceac5954a0546c84b734d999456a7c45f8cebaa478e548007f9d3af836f754de4123f2f", "signature": "dfb9b635ac0edf83b7b59d0b8409af475f66fc9946af0b7c63ab8cf5929d4701a1bf66959cde62fbcf59a48ab3bbaf0b9a61b6e00b2181eb934282070a5d5300" }, { "secret_key": "e1d1416518921d07c8c39e2973d8ea1249caa8bf659cc36c7937f84ece7ad4fc", "public_key": "48bdcc3f1a5b8058ed9a32ef1cc48cf7a8ab76a6e4519e5a82855241ad6fff8a", "message": "3d263de1ab91e8dd7b317f7a27fb60a6e1838c0c793b03abbe7082b6bda0c7c46062262192c88b65c026c174584d29649710429ae44a46140b4c82c8a0b74d56a004f8e2f5c18f84f0464153772f8312633fc6ad28a7d9fb55f7d78cd6488ca58117eaf923fa28875e2b3189893185aa3ccd044d3f110e2e7cabdf6f814b9fdd6733bd5f307a87bc73b6250d5883936deb1db0e0af1be7ab329b5c6bd935bd8f8dc888f0d1c464edbc023cbc080753ee8f799f1072bad1144dfaa615a59e2aedc662e83cb1f8e52096a7ee483bf873b25a0c04c1851a0e87375063aa1a94fa835c052640366b79f735d3286197ab32ebdb5123f6b47ad3f442c44c530a68f8512759e9cf386fba07b8064bc8fe83e245495ec45f8938f8259dc8016205f78d3954442ec1b445d83d95ad1805a5e0e8b3d56b870a20da18d74f26f550a9c7534a4144dcbc1c3cdbbe470cc153905043088facf1d303559de41e96c0ab409bb36dcf38cc9038a6a4908dea82a653195c16f290a7c3ac487636cc5bcb18d15a14ac624c70b6f6462bf249e000cee924018bdf7dde39114cb4f652e122e8744da28b0589e1284d70d9f106de16d073648080e6437ff384e68177d5cb718e2ce3f17ba1e990ae3ce940660130e93750b82e2fb41aa369774568d7cf286725e3c58f63e73f8697aeecc717c5cf1af7ad74f446292c905d84e22b23d4e0d2604bff48fefc40c6204b5e34c042292e53bec9360159a5cd97b2df5786b8f5a292c0b39d14a870a4588e67bd12b2c2f7a4408462851d2aa787971d9315190f42cc588af0d2dcd91f31bb715e9250f1192814f7b8a21fef4517b0cf8bb8a1a1a5f500ee219dfb46132efe8e90bc49093a5559f9681b4fb59e5ba9ef3f05d34eed034c14d77ee95ebd76ffa5af0befcba18fdf932af4854510b75db00a7257b234887d49607dfd16180db516c7a20ccfcaeda6aedfb6a2377fbf31e67b517655db73ca29e118624d6080", "signed": "4232d2a481084d1196db62f22dc74cf2eaf2db0df05ad7cdde67bfc29bff56cde019ac9f03d81f1827eb1e3b0abe0204ca7f77fa874ab5268354ff08bb7f48003d263de1ab91e8dd7b317f7a27fb60a6e1838c0c793b03abbe7082b6bda0c7c46062262192c88b65c026c174584d29649710429ae44a46140b4c82c8a0b74d56a004f8e2f5c18f84f0464153772f8312633fc6ad28a7d9fb55f7d78cd6488ca58117eaf923fa28875e2b3189893185aa3ccd044d3f110e2e7cabdf6f814b9fdd6733bd5f307a87bc73b6250d5883936deb1db0e0af1be7ab329b5c6bd935bd8f8dc888f0d1c464edbc023cbc080753ee8f799f1072bad1144dfaa615a59e2aedc662e83cb1f8e52096a7ee483bf873b25a0c04c1851a0e87375063aa1a94fa835c052640366b79f735d3286197ab32ebdb5123f6b47ad3f442c44c530a68f8512759e9cf386fba07b8064bc8fe83e245495ec45f8938f8259dc8016205f78d3954442ec1b445d83d95ad1805a5e0e8b3d56b870a20da18d74f26f550a9c7534a4144dcbc1c3cdbbe470cc153905043088facf1d303559de41e96c0ab409bb36dcf38cc9038a6a4908dea82a653195c16f290a7c3ac487636cc5bcb18d15a14ac624c70b6f6462bf249e000cee924018bdf7dde39114cb4f652e122e8744da28b0589e1284d70d9f106de16d073648080e6437ff384e68177d5cb718e2ce3f17ba1e990ae3ce940660130e93750b82e2fb41aa369774568d7cf286725e3c58f63e73f8697aeecc717c5cf1af7ad74f446292c905d84e22b23d4e0d2604bff48fefc40c6204b5e34c042292e53bec9360159a5cd97b2df5786b8f5a292c0b39d14a870a4588e67bd12b2c2f7a4408462851d2aa787971d9315190f42cc588af0d2dcd91f31bb715e9250f1192814f7b8a21fef4517b0cf8bb8a1a1a5f500ee219dfb46132efe8e90bc49093a5559f9681b4fb59e5ba9ef3f05d34eed034c14d77ee95ebd76ffa5af0befcba18fdf932af4854510b75db00a7257b234887d49607dfd16180db516c7a20ccfcaeda6aedfb6a2377fbf31e67b517655db73ca29e118624d6080", "signature": "4232d2a481084d1196db62f22dc74cf2eaf2db0df05ad7cdde67bfc29bff56cde019ac9f03d81f1827eb1e3b0abe0204ca7f77fa874ab5268354ff08bb7f4800" }, { "secret_key": "2bf74f004d7d0af73a83ea208cc206723d188f4cf607bcad4b6980268ff21fa7", "public_key": "8fdcd99352438beb52f0d1742bae71844512dd0685aaf1c909e38fc4b5aab6cc", "message": "898e4303ea5bebd200a5f7562be5f5032640a3f5ccfa764292045a1a368d02aa591077d8f304f74dbdfc280734454ed8c2727aff392c108c526e527e672c5397b2d77c01f7741ef8dcc2510ee841b59dd10f4e1d3ac501af7cbdb85ba31129c262fde1a0c8bc83d6ff944b6bae3fa7fb62587c681d8e342965c5705fd1a6ab39e5a0770ee7798d9fb6c0018a514d53af848db6047cd02db352d5563b53662373b971935a1ac2b7b6361dac6748771813f7749316694961b940ff3805811a49fa27a9ba457ad28848c697050e0188d0773e17fb52194e190a7872a398f31c0f0ae06537a273ffb50c2c816445ab882811922c0621556c46a3a0ec40bfedb411e90b6db1ddd4bbebb57d10df566a63d726a33308514ce3b499d5e526c22b956d8b99913dcb13e437e947b666c41c54d8b3ae2356647e8017ab678386c927219ae7bddc0d821265f9dc4ff3f8ce5be60f8e9defc5ca335068ee29fe8304917b788784a2388a320192f9325d0e6cfffea21e6eaa29e7707f63a9ea4fbb2558e3d0835bab1f52361037ae59e503ee96b9d708a47a3ae4bad113e2a460a269ccf25a0003cb3e68a551864e59840914791126f954788b25b5af5aaf586ebb87fa5f377b4d7d7f84c000dd2cb440e214d38d5ecf70f20e9881828edaa1dbec37093db960686ca123f1ecba6336b37f46cf765be2814b9e6705bc9d6a49318118c7529b37c84ec88d58a8453dcb692c9a36016b948ebe6fb2c1d0adf5f198ee3097a6ff0b8eebbad8b0769330b18689516bc0fe668b0d05e3a584fcf89c49db501d61c2def7ed3722070193a5b683c5087ef274ce6a193dd4a303536c67934b4660a841ee1b446a6892b14d0b0aa3e98fdffd43c797add36583f74c94d0e2d68e2de818d9af200598f0b2beae169c8dfbc4d397e6d1ceb6daa6c9f6bbf4f8311ba26ffb194d44216c51305267074e856a1d6e922780f4798e2f220223fff1dc370c8e34514aba42df51", "signed": "3eb5b339e191a3b6168545da5fb0ca9be209043919b9c70a07b4a7a3bf64b102f6ffd6d2b02559dc681ed3b9c82297b201dc25c4973880e155e13a29426eb40d898e4303ea5bebd200a5f7562be5f5032640a3f5ccfa764292045a1a368d02aa591077d8f304f74dbdfc280734454ed8c2727aff392c108c526e527e672c5397b2d77c01f7741ef8dcc2510ee841b59dd10f4e1d3ac501af7cbdb85ba31129c262fde1a0c8bc83d6ff944b6bae3fa7fb62587c681d8e342965c5705fd1a6ab39e5a0770ee7798d9fb6c0018a514d53af848db6047cd02db352d5563b53662373b971935a1ac2b7b6361dac6748771813f7749316694961b940ff3805811a49fa27a9ba457ad28848c697050e0188d0773e17fb52194e190a7872a398f31c0f0ae06537a273ffb50c2c816445ab882811922c0621556c46a3a0ec40bfedb411e90b6db1ddd4bbebb57d10df566a63d726a33308514ce3b499d5e526c22b956d8b99913dcb13e437e947b666c41c54d8b3ae2356647e8017ab678386c927219ae7bddc0d821265f9dc4ff3f8ce5be60f8e9defc5ca335068ee29fe8304917b788784a2388a320192f9325d0e6cfffea21e6eaa29e7707f63a9ea4fbb2558e3d0835bab1f52361037ae59e503ee96b9d708a47a3ae4bad113e2a460a269ccf25a0003cb3e68a551864e59840914791126f954788b25b5af5aaf586ebb87fa5f377b4d7d7f84c000dd2cb440e214d38d5ecf70f20e9881828edaa1dbec37093db960686ca123f1ecba6336b37f46cf765be2814b9e6705bc9d6a49318118c7529b37c84ec88d58a8453dcb692c9a36016b948ebe6fb2c1d0adf5f198ee3097a6ff0b8eebbad8b0769330b18689516bc0fe668b0d05e3a584fcf89c49db501d61c2def7ed3722070193a5b683c5087ef274ce6a193dd4a303536c67934b4660a841ee1b446a6892b14d0b0aa3e98fdffd43c797add36583f74c94d0e2d68e2de818d9af200598f0b2beae169c8dfbc4d397e6d1ceb6daa6c9f6bbf4f8311ba26ffb194d44216c51305267074e856a1d6e922780f4798e2f220223fff1dc370c8e34514aba42df51", "signature": "3eb5b339e191a3b6168545da5fb0ca9be209043919b9c70a07b4a7a3bf64b102f6ffd6d2b02559dc681ed3b9c82297b201dc25c4973880e155e13a29426eb40d" }, { "secret_key": "f5f7d5b73c5a65301b5b4c6710ed12c16e7903177db792ca715e23389d05d83e", "public_key": "7c4762e979f0c7e207be1843e2666aca27ea89bff5b61d573c985fc7025e1e28", "message": "7c9318d56e63f16535436fa45afe278e74e61881bb468997d0418bc720b630dadb8128b4b65ca6e921e501813df9fe03b4ef0aae8035dd08c5f820ce5df12ee118d9c36d3b151a52c3f96ae1ca4c82fd19da669ddba94febf8eac8c42b447babc8a60b36e803624f7d2047bd8d8a153687f10dc1ca82100b7c87d32370ec8f2671ed7d067cc80587cab8db3a71ce5e406327f763ec1b3c166770a75536630c815fd8267582d1b5051f0f821c02150b2eef349b50590314aa2570793fa64a76ed2ed83d2ba1f9b9f1163154612b49a64ad8d5573c25b1cd37c41a44e3df78f1053d90b068f0d37ae00c4a32b1a3ff874c41da4a7043392f18efe5518d76e88b41ced69e6f4c014f06ebc5146e61e82fae1c49c37c394fea34199ab86c11a4467a374e40255a05d426971430d56cdba25a21ad779cc7f62d22cd87b60f0891bd856a517e14b72a9ac7672e4e8fb374a9758ab0c4e5964aae03228973f173a5d42aef9db33736c3e18d8eec204a1a17b9d04593dea4d804cbc81b9ac5458050495539999a9985487e7ca11c37582ef85c841e8f065ea98fdd6b1c60dea1ec2883521568856a6ebb2749f2072eb43448be0705ed477cf4b2004865217de5fadbe2a0f9d6b84b3fe7f7bf6c77537496246ec796b8ef2c04f68ab5b14fce0c6d287b836227d9f08fa0ee19722f6798a5d8280d107cfc1bd592d9ddc724ea86fc39dc94a394019e3a3de9e0d1c735e862de2bb9525b5fb4bd121212bfaff9ff586ac3c75c5ace746d9ca307f795ff2697f2b41a6346ed23397eb38898691e6f66841637d0ab0d968309e0194002309015416e74472fe32425d45f07c7711918b1e5790f572ce4441042d426033792297b5f81e0809bd9691f0a505e3259fc03c9ff107eb9b48795f49fb09c1bab5659d39ffecbdcc403e3803dc012438c2fb36f683015c5df0482cb7d7fc5757364a0a3c10d0e1259c01fcc4dd5494b5290a694aea3f6fae547ac576f", "signed": "58fb392f82d5e52ff072cc77efe048f2235250c71125ee821c5f3b393bcf2fa46be4c5d8caf13cb519efe0c2fad9ee231ae9b6fd1fd509c98c69c2d36c753e0e7c9318d56e63f16535436fa45afe278e74e61881bb468997d0418bc720b630dadb8128b4b65ca6e921e501813df9fe03b4ef0aae8035dd08c5f820ce5df12ee118d9c36d3b151a52c3f96ae1ca4c82fd19da669ddba94febf8eac8c42b447babc8a60b36e803624f7d2047bd8d8a153687f10dc1ca82100b7c87d32370ec8f2671ed7d067cc80587cab8db3a71ce5e406327f763ec1b3c166770a75536630c815fd8267582d1b5051f0f821c02150b2eef349b50590314aa2570793fa64a76ed2ed83d2ba1f9b9f1163154612b49a64ad8d5573c25b1cd37c41a44e3df78f1053d90b068f0d37ae00c4a32b1a3ff874c41da4a7043392f18efe5518d76e88b41ced69e6f4c014f06ebc5146e61e82fae1c49c37c394fea34199ab86c11a4467a374e40255a05d426971430d56cdba25a21ad779cc7f62d22cd87b60f0891bd856a517e14b72a9ac7672e4e8fb374a9758ab0c4e5964aae03228973f173a5d42aef9db33736c3e18d8eec204a1a17b9d04593dea4d804cbc81b9ac5458050495539999a9985487e7ca11c37582ef85c841e8f065ea98fdd6b1c60dea1ec2883521568856a6ebb2749f2072eb43448be0705ed477cf4b2004865217de5fadbe2a0f9d6b84b3fe7f7bf6c77537496246ec796b8ef2c04f68ab5b14fce0c6d287b836227d9f08fa0ee19722f6798a5d8280d107cfc1bd592d9ddc724ea86fc39dc94a394019e3a3de9e0d1c735e862de2bb9525b5fb4bd121212bfaff9ff586ac3c75c5ace746d9ca307f795ff2697f2b41a6346ed23397eb38898691e6f66841637d0ab0d968309e0194002309015416e74472fe32425d45f07c7711918b1e5790f572ce4441042d426033792297b5f81e0809bd9691f0a505e3259fc03c9ff107eb9b48795f49fb09c1bab5659d39ffecbdcc403e3803dc012438c2fb36f683015c5df0482cb7d7fc5757364a0a3c10d0e1259c01fcc4dd5494b5290a694aea3f6fae547ac576f", "signature": "58fb392f82d5e52ff072cc77efe048f2235250c71125ee821c5f3b393bcf2fa46be4c5d8caf13cb519efe0c2fad9ee231ae9b6fd1fd509c98c69c2d36c753e0e" }, { "secret_key": "43d4be6de9cb00898e99ddcc2e1530110fa2cbc4376c485e9ca57fd65586d8a3", "public_key": "3632ad389be2fab3fba0d804bf6345cd322eddd6a75d8c37fd4b5ba1c9c25e8f", "message": "d9d55dab0fa6da76b68e841c24d971bac1f79af513d834e426a5d08114ce8b54ce8b7afe016b0fad03ee7450c6c3097173681a4b2eb9f9c179a88e7cc36813f2f5d15f7998afa9fd4e546c73bb42e7f9522be6afabca8c7b64fed0e292e4375f3e1e5fd9fcb539f4e5e543fb6a11a0df321e70084aaabb70a9950ceee3d879c386efca1e59c3cb7c45b560095e7af00ff52f8a1aaa9ccf092f0bb806d97610742ac582a3abbeddf39f49d229d32a1186d021518d74728d13d962635d63baa6743b126bf458fa2ac756fbf88096c8d3340c622390534a743f1864d54deab5e5536372ce5ac93762287414eae158a76bf81df5417cf4c047be3ac1475c517ebd3ac1d1d1bdda11b3f99c18173e030acd51d2b5cf79516509415405077511bdd9cbe17d04f47805e98d0d145e60a5d0e0f453cd9b5c1a24f12b75e8cc34d5e00691ffacbff788fea834d9d779c1e610294dce19170d28160cff909bea5a0aa749401740ea3af51e48b27c2b09f025444276c188c0671a6da94b43d1e525e6a4a8a1a73dfedf12401846ba43068a04092b12912270d2b60df6099779756b8bbb49ece82d55f0f8db1b80fb4b59bba860bd18c75d6c834d69442ae0314cf2399f5392a3c6728c63e5c516c4222aac60f916dd63d1d0517e8eb10bd0e15eb90614deb296403ad15b8c12b9e971ef2f01e59fc35d90c55a8e20e9437dd434b26d5c2c6ec2d53acec17e81e47831dc2de82183d713b59a4d1f46969ddcddaf27f44e5a311aaac39c3d5a97bc90cad712f46f85e6c8fbf5d58d8bc3ec27d310a9eaf2c369cb00649770390a3f988f362efc155f56a146a62650547e9153250701eead1bd01c89462272dfaf0a431af4bd7c3db451ada603233fdad3aa8999aa21e2d3a43b0b56fc6a9124d33598b3737f4e5cb258beda756ad2e17d0691d15d416bb7cb07ec8d8c7af5de80e5b9394e320c4c6e43efaae684ad00f6dd20a8750e959c2f04206fc023aa190c", "signed": "86ae9325f80b9886c8381f96a18c2120e6db016a0d6ca282ed93ba9b61caec02de88efca8b8e916a4b16a58525a2f68d21e5fbe67db4c4d6209595c4abc32b09d9d55dab0fa6da76b68e841c24d971bac1f79af513d834e426a5d08114ce8b54ce8b7afe016b0fad03ee7450c6c3097173681a4b2eb9f9c179a88e7cc36813f2f5d15f7998afa9fd4e546c73bb42e7f9522be6afabca8c7b64fed0e292e4375f3e1e5fd9fcb539f4e5e543fb6a11a0df321e70084aaabb70a9950ceee3d879c386efca1e59c3cb7c45b560095e7af00ff52f8a1aaa9ccf092f0bb806d97610742ac582a3abbeddf39f49d229d32a1186d021518d74728d13d962635d63baa6743b126bf458fa2ac756fbf88096c8d3340c622390534a743f1864d54deab5e5536372ce5ac93762287414eae158a76bf81df5417cf4c047be3ac1475c517ebd3ac1d1d1bdda11b3f99c18173e030acd51d2b5cf79516509415405077511bdd9cbe17d04f47805e98d0d145e60a5d0e0f453cd9b5c1a24f12b75e8cc34d5e00691ffacbff788fea834d9d779c1e610294dce19170d28160cff909bea5a0aa749401740ea3af51e48b27c2b09f025444276c188c0671a6da94b43d1e525e6a4a8a1a73dfedf12401846ba43068a04092b12912270d2b60df6099779756b8bbb49ece82d55f0f8db1b80fb4b59bba860bd18c75d6c834d69442ae0314cf2399f5392a3c6728c63e5c516c4222aac60f916dd63d1d0517e8eb10bd0e15eb90614deb296403ad15b8c12b9e971ef2f01e59fc35d90c55a8e20e9437dd434b26d5c2c6ec2d53acec17e81e47831dc2de82183d713b59a4d1f46969ddcddaf27f44e5a311aaac39c3d5a97bc90cad712f46f85e6c8fbf5d58d8bc3ec27d310a9eaf2c369cb00649770390a3f988f362efc155f56a146a62650547e9153250701eead1bd01c89462272dfaf0a431af4bd7c3db451ada603233fdad3aa8999aa21e2d3a43b0b56fc6a9124d33598b3737f4e5cb258beda756ad2e17d0691d15d416bb7cb07ec8d8c7af5de80e5b9394e320c4c6e43efaae684ad00f6dd20a8750e959c2f04206fc023aa190c", "signature": "86ae9325f80b9886c8381f96a18c2120e6db016a0d6ca282ed93ba9b61caec02de88efca8b8e916a4b16a58525a2f68d21e5fbe67db4c4d6209595c4abc32b09" }, { "secret_key": "7d010d760f24e5a2de34089c9fdb19c33b155b0a37ca455a5e5b1dae7a073176", "public_key": "4c877b3c4971fbb551166e214d1c7624c52277903c59a562a80b91a85483fb47", "message": "86e2115572bf4c013e6b4b04d0b03e606ee70d929cb8ec36f4e2f355db3b5e1573d658d17bb1a310c16989a16b9558922ee493f359042103c4dc1b40dff7709901fd5830133f42c4651eca008b499ee4f84cd4ec1edaa78256edb62f24021a0076256919e4e2ce0a5a20f921c278cc299159644b5e3a3bbd089dcbbebad3766aea77e9f08ee5f7d4c19d8170bc3de1ba779a769914f965dbde2b61bad214c508186041f76c25be957656f5cfb7334eb838a3cfbc55cfbab67adf1552619941b835cd3e34103b18b49131e82096f05f570b899804bab8b6cbaddbbc02f9f3b559736d99ca7b02d3268fa273996fcf0571977d1cc3008c4ef848970ee350b158c47ec277add4742fa2bcbea9bd5549c7bca038020ece68f188c1ea3a62dd9a073d4c138ca8a9ac0408dcfd46e36bdff73988a58b9617caa08bd41bf3e812e7824f0f7e8146a444f36bf53a1cd892039ccd335f5a2e79745eac96148c2a299947f1b2e328a3789bf13c6d73506f3bdc68ea48abf002270fe4ee9ef9ed6b10c2fbb4ff1275b9d7dd35d8a52e371758574cb466c57b5abc242976befc8d98a0131b9bb846b219e4669186a83c056cd8080661de16b51ce5767b22e9a93242bf8d3205c66a673ce783d1c0d37b6300fbf0d6127940f88f1819c450dcc90543ed794f1fd44e6539febaf19a4cc98870014d7ccad74d1876a123ecd145516c743b4bba62d821ca9a7951e0dfb23f38d9e3a365fd8322f2ee4799e9ff11e1c5c30b55a355c8a5deea81a545e34705ab56d17b1fa06ed76415556702f364808246f863c319f75cdf6bd748438d1a2eaf4206c560bfafc235679ad6049c1a01526fcb9a3ce1b1d39be4df18b15fa0ea55272b17ebdedf6c30498a8a14f2042be1c2cdb09e9ef3846d6659a9f6d673df9afb7eded04b793d9731f0accc41468dc1f3236c99acadee6239c361b8bd7e2d0cfe8bb7c06687e08e76b71ad57a036179f291d096ae2fa0818ef4bf4866", "signed": "5570613879ae22778bd54f14fb6e8c0256a71f3d79c3e5cd8e41aea8cf773e24d29f1f1b24f8c80d2949e8201465dbde8940b1fab6483b085d418e251014200c86e2115572bf4c013e6b4b04d0b03e606ee70d929cb8ec36f4e2f355db3b5e1573d658d17bb1a310c16989a16b9558922ee493f359042103c4dc1b40dff7709901fd5830133f42c4651eca008b499ee4f84cd4ec1edaa78256edb62f24021a0076256919e4e2ce0a5a20f921c278cc299159644b5e3a3bbd089dcbbebad3766aea77e9f08ee5f7d4c19d8170bc3de1ba779a769914f965dbde2b61bad214c508186041f76c25be957656f5cfb7334eb838a3cfbc55cfbab67adf1552619941b835cd3e34103b18b49131e82096f05f570b899804bab8b6cbaddbbc02f9f3b559736d99ca7b02d3268fa273996fcf0571977d1cc3008c4ef848970ee350b158c47ec277add4742fa2bcbea9bd5549c7bca038020ece68f188c1ea3a62dd9a073d4c138ca8a9ac0408dcfd46e36bdff73988a58b9617caa08bd41bf3e812e7824f0f7e8146a444f36bf53a1cd892039ccd335f5a2e79745eac96148c2a299947f1b2e328a3789bf13c6d73506f3bdc68ea48abf002270fe4ee9ef9ed6b10c2fbb4ff1275b9d7dd35d8a52e371758574cb466c57b5abc242976befc8d98a0131b9bb846b219e4669186a83c056cd8080661de16b51ce5767b22e9a93242bf8d3205c66a673ce783d1c0d37b6300fbf0d6127940f88f1819c450dcc90543ed794f1fd44e6539febaf19a4cc98870014d7ccad74d1876a123ecd145516c743b4bba62d821ca9a7951e0dfb23f38d9e3a365fd8322f2ee4799e9ff11e1c5c30b55a355c8a5deea81a545e34705ab56d17b1fa06ed76415556702f364808246f863c319f75cdf6bd748438d1a2eaf4206c560bfafc235679ad6049c1a01526fcb9a3ce1b1d39be4df18b15fa0ea55272b17ebdedf6c30498a8a14f2042be1c2cdb09e9ef3846d6659a9f6d673df9afb7eded04b793d9731f0accc41468dc1f3236c99acadee6239c361b8bd7e2d0cfe8bb7c06687e08e76b71ad57a036179f291d096ae2fa0818ef4bf4866", "signature": "5570613879ae22778bd54f14fb6e8c0256a71f3d79c3e5cd8e41aea8cf773e24d29f1f1b24f8c80d2949e8201465dbde8940b1fab6483b085d418e251014200c" }, { "secret_key": "aaaabb7ce4fffe4dc35747baea2bc5f050bef06ee0c1fd632a067fece1ef4fb5", "public_key": "820a2442d5f45f3c791478e098fb3b068da52ec4e8dadec85065c35659f437e0", "message": "f9d28597a3e2b64ba327ac5cd29f081e74bf461b2eb2d3cfd9d5e92158d21d1d2a47ab50981cb19fe3f8c6fe488249b1c49fb897a0fe21ab5404414fd914875c220f1cbc12f5c38cfba79f7ac303a5231a372b02fad6c8462f8cc49f0f64965b651dccef0bb9608215090849177be47b2d3072944d36e856da185c7b3a689f7edef988338e0963ed31a6b0a80d5cb0b1cccf6f394837aa6f8b2f3da5efbdf4d360d4bf4dd708ce6445587d942b79761ce951b1bb4d9050703618a6d930a80c69576fc4af306a2a56dbd884a05a1e4e9f3136cd0b55ae474bb5d3d0fbc9b0339cec344fdd085c1928101481c68794f5c890137108cea791d21f81683d3e1a9eec66ace5c014d89e69808e5fa83d3812ee680f5a9971681b8adcd4a16e9a4c165b5ef9932c5ed825237fd5037bcbefe4cb11564fa707c8a93290751414891b1edd3313c65f8b91c2e925a3c12a9d3aa45fd5a667b78393c3e39df88a8f0d1148b5311e3d87c4a92e0a3fb915bc90d5558d05b475a8834778aa943ea39b8eaa95ad1832e5916ea3102d7de0b836cde8f3759dbb3b9d56ea817b3e49c983210277c2c7c5b0db187422532fca98a28b3b659c6b815ac126fadbe2f400c73e9d2dedcbbd2d3a365ffad7e666c896e31e61b384ed3a9fcf1290538df11b9474c6281cc592c71c8808868b4292c17ece6b3edf5e3542a70b911593e93f35ecd9729bd8880a24eaf41fbc6574dfe167ec2d0e7ab3df5ec34b8b55d548ab93738a2eeaf21c884c5c8551db2edf2b049f1a2a84fa72ac8978a4c27809f209c1b2195aff504f699856cc4f22d44ebdd0fe50374468d0b1792e574b5110a1f4cd0e221e824a78ddc4845feb46d66d633d23cd23f4b6fbe4c8ce16cd1af61536da5fa67b10ac7555a68c0e0bdbf2f8d72309d995516b8118bf43835d0a01c08ffeba3ea3ed05cd2d54f0eabcda05d0037d52caed3b19374faf73999094f79055924bea9aec4470135f5e8bf183c9d1c9", "signed": "050ae8aeceec9627b80137357a22962ac8b45048661708d394d0a51aadc381fe8535023d6e1bda0e72b349b50b26da7c3a3085e81e9dd6cf127868fc5baeab01f9d28597a3e2b64ba327ac5cd29f081e74bf461b2eb2d3cfd9d5e92158d21d1d2a47ab50981cb19fe3f8c6fe488249b1c49fb897a0fe21ab5404414fd914875c220f1cbc12f5c38cfba79f7ac303a5231a372b02fad6c8462f8cc49f0f64965b651dccef0bb9608215090849177be47b2d3072944d36e856da185c7b3a689f7edef988338e0963ed31a6b0a80d5cb0b1cccf6f394837aa6f8b2f3da5efbdf4d360d4bf4dd708ce6445587d942b79761ce951b1bb4d9050703618a6d930a80c69576fc4af306a2a56dbd884a05a1e4e9f3136cd0b55ae474bb5d3d0fbc9b0339cec344fdd085c1928101481c68794f5c890137108cea791d21f81683d3e1a9eec66ace5c014d89e69808e5fa83d3812ee680f5a9971681b8adcd4a16e9a4c165b5ef9932c5ed825237fd5037bcbefe4cb11564fa707c8a93290751414891b1edd3313c65f8b91c2e925a3c12a9d3aa45fd5a667b78393c3e39df88a8f0d1148b5311e3d87c4a92e0a3fb915bc90d5558d05b475a8834778aa943ea39b8eaa95ad1832e5916ea3102d7de0b836cde8f3759dbb3b9d56ea817b3e49c983210277c2c7c5b0db187422532fca98a28b3b659c6b815ac126fadbe2f400c73e9d2dedcbbd2d3a365ffad7e666c896e31e61b384ed3a9fcf1290538df11b9474c6281cc592c71c8808868b4292c17ece6b3edf5e3542a70b911593e93f35ecd9729bd8880a24eaf41fbc6574dfe167ec2d0e7ab3df5ec34b8b55d548ab93738a2eeaf21c884c5c8551db2edf2b049f1a2a84fa72ac8978a4c27809f209c1b2195aff504f699856cc4f22d44ebdd0fe50374468d0b1792e574b5110a1f4cd0e221e824a78ddc4845feb46d66d633d23cd23f4b6fbe4c8ce16cd1af61536da5fa67b10ac7555a68c0e0bdbf2f8d72309d995516b8118bf43835d0a01c08ffeba3ea3ed05cd2d54f0eabcda05d0037d52caed3b19374faf73999094f79055924bea9aec4470135f5e8bf183c9d1c9", "signature": "050ae8aeceec9627b80137357a22962ac8b45048661708d394d0a51aadc381fe8535023d6e1bda0e72b349b50b26da7c3a3085e81e9dd6cf127868fc5baeab01" }, { "secret_key": "e95cc2a4d1193b7539fcbbeaaeed985b6fb902dd0efbd6387457550d0d6a2fea", "public_key": "72a1ff1e9bb11c8d88968a7b169637adee438e2263f006dca4fe02fe066cbad3", "message": "84267439201b0591db60c0f17a9c15e45409295652d5f55b87fb351967c846a567f5cebaaed1762bff5485f04853ca9269f464094e512df1f02e13e517b1daa58d34caa2d5ff9f9e79bcafb4ce96e8a089258ad61343b446628ebc4f5b2a84d03b72ef3f738589fa13c42519a828299a3faec035037bc10b44e3bdfed9e0870717cbaf31bef8b22c4ea16e8157fcbc63eefa39ed822efd4215c247dda48786277ec030a86c0ef4851d673cfe752d0677883c2c452038970c09bd481714bc3fbecfa4ff2a3c245695d7ecc2f4dec7f5ede04ff6db43e2bb91c066b649ef73fd3be860cb83fa80b074149f431eebb917ec8478da870c11e317703859f9f2f4008a6c7c754b06e1f7d2479689da84e88922f38274985e11ce13cdbdb0f2ece68fb602ade03dd549a362491f4a203ff80744f663c523a026b431aad45c5829e029ad6256d1276fd7b7a12ddbf1727d9e233fb534457370a426e56fb39cf404a3ecbf0c4b50bb522dce981e0830fd8406e6d9725ceb1ddd3a1947937d90e04d768ae1d126e2aeac21b8c9efc54c40961b7f4e9e88025f7e0b9de901ebf0049e741b797997d8db78e9283bbb5f90f35a2c4dee273142ec258c02ad0ecc61cc5c9f12132db28af41c1fb78e524be5327b5ffc35962779fb11ff0c5d3ee0a31ff47e73b1729dfa46e8986b1b89abc88ad06abd5b6f766d23abf642257894ebdfa79e6309f1272374ee9433677ba13e451baa95330e660c8052ae872e0e32e2b2d1286d01a0ab5810424ed8b9405465bdeba03b698384676fe5ea464a03446c4f7cd7b43312ecf151360464571ad28610581fbadb945a1d68181deb403aa56eba0bb840328eee36103c7de073a6879c941c7554c6f6f2a080809eb0e5bd0e130f29a229e930db01fecac2e036bdf0e001e2a8ea3264f8649d5b60c29103f0b49c24c97facaf7e81069a2b26ab3f933f427d81272c6c8b7cd0dfb7c6bbe9c0eaab32bbda2218b9623a2119aab1f3eb", "signed": "1b8d7cc2adf36cae1631250c82431bd88437163a6349ad96e7a864447e9fee753ac3655c9835b4d1ecbb306c638ba5402ad02ba6d225d96882889fe8d204a60484267439201b0591db60c0f17a9c15e45409295652d5f55b87fb351967c846a567f5cebaaed1762bff5485f04853ca9269f464094e512df1f02e13e517b1daa58d34caa2d5ff9f9e79bcafb4ce96e8a089258ad61343b446628ebc4f5b2a84d03b72ef3f738589fa13c42519a828299a3faec035037bc10b44e3bdfed9e0870717cbaf31bef8b22c4ea16e8157fcbc63eefa39ed822efd4215c247dda48786277ec030a86c0ef4851d673cfe752d0677883c2c452038970c09bd481714bc3fbecfa4ff2a3c245695d7ecc2f4dec7f5ede04ff6db43e2bb91c066b649ef73fd3be860cb83fa80b074149f431eebb917ec8478da870c11e317703859f9f2f4008a6c7c754b06e1f7d2479689da84e88922f38274985e11ce13cdbdb0f2ece68fb602ade03dd549a362491f4a203ff80744f663c523a026b431aad45c5829e029ad6256d1276fd7b7a12ddbf1727d9e233fb534457370a426e56fb39cf404a3ecbf0c4b50bb522dce981e0830fd8406e6d9725ceb1ddd3a1947937d90e04d768ae1d126e2aeac21b8c9efc54c40961b7f4e9e88025f7e0b9de901ebf0049e741b797997d8db78e9283bbb5f90f35a2c4dee273142ec258c02ad0ecc61cc5c9f12132db28af41c1fb78e524be5327b5ffc35962779fb11ff0c5d3ee0a31ff47e73b1729dfa46e8986b1b89abc88ad06abd5b6f766d23abf642257894ebdfa79e6309f1272374ee9433677ba13e451baa95330e660c8052ae872e0e32e2b2d1286d01a0ab5810424ed8b9405465bdeba03b698384676fe5ea464a03446c4f7cd7b43312ecf151360464571ad28610581fbadb945a1d68181deb403aa56eba0bb840328eee36103c7de073a6879c941c7554c6f6f2a080809eb0e5bd0e130f29a229e930db01fecac2e036bdf0e001e2a8ea3264f8649d5b60c29103f0b49c24c97facaf7e81069a2b26ab3f933f427d81272c6c8b7cd0dfb7c6bbe9c0eaab32bbda2218b9623a2119aab1f3eb", "signature": "1b8d7cc2adf36cae1631250c82431bd88437163a6349ad96e7a864447e9fee753ac3655c9835b4d1ecbb306c638ba5402ad02ba6d225d96882889fe8d204a604" }, { "secret_key": "77ad0f942c37f0313e6b0456dabaec81b2d61f6c118ddb29eaf3ac5bf19504d4", "public_key": "692d2da5a95f48611a6da89cfb3b3540f6aa0c850d6d98deea870e397fede328", "message": "87e6dead2c85549e3d8d2588a0a3360603a624fb65aebbc101bf7f1fec18d0b28fbd5dbaeed38752cdf6355ce8dc84e18ac1a4393d2ab888882c4ff1c9c8137f83bee36336bcbfbb72d5049e0a400874514fdc3633046e89383dded93ca31fde0d898e11e9268d3d5c240666ed5527613da79fb7e49625b44cde78b41c67902eb0216b3a7a3e560e261d71d764aacf15959c17fcd6176fb25e249ee6bb1b3bd7bd90f60b0b0ffa0315a065a24bbae8f255bf298d7e4d44f0b430c415b4fb36cfa6626a83f49a2567f6244f40e923add1d49a72f57b1530f5b379de3a91c2e9a1ac79ab37bc3b9ba73d8828136bcc87d2c01190de5457facd90f369553f7ac521c5672b0867dfa8da3b952ad95b67dab99b4820572f2d4a298e9518637779289c031b793dee859cde7b24add649fff871248a6602d2516279da6058cbb696fa8b1d89a20d2099e646443210483e5d4134e928faeb38a3b508199e0d69bb55ee34774205c0a61205b50b08febeaa401e6e3a51a2bf98efac78b7ae2b852c5395a12c40e2c7dd1b202504b5a7d2f7e4fd4f8610930d2868cba8864339e041da21c0715f41b2b23d14d0b545480bc3bd7d7215cf2f816a3332081ecaa08c0f8b99525251f57231b6750c2dbd1109ac4160486b768324b6bac87ef5a226448c431240328f42cca586be7aff3cbe7605fa341514fccfb966af3d4530e8cd9037a11ce593c2d383e1035a0c2eda098de90d50c5184a9c01b57f26b94dedd1454c340637ecccee70625754a328c65f42645b5e1a5655eef97dfb1c6308edf49fa368d17d17e06adc512b3973ea652ac40a9978e1bb1b2f86c5a9ffbf60dcc4f6bbc98a64f4de65e7ec61721edeb0e5238456f761d2d1293af0de9f793b11d8cadf01a94319a02a4273ffc4d3ffa7b34d74fd2e0b100fca58b5325f907a749193e751d6c116687aee3747b59460d4ef156e72476eae1b8455d76e71b306b98129b72fe1cb5eb405a7c2f4327f3862d4", "signed": "696bd552dd01db80b3d67d61eeb7ecc56878404ab119442a1c7422992cfa35aea920825d2dafd892ad7eb6825ad999aee5c83b7b507906534f91ace759c5510c87e6dead2c85549e3d8d2588a0a3360603a624fb65aebbc101bf7f1fec18d0b28fbd5dbaeed38752cdf6355ce8dc84e18ac1a4393d2ab888882c4ff1c9c8137f83bee36336bcbfbb72d5049e0a400874514fdc3633046e89383dded93ca31fde0d898e11e9268d3d5c240666ed5527613da79fb7e49625b44cde78b41c67902eb0216b3a7a3e560e261d71d764aacf15959c17fcd6176fb25e249ee6bb1b3bd7bd90f60b0b0ffa0315a065a24bbae8f255bf298d7e4d44f0b430c415b4fb36cfa6626a83f49a2567f6244f40e923add1d49a72f57b1530f5b379de3a91c2e9a1ac79ab37bc3b9ba73d8828136bcc87d2c01190de5457facd90f369553f7ac521c5672b0867dfa8da3b952ad95b67dab99b4820572f2d4a298e9518637779289c031b793dee859cde7b24add649fff871248a6602d2516279da6058cbb696fa8b1d89a20d2099e646443210483e5d4134e928faeb38a3b508199e0d69bb55ee34774205c0a61205b50b08febeaa401e6e3a51a2bf98efac78b7ae2b852c5395a12c40e2c7dd1b202504b5a7d2f7e4fd4f8610930d2868cba8864339e041da21c0715f41b2b23d14d0b545480bc3bd7d7215cf2f816a3332081ecaa08c0f8b99525251f57231b6750c2dbd1109ac4160486b768324b6bac87ef5a226448c431240328f42cca586be7aff3cbe7605fa341514fccfb966af3d4530e8cd9037a11ce593c2d383e1035a0c2eda098de90d50c5184a9c01b57f26b94dedd1454c340637ecccee70625754a328c65f42645b5e1a5655eef97dfb1c6308edf49fa368d17d17e06adc512b3973ea652ac40a9978e1bb1b2f86c5a9ffbf60dcc4f6bbc98a64f4de65e7ec61721edeb0e5238456f761d2d1293af0de9f793b11d8cadf01a94319a02a4273ffc4d3ffa7b34d74fd2e0b100fca58b5325f907a749193e751d6c116687aee3747b59460d4ef156e72476eae1b8455d76e71b306b98129b72fe1cb5eb405a7c2f4327f3862d4", "signature": "696bd552dd01db80b3d67d61eeb7ecc56878404ab119442a1c7422992cfa35aea920825d2dafd892ad7eb6825ad999aee5c83b7b507906534f91ace759c5510c" }, { "secret_key": "29321469ee9f2bb165a069640332b489bf5c3fab682e93dae9d86317bf50c52c", "public_key": "96f730f8ef8970268dba0f7570410b6188a1a3c86397740913d53ada262ab87e", "message": "9c712c83d54f2e993ca68a9632846004499c5195448ddc491c3a0d2e3a666d6b33098e4864fdf86e619d50f10b7cc6c39b3ff2801a9491f6fa97c5f1c4afa7aeff31d738f9a768a79c73b25577310fb0ad4faf8543a098f859571b6148e8b52926445757d5549fd25a26518531566379d1c274e6c6a9d64132e4ac25ac9af9381bcb885332113f43014a139a81f8d43c8a6ab54c11a5c92e06191c1e51b757ac9f11e3dc15db4486d167ff9f2d65e23e6c96223d9aff8d10d1502cf3dbce5e357e6b12dbe9b7e997c3d0a507d3bae3cfef1ffc8d056ef7dc72ddc1c81e310ad205be16e77f2738354b10b484d3076c27e6b4f166388581f350befe22fbb082b54121ee59ecc7ae5dece89882acf26cb747ffaa3e2d05a696f60fd9e829c709d8f02daf537b2369b891fe6ccbf8dfcdd7f4a364b19985be7edec67ddc1db713c0a90fafa48837772562deacc2d2a0e789e18a8b5b3bd9e083ea92fffc3183d5d414153259b33a4329cfc80824ebcbe044a7e33ab8a24fde54bd9520aea284b0c4c4fa9427d251c0ddd013ecdd8290ef5565f608508e363589e529d84ff0f26f9ecb03052d5897fabc917e56e601b64abfe5a17c3950289d0cdcaf1f6005a9f8106f43e17adcaa2d1e269166762f8054de05135d5d1393d7000a15b87bd68846a89d5bc22863325151aac843f72278ae6f4af72a4e449adb7eae6d436a1ec7e58e59b7b8bb9ef0ddaaa001826f8dcb446479deafd8b8d542041c19a05b1e0ee47b4640910c31930ca4e20b105758ec75f1950356947f6261d0037fe30773a3ece6a96c8d5433333d822c2777ef7ff8be6033345b5055d58f5eb3729af5ae8824f331ee0731c89b20ac118f550427cd958a55f6b1a2888a087bb7db55bfc73b29429b4448dbe9119c45a87339b4497a69a4cf833e8f3770cce5e01faf5e73bbaf627683c0a28c73052fbece203043389dfbfd45495e51dab86a252e5bc1b4b7fe2807e3d0e2363beab51c67fb31", "signed": "4e1aff8463bca1b7deb1d3773df2e7a06864111b6dc42a62ae98deb2313943b3153ee46696b15c24efc2a808aaba81c78e3dfa4dfb50ca9fe84445ea68bc8e0a9c712c83d54f2e993ca68a9632846004499c5195448ddc491c3a0d2e3a666d6b33098e4864fdf86e619d50f10b7cc6c39b3ff2801a9491f6fa97c5f1c4afa7aeff31d738f9a768a79c73b25577310fb0ad4faf8543a098f859571b6148e8b52926445757d5549fd25a26518531566379d1c274e6c6a9d64132e4ac25ac9af9381bcb885332113f43014a139a81f8d43c8a6ab54c11a5c92e06191c1e51b757ac9f11e3dc15db4486d167ff9f2d65e23e6c96223d9aff8d10d1502cf3dbce5e357e6b12dbe9b7e997c3d0a507d3bae3cfef1ffc8d056ef7dc72ddc1c81e310ad205be16e77f2738354b10b484d3076c27e6b4f166388581f350befe22fbb082b54121ee59ecc7ae5dece89882acf26cb747ffaa3e2d05a696f60fd9e829c709d8f02daf537b2369b891fe6ccbf8dfcdd7f4a364b19985be7edec67ddc1db713c0a90fafa48837772562deacc2d2a0e789e18a8b5b3bd9e083ea92fffc3183d5d414153259b33a4329cfc80824ebcbe044a7e33ab8a24fde54bd9520aea284b0c4c4fa9427d251c0ddd013ecdd8290ef5565f608508e363589e529d84ff0f26f9ecb03052d5897fabc917e56e601b64abfe5a17c3950289d0cdcaf1f6005a9f8106f43e17adcaa2d1e269166762f8054de05135d5d1393d7000a15b87bd68846a89d5bc22863325151aac843f72278ae6f4af72a4e449adb7eae6d436a1ec7e58e59b7b8bb9ef0ddaaa001826f8dcb446479deafd8b8d542041c19a05b1e0ee47b4640910c31930ca4e20b105758ec75f1950356947f6261d0037fe30773a3ece6a96c8d5433333d822c2777ef7ff8be6033345b5055d58f5eb3729af5ae8824f331ee0731c89b20ac118f550427cd958a55f6b1a2888a087bb7db55bfc73b29429b4448dbe9119c45a87339b4497a69a4cf833e8f3770cce5e01faf5e73bbaf627683c0a28c73052fbece203043389dfbfd45495e51dab86a252e5bc1b4b7fe2807e3d0e2363beab51c67fb31", "signature": "4e1aff8463bca1b7deb1d3773df2e7a06864111b6dc42a62ae98deb2313943b3153ee46696b15c24efc2a808aaba81c78e3dfa4dfb50ca9fe84445ea68bc8e0a" }, { "secret_key": "04657750497e68152c43ce34a58d2106e64c557cd7a84ef05d9eb82e6bcb05f5", "public_key": "3b3a1947b4cbf60b826d609f192dc230aa9b9baf4cd6a6092e495f1d2e47ad62", "message": "2948227a890f6f845b775e62c53af3805064a1576446f085d90f8b9a5ed68df1ea393ce479c4414149a9ec5a171036424dff0344b4958f6132298d0e24c926d28ad9d79f98c6e6bcf1c5767606ecd291c6ad47b4f9fb2b0201155ada627b7a1fd5b07419874083059eb52b2f6ec22818b78246228f3fe6355dfda70ebb9bbe73229378736399557ce24b30bf645a14e2256f70019b3336b203fb77c6ec94a7a2634888feead4d72c2391e99e8c8d533fd8a42b08c11f887ab2deb6ebbfe3d251de63536c36cd53422398e544cff87b07a63349fc5085dde93a1bfd7171133a2043981f607522c8133c63428d1b92626c79b7358e7021cf1f412a78afa7cb3f59ffef9279885a5bdb2466acd34cd51580830b8351ebd440a96623907ad1f4b56203f5e159a429e3546ead0c011dbed09028717e3c3dfed39197764d4d245ef228b98044718ef4d8822f21b2c5685038473bf93dc0937451eb02d31a46c8dc7e94c3e8678c83b98a43818f125b528b476aad31d1584ffd48f149e5736e58f94205d3889e567e4dd1eac2fac1f8f4dc540e5322460fb940e12e93c4c98ded1941c1904f967fb4643684c19a4d5c441d60b0e9f40855e523fe7f99107657a68076275bf84b7c69a3f2b3855bc8026ba9b00bc6fe34b99da0631700a67f52b34e1796339887a48305121d53ab4440fc4b5c9bf72394d5ed372ff18ca3f007bd02df651dc3ac438275f1a3e52422b86c4586766a21cd89f805805dbb44fd89fe24fb2c0b40d1b754c335dbaffc3b3bb8bb46c74c36374504042d86789227599862312e99ca89eb504cc3d75d19495aa86b20b2736b121bb2075c88ed4a3fbdaa6b2c3f76d1ff5525d3a2863e4d83c72bfe01e10278809474e1822de2d96283489320029611aa9dffc4829d66869e63494f9aade70b77a7b80fbc93e3de4d935913752d045e13b312c5d082f6242d4985b053b3783eb02c6614963dc0d55d4cbe887bae29cc18979e5e2ea945bcd40d89", "signed": "7e2eae5a293f418391f6d85a7994b07c452280017ee653bf617a8d5be24cbb5d0efdfb7f7f001312260f344e6fb915ad8d7de9c0519827c05726f9ce2545dd0b2948227a890f6f845b775e62c53af3805064a1576446f085d90f8b9a5ed68df1ea393ce479c4414149a9ec5a171036424dff0344b4958f6132298d0e24c926d28ad9d79f98c6e6bcf1c5767606ecd291c6ad47b4f9fb2b0201155ada627b7a1fd5b07419874083059eb52b2f6ec22818b78246228f3fe6355dfda70ebb9bbe73229378736399557ce24b30bf645a14e2256f70019b3336b203fb77c6ec94a7a2634888feead4d72c2391e99e8c8d533fd8a42b08c11f887ab2deb6ebbfe3d251de63536c36cd53422398e544cff87b07a63349fc5085dde93a1bfd7171133a2043981f607522c8133c63428d1b92626c79b7358e7021cf1f412a78afa7cb3f59ffef9279885a5bdb2466acd34cd51580830b8351ebd440a96623907ad1f4b56203f5e159a429e3546ead0c011dbed09028717e3c3dfed39197764d4d245ef228b98044718ef4d8822f21b2c5685038473bf93dc0937451eb02d31a46c8dc7e94c3e8678c83b98a43818f125b528b476aad31d1584ffd48f149e5736e58f94205d3889e567e4dd1eac2fac1f8f4dc540e5322460fb940e12e93c4c98ded1941c1904f967fb4643684c19a4d5c441d60b0e9f40855e523fe7f99107657a68076275bf84b7c69a3f2b3855bc8026ba9b00bc6fe34b99da0631700a67f52b34e1796339887a48305121d53ab4440fc4b5c9bf72394d5ed372ff18ca3f007bd02df651dc3ac438275f1a3e52422b86c4586766a21cd89f805805dbb44fd89fe24fb2c0b40d1b754c335dbaffc3b3bb8bb46c74c36374504042d86789227599862312e99ca89eb504cc3d75d19495aa86b20b2736b121bb2075c88ed4a3fbdaa6b2c3f76d1ff5525d3a2863e4d83c72bfe01e10278809474e1822de2d96283489320029611aa9dffc4829d66869e63494f9aade70b77a7b80fbc93e3de4d935913752d045e13b312c5d082f6242d4985b053b3783eb02c6614963dc0d55d4cbe887bae29cc18979e5e2ea945bcd40d89", "signature": "7e2eae5a293f418391f6d85a7994b07c452280017ee653bf617a8d5be24cbb5d0efdfb7f7f001312260f344e6fb915ad8d7de9c0519827c05726f9ce2545dd0b" }, { "secret_key": "8bd99070c50a9fa418ef7f75c00129916a41c86070961ccb2b202be18c2d10d7", "public_key": "ddd73308fce8ca6552d039428c7a1a94923320a31c0f580d3c235280f03c1830", "message": "485f8d680f79ee2d828be7d018a65e0b64b0f0184819863e7110eea8f299a72c4dc87f8ee8a8aeaa81af91dc71adea79fc9797421ccc646e6cd5dd48b4dec1de968693fbce0d0021a3d98d38a8bbc58195e6dfc3b5e1461b2a594103e80a29441d5aaaf889e31cc865141f0c6b2c8c81f721679ea2394ec6e4081ec203c2ea397d9484757a7a0ecd53e652db9df17bea0e32fe8b2cbce0d1d97b961ed74e8e622bcdd3558b7c48695adf18aae6110ea9a339b9da407a9edaf2ab081a681e1832cc215b1f08a67d559a4744af7cd50318c206ee91157582f82eb6c0fc29027b4461c30733b8169d1481322c4860509ba096bacb71a579246751d567540e41431e14f1b46ef16eba276104bc01650d5c4926e47c9c6040784b043cd0aa4854efe8797fd0462d4539f38035aef08b4577c1a9118d004b6d01862f5276776dfef1371864f155ac0f078389c205cf0538d85fa348244d7a422911310ff6c10132b1598bb445c7e2077b763c473d1e7a61a38b64929a648b60b2e543543739224b40fbf6d87f1079c30bc873ac38991d51b89e9d261c4bccb375355c072c1ea20e4ff91d55d9f7544e90d1c6646c59af72424d8aaa8e0aed07b3889d4e450c1209684ce138d0c9da079525f5aa02050af570e4315c2fa8b099b7765bfbb894fad359b8e24804ece052ac22a191705335e98840a624e4cbf3a1a1a327812785b2c0f5d6381457b72fdb633e81938bbb54b8c37cccb5d59c5827c7683a5247544977e984442178d0852906ca6f945c4229eb08ad27e6c275d7b4ec8dc25fb2819337e53ead6c7aa787f91a7dc6ddafd536eefcbdec2c50167be34306a82e16d5d52b3b1be008a7a611274ce2cf8d62e3b900c09943be70ccc77b070637c25061d61be910eef50df18744c33e76f6701e0a8ff6297fa67e4b4108c13756727a9d74bc9e17983eec08f866b7c7ffb37f3ccb0141a80feff6322b2ac62b84ce2797fd98d6ff269a41a0c38482db679862a38cd2", "signed": "b14a7b262012c5909e21d587fb4f29a9093c8e1c2999816a82118fefbf10e68ea898bf0da18ebfd0341ea8f82a1844c8e0dd5306e509b9d0c35b473a7d209507485f8d680f79ee2d828be7d018a65e0b64b0f0184819863e7110eea8f299a72c4dc87f8ee8a8aeaa81af91dc71adea79fc9797421ccc646e6cd5dd48b4dec1de968693fbce0d0021a3d98d38a8bbc58195e6dfc3b5e1461b2a594103e80a29441d5aaaf889e31cc865141f0c6b2c8c81f721679ea2394ec6e4081ec203c2ea397d9484757a7a0ecd53e652db9df17bea0e32fe8b2cbce0d1d97b961ed74e8e622bcdd3558b7c48695adf18aae6110ea9a339b9da407a9edaf2ab081a681e1832cc215b1f08a67d559a4744af7cd50318c206ee91157582f82eb6c0fc29027b4461c30733b8169d1481322c4860509ba096bacb71a579246751d567540e41431e14f1b46ef16eba276104bc01650d5c4926e47c9c6040784b043cd0aa4854efe8797fd0462d4539f38035aef08b4577c1a9118d004b6d01862f5276776dfef1371864f155ac0f078389c205cf0538d85fa348244d7a422911310ff6c10132b1598bb445c7e2077b763c473d1e7a61a38b64929a648b60b2e543543739224b40fbf6d87f1079c30bc873ac38991d51b89e9d261c4bccb375355c072c1ea20e4ff91d55d9f7544e90d1c6646c59af72424d8aaa8e0aed07b3889d4e450c1209684ce138d0c9da079525f5aa02050af570e4315c2fa8b099b7765bfbb894fad359b8e24804ece052ac22a191705335e98840a624e4cbf3a1a1a327812785b2c0f5d6381457b72fdb633e81938bbb54b8c37cccb5d59c5827c7683a5247544977e984442178d0852906ca6f945c4229eb08ad27e6c275d7b4ec8dc25fb2819337e53ead6c7aa787f91a7dc6ddafd536eefcbdec2c50167be34306a82e16d5d52b3b1be008a7a611274ce2cf8d62e3b900c09943be70ccc77b070637c25061d61be910eef50df18744c33e76f6701e0a8ff6297fa67e4b4108c13756727a9d74bc9e17983eec08f866b7c7ffb37f3ccb0141a80feff6322b2ac62b84ce2797fd98d6ff269a41a0c38482db679862a38cd2", "signature": "b14a7b262012c5909e21d587fb4f29a9093c8e1c2999816a82118fefbf10e68ea898bf0da18ebfd0341ea8f82a1844c8e0dd5306e509b9d0c35b473a7d209507" }, { "secret_key": "1af4cf6d24ab3782867d96a1c275ceeb022c691a308e6245665d616bf67c2c32", "public_key": "19d317ea98d35ba5fa67c12ecfb32750df275d7a45b8e211a7ac47ede7712d9f", "message": "f445fdcfe28c17bd4427aea5676c0e1280841597e9d66de7d7a71723110939bed00f4ebaf9603d53c9cbf6271be547af29b2a045ec41288a7bb79d662dc210e215957fa84688c916543e5617f560e4d38f73baefc37e11914e47c515067851e8ed21393e13dd19ed9b73d98945fc826a258e957dc083dd8e535c30a54b4266dd71d113ce856b46282a18033627a98e6472ccb463ed3d96fa7b355d3b2c2a2b6010dd14f4ea3965dd87be1c429bdea8300b4b0b44458635b4979f5e3e8eb5c618d4e13e1d688bf88c7e4a3d938e84336d67be68df3435c5c99086321c02e13b4a12524b34e46a0b4d27f30d7ed4f5cecb36deadf09e7efcc755ca667568297914c6bc240627d9d09aacf85415412c0635623453278d9bf0e10eec65fc72affffa9392dc7881d1e5c760a40280f16b1475127b91b69ccb65dc4b35de10f94325c0cbe1c47019a2eaf2b4ba92d785229aacfad1826ebbdebefb7dad4b05f88243e15f279766e3321dd8dba650444d81fb0878767a9c63534bb4ba21285a2416cb8f856d11a96e0a8c8de1e1a75132f1564cd994995690bbed2ee154537fb6f279fb09c8dea6f6afabc62856e3d128fdfa79fc4976193bb9b336861e47b56dc2582393d2e544651ac85bc58e9e6a94dc4c39c4ef72538a14f856cd95c3e2790adee03ab2e52ca0ae471de502cb19e676af35f5f93d840fef9606cbe92d8bc25006105d92344588838842c3be505c7350e351b735e6cc6fb79275b27bd9ebd36ba4d060acee73b5a315ceffab86d06f2168a67065578196a0ed04a4dd71d6734837db083857ab1eb5e0eec4ffbac9544f4ec19bde194df84b1c848341574bf10daee85b8178196fb608123a808171d73ce4206ad65216ad1a5cbde40b19d6ae7f40df97ab8432e2c53a504ed122e25fb7a51c14354ab3928edeb39c29eb246b74a076f89d03504f401bd176b5cffee4b9db097c45764f51aa376704b5a7f210b3f1a905e25d67002f6557ebb749737cda31", "signed": "7eb46cd0de3155b43747d732f1045d8ef74492ad827a2245bd17102828442e43a0ce7e8b268ed7fd8d3e7b28f072795da3e070f12bc4e23eaef57b853cee880af445fdcfe28c17bd4427aea5676c0e1280841597e9d66de7d7a71723110939bed00f4ebaf9603d53c9cbf6271be547af29b2a045ec41288a7bb79d662dc210e215957fa84688c916543e5617f560e4d38f73baefc37e11914e47c515067851e8ed21393e13dd19ed9b73d98945fc826a258e957dc083dd8e535c30a54b4266dd71d113ce856b46282a18033627a98e6472ccb463ed3d96fa7b355d3b2c2a2b6010dd14f4ea3965dd87be1c429bdea8300b4b0b44458635b4979f5e3e8eb5c618d4e13e1d688bf88c7e4a3d938e84336d67be68df3435c5c99086321c02e13b4a12524b34e46a0b4d27f30d7ed4f5cecb36deadf09e7efcc755ca667568297914c6bc240627d9d09aacf85415412c0635623453278d9bf0e10eec65fc72affffa9392dc7881d1e5c760a40280f16b1475127b91b69ccb65dc4b35de10f94325c0cbe1c47019a2eaf2b4ba92d785229aacfad1826ebbdebefb7dad4b05f88243e15f279766e3321dd8dba650444d81fb0878767a9c63534bb4ba21285a2416cb8f856d11a96e0a8c8de1e1a75132f1564cd994995690bbed2ee154537fb6f279fb09c8dea6f6afabc62856e3d128fdfa79fc4976193bb9b336861e47b56dc2582393d2e544651ac85bc58e9e6a94dc4c39c4ef72538a14f856cd95c3e2790adee03ab2e52ca0ae471de502cb19e676af35f5f93d840fef9606cbe92d8bc25006105d92344588838842c3be505c7350e351b735e6cc6fb79275b27bd9ebd36ba4d060acee73b5a315ceffab86d06f2168a67065578196a0ed04a4dd71d6734837db083857ab1eb5e0eec4ffbac9544f4ec19bde194df84b1c848341574bf10daee85b8178196fb608123a808171d73ce4206ad65216ad1a5cbde40b19d6ae7f40df97ab8432e2c53a504ed122e25fb7a51c14354ab3928edeb39c29eb246b74a076f89d03504f401bd176b5cffee4b9db097c45764f51aa376704b5a7f210b3f1a905e25d67002f6557ebb749737cda31", "signature": "7eb46cd0de3155b43747d732f1045d8ef74492ad827a2245bd17102828442e43a0ce7e8b268ed7fd8d3e7b28f072795da3e070f12bc4e23eaef57b853cee880a" }, { "secret_key": "2aacc8197ff8fae1c1cf3862e3c04a21782951f8e48e40b588f8bc7460c30a03", "public_key": "9a1b01e2154f1c36a8e16b79ee7d2d05b8712e0d27a061a6d41d475778b0df8c", "message": "5d82752ce5da3180faf4787aedfb19294b4348a1d9202c85398331323e0f42b0835227e68e1156f2d4ba2fe450e6d6ef2b92d89bbbe4096e12ca8397eb2f45e676f1673aa41c959fcd30d5578853b5dbd1c0d5b3a0f0d870eca71ea13390111b258f6548b32f37a05e9744a656fd778d65721965c6d9b328600b45704770e04b099790aa7884f00d7bb7659e337210bdc23eaa71d7b016030aca6223b5569bdfc290811aac409524dccbf9babcbe4bf20946b544317ca6f2f91831c79fb273b6404eb4e61e1f7b106ebd0db9f2b1974d2f031bce25803606552c3441655efcf2c7ea52adcb30993d85f2dda79603e9415a023245a66c07a956933146f53c993c08891808b8166b30721fbd1f8a1b937d14070d786e9eb451f2ab5142f83a60f35d76ad8b81d6a57cf368fc6fcacc0c4758440d9cd595b1b0942a3655e250da983b7241546dcfbe0ae81077650295409ff9e90977fb9960cbf40a2af5177402ba2faf50db6f1a7365cf99e992429e38db43ea83fddc95a648676c0b16bc952b15de99d52f6b5233da4eae1978e8ba25e6235afbc511c76c4c874c9237922b1cef0847d07a80200cbae3c7c81fcbd0d17252ed8c61ad1954fc862e1e04444c32086fee380d1c17541322b9a60da662352e210e9ae215e353296db922339aa17d2173ec31f1c530a24b1f348a31572e1469caac808f9c76ec2731873b803ead3e54ea24bc24499b9704b3bdce81389b9d14d49527c04b3bb9e3ba6d946cea58cf786d4d28b89b41c58274035a86905ad95758c3161366ab93da81e6b4c808364e087daeea4c4c5c2aa6871937c5feaba2149f01f738f45396e66ea8063221e1c81c05255ba564ad440cb5d07cbd4bab941ea593244930bc5c289b3165d3ec8847ebc4b674c0a49f9169adef786d7767bc8f213db7d95c06e99bc11e200055b65eb79adaa01bcd2c85da43ce6370e12e349bf6d475487affdf92e20a3acded1d76f9e83e919e98def195072a50d0c571dd25", "signed": "647cdd6c1a67290e57676a78113aaadca69ac57b997715c509895b8c5c94e82c0b6aceccf3ba8bd7cf61752b1b19d13b49f15f8bfa046eb442a55cd5bab142025d82752ce5da3180faf4787aedfb19294b4348a1d9202c85398331323e0f42b0835227e68e1156f2d4ba2fe450e6d6ef2b92d89bbbe4096e12ca8397eb2f45e676f1673aa41c959fcd30d5578853b5dbd1c0d5b3a0f0d870eca71ea13390111b258f6548b32f37a05e9744a656fd778d65721965c6d9b328600b45704770e04b099790aa7884f00d7bb7659e337210bdc23eaa71d7b016030aca6223b5569bdfc290811aac409524dccbf9babcbe4bf20946b544317ca6f2f91831c79fb273b6404eb4e61e1f7b106ebd0db9f2b1974d2f031bce25803606552c3441655efcf2c7ea52adcb30993d85f2dda79603e9415a023245a66c07a956933146f53c993c08891808b8166b30721fbd1f8a1b937d14070d786e9eb451f2ab5142f83a60f35d76ad8b81d6a57cf368fc6fcacc0c4758440d9cd595b1b0942a3655e250da983b7241546dcfbe0ae81077650295409ff9e90977fb9960cbf40a2af5177402ba2faf50db6f1a7365cf99e992429e38db43ea83fddc95a648676c0b16bc952b15de99d52f6b5233da4eae1978e8ba25e6235afbc511c76c4c874c9237922b1cef0847d07a80200cbae3c7c81fcbd0d17252ed8c61ad1954fc862e1e04444c32086fee380d1c17541322b9a60da662352e210e9ae215e353296db922339aa17d2173ec31f1c530a24b1f348a31572e1469caac808f9c76ec2731873b803ead3e54ea24bc24499b9704b3bdce81389b9d14d49527c04b3bb9e3ba6d946cea58cf786d4d28b89b41c58274035a86905ad95758c3161366ab93da81e6b4c808364e087daeea4c4c5c2aa6871937c5feaba2149f01f738f45396e66ea8063221e1c81c05255ba564ad440cb5d07cbd4bab941ea593244930bc5c289b3165d3ec8847ebc4b674c0a49f9169adef786d7767bc8f213db7d95c06e99bc11e200055b65eb79adaa01bcd2c85da43ce6370e12e349bf6d475487affdf92e20a3acded1d76f9e83e919e98def195072a50d0c571dd25", "signature": "647cdd6c1a67290e57676a78113aaadca69ac57b997715c509895b8c5c94e82c0b6aceccf3ba8bd7cf61752b1b19d13b49f15f8bfa046eb442a55cd5bab14202" }, { "secret_key": "ff862156c7eab681c95efff8003e00a14f1f0d505d5507e6e5b39179df9b1cda", "public_key": "e1b89fb31114ea46107ffd0329f1066428de54708edbecf3ed9d4708cd143fe2", "message": "b3d1db72a6a985ecd70a2cff6c18c179e217d4f410fd3934969685901bd071bce6c2fb6763e10c6fa16e75a1176066b8ec81ae3a8039e71dc2cdc64a40fd62b7cee7be4ba0332fe45d0b60158652e33f8d3aff3cb4d6b021744d0dd178b1bf0a1cc1d3fe9321be28421eb88263a124f49792d079475a8c555ff5690873514b5d483e53217e0cbb12862b850fe390c8f83008086e649ac904b018350ab49157ee9bcae6c07a4b878b48e25e984fbb4d36b61d689b13468a28d1e387e0e88657f8c8ac9586a6e26cf94dff6f8264e3ff6258865c6dcf857b00147886e175df0432e32f04400e299f21188312b32dfc050e7b7e87eeaa0cbaac6be9937a5e0cc31113de7c8b233e1ce8e5d9c564fbe9f37bbd411df7a5e44e6c7ebb676d85894dccf4865e4dda0cadef2bbc55000b3a29f1f71ef4461ddc3b331d91566534c5d6d84c731376295320f80adc90288f9953554fcdf9213de6a905210d4c8064af91cd98325ef91898d33d70038202e32fb6709ca3d788fecbd1b841fa4e5e9062d64267c35cfd444fb69e2f6047f58b1c2af4cc7e4cac2f890888360592113e96ad3a857ed05eaaba6f9153ef89b93e00e8743733ec472d9b0eec1cd8fa52425c4a26bd7df73a2712bebe51ae3b25eb78db82149031fe7b281af6cb7714edf89de915f3470f153eed7f456243bb90342e190e647f39e046883ce28a892003315ea379429e9582a935eb78963396d136845f86c466e8faf2272f43ffefc2ada5601f8a6b2ac4cc6b92820917f2e0393c8faf982d6c5f4f230e27ce2278a7237747fa85a9c857bf1802c3eae0d235b5ad58497d66a0d3a9baebcc417f1833e9cc4460f975d72858cd118d7aafaf1c878297cacf71ac75676dc1b4fb51c1775810d03537f2d766278b9971bb97d3c49b51feb26d375e0cb9109574a816f84e76fc7ef072d5793c2f65ab2efd9052e6b8569f2805861c31a7344a3c44069a94320d274e271271eafa3bfe64de7537846a01e51fdae0", "signed": "4b8137042d6784757d4a9c06bc7432f4809b1c6a903542736d9a57668c20845c17d468557085c57fb63213dad3be0fa36a118f7c1aeff2562ff4b8888c26900eb3d1db72a6a985ecd70a2cff6c18c179e217d4f410fd3934969685901bd071bce6c2fb6763e10c6fa16e75a1176066b8ec81ae3a8039e71dc2cdc64a40fd62b7cee7be4ba0332fe45d0b60158652e33f8d3aff3cb4d6b021744d0dd178b1bf0a1cc1d3fe9321be28421eb88263a124f49792d079475a8c555ff5690873514b5d483e53217e0cbb12862b850fe390c8f83008086e649ac904b018350ab49157ee9bcae6c07a4b878b48e25e984fbb4d36b61d689b13468a28d1e387e0e88657f8c8ac9586a6e26cf94dff6f8264e3ff6258865c6dcf857b00147886e175df0432e32f04400e299f21188312b32dfc050e7b7e87eeaa0cbaac6be9937a5e0cc31113de7c8b233e1ce8e5d9c564fbe9f37bbd411df7a5e44e6c7ebb676d85894dccf4865e4dda0cadef2bbc55000b3a29f1f71ef4461ddc3b331d91566534c5d6d84c731376295320f80adc90288f9953554fcdf9213de6a905210d4c8064af91cd98325ef91898d33d70038202e32fb6709ca3d788fecbd1b841fa4e5e9062d64267c35cfd444fb69e2f6047f58b1c2af4cc7e4cac2f890888360592113e96ad3a857ed05eaaba6f9153ef89b93e00e8743733ec472d9b0eec1cd8fa52425c4a26bd7df73a2712bebe51ae3b25eb78db82149031fe7b281af6cb7714edf89de915f3470f153eed7f456243bb90342e190e647f39e046883ce28a892003315ea379429e9582a935eb78963396d136845f86c466e8faf2272f43ffefc2ada5601f8a6b2ac4cc6b92820917f2e0393c8faf982d6c5f4f230e27ce2278a7237747fa85a9c857bf1802c3eae0d235b5ad58497d66a0d3a9baebcc417f1833e9cc4460f975d72858cd118d7aafaf1c878297cacf71ac75676dc1b4fb51c1775810d03537f2d766278b9971bb97d3c49b51feb26d375e0cb9109574a816f84e76fc7ef072d5793c2f65ab2efd9052e6b8569f2805861c31a7344a3c44069a94320d274e271271eafa3bfe64de7537846a01e51fdae0", "signature": "4b8137042d6784757d4a9c06bc7432f4809b1c6a903542736d9a57668c20845c17d468557085c57fb63213dad3be0fa36a118f7c1aeff2562ff4b8888c26900e" }, { "secret_key": "582619ab3cf5a3ae776688bf6dbacb36330a35ad7524e49ef663687764cf6ec7", "public_key": "2002ea0a38a327e0384aeae468db0f6c8516a69609af9eee93e9ecb94b449c66", "message": "ca74284f11c56e2598d78a4ecd03b40e017a558176012b26fdf695c3de98a74f8f40a47d7978edc24ee8092bfe5e61596834deed1d9d34a0f5cdaebe3421aa19e012de865b9ee1b73479b2bd1ac982f97ed9c7cd20459c60fbb11e1e2b4eac5db6844c71d72949502bba503acec905adba25f6b119eaf9639fa8abb302dff9932d850cc44c57cf90b2e58a8b5251c126a9e28f5c761b6280e2cddd79cbd68e53ff4a6226d3bd4c961b9b9e4345a2545862c7973866f0420b898e7baea90ea4ee004042ef38a1fd956a72fdf6fd43257da9fdb96680ef4fdf9e943d265cdcf2e52e3201d5408bc6ce10e5700adf12b55ba14aa829d8691c31f24fc4a51ce6faa1f3ef2ead78e5e753446ad3fa4a84c193979aebc8309bad60814f4859b931d70414764491c6c9ed8db673c543d35185cd2888aa21c1a9203427e0ac0b1fe34c0e4a4001e0956c13cb59a3baf87c2109a888a4c9e7aa481767d8020ff35dd7c5ccec7c08e971a7e218138c90546a7ddf36ad114be58557432c2ddf34ced3379f70d4407e5879f9842f381717051b1685aa7ab0ad38541ec168f51cb688f3cd1a019a336c9f4f3f82de785c074867fdc8800fc76fba04c8ad8de10d2e9b430581be44c41ecc8fc8a616314399d18c6479f57e573b22a6ee5ce2dcc08948a0de1f0dd25b65715ab18c70c762fc3d7d600cad63226038509c19ab35b5493eee73a703731ec535c90c6f06d94d3e5f7e51a09f9f8f42c501b8504686365ceee9e0fe001329f303522146717c6a1258d0f157cbea4b5a5e3d13bc907e95fd6e8a71896a02c3106bd26a510051f1b30258ab27f875673b1337ee36b71a376e0f9e7809a67c67d9acc16c251dcb8c926c8e932516d38b7233eac6159c59cad0307c590e7131b62219145aaa355bfb4acb6af0a5500006cdd8b813fe1908602e0874c9622bb37673ba1acba414231667bcc4907ac871f87e6ce3f591c19171057a9f457f5362aeda105d18fb84f7d0f0a7da7ef8da9114", "signed": "fe9701da1aa81c55bac33638f775542b804480f34b7bfc78da9916e5246a604d390bf920c872a77924246ee8d0393b202e7b25b2484f654ac367cb0925ece305ca74284f11c56e2598d78a4ecd03b40e017a558176012b26fdf695c3de98a74f8f40a47d7978edc24ee8092bfe5e61596834deed1d9d34a0f5cdaebe3421aa19e012de865b9ee1b73479b2bd1ac982f97ed9c7cd20459c60fbb11e1e2b4eac5db6844c71d72949502bba503acec905adba25f6b119eaf9639fa8abb302dff9932d850cc44c57cf90b2e58a8b5251c126a9e28f5c761b6280e2cddd79cbd68e53ff4a6226d3bd4c961b9b9e4345a2545862c7973866f0420b898e7baea90ea4ee004042ef38a1fd956a72fdf6fd43257da9fdb96680ef4fdf9e943d265cdcf2e52e3201d5408bc6ce10e5700adf12b55ba14aa829d8691c31f24fc4a51ce6faa1f3ef2ead78e5e753446ad3fa4a84c193979aebc8309bad60814f4859b931d70414764491c6c9ed8db673c543d35185cd2888aa21c1a9203427e0ac0b1fe34c0e4a4001e0956c13cb59a3baf87c2109a888a4c9e7aa481767d8020ff35dd7c5ccec7c08e971a7e218138c90546a7ddf36ad114be58557432c2ddf34ced3379f70d4407e5879f9842f381717051b1685aa7ab0ad38541ec168f51cb688f3cd1a019a336c9f4f3f82de785c074867fdc8800fc76fba04c8ad8de10d2e9b430581be44c41ecc8fc8a616314399d18c6479f57e573b22a6ee5ce2dcc08948a0de1f0dd25b65715ab18c70c762fc3d7d600cad63226038509c19ab35b5493eee73a703731ec535c90c6f06d94d3e5f7e51a09f9f8f42c501b8504686365ceee9e0fe001329f303522146717c6a1258d0f157cbea4b5a5e3d13bc907e95fd6e8a71896a02c3106bd26a510051f1b30258ab27f875673b1337ee36b71a376e0f9e7809a67c67d9acc16c251dcb8c926c8e932516d38b7233eac6159c59cad0307c590e7131b62219145aaa355bfb4acb6af0a5500006cdd8b813fe1908602e0874c9622bb37673ba1acba414231667bcc4907ac871f87e6ce3f591c19171057a9f457f5362aeda105d18fb84f7d0f0a7da7ef8da9114", "signature": "fe9701da1aa81c55bac33638f775542b804480f34b7bfc78da9916e5246a604d390bf920c872a77924246ee8d0393b202e7b25b2484f654ac367cb0925ece305" }, { "secret_key": "2bbd830ce7def3fecea1ecd6ea0ae9c9f4fa8ffc3b1f1938c505051bab40cf7a", "public_key": "0fdfed8de3c1eaf891ce37e34cb4a2441cbbae0883383d70de2464850b4a642a", "message": "5f1edeaa3c0b2a63311d97f1c54e7e2f687170e6b46e2169cbf56c66f231bfc4a576bd2b8420bf357d3a90f8f32ea1ad9939b467254b66a1df1f5b4cbac63a5c2724260d24d8df8edb58ae247a2591e920b1a420cf8d8539ea57db0dadff1ad3e98c3172d033163cb434a766b0c118a56abdcce79c82af7bac74ed0ea024ac4ce0222d0aa914f432092b1b517804db5918a845e9cca55a87db7c2852f7dd2e48360185cc442c7930afe15dd622cc02bcd1ee778b59705f14333241588a522de24407e8e6e10d5ef3a88e3a3c4438c17f7504674fd7e418cb2f77ad0a56d2386703155e9a401c43ddb51ead5520aa7ba038e7de5331418ad552bdcd185f503a8548f55b6386e4687ca515f7c0eea570983bfb24be16f7b3003fb756e326562f2a32fe65ff844c3984c72e40dd49e4f3ae8c0f819a7939b2e736e381f5823cbc61b2ed01d9b05cf8b14648a48b0d7cbe882ac16cadd8c42aa2c70246347b4d849536a7ac22c720da3cf178725ee557a92c25b12b8b956d3bf4802e9e8a15b5ab754235cca0e5b7e55e4aece45a47e084ce1447440598ef5d4f5fdc2c98a5ad136cffbf87d3cf52f6738cca7948356092078fdf254577f55969a0c65246dac809a2fca1f60a1d929877b9a6540e88a9e6e9155938d22c687e63b387534d385e8961e5886743f95f4a7080d916624517b15336030a46714b168b83d6f9cce0606649c01f0a1d0a2a53f5e378f6aa98c384aafb3eefdb3421fa3ac98a0d3a9c029c2300ae0241067d1a4fc92e438688ea889fcb1a1a9e8634b916c60baa0c18bfcd139bfe3017bfbe16291343ce8605bb7872558c6b5fd56dfd221577edcffaa8bda34d7a11ab8cb278288e5834842676fccffaa9111bced2b3575fdd49621b76e8d129b61700eeab0314ef94d550506a4b8d1ee65508d89d0e99e9336b41d9f74aa4d722114de0f31ecf00b097f53c9aca9c7a285b58a35d70298c5c34f74b4a705308033100349f0c62f9c2ebf7dead0a77b298eb", "signed": "13ebc979a88710e3c5f345cfbb824813b308a9d5c6dee328bfd235a97de7b326de6c738f96f69831949209996852dd9c098d5808418709f2bf510d46b7f036065f1edeaa3c0b2a63311d97f1c54e7e2f687170e6b46e2169cbf56c66f231bfc4a576bd2b8420bf357d3a90f8f32ea1ad9939b467254b66a1df1f5b4cbac63a5c2724260d24d8df8edb58ae247a2591e920b1a420cf8d8539ea57db0dadff1ad3e98c3172d033163cb434a766b0c118a56abdcce79c82af7bac74ed0ea024ac4ce0222d0aa914f432092b1b517804db5918a845e9cca55a87db7c2852f7dd2e48360185cc442c7930afe15dd622cc02bcd1ee778b59705f14333241588a522de24407e8e6e10d5ef3a88e3a3c4438c17f7504674fd7e418cb2f77ad0a56d2386703155e9a401c43ddb51ead5520aa7ba038e7de5331418ad552bdcd185f503a8548f55b6386e4687ca515f7c0eea570983bfb24be16f7b3003fb756e326562f2a32fe65ff844c3984c72e40dd49e4f3ae8c0f819a7939b2e736e381f5823cbc61b2ed01d9b05cf8b14648a48b0d7cbe882ac16cadd8c42aa2c70246347b4d849536a7ac22c720da3cf178725ee557a92c25b12b8b956d3bf4802e9e8a15b5ab754235cca0e5b7e55e4aece45a47e084ce1447440598ef5d4f5fdc2c98a5ad136cffbf87d3cf52f6738cca7948356092078fdf254577f55969a0c65246dac809a2fca1f60a1d929877b9a6540e88a9e6e9155938d22c687e63b387534d385e8961e5886743f95f4a7080d916624517b15336030a46714b168b83d6f9cce0606649c01f0a1d0a2a53f5e378f6aa98c384aafb3eefdb3421fa3ac98a0d3a9c029c2300ae0241067d1a4fc92e438688ea889fcb1a1a9e8634b916c60baa0c18bfcd139bfe3017bfbe16291343ce8605bb7872558c6b5fd56dfd221577edcffaa8bda34d7a11ab8cb278288e5834842676fccffaa9111bced2b3575fdd49621b76e8d129b61700eeab0314ef94d550506a4b8d1ee65508d89d0e99e9336b41d9f74aa4d722114de0f31ecf00b097f53c9aca9c7a285b58a35d70298c5c34f74b4a705308033100349f0c62f9c2ebf7dead0a77b298eb", "signature": "13ebc979a88710e3c5f345cfbb824813b308a9d5c6dee328bfd235a97de7b326de6c738f96f69831949209996852dd9c098d5808418709f2bf510d46b7f03606" }, { "secret_key": "1a7a3c2f5481131be5f868456aa2fa90e56d52cb721c7184ebff06fed2fe685d", "public_key": "7c2ad0f2a570550326fb50a850835821676de1de127f6de1670299d814f6e3ce", "message": "c62834d9d55d1a4403e925d0a5b552da174c02f4e945dec338c1bbb2aeb4ff40020ef70ff505205cf881b629960abd62764e5a54f2b5105667b11c7d5b7a4ccc3f488bdddb958a7be9546207e6c4671897c053508e1fd83222130a7933976d2bec614ed8f9b6a6b9f4efb2a58b9d005b943e42f171b709a7313070cb2e068da39cf99922b69e285c82ad97f2d6c77922cae2b5e320e83577c0d088761ec88152c297492978a9d7a3ff67ede44c2a707cf3e2352e232f53c8782ba48928a97f8a36b20a416816e94579b9d7250a29dc8470f63a7058e2d2a99d6f0ccb530df5969505ef5c7844eb167d20f412a508fab1f8cd9c20c5eb9a417a5412b5da6a57135759fab17f6314f68df35b1772421443676f312579af6b1411535ada8f76012b69bbeb60b2897ee6607cb369cdf52f4f6ddf88cdb2630d78896f1361fea22ae634217696ff114fb42dbe4f4346f1be5b57adb384ae7e49b41f74b31b9a62bc69dca16589c634eb9d7c6c94f8ece44b60628f98e1024cf32e3e3dd6dce55a1222532f490d63e6a275281c0f3a6c101891b8d57a45de11de35ebb151c0dcd75e6c050b3cd8babae845c39f66c36c77cde05b683e4fb0103d93e7659335c87fc0e3235b2e82488cdabeb5c5c875808745eea92de86b8efcb63e16d082919aee2e92899cb0bcf1c1421577a4a0d9db09ee1f9feb92a5382103cf7c32cfe463725ae4866daafeda0534c169f8f9be404f3baae123fa768ace46178d4b9bbc5bd7aeec7903b0a5bc57538986ee09e07e32077b3b9de50dd1967a372c385ac886287c18451a64efb37d056f9f4194c08b1e3ec97022267bf0043c13d26b9ce1f53905f6e41b3d99dc81b331909b722666ef2432e6af8a453107531230ce4a1af8eed626da223da76b46507e33d7cdbde02d411040c89a11d95156ed4ac2605b826939c6cf877b4ee736c5da77cf4650a9997a3b9cf46a82ba2bc01333c04478b5c92e2498bd002f013140aedb301b95993d1d750870d988", "signed": "976160fb5bbdabe5c8962f23babacf0b0ab41c2bb13e9c0d449067b7decc7db4e94e76a71b9c0ac4d6af387a72a8cd73e3bc63b7ed650beebf17424c490bd60dc62834d9d55d1a4403e925d0a5b552da174c02f4e945dec338c1bbb2aeb4ff40020ef70ff505205cf881b629960abd62764e5a54f2b5105667b11c7d5b7a4ccc3f488bdddb958a7be9546207e6c4671897c053508e1fd83222130a7933976d2bec614ed8f9b6a6b9f4efb2a58b9d005b943e42f171b709a7313070cb2e068da39cf99922b69e285c82ad97f2d6c77922cae2b5e320e83577c0d088761ec88152c297492978a9d7a3ff67ede44c2a707cf3e2352e232f53c8782ba48928a97f8a36b20a416816e94579b9d7250a29dc8470f63a7058e2d2a99d6f0ccb530df5969505ef5c7844eb167d20f412a508fab1f8cd9c20c5eb9a417a5412b5da6a57135759fab17f6314f68df35b1772421443676f312579af6b1411535ada8f76012b69bbeb60b2897ee6607cb369cdf52f4f6ddf88cdb2630d78896f1361fea22ae634217696ff114fb42dbe4f4346f1be5b57adb384ae7e49b41f74b31b9a62bc69dca16589c634eb9d7c6c94f8ece44b60628f98e1024cf32e3e3dd6dce55a1222532f490d63e6a275281c0f3a6c101891b8d57a45de11de35ebb151c0dcd75e6c050b3cd8babae845c39f66c36c77cde05b683e4fb0103d93e7659335c87fc0e3235b2e82488cdabeb5c5c875808745eea92de86b8efcb63e16d082919aee2e92899cb0bcf1c1421577a4a0d9db09ee1f9feb92a5382103cf7c32cfe463725ae4866daafeda0534c169f8f9be404f3baae123fa768ace46178d4b9bbc5bd7aeec7903b0a5bc57538986ee09e07e32077b3b9de50dd1967a372c385ac886287c18451a64efb37d056f9f4194c08b1e3ec97022267bf0043c13d26b9ce1f53905f6e41b3d99dc81b331909b722666ef2432e6af8a453107531230ce4a1af8eed626da223da76b46507e33d7cdbde02d411040c89a11d95156ed4ac2605b826939c6cf877b4ee736c5da77cf4650a9997a3b9cf46a82ba2bc01333c04478b5c92e2498bd002f013140aedb301b95993d1d750870d988", "signature": "976160fb5bbdabe5c8962f23babacf0b0ab41c2bb13e9c0d449067b7decc7db4e94e76a71b9c0ac4d6af387a72a8cd73e3bc63b7ed650beebf17424c490bd60d" }, { "secret_key": "191a1d90321c7f4e7494bb982909a9eb40c3341dd32ae4d96750b7d02966b40f", "public_key": "9562d9e213f145c456935b7031c680669f8bbd31a4c2ed3c91c4002a5629e97b", "message": "85890db4e2fbce093dde5a80bf8fe09a984b83a49b7ccb5d4b06cdafddd382e4b8a8a50530e82c200612c9d7d8a089bc8aa845c3cfcc38a6195d21c2618c3dba2b570920eccfcd236f17f08d814268f882242ddf0702da8785f407aa8f86fecfa903c48da83f839777eb6b4a2bbf5df7a4da53475af1ffe44b5fe0072b8fbf3d26e6d89ea67d8ac8459492890ada657eb3dc2492b88de175b4bba1a508064d619674aaae2af09d31a5c27c8d5d5a29b03779f4286b8966ce407e6ff692fb942520a9938d69cc70acb06b014b6dfc19834206cf1ac6c448ae6f078025b55f3d827201268a92add9ad178ef76a2989fedc6e39f4ebb9f96c9b8352694fa54fa022019c0ec0012d0d769e2367803f925f175f9fb9cbec4a0c9c1e2c83ea57e6a92a17f555cab934271e72c8cc3215fcb87c20539bf14277b1bfbd6e5880ef953fc75f23c0dd4fcc1e0be340af947de02e877fd5c77dd1df7b414b5c0b40c74956a545a115b0c6993ab233b7e72c822b6b3381bb1fc10875bffe3e2ed1190fa33fc15da083794fcc2c5bf5a07909063cb289a08a2c8a33d343842c2d6a3cfa2a16ca2eafcab7ea100d1c714baabb7149f07e25dee323e780757dfa8016faa7c0626222c365f8f2f6687d1ded234f799cc50d1cd26b4cfa4045917056fc79c3b88b2b1908e372df66dac8734631648349bc37fa34b25fff3b0747b6bc16b94e3e5895e4bbd93d478a6c1f75e4fa30faa922049ed4c50f12f4b312a8974d0fed8d44255dcb2bf0febe47fb3fb8ed9903b5ba4ca18e3cc6762cfa1eaf04dfa944d496e0fe8bb7dc045451396bfaba5485d9d5f391a954c3714253ccd9b19964d4280680720783036b3abfaf2884583ea5bdbcf69d08897ab288314635abb4c2964b71ad9291feb5b61f80e9b0cc07f912a8e5598d5548defe0eea1c448573710aacddb152f93c7c6fd3f7e4ed9f7442a6b900f23c3c544ce5c9ba5f5e92aafd11c9ff5f79c08b9d045fef07970625f62e2f4334a4d664caf7", "signed": "74cb028dc6b75b37a1daea1cf88465db83a0093fecb22d99ba855e9ab59d05cb22c87d0b09df7c116213baa8f189b2703ff953cd202eb9dea3976ee88f5fa70385890db4e2fbce093dde5a80bf8fe09a984b83a49b7ccb5d4b06cdafddd382e4b8a8a50530e82c200612c9d7d8a089bc8aa845c3cfcc38a6195d21c2618c3dba2b570920eccfcd236f17f08d814268f882242ddf0702da8785f407aa8f86fecfa903c48da83f839777eb6b4a2bbf5df7a4da53475af1ffe44b5fe0072b8fbf3d26e6d89ea67d8ac8459492890ada657eb3dc2492b88de175b4bba1a508064d619674aaae2af09d31a5c27c8d5d5a29b03779f4286b8966ce407e6ff692fb942520a9938d69cc70acb06b014b6dfc19834206cf1ac6c448ae6f078025b55f3d827201268a92add9ad178ef76a2989fedc6e39f4ebb9f96c9b8352694fa54fa022019c0ec0012d0d769e2367803f925f175f9fb9cbec4a0c9c1e2c83ea57e6a92a17f555cab934271e72c8cc3215fcb87c20539bf14277b1bfbd6e5880ef953fc75f23c0dd4fcc1e0be340af947de02e877fd5c77dd1df7b414b5c0b40c74956a545a115b0c6993ab233b7e72c822b6b3381bb1fc10875bffe3e2ed1190fa33fc15da083794fcc2c5bf5a07909063cb289a08a2c8a33d343842c2d6a3cfa2a16ca2eafcab7ea100d1c714baabb7149f07e25dee323e780757dfa8016faa7c0626222c365f8f2f6687d1ded234f799cc50d1cd26b4cfa4045917056fc79c3b88b2b1908e372df66dac8734631648349bc37fa34b25fff3b0747b6bc16b94e3e5895e4bbd93d478a6c1f75e4fa30faa922049ed4c50f12f4b312a8974d0fed8d44255dcb2bf0febe47fb3fb8ed9903b5ba4ca18e3cc6762cfa1eaf04dfa944d496e0fe8bb7dc045451396bfaba5485d9d5f391a954c3714253ccd9b19964d4280680720783036b3abfaf2884583ea5bdbcf69d08897ab288314635abb4c2964b71ad9291feb5b61f80e9b0cc07f912a8e5598d5548defe0eea1c448573710aacddb152f93c7c6fd3f7e4ed9f7442a6b900f23c3c544ce5c9ba5f5e92aafd11c9ff5f79c08b9d045fef07970625f62e2f4334a4d664caf7", "signature": "74cb028dc6b75b37a1daea1cf88465db83a0093fecb22d99ba855e9ab59d05cb22c87d0b09df7c116213baa8f189b2703ff953cd202eb9dea3976ee88f5fa703" }, { "secret_key": "628563aa3ee2fc611bcff78bfb2a75e9fd8780e87a939499a61beaa6a4b71913", "public_key": "da20616ee4a41c2ebfdc50ab54953b6d387b06c6def75796b08809565c6cf805", "message": "056fb954fbe6a6014fadac1e1a9f56cc08af37348ebaf6920683384efa47626ccddfead2d5e9e8cfff45f7ac63de63f69d12848ce3c0ef1f530ade430f0afd5d8ecfd9ffd60a79746a2c5beedd3e67249982f8b6092ee2d34047af88a81feab5d52b47d5b3f76c2041725f6f813293050aaa834b01a3a58f69aa4a8ca61f5b746f600f3d452c6282ffdca4429b9338967ba3a7266690aec75ebfbf7be98d999b03eddc7292581b0d69e30a0351a151db70412b0bfd43d3baa9d456cb3e0b4fc19cb09e6cadcb6d3f3be5137cc7a8d3219ec2036ec670ed7ec523b1b1c687b5465307882fe38d7472d0ba87a471868309d2f773ff24c87d39c16b708a4ed9af43f74c8d85cfe8ab5406907e941a14970e209c29ff7ed8a2f935ae41709f270d0d08555ef7af2edfe40df399223c785a43e7f3691589e2ea4c036f11d03d7d1eea14f620035325cf2b33baf386393e8a972a7af6cd9b8543b32e2533d1fcc3177fd96d1e13bf8b68deb222f94497265d3ccb345751bd5b669078081998d608ca5fdc134839d4ed2bebb2952fea5a39c6f033c1558f698ce4946e4f6c08af874f27357f870ebeeb2199976ffaefac951f8e17fe7d0821e1b92a90aa4e9defd3fafda052a444476db1ce38a9e176e841189abd8fecde0fbc5cb55f511f5fde07ea97deb39b7aa8dc84a3946a6cf926d39b95c11af9d64d98b807f4704d0a2bda97dad9881ada1bf6636366e60a522b4821047861c7aae2146a02eef6b25d51371a0f17d24bc187dcdd05d541c2f72201427915a3928cd378689103ac50b33f87a47e8cdfa687a5f0af8a56731dabe662f4f2836de0ba8fafd86a3854bca012d7088a00b9854c2d3c708ddf58faa355a89afc2c80f3f5336da01d72a2771a055813fb35330f7d2e01b1d12daa95ed55d3bdc5df7739cbc3ca097a41b6b2bd7f0ff9dd1d8658983ba3ff7920c15f292a1ef9fcada1c607ecb45d3a73c9ffd42f3e16022fdfe12744926395f74fb3111793fa9281821a66a01d", "signed": "c9a6aaa9b4e1cce1b58445725f61f552c8fb45831f03482798f01f663e9983db1a82fd33aba3eccb96226426d50ae17cc51274ce18a38860f40b2f82361b5c03056fb954fbe6a6014fadac1e1a9f56cc08af37348ebaf6920683384efa47626ccddfead2d5e9e8cfff45f7ac63de63f69d12848ce3c0ef1f530ade430f0afd5d8ecfd9ffd60a79746a2c5beedd3e67249982f8b6092ee2d34047af88a81feab5d52b47d5b3f76c2041725f6f813293050aaa834b01a3a58f69aa4a8ca61f5b746f600f3d452c6282ffdca4429b9338967ba3a7266690aec75ebfbf7be98d999b03eddc7292581b0d69e30a0351a151db70412b0bfd43d3baa9d456cb3e0b4fc19cb09e6cadcb6d3f3be5137cc7a8d3219ec2036ec670ed7ec523b1b1c687b5465307882fe38d7472d0ba87a471868309d2f773ff24c87d39c16b708a4ed9af43f74c8d85cfe8ab5406907e941a14970e209c29ff7ed8a2f935ae41709f270d0d08555ef7af2edfe40df399223c785a43e7f3691589e2ea4c036f11d03d7d1eea14f620035325cf2b33baf386393e8a972a7af6cd9b8543b32e2533d1fcc3177fd96d1e13bf8b68deb222f94497265d3ccb345751bd5b669078081998d608ca5fdc134839d4ed2bebb2952fea5a39c6f033c1558f698ce4946e4f6c08af874f27357f870ebeeb2199976ffaefac951f8e17fe7d0821e1b92a90aa4e9defd3fafda052a444476db1ce38a9e176e841189abd8fecde0fbc5cb55f511f5fde07ea97deb39b7aa8dc84a3946a6cf926d39b95c11af9d64d98b807f4704d0a2bda97dad9881ada1bf6636366e60a522b4821047861c7aae2146a02eef6b25d51371a0f17d24bc187dcdd05d541c2f72201427915a3928cd378689103ac50b33f87a47e8cdfa687a5f0af8a56731dabe662f4f2836de0ba8fafd86a3854bca012d7088a00b9854c2d3c708ddf58faa355a89afc2c80f3f5336da01d72a2771a055813fb35330f7d2e01b1d12daa95ed55d3bdc5df7739cbc3ca097a41b6b2bd7f0ff9dd1d8658983ba3ff7920c15f292a1ef9fcada1c607ecb45d3a73c9ffd42f3e16022fdfe12744926395f74fb3111793fa9281821a66a01d", "signature": "c9a6aaa9b4e1cce1b58445725f61f552c8fb45831f03482798f01f663e9983db1a82fd33aba3eccb96226426d50ae17cc51274ce18a38860f40b2f82361b5c03" }, { "secret_key": "9141f79ed30bf600611a13f367b40396f2ec839c5612bbf1e6e497f83954bc88", "public_key": "f14eda962640becb66c4d1f1a021110251917b8b1d34828298d32145baf6e5d9", "message": "8fecaa7ae9a3d4a4851a66362b366e167b9f4300fdab205654751987f085de61bec9344aa86f5e5c6477514c2804ced7ac0cd0628529a3a1599236ed67bebe1f2e95aa151fe0f3b3011a1d4be9901cafab2f1891904d4bff0128c1d35ececb322b3cc01dacc5ae3dca6914a7d34da8c9657b950f89d1d6aec3299bb690111071fa87282774943d96a4ab7c3d6de7d1bf119363068cc82d45e4b76454c608bc3566b7f9b385cc7eb38ee429afc2da99669fc5c1be82161a1b0c33f7ba9ad4419d2062971901db003bfa23c44714995cb06bfa966e5023aa9346fd375ae2a1e84084314df3f08ce20800c2c2adfbb81366f6b104243d62d5041e7273433f17581bf93f4c6146fa966f638ab07ea16694a7ce305cc609a6e10623ff7f6c7916b6e4dbdebb7b52eca7f0d5187ff664d7c370ed22886aa2671329d928e0a3bea3b4711a128b9aab90266f8651d220b9cc1cbf5b1ce7265931803690d3291c01ead4dbc3329a97e85c4fe1d356608cc9e60b05bc14838a8608279a0061de28ff7b8e81f59c8a8c5523924c4c485e6ea80ac81750bb0e419efc7858cd4af50c8b8c80650facab4d8258f9cafa0310a007cccbc4185c82fd146df1d811879da3650d5716f1004b71d2c7f2bd6503c354589f8602c950a1f5139f811460752880a341116630e4ff84948e74a9eb350d64d8293002200233f209b17d78897c7ce6ce29e29f82d4ad6c61eb79f5739cb668b21a745555c96e19526845e82c6ed2b1c6bdd6364b8fc79ba9a32dbd3f8b975eb923623958ae0daa4ffa139217c00e021f937e9b791c37991a35e5231a1914c045a787432f97b8e2063db105e14da979c1c4cba785210eb02011334b230cfb6831998ccce25386f4f3ba0dce2006e9c3940b4d5a56aaccdcab02718689816360f18852fd1998a99fce9a04da3f5e23af94c6e8a5badfd39304b9e2a376a1f9bac09a85bd042476e26b58ec73f1236d41ab4b4e7a54def9d66a38f8e546de7b388e1e7d6681e5e2a096f160", "signed": "cf202d7f2f9ed117f429502b2a5aff54a7f751d2171515a4d203753446df0ebac86984c88bd42bd1fb8dcb408776722a38f32cceb25f32a25d7393f138eedf0a8fecaa7ae9a3d4a4851a66362b366e167b9f4300fdab205654751987f085de61bec9344aa86f5e5c6477514c2804ced7ac0cd0628529a3a1599236ed67bebe1f2e95aa151fe0f3b3011a1d4be9901cafab2f1891904d4bff0128c1d35ececb322b3cc01dacc5ae3dca6914a7d34da8c9657b950f89d1d6aec3299bb690111071fa87282774943d96a4ab7c3d6de7d1bf119363068cc82d45e4b76454c608bc3566b7f9b385cc7eb38ee429afc2da99669fc5c1be82161a1b0c33f7ba9ad4419d2062971901db003bfa23c44714995cb06bfa966e5023aa9346fd375ae2a1e84084314df3f08ce20800c2c2adfbb81366f6b104243d62d5041e7273433f17581bf93f4c6146fa966f638ab07ea16694a7ce305cc609a6e10623ff7f6c7916b6e4dbdebb7b52eca7f0d5187ff664d7c370ed22886aa2671329d928e0a3bea3b4711a128b9aab90266f8651d220b9cc1cbf5b1ce7265931803690d3291c01ead4dbc3329a97e85c4fe1d356608cc9e60b05bc14838a8608279a0061de28ff7b8e81f59c8a8c5523924c4c485e6ea80ac81750bb0e419efc7858cd4af50c8b8c80650facab4d8258f9cafa0310a007cccbc4185c82fd146df1d811879da3650d5716f1004b71d2c7f2bd6503c354589f8602c950a1f5139f811460752880a341116630e4ff84948e74a9eb350d64d8293002200233f209b17d78897c7ce6ce29e29f82d4ad6c61eb79f5739cb668b21a745555c96e19526845e82c6ed2b1c6bdd6364b8fc79ba9a32dbd3f8b975eb923623958ae0daa4ffa139217c00e021f937e9b791c37991a35e5231a1914c045a787432f97b8e2063db105e14da979c1c4cba785210eb02011334b230cfb6831998ccce25386f4f3ba0dce2006e9c3940b4d5a56aaccdcab02718689816360f18852fd1998a99fce9a04da3f5e23af94c6e8a5badfd39304b9e2a376a1f9bac09a85bd042476e26b58ec73f1236d41ab4b4e7a54def9d66a38f8e546de7b388e1e7d6681e5e2a096f160", "signature": "cf202d7f2f9ed117f429502b2a5aff54a7f751d2171515a4d203753446df0ebac86984c88bd42bd1fb8dcb408776722a38f32cceb25f32a25d7393f138eedf0a" }, { "secret_key": "695c960bbb0dd57ffa36151c85de735154fe5ad5f5fc77d005a0a32011deb30c", "public_key": "34125e4e21f789ed0e1180c1f6369c721dcae9859b6f7b04f957e51001eede8a", "message": "3706696c7a906690d0d3b71e7e211c7b067168f3a8f1ed984a0a5e6078597662e4e7889d52db0f78e0d5ef0e5f7a0a0f4263b6848b0725caa4b1cea6987409511c8e5e982d3f5b82bb56a4a7947121937f8e105c5a14b53e6c37cc716b1eba922421828b046f6856c44fabf13a7516c62a5ff98568450cee78b140335047bf1ca77e1549a894feeb078045e4641832253bf695485452ec369065a60029a6c9077a379db20485ea2edb6c969547bb2653289bc6e81ffcb84bdbf773ddea4b3750e9a72395d117f644b0e22061d4f3bb7c5b612e4b70395e0779516b46659116902fd0fbcd2340eea45e9c23db2564a5e11dc79e8f4b332a443ec35aad9604fe791252088295e84f65a307312550d9ebf61f367e4a0f2b5623e53ef6bc132825fc24ebee4ebf338cbfb5df69b32d030d447c44f313ba96fe07bbfe5b0166eaecbc619bb6b2e5924010ba3ec150ff6a69fec4ded9c442f98c15e77f319b4843b3b748b5d26089a76c2b834ff93c413e04ca9550cd211ce2d6a583d782575066db6dd33e8d5e8374355d068a5eb96f8b3da8dddfb5baf5c596daaf556a8f2cb5781e5042327f92ae0621eae088b5f013592e77873a81d7e068d7b8337db9f109a835b475e5caf7cea5af3b4ad6d90baaf1c73655ec676747fcdd41775b4fbe3924c3f41d8a737528d12d6156653a22358c6821426b2c0a33e1634c62c7c8385649bc233e7daf9439f09db9bd11ea01e28b77ecbbc4590e29fdcf0fdde152f6478132fe4c3a5b45a7305af6e381cadd72496e66bbb866cea47f7e7d7e63341600af3f49ce9c9e4e37394df5df71dc10cd391fdcb8a193dc98fc19059fa3ac230ec5476bf94d85556ace6e1ba32421bf59dcbe05c5e15d34c6644e27d0a02be97fa8387ee03706f22a8f4b3b4040ad7d3f8a86971a20a09ec81b7696d834c526b8e51cb97d27643f9abf5e29ffd0333f95de15d110c2064ca49467c14ef227f4babf1a55e7b1cda0429cff256be31cf116719a81b9c5fb75fdf64e", "signed": "4af41c554d990812686c329a875c41ee24b4a7fd7b3d4f8c8d5275f2e7cb242b258b5858a466de595ce2a2177e351c7f08c7fc4e0bf97ec5fb2dcb8252d2c90a3706696c7a906690d0d3b71e7e211c7b067168f3a8f1ed984a0a5e6078597662e4e7889d52db0f78e0d5ef0e5f7a0a0f4263b6848b0725caa4b1cea6987409511c8e5e982d3f5b82bb56a4a7947121937f8e105c5a14b53e6c37cc716b1eba922421828b046f6856c44fabf13a7516c62a5ff98568450cee78b140335047bf1ca77e1549a894feeb078045e4641832253bf695485452ec369065a60029a6c9077a379db20485ea2edb6c969547bb2653289bc6e81ffcb84bdbf773ddea4b3750e9a72395d117f644b0e22061d4f3bb7c5b612e4b70395e0779516b46659116902fd0fbcd2340eea45e9c23db2564a5e11dc79e8f4b332a443ec35aad9604fe791252088295e84f65a307312550d9ebf61f367e4a0f2b5623e53ef6bc132825fc24ebee4ebf338cbfb5df69b32d030d447c44f313ba96fe07bbfe5b0166eaecbc619bb6b2e5924010ba3ec150ff6a69fec4ded9c442f98c15e77f319b4843b3b748b5d26089a76c2b834ff93c413e04ca9550cd211ce2d6a583d782575066db6dd33e8d5e8374355d068a5eb96f8b3da8dddfb5baf5c596daaf556a8f2cb5781e5042327f92ae0621eae088b5f013592e77873a81d7e068d7b8337db9f109a835b475e5caf7cea5af3b4ad6d90baaf1c73655ec676747fcdd41775b4fbe3924c3f41d8a737528d12d6156653a22358c6821426b2c0a33e1634c62c7c8385649bc233e7daf9439f09db9bd11ea01e28b77ecbbc4590e29fdcf0fdde152f6478132fe4c3a5b45a7305af6e381cadd72496e66bbb866cea47f7e7d7e63341600af3f49ce9c9e4e37394df5df71dc10cd391fdcb8a193dc98fc19059fa3ac230ec5476bf94d85556ace6e1ba32421bf59dcbe05c5e15d34c6644e27d0a02be97fa8387ee03706f22a8f4b3b4040ad7d3f8a86971a20a09ec81b7696d834c526b8e51cb97d27643f9abf5e29ffd0333f95de15d110c2064ca49467c14ef227f4babf1a55e7b1cda0429cff256be31cf116719a81b9c5fb75fdf64e", "signature": "4af41c554d990812686c329a875c41ee24b4a7fd7b3d4f8c8d5275f2e7cb242b258b5858a466de595ce2a2177e351c7f08c7fc4e0bf97ec5fb2dcb8252d2c90a" }, { "secret_key": "25cb17fc33d2bf8384ae4df20c1fad5c35fd765affde04b5256d4de01ca8de14", "public_key": "b86ca312fe598520c64be5c72f5b23816507f69e070f828e02d2afcfe11bfa01", "message": "4b4a71cbf8cbaf57a77d4ea188a6f964840f0d714a5f38a095a13b4e571297a88b792417d16184427f90e043dd8a55b7f1c13e00dfa60516445cbe77068c79c8c35ebeac330c33f1121d05731a8f5132d6480073274641195a75202116fff1c318817178fdd768bbdf105fa069c7a3d143fdf5d17bfad7c0624e5292068fd7bb6d303b4a27cb20a4e61875076787d19fa6f729c94dc0ba9b8c0bfd9866da5cb2e7a2cd2edbdc95ac349e5e5c2172e5a4cf7bd90cabe2c6e2245980bd72d0f6f5479881e8c4c354f68aa72841d0c73b986ba51021203161026ee3d729ddf1a049ffe9eb25439802f03011d144e50b02bd4aca5e5506d32fcf69e32f542544798f4e87f72bdf2433b1ff3259292e1d90812cffd79f6a543270baf24a3c39dd3598e1c661612922522f387d51597692f314c4d5ac4bf1883a614636336a5544d59ff41d1e0dbcf8e6627e7c8085646322dfc20c332cbdf35370d47dcabb802e17ca84780eec661c904d5bfbc240ad6a14a7533f71a27500c61dd3e473983887a86835187abb0df08fa62cda69dce86e21fa5ae954c22eddb60ee3131504a69b50486a17767091883760638a29c38030e1e05fdb28e158633010385a620613cc10d5a5f350955f4a347c65edddb7e25159da8dcc2655928ad6f6d8c4c1abb817d7fef3bae5de0402eddee7b51521ce280a66b796140f56af9bc20e465875ce2628a8a10477ce9b2eacc7d86f88272457bfd443e712526996254380f0135227e9fc151c8695e9cc64d272b256ab95c9a9f568e93716e0e53d29882e3ce74261257a02cd497c37d764d90f7fd478a17a890a8b2ea61ab81f6869b120a2f6484a88c151953391eca445015377b3a5dffe4cfbacfb5bab2c47f654f72a9d19cbc4d29537198405e3a04b4bfe11bcdb5c1f30d9ac02f54849c57aa96f7b56636116f2bb6f2583d9af94c86aff5c137f63ce54e8f0c21b6c25c1f0472a229c90817e6162eac71ccda309a1643bd6312a5263a2efe646dffe79ebd8157a28", "signed": "8ccb0dbcf7cc03e83e21c57474afd3ad8898097b972ede175acaae48e3ec17b2db06fc82776b0751c0f956fd7196f3d1c96321a6cf3d892415d8f8eeb4a141084b4a71cbf8cbaf57a77d4ea188a6f964840f0d714a5f38a095a13b4e571297a88b792417d16184427f90e043dd8a55b7f1c13e00dfa60516445cbe77068c79c8c35ebeac330c33f1121d05731a8f5132d6480073274641195a75202116fff1c318817178fdd768bbdf105fa069c7a3d143fdf5d17bfad7c0624e5292068fd7bb6d303b4a27cb20a4e61875076787d19fa6f729c94dc0ba9b8c0bfd9866da5cb2e7a2cd2edbdc95ac349e5e5c2172e5a4cf7bd90cabe2c6e2245980bd72d0f6f5479881e8c4c354f68aa72841d0c73b986ba51021203161026ee3d729ddf1a049ffe9eb25439802f03011d144e50b02bd4aca5e5506d32fcf69e32f542544798f4e87f72bdf2433b1ff3259292e1d90812cffd79f6a543270baf24a3c39dd3598e1c661612922522f387d51597692f314c4d5ac4bf1883a614636336a5544d59ff41d1e0dbcf8e6627e7c8085646322dfc20c332cbdf35370d47dcabb802e17ca84780eec661c904d5bfbc240ad6a14a7533f71a27500c61dd3e473983887a86835187abb0df08fa62cda69dce86e21fa5ae954c22eddb60ee3131504a69b50486a17767091883760638a29c38030e1e05fdb28e158633010385a620613cc10d5a5f350955f4a347c65edddb7e25159da8dcc2655928ad6f6d8c4c1abb817d7fef3bae5de0402eddee7b51521ce280a66b796140f56af9bc20e465875ce2628a8a10477ce9b2eacc7d86f88272457bfd443e712526996254380f0135227e9fc151c8695e9cc64d272b256ab95c9a9f568e93716e0e53d29882e3ce74261257a02cd497c37d764d90f7fd478a17a890a8b2ea61ab81f6869b120a2f6484a88c151953391eca445015377b3a5dffe4cfbacfb5bab2c47f654f72a9d19cbc4d29537198405e3a04b4bfe11bcdb5c1f30d9ac02f54849c57aa96f7b56636116f2bb6f2583d9af94c86aff5c137f63ce54e8f0c21b6c25c1f0472a229c90817e6162eac71ccda309a1643bd6312a5263a2efe646dffe79ebd8157a28", "signature": "8ccb0dbcf7cc03e83e21c57474afd3ad8898097b972ede175acaae48e3ec17b2db06fc82776b0751c0f956fd7196f3d1c96321a6cf3d892415d8f8eeb4a14108" }, { "secret_key": "49e24d1699833726b18c78ea6568401a971e1ca39dd06d7563ac8b4250d4a9f5", "public_key": "71cf05e90d301a6d9fad7f0b38ec8bb044fcfd97c849b04c003625de29be86bb", "message": "6d2605f61e1a04b6ae18c2c25ae100dd42a61e664e2db5c34d7ad1f84ac507552b741c2086c17c852babe07a91e129a506ee59edb9ce73be1b1d06d120ec36a1e94c6281054e78ceb1bdeffbcbf4f01051ed381bfc8ad1769f41e240bf6059d9704cacec666611f41e4dd438b7f50242ea86756bb1f81e5942c092129fbc6de4955d28dff35237db30e4a5036a9914c9f84dbd8ccf82ba2b1b3b5554a2b7a74cb0b2a1e1963345286e258dc8e7d56718035f95f313811cfbd852a0f8f49a29ef933e7cda7ed9c7e8b162cdba1a82262cd4df7cf8ea4b586db43dcc1e3764598e9ca46673822baa2ad87fb14b6fdb9e2032d0ca51c26c5ef3d9f79785fac2491cdbf7c399f3cd1774c1a6b1e4a67f5436d80db025f8fb6409e275bd0ed508b5e039ed2e4eec8b0f4d5be99dcafa6a1401252732a65b37c943c07ef3acbcfbb3dc06dad0a88f2f5eb551a3997ad6c6eed95edd9a0af4a288d5e43286b2ac072977c436b7c5ff7ab61c9484f257f58e010c9b6ad41581d742cd19752cde54d2b420d643654e9096a81eb9dcf804c7c2ed0e38d13a5ce39978cdd02b25350945de78feecc0c2c22ffd705c3ba8113265c7b9a7c8ddb59178bd21d7f6c31c6be2c36749ee0f9ab8bc1dcf5da5cb2d2d5962358f71f96ab3792a252a519e415351f43e7e12035b0328f28208cf4be529d299aa5c128c9d5ed575bf90c5350569eaa6f2d5521de1180309f686c97e9ad6fa1ec1dd8627ae8951581cf604b8b917c5ba434a637be1bc8b79f4acaf7795f4e51aabdb885077bc4f3c68fc3318de5823d7e0804ee995b70387950f799353682300d4e797f3cad611b4c562c8640ff2b3fe292916a970fb98c1475c1f4e27b9b33cfe0d3ad932a1ebe6a27fc3b446622954aee1683668c8bd4a3f903be5c77dfdb8e8914cedc51f65fed2d9c4d03e13a668d4c7ea5e31883e1b3db64363e2ac5cc54b54ce69c6ad52f874999b5dd2c5782f03c3d51505df536a1fe0d860d33eabed641a940089f1297dd0f57f", "signed": "a0b6a2af15b6be9e951ef3f32cbd1c6702e8e017fbd315a3f2599c3f1a11865d46e78459a0d7f7be046aae293cad09137ec847e26928106d9aa35e0982b992026d2605f61e1a04b6ae18c2c25ae100dd42a61e664e2db5c34d7ad1f84ac507552b741c2086c17c852babe07a91e129a506ee59edb9ce73be1b1d06d120ec36a1e94c6281054e78ceb1bdeffbcbf4f01051ed381bfc8ad1769f41e240bf6059d9704cacec666611f41e4dd438b7f50242ea86756bb1f81e5942c092129fbc6de4955d28dff35237db30e4a5036a9914c9f84dbd8ccf82ba2b1b3b5554a2b7a74cb0b2a1e1963345286e258dc8e7d56718035f95f313811cfbd852a0f8f49a29ef933e7cda7ed9c7e8b162cdba1a82262cd4df7cf8ea4b586db43dcc1e3764598e9ca46673822baa2ad87fb14b6fdb9e2032d0ca51c26c5ef3d9f79785fac2491cdbf7c399f3cd1774c1a6b1e4a67f5436d80db025f8fb6409e275bd0ed508b5e039ed2e4eec8b0f4d5be99dcafa6a1401252732a65b37c943c07ef3acbcfbb3dc06dad0a88f2f5eb551a3997ad6c6eed95edd9a0af4a288d5e43286b2ac072977c436b7c5ff7ab61c9484f257f58e010c9b6ad41581d742cd19752cde54d2b420d643654e9096a81eb9dcf804c7c2ed0e38d13a5ce39978cdd02b25350945de78feecc0c2c22ffd705c3ba8113265c7b9a7c8ddb59178bd21d7f6c31c6be2c36749ee0f9ab8bc1dcf5da5cb2d2d5962358f71f96ab3792a252a519e415351f43e7e12035b0328f28208cf4be529d299aa5c128c9d5ed575bf90c5350569eaa6f2d5521de1180309f686c97e9ad6fa1ec1dd8627ae8951581cf604b8b917c5ba434a637be1bc8b79f4acaf7795f4e51aabdb885077bc4f3c68fc3318de5823d7e0804ee995b70387950f799353682300d4e797f3cad611b4c562c8640ff2b3fe292916a970fb98c1475c1f4e27b9b33cfe0d3ad932a1ebe6a27fc3b446622954aee1683668c8bd4a3f903be5c77dfdb8e8914cedc51f65fed2d9c4d03e13a668d4c7ea5e31883e1b3db64363e2ac5cc54b54ce69c6ad52f874999b5dd2c5782f03c3d51505df536a1fe0d860d33eabed641a940089f1297dd0f57f", "signature": "a0b6a2af15b6be9e951ef3f32cbd1c6702e8e017fbd315a3f2599c3f1a11865d46e78459a0d7f7be046aae293cad09137ec847e26928106d9aa35e0982b99202" }, { "secret_key": "f8ff97032a34cf9999088058af56ff70b6acb2edf759e131faec8440fdecf6c4", "public_key": "5438b4e33f1c5ea112fb1bafef4059bf095a11409b64d46bfb4d25473c1c0874", "message": "dfb41fb9d53702cb2b9e3ffcad4ea602716f718a7ea33e21843e2a6c052c70c6c51485d72b53a5bb4e34e03e3e1d1a52518eb3e7f18f2a1e1caf78acb2116089bed4c617138e716a91431f2cf644a1210f6d1920d285994264d6466b0d8d2c62638044616f576edc7d0d93cb660131d4bb50875e153640123a96f15b75a5bcee46d5cc5eb1a431c59d2eaddfd5531502feb1551bf7791cd5989d17d10296d01ba3ae3e384c674526cab62a7c24c0ff677de71ca172621a28a85e01eefe07f6eef9c3ecfd7f9498ac42f46a43716f615318a3b28757c3a15f4f1c3822ae7a75c203a298258d753638cf425e15bbc46202b093b8e4f3e670fbb663db2b69c8fb0f625074d85a44d350e042bb1b74021d192997a2c27dd6c8634841d100a0344baed750a39ff5dcd9848dfcf09e5c8c47967b96556e2332ca17d8e42dd8f393a5445a372244600b3001b8fe86c45eafc6e738aa7e117b4a79fa2e6b00f464928d1856c83ecfe87dd34d158f5cb4e4f4d610f59717ec790bd3ff872040b67e8d3939e804e3b5db985a095621cbccd686c0934ece3e27ab2c6ce33fb52b111f48e4f274bdf320d0b02384c83c49e1a041bd2319109c85a06d8048a993357abfd811ac2f38059d077acbc36aa966c028903748625f92e8f79d51bda10f78522977f76ec4e885e49a46c68de09f3da8f86b71ae6423bd29deef1cc6a113eac115a6cde2ccd011fc1c0f0e3427f43c3e96fc4156edf62ddfb7b0836b888bab3c4345055a6c4178e9e22829fd8cfce39b0b8444eb26487cc9dc82606feaadaf4978694e6564f2729c1b13ab37c9072db4e9de940ee5f1d05884ae7fd9d9ec9cb7de56347600a88dea9208a63419fce29ee50055a374a8f22f9ae2be9805a9f47615aa59576b44042ff126a89824e36ad6bc58e06bb90fbeefbae5d6d7d62430f373b6296fbfcd4d6620168353583fbd3d5a292b9572517534e2fb0beef2fa98a464e59103e7a04287f15dad0fac54970e7715078d63ec26362f6fbabcddeaf7", "signed": "509e9eadfe8dde7914ac20cafc0b0af22b84dd8a210a4812cd8cae39b0a272e53e02246dc8939e9226920336e140b31532d068137a34161e599a8694a95ddf01dfb41fb9d53702cb2b9e3ffcad4ea602716f718a7ea33e21843e2a6c052c70c6c51485d72b53a5bb4e34e03e3e1d1a52518eb3e7f18f2a1e1caf78acb2116089bed4c617138e716a91431f2cf644a1210f6d1920d285994264d6466b0d8d2c62638044616f576edc7d0d93cb660131d4bb50875e153640123a96f15b75a5bcee46d5cc5eb1a431c59d2eaddfd5531502feb1551bf7791cd5989d17d10296d01ba3ae3e384c674526cab62a7c24c0ff677de71ca172621a28a85e01eefe07f6eef9c3ecfd7f9498ac42f46a43716f615318a3b28757c3a15f4f1c3822ae7a75c203a298258d753638cf425e15bbc46202b093b8e4f3e670fbb663db2b69c8fb0f625074d85a44d350e042bb1b74021d192997a2c27dd6c8634841d100a0344baed750a39ff5dcd9848dfcf09e5c8c47967b96556e2332ca17d8e42dd8f393a5445a372244600b3001b8fe86c45eafc6e738aa7e117b4a79fa2e6b00f464928d1856c83ecfe87dd34d158f5cb4e4f4d610f59717ec790bd3ff872040b67e8d3939e804e3b5db985a095621cbccd686c0934ece3e27ab2c6ce33fb52b111f48e4f274bdf320d0b02384c83c49e1a041bd2319109c85a06d8048a993357abfd811ac2f38059d077acbc36aa966c028903748625f92e8f79d51bda10f78522977f76ec4e885e49a46c68de09f3da8f86b71ae6423bd29deef1cc6a113eac115a6cde2ccd011fc1c0f0e3427f43c3e96fc4156edf62ddfb7b0836b888bab3c4345055a6c4178e9e22829fd8cfce39b0b8444eb26487cc9dc82606feaadaf4978694e6564f2729c1b13ab37c9072db4e9de940ee5f1d05884ae7fd9d9ec9cb7de56347600a88dea9208a63419fce29ee50055a374a8f22f9ae2be9805a9f47615aa59576b44042ff126a89824e36ad6bc58e06bb90fbeefbae5d6d7d62430f373b6296fbfcd4d6620168353583fbd3d5a292b9572517534e2fb0beef2fa98a464e59103e7a04287f15dad0fac54970e7715078d63ec26362f6fbabcddeaf7", "signature": "509e9eadfe8dde7914ac20cafc0b0af22b84dd8a210a4812cd8cae39b0a272e53e02246dc8939e9226920336e140b31532d068137a34161e599a8694a95ddf01" }, { "secret_key": "2e4c39219fc92a538e48e95fbfcfef30f5a21b78940b81053bdad4602b4c9690", "public_key": "f8eed892176620434c7f0ec53dcff39863109e7ca4d0b3c6c4b56410be01e537", "message": "c87d1fba9d94a6a5408980fc8083980fd2d252fae540f6eec19ed6746c29e339a1c29f6f53bc23fd6bfa438507eff5daf903403cda707b4dc5e844805d6b1ceb4afff4b232e8e69d7d271f3c067c4854f3d94f27fe325581faca79d1f02a26290ad23af71100c12c09157647ca9da43d7690ddcd94db65e000989c878b75a0ff22d2c70962594c9b0808f27846ccac8567bce5d2e3b7602809f23b59cd718a0805d108f31a632a05b8dfa5035ab9461aeba416009d74fdf9e007202856890d2cff80fa240b978a48270fcb2f473697bcba8e730a55c28761919a23be41da27ffea09e3559caaabf9519ec08e1ffa86817aa3e8874fa816e7718c5b2f344967ba1bc2819c4f045a97b40544ea61d717083ccaf11e9ddc04a3598ef181e7bef4acef45b6551b478a0d7731c4f08ce5802f78258d419017661076d7d6d2ef39e57cf9cd9397dcc5debf64ab82b66159f578316e74cd49f5ad2c6fef83cf08683b9570a946ad4903df4e96ec008e14a501fa9386bdaf2a63993c6c9bdf231fd09ea6f96ef4d4e29a3a3327cbf74ea831054e66ca86680c6ce53b66f9465d06b3fa0798bb6905ae38455934f2fb7e0ba472328989f001308671cccb566d222c72165bb3a744fb98e2210f9620680df3e3cd14a8bd94b5745c0016dda77f059f26053b64cf4523c3d429112fb6b328398bc630a2e906b95a6c5780cfdc0641be4751bebddf7724dc9c27e78d60ed0fd736d5abd88929c1795d473abd2b0320c540475728821867a409a2ff13cc44ce35e5981e9f6b87a28d4fa8b8675e503faefca7c1d7984737871fe919ac414eea265ee31f9f78f521f3f4f8d00c3fb79171f3c6a5dbf5e1ac8bf63b4c3d8d8bc121036e9e55bb702ea6c86e925ec0b984ded2c71f3bfd4932e6c41b582fd02ca59f53ce297445785cc4cac247b0b84e7fa0bcdcf79b3e4a155f9878c1f643be9c42f7a4f27260444505c1845bd53b550a31d7953cc738861f46bdf4870f3a77ace191abd63c45adb153909fb59ab5db9b", "signed": "394520122bb0a564648a7a8bc8dc73636c517746a3c8a05b901e7252fef0e5023d90991e311b5382d49100e52633c70fe9c26c1450e0603e6d452299af4dae07c87d1fba9d94a6a5408980fc8083980fd2d252fae540f6eec19ed6746c29e339a1c29f6f53bc23fd6bfa438507eff5daf903403cda707b4dc5e844805d6b1ceb4afff4b232e8e69d7d271f3c067c4854f3d94f27fe325581faca79d1f02a26290ad23af71100c12c09157647ca9da43d7690ddcd94db65e000989c878b75a0ff22d2c70962594c9b0808f27846ccac8567bce5d2e3b7602809f23b59cd718a0805d108f31a632a05b8dfa5035ab9461aeba416009d74fdf9e007202856890d2cff80fa240b978a48270fcb2f473697bcba8e730a55c28761919a23be41da27ffea09e3559caaabf9519ec08e1ffa86817aa3e8874fa816e7718c5b2f344967ba1bc2819c4f045a97b40544ea61d717083ccaf11e9ddc04a3598ef181e7bef4acef45b6551b478a0d7731c4f08ce5802f78258d419017661076d7d6d2ef39e57cf9cd9397dcc5debf64ab82b66159f578316e74cd49f5ad2c6fef83cf08683b9570a946ad4903df4e96ec008e14a501fa9386bdaf2a63993c6c9bdf231fd09ea6f96ef4d4e29a3a3327cbf74ea831054e66ca86680c6ce53b66f9465d06b3fa0798bb6905ae38455934f2fb7e0ba472328989f001308671cccb566d222c72165bb3a744fb98e2210f9620680df3e3cd14a8bd94b5745c0016dda77f059f26053b64cf4523c3d429112fb6b328398bc630a2e906b95a6c5780cfdc0641be4751bebddf7724dc9c27e78d60ed0fd736d5abd88929c1795d473abd2b0320c540475728821867a409a2ff13cc44ce35e5981e9f6b87a28d4fa8b8675e503faefca7c1d7984737871fe919ac414eea265ee31f9f78f521f3f4f8d00c3fb79171f3c6a5dbf5e1ac8bf63b4c3d8d8bc121036e9e55bb702ea6c86e925ec0b984ded2c71f3bfd4932e6c41b582fd02ca59f53ce297445785cc4cac247b0b84e7fa0bcdcf79b3e4a155f9878c1f643be9c42f7a4f27260444505c1845bd53b550a31d7953cc738861f46bdf4870f3a77ace191abd63c45adb153909fb59ab5db9b", "signature": "394520122bb0a564648a7a8bc8dc73636c517746a3c8a05b901e7252fef0e5023d90991e311b5382d49100e52633c70fe9c26c1450e0603e6d452299af4dae07" }, { "secret_key": "f092e6be8d2d9ad069a3e2b976d244e34c15c28c48d32f5560a54185d1501502", "public_key": "cfeb3e74e4b5c8356a81757b8f1be4b429fc18fcaf497cbf8d8bc0480ff978f9", "message": "2c255fb25d45b086c071e03e525b4d728578fbb6b0c60da941e6bf2a4898b2d5b6988c53302785ab7a3bc4bb2c205acd27d6a4cbdd1a0c0889ded784264cb7c02889c5c7113fc90bbbcd31ff001432c053f971073cf6712f667fce4698776b98cc5444c692abd1288198be5ad5674609f7e139ad1b9ccb943f8dfd9d12c54ecee278341b2ee1277991ca62cd3bfe128d1392964e9588e2f97c321704a3de106188c5eb335aa5a19acc9067b4a94129b9d1a6167c4bbfb56fb97684cbbd720c86869e0020ab0776cdc9954feba862124b073fba8de9ea9a38eacfa003ae4f1cdcbf15c32fb6b970c73115ddffcd4fa3b71846110edec257fcaed6113604f7192572577264b9905ca6aed8daec138403ca41aa954278a5720b267b90ca163a9bdf447eade8deb769a3b49237a73516977c28734555dd234ca7de4999261bc7960f536ba8a35ad3d02c75f1c2bea0a0612e7d49c40397dd6af5ff58bae6a64b6a77e981f92d159e0b2bd205ab157052f47017a3e18aec944d0465ee0017e96148a6129f74d3ccb489fea13a15a9b9aced58c6ee0e6e84e05fdadfae07b334a98fc37f7e511cd5a44e9c74e478d349e30e29aeb46a4df01e4307fe65e1394a758f6ada2fb120225ccd50a49013e6c9f175af90f3fc8c57e7a6a969a916c3f1aacc22f3e01a070cc48e6fd878e2bd073df9ee6f059b98568404fc7eae7d4bf6fa16c0c803c6be84e8b79c67affc8c88cabdeebc1134bb2386e22ba4d2e9e0f3e1ab3a0dac7c80ddeed773cda0c41dc9defa67fea37769cb4a1e1522d7e0b3d7c4638bcd983153d478be5ecf2b6ab1b40124e4222b8caa4647bd50d74d203943ab20938d5f27d908a673674046ce2ef18e858b0a01a7e7530ded0f8cc89ef09b73ca597cf73afbc9a271a4d23c92fe591883c440109c4ef416670b7f2c5905b77f65f56d09d40250356f9b1dbcaf1ee2c0b63696f84d68ddbea160085151a9526274d7b846cceb6c4348098484de3bb723ae5e85276df49f5634130ff905754f", "signed": "63cd4c0ba3be9397cc0f3c1af348ec4b8a91e42fee675da1d05900b9a86c138f9174eb996bbdf31c4295e0c578ac0f9d537641a2afd5dff93a39c5cd9d3c480b2c255fb25d45b086c071e03e525b4d728578fbb6b0c60da941e6bf2a4898b2d5b6988c53302785ab7a3bc4bb2c205acd27d6a4cbdd1a0c0889ded784264cb7c02889c5c7113fc90bbbcd31ff001432c053f971073cf6712f667fce4698776b98cc5444c692abd1288198be5ad5674609f7e139ad1b9ccb943f8dfd9d12c54ecee278341b2ee1277991ca62cd3bfe128d1392964e9588e2f97c321704a3de106188c5eb335aa5a19acc9067b4a94129b9d1a6167c4bbfb56fb97684cbbd720c86869e0020ab0776cdc9954feba862124b073fba8de9ea9a38eacfa003ae4f1cdcbf15c32fb6b970c73115ddffcd4fa3b71846110edec257fcaed6113604f7192572577264b9905ca6aed8daec138403ca41aa954278a5720b267b90ca163a9bdf447eade8deb769a3b49237a73516977c28734555dd234ca7de4999261bc7960f536ba8a35ad3d02c75f1c2bea0a0612e7d49c40397dd6af5ff58bae6a64b6a77e981f92d159e0b2bd205ab157052f47017a3e18aec944d0465ee0017e96148a6129f74d3ccb489fea13a15a9b9aced58c6ee0e6e84e05fdadfae07b334a98fc37f7e511cd5a44e9c74e478d349e30e29aeb46a4df01e4307fe65e1394a758f6ada2fb120225ccd50a49013e6c9f175af90f3fc8c57e7a6a969a916c3f1aacc22f3e01a070cc48e6fd878e2bd073df9ee6f059b98568404fc7eae7d4bf6fa16c0c803c6be84e8b79c67affc8c88cabdeebc1134bb2386e22ba4d2e9e0f3e1ab3a0dac7c80ddeed773cda0c41dc9defa67fea37769cb4a1e1522d7e0b3d7c4638bcd983153d478be5ecf2b6ab1b40124e4222b8caa4647bd50d74d203943ab20938d5f27d908a673674046ce2ef18e858b0a01a7e7530ded0f8cc89ef09b73ca597cf73afbc9a271a4d23c92fe591883c440109c4ef416670b7f2c5905b77f65f56d09d40250356f9b1dbcaf1ee2c0b63696f84d68ddbea160085151a9526274d7b846cceb6c4348098484de3bb723ae5e85276df49f5634130ff905754f", "signature": "63cd4c0ba3be9397cc0f3c1af348ec4b8a91e42fee675da1d05900b9a86c138f9174eb996bbdf31c4295e0c578ac0f9d537641a2afd5dff93a39c5cd9d3c480b" }, { "secret_key": "01a247943afe83f036b6b60f23d97774fd23208edc31cf3d8820e9dc63661103", "public_key": "8c97a58be0e847c48a6a3987cfe250a8d7b07d97f961f6b7b79e7d8042b8bd7b", "message": "08d81495da77f407255cc41a818eefa727e2c47ae411f4b541f01f811d906d55fb1e3c9c484df30565364de9dcb9fea0af66112fe75fd11ae81d2641b547589f8b974a97e7976ed692aad640edd288bd863d11c4ca9836f9d7c115c3d98830d64247cb6f8fb603c6981133552a3204041961bdd83e2f9deba770c0394f9b602a453551074921a3de28321369d7f8ca640c45109e8f522c97ed9f35b9277a350e295931b42e0135e94a92fed363d6cae392f7c45199327e24b4cfa5898ab599ae7bd50bd3a00c0d007e95faf8f2ae103802ca7e53b279184d06905f5748ca8be1f72e668cb83283dd00406491f8b9b4e5a9d4a5438b2fa4371e0b05686f87575baa796e302f08ffc425662750a33a0c9cfaa4b4d7041f9264fed7be4f9fde2cac68a2158236f6ac43047e911f4c4e8bc663fdd50517dfaa8fbcd219dd7a0e9369f43d0dd25b4f0cf930f20b7b7c6db9d5be0c6e1960941a3e04d141c03e5961aa33e9024477d533c995378796bf2292ade922695b14569fc339b3d9085c63fc6e5bef4d990c80333a6b57af478f938e3ee738b1d129bd976afe686128bcac08ccbeb0349b9b537313bc7bf591c65d4a7123ad30bdbe1486b428084748b6507f6f5ef67c26ca862cf726aac140b861ae0dc74bb3c0b489789f17145e9a855a3e2b5daac418d8353733239ef69c7b565b5303eb87bd7f649abf40a2f135a29ed27e3be4c12cd6ddd2e5418a99974383663f5849bf3ce5532bf64a80aa521191d25390bc19a45eed1d3feca1d9fcc0db031bfb48e450be3d4593356d5ba0f31047b457745f21e32ebea3ca6c35f05d78d8c31640b0fecb9401165675c7f9cbb19bc4b5677c2ccedc4e7aafb84184c19199aca0db21cf5067dc3af769bcc629355ff7257a9efd71a6a92d130d35abee6e70605b5cab93c028fac3aa2344ba861ac1e8ce9a4b070c3df740d28c5ece0f1bc31c2d7d1e5ecc76104480939133a18660e4a3e4846b2517be3b8e7afafe078391d8aa8e5c30137e85d94d64a279fbee", "signed": "ed2ced1a4fddb3442a637348179a6a5beedcb44c8e988ca26f78936d2c8db5c516d54b8c4f08d91dd7042ab6ab26d87f230eb2b2156f3ce2994fce7c2b0f100e08d81495da77f407255cc41a818eefa727e2c47ae411f4b541f01f811d906d55fb1e3c9c484df30565364de9dcb9fea0af66112fe75fd11ae81d2641b547589f8b974a97e7976ed692aad640edd288bd863d11c4ca9836f9d7c115c3d98830d64247cb6f8fb603c6981133552a3204041961bdd83e2f9deba770c0394f9b602a453551074921a3de28321369d7f8ca640c45109e8f522c97ed9f35b9277a350e295931b42e0135e94a92fed363d6cae392f7c45199327e24b4cfa5898ab599ae7bd50bd3a00c0d007e95faf8f2ae103802ca7e53b279184d06905f5748ca8be1f72e668cb83283dd00406491f8b9b4e5a9d4a5438b2fa4371e0b05686f87575baa796e302f08ffc425662750a33a0c9cfaa4b4d7041f9264fed7be4f9fde2cac68a2158236f6ac43047e911f4c4e8bc663fdd50517dfaa8fbcd219dd7a0e9369f43d0dd25b4f0cf930f20b7b7c6db9d5be0c6e1960941a3e04d141c03e5961aa33e9024477d533c995378796bf2292ade922695b14569fc339b3d9085c63fc6e5bef4d990c80333a6b57af478f938e3ee738b1d129bd976afe686128bcac08ccbeb0349b9b537313bc7bf591c65d4a7123ad30bdbe1486b428084748b6507f6f5ef67c26ca862cf726aac140b861ae0dc74bb3c0b489789f17145e9a855a3e2b5daac418d8353733239ef69c7b565b5303eb87bd7f649abf40a2f135a29ed27e3be4c12cd6ddd2e5418a99974383663f5849bf3ce5532bf64a80aa521191d25390bc19a45eed1d3feca1d9fcc0db031bfb48e450be3d4593356d5ba0f31047b457745f21e32ebea3ca6c35f05d78d8c31640b0fecb9401165675c7f9cbb19bc4b5677c2ccedc4e7aafb84184c19199aca0db21cf5067dc3af769bcc629355ff7257a9efd71a6a92d130d35abee6e70605b5cab93c028fac3aa2344ba861ac1e8ce9a4b070c3df740d28c5ece0f1bc31c2d7d1e5ecc76104480939133a18660e4a3e4846b2517be3b8e7afafe078391d8aa8e5c30137e85d94d64a279fbee", "signature": "ed2ced1a4fddb3442a637348179a6a5beedcb44c8e988ca26f78936d2c8db5c516d54b8c4f08d91dd7042ab6ab26d87f230eb2b2156f3ce2994fce7c2b0f100e" }, { "secret_key": "91fdefcdbc990d3e8eeb60170434da10831b03081f6afd0d7e12b10011e02aef", "public_key": "c58d3e20b8d47ba455b912572dc840815e3d885fa5917d1da48408b9a9564098", "message": "5b0c1a3a95e0ba7474766c9badfae34ab860e0a6c033a22fba721127f5bbeee8e2cbde1a1dfeb18d551c95994d21e3ebc68afae685444a3a4195bc755538903acfa6715592dde256e7a1b4c363eca71ef0f3a48ae3442d50d5661b394096b7ec27bbf52953f3040cd25b78ce475527e0cc59f1ef9ae2e0590431582b2df8141499829a2c5f7bbe3598e4c96cc01ede2f43b65605b488593709c094b5a042b28555fb5227a6d156376f3ff07bd5c8bc6804d39a3282ac5970ba08aebf7542b845f6b5c238c2ce20443f7f7755d75fe4fa16b9644ca3e21d91a9a87c686115748a16c0ae4ae4e16d1c71ae600b39cd25e5633b399fee7ff2e362bed25125c6fd5c7f5ffa2da2353fd35b784a1b1b0319774758b7390c44dcc92fca4201dfe1a37569de05f0664d08b90d6e2badc21b92f9ce872142357b9615080ab7659a246ff0852adb17dfda70cf1754157b13bc032b4c5deb8e1068b4692b93165da35efc9da86acbe6f80f01bbc26f575ec5af5b050e9828afde6c3b78e733eb5a912492f765bcad731b95e3ab8896b61758bf913b9a1568f9c5b46033cf45dcc1750da2066c608dc3d343738e848dc390cd474432e991d7aa2c5b2781421efe55e36b0b42c1f49ae277480b0fc5ff685bb5a31be3a0fa44823816077037548a5c9b0e1cc6c63504a407579a3632b3c96fcd0de5ea1e4d6e87c0caf7b6cae3120db8b1f4615ce6a75a81654f390428b64c213e727eec3ae7f9f42db906f4de1fdadd34a3da2aeb12b4d9a185f4a60cb0c26745f530b481fc976a093ce24a30916af605ee94b08785193a949d569c4b7ef59603bb624360e7b408d98ca509daf5a92a6d4015bdb6f97ad4ff0cf05c8f0cd5476a934426a059f2444446e5864f089e0f0675615910662d7c1e79a6c75fa314b7ba2c643b0d37653eefe593172d1d332c8dd64492eaf104fb1957baa52049442d10b56af8eae8ff82cd8f46a0494bec2fcb9fadf10cf71a6eecd0547dafdc7adbaa4503783f943a46b4ad0e6dd7f2cab55617", "signed": "510112223b33a5ab1564f7537191cd292a9dbd5a323d7add0584c1b0ad00d0ac7199c3fb758e913ff3d716c2e90dd90d4e8f59951e87ef8b78214a5175c4e6085b0c1a3a95e0ba7474766c9badfae34ab860e0a6c033a22fba721127f5bbeee8e2cbde1a1dfeb18d551c95994d21e3ebc68afae685444a3a4195bc755538903acfa6715592dde256e7a1b4c363eca71ef0f3a48ae3442d50d5661b394096b7ec27bbf52953f3040cd25b78ce475527e0cc59f1ef9ae2e0590431582b2df8141499829a2c5f7bbe3598e4c96cc01ede2f43b65605b488593709c094b5a042b28555fb5227a6d156376f3ff07bd5c8bc6804d39a3282ac5970ba08aebf7542b845f6b5c238c2ce20443f7f7755d75fe4fa16b9644ca3e21d91a9a87c686115748a16c0ae4ae4e16d1c71ae600b39cd25e5633b399fee7ff2e362bed25125c6fd5c7f5ffa2da2353fd35b784a1b1b0319774758b7390c44dcc92fca4201dfe1a37569de05f0664d08b90d6e2badc21b92f9ce872142357b9615080ab7659a246ff0852adb17dfda70cf1754157b13bc032b4c5deb8e1068b4692b93165da35efc9da86acbe6f80f01bbc26f575ec5af5b050e9828afde6c3b78e733eb5a912492f765bcad731b95e3ab8896b61758bf913b9a1568f9c5b46033cf45dcc1750da2066c608dc3d343738e848dc390cd474432e991d7aa2c5b2781421efe55e36b0b42c1f49ae277480b0fc5ff685bb5a31be3a0fa44823816077037548a5c9b0e1cc6c63504a407579a3632b3c96fcd0de5ea1e4d6e87c0caf7b6cae3120db8b1f4615ce6a75a81654f390428b64c213e727eec3ae7f9f42db906f4de1fdadd34a3da2aeb12b4d9a185f4a60cb0c26745f530b481fc976a093ce24a30916af605ee94b08785193a949d569c4b7ef59603bb624360e7b408d98ca509daf5a92a6d4015bdb6f97ad4ff0cf05c8f0cd5476a934426a059f2444446e5864f089e0f0675615910662d7c1e79a6c75fa314b7ba2c643b0d37653eefe593172d1d332c8dd64492eaf104fb1957baa52049442d10b56af8eae8ff82cd8f46a0494bec2fcb9fadf10cf71a6eecd0547dafdc7adbaa4503783f943a46b4ad0e6dd7f2cab55617", "signature": "510112223b33a5ab1564f7537191cd292a9dbd5a323d7add0584c1b0ad00d0ac7199c3fb758e913ff3d716c2e90dd90d4e8f59951e87ef8b78214a5175c4e608" }, { "secret_key": "ef00b3c181f6327d02256751cb51c2c36c0c0a78076340548f5bc070d86d9e26", "public_key": "db14cd32588fd741e8f42e5121cc811ad45063f28141e83c668f07d91228f049", "message": "7d6abec7a11af67324ce17b1d20bb40c668a219bc95df05e325d86f88795e264d454fc5fa7d9c8aafe77e90a6af6b57453d85b970b552a856ba659ab31bd8a660eb7d3587b453e5c5fc6b79472b26e8ff7dd6db6be3572548b0d754ed4d985b8d9965f88b952fc4fa3b761ccffc35354db0eb9c5a171718a8a5592870213827d3691bae7fd9c63f20503e04319b5e953579de47e3ef8e1628549503cb4f6871ba25db87347080e531a517a8b7221e6ad84dff83256d9ab9a433de871b9cb9c5044589e67206b317a5206aeba96c92fd6094071c644fe52658ded9220cf6abd50e2305a1c90fd66aacfb38eb05eaff6ca5f85f429cd57716eb87739a02b64cffa08c4f685b00310b5b4844920df215a9f24a17613aef85fec94f511dc8a4294eddcea11c08c0b399a23d916383e29adeb98c65d41c705a57f840520fa808d7fd25fdce159f7a084d062974b30132a571242baff4196246d6d757b312e9d608553d2dc53b623b2e95c7538fbc5deb62ba73776d85e5118fa1a302d4d076d99e100f0df119c33fc66cdfe6fd44d71997b78c8f7890c707346056220d1e9de88bc173cf0b76cb302877ec16af46e4c31639f54eedc16da9d9eb0ad95bda545dfc4a732b6da9814136ab1b9392a071b022473b3490557698b77e7447ac8590dcaf4f242ad3dfbc0df716cc0ea753626973df08d935d178e3312fbe2a7ba9c5093c53b9255eaca29b72578e3ba1bdfaf0c9ece21a5dff6ea421524f70fc1904e9a2cf7c518bfcc7e3673ee87ff27e1ca2ac32bcb4091cb34a82a71563ff6a6a15da0ebd5bd10256ce960f4eaa7fe35e128886050d049fec3a4ab16d5b0c107267eae1ab801ea5b91983839da1c488c12f864d7c3a77f2b6ae27d540109f68d78364bb627183bd503917547aaf3b3a1809da02577b3f03a9a3f5af48c8802e297c8bb63db6a86d3ea727a6d7148b3aa444b8d168f38c6c8f24088a49af33177a344adab2cf6e08e0cb0371ed52bdead132f77e7ae3ee5d8fb17afc0a0bb7311b9560b67", "signed": "139f9cb99b995be6588cddb5051694838f9d82a60761fde304b0027ff86584bf65c73cc6d253e560f65525df04bfe146c83b42269cf3780f8bc392437894ae017d6abec7a11af67324ce17b1d20bb40c668a219bc95df05e325d86f88795e264d454fc5fa7d9c8aafe77e90a6af6b57453d85b970b552a856ba659ab31bd8a660eb7d3587b453e5c5fc6b79472b26e8ff7dd6db6be3572548b0d754ed4d985b8d9965f88b952fc4fa3b761ccffc35354db0eb9c5a171718a8a5592870213827d3691bae7fd9c63f20503e04319b5e953579de47e3ef8e1628549503cb4f6871ba25db87347080e531a517a8b7221e6ad84dff83256d9ab9a433de871b9cb9c5044589e67206b317a5206aeba96c92fd6094071c644fe52658ded9220cf6abd50e2305a1c90fd66aacfb38eb05eaff6ca5f85f429cd57716eb87739a02b64cffa08c4f685b00310b5b4844920df215a9f24a17613aef85fec94f511dc8a4294eddcea11c08c0b399a23d916383e29adeb98c65d41c705a57f840520fa808d7fd25fdce159f7a084d062974b30132a571242baff4196246d6d757b312e9d608553d2dc53b623b2e95c7538fbc5deb62ba73776d85e5118fa1a302d4d076d99e100f0df119c33fc66cdfe6fd44d71997b78c8f7890c707346056220d1e9de88bc173cf0b76cb302877ec16af46e4c31639f54eedc16da9d9eb0ad95bda545dfc4a732b6da9814136ab1b9392a071b022473b3490557698b77e7447ac8590dcaf4f242ad3dfbc0df716cc0ea753626973df08d935d178e3312fbe2a7ba9c5093c53b9255eaca29b72578e3ba1bdfaf0c9ece21a5dff6ea421524f70fc1904e9a2cf7c518bfcc7e3673ee87ff27e1ca2ac32bcb4091cb34a82a71563ff6a6a15da0ebd5bd10256ce960f4eaa7fe35e128886050d049fec3a4ab16d5b0c107267eae1ab801ea5b91983839da1c488c12f864d7c3a77f2b6ae27d540109f68d78364bb627183bd503917547aaf3b3a1809da02577b3f03a9a3f5af48c8802e297c8bb63db6a86d3ea727a6d7148b3aa444b8d168f38c6c8f24088a49af33177a344adab2cf6e08e0cb0371ed52bdead132f77e7ae3ee5d8fb17afc0a0bb7311b9560b67", "signature": "139f9cb99b995be6588cddb5051694838f9d82a60761fde304b0027ff86584bf65c73cc6d253e560f65525df04bfe146c83b42269cf3780f8bc392437894ae01" }, { "secret_key": "d071d8c5578d025949932aa6bf6a80b1cc412f106f91574ee24654b445ee9a97", "public_key": "9bcbf7d2212fb62cccf8b6c76803a5ea24409da6287efbb8b1f0c7b30ebdd93e", "message": "3e8ee70e51e56ef57f6e66b3a884aa04a7b4d4599fb9b43996b393a868093512ea741a0c6a94f40ce49862d2fd1f7551f4647abd8075bc1b742ad40e29a60461301224fe8f7692b14772782b4e896b63fe05abd5ff5314f9ec8075f28d908ccaaace5e905ea7f57a491b99b3591eea54a6b7819167749d38a047620676a1a7af11f485a55b7c879e6850380858c8f45c0c1ccbd7406ed099d84a7471b9350c4ddb28470bf5bf327d5b3c22d899b4c660839e104a0622ae85c84aa9fc7f0a2c7ceb6e691c49c064b5313499683e8e03b2115eda7ddad55a49f9fbe62544f914511cfbec6b84dbde7e80909b45fb10502e2caaa72124fd9456a3872f9592707e9a4c5012daa972eaf65fabe553debe825701efef5c756bb465e966ab68dd52f3dd00a45cf6dc3f19b86bb0db4a86e4669885a074696a67d8ea2118c766ef625f8a98026f9f4a3c5cccf9846fdc90ed93ec7c1f3c7086954fa2f0a4ca96d40184aa57545527a1f965c11d843c90c5a5e08d7c11f2d561004e90574852eb5046aa1ea7b61009fd5dd7d6242a8df58a9e8e555c7f4cdc130d6901bfe6797fdc6c39beecfbbab6625b2e4fb9d8000276d4a94fc6fc1051fefff5adeb724b87090db0a2c697d056664d991fad80dc80fab700b1f1f2ee27734ebc26b2a641c32a0c911b270ac76b0da5c08914971c9112463a70709c0ddac7910016f913f6210086d7255cef11955710f651889c83621dd8a4fcd5366302d6c9b56eefcfac85c14a9478b6d718075428800760515cab5f3d4455e2b970df9fe4be8383d70483bbdd756071f53b2f9c275c7c8512d163518fe555837514c86776c947f29a77570287446b69be40c8d4abbd65ef2507249b5aec33acb7b8bd3f35bc859ba4e37bdb49cf913d93989c4438d2abcfa388cc89d78ac06270656492e7528f29bdfe8cbb9bfa9e73c1da013fc3ce2105657613ff62bb0c3bf4dee3b0d2659c726e7bcd9e97ecce9247d4600dfeaf60444ed862b00ba11e70ea88d4f0b6b539fc9f36bb2a1a9ed2b3", "signed": "0c297abe0fd8ebcc6b771998755e2c6be07c812b5a80544957063170ca69432e72b60daae322958a2238cd6a462894a387eef65bf96f63f54c085687a502750e3e8ee70e51e56ef57f6e66b3a884aa04a7b4d4599fb9b43996b393a868093512ea741a0c6a94f40ce49862d2fd1f7551f4647abd8075bc1b742ad40e29a60461301224fe8f7692b14772782b4e896b63fe05abd5ff5314f9ec8075f28d908ccaaace5e905ea7f57a491b99b3591eea54a6b7819167749d38a047620676a1a7af11f485a55b7c879e6850380858c8f45c0c1ccbd7406ed099d84a7471b9350c4ddb28470bf5bf327d5b3c22d899b4c660839e104a0622ae85c84aa9fc7f0a2c7ceb6e691c49c064b5313499683e8e03b2115eda7ddad55a49f9fbe62544f914511cfbec6b84dbde7e80909b45fb10502e2caaa72124fd9456a3872f9592707e9a4c5012daa972eaf65fabe553debe825701efef5c756bb465e966ab68dd52f3dd00a45cf6dc3f19b86bb0db4a86e4669885a074696a67d8ea2118c766ef625f8a98026f9f4a3c5cccf9846fdc90ed93ec7c1f3c7086954fa2f0a4ca96d40184aa57545527a1f965c11d843c90c5a5e08d7c11f2d561004e90574852eb5046aa1ea7b61009fd5dd7d6242a8df58a9e8e555c7f4cdc130d6901bfe6797fdc6c39beecfbbab6625b2e4fb9d8000276d4a94fc6fc1051fefff5adeb724b87090db0a2c697d056664d991fad80dc80fab700b1f1f2ee27734ebc26b2a641c32a0c911b270ac76b0da5c08914971c9112463a70709c0ddac7910016f913f6210086d7255cef11955710f651889c83621dd8a4fcd5366302d6c9b56eefcfac85c14a9478b6d718075428800760515cab5f3d4455e2b970df9fe4be8383d70483bbdd756071f53b2f9c275c7c8512d163518fe555837514c86776c947f29a77570287446b69be40c8d4abbd65ef2507249b5aec33acb7b8bd3f35bc859ba4e37bdb49cf913d93989c4438d2abcfa388cc89d78ac06270656492e7528f29bdfe8cbb9bfa9e73c1da013fc3ce2105657613ff62bb0c3bf4dee3b0d2659c726e7bcd9e97ecce9247d4600dfeaf60444ed862b00ba11e70ea88d4f0b6b539fc9f36bb2a1a9ed2b3", "signature": "0c297abe0fd8ebcc6b771998755e2c6be07c812b5a80544957063170ca69432e72b60daae322958a2238cd6a462894a387eef65bf96f63f54c085687a502750e" }, { "secret_key": "e9d486c29ae811b942e10d81f0a6716317b842c2c5bfdef55cc432b7fcaeb818", "public_key": "43a52d15b9f731d737b1c4dbc32227a480963091d2c6286f482ef1e8367054e5", "message": "14fe1ed5bbbd76cc73dc5650bda92de86326e24d2f1f6224ba8568944d6fe3442675db96f1d8498f1634ff9b6e50cba9db4eb0b0b021b2becfce4bef33c4ce0e32c8a98389eca9e059a662d6f037c54aa40c76cdeee85650f089ea56e1383ab0f5c36f6d6645ff7e87667301f944fdc2ed35b0d2c35cb2e4b45636e7498e927f5846b3e1edfbd160a4aef3320c3428496bdaaf7d3ed56ef0b7254ac597be589a70584416300c1adcfba4f22cfd4cd661e1f50f155d172fa5748d296b29cdd7eb8121483ff1d9fe953f9451c7c7a542007285ee7246bc0fdea938814029abce057a0ecb974b12d360eab6afd30797d61445ad2bac7e52bce4346315f78eb87542d59528b2f6c56d66241cb442033f643d3d2a67cb637d8da95d4fd1234b031a3e51723a1d26e6f5ca07987321ad11a90fcc1d4e2b0b896650c3a7518d565529bea806a05d447e08d2a6a3dbf1a36915b2957ca5b40e58b97ad0369735c428bd6d69bd210044b651418d98b059d90c83e46011f41c032c5655a5ef21ac2c8c2bc94be07e45426a7ae5d47b45f27cf4289ca4ddabe08a12b910207dabb34a46ab75ce69b58e7e17664bf3359a8fb68eb032c9eaa6df873829f0e0848553f732e1c3c084b32b7af75074e7bbaa4eb5d7ead7aff97580109b60f4c792f9e2a65137b0aa48175b8115d91305f4c77e2d08e7e8d7e7785c966842c2e350fed4f9e33bf6e184c550b4b06e957414edf52fa079e81973458461fbb9b7d7d34bef150357f432caac3ae9f3dc96eb5a2d123e09eda1702e1d1070177bb220c423c096ec24424385c679be02ef84d09ed102f49cad3b1fd670679a39714ff1d6e4228d8d7d0e19ed0eba132f2128d47baa569a8ecb7bd48a826282f9cfcbf60ddeceaf1d02132c8affed3a03d2340deb787cd649c51c6ecb9ff75d7a7b4ef9b15139cfea2762ab18615197a6b51f6e75dbd04573a2448094d0cdeb0fe4585883ff9b68824a04b83ec91cf84acd6a7446cb1f5ee37d5df80f17cb2bdc3f3122a8faf76ebd06cfe817", "signed": "65191aa885ddab9f67271879952fc6affe41ca20eb3bcd86673161b03b532694d6dd88908eb1b1eec003cfcbe6146b4538e21df55969912a0d7d8818ad79590d14fe1ed5bbbd76cc73dc5650bda92de86326e24d2f1f6224ba8568944d6fe3442675db96f1d8498f1634ff9b6e50cba9db4eb0b0b021b2becfce4bef33c4ce0e32c8a98389eca9e059a662d6f037c54aa40c76cdeee85650f089ea56e1383ab0f5c36f6d6645ff7e87667301f944fdc2ed35b0d2c35cb2e4b45636e7498e927f5846b3e1edfbd160a4aef3320c3428496bdaaf7d3ed56ef0b7254ac597be589a70584416300c1adcfba4f22cfd4cd661e1f50f155d172fa5748d296b29cdd7eb8121483ff1d9fe953f9451c7c7a542007285ee7246bc0fdea938814029abce057a0ecb974b12d360eab6afd30797d61445ad2bac7e52bce4346315f78eb87542d59528b2f6c56d66241cb442033f643d3d2a67cb637d8da95d4fd1234b031a3e51723a1d26e6f5ca07987321ad11a90fcc1d4e2b0b896650c3a7518d565529bea806a05d447e08d2a6a3dbf1a36915b2957ca5b40e58b97ad0369735c428bd6d69bd210044b651418d98b059d90c83e46011f41c032c5655a5ef21ac2c8c2bc94be07e45426a7ae5d47b45f27cf4289ca4ddabe08a12b910207dabb34a46ab75ce69b58e7e17664bf3359a8fb68eb032c9eaa6df873829f0e0848553f732e1c3c084b32b7af75074e7bbaa4eb5d7ead7aff97580109b60f4c792f9e2a65137b0aa48175b8115d91305f4c77e2d08e7e8d7e7785c966842c2e350fed4f9e33bf6e184c550b4b06e957414edf52fa079e81973458461fbb9b7d7d34bef150357f432caac3ae9f3dc96eb5a2d123e09eda1702e1d1070177bb220c423c096ec24424385c679be02ef84d09ed102f49cad3b1fd670679a39714ff1d6e4228d8d7d0e19ed0eba132f2128d47baa569a8ecb7bd48a826282f9cfcbf60ddeceaf1d02132c8affed3a03d2340deb787cd649c51c6ecb9ff75d7a7b4ef9b15139cfea2762ab18615197a6b51f6e75dbd04573a2448094d0cdeb0fe4585883ff9b68824a04b83ec91cf84acd6a7446cb1f5ee37d5df80f17cb2bdc3f3122a8faf76ebd06cfe817", "signature": "65191aa885ddab9f67271879952fc6affe41ca20eb3bcd86673161b03b532694d6dd88908eb1b1eec003cfcbe6146b4538e21df55969912a0d7d8818ad79590d" }, { "secret_key": "e6fa10dbb478e1e36b35dfeb0250f63c08515070ae79b22f047e271708d64f5c", "public_key": "e02e1f2bd8792ef483481c6d11f7c7c9dbdeecc9859432e7f279e9d173d31164", "message": "ad3160758d8c08a661525c95280a3718874969859f1cc918e34fec008acf23b8896e8d50c3c0512331dc89780f8b10fc349c675c4cd82a5df8586b43c864448fac00b847b9c98054ab793f63c71aa5e5248e22d069bd3f852a3b8c6e2ac8ef861d90bcd984bfca87583e59e9a7468f29b808dc2fe5302a989d6f2ecde7585cd9be4e4c761c4d4b3eeaf4699f6556ef039af2b80f9407605ac397351dd85595584495baa177b08c88d2ec1fc4e32d1c0b8d7e7ac5839dfb923f09b323e78eceb7e96c0604b01a19e49c9beaf4f25ec4a84c1a08f2380eddc3a7f012184959ccd19ecbbac65eaca155cee9ecfec11e7fee058e174fc4ed7c679f2c15631d4e1527bcdb0e3bb0815ffdffc0c856bef0dc0f5c8237f7098e26bdb69e8782d1ca5111ec3c7edb425dff8032026cba3d2e081b71310db9badad1ad02f1eccc537d874cd18c6bb01221f71ee66250d94cf8ecceaa96d3c57eea2b0a8ec72429d7606488bdf19ec3bb16e50867c7937def09fc783f20a2a5ec99253d6b240df4677dd2d5277b01c5b8e5bd6c7df0874205bc8c2fffdba1314674d31c9b2c9199228e19e0421834c1657d0698286916c7e392f0abd5545b963ac1ffa99721616c23796f85c34a5c664ae81d16b216a5b0cf5bc6b5a908297285d61644128f886f38af9edd25193d7ecc77a79994278da071f54495937feef5a51957527c3eec7cb0b4e8aa7a4e856defd57dd92334151b986aa69ca69260d1e2d7b53c05677ee0d216b28d036252dd3006debe1b6574a25e6b19dfb48fa64316af8fd68d7893b397e7db5780ab27bf8726fff605d3b46d800595b4624bee302c964326034b5234d175dfdcc2ce882e65b3d93a0438f692e9695de1f24c70a79beed25415ec5aaecf3391953b2ffd453a8f0467561a4a47ee144a43fdff83df2bea5f66a722b52abe8613f20c594af0982eb3f04505a52461dd034da86c36ca16217705c04823911d72a24769517633562886f250f2cf788b8f32864a9474f57e62e57de8fdaf959a6b72287440a8", "signed": "c03c470359127e9de3af0e0ed7d3b19faee0ec140b79c299e2cb6dac0a3e7e314141cc854b4596ce4c51c7b0dec8a5c8cf0936205361d5365f4bcc07c4287c07ad3160758d8c08a661525c95280a3718874969859f1cc918e34fec008acf23b8896e8d50c3c0512331dc89780f8b10fc349c675c4cd82a5df8586b43c864448fac00b847b9c98054ab793f63c71aa5e5248e22d069bd3f852a3b8c6e2ac8ef861d90bcd984bfca87583e59e9a7468f29b808dc2fe5302a989d6f2ecde7585cd9be4e4c761c4d4b3eeaf4699f6556ef039af2b80f9407605ac397351dd85595584495baa177b08c88d2ec1fc4e32d1c0b8d7e7ac5839dfb923f09b323e78eceb7e96c0604b01a19e49c9beaf4f25ec4a84c1a08f2380eddc3a7f012184959ccd19ecbbac65eaca155cee9ecfec11e7fee058e174fc4ed7c679f2c15631d4e1527bcdb0e3bb0815ffdffc0c856bef0dc0f5c8237f7098e26bdb69e8782d1ca5111ec3c7edb425dff8032026cba3d2e081b71310db9badad1ad02f1eccc537d874cd18c6bb01221f71ee66250d94cf8ecceaa96d3c57eea2b0a8ec72429d7606488bdf19ec3bb16e50867c7937def09fc783f20a2a5ec99253d6b240df4677dd2d5277b01c5b8e5bd6c7df0874205bc8c2fffdba1314674d31c9b2c9199228e19e0421834c1657d0698286916c7e392f0abd5545b963ac1ffa99721616c23796f85c34a5c664ae81d16b216a5b0cf5bc6b5a908297285d61644128f886f38af9edd25193d7ecc77a79994278da071f54495937feef5a51957527c3eec7cb0b4e8aa7a4e856defd57dd92334151b986aa69ca69260d1e2d7b53c05677ee0d216b28d036252dd3006debe1b6574a25e6b19dfb48fa64316af8fd68d7893b397e7db5780ab27bf8726fff605d3b46d800595b4624bee302c964326034b5234d175dfdcc2ce882e65b3d93a0438f692e9695de1f24c70a79beed25415ec5aaecf3391953b2ffd453a8f0467561a4a47ee144a43fdff83df2bea5f66a722b52abe8613f20c594af0982eb3f04505a52461dd034da86c36ca16217705c04823911d72a24769517633562886f250f2cf788b8f32864a9474f57e62e57de8fdaf959a6b72287440a8", "signature": "c03c470359127e9de3af0e0ed7d3b19faee0ec140b79c299e2cb6dac0a3e7e314141cc854b4596ce4c51c7b0dec8a5c8cf0936205361d5365f4bcc07c4287c07" }, { "secret_key": "058e3680b8fcc0aa1490089c1124677f98d74b1bfb71ee8663f025f0d946cd20", "public_key": "ec72ce0e82c6a3b21243d2f00e9e883adbc5cb63b3d936efa50c07cb929148e2", "message": "e63d14f5bea7a1abb8fee697746c2280dfd0622de7357226cc0742722a3229be126b083e868aeaf07d2fc97adc3342709674193ca281744e850ea15440050aec930e45d7a87b8ac8015c8967c20033a532d29591b135586ce0fdd2e668b5c864b3bde70c7e719ad241931251861933ffbfa96483ff82856748c56dc26e257d692e5134d82fc7191c110d9590d3fc751cd636b0c46f44f8803e59e2f93fa0cbe247a1a625b4bc2c7b1fdceb5a2b22591fa6137c5404dfec6a69639e3f632b5976ab9fe1c63aa3da9d52b044008f3ae44b7c364f085664323a88eb4583e87140f763782bff8819cf741a875d506c929d34bbd43007de4b18f687a758111128b1db86fc5ad2fb9fcad12c9dd28fee5ad10de0739f8efd9bff66f840b11b3f91c5e07c21452cab24242b6e32165cd1e69572bf216e860453dad2fd129c333758580bb7d0f19509745e851463d127a5f9be21fe549cae55d56b8bea80bfafdac10acd838ea8af31c007dc32bfd74082d9110a3e91e61e0357587e4ed32827ade9b6910a988c1d3b2dd22c0ee76ef35fe15e099404a45d4b2acab9123ecc45550a40faf8336b46c630a9080358ff8b8e58af0bccbd35010c1ecc12816655a5eceba95ad3f503a18ec5bece3a33f469dfe917e1c55ef1d81e5a75561e6bbd99c653a6d095b9f387911e40332f6216f956a35cf7d99a9fdd0c44c51e90a564f1c36bf3d40a7faf4ba28b1a120b3205fbac1a98569290be37c58bbd745ce0fb74835270aba2252adaec157dc42461221a2cff687b9e65ceb57c2d77700aea6320486c5b1bec9cc53e7ef9e48fcd1b7783acbe75a6be0267278812dbf3d2576cf7ad3911271acebe0f2c04602a080c8b96c120fd86fda282aa4e1c131fe97c907c15855f87755f511c037befad0f56b39f32a2133a22f3d5a9bec3443f29a694e97fe05e10fb8ef9991302b9e0d84d929a19eb03471f3a8613d39368e15883a7e4970b53cbaf2929d8de431b48b435d7533caa2e36ceab6cddb346e535e515c4b3db76de07d9855414", "signed": "5734ec50a7f82e48536bdc4370cfef2e150a631dabaf89edcf0fdabe4f5839f4f5fbd8df8ec4a3acd40a8bfb963d1855ff9274dbc33165b5e6d37a239dace903e63d14f5bea7a1abb8fee697746c2280dfd0622de7357226cc0742722a3229be126b083e868aeaf07d2fc97adc3342709674193ca281744e850ea15440050aec930e45d7a87b8ac8015c8967c20033a532d29591b135586ce0fdd2e668b5c864b3bde70c7e719ad241931251861933ffbfa96483ff82856748c56dc26e257d692e5134d82fc7191c110d9590d3fc751cd636b0c46f44f8803e59e2f93fa0cbe247a1a625b4bc2c7b1fdceb5a2b22591fa6137c5404dfec6a69639e3f632b5976ab9fe1c63aa3da9d52b044008f3ae44b7c364f085664323a88eb4583e87140f763782bff8819cf741a875d506c929d34bbd43007de4b18f687a758111128b1db86fc5ad2fb9fcad12c9dd28fee5ad10de0739f8efd9bff66f840b11b3f91c5e07c21452cab24242b6e32165cd1e69572bf216e860453dad2fd129c333758580bb7d0f19509745e851463d127a5f9be21fe549cae55d56b8bea80bfafdac10acd838ea8af31c007dc32bfd74082d9110a3e91e61e0357587e4ed32827ade9b6910a988c1d3b2dd22c0ee76ef35fe15e099404a45d4b2acab9123ecc45550a40faf8336b46c630a9080358ff8b8e58af0bccbd35010c1ecc12816655a5eceba95ad3f503a18ec5bece3a33f469dfe917e1c55ef1d81e5a75561e6bbd99c653a6d095b9f387911e40332f6216f956a35cf7d99a9fdd0c44c51e90a564f1c36bf3d40a7faf4ba28b1a120b3205fbac1a98569290be37c58bbd745ce0fb74835270aba2252adaec157dc42461221a2cff687b9e65ceb57c2d77700aea6320486c5b1bec9cc53e7ef9e48fcd1b7783acbe75a6be0267278812dbf3d2576cf7ad3911271acebe0f2c04602a080c8b96c120fd86fda282aa4e1c131fe97c907c15855f87755f511c037befad0f56b39f32a2133a22f3d5a9bec3443f29a694e97fe05e10fb8ef9991302b9e0d84d929a19eb03471f3a8613d39368e15883a7e4970b53cbaf2929d8de431b48b435d7533caa2e36ceab6cddb346e535e515c4b3db76de07d9855414", "signature": "5734ec50a7f82e48536bdc4370cfef2e150a631dabaf89edcf0fdabe4f5839f4f5fbd8df8ec4a3acd40a8bfb963d1855ff9274dbc33165b5e6d37a239dace903" }, { "secret_key": "51ba3a4f3d85d1548c2f2494a3511f3b9515663d7e85370fb6150237e9bc980b", "public_key": "7749de0210bce06d48f59b95aeb1528fd9b4e52cdde22fb8193bedd5df12817c", "message": "d18d0cbfc16d0f9b67f2539ad6207cd9217ad5ed0333cddb1041e0ac2bdd920276629652b49cbc9802593ec364ea795abcd1582085f55bc66c48fd3eede618d6369617100eaeccc15f249d6eee5bb2c43c01b0623fe603ceeee49b40fb7c53fc68473673c09b1ac77ea9beb7e8530379a86d69ecd1ff11813fbb88f692f05ef1320742b4fe7e06d5ba71656646cd7500de19bb93d844536603f40bd4aeeaf0c4dbc0acfd202b286b64afb83d4a378dd45ee3c1df6b3ef16b8b1accbc04063250ec47b86ae5a71d1dab38b5eb80d663faa788f8b59a754c0f9c9f6d906252af46ab1fffed276d2388dbe70d96ba6747d1fed4fc0b55293d5f787bda0c0df46a73f4aa7d29e1c9cc85cd043e3dffe057462ca5fe5c6470e739276f8b534c0172e460f340487a569468aa5890cc14f20d67d79c661e87febac6275971c3730807ebf175e0de1049bee67c895e57b71ab8a2f3cf3641fd548d09414f5fc3026a0a35f6ba951673944941cb236f3d1976dc69077d951450e7660316988f6f2a6fbbff3b37ceaa02fd6f0273bd803185a109039c63f2519b983daf6554253bed5497c0b0bdaa0bd4a1fac90026ade3e40c554cff2ccb36990e71556708c5c4039256ffc7337e5fea11f5e90d3e4d93359179116a85c24136ca34835cd34012e4d7ddc7b721c246c73700e276dc2ff9f2770b43c8e80a17f01d32680bae228e6423a880c3fb996ab8d221bc6274ac5fa770d205fc878fba9bbd776a3d79ed77048950f36dc0aa3ccd28e4756a991904ae051b8a4b7de3a1f2ad0fb45a33d0c68225841f8eb65b6a16e95f893591e1aa73a64f0d2ee938ab69adcc8c59518bec501c39f139174bbb00699e1a0f0e0d889aae543a55e6ac56d5204c1ade1f27d82a6a95e14b2d6909dda7bfaa7f487fb61959014b78795cb4639f09f0d329feb35ccf52edc2db721914e423306889a483fee876360ee326335319070c564f3a8b953f52f41513a2260883c38dd978a248604a41bd4bfc9e84184dc9e84d2589f4afff8417824ce5adba", "signed": "16fb290c913b20eb1c3d7b798249eb8459d4bee8125db2b3f1daab8af9d9a700ed798addd802dfcd297a412593cda7be9979a1f09350e86f698ac3380e341d07d18d0cbfc16d0f9b67f2539ad6207cd9217ad5ed0333cddb1041e0ac2bdd920276629652b49cbc9802593ec364ea795abcd1582085f55bc66c48fd3eede618d6369617100eaeccc15f249d6eee5bb2c43c01b0623fe603ceeee49b40fb7c53fc68473673c09b1ac77ea9beb7e8530379a86d69ecd1ff11813fbb88f692f05ef1320742b4fe7e06d5ba71656646cd7500de19bb93d844536603f40bd4aeeaf0c4dbc0acfd202b286b64afb83d4a378dd45ee3c1df6b3ef16b8b1accbc04063250ec47b86ae5a71d1dab38b5eb80d663faa788f8b59a754c0f9c9f6d906252af46ab1fffed276d2388dbe70d96ba6747d1fed4fc0b55293d5f787bda0c0df46a73f4aa7d29e1c9cc85cd043e3dffe057462ca5fe5c6470e739276f8b534c0172e460f340487a569468aa5890cc14f20d67d79c661e87febac6275971c3730807ebf175e0de1049bee67c895e57b71ab8a2f3cf3641fd548d09414f5fc3026a0a35f6ba951673944941cb236f3d1976dc69077d951450e7660316988f6f2a6fbbff3b37ceaa02fd6f0273bd803185a109039c63f2519b983daf6554253bed5497c0b0bdaa0bd4a1fac90026ade3e40c554cff2ccb36990e71556708c5c4039256ffc7337e5fea11f5e90d3e4d93359179116a85c24136ca34835cd34012e4d7ddc7b721c246c73700e276dc2ff9f2770b43c8e80a17f01d32680bae228e6423a880c3fb996ab8d221bc6274ac5fa770d205fc878fba9bbd776a3d79ed77048950f36dc0aa3ccd28e4756a991904ae051b8a4b7de3a1f2ad0fb45a33d0c68225841f8eb65b6a16e95f893591e1aa73a64f0d2ee938ab69adcc8c59518bec501c39f139174bbb00699e1a0f0e0d889aae543a55e6ac56d5204c1ade1f27d82a6a95e14b2d6909dda7bfaa7f487fb61959014b78795cb4639f09f0d329feb35ccf52edc2db721914e423306889a483fee876360ee326335319070c564f3a8b953f52f41513a2260883c38dd978a248604a41bd4bfc9e84184dc9e84d2589f4afff8417824ce5adba", "signature": "16fb290c913b20eb1c3d7b798249eb8459d4bee8125db2b3f1daab8af9d9a700ed798addd802dfcd297a412593cda7be9979a1f09350e86f698ac3380e341d07" }, { "secret_key": "7ddec526a4971d8912a6bd43c69f92ed86442b15f42fbabbf2d17eff98993161", "public_key": "0dfeffb2762309b4734e4ce2523cf1863149f7e19a7c147ec0899e110ca9d87d", "message": "e8774a45d4d8f86dda5c08802ba2472ef3c8d36c7f383ac04612a464382e9d6c07d8d35822c53f4388f5153614fefaf46374747b9d4fd446a864769a4cade843c1eab8574319112f0179d2ea9e3c195dc068f0697462b9e07c8794870f8fb8ffc081e4586afbcdba7a4f5925e9fd9ec942d8434733c2ddd5e29bbdfc7342b92868719b544088a48eba4c82f187ddca8f474625a71cf6b7aa5f081c74f7408f53b781636e7e9d29b07fdb6d9c35e5eb382db7a31a8ba516915df8dee9e1ad3f182843683e8d1dc5d8669dbfcf09541a43c0a04613381a5b5e4e71b23c5ad09b8eaa51cb938d0c752cc3d3a10f10b42be8ee7f6bdac8078568434946bbf56da70e7d54157a6efd4846eb155278c94c3888658a7a2f8ea3bac147aa891692ae8b23f1afe71ecfdecaa6c113b5caaaa19398c7dfe73facb4155fd6bac18d5df2129e8b2907ecee151bdd147a7c3e46ea72754de32ceb066d9db1c26e80df3631292b16174cfa6f1d9c0828b849c22d29651a73e910d9275877f464ce9326c6e4ed6b07dcb3a35363c1aa6472e02c5cd855e38aabe965ace9f3f5a4f5de03008694cb90afe416c9d48688de7f75cfe243ff7f41e059310934903db568844508262c899dfa750cd6a2829824ba027aea1b6d0177726a343add4ecdc5f7e6e909ab7de615ef2807f9e7d71ce2f78acff57eba79c3f5e07c8b661c1e3027f8176d28bfef767dd68d4e5d628fec0bfe88799341f306128734fad202aafc9f11123fb3e363d10aee0db5e27a1570dfaee47e24da473b07fee59a6c93f0981dbe325cd8cc2d2ed7dc17166b267c1b110536f2636bba34751a78f7f6298182442d83c123bbee4f50c5b0facff03e7c556ed9e64ca27c4bca5ab0de0d5f9c2cbb54cc2d9473a32df999390ac2ffeed3d4cba34973dcec3fbabafc4d54cae4e7e85d4a6e8afe45cacd71e0f2e6d04b4f9d3bcf43d3fa41e998ccbed0f150d5ca1d5272932d93eca10495c68334fa3268f31de522cb12a7449ffb5cb5e8f1462cd9b51770ccaf58b1e0d82ef929", "signed": "9e603b015f42871b78eb27523fbb7ce962fca32ae270e8e12dcadd25aa852b891f6fef77b59a546c9a7a7cacb55e1d32adc805ae5f61a69e6764c7c08292eb03e8774a45d4d8f86dda5c08802ba2472ef3c8d36c7f383ac04612a464382e9d6c07d8d35822c53f4388f5153614fefaf46374747b9d4fd446a864769a4cade843c1eab8574319112f0179d2ea9e3c195dc068f0697462b9e07c8794870f8fb8ffc081e4586afbcdba7a4f5925e9fd9ec942d8434733c2ddd5e29bbdfc7342b92868719b544088a48eba4c82f187ddca8f474625a71cf6b7aa5f081c74f7408f53b781636e7e9d29b07fdb6d9c35e5eb382db7a31a8ba516915df8dee9e1ad3f182843683e8d1dc5d8669dbfcf09541a43c0a04613381a5b5e4e71b23c5ad09b8eaa51cb938d0c752cc3d3a10f10b42be8ee7f6bdac8078568434946bbf56da70e7d54157a6efd4846eb155278c94c3888658a7a2f8ea3bac147aa891692ae8b23f1afe71ecfdecaa6c113b5caaaa19398c7dfe73facb4155fd6bac18d5df2129e8b2907ecee151bdd147a7c3e46ea72754de32ceb066d9db1c26e80df3631292b16174cfa6f1d9c0828b849c22d29651a73e910d9275877f464ce9326c6e4ed6b07dcb3a35363c1aa6472e02c5cd855e38aabe965ace9f3f5a4f5de03008694cb90afe416c9d48688de7f75cfe243ff7f41e059310934903db568844508262c899dfa750cd6a2829824ba027aea1b6d0177726a343add4ecdc5f7e6e909ab7de615ef2807f9e7d71ce2f78acff57eba79c3f5e07c8b661c1e3027f8176d28bfef767dd68d4e5d628fec0bfe88799341f306128734fad202aafc9f11123fb3e363d10aee0db5e27a1570dfaee47e24da473b07fee59a6c93f0981dbe325cd8cc2d2ed7dc17166b267c1b110536f2636bba34751a78f7f6298182442d83c123bbee4f50c5b0facff03e7c556ed9e64ca27c4bca5ab0de0d5f9c2cbb54cc2d9473a32df999390ac2ffeed3d4cba34973dcec3fbabafc4d54cae4e7e85d4a6e8afe45cacd71e0f2e6d04b4f9d3bcf43d3fa41e998ccbed0f150d5ca1d5272932d93eca10495c68334fa3268f31de522cb12a7449ffb5cb5e8f1462cd9b51770ccaf58b1e0d82ef929", "signature": "9e603b015f42871b78eb27523fbb7ce962fca32ae270e8e12dcadd25aa852b891f6fef77b59a546c9a7a7cacb55e1d32adc805ae5f61a69e6764c7c08292eb03" }, { "secret_key": "0b6590dd7c2f15f94a56e240169363c26732302b9d440b532723002e155d02d9", "public_key": "cd18e032577c5576f223f3e3d8a1fa8e9a870fef09e9409faf40d7143e52fc44", "message": "71fe0fd55d5ed1206f28ee16e419fab6fa66a251fa6b0601da261e429f55b8d5ae3f3c52a17fe1ec734b810ab63aade4447039ca0ae4687c2435f561e46c5b309717ab31e0f64076b2169211572b74e18a1f4525a64fa717a5edf149758129cb04035e7e20ba4005b74809dec644504c2454a77f99b20c5374f3cee7d8c6b68b243cafb30098dce90490fdc3b92f54948f424639e19f8f2020d15513daefadd9e9b12a84761e5ecea088ad561f06209fd4423fcd003fbcd1873ea54963a2fa07c7476b1388f9015d9eac305bea5a3de194f55a17b42d599e5ce62c8b7c19e7e7096137b9d0a65e63c1a3b84538ca65369a20e8822fff5ecb57fc09b4e6845b4f24d4886971ac1ac28c77580ea5672ad14ce4441719c214546d0736cb7ad0bd9fb5b26c6d9c536bf8c857ae42577b36341d392b43323bdae7dfaa491986872a23d827c6ef8b57e7d00feae3834c466400aad1d367823984aa02d2ef492914ae1127e7551b812559378305e4fd52d8bc7e4157ecca451f43ee9f54c82153c7dbfaf7ec35238773051b4e587db136957ec571382b90590b5d1026024580966b7252d2cd3f4f1625c485ba906bff175992188978f2d6274f3a031749ba7e702f56547edc96ec267b84892880d750d7310ebf6db241253cabe4b25a977458c6ffc9e353e62adf05e6efc0fc1ebe89f527705bcc26b701285610d98aa3bf23872b6996d3de480e8d09d783c4a08cd383c9012635aa68978b5006818bbde44f2987479bcb2b711c1beeed27cf09970a164e454f710822eef555c1c7bf9f76d5254ce220c9aaa716847a249488f9cdb44c48f452ab52c40f6d03adc8bf3f197b25e3d127830e74fd81eb14f754205b3a4844c596b6e3a9936ad6fd9e80a16320b381c3ffc7b69eab54536f55abe22c91d898408e880c6dbf0fa5648d517772caa5353b25db6050d753faf198ec1d375de0fa72180a93bab03ded7716cb87505b68ac6a35e73d0fcf34457eff82178952142c7bac9dfd872a9a82f85b24b88fa42d4be0a0ca0b2c70f4c622", "signed": "642d81acf38cf099a833a74f2d80b85448ec2b1a5ddc64470b213d54b7be6133689a7194f5d89792e16e5df755a4fd9ef4689ea952926e0e4ecb3bd481fd910271fe0fd55d5ed1206f28ee16e419fab6fa66a251fa6b0601da261e429f55b8d5ae3f3c52a17fe1ec734b810ab63aade4447039ca0ae4687c2435f561e46c5b309717ab31e0f64076b2169211572b74e18a1f4525a64fa717a5edf149758129cb04035e7e20ba4005b74809dec644504c2454a77f99b20c5374f3cee7d8c6b68b243cafb30098dce90490fdc3b92f54948f424639e19f8f2020d15513daefadd9e9b12a84761e5ecea088ad561f06209fd4423fcd003fbcd1873ea54963a2fa07c7476b1388f9015d9eac305bea5a3de194f55a17b42d599e5ce62c8b7c19e7e7096137b9d0a65e63c1a3b84538ca65369a20e8822fff5ecb57fc09b4e6845b4f24d4886971ac1ac28c77580ea5672ad14ce4441719c214546d0736cb7ad0bd9fb5b26c6d9c536bf8c857ae42577b36341d392b43323bdae7dfaa491986872a23d827c6ef8b57e7d00feae3834c466400aad1d367823984aa02d2ef492914ae1127e7551b812559378305e4fd52d8bc7e4157ecca451f43ee9f54c82153c7dbfaf7ec35238773051b4e587db136957ec571382b90590b5d1026024580966b7252d2cd3f4f1625c485ba906bff175992188978f2d6274f3a031749ba7e702f56547edc96ec267b84892880d750d7310ebf6db241253cabe4b25a977458c6ffc9e353e62adf05e6efc0fc1ebe89f527705bcc26b701285610d98aa3bf23872b6996d3de480e8d09d783c4a08cd383c9012635aa68978b5006818bbde44f2987479bcb2b711c1beeed27cf09970a164e454f710822eef555c1c7bf9f76d5254ce220c9aaa716847a249488f9cdb44c48f452ab52c40f6d03adc8bf3f197b25e3d127830e74fd81eb14f754205b3a4844c596b6e3a9936ad6fd9e80a16320b381c3ffc7b69eab54536f55abe22c91d898408e880c6dbf0fa5648d517772caa5353b25db6050d753faf198ec1d375de0fa72180a93bab03ded7716cb87505b68ac6a35e73d0fcf34457eff82178952142c7bac9dfd872a9a82f85b24b88fa42d4be0a0ca0b2c70f4c622", "signature": "642d81acf38cf099a833a74f2d80b85448ec2b1a5ddc64470b213d54b7be6133689a7194f5d89792e16e5df755a4fd9ef4689ea952926e0e4ecb3bd481fd9102" }, { "secret_key": "c6d9acc5175fa2b8965c158c56ba0a5a666ad2c740cd5bb679bba9b1dc509284", "public_key": "f5cfca211b02fba7720347703bf1631cb308fabcdaa67429527c5b7b676dbaef", "message": "f245100cd2d31648f5f351bda564c9db4a35820cc30ef651337c4cd888070569d117a934b9c918e5df8b3744dd6620ccbc49f6b3e5782a30339dbb9cbed05dd2b3b8c5bf1546e70af636e6615c48b2c3c2d19fe35420df5314f63c4812b58e82a2a60b1802f38e505ce748017afa977d3f9b1b6bea2192acec73bdce12d65e684da4d8b41fa9a86f11086edc2d5296f67efc53ac84070fde13693eb2318f5a8c3b117c233422adcdd352f328f0ec699a4650c93f9b4a7d795d7fc2622a03d99b64f7b3dc3194f6c3b1b69d9907ce092401073f47a28f4799d229092a1b074129954be80ca4a3e6582ee05c302cacb7431d1ca6a451aaed7278abc7f78575241c2a2eea2e84cbf9a334df402109c028e345473a13af9b008e20bc8cf0bcefbb7aa727ec856e9925b4ddd99deba8f252911a590154b579a8aaa31f07dd5025df5cd8a09f742964cc8c365d8aff4eb1d79f6e5a07dac5f4ede92b4e2e61d34cc2d4f0aaaab037ad5fdb95de6cd5984ebaf7cce7f08d0ca0dbbe483ce3cb35cd790ca0427065a34df7f4c2af86efe9b765713aff257f5c1d54709527ad18ac33abcdeedb208064ebaea4835be4942b8fc666ad1b79b6651309e5ea1da302d7fba2e99f0e6319e82b9905a1ea482ba043b6800b330dc48b3313f59bb2f9e8a7f07eb1800a702745db14c6299a982dad897954445b7d98eb5837fd70bf190c649552c8e86feb7ff5b3ed8e0a06704d4553a3c2dd74f18ea8233ae0a50d914fe08fbcd3a1435fed56a9f3a7effa140fb552ddd21dffff7fa47332ddfc1e5317f4177d5e2f11a06ec84ccfb89b654ea81bd42d7e07a387301d0f40264abbf9f9107b30ede864cc7690c06d2e247a060bb2244ad78ed5c5515a1a2a612d61e3d931e28bc939b4d3435eee4f7331b1f0f85375d82ac9a77c43740032051746dc9269458c147d188d84401954a489cb4fbf9bf84ba7d8f100903ce67831b4054d0f58cd883d542c4933103ff070cdfc9dbb0fcc31efca466e77a33f1a813da6dc0c7c31585e8f4fef1ebf42fbd1", "signed": "4d2ce707090b0f3f41462fd75bd609a2724fadfe5ca390e313a42cab42868ed6e9a8914dc13909c0d6f61e63712957c76f3bd8b7f55349715a3a317515c07108f245100cd2d31648f5f351bda564c9db4a35820cc30ef651337c4cd888070569d117a934b9c918e5df8b3744dd6620ccbc49f6b3e5782a30339dbb9cbed05dd2b3b8c5bf1546e70af636e6615c48b2c3c2d19fe35420df5314f63c4812b58e82a2a60b1802f38e505ce748017afa977d3f9b1b6bea2192acec73bdce12d65e684da4d8b41fa9a86f11086edc2d5296f67efc53ac84070fde13693eb2318f5a8c3b117c233422adcdd352f328f0ec699a4650c93f9b4a7d795d7fc2622a03d99b64f7b3dc3194f6c3b1b69d9907ce092401073f47a28f4799d229092a1b074129954be80ca4a3e6582ee05c302cacb7431d1ca6a451aaed7278abc7f78575241c2a2eea2e84cbf9a334df402109c028e345473a13af9b008e20bc8cf0bcefbb7aa727ec856e9925b4ddd99deba8f252911a590154b579a8aaa31f07dd5025df5cd8a09f742964cc8c365d8aff4eb1d79f6e5a07dac5f4ede92b4e2e61d34cc2d4f0aaaab037ad5fdb95de6cd5984ebaf7cce7f08d0ca0dbbe483ce3cb35cd790ca0427065a34df7f4c2af86efe9b765713aff257f5c1d54709527ad18ac33abcdeedb208064ebaea4835be4942b8fc666ad1b79b6651309e5ea1da302d7fba2e99f0e6319e82b9905a1ea482ba043b6800b330dc48b3313f59bb2f9e8a7f07eb1800a702745db14c6299a982dad897954445b7d98eb5837fd70bf190c649552c8e86feb7ff5b3ed8e0a06704d4553a3c2dd74f18ea8233ae0a50d914fe08fbcd3a1435fed56a9f3a7effa140fb552ddd21dffff7fa47332ddfc1e5317f4177d5e2f11a06ec84ccfb89b654ea81bd42d7e07a387301d0f40264abbf9f9107b30ede864cc7690c06d2e247a060bb2244ad78ed5c5515a1a2a612d61e3d931e28bc939b4d3435eee4f7331b1f0f85375d82ac9a77c43740032051746dc9269458c147d188d84401954a489cb4fbf9bf84ba7d8f100903ce67831b4054d0f58cd883d542c4933103ff070cdfc9dbb0fcc31efca466e77a33f1a813da6dc0c7c31585e8f4fef1ebf42fbd1", "signature": "4d2ce707090b0f3f41462fd75bd609a2724fadfe5ca390e313a42cab42868ed6e9a8914dc13909c0d6f61e63712957c76f3bd8b7f55349715a3a317515c07108" }, { "secret_key": "7dfae416419d7b0d4fc1f823840c3e4bd4adcd4dc2dc17b38637acedacbdbb45", "public_key": "bc51d7745931317e1e346e2e7c92039181b6bf38ee2f5a44fbe2339c4f952ab9", "message": "ec843dc4dda6e902e9be31b70f11763b757ab6ce7334dc00764b2d084e9daf2484485984ee28a2830fcb94c541cb469440036731de80ff560f530c9d9e6e1f7d9c4c5bdf50b04f5403c29f76d7e36e00bbea35db1cc60da8d776526266c3324ce7efec6450859609266856d701a47a48dee8bf37409565c7fbfa99a204e5530c971c605b44305d5c7467894114253cf43cddf18b6296dd254a4d96ac7000918186dfd4bf454ed30974c553d0ae151ad4cf540cecaaa0b5948b0985a9c7b6e7815932bac11732fc7d10267f6bf8f1e7c08d650e567b4edd15ae7958410e42f1f537fa732f727a268388321d5344c4e78bb9a74eab9d6abf968965c66693d5f112dd4c14fdfdd96005eaa6757fa2cc1013fe4327ab0999d117f3dbf325b07cd454d4b141991ef7e23db5ee24beda35884aa3704808648aa43cd6256259f7d3db5e055311f253e8b57a4cda5afe0b0adfc364e160ca37e8dec6b95aa6152e5d5da6eb91be0e44ffe8e49533267b7eb795f5f8e0b2c35b29dfbc87585f22bd5b909dfd6a5edc0e3a9d97b0c4f3adc51e969937c08fd65f537aacda8f11275af02c3354542630f3920c393f5c42b9fc633de9d94c72e3f20002349ad0418035b3f25f02ca928e5b2d40a77a1c3e56221f4b9db0c25b096d6e5d0fe758da2c69053e8d086def4edc6e3453783ffc63a4960122d923671a906008bac10561ae6219d2b51d5367bf13ccabf5931b9f186eb109bacde40e1af2b56481e0c6dc6f5c5473f8001cf371919acb40cec5b962ebba80e32d6ebac4806d04d24768c2ad2e3f92a8cbe47754f9bf615953522b263dc24937fbd932c8c459eb8b109443af6c195a59fd2721b0125628f2b8143cf3c128bcec1392efd16b734c10716d96ba7d1f413917ccafa5bf5f83f524fe8406a152115ea770e1745e82e8b51d752b8bd785df48bfc12041bf874fc73afb42ca5d69c6416479ceb4aaa0492b6ff21ee12db2213a4286fd5605c93a7bb8a3b071b0b25fb01d77abbc8771489470a107aadae9f640c24dfd5328f60f4b7d", "signed": "da34b1983e8c55e41fda8ec8abf23b367a0da606c8cdbb1e8b57e0343c0557a5f0e815e7f22f8605ae93b27d03776ac1f7de3d792ea2933ac22d2dc23b323d0cec843dc4dda6e902e9be31b70f11763b757ab6ce7334dc00764b2d084e9daf2484485984ee28a2830fcb94c541cb469440036731de80ff560f530c9d9e6e1f7d9c4c5bdf50b04f5403c29f76d7e36e00bbea35db1cc60da8d776526266c3324ce7efec6450859609266856d701a47a48dee8bf37409565c7fbfa99a204e5530c971c605b44305d5c7467894114253cf43cddf18b6296dd254a4d96ac7000918186dfd4bf454ed30974c553d0ae151ad4cf540cecaaa0b5948b0985a9c7b6e7815932bac11732fc7d10267f6bf8f1e7c08d650e567b4edd15ae7958410e42f1f537fa732f727a268388321d5344c4e78bb9a74eab9d6abf968965c66693d5f112dd4c14fdfdd96005eaa6757fa2cc1013fe4327ab0999d117f3dbf325b07cd454d4b141991ef7e23db5ee24beda35884aa3704808648aa43cd6256259f7d3db5e055311f253e8b57a4cda5afe0b0adfc364e160ca37e8dec6b95aa6152e5d5da6eb91be0e44ffe8e49533267b7eb795f5f8e0b2c35b29dfbc87585f22bd5b909dfd6a5edc0e3a9d97b0c4f3adc51e969937c08fd65f537aacda8f11275af02c3354542630f3920c393f5c42b9fc633de9d94c72e3f20002349ad0418035b3f25f02ca928e5b2d40a77a1c3e56221f4b9db0c25b096d6e5d0fe758da2c69053e8d086def4edc6e3453783ffc63a4960122d923671a906008bac10561ae6219d2b51d5367bf13ccabf5931b9f186eb109bacde40e1af2b56481e0c6dc6f5c5473f8001cf371919acb40cec5b962ebba80e32d6ebac4806d04d24768c2ad2e3f92a8cbe47754f9bf615953522b263dc24937fbd932c8c459eb8b109443af6c195a59fd2721b0125628f2b8143cf3c128bcec1392efd16b734c10716d96ba7d1f413917ccafa5bf5f83f524fe8406a152115ea770e1745e82e8b51d752b8bd785df48bfc12041bf874fc73afb42ca5d69c6416479ceb4aaa0492b6ff21ee12db2213a4286fd5605c93a7bb8a3b071b0b25fb01d77abbc8771489470a107aadae9f640c24dfd5328f60f4b7d", "signature": "da34b1983e8c55e41fda8ec8abf23b367a0da606c8cdbb1e8b57e0343c0557a5f0e815e7f22f8605ae93b27d03776ac1f7de3d792ea2933ac22d2dc23b323d0c" }, { "secret_key": "709416074997b9c9af4d37a01139e8a3f9f2ce5d72a57d805e822a81186d017e", "public_key": "aee110f1f4d46ea60649d786b150052e287a9da60122c47b0908fa8b2ca28a80", "message": "eddaa369c0e31a1fcc1da46f65362442a0cc21c7dcdd5cd90e0a2ee9f25110812ba114931c868a708607ac16084d79715d13b338c05c6aef7343e7dad282f96fe28193188f0cc893c7dce805fd3a7cd268b72894160b5245fed9fa9943b7c80adb3c2d1a353d8f12df25a31dde7fa385bbec351da66f153032e17756273f8d54e9a3b9ea25ae67d1e9c18cc68be601e3d68282818ce0e7cf88a4d1336453021732f08d9e76cd23637929b0911d5f8614f4842e670c142860afc265c50172b13bfd35ad8fc54b28657da32bac153ba9affc897afb3c721f48caa46240585710b0f2d24d5ff4965d1d10f1a07b06abea6a08e1d6f1500da12c434a6d778c941067108000475ce831bcfe2d0afe40b7419d07059bc0cd8dce4be9587ff29ad8bf0b268ae23ce0da5bb5bf74ff0b2b31b82112a9fd5abd9bfd0a90e6f4723548c6bb2f99dc061ba32eba2d53e6bc79bf441b23fb7460de04e8e8efbcd4d4cc7355de9e3b0861a681b983839d4488e551751f23e9a6e2e4d443273b9e0fe64d8acd1c748b5559438223dd21b5183189e0f3c0e8ed414c0356bab77a654de1a5771462ef14344970a491511a722914f4a89f4f1a827e18cd84479cc92592eadf8de2df824b976dcbd284a3ba64bcdb0df15e8f41c0b2471586b26a06353d905028235c1c6e5c4587222725af083e11e79c943aa444d4aa41218d3e974336e372813e99e2b0c5f0ae810ffed9a7a3d6cb74c5473d990a5911329b8e82ec6bf2bd4321bb487370f8739e7a2a4a53430833d45b9fe3deb93f79fc6a51d563695ecdb97858d213da584434b7c71546aae8d967e1c6d0082b10d4a72de1742e53c4b2f92eb8b5c8c35ab6535ea8100b37924a0a91d2a728d0f5642437aa66c82ab74b5d0745ec08f7705cb81fa079d89ecdc9aa1f8d7d82dc7746d34615343a6925dc318f352a2b45012438424f9098fddf6e61fd1f8fb49da40b3eece89a1af1996de70cd1696cbfd9e301ea5f4437c71ac2a032254c140a90e85fb8ffc4667fa139c1ee9bbf12eed906a967bc0921", "signed": "8e4b41f097d83614184ba7f52ba2fd9f0565f8a63721ef55f93162826b9f0ac070c0e2864b5ffd8eccc18efad18b2ce84be57c0b4a41c52e20ef37722377c60feddaa369c0e31a1fcc1da46f65362442a0cc21c7dcdd5cd90e0a2ee9f25110812ba114931c868a708607ac16084d79715d13b338c05c6aef7343e7dad282f96fe28193188f0cc893c7dce805fd3a7cd268b72894160b5245fed9fa9943b7c80adb3c2d1a353d8f12df25a31dde7fa385bbec351da66f153032e17756273f8d54e9a3b9ea25ae67d1e9c18cc68be601e3d68282818ce0e7cf88a4d1336453021732f08d9e76cd23637929b0911d5f8614f4842e670c142860afc265c50172b13bfd35ad8fc54b28657da32bac153ba9affc897afb3c721f48caa46240585710b0f2d24d5ff4965d1d10f1a07b06abea6a08e1d6f1500da12c434a6d778c941067108000475ce831bcfe2d0afe40b7419d07059bc0cd8dce4be9587ff29ad8bf0b268ae23ce0da5bb5bf74ff0b2b31b82112a9fd5abd9bfd0a90e6f4723548c6bb2f99dc061ba32eba2d53e6bc79bf441b23fb7460de04e8e8efbcd4d4cc7355de9e3b0861a681b983839d4488e551751f23e9a6e2e4d443273b9e0fe64d8acd1c748b5559438223dd21b5183189e0f3c0e8ed414c0356bab77a654de1a5771462ef14344970a491511a722914f4a89f4f1a827e18cd84479cc92592eadf8de2df824b976dcbd284a3ba64bcdb0df15e8f41c0b2471586b26a06353d905028235c1c6e5c4587222725af083e11e79c943aa444d4aa41218d3e974336e372813e99e2b0c5f0ae810ffed9a7a3d6cb74c5473d990a5911329b8e82ec6bf2bd4321bb487370f8739e7a2a4a53430833d45b9fe3deb93f79fc6a51d563695ecdb97858d213da584434b7c71546aae8d967e1c6d0082b10d4a72de1742e53c4b2f92eb8b5c8c35ab6535ea8100b37924a0a91d2a728d0f5642437aa66c82ab74b5d0745ec08f7705cb81fa079d89ecdc9aa1f8d7d82dc7746d34615343a6925dc318f352a2b45012438424f9098fddf6e61fd1f8fb49da40b3eece89a1af1996de70cd1696cbfd9e301ea5f4437c71ac2a032254c140a90e85fb8ffc4667fa139c1ee9bbf12eed906a967bc0921", "signature": "8e4b41f097d83614184ba7f52ba2fd9f0565f8a63721ef55f93162826b9f0ac070c0e2864b5ffd8eccc18efad18b2ce84be57c0b4a41c52e20ef37722377c60f" }, { "secret_key": "3dcb7ae7d9f0f141f1d9f07883635b913ed29fb61d0f741c9afd05a27b045b06", "public_key": "ae62b7ee1b8db5764dafddd9724acc106d6c0a4d1e85d8906f7584b558f577df", "message": "38116a572669070dd5863218c91a77a4ab47553688488c792838509e9aba25067adb7ea4249848009d914ae987a6032348c1c0681cf977a9552dd6bbf4e6ff32acc9fa61cbee25a39307650f8ba6a7ce421ef2f71bccc0958138f9324c86bf2e528fa3e4d1b19f9f2ca5268409b8cc19c62dd979b89697e457ed2d98bd2096f62d3d9e247388795927803e79ab71d4f72f568e945a8a162159d9b84836e4585644d4979f614aada73ad413a83391e9cf880c42ac2a98343b6a82cd2b61581456f6de5ceb24fe46b7625d52ab2c2c324ac74703d15e15f1aeff8055d2f739f7363e16ec1d78be2c6299436c8c8d336bd29271a897a6ec932ed08725be21b28f9aa14eaf4f71853154db14587c930ab3eb0227ad7ffb45b3baa6a999499cc8a6e45b1ab4d0b339782bcd9cfbcf88cf7eae891cc841e9c88a1f6a691f3948a6bc85ba7f4611642e84223c3b178946ddbeddcfcdef4ae4c4e1a814b9b1f02b1eaa824db93f44b27d14206b340465a1cefcf535c63e55c4287224262733d98aaaa154f3ad42cd8546a461ce0d46d886d3461a2150cb45dbe56473ff63d3dc7a2b957b823969f19b5968e8b424c879741926d82c6386753b0fa1f080284e5578942363aadeb21f8e1e8909fa6c380764149bc915b228604efc56d92e4beb720edc74c4d78f925d6cfdf7ba2f14b5623775810d2d07bd388c573e36523f215738e69114dcf8d80f170bfa676e31fb626a7d449ed96647363475970c8c47809709bcb5e7200f2a227c7c8e7b000f30c0bde61d67bd6895361629a36c8fdd5a56b81efbacf15c1b3530a08cded5b1fd457fbd2f03042f56f1b37ed15cdb912fa0298c276725087ee27d3cf2550fe6e8a0330af417f4f5baf03627ed67c5f8323363abac5a1fe34823180e3e0e2080f75bfd91c207cf6baa9a229cf443dd442c5902e0673f3252b8526346585872f6cd366025a56992b70ede39bc8d322f9c22a1dc599e9f0d524cb6d2ea5ae2878ef6bed4b702807f1e1e73ebf290eb6c0eeb85c13716f626aa90d364b4904837ce05", "signed": "09a1e6fedf971b3edbfaefbeb89aa539ca0b02b37e7ac4ea8920d6d4348ee0cf9a2d5e96fce517c665e7c38368baf24979249a95b70ea7436c00785f16a3ae0938116a572669070dd5863218c91a77a4ab47553688488c792838509e9aba25067adb7ea4249848009d914ae987a6032348c1c0681cf977a9552dd6bbf4e6ff32acc9fa61cbee25a39307650f8ba6a7ce421ef2f71bccc0958138f9324c86bf2e528fa3e4d1b19f9f2ca5268409b8cc19c62dd979b89697e457ed2d98bd2096f62d3d9e247388795927803e79ab71d4f72f568e945a8a162159d9b84836e4585644d4979f614aada73ad413a83391e9cf880c42ac2a98343b6a82cd2b61581456f6de5ceb24fe46b7625d52ab2c2c324ac74703d15e15f1aeff8055d2f739f7363e16ec1d78be2c6299436c8c8d336bd29271a897a6ec932ed08725be21b28f9aa14eaf4f71853154db14587c930ab3eb0227ad7ffb45b3baa6a999499cc8a6e45b1ab4d0b339782bcd9cfbcf88cf7eae891cc841e9c88a1f6a691f3948a6bc85ba7f4611642e84223c3b178946ddbeddcfcdef4ae4c4e1a814b9b1f02b1eaa824db93f44b27d14206b340465a1cefcf535c63e55c4287224262733d98aaaa154f3ad42cd8546a461ce0d46d886d3461a2150cb45dbe56473ff63d3dc7a2b957b823969f19b5968e8b424c879741926d82c6386753b0fa1f080284e5578942363aadeb21f8e1e8909fa6c380764149bc915b228604efc56d92e4beb720edc74c4d78f925d6cfdf7ba2f14b5623775810d2d07bd388c573e36523f215738e69114dcf8d80f170bfa676e31fb626a7d449ed96647363475970c8c47809709bcb5e7200f2a227c7c8e7b000f30c0bde61d67bd6895361629a36c8fdd5a56b81efbacf15c1b3530a08cded5b1fd457fbd2f03042f56f1b37ed15cdb912fa0298c276725087ee27d3cf2550fe6e8a0330af417f4f5baf03627ed67c5f8323363abac5a1fe34823180e3e0e2080f75bfd91c207cf6baa9a229cf443dd442c5902e0673f3252b8526346585872f6cd366025a56992b70ede39bc8d322f9c22a1dc599e9f0d524cb6d2ea5ae2878ef6bed4b702807f1e1e73ebf290eb6c0eeb85c13716f626aa90d364b4904837ce05", "signature": "09a1e6fedf971b3edbfaefbeb89aa539ca0b02b37e7ac4ea8920d6d4348ee0cf9a2d5e96fce517c665e7c38368baf24979249a95b70ea7436c00785f16a3ae09" }, { "secret_key": "297311ddeffec9d2be68ef7b2a20fe2d277e1d8e51648b03572ada27ec1f9f43", "public_key": "6a6c28e761640c4008333aae5a3366302e2f4677a953ba482ab6fb4a1d70b447", "message": "2652acfc3bdf09a599ec6786bbd94fe577cf578e0263cc68d9f57a6c83458f80acd8a75ef03040a635672b968ff2afdb288d28b9996f6415b2f3175e9ea37aeb05df81812e38a4c976eb92856cedb91a269a46fca5df9bd730fd84452b4bd93577c61f42c14113979882a86a9fe632e4756afd89816fc4670a310503fdaad2db764c3721213c3e60f29c2668d4de8f42b087f25cd56c69a4e48f134f5598cf145be638a5c2318863329061729aac91da6a191fd774880cf9cb555eec15b0044f10e5433fb46a9b8892da8f6d24f142588b70ff0b49200c506b88bed449ad10d3f92c2baeda6bbf58676c5bbc67d31f64fb12e8d5e78876d5c849fc314b2cf8010c510204c8633d0cc31856ec6a114ea8a89c48927b07a31ab842c9b8352d9367345141a99b40049d5c48e7d27cab427adefd1f0fc1136b353cb01c3def91fffee8ad91e88f4bb7d2615c0dcc95344cd01950938ecb14b8446b56a06bf2f2f65fb8735e8a7bc96bb46ce9cac71a88eb8fda5e69d69eb29aa42a016b8583893e9d7277cb1359c5687eedcd599d8a46e6c14963637db04a929f4bc79304ac2dae733b3a839eb74fbe3de5042fd655eaecb15f39b2fe16dad8a6ff8dbc054fed51282a856e9da6316fac6db5d56f77f18da8412eb377e5b1b8f4cb1354ecfe8fe8fd54e62d767a80de04cb7620229a8831dbc9ecd4578ffa2ff06b5445e440d69aabc94c47bd17f22b69f52eeae5cfcd01a5cafe0580072ae9166b95743d68c3564c5a7e46f24bc48a898a1ab2ebe63f36851d2aacfa0c4f32d993771d314e725a43d9805d1371cf723ef161d42e63ffca688d7f0e21ef5b3f9a561a6210702b85fbd1f8ca75389cc7a22739bae4ded93757f1520dc38844a1a88be8e09645059148807b933770878cb8a9ad9211317131e69324532fd0279b83185b628fc2f9e21500384693fa29f26bd1b9c301601367665f05f372dab4e3107726cd3f639ca62bf63a75f77eaa75f7136157ada2374e65fb4fd349b45e25441fd21b13e6911366b97cfb4d6ad522b850adf40c", "signed": "4bf0b92c6ee4eace5e8eb10370ff9d9c68a5749d59899d04327aaa38f8f825e032e59742b37de23107a3ecdd3f7a0d08122614b78fdd37293c8d05e28f5f71082652acfc3bdf09a599ec6786bbd94fe577cf578e0263cc68d9f57a6c83458f80acd8a75ef03040a635672b968ff2afdb288d28b9996f6415b2f3175e9ea37aeb05df81812e38a4c976eb92856cedb91a269a46fca5df9bd730fd84452b4bd93577c61f42c14113979882a86a9fe632e4756afd89816fc4670a310503fdaad2db764c3721213c3e60f29c2668d4de8f42b087f25cd56c69a4e48f134f5598cf145be638a5c2318863329061729aac91da6a191fd774880cf9cb555eec15b0044f10e5433fb46a9b8892da8f6d24f142588b70ff0b49200c506b88bed449ad10d3f92c2baeda6bbf58676c5bbc67d31f64fb12e8d5e78876d5c849fc314b2cf8010c510204c8633d0cc31856ec6a114ea8a89c48927b07a31ab842c9b8352d9367345141a99b40049d5c48e7d27cab427adefd1f0fc1136b353cb01c3def91fffee8ad91e88f4bb7d2615c0dcc95344cd01950938ecb14b8446b56a06bf2f2f65fb8735e8a7bc96bb46ce9cac71a88eb8fda5e69d69eb29aa42a016b8583893e9d7277cb1359c5687eedcd599d8a46e6c14963637db04a929f4bc79304ac2dae733b3a839eb74fbe3de5042fd655eaecb15f39b2fe16dad8a6ff8dbc054fed51282a856e9da6316fac6db5d56f77f18da8412eb377e5b1b8f4cb1354ecfe8fe8fd54e62d767a80de04cb7620229a8831dbc9ecd4578ffa2ff06b5445e440d69aabc94c47bd17f22b69f52eeae5cfcd01a5cafe0580072ae9166b95743d68c3564c5a7e46f24bc48a898a1ab2ebe63f36851d2aacfa0c4f32d993771d314e725a43d9805d1371cf723ef161d42e63ffca688d7f0e21ef5b3f9a561a6210702b85fbd1f8ca75389cc7a22739bae4ded93757f1520dc38844a1a88be8e09645059148807b933770878cb8a9ad9211317131e69324532fd0279b83185b628fc2f9e21500384693fa29f26bd1b9c301601367665f05f372dab4e3107726cd3f639ca62bf63a75f77eaa75f7136157ada2374e65fb4fd349b45e25441fd21b13e6911366b97cfb4d6ad522b850adf40c", "signature": "4bf0b92c6ee4eace5e8eb10370ff9d9c68a5749d59899d04327aaa38f8f825e032e59742b37de23107a3ecdd3f7a0d08122614b78fdd37293c8d05e28f5f7108" }, { "secret_key": "4db2b58144a8d2d0ec03bb9bc29b4ca893854c80b64afa4af7a9c936935ecb04", "public_key": "fc5cd750e174ed718bd938fa8ed99a1b9d556ba7670f2a77daf1c720113732a5", "message": "c8d1dbc936911e122cee18f92b16a39a2eef0823b227f898cdf5842b93d59fc002edb5498a20872e19554ef73999eb3a7b3e2fdd9070e1efa9228e9e93b29a868ae3799e4e572324836b1ad5aa812bf00f845bc217ebbc3fabdc4e1b6e51ef9efac2770aa0a4a11ee52ab956ac6448aa2629cb61dbb1f1edb3bde99b4876da392a6e0b9a0c31849a5890aea9522f56d015a1935015b91bf4c6a0011d2377d671c3d0d753c27f8c76e405d0230f1f4b9b88fcebba1eaf13777235e55324b7d3f81e686109d91ce689530b90d2c5c71dd18772b385d62ccbfd2e089a1b670983f60c21c4455cb9d1a0dcaa74c874e35211f8227ff7c234dff85ec0b07e368cfa50a343578395a14c68f1f89bd4ecbc172ef805e5831ec89475fcc8d685ca9255a77e3ba3c147508ec92d7bcce879af0abdd2416b67b5f50507337914f390bbe0b450b6a2f1159372c4bccea382ce3d6d9fb2515ecf7930059a0552b75f978862bf97e8325af24d1b8ce9512bfc7cef884232042341d82f9b5dad2e502ac6ac795f99dac7fc60e3b8639d0e1500dead4e78aca109957d577a13c1925d7403c1acf989a9de6711e23c67bf8722f551b774cada931b5fd973434e3b7172819883e70c52785e3b49d323d05636641158640dcf6a4c200eb2c13b1beeb2dc360352470d15386e59e6fa60367e5e7f172b21159d5ee7cab0d7f5868239858e2a93550480fe8fb4dcaf4f224c4b2ad5448791632df30e8e5fb998b35ea9aec8c934a4403aef82187ca1abf82a344d00ffb993d9ff3461d6fecdaf5d3b481e0d31153dbf6aed288c8add064e8331550141bd5f7a7e047b8607d846a6bfb72d683446a445114606250d8d2d3a8b9508bb07d4623cdf1788b5499e9cb9a1379849bfa19c9a9f4cd3d9253adffda25f47c811be833b02f3327ebba83730195d614bae6fe4e7a3830815d2af400d20a9417a095e7e8eea1044917cbe512c4018d656e2db67bb989c00e1e507623e8278d729925b84fb5c186a7bac189e6d6ab14fd7b62fdc632bebb5f77cb5cc2f707df4053099", "signed": "424517aadd853ce3985759a327e7760d9156d3b27345383f0e4ad6661ee4a3724d18d820f6c557f82797beb62d2f085433744f89a2d85293796481862ef8a40fc8d1dbc936911e122cee18f92b16a39a2eef0823b227f898cdf5842b93d59fc002edb5498a20872e19554ef73999eb3a7b3e2fdd9070e1efa9228e9e93b29a868ae3799e4e572324836b1ad5aa812bf00f845bc217ebbc3fabdc4e1b6e51ef9efac2770aa0a4a11ee52ab956ac6448aa2629cb61dbb1f1edb3bde99b4876da392a6e0b9a0c31849a5890aea9522f56d015a1935015b91bf4c6a0011d2377d671c3d0d753c27f8c76e405d0230f1f4b9b88fcebba1eaf13777235e55324b7d3f81e686109d91ce689530b90d2c5c71dd18772b385d62ccbfd2e089a1b670983f60c21c4455cb9d1a0dcaa74c874e35211f8227ff7c234dff85ec0b07e368cfa50a343578395a14c68f1f89bd4ecbc172ef805e5831ec89475fcc8d685ca9255a77e3ba3c147508ec92d7bcce879af0abdd2416b67b5f50507337914f390bbe0b450b6a2f1159372c4bccea382ce3d6d9fb2515ecf7930059a0552b75f978862bf97e8325af24d1b8ce9512bfc7cef884232042341d82f9b5dad2e502ac6ac795f99dac7fc60e3b8639d0e1500dead4e78aca109957d577a13c1925d7403c1acf989a9de6711e23c67bf8722f551b774cada931b5fd973434e3b7172819883e70c52785e3b49d323d05636641158640dcf6a4c200eb2c13b1beeb2dc360352470d15386e59e6fa60367e5e7f172b21159d5ee7cab0d7f5868239858e2a93550480fe8fb4dcaf4f224c4b2ad5448791632df30e8e5fb998b35ea9aec8c934a4403aef82187ca1abf82a344d00ffb993d9ff3461d6fecdaf5d3b481e0d31153dbf6aed288c8add064e8331550141bd5f7a7e047b8607d846a6bfb72d683446a445114606250d8d2d3a8b9508bb07d4623cdf1788b5499e9cb9a1379849bfa19c9a9f4cd3d9253adffda25f47c811be833b02f3327ebba83730195d614bae6fe4e7a3830815d2af400d20a9417a095e7e8eea1044917cbe512c4018d656e2db67bb989c00e1e507623e8278d729925b84fb5c186a7bac189e6d6ab14fd7b62fdc632bebb5f77cb5cc2f707df4053099", "signature": "424517aadd853ce3985759a327e7760d9156d3b27345383f0e4ad6661ee4a3724d18d820f6c557f82797beb62d2f085433744f89a2d85293796481862ef8a40f" }, { "secret_key": "c820413c2456747104662ef4dff3ac233ac4b91a76d3c4ea754490bc9b1e291f", "public_key": "8993cea2f7f2806c77b3981b54bfa9bf1762151b418e5e725371ca2c04d223ee", "message": "d2992f83924a594887e6ef13f2ae808fc8639c7b2c994faf0f795e36016dab7700a0ee530170f0b9fe98ab7588ce03bc50c2bae65e052647e756735b35d0b59c964e917d8c83e2f9fecc4cb05564287f0e34c9494005e25b1a8b1b942b54d89035f1b1c3c945fcc84e4a39efa2ca50959b459af74d21b6242e2f56518f70e8679257c089d26c3bb792687c923355b2c18ee2136d40cba45acb64240d9667f39dba3639b6516d4c4947573ef4ced876b5b2ea3489eaea539f557f58da204691a76e29c94b8b0538232c5f7d0bb0fdd016910431354b3e1e7ce62ad436917cd5c315a5be9b971c80f97bc9d5c156ffd64fd4e31da56083e02a0c8fce554db68674cb62700ba951752b829b03c542327412eec9ccc6a50adf47bbee15446682da2fea42048936d763060cd8f539652616dfa808d623ff777b4113652e789ec025b85e04efe8ad4c960b190bf4a5a6324d6f57c1ad22018c83cd7e7e097fc67b80269c13b4dd9701ca98f9876958ba7689c6f6f10a732a64bef22e8b98bd304d5dbf4fb1f9e4ca539a5c4aa619c44d6f58f824b2dbae77b7e83b56db5e5aa7b0ae9ce1cd10a69f04a80f1379eb0c474e4782df0e3ba6a148226bd1a662d95ee2d67c5207333cb1d54176d9e506459479029f31dcace269938f6bc562787841dcfe101f4db60bd66016e1eebb6bfbd9cd83042dd1379a464f405aaae3c11807848cc4f95c3cc6fa92ab4ea5305834eb86b873fa30ed1f7f470bf663f1a70cf9e60ab680cd1dbbd03ac0433b3d4bb482f8b344d46b3aa934b8633f57090bea5fccca6488799835f133f8bcf6e887ca59d19076d6ca19d4e28349051e016b03e9a920f4120fb523d1371d0e38467319543f127ed914b43ad062226a536582db728ccd76e983f11766a8863c2f424f65508dcb26fe0c5a800c35093960a121976e3051e2ef1a2a99c12fb7bd8bc037a439686806eb72017a071a91b3e39c90e86bc335f9bb543b127c9886738cb53806b9cb3c2594c7effc2a5920aa834be65c49f47964e89eec74728de771f3d675de9d1e", "signed": "7ef70e4a14954d509f117f4bd01b220bcc192d3b5fdfc3482fbbc3b69dc068a7c4761d1bebc2317d6db74f906a155642b0a3c6592bdc72e64eac6f203fb74e02d2992f83924a594887e6ef13f2ae808fc8639c7b2c994faf0f795e36016dab7700a0ee530170f0b9fe98ab7588ce03bc50c2bae65e052647e756735b35d0b59c964e917d8c83e2f9fecc4cb05564287f0e34c9494005e25b1a8b1b942b54d89035f1b1c3c945fcc84e4a39efa2ca50959b459af74d21b6242e2f56518f70e8679257c089d26c3bb792687c923355b2c18ee2136d40cba45acb64240d9667f39dba3639b6516d4c4947573ef4ced876b5b2ea3489eaea539f557f58da204691a76e29c94b8b0538232c5f7d0bb0fdd016910431354b3e1e7ce62ad436917cd5c315a5be9b971c80f97bc9d5c156ffd64fd4e31da56083e02a0c8fce554db68674cb62700ba951752b829b03c542327412eec9ccc6a50adf47bbee15446682da2fea42048936d763060cd8f539652616dfa808d623ff777b4113652e789ec025b85e04efe8ad4c960b190bf4a5a6324d6f57c1ad22018c83cd7e7e097fc67b80269c13b4dd9701ca98f9876958ba7689c6f6f10a732a64bef22e8b98bd304d5dbf4fb1f9e4ca539a5c4aa619c44d6f58f824b2dbae77b7e83b56db5e5aa7b0ae9ce1cd10a69f04a80f1379eb0c474e4782df0e3ba6a148226bd1a662d95ee2d67c5207333cb1d54176d9e506459479029f31dcace269938f6bc562787841dcfe101f4db60bd66016e1eebb6bfbd9cd83042dd1379a464f405aaae3c11807848cc4f95c3cc6fa92ab4ea5305834eb86b873fa30ed1f7f470bf663f1a70cf9e60ab680cd1dbbd03ac0433b3d4bb482f8b344d46b3aa934b8633f57090bea5fccca6488799835f133f8bcf6e887ca59d19076d6ca19d4e28349051e016b03e9a920f4120fb523d1371d0e38467319543f127ed914b43ad062226a536582db728ccd76e983f11766a8863c2f424f65508dcb26fe0c5a800c35093960a121976e3051e2ef1a2a99c12fb7bd8bc037a439686806eb72017a071a91b3e39c90e86bc335f9bb543b127c9886738cb53806b9cb3c2594c7effc2a5920aa834be65c49f47964e89eec74728de771f3d675de9d1e", "signature": "7ef70e4a14954d509f117f4bd01b220bcc192d3b5fdfc3482fbbc3b69dc068a7c4761d1bebc2317d6db74f906a155642b0a3c6592bdc72e64eac6f203fb74e02" }, { "secret_key": "6769cc8e125617c22ce57237a4fca1507f941234661df74328d04ab62ef86c47", "public_key": "05112ca60baff79b4916c1bee2b9390c047af08c35ebb3c381b9748d1dd4c4fd", "message": "685489739b98564749587ff1ac96ba682da30b40a4de24f54ec8b083dda45333162167cb3f97b2c7314ce7a3f3f3d319ccc35bb6a9f0077d563161e281469cf08968d9dcf7ae5fff830a5db00bc38010e6662d494f3c8647c4f70ce2d29a9da84610a080b5759a3b582052dfde66e4a7fa5fb27f065073fe723d83701d5bac06ca43b46d1e58097670c194a13af8b573a3791a9661557cbc042757ab8add0ef7cf4f35435a4212353fcb3c203c73dbc9d26852d0e91732e3621ce828929cdca4d9192048751922ed225eab2900cff971a2a2d342463648bbb1944319a8ef6d43db62480fbf1d7257d22694539793f25c927917caab25c1193a2d2b23bb5cb8569aefff4f0ca423d19bbd46fc5ef7524ff8cb706ffc47076509c05a8158af77f98df6a9b5cb3244aba4b5c5f9ce597e7d29ba07013dcac1911b6de7113c736a4005c459992979019a45b2dd802a07660909eb4ce205408170d82545dacba8686dbde927dbc9c7d962058e9a95ea66b8dfd3ea435357a93c73948cd355f6ac6552323f17c2a678662bc0e9726ad5a5251dd27647404cbfe61ceaafdcfc08a475ffd87cb7f597e56ac1670409dd9408ae4770420c6e5e6dd8e748fe03a72dc12803d02771d92f47e6e717ccc144fc037275b6f745dd30da1a45d29db6d9073eee5009cfd5462733414a495f349db0b6dbf2cea9ccd57238ed5ee91ad8bc86179ad5695a85a50484e617751de5ef7a7d8a8db950a98a6b7f7dee9d42a5df692fccf555c940dc39cf2eac48cb9d15cda14dd2a7ecc0b76ebec68ad4177d1117e07766c48590d43ca7662868eb9790ac29f4f2392b9a93f89759e7ba546b925bd86f807d8d16c7e637dcc666e90590bf430d986a67f1b0c7c2c94930845869ed8d8adde18fc1887456881b4b26b53dcba7a526f0eca14e8bb689d66f0aa1b253c3dcfcf59540d5d2f5ad617f52c30938a5a92ea385077d75aa4ac07afc2b35fb8c1d5e78eb295fc20fe37c41ac06959d3a1797843ad7056c1b412dd0b480aa3b39bcc20587d9a0fef92c6c950ebc5bb8e142", "signed": "d39d853d2c2c5d21b5871ea5a75c041048d93a47dc599a5fddc0856285ce636fcdfd8564083d06ff284a524bc633cfdfc3b037163d674cb9bb5ba3bc25bed00e685489739b98564749587ff1ac96ba682da30b40a4de24f54ec8b083dda45333162167cb3f97b2c7314ce7a3f3f3d319ccc35bb6a9f0077d563161e281469cf08968d9dcf7ae5fff830a5db00bc38010e6662d494f3c8647c4f70ce2d29a9da84610a080b5759a3b582052dfde66e4a7fa5fb27f065073fe723d83701d5bac06ca43b46d1e58097670c194a13af8b573a3791a9661557cbc042757ab8add0ef7cf4f35435a4212353fcb3c203c73dbc9d26852d0e91732e3621ce828929cdca4d9192048751922ed225eab2900cff971a2a2d342463648bbb1944319a8ef6d43db62480fbf1d7257d22694539793f25c927917caab25c1193a2d2b23bb5cb8569aefff4f0ca423d19bbd46fc5ef7524ff8cb706ffc47076509c05a8158af77f98df6a9b5cb3244aba4b5c5f9ce597e7d29ba07013dcac1911b6de7113c736a4005c459992979019a45b2dd802a07660909eb4ce205408170d82545dacba8686dbde927dbc9c7d962058e9a95ea66b8dfd3ea435357a93c73948cd355f6ac6552323f17c2a678662bc0e9726ad5a5251dd27647404cbfe61ceaafdcfc08a475ffd87cb7f597e56ac1670409dd9408ae4770420c6e5e6dd8e748fe03a72dc12803d02771d92f47e6e717ccc144fc037275b6f745dd30da1a45d29db6d9073eee5009cfd5462733414a495f349db0b6dbf2cea9ccd57238ed5ee91ad8bc86179ad5695a85a50484e617751de5ef7a7d8a8db950a98a6b7f7dee9d42a5df692fccf555c940dc39cf2eac48cb9d15cda14dd2a7ecc0b76ebec68ad4177d1117e07766c48590d43ca7662868eb9790ac29f4f2392b9a93f89759e7ba546b925bd86f807d8d16c7e637dcc666e90590bf430d986a67f1b0c7c2c94930845869ed8d8adde18fc1887456881b4b26b53dcba7a526f0eca14e8bb689d66f0aa1b253c3dcfcf59540d5d2f5ad617f52c30938a5a92ea385077d75aa4ac07afc2b35fb8c1d5e78eb295fc20fe37c41ac06959d3a1797843ad7056c1b412dd0b480aa3b39bcc20587d9a0fef92c6c950ebc5bb8e142", "signature": "d39d853d2c2c5d21b5871ea5a75c041048d93a47dc599a5fddc0856285ce636fcdfd8564083d06ff284a524bc633cfdfc3b037163d674cb9bb5ba3bc25bed00e" }, { "secret_key": "1df7acfb963304e51ec471caf181102556783cb7d91ead30bdc2534d078a1488", "public_key": "05a31ffc70e4e3569fc2be110c643ad5f087913c7aa476dcd8d6e4bc7ec22d24", "message": "b0c3eeb57f14606ab7abeab2ee0573843ca22e6db2fdf2c9064cea5198dc5830eb158da8e2daa88857af8b8eefccf0c26c3ec0f330e92cff06bc05a29bfc99f940b61f3cfb2964b337097a6550a3e9a328c85be6f160d2c0a57ff6f1b3c5ffcca89089425ab6be0172e175baf40cf12b24a815f70f29a3a4cd0a6a132f120097752f4bc743ede08f5f21d42f282f7671f7783e27b2a8e2c14692f1e0e5de82855dabf98a1a63976006ffbfe5f5a579b460e26d06bd542842a5f9261bbf260451d2321c508932013cc6e904f79b5e4686d033e12c7bbd7eb1c92379c5ec341bf6457a3f17264a7c278b27501ecaedc361eba844442342b4b10fa94d265865116acf43fcbec965d2ab4bbbe614c4f90ab6b3e0d5383fa04988bfbb260307dde22d84098b6331d155141a927bb78d664b341d2f2a93e291cf79baaecd2612f6b104f3fc81373a7c6a045b5924bf950cd542f7b7accef3aa7d725de053055d951bd768111392596638ae097170f4492ba50a468f8e347763db612d3c7de7e56459b26ee029c630827a353aee73de68d6d72b27afd75d22164527945c7226844fab15b8dcc914349e3141c61316adc894dedcdc843984d9c7feae39db332dc393e9e8961bbde071c3d2858b3cb5f33b164a15616c6fe1bbc24a35f21336d261c5d8cf759e27e22c9101c4aebde3e126cf646ca7b2e03128095c5976bf3f6e491af0f0b640c7310966ac59c59fbc5bfe0548f88ee61ad9ec40c1c06dd29d794c44a3ea22c3d4762622ec1e8b333e45074db93741fda193c911f6db5879e55ee36ef602614ae64a5cde9d8306d22fbc4ae9c881a594bde6796125fcb628b9f3b6fb3ffd511b353f146a27272afd3e5d28b77f58a67f1fd27285c25ecc1ccf64e38d21f3b9ff22e00ee900629ef1a63e713f258883dd911f30c0d398b74bd797149be5e2696722da09d52d4ebf3c673929d298aac34ce05bea08ea9a424e93459c2eb8fc2222c31cc13d803b90a8a70bcd0a30c209211dc2ccc85b0bcd4582c695f58d80bf6ec471a2505f68847a75f6e911fd87", "signed": "b181938de10142f32407b4e786cddde932eb11dbc0bf0e5ac509fae7a5bcc32961fe3448f912c8500fc6db4e1d3262a83c9dbe769bb8c3a761000fe36c0d7104b0c3eeb57f14606ab7abeab2ee0573843ca22e6db2fdf2c9064cea5198dc5830eb158da8e2daa88857af8b8eefccf0c26c3ec0f330e92cff06bc05a29bfc99f940b61f3cfb2964b337097a6550a3e9a328c85be6f160d2c0a57ff6f1b3c5ffcca89089425ab6be0172e175baf40cf12b24a815f70f29a3a4cd0a6a132f120097752f4bc743ede08f5f21d42f282f7671f7783e27b2a8e2c14692f1e0e5de82855dabf98a1a63976006ffbfe5f5a579b460e26d06bd542842a5f9261bbf260451d2321c508932013cc6e904f79b5e4686d033e12c7bbd7eb1c92379c5ec341bf6457a3f17264a7c278b27501ecaedc361eba844442342b4b10fa94d265865116acf43fcbec965d2ab4bbbe614c4f90ab6b3e0d5383fa04988bfbb260307dde22d84098b6331d155141a927bb78d664b341d2f2a93e291cf79baaecd2612f6b104f3fc81373a7c6a045b5924bf950cd542f7b7accef3aa7d725de053055d951bd768111392596638ae097170f4492ba50a468f8e347763db612d3c7de7e56459b26ee029c630827a353aee73de68d6d72b27afd75d22164527945c7226844fab15b8dcc914349e3141c61316adc894dedcdc843984d9c7feae39db332dc393e9e8961bbde071c3d2858b3cb5f33b164a15616c6fe1bbc24a35f21336d261c5d8cf759e27e22c9101c4aebde3e126cf646ca7b2e03128095c5976bf3f6e491af0f0b640c7310966ac59c59fbc5bfe0548f88ee61ad9ec40c1c06dd29d794c44a3ea22c3d4762622ec1e8b333e45074db93741fda193c911f6db5879e55ee36ef602614ae64a5cde9d8306d22fbc4ae9c881a594bde6796125fcb628b9f3b6fb3ffd511b353f146a27272afd3e5d28b77f58a67f1fd27285c25ecc1ccf64e38d21f3b9ff22e00ee900629ef1a63e713f258883dd911f30c0d398b74bd797149be5e2696722da09d52d4ebf3c673929d298aac34ce05bea08ea9a424e93459c2eb8fc2222c31cc13d803b90a8a70bcd0a30c209211dc2ccc85b0bcd4582c695f58d80bf6ec471a2505f68847a75f6e911fd87", "signature": "b181938de10142f32407b4e786cddde932eb11dbc0bf0e5ac509fae7a5bcc32961fe3448f912c8500fc6db4e1d3262a83c9dbe769bb8c3a761000fe36c0d7104" }, { "secret_key": "7ed87c36dfdbae60c940a3b325c19fded814d76a544820a32f286a5c0ad71d72", "public_key": "3c4ac510b36222c252a2dc1afcb40fb0eb85bca90391196a5883aa2cc912b2df", "message": "62d313912abbb006b7774a6737714a349970ce0421112f400463d3db0e2f7f128d7b96939f43c1e7107b5118a77c119683d866b7e3d72ac21f6b4272b4be9289b6556fe31b6051a0b42ed5ea0cf347696d30fb8bff6b8b572719de19a231cc85459a990c37801f0837186cefbb5521569666967cd4243d7307f1b0b24c8e2b9b692317304fbe3dd0a263650191b35216f52916573af90524f91db1a92471d758c92dc6d14d1a4b26f41b40403ca87dcfabdca47b9fc2533578f161f3b0199b5c698e080704b21c9e615269fcd0d40439ed8bc3bdfbc9afb44c11fa89275f0eaaa5d08fa959d6378d0db89910d48f2d86a1ebfc5cbf10eb2d5aadf51bbd8344ff8bbb5b8afe05a45011b5e4b72eb864ad263e8a03a6c7f98aeeb354f730a318aa30fb56d33d80748c98ebec15878ccf3ce822f69d3456843c400dc56b481a95e688b8a4735bf3843f5833dda0efe09e7175b567c661387afd2ebc079a48e34967ec97b927dfa581888f231a98a7ed33103bfa8e8f9ba6513527900b39b86231da7911a2fc935888a75f1129584afff2025249c4188f09052f85687706d05e299144d40de8898b7c8b2dfef0c3708573d8b0563a6bd0a504c0b6745702b1b57121c6f040aff27198948ba69c21253a28d39eba726219beda1f8209fb83e9adb07ad409fbd6d25565889ab45123f9d945ecd7d9ca7028ece092e35fbb7cb3f328126efddac5d859f2b2c6eb090133690e20c17deaf3882685f07e9ed2653b803b9b383b70748a1fa92c86f86d6c47ea87b10b12e363ba508060f47ce2a2f3b6a3eefcd4dacfc71c41f436fe0c2bc34d4baad49574e7443c126a589f6ef7bca44954f0bb28ec7151b0511c23c6bc42d5e85983ec16bb5f50a382d688150a49609cbde5698e86dcbf0212c2292299dc4dcf87429f6cd2eec80948ce867e25c94584cdc64b099029eb854edc26ea21421eff48cf4e41f49e2d89478def06c42bea220a133e50f5c74464c7e73fb1c1a77c507cf6cda85be402b7e6d6d21e810d6d0b5972b9fe77e54e74aee1f3bbfd6e7de6b5c0", "signed": "579b38124bd0591a597cc9a389127ceaf55156077363edb811d0b65552acfcc677b272942199ca25ab790de6e084603ad1052ec210cf6fcb1417289067ce3c0862d313912abbb006b7774a6737714a349970ce0421112f400463d3db0e2f7f128d7b96939f43c1e7107b5118a77c119683d866b7e3d72ac21f6b4272b4be9289b6556fe31b6051a0b42ed5ea0cf347696d30fb8bff6b8b572719de19a231cc85459a990c37801f0837186cefbb5521569666967cd4243d7307f1b0b24c8e2b9b692317304fbe3dd0a263650191b35216f52916573af90524f91db1a92471d758c92dc6d14d1a4b26f41b40403ca87dcfabdca47b9fc2533578f161f3b0199b5c698e080704b21c9e615269fcd0d40439ed8bc3bdfbc9afb44c11fa89275f0eaaa5d08fa959d6378d0db89910d48f2d86a1ebfc5cbf10eb2d5aadf51bbd8344ff8bbb5b8afe05a45011b5e4b72eb864ad263e8a03a6c7f98aeeb354f730a318aa30fb56d33d80748c98ebec15878ccf3ce822f69d3456843c400dc56b481a95e688b8a4735bf3843f5833dda0efe09e7175b567c661387afd2ebc079a48e34967ec97b927dfa581888f231a98a7ed33103bfa8e8f9ba6513527900b39b86231da7911a2fc935888a75f1129584afff2025249c4188f09052f85687706d05e299144d40de8898b7c8b2dfef0c3708573d8b0563a6bd0a504c0b6745702b1b57121c6f040aff27198948ba69c21253a28d39eba726219beda1f8209fb83e9adb07ad409fbd6d25565889ab45123f9d945ecd7d9ca7028ece092e35fbb7cb3f328126efddac5d859f2b2c6eb090133690e20c17deaf3882685f07e9ed2653b803b9b383b70748a1fa92c86f86d6c47ea87b10b12e363ba508060f47ce2a2f3b6a3eefcd4dacfc71c41f436fe0c2bc34d4baad49574e7443c126a589f6ef7bca44954f0bb28ec7151b0511c23c6bc42d5e85983ec16bb5f50a382d688150a49609cbde5698e86dcbf0212c2292299dc4dcf87429f6cd2eec80948ce867e25c94584cdc64b099029eb854edc26ea21421eff48cf4e41f49e2d89478def06c42bea220a133e50f5c74464c7e73fb1c1a77c507cf6cda85be402b7e6d6d21e810d6d0b5972b9fe77e54e74aee1f3bbfd6e7de6b5c0", "signature": "579b38124bd0591a597cc9a389127ceaf55156077363edb811d0b65552acfcc677b272942199ca25ab790de6e084603ad1052ec210cf6fcb1417289067ce3c08" }, { "secret_key": "6a29f81b8d9aa48a1b23364eac8f6a4bdd607a84cfe8e88d90175d80643a58a8", "public_key": "4c3be3a2a8425ff31c3a0db4a52a0cb1416ceb48cc3e4c28a4f2284ab3460715", "message": "7876a3f4eb69bb7e54e9ff954ebd3b10b93a4c1afeae92fa03c103cb6313a201c5b33a9a7223755cb510e25ec582b54e81b84956f6c53f1f08a63bf0c4a261af450e523fe8f61ddb3c0eeab8751072688801b2a473b71a2e38708da68c2f37925cb05a20c4283b3af97b6f0ba65a5403554375e215d9e3aa1b0f9fdb0f849923edbdaa0ab481c545a5df8f51d1f68b223507ea0eccfaebb5fccf5e3dfa65a44eea504568a88180a060bb06c51557b81e667b4b04e3210fa4c379876c49f3e56bf2be1cf519a7418393d240dc8a224c6c38ac2ab9d8fadfc5362030c7930c3ce7795b147c26c8a28c653429d90a173a86a8b18a009e62aef6eca95d39bdbe45647778a2532a415ae19bad231129127842fe1d0f11fab4a1cf0b17e498cd5952c939e090090287b144895dff00cec8d6aedaf62481a41783e021082ce352063e62811fd99990104d8a46cdcaee2bab458e5247fb023e923330a428c7bcfd20b08f520e8946dd658347352ae0c4be73c3d5eccd11149f3ab7b8052cfd95c35d4164546f5d8f377517a7f432c0d5563a7bcc7bd119d3421dfebaae844599b29b383bb8d5dbf140d9bd47a078b7ae7c6aa87b1e29236c9fcfd654b7f809794cccb261588e18dec6c4046a934067d0dfa03791d03d83b718ac4d24dce785a3028de0c9592dba7c5c5845184afc9c0dfcf94095860f0eb802ebea20178e78b5642e5dd61c33b39769052d9d854dce902f476e21f96c650b463b7bc3d0ff2996b65c57831f8b7c0fb915f4dd7226ac955cbc7dfb03f9b758dd3e0dfce2e0e580c91a30c783ff567b17f12dfd5d3137646e20011cdcaae11102dc716886cbf123c09488b173636abd54e962caeec97d5eb940682e703b730f61562cd14b9e6561b5e93f60cd0e1e86d1a1b4719c5b508242bd6b2d9a548f59bbb875075969ef2032f3196b8aeccc45a44d9dbdaf878ed16f1d855e8918ed65a45ee5c7fa32a1ec6932a159cfb50ffc87be06dfcf7228ae8870ccd357fc656e33fa4b6b8b7d1a7215553cabacc70a39c980b971e51a17ed6318b43b29bb", "signed": "df09cb9b878d3dc9e542dbac28943e28e41dcecb92cb7ea44009885e46499743330561ba1d36aedd467675fdca2baaa4701b6fad979fd839c470d13c82daa9057876a3f4eb69bb7e54e9ff954ebd3b10b93a4c1afeae92fa03c103cb6313a201c5b33a9a7223755cb510e25ec582b54e81b84956f6c53f1f08a63bf0c4a261af450e523fe8f61ddb3c0eeab8751072688801b2a473b71a2e38708da68c2f37925cb05a20c4283b3af97b6f0ba65a5403554375e215d9e3aa1b0f9fdb0f849923edbdaa0ab481c545a5df8f51d1f68b223507ea0eccfaebb5fccf5e3dfa65a44eea504568a88180a060bb06c51557b81e667b4b04e3210fa4c379876c49f3e56bf2be1cf519a7418393d240dc8a224c6c38ac2ab9d8fadfc5362030c7930c3ce7795b147c26c8a28c653429d90a173a86a8b18a009e62aef6eca95d39bdbe45647778a2532a415ae19bad231129127842fe1d0f11fab4a1cf0b17e498cd5952c939e090090287b144895dff00cec8d6aedaf62481a41783e021082ce352063e62811fd99990104d8a46cdcaee2bab458e5247fb023e923330a428c7bcfd20b08f520e8946dd658347352ae0c4be73c3d5eccd11149f3ab7b8052cfd95c35d4164546f5d8f377517a7f432c0d5563a7bcc7bd119d3421dfebaae844599b29b383bb8d5dbf140d9bd47a078b7ae7c6aa87b1e29236c9fcfd654b7f809794cccb261588e18dec6c4046a934067d0dfa03791d03d83b718ac4d24dce785a3028de0c9592dba7c5c5845184afc9c0dfcf94095860f0eb802ebea20178e78b5642e5dd61c33b39769052d9d854dce902f476e21f96c650b463b7bc3d0ff2996b65c57831f8b7c0fb915f4dd7226ac955cbc7dfb03f9b758dd3e0dfce2e0e580c91a30c783ff567b17f12dfd5d3137646e20011cdcaae11102dc716886cbf123c09488b173636abd54e962caeec97d5eb940682e703b730f61562cd14b9e6561b5e93f60cd0e1e86d1a1b4719c5b508242bd6b2d9a548f59bbb875075969ef2032f3196b8aeccc45a44d9dbdaf878ed16f1d855e8918ed65a45ee5c7fa32a1ec6932a159cfb50ffc87be06dfcf7228ae8870ccd357fc656e33fa4b6b8b7d1a7215553cabacc70a39c980b971e51a17ed6318b43b29bb", "signature": "df09cb9b878d3dc9e542dbac28943e28e41dcecb92cb7ea44009885e46499743330561ba1d36aedd467675fdca2baaa4701b6fad979fd839c470d13c82daa905" }, { "secret_key": "ef12df479d983ad96e8ba65330b36d49aadb983164e1c0b452b560ded1d08d60", "public_key": "f761cf2826927a7cda8cb04faa2c59f8425a8f7d398f76e867021c951f073809", "message": "e58f34daea755ac4e41333d6f0ed0135f7dbce50309bb1956bc71acb12c77067a647ffd86aa5870c0c0007e8f995a22b88c467de225444544201c557495e253e3319cc5ca376d3e7cc1eb467346e52ad956a6fa733720b17117b5b7585e4d559409aaefa95580f91e502015f497c5cdcb7d4d561f544efa35c1e2a53b72bddeceec2d1050f177d480f687405664dfddec06eee4bd147a912fdbf74f2a95d1fd1e11268694ce4d4ec4fffd6ddb3254d360f236fab4d1a17f8d0d1a511f944692f239639ae03d64facec6538427ab71f7127f4a276f9bc45bba611dfcce6446cc13968976c8bb6d6fe2106d705922dcac956966a76d48f2aff4b86514e39a67e1643fcc321858024e693189833c8ad59b4b625298ebafe64626b480f326f1340723cb3d383f4fccbfc237a3f4c4f7ecf0ba436b32c2fe35179da93111b48cc9ea24202bdc1b2fb60a4319dfd9864470f73f54137206e0bf007f5ae88a88747008a60f4789ad167724f179c02b63aed002573d28a6bcf88e07ce8daea5d5f1acf487b4c5c16c2bfe11231ea5ea763e8f332cc73da1b2f8c198ea8173fd33d4b2ae69e5d4d1aadddf2fd821b85be45151962d1f99df81308618852ad7cf41d72da08a1b39df7d8b994b4ddff37f9dfe8f38ce30e91061d95d58f7ae826b02385272ec09f01a7b3e4b391d09bced665dad69505b419da8481bc3792bf8b8e7ad64b63f245666c8c32fd5c1b1b48c9951e1c21a1eb5f507cff137cfb862c2cc98766e878c930a083828c9d8db18bf16716685f39d6572a8ca8b2a514f77003d4e75bc154aebf14103778f365b1c3f03541ddbd07d6e23e56762d971eb02983e93c4e01ba4b8a2178928c4337d302f31c9ccb75b249a82dc96821e95a03ab6b770df2c3dfdbf1fe9773f8bc1bc5b3afa0440b102578f3d213c8d019cff124f75ce4accc8c667feb27c751a6120074813104e0cd070c9f5e451dccff4c80d71107c975abfac07d4d270c727d8a2fec349b533968e271892d2b62c125fb7974603c305ea3bfa30fb610fc5a23eb68a8406444391a521337", "signed": "4c8010866d9115f05293b934cac68104cc2c3437568cb9d5c570b1a8bee706603075537033bd708a9c9f3d1e2519a915b1c4ae4ccddfcf0ed0c049d342a02e02e58f34daea755ac4e41333d6f0ed0135f7dbce50309bb1956bc71acb12c77067a647ffd86aa5870c0c0007e8f995a22b88c467de225444544201c557495e253e3319cc5ca376d3e7cc1eb467346e52ad956a6fa733720b17117b5b7585e4d559409aaefa95580f91e502015f497c5cdcb7d4d561f544efa35c1e2a53b72bddeceec2d1050f177d480f687405664dfddec06eee4bd147a912fdbf74f2a95d1fd1e11268694ce4d4ec4fffd6ddb3254d360f236fab4d1a17f8d0d1a511f944692f239639ae03d64facec6538427ab71f7127f4a276f9bc45bba611dfcce6446cc13968976c8bb6d6fe2106d705922dcac956966a76d48f2aff4b86514e39a67e1643fcc321858024e693189833c8ad59b4b625298ebafe64626b480f326f1340723cb3d383f4fccbfc237a3f4c4f7ecf0ba436b32c2fe35179da93111b48cc9ea24202bdc1b2fb60a4319dfd9864470f73f54137206e0bf007f5ae88a88747008a60f4789ad167724f179c02b63aed002573d28a6bcf88e07ce8daea5d5f1acf487b4c5c16c2bfe11231ea5ea763e8f332cc73da1b2f8c198ea8173fd33d4b2ae69e5d4d1aadddf2fd821b85be45151962d1f99df81308618852ad7cf41d72da08a1b39df7d8b994b4ddff37f9dfe8f38ce30e91061d95d58f7ae826b02385272ec09f01a7b3e4b391d09bced665dad69505b419da8481bc3792bf8b8e7ad64b63f245666c8c32fd5c1b1b48c9951e1c21a1eb5f507cff137cfb862c2cc98766e878c930a083828c9d8db18bf16716685f39d6572a8ca8b2a514f77003d4e75bc154aebf14103778f365b1c3f03541ddbd07d6e23e56762d971eb02983e93c4e01ba4b8a2178928c4337d302f31c9ccb75b249a82dc96821e95a03ab6b770df2c3dfdbf1fe9773f8bc1bc5b3afa0440b102578f3d213c8d019cff124f75ce4accc8c667feb27c751a6120074813104e0cd070c9f5e451dccff4c80d71107c975abfac07d4d270c727d8a2fec349b533968e271892d2b62c125fb7974603c305ea3bfa30fb610fc5a23eb68a8406444391a521337", "signature": "4c8010866d9115f05293b934cac68104cc2c3437568cb9d5c570b1a8bee706603075537033bd708a9c9f3d1e2519a915b1c4ae4ccddfcf0ed0c049d342a02e02" }, { "secret_key": "f731317cf5affe58704c4d9497ae860bbf739d0fd96b7c02efb6777b3c858a19", "public_key": "d7d638aecce1461e314255aa29d9a6b488aea1396e9682695a470eff23f3ed84", "message": "16f51c59e9aefc26b0da5e0085eb2e2f1f856def9725769e3af12f860905ae133f65074da76dbf25c67f6257d2dc66c05f9b31ae177b69929fc183b588c519bca14796a0896d2905fd942d7ab4a3fd9541a5529f729c5851419b5fbef7b134d6762eb97e8a951a8ff52aa0d7e67444d06b07aa55e4eb9ab892f47bfd111df5b62f6f3fd1a5ed84125feebb77da637c05d5265ced113dfe8782dbd1cecd2c6c032b8fa8855b3ae78de74faa5aa20a761463c2a30be66bd38cdec75f8957cb94c113a45d546daf475d89aa1482f8d2803a23c939202015a08e94b132728fbe8f6019d7168a08a5930170e5639d110e4739db85e61e64495944b5423a74ad5a8a0a510612ece655ce18864051525b908e0b19290abe8b1182c48c700d350515fd349956e8087327f30b6fc3f131c2144abb3f0e9ca331172b35064a82811a68e2cf36b43e3ad2e8dfa5b1cef50e2a60293fc5f635c9a9998d8c1ad296e7c78fc0582022d63067186b65e764828cc0f5f7632d5eef863e6c6d90e38ccc87d7b747fac8491d632cf7f54b9a9eed16eebec01b6cc33d2463f7f950d828b55ee3f77cbe974f48948eb757aed4e0dbb00ad95ee01323486eba3c8da886ed7f57bb400d63a1b2ebeaa2e70adf0379e3393001ba626c0dd54b7f0c9a25aae6c9875d4e7622f3ed428fb3124b29c5db9a7ef16ebddd6805f095f5e769823c43f262868ff43e3e0525746d9497af124a01dff61ec718af3b5bb746fcc08aebd16684d456ae7932ff5ed7d6b0f1b25c7adeef598b5d58877590ac1dc05975156796998774081e5b66822a94a6a802c3a2cd9f489e1628aaf4652be1184b0fc7c5ee7f97ce08b9233b4b83d9367be5f4aae9782593a35265154dea4c375c16f0caf6dc4594d2bdbfc3375bb2a0432c482f13941ce2aaab4d83e74d116f5de4ab28f8dc3d1cd19d271e56e10398bd1df5c870fcbf93a7d1df3939547c107bfd90643f6f5001ae7e06397ae1a271bb82a1f38e097bec667466b80ee3e50dd4fc9d5d54f18faf7a5b55a8834594ef0cb7e508bbd28f71fd34235bbfd3", "signed": "2a4fea98f9240171a1823f2f69352062672e6c6e6652d388a87714d647995df75b6e1ed1746af2adf4e806135d60754e60fea032128e35abc1f1615181125f0b16f51c59e9aefc26b0da5e0085eb2e2f1f856def9725769e3af12f860905ae133f65074da76dbf25c67f6257d2dc66c05f9b31ae177b69929fc183b588c519bca14796a0896d2905fd942d7ab4a3fd9541a5529f729c5851419b5fbef7b134d6762eb97e8a951a8ff52aa0d7e67444d06b07aa55e4eb9ab892f47bfd111df5b62f6f3fd1a5ed84125feebb77da637c05d5265ced113dfe8782dbd1cecd2c6c032b8fa8855b3ae78de74faa5aa20a761463c2a30be66bd38cdec75f8957cb94c113a45d546daf475d89aa1482f8d2803a23c939202015a08e94b132728fbe8f6019d7168a08a5930170e5639d110e4739db85e61e64495944b5423a74ad5a8a0a510612ece655ce18864051525b908e0b19290abe8b1182c48c700d350515fd349956e8087327f30b6fc3f131c2144abb3f0e9ca331172b35064a82811a68e2cf36b43e3ad2e8dfa5b1cef50e2a60293fc5f635c9a9998d8c1ad296e7c78fc0582022d63067186b65e764828cc0f5f7632d5eef863e6c6d90e38ccc87d7b747fac8491d632cf7f54b9a9eed16eebec01b6cc33d2463f7f950d828b55ee3f77cbe974f48948eb757aed4e0dbb00ad95ee01323486eba3c8da886ed7f57bb400d63a1b2ebeaa2e70adf0379e3393001ba626c0dd54b7f0c9a25aae6c9875d4e7622f3ed428fb3124b29c5db9a7ef16ebddd6805f095f5e769823c43f262868ff43e3e0525746d9497af124a01dff61ec718af3b5bb746fcc08aebd16684d456ae7932ff5ed7d6b0f1b25c7adeef598b5d58877590ac1dc05975156796998774081e5b66822a94a6a802c3a2cd9f489e1628aaf4652be1184b0fc7c5ee7f97ce08b9233b4b83d9367be5f4aae9782593a35265154dea4c375c16f0caf6dc4594d2bdbfc3375bb2a0432c482f13941ce2aaab4d83e74d116f5de4ab28f8dc3d1cd19d271e56e10398bd1df5c870fcbf93a7d1df3939547c107bfd90643f6f5001ae7e06397ae1a271bb82a1f38e097bec667466b80ee3e50dd4fc9d5d54f18faf7a5b55a8834594ef0cb7e508bbd28f71fd34235bbfd3", "signature": "2a4fea98f9240171a1823f2f69352062672e6c6e6652d388a87714d647995df75b6e1ed1746af2adf4e806135d60754e60fea032128e35abc1f1615181125f0b" }, { "secret_key": "498e5a21a9b0c347ba83a47ac10069457f5783c2e1e6e4640045e594b1c69332", "public_key": "fb3948c81199569105cc1b7d9ceb3b41a343bb00575538592e0984f4f4710abe", "message": "e4fbea864aa51190826645d2f772cb0f9eddd3034473fa3177c7af9a5d41e1a73ad5784c7096559fcddb7b7c85891cf24e82c588d74774ffcac0c6b4eebc2f3fa43e9d45f259d67564030cfeeab9236c665b650af0c92c875189f5f9383504b15360a0b9a5a00da31f635b96f6c73ef47b6b06f02811d1d19c2e8e53550ce22e42ec50a1eb2ea2f4cd03c442d4aa436894238ceb1835fe99b240358aa0562c249698a3f123c2c17e591010bd6fdfcbd7dbe70b04520502ece37a9a1dfa1ae3370417b004217a5b8fe9903c9a3b9f4b6d5c46c0ed0c538cec22f2dfcb2a280a42adc489cf2e062912be9928f0c060891e432091177526f1b3a968069d4a57ade828559810ae0360681ff99329fa0f59e7e59cdf87f9f33c40e97031b9f81d48fc12286efbb3d4e5a62ef57bc0d52d533b99c5106aa79cfe1793a908518596c383483ec49ff98ec557bfff7490a46daf6714f2c2c32f57932ca0d730f03f381d69decdbd9a7a6d4afc62406543c8ebe90ac76e6afabdb82492a206a369e04286d313e11107d8cd9b4bf68f815dba4e990b049d79216d3653138342cd118b130f66b006f3d89ac3cf89837048b0f8a62d94051d2eab891ac5f47888879d88e546676d1daeeb4d175d3f04a9d74ffcdd47746016f84ad0d112afb59ad12187e94f22535d77e9e0516fa42185c197ba774b393227f741fe68273f423fb0e0e0474bfdaf2da78aeb1cd5b98c1dc0832124742a4754125fc78b19c559a5b3f7711e068c440cc0469a1cfa5c1864be18735aa8bcd406c4371eb857754d908bf379b91fcb24e34396bf87c19a04a83d59dae71f3f3839829d06221301ef595696e719d56b79520a0e509929833b1d804a6a0ea40400bb45028ce5d36933883e17406e27a8109057b1a1a5e5da210a6921994f467ab41aa8f0d88775a8a8ebb4ec77d7c80e45a7bb422a4c00c90583911465e6b5f0fdcdeab72871ca542e1d1a2ca94df4ed2eabf90ded0045290324a9fffb30145470209f3826580989349199dc5ab8d4a25df7a0529cf91471e30842abfacd44ab781dfc1395", "signed": "2860830ccd1d41d95076816a398424f7b739c49fdacf5654529da85fe3565584f6aac2614c63f774b61db9081f1410fba8e50ab3b4c39dc06314243f3f0d8e0fe4fbea864aa51190826645d2f772cb0f9eddd3034473fa3177c7af9a5d41e1a73ad5784c7096559fcddb7b7c85891cf24e82c588d74774ffcac0c6b4eebc2f3fa43e9d45f259d67564030cfeeab9236c665b650af0c92c875189f5f9383504b15360a0b9a5a00da31f635b96f6c73ef47b6b06f02811d1d19c2e8e53550ce22e42ec50a1eb2ea2f4cd03c442d4aa436894238ceb1835fe99b240358aa0562c249698a3f123c2c17e591010bd6fdfcbd7dbe70b04520502ece37a9a1dfa1ae3370417b004217a5b8fe9903c9a3b9f4b6d5c46c0ed0c538cec22f2dfcb2a280a42adc489cf2e062912be9928f0c060891e432091177526f1b3a968069d4a57ade828559810ae0360681ff99329fa0f59e7e59cdf87f9f33c40e97031b9f81d48fc12286efbb3d4e5a62ef57bc0d52d533b99c5106aa79cfe1793a908518596c383483ec49ff98ec557bfff7490a46daf6714f2c2c32f57932ca0d730f03f381d69decdbd9a7a6d4afc62406543c8ebe90ac76e6afabdb82492a206a369e04286d313e11107d8cd9b4bf68f815dba4e990b049d79216d3653138342cd118b130f66b006f3d89ac3cf89837048b0f8a62d94051d2eab891ac5f47888879d88e546676d1daeeb4d175d3f04a9d74ffcdd47746016f84ad0d112afb59ad12187e94f22535d77e9e0516fa42185c197ba774b393227f741fe68273f423fb0e0e0474bfdaf2da78aeb1cd5b98c1dc0832124742a4754125fc78b19c559a5b3f7711e068c440cc0469a1cfa5c1864be18735aa8bcd406c4371eb857754d908bf379b91fcb24e34396bf87c19a04a83d59dae71f3f3839829d06221301ef595696e719d56b79520a0e509929833b1d804a6a0ea40400bb45028ce5d36933883e17406e27a8109057b1a1a5e5da210a6921994f467ab41aa8f0d88775a8a8ebb4ec77d7c80e45a7bb422a4c00c90583911465e6b5f0fdcdeab72871ca542e1d1a2ca94df4ed2eabf90ded0045290324a9fffb30145470209f3826580989349199dc5ab8d4a25df7a0529cf91471e30842abfacd44ab781dfc1395", "signature": "2860830ccd1d41d95076816a398424f7b739c49fdacf5654529da85fe3565584f6aac2614c63f774b61db9081f1410fba8e50ab3b4c39dc06314243f3f0d8e0f" }, { "secret_key": "c24cbf401ad03bd88dcc7b519ecf624db2223e990289309e1e9f1f8f6127c6c9", "public_key": "a74666f357209f7189903788f107563e50c051c3d40c3f3dad10d3c3cff1e678", "message": "e7fa359e6a09b2c54aabed3bbabfb72853a805aabcf4d18ddad39f03f34601e55b6ce263c9a3ca6a3e5f1425c821928c61e7f750919bd3af32bcb7b94d459a7a9a35f61c941792e2cc2e4327beb344a841a07f32068af102b3de61eab64ef6d5e69062e393ab5edf6ac9ef7b38d49a01bef0003f421174c8885975c01832899c3135e7a86e5b55d9b1328bb4289b5c40200f49e5523b3c461dc7175e1465022297c3d380f2b1fef39cb82c00fd160f447eb51263fa25b4df0fca41ec0ca2ece7472201af86c3038c49df099a9aefa1f88d0edfd17c0b3c86046629c09454054aa0fb2c6949dd9c130185dfa5d903891e08742cd0429403f57f4052158b2f401da4756854e4aaf024221e37513cf677ee6a0b159f501d377ea32eb71e778004f27203cd6d553fda5d65e1879477046f3ea3d1d75c9d0d30311456709cc7f6ab68c7b0d52be40f04cf655655323285318329e84c6a5b07e0ceed5f78f7f1fa6229bef878793c584728abf4510b7f27794b5942916254c589a09c8e911f0b954211a63699a752147f2a4e1a18956644bea2ca2692ba182280e04a72dd89b0d1268500938f347bf43f2a242ee9b9a6baac9b350d656fb19ec834abe3164440f2d2071fe5e32c8e4cf905539b839ceeca2620fcb2a087f780e6c7f5e05c506888250ea7c856fb30983200aa8f78fc1771054ada0f3fac38ae2f33dc4a4f851b76ed740c0962a76a4de44080dc620a44ad8f23d3462b792ab3afb19cb8a9f4d9e59ad765a771899da8cbec89e5077e85c0c93126376c941bef1f8bb992d3a35f270725846fb252f8b5fbb7567e406a1b53b619769e632b2b4087cd4c276e5d58ff2b56e89edec48ce53a52e329ca1559538f10902c01a85fbb3cd72e6b8291e5fe639bee9d47d34c249a7a07d7a1427a01f63d60984c450bef819b19f65e2614fd9c2fae7b9231a0bca414ed94a5ee7e66327d2a99c84878b7bee087e891f253fa1fece313648c06c45db2d9f3bc8599937b752d38ce5063d0ed9a43ec9d4015893d43bf5b2d1c60478510468968b796f0153789595441722a", "signed": "581e6c85aec623b62b3d4c9bc9c77759d5492722e252d44c1f8ada9da2ecc67c17083273aa091bbac046ae63c78893152e14d926c41ae35f0e6e3959496b1306e7fa359e6a09b2c54aabed3bbabfb72853a805aabcf4d18ddad39f03f34601e55b6ce263c9a3ca6a3e5f1425c821928c61e7f750919bd3af32bcb7b94d459a7a9a35f61c941792e2cc2e4327beb344a841a07f32068af102b3de61eab64ef6d5e69062e393ab5edf6ac9ef7b38d49a01bef0003f421174c8885975c01832899c3135e7a86e5b55d9b1328bb4289b5c40200f49e5523b3c461dc7175e1465022297c3d380f2b1fef39cb82c00fd160f447eb51263fa25b4df0fca41ec0ca2ece7472201af86c3038c49df099a9aefa1f88d0edfd17c0b3c86046629c09454054aa0fb2c6949dd9c130185dfa5d903891e08742cd0429403f57f4052158b2f401da4756854e4aaf024221e37513cf677ee6a0b159f501d377ea32eb71e778004f27203cd6d553fda5d65e1879477046f3ea3d1d75c9d0d30311456709cc7f6ab68c7b0d52be40f04cf655655323285318329e84c6a5b07e0ceed5f78f7f1fa6229bef878793c584728abf4510b7f27794b5942916254c589a09c8e911f0b954211a63699a752147f2a4e1a18956644bea2ca2692ba182280e04a72dd89b0d1268500938f347bf43f2a242ee9b9a6baac9b350d656fb19ec834abe3164440f2d2071fe5e32c8e4cf905539b839ceeca2620fcb2a087f780e6c7f5e05c506888250ea7c856fb30983200aa8f78fc1771054ada0f3fac38ae2f33dc4a4f851b76ed740c0962a76a4de44080dc620a44ad8f23d3462b792ab3afb19cb8a9f4d9e59ad765a771899da8cbec89e5077e85c0c93126376c941bef1f8bb992d3a35f270725846fb252f8b5fbb7567e406a1b53b619769e632b2b4087cd4c276e5d58ff2b56e89edec48ce53a52e329ca1559538f10902c01a85fbb3cd72e6b8291e5fe639bee9d47d34c249a7a07d7a1427a01f63d60984c450bef819b19f65e2614fd9c2fae7b9231a0bca414ed94a5ee7e66327d2a99c84878b7bee087e891f253fa1fece313648c06c45db2d9f3bc8599937b752d38ce5063d0ed9a43ec9d4015893d43bf5b2d1c60478510468968b796f0153789595441722a", "signature": "581e6c85aec623b62b3d4c9bc9c77759d5492722e252d44c1f8ada9da2ecc67c17083273aa091bbac046ae63c78893152e14d926c41ae35f0e6e3959496b1306" }, { "secret_key": "8b3dcde4abbf4e6211c4a51c4b026800a8a2a061cb38a2ecc7c9cf113f9270bf", "public_key": "514535580f0de359bb0d41f2efddaa04c2ec950119f31634b2c1a32f195f6968", "message": "481425027da672b6f26c91b80e55582caef47bb15a2de8fca852221785180b20a7fd6d4907b5881cc1d6e39ab9612cc74d6977e9141f7087bb27ab3084a26285586f8411db1f503adf52dcb25ab8fffd2ec1504c1777b9d6dd4a29e2019e5cbae1b7eb26f95bbe07d90c2f6fb0884a59a8d58dde5116edc3bc349d37c160b27befbe5a5c181ce7256392354d221b58c47eb0bb10929e7421795f4b7a7c275edd08c088568772e993218dd6f3c2cb4ac657a0a3f91f3126b991adf6cbe7d1b19b8cd83be3602ed18f039633fbd2387bda69e2cf0387d8644d97b303fb00639aeee7ae463f6fe1a2c4b89aeba3e9094c11fc29114b20283f287c6dd28cb098dae8dabc48e85bb59c0dc6e78c956605cb7cf06942353e7a22e96f80a37a66f718d9e4db8c52452aa0a35772e81ba2b303205b412dd2bfc15ce9b436f99fbb32126b63ce9cb43199f157d81751a7c4937d13af4c582952b5d606b555b046bf1de06cf39b63a80287371803609a387ee80f3a5d88b9d6219650ed17d3cc183b2c70d5eb94e3bc52aea7aa7f53be0e20b8972f143d8e20162e803edb4aa83d5553fdd553398b0fa176b959cba140d6e980c9251b0fa0b65e908417f82f451ff9f2de6b9ca5e3b5f41ba40d05a54f3dab4886aacca05c9c2798139a4cb33e96a91494749910a17ce8b392fc0fc7762974d79d33db924bfef8655a723776ff87f950fdc568b1e526534541f572723b840663c19188c424f7c489235a424b09fe25c30727ea1cb04953d706d68bfe12100ef6f64c35c6b8de67edf0e3ad014a400e821ea34024321999867b43c82c450184b78f7425cebd7319dc6f65d360665dfbe7c36674dac3a54e96da910c02d3640780b22d512ca0e3ca3587b94ea9fcd7a31b4af69fd6207c68fed25f89921c1cdcdefd1c090204492bff9bbb52e08885829d012bc2dfb4fe8c35e59cd13bcb8ead34193c40b03ee4d825ee1322ff4ef071279574cbaee7c07f14be606b9cd0e261111ef20d9681d76cf78c89a8c397d6b8dc778f4984166ad5df3a81aaf2e6de09f700195ae2c1d4609647", "signed": "4f3d4d228503017e74a6bb58aafae35c3f37bdee4ff6be2e6240b5082feddb222735e12f31e056fa685447e5384803007ea7910e605c1b78118cd5acc587a606481425027da672b6f26c91b80e55582caef47bb15a2de8fca852221785180b20a7fd6d4907b5881cc1d6e39ab9612cc74d6977e9141f7087bb27ab3084a26285586f8411db1f503adf52dcb25ab8fffd2ec1504c1777b9d6dd4a29e2019e5cbae1b7eb26f95bbe07d90c2f6fb0884a59a8d58dde5116edc3bc349d37c160b27befbe5a5c181ce7256392354d221b58c47eb0bb10929e7421795f4b7a7c275edd08c088568772e993218dd6f3c2cb4ac657a0a3f91f3126b991adf6cbe7d1b19b8cd83be3602ed18f039633fbd2387bda69e2cf0387d8644d97b303fb00639aeee7ae463f6fe1a2c4b89aeba3e9094c11fc29114b20283f287c6dd28cb098dae8dabc48e85bb59c0dc6e78c956605cb7cf06942353e7a22e96f80a37a66f718d9e4db8c52452aa0a35772e81ba2b303205b412dd2bfc15ce9b436f99fbb32126b63ce9cb43199f157d81751a7c4937d13af4c582952b5d606b555b046bf1de06cf39b63a80287371803609a387ee80f3a5d88b9d6219650ed17d3cc183b2c70d5eb94e3bc52aea7aa7f53be0e20b8972f143d8e20162e803edb4aa83d5553fdd553398b0fa176b959cba140d6e980c9251b0fa0b65e908417f82f451ff9f2de6b9ca5e3b5f41ba40d05a54f3dab4886aacca05c9c2798139a4cb33e96a91494749910a17ce8b392fc0fc7762974d79d33db924bfef8655a723776ff87f950fdc568b1e526534541f572723b840663c19188c424f7c489235a424b09fe25c30727ea1cb04953d706d68bfe12100ef6f64c35c6b8de67edf0e3ad014a400e821ea34024321999867b43c82c450184b78f7425cebd7319dc6f65d360665dfbe7c36674dac3a54e96da910c02d3640780b22d512ca0e3ca3587b94ea9fcd7a31b4af69fd6207c68fed25f89921c1cdcdefd1c090204492bff9bbb52e08885829d012bc2dfb4fe8c35e59cd13bcb8ead34193c40b03ee4d825ee1322ff4ef071279574cbaee7c07f14be606b9cd0e261111ef20d9681d76cf78c89a8c397d6b8dc778f4984166ad5df3a81aaf2e6de09f700195ae2c1d4609647", "signature": "4f3d4d228503017e74a6bb58aafae35c3f37bdee4ff6be2e6240b5082feddb222735e12f31e056fa685447e5384803007ea7910e605c1b78118cd5acc587a606" }, { "secret_key": "d4a7a9524d30a6337c0a0be95ca90591de9888038e3e59e1b25a4181ef946629", "public_key": "9fc3ebd139cc5b7c0e05af47bff6619b812815bb01ceec392a3ff0aec3811d2c", "message": "171980c03fdf7a727bd5bab3ba0945e6ad5faf0a7f506a56d1d0edd9a306b3158d843266d3091fc1e42281df97559a2201f5bdddfe683d0e1028d1d95b2f313b484c392ffdb1cdf88508afde3d6fd2a12888bacedeb79ff3db40c9ac0ec3fb901b228698adf8d845ff4fce10de55d42436dce930973a34be05d1401f334d4ce8e3a793799eafdb94d0f2ab0950b079e6653eeb499fc7447ccbeeed8dbd5456808cd7a38f9a15a2a9c738d61334cab8ceebbbf4a4814d94c61859178784604e0c2154597e72cf587cd1f5dafe5922051890e76d616d8cd5b05d6478d0626ea83ce808c46143e6fb06b4182d228da8f6d4139eca5b8f3b1b98af68c59b4b5a53c136ee90432aca2bb915529d26367949826233b43e55804b55fc9f215eb0b0b79291465bb34edaeadffabfe6cf41bc07b5dd4d0142f0361f058ee1b3b9fcc196eb9b35b134be3d1d232004489e8f6993f625a63015bcd3f1e87588324858ccfb770dddd894bf297bd763ef5828e21f5c89aa98cfbc1c082dd7fbaa4307bda40b4a758ca8f39f4e4aaed309041268dbcf0af32de0d7fa90a523963b780b6a932cf89499025f0e0d0474c74348947510e6c5ec7c9e05066eeb4a73520c3d927c39ac26ad7596325b2cc47c5e82a775455b7af03120b1cfbfd6ec3fc0c3be6078b00cfdf8342ae8bf147159f50e9d564e2f68306dae3caedd1019f323c478a1e1f67598dd834bd1d1a8733fd7fdd8a876526c531518936edb72d01656b344c7d65ac1cee37ce5997ba48d3f4d064d88057efe9a482d9e00ab5caeb5aca2d660e337bd15487365697956a5e47b02abdc30d8e353fed4e1ac41d2bc2120021143635935c620186a522bde54be0446fbd2dc88b56304b3a64227d0acd5f85a6b6787a3adcf2d7cfc86c634b4d7ab4315b97de9e666cff3ff1b88f3295e7bab9e9fd46fafddb4f5fac51cc0170129c651b4ef4d3950d6942ff020d1668a528bde1da936c0ec1ae09e84f8205861fff491502a872c8154a96e7ea25eda955a7fd2e4b4c7a8d273f60bc74fab7b4968ca6f75daea5040f839fd56c2a980", "signed": "d15788bcd88d1d81b9e61d4fe26ea49e66819a59d2ae4832321b814d5062fadb87807db6852e1d8295e31a291b1e785d01d834895f88f400df8832c1607b5b0c171980c03fdf7a727bd5bab3ba0945e6ad5faf0a7f506a56d1d0edd9a306b3158d843266d3091fc1e42281df97559a2201f5bdddfe683d0e1028d1d95b2f313b484c392ffdb1cdf88508afde3d6fd2a12888bacedeb79ff3db40c9ac0ec3fb901b228698adf8d845ff4fce10de55d42436dce930973a34be05d1401f334d4ce8e3a793799eafdb94d0f2ab0950b079e6653eeb499fc7447ccbeeed8dbd5456808cd7a38f9a15a2a9c738d61334cab8ceebbbf4a4814d94c61859178784604e0c2154597e72cf587cd1f5dafe5922051890e76d616d8cd5b05d6478d0626ea83ce808c46143e6fb06b4182d228da8f6d4139eca5b8f3b1b98af68c59b4b5a53c136ee90432aca2bb915529d26367949826233b43e55804b55fc9f215eb0b0b79291465bb34edaeadffabfe6cf41bc07b5dd4d0142f0361f058ee1b3b9fcc196eb9b35b134be3d1d232004489e8f6993f625a63015bcd3f1e87588324858ccfb770dddd894bf297bd763ef5828e21f5c89aa98cfbc1c082dd7fbaa4307bda40b4a758ca8f39f4e4aaed309041268dbcf0af32de0d7fa90a523963b780b6a932cf89499025f0e0d0474c74348947510e6c5ec7c9e05066eeb4a73520c3d927c39ac26ad7596325b2cc47c5e82a775455b7af03120b1cfbfd6ec3fc0c3be6078b00cfdf8342ae8bf147159f50e9d564e2f68306dae3caedd1019f323c478a1e1f67598dd834bd1d1a8733fd7fdd8a876526c531518936edb72d01656b344c7d65ac1cee37ce5997ba48d3f4d064d88057efe9a482d9e00ab5caeb5aca2d660e337bd15487365697956a5e47b02abdc30d8e353fed4e1ac41d2bc2120021143635935c620186a522bde54be0446fbd2dc88b56304b3a64227d0acd5f85a6b6787a3adcf2d7cfc86c634b4d7ab4315b97de9e666cff3ff1b88f3295e7bab9e9fd46fafddb4f5fac51cc0170129c651b4ef4d3950d6942ff020d1668a528bde1da936c0ec1ae09e84f8205861fff491502a872c8154a96e7ea25eda955a7fd2e4b4c7a8d273f60bc74fab7b4968ca6f75daea5040f839fd56c2a980", "signature": "d15788bcd88d1d81b9e61d4fe26ea49e66819a59d2ae4832321b814d5062fadb87807db6852e1d8295e31a291b1e785d01d834895f88f400df8832c1607b5b0c" }, { "secret_key": "d08f4babba3b5365faf738795c9da45db1862cb28b93eb6635d1320da0f4d937", "public_key": "ef31b454f734e52b3438ee2f1cbc35631b1969de54ac98fe4633f2f500ac8712", "message": "a394d8854ceb5c43afee1a48926bbd6685aa8aecfdcf854133333974d624bf2f1f9c30f005bbf34cee3afe2b290600eeae6f1dd12a0c346fbb2ab9c916c5d5d80dcd87887875a0ac847678039fdcd3a9793541f5d675143a6abadc3b18f0fef5108c19c2dbfb59710eef9866a4f3f297a09ee48c6803007dd6ba8fd4be841cfb10ff0514c30fc4dd49a3cd43bbd16e460443a11afe649e901d63d89af598aa686b2f607ec11f35e17a798a4213b75a38788da4f27cf2b02caddfe61c3729a87ec6e6b098f68e7aed28a800c484dfa0130401208f986d792f54635add2848e151262a365eb21e2727191e1f700f3bf5c73b0fb4c546d0048a155c18717920fc0425c8c8fa8f167c43a277bb366e0ad702c89bc5aa06fd470943be05cb9e3259787229714c30a4e87b00a633aaf7be6b5875010d12e107c9a5261ca562d67025bea0fe223463edb92ea01cca92c44ff24da9d8a80a6421f3d4135d647d1bb0fd988c46c8a170ceb4f33fff9c0ffb6abad1092c84dfad8290898b249516a292e8da96fd51a81005eecfdebb05933099277d073a480c3f9eb8aa11968c4d8dc0787a9aec3e0527b7fe4c0635411335a1811689e88f6d5ced0d40d6b48b7f2d992952934894153076a8d37372fa00d9cefc5cf8c26adb5acf325a01cd005ab8d474a52d67114078c6516aef804bba19b887a28ed5e46ee9995e5ad3a82fb9cd93283433680921114b4d9af8fcb6b2b535839c36de8df12b17ea6ddcfcb3334ff40e6cf04ccd5ca6403ba0b62b4cb71bbde91d8babda69152c9c93ae769b5529c8d52fd9a6909a15e1a0601a714649c96ec996c1706d1021b97487980d7b2c2a39bbb0e470d8e46ac4aa609a0922c9bdc01612eadeaccd5fa523b2a8d0e62ffe56281647d61fffbbc840535745d144259cc81300fe99dfbffea6b0b9bcd28473982d32e93ed46634a9987906d6f48939d8dfbfb37d33b888db608cb2ffe39a8cf67b72644611c7d32a4a8df612468cd5e5d75fbba79e638aa1daa28c4e0eeb9a637ff8a08b65f7a7612414df76bc7b0b56b5537d666facfddaf65af1", "signed": "acebe4c86fa9fe2c1a5c576ac0501e8ab0f640fa40380536fcf95059d53d4a3555d220ac363587175e4bde163c0d00650a12963d46766c99bb62bf7573e2870ca394d8854ceb5c43afee1a48926bbd6685aa8aecfdcf854133333974d624bf2f1f9c30f005bbf34cee3afe2b290600eeae6f1dd12a0c346fbb2ab9c916c5d5d80dcd87887875a0ac847678039fdcd3a9793541f5d675143a6abadc3b18f0fef5108c19c2dbfb59710eef9866a4f3f297a09ee48c6803007dd6ba8fd4be841cfb10ff0514c30fc4dd49a3cd43bbd16e460443a11afe649e901d63d89af598aa686b2f607ec11f35e17a798a4213b75a38788da4f27cf2b02caddfe61c3729a87ec6e6b098f68e7aed28a800c484dfa0130401208f986d792f54635add2848e151262a365eb21e2727191e1f700f3bf5c73b0fb4c546d0048a155c18717920fc0425c8c8fa8f167c43a277bb366e0ad702c89bc5aa06fd470943be05cb9e3259787229714c30a4e87b00a633aaf7be6b5875010d12e107c9a5261ca562d67025bea0fe223463edb92ea01cca92c44ff24da9d8a80a6421f3d4135d647d1bb0fd988c46c8a170ceb4f33fff9c0ffb6abad1092c84dfad8290898b249516a292e8da96fd51a81005eecfdebb05933099277d073a480c3f9eb8aa11968c4d8dc0787a9aec3e0527b7fe4c0635411335a1811689e88f6d5ced0d40d6b48b7f2d992952934894153076a8d37372fa00d9cefc5cf8c26adb5acf325a01cd005ab8d474a52d67114078c6516aef804bba19b887a28ed5e46ee9995e5ad3a82fb9cd93283433680921114b4d9af8fcb6b2b535839c36de8df12b17ea6ddcfcb3334ff40e6cf04ccd5ca6403ba0b62b4cb71bbde91d8babda69152c9c93ae769b5529c8d52fd9a6909a15e1a0601a714649c96ec996c1706d1021b97487980d7b2c2a39bbb0e470d8e46ac4aa609a0922c9bdc01612eadeaccd5fa523b2a8d0e62ffe56281647d61fffbbc840535745d144259cc81300fe99dfbffea6b0b9bcd28473982d32e93ed46634a9987906d6f48939d8dfbfb37d33b888db608cb2ffe39a8cf67b72644611c7d32a4a8df612468cd5e5d75fbba79e638aa1daa28c4e0eeb9a637ff8a08b65f7a7612414df76bc7b0b56b5537d666facfddaf65af1", "signature": "acebe4c86fa9fe2c1a5c576ac0501e8ab0f640fa40380536fcf95059d53d4a3555d220ac363587175e4bde163c0d00650a12963d46766c99bb62bf7573e2870c" }, { "secret_key": "8f474f88cf863c485456a5a2155281ff27b28459f63bc4f1db00e0031064f649", "public_key": "43144a329d751d04e07169b779ee920dd029cb445bf376ba3a668572182344a3", "message": "840891d948ec19c8c7f7c9d3c4775362a544a0ec97457ab5d14e125dc54b59c8dc9a635e7badb6be73c3a58dc0e9929f2b420d8356d617c3d41bfe69b4e158d4bf08fb17e688d3cf3c948b69b35f0b6db66272a8eb2bd410d6509f6c828b6a20d6586eaf857601ed9d6054799c25320eba8077fe1ae22671b33a1588ff2b235d3c71a27ce5c6c66e18889198d116933676bc4fb0710db7ff1ac2f20ce369bef56b43cd1d406cefdacf00f1f348b8ca7aa614db11a3a640fdb59389d1a6a394755c133f1b019c8308ca5a951e73b810a180f6ff25b29dbbccef4c13a97503393907a2dba096a8ce5c86c0ee6f97c1441b8d6331cba53b19606b421af52f65f9c663e63d3982718f948c6bae961b8e4bf8cd9e31cd09928e4e80616597ccfadcb8a614154933bc37589c85c776e34e5a90660f59a65b5e93ad438842f982d02b041e6dbddf171099f8db70995731a0db8c4625c9bca710805961fb176dae819768fcad7ff9bfce36403ca7f783e7613726d7dc59f24e247cf15068ff3b19c725fad65ea8e8a7f722d528c95fcef1c0cc79d18ef07cee8b011eeabd9921634d76a61a8a3c8931b827e8189881f81f7a175f21fb0378b8188e58bdb2017bef390f1800d9d74f263a81df8e67522d092e775d01e004e7f8d8281ae2c2fdf8c3a445f9eff7fdf13f261a773ddf2dd9cc6ba5585d990c995e6eb89dffd9ff0a9dbb76ce5e10dd0272d5001497881366f5d636a9cceaa283228d3ac614db217ab891d6689dbeb950e1200c3de53bc5da07f1d363dae9be6ec36eda6e687d26290f7abca268a7fa03d9318864eda9a11e3b26140605920ac13adec1b5548c9a7a3215a5876b7e941afa1cb5d7f7f0c11630cd429f3b2b37dc76c6cbea4f3b726aa8a5f8b9f705b05d7e9451956f8af13ce0a85955c7135d64ade5496ea542e70f8da5b573aaf137085dc96c6927099695672668b3c7c6f93c977a4e8e9e770295f20d52dff187f8dbb25ee7e774024eb9be08121ed74b6d5462f4bb7dc2003874caa31bb7595cd93a99ebe1eff928bb5fcb9e9c89dd31d487fc0e20bbe150", "signed": "f61f7807c33e196d0fe182efa4d4516a9815ddd449538bbaa6b86b6901a05f5ddda0601ec90f39f1554779db7a09a60572effd4d128d0d3c2dd4e883574bc60b840891d948ec19c8c7f7c9d3c4775362a544a0ec97457ab5d14e125dc54b59c8dc9a635e7badb6be73c3a58dc0e9929f2b420d8356d617c3d41bfe69b4e158d4bf08fb17e688d3cf3c948b69b35f0b6db66272a8eb2bd410d6509f6c828b6a20d6586eaf857601ed9d6054799c25320eba8077fe1ae22671b33a1588ff2b235d3c71a27ce5c6c66e18889198d116933676bc4fb0710db7ff1ac2f20ce369bef56b43cd1d406cefdacf00f1f348b8ca7aa614db11a3a640fdb59389d1a6a394755c133f1b019c8308ca5a951e73b810a180f6ff25b29dbbccef4c13a97503393907a2dba096a8ce5c86c0ee6f97c1441b8d6331cba53b19606b421af52f65f9c663e63d3982718f948c6bae961b8e4bf8cd9e31cd09928e4e80616597ccfadcb8a614154933bc37589c85c776e34e5a90660f59a65b5e93ad438842f982d02b041e6dbddf171099f8db70995731a0db8c4625c9bca710805961fb176dae819768fcad7ff9bfce36403ca7f783e7613726d7dc59f24e247cf15068ff3b19c725fad65ea8e8a7f722d528c95fcef1c0cc79d18ef07cee8b011eeabd9921634d76a61a8a3c8931b827e8189881f81f7a175f21fb0378b8188e58bdb2017bef390f1800d9d74f263a81df8e67522d092e775d01e004e7f8d8281ae2c2fdf8c3a445f9eff7fdf13f261a773ddf2dd9cc6ba5585d990c995e6eb89dffd9ff0a9dbb76ce5e10dd0272d5001497881366f5d636a9cceaa283228d3ac614db217ab891d6689dbeb950e1200c3de53bc5da07f1d363dae9be6ec36eda6e687d26290f7abca268a7fa03d9318864eda9a11e3b26140605920ac13adec1b5548c9a7a3215a5876b7e941afa1cb5d7f7f0c11630cd429f3b2b37dc76c6cbea4f3b726aa8a5f8b9f705b05d7e9451956f8af13ce0a85955c7135d64ade5496ea542e70f8da5b573aaf137085dc96c6927099695672668b3c7c6f93c977a4e8e9e770295f20d52dff187f8dbb25ee7e774024eb9be08121ed74b6d5462f4bb7dc2003874caa31bb7595cd93a99ebe1eff928bb5fcb9e9c89dd31d487fc0e20bbe150", "signature": "f61f7807c33e196d0fe182efa4d4516a9815ddd449538bbaa6b86b6901a05f5ddda0601ec90f39f1554779db7a09a60572effd4d128d0d3c2dd4e883574bc60b" }, { "secret_key": "e42b30d49c43c4fad83dd51fdc2a4ac5901327add800b66972c8c70bde180adc", "public_key": "f734aafaa4dbaf315c258cca8bbc1d4f34e83601109874222aa05589f3a6635f", "message": "0d497051861e22d8a9c60e5f7de6c895cba335b2e82e602118ad8342b4d4edaa80f95efbb59cfda1fcc0291725700e8a81bb12a0b8623b1fe2891b8d98f7a84c59fd92f8a7adfc065042f7f4fd7e1a79f55a1d4d5e54e04e672f1c9e4c4cd8d0003f3cd54b76e2163dd737acb2de5c263ac102a48f696b60caf9be39c665cce1e0f3d498553f579061889a5ec5603e4d141cfdede8e7317572cfe76a0f48e4ae06062c9157b5eaac3468938192db4b16105c7364a94432b215a71797fee14c3c9ce2f746ed790302fc41dc492d37d9ef024ab51da3bdaf0f81d9a930aa0e025c04fd71026b6afeb7ed01a91a1efd6c39f5e447c66dd38a7656c613d02126f3585dfaa02df930253f83bd42196463ebc50f8cfc949ed350392e61ceec1309da15a432f80dfe948e261ce6d8421c5459cd21f3ffa2edb500982b2abfa52e82437ca230f609116320d9893eb82a14df72b7736667516fc012b28a03c9dd88ea4308d8ceea44cc604454cdfa2c797615bc0a6b3e0089af0a81be54d1b110a13ab911b452c342800cee2ad239a2b188a7fa875e941daaebcfc88b70ae4b1c575cdb6e6d89448136f60ee81c703c47822d2c0e50c7f1e8b7fc7ebd80789fcd7e06c7e50b5fc8b776e8b9a4cd5905a29069bc3a558d7cabce2af4f310767d5b117e3076b3a0d527175543b2ccea28d5f716fac32efed3d2e0276be44a8956fc8240f2db3397614f2f2da02166694ec6a7feec6ece39d72b64bbc6b476a4f84f8d879380a38488e4d6e58cac0390ae25a5fcb73d47414b4c26bbb9b4cc66e42594bd56d841a360923491d117be2c6eb2320f3c6175e44e27b6653c5dac6fae73600b67960dca50aa855a89e0ff511ea04f143e89f1da028476be4bf6d94c80ff726339e8bcfb7dd9f8cf202259c0acb6276c281e3847c2cc8d2fba84438d2d3c6031f2a7b95c1d8f9f3cc86a5eff65cc011de95ad896858e1f7f6d6b94bf49dfff5de2d7fd71ef108134285f61ae475483442dc90bf013faedf3771c47c5b96dc3cf8e48510060ad8d45fd5461622780d869d4617b57fe3cb5cc0203153aae", "signed": "ff8e076e343c8b73aa453bfee9b2bab6d5c2f74c35e1bad1e52ae777d69f79764083f994368a1ac851a641cd247008a34f3b608962f4dd5109ac71cce978ec020d497051861e22d8a9c60e5f7de6c895cba335b2e82e602118ad8342b4d4edaa80f95efbb59cfda1fcc0291725700e8a81bb12a0b8623b1fe2891b8d98f7a84c59fd92f8a7adfc065042f7f4fd7e1a79f55a1d4d5e54e04e672f1c9e4c4cd8d0003f3cd54b76e2163dd737acb2de5c263ac102a48f696b60caf9be39c665cce1e0f3d498553f579061889a5ec5603e4d141cfdede8e7317572cfe76a0f48e4ae06062c9157b5eaac3468938192db4b16105c7364a94432b215a71797fee14c3c9ce2f746ed790302fc41dc492d37d9ef024ab51da3bdaf0f81d9a930aa0e025c04fd71026b6afeb7ed01a91a1efd6c39f5e447c66dd38a7656c613d02126f3585dfaa02df930253f83bd42196463ebc50f8cfc949ed350392e61ceec1309da15a432f80dfe948e261ce6d8421c5459cd21f3ffa2edb500982b2abfa52e82437ca230f609116320d9893eb82a14df72b7736667516fc012b28a03c9dd88ea4308d8ceea44cc604454cdfa2c797615bc0a6b3e0089af0a81be54d1b110a13ab911b452c342800cee2ad239a2b188a7fa875e941daaebcfc88b70ae4b1c575cdb6e6d89448136f60ee81c703c47822d2c0e50c7f1e8b7fc7ebd80789fcd7e06c7e50b5fc8b776e8b9a4cd5905a29069bc3a558d7cabce2af4f310767d5b117e3076b3a0d527175543b2ccea28d5f716fac32efed3d2e0276be44a8956fc8240f2db3397614f2f2da02166694ec6a7feec6ece39d72b64bbc6b476a4f84f8d879380a38488e4d6e58cac0390ae25a5fcb73d47414b4c26bbb9b4cc66e42594bd56d841a360923491d117be2c6eb2320f3c6175e44e27b6653c5dac6fae73600b67960dca50aa855a89e0ff511ea04f143e89f1da028476be4bf6d94c80ff726339e8bcfb7dd9f8cf202259c0acb6276c281e3847c2cc8d2fba84438d2d3c6031f2a7b95c1d8f9f3cc86a5eff65cc011de95ad896858e1f7f6d6b94bf49dfff5de2d7fd71ef108134285f61ae475483442dc90bf013faedf3771c47c5b96dc3cf8e48510060ad8d45fd5461622780d869d4617b57fe3cb5cc0203153aae", "signature": "ff8e076e343c8b73aa453bfee9b2bab6d5c2f74c35e1bad1e52ae777d69f79764083f994368a1ac851a641cd247008a34f3b608962f4dd5109ac71cce978ec02" }, { "secret_key": "5cb514217482bf42f611fcec36a5286807c2bdbb56967691353f54310e1ad553", "public_key": "280699003d5d3e1c05ad10fb10959bbc595cfe213069965cd8cf39dd426a0568", "message": "2f57258cca7932e58bed546cb0041115bbad23d18346ef7ab5e3110082b3a9712f6cbe1270e6dc0cea3364a06a5f2f283ec39b63058d34d59979072fcbbd7a5d0f442bbdf082d5bfe2998aeb51bd26127803e5c796c38843200ae2f6e605af312f54fdff17ed1dfaa89d28fa67dce462de4fe25268212b282e222a443e2f31e269054171aa73c719a896cdb7a539dfd1d42991978197d7c4f2d30a641be34bf1380a4f4dc6d9b101636636a496beb357e347c1666516df8eb560a0e0d1e1529ce36a60e00ed278da3802be192342989bb611b4e3cbd9c37e8cce07efc12d29befd7e2f3adb13d28f708d97b63e107482c862956d7ce8dfc2af5cac8d51659267b0bbeddd5efa414ddeabd17b23ca6e843ff49effc82a5d07e36a83b67c2ad7e48eb9990b421c5558009bd6934e86d54a8a6ac4078796e305c7cc810d3f66ea6b9504fe0ae6757c504c5552530a6f8bbb52409be079d8e4a28a6fd7dc8935f8eb9498adc0f23d0807ec86295f4898f5d05e150bdc43aa8b7bdc893a0a684c3063898b6c95e7d56a4c102690438e9df99758a90f47c608dacc4ca240266faba35fa1eb2eaabe288d2c2ad50b6cbf107c002575e91ff472a4417940667be8180173854c93df84464bcd312b7a7ae4dc2b9059fbe6f83f53806425bdff031c6aed6efafd9de8dcd0dfabea8e6fa681e99193fb3c647e442112c9a23f596e65411d8d6bfc3923004ece91ea6deb881111b1dc29943f578981ee8c3bce8525f78565f34b85ff20015feae846f95b18700bc5cdf14b2db6cac69814d63d74bf20329303e5ca9f04731f6881cec6d3abf87f5eac08734faa34cff4d3cd9a4a11d7b12f73253b4dd0a43178f0d3c19c0c40d9ed918dd17646f616af79fdf6194262f0fa4f71b3187dedca48d9cbcc19931a1519677456256ed38354567c3a67571cdf82170a2c85bd2c5e68e05a0f3b93903f191b894f84946f89000568054c1cea9fd0b8bb55019506c54341c24931984548ba458a4d813089896e86a2dc33d94604003f354a7cc941c754aaea24253cbe4cf2147ffec5e7b950cbf28e284481", "signed": "d53ee2e0f0fd657b2052478fd15df1d38fe0e93a5483eb4a6e7de93d02a4cd544d8fdddcea822b71576ed02853d9a6b14e1a548aefe90d92f883792b7f1d86092f57258cca7932e58bed546cb0041115bbad23d18346ef7ab5e3110082b3a9712f6cbe1270e6dc0cea3364a06a5f2f283ec39b63058d34d59979072fcbbd7a5d0f442bbdf082d5bfe2998aeb51bd26127803e5c796c38843200ae2f6e605af312f54fdff17ed1dfaa89d28fa67dce462de4fe25268212b282e222a443e2f31e269054171aa73c719a896cdb7a539dfd1d42991978197d7c4f2d30a641be34bf1380a4f4dc6d9b101636636a496beb357e347c1666516df8eb560a0e0d1e1529ce36a60e00ed278da3802be192342989bb611b4e3cbd9c37e8cce07efc12d29befd7e2f3adb13d28f708d97b63e107482c862956d7ce8dfc2af5cac8d51659267b0bbeddd5efa414ddeabd17b23ca6e843ff49effc82a5d07e36a83b67c2ad7e48eb9990b421c5558009bd6934e86d54a8a6ac4078796e305c7cc810d3f66ea6b9504fe0ae6757c504c5552530a6f8bbb52409be079d8e4a28a6fd7dc8935f8eb9498adc0f23d0807ec86295f4898f5d05e150bdc43aa8b7bdc893a0a684c3063898b6c95e7d56a4c102690438e9df99758a90f47c608dacc4ca240266faba35fa1eb2eaabe288d2c2ad50b6cbf107c002575e91ff472a4417940667be8180173854c93df84464bcd312b7a7ae4dc2b9059fbe6f83f53806425bdff031c6aed6efafd9de8dcd0dfabea8e6fa681e99193fb3c647e442112c9a23f596e65411d8d6bfc3923004ece91ea6deb881111b1dc29943f578981ee8c3bce8525f78565f34b85ff20015feae846f95b18700bc5cdf14b2db6cac69814d63d74bf20329303e5ca9f04731f6881cec6d3abf87f5eac08734faa34cff4d3cd9a4a11d7b12f73253b4dd0a43178f0d3c19c0c40d9ed918dd17646f616af79fdf6194262f0fa4f71b3187dedca48d9cbcc19931a1519677456256ed38354567c3a67571cdf82170a2c85bd2c5e68e05a0f3b93903f191b894f84946f89000568054c1cea9fd0b8bb55019506c54341c24931984548ba458a4d813089896e86a2dc33d94604003f354a7cc941c754aaea24253cbe4cf2147ffec5e7b950cbf28e284481", "signature": "d53ee2e0f0fd657b2052478fd15df1d38fe0e93a5483eb4a6e7de93d02a4cd544d8fdddcea822b71576ed02853d9a6b14e1a548aefe90d92f883792b7f1d8609" }, { "secret_key": "87d3ba95c40df80069b1797ddf68e866e66d46c51fde60e768a9dbc5c92f57a9", "public_key": "2b812b2c9b60ff31975c429a86736dcc17a58d3dc1daa34623a4bbcbe2cc0581", "message": "e11256f82ad76f3f4a49d7bad3ced8718d36d2f2bb3d31bb61edd1ecbcee6621fd2eeed3e3deb597b149ff71b851f61c8c6819e131f9a2af7673c3f20702acfdc8b8f9064b415c9a3e35568e371d740a38127c1f27b391b45d07045aeaf00a54e5b7fa548afb5f96feb5f5b44f60cd1707e8fa9567f7806e15f6a01aa02077733fe738b08f21efbcf98c19d5b970e6163e5fe8f4800ef9ed22a0f9b5126ff1eb1c7d65019c8b440391927029b813dab7c7e863d48229f8df85394345fcc88a300f60a8d516d877a5a3a7e3c49a9eb06cd9f2665ce2a89022962b1d49592b09c7543da835ce63bc9abb822145762b71cbe150292ce5c8704e5ad34fb4592f972044e43e69f0e1672d6c83cf25aac68efe3d27af2ad34274b9d2b77742d9c6dfbd57f92ff64d3e4c67c541d8502a7d031895af85319a4eae2d254335835eff11e7a3671a6a0d21b72ce1fc2acba1a920183834bc0a4b73f639ffcb0f6b81cd920f2e9420d612166d5682a06060ea0b6fa695fecc7704bbe4b052aa3ec8f720f7d4f32e8aff86b80b8c1cc12764a04874037c3103e9dfecb8f7abcb0e073b23e67ca0a9b1fc72993abf31dbc24a8fee095b3251c22626af5dd1b6d34be5ea06a02ae176c7b8cb9d063501be6f612082889fdbdcbfadc33a0d311b080b8d64e49f16b16dd8edd3b2ed1193a74e5be507609b042727ccf08afb05cc6c50524ef0e2664621dc8b05b15ffa81ab6f7e3c8a5bb3eab1f68e3656c119d969e4144cf3285af23c04dbecc038aefd9183c4e72447b2aaa8315f4696ce6d1ef429ba0e5c3d5ffa7f050be39c7f612f4e10f8ef070df72f8addbeaf3339c1ad8b5fc39a2ecf29a87f82e29a0117baac6625ad5c80cfe759fa1dbcfaa12b374477d80bfcf06796c30f2c39cf0303d00dc56a32d1d039592ddb06c22aa068841c0b46fd48df8fbb7492ccbc590c563c8fecce4263c8c7539218bb97b35711537e988195dbf5bcd5ccaf06faf508470977a5358e6f02608349fbb99a23fbe36b8c97155adc246ad7d93a8c203f75446c83c4342c35ba104ecc67e669db4a95466ee68f458a", "signed": "fa0d12cd53236c41086bea8c0cc60b7764a3ed72bdeb9d1ae5eeacb48811fe529762a2c6f2bb06d9b318218d968f644435497a1bd0d0d8c1612ab8996d98d707e11256f82ad76f3f4a49d7bad3ced8718d36d2f2bb3d31bb61edd1ecbcee6621fd2eeed3e3deb597b149ff71b851f61c8c6819e131f9a2af7673c3f20702acfdc8b8f9064b415c9a3e35568e371d740a38127c1f27b391b45d07045aeaf00a54e5b7fa548afb5f96feb5f5b44f60cd1707e8fa9567f7806e15f6a01aa02077733fe738b08f21efbcf98c19d5b970e6163e5fe8f4800ef9ed22a0f9b5126ff1eb1c7d65019c8b440391927029b813dab7c7e863d48229f8df85394345fcc88a300f60a8d516d877a5a3a7e3c49a9eb06cd9f2665ce2a89022962b1d49592b09c7543da835ce63bc9abb822145762b71cbe150292ce5c8704e5ad34fb4592f972044e43e69f0e1672d6c83cf25aac68efe3d27af2ad34274b9d2b77742d9c6dfbd57f92ff64d3e4c67c541d8502a7d031895af85319a4eae2d254335835eff11e7a3671a6a0d21b72ce1fc2acba1a920183834bc0a4b73f639ffcb0f6b81cd920f2e9420d612166d5682a06060ea0b6fa695fecc7704bbe4b052aa3ec8f720f7d4f32e8aff86b80b8c1cc12764a04874037c3103e9dfecb8f7abcb0e073b23e67ca0a9b1fc72993abf31dbc24a8fee095b3251c22626af5dd1b6d34be5ea06a02ae176c7b8cb9d063501be6f612082889fdbdcbfadc33a0d311b080b8d64e49f16b16dd8edd3b2ed1193a74e5be507609b042727ccf08afb05cc6c50524ef0e2664621dc8b05b15ffa81ab6f7e3c8a5bb3eab1f68e3656c119d969e4144cf3285af23c04dbecc038aefd9183c4e72447b2aaa8315f4696ce6d1ef429ba0e5c3d5ffa7f050be39c7f612f4e10f8ef070df72f8addbeaf3339c1ad8b5fc39a2ecf29a87f82e29a0117baac6625ad5c80cfe759fa1dbcfaa12b374477d80bfcf06796c30f2c39cf0303d00dc56a32d1d039592ddb06c22aa068841c0b46fd48df8fbb7492ccbc590c563c8fecce4263c8c7539218bb97b35711537e988195dbf5bcd5ccaf06faf508470977a5358e6f02608349fbb99a23fbe36b8c97155adc246ad7d93a8c203f75446c83c4342c35ba104ecc67e669db4a95466ee68f458a", "signature": "fa0d12cd53236c41086bea8c0cc60b7764a3ed72bdeb9d1ae5eeacb48811fe529762a2c6f2bb06d9b318218d968f644435497a1bd0d0d8c1612ab8996d98d707" }, { "secret_key": "7c27ae47072b0c9b9c2c351f1327899895efa536c9c067d0e0ce8e82e6292793", "public_key": "f9febd121e17db7229b56709021849c35d69fa08b50620e667f842ec7ac782dc", "message": "1547876a988d1be714a42fb91cb03763f1913a892ecbd4de2ccf8344d20758b7b6d00259101fe97225b297f87bfe222004325db7f632ceaffbd134c96cbd57e985bec8434f81a4ee6af85c3fade50e4c4ef20cb0393545e4d4a86e1fa39aaf333fe4ded054bfc050a8983a03dd1ecf2b5e9517baf9e1152129a8a75935711edb20af5c8cf9c694a33cee451cd950b2fff08e3158c5cfb7b15cb3e90d46f494b6a108d8888d5ec29a33c066023b497709b2d9401feaf2e74ff26c16d36c39e6517ff954bd98bce7700671988f66e85107644ba2ea007a13018c1c144e3c5bb80db9511fcca4101bf49f8c80ff3ca7d298257cbfea629f83d5e06639d31f639db4b8726cbe224d758829bab10905171c9c0ec370d58031efe4cc5ae72a495acff6cb2ed9eec658ba117088dd3c6ed1df8f9cb10bd4fe0e5e8ad9f5034e34652d98668db15c8533393a6e9ec0870c35666ce54efe2bcb45c34a7230e6a700676349c7b3abf31de7b7b0521f89b30ac4034c2a4ba8218eefdf8d2a5c1f8ed9b701579e47af8a529a95a1ff64d8fdb885c36839b4c5f6d72a99257e8678dccf312754b9d4619beeceb825526de622bd9676fd5f357693abab078b9e03ae21e87ca161e778af77096eaac2d2d32bfec8ec94af7965f61d68ef66a4523c1cc70c9519b0750b3c9eed5aeba9f0a9b7ef52cd4a2de29b395b705fa53f028fa766159f20e75f4d384ec4fd66df06e744c99ac88cb849c285757cc557e2eedd86959da2c1b81f5b2715a6519848901ae4f89d0913c8de57c53dadf2e5e1aa2a9c5f464fc7610e8ef5f5cdd8203a67a93c33a06dab358dc5ae23edfee6334262f47b19b113d6cafedac1b43902539d74fba29aaa7bce68884b72616a0542c9fc69547cd19ae1df01723abdda65e9bfac5da0d04240c6a2175c0062e4e1ed8a5b397afcd4de38e86209272c7a424b5ae8d5a40b484ce1b4704af2831609ad0f36e90e07b2afed01dc05574ad3971723c5b5c1ddd4fc8bd263bcdf568af75e73d8abd1008c9ec712f80ffc65ac34e2a79304eade1d2a1dffec0e4c98c3582468f320bf8f66", "signed": "327196ddd43bb602d04d1964ccc059ed627cef0a88d8ad91be4931f17c250d5529f552794a3e269d17a63bd32933eb5e519c1d506574770ae4a72964e06f7d001547876a988d1be714a42fb91cb03763f1913a892ecbd4de2ccf8344d20758b7b6d00259101fe97225b297f87bfe222004325db7f632ceaffbd134c96cbd57e985bec8434f81a4ee6af85c3fade50e4c4ef20cb0393545e4d4a86e1fa39aaf333fe4ded054bfc050a8983a03dd1ecf2b5e9517baf9e1152129a8a75935711edb20af5c8cf9c694a33cee451cd950b2fff08e3158c5cfb7b15cb3e90d46f494b6a108d8888d5ec29a33c066023b497709b2d9401feaf2e74ff26c16d36c39e6517ff954bd98bce7700671988f66e85107644ba2ea007a13018c1c144e3c5bb80db9511fcca4101bf49f8c80ff3ca7d298257cbfea629f83d5e06639d31f639db4b8726cbe224d758829bab10905171c9c0ec370d58031efe4cc5ae72a495acff6cb2ed9eec658ba117088dd3c6ed1df8f9cb10bd4fe0e5e8ad9f5034e34652d98668db15c8533393a6e9ec0870c35666ce54efe2bcb45c34a7230e6a700676349c7b3abf31de7b7b0521f89b30ac4034c2a4ba8218eefdf8d2a5c1f8ed9b701579e47af8a529a95a1ff64d8fdb885c36839b4c5f6d72a99257e8678dccf312754b9d4619beeceb825526de622bd9676fd5f357693abab078b9e03ae21e87ca161e778af77096eaac2d2d32bfec8ec94af7965f61d68ef66a4523c1cc70c9519b0750b3c9eed5aeba9f0a9b7ef52cd4a2de29b395b705fa53f028fa766159f20e75f4d384ec4fd66df06e744c99ac88cb849c285757cc557e2eedd86959da2c1b81f5b2715a6519848901ae4f89d0913c8de57c53dadf2e5e1aa2a9c5f464fc7610e8ef5f5cdd8203a67a93c33a06dab358dc5ae23edfee6334262f47b19b113d6cafedac1b43902539d74fba29aaa7bce68884b72616a0542c9fc69547cd19ae1df01723abdda65e9bfac5da0d04240c6a2175c0062e4e1ed8a5b397afcd4de38e86209272c7a424b5ae8d5a40b484ce1b4704af2831609ad0f36e90e07b2afed01dc05574ad3971723c5b5c1ddd4fc8bd263bcdf568af75e73d8abd1008c9ec712f80ffc65ac34e2a79304eade1d2a1dffec0e4c98c3582468f320bf8f66", "signature": "327196ddd43bb602d04d1964ccc059ed627cef0a88d8ad91be4931f17c250d5529f552794a3e269d17a63bd32933eb5e519c1d506574770ae4a72964e06f7d00" }, { "secret_key": "08eddcb5625ae19ffe7b49a7dc829c893c7538b0885e18f98db78c8beb569c26", "public_key": "83478b1c58576a0d1834b28d46fb80516d6fb6f9f591694b44352eecd1e7e89a", "message": "015b1d3eeb00929ea80bd8687d18286f0adfe645ccf25a22b5061921e2a030fc76d033fb53d0937c69b31c5be49913ca1f2c3dca121b2b87c59b3c84c7ae52af19c6b9fa1bd675fb6dd8b329d5668786dc7883e2d2e8586ff4128b90dee84be0ab54d6813f7a8c6134757173981775de84c4dd39e336f8a4ef8dcadec943e90d421b229c11785fcd3fe963037458e76c820b3bc2c9476001262b261d28b65b489d76b4be2365e4a80fa871b0a53b6a5fb243688235acc5f4774db15d47b42dd6c8d9e12dcb0b5d980dab0f3ad8a496f76e5006c2ca82675ff194caf8070d04bd384f97e583e73cbc4f7f257310a61b1c8062322dce8115f6dd93eee8a93ffa5cab6634116e1ab705fa86c4a8eaa556c6c89dbcad010436bffe451822491f1ea86c20207e4d12dfa362616c589f97107ea5d8bd8a7215c600ffc70b80e2abb15acbe4becca20d72155abc3dbe8e37cfd73f7420f21c9bcd0c3273513b5049670874d5519b3bc1db523c1d7e90c165967c4cb2845a2e8b47b5889254f58a9bbb826f94521cdbd0416f5f18ff78a3fd0d7ab897906264483cde642d8e703fd82e5ae70a9f978f64ee80520554850528581ca9a0b38c196fd166dae5879b3f72f59cde91cca2c8bfaa478b98d624cd34724402de578e5754825ce227d2871b45a5117149515bff81a923246f3b72d07bd458125c70a14d87c3fd13392a3bda6553016e8b2d07bde903cf687b445cfd6f761492eba46522ada84a9615d8da3498b258067269b788e559b659d4b48a87d880d6378be6a88746f35b322b047845aadc523beaff3070f721c3c071eaa319b7a47c1b20d300dc0321909b669e57d39a1ce2fdbeaafac21350ec2d6e6d5b880186c028a861474d5076a4adc5032fec9140787c36806ef79c72e3a19d8c8b70bdaf207295542d96825a5de7dfe108ef574599b8f184c63a5a131db19b3be53f699c10fc4ca7c63f3500211b356a0ac664ddfc1a9252590026395b479be9a5e4758423560b65bbce5bbade493b13d00cf8c1d3b7e9221367e8f0eadab6e6d1b5fffde7b2d741fc2c830224fff7ff14ae5c07", "signed": "ece75322995154b292437e47d38a6a70af37e2020716fde46bfd393b3d369bddb53253b556621cfb34c8a90254e132fd28ecd098433413a21bd3a9798ca1f309015b1d3eeb00929ea80bd8687d18286f0adfe645ccf25a22b5061921e2a030fc76d033fb53d0937c69b31c5be49913ca1f2c3dca121b2b87c59b3c84c7ae52af19c6b9fa1bd675fb6dd8b329d5668786dc7883e2d2e8586ff4128b90dee84be0ab54d6813f7a8c6134757173981775de84c4dd39e336f8a4ef8dcadec943e90d421b229c11785fcd3fe963037458e76c820b3bc2c9476001262b261d28b65b489d76b4be2365e4a80fa871b0a53b6a5fb243688235acc5f4774db15d47b42dd6c8d9e12dcb0b5d980dab0f3ad8a496f76e5006c2ca82675ff194caf8070d04bd384f97e583e73cbc4f7f257310a61b1c8062322dce8115f6dd93eee8a93ffa5cab6634116e1ab705fa86c4a8eaa556c6c89dbcad010436bffe451822491f1ea86c20207e4d12dfa362616c589f97107ea5d8bd8a7215c600ffc70b80e2abb15acbe4becca20d72155abc3dbe8e37cfd73f7420f21c9bcd0c3273513b5049670874d5519b3bc1db523c1d7e90c165967c4cb2845a2e8b47b5889254f58a9bbb826f94521cdbd0416f5f18ff78a3fd0d7ab897906264483cde642d8e703fd82e5ae70a9f978f64ee80520554850528581ca9a0b38c196fd166dae5879b3f72f59cde91cca2c8bfaa478b98d624cd34724402de578e5754825ce227d2871b45a5117149515bff81a923246f3b72d07bd458125c70a14d87c3fd13392a3bda6553016e8b2d07bde903cf687b445cfd6f761492eba46522ada84a9615d8da3498b258067269b788e559b659d4b48a87d880d6378be6a88746f35b322b047845aadc523beaff3070f721c3c071eaa319b7a47c1b20d300dc0321909b669e57d39a1ce2fdbeaafac21350ec2d6e6d5b880186c028a861474d5076a4adc5032fec9140787c36806ef79c72e3a19d8c8b70bdaf207295542d96825a5de7dfe108ef574599b8f184c63a5a131db19b3be53f699c10fc4ca7c63f3500211b356a0ac664ddfc1a9252590026395b479be9a5e4758423560b65bbce5bbade493b13d00cf8c1d3b7e9221367e8f0eadab6e6d1b5fffde7b2d741fc2c830224fff7ff14ae5c07", "signature": "ece75322995154b292437e47d38a6a70af37e2020716fde46bfd393b3d369bddb53253b556621cfb34c8a90254e132fd28ecd098433413a21bd3a9798ca1f309" }, { "secret_key": "2273942db3e5d3221e80d994fd5e1163af55f5455a8e52be852dd3adf762b440", "public_key": "bc58674e996b6f3e3220b3e94f0067bb0e9b0d97d9e1059cf13997a193ac032a", "message": "8aa0509e4b914186ffff07aeb97a04b546272da2f9ea7bfa659a24cb50966c23eb6542e4f22debe33b65769245c4d1b5dcf3e699c70c5c2baad9734e9d1efe5448ab71c8946aecce5268d26f19cf605eb3bf38b0b3322694ac0dcb76b0f946842f6c5c68d763fce74701bd6b78e71c8c3142add4ed46e0969bb9555be03602d562e4c89f3a919940e883a96940542f2779fbf9ec0a285d9d8a72360146e3ffbdb78d210316038d95d6ab757165aa943c033eebb321c05a399569bcf66b4ddb0b2e0e33c4793d817ccff57f99b3189c60d5d7b9419d1ebc943a79d4d8c394566180594f559a80529cc1ba28877af8f5c0503e943cd3aad99811645272dafb49b9b3e6107eb5e5186e1608757126053debcec75dd9565ceea06a1391a8226d1f4593792240ccd97c67a6c2b1344c22c91f42033adef52861f32a4e0712a917879a0b0518b5424bcdc054b44e972ed24d01689f4f27f5f176f0a578ab2d3c0878272e8c08c21582118654124dca39585337c13c1865814caf0996cadfa65be580dee322ebccda704b2280582604067dc3c6b1f7d8a26978a65cffd1ed3196a2b065fb3caa79e6b5b66c13d7bd7d0ec14a3a4d58413f212f471ecaad3a84af35e598a89fb3447d3324f020fbf1b73e2a986e0da16c0183bf92a398c419a0f9f30537bea0df8df2dc53c154e8ea160689e7bb4d729dd8ab90031427aa3945863a85e89652b9353805166f7c0a18c939954b2787c37094f92512722e52b0c976b9e42af4039d2c0578ff14fae1d8c2d1396beb2d6aa6ebd55474a9349867a03f3a99d78780634ab4b35cfe1b87a9133252a698bc407d63842870e22ccf3933620ac0423c3d1f681dd73c01d06c3b941506c98eed9b7868e017b7f99716b0b77f11321e5ab23dbfcfca9350845ee180444c50ff0a9c965fcbf777708e4f34ccc637c6a08d854384f8d3e2516956c151d031bb1cbe712a5ef9ee16619228bd296f2afe582d9953d590d18bb205f70f844c16c0a2d8318037d43dd80f65c6a753f2a8e27c89c83e7ed70c52f7062dfbb1f544aa236b5c704e7b39ce0a55fd46528083ca61", "signed": "874ddece08f30b30f0d4c8b3ed7c615149b8aa740daa347b55958f1e2119044f695a21069690506448d8e7352b9046511d7f39a5415bb9c57050fc17055c38088aa0509e4b914186ffff07aeb97a04b546272da2f9ea7bfa659a24cb50966c23eb6542e4f22debe33b65769245c4d1b5dcf3e699c70c5c2baad9734e9d1efe5448ab71c8946aecce5268d26f19cf605eb3bf38b0b3322694ac0dcb76b0f946842f6c5c68d763fce74701bd6b78e71c8c3142add4ed46e0969bb9555be03602d562e4c89f3a919940e883a96940542f2779fbf9ec0a285d9d8a72360146e3ffbdb78d210316038d95d6ab757165aa943c033eebb321c05a399569bcf66b4ddb0b2e0e33c4793d817ccff57f99b3189c60d5d7b9419d1ebc943a79d4d8c394566180594f559a80529cc1ba28877af8f5c0503e943cd3aad99811645272dafb49b9b3e6107eb5e5186e1608757126053debcec75dd9565ceea06a1391a8226d1f4593792240ccd97c67a6c2b1344c22c91f42033adef52861f32a4e0712a917879a0b0518b5424bcdc054b44e972ed24d01689f4f27f5f176f0a578ab2d3c0878272e8c08c21582118654124dca39585337c13c1865814caf0996cadfa65be580dee322ebccda704b2280582604067dc3c6b1f7d8a26978a65cffd1ed3196a2b065fb3caa79e6b5b66c13d7bd7d0ec14a3a4d58413f212f471ecaad3a84af35e598a89fb3447d3324f020fbf1b73e2a986e0da16c0183bf92a398c419a0f9f30537bea0df8df2dc53c154e8ea160689e7bb4d729dd8ab90031427aa3945863a85e89652b9353805166f7c0a18c939954b2787c37094f92512722e52b0c976b9e42af4039d2c0578ff14fae1d8c2d1396beb2d6aa6ebd55474a9349867a03f3a99d78780634ab4b35cfe1b87a9133252a698bc407d63842870e22ccf3933620ac0423c3d1f681dd73c01d06c3b941506c98eed9b7868e017b7f99716b0b77f11321e5ab23dbfcfca9350845ee180444c50ff0a9c965fcbf777708e4f34ccc637c6a08d854384f8d3e2516956c151d031bb1cbe712a5ef9ee16619228bd296f2afe582d9953d590d18bb205f70f844c16c0a2d8318037d43dd80f65c6a753f2a8e27c89c83e7ed70c52f7062dfbb1f544aa236b5c704e7b39ce0a55fd46528083ca61", "signature": "874ddece08f30b30f0d4c8b3ed7c615149b8aa740daa347b55958f1e2119044f695a21069690506448d8e7352b9046511d7f39a5415bb9c57050fc17055c3808" }, { "secret_key": "dbfa45abaa55415238b1287634d5eec402dadf622e270c04a8914ced270a72be", "public_key": "c0fe323581ea296750797eb5508ca19a583b537fa7df4529f0804a33c1a4bef4", "message": "e26e8dcb44e641fc20080e95474bd39d716c5afe5a1ffb056d1eaab0c49f8570717db6437a03228a9ad9f4bb0b343b95e16023c0807eb2a15106a6eb12dc76683e69dda3363148c5d7dd9713af6f87a09410ea8f76b6b78a114429bc85f784812fca31acb0309552cc188c6e9697093cf404c6f0f4abe8a1608673fdfa5eb78f65fc1d49cdec4094b1bd234a46e0ec62a4b6d31b829611540127876bff4c173de058cf61004b014a7bdf793dfd6b63c507d2b23e0f56bc2fe6baf637cee40d18992295d848ef498f8a161bd87e60c91f97a91e9ef3f6d97f2b2d2104ba6fddd6c680706273dae87e6eec1af2a45984985069e809e8de32c12889299a32d40f38774599ac3324b7cb0a4ea632c5f910ad87f5adbfa5c3bb20498279fd53c1c267fe0a84773085da266b253cd853df7e963558cb06880780973423c564cd0bcd6b93334c195953d7cd899f8a547d1a1a0a8deff1381b4321574728cf71b96ff209e899daa8f13f41b230e17bffdfdd2a8943aa5d21e5f36e1da07edd6cee92dc48b5b2a7580146a9baf713950ce676255a89e34f8787547d62868db14ba46594da310d7e2d9e7c7dbe17dbd71eb47c56c5721dc96d696470573794809411cdfa276b059d0007c25d74b2a67d38246de11ef46dfe2670926fe4b63656231bc7268bba23f378e84a428c3cbf45cc539678fd467cd33dd0757cfa024e54da1ff54ce820229b778b184be1fa2e8468cc19955940735eaaa884022f6418b0b1f26bccf169f1bcac7d82a35ab6ef847e1dba537dcaff57250a8d1c71facb134cd06b01c45319132745dc488888a1d7761b8486a37e6988a1120bcc1682dbfc89143fc35b46935d8acf6ef3c42f0f4bf679dfd6ff44b6ada26b01a9f89f374c7d2ee48dfe1a410e897cdfd97f626d2668502814400793b3b07c8720bbddc59cb0f9de964ae075b4af3dd4baf6d0e4f94f294e8109d6577c4f8a9c7a5f7d694bf88f1a5ea7eba0a66da6c770c08b3abffc534df219dc3e3323b022e96cc86002b189181a1d2b527d27950b7f425a47da4013778bd00b71105922204921e9dc692c233f7baa04", "signed": "a462a9baa56dc0f7a71bf87b95f48d642022d9d1733ee3683777a3782228ac85fcd83026be4ca97a345b084f50874e9124e16ba17dead4ad85c0e56f16ef1804e26e8dcb44e641fc20080e95474bd39d716c5afe5a1ffb056d1eaab0c49f8570717db6437a03228a9ad9f4bb0b343b95e16023c0807eb2a15106a6eb12dc76683e69dda3363148c5d7dd9713af6f87a09410ea8f76b6b78a114429bc85f784812fca31acb0309552cc188c6e9697093cf404c6f0f4abe8a1608673fdfa5eb78f65fc1d49cdec4094b1bd234a46e0ec62a4b6d31b829611540127876bff4c173de058cf61004b014a7bdf793dfd6b63c507d2b23e0f56bc2fe6baf637cee40d18992295d848ef498f8a161bd87e60c91f97a91e9ef3f6d97f2b2d2104ba6fddd6c680706273dae87e6eec1af2a45984985069e809e8de32c12889299a32d40f38774599ac3324b7cb0a4ea632c5f910ad87f5adbfa5c3bb20498279fd53c1c267fe0a84773085da266b253cd853df7e963558cb06880780973423c564cd0bcd6b93334c195953d7cd899f8a547d1a1a0a8deff1381b4321574728cf71b96ff209e899daa8f13f41b230e17bffdfdd2a8943aa5d21e5f36e1da07edd6cee92dc48b5b2a7580146a9baf713950ce676255a89e34f8787547d62868db14ba46594da310d7e2d9e7c7dbe17dbd71eb47c56c5721dc96d696470573794809411cdfa276b059d0007c25d74b2a67d38246de11ef46dfe2670926fe4b63656231bc7268bba23f378e84a428c3cbf45cc539678fd467cd33dd0757cfa024e54da1ff54ce820229b778b184be1fa2e8468cc19955940735eaaa884022f6418b0b1f26bccf169f1bcac7d82a35ab6ef847e1dba537dcaff57250a8d1c71facb134cd06b01c45319132745dc488888a1d7761b8486a37e6988a1120bcc1682dbfc89143fc35b46935d8acf6ef3c42f0f4bf679dfd6ff44b6ada26b01a9f89f374c7d2ee48dfe1a410e897cdfd97f626d2668502814400793b3b07c8720bbddc59cb0f9de964ae075b4af3dd4baf6d0e4f94f294e8109d6577c4f8a9c7a5f7d694bf88f1a5ea7eba0a66da6c770c08b3abffc534df219dc3e3323b022e96cc86002b189181a1d2b527d27950b7f425a47da4013778bd00b71105922204921e9dc692c233f7baa04", "signature": "a462a9baa56dc0f7a71bf87b95f48d642022d9d1733ee3683777a3782228ac85fcd83026be4ca97a345b084f50874e9124e16ba17dead4ad85c0e56f16ef1804" }, { "secret_key": "ef64e17a53f7fbcafe3ea4687684a0dadb18d03735a40a53b3edb04907ee6162", "public_key": "9186e6bc142961c4d3eb369e9e11578292de5b6af534d423ff240fa26e21a781", "message": "6882456cc3d1ad0daa9b88eff0969f15e97b48d051967e1390847225f26ac25559f0246bf7d683fa28ecedad21491d77bd2696fa835d0fd119884fece9d803691b2fd3de17ee087c74007a7de9bc6534bbfe95fd32e97c375f4cb65731aa1e8346bea21be9f2c3dc874af0431906ccbc2c600127f4d3b069eb091d165ec453e672e93cae8b72f03371d8b8a8244ec4ec2e09f31df40206a2b1c84caa1b993cc675fde1c79bd4a7d15974fa29ce2e892c2899cf482c3d9663f6d2a79784f41c1f5866d37c8546f357d564d3c4218dfa6d20b6c282b400fedde52439d472212c5767a35da5201032da8730968b0720e8a604de6c1baa3f4e896ac2614fb1ab6e3f6cf387a8eb2ff8a92147ab349238432e509d829cb75b2c1765c51221848e25afff5f16e4dd0cd5c9f713c4aaab2ce836f8494506b5309dc2b0ae745bb9c4798098fb8641d520a08b02f75ad80dbc2ce29e890b4d72a3ffb2a1cbd538e1229f579c29ae66bca85e0fa08c8647a1abcfe8a49f5e508d4d2495556623d926ce49efa4350aaaab5cec2cd885be1d63475e3bab7c7cdc8d656173b8d45602f4b3d281241d17190327b24c3836b19311a193af86a6768f04852ab06e67c8ead591cdcbf3789c613209cfe03f58c0305f63203b487f7c5fc098877ec98a689c9d35af81e84078d66fe9e4eccbb1cc6c71991c03017bb811f41f07de68fad194146061324f3d0ef217a54cf38f7a625a38869f67d0b7431df937cde349c175ce8b26ac88d39a43e279b018764efa4dd627cbf591f6209c4a5bb19ebfa7c7135592d02e501cae5e6b31c90e72faab47f7dced2c48adf88443b3ede60cefb0d6379d6922ec437f086bad6217d4d4ffef18e22523664bf4e9ca1e65a28c2a7a60c5f6bc906b737c29935f9097463048575befd1a2549dc474b13e68aeecf166043e075aac515540f831b43066cef932e63dcd5b37b61578c35b09e45cc2a8def57103edfc5f649831a8961fe4a4b3721f1d6df4ea9f033881b474300e0f12cb9cd3babdcffbb918dd9bb0e2f5b21033e43023a0d2e66da3ab0f07ee988b16889ca5d51abdc05fde", "signed": "f58f396ba27e067a5fe003e385582ae3490e05957715d704da0da63a6419d2e4f6dc66b7e88e428a6f21b9ea202299a3c36b242b0ea06476ff12d0b6580c04036882456cc3d1ad0daa9b88eff0969f15e97b48d051967e1390847225f26ac25559f0246bf7d683fa28ecedad21491d77bd2696fa835d0fd119884fece9d803691b2fd3de17ee087c74007a7de9bc6534bbfe95fd32e97c375f4cb65731aa1e8346bea21be9f2c3dc874af0431906ccbc2c600127f4d3b069eb091d165ec453e672e93cae8b72f03371d8b8a8244ec4ec2e09f31df40206a2b1c84caa1b993cc675fde1c79bd4a7d15974fa29ce2e892c2899cf482c3d9663f6d2a79784f41c1f5866d37c8546f357d564d3c4218dfa6d20b6c282b400fedde52439d472212c5767a35da5201032da8730968b0720e8a604de6c1baa3f4e896ac2614fb1ab6e3f6cf387a8eb2ff8a92147ab349238432e509d829cb75b2c1765c51221848e25afff5f16e4dd0cd5c9f713c4aaab2ce836f8494506b5309dc2b0ae745bb9c4798098fb8641d520a08b02f75ad80dbc2ce29e890b4d72a3ffb2a1cbd538e1229f579c29ae66bca85e0fa08c8647a1abcfe8a49f5e508d4d2495556623d926ce49efa4350aaaab5cec2cd885be1d63475e3bab7c7cdc8d656173b8d45602f4b3d281241d17190327b24c3836b19311a193af86a6768f04852ab06e67c8ead591cdcbf3789c613209cfe03f58c0305f63203b487f7c5fc098877ec98a689c9d35af81e84078d66fe9e4eccbb1cc6c71991c03017bb811f41f07de68fad194146061324f3d0ef217a54cf38f7a625a38869f67d0b7431df937cde349c175ce8b26ac88d39a43e279b018764efa4dd627cbf591f6209c4a5bb19ebfa7c7135592d02e501cae5e6b31c90e72faab47f7dced2c48adf88443b3ede60cefb0d6379d6922ec437f086bad6217d4d4ffef18e22523664bf4e9ca1e65a28c2a7a60c5f6bc906b737c29935f9097463048575befd1a2549dc474b13e68aeecf166043e075aac515540f831b43066cef932e63dcd5b37b61578c35b09e45cc2a8def57103edfc5f649831a8961fe4a4b3721f1d6df4ea9f033881b474300e0f12cb9cd3babdcffbb918dd9bb0e2f5b21033e43023a0d2e66da3ab0f07ee988b16889ca5d51abdc05fde", "signature": "f58f396ba27e067a5fe003e385582ae3490e05957715d704da0da63a6419d2e4f6dc66b7e88e428a6f21b9ea202299a3c36b242b0ea06476ff12d0b6580c0403" }, { "secret_key": "3347dc47bb3d2e5d0286ac06a54fd921c9e96b6899862a54e5cc8115d3d0ba99", "public_key": "d00b645d86dbb7e524757ec778c62b7e60d0b6576883338c9b67c2c7e4509268", "message": "e2f48edf9d643320ab991c8ff9f6aa75fe066e7d88ff1e472a5ac9c518de1fb62983b1007f6422809117bdbe8a0e5787f66bb057d27f129a200b40576e1719cf9e98fcb72af94bb82ee70f3719a2e2cd9b64777cea5e446459874b74bfbf56b2d2526400592a9b45a5cb798092b60a81b71d82f0685fae7f810b52d226adac7ad8a9183f09febee9d25046c0fe306681ace2bff91b3482b0bc30b2021c4341645d675134fe3081c51e5c59e40b375a1434f63b426e30530da9353bb2a9423220434ae59d7b6fdc143f4982eb8cfa7751b75bf3e9c913c73b760b07d395310c59f3b77ebf12ed2d7b03590d3317af17df421e78b0849fd56d945c5696a040fcaa78a93ecc16d5ac3445063611f3013e9a3ae2e1c270dd01a8ffe3e6126bc1e4c95f6547a8651f26b6404e39ee4ce7618918f3f937a52573ec277b771e91ad096fa15c7a340a809b470318a4636423eb4888a12160c4663fce2996d638896c839b2c7ad4b3a9b2e6cb71e912fe39b843c6e0832eca22de938b50ae863e48582c10851232f75e5225b8896b5a470f818b6fa39eb7bb590357678612d25fe1a40ea1b9d71d880909c1bd4ad176cc0ceffdcee7099e7882a7c907e4bec79830c6771acb89944bd54a5165b31870916921b198acd4432e7eed8ce1deb345b107eda760266fcbda3ba5229400a30360a4645ca8db38c3d5f4a8def157bbdbbf2c1fa1dc6b0514a4f5a0364f928381b40f95579a26467f2282a8a255758402ac9ca80e89b9cc6860a34bb3f90c3237657c2129ea48c852b92569e81106bce461e2024454821a917592d1991b5b69f27bbe019977528a2fc01192c56b4aea873cf8c58dfd7cb4b0e917e87a8704c992820f98d77404d3f1d2050c6743f6e93cdb51a61aa6f45b351b26461d1329f3151272ac396234d0d67c178acf91fc510d86429c69a87fdf101155da8d94de6722238a6fb17016862b11d502c667ee9ca0aabe1c20b97789f1867add78b8b87e9ab51934c0b4a16c2cbc4d2efedb79c05b23e0cf789201ac75fe076d315fcbac20ba0d31e4dc616927d6eab1b1c87a1c9c778e4bd285295874", "signed": "9ab4299b17729344750b69dc6037368c98f47be627fbd9adfd8db39f9964ddb7bc92d674c7be740756396baaeeacbf74947b6191c6ed1f5d32a63df36d542601e2f48edf9d643320ab991c8ff9f6aa75fe066e7d88ff1e472a5ac9c518de1fb62983b1007f6422809117bdbe8a0e5787f66bb057d27f129a200b40576e1719cf9e98fcb72af94bb82ee70f3719a2e2cd9b64777cea5e446459874b74bfbf56b2d2526400592a9b45a5cb798092b60a81b71d82f0685fae7f810b52d226adac7ad8a9183f09febee9d25046c0fe306681ace2bff91b3482b0bc30b2021c4341645d675134fe3081c51e5c59e40b375a1434f63b426e30530da9353bb2a9423220434ae59d7b6fdc143f4982eb8cfa7751b75bf3e9c913c73b760b07d395310c59f3b77ebf12ed2d7b03590d3317af17df421e78b0849fd56d945c5696a040fcaa78a93ecc16d5ac3445063611f3013e9a3ae2e1c270dd01a8ffe3e6126bc1e4c95f6547a8651f26b6404e39ee4ce7618918f3f937a52573ec277b771e91ad096fa15c7a340a809b470318a4636423eb4888a12160c4663fce2996d638896c839b2c7ad4b3a9b2e6cb71e912fe39b843c6e0832eca22de938b50ae863e48582c10851232f75e5225b8896b5a470f818b6fa39eb7bb590357678612d25fe1a40ea1b9d71d880909c1bd4ad176cc0ceffdcee7099e7882a7c907e4bec79830c6771acb89944bd54a5165b31870916921b198acd4432e7eed8ce1deb345b107eda760266fcbda3ba5229400a30360a4645ca8db38c3d5f4a8def157bbdbbf2c1fa1dc6b0514a4f5a0364f928381b40f95579a26467f2282a8a255758402ac9ca80e89b9cc6860a34bb3f90c3237657c2129ea48c852b92569e81106bce461e2024454821a917592d1991b5b69f27bbe019977528a2fc01192c56b4aea873cf8c58dfd7cb4b0e917e87a8704c992820f98d77404d3f1d2050c6743f6e93cdb51a61aa6f45b351b26461d1329f3151272ac396234d0d67c178acf91fc510d86429c69a87fdf101155da8d94de6722238a6fb17016862b11d502c667ee9ca0aabe1c20b97789f1867add78b8b87e9ab51934c0b4a16c2cbc4d2efedb79c05b23e0cf789201ac75fe076d315fcbac20ba0d31e4dc616927d6eab1b1c87a1c9c778e4bd285295874", "signature": "9ab4299b17729344750b69dc6037368c98f47be627fbd9adfd8db39f9964ddb7bc92d674c7be740756396baaeeacbf74947b6191c6ed1f5d32a63df36d542601" }, { "secret_key": "ff15d6e74e28e41d05a8663a702f038d5b8578c4275e772b73ba440bc5f55a06", "public_key": "4747e2e9b82637b3844b85f75b59f7136b7fdb1a62e7b70d6aac17b3c5752f2f", "message": "ce7bf972844f5184ae8eac87b12be9202c7239961dc23cd41ff55b9bfaac0cc06f3f1decfa9571095c8e82b4eb6f8a1c52c8d3deaa61a9aa94e2ecd9ab5b8063f2da6d8015df0a5144fa3a48e305ad9f41eaa11c4d74854374ecbf382e3002579a9a249efa1e1ca04d338447d7f2206703e6cabf5bbd332b42573bcbd3b6f71b7c3bf73d4c774aa01e866841432829d07f96e1f61a20216d968c90e3ed11f663f7d6271622fefcf3ab68f344328515d5cce2ce85e8bf3d1d09043692e1fb8bbddc07a4ab0a3eef8ca6a420e74bff8d3d715596aa821682954fe89629ae27c1bb03b6aa09f36a39a3e37ba98132f4e23888f9f335e7beaa2cb2727acc3d2777309b85295232e54da88ebb6f1053d6de79ac6609852eb93a0a35bc1a7bdc22d628bc86124d696c3f9828b6f8b9aade1a65216177486c252a4b42d90a4e0fea2093489e244d808ef7021a97d5608c0ae1d663c775e8bb9e9a7315f1feb6d129b5a541ea5929a2c633b6d8c3c45441717946cf873e9b4c512180135d54f053abe44c6df39b7b062ef7240162cbd0b851afe5f91536a9499418e8bff4996473d805ebc1ae48da2d0b129e8e8252f1d53c328f32db252de3befbe5f31280121143a8004a4cae631c827409e520e394cd0f8950cd4c3cf3f3dbd4952a4dfe69875f565389061ad0a0cee6b6aff09ceca26d990e896a2aba9f3b26015b63423768684c03ed0de6cee7ac5bbdf9f485c2275cd12aefa8f907b851a02d51c34f121b77f3a56a9ebd1d65ffe89bee381ff2a7480e8968cff25ac8d04e149a9d5027d14b88f8ae2604d2ac22ac67d13e90ada620c2046d28299384d0959fb76e22588796ce427aaeaf4e2a8aaec3e87f84ccd082524c96d766eec66f0bec3e799558145f09d330134f1c63f37053cd4bdc1c37fde97291857551f50ac8e15f06ac1c73daa1e8c5bc9277e3d69cb44a3237ec57dbbccfdf6685ada20b74a1bc6b74ab05690eaf9bd0c4be17042f5cd320cdd613dc08d29af346aa4191ce0b4f85bb2ad7f3bac738a9377ec6b84062cc70fca9ecfbe1f57fe5b2ce7a4f739c81cabcde046451dd61ce1dbc", "signed": "42c1295fafe26de3ea34926bf1ef80bcafe47b21b90eaed19635ed7538d767cbf3a1e5dedaab82adf75120373e923202f7fda0826784292eba8b238b6cb88304ce7bf972844f5184ae8eac87b12be9202c7239961dc23cd41ff55b9bfaac0cc06f3f1decfa9571095c8e82b4eb6f8a1c52c8d3deaa61a9aa94e2ecd9ab5b8063f2da6d8015df0a5144fa3a48e305ad9f41eaa11c4d74854374ecbf382e3002579a9a249efa1e1ca04d338447d7f2206703e6cabf5bbd332b42573bcbd3b6f71b7c3bf73d4c774aa01e866841432829d07f96e1f61a20216d968c90e3ed11f663f7d6271622fefcf3ab68f344328515d5cce2ce85e8bf3d1d09043692e1fb8bbddc07a4ab0a3eef8ca6a420e74bff8d3d715596aa821682954fe89629ae27c1bb03b6aa09f36a39a3e37ba98132f4e23888f9f335e7beaa2cb2727acc3d2777309b85295232e54da88ebb6f1053d6de79ac6609852eb93a0a35bc1a7bdc22d628bc86124d696c3f9828b6f8b9aade1a65216177486c252a4b42d90a4e0fea2093489e244d808ef7021a97d5608c0ae1d663c775e8bb9e9a7315f1feb6d129b5a541ea5929a2c633b6d8c3c45441717946cf873e9b4c512180135d54f053abe44c6df39b7b062ef7240162cbd0b851afe5f91536a9499418e8bff4996473d805ebc1ae48da2d0b129e8e8252f1d53c328f32db252de3befbe5f31280121143a8004a4cae631c827409e520e394cd0f8950cd4c3cf3f3dbd4952a4dfe69875f565389061ad0a0cee6b6aff09ceca26d990e896a2aba9f3b26015b63423768684c03ed0de6cee7ac5bbdf9f485c2275cd12aefa8f907b851a02d51c34f121b77f3a56a9ebd1d65ffe89bee381ff2a7480e8968cff25ac8d04e149a9d5027d14b88f8ae2604d2ac22ac67d13e90ada620c2046d28299384d0959fb76e22588796ce427aaeaf4e2a8aaec3e87f84ccd082524c96d766eec66f0bec3e799558145f09d330134f1c63f37053cd4bdc1c37fde97291857551f50ac8e15f06ac1c73daa1e8c5bc9277e3d69cb44a3237ec57dbbccfdf6685ada20b74a1bc6b74ab05690eaf9bd0c4be17042f5cd320cdd613dc08d29af346aa4191ce0b4f85bb2ad7f3bac738a9377ec6b84062cc70fca9ecfbe1f57fe5b2ce7a4f739c81cabcde046451dd61ce1dbc", "signature": "42c1295fafe26de3ea34926bf1ef80bcafe47b21b90eaed19635ed7538d767cbf3a1e5dedaab82adf75120373e923202f7fda0826784292eba8b238b6cb88304" }, { "secret_key": "1ed37b610b8b35417d04e59aaadac688ff81f1e507c89b4f400160941908cb8c", "public_key": "48e8cbeb1240bdebf0a2d92953aa89b282c49aab2c38ae69044c51515c3300d5", "message": "1e6767df97db1cfb4088da7b200d9f59ec8dd4533b83be309f37650031065727cd5202cef48426a5f3a11d50b381f8bc22ff101827359f2d0a610a4f755464a0c891cbd98d2dcb41d9779d288fcf1fea62e52163ae67e90428b86398efa218f1b982081fc513305fd3e8ece7f9acb0e10e001d2ed299a48a80870b3d5d8ab9006309b31591caf0583380073a2db61f45254ab965b5e4672c4bfaa86e336c49278552729fb2da76ffe502ec61e1696c7fc9ef19f7cc2a2775b29700cb384294063a17fed4fc635bc13282a90dad0c00aadbcd569f156a854f8ba9e7d607d20f2e9e5337981161d804644668d064fa63dceb9f5801353d0ab9f41d1d8bdc76c13ab2f023ea01adbc4c8168d939e98f64fd8919384abe76709263c0cd7c3efadc2801cc4abd80a09bb3ed6bb78cd620969cd35c6a3a5d01485ead4c45ebb6ac6a83212a7c76675427b21da8a7a5047b30a6100cda02476c186e6ce40d2768a942c9f87305e9d363b524c0094a9e2e29f585894c0adbfcd60690fc7fb0a9c717cf43b484fd45151b1304169c26921db2276ec05ad22ad166854fd2f94085778c470dc452e5cfa4aee04facb770526e1f248d3d15c27280fdfa1fd2c1044bcbc881c3d99815c97fbea46110be02dab774f3a610e5802abf36a49875c682638e0ae4cc8277c5e9aa7307445e6bbcbe549eec2a45b1597f7447107b62e2cee0a5fc51beae3e1fe9befb1885d9b30f9b4f1f56206dee0d67779c57f484c8c3c899a515a9d1c10f6059840c1c73d3f05bcb88590c52f7da391838dc2e73228f0981c289a4c27f0c757faf7b3b89146e33dafa490d9e0f9275b0cfa6a7710a73831459595bf732112b62fc864ca4c829784a3f16eec4e18f936918a7b9891669e933223f745fda562bc0a4e61e3d14ea45dfc327e2fc0cdfe6f2f97546c90fce82f522291480111a1e6b9388272c0be28d20ed84bb84d49bc199cd599948b8f2039d07827a3f4075d3a67ee572a01379a36213fe116e768b4114e8a4b3134c3818960772d727b0ca6f7c997ca99843b7eb02ffc013971cbe0e6e60d49773f1e8c0b30606131cb10c3e04", "signed": "8608815e10590d5504874d8999fd6f09626f950be20c912c27c9de6e79b0faf777a533bd5bb667ab513a49458ecd6787a09ec0df6c9c9d6333c5e3ae61ea370a1e6767df97db1cfb4088da7b200d9f59ec8dd4533b83be309f37650031065727cd5202cef48426a5f3a11d50b381f8bc22ff101827359f2d0a610a4f755464a0c891cbd98d2dcb41d9779d288fcf1fea62e52163ae67e90428b86398efa218f1b982081fc513305fd3e8ece7f9acb0e10e001d2ed299a48a80870b3d5d8ab9006309b31591caf0583380073a2db61f45254ab965b5e4672c4bfaa86e336c49278552729fb2da76ffe502ec61e1696c7fc9ef19f7cc2a2775b29700cb384294063a17fed4fc635bc13282a90dad0c00aadbcd569f156a854f8ba9e7d607d20f2e9e5337981161d804644668d064fa63dceb9f5801353d0ab9f41d1d8bdc76c13ab2f023ea01adbc4c8168d939e98f64fd8919384abe76709263c0cd7c3efadc2801cc4abd80a09bb3ed6bb78cd620969cd35c6a3a5d01485ead4c45ebb6ac6a83212a7c76675427b21da8a7a5047b30a6100cda02476c186e6ce40d2768a942c9f87305e9d363b524c0094a9e2e29f585894c0adbfcd60690fc7fb0a9c717cf43b484fd45151b1304169c26921db2276ec05ad22ad166854fd2f94085778c470dc452e5cfa4aee04facb770526e1f248d3d15c27280fdfa1fd2c1044bcbc881c3d99815c97fbea46110be02dab774f3a610e5802abf36a49875c682638e0ae4cc8277c5e9aa7307445e6bbcbe549eec2a45b1597f7447107b62e2cee0a5fc51beae3e1fe9befb1885d9b30f9b4f1f56206dee0d67779c57f484c8c3c899a515a9d1c10f6059840c1c73d3f05bcb88590c52f7da391838dc2e73228f0981c289a4c27f0c757faf7b3b89146e33dafa490d9e0f9275b0cfa6a7710a73831459595bf732112b62fc864ca4c829784a3f16eec4e18f936918a7b9891669e933223f745fda562bc0a4e61e3d14ea45dfc327e2fc0cdfe6f2f97546c90fce82f522291480111a1e6b9388272c0be28d20ed84bb84d49bc199cd599948b8f2039d07827a3f4075d3a67ee572a01379a36213fe116e768b4114e8a4b3134c3818960772d727b0ca6f7c997ca99843b7eb02ffc013971cbe0e6e60d49773f1e8c0b30606131cb10c3e04", "signature": "8608815e10590d5504874d8999fd6f09626f950be20c912c27c9de6e79b0faf777a533bd5bb667ab513a49458ecd6787a09ec0df6c9c9d6333c5e3ae61ea370a" }, { "secret_key": "84364478ec94bd25c4bdb82d296229e6dace2b1359d6d21be2b3afcd7bda19c7", "public_key": "a1814f8ce0fc3b236093a50f468c1316211fe6c52e2345d9f0766b3688a03cad", "message": "7bb7293de55f058fb2ec22b687260543dcaa90f140b9f45eddd4bc22e40977e00ed33cd1ef1bba13c1d0990859005569a80767e4864a2cd288c81393e04ad971782e2bc493108cbe80dacf0b7b9cd534988407a4f9327ec8e9c4043284ef6ee5a26a5b417765d3eabb48a007e7c7f32987d70a139ac41678cdf7a55cb80cf9db5eaa45f3de0fbfbadffc40996370e48b1ff5edd97940e750792164836a4a5ac2e3ff53e48a1e556db9ad0c5c0b944f4aee519a2b0a88bb1c1fc7454524cd57aa5350986243d34fc58e24e819ec0b8545d8dfcf6b20311441d3a35d3e71b3e3ecd7884dda8433a405e3d9969000c820a89b95d197841d98ae734a2e81daf6a7dcf56cb2fc26f2165a5f42b86c7e9e5b11161700a1ab9831f3fae58e14208be1bf33b58ecce81b0c6b7e02f88adf9ab030263e2cc9b6e33ebca3f495492e32bfe372537de6c6b87644828f74942a02b007f14c3fc5dbde76333d36d07631b7a9924f717550040697923fa7b9546bfb0217024ea3f252b515b5d64a62c48e027cef6750beda49a02447039b250a0bda07dc062491a662e26874c8d00f80e6cfc8b30f2c3bf7720b57f2615fc478fefaa6d31705b43c5a54f758666b302a8d34953131941b7957730476794d0bd9d2dfa72fd203f22df5ec6bbaace8b9394bebdaeaa561461011b4fca6185c9a38283f5403fdac326d1f734c6a5ded6724d9f384aebd6cabfcbec12abab9820d080732515e0500cf5d3e2f9ef80a4d7646a7da9eff410f507c69873b32d540ec32b283ef3179a4c632b366576dff058faf8c8c70bc69be808982ec1497ae8911b00165a66695f4d3b987e7390b5cf878e35e676541285e4e13dfaeb2f368cb511b778b106a428778a1b8f2a7d2e093519bc9b5188e38c6793e96bd0d30e2a3db9ee1468c3dc87cc365c810f9dbdf01a4b51421f6fc8dfda3a16e2da7ca7159b686a5e167338937882ff715d3e750d958fc9e4b1f0553129299aa8430183e506cd7f2b279076e0e1cca9749cf123ce507fe07ddbbc4dcca6cdb9ef1b833f61d4bff00bec012158f432ceb75b4f2edb1bb84e5ebb9259e09f9625ce3", "signed": "b4c2321ade3c19ed4ed4c639d5a4d6f2be8e2fb13bb7bd625ad6dc87e2c20f93ad6be7b7e42711a878db9d76054bfd7bc25e3774a93da1543c9b4f6633b0be097bb7293de55f058fb2ec22b687260543dcaa90f140b9f45eddd4bc22e40977e00ed33cd1ef1bba13c1d0990859005569a80767e4864a2cd288c81393e04ad971782e2bc493108cbe80dacf0b7b9cd534988407a4f9327ec8e9c4043284ef6ee5a26a5b417765d3eabb48a007e7c7f32987d70a139ac41678cdf7a55cb80cf9db5eaa45f3de0fbfbadffc40996370e48b1ff5edd97940e750792164836a4a5ac2e3ff53e48a1e556db9ad0c5c0b944f4aee519a2b0a88bb1c1fc7454524cd57aa5350986243d34fc58e24e819ec0b8545d8dfcf6b20311441d3a35d3e71b3e3ecd7884dda8433a405e3d9969000c820a89b95d197841d98ae734a2e81daf6a7dcf56cb2fc26f2165a5f42b86c7e9e5b11161700a1ab9831f3fae58e14208be1bf33b58ecce81b0c6b7e02f88adf9ab030263e2cc9b6e33ebca3f495492e32bfe372537de6c6b87644828f74942a02b007f14c3fc5dbde76333d36d07631b7a9924f717550040697923fa7b9546bfb0217024ea3f252b515b5d64a62c48e027cef6750beda49a02447039b250a0bda07dc062491a662e26874c8d00f80e6cfc8b30f2c3bf7720b57f2615fc478fefaa6d31705b43c5a54f758666b302a8d34953131941b7957730476794d0bd9d2dfa72fd203f22df5ec6bbaace8b9394bebdaeaa561461011b4fca6185c9a38283f5403fdac326d1f734c6a5ded6724d9f384aebd6cabfcbec12abab9820d080732515e0500cf5d3e2f9ef80a4d7646a7da9eff410f507c69873b32d540ec32b283ef3179a4c632b366576dff058faf8c8c70bc69be808982ec1497ae8911b00165a66695f4d3b987e7390b5cf878e35e676541285e4e13dfaeb2f368cb511b778b106a428778a1b8f2a7d2e093519bc9b5188e38c6793e96bd0d30e2a3db9ee1468c3dc87cc365c810f9dbdf01a4b51421f6fc8dfda3a16e2da7ca7159b686a5e167338937882ff715d3e750d958fc9e4b1f0553129299aa8430183e506cd7f2b279076e0e1cca9749cf123ce507fe07ddbbc4dcca6cdb9ef1b833f61d4bff00bec012158f432ceb75b4f2edb1bb84e5ebb9259e09f9625ce3", "signature": "b4c2321ade3c19ed4ed4c639d5a4d6f2be8e2fb13bb7bd625ad6dc87e2c20f93ad6be7b7e42711a878db9d76054bfd7bc25e3774a93da1543c9b4f6633b0be09" }, { "secret_key": "00db37ad2a195f08a08440d059259e539feb40b474928255e7c94ebc3b05038c", "public_key": "04f88bf639e0f71a57d0d0afff5fe97dde3809ff28ec68eb6fc423f4faff4390", "message": "5a94f729d30dd8aae2a5c8c28547bf4506295dc61bfead9727746082d43b0f8114c8c18c5edaf2fec7cae819356338f0bf115a17b038acfd7c96ba6262cabd5710fc0efb43d13df4065becbf1b9e279c03ec9bbfed54d9a13fe06a55a3bd05c807858b41e18dbde13b0907d4034132262d9c2f4d2d376e1609ad280de20ba709844dbd12950257f1b07ef8cc3337c01a702693fb4d92d047e698c3a6dd46c4a92a10d4c780e52e5025e09d56535d7eeb9fe7f033e6e9260a68f9d54b6f37cc069656e3bcee06922b349681a8e7751cdecbe1ecb663fbc6f7c861f853dc310f33defa98ee343a68632ec22cafecb7f3212f81e70b71843b9fe8c86a68b5c86f0322d348a76da7f1ba0ca3cd7b6fd15ff89292b3f636cd08cf625c74d5102cabb571a3dba86a1c92f41c7203b44942f5a24625ac37d77e49a57f118238699d807c250d5bf46f7a3cec5779a6e5ae1a6ca160cff37fb3b78388fe9c030c40e7154601081a517fc0aa1802cd3b845b946efe94aa8b9e03f68a80ded0dfbfad4daee40fa838c133841ae8a3ce0d79fa8a2b9434bac5e1da6e0c7193e8dea435a03a85f76184f7ebe2aa749be9413104a178689ba6d27e94fccf61eb3aba0e6a5a63af0ca8f05a35cb63705194e44d9293de3929b0d92be6f8e627c350a83fc9000aa95b93820be9795c80b5662cd7b34822328061356dc580578d1a35b10140dcd248e4853104d2c5b2c13ff683dd5c30794be4a76858af1c0d9af347ce1dcd972ee49aac12bbcd899c9329871d3e7a0683d175779afe35f26a2d248fd780ea851dc4ba6d21f8a171aa6cb8697d9d112161540307cd54f931775d70b33d3b6de1091fc1750531c08fa70f7be38aa110d6746bb565db7b470f900850fbbf1c662fd613e4f3a5689549e3107e9b0f17def7a5bd7fd7596c4d04c7f48c779fc35e09335e1df784084e55d8551d1ff49de5b311cd350f347a0bd2863a2a30e6ea183ad2e3eedebc18dd28c6a596e693dc3389f7d90b713e3a85a62516305a70667fc1fb3cb10e8a955750273943c568e10769cef78199df4450dbc490fef1b304b052221b2db9c44fe00345", "signed": "f4d1c80f5e7b91c5c7a82a682d49ba6fb19d400a299748a0c969bb99816998be634e84da78581b06e3470efec39804fed93d29739f0439a8095ac40d9d385e045a94f729d30dd8aae2a5c8c28547bf4506295dc61bfead9727746082d43b0f8114c8c18c5edaf2fec7cae819356338f0bf115a17b038acfd7c96ba6262cabd5710fc0efb43d13df4065becbf1b9e279c03ec9bbfed54d9a13fe06a55a3bd05c807858b41e18dbde13b0907d4034132262d9c2f4d2d376e1609ad280de20ba709844dbd12950257f1b07ef8cc3337c01a702693fb4d92d047e698c3a6dd46c4a92a10d4c780e52e5025e09d56535d7eeb9fe7f033e6e9260a68f9d54b6f37cc069656e3bcee06922b349681a8e7751cdecbe1ecb663fbc6f7c861f853dc310f33defa98ee343a68632ec22cafecb7f3212f81e70b71843b9fe8c86a68b5c86f0322d348a76da7f1ba0ca3cd7b6fd15ff89292b3f636cd08cf625c74d5102cabb571a3dba86a1c92f41c7203b44942f5a24625ac37d77e49a57f118238699d807c250d5bf46f7a3cec5779a6e5ae1a6ca160cff37fb3b78388fe9c030c40e7154601081a517fc0aa1802cd3b845b946efe94aa8b9e03f68a80ded0dfbfad4daee40fa838c133841ae8a3ce0d79fa8a2b9434bac5e1da6e0c7193e8dea435a03a85f76184f7ebe2aa749be9413104a178689ba6d27e94fccf61eb3aba0e6a5a63af0ca8f05a35cb63705194e44d9293de3929b0d92be6f8e627c350a83fc9000aa95b93820be9795c80b5662cd7b34822328061356dc580578d1a35b10140dcd248e4853104d2c5b2c13ff683dd5c30794be4a76858af1c0d9af347ce1dcd972ee49aac12bbcd899c9329871d3e7a0683d175779afe35f26a2d248fd780ea851dc4ba6d21f8a171aa6cb8697d9d112161540307cd54f931775d70b33d3b6de1091fc1750531c08fa70f7be38aa110d6746bb565db7b470f900850fbbf1c662fd613e4f3a5689549e3107e9b0f17def7a5bd7fd7596c4d04c7f48c779fc35e09335e1df784084e55d8551d1ff49de5b311cd350f347a0bd2863a2a30e6ea183ad2e3eedebc18dd28c6a596e693dc3389f7d90b713e3a85a62516305a70667fc1fb3cb10e8a955750273943c568e10769cef78199df4450dbc490fef1b304b052221b2db9c44fe00345", "signature": "f4d1c80f5e7b91c5c7a82a682d49ba6fb19d400a299748a0c969bb99816998be634e84da78581b06e3470efec39804fed93d29739f0439a8095ac40d9d385e04" }, { "secret_key": "6ca1a1482a07f2a6c57f041197b34a5119e68903cf6dfb51711d9550973163c0", "public_key": "8034a55e3b6ed799f49e2e703a81f4ac02573c445d765e3069be42f09cbd18ad", "message": "08fd8487503c3f3296b6f1b64d6e85906fd5986cf9c5d9fa8a59d92f44e6470af34bcdef336ffdc86456ec7a7b5761f1adea027326630e68abc6b8cd5ddf40b641a259ad024321bf3ef98e7632797149c492d53594752c550dfbc4fa6bf47176f423a2705693947aa90d68ddc8efb6cb9dbecafd2830d04fd93b1e9e7c12b93e0d0f3e2634900f25860ddadbaece1780ff2d3f3d9fb838fd0d5d66f8afb305ff1a1aedca2b974b63e43f5b3cc9dfed1bcf11999176ed9585ac829bc6794ef3acd872e8d2e92608b320f894996a562e1eb177e21be57c22c41ec259a3dff9c7c9491db838d76cf9b0383111598e357f44babebf121bdb24ee9d557b7d5af491a0a0365c90361fe4f7e3d13a17da3a39fd43f690dfb0b2d860cab419f775ab7152cdc8f2afdc50e8d5da5da01706eea2a2ffad4babee8b03da336a4d843d9d7e0a93f36a92e6610a368b63133f05a3fdc55e3e1a440b0f87a53364c1d37242c57a109e6df69345b01c21c1089e790a66f4f3380d3b76ffb420dfe1e6200eace579265a427fbd355514ef953e1a6e968e37021b3c6a290dcd0293da6768dad7c66311633051c0accb0b9165464dfddfded23bd13ef908744f9c2111dc153142d2f10534d893fe0b545fec53fdb3b35b518398b02ab21791fa977e30cf4b404e7a299d3787108b836aa0d59c114f1f36719a7acf85ac994d9cb72306f258f78ac0a3b6c05343e0b7a9aa726e52267edf97f4972f7664f43720ad33ce6e615440e36537cbc569bd6ff94ffdaea51e06029dae78c5b915c537caea6f1504147979b8aaae0bcd9618437ebed0b55efaec320e84c75959a37a260a02d4ef1bb62641520f1a03ddea8c4c1de8d7fac58da408b0ab4757a135f1d075c9f7c99fb99db9427ce9b0d626cb1ac189ad8663d7a714fb5cd1585c3bf99a0aa46d763978d0b12d65c438bbb73feaa51ba26a459e7bea25439466c08613e42540c8c6d54367f221fcce0c5eb6af2faa181ea21521809be75649cf8dee7671db7f948f346cbd0302bf9a06eabc72e2e512b3df885f6daa398f93e36dae2d6a04478121f97787d4cedff6db09aaf10f27b1", "signed": "dd9bdbadd9fdc81ce230288c4a068df07e18b4c7cc51c0ca4811dfbd04765c56bc883240e46e3a42c01d8d2424fbc332b7c5a17bceb1f6e8dad0bfe562cad30208fd8487503c3f3296b6f1b64d6e85906fd5986cf9c5d9fa8a59d92f44e6470af34bcdef336ffdc86456ec7a7b5761f1adea027326630e68abc6b8cd5ddf40b641a259ad024321bf3ef98e7632797149c492d53594752c550dfbc4fa6bf47176f423a2705693947aa90d68ddc8efb6cb9dbecafd2830d04fd93b1e9e7c12b93e0d0f3e2634900f25860ddadbaece1780ff2d3f3d9fb838fd0d5d66f8afb305ff1a1aedca2b974b63e43f5b3cc9dfed1bcf11999176ed9585ac829bc6794ef3acd872e8d2e92608b320f894996a562e1eb177e21be57c22c41ec259a3dff9c7c9491db838d76cf9b0383111598e357f44babebf121bdb24ee9d557b7d5af491a0a0365c90361fe4f7e3d13a17da3a39fd43f690dfb0b2d860cab419f775ab7152cdc8f2afdc50e8d5da5da01706eea2a2ffad4babee8b03da336a4d843d9d7e0a93f36a92e6610a368b63133f05a3fdc55e3e1a440b0f87a53364c1d37242c57a109e6df69345b01c21c1089e790a66f4f3380d3b76ffb420dfe1e6200eace579265a427fbd355514ef953e1a6e968e37021b3c6a290dcd0293da6768dad7c66311633051c0accb0b9165464dfddfded23bd13ef908744f9c2111dc153142d2f10534d893fe0b545fec53fdb3b35b518398b02ab21791fa977e30cf4b404e7a299d3787108b836aa0d59c114f1f36719a7acf85ac994d9cb72306f258f78ac0a3b6c05343e0b7a9aa726e52267edf97f4972f7664f43720ad33ce6e615440e36537cbc569bd6ff94ffdaea51e06029dae78c5b915c537caea6f1504147979b8aaae0bcd9618437ebed0b55efaec320e84c75959a37a260a02d4ef1bb62641520f1a03ddea8c4c1de8d7fac58da408b0ab4757a135f1d075c9f7c99fb99db9427ce9b0d626cb1ac189ad8663d7a714fb5cd1585c3bf99a0aa46d763978d0b12d65c438bbb73feaa51ba26a459e7bea25439466c08613e42540c8c6d54367f221fcce0c5eb6af2faa181ea21521809be75649cf8dee7671db7f948f346cbd0302bf9a06eabc72e2e512b3df885f6daa398f93e36dae2d6a04478121f97787d4cedff6db09aaf10f27b1", "signature": "dd9bdbadd9fdc81ce230288c4a068df07e18b4c7cc51c0ca4811dfbd04765c56bc883240e46e3a42c01d8d2424fbc332b7c5a17bceb1f6e8dad0bfe562cad302" }, { "secret_key": "2784df91fea1b2d21d713de2edc6652451a0c15954b8656062ea1dedc2445b2a", "public_key": "9556db5370f8fb3c7478de03d23df1cda96f2740118efdd3d1a9fa4c3bfe8849", "message": "2e3bc54df416741dbe7916ad25f04e48d5a9d77a623e57f9cd61ecb44f09f76833eb2a3e9ab7aa89ff5d2d560c07177d854d7c49cbef492b7f4f7e567de1275124e16ca4a7980162fa0fd162a8e5fd6f35617007034bceec57c8faf7664f4b3baffdea8d8fc2ba22d585e9e2d739f5ffc99b4e0dbe9c3686547ea04815a59c4a25b5f2390668e418ba0fcbdf4c4a51f33905c74fbb830a19f9bc8636dbaaff209995447996d2e5b1c377b4cb87a4e1efe12de34d33599ff397b74017d711edd3e772155be5a4406e74cbe2931ef51359afd51b5b1a7b3ea22ee8eda81476bcc17ea7680f6f3104703b9f2a35cf2627eb741d1a30aa4beef6579ec7d0b07a4ef32abcb4d756970f70a3678e17e6e5731890aebc8c92b956d4b3b5fe2adfd79b211a1883dfc8c9a4b1b9c8c1bb265e1f3dd392445ea59b590a019551f8121849f435b3ac1b29902fc8392554056b93903d5f263b3d540843d6afa75a2ad8304b7690de99a734c3d130b69547b18b09e98cbf252730e4aedb6dc4b58b2243fe55e80939d37b0a59d72226d8a2cc5153095e15994ad62195aa310f2a6426676b661e47b9fcfffa04d6dc625f29f44c7cf620b378a65d238344b380448cd119cc7f373f62cdfad64149906353f3a54107c5dba65e3cc494b0531f4d64749363f230738b2cfeed983520227dd5bc43be59b3268e283216f6e9c75e0c1c71272e54fdb29c7858d287d1efa1917be37c8eeab5e44c3ad7b36e8ac9f66991eb82a5148e5972034ad01c62615a45154579fa50869e7be9876b5656eaad2e43025a62dd134b612d8f4d5ebcf8056e198b713438e8e0e347cafbfcb89e394aa330d4c788d49c658fcfc80b3e0078f0e8e19aa9b8fe8eb0bab93de785d043e0f475aeb60d62e38fb1f8384a00b7a902daee13d2136269e50801b80a65b2f913cfe3ffb365d9aa2fd19372a0b0225695444e4bc54871d108e09c7e1c2b42dcbbacce24ea5bd5bf1fcf4ac697a3fe09a54677b7a8dc8d5eecb86cc792ee9b6fea2de16a473269fdc65dbb73c258c821440407c642f7d3d3f5c708d55332da8343106c19b230a51427f3b771916ae3688b", "signed": "17d171d946de3516158407e132cc1acecaefd6d092112be653999523e20bd495f7b7f600e8d5a671330d32693d6019c08d2d003b176e6319c35394200e027d0e2e3bc54df416741dbe7916ad25f04e48d5a9d77a623e57f9cd61ecb44f09f76833eb2a3e9ab7aa89ff5d2d560c07177d854d7c49cbef492b7f4f7e567de1275124e16ca4a7980162fa0fd162a8e5fd6f35617007034bceec57c8faf7664f4b3baffdea8d8fc2ba22d585e9e2d739f5ffc99b4e0dbe9c3686547ea04815a59c4a25b5f2390668e418ba0fcbdf4c4a51f33905c74fbb830a19f9bc8636dbaaff209995447996d2e5b1c377b4cb87a4e1efe12de34d33599ff397b74017d711edd3e772155be5a4406e74cbe2931ef51359afd51b5b1a7b3ea22ee8eda81476bcc17ea7680f6f3104703b9f2a35cf2627eb741d1a30aa4beef6579ec7d0b07a4ef32abcb4d756970f70a3678e17e6e5731890aebc8c92b956d4b3b5fe2adfd79b211a1883dfc8c9a4b1b9c8c1bb265e1f3dd392445ea59b590a019551f8121849f435b3ac1b29902fc8392554056b93903d5f263b3d540843d6afa75a2ad8304b7690de99a734c3d130b69547b18b09e98cbf252730e4aedb6dc4b58b2243fe55e80939d37b0a59d72226d8a2cc5153095e15994ad62195aa310f2a6426676b661e47b9fcfffa04d6dc625f29f44c7cf620b378a65d238344b380448cd119cc7f373f62cdfad64149906353f3a54107c5dba65e3cc494b0531f4d64749363f230738b2cfeed983520227dd5bc43be59b3268e283216f6e9c75e0c1c71272e54fdb29c7858d287d1efa1917be37c8eeab5e44c3ad7b36e8ac9f66991eb82a5148e5972034ad01c62615a45154579fa50869e7be9876b5656eaad2e43025a62dd134b612d8f4d5ebcf8056e198b713438e8e0e347cafbfcb89e394aa330d4c788d49c658fcfc80b3e0078f0e8e19aa9b8fe8eb0bab93de785d043e0f475aeb60d62e38fb1f8384a00b7a902daee13d2136269e50801b80a65b2f913cfe3ffb365d9aa2fd19372a0b0225695444e4bc54871d108e09c7e1c2b42dcbbacce24ea5bd5bf1fcf4ac697a3fe09a54677b7a8dc8d5eecb86cc792ee9b6fea2de16a473269fdc65dbb73c258c821440407c642f7d3d3f5c708d55332da8343106c19b230a51427f3b771916ae3688b", "signature": "17d171d946de3516158407e132cc1acecaefd6d092112be653999523e20bd495f7b7f600e8d5a671330d32693d6019c08d2d003b176e6319c35394200e027d0e" }, { "secret_key": "4bb79236fada3144b68296499ba44ae534074ca94d4b581e5edcfffe13b3ad19", "public_key": "0a8399f1e5a423dcf7b25b2fb0ac9e1e9548148bea84d021e0428760e05d58bf", "message": "ad81abf6937a7acd7f1837f04d3f10e708c61a5fbedeee4db76e1598570384e6efece97c925d2e5c3488cab10b5b52b8a5486e99d8ffe86c1981a1f1d532dcd4d489e5546d86653298e7a5f96e8144552dda8a18e75b5f7355b13541621106e497e51a56d8659d198fe10037e22128afc2714a2cb5a12cc5db0968a343ef918e8769dd6a3e5b9e32aab66cb0239ebe4c17f18218e252eba6162e977049ebac0b38048b3aafb7d4d72263e9212899a3bfe0a69c99e22ac61c5e9612456303d92458b5c502916c34a8ee5cd9a582a52576b6dc9d7d4c642f212998bf3358d4a8c2ea67686e55d489f6a76e6b070e6e995a745326c9aa63630a0033ad30721aa65fac604a6e58c750721a56ca6760c94134d611fab4d354e4f66a29677b1a666601e9da79f213f582037433c07f94d5f0de6aa9faa0b32f7b023fb9fc135a26f97052ac80b39b306aed13926c285419a29b20e2370d8a095b32258fa9893489ee21089c752ec062e120359e2f3515128254c8098cca65a91a022dd057a2c2a1b6b85d137c3c967dcb70aa17a2ff4b37678b382902f0f931ee743fc398ac1b8c10469867308479e40d7f2f04a4b04c4489158488ddb7bec5a47f20ff356d99a1b3e9d0b7fe9b0ad949f298960efa4d9728f8101cf53da3bffdd9524bf440a58b32738d0b6293e853f466ffd42c5607ac9e353ba03efb578cc9963d8aaa9d2e266d1d2ae9296f30c9ef44ec691030d596a401b6cee72a540ef3c42ec0174266ba5401f354adc8e25404437e888b08286939bede308acd30327ebff06270097cc294f0a0f39f9aa3c66585ca47e60c4b8ea36089eb8a9088bb18b0343135bb6a456d2f6a3bf390723e78b42c037c2de2e1432caad3a594021294d43f5b15a2e819dc748e451de40068c8f032f13b4711377012edcd4f11dec1111b12eb6e1b00633818706d7132d991ce20df3b921db2185ee25bb6f5827576ec01ad890f79793baa358c2bbfb6faad11d8cb0d0d2d2b2981fbf4e372349fc6a01c36077b59325f702b380059a65cf2f5ea98d6bdc8152053b85b28c81e413c4cac7e226c13db3267d21830f0e5431102917005", "signed": "698fab68510db8121a465db77e4f8b586aee895816e63bbf0beb242db4e84c157f4be201ae6564517a870d17f60c858370c01cca17189cb4189e814391d1500dad81abf6937a7acd7f1837f04d3f10e708c61a5fbedeee4db76e1598570384e6efece97c925d2e5c3488cab10b5b52b8a5486e99d8ffe86c1981a1f1d532dcd4d489e5546d86653298e7a5f96e8144552dda8a18e75b5f7355b13541621106e497e51a56d8659d198fe10037e22128afc2714a2cb5a12cc5db0968a343ef918e8769dd6a3e5b9e32aab66cb0239ebe4c17f18218e252eba6162e977049ebac0b38048b3aafb7d4d72263e9212899a3bfe0a69c99e22ac61c5e9612456303d92458b5c502916c34a8ee5cd9a582a52576b6dc9d7d4c642f212998bf3358d4a8c2ea67686e55d489f6a76e6b070e6e995a745326c9aa63630a0033ad30721aa65fac604a6e58c750721a56ca6760c94134d611fab4d354e4f66a29677b1a666601e9da79f213f582037433c07f94d5f0de6aa9faa0b32f7b023fb9fc135a26f97052ac80b39b306aed13926c285419a29b20e2370d8a095b32258fa9893489ee21089c752ec062e120359e2f3515128254c8098cca65a91a022dd057a2c2a1b6b85d137c3c967dcb70aa17a2ff4b37678b382902f0f931ee743fc398ac1b8c10469867308479e40d7f2f04a4b04c4489158488ddb7bec5a47f20ff356d99a1b3e9d0b7fe9b0ad949f298960efa4d9728f8101cf53da3bffdd9524bf440a58b32738d0b6293e853f466ffd42c5607ac9e353ba03efb578cc9963d8aaa9d2e266d1d2ae9296f30c9ef44ec691030d596a401b6cee72a540ef3c42ec0174266ba5401f354adc8e25404437e888b08286939bede308acd30327ebff06270097cc294f0a0f39f9aa3c66585ca47e60c4b8ea36089eb8a9088bb18b0343135bb6a456d2f6a3bf390723e78b42c037c2de2e1432caad3a594021294d43f5b15a2e819dc748e451de40068c8f032f13b4711377012edcd4f11dec1111b12eb6e1b00633818706d7132d991ce20df3b921db2185ee25bb6f5827576ec01ad890f79793baa358c2bbfb6faad11d8cb0d0d2d2b2981fbf4e372349fc6a01c36077b59325f702b380059a65cf2f5ea98d6bdc8152053b85b28c81e413c4cac7e226c13db3267d21830f0e5431102917005", "signature": "698fab68510db8121a465db77e4f8b586aee895816e63bbf0beb242db4e84c157f4be201ae6564517a870d17f60c858370c01cca17189cb4189e814391d1500d" }, { "secret_key": "afd765e6aac0146d4811ef9597bc3f44763f03378b7be033d6e64ca29decaef9", "public_key": "6bb76123d9258922686c53fb6917b9a459cabd30be8c43970d80f5350c2d98ef", "message": "183b1092c7904e47a1420317a25d0f59110aa84d6b3419ad456865c43b29e9d1dacf755d9e5cf94c5591d5d912d05ca9a52d015d6e8f5dc94efdce0d7cf5651203b11e5427a9f679429e00414a48eab13fd8e58b87eba39d1025d6a18b2cdcbe147436dbf38a1ce86413ae318765e1bb1df7e2b3be97e90408b11717cf459bcd0f3cac58b4a0d35bffb533e20df37451c11401ce1dab02055c7e08c5ec46390cd617a6b5f22f651830a1112a06ede4c40ab7957851d6c66f171cd16241590900b852a3d019957be1b7bb7acb8923f2a357c3264456cfca9b429d71fecb7edae39b252b4eb610e8c718835699754b8d4124b492488ede62610cce44b59218663b6c9646a14a8417eddbb6f4fbe5a4bbbb482b37a445e3c16b65a141cd3e12a5b2c0481d614d6d208479b9b209b828854dae0ea1eded506555fe18e1854005cf001a8077083498d27fadf118286b53b8974d69fa2825be8ca3d6036a92ca52f91dde6d5b1ffe2888f4d60779fad1fb41d8c0714049af681b755f2d4204eecd09e077210a48a195e72c80e127c3d4875095c6570a1f78095907528cf7746f31d97111c6f4cb25b3741299a7574822d46b6e79ed23c2fe057b3ac7290b460b166ee90a45562effedcc6ba8f4795f7395818db56b6edd59ca2cc4aea1841fd9565becd6c08104cdee26ba9de200773d091bc77a57c547f1a6ba0a2cd717ab32561d7422ea7235adb0cb36bf5cbdf88fcae06630a15647d9a357b4e0e502d273f3796a51e0bc3fedbf7a1e64aad722aac5fd022fa79d60fc707325f127eb1f03868795ccdc0b4cb26f2023d152153a97a260bff11745d2e2cc0bf860d4a6e358a6d8176d2ac178a9ae1a2dc75e8b490408ff7cdf991329f33cb0c05e1e356925087e0b8d96a52351d1d17768eb134cdb21a1546aaedcc687dfa1b22e92fb5241a83677a153445b77d5e703508e2abc588a9f42e5bc710673e4dd8ad703fab2d7db1eb84226c89d8762a709e3e9138a1fa790f2929bff61bc1ea6e8aa1ad0e3887d70a56d4e6547fc606a50d3be3bd6db03663e00ca9e4f24fe8cbfd7d8c9738d6367554b7b601f74190b5970a398", "signed": "3dc9194d50811419049eaa07b655b7d4064bcb0e7fb5f9e5326b5fc856fc0ab8705973ae1001df55373977dde2d9b81079551414adc71cc852d499b0cf824f07183b1092c7904e47a1420317a25d0f59110aa84d6b3419ad456865c43b29e9d1dacf755d9e5cf94c5591d5d912d05ca9a52d015d6e8f5dc94efdce0d7cf5651203b11e5427a9f679429e00414a48eab13fd8e58b87eba39d1025d6a18b2cdcbe147436dbf38a1ce86413ae318765e1bb1df7e2b3be97e90408b11717cf459bcd0f3cac58b4a0d35bffb533e20df37451c11401ce1dab02055c7e08c5ec46390cd617a6b5f22f651830a1112a06ede4c40ab7957851d6c66f171cd16241590900b852a3d019957be1b7bb7acb8923f2a357c3264456cfca9b429d71fecb7edae39b252b4eb610e8c718835699754b8d4124b492488ede62610cce44b59218663b6c9646a14a8417eddbb6f4fbe5a4bbbb482b37a445e3c16b65a141cd3e12a5b2c0481d614d6d208479b9b209b828854dae0ea1eded506555fe18e1854005cf001a8077083498d27fadf118286b53b8974d69fa2825be8ca3d6036a92ca52f91dde6d5b1ffe2888f4d60779fad1fb41d8c0714049af681b755f2d4204eecd09e077210a48a195e72c80e127c3d4875095c6570a1f78095907528cf7746f31d97111c6f4cb25b3741299a7574822d46b6e79ed23c2fe057b3ac7290b460b166ee90a45562effedcc6ba8f4795f7395818db56b6edd59ca2cc4aea1841fd9565becd6c08104cdee26ba9de200773d091bc77a57c547f1a6ba0a2cd717ab32561d7422ea7235adb0cb36bf5cbdf88fcae06630a15647d9a357b4e0e502d273f3796a51e0bc3fedbf7a1e64aad722aac5fd022fa79d60fc707325f127eb1f03868795ccdc0b4cb26f2023d152153a97a260bff11745d2e2cc0bf860d4a6e358a6d8176d2ac178a9ae1a2dc75e8b490408ff7cdf991329f33cb0c05e1e356925087e0b8d96a52351d1d17768eb134cdb21a1546aaedcc687dfa1b22e92fb5241a83677a153445b77d5e703508e2abc588a9f42e5bc710673e4dd8ad703fab2d7db1eb84226c89d8762a709e3e9138a1fa790f2929bff61bc1ea6e8aa1ad0e3887d70a56d4e6547fc606a50d3be3bd6db03663e00ca9e4f24fe8cbfd7d8c9738d6367554b7b601f74190b5970a398", "signature": "3dc9194d50811419049eaa07b655b7d4064bcb0e7fb5f9e5326b5fc856fc0ab8705973ae1001df55373977dde2d9b81079551414adc71cc852d499b0cf824f07" }, { "secret_key": "eb347145f339edd802785b6fbecd5cb80889ac7ce4ebad2f67076765db939bca", "public_key": "994a456eada03020921c3d109c135eb961fcd4a0a400bafd32ca061bbc862543", "message": "5b8b31baf88483f095b5d02e17d8b7b46cf46460e64c6b02c56d8dafe34823706cb5c15f338ad9b56586a949711aa7312cc93450d2fb9af4613fc30793a631a55c14e53c0cb15f06116399398c8dd61876c62915f9f9e4cdf8f7d89ade129e6dde7d63671a1863f5da8f42ea64c079ecb9a2c1b1dd9adae60e96b9cbbc7624532aa17975eba17a7af02bfb219aac02b3d4306cd38933a85060cd62ab513a3965b09150a488c92bf7cab0482eee56463f0139009b9fbb3ff4ecae211f428b5bfb8876f004983b90c447846ca4b74566e979bc30c95e99faab69a3ebbfe4da6034c82d63e9c5ccaf8486af3b5e0d381422938b0c22f516955bdc36943173f5832708a33cf52d8875d97fde585b4917e4adecdd1e79856762033af22f254b50ce9d0c700e77a731554fa0113a0c666683f3fdb19e3a426302230b63e33a785ef24a9289455b3b8fc618fffef49c2c6e48fd4bb422f504149de2b4c0355c363408e66da81cbb581552a411e364fe3e4ca96d7072ab072e7568c13d35e41c7825a13a5c68fb9fb5988bbbfb9a0b51165764660cdfa2411f3d42165da187c58edef0105a6db177420543e958d5d5e8a371f7987051c4e1786d018eb3d732c210a861acaf671be95bb63fbc88bf8be7be5390939cd9fb2acf3981dda61b787a7bbd78468e1d32ca46af8fb32a18463c180f524be1da910da5508d42a0051741227c9b62de6d19b33c0bd48067b035859ad9bdc2ddd97befca31e65a886cfc753afc4ff2a7212a89d37c046cdf3999c051ff1396bd99cb54945639eb6462db9ece84077b0b3d6b3df3952dd36756c6dab2abc25a51bf32c1e9cdd0a728a7985f7b7e0d9c1a6f66ce1216373d252daf5958f2e8973fd268fad0efe251ce76fe47bd0a4d0c4f1017949d4c2b16717218e149154ed6fbe56f86d82e19ef0a91631912f2a8f3debb00766b6177802f4b2e79f6e7bfa9c62cfa2f75cdb60492630a85c9b43177d2dd9ba8d0548abe24923ae8443eeadcd0f58a7b82dff50d884003889cb560f7ac53e710a75575362464b1aa43d2a9b22f2bd2162d302faa7452344ce7ade9983687b6c68eca47dddb289b15", "signed": "fdbd15e1e6469df720d9552cb5dd177bcbd292fcda83cd93c88d0114912dc8703109bac0d459ace9957df2293ac16d40d514893556853299b97b4fd4137a3d005b8b31baf88483f095b5d02e17d8b7b46cf46460e64c6b02c56d8dafe34823706cb5c15f338ad9b56586a949711aa7312cc93450d2fb9af4613fc30793a631a55c14e53c0cb15f06116399398c8dd61876c62915f9f9e4cdf8f7d89ade129e6dde7d63671a1863f5da8f42ea64c079ecb9a2c1b1dd9adae60e96b9cbbc7624532aa17975eba17a7af02bfb219aac02b3d4306cd38933a85060cd62ab513a3965b09150a488c92bf7cab0482eee56463f0139009b9fbb3ff4ecae211f428b5bfb8876f004983b90c447846ca4b74566e979bc30c95e99faab69a3ebbfe4da6034c82d63e9c5ccaf8486af3b5e0d381422938b0c22f516955bdc36943173f5832708a33cf52d8875d97fde585b4917e4adecdd1e79856762033af22f254b50ce9d0c700e77a731554fa0113a0c666683f3fdb19e3a426302230b63e33a785ef24a9289455b3b8fc618fffef49c2c6e48fd4bb422f504149de2b4c0355c363408e66da81cbb581552a411e364fe3e4ca96d7072ab072e7568c13d35e41c7825a13a5c68fb9fb5988bbbfb9a0b51165764660cdfa2411f3d42165da187c58edef0105a6db177420543e958d5d5e8a371f7987051c4e1786d018eb3d732c210a861acaf671be95bb63fbc88bf8be7be5390939cd9fb2acf3981dda61b787a7bbd78468e1d32ca46af8fb32a18463c180f524be1da910da5508d42a0051741227c9b62de6d19b33c0bd48067b035859ad9bdc2ddd97befca31e65a886cfc753afc4ff2a7212a89d37c046cdf3999c051ff1396bd99cb54945639eb6462db9ece84077b0b3d6b3df3952dd36756c6dab2abc25a51bf32c1e9cdd0a728a7985f7b7e0d9c1a6f66ce1216373d252daf5958f2e8973fd268fad0efe251ce76fe47bd0a4d0c4f1017949d4c2b16717218e149154ed6fbe56f86d82e19ef0a91631912f2a8f3debb00766b6177802f4b2e79f6e7bfa9c62cfa2f75cdb60492630a85c9b43177d2dd9ba8d0548abe24923ae8443eeadcd0f58a7b82dff50d884003889cb560f7ac53e710a75575362464b1aa43d2a9b22f2bd2162d302faa7452344ce7ade9983687b6c68eca47dddb289b15", "signature": "fdbd15e1e6469df720d9552cb5dd177bcbd292fcda83cd93c88d0114912dc8703109bac0d459ace9957df2293ac16d40d514893556853299b97b4fd4137a3d00" }, { "secret_key": "3208837d1554b6511adda09cbae565da78439a472a5d1b107ce0a9b1d7757db7", "public_key": "9b525e35368a921e3a2e9a35a4de9ea4c436caba27123e5c369e2a6cf5c90ab6", "message": "436a3c31763f93d4d546c6d1ecfb7ae45916af754f839dcfe96d6b69c61214d016fc842f56462a3f07f661b2e2505acfaf482a0b0f4f5501eec4b2d2d7d444544de000b990f4363d3f983f5d4e09309752ff579c7320c915951cc3a1e3238c1ba7a19130eabf6a37f5f0bc56e25242f752061f3c63acad992a7501e967deb925b30ed105431e582102fa4f308c2f0683612b56686d52daed6943a7219f3beea2e0a29242e86d5562ffab83b56b263326664e029e961e7017d8e89f5e3e1d10f5932854550ce6e5cd76971fd235cf9c0027d0cfed3315c2cbf18508624d8acf047f9b968f907d9e6f4cfa5e45c80a272c2dbb62c5d4194580dfabedd82cb4d76492344be96ccf5daaf61e6b2b55efdb3f65210a3d6e1f369887ca0ea0d58c3d146ae3cf9b000076884115fa51b5fd66bec0ccbf0d2920196a7d7a38445fbed22dfc7564dc56f60d6e29e592485374c6bd1e5b15931b69ca6ee6b3aa2525c23585f0929f31cbd11fb1a5330216b90ae5a656df7a074cec64e598184f503fb23cc05e65da9ae7e8441f40e2dc26b8b56d2cb523a7c635dc0847d1cd498abf756f5a13ea14f8fab2c410b1a470f49aa8dca4ac0256b11800de0dd0ec42b142c561128d357e783b12f61c668f5e6e06b7b48b7b2254de5bdc1804b723d5fd6a0f4bc7c59e7c5054182613bbd2fa92b4c1da16bc8c97e16bcb0dbf8c92b74899b37f318757140b6c4fd535e2e1e0570a50818cf78fb988e1f4ce40e76e8fe3d697d7a45850f293ce170fd8ab07cf1534ea5ffad34f6fcfa42d0d21a91dfbfe0597c73fd9b9767614ebdfd02c3ac0c49ad10c94be5969ee0808c0a30b2a1eaa90ea43b8575c3056f423cd4b6f34ae51c2223765a9ea21f64573c1a13961321246e3b5349ee048fb62d5fb61b1714391182562b91598360e5f9bf4ac80db246432afb3a43d349650de03d343c2e97a8eefd1bf30c10c25867f53266bd1f0dc14ae1a6be9efdecff67e7d292c6cdfc90d80b886668f04c2a0f5ad7fa17c178b6e9b45a11f4ddfe2d66960a3f75135ad5ed154e513e1a5d138e7371e84d7c92453e6c62dc59b8e1fa93d773a2540d91c257c", "signed": "709d1ca9ca2f742ab9dd0b049335f544cffb2f1a3693d5f53f8ba083b9b0d86e5208fa8e1e8156c9cc2242775abb7e15af3085868ef457634e9926c404ecf30f436a3c31763f93d4d546c6d1ecfb7ae45916af754f839dcfe96d6b69c61214d016fc842f56462a3f07f661b2e2505acfaf482a0b0f4f5501eec4b2d2d7d444544de000b990f4363d3f983f5d4e09309752ff579c7320c915951cc3a1e3238c1ba7a19130eabf6a37f5f0bc56e25242f752061f3c63acad992a7501e967deb925b30ed105431e582102fa4f308c2f0683612b56686d52daed6943a7219f3beea2e0a29242e86d5562ffab83b56b263326664e029e961e7017d8e89f5e3e1d10f5932854550ce6e5cd76971fd235cf9c0027d0cfed3315c2cbf18508624d8acf047f9b968f907d9e6f4cfa5e45c80a272c2dbb62c5d4194580dfabedd82cb4d76492344be96ccf5daaf61e6b2b55efdb3f65210a3d6e1f369887ca0ea0d58c3d146ae3cf9b000076884115fa51b5fd66bec0ccbf0d2920196a7d7a38445fbed22dfc7564dc56f60d6e29e592485374c6bd1e5b15931b69ca6ee6b3aa2525c23585f0929f31cbd11fb1a5330216b90ae5a656df7a074cec64e598184f503fb23cc05e65da9ae7e8441f40e2dc26b8b56d2cb523a7c635dc0847d1cd498abf756f5a13ea14f8fab2c410b1a470f49aa8dca4ac0256b11800de0dd0ec42b142c561128d357e783b12f61c668f5e6e06b7b48b7b2254de5bdc1804b723d5fd6a0f4bc7c59e7c5054182613bbd2fa92b4c1da16bc8c97e16bcb0dbf8c92b74899b37f318757140b6c4fd535e2e1e0570a50818cf78fb988e1f4ce40e76e8fe3d697d7a45850f293ce170fd8ab07cf1534ea5ffad34f6fcfa42d0d21a91dfbfe0597c73fd9b9767614ebdfd02c3ac0c49ad10c94be5969ee0808c0a30b2a1eaa90ea43b8575c3056f423cd4b6f34ae51c2223765a9ea21f64573c1a13961321246e3b5349ee048fb62d5fb61b1714391182562b91598360e5f9bf4ac80db246432afb3a43d349650de03d343c2e97a8eefd1bf30c10c25867f53266bd1f0dc14ae1a6be9efdecff67e7d292c6cdfc90d80b886668f04c2a0f5ad7fa17c178b6e9b45a11f4ddfe2d66960a3f75135ad5ed154e513e1a5d138e7371e84d7c92453e6c62dc59b8e1fa93d773a2540d91c257c", "signature": "709d1ca9ca2f742ab9dd0b049335f544cffb2f1a3693d5f53f8ba083b9b0d86e5208fa8e1e8156c9cc2242775abb7e15af3085868ef457634e9926c404ecf30f" }, { "secret_key": "4ec6829b43997056d99685389bd53c528de7e5ff2715d65c956619826e3fb5b5", "public_key": "7d922d57fdb12792879aec4e8c651463ece064492c721753d22e115509fed706", "message": "ed26b4130d4ebf3f3861491aa3dd96a4eb69752173fa6c84ca65dfc991c7fe44e02bd61650252a1d23786682ec38c1fee82cc350db7c3c3949a1c935ffebd7baa24f35a393fbd27e7c34c2f9ffda60a18df66c3e465d90ed48fbbad3fa7947dee7e659a3eeadb887f0963f6bdd76c36c11ae46d088ee50bca8187a0a8832db7984b7e27cbe6abf12d2c94f337ec78cb38b26241bd1a3d2f5fa4407fdd80227d2b170144b415978e37201d0fcf43174b9d7b2115d5eb8bcec276a775aea93f2340d4425d34d2047494d917e0dbe37857e6c99859b71c914aad5e54f7b2b033e594e272cc5cfe919f888e55cb6157affcf357246d00b532cc471b92eae0ef7f1e915944c65279315729853da572c809aa09d40365f90875a50d31ca3900da77047c957c8f8bf20ec86bd56f9a954d9988e206b444ca5a4434521bfc9c5f3a8a06147eb07d11dfe1171ec31ff55771588b333eee6215d216c47a8566fbb2b18974646ac5a92c699d77584c0defefd2dfa58fca27199e41ec58a246320b35faab75b97951924226da4ab28f01b47078e712e4fd9f77b251c9667858c28e32ef1cd01fcbe435c542dbad0a84a13cdbb5775e62d811dc690d9555c37f15f91767a561357df106eefe056e7360670650fb818fc6adc59973e9ad5cdcd809807ab56397f3c13948732d98d676f4a4470a95d8b518237e226f0cc5f4765164a5c3ef050714be02a126be8f66546481581b9e94a26aad24c693b7fdbc18acd3ed7cfc47d8ab26745d78e701d0cf05dd844b5b345a29dab684cbc5092ba022e3c582dfc044c3100ad02756697a849822915a16e2a2b810e6815f54421d2f3a6fff588c0d9013c76f33e09beaeef60d8774230e8ce7131289aef2a40686c819fb2040b06124d3d9aa419d56788f17fa7ed9b9b57ceaad1337a0101bea0440cff745ddd9722055d1f9bcfb009ce2c2f41a9e7e86806b872cdc2059bc8ec68f5ee56c4bacf4bbd30ea4c7155864d600c0e2eee73b319bda4372e9c603c772c25890c7610489989475d37a77a4574a2ba55bfd9c9cfd146fb97e6165dcc19559f4f85dfca2f97f3702ed8fa6b3c2a9741974aa07ab6", "signed": "159ca404f7f74117c5163cf404110949eb57ae2d7662b1ff4178cc6756e90adaeab71b064ce1dff457b2dba7e2dc13c217bcae8a61fcf8ce1487a649c257ff07ed26b4130d4ebf3f3861491aa3dd96a4eb69752173fa6c84ca65dfc991c7fe44e02bd61650252a1d23786682ec38c1fee82cc350db7c3c3949a1c935ffebd7baa24f35a393fbd27e7c34c2f9ffda60a18df66c3e465d90ed48fbbad3fa7947dee7e659a3eeadb887f0963f6bdd76c36c11ae46d088ee50bca8187a0a8832db7984b7e27cbe6abf12d2c94f337ec78cb38b26241bd1a3d2f5fa4407fdd80227d2b170144b415978e37201d0fcf43174b9d7b2115d5eb8bcec276a775aea93f2340d4425d34d2047494d917e0dbe37857e6c99859b71c914aad5e54f7b2b033e594e272cc5cfe919f888e55cb6157affcf357246d00b532cc471b92eae0ef7f1e915944c65279315729853da572c809aa09d40365f90875a50d31ca3900da77047c957c8f8bf20ec86bd56f9a954d9988e206b444ca5a4434521bfc9c5f3a8a06147eb07d11dfe1171ec31ff55771588b333eee6215d216c47a8566fbb2b18974646ac5a92c699d77584c0defefd2dfa58fca27199e41ec58a246320b35faab75b97951924226da4ab28f01b47078e712e4fd9f77b251c9667858c28e32ef1cd01fcbe435c542dbad0a84a13cdbb5775e62d811dc690d9555c37f15f91767a561357df106eefe056e7360670650fb818fc6adc59973e9ad5cdcd809807ab56397f3c13948732d98d676f4a4470a95d8b518237e226f0cc5f4765164a5c3ef050714be02a126be8f66546481581b9e94a26aad24c693b7fdbc18acd3ed7cfc47d8ab26745d78e701d0cf05dd844b5b345a29dab684cbc5092ba022e3c582dfc044c3100ad02756697a849822915a16e2a2b810e6815f54421d2f3a6fff588c0d9013c76f33e09beaeef60d8774230e8ce7131289aef2a40686c819fb2040b06124d3d9aa419d56788f17fa7ed9b9b57ceaad1337a0101bea0440cff745ddd9722055d1f9bcfb009ce2c2f41a9e7e86806b872cdc2059bc8ec68f5ee56c4bacf4bbd30ea4c7155864d600c0e2eee73b319bda4372e9c603c772c25890c7610489989475d37a77a4574a2ba55bfd9c9cfd146fb97e6165dcc19559f4f85dfca2f97f3702ed8fa6b3c2a9741974aa07ab6", "signature": "159ca404f7f74117c5163cf404110949eb57ae2d7662b1ff4178cc6756e90adaeab71b064ce1dff457b2dba7e2dc13c217bcae8a61fcf8ce1487a649c257ff07" }, { "secret_key": "b150a78929ed1eb93269213e1ebc22e2e40a601bdb005499b7beb058917c5340", "public_key": "28866b6d1c393cb08e464cf5571440a649e50642380ddf4ffb7ad150485c108e", "message": "1bf55d27f9dde6c4f1c0ddd360a25d9493c0ffdca74a7ed5e5a514e95515cda4aad8f45cd6ed7901f8f224a63b38121cbeac2f56dae210dd053750cb207514a8891e245a5d07e7de78a2e3814463f148d2acb7dc71f995c9299ad0d6266cfefc94269657fd47cf5312b92af2750651c479636c9d36aef08f7d1195e7fa1ba3abb5dcb90136b0fb9a37668b87a2db88d1e2b6440d3e6e601e6d4bc10cf1cbdf1d6169c0dc2c4aecdeb6cdd4567d4250b2afa715b166c9467f907d3fa5a6daf200b309c109376830499caf3149001cf3339448ca3d765225d6b3c1cd267cba936e7aa4832539466fd20cbb38323cbb2228a271f2d282561c73ed79a1ad04698e27efe393235f3456c295407da0960f0034d8deefd1c185736fd3eaf1f9a1e32f09174c1fe12720b7c96febdb33e01b1b6a1c637150194be4ffab159e45b24585576846bb64274eca7b39a3ed9357de7b084213024a9e8589263600a2867c2a7cf8b99076a12a07bd7df8d5277bb04ad72e639b77eaca1ec58ef9637e9a2376ba878a457235a06f78fdf0e0d925cb2fd2a38c77188f60372ef6009792424399c9b67928da2e3ba91cbde407e7e876ba98139ed22ca3b983bede0000528796448e4a1055acb2deaa56bc308254c5bd498c275ecedc1357efe1fda01d34d916dd4d8647e5771995a653e0f8a5284cc7bf73157b3349d59e6f920cad6cdd1719f038025c4300e0210ce249faf3c82de1fd1cdabe61c14ecb1df00c5c466aa6a012a9c10dcfe59b7e9d3b155dab6c7b7c1608c1edd51dbdadf6ba5876b5e60fdf7f19e6ef712cd1a7dd3a062a6574a7436b319efb944e4223f542b2502c1ba976be91e05b0f85a09fd793beca883375fb67cd133f5284d89984ff3cafa7e11a9d85e7893232a524ec54b20f975d3c0a1143a0ef41176b7051ea91d40c5f44fd9e100558bf1212a7b891e68b55ca61f4be945266d9a1007a14aaeb68c48e257f0f46310ad16481467ec1773535d5fc084915f5d004ba0dc7591d2123c62207909d84f2b382f5ef12759a95cd3f5189806e273960aee162c00f73e7fa59363957654bb1916b5709bb0a9d040514ae5284951e6b", "signed": "276dd0962e6ee64f0592441a8af0e5ef8f93bf0baeba20504b9db4f95a00b939ea38def1c797862898cabe9dc4644f0e677e87c0a33b87b6a4d22a807d0e1e021bf55d27f9dde6c4f1c0ddd360a25d9493c0ffdca74a7ed5e5a514e95515cda4aad8f45cd6ed7901f8f224a63b38121cbeac2f56dae210dd053750cb207514a8891e245a5d07e7de78a2e3814463f148d2acb7dc71f995c9299ad0d6266cfefc94269657fd47cf5312b92af2750651c479636c9d36aef08f7d1195e7fa1ba3abb5dcb90136b0fb9a37668b87a2db88d1e2b6440d3e6e601e6d4bc10cf1cbdf1d6169c0dc2c4aecdeb6cdd4567d4250b2afa715b166c9467f907d3fa5a6daf200b309c109376830499caf3149001cf3339448ca3d765225d6b3c1cd267cba936e7aa4832539466fd20cbb38323cbb2228a271f2d282561c73ed79a1ad04698e27efe393235f3456c295407da0960f0034d8deefd1c185736fd3eaf1f9a1e32f09174c1fe12720b7c96febdb33e01b1b6a1c637150194be4ffab159e45b24585576846bb64274eca7b39a3ed9357de7b084213024a9e8589263600a2867c2a7cf8b99076a12a07bd7df8d5277bb04ad72e639b77eaca1ec58ef9637e9a2376ba878a457235a06f78fdf0e0d925cb2fd2a38c77188f60372ef6009792424399c9b67928da2e3ba91cbde407e7e876ba98139ed22ca3b983bede0000528796448e4a1055acb2deaa56bc308254c5bd498c275ecedc1357efe1fda01d34d916dd4d8647e5771995a653e0f8a5284cc7bf73157b3349d59e6f920cad6cdd1719f038025c4300e0210ce249faf3c82de1fd1cdabe61c14ecb1df00c5c466aa6a012a9c10dcfe59b7e9d3b155dab6c7b7c1608c1edd51dbdadf6ba5876b5e60fdf7f19e6ef712cd1a7dd3a062a6574a7436b319efb944e4223f542b2502c1ba976be91e05b0f85a09fd793beca883375fb67cd133f5284d89984ff3cafa7e11a9d85e7893232a524ec54b20f975d3c0a1143a0ef41176b7051ea91d40c5f44fd9e100558bf1212a7b891e68b55ca61f4be945266d9a1007a14aaeb68c48e257f0f46310ad16481467ec1773535d5fc084915f5d004ba0dc7591d2123c62207909d84f2b382f5ef12759a95cd3f5189806e273960aee162c00f73e7fa59363957654bb1916b5709bb0a9d040514ae5284951e6b", "signature": "276dd0962e6ee64f0592441a8af0e5ef8f93bf0baeba20504b9db4f95a00b939ea38def1c797862898cabe9dc4644f0e677e87c0a33b87b6a4d22a807d0e1e02" }, { "secret_key": "9fc7c49cb8c4f0972d6ed970ae2c6ac337e675425cc8dce730fc41444302935d", "public_key": "4782520b06f93344aa766780e54401363dfd7d967cc3bf06488af90920a30f85", "message": "82bc2c700db222a4ac914aa2be8fa28e422067f94f3344f5362bebaabed7612b0e464a73a6c456903564b15393485140dd0f3aff90aa6e1661ddf682850d0490afc3d735dea05ba47c85d97e833533514c198b4cf6e66d360ee5bf00e14a3aab1ad0e7b8ab2aacc964d42830c78453df1955bbed1cd68ada3db0ecdb601ad7667d5c5e2fd49e36f7328eaa337dbd6ff70e7898a3f98c159d045a2427ade5333c88fc4afd3819dc82f4daa3c523cb57e35a2a5a725d63d402baef51e51f1ef4f8f9a595c9379c9aba873fb4e765a931da09148aba6ec5b44859b0e81ff9fc229598ac9fbdb0bdbddb5692a52222df52ea387bbbf36ad64d1946bd282e323ff4822ad9da897ff73f01b390cfe2e64de492d55de77f5d7d0060a6872a0183ccba610f53274ccb29ce6dce6a036c5317a1ed2a7c1068c1b246fc1d5881d00de06eb401cff95e6b69148699db13e94bb5b280212dff54c70e56de235a5f1400b5bea56772d060170f1d0657321561e4b49107eb96d9b3bc5adf451c2a524eba4db003b77b632a5d89827a6224cc798e096ba27fb33bf61e3b8eaf18d001ae8eb52f85c90d9e12544803e67ff02047e0d23c22e7f8b980c01c3d4824b2a9a14a2e8f672a7b0ce03bdbb3bd56d754a0964db01ca899d488001508657b7b022ccf042c38fc1949d0e00af4d301d4f00c3dea20e308a0f9dcacb43222b3824144af77be18a504aa8d268b8a5600725e7cc5f3a2e6256a8074d1aebca123ea53a0767a92e1783a4983c5ef3d7dd7f02aa9d1f4f9aac6ce254593f08792014fb867eaf879b88a4efb18e89ba11006ad09d85431cc26575b538d8e7890646c5988647cc105d582907ae625e09cd089f47249e81814da14044c7014e80e7a8e619c7b735f701616b6a3c6f492cdc6ed463e71a3d22291482d90a1de6f097c4ae254876184c562b16575b9d0d19313ed98864f49fe2e1d074a21211b2b2a6d27ddb28611520d5f7123058fd007bb01001def07b792bb05bb741c129c6a36376c3853b8bb4f66b5760c8eb4ecc7306ba3a90c70da47c965f6dccbdb61a7fda18ee967cf8c5f050311092d0fdeeaedd1265defdd660abe70", "signed": "5c783a860aa668184dd22c4f9a546b5ec96ebad2e4af00f968c688671354e0cc9b572c73bc6f19937a05f1baf3434763965c96e103407f0eb642c5644154290b82bc2c700db222a4ac914aa2be8fa28e422067f94f3344f5362bebaabed7612b0e464a73a6c456903564b15393485140dd0f3aff90aa6e1661ddf682850d0490afc3d735dea05ba47c85d97e833533514c198b4cf6e66d360ee5bf00e14a3aab1ad0e7b8ab2aacc964d42830c78453df1955bbed1cd68ada3db0ecdb601ad7667d5c5e2fd49e36f7328eaa337dbd6ff70e7898a3f98c159d045a2427ade5333c88fc4afd3819dc82f4daa3c523cb57e35a2a5a725d63d402baef51e51f1ef4f8f9a595c9379c9aba873fb4e765a931da09148aba6ec5b44859b0e81ff9fc229598ac9fbdb0bdbddb5692a52222df52ea387bbbf36ad64d1946bd282e323ff4822ad9da897ff73f01b390cfe2e64de492d55de77f5d7d0060a6872a0183ccba610f53274ccb29ce6dce6a036c5317a1ed2a7c1068c1b246fc1d5881d00de06eb401cff95e6b69148699db13e94bb5b280212dff54c70e56de235a5f1400b5bea56772d060170f1d0657321561e4b49107eb96d9b3bc5adf451c2a524eba4db003b77b632a5d89827a6224cc798e096ba27fb33bf61e3b8eaf18d001ae8eb52f85c90d9e12544803e67ff02047e0d23c22e7f8b980c01c3d4824b2a9a14a2e8f672a7b0ce03bdbb3bd56d754a0964db01ca899d488001508657b7b022ccf042c38fc1949d0e00af4d301d4f00c3dea20e308a0f9dcacb43222b3824144af77be18a504aa8d268b8a5600725e7cc5f3a2e6256a8074d1aebca123ea53a0767a92e1783a4983c5ef3d7dd7f02aa9d1f4f9aac6ce254593f08792014fb867eaf879b88a4efb18e89ba11006ad09d85431cc26575b538d8e7890646c5988647cc105d582907ae625e09cd089f47249e81814da14044c7014e80e7a8e619c7b735f701616b6a3c6f492cdc6ed463e71a3d22291482d90a1de6f097c4ae254876184c562b16575b9d0d19313ed98864f49fe2e1d074a21211b2b2a6d27ddb28611520d5f7123058fd007bb01001def07b792bb05bb741c129c6a36376c3853b8bb4f66b5760c8eb4ecc7306ba3a90c70da47c965f6dccbdb61a7fda18ee967cf8c5f050311092d0fdeeaedd1265defdd660abe70", "signature": "5c783a860aa668184dd22c4f9a546b5ec96ebad2e4af00f968c688671354e0cc9b572c73bc6f19937a05f1baf3434763965c96e103407f0eb642c5644154290b" }, { "secret_key": "08bf059b4da9aa7ffc702f5b2304c4f96ca49b7dabb6afb41dc91c0f00c65b78", "public_key": "a6289ba28e80e8d1a319223e4165dc0bce7352aaf242f70cc968d21d77752832", "message": "bd4fb28a1dd08b07ba66e17f0c4f21853fefef1c9d20ba7977f154641ea1a18becf6bbb80388886294e0756a3c508ffdfe90b51e1356d112d8cde5ee2cc6332e61d169ccc8cc934994f1bb560fa4660c0b0fd4e8149a225ed4883e68fbb69da7af8a524b17141ccb76b50cd8e1b67d3ce037ded7dfa59bc7c2674226ec7e07b78ea3f782fda3e5f1e9caeab608ca387c304654f801d00e10a7c29f4b0da3e5f89513a98037719a1aef4c2506c177af5451a00757a59f16229c4f4414df51580d48210dabc9377370b6068a88e81d3ad1bed4985155c3600ff48768b903022fe02ae480f2e6329f0bcc91d75f5c6a09fdf77bde90499f3ca395cb20062a0984ad6a0141fd01c2d54dfbb1ee584610640773439a1658d2c9f862f183bfefb033a3be271812f13c78704657e7fb4f850175fcd63d3e4405d192242c21f27c51477f3211a9ce248e892b42fb6d85820f41b897836f20f85a1311534b5c404f8b7a4a0319bc6cecaa57fe4d4f20607c99c2df22fa0676f99d1bd87886c928c4988c6e78c57d758330e6922cbe03c10340253d0dd483792ce75e6cd09d12fbbb041f0205e65ad25ce7c1b24e77ee8d6f915e3bc3e10d09fbd387a84bdaabfd1cedb52c0b1733b5f47088c0d35e0ef458c85414c2b04c2d29f63f77586131ee65530f209b518a0f257a0746bbd5fe0a2e0c388a6c480e1b60714fee1c5941bb4e13f707eac487a9666a723b5793134a268b77597786c3a3193b46d355dd0895fc6216c536a542ffd7d7b08010c86f547a5daa38335a8bfa2655d5f71b4d8807f50c8545c583dd0b690022ee65873aea3e8f1a565f3b0e4e0295fb0d321f5c0b397f2fd0528f86a0d1b707f737b175c69e9e7ae3c84d4b2cf3a38a631aa8032b3e65bb4528f66d0bfd34473ed0101d2a61255b215bc1cbab9a26d2b969324b77c8a5464e5b23df6c5112f9d17c587d95559de212ad241d8b126050e5fddfcc839a7e5aa2fda1ca20c0910d863418f195b38adfcc36e92f2396ac3144b537b30fbe4dde614902f89978b7fb42cd99f13d99c45c734fb82c3259f90b88fd52bdcb88f7eeecdde4c243d880bac7614e15cf8db5993ffa", "signed": "e24765860137689aad50ebeefc8d6db8e936a4cba62ce87a7f580209384a9d7eec9070905f60ad63a7befd7c70f0ae7c8109169aee4e518fcebfaca723c5b207bd4fb28a1dd08b07ba66e17f0c4f21853fefef1c9d20ba7977f154641ea1a18becf6bbb80388886294e0756a3c508ffdfe90b51e1356d112d8cde5ee2cc6332e61d169ccc8cc934994f1bb560fa4660c0b0fd4e8149a225ed4883e68fbb69da7af8a524b17141ccb76b50cd8e1b67d3ce037ded7dfa59bc7c2674226ec7e07b78ea3f782fda3e5f1e9caeab608ca387c304654f801d00e10a7c29f4b0da3e5f89513a98037719a1aef4c2506c177af5451a00757a59f16229c4f4414df51580d48210dabc9377370b6068a88e81d3ad1bed4985155c3600ff48768b903022fe02ae480f2e6329f0bcc91d75f5c6a09fdf77bde90499f3ca395cb20062a0984ad6a0141fd01c2d54dfbb1ee584610640773439a1658d2c9f862f183bfefb033a3be271812f13c78704657e7fb4f850175fcd63d3e4405d192242c21f27c51477f3211a9ce248e892b42fb6d85820f41b897836f20f85a1311534b5c404f8b7a4a0319bc6cecaa57fe4d4f20607c99c2df22fa0676f99d1bd87886c928c4988c6e78c57d758330e6922cbe03c10340253d0dd483792ce75e6cd09d12fbbb041f0205e65ad25ce7c1b24e77ee8d6f915e3bc3e10d09fbd387a84bdaabfd1cedb52c0b1733b5f47088c0d35e0ef458c85414c2b04c2d29f63f77586131ee65530f209b518a0f257a0746bbd5fe0a2e0c388a6c480e1b60714fee1c5941bb4e13f707eac487a9666a723b5793134a268b77597786c3a3193b46d355dd0895fc6216c536a542ffd7d7b08010c86f547a5daa38335a8bfa2655d5f71b4d8807f50c8545c583dd0b690022ee65873aea3e8f1a565f3b0e4e0295fb0d321f5c0b397f2fd0528f86a0d1b707f737b175c69e9e7ae3c84d4b2cf3a38a631aa8032b3e65bb4528f66d0bfd34473ed0101d2a61255b215bc1cbab9a26d2b969324b77c8a5464e5b23df6c5112f9d17c587d95559de212ad241d8b126050e5fddfcc839a7e5aa2fda1ca20c0910d863418f195b38adfcc36e92f2396ac3144b537b30fbe4dde614902f89978b7fb42cd99f13d99c45c734fb82c3259f90b88fd52bdcb88f7eeecdde4c243d880bac7614e15cf8db5993ffa", "signature": "e24765860137689aad50ebeefc8d6db8e936a4cba62ce87a7f580209384a9d7eec9070905f60ad63a7befd7c70f0ae7c8109169aee4e518fcebfaca723c5b207" }, { "secret_key": "dbbd0f7ecb6482cb01c4dbdc3893c0db81e831353a5b01cc75d3b11f2ff3c59c", "public_key": "2d4e588d31a384b17858c0d784f6712bafd0b41204cf8f0d57973e59c770d3da", "message": "e0fff35975eba78da2b0ffcc5c1b663600888e8255cd208f6dce7e88953b7142937389a337ae82f4cfe32fcb34f552a48fa8899e1a659e3ed3d3d290efc9a0f7dedf33e21d048d8d910757037b76e8a7ee9e4eca30f529ddc02ceffc26d64fda7303cc0d8940e9ef59dc983c12ccd1d2717e64d3006af82ab15bb878bb89d1758be44310420638b96a0b5e1e65009d69395d027a5da4a85e901be9aa2c0b3acc508ee18574c1b2fa9bd5d7ae7c7d830712da5cbf26be09a3128470a12a14909a80a266659befda548fd2b22f24c5fdc206ed3a4e75f5320682ed0e4ce817d63d5c7f1ee2b440643355be6542f59dc6c45ab15772f2219a812ef7527642015bc75fe45ba969e8100c268e24ceef9205a83a3f7b5ae800ad06e095b9b139219489793a7bce84ebeb654ab6669e2855ccbeb694dd48651505b959d32a77020b869533e3256d40685a6120bab794485b32e1169256fb188fe76e04e9efa6d10d286ae86d6f1c87e8fc73ad9b59fe0c27ee92a46415b39d786d66325d7fa6fda712f199da554fc1c89944a4e84c196e979a807553718cb81c076e511e609d5cac23d8f45b38b94bcfcf158d0d61602238d52e3ae84c815322f534f254e63389ae155dee2fa93396f0ea499d5d08c2475908c648bddcee591e1337e9421dc5a257ce89ccce4ceea809d7e87134e039db1be598196d3089fdcfa8978e02c1555832da0a72b08ad07cdd072627409c873937b0e835715baaf2608b2395327467cf69a1cdcce6372418383e7b89c8df4d531f585149509ead1e41b6627fea81c7958cb49d2d3c3e2fc691e0b8cf72679c08b8904654531bc4368fb617ac7557d9db8d329d77e48d8fb4de73abe7cb9388274af585f875c0dab793e4353518bb24695342af0f5df5be4e9c7ad215be90e25540da3489717dd3d29254585a45c13e6dcc7e9c8a3a79ff755cbe465b25e23a1da608e1084fec83bff80cfb7442b1460187307acd75e3f2d12843a77094acc32888fbe5f1fc24c615d19a065391d4176474644246b5343da77626a2d483fe204f839328775b71a4cb567273e169640af93dde3eca9116f400e23a7ad3d8fc3a28e565f125d6", "signed": "96c00361fb71c52305e1ab7707e0465203eb13df3e0655f095fb331942a40b15584143b370a7dd5761fb03c075d04a8348661ccea9ada53365b500087d57ec0ce0fff35975eba78da2b0ffcc5c1b663600888e8255cd208f6dce7e88953b7142937389a337ae82f4cfe32fcb34f552a48fa8899e1a659e3ed3d3d290efc9a0f7dedf33e21d048d8d910757037b76e8a7ee9e4eca30f529ddc02ceffc26d64fda7303cc0d8940e9ef59dc983c12ccd1d2717e64d3006af82ab15bb878bb89d1758be44310420638b96a0b5e1e65009d69395d027a5da4a85e901be9aa2c0b3acc508ee18574c1b2fa9bd5d7ae7c7d830712da5cbf26be09a3128470a12a14909a80a266659befda548fd2b22f24c5fdc206ed3a4e75f5320682ed0e4ce817d63d5c7f1ee2b440643355be6542f59dc6c45ab15772f2219a812ef7527642015bc75fe45ba969e8100c268e24ceef9205a83a3f7b5ae800ad06e095b9b139219489793a7bce84ebeb654ab6669e2855ccbeb694dd48651505b959d32a77020b869533e3256d40685a6120bab794485b32e1169256fb188fe76e04e9efa6d10d286ae86d6f1c87e8fc73ad9b59fe0c27ee92a46415b39d786d66325d7fa6fda712f199da554fc1c89944a4e84c196e979a807553718cb81c076e511e609d5cac23d8f45b38b94bcfcf158d0d61602238d52e3ae84c815322f534f254e63389ae155dee2fa93396f0ea499d5d08c2475908c648bddcee591e1337e9421dc5a257ce89ccce4ceea809d7e87134e039db1be598196d3089fdcfa8978e02c1555832da0a72b08ad07cdd072627409c873937b0e835715baaf2608b2395327467cf69a1cdcce6372418383e7b89c8df4d531f585149509ead1e41b6627fea81c7958cb49d2d3c3e2fc691e0b8cf72679c08b8904654531bc4368fb617ac7557d9db8d329d77e48d8fb4de73abe7cb9388274af585f875c0dab793e4353518bb24695342af0f5df5be4e9c7ad215be90e25540da3489717dd3d29254585a45c13e6dcc7e9c8a3a79ff755cbe465b25e23a1da608e1084fec83bff80cfb7442b1460187307acd75e3f2d12843a77094acc32888fbe5f1fc24c615d19a065391d4176474644246b5343da77626a2d483fe204f839328775b71a4cb567273e169640af93dde3eca9116f400e23a7ad3d8fc3a28e565f125d6", "signature": "96c00361fb71c52305e1ab7707e0465203eb13df3e0655f095fb331942a40b15584143b370a7dd5761fb03c075d04a8348661ccea9ada53365b500087d57ec0c" }, { "secret_key": "748bb3cd477137bc880ea7c61df25c1dac6ebec9e6c3193d81ffa6f7a81ec667", "public_key": "106f28cfedf096454226b3b01fc24ab1c9bbd7f2b0973e56fe2f4c56a0b1475b", "message": "00de6d990c84338a398fda5f4a2cca733c56b2a2ea396c2fe667c268e38145878539bd41bc140a2cdfe7e18360411048cca60f35ce510991df261cbf669039d9d25687a07fc0476a41f50eccf38153ee6ae9ffd392b2bec0cc67101ec3696d7a2ec8cbd447b6a6ea063d33ec128ae8b57577dee17b97162563f15e42b55ca4bedbdfb631a9f6262f94ae35bb35f795c35a01dedb4645a73cfa6ed9ee521e4631fb17bbc06ee57316be527427c8aa55c631187462d4b2c8822ca4e18b7a5d4c114c11dc22069bc832656d5f4d39548718c51f5e4fc828f60e37f01307505265acb22d5e8d767b9aa7b866a157c643873e09084a1a404a7bb58ccc4b5a390fd30601c896935e3556f60d2dc6bdffe47da0a687c8ece1241ff6c07d776111ca6598fca968cb6afa0a14a34ab8f54b95d3d8473a174bc725523f8674dfb2b10f874207fee1b08b42da1f58655305a359757aa0251f14138eedbc280cbd385bf4bbf5530114cc43b0474779e204962f8560d4aa423e17e6aecace66c813784f6c898b5b9cb746a9e01fbc6bb5c660f3e138574f59b9745445486c422bc06a10cc8cc9bc56458ef85e0e8a027cb0617d0337ddda50220b22c5c398f5ce05ec32f09b090f7cf6c60f818c6b4c6830983e91c6eadf1eae4d54bde754f75d450ae73129f6c4ff5c4c606f7cadbf4f78a18db2961cc8c8ddab0578cfedfcf95ef0888afd385537d1d0a07648a5ce2522d0633507d77593e1a0366d1ece843de69867d7ac442ba7dad2a90b59d8984e4a946bbe5f172da427638b2b61209041fff50e60ec02ec2c0b1dc4be2edd13e87b64d1d1663114573cf58a17739f463a1c3d6b2123390183b505c8eeffb20539bdfeeb40776d20c459bac4569968fcafe44ea4cd624a84bfccd7876dd7bf55f83ac7040e30f326dce325588e1ba5bc0790265dfdba09839eef571641e8a1234b6cfc3a36a866bd6b92cd71ec74e0d4deb9e74d158201aa502f07c8ba348ac26aaf9b3d070c9a40b52a44e932552b67a2df05a7f0f03c617b48dc2782366a231e0c4e3938a4274b36aa9450ff936be132dcb692838d654c94542c6e047a7f78ba711919f908a15b30b9", "signed": "e13ca8e5ce7c268090908d61cf2f0a3e4572412bf5adfc5addfe88556f148b5fcbe3e1bc65ff16117d35c9d5dc3b117198f884925b4035b2c0de6c402ed47a0100de6d990c84338a398fda5f4a2cca733c56b2a2ea396c2fe667c268e38145878539bd41bc140a2cdfe7e18360411048cca60f35ce510991df261cbf669039d9d25687a07fc0476a41f50eccf38153ee6ae9ffd392b2bec0cc67101ec3696d7a2ec8cbd447b6a6ea063d33ec128ae8b57577dee17b97162563f15e42b55ca4bedbdfb631a9f6262f94ae35bb35f795c35a01dedb4645a73cfa6ed9ee521e4631fb17bbc06ee57316be527427c8aa55c631187462d4b2c8822ca4e18b7a5d4c114c11dc22069bc832656d5f4d39548718c51f5e4fc828f60e37f01307505265acb22d5e8d767b9aa7b866a157c643873e09084a1a404a7bb58ccc4b5a390fd30601c896935e3556f60d2dc6bdffe47da0a687c8ece1241ff6c07d776111ca6598fca968cb6afa0a14a34ab8f54b95d3d8473a174bc725523f8674dfb2b10f874207fee1b08b42da1f58655305a359757aa0251f14138eedbc280cbd385bf4bbf5530114cc43b0474779e204962f8560d4aa423e17e6aecace66c813784f6c898b5b9cb746a9e01fbc6bb5c660f3e138574f59b9745445486c422bc06a10cc8cc9bc56458ef85e0e8a027cb0617d0337ddda50220b22c5c398f5ce05ec32f09b090f7cf6c60f818c6b4c6830983e91c6eadf1eae4d54bde754f75d450ae73129f6c4ff5c4c606f7cadbf4f78a18db2961cc8c8ddab0578cfedfcf95ef0888afd385537d1d0a07648a5ce2522d0633507d77593e1a0366d1ece843de69867d7ac442ba7dad2a90b59d8984e4a946bbe5f172da427638b2b61209041fff50e60ec02ec2c0b1dc4be2edd13e87b64d1d1663114573cf58a17739f463a1c3d6b2123390183b505c8eeffb20539bdfeeb40776d20c459bac4569968fcafe44ea4cd624a84bfccd7876dd7bf55f83ac7040e30f326dce325588e1ba5bc0790265dfdba09839eef571641e8a1234b6cfc3a36a866bd6b92cd71ec74e0d4deb9e74d158201aa502f07c8ba348ac26aaf9b3d070c9a40b52a44e932552b67a2df05a7f0f03c617b48dc2782366a231e0c4e3938a4274b36aa9450ff936be132dcb692838d654c94542c6e047a7f78ba711919f908a15b30b9", "signature": "e13ca8e5ce7c268090908d61cf2f0a3e4572412bf5adfc5addfe88556f148b5fcbe3e1bc65ff16117d35c9d5dc3b117198f884925b4035b2c0de6c402ed47a01" }, { "secret_key": "393d44dd0ded71fc08477bd25ed0e6629fa7f88f082ebcef091898e5c9e3d5b8", "public_key": "c52a993b802d84540d275479a1af5e287d19ea13b380fa3068d2f2c68eb97a09", "message": "142b6e82501362d55a04b89d541a796863d7783840d34cbdfc516a3c84772f92446f5f0df4c45c6e0dc8ec1e9bb0ff7ec1696a09cd7ae34c10f8e61a9acabd4303f0a9247237621c490e8d9d0fe44482c560d051b82b074ac3d8e49bb2ac715ac4cde3d4709d0ea3afc51bfdef4b656771fbd55f89da9fa6dcaa62cbae561208d98cfa24cb81252b895f6a4a92c8e407af6c1f1ef49d8dde154fbcb1ca457a204b5ea5432e4d71fb7eb24d43f6fe25e7b4c659b0eebc4cbcc8b3cfde07c8f07b18a51570e7163e33b317b61360f9ce08d95de2c3156af1ccc9b55bcf81eabf3c40434046bbe82e02992a2ac8b3b425680a23d934726cb1b7bf26ceb52a39022c00acf425257167b821185f68e3ed17903d8d22275498c39a9e8df884ec00558dcfa43b8a119c2e853b9a0318bbea087f9cec17ca49b70817b8d7c170a8906f3ee9e8f8cb27a1d0f575abfa627e88f08ca4b93c3297c4f317072f421c5e602e2f831dfb82551bdce8d71216f05cf9a2773b90fc93b9d855a91e35ade332a5061fdb82b309bab4f56e2d586a84c67481d1902c261b3f97dc30b184619df9fdfc7a329d061a41df332202133d8eaeeddb4cfcee53536e07aad11553dcf5ed1e949d45355f9ef42c7832b0de7c2f1526fbef86b63649b6b85ae5ca86f0cea6df9c126c1d79489cc3bfc6e8bf0346eb30d01643c010150c5c8d0eb5010a46112215137991085e57493b22e83526b7b172c6c7341c40321e9ceb7c82bfbaa48f3bd8f51372d96d47444ff0d8bb2e5fd26514eb639105e33895fdc41f6df1fbfdcb08466ec2d217fc99fb012fe6540c0c5a5966ed3e66fab1202ab9daffe8e27e8f7462828d662659ea3b2c608cf68e30dbac62ffd8229f4a53f59ae16833b81a159161f19369f60f51c43a217efc5efd6ab7a91fe249c7b8a0c14e9faea533de133849a92447676f6cc18bef4fec7f37319759ce80ea3eac18fa2d9fa02309e1ce93ac6cf4cd2cb2c95f1e2aff7b2a8856405a7b8ebabeb4906d9b9734da9fb5e5d3f322bb5b559fa61ec8f515db9065ab4b91a7a31d5c625061c2fd2bcfe17f94bbde4776302b8aef3d5b52db3bc73ae4a30cc4417acb", "signed": "84c716e60de67b020cc1a6a24e6549fe56c6d941a8edeae407626666c31cb60dee6be5a71ebd76baf71b75114bccfd37d163a968bbeec1f76972151296c47e07142b6e82501362d55a04b89d541a796863d7783840d34cbdfc516a3c84772f92446f5f0df4c45c6e0dc8ec1e9bb0ff7ec1696a09cd7ae34c10f8e61a9acabd4303f0a9247237621c490e8d9d0fe44482c560d051b82b074ac3d8e49bb2ac715ac4cde3d4709d0ea3afc51bfdef4b656771fbd55f89da9fa6dcaa62cbae561208d98cfa24cb81252b895f6a4a92c8e407af6c1f1ef49d8dde154fbcb1ca457a204b5ea5432e4d71fb7eb24d43f6fe25e7b4c659b0eebc4cbcc8b3cfde07c8f07b18a51570e7163e33b317b61360f9ce08d95de2c3156af1ccc9b55bcf81eabf3c40434046bbe82e02992a2ac8b3b425680a23d934726cb1b7bf26ceb52a39022c00acf425257167b821185f68e3ed17903d8d22275498c39a9e8df884ec00558dcfa43b8a119c2e853b9a0318bbea087f9cec17ca49b70817b8d7c170a8906f3ee9e8f8cb27a1d0f575abfa627e88f08ca4b93c3297c4f317072f421c5e602e2f831dfb82551bdce8d71216f05cf9a2773b90fc93b9d855a91e35ade332a5061fdb82b309bab4f56e2d586a84c67481d1902c261b3f97dc30b184619df9fdfc7a329d061a41df332202133d8eaeeddb4cfcee53536e07aad11553dcf5ed1e949d45355f9ef42c7832b0de7c2f1526fbef86b63649b6b85ae5ca86f0cea6df9c126c1d79489cc3bfc6e8bf0346eb30d01643c010150c5c8d0eb5010a46112215137991085e57493b22e83526b7b172c6c7341c40321e9ceb7c82bfbaa48f3bd8f51372d96d47444ff0d8bb2e5fd26514eb639105e33895fdc41f6df1fbfdcb08466ec2d217fc99fb012fe6540c0c5a5966ed3e66fab1202ab9daffe8e27e8f7462828d662659ea3b2c608cf68e30dbac62ffd8229f4a53f59ae16833b81a159161f19369f60f51c43a217efc5efd6ab7a91fe249c7b8a0c14e9faea533de133849a92447676f6cc18bef4fec7f37319759ce80ea3eac18fa2d9fa02309e1ce93ac6cf4cd2cb2c95f1e2aff7b2a8856405a7b8ebabeb4906d9b9734da9fb5e5d3f322bb5b559fa61ec8f515db9065ab4b91a7a31d5c625061c2fd2bcfe17f94bbde4776302b8aef3d5b52db3bc73ae4a30cc4417acb", "signature": "84c716e60de67b020cc1a6a24e6549fe56c6d941a8edeae407626666c31cb60dee6be5a71ebd76baf71b75114bccfd37d163a968bbeec1f76972151296c47e07" }, { "secret_key": "71193640a0a2b22fb22d00a80b33a5514f3d1000034fccd885d8ea8638f0b0f8", "public_key": "b1d36f723b7086d923119f46759b39fa1e4038c6418c379ba98b5840c7ea5068", "message": "e0287948bb85a398e6affa2d25fcff8bdb9326f5d14fdeb60549f5fbf0c1816f11cbdd4e90fea039dca60faad1696003f91515c9b272882c95c9a4ab6e2777bd927e7d8442aea6cea619c9b15255fed612b5cc3158fc705bb7a506f4afecf4e34ed517b2c12b8362610e5ea270485cccb3c9aa97ecd6cb19630900f07d94cb293cb6e089a9a77c0194073a7f7177b0230d25763a2ef98d47704cb2c3af4c3c1b495631b4a5b21b2e56bff2ede03ea4fe7cf82917347e3a9d4dbeef37d1cf17615adaa0fd17057969917d478d03ccd8f8b88e5e5acae6732a8161dfb5f7d02123c8d5a565cf4dd98dfc9aaf5a335058a941ca43073f2659615a72fe78c101c41aed07f3bcf980b0a5b3fbafdbbea92fd889cfd53d403278bc15a59aa140c2d773b8889b963dcea365362e426ef4609845c9bce9f8aeb591d1a469b072b41209f5a8b6dc2395ad9060eb2e370978ae3311d1cf0a8f205142d436bab6b95943a97c23e61bd14b2d95672cb9325e9ab1fc9eeeaaccd58b9f4ac1550bdec8449b036039496c5f07a5ed64d5d85171690144db5c81c81cbc4c16718d52c4dfd1958ca5c9c8ba582cd9d706f27a74744c3a05bf1ccd51f1092010d36f1578b578ae0e9ffa47079055ef94fabc9ff72f738bef68461eb3404ccee953f5ee864c974ce70e9037e3388fbaf2889e1366caa0f651e21b339e3d56b9d95ac30b3592a948912c90bf54473cebc467b09a3943dcac4868acb5b35ea691eff4d8cc1cda0c6c0a9c169a4ee10041f35f433fb53d26067b291056b1da69ff46fbea1ca7213659a990d5d5df1406b093da2a33c8df95ab3ce811afb9c98c5bfd7c4e981b3ea94eefd2e2fe95707d89f307fa76828b5c6774950aee80626714256e197dc7da972158c768bbee7fbd169ec15b4bb7be72976dbed3e512766ef22ef3b812bcac4aa3115afe83d31284af8eacea4ee49afd42d9c44fff2d861c08629b55dae00ff674fb028e738b05dcb38aeaa6963cc3faafc7b69245a2a122a96dd2f03a824d72b0fe0dd798df5c4bb75a87324e764a50a5ff52547ada8f8f88e6f38aee49d58ddb012648854cd59d0ec97bc3d58d0ad4491f08590767ceb1", "signed": "a9702a3395acd20d754373095dc61445584d8e571080e179adcba3106bb06a7ce4d460f1261aef8643ab1634f47c9414a32e183a327691e65843dd6c05507207e0287948bb85a398e6affa2d25fcff8bdb9326f5d14fdeb60549f5fbf0c1816f11cbdd4e90fea039dca60faad1696003f91515c9b272882c95c9a4ab6e2777bd927e7d8442aea6cea619c9b15255fed612b5cc3158fc705bb7a506f4afecf4e34ed517b2c12b8362610e5ea270485cccb3c9aa97ecd6cb19630900f07d94cb293cb6e089a9a77c0194073a7f7177b0230d25763a2ef98d47704cb2c3af4c3c1b495631b4a5b21b2e56bff2ede03ea4fe7cf82917347e3a9d4dbeef37d1cf17615adaa0fd17057969917d478d03ccd8f8b88e5e5acae6732a8161dfb5f7d02123c8d5a565cf4dd98dfc9aaf5a335058a941ca43073f2659615a72fe78c101c41aed07f3bcf980b0a5b3fbafdbbea92fd889cfd53d403278bc15a59aa140c2d773b8889b963dcea365362e426ef4609845c9bce9f8aeb591d1a469b072b41209f5a8b6dc2395ad9060eb2e370978ae3311d1cf0a8f205142d436bab6b95943a97c23e61bd14b2d95672cb9325e9ab1fc9eeeaaccd58b9f4ac1550bdec8449b036039496c5f07a5ed64d5d85171690144db5c81c81cbc4c16718d52c4dfd1958ca5c9c8ba582cd9d706f27a74744c3a05bf1ccd51f1092010d36f1578b578ae0e9ffa47079055ef94fabc9ff72f738bef68461eb3404ccee953f5ee864c974ce70e9037e3388fbaf2889e1366caa0f651e21b339e3d56b9d95ac30b3592a948912c90bf54473cebc467b09a3943dcac4868acb5b35ea691eff4d8cc1cda0c6c0a9c169a4ee10041f35f433fb53d26067b291056b1da69ff46fbea1ca7213659a990d5d5df1406b093da2a33c8df95ab3ce811afb9c98c5bfd7c4e981b3ea94eefd2e2fe95707d89f307fa76828b5c6774950aee80626714256e197dc7da972158c768bbee7fbd169ec15b4bb7be72976dbed3e512766ef22ef3b812bcac4aa3115afe83d31284af8eacea4ee49afd42d9c44fff2d861c08629b55dae00ff674fb028e738b05dcb38aeaa6963cc3faafc7b69245a2a122a96dd2f03a824d72b0fe0dd798df5c4bb75a87324e764a50a5ff52547ada8f8f88e6f38aee49d58ddb012648854cd59d0ec97bc3d58d0ad4491f08590767ceb1", "signature": "a9702a3395acd20d754373095dc61445584d8e571080e179adcba3106bb06a7ce4d460f1261aef8643ab1634f47c9414a32e183a327691e65843dd6c05507207" }, { "secret_key": "bfc9626c91f348fdaf469def2302e9e38f9051e7349e48f850cf352a8331a28b", "public_key": "4e8193061c9d65a82bcb25da089b4a80ba41b3dd2f8ed1dc81e1cfd03c849115", "message": "2f11f40b2a19f640c0044c7b139680c3c3b69f00ff9f6a4186fd7ded569c1d8c5720f19dd35c7816d08a94c08204e47643e264d425e21cefb83129c909a3d78caf72c46bf1a729765ef4b8ca803fdaf8052ffc6cc4a6b579a160b703b15355c6fcd3b9a2ecbc267e60dd59f6a2b19420e55727a80b0bb64167c83ba0c805deed491d93e723f3b43263d17420b85be86c165c552779db960e0aa9eb4d9f3a164a5a21fab3f509a8f0199a6943c4b223cf9daca7e110e056a81d9ce0e0c02ac265eeac05ecd84448468a4d122b87a3e04c2837e43d212704fd41e7f3d198a2e76beca0e7029c432a0654ecd44f984c5df06741964d8372c86e162a8c5418849b41e571feb83eb42fbbcddb8a082143909eaa5012b979931dc7e3cccb44c791e04b8065ee63f0561da1bbf37bf6503477879cfbaf6d9d7d9a7475553f53535f847a76dc3b2b7a3d1d470bbe17124a88e03fe994ba10c24221e39e3d0ff53c79e2faafa19012d5ef192bc6d5260b66f997b644cf48d99f3899d7c485e684aa1e6e30855cf75c2d80c7a3ee4354fe13c676091c8667373d30e60ff8e09fedef175a1a87395fefa0722bf6c01c6555cff068892afe9486cb1fcc5fb6641e82d87079ba5d7a9c139355d6c14c507dbd594724b55351100965be9e5dbfa7708878c4b29f4d54c217746e326ab2a54f99b881d7da5b11edb08a6d79d885691b1f7085517310b309cf9b1b714aabc5c17a509b140b89b3f9dcee50cab441bf5ad3bbc29990f627406170a7a10f2d47dfc9256154f962308e769a2ab1b2a00e27e327f0d1fa164d1e38ead5ceaae238ba526f54b81b45dea6c8974186b1b6725fa4c83e62f3e254f729871bda4dc444bce78f0903fa318eaac822a95532ab019e9cfc5619e2c2067f258f4375d2e0222ea5bf96a253a2a3fa9eea02c3eeccb028c76bc60d38298b95b9afe66031b1a2a26152fdaa7ef4f837abb51185df8b2ef85ad2c9be6dfba75e37dc7d12e1787fc55f866fd066f12291dff1976afc10da913101e70495d8783348d611b011ec671c0da737bf962cdcc9e4a800b513935a56d084ea64a7d4e8e99ee9440a736132e42c909503c2224a141b25ce", "signed": "660242c1dcf3291369c65c9d7f89872eab482200e344b296e336a0a2e631fa796024b6e1119c27d52264a49815dd781927a7df467e88b801e684fc602296250e2f11f40b2a19f640c0044c7b139680c3c3b69f00ff9f6a4186fd7ded569c1d8c5720f19dd35c7816d08a94c08204e47643e264d425e21cefb83129c909a3d78caf72c46bf1a729765ef4b8ca803fdaf8052ffc6cc4a6b579a160b703b15355c6fcd3b9a2ecbc267e60dd59f6a2b19420e55727a80b0bb64167c83ba0c805deed491d93e723f3b43263d17420b85be86c165c552779db960e0aa9eb4d9f3a164a5a21fab3f509a8f0199a6943c4b223cf9daca7e110e056a81d9ce0e0c02ac265eeac05ecd84448468a4d122b87a3e04c2837e43d212704fd41e7f3d198a2e76beca0e7029c432a0654ecd44f984c5df06741964d8372c86e162a8c5418849b41e571feb83eb42fbbcddb8a082143909eaa5012b979931dc7e3cccb44c791e04b8065ee63f0561da1bbf37bf6503477879cfbaf6d9d7d9a7475553f53535f847a76dc3b2b7a3d1d470bbe17124a88e03fe994ba10c24221e39e3d0ff53c79e2faafa19012d5ef192bc6d5260b66f997b644cf48d99f3899d7c485e684aa1e6e30855cf75c2d80c7a3ee4354fe13c676091c8667373d30e60ff8e09fedef175a1a87395fefa0722bf6c01c6555cff068892afe9486cb1fcc5fb6641e82d87079ba5d7a9c139355d6c14c507dbd594724b55351100965be9e5dbfa7708878c4b29f4d54c217746e326ab2a54f99b881d7da5b11edb08a6d79d885691b1f7085517310b309cf9b1b714aabc5c17a509b140b89b3f9dcee50cab441bf5ad3bbc29990f627406170a7a10f2d47dfc9256154f962308e769a2ab1b2a00e27e327f0d1fa164d1e38ead5ceaae238ba526f54b81b45dea6c8974186b1b6725fa4c83e62f3e254f729871bda4dc444bce78f0903fa318eaac822a95532ab019e9cfc5619e2c2067f258f4375d2e0222ea5bf96a253a2a3fa9eea02c3eeccb028c76bc60d38298b95b9afe66031b1a2a26152fdaa7ef4f837abb51185df8b2ef85ad2c9be6dfba75e37dc7d12e1787fc55f866fd066f12291dff1976afc10da913101e70495d8783348d611b011ec671c0da737bf962cdcc9e4a800b513935a56d084ea64a7d4e8e99ee9440a736132e42c909503c2224a141b25ce", "signature": "660242c1dcf3291369c65c9d7f89872eab482200e344b296e336a0a2e631fa796024b6e1119c27d52264a49815dd781927a7df467e88b801e684fc602296250e" }, { "secret_key": "393b769482375b821427a66d16e4f55185b7a3b7338f1a06f67cdfa7e35c541c", "public_key": "84afd70678ffa85a9f6574cbcfe3b15d04a9fd15016ff8550a987c4b951c7122", "message": "8ae8053e03bebeae544043b8414b385364add1673737cf8ab20193d4aabc8a78e1d69b9c7e52729e69307806e927ce3807b07c68c833c4fcf16db15e7dce604d1798915fd4211689b4864642502d38e91b1997b71823318b69abe5bed6f5e3015bfb22df30db371f2260c5c22eba60df39b3edd3c4d7a1e111cd9b8aa46f67bd0cf3a717af06ec0ce567028e06e4797934ad69b1f5be440ff37a8a034b1533fa946424ac595400ad27d3be76dc89ba9d6c49939a09f2e401c8f20f7f7b4b9e63b9d55201534ab4cc7be885f0432a2c6673d2e765194dffd9b6096dd2b2843918750959a8dde4a3ab407eb2f7e1a49c2597e30805f8480dd0cc8272a320c00aa2b210f576e42577d3aa419703697ca406d43a1a4f99b0733664f6d6b2403cba1bdcc51f541cf24236070570540755c7a8631fcc2f18938fa11bc291155b39d7a762a1ff4dca97b448f70e2d3de447cb08f918ea20cb433fa115e30880c96c8cf5f0ebbcf482309db6dc1fb64e17c04d7cdf7a90f4014d15ae7696b44423b0ba084eed4d3fb28c1efb39828aca2f40ca6df342c20e95f8006b2767a83f50c31fcc1581a09753e78291f0d9931d992ad3604473ceb885ecbe7857cc52ad5585334d1485d022e106b71c29bdfcf23ee8a475df2c090532356a6ffc02232317988a2cbcfbc2a36b4b483cb44510e85599b612596b626572b0996d8a61c0ee3efff1f7c71c05fb5a8d8c5d09d924ebaac8800451c9db2456710a279dfe2d22f6aea9de31801dc742534362b0e810e99e841dbb7f0cf9af1aef542a52c776cc51f287368fbe6ad651fad5787ef77c73535f3dfb3618cc8f0dbb549ddca9b9bf91135a3456001a46215ade388e7ceb9fcdfd0d2d0a0356afbe2cec1c2e78b4d998d4554f4621f1151dd3ffd3ba4c0bc852f311758c5dca425d18ba15a8d67ca401d0e6cf280cb88384a2dad49fae39ba2a77b467b3238aa28cfd137e5c5c0ff9000f8b06a2192e162920692265db24ab6aede535e31c2093be57ebf8805df1788914f3a884f884179015808db4d3020f3e78bc34285d233762e899ebff28428215e244404de291728fbf4124ce5b2435260a8e341180075a5651e6", "signed": "31f98c0a08fda8e735b57366aa1b83b93dae63b5810c821d99cb39df521feac07f3c410b27ba3307757d6049f22454fb6de9e2c3c2438d68319097d112cfdb078ae8053e03bebeae544043b8414b385364add1673737cf8ab20193d4aabc8a78e1d69b9c7e52729e69307806e927ce3807b07c68c833c4fcf16db15e7dce604d1798915fd4211689b4864642502d38e91b1997b71823318b69abe5bed6f5e3015bfb22df30db371f2260c5c22eba60df39b3edd3c4d7a1e111cd9b8aa46f67bd0cf3a717af06ec0ce567028e06e4797934ad69b1f5be440ff37a8a034b1533fa946424ac595400ad27d3be76dc89ba9d6c49939a09f2e401c8f20f7f7b4b9e63b9d55201534ab4cc7be885f0432a2c6673d2e765194dffd9b6096dd2b2843918750959a8dde4a3ab407eb2f7e1a49c2597e30805f8480dd0cc8272a320c00aa2b210f576e42577d3aa419703697ca406d43a1a4f99b0733664f6d6b2403cba1bdcc51f541cf24236070570540755c7a8631fcc2f18938fa11bc291155b39d7a762a1ff4dca97b448f70e2d3de447cb08f918ea20cb433fa115e30880c96c8cf5f0ebbcf482309db6dc1fb64e17c04d7cdf7a90f4014d15ae7696b44423b0ba084eed4d3fb28c1efb39828aca2f40ca6df342c20e95f8006b2767a83f50c31fcc1581a09753e78291f0d9931d992ad3604473ceb885ecbe7857cc52ad5585334d1485d022e106b71c29bdfcf23ee8a475df2c090532356a6ffc02232317988a2cbcfbc2a36b4b483cb44510e85599b612596b626572b0996d8a61c0ee3efff1f7c71c05fb5a8d8c5d09d924ebaac8800451c9db2456710a279dfe2d22f6aea9de31801dc742534362b0e810e99e841dbb7f0cf9af1aef542a52c776cc51f287368fbe6ad651fad5787ef77c73535f3dfb3618cc8f0dbb549ddca9b9bf91135a3456001a46215ade388e7ceb9fcdfd0d2d0a0356afbe2cec1c2e78b4d998d4554f4621f1151dd3ffd3ba4c0bc852f311758c5dca425d18ba15a8d67ca401d0e6cf280cb88384a2dad49fae39ba2a77b467b3238aa28cfd137e5c5c0ff9000f8b06a2192e162920692265db24ab6aede535e31c2093be57ebf8805df1788914f3a884f884179015808db4d3020f3e78bc34285d233762e899ebff28428215e244404de291728fbf4124ce5b2435260a8e341180075a5651e6", "signature": "31f98c0a08fda8e735b57366aa1b83b93dae63b5810c821d99cb39df521feac07f3c410b27ba3307757d6049f22454fb6de9e2c3c2438d68319097d112cfdb07" }, { "secret_key": "26cbc2510ee6ea390a2cb948a015d131abf4c0954915620b7816aecf4e11da6d", "public_key": "145e8dd22b4400289dafb626d95a94c2f3b69c65197717cbdcd85098c5492107", "message": "9cebe24b4f8ade86430e279a3c433e4ae17e008852a24f08690cbc3d75e3b7f200da897c25f7483b37637d4bc11008d9224cd581fbc038adada02d271ed2a5d285d843a0f8b79e37945dc35bc264becd804307e1d44218a643e4b59a9311de985d24b4c26fb14603be5dba1839ee0c8d2ede6cb50af67c804519037b1b1663318cfc6e75d0f051dbb5d3eaf3aad1f78ef0cff48d5c55b2fd25db1539d0f02dae9f25148a8d338b97879bbd39df961aa2c396315a2a86cc783581e67ea844acfe8645428a27b8d32ea3064e3bf62dcf58010ec4348862fac25e3d9fcd4e5d65be59905d816dfb964992ba7aceef8c2075a312e5ffc4f9530ea20f77f93e81cf8a019dc3945634364babf79772045a0dbaa77c47a22b77223b704debd2d003f6a5c7bf6b19cd2c49b614fd4d47fd251fe622cb981785c146bdb7c1d2ea02b116923bf98a1afbb7858adf2df938a790ec1f9074adb8d1afb5633fa961a84764010d3bded1c033d25abdb4b00fb05ed7640fae61879df88f0b09e3abd057b9a52108a9bc985fb73a5f29d84d1ca6921b62f1b703c7eeb4815d9dd6d066738db118baf61b0422f388f1bfc9e3a9bed83a1a727dcc266a9988364846807f4d5518bc2edd0ecb3413c26fd0c79b75d8cb5bcd85c06fccea4d03fb8988dff3ed0cc9dbae78d6ae8d5fc4024617a23f52bd615385d4eee08f9134eb3b250c8f822b47d91e8c4d4c29298016e6fc81f1f1099253d7945e0798955da0dde14ebb934ecfaeeabae87883e1cc398067400fe462a2c4e9f232db5cdd61eba949188cf01b238be7ada938f002dc3ae31fdfd425c8d46ea032323aaf20dd3de2507d36bb45fbb91c40969a9e5da20f7f936b0f4b137b62fe2ba3a667bc0362d93fc50d3f2295e167fcbab0fb3a39b7cb024b578f9490f734b28c9ccf7192f183947d5a513efa4916e4d82b2ab4ba7ec2ffba213ce82ad6ed3b10e48553e733c940aa9b9ce71337c6c2805dfb8dd6618b6d4090a3d6cc963ecea26d1cdc2bf5ac999c11276168a931d816469d79083c24081a50dcbd222752385267ce1bfc1db76b1554ad57e34752b7f8983147c116d4a3fae6f6d57e654fedd7378d2b4989ea", "signed": "6710d0dd00545b444cf714b79144fe79f38cb1c0f5b74248d4f01fe360117a26ffed4a3bf21323b28a393ae9dee07d69e583e316c6a573d37c644a8d62c405069cebe24b4f8ade86430e279a3c433e4ae17e008852a24f08690cbc3d75e3b7f200da897c25f7483b37637d4bc11008d9224cd581fbc038adada02d271ed2a5d285d843a0f8b79e37945dc35bc264becd804307e1d44218a643e4b59a9311de985d24b4c26fb14603be5dba1839ee0c8d2ede6cb50af67c804519037b1b1663318cfc6e75d0f051dbb5d3eaf3aad1f78ef0cff48d5c55b2fd25db1539d0f02dae9f25148a8d338b97879bbd39df961aa2c396315a2a86cc783581e67ea844acfe8645428a27b8d32ea3064e3bf62dcf58010ec4348862fac25e3d9fcd4e5d65be59905d816dfb964992ba7aceef8c2075a312e5ffc4f9530ea20f77f93e81cf8a019dc3945634364babf79772045a0dbaa77c47a22b77223b704debd2d003f6a5c7bf6b19cd2c49b614fd4d47fd251fe622cb981785c146bdb7c1d2ea02b116923bf98a1afbb7858adf2df938a790ec1f9074adb8d1afb5633fa961a84764010d3bded1c033d25abdb4b00fb05ed7640fae61879df88f0b09e3abd057b9a52108a9bc985fb73a5f29d84d1ca6921b62f1b703c7eeb4815d9dd6d066738db118baf61b0422f388f1bfc9e3a9bed83a1a727dcc266a9988364846807f4d5518bc2edd0ecb3413c26fd0c79b75d8cb5bcd85c06fccea4d03fb8988dff3ed0cc9dbae78d6ae8d5fc4024617a23f52bd615385d4eee08f9134eb3b250c8f822b47d91e8c4d4c29298016e6fc81f1f1099253d7945e0798955da0dde14ebb934ecfaeeabae87883e1cc398067400fe462a2c4e9f232db5cdd61eba949188cf01b238be7ada938f002dc3ae31fdfd425c8d46ea032323aaf20dd3de2507d36bb45fbb91c40969a9e5da20f7f936b0f4b137b62fe2ba3a667bc0362d93fc50d3f2295e167fcbab0fb3a39b7cb024b578f9490f734b28c9ccf7192f183947d5a513efa4916e4d82b2ab4ba7ec2ffba213ce82ad6ed3b10e48553e733c940aa9b9ce71337c6c2805dfb8dd6618b6d4090a3d6cc963ecea26d1cdc2bf5ac999c11276168a931d816469d79083c24081a50dcbd222752385267ce1bfc1db76b1554ad57e34752b7f8983147c116d4a3fae6f6d57e654fedd7378d2b4989ea", "signature": "6710d0dd00545b444cf714b79144fe79f38cb1c0f5b74248d4f01fe360117a26ffed4a3bf21323b28a393ae9dee07d69e583e316c6a573d37c644a8d62c40506" }, { "secret_key": "b1f59e3c2380d7aa414d0bf90893a38dddfc293859303d16f00d9eae6cb3450e", "public_key": "84e3f5f72f19095b0f533848a5a91d0f0743b8e3a3e2f52fcbd7ebe7c5b5a998", "message": "c6174c9ad3685dd648636017837b8d992200319e9a5a0d26d94d2da75e2c3aff46f42d7b3aba472b7f860b0fe1f695529731fdc8cf0da705d1d09acad04f010837ecef419d57e9ea6cacf168c5215696f471f3caa897607c629d443de099d31753c24677d8d75f4bf17246818b58adc0424b762a191ef39a7076a5ad12614cf54c47eb0908bb866518c5fac1ca2d2e5b657520a2b3695c6fb360f16f4ab357998e4c0e97231d6f89c968dc29ecc1aa91fa0d7543b5d2247b0d85e48743ab7cc815cfdaa82bf68ca6d3e2250bfda27024d61b474c6b8154ac8d1b5a36209782515c1646680d37069b8b4412f951b025a4d543625dd02290bf03c6734613f99b7a4c3af5c5f9e9ac3474465e648423018d40a6adbe88a3301d3d259b04ee44cc0562ee0ded4f5e26ad977ab5631f85768dbce53f616c029a8b8f933e2a9264b1c81f517e9ff58ab9f45a23eeed4204358f8fff0c8f975ef1dfa5776a5f7793bae2f281d7b0cbef240b3fc6be058821ea2b800fffe55a7de0afc93ede9c60c8de005abb9a2c88f4e61e8deb3170f1078a36e2d8f2a58239bdee496e90d137d2110f0ad857a88b3527664f781939e0b2f76634ff9f6c57e1c43f58243171cd862ef4284576172af1f6c3bd37d5d74b28a7a98698bd74e57bbc142e67f703f9d62cde761a02268fecb343fc01418836414f1222ca24bcdd69d005901da2a0f94465e4d4ba68898816bf7e3e4bb79c8ca5997fba9a8df84faa2d24b044c4ea61029a46cba703421e361dfa52caaff3bbaab7fd753f2856d7c083aeb9768da11d821e2d309f7a735c399692dac2f262846b891bf6461af23c8c7ce1d4d9032c3c140f739e5584c36f05eaf4349ff4545f283a4e0fea49430a1b180d0871e3742b88ccb591124fc427ed673b5f27b0b0a6f54af22ba4a6d1c6c1db2a1fcaa6d8a0308b77ef2d0c61bbf51b95f1e8b6abc5041d97b6b6f1b569b3f63cec05cb567aaea106727096ee8a9ea87b8804901f7e88a7409c66f152de9dbfcbe31952e6fd83b2877a775fae425b3851e0eff8792ffb3848f84a65cc317253b272475e717e49e9c6ff6b7859d11bba7c4428c82d1789e0dca5bcadca2fdb259e98", "signed": "60afc1e991fdd27cc472b9acc9d405b4d2b913089290b311c4fa891ae2eea05671fde7a0ef86557bd867d1c0b747caf35229d6ef528fe3e0d0bcf630380ea90ec6174c9ad3685dd648636017837b8d992200319e9a5a0d26d94d2da75e2c3aff46f42d7b3aba472b7f860b0fe1f695529731fdc8cf0da705d1d09acad04f010837ecef419d57e9ea6cacf168c5215696f471f3caa897607c629d443de099d31753c24677d8d75f4bf17246818b58adc0424b762a191ef39a7076a5ad12614cf54c47eb0908bb866518c5fac1ca2d2e5b657520a2b3695c6fb360f16f4ab357998e4c0e97231d6f89c968dc29ecc1aa91fa0d7543b5d2247b0d85e48743ab7cc815cfdaa82bf68ca6d3e2250bfda27024d61b474c6b8154ac8d1b5a36209782515c1646680d37069b8b4412f951b025a4d543625dd02290bf03c6734613f99b7a4c3af5c5f9e9ac3474465e648423018d40a6adbe88a3301d3d259b04ee44cc0562ee0ded4f5e26ad977ab5631f85768dbce53f616c029a8b8f933e2a9264b1c81f517e9ff58ab9f45a23eeed4204358f8fff0c8f975ef1dfa5776a5f7793bae2f281d7b0cbef240b3fc6be058821ea2b800fffe55a7de0afc93ede9c60c8de005abb9a2c88f4e61e8deb3170f1078a36e2d8f2a58239bdee496e90d137d2110f0ad857a88b3527664f781939e0b2f76634ff9f6c57e1c43f58243171cd862ef4284576172af1f6c3bd37d5d74b28a7a98698bd74e57bbc142e67f703f9d62cde761a02268fecb343fc01418836414f1222ca24bcdd69d005901da2a0f94465e4d4ba68898816bf7e3e4bb79c8ca5997fba9a8df84faa2d24b044c4ea61029a46cba703421e361dfa52caaff3bbaab7fd753f2856d7c083aeb9768da11d821e2d309f7a735c399692dac2f262846b891bf6461af23c8c7ce1d4d9032c3c140f739e5584c36f05eaf4349ff4545f283a4e0fea49430a1b180d0871e3742b88ccb591124fc427ed673b5f27b0b0a6f54af22ba4a6d1c6c1db2a1fcaa6d8a0308b77ef2d0c61bbf51b95f1e8b6abc5041d97b6b6f1b569b3f63cec05cb567aaea106727096ee8a9ea87b8804901f7e88a7409c66f152de9dbfcbe31952e6fd83b2877a775fae425b3851e0eff8792ffb3848f84a65cc317253b272475e717e49e9c6ff6b7859d11bba7c4428c82d1789e0dca5bcadca2fdb259e98", "signature": "60afc1e991fdd27cc472b9acc9d405b4d2b913089290b311c4fa891ae2eea05671fde7a0ef86557bd867d1c0b747caf35229d6ef528fe3e0d0bcf630380ea90e" }, { "secret_key": "db461b9f707eb2cd7748c44c99562f1302397489353df5f303797fe0d0b58de1", "public_key": "635116da8ba5a36a377728e28618e75c5592aecc18e34011c4c42591970b7366", "message": "1a2ac8c1b9ea099b831a6812d2b4261309058ea5883d70b1c607b9cd3fdfdb86e79902b0fe89e80ea7c478207674b2d803b0b9ca147ffe62e594f506c796d68997ce482b51a46e49b4a5d858cdeae2c6ec9b694198e6822f0e33ed57bedb0335c7890a72a7ee3c23823be79b7f9471e033c79aeed52e5760fb0ccbb9d38fded8b47383c19103ce44705834c59ddd86f7033948612d6662f516ce4e399ff20363cc7281a69b2d5c307b10b704150184ece32f390d772ccfa78483bb77a9fba84425366984171cc2bb60b0ec6c628d4e9030746dac1cabca60f05683813346a1a5bc14727549795c1c926869e1aa25093d591b43e086e43a04d170d942c4165e1c5ce76c3e64973d9136f9325bee821682f1043e951b02767f3fb458d02449add3e8a66e516fdb1ed580e056e0f78ee33fd9ee3280912fae07fe1ea02527cd001d6f6f2f89ee649f517414d56f57359a846891f0222c321d7e70817995a8cd8e94760b6e74832bab68d55bc4641884221fd29f122d87a9a868b6a6060c87b2382cf7bbdda4cd6aaa1bbc8e6d634ab580c865f5add6a1d54e61a607dc2c37b08a8cba6e610c12cfebef9c989eef3b782acbd1bcec5f04e835ca101298b5e9bdd8813a71b0d469fcf12727d3de1c3f97ddbc6ab2658440dd6421019bc68f356d6f25536865851d92d90fe9969c3b7c35a2e88ce153476ec3973af9359f1677a4caf1cc481c71bd90228ff5fc6dd83b8a699ffe514929f5c95cb4f04b00dd18a2872c41868d3beb76498ddc9234b63f599d7071801db2c2878f7bef4ffddd813226f06db84eb30217a7183082e3c1242bb6d01cd3a6ce27bff16bfbfdd75b7e5104312c49c43aadfcd5b4edba0ff50d2890ca3cd9cca33e4fc694c057c47ebe1c20a4ad115f985dc7442c6f6da7be530b6902289cab9ca139c6b24cb80ffdd782324e602c45910db63d8b5c44ca29d27f56dbf00186ba583c34e16031df357546b3ab9a3dd65e91d7128c939195e646a0f0b89bf5df04ba233d6a12a271f7e04aa45cda99b4a55a21cbbb738515e32c56aac2496232b1008a6761c8045a1fe0f9a3644047b5966a58a600466c1b1d11ddad5aa573c43ebda887e16a05", "signed": "dd049ca79beb9eac325acf44672ff578a968502fe1bcf5ea19d52c0f6778c7f1c7bbf742747907786e608123911a920778d2f9596fe29be7cc28fd009d7c440e1a2ac8c1b9ea099b831a6812d2b4261309058ea5883d70b1c607b9cd3fdfdb86e79902b0fe89e80ea7c478207674b2d803b0b9ca147ffe62e594f506c796d68997ce482b51a46e49b4a5d858cdeae2c6ec9b694198e6822f0e33ed57bedb0335c7890a72a7ee3c23823be79b7f9471e033c79aeed52e5760fb0ccbb9d38fded8b47383c19103ce44705834c59ddd86f7033948612d6662f516ce4e399ff20363cc7281a69b2d5c307b10b704150184ece32f390d772ccfa78483bb77a9fba84425366984171cc2bb60b0ec6c628d4e9030746dac1cabca60f05683813346a1a5bc14727549795c1c926869e1aa25093d591b43e086e43a04d170d942c4165e1c5ce76c3e64973d9136f9325bee821682f1043e951b02767f3fb458d02449add3e8a66e516fdb1ed580e056e0f78ee33fd9ee3280912fae07fe1ea02527cd001d6f6f2f89ee649f517414d56f57359a846891f0222c321d7e70817995a8cd8e94760b6e74832bab68d55bc4641884221fd29f122d87a9a868b6a6060c87b2382cf7bbdda4cd6aaa1bbc8e6d634ab580c865f5add6a1d54e61a607dc2c37b08a8cba6e610c12cfebef9c989eef3b782acbd1bcec5f04e835ca101298b5e9bdd8813a71b0d469fcf12727d3de1c3f97ddbc6ab2658440dd6421019bc68f356d6f25536865851d92d90fe9969c3b7c35a2e88ce153476ec3973af9359f1677a4caf1cc481c71bd90228ff5fc6dd83b8a699ffe514929f5c95cb4f04b00dd18a2872c41868d3beb76498ddc9234b63f599d7071801db2c2878f7bef4ffddd813226f06db84eb30217a7183082e3c1242bb6d01cd3a6ce27bff16bfbfdd75b7e5104312c49c43aadfcd5b4edba0ff50d2890ca3cd9cca33e4fc694c057c47ebe1c20a4ad115f985dc7442c6f6da7be530b6902289cab9ca139c6b24cb80ffdd782324e602c45910db63d8b5c44ca29d27f56dbf00186ba583c34e16031df357546b3ab9a3dd65e91d7128c939195e646a0f0b89bf5df04ba233d6a12a271f7e04aa45cda99b4a55a21cbbb738515e32c56aac2496232b1008a6761c8045a1fe0f9a3644047b5966a58a600466c1b1d11ddad5aa573c43ebda887e16a05", "signature": "dd049ca79beb9eac325acf44672ff578a968502fe1bcf5ea19d52c0f6778c7f1c7bbf742747907786e608123911a920778d2f9596fe29be7cc28fd009d7c440e" }, { "secret_key": "f5c0a7f8f6584c5d2f2e1d0810e8e86103e4e2d45cf9a721d8c47f67493396a4", "public_key": "3c6d6cce49633141078696131a8d84ed823f30664b289af9dd30c6407f6f0313", "message": "d68abc609a7a0ce256699eb17043defe1eb822c9708f65718a06581fab2110ec2db09213bb9e0f3612ce4a3f8fdbe757a9f0eb2c3eba438a9088b18f6c5caabbe5c82f7a9ab2fecf0f5859d175e139263033742458f82a6f38756cd5bcdf9e0736db2cab20a0cd3f0f1cdbea8556d84909358dd8f69f0dacd49abf8ac1bfe75940d6939e6a55385b5ace7ce1fde120679ab6ea7a89d14268d29ffb46df105bf3909242c6605f3e3e2ab7448937d6db2ba054c7b14f432db41dc18a5b957336b7f52d978ec03e7d5764e9bd2f4b68958d937bf29823b27efb31e25b43925c4dacbe6718a60fea3b3270e7b76b0de0e70f7fa3c12c215ef72b95dc1b5276238179dfc52fc48859649fa582d05a60df68599a1ceea64f6412d3f8498ae2cedb124245883a240bc0851f0e324965be120486e1ea89a0182dfa8eabd3b8fa66a99c51491389f3c83a3cdb4267f3e4dbc98f0c44856b044dc88d90eeee8415bf73de171afe84be9035e0dc4c80cf0422469fe0c9bd1c6aa654a59b5e34eed351cda2871269ac478e8d382e740e9ac7ab4ddc4c0def0aeab797b6f1a427b8e4a8497a0b9797dadcd35c414fd55b783130f6cded38a44c1a89288307eb8425484137a8aedb030d54b616a82e3c5acffb08d6cc1a61745c29afc68a0c1838b139159c5fa6674d66b9e338115aad4b1b4710aa5d9517bcf7e1cb12d4e6a51c11789fdcae9d9bbe78f69a33e52df1833c876b02687a404facad32841cb2d52554e7b8e2209e3f88fd948c1ecf83957c96f43b034beda6c476096bcb09301ad61f8367cc43e156131862b42ece285bec2dcc2d02d094d042a16072eb22ab9888013be82371569400ec1f8ec7e79108c41b853365268fa4cfbc62c4ac12cc98d2ec38a87d6085859567c0f27d6d431a046e88a9815558660705fd05eb06c6c05e5b7d62347ceee27dffed7141540d608cb975075a9644acc6328439f9fa682b226b186154549011c3b0f0ff4f74caa71c1944e4cb836ce851d9b5d9e727c553e3c723cf98c273e5675cab899bb66f4633a76dea357341f983c53d9158ad319ada75408b41c06f26b7435b80dc3bc0aaf22a833ddedcd6785c87d196b0af2c9a43d1", "signed": "d4c30a48c4523b1f84b14b657af8f859755bba6359988b675c6d85ddf35462820da476d84f6c402e65b020d9e8a2c285c16708ae58d1f8dbc65782a898a66508d68abc609a7a0ce256699eb17043defe1eb822c9708f65718a06581fab2110ec2db09213bb9e0f3612ce4a3f8fdbe757a9f0eb2c3eba438a9088b18f6c5caabbe5c82f7a9ab2fecf0f5859d175e139263033742458f82a6f38756cd5bcdf9e0736db2cab20a0cd3f0f1cdbea8556d84909358dd8f69f0dacd49abf8ac1bfe75940d6939e6a55385b5ace7ce1fde120679ab6ea7a89d14268d29ffb46df105bf3909242c6605f3e3e2ab7448937d6db2ba054c7b14f432db41dc18a5b957336b7f52d978ec03e7d5764e9bd2f4b68958d937bf29823b27efb31e25b43925c4dacbe6718a60fea3b3270e7b76b0de0e70f7fa3c12c215ef72b95dc1b5276238179dfc52fc48859649fa582d05a60df68599a1ceea64f6412d3f8498ae2cedb124245883a240bc0851f0e324965be120486e1ea89a0182dfa8eabd3b8fa66a99c51491389f3c83a3cdb4267f3e4dbc98f0c44856b044dc88d90eeee8415bf73de171afe84be9035e0dc4c80cf0422469fe0c9bd1c6aa654a59b5e34eed351cda2871269ac478e8d382e740e9ac7ab4ddc4c0def0aeab797b6f1a427b8e4a8497a0b9797dadcd35c414fd55b783130f6cded38a44c1a89288307eb8425484137a8aedb030d54b616a82e3c5acffb08d6cc1a61745c29afc68a0c1838b139159c5fa6674d66b9e338115aad4b1b4710aa5d9517bcf7e1cb12d4e6a51c11789fdcae9d9bbe78f69a33e52df1833c876b02687a404facad32841cb2d52554e7b8e2209e3f88fd948c1ecf83957c96f43b034beda6c476096bcb09301ad61f8367cc43e156131862b42ece285bec2dcc2d02d094d042a16072eb22ab9888013be82371569400ec1f8ec7e79108c41b853365268fa4cfbc62c4ac12cc98d2ec38a87d6085859567c0f27d6d431a046e88a9815558660705fd05eb06c6c05e5b7d62347ceee27dffed7141540d608cb975075a9644acc6328439f9fa682b226b186154549011c3b0f0ff4f74caa71c1944e4cb836ce851d9b5d9e727c553e3c723cf98c273e5675cab899bb66f4633a76dea357341f983c53d9158ad319ada75408b41c06f26b7435b80dc3bc0aaf22a833ddedcd6785c87d196b0af2c9a43d1", "signature": "d4c30a48c4523b1f84b14b657af8f859755bba6359988b675c6d85ddf35462820da476d84f6c402e65b020d9e8a2c285c16708ae58d1f8dbc65782a898a66508" }, { "secret_key": "1ab946c0c1aebf9ca37c2f4e2a4b337d5b1ebccd24734c9cb2a1608c881e5757", "public_key": "9afc63dfce0d489b40907aeed6dffe4cd8ef5a6ffa22989556445cbf9b3519c2", "message": "9bb071b62c04064b0c96e243dd198c39717b25c99448c2c002b84a99204c5a6e23b4b912028675bfdc4df93c5b2fb80881a23e0d44ba18bde99121eee86adc6f842819d6ebc7a288992da3285805a8b8b6fbcd2267b686b3e1bf7960b45f244f852e82492944e3d618bcc4514c17f722ba49aca7f2f3bb4e91f940e9cef015650c3e40b0c855a17c42f11e3a34acc85287dbe0f9093c00373d50c0b3064a5a5f2b1e89206517528295fd871703a8e762b5e76fb9b7473d2149b85b9461f5587ed7e7fc8b50aa09876deeb6e237078502142cec6bddc70140fe1d1f1658d5d3e910fd7036a2f924b499db1756f7c8ce0d5f0d045b39bc81c5c2f1a761f52ff393e0649b8db0bd8854bd026be2c7c3cd63526ba5a80d48335f033832d63376071b6308f05960cb3fc9fac932edd8376dae51f2c661f75b7c6f4ac856753aca62062877609fc4a0ff60670282c05e882d1a035bf9890cab296ac7a8df244c56f490250f020054b8af51be4fc318beba506232bf45e17f5c740cf09d37515a8bc894bc955c8a460877c7854f8be363b21933e16287ae0cb70f222d4e36b8b424975559bb4bfc8dd1d51b3c0faf4a53e302196f9fedb53287d09315dfffa2bc4b3acff137f9a76d6856217f79cbb25433fc97899fd6540f18088e84417e4833e4a91aaba4658ae9ad7f760dd9c5b7191a0d3c05541b83c025a7992138e6d1080da14c2c887c6d670aab374d436c272f9e96f85a9c423379c0d47c46df6de334ea2057158d33231e1426a66d3c70827aad5511b846e03b94923d5f94baf1f8cf11a861373a5b80ad5e317ec2a529e94e636cdc3aa29e5dac205a0c13f68fb198cf9456e6390aead4d9782a1038f6478d339a81bae7af2a04151c2f22e8d39fe071e1a52168d57c84c36293413f8e6ff6934f05e7efad6fa120c8c1c38ad1886a3d00bfc306459203c02cdf4f06652bc8fa0e8b9cc779d43fbb789e7dad5dc99f41d4cc588c1b65426a4e77389edd04977578f8f316bcdd9461d666472cdd276aa569721c65232256ba1cf0e7f5ea55321729bb0e0386a77b865532024696eddef485b7d7b28c1573b9347e414d4261995482e3b312de1331f84e7548607a84", "signed": "bfabdea41810a53f8e527acd66ec106ce2ae1a67ff6a9b522e0f08fbbf1252682cb3a1dcc875601944cb88000f72e13907007903a77cd0db0316d419ac38c2049bb071b62c04064b0c96e243dd198c39717b25c99448c2c002b84a99204c5a6e23b4b912028675bfdc4df93c5b2fb80881a23e0d44ba18bde99121eee86adc6f842819d6ebc7a288992da3285805a8b8b6fbcd2267b686b3e1bf7960b45f244f852e82492944e3d618bcc4514c17f722ba49aca7f2f3bb4e91f940e9cef015650c3e40b0c855a17c42f11e3a34acc85287dbe0f9093c00373d50c0b3064a5a5f2b1e89206517528295fd871703a8e762b5e76fb9b7473d2149b85b9461f5587ed7e7fc8b50aa09876deeb6e237078502142cec6bddc70140fe1d1f1658d5d3e910fd7036a2f924b499db1756f7c8ce0d5f0d045b39bc81c5c2f1a761f52ff393e0649b8db0bd8854bd026be2c7c3cd63526ba5a80d48335f033832d63376071b6308f05960cb3fc9fac932edd8376dae51f2c661f75b7c6f4ac856753aca62062877609fc4a0ff60670282c05e882d1a035bf9890cab296ac7a8df244c56f490250f020054b8af51be4fc318beba506232bf45e17f5c740cf09d37515a8bc894bc955c8a460877c7854f8be363b21933e16287ae0cb70f222d4e36b8b424975559bb4bfc8dd1d51b3c0faf4a53e302196f9fedb53287d09315dfffa2bc4b3acff137f9a76d6856217f79cbb25433fc97899fd6540f18088e84417e4833e4a91aaba4658ae9ad7f760dd9c5b7191a0d3c05541b83c025a7992138e6d1080da14c2c887c6d670aab374d436c272f9e96f85a9c423379c0d47c46df6de334ea2057158d33231e1426a66d3c70827aad5511b846e03b94923d5f94baf1f8cf11a861373a5b80ad5e317ec2a529e94e636cdc3aa29e5dac205a0c13f68fb198cf9456e6390aead4d9782a1038f6478d339a81bae7af2a04151c2f22e8d39fe071e1a52168d57c84c36293413f8e6ff6934f05e7efad6fa120c8c1c38ad1886a3d00bfc306459203c02cdf4f06652bc8fa0e8b9cc779d43fbb789e7dad5dc99f41d4cc588c1b65426a4e77389edd04977578f8f316bcdd9461d666472cdd276aa569721c65232256ba1cf0e7f5ea55321729bb0e0386a77b865532024696eddef485b7d7b28c1573b9347e414d4261995482e3b312de1331f84e7548607a84", "signature": "bfabdea41810a53f8e527acd66ec106ce2ae1a67ff6a9b522e0f08fbbf1252682cb3a1dcc875601944cb88000f72e13907007903a77cd0db0316d419ac38c204" }, { "secret_key": "04bb887a8a3184ffc7ea09c9bc7c1f7c3411556a7c7c398cb8b2d98ffd9ee866", "public_key": "6ab1e4ae4aa0d38989aeefa805b578806e2e971ac7ac05409958bfe60071f4a7", "message": "b7ab0c8163f478c6cabf2bbd7ca37cb02456d76e527eea1b0d26db242e37877632985a3e3ca41b52e21d79017bff81ee551ad72af277b410e42af822c608cd69d00bf440b75b787a8c915d70b6c6376c3f67fa64d612a1b449a7e2134d9c23230157d576e06a66a8422a611e2a0f097286c199ea2a162861864bd035076ab20bbae2b4408a2c6433cb23433a889fe6598f47be53bbd2c80f07a8fccb8aae511161e609da4d180acea544811e9449c5dc2250e3e5a0cd41da33a2da632e6038bd86f16d5b7c1be49fc6db499076ca91f7aa028fe38529700b21d072d2b75dcc8b43781d4bc4d3bb584d9da01c3ecc85b1e93fce045dadceea5106468bdfe5f70d66a4fad60e4fb864ec15ea50f6cb797223c8c756f7a1931a39464ebbb9679f6b01687c174eaa32b968b9cface8c167120aa7bd0242f003a0c377702551b30da2488eb2944052934aef4bfe115f0ab7405a3d5fa9bd796b371742bc114a9bf28c5bd25626295ce261a6a83ef60b77d2d32dd7105fc83664aa89765b3f8191eeeed878f2ebff2fb97663a61877c093933bbd0731e63757571b0e37cac99ed01fd214cbd4feb977e856e0a1a7ef0c408c20e0ddaf1fd8f028cfa08c850fa7090dca8cdde0cb6903da18c6290c66a1c0ae0a084bf250c51a9d035e5b16ec616636afb9b5bce36a775fe2175bcc2ee07220834eeb31caee50e9f8063fb1fc8468ae25e3966789a6d8dffe08a6f7a1e6726f93ae7482de0262bb1f8de0c95a99ecb95684d44b3f1a332a18d2cd3dcf253c33d735522f796b651c9a633a8ebe95d02bc0465825ee541a7d927bb5b90a6db5499f8d993ab404b1650b75e792a7c834eb41f0470138b0f578a04c9ba5ad950ac7c9b5d328f3408b645ad9c6bf196dd961445596bc78f284b8914b2a8cf9b7bd3a716d8f144bb6b15d831023713b5e41fda9b587ff9d6cc43c08d35a707f495283e1ace960487e7f02b7543b68a731a29bf3be14b6e9c37174a9f46f561199dbd27b46bfe62243e0c11c0edf13b64f411c8e8eced35d8428f79f10eacffb7234e546413d1eb0fad88c0e938593b43b5ee0e4285d4dddf5295dbf1a3ddbe9f4134dd76d3de70462c2f04fe0aebdf59a", "signed": "cd84f55e5ef4531924c5a2181ec87a64541388c1059406bc07d53157a168e203cc8aa0f0069d53ff58a95b8a8caafdad26363c7d0f8045c4359e97b43602c606b7ab0c8163f478c6cabf2bbd7ca37cb02456d76e527eea1b0d26db242e37877632985a3e3ca41b52e21d79017bff81ee551ad72af277b410e42af822c608cd69d00bf440b75b787a8c915d70b6c6376c3f67fa64d612a1b449a7e2134d9c23230157d576e06a66a8422a611e2a0f097286c199ea2a162861864bd035076ab20bbae2b4408a2c6433cb23433a889fe6598f47be53bbd2c80f07a8fccb8aae511161e609da4d180acea544811e9449c5dc2250e3e5a0cd41da33a2da632e6038bd86f16d5b7c1be49fc6db499076ca91f7aa028fe38529700b21d072d2b75dcc8b43781d4bc4d3bb584d9da01c3ecc85b1e93fce045dadceea5106468bdfe5f70d66a4fad60e4fb864ec15ea50f6cb797223c8c756f7a1931a39464ebbb9679f6b01687c174eaa32b968b9cface8c167120aa7bd0242f003a0c377702551b30da2488eb2944052934aef4bfe115f0ab7405a3d5fa9bd796b371742bc114a9bf28c5bd25626295ce261a6a83ef60b77d2d32dd7105fc83664aa89765b3f8191eeeed878f2ebff2fb97663a61877c093933bbd0731e63757571b0e37cac99ed01fd214cbd4feb977e856e0a1a7ef0c408c20e0ddaf1fd8f028cfa08c850fa7090dca8cdde0cb6903da18c6290c66a1c0ae0a084bf250c51a9d035e5b16ec616636afb9b5bce36a775fe2175bcc2ee07220834eeb31caee50e9f8063fb1fc8468ae25e3966789a6d8dffe08a6f7a1e6726f93ae7482de0262bb1f8de0c95a99ecb95684d44b3f1a332a18d2cd3dcf253c33d735522f796b651c9a633a8ebe95d02bc0465825ee541a7d927bb5b90a6db5499f8d993ab404b1650b75e792a7c834eb41f0470138b0f578a04c9ba5ad950ac7c9b5d328f3408b645ad9c6bf196dd961445596bc78f284b8914b2a8cf9b7bd3a716d8f144bb6b15d831023713b5e41fda9b587ff9d6cc43c08d35a707f495283e1ace960487e7f02b7543b68a731a29bf3be14b6e9c37174a9f46f561199dbd27b46bfe62243e0c11c0edf13b64f411c8e8eced35d8428f79f10eacffb7234e546413d1eb0fad88c0e938593b43b5ee0e4285d4dddf5295dbf1a3ddbe9f4134dd76d3de70462c2f04fe0aebdf59a", "signature": "cd84f55e5ef4531924c5a2181ec87a64541388c1059406bc07d53157a168e203cc8aa0f0069d53ff58a95b8a8caafdad26363c7d0f8045c4359e97b43602c606" }, { "secret_key": "9776a467fa1400735412a79b495f9fca078ce1d87a8530d85c26055d3a394488", "public_key": "c7dbe0e41c0a31c0942793ffd142d8b95cc82e5caa92a379ba23f644edf224da", "message": "d78553a1b7055b58b213101b1c84c53e164e39c6e9d36db43f30e19e2a125a9a67709eafef964fa5bab7261ddb3a8a0188457dfbf5159c40e51da8208483245781d7131e23a8bee5e506331816b9deeefe6e556e3f0c95c668d1bedb7da635065458ad20467012f59f171352068020ce3c75878693f6437bc4a09f13b9b0f0cddaf1691b872f82008093ebfbe233d0313e72c8632d7d1793f0b81c7688f54470330f04e64860e6446bfc6d96c87569bf182f0f4385af485d4299cac04e06ba473465566c477f07b9db277ab4a9de2fb2ded0a5011cd06d675c0800b34f55bcf3ec72d21ca150c8bf2361287be81efabb96d8688a1dee3f430f06f637dfd06f151464a05c95f5fe76af2e06d0123f6948a26b3be835045aa268cc1be976697107770208a7568f025c2d53c719e524cc369d9b4a337d8fd1ef345b9bca57fbd7b65a6b997cad3fce4cf06f2ca43ebe2986d09682d47c922b2cb7569d98de97a6164f5470eec71ceda520ccec7732bd01689ef81656e9f6d0c58a895558aee863f5469e7ab97915bfe0b80a064c659b183031f7f1a86fb11a9d528c2815dcaa2f0dec3d21a882e106e20493ee0acb7708eaa2912574ae97bb288b41fc0925053a29b0bfbc0ebae8d63cc0b46e3738046c5a202530bcb15b187a72854aa2d8a7a76c89a89a5db46032074e1bd7de77ef2065a08f389d783cf759ebd5a63a44d919f948f560c3e94c4239e274e051a20485a430cbd529f313d9f7ed679a34187b24f8413087a9021e4731730f5f461fc5aad6654dfa1c0504d26124707e63ee57f931b2785908f86b104b3ecb96000251d06ce1fa45e4cd6df91ac15bbf7ca3c3eb8ee0827612a29ecb7a36d5470c40505182fa9ac913570d0c1050d9a43455cb7bdc17d169805f018956f854f8919bbfb719e1867b36a64aabcdb807f48dccc0672f67887450b3f3e958d78499e0d1ab368aa49442e5e8a332bffd44c169ea67629c85724db6f1586b6c6b5be4864dfd53da7c0f7b8bb3573116be5077d332bd12a6300f3a68a89866b479ec2baa277f9f56f6e1d49d741eb322035ff8cb1de85c8dc87ac8e6e4c5d20bfb6d317ab125930c42609be3ae82242a9ef0568858d8", "signed": "e1317ba2a123ae3b29e7b60e8e93beedd7a08451a013695b6dcf358e4034026dc74037afbdd217ff4b148b029138f4bcc8f9836abbae7e6276e9e769dbd8f007d78553a1b7055b58b213101b1c84c53e164e39c6e9d36db43f30e19e2a125a9a67709eafef964fa5bab7261ddb3a8a0188457dfbf5159c40e51da8208483245781d7131e23a8bee5e506331816b9deeefe6e556e3f0c95c668d1bedb7da635065458ad20467012f59f171352068020ce3c75878693f6437bc4a09f13b9b0f0cddaf1691b872f82008093ebfbe233d0313e72c8632d7d1793f0b81c7688f54470330f04e64860e6446bfc6d96c87569bf182f0f4385af485d4299cac04e06ba473465566c477f07b9db277ab4a9de2fb2ded0a5011cd06d675c0800b34f55bcf3ec72d21ca150c8bf2361287be81efabb96d8688a1dee3f430f06f637dfd06f151464a05c95f5fe76af2e06d0123f6948a26b3be835045aa268cc1be976697107770208a7568f025c2d53c719e524cc369d9b4a337d8fd1ef345b9bca57fbd7b65a6b997cad3fce4cf06f2ca43ebe2986d09682d47c922b2cb7569d98de97a6164f5470eec71ceda520ccec7732bd01689ef81656e9f6d0c58a895558aee863f5469e7ab97915bfe0b80a064c659b183031f7f1a86fb11a9d528c2815dcaa2f0dec3d21a882e106e20493ee0acb7708eaa2912574ae97bb288b41fc0925053a29b0bfbc0ebae8d63cc0b46e3738046c5a202530bcb15b187a72854aa2d8a7a76c89a89a5db46032074e1bd7de77ef2065a08f389d783cf759ebd5a63a44d919f948f560c3e94c4239e274e051a20485a430cbd529f313d9f7ed679a34187b24f8413087a9021e4731730f5f461fc5aad6654dfa1c0504d26124707e63ee57f931b2785908f86b104b3ecb96000251d06ce1fa45e4cd6df91ac15bbf7ca3c3eb8ee0827612a29ecb7a36d5470c40505182fa9ac913570d0c1050d9a43455cb7bdc17d169805f018956f854f8919bbfb719e1867b36a64aabcdb807f48dccc0672f67887450b3f3e958d78499e0d1ab368aa49442e5e8a332bffd44c169ea67629c85724db6f1586b6c6b5be4864dfd53da7c0f7b8bb3573116be5077d332bd12a6300f3a68a89866b479ec2baa277f9f56f6e1d49d741eb322035ff8cb1de85c8dc87ac8e6e4c5d20bfb6d317ab125930c42609be3ae82242a9ef0568858d8", "signature": "e1317ba2a123ae3b29e7b60e8e93beedd7a08451a013695b6dcf358e4034026dc74037afbdd217ff4b148b029138f4bcc8f9836abbae7e6276e9e769dbd8f007" }, { "secret_key": "09d8122697126dfc7e11685a04123fdfb47ccddb4499d8a3aef418cb65aed7a7", "public_key": "f8ddb1c00f6e0f4beaa6fc38e5d0a5775ee28c80dbde3f0c7930a33aad7150f3", "message": "a0d8d8798eba22f56760c30643e9fc6795547ea5f2f2bbd11c0392b2ebf711aca22f0824199fc3188a45bdffde70ece9ab15a5ea89622a5871e0ef7685d10f1274cc195b4fda81f879d1e9bf42f873b20a859c233f9e49adbf057731e11335e9b6d8ed0e069e134ec461ca8890d7b0473c405e8a9d95d15711b12476103762c626d9f2aa5dd519bd825b60b3234ebf651e0d1933371c52bfd8ce33fc36bba328f7f3f2ccc01000a89904af37e4e1e9e15fffab5c2b0c47f37cdcb068db33ac36a5f0d6de1203fbf8949324bd3efda0f9889db00da2317b49fd186999df7fcdc3cb4e1d18faa254561c251178b8d33fdc9dccd8d2d721b93a536ccd3c0e9c856337f195eee7da9a7f6b0a42b7c541c6a68c595bf34704d9fe3a56d2ec8481d577c96ecc08b8e40acdbf050e20c683f39c414e8cbfcf4a0152314c05987a83bde3025b735cca3023abc5feb7e00d0236b4f24b15e679db052c8d2fddb3bef8663a6df819a9815527a1a2f60a0fa4e5078ddc6d435fe89287b30ffdeb5d9ae05d1a8690fbc7590aad57d43d22c12ace2c8196888e354e9f782f5dbb44149e83fb8bbc9da6d89ce206c1e2b6b2b28f933f3e5ff1175a31a8ff5d31e65c8b00c5ba462224a1e09d4f09cb40fc87c36e7d285c774a96976203651828e783628847ac512e5d1c35b35b030171f92396f5ffaff585cead04b6ae210d80707cc6832d98a20d3a947648da2604937fefd25a9fe0fc5cac083ddd7d2075307f4f382664f687dce8c655ded9c12d48ff7601df2a48d37fe214970844c075f2eab002059fc2271e617c9657a01bec1dd38f6c28ba8a617bd30851e3f9dbac904418df1d0215ad45dfc9f02b5c5e9f9bbc6de8b07af0bd1f7fa8922544f12d2a3e1aadff7e9c6b93320c3a61ef33da07eb87b1617f9e77d7702e558bc7d8122e0dfe2ae83e836c5b1a62aa585c0dffe716f7463c0b33da5b1eda556a1ef1e45042c79bdd3ec3cb8863a7bc1b0f7e1c05bd9920f05b4eda86517705ed07f6dca7bb00ae0456e6787d9fae8ede4ecd0bc572eb5cc6d19e891f1bcb229e9409e06574c7df058173cb58c3fdf20f3ff17c3705af62d9b7225c5743f600607f77cbe7d6e7618abc79", "signed": "18cfaf6dc8e4e8582bcefe0cdc6fcefe6a4a87ea629585f37d2fba446b3aebd452426382da0d491c39cb7d54d273005dc132121568d2ab674520adda7523840da0d8d8798eba22f56760c30643e9fc6795547ea5f2f2bbd11c0392b2ebf711aca22f0824199fc3188a45bdffde70ece9ab15a5ea89622a5871e0ef7685d10f1274cc195b4fda81f879d1e9bf42f873b20a859c233f9e49adbf057731e11335e9b6d8ed0e069e134ec461ca8890d7b0473c405e8a9d95d15711b12476103762c626d9f2aa5dd519bd825b60b3234ebf651e0d1933371c52bfd8ce33fc36bba328f7f3f2ccc01000a89904af37e4e1e9e15fffab5c2b0c47f37cdcb068db33ac36a5f0d6de1203fbf8949324bd3efda0f9889db00da2317b49fd186999df7fcdc3cb4e1d18faa254561c251178b8d33fdc9dccd8d2d721b93a536ccd3c0e9c856337f195eee7da9a7f6b0a42b7c541c6a68c595bf34704d9fe3a56d2ec8481d577c96ecc08b8e40acdbf050e20c683f39c414e8cbfcf4a0152314c05987a83bde3025b735cca3023abc5feb7e00d0236b4f24b15e679db052c8d2fddb3bef8663a6df819a9815527a1a2f60a0fa4e5078ddc6d435fe89287b30ffdeb5d9ae05d1a8690fbc7590aad57d43d22c12ace2c8196888e354e9f782f5dbb44149e83fb8bbc9da6d89ce206c1e2b6b2b28f933f3e5ff1175a31a8ff5d31e65c8b00c5ba462224a1e09d4f09cb40fc87c36e7d285c774a96976203651828e783628847ac512e5d1c35b35b030171f92396f5ffaff585cead04b6ae210d80707cc6832d98a20d3a947648da2604937fefd25a9fe0fc5cac083ddd7d2075307f4f382664f687dce8c655ded9c12d48ff7601df2a48d37fe214970844c075f2eab002059fc2271e617c9657a01bec1dd38f6c28ba8a617bd30851e3f9dbac904418df1d0215ad45dfc9f02b5c5e9f9bbc6de8b07af0bd1f7fa8922544f12d2a3e1aadff7e9c6b93320c3a61ef33da07eb87b1617f9e77d7702e558bc7d8122e0dfe2ae83e836c5b1a62aa585c0dffe716f7463c0b33da5b1eda556a1ef1e45042c79bdd3ec3cb8863a7bc1b0f7e1c05bd9920f05b4eda86517705ed07f6dca7bb00ae0456e6787d9fae8ede4ecd0bc572eb5cc6d19e891f1bcb229e9409e06574c7df058173cb58c3fdf20f3ff17c3705af62d9b7225c5743f600607f77cbe7d6e7618abc79", "signature": "18cfaf6dc8e4e8582bcefe0cdc6fcefe6a4a87ea629585f37d2fba446b3aebd452426382da0d491c39cb7d54d273005dc132121568d2ab674520adda7523840d" }, { "secret_key": "10201bf0084367590de674cc0ed2648ec25d3ba8db40d00ede153398508bc126", "public_key": "badbd05e5f79e31169f740ba46a58910a1b77705af45717b2af80856457c58c9", "message": "7bb1470617d11e45eb602a829ad773ee2bb7e6b88da4c04a7216a450f84993a498cbd3b9254028f2f99fc21a23288bdc1e151a72a9130c3dedda1bbbccd4e6c0f48ae9f35318cbefc959f405045e6e0b5fb2e738f2b765be11b1b6a0f1e8319549d95fa8d1df8167cd4a7717ae1636a9df54d96eaf2d63236900fd11338252a5008d5d480e2b1e9861d1f70688c47eae4689da01a47da3dfb6d2bab3cdf505ee5d801a152c267093d17e9bf7137a6ee7b834d0085500e401c17f3286c1575d1c0100fa9807630c4a990654c1e71a8b715627bb13d442c84a449844c404b872bfbac718a48d0ea0945c77166a53139b0ff0098134764f9ecdb88eabe07ccb2cced4955e08249b2f5770ad41fccd7b5bb372e6c33767e07f5be7d10712de81841b134e193df0776a0fc156ff5d0e96f40a704753e1145e9fa083c4ddeef4416234f6e1a2382c8e5b3ad405458e89d2f493a4d7c29a23de2107485b7f56350124e7e0d695c522b6de7a9247a2924ce6f2863236c10cc21264ad54590d314763ea1a19afacd90eba955870407e8c6365a143a5c1b9a8be5e4a4dcadb72e0d47649bd53abd46b5c6960eae2cab773753cc0e04e99414bc2cb30f48bb54139d066e43e2f0e1a4ae963858bef967df8c84140d2d09202b406d5d85cb7a96cc57f233eb2187ffd02f94e92297b5e69d969d3a5936efe4929144f258bfb39dd0ce26359c4549fc218a0aa54f31bd551b8781acbbf61cb3f732cdaf622c6a69188cf557a3a92ed153e69125a4090ac451536a0e9a63a41782910ffccb4e850021123ffd1f3bf39c73460a65ccfe4dba9bdefb5d5f4da6c469aa1322fa27043238363ee72918688d7ca1c4c2952e430d563256bb86d350a35ee82e01504747f31d02e03aedda546d0f1b2f451b870821602d00e819036ade5a7c7fcd21a6de6af35b1f9632a70af65df6445f6fadfbc0f416755c8246640e56b856b66ddd92a60c03538221dc8fb142ce2dbacdb7425f33cb85d850cc02c315cfc111f6f651dde1bdb67fb208e1f6bde784ddcf7bd18c8051a2e0bbf1018b8f39536c589de65eadc6cf379b77cad13f9089cb323fb2e943d06cdd10705c121134c6548dc53415f8c370ec690", "signed": "f1d996588b298f271e970cebd2a1b339979cd29dddee3645d07fab8ab465dde3e98667ec01ad7f1c0a6592e0697e665c72fd3814dbe189ed5f4e76c794e538097bb1470617d11e45eb602a829ad773ee2bb7e6b88da4c04a7216a450f84993a498cbd3b9254028f2f99fc21a23288bdc1e151a72a9130c3dedda1bbbccd4e6c0f48ae9f35318cbefc959f405045e6e0b5fb2e738f2b765be11b1b6a0f1e8319549d95fa8d1df8167cd4a7717ae1636a9df54d96eaf2d63236900fd11338252a5008d5d480e2b1e9861d1f70688c47eae4689da01a47da3dfb6d2bab3cdf505ee5d801a152c267093d17e9bf7137a6ee7b834d0085500e401c17f3286c1575d1c0100fa9807630c4a990654c1e71a8b715627bb13d442c84a449844c404b872bfbac718a48d0ea0945c77166a53139b0ff0098134764f9ecdb88eabe07ccb2cced4955e08249b2f5770ad41fccd7b5bb372e6c33767e07f5be7d10712de81841b134e193df0776a0fc156ff5d0e96f40a704753e1145e9fa083c4ddeef4416234f6e1a2382c8e5b3ad405458e89d2f493a4d7c29a23de2107485b7f56350124e7e0d695c522b6de7a9247a2924ce6f2863236c10cc21264ad54590d314763ea1a19afacd90eba955870407e8c6365a143a5c1b9a8be5e4a4dcadb72e0d47649bd53abd46b5c6960eae2cab773753cc0e04e99414bc2cb30f48bb54139d066e43e2f0e1a4ae963858bef967df8c84140d2d09202b406d5d85cb7a96cc57f233eb2187ffd02f94e92297b5e69d969d3a5936efe4929144f258bfb39dd0ce26359c4549fc218a0aa54f31bd551b8781acbbf61cb3f732cdaf622c6a69188cf557a3a92ed153e69125a4090ac451536a0e9a63a41782910ffccb4e850021123ffd1f3bf39c73460a65ccfe4dba9bdefb5d5f4da6c469aa1322fa27043238363ee72918688d7ca1c4c2952e430d563256bb86d350a35ee82e01504747f31d02e03aedda546d0f1b2f451b870821602d00e819036ade5a7c7fcd21a6de6af35b1f9632a70af65df6445f6fadfbc0f416755c8246640e56b856b66ddd92a60c03538221dc8fb142ce2dbacdb7425f33cb85d850cc02c315cfc111f6f651dde1bdb67fb208e1f6bde784ddcf7bd18c8051a2e0bbf1018b8f39536c589de65eadc6cf379b77cad13f9089cb323fb2e943d06cdd10705c121134c6548dc53415f8c370ec690", "signature": "f1d996588b298f271e970cebd2a1b339979cd29dddee3645d07fab8ab465dde3e98667ec01ad7f1c0a6592e0697e665c72fd3814dbe189ed5f4e76c794e53809" }, { "secret_key": "c4aa425246b5173f5ef898152eca3d092bb4c2dd02853fcfc7178399f4e2f758", "public_key": "29b77a3075f419243c0c1bc39659d73117ac00e55e8de38fe9829a879cc5b8a0", "message": "7df978a1f4976838ffed7449a4dc138b604f4b2a4ae689ce75018ebccdab2eaa0b60768f7208257f2b28e7aa09bf6c05888da46fd396d1c803011750e30eb484870c8806977696f12ebb9feeb4caf92a02dbaa22bbff63f842c3ba147bca7c00314278acd0db173569f4e36527958ef6f1002bd3cd01f407a86531edcbd9f31b3a4ab880a4f5b52b42d0d4a1ba66a2098651ae3e6c9151f40273285f7f6a4e81606bf980f689504b42080fdb97c72846fba9047c7e660ba5c6bf126a9a599e2571fa13505af7581bfebc16513f5c94dc71937e6e61b3ea10939b02ea10859f32d7912b9e3806abef6185fcffa68821478005cbfc1d637dd020425620a318074898bdc30931c59ac0c66c4d1238b097cd5b170f084435d4bae48a03d92fd48fc2caa4ffc505f1bca516fbd6e4f888cced982ae0ddb88fc28aa697b7071d015b0acb2809b01d1d9c7e7b53eee6824cc37cce5b6993d88d83eafc2e928a6f147db6eb80b1a69f01605b046bd2fd1d92c5459d6d3398a9caa299ddd0c3ba2e08941307b120cc13992f7003aced14a4a4d923bbb12fc393ffcf920b9f6d4775e94d4a512267fd26a6997c6062b4c9900f9862b9ea0c8d7df19f05c2b604af5b9864fb2754a8073bbbfb18233e6e150f72a525e3a5760fcda7d32a60034f956e3cbd3436c200830b3e7a14571220bcb627d5a4be72c20b23351b2d920602a51c3eb32c1237039dfbff43c987fd8563777f0e5a39f8146c164bdffce44f3b13ee74d64bfdcf9803f03dd0172ac4fa4bf6c7839cb11f3d34baef0e32b54942fc4fa38f473e2966f4911c0e80d76937b25b7632275ba88309635a60df135489208d3e734b672eda7d2ba21579aba8d8860ea764fd67eaf9c38ea7637d1bad57b2f3d782b91e1d5d92ac300bdba7ab9113ce913d0c793c12a9a726e3fcab05cb479977871640630d459e69e81ca5cf56ddb2a0611d61d481c1b8cef3804bd4e5754a61eb49b17ef2b03c83057b5d20d882058c00f54b6cca86be95350dd7bcb25e4c1c4658f45229c8bb9f5cdfcc44795c978e3388d325760106e52be9834bd81ffc5c62486b6f33c27459df178eb946e7a82db9ce0d295b925bb6126dd55c31f49a68dcefc7", "signed": "5d8545a4be3fd6da2578c2eccb648d83fcfe587133fa7ae4a1cfca9ae6daa49259c952044a85a20b6f5324f827dba2d1a8388c40a928b950913c634fb30927077df978a1f4976838ffed7449a4dc138b604f4b2a4ae689ce75018ebccdab2eaa0b60768f7208257f2b28e7aa09bf6c05888da46fd396d1c803011750e30eb484870c8806977696f12ebb9feeb4caf92a02dbaa22bbff63f842c3ba147bca7c00314278acd0db173569f4e36527958ef6f1002bd3cd01f407a86531edcbd9f31b3a4ab880a4f5b52b42d0d4a1ba66a2098651ae3e6c9151f40273285f7f6a4e81606bf980f689504b42080fdb97c72846fba9047c7e660ba5c6bf126a9a599e2571fa13505af7581bfebc16513f5c94dc71937e6e61b3ea10939b02ea10859f32d7912b9e3806abef6185fcffa68821478005cbfc1d637dd020425620a318074898bdc30931c59ac0c66c4d1238b097cd5b170f084435d4bae48a03d92fd48fc2caa4ffc505f1bca516fbd6e4f888cced982ae0ddb88fc28aa697b7071d015b0acb2809b01d1d9c7e7b53eee6824cc37cce5b6993d88d83eafc2e928a6f147db6eb80b1a69f01605b046bd2fd1d92c5459d6d3398a9caa299ddd0c3ba2e08941307b120cc13992f7003aced14a4a4d923bbb12fc393ffcf920b9f6d4775e94d4a512267fd26a6997c6062b4c9900f9862b9ea0c8d7df19f05c2b604af5b9864fb2754a8073bbbfb18233e6e150f72a525e3a5760fcda7d32a60034f956e3cbd3436c200830b3e7a14571220bcb627d5a4be72c20b23351b2d920602a51c3eb32c1237039dfbff43c987fd8563777f0e5a39f8146c164bdffce44f3b13ee74d64bfdcf9803f03dd0172ac4fa4bf6c7839cb11f3d34baef0e32b54942fc4fa38f473e2966f4911c0e80d76937b25b7632275ba88309635a60df135489208d3e734b672eda7d2ba21579aba8d8860ea764fd67eaf9c38ea7637d1bad57b2f3d782b91e1d5d92ac300bdba7ab9113ce913d0c793c12a9a726e3fcab05cb479977871640630d459e69e81ca5cf56ddb2a0611d61d481c1b8cef3804bd4e5754a61eb49b17ef2b03c83057b5d20d882058c00f54b6cca86be95350dd7bcb25e4c1c4658f45229c8bb9f5cdfcc44795c978e3388d325760106e52be9834bd81ffc5c62486b6f33c27459df178eb946e7a82db9ce0d295b925bb6126dd55c31f49a68dcefc7", "signature": "5d8545a4be3fd6da2578c2eccb648d83fcfe587133fa7ae4a1cfca9ae6daa49259c952044a85a20b6f5324f827dba2d1a8388c40a928b950913c634fb3092707" }, { "secret_key": "f13cafde6f39b963dca96626862f4fbc5c2e00ddf08beceac7a6e2fca9e1ccf7", "public_key": "c1b01a91e8ee0b9f19a72e5e7e0aefcfdc44a157474e99feebd0ff552d73b2ac", "message": "2bee73b74f1b7622eb096a28d83a819bcec22d9999a32062103d604ae6d78edf8f893895d2220ab75690410c58aab590a98ddff23a94d2350f889e53464200a527d54d62571107b27e574f542ebac249b8e2e3ce08d1bd27bd8d29f2e61243deef0e6938e52ee2992ff2187d7a7f5282edd98fc4985b619acb80aa9d03d6cb84b821106f40d6e5f4c387ab0af6f206615d0a175f7e60ee2755aea34675fdd823eb24109a9bd818ea2d9d9bd199cf8dfe79624b0372ae85e98c60200234bd413f4a62ce68a47b6c9b12857c0d399a448e5a5280e9f22f9b12ea2cd3c68713e77d0a11f3628d8ec5e060639031d3b640021c9c38809dc5f42d2e1c2e2346c86e24eedc5984a115a42de8de7e35c9917539e89885ca916e072afd5d46846b2a935961c2fe28e9eb3c8f896b86fc120cbd3af2aa139c499d29cfc3699db79c14484e9ec257a5f64344b7ad1e3dfb34eee7654c6bf12fd38fbba80fe1762aab57112b3a94e2bee79041d1e88440f85fb72dde68d49e84bced998a2f6335446e4a835e70c5f827fb3ad7823d5fbe3be5f6ec7e434ee524ccd9ff5b7e72a32d091a7e17c8b1ae41a1af31793cce91d84c3622678969c8f517dc26e3cd61d2446912283f9353bb5ad03c111c6233de314c61b831cbf38b04fe58cf44f1d2d0b45f25a6b4e0256859cd5d830fac5ec3c8d76398559e9b26010f5e1da5f25d2200935453ffac5aea51f7e81e72ec8e5f04d2f885c7b45c63f64456cfe231b8cb24aa1620a902639ca78dd391aa4a3d03e11975c8907f964fd55df9bbb140e38d6db93256b4b39c2b7bcbe35b11826bbf8c08f1dcb48edc4bfb70462a35ea8cd8cba79fab8b4c44e73be7ecfa112166f6dcab70d8bb55d8b8428c2da71aaca2fc3d90f3cc5ed01551358d60789b9d571efe10892027fa37404aaf59ec1c2d7111ecc3592467ed1d9b8aba8e229e32d2a00c19db7187fbcb122061961c1fdaca307e9c9c9de972ad51402fa67dc1c2a403b3c5e8b1e246862d6ad6a498db6d761fb566f6065942b60ad4b4309d182bc5154cfc36863185a87e23abaa1d541ab763a4a1066c0a7a8c3d821ae32fd31c8892401046d0a20e91a64779f4bda81120af3fb3486d3fc0a7", "signed": "6ca9f80a62501faf319fb84af471f676ae3fff85565c97981f1457cbb8c49f97b266316a992db0d42bc502f095a5f2d9a4e1cfac0cc935d3882c8a3a0ea6e10e2bee73b74f1b7622eb096a28d83a819bcec22d9999a32062103d604ae6d78edf8f893895d2220ab75690410c58aab590a98ddff23a94d2350f889e53464200a527d54d62571107b27e574f542ebac249b8e2e3ce08d1bd27bd8d29f2e61243deef0e6938e52ee2992ff2187d7a7f5282edd98fc4985b619acb80aa9d03d6cb84b821106f40d6e5f4c387ab0af6f206615d0a175f7e60ee2755aea34675fdd823eb24109a9bd818ea2d9d9bd199cf8dfe79624b0372ae85e98c60200234bd413f4a62ce68a47b6c9b12857c0d399a448e5a5280e9f22f9b12ea2cd3c68713e77d0a11f3628d8ec5e060639031d3b640021c9c38809dc5f42d2e1c2e2346c86e24eedc5984a115a42de8de7e35c9917539e89885ca916e072afd5d46846b2a935961c2fe28e9eb3c8f896b86fc120cbd3af2aa139c499d29cfc3699db79c14484e9ec257a5f64344b7ad1e3dfb34eee7654c6bf12fd38fbba80fe1762aab57112b3a94e2bee79041d1e88440f85fb72dde68d49e84bced998a2f6335446e4a835e70c5f827fb3ad7823d5fbe3be5f6ec7e434ee524ccd9ff5b7e72a32d091a7e17c8b1ae41a1af31793cce91d84c3622678969c8f517dc26e3cd61d2446912283f9353bb5ad03c111c6233de314c61b831cbf38b04fe58cf44f1d2d0b45f25a6b4e0256859cd5d830fac5ec3c8d76398559e9b26010f5e1da5f25d2200935453ffac5aea51f7e81e72ec8e5f04d2f885c7b45c63f64456cfe231b8cb24aa1620a902639ca78dd391aa4a3d03e11975c8907f964fd55df9bbb140e38d6db93256b4b39c2b7bcbe35b11826bbf8c08f1dcb48edc4bfb70462a35ea8cd8cba79fab8b4c44e73be7ecfa112166f6dcab70d8bb55d8b8428c2da71aaca2fc3d90f3cc5ed01551358d60789b9d571efe10892027fa37404aaf59ec1c2d7111ecc3592467ed1d9b8aba8e229e32d2a00c19db7187fbcb122061961c1fdaca307e9c9c9de972ad51402fa67dc1c2a403b3c5e8b1e246862d6ad6a498db6d761fb566f6065942b60ad4b4309d182bc5154cfc36863185a87e23abaa1d541ab763a4a1066c0a7a8c3d821ae32fd31c8892401046d0a20e91a64779f4bda81120af3fb3486d3fc0a7", "signature": "6ca9f80a62501faf319fb84af471f676ae3fff85565c97981f1457cbb8c49f97b266316a992db0d42bc502f095a5f2d9a4e1cfac0cc935d3882c8a3a0ea6e10e" }, { "secret_key": "c846344261a34865393834bfaa3a15a3f53ac9e13833b0b287122781b79de392", "public_key": "ebade0226195ae254b6115e21696a9c65a19d5e040443131c22b89f02f69ab78", "message": "5abd13e95b6ee1d5514768282200a14f7d1a571f3468e22efec993463066a37aec8373e5fb499564191f3294a9b30afb5f1a34d4d88abc3e9bc303c1aba05bd8faca90ee35d97ac3dd9106f6fa3ca81a3810eccefa6a209ea3f3fc3049dcb1b003c728f7f6374ca98c582de6db1af760f0a02133ca4a010324304d26a0e50af0d13c134da34a03a41e83ec8f10ea5b859bec1f51b01cabb2d16c1fc52b058f8e5defaede128171c2e026902316f871b35e3292656f0e5b39bbbc81d0c0830e6ac01fac9b4539f47f9acfbd58b7ab9f5a125600f251a271d7bf167f2954ca8e1e0c96e16b06e8307df88bb8e9d57d5ba044f27f3eaff81d9f150554aa7122fd10d11f35d2be2b1624e3e1a1d77fea4c5c7f8b983e945ba8c08dc1545b3e6b2973ad041c44d0617eccc871a3821a9ffea9db7c2b0d055da55de0b35063e4225aee6b225ab2a7906a8ee329d1b3972e0d1f70817c50ccfe9403d12ad62c94923b9aa2d7f85a8dda47be4dcec0dc2b0b58f7ac190ae0579b9b13bbb8b16a31b0ab4d6f2791253ab4751b536b88d3b4937cc3a110aa82a6ffed6853524b66b3effcd2f63c6f9645cea13aa23cd1c99d9ffda4cd3a9c5df45ec74726c3471128b7089fbd82694d2d3f08dc9306c0fc9ce7c801138eb1ecb756e571e9059b75ed03f92a31502fbeb5fec51de9359010c4397d28b65e356e38001d0d51ac9600728c78b5766e0f217938b410e785b4c01e86a3452bcb3884aca47540859cc49b000f0b61fdbe72752574b27a22d4c40413a43b310924b1bb140fc9fdaae266d65930e3f234fe841d82b26176ff86c5d2bd8d965c52d728064ebdf68dc8e4834941801cca0b2f256d4f6c3dd19d35d5362bbf9b8a3a1c863e092689dd2852add488bf42685b11e1e1ad5745d075628d731f91cfd749159e2e1c837f4ef83d80ea1dd9bded5f88018ce1d4b3371f954353f3d894370062c0965d67986dbc481715f42dd2c91607ab8b5f0d89f66e68d73d50d640524d72e69134b887298e5cd8c4b905ba5efa0e9d685214b842f50a2a3983a1af585af2ca43dbcf02c40897ae2e1ab51dbce570345e8e135fb7b4eb0a1d6a0bb5a8a1807e425b2d628360768058e61ad1cfaa2099", "signed": "d5e41b47ad0f3400709770ed43919bafdf24381b661544e51d8b5cee9e97b3676a4c0ffaebb2cbd2db798532b65cf654a5b6c166ef886cb0fbbf4a4f844c440b5abd13e95b6ee1d5514768282200a14f7d1a571f3468e22efec993463066a37aec8373e5fb499564191f3294a9b30afb5f1a34d4d88abc3e9bc303c1aba05bd8faca90ee35d97ac3dd9106f6fa3ca81a3810eccefa6a209ea3f3fc3049dcb1b003c728f7f6374ca98c582de6db1af760f0a02133ca4a010324304d26a0e50af0d13c134da34a03a41e83ec8f10ea5b859bec1f51b01cabb2d16c1fc52b058f8e5defaede128171c2e026902316f871b35e3292656f0e5b39bbbc81d0c0830e6ac01fac9b4539f47f9acfbd58b7ab9f5a125600f251a271d7bf167f2954ca8e1e0c96e16b06e8307df88bb8e9d57d5ba044f27f3eaff81d9f150554aa7122fd10d11f35d2be2b1624e3e1a1d77fea4c5c7f8b983e945ba8c08dc1545b3e6b2973ad041c44d0617eccc871a3821a9ffea9db7c2b0d055da55de0b35063e4225aee6b225ab2a7906a8ee329d1b3972e0d1f70817c50ccfe9403d12ad62c94923b9aa2d7f85a8dda47be4dcec0dc2b0b58f7ac190ae0579b9b13bbb8b16a31b0ab4d6f2791253ab4751b536b88d3b4937cc3a110aa82a6ffed6853524b66b3effcd2f63c6f9645cea13aa23cd1c99d9ffda4cd3a9c5df45ec74726c3471128b7089fbd82694d2d3f08dc9306c0fc9ce7c801138eb1ecb756e571e9059b75ed03f92a31502fbeb5fec51de9359010c4397d28b65e356e38001d0d51ac9600728c78b5766e0f217938b410e785b4c01e86a3452bcb3884aca47540859cc49b000f0b61fdbe72752574b27a22d4c40413a43b310924b1bb140fc9fdaae266d65930e3f234fe841d82b26176ff86c5d2bd8d965c52d728064ebdf68dc8e4834941801cca0b2f256d4f6c3dd19d35d5362bbf9b8a3a1c863e092689dd2852add488bf42685b11e1e1ad5745d075628d731f91cfd749159e2e1c837f4ef83d80ea1dd9bded5f88018ce1d4b3371f954353f3d894370062c0965d67986dbc481715f42dd2c91607ab8b5f0d89f66e68d73d50d640524d72e69134b887298e5cd8c4b905ba5efa0e9d685214b842f50a2a3983a1af585af2ca43dbcf02c40897ae2e1ab51dbce570345e8e135fb7b4eb0a1d6a0bb5a8a1807e425b2d628360768058e61ad1cfaa2099", "signature": "d5e41b47ad0f3400709770ed43919bafdf24381b661544e51d8b5cee9e97b3676a4c0ffaebb2cbd2db798532b65cf654a5b6c166ef886cb0fbbf4a4f844c440b" }, { "secret_key": "faaf55d3c29714b65c2281e2c22d6134971a2e74008fb94089a773eeeb4483a6", "public_key": "39862eac6dd52e381bb34dc196ba8a374dcb7df6cb140fd0cfa6cfa39b8c753f", "message": "94e661c25240a89e823d7f5dc0e692eddd1370c35ac44d5a8c8798d0c9aafdf0bbfb549260568dba1c69086bee636be8edccd3cbb27016244d54d7ed2feb7fa64614d45449d7e058e71b306c22e6911c2ac74207bae5a84d0fc247be49d356e5d4353ba5586b6e4b2b97ce9e2377b6eed92c849e676944ae90dc4208e300e19cc91dc26bbdd5a30cfa9281a15efd873066f85af3a26f310623e009804853cc6855903ea64a909897e315e73d312948980ef6289db21a5ebbec8c8efe20d1d53dfaad6d9f4296532e887c37350105a633abc773188751b28c3a08f1b5ee0472de4627e6b61b68278dd51ced6a61ecf38886e45339dc6c60c31e850ef8296ae80f9d31701776eb9af21693f4c52ec062625738d4e3afbf71d1c81fc4846360363ea541a976623a5e4e6b6a67237e9237173f1a1d543302858885714c2a591d0a786282a0285a3711f7bc2b63ca7987e9ae7d02035555cf3b6ad6f71ca98aa928883bf81dd6f86493eaab5637b4dd569d1ee8de6a44bcedb62b9706b1db89e3f05df16310017d89ef3e4bc099b721a5c8d38043d6e4a22cf04009c0fcee6be69937829954941b8b4a1ebf4daea0d774d0782be176c8e591907756c2cf75dea6f7877dd6875b8fe1012f3050cfb1289cf088667e1522eeedc927ac86bfe2c407432b4a813a6a7a5504e999206db1827e25fafd70ced36db3b281b6f7b14ed5baa0572315a939c5bf4abb133d2e7b16d52de20817af055df5f141207734610a0c6eebedafffd9cc9f069b67f9a1c0454be41d54c138be542e5e38cfe2f293f7d2d3df66977acb366a42c19b3185acfa1b363c6131a4a8111c3b1f4fd7ac406d0e69103ba15b8c4bf29bc2ed9c45cfd1d279d8d931444b2b1849252b8a70eed80fd260edf5a3c01b9690160d2311851d21c9302d985986eaeeb3ae2c07c7c7672094f91db0bd50be377e4d1eb07ee76af49dc136a145a11b172f0811fe73d6259be370c4dfcab6f19e4a64b151d0a6db8050c3de2cc325f5c5f6594cf6248eb081209539e08ca3422984e7bf803de3a419b14423f1e5a54224042ce4f05488a6044f4042bd649b1a08ce10c2006ea76efab4641fef2897efd724e6054a3bd1a69e39a4a5e2d502", "signed": "5b0083f7a82061c65cf6c75640c81c28e8d6d2e87f6d5795c9aa3bb3e390e91990e82db6f07e614f507a560abaa1eca656c678ddcae8198251e6af0b76b88d0d94e661c25240a89e823d7f5dc0e692eddd1370c35ac44d5a8c8798d0c9aafdf0bbfb549260568dba1c69086bee636be8edccd3cbb27016244d54d7ed2feb7fa64614d45449d7e058e71b306c22e6911c2ac74207bae5a84d0fc247be49d356e5d4353ba5586b6e4b2b97ce9e2377b6eed92c849e676944ae90dc4208e300e19cc91dc26bbdd5a30cfa9281a15efd873066f85af3a26f310623e009804853cc6855903ea64a909897e315e73d312948980ef6289db21a5ebbec8c8efe20d1d53dfaad6d9f4296532e887c37350105a633abc773188751b28c3a08f1b5ee0472de4627e6b61b68278dd51ced6a61ecf38886e45339dc6c60c31e850ef8296ae80f9d31701776eb9af21693f4c52ec062625738d4e3afbf71d1c81fc4846360363ea541a976623a5e4e6b6a67237e9237173f1a1d543302858885714c2a591d0a786282a0285a3711f7bc2b63ca7987e9ae7d02035555cf3b6ad6f71ca98aa928883bf81dd6f86493eaab5637b4dd569d1ee8de6a44bcedb62b9706b1db89e3f05df16310017d89ef3e4bc099b721a5c8d38043d6e4a22cf04009c0fcee6be69937829954941b8b4a1ebf4daea0d774d0782be176c8e591907756c2cf75dea6f7877dd6875b8fe1012f3050cfb1289cf088667e1522eeedc927ac86bfe2c407432b4a813a6a7a5504e999206db1827e25fafd70ced36db3b281b6f7b14ed5baa0572315a939c5bf4abb133d2e7b16d52de20817af055df5f141207734610a0c6eebedafffd9cc9f069b67f9a1c0454be41d54c138be542e5e38cfe2f293f7d2d3df66977acb366a42c19b3185acfa1b363c6131a4a8111c3b1f4fd7ac406d0e69103ba15b8c4bf29bc2ed9c45cfd1d279d8d931444b2b1849252b8a70eed80fd260edf5a3c01b9690160d2311851d21c9302d985986eaeeb3ae2c07c7c7672094f91db0bd50be377e4d1eb07ee76af49dc136a145a11b172f0811fe73d6259be370c4dfcab6f19e4a64b151d0a6db8050c3de2cc325f5c5f6594cf6248eb081209539e08ca3422984e7bf803de3a419b14423f1e5a54224042ce4f05488a6044f4042bd649b1a08ce10c2006ea76efab4641fef2897efd724e6054a3bd1a69e39a4a5e2d502", "signature": "5b0083f7a82061c65cf6c75640c81c28e8d6d2e87f6d5795c9aa3bb3e390e91990e82db6f07e614f507a560abaa1eca656c678ddcae8198251e6af0b76b88d0d" }, { "secret_key": "6d7855e30f7a13e237b067144346434bb4b05178c7d88d492e79027c4b0f3cdd", "public_key": "7273293828efa349822392dbbab07879577e1a77a6fd6afe33753a9eec88c4af", "message": "f8b936e793b017580cc0e9cbda2acb6474507f4bca3afc8783ec46eeb82ccd4dd2525676aa6ab5c0dcf7d75f7e0311e6fe6bf27263f8578feb55c5612d1f28e888b76656c41ccd8a70b9bc604b42724fa2bc411d44c31ab68ce84f8393399e34d5408579c2ba2921f2f8d11487aa7e52557feed96757199d3aae6377770154b17f3577c7ac3d8c76cf7461b5e8d42a7185078ed4f862fc57502f615075307b6e103c77c1f6c8bda7aa17e435e21b949af44dff5aa30a62da712fa9966a612ffca14871fd6f860b4a9614012c5369910e0ffd6f0fbd889a9c257c32bdcf90bb80627cb272ecd4599897555955e1fe08cd7ebb21c071be0f48989696cb39aa82ad11baa5d4ac613abf1b6db8a20e686836222833f8b6dd2f0006227be48e8580dcc8de620dacb2f65a693675d6cb45ba5dd1aa70db76bc641d4fb567ecbc7111442e294158be575c71ddc26e94f41266a2fd3a0d435781fc094648fadf5f17cd41ab895821894ec0806b262c393534fe66f21e3783c14a96c88f2e0653fe32e75dce8a463bb97eed6c16f3f3228169abb5b4bf9ea3278c1ff0f86eae71389b6433acd097eefa9e6e05f4955cd517830b8d9870ccb5227415e50f23f6473217a745096470dca93d2b34673c5d6a57ed02c8e0cae119b3f329d8ab6498494c2921bb6f496dd08381e7d39f2db5763b14a2821befcca0a9fd312545de68abf206d12d8e02e73bc7e3cb796e7ee26cc63d741efafc5345f8132951bcfbfddf631fb7cb43ef35b9453c9390eb23b1f9d8b1c72debd24f09a01a9dc60ee6815306188357781af6e1820aa35e4ec121b7ca34d7de7611b246a3e703ed48c7eb03a6fe8f852ee7d32545c9d852d64d5d75930e5f1ebe21a307efa7622edaced6d879026f0f85a9112012803705582269d39f143234df8909ab3d948e76d3daaa24226d9ac601eef277fd2cfc4a19aedf4387a21617b03ec3d3845a38554f5e97036e56ec1ce660df9c062c2c993b77c5ba6a6d05231dae3764183c3e96aa539cfb3415fb163c645b2303b2d6d4bda8ca6c72bc03d5305f9b118e925e27d29ab7dcb196470e6339631b2380744c04d1da348fc0fe274277f82f95bdfb0b64b4cf3b51e571c0ddb3b53ca6", "signed": "0fe28eadd9e5dd574b3faaea810d44522c8b1bfbb3e3d57ed889faedec91d0e14a86b914c4c766f1bf9b8f18b0db890db6c1b125d57804333619b1e0720a3300f8b936e793b017580cc0e9cbda2acb6474507f4bca3afc8783ec46eeb82ccd4dd2525676aa6ab5c0dcf7d75f7e0311e6fe6bf27263f8578feb55c5612d1f28e888b76656c41ccd8a70b9bc604b42724fa2bc411d44c31ab68ce84f8393399e34d5408579c2ba2921f2f8d11487aa7e52557feed96757199d3aae6377770154b17f3577c7ac3d8c76cf7461b5e8d42a7185078ed4f862fc57502f615075307b6e103c77c1f6c8bda7aa17e435e21b949af44dff5aa30a62da712fa9966a612ffca14871fd6f860b4a9614012c5369910e0ffd6f0fbd889a9c257c32bdcf90bb80627cb272ecd4599897555955e1fe08cd7ebb21c071be0f48989696cb39aa82ad11baa5d4ac613abf1b6db8a20e686836222833f8b6dd2f0006227be48e8580dcc8de620dacb2f65a693675d6cb45ba5dd1aa70db76bc641d4fb567ecbc7111442e294158be575c71ddc26e94f41266a2fd3a0d435781fc094648fadf5f17cd41ab895821894ec0806b262c393534fe66f21e3783c14a96c88f2e0653fe32e75dce8a463bb97eed6c16f3f3228169abb5b4bf9ea3278c1ff0f86eae71389b6433acd097eefa9e6e05f4955cd517830b8d9870ccb5227415e50f23f6473217a745096470dca93d2b34673c5d6a57ed02c8e0cae119b3f329d8ab6498494c2921bb6f496dd08381e7d39f2db5763b14a2821befcca0a9fd312545de68abf206d12d8e02e73bc7e3cb796e7ee26cc63d741efafc5345f8132951bcfbfddf631fb7cb43ef35b9453c9390eb23b1f9d8b1c72debd24f09a01a9dc60ee6815306188357781af6e1820aa35e4ec121b7ca34d7de7611b246a3e703ed48c7eb03a6fe8f852ee7d32545c9d852d64d5d75930e5f1ebe21a307efa7622edaced6d879026f0f85a9112012803705582269d39f143234df8909ab3d948e76d3daaa24226d9ac601eef277fd2cfc4a19aedf4387a21617b03ec3d3845a38554f5e97036e56ec1ce660df9c062c2c993b77c5ba6a6d05231dae3764183c3e96aa539cfb3415fb163c645b2303b2d6d4bda8ca6c72bc03d5305f9b118e925e27d29ab7dcb196470e6339631b2380744c04d1da348fc0fe274277f82f95bdfb0b64b4cf3b51e571c0ddb3b53ca6", "signature": "0fe28eadd9e5dd574b3faaea810d44522c8b1bfbb3e3d57ed889faedec91d0e14a86b914c4c766f1bf9b8f18b0db890db6c1b125d57804333619b1e0720a3300" }, { "secret_key": "7ee4e7e98c6a40f0e74413f24039bd220df1f8c7f015528dbf5284ab9f7c82e2", "public_key": "4d5a800f9b22070e016ee23af8a310902b369d589a847f345c2ea2968d6d0924", "message": "8fb01373c42e69614aea99af49323785f33861b94e90f565389ebf70e219f5dec732e0010b58f7290530df222ac9c73e1c2e92a5e6061de5590caf9c0d5021d729eaa11541fa1d082160beaf611e7cfdc0ebb315d388e538b4b5028f9b30d3d973347ffd44263eef083b81b21b82eca5756a494b1d81c07de849506d3e3b668797a5c544254d4ebe5cf8171b39f8724cbc4189291b3c53c21ece49a1d739563c65b49025935647a7303ae0ef7f6d24554645a428dbbb42449f5399e36dc787b7d6958a02eebbb836e5e53e26e487239de94d1d250e7943ac0e22d92750a0cf3473be1a6225cbe79545048269f6237ec9f9ec307e8a34b7bb34cd4906e43162a3708f329c5b989d7a7fcde1099a542546fe9c33182ba51b843e96d11c79e91ad21f7170e257fdc2818e12f9168a974c968a4d273fa3ffa9f35ff905980eaad3721cae802bee36210b40b99319bb669982e943b270a4c4d0a92ecb5bba2dd8b40ac3d2f0325c469d5e9d483f5241974010c5c0da335f16e962196c2ef14eb24aafbb311bfd5fa8dc8d2d61e6878ad2cce0dc9939e44522723d427ef32fb43b967f5e44fc665792796f8cf934f01c325d63d583dc3ca9d4fcc757d9178580daef53aa3ab21d2ce435955d1c6d47638c5edb62ff5561693d1cbd10ec9e399a71bf9db1c9969fd59e4eeb31aa59bf39e9f184178def7246ed4b8f4be5badaa5db4af867f4f2ec39a13704202c8784fa168ce96f9cfac71017236275fd857cc3c51a9c7ac256215e14b843f7214dc9f824b91d1a5170d0ef1d37696f93ee966a2b7dece22b4f3afd39c16d601e5ff8408d45c1a6ce71f060976c5be4c042b1b738df9580ba5ae77880a70c0b94f0e1c9f9aa34c090d612d57a9b931f50a125fa35ce40a2cb7faad530f80908c73cb78258afd2631390041d92617e9bf64ce96e8e4ac7f3126d8af8a04c75ffd438769de06f74c2fc20cc8192da353e79061283bba08a8d24e6e4e2e83ba5b08e4275226062148d8a02afad65b6f627cfbd29b71ca18aee5b1f97169bf0228b376f4106b50fd91a38a66211d69ebb4a7af0e1c2217f1ba014d1e0cd17508d58155d163dd9de2fe1c64c7f88d5b553e9ba1e1f25430d7e125b07a8c2ed", "signed": "ac3bfe3adf941c934d3349c492de70d5166be389f955be87c2883f41f2da146c910651a3b452c2d739dc9b531c5745565e69d98359f1d7d93ebd36d70abbf00d8fb01373c42e69614aea99af49323785f33861b94e90f565389ebf70e219f5dec732e0010b58f7290530df222ac9c73e1c2e92a5e6061de5590caf9c0d5021d729eaa11541fa1d082160beaf611e7cfdc0ebb315d388e538b4b5028f9b30d3d973347ffd44263eef083b81b21b82eca5756a494b1d81c07de849506d3e3b668797a5c544254d4ebe5cf8171b39f8724cbc4189291b3c53c21ece49a1d739563c65b49025935647a7303ae0ef7f6d24554645a428dbbb42449f5399e36dc787b7d6958a02eebbb836e5e53e26e487239de94d1d250e7943ac0e22d92750a0cf3473be1a6225cbe79545048269f6237ec9f9ec307e8a34b7bb34cd4906e43162a3708f329c5b989d7a7fcde1099a542546fe9c33182ba51b843e96d11c79e91ad21f7170e257fdc2818e12f9168a974c968a4d273fa3ffa9f35ff905980eaad3721cae802bee36210b40b99319bb669982e943b270a4c4d0a92ecb5bba2dd8b40ac3d2f0325c469d5e9d483f5241974010c5c0da335f16e962196c2ef14eb24aafbb311bfd5fa8dc8d2d61e6878ad2cce0dc9939e44522723d427ef32fb43b967f5e44fc665792796f8cf934f01c325d63d583dc3ca9d4fcc757d9178580daef53aa3ab21d2ce435955d1c6d47638c5edb62ff5561693d1cbd10ec9e399a71bf9db1c9969fd59e4eeb31aa59bf39e9f184178def7246ed4b8f4be5badaa5db4af867f4f2ec39a13704202c8784fa168ce96f9cfac71017236275fd857cc3c51a9c7ac256215e14b843f7214dc9f824b91d1a5170d0ef1d37696f93ee966a2b7dece22b4f3afd39c16d601e5ff8408d45c1a6ce71f060976c5be4c042b1b738df9580ba5ae77880a70c0b94f0e1c9f9aa34c090d612d57a9b931f50a125fa35ce40a2cb7faad530f80908c73cb78258afd2631390041d92617e9bf64ce96e8e4ac7f3126d8af8a04c75ffd438769de06f74c2fc20cc8192da353e79061283bba08a8d24e6e4e2e83ba5b08e4275226062148d8a02afad65b6f627cfbd29b71ca18aee5b1f97169bf0228b376f4106b50fd91a38a66211d69ebb4a7af0e1c2217f1ba014d1e0cd17508d58155d163dd9de2fe1c64c7f88d5b553e9ba1e1f25430d7e125b07a8c2ed", "signature": "ac3bfe3adf941c934d3349c492de70d5166be389f955be87c2883f41f2da146c910651a3b452c2d739dc9b531c5745565e69d98359f1d7d93ebd36d70abbf00d" }, { "secret_key": "1f28d9091d196cba3d4552e5a337a4d8af3f295e629e4ba6fe99703120ae41e0", "public_key": "814d34bf28ee6d90f039599041db810f7c9daa918e03e96197414bc9aa31ecdc", "message": "a69468bc33ebfef0615c643c49dac6e04fdb6cfb8ec45857bbb7a27e528fd631fc3411baee65cc1f94fcc94aed4a4332fa6861e065e06163541709d79728e01be2b140a022c83e7b23b9ed2ad2832169dfc95690913cf3720130657080c9d5a7827e5660757452c5fc3dcd80cc6be098c629226d5466e02b97126be74a1452ee16815095deb42bf06566715028c11825820a8a23c60da2b68dd9a55dad2a29a4964443817c07d776b244b15186819a3bbed414abf4579a3ece3a3dc7b105d0a9dba37b9eaa78be8e46e1698b59b0940b01f38b283c33a9a4b1d4f8144b16eeb5fc0a7af0d081696645a1eab3a787cbcf88fad93dd6cd46d295a879a1775033a98563822ef1f6b69a581e49736c8d701b4453969340521e4ad4bf94b911b0e2d86f34eece4a6385ff1fe63220cd3cc592f36d6c491fa18f7c1404360d2a7753fe073e09a2fc42a4bbea55bc96d7f05c98aed2cc4a9fae8fd4a0197ff01fa7f0046e3c3eb59aaabca313a4ddaa5d20d27c2c5f1ac6d87fd3cb4bd35a1ec75d104f7c367331a3e295e53c4e80bae14b9792d0d526f740d4ff036faf5487967ffabe8e883d3fb0d16faadb28e1285ded41570c0b07c2559b531e0f9254ef88e5b10f64f4839a9a0b6c3c7f1b7850f4ad9bf0999a7f2ae7c45a658ea53036fc70199842b8e49e60f967de1ff3abfff6cd735b7cd8b8f9e248f156f6c6543869eb99823daea88debaf79f01e6521ec63fe72724ee3c822b88b3968b24852091583c49ab3c15fa1f79b18d98f04d9b6841c9a7ca0de2fcc02f95dd649492e8b56a31ec1e244337af6aaaede8bf99fc814ef57c0d5e08c3c7ecc1897980aa169a9926d20698df6930e2110cb460f49390100741095f8ed00412ae696d98efefd290da5f7d0b728d20a1ebfa6bd7d270f281a98c7b1e408435125aa483c6b7d633ff7588a941658f6129544d62945b9b8af71a8c62c0a50076cb8541ba7e4bde4ede441722c6eb9df8cfd0656339e86d226abaea05ea047f6b8307701f6c9a44cc9cb837b8eb62445925e8a8881d2538fcb2b249e4ee8b686ecfb49c4df86401d249aac35841e914004f9455d3fde375d20a01fba27b197a698d384c76505106801627e8336bd2d76d761a8", "signed": "5be552fa731e836793f6dda895dc9b1e2ccd669de1c843e00ea6fa3c5ebf97a34b26f1f3ac7ff2225ee4a7e430072c13da4066dcdcc05ba2b5f61a6e8d210709a69468bc33ebfef0615c643c49dac6e04fdb6cfb8ec45857bbb7a27e528fd631fc3411baee65cc1f94fcc94aed4a4332fa6861e065e06163541709d79728e01be2b140a022c83e7b23b9ed2ad2832169dfc95690913cf3720130657080c9d5a7827e5660757452c5fc3dcd80cc6be098c629226d5466e02b97126be74a1452ee16815095deb42bf06566715028c11825820a8a23c60da2b68dd9a55dad2a29a4964443817c07d776b244b15186819a3bbed414abf4579a3ece3a3dc7b105d0a9dba37b9eaa78be8e46e1698b59b0940b01f38b283c33a9a4b1d4f8144b16eeb5fc0a7af0d081696645a1eab3a787cbcf88fad93dd6cd46d295a879a1775033a98563822ef1f6b69a581e49736c8d701b4453969340521e4ad4bf94b911b0e2d86f34eece4a6385ff1fe63220cd3cc592f36d6c491fa18f7c1404360d2a7753fe073e09a2fc42a4bbea55bc96d7f05c98aed2cc4a9fae8fd4a0197ff01fa7f0046e3c3eb59aaabca313a4ddaa5d20d27c2c5f1ac6d87fd3cb4bd35a1ec75d104f7c367331a3e295e53c4e80bae14b9792d0d526f740d4ff036faf5487967ffabe8e883d3fb0d16faadb28e1285ded41570c0b07c2559b531e0f9254ef88e5b10f64f4839a9a0b6c3c7f1b7850f4ad9bf0999a7f2ae7c45a658ea53036fc70199842b8e49e60f967de1ff3abfff6cd735b7cd8b8f9e248f156f6c6543869eb99823daea88debaf79f01e6521ec63fe72724ee3c822b88b3968b24852091583c49ab3c15fa1f79b18d98f04d9b6841c9a7ca0de2fcc02f95dd649492e8b56a31ec1e244337af6aaaede8bf99fc814ef57c0d5e08c3c7ecc1897980aa169a9926d20698df6930e2110cb460f49390100741095f8ed00412ae696d98efefd290da5f7d0b728d20a1ebfa6bd7d270f281a98c7b1e408435125aa483c6b7d633ff7588a941658f6129544d62945b9b8af71a8c62c0a50076cb8541ba7e4bde4ede441722c6eb9df8cfd0656339e86d226abaea05ea047f6b8307701f6c9a44cc9cb837b8eb62445925e8a8881d2538fcb2b249e4ee8b686ecfb49c4df86401d249aac35841e914004f9455d3fde375d20a01fba27b197a698d384c76505106801627e8336bd2d76d761a8", "signature": "5be552fa731e836793f6dda895dc9b1e2ccd669de1c843e00ea6fa3c5ebf97a34b26f1f3ac7ff2225ee4a7e430072c13da4066dcdcc05ba2b5f61a6e8d210709" }, { "secret_key": "c64dd20d42627526198a22647690c895b5b45b698f57a69dfbe48dbd426aa470", "public_key": "2e01d40416f78acddb34b8445ea4fd0ab3fa9e6643044752213f07c7f0ff43a0", "message": "821b9f7c16104b533bd127184fd72ade092b13bbd9aceed29b8d10f16688922d165f8931d53df590fb713b674d805ce0c9d6ce6c43ba6968191d12bfa08a8ce22e8f336b2b491af25d1b1606f930caebe522392a87d42ce7bc167aa7b610597220af31a665353071e8d9e5f42078b9c388bf040258e21f9c3ab38c0427618b2c28d3430df27921bfc58487b3461978bfa8bf586cfe8358e092f8f47466e762451d50164a0d74360f66b4cd3a3575da01da23752430c035da859f577de22290aab4ed7f34d267406ab547eb445cc64df53019427f4eb72bca55397153d01ccf7ec97d7a967d9aff46231d2e2027b38f3b41bd2cb1b798a4ae88abf4896216d315bd5383024259e59742802a911badcf8473db91af319733320cb9521ef9ce437267b6ea17bcafe5d0903b123a35c988f49834f61dd552640a3276da26af17ec21a20296586dd6f4b36c7a4f0b899d70b42af89e29370132edfb72d6834194a1609360b1f1feab89b96b8e8f0f68987c57cce0bab768113718fb1709de2df32177d44085da5efd9da70e1a858c92f245acfee64b71f3eb16e04fc13989e69337999701dd73abc266c9fd4cff91a0fd04fbd8b13b12e6f450385715848e007fa0d463119fd7de6325b640042b654212e0db8da1adebd2a7589f77ee4f752d282ca1119c431b17ad0a021ef2bf95e5ac4704e62d7039d0e651e456d60e63bade401cca77c9a89163174d5022d745abdc76b9ffe2544155235e3063e6e4aeec44ed5d8ab408d966fec12016c130730bbc558732065da800a70cbfb0fccca45d0028cbfd9632ddb2f0ed12edae7b930b106c9d1285a4b870de7507999c74793dd497408719c898abe49f7f33a33e69b50fa5af9480068566d1fddf4482d79704ad8ef11b88b42cc69fce8a557b5ba510e708b9375123038568270de407232e95621e2d04570bec2c41eccfd855b21f0c9bbaa23b5c5815fc888f7fbed482c320ffa1e063e87b55bc8f7eeea374063a9be65f7ed9225bf6ca34cfa311b79f3a258c252e6345ed6ac84748f46807a55d4ba41266169cd262d4f72279ef0caa77ff44933532bd1374756c23ec85f55efe9fc2331f26f881629f80c2692f7f53e4bc6f22efb45457a223f0d1c4", "signed": "deacc8c23218727676d540a23bdad7810211e6d57ad294c37d4b1c9af6b337a53f7880d2bafa73b30508c008426bf8d7c965a1f4a422a1bc7d6ad6226fd19706821b9f7c16104b533bd127184fd72ade092b13bbd9aceed29b8d10f16688922d165f8931d53df590fb713b674d805ce0c9d6ce6c43ba6968191d12bfa08a8ce22e8f336b2b491af25d1b1606f930caebe522392a87d42ce7bc167aa7b610597220af31a665353071e8d9e5f42078b9c388bf040258e21f9c3ab38c0427618b2c28d3430df27921bfc58487b3461978bfa8bf586cfe8358e092f8f47466e762451d50164a0d74360f66b4cd3a3575da01da23752430c035da859f577de22290aab4ed7f34d267406ab547eb445cc64df53019427f4eb72bca55397153d01ccf7ec97d7a967d9aff46231d2e2027b38f3b41bd2cb1b798a4ae88abf4896216d315bd5383024259e59742802a911badcf8473db91af319733320cb9521ef9ce437267b6ea17bcafe5d0903b123a35c988f49834f61dd552640a3276da26af17ec21a20296586dd6f4b36c7a4f0b899d70b42af89e29370132edfb72d6834194a1609360b1f1feab89b96b8e8f0f68987c57cce0bab768113718fb1709de2df32177d44085da5efd9da70e1a858c92f245acfee64b71f3eb16e04fc13989e69337999701dd73abc266c9fd4cff91a0fd04fbd8b13b12e6f450385715848e007fa0d463119fd7de6325b640042b654212e0db8da1adebd2a7589f77ee4f752d282ca1119c431b17ad0a021ef2bf95e5ac4704e62d7039d0e651e456d60e63bade401cca77c9a89163174d5022d745abdc76b9ffe2544155235e3063e6e4aeec44ed5d8ab408d966fec12016c130730bbc558732065da800a70cbfb0fccca45d0028cbfd9632ddb2f0ed12edae7b930b106c9d1285a4b870de7507999c74793dd497408719c898abe49f7f33a33e69b50fa5af9480068566d1fddf4482d79704ad8ef11b88b42cc69fce8a557b5ba510e708b9375123038568270de407232e95621e2d04570bec2c41eccfd855b21f0c9bbaa23b5c5815fc888f7fbed482c320ffa1e063e87b55bc8f7eeea374063a9be65f7ed9225bf6ca34cfa311b79f3a258c252e6345ed6ac84748f46807a55d4ba41266169cd262d4f72279ef0caa77ff44933532bd1374756c23ec85f55efe9fc2331f26f881629f80c2692f7f53e4bc6f22efb45457a223f0d1c4", "signature": "deacc8c23218727676d540a23bdad7810211e6d57ad294c37d4b1c9af6b337a53f7880d2bafa73b30508c008426bf8d7c965a1f4a422a1bc7d6ad6226fd19706" }, { "secret_key": "0f8e9f3526b4faea9276f22a1779e6f82709808f6d0c612adfe32a6e8a061005", "public_key": "d48c3f0fdef382d1d80313e846fca95e418176bb5dfa9d398c1d2124776f690a", "message": "0ccd37c4cfd8e70ca3bb3946d09d70d0f6a4b81d6dfb079d7873748071589880927382f7436a6ef8f51c255473dd01feb52c8edbe4d3255713e68d640f3dcf158f2bfb9fbecf71f0719dfe8ce6b601281ba6c20a56b4f8e7caa4aa9f868fbfc5e4321c22d65f0382c4896bf9bebe3546949e8185a4d817e45b5d1293953821bdd98ec259f64a3de53865b149ea01c8f683ecda61da5dc10e7ebdddfe7484f5eb1031b7916587caa399a06b6fea4c5e6e0be650fbdf06c1036df2cc35f62ea0ea713f52809d77f47c2e55c92392481680b6332056226913b0ce88a6c55a26bdb5b8bab3cf4695a8c522302c4eba37d31ff77e58301bccfc7c7be8580c6342687995f44acd190965ae0d7bf0669592b6ad88743ebb360c73e0484a23d2f9e99e9eb038dcbd87ca9b1a498f1b2d35fedd7f8e1f7fd8ca526486911e076aeab4877bbacf378a2855f9c5ac039130dc690e177d67b244cc8ad032379ef71fe05e9c8613d8f5d6ea3d4e3e47222029cc004253be47f87fb5e3314c4898134b87acf10b2538bad897bdc5012d8f9762c871b653d400fee0ceed5ef6bdd16faf3f0abdbd72cd0a12940546f0995ff14b0f1bd54856ff74c36eb4f22d7287aefdc609998c1f41bcc3bb3a5fa49234f4fa8e929cd0f554b315395dae873c61ca70e0410c2fd5a115d2a6ff1f1c94b27ba450b8194b21f095c61a5f215e3c84f5d43f0e736286d33b8c47814db979f9dc00919846bee685337d99555a24472e6b00b3f4a14311a6c7c904ba5889da6c1ddcc1117580f5fbc41f2b8a4268cf0e9fa5bf412534c9e4052aacb504cb86e2147ab8023d58800b763f9abf9d0440788a51dfe5cbd44230ba5228f1f5960ea3a4e4044d36daf811cbdbec5d696463d8e941f27217563bb44a2118a4f5acd6e794de17e028cbdeefdef2cbf03dd32e7899e65a1cf839f5d90e1f8c364b577fe3105353f66768dbf7af0c521aa8a49f7a22082d88f901498c90b9d7777ed2f9f0e8a552d8a1fa5e9632ed853258c9c215b6dbb4111dcfca554bfbc9bba22f88bc55552c6d862556d741dad59f215e37288346ca7d7fd8c65a380d720caff9efa149f3fda232daa5b12ef11c0af0862bd0229e075a3c6b60ef0bbb3dad7f2908", "signed": "2f59a2936073913834eb15a0e0bcb9aa804089468f24dd1b2d37a1934ae9ba1020ff64b72eec03268d0a7c012c4e796300f6df7adda01c8bc5e9015ccdee1a000ccd37c4cfd8e70ca3bb3946d09d70d0f6a4b81d6dfb079d7873748071589880927382f7436a6ef8f51c255473dd01feb52c8edbe4d3255713e68d640f3dcf158f2bfb9fbecf71f0719dfe8ce6b601281ba6c20a56b4f8e7caa4aa9f868fbfc5e4321c22d65f0382c4896bf9bebe3546949e8185a4d817e45b5d1293953821bdd98ec259f64a3de53865b149ea01c8f683ecda61da5dc10e7ebdddfe7484f5eb1031b7916587caa399a06b6fea4c5e6e0be650fbdf06c1036df2cc35f62ea0ea713f52809d77f47c2e55c92392481680b6332056226913b0ce88a6c55a26bdb5b8bab3cf4695a8c522302c4eba37d31ff77e58301bccfc7c7be8580c6342687995f44acd190965ae0d7bf0669592b6ad88743ebb360c73e0484a23d2f9e99e9eb038dcbd87ca9b1a498f1b2d35fedd7f8e1f7fd8ca526486911e076aeab4877bbacf378a2855f9c5ac039130dc690e177d67b244cc8ad032379ef71fe05e9c8613d8f5d6ea3d4e3e47222029cc004253be47f87fb5e3314c4898134b87acf10b2538bad897bdc5012d8f9762c871b653d400fee0ceed5ef6bdd16faf3f0abdbd72cd0a12940546f0995ff14b0f1bd54856ff74c36eb4f22d7287aefdc609998c1f41bcc3bb3a5fa49234f4fa8e929cd0f554b315395dae873c61ca70e0410c2fd5a115d2a6ff1f1c94b27ba450b8194b21f095c61a5f215e3c84f5d43f0e736286d33b8c47814db979f9dc00919846bee685337d99555a24472e6b00b3f4a14311a6c7c904ba5889da6c1ddcc1117580f5fbc41f2b8a4268cf0e9fa5bf412534c9e4052aacb504cb86e2147ab8023d58800b763f9abf9d0440788a51dfe5cbd44230ba5228f1f5960ea3a4e4044d36daf811cbdbec5d696463d8e941f27217563bb44a2118a4f5acd6e794de17e028cbdeefdef2cbf03dd32e7899e65a1cf839f5d90e1f8c364b577fe3105353f66768dbf7af0c521aa8a49f7a22082d88f901498c90b9d7777ed2f9f0e8a552d8a1fa5e9632ed853258c9c215b6dbb4111dcfca554bfbc9bba22f88bc55552c6d862556d741dad59f215e37288346ca7d7fd8c65a380d720caff9efa149f3fda232daa5b12ef11c0af0862bd0229e075a3c6b60ef0bbb3dad7f2908", "signature": "2f59a2936073913834eb15a0e0bcb9aa804089468f24dd1b2d37a1934ae9ba1020ff64b72eec03268d0a7c012c4e796300f6df7adda01c8bc5e9015ccdee1a00" }, { "secret_key": "fe7cdc7966d0ffb9c76f4a18e7f0bf90690eb76dc3d3d50884648e2e3937d020", "public_key": "a12ee9812d6af6aa4879fa72bc0a69804ea1a85f9bc4a26a5ba7cfbb914d0dd9", "message": "dcb91cf155461a60df07eec29d98616ed1728b34efa9e1f7445a9158a8f88d7faaae0e24725aeff263c3f74f0c684f1858f05b6995d2846b6a832f67085a4276d8661aebd3bfcc73181f1f510293b6de5e4bb23ff2dca1df608cb14ae522ac4b51e1f9b973ab8bafcd534e71c57181b11896ee1061fb369ca4d2939d1e57060d9f4db0a5c0b07d52687f157817e63e2fe7ebcc3e7c95efe05b859910c95eede86d14399e616248a28c24c414dbb693af9be435a3a9cdc33e0e2a586918d91b8a85cedd1612d7c1a21792bdd43a915b157e04bb3a44ecbe23fa49cc55daabbeaa155a737f765b8ddb0f3b15d4ecf2cef7054ca73ec87d91752c2e99195cdb1958844f144edab82a97549fc9cec08e8711cff863b63fc231a77f762e5cd9da9d59409252e99ab04c42bc57097e464e3c6a48d80241e6325e3e4094989b34c0e8b32b1a7829d54df32a050ee87d8f7c4fe3e4f4f7049d1feecdbea67108350db4e8edbe3c3ff8ab2a25d147b1c1c5821b0f8c21042d655db831691f59983f27d2ed1d4906c544e24e79be68653c9b229a7fb61ef545bab16e9881cb4d9265e293590a0bc2dc86bad23007ff40c95861923b498241c10d26bf4848f62ba7383f649dc38af1840d0de928a9bfee5e11b51434163a7ab1ed537415f1e93285e3699205720158f9557d8641ed2bf485b8212c8f82668bac3c228e6924c17d0d98f2e6d9234371c4425eb758689fdb0dc1cea1394a2862e87bb38e624c34799168613278225fb5e19c9247ada35554f2c4addbb61d5a502a708127d6efbca8f735090bdfdd88db29fbd14b69ab1262f0c3e26d263a59c5ae4639065383d5250b54cf592bb7adfeaae0d2fe816b6381e86ea2d1c71813cbc3d8fe2d31de7b30fb6ec2294fe4536a36c6a1835a7162ab4bf89d19466119657b0e4645aef503505b4d55df977bd2c90c64406f4970d5cff245b835322a6fbe234e5efbb5ea45e8f0d3973be4aaa2aadaab077d6c9b25bd4494409e93479d2d1507f66bc8bef82999a13c7943b472b9e61ec29debefbf2241423e0faa42c1a338a7a6131ded935ba03a28662e68593368dde54b462f2a5fb746185ff5503e69ba36bf16f71458cdd057e5c17267f67498d652860b465e", "signed": "b52d03fdebcd429737ef70920687211fbb4c04f81e355cec7072c5054175d2ed77f38f466f001422da8fcdf067db1451007cab607f049c2e2607b57d44713c04dcb91cf155461a60df07eec29d98616ed1728b34efa9e1f7445a9158a8f88d7faaae0e24725aeff263c3f74f0c684f1858f05b6995d2846b6a832f67085a4276d8661aebd3bfcc73181f1f510293b6de5e4bb23ff2dca1df608cb14ae522ac4b51e1f9b973ab8bafcd534e71c57181b11896ee1061fb369ca4d2939d1e57060d9f4db0a5c0b07d52687f157817e63e2fe7ebcc3e7c95efe05b859910c95eede86d14399e616248a28c24c414dbb693af9be435a3a9cdc33e0e2a586918d91b8a85cedd1612d7c1a21792bdd43a915b157e04bb3a44ecbe23fa49cc55daabbeaa155a737f765b8ddb0f3b15d4ecf2cef7054ca73ec87d91752c2e99195cdb1958844f144edab82a97549fc9cec08e8711cff863b63fc231a77f762e5cd9da9d59409252e99ab04c42bc57097e464e3c6a48d80241e6325e3e4094989b34c0e8b32b1a7829d54df32a050ee87d8f7c4fe3e4f4f7049d1feecdbea67108350db4e8edbe3c3ff8ab2a25d147b1c1c5821b0f8c21042d655db831691f59983f27d2ed1d4906c544e24e79be68653c9b229a7fb61ef545bab16e9881cb4d9265e293590a0bc2dc86bad23007ff40c95861923b498241c10d26bf4848f62ba7383f649dc38af1840d0de928a9bfee5e11b51434163a7ab1ed537415f1e93285e3699205720158f9557d8641ed2bf485b8212c8f82668bac3c228e6924c17d0d98f2e6d9234371c4425eb758689fdb0dc1cea1394a2862e87bb38e624c34799168613278225fb5e19c9247ada35554f2c4addbb61d5a502a708127d6efbca8f735090bdfdd88db29fbd14b69ab1262f0c3e26d263a59c5ae4639065383d5250b54cf592bb7adfeaae0d2fe816b6381e86ea2d1c71813cbc3d8fe2d31de7b30fb6ec2294fe4536a36c6a1835a7162ab4bf89d19466119657b0e4645aef503505b4d55df977bd2c90c64406f4970d5cff245b835322a6fbe234e5efbb5ea45e8f0d3973be4aaa2aadaab077d6c9b25bd4494409e93479d2d1507f66bc8bef82999a13c7943b472b9e61ec29debefbf2241423e0faa42c1a338a7a6131ded935ba03a28662e68593368dde54b462f2a5fb746185ff5503e69ba36bf16f71458cdd057e5c17267f67498d652860b465e", "signature": "b52d03fdebcd429737ef70920687211fbb4c04f81e355cec7072c5054175d2ed77f38f466f001422da8fcdf067db1451007cab607f049c2e2607b57d44713c04" }, { "secret_key": "f6c9ab5ea75f294e8e0c07c4c09ed8eea3113bdfc2ef759e20a264571604108d", "public_key": "b12ff55bd3ec42610eacea28b313a16e19c9e8b47c2b15170991be088d65cf63", "message": "71623b39743e39c7e08638806d468a1a8a6f35c2ae388eefc27374bb52538814c4b36c9b8e389ad83183de02a1bbd0325734e4618754092337d3e7dc1256928e3528870ca7f00613a25b71bb15d1d9eaaff9f2269b71c19769e003ce845614b2ec95ed28ca855b5221d4cb80a6ca9466aa33e2510ddff7dce186159da70fc8b1fbac12a26e1fc0942276892ad6e9b003f56959bd313af289e7a0532a664b76b96b919854e0650cb8c52ec4c5fb5053af2f0cf8c0f22a523f9e2c6419df8d0b714ee3776800ebfa70776084667d6dcf541f14cf166262e0f64c4276ae28885e6cfd097b70c0d6186ea5dbd033323c987613da08645de07208bae12a178d8f7f650a25afbd701c85a1ba639ef9f121c40c5c129a4737343386a48183ff3c591389d89ecda526cffb2674f17bb1c23090554b1340849796a6d444460bb419427e93e6585b0f4f065ad87ee6edf54be6188a1dd5ace1364defa561f74e26769c9b291ee7555276501c6a49080da0924f3792c2a728a52007b1c07c95578fedaf403996239e9c55a9a44c3dfcc37cdf03fb485db5a08dff15a7a4f7b7f154742e8431564dc17dbd432e10337c2276fcfd9d70f7c3d570393a0c19f64051c73a870e205584106531d1fd2a1dd1c9d0fce14ffaaa077bb7e260251eed6c62bc6edc2422519440c2244eba384046b0eddaa6cf2c1c7eeebfcd78fcae18b82290552b59c0463dc450618ba67c770dec0e229b8460936ca819562bcb36969c8ff70bf113c11671e00b941355bf01ad54b05cfe2a048b38728cbdd1b49809e1f207aca3098d9942eec47d6c9d413b37c914fedd38acd5ffe496cac757c2ef8b77bd8403d14b1fc98a903fe2b979468233a7f2aed6f8d509d874e1dce05149af9df3fe4595c71e8bc463dee9384d5e0505d2a6b0a2b8a1ed6216aaae9dcc7602487a4c0851fdf09629c1e99118809a9544a6577af9f915d1e65d816220c48c8490fa9b70da422ad6800223d6d8c340f9eab2cc7e149362124a300b40cbb8c0a65da301dbba931ba564f35973ca8bf2d1edb56c194661955b3b68381fa15d4b8dc6ada1a5cebda3a4ccc55123e0057f4f821041937dd549209c82e116570bc908a28e3299a9441443498f74b3cc88e1a62d", "signed": "a7f9d08ba14183ef247f2c25fecc2b83eda6de58022e466ce78fcf50f71ce26162446562eea45d63a21c3b22561fd4680058acb825407a15408f271361a1460f71623b39743e39c7e08638806d468a1a8a6f35c2ae388eefc27374bb52538814c4b36c9b8e389ad83183de02a1bbd0325734e4618754092337d3e7dc1256928e3528870ca7f00613a25b71bb15d1d9eaaff9f2269b71c19769e003ce845614b2ec95ed28ca855b5221d4cb80a6ca9466aa33e2510ddff7dce186159da70fc8b1fbac12a26e1fc0942276892ad6e9b003f56959bd313af289e7a0532a664b76b96b919854e0650cb8c52ec4c5fb5053af2f0cf8c0f22a523f9e2c6419df8d0b714ee3776800ebfa70776084667d6dcf541f14cf166262e0f64c4276ae28885e6cfd097b70c0d6186ea5dbd033323c987613da08645de07208bae12a178d8f7f650a25afbd701c85a1ba639ef9f121c40c5c129a4737343386a48183ff3c591389d89ecda526cffb2674f17bb1c23090554b1340849796a6d444460bb419427e93e6585b0f4f065ad87ee6edf54be6188a1dd5ace1364defa561f74e26769c9b291ee7555276501c6a49080da0924f3792c2a728a52007b1c07c95578fedaf403996239e9c55a9a44c3dfcc37cdf03fb485db5a08dff15a7a4f7b7f154742e8431564dc17dbd432e10337c2276fcfd9d70f7c3d570393a0c19f64051c73a870e205584106531d1fd2a1dd1c9d0fce14ffaaa077bb7e260251eed6c62bc6edc2422519440c2244eba384046b0eddaa6cf2c1c7eeebfcd78fcae18b82290552b59c0463dc450618ba67c770dec0e229b8460936ca819562bcb36969c8ff70bf113c11671e00b941355bf01ad54b05cfe2a048b38728cbdd1b49809e1f207aca3098d9942eec47d6c9d413b37c914fedd38acd5ffe496cac757c2ef8b77bd8403d14b1fc98a903fe2b979468233a7f2aed6f8d509d874e1dce05149af9df3fe4595c71e8bc463dee9384d5e0505d2a6b0a2b8a1ed6216aaae9dcc7602487a4c0851fdf09629c1e99118809a9544a6577af9f915d1e65d816220c48c8490fa9b70da422ad6800223d6d8c340f9eab2cc7e149362124a300b40cbb8c0a65da301dbba931ba564f35973ca8bf2d1edb56c194661955b3b68381fa15d4b8dc6ada1a5cebda3a4ccc55123e0057f4f821041937dd549209c82e116570bc908a28e3299a9441443498f74b3cc88e1a62d", "signature": "a7f9d08ba14183ef247f2c25fecc2b83eda6de58022e466ce78fcf50f71ce26162446562eea45d63a21c3b22561fd4680058acb825407a15408f271361a1460f" }, { "secret_key": "43103df01a48a03c57f32f52d70c6849ee44580b2ab4ee72d548d848134f7ceb", "public_key": "a3cbe0d64b0560bcb5ae009001e314d9ec907901dd74a804a0059022ed9c6d04", "message": "738cbf06d00d4dcd5e5f243a1c18dd5ec20278884695a1cf3bea67bb5b05dd7e60a2a24fd325be6bf46b462873ec907f9de88dc2c762620b7e0ef72765d4bda662454993c828a1746e9ed8d19dff43c4c48527ac845f2186a4ad7c1d992a16245cd573073e0940dceed368110bb5fd0a4c8834ce88a77125b9147393c8b58cb16e5ebdc18244ebfa48baba46973fdcd485b1b2e5f3b0e70992cf1999580638d87f1f5b27c4d7f91decf37de2e734e3195535c631082b3ebaa8ce30a9c2c2db016d7d3547e621618850e22040038d0fe0faea2f9bf510b682c4fd14750e89b4c199ef0c990500543eeeab5f0b507a313199c2a2a0262d6d814cbc0933c592e256c3e29d524b066ea5a4543361a10450e0aa675c61408f307f26ee58969d63278f135b7dcb666b93f2cacfd83873471e974a286b09023f5015fa1aaf18bfbfa5f74385d0df6b9add516ffc0c3113e37e097838646ac93054ff4d9602066744ba3396953fd78168130170bb275c152bdd366f73065c0a7ad7ad00758cb99a7ac1b7809d26dfaac758468201eeb60dea368c33f257afe2f1b4c02e37bafe40f5d7fd40c87d1c56a0cb28e9d28369a3924bcef8b6d999dcf4294dd8c4143d75c6c25b5a4544488dde725248c78d93c15b815b01cbd0f31d1b00ac04837ef85b4003fc96d4457ac5a023623e67b66da4700a0859f83fdccd3c7aae09de09a057e00db44a2a6aacaa21746a49b8224689a5cc1854ba3dc4aa2aa34524e7a5a89d11eea356aaea5ef5fbf542c99f544db940f5086838ee2ab218b8d3f2e107d0b29d4b04830eed79c0768e02c2844b3cba326895f4ab38a3994b83ab30600ff511ccb595992f8cc0d2954807972da365b06fbdab539b2e03598b34e53cfcf93990b97aac1d329783366d451f972b8d8a00b6b8ecdb37279644cec1447c0998ee4f7090f34c9cc8530590cae765360aadb0ab3135004941c92302cbb2b350a14e8f30af5325c2b438005e3a9d4585e63265c327ba725754b33256917fb965ae9f02ed2126b481473dc0e931c2522bf00fe6a2ec95c792247b1e03396112f783070e2fe6c2cb982250d13f2d5460c744fde45323e631cccb540cd725f2c55a7058f230e82b79f366afcbb025b492554395", "signed": "195447beb1de4a7e36ea89a6ce3c99bcc89411df5e0b15f7ba0b1d110c456abc6b3f5f1da6106ed887864ba56aab466a8a63b335cfcf4c64d65c0e6fb480b401738cbf06d00d4dcd5e5f243a1c18dd5ec20278884695a1cf3bea67bb5b05dd7e60a2a24fd325be6bf46b462873ec907f9de88dc2c762620b7e0ef72765d4bda662454993c828a1746e9ed8d19dff43c4c48527ac845f2186a4ad7c1d992a16245cd573073e0940dceed368110bb5fd0a4c8834ce88a77125b9147393c8b58cb16e5ebdc18244ebfa48baba46973fdcd485b1b2e5f3b0e70992cf1999580638d87f1f5b27c4d7f91decf37de2e734e3195535c631082b3ebaa8ce30a9c2c2db016d7d3547e621618850e22040038d0fe0faea2f9bf510b682c4fd14750e89b4c199ef0c990500543eeeab5f0b507a313199c2a2a0262d6d814cbc0933c592e256c3e29d524b066ea5a4543361a10450e0aa675c61408f307f26ee58969d63278f135b7dcb666b93f2cacfd83873471e974a286b09023f5015fa1aaf18bfbfa5f74385d0df6b9add516ffc0c3113e37e097838646ac93054ff4d9602066744ba3396953fd78168130170bb275c152bdd366f73065c0a7ad7ad00758cb99a7ac1b7809d26dfaac758468201eeb60dea368c33f257afe2f1b4c02e37bafe40f5d7fd40c87d1c56a0cb28e9d28369a3924bcef8b6d999dcf4294dd8c4143d75c6c25b5a4544488dde725248c78d93c15b815b01cbd0f31d1b00ac04837ef85b4003fc96d4457ac5a023623e67b66da4700a0859f83fdccd3c7aae09de09a057e00db44a2a6aacaa21746a49b8224689a5cc1854ba3dc4aa2aa34524e7a5a89d11eea356aaea5ef5fbf542c99f544db940f5086838ee2ab218b8d3f2e107d0b29d4b04830eed79c0768e02c2844b3cba326895f4ab38a3994b83ab30600ff511ccb595992f8cc0d2954807972da365b06fbdab539b2e03598b34e53cfcf93990b97aac1d329783366d451f972b8d8a00b6b8ecdb37279644cec1447c0998ee4f7090f34c9cc8530590cae765360aadb0ab3135004941c92302cbb2b350a14e8f30af5325c2b438005e3a9d4585e63265c327ba725754b33256917fb965ae9f02ed2126b481473dc0e931c2522bf00fe6a2ec95c792247b1e03396112f783070e2fe6c2cb982250d13f2d5460c744fde45323e631cccb540cd725f2c55a7058f230e82b79f366afcbb025b492554395", "signature": "195447beb1de4a7e36ea89a6ce3c99bcc89411df5e0b15f7ba0b1d110c456abc6b3f5f1da6106ed887864ba56aab466a8a63b335cfcf4c64d65c0e6fb480b401" }, { "secret_key": "f9139e579fa96ebd6287db3babcda60f92e73153566f924cb5de04de4493481e", "public_key": "c06ce335533af8d8f337f2b38e0aafa2ce9b27223cd9ddc5ef32027f04889b7f", "message": "b330764ddc628e4ad67aa4982ae86d4581071c193ec3c58f813d7921b84d2a54562bd87417ae1de590a1a48c4ec7d556ad931d65c0543fdf0607c749859ee12f9952020c195cf8746095e1087cc6c3c8ef9d24052560ce813d6139b7a75c8f4b8ea30a9c4ab888d0a6341c99abd35e0903bfe56c93152340c41276d7f24e0912b12a4db3d7ee4484dfa53afc0b1aea1409d1e0328aa1c8604127ca2eb1a5e81bf31f8c7a51c6052c534efe6b3d0ee74ff5a9b11c6157e36477efa9382f5751be8c8c6454c446d6f8dc7e929525cc3de78cb1ba4aba9bd4be152610437582c965eea48cbd4caa6f308f85f4f8d006a042f619200762e1bb9ba422e65475b33a9494298cfbb75a152b36d2a05501807705b952765350cd14141d35d4986692d6c3bcfc6d61df0052a620aab8cc13205e754c16f93eca7920bbea5157ef112f0b64c1054f90a5ddc175a89e29242f57646e74cc885e81a1cc144c3d782d1152a9e4cfe76cb3ffabe7dbe603fb3869eca8699698709cc87fc961c1e299cfca22e3242eae788cff11bfca61026745f4976225b26ee200c4f1910c4b83df5ce46ef487d748d9c4c502141b7874caf41e5a297b248c2bac6990a15b07b4cf810e59287442d9a3696c02e8d7324d3cf730dda540536beb13cfdeae6180dd7484832dfa94e94aa6cba117aae17270f48f93b2f98ae9581718163f4463546c0ae0f279c36b92bee66f1ca2d6a4f726d2dfee0bc11c1d8a1fa62c3cc8aba266b98759286c1068483b2376b403c887fbb657dc0f255dea90dbd23308f7e0e842b498a8dfc7c9cd5aef0e87d56be40d50fc1dd4c0aa7dee55aebe4d6b6a52053962b87b0f2ee09a90816155333d5c57a14724e001bc3ded17843b76e2c47a176339c8defc54b55b2358ae7d01b0f6e08f31216ae90340694168a5a79ee883ea7858007d17c37359c99d6597efe460c1a2f7738ac32c5eb5e39e500c49c0dff9c4659e8c50cc5ca79d8ba4e5972d67225468fba64167a6b2c6f368935c7a049d35d355c7672520d3c9e4e43c671c3cb8dee259047495de0f56dd7191d5bd4bbd29517e364792ff89d33799b6e781c20193f5a316fb40de74fee2acc25e47f512214de3b1e9b382a86929c1573d3724c25017c0e5", "signed": "051d8d7f0b68d2eec72c81adfcfb31ae8558f60ab63c9f5652a8df638f666f1ebc0c6e0b411953bcda6b5151b2b93a39e3c5330a8573e168792272abd36c810ab330764ddc628e4ad67aa4982ae86d4581071c193ec3c58f813d7921b84d2a54562bd87417ae1de590a1a48c4ec7d556ad931d65c0543fdf0607c749859ee12f9952020c195cf8746095e1087cc6c3c8ef9d24052560ce813d6139b7a75c8f4b8ea30a9c4ab888d0a6341c99abd35e0903bfe56c93152340c41276d7f24e0912b12a4db3d7ee4484dfa53afc0b1aea1409d1e0328aa1c8604127ca2eb1a5e81bf31f8c7a51c6052c534efe6b3d0ee74ff5a9b11c6157e36477efa9382f5751be8c8c6454c446d6f8dc7e929525cc3de78cb1ba4aba9bd4be152610437582c965eea48cbd4caa6f308f85f4f8d006a042f619200762e1bb9ba422e65475b33a9494298cfbb75a152b36d2a05501807705b952765350cd14141d35d4986692d6c3bcfc6d61df0052a620aab8cc13205e754c16f93eca7920bbea5157ef112f0b64c1054f90a5ddc175a89e29242f57646e74cc885e81a1cc144c3d782d1152a9e4cfe76cb3ffabe7dbe603fb3869eca8699698709cc87fc961c1e299cfca22e3242eae788cff11bfca61026745f4976225b26ee200c4f1910c4b83df5ce46ef487d748d9c4c502141b7874caf41e5a297b248c2bac6990a15b07b4cf810e59287442d9a3696c02e8d7324d3cf730dda540536beb13cfdeae6180dd7484832dfa94e94aa6cba117aae17270f48f93b2f98ae9581718163f4463546c0ae0f279c36b92bee66f1ca2d6a4f726d2dfee0bc11c1d8a1fa62c3cc8aba266b98759286c1068483b2376b403c887fbb657dc0f255dea90dbd23308f7e0e842b498a8dfc7c9cd5aef0e87d56be40d50fc1dd4c0aa7dee55aebe4d6b6a52053962b87b0f2ee09a90816155333d5c57a14724e001bc3ded17843b76e2c47a176339c8defc54b55b2358ae7d01b0f6e08f31216ae90340694168a5a79ee883ea7858007d17c37359c99d6597efe460c1a2f7738ac32c5eb5e39e500c49c0dff9c4659e8c50cc5ca79d8ba4e5972d67225468fba64167a6b2c6f368935c7a049d35d355c7672520d3c9e4e43c671c3cb8dee259047495de0f56dd7191d5bd4bbd29517e364792ff89d33799b6e781c20193f5a316fb40de74fee2acc25e47f512214de3b1e9b382a86929c1573d3724c25017c0e5", "signature": "051d8d7f0b68d2eec72c81adfcfb31ae8558f60ab63c9f5652a8df638f666f1ebc0c6e0b411953bcda6b5151b2b93a39e3c5330a8573e168792272abd36c810a" }, { "secret_key": "c8ee954db5a11b292ed97764fae6b283051db57dcdc0aa0df5393bb60c112ed3", "public_key": "5c2f81824e9975dd7ea353bc66807dedc7610349794e2fc08e5a31e002e3fe07", "message": "7ba3fb568315aa81e21f197780edc2c6ea26d8d06a4378912fca2301cf1eab3d803c8469deddf376703ddb7ce06a77dab20e02344fadcc50022ab3c713cd03c1daa93f1c7ea572629f610b5e3c51411bb8c19694bbce903cac4705f9b5dd0f47bc5d0aa3253f908870299027ffbd3449eebad45332b5d0c4f533dbed18a99a2498b9164e245fb65c0afa0b053703a0cf95940ac7a0195d4f7046609cf04371338706b9b1986c0f118175d2cdfce74a6f88659825854e94ece58f5157636d6235b76d32745a2a81a9671a8f86027ba9e01763888fc171cef7c451c36072bc7499839d431cf18cd7c6c9fba3aa712a054328ccd62be4820abd5e782162764611d4539ba2cebdc209b3f4e4b69c3d64073e920d215214fb0fda44185aada5c36127a15ba15ca28a3ad086e9d03366869c60c3fbcebd869d2e40643e833f894803f980a2da7ea4e59ce4d7c06fd2aff087ee7bcfddaa3b32817ce63a63587dbafef380013a6f1ee3734b94ca3df9644dd0434302ecb324afe35f465c9c1c931b27294fc6ee0272de2242ae90d7f2e067027ef8642e8f171ed880ffabce8a20a1b3e339ad4e3f1a9001f20f90026188fde34b217a6e26aaff18422b7f843d0fdda321c319c778f23137f20ccc1bda1890e5bc916a5456d068d37b5acc6347720c56a5a491bc348d6c848a9c8fecfe58c92b1f302fe14919718cd5e78b7fd601d09dc01e6904861e8d68b3c57535b6136676cbc6e839af0dd739db89a7abd913fdf6b00e9ca02602de6ca0afd0913d992fbaa8ff822b9d9b09dda7a29be91910d8fa3caa2a5e518346c167c9f51941cf7353f3f34c1dab33485d0a8c19daf951fd3ef20d0b119d8038df90c114a25a5b93ae40ec44b9a5d2bc1c6517c682500d4cdc197142bec3af8232c071428dc54c0d30454272e7336b0b5888a6e8fecde859e2accb7fb094acc54ffa481f7623d944691f04fb3613a9954980f17e2ad2173d68cf0ec1b67d8a91d6ec82946bcf05cb90681a71627b590238334e3d5ab9da6a089bd72624df9074cdd2309e04dfcae032812fe84f9db882cdeaae69ee5daa5a66ff427fc452edd0769b6aabcc139d0f70af8b97430e644f58a41287a93f631deda82ca0716d79754c5c503e52a665da", "signed": "f3077a75101e121e5c3e77d8ed97b578d239bd421803d3455b5654405a4c586a6092e13a8529bace468a305784b373e433fee4a3df8956befa012fd8a8eed10c7ba3fb568315aa81e21f197780edc2c6ea26d8d06a4378912fca2301cf1eab3d803c8469deddf376703ddb7ce06a77dab20e02344fadcc50022ab3c713cd03c1daa93f1c7ea572629f610b5e3c51411bb8c19694bbce903cac4705f9b5dd0f47bc5d0aa3253f908870299027ffbd3449eebad45332b5d0c4f533dbed18a99a2498b9164e245fb65c0afa0b053703a0cf95940ac7a0195d4f7046609cf04371338706b9b1986c0f118175d2cdfce74a6f88659825854e94ece58f5157636d6235b76d32745a2a81a9671a8f86027ba9e01763888fc171cef7c451c36072bc7499839d431cf18cd7c6c9fba3aa712a054328ccd62be4820abd5e782162764611d4539ba2cebdc209b3f4e4b69c3d64073e920d215214fb0fda44185aada5c36127a15ba15ca28a3ad086e9d03366869c60c3fbcebd869d2e40643e833f894803f980a2da7ea4e59ce4d7c06fd2aff087ee7bcfddaa3b32817ce63a63587dbafef380013a6f1ee3734b94ca3df9644dd0434302ecb324afe35f465c9c1c931b27294fc6ee0272de2242ae90d7f2e067027ef8642e8f171ed880ffabce8a20a1b3e339ad4e3f1a9001f20f90026188fde34b217a6e26aaff18422b7f843d0fdda321c319c778f23137f20ccc1bda1890e5bc916a5456d068d37b5acc6347720c56a5a491bc348d6c848a9c8fecfe58c92b1f302fe14919718cd5e78b7fd601d09dc01e6904861e8d68b3c57535b6136676cbc6e839af0dd739db89a7abd913fdf6b00e9ca02602de6ca0afd0913d992fbaa8ff822b9d9b09dda7a29be91910d8fa3caa2a5e518346c167c9f51941cf7353f3f34c1dab33485d0a8c19daf951fd3ef20d0b119d8038df90c114a25a5b93ae40ec44b9a5d2bc1c6517c682500d4cdc197142bec3af8232c071428dc54c0d30454272e7336b0b5888a6e8fecde859e2accb7fb094acc54ffa481f7623d944691f04fb3613a9954980f17e2ad2173d68cf0ec1b67d8a91d6ec82946bcf05cb90681a71627b590238334e3d5ab9da6a089bd72624df9074cdd2309e04dfcae032812fe84f9db882cdeaae69ee5daa5a66ff427fc452edd0769b6aabcc139d0f70af8b97430e644f58a41287a93f631deda82ca0716d79754c5c503e52a665da", "signature": "f3077a75101e121e5c3e77d8ed97b578d239bd421803d3455b5654405a4c586a6092e13a8529bace468a305784b373e433fee4a3df8956befa012fd8a8eed10c" }, { "secret_key": "6dbc559e4ab193eebf70c5c32d797be00b7311e8e6691da9afcc187291f2501c", "public_key": "38a7034476fb9382f1417768c42162951a2636902c3898c029be278ab4c31f31", "message": "88ee2365f7cf9de33acd53564968b2dc7f7370b7e7033f4c663a88c25f60f7f711d61908ebf1f5bb72835553c8aa8c8e4fcdecd37978238289bf6ca84876d228217a28d81b0b457c922e91ecba8d3e1d2e6659c2b0aea051b9c2e09c7dfeb51d30ede767570341ffac1ecf0de20c82d1e9ed0775deac72da7c2dec234865dec83f6715e1c3c59de2033cc24d86bc2d31aa16649686ede0dbbd8964c3a64a3dca5588d7248b1f24df8d75f09aac62c07828ca431a3a2d77a60cc93cfa3495cabeb1904ed5b563984e8c20777bac8774108a64eda58fb320244a3add3e3e7a76cd137cfa4a09b6e6e93011ea0ae65171af130711766cd25b3c74ec54c0bdfa02b3120ac29087ebac9837fca65ba971bc4281dd557c500e225ea66c3c3fd52206c19a9f9395463169f8c7a846bd9f834d7f337d0b61fb30bce294f478ae1f1d977e454e433ee8729fb065cce03fb2e435dcbcbfba01537e7a6762e55e7ed22528303704beb5ae381f2e181056f25133273cf17ddf2b06e2d9477f2c09755fc8d9c73cb33100468c64131c686cac79fd384501e50f8b0bee28ba39583f42e4fd3799e24f60da5fd3c779aabf699ffd2321ed045a85bc6424f60fdcc49c1cb31f249a4236c09491768181b921f58602fd415c1edeb26f39324addff14771324737c6720cc92391b949dcb4212bd6931d4de51401e7f953b7b036b223f0af7a8e408b04ea635a23fa0709ba042a5d992954c09d8581dcccf52568ad27a1cc71d18aa2740f621212e7f4c5e5e5e5e4532d9a67ec2773ac21c8a4b002d6524f6182dd371735d2c2abe6c95c281c6fb1e976bc17e383fd52aeaaa9fbd4abb82a2cc65395f8c2cc7d8182a0d250c685cfcba93a951ee7c503c6e3eec236ce33e086c610728737c1c3b3a24252da7f21672d928ebda993a94c458ab990f5d19d80023c36aa16eafcab143f352e97d6409f3249941119bfd9f5f9084724d9ebad383b10f34d33ac830cce9e5cb8aecee6f40301cbbe309fd061534a7d0c3edaaea02a171d8b2349dbeec628520ac334a5bfe28a9d5f4c0d740f7c72d4d72d89a97326a03002d1ef38522bcd37b42847a314bd843ec88d1f2f9d39f57f2f1a13d0140a8847450448c880b3ae76531e95c4392973250", "signed": "31f16a7caf2b74f65e057c9333a1a2633dac7346338f798510730eb8d5d325fc1080dd5aad5fce0534e9543f3c93586804464af5886e8644129c77ebaa485f0188ee2365f7cf9de33acd53564968b2dc7f7370b7e7033f4c663a88c25f60f7f711d61908ebf1f5bb72835553c8aa8c8e4fcdecd37978238289bf6ca84876d228217a28d81b0b457c922e91ecba8d3e1d2e6659c2b0aea051b9c2e09c7dfeb51d30ede767570341ffac1ecf0de20c82d1e9ed0775deac72da7c2dec234865dec83f6715e1c3c59de2033cc24d86bc2d31aa16649686ede0dbbd8964c3a64a3dca5588d7248b1f24df8d75f09aac62c07828ca431a3a2d77a60cc93cfa3495cabeb1904ed5b563984e8c20777bac8774108a64eda58fb320244a3add3e3e7a76cd137cfa4a09b6e6e93011ea0ae65171af130711766cd25b3c74ec54c0bdfa02b3120ac29087ebac9837fca65ba971bc4281dd557c500e225ea66c3c3fd52206c19a9f9395463169f8c7a846bd9f834d7f337d0b61fb30bce294f478ae1f1d977e454e433ee8729fb065cce03fb2e435dcbcbfba01537e7a6762e55e7ed22528303704beb5ae381f2e181056f25133273cf17ddf2b06e2d9477f2c09755fc8d9c73cb33100468c64131c686cac79fd384501e50f8b0bee28ba39583f42e4fd3799e24f60da5fd3c779aabf699ffd2321ed045a85bc6424f60fdcc49c1cb31f249a4236c09491768181b921f58602fd415c1edeb26f39324addff14771324737c6720cc92391b949dcb4212bd6931d4de51401e7f953b7b036b223f0af7a8e408b04ea635a23fa0709ba042a5d992954c09d8581dcccf52568ad27a1cc71d18aa2740f621212e7f4c5e5e5e5e4532d9a67ec2773ac21c8a4b002d6524f6182dd371735d2c2abe6c95c281c6fb1e976bc17e383fd52aeaaa9fbd4abb82a2cc65395f8c2cc7d8182a0d250c685cfcba93a951ee7c503c6e3eec236ce33e086c610728737c1c3b3a24252da7f21672d928ebda993a94c458ab990f5d19d80023c36aa16eafcab143f352e97d6409f3249941119bfd9f5f9084724d9ebad383b10f34d33ac830cce9e5cb8aecee6f40301cbbe309fd061534a7d0c3edaaea02a171d8b2349dbeec628520ac334a5bfe28a9d5f4c0d740f7c72d4d72d89a97326a03002d1ef38522bcd37b42847a314bd843ec88d1f2f9d39f57f2f1a13d0140a8847450448c880b3ae76531e95c4392973250", "signature": "31f16a7caf2b74f65e057c9333a1a2633dac7346338f798510730eb8d5d325fc1080dd5aad5fce0534e9543f3c93586804464af5886e8644129c77ebaa485f01" }, { "secret_key": "c9d416830ae2028f2175d22b614c79198c670cfaa0e7a36150ef0fee21a95ce6", "public_key": "6e3eb4d01873072df946f1792f7106330895e7a76dd9ae27f8a988039490fd4b", "message": "ff9ad4837cd0bb77d6210fdddc755e6c0f1a73c2bcd03f7a5869e7342cfd73cf7086f865561560277bf6c3421a912d67658b1fa97057c496f4be8edcbe18b5ecd08a1e7db25223abda208fa531f4b280aa03b04b60603411d374ba7cbb020bb9a8ce4c0e45a7e132144843c31f8b45c58eb3ea853c2ceb61376e9df81d9778e721adac77b50354937f34372fccd575e88d9d058e43df942f2c43b523c8098e6dd9e6bd21d5a649b472d41e345fcd5efddd49eab30270cd8788404f28516e09d3acc40048b39d3246f757e482e1459c626b799e04d06727137371e120afb9fec39a25f4e6764bf9792fe492ee0f210b57db9ebb9e8ef41b02c7fee9edd4b6174c570de020a391287133fe8ccb41a83f91bd22382b21e1d7ebc2c7e5018ef5142d82637d02620fbc0569cc09c44e911112bbae99064d68d1c69e77c9930b0de030c8c1d748c414059d5e299b7edc08940651894b303a2b32dd2c365a067c9723585594644d3ee8de1a51faea0e650f2124885a94cb99eb903b7d4579bde591497d953930d363dddbdac627b97a91f49682df8e7250a7073d383a7a22cf113f2858ce6b632a2892c4e88aa9a0d289eb57629b008d3b1b6081e6fe5d3c0a6c802189b5f108e766319e15b33eaa5b8ced4027eaec83b4ac68b14b8298bc51cd8eb3809b7a2d684fe32bbd9fab5c918eeb17cc444d73f730d4c8cc057bd3a2f1f0aebb61632934e61702168829cd7e91de81509629d01a8cdefe0d1ac49e21f0c5fbe1b2244827268a0a27357e158bd76884a21e7f1fac1b6272166d5a9f64f9b672989a8762f512bf1df4b2ab699765f2cd8396f476e7f59995dee7d890207eff0fd27263ec232e37cfedfe7c440555d4ca74e52da246c4b83757beafd2ab2a51efe160bb02b98c26d6b2c3f0c1aacb2f3c34a5b2a3b66fee175b787548073d8b5777c6be880bdc196b3374a2154f94d9360f7755ac6815a28af296271e22a8f23543c74955a609125b02a569218011420295ccf0d7356999a5b895cc88483fadf7970cec6c64240f7079fdb15ffc5c4227e53926d278ba0fed3c3993bc86822823dd581a32ab2e3a07f79430224b274eadd845598a7d1d89676aaf23677774b7b0583bcc83599d155d14b09adcf49ed505e8", "signed": "47faad4e655293eda156b2a1fabbfb7e009fc290aafedbd5652114a47853bc77a8233a2b179f605477d787878cbb15ea6124df8dc57b2ce7be7d18b7162fb50dff9ad4837cd0bb77d6210fdddc755e6c0f1a73c2bcd03f7a5869e7342cfd73cf7086f865561560277bf6c3421a912d67658b1fa97057c496f4be8edcbe18b5ecd08a1e7db25223abda208fa531f4b280aa03b04b60603411d374ba7cbb020bb9a8ce4c0e45a7e132144843c31f8b45c58eb3ea853c2ceb61376e9df81d9778e721adac77b50354937f34372fccd575e88d9d058e43df942f2c43b523c8098e6dd9e6bd21d5a649b472d41e345fcd5efddd49eab30270cd8788404f28516e09d3acc40048b39d3246f757e482e1459c626b799e04d06727137371e120afb9fec39a25f4e6764bf9792fe492ee0f210b57db9ebb9e8ef41b02c7fee9edd4b6174c570de020a391287133fe8ccb41a83f91bd22382b21e1d7ebc2c7e5018ef5142d82637d02620fbc0569cc09c44e911112bbae99064d68d1c69e77c9930b0de030c8c1d748c414059d5e299b7edc08940651894b303a2b32dd2c365a067c9723585594644d3ee8de1a51faea0e650f2124885a94cb99eb903b7d4579bde591497d953930d363dddbdac627b97a91f49682df8e7250a7073d383a7a22cf113f2858ce6b632a2892c4e88aa9a0d289eb57629b008d3b1b6081e6fe5d3c0a6c802189b5f108e766319e15b33eaa5b8ced4027eaec83b4ac68b14b8298bc51cd8eb3809b7a2d684fe32bbd9fab5c918eeb17cc444d73f730d4c8cc057bd3a2f1f0aebb61632934e61702168829cd7e91de81509629d01a8cdefe0d1ac49e21f0c5fbe1b2244827268a0a27357e158bd76884a21e7f1fac1b6272166d5a9f64f9b672989a8762f512bf1df4b2ab699765f2cd8396f476e7f59995dee7d890207eff0fd27263ec232e37cfedfe7c440555d4ca74e52da246c4b83757beafd2ab2a51efe160bb02b98c26d6b2c3f0c1aacb2f3c34a5b2a3b66fee175b787548073d8b5777c6be880bdc196b3374a2154f94d9360f7755ac6815a28af296271e22a8f23543c74955a609125b02a569218011420295ccf0d7356999a5b895cc88483fadf7970cec6c64240f7079fdb15ffc5c4227e53926d278ba0fed3c3993bc86822823dd581a32ab2e3a07f79430224b274eadd845598a7d1d89676aaf23677774b7b0583bcc83599d155d14b09adcf49ed505e8", "signature": "47faad4e655293eda156b2a1fabbfb7e009fc290aafedbd5652114a47853bc77a8233a2b179f605477d787878cbb15ea6124df8dc57b2ce7be7d18b7162fb50d" }, { "secret_key": "2d277dd55f57195ec072b47cb1448cb582c835739e6c98ba71ab128f70ce6b79", "public_key": "dfa92593ef0f0d974a1137830ad13848afef3b810c2a21bf779178ce4b3ab974", "message": "14549eddd5f2b7905dda19d74ab207aac6fb3e3df3295d845231ef3aea6e1f04ee033c9038dcb4bd3d5e452c54834d0ff2b7de3f322e5626949cd61d6e890138ff0ea8ad846e8fe887aee15fc48bbe4fba42455f5c17457ae789b405af859611fe1f8746185a65aef2134ea4d8f398d48df7c1bba4304408ae7efb35292409d508dd55ce21de8c28160dc9e877700c763d06b01b8542052d7ddb633554e3584279c796937023c8eac37277be2b8204ff3e0e1031190a01014cf5f5b4d7ad996727f97531e0355b87c9e611525aad079958e9afe2ab10e4a3e7a1b6ba0aff815da2cd81ea9eb9f536986633f316dd06c2503c6b198dc59304807b98b42935f51f637ddb59e233fed566439c1fe96cdaafa49f4412d0c1e654d8c69042470b3a59acb6bf67e40b38a77067d5997b8d35ed61d6eb3cc78b8bdcb9574b1ced9f6f339e9e38f94146ef63f049e6b802bfed2a51ab42e7d489f316ff4d1cd898bcf8505651687440749c0fb7a57dbeff72e64689faa41c07b4ade59933d2fac6d573deb739549eb75f1e6f7385d8c6142894973ed685eb8ed080c2a49f3ac6571161af96635ad057df1486d396773ac8983210978986e1bf21a20806d667a48a555a963221d50614a8976b2eec97512db11a358194492ab5455801baa14a511b26eb0c68289d790523712f2ff8709892695c4db9ad310df8c6ee7bd83c871f05aec33b7ad326f446692a42f7222376246d536a326c4d73eb572feada11b8ac7114f6cb444ca278fcf07b970d2ad465372a687d36b7daac478748ec6a932da20843948efa393097814272e5ca1c73e711973a52683f98c01e55241c154d28e38d3edfade2303a4e7c45c2a7a1c996ee1137af864a98b69809fc9214eea8cf3afe842fee3eb9a9322c3b82fddb05d4d1a2de09c1ce72734453a8dd3a8920d0d0ac96ef778b9e02c6a3f12872e17d3a81ba75fd233baadbe216ea0a58e9dda00840870208ae413540030b3c05e5d0b832df87c8ee7f153487aa11bad9f139c7dd4bcf418f4bcb95bee857d0e96084472387cb39127a947134501963a7071bdb34de6961be2b6b06e403e75918e6f69d08021cf2a8acb80a0111f4d50610c152d39c6621c0578ac689959b1ce6f376f43d18af062e4a", "signed": "73c1060649a7c014ed01945851b53e285324e60d061c831dda41f033b5658306a1f112327afe93caa921020730aae0069c9a2b45eef55cbb4a5a9cd46cda800814549eddd5f2b7905dda19d74ab207aac6fb3e3df3295d845231ef3aea6e1f04ee033c9038dcb4bd3d5e452c54834d0ff2b7de3f322e5626949cd61d6e890138ff0ea8ad846e8fe887aee15fc48bbe4fba42455f5c17457ae789b405af859611fe1f8746185a65aef2134ea4d8f398d48df7c1bba4304408ae7efb35292409d508dd55ce21de8c28160dc9e877700c763d06b01b8542052d7ddb633554e3584279c796937023c8eac37277be2b8204ff3e0e1031190a01014cf5f5b4d7ad996727f97531e0355b87c9e611525aad079958e9afe2ab10e4a3e7a1b6ba0aff815da2cd81ea9eb9f536986633f316dd06c2503c6b198dc59304807b98b42935f51f637ddb59e233fed566439c1fe96cdaafa49f4412d0c1e654d8c69042470b3a59acb6bf67e40b38a77067d5997b8d35ed61d6eb3cc78b8bdcb9574b1ced9f6f339e9e38f94146ef63f049e6b802bfed2a51ab42e7d489f316ff4d1cd898bcf8505651687440749c0fb7a57dbeff72e64689faa41c07b4ade59933d2fac6d573deb739549eb75f1e6f7385d8c6142894973ed685eb8ed080c2a49f3ac6571161af96635ad057df1486d396773ac8983210978986e1bf21a20806d667a48a555a963221d50614a8976b2eec97512db11a358194492ab5455801baa14a511b26eb0c68289d790523712f2ff8709892695c4db9ad310df8c6ee7bd83c871f05aec33b7ad326f446692a42f7222376246d536a326c4d73eb572feada11b8ac7114f6cb444ca278fcf07b970d2ad465372a687d36b7daac478748ec6a932da20843948efa393097814272e5ca1c73e711973a52683f98c01e55241c154d28e38d3edfade2303a4e7c45c2a7a1c996ee1137af864a98b69809fc9214eea8cf3afe842fee3eb9a9322c3b82fddb05d4d1a2de09c1ce72734453a8dd3a8920d0d0ac96ef778b9e02c6a3f12872e17d3a81ba75fd233baadbe216ea0a58e9dda00840870208ae413540030b3c05e5d0b832df87c8ee7f153487aa11bad9f139c7dd4bcf418f4bcb95bee857d0e96084472387cb39127a947134501963a7071bdb34de6961be2b6b06e403e75918e6f69d08021cf2a8acb80a0111f4d50610c152d39c6621c0578ac689959b1ce6f376f43d18af062e4a", "signature": "73c1060649a7c014ed01945851b53e285324e60d061c831dda41f033b5658306a1f112327afe93caa921020730aae0069c9a2b45eef55cbb4a5a9cd46cda8008" }, { "secret_key": "428066c52445726d0ea2007e504637274d84ee232325b505f2c516357f807583", "public_key": "dd40fe8f67c665613b3c459f6ace8dc28d34e0e77e2f6aa060592819be6a9d68", "message": "e2796c50d93df812bca41bf2a1e1dd737d8cf6f6b4f76242e39178186758cbae0884e60c6b4aaaddaec9a899a912e5c5b9804d7b0497bab4458c585d4f259222498ce9e80eb6a7979bbed6d52cc38072f745cb2c63e663bc3b9d6caf012a607f6d3b706e1557578717ecbb971aeb7c48e1df95711c550e006993bffba911cb64ad52d517ed18be82369e815819d3175947d4a35b2cc7b9dc6c10051326b3f1dc1edb1b68ba015ff7ca1dc361d8967abcffd3c31f7d6b0cb1396ae541f29759c4130be52ecc11d99261c365bf7cdec781494c5fa0526db4dbbe660a432be56043c66ea07c25627a5f72b78123dcf986ff71ed1affd1659b1393d9621f711dfa63eada383430797058f1566a00052d67ba53c1237b5691de3b039fd4476f1151e5ed5f5a98672fa33a1d854fa01566b33231d46acd7f34b8034479981853764dab87f49844cb62c63d536faca920447d8cd1e8113edbc83e4a6b7815e180cd78b933d9687fd5be99d0518a44662989bc64011124f187d43979994a95e0c903a006c1c0bef1c0f3df1eb700f980c28c3c1e997d0c56d113dae196882b05018fcab314d8117fafbabe7700b932d47c57362b2035eddce2d2ef33641ea90c3ea3fec6ea5b87e161014c4f8214fd03cebf94abe122537a98703239df5821c5ab633f98365cc636e3f1d2f74e0ff8f1fee06a3f73907ee504b310fd5224ad4d05cd23c356df8b34647298c49828725ba5fd60611e829b6337bcc9dcf8e8971cab3ee9c26337d38dfdfa036bf6096b635ac1bd5525ecd377a15272a8ac9bbef133107a42258d8b19ec69dc4261be5300a2d2d5ca99f31efdf259f9d079869a34413779f3028824d747686c460ffc496f2010f403e903e27a87dd075ae0a7f1689416d31bcc15f490caf975c40e715d549903e8bc0f7d9141e020f410f3ca2b2c0797ca0dc8d7392bff243528c7f3be138997185a4b36f45376d9fd70ba20989d2d1a911d4b98d160d2b8de592de2f4c04f35860df320c548440d5e3a346a14d3a63fe485c2889126b7f41d55a6eb23d5620babf8564aa79d156e983f36d9ed498da9ca888d946b53cc4768a5892d52d541526960282524ba6194da65941d1ea30f806bb6d97c7488b93fd0a770a9b15efcd12c5c4694", "signed": "c938829f598b1ff1b8183360d223f43c594730606876a99a3f31b2065d04e6f075d1396b3c8cffb0e1e2eaabda7da5e789ccd1c020835fe3a71dcdb6af03960ce2796c50d93df812bca41bf2a1e1dd737d8cf6f6b4f76242e39178186758cbae0884e60c6b4aaaddaec9a899a912e5c5b9804d7b0497bab4458c585d4f259222498ce9e80eb6a7979bbed6d52cc38072f745cb2c63e663bc3b9d6caf012a607f6d3b706e1557578717ecbb971aeb7c48e1df95711c550e006993bffba911cb64ad52d517ed18be82369e815819d3175947d4a35b2cc7b9dc6c10051326b3f1dc1edb1b68ba015ff7ca1dc361d8967abcffd3c31f7d6b0cb1396ae541f29759c4130be52ecc11d99261c365bf7cdec781494c5fa0526db4dbbe660a432be56043c66ea07c25627a5f72b78123dcf986ff71ed1affd1659b1393d9621f711dfa63eada383430797058f1566a00052d67ba53c1237b5691de3b039fd4476f1151e5ed5f5a98672fa33a1d854fa01566b33231d46acd7f34b8034479981853764dab87f49844cb62c63d536faca920447d8cd1e8113edbc83e4a6b7815e180cd78b933d9687fd5be99d0518a44662989bc64011124f187d43979994a95e0c903a006c1c0bef1c0f3df1eb700f980c28c3c1e997d0c56d113dae196882b05018fcab314d8117fafbabe7700b932d47c57362b2035eddce2d2ef33641ea90c3ea3fec6ea5b87e161014c4f8214fd03cebf94abe122537a98703239df5821c5ab633f98365cc636e3f1d2f74e0ff8f1fee06a3f73907ee504b310fd5224ad4d05cd23c356df8b34647298c49828725ba5fd60611e829b6337bcc9dcf8e8971cab3ee9c26337d38dfdfa036bf6096b635ac1bd5525ecd377a15272a8ac9bbef133107a42258d8b19ec69dc4261be5300a2d2d5ca99f31efdf259f9d079869a34413779f3028824d747686c460ffc496f2010f403e903e27a87dd075ae0a7f1689416d31bcc15f490caf975c40e715d549903e8bc0f7d9141e020f410f3ca2b2c0797ca0dc8d7392bff243528c7f3be138997185a4b36f45376d9fd70ba20989d2d1a911d4b98d160d2b8de592de2f4c04f35860df320c548440d5e3a346a14d3a63fe485c2889126b7f41d55a6eb23d5620babf8564aa79d156e983f36d9ed498da9ca888d946b53cc4768a5892d52d541526960282524ba6194da65941d1ea30f806bb6d97c7488b93fd0a770a9b15efcd12c5c4694", "signature": "c938829f598b1ff1b8183360d223f43c594730606876a99a3f31b2065d04e6f075d1396b3c8cffb0e1e2eaabda7da5e789ccd1c020835fe3a71dcdb6af03960c" }, { "secret_key": "3145bc68d82979408e4657b775f150c6d28a324d746ea6de90fd72b17a257982", "public_key": "c776186ce47f30ad08fa1d2c616a3644665ba54ff730fc2f4db1dba38ddeedca", "message": "2ea8dce1487f45d6ff8eb83c54fb7edd76ad6e608bb8daf1a1823da4f4e4e9863173897c197ac65804823bca95091f59e86d63c18dbcdb85743f8893ee694d815601f8f22f4d7df087f0114bb26c3795e1fe4b7f4a8fa31fd9f4ff10fe5dd452c54c5578c752f888213076be467ba30d2e2fbbee877c4be9b6ec4f04021c006f9266311943cab7cea99a2acebb69eec3e618c131f97430075f7975e39f26d5315178b69a1ddf731761051b93fb8df7e0e8b41e82e7f4f75e91d6c890b14ca533e094eb8ea4486d387185966c98295d3f58b17eef6cc3b4d07e93a3d9f4772ee52f18a5bb30aa3972850e658170bddb676f33266c9fd10f5990bad891f0ceb782736b40f01bd86509b06304a96d93da233dbed18afa1818aaf57af9bdbc867b397ff235a83e857224b15065225eec039dd4e2d69a04ee10bea0695041eda59b058ec05f49048ee324d16c4d6107b6ecd04875eb744e9365471b4c5fe6611b261893f9d2b128e135f92e474156b271b3c82e9a7663dad4953d30e10eda0862607dec3372b39970f2a84b12f60e6dae7f31799086d38a7e34948419c1b07f44c2159c86b8c0cfe8747fc2bad5bf475356cfe69de2dc6ad5a519fd65c12564701c05f7c277ecafcf4c87b148df1f9879a9ae443c55aea52138c6fa01ef0c3abb5f2df90a57ab6624178c737b54915b7aa29ea78e8e49ef5a816d8a92c2f81b8a19632779c892d66f753d518c41cccc9e593e50742625bcafa468805c37a21f8e29a6960ddf5c5e5ca14a7b052a7b6015697a0210ed6f0143e6b484c3f5b3b4726c607d07bfb3d54a09c98043f21dcc5cc20bb4754e2e5a73b2f806c2204b72f36ab9e96a62c6277c0ad66be7abffc163b4e8fafceff5e202e5943f4f0e6b92b4ddb953cbb791f83166036938e6c44ad91a596a5573440fb30741e660b6cd5f86ffa746e6e972b805c10b7b7b9a63c0551db8eb4f8400cde2868c0d0d4eb4cf117f8ec4ab9744fc5879dea7f0ef16c291d55c17f08b731b7c65d0c441b63bc8ff5e94904c026a1361dacc80a93a9b9fba3b403617aeb94a568541848011954234aead700f034c47c7def877905255f18bdb9a257ce5bdcf0e17670cdaaf13b1c7e09d58f92a9663af239e22078e180a23ccb6f64d64", "signed": "24a433337683bc71a6ca3bccd8cc2400c24464fa67714b46515f2a1432712705d570614db6d26bbbd3f0267c1427ca1c2f40dc9a6f1fb0f0fc714a02e24b47082ea8dce1487f45d6ff8eb83c54fb7edd76ad6e608bb8daf1a1823da4f4e4e9863173897c197ac65804823bca95091f59e86d63c18dbcdb85743f8893ee694d815601f8f22f4d7df087f0114bb26c3795e1fe4b7f4a8fa31fd9f4ff10fe5dd452c54c5578c752f888213076be467ba30d2e2fbbee877c4be9b6ec4f04021c006f9266311943cab7cea99a2acebb69eec3e618c131f97430075f7975e39f26d5315178b69a1ddf731761051b93fb8df7e0e8b41e82e7f4f75e91d6c890b14ca533e094eb8ea4486d387185966c98295d3f58b17eef6cc3b4d07e93a3d9f4772ee52f18a5bb30aa3972850e658170bddb676f33266c9fd10f5990bad891f0ceb782736b40f01bd86509b06304a96d93da233dbed18afa1818aaf57af9bdbc867b397ff235a83e857224b15065225eec039dd4e2d69a04ee10bea0695041eda59b058ec05f49048ee324d16c4d6107b6ecd04875eb744e9365471b4c5fe6611b261893f9d2b128e135f92e474156b271b3c82e9a7663dad4953d30e10eda0862607dec3372b39970f2a84b12f60e6dae7f31799086d38a7e34948419c1b07f44c2159c86b8c0cfe8747fc2bad5bf475356cfe69de2dc6ad5a519fd65c12564701c05f7c277ecafcf4c87b148df1f9879a9ae443c55aea52138c6fa01ef0c3abb5f2df90a57ab6624178c737b54915b7aa29ea78e8e49ef5a816d8a92c2f81b8a19632779c892d66f753d518c41cccc9e593e50742625bcafa468805c37a21f8e29a6960ddf5c5e5ca14a7b052a7b6015697a0210ed6f0143e6b484c3f5b3b4726c607d07bfb3d54a09c98043f21dcc5cc20bb4754e2e5a73b2f806c2204b72f36ab9e96a62c6277c0ad66be7abffc163b4e8fafceff5e202e5943f4f0e6b92b4ddb953cbb791f83166036938e6c44ad91a596a5573440fb30741e660b6cd5f86ffa746e6e972b805c10b7b7b9a63c0551db8eb4f8400cde2868c0d0d4eb4cf117f8ec4ab9744fc5879dea7f0ef16c291d55c17f08b731b7c65d0c441b63bc8ff5e94904c026a1361dacc80a93a9b9fba3b403617aeb94a568541848011954234aead700f034c47c7def877905255f18bdb9a257ce5bdcf0e17670cdaaf13b1c7e09d58f92a9663af239e22078e180a23ccb6f64d64", "signature": "24a433337683bc71a6ca3bccd8cc2400c24464fa67714b46515f2a1432712705d570614db6d26bbbd3f0267c1427ca1c2f40dc9a6f1fb0f0fc714a02e24b4708" }, { "secret_key": "5a25ea5e182d9bf8e930a20b6cf55e24e83862789b3839b1ce9a71e938c42d37", "public_key": "c981fc36f1a6d5f7d451cd5ef39cd3ab02087fcc6af27dd78ea827497e779e21", "message": "214dd1927f2cacd9888714249b85434602ac78453b4af5386eee39295d3d5a2267806eb0cff2c132d364c2420d04e3f6cc0a967bf05a10ffcf1217bbf315e75b98060fd458d67ebaad9380f4adc4dbdf74cbf1c6479202bdd7fed3a946697dc38444d88bfe51d41d7a9b38da60b850c56b48ba984f6a1889514955c0dadb69a8c736cc76cdc49f13f85a8bfb7928ff0a0c0c03f17c74b5e1062d7553fbeb9dd3d5081de1dfd8a6a9976697c6a259bcf7d4bef1c21e0aaf3298b0421b919fddfc1dcb3ec683d86ff3d423d71c8f2d723a42ff68d82e9f391749b82998dcfa112160f52a413a23d95fc42c3bd22384bad77754a710d8b9f84ae0a802fc46509e7f2b07079012b43bfeeab719bde56f00e59b8edf1c472883b1985b2fa699a1ae90cf45d7ac580ceb5f2797def5b8bf4f2b9b3519a727b9f2cd1256a2f076ed2296495b5c2df7887ff89e88e236a14cde6324f43d68d90172b0b88bd28803e999dbedcc501db654544e171ec1f9f32d4d3321d589392e03ca659f96752e1f08a55db553d866985541f5bef84ce2ee323e17d1f7dc164b50515a287d5305fc28c5983b9e5398b2407ae47296fe4a481d22ffb4b865a66b97a6c27935dd8eb86994b79d368363713f101dc37f429eee0fee2441c2dc17bf43924f0c044f143290eaf3f9ee4d946dbe45831a0d83c076e751c14f3b1a7267f5446c188698d2b46d87e6f3b20bb3fdafe24cc096bc312d8678b38a80c3f052a0c96d5ad87a5dd8c133cc9a15be33574cd94308c24dec1a9bdf189ba687199f72ef6709878e10f87bd8a03dc84c8fa96420285898ca3211d8b0ccef64011ec24f38e574da34dab9d2f002105227890f92488c621e5713e47dbcb1a82a6da60d8b2201eb29d494493360ed5a3f4b5225eae7707ee0b4c0407305c16754c7f630fc85c13e4917047bcff3b2a293fe955506c7264ea65bf3a9b25acf343600d8fa0c7c1a290d0271101b7f40b96e7fdaf29def9d9327a5ae05446cb5a6d322453a8b098bcf3aee1f704e14d00be342b8934d19e529218872ea3a2fb2124b52667c01fca5841c66e1e64a1e680e09ba186e04d105186cf6eb728b9d502a66b829fbc992a3881004ecdc80adfd044eda880f8af72a14fb550d7cc74194a945207d", "signed": "a4f35b49d7e198e5d326e353fbb01fa13b6ae260d1e48e30c1b967737a5e79936c97ca2ba799ca34e5e788cea5ac8ed10d5cd15dae53e42432321cc26dc99809214dd1927f2cacd9888714249b85434602ac78453b4af5386eee39295d3d5a2267806eb0cff2c132d364c2420d04e3f6cc0a967bf05a10ffcf1217bbf315e75b98060fd458d67ebaad9380f4adc4dbdf74cbf1c6479202bdd7fed3a946697dc38444d88bfe51d41d7a9b38da60b850c56b48ba984f6a1889514955c0dadb69a8c736cc76cdc49f13f85a8bfb7928ff0a0c0c03f17c74b5e1062d7553fbeb9dd3d5081de1dfd8a6a9976697c6a259bcf7d4bef1c21e0aaf3298b0421b919fddfc1dcb3ec683d86ff3d423d71c8f2d723a42ff68d82e9f391749b82998dcfa112160f52a413a23d95fc42c3bd22384bad77754a710d8b9f84ae0a802fc46509e7f2b07079012b43bfeeab719bde56f00e59b8edf1c472883b1985b2fa699a1ae90cf45d7ac580ceb5f2797def5b8bf4f2b9b3519a727b9f2cd1256a2f076ed2296495b5c2df7887ff89e88e236a14cde6324f43d68d90172b0b88bd28803e999dbedcc501db654544e171ec1f9f32d4d3321d589392e03ca659f96752e1f08a55db553d866985541f5bef84ce2ee323e17d1f7dc164b50515a287d5305fc28c5983b9e5398b2407ae47296fe4a481d22ffb4b865a66b97a6c27935dd8eb86994b79d368363713f101dc37f429eee0fee2441c2dc17bf43924f0c044f143290eaf3f9ee4d946dbe45831a0d83c076e751c14f3b1a7267f5446c188698d2b46d87e6f3b20bb3fdafe24cc096bc312d8678b38a80c3f052a0c96d5ad87a5dd8c133cc9a15be33574cd94308c24dec1a9bdf189ba687199f72ef6709878e10f87bd8a03dc84c8fa96420285898ca3211d8b0ccef64011ec24f38e574da34dab9d2f002105227890f92488c621e5713e47dbcb1a82a6da60d8b2201eb29d494493360ed5a3f4b5225eae7707ee0b4c0407305c16754c7f630fc85c13e4917047bcff3b2a293fe955506c7264ea65bf3a9b25acf343600d8fa0c7c1a290d0271101b7f40b96e7fdaf29def9d9327a5ae05446cb5a6d322453a8b098bcf3aee1f704e14d00be342b8934d19e529218872ea3a2fb2124b52667c01fca5841c66e1e64a1e680e09ba186e04d105186cf6eb728b9d502a66b829fbc992a3881004ecdc80adfd044eda880f8af72a14fb550d7cc74194a945207d", "signature": "a4f35b49d7e198e5d326e353fbb01fa13b6ae260d1e48e30c1b967737a5e79936c97ca2ba799ca34e5e788cea5ac8ed10d5cd15dae53e42432321cc26dc99809" }, { "secret_key": "42335c30b3f6b359cef5aab6a3ce2858a151b7a4fd78d2fd3ee36fc29d249404", "public_key": "301c515a02a4c66bc6401080c6ca7923b7831e3c9a72b55b14027eb2e7b3b152", "message": "6da2251e6f559536b09bfafb8160a2e8102d31f8b59324083e5227b20c3e5c3a06e2396768dca3ec76dc7fc0eb3d145e62ed07fc1a8b1b2e347013a0527274d0b234fe725026a9d128f8df20dbfa3b6503818edebd7f24934080945a7e1ea02273fe48b6ed1e83fd168d7973fbb7941b4037d3cda555e0e89c2b943fb1e20765ac7d4fa3777f35a0a8bc118f599c847be3fdb2d8e201ae12a30bdefb034ff24e3e2e701a0d1733734078bd1f9a69bbc667e461211f2c769d29db7c4d62d6b1b92b56f5f18a931a926064b78da146e18b48139b9b39862aec37bcce12cb789429e68ea38112d0b5cce30bd2d26c5f7fd415daf7ca317b3368b7617d4525e5bc97d9461d5d64f6b5d318d0bc3b76f25b0605426909f2aa0cd667a4f0e075b9a9fb2e9a6c82704d8a9f1666844edc32f63a3d4e0fd9fdba30b51b3336b96e9eae392a342de49e9b5fa0f9b90171bde09cf1e946499140008159eb1865563c28394b03a8d7a552271b2876687566b80fd3be2b66332fcad196cab8527c56e21536a141652cdc7fa745b26a331d787b93e5e816d8d851a58f6ac07a5827fcdf472e8685433a40cac0c49aa569319a2e57b41c9998165e69723ba77e5c0423c4b4ca07187bb7442e7d31caacb27700c71ae48cd055ed2fe4da363f44821124cca1bf2e63d9b8abd2fa41b1422f52d558bc5f110c863cc600864984ed259b73cddd5796b32979eddf76a07bc59b7368c48e129ecc0d4535dccee2c3b8e56de50e6f5cc6ea515cd6a0ebdf1ca79aa2794821ad2e109edda450c9fc3c84d8c96bc38d4b437a738f818b4ddcb684383c09b11b36052e9d2f76a61eb4d62049ced5f61662c4b9ecd24a67f4519d46528c5b2eb21005f49c73a3370c68e37ac2b18d481fa10f96714fe05c168df11cda54f14f4937e9fce1f516c0371b36a2c0a050bac7fa5122a6e35ec9c40436585f316e6c911bdfd7db4b80b4306479b82a2b243a52b2d2b62742ed11282790cf6fdc7c9c824364cf25636a855150bddbdf7e640f9f952a947ec7974925e8245068b292101b1f4b2018e85d078c2feef4492349729ad4acb38f1c7c0270b61d3dfd7636c6cbf181e4c8a0e64fa06132553c2b9db7019e3b3c485d8d5b7dfd5f515e4d71ede535ae7f2aaedc23", "signed": "67b0f17449039e8c797bf913aae6e4f0bb99c74d6d10c973b990ffe03e7ee4ab5b35806db15a98c0846a827e7bcd539cd3bc09dd118ab3e52663a357b12991076da2251e6f559536b09bfafb8160a2e8102d31f8b59324083e5227b20c3e5c3a06e2396768dca3ec76dc7fc0eb3d145e62ed07fc1a8b1b2e347013a0527274d0b234fe725026a9d128f8df20dbfa3b6503818edebd7f24934080945a7e1ea02273fe48b6ed1e83fd168d7973fbb7941b4037d3cda555e0e89c2b943fb1e20765ac7d4fa3777f35a0a8bc118f599c847be3fdb2d8e201ae12a30bdefb034ff24e3e2e701a0d1733734078bd1f9a69bbc667e461211f2c769d29db7c4d62d6b1b92b56f5f18a931a926064b78da146e18b48139b9b39862aec37bcce12cb789429e68ea38112d0b5cce30bd2d26c5f7fd415daf7ca317b3368b7617d4525e5bc97d9461d5d64f6b5d318d0bc3b76f25b0605426909f2aa0cd667a4f0e075b9a9fb2e9a6c82704d8a9f1666844edc32f63a3d4e0fd9fdba30b51b3336b96e9eae392a342de49e9b5fa0f9b90171bde09cf1e946499140008159eb1865563c28394b03a8d7a552271b2876687566b80fd3be2b66332fcad196cab8527c56e21536a141652cdc7fa745b26a331d787b93e5e816d8d851a58f6ac07a5827fcdf472e8685433a40cac0c49aa569319a2e57b41c9998165e69723ba77e5c0423c4b4ca07187bb7442e7d31caacb27700c71ae48cd055ed2fe4da363f44821124cca1bf2e63d9b8abd2fa41b1422f52d558bc5f110c863cc600864984ed259b73cddd5796b32979eddf76a07bc59b7368c48e129ecc0d4535dccee2c3b8e56de50e6f5cc6ea515cd6a0ebdf1ca79aa2794821ad2e109edda450c9fc3c84d8c96bc38d4b437a738f818b4ddcb684383c09b11b36052e9d2f76a61eb4d62049ced5f61662c4b9ecd24a67f4519d46528c5b2eb21005f49c73a3370c68e37ac2b18d481fa10f96714fe05c168df11cda54f14f4937e9fce1f516c0371b36a2c0a050bac7fa5122a6e35ec9c40436585f316e6c911bdfd7db4b80b4306479b82a2b243a52b2d2b62742ed11282790cf6fdc7c9c824364cf25636a855150bddbdf7e640f9f952a947ec7974925e8245068b292101b1f4b2018e85d078c2feef4492349729ad4acb38f1c7c0270b61d3dfd7636c6cbf181e4c8a0e64fa06132553c2b9db7019e3b3c485d8d5b7dfd5f515e4d71ede535ae7f2aaedc23", "signature": "67b0f17449039e8c797bf913aae6e4f0bb99c74d6d10c973b990ffe03e7ee4ab5b35806db15a98c0846a827e7bcd539cd3bc09dd118ab3e52663a357b1299107" }, { "secret_key": "be6b2babddd2dca1b0e10d12d20a9ce29c6785dac1d60f2edfa94ac2784ba766", "public_key": "398f22f0efbf8c38355e4791bf670898951fbbd5518f0e2a605d460023f613f0", "message": "5c9295881b7a670669b04cbe0dabd89693b77f7cce0d4a33f52e02eb26959e713d9aef5f95442bdf91728383325202aaccc037477e3666facaf24eac9534879aa3efe18ffc1a5c54e39c7687d0937b2471bab389b646cbe6b3e5d5961ea63bd452b4743344ce4c793374523795c781ee84d511e2941119bad1f4a746ed9dba89c8d0751a6402718635f6e31d9e18681c6956c5373251d35f53baa1987cd448c9031a07f32c8029119de3a91631dede1d933e0fa32629afe1b42eb591c22f87331e93cc083c23f64a6e5e586ff31cc04e423c56ae3f6a73946c48de4d85ab0017ba24456d69b59dca6d403b64b07c40d3b90e1223215e3f7e876c6701111e37e517770887310ca856f009a0d60654835d94e6587a439da5db0a0c37d7c9d37ca1d703e1b3227631adacaa79421a1c439d60349ae57741b7a8ad09ec293123030bf6bac0689e531ca7e72718223f9ea43becb0ee9d9c1ab845ed1cae443e3c5d4a9b1ede6db3417c3ace281143f42d85f599b3b9d3d05fa0ed07c1ec35ffab0305168b4e56e58afa0617f9a86b1b5b201dccb072b4cef0bb7b95c52daeef9d9e7424a5c0f148f9ffe60a5b23e0ff82c730992ac9c17f97f065cf0ad5377eaccb31d8bb923bd260ea119e6fa9bd6983482d70d9219102402dc6a3499193d0c1cd3ed2a66921a98df69b791413f4970bbce04f639af909c64f4560db0af6003dc46219e8ad2b372f8b5f81cfaa041ab71a348c931e8dfdbc409c22d7ee6e07626e104ec6cc7c6a4116177f93af16f124f196dab619b6f698c2d191858e960c2e947b51f3ac4838759c21fef7ebae35da24f55ebda9b9879aea17a6d8d927de487b175fd7faa21438a20923ddbbca72e6726934bd6c21e8118019f65b3810a07fa27b1cba64d0f39f0bfd49dcfafdefe379bdea82f31a9c39f7e81d294337d10f1e9d8b50eba458ce7b753d36968538513eddb0e84534411c4af3f0214610ee3901a0ebf316173ccaf15cd7ee496dbfc2465eb834df62029d621fe911824d7987df2d46346b4dce1ece7d19d55118c037c9955111d07f1fc362c739f1ea5b275c71c0aebf59655e2def16e123b3eb2526c3ca5e83cb24d5b68d7ac40a67593384c563afe0b552adaf60805035be97b80676adeb1576520833", "signed": "702ab9acbfa75ea2adbe4be2b6847625aeb409eef9596fabe39d2c533a03431e5e579552e8a64fc4fb7d926aa8fffe0640698464c4454ce35fe83ff263051a015c9295881b7a670669b04cbe0dabd89693b77f7cce0d4a33f52e02eb26959e713d9aef5f95442bdf91728383325202aaccc037477e3666facaf24eac9534879aa3efe18ffc1a5c54e39c7687d0937b2471bab389b646cbe6b3e5d5961ea63bd452b4743344ce4c793374523795c781ee84d511e2941119bad1f4a746ed9dba89c8d0751a6402718635f6e31d9e18681c6956c5373251d35f53baa1987cd448c9031a07f32c8029119de3a91631dede1d933e0fa32629afe1b42eb591c22f87331e93cc083c23f64a6e5e586ff31cc04e423c56ae3f6a73946c48de4d85ab0017ba24456d69b59dca6d403b64b07c40d3b90e1223215e3f7e876c6701111e37e517770887310ca856f009a0d60654835d94e6587a439da5db0a0c37d7c9d37ca1d703e1b3227631adacaa79421a1c439d60349ae57741b7a8ad09ec293123030bf6bac0689e531ca7e72718223f9ea43becb0ee9d9c1ab845ed1cae443e3c5d4a9b1ede6db3417c3ace281143f42d85f599b3b9d3d05fa0ed07c1ec35ffab0305168b4e56e58afa0617f9a86b1b5b201dccb072b4cef0bb7b95c52daeef9d9e7424a5c0f148f9ffe60a5b23e0ff82c730992ac9c17f97f065cf0ad5377eaccb31d8bb923bd260ea119e6fa9bd6983482d70d9219102402dc6a3499193d0c1cd3ed2a66921a98df69b791413f4970bbce04f639af909c64f4560db0af6003dc46219e8ad2b372f8b5f81cfaa041ab71a348c931e8dfdbc409c22d7ee6e07626e104ec6cc7c6a4116177f93af16f124f196dab619b6f698c2d191858e960c2e947b51f3ac4838759c21fef7ebae35da24f55ebda9b9879aea17a6d8d927de487b175fd7faa21438a20923ddbbca72e6726934bd6c21e8118019f65b3810a07fa27b1cba64d0f39f0bfd49dcfafdefe379bdea82f31a9c39f7e81d294337d10f1e9d8b50eba458ce7b753d36968538513eddb0e84534411c4af3f0214610ee3901a0ebf316173ccaf15cd7ee496dbfc2465eb834df62029d621fe911824d7987df2d46346b4dce1ece7d19d55118c037c9955111d07f1fc362c739f1ea5b275c71c0aebf59655e2def16e123b3eb2526c3ca5e83cb24d5b68d7ac40a67593384c563afe0b552adaf60805035be97b80676adeb1576520833", "signature": "702ab9acbfa75ea2adbe4be2b6847625aeb409eef9596fabe39d2c533a03431e5e579552e8a64fc4fb7d926aa8fffe0640698464c4454ce35fe83ff263051a01" }, { "secret_key": "b1e47ca31c64b68aafafb443512e66787c6592f334aa78fa219a3d93c33a4ab3", "public_key": "58119b38e6a148a936bc5f92f4f29b982ff2cca64a5affa14ca1b6a62fe328c4", "message": "767ec1b3daf204387f3fd3b20010781afb1f38f614474213287fff11307f5ff5ae7ec945a2b9b4870049d4532f8f61c1a7b5f211fca2e67c374d96219d8ea9de73f0e38704fc94c0e9e72f2e15daba3f88f749b1ed702660db1a352a2667d4dfd4e00a18efa4c6609ee9c9a88adacbbb985d3de8ddd17d4e4eb7cf74a1da91edb390852ea4cb9a424f7fa2229e083033a34059117e5efa7b6613d75e58b702c6cee5d004e8599b97503a5f10c4c4e5b9577371d3d05b2dfbf7cbefe6d092d65cbd405138d9b04c5186235983fab6d4ce85b636276206d74a2ee7db6164dac47cce78f50db99af6ac6e7064c13aab793be87e66289c94a09fb0a31d97971edd74ea9c0ce874d2b7d6c4abaeff07f870225151946a5c476f6b978996b87d8c984606c791287da6bad0aa44b0130be88671a556e2de35c4cb038ee781273530ace0a104c27809aee033c8bf9029d90fe7ba06aaa94e16a52c643dfd92a7624fbbee77a7158b2cc151bd3f61a1a76f32b28489307acf0dd8c26cc4adbbb8de430db4e4f58308b6ab90456111deac2978172fe1fc0ce498088add4c31c21f24279025feb48cbb7a920cff2d28710587af52c844db8a7aeb7df10d43411a3c8eeebb406d6efcb19248887d450b573d90305e1f23753e890511dcc77c740e316ad7f52d4902073db3998e4e4acc4e01885bd1188ecd6165aeded1e778702b6a6a79a94999102df72018f792f8f162007e812aef8f956e123282bbdbd0c35612c2d3473f944c6d76be9e86fffa46ccb1ae13505a4a81f31b8426b8b60de8e8a7c16d1e1665b271434665c442a9c6a977ce986f6993b7439af03b402eeafff1456d151526d9c58f515fd2485e0cbb324a503a8d491344cdb2aff4c41aa8e2ed66e58083bf0d2fbf4877c85a4bcd6b9cbb821242c94147e5fd8b7dd792ad0a28d49d41100b431bb4d8c7833d8505dd9e2649f9ca7051be68712ef3637102036b002649473ce259677d82c6062895e161928b752f13c91a45955e80f007de690edf8a0e5eee4422e162b9d2b4a921d3a64845793aa2229e9c239e57a6b1a90a5254c3512f99345315ac7d3457f9154296c66822abe184d64e572b9c38492958e21b0292675410e7348b2b718a0b7592caee94581a948d2f41fa03c61e", "signed": "dfac86df586ec34c7cfea5d5a6cd1140e50b6bf050f8e41a190ebfd3b1432b95a57d5652dbae8f53e037ae326e7f18cfef7c779f40346f7c0d8644610593f209767ec1b3daf204387f3fd3b20010781afb1f38f614474213287fff11307f5ff5ae7ec945a2b9b4870049d4532f8f61c1a7b5f211fca2e67c374d96219d8ea9de73f0e38704fc94c0e9e72f2e15daba3f88f749b1ed702660db1a352a2667d4dfd4e00a18efa4c6609ee9c9a88adacbbb985d3de8ddd17d4e4eb7cf74a1da91edb390852ea4cb9a424f7fa2229e083033a34059117e5efa7b6613d75e58b702c6cee5d004e8599b97503a5f10c4c4e5b9577371d3d05b2dfbf7cbefe6d092d65cbd405138d9b04c5186235983fab6d4ce85b636276206d74a2ee7db6164dac47cce78f50db99af6ac6e7064c13aab793be87e66289c94a09fb0a31d97971edd74ea9c0ce874d2b7d6c4abaeff07f870225151946a5c476f6b978996b87d8c984606c791287da6bad0aa44b0130be88671a556e2de35c4cb038ee781273530ace0a104c27809aee033c8bf9029d90fe7ba06aaa94e16a52c643dfd92a7624fbbee77a7158b2cc151bd3f61a1a76f32b28489307acf0dd8c26cc4adbbb8de430db4e4f58308b6ab90456111deac2978172fe1fc0ce498088add4c31c21f24279025feb48cbb7a920cff2d28710587af52c844db8a7aeb7df10d43411a3c8eeebb406d6efcb19248887d450b573d90305e1f23753e890511dcc77c740e316ad7f52d4902073db3998e4e4acc4e01885bd1188ecd6165aeded1e778702b6a6a79a94999102df72018f792f8f162007e812aef8f956e123282bbdbd0c35612c2d3473f944c6d76be9e86fffa46ccb1ae13505a4a81f31b8426b8b60de8e8a7c16d1e1665b271434665c442a9c6a977ce986f6993b7439af03b402eeafff1456d151526d9c58f515fd2485e0cbb324a503a8d491344cdb2aff4c41aa8e2ed66e58083bf0d2fbf4877c85a4bcd6b9cbb821242c94147e5fd8b7dd792ad0a28d49d41100b431bb4d8c7833d8505dd9e2649f9ca7051be68712ef3637102036b002649473ce259677d82c6062895e161928b752f13c91a45955e80f007de690edf8a0e5eee4422e162b9d2b4a921d3a64845793aa2229e9c239e57a6b1a90a5254c3512f99345315ac7d3457f9154296c66822abe184d64e572b9c38492958e21b0292675410e7348b2b718a0b7592caee94581a948d2f41fa03c61e", "signature": "dfac86df586ec34c7cfea5d5a6cd1140e50b6bf050f8e41a190ebfd3b1432b95a57d5652dbae8f53e037ae326e7f18cfef7c779f40346f7c0d8644610593f209" }, { "secret_key": "fbd55fa743c3a5910b3857dd0b6aa584f3b238de056b76ab7617aeb52638fef6", "public_key": "a7a163c4183bd84b756df3c8afdfb9cd5b242352d9499ebdab90785c3bd6db2d", "message": "bf5252b2aeca1163771f766278768066f21971357ea7996158a8d6e908dd59b59971349fa17882cb9224b972d0ffabe85510dcf25a9f9f9bdefad2f4cadfbbdacc1fca9d948cb5412f474cad23b5b9199bf3c7370641339b750e1f78c2adb460aa5b21b1fa8f97714abb4ed5e9cb51d6de55816618abd3fd2b286bc11c67ba01129373d435b3e7e391ba372614da8322875e46a675b645156024cad2dd13f9a081616bf131a24358894e0efa1d56648ffb42efb54031da7f37d197615155aedb69c4e709c8bbbe7fbfcb598347ac5d0c638407847b281cf116433097f5662158719fcdd37beb489268ce71de7d70ed925f743fc63a715f7eee7549fdb909cc454c988b30ae4d77d62f65a07e2c8f9362385d028a603108c945872f5e1a97419878ed49542e288ef07b5c90f5c4159e162303d080f6ac2b058ddcac60746f9e1c9ec1df8eda42d62738586d3fdd65df55f4374f3294e0868d41ef0bb1fd55e0cbf195bbfcfcde5bdb41fad9a0477e4c90ca27fa8cf503362a33fdeca5a4f0ffea26e8d7e134fad3b1ec3d056055bba5e65d81153ee831873b938df7d2c83c2a52b3c221827f961bd008362232d882a0412a047afdfb8597c865a2aa2c2cf5189934a83ee6b752a626941edce0c20b6f7a69f1cf12f9a331cdfa9eda24c8defa769ccce2ef746c307d8bb04891fcefd49af3e6f96991a7a20f27b6c0af1218be31791d1d0293e081b90af3b92ecb175ec8c789f7a8642e041ec3a61aaefef62a807d1a5054adf8323bed942241623732a2051dc01f9a20a29aa48b3fdf265d0ba6c138fb5793e2875002e7de3f5c3ff7e83ad27d111c848b7e6e2e5ad5f28eb7c363f95f960cbc421336ce985f946b0515b1bdd3a832c3fe903f7b44e20c92ea80826fbf97e2a4fcaf2db1a08698dd62edd0a84589d7462c447b4a896fe00860042496bd51b1925cb79cc3b829016a4c7e62790f8058c546f2145aaaef4d4b1e273ff61300f8008e946b622f60e505f5f6290d51eb997d20fc3fbb3e99edd68ff5cce9e8c283881c364ff215cb50045e60f4a7ee45b6c9d86447f38141d342dbc5308f8c66efc47f7c45f6d25e6564309a862db90f4df331787ecdd89d3aaa46053e29f102624ddfe80e8a3f99287cec19fa83e44d557c0441", "signed": "effb29da6985971c202e2450301d49711bed25fad85f6199d1eb1e71914d964cbe18e34cc3e32872cdec026bd119a41c1c07ca41e82acba62fb0a7c82aed800cbf5252b2aeca1163771f766278768066f21971357ea7996158a8d6e908dd59b59971349fa17882cb9224b972d0ffabe85510dcf25a9f9f9bdefad2f4cadfbbdacc1fca9d948cb5412f474cad23b5b9199bf3c7370641339b750e1f78c2adb460aa5b21b1fa8f97714abb4ed5e9cb51d6de55816618abd3fd2b286bc11c67ba01129373d435b3e7e391ba372614da8322875e46a675b645156024cad2dd13f9a081616bf131a24358894e0efa1d56648ffb42efb54031da7f37d197615155aedb69c4e709c8bbbe7fbfcb598347ac5d0c638407847b281cf116433097f5662158719fcdd37beb489268ce71de7d70ed925f743fc63a715f7eee7549fdb909cc454c988b30ae4d77d62f65a07e2c8f9362385d028a603108c945872f5e1a97419878ed49542e288ef07b5c90f5c4159e162303d080f6ac2b058ddcac60746f9e1c9ec1df8eda42d62738586d3fdd65df55f4374f3294e0868d41ef0bb1fd55e0cbf195bbfcfcde5bdb41fad9a0477e4c90ca27fa8cf503362a33fdeca5a4f0ffea26e8d7e134fad3b1ec3d056055bba5e65d81153ee831873b938df7d2c83c2a52b3c221827f961bd008362232d882a0412a047afdfb8597c865a2aa2c2cf5189934a83ee6b752a626941edce0c20b6f7a69f1cf12f9a331cdfa9eda24c8defa769ccce2ef746c307d8bb04891fcefd49af3e6f96991a7a20f27b6c0af1218be31791d1d0293e081b90af3b92ecb175ec8c789f7a8642e041ec3a61aaefef62a807d1a5054adf8323bed942241623732a2051dc01f9a20a29aa48b3fdf265d0ba6c138fb5793e2875002e7de3f5c3ff7e83ad27d111c848b7e6e2e5ad5f28eb7c363f95f960cbc421336ce985f946b0515b1bdd3a832c3fe903f7b44e20c92ea80826fbf97e2a4fcaf2db1a08698dd62edd0a84589d7462c447b4a896fe00860042496bd51b1925cb79cc3b829016a4c7e62790f8058c546f2145aaaef4d4b1e273ff61300f8008e946b622f60e505f5f6290d51eb997d20fc3fbb3e99edd68ff5cce9e8c283881c364ff215cb50045e60f4a7ee45b6c9d86447f38141d342dbc5308f8c66efc47f7c45f6d25e6564309a862db90f4df331787ecdd89d3aaa46053e29f102624ddfe80e8a3f99287cec19fa83e44d557c0441", "signature": "effb29da6985971c202e2450301d49711bed25fad85f6199d1eb1e71914d964cbe18e34cc3e32872cdec026bd119a41c1c07ca41e82acba62fb0a7c82aed800c" }, { "secret_key": "5d66ceb7c6e58cac91e288279170e818e787180c6b42dfa168787dd07f809fa4", "public_key": "efc9b35db81f346198a7acc69f65fdfbf4c22e68dd7612e3b8ec68d378553b8d", "message": "94d72f6dec4f7c9206b41510ce71a02955604f3c5de8e447d5871865a75898a4d207a26cf33d10caf05a0b6ed0d389fee9ed49275098a88e1c0d8304e81b4074214c7a5ce157eb2617ef04e1324ba942129faf32c31cb4aae4a5916c750808726856f7180e5797ede44362d747d70cec159d3b6acec63a514c7ef31b2ecd16db7fe68ea9c5ead9d870921800348f695412f3093e61985a31eadb79b59d91dd9a37f8d4ef7a5ddf223d4b24774c2e44e3f271ffb8500d595381b3df2e8e6b79ee65535a519a43eaa5e52b256c2643305e3170cbe57606a0545f8586565cfb75bf5e9564c62af05f15ee6e62afeef8c2c7a9dae235c9edd1d7c25cf49adc033ee7b583f518bc168ea48836b50ffedd2032b3f630cc56daadd513ebda864823610fc67a72b9a7d8117105c1c71d85a96b1d27a441fa1e7c6cf80233a49fe0e76a40278d06e34347d87be77b98ded5e2a3ea1afb13bee1e6cd6ca63be54fcf88a20ccb7a9fc324bf6143201b44483bcc964033dab71cf8f2a591fc050d5724e95aa50d32896eec0f3b34311d2a9934e9f852977e253f15304cae2416c2c4fcd8f1fecc3f1f64bb79759929abb0e8e8f5f7293d691af22abd3b2a6770b0cf144608f2d62cc7e52bfe333b2ed2de39b99afd37e3acf07eda37ddf0df029bff2ec22544b60bd7db238df1975ffa0075a82abd8d6b05b267180b870e21abf36981ae7768de53993b304f1c5453872fdfa8edad45f8001aa0e7342b3b58ec0f389dcbc271fb0f9000628757abba58c057e1a0899f6faf15f3740f3143f5c0b7a9159680de8c557266441b3b01caac12ec278f5a1025df53edb6134c96663a9666ae3baa90fc835111ef051bd912f67967449113b6a85f71df8c6037724eb8fc7d8319bc0385be9b0e99e95f9aedcae8d45a514476f05bcd7235c013ebc3aea9123c67aa6f3b79c85ea5db159eefadfb75a50ac6b95b496b5572581a76112ff6db263fc14c5818aad5bca3b2cb3ac8116d429482781e06f61e7563e6505e51c8ff998bf84aedb5202e2f9ff4c2689820296cc69603091b8b818fbeb2af5f4c57060d98c1a904843a70bf975b3c3ca6031a4cad5b4bbfba7e9b47491ab740d9ebe41d768810cb8cc51a937f7e3b22e3cf07ceae0ce20831495afcdd8c1a98", "signed": "6ef264abf8b0e5c2d793b2c75279614a39c775eb2bcc0891067abc61f6d644a69ff8f814a30522cca90536f012c6283a76c32b89eee1bd9a4336f4fddac8dc0b94d72f6dec4f7c9206b41510ce71a02955604f3c5de8e447d5871865a75898a4d207a26cf33d10caf05a0b6ed0d389fee9ed49275098a88e1c0d8304e81b4074214c7a5ce157eb2617ef04e1324ba942129faf32c31cb4aae4a5916c750808726856f7180e5797ede44362d747d70cec159d3b6acec63a514c7ef31b2ecd16db7fe68ea9c5ead9d870921800348f695412f3093e61985a31eadb79b59d91dd9a37f8d4ef7a5ddf223d4b24774c2e44e3f271ffb8500d595381b3df2e8e6b79ee65535a519a43eaa5e52b256c2643305e3170cbe57606a0545f8586565cfb75bf5e9564c62af05f15ee6e62afeef8c2c7a9dae235c9edd1d7c25cf49adc033ee7b583f518bc168ea48836b50ffedd2032b3f630cc56daadd513ebda864823610fc67a72b9a7d8117105c1c71d85a96b1d27a441fa1e7c6cf80233a49fe0e76a40278d06e34347d87be77b98ded5e2a3ea1afb13bee1e6cd6ca63be54fcf88a20ccb7a9fc324bf6143201b44483bcc964033dab71cf8f2a591fc050d5724e95aa50d32896eec0f3b34311d2a9934e9f852977e253f15304cae2416c2c4fcd8f1fecc3f1f64bb79759929abb0e8e8f5f7293d691af22abd3b2a6770b0cf144608f2d62cc7e52bfe333b2ed2de39b99afd37e3acf07eda37ddf0df029bff2ec22544b60bd7db238df1975ffa0075a82abd8d6b05b267180b870e21abf36981ae7768de53993b304f1c5453872fdfa8edad45f8001aa0e7342b3b58ec0f389dcbc271fb0f9000628757abba58c057e1a0899f6faf15f3740f3143f5c0b7a9159680de8c557266441b3b01caac12ec278f5a1025df53edb6134c96663a9666ae3baa90fc835111ef051bd912f67967449113b6a85f71df8c6037724eb8fc7d8319bc0385be9b0e99e95f9aedcae8d45a514476f05bcd7235c013ebc3aea9123c67aa6f3b79c85ea5db159eefadfb75a50ac6b95b496b5572581a76112ff6db263fc14c5818aad5bca3b2cb3ac8116d429482781e06f61e7563e6505e51c8ff998bf84aedb5202e2f9ff4c2689820296cc69603091b8b818fbeb2af5f4c57060d98c1a904843a70bf975b3c3ca6031a4cad5b4bbfba7e9b47491ab740d9ebe41d768810cb8cc51a937f7e3b22e3cf07ceae0ce20831495afcdd8c1a98", "signature": "6ef264abf8b0e5c2d793b2c75279614a39c775eb2bcc0891067abc61f6d644a69ff8f814a30522cca90536f012c6283a76c32b89eee1bd9a4336f4fddac8dc0b" }, { "secret_key": "62ed8682bd3ab3966eba3bffb775a318a03d99931979e99feb2ddbd69455a0ef", "public_key": "d32ada178b3ec7700c47dd6d365322033fe431c302b46f8d58798ed83371566b", "message": "9eb13bc7facf51a180541ec1dc5f5acb148c8d5eadcd2c4ef068bcdd11b34925eabfafabfe82a284bcbaee1381152af8e5e09f037cf1bb6484ac18e37359bfaa4c87aa07d3d14ed089b053910d1fa473f7bce143e2a59c4daf99b6c6e4e9291d97c864712af3eaba53ce2517a4f75cd7ecf278f34e22b7dffd088fa5ecadc0dd22135e42a536c684f2195d315f6924571e463f5cfc11b9f9d05a7ea11b98a169a1e39360973c50ad45c7491b57138ec050f43cbd5d17eb3fe0013e3d28d526054e07633152246f16554f3054749eea687b9c371b409cd3ecefb111a1d600407344e6d6ec38c60f6e545a92382e46c4d113125dbe5b9826e127f10181a35acfff28ab3764ca7f238ff479fdbc45b7a2ad0ff538c8acd0018d4470febcc6a307651cb5832f326b19241be9867e4eca6ae36f0e2d83fd77b97202b364716e36d1895a36853e7e76e88f62dbbf7726c2180569c66673837ad72ff936cf0e2fdb9ec6afcc79f8829e157f952288f4e00d0410a72253bf605eddceb01440dee5dd32b5a803439f038c06af1c90b27b5fe9843c27ae76609cbf832835c0e3c4bb59976ccede448786d91e438e0775c06a92d0f0b8dc0ef68260f7dd9e6871c4d0c0c09463852615218516f4a6debfdb46273b283382cd9ca744abf9fd439194b8cf1bdbb3175ca9c57a1c373c41fce92bd5fc012b19a0698aef37baf806ae09add8cb972a9ef9a7a5a9b1fd9a41d854c30cca1396140e20c2b98654fe6e511b626a43915b22fb2dad747ba7fe7460d8cebb2006fea19b3284b09c06a6f52f179a32beb56357b929a659f0fe6a26b697033def58ba603f430f74aa35070981db74ccf19190a1fb05144ec0a09a51e54765069730b09a7a2331ffb3de2a7e02c5e184da4013dfe937c371117524f7b210ba60e2692dcdcef36ab227b4c4f02a9f488972b847f0d6b59d02ee54fede8821db6cf731cc8ac895350ac5cd4d6baa3ad036f06f20d10a140c4ad3d10ca985532e3160462773385a2eb5e464d528e1e59c29f66b3de59e9ea28af3f97bfc5589035752a5a5523decd2dff01fc00ff31b30152ff5dafa331c6ab15873af41aa960aace7d2cb4f95c23df44b9e6c6e2f86788a872fd3a5cbe4acc95810daa09dcc1df933465ef040c53d9d959f9dad", "signed": "3da8d14dc4e71fe6c32ede463788e41b826b4e2160ba10c95f1c8a2749aad8f12e98ae2468303baf6908bdb35ef38a5ecd77741e72ee3a427fd904dae66fcf039eb13bc7facf51a180541ec1dc5f5acb148c8d5eadcd2c4ef068bcdd11b34925eabfafabfe82a284bcbaee1381152af8e5e09f037cf1bb6484ac18e37359bfaa4c87aa07d3d14ed089b053910d1fa473f7bce143e2a59c4daf99b6c6e4e9291d97c864712af3eaba53ce2517a4f75cd7ecf278f34e22b7dffd088fa5ecadc0dd22135e42a536c684f2195d315f6924571e463f5cfc11b9f9d05a7ea11b98a169a1e39360973c50ad45c7491b57138ec050f43cbd5d17eb3fe0013e3d28d526054e07633152246f16554f3054749eea687b9c371b409cd3ecefb111a1d600407344e6d6ec38c60f6e545a92382e46c4d113125dbe5b9826e127f10181a35acfff28ab3764ca7f238ff479fdbc45b7a2ad0ff538c8acd0018d4470febcc6a307651cb5832f326b19241be9867e4eca6ae36f0e2d83fd77b97202b364716e36d1895a36853e7e76e88f62dbbf7726c2180569c66673837ad72ff936cf0e2fdb9ec6afcc79f8829e157f952288f4e00d0410a72253bf605eddceb01440dee5dd32b5a803439f038c06af1c90b27b5fe9843c27ae76609cbf832835c0e3c4bb59976ccede448786d91e438e0775c06a92d0f0b8dc0ef68260f7dd9e6871c4d0c0c09463852615218516f4a6debfdb46273b283382cd9ca744abf9fd439194b8cf1bdbb3175ca9c57a1c373c41fce92bd5fc012b19a0698aef37baf806ae09add8cb972a9ef9a7a5a9b1fd9a41d854c30cca1396140e20c2b98654fe6e511b626a43915b22fb2dad747ba7fe7460d8cebb2006fea19b3284b09c06a6f52f179a32beb56357b929a659f0fe6a26b697033def58ba603f430f74aa35070981db74ccf19190a1fb05144ec0a09a51e54765069730b09a7a2331ffb3de2a7e02c5e184da4013dfe937c371117524f7b210ba60e2692dcdcef36ab227b4c4f02a9f488972b847f0d6b59d02ee54fede8821db6cf731cc8ac895350ac5cd4d6baa3ad036f06f20d10a140c4ad3d10ca985532e3160462773385a2eb5e464d528e1e59c29f66b3de59e9ea28af3f97bfc5589035752a5a5523decd2dff01fc00ff31b30152ff5dafa331c6ab15873af41aa960aace7d2cb4f95c23df44b9e6c6e2f86788a872fd3a5cbe4acc95810daa09dcc1df933465ef040c53d9d959f9dad", "signature": "3da8d14dc4e71fe6c32ede463788e41b826b4e2160ba10c95f1c8a2749aad8f12e98ae2468303baf6908bdb35ef38a5ecd77741e72ee3a427fd904dae66fcf03" }, { "secret_key": "4e57f0311fff0e5d538849b1216f695b1a5277941708204db2f0c15b3c73c82a", "public_key": "e3371fe236ad2f6f42f9e1fa4e1eda2c3e29c36c8ad2218a3c037982f0b579ec", "message": "052a1f41ebfd4bf65efb0ec8e74dd7b3065e9c482c49b99262e6dfa8407d9e31ed34d229ba41fc49a94a1309f990a99cb9902fb84f4ede91bb64714564a913d574d4a3c286f0a192a78ce2d55aae5c9fb057ff36120018b2a8b54d98085537ea64aea999d5321c7880b36ab43018ea2c92a5e68350d3de8526e2c8bc9141f4349a18a34f21de0abbf2930987567f0aaf8eb19145580d71306ce8a69e79f8eea26cfa0b8beb49cc5aa2bc77b797d4f8d50326ffb937399e94fdec85e192f1272a80e9a0ebbaf5d01f1b97060802bd4af34c0f7d7e98543f9d66d60e0e6bc0bf9c990be31eea1978ffd16733a8abe49558b3add0dce6defd64dc043f1519b1e9be66e06e41ecab168c8339a85e0b913818644ea7c5334468fd7196a01e1d4ce8dd1e7ee313dd5350b8dce4f5d7a6ac09857c4d3d0f10a3d9062609754592ad1077b2e2096fc9e5b1978c98b5660ddf51b46ede9f9dcd41b2ef44e79f6daff7d3626870e2243cafb2f4367939109ed9c01484b79eaa30a1891ea18f984e161dcdd1bda37134bf6735d2b2149b4898dacbfda61e6002d72a6fc5d21f1098213231132d56df68d6a9bfdf4eddc0524db8fd8f248852049a6825a5edd2360c009af24f0a94c5079ddf6fe796945ff984aac36411ce80d987c6ed67b6b0ddb6d417f6e809991e729d147dd0d21a093241363cf4ef3b8e3ba02d486633b6b217f5493e2e432b8c2e27d00c5b56c9b65f9aed49ce93d77e7d0bf5f92f92f5bb4b595d66f887a4880133f970463ab8b7f3d8c794c0406e88e3eab9ae65f1a185d6e39e2dd6abb8a93d2ac4b9208398dab89dbc07a41a50264026412da022b58f489d4dba31fb882fecb1ff8ca1820dda1865af1551e46cd618b44c4e6eb3037a9333fdccef4b895189e4390e93145d264ca5f45202a3eb2853593feed6c66dbb288ff3a3c0fa832b2aa7e529b5568897b3149402a907e741e1011ce0731c915f91446aa0d5caf0595f1816434fa4576db3bc31e10cc2af33f613f03ca7b9491a0a340525271ab537f62a11a84da01c7f5581ad5738c372b5335bab9b2b9dc2fe91e933304d9401ba8e1ce8dc55c4fb466b3a8ed7f53a122b8381d8f29047d7264d06fb51ec3e70071f2736a4e7e1537a52fa256a04ee86fad27ad2d28a9b3629", "signed": "4fdc7b6e2827f64ba3c033c7fb6d1b35dd680f532999a0d77aeb276c31bd9e39c670978be47243c113223a57aa10233150678b40db78591c04d08df57a70a209052a1f41ebfd4bf65efb0ec8e74dd7b3065e9c482c49b99262e6dfa8407d9e31ed34d229ba41fc49a94a1309f990a99cb9902fb84f4ede91bb64714564a913d574d4a3c286f0a192a78ce2d55aae5c9fb057ff36120018b2a8b54d98085537ea64aea999d5321c7880b36ab43018ea2c92a5e68350d3de8526e2c8bc9141f4349a18a34f21de0abbf2930987567f0aaf8eb19145580d71306ce8a69e79f8eea26cfa0b8beb49cc5aa2bc77b797d4f8d50326ffb937399e94fdec85e192f1272a80e9a0ebbaf5d01f1b97060802bd4af34c0f7d7e98543f9d66d60e0e6bc0bf9c990be31eea1978ffd16733a8abe49558b3add0dce6defd64dc043f1519b1e9be66e06e41ecab168c8339a85e0b913818644ea7c5334468fd7196a01e1d4ce8dd1e7ee313dd5350b8dce4f5d7a6ac09857c4d3d0f10a3d9062609754592ad1077b2e2096fc9e5b1978c98b5660ddf51b46ede9f9dcd41b2ef44e79f6daff7d3626870e2243cafb2f4367939109ed9c01484b79eaa30a1891ea18f984e161dcdd1bda37134bf6735d2b2149b4898dacbfda61e6002d72a6fc5d21f1098213231132d56df68d6a9bfdf4eddc0524db8fd8f248852049a6825a5edd2360c009af24f0a94c5079ddf6fe796945ff984aac36411ce80d987c6ed67b6b0ddb6d417f6e809991e729d147dd0d21a093241363cf4ef3b8e3ba02d486633b6b217f5493e2e432b8c2e27d00c5b56c9b65f9aed49ce93d77e7d0bf5f92f92f5bb4b595d66f887a4880133f970463ab8b7f3d8c794c0406e88e3eab9ae65f1a185d6e39e2dd6abb8a93d2ac4b9208398dab89dbc07a41a50264026412da022b58f489d4dba31fb882fecb1ff8ca1820dda1865af1551e46cd618b44c4e6eb3037a9333fdccef4b895189e4390e93145d264ca5f45202a3eb2853593feed6c66dbb288ff3a3c0fa832b2aa7e529b5568897b3149402a907e741e1011ce0731c915f91446aa0d5caf0595f1816434fa4576db3bc31e10cc2af33f613f03ca7b9491a0a340525271ab537f62a11a84da01c7f5581ad5738c372b5335bab9b2b9dc2fe91e933304d9401ba8e1ce8dc55c4fb466b3a8ed7f53a122b8381d8f29047d7264d06fb51ec3e70071f2736a4e7e1537a52fa256a04ee86fad27ad2d28a9b3629", "signature": "4fdc7b6e2827f64ba3c033c7fb6d1b35dd680f532999a0d77aeb276c31bd9e39c670978be47243c113223a57aa10233150678b40db78591c04d08df57a70a209" }, { "secret_key": "39f0556b1c5dcab387104181bb304de0cf815920b972e871d5f0fb416d8e616a", "public_key": "d85fb76e78c3d5bb7ca6b05b310191821a4a7d2d9bdf02292cc7aea5642e4819", "message": "a8d034e170fc22b57a44aa6269ed1f01cba801f398df1adfe7df044d5fa468bbfa8af4749ab50d24d62e313ac0e73a64b4282b74626af2b4a4b54c274e5a6bc280b6dc25dcfe07814c9c816d2f9e36c05b9bfedff7c6b03cddebd4735e0993d3c3fdc6540443c6005e900b4035e1408a85016aa1b89202990e5d84ed9981c29b77206d7c113052a2029812c6ea13aae8be0aca7a3306bf617242298e68becd0d5d16c8887fd1950b7785a46bb022b39f7607cd8913718b3017fc3f86d6933f75eec5191ad1f1989a8d261786f56be4a988370db82961a9fcc953542e51c2e086db0e02b4fc346694abd9059d5b11722647669e7f17b745a60b02f7339fcc99bc35d59fd0b98b60c314abd4bf8aa4b7eae09dd0097acb9189f02cf85a251ac92aaf691b15cd4a33b58d7663abd0b0444333044af5ce20fd71cbaffc0d29835819f49293fc26e7f9787fc368c4d35cae92747f21ca1f3efd87a0d8104199416482d07bfec1281c66f565285bf672d5e7486400660c017555e9fa2bf6a4e7027f0e7e5f443ed658b75b590612abde0d80d1a26cb8bde76b996eff6a74e3dafc59eb1b584f4597a239cd839fa1f1b7bda1a24d150c4e24b91cec01ee53a3ac852a912de195a3c29dd7079aa7e88aa81e9d31b8fccd435eda113c3f82458b7f7933572b776753c92240cc036158a4ba0e56efed53ecb53fc093fead14343485ae5d9105bb163f262514e48be74159c9fabcb71d1a4280d9ed70d7e42b75f7fdadd02d69198f5f465bf604cb4254417bac3714b3a99e6f1acec9e3b3d097f972fbc36f2eda3926d56112d4e9097d89bdc35937b9a3158e7cdd5da401e180d3ede6b1ff02864192eb729781534f4964ddf2af11800d8b5b6d01b209aa3369366c19a28c79a87d2174ec22fb1489a6755c348a996d0aa56e0f60d58e26befa23a86bef4e3529512e30a9d1c5e4885018cb97aeb7c93c5c41caa34236575c226f3b235eddba364e285b6e352707bbb3b339bbf2a63a9cb9bd333a77e79bd58a48e14ce5886ed0cd07c2d165a81b5e6a31a8ae7806bcf2e0c4ec29a967725e577f1741ee68f345f5f7ab0fad31c8b4b18b431c4977d5c584004b45f7cd1961affe8738e24c382610efe998353d7ebaf919b279bbb691c3052b8b2c5f09808ef3a6", "signed": "0166afed5a8f7c3f7ad6f3fdd2938eff00898eab815c5455ac90fb51f6e1854f0c0753194b7629594cc1271b003431221c574b0c0d19082feeda51b084ae5e03a8d034e170fc22b57a44aa6269ed1f01cba801f398df1adfe7df044d5fa468bbfa8af4749ab50d24d62e313ac0e73a64b4282b74626af2b4a4b54c274e5a6bc280b6dc25dcfe07814c9c816d2f9e36c05b9bfedff7c6b03cddebd4735e0993d3c3fdc6540443c6005e900b4035e1408a85016aa1b89202990e5d84ed9981c29b77206d7c113052a2029812c6ea13aae8be0aca7a3306bf617242298e68becd0d5d16c8887fd1950b7785a46bb022b39f7607cd8913718b3017fc3f86d6933f75eec5191ad1f1989a8d261786f56be4a988370db82961a9fcc953542e51c2e086db0e02b4fc346694abd9059d5b11722647669e7f17b745a60b02f7339fcc99bc35d59fd0b98b60c314abd4bf8aa4b7eae09dd0097acb9189f02cf85a251ac92aaf691b15cd4a33b58d7663abd0b0444333044af5ce20fd71cbaffc0d29835819f49293fc26e7f9787fc368c4d35cae92747f21ca1f3efd87a0d8104199416482d07bfec1281c66f565285bf672d5e7486400660c017555e9fa2bf6a4e7027f0e7e5f443ed658b75b590612abde0d80d1a26cb8bde76b996eff6a74e3dafc59eb1b584f4597a239cd839fa1f1b7bda1a24d150c4e24b91cec01ee53a3ac852a912de195a3c29dd7079aa7e88aa81e9d31b8fccd435eda113c3f82458b7f7933572b776753c92240cc036158a4ba0e56efed53ecb53fc093fead14343485ae5d9105bb163f262514e48be74159c9fabcb71d1a4280d9ed70d7e42b75f7fdadd02d69198f5f465bf604cb4254417bac3714b3a99e6f1acec9e3b3d097f972fbc36f2eda3926d56112d4e9097d89bdc35937b9a3158e7cdd5da401e180d3ede6b1ff02864192eb729781534f4964ddf2af11800d8b5b6d01b209aa3369366c19a28c79a87d2174ec22fb1489a6755c348a996d0aa56e0f60d58e26befa23a86bef4e3529512e30a9d1c5e4885018cb97aeb7c93c5c41caa34236575c226f3b235eddba364e285b6e352707bbb3b339bbf2a63a9cb9bd333a77e79bd58a48e14ce5886ed0cd07c2d165a81b5e6a31a8ae7806bcf2e0c4ec29a967725e577f1741ee68f345f5f7ab0fad31c8b4b18b431c4977d5c584004b45f7cd1961affe8738e24c382610efe998353d7ebaf919b279bbb691c3052b8b2c5f09808ef3a6", "signature": "0166afed5a8f7c3f7ad6f3fdd2938eff00898eab815c5455ac90fb51f6e1854f0c0753194b7629594cc1271b003431221c574b0c0d19082feeda51b084ae5e03" }, { "secret_key": "bab3ff7a4448d8a03d8acfdb913f77fe77804395c3e54ec235117927e32b50d5", "public_key": "54975e35e5b1d0323f2d6fb5c6158bf6654b084f76bbdcfd72349229e8e4a6e8", "message": "b647b67cf01c2cacc39de5969e199be6d9320167a4cebbf1625950b1e6b7adf5ca24d1349568865fbbfd90f513f05f79f70a63a23873dc7a195d4b285a08f30ee061d0b8e6b4d6bf9b2ecf2c69f3d5a07a6730537cca4a4e4c7ee684702bff883fab8bcaf89311c5498bccb5a0f7c8d49b54f482fffbca6e7da262452ba59a57a6879d81b73cd7adf72a3be28a373cd63310408461c21b907f63e086b292ff02833e8a2f46adbd671d02b03a69aca2e11d287c522a954520442ecefaa905dbfcc8254c58c3954a89bf56cbe01ad5631971eb39eb432a854e691929df7e48b900ca6e740accf578b31795b49a6ca774bd8b993106a9c4948c18714948315990a5f191692420f289328ab713ec19b7ea894d16e6476100871cf3168e4f935b5505d1ed5b0aa29be36fa3a346ac3e76f143c46ca69123b79c36399a0d2ed302772494adf442bbafbc4d01532692c7859df04d2ca78ba55d77fdf3e5ad993786a24cff2199bb49387873cc414b4cf1137abb7e94ae3ddbf97f534a18fc5ae58523a3cc52283dc7b016f31cd6557981c5076c774f303a47c427870e207ed8bd66640ff092db503fa124bfdcf020051dadd106dd245840b31910b8a9060d5986f02b60aa5e33b4d7550912cdc5776c772aac93ae19c73b7ecfca389e627681a8781eb47d84e93460ba891d3ff6eadf8f2a903c383474beaa42b90e032236dcd898d02a40efb44e47ead52b75b09c7da1cd6a2dfd4d1c0452de69f6acac1a68dd78daf972ae260821e2ec522fb5749bebe0adb452bfa4faa1e97911c1299f16568d68eef405f4b1cdacabed59f7b0fbceab719a34b299f58a4ae8154f98f4d9f4f140b1f085006946725e7c29bb0bc6ccf2534497c61d4c1612624a61d70d26c3efb7d7c351848657f7f8eebf8b990747740e6f910c97cef150375765c8c0b3b449c0d09d66f008e67cfa76ea2b6808b6fe632eafe0587f37e36be98dcb17a3f4a15b65a9f6fcf9642b52522077b1fb4cc3c08df4b467ca716db16b737f782cdf387170a5f1f6a7ae0ab3f5b7c585e3b0655a6456a503595ce8eaea2537855e7f0d5061bc29b4e67daa82463c190e9fddd52f8322ddb4e0f26b68778228eb57e1a185b7025da14987d44baa767b22ee7f4c84591032e88ec12eb8c5a4b9e157ec", "signed": "d6b4135fc7acb3d7cdf987896d91b8a90db584d8933a6f3029e3261ec1c390cbacfaafeff443b6da4fdb1d84c64a54560feffa2f1c7a91bde9730222923b6703b647b67cf01c2cacc39de5969e199be6d9320167a4cebbf1625950b1e6b7adf5ca24d1349568865fbbfd90f513f05f79f70a63a23873dc7a195d4b285a08f30ee061d0b8e6b4d6bf9b2ecf2c69f3d5a07a6730537cca4a4e4c7ee684702bff883fab8bcaf89311c5498bccb5a0f7c8d49b54f482fffbca6e7da262452ba59a57a6879d81b73cd7adf72a3be28a373cd63310408461c21b907f63e086b292ff02833e8a2f46adbd671d02b03a69aca2e11d287c522a954520442ecefaa905dbfcc8254c58c3954a89bf56cbe01ad5631971eb39eb432a854e691929df7e48b900ca6e740accf578b31795b49a6ca774bd8b993106a9c4948c18714948315990a5f191692420f289328ab713ec19b7ea894d16e6476100871cf3168e4f935b5505d1ed5b0aa29be36fa3a346ac3e76f143c46ca69123b79c36399a0d2ed302772494adf442bbafbc4d01532692c7859df04d2ca78ba55d77fdf3e5ad993786a24cff2199bb49387873cc414b4cf1137abb7e94ae3ddbf97f534a18fc5ae58523a3cc52283dc7b016f31cd6557981c5076c774f303a47c427870e207ed8bd66640ff092db503fa124bfdcf020051dadd106dd245840b31910b8a9060d5986f02b60aa5e33b4d7550912cdc5776c772aac93ae19c73b7ecfca389e627681a8781eb47d84e93460ba891d3ff6eadf8f2a903c383474beaa42b90e032236dcd898d02a40efb44e47ead52b75b09c7da1cd6a2dfd4d1c0452de69f6acac1a68dd78daf972ae260821e2ec522fb5749bebe0adb452bfa4faa1e97911c1299f16568d68eef405f4b1cdacabed59f7b0fbceab719a34b299f58a4ae8154f98f4d9f4f140b1f085006946725e7c29bb0bc6ccf2534497c61d4c1612624a61d70d26c3efb7d7c351848657f7f8eebf8b990747740e6f910c97cef150375765c8c0b3b449c0d09d66f008e67cfa76ea2b6808b6fe632eafe0587f37e36be98dcb17a3f4a15b65a9f6fcf9642b52522077b1fb4cc3c08df4b467ca716db16b737f782cdf387170a5f1f6a7ae0ab3f5b7c585e3b0655a6456a503595ce8eaea2537855e7f0d5061bc29b4e67daa82463c190e9fddd52f8322ddb4e0f26b68778228eb57e1a185b7025da14987d44baa767b22ee7f4c84591032e88ec12eb8c5a4b9e157ec", "signature": "d6b4135fc7acb3d7cdf987896d91b8a90db584d8933a6f3029e3261ec1c390cbacfaafeff443b6da4fdb1d84c64a54560feffa2f1c7a91bde9730222923b6703" }, { "secret_key": "486c7b436c1d43d6b703512283c166dc863e5a33802f4ea65fc738778902d014", "public_key": "b5dc947d64337cae82122bd68cc80840596de3be56cbd0c833af3faa3adc3776", "message": "af036053672dcf3aa26e28ec6aa642ce284b896c69887dfdcf0824515eb0848d9d970ca272df77a86b3ff6ddaf3cbadd3ab6283bc37cdf7a5607d5dfc7cf96329299cc53edbbe657fdfa2ca24467050a0aeb8cffd7d33d543ec2c191cc0bce89ac37d33293b1888ccb76c28adc671a4935a846d907e4add0110febbee5aec80f9d2ff74e2af4fdbebbcf49105a6469d7380006b2ca44364814454e445e36dc0012f339c96854f836442a05a50bec907327f74ba9f6fd790ff0ad3783d297bdcca76460783703eb5f2b1f51b0a740ce7a8f00a387e3636270a971fa8f15b4496730d88add807a7f7e987cd41595a2e7435df5195576a35f5e91b2fcfac94ed5d77663783b61e6671d34838b6b5644fbc1c539fe159b7792db967e8352618ddaca0cde73437b59e7801b49eb4609b10577ca2692dd6f9d5e9d4b5e5e62c5913e7b87e6b347be6153b17199c916a13f8a885b378ef09e13cae4d8b079d7d5cb9094199b0f20533c90083bc3acb2667697eed22e3670abb4a553e995c9dd9594e592391a0004b6556544f35612c4971359577c476382ca53b3f262a5e33ed26eec809f4fdba4898a113675cb6af717db62579f3980b21463be029cb4160fe5d257c46cd6664f9861ac50fe05c144057dce2f8df1532aa7af589f41270601cef06bbe4f35c31c782bb3cfff7d5ab64a14ec417361f1d32cbd38b6bd0e02505d1416302b8505ae2a96e8d5339c346c2b0662d350259c50c5e48795914e6f88e97c811c393bdf9aec7ef82047ca28ee971c175c27e36e109727960ddf1a1b976ab44f4851607bd966808ac46d54003128297f5f4487108d6a02e7a16413d2b75ecb42fddfb669c801d23de50a6f7bf658f753c6b2b3b47c0640105d0a801b32a1943cdc15c886555eb75bb7927b93c35c5be1f98b196caac2dad991b1044ea863944d54d883abc3c6de66ed868ee84bcf9c34ccdb80fcd9cc0402747732cd630bbfa3bbe8b038dc1dbdaf436d9ac00c02d528ece2e791ee312a868feb2f587ca44db5731384fa1831142061b2ead2b80c66bd2fa5dccabe6a25f2a493feaacd231d2f409646b942a578545ea4feea9a73473f79dcf13e0c9f1b49fd8912ec487328045bd0fa228922ee6e973e61f6e93365296578dcc21c361479ee2d24879f2e9b", "signed": "31f95cbb7463b87528654227bb1397bf1065b4f576808078207dfaf06d124b41f4c318f4a9315a66085b9e568a71e414ed9414517310c699946db0c976285207af036053672dcf3aa26e28ec6aa642ce284b896c69887dfdcf0824515eb0848d9d970ca272df77a86b3ff6ddaf3cbadd3ab6283bc37cdf7a5607d5dfc7cf96329299cc53edbbe657fdfa2ca24467050a0aeb8cffd7d33d543ec2c191cc0bce89ac37d33293b1888ccb76c28adc671a4935a846d907e4add0110febbee5aec80f9d2ff74e2af4fdbebbcf49105a6469d7380006b2ca44364814454e445e36dc0012f339c96854f836442a05a50bec907327f74ba9f6fd790ff0ad3783d297bdcca76460783703eb5f2b1f51b0a740ce7a8f00a387e3636270a971fa8f15b4496730d88add807a7f7e987cd41595a2e7435df5195576a35f5e91b2fcfac94ed5d77663783b61e6671d34838b6b5644fbc1c539fe159b7792db967e8352618ddaca0cde73437b59e7801b49eb4609b10577ca2692dd6f9d5e9d4b5e5e62c5913e7b87e6b347be6153b17199c916a13f8a885b378ef09e13cae4d8b079d7d5cb9094199b0f20533c90083bc3acb2667697eed22e3670abb4a553e995c9dd9594e592391a0004b6556544f35612c4971359577c476382ca53b3f262a5e33ed26eec809f4fdba4898a113675cb6af717db62579f3980b21463be029cb4160fe5d257c46cd6664f9861ac50fe05c144057dce2f8df1532aa7af589f41270601cef06bbe4f35c31c782bb3cfff7d5ab64a14ec417361f1d32cbd38b6bd0e02505d1416302b8505ae2a96e8d5339c346c2b0662d350259c50c5e48795914e6f88e97c811c393bdf9aec7ef82047ca28ee971c175c27e36e109727960ddf1a1b976ab44f4851607bd966808ac46d54003128297f5f4487108d6a02e7a16413d2b75ecb42fddfb669c801d23de50a6f7bf658f753c6b2b3b47c0640105d0a801b32a1943cdc15c886555eb75bb7927b93c35c5be1f98b196caac2dad991b1044ea863944d54d883abc3c6de66ed868ee84bcf9c34ccdb80fcd9cc0402747732cd630bbfa3bbe8b038dc1dbdaf436d9ac00c02d528ece2e791ee312a868feb2f587ca44db5731384fa1831142061b2ead2b80c66bd2fa5dccabe6a25f2a493feaacd231d2f409646b942a578545ea4feea9a73473f79dcf13e0c9f1b49fd8912ec487328045bd0fa228922ee6e973e61f6e93365296578dcc21c361479ee2d24879f2e9b", "signature": "31f95cbb7463b87528654227bb1397bf1065b4f576808078207dfaf06d124b41f4c318f4a9315a66085b9e568a71e414ed9414517310c699946db0c976285207" }, { "secret_key": "a6e6ad2c379c6fccadb4a49b232a9142618ea30103c33c226ff628bcfd81f426", "public_key": "f7c4323f5c419d9b3f34a8eb42ae7f1faa2333079030c5d64f9ffb1e9b16002d", "message": "2e857676a5bb1c6e9e94507f83c60a67f547c5de9e94566b197a6af6cf4752e93dbdef6b9f66d1febd957e42a7f5ad64ef1dbcc4fe69ae9525d1a4de67054c88f29c0647bacf8b82f321ff99fe9eedc992ed34c1177fc5421227ccac10feb9ced4082f5658da63714723979737e7dcbfe2e8b5d50f91dfca83e7f95f35d1ad8dd51144502f3df672432611f0e766a90dcc2a5739c805d95fe5b041de9d7fb47b4404afc803a3bd4804c7817ebc5bdfef8add9e250b50966ca8939b22b3c6ff936eaa659a240c0c848b810acecf6181e0e4db8e4cf8fcce7de559cbe8afa9db8499570911a3887e850e509cdb70debc3477d12175014f79f81ba113d0b7b335118f85cf59996f806758eb903cc450f52fee102efc01441e9ae5fae74c231dfd85eb6bad17d6b70e938584facb2172cb03bd5ea07b7f0d371ffa351c0ee4efe9ba4a3fd543874655e7d39c53ae86329802e5c385e9283a2973cab8cf7ac7ff0f91d1d48b58abfdad658d812f07881676bd226bfe957d7df30c4130a448354a6b94405a411650a9c8fc851155ec5a8a3e3b67ae0c4b5cb89bb73fc82974be62da73f0e23092937d405ba4af6cab9465ea43a6253f4457082a06ac12b75e88ec684487f9076373fab8892859d8e8ba431423aa805a220cbfda431b32b1e03121f7fd4de18591f2505cc0f5b2b1a7605fbcc63757b07e299fef5a2b7365230c2e92a25962c2e8012ad3fa9ee94882709625ba68c7b213664ae2532b609d7c9aa0e83d493dbce7632f35580e06d3111ced320dd0190441f62d9e35f50de59c272fb00f568a00b0746c33a9bd2490c074b91cddc487ef2e45a0f030e08fdc1817bca8a9ce29d29279e755debc28dfadc3c4d1b458486e3c8d0c4318e7e6f9eb5a3653b3f7c49507077cd5eb81f10b88107cc0f9316932abe9b64e8886d06856a85be63b0c2b475c0afcb0694426860fb24b5c17ab6ab7733d5e641be74fd5f6a1ff18d2f9a42770fb30750f56f4854e38d58aef18a2a61cbfb49ee576ed97737bc28df3268a334175513d97af009cbbcfdfad5039d69bb46f708867d9b3ce0bf2f569e3cfbcf6136f8870d25208b21a3edcb73393dfcd4172c1402c41f36e3f82a4ea6dcd891686ba66e14320aa0e22ba0c1ef033d662cdb860cdfa3a40f6cc532a08", "signed": "07d9fc244fdab00159ebecc5a00883453f08310171769d297001e877010e3eced9fb60ec91cb4d88e7ba40c530b1f9237978ccd96d5cba9e4fa27e2a0ad9d60c2e857676a5bb1c6e9e94507f83c60a67f547c5de9e94566b197a6af6cf4752e93dbdef6b9f66d1febd957e42a7f5ad64ef1dbcc4fe69ae9525d1a4de67054c88f29c0647bacf8b82f321ff99fe9eedc992ed34c1177fc5421227ccac10feb9ced4082f5658da63714723979737e7dcbfe2e8b5d50f91dfca83e7f95f35d1ad8dd51144502f3df672432611f0e766a90dcc2a5739c805d95fe5b041de9d7fb47b4404afc803a3bd4804c7817ebc5bdfef8add9e250b50966ca8939b22b3c6ff936eaa659a240c0c848b810acecf6181e0e4db8e4cf8fcce7de559cbe8afa9db8499570911a3887e850e509cdb70debc3477d12175014f79f81ba113d0b7b335118f85cf59996f806758eb903cc450f52fee102efc01441e9ae5fae74c231dfd85eb6bad17d6b70e938584facb2172cb03bd5ea07b7f0d371ffa351c0ee4efe9ba4a3fd543874655e7d39c53ae86329802e5c385e9283a2973cab8cf7ac7ff0f91d1d48b58abfdad658d812f07881676bd226bfe957d7df30c4130a448354a6b94405a411650a9c8fc851155ec5a8a3e3b67ae0c4b5cb89bb73fc82974be62da73f0e23092937d405ba4af6cab9465ea43a6253f4457082a06ac12b75e88ec684487f9076373fab8892859d8e8ba431423aa805a220cbfda431b32b1e03121f7fd4de18591f2505cc0f5b2b1a7605fbcc63757b07e299fef5a2b7365230c2e92a25962c2e8012ad3fa9ee94882709625ba68c7b213664ae2532b609d7c9aa0e83d493dbce7632f35580e06d3111ced320dd0190441f62d9e35f50de59c272fb00f568a00b0746c33a9bd2490c074b91cddc487ef2e45a0f030e08fdc1817bca8a9ce29d29279e755debc28dfadc3c4d1b458486e3c8d0c4318e7e6f9eb5a3653b3f7c49507077cd5eb81f10b88107cc0f9316932abe9b64e8886d06856a85be63b0c2b475c0afcb0694426860fb24b5c17ab6ab7733d5e641be74fd5f6a1ff18d2f9a42770fb30750f56f4854e38d58aef18a2a61cbfb49ee576ed97737bc28df3268a334175513d97af009cbbcfdfad5039d69bb46f708867d9b3ce0bf2f569e3cfbcf6136f8870d25208b21a3edcb73393dfcd4172c1402c41f36e3f82a4ea6dcd891686ba66e14320aa0e22ba0c1ef033d662cdb860cdfa3a40f6cc532a08", "signature": "07d9fc244fdab00159ebecc5a00883453f08310171769d297001e877010e3eced9fb60ec91cb4d88e7ba40c530b1f9237978ccd96d5cba9e4fa27e2a0ad9d60c" }, { "secret_key": "9b6d7e28eb051597324dceb7a18941246725e88d53ab2c34771105330cf1f4ae", "public_key": "8872a50b5fe362f8ead1d40e2045f0d40b2e7b50b59d8090bc47ad68ebee09ed", "message": "d1e1987bff65f62ad67624c6657924f5d673b7824ebe404026c0562ded3143440be637f98c9e01a6afdfa9a47dd49c7cba6e3fd23e4552f7632b14380b27cd3e9606cce350f152ab126bead0a5d3bce4d42092d934c8ca337e987e11d86cfbfbd2acc3223bd16744a927728f485372175cc694df30a73f9d33765ff014ef008d5863210338cc3482cc27ea317eec921b0c568c38ab27c4a564e802b1b94668c651e20a0b55f3a79d215fc3a0d04904010932c4cc68c2a9e7d00e5d38d82df55206bab95cf697bebc7206eedef6fd18d9a20c2cbb285b00efa769a08dab2b3abadf00d198b4f192dd44bcb91431823ae6fdf98458eca39cd29263f0999303e70dc694fe01c53a11c1d1c34c1ee5068a201dbe7e1008d764358968b402aa398549507f7bd1850800e411b1c4e28ddc04a859e179be8ad7e6670e509db027ad7e517e4425954f5a807414a6da267a764e712a998465064982d851a265ea3c4dfb74f992a7cccd9a82687fa61c322c4f589e86b8825213bfa951dae6af354ace18f073995adc95839dac0165511d61753791a53e48e3a8273d44823d2596f2a2db2e5f1ae597221ba7f3ebaf4a7b2888395002bdaff51fa54bfb979de1031404ca7789fe095d4d17f07a35556b10fe8e1417c8a6a631c2ed36cb7a0e6181776289c344814d42131a73b12faa35d77814c681a601374ba71cb9ad5315fad42d3acfc7c1d628810256daf7d8c3c9a2e5bdcfb770082fa638168958523a1c3b035dbc6d5adf26df89a7ccabed3e7dd377c16da841f13c6894d43cebb4e39022f1ccec2274445c78b3adc7bbf70d890b80236cc4468f9569c59a7e33b570e670380d244e4e310e11c392f1e334054b92c8386c161ce04109b037bd628d919dcb62da1435bf94e88b0a8846d486d16778f7a3b880e660f441fdf86e56b8aa0661f55aaece27f9ddaa0e2a22c215b040539726b9853915a1592dffeae32d7b5b67eb6205bb0bd7279f788d5f833c4066780ca0a42d3e4e1aa22bd06bb5eed89b9413771ecab644ca72d1291d00f740901a7311dc036715d23ebd9a59891628f0d87ed489502f06d75bbd11cd1602a35ee7e13335d6a144b08830e669c02e652f3f100d393ef9b4ac05321439bce6ce36ffc5abca890b8796ccb5e16303559c5d9117f0f31d", "signed": "c6dc5ca1e8560015b493afe2666ccf6fefa803d8526c837fe7f123c7991427ab030d7c770e45f6de8481523b94ece97f3f161cf5b8c7aea39f5ad826bf8d0a02d1e1987bff65f62ad67624c6657924f5d673b7824ebe404026c0562ded3143440be637f98c9e01a6afdfa9a47dd49c7cba6e3fd23e4552f7632b14380b27cd3e9606cce350f152ab126bead0a5d3bce4d42092d934c8ca337e987e11d86cfbfbd2acc3223bd16744a927728f485372175cc694df30a73f9d33765ff014ef008d5863210338cc3482cc27ea317eec921b0c568c38ab27c4a564e802b1b94668c651e20a0b55f3a79d215fc3a0d04904010932c4cc68c2a9e7d00e5d38d82df55206bab95cf697bebc7206eedef6fd18d9a20c2cbb285b00efa769a08dab2b3abadf00d198b4f192dd44bcb91431823ae6fdf98458eca39cd29263f0999303e70dc694fe01c53a11c1d1c34c1ee5068a201dbe7e1008d764358968b402aa398549507f7bd1850800e411b1c4e28ddc04a859e179be8ad7e6670e509db027ad7e517e4425954f5a807414a6da267a764e712a998465064982d851a265ea3c4dfb74f992a7cccd9a82687fa61c322c4f589e86b8825213bfa951dae6af354ace18f073995adc95839dac0165511d61753791a53e48e3a8273d44823d2596f2a2db2e5f1ae597221ba7f3ebaf4a7b2888395002bdaff51fa54bfb979de1031404ca7789fe095d4d17f07a35556b10fe8e1417c8a6a631c2ed36cb7a0e6181776289c344814d42131a73b12faa35d77814c681a601374ba71cb9ad5315fad42d3acfc7c1d628810256daf7d8c3c9a2e5bdcfb770082fa638168958523a1c3b035dbc6d5adf26df89a7ccabed3e7dd377c16da841f13c6894d43cebb4e39022f1ccec2274445c78b3adc7bbf70d890b80236cc4468f9569c59a7e33b570e670380d244e4e310e11c392f1e334054b92c8386c161ce04109b037bd628d919dcb62da1435bf94e88b0a8846d486d16778f7a3b880e660f441fdf86e56b8aa0661f55aaece27f9ddaa0e2a22c215b040539726b9853915a1592dffeae32d7b5b67eb6205bb0bd7279f788d5f833c4066780ca0a42d3e4e1aa22bd06bb5eed89b9413771ecab644ca72d1291d00f740901a7311dc036715d23ebd9a59891628f0d87ed489502f06d75bbd11cd1602a35ee7e13335d6a144b08830e669c02e652f3f100d393ef9b4ac05321439bce6ce36ffc5abca890b8796ccb5e16303559c5d9117f0f31d", "signature": "c6dc5ca1e8560015b493afe2666ccf6fefa803d8526c837fe7f123c7991427ab030d7c770e45f6de8481523b94ece97f3f161cf5b8c7aea39f5ad826bf8d0a02" }, { "secret_key": "7009edd0795096edc4fed55a17ccf484131e608c6d5d6696bf3376e26924959b", "public_key": "77574bf069527145e72d3e85ce7d4fcd671a33e0a71e6bf0da7ea471dd6e86a4", "message": "b12c12470539547c2de6bc4eeac7b63e508ed710f35637d9fdd2dcca322a7a5071dab2b2845e30792806035c9fcdafe2783e3b677d6be5aac70b33910a2b95e8b5d59bda615935a417b7ae19a7853774e89a12aa547b4192979a01ef6ef32a40de79d680057a83a074617ca6501f59e73564927c38b58c19585a2c03659c026e4de3806d6c1ca8958dee47bcb889e76d2c3a9ab5b8b6afb2e842298056567bf9b58957415483336233ef4920fa57f496e1f0348cca20366496fab3a75bf4214ece47a45feaa1392db3f254d96a7f37402c9811140d7358b4ef8f20a298eeef904e37d68f378d33cb96d00c03109fc83fd06a876c92482f61ab7914eb7c2e5e84066e0e91e21e42e9be23df12b5c747973cb86442c32291d3d1ae719b36a62faf3abaa2053a313f625d85c51a5198571915ef8a2b199ba37d25884575ba1b72844cab4328b57fab1ec974ee8ea1df7ca9c78a4d3a03bcb0ab4169bf06a3a438d9566c6c501d8d9ccccb1ac26b4da4ae1a9d8e8b9df662821ad975c9b015fe26f6898d22ab912f0e405a5b27cfd39d657dcd92cdebe6791902713484406dddce71188731e44319381af27daf76792273b8c35251d11b836afe8b3ce9b40273f6915ebe6bc95a75bb941a429209867fba8764bf6c40db6eecb4f21747837cf6ae7fbfe36d5023df7fce2c0c3c57af2898885313c5c4bda35c7da6cb29932fb1991f62bbb080b32e2050619311ae69abb3022d913fa9eabd5d5cb4dc54d75dca638cda9af331c0cf4d2007b6ca39f655a61c01039f12a4b9782bc39aec4d22ef0093388dd7d5b56dfb8a7f9d8669004e2878dd8a6d76857c0845245068fee1c5319631e78d3785165c70afd65299301378551ebf613584c6a7620a0e3b6779f38c0940062497008eb233870868c21cccac239501b63b749a85602c28a095cafc749b0511a6c878edb3b780ea174d07b121e315a826dda6ec8dc54363e2cd2e6305a194825c0ea90efd7a9fd89cd97b99c4300bd3bf9353d82fbcceea71b4ee3f1aae9539b4cce90ca477597c174ef20f4b9f4e62d09a570d3135aabee9551fa60983958c0b7b8c3744553ee14e7f3cd103a19251c99bf6384abb60a76afc6658b80dfc5110adc4c732fe0ee32933fb284828e008887aef80f6f813340446c0217c12ee", "signed": "b701b8f9a434e06d719ad25dcc54060c7986647f44f3884bcb6e5ee1d7a446cc265cec029b537da7f2523326558ac9ba34f4cc2a97cca3452e70562e7a8f5504b12c12470539547c2de6bc4eeac7b63e508ed710f35637d9fdd2dcca322a7a5071dab2b2845e30792806035c9fcdafe2783e3b677d6be5aac70b33910a2b95e8b5d59bda615935a417b7ae19a7853774e89a12aa547b4192979a01ef6ef32a40de79d680057a83a074617ca6501f59e73564927c38b58c19585a2c03659c026e4de3806d6c1ca8958dee47bcb889e76d2c3a9ab5b8b6afb2e842298056567bf9b58957415483336233ef4920fa57f496e1f0348cca20366496fab3a75bf4214ece47a45feaa1392db3f254d96a7f37402c9811140d7358b4ef8f20a298eeef904e37d68f378d33cb96d00c03109fc83fd06a876c92482f61ab7914eb7c2e5e84066e0e91e21e42e9be23df12b5c747973cb86442c32291d3d1ae719b36a62faf3abaa2053a313f625d85c51a5198571915ef8a2b199ba37d25884575ba1b72844cab4328b57fab1ec974ee8ea1df7ca9c78a4d3a03bcb0ab4169bf06a3a438d9566c6c501d8d9ccccb1ac26b4da4ae1a9d8e8b9df662821ad975c9b015fe26f6898d22ab912f0e405a5b27cfd39d657dcd92cdebe6791902713484406dddce71188731e44319381af27daf76792273b8c35251d11b836afe8b3ce9b40273f6915ebe6bc95a75bb941a429209867fba8764bf6c40db6eecb4f21747837cf6ae7fbfe36d5023df7fce2c0c3c57af2898885313c5c4bda35c7da6cb29932fb1991f62bbb080b32e2050619311ae69abb3022d913fa9eabd5d5cb4dc54d75dca638cda9af331c0cf4d2007b6ca39f655a61c01039f12a4b9782bc39aec4d22ef0093388dd7d5b56dfb8a7f9d8669004e2878dd8a6d76857c0845245068fee1c5319631e78d3785165c70afd65299301378551ebf613584c6a7620a0e3b6779f38c0940062497008eb233870868c21cccac239501b63b749a85602c28a095cafc749b0511a6c878edb3b780ea174d07b121e315a826dda6ec8dc54363e2cd2e6305a194825c0ea90efd7a9fd89cd97b99c4300bd3bf9353d82fbcceea71b4ee3f1aae9539b4cce90ca477597c174ef20f4b9f4e62d09a570d3135aabee9551fa60983958c0b7b8c3744553ee14e7f3cd103a19251c99bf6384abb60a76afc6658b80dfc5110adc4c732fe0ee32933fb284828e008887aef80f6f813340446c0217c12ee", "signature": "b701b8f9a434e06d719ad25dcc54060c7986647f44f3884bcb6e5ee1d7a446cc265cec029b537da7f2523326558ac9ba34f4cc2a97cca3452e70562e7a8f5504" }, { "secret_key": "12fe8e5ce20cafaa3279da7b34aa87752ead679f156128aaefb4afa5db4f2a6f", "public_key": "e77f44206bb0c4c59a2870cfc2ecac63362deecbe8115de5cb1afc2d9a3d47f1", "message": "6b80cc6fbbd332f8c6197cdf2e6dc19a2130faa2ec938ef558b884ba4fa5e113e5b3e4b1aaf51b695f13effe13f77d39cab3c07d04d66d430d9974b1da3d39df1278c00d6bcbfd4bae75b8c076404dbbb83448fb493df67000f97d247e8f23dc081fce992b65a21b35d7bd7fa7dccc54a560afd14b1ec436c10946f6aa59eae1be3ecf311def51e46b6b4d1d080d1784b2334b80cfba72cd931f55ecd298b05dc836ab12d0ad8b5d6e9b1e3cea3d843368eef19f5c14c6bbad9414cc7a4db6a726e4fcaed44440a019fe12a60573403c0e662dc902d1c873ff30c931ba7e43a3b3bf71d5b094ea504971647ca94356f0a53e444b4c008ee5977204221b400deec37fc273452545f8f218be988725bc38c85df212ea73dc0bc7cbbac907982fefad680fbd975c2093a7fe8e6b37c1cced87f81daa57291a5a18476d11a18ec4b5cbce5d55ac9b624b048430f254f671078506e6989df7c09256525039085ab7c130c240004abbb3af6b481cc1a0617e57e388ee4b1f052f34a003fe6bb202cb87d2741bd8e3454ca73d2f612011ecc74d88343510a63c9313ddc36c25d3fb03e188f560bd029c801585ce552988dc55b7d8522a3396c01d5e715ae26c622c64fed5b98e9c559e4aa78d1ed3b7b890d477ec8c50a0ff107a3f83b07bd35e9ce9a08bcfc0f168eec7aa311f71c66a71ceb9d5a2199a14be36865ca8d07e186b1392b9290c578004d584f191c82a53d850890bcc0d12dff840e043dddc2e670c836020924f58c044b218763ca61982bc332d247b2a008ab570b6565a06892a26cfb0853d79da28ef8b910a9329544b792ae4456ba7765066b9d1b4a300210448660ae48b504441017cddd1f6f00938b1072c8ab824adfe8ae34923c82eec754bee1a6550ab1d3da086e3aebbf21169c44469e03bbae0d72ce863457784cfe1dfc276f1afad9ee53ebab5a3c6572eb1cae099a4a5fe19319290e6a1b8b0e7541ed735b3f21b1e2c7509f87fd1fed00007479b3c1bb78432466302d246d8d031996307260a0c41a0e3ecd1e7fd834dac11a13eb036b39c369966fdef394c183e54e7b0cb3d0ceb198bd0e66c00d38db703aace30cbbdab369dfd1d9e514d0968f100c9f07c315089adb3ad02e59c04b9be46e99fbf5a62c6bbecdff5b381e55127824ddb18", "signed": "04eaf900966e0992d36e3c220a4bd4d82bcc6eb998ed051dbcb9160bcd357409736bcff7e6630e96f5538aeca6ab8b0d0bd82c0cd7c4549917febb9cbada080c6b80cc6fbbd332f8c6197cdf2e6dc19a2130faa2ec938ef558b884ba4fa5e113e5b3e4b1aaf51b695f13effe13f77d39cab3c07d04d66d430d9974b1da3d39df1278c00d6bcbfd4bae75b8c076404dbbb83448fb493df67000f97d247e8f23dc081fce992b65a21b35d7bd7fa7dccc54a560afd14b1ec436c10946f6aa59eae1be3ecf311def51e46b6b4d1d080d1784b2334b80cfba72cd931f55ecd298b05dc836ab12d0ad8b5d6e9b1e3cea3d843368eef19f5c14c6bbad9414cc7a4db6a726e4fcaed44440a019fe12a60573403c0e662dc902d1c873ff30c931ba7e43a3b3bf71d5b094ea504971647ca94356f0a53e444b4c008ee5977204221b400deec37fc273452545f8f218be988725bc38c85df212ea73dc0bc7cbbac907982fefad680fbd975c2093a7fe8e6b37c1cced87f81daa57291a5a18476d11a18ec4b5cbce5d55ac9b624b048430f254f671078506e6989df7c09256525039085ab7c130c240004abbb3af6b481cc1a0617e57e388ee4b1f052f34a003fe6bb202cb87d2741bd8e3454ca73d2f612011ecc74d88343510a63c9313ddc36c25d3fb03e188f560bd029c801585ce552988dc55b7d8522a3396c01d5e715ae26c622c64fed5b98e9c559e4aa78d1ed3b7b890d477ec8c50a0ff107a3f83b07bd35e9ce9a08bcfc0f168eec7aa311f71c66a71ceb9d5a2199a14be36865ca8d07e186b1392b9290c578004d584f191c82a53d850890bcc0d12dff840e043dddc2e670c836020924f58c044b218763ca61982bc332d247b2a008ab570b6565a06892a26cfb0853d79da28ef8b910a9329544b792ae4456ba7765066b9d1b4a300210448660ae48b504441017cddd1f6f00938b1072c8ab824adfe8ae34923c82eec754bee1a6550ab1d3da086e3aebbf21169c44469e03bbae0d72ce863457784cfe1dfc276f1afad9ee53ebab5a3c6572eb1cae099a4a5fe19319290e6a1b8b0e7541ed735b3f21b1e2c7509f87fd1fed00007479b3c1bb78432466302d246d8d031996307260a0c41a0e3ecd1e7fd834dac11a13eb036b39c369966fdef394c183e54e7b0cb3d0ceb198bd0e66c00d38db703aace30cbbdab369dfd1d9e514d0968f100c9f07c315089adb3ad02e59c04b9be46e99fbf5a62c6bbecdff5b381e55127824ddb18", "signature": "04eaf900966e0992d36e3c220a4bd4d82bcc6eb998ed051dbcb9160bcd357409736bcff7e6630e96f5538aeca6ab8b0d0bd82c0cd7c4549917febb9cbada080c" }, { "secret_key": "ee9b6c2e0c9b01472ce32d54d1762ab0303317d76d3aa78f5e08a9024ca1e083", "public_key": "016df0f717bcb7adf626958d83bf8aa325c70518c68bc7efd84253b75db08788", "message": "772cc25c3b69bb3ff5655664efa478ac414adfaea70ac4a2a887ed3968c54d34dbf1be32cc9a9b5420a4ad3c9a877bc8ccec94ad473aa7a3c7de08a0fdb5ed1e89872be78170be221d279776bbc6ed9c5a67168980d5eaf895e1340f5dfaa3df622d6544b399d74945fd13bb1173621e0561514640137aa7bc9cb7debeff2c626977d447263b7e57d43d69efb230cd25865e4d924828f5e36f964e403e3493f30d6dfea6ca3b781075b5e3b25c05ac50e555f15ba12b0e059bff996484129db6eafd88993d6f0b7ecd15dce2fc99f8b8e43516352ddb461a04b9ff3486452e6aa6a54b2d1062a7714250cd2a88ff6c4c17b6cc6652d8c5ac27d4443aebf3d5fbaaee4521ec76f0413db64421ec8d6949626725fe56160ab307c0e73906c45155efabb47222021f220d32bd3db0712abde2599ea4ff799717811dcdf8182df6716d2a038aee15d778da55ac20f01f25309cead5b5b7b22322e1828ea7c91ae666f2dcd684073148e31bb2247d5f93506ea8085227adc9ae1982e950f006a9da158b9cecff8929761c84f9d976fdcd317ffed36cbf6acda3e50c9b73bd2c8085409d119b64ced7349a2674262a832becb03c2edccac0ec54124e82f810181792da49ea10bd941f9895a06959fde0d3b0ae84c39df05390ab33c36c79ca22e6594d7fc6e3f86922d78eb7f5c25495d822a3b41051b24e57a76fcfc165cde6d096cc7b7e9d055fe864d52942d629a8ac261be1dcd3a21f895f49b67ee47eab7cf1644d571d5ff38c179f5c6a54a3612fb34753412a1b95bf62ff3179804ffbb99051f2b080563a4ae0f27cf996ea8be3bae0a4339dccdff6b6671559266eaff4eff682b8dee89c9d2d45acdbec4aa6cecdbdb1d284609e65efb77bb8f1a51fc4d4568a705fb9c97b2303c1467dff8c8c5ee27559b93ad1c5b9c5c6c7c529fa8c55c75ebb59b2a818aa9bda1e9e79bc66029772f8aea11badd3226565d54fd01bda8cb270e70dc9339b46900b5818e932075be6c28e73a191d02cbdc7454be12387b0d47a1ab14232d2342a6f1518ea97098b815a1ca3f9c70b25722b1bcd7dacda635622fc8e72959f57f767ea563da4c158eef7200109f61416c2e70439923062437b1d082a8c7f4394713c1b7ba0587b841c114475ee3ff059df8cfa12a321d901cb47f5", "signed": "4b001d9642835d72138d680198e6af70b5de7af015131ea726f4e51b5e8b6d48c2a6ca8e8709cc8222a5047c09a66e518ac5e8b6e53548948261f0701f687308772cc25c3b69bb3ff5655664efa478ac414adfaea70ac4a2a887ed3968c54d34dbf1be32cc9a9b5420a4ad3c9a877bc8ccec94ad473aa7a3c7de08a0fdb5ed1e89872be78170be221d279776bbc6ed9c5a67168980d5eaf895e1340f5dfaa3df622d6544b399d74945fd13bb1173621e0561514640137aa7bc9cb7debeff2c626977d447263b7e57d43d69efb230cd25865e4d924828f5e36f964e403e3493f30d6dfea6ca3b781075b5e3b25c05ac50e555f15ba12b0e059bff996484129db6eafd88993d6f0b7ecd15dce2fc99f8b8e43516352ddb461a04b9ff3486452e6aa6a54b2d1062a7714250cd2a88ff6c4c17b6cc6652d8c5ac27d4443aebf3d5fbaaee4521ec76f0413db64421ec8d6949626725fe56160ab307c0e73906c45155efabb47222021f220d32bd3db0712abde2599ea4ff799717811dcdf8182df6716d2a038aee15d778da55ac20f01f25309cead5b5b7b22322e1828ea7c91ae666f2dcd684073148e31bb2247d5f93506ea8085227adc9ae1982e950f006a9da158b9cecff8929761c84f9d976fdcd317ffed36cbf6acda3e50c9b73bd2c8085409d119b64ced7349a2674262a832becb03c2edccac0ec54124e82f810181792da49ea10bd941f9895a06959fde0d3b0ae84c39df05390ab33c36c79ca22e6594d7fc6e3f86922d78eb7f5c25495d822a3b41051b24e57a76fcfc165cde6d096cc7b7e9d055fe864d52942d629a8ac261be1dcd3a21f895f49b67ee47eab7cf1644d571d5ff38c179f5c6a54a3612fb34753412a1b95bf62ff3179804ffbb99051f2b080563a4ae0f27cf996ea8be3bae0a4339dccdff6b6671559266eaff4eff682b8dee89c9d2d45acdbec4aa6cecdbdb1d284609e65efb77bb8f1a51fc4d4568a705fb9c97b2303c1467dff8c8c5ee27559b93ad1c5b9c5c6c7c529fa8c55c75ebb59b2a818aa9bda1e9e79bc66029772f8aea11badd3226565d54fd01bda8cb270e70dc9339b46900b5818e932075be6c28e73a191d02cbdc7454be12387b0d47a1ab14232d2342a6f1518ea97098b815a1ca3f9c70b25722b1bcd7dacda635622fc8e72959f57f767ea563da4c158eef7200109f61416c2e70439923062437b1d082a8c7f4394713c1b7ba0587b841c114475ee3ff059df8cfa12a321d901cb47f5", "signature": "4b001d9642835d72138d680198e6af70b5de7af015131ea726f4e51b5e8b6d48c2a6ca8e8709cc8222a5047c09a66e518ac5e8b6e53548948261f0701f687308" }, { "secret_key": "a3d23505d07c5f937f13639dbd818e85145234ee7017ecee8636c7ba76ebef5b", "public_key": "fd7fdb3d022ba36eadfed0daaae5bff04505403f171473e4d361ee8d150a0eb4", "message": "bc298ed69892904028725e21b114462d89d8c006dc884b178756838af4954ff0f1b79517307a258a0e7681e879ac47d7920230b0cc1d66171eb214d77cd97f617c405e6c2172fc589f1625cc5e1b593110531f6eb53f1e6f486d1964612447750a041fe51b332eb3fbc711616ce35f040442b43163b80b751e21ec1245f12e4883c79d3b413282c69bfc6a465d1e7896bab038dc89b4cfc032fccdfc87b07f06110e1f506acca8157a322543bf1ed8906727f28d0d689bcd7dd3df85935204a904ab3f7a0d99c16e5a542cc2bcdebf5b502dbabe33b972480e02e71a438a1980a8766f108bd8ad51104223994d9bfb3c3a4b7a59238ce2ef7d7288383ffbf291e1602b384af60700d7daf0e8fe60f8caede43db06b3f4c8cfff749aeafa46fc61c49b2d5a41204cf86f049254d809e9498aa9d4cfdb94acb2babfcf786ddfb03691516b3838b0d4f201cb2591edbb0b0f674e1e2820316b72e81b48cc5a6b29338bc36681f8f7dca43ee6c0bd2e402afbf967797516453bc01be86bf42299d1b736a0d97bbc922f5a78af2df42e6f8c28e953f2ceadaffc5e93064041e425ad6975f88c7aadf81c368691a581e885f2a6ba72ed68b8fefbcd6ce368626d44892a20270b5f709c2e34b8335d42eebd67a24df73f45455c41944187b6692f054b2fc9591373f19fc71aa7fa27df6006a1d549bbfae7d3c3eb36e5ab2aaa10aa5538da7ef36c8ff354b6058134004d660a4036321caad00a30b1c498ba3d808c4405ef79618fc2212a7b83396a3d7cedceb863c66374dc469ae183c7ed74b3e70d6374a062de0379b21cf25d3c4c5762115cdfe755545e89ad4052bb0279d938e90de3abf504410caad72b7c29f53d01d9dd7f2ec5e459a04592bdd66416613e6edd004569e0e6c98827b8c1d7002a6d1bf303e18259501dd89f6ee94766d18af810463eb13b2efddf1723af735a88716e1fcb4b7b43cb97e1cc903b2408ef453ada4164786f00845fbfa1ffca5cc3e1c4bd9940e7d99aef919166d058b51453c9c14fb9f3251ec5fe4f153c70a4492dc3496296186f23ad47ebad13c66e68727ce50ba9487f1801890b693efebfc37bb5d95f8af548ec8d6498289e55f9883fc5be84c256d2bc5484938c709820d9b6b8059c0aa4267dde69078e487c8865c0b130a0ca8ca", "signed": "67a667ee0d6254ca0a8f212582c0cb8b6ed97cc967db021296ad6aa99f0ad3a944978cfdaff13fe5f8c6e88cbd831a5473d0742e3734b3e2df00ff3240a5de02bc298ed69892904028725e21b114462d89d8c006dc884b178756838af4954ff0f1b79517307a258a0e7681e879ac47d7920230b0cc1d66171eb214d77cd97f617c405e6c2172fc589f1625cc5e1b593110531f6eb53f1e6f486d1964612447750a041fe51b332eb3fbc711616ce35f040442b43163b80b751e21ec1245f12e4883c79d3b413282c69bfc6a465d1e7896bab038dc89b4cfc032fccdfc87b07f06110e1f506acca8157a322543bf1ed8906727f28d0d689bcd7dd3df85935204a904ab3f7a0d99c16e5a542cc2bcdebf5b502dbabe33b972480e02e71a438a1980a8766f108bd8ad51104223994d9bfb3c3a4b7a59238ce2ef7d7288383ffbf291e1602b384af60700d7daf0e8fe60f8caede43db06b3f4c8cfff749aeafa46fc61c49b2d5a41204cf86f049254d809e9498aa9d4cfdb94acb2babfcf786ddfb03691516b3838b0d4f201cb2591edbb0b0f674e1e2820316b72e81b48cc5a6b29338bc36681f8f7dca43ee6c0bd2e402afbf967797516453bc01be86bf42299d1b736a0d97bbc922f5a78af2df42e6f8c28e953f2ceadaffc5e93064041e425ad6975f88c7aadf81c368691a581e885f2a6ba72ed68b8fefbcd6ce368626d44892a20270b5f709c2e34b8335d42eebd67a24df73f45455c41944187b6692f054b2fc9591373f19fc71aa7fa27df6006a1d549bbfae7d3c3eb36e5ab2aaa10aa5538da7ef36c8ff354b6058134004d660a4036321caad00a30b1c498ba3d808c4405ef79618fc2212a7b83396a3d7cedceb863c66374dc469ae183c7ed74b3e70d6374a062de0379b21cf25d3c4c5762115cdfe755545e89ad4052bb0279d938e90de3abf504410caad72b7c29f53d01d9dd7f2ec5e459a04592bdd66416613e6edd004569e0e6c98827b8c1d7002a6d1bf303e18259501dd89f6ee94766d18af810463eb13b2efddf1723af735a88716e1fcb4b7b43cb97e1cc903b2408ef453ada4164786f00845fbfa1ffca5cc3e1c4bd9940e7d99aef919166d058b51453c9c14fb9f3251ec5fe4f153c70a4492dc3496296186f23ad47ebad13c66e68727ce50ba9487f1801890b693efebfc37bb5d95f8af548ec8d6498289e55f9883fc5be84c256d2bc5484938c709820d9b6b8059c0aa4267dde69078e487c8865c0b130a0ca8ca", "signature": "67a667ee0d6254ca0a8f212582c0cb8b6ed97cc967db021296ad6aa99f0ad3a944978cfdaff13fe5f8c6e88cbd831a5473d0742e3734b3e2df00ff3240a5de02" }, { "secret_key": "6e265105ee7171d1bd793effd87d1e2c79450d5e188b57be3aa162e2a52528ad", "public_key": "1f403c7a755031c13ca63af57635dc6e2c4f23bd6b1d67ca65da68b09943c554", "message": "f8b9d4b027ebb10ee511819e6e56fb1ba9584018418d82885a38a449086007b8785b5105caf782bf9b36da039cc60e227c7e1614f29b640b1e9b22747eea7a6725614e89e0783ebebbb7ee557ef36b2b46cf6461e5be2ad1d7a7c2711a475ca4fbc33092ba425667e34d090060518f2fec636b049123876ab21c8bd9c50dccb984ca011a02eea020564fa821fc362bfe392aab50c273fc7b5a042188e331621b9d2f743e5c8cf3ab1faffafe2a0004c8ef7cdf5e6dbb5eb544e4289f71a6fd15c638ce29d28efb9c039e477429a3497a83827e76ce77a49816d90b41a8e152f37a09e6340dfe069a4ac6f27dd2eac747fd21e3152088c1b1ecd32ac679927490750488c291785147b63b0b8ff11d189b9049b8a396b6932f85bd6a15eff9f0ce1808411af0f9c8e6e97b814f110bd4df1386a9797dc511f0aab6ab65071d9ea836532cec51b92ca7fbdb8de1c8436658de2eb65edd86044f6c1aba3178647ad678612ee74f046ca3c7fe2f39c09dd2e07df2b4227085fe936e794d22fd5f40a25f08771580ac801d9889f5a76aeae1f0cc4a9e1edbdda3750c74c850524b32f44933fd883b5372bfb7e761e069fe7c1c0e7fbd4a7f58467ea6883f9d5b7f66d386b0499bb6fb5ead89c9a1fd2cceb973e2879b5d03eaa452e16022d59617daa0486f4d4c117807fda8499dfb7a286fd2f71a8eb5fe64065c41e4e1e2362ab4e477969e3a408a247e3a56fc86f2b01ef8d3cdda87258234bc7f25b66907f364b37b6245296c4fdf499f20237f4864852fc5d8cd5d05418be8b13859ee9a43e17e1f57a4c35ea282ed68ebcda6828174245a49c6cb6590eb1f2dcfb007bfa1c32077956da9acbe3ef0723799fdb869d8de30706a9c026814d16a01e033c91b59070dfe445c5b848a516612e5131fe8486921e36b8e7ef157a88822886c681b5da71fea94d957dafec26f4147a3b2ac383a5f47c8585eb17a8ac65790641b4218d755f8bea4d97ae2a45bdcdc23236294d852c95d08406d2e9bd30c326452538c1f5e5004d4a1a82720da32e59dc3ab18ea08a058f791d24418556086c1e4edce8982aa23b118fb266e60b542780a6933add913265512c07b114978d44af73b2030ec47b06fd09dda8c4f1d4e313775468c451f9ee611e9cd4c0845c2501948a7b14ef1d4b5cf", "signed": "b5a83a117a60345a67e4a665f37de722a6ec03913829389959f376ee626477e654ac8d720fc727d4bb8fe1544f5d0b0b850514290b24273c4cd4b73aca4a5300f8b9d4b027ebb10ee511819e6e56fb1ba9584018418d82885a38a449086007b8785b5105caf782bf9b36da039cc60e227c7e1614f29b640b1e9b22747eea7a6725614e89e0783ebebbb7ee557ef36b2b46cf6461e5be2ad1d7a7c2711a475ca4fbc33092ba425667e34d090060518f2fec636b049123876ab21c8bd9c50dccb984ca011a02eea020564fa821fc362bfe392aab50c273fc7b5a042188e331621b9d2f743e5c8cf3ab1faffafe2a0004c8ef7cdf5e6dbb5eb544e4289f71a6fd15c638ce29d28efb9c039e477429a3497a83827e76ce77a49816d90b41a8e152f37a09e6340dfe069a4ac6f27dd2eac747fd21e3152088c1b1ecd32ac679927490750488c291785147b63b0b8ff11d189b9049b8a396b6932f85bd6a15eff9f0ce1808411af0f9c8e6e97b814f110bd4df1386a9797dc511f0aab6ab65071d9ea836532cec51b92ca7fbdb8de1c8436658de2eb65edd86044f6c1aba3178647ad678612ee74f046ca3c7fe2f39c09dd2e07df2b4227085fe936e794d22fd5f40a25f08771580ac801d9889f5a76aeae1f0cc4a9e1edbdda3750c74c850524b32f44933fd883b5372bfb7e761e069fe7c1c0e7fbd4a7f58467ea6883f9d5b7f66d386b0499bb6fb5ead89c9a1fd2cceb973e2879b5d03eaa452e16022d59617daa0486f4d4c117807fda8499dfb7a286fd2f71a8eb5fe64065c41e4e1e2362ab4e477969e3a408a247e3a56fc86f2b01ef8d3cdda87258234bc7f25b66907f364b37b6245296c4fdf499f20237f4864852fc5d8cd5d05418be8b13859ee9a43e17e1f57a4c35ea282ed68ebcda6828174245a49c6cb6590eb1f2dcfb007bfa1c32077956da9acbe3ef0723799fdb869d8de30706a9c026814d16a01e033c91b59070dfe445c5b848a516612e5131fe8486921e36b8e7ef157a88822886c681b5da71fea94d957dafec26f4147a3b2ac383a5f47c8585eb17a8ac65790641b4218d755f8bea4d97ae2a45bdcdc23236294d852c95d08406d2e9bd30c326452538c1f5e5004d4a1a82720da32e59dc3ab18ea08a058f791d24418556086c1e4edce8982aa23b118fb266e60b542780a6933add913265512c07b114978d44af73b2030ec47b06fd09dda8c4f1d4e313775468c451f9ee611e9cd4c0845c2501948a7b14ef1d4b5cf", "signature": "b5a83a117a60345a67e4a665f37de722a6ec03913829389959f376ee626477e654ac8d720fc727d4bb8fe1544f5d0b0b850514290b24273c4cd4b73aca4a5300" }, { "secret_key": "c4370d2aaf35acd158fc0d1622a399c99f41b9da4e970b354e5ba05cbe844ca8", "public_key": "3545d7d4c95c3db6a54530537afafa4d86ddecf9cc7e66c319ba9f7dd7d07ee7", "message": "619f57de2b1dbaee209a825d8ca97f84ee49eb12a0b13dcdd2b3a4ee45e0176d474cf09460c831a8ae1d3f39beebd08808b3ed1761213ba953421860cc07e2db312e680df03e60a6870264abca8fd51301e1c1562023d802ccd5c7d196db39fbb8304b0e59e333164192ecc333387eef69c7a78a5d11258862d6c281b19c0bd336cd3edb2f9faad4021ac2f205c16814b38548433ff9eddfd61133779769dc69afac658afc1d1b416d390ad5b45a1ad5cc4b00b4b278fbe4b59d52e61a6a5fd00241c6cbc382d2d621a3ded002019b330560e361faab28f41d1af9c9c0020f2baf99e8d8ee58e3122202147c0adc57d670c5b380af594cc7ed57b87ec6674ab63f3a9849753b9462aab5de88c948a8b109af4d4954927aac58bee953be0d8d7d71aa11d11f1a87b1477b9170bd735cfc2449f051b82bc59b0bee76a172e8d32670f51ddddb804ad110a565e384cdb76fad04cff67893091e41e69cfdf70ea926c26369a5b6193b19ab0a62558da55ffafeb8789757710644aa19f474be4ada9dc1849b07d5e17b85f921e1016a54aa6095777253a73426fc7864b9955f04907023db207f85dd21a65106cf0d622385870c34c2da9a11e4726395121e4a6761fb522229d9e5cc9dab35aeb87d0d79693c006fde1cfaf116208bba962059cfc0d2d6370aac7748362ee6a0a3ca7bf133ebcfa20f1c4ed8307f800cca7e6c4beaa3fb2ab086125364285c44ed1a737a67cbf3b763c9f8b1427e89dfa96d290e9d4842fe6316afef834cd8cd1fdc1f124ca3fe26266da62e275c0bf7fcc8e5f9bba6c0d38e23fafab1e049481794c14f4a8c53be1c96f769c9b13eaca39a0e49366d2c9ffe8f206360a9d503dec598621112e3776713e7fc0649433e257e503a546059a989da89157d76476005fd90e4b07aaf0db0bc0bc0b67db8dcbadff39374e1afae551634e0e32831ad0e5fa7d5216fa7c644f73e1e8e07238394a416c169aa9d5303f469a5d4074308721ffddeff6559e5adf0c2773b3f5264e7aaa8c2db888e28e815c71069c3b4ce6c29034c0ab3b5c19a80a9d8c2e874813531c422752ad62b3c5a1a3d6c5a5db587270693aa75d5f172eeddf4eb839bd793affb1c796a1df0e442ddf99b780aa41eea0fe6f865bb539ca53aa45db9a856cb75d0151d35edea80f2946d", "signed": "9febab5ae161d692a6a394500a2890d21c7f0ee26f4640aaba4fe66b90b89edcb80ea4cdcabb4d2c3a5c4154e8ff20d0e237fefd00c7ba9782e1748f6488ac01619f57de2b1dbaee209a825d8ca97f84ee49eb12a0b13dcdd2b3a4ee45e0176d474cf09460c831a8ae1d3f39beebd08808b3ed1761213ba953421860cc07e2db312e680df03e60a6870264abca8fd51301e1c1562023d802ccd5c7d196db39fbb8304b0e59e333164192ecc333387eef69c7a78a5d11258862d6c281b19c0bd336cd3edb2f9faad4021ac2f205c16814b38548433ff9eddfd61133779769dc69afac658afc1d1b416d390ad5b45a1ad5cc4b00b4b278fbe4b59d52e61a6a5fd00241c6cbc382d2d621a3ded002019b330560e361faab28f41d1af9c9c0020f2baf99e8d8ee58e3122202147c0adc57d670c5b380af594cc7ed57b87ec6674ab63f3a9849753b9462aab5de88c948a8b109af4d4954927aac58bee953be0d8d7d71aa11d11f1a87b1477b9170bd735cfc2449f051b82bc59b0bee76a172e8d32670f51ddddb804ad110a565e384cdb76fad04cff67893091e41e69cfdf70ea926c26369a5b6193b19ab0a62558da55ffafeb8789757710644aa19f474be4ada9dc1849b07d5e17b85f921e1016a54aa6095777253a73426fc7864b9955f04907023db207f85dd21a65106cf0d622385870c34c2da9a11e4726395121e4a6761fb522229d9e5cc9dab35aeb87d0d79693c006fde1cfaf116208bba962059cfc0d2d6370aac7748362ee6a0a3ca7bf133ebcfa20f1c4ed8307f800cca7e6c4beaa3fb2ab086125364285c44ed1a737a67cbf3b763c9f8b1427e89dfa96d290e9d4842fe6316afef834cd8cd1fdc1f124ca3fe26266da62e275c0bf7fcc8e5f9bba6c0d38e23fafab1e049481794c14f4a8c53be1c96f769c9b13eaca39a0e49366d2c9ffe8f206360a9d503dec598621112e3776713e7fc0649433e257e503a546059a989da89157d76476005fd90e4b07aaf0db0bc0bc0b67db8dcbadff39374e1afae551634e0e32831ad0e5fa7d5216fa7c644f73e1e8e07238394a416c169aa9d5303f469a5d4074308721ffddeff6559e5adf0c2773b3f5264e7aaa8c2db888e28e815c71069c3b4ce6c29034c0ab3b5c19a80a9d8c2e874813531c422752ad62b3c5a1a3d6c5a5db587270693aa75d5f172eeddf4eb839bd793affb1c796a1df0e442ddf99b780aa41eea0fe6f865bb539ca53aa45db9a856cb75d0151d35edea80f2946d", "signature": "9febab5ae161d692a6a394500a2890d21c7f0ee26f4640aaba4fe66b90b89edcb80ea4cdcabb4d2c3a5c4154e8ff20d0e237fefd00c7ba9782e1748f6488ac01" }, { "secret_key": "bd3de1a1d164bd6e9be0a6d107f703a6dd914c8667cd341d139f19578d933b16", "public_key": "9b024964bdfa852eb2d4144f35b7cdc26781143c2bd7f660233f8b8aa36071ee", "message": "1769fcdbf51247ed4c83a00bbbf02f4428da6fceddd0161a02fccd1500970665e1c7630ad22e3d9749c792e71a260cfff6053256e02f5b47bba14b761ae53ca7219ed2801d2d788e26419f36c81ef92c2303683735c8a1756adab6a487923153e435603c96b239553edfdeb093298f7ae7dc90f16a7e5664b9e4c02ba731a23cf2234e250ac9742633a932a948bb83dc3d794d059fedf4ec8618c7433c5d8fe5e62cf07b5768c4d9b261c71536804fe2e7ca7098876521d57677361424e47f1b959237f90710421f5bc4f109f7d489c755e94eefdfb3c85b90ec013181a23bb9535feea4941d0a06a540bd6b588e55b7f35757149ca3e640965e1a0ff7f3c8259259957ff5dab9fb8732eae719b624a4492878179b5a83abe51caf02083d737ceb4fcf042f2e60ba0297ac72b87fe3e14ba5fbc54b48091073896823bfa289ce8e16873b48812c32bfea5ff6bb221d1ea5463d325bbe311e7fd1e783de650b7952eae461d63bc7470522af5b7789f8fc2eb192d2cf776c5c24b44e29cdb0cccb1d90361438e4950ff34dbcb3cb0e81cc45f8d0ff570949f78084e1060ff5594ad516f50f1cb0a765e1c0e038d5943b936e4a8b493354e79abc917bb9271266eeba77a93a657f9ad87b291ac7ea386f5d4fcbc582e72d5c23d92ba944b0064c20e3e2dcf504bcc7c6966c63f2080843600ba313ec27cba95e7ef318168c9067dce86c1ef0d5d9eb7a6158489df32ed58b6931030818f00705a0dc55d3dbf8006a8546641b1865d919bc242202cb3ae300bf8653e3b37894c3dc0e477b9d7c41baf8d3887c2eb59b1e4d50bbb6f1792a1c9367c65cdb450c2dfa2145e611a97ad81cff1fd83c6cf7230947eaff4c21dc1bafb71ec41e5bc72b3745ec3e38bf5930c126d060f0c50a895f009aa18e87f2174f58ab5379a721fd83aad5517fd99dff146edeea61521235e2f1a16ee58303e091be8d579094c1d8a20bc74a550d77c00d087571517a63cd4126933a4f09a070bf8ea4ffb846a9780e9734043bac4c0ff47b1afccf5293ac14bc73ebf67129657e4b8a8b33ddac7b0f4d719d2dc65df6ea0a3f24cf44c8338ed601a3939ca358fc4be13e8ede027539712ca23e3ffba706e8fdd62a074ee0ad7420f78060cc96fb2abf30e9eaa241c0f87ebbe3ec73517596f7c3c5a80c", "signed": "13cc158fd061792fced156879598251dd01d575b400fe3e39a700863aae8db1f9197fa501c0cf993e44d6ac55180b869838e8ae24b214fa35e244b7a6cff6d0d1769fcdbf51247ed4c83a00bbbf02f4428da6fceddd0161a02fccd1500970665e1c7630ad22e3d9749c792e71a260cfff6053256e02f5b47bba14b761ae53ca7219ed2801d2d788e26419f36c81ef92c2303683735c8a1756adab6a487923153e435603c96b239553edfdeb093298f7ae7dc90f16a7e5664b9e4c02ba731a23cf2234e250ac9742633a932a948bb83dc3d794d059fedf4ec8618c7433c5d8fe5e62cf07b5768c4d9b261c71536804fe2e7ca7098876521d57677361424e47f1b959237f90710421f5bc4f109f7d489c755e94eefdfb3c85b90ec013181a23bb9535feea4941d0a06a540bd6b588e55b7f35757149ca3e640965e1a0ff7f3c8259259957ff5dab9fb8732eae719b624a4492878179b5a83abe51caf02083d737ceb4fcf042f2e60ba0297ac72b87fe3e14ba5fbc54b48091073896823bfa289ce8e16873b48812c32bfea5ff6bb221d1ea5463d325bbe311e7fd1e783de650b7952eae461d63bc7470522af5b7789f8fc2eb192d2cf776c5c24b44e29cdb0cccb1d90361438e4950ff34dbcb3cb0e81cc45f8d0ff570949f78084e1060ff5594ad516f50f1cb0a765e1c0e038d5943b936e4a8b493354e79abc917bb9271266eeba77a93a657f9ad87b291ac7ea386f5d4fcbc582e72d5c23d92ba944b0064c20e3e2dcf504bcc7c6966c63f2080843600ba313ec27cba95e7ef318168c9067dce86c1ef0d5d9eb7a6158489df32ed58b6931030818f00705a0dc55d3dbf8006a8546641b1865d919bc242202cb3ae300bf8653e3b37894c3dc0e477b9d7c41baf8d3887c2eb59b1e4d50bbb6f1792a1c9367c65cdb450c2dfa2145e611a97ad81cff1fd83c6cf7230947eaff4c21dc1bafb71ec41e5bc72b3745ec3e38bf5930c126d060f0c50a895f009aa18e87f2174f58ab5379a721fd83aad5517fd99dff146edeea61521235e2f1a16ee58303e091be8d579094c1d8a20bc74a550d77c00d087571517a63cd4126933a4f09a070bf8ea4ffb846a9780e9734043bac4c0ff47b1afccf5293ac14bc73ebf67129657e4b8a8b33ddac7b0f4d719d2dc65df6ea0a3f24cf44c8338ed601a3939ca358fc4be13e8ede027539712ca23e3ffba706e8fdd62a074ee0ad7420f78060cc96fb2abf30e9eaa241c0f87ebbe3ec73517596f7c3c5a80c", "signature": "13cc158fd061792fced156879598251dd01d575b400fe3e39a700863aae8db1f9197fa501c0cf993e44d6ac55180b869838e8ae24b214fa35e244b7a6cff6d0d" }, { "secret_key": "f6ae516a51296fc523cea5f008cfbd09e73f78b6fdd3b69426128041a5604cf9", "public_key": "376c82ba7b87aa77418727db33d326ae758bf7a135c10460cd8bf8feb83c2b10", "message": "8342f25ac4b17ebad6f79b9a033175c7f28af09e658e8cb98c294f15c3c8342629cb2a3247dfc875b82f5b380c5d11426a2eeb62450bd885650107c68362a3b72ce823f2d15942b7dda301d2fb638f302aa9570b47911dadd3bddbfed554c1c80bd718078b8bd2c9c314a5166f265e8266ee2db357561a5585c414a7840bfae609d7cddde1fade85560f23d638ef3d52e51f5cf313a072c5ea0f817f7281e2cba5c5c8d26c928592b81f0ff8cd18db5a2c41d880d74473863c7bbd0056fa4d4afabd17a3b89d97d3fe5dc06b0f612a1d66423923ba8dfbb8ec8246624d83784eba4f5736ba385e442296c8cb0f1b68e03342b2c6c103346f6dd740e26c3d13caef801d1b2621d89f069391a078d43ae6ff12eeca66bc32637b45f0ac627c2d7bbf8a49d9468175e26885e02821d3a3baa2c3e3a6bb96b57526e224cf3d859f669573cbd5c87393746156f3d1c7a80308dc1f2405bf0d40be1ca73b767dedf4031337c081bfa3ae6e54f6023f42f0cbd87762db55913c707206034010df2aa8753d030f03c267e71a9dd2c6c19de3e1851abfacbbd5dd5bf896fab8e415317b49f1e4096e3da99a5b5d0a3c42daf9de94847c1e53c8818a5b843323f501e3a7fa68df89a5f41f2c62c38d17f250b02a67fae47daf063f558942377ef8a89052f1a215d768f7913a7ec14e98b81e4b2ccf26bacad6f39664afc0e91a3cad691db2bf56a7ab6677b49596db887c97def43508a7a2ec2ab755ec368e2e53d1e16b60fff09c3b52263f0f7c1ea9cc35373197e95c11e6d22fa9d8299c423736f5814f1e798d227518600df6a790358deae38d5639e1983fe018436ea58ba8467548c929efbb16dfea4102253a350fb84d9831c4c2cbcb76e18d7f3e953641ada41421393091e63dfe66de24c99232c7d6a2837a48983cf5b16331ce00050d1c713958ffce5f2e9348c52f53120579a7c9a16008d134838e596129c702fcd21148bdf9174d48e2da0a8a66359edee01c5009ef6742fec41c1acecd03efe1ccc9b130d6e5ac92576a85ccb7cfc7d0e4233106172931a08699790bc41acfbb731adbb26d56b39aaa5b333bc1a10e2c7064ca86119d8c717148f92441af24cd2aa8f57c86ba38a59a100b9276df3827ec7fb4d3faf58be31c6ecafd69cf1c6410a49cd7081ff6e9fc397c2d20", "signed": "0fe4dd7e1f608ee82b7fe863d1b03a81843ce20c762cd8bb24efd46ba025fff3331d875752ca7220c53dd3c71f2bc1e2c64a2f9c58865a2a244809f4134e53078342f25ac4b17ebad6f79b9a033175c7f28af09e658e8cb98c294f15c3c8342629cb2a3247dfc875b82f5b380c5d11426a2eeb62450bd885650107c68362a3b72ce823f2d15942b7dda301d2fb638f302aa9570b47911dadd3bddbfed554c1c80bd718078b8bd2c9c314a5166f265e8266ee2db357561a5585c414a7840bfae609d7cddde1fade85560f23d638ef3d52e51f5cf313a072c5ea0f817f7281e2cba5c5c8d26c928592b81f0ff8cd18db5a2c41d880d74473863c7bbd0056fa4d4afabd17a3b89d97d3fe5dc06b0f612a1d66423923ba8dfbb8ec8246624d83784eba4f5736ba385e442296c8cb0f1b68e03342b2c6c103346f6dd740e26c3d13caef801d1b2621d89f069391a078d43ae6ff12eeca66bc32637b45f0ac627c2d7bbf8a49d9468175e26885e02821d3a3baa2c3e3a6bb96b57526e224cf3d859f669573cbd5c87393746156f3d1c7a80308dc1f2405bf0d40be1ca73b767dedf4031337c081bfa3ae6e54f6023f42f0cbd87762db55913c707206034010df2aa8753d030f03c267e71a9dd2c6c19de3e1851abfacbbd5dd5bf896fab8e415317b49f1e4096e3da99a5b5d0a3c42daf9de94847c1e53c8818a5b843323f501e3a7fa68df89a5f41f2c62c38d17f250b02a67fae47daf063f558942377ef8a89052f1a215d768f7913a7ec14e98b81e4b2ccf26bacad6f39664afc0e91a3cad691db2bf56a7ab6677b49596db887c97def43508a7a2ec2ab755ec368e2e53d1e16b60fff09c3b52263f0f7c1ea9cc35373197e95c11e6d22fa9d8299c423736f5814f1e798d227518600df6a790358deae38d5639e1983fe018436ea58ba8467548c929efbb16dfea4102253a350fb84d9831c4c2cbcb76e18d7f3e953641ada41421393091e63dfe66de24c99232c7d6a2837a48983cf5b16331ce00050d1c713958ffce5f2e9348c52f53120579a7c9a16008d134838e596129c702fcd21148bdf9174d48e2da0a8a66359edee01c5009ef6742fec41c1acecd03efe1ccc9b130d6e5ac92576a85ccb7cfc7d0e4233106172931a08699790bc41acfbb731adbb26d56b39aaa5b333bc1a10e2c7064ca86119d8c717148f92441af24cd2aa8f57c86ba38a59a100b9276df3827ec7fb4d3faf58be31c6ecafd69cf1c6410a49cd7081ff6e9fc397c2d20", "signature": "0fe4dd7e1f608ee82b7fe863d1b03a81843ce20c762cd8bb24efd46ba025fff3331d875752ca7220c53dd3c71f2bc1e2c64a2f9c58865a2a244809f4134e5307" }, { "secret_key": "83f789900f040dc62f4d18784cb64b63c88e8d18001696bbeb4707c469d11a5b", "public_key": "edfc2bab7e79f40037fe4d9041de48da9aee8f978098d7b0ae17929025e4273d", "message": "6c112a20d30657ab5f8c5c04478d6c42d1c6bdef38cd4fe006ac2a57e290ff29287896eea8c30a0139c18fc8c97564563e86c8d34056a6719bfe479d9e87e81b19452331bfa154806882e5039a20c9e954b1fc7c015dcf5815bd7cf7b6357df9280b9bd43f89ffc91945323b5acb2ae00254d4162868d1c83ec6e0fcbe7a8ab9254192149c6bc9e5fe350694165d6638331eb24e3b1390c698c4838378c01b2c61a3ebe2c060b98ba6ee02b519b4eac1e0bcc09b2324ccf5b1a7fe8fd0b1545a9427832abb25744eeb36326be64efed3a7b07d630a21c3081b55261c353287c66c57663a99db466a5dee22746b81c750ef85be51143e221ecdf114fef1b3082ff54fd044bc884bfb3cc5c5335997009867ce9491a80fe696825f99426defab6a49badcde403f58e8317966210747b567754de53076b3ecbf65346cb83905832e16d01b50b93d37eb9bfe20172a31630d25f3217d87d93465fd8ac554cbbb39d982ead7219391234c889f0b92a2e0413d866cac087d628ce31c61c6323ecb8e689555af10de2b656e6aea2cde932e241f6d1f8a9e3316cf13f135acef83a0c0cf22f95ca818e61f92768774c630e0925be99dbd32b499c0fe7d84a42e393287f6f5ce3d0b271f170045a6d48eab316fe17b1858b1ffeee90888f3a37a2480dfd04a4a8629f868b5c0a80ee1f03719f3a47d4095bef10e0234fc300e2af482285d78937968319da94beb6c40e078577c024f3a5cda0084e2f855a9396aaa9ee9bfaf2cc771fe68c40b629e8dcf115ef03e757a2ac9eef073f1bdf9c5a4410031558a6d382b5f16024b151b1c01ee7817413a3c4de9dd6478785b81101df5522430058780207e790f612d78e5705ceed46b0ec075e7c1dc073b17b2b43d72535927bfd271e92e3c93638e40a9601dc2c1ab76d91a4103df657d911c829ee8a5f747f7642f5a915a5f40f630b43039c7d4bd2ad2b32129d94e5b2f03ad4a3d45577eb81f369c9e3e2a4f6a8e41acf8283be58425ea993b8e98eea6330556648618dad98fa255620d836d3c7f29b907895849286167c7181e2caf55c2c184a9a911f8e41cb042e2cd48b0544ea79fe2ef381ebc5b15e39a9b5c6d998faeaaa7773cfec084c0bfaed1bcab963a4ef3d94dbb3dfe724c040ce4d1e2ee7fc2da4b25127ce3a5df693fcf5a6ed1", "signed": "ea6582cc23e0460917f782d964e3bb6dcde0aeeac42cc14919d36ce78aa0afd98072f54c795fbfd7a41d99d70606c28a5dcf19be38a0ce2d09bb8f844c31bf006c112a20d30657ab5f8c5c04478d6c42d1c6bdef38cd4fe006ac2a57e290ff29287896eea8c30a0139c18fc8c97564563e86c8d34056a6719bfe479d9e87e81b19452331bfa154806882e5039a20c9e954b1fc7c015dcf5815bd7cf7b6357df9280b9bd43f89ffc91945323b5acb2ae00254d4162868d1c83ec6e0fcbe7a8ab9254192149c6bc9e5fe350694165d6638331eb24e3b1390c698c4838378c01b2c61a3ebe2c060b98ba6ee02b519b4eac1e0bcc09b2324ccf5b1a7fe8fd0b1545a9427832abb25744eeb36326be64efed3a7b07d630a21c3081b55261c353287c66c57663a99db466a5dee22746b81c750ef85be51143e221ecdf114fef1b3082ff54fd044bc884bfb3cc5c5335997009867ce9491a80fe696825f99426defab6a49badcde403f58e8317966210747b567754de53076b3ecbf65346cb83905832e16d01b50b93d37eb9bfe20172a31630d25f3217d87d93465fd8ac554cbbb39d982ead7219391234c889f0b92a2e0413d866cac087d628ce31c61c6323ecb8e689555af10de2b656e6aea2cde932e241f6d1f8a9e3316cf13f135acef83a0c0cf22f95ca818e61f92768774c630e0925be99dbd32b499c0fe7d84a42e393287f6f5ce3d0b271f170045a6d48eab316fe17b1858b1ffeee90888f3a37a2480dfd04a4a8629f868b5c0a80ee1f03719f3a47d4095bef10e0234fc300e2af482285d78937968319da94beb6c40e078577c024f3a5cda0084e2f855a9396aaa9ee9bfaf2cc771fe68c40b629e8dcf115ef03e757a2ac9eef073f1bdf9c5a4410031558a6d382b5f16024b151b1c01ee7817413a3c4de9dd6478785b81101df5522430058780207e790f612d78e5705ceed46b0ec075e7c1dc073b17b2b43d72535927bfd271e92e3c93638e40a9601dc2c1ab76d91a4103df657d911c829ee8a5f747f7642f5a915a5f40f630b43039c7d4bd2ad2b32129d94e5b2f03ad4a3d45577eb81f369c9e3e2a4f6a8e41acf8283be58425ea993b8e98eea6330556648618dad98fa255620d836d3c7f29b907895849286167c7181e2caf55c2c184a9a911f8e41cb042e2cd48b0544ea79fe2ef381ebc5b15e39a9b5c6d998faeaaa7773cfec084c0bfaed1bcab963a4ef3d94dbb3dfe724c040ce4d1e2ee7fc2da4b25127ce3a5df693fcf5a6ed1", "signature": "ea6582cc23e0460917f782d964e3bb6dcde0aeeac42cc14919d36ce78aa0afd98072f54c795fbfd7a41d99d70606c28a5dcf19be38a0ce2d09bb8f844c31bf00" }, { "secret_key": "43bff3cdd5307ed7d25cf96fdbba64ab1811c8bb934e2187ea7ffc018d85e0f2", "public_key": "00f1b5d3cac6e56ca5f894d4cdbf9bebd968d24d5effa5058b0e20bb0898f6f1", "message": "646f8b34182d5e602b51ca7329347c0e198cb747e4da0a6b80f3f6f9f336f6708d85cb429ab2d6bed35d5013129cd100142cddcee8635179021b3e24922b81aef13c1370286939d63d6b6a4195eda1d812ca518204768f87348c6889552c63d1372cde6a5e9daa7f8445ec8d6130a3f5aef0edeace010b6c7f0b9d24162a8d04454b81d48ea9097bd8df093459719ccb54aa10f51c246aa99c580beaf9c9c5bc60faf0ae5cec7f5137f6c5c144df45d12ee995adccf25a9db81b8558bdfb65830186e7b9d4eed9f6b4d732b1b5822d03eb017c0724f48f87baaae1045d6fdb125c9134064faf18dbed58d8fbaceacd4f097df9b342e5c4a5bc85b29597d4b640f1551c5b624ab21b48e94a9030049be1f05aa851d0827eaf8700dfe147fdcdeedbc98c4f15774f0120fb5970a2f8b21794340b628379a802b9f7c068b0df63193e510fc7b2af97ee38de47929785535528d350d88620610cfdb55d249e38fb73c8287113919ce33267d7db924e4919a44e6e29a90dbe3b7b0d3921163feb5ac105624ed852bece3538e99193300c893345699350a8f99e8c6a41095fc9fc08da07f75711f7df034406de14edd8e22a633a86e4a5a5c975ac5d34891cccfc8543771ffa080e0b45d65ab830a361ac4c426294d3685ea8c26039c71c90fc3fb512be9fc94807d76dbdaf8ffaa4fbf9849d68e8a57d30c4a0b9735c23f08ef2e284458467e15d665362cb646fde6937ecba53091264638357a722425bc62d1e30ec5f0dd8fea26b2ea4a8490035de43f274846fb0cf0209ec7437f3c3d0a560373d034e5fd79e25b6424d9b2c1761632b35a12132521827345c55e4e7142dd6fe94d620fe515c153e8395b5d130c744139b6a92efd37f22ba13fe4c095373550e2e4fcba0325b3ea3b9fe25cc7dd92cbf42e15f4554b77ac27a4a346382ff6100451508d602cf643f60b6ca4286356f21a3110d4e2c8a8962a780fcff439b3aa80499df270fc3e6cad8893348872f0f702f9390000c7f6e0627d2bbb7b7cef5c4da25dadfea8032e5023297a70a658e9ae73bddc3b227a1c11741133f012f0f48fe26446fa67e64720fc8dc97f30d0dd026f6dc2164ead857824a0a7aeb20f115d50d1b65dd5d82e09abe834e8ca88957e39984824955a1a13e3b94a00157186dcdc289e34b678c91cb2a1a", "signed": "a6b56b7686df1dc5f4ed544a4d97e67036195a32b22ecd5d31ea1730e6ed8f810d258b44c08ea45f032b937441b72cd0dc37556fd7874e9fe64f15765c521003646f8b34182d5e602b51ca7329347c0e198cb747e4da0a6b80f3f6f9f336f6708d85cb429ab2d6bed35d5013129cd100142cddcee8635179021b3e24922b81aef13c1370286939d63d6b6a4195eda1d812ca518204768f87348c6889552c63d1372cde6a5e9daa7f8445ec8d6130a3f5aef0edeace010b6c7f0b9d24162a8d04454b81d48ea9097bd8df093459719ccb54aa10f51c246aa99c580beaf9c9c5bc60faf0ae5cec7f5137f6c5c144df45d12ee995adccf25a9db81b8558bdfb65830186e7b9d4eed9f6b4d732b1b5822d03eb017c0724f48f87baaae1045d6fdb125c9134064faf18dbed58d8fbaceacd4f097df9b342e5c4a5bc85b29597d4b640f1551c5b624ab21b48e94a9030049be1f05aa851d0827eaf8700dfe147fdcdeedbc98c4f15774f0120fb5970a2f8b21794340b628379a802b9f7c068b0df63193e510fc7b2af97ee38de47929785535528d350d88620610cfdb55d249e38fb73c8287113919ce33267d7db924e4919a44e6e29a90dbe3b7b0d3921163feb5ac105624ed852bece3538e99193300c893345699350a8f99e8c6a41095fc9fc08da07f75711f7df034406de14edd8e22a633a86e4a5a5c975ac5d34891cccfc8543771ffa080e0b45d65ab830a361ac4c426294d3685ea8c26039c71c90fc3fb512be9fc94807d76dbdaf8ffaa4fbf9849d68e8a57d30c4a0b9735c23f08ef2e284458467e15d665362cb646fde6937ecba53091264638357a722425bc62d1e30ec5f0dd8fea26b2ea4a8490035de43f274846fb0cf0209ec7437f3c3d0a560373d034e5fd79e25b6424d9b2c1761632b35a12132521827345c55e4e7142dd6fe94d620fe515c153e8395b5d130c744139b6a92efd37f22ba13fe4c095373550e2e4fcba0325b3ea3b9fe25cc7dd92cbf42e15f4554b77ac27a4a346382ff6100451508d602cf643f60b6ca4286356f21a3110d4e2c8a8962a780fcff439b3aa80499df270fc3e6cad8893348872f0f702f9390000c7f6e0627d2bbb7b7cef5c4da25dadfea8032e5023297a70a658e9ae73bddc3b227a1c11741133f012f0f48fe26446fa67e64720fc8dc97f30d0dd026f6dc2164ead857824a0a7aeb20f115d50d1b65dd5d82e09abe834e8ca88957e39984824955a1a13e3b94a00157186dcdc289e34b678c91cb2a1a", "signature": "a6b56b7686df1dc5f4ed544a4d97e67036195a32b22ecd5d31ea1730e6ed8f810d258b44c08ea45f032b937441b72cd0dc37556fd7874e9fe64f15765c521003" }, { "secret_key": "063b9025e321e972d653a062be34f99365affdcc98ec9ff43ef422be0f804460", "public_key": "10d01a63012ac09956ba9ed61df35bb7afe3658bb3004852e47174bd07dd4de7", "message": "a7eed29652844ee0049bafb2cf63402971020d7e65c10b91ac5726eea86f40dbc53c3f0abedebaf6cc449b4fea48c015fe4d907b3e5505cff50a121819a2e4a8a296d5751015bbcd7ef6fb7c2727bb000be1342a7d14bca97904edfe8b18ddb63933418327a5af817e95bad74eb790203615d082e71493ead47ccc0901a2ca9f50133c44ef8508d51fb73c616f0147532245822dd102b337a1b2aae2efc72dca7a9419d598a6475233dc1a4ee0ec6d05da12a2b287cb77ffafdde2d0acc28199933e6621eec16ab4245170cf02da80d4922631a23272915165ad88722750035d2a0977bc791d14fb3d8cb02bc77f7c71be5242629a4c9a588dfdde9578494d8baa4e68f5194b8002c8e378a0e833b7c1a96981c4fb05e457ff48260b72493cbcb82ae11673d14cee85288f6370bd4bca9251a7e214c3eb79e7bb6fcebb16c9e056f29b6272743efa6fe8bfd25597ce86898ab3059eb0231c73b5305903fd1319bdf49e599d8bbcd74a8b9767308b61563ccbacd38fc50c83ab44ca759dc9b65b2a4b547c5097f220c1c88b2b0a48f65f91fe78b1501278e1e304de58b4c82a5c399981098a1784eb9042501859f2a93f317e41772fd52f972e51b07ed94d314e1d1af4ed82909a0bef671f54b55db7b70da1f718c8e648aedd6da64b05770526f12bc43f68b95548dac50809a687db97d73f06f47ed08831b60a28e982920632058f0e6c90c0187ff44564f81efd8fd93e327bc6d80b490e088b9a10036c80dcdad49d2be074fbba31e06f7180e5ad1c8823d60966a9ce15503ce60dd40e91eef2359d83d70d98401dde7be3c6b07e57d4e47d04217633d8e263ca348f81fbe9a4a62f45d77c843b6b1ad28466d9dafb1b910b348ed87c686cab292d480c191d187b404a9b1d132ba4e293d3ada99172acc121fe66b845b98b160c5823f601c7758fb26caee85701595b2d52caa2f5688aa2bf2f6c4bb637f8e00f49ab6c26bc6ad89e1367fd28e4917d250893a7b32d39660bde8db49f086fb739e56012c36bea0b26cf6d9357940b00d5a4528f9059aaf08669e5f46c995e60f887b5c4ab88ac7442ed01a14c6a42006baf1f343fefe3e4aca843a324e176b2fe7ec7883d1cbd068bc2fc962ffa60244f654c77ac5650817dc084465545a9230a74826b0c50eb85252a886ff2b1afeaf8", "signed": "85c81d6b0d8578fa58e13ab391001528b46a1d63a0327c7a4a04087fc668758aa65c01d5a150f935674ef307507e6f4c91e1fc3500b26f649beea87d27563704a7eed29652844ee0049bafb2cf63402971020d7e65c10b91ac5726eea86f40dbc53c3f0abedebaf6cc449b4fea48c015fe4d907b3e5505cff50a121819a2e4a8a296d5751015bbcd7ef6fb7c2727bb000be1342a7d14bca97904edfe8b18ddb63933418327a5af817e95bad74eb790203615d082e71493ead47ccc0901a2ca9f50133c44ef8508d51fb73c616f0147532245822dd102b337a1b2aae2efc72dca7a9419d598a6475233dc1a4ee0ec6d05da12a2b287cb77ffafdde2d0acc28199933e6621eec16ab4245170cf02da80d4922631a23272915165ad88722750035d2a0977bc791d14fb3d8cb02bc77f7c71be5242629a4c9a588dfdde9578494d8baa4e68f5194b8002c8e378a0e833b7c1a96981c4fb05e457ff48260b72493cbcb82ae11673d14cee85288f6370bd4bca9251a7e214c3eb79e7bb6fcebb16c9e056f29b6272743efa6fe8bfd25597ce86898ab3059eb0231c73b5305903fd1319bdf49e599d8bbcd74a8b9767308b61563ccbacd38fc50c83ab44ca759dc9b65b2a4b547c5097f220c1c88b2b0a48f65f91fe78b1501278e1e304de58b4c82a5c399981098a1784eb9042501859f2a93f317e41772fd52f972e51b07ed94d314e1d1af4ed82909a0bef671f54b55db7b70da1f718c8e648aedd6da64b05770526f12bc43f68b95548dac50809a687db97d73f06f47ed08831b60a28e982920632058f0e6c90c0187ff44564f81efd8fd93e327bc6d80b490e088b9a10036c80dcdad49d2be074fbba31e06f7180e5ad1c8823d60966a9ce15503ce60dd40e91eef2359d83d70d98401dde7be3c6b07e57d4e47d04217633d8e263ca348f81fbe9a4a62f45d77c843b6b1ad28466d9dafb1b910b348ed87c686cab292d480c191d187b404a9b1d132ba4e293d3ada99172acc121fe66b845b98b160c5823f601c7758fb26caee85701595b2d52caa2f5688aa2bf2f6c4bb637f8e00f49ab6c26bc6ad89e1367fd28e4917d250893a7b32d39660bde8db49f086fb739e56012c36bea0b26cf6d9357940b00d5a4528f9059aaf08669e5f46c995e60f887b5c4ab88ac7442ed01a14c6a42006baf1f343fefe3e4aca843a324e176b2fe7ec7883d1cbd068bc2fc962ffa60244f654c77ac5650817dc084465545a9230a74826b0c50eb85252a886ff2b1afeaf8", "signature": "85c81d6b0d8578fa58e13ab391001528b46a1d63a0327c7a4a04087fc668758aa65c01d5a150f935674ef307507e6f4c91e1fc3500b26f649beea87d27563704" }, { "secret_key": "883cc1381757b0fe0455b77bc9cd0dd464d2b4bf0c7a3c0c2dc775fb78aa3732", "public_key": "83a8b669ccd01245ce3b818dcb1b588f86535850e6c710c79217fe439824f3fa", "message": "ffec293d12ea636ca4c4a0a5e2db15342639c476674d2ebdab4aefd4046b5ddb56aeb210c119afdfb8a89128a34f6d77f261edea0772a2f8db140a2640fd8ecadb0b4792169b6b2810aee2c5cd835288bff493bcebeeea28a7a248c36116540fa71736d66b0a475b5fa92c0d46002fca7a1e69d1b59e81a3a6d4f339769daeb20b5f9d75c4c28f692132d28d3c564c09fe3dcca0359c3c63ec377a33f9ee874d8a789d77c96ac05fdf3ab38b2c8274a902ef8bb7f467fc7e073c77b1db5fc8ef966c120c4dae3fb7f5b74abb990166c812a525d123f76ed512125080a1534f3d8bdccc541fc97590287546096fc880bfcfdd00e65c0ebf4a09fd6476ce1b7c8faaa5a1cc2786719a30d8255811184752a88b08ac9f0ff1d6262f2586940afe1fe45e0b563448a55f3030e4c39c1f3f86a733670380eab088e393de09d1f508d2fbcafc649aeae6b8c30e329ec3fd2829be6db0ab8e637ea1095bdc3df3acc23d3cf705a9542c19e59092ec413a4e2bd5ded28cd34ddb3d32949aa487f1c337d6979cf512622dbfb7da1cbb1c7e5abeea7009e2943ffba2252e1d86eca9d6d5c246cd2e134a3e5dad37efef71ce397adafbd9e72b3f9a86ff0f5d812c46225bebd0703bc5cce9c64582008f7e558c40a3b3522096d1aa2b61bc90cd88c6285d942087d8a4665a0e64d3572f74689b4f24ef400d741b57140613471444decc654af0ffb2edfdf9fdd075098190b34cde28dd166872c6086567a68761cef25da40bd4c3d34fddd72ee565b0b937678ee84349d1160f5f0705f895d0f141ce8f51a1e4fd2dc4704b527a4025a939cb2bb78857eb18d78872edc9ee70e60b2a42700a198f4fff6c31925168be077dc23c322abbca97361fecaa3fcb196e656c128f3982fe11e551a4a0885da60d397d0e40d0d897262f1b4b672f78a2d2adfcdd6e1525c26e7195fb9ac606bb1ba4a9890803b4bd84346ae8d8c7196c90aeccb296a4c3eb4efacbfcb62e383b8a494ac723562d0d8c379187a92e3bda6b1569476aed21aed7a056b4a5826744017cc0060b4d55fa8772b5b1c15f5748ad7298005aecbcbd90a3e5c6159a8674abbba37914415002b5a6ef5df3c649426ea1275a01d80adf490ac546062d93999a6dccacb96a0904ad33d90576dc6a21b672e8ffb06613fb3f14e6cbdde88c2437c9", "signed": "c7cfd5c9fe930d15a11ebb34e3431f489da010eb193edbfa6f23d5d14dd8feabd7880d2d5a5600d38546ce3bc64a86291a1ce31f272ff020df8cb6a0fd4d3a0dffec293d12ea636ca4c4a0a5e2db15342639c476674d2ebdab4aefd4046b5ddb56aeb210c119afdfb8a89128a34f6d77f261edea0772a2f8db140a2640fd8ecadb0b4792169b6b2810aee2c5cd835288bff493bcebeeea28a7a248c36116540fa71736d66b0a475b5fa92c0d46002fca7a1e69d1b59e81a3a6d4f339769daeb20b5f9d75c4c28f692132d28d3c564c09fe3dcca0359c3c63ec377a33f9ee874d8a789d77c96ac05fdf3ab38b2c8274a902ef8bb7f467fc7e073c77b1db5fc8ef966c120c4dae3fb7f5b74abb990166c812a525d123f76ed512125080a1534f3d8bdccc541fc97590287546096fc880bfcfdd00e65c0ebf4a09fd6476ce1b7c8faaa5a1cc2786719a30d8255811184752a88b08ac9f0ff1d6262f2586940afe1fe45e0b563448a55f3030e4c39c1f3f86a733670380eab088e393de09d1f508d2fbcafc649aeae6b8c30e329ec3fd2829be6db0ab8e637ea1095bdc3df3acc23d3cf705a9542c19e59092ec413a4e2bd5ded28cd34ddb3d32949aa487f1c337d6979cf512622dbfb7da1cbb1c7e5abeea7009e2943ffba2252e1d86eca9d6d5c246cd2e134a3e5dad37efef71ce397adafbd9e72b3f9a86ff0f5d812c46225bebd0703bc5cce9c64582008f7e558c40a3b3522096d1aa2b61bc90cd88c6285d942087d8a4665a0e64d3572f74689b4f24ef400d741b57140613471444decc654af0ffb2edfdf9fdd075098190b34cde28dd166872c6086567a68761cef25da40bd4c3d34fddd72ee565b0b937678ee84349d1160f5f0705f895d0f141ce8f51a1e4fd2dc4704b527a4025a939cb2bb78857eb18d78872edc9ee70e60b2a42700a198f4fff6c31925168be077dc23c322abbca97361fecaa3fcb196e656c128f3982fe11e551a4a0885da60d397d0e40d0d897262f1b4b672f78a2d2adfcdd6e1525c26e7195fb9ac606bb1ba4a9890803b4bd84346ae8d8c7196c90aeccb296a4c3eb4efacbfcb62e383b8a494ac723562d0d8c379187a92e3bda6b1569476aed21aed7a056b4a5826744017cc0060b4d55fa8772b5b1c15f5748ad7298005aecbcbd90a3e5c6159a8674abbba37914415002b5a6ef5df3c649426ea1275a01d80adf490ac546062d93999a6dccacb96a0904ad33d90576dc6a21b672e8ffb06613fb3f14e6cbdde88c2437c9", "signature": "c7cfd5c9fe930d15a11ebb34e3431f489da010eb193edbfa6f23d5d14dd8feabd7880d2d5a5600d38546ce3bc64a86291a1ce31f272ff020df8cb6a0fd4d3a0d" }, { "secret_key": "5e40a7aabbb0830a9ab0fd79690ee0433901c6cb0676abe4bba06f5bbe58fac2", "public_key": "4d4f28fe09c4aabfca01ef6ee7fd6372fb62db61aaee827c43fd1a6d1c259032", "message": "fd4ec8b34fc6b743813f59e2fd1fefa870f5a970e2eb7516ef7c306f4b823ffee92d601f765d79ca146aba8bc6e79844559935cddc242649c059ecf2db84fdc219366688a88fc25b851c3661e51988c2bf73bb8e3dc16d22415ab1a7b35579daac7325e319157d7da5fee87c93a4dfcbafc92fba7e17cc68e3903733c6c801572d907320b2feb51710e856a1f76f85a7ee1a11e62d2e45a352938dd8cfc2bccb902dea444faaae6d84c5f391e10aef76928a45153db6cd25a2bf353d80d97bf4b3808605e89800d29840ea60978d9ec9b2c302749888f9debc84dd1e2a79aa0b6ba02a039193081bdbff0599a14d918c0c8deac4f60b6e99474ab53011741034fe2a20cff4e0f023424c8e5797768ad53df6d01a24011fa90f0bb1d5069cdb36b450f433110c2c56f34a1de4260914cd4696b14a09c0268b2ae2e98e6b4e992b9125f878f1ac09823170628388f0f6e256259ca786bbe144884cb298cc043d02f5c3dc684f787faf16c10fdd8437a8c3097463bdb99b78030f9474fc5c9951dc7526490586fe1c2db05411341460239d5e8bc53065902b95fba282c27665e869a19dae84606d1726675155d38039b9e55db4d5ceec95cd6d87f85e99dde54a04761e6eada6619da895b654fe3845e8a60f3a3b32483d6d27978af54502b220e478db78cff77a9c97fb79fb5acf56289f381acb10de64c3f23842b12bf5f1b283bd25d48d09128fb55ddae255beb7c66a74cf6f0695a4f828cb29e4afdbb3b42a235d4fdb66b963ac8f68e82b00a1c4500863296247178cfdef803bb7b114f0c03276f671669a087d9228a37ae7b99b061549c1cf8ec17246ea1ee03dbc88bf426416d586572ff10a3145606f2784e4357be4edeec6c3a7bf11bb5b0e90cf50edaf891e51d26357bfc853ce23b299155c82c1031dfa64074d72a09d29720ead6ebbbf75d5738e32cda6b6466a8def6b50a1ed9b865a9a88a08018acb501a4de9db54d0522ce9cec7a06bd9a5f86b0b46c07bf3e7f5a426ff6b4bbe1e00313a5ac2719a959ed44ee0a44bd97da6db2cb971bd68334908949ed850fbf73d0e02049da181cce9c2d9ca1b624c8d87cf904eb821dc7959295da5777920660b43ccc25cd389f157f67fa0390feac97a752c1ac204c21df56bb0f4fc01641b480af2b89b5d16d4a0bcb0a50b82b0e0484", "signed": "597672ab8d3a60de5456fcc9c38253f5f37b80e74a007c9f6db909d27d0ead162789244994f35b80d61be199c417c7ea901b98cc63fe3c50fc3c6338490fa206fd4ec8b34fc6b743813f59e2fd1fefa870f5a970e2eb7516ef7c306f4b823ffee92d601f765d79ca146aba8bc6e79844559935cddc242649c059ecf2db84fdc219366688a88fc25b851c3661e51988c2bf73bb8e3dc16d22415ab1a7b35579daac7325e319157d7da5fee87c93a4dfcbafc92fba7e17cc68e3903733c6c801572d907320b2feb51710e856a1f76f85a7ee1a11e62d2e45a352938dd8cfc2bccb902dea444faaae6d84c5f391e10aef76928a45153db6cd25a2bf353d80d97bf4b3808605e89800d29840ea60978d9ec9b2c302749888f9debc84dd1e2a79aa0b6ba02a039193081bdbff0599a14d918c0c8deac4f60b6e99474ab53011741034fe2a20cff4e0f023424c8e5797768ad53df6d01a24011fa90f0bb1d5069cdb36b450f433110c2c56f34a1de4260914cd4696b14a09c0268b2ae2e98e6b4e992b9125f878f1ac09823170628388f0f6e256259ca786bbe144884cb298cc043d02f5c3dc684f787faf16c10fdd8437a8c3097463bdb99b78030f9474fc5c9951dc7526490586fe1c2db05411341460239d5e8bc53065902b95fba282c27665e869a19dae84606d1726675155d38039b9e55db4d5ceec95cd6d87f85e99dde54a04761e6eada6619da895b654fe3845e8a60f3a3b32483d6d27978af54502b220e478db78cff77a9c97fb79fb5acf56289f381acb10de64c3f23842b12bf5f1b283bd25d48d09128fb55ddae255beb7c66a74cf6f0695a4f828cb29e4afdbb3b42a235d4fdb66b963ac8f68e82b00a1c4500863296247178cfdef803bb7b114f0c03276f671669a087d9228a37ae7b99b061549c1cf8ec17246ea1ee03dbc88bf426416d586572ff10a3145606f2784e4357be4edeec6c3a7bf11bb5b0e90cf50edaf891e51d26357bfc853ce23b299155c82c1031dfa64074d72a09d29720ead6ebbbf75d5738e32cda6b6466a8def6b50a1ed9b865a9a88a08018acb501a4de9db54d0522ce9cec7a06bd9a5f86b0b46c07bf3e7f5a426ff6b4bbe1e00313a5ac2719a959ed44ee0a44bd97da6db2cb971bd68334908949ed850fbf73d0e02049da181cce9c2d9ca1b624c8d87cf904eb821dc7959295da5777920660b43ccc25cd389f157f67fa0390feac97a752c1ac204c21df56bb0f4fc01641b480af2b89b5d16d4a0bcb0a50b82b0e0484", "signature": "597672ab8d3a60de5456fcc9c38253f5f37b80e74a007c9f6db909d27d0ead162789244994f35b80d61be199c417c7ea901b98cc63fe3c50fc3c6338490fa206" }, { "secret_key": "3a34136a973480d97006dc279358e6606293d8cbc1a44ee55233af2b5264b90c", "public_key": "e5effd921be8eec530752fccc576ef0d9bcde4b32cc649d3f7954717562860cc", "message": "981c8e1090e396951b072ef8497062020897bf7dd7ad505b4d6dc11b3e1dbcb0da249984a140e164fc2e02b31da39846554aa8905bc8b3df8a76bf60eb5ffcf22c97b671227d249071da8ff6bba75b2f7668cec19a89e6475a12463dabf368b3ca2445bb3035cc00fae85b7072fbcf595401755b8051e6097065ae429f18eeb13ffa6dde59df6f3c206bfd9ce1f8a800c8590a4021d160f66d6740a369ae835617538b5890231f13c5667baf510a606bdaa84b8d10ee6015e12a4c1ec0bd0421a294c51cf63b5d1f058e1153dc425d10cee8b1b084d6c29347e96f0f31b839607d078b79a90ca3d1f063807a463b7c32f45a534498d71d47edc3b17a4dff27fedcffab301f34f1a64c0278a53589349a233af30b1ec1ae410f7b1630c7145ca42c9663f512e8a578267dc95e83289c17032e09782e2fe8e16efb87f03ca03b1195614f89961ca3939d3bdf737221a22d7a18ec30fc126d0ca663e88d6060d04c6a44e5616e556e07d6d4a847f1711cf43717810c70aa4be730278b3bd6555c954dc6edb09db08f0e211803596280f3c7868d2342cc2308eaae4da1913514664b1db962e99c8a8cffe57931f5dfcddbc1cbb36ce1c842e2dddeadfd7e7d0a5048cdcb961b14f35f435e73a683c8ce25c816812566fdf817e0d336ae0bd247328512b2a8567632bf20553d9bd6fe157f220ffb0b46ebae89a70459728a57eed1796256f1bd50b6d547ea3e25fa5913d389a22583e915eb49de35a97b5acc521db0d005c29575e16611a755f21a3a5a82a20aa900a707ce36825492c3ca15395f1700b4afab94daa7a02f1453b1f9a6bd36efb204d928ee1f4dcc860f3a859badc006fb305fa123d4c79b23a20e32295d040a7f8f6caca25d83f71c62e3af7836ef76b93a83d3c3b493af141753da19e4cdcba56617271034b4f4f394c7c6b7d79666f3afb692244f061c69a8881d1b52b8849fb534990ac2391909471ebbb728e29cd20f422354c4309717ebff3efd1833370806d5bfb53ca2da316dacb50ab7fb739673235a1dc53aa8893072d5b91c9f6db83fc4ea41d1eef49ac28afc1ced8f361890ab9f779d193082831cb8c42fb2792bee3b26296b6295eb78a8d853117661624e11f7f57afd6085a7b9123679fdaca1cf2a78d380bc4c360aa7c3cbfde0c0091fe53e2219c070f2f02f1483", "signed": "425f272212835755adcc0522c6f6e05f68008a3be9ba5974e420c4c5cb56e6c55dec0de347b16caef8bd33b71b44c8357d05b6321d7bf493d25861db487bd603981c8e1090e396951b072ef8497062020897bf7dd7ad505b4d6dc11b3e1dbcb0da249984a140e164fc2e02b31da39846554aa8905bc8b3df8a76bf60eb5ffcf22c97b671227d249071da8ff6bba75b2f7668cec19a89e6475a12463dabf368b3ca2445bb3035cc00fae85b7072fbcf595401755b8051e6097065ae429f18eeb13ffa6dde59df6f3c206bfd9ce1f8a800c8590a4021d160f66d6740a369ae835617538b5890231f13c5667baf510a606bdaa84b8d10ee6015e12a4c1ec0bd0421a294c51cf63b5d1f058e1153dc425d10cee8b1b084d6c29347e96f0f31b839607d078b79a90ca3d1f063807a463b7c32f45a534498d71d47edc3b17a4dff27fedcffab301f34f1a64c0278a53589349a233af30b1ec1ae410f7b1630c7145ca42c9663f512e8a578267dc95e83289c17032e09782e2fe8e16efb87f03ca03b1195614f89961ca3939d3bdf737221a22d7a18ec30fc126d0ca663e88d6060d04c6a44e5616e556e07d6d4a847f1711cf43717810c70aa4be730278b3bd6555c954dc6edb09db08f0e211803596280f3c7868d2342cc2308eaae4da1913514664b1db962e99c8a8cffe57931f5dfcddbc1cbb36ce1c842e2dddeadfd7e7d0a5048cdcb961b14f35f435e73a683c8ce25c816812566fdf817e0d336ae0bd247328512b2a8567632bf20553d9bd6fe157f220ffb0b46ebae89a70459728a57eed1796256f1bd50b6d547ea3e25fa5913d389a22583e915eb49de35a97b5acc521db0d005c29575e16611a755f21a3a5a82a20aa900a707ce36825492c3ca15395f1700b4afab94daa7a02f1453b1f9a6bd36efb204d928ee1f4dcc860f3a859badc006fb305fa123d4c79b23a20e32295d040a7f8f6caca25d83f71c62e3af7836ef76b93a83d3c3b493af141753da19e4cdcba56617271034b4f4f394c7c6b7d79666f3afb692244f061c69a8881d1b52b8849fb534990ac2391909471ebbb728e29cd20f422354c4309717ebff3efd1833370806d5bfb53ca2da316dacb50ab7fb739673235a1dc53aa8893072d5b91c9f6db83fc4ea41d1eef49ac28afc1ced8f361890ab9f779d193082831cb8c42fb2792bee3b26296b6295eb78a8d853117661624e11f7f57afd6085a7b9123679fdaca1cf2a78d380bc4c360aa7c3cbfde0c0091fe53e2219c070f2f02f1483", "signature": "425f272212835755adcc0522c6f6e05f68008a3be9ba5974e420c4c5cb56e6c55dec0de347b16caef8bd33b71b44c8357d05b6321d7bf493d25861db487bd603" }, { "secret_key": "cf33e7974d8f0bf899ac5b834c7cf96479ce1cfd453af07f970527f36aa85c1f", "public_key": "578f60338b1f041a97d319fecfa30cfaed369303cc00b3ec8c5c99041158e20c", "message": "e813144bd116f6ac36389217b5171a902f06b7dd7b144df4f9091553c7c7835753a296cbb0d7fab99cef77b61f34a04c8af04e7d5d1f961302de89e2005f299f5a4aa17924617d006693937745539c3048ee36b8c23afec0af9feaa0066c8af8e0a7f09093498210f6d8dcc0aaada5668786910ff7c5b348d4ccd6eeeffa3acd1816d9011a4c4025f6c2fd2c020a10593627520d4dd99e07c62d2dbebe84139e1c7d867c093574fa601e4ee307ac926e5d36b62d7ed84a261588b7e2883c7926612b4cc67e2bb72544a10d6b4929c88ef6c47c2625d2f6816bd73c3bae89d2e0c86171ac4bd080ae555d62740d1d2a761ced86dfc328ecc27ee3db6d404108ef4e0b64906253b4c0a771adefedc8a2c5b53c425a70cd6f63956f7a0a619fdfbfd00aa078418eb4652f8bc6f3c253beec9838b77f9cbe2ef2b8055c5773539e356bd8192606ec101e3f6058b1dd08a68fdbc549dfe6b7725dc2549e8e3f90dc5be3ccfb0a38baf9377cb3f6501d2e15ccb3556a895ccb23f0b6df9fe59311cff55374c3fb3a32981ca26ab426f3663d04e3167e53a537b7589a9fb73679090a205532c132906634334a7e8749793f8c593f3fd6278ce0050383487f3b245067af94881aa1ae968d0caeba5fa5c7be5f4e4b7257518695d89bccdec507b967b4fd64b6893b3ee7803c1d36ea8a02fc426f9afc8e9f24321527ec9844bc3c54a0f7667e034300bbb4fb020f6d5bb954e7b5a3a706a4939db33c154892643476a291d47dc1e6f72ce91d136f11db26b9c9ba736e40df0a15c1a89149996b251dd988b39004e6ef41bdc061db580b7b74de2a651810bd891753b97386d7f8cbdbb6ec386fa2c342f5ef20e6e3a8bb4d5149a7d4de1224dff1d172c87570f776d5ef45959be0938ad79f5d3395cb2721627122887bd7a8983b647797bd41d882641c81431ce8d9b3067adec4cde926c51313f0cf84c5292562dd4908642dd245288484c5568a787d0ced36a352f032da4f7e4de06b11473f650eec65dda99639af2d42d84ee230f4f83623d9c9aaa3b16bda10ddaad25af5c1c10f81c8c51c811a3aa3e3db58a7025e4380e285da474a61ba59173ff042a46a79ab184b070108416f9d6158cf96d0e6db447614a0d9089ebb6aee4ef107be4593d71e79f6798668a740ae4bac5ac7594ecbd5dc82e7d0f9cb", "signed": "97a5b6d268a5b4175fb06f1f37d0a633519296edc30011c954d8f0b9bbe2641800396c4b35d4b0d7d2a1d17cbbebdc55a809462d6cc19a6fadbe1bd1bae88a01e813144bd116f6ac36389217b5171a902f06b7dd7b144df4f9091553c7c7835753a296cbb0d7fab99cef77b61f34a04c8af04e7d5d1f961302de89e2005f299f5a4aa17924617d006693937745539c3048ee36b8c23afec0af9feaa0066c8af8e0a7f09093498210f6d8dcc0aaada5668786910ff7c5b348d4ccd6eeeffa3acd1816d9011a4c4025f6c2fd2c020a10593627520d4dd99e07c62d2dbebe84139e1c7d867c093574fa601e4ee307ac926e5d36b62d7ed84a261588b7e2883c7926612b4cc67e2bb72544a10d6b4929c88ef6c47c2625d2f6816bd73c3bae89d2e0c86171ac4bd080ae555d62740d1d2a761ced86dfc328ecc27ee3db6d404108ef4e0b64906253b4c0a771adefedc8a2c5b53c425a70cd6f63956f7a0a619fdfbfd00aa078418eb4652f8bc6f3c253beec9838b77f9cbe2ef2b8055c5773539e356bd8192606ec101e3f6058b1dd08a68fdbc549dfe6b7725dc2549e8e3f90dc5be3ccfb0a38baf9377cb3f6501d2e15ccb3556a895ccb23f0b6df9fe59311cff55374c3fb3a32981ca26ab426f3663d04e3167e53a537b7589a9fb73679090a205532c132906634334a7e8749793f8c593f3fd6278ce0050383487f3b245067af94881aa1ae968d0caeba5fa5c7be5f4e4b7257518695d89bccdec507b967b4fd64b6893b3ee7803c1d36ea8a02fc426f9afc8e9f24321527ec9844bc3c54a0f7667e034300bbb4fb020f6d5bb954e7b5a3a706a4939db33c154892643476a291d47dc1e6f72ce91d136f11db26b9c9ba736e40df0a15c1a89149996b251dd988b39004e6ef41bdc061db580b7b74de2a651810bd891753b97386d7f8cbdbb6ec386fa2c342f5ef20e6e3a8bb4d5149a7d4de1224dff1d172c87570f776d5ef45959be0938ad79f5d3395cb2721627122887bd7a8983b647797bd41d882641c81431ce8d9b3067adec4cde926c51313f0cf84c5292562dd4908642dd245288484c5568a787d0ced36a352f032da4f7e4de06b11473f650eec65dda99639af2d42d84ee230f4f83623d9c9aaa3b16bda10ddaad25af5c1c10f81c8c51c811a3aa3e3db58a7025e4380e285da474a61ba59173ff042a46a79ab184b070108416f9d6158cf96d0e6db447614a0d9089ebb6aee4ef107be4593d71e79f6798668a740ae4bac5ac7594ecbd5dc82e7d0f9cb", "signature": "97a5b6d268a5b4175fb06f1f37d0a633519296edc30011c954d8f0b9bbe2641800396c4b35d4b0d7d2a1d17cbbebdc55a809462d6cc19a6fadbe1bd1bae88a01" }, { "secret_key": "51b1ad0ffc21497a33dbdb85ea2bc1ce3d0c2d95d9461a390973fee377fc75f4", "public_key": "bad0412575d3801301edee6bc0f276e787357b4122f52de981885851884249cb", "message": "7882e86ef3402f6dbc65cce8315b39765faa4b1fc876fad5f8220cb22a7df2e3580eab3a7e8fa7fbb6b59482ca0e364a131396df792a3241a060e44143b6767493c6bf75f187a9643aa11e11eba7b0a80f0a68b9f1b79f75b66cc59d9da77955fd7e8799f99d6eb08f90d318f4efcbfe71159b10a83aa5fd69bb75336f5df296ea060a426c9545df940bc1454efc1f9dc965f1f22d947303fb8ec12407fff6b1dbe47e3421c31764fd90c83ac711d19926e229a064c61fe3676af300a1716fabe4e3842264adb32e0d9c9f5d4a65d0d7b5c3770d737ee13cbed21d7a1da36aaf7ec0f36fcc476f659681e5160a5a1f49e759b9d0fcd4fdb854eccd99172a47d2c4efbe0b3757631df1bae175f0fa74dd048bb6a5fed8430284349da3d67df2a6f7e8269bc79fb2c5d5ed6084e9076f455ab638919046369a446d57fcada7011cc771bf6d874a8e5d23c687747de41dd04bffc717d6128183846eb594b3cb1c1a8aa04f0d7eba53af39cb1d4e6fecf3113bd8422416f4c44037aeee9e0fdc517c48731fd04ee9c99f5dbca3d574509d7baf3288f2c230a02d1703bdb1611cde2a766dac193de167443d20090dc34d29277a86b1e998b245645117e5111f12f14606c55446dd912d3475c19876e19ac536d317876c4b0a2e0f98616129a5683732a42317c5e809dca956b2abb484ada810a15c81cc8562b555da9458f9b44338490230c7404f3d48611f84127e73e277d88c62212d2a3a351fc67665b18d77216230632cbc781288e15cebf3ec33a7205eb22b9abe4cdbc7ddbaaa53640875eb763f522c36cfff2eb23ee586d775286259fa94a44fa7ec015096a2a446b6732b80024267fe3d5d39d1c48509b3ecaa2e24e54de4d61c097b70f753b5af9a6db6f975d25f4f83d06f879e17ef7c509a541444ba3eb6867838090e22dafdbb0eb3b0565be1579ceecded20f544256c7c4ede3b62843c65b0466be6b7e27305b963ca914e3b7d21736118edb3d658d9d76f509db3b9ca2eae28964a4b3b3c384a81a4890ee96fbe934a6f2aec8eeb6cfe59ac9d3bbc1646ba32a1142fee59fed6fb7bbc0498cc27dead413b7b4351ec206343c0ab89fcf87243b1ab450e58ff11a1140a383f196aa3976ce17cf34530f049a1de90e31753cd85e7f1fd5cf20426c9379feb8c31b4bfec35ea5a78953d75c5cf", "signed": "cfb65b6ff0377cef511fd97b90c3ecb80833f142a7cf5022ced30b3fb7862086d01339b8866a238cb070276e1944b5fe32cc409947cb91deb1432c291b60fb0d7882e86ef3402f6dbc65cce8315b39765faa4b1fc876fad5f8220cb22a7df2e3580eab3a7e8fa7fbb6b59482ca0e364a131396df792a3241a060e44143b6767493c6bf75f187a9643aa11e11eba7b0a80f0a68b9f1b79f75b66cc59d9da77955fd7e8799f99d6eb08f90d318f4efcbfe71159b10a83aa5fd69bb75336f5df296ea060a426c9545df940bc1454efc1f9dc965f1f22d947303fb8ec12407fff6b1dbe47e3421c31764fd90c83ac711d19926e229a064c61fe3676af300a1716fabe4e3842264adb32e0d9c9f5d4a65d0d7b5c3770d737ee13cbed21d7a1da36aaf7ec0f36fcc476f659681e5160a5a1f49e759b9d0fcd4fdb854eccd99172a47d2c4efbe0b3757631df1bae175f0fa74dd048bb6a5fed8430284349da3d67df2a6f7e8269bc79fb2c5d5ed6084e9076f455ab638919046369a446d57fcada7011cc771bf6d874a8e5d23c687747de41dd04bffc717d6128183846eb594b3cb1c1a8aa04f0d7eba53af39cb1d4e6fecf3113bd8422416f4c44037aeee9e0fdc517c48731fd04ee9c99f5dbca3d574509d7baf3288f2c230a02d1703bdb1611cde2a766dac193de167443d20090dc34d29277a86b1e998b245645117e5111f12f14606c55446dd912d3475c19876e19ac536d317876c4b0a2e0f98616129a5683732a42317c5e809dca956b2abb484ada810a15c81cc8562b555da9458f9b44338490230c7404f3d48611f84127e73e277d88c62212d2a3a351fc67665b18d77216230632cbc781288e15cebf3ec33a7205eb22b9abe4cdbc7ddbaaa53640875eb763f522c36cfff2eb23ee586d775286259fa94a44fa7ec015096a2a446b6732b80024267fe3d5d39d1c48509b3ecaa2e24e54de4d61c097b70f753b5af9a6db6f975d25f4f83d06f879e17ef7c509a541444ba3eb6867838090e22dafdbb0eb3b0565be1579ceecded20f544256c7c4ede3b62843c65b0466be6b7e27305b963ca914e3b7d21736118edb3d658d9d76f509db3b9ca2eae28964a4b3b3c384a81a4890ee96fbe934a6f2aec8eeb6cfe59ac9d3bbc1646ba32a1142fee59fed6fb7bbc0498cc27dead413b7b4351ec206343c0ab89fcf87243b1ab450e58ff11a1140a383f196aa3976ce17cf34530f049a1de90e31753cd85e7f1fd5cf20426c9379feb8c31b4bfec35ea5a78953d75c5cf", "signature": "cfb65b6ff0377cef511fd97b90c3ecb80833f142a7cf5022ced30b3fb7862086d01339b8866a238cb070276e1944b5fe32cc409947cb91deb1432c291b60fb0d" }, { "secret_key": "fa2f461ce8c7126218c47c91569e8799797c83368fc842b6e1c22fd52aec70bf", "public_key": "6b89b23f1e11a75a53f992f6ca5775008c6e9e7e49c0d8510b0e8369b7a20bcc", "message": "799b39802a1827e45c4112fee026034c0e598affce2c550c193fee73f1df8c30c8d3873340088ce859de3471e9d057686c829b5408795e08b3dc7aa3b637c7de9d2172ad0333c1bea861a6232f47f05a10bf5df80815a271256e37e808a0e62f1f07d9e10ebb947d3efabf8a28fa9dccd9a1d599f5fd6165508efd679cf356015058bf4b34118f83aa3e5bc2ce19eca84f718398adbc0a5276cf9d8caffc27e3e6abbe345b0e9ecf89c6771b0e75d408ba2fbb90fcfd70c53f2e4d52ba54d9784cf71c349ef6f14ae4970def6efb5f30e984d6016a196deaec7e04b47619c48bf49dc02f7fef3e13b756174e90d05fcbdd5e13f0e434efd5421b091d517900ed0d5785968862b4bfe5093ab67217180d97554ccd9cc31429326cab42f3f8398060c19db488b5d1c80b29090afd1c6bac3642264800211bc278fcb99dae9dbf49daf1b24ab569dcbb87d4d3547335e35db98400cdfce6790682e93600220ec499245fa4ee15d843831b56cc26418025bf87001605c6691ca6bd40a4e248c309801b76a795ede8ad5308bcb6d1754ab3371f0003bb8c4e4e471954e28b1e9866379f82e1fbacb79d50adddad5b9778b558cddbb0038a5ff3d5c9557b965de3a7082c45a8ecf3e7721eb690b6c71f3d8975d5300f67c4dc4a736846e4ccd26f93463d5bc6f46edc488664be9696be12b02dd104d10cc6b1d82e8117811214a6487d17367e395ade2ef6b26a1783a7e2f245213bc03a755df3ee8ef9f1eff972c6919065cb7b756678d4ddfd193eddc0b42e8689613643146d7428ca37bf31bdf14e31867858f39d2323709eb3b7d7f4e397022378424bdee9bcb74e9d5dfd371f4734998fc18df4cdfb4b5c21c2e50f8d6c15bc14bf4fda6ceb9d8082cae432dfc98bfb3ecd16b8d74f830b642b042875e921b054bd1aaa581f60d718df669f56dc2f10d478997722162e83940e61a1b6e42df2a4a3a7cbcdd611ce96cbcfb5a95cc473231ca13c0609d0ce1ae5ddb5466d6d65eefad9daf2a36901bcc945847da1ed6e2e240e848b231b7d0e1acd06543ec93e768e59985d7e96c8c31fcd1210f0964271e21877525cb134bc3536257dbb11d30a3c4f949fb82ae0c31ccdfe41943251e50aa4355392ac309ef60fc17432a2be4bdb2fcb28607cc45a52b60016bb1d2e23972ff2c2a247d725585b1ef2b15f", "signed": "84f79d9e8f30e5bb6362239714556b04736fa44465cabaad23beaf5a99fc451ad4ae5a18c7f6f964fa41039216018ec5a2accae1075a6bb3a6ecbc1fca02b904799b39802a1827e45c4112fee026034c0e598affce2c550c193fee73f1df8c30c8d3873340088ce859de3471e9d057686c829b5408795e08b3dc7aa3b637c7de9d2172ad0333c1bea861a6232f47f05a10bf5df80815a271256e37e808a0e62f1f07d9e10ebb947d3efabf8a28fa9dccd9a1d599f5fd6165508efd679cf356015058bf4b34118f83aa3e5bc2ce19eca84f718398adbc0a5276cf9d8caffc27e3e6abbe345b0e9ecf89c6771b0e75d408ba2fbb90fcfd70c53f2e4d52ba54d9784cf71c349ef6f14ae4970def6efb5f30e984d6016a196deaec7e04b47619c48bf49dc02f7fef3e13b756174e90d05fcbdd5e13f0e434efd5421b091d517900ed0d5785968862b4bfe5093ab67217180d97554ccd9cc31429326cab42f3f8398060c19db488b5d1c80b29090afd1c6bac3642264800211bc278fcb99dae9dbf49daf1b24ab569dcbb87d4d3547335e35db98400cdfce6790682e93600220ec499245fa4ee15d843831b56cc26418025bf87001605c6691ca6bd40a4e248c309801b76a795ede8ad5308bcb6d1754ab3371f0003bb8c4e4e471954e28b1e9866379f82e1fbacb79d50adddad5b9778b558cddbb0038a5ff3d5c9557b965de3a7082c45a8ecf3e7721eb690b6c71f3d8975d5300f67c4dc4a736846e4ccd26f93463d5bc6f46edc488664be9696be12b02dd104d10cc6b1d82e8117811214a6487d17367e395ade2ef6b26a1783a7e2f245213bc03a755df3ee8ef9f1eff972c6919065cb7b756678d4ddfd193eddc0b42e8689613643146d7428ca37bf31bdf14e31867858f39d2323709eb3b7d7f4e397022378424bdee9bcb74e9d5dfd371f4734998fc18df4cdfb4b5c21c2e50f8d6c15bc14bf4fda6ceb9d8082cae432dfc98bfb3ecd16b8d74f830b642b042875e921b054bd1aaa581f60d718df669f56dc2f10d478997722162e83940e61a1b6e42df2a4a3a7cbcdd611ce96cbcfb5a95cc473231ca13c0609d0ce1ae5ddb5466d6d65eefad9daf2a36901bcc945847da1ed6e2e240e848b231b7d0e1acd06543ec93e768e59985d7e96c8c31fcd1210f0964271e21877525cb134bc3536257dbb11d30a3c4f949fb82ae0c31ccdfe41943251e50aa4355392ac309ef60fc17432a2be4bdb2fcb28607cc45a52b60016bb1d2e23972ff2c2a247d725585b1ef2b15f", "signature": "84f79d9e8f30e5bb6362239714556b04736fa44465cabaad23beaf5a99fc451ad4ae5a18c7f6f964fa41039216018ec5a2accae1075a6bb3a6ecbc1fca02b904" }, { "secret_key": "1be2949d51e7208175826213ee6ae3c091172742e88caa02ed0f313ecbe5d910", "public_key": "d7bf4748d6dded5b57a2abf797facc560b48563dfd9dcff4be522c717a6cfda9", "message": "045e2b0ec7bb203a49bdcba941e2b73c23c1fe59a17d21a0124ea24b337f92ab9c923a20576b62d5d0f624e7932c115b5474e0a46a4dc9ec51f6a0ce8d54744d1d52093320e39be203f74a0f5dfac52cf0f995c66df2914b68ad871fbe81525ad2d88ac69933a75aea74ace4e36343ddc06d3208f16d805f5dd786b4daaa166748cfeec5714c85c10478b597ac7f6ae2c98891e38fd414aa811b7621d805eb8fcc46cf4d568a8a92587cbbc1aecc12f10d90ac1e01ae986d14fe82951c682ceac8c925fc6654d838ac9353ae2f93f3c88bf7b82cbc43b1e49e5cebfb1949ade4b22e4bcf1b400c0a8fa8a6fe7670f69fc3faecd4805b8c954c01a540d1a1e788436eae073ae956dae3176905a8f0a3c60fd980dab419d41ec06e5273fbb13db9381f89b663ccc4bd753fd90f14a77b3d81c45dd3561cd1fa0e94d234cef9d7859a2ec942bfc18849d7f2ada3a5d657bc193d2e1491682f1665a534b1ac2083b738be8f9e963f5941ed483c6acc82e959b81b8af02f471c08f5f8b12e10e008192898a4450202af731592e74efe2a948e51d06e44de9b956b7bc9a69b6e74687ab206dec4d35b3173fbc438829d5064bfbcf743c1e2d46f628f2e51c626d8e416d7be6e555a249691abb167f1d92f4fa3392fde24e993ce7ff5c1b8e1577a7c0e73025cc6fcd727a82ef0c129e91e5533e021a3cdbb99d54bf7cdcd3ff119154f3fad9242b6ed350d10372c976ff3a437d097867d9bfba91d84bda55a6bcd6e3641b213a218b3041589c55afbb344de6e97d8c35b5c86cf3be063f901ffeea8cc91069967d2346035a91eb5706a3b53f6d1c34d4d2116706b65c298ec57de82abc4003ce8cc5e0b88ff710dda1dcef6f154277106b83eb46c045b082d113b361d6a625808c9130584dfc96707ef8955907baa61cf88c66b6d1f60581119cb6217a852157336178c685e6ed48526ed5c4e3b7967d51f99df6876a1acfb845c571b898656e5e3bc73980b9bed1198866359c9e9b1efa915f810d1ef8ad6cb3fc21fbfe654306de6ca13a3a6a48e7a13ed8746acbd07f48eb00c36374b1eb4f3f01c19e2e8d37e9fc064b33c0d669bba554ddc6821a77b4089cabdcafc97f60e6050bca444ae8cfc44d93c40ef5318bee6f8cf0c067b85cdddc45974a4eacfc3ef51315ba0f3f62968c7003a7ff444612400b159", "signed": "f41f2ef6595f17660bb2fe93e51fc6fa9c31dadc9db90c3f46607a7fb4800bb75ad96325dc7eab782472b04da6d8e6fe64655dea551fbd5049e876ce5a405f02045e2b0ec7bb203a49bdcba941e2b73c23c1fe59a17d21a0124ea24b337f92ab9c923a20576b62d5d0f624e7932c115b5474e0a46a4dc9ec51f6a0ce8d54744d1d52093320e39be203f74a0f5dfac52cf0f995c66df2914b68ad871fbe81525ad2d88ac69933a75aea74ace4e36343ddc06d3208f16d805f5dd786b4daaa166748cfeec5714c85c10478b597ac7f6ae2c98891e38fd414aa811b7621d805eb8fcc46cf4d568a8a92587cbbc1aecc12f10d90ac1e01ae986d14fe82951c682ceac8c925fc6654d838ac9353ae2f93f3c88bf7b82cbc43b1e49e5cebfb1949ade4b22e4bcf1b400c0a8fa8a6fe7670f69fc3faecd4805b8c954c01a540d1a1e788436eae073ae956dae3176905a8f0a3c60fd980dab419d41ec06e5273fbb13db9381f89b663ccc4bd753fd90f14a77b3d81c45dd3561cd1fa0e94d234cef9d7859a2ec942bfc18849d7f2ada3a5d657bc193d2e1491682f1665a534b1ac2083b738be8f9e963f5941ed483c6acc82e959b81b8af02f471c08f5f8b12e10e008192898a4450202af731592e74efe2a948e51d06e44de9b956b7bc9a69b6e74687ab206dec4d35b3173fbc438829d5064bfbcf743c1e2d46f628f2e51c626d8e416d7be6e555a249691abb167f1d92f4fa3392fde24e993ce7ff5c1b8e1577a7c0e73025cc6fcd727a82ef0c129e91e5533e021a3cdbb99d54bf7cdcd3ff119154f3fad9242b6ed350d10372c976ff3a437d097867d9bfba91d84bda55a6bcd6e3641b213a218b3041589c55afbb344de6e97d8c35b5c86cf3be063f901ffeea8cc91069967d2346035a91eb5706a3b53f6d1c34d4d2116706b65c298ec57de82abc4003ce8cc5e0b88ff710dda1dcef6f154277106b83eb46c045b082d113b361d6a625808c9130584dfc96707ef8955907baa61cf88c66b6d1f60581119cb6217a852157336178c685e6ed48526ed5c4e3b7967d51f99df6876a1acfb845c571b898656e5e3bc73980b9bed1198866359c9e9b1efa915f810d1ef8ad6cb3fc21fbfe654306de6ca13a3a6a48e7a13ed8746acbd07f48eb00c36374b1eb4f3f01c19e2e8d37e9fc064b33c0d669bba554ddc6821a77b4089cabdcafc97f60e6050bca444ae8cfc44d93c40ef5318bee6f8cf0c067b85cdddc45974a4eacfc3ef51315ba0f3f62968c7003a7ff444612400b159", "signature": "f41f2ef6595f17660bb2fe93e51fc6fa9c31dadc9db90c3f46607a7fb4800bb75ad96325dc7eab782472b04da6d8e6fe64655dea551fbd5049e876ce5a405f02" }, { "secret_key": "3b6ba6d5cc9cd6241d8b0097a3722e4d066fea3d560aeab4673e86f1f8ec6026", "public_key": "8ca6520717cf363c4ceffa76328a0a166ff83e45ca7d191cc8ef6ca6e5243367", "message": "36de930cc8e18860836a0c829d89e963a58bdd9c6b6ef5bc61f75992d2075242dca23e28de205a33dfea861fc44a32628e8e7cdd3ed7ff49ea6a7097e0090cfd9ff5ecab1de822fc0a4c3776dd56c1919204516a94cec5638da1d99e52b866f5ec4162a912edb41c1e92edfc353f6705e1c12cd41cb62ded4ad8157940059bfcf50719d3f2ad00848540ce89f3f9afa610ccba5ecc37e3e2c1534fcb38fcd39a2d14d5b5da6fea24e006654e309047a29cad0ae4da8e708f97a18cad5fbdc9ac84400c532ced548886539edd6c541074790ae4502fdfe9f3273a876a218623a25706a1525e67e57a16d22c21b6a45e2384e287ac4452aec4e063056b4c178ab0e5b2a5bad3f463c472c4ea1f9c1a66e5270473a835094e8f0eef680cd7b20d0e70f4d6c958fee08a9360aa6066888f4dd7ce5ec22259fa0b53fe9271c083c6fcdb7283b09061088c52f71bfdd2777ce0801f41a6c4ce90ef131de1e183cb8949ce323c9eb13a4b0cacf99defdfdb68d5ed1f6891b48e21047668d69de8a80f8e5634ded08736a4fb5410cdea9c72596e36df6841f2eea46850c87473c895540205b0921960ffa5d9d8ffb8e29cde96a3ede015acbc26974004d3e438a85b2e3385f64d1814003941ffd363992d3940c6e6d81ff8e45fced6d36ce198d8ccbefee432a77d8fcadd73fb799f6bafefb51a2da798721c3d465b163ef13e6ecc65e603b2893ee4cc9e1c6d1de7a65cab5cbdf536855e288c3ccda8d2fa3ce10cf49358a2ef4ef076e5bfa91bbcf3d966dfa3dc6e712f1956d4e58aa36e712dd3347169b19c8d44bec5bcb730778fcccc589ed5d350d44c17bde2eebb6f5ec59fb240d67d81aea9267f34f15eee2de3f4fa67391479bdbb430f484370fb0e0895b9ae065bbdd43e230c62ac07184e8b06b24b8b97ec02dc6f37ef61641ed56e3f5eb8d2080b5144ef760b518752e19754792e19343a3855e1e2f7a7dc623517eed2f5d26548a68eb8ffd7bf70f78fd186db634928bb98138f2b8fe84481cc53f5aa35e2666c6325e1d2b8ac5e2df2935b7f6413952d10d6076ffc75bb6af63b29b0b9663bec37247b66b508dde41f2f11b84333559dfac73f761bcda84a48d266073aef1638460849e7a17206a25f6800770b914cc026baf9e3255914e13258441cef35ad1d66833e987ebe4431e6a6bb222cbb65af", "signed": "788c9f4554ddba5c7d64ba759ec45694ec79fb85e82368a074bdd8df344213a56dd09f334cd9acb941be283d98c4b15dcfecd14e93f6a2e3cb0c1aa2dee7d90b36de930cc8e18860836a0c829d89e963a58bdd9c6b6ef5bc61f75992d2075242dca23e28de205a33dfea861fc44a32628e8e7cdd3ed7ff49ea6a7097e0090cfd9ff5ecab1de822fc0a4c3776dd56c1919204516a94cec5638da1d99e52b866f5ec4162a912edb41c1e92edfc353f6705e1c12cd41cb62ded4ad8157940059bfcf50719d3f2ad00848540ce89f3f9afa610ccba5ecc37e3e2c1534fcb38fcd39a2d14d5b5da6fea24e006654e309047a29cad0ae4da8e708f97a18cad5fbdc9ac84400c532ced548886539edd6c541074790ae4502fdfe9f3273a876a218623a25706a1525e67e57a16d22c21b6a45e2384e287ac4452aec4e063056b4c178ab0e5b2a5bad3f463c472c4ea1f9c1a66e5270473a835094e8f0eef680cd7b20d0e70f4d6c958fee08a9360aa6066888f4dd7ce5ec22259fa0b53fe9271c083c6fcdb7283b09061088c52f71bfdd2777ce0801f41a6c4ce90ef131de1e183cb8949ce323c9eb13a4b0cacf99defdfdb68d5ed1f6891b48e21047668d69de8a80f8e5634ded08736a4fb5410cdea9c72596e36df6841f2eea46850c87473c895540205b0921960ffa5d9d8ffb8e29cde96a3ede015acbc26974004d3e438a85b2e3385f64d1814003941ffd363992d3940c6e6d81ff8e45fced6d36ce198d8ccbefee432a77d8fcadd73fb799f6bafefb51a2da798721c3d465b163ef13e6ecc65e603b2893ee4cc9e1c6d1de7a65cab5cbdf536855e288c3ccda8d2fa3ce10cf49358a2ef4ef076e5bfa91bbcf3d966dfa3dc6e712f1956d4e58aa36e712dd3347169b19c8d44bec5bcb730778fcccc589ed5d350d44c17bde2eebb6f5ec59fb240d67d81aea9267f34f15eee2de3f4fa67391479bdbb430f484370fb0e0895b9ae065bbdd43e230c62ac07184e8b06b24b8b97ec02dc6f37ef61641ed56e3f5eb8d2080b5144ef760b518752e19754792e19343a3855e1e2f7a7dc623517eed2f5d26548a68eb8ffd7bf70f78fd186db634928bb98138f2b8fe84481cc53f5aa35e2666c6325e1d2b8ac5e2df2935b7f6413952d10d6076ffc75bb6af63b29b0b9663bec37247b66b508dde41f2f11b84333559dfac73f761bcda84a48d266073aef1638460849e7a17206a25f6800770b914cc026baf9e3255914e13258441cef35ad1d66833e987ebe4431e6a6bb222cbb65af", "signature": "788c9f4554ddba5c7d64ba759ec45694ec79fb85e82368a074bdd8df344213a56dd09f334cd9acb941be283d98c4b15dcfecd14e93f6a2e3cb0c1aa2dee7d90b" }, { "secret_key": "dd9987b18f9a922c0f6fea18eb00b896c7a2d3093db3ea31d38421da0de51231", "public_key": "573921a955feb6dde41b055c8dacaccd1db7fe9e36b509d3c9e36f9735752324", "message": "48162fdc3abf7319c6caab60cb8d0520875cb4ee8a07092783167d4733ffe5204e5febe7d291e9536bdea3df0637159a653e09fd99af661d8300ae741a3e91a8bd85ead05dc7d9e6f929323316edc4ca624ea7818b25bdc061f71492fd22d465ab226fd9a10d8babfc074c686c436c24a3a53f8ff389ce9ca1dbc8907445889241f8fda3a7a3f5024fa8cb0d044bdaf6716d983a6d839814ffe70ddc55bbba11ac97887bdb4dada96565bb075d5fc1d3c5244b9fff77de58729a059a911fb3e0eb164fb8429e265685d14a63233046d20ecf289c55723169a9d63dda0d5255153d9ef4a61b9212f4b820697ae7c308cfab403b2c3431906226e45ce21920df5201609daf830f28ad796005a9bd8eba620cf839c3ba227b963c7bd0914822df2ca03c2254d0cb8acae0d59e4c3e0ec215c836969dcd1d49bfe197e2f3eea3fa8a373b558d0fb9063cf1568e739aad8f09fb437cafb5a272375f436064eee11bd903d3aaeab4e3fdcd36bd2076eea179a4f0d4fbc8df42bf2660f08de7d5c6397cae10b7277458aa6cfa01e8a6737eb126227856646691681c106a157a26aed21b1aaf0ed2766421cfc3d1c7ddfb72fcdf4b8b490fc09ace49aedd7712b21ac56f8601f625563c784306f3b9174addf764e051aadfe12831af9669e62cab121c74df343724429d6c26660271c32f40cf7c2d08bd0afcc728def4135d4eb55b6a3e7629d806864a85b36a32b9b21ac0d39680a2ae4ec4189709178e349497f39399fbc78b3c6cfaca6edea7c33dda3cc11e4384f1583d6cfc6b58f4eaa2bc56aba42f738a429b93580850dee3fd253994f8b0fa66ee8e273decabd532095fb04a4a3c340af0e55b57efab43630fc02ef20b425ca2187e3c6c5e10f12d618fd243a224f6501ebeb9d321c6385b8127ef9cdcd097ce7fa021cf40d21c39912343f67acce1825e3a51b8a718e8c340622fff65fe0053d24aa3351b6a2400185d7aeb88e87ac4a1d394909d49414aefc22ba009aff6962c9217d755694e4d6aa8a5d6a803cebb15de8f541634b6fceb0cac79dda8a18eefbb537e70ffe9aa5a6a6aaf9240fac2eacbfbef01ad6bdf50758780f86a4e488985362d5825011f5e8b66425a616b7e104eb23fe8f100cb0249823662bda3da47a4c3c1ca2f914b25b9738534026047df6d7ff631df2c4131f680e13743c9ccf2", "signed": "3e9f2b007c0e29ec875995a6309b973deb8baf113ded13f1e0003e9b9bf93916a4dfe47937dadfc78aa663c55f674ec35c3846258f18e7bb93fbba3e826a1f0d48162fdc3abf7319c6caab60cb8d0520875cb4ee8a07092783167d4733ffe5204e5febe7d291e9536bdea3df0637159a653e09fd99af661d8300ae741a3e91a8bd85ead05dc7d9e6f929323316edc4ca624ea7818b25bdc061f71492fd22d465ab226fd9a10d8babfc074c686c436c24a3a53f8ff389ce9ca1dbc8907445889241f8fda3a7a3f5024fa8cb0d044bdaf6716d983a6d839814ffe70ddc55bbba11ac97887bdb4dada96565bb075d5fc1d3c5244b9fff77de58729a059a911fb3e0eb164fb8429e265685d14a63233046d20ecf289c55723169a9d63dda0d5255153d9ef4a61b9212f4b820697ae7c308cfab403b2c3431906226e45ce21920df5201609daf830f28ad796005a9bd8eba620cf839c3ba227b963c7bd0914822df2ca03c2254d0cb8acae0d59e4c3e0ec215c836969dcd1d49bfe197e2f3eea3fa8a373b558d0fb9063cf1568e739aad8f09fb437cafb5a272375f436064eee11bd903d3aaeab4e3fdcd36bd2076eea179a4f0d4fbc8df42bf2660f08de7d5c6397cae10b7277458aa6cfa01e8a6737eb126227856646691681c106a157a26aed21b1aaf0ed2766421cfc3d1c7ddfb72fcdf4b8b490fc09ace49aedd7712b21ac56f8601f625563c784306f3b9174addf764e051aadfe12831af9669e62cab121c74df343724429d6c26660271c32f40cf7c2d08bd0afcc728def4135d4eb55b6a3e7629d806864a85b36a32b9b21ac0d39680a2ae4ec4189709178e349497f39399fbc78b3c6cfaca6edea7c33dda3cc11e4384f1583d6cfc6b58f4eaa2bc56aba42f738a429b93580850dee3fd253994f8b0fa66ee8e273decabd532095fb04a4a3c340af0e55b57efab43630fc02ef20b425ca2187e3c6c5e10f12d618fd243a224f6501ebeb9d321c6385b8127ef9cdcd097ce7fa021cf40d21c39912343f67acce1825e3a51b8a718e8c340622fff65fe0053d24aa3351b6a2400185d7aeb88e87ac4a1d394909d49414aefc22ba009aff6962c9217d755694e4d6aa8a5d6a803cebb15de8f541634b6fceb0cac79dda8a18eefbb537e70ffe9aa5a6a6aaf9240fac2eacbfbef01ad6bdf50758780f86a4e488985362d5825011f5e8b66425a616b7e104eb23fe8f100cb0249823662bda3da47a4c3c1ca2f914b25b9738534026047df6d7ff631df2c4131f680e13743c9ccf2", "signature": "3e9f2b007c0e29ec875995a6309b973deb8baf113ded13f1e0003e9b9bf93916a4dfe47937dadfc78aa663c55f674ec35c3846258f18e7bb93fbba3e826a1f0d" }, { "secret_key": "38d2ef509f93051f145167737c22e1a5bfe8f4a91eba0bb87c39ce04a89baec6", "public_key": "01115f6d89a5daab54f892bb4a4bda1ce5d8f6c9c88a50cee83bd987a2c0ddf7", "message": "427b5a01e8597f04fd422f0a662d0be2dfa853ed5f9d3f60ff90f2c5ee08bb59fd03d402b754caf54d0058f5a2cf87af4fef2177d59e18226293fd2af376bc987bf7b320b9d1e249ab9efb75078e6d3df29e03504776354344aa69e72e1ebc52a3c38a4c2a1673b4e974a2e4e12a2e78ea3e3fe50c53630d096da3e2fe8299f71a1b441b4cf0caeb937afa4a0e3915ccab3996c9f6a8f4fd37543e8f75900cfd47175370efb852a5f69d673683f998fdcff85ff8f32baa807066604422027d51a435ddf988ed2fd8eb191f10b46807420008756eb4e300c4099c2d6450bcc6a4e7d0673156b837f0506338f3d1b5734b166ca5cc2f24a4ef026cda2c4ae3105b63ca8570d18546cfacb86042966a00ef52c7299019f68a2df08c8b704e85e713c348d7f1677660e18ebab59bf4e12e6ff2d783d8d5d42aab6ef017b7a1966aee8dc14ddabed49b4b643df4e9b0b60383c7d8b4b88c65a898c1c77d43d6bd68b2a5743f1fedd654dc84496da02ceb69b9b4d3a8e00ccd72e7c75fc50a8dd087e183e6c1f579baebc5c63f2807936791b5fe4847cdcf151774235205cd2d7b8bf4ae8819225ea708b7baac66998f0cbab2c7ddf251f3b1de1017d397692205eea639f12d77beef6c13bb12100ff8906470bc7b21298053be1a61b7b3a499edc310996c8bc0871907ca468e89ed311adca2e2b82930975b3efbbfc03cddf4d948c4765e8c10590882169acddb8f8c36d84c2dac3b798e7abf844712fa458d277c24e814047d742319a834dd9f927a2b4485ef13745f7a60dd6bb337936304c97d3f9f144eb29bb695b8dc31b9d84910611d28d581caa9365d6dff52d410a4ad52bd121729fff52888f4daae1707f6f56dac61ffb9961cda7176af4460a6d5542a20446fb5147fce727204cec6899b9a3d4ff6226bb8a1c78e36fcdd9e50c040d72d0f4007d3fa9aa767e4abd0add62fdbccdeff6721eb259e00a721632006bede0d173d38344dea44f96b67d9a2eea1d2af5f748e8ebdb441bfb4e58e2d42fec740566acf73a303358f7d89c8158cf21fe85b0d4a417ebdc86d0469f6b91c24ad610d486dedc218b2ce7a8b96754723151f0d0076fff9f19d112d9c0592fb8d92c99dcb8ddfaa46fbe0d92df46b8c00ca4345adb69a5aca694a86cf30646451bb17ba6e607a912bf109d5fc2d3e27d00d945600a8a57c", "signed": "dec46253509b11e4b52a6ae4f366b680dffc280d0a044fc0cb790b6e751381461e1e602a89e3b3d3064c407f602f1c22404b6823bd2467549314a00001664a08427b5a01e8597f04fd422f0a662d0be2dfa853ed5f9d3f60ff90f2c5ee08bb59fd03d402b754caf54d0058f5a2cf87af4fef2177d59e18226293fd2af376bc987bf7b320b9d1e249ab9efb75078e6d3df29e03504776354344aa69e72e1ebc52a3c38a4c2a1673b4e974a2e4e12a2e78ea3e3fe50c53630d096da3e2fe8299f71a1b441b4cf0caeb937afa4a0e3915ccab3996c9f6a8f4fd37543e8f75900cfd47175370efb852a5f69d673683f998fdcff85ff8f32baa807066604422027d51a435ddf988ed2fd8eb191f10b46807420008756eb4e300c4099c2d6450bcc6a4e7d0673156b837f0506338f3d1b5734b166ca5cc2f24a4ef026cda2c4ae3105b63ca8570d18546cfacb86042966a00ef52c7299019f68a2df08c8b704e85e713c348d7f1677660e18ebab59bf4e12e6ff2d783d8d5d42aab6ef017b7a1966aee8dc14ddabed49b4b643df4e9b0b60383c7d8b4b88c65a898c1c77d43d6bd68b2a5743f1fedd654dc84496da02ceb69b9b4d3a8e00ccd72e7c75fc50a8dd087e183e6c1f579baebc5c63f2807936791b5fe4847cdcf151774235205cd2d7b8bf4ae8819225ea708b7baac66998f0cbab2c7ddf251f3b1de1017d397692205eea639f12d77beef6c13bb12100ff8906470bc7b21298053be1a61b7b3a499edc310996c8bc0871907ca468e89ed311adca2e2b82930975b3efbbfc03cddf4d948c4765e8c10590882169acddb8f8c36d84c2dac3b798e7abf844712fa458d277c24e814047d742319a834dd9f927a2b4485ef13745f7a60dd6bb337936304c97d3f9f144eb29bb695b8dc31b9d84910611d28d581caa9365d6dff52d410a4ad52bd121729fff52888f4daae1707f6f56dac61ffb9961cda7176af4460a6d5542a20446fb5147fce727204cec6899b9a3d4ff6226bb8a1c78e36fcdd9e50c040d72d0f4007d3fa9aa767e4abd0add62fdbccdeff6721eb259e00a721632006bede0d173d38344dea44f96b67d9a2eea1d2af5f748e8ebdb441bfb4e58e2d42fec740566acf73a303358f7d89c8158cf21fe85b0d4a417ebdc86d0469f6b91c24ad610d486dedc218b2ce7a8b96754723151f0d0076fff9f19d112d9c0592fb8d92c99dcb8ddfaa46fbe0d92df46b8c00ca4345adb69a5aca694a86cf30646451bb17ba6e607a912bf109d5fc2d3e27d00d945600a8a57c", "signature": "dec46253509b11e4b52a6ae4f366b680dffc280d0a044fc0cb790b6e751381461e1e602a89e3b3d3064c407f602f1c22404b6823bd2467549314a00001664a08" }, { "secret_key": "43bfb3dbe4d9bdaa82b354dd596334e660d76fc0b2eb698993aef3767f1c7c7f", "public_key": "d00aeceff0ceb832c251d1fe6bcbeaeacbb4113f5281baba4e878f7b95f93f07", "message": "3f3eeddcaef4e1662adb66bb1b207d793fcbef815005e82643ed70c9855403dac28b520727a901a532d28b9bd1348db2f8967bbb8c9098b07f570a2eae1ee482640c0b67a52a38612133a15e258ede38cda878ff36ed321dff87cc6a01383ba84067d60af41776acf80a8a4eac77f7d87c37a704a3e2aca1e8815e49fbcab797c856529538be07d51696321f69b09b5dc5a15e5f0e4c22d22837f62ee4c8bc7f25a9487b962cc20f133fcb870ed125cca585d181bd39f9dfa661f19be76da7f65f22fbbc80752aeb39e8d59ed96e14f595d04929402b5029c60cee37c0217bc531d80db341dace3cce76e643aac53887473edc6e19cb39fecf6af424a2066393d1c33fc7b93676d7e6105b9bfc967d1e29afdc4cf15bcafa09c295a6f9deee331ab3b0d493126e2b2fffb42a6b68e79e138db550827262e487a83f37f01dd7922be75e92fcf5d9d4803b3ac2f35da210fb38b263b0ffb6c2708d4b55b757af52077a7e3184d01e82f64d32cce4fdee0f8d4e364bcfb958ebbfdbb622b38b51e930271c7b1b70aa9d4bb3aa4b997c52144d3aa62162573a3a1d9ce46cdbeeb8449f1225c449631e8897521cd0f637b721a1252b8a10ab0be870afbcd89d58b2ebb63211950cad7ab82c8195026b50ea8b77b9e90ed559af4484308851a3a156716853a8ac4ecb8c5cc7d935b0f466124143b1177f05d08b97d1ad542ed2c2465af185e7db42b69cb802a71794a3139883029670c956742aaad7907a71d95985fc1d45b65997b4ec6ce8255de959270afa7de90f2929de63f9b17211d7f1ae820ada9ce3e48649179d60b0149493481f01d459db7dad0526b5bd9f4b3380d25ba2c502ba8fa3c4d4131b4662addefb41827f759fa71d447d5f029245f48c622eb7c68c8e71081f7f789de7a283d2eda83a7d1722a05fb72e1760c24040c4d834def5df5f742e02b30451c893bcf7d771db784cbbdaec876d8ac86743b529a292007ac753c99a5799cc324fe5ebb5448ab554b10d4136974a12542d25c6147c67c5d2336c9db75cba2fd608cd43ab95beacd043a1349cefa828e23b5f0b6e0e2951f3353bb92bfd1f0a49c33fb3cf3799a0b543198ad5d03d263c1a06c35a26ade1518491c8c1d27a2db033808932cd1c47b5a126985acb8d888360eeccfeb3bf51b0d189b4190440404d12fba65d0a7a14c620c555f822", "signed": "a9995523020a0d222bc48f98d05504e3068f304a6d197006cc9c035eeade099e7aa97e90894ead17e8c30b0aa4a98088f038b92244c4b20fde964f8534e8fb033f3eeddcaef4e1662adb66bb1b207d793fcbef815005e82643ed70c9855403dac28b520727a901a532d28b9bd1348db2f8967bbb8c9098b07f570a2eae1ee482640c0b67a52a38612133a15e258ede38cda878ff36ed321dff87cc6a01383ba84067d60af41776acf80a8a4eac77f7d87c37a704a3e2aca1e8815e49fbcab797c856529538be07d51696321f69b09b5dc5a15e5f0e4c22d22837f62ee4c8bc7f25a9487b962cc20f133fcb870ed125cca585d181bd39f9dfa661f19be76da7f65f22fbbc80752aeb39e8d59ed96e14f595d04929402b5029c60cee37c0217bc531d80db341dace3cce76e643aac53887473edc6e19cb39fecf6af424a2066393d1c33fc7b93676d7e6105b9bfc967d1e29afdc4cf15bcafa09c295a6f9deee331ab3b0d493126e2b2fffb42a6b68e79e138db550827262e487a83f37f01dd7922be75e92fcf5d9d4803b3ac2f35da210fb38b263b0ffb6c2708d4b55b757af52077a7e3184d01e82f64d32cce4fdee0f8d4e364bcfb958ebbfdbb622b38b51e930271c7b1b70aa9d4bb3aa4b997c52144d3aa62162573a3a1d9ce46cdbeeb8449f1225c449631e8897521cd0f637b721a1252b8a10ab0be870afbcd89d58b2ebb63211950cad7ab82c8195026b50ea8b77b9e90ed559af4484308851a3a156716853a8ac4ecb8c5cc7d935b0f466124143b1177f05d08b97d1ad542ed2c2465af185e7db42b69cb802a71794a3139883029670c956742aaad7907a71d95985fc1d45b65997b4ec6ce8255de959270afa7de90f2929de63f9b17211d7f1ae820ada9ce3e48649179d60b0149493481f01d459db7dad0526b5bd9f4b3380d25ba2c502ba8fa3c4d4131b4662addefb41827f759fa71d447d5f029245f48c622eb7c68c8e71081f7f789de7a283d2eda83a7d1722a05fb72e1760c24040c4d834def5df5f742e02b30451c893bcf7d771db784cbbdaec876d8ac86743b529a292007ac753c99a5799cc324fe5ebb5448ab554b10d4136974a12542d25c6147c67c5d2336c9db75cba2fd608cd43ab95beacd043a1349cefa828e23b5f0b6e0e2951f3353bb92bfd1f0a49c33fb3cf3799a0b543198ad5d03d263c1a06c35a26ade1518491c8c1d27a2db033808932cd1c47b5a126985acb8d888360eeccfeb3bf51b0d189b4190440404d12fba65d0a7a14c620c555f822", "signature": "a9995523020a0d222bc48f98d05504e3068f304a6d197006cc9c035eeade099e7aa97e90894ead17e8c30b0aa4a98088f038b92244c4b20fde964f8534e8fb03" }, { "secret_key": "514e070b0190d18cbe981a5a151e7753398a272bcf014813ad379722c36e133d", "public_key": "6fbde0474cc4810effa50a07820c965aa00395ff3a5b3e2edd7d356b7d6aef2b", "message": "831455762a5d80097bb2845042f4c876e7108535bed683e8c44619d08154a229444b101e3ed7c01507e870941446af978c0f5341d1ac1dd15b14e8966712df19f52feb5103cf62b6632756446cc754df00a3f6dd719968a2cef66c3adfb7d1fc491fbbf3d59294ab34619e176db0d446151e37eaa3daf172406e983d9d23a6b69e92976030f5ac7040ad5114129feaf97af15b2296fae70492dbbeb2b4827687fb798715c9bb2c32557a81d891b897052900707159751f07db074c77f0719671f1766689029a3cddf39df3483cf2b04f71c25de05fc2d02bb48e539eaf1a321646cd80ef2f0ac703f45e7389530800e5d417ccea8a5c086682f04745d50b5dfc8f6edc87a95c7d202a9cfd998714b746920ebbe2335bca1a0171762016f5e4bda89c57d0edc6910c6d22c8f909da3db1352f0c8bd18f3b5aac25f193b89470f976bc4f1affb3c66bc5876c6fe2ac7508533d97bbcf77119d9aae193f07e0b64b461c9c6c3b9d293bd37de3d8e1ab1e8d872cd94e6cf0eb68439fdcd3b25ce8483460bd8b7cce889fb722b4361e118da983ef4a9e45cebc0c1b8229ea53e6f55505f644e09acaa4c4b8cc640b2cd2b312e1c3a2c02669e1f9c06311c78d360009db9e67c39b49d1e5d770c01d284b0a17a41b4e7ca745d665ec07500e4d9fc8ebc1cc6af53a3fc76b0c3f1431d49843f20e182782c82b3b5aae36fe20ca642618068be233d4b5ef9eaeff401536dc593a2bc18344f55ac5d5fc7b3eb506d11cb375330063c620c5334d723c7d1f042816bc4785b35ac0e6f174f736878b7b491658ca67d8fcab538fc6ecd277ead90d954b460da4253a1c3a30b3d8928f69ac9876a2891969fc2d06a668992b8e2115dfe5358a7124ba7ccf421d8054ea043444cdeb40b716dc7a3659a3ca94347293489060e2cf6712a2a6c7b8ad146785fc40ccb9da287830d011d0d24df3e7afbe972d6f417de5cd75f259ea07cafdde205fc0a365135c232cbd7c1bc539fa4b7e1cce35185237c23f80ae97c186d0d3b10503d5984a20ec41c3cd042c28a4c31f9574b06a872bf959ab0add1f5dee14a1e741ef238dfcdec085aa088dcf39a36dda8f2a85ed0d362ccb005d02e5accc092a376dc11a566170d583db35f1de0be3f15908596e9b781ac81be07b9bd2af46c56fb4d9d84276011e4618b7f76f96794cd0fd57ed414b63", "signed": "b6c355c958b5baa7ebe977a93fcf539589a366d40160e4e031b88ab96402c7bd577ff635fc07782423598dca43668124a8b287510e2cfd07a1e8f619f6c8540a831455762a5d80097bb2845042f4c876e7108535bed683e8c44619d08154a229444b101e3ed7c01507e870941446af978c0f5341d1ac1dd15b14e8966712df19f52feb5103cf62b6632756446cc754df00a3f6dd719968a2cef66c3adfb7d1fc491fbbf3d59294ab34619e176db0d446151e37eaa3daf172406e983d9d23a6b69e92976030f5ac7040ad5114129feaf97af15b2296fae70492dbbeb2b4827687fb798715c9bb2c32557a81d891b897052900707159751f07db074c77f0719671f1766689029a3cddf39df3483cf2b04f71c25de05fc2d02bb48e539eaf1a321646cd80ef2f0ac703f45e7389530800e5d417ccea8a5c086682f04745d50b5dfc8f6edc87a95c7d202a9cfd998714b746920ebbe2335bca1a0171762016f5e4bda89c57d0edc6910c6d22c8f909da3db1352f0c8bd18f3b5aac25f193b89470f976bc4f1affb3c66bc5876c6fe2ac7508533d97bbcf77119d9aae193f07e0b64b461c9c6c3b9d293bd37de3d8e1ab1e8d872cd94e6cf0eb68439fdcd3b25ce8483460bd8b7cce889fb722b4361e118da983ef4a9e45cebc0c1b8229ea53e6f55505f644e09acaa4c4b8cc640b2cd2b312e1c3a2c02669e1f9c06311c78d360009db9e67c39b49d1e5d770c01d284b0a17a41b4e7ca745d665ec07500e4d9fc8ebc1cc6af53a3fc76b0c3f1431d49843f20e182782c82b3b5aae36fe20ca642618068be233d4b5ef9eaeff401536dc593a2bc18344f55ac5d5fc7b3eb506d11cb375330063c620c5334d723c7d1f042816bc4785b35ac0e6f174f736878b7b491658ca67d8fcab538fc6ecd277ead90d954b460da4253a1c3a30b3d8928f69ac9876a2891969fc2d06a668992b8e2115dfe5358a7124ba7ccf421d8054ea043444cdeb40b716dc7a3659a3ca94347293489060e2cf6712a2a6c7b8ad146785fc40ccb9da287830d011d0d24df3e7afbe972d6f417de5cd75f259ea07cafdde205fc0a365135c232cbd7c1bc539fa4b7e1cce35185237c23f80ae97c186d0d3b10503d5984a20ec41c3cd042c28a4c31f9574b06a872bf959ab0add1f5dee14a1e741ef238dfcdec085aa088dcf39a36dda8f2a85ed0d362ccb005d02e5accc092a376dc11a566170d583db35f1de0be3f15908596e9b781ac81be07b9bd2af46c56fb4d9d84276011e4618b7f76f96794cd0fd57ed414b63", "signature": "b6c355c958b5baa7ebe977a93fcf539589a366d40160e4e031b88ab96402c7bd577ff635fc07782423598dca43668124a8b287510e2cfd07a1e8f619f6c8540a" }, { "secret_key": "bc790a7385dd1dddc762e3b20221dc078b6c3da8986d4180940727257cfdcdf1", "public_key": "c9264626f68fedb5b39c28f030453b54d0d51a98b17721f2611d7f277ef48b81", "message": "143dd7bfbff2adc71f5d123d474ea069df14ae923ed9bf8f9891e60bae43f0c9f55537ac9d1ae523ce4ecfd33b20ae445e9c426372050fa5217c1e4fb01353ebf2e32904ef7eefcf72e8023bae06bbb640cf777d5b0e11527bc835493ad6980a157bb2d50be23365e72cbf0b3f209ef0c44a00b41a62262488096cae5a696b4d64cbad34500d41fb4e4bc70f8bf62144d01c2275d6d29f5de75b1721d5046b6829164443ebfd9c1781319d88f54010edc296abbed02b7dad9ba585b552e0005dcca400bf4f459eed7db86ea8612be9e918dfd4e2700c4710083283626fac754417e0087d26ba145dfc45b1c9bf7b4dd70e6c508747ef805c9a02425aebc6421e0deb6a79d89aceeee01ececc9f3ca365383826584c430ebd39ecf0a72866ae0aceca5ad4f0405b67779c04c5de0330614da3470b805d787ce79ac5a696dd6f6b5539b1a651b424cefb19491da6e0889223cc98398b42c00414ff8d6c0627eb97cff20a8cbe7fccb41d810fcfe858ca7475247ef628e84a09d012fe12235b38c1cc9d82e2b69d01d6218cfd48e85f26aeadd195408cdd4c2f806a89041fd0317fb1a7b6209f904270d34e606195047288b0fb11a5722938f67c22b313f7f74b2025c75bcd1ecc5a9add4a640a41f2996eb66e5af196198db58a3fb9938f349f922a24d86f4ed8a96a09a196c24d6d01ed76f3816c05c4f26baca9b9d6dcc79b580dfb75d6c905d480dad76951854bda1caa7f4a819543aed01ae956bf3058fe8b3c7d5d724962f1a6a83143ddad274fda3ad578e98aa967c410ee57575ef01c0258560f0a1fa4b79327796de99420cfd0a415506360f1242ccc58a6880927750dbbff13d7c1b4ed519cda357210f12fb0d1c4d48f0411bd7e058cc4cb93d3c77597e2653ffa282d3c2f128ac33a237af2fcbc9ef9c811f37814ba2b0b85093d0fd18b8c6fb09a43ce52254d23d55f32e1d3242aed1f23d9cf204aa0dfd44a346fe09e55a4a06cf1bef8bbf37ba1f1598a58aef89501ecbac0453543e480ed0adde90c841d95ebd6eb23baa9f70f83c149eab32d0913c79b0993d0e1d3574f0f542e56a20616cfe4a8bd7aaeebe0b083dc2ce0146178c07482a01129bc6fefdc8141c1384894b69cbe2f29da188f7fd4ac341a2df6fd90dee6a446d2746324c75c1ef5b1ace187d3bc16d70559892975d7e47138f0406385ea", "signed": "6d6bd65f372679fe9d945ff56516333ece0b7a25b15ad2487381670e536f5246775eb39a114db2b9cd50f312b360d9d0bea295dc37b817b332890adb65e4c401143dd7bfbff2adc71f5d123d474ea069df14ae923ed9bf8f9891e60bae43f0c9f55537ac9d1ae523ce4ecfd33b20ae445e9c426372050fa5217c1e4fb01353ebf2e32904ef7eefcf72e8023bae06bbb640cf777d5b0e11527bc835493ad6980a157bb2d50be23365e72cbf0b3f209ef0c44a00b41a62262488096cae5a696b4d64cbad34500d41fb4e4bc70f8bf62144d01c2275d6d29f5de75b1721d5046b6829164443ebfd9c1781319d88f54010edc296abbed02b7dad9ba585b552e0005dcca400bf4f459eed7db86ea8612be9e918dfd4e2700c4710083283626fac754417e0087d26ba145dfc45b1c9bf7b4dd70e6c508747ef805c9a02425aebc6421e0deb6a79d89aceeee01ececc9f3ca365383826584c430ebd39ecf0a72866ae0aceca5ad4f0405b67779c04c5de0330614da3470b805d787ce79ac5a696dd6f6b5539b1a651b424cefb19491da6e0889223cc98398b42c00414ff8d6c0627eb97cff20a8cbe7fccb41d810fcfe858ca7475247ef628e84a09d012fe12235b38c1cc9d82e2b69d01d6218cfd48e85f26aeadd195408cdd4c2f806a89041fd0317fb1a7b6209f904270d34e606195047288b0fb11a5722938f67c22b313f7f74b2025c75bcd1ecc5a9add4a640a41f2996eb66e5af196198db58a3fb9938f349f922a24d86f4ed8a96a09a196c24d6d01ed76f3816c05c4f26baca9b9d6dcc79b580dfb75d6c905d480dad76951854bda1caa7f4a819543aed01ae956bf3058fe8b3c7d5d724962f1a6a83143ddad274fda3ad578e98aa967c410ee57575ef01c0258560f0a1fa4b79327796de99420cfd0a415506360f1242ccc58a6880927750dbbff13d7c1b4ed519cda357210f12fb0d1c4d48f0411bd7e058cc4cb93d3c77597e2653ffa282d3c2f128ac33a237af2fcbc9ef9c811f37814ba2b0b85093d0fd18b8c6fb09a43ce52254d23d55f32e1d3242aed1f23d9cf204aa0dfd44a346fe09e55a4a06cf1bef8bbf37ba1f1598a58aef89501ecbac0453543e480ed0adde90c841d95ebd6eb23baa9f70f83c149eab32d0913c79b0993d0e1d3574f0f542e56a20616cfe4a8bd7aaeebe0b083dc2ce0146178c07482a01129bc6fefdc8141c1384894b69cbe2f29da188f7fd4ac341a2df6fd90dee6a446d2746324c75c1ef5b1ace187d3bc16d70559892975d7e47138f0406385ea", "signature": "6d6bd65f372679fe9d945ff56516333ece0b7a25b15ad2487381670e536f5246775eb39a114db2b9cd50f312b360d9d0bea295dc37b817b332890adb65e4c401" }, { "secret_key": "db3a44df40d255a25cf23f53c45223b7d8f1f1f111ba07406b71e184a8cd0612", "public_key": "6b12bd9580ae207a9b0baa8287b8bb86669373ee5e5a625ab4a6ef2d08712597", "message": "52dd8ba4fffa344d1e0811d9675c313f9cc0e5a138478691989d2b7f7389025068fa35f74f9aeaf1e95665ecf8d5707f75f65f2256eea93398be59c0d538f5e8584bfbb3a240f5016d7927234cb3eac35b391b8b53f20ed8bae0ba11089694bfeade11071656d4cf18ef2d368192e04e08e3024fc1d2fda6312afca68d10c9c336a0e36850be1a4f35b033a85a2a9549f2673a995f2a9ab4bd46c8fd2d838e64f761713427329c9af5e4211a22ab208aaab80e194cd0f6a502b308fed6c583517801a48ed4330e2faddcd41809c3919b30e84db3c68731031e79857dd9f97ffd12547da7066798074151ec88a5fa963b9d9d83ba2fee135833950ef7bc62b3401ea11bb36f25561bc0522bb02d8dad0543f63d547be77d0a4c9bf65d42f3a276144d2e474e2942f3790221e26fbae7ca91efd85921990835fafb6dc674635c9601821038b52711343d1aa25f1c46ba4e3c6e712bac19e53eae30e5246e4f04ddf2acdbb34163c243677690be0bf2e3fa164870b5e6f536b22fb89e5e8e1d87cdb34044977ed2836e544d7ba493dd42a2b649bcf313c5b39a1dbfff3e7f2a59ade87d3e7b258f58e565fdba3e4d92b1edb8bff54dc49d86c53c030cf58b97ef066d241b540530213905739d8e1aa72ed90f685d3958eaa242b0cbf7a2eb976ee96a63e66786464169a742d457e4d9117c7d66428445a46930c28ba7a2658241805ebe72c78e02035d263a211e590b490cdb84415062eed14f13b8a1a9e77c8d7b75515b18fb85386e4a7e053980d30f4899e83863bee875585887c5f48b516ccb731c4bcaa3df07d04795814096c79d7c5fdc4dabf5e26a4ca1838e0e5d87db71309b81ea7ce461e5e44c7ab2f105ad75c543c1e9179c36a5fa555ec922ffed1b76d25801dd74f80cd0a6ba7bc20db0ad580b7bbb9ddcfd93ad1c5f20f3e27c3ea3a1e71eb74ff5f944cd3b98f6d04529593011c4aecef6dcaa60fb18368cb12b6e391b3f5df765cbabff15898c84796fc2b53fa4900dad034a13b0ce1445adda4ef719be741419e231e92f1f667a32842a42db79bd7a014a809c81596e826273d16fe5d40458242ae10e12e60b3489530c6622b5bb44454f29616e47e9a297ce1ca074137fd9ae13e3ee8edbcf78af265459db1af342dc0b2fc809bda015b5a82b2b7c54efe4e5fc252eb13d66e808936f1910f4c48be0ef7a", "signed": "cc28b5ef4b9773637fae7e5f084b6994aa3598f8f4a65d0bb201d172d861a30149b3338d3c3ab75b32b25595cd8b289630c3376acd10ba2ab26bc1aba900840e52dd8ba4fffa344d1e0811d9675c313f9cc0e5a138478691989d2b7f7389025068fa35f74f9aeaf1e95665ecf8d5707f75f65f2256eea93398be59c0d538f5e8584bfbb3a240f5016d7927234cb3eac35b391b8b53f20ed8bae0ba11089694bfeade11071656d4cf18ef2d368192e04e08e3024fc1d2fda6312afca68d10c9c336a0e36850be1a4f35b033a85a2a9549f2673a995f2a9ab4bd46c8fd2d838e64f761713427329c9af5e4211a22ab208aaab80e194cd0f6a502b308fed6c583517801a48ed4330e2faddcd41809c3919b30e84db3c68731031e79857dd9f97ffd12547da7066798074151ec88a5fa963b9d9d83ba2fee135833950ef7bc62b3401ea11bb36f25561bc0522bb02d8dad0543f63d547be77d0a4c9bf65d42f3a276144d2e474e2942f3790221e26fbae7ca91efd85921990835fafb6dc674635c9601821038b52711343d1aa25f1c46ba4e3c6e712bac19e53eae30e5246e4f04ddf2acdbb34163c243677690be0bf2e3fa164870b5e6f536b22fb89e5e8e1d87cdb34044977ed2836e544d7ba493dd42a2b649bcf313c5b39a1dbfff3e7f2a59ade87d3e7b258f58e565fdba3e4d92b1edb8bff54dc49d86c53c030cf58b97ef066d241b540530213905739d8e1aa72ed90f685d3958eaa242b0cbf7a2eb976ee96a63e66786464169a742d457e4d9117c7d66428445a46930c28ba7a2658241805ebe72c78e02035d263a211e590b490cdb84415062eed14f13b8a1a9e77c8d7b75515b18fb85386e4a7e053980d30f4899e83863bee875585887c5f48b516ccb731c4bcaa3df07d04795814096c79d7c5fdc4dabf5e26a4ca1838e0e5d87db71309b81ea7ce461e5e44c7ab2f105ad75c543c1e9179c36a5fa555ec922ffed1b76d25801dd74f80cd0a6ba7bc20db0ad580b7bbb9ddcfd93ad1c5f20f3e27c3ea3a1e71eb74ff5f944cd3b98f6d04529593011c4aecef6dcaa60fb18368cb12b6e391b3f5df765cbabff15898c84796fc2b53fa4900dad034a13b0ce1445adda4ef719be741419e231e92f1f667a32842a42db79bd7a014a809c81596e826273d16fe5d40458242ae10e12e60b3489530c6622b5bb44454f29616e47e9a297ce1ca074137fd9ae13e3ee8edbcf78af265459db1af342dc0b2fc809bda015b5a82b2b7c54efe4e5fc252eb13d66e808936f1910f4c48be0ef7a", "signature": "cc28b5ef4b9773637fae7e5f084b6994aa3598f8f4a65d0bb201d172d861a30149b3338d3c3ab75b32b25595cd8b289630c3376acd10ba2ab26bc1aba900840e" }, { "secret_key": "77964dad52b579b8966753da3186d1c5e9d33d33a4db38bc0d7a1a6c112c13c2", "public_key": "fc25125e7829f64234375e52ae9f77ae1013f99df5f9965ad2aa16589596d091", "message": "c339e718a757f3f3bd1babdd2e00aaa5cd7fc9005ee34b6fdc09d71fbd9c9289ab1dd14dba2cad58cb805116777bd80c85966433ad46f9ca6e54f13dd3ca7e56e47fea41e5488a45ad53bc5d657427e1d7938f5519f1b09f5bdd98aae5ac9643ef78eba4934925339a155dc66828571002097a11a5cee7b51a441b756b0ce65b779afe19da6a18efc145f6090ce770de9e0e91f543270a0985eab475293ccfdd3141c4142e4722233b267499447641235d728bd75cd1adc0db142f7331adddf8c5eea3d576405d869915b560f964e3e0003c91f5e96bffbeeec73e51024ef52c55c6dcb54d58203e62f4ddb6e137eb08e1bf1326018afd1a86cab6c841e0661ce0a1a7ae967f24c1a77fc7ca505f72e5f7936e39c6f4837e2595195a69cd676510a7161a4dc5e318f3d4f3ac0af03f8c4ae5bce39324e9738aea49f002d32d16de2317e95a9f32ee604e13db8038b264cfc17aed29c9debf8191de9e0efc951ad6d54867068cf50a269c37a241f85206788d23143177f659cca66cfce03bc0502255337f16b3dad6f79132abf80ff12b6d2281e637eb6c71f76e2633a114565240eed00fabea9ed8de28c83221f8cb485f512d9008bfc74a366d4c2b4ed172d367e0247cb65098c110282e831df8e9bd4fbd5f4dd2b7f2420c23b85a637aa2262c3cb88405f70730c9ab4c9d0f227ee4fa4ef91efe9a59b3e6d843db879f5650059e99f0e4a0386838e6f9876f67d50f89832dda5f30a9cbfd710134f9b5b54627496aa3a43212b07f03db11d3d4f875d41d1f4ac45969ddef69f81a06d2b0c646c9cd931cf2502fef0dd32abbf0951ed303f5284825934397fc22e78698d35ad81d82256bf9e15400a1091623a9826f1e57792367417ef02586d64e650da9ace2f18aa0a126d867cac4b5d4c91bf5209e5359556386f827083eb53e8b4709fffabe92c61d78ffb5daf10274e242a70091f3f9b9d596c1258c9a63384f4b05b028661222181c0fca965f0a2cb56e4b556d6fbff71b64d9b358da31aa37c74ff5962fb8d96a383d049724c19e249c9edbb2a375b23ce3104da0ec58d2635ba03b55423fa2db7eb349a4fc58a1ef540ee9a02c2e703c68d7f8475f434ddd3200db1f06745791a3acc3160dba50a393447ffeef6dc7b98fb06684cc90fd85203d119dcd8199e4d9a89ae3467ae4bb19fb71cf747029c24096f9a50e", "signed": "3d1b4b4e820d250be2a8fa971e599e1e98977528b2f930189681a93b05e1a706fc80effa94e929bc43921656897388288a9b29271f37a14be014b873c68fc904c339e718a757f3f3bd1babdd2e00aaa5cd7fc9005ee34b6fdc09d71fbd9c9289ab1dd14dba2cad58cb805116777bd80c85966433ad46f9ca6e54f13dd3ca7e56e47fea41e5488a45ad53bc5d657427e1d7938f5519f1b09f5bdd98aae5ac9643ef78eba4934925339a155dc66828571002097a11a5cee7b51a441b756b0ce65b779afe19da6a18efc145f6090ce770de9e0e91f543270a0985eab475293ccfdd3141c4142e4722233b267499447641235d728bd75cd1adc0db142f7331adddf8c5eea3d576405d869915b560f964e3e0003c91f5e96bffbeeec73e51024ef52c55c6dcb54d58203e62f4ddb6e137eb08e1bf1326018afd1a86cab6c841e0661ce0a1a7ae967f24c1a77fc7ca505f72e5f7936e39c6f4837e2595195a69cd676510a7161a4dc5e318f3d4f3ac0af03f8c4ae5bce39324e9738aea49f002d32d16de2317e95a9f32ee604e13db8038b264cfc17aed29c9debf8191de9e0efc951ad6d54867068cf50a269c37a241f85206788d23143177f659cca66cfce03bc0502255337f16b3dad6f79132abf80ff12b6d2281e637eb6c71f76e2633a114565240eed00fabea9ed8de28c83221f8cb485f512d9008bfc74a366d4c2b4ed172d367e0247cb65098c110282e831df8e9bd4fbd5f4dd2b7f2420c23b85a637aa2262c3cb88405f70730c9ab4c9d0f227ee4fa4ef91efe9a59b3e6d843db879f5650059e99f0e4a0386838e6f9876f67d50f89832dda5f30a9cbfd710134f9b5b54627496aa3a43212b07f03db11d3d4f875d41d1f4ac45969ddef69f81a06d2b0c646c9cd931cf2502fef0dd32abbf0951ed303f5284825934397fc22e78698d35ad81d82256bf9e15400a1091623a9826f1e57792367417ef02586d64e650da9ace2f18aa0a126d867cac4b5d4c91bf5209e5359556386f827083eb53e8b4709fffabe92c61d78ffb5daf10274e242a70091f3f9b9d596c1258c9a63384f4b05b028661222181c0fca965f0a2cb56e4b556d6fbff71b64d9b358da31aa37c74ff5962fb8d96a383d049724c19e249c9edbb2a375b23ce3104da0ec58d2635ba03b55423fa2db7eb349a4fc58a1ef540ee9a02c2e703c68d7f8475f434ddd3200db1f06745791a3acc3160dba50a393447ffeef6dc7b98fb06684cc90fd85203d119dcd8199e4d9a89ae3467ae4bb19fb71cf747029c24096f9a50e", "signature": "3d1b4b4e820d250be2a8fa971e599e1e98977528b2f930189681a93b05e1a706fc80effa94e929bc43921656897388288a9b29271f37a14be014b873c68fc904" }, { "secret_key": "5cafd817a4410ccb27121723ef3207c1731a0861945be962714c0ed95038a195", "public_key": "4ea086be43ece1c32d08059bbadc9e9a2b2f4f3fe370f1f5ccd7dbdec0aaf303", "message": "50b2f05342418046d16a30be4fc62b67daf6c18d2a74242b7cb55ba90ad20b6cafdd60155737c29de48aa5d799fe5495fe59df5a9b8c0a8e5418904763fbad83ea6986651bac31117939cef4e0c79930d52dfd7db43c31addae3cf93e3efc5a916efd0d65fdc30909fa356ccbc5247d7aaa067131b6b4820fd02f8e395f5a9704c9bdd7560a611d62559a8dfe1d2859c52486cc11ed3331992488f417520d920dc73a32d4f08110082500f5a962a306932c6a7802955cedad7abf53b0f19fe4794a31d6b855380284306ccff71a4007859a2328bb19024c43e10d77064d866d9622d142c27354b84ac3b4f8232f7a2f8af6409d5cc757a18ef813dfaf4b9bc040cb006d77f143641aa2036ac7bc928dc96585d9e36c7bc9c564d25f1c2cc0beab9d5f207e84b215f1e7aa6fc328237b79c39923a4e09c7c73dc6b24b1416294d798a4ed5f758336d915a870a7d6b7592b5b88aace2dc5f267bdb491141cbbae2a677407cc0955f961962599304ba0b839671a5c000e920108a05298087e49770aeeeaab3632724cb0fc2285796dc414814fda78a54e67f00a02f77d3ccde1ed9d7b1def14ea1f61910bdf30a1196fc6351b62254d6445e6c90445b16efafe289a2784b92e42b78a4a900c35f55630bbb7762ff9eb7fef7d04c90b9571c4fc760a410dbfc252991d0ba27f2d414fe64eefdff4abc18817c9706c631bfa203821d3b92cb338baaf5d1232b462647954d0902462fb1696e991f07fa9c3dbcf2872960831b4ded92a421cf21b753165ff309efe2ef5438c01270d10c6a03d34f71ebc2dab1da90daa357984d2462bcb35ee3de55c3a55f8b98aec2114f74c84341a64127863c120b5ecad9e329a5756ae4a2555d8492cda835225a8deb3f9c1558f0d425bc172ff7640cc79d97800416fd6294cccc70cd1cf5b6a8e2aa07289bd522bf99dc96c36bfee80e846f5dd746dd4c5003e4bf7d29efeea7508a0161236882c9a82a56aa2c2574669652c630923ab470ddb95d456f7b8e8f07599ba0d1d38bc7f8176e3fdf0209bd6f75d4cc11803afb1856cbc0e91c73730e4fb98f3c948a87d5a7edcc0a6a8ac810ea3eaa6e063cec5f5566cd6dedc537db6d686b8021f6ea825ad7475ec7f1c5dbde45d3ff4b5ee51c0d04f1d74018eb91e5040d01c8b71a4aabbde6094d4afeccb18dfcded73ea75e3b9f8ce167df6209ae", "signed": "288515fa7259f1eb587fe8a2c403434c46f8d7e75b6d22bb3896566c017d09b698c2c807799c2f65f9cdb4eb58151ccfc48d108061a6b3148432b2bfc1cdab0550b2f05342418046d16a30be4fc62b67daf6c18d2a74242b7cb55ba90ad20b6cafdd60155737c29de48aa5d799fe5495fe59df5a9b8c0a8e5418904763fbad83ea6986651bac31117939cef4e0c79930d52dfd7db43c31addae3cf93e3efc5a916efd0d65fdc30909fa356ccbc5247d7aaa067131b6b4820fd02f8e395f5a9704c9bdd7560a611d62559a8dfe1d2859c52486cc11ed3331992488f417520d920dc73a32d4f08110082500f5a962a306932c6a7802955cedad7abf53b0f19fe4794a31d6b855380284306ccff71a4007859a2328bb19024c43e10d77064d866d9622d142c27354b84ac3b4f8232f7a2f8af6409d5cc757a18ef813dfaf4b9bc040cb006d77f143641aa2036ac7bc928dc96585d9e36c7bc9c564d25f1c2cc0beab9d5f207e84b215f1e7aa6fc328237b79c39923a4e09c7c73dc6b24b1416294d798a4ed5f758336d915a870a7d6b7592b5b88aace2dc5f267bdb491141cbbae2a677407cc0955f961962599304ba0b839671a5c000e920108a05298087e49770aeeeaab3632724cb0fc2285796dc414814fda78a54e67f00a02f77d3ccde1ed9d7b1def14ea1f61910bdf30a1196fc6351b62254d6445e6c90445b16efafe289a2784b92e42b78a4a900c35f55630bbb7762ff9eb7fef7d04c90b9571c4fc760a410dbfc252991d0ba27f2d414fe64eefdff4abc18817c9706c631bfa203821d3b92cb338baaf5d1232b462647954d0902462fb1696e991f07fa9c3dbcf2872960831b4ded92a421cf21b753165ff309efe2ef5438c01270d10c6a03d34f71ebc2dab1da90daa357984d2462bcb35ee3de55c3a55f8b98aec2114f74c84341a64127863c120b5ecad9e329a5756ae4a2555d8492cda835225a8deb3f9c1558f0d425bc172ff7640cc79d97800416fd6294cccc70cd1cf5b6a8e2aa07289bd522bf99dc96c36bfee80e846f5dd746dd4c5003e4bf7d29efeea7508a0161236882c9a82a56aa2c2574669652c630923ab470ddb95d456f7b8e8f07599ba0d1d38bc7f8176e3fdf0209bd6f75d4cc11803afb1856cbc0e91c73730e4fb98f3c948a87d5a7edcc0a6a8ac810ea3eaa6e063cec5f5566cd6dedc537db6d686b8021f6ea825ad7475ec7f1c5dbde45d3ff4b5ee51c0d04f1d74018eb91e5040d01c8b71a4aabbde6094d4afeccb18dfcded73ea75e3b9f8ce167df6209ae", "signature": "288515fa7259f1eb587fe8a2c403434c46f8d7e75b6d22bb3896566c017d09b698c2c807799c2f65f9cdb4eb58151ccfc48d108061a6b3148432b2bfc1cdab05" }, { "secret_key": "d5cac85521af781f3d5f66862a04b087d0ccdcac926cfe9e747be8d5c2633f78", "public_key": "100dcc53039bf05ea0a9f5888212693d4f9e0e752595bbcd020610e0ae213596", "message": "d5e7dd594909375a4be08e74825d598d535bf46ec084de52b57391c127eff5224ab2d194dfb26633478d02fbda74d1dc5821f791bf962d8dad9e4ef24224891907b0189cccc8b133d3aa2078926daef2898c19c2e0bfe02041a904b9f04be7cb50aed0d962d1add20b40a88ab7abad626cf4da0a78f9f53685501fdfa58543ddf2ea0eea69e7ba160f8a177a25fc21e8a29c661633e30e523b0ec01b2aeee2d426e4aead457488108fe5f569cf6e2fdb68c28f2b3052823577cd934e7b062c8a3424cd4367fb315b744ca35255d7f1af4edc9bc9d8837123d97903b43df367c7d418c79347ffafe7c7b1724bba34ede8d3568db505983ead47f62b56e3618c11db8ff0bf492ac67597d2f96a6f420ff985341b786ad6ceaedd105d0d1563b2d53543d78e7256725d204e82ed3a2e6a6e83df61fc282a62ca06e62174b55bef40a0bdf8d23d1c330c71441485ee85e70ced121eac607f580678163e4bd75c6709ff3b41de80594b9e2f2aa278fefc21d73ee3f72854b958d9a8f63e3d70f7fead8c3dca8e71bf4b9c2a36f212b32eb3292e635580386559ee1a11df15293a0c21cd7360869846ba5b7ba85c994f5b2f9cc50e5eea8e4b3691d886062a18cfb182f1e8b611fe1bc263159cb8a086787c811bea4812530008c70ca0c47e64eb2fbad5b02727a66f2cdd6dde86f5d2a9645a1e9aa66ee0e15b97f5fd229596ee02e661cab9a54eee1b81f98fe256ed6c54feaaa0ba047eea353344f6e5c62be1e9d5c09a2a699411110c56d1949e90c07b1938ba9555ac1be8511b510218d7cde7e1d74a68afb642f81715fe9e6c96c50381ae5a9df306518785dc4dbc3a64f60f245c564b8029512f381b56ee787703426803c80ab1c311f477b891708b59fa748f32debf54d2413771978c265c9b87114adf25b8337aa93b0e632a5b6eda474bec16328159fbed067b00b87add61965492eccc6fd3461c1000e4037ab1e8ac89a8524f78ae09d308ea6c94ff883732b712eec0ef07718d33c011b9398f8cfea733075af331fb3f97cdc1e8c99f6a10725a68c5c58fdd8b0baa50227f34d73d23905203698eaff626654ce83d865108499be6861f6141bfa6219d7ab8b584519199f880cfa1b26d9194d301711c30fb446d6ea764a4310f70e4b859cf95fd44aaf8c1e240e80a71611dbcf52da58edc320311de388d5d9d769eb59be093", "signed": "5dc03363414eeac0086fb6feba44217cef4c520db61926df680ca602dc11003ce6afbf3d13c8c5b05273d21415e67c14a2ee5d0b1d5352419ab9b39c003a510cd5e7dd594909375a4be08e74825d598d535bf46ec084de52b57391c127eff5224ab2d194dfb26633478d02fbda74d1dc5821f791bf962d8dad9e4ef24224891907b0189cccc8b133d3aa2078926daef2898c19c2e0bfe02041a904b9f04be7cb50aed0d962d1add20b40a88ab7abad626cf4da0a78f9f53685501fdfa58543ddf2ea0eea69e7ba160f8a177a25fc21e8a29c661633e30e523b0ec01b2aeee2d426e4aead457488108fe5f569cf6e2fdb68c28f2b3052823577cd934e7b062c8a3424cd4367fb315b744ca35255d7f1af4edc9bc9d8837123d97903b43df367c7d418c79347ffafe7c7b1724bba34ede8d3568db505983ead47f62b56e3618c11db8ff0bf492ac67597d2f96a6f420ff985341b786ad6ceaedd105d0d1563b2d53543d78e7256725d204e82ed3a2e6a6e83df61fc282a62ca06e62174b55bef40a0bdf8d23d1c330c71441485ee85e70ced121eac607f580678163e4bd75c6709ff3b41de80594b9e2f2aa278fefc21d73ee3f72854b958d9a8f63e3d70f7fead8c3dca8e71bf4b9c2a36f212b32eb3292e635580386559ee1a11df15293a0c21cd7360869846ba5b7ba85c994f5b2f9cc50e5eea8e4b3691d886062a18cfb182f1e8b611fe1bc263159cb8a086787c811bea4812530008c70ca0c47e64eb2fbad5b02727a66f2cdd6dde86f5d2a9645a1e9aa66ee0e15b97f5fd229596ee02e661cab9a54eee1b81f98fe256ed6c54feaaa0ba047eea353344f6e5c62be1e9d5c09a2a699411110c56d1949e90c07b1938ba9555ac1be8511b510218d7cde7e1d74a68afb642f81715fe9e6c96c50381ae5a9df306518785dc4dbc3a64f60f245c564b8029512f381b56ee787703426803c80ab1c311f477b891708b59fa748f32debf54d2413771978c265c9b87114adf25b8337aa93b0e632a5b6eda474bec16328159fbed067b00b87add61965492eccc6fd3461c1000e4037ab1e8ac89a8524f78ae09d308ea6c94ff883732b712eec0ef07718d33c011b9398f8cfea733075af331fb3f97cdc1e8c99f6a10725a68c5c58fdd8b0baa50227f34d73d23905203698eaff626654ce83d865108499be6861f6141bfa6219d7ab8b584519199f880cfa1b26d9194d301711c30fb446d6ea764a4310f70e4b859cf95fd44aaf8c1e240e80a71611dbcf52da58edc320311de388d5d9d769eb59be093", "signature": "5dc03363414eeac0086fb6feba44217cef4c520db61926df680ca602dc11003ce6afbf3d13c8c5b05273d21415e67c14a2ee5d0b1d5352419ab9b39c003a510c" }, { "secret_key": "159a9eddea5de63403987b5670db6fac98ffe5ec3a6cf01516ee2c70ce3b3be0", "public_key": "f61f4a04a5a12ccaecfaf44c1c9c1888475a2c89fb02f26bb81ab5f78f4ce3a8", "message": "d195e5900dd3931481bc012e77bf060aaf31cccb0fe1a6c40eaf286a6166a166b1ea37053426284b920c67fee1d4b9d86fb861cc6edd34e10c52233734d9cd92f5dbf433512ed255ac6b26e56f5c664bccb260692cf49d08363ee94e336acc489600a6aa512a040f10ebf18f7d2cbee9cad14c4ff87377a3263419d8297529401f15337a4c4d2325ed7def763a0d479caa408266834da242f3a16b79a45866b9d9d71a4829317674cff7ae6c8c587ba4d4980e818613d3ad82507a7ab032bbf99c5e9b640371bb41b91e965dc31e8c7d4b3bafd49570527faaa87abbf6416c47b1b1b09d3401253126cb246ae45acf5f100bb1f92f11a5c6c937e0588d8b146b3e4d3c7e5bf57484e984fe3afc4772f24ebf894cdb39837fbd469a921a96ac5af5e070f6c9624c588e9d4fe6ddfeed1f8fe20eb9c460ce6ee38bf471dd56dcf2e3ee998b8e7fdcf612e78a2e7c7173c0160982bedecc2c621e5f6611b4ef2102e32e7c29803a7e25fee151243158a76ee5d8c1bb2e7d8c88871ba433c5e541c2602693d90110be795b523a8fadb605d8e3d7e493fe245d9cc5320d32b85d6135a44b1168729414c2ca21560fb4feecdeef0cf7d8e071274e8856c004033e80013c73af7177c3197816a5032d9059b1b6e4152c386192dd54b90f9d308be98ed7d0ca9d12e8aaf6f9d869386aa9dbb01593d37e72f090124d3455298e9b4c9ec3cae73bb8ee41eb63e38c56133efdbaf449b84e1e491e496f1c70a44d069986ba8818422069061bb6ebcb7b2054e63df381ba03c6a7674abd61050d693d41bfe3ca5046c65ffb06a0749809e58d4c93a9ff69ed30950bde1f99216fff299f22f16b07c254c265ae0b12e313163ccdf5036d49055f9a9667b0b71292bc3b6260cb87568fd267170bc940c33329d729c9e32d0f9180b134bff8ae93b1bfebfa3842fef20bc04a297b00a84a0f428d5f42fab86142996d4ad9efabc49852f8812f3bfb5e57539e2186eb8ae229580bc60448acdef5723c881588b53789f05b91e02289223252d753f79813779ace705e04aed15265d3bdf2a2e4b15654770a275854e64cf44390607a45d7bba9af3e1a2e283067fcd6e633aa2d2403bd81f7c792765510b598412f6bda07b2a945b9f6d46ab2f7c320075bc6b60a80daa44af391f4cd562131bbdd407d66f8db1259bd76fa7e4d5264e145546c942dfe9007", "signed": "0543712cefa29a220d90f81baa4e4cf77ac65208b2d5ce9fd17ce214ad4a937b7fc5c786413b58051cca3bb8b2eb55657d89572bc50ea2e5ecdc555088491603d195e5900dd3931481bc012e77bf060aaf31cccb0fe1a6c40eaf286a6166a166b1ea37053426284b920c67fee1d4b9d86fb861cc6edd34e10c52233734d9cd92f5dbf433512ed255ac6b26e56f5c664bccb260692cf49d08363ee94e336acc489600a6aa512a040f10ebf18f7d2cbee9cad14c4ff87377a3263419d8297529401f15337a4c4d2325ed7def763a0d479caa408266834da242f3a16b79a45866b9d9d71a4829317674cff7ae6c8c587ba4d4980e818613d3ad82507a7ab032bbf99c5e9b640371bb41b91e965dc31e8c7d4b3bafd49570527faaa87abbf6416c47b1b1b09d3401253126cb246ae45acf5f100bb1f92f11a5c6c937e0588d8b146b3e4d3c7e5bf57484e984fe3afc4772f24ebf894cdb39837fbd469a921a96ac5af5e070f6c9624c588e9d4fe6ddfeed1f8fe20eb9c460ce6ee38bf471dd56dcf2e3ee998b8e7fdcf612e78a2e7c7173c0160982bedecc2c621e5f6611b4ef2102e32e7c29803a7e25fee151243158a76ee5d8c1bb2e7d8c88871ba433c5e541c2602693d90110be795b523a8fadb605d8e3d7e493fe245d9cc5320d32b85d6135a44b1168729414c2ca21560fb4feecdeef0cf7d8e071274e8856c004033e80013c73af7177c3197816a5032d9059b1b6e4152c386192dd54b90f9d308be98ed7d0ca9d12e8aaf6f9d869386aa9dbb01593d37e72f090124d3455298e9b4c9ec3cae73bb8ee41eb63e38c56133efdbaf449b84e1e491e496f1c70a44d069986ba8818422069061bb6ebcb7b2054e63df381ba03c6a7674abd61050d693d41bfe3ca5046c65ffb06a0749809e58d4c93a9ff69ed30950bde1f99216fff299f22f16b07c254c265ae0b12e313163ccdf5036d49055f9a9667b0b71292bc3b6260cb87568fd267170bc940c33329d729c9e32d0f9180b134bff8ae93b1bfebfa3842fef20bc04a297b00a84a0f428d5f42fab86142996d4ad9efabc49852f8812f3bfb5e57539e2186eb8ae229580bc60448acdef5723c881588b53789f05b91e02289223252d753f79813779ace705e04aed15265d3bdf2a2e4b15654770a275854e64cf44390607a45d7bba9af3e1a2e283067fcd6e633aa2d2403bd81f7c792765510b598412f6bda07b2a945b9f6d46ab2f7c320075bc6b60a80daa44af391f4cd562131bbdd407d66f8db1259bd76fa7e4d5264e145546c942dfe9007", "signature": "0543712cefa29a220d90f81baa4e4cf77ac65208b2d5ce9fd17ce214ad4a937b7fc5c786413b58051cca3bb8b2eb55657d89572bc50ea2e5ecdc555088491603" }, { "secret_key": "eda0feac0f2afe0174491552487f3962171332b822dc3da426f9a5f62bef7b8d", "public_key": "eff27cb51f4d39c242f323019a1234818ef2e4cd1bdabc0f2d8d213458dc471a", "message": "901119da4ed181aa9e11170b20626e00abf0b548245e3debf94bf5ed50aeefe942b402cc9948947852dedf2b5304017665749cd47c21fc652ee995679ff931e30e94af98b4a98fd44e849e98470fe0a76ce80c61f83fb4e85ba523ee3fd25db000053b49d0930e3b079e866e153f7d86367f23a4c4abc63b3075461e90e4fd896da0492e27d714941e967f52c93ffaec44803f57877d866eb5f8c5281785aa4826792e3964c66590821eea66752074264018a571f5b013b38e152c95c0248ae6036822a67afc9e02694573152b864c56c2f730a08210f85ec46f984a643d516a15fcfaa84840f512047d110e0718d293955f0158257fba0d78eb7df2f0b77e6eeb76db5e71707310e827361cd4e119740e63922db42c2ceb5ee175d50decc7b749fd2325bce1e6a8f710ffcc1e1c9b33c380e52a64daa9585fabe406d9cf24488fe26f3a495fb0ab50e1e2bad82381aa22431099cc8a569813d79c9d78569c0d95da9aad2bfb57758d52a3752752e023d651c9cb66a412a5c80f6ba54793f7ec87b4c598fed2ce24abd7608708895c46727359ffeca6d6c62e10a678caa718b4cd263292cfef535b9fbe2756b7396d697b3146c551e6aac1f5f1c24be9b67a1e2a2aff745301ba6a212217c53d681681bbb401bf4a43656f5d15cde969c1780099a33237eb19a3b8585d6b5dea2fb577845f25ee2a82ccf4b28502f90fe80b8cdcdf2ccf93c434c0e6aa5d8752a44343c2b18d20fe4004c47038659356f87abed5445034d8e2d3d14768f5ef312cf102a9884683bcc0cd8a71e3ec36fbb6334a1bbaed5d2bf10416d82bd6530475380ab6e2577bbc69cebda75faf02ad827b54518213206fd4cd66f252b234aca9eede7e3eeb815ddcd8d519c5d7f5d9d1fb9ca0fa4467990095fa46220c20a2071dfcaad5f024dae3416f7c492d757488c49a2e4df483bc9b80098e0d5d683facb8c960829dff09b303369d46cb57331ff21791ee25d6be7dec7ebaf1b32479a7f514dc647105c944c36f7dbf0a5b589128dbaaa42171d642f25a981ce1f8379f91690b36af774648d5624c08dbd0a90f708716dfab2024dae865b9c49ab27473826cd4a010bfdb52011d8c7cb3f421ca8ca3cd0486889188e67df00fb8c2a643e7adb2f8279f763e5b9a81b6dfc3f721fc5f6849f66736788cc557c4ebc6fc68d6f6ac77bedda8acb362243bda74e7b2", "signed": "6cbc7e6f5e12145b01687ad9ca6bf6e47f9417c2cefad3fbd68fd65dd74faa9750cba992de4cebcfcd35808cbb3ff12c8d930799af36efe7976bf2fea79e3e0e901119da4ed181aa9e11170b20626e00abf0b548245e3debf94bf5ed50aeefe942b402cc9948947852dedf2b5304017665749cd47c21fc652ee995679ff931e30e94af98b4a98fd44e849e98470fe0a76ce80c61f83fb4e85ba523ee3fd25db000053b49d0930e3b079e866e153f7d86367f23a4c4abc63b3075461e90e4fd896da0492e27d714941e967f52c93ffaec44803f57877d866eb5f8c5281785aa4826792e3964c66590821eea66752074264018a571f5b013b38e152c95c0248ae6036822a67afc9e02694573152b864c56c2f730a08210f85ec46f984a643d516a15fcfaa84840f512047d110e0718d293955f0158257fba0d78eb7df2f0b77e6eeb76db5e71707310e827361cd4e119740e63922db42c2ceb5ee175d50decc7b749fd2325bce1e6a8f710ffcc1e1c9b33c380e52a64daa9585fabe406d9cf24488fe26f3a495fb0ab50e1e2bad82381aa22431099cc8a569813d79c9d78569c0d95da9aad2bfb57758d52a3752752e023d651c9cb66a412a5c80f6ba54793f7ec87b4c598fed2ce24abd7608708895c46727359ffeca6d6c62e10a678caa718b4cd263292cfef535b9fbe2756b7396d697b3146c551e6aac1f5f1c24be9b67a1e2a2aff745301ba6a212217c53d681681bbb401bf4a43656f5d15cde969c1780099a33237eb19a3b8585d6b5dea2fb577845f25ee2a82ccf4b28502f90fe80b8cdcdf2ccf93c434c0e6aa5d8752a44343c2b18d20fe4004c47038659356f87abed5445034d8e2d3d14768f5ef312cf102a9884683bcc0cd8a71e3ec36fbb6334a1bbaed5d2bf10416d82bd6530475380ab6e2577bbc69cebda75faf02ad827b54518213206fd4cd66f252b234aca9eede7e3eeb815ddcd8d519c5d7f5d9d1fb9ca0fa4467990095fa46220c20a2071dfcaad5f024dae3416f7c492d757488c49a2e4df483bc9b80098e0d5d683facb8c960829dff09b303369d46cb57331ff21791ee25d6be7dec7ebaf1b32479a7f514dc647105c944c36f7dbf0a5b589128dbaaa42171d642f25a981ce1f8379f91690b36af774648d5624c08dbd0a90f708716dfab2024dae865b9c49ab27473826cd4a010bfdb52011d8c7cb3f421ca8ca3cd0486889188e67df00fb8c2a643e7adb2f8279f763e5b9a81b6dfc3f721fc5f6849f66736788cc557c4ebc6fc68d6f6ac77bedda8acb362243bda74e7b2", "signature": "6cbc7e6f5e12145b01687ad9ca6bf6e47f9417c2cefad3fbd68fd65dd74faa9750cba992de4cebcfcd35808cbb3ff12c8d930799af36efe7976bf2fea79e3e0e" }, { "secret_key": "ec059fc6be983c27eca93ddcdcb53af7286255da91e2a56a684f641ec2d09d6e", "public_key": "ffc6cb751c70071b65ec2ac6b45fd1d55fe836965f80b3e7c784fc704acbdf69", "message": "d1ac6325a4e690fa79536883d5c20eacb7d964c0178f742c2b23727deb62645af7c81922a0e72e5e30b5839a2ed5e567ec31ce224115b82d2bf251b7393f01b0d03a602bc120ae62af7fbc379dfcf95bbbba984aaba34fe212ac99003328b832c3532d42eee1e1874dc22ad67db6c91dbbfb2b45785dbcd39917d36fb48c1b5d6f38bdda5d28fbba64175575afea46c8ed6757ff30164e0df2e72176e8b6c9db5b5ef390b72f2d4d94e3b66f0d44a7e0f06e89debcdf1363c0e75d50db5bb70190d19f66a39c6f7dba70dfcd4a9fed02c2f1d067e7c788c58fdb3e17a2377ce486ec6582f3ba997bb5f70cd621002956f5131aa3a1617c0cebccd9391de1307c85970a8bc155f519872668450c91488689f53c2c1a7ed53f388cb13a2c3896fe5b7d3a0dc1683f27664c8beaea680c8cc54a90e4c6f99fbf05f2c22df60de9aec80c79b7d66207050667b452d7857f9a8ca723280dac7992e2079267ec3ad911404642c4e326bfb96b43c89434ba4bc78c252f4d4ca8d13a8874c6fc8252ea0b56c6bc786847d4318306e1c652c452585eefd0bd9dd3c148a73ba86eedea945f016713ed7df085d0066689e792dacb2bfc1eb5c824372a26c5e944aa7444ac9773d4a1921e49bdd4f8f6d788c263fee04c7b444c5305edb633e1ffe0ba4ea8da011a62f2bbfef4b895ad3f224c3ba3bff0c95d75750c9bcc66ff8a20b6c24bde7581a7ec3866f8716f781f46dcad45a9ebcb6ed46953368397011735d4b52d00e8db397995dbdb3d4f4254687f04688a268c305b2b1f622cf51b174775bad7f6674adc2e58e05cce865f12d7569c8e9b35bcdf3ccce6330d08ce5340a7c630f27a6c8086b5146b292fcbf50ff6aaaef8848a707b2543c618d17bd976c240bc79d33e004e4953482915e7e6ef94964bdea4e02dd7c2f475235f2b99e43229c9ac3aba0db59ac2da03a9ee4f37dbf247a33e6dfe5be7c7f82584f04a46d49f6621da31b91ac3daa4d68d48a56659b448c0ed365cb4aa0cfd908853df5bbfa88e60e10a5a002c32ab3333f2c39bbf3ee01a4aa60d2d01423e6097dc54305f81a2d93e2f6b4e8b351971cbf2457dc76e1fb89293384798ef28234e9b1a47dedc2336f86b8e13c4aef790f5a11239c747d9d865c9a15adeb071070267e5346256648adc0fa4dbdfd787ca1465fc240a324c3caf2931da41499e275fd4b35f6d08db", "signed": "a7b88e5abf132824bdde77c5f8df94ab26481f6bee660ea162247082a250d390c71d320ad060d8ef341fb69a483294f0d6de726f0c862fa37ea4bc6dab521509d1ac6325a4e690fa79536883d5c20eacb7d964c0178f742c2b23727deb62645af7c81922a0e72e5e30b5839a2ed5e567ec31ce224115b82d2bf251b7393f01b0d03a602bc120ae62af7fbc379dfcf95bbbba984aaba34fe212ac99003328b832c3532d42eee1e1874dc22ad67db6c91dbbfb2b45785dbcd39917d36fb48c1b5d6f38bdda5d28fbba64175575afea46c8ed6757ff30164e0df2e72176e8b6c9db5b5ef390b72f2d4d94e3b66f0d44a7e0f06e89debcdf1363c0e75d50db5bb70190d19f66a39c6f7dba70dfcd4a9fed02c2f1d067e7c788c58fdb3e17a2377ce486ec6582f3ba997bb5f70cd621002956f5131aa3a1617c0cebccd9391de1307c85970a8bc155f519872668450c91488689f53c2c1a7ed53f388cb13a2c3896fe5b7d3a0dc1683f27664c8beaea680c8cc54a90e4c6f99fbf05f2c22df60de9aec80c79b7d66207050667b452d7857f9a8ca723280dac7992e2079267ec3ad911404642c4e326bfb96b43c89434ba4bc78c252f4d4ca8d13a8874c6fc8252ea0b56c6bc786847d4318306e1c652c452585eefd0bd9dd3c148a73ba86eedea945f016713ed7df085d0066689e792dacb2bfc1eb5c824372a26c5e944aa7444ac9773d4a1921e49bdd4f8f6d788c263fee04c7b444c5305edb633e1ffe0ba4ea8da011a62f2bbfef4b895ad3f224c3ba3bff0c95d75750c9bcc66ff8a20b6c24bde7581a7ec3866f8716f781f46dcad45a9ebcb6ed46953368397011735d4b52d00e8db397995dbdb3d4f4254687f04688a268c305b2b1f622cf51b174775bad7f6674adc2e58e05cce865f12d7569c8e9b35bcdf3ccce6330d08ce5340a7c630f27a6c8086b5146b292fcbf50ff6aaaef8848a707b2543c618d17bd976c240bc79d33e004e4953482915e7e6ef94964bdea4e02dd7c2f475235f2b99e43229c9ac3aba0db59ac2da03a9ee4f37dbf247a33e6dfe5be7c7f82584f04a46d49f6621da31b91ac3daa4d68d48a56659b448c0ed365cb4aa0cfd908853df5bbfa88e60e10a5a002c32ab3333f2c39bbf3ee01a4aa60d2d01423e6097dc54305f81a2d93e2f6b4e8b351971cbf2457dc76e1fb89293384798ef28234e9b1a47dedc2336f86b8e13c4aef790f5a11239c747d9d865c9a15adeb071070267e5346256648adc0fa4dbdfd787ca1465fc240a324c3caf2931da41499e275fd4b35f6d08db", "signature": "a7b88e5abf132824bdde77c5f8df94ab26481f6bee660ea162247082a250d390c71d320ad060d8ef341fb69a483294f0d6de726f0c862fa37ea4bc6dab521509" }, { "secret_key": "f16abdbcc0bcc61a1aee3abd8767ab52e5f79999bb77a3976cbc82670dfd2f73", "public_key": "10f451719db0fd21376e228a41c3035c8c2bc42e5aaa926fe608878dbb0dc7ab", "message": "bfacd7dd4eea467dcce404f4a3520a45b94ebaa622197d02d61529d2b3bf273c4ee1fb95a180c8f87de190a2e5ea70b84ae1eb6fd4447d8a3a8ded10f6ede24f0eb92bd30bc65d4871e8f5da08cbe8cd3c0ac64fd5a57a6b064a89d5159b42f8b3e5a1838c9cb19d88106c0773a275cd2a1d609930bf6b30aeca62b97e319bbfa934f4d0a1e6ac80baebcba2d8ea4bed9ca8562b4acb56979bf885324ac40ab4a50bfb9f349049fc75a0e03de4cc43eae3c6a6cffb5f6ae6c94504415e6c7ed3045a932f47fd20b9f3483a77b6d449d8dfd4a638dbf56f03f0f031879059b2fb49767943f46b3872e2de567d5fef80b02925e9863e0f1d31a80f4e6451c325694b80cf1f1918c6e498878edc47c4530cac466f1a294d55df09af4fdc8072adb1bf26ca8c92f912a2b9febc8b97b58c1e9d32c780323052972b6fbd53304c05193caeb67c5bd3e67479725d297dffb06890abf8cd9e42458e168a6118f905b1d53486016f85dcd98dd339e3460533d0b8a49fae6dc1a071725e6ae5f294479ee3bdcaeb74061841fb2608e88a49fd0f3895b18f85b90f7241dd1387710053faa62bae75e9ae39369c1c02de5d19242efa16e11d44a4ba5778ce7722a91cec0bc0a08c069bdfa130d1c6c4b56c6e93542403ccf27684def57def26df86ced571282dc960974618f0a74a0cde35b653cc6e7730431b825ffb9b8aaab3c7a397c992bc2fa23270fb11ee431afd5f9a644483011173993f19485dd3cbdd187bd3d995ebf0031b1b0de4a8de9c14eb6f780e36b8925756b97906a1969d85e967d880e6e7dda42fd3c30019f11d7081071eee6626422836bbed27d46dd0df1feb6610dc859f513c0bc653d70220fe048d2e97c2e06af530e11bdc7029bccc5c92edecef5e4a2e0be2d251f4415dca3e55b3a850f2630b879e4e036ce8633bf20920b68094215929accc7be40c5778bc554e6edd7e54c9e145b2ee07b65d061c11de0e83f381ce4f57c6483f51069363511074c7a577353b45c6eb71199dce5059fd2c4611b054238aaadf2b6ba534bfffc2722ae3e31ff79ae2ebca99cc3507f8a033cf4fea70c52f7db5de442b42b8d41e99012e42ca0e85a9fb6d4f165b330de6383c5726efca2fe971340002f562dc6cb8f2faf0665725e097799d096091864d66a950a5790953ee16b9ea582009218708c4accd81381358a2c689a041d02d786121", "signed": "33d805290869b8e04ff089faa2d1fab83743bada68ade5b38ae5f0cc58c3374eba43943c1f5110678eb39b4658611822a26d35ffe19e9cfcb9ba9589e4ec3105bfacd7dd4eea467dcce404f4a3520a45b94ebaa622197d02d61529d2b3bf273c4ee1fb95a180c8f87de190a2e5ea70b84ae1eb6fd4447d8a3a8ded10f6ede24f0eb92bd30bc65d4871e8f5da08cbe8cd3c0ac64fd5a57a6b064a89d5159b42f8b3e5a1838c9cb19d88106c0773a275cd2a1d609930bf6b30aeca62b97e319bbfa934f4d0a1e6ac80baebcba2d8ea4bed9ca8562b4acb56979bf885324ac40ab4a50bfb9f349049fc75a0e03de4cc43eae3c6a6cffb5f6ae6c94504415e6c7ed3045a932f47fd20b9f3483a77b6d449d8dfd4a638dbf56f03f0f031879059b2fb49767943f46b3872e2de567d5fef80b02925e9863e0f1d31a80f4e6451c325694b80cf1f1918c6e498878edc47c4530cac466f1a294d55df09af4fdc8072adb1bf26ca8c92f912a2b9febc8b97b58c1e9d32c780323052972b6fbd53304c05193caeb67c5bd3e67479725d297dffb06890abf8cd9e42458e168a6118f905b1d53486016f85dcd98dd339e3460533d0b8a49fae6dc1a071725e6ae5f294479ee3bdcaeb74061841fb2608e88a49fd0f3895b18f85b90f7241dd1387710053faa62bae75e9ae39369c1c02de5d19242efa16e11d44a4ba5778ce7722a91cec0bc0a08c069bdfa130d1c6c4b56c6e93542403ccf27684def57def26df86ced571282dc960974618f0a74a0cde35b653cc6e7730431b825ffb9b8aaab3c7a397c992bc2fa23270fb11ee431afd5f9a644483011173993f19485dd3cbdd187bd3d995ebf0031b1b0de4a8de9c14eb6f780e36b8925756b97906a1969d85e967d880e6e7dda42fd3c30019f11d7081071eee6626422836bbed27d46dd0df1feb6610dc859f513c0bc653d70220fe048d2e97c2e06af530e11bdc7029bccc5c92edecef5e4a2e0be2d251f4415dca3e55b3a850f2630b879e4e036ce8633bf20920b68094215929accc7be40c5778bc554e6edd7e54c9e145b2ee07b65d061c11de0e83f381ce4f57c6483f51069363511074c7a577353b45c6eb71199dce5059fd2c4611b054238aaadf2b6ba534bfffc2722ae3e31ff79ae2ebca99cc3507f8a033cf4fea70c52f7db5de442b42b8d41e99012e42ca0e85a9fb6d4f165b330de6383c5726efca2fe971340002f562dc6cb8f2faf0665725e097799d096091864d66a950a5790953ee16b9ea582009218708c4accd81381358a2c689a041d02d786121", "signature": "33d805290869b8e04ff089faa2d1fab83743bada68ade5b38ae5f0cc58c3374eba43943c1f5110678eb39b4658611822a26d35ffe19e9cfcb9ba9589e4ec3105" }, { "secret_key": "be79d1aeea86e86f398137e62ffd79e50eff9f313f25192f89e52f0b4bbd5d32", "public_key": "187dac855ca442fd9a3ddc3289c24eb2d26f7a40fb29d8e74431b25022c3a0cc", "message": "6d632a7d3c9be53649d0d1a5eedf519a413b13ac64e9ad854dfa04f2e17329d822be573d9e35ac066f022213a344620bba289f5331695584d1343e815405aeabe3861d63b3a5b92b8cd8eeed2280222abde30a1bccd3f3e411aab922fa1baa097aa5c780d0eaef94ea10fe21f7d639b76d4788aeb5924a9d262dcbc5688a3e43544bec088ca2e0d06d77a71fb641d55226614452b1e0807a9fcd3ca69bf7f25d8041470ceb7b21ead03ec037a1629bd500aa233b59be44978210b6a366f223acfa0797954007b00efb4ffadb5fc92bdb37863e502d7d70681039edf33770df3d1de343dc35f226d5e73944ba0255e2a88ef6c41e472b214567c249594a50878b6731c1aeb5b10fa91fa76a37e1f9f1c00fdbfe3485ded54a009ab6133927115668b59f5115508da9370f6bc92a1185c0d5ca01d291e18c54acfaca738bd71968a342a0cba62e4bb104a5bb379fc83ee1820d1db980253d6cb383e95af15f53c85d175890dde5e4ed03d2d0135e3d60b18293f5b5641ef83c6ece3d52598fc6353686e6f7b09fdec1f6f153672d34b489b48a0db9e42ceda71755481c047016c22534e90c6d201ed7859602636ea77ae8c6734b7c4c5bd99579c508731c7246a29586e406e1d932f6713071d4bea63dc5e2a3761e16024d2c3284f709a1f2ba085ead3200c7046275cb96b61a60b5ac559bc488bd106467c3de50bf5d740d05c9cd701d65b7daea29e64dd5a97adb6b5c82cf7f23017aa7ca1ac9a39e5827eb47e20d359b67c7d4e1a8e3e27c52d33d9303a592623484d797b402cbb458d1ac2ea53e1c4f7abb70cc029554a234574def9bc3b0d3835dc314902e25abb22dfdeddc679a3cc8f07340b15f5762f4407f380342554ed0c62f73b61816ea8c529461e1bf0e9d1c2d5e4c5746336bc0e132873cde0dc2158b54fa1b678a006b4d95eda8a955714273b7cc5cf2add9094d46e49abc096a45f418e2edbe99dd852911688064df7cf061d07aeef42795690f48c9ba19565475d5468a9ef45d7bf75fd71182dd6e640138f182a6a0c6cbbd00c495c4389530ac8e67960eb5c5763f5484eab1c1ab850140da042ba47ed8528800d41787f075fe0d85501a7ab76635d03410d286c0e17db4023a76397468ccb091cc5ac1f6434587913eab922b50ca5567016ddea32fb53255be67f2dcf9ffa85d117f1a655fa70dd3a54cf991531f19130eaa", "signed": "6dab593bb1d448c974a65c6a0b6fad22b4732632d00489176ef126aa590109e0a723a113107b53e17d690a0d40b0fa336cc87fd5fce8f541accec67f7d1ebc066d632a7d3c9be53649d0d1a5eedf519a413b13ac64e9ad854dfa04f2e17329d822be573d9e35ac066f022213a344620bba289f5331695584d1343e815405aeabe3861d63b3a5b92b8cd8eeed2280222abde30a1bccd3f3e411aab922fa1baa097aa5c780d0eaef94ea10fe21f7d639b76d4788aeb5924a9d262dcbc5688a3e43544bec088ca2e0d06d77a71fb641d55226614452b1e0807a9fcd3ca69bf7f25d8041470ceb7b21ead03ec037a1629bd500aa233b59be44978210b6a366f223acfa0797954007b00efb4ffadb5fc92bdb37863e502d7d70681039edf33770df3d1de343dc35f226d5e73944ba0255e2a88ef6c41e472b214567c249594a50878b6731c1aeb5b10fa91fa76a37e1f9f1c00fdbfe3485ded54a009ab6133927115668b59f5115508da9370f6bc92a1185c0d5ca01d291e18c54acfaca738bd71968a342a0cba62e4bb104a5bb379fc83ee1820d1db980253d6cb383e95af15f53c85d175890dde5e4ed03d2d0135e3d60b18293f5b5641ef83c6ece3d52598fc6353686e6f7b09fdec1f6f153672d34b489b48a0db9e42ceda71755481c047016c22534e90c6d201ed7859602636ea77ae8c6734b7c4c5bd99579c508731c7246a29586e406e1d932f6713071d4bea63dc5e2a3761e16024d2c3284f709a1f2ba085ead3200c7046275cb96b61a60b5ac559bc488bd106467c3de50bf5d740d05c9cd701d65b7daea29e64dd5a97adb6b5c82cf7f23017aa7ca1ac9a39e5827eb47e20d359b67c7d4e1a8e3e27c52d33d9303a592623484d797b402cbb458d1ac2ea53e1c4f7abb70cc029554a234574def9bc3b0d3835dc314902e25abb22dfdeddc679a3cc8f07340b15f5762f4407f380342554ed0c62f73b61816ea8c529461e1bf0e9d1c2d5e4c5746336bc0e132873cde0dc2158b54fa1b678a006b4d95eda8a955714273b7cc5cf2add9094d46e49abc096a45f418e2edbe99dd852911688064df7cf061d07aeef42795690f48c9ba19565475d5468a9ef45d7bf75fd71182dd6e640138f182a6a0c6cbbd00c495c4389530ac8e67960eb5c5763f5484eab1c1ab850140da042ba47ed8528800d41787f075fe0d85501a7ab76635d03410d286c0e17db4023a76397468ccb091cc5ac1f6434587913eab922b50ca5567016ddea32fb53255be67f2dcf9ffa85d117f1a655fa70dd3a54cf991531f19130eaa", "signature": "6dab593bb1d448c974a65c6a0b6fad22b4732632d00489176ef126aa590109e0a723a113107b53e17d690a0d40b0fa336cc87fd5fce8f541accec67f7d1ebc06" }, { "secret_key": "269952172c3fa976defbf40bd6edd8f15cfd4be10c758e3741d74162d8ea229a", "public_key": "4aea57c721e3dcca8239e9ad9b22c19bab8df72c88793b24d8dc47cf9740fcf8", "message": "7ccb6a0570c533737b9a534a341a7a96dc76528b997a9b48e6e0fde10f474b27ec989912d176cab742d89a848b3666e9277d695b022fd53a9eb89e88c720399e24ed25db9eb35d6da009e9f024ef8e655165bdef1c0d797c74f019cd591a0442a12d1ca893836ca2628b33e854f3428eec4aa5ed84f4bdd2eef8b6d225caf9496df9edffd735ea54db1bdea883ad5d47eb0bd4a6653f0ab037f040a41517a7741f91e82fdb6fda04f0dfa1bcf8b9b37bf2bfbd87327a636f907fdf968d0189d1a11809c4230ba69d5cbd84f561bcac3ad002e558c5b9b097a01902f29ce3f1ec264153d668c78b845105b9cd2ef3c943531b75aa428f179e4b3418b1d5a4aa7ab1203efa495c8769628eb1063a937b73e4b5cd0cda33dab01a50c64febd975c57a1e841508e8606094d0824fdd96cc6cfa18fa8209b30f0a2a78eac9a767176f573e78c068809b199a69ac6d335d7c920999c40cbad87cf4cc7ca5c644291d75ad7a74bc1e6392d1ce311ecfd2ebc916e39eb6aa3e7d89fb805a27a55f178912b157bc01a055f67aefa78e55c806cbd9c01baf8ef92cad2260b4bb14cfe61782dee5c59972506941c462a4da7eb899531cf996bc98ba3629effe6fcd1706d1b4ee4f2a14e921bd408f30e12e73fb7aa860536b03e77ca937823281a16453fe827935943201e6ec143a67eefa4f94e9abf94f7e3d41b70a82be69ded8a53060c2305f42f62fe6a2f704b67a1e8fddc7d98ba7f3457119b311d449663ed9e320d618dc2368d4950875b9c38c5d8c03104e2e32c4325dedd2bc267e2accb0112018e9c5a8007ccab2f6d7c737792002acb730d72e9f730829ebc42ca564c1d9271bf1869c4d35835589b7431ef7a31a070060fe4a089fb11f2dd3dce65ae0fb45bc3a2860917d933ba2d090569ef5ed43bc2532db879e0f1f225eadcbef1c03d9ed78299e233e4cf07b064a7baac34c5a0c19fc3a5542089f70167be2f85b4a10e778525223be8ffd5cff9648b1005a098b4b3924398fb0bcabcc6edf30c061ece7aea35fe98a9203f8711369530feb5e67bb2d4f59d9c8bc993854dd4747cde399bd0e63740c1cc839ad0f098a38a80beadd648e1436deee60e931e68f52979ce49f301fe39afbb615352091c8b6585fe88447ed6e59a020b2bbe66a9423ae5228c203bfd4847b5181e2c3b4dad83a6d4fa76985eef76adde3b34edbdd28d6a0b4a4ee", "signed": "3ac80d1e8f68b4058c3a04dad7187373959f26a27002496f8afaaccd8bea0901c54cab87b2a2302e1f3625c2b06c7ebcf3ce96de3afdf00f5194a35e0552c70e7ccb6a0570c533737b9a534a341a7a96dc76528b997a9b48e6e0fde10f474b27ec989912d176cab742d89a848b3666e9277d695b022fd53a9eb89e88c720399e24ed25db9eb35d6da009e9f024ef8e655165bdef1c0d797c74f019cd591a0442a12d1ca893836ca2628b33e854f3428eec4aa5ed84f4bdd2eef8b6d225caf9496df9edffd735ea54db1bdea883ad5d47eb0bd4a6653f0ab037f040a41517a7741f91e82fdb6fda04f0dfa1bcf8b9b37bf2bfbd87327a636f907fdf968d0189d1a11809c4230ba69d5cbd84f561bcac3ad002e558c5b9b097a01902f29ce3f1ec264153d668c78b845105b9cd2ef3c943531b75aa428f179e4b3418b1d5a4aa7ab1203efa495c8769628eb1063a937b73e4b5cd0cda33dab01a50c64febd975c57a1e841508e8606094d0824fdd96cc6cfa18fa8209b30f0a2a78eac9a767176f573e78c068809b199a69ac6d335d7c920999c40cbad87cf4cc7ca5c644291d75ad7a74bc1e6392d1ce311ecfd2ebc916e39eb6aa3e7d89fb805a27a55f178912b157bc01a055f67aefa78e55c806cbd9c01baf8ef92cad2260b4bb14cfe61782dee5c59972506941c462a4da7eb899531cf996bc98ba3629effe6fcd1706d1b4ee4f2a14e921bd408f30e12e73fb7aa860536b03e77ca937823281a16453fe827935943201e6ec143a67eefa4f94e9abf94f7e3d41b70a82be69ded8a53060c2305f42f62fe6a2f704b67a1e8fddc7d98ba7f3457119b311d449663ed9e320d618dc2368d4950875b9c38c5d8c03104e2e32c4325dedd2bc267e2accb0112018e9c5a8007ccab2f6d7c737792002acb730d72e9f730829ebc42ca564c1d9271bf1869c4d35835589b7431ef7a31a070060fe4a089fb11f2dd3dce65ae0fb45bc3a2860917d933ba2d090569ef5ed43bc2532db879e0f1f225eadcbef1c03d9ed78299e233e4cf07b064a7baac34c5a0c19fc3a5542089f70167be2f85b4a10e778525223be8ffd5cff9648b1005a098b4b3924398fb0bcabcc6edf30c061ece7aea35fe98a9203f8711369530feb5e67bb2d4f59d9c8bc993854dd4747cde399bd0e63740c1cc839ad0f098a38a80beadd648e1436deee60e931e68f52979ce49f301fe39afbb615352091c8b6585fe88447ed6e59a020b2bbe66a9423ae5228c203bfd4847b5181e2c3b4dad83a6d4fa76985eef76adde3b34edbdd28d6a0b4a4ee", "signature": "3ac80d1e8f68b4058c3a04dad7187373959f26a27002496f8afaaccd8bea0901c54cab87b2a2302e1f3625c2b06c7ebcf3ce96de3afdf00f5194a35e0552c70e" }, { "secret_key": "cc3138e502a5ff6f80d246366e84d65c59f12d4f496397e6eb99b5267b8cbe2a", "public_key": "9e2d3e88af7b52ddcf00e6d0c7759c1238b8fb3eb14421fe82c34833437835bd", "message": "585ecf2f09eb923df20a8555642a2bc0b68c6a5fcfd6b8401c4a0cbabb4c6e6a206762b7a39f2c5455d7808ebfbed56d6760a431c7d20c2dc6ef1b73caa3c49488e30b1ca2520ad20b26a19700780e5ef3ce0144388d8407b6a70c1cda37db7f12091d892f2e91ad4078bb4db1762e46285a7b664b2ad3a34d26d8a94d64587a84527722ea83cb8aa88984e1489743b4214ea6041aa18e55200954efc7edb319df947efbfc6c8d0fea48a131613465d8f4c49498f2269145c6dae50478052598e1ca3be0e33611571fa384771eee402cc2b1d84836c8f1ad28f2ad23dee9ff1d7e1f2521635874115def4d93e89be76180bc55f761144360a8b222892d64d157ccb5d8f4855dca56701495a0e1002d340a4a46156b9b7fe06b7c0759e0b6df559b691ede78b55af64e7c8dd908b788dd6ba35a902c81dceb3788b615de225afa58a81181ab24a73705ee838b6e863fe1bcc26c1b943239230c27c6b397b23d13de6a02c97f3645da91d413f916473b018a61594b6f51cea44457da1e3dbbba6de16866657e92ef0202718a84ad0333e8336b052b004733e8e95ec13e5f91b3806a98d3db729fb735b8147c4a982a2d5b4efae9c09d0a9bf891cbbc3c8f531e76e4044ec91f4d7c5cf77310e2b2cde2e07ccf3e0a19dd6ae1b3fcb2df42186e9c72922d2d4ce51b306e81b16cfcf8f00d513fbd2c5239b45afc654f6fe21acb7e8a0c9aa87b0b605074df9576a6ddd900aca567617cb79656b3b5ecb9ff68b2f6241ed0d024ac27aa6eb486b69fdc0a0db92096abf86002dec7afd847a006a3f6955b49569053be9f1d0a49b793a5411e5916f418ecab953243553b66e6badc4e909be0ef5cc7c6d27199ec3f21423bc45773fb40b97b61185b57080e8f0b89a3ea57c8444ab27ecf7006a766047eeff54d8556cfed23def1da2cc8aebb48c94e779e8203ae2c902b51de0ede0456fb73fb4d5f514a4cebc47fec3f948469a545c6bc57b4138db34e7cc006de26ef507b54d28147567a8c29ac1ecef5bb84fb99aceb23a20294d74a85ae36b33450668a5c2609d3a93934586ff90c3b6d27329eeef3a754e9a9cbd5617ef3b09397bdc971370766589a12d890050d1651458b3fc533c843bffdf9754d932c4ed7611d4d27c32a087555b5eaa37ae90c4979ef54299c420ab5e29ae2845d4dcf2178920a865175fb9cc0e6b8c524b1ee495805d517bfe0", "signed": "a2700e3895ed0cc2aaf012a40bc7bd0bd29dd79c69c0b4a6edd0530cf3e267c0f82dd84edaf1744dc411d62c0028715258822d7b63d39705612b3fad4b5efb04585ecf2f09eb923df20a8555642a2bc0b68c6a5fcfd6b8401c4a0cbabb4c6e6a206762b7a39f2c5455d7808ebfbed56d6760a431c7d20c2dc6ef1b73caa3c49488e30b1ca2520ad20b26a19700780e5ef3ce0144388d8407b6a70c1cda37db7f12091d892f2e91ad4078bb4db1762e46285a7b664b2ad3a34d26d8a94d64587a84527722ea83cb8aa88984e1489743b4214ea6041aa18e55200954efc7edb319df947efbfc6c8d0fea48a131613465d8f4c49498f2269145c6dae50478052598e1ca3be0e33611571fa384771eee402cc2b1d84836c8f1ad28f2ad23dee9ff1d7e1f2521635874115def4d93e89be76180bc55f761144360a8b222892d64d157ccb5d8f4855dca56701495a0e1002d340a4a46156b9b7fe06b7c0759e0b6df559b691ede78b55af64e7c8dd908b788dd6ba35a902c81dceb3788b615de225afa58a81181ab24a73705ee838b6e863fe1bcc26c1b943239230c27c6b397b23d13de6a02c97f3645da91d413f916473b018a61594b6f51cea44457da1e3dbbba6de16866657e92ef0202718a84ad0333e8336b052b004733e8e95ec13e5f91b3806a98d3db729fb735b8147c4a982a2d5b4efae9c09d0a9bf891cbbc3c8f531e76e4044ec91f4d7c5cf77310e2b2cde2e07ccf3e0a19dd6ae1b3fcb2df42186e9c72922d2d4ce51b306e81b16cfcf8f00d513fbd2c5239b45afc654f6fe21acb7e8a0c9aa87b0b605074df9576a6ddd900aca567617cb79656b3b5ecb9ff68b2f6241ed0d024ac27aa6eb486b69fdc0a0db92096abf86002dec7afd847a006a3f6955b49569053be9f1d0a49b793a5411e5916f418ecab953243553b66e6badc4e909be0ef5cc7c6d27199ec3f21423bc45773fb40b97b61185b57080e8f0b89a3ea57c8444ab27ecf7006a766047eeff54d8556cfed23def1da2cc8aebb48c94e779e8203ae2c902b51de0ede0456fb73fb4d5f514a4cebc47fec3f948469a545c6bc57b4138db34e7cc006de26ef507b54d28147567a8c29ac1ecef5bb84fb99aceb23a20294d74a85ae36b33450668a5c2609d3a93934586ff90c3b6d27329eeef3a754e9a9cbd5617ef3b09397bdc971370766589a12d890050d1651458b3fc533c843bffdf9754d932c4ed7611d4d27c32a087555b5eaa37ae90c4979ef54299c420ab5e29ae2845d4dcf2178920a865175fb9cc0e6b8c524b1ee495805d517bfe0", "signature": "a2700e3895ed0cc2aaf012a40bc7bd0bd29dd79c69c0b4a6edd0530cf3e267c0f82dd84edaf1744dc411d62c0028715258822d7b63d39705612b3fad4b5efb04" }, { "secret_key": "5c692c681198b172df2fac2aec3fcf7015c2bb6830f2a98e30a396b64af4280e", "public_key": "33b169d4ca271040926ea87835e5066f9f05782f087fca7a556f7bf4cba2e886", "message": "b160ee3a93cf6bc3456e5bd0197c09aa76c2258052f9a34dbc2ed589f8dbe5ff9969a61cfe846b2f6739dc7d4a1496e9ad58605b5a2758ca078c55a9fc1c4eeb5491a84bfd468a2ceb141a773493a9b3ee828b5dde9c00c236ff0156e4e2e45fa07931da68bbd2030a881405c4f78728813a5e04812404c2a19c9b87b1cfe9af95e273ecf9c518c53935f842563b192fae12a73cef085fe19e899e5ba08979e311fb286fbfc7b248aabd40dc61610e1d4fc9806dd21292392db2db40426c5d196a489c5db77e3e9cf0bd041e3c23b5ba1db781a10790be1fe07a2b00ca3af89cbd46efce880e1ef28b0cd79d53b42cd80eaa137eff7df90bcbcf95c9858dc0ccc6d8ca8ae3547bdbf9ff9024f3cf170115eb28bf12b7d3b701460f48d1b4b23d7f6ff72ffdc9a6c52624d15312d7f19ddb6026a15eb54295d331fd79509103bc59a3b6e1ba7ac8c112e4de2817e51c1e16507ba66f2547bc899f69c1207ae5e37bdb0e161b15b612305bc0940f9d1b382a37ec2da639a6ecba1bcdfc51214c3223c11bbab79f3fae3d55e2d4be584fd7601e4e2e558b3be5707115a61f5a815ec24aac18093457bc46c05cfb7a3f2533eadadc9e6c1fe310779e697f683035ce57873df55d791f6d2fb0e2107e6866f839c3a126e9023865ced1bcf6779955af547e1d87eb32a9bf322857fd126b0cdc5d5e904eb76c6706e3c897aefd6e4756fb8aca8170ca5b39669089af1bb141a25d6b8b06034d8b11abf1ff8f8d43375846fa8fa8a34b5f264820744d31149b7d57326c59b1db74131678f634e7232ca5ea5188760a70dc35dc89f8e453b4c65b772c2b6b62768d8373236551baaf24d3c304c41b62c36e6a3383b3a163b73e78d8badb75741e5001d419d30e2ed77c3096e8d8df713b93762c9707bdd0f365a874b9da8ab710495dd56aea93bb77fb222635c63bce9f63af91fac89c66986b8e2176dd451d583394c1907cba1725f06d25d1d0912b3e5c6c7dcd34358fad59dbc6f6b1c2ef33d3ca82f43518fe4ff31378016e578a7bab0b77676ebae0d48d0889d69029d209f283ce8fe0ec23cd832adc12a9c3e3aec2d6036695556d9313f12a899dd59a66bef28ede175f8aaeeeb2942bb90892a04b440d04b66f5eeff61ada72790294ce55c86c6d92785ddd26c7a731603b069c603c92e4fe8ff782544c8e89b40b8b55f90e2a5e9a0f33c7fec77dad8152", "signed": "ad8f379caf41f72dccadc3e915357ab0cd304e10f4120e0dbbfaac01bffaf2be893f70072dc964069181bec17fe0251055b21e23dee4363b27ef1fff67aafe06b160ee3a93cf6bc3456e5bd0197c09aa76c2258052f9a34dbc2ed589f8dbe5ff9969a61cfe846b2f6739dc7d4a1496e9ad58605b5a2758ca078c55a9fc1c4eeb5491a84bfd468a2ceb141a773493a9b3ee828b5dde9c00c236ff0156e4e2e45fa07931da68bbd2030a881405c4f78728813a5e04812404c2a19c9b87b1cfe9af95e273ecf9c518c53935f842563b192fae12a73cef085fe19e899e5ba08979e311fb286fbfc7b248aabd40dc61610e1d4fc9806dd21292392db2db40426c5d196a489c5db77e3e9cf0bd041e3c23b5ba1db781a10790be1fe07a2b00ca3af89cbd46efce880e1ef28b0cd79d53b42cd80eaa137eff7df90bcbcf95c9858dc0ccc6d8ca8ae3547bdbf9ff9024f3cf170115eb28bf12b7d3b701460f48d1b4b23d7f6ff72ffdc9a6c52624d15312d7f19ddb6026a15eb54295d331fd79509103bc59a3b6e1ba7ac8c112e4de2817e51c1e16507ba66f2547bc899f69c1207ae5e37bdb0e161b15b612305bc0940f9d1b382a37ec2da639a6ecba1bcdfc51214c3223c11bbab79f3fae3d55e2d4be584fd7601e4e2e558b3be5707115a61f5a815ec24aac18093457bc46c05cfb7a3f2533eadadc9e6c1fe310779e697f683035ce57873df55d791f6d2fb0e2107e6866f839c3a126e9023865ced1bcf6779955af547e1d87eb32a9bf322857fd126b0cdc5d5e904eb76c6706e3c897aefd6e4756fb8aca8170ca5b39669089af1bb141a25d6b8b06034d8b11abf1ff8f8d43375846fa8fa8a34b5f264820744d31149b7d57326c59b1db74131678f634e7232ca5ea5188760a70dc35dc89f8e453b4c65b772c2b6b62768d8373236551baaf24d3c304c41b62c36e6a3383b3a163b73e78d8badb75741e5001d419d30e2ed77c3096e8d8df713b93762c9707bdd0f365a874b9da8ab710495dd56aea93bb77fb222635c63bce9f63af91fac89c66986b8e2176dd451d583394c1907cba1725f06d25d1d0912b3e5c6c7dcd34358fad59dbc6f6b1c2ef33d3ca82f43518fe4ff31378016e578a7bab0b77676ebae0d48d0889d69029d209f283ce8fe0ec23cd832adc12a9c3e3aec2d6036695556d9313f12a899dd59a66bef28ede175f8aaeeeb2942bb90892a04b440d04b66f5eeff61ada72790294ce55c86c6d92785ddd26c7a731603b069c603c92e4fe8ff782544c8e89b40b8b55f90e2a5e9a0f33c7fec77dad8152", "signature": "ad8f379caf41f72dccadc3e915357ab0cd304e10f4120e0dbbfaac01bffaf2be893f70072dc964069181bec17fe0251055b21e23dee4363b27ef1fff67aafe06" }, { "secret_key": "9d5f85d2e7dfd03bb689d900285fd4461538a5f2710a13ed21c775f6eff6b3ff", "public_key": "b86797e4be0286ae39e44df0a00c016db4555ef86f2f05d0a3ed89d89a4c3e5e", "message": "f70b5b053a4672512c24b3168392f6a17dd77d8689c21c86efc25829a1a04fab4f76c8521684d32010455907a26908677b40dc6947d654f2914c30ecee724fa68446b59d091e258fc862411c964d668def83034b627ed416dc190bb5a263a6ff8d559e13b8936225fb4dab4f7bda0468e547e708cb04cebe1e5cfc69f76a1d283f28168286f24ecea5535e4490a0c55567a7345ef953ce426b209a3de3df595e80ee61e572a278ab02219551b73da41984808285a83598a02d9b28671210004e31d8af9242c16f90d5ea8f63a1ff66cfe60ecbe537245fa12a9b154115295806ea2d11f3671782b9af4fa86a1288e123cfd2409a5dc98f41b8f6df299bbcc4bb6447dc03a6d60e9b2c5b8ffc40d983956be97768dd0612d47cbfa7571c9969856c152cd3b473ace0b8a144aac2095c0f72f1d3147152b908ef6626d5222819b20bb3350a46452f675490c2a82150eec40d75b66a325d6e929a905ade1e3160ab950181efc66e59230865d5e599698a8a3ff560c4c601a7a9a5da3b5d89bca93f7cf5bcf5bd5ecff8f1a185c8220e4c77821e62adf95a037f2df7cef43a4c60ac75801e9fccdc5b08eed328dd93100904115645ec1ee085cc778b0f4e46e17298984a702eceb3e15283d820004f74a079520d63a75fae33ec3f4b836469e1aa99ea244af1fb08b00a8c9dfd03308dfc20235ea9c8283f4da47cfbcdbd031a02d164160f2a58986700b19526d41e4d7fd458434d7264bc8eb642e6d8dd2759ce2b85c97b3702e70da71f18edc53e9140a645627e0278e8e70539037484dcd18c62fa330717d6148a0d623ff8b65ea8567ec7fa04c892e3a1ecee96e832f4155074c83cbc93e98cc67f1fa112aa06e9915fa4d2dea931551e7c623aa8a3a7619ea24ff914e264f31fc73dfa8c430ac46ce16dc968c5a4085d5c380d30cdc6f43dee806f38d1df420a065574144737056daa62f0c098c9c52fcc04cca642c45d687345a094613d4a3c6c8788bfa218538ad7ece1bdb6c93924eec4baaa3eb15dc1494d65ffa1a23ff8e985263408fb02bfe39a8c55b300b1a02ed36c6714dd5ab750d47f021f65e08c635f1d6b7baf396cb4f93d56c1ca461bb12e94de7e5d98659a8af0bf019fc42280e111e04800ff80e0c157150e165609454281b20007e3edfaa1ea854465547a006a4c3236411495da166098af2823a459cf100a1f3c92c6390c6066cdbf", "signed": "176b9592f8c25135292add4daacc9c4faa21d4f49b278480c4e8881c01624df9a37e23e18e84ca32d0d8cb851054222f10a495419f197e7b3d18df0adfb1b307f70b5b053a4672512c24b3168392f6a17dd77d8689c21c86efc25829a1a04fab4f76c8521684d32010455907a26908677b40dc6947d654f2914c30ecee724fa68446b59d091e258fc862411c964d668def83034b627ed416dc190bb5a263a6ff8d559e13b8936225fb4dab4f7bda0468e547e708cb04cebe1e5cfc69f76a1d283f28168286f24ecea5535e4490a0c55567a7345ef953ce426b209a3de3df595e80ee61e572a278ab02219551b73da41984808285a83598a02d9b28671210004e31d8af9242c16f90d5ea8f63a1ff66cfe60ecbe537245fa12a9b154115295806ea2d11f3671782b9af4fa86a1288e123cfd2409a5dc98f41b8f6df299bbcc4bb6447dc03a6d60e9b2c5b8ffc40d983956be97768dd0612d47cbfa7571c9969856c152cd3b473ace0b8a144aac2095c0f72f1d3147152b908ef6626d5222819b20bb3350a46452f675490c2a82150eec40d75b66a325d6e929a905ade1e3160ab950181efc66e59230865d5e599698a8a3ff560c4c601a7a9a5da3b5d89bca93f7cf5bcf5bd5ecff8f1a185c8220e4c77821e62adf95a037f2df7cef43a4c60ac75801e9fccdc5b08eed328dd93100904115645ec1ee085cc778b0f4e46e17298984a702eceb3e15283d820004f74a079520d63a75fae33ec3f4b836469e1aa99ea244af1fb08b00a8c9dfd03308dfc20235ea9c8283f4da47cfbcdbd031a02d164160f2a58986700b19526d41e4d7fd458434d7264bc8eb642e6d8dd2759ce2b85c97b3702e70da71f18edc53e9140a645627e0278e8e70539037484dcd18c62fa330717d6148a0d623ff8b65ea8567ec7fa04c892e3a1ecee96e832f4155074c83cbc93e98cc67f1fa112aa06e9915fa4d2dea931551e7c623aa8a3a7619ea24ff914e264f31fc73dfa8c430ac46ce16dc968c5a4085d5c380d30cdc6f43dee806f38d1df420a065574144737056daa62f0c098c9c52fcc04cca642c45d687345a094613d4a3c6c8788bfa218538ad7ece1bdb6c93924eec4baaa3eb15dc1494d65ffa1a23ff8e985263408fb02bfe39a8c55b300b1a02ed36c6714dd5ab750d47f021f65e08c635f1d6b7baf396cb4f93d56c1ca461bb12e94de7e5d98659a8af0bf019fc42280e111e04800ff80e0c157150e165609454281b20007e3edfaa1ea854465547a006a4c3236411495da166098af2823a459cf100a1f3c92c6390c6066cdbf", "signature": "176b9592f8c25135292add4daacc9c4faa21d4f49b278480c4e8881c01624df9a37e23e18e84ca32d0d8cb851054222f10a495419f197e7b3d18df0adfb1b307" }, { "secret_key": "4aaf2d132884f30d1127cf187ee09388b4a5c44a9a9267e6728317398951fb61", "public_key": "83727e9257349128559ebf759fdc82122cce76746639c0ada9761f0d60b940b1", "message": "d73eaf11413bf4d5bccf6a2e809cd6832a51823aa22bd16e09cf56ff045eef2d1adadda50c2ebd67bbc4d70e493c968cb4de4977065d4463300694c9caa57206d6664693d8462c3c576b525cc7acf79f26f9055a1bcfa7d077f45ebe0b2d481ebd63f7340a33e4ab68f1604975ec1dfec45a791a2abb1044d75a4db55adf59b8394ebde6824c21145b00ef3b1b08ed11fd51dda514ed7e21e54dbaf6abb6d9e317fcf9fd375b18764e64ac9be5b08fec3b78abbab1d12a2ab09d559acdc7133fb2e0008e0c114b7cadb4bf763078674d03e9c807bec1e2ca71adcdaa310d587fa56950fc0fb2e979043d50f9ae23fa8f821cd9d6232789d0eeccfc4f47e3ad804e25cf5a425f94377d17874833e6ae3638178c78b79519d64d9793f4504606a0eab68707f6e1f7cccb515be3d1201bcd19f2f0e255c722eab12b43aff8c8c5561125fbca1f6542076a06152eb7e4b0786324c2495e79d79c0a8e295bb2e3dfd05a9033190065a284552a6e736006ace41f97cc434a2512051b727ce5bc9c4a75529ec53dd7d1f126e793857747b5ba8d03155d4555f59e8baf2f0cdba871ac160e7519a852db004f701641a40a422d4c38b6c0c3cc8fbbd05322ddc0001fb867286e296cbd69862cbccc7447038eb30f8a8123b7b31373984702c3be457a4b8c54e6e5280485a2c4ff84521f298ddeb3b3b2bc91f114ddce67030248044469dc06f362f2919a3fece5082375d04080376fe219d9b4575b1cf1c9ec4dcac5749fc778f515dda13fa0d586c264b9bb61503310762c789ca11608d2fee674c70ac4fc6d5ebcf68c4ab89bd84555fc007523c28a7e1dd08a9862044d5245b91a8778ec9ee984a41a9e13b7abd657ae2a46ae860152c644acd95367678ff64cc54006e36614805ed618a7c6d0fd33a908523090841c230af09846d132bb4c6b60e2441f9d3c498714f470f6bc03a80d14a294b565d1d5e781cffcb1304efdbbc7bfeabdedc857acc42e2762bbf97af839a166752da295672817f10dbd472d381f53165555ac8222a78535a86805f1bed422889f206109aa74772edc0bb51e8a9840cf62c92fa635b90cae076dd50e5aed9deac843fa8a6b539988285ff1adabe4c7b83d9e29ac2d94092daafec9f6673689ba9e9252d864d7577aa89505d331fe7809861277002a0b44a96ba6ae4a52b3548bf268e777780c00209b245f8b1417ee5e701a12334ad5", "signed": "5f11df3906a712a953f47c859806b5237358d08ba95e49f9e530a37165835e9359d9769dc21fbb4d44497b93905bca8d9917c728493fee3acd5b521dbd1e2408d73eaf11413bf4d5bccf6a2e809cd6832a51823aa22bd16e09cf56ff045eef2d1adadda50c2ebd67bbc4d70e493c968cb4de4977065d4463300694c9caa57206d6664693d8462c3c576b525cc7acf79f26f9055a1bcfa7d077f45ebe0b2d481ebd63f7340a33e4ab68f1604975ec1dfec45a791a2abb1044d75a4db55adf59b8394ebde6824c21145b00ef3b1b08ed11fd51dda514ed7e21e54dbaf6abb6d9e317fcf9fd375b18764e64ac9be5b08fec3b78abbab1d12a2ab09d559acdc7133fb2e0008e0c114b7cadb4bf763078674d03e9c807bec1e2ca71adcdaa310d587fa56950fc0fb2e979043d50f9ae23fa8f821cd9d6232789d0eeccfc4f47e3ad804e25cf5a425f94377d17874833e6ae3638178c78b79519d64d9793f4504606a0eab68707f6e1f7cccb515be3d1201bcd19f2f0e255c722eab12b43aff8c8c5561125fbca1f6542076a06152eb7e4b0786324c2495e79d79c0a8e295bb2e3dfd05a9033190065a284552a6e736006ace41f97cc434a2512051b727ce5bc9c4a75529ec53dd7d1f126e793857747b5ba8d03155d4555f59e8baf2f0cdba871ac160e7519a852db004f701641a40a422d4c38b6c0c3cc8fbbd05322ddc0001fb867286e296cbd69862cbccc7447038eb30f8a8123b7b31373984702c3be457a4b8c54e6e5280485a2c4ff84521f298ddeb3b3b2bc91f114ddce67030248044469dc06f362f2919a3fece5082375d04080376fe219d9b4575b1cf1c9ec4dcac5749fc778f515dda13fa0d586c264b9bb61503310762c789ca11608d2fee674c70ac4fc6d5ebcf68c4ab89bd84555fc007523c28a7e1dd08a9862044d5245b91a8778ec9ee984a41a9e13b7abd657ae2a46ae860152c644acd95367678ff64cc54006e36614805ed618a7c6d0fd33a908523090841c230af09846d132bb4c6b60e2441f9d3c498714f470f6bc03a80d14a294b565d1d5e781cffcb1304efdbbc7bfeabdedc857acc42e2762bbf97af839a166752da295672817f10dbd472d381f53165555ac8222a78535a86805f1bed422889f206109aa74772edc0bb51e8a9840cf62c92fa635b90cae076dd50e5aed9deac843fa8a6b539988285ff1adabe4c7b83d9e29ac2d94092daafec9f6673689ba9e9252d864d7577aa89505d331fe7809861277002a0b44a96ba6ae4a52b3548bf268e777780c00209b245f8b1417ee5e701a12334ad5", "signature": "5f11df3906a712a953f47c859806b5237358d08ba95e49f9e530a37165835e9359d9769dc21fbb4d44497b93905bca8d9917c728493fee3acd5b521dbd1e2408" }, { "secret_key": "4bc7daabc5407c226d1920db4afd21b2a5b3e59b8e9246053f6a1a6afa54e7e7", "public_key": "dc539885fc7bee002ac5debae16bddbe4b553fa15e81ee798876940f38cfc4c5", "message": "6acce99843b241afe6edd5d0ab78d0fb21c8c35aff881389d505f2f1dd91af1eb2ad229254927c7f0ecfb7a8141690573a655d69853d74d0708bf8b1e60a03963028a625b79f3dfea2b113ffcab46f3cfd4a621e8fd8ff0a968143b0ae03ccb6f42e25e2d74dbf515bc358699b635009b01d61fe597f1dc2c35a7ba4555278ee0ea456c7d35fa8757a417924b1d0a8351f226a13ec29d025b42696ec1d9925b769cd59c8e2f9cd3ce4e5c020e051e7a36f3f97c1e8ec71974bc16ac4de4651ad4df2e9c0eed686924224fe6de6c60dd4acc26e0aabd80c21d509d959b80b4353958d00e44c511d23bcf44552608bfa56a9c5ae79de62bb23f11d740f48240c27e101999751f2534742c0a6913ff64b683a18995abc393feb9d57c71f49a080557298cc405d11b7988d7116840c5adaf53bc672b46923cc457c7039940ad4d5bf073c6c886b1339525926d281dbd1a79739b2e36414cbd321b185fc88f18d2f81c809975be9a093644cc559ed2ae5cc0e35cbdd1811f70286057a3f703067edddf5eb1690a7427bb73fe3024ed0db82a5ce8f1716428a76fd292ba99a300c4b2f360da2124617590b10e3b162a6e67dd5d5a59bcca10f610fa064affd55f8483b98a68d076f278abf888a08a014e0ea499180fbc79840ceed13cc6b2458bfab9b0dd7ae9d86461fe215e7c9f63f768cee4a882df0dd84e3eb4f2d7f6b18fa57d8bc7d9afb63c21ac465e7903b9bfb8638a29361f7ebfc6e54e5465a6cef463ae22643ae410258779ca74b70401a9455a4d157d74a7029efe6b519a8c4be696756e045ae4081b77dd6031f0d250fa761e60f859d9063fc105aa0a1a7450af153e705477777c442586df407402ba238752faef74f3345c26a4533be9a61f5fc6bde48e3cba75c04d6f7b333e37006dd0c94fd3b6a130bd6fcdb3c6abe21ca60eb431cc2d8a2ece7169d2dcfce2760825657fd4c26f3c3b830acdfd508011d14764b3be91715571a3183018e0d221fb9532bb2e1711e725a273ae0cc2faccba7d5504929459c992517b05c1ddd03aaccd937b86eb67bc8202d01cab3d489586eea1acca7dc20cd0b6475c258ff673661496a22ea96b89db4bf3fcaae3bb04f67db096a47ff7e1ee239562dc10d40f053944f3d7bcc3ff4c0ff765654ba5ea64f0ea63e45a21d9b12949f14f7ea7074e9b659c5c5d44816842de89698a8fccace43eb6b4135e0b333ac", "signed": "a7a6488839bbae04dec92f96d728c464685d7a96df512b0051163d22538f74546fa986b1b60a6d8cc766a26c6984c9cd2688395898e2b2ae72dc6a2d5a9f750e6acce99843b241afe6edd5d0ab78d0fb21c8c35aff881389d505f2f1dd91af1eb2ad229254927c7f0ecfb7a8141690573a655d69853d74d0708bf8b1e60a03963028a625b79f3dfea2b113ffcab46f3cfd4a621e8fd8ff0a968143b0ae03ccb6f42e25e2d74dbf515bc358699b635009b01d61fe597f1dc2c35a7ba4555278ee0ea456c7d35fa8757a417924b1d0a8351f226a13ec29d025b42696ec1d9925b769cd59c8e2f9cd3ce4e5c020e051e7a36f3f97c1e8ec71974bc16ac4de4651ad4df2e9c0eed686924224fe6de6c60dd4acc26e0aabd80c21d509d959b80b4353958d00e44c511d23bcf44552608bfa56a9c5ae79de62bb23f11d740f48240c27e101999751f2534742c0a6913ff64b683a18995abc393feb9d57c71f49a080557298cc405d11b7988d7116840c5adaf53bc672b46923cc457c7039940ad4d5bf073c6c886b1339525926d281dbd1a79739b2e36414cbd321b185fc88f18d2f81c809975be9a093644cc559ed2ae5cc0e35cbdd1811f70286057a3f703067edddf5eb1690a7427bb73fe3024ed0db82a5ce8f1716428a76fd292ba99a300c4b2f360da2124617590b10e3b162a6e67dd5d5a59bcca10f610fa064affd55f8483b98a68d076f278abf888a08a014e0ea499180fbc79840ceed13cc6b2458bfab9b0dd7ae9d86461fe215e7c9f63f768cee4a882df0dd84e3eb4f2d7f6b18fa57d8bc7d9afb63c21ac465e7903b9bfb8638a29361f7ebfc6e54e5465a6cef463ae22643ae410258779ca74b70401a9455a4d157d74a7029efe6b519a8c4be696756e045ae4081b77dd6031f0d250fa761e60f859d9063fc105aa0a1a7450af153e705477777c442586df407402ba238752faef74f3345c26a4533be9a61f5fc6bde48e3cba75c04d6f7b333e37006dd0c94fd3b6a130bd6fcdb3c6abe21ca60eb431cc2d8a2ece7169d2dcfce2760825657fd4c26f3c3b830acdfd508011d14764b3be91715571a3183018e0d221fb9532bb2e1711e725a273ae0cc2faccba7d5504929459c992517b05c1ddd03aaccd937b86eb67bc8202d01cab3d489586eea1acca7dc20cd0b6475c258ff673661496a22ea96b89db4bf3fcaae3bb04f67db096a47ff7e1ee239562dc10d40f053944f3d7bcc3ff4c0ff765654ba5ea64f0ea63e45a21d9b12949f14f7ea7074e9b659c5c5d44816842de89698a8fccace43eb6b4135e0b333ac", "signature": "a7a6488839bbae04dec92f96d728c464685d7a96df512b0051163d22538f74546fa986b1b60a6d8cc766a26c6984c9cd2688395898e2b2ae72dc6a2d5a9f750e" }, { "secret_key": "f26af210e3b20173990c7745922cdf9424773abb374d777a512cf5b97b3a000d", "public_key": "54586abf041176e06aec5b6010e190916da54a8c4bde288cf24d8c107cb3b730", "message": "88e26da35c54884b47146f4e3f014ab65b3d71aa7e3c3391adbeb19ef2e7b9302e281991b261b6a0992e2e89a49f480ca2d8e684b12f9b1509b38f6a7a98a5ddb4c2d869fd0318e98ecd8fd9df491baf99a9294de49e1cf8dd41ee85730af025a701143e4f0c8e3d92d55b59ca7d4a6c89ad760dffc0c2189209508ef6c2214edf9967b17def123d8692c9e4e20b1e98268808704f5f9fe1a6d6055e32c872564bd17edb7359578629017f0c30feab8b504e228923adc7e81ae20a852db0ad676a78e081336d6b0402f9cdc5d5e90128ca945d10515ca0c5ef03f731b1d40a710741d41c1dd1ca16b1060febf2a0532e6f5d7651ef446375ec18090cb8418b8202f25a0389031b307f223c5b5f6afe36a9adc1068f2c6e0ea5b2b6cfeb8dc004f7b829c80439069b81a7bd907477c6135ef282b771f141dbe75a0fa056e06b8a1a1f98c25fa54d14c8fdb42d6502595c59d25bacf1a19adefcc13170f7a4317b6ab610b609d414b0073ea04ac29eb10ee73cd71a4ca60409f8e760e60f939510100d0c8cd76f264bb37811f97aa5299ac0b12d4168ff38ecdfa80b1e5c1b3bbd4d40d3544735df7167eb158a9a9a234d445f1d663ded7171edc68d172c92214b82ef13fe6b8c43aa89b739b4990ae947a34f020a8d8943b0f7a5d61dfa76adde0272e98c1159c0fd8a1de33f2cef8edd32857b2189ed96128057ebdea81f7a3a3dffe1893b5ba877556c90383fa2c5a6fd680e8a67dee4802d90dfe971623a7be22ab3ca56067b1e5c694aa84c19f16d69e284ddfa039c108d0435813812390d8ebc1e50138176f259dc0f26bca13bc943f50d5a3500b18d593574c620fc097ace430fb80728d3a1aa644e504b1009ad67536ceb011f2a357dbd009e4a63f524d5b5957f331567c5b4d185a61df22d7071d31ae92141e199c12289515aed80c91021456bcd45ccc634037dcf69b41d6b1ff53471010d99f187f04654f43622287871fee6dcf5f3023cbd0913d99aff43fa95b32ea2b133b4c9ac4b017b7cf8f9be5086fe92b42cb8dbed5b630bf097c18e2e55c3dd93271e09c2d1cc6af87d83fdef3c3e3c4cbafbea9b60fd5e9cf0011de2e9e26fbf09afeef5c69802a6c46bdf54c145862944173e017e30149ea5c03c7aefa28a9cac7767002ea3fefbdeae5bae005c370dbc064244d5b9be5500a35726a99bc9e8c2752d510e139af225580098c8189aa9c520", "signed": "ce454530b922ba5ea162f1a452e05c00363a49a9db8a569497c00caf1cbea99180770554ed4e3140dfca4555159ebf48ef5d2a50f394aebd782116ed6569a40988e26da35c54884b47146f4e3f014ab65b3d71aa7e3c3391adbeb19ef2e7b9302e281991b261b6a0992e2e89a49f480ca2d8e684b12f9b1509b38f6a7a98a5ddb4c2d869fd0318e98ecd8fd9df491baf99a9294de49e1cf8dd41ee85730af025a701143e4f0c8e3d92d55b59ca7d4a6c89ad760dffc0c2189209508ef6c2214edf9967b17def123d8692c9e4e20b1e98268808704f5f9fe1a6d6055e32c872564bd17edb7359578629017f0c30feab8b504e228923adc7e81ae20a852db0ad676a78e081336d6b0402f9cdc5d5e90128ca945d10515ca0c5ef03f731b1d40a710741d41c1dd1ca16b1060febf2a0532e6f5d7651ef446375ec18090cb8418b8202f25a0389031b307f223c5b5f6afe36a9adc1068f2c6e0ea5b2b6cfeb8dc004f7b829c80439069b81a7bd907477c6135ef282b771f141dbe75a0fa056e06b8a1a1f98c25fa54d14c8fdb42d6502595c59d25bacf1a19adefcc13170f7a4317b6ab610b609d414b0073ea04ac29eb10ee73cd71a4ca60409f8e760e60f939510100d0c8cd76f264bb37811f97aa5299ac0b12d4168ff38ecdfa80b1e5c1b3bbd4d40d3544735df7167eb158a9a9a234d445f1d663ded7171edc68d172c92214b82ef13fe6b8c43aa89b739b4990ae947a34f020a8d8943b0f7a5d61dfa76adde0272e98c1159c0fd8a1de33f2cef8edd32857b2189ed96128057ebdea81f7a3a3dffe1893b5ba877556c90383fa2c5a6fd680e8a67dee4802d90dfe971623a7be22ab3ca56067b1e5c694aa84c19f16d69e284ddfa039c108d0435813812390d8ebc1e50138176f259dc0f26bca13bc943f50d5a3500b18d593574c620fc097ace430fb80728d3a1aa644e504b1009ad67536ceb011f2a357dbd009e4a63f524d5b5957f331567c5b4d185a61df22d7071d31ae92141e199c12289515aed80c91021456bcd45ccc634037dcf69b41d6b1ff53471010d99f187f04654f43622287871fee6dcf5f3023cbd0913d99aff43fa95b32ea2b133b4c9ac4b017b7cf8f9be5086fe92b42cb8dbed5b630bf097c18e2e55c3dd93271e09c2d1cc6af87d83fdef3c3e3c4cbafbea9b60fd5e9cf0011de2e9e26fbf09afeef5c69802a6c46bdf54c145862944173e017e30149ea5c03c7aefa28a9cac7767002ea3fefbdeae5bae005c370dbc064244d5b9be5500a35726a99bc9e8c2752d510e139af225580098c8189aa9c520", "signature": "ce454530b922ba5ea162f1a452e05c00363a49a9db8a569497c00caf1cbea99180770554ed4e3140dfca4555159ebf48ef5d2a50f394aebd782116ed6569a409" }, { "secret_key": "39bffe007f8df7ce4e56fd176b102b923ba48aeb8269fd0cd520c23a7b236e6c", "public_key": "9532636800010b3dd4012e341fcad6d29afad484e6fd736e89d5bc02ba0ac853", "message": "7a8c20bf2eff69af8bad6bdfabc7909c58ce746cc4df78b69b33c105ba3bd8da75244758b5172d5c4501bc39970185ee3d437083a9959f81e7665b829a69a5d72e034d351adddceb3d3fff589988df182b46fa53d26e7c9eac062215788f2337bf90f0177d8ca744f95f28fea854593c4362c82e9ded19b904ff99d2bea82432822e52c3da6d462da754ff1f8bd109942df51dba25b7cde838d5f524239f1331f463194e10ff56795b296878feb1f55d43ec7daf0ca5ab3d684b55bb0aa4c720d4b5c2e830c858694d3d0fdbaad0bf67d873182d95b2412fce5e7b00fa6bfc38b132efb96f87bc6c10070a5716ec9b33a2692cdf5bc41c7f737e28c4220317a489b7323d5e20f65d375d769f9e79376fd02d85368671e7e081eb753f888545ebe5c000b2f80143eb358d43185e2f1c294b9f29c8bb91482d4387494aad176deb85540fd005c97d13e6663f09944eb43a46e6236794bf6e21f81d0a42090f9ccef90a6c4807b5ff541300e5934881a8d92196b4cee85d28092a828ea3bfc6b745ad219be9f5e9574117d079e02f4b748e2cc01a32826a3708231914d2772c764119fd99d53ab5b5a2e9d891a48a9aaaacc26338b18248db8ab2d525daf15ff53acbc3aa98d4f2d4a337bbaf6d1be21985a4af600e29bbb42c8d89e6b389c66f42270c3a0b051bdb623881e02f2f4294cec3476386747abae6c7700b8f9b0387cddfb73668fb57693d8474196b33abd12dce59a57cf72ee6cc1ddbaadfb19e90af8131b3a90f9867f4c7e15bdf9e218477016bd0ad3be8dd059671ff656cbd4ed898086de4d423f3dfb270bbf19d9f53f7f6f2d22c6ac9025cbadba442e31d9811e37e847dbd484d80cf743039ffa7048470fbdc6080f6d381dc7e3fa27122df53cc06394ea6fc446e1ba72538733ed3abb685f16dfd5ccf585ae8fbf9954b50f10b7e5432a22b369406a9b7088961f0ae207495ae7185396dccf292dc463f41f376a1ca89eefbae19269152031bfd815288e8b5baf348c4f8ff3dff4fd6d108f871daa352110fa64188b01b8526a845aaed133e456b4c83c4fd4bbb165b4090307e8eb17df176c322520f37599c2105aa8120758394a4222473476764cf0af7c55183eba9683d7270631443f3c51fb8ab0c130ac436ab603ff4f1d8656cdbed229a202b40008ea10b171542f74a70b7bbacc4016b7f636aa89633b7668058f13312f57c5162d18e399e", "signed": "a27cca4b9f5b95ad0e44e4740c15deaeb93f22a9b254ebbd2329365a00966c9f4ec1e55c5894e7bfc23d398d3970b9465e98a8d23e72dae8e350da3531ae69087a8c20bf2eff69af8bad6bdfabc7909c58ce746cc4df78b69b33c105ba3bd8da75244758b5172d5c4501bc39970185ee3d437083a9959f81e7665b829a69a5d72e034d351adddceb3d3fff589988df182b46fa53d26e7c9eac062215788f2337bf90f0177d8ca744f95f28fea854593c4362c82e9ded19b904ff99d2bea82432822e52c3da6d462da754ff1f8bd109942df51dba25b7cde838d5f524239f1331f463194e10ff56795b296878feb1f55d43ec7daf0ca5ab3d684b55bb0aa4c720d4b5c2e830c858694d3d0fdbaad0bf67d873182d95b2412fce5e7b00fa6bfc38b132efb96f87bc6c10070a5716ec9b33a2692cdf5bc41c7f737e28c4220317a489b7323d5e20f65d375d769f9e79376fd02d85368671e7e081eb753f888545ebe5c000b2f80143eb358d43185e2f1c294b9f29c8bb91482d4387494aad176deb85540fd005c97d13e6663f09944eb43a46e6236794bf6e21f81d0a42090f9ccef90a6c4807b5ff541300e5934881a8d92196b4cee85d28092a828ea3bfc6b745ad219be9f5e9574117d079e02f4b748e2cc01a32826a3708231914d2772c764119fd99d53ab5b5a2e9d891a48a9aaaacc26338b18248db8ab2d525daf15ff53acbc3aa98d4f2d4a337bbaf6d1be21985a4af600e29bbb42c8d89e6b389c66f42270c3a0b051bdb623881e02f2f4294cec3476386747abae6c7700b8f9b0387cddfb73668fb57693d8474196b33abd12dce59a57cf72ee6cc1ddbaadfb19e90af8131b3a90f9867f4c7e15bdf9e218477016bd0ad3be8dd059671ff656cbd4ed898086de4d423f3dfb270bbf19d9f53f7f6f2d22c6ac9025cbadba442e31d9811e37e847dbd484d80cf743039ffa7048470fbdc6080f6d381dc7e3fa27122df53cc06394ea6fc446e1ba72538733ed3abb685f16dfd5ccf585ae8fbf9954b50f10b7e5432a22b369406a9b7088961f0ae207495ae7185396dccf292dc463f41f376a1ca89eefbae19269152031bfd815288e8b5baf348c4f8ff3dff4fd6d108f871daa352110fa64188b01b8526a845aaed133e456b4c83c4fd4bbb165b4090307e8eb17df176c322520f37599c2105aa8120758394a4222473476764cf0af7c55183eba9683d7270631443f3c51fb8ab0c130ac436ab603ff4f1d8656cdbed229a202b40008ea10b171542f74a70b7bbacc4016b7f636aa89633b7668058f13312f57c5162d18e399e", "signature": "a27cca4b9f5b95ad0e44e4740c15deaeb93f22a9b254ebbd2329365a00966c9f4ec1e55c5894e7bfc23d398d3970b9465e98a8d23e72dae8e350da3531ae6908" }, { "secret_key": "3c4080cda0fc3c03b614d980f2ff831f5be0e7a981d5381a1618e0b8fd001776", "public_key": "f1c3269d870402caa43882135d9dbadbbb162dfca0b3dad197e6b8a7ee679a70", "message": "0ceebc0e8a47720f25835e2b9acf891bcca4bda38637f363274458baa9e2bbafedd0938f5688734e22ac50fb120f665f6c4c61c6531739b929ac83cd77f8963b754488b9b859c13853637cf025c14e8fdd118faa14cf3930ceb35f104d95441e56489440f62041ef1aa7c4b08b2807e32bb9584b9004d76e76533348506d64f112e1ff6f938f642230bf38af010e41987270248b13635a3567b355bba5b57448c6d13b74f3bebf617915821028fca5defa4ce5424ca191cd54a22944a3d940e4ee2e2ba5d504c85f959b514c4fab41ccb5743d9cb2f9bf33d1d8c2a5869e9f4660c3fb224b39141e3110c9ee8aeb871e14c62c6be38fb9a4568d736810bb9d2073178b6c7e87e3582efc62b53c23c5d46520ba33ffb3a9ca649ef26fe74a3cff6188427326b8c96f74354cb3ecaa611b12cded565e59fe1f8f400097e93ea85951b5b4e9009eea7db937e4349c4e5e00c4456c6c5f4e57411baf4e46e700ac400257765f48dab03e439f76c1499b5108047c830109dce7f740d1393787e29d3716d3c47e755cb828e7d440a971975197ebdb3f9b737ba11f7fd0386a959249017de7234d5e5a9b473bb9583a3742c774ee552a12a1f36eb3f26c885bed22e91c74cf32a8dd3edb08b674bf386ef427727912d57c5fafaa1cfeb740cd52b9dee995e3d0161cd9213f38fd681d538ab8bf97b745f54980030ef8b72696d4e27473fb0f1acd5d0aae0297211680ea0fc59d7b6d51c63292585a1d553d0c8954b42a4bd6fcd3a49575bf5c88953f1f4ea7fe0ed7a579d1697e645e2a61c69d1a56bc605bb04060a2778d509a8aadbf35d94697ccee9d3543dd01281a031f2a0eb3a9eb13ae56ff44fa0aed4f3488747d6af820f3989b7133f449ea56d3a7f731e791b7ed2a5db939bb75352de7daec5066fd57557165adffa631cd3f967c3c7cfc11cc1f14fa23defec3eb0239b45ed601a3a8078ccfc7f8380902a859ee9ce2db795efaca0a01dc0879d506ac97d10704d7757b3ccf3b37c339b42db23782278023e4c2e77d74246c9e544149a55c0c920ebf2986b4c5b4b3572f748c4b15c7f863999bc5132adad09761eb76505019769fb55422f603184e24c0d4f3761987b5c50feafcce53302a3a415e20f56a054803e553bacd242a5e1364aa3b2d7cb3bc1e1b86a47431cbd39695b67f554c4645b7236904094c11aa1b40326ba91b8bf4873e9a4de04e2bf4625972", "signed": "c9d4a4728b8fdd240d9c498aa35de95a4bbd51785b73c8403fdf040dfaed9447efad0069b67c783d4b81d966bef6e3d9a808a0584b98ec2b18322c4c920eb00a0ceebc0e8a47720f25835e2b9acf891bcca4bda38637f363274458baa9e2bbafedd0938f5688734e22ac50fb120f665f6c4c61c6531739b929ac83cd77f8963b754488b9b859c13853637cf025c14e8fdd118faa14cf3930ceb35f104d95441e56489440f62041ef1aa7c4b08b2807e32bb9584b9004d76e76533348506d64f112e1ff6f938f642230bf38af010e41987270248b13635a3567b355bba5b57448c6d13b74f3bebf617915821028fca5defa4ce5424ca191cd54a22944a3d940e4ee2e2ba5d504c85f959b514c4fab41ccb5743d9cb2f9bf33d1d8c2a5869e9f4660c3fb224b39141e3110c9ee8aeb871e14c62c6be38fb9a4568d736810bb9d2073178b6c7e87e3582efc62b53c23c5d46520ba33ffb3a9ca649ef26fe74a3cff6188427326b8c96f74354cb3ecaa611b12cded565e59fe1f8f400097e93ea85951b5b4e9009eea7db937e4349c4e5e00c4456c6c5f4e57411baf4e46e700ac400257765f48dab03e439f76c1499b5108047c830109dce7f740d1393787e29d3716d3c47e755cb828e7d440a971975197ebdb3f9b737ba11f7fd0386a959249017de7234d5e5a9b473bb9583a3742c774ee552a12a1f36eb3f26c885bed22e91c74cf32a8dd3edb08b674bf386ef427727912d57c5fafaa1cfeb740cd52b9dee995e3d0161cd9213f38fd681d538ab8bf97b745f54980030ef8b72696d4e27473fb0f1acd5d0aae0297211680ea0fc59d7b6d51c63292585a1d553d0c8954b42a4bd6fcd3a49575bf5c88953f1f4ea7fe0ed7a579d1697e645e2a61c69d1a56bc605bb04060a2778d509a8aadbf35d94697ccee9d3543dd01281a031f2a0eb3a9eb13ae56ff44fa0aed4f3488747d6af820f3989b7133f449ea56d3a7f731e791b7ed2a5db939bb75352de7daec5066fd57557165adffa631cd3f967c3c7cfc11cc1f14fa23defec3eb0239b45ed601a3a8078ccfc7f8380902a859ee9ce2db795efaca0a01dc0879d506ac97d10704d7757b3ccf3b37c339b42db23782278023e4c2e77d74246c9e544149a55c0c920ebf2986b4c5b4b3572f748c4b15c7f863999bc5132adad09761eb76505019769fb55422f603184e24c0d4f3761987b5c50feafcce53302a3a415e20f56a054803e553bacd242a5e1364aa3b2d7cb3bc1e1b86a47431cbd39695b67f554c4645b7236904094c11aa1b40326ba91b8bf4873e9a4de04e2bf4625972", "signature": "c9d4a4728b8fdd240d9c498aa35de95a4bbd51785b73c8403fdf040dfaed9447efad0069b67c783d4b81d966bef6e3d9a808a0584b98ec2b18322c4c920eb00a" }, { "secret_key": "45438f91465d74a2825b0f66a35bd7c8d005865479b3dc10a9b56f297d31b926", "public_key": "f092b5880330871e5aafdd3ceb3850ee7e0941a2a1dc89f4fb4771d75a22f6f2", "message": "3071d4b720df1093659967cd4eefef2ef9678475f7dec58fecec1d928deaf802457a1934e60455f496cf4251820ed60a3d8133b624d33af26a262784b5a2fba73cca2aa5e519e1f539584780649864ba5fbc1f011dddac381f8d48d0d60ce8231701173c9d2a307a76302ebc69dcbc930d28431475b516f98f778ed2e1fff272909a272cc3fbb6b31c8041a37cb777e062e49649afad12c1b5f7fcb8065a99e7423362ad16906031265db7e8b89751f8a4a407f2502650fed753e42c8c911e50b94b3800695b0eba7dff06b7a710117e4920d4b1c605a3ebf32e06966716eda14b3042998a3c7a5e9f83542d7dde65e528bed6101deb331deb94cdd46044bef88c097bafd40d6921a7c484c8f96684dc371671d94eee7cbe5d587715314cff0d1877272d8190a90e18bfb321d52bf74705137b2abf9165731767a13adc9c85e0397b47aef96badb2ca7fcb8293b01fd1de316ee1e65f356b9d6e8ea1fdd837bd96081149ea2dcd73c4881f32b7deebc3715e2d7cdb643e0d98f4e846508b04b32439ff14b1164f46846df9afae44464cf550104cd3aab3817540470aaa2ab9559a68b7ff6b1b9c0ce9f5869cbdcdd617090942e353b4c77f09395896becddff1ab7f07586a514d81fb096361557566870f1691983485a80c3413da98b8d19c78e6379f943e5bd5a5697aa33c5e6bfcfb7b8df1e1574ee416fab3c8a7d088b3a057cf865321b74e6103526dd9ad15ca5ad3c0f69718e27081d4b34a7c6d1aab6b96c0a754b989b4940638c9ede3d17bd49f65bf783dc85f1c4b144876cdbdb2282a9564aa81b57092080d6448fb6580ecf09f82a755010d55d4a5e4f305e259dbe99508b479250d80ec17c8760a93e05a29571f6856073022c8706913c46a2efd2e9caae4ffa1b4222e3d70e979e81a71951d7cb830bcbcf901af244f64e4ad9f52fa3b62031e3516da50bc2bce78eb9d61bfedd9b3f57e89355f177db6162bf61da0e454c34288b967c3fb4c341b32d4d13a319869b8e36046f9e338b5f36a1fc1a7eda7d7b0d438e0a75d84bbe4d68c879ada80dde23f7155b532cccf7a63f1bedf84f82f440c9ec3cb0e45f32c92f76438f5b4b910441e6738af3f5d2050d579ee96b88f3b00810ab126ff3a8fefd971044324dd4eb3447dac5b77809cda8c71682549d7cf2dcee340edcf9494aca42901e2c11ed97790af48bcea29521ef0e3d03cdadecdc894dd0756", "signed": "d9287b7fec017f2ea40a14a1f62dca78b02a3d6632df7c60ebd90fc5e492c5c62c43166bf85658fb30a08b57a5813121b80397571a312b6dd11b6539205416023071d4b720df1093659967cd4eefef2ef9678475f7dec58fecec1d928deaf802457a1934e60455f496cf4251820ed60a3d8133b624d33af26a262784b5a2fba73cca2aa5e519e1f539584780649864ba5fbc1f011dddac381f8d48d0d60ce8231701173c9d2a307a76302ebc69dcbc930d28431475b516f98f778ed2e1fff272909a272cc3fbb6b31c8041a37cb777e062e49649afad12c1b5f7fcb8065a99e7423362ad16906031265db7e8b89751f8a4a407f2502650fed753e42c8c911e50b94b3800695b0eba7dff06b7a710117e4920d4b1c605a3ebf32e06966716eda14b3042998a3c7a5e9f83542d7dde65e528bed6101deb331deb94cdd46044bef88c097bafd40d6921a7c484c8f96684dc371671d94eee7cbe5d587715314cff0d1877272d8190a90e18bfb321d52bf74705137b2abf9165731767a13adc9c85e0397b47aef96badb2ca7fcb8293b01fd1de316ee1e65f356b9d6e8ea1fdd837bd96081149ea2dcd73c4881f32b7deebc3715e2d7cdb643e0d98f4e846508b04b32439ff14b1164f46846df9afae44464cf550104cd3aab3817540470aaa2ab9559a68b7ff6b1b9c0ce9f5869cbdcdd617090942e353b4c77f09395896becddff1ab7f07586a514d81fb096361557566870f1691983485a80c3413da98b8d19c78e6379f943e5bd5a5697aa33c5e6bfcfb7b8df1e1574ee416fab3c8a7d088b3a057cf865321b74e6103526dd9ad15ca5ad3c0f69718e27081d4b34a7c6d1aab6b96c0a754b989b4940638c9ede3d17bd49f65bf783dc85f1c4b144876cdbdb2282a9564aa81b57092080d6448fb6580ecf09f82a755010d55d4a5e4f305e259dbe99508b479250d80ec17c8760a93e05a29571f6856073022c8706913c46a2efd2e9caae4ffa1b4222e3d70e979e81a71951d7cb830bcbcf901af244f64e4ad9f52fa3b62031e3516da50bc2bce78eb9d61bfedd9b3f57e89355f177db6162bf61da0e454c34288b967c3fb4c341b32d4d13a319869b8e36046f9e338b5f36a1fc1a7eda7d7b0d438e0a75d84bbe4d68c879ada80dde23f7155b532cccf7a63f1bedf84f82f440c9ec3cb0e45f32c92f76438f5b4b910441e6738af3f5d2050d579ee96b88f3b00810ab126ff3a8fefd971044324dd4eb3447dac5b77809cda8c71682549d7cf2dcee340edcf9494aca42901e2c11ed97790af48bcea29521ef0e3d03cdadecdc894dd0756", "signature": "d9287b7fec017f2ea40a14a1f62dca78b02a3d6632df7c60ebd90fc5e492c5c62c43166bf85658fb30a08b57a5813121b80397571a312b6dd11b653920541602" }, { "secret_key": "72cfcef4c9d6a1986d190311840e55cbafacc8a6eb5ecc72934fda535bdcffb2", "public_key": "a94464d8cc8f3e43393947649f91c2752327e40daca11a9970c5181eda37d606", "message": "66a6cbe88a8ab9a33847797fc480b244e8a2b8ec79e80bc2637753deb36fa3014f843e22a47db0a31778385ec1f455672e0dff6ca21ca4cfd2b989471b7ffc307828138b0ad4e647c2d13cef724469054abd3740245aea4b789e244e95cf9ecfd08a0d13c7ced393332727a7f3d8fbdabd939de28caa41cc96c7081198e22653d94e024a61f5f3dc5aa37fa9adddc96cf169d35062a0a29ba45a539c87a68a3a0304361309d213e614ee8373dafba2a7d6ed7d2ad37704c0946e4d093e2d94d061364cc1231063729103a77ccb501891bbc3185457bbd2869eb63dc60f196f10a38b7b36cb3f643d35ddbf438a44bf0c8f570fad41bdde267f0ffcf1f2f927d626d1b0d980a0ce223f2f0054845afe41d39de5a457219f276c67e69be2d5c9e070131639561c26751fb06435e0e42e2508c5f49cd12b517c9833ff97f5e51e1dceafa9426d3dc52fd1379c64ccaabb26db1af6ded7153628842f0cbdbbbd6aa0cfa5407f409496c06532dbeac94dab9baba0b3c988fa03d36f911d80e49b370b6837037ff249e76d692cd17737e0d07965d33f17042bbcd1e990e040f71936f6fca2542ae33748367787c01bdea75c9a0e66150281c468fe5c73af9e5bec372d5020c3d37fa1035a67e224d095f066a51fe1f681c3073939272f6af7750ed8d18349178ab4a2eeb4e9ca82bb67296e9890f316c9d9495953d68436eb1c1a2fb6a1cca45a8e88a09bdd65a5558025618b36d7f3cb389d2e2ab1ed233228ec92a327978c0adceddb6c9632d3abd7971621713754758e21013a0c3d009b6e3193cc152c57ef73107bd4357d528be40873027bf1840f685536080f12c5ffa93ca629736780e015e86d1909f0d8f372010c9cb72c0989845fc88315e6b9370dc92d3683ef44d3f75fc96c4b0e89e13d682d1988b685713eada842be9d2bbe2a76bba15d38cbafb65c40c2159b0ceeb0d769b9be355540734ff37736c0f0facb95159309365b9646bc4b344fb19a5c1639a88e87317bfb3b5e7b5130fa7d5643ed4da06430c8a0c1858ccf2f9a6e3d62012253f0122dbab4a35475a6f65589b2b095992826e4f1b58fa050b8f95c4feba3fbaadd2c2244ad4abd410139adf4c153cb5e69337af176a7837eeaea99bdcd59385afded34ffba8063a35f4f558e4eeb48f1487b56b1f8d1f73067621cb548c808753e3526a2f2aabde126bea521cf673deafa792ca5bd2212795bd66b86", "signed": "db7270acce78d7fb09080a327941bce7eb145b9e3661866a8683f9a1a3de97fb02b025db9ec76ff32560fe638827742ea2f4ebef6b7cce44f9aaee434fd7c10866a6cbe88a8ab9a33847797fc480b244e8a2b8ec79e80bc2637753deb36fa3014f843e22a47db0a31778385ec1f455672e0dff6ca21ca4cfd2b989471b7ffc307828138b0ad4e647c2d13cef724469054abd3740245aea4b789e244e95cf9ecfd08a0d13c7ced393332727a7f3d8fbdabd939de28caa41cc96c7081198e22653d94e024a61f5f3dc5aa37fa9adddc96cf169d35062a0a29ba45a539c87a68a3a0304361309d213e614ee8373dafba2a7d6ed7d2ad37704c0946e4d093e2d94d061364cc1231063729103a77ccb501891bbc3185457bbd2869eb63dc60f196f10a38b7b36cb3f643d35ddbf438a44bf0c8f570fad41bdde267f0ffcf1f2f927d626d1b0d980a0ce223f2f0054845afe41d39de5a457219f276c67e69be2d5c9e070131639561c26751fb06435e0e42e2508c5f49cd12b517c9833ff97f5e51e1dceafa9426d3dc52fd1379c64ccaabb26db1af6ded7153628842f0cbdbbbd6aa0cfa5407f409496c06532dbeac94dab9baba0b3c988fa03d36f911d80e49b370b6837037ff249e76d692cd17737e0d07965d33f17042bbcd1e990e040f71936f6fca2542ae33748367787c01bdea75c9a0e66150281c468fe5c73af9e5bec372d5020c3d37fa1035a67e224d095f066a51fe1f681c3073939272f6af7750ed8d18349178ab4a2eeb4e9ca82bb67296e9890f316c9d9495953d68436eb1c1a2fb6a1cca45a8e88a09bdd65a5558025618b36d7f3cb389d2e2ab1ed233228ec92a327978c0adceddb6c9632d3abd7971621713754758e21013a0c3d009b6e3193cc152c57ef73107bd4357d528be40873027bf1840f685536080f12c5ffa93ca629736780e015e86d1909f0d8f372010c9cb72c0989845fc88315e6b9370dc92d3683ef44d3f75fc96c4b0e89e13d682d1988b685713eada842be9d2bbe2a76bba15d38cbafb65c40c2159b0ceeb0d769b9be355540734ff37736c0f0facb95159309365b9646bc4b344fb19a5c1639a88e87317bfb3b5e7b5130fa7d5643ed4da06430c8a0c1858ccf2f9a6e3d62012253f0122dbab4a35475a6f65589b2b095992826e4f1b58fa050b8f95c4feba3fbaadd2c2244ad4abd410139adf4c153cb5e69337af176a7837eeaea99bdcd59385afded34ffba8063a35f4f558e4eeb48f1487b56b1f8d1f73067621cb548c808753e3526a2f2aabde126bea521cf673deafa792ca5bd2212795bd66b86", "signature": "db7270acce78d7fb09080a327941bce7eb145b9e3661866a8683f9a1a3de97fb02b025db9ec76ff32560fe638827742ea2f4ebef6b7cce44f9aaee434fd7c108" }, { "secret_key": "a6337e4d3b1a49b126316778c613516c03ac88c96d92ff5cc7e0c8527cce1a62", "public_key": "f5eac4fe0ea1a5f236b49da33a24e2f3a83d4b260c54d3416c644e05c838bf51", "message": "e33430c38c4a40b3c66e20cf3b70e9fea8cc50761f2afe249ec059c07bc3b37e5b94f4a43e310099b19a85f59dff73a7e495c4df31f74780cdef7bd6e47c394c1891ea3052e3ccf5d84bae082d24ba7178ac65d229ad18a84940f6b4dbc596ee63c181b57b5b49698979c18632fa821ca61e35a0d0351fe13d69e06ddcc8d666dca24502177f344e2f440575d39ebfe5e7f10653b65bef291dc813a0434c975de164c1a76bf6fcef98f23181c009b91830b618e4874847d2e21bbdb93f20cd8b1f4baadf99428a22674386a668152b4b9039ff06abcfe334a062f794056172ecbc0794df98271b9acfe4b7da553a87634237630009a05b257c184cbe23d9cd5a038658010f574899f3b2d154d185ee67230913650c3a05b54a2edc243a4287398e376928ea9c6b2cbaf371252540e2b8043fcf556813196ae572c27cfb5a46abb9729af2dcfc29e033dd11f33e86cc6ac3bce6f3f9577d36781a69ed7eaf8c8263a0f18eba0fe8a481f3e15a55599434195f7cb057dd364eaa07dd0dfd266b807f53a2070fd791e872422fd907134f4a8a78a876bdcb031ac860dfe0bb57e105db8287b31a604eb71269be5ba229985ceabc2bdf165ac741650b1f013a66c9bd243d03a8b1c5081381cb92e23f9057771fc07ca32dff1db94f5adfd2f4ff9af31d250dd4f86b22592f60a74575156213f10846c746a920fe39851b32fe4c8b8758765bc5b8b9d5b99263df36f97888053fd10f1d68f577aed559bcfde744bc6511076cafd68944a0ed10552d11344bc7e4d9ef936dacced527433132959b1c7324ad1c4cbc3a1a736b1f02aae8e0611ae23fdd474f5b8ee7056fcb5af6133ecc084bb9f1f50cbdac66244437b4348f4edfe237fc3c3829ab94eb4f14cab1ccd6caee36fadc20a310cf0690622cdca848aed03ff403a6633f4f657994b780dd6048149c3bfbc17889e37d90b1e5420eb3d4596b91ba11bc0229c65d05b93cd7e0454d1f3c6e1e8071983792c4d4368d0778aef4e123335fd2962c657bd0513571a5fce211de62874f27ca10dc15ba2d445f1cf4be5f833cf0b564c022576b98c0a24349b67085f92202675d7dac48b95e3bfd6555a9ecb7c72f08bfec0d220222492fdc9636f036ec4508a365b7b70979f9eb4a7263a8bacb1c1d0155738646cdd46ab9234a170311500d0bae6e55a863bdaa56f51645ad85297a7381f8d20cf96c474d1bb81fce132b14555d1a", "signed": "781376c9512fa33c457047a1f4f0da3176e60ee47782869b7e9fa5841d964f3c1ad66b70c114b1771c324c83ff6cd997aefccdc59c114db9f2f3ca7d84a7b60fe33430c38c4a40b3c66e20cf3b70e9fea8cc50761f2afe249ec059c07bc3b37e5b94f4a43e310099b19a85f59dff73a7e495c4df31f74780cdef7bd6e47c394c1891ea3052e3ccf5d84bae082d24ba7178ac65d229ad18a84940f6b4dbc596ee63c181b57b5b49698979c18632fa821ca61e35a0d0351fe13d69e06ddcc8d666dca24502177f344e2f440575d39ebfe5e7f10653b65bef291dc813a0434c975de164c1a76bf6fcef98f23181c009b91830b618e4874847d2e21bbdb93f20cd8b1f4baadf99428a22674386a668152b4b9039ff06abcfe334a062f794056172ecbc0794df98271b9acfe4b7da553a87634237630009a05b257c184cbe23d9cd5a038658010f574899f3b2d154d185ee67230913650c3a05b54a2edc243a4287398e376928ea9c6b2cbaf371252540e2b8043fcf556813196ae572c27cfb5a46abb9729af2dcfc29e033dd11f33e86cc6ac3bce6f3f9577d36781a69ed7eaf8c8263a0f18eba0fe8a481f3e15a55599434195f7cb057dd364eaa07dd0dfd266b807f53a2070fd791e872422fd907134f4a8a78a876bdcb031ac860dfe0bb57e105db8287b31a604eb71269be5ba229985ceabc2bdf165ac741650b1f013a66c9bd243d03a8b1c5081381cb92e23f9057771fc07ca32dff1db94f5adfd2f4ff9af31d250dd4f86b22592f60a74575156213f10846c746a920fe39851b32fe4c8b8758765bc5b8b9d5b99263df36f97888053fd10f1d68f577aed559bcfde744bc6511076cafd68944a0ed10552d11344bc7e4d9ef936dacced527433132959b1c7324ad1c4cbc3a1a736b1f02aae8e0611ae23fdd474f5b8ee7056fcb5af6133ecc084bb9f1f50cbdac66244437b4348f4edfe237fc3c3829ab94eb4f14cab1ccd6caee36fadc20a310cf0690622cdca848aed03ff403a6633f4f657994b780dd6048149c3bfbc17889e37d90b1e5420eb3d4596b91ba11bc0229c65d05b93cd7e0454d1f3c6e1e8071983792c4d4368d0778aef4e123335fd2962c657bd0513571a5fce211de62874f27ca10dc15ba2d445f1cf4be5f833cf0b564c022576b98c0a24349b67085f92202675d7dac48b95e3bfd6555a9ecb7c72f08bfec0d220222492fdc9636f036ec4508a365b7b70979f9eb4a7263a8bacb1c1d0155738646cdd46ab9234a170311500d0bae6e55a863bdaa56f51645ad85297a7381f8d20cf96c474d1bb81fce132b14555d1a", "signature": "781376c9512fa33c457047a1f4f0da3176e60ee47782869b7e9fa5841d964f3c1ad66b70c114b1771c324c83ff6cd997aefccdc59c114db9f2f3ca7d84a7b60f" }, { "secret_key": "107da98d0ee8e7c00f6d41ec265944ce67ef8c8ffb51f4f11f4e5f1a27fbe805", "public_key": "3bec34b161b1bcff009f8cfc50d84ceb6a2d5b203b5238a8aad8a83618b442e7", "message": "1a7b7f3e1c7c41492a7ce799efdb2d9dc2f2489c84ae28bb7d084f32eca8fbb066885ac6f2ef7449e71226a82e9f153772a993eb6b6bca6491d26aca5dee98b77a1ddc59922b3145c447de737fafacba5a75f2a80137b5594697220d19617674a69113fdf77c343af2b7e3861b5b7822f58d60089c3ca54c749d27f88379c067598f063939ba8631d1f52dc9ab455045fb360cc2a5b6b0127facfcf5b1b4c33e3f194fc924b854168cb1169ab10997b438b71c80878347be887af44810134b514c806908201a3d3e6d0c56120c4314874dc2944d8444f01bafa34aa62ecef0981545e5d02f4016c0b164fc05ae18f535c31bf20b86f31f7a794aba148984c3ff433dc222c443b5d26c1f66e6c5f19d19cd6eadd4dc94101b2f52b58c9d4590cb10dbc5d6eacd11d42ed09f15bde44ee9271def292f731bf3b4ac6cd127e4884c2cb30b285fc9247638a299e416520624d1ec8d0df2498939c719a9e7bd29a3c5c32a3e8241368d6e4f90fea29dc3a3f147ea9f76c5780e73143f55d3dec7b66341d3f3eac1d98f8e7d4e877509b4438c3a52466d242a10b4c27c4a0db9232dad011414ebfbd57906f1a410207b526b0d1f1b6986b3ebd7550a2b3c15fc2409c7626e0dd330ef6722e3ba48b1d9205652ac194c21473ce258559db511efad3e5d55f2a796d65a6ab97d8631062a593a13aaa095dbc93e6217ced619cb16a57e744355a16b15e77d4979119299bb043e48fa3e615460e164882984a223d418ca95340c5bfcda673fcd13b29f2c47d2f97e3e8c613b6c58df0e62cf23061d6f545b755033fd3dc1405e5fef35a13e015f98b1cc42f71b99681f9681258229a4473d86eabb0c17927941e50c08f34a76b43bcc6d042e5632ef9ccc91b6e6950f5d30f670fb3902c3d409315a40b0821ce8a99a97feca5478bfd782e78767b311f374163f5896b0beb95838e645878c64990385123b61575dd842dc76354bac9c6d5acd9935b609bcccb8463d39225da1afb8911d36e609892dd1723852ab9f82758f3f1e4d28dcf02cb06eed26844aae6882ed44bce44abcd1dfba633418c9f155879c97ab27f8ae238330392be5491a078662daaa02a3d5458b77c549c49be201245e7aaec0d94e5437beca6e5ab046d694e96bf51e04fb44379b2b9b801675fe1477f3e089874a601171d8b68f0202014601a53f812f53e581c3b96312b36b9ee04fff11d9eab4e45148dcc8f0fab1", "signed": "53252b923ad19cc39784d3a9ae59d62a6300dcc50ac8fd0713cb58844501d8d3805afa0fda64c73ea0f60e6a8b3445bfffe6ca6bfdc87e128baf99bf6268fc091a7b7f3e1c7c41492a7ce799efdb2d9dc2f2489c84ae28bb7d084f32eca8fbb066885ac6f2ef7449e71226a82e9f153772a993eb6b6bca6491d26aca5dee98b77a1ddc59922b3145c447de737fafacba5a75f2a80137b5594697220d19617674a69113fdf77c343af2b7e3861b5b7822f58d60089c3ca54c749d27f88379c067598f063939ba8631d1f52dc9ab455045fb360cc2a5b6b0127facfcf5b1b4c33e3f194fc924b854168cb1169ab10997b438b71c80878347be887af44810134b514c806908201a3d3e6d0c56120c4314874dc2944d8444f01bafa34aa62ecef0981545e5d02f4016c0b164fc05ae18f535c31bf20b86f31f7a794aba148984c3ff433dc222c443b5d26c1f66e6c5f19d19cd6eadd4dc94101b2f52b58c9d4590cb10dbc5d6eacd11d42ed09f15bde44ee9271def292f731bf3b4ac6cd127e4884c2cb30b285fc9247638a299e416520624d1ec8d0df2498939c719a9e7bd29a3c5c32a3e8241368d6e4f90fea29dc3a3f147ea9f76c5780e73143f55d3dec7b66341d3f3eac1d98f8e7d4e877509b4438c3a52466d242a10b4c27c4a0db9232dad011414ebfbd57906f1a410207b526b0d1f1b6986b3ebd7550a2b3c15fc2409c7626e0dd330ef6722e3ba48b1d9205652ac194c21473ce258559db511efad3e5d55f2a796d65a6ab97d8631062a593a13aaa095dbc93e6217ced619cb16a57e744355a16b15e77d4979119299bb043e48fa3e615460e164882984a223d418ca95340c5bfcda673fcd13b29f2c47d2f97e3e8c613b6c58df0e62cf23061d6f545b755033fd3dc1405e5fef35a13e015f98b1cc42f71b99681f9681258229a4473d86eabb0c17927941e50c08f34a76b43bcc6d042e5632ef9ccc91b6e6950f5d30f670fb3902c3d409315a40b0821ce8a99a97feca5478bfd782e78767b311f374163f5896b0beb95838e645878c64990385123b61575dd842dc76354bac9c6d5acd9935b609bcccb8463d39225da1afb8911d36e609892dd1723852ab9f82758f3f1e4d28dcf02cb06eed26844aae6882ed44bce44abcd1dfba633418c9f155879c97ab27f8ae238330392be5491a078662daaa02a3d5458b77c549c49be201245e7aaec0d94e5437beca6e5ab046d694e96bf51e04fb44379b2b9b801675fe1477f3e089874a601171d8b68f0202014601a53f812f53e581c3b96312b36b9ee04fff11d9eab4e45148dcc8f0fab1", "signature": "53252b923ad19cc39784d3a9ae59d62a6300dcc50ac8fd0713cb58844501d8d3805afa0fda64c73ea0f60e6a8b3445bfffe6ca6bfdc87e128baf99bf6268fc09" }, { "secret_key": "8bc229fc234653b13c924710cb468b8fa9b280e2adb49cb4b36bf59d6fa4a639", "public_key": "46146975df6704cbf45320a5e6cb6de813469f3131e61d447bbca1a477a0c557", "message": "bae2dc7f94ab5ccdcaa8cf49edbef0f6d7aeb1fa8907800533af4492611194e56cef37b1f033303738ae2c3bc4588f5cb3d55f345b9a407e787742a06af0b6ee20dee3dfe9c91d762a3ebd19aed07907bbb91cd776326540ded9f7ff7dda76615f978e9490f406ed2d9116e2093fa785e971b5062d31cb40fff9e3c551a73b20245d46df4d7fd1303a28180172d9a2bf5593c47917b58690917c1fb0e1e2994d1fa97735ae378de6eafd5c1a25abafa3cfd2df7aeabd6e68fc44edf82fc83694e5d841a15b14568b6110be644bf22b71fc47d7f07e1666957d0f87da17f13fcd63c1c2966f687d25dcbd9963f01eff132d5f2b86677816588c123e9457befcced2d3cd1d1bebe8dd8fbb1587e553cbcc4c8762064cd32ef7a1702410f77f15240d7e2bb582c678c0da88ef4522830b143660ac9c434d95772e6eeeed6014ae16824ccdc4df2df64aeb6980b51d118985dcbbd1961f315e6a9433f0b96b1e6351257ead83e05b4cc89c924bf83558ba7d2e7ca37c03179a8f85b831e7217bf4c553838761d32602853b81593b0ebf8e4b9ffaf0ec405b2a83af7de5554daad28b582ee08bd84b375550cae08ae4a5bda71581fc3b7b54498c4e1afb966b4af1d9c843a6b25b34e04cfd9bd2374244f1fe20ec62be3ccfab4edef79ed64e6b71aa9228127c6359ea1c4a8087890896ffa46e0092dec7efbc960a17b770916f954070132e26d98d9774a2acdf809d586df0252f67cfe8d985a3e248db0f90731ace7abd999c746b69648d5c3b4bd61137e08fcc8b2efc5676bcd856a13b362151474c4a1efdedc592cf3ead1ababcd48ee204d27726ad1bda4fe4b09ab51089d016de6ba259ea81807faf211c87e4c9efbf6a4c753e08f780ed55338c0fde14fb99b30722b5594b3abe02047f466242421fb81176c9c4f0fd2b5e7c5a0f65a0c59aa8c3a986087de7ba40baca77bd36ac21ce34e9fe97facc4e298330eece1c8ec623e66a4b0f2342d2c5a02c5f5abddc5ff1f1f2d03c1d4ee9b4b342ed3b1cc26561f3217bf8500e08f027571c53c9232605a53f2bda024e39929163a8e00791ac0656bb0783825e7105ffa9d90969dc094af46f702e85cc11e442b3d5534c1d3275207d6d29a942c358ed5fa07557c3c014cf541f9aaeea6025b41ecdd848512ba25e721e43d329185f8f94892e9e2d5e7cbb99e7ad25f69e5bef732cfceb078611553cc78377375e74e66f1b9d8d20", "signed": "d243b87d1397d594139d83c39acf8501d073bd4be718b4c206980729e720a4c5b0ea91a28ea12604a987e69591c543049f2973bb91c170213c32a64a0fac8204bae2dc7f94ab5ccdcaa8cf49edbef0f6d7aeb1fa8907800533af4492611194e56cef37b1f033303738ae2c3bc4588f5cb3d55f345b9a407e787742a06af0b6ee20dee3dfe9c91d762a3ebd19aed07907bbb91cd776326540ded9f7ff7dda76615f978e9490f406ed2d9116e2093fa785e971b5062d31cb40fff9e3c551a73b20245d46df4d7fd1303a28180172d9a2bf5593c47917b58690917c1fb0e1e2994d1fa97735ae378de6eafd5c1a25abafa3cfd2df7aeabd6e68fc44edf82fc83694e5d841a15b14568b6110be644bf22b71fc47d7f07e1666957d0f87da17f13fcd63c1c2966f687d25dcbd9963f01eff132d5f2b86677816588c123e9457befcced2d3cd1d1bebe8dd8fbb1587e553cbcc4c8762064cd32ef7a1702410f77f15240d7e2bb582c678c0da88ef4522830b143660ac9c434d95772e6eeeed6014ae16824ccdc4df2df64aeb6980b51d118985dcbbd1961f315e6a9433f0b96b1e6351257ead83e05b4cc89c924bf83558ba7d2e7ca37c03179a8f85b831e7217bf4c553838761d32602853b81593b0ebf8e4b9ffaf0ec405b2a83af7de5554daad28b582ee08bd84b375550cae08ae4a5bda71581fc3b7b54498c4e1afb966b4af1d9c843a6b25b34e04cfd9bd2374244f1fe20ec62be3ccfab4edef79ed64e6b71aa9228127c6359ea1c4a8087890896ffa46e0092dec7efbc960a17b770916f954070132e26d98d9774a2acdf809d586df0252f67cfe8d985a3e248db0f90731ace7abd999c746b69648d5c3b4bd61137e08fcc8b2efc5676bcd856a13b362151474c4a1efdedc592cf3ead1ababcd48ee204d27726ad1bda4fe4b09ab51089d016de6ba259ea81807faf211c87e4c9efbf6a4c753e08f780ed55338c0fde14fb99b30722b5594b3abe02047f466242421fb81176c9c4f0fd2b5e7c5a0f65a0c59aa8c3a986087de7ba40baca77bd36ac21ce34e9fe97facc4e298330eece1c8ec623e66a4b0f2342d2c5a02c5f5abddc5ff1f1f2d03c1d4ee9b4b342ed3b1cc26561f3217bf8500e08f027571c53c9232605a53f2bda024e39929163a8e00791ac0656bb0783825e7105ffa9d90969dc094af46f702e85cc11e442b3d5534c1d3275207d6d29a942c358ed5fa07557c3c014cf541f9aaeea6025b41ecdd848512ba25e721e43d329185f8f94892e9e2d5e7cbb99e7ad25f69e5bef732cfceb078611553cc78377375e74e66f1b9d8d20", "signature": "d243b87d1397d594139d83c39acf8501d073bd4be718b4c206980729e720a4c5b0ea91a28ea12604a987e69591c543049f2973bb91c170213c32a64a0fac8204" }, { "secret_key": "3edb50ff074ef9717f4fb0b6ce252bf4bd049c9083775f529eaf51e975cb3245", "public_key": "4bc21fe03e679abbfcd8c5ea2bcc4d838a787d4840c3bc39de4b04c417c768a5", "message": "975ece4e81f0015f5ac3044609d0ac3a8df9145b50c42889dd312f563cf6126e36fffaf21eb6b84fbda15aa85c66145f7541e5b41a8e81700be356224fc109327a6919665673534f5c8a4a001750b199dbfd630691af552d4d26a9d9afb33a16af391154124b53426c9f695057b1814fd6d310298af6c830686a4a007a14e0057b72fbad5b803ad353d1c3fdb890a9c81808e89f229187bcb44fee16a4ebcad5eba459b028272a562c05079fa7ae3ecae804a9e8c4f3f315813c5ee0841bbccfe4a95623b517a4b42b2c6d97a3bf26acdbe2e979633f02aac466526a3ebb14da19bc95f2c3fdf6bdb08be8bde97a864c907e918c679ab726f80177145840216b9dc3f981ef17874f08b2fc6611a6346c3da6a55ecfa753c9919f4f19e3c79093bfd78f861598e4666e1cab688e4604d46c9c582eadb92c988f478d160f5a15182b3340201797d0b955282e4a217b50b14b10c9f49067ea3e84e5274dcaec74474c5707c28bba0db8cde3e838d7313c171b85ff2b9a3d2b167e9061f84df3b13bdd08b2d501e53792d68054d048abfe3bce98d978256f2fd2c6c4e76f39688cccf0fe149af9d347e7b040ef241dd5a53eaa5eab35a18c68c754a06b03399bbe56a25268c829a5ba82b28192041d3bd244eb08bf78e76def87cd09f32beac9bb639823b36967a574d8960d1bd03435679d93eddc558063c540b9c2f609fed2e2e3576d19e6209eab466c206791c3aa199623fbae7d3497e80fdd3fcbaf5b89110ed72244234be85cca4b27a09bb70a26ece4eb8dd970a26e5b04361fa50e90380ed65f414c1be9f5064f71429116267edd6976422ad92deb2b804a92e81c9f6522a0f3b5d8ad36b4f87db516a22873e6f27284f2ca360a2f40ff3d8e23dec8ef8a17a43acbb61271a727cb8690d29bb82016736b31026201dd3d388d2c643a73cfbd0a94e20551fb5f8e1ffc39741272aa2308dc8d2133a3fa9cf109796d69d2cc8addc44ae2527781ee993af2a637a872f02aff474a7073f29d9c89507701fecbbfd5101353537eba17c29669dac0427e38e22dfaac91fc20d9e3fee791f462a863bb1908fb1e4204b68880314ddacaaa35a17af5f57a399f1931e78f5a37454fd38c57a68e8d367848a97345189c70077fd1aa0754e703e352618063b9e3faf3b14b5f0b27113633c5d17363741e96a67e816401e8098c17bffe9c6f3587646f40e9fdb6819fd22a743a7a6e10feba11", "signed": "deb3d9fc7b2d86ab4b926f99527970abb51838bcc2919e94cda3371fd0e7693fe37e0c40e1233b09ffa903a034dde287c0237dc594f53abc87844869dce92002975ece4e81f0015f5ac3044609d0ac3a8df9145b50c42889dd312f563cf6126e36fffaf21eb6b84fbda15aa85c66145f7541e5b41a8e81700be356224fc109327a6919665673534f5c8a4a001750b199dbfd630691af552d4d26a9d9afb33a16af391154124b53426c9f695057b1814fd6d310298af6c830686a4a007a14e0057b72fbad5b803ad353d1c3fdb890a9c81808e89f229187bcb44fee16a4ebcad5eba459b028272a562c05079fa7ae3ecae804a9e8c4f3f315813c5ee0841bbccfe4a95623b517a4b42b2c6d97a3bf26acdbe2e979633f02aac466526a3ebb14da19bc95f2c3fdf6bdb08be8bde97a864c907e918c679ab726f80177145840216b9dc3f981ef17874f08b2fc6611a6346c3da6a55ecfa753c9919f4f19e3c79093bfd78f861598e4666e1cab688e4604d46c9c582eadb92c988f478d160f5a15182b3340201797d0b955282e4a217b50b14b10c9f49067ea3e84e5274dcaec74474c5707c28bba0db8cde3e838d7313c171b85ff2b9a3d2b167e9061f84df3b13bdd08b2d501e53792d68054d048abfe3bce98d978256f2fd2c6c4e76f39688cccf0fe149af9d347e7b040ef241dd5a53eaa5eab35a18c68c754a06b03399bbe56a25268c829a5ba82b28192041d3bd244eb08bf78e76def87cd09f32beac9bb639823b36967a574d8960d1bd03435679d93eddc558063c540b9c2f609fed2e2e3576d19e6209eab466c206791c3aa199623fbae7d3497e80fdd3fcbaf5b89110ed72244234be85cca4b27a09bb70a26ece4eb8dd970a26e5b04361fa50e90380ed65f414c1be9f5064f71429116267edd6976422ad92deb2b804a92e81c9f6522a0f3b5d8ad36b4f87db516a22873e6f27284f2ca360a2f40ff3d8e23dec8ef8a17a43acbb61271a727cb8690d29bb82016736b31026201dd3d388d2c643a73cfbd0a94e20551fb5f8e1ffc39741272aa2308dc8d2133a3fa9cf109796d69d2cc8addc44ae2527781ee993af2a637a872f02aff474a7073f29d9c89507701fecbbfd5101353537eba17c29669dac0427e38e22dfaac91fc20d9e3fee791f462a863bb1908fb1e4204b68880314ddacaaa35a17af5f57a399f1931e78f5a37454fd38c57a68e8d367848a97345189c70077fd1aa0754e703e352618063b9e3faf3b14b5f0b27113633c5d17363741e96a67e816401e8098c17bffe9c6f3587646f40e9fdb6819fd22a743a7a6e10feba11", "signature": "deb3d9fc7b2d86ab4b926f99527970abb51838bcc2919e94cda3371fd0e7693fe37e0c40e1233b09ffa903a034dde287c0237dc594f53abc87844869dce92002" }, { "secret_key": "cda4ba93940aa0c0c3150b3929b95ee7769ce43fd98ecaff9c4a509e736d5c8e", "public_key": "f4c7a25f1a743daf41417e47e027537f24f481bd1a75e6b1d33ec4c82c55a2d3", "message": "3a1d668c6688414896a7697f3c2e431098edfc457e04d2da869568ad5b3310e59e4c727c903cbf1817408802319a8c231b58023dfae494c013af0fdb78c91d5b457f8c47a3dc31d8c8594aa08f146203fa2c28b3dd796a11a97adede6a7a709b5a1918ef1bea83533c783473703356f5beea7fd18ac44ec6890495ed170d03f15b418608a7d9efd52fa10918638051c448d98d5724f567c8c67fd5b6ec8c3d636008b9bae5e8b1e984f8ffb8b64beebd6345a105c1c1083132fd4508d6ac0d4e9145501210e517d9b22478e215b602599f803762dcd5a409b3460e7f340f47ef77281ad2383de08c5b809538aaec922bfca0d6752f147972646d0a8d8340772c871d3b34abc06037de3ab4e37129865d5ba70b6f3cc9a059efb7dddc3882f4fcfe13f448c9bc664888589603ba98683a93b4b3b1014992a55c8e4ea1baf9cc00d1badff5fd7f5da5e307fbd1b4c984e0fa0edec5d30bfef5f477301263b5d752001b85dd52df3b4a7ac23b930a91c0a45765a66488d8eb5901857060067b82378188549288ddc61831e5b6841b344cae2250042219cfb4ace023e691f9e48d006e9a07c67d2468f93593b4afc161c0768b6ceb744c24c923da34af3d5ed577cc7f85d491560f4c0bcbcd1d5e3421bd1ccfafb373d651bd61ed71c09e99f612001704d0c630d8547bd970b66e7f5ce7a014e0ff5a337dc5c56a99f131b9129140eeea39397c48caa9a8086f9fd99150be7ef87b6d4b94b1bd52878bf3bbfcceacc2cc45e8971c3a4d4a3eb86af9874d4fa5e7caa7f45d1553ffbb41645bf0f5e9b29772e3dc081b25b52e1cb7e2167483d54fba690ddb29d5462d2a27a35d85f007adede2a3dd7281f654336afafb7370782b29cad643d9d9db2f05f281b53e133ec30eec09fb0d061b74581a2bd2790b137391f19328880f64c53be700d0faddb70dc165d2d62e671eb9449a2e6e9df2c16d8f49fa4b5b84309f7335133dbe872c5a8fdcfbc4980abfb3c9597d5d667ad2f688c7ab24c9e440298d72b28b0fcde9c6f071bccc93e8ddbba7b60a0b544a2e06c39c6723d4f7dc185c21135fd13a72770b976119e49a1f81ed476be07c443de0b0ee76fbd919389328b3eb8607bc2fe38f85745e28adb7482b701ccc6690e4ae5a9332ea44613179387dc6fc47c1d1ec366035e991e1404323bdbbf535f1c33cf57b6723f13ca6ca329e2aaa4b46b42607339906c7ef49b32db82cdf6a87ad", "signed": "31048d334af05a4f275ff827544ea296a4a775fa59efa000c57613fa6e5c493c3a9b79e8ce56e7225b0fa326204f0336c213535ae589177a8eaedb6df8b202033a1d668c6688414896a7697f3c2e431098edfc457e04d2da869568ad5b3310e59e4c727c903cbf1817408802319a8c231b58023dfae494c013af0fdb78c91d5b457f8c47a3dc31d8c8594aa08f146203fa2c28b3dd796a11a97adede6a7a709b5a1918ef1bea83533c783473703356f5beea7fd18ac44ec6890495ed170d03f15b418608a7d9efd52fa10918638051c448d98d5724f567c8c67fd5b6ec8c3d636008b9bae5e8b1e984f8ffb8b64beebd6345a105c1c1083132fd4508d6ac0d4e9145501210e517d9b22478e215b602599f803762dcd5a409b3460e7f340f47ef77281ad2383de08c5b809538aaec922bfca0d6752f147972646d0a8d8340772c871d3b34abc06037de3ab4e37129865d5ba70b6f3cc9a059efb7dddc3882f4fcfe13f448c9bc664888589603ba98683a93b4b3b1014992a55c8e4ea1baf9cc00d1badff5fd7f5da5e307fbd1b4c984e0fa0edec5d30bfef5f477301263b5d752001b85dd52df3b4a7ac23b930a91c0a45765a66488d8eb5901857060067b82378188549288ddc61831e5b6841b344cae2250042219cfb4ace023e691f9e48d006e9a07c67d2468f93593b4afc161c0768b6ceb744c24c923da34af3d5ed577cc7f85d491560f4c0bcbcd1d5e3421bd1ccfafb373d651bd61ed71c09e99f612001704d0c630d8547bd970b66e7f5ce7a014e0ff5a337dc5c56a99f131b9129140eeea39397c48caa9a8086f9fd99150be7ef87b6d4b94b1bd52878bf3bbfcceacc2cc45e8971c3a4d4a3eb86af9874d4fa5e7caa7f45d1553ffbb41645bf0f5e9b29772e3dc081b25b52e1cb7e2167483d54fba690ddb29d5462d2a27a35d85f007adede2a3dd7281f654336afafb7370782b29cad643d9d9db2f05f281b53e133ec30eec09fb0d061b74581a2bd2790b137391f19328880f64c53be700d0faddb70dc165d2d62e671eb9449a2e6e9df2c16d8f49fa4b5b84309f7335133dbe872c5a8fdcfbc4980abfb3c9597d5d667ad2f688c7ab24c9e440298d72b28b0fcde9c6f071bccc93e8ddbba7b60a0b544a2e06c39c6723d4f7dc185c21135fd13a72770b976119e49a1f81ed476be07c443de0b0ee76fbd919389328b3eb8607bc2fe38f85745e28adb7482b701ccc6690e4ae5a9332ea44613179387dc6fc47c1d1ec366035e991e1404323bdbbf535f1c33cf57b6723f13ca6ca329e2aaa4b46b42607339906c7ef49b32db82cdf6a87ad", "signature": "31048d334af05a4f275ff827544ea296a4a775fa59efa000c57613fa6e5c493c3a9b79e8ce56e7225b0fa326204f0336c213535ae589177a8eaedb6df8b20203" }, { "secret_key": "217ecd6a7fcc98719210c34cc2e14f5e2d6b5a22f268c14bc4d8a7f2817200c3", "public_key": "d59191ce282d72fe3ac45878e24bb2f28c409ba05d76ce9bcf22f50b0c778675", "message": "9b5337e78fb382f22ea60e03c0bf3ee4700b6978a91ee6acdf6a409e4918d1684881fa1d118c08c9f6f2ca0cab567402c95010e7abdfe848ae79ba249adcb96eae1dfa0843952139cf49b588647895691a2e9880466b7e77e54f6f60815ebfd5e5748f413c0e15f9d576799bcf31284710636f6e9dc7878500796eed80c8af4be2961952ea80bbed1404bd5dae9e6d05fd4f325a3b83cd4528a0869cef84b4d30e02f941d749a8dac97bb3fa839d25739b97ec374536bdea500484a941db9f2299970658d41148295ca0846ca2366238b6201a48b3e447edbea7a4c8f71020142769e15fa72ae5f287140bc5953b8a9a242d205fc019091f2abed0fda47f52d59a0204ce7401c1829b5857b9a0916fcebe2eef991c413acd71b18d8590d6b6d0fb3994302678c29f2b6a53023f9187e46c36790bce73873c545a72beb553294b1ee5d0d0dff239e28ec63b01e4d8fe0d6e69b1601efa2411f0c0601e7e4f65c984f829f0dc2a8421e7f66d9330537151c7243ca524d7a54735c6e344f1fc938eaeea2779c940891d6d01aa55f40cc1adba12e8a67ad9a27fe63fb4f38dc0f01841925718427255bd665d5eb3bc869896db8625204ad4b02f5a22aaeead6e300471fea61dbb1b55c071365c58b1511f38b09a4671bd66b3fedda9c87e43d1ebf301764e18fc0cf16b2d2d67ed239b393ac71968a903c02477fb2df9ef01dbfc3167de7265f891e4fd24d02c63103519b86a7085b1ec2fb419db766bee7a641a4be429614ab89f20f975341072bf04419fb69be7a9ee71a5b49af83ed322bac68a429ff5c5206773be5438b65e53f609729f4f6a21c1333911264d63927017e8136b4725cd1cc964e08ca0933a561e7e3f5987768330e2e54f8d728f59edfe2c91c4f99aef97d18559195a3d8eb315dff96fe276da7137eff93057ac731e06a60a58bd8a9ae8c7cbaff0cb3372c68daa175c428d52f1073a38bf29465d2a7128bb40074006edcb725a831d812864ef43f3b8667c9fb71093a1673049dec05e09169d86fee92df286008ad99065a2929797a913d0233f4d1a95a220bd91c11dd9c45685dcad385780a0c48b9c4ad2d66303e8de4af1db3c04e4a3dd4219fe773f83a8924b0fcbfffcf264abce32832924036bfabba6546b1df4e3f788ed8ad5c2cd92b2641b47090a103cf5bdc46d8b2143174757da801c360a7aa107fac654b34c860bd54f76bbf43c48478df4fe7aa59cf91d", "signed": "a0b169e8e9ce557555e0334a0de7438e553675489ea4ba9cc63a234d00ded8ab6967a3be90ef69e076db9ea3d5ca23b3248dd25991ee1f4d80620bf4db438f0e9b5337e78fb382f22ea60e03c0bf3ee4700b6978a91ee6acdf6a409e4918d1684881fa1d118c08c9f6f2ca0cab567402c95010e7abdfe848ae79ba249adcb96eae1dfa0843952139cf49b588647895691a2e9880466b7e77e54f6f60815ebfd5e5748f413c0e15f9d576799bcf31284710636f6e9dc7878500796eed80c8af4be2961952ea80bbed1404bd5dae9e6d05fd4f325a3b83cd4528a0869cef84b4d30e02f941d749a8dac97bb3fa839d25739b97ec374536bdea500484a941db9f2299970658d41148295ca0846ca2366238b6201a48b3e447edbea7a4c8f71020142769e15fa72ae5f287140bc5953b8a9a242d205fc019091f2abed0fda47f52d59a0204ce7401c1829b5857b9a0916fcebe2eef991c413acd71b18d8590d6b6d0fb3994302678c29f2b6a53023f9187e46c36790bce73873c545a72beb553294b1ee5d0d0dff239e28ec63b01e4d8fe0d6e69b1601efa2411f0c0601e7e4f65c984f829f0dc2a8421e7f66d9330537151c7243ca524d7a54735c6e344f1fc938eaeea2779c940891d6d01aa55f40cc1adba12e8a67ad9a27fe63fb4f38dc0f01841925718427255bd665d5eb3bc869896db8625204ad4b02f5a22aaeead6e300471fea61dbb1b55c071365c58b1511f38b09a4671bd66b3fedda9c87e43d1ebf301764e18fc0cf16b2d2d67ed239b393ac71968a903c02477fb2df9ef01dbfc3167de7265f891e4fd24d02c63103519b86a7085b1ec2fb419db766bee7a641a4be429614ab89f20f975341072bf04419fb69be7a9ee71a5b49af83ed322bac68a429ff5c5206773be5438b65e53f609729f4f6a21c1333911264d63927017e8136b4725cd1cc964e08ca0933a561e7e3f5987768330e2e54f8d728f59edfe2c91c4f99aef97d18559195a3d8eb315dff96fe276da7137eff93057ac731e06a60a58bd8a9ae8c7cbaff0cb3372c68daa175c428d52f1073a38bf29465d2a7128bb40074006edcb725a831d812864ef43f3b8667c9fb71093a1673049dec05e09169d86fee92df286008ad99065a2929797a913d0233f4d1a95a220bd91c11dd9c45685dcad385780a0c48b9c4ad2d66303e8de4af1db3c04e4a3dd4219fe773f83a8924b0fcbfffcf264abce32832924036bfabba6546b1df4e3f788ed8ad5c2cd92b2641b47090a103cf5bdc46d8b2143174757da801c360a7aa107fac654b34c860bd54f76bbf43c48478df4fe7aa59cf91d", "signature": "a0b169e8e9ce557555e0334a0de7438e553675489ea4ba9cc63a234d00ded8ab6967a3be90ef69e076db9ea3d5ca23b3248dd25991ee1f4d80620bf4db438f0e" }, { "secret_key": "08d1d06f3ec29eb52293907b705ec56c5ab354fb78673773ae61253094b89e82", "public_key": "c1b99a87ad15bd46f6c848452af0fa3ccccb5cdf6e348d816e36c5d0fca66e66", "message": "120b35573c34914b373051880da27ed241377f0e78972c98d0faebaa767eb7a7c7e7c6fc3405a4336ef95bc5da9225bbd09e9e11f2a1bf142af4e8a0f924d323dd5a49dfe584f090439c08e51511344d470c6200ac7e7ca150d088a91e47c4c9ff74e38a42a332155d8152ae4abd1161adca934c234ce460af8789e53f109d7d31eede0a909bd193fc8d3c2cfec10b143c31476711bbec27e196a54985bc347167acd233508827bad36e548c880642b86a28c6d3404b511da24f11dfaf6a8f46ddcbc9de9e391597669bddfca6560f91acd3459f329bb071dd80dadf35f0e50df5b10f88d267ac9d3062330dd99a6bcfa13187f45c0c214dcde2cdf9c3ba4d59e633a354a4e277c677bbdfa24191179cbcaf05a10d4078d8add93bc9ed8f6c6c499757403655341f904e37d927750c699c269dc90dc26d005625c3f4124bff66feca59d4abff4172ba3df45a874302231030fa783384f50999e3c4baa5eadb451452c888b519272e90f73c6872768e0de20ee2e5f9502f35e49fecc28b75201887fed2818eff545398392f5e5b6876bc556ac13a1903ada1b9d725b04a14204b599ec33d62b7dcaeea8c52877b2cfdc3558a91d2c9157500a3bb6d452e5e2ff093294fc433cbd63465bb191307ed801a15b85dc2ff0bb38312f8b817a436d422cf4607c64ee7035923db6b96a3899910149b0da4aa3e96685d7163aacf9e619dc60813ce4f344f3079b43f187fa31bdacb9a1d7720b939d5bd241b96a177d7b7768ffebf79044cd2956d6f88db1c243a10fede6814852cf404b2cdcfa774076dc125c70a57c6907e99afe39622ae11f557e7d34b39aaaf45f834058d2fe5f15b5eb70ac15a90a3de5850ab1dcb48b06b6ccaa4b42f857e71ec00b8a3d8974b0bea68fa0f665592115b4fa55572cf0b0738641fc868d4a2e714db3ad7219a823d54b7f7c2656ba5c5eebe3594c7db12298c16251d9845bf2f7800b4190b746e21b0c1a5c47a3df9a059ce0956674eb703decb0a0045437da4da10f286d720d1b9df05fb24415d68e065570e6b31503142d03335a807bdca30892edb5f55f8989d9e649659c0744c5433bfb4deeb11c2626a8650e54d4d398ba19b64f68bed06d7fc408f470ac704e2ac922ac1411fee24543e56f2f50b6b08953dc56a7a75edae430a6df28a227adac91ba26f0e198595327739cba303e9aa393ea6618a84f8f503d0056ee8d87e3796e036cc51ccb791deb795", "signed": "0b8edcb8b15a8cd074c41dc2a1ba29d9648d6acbdc338314707eca6fb4714c99543b4907b9f85e57eecffe0f7a6b7073a80946f8087553f4683109273a604a08120b35573c34914b373051880da27ed241377f0e78972c98d0faebaa767eb7a7c7e7c6fc3405a4336ef95bc5da9225bbd09e9e11f2a1bf142af4e8a0f924d323dd5a49dfe584f090439c08e51511344d470c6200ac7e7ca150d088a91e47c4c9ff74e38a42a332155d8152ae4abd1161adca934c234ce460af8789e53f109d7d31eede0a909bd193fc8d3c2cfec10b143c31476711bbec27e196a54985bc347167acd233508827bad36e548c880642b86a28c6d3404b511da24f11dfaf6a8f46ddcbc9de9e391597669bddfca6560f91acd3459f329bb071dd80dadf35f0e50df5b10f88d267ac9d3062330dd99a6bcfa13187f45c0c214dcde2cdf9c3ba4d59e633a354a4e277c677bbdfa24191179cbcaf05a10d4078d8add93bc9ed8f6c6c499757403655341f904e37d927750c699c269dc90dc26d005625c3f4124bff66feca59d4abff4172ba3df45a874302231030fa783384f50999e3c4baa5eadb451452c888b519272e90f73c6872768e0de20ee2e5f9502f35e49fecc28b75201887fed2818eff545398392f5e5b6876bc556ac13a1903ada1b9d725b04a14204b599ec33d62b7dcaeea8c52877b2cfdc3558a91d2c9157500a3bb6d452e5e2ff093294fc433cbd63465bb191307ed801a15b85dc2ff0bb38312f8b817a436d422cf4607c64ee7035923db6b96a3899910149b0da4aa3e96685d7163aacf9e619dc60813ce4f344f3079b43f187fa31bdacb9a1d7720b939d5bd241b96a177d7b7768ffebf79044cd2956d6f88db1c243a10fede6814852cf404b2cdcfa774076dc125c70a57c6907e99afe39622ae11f557e7d34b39aaaf45f834058d2fe5f15b5eb70ac15a90a3de5850ab1dcb48b06b6ccaa4b42f857e71ec00b8a3d8974b0bea68fa0f665592115b4fa55572cf0b0738641fc868d4a2e714db3ad7219a823d54b7f7c2656ba5c5eebe3594c7db12298c16251d9845bf2f7800b4190b746e21b0c1a5c47a3df9a059ce0956674eb703decb0a0045437da4da10f286d720d1b9df05fb24415d68e065570e6b31503142d03335a807bdca30892edb5f55f8989d9e649659c0744c5433bfb4deeb11c2626a8650e54d4d398ba19b64f68bed06d7fc408f470ac704e2ac922ac1411fee24543e56f2f50b6b08953dc56a7a75edae430a6df28a227adac91ba26f0e198595327739cba303e9aa393ea6618a84f8f503d0056ee8d87e3796e036cc51ccb791deb795", "signature": "0b8edcb8b15a8cd074c41dc2a1ba29d9648d6acbdc338314707eca6fb4714c99543b4907b9f85e57eecffe0f7a6b7073a80946f8087553f4683109273a604a08" }, { "secret_key": "f0c85c76b1532e89aea975156dddb1d3d066f6409f841bb4410922725f269d86", "public_key": "fd75fc75c36f83498d8f0827f01d3b457f8bc4d9dc55e4a46274ddf0034fe16f", "message": "ae2eb018d48dbd4f210b16778b5bd2fd14c94e6bbf2b3ff85518e560ab8d3e72201f433420f00f11bc78e0e9f3720875b2e9dc11e04325b8b3f0d465ddab21511c457d6acad8f2fd5fdc0d2823fe6caa66a191a3b6326b32a16befd64d15b361a41513641bceba26bfe93bdf854a4f8f8a0b29f7e28262e2d6e98aa24ac27f6f7883ac01a74c40cce947ebac70e9fef2a16e6289e468950e391e9e24ef58e88a44377269cebafed8987d220dcae2d8b126b6bf812167d023d9baac950d9db8cf52de6306bd48999610c0a433fa9e1771cb832d4197aa340dd0ccd0744fc6b62f90bd3ebb5308cab5f940e2916423cf0f3bf080c06a94f026910460dda809374e6457f064f178e308e7a1b5af4def319007d041778c3d6a419f51badf87663879302b53ff269df442d0e05c958d5baacceed7f5f8afc811c18900ee3b0f61e5dccfd5dac85332d32ebba371aa2d47a606f59546e4bbb605a74677b19a0fe8e95f9f77c0b8b71d07e983004dc2ab2cb3793a323c108dfa7970da00db198674bd34bf7310767f76a224e07bdbc62b9d078cbc75367e2ebaa2c5d274bf3427f2a0cc5dbef0af4e63ad889e131b12bc8ca32d827f7260b0449d0443fa288440efd1364e3c9849477e73ee0ba4240d492af5ce13c34561b45010c109d842c1fed1be3fa9e184aaa14064f43f6dea0b659c5b97893cf2a433bcfb1d2a87eb564bd9092c2666704731f83e56434b2a4299650c7060f9ff7e8aadcb4593f609188d8b467646cfe95270067a1d35cd759fe581af4e62602c02ef14744143eb424f2d9f33a60288c1b25f08e4b2f5feae06cbcc2b2052bf384e1a6fcd8471ce5e5658d77f40c35c415e2a9e09fb583bb7471258e7c806f3c21822dd10f56a640cdc00128d3ba556ba51dcaab47c3baf9f0197d3663de8d093e83173325def1e83a2f5f5acf12ae09f3ce96cd888034dcbe6147dc5998362a4bc406d28846ab1503c17c94f9afd903c9a58e1cebb4abb4ff6f2a41024e06dcaad14f5b70c1b26e69f96ecf14b8da31c621f9ad4e30aeb982378671f7d1f2c4b572c41bb8830840ac5ddced881f8fff210c3c7f236d8c5f2cfdacda29893302fde15282db540cb543737dd77852569221fddcdd68d87e2402179d3a5a77734c275a1d560a462f40318bb6819837da3d305eb49b38650efdc8fe409d40fb94cd5dc3eb02738f38852f671a0c41414b76fb436f3417b8ef300921c009ebbd7cf8e11", "signed": "4218fe4c1dce795ca92a49a6f4798eb5412dc825860314ec469fed45de3a7bf8ea55e853a349584bd95a826a585a503fd50bfe4c635ef183d07301367e90100aae2eb018d48dbd4f210b16778b5bd2fd14c94e6bbf2b3ff85518e560ab8d3e72201f433420f00f11bc78e0e9f3720875b2e9dc11e04325b8b3f0d465ddab21511c457d6acad8f2fd5fdc0d2823fe6caa66a191a3b6326b32a16befd64d15b361a41513641bceba26bfe93bdf854a4f8f8a0b29f7e28262e2d6e98aa24ac27f6f7883ac01a74c40cce947ebac70e9fef2a16e6289e468950e391e9e24ef58e88a44377269cebafed8987d220dcae2d8b126b6bf812167d023d9baac950d9db8cf52de6306bd48999610c0a433fa9e1771cb832d4197aa340dd0ccd0744fc6b62f90bd3ebb5308cab5f940e2916423cf0f3bf080c06a94f026910460dda809374e6457f064f178e308e7a1b5af4def319007d041778c3d6a419f51badf87663879302b53ff269df442d0e05c958d5baacceed7f5f8afc811c18900ee3b0f61e5dccfd5dac85332d32ebba371aa2d47a606f59546e4bbb605a74677b19a0fe8e95f9f77c0b8b71d07e983004dc2ab2cb3793a323c108dfa7970da00db198674bd34bf7310767f76a224e07bdbc62b9d078cbc75367e2ebaa2c5d274bf3427f2a0cc5dbef0af4e63ad889e131b12bc8ca32d827f7260b0449d0443fa288440efd1364e3c9849477e73ee0ba4240d492af5ce13c34561b45010c109d842c1fed1be3fa9e184aaa14064f43f6dea0b659c5b97893cf2a433bcfb1d2a87eb564bd9092c2666704731f83e56434b2a4299650c7060f9ff7e8aadcb4593f609188d8b467646cfe95270067a1d35cd759fe581af4e62602c02ef14744143eb424f2d9f33a60288c1b25f08e4b2f5feae06cbcc2b2052bf384e1a6fcd8471ce5e5658d77f40c35c415e2a9e09fb583bb7471258e7c806f3c21822dd10f56a640cdc00128d3ba556ba51dcaab47c3baf9f0197d3663de8d093e83173325def1e83a2f5f5acf12ae09f3ce96cd888034dcbe6147dc5998362a4bc406d28846ab1503c17c94f9afd903c9a58e1cebb4abb4ff6f2a41024e06dcaad14f5b70c1b26e69f96ecf14b8da31c621f9ad4e30aeb982378671f7d1f2c4b572c41bb8830840ac5ddced881f8fff210c3c7f236d8c5f2cfdacda29893302fde15282db540cb543737dd77852569221fddcdd68d87e2402179d3a5a77734c275a1d560a462f40318bb6819837da3d305eb49b38650efdc8fe409d40fb94cd5dc3eb02738f38852f671a0c41414b76fb436f3417b8ef300921c009ebbd7cf8e11", "signature": "4218fe4c1dce795ca92a49a6f4798eb5412dc825860314ec469fed45de3a7bf8ea55e853a349584bd95a826a585a503fd50bfe4c635ef183d07301367e90100a" }, { "secret_key": "18e268b15a2501dd4c979dc103ca6a842216132b3b5081d775f88640f89c8041", "public_key": "b34e19c1e208fb48a885079d9fbf37c74f92710960f832154fab18570cfb4c1d", "message": "424bdcf0b256001439d16958fff648cf7a8604af22cfa5b44331b4dc356dff25cc0563da9d640133acb70b6a1176c482dbc9408cd6793d56bc29cc408823d388ed88b24ceb6621dbac0023ee69f76f8296a7395211685b3ceaa995f0355d9aad3d97358f4a379e5920ec545f469621cf768abf55d2a554c949b0ed70187c2205ad032985c9b5b2e4ba57e0b4a47d344512b84bfe9f3aa560fe6ecfc5bdf8c3b41845293573f81ed3b70edc63a30c70cda3f455901313f6d23db309478f03e34e71356d83fa5db9280cc2b4369c3d24dd9038f247596c391e48b2f3f890a141ca1d12077c69344735a59b1dd4076b22e16189991e5f1be4fb7695af90ebea5df286135cec2a6e99aa1dda328e62c0dfb63742202d63624dcc0c5cf1a5df79e2878dbc71fa96576601af22844f545733126af7d3984c3ed252e6a876445c92259fbb470a10569b49e5791fd0182cfe1c3f88297facc8c31a5332f1f4eb4958db13b6c079aa9c949487263403190c83c11a43191ffec6023fb34cfab2525beb546cf9200a96f5854b2f78ecb2d9a53aa9d287a90d4d410a63ada0e975d304d5148353463fa805b4805fb4687ed8857dfce4bc6e80833c8f9a79cd4f029a2d802bfdc819ed0c0ac8f21023287f2b4bafbcc89993fe46d52a9c6246dead617df797d48ee985f0f0df9aa82ea20e0d0db28a254a9a253f39f9cf01e3db8f3ebcf7cb97cec58c4efe031269b4b37e4cbb361f73ab4b4980bd900849538844c52cb3ac7583b8f89653a0de65a8be91582c55239cb8f5d5318a88d160e1c871e5ea7e75f5a69cba8538221ab42ce2a2c4d9c3b7ec857f230d573731133686ae8a7ed640f42f31029489e4e6af2b3ea4c7948ed537c0c5906726c2b625fd5f949e3a7cf3b6e998ec761dd6e2b5171a68749752e721b788c3477fa190cd6ea81d579dce6462d9c662ad8962e79338710cc8d2738a5fb04adfdb3f1432cfd80e2e967da000d83a0fa85abae2952f3f3683e254d868f4bf809eb2e300e7b209734a3c894e966b16088d5ed354bffbffbbf2ec2be93a32a8be5cfa18fa5653012edae5afd8709ca55c0cf23a550d34ca0f32d8f666fb47a12f2b7353a40c5379f75366c13f4ab9f14cf80a94e1f13d8b09b76fd8d14ffa538f31fd8aeb49d33433f4df7c2ca67399579fe99078aa721d6b6fc0c50e8a91fc71ca25eac1376fc671bf6153e720b25c7e97a3d4ef8442ac67acf58b504b67158f913025", "signed": "f2dcfc06ef1d8eccd8e40bdf01307dd19683f214d4f084e6b6934f637278300dbb1889f2d37f53b3aef26fbb3e36bd75985fa7c8ea6ddffa72c8e406f24bb20e424bdcf0b256001439d16958fff648cf7a8604af22cfa5b44331b4dc356dff25cc0563da9d640133acb70b6a1176c482dbc9408cd6793d56bc29cc408823d388ed88b24ceb6621dbac0023ee69f76f8296a7395211685b3ceaa995f0355d9aad3d97358f4a379e5920ec545f469621cf768abf55d2a554c949b0ed70187c2205ad032985c9b5b2e4ba57e0b4a47d344512b84bfe9f3aa560fe6ecfc5bdf8c3b41845293573f81ed3b70edc63a30c70cda3f455901313f6d23db309478f03e34e71356d83fa5db9280cc2b4369c3d24dd9038f247596c391e48b2f3f890a141ca1d12077c69344735a59b1dd4076b22e16189991e5f1be4fb7695af90ebea5df286135cec2a6e99aa1dda328e62c0dfb63742202d63624dcc0c5cf1a5df79e2878dbc71fa96576601af22844f545733126af7d3984c3ed252e6a876445c92259fbb470a10569b49e5791fd0182cfe1c3f88297facc8c31a5332f1f4eb4958db13b6c079aa9c949487263403190c83c11a43191ffec6023fb34cfab2525beb546cf9200a96f5854b2f78ecb2d9a53aa9d287a90d4d410a63ada0e975d304d5148353463fa805b4805fb4687ed8857dfce4bc6e80833c8f9a79cd4f029a2d802bfdc819ed0c0ac8f21023287f2b4bafbcc89993fe46d52a9c6246dead617df797d48ee985f0f0df9aa82ea20e0d0db28a254a9a253f39f9cf01e3db8f3ebcf7cb97cec58c4efe031269b4b37e4cbb361f73ab4b4980bd900849538844c52cb3ac7583b8f89653a0de65a8be91582c55239cb8f5d5318a88d160e1c871e5ea7e75f5a69cba8538221ab42ce2a2c4d9c3b7ec857f230d573731133686ae8a7ed640f42f31029489e4e6af2b3ea4c7948ed537c0c5906726c2b625fd5f949e3a7cf3b6e998ec761dd6e2b5171a68749752e721b788c3477fa190cd6ea81d579dce6462d9c662ad8962e79338710cc8d2738a5fb04adfdb3f1432cfd80e2e967da000d83a0fa85abae2952f3f3683e254d868f4bf809eb2e300e7b209734a3c894e966b16088d5ed354bffbffbbf2ec2be93a32a8be5cfa18fa5653012edae5afd8709ca55c0cf23a550d34ca0f32d8f666fb47a12f2b7353a40c5379f75366c13f4ab9f14cf80a94e1f13d8b09b76fd8d14ffa538f31fd8aeb49d33433f4df7c2ca67399579fe99078aa721d6b6fc0c50e8a91fc71ca25eac1376fc671bf6153e720b25c7e97a3d4ef8442ac67acf58b504b67158f913025", "signature": "f2dcfc06ef1d8eccd8e40bdf01307dd19683f214d4f084e6b6934f637278300dbb1889f2d37f53b3aef26fbb3e36bd75985fa7c8ea6ddffa72c8e406f24bb20e" }, { "secret_key": "3c393f9df1fb0b1eec09b7f270b85982ba0fd5e4b1795e1a7fa99137fee24d7d", "public_key": "974fe23730fc17945670fbc1f80b93f94593c8d44bc75d189a6bbfaabaf5dbd9", "message": "54d8b8d5fac28cffa77a0916d6333c16edbc8bb74aa06e56dc00e47e3929e40864b8840d912079597eacd81dae43e2785dfc689f3e85f8c66581efc5e853d1faaac744400ab08cbdb5d16146fa60f99905ed84fd2936dd73f4bca2572b7cf5160560ffaa68da7a67e40e08a7bb7aefc4043ebed5fe80a414817edf2c63f62fac0d47446ed0bb584058f4872fecff621559311a270aea37a6296864e8d168bf1e2f55cd3b276edfa612b5d9c3362e618be6e82a6e5f82667924f3d1d3df825f9d23f4d6142d3100dfc70f70603abf3fdadaca69ef6a18ef9092b3c41ec658ab27216fc6147a080acda60a841984ee83f41ac42a80eaac91fffc8228391ef583ab3eddcf876523c20281355300d86c11a4e7c1ade8e50560f43906c9bc8ca5fbf8339fbebd02e33e8518bee5e806b8c10f8277f410664735a2bf556839635492452e6ca079deb9751cfc6797f49bca9613ff2e7fdd3646f7c5236a36bdf0051745e595dc0072fd6651d57627a6004c0f0cfae856bbc28a1231cb839665ff04152ec31c007b3e2ed0a973b24c93149ce701e6fd6539206ae91bec4ce65a89db26c7d38cecb8919f96fb6cb8f6c1939d90fb3f90b887789f29575ab20e0b08bc358153d8c03521dc891870b5f7eedcc1e62bee7da063ae66ff0a4b7d98d1cb758f69743c3db3ae2a2c9be1be094f17cd28f92d8ccbca983c749c75c610f840836e2c430ccdeff0afa54444f12b4a4f002c609451834244c0c07df8e12202a65f94447cd4903acb606d7725a86e4a2343984e679c4af1b3679c755ea50d0abe2fcc0c1c3351a9ee196b4644c424222be99e2fb373f9641e3faebff43170eb03fb8ec4557d151a55fab6c499d444c84be89f2447682de4e6f6353475efcb8fc53256763a948dc75c515fa353545d0cbad29df5e9db5cc457ed3086cffb3d75e846c4e8d88147fcd0d8aa5abab49b5e05c3d7feef637943347ad3f492ee356ef34881cfd85abce8a144ce7761e284e8b8cb08966049047a996e23559f776b1a9f41cba3954108486e2927beb6433a36ff8b2f03aa74b3d209c488e077f924f231e28345942c7dcc2e61d7c9b522b659fcb53662aff3648f66da3e83e59b0daa90b94c515dadab10d5a839cb3a2f1d3cd092de55d995138c3ac0b907af15ac63ec1874114327e21971345ef17031d52617e784da3771439be2e84148bcfea132bde10e6fda547dcbb1c4d8f74ddce1fccf8213e0da6e97b81f75", "signed": "22333e56410fdcbf84f6a8de741337691684495ba69eff596db9c03a281210881e6c91efa91b2183c0eac916152817a78ca724ba7c8b51bb4caadea9a341eb0e54d8b8d5fac28cffa77a0916d6333c16edbc8bb74aa06e56dc00e47e3929e40864b8840d912079597eacd81dae43e2785dfc689f3e85f8c66581efc5e853d1faaac744400ab08cbdb5d16146fa60f99905ed84fd2936dd73f4bca2572b7cf5160560ffaa68da7a67e40e08a7bb7aefc4043ebed5fe80a414817edf2c63f62fac0d47446ed0bb584058f4872fecff621559311a270aea37a6296864e8d168bf1e2f55cd3b276edfa612b5d9c3362e618be6e82a6e5f82667924f3d1d3df825f9d23f4d6142d3100dfc70f70603abf3fdadaca69ef6a18ef9092b3c41ec658ab27216fc6147a080acda60a841984ee83f41ac42a80eaac91fffc8228391ef583ab3eddcf876523c20281355300d86c11a4e7c1ade8e50560f43906c9bc8ca5fbf8339fbebd02e33e8518bee5e806b8c10f8277f410664735a2bf556839635492452e6ca079deb9751cfc6797f49bca9613ff2e7fdd3646f7c5236a36bdf0051745e595dc0072fd6651d57627a6004c0f0cfae856bbc28a1231cb839665ff04152ec31c007b3e2ed0a973b24c93149ce701e6fd6539206ae91bec4ce65a89db26c7d38cecb8919f96fb6cb8f6c1939d90fb3f90b887789f29575ab20e0b08bc358153d8c03521dc891870b5f7eedcc1e62bee7da063ae66ff0a4b7d98d1cb758f69743c3db3ae2a2c9be1be094f17cd28f92d8ccbca983c749c75c610f840836e2c430ccdeff0afa54444f12b4a4f002c609451834244c0c07df8e12202a65f94447cd4903acb606d7725a86e4a2343984e679c4af1b3679c755ea50d0abe2fcc0c1c3351a9ee196b4644c424222be99e2fb373f9641e3faebff43170eb03fb8ec4557d151a55fab6c499d444c84be89f2447682de4e6f6353475efcb8fc53256763a948dc75c515fa353545d0cbad29df5e9db5cc457ed3086cffb3d75e846c4e8d88147fcd0d8aa5abab49b5e05c3d7feef637943347ad3f492ee356ef34881cfd85abce8a144ce7761e284e8b8cb08966049047a996e23559f776b1a9f41cba3954108486e2927beb6433a36ff8b2f03aa74b3d209c488e077f924f231e28345942c7dcc2e61d7c9b522b659fcb53662aff3648f66da3e83e59b0daa90b94c515dadab10d5a839cb3a2f1d3cd092de55d995138c3ac0b907af15ac63ec1874114327e21971345ef17031d52617e784da3771439be2e84148bcfea132bde10e6fda547dcbb1c4d8f74ddce1fccf8213e0da6e97b81f75", "signature": "22333e56410fdcbf84f6a8de741337691684495ba69eff596db9c03a281210881e6c91efa91b2183c0eac916152817a78ca724ba7c8b51bb4caadea9a341eb0e" }, { "secret_key": "f8669c88f1685bbf0480cc9221ac2ead8f551bfa87ecba2fd4ddf3ba3476ebda", "public_key": "34723fb8e253ad9c71cefde03628d204e535de479e1048e5188762a1f337fe5f", "message": "5b4941beec2241c9fb76d8484f4f3f3ab4ffe8ecc8e7aec76de2ab8c368584d751b0d3feb8a1dc8168cdc694968f66b2a0b052afbf8be3a7d95163e9da9141c59ca55976c292c5c74d31318d6a91e7817c5a8b2f812118cbeba3a13323cd9748bf86ed1a85dd4ebc0df495cfa3d4627434bf14aae8ab6781467a56d965d10e6371989dfa0f6bc0f7859f3771eb9004b34367db2705dbd60fa8f7895c1eadf59f53dab168b4f9363979025501ddd9680debc07cd1ca4a0997876e9211f307d9b7b9d904e48d2861a778b879ad590a9a2f141bd568e3a1bb2494628e9ec0c64255aeea6f0eedca30ad38a1f3ffec3b2b5e942e21940104e914d11a44c00fdd47da3e5513aa8530aee247c95ca66d08a2608c75ba9858da14f9a8a32be713d309e0f584c81ef5be040e0065f07b775ae175dfe2c8b90a88ccda17fa4f21c77eadf5d25b6e404bf004479e05a01ac0042b89937eb278c1c34f33028db780ba3b617918595a39c0fcad674b85c40cac8d345b7ca0bb48a28e66c44d8bb5f27941e40b0e9c7097976c62dfef50c98f17566ccbacc87cb03b94dfdfaf32f1e56ffa639d63611e213cebf54cd0a3e2172d811c0ebd75b1a8646264dd8b1abd46e548972a1b262cd95d511536dddcb49729fe7bd00b3838bd2f20a142640edb1b6e765b65da72e7233261c8892e2f4949bb51f32a1a5a3ee149bea26fdcedb991d2cd126637e2971e9b6f0b785df28a48f301707349423f44e8462289d725498230489df1b51be30f08d7e3250565c6ef824bc53a1ba74a57a25c0686adcb6c825ab1ca70c8a5d46dbbc6fa607461e26d16fe93bb3d3a943a3dc05f30ea6dc8bb12d70821d320f1adf1ceba4be657194f7fccd21990f8629d744601cf52ea6d9405aaa2878f1eec4003b45a4218d8f80bb0f5af047326487752e2b76d68872520bbeae7b309d78282a073fe0b1a1a7a98da23df68caf8c2699b1c7d0f47bd7de2c0bb23369963e68a6974c8e2b595b8293a9f4d98df7e9ae3add2a3f64e83039739642d192204e85e6c48d5d671f6c75a0a8957edbb74187620f2aba99c1c62584c59ac00647e3fb40292b9dc1a3346868553392fd3f11d6dc6f5f2f4e85ee25125cdd644743c7d45281edac6384c77cb98a67d9ae6fc9a0a76b9f6fa696fdf4aceab5f794ee521b1e5a0ee57af53bdf176801b4f45cfb3cae3287234234b77ce21edf8680d68c4a8eecf1b03537ea5699acb562777e42a486fe7cd", "signed": "3746da6cd8ca108beef06487bee63584f812c8e0695fc863b86e5db132380b62ff8544f6f374825b0e3ea0620ef854c1331114d667df1f9ea776c3963870290d5b4941beec2241c9fb76d8484f4f3f3ab4ffe8ecc8e7aec76de2ab8c368584d751b0d3feb8a1dc8168cdc694968f66b2a0b052afbf8be3a7d95163e9da9141c59ca55976c292c5c74d31318d6a91e7817c5a8b2f812118cbeba3a13323cd9748bf86ed1a85dd4ebc0df495cfa3d4627434bf14aae8ab6781467a56d965d10e6371989dfa0f6bc0f7859f3771eb9004b34367db2705dbd60fa8f7895c1eadf59f53dab168b4f9363979025501ddd9680debc07cd1ca4a0997876e9211f307d9b7b9d904e48d2861a778b879ad590a9a2f141bd568e3a1bb2494628e9ec0c64255aeea6f0eedca30ad38a1f3ffec3b2b5e942e21940104e914d11a44c00fdd47da3e5513aa8530aee247c95ca66d08a2608c75ba9858da14f9a8a32be713d309e0f584c81ef5be040e0065f07b775ae175dfe2c8b90a88ccda17fa4f21c77eadf5d25b6e404bf004479e05a01ac0042b89937eb278c1c34f33028db780ba3b617918595a39c0fcad674b85c40cac8d345b7ca0bb48a28e66c44d8bb5f27941e40b0e9c7097976c62dfef50c98f17566ccbacc87cb03b94dfdfaf32f1e56ffa639d63611e213cebf54cd0a3e2172d811c0ebd75b1a8646264dd8b1abd46e548972a1b262cd95d511536dddcb49729fe7bd00b3838bd2f20a142640edb1b6e765b65da72e7233261c8892e2f4949bb51f32a1a5a3ee149bea26fdcedb991d2cd126637e2971e9b6f0b785df28a48f301707349423f44e8462289d725498230489df1b51be30f08d7e3250565c6ef824bc53a1ba74a57a25c0686adcb6c825ab1ca70c8a5d46dbbc6fa607461e26d16fe93bb3d3a943a3dc05f30ea6dc8bb12d70821d320f1adf1ceba4be657194f7fccd21990f8629d744601cf52ea6d9405aaa2878f1eec4003b45a4218d8f80bb0f5af047326487752e2b76d68872520bbeae7b309d78282a073fe0b1a1a7a98da23df68caf8c2699b1c7d0f47bd7de2c0bb23369963e68a6974c8e2b595b8293a9f4d98df7e9ae3add2a3f64e83039739642d192204e85e6c48d5d671f6c75a0a8957edbb74187620f2aba99c1c62584c59ac00647e3fb40292b9dc1a3346868553392fd3f11d6dc6f5f2f4e85ee25125cdd644743c7d45281edac6384c77cb98a67d9ae6fc9a0a76b9f6fa696fdf4aceab5f794ee521b1e5a0ee57af53bdf176801b4f45cfb3cae3287234234b77ce21edf8680d68c4a8eecf1b03537ea5699acb562777e42a486fe7cd", "signature": "3746da6cd8ca108beef06487bee63584f812c8e0695fc863b86e5db132380b62ff8544f6f374825b0e3ea0620ef854c1331114d667df1f9ea776c3963870290d" }, { "secret_key": "ceccc68311fc45b6c2a2f1ff9cdde007ec787fdf25d02ccd2a1cad9de3fb4cff", "public_key": "6f804734ef92824180da71e55cf3bf1afef65bcf560962e0b0acbb2d8cca5984", "message": "bac186d9fe5abda79c3a35a7a3c2eae6ae6ab28247912770c84efd048ebd3aba57c37cf4c6c7f30a79f68a3f76b20cd8c6631fcc96670522080e6b62e887ae6f4436d4caf56943131c52dd282b251cd075f1f7f8e0bdb6bedfc9a0796f5579042b56e69374961b11dfd61b12de2bb7d49bfc509cdb3138f3356a0dded98f5301b7c4a748bf89b23df4f7472ff8b1f505d765c6ff82dbad74b9d7aef22fbcca0b7f35042f9a762bd06902bb21c7f9f7f66bef38901d75012d61d744dee7afd89fc7e908c40685bd440aeda4204d006f26307d82a496963115f90e09f76688291f4a67d6411f76d16617875b2b9982dfdc5ee9b83b9817009319110b5404c63116fb6e9464846fa009555632f076984c15e1f6081733a0d46f2d6a3cebf79ed9020c9dec8df158a3341f39eaa5fcf1cf42a94849b2352c1a1ecd4fb814c20d07dfda312bd4f2f58c1576b4aa315c96c8786a4cfbb736b2d23c38b1d81c4644ea36afa076e055be5917cd7a92350a7ed66a5ab2253f55c4fd1a0d0e6d4edab5f712edb440c06fac8f07e6d73cc90b2ba713d73c73802361ce46a4eb5ed1060c4cf53207d301f0fcd4f0c9d1580db2fc1059d372076438a01192a7f9fd6f7883f56422866fd9f0afe53fdc910afa5a751cbfa377592579165cb56dc3eb4dce67e3db33a981a56b7d9f7bdea74fbaea3478e6ab2c644fd777b8bfa72aa0f0a52198d36e5b634d2c9a11b7fe0ab2f9a40901c5b148a0192e95a170baf7d5350fe01e569542b93485a41971443485faf57f67f56dfe2c58e539c9f9b449c3f91249a10c1a1be7e0b3eabe8ee0bab1f11f89614dced418c62a07a0b59a1370d6531ba177091c6ad595fb59488204f63344736ea1017affbeb753a99786b1eb64510e2e717ec90e02744bc352d3f1b2ab7be0eb65623d04fb3a046ce7f4da697d829828a52c7b043b2a82ec97fb041bf519b4de316f4e2f5b0db62aed0eed95cad4320c1947c35fd8847a5867872883561119c01b0089213d84db99d439f0f6444d8783dd4b64be3577cd461cf753c8e61c912de2e5d7a7e2baefa258975d16ef3117da59a6c893f3339187df3168b89f0fb0b2198bb6f1594bb88f3d610fcec3e36de04ae10328112e6ff74f5a8ce68d407174b4c0691c7602eab1bb10f3c49dd22b8450782deae9a7315e3b88de79cd15e6c9268165ed3a0fb3f89b183e1a212152003f32a2665d37cdd7f6b56c2453e5580c4d21f9983f38798e9b", "signed": "3c4462aa47010132dbb26311e444727279edade15a4d662cf647f3275cf3253e6de9333830e0517aa5fa7bc2d0e63ea2597a94b0fe92706ecd172c5ec5c7f006bac186d9fe5abda79c3a35a7a3c2eae6ae6ab28247912770c84efd048ebd3aba57c37cf4c6c7f30a79f68a3f76b20cd8c6631fcc96670522080e6b62e887ae6f4436d4caf56943131c52dd282b251cd075f1f7f8e0bdb6bedfc9a0796f5579042b56e69374961b11dfd61b12de2bb7d49bfc509cdb3138f3356a0dded98f5301b7c4a748bf89b23df4f7472ff8b1f505d765c6ff82dbad74b9d7aef22fbcca0b7f35042f9a762bd06902bb21c7f9f7f66bef38901d75012d61d744dee7afd89fc7e908c40685bd440aeda4204d006f26307d82a496963115f90e09f76688291f4a67d6411f76d16617875b2b9982dfdc5ee9b83b9817009319110b5404c63116fb6e9464846fa009555632f076984c15e1f6081733a0d46f2d6a3cebf79ed9020c9dec8df158a3341f39eaa5fcf1cf42a94849b2352c1a1ecd4fb814c20d07dfda312bd4f2f58c1576b4aa315c96c8786a4cfbb736b2d23c38b1d81c4644ea36afa076e055be5917cd7a92350a7ed66a5ab2253f55c4fd1a0d0e6d4edab5f712edb440c06fac8f07e6d73cc90b2ba713d73c73802361ce46a4eb5ed1060c4cf53207d301f0fcd4f0c9d1580db2fc1059d372076438a01192a7f9fd6f7883f56422866fd9f0afe53fdc910afa5a751cbfa377592579165cb56dc3eb4dce67e3db33a981a56b7d9f7bdea74fbaea3478e6ab2c644fd777b8bfa72aa0f0a52198d36e5b634d2c9a11b7fe0ab2f9a40901c5b148a0192e95a170baf7d5350fe01e569542b93485a41971443485faf57f67f56dfe2c58e539c9f9b449c3f91249a10c1a1be7e0b3eabe8ee0bab1f11f89614dced418c62a07a0b59a1370d6531ba177091c6ad595fb59488204f63344736ea1017affbeb753a99786b1eb64510e2e717ec90e02744bc352d3f1b2ab7be0eb65623d04fb3a046ce7f4da697d829828a52c7b043b2a82ec97fb041bf519b4de316f4e2f5b0db62aed0eed95cad4320c1947c35fd8847a5867872883561119c01b0089213d84db99d439f0f6444d8783dd4b64be3577cd461cf753c8e61c912de2e5d7a7e2baefa258975d16ef3117da59a6c893f3339187df3168b89f0fb0b2198bb6f1594bb88f3d610fcec3e36de04ae10328112e6ff74f5a8ce68d407174b4c0691c7602eab1bb10f3c49dd22b8450782deae9a7315e3b88de79cd15e6c9268165ed3a0fb3f89b183e1a212152003f32a2665d37cdd7f6b56c2453e5580c4d21f9983f38798e9b", "signature": "3c4462aa47010132dbb26311e444727279edade15a4d662cf647f3275cf3253e6de9333830e0517aa5fa7bc2d0e63ea2597a94b0fe92706ecd172c5ec5c7f006" }, { "secret_key": "7b30b42dc2c670a195fe2af879fc5de374024588fe3de43e2dd50844f48f42be", "public_key": "82a2ac6079f212b5eedd0c19e9394fafacd74d716fdefbfc6cb8a7eaf41c0362", "message": "c6687aefebc5c816d1a33453beca5020d3a97cda1dac5662f0af72bad444e2fd1176a7b04c1bd09d832618209bf3e33e523538d6daa753046e871dd3b3c7acad33e79c1bb7896407865d168d4bc3757bde4f823c08778626f8c71fb7cfcfdf03a82497bd8be7d8f8ef649030b5f36a339459968e246a1e420853dace41ca850a4eeae834ae119610ca4cd0662aac39621586998027ef2f61485c028506714ae09c76399d873e808158578aa59e8212f58865319f9e0d2b8da7ad529e0ac1f1eb435aecfd35f5abb92bea5073496bf4c0bf15baa273bfc5c3104474a2dcf132c333eb36ec2cbf04fa9580b768f5cea7b5617e5880aff63201c274d669743e1bc556b067902eee29d29111288969cffa879fc9cbf66fbf9326d9d925ac4102fa9f1a06081adec079cbc96746d79b63a012ed77d82c9ffd4e3f161f6cea28cc23fac2a543f5b1d0644ec04838327bcc652b858f93ff463f7e949eec8c9db6569a86984f831df6ac6d95f38f46cebb6e6583657facd2108dbcd0af23ab0101a1301beb48a44caccb91094473d7e5a5c88c644fd3420573b678f17b5174cb14e90fac694d1dbc6c9632b5974aef28ac08d720b2ea30440d2afb0493b40db24efbdbf53c430921e52a10b54661e149d165591a7cf91d6508ea472fb3be16395e30312f19b87c47e46804a0fa29b56b5ac950677bc60238b5e99e030b1e552146a0e88c294cfca835c101c55f3423874cc128756e73a5debe8e97fe2166b65cb44642770c6d1d2390af1b0f31b958c830e9ac4fe2f5ad590582fbb892bf949584477ef7bde23f7dd02b63f7c29088a57251009132ffbb78ed14defbefd9fd31fdcab03ba80a23f333983760abad4f16ddf9dd4414f04d00db56ba72d63a3a13d2c442f549fd66c988d2e4601d13b52f77500dd692bec9d6bd3bafa9242fdcfaeb69b98b0b5789b2803840dec637b49af4381ae3fa429fb53461a0c674eb5aa18dbd607a2b77a96d3ab464ecd97492f6de460c9f11b5c1756cb59cb1348dfd77956b71907c54821e303cb8b14906c003e3484be4ea05a6901d69b07485e858f7b471c635f90395b9a3e2247f1ad12b118ffafc7221a57b10e319b61af1c13606a81616ce3f1d62ba932ff4e63e74b84255e3af5210bbd571bda44cbf44b714422cb45c2ef21f98131ba96b7edb9b03e33d7d188d5b8d904cb4136fe269db146988168e7ee245356354f002a5ea8b35a3a99e83a13272274144b33a60ca", "signed": "0a63b84f46935faf3ea164b00af227b00868a03f5612935e18619a84a2e57b8851d746e63fd9100787f5338d51c1073c2fc5303099e1873e5e3d3e5c036fbe01c6687aefebc5c816d1a33453beca5020d3a97cda1dac5662f0af72bad444e2fd1176a7b04c1bd09d832618209bf3e33e523538d6daa753046e871dd3b3c7acad33e79c1bb7896407865d168d4bc3757bde4f823c08778626f8c71fb7cfcfdf03a82497bd8be7d8f8ef649030b5f36a339459968e246a1e420853dace41ca850a4eeae834ae119610ca4cd0662aac39621586998027ef2f61485c028506714ae09c76399d873e808158578aa59e8212f58865319f9e0d2b8da7ad529e0ac1f1eb435aecfd35f5abb92bea5073496bf4c0bf15baa273bfc5c3104474a2dcf132c333eb36ec2cbf04fa9580b768f5cea7b5617e5880aff63201c274d669743e1bc556b067902eee29d29111288969cffa879fc9cbf66fbf9326d9d925ac4102fa9f1a06081adec079cbc96746d79b63a012ed77d82c9ffd4e3f161f6cea28cc23fac2a543f5b1d0644ec04838327bcc652b858f93ff463f7e949eec8c9db6569a86984f831df6ac6d95f38f46cebb6e6583657facd2108dbcd0af23ab0101a1301beb48a44caccb91094473d7e5a5c88c644fd3420573b678f17b5174cb14e90fac694d1dbc6c9632b5974aef28ac08d720b2ea30440d2afb0493b40db24efbdbf53c430921e52a10b54661e149d165591a7cf91d6508ea472fb3be16395e30312f19b87c47e46804a0fa29b56b5ac950677bc60238b5e99e030b1e552146a0e88c294cfca835c101c55f3423874cc128756e73a5debe8e97fe2166b65cb44642770c6d1d2390af1b0f31b958c830e9ac4fe2f5ad590582fbb892bf949584477ef7bde23f7dd02b63f7c29088a57251009132ffbb78ed14defbefd9fd31fdcab03ba80a23f333983760abad4f16ddf9dd4414f04d00db56ba72d63a3a13d2c442f549fd66c988d2e4601d13b52f77500dd692bec9d6bd3bafa9242fdcfaeb69b98b0b5789b2803840dec637b49af4381ae3fa429fb53461a0c674eb5aa18dbd607a2b77a96d3ab464ecd97492f6de460c9f11b5c1756cb59cb1348dfd77956b71907c54821e303cb8b14906c003e3484be4ea05a6901d69b07485e858f7b471c635f90395b9a3e2247f1ad12b118ffafc7221a57b10e319b61af1c13606a81616ce3f1d62ba932ff4e63e74b84255e3af5210bbd571bda44cbf44b714422cb45c2ef21f98131ba96b7edb9b03e33d7d188d5b8d904cb4136fe269db146988168e7ee245356354f002a5ea8b35a3a99e83a13272274144b33a60ca", "signature": "0a63b84f46935faf3ea164b00af227b00868a03f5612935e18619a84a2e57b8851d746e63fd9100787f5338d51c1073c2fc5303099e1873e5e3d3e5c036fbe01" }, { "secret_key": "6656f4d4718157c4bac38ff7abe5eb1f812c0b986d9c014abad5b09aa6c8ee4a", "public_key": "f3087898e452be9e30aecc4e8ffe0c01169888683f62a45b8da38299014f5b4a", "message": "94d9e5e5a7b705d9d976fe71e94d3f7fa7866afbf7ece424f136327799b2b206ce4ef4c3f3e705553afc8fd5c1952a4c16658d4a78afbb9a97f27193c65b65b82e8f3b71515fac82640e0f8a5fb35ae6fc6a3db051a22d4a5300413e6e33d19c2013c2983aca8ad6cec2ce64a814164f061a1a3c5a8610a7650bfb5423d4362ce02206dbe4a6fa826f03b42ac3cd9ea4c651401b3cea82c3993f6af8b2c9e2e6ffe69280ab3f09fbe90dd547ccda9d9e8e8a537b3b360554227ed0709f293198982efb5efb0e73e00042d1a063b57452027dce1a39e4b0068f58b111ec5dc142bf419ad893d54f4260cbde7628f783de8496380306a4eff6d82869104259c94c54ad5aa8b067c42496cb88dd31150ea04d499bfac91f4bb3e68af5af7a568a3e4ce7f170d98601163f4952f1d25e12e00ef0a2d8f111afdb0fafbad2bf8e8b9d49363fca68183617b541270dda4609b2616729ab1b8c42dbdd7bf986af8fba52e733e42ba03c892e1e1ec06a90b163f5a79f6165eb7316972ac1adbfcf1dcab07847ef82c2cab1015dbb50aadc79fe11c832098cacc39820ab085b6963bd42160ed6613bae5e201f17c0fd7f32357ae350ce9cbbe926fa42dcbd422ac1bf09a19ad1f69469e4d1dcb124118ed4522d353c174298650ff88382fa2fdbb286c45b18a9baf6f6763ac20c9ca4767d348c4b8ded630076657b85b14c11ae2737ea29a43515b7f05674a0cd3ed4bf6a3d189ae972218f877cd8aa69499d5a08c99e440694ccaccdf1f642e14e90105bee6d98edeeab3b4f339f300188aec0c16bd64521d9287398e648db94330ed8f6b9ab6c7ad93ffc43e8792e637c61bff7d856e54ef4987384e312cb57017a50eae5952abe19d8999c8c82dfc45798cc17c8d9496bf520ecc5b77fe284915566c45685c304a2acd525ef12c86f38aef554d8a2384737cc4133fb7e2b65c13bef31668a6c2f60eecd8412eeff7f6b605cbe95083e233ec1a7bb36de236c8a71ba2872be946cd3b38935f5da64c8fec8e14f45ccf6124bab7f70567c2f2bfdd56667609572037c76146c991707659b5709b074e3451f921a2df283b96aa26ab476625016f181ad64c9919cf41d714a1a9a5e2bb26baf8770b2eba77b778a332677a7572ee3a2b1dc05f7356bdcae5f55e35329e34caa79430b270c036160dc9fcaab5b254543ac94b24681f17172b6159d16621d7ad0eebd895a1e1d09b916a86fb48e4c91661057eee95c0870ed54", "signed": "9c2c39915aed6add004e7dd684ee3dcdd10d87a487f677e73c2bce0fca7d508796464150a52a440f5237850a009c72162d9d2985470a33490e66d3c401704c0594d9e5e5a7b705d9d976fe71e94d3f7fa7866afbf7ece424f136327799b2b206ce4ef4c3f3e705553afc8fd5c1952a4c16658d4a78afbb9a97f27193c65b65b82e8f3b71515fac82640e0f8a5fb35ae6fc6a3db051a22d4a5300413e6e33d19c2013c2983aca8ad6cec2ce64a814164f061a1a3c5a8610a7650bfb5423d4362ce02206dbe4a6fa826f03b42ac3cd9ea4c651401b3cea82c3993f6af8b2c9e2e6ffe69280ab3f09fbe90dd547ccda9d9e8e8a537b3b360554227ed0709f293198982efb5efb0e73e00042d1a063b57452027dce1a39e4b0068f58b111ec5dc142bf419ad893d54f4260cbde7628f783de8496380306a4eff6d82869104259c94c54ad5aa8b067c42496cb88dd31150ea04d499bfac91f4bb3e68af5af7a568a3e4ce7f170d98601163f4952f1d25e12e00ef0a2d8f111afdb0fafbad2bf8e8b9d49363fca68183617b541270dda4609b2616729ab1b8c42dbdd7bf986af8fba52e733e42ba03c892e1e1ec06a90b163f5a79f6165eb7316972ac1adbfcf1dcab07847ef82c2cab1015dbb50aadc79fe11c832098cacc39820ab085b6963bd42160ed6613bae5e201f17c0fd7f32357ae350ce9cbbe926fa42dcbd422ac1bf09a19ad1f69469e4d1dcb124118ed4522d353c174298650ff88382fa2fdbb286c45b18a9baf6f6763ac20c9ca4767d348c4b8ded630076657b85b14c11ae2737ea29a43515b7f05674a0cd3ed4bf6a3d189ae972218f877cd8aa69499d5a08c99e440694ccaccdf1f642e14e90105bee6d98edeeab3b4f339f300188aec0c16bd64521d9287398e648db94330ed8f6b9ab6c7ad93ffc43e8792e637c61bff7d856e54ef4987384e312cb57017a50eae5952abe19d8999c8c82dfc45798cc17c8d9496bf520ecc5b77fe284915566c45685c304a2acd525ef12c86f38aef554d8a2384737cc4133fb7e2b65c13bef31668a6c2f60eecd8412eeff7f6b605cbe95083e233ec1a7bb36de236c8a71ba2872be946cd3b38935f5da64c8fec8e14f45ccf6124bab7f70567c2f2bfdd56667609572037c76146c991707659b5709b074e3451f921a2df283b96aa26ab476625016f181ad64c9919cf41d714a1a9a5e2bb26baf8770b2eba77b778a332677a7572ee3a2b1dc05f7356bdcae5f55e35329e34caa79430b270c036160dc9fcaab5b254543ac94b24681f17172b6159d16621d7ad0eebd895a1e1d09b916a86fb48e4c91661057eee95c0870ed54", "signature": "9c2c39915aed6add004e7dd684ee3dcdd10d87a487f677e73c2bce0fca7d508796464150a52a440f5237850a009c72162d9d2985470a33490e66d3c401704c05" }, { "secret_key": "14383e6e5604c99c248d39be51d164b13442b05e51d78ecd999364221a45036b", "public_key": "2fc16138220ab74b3bd446f8a714b58d5463d40d4367925007474c5b9e35d494", "message": "c4753b7f7a6f6dea2515c6e3d29561506f4f36e0de84999221f228e20bd5128ed93bdb8d1193237d8e294169a2bc448af9dd36066301efb7fe1231353c0623ffe1115debb6905ac6946ee382a27c3c09e1b1f5c11493dba37da0ff6eea75d9fab0ee926d701dac2fc5b7ef578880a5d5eeecadc1f4bcc4cd4ec6f2f14f52a8c164072e6fde5ab2ee9cee0b48e51af055f9fec7c63750fedf72332b23863a1e54c52b461a21506dfdfc63880e22d89c894412666c929821c0e439e745415f717969e6058554d64b947a4fc9d16acae3e49aec08801a09d972f79ead68d529768069735caa742b45a5830581b80ca061a6c1515e3f7d5a9337878c19fc94eef22698ea6c4d05f9ed411b6b8f052b5ff15dc23a64beeaae99f84893de3df940a4e0b8e993930139052d99be47bca8775f8563bd4026b71343d51968f2337528f4c9db8bbd0a298af04b27695d86b7f7ba6c4ccc6273febcd8f75cff266995244fc1fa13d8d843f0bff49cc2d508f4a2b3aad1d95fb22a2bc6ad1b966b0812d99070bba07c923ee4d08107486dc01a06dba6f1d5f105aceade33b166510e427ebbce52a3e7831f0f78a3c6e072608334d8021c338a73cc0c47f19c9fae403b9716d0d15fbdf6466b08f6acce3f50a703b1dea8d826df842ca1ba20d29f4548acfc754cf011f570681b59e4da25385ebd6d5c3adc930529e166ce6705f6010210db106462b3333204e7adadee6606a56206b47eef2074b116e22a615418ec2cdc331f1e19e07e8a37b92d69df0734e085daeeb901ec6e8c35f103f1d86ef0d2a2652b01d183597e4cfdeedfe5df9a7ef66a1c796a37a27113b944dd7ba17c460015ab8ace451c57850ec6c290c54e5113f55e99a8e6e4711e3b7817bf91a5adb37fb9461be6b1b55d586046e42a54c5def4076f1ff6c31b806fc602474356aa2899eae70f5e5abf1f75a7f24c134cde11793bb162e03a583d5be046acc73456d12d509d92f7705768686f6c714a4e57ec88b71398e23e835d6d6547225996b7ed08f3b7443bb17c899409493d0efe8455bec8e8c284a3b149a5b4ca631ea620b1bb817cedaba50b044411849d260a6f2a0d3f2cceec3842719a5ea4fe18dde0d42dcb33ad21e6453325af6f3c009f2bb978d30ceeae9aa4928bf73767cda9292ab893ce5fa3aa4c232163b45c64ed7977779b1c0cafcfc2b9fa084a324f113adeec218b4735b6b464db6d46c2791af3455f1ca5ea1e9a048c051a54dfa0", "signed": "45e8ed1a751dfc3b9b7bd7a10bf5bdcf8ca461865a490c105f10452941cf87721214bfbf3a35606b7ce35d6f70aaf2d5eadcc0de035e9b2f6d7b862fc2849004c4753b7f7a6f6dea2515c6e3d29561506f4f36e0de84999221f228e20bd5128ed93bdb8d1193237d8e294169a2bc448af9dd36066301efb7fe1231353c0623ffe1115debb6905ac6946ee382a27c3c09e1b1f5c11493dba37da0ff6eea75d9fab0ee926d701dac2fc5b7ef578880a5d5eeecadc1f4bcc4cd4ec6f2f14f52a8c164072e6fde5ab2ee9cee0b48e51af055f9fec7c63750fedf72332b23863a1e54c52b461a21506dfdfc63880e22d89c894412666c929821c0e439e745415f717969e6058554d64b947a4fc9d16acae3e49aec08801a09d972f79ead68d529768069735caa742b45a5830581b80ca061a6c1515e3f7d5a9337878c19fc94eef22698ea6c4d05f9ed411b6b8f052b5ff15dc23a64beeaae99f84893de3df940a4e0b8e993930139052d99be47bca8775f8563bd4026b71343d51968f2337528f4c9db8bbd0a298af04b27695d86b7f7ba6c4ccc6273febcd8f75cff266995244fc1fa13d8d843f0bff49cc2d508f4a2b3aad1d95fb22a2bc6ad1b966b0812d99070bba07c923ee4d08107486dc01a06dba6f1d5f105aceade33b166510e427ebbce52a3e7831f0f78a3c6e072608334d8021c338a73cc0c47f19c9fae403b9716d0d15fbdf6466b08f6acce3f50a703b1dea8d826df842ca1ba20d29f4548acfc754cf011f570681b59e4da25385ebd6d5c3adc930529e166ce6705f6010210db106462b3333204e7adadee6606a56206b47eef2074b116e22a615418ec2cdc331f1e19e07e8a37b92d69df0734e085daeeb901ec6e8c35f103f1d86ef0d2a2652b01d183597e4cfdeedfe5df9a7ef66a1c796a37a27113b944dd7ba17c460015ab8ace451c57850ec6c290c54e5113f55e99a8e6e4711e3b7817bf91a5adb37fb9461be6b1b55d586046e42a54c5def4076f1ff6c31b806fc602474356aa2899eae70f5e5abf1f75a7f24c134cde11793bb162e03a583d5be046acc73456d12d509d92f7705768686f6c714a4e57ec88b71398e23e835d6d6547225996b7ed08f3b7443bb17c899409493d0efe8455bec8e8c284a3b149a5b4ca631ea620b1bb817cedaba50b044411849d260a6f2a0d3f2cceec3842719a5ea4fe18dde0d42dcb33ad21e6453325af6f3c009f2bb978d30ceeae9aa4928bf73767cda9292ab893ce5fa3aa4c232163b45c64ed7977779b1c0cafcfc2b9fa084a324f113adeec218b4735b6b464db6d46c2791af3455f1ca5ea1e9a048c051a54dfa0", "signature": "45e8ed1a751dfc3b9b7bd7a10bf5bdcf8ca461865a490c105f10452941cf87721214bfbf3a35606b7ce35d6f70aaf2d5eadcc0de035e9b2f6d7b862fc2849004" }, { "secret_key": "59b07263b22c0a38bbc591059594b2bd927e805961dd07e1f94245b23aa2e016", "public_key": "0b1e4cf5aff278ec65b405f5108e1b5b18a969ad1f1e6381912c82d698907cba", "message": "08ce0d4db5c2aa500a19efbc8dc8549250f7dd46a7a9a5407417b3d51820e4b0d61275583f56f897fd942bdd7311ad6baf738128567af6558d75906a02c4343a9955d59b11088c588dc7dd08f67965c5602a56928dda4ae164293163b517ca17ded04fe4ab2f9789130ae96ab231f07e09015b78f3848cef435db0ad9f35e0fbc9851e3ecfc9fb186d14d8da4dda45d0b3eb3ee4500c101e3194b572140689cd75da1287b254f374e3d93326ae5faf114018ac714bd00375d92a8bb659c32912831f4f20776e9e2c25029f0aff39fddac7241543a0366b84de7b1ff23e8e4dc093df0d2dd5e53e6847948cf3d0ff3f564ad94d9cc00a5ea5b695e408bf50f5bab2f6ea87ba8ad3a1940195cf1bc2b5b34847ad3a5effb8a7823de91ef1633869d1f04643af4d826a59e78b9d186312b3d972263654ac5587b80b717646f31003db81ac70860d3fc8cd3a6a0a0d576d25731ef7b8966263d7a05b55009e8a23dac0f9a21a24b06e13900e444446fdfe56cbc1a026df41066b201b1481e56158926c0c9ea90f0c645aab4bef12d4e072cbfdc3c3d5e0c72cf88f166de048874f3534e040c62b1662821bdd16b0e8582817461cb2689279b446d70c8ac20ad03e598cad4908c52c350d4243ee8aedb87a4af977f7db57cd947b47d6bb51409d80d81f6db03cb9a6a6b79812f470690afc1836a531338094cf26d3c1232fd5605d8f8c55b6f8a2a7ef1e0c78155594b237956d2abad6a9adcd58e11ccd35cc995b9a0aecbf7f5741ac051b04ef6b9744b56fccb46398528bb31fbe84e078843e69bf338898cdef69ad41872395e46b593904825547e00bdaf221f8fa587ea2037ffb9ac9307dd3f8f35ec5386ba966333e2ac8727b0e1b80612d3c7f2cb88baacadfe2163bc38c88842e76a394571d40610e8a297602793763296e3eabf720e984b2edd28cf5c4e0f9a0f76aceba28cc1f1b69ff1d35b4bd3347b7f9a95a4c1ea10734e1c918eb96249d0cc70b477f6f23809bbda901d53f485a71f5086002c1b71efcc41cb1aeb5122a3f3bfc96c51a55d75c02984288be657887854cfa738974bcd5440146f9bb14040de54f5444ad43b79af9bdb24ed6a48eb2fdeed71f31f0ece102e918e95635c7a038633ee348d8b5781652d5059d215ac97f30ea20d277ebbf15246905428a7bec02b8f926315bad6723fd64d71fc95f333364cbe90d4646333c40dda6d1d433b7c195a758dbb4038af5dcc7232d4547f540e394", "signed": "886da33e3553285ea59c1431b6e86ea49bb68b2e0efd2b157e7791b74f35a2421bb359f3dc1e4ce5f11f73652e03bfc0b429c58f0f2d7418c7c20bce2e2d190108ce0d4db5c2aa500a19efbc8dc8549250f7dd46a7a9a5407417b3d51820e4b0d61275583f56f897fd942bdd7311ad6baf738128567af6558d75906a02c4343a9955d59b11088c588dc7dd08f67965c5602a56928dda4ae164293163b517ca17ded04fe4ab2f9789130ae96ab231f07e09015b78f3848cef435db0ad9f35e0fbc9851e3ecfc9fb186d14d8da4dda45d0b3eb3ee4500c101e3194b572140689cd75da1287b254f374e3d93326ae5faf114018ac714bd00375d92a8bb659c32912831f4f20776e9e2c25029f0aff39fddac7241543a0366b84de7b1ff23e8e4dc093df0d2dd5e53e6847948cf3d0ff3f564ad94d9cc00a5ea5b695e408bf50f5bab2f6ea87ba8ad3a1940195cf1bc2b5b34847ad3a5effb8a7823de91ef1633869d1f04643af4d826a59e78b9d186312b3d972263654ac5587b80b717646f31003db81ac70860d3fc8cd3a6a0a0d576d25731ef7b8966263d7a05b55009e8a23dac0f9a21a24b06e13900e444446fdfe56cbc1a026df41066b201b1481e56158926c0c9ea90f0c645aab4bef12d4e072cbfdc3c3d5e0c72cf88f166de048874f3534e040c62b1662821bdd16b0e8582817461cb2689279b446d70c8ac20ad03e598cad4908c52c350d4243ee8aedb87a4af977f7db57cd947b47d6bb51409d80d81f6db03cb9a6a6b79812f470690afc1836a531338094cf26d3c1232fd5605d8f8c55b6f8a2a7ef1e0c78155594b237956d2abad6a9adcd58e11ccd35cc995b9a0aecbf7f5741ac051b04ef6b9744b56fccb46398528bb31fbe84e078843e69bf338898cdef69ad41872395e46b593904825547e00bdaf221f8fa587ea2037ffb9ac9307dd3f8f35ec5386ba966333e2ac8727b0e1b80612d3c7f2cb88baacadfe2163bc38c88842e76a394571d40610e8a297602793763296e3eabf720e984b2edd28cf5c4e0f9a0f76aceba28cc1f1b69ff1d35b4bd3347b7f9a95a4c1ea10734e1c918eb96249d0cc70b477f6f23809bbda901d53f485a71f5086002c1b71efcc41cb1aeb5122a3f3bfc96c51a55d75c02984288be657887854cfa738974bcd5440146f9bb14040de54f5444ad43b79af9bdb24ed6a48eb2fdeed71f31f0ece102e918e95635c7a038633ee348d8b5781652d5059d215ac97f30ea20d277ebbf15246905428a7bec02b8f926315bad6723fd64d71fc95f333364cbe90d4646333c40dda6d1d433b7c195a758dbb4038af5dcc7232d4547f540e394", "signature": "886da33e3553285ea59c1431b6e86ea49bb68b2e0efd2b157e7791b74f35a2421bb359f3dc1e4ce5f11f73652e03bfc0b429c58f0f2d7418c7c20bce2e2d1901" }, { "secret_key": "5cc115d839e058cdb6518ee9c161c004d88bd3908d3cf6d52c8f296a1a076b9b", "public_key": "1e8f3305bf2fa11b17d92416ab0ea762396d88f2f970ef0b100ed3bf5cc13440", "message": "533e49c1d5f33c5ec4be84c619f4ec649c25fd70bdcfe257a63c3373a4d089c89af6eeb7160dd77ab66b1ee7e10850ab4fc1f35132332b53789b2b0140c4f20f97f2142072d624aff7aad324aacd068c035aff52fa712f4e74832de031b2642314d17110dee6fb85762dc30d7e97782fd1fbff7179f00917f55af7503a5b7e23c6eadb65e104f1517b6624c9e5204b3fd29a6585e92ce3a3eee2c5ae177920f7b4ab2cac87d672ab6baac1186d904aea3498534eb5ab23e4ac4c0ddb0d82a5ae531d76549d367628577bac4235e897d9fe205522047d214ff6ccf311c4e397827d97f2868e70ac17d28e334999744d359376a482fdcb414b02b2687b962ee8086e573fe000dc51dee06879c684e25f94cee5e861347e7be7fca549a0f765136a2f4b88fede07024dd2fce1f6d0c0354da1a16ef366b315b3f7233031f979b70eac6e23bf3b349efbd0e4f53f4d5c41fc004276a59670659f6905ef03d2fc098d589fcbc1328282fa22b10db83c5d70865994fd19d760a39d476e02330d2c6d19e742267dd365bbe1fe5c711a95b184508ce48c1c96d7e63990b408d45089be79e32f9cb0162fd1e7d0d19d97d0ae78ff824cc6989486c0bd038352551f37499e9e9826804e9d2624ad0c7b7534560f45fd7d324b8e517e01c9b2743c14979cfd512bc3fe667279b3a277fb463e9d7349b64ffc9fe60884c21e481081ed70e6da5a3539c448971f0d9787289fcb0080f219e99449f8298c42475f87fd10aeb509c530cf6a57748eb8f3562161fa4875ea953f09659c7df7a9950f0317467cb4e5366e196e32f5e2696733a25eacbde49210490762060ea231370d4090429bb06bb867399e8d37bf5d21a0e72147e496cf3b7dd6fe6e5edea9668d802190a91c600e29523f8eb904e48b70412bc10a7020984c5ff0f5f383f214ae594dc85971e480372848d0d7e7cc5c18ff88ba9b262d7884698a41c6c7819c0319fdc6bb07b91dc1694dafe3af37a538bf2b2d8cacb27d24cdc6eadb8c6a2e6b7df8a4654ae937850c890ad930980afcc1492db8a0168cbc9f10657eb48d2ac87f5175d23caed4b5e6f10bbeaa5e33fc5f6418d63ba374ab1a3cbd36b729ddbdaba989d4645e3a66130bae417cad086dadd30843352514c375f2571abaf93e9a0771fa103ae92585b04f55c434769b43d6d22f753f9306036e53524f6f4d9ccbd2c30317a8e899f316149035894da945b76d9082bfee328e7a31b66328ee8b94e068c7", "signed": "0371c2d64c5ec0c8276ca5ffa615eff42f9efffc58dd8ecfcf67620a9bcb38faf118932bf2cd5b9205fa551334df2a757c597744f791f371fbedd98b21f73405533e49c1d5f33c5ec4be84c619f4ec649c25fd70bdcfe257a63c3373a4d089c89af6eeb7160dd77ab66b1ee7e10850ab4fc1f35132332b53789b2b0140c4f20f97f2142072d624aff7aad324aacd068c035aff52fa712f4e74832de031b2642314d17110dee6fb85762dc30d7e97782fd1fbff7179f00917f55af7503a5b7e23c6eadb65e104f1517b6624c9e5204b3fd29a6585e92ce3a3eee2c5ae177920f7b4ab2cac87d672ab6baac1186d904aea3498534eb5ab23e4ac4c0ddb0d82a5ae531d76549d367628577bac4235e897d9fe205522047d214ff6ccf311c4e397827d97f2868e70ac17d28e334999744d359376a482fdcb414b02b2687b962ee8086e573fe000dc51dee06879c684e25f94cee5e861347e7be7fca549a0f765136a2f4b88fede07024dd2fce1f6d0c0354da1a16ef366b315b3f7233031f979b70eac6e23bf3b349efbd0e4f53f4d5c41fc004276a59670659f6905ef03d2fc098d589fcbc1328282fa22b10db83c5d70865994fd19d760a39d476e02330d2c6d19e742267dd365bbe1fe5c711a95b184508ce48c1c96d7e63990b408d45089be79e32f9cb0162fd1e7d0d19d97d0ae78ff824cc6989486c0bd038352551f37499e9e9826804e9d2624ad0c7b7534560f45fd7d324b8e517e01c9b2743c14979cfd512bc3fe667279b3a277fb463e9d7349b64ffc9fe60884c21e481081ed70e6da5a3539c448971f0d9787289fcb0080f219e99449f8298c42475f87fd10aeb509c530cf6a57748eb8f3562161fa4875ea953f09659c7df7a9950f0317467cb4e5366e196e32f5e2696733a25eacbde49210490762060ea231370d4090429bb06bb867399e8d37bf5d21a0e72147e496cf3b7dd6fe6e5edea9668d802190a91c600e29523f8eb904e48b70412bc10a7020984c5ff0f5f383f214ae594dc85971e480372848d0d7e7cc5c18ff88ba9b262d7884698a41c6c7819c0319fdc6bb07b91dc1694dafe3af37a538bf2b2d8cacb27d24cdc6eadb8c6a2e6b7df8a4654ae937850c890ad930980afcc1492db8a0168cbc9f10657eb48d2ac87f5175d23caed4b5e6f10bbeaa5e33fc5f6418d63ba374ab1a3cbd36b729ddbdaba989d4645e3a66130bae417cad086dadd30843352514c375f2571abaf93e9a0771fa103ae92585b04f55c434769b43d6d22f753f9306036e53524f6f4d9ccbd2c30317a8e899f316149035894da945b76d9082bfee328e7a31b66328ee8b94e068c7", "signature": "0371c2d64c5ec0c8276ca5ffa615eff42f9efffc58dd8ecfcf67620a9bcb38faf118932bf2cd5b9205fa551334df2a757c597744f791f371fbedd98b21f73405" }, { "secret_key": "75a503f48ffc221617672519111bf90da39da9eab2e2914fd3755f10f5393668", "public_key": "f680cc0f6358cdcf537aa71128cfadfc0f3a89c100aa34bcd2427e248b6ed50b", "message": "7b01090423236cb4b13c4177fce52a7ff6580588cc2eb5a3f39ff5d0c73e01e01bf7bd74afe4151250c391426ea507271bea1d6d85f0b2fe35c40500f98d0656c6388fc9efba1837db22dfa29d892676f50e575fe89fd29389d09d080bad67ba544cacabf5a7738237c55e2875ed4916302a2b4dc496e74273bf05191137810e50e48195260bab6d81f9c80562ee73ccb9333cd9b61daf5b0038a4e6c5c958a91f68508c1d882519c1aa4ffcc53562463a0ae30163696f84b97ccbd8679820edd3617e7b896eeffe341ec6b5b03f73b625d741c655fe6e82d11d478a7d543ff6c0fa3a3a8c94a616fb847070d1fbdde6010f026b089cd863c3bd29b1c4269f77659e515728890c973be87f0b833ca5af6b4c3133ad4fa4f91655c6adb5b7235c27fe348284f3f13366a6a03ad22b87c6f5584bdeaea48c70325d6e33a475f50511063875192a87edc388089b84395390c2a3ad89a22595dc4a715a42a2c0efdef67b354b34fc75ca98df913e759e51c7f625ddd598ac22d421decb57bebd54220ec6daa5ece769d2e01be7b6bee2ff5a0b06b32d6da1d7bc057e3abfaab242a3f7e6646a159e4f505e4662982b13d0cc1fba91d10309a42dc1087cf10d36e31f170615a0acb508bf683e2de00c87640d304a947bc4971ff3619c72abd83c7b2cbb3464c4040c2662b58508b74680cfa6de06e8d21e3bec8511199312680009071f706b7b133a2487d5745ffadd5dc0eb2b553df440787f011dda37719fa71315e8b291efd77da3ba14fb995f03571a3db522b63c60be5619941699b39222b59d0f23e5eb37ead4b7f750ed4abf4db87c70da665bef4d7a2921b2c99897f2321c9be6075e744c8228639ab736dbeb2beab440c156a39a2efd261db50855e304d9cfeb99141c613558109f21474d272a2d906d4893934aff8e08a4fcee964a5cd00732fd33af29849c8dfca65979421857185cf629f86807a85973d3440a6bf811a58d041387249811ec047e5e8b343b2387d0181e0d0bd461ef10e8164aae357d9b29dc0ace3ec6d743ae3454ab9f842a28d5710217dffe50344e8d932f1801b0e8f966198ef1c9cc6969f34734aa6a63aeaab4339f75d34ffa8acb937ed9c73092a309a9b84a25011e3114c265e4f602337eb699b5a22d572b03e4dad03b0461c00db9679b72fc5b493ef4486f85535d813a58080385afd4e8d871828034334bfe441d18984e4dfcde024403b5ae66cc50a47301b57f9a32f740bdc7ff1d", "signed": "df28e3e630360867864bc41e43fd7ddeb52876dce9b234a3fcc3d8549db0112e176390a685ebd484936e25c08c8a3878a37b3c4e239ad0a0e5019937ffbcd4077b01090423236cb4b13c4177fce52a7ff6580588cc2eb5a3f39ff5d0c73e01e01bf7bd74afe4151250c391426ea507271bea1d6d85f0b2fe35c40500f98d0656c6388fc9efba1837db22dfa29d892676f50e575fe89fd29389d09d080bad67ba544cacabf5a7738237c55e2875ed4916302a2b4dc496e74273bf05191137810e50e48195260bab6d81f9c80562ee73ccb9333cd9b61daf5b0038a4e6c5c958a91f68508c1d882519c1aa4ffcc53562463a0ae30163696f84b97ccbd8679820edd3617e7b896eeffe341ec6b5b03f73b625d741c655fe6e82d11d478a7d543ff6c0fa3a3a8c94a616fb847070d1fbdde6010f026b089cd863c3bd29b1c4269f77659e515728890c973be87f0b833ca5af6b4c3133ad4fa4f91655c6adb5b7235c27fe348284f3f13366a6a03ad22b87c6f5584bdeaea48c70325d6e33a475f50511063875192a87edc388089b84395390c2a3ad89a22595dc4a715a42a2c0efdef67b354b34fc75ca98df913e759e51c7f625ddd598ac22d421decb57bebd54220ec6daa5ece769d2e01be7b6bee2ff5a0b06b32d6da1d7bc057e3abfaab242a3f7e6646a159e4f505e4662982b13d0cc1fba91d10309a42dc1087cf10d36e31f170615a0acb508bf683e2de00c87640d304a947bc4971ff3619c72abd83c7b2cbb3464c4040c2662b58508b74680cfa6de06e8d21e3bec8511199312680009071f706b7b133a2487d5745ffadd5dc0eb2b553df440787f011dda37719fa71315e8b291efd77da3ba14fb995f03571a3db522b63c60be5619941699b39222b59d0f23e5eb37ead4b7f750ed4abf4db87c70da665bef4d7a2921b2c99897f2321c9be6075e744c8228639ab736dbeb2beab440c156a39a2efd261db50855e304d9cfeb99141c613558109f21474d272a2d906d4893934aff8e08a4fcee964a5cd00732fd33af29849c8dfca65979421857185cf629f86807a85973d3440a6bf811a58d041387249811ec047e5e8b343b2387d0181e0d0bd461ef10e8164aae357d9b29dc0ace3ec6d743ae3454ab9f842a28d5710217dffe50344e8d932f1801b0e8f966198ef1c9cc6969f34734aa6a63aeaab4339f75d34ffa8acb937ed9c73092a309a9b84a25011e3114c265e4f602337eb699b5a22d572b03e4dad03b0461c00db9679b72fc5b493ef4486f85535d813a58080385afd4e8d871828034334bfe441d18984e4dfcde024403b5ae66cc50a47301b57f9a32f740bdc7ff1d", "signature": "df28e3e630360867864bc41e43fd7ddeb52876dce9b234a3fcc3d8549db0112e176390a685ebd484936e25c08c8a3878a37b3c4e239ad0a0e5019937ffbcd407" }, { "secret_key": "d8aa2a0aa514fd845f7aa66b83c0eabb9c16023abc1695773450b2bb332522f2", "public_key": "e4e8d6b298248c15fe08f87a3bc6084bf2d64d7f1e4b2d51599e9fad9cc91092", "message": "08deb3b832f52d6556f78c3f0abe46f1efe45e3d5d88e7f8edf803670ce4612921749e9ece63fdc9bef2ba483812bb622be744d40404fd6e09c9e1cb7ce19de81a9dadf556352ee89810c76a9b1047ac62b16ebb7da23ddc2d4ab76a020561d02d41b58b94953a23faafddd781b7dca7b7fbee706ec10a73125bf74436056bf3b4f2a0701cfef05bebd3dd8eef306c1ac1b00950881ff05ab5c8248ad1096ac91d526ae59ba0583b27db7d1e390f57a5889e2799a4a1519b15d93dbf0b21d450873c76ba520461e8bb5c83c9012eacd557bea640586efcb869007647d449f91ccd52afe3a89477de7c2b647ecc9bf967fbf5769d74889447d9522d9e8069c3499af6a8a1097a95d3bcc5f83433934484314cb30758b525fe53e90721df5cbe03d96f0d0f98521f01a5fbe57ce8804dbd18f8f5eac8f7dbb58c41789a44433f8a8d1245d2adda8c78d881c65ea661ab178d4fc2634cd6cb514ab6f2543e9112183f3ff73a3f450106b0ee8a347a80cb824ac1f80164e3bb5123698de0e747359ca35acaa3ba0c943beacd7a9bdf8ff73978e9fb002045e8fe5648cc0f9cfa88b0d812e81aa62e0d9c73fe613afd9539bcb615721fb497d62f65c83b87a6d2143f9b1c880ec8671bd42c8de957b1a68ee49226ff717ccc6e74f2eee49c30dea53fec3cd4d90f2cccd8f97c55d5c752454be2ba7b6ff2030be67e0df50c5e883843e71612f2b95359543e2ba1bf2e98debcf5768f2be6fd504d9783ce921a81e09416dbcf2bb655a924b1ef0112d671f084a5b690b0b64a8b9bf50333c359ff3fef199694f9b6292424f00666cef6d06d161a79e3a1b9b9629eea53505f5e36aeadfe0d759672b0ffe498397d90a55d9944b30541a7e1bdac53020640137dc252aef622f3819d36ab498d763e4327ba8580dd9f7e5f47c24cc9928734b7e62112c57e3e0cfedecdcbaccb0c45af8219455ee7223c71e7e20410c5244eb827af2f3935ce4755444747aa945f4c26db3a298519e75fc6bace91529972e8691b694d30aa8b5ec4c1a028d3bd10bd0c8a408fb7d9d703495553ecea598d0622dcc74de489ba7195cdae8d5cff9855921837b528433ee55c0b7090857a0c2784d9310b4825a7993ad9c6f18f83bca5cc6a25047168a8376b062e3a48ea90cad88e331187c2b6f281426f81f78804a895c4ec06c341fe846af4527ea26069dcf61d813fddf0fc43c707350bfb2fc1cffcee7d7ccd7d75f7a465a3d14d57302c146aba3e", "signed": "146f65d43e715542894b7900a2f8cd4b17d3870a6100e37de005b0db5d8151246de4ee3842d3ebca20a5da22a363a7575e7a55128295f27211484af57cd5310908deb3b832f52d6556f78c3f0abe46f1efe45e3d5d88e7f8edf803670ce4612921749e9ece63fdc9bef2ba483812bb622be744d40404fd6e09c9e1cb7ce19de81a9dadf556352ee89810c76a9b1047ac62b16ebb7da23ddc2d4ab76a020561d02d41b58b94953a23faafddd781b7dca7b7fbee706ec10a73125bf74436056bf3b4f2a0701cfef05bebd3dd8eef306c1ac1b00950881ff05ab5c8248ad1096ac91d526ae59ba0583b27db7d1e390f57a5889e2799a4a1519b15d93dbf0b21d450873c76ba520461e8bb5c83c9012eacd557bea640586efcb869007647d449f91ccd52afe3a89477de7c2b647ecc9bf967fbf5769d74889447d9522d9e8069c3499af6a8a1097a95d3bcc5f83433934484314cb30758b525fe53e90721df5cbe03d96f0d0f98521f01a5fbe57ce8804dbd18f8f5eac8f7dbb58c41789a44433f8a8d1245d2adda8c78d881c65ea661ab178d4fc2634cd6cb514ab6f2543e9112183f3ff73a3f450106b0ee8a347a80cb824ac1f80164e3bb5123698de0e747359ca35acaa3ba0c943beacd7a9bdf8ff73978e9fb002045e8fe5648cc0f9cfa88b0d812e81aa62e0d9c73fe613afd9539bcb615721fb497d62f65c83b87a6d2143f9b1c880ec8671bd42c8de957b1a68ee49226ff717ccc6e74f2eee49c30dea53fec3cd4d90f2cccd8f97c55d5c752454be2ba7b6ff2030be67e0df50c5e883843e71612f2b95359543e2ba1bf2e98debcf5768f2be6fd504d9783ce921a81e09416dbcf2bb655a924b1ef0112d671f084a5b690b0b64a8b9bf50333c359ff3fef199694f9b6292424f00666cef6d06d161a79e3a1b9b9629eea53505f5e36aeadfe0d759672b0ffe498397d90a55d9944b30541a7e1bdac53020640137dc252aef622f3819d36ab498d763e4327ba8580dd9f7e5f47c24cc9928734b7e62112c57e3e0cfedecdcbaccb0c45af8219455ee7223c71e7e20410c5244eb827af2f3935ce4755444747aa945f4c26db3a298519e75fc6bace91529972e8691b694d30aa8b5ec4c1a028d3bd10bd0c8a408fb7d9d703495553ecea598d0622dcc74de489ba7195cdae8d5cff9855921837b528433ee55c0b7090857a0c2784d9310b4825a7993ad9c6f18f83bca5cc6a25047168a8376b062e3a48ea90cad88e331187c2b6f281426f81f78804a895c4ec06c341fe846af4527ea26069dcf61d813fddf0fc43c707350bfb2fc1cffcee7d7ccd7d75f7a465a3d14d57302c146aba3e", "signature": "146f65d43e715542894b7900a2f8cd4b17d3870a6100e37de005b0db5d8151246de4ee3842d3ebca20a5da22a363a7575e7a55128295f27211484af57cd53109" }, { "secret_key": "de8f1c99e7f8556df20b59b8504cff7c6c5241a8aeeb30b92eab97bf481d0fe9", "public_key": "e463791d0f567ee73abbf47dd57167a535613b05cd48d92ebc7d24e6ebff9573", "message": "38d93e5c9801db901797ec75c6dddc65ae7980de210bed43b33eb44cdc6dc9933fb6bec7421db10f0a59320b9e642a21f1dd235601fcd6c53be4a877f4fed3fa4a0ad4dc6e9b391bcfa434906925ba45ecc5b435d9ab8cfafc394bdcca9b07d5668393446e3400e9039435a1dc78cbc08807a3fb24ca8b19f64ea08b8bf6c20a195b51ff8015f3e7c91d08e4bc62415595a5a882fba651dc3a675187af618249747b4680d1d15a202ea9df48b1c214fd403466fd1a265f2defaf8ed5a6bf0eb08d1864f2a28e9472143c6fd103b6b108c0d1d1363b99f9202d11f02056c279cca315db1ab6d31018458f57ba3316cd2738e80c492d857cb1749925e331c65858b50983cd9838cfd2188a5e8f05b471fd3cddcd30d96901194020f115fb469ab5849006dffa2d543a13b3b506ed65cc457532b8aa3ee31d9d8d9e5298d7ac707ac15b827a578c81d434f84cb1b56120d667b2afe6d1530afddfb966d953be7e32df07de389e2d04b232d3512c7db9358fc944d1b118078e6999e891bbfa4a4329f65d807188b59858c431211b29576f4496138b7c0c128f7bef5f79b0f446fc6b4a0e20bca4c40a83571a36644abffabd49cb585fd064c8e509d9a0fcff462676f0ebcb61cec61e512be6f182abd59e09f642aa619634853482ece8f89800f9c5bcfb841431ca0691ed8d80e0a2fcb797a036897cfb6537586b31c00b7965efddfda72861845026459157f79eba1bcaf6cd41d618aeb1bd8da1be98f0cdc7f2e09b903de49c0c1be91dcc177b298096836dcea4f601dd86691555128325438bd9ccbfc0e777920ae8bbd57634c6104fe69a3a72012a2360b6e552550cffb4e2f0b41fe15537ee0e6f37e7880fb4d12bef6cad266ce58df9816b35960cd0bf8652862ee789ccc31a7efc21a81bda46146b111fcfd94f04856ab61a557b1ff7c8e4ea6d9c4bcdd93b151aa08461c568defb2aefdfce96394dc822d4ef6cc4b9a3e6c332039f6538aa0df8de8126d90c312ff496887486111565534346a7462625d63df69fcb5741906f19e00fc8003f08b95985c38b8674af423ca56de5f881b59c466243a7adbadba29caf57fa777122e61823b4e708182aaf37206d7d5ed051c12a5c0f6b4371043f562cdc029d5e1ba9b2bf5ffbf1f5f523db06feca427db7a08819ffb2d0585242e20da58e320b16b16e448d8be0ef7402d24a7194257133bdc982314d83adbcd12e8af31303426c59ffd8269ce4b987ca9b6f0ffdbb4d1d12", "signed": "30abc4e4e4b388581e668bd409ee18a6ede81a136c28a2924df5fc00d7c280d97862ae3a67a935ce492364135e659adb5fbabe689816591f49ac5022a387cc0938d93e5c9801db901797ec75c6dddc65ae7980de210bed43b33eb44cdc6dc9933fb6bec7421db10f0a59320b9e642a21f1dd235601fcd6c53be4a877f4fed3fa4a0ad4dc6e9b391bcfa434906925ba45ecc5b435d9ab8cfafc394bdcca9b07d5668393446e3400e9039435a1dc78cbc08807a3fb24ca8b19f64ea08b8bf6c20a195b51ff8015f3e7c91d08e4bc62415595a5a882fba651dc3a675187af618249747b4680d1d15a202ea9df48b1c214fd403466fd1a265f2defaf8ed5a6bf0eb08d1864f2a28e9472143c6fd103b6b108c0d1d1363b99f9202d11f02056c279cca315db1ab6d31018458f57ba3316cd2738e80c492d857cb1749925e331c65858b50983cd9838cfd2188a5e8f05b471fd3cddcd30d96901194020f115fb469ab5849006dffa2d543a13b3b506ed65cc457532b8aa3ee31d9d8d9e5298d7ac707ac15b827a578c81d434f84cb1b56120d667b2afe6d1530afddfb966d953be7e32df07de389e2d04b232d3512c7db9358fc944d1b118078e6999e891bbfa4a4329f65d807188b59858c431211b29576f4496138b7c0c128f7bef5f79b0f446fc6b4a0e20bca4c40a83571a36644abffabd49cb585fd064c8e509d9a0fcff462676f0ebcb61cec61e512be6f182abd59e09f642aa619634853482ece8f89800f9c5bcfb841431ca0691ed8d80e0a2fcb797a036897cfb6537586b31c00b7965efddfda72861845026459157f79eba1bcaf6cd41d618aeb1bd8da1be98f0cdc7f2e09b903de49c0c1be91dcc177b298096836dcea4f601dd86691555128325438bd9ccbfc0e777920ae8bbd57634c6104fe69a3a72012a2360b6e552550cffb4e2f0b41fe15537ee0e6f37e7880fb4d12bef6cad266ce58df9816b35960cd0bf8652862ee789ccc31a7efc21a81bda46146b111fcfd94f04856ab61a557b1ff7c8e4ea6d9c4bcdd93b151aa08461c568defb2aefdfce96394dc822d4ef6cc4b9a3e6c332039f6538aa0df8de8126d90c312ff496887486111565534346a7462625d63df69fcb5741906f19e00fc8003f08b95985c38b8674af423ca56de5f881b59c466243a7adbadba29caf57fa777122e61823b4e708182aaf37206d7d5ed051c12a5c0f6b4371043f562cdc029d5e1ba9b2bf5ffbf1f5f523db06feca427db7a08819ffb2d0585242e20da58e320b16b16e448d8be0ef7402d24a7194257133bdc982314d83adbcd12e8af31303426c59ffd8269ce4b987ca9b6f0ffdbb4d1d12", "signature": "30abc4e4e4b388581e668bd409ee18a6ede81a136c28a2924df5fc00d7c280d97862ae3a67a935ce492364135e659adb5fbabe689816591f49ac5022a387cc09" }, { "secret_key": "0736f801720a947c5c2f3258ce0d511c3e17e94e37b30adfa52095921171d400", "public_key": "4f694255920d0c38de6e72e165c33aee76b1cbf6f4837aa5901475667acd2826", "message": "7f87b51f6ead2d4402a3bd3c3769a267ac8e82f779ad7b986dec82cbfc1ea51291884326d9226967cb66a96873184f0e83b3ab25a5ab2fa805fe3a0e7b190a622d461b7830a3f697c831c29ea7c0cd4b68d8e77aa69711cf864dc1d5394f4845e2fbb5076404e09a88b79f05670551bce2ef5468b79d57888b9852a4bb479a4fd0beb681fd523fc5bf4458abbc38ece72e106e00222015a57ebec55bf47513e25c3c4554843bdacbcfe9f1b8d0ae354e48d03fdebdf20d655b5268d8bbbf33b1288910f0444fcd56c0da7b8903362b7e37a864654277cffbe6c60857f0b3514d22a40b9dd2d3fe5caea5507a0de3051bb3a4015fa0fe4c462b98fef2357dcf6b97dc75def382f901f96f4a04a3efc60254200a2c4cdc8a58b25d94e32954eaff1511ac46e3606663b6875f136499da6a769097879a6e0834d564fa7fdb99581183ed0c9d48fd195d7ecd9f4dd4865565fd17a008718dcd76f68a54e516a2b730ed3dba5c2cf40630bbfe7fa03bb7cdd967695495a7c86e2e84cb017ec69601924631595affaa8cfd048d14267c73e54cfa539047e717691e399737fa50cc4844961257c93d7253d23226b7cd0d1bd31f3f0d2d892d073d8c5073c602f61a04d6437c3903eb4a64a01fbcc0c7e159201cdc4aa42ef3b1ff9c78fc275cfb11a05ffed8f9f22d85ba924d8d32231c254d898da7f0679a64cab84026906e9e85f95efd8ee2a1725633f4de2ba67d99aa7f0550af139e9f8c5293786727d82630296d5daa9e830aa1b3b5b302b8b662ac832e9213016ba493a03a28cc3e9540d0d65acddbfe1252b5c16a84a445ce75415c6cd8ab16fe5eef117097d71eb5676b9a95b35882a7c3506bc5d02f03910a63d46846b213c3c9bb2fc34e6c69017d2065a1ad3ce3fd14ab0014f584e57ea9d903e40aceb230a8693fa2e63641c25438ff7a1638760438844cdf001180f5b177be69edf7ef66b39312805214cb17706cefe545be5a77019a5ec52bbf78850fa3d97de2d4d74aa68b58ca812a1b156a0c4001129f067232a6ec91a5ed4270f2a4c6efeee787004770c859e450e837efb04dc998bd273c27a09855e4eca1a22a9b88c17bdbf253a79761070a76817a7f74ff3f07fb718bffa0b4f326f284e62f836832427be82f483373515b9bf59af4a76a57e2f40b91034dd568ec14ac10e2309b87e2922f9cd9fc1a46a47ed3bc7e1b9feb9ee067073fa5dce2a67530526de67ee0e509663c44467eeb59420103ebcdffa709", "signed": "c03c0314851279edcde970c23efa236f235eda960d2c27d3ca946f650c200b4eba04be668ff62eaffa6cea351abdfc54401dccce3dba78004aec9581a2ccf40f7f87b51f6ead2d4402a3bd3c3769a267ac8e82f779ad7b986dec82cbfc1ea51291884326d9226967cb66a96873184f0e83b3ab25a5ab2fa805fe3a0e7b190a622d461b7830a3f697c831c29ea7c0cd4b68d8e77aa69711cf864dc1d5394f4845e2fbb5076404e09a88b79f05670551bce2ef5468b79d57888b9852a4bb479a4fd0beb681fd523fc5bf4458abbc38ece72e106e00222015a57ebec55bf47513e25c3c4554843bdacbcfe9f1b8d0ae354e48d03fdebdf20d655b5268d8bbbf33b1288910f0444fcd56c0da7b8903362b7e37a864654277cffbe6c60857f0b3514d22a40b9dd2d3fe5caea5507a0de3051bb3a4015fa0fe4c462b98fef2357dcf6b97dc75def382f901f96f4a04a3efc60254200a2c4cdc8a58b25d94e32954eaff1511ac46e3606663b6875f136499da6a769097879a6e0834d564fa7fdb99581183ed0c9d48fd195d7ecd9f4dd4865565fd17a008718dcd76f68a54e516a2b730ed3dba5c2cf40630bbfe7fa03bb7cdd967695495a7c86e2e84cb017ec69601924631595affaa8cfd048d14267c73e54cfa539047e717691e399737fa50cc4844961257c93d7253d23226b7cd0d1bd31f3f0d2d892d073d8c5073c602f61a04d6437c3903eb4a64a01fbcc0c7e159201cdc4aa42ef3b1ff9c78fc275cfb11a05ffed8f9f22d85ba924d8d32231c254d898da7f0679a64cab84026906e9e85f95efd8ee2a1725633f4de2ba67d99aa7f0550af139e9f8c5293786727d82630296d5daa9e830aa1b3b5b302b8b662ac832e9213016ba493a03a28cc3e9540d0d65acddbfe1252b5c16a84a445ce75415c6cd8ab16fe5eef117097d71eb5676b9a95b35882a7c3506bc5d02f03910a63d46846b213c3c9bb2fc34e6c69017d2065a1ad3ce3fd14ab0014f584e57ea9d903e40aceb230a8693fa2e63641c25438ff7a1638760438844cdf001180f5b177be69edf7ef66b39312805214cb17706cefe545be5a77019a5ec52bbf78850fa3d97de2d4d74aa68b58ca812a1b156a0c4001129f067232a6ec91a5ed4270f2a4c6efeee787004770c859e450e837efb04dc998bd273c27a09855e4eca1a22a9b88c17bdbf253a79761070a76817a7f74ff3f07fb718bffa0b4f326f284e62f836832427be82f483373515b9bf59af4a76a57e2f40b91034dd568ec14ac10e2309b87e2922f9cd9fc1a46a47ed3bc7e1b9feb9ee067073fa5dce2a67530526de67ee0e509663c44467eeb59420103ebcdffa709", "signature": "c03c0314851279edcde970c23efa236f235eda960d2c27d3ca946f650c200b4eba04be668ff62eaffa6cea351abdfc54401dccce3dba78004aec9581a2ccf40f" }, { "secret_key": "fa75650491047428d363b5822222122dffb5a9fddc603c33c8a608618375dcf3", "public_key": "98c9641fa9dfa8ea13e0d1c716b8679e264be15dd2d4c06ab43cbee47916ee01", "message": "f54e41b939e37df17c7d6043fded14a915d934e867c345269fdc0177f5bd10c4348f319e0ab9a64cc0b7d4e0c91ca9aadaab2edcba544f14ed2cb539ca8975097d87927095b4ebd490344340061ed93c38167edaa096a230db59624c67fb9a1e1ddac402133f4d47cfc11e2fae6b3f3c5001cba9a8aed90073103240227e716ff71bf68a591ba2ceff2d31b86ef21ab012eccd409ad5c29d659a1b37c4d85505304140fb2c3437a206868b1352c102bbfa3b9a76522a2bfc5406b257696de74ee7d315c8e99caa96bd838006c6da2a4233315a856acb8e80c33168b333551d91d074055734130bd7d14c56811ebabf7d5a250e6072593d9f2f8b97c12a703c2c479cb0b15b7a2775c9dcd2ca4624672368a2e6145467f3be6615f93b8120a0a12da1560663a26a61731966b44b299ebfad2a95c62360f39ce05d9558e305ee23a52fa5ce20f6be5e262aff3a864d5ddabe23ff943f71d5998493d99fe2ac2374b464a69183c3bc4f1ddb883611149d7ddbf1e8380b544335e2b89395054c9f2558dfc56ea93ff14d0f15d2e0bd8937a556387de96e418d8b3a7d666fb190364b2c2190d3c25f1752d5483dcbb5960064f0c87fcf8f313d28781c114a169b690a8701c50d89c77324531c0f849dbad1633d925acd06c16a9cea19a434ebc42aebb1fdb9b0bacc93cec39919943664ea1a958406ff9e4935c92ca7c39708f9cab710a583096b4ed9f48d9e090647240d76eccbaba591f55fe7e36d72c21727acba0f8030954e62bc580b8b670c4457c3403e369ac20e660d662f7f6a414213ea43f7c0105009c1de817adf6ffd9cca3b45a63a822281c6e2772fd7b7809603184b4879b18c887903f0fc8d8e1e2dbf6e772f0b2d9b8a29927acc81714a2256ad8d7b7330527d7dbf8befd82f8c9bb401cf0a90249a64ca6f8833db31bd03b9e7946d06dd04383d7c082d70aeb37ff84c2b057d973b894b4a03ec7bf031aea656a1908488894a4ada3fd7fadf91ede9550d38415f82a09455c0f432fb55987132f00042afd60ea51d1f1c6c1afe0cf87c346e31e63e26f49b137177b2d47ab30f07cea071931274cf010836d683fff3be7134c78b8bfd8b1b8fc2049e18ccb1e18a0a9585a7d8a1e25492608668c96d62a0aca8ef90e048d20378c108d06b03fe3ec4adb27528ae08f7ded9487893ae64ca4b939202aa4c17afe718cdca49ff9616d0cdf8334b6aee2d6d20947ca4bd7df531dd1da99581ff72ea56fe62caa2c95e3587", "signed": "1effbf9299a1b9354fe1f1dec1766595ea767ab8e4da9bb57b4f69bcbd8cb3d86f768392f59b39fafa8a210a6509fe0d6008d6356111adfb3799c1d559c26309f54e41b939e37df17c7d6043fded14a915d934e867c345269fdc0177f5bd10c4348f319e0ab9a64cc0b7d4e0c91ca9aadaab2edcba544f14ed2cb539ca8975097d87927095b4ebd490344340061ed93c38167edaa096a230db59624c67fb9a1e1ddac402133f4d47cfc11e2fae6b3f3c5001cba9a8aed90073103240227e716ff71bf68a591ba2ceff2d31b86ef21ab012eccd409ad5c29d659a1b37c4d85505304140fb2c3437a206868b1352c102bbfa3b9a76522a2bfc5406b257696de74ee7d315c8e99caa96bd838006c6da2a4233315a856acb8e80c33168b333551d91d074055734130bd7d14c56811ebabf7d5a250e6072593d9f2f8b97c12a703c2c479cb0b15b7a2775c9dcd2ca4624672368a2e6145467f3be6615f93b8120a0a12da1560663a26a61731966b44b299ebfad2a95c62360f39ce05d9558e305ee23a52fa5ce20f6be5e262aff3a864d5ddabe23ff943f71d5998493d99fe2ac2374b464a69183c3bc4f1ddb883611149d7ddbf1e8380b544335e2b89395054c9f2558dfc56ea93ff14d0f15d2e0bd8937a556387de96e418d8b3a7d666fb190364b2c2190d3c25f1752d5483dcbb5960064f0c87fcf8f313d28781c114a169b690a8701c50d89c77324531c0f849dbad1633d925acd06c16a9cea19a434ebc42aebb1fdb9b0bacc93cec39919943664ea1a958406ff9e4935c92ca7c39708f9cab710a583096b4ed9f48d9e090647240d76eccbaba591f55fe7e36d72c21727acba0f8030954e62bc580b8b670c4457c3403e369ac20e660d662f7f6a414213ea43f7c0105009c1de817adf6ffd9cca3b45a63a822281c6e2772fd7b7809603184b4879b18c887903f0fc8d8e1e2dbf6e772f0b2d9b8a29927acc81714a2256ad8d7b7330527d7dbf8befd82f8c9bb401cf0a90249a64ca6f8833db31bd03b9e7946d06dd04383d7c082d70aeb37ff84c2b057d973b894b4a03ec7bf031aea656a1908488894a4ada3fd7fadf91ede9550d38415f82a09455c0f432fb55987132f00042afd60ea51d1f1c6c1afe0cf87c346e31e63e26f49b137177b2d47ab30f07cea071931274cf010836d683fff3be7134c78b8bfd8b1b8fc2049e18ccb1e18a0a9585a7d8a1e25492608668c96d62a0aca8ef90e048d20378c108d06b03fe3ec4adb27528ae08f7ded9487893ae64ca4b939202aa4c17afe718cdca49ff9616d0cdf8334b6aee2d6d20947ca4bd7df531dd1da99581ff72ea56fe62caa2c95e3587", "signature": "1effbf9299a1b9354fe1f1dec1766595ea767ab8e4da9bb57b4f69bcbd8cb3d86f768392f59b39fafa8a210a6509fe0d6008d6356111adfb3799c1d559c26309" }, { "secret_key": "e1c12946d221a194f22f2762c0e51cbe3f98b914a47d3dc41a1f45c54370637c", "public_key": "10408136a68fc56c7d3b36b7fef122094de081031189cc84a48806aaf6cb9185", "message": "870f4cd97cfc0aafada40072312fb54bccc07628714e4962d4bef4eeb5de40a19a246b5b7d52d487b7e52d656f2c6403b916d02e02a6d291c1e1828dd945a583b438528d1c39765a572031ffa916b68321f32e6646f0dcc1c60235ffaa3235f484a5c4978fa3e6bf14301d53e12f4cc52118b1f6f07f5336f5d0a93789bb01d162fb3126dcd756e0642e7e698963c0345911a5cf3c9953f77319426cea2cdeda3efe989ecb63cb9eb8b920de766c4fcf6336e5bc4371a068371fed95c8c2b61ee9b7c3e3831c20bffe8707c0c98be96153c8a873d7f28afca1bf71085ce0e3899eef5591bdd666dc2d07641772d745c51644a260815b208c4dd305f05fe463d0d9d5a9eeff9779f5b1d44f26083078566d0e5ff56b3af0e64cc38708af5a65f654352df10437f1ddf945a0da1f4def6a71a060e0c4adeccaacf85e090f7090370ae24e5238d768a08fe6b4bb5ec497a6603198608415c7c6490048aa36737c08503008aece0f494219ddf89b72ea77171c6d3117089eb88907e8c33fb9e70b0dc281f664b5f965b5d2adb1250710ef2352025fb293395ae1d23ee3b592b4c5f2d55569a5458654ce3fc25dd0e3f7e6757aa7b347c1ffd3ba4d4f2c4b6d36afd59863a32a594e74537ece9b8b1ec269bbc4cb54d76238211f62a98a46a4af662fa81eba6f30f514b866b7942bc173f7211a6c014da14e741327a568623d14b8f835ef1d5d62b2523cfe6a85bc69fa05200deac1568b946a816b75c5d7603174fd4e2f9101a79063791bc3d59297cdc10bdaa663abf3c1be2fda17e4e5ce394e90bd76b1f9e0405f5675b99d638abc2c1b2d8b53a6fd3dc8375855ec54ccbda24e672527723b07bb599db54e38793391cf09ef3b1fd7614990065bbd4a19e8d3d1048253ba4c971c2f98d2b359df509087323aa6905029f5cc5e1a0aaf2f7c0108ddb1a40f562be64e57e695ed21dc7db17d533677ef12fcbbe29f3b237bb6344b1109b32a9462abc3ad3c0710b04f38c6f5952db275e77e2f37e95d55096bbaf3e305d5d743d36595bf0567892c210ac7bae7371d164584785dd890174159b3930a9a6ce3a166dda2383e6e2af28c1bf3192447e90511dcd80ebdf9ee2c9bdeddeeb610558641532d07cd13da61254154cc0fd9d481e3b0a237af2ec26256d4ab219faf15ad2b7e8e57ab726ff2723216a574585e2a639d948c2c4f69eeaad283e3a44ff268eaefd7e66b73ede473a8397c76b48d56cb3ccdabc91a8929cf42998350e0", "signed": "8fd7fa400c032fcfbc402942fc78637526be97ab82f237bb393ea39e35738c67d75409543a8b3c055f08bf69199af63b6911a482fb4f6580802ec9d2dc3c1106870f4cd97cfc0aafada40072312fb54bccc07628714e4962d4bef4eeb5de40a19a246b5b7d52d487b7e52d656f2c6403b916d02e02a6d291c1e1828dd945a583b438528d1c39765a572031ffa916b68321f32e6646f0dcc1c60235ffaa3235f484a5c4978fa3e6bf14301d53e12f4cc52118b1f6f07f5336f5d0a93789bb01d162fb3126dcd756e0642e7e698963c0345911a5cf3c9953f77319426cea2cdeda3efe989ecb63cb9eb8b920de766c4fcf6336e5bc4371a068371fed95c8c2b61ee9b7c3e3831c20bffe8707c0c98be96153c8a873d7f28afca1bf71085ce0e3899eef5591bdd666dc2d07641772d745c51644a260815b208c4dd305f05fe463d0d9d5a9eeff9779f5b1d44f26083078566d0e5ff56b3af0e64cc38708af5a65f654352df10437f1ddf945a0da1f4def6a71a060e0c4adeccaacf85e090f7090370ae24e5238d768a08fe6b4bb5ec497a6603198608415c7c6490048aa36737c08503008aece0f494219ddf89b72ea77171c6d3117089eb88907e8c33fb9e70b0dc281f664b5f965b5d2adb1250710ef2352025fb293395ae1d23ee3b592b4c5f2d55569a5458654ce3fc25dd0e3f7e6757aa7b347c1ffd3ba4d4f2c4b6d36afd59863a32a594e74537ece9b8b1ec269bbc4cb54d76238211f62a98a46a4af662fa81eba6f30f514b866b7942bc173f7211a6c014da14e741327a568623d14b8f835ef1d5d62b2523cfe6a85bc69fa05200deac1568b946a816b75c5d7603174fd4e2f9101a79063791bc3d59297cdc10bdaa663abf3c1be2fda17e4e5ce394e90bd76b1f9e0405f5675b99d638abc2c1b2d8b53a6fd3dc8375855ec54ccbda24e672527723b07bb599db54e38793391cf09ef3b1fd7614990065bbd4a19e8d3d1048253ba4c971c2f98d2b359df509087323aa6905029f5cc5e1a0aaf2f7c0108ddb1a40f562be64e57e695ed21dc7db17d533677ef12fcbbe29f3b237bb6344b1109b32a9462abc3ad3c0710b04f38c6f5952db275e77e2f37e95d55096bbaf3e305d5d743d36595bf0567892c210ac7bae7371d164584785dd890174159b3930a9a6ce3a166dda2383e6e2af28c1bf3192447e90511dcd80ebdf9ee2c9bdeddeeb610558641532d07cd13da61254154cc0fd9d481e3b0a237af2ec26256d4ab219faf15ad2b7e8e57ab726ff2723216a574585e2a639d948c2c4f69eeaad283e3a44ff268eaefd7e66b73ede473a8397c76b48d56cb3ccdabc91a8929cf42998350e0", "signature": "8fd7fa400c032fcfbc402942fc78637526be97ab82f237bb393ea39e35738c67d75409543a8b3c055f08bf69199af63b6911a482fb4f6580802ec9d2dc3c1106" }, { "secret_key": "762f06ca01e314715f92c90bbe72a25bf26212c81eb1d1a0dae2c31130f7cdbb", "public_key": "f9626ffd692731925e5aacfa1bded01aa8f730b772d5e46adbc315565b9bf2c9", "message": "9497483a4fba78433b38e9deb8915c750b6da0f78af4a68b62f9fc0391e338873b1d64b1b7f09f12f056a3c91653498ad56e069b8b160887e8e378a76d8b3c667083c0a2b2d2317d3b874857e57862ef0cb70436a9028f0191ccc616e9d7c9bd869808cf094835ff518677b3fb089f4c9d077cc7742405b4863ac7a59645c9cf540d57399da6ae9d07fd19fca95bc8a86d8b8e24e48733f32158fd19a8a1111d1da1f9b580a39c10484616cf2bc0ec29f63f77c85356158e16da594b5a890e55d0b64599b30293e900ed92ad261969e7df4c4b1d0b6024bdceb69067ef486c20fdcd22a10d5da45fbf905ba1e935c96f50afb63571bcff3130684eda0b56e60b26cf4c0ef9938a92768fc8631fe308236b012f92af24a8f6e6ecbe76629bbaf8ffe54cdbe8671de2ba624a7c0f6193bba4110412902bac2990922a9e5a81053cf876a4c805a04c56a8139d3419e454a622d0342bf426e9802c3dc1b4080c75492afe9d7b1545fe086d963541324ff52a48c6bfaea26668b3e01e5236fd45fe54594535c0b23e287ebd1428c8be0ad141600e91cb51e1ea66271a6421fb689e88a0790a651dbd21ee2089b274666f660ca09ce2d60e39e2ee5f03b6eb82d19976966e79900a810f6d5b5c1a548e5064f5c3d8a9f2def0179df99d143fde69b0712c091c29e9b25f40cafd57a024658d7774037610342f3800fd51f49e79a5b3decc112f58d03e3d2958758588bc4b1c6a6cda7bc5f5be183e41513c1f230f3cc364304bf82484b7cf19a002e150f98c5e97c6166ea15b86340b8c5ebe5c1a183e5588e66f55905086313f37a409e89b47db31ae97453edf69fed7be08113071f374b26ec6043f2a0e9cf8bad802abad69e617e76243b3cc034b099d8729ee407a53eb03bdc6410a039504b3b12c819b64545d405c6a4f084921935bdff4130ae629d909626b062676e538eafdffb1d6229c0889d3cddd3365dc3d6536f7248c49317cb50c56fb57855541d6feebac816c9928fa662d0ae80a0f39e570bb7d22416f98f371b64247968951a8a246f74b3061743c9af7684bbb966ae0bd78a810493ea4ccd71174871c82bb652b2748e5bccb0ab6388a50f053a048087fd97eb15c1a21b1ee1825e54aa130d66318aaf661bbb24763577eb37d310e219b0a9bba0375eb9c9b4af8c4b99a3699e0d3266733b6e4e9c534490a1341cb1990ca5b1c847bc8126026fea903a1f549d65af8fe02a9163ff8ea281e7226243e2a153b921851de10f7", "signed": "e842b49e533dbc92998dc078e59793a2c2fa636bdfafdb48934c93cf34797102938d137ab7ead1a0f70e94a67d57ef6a02c9ec77d71f70cc57f1533bec87730e9497483a4fba78433b38e9deb8915c750b6da0f78af4a68b62f9fc0391e338873b1d64b1b7f09f12f056a3c91653498ad56e069b8b160887e8e378a76d8b3c667083c0a2b2d2317d3b874857e57862ef0cb70436a9028f0191ccc616e9d7c9bd869808cf094835ff518677b3fb089f4c9d077cc7742405b4863ac7a59645c9cf540d57399da6ae9d07fd19fca95bc8a86d8b8e24e48733f32158fd19a8a1111d1da1f9b580a39c10484616cf2bc0ec29f63f77c85356158e16da594b5a890e55d0b64599b30293e900ed92ad261969e7df4c4b1d0b6024bdceb69067ef486c20fdcd22a10d5da45fbf905ba1e935c96f50afb63571bcff3130684eda0b56e60b26cf4c0ef9938a92768fc8631fe308236b012f92af24a8f6e6ecbe76629bbaf8ffe54cdbe8671de2ba624a7c0f6193bba4110412902bac2990922a9e5a81053cf876a4c805a04c56a8139d3419e454a622d0342bf426e9802c3dc1b4080c75492afe9d7b1545fe086d963541324ff52a48c6bfaea26668b3e01e5236fd45fe54594535c0b23e287ebd1428c8be0ad141600e91cb51e1ea66271a6421fb689e88a0790a651dbd21ee2089b274666f660ca09ce2d60e39e2ee5f03b6eb82d19976966e79900a810f6d5b5c1a548e5064f5c3d8a9f2def0179df99d143fde69b0712c091c29e9b25f40cafd57a024658d7774037610342f3800fd51f49e79a5b3decc112f58d03e3d2958758588bc4b1c6a6cda7bc5f5be183e41513c1f230f3cc364304bf82484b7cf19a002e150f98c5e97c6166ea15b86340b8c5ebe5c1a183e5588e66f55905086313f37a409e89b47db31ae97453edf69fed7be08113071f374b26ec6043f2a0e9cf8bad802abad69e617e76243b3cc034b099d8729ee407a53eb03bdc6410a039504b3b12c819b64545d405c6a4f084921935bdff4130ae629d909626b062676e538eafdffb1d6229c0889d3cddd3365dc3d6536f7248c49317cb50c56fb57855541d6feebac816c9928fa662d0ae80a0f39e570bb7d22416f98f371b64247968951a8a246f74b3061743c9af7684bbb966ae0bd78a810493ea4ccd71174871c82bb652b2748e5bccb0ab6388a50f053a048087fd97eb15c1a21b1ee1825e54aa130d66318aaf661bbb24763577eb37d310e219b0a9bba0375eb9c9b4af8c4b99a3699e0d3266733b6e4e9c534490a1341cb1990ca5b1c847bc8126026fea903a1f549d65af8fe02a9163ff8ea281e7226243e2a153b921851de10f7", "signature": "e842b49e533dbc92998dc078e59793a2c2fa636bdfafdb48934c93cf34797102938d137ab7ead1a0f70e94a67d57ef6a02c9ec77d71f70cc57f1533bec87730e" }, { "secret_key": "c5cc0b95818c4bf38da1d65f021627e9e57d262b02ec6d917a7d46b11c7fe48a", "public_key": "457da4ef14519d541edf92cabed9b04d8a2f2afd1510a92f009bb4e8754f1eba", "message": "d6608bf5ac000ecaf95fc09f9cb7498c518a6e0255586e6337853b1d7d9d7de4dfe1245d59031a317d4e2b6a73c4c3f95b582e72a6420221587bac120fb8ed7348070f2860d85866a09fe756743497f2119bc1bfdf573be35d1091be37f18bcda6741c90d566cc924b72164b749af9a6f40f71d3ea5d8764cdc81714bd7395e5f679973636eff1db1cf0012983f71a2f2b12d45a294e5a389f4cd2483eb39da0df26b736c7af6e41dd35a78e45292c394e34689532888721f863c56db97da1cd10a66a20a670b27fe8ce5568a42b8937790c7be1aa420d203d7a885c1729cd6b8e197189e479d542cbcb9b53656f2b9f539c325c34aa598fd91e7df70f9a74abec467654b1c9a3d14438e7c0836040b793871ecbe9e5f6680ccccd5d4696a87e37e89eab28b6bd679e8fe1627bdc9d373b82f52cd8c49be9bacdc630a32fd12835255a542fb7b12393779d4498aa06a0e7e1a4977939817eb2088af1e19bb0e5aca854c125dc603d835736a03d938051530c9ab1aa3bc779b3bae7450ef57d1b3fc093a37dbe9d1bd6d040f2f8eeba77f7fa88c149f065c7ace33277aa9969c266ea6d85cad62cfaf5508e7032716be684a22856413e0e65e42b6e9e6d865a87363cbb62d5bbb6a3731ddda0fa6ad0293af9893c09a9e743090f2cee2f4437736dd433e2ac7428bdc8c77cb9964355fa4415cc3831d8c7ca5af93d51752e718c6066eca1426a87c29808281a85ac7e0b4044ff6e280e28014b9383d19c9d387d29dc14de433da260784a4944ca76c2fe8a080d0996d9a6c2a3d3a7077280edcee0389aa8e5365d1d9b346eca0947b0ff5265943ccf09939a4b4a8f985f6a5e72723c795da0bc360dce501f673ab6ea8443f129427952453eb72b3a8d0d976c278c5bd1a9853c918e0c240c3c734932953fdb5039fbb04687937c9ff0ab74a16eae212bc6f20e700a77c092d23d2efb580e0c19d65f304129ab8e6cc12e58052257ba09449f30d3d974391afff5633def2f5c4ebd573a9e444bf3a3ddacedf02c05f3cc2e750664a84a1d24c5d28b49670de8a2f2090839483ca38959991a7d3727e21a15e82016c15a09ee71f4f43c0a608b48485c9934a38614794d6291daa39c01c45d3debe579b5823bf3406404b4c80ee6ff342b46b334b0b883b40bfd2f9a53595ab62fd1351ebc88308370497218dfc98ce081407da812a46d6497d7af9ec6d83e1c60eeb712d889dfbed0c805aa11cf817dd8f04396ef871a26112dcb7c0e1d2e68", "signed": "3ba0af8af127c4584826090ecdaf485ebdf07b82bc499c9a2befca28d49344974addbc8d80a52560e0f3d73ff5cccc72c74b5b47ad2e6de9612d1a00aec92701d6608bf5ac000ecaf95fc09f9cb7498c518a6e0255586e6337853b1d7d9d7de4dfe1245d59031a317d4e2b6a73c4c3f95b582e72a6420221587bac120fb8ed7348070f2860d85866a09fe756743497f2119bc1bfdf573be35d1091be37f18bcda6741c90d566cc924b72164b749af9a6f40f71d3ea5d8764cdc81714bd7395e5f679973636eff1db1cf0012983f71a2f2b12d45a294e5a389f4cd2483eb39da0df26b736c7af6e41dd35a78e45292c394e34689532888721f863c56db97da1cd10a66a20a670b27fe8ce5568a42b8937790c7be1aa420d203d7a885c1729cd6b8e197189e479d542cbcb9b53656f2b9f539c325c34aa598fd91e7df70f9a74abec467654b1c9a3d14438e7c0836040b793871ecbe9e5f6680ccccd5d4696a87e37e89eab28b6bd679e8fe1627bdc9d373b82f52cd8c49be9bacdc630a32fd12835255a542fb7b12393779d4498aa06a0e7e1a4977939817eb2088af1e19bb0e5aca854c125dc603d835736a03d938051530c9ab1aa3bc779b3bae7450ef57d1b3fc093a37dbe9d1bd6d040f2f8eeba77f7fa88c149f065c7ace33277aa9969c266ea6d85cad62cfaf5508e7032716be684a22856413e0e65e42b6e9e6d865a87363cbb62d5bbb6a3731ddda0fa6ad0293af9893c09a9e743090f2cee2f4437736dd433e2ac7428bdc8c77cb9964355fa4415cc3831d8c7ca5af93d51752e718c6066eca1426a87c29808281a85ac7e0b4044ff6e280e28014b9383d19c9d387d29dc14de433da260784a4944ca76c2fe8a080d0996d9a6c2a3d3a7077280edcee0389aa8e5365d1d9b346eca0947b0ff5265943ccf09939a4b4a8f985f6a5e72723c795da0bc360dce501f673ab6ea8443f129427952453eb72b3a8d0d976c278c5bd1a9853c918e0c240c3c734932953fdb5039fbb04687937c9ff0ab74a16eae212bc6f20e700a77c092d23d2efb580e0c19d65f304129ab8e6cc12e58052257ba09449f30d3d974391afff5633def2f5c4ebd573a9e444bf3a3ddacedf02c05f3cc2e750664a84a1d24c5d28b49670de8a2f2090839483ca38959991a7d3727e21a15e82016c15a09ee71f4f43c0a608b48485c9934a38614794d6291daa39c01c45d3debe579b5823bf3406404b4c80ee6ff342b46b334b0b883b40bfd2f9a53595ab62fd1351ebc88308370497218dfc98ce081407da812a46d6497d7af9ec6d83e1c60eeb712d889dfbed0c805aa11cf817dd8f04396ef871a26112dcb7c0e1d2e68", "signature": "3ba0af8af127c4584826090ecdaf485ebdf07b82bc499c9a2befca28d49344974addbc8d80a52560e0f3d73ff5cccc72c74b5b47ad2e6de9612d1a00aec92701" }, { "secret_key": "61fa8677eedaded69b165c8d277c978249663028301df6163e39b06ac2f5625f", "public_key": "87339eb57238db2e4e60f3c28a3fd5fb611c65fddc81eed7cf7771df34d92267", "message": "02c581dee03f2c603935af5eceecfa677134a3e0aea54fecaf4271fb52951a27b76877ccd49ab486dfc227cf31c9d957cc97306573fc7fe1d31b6c7df3d780f3a05ca6395657a9424342c9c6b703127e038df0792154e30a49476112cb92d0d5a2d22e895752a86edddd912fdc81b1e64a7bb750f099182132ee4823fde845802a944539d412b2a81a15b00071a950504c5b55a71bdb8c5a582639e855e8be241cda1ba6b3b4f64554d17824904cb30cd7efd9ac049e390bb79f53598ef1e8fc27dd7bf599c9028c9ebf92fc3be11df329612a228e0f5684687bf41ff203e97a7686126a39366bdc26d50be025d5187c6ba0666e379be4a80a9e62effcd916d7f98de651e00b97adf5d2d53daa7f8d695a291560755c744482364c4f1fa47ec0b1da161aa388f9597989a97726d3ed2cec82f1a1bbc4ac0be0a00cb4a8db1fb7c14ba05d896348dc0559d2a90beac2041dd77f82d6b12aeb2243ca0f419a57d3ca9c7d25a30ff0e8bb0d945155d1b36ad107b55beaa95b7d5e32003407629f1515f8a7089e2488d0d7544c2f7cc7c7f0985da42840d4368ff4f0fa4fa298e3b7229303aba514ae94e7026535a3f426ffbb4e001cd50ed12f214b3abef96e301635c987b133fc5e6184e7b7572bc3d99a4523cbd5afe593cedf4c9cd02ff2e36237e4ee12ef1a22d16d7cf4c072dced91cdd26ee144cc2bef4950026349e9444784081fe4e0498bc75f72e6818f459bba9049c561316c9f498e7b1a994b0e93055fe73e444cbdf96ac35e9c4e92e6b49e3bc0e99de1716df8eacaeb8d2fd74870044cb39c0e367a1fe32a9bb2974416364e730d5248dfb1df164a8d58caa1005fdc91bac2bc01cc77decc14893ef946fb3c81be0832c72fba372062f8360f4d8e6d5b741cf7032d8d89de2edf4c714a29f75abd8f5ff43ecdd4b7a04d7db0882d16e74473a0fb79db444a78ea44aa2631b8c0d7b0300d55cb6ac485f24c0acc647747c43db3b2a8677baf656fa735a575f1813f3668a2aca9175711b525eb496e9ef9711d75f590c7d9ef99e0f59e8483cbf9f284e3f5a33ee7781e62b8b05551777efe0fbfd19e54b6bbd142944bc2959a82ebd295d23d3443b6ce658c2d579a7637b549520491908e34282ec2716972e6f0353929547ef1537aecc96b2df616148599b09d9b81394a13fe7db86760b1e2a060efd484e8189939ebdf6f21640d89d8e736dee082ad72a0184adedd8df21474c9f526bcfdf7e85658194bb6d942e7f3fe96c23f", "signed": "c04ebd11c3eb09396fe8d68279510a9efee391abee4081f0d275674a304794835aad7f3e345bcf0af8027f97477e79e6792b8f299846ae28cb13bd887537990d02c581dee03f2c603935af5eceecfa677134a3e0aea54fecaf4271fb52951a27b76877ccd49ab486dfc227cf31c9d957cc97306573fc7fe1d31b6c7df3d780f3a05ca6395657a9424342c9c6b703127e038df0792154e30a49476112cb92d0d5a2d22e895752a86edddd912fdc81b1e64a7bb750f099182132ee4823fde845802a944539d412b2a81a15b00071a950504c5b55a71bdb8c5a582639e855e8be241cda1ba6b3b4f64554d17824904cb30cd7efd9ac049e390bb79f53598ef1e8fc27dd7bf599c9028c9ebf92fc3be11df329612a228e0f5684687bf41ff203e97a7686126a39366bdc26d50be025d5187c6ba0666e379be4a80a9e62effcd916d7f98de651e00b97adf5d2d53daa7f8d695a291560755c744482364c4f1fa47ec0b1da161aa388f9597989a97726d3ed2cec82f1a1bbc4ac0be0a00cb4a8db1fb7c14ba05d896348dc0559d2a90beac2041dd77f82d6b12aeb2243ca0f419a57d3ca9c7d25a30ff0e8bb0d945155d1b36ad107b55beaa95b7d5e32003407629f1515f8a7089e2488d0d7544c2f7cc7c7f0985da42840d4368ff4f0fa4fa298e3b7229303aba514ae94e7026535a3f426ffbb4e001cd50ed12f214b3abef96e301635c987b133fc5e6184e7b7572bc3d99a4523cbd5afe593cedf4c9cd02ff2e36237e4ee12ef1a22d16d7cf4c072dced91cdd26ee144cc2bef4950026349e9444784081fe4e0498bc75f72e6818f459bba9049c561316c9f498e7b1a994b0e93055fe73e444cbdf96ac35e9c4e92e6b49e3bc0e99de1716df8eacaeb8d2fd74870044cb39c0e367a1fe32a9bb2974416364e730d5248dfb1df164a8d58caa1005fdc91bac2bc01cc77decc14893ef946fb3c81be0832c72fba372062f8360f4d8e6d5b741cf7032d8d89de2edf4c714a29f75abd8f5ff43ecdd4b7a04d7db0882d16e74473a0fb79db444a78ea44aa2631b8c0d7b0300d55cb6ac485f24c0acc647747c43db3b2a8677baf656fa735a575f1813f3668a2aca9175711b525eb496e9ef9711d75f590c7d9ef99e0f59e8483cbf9f284e3f5a33ee7781e62b8b05551777efe0fbfd19e54b6bbd142944bc2959a82ebd295d23d3443b6ce658c2d579a7637b549520491908e34282ec2716972e6f0353929547ef1537aecc96b2df616148599b09d9b81394a13fe7db86760b1e2a060efd484e8189939ebdf6f21640d89d8e736dee082ad72a0184adedd8df21474c9f526bcfdf7e85658194bb6d942e7f3fe96c23f", "signature": "c04ebd11c3eb09396fe8d68279510a9efee391abee4081f0d275674a304794835aad7f3e345bcf0af8027f97477e79e6792b8f299846ae28cb13bd887537990d" }, { "secret_key": "7048c6521aefafa4eac6d6c3a702b9525480a66482e4969896757f2cd1ac7d5b", "public_key": "ed93113c1643a53aa064caa631ceb6e20f6d6ec2fc6c0711cb8a1fe73139af93", "message": "53f74c724db1578a1a296a7ccac904a2504dd9005389b4f8d4ea4b6307298fc6dcce98a6bc07280d20364e405a467e736578965269c81461d61fc6b7e4bad68d2b6dd0005850105f0a67bbc6ee223ec1754af4e3b9afa5062d1c1861048f185b128f1a5c0fb25c3919b4833e29e202bc941a905e63c2c05b1014647bd7ede5be9f996615187a3d3bb2c7dc4c28f7053def9b28b29e2331f16296dce8f1ede484caec996702bd9902e52684c812c87440f69bd141c7e00c6947d1fc7c3bdc0bc5506b6ea462e65f9e743b72c007ddc7a377493777d4eb12620ca6c019c8bfc4c29ec8af382fc3eac841021a74e4674ba3e43e5d7b41e3feeb17da00a7ce455a1cec70b0be6e56f85fc37f64cf0733b7e31241de641a8a8e5b91897bc158fe93d102c01d1f5e166d408165fe3fcb13d5304590ab8ef0dc8d5a8c1d8a93fceb854fc1fa36d0cc480cf8512d80bee69b0650a957daed283cd7638155ed773086e86a8ffb198acc7423b5d1a609a175a56b94c96b731851b93a94977101e255f1ce92e232a05e2e3387fcb4dc13a31bee6ee25507322c73c9883080a74c00f803a998dd530a79126bb144ed5574c4b23180e34e099283b4bb1d28822fce3717046ff32ef9e2cdf967e318ea726a2aeec57806643ad4801d3e0da52a1d77bf043f5ae9f3aea9e4bc4fa795d08401085ca94cfc4ce719dabc7b2390d03d294a65b7af9bc39072285b777b2f133dc11a70c0a9f060e10441f40216acb641637a2eadf1f7b8d262fec1b4d0f0f4faa93f3f732cac382d8ac42e178e2244999d764a9d0e981714686eb4924497e56b50157e9939032c9f88eb657cfde44ad34714af4a51324e5e77d0deea99c9f244d2e09ea425820a746d883a0cf4b705c29df8c037448154dc08a4d4337405fb8765823114370b37ed86086ec5f8bd6c72abf13f518430710f597b06108f65b30a483496e2ed81dab10fee947fe04b5485f2e3074049d22284266651ad10dd086aaa5d452e0d1a61129d1e77c663c26d088962b5545645b7a1a8713d51327a7a359b12daadb85a2cd4b5410d5c20267fa766b8c42a84dc42664588879b3eaefd4cc8dc693f98ac205609e570665b01ea4655e39429a7a7e542efb4f7890dbf4e34c6cff07e4d35bd3eeedf5b46280f4a0da0c2e73c94ea81cfeae7f9bd04fe2d45976500f7dcacb0df2a5dc736a823671db679be66cb33c162fd2c74ae71fbf4d2b05af042b3a977f5b944b9fdb6c34424421bcf4f6223768428fa140fd4", "signed": "7c45703ed3942e44041c7fa1858aa5f1dc381f493a452dfb52708017898f710e31118e331f00aa64cb738836682b7d177e97955c00319abd79a49e0fcd16fe0053f74c724db1578a1a296a7ccac904a2504dd9005389b4f8d4ea4b6307298fc6dcce98a6bc07280d20364e405a467e736578965269c81461d61fc6b7e4bad68d2b6dd0005850105f0a67bbc6ee223ec1754af4e3b9afa5062d1c1861048f185b128f1a5c0fb25c3919b4833e29e202bc941a905e63c2c05b1014647bd7ede5be9f996615187a3d3bb2c7dc4c28f7053def9b28b29e2331f16296dce8f1ede484caec996702bd9902e52684c812c87440f69bd141c7e00c6947d1fc7c3bdc0bc5506b6ea462e65f9e743b72c007ddc7a377493777d4eb12620ca6c019c8bfc4c29ec8af382fc3eac841021a74e4674ba3e43e5d7b41e3feeb17da00a7ce455a1cec70b0be6e56f85fc37f64cf0733b7e31241de641a8a8e5b91897bc158fe93d102c01d1f5e166d408165fe3fcb13d5304590ab8ef0dc8d5a8c1d8a93fceb854fc1fa36d0cc480cf8512d80bee69b0650a957daed283cd7638155ed773086e86a8ffb198acc7423b5d1a609a175a56b94c96b731851b93a94977101e255f1ce92e232a05e2e3387fcb4dc13a31bee6ee25507322c73c9883080a74c00f803a998dd530a79126bb144ed5574c4b23180e34e099283b4bb1d28822fce3717046ff32ef9e2cdf967e318ea726a2aeec57806643ad4801d3e0da52a1d77bf043f5ae9f3aea9e4bc4fa795d08401085ca94cfc4ce719dabc7b2390d03d294a65b7af9bc39072285b777b2f133dc11a70c0a9f060e10441f40216acb641637a2eadf1f7b8d262fec1b4d0f0f4faa93f3f732cac382d8ac42e178e2244999d764a9d0e981714686eb4924497e56b50157e9939032c9f88eb657cfde44ad34714af4a51324e5e77d0deea99c9f244d2e09ea425820a746d883a0cf4b705c29df8c037448154dc08a4d4337405fb8765823114370b37ed86086ec5f8bd6c72abf13f518430710f597b06108f65b30a483496e2ed81dab10fee947fe04b5485f2e3074049d22284266651ad10dd086aaa5d452e0d1a61129d1e77c663c26d088962b5545645b7a1a8713d51327a7a359b12daadb85a2cd4b5410d5c20267fa766b8c42a84dc42664588879b3eaefd4cc8dc693f98ac205609e570665b01ea4655e39429a7a7e542efb4f7890dbf4e34c6cff07e4d35bd3eeedf5b46280f4a0da0c2e73c94ea81cfeae7f9bd04fe2d45976500f7dcacb0df2a5dc736a823671db679be66cb33c162fd2c74ae71fbf4d2b05af042b3a977f5b944b9fdb6c34424421bcf4f6223768428fa140fd4", "signature": "7c45703ed3942e44041c7fa1858aa5f1dc381f493a452dfb52708017898f710e31118e331f00aa64cb738836682b7d177e97955c00319abd79a49e0fcd16fe00" }, { "secret_key": "3e6373b265b96789007ad2a10c309a567638f25587d77e28b0823a4f179ae4fe", "public_key": "a3234e5d13b03472165036404f6de80e702839500f13d9c985a077d45c69ff45", "message": "b9d068bbcae7722f828b0f8c98a738e36a7df4c997c724ba27531af34a2f106c7513a44a461a9aa4309bc15c4e0d42759193ea1cdea956bb815985f57867145e9e2c7585fc8d61027e47d2d735e2448af3782909404edeaac0fd73f6045dcdb04f0377758f02204aae3a7220311c0f4723582710cc440c36c9587b5c9ebc4063fea8ca3f43195894f79a365087137282302dbf2e7a0d411ab58b7026ccde198869aa734334c05238e275e3c3ab217083495769e2fad374051452d7f5b1db0e785836d4bd5e2978a3e991af0ff716f43889a07f5df299603621c39e2cdee089985d9e6bf7b2fbd02373ae1b5e9b88f5b54a076e676d7790bfc8f57dcc59ef52850ce992a73ba7bc991deb4dde5eb0b21670b1b3d4b64f36cca8e307098568497d8916f6b5d0e9e89f99f86006f39bd3a810769c8f7801773c9638abcf5e2711b19d1167593acbe85e4161428997a2194dc5e7b7640f0d2c1eb205553be9167ffbc22b7c2e7698f3afa10754cb44d4b1d45b837303b1669073415a22606b50f21f8265e139f2305ac0e0127ae056ce8abeaba20e1d269a2b2e899c49547268a0696ae450dc0267f7f63a8edf074c47d3c2db1da36393737304e6dd4faccdb6ab55e5f8520c3dff5f6beac30ba85b86082351e3ded8400aa57f650c0c33036d65b39b7d2fb6112863d59b72558242e8b045addd357de6fd37a8f6611765c9b5ff19cc4db7e117c65a00458908b0245d04f7908fc73b165dff6e4be4b42032d8cfd7d6f7772c1bfe721d4bcfe2fc527998f34fb4418a1fae1e6c3767c4d0780621f923da1f0a0d3d219c036acfd3709dad4cf24d90bc691d700e6a9c80ccfd10bde8e791c0fea82880c07baaaa311eef79240784f628a7d2a09184e016f81008e77429a8658b153e44e79a98ad248f7fda23b590d646d7c1d841f4927d6e8bc73214d10a7f3c29c8f839a8908d20a74e827af467ac5abf0f1d0ed39cddd969dde9eeb4a4b7527ab3e2475a195e24474a4e36b09052e2dad4a5eb4691e263b8c61bbde87772207e011c4c1e14235fb24e4da438875d18530fef902619dd485d77b545abb56b69c755afe758606971ab97dd3ace1c1a34a33794c8156da799e8224d885e1868f9cb466d802c827cc3e1ecd0ae6e0b01f8f791b12208fcc0fed385b796eb2f2908b58d30b3733f1470f2e2ef12ad43feb72d0816de3c13a8b5a523e14cdf5ff3720bf87769cde7495d226bf38238a825f75a09f6bb9afce516a7bc70114370bbc40f17c7bc", "signed": "f51e0f878a5a709647e85fea839fd566e6f35c8a6185d0c9eb13e0d5b9e6e8aa95c333a8f50632a4d6657b518ce4cfde40b8f5a05b2d9f8441fcc9d2d692d509b9d068bbcae7722f828b0f8c98a738e36a7df4c997c724ba27531af34a2f106c7513a44a461a9aa4309bc15c4e0d42759193ea1cdea956bb815985f57867145e9e2c7585fc8d61027e47d2d735e2448af3782909404edeaac0fd73f6045dcdb04f0377758f02204aae3a7220311c0f4723582710cc440c36c9587b5c9ebc4063fea8ca3f43195894f79a365087137282302dbf2e7a0d411ab58b7026ccde198869aa734334c05238e275e3c3ab217083495769e2fad374051452d7f5b1db0e785836d4bd5e2978a3e991af0ff716f43889a07f5df299603621c39e2cdee089985d9e6bf7b2fbd02373ae1b5e9b88f5b54a076e676d7790bfc8f57dcc59ef52850ce992a73ba7bc991deb4dde5eb0b21670b1b3d4b64f36cca8e307098568497d8916f6b5d0e9e89f99f86006f39bd3a810769c8f7801773c9638abcf5e2711b19d1167593acbe85e4161428997a2194dc5e7b7640f0d2c1eb205553be9167ffbc22b7c2e7698f3afa10754cb44d4b1d45b837303b1669073415a22606b50f21f8265e139f2305ac0e0127ae056ce8abeaba20e1d269a2b2e899c49547268a0696ae450dc0267f7f63a8edf074c47d3c2db1da36393737304e6dd4faccdb6ab55e5f8520c3dff5f6beac30ba85b86082351e3ded8400aa57f650c0c33036d65b39b7d2fb6112863d59b72558242e8b045addd357de6fd37a8f6611765c9b5ff19cc4db7e117c65a00458908b0245d04f7908fc73b165dff6e4be4b42032d8cfd7d6f7772c1bfe721d4bcfe2fc527998f34fb4418a1fae1e6c3767c4d0780621f923da1f0a0d3d219c036acfd3709dad4cf24d90bc691d700e6a9c80ccfd10bde8e791c0fea82880c07baaaa311eef79240784f628a7d2a09184e016f81008e77429a8658b153e44e79a98ad248f7fda23b590d646d7c1d841f4927d6e8bc73214d10a7f3c29c8f839a8908d20a74e827af467ac5abf0f1d0ed39cddd969dde9eeb4a4b7527ab3e2475a195e24474a4e36b09052e2dad4a5eb4691e263b8c61bbde87772207e011c4c1e14235fb24e4da438875d18530fef902619dd485d77b545abb56b69c755afe758606971ab97dd3ace1c1a34a33794c8156da799e8224d885e1868f9cb466d802c827cc3e1ecd0ae6e0b01f8f791b12208fcc0fed385b796eb2f2908b58d30b3733f1470f2e2ef12ad43feb72d0816de3c13a8b5a523e14cdf5ff3720bf87769cde7495d226bf38238a825f75a09f6bb9afce516a7bc70114370bbc40f17c7bc", "signature": "f51e0f878a5a709647e85fea839fd566e6f35c8a6185d0c9eb13e0d5b9e6e8aa95c333a8f50632a4d6657b518ce4cfde40b8f5a05b2d9f8441fcc9d2d692d509" }, { "secret_key": "f5e8597eac0ebfa9d385de85a1fbaa35146395b13457b5b14d3670daca6905e7", "public_key": "ce93e642c2f15084bc83bafdaa196763de2a3c513b0e44f68ddbde378514c441", "message": "273341f219ff5cf381c77b2dd226c58f8f33c4527048cb006affef8cee151e300efef629fed21b70451f729292627d1f3f1b5257359ee5a671cf62ae57324940f2d0b15aac76ff398220c08024e29a8cf36504e12a4e96438f42c3da0c000541bc11f091381b0b72b58a92083f446eca1991996878de35081cc4ab90958c96cf5c99796cba7951ee186f26527aede69db304ce2941ba15cc00ba2f1411f208dad45e87bcf638792de0a68624b667297c27a343db4baf34a0228eaf0d1022009b5d068b2534d920302e71310febf0df1bb02c2ef0ad1ae149deadf8c184373c0f7eb6b25695be82d12c71b6c83267d9a233667e77bc205983f8b8d877d85aead3f60e820ffcb17adddd92a7712bbeb34ee71966dafd9907d193dd9d725a31a613d29e32be72132808926d9437477fee25eda610aeb1dce12ea316c6aec6689e501c551923825a34b42c4f0675b86ab26adeea2e60dae6c6d1cdd0cb3c347b16384039a8e3fd6087381387cb4bc72ddb5f25b374859b02e5bb1ba06d3cc69ec44cec4b985c8476e35032e99abf001a1d44ddc6e2889c3c2c3ecaced609b2b2680e00b1efa7e9d26d62f2b3ab36f921044790abbd49360756dcffccf230f66dbb701aa164dad6069aa2b8b3309f2fe44d5e0b25bd556431f0df4c2ea97ae79ed4a57578d66fc6939c57628a90cac97adfa8702a4a1c8965ba1a90262567286664003003533cc9314caf7d3b982e0a432ff5aa4ed5741983d9b54323ac7e299b2b4956c1a2c191557b27d86be714b5b68fcb1d41f78ca5ddb6b53b3dfc8e7d6b3c3db059af9f2dd765ef04b6d16e6737c727aa11f3df3774a3fc96182e282acc3d233eeabf8c72d3f246ae184505288fef39b36766b10dd1bfbfbfa70f97b3c901726d1e0d0a837d11f0123a34abad1a79aabe80b125b128ee160b511848f7f04c49c8d5c2f2041da7d9599c29b1dac8c68077efac3eca58bbc1637aadce21c774fea42d2bcf4a0b9892307e36fa250acee795ad2bfecfbf60319b81663e2a26571946f75a8d969af16b3b57c3ec3e66158aaf42ccf5e58b937aaef613318606603317e5aa318be70f8da3c0c16be6c29e3ec9fef4e46e8ca241d941d58049a063d90afc953ca32e8a50a6473632588ac41eae97f20ce9b741ed41c9a4aa6551fd823ce0c811a5bb5a171c1ea4238a0246811e469cf498b79621c323eba7985344fe11e67499edf4967491aa749f8f3fe39961d76892c93aac3b19fa4b4fc174d7d4d4d8bd6ee475475008", "signed": "576543fc21ab0a7c5f63b1cff01bf845df91792e7a9750c5508b51665e7f89f17c6ec3355a0aed87db8c77bdb271fbedc714ffadb78b5e0f978116771ba7cf0b273341f219ff5cf381c77b2dd226c58f8f33c4527048cb006affef8cee151e300efef629fed21b70451f729292627d1f3f1b5257359ee5a671cf62ae57324940f2d0b15aac76ff398220c08024e29a8cf36504e12a4e96438f42c3da0c000541bc11f091381b0b72b58a92083f446eca1991996878de35081cc4ab90958c96cf5c99796cba7951ee186f26527aede69db304ce2941ba15cc00ba2f1411f208dad45e87bcf638792de0a68624b667297c27a343db4baf34a0228eaf0d1022009b5d068b2534d920302e71310febf0df1bb02c2ef0ad1ae149deadf8c184373c0f7eb6b25695be82d12c71b6c83267d9a233667e77bc205983f8b8d877d85aead3f60e820ffcb17adddd92a7712bbeb34ee71966dafd9907d193dd9d725a31a613d29e32be72132808926d9437477fee25eda610aeb1dce12ea316c6aec6689e501c551923825a34b42c4f0675b86ab26adeea2e60dae6c6d1cdd0cb3c347b16384039a8e3fd6087381387cb4bc72ddb5f25b374859b02e5bb1ba06d3cc69ec44cec4b985c8476e35032e99abf001a1d44ddc6e2889c3c2c3ecaced609b2b2680e00b1efa7e9d26d62f2b3ab36f921044790abbd49360756dcffccf230f66dbb701aa164dad6069aa2b8b3309f2fe44d5e0b25bd556431f0df4c2ea97ae79ed4a57578d66fc6939c57628a90cac97adfa8702a4a1c8965ba1a90262567286664003003533cc9314caf7d3b982e0a432ff5aa4ed5741983d9b54323ac7e299b2b4956c1a2c191557b27d86be714b5b68fcb1d41f78ca5ddb6b53b3dfc8e7d6b3c3db059af9f2dd765ef04b6d16e6737c727aa11f3df3774a3fc96182e282acc3d233eeabf8c72d3f246ae184505288fef39b36766b10dd1bfbfbfa70f97b3c901726d1e0d0a837d11f0123a34abad1a79aabe80b125b128ee160b511848f7f04c49c8d5c2f2041da7d9599c29b1dac8c68077efac3eca58bbc1637aadce21c774fea42d2bcf4a0b9892307e36fa250acee795ad2bfecfbf60319b81663e2a26571946f75a8d969af16b3b57c3ec3e66158aaf42ccf5e58b937aaef613318606603317e5aa318be70f8da3c0c16be6c29e3ec9fef4e46e8ca241d941d58049a063d90afc953ca32e8a50a6473632588ac41eae97f20ce9b741ed41c9a4aa6551fd823ce0c811a5bb5a171c1ea4238a0246811e469cf498b79621c323eba7985344fe11e67499edf4967491aa749f8f3fe39961d76892c93aac3b19fa4b4fc174d7d4d4d8bd6ee475475008", "signature": "576543fc21ab0a7c5f63b1cff01bf845df91792e7a9750c5508b51665e7f89f17c6ec3355a0aed87db8c77bdb271fbedc714ffadb78b5e0f978116771ba7cf0b" }, { "secret_key": "cdadc5b89cb2b6308a006f2f4e955a91aaf3ba70165f2d444ef1ffebbdaaa221", "public_key": "0541415ff5467f28ceac839b13a1766e72c99e6545207d9d5d9697411eb6bca7", "message": "911727036db309d6e2e3369e4f17d98d99ec070c33283bb1244efd62e76bd70a69b9723bd2b520472b98aa065924366de780900bcd8b77b50f87c3c36187024bbc59ccf4482c7b4aadb56e2e5ecc0003d989d6afc63ec10242e57482fe39215261d5fc95a0185f95e9540c55f74d696048bca7ab112681a5558ea93c3b1f1cd364659e9433ceeebe054ee713c47760d7ad132a7f3f8fe3d5041b811a26b65efb1f340e181a4ec720ea136b3af3d9e5461dd24370336f10e6354c8c17acf9998544cec0873efa687cb132aecf70aebbc567ba03c536499ef96cc8412e7aaad5bf96422be47cb9413645df2c1703192347dcbb123127455971ae157e9fa2dbff88745a96c658b865e41f55aebf98395005ddcbd5983e6ae02c4fbb5e17916796325f76edf5b64afa4ec5a7418afed23a97efade68b6a5b3145f08a5d3db9c298a512fabdac68562b3f55377ff44b00c1c2f3efd18132da71f971a953a9318c57523361a160f9b7e3b51c524e95dd5ef4568ef18a800775e9d26e07131942d2be4ef22c0cbc13df01c68b1bcd3bce9bd51c4ced652adc4007be43b37c67a5c55ed4029e8ad15def8305c968621aed4cd4bfe079a6f48884d85680392ca92ba6e12fea6f4a056f79d67b19b05f90d684be7d45725f7967c6a467af43b86a6b1b9d9eed3a4248971c76a7ac29c292dfba4d75c5f7ba709a39058e96adf6dbd760d3cef4024bf3edc441efbf1147a2c108bd6f9eb439c1c5c4d3a6ea4ec3d92cef38136188bec9e0b6c0518d8b79ba59c5dcba393aedfdffb0b70d779c2b9765ce4452e7e3b08c4402b1a608320840fbe96d1eb8656eb1c20d9551ddf533b9f15e4eb5783756c53ddd3b14d807f838ac9680f89f1adfb78d68ccb06731a90beac5f0d709d5b88c75437a663cb962d37f96b8e8928477b5611228015d337f049e8b62e4dff8d0bb6cda24a5df9083e348bef12585f5f4c4d3bb3c7e78d550194a45251a0879a1624bf9dd35eb655c3939fea8909f6df395bebd02b68a17a897c9aaddd6e2e20461e303f57cdeb00ae0f23e60a94c19c771d8aa60533b93cedc1b76d2290a01bf43b2725f125befa575154e986c9c6205a1596cbaa2d13470c23422f2df7bece4e6ebd752e9389ae60857b52969d2ddefa9c034f1bf35ae3316304e949c8990820e26e6cffae4b388d1505f923706297f8db556537919ebbe3086023f12f4ded3b11acf2a6d973ddd8eb27b07c580bf448caa5a2ea116c5eaf36f7a6b17a85b3955dc8a44a620d8", "signed": "ffede701eb1829ce2361cda2c8bb63338539d8ad2f6677585531e7bf1d3922382679a1ae84ffeb753fc9754e50c01852f955e3fd609ff64bf05bbe7075cdbe00911727036db309d6e2e3369e4f17d98d99ec070c33283bb1244efd62e76bd70a69b9723bd2b520472b98aa065924366de780900bcd8b77b50f87c3c36187024bbc59ccf4482c7b4aadb56e2e5ecc0003d989d6afc63ec10242e57482fe39215261d5fc95a0185f95e9540c55f74d696048bca7ab112681a5558ea93c3b1f1cd364659e9433ceeebe054ee713c47760d7ad132a7f3f8fe3d5041b811a26b65efb1f340e181a4ec720ea136b3af3d9e5461dd24370336f10e6354c8c17acf9998544cec0873efa687cb132aecf70aebbc567ba03c536499ef96cc8412e7aaad5bf96422be47cb9413645df2c1703192347dcbb123127455971ae157e9fa2dbff88745a96c658b865e41f55aebf98395005ddcbd5983e6ae02c4fbb5e17916796325f76edf5b64afa4ec5a7418afed23a97efade68b6a5b3145f08a5d3db9c298a512fabdac68562b3f55377ff44b00c1c2f3efd18132da71f971a953a9318c57523361a160f9b7e3b51c524e95dd5ef4568ef18a800775e9d26e07131942d2be4ef22c0cbc13df01c68b1bcd3bce9bd51c4ced652adc4007be43b37c67a5c55ed4029e8ad15def8305c968621aed4cd4bfe079a6f48884d85680392ca92ba6e12fea6f4a056f79d67b19b05f90d684be7d45725f7967c6a467af43b86a6b1b9d9eed3a4248971c76a7ac29c292dfba4d75c5f7ba709a39058e96adf6dbd760d3cef4024bf3edc441efbf1147a2c108bd6f9eb439c1c5c4d3a6ea4ec3d92cef38136188bec9e0b6c0518d8b79ba59c5dcba393aedfdffb0b70d779c2b9765ce4452e7e3b08c4402b1a608320840fbe96d1eb8656eb1c20d9551ddf533b9f15e4eb5783756c53ddd3b14d807f838ac9680f89f1adfb78d68ccb06731a90beac5f0d709d5b88c75437a663cb962d37f96b8e8928477b5611228015d337f049e8b62e4dff8d0bb6cda24a5df9083e348bef12585f5f4c4d3bb3c7e78d550194a45251a0879a1624bf9dd35eb655c3939fea8909f6df395bebd02b68a17a897c9aaddd6e2e20461e303f57cdeb00ae0f23e60a94c19c771d8aa60533b93cedc1b76d2290a01bf43b2725f125befa575154e986c9c6205a1596cbaa2d13470c23422f2df7bece4e6ebd752e9389ae60857b52969d2ddefa9c034f1bf35ae3316304e949c8990820e26e6cffae4b388d1505f923706297f8db556537919ebbe3086023f12f4ded3b11acf2a6d973ddd8eb27b07c580bf448caa5a2ea116c5eaf36f7a6b17a85b3955dc8a44a620d8", "signature": "ffede701eb1829ce2361cda2c8bb63338539d8ad2f6677585531e7bf1d3922382679a1ae84ffeb753fc9754e50c01852f955e3fd609ff64bf05bbe7075cdbe00" }, { "secret_key": "2ddd79e76064c2e6b322afb0c5c685cdbec62821cdfc0cb14db7d01ba3bf21a5", "public_key": "f55b4ab64a2582212b96ccac0640e271944a34a286d035833045810e341824bb", "message": "a56674a1e1f09795251abe54ab43c298208fefc9bb9176fdb23e1e9f60f032647915567ebdcc2b869edb7055f4aba67ecfe7fa19eda45c06047c7a51848be9973251f85ff76f1c59e3654382858c9be123db8a9490c6c9b309b82d1e2ca6f4a07d00120283c6c295644995a96628612b8d6791573518e2556a688a09f149bc846a68bd0ef79279035710031ef0a8fed1dd0bf026125dc6648f86f64309942e18f23b12d1dc68c6f2770ca8b5485b369b0c92007a9461c139fcbb41175f316d4467060ab43d1222f5802404bf63c2df7e004bdc400ca80fe0d2cb68a210fbc3fc0b903209d5476e7a56baefb8fad7f328b72f327113e139414ba6f34e99c2eccde044e7a3ac70c580cd26c7450192ca4c823c7ac5eae876c0d1c8c768c1cb0b7ea41fc9b7d29437bbadab18e0f5ed1defe0cf6c0ebaa6b6d777f4dad9abddbfc0fd6ab5eeea803cfa01c0bd46f65fefa46901abbe0d89104e3bc4aee1f0599c69b67ba545ab9b54f5dee340ac69d88299e86822acddddce601122012f99299774aaf17c964edecb95e1277d462de64e9115a61ad98aa3d22e3ba6f8f1cd69b6b52b83382823f30e966bdad1ff5fc198ae32e9b68055d4392bc7c3df1015f128aee1e4fa3d4999e329f22f0ff6aa778bae0294a1df7436cb16a2bfcd74b463abe7cb4bac5362c89c9d1a378a2cb885cc3b26ab4be881ef1afc14430e10d26539ca358c3676286ad81ce1c9e78592af66f182bb1f7f862fe755bffb5be5c5f2b731c132e2388a76a1a7b1cddf05aed2ac9ec408475271942ccadd32e49d8791edf8b8de117551ce264a60b84105eae87e66f6a401d1322bb21a98e8acd277493254e504004f72c76e7903d2fa38fab717e94ce627947c4ea326bd2575c37310f3b4d843b90fa77d32d9952194150b62f850187a4fdf38466dfa0656c0a2e0b3f07492ac8e37e5d0df95cc89df3085a269291dc2512210d3fe44248d7ab996be099af64c22756666f8dea56c00b90677d1182500dd274fd0769253826d677ab16a557b08b3c52265498d85c4cb2b600ee0481b7c1c476a9daa8b88c71fc21b6f89bfdfece58da9e8d565652e4395bdf4c811b4f4f22d2b9613261f88c604c2974d3e977d140d046e1b6625b7071640d352cb7e7e65d46c613447be8dc5a200aa9acab46afccfebb6b1c31973246c34faaf8d26ea5e83be15718f8fdb0cfc444e2eb60f3659b020161c228e6b9240b7ac394cab812de10515766f22473ecca535594ce528a57cf5dab2eb32ab84", "signed": "a4c396e19dd42e039184cd251188ffa245f0367c69c02d12474e5ca9e5c768a7ee3a3d47eb22d1ac9e04b704a74f416947f3f49a3242594e7b6390e82b60d505a56674a1e1f09795251abe54ab43c298208fefc9bb9176fdb23e1e9f60f032647915567ebdcc2b869edb7055f4aba67ecfe7fa19eda45c06047c7a51848be9973251f85ff76f1c59e3654382858c9be123db8a9490c6c9b309b82d1e2ca6f4a07d00120283c6c295644995a96628612b8d6791573518e2556a688a09f149bc846a68bd0ef79279035710031ef0a8fed1dd0bf026125dc6648f86f64309942e18f23b12d1dc68c6f2770ca8b5485b369b0c92007a9461c139fcbb41175f316d4467060ab43d1222f5802404bf63c2df7e004bdc400ca80fe0d2cb68a210fbc3fc0b903209d5476e7a56baefb8fad7f328b72f327113e139414ba6f34e99c2eccde044e7a3ac70c580cd26c7450192ca4c823c7ac5eae876c0d1c8c768c1cb0b7ea41fc9b7d29437bbadab18e0f5ed1defe0cf6c0ebaa6b6d777f4dad9abddbfc0fd6ab5eeea803cfa01c0bd46f65fefa46901abbe0d89104e3bc4aee1f0599c69b67ba545ab9b54f5dee340ac69d88299e86822acddddce601122012f99299774aaf17c964edecb95e1277d462de64e9115a61ad98aa3d22e3ba6f8f1cd69b6b52b83382823f30e966bdad1ff5fc198ae32e9b68055d4392bc7c3df1015f128aee1e4fa3d4999e329f22f0ff6aa778bae0294a1df7436cb16a2bfcd74b463abe7cb4bac5362c89c9d1a378a2cb885cc3b26ab4be881ef1afc14430e10d26539ca358c3676286ad81ce1c9e78592af66f182bb1f7f862fe755bffb5be5c5f2b731c132e2388a76a1a7b1cddf05aed2ac9ec408475271942ccadd32e49d8791edf8b8de117551ce264a60b84105eae87e66f6a401d1322bb21a98e8acd277493254e504004f72c76e7903d2fa38fab717e94ce627947c4ea326bd2575c37310f3b4d843b90fa77d32d9952194150b62f850187a4fdf38466dfa0656c0a2e0b3f07492ac8e37e5d0df95cc89df3085a269291dc2512210d3fe44248d7ab996be099af64c22756666f8dea56c00b90677d1182500dd274fd0769253826d677ab16a557b08b3c52265498d85c4cb2b600ee0481b7c1c476a9daa8b88c71fc21b6f89bfdfece58da9e8d565652e4395bdf4c811b4f4f22d2b9613261f88c604c2974d3e977d140d046e1b6625b7071640d352cb7e7e65d46c613447be8dc5a200aa9acab46afccfebb6b1c31973246c34faaf8d26ea5e83be15718f8fdb0cfc444e2eb60f3659b020161c228e6b9240b7ac394cab812de10515766f22473ecca535594ce528a57cf5dab2eb32ab84", "signature": "a4c396e19dd42e039184cd251188ffa245f0367c69c02d12474e5ca9e5c768a7ee3a3d47eb22d1ac9e04b704a74f416947f3f49a3242594e7b6390e82b60d505" }, { "secret_key": "3abbdb0ba11aa1063bd26b02c116037862285babd215d240bc9c0926f4ecea81", "public_key": "b8fc59438f8ce9e3785a473b22c8892c51eac2568c681dcc77b6f0e0799c4e33", "message": "dccd55f922cd274f6975000adc8d98630c6d752c1202a9dd121048b93945af2b1110967788f99ec028e3d3b4cf82fb07173ea4401e3bb4b07b7b0b24b059a766339532d9df3e31b72c958c119d8dfa15a507af6c5f7e78fe270fa81b9df0f2e4af24bd99fbeb14e0033084d7fbf84ddedfd5ce56751d15908475df8af013d091173c1386b9139426cc6081ea165b8ce48194b8e18a9b91a4631344fe29c8e72818b71fa15c9292d13fdf5f9d18e29bd0291b8138de738fd3a36c35239022368b456f1facba90a0d80d6e311c5f6c6f04677e92373a5fc4738894dbed206c30da341b3b196c947858a6d2adc68aac3f20cfdbe0497961dae33470266d17ec719a59f0586f82f99f1c90ed7005a207219a55edc760f4eb8f2402647f6f77971ff7b634357b6b29bbd7ea05e2e25854e99c620f4b8b64739022ff0b338afef35fb6f41a53629a518eb93d66020fb353aef8dd071e09c916d4704acdf776b38ca9c59f211ff88c430a57e8f1713923b3f30ca86970a14a52db4bcbe60df4bc3cfdf254bf10f8afae87bd61b358f43cc296c0412964c4e00f71213397468517cb01379cb729c7b9e35bd50bdd98c3d3b76297a138b57ceb6c77742df0881d07668c08a630a44e6ed7eb206d6a56440710438a5111424b61aaeece40e900f5e3c457e9d6e31a79ec5b4b42b68e66e199309287cad65336fc7fe43f43cd8c773d3c6580d7217e2cabecd3eabc485c4acf47718c39b02c7858ff347cec7535eddcd4fc815df814569a88ae70f2733a6539f208c79cf4e7c4f9ea241a92e9515171361418a4c2e53c076aaabc47e4c971bd04b100c26282308857e06e7e5fbc4342564fb3b1ea4a17a925e91ee69122321d392b246965b86b54fd5c83fa5c474163f98a9f447d88cb59fe2cdf9f5412fcbeb3effac8976791c6a47b669a2fc55abe8e09e74157efcd1ca78fc10fa687010c6826c6e896ef5cd71d0fe4d1bd07c10dac3b03485edd2569a7eecfbc4e5d2ee2379859e265267bedaad69d93b7c1bd18f27ea42483c7e4100ee05b283039bfb9891d37c467ed83b88c794eab6bab9dc677892650e2d896fbfec1b1cdb721be30b0b8e5358709e165cbe3a182c93bc0a0cea2f8cf3a6257adf764534041202241a5279b668e40125fc094585a3c588aba82b67cd91d483e54300428426863a42364049d7c45a169385aa89bf377f0d32b07809b5871395ec053a257d93e48bbf407eb6091401e256546e31f9fcd24d2c5b333cf65785002f08d548db26ad1f3", "signed": "981f20055a457525aee5616264e6af42e8b387cb08f8b4a73f9be0b366f1035bb30a1c874894cbece0a846d849b7ecc556585d0d3d395645807ff2a3ca5a590cdccd55f922cd274f6975000adc8d98630c6d752c1202a9dd121048b93945af2b1110967788f99ec028e3d3b4cf82fb07173ea4401e3bb4b07b7b0b24b059a766339532d9df3e31b72c958c119d8dfa15a507af6c5f7e78fe270fa81b9df0f2e4af24bd99fbeb14e0033084d7fbf84ddedfd5ce56751d15908475df8af013d091173c1386b9139426cc6081ea165b8ce48194b8e18a9b91a4631344fe29c8e72818b71fa15c9292d13fdf5f9d18e29bd0291b8138de738fd3a36c35239022368b456f1facba90a0d80d6e311c5f6c6f04677e92373a5fc4738894dbed206c30da341b3b196c947858a6d2adc68aac3f20cfdbe0497961dae33470266d17ec719a59f0586f82f99f1c90ed7005a207219a55edc760f4eb8f2402647f6f77971ff7b634357b6b29bbd7ea05e2e25854e99c620f4b8b64739022ff0b338afef35fb6f41a53629a518eb93d66020fb353aef8dd071e09c916d4704acdf776b38ca9c59f211ff88c430a57e8f1713923b3f30ca86970a14a52db4bcbe60df4bc3cfdf254bf10f8afae87bd61b358f43cc296c0412964c4e00f71213397468517cb01379cb729c7b9e35bd50bdd98c3d3b76297a138b57ceb6c77742df0881d07668c08a630a44e6ed7eb206d6a56440710438a5111424b61aaeece40e900f5e3c457e9d6e31a79ec5b4b42b68e66e199309287cad65336fc7fe43f43cd8c773d3c6580d7217e2cabecd3eabc485c4acf47718c39b02c7858ff347cec7535eddcd4fc815df814569a88ae70f2733a6539f208c79cf4e7c4f9ea241a92e9515171361418a4c2e53c076aaabc47e4c971bd04b100c26282308857e06e7e5fbc4342564fb3b1ea4a17a925e91ee69122321d392b246965b86b54fd5c83fa5c474163f98a9f447d88cb59fe2cdf9f5412fcbeb3effac8976791c6a47b669a2fc55abe8e09e74157efcd1ca78fc10fa687010c6826c6e896ef5cd71d0fe4d1bd07c10dac3b03485edd2569a7eecfbc4e5d2ee2379859e265267bedaad69d93b7c1bd18f27ea42483c7e4100ee05b283039bfb9891d37c467ed83b88c794eab6bab9dc677892650e2d896fbfec1b1cdb721be30b0b8e5358709e165cbe3a182c93bc0a0cea2f8cf3a6257adf764534041202241a5279b668e40125fc094585a3c588aba82b67cd91d483e54300428426863a42364049d7c45a169385aa89bf377f0d32b07809b5871395ec053a257d93e48bbf407eb6091401e256546e31f9fcd24d2c5b333cf65785002f08d548db26ad1f3", "signature": "981f20055a457525aee5616264e6af42e8b387cb08f8b4a73f9be0b366f1035bb30a1c874894cbece0a846d849b7ecc556585d0d3d395645807ff2a3ca5a590c" }, { "secret_key": "8a44d6afc6c8eee1bc7d5f69e495b0b18ca7aee007dea7cf0d1714d785a9f4ed", "public_key": "d4f366b3377fa39b36f9ae14da404e2240490dbd8d796b1ab872dfcb83a59540", "message": "de80326966536ce94996af2de7a07605cc4fcb9e75ee0a67a1e20932111de9b356d5beeae86cc5f564c10d66e3de95a5b99e844928ea8e77586cf3c10ad3633ddeeb1d9dcf3f94b70bf1ef63d238df204d705c0b174f83282545f5e4075f8d69a48179c29eabf5c1742ef39e1ad963bebbb66fce9491a984651215c2e750e6ee8365766440a84419e52dcf671f1c52eaa2b9902bcca4b37cffdbac8e7e7e6b0a5c8748efbf452df6163f4ca07b61f9a05ec20a2bd633389e670bb5454acd6f3a06335b5da9ec326264e962c7d9d06ce7e9ff04a0a5bbdfaa4c410866a572011651439f2dbce5dee667924ac4934d205496bd1d4df08bd0cb3fd2de73a2ef342ff0091e10e15b3b760a575df93cf1c97c01c5ab11c094bf34878206718f6b285aa5cc5127bd7f988b84a90495306fd9e99d8955e668d1a3ff10f65b7c479fac24119a3c10122d4d18a805b247df168c0a5100169b5572d17012d751a42e83376115e11561c160c15efad76d21f7abb430366475238631f84c88f838b0ac404c913d2fa12450238485c302fc201f44151c19bcbdc1190c12d1540831fb19581cb93172b0d2ff5c65f31caff20f813881f84e5ef9d5c165e096d254cadf895249aab8d4496c940a40f907bd40935a94f5e55b6dd051154100fe331770eff2bad6545619b8a33ef6462a50c0b2c4ed2fba4e4e383ebf2932e6192766a4aad1d6e2b692d9f2bdc23393e8aacfba323b534f84edf2dced7c94d51687daa27198a9144b312b716fe17014a7bed0c14a2438733d555c6564c8c1a3d997ebae7b3de8877af53c1d1a5029158a80aa0c87489fef270cdffe10d34b15c1a9693ae0390243e314cfac06ef6eefebccf43d42eac24ce9879429d2fc7253b3ed175825bc4da0762b4933a98afdb94b06f4fcd2ad3611aa999d7c1c8d852d01dd9e52648455a04eb2330a76fd942c531e514b5ec0728a89d34ca590ea99c88faa20dfb7bbf65654aa6c212beb8ad6bf7c777391cd49c39cf8ab51b95b419e3dfc8d94a93a1ef0223c6de90bf96218d8045bd4952a0d8372a5578c6aafa74ba662e3188e6a6e567e4d2fe8227d0743982a41ebfa0d310fe79fed27041790efd5afac2243e1d150b145015d9deab0eded6394ac36fc5fb201f5204fbd422a3604233015bb0a48a920e2e5e0d4deed672025f23cfba93889597e504c8887add46cfef4024afb8a26eeb7dcddb2397b44a1796367340042137028c3307626816c2931e61ebb6b69edcbcb612c9b181a285301ce46f82f", "signed": "e0727eb72e84d2b82cdbd0a6bd2f49496316aae8351e4902acd5e3cc57346e7ebafdd92a90ded76fd0c6690d68bb2fedd613e44fa222be0126da520acc2c4105de80326966536ce94996af2de7a07605cc4fcb9e75ee0a67a1e20932111de9b356d5beeae86cc5f564c10d66e3de95a5b99e844928ea8e77586cf3c10ad3633ddeeb1d9dcf3f94b70bf1ef63d238df204d705c0b174f83282545f5e4075f8d69a48179c29eabf5c1742ef39e1ad963bebbb66fce9491a984651215c2e750e6ee8365766440a84419e52dcf671f1c52eaa2b9902bcca4b37cffdbac8e7e7e6b0a5c8748efbf452df6163f4ca07b61f9a05ec20a2bd633389e670bb5454acd6f3a06335b5da9ec326264e962c7d9d06ce7e9ff04a0a5bbdfaa4c410866a572011651439f2dbce5dee667924ac4934d205496bd1d4df08bd0cb3fd2de73a2ef342ff0091e10e15b3b760a575df93cf1c97c01c5ab11c094bf34878206718f6b285aa5cc5127bd7f988b84a90495306fd9e99d8955e668d1a3ff10f65b7c479fac24119a3c10122d4d18a805b247df168c0a5100169b5572d17012d751a42e83376115e11561c160c15efad76d21f7abb430366475238631f84c88f838b0ac404c913d2fa12450238485c302fc201f44151c19bcbdc1190c12d1540831fb19581cb93172b0d2ff5c65f31caff20f813881f84e5ef9d5c165e096d254cadf895249aab8d4496c940a40f907bd40935a94f5e55b6dd051154100fe331770eff2bad6545619b8a33ef6462a50c0b2c4ed2fba4e4e383ebf2932e6192766a4aad1d6e2b692d9f2bdc23393e8aacfba323b534f84edf2dced7c94d51687daa27198a9144b312b716fe17014a7bed0c14a2438733d555c6564c8c1a3d997ebae7b3de8877af53c1d1a5029158a80aa0c87489fef270cdffe10d34b15c1a9693ae0390243e314cfac06ef6eefebccf43d42eac24ce9879429d2fc7253b3ed175825bc4da0762b4933a98afdb94b06f4fcd2ad3611aa999d7c1c8d852d01dd9e52648455a04eb2330a76fd942c531e514b5ec0728a89d34ca590ea99c88faa20dfb7bbf65654aa6c212beb8ad6bf7c777391cd49c39cf8ab51b95b419e3dfc8d94a93a1ef0223c6de90bf96218d8045bd4952a0d8372a5578c6aafa74ba662e3188e6a6e567e4d2fe8227d0743982a41ebfa0d310fe79fed27041790efd5afac2243e1d150b145015d9deab0eded6394ac36fc5fb201f5204fbd422a3604233015bb0a48a920e2e5e0d4deed672025f23cfba93889597e504c8887add46cfef4024afb8a26eeb7dcddb2397b44a1796367340042137028c3307626816c2931e61ebb6b69edcbcb612c9b181a285301ce46f82f", "signature": "e0727eb72e84d2b82cdbd0a6bd2f49496316aae8351e4902acd5e3cc57346e7ebafdd92a90ded76fd0c6690d68bb2fedd613e44fa222be0126da520acc2c4105" }, { "secret_key": "8a972dd0f1190c2b9d548f4ba58264bb04826775502a8d5c2b209ee88dcea5fb", "public_key": "6d80375f3cf1aab283551df445d17e7d3baf9bcbecbbb267052e02fdb69144d3", "message": "30b28948939aa263437e45c5c0254fb20e617ed0f3fa7dace5a0a8e0fe3c1fc4adb2809b61c5e8d92cd2f3de93b173be707bada94240c6262c160e8c782165beef99d0be8ecdad6316dcd734bbb90a66cbd5b1cb4fd8f2226cea948e4df76bbe251d478f5c3fe0d6de4be54f67f502b2804f628b79a550fb1ac483ad2ba16637c4bc9da67fb4f98659c4c4394d16b6d14b3e0b0c1e625d710dcc1c11df5d34147b1ec5a417b9e21f908cfc523d43e3f181c7209cc56bdb5a21628695ed320f8d4c07fd6d84aa03426f21644aaefeeec311c74e9499936047350a9bf5b703962e77ce551336835fc32ccbd2c90ae52e24d47d8dcb987abd121d3f746b5de230f26469603fb0c4a8f6cd7973d7da882ed1d6e4d9c5a46ec2c21940ad3389a186014ee97278e5350988b15ecd9ea7456b3cb55e4d3093f13a875b50d6516378ecaf58d752c6374ed15638409311fcd379d122c8d8c59b86f4e8dc46adb730a933846e0bd248d3608252d970b504c813c6dea9fc88a3de641956dca291204d390b6b39981f8c0a6bcfc31ca0744420662a9b35eb3fc211f810a3e8062500b1e49bdf857665ff32a9ba76194bbb77fb9c15412964244b9865f73ded9f25b49b425aa253d807d9818292763a513ec80747344fba0acfe593cc26b1330bb9ade66c4e88cf1baed6d6e7b750e6c7239d7bcbfa3fbe45405a63b96d5034cc0c07ffc3b50858081d1955e2d2fe5be5fda7a8996943768b055170b7fd52f0a32097fe1b7a94f1bf879a0cbabe10ac9a7cc1f9f55068c48e3ccc065136431018d38d20109dc95d99cc2bbe7c627ab1a8aa5f431613b790c2e6526cf04fdc9e55f51c055f3c2045a675e3a1e54ba409f7aefa7e4aa07a2bbd5e4ab16321a9f099694391fda68a74581e2f1f11dd9a6d524b1b83260db57b72ef29c28c8db5c37fd185b7c2d8455090653af332dbc82bfb0db5dccabfb6b28caa350525cb54cc84e553e1cf3954b612393e7993ff7e8bf5ece3f145094dd7a27cb47f227476f289235251f772b3ba776bb773af0cc5f786a3fb9e931a530cfbd891cb5a5dfe25169ef933cc82c9080f323961a120158e4bbd71134ef1f90108b815c289d4e9a9589ec64c05fbb42a21b23d16e2a64678aecfab65cd9a806c598103d41f7009776317831feddd1c9002d4a92204f97ba9490c61469803072102524b9df519005f98af54d60ca5ba60b55b096a4ac2b16eb9cc81973c3135d3fb6873dd9653800a22bb5d0d6117ca5d916553be39c9a3b511eb3db730", "signed": "bd45b3c045850ebef7b80dd1deab48037b1346c71deaf1e58f2a7b162674f94d1ef3d4239037330bd6335fe4f0149250901f00a8e46be5fa0aaec69de06d730430b28948939aa263437e45c5c0254fb20e617ed0f3fa7dace5a0a8e0fe3c1fc4adb2809b61c5e8d92cd2f3de93b173be707bada94240c6262c160e8c782165beef99d0be8ecdad6316dcd734bbb90a66cbd5b1cb4fd8f2226cea948e4df76bbe251d478f5c3fe0d6de4be54f67f502b2804f628b79a550fb1ac483ad2ba16637c4bc9da67fb4f98659c4c4394d16b6d14b3e0b0c1e625d710dcc1c11df5d34147b1ec5a417b9e21f908cfc523d43e3f181c7209cc56bdb5a21628695ed320f8d4c07fd6d84aa03426f21644aaefeeec311c74e9499936047350a9bf5b703962e77ce551336835fc32ccbd2c90ae52e24d47d8dcb987abd121d3f746b5de230f26469603fb0c4a8f6cd7973d7da882ed1d6e4d9c5a46ec2c21940ad3389a186014ee97278e5350988b15ecd9ea7456b3cb55e4d3093f13a875b50d6516378ecaf58d752c6374ed15638409311fcd379d122c8d8c59b86f4e8dc46adb730a933846e0bd248d3608252d970b504c813c6dea9fc88a3de641956dca291204d390b6b39981f8c0a6bcfc31ca0744420662a9b35eb3fc211f810a3e8062500b1e49bdf857665ff32a9ba76194bbb77fb9c15412964244b9865f73ded9f25b49b425aa253d807d9818292763a513ec80747344fba0acfe593cc26b1330bb9ade66c4e88cf1baed6d6e7b750e6c7239d7bcbfa3fbe45405a63b96d5034cc0c07ffc3b50858081d1955e2d2fe5be5fda7a8996943768b055170b7fd52f0a32097fe1b7a94f1bf879a0cbabe10ac9a7cc1f9f55068c48e3ccc065136431018d38d20109dc95d99cc2bbe7c627ab1a8aa5f431613b790c2e6526cf04fdc9e55f51c055f3c2045a675e3a1e54ba409f7aefa7e4aa07a2bbd5e4ab16321a9f099694391fda68a74581e2f1f11dd9a6d524b1b83260db57b72ef29c28c8db5c37fd185b7c2d8455090653af332dbc82bfb0db5dccabfb6b28caa350525cb54cc84e553e1cf3954b612393e7993ff7e8bf5ece3f145094dd7a27cb47f227476f289235251f772b3ba776bb773af0cc5f786a3fb9e931a530cfbd891cb5a5dfe25169ef933cc82c9080f323961a120158e4bbd71134ef1f90108b815c289d4e9a9589ec64c05fbb42a21b23d16e2a64678aecfab65cd9a806c598103d41f7009776317831feddd1c9002d4a92204f97ba9490c61469803072102524b9df519005f98af54d60ca5ba60b55b096a4ac2b16eb9cc81973c3135d3fb6873dd9653800a22bb5d0d6117ca5d916553be39c9a3b511eb3db730", "signature": "bd45b3c045850ebef7b80dd1deab48037b1346c71deaf1e58f2a7b162674f94d1ef3d4239037330bd6335fe4f0149250901f00a8e46be5fa0aaec69de06d7304" }, { "secret_key": "12380c45a79ade0f483c881aaa3730438b083590f404dc9e601f7615f375a628", "public_key": "d66fc59ae917f76d24ce8ab8ee03fbcb715d5eea4b08392b591e648591c73c89", "message": "684523c2e7fa8b4bd7548c4bacaa8678a330dbbb960632940166b2cc9afc1535c80c112c8dc4ada7629233fe909055237d513e292af15ad7692f115aa092da657532f51899c3f7f5d9d407ed5c163eb3950480a4122a0992981f077bc867f906075407ba9849c4ea0473ce540a796744efa3860378e1b89343e583d0807e5a67c4d5bd7ce64129fe902b8cfabd2c21fa3d2a10e9bf9ea5e5473ae250c9160509972678f9a740e6cadb3b52f502fa616cffae1def893d54e41e54d326464c9f435c63505fb15e3eeaf5021c65dcd010f840aab317c8605dfb1a0c8a3d5549861b69af2c93d86c981df3a51c5bf5785c2f852610e44fa4ff1c7161152e5618384744fe83babf0bcb7561789a023125f6242a183cac9549c932733a868aa182656e2ba0a8c0be106996a85cebf1bdad123b982b4e055510879482021daea9d8f26c588e6cd10126cb3196880356bee8f298bca306ec5699c7576b765087c253a60214010c6ed70d871cfc8738018a0edb57f106b4218d855eab2c91f39f858b3f25905631a0eee29856fd34f7b8c9ba51c1c4c6a735d6c7a13d220d7a566c3f506c72bc7417ab37f0d6d796ffc71df9dc7c6e137da56b7a3e10cf0b1abb3ffb70bc66293b5d75b405ed8bec0d6fcd06925c381168ac188d0b8a1af0839f5bde843b6991e5a5d6cd66fe6b0fde867c086ed43876919a1b7233d8d7e1d2742f61c77d8e5991689c8328676655b76a3750560e75d1c7e85e3c0085059331094bba5710032cf679a525c78b31700e6d91f75294c422489297e1735943e417fcd35580582fdd0239b51146530cc09d83b28f0a1d642220dfb99bad62f39541035081d65d778ddf3239ba0e6fa9914b17b397a534cb8fd3b4ff42a8d8c8ee66153fbb1ff0fa54f7bd03278516e6341af80fcd1fcee70c359d205368ac490d75a354512da46ba7634c15b284b24477808f17633360a4b49fb3bcaa841841cf92417eb24ce482d5a24bfd2dac372231da539a05420002ff7a20c476097da06f59f03314e6059fad88c50c3baac03cefa7cd8211d2461b1660ea6bcf476838c91a10074eb4b40e6e974a945a67f6ee6904231ef04188f1ead5baf35694efe301edc7e866da23b5a6c58f01b2a52cf3ab805edc5c1368626b95b94eb4645b693ec880f2b8117a693afbdcd2482431890f410bc580530fef375879c2e46049ca891a2c3ecd6043ae80d8af346634674c6dfe905997de5d05d62009eeed277502fb5a5a3155eeeeb67348b60d89a34a7812639f541ffe", "signed": "02b25174a3dd5219ed48b2c94ca212b63a6a3a2597703c07b7f0c965c3c6ac2eb450efe38716a2a28b3f89846b06ebdca4bd09aa581f24e84d80fc10ac1a000a684523c2e7fa8b4bd7548c4bacaa8678a330dbbb960632940166b2cc9afc1535c80c112c8dc4ada7629233fe909055237d513e292af15ad7692f115aa092da657532f51899c3f7f5d9d407ed5c163eb3950480a4122a0992981f077bc867f906075407ba9849c4ea0473ce540a796744efa3860378e1b89343e583d0807e5a67c4d5bd7ce64129fe902b8cfabd2c21fa3d2a10e9bf9ea5e5473ae250c9160509972678f9a740e6cadb3b52f502fa616cffae1def893d54e41e54d326464c9f435c63505fb15e3eeaf5021c65dcd010f840aab317c8605dfb1a0c8a3d5549861b69af2c93d86c981df3a51c5bf5785c2f852610e44fa4ff1c7161152e5618384744fe83babf0bcb7561789a023125f6242a183cac9549c932733a868aa182656e2ba0a8c0be106996a85cebf1bdad123b982b4e055510879482021daea9d8f26c588e6cd10126cb3196880356bee8f298bca306ec5699c7576b765087c253a60214010c6ed70d871cfc8738018a0edb57f106b4218d855eab2c91f39f858b3f25905631a0eee29856fd34f7b8c9ba51c1c4c6a735d6c7a13d220d7a566c3f506c72bc7417ab37f0d6d796ffc71df9dc7c6e137da56b7a3e10cf0b1abb3ffb70bc66293b5d75b405ed8bec0d6fcd06925c381168ac188d0b8a1af0839f5bde843b6991e5a5d6cd66fe6b0fde867c086ed43876919a1b7233d8d7e1d2742f61c77d8e5991689c8328676655b76a3750560e75d1c7e85e3c0085059331094bba5710032cf679a525c78b31700e6d91f75294c422489297e1735943e417fcd35580582fdd0239b51146530cc09d83b28f0a1d642220dfb99bad62f39541035081d65d778ddf3239ba0e6fa9914b17b397a534cb8fd3b4ff42a8d8c8ee66153fbb1ff0fa54f7bd03278516e6341af80fcd1fcee70c359d205368ac490d75a354512da46ba7634c15b284b24477808f17633360a4b49fb3bcaa841841cf92417eb24ce482d5a24bfd2dac372231da539a05420002ff7a20c476097da06f59f03314e6059fad88c50c3baac03cefa7cd8211d2461b1660ea6bcf476838c91a10074eb4b40e6e974a945a67f6ee6904231ef04188f1ead5baf35694efe301edc7e866da23b5a6c58f01b2a52cf3ab805edc5c1368626b95b94eb4645b693ec880f2b8117a693afbdcd2482431890f410bc580530fef375879c2e46049ca891a2c3ecd6043ae80d8af346634674c6dfe905997de5d05d62009eeed277502fb5a5a3155eeeeb67348b60d89a34a7812639f541ffe", "signature": "02b25174a3dd5219ed48b2c94ca212b63a6a3a2597703c07b7f0c965c3c6ac2eb450efe38716a2a28b3f89846b06ebdca4bd09aa581f24e84d80fc10ac1a000a" }, { "secret_key": "d1b3430d4e63aabfa9ef96bcbaf1fa6a9eb5219dd44df3b1a61563dffe1ccb28", "public_key": "c28a05195245290ecd38535585ce51f3c235c5d650c8c57c2f79bb0ac0e80834", "message": "076c0c8762e4bc003c360a12a19598050551d16b4b8da0fb9c4afcc81adbe61995f25cbc28dca420bfa9461054d3ee00ad78183e7f26df6898af9a4d225fcab67c042e9a13525d1f75ff0e3d8da80896b728f3e2db65944ae0717d775990b59e5b70434bd4b3ee452f10ac0610570b38220832968f544d3e4d119b1d4b5015c6cdf4cf220b56b5c0ccd8e398d5e4a58da3b0e2b270a5d39b82abb7f9d27a419018550b6200ae51c84882f086ae7ea5351671b6dd960923ad6befc13409879a8df619bdf6c88a6fe1ecc0f0f3aa219fb61902be48a53df2bc66c56f1c1d17f7e6167d255165f174baa9caf53c73cbbb7cc2c7c087f43abe2aed5a21fe4290b8d67960a8a9cbc2a57abe22654dc184cff9168bb697270375fe88d5c49cf95b06cf9d0dac81fbd9c0d7b82d05ed2c3fd49ccc29404441712545f9a991e4f0ddb62190838296f967299a38607226d8a681f0a8f3c4384fd18b30257c463c0abd0f4f6f1225a51b762d6d0ac7d59cd2efd698b8d13e23d70409f6b07d695c1671cd6f59443b1db0ab35b9dc0640e4c6d1ac50475d28ef94f81790e2e5b2545514b2a49c5c2153459be540890f53bc18e4a16dcb5dcf50f37a95c606fdf48598e52af3179a2048615d93d97e0599b7088c1174bb9f15e37018f99acbce5b1302f8d8ce2ab85437feeb0caa7784dc83c9e7c36fe059906b030a86a3ded0ab9d8b73529d475e661a0808d6d3f0907f8528873f08d5748be1d69712e85262d77bdf13bfd18a5cde6f71462673ab29b1617315a9a6e936a8e81a8e43bd0f6644a5c69eaaac89bdaa99cca803833705e5afa69b3bd1d0252b854650f2199791e6aca7c75a861283216233a2633a6aeff9d301ee5cb4dd72c08a45cdae8f5458c095b22e759c43b49b98e9f4cb33d5dea879449eae73cb874c73594325ebf68c1ed4064b6f61ab2f014a2f19f32e12b33c5eaa8a29204d5eba58dc075072fe399be7d1ab1808208fb408123bdc0b4ab3130f9f706dc3eb194b605e73a32f125ae491285ce6039fb623c38b81d5aba0f5599f6c86e872486b4e9649daffe3a3d06cb073dd3bc6f4e10a18700e45722d78a6b0972dc94d5c7a7b6641757b796075719d7b8ec36a1e796fb5f8fe6f1b79a0859cb4d67cec05ed914cfa32c1ddfe218ef963436c3a1148ac2cf909df7359890657463a4ea25fed59618a0681a1217e22d64ef9d9b4559d0a0f6b3ce8d847930b232301caf44cdf7a3f18a2ac130b92cfd9c03360557b5f7c4775462a1071f70344c718374b", "signed": "4cb6ff5dd706b1ae816cdbaf9e9e1edc80a66284f94652d50ec14e283b2adc592fd084337144ffa712dc34ce8e610668a65e969f05ceb54786304d0d58d31a08076c0c8762e4bc003c360a12a19598050551d16b4b8da0fb9c4afcc81adbe61995f25cbc28dca420bfa9461054d3ee00ad78183e7f26df6898af9a4d225fcab67c042e9a13525d1f75ff0e3d8da80896b728f3e2db65944ae0717d775990b59e5b70434bd4b3ee452f10ac0610570b38220832968f544d3e4d119b1d4b5015c6cdf4cf220b56b5c0ccd8e398d5e4a58da3b0e2b270a5d39b82abb7f9d27a419018550b6200ae51c84882f086ae7ea5351671b6dd960923ad6befc13409879a8df619bdf6c88a6fe1ecc0f0f3aa219fb61902be48a53df2bc66c56f1c1d17f7e6167d255165f174baa9caf53c73cbbb7cc2c7c087f43abe2aed5a21fe4290b8d67960a8a9cbc2a57abe22654dc184cff9168bb697270375fe88d5c49cf95b06cf9d0dac81fbd9c0d7b82d05ed2c3fd49ccc29404441712545f9a991e4f0ddb62190838296f967299a38607226d8a681f0a8f3c4384fd18b30257c463c0abd0f4f6f1225a51b762d6d0ac7d59cd2efd698b8d13e23d70409f6b07d695c1671cd6f59443b1db0ab35b9dc0640e4c6d1ac50475d28ef94f81790e2e5b2545514b2a49c5c2153459be540890f53bc18e4a16dcb5dcf50f37a95c606fdf48598e52af3179a2048615d93d97e0599b7088c1174bb9f15e37018f99acbce5b1302f8d8ce2ab85437feeb0caa7784dc83c9e7c36fe059906b030a86a3ded0ab9d8b73529d475e661a0808d6d3f0907f8528873f08d5748be1d69712e85262d77bdf13bfd18a5cde6f71462673ab29b1617315a9a6e936a8e81a8e43bd0f6644a5c69eaaac89bdaa99cca803833705e5afa69b3bd1d0252b854650f2199791e6aca7c75a861283216233a2633a6aeff9d301ee5cb4dd72c08a45cdae8f5458c095b22e759c43b49b98e9f4cb33d5dea879449eae73cb874c73594325ebf68c1ed4064b6f61ab2f014a2f19f32e12b33c5eaa8a29204d5eba58dc075072fe399be7d1ab1808208fb408123bdc0b4ab3130f9f706dc3eb194b605e73a32f125ae491285ce6039fb623c38b81d5aba0f5599f6c86e872486b4e9649daffe3a3d06cb073dd3bc6f4e10a18700e45722d78a6b0972dc94d5c7a7b6641757b796075719d7b8ec36a1e796fb5f8fe6f1b79a0859cb4d67cec05ed914cfa32c1ddfe218ef963436c3a1148ac2cf909df7359890657463a4ea25fed59618a0681a1217e22d64ef9d9b4559d0a0f6b3ce8d847930b232301caf44cdf7a3f18a2ac130b92cfd9c03360557b5f7c4775462a1071f70344c718374b", "signature": "4cb6ff5dd706b1ae816cdbaf9e9e1edc80a66284f94652d50ec14e283b2adc592fd084337144ffa712dc34ce8e610668a65e969f05ceb54786304d0d58d31a08" }, { "secret_key": "033e003d7aab7bc7fc8ac204c733799ae553c3fec53f10dbf795b5f4b87f1c95", "public_key": "682f46f5c056dd45ba0b5a782031f9596a73aa292ca2326beda74a52fc32b716", "message": "596aa2c40b3318878938ebc138db274bb38a5201eb7caf875e6c645791dae012bdefd485e6bd9d8499c42a2ae86cf32b18002e76bb582cca0dec4815ded8a1211f8fc8857fce1d57f6151d88787b978fab56bf926b1533e19499e8bb99158cdd6e980f6ba543ae831f9dd134b0fe6d5c24887dc7a8d4781dd9b7fc5dc9464b045cbf9d1ef5036b5bf28b549ac7aa8fafb91adc9feca7a14554d110e310c749e48533f359c70f05fb7aedef136636b8ef7223886539864ee52d34118b4b8b74e08fe6b65896e4b19b6d7c3f2528265585481710d2d74948eb4b1708a50fa74021bda4b361bc68d2a5d202109f8d28d8aa67d78c1136cd2e903c8dfa175af7bd963b73dae495873ccdae62bfef885636dd83550ff9c05c37ba3389d1543685d89483b0c104e7efbb7702c5a0398ac720484c50936835ee9df253f0ef8cbef3e07de969511ccbf87557493a0b972ef0e8e629cf3822db21286ed727661bd31786fca1421106dacdee1caaf49454e854794f704d22a95a4c8e6b1c2feea57e56238c2096f1cc578647fea544d6764482bdf5148879a25f943db16f29021b9ecfe3e090b425c81c7009842e1c7a02d91ca60c1201c3bdae9c5373af03f2f4dbef40de8d9b21fed68dee510de0427234caa1c20a3ae549954834c93373d913b8750f23a03780d7a9454ed6fe51fd2d276b9d4aa32de05e03816e64e9466f4f0e224651428d342cbcc697170a47ef996bdacbce91117ca1f8455b25b2b08443e9914e3d90c489eeaa7731ddea2123d55d67b16683fb7c8236aaa5a1b0fcaf8d170011dbe9aa2857be612cbb85ef69e56831b4dacfbc7a59b465a66dc7412ddb3d6af4ebfd705864e7d4fb99a6ccb48b118368feab02a340c432768de0e067871e9ea808d6d993815829e71f6c042b664995098fee94d543df15e5b16957031bd238bcadbbdcc576affb640303d69c5b250b3a539afd127f7ee2609e52e5154fbdff3e45f9c44066656d561e0f64dff2805df88e30a380530822413a7ab76a1b9a865378d24763069a814002a9a9d03795ca8d2b5bd1090393e9e4b1ff7d7f0eb84e712a018f68c9e384f0a0aef3967879284f409e30d2365086e66952278ca9b6f90e8f69a48d9b28bb4c4ed632abca3af4144da7422bf51992f734731453c7a33e15e59f5308129d6a774a94586f723311179176c0948fff4e30c1b959812cac977cc74347b007940f2fb962a90d66066a6de8801984dee4a532d4b0acd6dcaf06727bab70b3866232234c9100bfdc669f77ca49", "signed": "edb4e020d676fac6a845534880bf6136374a8b7f2c5385bb9ee225381f494efb74a55b413ae0ea70add61bfdfb87fb42d5bc0c5359dddd573d538ae93a6b3609596aa2c40b3318878938ebc138db274bb38a5201eb7caf875e6c645791dae012bdefd485e6bd9d8499c42a2ae86cf32b18002e76bb582cca0dec4815ded8a1211f8fc8857fce1d57f6151d88787b978fab56bf926b1533e19499e8bb99158cdd6e980f6ba543ae831f9dd134b0fe6d5c24887dc7a8d4781dd9b7fc5dc9464b045cbf9d1ef5036b5bf28b549ac7aa8fafb91adc9feca7a14554d110e310c749e48533f359c70f05fb7aedef136636b8ef7223886539864ee52d34118b4b8b74e08fe6b65896e4b19b6d7c3f2528265585481710d2d74948eb4b1708a50fa74021bda4b361bc68d2a5d202109f8d28d8aa67d78c1136cd2e903c8dfa175af7bd963b73dae495873ccdae62bfef885636dd83550ff9c05c37ba3389d1543685d89483b0c104e7efbb7702c5a0398ac720484c50936835ee9df253f0ef8cbef3e07de969511ccbf87557493a0b972ef0e8e629cf3822db21286ed727661bd31786fca1421106dacdee1caaf49454e854794f704d22a95a4c8e6b1c2feea57e56238c2096f1cc578647fea544d6764482bdf5148879a25f943db16f29021b9ecfe3e090b425c81c7009842e1c7a02d91ca60c1201c3bdae9c5373af03f2f4dbef40de8d9b21fed68dee510de0427234caa1c20a3ae549954834c93373d913b8750f23a03780d7a9454ed6fe51fd2d276b9d4aa32de05e03816e64e9466f4f0e224651428d342cbcc697170a47ef996bdacbce91117ca1f8455b25b2b08443e9914e3d90c489eeaa7731ddea2123d55d67b16683fb7c8236aaa5a1b0fcaf8d170011dbe9aa2857be612cbb85ef69e56831b4dacfbc7a59b465a66dc7412ddb3d6af4ebfd705864e7d4fb99a6ccb48b118368feab02a340c432768de0e067871e9ea808d6d993815829e71f6c042b664995098fee94d543df15e5b16957031bd238bcadbbdcc576affb640303d69c5b250b3a539afd127f7ee2609e52e5154fbdff3e45f9c44066656d561e0f64dff2805df88e30a380530822413a7ab76a1b9a865378d24763069a814002a9a9d03795ca8d2b5bd1090393e9e4b1ff7d7f0eb84e712a018f68c9e384f0a0aef3967879284f409e30d2365086e66952278ca9b6f90e8f69a48d9b28bb4c4ed632abca3af4144da7422bf51992f734731453c7a33e15e59f5308129d6a774a94586f723311179176c0948fff4e30c1b959812cac977cc74347b007940f2fb962a90d66066a6de8801984dee4a532d4b0acd6dcaf06727bab70b3866232234c9100bfdc669f77ca49", "signature": "edb4e020d676fac6a845534880bf6136374a8b7f2c5385bb9ee225381f494efb74a55b413ae0ea70add61bfdfb87fb42d5bc0c5359dddd573d538ae93a6b3609" }, { "secret_key": "ee55fcf70a275c726bd4856683b347decfd422f1826c07a932cb85be9fa4ef3c", "public_key": "dfcffb5e1553789d56a9f3914bce500d07c5ac311f927854b2cf1e5833c03237", "message": "b8c845cf7c5485f0622d1ddc17f7a0f6f0fd7074fe194b0e0cd42650cfc817f57f095f8cdfad1ebe0dfbc1bd7617ab4f204e9d55d81a7c8a433940ec6f17c8a8e3d56c1afb0af374bd32d54ef7132d26b89c470c2ab5be16fabb4c75193d6da59ba2fd157e9ea4e0c5c08a5202f5edc6a61701f08bb344ca6455d75d145adb244c534c8cfc623f4d4b6767594b39a7690beeec4df9746a57ffee051454c4278ea43c810ff13cd769615f9d05d4fe4a51583e80c015dcfed9af05f93d054d34ffd939bdd8f0518fa3030a964dc9d80df00f1635824072cdf29bc80259209d50f56fca9fbd6ae1514a671989cea4f6846bc19179097cca40c624d7edbf91fb5b2539ebbd502d3646711430bae423fd115848093318b7d087ef1e3b894bc3b9ea27af853fca8595d36fb7299969162f2ed6a2b55075b2c630802857176dec4cb5acf2b13a35a9949b912bb57d81eb0c8a8adf3cf64cb571bf5f3d71f987d64d74e919a00336e57d35ee4eecfc657000dd5b12995ee1b116591ce58e56de25b29c94829d1d68521b9558e4725ec77039069c0cd17b2a003359e9e1e112c7590176cebce7f001f1d136e818f4818cfd94745afaab56f1a406f97dd9e61b735266d682ad7df26dd70cde0b57fea7db2df832fa88a35f539794884ddc41218403016cb6d5221f3feb5d3aee4a9840a913072d29f8d1a9367bb0bbf545f7dae7c00a0d0c0342231ae462bb742e1498ee584ae6c83f2f1f2d0452bead982268cd3cfde78ff422e226bf7b2af1137757797fb02e5275c34809d54ca9ee2a65275e6e5cffdd20ad1fa1ee0bd8b21e04ce829e02cdb63c48bfcdd86d3a08c59789c9d78e36181defeb7227107275ed6b5ccb127cd72b374e17f5ee0b5e47b4b3e14a8ec6d86bb7507187f28db32b3f3fa1ca13446fe5253ee783645e794272799a863b4fca99e443cbaa05de3c50edf3d5cd7c10529c6c09a0c1453406ac7ecafa9b3a1f369d68f3c618f58efc359df2f3fcd2478b55a41a11f2487e7f70ec293b3eccc700ef444a33d1eae9849c5b76d29afd5a23861aef4f2a7ba3f666301fdeb5d3d8f0dc9ee2e014b24c7465dee3c0964edd49ed49edabb5ca7afb99574d001e5812a085231f241b6b08c73e80fb44bb2adf554f14fd6dce94a6f63623d9c1deb41ad101651a6b67ae5234daae81979fbd823389649a3b0a06c68b80468a991d3007748751fa69281db1b94d6c160a1cab50943cdbb8dea5750906b3c6595bb580dedbfae57464cc7a651d4c51dbb5fa980597d17669", "signed": "9d8cb2eaf3ff3e0c2bc672e1d255c5b8e80731bff6f6aba517e13354e851080f4a8bb8121b2624244c9ee95c8a092f103703fbe66f9cba100d2e91ed774ac907b8c845cf7c5485f0622d1ddc17f7a0f6f0fd7074fe194b0e0cd42650cfc817f57f095f8cdfad1ebe0dfbc1bd7617ab4f204e9d55d81a7c8a433940ec6f17c8a8e3d56c1afb0af374bd32d54ef7132d26b89c470c2ab5be16fabb4c75193d6da59ba2fd157e9ea4e0c5c08a5202f5edc6a61701f08bb344ca6455d75d145adb244c534c8cfc623f4d4b6767594b39a7690beeec4df9746a57ffee051454c4278ea43c810ff13cd769615f9d05d4fe4a51583e80c015dcfed9af05f93d054d34ffd939bdd8f0518fa3030a964dc9d80df00f1635824072cdf29bc80259209d50f56fca9fbd6ae1514a671989cea4f6846bc19179097cca40c624d7edbf91fb5b2539ebbd502d3646711430bae423fd115848093318b7d087ef1e3b894bc3b9ea27af853fca8595d36fb7299969162f2ed6a2b55075b2c630802857176dec4cb5acf2b13a35a9949b912bb57d81eb0c8a8adf3cf64cb571bf5f3d71f987d64d74e919a00336e57d35ee4eecfc657000dd5b12995ee1b116591ce58e56de25b29c94829d1d68521b9558e4725ec77039069c0cd17b2a003359e9e1e112c7590176cebce7f001f1d136e818f4818cfd94745afaab56f1a406f97dd9e61b735266d682ad7df26dd70cde0b57fea7db2df832fa88a35f539794884ddc41218403016cb6d5221f3feb5d3aee4a9840a913072d29f8d1a9367bb0bbf545f7dae7c00a0d0c0342231ae462bb742e1498ee584ae6c83f2f1f2d0452bead982268cd3cfde78ff422e226bf7b2af1137757797fb02e5275c34809d54ca9ee2a65275e6e5cffdd20ad1fa1ee0bd8b21e04ce829e02cdb63c48bfcdd86d3a08c59789c9d78e36181defeb7227107275ed6b5ccb127cd72b374e17f5ee0b5e47b4b3e14a8ec6d86bb7507187f28db32b3f3fa1ca13446fe5253ee783645e794272799a863b4fca99e443cbaa05de3c50edf3d5cd7c10529c6c09a0c1453406ac7ecafa9b3a1f369d68f3c618f58efc359df2f3fcd2478b55a41a11f2487e7f70ec293b3eccc700ef444a33d1eae9849c5b76d29afd5a23861aef4f2a7ba3f666301fdeb5d3d8f0dc9ee2e014b24c7465dee3c0964edd49ed49edabb5ca7afb99574d001e5812a085231f241b6b08c73e80fb44bb2adf554f14fd6dce94a6f63623d9c1deb41ad101651a6b67ae5234daae81979fbd823389649a3b0a06c68b80468a991d3007748751fa69281db1b94d6c160a1cab50943cdbb8dea5750906b3c6595bb580dedbfae57464cc7a651d4c51dbb5fa980597d17669", "signature": "9d8cb2eaf3ff3e0c2bc672e1d255c5b8e80731bff6f6aba517e13354e851080f4a8bb8121b2624244c9ee95c8a092f103703fbe66f9cba100d2e91ed774ac907" }, { "secret_key": "49c298a2db3d2589c9fe16a4e571e5aa23cbaa777b86470290a3eda7a5d3e96b", "public_key": "dac523d6374c8ff15fc4ddc713715ac35cf5547fc1b1b2646b63fb41a7f21621", "message": "3582eeb0d371df385de88baad380cb0cdb60eab2baebb3c79837753d08e1cb78c0bd76dd1104454956d571ceb7e6b571a5236835d784b50ff66057b13595e7d0c8f25d08ae8b54b6123ba08151ac7db0c56a980f7f0bb39a54b437f54851979986ab1367835e5c4f3a3b3d760d3827e76c568ae7aebbb612e775bddeccd334ac6bcd3253abc29d4b7c3f10362666f6ae75080370a36cba55db3a91cb5789e4d6f9efea4df1dd7730a5e27960d53b5121948cce5af653fff1d5b4e5b0a88c718c49b31c793d88c1cc45ab8da29d05e906cd0594b5f6638c8ec3f1760ba423b5ab1d08a58770afb0f139abd349c1bf160d8902239ce24f19b4e1be095f7ed165f3931e3cbcc307e9fc5c658031228e55cbbeec0d0bcf8f695154a9eed1bef35228789bfc0d238b8372d318328c1339fea08814db8621abca3aeb82098b5aa87bb98f5e40522a0888532c1748453db2d2b3943e4abb312de319aec48cc1c94775972953fb6496b8168937623510cd48c8b247956d3168486c176ae7a4cb384eacfdabfadd9fba30a23b811bd779f3cba54338c28bb3382238ed3b8dd21beab2f5cade28c5e09b31a454808a5348122e3ae3812296f7869c3865c3c9d8fe18bd812f2e60e914975cfe1bef8dbb8097006f0d7cf3fc15eb95c27854b14312b88d528015af69fb7505b8f32703f64eb1c958f046dd251242f8bea7467fc7291d095e9696e11aa45abe7924e856351535aa0773d3d9e61cc9a2d89b5b0774d7645ee1af7eb6fcd440bc69d43edeaaf935fd2a5295ac19a97d70af9298830f81c0a509f242f473372478fa5879fb2cb8511080fc2ecd8259b8c3ce9e8b640761dc7927c32e7f5bae97a8b8ac935662e5f45d14cad6d34affc9a19414c4566f45f977396710894c5399ed4480f18e90957faa76ccb512a2d07573058a95b42fe1810249d1c85ec431a049d1aecb0f118379bdc3f1ee490bc8a054c32c3dac7659966cdb66f995ac403d5e79eb6b25b3f3f65a6ceec220d66c05f8a8a98b80799ba4f2c6dbbb4dfb5862c9a46bca013ebdfaba7494a30ce14606afc0b0f993143fedee7896d9a6bb81499166ed02e94186aaf32187aeb6e282501bca43b57b7efa0939c934bc8fbbd26c44b618335a35c692ff996a5b95d327df9b2a6621b3b0f190db1f36d911d1a663a4ebf9a2854bb4f4061095b69812c82c2ffe3f92e9b44d2ea63169881cae8453d6eef7cf69c25a28b3f8ddc70148ef26721a3c1f2e62d9d10cea42fca3facd74673a4e7f33507364aa286c0f38d7", "signed": "2a439c73c98117fb2952e2b161f7f3b99e7d39bc697f794075db7b634d29f1ff5724f677f8312ad515b097cca9dfc30e79ee8a7c9dd728bdd45df859c7bde30a3582eeb0d371df385de88baad380cb0cdb60eab2baebb3c79837753d08e1cb78c0bd76dd1104454956d571ceb7e6b571a5236835d784b50ff66057b13595e7d0c8f25d08ae8b54b6123ba08151ac7db0c56a980f7f0bb39a54b437f54851979986ab1367835e5c4f3a3b3d760d3827e76c568ae7aebbb612e775bddeccd334ac6bcd3253abc29d4b7c3f10362666f6ae75080370a36cba55db3a91cb5789e4d6f9efea4df1dd7730a5e27960d53b5121948cce5af653fff1d5b4e5b0a88c718c49b31c793d88c1cc45ab8da29d05e906cd0594b5f6638c8ec3f1760ba423b5ab1d08a58770afb0f139abd349c1bf160d8902239ce24f19b4e1be095f7ed165f3931e3cbcc307e9fc5c658031228e55cbbeec0d0bcf8f695154a9eed1bef35228789bfc0d238b8372d318328c1339fea08814db8621abca3aeb82098b5aa87bb98f5e40522a0888532c1748453db2d2b3943e4abb312de319aec48cc1c94775972953fb6496b8168937623510cd48c8b247956d3168486c176ae7a4cb384eacfdabfadd9fba30a23b811bd779f3cba54338c28bb3382238ed3b8dd21beab2f5cade28c5e09b31a454808a5348122e3ae3812296f7869c3865c3c9d8fe18bd812f2e60e914975cfe1bef8dbb8097006f0d7cf3fc15eb95c27854b14312b88d528015af69fb7505b8f32703f64eb1c958f046dd251242f8bea7467fc7291d095e9696e11aa45abe7924e856351535aa0773d3d9e61cc9a2d89b5b0774d7645ee1af7eb6fcd440bc69d43edeaaf935fd2a5295ac19a97d70af9298830f81c0a509f242f473372478fa5879fb2cb8511080fc2ecd8259b8c3ce9e8b640761dc7927c32e7f5bae97a8b8ac935662e5f45d14cad6d34affc9a19414c4566f45f977396710894c5399ed4480f18e90957faa76ccb512a2d07573058a95b42fe1810249d1c85ec431a049d1aecb0f118379bdc3f1ee490bc8a054c32c3dac7659966cdb66f995ac403d5e79eb6b25b3f3f65a6ceec220d66c05f8a8a98b80799ba4f2c6dbbb4dfb5862c9a46bca013ebdfaba7494a30ce14606afc0b0f993143fedee7896d9a6bb81499166ed02e94186aaf32187aeb6e282501bca43b57b7efa0939c934bc8fbbd26c44b618335a35c692ff996a5b95d327df9b2a6621b3b0f190db1f36d911d1a663a4ebf9a2854bb4f4061095b69812c82c2ffe3f92e9b44d2ea63169881cae8453d6eef7cf69c25a28b3f8ddc70148ef26721a3c1f2e62d9d10cea42fca3facd74673a4e7f33507364aa286c0f38d7", "signature": "2a439c73c98117fb2952e2b161f7f3b99e7d39bc697f794075db7b634d29f1ff5724f677f8312ad515b097cca9dfc30e79ee8a7c9dd728bdd45df859c7bde30a" }, { "secret_key": "823f0c29fbfdd3d1828f3055e9ec01ffd1b5a375118ddd7e4e0c43719f573ff7", "public_key": "73125fc83abb8b7c658559fc127393231d03ca5846e0c88118d13d55ca44789d", "message": "802c39ce7f2a50bd81622add0df4e0fe03ec3d2d305a45a6165271ed79add243b9a00e52183192feb24c4fdbd22c807ae100efcf165b9c996194e00fa817765ea94a03070e486686b445fcb263ccfe1f5862f3b84b10f390080bfcae447ae0069742b8618fa9575f7e637ad54e834caf0394d745032ce1e255c0273250f1504b37a0add94aa245c7de52c80e05d6e0a96a14410543826a49e9b945626d4e89f55027163d4bd6d0e9bd1a2477f67d3d5668a42e94d8b61193d821e0d1b230fcadc53613b75b02cfb8158456077ebdf5a5f00c3b5b186370cafec4a21c69dce1f01efef23c37ab90f858238aefbe212b556d2f073406559f1a51d84efffdce07b00d01bbf33771cc12c960ac89365a9c82c52343f7603381b89023c1a6e702a5b1e4bd191ea6970b5ea451ea05b59bf83e55f29a1f803212bb2e58f0616333d9114708529e8b6c6081deeb7c299a5a2a53ccd24ed58ffbfe503d80614adb05ca11cf29ded00904ea1239f82ba40c793ebc339775f8b0fe3901f5482e310c793c6e2cf01dc157727af238f49c9862804b047551fd886f4a4899e22a6a65701117a3858055bbfe966e370e733e17efada2859fd8ffa9e01fce5606a255367678f4bd4e21e5da0fef30757f34e389f76b7d57c4e410a002e900e48fb218c8f2778f148fee56965f5b473e25256c23a7af198342cf3ef02b84df2cd5800a461c1b07bda2f42628a68ad29dbb82a470967d7302c993b234136e5bf255e6248b102c2bffb20172371f1ca3e10b0810e8649503546d9a731cf19b083357d4cfecc89bedb53506fe199b670391a620069a3081f253b4d790880aa23b53e97c75dc0c360540e5b0a3efb1accffd137414ff8423d54646fc56ba5f53bd84c7267c2f7ee3e37607544154365f9f85081dd7d2ee75d302275c799ef2427ca6496355dcda1d44e0d977bf68db3006500ae3f400d6a8c7cf47057d4fc87eeecb02116b73eed6ce1fccef6e8fb8aea363b2f6f5322a5f0753f45899537646d58651be9037bf91423c2986f5cc2bcbce4faec903498b40fc2deab6603d6eea585d2720d21bb2722bc05b35aed2bcc0e804fe9d239fafda7ddafe1d7860abb0fb28f4bf2b1fbb62a786e455be024b193b7830be0d558f02c9f3ae31dc107ee9421dc5f0b0f89402b71a4581401536bc47308506d96939a206362744e27dde944f4096a12b5f63dab64d041484d3fd91a62c2f0ef9ae787422eb27fed0802e25f9bc775c4915a837fe3eb7b9d5843e4d8210c6b494b61281637a6be32052", "signed": "fa747b6fe3381ad6bc82a95643c1f4a20b76ba73bff00e635d64202d8b0df03dbc56b0138b3a6d4198ffaf58ccd3d388ed25ebcf770443e41e9d2147950a300b802c39ce7f2a50bd81622add0df4e0fe03ec3d2d305a45a6165271ed79add243b9a00e52183192feb24c4fdbd22c807ae100efcf165b9c996194e00fa817765ea94a03070e486686b445fcb263ccfe1f5862f3b84b10f390080bfcae447ae0069742b8618fa9575f7e637ad54e834caf0394d745032ce1e255c0273250f1504b37a0add94aa245c7de52c80e05d6e0a96a14410543826a49e9b945626d4e89f55027163d4bd6d0e9bd1a2477f67d3d5668a42e94d8b61193d821e0d1b230fcadc53613b75b02cfb8158456077ebdf5a5f00c3b5b186370cafec4a21c69dce1f01efef23c37ab90f858238aefbe212b556d2f073406559f1a51d84efffdce07b00d01bbf33771cc12c960ac89365a9c82c52343f7603381b89023c1a6e702a5b1e4bd191ea6970b5ea451ea05b59bf83e55f29a1f803212bb2e58f0616333d9114708529e8b6c6081deeb7c299a5a2a53ccd24ed58ffbfe503d80614adb05ca11cf29ded00904ea1239f82ba40c793ebc339775f8b0fe3901f5482e310c793c6e2cf01dc157727af238f49c9862804b047551fd886f4a4899e22a6a65701117a3858055bbfe966e370e733e17efada2859fd8ffa9e01fce5606a255367678f4bd4e21e5da0fef30757f34e389f76b7d57c4e410a002e900e48fb218c8f2778f148fee56965f5b473e25256c23a7af198342cf3ef02b84df2cd5800a461c1b07bda2f42628a68ad29dbb82a470967d7302c993b234136e5bf255e6248b102c2bffb20172371f1ca3e10b0810e8649503546d9a731cf19b083357d4cfecc89bedb53506fe199b670391a620069a3081f253b4d790880aa23b53e97c75dc0c360540e5b0a3efb1accffd137414ff8423d54646fc56ba5f53bd84c7267c2f7ee3e37607544154365f9f85081dd7d2ee75d302275c799ef2427ca6496355dcda1d44e0d977bf68db3006500ae3f400d6a8c7cf47057d4fc87eeecb02116b73eed6ce1fccef6e8fb8aea363b2f6f5322a5f0753f45899537646d58651be9037bf91423c2986f5cc2bcbce4faec903498b40fc2deab6603d6eea585d2720d21bb2722bc05b35aed2bcc0e804fe9d239fafda7ddafe1d7860abb0fb28f4bf2b1fbb62a786e455be024b193b7830be0d558f02c9f3ae31dc107ee9421dc5f0b0f89402b71a4581401536bc47308506d96939a206362744e27dde944f4096a12b5f63dab64d041484d3fd91a62c2f0ef9ae787422eb27fed0802e25f9bc775c4915a837fe3eb7b9d5843e4d8210c6b494b61281637a6be32052", "signature": "fa747b6fe3381ad6bc82a95643c1f4a20b76ba73bff00e635d64202d8b0df03dbc56b0138b3a6d4198ffaf58ccd3d388ed25ebcf770443e41e9d2147950a300b" }, { "secret_key": "65676633374214c4ac4b7bcea9f1cc84b1b7e79411e310525ace385f4566c1d5", "public_key": "0e6ec5801d8bd6b1eb421421a1408f134cf712338e0ffc24cdccdc4f7fa31dbe", "message": "9d622c206787694093c6f29f93619f21bb64c039416d20dc708a084a9d2e490cf5658e13d62cb0d21eab00e42d851bc6ec75daf405d2373246eea415e866291babf76497680aaf04425a42552b107d58cd18561c8c9483f740744cbfa6054c1b126f5a76659ac19dddad4ab5a09155d8c050b5354e06a4dd3ee3a6f9c91e8b4c7af2749664e7abe97061589e153c58e27cf299a25f2b530c060731ec0f4366bd1debeb4d4e912e76e508534d433ec48f96b62e150de93963a1b3e6c8091b495a96518ce3d3b9a8dbdc2a13fdd077f2231de8d76f56d9ab1c2f9efabce4638364f8fb2a2c683ca819b703ab453b11d37a69fa4bcb8023980834f7b902ad1819fc029212fdea0abf11dec88c55d68ef87a26dbb15dc3d3dfbcdddd5ed71be86f32c76ee2221d9243683df9516564b26bab5c845d4dfe0adcc7cb9fe1ee2c051af5908ce0cc3a90904dbc0d3680ed4992f46ce25c2ee851c414f0187d893e5c3b0189a7bb6893d683f5e3394cc046299a16a1c1b5695933a89bb13030855b81b3c74685f719de0160575a0ff0a91fd94347b8bcbe125d1d3f9ce772a8126e00f563b3189656d5522c187ab831a7ade7ac06fdcac7f1d45882e51f9bf5b44a2daba4a53dbb31970b4a0f1272fe14087e0c3c7e4542312fe74d767f21e7ea487d5284284f46f20f32c5b16e1e0ac8d796ab2f80b344e7a8d84d5de823a50897752dc549a48fc10bcd436a7a93e97cd05d7830138f323879680c343c16467d264d749bf45e40f39fbc3a00c43b00693b0156768ff2e3f8ad9eb6405022f5cada6694e8a33cdc59c6673c44117244eb03fd7fd675930c294edd2940f5f180953d910c55485b2057ae0c9302f4a8e831a5530e3cbbf6f472224083a952a8390ab00dc0f69dfd880eea2d739d218d6a66f237f10d4401aa758ff8120c0ae2766127849024f5a4cc574a5b02b935966812cd1fb6d79d0c4f59ff80f035a0b109cccb22fb08535b874149edf2a0970c14888427d07d1eafa684a6d3454e49b225184c6b993ec8ddb8b5a35ee45f87f69266d49096a317d86ade27f4529fe72364d0b958007299d9de87d6ff9fb04d573aea46bac8eb764752eb465caaaba689a6460c110730bdd08b1689de7b05de59af9fe244ac363e95c98b669359af9031a3a93ba631abf1f61d20ef7fc6883b4840fc926712e13d874b722f6a79b16070c0311325e9a70fcd86916cfa1da7f9d0563a22fe9bfe854b0c186c8663b061b65bc071e839938d8fdd7cf8f6952a6467fad8e58490ed2b26813301", "signed": "e0b867c9dbda35323433c046e0830c251b4346c5395972286b3a72310ed4526e545dc09d3918f2eb9920bc9b241e9050d848d3830288651591f936d3bae453019d622c206787694093c6f29f93619f21bb64c039416d20dc708a084a9d2e490cf5658e13d62cb0d21eab00e42d851bc6ec75daf405d2373246eea415e866291babf76497680aaf04425a42552b107d58cd18561c8c9483f740744cbfa6054c1b126f5a76659ac19dddad4ab5a09155d8c050b5354e06a4dd3ee3a6f9c91e8b4c7af2749664e7abe97061589e153c58e27cf299a25f2b530c060731ec0f4366bd1debeb4d4e912e76e508534d433ec48f96b62e150de93963a1b3e6c8091b495a96518ce3d3b9a8dbdc2a13fdd077f2231de8d76f56d9ab1c2f9efabce4638364f8fb2a2c683ca819b703ab453b11d37a69fa4bcb8023980834f7b902ad1819fc029212fdea0abf11dec88c55d68ef87a26dbb15dc3d3dfbcdddd5ed71be86f32c76ee2221d9243683df9516564b26bab5c845d4dfe0adcc7cb9fe1ee2c051af5908ce0cc3a90904dbc0d3680ed4992f46ce25c2ee851c414f0187d893e5c3b0189a7bb6893d683f5e3394cc046299a16a1c1b5695933a89bb13030855b81b3c74685f719de0160575a0ff0a91fd94347b8bcbe125d1d3f9ce772a8126e00f563b3189656d5522c187ab831a7ade7ac06fdcac7f1d45882e51f9bf5b44a2daba4a53dbb31970b4a0f1272fe14087e0c3c7e4542312fe74d767f21e7ea487d5284284f46f20f32c5b16e1e0ac8d796ab2f80b344e7a8d84d5de823a50897752dc549a48fc10bcd436a7a93e97cd05d7830138f323879680c343c16467d264d749bf45e40f39fbc3a00c43b00693b0156768ff2e3f8ad9eb6405022f5cada6694e8a33cdc59c6673c44117244eb03fd7fd675930c294edd2940f5f180953d910c55485b2057ae0c9302f4a8e831a5530e3cbbf6f472224083a952a8390ab00dc0f69dfd880eea2d739d218d6a66f237f10d4401aa758ff8120c0ae2766127849024f5a4cc574a5b02b935966812cd1fb6d79d0c4f59ff80f035a0b109cccb22fb08535b874149edf2a0970c14888427d07d1eafa684a6d3454e49b225184c6b993ec8ddb8b5a35ee45f87f69266d49096a317d86ade27f4529fe72364d0b958007299d9de87d6ff9fb04d573aea46bac8eb764752eb465caaaba689a6460c110730bdd08b1689de7b05de59af9fe244ac363e95c98b669359af9031a3a93ba631abf1f61d20ef7fc6883b4840fc926712e13d874b722f6a79b16070c0311325e9a70fcd86916cfa1da7f9d0563a22fe9bfe854b0c186c8663b061b65bc071e839938d8fdd7cf8f6952a6467fad8e58490ed2b26813301", "signature": "e0b867c9dbda35323433c046e0830c251b4346c5395972286b3a72310ed4526e545dc09d3918f2eb9920bc9b241e9050d848d3830288651591f936d3bae45301" }, { "secret_key": "d2ededcd853206cbf59bd74a25a303fa2d6c3936bb48eb42f6d900cbe80772be", "public_key": "2244111e2e769eab81871e06c580178c235c7bf4a52d2ecce11887a9b46c45c8", "message": "8070bc0db089a5925446019b7e403c74ec78903e4bd54bc1d08a54a6f0ed75a85b763ff54dc33a2600ccb457fdbaeae548477f6d6947ae26deb71eacd1d2d62282a083843be4e5931d91c93b6282c58807ce8f0d880b1438dad8fdcba8612df73b9faff3a9f7db3005250536aabd98ae027a895e10b5cb7b69875c0f3993af245192f4393e9c4d3405746e311d3a91447fcdbd7306b6020c933bbab9e39d13491625035c9c636efa1739c3588710a879d9e3ce1764616f1082e8dff57559c3f5a5d76dd301124fa489fb949e9e039dd4621bda60f0b86b311e78ed0ab3b528965044b23d78ee2f81061f8edbd6929933d18c0207dec4b5b6b2fa4aca2747cf5b110df00b0c9827bdb3d9db2c7b0328d40d99e1f6b228e40dadae78aeda0289b6a23d4eb5837088e5d88413632ccc22e21a73768c673201e9a8d8dc6eb6f7397fedbd398d26f9692ca72f6d6cf056aaac50ac2f3b266dbe5e7be7a024774578ead585245daaa73e0aaf833c070ba4b2044ccb5e5cd16f9c0ad92ea8448055dd828c79935aa6c0741f9e2b810324fdc6e61e842f94572268bf7d5adfa7ab35b07fb19e7815a8aa5d81130130ac5cda8a4751ee76038c0a6bc2faba4c497e62b9f1f194b8a599b07701814b6dfb7d84bcdd5b7b5bc2249f1d3845eff9ef8cc7328535d70d53c7aa0c7305901de7c4ed2fe1838265d4a417b876adbd88eb933f27c9aa48c8c7e34e48147ccffb2fb61a348fea13ef67cdf2e039e33fd89e2c1ad2a4254e3bf748452aa83efeca46e780ede1d13ff4cc5e7d01ed45eb8c74818d4860af4759a83e148896ab68734395760e00146b793c3e72898aa0b3c5e0c1d3fdf12158d2e8ff1123a3a0c64cf6374a7f44f11a575e48a379181b30a4865cfd022aa983275635ce4f2cc40bfe066067ec4fe241fa047b55270a1ad0776c5f96861014cbf40a0432c559f22d79342b79f8e7042dccfb1cf50f83085f8063fb1887ed2dfc9db7efc96daa0ff2bc4f52335b02112d16392e134c0223de458fc072cc22bf9e7eabc06208180a57e7ce4805ee4e0fc015840998fd568644a0386b3d8e7dda52abf64f7dd00868fc84f036ca8a78e9ba8171ca90267c74e6159acac7af5bf23759abc53d82e793db87fdade1363354ffdcb0bd4cc9213f5c845445fc649b2a1f329f9d41d8a031ab46b472160f03434b4b6bc5a401524d6179ad66f9e221c9067fc87fe4a77e21e8023b6169ebf1090cd556a9be50b9187fe4607c5925e60b414f6a5cbf8afa15ed0eb34b67b4c9c5d54adbe640", "signed": "be3c2b567fe8c208c98e7197117eb01b3c197bdfc858562dc5cd90f8e2c0357042303995baba2f40b7345c56db0b4625580aa8dcc48df6019d23a838ea7172028070bc0db089a5925446019b7e403c74ec78903e4bd54bc1d08a54a6f0ed75a85b763ff54dc33a2600ccb457fdbaeae548477f6d6947ae26deb71eacd1d2d62282a083843be4e5931d91c93b6282c58807ce8f0d880b1438dad8fdcba8612df73b9faff3a9f7db3005250536aabd98ae027a895e10b5cb7b69875c0f3993af245192f4393e9c4d3405746e311d3a91447fcdbd7306b6020c933bbab9e39d13491625035c9c636efa1739c3588710a879d9e3ce1764616f1082e8dff57559c3f5a5d76dd301124fa489fb949e9e039dd4621bda60f0b86b311e78ed0ab3b528965044b23d78ee2f81061f8edbd6929933d18c0207dec4b5b6b2fa4aca2747cf5b110df00b0c9827bdb3d9db2c7b0328d40d99e1f6b228e40dadae78aeda0289b6a23d4eb5837088e5d88413632ccc22e21a73768c673201e9a8d8dc6eb6f7397fedbd398d26f9692ca72f6d6cf056aaac50ac2f3b266dbe5e7be7a024774578ead585245daaa73e0aaf833c070ba4b2044ccb5e5cd16f9c0ad92ea8448055dd828c79935aa6c0741f9e2b810324fdc6e61e842f94572268bf7d5adfa7ab35b07fb19e7815a8aa5d81130130ac5cda8a4751ee76038c0a6bc2faba4c497e62b9f1f194b8a599b07701814b6dfb7d84bcdd5b7b5bc2249f1d3845eff9ef8cc7328535d70d53c7aa0c7305901de7c4ed2fe1838265d4a417b876adbd88eb933f27c9aa48c8c7e34e48147ccffb2fb61a348fea13ef67cdf2e039e33fd89e2c1ad2a4254e3bf748452aa83efeca46e780ede1d13ff4cc5e7d01ed45eb8c74818d4860af4759a83e148896ab68734395760e00146b793c3e72898aa0b3c5e0c1d3fdf12158d2e8ff1123a3a0c64cf6374a7f44f11a575e48a379181b30a4865cfd022aa983275635ce4f2cc40bfe066067ec4fe241fa047b55270a1ad0776c5f96861014cbf40a0432c559f22d79342b79f8e7042dccfb1cf50f83085f8063fb1887ed2dfc9db7efc96daa0ff2bc4f52335b02112d16392e134c0223de458fc072cc22bf9e7eabc06208180a57e7ce4805ee4e0fc015840998fd568644a0386b3d8e7dda52abf64f7dd00868fc84f036ca8a78e9ba8171ca90267c74e6159acac7af5bf23759abc53d82e793db87fdade1363354ffdcb0bd4cc9213f5c845445fc649b2a1f329f9d41d8a031ab46b472160f03434b4b6bc5a401524d6179ad66f9e221c9067fc87fe4a77e21e8023b6169ebf1090cd556a9be50b9187fe4607c5925e60b414f6a5cbf8afa15ed0eb34b67b4c9c5d54adbe640", "signature": "be3c2b567fe8c208c98e7197117eb01b3c197bdfc858562dc5cd90f8e2c0357042303995baba2f40b7345c56db0b4625580aa8dcc48df6019d23a838ea717202" }, { "secret_key": "b569f7c1aadf56ed1b5fa1b6fad648d0dc544ff8fcd173780de41a7d4de60cb6", "public_key": "9effa4aed9c658e4346071434468a0b8a04ecf7841699d63e8887ce205570cea", "message": "7c5aa4dc8078aa77e8b3b7fee61084cfad764762f1ef26d8deb7f2f3b186dfc772487550197845fba2f4c23c835b9b58dd0b635c649135137f248f5ef713564de3c966efa5f6db6bea9e30970749f8e872d8d7ae4535b75e176ea0489b915f3471d827eb5b444586488cfc3fa6a45082dacb826495e50a3b5dc6bb930a331f30c385bc3b24ce70b89596db6bfb687d99a581987ca876ea0e757696b3fc03779a658130c410b344edacc4277d44845499d678e1414f15f36e166335189569cef3567ac2e3ab821c91c93274f5c28a5d1f7c1bf5099b10f84ecb13a4e4538f6649bf74f7394b703ef53649d81516cb1db521416065cf9f276ab80c9308897a27dfe37e5e142f1819b8d348df50a046a12888e3b7f2dcc70f5218d15ebb9aa7291a1a92ac445c51d3a53dd691efffcf5a01e876a72aa481eb4f121a072397d8cc93bbc2c9a6c28cc89b11ffc0e910d82d9d6298a367a0e1e3e8c865e4326a319b22666e529f1998f1b3c8efb5fc21cce97040fb6247daa0000ac5554d89e7b27159dd0b1800b760b79c91ef6e970b1e6c5ff42442b1b3ae4d3c439e08ec2f6b94177387ca5c01df6f07f8e34d25edbd49d8b74e31a5e65dec1f8760fa22c00e6fb1cd555be68b0ab43599f0b9f4a54a7ccb062683895d5ef66d24dfb1678cb0d0e8c801d8e5ffe79b9139fc96d118eb39b9c8d4404489325d45b4a3202beadca66f831c68efb815941581930ead29fd5f211b90e7a39f0d4ff48c62a545e28ac2ce29bedc356d92fc00347176d77623e0e1809eff3fe62b75a7d9deb727d86172d14edbf2789a57143c69925c917d433b4683b0693b3cd9e7e377996410727f5e6fb8f5ccd1860a20294ecf33faf97a1e0f85b761447d4761b96e4df1b312bd414cabcf498497b0ead67cd1e5901bbf3a16a8891ccced8a907df88726952d4ab370a6b7df2942cf13615a5bc12b4e106dc3013c68b8fb906399df15f1aa90d56aa974b1d2b28c1a8453b9bf0792a51c97ce8a12afc9341bb4c0c37b12dcb12c639449775d9ac5c2ec49673da5aaf7493ed5f1f2116eaef72bb7fb1e093ede2c26317f4f4b6ad585346205df91a6e96bc66d3064bce952398ffce88071ed9ff2750c65c0c304125ac2cadc4fef71a818732496a84ca574d482d5a3bba20e16dd2fa24d3270f6c60992f7f63e88f52eff6222998eb4416727384375f59f00e47512ee464c3184aceaff3ccfb06bd15c183c5e485926288b997bfaaaecf6ecbbf7d2abf4906df76b1277c5f5a87e6817b1c636e91efd7eccf64f", "signed": "2e32ba0556bde974d7a19b3b9a1e92f183924c4b74c5d751b5ab3d007967016ec03afe91d742fb22b63e5e55b2fcb6c61a46e9dce7fe9fa30bbf66aef4b85f097c5aa4dc8078aa77e8b3b7fee61084cfad764762f1ef26d8deb7f2f3b186dfc772487550197845fba2f4c23c835b9b58dd0b635c649135137f248f5ef713564de3c966efa5f6db6bea9e30970749f8e872d8d7ae4535b75e176ea0489b915f3471d827eb5b444586488cfc3fa6a45082dacb826495e50a3b5dc6bb930a331f30c385bc3b24ce70b89596db6bfb687d99a581987ca876ea0e757696b3fc03779a658130c410b344edacc4277d44845499d678e1414f15f36e166335189569cef3567ac2e3ab821c91c93274f5c28a5d1f7c1bf5099b10f84ecb13a4e4538f6649bf74f7394b703ef53649d81516cb1db521416065cf9f276ab80c9308897a27dfe37e5e142f1819b8d348df50a046a12888e3b7f2dcc70f5218d15ebb9aa7291a1a92ac445c51d3a53dd691efffcf5a01e876a72aa481eb4f121a072397d8cc93bbc2c9a6c28cc89b11ffc0e910d82d9d6298a367a0e1e3e8c865e4326a319b22666e529f1998f1b3c8efb5fc21cce97040fb6247daa0000ac5554d89e7b27159dd0b1800b760b79c91ef6e970b1e6c5ff42442b1b3ae4d3c439e08ec2f6b94177387ca5c01df6f07f8e34d25edbd49d8b74e31a5e65dec1f8760fa22c00e6fb1cd555be68b0ab43599f0b9f4a54a7ccb062683895d5ef66d24dfb1678cb0d0e8c801d8e5ffe79b9139fc96d118eb39b9c8d4404489325d45b4a3202beadca66f831c68efb815941581930ead29fd5f211b90e7a39f0d4ff48c62a545e28ac2ce29bedc356d92fc00347176d77623e0e1809eff3fe62b75a7d9deb727d86172d14edbf2789a57143c69925c917d433b4683b0693b3cd9e7e377996410727f5e6fb8f5ccd1860a20294ecf33faf97a1e0f85b761447d4761b96e4df1b312bd414cabcf498497b0ead67cd1e5901bbf3a16a8891ccced8a907df88726952d4ab370a6b7df2942cf13615a5bc12b4e106dc3013c68b8fb906399df15f1aa90d56aa974b1d2b28c1a8453b9bf0792a51c97ce8a12afc9341bb4c0c37b12dcb12c639449775d9ac5c2ec49673da5aaf7493ed5f1f2116eaef72bb7fb1e093ede2c26317f4f4b6ad585346205df91a6e96bc66d3064bce952398ffce88071ed9ff2750c65c0c304125ac2cadc4fef71a818732496a84ca574d482d5a3bba20e16dd2fa24d3270f6c60992f7f63e88f52eff6222998eb4416727384375f59f00e47512ee464c3184aceaff3ccfb06bd15c183c5e485926288b997bfaaaecf6ecbbf7d2abf4906df76b1277c5f5a87e6817b1c636e91efd7eccf64f", "signature": "2e32ba0556bde974d7a19b3b9a1e92f183924c4b74c5d751b5ab3d007967016ec03afe91d742fb22b63e5e55b2fcb6c61a46e9dce7fe9fa30bbf66aef4b85f09" }, { "secret_key": "323465d0313d1001a261abfd44fe65c38c9a00ca0f20335d6553de492699fc46", "public_key": "e22f16bd4cc7e94c46ba31961af8c583f9d2718c68f73d85069f608e15ba8766", "message": "bb1082e1cfdcd29bfca2464d5ce446b5ba654ba58c22538da926b8303cabfd284a7bd5994a786fa66aedf0e15f20c382cdacf3d14557ff7a8267fa04672cacab767008650aa9b4a7c9071c4799f1ffa45ca4d586e02047444c14231943467a3abaefa53959da226eb0c15392019760159697748293c025568783588a3910e78e5ea427c4407a8901061b8b992b82a2df58c04a1b2c5fad11c6b379856c2e0fef8a950de7e0fc22310309e08b132b0cce4fc1ecbf94574a388d4ae36675d3299a951554ebf180eb381e1b5df977d938433891bc478d7681850b9dc9c5c769d405f5d8839fc97361d6cb306c203026cf2e2b3d39849e1f4b1225eb25ef8acd40b006f20c644db650c75d38c0fcdd48f598c7b4a60106e69e19cd712589cedccf50864ea5f9e95e01f1dd85c7514f2c94b28359de4132b88c3ee1d10a80a9fadfb690e3d88641b3168f0b896af8990adbf0e4f8e9d3f9d4cd314e12c3bce0cc8738e0cfc1905be5efa071f710b32f8e5898c60eb1bb8feeb74000560f41cb2ebc32b2600b6980a2a4064dfaa3797ec44cfb72d379f8097379cad67ecdc0c32414fa41c72b1b9e4edf5518cb39fe9092b439af3a4ebd5afe79bedc0ea8bf17479a2821f5e9bd91d7f4aa5e384699523719b6957f82367cd85fea9ded6236a207c94cb373e3393cb4fe11f90a1b8779e4ab4c3466136bf21e2aab78f7d2726db6414fa5c4a3f7313ad2116a6d7ce40aaa1001c2704d5b05ae54c7cc6f567217f1a47bfd0ee738eaea5eadb5371075be076c8750aecefc417ea7bfdaac3cc38bf16cc26df7600e3c7e8e431f2676fc2a8c43a6a14368ba62bb32439a06beac38a047b3745e26f407ad823d6ad1c0b6a44341e15fc9b331214ffc89698211b05133d6d3433b5d59f7ab4d109e54e4c5d6f32fcf7230fa4e2528c861bb21ccc9e310e9497e077ea675510da712b1a5df575c5d1bf7362d071180039aecfaa5c8573c24c0f4ebe81c2f889aed3de5a000be12fe3d0af2dc2cd4240e314a176c553efd5cba798d9ff1e3d4bd9e90bb8113e3849d735afa4af6945cc57d4c378db84f206ef7eab11c637a7f7260f122a97dff6747e9b4c174ed0d64f9efd7fcccf981519ec580a8182547d17968c40151fdf6d54bc57a9115f040fab5c100deb039122b7d2bfd98b6adf38f42b296ea3b378a904259b75d60703b4840b3f5da09620a54776280e9ca9e8cd924aed2b5dd2b49834e581caed5271cd78ce08e4bba49b59cd77c1b6276649148ab7247f97fc0131635de474d3c23493ca98d", "signed": "da3aadb34360b2da0c26542ea71defa8a0bf7fbdae3ee9e11c84084ad05cce7ba7d94de25d8563982616bcdb5bb6395fac4a7e84bc77e21ed36df75dec990b06bb1082e1cfdcd29bfca2464d5ce446b5ba654ba58c22538da926b8303cabfd284a7bd5994a786fa66aedf0e15f20c382cdacf3d14557ff7a8267fa04672cacab767008650aa9b4a7c9071c4799f1ffa45ca4d586e02047444c14231943467a3abaefa53959da226eb0c15392019760159697748293c025568783588a3910e78e5ea427c4407a8901061b8b992b82a2df58c04a1b2c5fad11c6b379856c2e0fef8a950de7e0fc22310309e08b132b0cce4fc1ecbf94574a388d4ae36675d3299a951554ebf180eb381e1b5df977d938433891bc478d7681850b9dc9c5c769d405f5d8839fc97361d6cb306c203026cf2e2b3d39849e1f4b1225eb25ef8acd40b006f20c644db650c75d38c0fcdd48f598c7b4a60106e69e19cd712589cedccf50864ea5f9e95e01f1dd85c7514f2c94b28359de4132b88c3ee1d10a80a9fadfb690e3d88641b3168f0b896af8990adbf0e4f8e9d3f9d4cd314e12c3bce0cc8738e0cfc1905be5efa071f710b32f8e5898c60eb1bb8feeb74000560f41cb2ebc32b2600b6980a2a4064dfaa3797ec44cfb72d379f8097379cad67ecdc0c32414fa41c72b1b9e4edf5518cb39fe9092b439af3a4ebd5afe79bedc0ea8bf17479a2821f5e9bd91d7f4aa5e384699523719b6957f82367cd85fea9ded6236a207c94cb373e3393cb4fe11f90a1b8779e4ab4c3466136bf21e2aab78f7d2726db6414fa5c4a3f7313ad2116a6d7ce40aaa1001c2704d5b05ae54c7cc6f567217f1a47bfd0ee738eaea5eadb5371075be076c8750aecefc417ea7bfdaac3cc38bf16cc26df7600e3c7e8e431f2676fc2a8c43a6a14368ba62bb32439a06beac38a047b3745e26f407ad823d6ad1c0b6a44341e15fc9b331214ffc89698211b05133d6d3433b5d59f7ab4d109e54e4c5d6f32fcf7230fa4e2528c861bb21ccc9e310e9497e077ea675510da712b1a5df575c5d1bf7362d071180039aecfaa5c8573c24c0f4ebe81c2f889aed3de5a000be12fe3d0af2dc2cd4240e314a176c553efd5cba798d9ff1e3d4bd9e90bb8113e3849d735afa4af6945cc57d4c378db84f206ef7eab11c637a7f7260f122a97dff6747e9b4c174ed0d64f9efd7fcccf981519ec580a8182547d17968c40151fdf6d54bc57a9115f040fab5c100deb039122b7d2bfd98b6adf38f42b296ea3b378a904259b75d60703b4840b3f5da09620a54776280e9ca9e8cd924aed2b5dd2b49834e581caed5271cd78ce08e4bba49b59cd77c1b6276649148ab7247f97fc0131635de474d3c23493ca98d", "signature": "da3aadb34360b2da0c26542ea71defa8a0bf7fbdae3ee9e11c84084ad05cce7ba7d94de25d8563982616bcdb5bb6395fac4a7e84bc77e21ed36df75dec990b06" }, { "secret_key": "60ffdbae003fa2794fcabbf8f5b41644fe3a7f44ed6c834193da07a9dc5e2665", "public_key": "35b5eb31ab556492578b3dbd6cf1687d1fdb216a725818079663482f221ce421", "message": "3f8ff20bb4f00834c80f2ee6893d6f73bf7ace2729601bb26a0fb272a4d0eea1fae1d306ac2c5f32add60135851da27e4f12e64ea5e9e9960b1383b04ce05a98b0414dad971ea98944871d415cc2c46da403976d9f21938958d4ea8c7903b14f2a4485fd69afb24abe102d8fec266fb468b411eb20a339677d88eb31c997b4dc885613f0be7c70daf856a3df92da9602fba2e6749d2f426beef68662d5b0c2fd31321b22b5ec597da5d7e6a288ebd9443c5f39eb87dcf4a5ad9d56c6baf6080996a77936bd87dc3cb42ed4c4d42688a9e193829b761ff320e2a66cc67648e70eea3a1f2f9b9d5b4202fb5a39e9adc609086a9be2a8323ac66931bdf6c504d3336211e46fdefc481fbf17f613dab1fc5c097c92db0609906d78b25a455a3045718efd3e3b14e252b1ae59c7c3893e31913b2c264c0ffc3b606ca1b01dc47ee828a08e46af604e590def44d27aab93a403251fca0772e9df0fab7af0cbc5181efda4da913d8eb6452f6cecbda204bc72d7c990f60ce0dd83c634e912236091b0a6673a7c89ea59308d55bd7e63a8526774cbdd7a1339fac2124c9022abd6fece7f2daedfd87fa683dc0e3ef40806a0ab198769d3a99fe81a99b68600319087afa4ea79d7ee45da9cd40809f4ee8f4e25a0177521ee9dba8b56212e88719bb7367336f4a7bc7122b41a7dfaa2672f92f23403a10c4fb25388c6b20081093d49f3be8a9e1c634ef7ba96b6d523dd6ff613c0a23b60457026cd485ba8db61d80a0dc659d9af42a38cae777fec68e39c52986ff9fc20789c10585107c04047b66ba14e93fb904ea90df7ac9f0154c96f3236acf6dc8b44f554c0cd513193e5dfd87e085ad4b38aa4c5e36b2427722088816ecd2bc3a3dda01e4fb3ff5eec7a6417322ba6a27773d24495a839194a4a582fe5abdb8b5d533a24262589241fc81fdf5e79fd26776428f8e1ce9e926cf272716e7583abfc67a94aae0816c1000a196170bbff1f45e5ed9e267ace1e4d915dce7216c5f404def6fe2bd8b28b2eccf3e2aea0c0d6626390274e47e745ed3a23bcfd21d284c395379dc02080f07936bc154e7b99ee73db188bd2a394e03a01ffe2d1b330ceb72158f958c716a81711dbf65aff8cd12f5dfa53b376ebb8b98f8628f17ef8b2ab9c0bb68412f4e347a633e2f8da1a556d96f4af7211c078079c10541c07dc3722d18dab8fa8bc4925aba5c966f805040322dfbbbe87fbfeb1961f5ccd40a91b997e54315a7eefc3a47bb0c87dc23755ce7227574996f4be7aa344fe0d17b97bc50c5838f99292", "signed": "b8f3e1f3785a2a39bb086ca465c0abf0a3e87443225ac6e966ed9b4531c54a894a9abd01ac31b85757fe75308c9594ff65f97cdd91e8d8a93cf12b9e6dbee90b3f8ff20bb4f00834c80f2ee6893d6f73bf7ace2729601bb26a0fb272a4d0eea1fae1d306ac2c5f32add60135851da27e4f12e64ea5e9e9960b1383b04ce05a98b0414dad971ea98944871d415cc2c46da403976d9f21938958d4ea8c7903b14f2a4485fd69afb24abe102d8fec266fb468b411eb20a339677d88eb31c997b4dc885613f0be7c70daf856a3df92da9602fba2e6749d2f426beef68662d5b0c2fd31321b22b5ec597da5d7e6a288ebd9443c5f39eb87dcf4a5ad9d56c6baf6080996a77936bd87dc3cb42ed4c4d42688a9e193829b761ff320e2a66cc67648e70eea3a1f2f9b9d5b4202fb5a39e9adc609086a9be2a8323ac66931bdf6c504d3336211e46fdefc481fbf17f613dab1fc5c097c92db0609906d78b25a455a3045718efd3e3b14e252b1ae59c7c3893e31913b2c264c0ffc3b606ca1b01dc47ee828a08e46af604e590def44d27aab93a403251fca0772e9df0fab7af0cbc5181efda4da913d8eb6452f6cecbda204bc72d7c990f60ce0dd83c634e912236091b0a6673a7c89ea59308d55bd7e63a8526774cbdd7a1339fac2124c9022abd6fece7f2daedfd87fa683dc0e3ef40806a0ab198769d3a99fe81a99b68600319087afa4ea79d7ee45da9cd40809f4ee8f4e25a0177521ee9dba8b56212e88719bb7367336f4a7bc7122b41a7dfaa2672f92f23403a10c4fb25388c6b20081093d49f3be8a9e1c634ef7ba96b6d523dd6ff613c0a23b60457026cd485ba8db61d80a0dc659d9af42a38cae777fec68e39c52986ff9fc20789c10585107c04047b66ba14e93fb904ea90df7ac9f0154c96f3236acf6dc8b44f554c0cd513193e5dfd87e085ad4b38aa4c5e36b2427722088816ecd2bc3a3dda01e4fb3ff5eec7a6417322ba6a27773d24495a839194a4a582fe5abdb8b5d533a24262589241fc81fdf5e79fd26776428f8e1ce9e926cf272716e7583abfc67a94aae0816c1000a196170bbff1f45e5ed9e267ace1e4d915dce7216c5f404def6fe2bd8b28b2eccf3e2aea0c0d6626390274e47e745ed3a23bcfd21d284c395379dc02080f07936bc154e7b99ee73db188bd2a394e03a01ffe2d1b330ceb72158f958c716a81711dbf65aff8cd12f5dfa53b376ebb8b98f8628f17ef8b2ab9c0bb68412f4e347a633e2f8da1a556d96f4af7211c078079c10541c07dc3722d18dab8fa8bc4925aba5c966f805040322dfbbbe87fbfeb1961f5ccd40a91b997e54315a7eefc3a47bb0c87dc23755ce7227574996f4be7aa344fe0d17b97bc50c5838f99292", "signature": "b8f3e1f3785a2a39bb086ca465c0abf0a3e87443225ac6e966ed9b4531c54a894a9abd01ac31b85757fe75308c9594ff65f97cdd91e8d8a93cf12b9e6dbee90b" }, { "secret_key": "174e993d9b81f2af67e9ffb8ebd5da417966a9e77f66c65c767738fe8357d07c", "public_key": "3bb7386f1b1cbfae553703833ebcbfe2dfff8c899a0792d7ce2322b5ba645a5f", "message": "a401750afc4837dfe3aacc284a597145dfef02629ef87bd0938d443979df76f29fcd66a5b71ea8ab787277e3056f6ea11b08bd238979f9d3b062538c4d6040a86b6e32047aecc59c2377ad0ea4c40c79ff9fe98c958b2bf25f2fd6342432636f5f7d5bb0d2ecf18183426c73147984d95bbe162e11972ddb78a2a7c345c5c0bbbaba9cf38a2d5dd509a7df8b842874a96e64b5d64f5c41a21d208d14cea7066cf22dee0ca41aa46ab921d4ceec89ec873f77960eda60d9676cfd0dbfaec872c2ade8fba4285aacd527143ae0341d67d0078119653b5d23d46e6ef70264b1b0913870877623716d0f1a59021be74c914b432471a43a29f2b6dbeb6a223e2dbaabb820b4adbe337829e1de0c184dd0d09f9d01d42527e5d40abbdacc8ac0f1b2c5c1cb2f23876d2d1b6b43dfe482f9d45a18f5c22b15f1fe521ef57b08aec6a3033925c7454c93e6319e778ac494fb140ae5f1a31cc832ca2488651004063bcff8fd9ae9266af527f2c31f6acb8f3debd9978ef9df0108e3d50c491990c90dd8ee9d64ea4ebfd711c99d9044ec11342c5383ca39232ed97a07e4dc51db4c1fe947348dffe70a95c99db14751314801f13fa2bf42d867375a08ee9b3b799e0b15278e95e91a8968064d6dfd8f5115438ccb8b516ca0c41dbb19873c6e10a236ecc2dad522f80f01c14e2fa14a0d792b9fc486c6fb0efbdf2130f02df1497db5aba8be61ca70b29388e4eec7e0694a38c0d03c59bb6a2dc3ccd6dde1e29ee2c1b325ac72aa8e6fab9138f8b6f5d324d46af3a3542c8bd87cb04fafc54b5db827de606762a097b622799ca827bda9c1c0bb267eba8254a81c6b858a375b94bd09f39eeb88cb14b8d46e4740dc1ab42a895f86d2c57fc28b07b7f60fc4f8847b8bc8ad83a2481a28f29bca3510ff8bf1dd7581e3357164f4fe920f9de839376de064900dc7f8bcf511dc572e0f0f6a75b929797da41c52eae6fe13750ce351e8767630badf6d7d4eab90cd1904c96c048a9acb213a9e5b864615738a84f222986ac23554cf4ce54e80ab5733c065b80459921dd3d8372d0e8594d4364351bf041c146fa8d23a193eb807ece23f24ab6595e932c9ce1a759bf788914db008e87098dd81465e2610647ac38e088666f60ec5d0e2173320a40cd985f0e00dbc2b4570727483a8c25f6fc1e093bb57ccafd1ca202f2986c7c5540a7c3e10c4a6fc26d1d62c2ca5af8305ceebe42ff96e7dc548214375e8a7f9f712ba8bd875e43ca10cf9b183f0c8519512928538a478cb98259bd8b3e334bcc4635595cad3", "signed": "e607bc9a5360b31da56be1c544c2000284951d8689f4b722bc4673a0c8489b84483ed8e76e297ea046e85b37ba5630585e5375566a187afb5696661e5bfdc10ea401750afc4837dfe3aacc284a597145dfef02629ef87bd0938d443979df76f29fcd66a5b71ea8ab787277e3056f6ea11b08bd238979f9d3b062538c4d6040a86b6e32047aecc59c2377ad0ea4c40c79ff9fe98c958b2bf25f2fd6342432636f5f7d5bb0d2ecf18183426c73147984d95bbe162e11972ddb78a2a7c345c5c0bbbaba9cf38a2d5dd509a7df8b842874a96e64b5d64f5c41a21d208d14cea7066cf22dee0ca41aa46ab921d4ceec89ec873f77960eda60d9676cfd0dbfaec872c2ade8fba4285aacd527143ae0341d67d0078119653b5d23d46e6ef70264b1b0913870877623716d0f1a59021be74c914b432471a43a29f2b6dbeb6a223e2dbaabb820b4adbe337829e1de0c184dd0d09f9d01d42527e5d40abbdacc8ac0f1b2c5c1cb2f23876d2d1b6b43dfe482f9d45a18f5c22b15f1fe521ef57b08aec6a3033925c7454c93e6319e778ac494fb140ae5f1a31cc832ca2488651004063bcff8fd9ae9266af527f2c31f6acb8f3debd9978ef9df0108e3d50c491990c90dd8ee9d64ea4ebfd711c99d9044ec11342c5383ca39232ed97a07e4dc51db4c1fe947348dffe70a95c99db14751314801f13fa2bf42d867375a08ee9b3b799e0b15278e95e91a8968064d6dfd8f5115438ccb8b516ca0c41dbb19873c6e10a236ecc2dad522f80f01c14e2fa14a0d792b9fc486c6fb0efbdf2130f02df1497db5aba8be61ca70b29388e4eec7e0694a38c0d03c59bb6a2dc3ccd6dde1e29ee2c1b325ac72aa8e6fab9138f8b6f5d324d46af3a3542c8bd87cb04fafc54b5db827de606762a097b622799ca827bda9c1c0bb267eba8254a81c6b858a375b94bd09f39eeb88cb14b8d46e4740dc1ab42a895f86d2c57fc28b07b7f60fc4f8847b8bc8ad83a2481a28f29bca3510ff8bf1dd7581e3357164f4fe920f9de839376de064900dc7f8bcf511dc572e0f0f6a75b929797da41c52eae6fe13750ce351e8767630badf6d7d4eab90cd1904c96c048a9acb213a9e5b864615738a84f222986ac23554cf4ce54e80ab5733c065b80459921dd3d8372d0e8594d4364351bf041c146fa8d23a193eb807ece23f24ab6595e932c9ce1a759bf788914db008e87098dd81465e2610647ac38e088666f60ec5d0e2173320a40cd985f0e00dbc2b4570727483a8c25f6fc1e093bb57ccafd1ca202f2986c7c5540a7c3e10c4a6fc26d1d62c2ca5af8305ceebe42ff96e7dc548214375e8a7f9f712ba8bd875e43ca10cf9b183f0c8519512928538a478cb98259bd8b3e334bcc4635595cad3", "signature": "e607bc9a5360b31da56be1c544c2000284951d8689f4b722bc4673a0c8489b84483ed8e76e297ea046e85b37ba5630585e5375566a187afb5696661e5bfdc10e" }, { "secret_key": "e53715fec9d3b20e9c2991e54b5eb0a8cc81875569c95e22a200136002176004", "public_key": "5351899b69b2116bc7f8a8814d1e5b9fc785698bebd9ab14277c3ecc01ef8b1d", "message": "8431cd16d5c093775e18c08252c43f95b1017eb711fcaf73e1e00c0cd6f3448744ab9b0e64335518c483ae94deb97677f818f0e81a7490615b7141b9c35f80556e6971cea28e9a32c328cc2669fca5b123cb662debab2b98157764668070e18edf761ae196bd4b244fea7b74984516be2c00739e76e6c4b621cb3983765a20d84778d5a4350b168f6a0f712a9820a85a636faf92c789c428cfd2962ed207c3ac8899c258cac1adb5159f764ba37229c5cbf783fc9aa4d1ea46ecc85fe0961485d4fc5cb21df0012ac9b955373b1422e51afa1c550988862c86133b760aa630fc0acee8989117d1dd96e3e6287b69287c590bdca9cbc8eecef281ee6d1c8d88822bfea5fa0f530f23278093c7c85a0d44c3a77404ee79f1c8368cd7321bf148fda4dcf2eb07e4630ea422587586371780514536b894c524e6b83d5a76a15c83e95ab314e07b34b98cd99e0770b4eb9b3f3f505bae8a06f7f950258d790748107195eb4f6b84840f8c0590727396ed14e3f53239476c4d2a7269b2e1f972fbff33e4724426745ec886a32916295e70d468d06c7dbb5ff9a354e1ac903bb45ca526f08b49a65e82297d8dd3fb25aa428f64345bca9740d9078dac9e1138c921bdd74881673d49d0cd2006811723de287c6c9583e456a01ab1a34dfa1eaa963b71e8bc7fa8a98cad4f941e4b37b60eef923b3294882350b38ea4eac0e9232e93c532db5d7eec8ecfae65e080473078777ddfdd11508a6e59f0ebaa3f60441f82a71a73c84bca06a371ff5c9f77213a2db795d4a8897823d88fd92ae3e057e8bbd80c990af8386bdf26f12d973c8c5ff9ed6f7b2d8e6183cf6e68f3bb898f59a93ec4de3bea605a5d8b15dfab713f3585c48dc9a5768242b33101438030e7044880d17c2ee84f89d26a1f7b1986193f9663c587d50ca9ddf6186a5176afef1adb2481b79254b78d3b34c69790eb28b90b1461170c3d73818376cdf371af0a0feaf14fdf7016ed6e7f08c0c14b52705c86d4f0003b5e45f974c06416ccb5ca3e9d529aa9d415c25a446fa2d69e82f4994e57e922c17c1c342dd7281e410052d9e4aa1b309b7d470d458c663e17ff2500d0bb8e46a9c4367e091caf87ddfc062aae08a65cb9e0eaa71c99459c5e7cb112a2ee98a5e4cbee0dc520f87c3022da6549be1ee70a0a73ad8499c97dd06aa14c9fd8628a92ca6db487322db9598ada1fce28f4b9fc1d3cc39dcf2ed1df3d862d87f55cc1016fb9e73e7cc897b970d5ff35acfeb05c1c89192808aeebfb2cd17cb1c94fab059898fedc2fbd44ccef", "signed": "3d0adce77a4e046fcb9b49ad5e6c6809c8ac336c733404e5d3f015c9225c3df46ef21ea34cffb3af69974f8b7eab2d23fcd5a1e1753a4023deb3818629a98a0b8431cd16d5c093775e18c08252c43f95b1017eb711fcaf73e1e00c0cd6f3448744ab9b0e64335518c483ae94deb97677f818f0e81a7490615b7141b9c35f80556e6971cea28e9a32c328cc2669fca5b123cb662debab2b98157764668070e18edf761ae196bd4b244fea7b74984516be2c00739e76e6c4b621cb3983765a20d84778d5a4350b168f6a0f712a9820a85a636faf92c789c428cfd2962ed207c3ac8899c258cac1adb5159f764ba37229c5cbf783fc9aa4d1ea46ecc85fe0961485d4fc5cb21df0012ac9b955373b1422e51afa1c550988862c86133b760aa630fc0acee8989117d1dd96e3e6287b69287c590bdca9cbc8eecef281ee6d1c8d88822bfea5fa0f530f23278093c7c85a0d44c3a77404ee79f1c8368cd7321bf148fda4dcf2eb07e4630ea422587586371780514536b894c524e6b83d5a76a15c83e95ab314e07b34b98cd99e0770b4eb9b3f3f505bae8a06f7f950258d790748107195eb4f6b84840f8c0590727396ed14e3f53239476c4d2a7269b2e1f972fbff33e4724426745ec886a32916295e70d468d06c7dbb5ff9a354e1ac903bb45ca526f08b49a65e82297d8dd3fb25aa428f64345bca9740d9078dac9e1138c921bdd74881673d49d0cd2006811723de287c6c9583e456a01ab1a34dfa1eaa963b71e8bc7fa8a98cad4f941e4b37b60eef923b3294882350b38ea4eac0e9232e93c532db5d7eec8ecfae65e080473078777ddfdd11508a6e59f0ebaa3f60441f82a71a73c84bca06a371ff5c9f77213a2db795d4a8897823d88fd92ae3e057e8bbd80c990af8386bdf26f12d973c8c5ff9ed6f7b2d8e6183cf6e68f3bb898f59a93ec4de3bea605a5d8b15dfab713f3585c48dc9a5768242b33101438030e7044880d17c2ee84f89d26a1f7b1986193f9663c587d50ca9ddf6186a5176afef1adb2481b79254b78d3b34c69790eb28b90b1461170c3d73818376cdf371af0a0feaf14fdf7016ed6e7f08c0c14b52705c86d4f0003b5e45f974c06416ccb5ca3e9d529aa9d415c25a446fa2d69e82f4994e57e922c17c1c342dd7281e410052d9e4aa1b309b7d470d458c663e17ff2500d0bb8e46a9c4367e091caf87ddfc062aae08a65cb9e0eaa71c99459c5e7cb112a2ee98a5e4cbee0dc520f87c3022da6549be1ee70a0a73ad8499c97dd06aa14c9fd8628a92ca6db487322db9598ada1fce28f4b9fc1d3cc39dcf2ed1df3d862d87f55cc1016fb9e73e7cc897b970d5ff35acfeb05c1c89192808aeebfb2cd17cb1c94fab059898fedc2fbd44ccef", "signature": "3d0adce77a4e046fcb9b49ad5e6c6809c8ac336c733404e5d3f015c9225c3df46ef21ea34cffb3af69974f8b7eab2d23fcd5a1e1753a4023deb3818629a98a0b" }, { "secret_key": "abfd697bfbc5b6ff2bdff3bce1d777e05fbe3ec8b95ce693d623931209313d4f", "public_key": "a709321a0210cb80ab58bf955ecdeb8aaf9ee4c375f959c53089d437488c082d", "message": "896b7ab8413ffe439a2f4487ec49d64e31c74f50ac83f55da61a7003aa716c2a9df6b438e62f53d8f0192f3736324760d7e8c44ac0baca3ae2a6fb93f13d96886799fd2c4551b0ab36f1730855551265a5a3c3c21d9516a237f5dbc1c8e72999b782c5ca41a4f6e9308e64afdee0bf479e546b89c51bc5e4f71e57fb24ce437a8b81b91dc798b5ab36f29afd5b48e81c176ae5edf95371ba3246fb439405bd10eed3678e3ec62307a3b3dc1badba051f16774b85088188c2a9e320a1618d5f26ce94ee2b933c305f6d9584958eea3156c3d1e0ef39a186275ee62c40f3c1acd15d8be6e074351f5349ce3df69517505f45fa06a815c69ca18f450f42b5cf4ebd99268445e0f68104a7deeb0a115b817b99e1a73e0fa9d87db71f8ec94f8708c9bc2e622b963365ebcfb97cfe7332630070e9654eaa60361a45d402dc0ab297665242667fbd9940f6cd33195246a8c2869af759a862d4b641db144d5732366b20636c4027787f558027d76fcbf8432eb93e6d14567df8dbf211daeb5655db10acddd05eca06accee9fda8d3b70ca1e6dc587fa4b78f63cd663ff0243870570f4dcbaa3fb626b4e113bde47d5c9db2b4ba6ec6dbf918ac056949ef3cfcb115561615771a035a43d33ba2651dbeb46348261ce3c4c9f246d23f94dbc2d0c19b921e24c77da5992f1b4bdf2edea499f5411168ac0c12e96f3b15d2e12ac8d7b3ed8d1e07c4267a25d3a3c353a4208b7406278aab9e700f7b206f48e6ea7cc97e554f15c9be349dd91514dbe8d889f2dcbbfa182c9faf5807a69b2e97fa771a6f231a4c7b31d117b8ed0e630cdf13e082bb4f63c3f9acb3553204ccd76e1835c46eec3d43c561bbf17c92214a6db1212b6003cf2cc26c7ae675fcd053b947e722f9e85762ce8a16e4654ec6342fc646e5cab472797eabf658ba4afd142fc8fc4c8f98f23c24dc99847ae8cef0879e1ab3bb8097e4c3529add2d8e8e2c2069210f50ace1ae32a6c8e6384a2bf7d79c66c746149c84ad75a3a176e45e136d94695aed4bfd08b426ea8c4b9379f3742550e1cf5ac84c18174d680e92af2c1874ac1c13d28232de193768e561947cbd6b79e9b99da65cfb74ffb32f7d3d2025c60763dc07f55539b4d253de1e6c25823a6258c7a9ced1501dce2786898a3e05c9bff8fc5b2125d0f471088a134b4873c8d55c0445f6ca396b3d7b4bc2bf5c4d2240da418293af6a3ed853dedd3bf668d937b35aa0c2acbf23766f9f3e96828475ab086496617a6e81d653589b2fe50b7ba8f0cf1e5a44d8d62f08377abfc26297", "signed": "8c36b5a111c5a8119f2d9db57ebb592dae86ad4bf678c1492e26f3c10fbe03f105cae0dc68b55259b9b5989289db33d95d2ee6b756c760f9d3aa0e68a189de02896b7ab8413ffe439a2f4487ec49d64e31c74f50ac83f55da61a7003aa716c2a9df6b438e62f53d8f0192f3736324760d7e8c44ac0baca3ae2a6fb93f13d96886799fd2c4551b0ab36f1730855551265a5a3c3c21d9516a237f5dbc1c8e72999b782c5ca41a4f6e9308e64afdee0bf479e546b89c51bc5e4f71e57fb24ce437a8b81b91dc798b5ab36f29afd5b48e81c176ae5edf95371ba3246fb439405bd10eed3678e3ec62307a3b3dc1badba051f16774b85088188c2a9e320a1618d5f26ce94ee2b933c305f6d9584958eea3156c3d1e0ef39a186275ee62c40f3c1acd15d8be6e074351f5349ce3df69517505f45fa06a815c69ca18f450f42b5cf4ebd99268445e0f68104a7deeb0a115b817b99e1a73e0fa9d87db71f8ec94f8708c9bc2e622b963365ebcfb97cfe7332630070e9654eaa60361a45d402dc0ab297665242667fbd9940f6cd33195246a8c2869af759a862d4b641db144d5732366b20636c4027787f558027d76fcbf8432eb93e6d14567df8dbf211daeb5655db10acddd05eca06accee9fda8d3b70ca1e6dc587fa4b78f63cd663ff0243870570f4dcbaa3fb626b4e113bde47d5c9db2b4ba6ec6dbf918ac056949ef3cfcb115561615771a035a43d33ba2651dbeb46348261ce3c4c9f246d23f94dbc2d0c19b921e24c77da5992f1b4bdf2edea499f5411168ac0c12e96f3b15d2e12ac8d7b3ed8d1e07c4267a25d3a3c353a4208b7406278aab9e700f7b206f48e6ea7cc97e554f15c9be349dd91514dbe8d889f2dcbbfa182c9faf5807a69b2e97fa771a6f231a4c7b31d117b8ed0e630cdf13e082bb4f63c3f9acb3553204ccd76e1835c46eec3d43c561bbf17c92214a6db1212b6003cf2cc26c7ae675fcd053b947e722f9e85762ce8a16e4654ec6342fc646e5cab472797eabf658ba4afd142fc8fc4c8f98f23c24dc99847ae8cef0879e1ab3bb8097e4c3529add2d8e8e2c2069210f50ace1ae32a6c8e6384a2bf7d79c66c746149c84ad75a3a176e45e136d94695aed4bfd08b426ea8c4b9379f3742550e1cf5ac84c18174d680e92af2c1874ac1c13d28232de193768e561947cbd6b79e9b99da65cfb74ffb32f7d3d2025c60763dc07f55539b4d253de1e6c25823a6258c7a9ced1501dce2786898a3e05c9bff8fc5b2125d0f471088a134b4873c8d55c0445f6ca396b3d7b4bc2bf5c4d2240da418293af6a3ed853dedd3bf668d937b35aa0c2acbf23766f9f3e96828475ab086496617a6e81d653589b2fe50b7ba8f0cf1e5a44d8d62f08377abfc26297", "signature": "8c36b5a111c5a8119f2d9db57ebb592dae86ad4bf678c1492e26f3c10fbe03f105cae0dc68b55259b9b5989289db33d95d2ee6b756c760f9d3aa0e68a189de02" }, { "secret_key": "dcfad59fc6b697109e727ff66a5fe93a6a226f631a64e5797ad8d8c8b6358734", "public_key": "e79f4f511372e355e7e9e0e8b5346fdbcd2df1fc5c3a1890d27fa1fa928d27a6", "message": "7d92ddd8133c61c610c1308c23aeaf993884a4e67f7b94bb886dad509869a932ec4a27d410d2c29ca7aeae6f9280cf6c4b067ec751e5e8c39ff444d422ceabae145d42f047453dd402d1797405033409e72cc19f793d5d268fb3fd2c11ea2cb0d70436e18f9e88a01515dc865f6a1eb23690328fd75de26321a38f12197a97201b1d8452944fbc541cb68c77d49515db5326f2b1d0763eda06d250ce2a5e0bbd7d1676d7d41fb3abe88bdbe372f96bf7bb526d6b65a2515e83a577045b5479b38b852fe4ab011cbf21c085ef5f0a7c1bed76572b0f860228067a899f895ae7f6256eb6514087f9d6f5c35596c1f480c73113546cb9cc30f56ab074a9ff28acab7e42650a961da325ac5b6594b81c93250ae7d39267a19c97625407edda0404cbe5a36e959fc820b27ef5cad796c11eaff1c0e2f9d4b3c6491502195de03659b364e4e87b2b2d733ec25e6f9b63d5f69179e0d27bd4aecc8f12a507a91baa48d99b3a426cecebaef37d7361106a8490644309f6eb4d2596443b6b0118b945acecc6443ea61fcd155b54325bc2c31be0250f9482e13fd8eb44e2aed76be812af5453cb7f8632458fc8a02a2f45480d79b06c7dda38b4695d08b5a430504f1ae2275b05c91e799d4470f38abe77736dfa895c197ea4b63c2df18efeb14184837b8ddf48909520d91045b9d9655c225a83173960b4d7cd0d8bae30237557f869708be138ad5246c866c6c059dc597abfd4943237376896736b97b7e0289ef9bbd29477745cb60f46202f1de984f509b1808833f58018cde8c26bef4c005bdca385b05735110ca02e562b50eddff6fde9fbb8d030cedf7031bbeb32b12b242be49fde0160c1fbde99b03c062a1a47062345c92e0b604d080facce9243481529c70597dfd64382cb540691b59b71b094332baf0bbb125b63a446bb97491c0464328cabd7627c46f392f3b124822f2013c6e16d3ca87cc5becf56b0fc6eb2bf9923b3012ba2b61250a633a4d2ee391256c520957382aff970c5d22385c3344c6d4b4561571c96329bf75615297516b9f2ceb9f997a39523aa0f58b488772d82fc0d78c5dd52ecfa6bfac63a76e148088b36f24a88e68385496ddadf3023f72d87c2efa26e877d32f1da97cdb42c8f15718988e428cd02f4d09543bd0bd5b2f409963d0fa373531f78b592bd137eeaea0b4e7f918208e1d59008a8af5058f5d923c4f32df19990f10dd3f0eb206293b2b3443f4a5d2dcc5f7d3bbaf6af43fe45f5dbbe53ecf4bf1b4a13e2d46ef80298d4f01c402e210fcb9ff2084ec03e42008d", "signed": "052ff79540737456c6a42c41c97d6bf517b8cf289bc78b503dee6a30ef5168b38f75beaca1e14d971f8773e3941bd6df5cb9778dea125a4c4fe0116b70ee840b7d92ddd8133c61c610c1308c23aeaf993884a4e67f7b94bb886dad509869a932ec4a27d410d2c29ca7aeae6f9280cf6c4b067ec751e5e8c39ff444d422ceabae145d42f047453dd402d1797405033409e72cc19f793d5d268fb3fd2c11ea2cb0d70436e18f9e88a01515dc865f6a1eb23690328fd75de26321a38f12197a97201b1d8452944fbc541cb68c77d49515db5326f2b1d0763eda06d250ce2a5e0bbd7d1676d7d41fb3abe88bdbe372f96bf7bb526d6b65a2515e83a577045b5479b38b852fe4ab011cbf21c085ef5f0a7c1bed76572b0f860228067a899f895ae7f6256eb6514087f9d6f5c35596c1f480c73113546cb9cc30f56ab074a9ff28acab7e42650a961da325ac5b6594b81c93250ae7d39267a19c97625407edda0404cbe5a36e959fc820b27ef5cad796c11eaff1c0e2f9d4b3c6491502195de03659b364e4e87b2b2d733ec25e6f9b63d5f69179e0d27bd4aecc8f12a507a91baa48d99b3a426cecebaef37d7361106a8490644309f6eb4d2596443b6b0118b945acecc6443ea61fcd155b54325bc2c31be0250f9482e13fd8eb44e2aed76be812af5453cb7f8632458fc8a02a2f45480d79b06c7dda38b4695d08b5a430504f1ae2275b05c91e799d4470f38abe77736dfa895c197ea4b63c2df18efeb14184837b8ddf48909520d91045b9d9655c225a83173960b4d7cd0d8bae30237557f869708be138ad5246c866c6c059dc597abfd4943237376896736b97b7e0289ef9bbd29477745cb60f46202f1de984f509b1808833f58018cde8c26bef4c005bdca385b05735110ca02e562b50eddff6fde9fbb8d030cedf7031bbeb32b12b242be49fde0160c1fbde99b03c062a1a47062345c92e0b604d080facce9243481529c70597dfd64382cb540691b59b71b094332baf0bbb125b63a446bb97491c0464328cabd7627c46f392f3b124822f2013c6e16d3ca87cc5becf56b0fc6eb2bf9923b3012ba2b61250a633a4d2ee391256c520957382aff970c5d22385c3344c6d4b4561571c96329bf75615297516b9f2ceb9f997a39523aa0f58b488772d82fc0d78c5dd52ecfa6bfac63a76e148088b36f24a88e68385496ddadf3023f72d87c2efa26e877d32f1da97cdb42c8f15718988e428cd02f4d09543bd0bd5b2f409963d0fa373531f78b592bd137eeaea0b4e7f918208e1d59008a8af5058f5d923c4f32df19990f10dd3f0eb206293b2b3443f4a5d2dcc5f7d3bbaf6af43fe45f5dbbe53ecf4bf1b4a13e2d46ef80298d4f01c402e210fcb9ff2084ec03e42008d", "signature": "052ff79540737456c6a42c41c97d6bf517b8cf289bc78b503dee6a30ef5168b38f75beaca1e14d971f8773e3941bd6df5cb9778dea125a4c4fe0116b70ee840b" }, { "secret_key": "696dc481f619a9498563c83d0d0e55565c14a07845fe4a66aba2247b113ff8ef", "public_key": "c9d737abc4a9e73c149eadc195a837899f2cd5019373c30ecaf62e5f8e14b645", "message": "2d4b3ad0cc99f983e41f9b48c4a818eff75fcfb93a1229ec2740ed19c107d621df78058de7c2dd7251f5ff454340865f6c86da65831f6672db231726fdfe4b9ee315d93c7244a920df37054c82449d310f892932ddbad94cc9bb39ac8937cc76c96521d3fdc028ba23410b29023e8138fd3f524319884ee5dad0d234c8df661f8824be477e21699f6369b15ff3ffefc151aa555b3c3d76adb45f25672d380d472b3148dabdef4245b68e828562f25cc5b81d9bbb241bca9d1934ea353f95f7dbf3646433e81a354e1e2056b81c15aa1fa8ed7a9d1af99238cd5a5ae9e841c48dc348ae1de7c41aca23328236bc38b47f47c736b257a3078d57d574b647a7fc8c4d01bc50302150d5032bfacb04bb0fd155d94d9206667720e180a645af462459e3326d460da3c48e7572678e1919268d3e4740d62a26f7c8559c1c439b4b0b0c5942a620cfdb93cc68aa15520ff2864269d7a0c155780adc6c188e0b565fb9594319e6f51d15caf6b280e7158f25799407f3ba0dd1ceea64b9326d2cfdef017e1f172f4dde0f7e4613501af01ee0ac30095f48b59590902b1aecfe093413918d835adf962ecf18580d16f9fd4f6fa1098af1d8a2bc24dc86f71d0a61ff150010867d086987b51dd030f50ab6e374b8e01184b3e2b214ab1c7fdfaedbc545e38c3cd2f6982979541fe0ff88bed67506da95727af1a2038f3240ae5bfd30ee09210e00fdcf2a064d5db4614946bda972c670081a6ee6a10b63f673c83c915ca5573e0ed687b0067c400792a9bcc3344e0e43f5df63fed5efa85e9aaf85e4d7a2c53a6c92828e07fe63e2d23f1bdf97d84adc36e9fc95faadf03e06d65a19c5e285effd0ea0cfa839d55a0a0dbf6da28785c77f5c04bfd59974ef3793cdc398df7a1bbc9cfcfc3a51ffa9a20d60c47b245dafa3e44623cd711d7762c50a67d650c7e8c4fd3bebc0c498d2152ab9827c700c7b2861565749b5864fec95b7f6b1994e78d8f85d069cc11f85bed9712f7a9f060b0bf67532e88eb9df3eb4a8d2fbbaa85eda926d81c49fb86e73731b7ed2a1905078513f7ca0fdcc3b1d576e6a60124c44618df1890e169794956cb1ec501ba2049970c8e74cc180064c184468be4f089a3ae2263c855863b62c28313ddf9ca85bf66b08a264155ad7c328238dfe614a07ede9155a09ccaff92292249341baedcbe0e6466e2c76045e46dad2fc899a1782e00998e79a83abfae9b706f707f58e730203e1d2cca028c922beb6d157fa7a98132a921a3da21f2f769bb6c1f5f19e9e85a13b781af141039d514ee107", "signed": "ded5d991935cd1f9390f1e85929ca16dabfc83e65e43272eb1751671aa31930c728555341430ce7c80485de58006427129a4d34fd681d52d840a16bafa1530022d4b3ad0cc99f983e41f9b48c4a818eff75fcfb93a1229ec2740ed19c107d621df78058de7c2dd7251f5ff454340865f6c86da65831f6672db231726fdfe4b9ee315d93c7244a920df37054c82449d310f892932ddbad94cc9bb39ac8937cc76c96521d3fdc028ba23410b29023e8138fd3f524319884ee5dad0d234c8df661f8824be477e21699f6369b15ff3ffefc151aa555b3c3d76adb45f25672d380d472b3148dabdef4245b68e828562f25cc5b81d9bbb241bca9d1934ea353f95f7dbf3646433e81a354e1e2056b81c15aa1fa8ed7a9d1af99238cd5a5ae9e841c48dc348ae1de7c41aca23328236bc38b47f47c736b257a3078d57d574b647a7fc8c4d01bc50302150d5032bfacb04bb0fd155d94d9206667720e180a645af462459e3326d460da3c48e7572678e1919268d3e4740d62a26f7c8559c1c439b4b0b0c5942a620cfdb93cc68aa15520ff2864269d7a0c155780adc6c188e0b565fb9594319e6f51d15caf6b280e7158f25799407f3ba0dd1ceea64b9326d2cfdef017e1f172f4dde0f7e4613501af01ee0ac30095f48b59590902b1aecfe093413918d835adf962ecf18580d16f9fd4f6fa1098af1d8a2bc24dc86f71d0a61ff150010867d086987b51dd030f50ab6e374b8e01184b3e2b214ab1c7fdfaedbc545e38c3cd2f6982979541fe0ff88bed67506da95727af1a2038f3240ae5bfd30ee09210e00fdcf2a064d5db4614946bda972c670081a6ee6a10b63f673c83c915ca5573e0ed687b0067c400792a9bcc3344e0e43f5df63fed5efa85e9aaf85e4d7a2c53a6c92828e07fe63e2d23f1bdf97d84adc36e9fc95faadf03e06d65a19c5e285effd0ea0cfa839d55a0a0dbf6da28785c77f5c04bfd59974ef3793cdc398df7a1bbc9cfcfc3a51ffa9a20d60c47b245dafa3e44623cd711d7762c50a67d650c7e8c4fd3bebc0c498d2152ab9827c700c7b2861565749b5864fec95b7f6b1994e78d8f85d069cc11f85bed9712f7a9f060b0bf67532e88eb9df3eb4a8d2fbbaa85eda926d81c49fb86e73731b7ed2a1905078513f7ca0fdcc3b1d576e6a60124c44618df1890e169794956cb1ec501ba2049970c8e74cc180064c184468be4f089a3ae2263c855863b62c28313ddf9ca85bf66b08a264155ad7c328238dfe614a07ede9155a09ccaff92292249341baedcbe0e6466e2c76045e46dad2fc899a1782e00998e79a83abfae9b706f707f58e730203e1d2cca028c922beb6d157fa7a98132a921a3da21f2f769bb6c1f5f19e9e85a13b781af141039d514ee107", "signature": "ded5d991935cd1f9390f1e85929ca16dabfc83e65e43272eb1751671aa31930c728555341430ce7c80485de58006427129a4d34fd681d52d840a16bafa153002" }, { "secret_key": "f3f8d62fee3af375669630cbf063bfa930189af136cd7591e24d578d7366bf61", "public_key": "4714c604aa95e1828a28367ba78760b5896431683ee996cff96871773291953c", "message": "e1dd1ffd737ac6dc24b3b9ce3b79e835bf698e931303d809cea1782dc3af63a0d5e67392823d1439e7b6e337b01c8b215434c2782b3be7443cb5c881e5fb6cf3bb244128b4da6a6f42b2bb2cd75129d56418854348c339dcd912b45557a915e9fd7f37916236510cb6c331c140b87d225311600b8d132ac47473839c720f9ff0f9c1dcaa85815a9d27b9758cd91dc5d3e53326fcdfb2730e52be3103957ac89149a4c3004cb6038c0d80fa72ac630d333be5ad4adb585aeb71aef1cdfd57b915fac4f1af78e7a597f8d1ba06672b19c0b65808a8a071ff8409034379589f3d41302d2d39b3318e8c0090fa36cb958857ff5b211c9666e27bc895ab9d006abaf5950a03ff17ea982178a446dda2466f5a40b8f895509e4f4d4a6a2739997fbd4968f89436cee3d8edb8a6da9bd3d55b066490e8339c78935b77883f95b932fa5e6bb7df303be30fa567249fffb473a1e464322d7c103fe8224c7ec57bd39bcd030b96787aebcd20e9ad651cfa2bf04ba70a1cf648e0a5449567202a937a45becbb6fcded30cf9b5c748f882b5dc2a4d65be69fd7d9c381e83d0dc2a34b6dee91220ba906e512fcd63368e2ce733e466b4b82b84fb0c717dc8945caf6d46ac1c2f6418f7729ef4c35e402422d64b1c3ebd1b32a30fc4c5eece7d4408ff679ff01a1c7b03ca517be52e6ae7650f7bad38901e348a5593bc998f7cf2ea97729cb004f561b3b58fe59809a41fd4b3b76660906ad9eda23bf925437ef452b16f540b3b80a35a7093c2734eefe6fa97d881d79ef5b767d9889f118477b73f58a4c0cb15e0ac8101120571ca32ce871f308ad9057a80c828154fb1bc2b201d0cd1006e022d444dc93f1bcf224db74a5b373e153e851854948b6da147b73287cf17d1fb72b4827611103609cab2a1779e9793b9a70820fc6f3828a64c9eac35ef7aa7b17609d8eff8a9e52e4ebcd86b1e14fd140bea47c6b8ddc41e8cd271eb92287cbd0610512242f76a1ef3eac1e4bbbc1adae50034a7a2647e08b2fd20aa93a93cb2ffdebf2e461eccefbbd1fe894ce70adf790173bae96f5a55a1887e9ae09fced1d4306c291c6b19ecac4707e9ef713ea18a7562c6678326228992077a4669734966108000b4144f45a0c3a2863a4c6a3c07632cb93eb197d294884d9ca3dd4b21f39db707f63a7f9a570f7f0feb99b2ca7da7df92a177abcfe86ec661d30bcdcf1522bdb1fe11673258df7e46ef4d326665093156553f28b3563fe7192f72f5f9b3903d79fea04e2c488b465b4978d69f26e05a59d5ed4ef4cab232acfd564fc6", "signed": "8d6f7ceeb9308b4a303879fc6cfa5ca8e05dfc3defc2b2cd2910dd4b17c94eaee845abe65fd715df05b0128e4316e2334799c6e8fa747ebc8a040c74f5a1480ce1dd1ffd737ac6dc24b3b9ce3b79e835bf698e931303d809cea1782dc3af63a0d5e67392823d1439e7b6e337b01c8b215434c2782b3be7443cb5c881e5fb6cf3bb244128b4da6a6f42b2bb2cd75129d56418854348c339dcd912b45557a915e9fd7f37916236510cb6c331c140b87d225311600b8d132ac47473839c720f9ff0f9c1dcaa85815a9d27b9758cd91dc5d3e53326fcdfb2730e52be3103957ac89149a4c3004cb6038c0d80fa72ac630d333be5ad4adb585aeb71aef1cdfd57b915fac4f1af78e7a597f8d1ba06672b19c0b65808a8a071ff8409034379589f3d41302d2d39b3318e8c0090fa36cb958857ff5b211c9666e27bc895ab9d006abaf5950a03ff17ea982178a446dda2466f5a40b8f895509e4f4d4a6a2739997fbd4968f89436cee3d8edb8a6da9bd3d55b066490e8339c78935b77883f95b932fa5e6bb7df303be30fa567249fffb473a1e464322d7c103fe8224c7ec57bd39bcd030b96787aebcd20e9ad651cfa2bf04ba70a1cf648e0a5449567202a937a45becbb6fcded30cf9b5c748f882b5dc2a4d65be69fd7d9c381e83d0dc2a34b6dee91220ba906e512fcd63368e2ce733e466b4b82b84fb0c717dc8945caf6d46ac1c2f6418f7729ef4c35e402422d64b1c3ebd1b32a30fc4c5eece7d4408ff679ff01a1c7b03ca517be52e6ae7650f7bad38901e348a5593bc998f7cf2ea97729cb004f561b3b58fe59809a41fd4b3b76660906ad9eda23bf925437ef452b16f540b3b80a35a7093c2734eefe6fa97d881d79ef5b767d9889f118477b73f58a4c0cb15e0ac8101120571ca32ce871f308ad9057a80c828154fb1bc2b201d0cd1006e022d444dc93f1bcf224db74a5b373e153e851854948b6da147b73287cf17d1fb72b4827611103609cab2a1779e9793b9a70820fc6f3828a64c9eac35ef7aa7b17609d8eff8a9e52e4ebcd86b1e14fd140bea47c6b8ddc41e8cd271eb92287cbd0610512242f76a1ef3eac1e4bbbc1adae50034a7a2647e08b2fd20aa93a93cb2ffdebf2e461eccefbbd1fe894ce70adf790173bae96f5a55a1887e9ae09fced1d4306c291c6b19ecac4707e9ef713ea18a7562c6678326228992077a4669734966108000b4144f45a0c3a2863a4c6a3c07632cb93eb197d294884d9ca3dd4b21f39db707f63a7f9a570f7f0feb99b2ca7da7df92a177abcfe86ec661d30bcdcf1522bdb1fe11673258df7e46ef4d326665093156553f28b3563fe7192f72f5f9b3903d79fea04e2c488b465b4978d69f26e05a59d5ed4ef4cab232acfd564fc6", "signature": "8d6f7ceeb9308b4a303879fc6cfa5ca8e05dfc3defc2b2cd2910dd4b17c94eaee845abe65fd715df05b0128e4316e2334799c6e8fa747ebc8a040c74f5a1480c" }, { "secret_key": "865a432ecce7e78c42709fc1e531df5e3959132b2b6f318fd1c34521f9a26e3b", "public_key": "c7a8caf8930b622a501337f92840ed96611a322080fde5e49f0a2f6e33b88283", "message": "b231b6d2ecde49f513b0df25aafc3e5da45b6a9958d60f5464ca593c03005ecf361ef1696bb6e55d6538e34b38f324c21cea5cc81a0073278bb92727eff81af561802dcef33bec10ad6594e22d9c4418af3988a43ed087b9954bf8d6283e4beae8c096de6606751cbed685846c6630b9528ff364a7c48464113472c9860b3371963c911495a9c628a3e3e47ab0991f10dd1dd33161525262d63bab648819d57d1269e114825c5434e6b2845f42795d4fb083ad79401f2a0761c634a545aec7cdb13b5be449f1d829326378ed1f493fe8c8e9b068cc1dbcf165550b8132c319dac487b87bb22a54cdf60aac71516182a4e69ba083f6e86d1a4f05083a77619ef239f702396d7e46968cc04a3b34df3265ecf16157abe15c642cd7427096d8d40db002d196cab1be304bcf322d9d1a2451b6c11eeaf3e8e3d929f480b6b77804fe84496ca757e04337914ce94475d7990c7457c8e606f8bc207d2d48119c80a6b4a9e07b229226570dcd994989fecc694c6c2fb5975c9a6a9b74e8159c27dd3677dfd5cb651f1e32adfafd810b6e5d5efbace31ae6d9b12191e89398da063f138b7584c58e77e7f9fdd7fb9ef5d68ae49c6ccad28d18bc6009d4187ed1420224a5658aadf135b5a953f2dc3c8bfcaf669ed5da38d0144fd9665e6f0677d3fc8804e21cc25fd5e01a3f3fa83e571eb2f882a7659ce5d864d8bb54072b0986a854f1a7f2d2720df857e6d4219630841b1ccdcfc6726b91bfc17e18c3e3480c23a2c05e4bfeddd4db9ef42388f234fd3e4f3dad666026e2780612374161316afc7665f9411b6c5aa78933b18021c012b084f3244760a4ea1bcf31cc9f5c4044a9bcc75a986707f38f45ac1c7fa139ee95a6d8f16c3c1e12764c4b0b1194c0fc5f7eeff9a848c4050b0e651684719d438aad56019164fae4f48882205ece0b99736791084a753ba7d56e88fceea533566c3a2ca48dd6efc49b27dbf14f2616ced652e13833ab9028ada454431c89b3cb7441fdb8f23e12b60a1a104a2a8cf4a64e878aa26f54e8881a4b151a16a96de8b9807e729396ebe3e3d394f808bd74b7312fe6b84b1312af8a1e4133599d07bdf33db21e016b5c196c1ba3115708f581bb82f4b57a6ca1a529e64d193042c1dc5faa0a03abf53849e1bdefbab64b1cb60fe10a3fc1823a234c45f3b0dce66a46739c01aead12de6f0313c7be71405f3fdc4a507a9d84e8686f6fc92635db0f7856c7373a618a7252c129a7760e2029543d726228c21d00ad4ac52e5b1a6e31200917f15af515859e08f2a79ace67991ed69044", "signed": "32bb7520e2639c6cca19a2b9836b08f8b083ca33369ddf5f9a877d4c7a9eb05f9c3dc34ed4cfa4b283e51922b094066ce9ffa4d9df621910ca37b0b37fbabb0eb231b6d2ecde49f513b0df25aafc3e5da45b6a9958d60f5464ca593c03005ecf361ef1696bb6e55d6538e34b38f324c21cea5cc81a0073278bb92727eff81af561802dcef33bec10ad6594e22d9c4418af3988a43ed087b9954bf8d6283e4beae8c096de6606751cbed685846c6630b9528ff364a7c48464113472c9860b3371963c911495a9c628a3e3e47ab0991f10dd1dd33161525262d63bab648819d57d1269e114825c5434e6b2845f42795d4fb083ad79401f2a0761c634a545aec7cdb13b5be449f1d829326378ed1f493fe8c8e9b068cc1dbcf165550b8132c319dac487b87bb22a54cdf60aac71516182a4e69ba083f6e86d1a4f05083a77619ef239f702396d7e46968cc04a3b34df3265ecf16157abe15c642cd7427096d8d40db002d196cab1be304bcf322d9d1a2451b6c11eeaf3e8e3d929f480b6b77804fe84496ca757e04337914ce94475d7990c7457c8e606f8bc207d2d48119c80a6b4a9e07b229226570dcd994989fecc694c6c2fb5975c9a6a9b74e8159c27dd3677dfd5cb651f1e32adfafd810b6e5d5efbace31ae6d9b12191e89398da063f138b7584c58e77e7f9fdd7fb9ef5d68ae49c6ccad28d18bc6009d4187ed1420224a5658aadf135b5a953f2dc3c8bfcaf669ed5da38d0144fd9665e6f0677d3fc8804e21cc25fd5e01a3f3fa83e571eb2f882a7659ce5d864d8bb54072b0986a854f1a7f2d2720df857e6d4219630841b1ccdcfc6726b91bfc17e18c3e3480c23a2c05e4bfeddd4db9ef42388f234fd3e4f3dad666026e2780612374161316afc7665f9411b6c5aa78933b18021c012b084f3244760a4ea1bcf31cc9f5c4044a9bcc75a986707f38f45ac1c7fa139ee95a6d8f16c3c1e12764c4b0b1194c0fc5f7eeff9a848c4050b0e651684719d438aad56019164fae4f48882205ece0b99736791084a753ba7d56e88fceea533566c3a2ca48dd6efc49b27dbf14f2616ced652e13833ab9028ada454431c89b3cb7441fdb8f23e12b60a1a104a2a8cf4a64e878aa26f54e8881a4b151a16a96de8b9807e729396ebe3e3d394f808bd74b7312fe6b84b1312af8a1e4133599d07bdf33db21e016b5c196c1ba3115708f581bb82f4b57a6ca1a529e64d193042c1dc5faa0a03abf53849e1bdefbab64b1cb60fe10a3fc1823a234c45f3b0dce66a46739c01aead12de6f0313c7be71405f3fdc4a507a9d84e8686f6fc92635db0f7856c7373a618a7252c129a7760e2029543d726228c21d00ad4ac52e5b1a6e31200917f15af515859e08f2a79ace67991ed69044", "signature": "32bb7520e2639c6cca19a2b9836b08f8b083ca33369ddf5f9a877d4c7a9eb05f9c3dc34ed4cfa4b283e51922b094066ce9ffa4d9df621910ca37b0b37fbabb0e" }, { "secret_key": "2be1f98ce6553c915b6a0933ec0de347b370e29ca294e8005541239f63b430d0", "public_key": "7a6f4469c30a63f560f98734fc1906ebd1371ed80125fa3e4c86b43f262cabbc", "message": "6268201f932a7cd3f879ae6ab83855a2f50291de784d7d9e9adaa1b9afed6f5aea20240e59fe93e5a7088c95ec8e15745fb8fdeb91df0151c7b4605067561ea08dbf00c4ffe1fd0acf103656a7b54fad0f25ab16b4bda347179ed1cadb7b98be0895e050dcbc379d1fd553e99795928b67a752f8d2ec1b9d66bf6ac997e744dc327f242230f92e79ae312745a5ab6ddec1998fb63dc4f6b05f147222d4b65ace9017dc1bcd675e495f9eabb5f602133f6c72e053e9f4ae30d872d78bf71feba37acc595055c3bea53a05ef0c7f212dcf4e0af838ea2928f4cdc9fdc837da25f26966b2456abea66a5dfb8faa8fa091f7331d5436e98a8d6323cc9e9a91d5a02a49511714849b47454baf99c5f850a08d3d98410e939a9e89b15053825f3e9aee71447416140782e1bf3b0d8b4ff62e77a4a03f710a8ab76cf63592c05c440c8f064770099163c12270f3d5ec9a6bc9715bfffec769611d21fa003c3cc8356c975d37b62b88aabb8597daca196c9648a31d15bb0b86cf070ee01e511ef373b4a44c6a00160a797f2e820b716f5ca64464e4189a00fee978d35bf204f71db1f501f9b6e5dfc821a8af5dbfefd353ad3681f9bc3c22c67cb211b430b6a55f3e73da7c3a07ceb7d2fe254b10c2703ab2e2294dd0d3152dc7b21aab87b150f737a947463fb204175de8543236fbb0da5c7d48c57f61744de6f984aa8e61b970c62d0eeb849da7e89a61222d432079cbcf5f8a2ba930301683c0785c26fdf85da3020874604599ac6c847ec2608658b5788c7b8d3a3744fd5442e24c8eeccd420756bdd8b8a77cfd80589605dced9afda2bdb630a0cb612f739ce617d54ede6ccf36aa31e7e373d8a0fb1b7c9906f76b5f9de8c26891de006eb797ead4a86f7016f34bcde92f94ac3e920ba58d6dff772078d802a94f56cb26bf794fd90ca0ad4f2e7acdc5929bc7364997ded98ca69c573991bb9ab85f235b63e76f77e0ab45e78912389869af21e74e66f7c456b827e670beb0f0726688bb1f9036d38da07d69ea3666f76bd605d82e2dd6387ece6e824a569700f01b195d1a9bdcb0f96ab5c54e06c2119b406bc4888480660418bb4288ea2fda96631b0e1f60ac861d6ccc4c844b647a7d7403bc2d15bafe4af677e856fe0d2b5f663be4e480b38f6b766adcd3d05298ef1398d04d1523a68b91dd31cf5dc4b73decbfd7213f981b207e1f6ef225d7948a1aa17d8d57a112f1d4468d2d28f7ec2e54b74a692c5958022e82031a41b315090ed4d5bd7bd0b451476338f739a7d7031af2d36caa09ffdbb7c396507c75", "signed": "8e659a3f535a589a5fd2d217cbcb8b777e5af20b234432f7dac29f810a2b4737c5cab10b59dfd0144f3090f5f9e0e667f0e21a9f573fe13b1c28eccbb531a2056268201f932a7cd3f879ae6ab83855a2f50291de784d7d9e9adaa1b9afed6f5aea20240e59fe93e5a7088c95ec8e15745fb8fdeb91df0151c7b4605067561ea08dbf00c4ffe1fd0acf103656a7b54fad0f25ab16b4bda347179ed1cadb7b98be0895e050dcbc379d1fd553e99795928b67a752f8d2ec1b9d66bf6ac997e744dc327f242230f92e79ae312745a5ab6ddec1998fb63dc4f6b05f147222d4b65ace9017dc1bcd675e495f9eabb5f602133f6c72e053e9f4ae30d872d78bf71feba37acc595055c3bea53a05ef0c7f212dcf4e0af838ea2928f4cdc9fdc837da25f26966b2456abea66a5dfb8faa8fa091f7331d5436e98a8d6323cc9e9a91d5a02a49511714849b47454baf99c5f850a08d3d98410e939a9e89b15053825f3e9aee71447416140782e1bf3b0d8b4ff62e77a4a03f710a8ab76cf63592c05c440c8f064770099163c12270f3d5ec9a6bc9715bfffec769611d21fa003c3cc8356c975d37b62b88aabb8597daca196c9648a31d15bb0b86cf070ee01e511ef373b4a44c6a00160a797f2e820b716f5ca64464e4189a00fee978d35bf204f71db1f501f9b6e5dfc821a8af5dbfefd353ad3681f9bc3c22c67cb211b430b6a55f3e73da7c3a07ceb7d2fe254b10c2703ab2e2294dd0d3152dc7b21aab87b150f737a947463fb204175de8543236fbb0da5c7d48c57f61744de6f984aa8e61b970c62d0eeb849da7e89a61222d432079cbcf5f8a2ba930301683c0785c26fdf85da3020874604599ac6c847ec2608658b5788c7b8d3a3744fd5442e24c8eeccd420756bdd8b8a77cfd80589605dced9afda2bdb630a0cb612f739ce617d54ede6ccf36aa31e7e373d8a0fb1b7c9906f76b5f9de8c26891de006eb797ead4a86f7016f34bcde92f94ac3e920ba58d6dff772078d802a94f56cb26bf794fd90ca0ad4f2e7acdc5929bc7364997ded98ca69c573991bb9ab85f235b63e76f77e0ab45e78912389869af21e74e66f7c456b827e670beb0f0726688bb1f9036d38da07d69ea3666f76bd605d82e2dd6387ece6e824a569700f01b195d1a9bdcb0f96ab5c54e06c2119b406bc4888480660418bb4288ea2fda96631b0e1f60ac861d6ccc4c844b647a7d7403bc2d15bafe4af677e856fe0d2b5f663be4e480b38f6b766adcd3d05298ef1398d04d1523a68b91dd31cf5dc4b73decbfd7213f981b207e1f6ef225d7948a1aa17d8d57a112f1d4468d2d28f7ec2e54b74a692c5958022e82031a41b315090ed4d5bd7bd0b451476338f739a7d7031af2d36caa09ffdbb7c396507c75", "signature": "8e659a3f535a589a5fd2d217cbcb8b777e5af20b234432f7dac29f810a2b4737c5cab10b59dfd0144f3090f5f9e0e667f0e21a9f573fe13b1c28eccbb531a205" }, { "secret_key": "10bbe6e761a75c935b517f0936fecb9ec6fc215e58130800ea18d1ff442a4f13", "public_key": "8643ddf8aa8d9c8a78b6eb699fd20a57f6f18636b06ce69dacdca1267acb3954", "message": "e8108c6de4133733dc199a73392e226f712c36a24fa91d6fb09f92df218deb2d2830a668fd694b4809d0253507231247c7f258b4d65c56bb69345ef6aa97e7c59e8153775a5a3cf109c4bca9815569da6932e82183425b42d7483c9dbfcbd8eb38c84729571e8ec93982c317716759598c4f6a1b7f8da7306a7815721caf02e70246712314f766be9cb177cd2fa3bda22cd676c5d2e86e8d798fd34f543c9be3129651f273f484f0b9467b140955cd2981ff2603c0bdbb436ac0955a116c5e5fc30425e1fe78f6410f6ef757f604668854bae79bfe22e1a85ce5ee5d6434b4610120ea7e5d3d137ce207514f8534ad9bf392b7dc5355514b59f835466c8eb56f44eddc5bad20cf0b480b2e822a6f46fd95f30f183c7bb3143e4e6100e2dbc9f2bf0d43073e0fe65f01bcce6a1ae401c12541be3ae68cdeac2a4ac71f1663b5fdfc2e50f0e077fb3a0a8b8eeead627c1c3e79dd7361046f7e57c17436c32dc4432f050028cc7aa4408c2d29d1d7998fdcdda32bb32f704dc263db9b8e06c57630870f8bb6ec661fde1b7da94d53b047701a4588478c1c662346741aeac4c25338556a3d848de5b2a23ecea61b776bd0e8037efb8501eff239c7facca6c8367ed7c8adce919fef1a155ae0d5478a98002c95a16fbf4c0ed016ea5d3866fe1de454832a4e9565976b60b3dd2eaf7fee612f2bc040d93975435eebd12f06eb09ecea2c66768308f58c77ac51ed7bd21636fc9cc3fd14870bd06bdf128a81b14792e608c47ea2d535ca7aa21eb8a8a56d76991663a8190a95057d33671e73c7cbce5a98d31ef0d73bd0b163787b7fdcd2ddfc72960f2be320846d4b29080d7aeb5b7ea645a2ad5a59c012bf7b9515d859e1c1472ef8a4d3c95e711af97ae4618efbab3dffe88c9f6af4a09b0e73387e251b77d7bff5214f791862db6988411e2ae2c75bf28d28602a637c26f49c18d309d2fc58a126667ad3c2ec160c99ba40fbdac17e7e4c21a5d507859762eba09c4160df66f5feefe6715a28c5296cf43e5e771f31fce5133be97cab57301b4c9df9cd9a4acf1c33fac946fa1596fa65c8f3658be47a473a62c52181eca183e4246cd624d8783dcce5fdcc1fea173f8071f7074f55897de9bfe84a6c4fdf802d5026b8145e6c8c8950afc5b40fd0356fc55ee17e1f853a4c2fcc34a1369b87d28dc2fd2010f19903aff8e46de04938f4948245d5b425d074acdf2bd80bfc3735cc34a22590f194af9313eef4ab5fde61f1f9b58578638fcb4f2850b2fce6e03db4d0a834848163c4b27e129f5cc74f67f008a2712d1d", "signed": "f0f357410373313b7c6252d6d96600360c23752d431ca8075bcfb772d49cd609b65c9cd838d634d8d9b95d1ee30edecc13e3ca997b2437303f8a33a1ffc83306e8108c6de4133733dc199a73392e226f712c36a24fa91d6fb09f92df218deb2d2830a668fd694b4809d0253507231247c7f258b4d65c56bb69345ef6aa97e7c59e8153775a5a3cf109c4bca9815569da6932e82183425b42d7483c9dbfcbd8eb38c84729571e8ec93982c317716759598c4f6a1b7f8da7306a7815721caf02e70246712314f766be9cb177cd2fa3bda22cd676c5d2e86e8d798fd34f543c9be3129651f273f484f0b9467b140955cd2981ff2603c0bdbb436ac0955a116c5e5fc30425e1fe78f6410f6ef757f604668854bae79bfe22e1a85ce5ee5d6434b4610120ea7e5d3d137ce207514f8534ad9bf392b7dc5355514b59f835466c8eb56f44eddc5bad20cf0b480b2e822a6f46fd95f30f183c7bb3143e4e6100e2dbc9f2bf0d43073e0fe65f01bcce6a1ae401c12541be3ae68cdeac2a4ac71f1663b5fdfc2e50f0e077fb3a0a8b8eeead627c1c3e79dd7361046f7e57c17436c32dc4432f050028cc7aa4408c2d29d1d7998fdcdda32bb32f704dc263db9b8e06c57630870f8bb6ec661fde1b7da94d53b047701a4588478c1c662346741aeac4c25338556a3d848de5b2a23ecea61b776bd0e8037efb8501eff239c7facca6c8367ed7c8adce919fef1a155ae0d5478a98002c95a16fbf4c0ed016ea5d3866fe1de454832a4e9565976b60b3dd2eaf7fee612f2bc040d93975435eebd12f06eb09ecea2c66768308f58c77ac51ed7bd21636fc9cc3fd14870bd06bdf128a81b14792e608c47ea2d535ca7aa21eb8a8a56d76991663a8190a95057d33671e73c7cbce5a98d31ef0d73bd0b163787b7fdcd2ddfc72960f2be320846d4b29080d7aeb5b7ea645a2ad5a59c012bf7b9515d859e1c1472ef8a4d3c95e711af97ae4618efbab3dffe88c9f6af4a09b0e73387e251b77d7bff5214f791862db6988411e2ae2c75bf28d28602a637c26f49c18d309d2fc58a126667ad3c2ec160c99ba40fbdac17e7e4c21a5d507859762eba09c4160df66f5feefe6715a28c5296cf43e5e771f31fce5133be97cab57301b4c9df9cd9a4acf1c33fac946fa1596fa65c8f3658be47a473a62c52181eca183e4246cd624d8783dcce5fdcc1fea173f8071f7074f55897de9bfe84a6c4fdf802d5026b8145e6c8c8950afc5b40fd0356fc55ee17e1f853a4c2fcc34a1369b87d28dc2fd2010f19903aff8e46de04938f4948245d5b425d074acdf2bd80bfc3735cc34a22590f194af9313eef4ab5fde61f1f9b58578638fcb4f2850b2fce6e03db4d0a834848163c4b27e129f5cc74f67f008a2712d1d", "signature": "f0f357410373313b7c6252d6d96600360c23752d431ca8075bcfb772d49cd609b65c9cd838d634d8d9b95d1ee30edecc13e3ca997b2437303f8a33a1ffc83306" }, { "secret_key": "186dcc7efc5ed7e61ae53dc42093bae8f15dd99f0f033326c576ff756950d06d", "public_key": "c8d141acb642aa9bfbd543277c2dca8aa9888eeff04543b3789b21f26aeb0f71", "message": "974364d6c838842ccc4e749e6afd537170dcd8cc50d66654d105482339cabdf74e32935ee219272ea1684fb93c1fab42b5631839243591bd07d3be949b0dd15e3196df196ba752ad1121ac7112d566944e153a4e0619b3a232241f020be0719f6bec918b26828eb1670ecfc73c66844ea3e404c6a2fc01beb403c9d6ca551ad8a6e71f46647fa6053f0314f8124d8d2bc12cc8fa8db95f2b735375201b816a9cf40f83ee4b8671618032de229ce76271d03d2672a1ae4a288c85dcd27fb8452a8132e9ff29e1e89bf11b1c835192c04b13be14f3cde5d37ce96f1dc2a9ccda0c4d737bca1fa220d21bf360b90515bbd226bb2a6c8d5f2ab018d4084e24ee333ce4e39bcb6b46e7aeb4db9b6c65b244d982823a770f9c62a0bde2cbb7ec36840d455187faff4e488a5c608ebdb7db84d87dad3867e3b0d04b64715e16560a62f1ee03df6183fd5e37555da1972fca062d12bb8420e082dacb8debb9c1438541d0da2464ef7ec52263fb9b9a4c469c83323e4819dfdf4fa0a770c3a709254e05314830e87fbb6736c72d9dabe01a310e91ebbfae767a1fcb62f64fa3ba8d53400d6469ad1ccb811fb9e115f14127b13e8364aa2fe80bbc886a10df1b9cc4ae4601f5461af091f526d272da9b203857a4447eabdef439830496a5759c21de65ba3a3c8b8e939c461332a924852c205c7711f3a68a2367a945def4fbe5f81c60cbb7e394a2a49be9ec2aaeb1f330575979446ad9d0d54abd436f2860f0423426f4bbc26b3b9f650d69b10072d747a39e478f455eaa12c7c6e12bfc4536a3594344bd02b620e3e2b4e0d534089dd7b04fa634804567586c62be0391c7bdb0a9fbc1ef3b33211edbf8ef58c2b7a49d06667959d7e5d44671ee7357a10ba0cb1a445ae5d709ce255e92de715975af94b89d4a29c71f9d88c85b6cd11d8b335bf8f2c658e6dd7c3f6c80ad4d0e5a6c87dba7b5b8a8a47e72f4d1d3c743631df9adfcfa45cee0498d5a44a9f75c83b75b2a3c230ff0767d3888f941ee1b6624dd0e12d06ed1ab8bb135ffd379e9de3788be541aadb2d6a7cc601316f21eb9aaa922f56a8e3526c9bd1177fefc2fbe3e430b628eebd6661e3ba2d631c6a8422c241ecd969972412f74da6b1243bf0fbee8a84d52e40aee3f1e4fc831402c62f3576b22e8e3c3dc4e160bc3b6b9d2ce005853812eafc0a4e25ba712279b00ba3f9130ff36e3ef1971dde7508b2792fe64d475688fc6f3313aadb785302e6b7f9a84f2dbc2f3cf060ee08b463736f836dbb262d329684c208492d17d811221be02b65ee28e11b54692", "signed": "8945069787c1c676a84a703cae1e0bacaeffd33e91bec3603e1f13fb170e31e6d7049eda2bf627180f456c3f7aabfcd36c49a8c04f8ae6929ec5ada07b657208974364d6c838842ccc4e749e6afd537170dcd8cc50d66654d105482339cabdf74e32935ee219272ea1684fb93c1fab42b5631839243591bd07d3be949b0dd15e3196df196ba752ad1121ac7112d566944e153a4e0619b3a232241f020be0719f6bec918b26828eb1670ecfc73c66844ea3e404c6a2fc01beb403c9d6ca551ad8a6e71f46647fa6053f0314f8124d8d2bc12cc8fa8db95f2b735375201b816a9cf40f83ee4b8671618032de229ce76271d03d2672a1ae4a288c85dcd27fb8452a8132e9ff29e1e89bf11b1c835192c04b13be14f3cde5d37ce96f1dc2a9ccda0c4d737bca1fa220d21bf360b90515bbd226bb2a6c8d5f2ab018d4084e24ee333ce4e39bcb6b46e7aeb4db9b6c65b244d982823a770f9c62a0bde2cbb7ec36840d455187faff4e488a5c608ebdb7db84d87dad3867e3b0d04b64715e16560a62f1ee03df6183fd5e37555da1972fca062d12bb8420e082dacb8debb9c1438541d0da2464ef7ec52263fb9b9a4c469c83323e4819dfdf4fa0a770c3a709254e05314830e87fbb6736c72d9dabe01a310e91ebbfae767a1fcb62f64fa3ba8d53400d6469ad1ccb811fb9e115f14127b13e8364aa2fe80bbc886a10df1b9cc4ae4601f5461af091f526d272da9b203857a4447eabdef439830496a5759c21de65ba3a3c8b8e939c461332a924852c205c7711f3a68a2367a945def4fbe5f81c60cbb7e394a2a49be9ec2aaeb1f330575979446ad9d0d54abd436f2860f0423426f4bbc26b3b9f650d69b10072d747a39e478f455eaa12c7c6e12bfc4536a3594344bd02b620e3e2b4e0d534089dd7b04fa634804567586c62be0391c7bdb0a9fbc1ef3b33211edbf8ef58c2b7a49d06667959d7e5d44671ee7357a10ba0cb1a445ae5d709ce255e92de715975af94b89d4a29c71f9d88c85b6cd11d8b335bf8f2c658e6dd7c3f6c80ad4d0e5a6c87dba7b5b8a8a47e72f4d1d3c743631df9adfcfa45cee0498d5a44a9f75c83b75b2a3c230ff0767d3888f941ee1b6624dd0e12d06ed1ab8bb135ffd379e9de3788be541aadb2d6a7cc601316f21eb9aaa922f56a8e3526c9bd1177fefc2fbe3e430b628eebd6661e3ba2d631c6a8422c241ecd969972412f74da6b1243bf0fbee8a84d52e40aee3f1e4fc831402c62f3576b22e8e3c3dc4e160bc3b6b9d2ce005853812eafc0a4e25ba712279b00ba3f9130ff36e3ef1971dde7508b2792fe64d475688fc6f3313aadb785302e6b7f9a84f2dbc2f3cf060ee08b463736f836dbb262d329684c208492d17d811221be02b65ee28e11b54692", "signature": "8945069787c1c676a84a703cae1e0bacaeffd33e91bec3603e1f13fb170e31e6d7049eda2bf627180f456c3f7aabfcd36c49a8c04f8ae6929ec5ada07b657208" }, { "secret_key": "0705b336c89ca35ffdde0af0f906eacf623c56c3f76738168e76fcd5882df79e", "public_key": "eaaaf2a15f44b634cef15a638b80207f61099a0796f5d43f3e9d048e6ae796c1", "message": "616fe15fccb3310f9ec7456447dadaf8e0a5fb269be169b0c3ea2cfdaaa55d37937fe75b78324ac278a65047e0ae4f327e97effcb7bed91d09da720b0a101be9e96d0ba85b1ff49d8d1df362d3454f0db6825596101c97e5dacad07ec492d30f2d0cb7e7de4e744bb6a6100b754da847411d09aace8d5d410758b83087db4b5e6297979a21fb65af390952c4f936260e72d7c78327b94aa6cd617278b0ce9e1bd3fbed93b69bc64985dde0e2c4357b502f055ee7b0a0388474dae02d6c1a731f87785d753aeb0d9cfdf85002df566fc2507de7ba6fd035bee17a2e808b4a7588c583375c82407a40ae9eebdf94df2fb8cabf17606c439ea70459b212aae4a3f530ecadc5e88e2548fa643c7ddf5063b2e10673e59d07fe906892b67eb58f9388a56b370452e9977755fc04dfbc77da6c05beddebf0365256b52c9aef8a82173b8c89fbd98cea36a8b896fe66d37ca79bec7fbfe958fe89f6765085b335dc770343e230caddfa2833daa662fe8208dd885a6fdf72e36ecf22bbbbcbe79d370650236940bc2e6d4ac74fe4d554c9bc232f07d2af6220d157bd2da6a6612a081b4c9904a2869b137ee3a0856f12b2eb8762db94ed0ba136f23e7fb4bd1fcdee10dd84e2cd3b0a49148ac74db466dbeef81e6a8ce0861102de9b1a3e1dcf5c6b0308a82e3ac7c2283c7cc2f34ffa145b9f74b79904b32b79e960b814aade63a0df0167dcd24ed90a8da7b934c772932f5a478fe2a72f945a13096ec37ce764b581eb89e5f6b2bd7eb88b85a89587774d458c58cd879457973d648ef771c5f1deb27a0cc5b29246ac2fa12d18ddc6b9f9ac9cf146c3f22b1e4499adeefbcd2249740e13a224e7b6b3ef15605e7e74e68d7b72642409b90c4ec161eb24c9b40ff9c7e6e5da98322aca52c46a8ddc190f1cab157c4c7619601a6b33df6a50da661bc75360dff69750d3457409cc0241c3e8c4b3e506d426af52b70231cd6c91260cc431e4ccfd496ca14ceaae1cda78721e16339d52682b6951f966c7da5c6e10d919ae66a9f52dec10867538d3df6d593a32db695a8d7745703516ea56f8c1c8f0ef53bdeb7f53c2d944f511940ccb90624922ac599f4619c3046207d605f6ff94de788d25342229dc8af92b5fdf0dd71df2b446cdf1d9a20524339ee1c31826287ef72781a7a35289f85a15ba57c7fd5d885bd0553ab40805f517e8f1b1b3c4fc6771e6f224bc031124b9c9aeb19c5a96bf1488e1e66c6e88809230c83a74155554a219ec379ae54a9fe79dbede3d576042a635d197f4d818c778755b8b45e513deac88f60425", "signed": "d4a9bae8ecc472c376bab805c2ce0c1c2ed5fc773715468cb1a4934564dacecf438b1dd2ac1b5c5e336a1e20701d5dcf3c8ee3ad223b139fa90a1b552e1b7707616fe15fccb3310f9ec7456447dadaf8e0a5fb269be169b0c3ea2cfdaaa55d37937fe75b78324ac278a65047e0ae4f327e97effcb7bed91d09da720b0a101be9e96d0ba85b1ff49d8d1df362d3454f0db6825596101c97e5dacad07ec492d30f2d0cb7e7de4e744bb6a6100b754da847411d09aace8d5d410758b83087db4b5e6297979a21fb65af390952c4f936260e72d7c78327b94aa6cd617278b0ce9e1bd3fbed93b69bc64985dde0e2c4357b502f055ee7b0a0388474dae02d6c1a731f87785d753aeb0d9cfdf85002df566fc2507de7ba6fd035bee17a2e808b4a7588c583375c82407a40ae9eebdf94df2fb8cabf17606c439ea70459b212aae4a3f530ecadc5e88e2548fa643c7ddf5063b2e10673e59d07fe906892b67eb58f9388a56b370452e9977755fc04dfbc77da6c05beddebf0365256b52c9aef8a82173b8c89fbd98cea36a8b896fe66d37ca79bec7fbfe958fe89f6765085b335dc770343e230caddfa2833daa662fe8208dd885a6fdf72e36ecf22bbbbcbe79d370650236940bc2e6d4ac74fe4d554c9bc232f07d2af6220d157bd2da6a6612a081b4c9904a2869b137ee3a0856f12b2eb8762db94ed0ba136f23e7fb4bd1fcdee10dd84e2cd3b0a49148ac74db466dbeef81e6a8ce0861102de9b1a3e1dcf5c6b0308a82e3ac7c2283c7cc2f34ffa145b9f74b79904b32b79e960b814aade63a0df0167dcd24ed90a8da7b934c772932f5a478fe2a72f945a13096ec37ce764b581eb89e5f6b2bd7eb88b85a89587774d458c58cd879457973d648ef771c5f1deb27a0cc5b29246ac2fa12d18ddc6b9f9ac9cf146c3f22b1e4499adeefbcd2249740e13a224e7b6b3ef15605e7e74e68d7b72642409b90c4ec161eb24c9b40ff9c7e6e5da98322aca52c46a8ddc190f1cab157c4c7619601a6b33df6a50da661bc75360dff69750d3457409cc0241c3e8c4b3e506d426af52b70231cd6c91260cc431e4ccfd496ca14ceaae1cda78721e16339d52682b6951f966c7da5c6e10d919ae66a9f52dec10867538d3df6d593a32db695a8d7745703516ea56f8c1c8f0ef53bdeb7f53c2d944f511940ccb90624922ac599f4619c3046207d605f6ff94de788d25342229dc8af92b5fdf0dd71df2b446cdf1d9a20524339ee1c31826287ef72781a7a35289f85a15ba57c7fd5d885bd0553ab40805f517e8f1b1b3c4fc6771e6f224bc031124b9c9aeb19c5a96bf1488e1e66c6e88809230c83a74155554a219ec379ae54a9fe79dbede3d576042a635d197f4d818c778755b8b45e513deac88f60425", "signature": "d4a9bae8ecc472c376bab805c2ce0c1c2ed5fc773715468cb1a4934564dacecf438b1dd2ac1b5c5e336a1e20701d5dcf3c8ee3ad223b139fa90a1b552e1b7707" }, { "secret_key": "95174a0915684cdbb619b055495b00f19282cffc3b05019e6ab709a4a1742bab", "public_key": "aa8c872d7e10b67f7ff24172c3637e80825a0a71ee0c48863a2acdcbe8da459a", "message": "5e1a7400456cad4f9ba86643bc7cbf3b3568dcb522b37055e8c39d3c80f2284238e5727fd7513cc8b31c57ae7b4050aa819fc2360930eb0dd677a5b2c729feb2da3ad79ae7fccdddb6c08446261ec9bbe59c64e99abbc86d3c4835f00fefe527433a501a3b6d572cf5e12a88010b46a472b9bd8691a407c365f9f71634b4d97edfdff06314c0c1b4eb93c7607f1d6fa354659322c284073f42602518c54fdf26ea2c27c80a6dfa20568391ab357282c06b23bedc1df1264b611c1e9cf18aebe249fd8617c6e3ee98c53c0f6f2175c57ef8e206bd3cf105627a9892eb689920213aaeb63d87663dbfa53f0fb281626948296b2dbcdde1c51af862eecf1cfe8a46a2c4b28cfe7130330ad173f87127aacaff43c0bddea48b0038976e662c04b6b04ad03de12462c2765db535049520cc114afdb6c92549b0546a9027d449755beb8d4c17e6a2a475f9676a337b4e866d96325e389a52c16c51e18e0d8103340c8417b2c57a55d042ff5e5fc65df423e0092b0ea88b96a907c95121c547a68061f27bcfb58ce6c07728d4846bdcbf0c625410edf8dea8cb4c9d0bbeefcde19273365f48d75aec07d1c22ccd23068a97c3fe752e87a30118fe2dfd5218b6b125154e0ea386cf239e3137f8ca6d8b746b6a67d508cf8c1ab63e5715e6721eda5c2bc393a493dbd2f9a1fa926b9a59e45a180aeeb02599a8cdd686f889b4852723cb6dbfb5014cab5f658a309a472239360eeaf64fc8203a3c708970e15cbcf136255d96446c39a927031d267d69ecd51d7af6e91fb4aef9d78c3335e9071133cfb8e2129990c64637c7adf1daef2dc26c1163399f3fe1e792338092ef6f8dfaf25730dd2fe8d978f6f770f52b68238176564cee5fbb9850b3b3a04d948460417826eb2eb24fcc5fe35334bb9521e87bc4dbde2ac9e1c98949dc2d29ad279e3884b905268ebd0808bf418257e75e262b4d01b024a6e9aa7bd501dba94ff506394b4b0ae6081ea73030c43a6a91766e80f9f42c0b68b98419ad4eee4e9a728adefbd79e831f70f41e62b43f0bf42b3b2cd53b5589117664bcebc409a7645b1eedda482f6b6895a657ba789b89e502d6998751d6303ded5fa156ee7c7eafe54626d1032c4d7dff977f1dcc86af89b1e646a4afc2427ed02c0af5d32890f95f13f98c1a5b1d9fbb781a9a89b2d790c1465c2d1520926fdf28c17d9ba1587ad761f065d339bdbe38f4133f45bb5978742642f90c065ee4892573f6059f8b4ce2c13e73b891cd05f23731ed9a07e2b8ffdc963b06a510209c329980949f40d8073a013ef843dfcc4a3394", "signed": "780f40c20fea3b11c9422a43b9a6f79611e7f1f59d1488c15a5fd2d32c07dadc391c38953edf0de48be52da2af335c47b8d2e44ab9d3dfb76ba538b0664952085e1a7400456cad4f9ba86643bc7cbf3b3568dcb522b37055e8c39d3c80f2284238e5727fd7513cc8b31c57ae7b4050aa819fc2360930eb0dd677a5b2c729feb2da3ad79ae7fccdddb6c08446261ec9bbe59c64e99abbc86d3c4835f00fefe527433a501a3b6d572cf5e12a88010b46a472b9bd8691a407c365f9f71634b4d97edfdff06314c0c1b4eb93c7607f1d6fa354659322c284073f42602518c54fdf26ea2c27c80a6dfa20568391ab357282c06b23bedc1df1264b611c1e9cf18aebe249fd8617c6e3ee98c53c0f6f2175c57ef8e206bd3cf105627a9892eb689920213aaeb63d87663dbfa53f0fb281626948296b2dbcdde1c51af862eecf1cfe8a46a2c4b28cfe7130330ad173f87127aacaff43c0bddea48b0038976e662c04b6b04ad03de12462c2765db535049520cc114afdb6c92549b0546a9027d449755beb8d4c17e6a2a475f9676a337b4e866d96325e389a52c16c51e18e0d8103340c8417b2c57a55d042ff5e5fc65df423e0092b0ea88b96a907c95121c547a68061f27bcfb58ce6c07728d4846bdcbf0c625410edf8dea8cb4c9d0bbeefcde19273365f48d75aec07d1c22ccd23068a97c3fe752e87a30118fe2dfd5218b6b125154e0ea386cf239e3137f8ca6d8b746b6a67d508cf8c1ab63e5715e6721eda5c2bc393a493dbd2f9a1fa926b9a59e45a180aeeb02599a8cdd686f889b4852723cb6dbfb5014cab5f658a309a472239360eeaf64fc8203a3c708970e15cbcf136255d96446c39a927031d267d69ecd51d7af6e91fb4aef9d78c3335e9071133cfb8e2129990c64637c7adf1daef2dc26c1163399f3fe1e792338092ef6f8dfaf25730dd2fe8d978f6f770f52b68238176564cee5fbb9850b3b3a04d948460417826eb2eb24fcc5fe35334bb9521e87bc4dbde2ac9e1c98949dc2d29ad279e3884b905268ebd0808bf418257e75e262b4d01b024a6e9aa7bd501dba94ff506394b4b0ae6081ea73030c43a6a91766e80f9f42c0b68b98419ad4eee4e9a728adefbd79e831f70f41e62b43f0bf42b3b2cd53b5589117664bcebc409a7645b1eedda482f6b6895a657ba789b89e502d6998751d6303ded5fa156ee7c7eafe54626d1032c4d7dff977f1dcc86af89b1e646a4afc2427ed02c0af5d32890f95f13f98c1a5b1d9fbb781a9a89b2d790c1465c2d1520926fdf28c17d9ba1587ad761f065d339bdbe38f4133f45bb5978742642f90c065ee4892573f6059f8b4ce2c13e73b891cd05f23731ed9a07e2b8ffdc963b06a510209c329980949f40d8073a013ef843dfcc4a3394", "signature": "780f40c20fea3b11c9422a43b9a6f79611e7f1f59d1488c15a5fd2d32c07dadc391c38953edf0de48be52da2af335c47b8d2e44ab9d3dfb76ba538b066495208" }, { "secret_key": "5a84af28a5dfbb3233a12f0837f6e8654e7b0de16b02ab3cd17864431e274667", "public_key": "80d4ba789f8a4b2047adafa5ed26cd8c546733292e8bf693cfd17e284efc6871", "message": "8aacd1b8a39bf08fd5c918446be576e6a3f27f36111607f27b56a91214e763f9a87fb1d1844898961797644460bff5488c103af605e8740e46588fb93e443c3bb23b92c09870a557653a1f22c218ccbc2f073a272d17a84223ef143f4c7ca258460b798169673da107d71d5356ce9f7559a9b038399951f575c77e5b9d0529578ecaa2e2089266fc526c5d409fbd46bb86841cb554f5bd3c99713b043e404653a7d01344d4db831a217282c4b336405653b85d27a46b259c855cdd85ad6f7aedd835ff5500cc8baf0fb2f0180910c64672b8a8d49d984a78293cf5779c910c3acbbca455a85466e535044f3480262c090fbf4e0b0db4d1ef8759daafdd8d05907482461ff910c437195d5c7fed9d82cb94e7e4ec24da053e47f62b488eb7b244655c7dbb20ed607eed4531449e0780e61cfd574086ffc5dc524283775c44f7547cdab04a51eee4e1b7b65a57573a92484a35900a909f81e415029d22ca937a3acd9e61f8c0e686b2d2ad0377af8ee166e4a20a82aff451e151103e0a1767b271fa9c2b1dd120f805853b3b8a560fc8b9376283b51124324a284a0e9ac49df69f524c8e042df82efbcd16881ec131a15210df73de02943447f22a2ea1dc8bf968298ee97f3ad546d78bc660897e08d2a28b2ba68b54b954f1476451c69207e5dd248ae47ef35694990e6f058bc0017b7495105cc8739066afb11e1f26601942546ae849ff2f56730f1326bbeea640ee178fa247adffefc046494fc7ffc0777d5dbe8a55daee61406fe3c7088d43d9e14da21ca52fd8c160091c8f99a67dad65c64fea9d18b1537d061f5dce879e0bc42648d2eaa02d972185753cb2f6225d8d03bb07f944b10cf4ea22275c3d70848020f30c823b76143acf545999a2cc4b5898d94b4a25efbe5a60331cc009fec0a25bc98947b1b7139e22d23280ff8854a1ec76221b1bf3d108328c8ac463c65263a2d7ca7433482931a1d8fc144bbe9bef678c92e1c2d10921b6ad43a75c53bc075854ed2d99d825f30a5e10d517438e4d4f7113429f1edb387d6bd7aad29274f8d2dc889b7efbeb58686f8d669ceaef92c75ed5307f0c03f5900181ce573c8fa28675205fb1057f626aa230d03e2eaa8cffcde20081475d80b245a1ca6045ba204ab00069079c637fc3fb3e80ca0462e7a4cdd9283ff9008530364816792fdf3b9a4e4dc8379228edcbb154bef387d37760d79afbb736260a1db10138361f24b826dbcd5f0fc9e7830d26d80c52a792189276bce34760fb77be1312ac8cf97d92cbf3d0778028db5e8eae89e0b9bc8778aeb1278f0471cb", "signed": "a0b84ca5af7646e6f62a6935379473fa6e4c27695851fcbdae2917b2dc68d796e278d70cd67fcedf6ca629b881f7c4f2aa2559b20d670611766bd65aa4fef2048aacd1b8a39bf08fd5c918446be576e6a3f27f36111607f27b56a91214e763f9a87fb1d1844898961797644460bff5488c103af605e8740e46588fb93e443c3bb23b92c09870a557653a1f22c218ccbc2f073a272d17a84223ef143f4c7ca258460b798169673da107d71d5356ce9f7559a9b038399951f575c77e5b9d0529578ecaa2e2089266fc526c5d409fbd46bb86841cb554f5bd3c99713b043e404653a7d01344d4db831a217282c4b336405653b85d27a46b259c855cdd85ad6f7aedd835ff5500cc8baf0fb2f0180910c64672b8a8d49d984a78293cf5779c910c3acbbca455a85466e535044f3480262c090fbf4e0b0db4d1ef8759daafdd8d05907482461ff910c437195d5c7fed9d82cb94e7e4ec24da053e47f62b488eb7b244655c7dbb20ed607eed4531449e0780e61cfd574086ffc5dc524283775c44f7547cdab04a51eee4e1b7b65a57573a92484a35900a909f81e415029d22ca937a3acd9e61f8c0e686b2d2ad0377af8ee166e4a20a82aff451e151103e0a1767b271fa9c2b1dd120f805853b3b8a560fc8b9376283b51124324a284a0e9ac49df69f524c8e042df82efbcd16881ec131a15210df73de02943447f22a2ea1dc8bf968298ee97f3ad546d78bc660897e08d2a28b2ba68b54b954f1476451c69207e5dd248ae47ef35694990e6f058bc0017b7495105cc8739066afb11e1f26601942546ae849ff2f56730f1326bbeea640ee178fa247adffefc046494fc7ffc0777d5dbe8a55daee61406fe3c7088d43d9e14da21ca52fd8c160091c8f99a67dad65c64fea9d18b1537d061f5dce879e0bc42648d2eaa02d972185753cb2f6225d8d03bb07f944b10cf4ea22275c3d70848020f30c823b76143acf545999a2cc4b5898d94b4a25efbe5a60331cc009fec0a25bc98947b1b7139e22d23280ff8854a1ec76221b1bf3d108328c8ac463c65263a2d7ca7433482931a1d8fc144bbe9bef678c92e1c2d10921b6ad43a75c53bc075854ed2d99d825f30a5e10d517438e4d4f7113429f1edb387d6bd7aad29274f8d2dc889b7efbeb58686f8d669ceaef92c75ed5307f0c03f5900181ce573c8fa28675205fb1057f626aa230d03e2eaa8cffcde20081475d80b245a1ca6045ba204ab00069079c637fc3fb3e80ca0462e7a4cdd9283ff9008530364816792fdf3b9a4e4dc8379228edcbb154bef387d37760d79afbb736260a1db10138361f24b826dbcd5f0fc9e7830d26d80c52a792189276bce34760fb77be1312ac8cf97d92cbf3d0778028db5e8eae89e0b9bc8778aeb1278f0471cb", "signature": "a0b84ca5af7646e6f62a6935379473fa6e4c27695851fcbdae2917b2dc68d796e278d70cd67fcedf6ca629b881f7c4f2aa2559b20d670611766bd65aa4fef204" }, { "secret_key": "793ac88d7d3b6fa7f47deec31f68ddccb701820f1b13ddc652f7c6a85b6052a5", "public_key": "91b6227acdd183da62c51965c635358b204d683ee06443cbd40e71c1f76ad102", "message": "ec50afad8ade7405e2c6f5c6247bbbccfb2c17166f7884feae10d90f5d83c4b6f0bf76de2f7897ba1194d6d3449ddb80ae74eb8ed68f049b35c6f21916db4dfc2724dc3af7ad8dd5c44f60d2f49fadd7004da1593093942cae5208bf54cf903bee646905fce2eb2e370d0dca48d820adeab16a3b675e5a4a8e267e34ff96f3122b18de0cad9292ab63d26e5f310fa2168c2966bdb63b0de08626767b379de4633b9f3eda7917281dad661e9f772b844a79e800fd842702446e4aa731757107f3fd6547bf4075963d5fd5f58e80853fc42751dca078a9fa8d5bb3d9a34abcab0293d6ceaec48967a1e6224398cad0f605a3be8e6758ea8f29209d8e4c4ca1893baad91e379ba3b17330c12a5b6f219b384a8ab978bf1b37c3731a1b474b24b5d67d4cec28aac6510b11f2cf21bc16963d51f5538727718fc4e2e5172e3c0cdabc277f0d7037c34ca68f73288848b926bde0cf47abfa66600916946f07651c280a2086b14d52570cc8a4b74358b59c302b9d00e1b498f3bc33ee4ecf2bce2c65ed7e8ba74d35b751d3c99f40861968c2b7f3a5be348c57d93b40ffd051edd7caca6ee6bca721dcba8db8d0064f54d36ec5e8d62a71fd1c90f14924f41c163f007afc6fbbfe8645fa47c3c980246d1b92274385953c5341cd64c34ae9717cc2c37f58359c0a9991c23fe637de6cdf0862f7d0329fe758aa892ad4583b9df2f3337d5be570ba654998ed292f11f01772382a04342fdd99e69e0d97c43f10ac9b96f140a6f83c4729e7a900471f2b1df2401bc5c680422b13b0c8007d63681f66a0595a1c5d3acde5b779426e736bc100c5e6f52608dc391e3ef9b1bb6af13d249b7d32ce0680c368f54d5fe039cfe10130251e4db14c79c8d044060465822990d88093cd736532852e447889db89cc60052996a32a64365c0726051c119eda901de576b334fc7049482392e2620b0a3a13fab1d36fc0a5f23db147fd857b26a698048f8b811e23d722e2e9027ed4124b48dc5e578a7aeb19a1b4f948ee5b46f65b979646e2be074714118baa4bfc15b089a0e06627da46e4bb06aa3c7c5dd648e03c9c2dec3facd95626562f3000883230d2b0a1f8a7478cb77f939a5f188f458d1037b90176664d86ea850b8af5087f86605a77e025ef6c7e6a2a59f006cba189fad933f42c532708109bc1af814819595ffcb95fbf5b7e93a71197e477ee7c04b851c1c36622cdd8e6c860d9ab2cac56d2dc98fa69124f2bb2a6471e1c73b661f071f5d86de7d1deafa4edcdc7bf1f705c56300affd058b9697791419e5fb2a5b7f78ce3401ff550", "signed": "a84f552bf44322a6db245ca006d1cf780c61680fe7429a8947c35f21bc4b44228ba30aea0c744b866459d3b8acad453b06ace247ba69528c6b3bc4b20e75630eec50afad8ade7405e2c6f5c6247bbbccfb2c17166f7884feae10d90f5d83c4b6f0bf76de2f7897ba1194d6d3449ddb80ae74eb8ed68f049b35c6f21916db4dfc2724dc3af7ad8dd5c44f60d2f49fadd7004da1593093942cae5208bf54cf903bee646905fce2eb2e370d0dca48d820adeab16a3b675e5a4a8e267e34ff96f3122b18de0cad9292ab63d26e5f310fa2168c2966bdb63b0de08626767b379de4633b9f3eda7917281dad661e9f772b844a79e800fd842702446e4aa731757107f3fd6547bf4075963d5fd5f58e80853fc42751dca078a9fa8d5bb3d9a34abcab0293d6ceaec48967a1e6224398cad0f605a3be8e6758ea8f29209d8e4c4ca1893baad91e379ba3b17330c12a5b6f219b384a8ab978bf1b37c3731a1b474b24b5d67d4cec28aac6510b11f2cf21bc16963d51f5538727718fc4e2e5172e3c0cdabc277f0d7037c34ca68f73288848b926bde0cf47abfa66600916946f07651c280a2086b14d52570cc8a4b74358b59c302b9d00e1b498f3bc33ee4ecf2bce2c65ed7e8ba74d35b751d3c99f40861968c2b7f3a5be348c57d93b40ffd051edd7caca6ee6bca721dcba8db8d0064f54d36ec5e8d62a71fd1c90f14924f41c163f007afc6fbbfe8645fa47c3c980246d1b92274385953c5341cd64c34ae9717cc2c37f58359c0a9991c23fe637de6cdf0862f7d0329fe758aa892ad4583b9df2f3337d5be570ba654998ed292f11f01772382a04342fdd99e69e0d97c43f10ac9b96f140a6f83c4729e7a900471f2b1df2401bc5c680422b13b0c8007d63681f66a0595a1c5d3acde5b779426e736bc100c5e6f52608dc391e3ef9b1bb6af13d249b7d32ce0680c368f54d5fe039cfe10130251e4db14c79c8d044060465822990d88093cd736532852e447889db89cc60052996a32a64365c0726051c119eda901de576b334fc7049482392e2620b0a3a13fab1d36fc0a5f23db147fd857b26a698048f8b811e23d722e2e9027ed4124b48dc5e578a7aeb19a1b4f948ee5b46f65b979646e2be074714118baa4bfc15b089a0e06627da46e4bb06aa3c7c5dd648e03c9c2dec3facd95626562f3000883230d2b0a1f8a7478cb77f939a5f188f458d1037b90176664d86ea850b8af5087f86605a77e025ef6c7e6a2a59f006cba189fad933f42c532708109bc1af814819595ffcb95fbf5b7e93a71197e477ee7c04b851c1c36622cdd8e6c860d9ab2cac56d2dc98fa69124f2bb2a6471e1c73b661f071f5d86de7d1deafa4edcdc7bf1f705c56300affd058b9697791419e5fb2a5b7f78ce3401ff550", "signature": "a84f552bf44322a6db245ca006d1cf780c61680fe7429a8947c35f21bc4b44228ba30aea0c744b866459d3b8acad453b06ace247ba69528c6b3bc4b20e75630e" }, { "secret_key": "89de7442d74ba9385969c9651a88fe28e040d593907dac1a3987418bdfdbad89", "public_key": "fd3ba9fad320eba45d07b84a497be17d3fc7dd9999c968883cd6ac13b0669b17", "message": "9d5272f0b784882b94c76dfb9d460ca495025e0aec5d52ccfffece9f8173c10558266c498525891a97bf3878e33c3de2fc2e52550b431562cbe4a3d011ecc9e77ec36ad38341358c88321c03d08bb426a7d5854171c027ec48d57819a91afd02a618ccbc25e68e5309d047b156e35705373ada2eb831321a203e1bd8f0efecc09618647b41dff22b39d02235f871532f6085e9cc52ec009b33eebcdc267d7767c90c927e154f72f3f48a34956319b293c8a8b3e34efc5f62f2b4e8019b50a08f5ccf95bc831baf40811d87e5edbd2fd5365b26a431ae95800ff381cd62ca40e1866d950dce14f030918abac68e7916ddb95adc1971287874d07eb0edef64296652c48044b0c5521a8d270d53d74ec63b890f3363f9207f6652ae8e7835c3820ad6d9e3633f4bfd5379a44f29d65f3609fe355817dca5518dfe3bd769320a031902e9cf6669c24f88b01eb36995bdb8dbed6ee0c9b7f32295c61ba8905e5598f3c9e1c8bf7264f98293faea17747f88440c31818c433ea3d23c01f4f7e9c3dd3d5f32ec9eacd71a09e3a997381f1cbffdf4b5ba4979deb7b09841afa3b03d1c9311097b862cae11707cbd3a4ae6c8a26a306a687c414a4ea1e812f115f60f70bda7f8fbe7bc2d50cc550bba291d5ec523229a08ed568b5cee18fe6f46782c17cd828801639215bc5e9be4555c9a18009767a6c5c74a8229d2ffaa399d8e64324e884223d5070f735a75d85ff6c94a9fbc2b3651386de5a23cce95c87881c79399ae71f090737e2187fe904aab1d92d6186795c9b46c62a5914f3630fdcbac3bd4b0da4ec3136a1fb2ba40322d7cc4085e167009cf7450fc6a286c2f7951d51aae23b8f33020efb5e3245ba6a3543a2bdec447d51ae00b5e1678b76093cf216b9507c963ebfc024ccd6ef6c78c4572273beaaf55076dc44a224b58615705791965307cefd48672c081bccfbc1d15b062b38b4fba9b9bec956cd14444ee437e7960cc601eddc02f1a76b68574d5f8843150c0b9009934a2bfaf605770c136ba29f3dc7e29597a2480db23e2b2677ec6c51bd301f2b5a39dfda7b477bedd1cdaed10e29d2954629b9876f8ee54e4047369d534cab54aea441dc947eb3f59382b218360572f2659583153c0e2b912cf30c815b26f05853dd30551eecf64b858a441bb8c6db8a9fde77a32a7b46af66f8cb9f35ee0fafb0bd42d9e65b2a9058241a31b8ca1115434237670aab4eff36010ed0371f46595da1bdd579bbb67aadb68e77ad3a38c8f26d2af5a7103ba5f22b42cc12a8c3ce5c921c91cfc0e63df9027d26229b1047cbc18f6b0", "signed": "bab57284d20ee54cc7f9708d717706d8faf6e46332b0691d6f213a8db801155b4e338c1361b592be758501b1821793ae5227cc3ba8df8adfc6ed9acab54cc4019d5272f0b784882b94c76dfb9d460ca495025e0aec5d52ccfffece9f8173c10558266c498525891a97bf3878e33c3de2fc2e52550b431562cbe4a3d011ecc9e77ec36ad38341358c88321c03d08bb426a7d5854171c027ec48d57819a91afd02a618ccbc25e68e5309d047b156e35705373ada2eb831321a203e1bd8f0efecc09618647b41dff22b39d02235f871532f6085e9cc52ec009b33eebcdc267d7767c90c927e154f72f3f48a34956319b293c8a8b3e34efc5f62f2b4e8019b50a08f5ccf95bc831baf40811d87e5edbd2fd5365b26a431ae95800ff381cd62ca40e1866d950dce14f030918abac68e7916ddb95adc1971287874d07eb0edef64296652c48044b0c5521a8d270d53d74ec63b890f3363f9207f6652ae8e7835c3820ad6d9e3633f4bfd5379a44f29d65f3609fe355817dca5518dfe3bd769320a031902e9cf6669c24f88b01eb36995bdb8dbed6ee0c9b7f32295c61ba8905e5598f3c9e1c8bf7264f98293faea17747f88440c31818c433ea3d23c01f4f7e9c3dd3d5f32ec9eacd71a09e3a997381f1cbffdf4b5ba4979deb7b09841afa3b03d1c9311097b862cae11707cbd3a4ae6c8a26a306a687c414a4ea1e812f115f60f70bda7f8fbe7bc2d50cc550bba291d5ec523229a08ed568b5cee18fe6f46782c17cd828801639215bc5e9be4555c9a18009767a6c5c74a8229d2ffaa399d8e64324e884223d5070f735a75d85ff6c94a9fbc2b3651386de5a23cce95c87881c79399ae71f090737e2187fe904aab1d92d6186795c9b46c62a5914f3630fdcbac3bd4b0da4ec3136a1fb2ba40322d7cc4085e167009cf7450fc6a286c2f7951d51aae23b8f33020efb5e3245ba6a3543a2bdec447d51ae00b5e1678b76093cf216b9507c963ebfc024ccd6ef6c78c4572273beaaf55076dc44a224b58615705791965307cefd48672c081bccfbc1d15b062b38b4fba9b9bec956cd14444ee437e7960cc601eddc02f1a76b68574d5f8843150c0b9009934a2bfaf605770c136ba29f3dc7e29597a2480db23e2b2677ec6c51bd301f2b5a39dfda7b477bedd1cdaed10e29d2954629b9876f8ee54e4047369d534cab54aea441dc947eb3f59382b218360572f2659583153c0e2b912cf30c815b26f05853dd30551eecf64b858a441bb8c6db8a9fde77a32a7b46af66f8cb9f35ee0fafb0bd42d9e65b2a9058241a31b8ca1115434237670aab4eff36010ed0371f46595da1bdd579bbb67aadb68e77ad3a38c8f26d2af5a7103ba5f22b42cc12a8c3ce5c921c91cfc0e63df9027d26229b1047cbc18f6b0", "signature": "bab57284d20ee54cc7f9708d717706d8faf6e46332b0691d6f213a8db801155b4e338c1361b592be758501b1821793ae5227cc3ba8df8adfc6ed9acab54cc401" }, { "secret_key": "2622bd9bbef7ff4a87629ea0153dc4d608c31fa5847988ff500d880681f11372", "public_key": "199758a9c3d0ee3eebcbbda3e1ef5455ff46d736bb4ef0c06a739f9ac5848395", "message": "891e82122547d61e83b0abaf27c7303f0522a2ec4af44ef0ac196a9978b1c623ef1fa72baf70910a5c51c4f78e0fe9fe37e2439c4795916cfa22ab471a2557cc7ba6b66956063ddeb39c50f14f06348fa66b6064dcffca5043967f05254d577abf22ae8c90000ce2e6a1a8b2e3a6b3abc563ebffb20445f0911cc42a987f8456efba4130e68f01fcdf7bf771fc1d35371a0d75dd5f90002c90b6cbade40d5b23fdb49abacb7219ae27561aa2a879da88df34a8c581f0c67198ffc608fe9195b5555c8ae934c830aae2885bea87487448e11b4f2f172e4d5cfe4fd113f9d2016c24a734512bb918f575e754139718e3d20e790abb942cba3ec8b2db590796dc435f139fc64ddc85a22494ef2bfa1f5c0f1875ea58e84eb374ecf8cec6468b6b09d1e74f1541ed454a2807d3f4053566b0e4e2c6aeced10dc007e9df416f267fcb3fe17b8bace03f0743e0e6d4a48ce76edff60c0e3a308456995413c1076ff37ecf2381a0d4e9e4a913a258d983b9696b5c45af37c8684070e400b8f865a504043f45d78b9713f335aa416a46166410735fb5d82210458d5a08a104d4002ab61188f9df457dd7ed5937ca5077606b418bbc8684a1d525bfa551087640b1d177ca6d4f6471b39b2ce43afbf8285ecd687e438f4425df568ab86fa2316349a1102b4143d71ef4e24f5c530c77afb0100788636440e740675a6174c5f05710b253a411173f9e82ce6e22f4095e7714b8737e147aa0f23191578ffd93823ce4bf91c1d110982a5da0e4b81bd25b9b9c2142a7671ee937c90fd0715ec9afa44d86046898b42f753589d2268d2aaaa985cc90e0f9e827a3923e7716346f4f8931c72821b3eb645daa7452c8afc898d7975545c12da1bdb209045cb00f4bfd5383df01f003680b973440f1a39c9d820959ef6f85bd33639065aefdc8bcfecbd9b9554049738af29f1294639d3915d632995e8faf713ef2ee3c298b5596fa10c99f946ddb32340695df1c194594eaf3778d73c8ba6040c04eb3a4ff8677936b88e0c5f0441480d107d7ac2202b3b694e57ccca6d825e2a07e812ed29b2c20d5c605471579e3edffc223f242c59391db41e98d5f3d6c5b1e32ac8237fcfd1020543a4041e03d92ad3e2ec552914707c77cd01f3e48011444283f0968fa4deeee55c456ed1f877ade04ac8e8d2cb6c85820b4929b25bf31e925435d6bcc50d3e2e9b85102e970d7895c25ade52161a3b6bf501ab01961cb63ed990aeb93eda3828bf04ca52853c7b6b8e9e49e349d69b53be07485f542b7cdd06b527d41dd119c70b564f1a93aec62ae74e6e8f855", "signed": "4378966b7831def4aecb4989bcaf9cae99461cb9b59d19518cc1ec7b8351bcd1f723aac5f061b38363574ff96ba10e196b1b0531e1183036a425e69c4598040c891e82122547d61e83b0abaf27c7303f0522a2ec4af44ef0ac196a9978b1c623ef1fa72baf70910a5c51c4f78e0fe9fe37e2439c4795916cfa22ab471a2557cc7ba6b66956063ddeb39c50f14f06348fa66b6064dcffca5043967f05254d577abf22ae8c90000ce2e6a1a8b2e3a6b3abc563ebffb20445f0911cc42a987f8456efba4130e68f01fcdf7bf771fc1d35371a0d75dd5f90002c90b6cbade40d5b23fdb49abacb7219ae27561aa2a879da88df34a8c581f0c67198ffc608fe9195b5555c8ae934c830aae2885bea87487448e11b4f2f172e4d5cfe4fd113f9d2016c24a734512bb918f575e754139718e3d20e790abb942cba3ec8b2db590796dc435f139fc64ddc85a22494ef2bfa1f5c0f1875ea58e84eb374ecf8cec6468b6b09d1e74f1541ed454a2807d3f4053566b0e4e2c6aeced10dc007e9df416f267fcb3fe17b8bace03f0743e0e6d4a48ce76edff60c0e3a308456995413c1076ff37ecf2381a0d4e9e4a913a258d983b9696b5c45af37c8684070e400b8f865a504043f45d78b9713f335aa416a46166410735fb5d82210458d5a08a104d4002ab61188f9df457dd7ed5937ca5077606b418bbc8684a1d525bfa551087640b1d177ca6d4f6471b39b2ce43afbf8285ecd687e438f4425df568ab86fa2316349a1102b4143d71ef4e24f5c530c77afb0100788636440e740675a6174c5f05710b253a411173f9e82ce6e22f4095e7714b8737e147aa0f23191578ffd93823ce4bf91c1d110982a5da0e4b81bd25b9b9c2142a7671ee937c90fd0715ec9afa44d86046898b42f753589d2268d2aaaa985cc90e0f9e827a3923e7716346f4f8931c72821b3eb645daa7452c8afc898d7975545c12da1bdb209045cb00f4bfd5383df01f003680b973440f1a39c9d820959ef6f85bd33639065aefdc8bcfecbd9b9554049738af29f1294639d3915d632995e8faf713ef2ee3c298b5596fa10c99f946ddb32340695df1c194594eaf3778d73c8ba6040c04eb3a4ff8677936b88e0c5f0441480d107d7ac2202b3b694e57ccca6d825e2a07e812ed29b2c20d5c605471579e3edffc223f242c59391db41e98d5f3d6c5b1e32ac8237fcfd1020543a4041e03d92ad3e2ec552914707c77cd01f3e48011444283f0968fa4deeee55c456ed1f877ade04ac8e8d2cb6c85820b4929b25bf31e925435d6bcc50d3e2e9b85102e970d7895c25ade52161a3b6bf501ab01961cb63ed990aeb93eda3828bf04ca52853c7b6b8e9e49e349d69b53be07485f542b7cdd06b527d41dd119c70b564f1a93aec62ae74e6e8f855", "signature": "4378966b7831def4aecb4989bcaf9cae99461cb9b59d19518cc1ec7b8351bcd1f723aac5f061b38363574ff96ba10e196b1b0531e1183036a425e69c4598040c" }, { "secret_key": "aeb13ccb90c8cbef90d553da3f6901b3d75c13011f024974daf79a1789c8c632", "public_key": "5faafeb595f16d338f1c72a9f3e498f38bab69a81b37d2d092b7bf7e505d820d", "message": "861a1018d6bdc4805a5c4df87efaa462c68b4bf4065c684c2af131c6377388baee58c6c8f8842362ec6e3bce07c8af55885e82db87a15227800dd33afc5e5fd15701e95f53501b1a6ff83c64e8517149bf3ff011b094a09c673d0fc4a39ee55e69f071177b8aa364e1e256064cf70279cc76695ae49dafcd80ca0a14e1691db946422ec75ab4f7865915a69bd48d89b12adf487d4db9be87cddca211aa88e9bbe849da213989eb0844592ad63e281b2e4afe6a8836006609926c0f787e84f2a95b46b66f0e4555c9483ce2176fc63f7cc9f4f2a22db055aae2e68b30a0da5feb80c2a60ea10dbf67fbbcdbe0be33f2e9c13c469e7768f2ff5960a55eb482ec11d47e154b7c42a5fb756c8ad539b33d125a4a65192c6c9bd576238ca72a73cd179e8cf5cd048ed330213823abbafc3682b2b7f68c5bc46fd09a8cb2a3fd099573ee2e6f28c82e271bb5ef934b0b0c381cfaaec666d717106a874af30aa74125eae9acc2f1f24118cb4e683a731e37e5e464a1ea3d2a53cc0dcad4c17cea9a43e2365f3ae3dd89eb39977420045550745fc267fc7dcc5602e914972a4da6ebeb687f68a0cd7d8b4fdd73722106a8e436b93e5b58f5982acecdecfdb382fe98538261426ba64052557643ce9fec71ea43cf5b6cbadeb4953193ff3ed1a1f922a9af2ec6f338e7fb0affe3d13c33e395873e4a7a7fb044981e05a67197b996b199b43011119363e561d5b8a51784fdff58ab80ed4c49e93f0cf41924f9835efb09f64463b65517b67b15dc3f28ad9a9b2d29468de2c63e62004b6a3fd0c5c2e2aaa6cfa15e4faafa1e2c713e98d3fd25cab9e5170359c8365152b474276ed0037cdf771828e2fb7ccec4895f21adcc5b6887c86e51ad05f255f6e9dad2c41f56b98b7bbbf9fcb6ba8cadfd38ad8c62f92dd87740fa1e1bd170c00b2049c5130fe733f16b1f2c7f00b2ef97b3a95458c53f199d465336d5ff5977806e1afde3eaa246d85cabf7e123481e23929976ed19c40e29ff33d80e7deab19271decd5ee06172b0b0a139bd62a2e7c83a8a65601d0a05d61af9c6032df58001d473e20dd6c6afd78ddbd7cd178e9c271e0572f85982823ce6c402930cf80f5e0c7cda85122a76d1ce021b1e3de2556d1b45ac7b01b59cada25291d638a52a5e7dbcddf96bb1774ab0b077e4b3da5a958fe11dee4a02e69b918ddbfa1c5b3b7dca9f8784bb6b0b9d5a7fee74bb03747f61c2b2f1b492452d3b560b48d39d8721e983752556d44da6b028d9aef8bff9aa379c8e2b0a636d748860abd8e64fc8e96520a34a27f767aa97a8f77b6095218ead", "signed": "0611b19a7472a443e87e54d7c6647faab1b79a83fd4371c92b975400fd628acfc32577ccbbaf03d88f893c88f2cac784c722a08f387abc319a702c868479650b861a1018d6bdc4805a5c4df87efaa462c68b4bf4065c684c2af131c6377388baee58c6c8f8842362ec6e3bce07c8af55885e82db87a15227800dd33afc5e5fd15701e95f53501b1a6ff83c64e8517149bf3ff011b094a09c673d0fc4a39ee55e69f071177b8aa364e1e256064cf70279cc76695ae49dafcd80ca0a14e1691db946422ec75ab4f7865915a69bd48d89b12adf487d4db9be87cddca211aa88e9bbe849da213989eb0844592ad63e281b2e4afe6a8836006609926c0f787e84f2a95b46b66f0e4555c9483ce2176fc63f7cc9f4f2a22db055aae2e68b30a0da5feb80c2a60ea10dbf67fbbcdbe0be33f2e9c13c469e7768f2ff5960a55eb482ec11d47e154b7c42a5fb756c8ad539b33d125a4a65192c6c9bd576238ca72a73cd179e8cf5cd048ed330213823abbafc3682b2b7f68c5bc46fd09a8cb2a3fd099573ee2e6f28c82e271bb5ef934b0b0c381cfaaec666d717106a874af30aa74125eae9acc2f1f24118cb4e683a731e37e5e464a1ea3d2a53cc0dcad4c17cea9a43e2365f3ae3dd89eb39977420045550745fc267fc7dcc5602e914972a4da6ebeb687f68a0cd7d8b4fdd73722106a8e436b93e5b58f5982acecdecfdb382fe98538261426ba64052557643ce9fec71ea43cf5b6cbadeb4953193ff3ed1a1f922a9af2ec6f338e7fb0affe3d13c33e395873e4a7a7fb044981e05a67197b996b199b43011119363e561d5b8a51784fdff58ab80ed4c49e93f0cf41924f9835efb09f64463b65517b67b15dc3f28ad9a9b2d29468de2c63e62004b6a3fd0c5c2e2aaa6cfa15e4faafa1e2c713e98d3fd25cab9e5170359c8365152b474276ed0037cdf771828e2fb7ccec4895f21adcc5b6887c86e51ad05f255f6e9dad2c41f56b98b7bbbf9fcb6ba8cadfd38ad8c62f92dd87740fa1e1bd170c00b2049c5130fe733f16b1f2c7f00b2ef97b3a95458c53f199d465336d5ff5977806e1afde3eaa246d85cabf7e123481e23929976ed19c40e29ff33d80e7deab19271decd5ee06172b0b0a139bd62a2e7c83a8a65601d0a05d61af9c6032df58001d473e20dd6c6afd78ddbd7cd178e9c271e0572f85982823ce6c402930cf80f5e0c7cda85122a76d1ce021b1e3de2556d1b45ac7b01b59cada25291d638a52a5e7dbcddf96bb1774ab0b077e4b3da5a958fe11dee4a02e69b918ddbfa1c5b3b7dca9f8784bb6b0b9d5a7fee74bb03747f61c2b2f1b492452d3b560b48d39d8721e983752556d44da6b028d9aef8bff9aa379c8e2b0a636d748860abd8e64fc8e96520a34a27f767aa97a8f77b6095218ead", "signature": "0611b19a7472a443e87e54d7c6647faab1b79a83fd4371c92b975400fd628acfc32577ccbbaf03d88f893c88f2cac784c722a08f387abc319a702c868479650b" }, { "secret_key": "73872b14762f68dae4fc10dfd6f42d3f9622bf2afe6b34a95649aa387424ee6c", "public_key": "dfab2ce1ab9981aa7cbf3207350007fa6ce6ca60a2ed7b590f3c2f62922d8f61", "message": "433d71781ceab2b47d826e67d39f9b80d2ffd725f8c5aeb40cbe4f9b5f48ef93521ccec604360b9647323190bfef75ac931562d27f4a4e31f46e57bc99fa5158c82e12b737e45c5de9f7dd7c8622d4a7eaadf7202fb49d819c9ad24f8807313c5f37dc20453bdf05c9bf1a3c2117c93e7f3cc8a2542098e8fc1c642fa47b05543657b85f480bc86ec42800bb1422359c7c3e8ff4be598bd54f1dc586acae45a4740622b962742bc86e17cfa63e775354e7707e5079589e8d108b1f11dace0575cb9a6d26b59fce981465d9bc344ea6945a95b862796384fa8170560857457beff95a9b5ac3d6ad282d44929a303026b4bbedd60e2ef055a31f52d7ce8df2ca5d1851c5b167db0809259bb812569074105c734c85d6231273755f3a8b56dc508db5c23dacb7a06167bda51bc01350f016cd41b21e8cc5bc93343a9bb6ea4738c5c84b78fa963c410e433dc598196c22e5b791e12a4b343f7cd47bbb0eb0782bdb1a4e466846a030528eeb89056f73257193adaabc1b229862034878c3258a532548762e29ecc001abd989649da5e144cf35d48699f23bc46c5b34e04a53e72724b2b0b878982575d688e23cbe3a34067f4971e555972ec2908ae5f03e8831ec67755be95687ce6372939e1e2fb6951ec9ecf4bf7d1535431e259f29ad431222b54b65aa7d07cfb5df162a87c4d03481eb441f221d7f58627a14164e7f4c2e3a1d507e899d5358e00829b08cf3aecb8a75b2a31c3185a580e12b13f0642869fffb056723e961aaf6fefe67b4a7c4c93db3fe1f61adcc765569a99c09a3c824ed4a98babeae43efb1f351ba130e22aa97811986be923cc4180a7c4b78bcc140cec15574654aa6d65a06b97ecfa5f3a9355f96e4eeaa7689217b663fba4dab0d99b19c8d8dbf47a157e5d5969a35ef84dff9562edd434e73aee7d0d892dda72a362a22a7e9fa8634a57eebd1a907485ca8921bdc19ee9ee588f395687d3fc8f8c25f2e9576ca60313fbb2c265a99f2cdd5575b1dd530604e9ad6695c9fb35994a8b87d5c8570549a4d329b9fe087069ab7eb0d714a94e19261f86e448f2da9b1cb0c0dbe41d44c3a824783d1bdbd7326051aeb10adab805c5c59d0e83b1c11a2fdd35e444a499ed15dafd83862775f6cdfc67595818407be55ecbf7bf86c73069aace577626a8563536f605042cf7caaf6fc8e3b545b77414df8d9f649b99ee42541da38c3aae627207845b8f414a8074d70868a5c0b07b070c3c653be04076b83cad7b0305d9500aa44455cb860dcc76400af93c3d2efb42ae056f1428b65f122e1c7b9584d814d50ac72efdb", "signed": "8525c346ca3a6a6c5f65c41778599377659870cb6df9a4a0e55b40c35beba55c8e009e5600b6447dc7402ba27749297e8f9528691856f72d2ad761ed1bc15309433d71781ceab2b47d826e67d39f9b80d2ffd725f8c5aeb40cbe4f9b5f48ef93521ccec604360b9647323190bfef75ac931562d27f4a4e31f46e57bc99fa5158c82e12b737e45c5de9f7dd7c8622d4a7eaadf7202fb49d819c9ad24f8807313c5f37dc20453bdf05c9bf1a3c2117c93e7f3cc8a2542098e8fc1c642fa47b05543657b85f480bc86ec42800bb1422359c7c3e8ff4be598bd54f1dc586acae45a4740622b962742bc86e17cfa63e775354e7707e5079589e8d108b1f11dace0575cb9a6d26b59fce981465d9bc344ea6945a95b862796384fa8170560857457beff95a9b5ac3d6ad282d44929a303026b4bbedd60e2ef055a31f52d7ce8df2ca5d1851c5b167db0809259bb812569074105c734c85d6231273755f3a8b56dc508db5c23dacb7a06167bda51bc01350f016cd41b21e8cc5bc93343a9bb6ea4738c5c84b78fa963c410e433dc598196c22e5b791e12a4b343f7cd47bbb0eb0782bdb1a4e466846a030528eeb89056f73257193adaabc1b229862034878c3258a532548762e29ecc001abd989649da5e144cf35d48699f23bc46c5b34e04a53e72724b2b0b878982575d688e23cbe3a34067f4971e555972ec2908ae5f03e8831ec67755be95687ce6372939e1e2fb6951ec9ecf4bf7d1535431e259f29ad431222b54b65aa7d07cfb5df162a87c4d03481eb441f221d7f58627a14164e7f4c2e3a1d507e899d5358e00829b08cf3aecb8a75b2a31c3185a580e12b13f0642869fffb056723e961aaf6fefe67b4a7c4c93db3fe1f61adcc765569a99c09a3c824ed4a98babeae43efb1f351ba130e22aa97811986be923cc4180a7c4b78bcc140cec15574654aa6d65a06b97ecfa5f3a9355f96e4eeaa7689217b663fba4dab0d99b19c8d8dbf47a157e5d5969a35ef84dff9562edd434e73aee7d0d892dda72a362a22a7e9fa8634a57eebd1a907485ca8921bdc19ee9ee588f395687d3fc8f8c25f2e9576ca60313fbb2c265a99f2cdd5575b1dd530604e9ad6695c9fb35994a8b87d5c8570549a4d329b9fe087069ab7eb0d714a94e19261f86e448f2da9b1cb0c0dbe41d44c3a824783d1bdbd7326051aeb10adab805c5c59d0e83b1c11a2fdd35e444a499ed15dafd83862775f6cdfc67595818407be55ecbf7bf86c73069aace577626a8563536f605042cf7caaf6fc8e3b545b77414df8d9f649b99ee42541da38c3aae627207845b8f414a8074d70868a5c0b07b070c3c653be04076b83cad7b0305d9500aa44455cb860dcc76400af93c3d2efb42ae056f1428b65f122e1c7b9584d814d50ac72efdb", "signature": "8525c346ca3a6a6c5f65c41778599377659870cb6df9a4a0e55b40c35beba55c8e009e5600b6447dc7402ba27749297e8f9528691856f72d2ad761ed1bc15309" }, { "secret_key": "67cf27155287be6bfab66215e017c3466322f21e6eb140be4f1bdecf55abfdc1", "public_key": "d070aab295a8af935727c3be442b251db9e774d2f44b3c2424c52fc89656e169", "message": "0ff05297031c892774cb2c01e8ca60ddd0ceacc0b8d591a891e33b19e1be9e363bc6420d6f529f04840b3b08853c835a03e036978b04a4f9ec6be4aef331956190996dea272619f1686d33bef03dbc085a923a0f115b78f653feeb60bb9e45f34fb8be5a4cbb648c7d29956f0d0e96bdd3c8d0649720624cbc2079e84fd6d010241124098459f12af2991d3828770f50b104ea6e5f51fdad30a9b8079d2159e46d64af91d07c10ed19814df2afe660d7d8f2403534e92c62e1ea6d688203bca3d97c2afda83b255520ffe92a33625772513b1fe34fafe32b6a9b8cf994df7e634e686591e5f0073ababc64a89210ba53a4991c11557e0334e6c6a5036c642a318f2295117139085fb34075647006758e32bc00ad109fe803f7ee9f5ec2af4d25c3070abc51cf4d78e13a7ce283d4fb4eb41d3e8ce90238500ae0ceda320ec5922efa10b903748e1e853a3729d24c105439df2f7000123db9b2c01533bbf0d028ebb2fc00dce38ad06328ee9ecd849a6efc3ae884ef6933cfebed055bb2968a0b0676b5729216178c7519ef0788593fc0dcff50d7e0b1ebb3cf49bbd1bfa5c30ea7b88c36e1a1593aef0bb3f9e2091c8589f7414beed8df466a2ed87b2cb5f35f1d31246ceb968609253615d78043517379ee6974a669cb48da6ac2f96d700b7e44a435cfefec402a1e3110e76981924f2601c01dc03546fd4f511649302f0633dfbd25651c5a599c90954489c76a65ec05a7e4cc74616ce25601cc37b804e1f0bcc8651023b12e13568441e8b8ef4c305fcdad3d2b13fa080324b2fd6b61998cf864b658bc7fefcc48a5a7681d7c866c342c7f5d6cf10881522cc710257d25a4c1e352d270e902082ab9541d5900ceffa0914b16b55e0dd3786e98d41720875a148eb4abdb0153856679fb98c0ec485e5f458d635b7861a2b3a8ba5ec2c1444d353980200e5e071808854a268cc76c605c94f37329c36187a41fddf92aabdb4996a0e10b315526afeac80eb2fa32af786a34316b36111ee9352108144d70f7d1723b32f4dbaa82201353411d657713e55e35df78580b1bc08680f0159fa116faf463566aafe8aea69857e72e44ac809ac43f5c45939d85a1a5f4a370a18996c8514a46f34371ef9e5fb204422c934a1d293d101b8c16f99cc073ea366a13a45c437d620d132b74409cbf8b9c075b4163f726aa67e509a24874fc1b1fb6fb7c7355159c02aa13e64badf150356b1841b321f8041e13ed77e8461cfbb8e828488bf517a5d29ff82e7367480a8edddeb5350e7a83423bd0b1c55f7bb424ca04c205723cd5405671e733f391600a", "signed": "c934a3a1aaab78d9269d1e9d13392f72c637bc5de54f04691efc29d473b475025d8d8fe3c523d2d29c41c5f3dec6ca38ce6d68d7ff09b6135ba24d0d32cc15020ff05297031c892774cb2c01e8ca60ddd0ceacc0b8d591a891e33b19e1be9e363bc6420d6f529f04840b3b08853c835a03e036978b04a4f9ec6be4aef331956190996dea272619f1686d33bef03dbc085a923a0f115b78f653feeb60bb9e45f34fb8be5a4cbb648c7d29956f0d0e96bdd3c8d0649720624cbc2079e84fd6d010241124098459f12af2991d3828770f50b104ea6e5f51fdad30a9b8079d2159e46d64af91d07c10ed19814df2afe660d7d8f2403534e92c62e1ea6d688203bca3d97c2afda83b255520ffe92a33625772513b1fe34fafe32b6a9b8cf994df7e634e686591e5f0073ababc64a89210ba53a4991c11557e0334e6c6a5036c642a318f2295117139085fb34075647006758e32bc00ad109fe803f7ee9f5ec2af4d25c3070abc51cf4d78e13a7ce283d4fb4eb41d3e8ce90238500ae0ceda320ec5922efa10b903748e1e853a3729d24c105439df2f7000123db9b2c01533bbf0d028ebb2fc00dce38ad06328ee9ecd849a6efc3ae884ef6933cfebed055bb2968a0b0676b5729216178c7519ef0788593fc0dcff50d7e0b1ebb3cf49bbd1bfa5c30ea7b88c36e1a1593aef0bb3f9e2091c8589f7414beed8df466a2ed87b2cb5f35f1d31246ceb968609253615d78043517379ee6974a669cb48da6ac2f96d700b7e44a435cfefec402a1e3110e76981924f2601c01dc03546fd4f511649302f0633dfbd25651c5a599c90954489c76a65ec05a7e4cc74616ce25601cc37b804e1f0bcc8651023b12e13568441e8b8ef4c305fcdad3d2b13fa080324b2fd6b61998cf864b658bc7fefcc48a5a7681d7c866c342c7f5d6cf10881522cc710257d25a4c1e352d270e902082ab9541d5900ceffa0914b16b55e0dd3786e98d41720875a148eb4abdb0153856679fb98c0ec485e5f458d635b7861a2b3a8ba5ec2c1444d353980200e5e071808854a268cc76c605c94f37329c36187a41fddf92aabdb4996a0e10b315526afeac80eb2fa32af786a34316b36111ee9352108144d70f7d1723b32f4dbaa82201353411d657713e55e35df78580b1bc08680f0159fa116faf463566aafe8aea69857e72e44ac809ac43f5c45939d85a1a5f4a370a18996c8514a46f34371ef9e5fb204422c934a1d293d101b8c16f99cc073ea366a13a45c437d620d132b74409cbf8b9c075b4163f726aa67e509a24874fc1b1fb6fb7c7355159c02aa13e64badf150356b1841b321f8041e13ed77e8461cfbb8e828488bf517a5d29ff82e7367480a8edddeb5350e7a83423bd0b1c55f7bb424ca04c205723cd5405671e733f391600a", "signature": "c934a3a1aaab78d9269d1e9d13392f72c637bc5de54f04691efc29d473b475025d8d8fe3c523d2d29c41c5f3dec6ca38ce6d68d7ff09b6135ba24d0d32cc1502" }, { "secret_key": "18c21c0d0de13d4c64497ef0260d66cfd34216981a1b49391ae5cb0e41436e9f", "public_key": "f7d4dd1e059c36f6d121c0affeb21f0c572b45992f84948b09aafbcd86bb535c", "message": "68abca7c166afe063e477b80e37db224e1a235de8fcdeb7f427af67e001247cc5e057182fd9b6db8babaa658cf3b3fe4b0763bf88d67311b1190be834018cf57a332922413764620ace05445ee019a06dff98b238979ad6d30901befa3c64f6bd8c6eb092c2e62841388fd8c4e8419e2778984896737ed90a2cdb21996aef7c21638d6cbe680322d08996597a9e303f6f5f47940f8c5ba5f5f76383e7e18064a3d2dff5fdf95e90c5eb30f4d8d459ee1d506a8cd29cdc69b6754963b84d67494b35305d10d12b9487417b2ce28adcb10b65cc931fb3381ae02e7af79a02bf99e258a56361090e0b71222b3ac60bf2fb7ba832d034f5b6bc6fa663ae741f76d97c1ac32bcb7411507d518d2f6054b578328c5f67f758ac01bfe6f4d35900f50a5dcd30d2f9261b6bbec4c1d1fc18d2a7e70c4d36c21faf8cf94a587c3a0d1a9cde7831ae626775468ddcd40a8ba18f42b34188de5741e1be8307b1084586515ec015e4e371d29443a40b0c069c641d8cee5e4611862987c3e356b1293b0518b4a4c8ea97fc5a4db1f0129abee72fb8092ea35c2dab67573850207b8e82718999ad99c4c839eac14636bd5e4d8436a270dd90b8e321302e52a92d891ff1891542ae2caa0d66e0f661eae37b25b08bb2e0eeec4838009778cd525984380983b2baadd7102a1e356734e41d76183829ea9ab8244c336597ca2d67988f281438467e453f562c67b22d0a4dd9fcb46a5f80d299db5f01f59160a19d74c644fa5a940e32c9d8d983bab7efb0d7c7da4e3fda1cd0d18a4558eb9fe46408aab5085912bf2f46ab63a9354f9027c93691223ffaab8463bac4c4bc3b11abc46ba68717c91780d3f30470dbdd88b3780a194c8a40a2c0a81a4d56dec2d8962c34d2ab73369028e1bfeaa6bb58241ff4f898f80ad3bb1c691b8647f2c6983954c1c77957458eebf1c5055c31693abced05384735a4f741968bd6ac31565cfee71c884c1e29e9e7ae0f7ecd04d463b1dc389c36037e81458dcec61d0764032dd589b92afda2fc9028f41ab53cca2d04ec6a9565955cbcf1a3463989c7139bb902a5921e8b2c99c48e13711f0bcc399259516c81ae942a679d4ba33979eb12fcd2860602e4724b1330f1cd257b5b2891daee8ef4c92fc3bfdb34e532d5870f3805986ac97b503fd85873548e30950000f8a70be51fa757603501f2d30e852efeac4826862aed7f6d20c9a8c8dbe362dfee41893f27e6fd5e91d0e7e3d4fd8155f44fd8ef17af14a848d44a87631aeee751462b2a54087068daeab3ea3289ece6212b3b52ce7a8886df2a727b72a570c2fb9c50341", "signed": "c9c099e21d095afadd4e71c9abf6b7083324776225b587b60a0e6092ecb3d33cff39c67d34776ae99dda754a3c2b3f781135a38c78ed6455aaf0ae0c313b620568abca7c166afe063e477b80e37db224e1a235de8fcdeb7f427af67e001247cc5e057182fd9b6db8babaa658cf3b3fe4b0763bf88d67311b1190be834018cf57a332922413764620ace05445ee019a06dff98b238979ad6d30901befa3c64f6bd8c6eb092c2e62841388fd8c4e8419e2778984896737ed90a2cdb21996aef7c21638d6cbe680322d08996597a9e303f6f5f47940f8c5ba5f5f76383e7e18064a3d2dff5fdf95e90c5eb30f4d8d459ee1d506a8cd29cdc69b6754963b84d67494b35305d10d12b9487417b2ce28adcb10b65cc931fb3381ae02e7af79a02bf99e258a56361090e0b71222b3ac60bf2fb7ba832d034f5b6bc6fa663ae741f76d97c1ac32bcb7411507d518d2f6054b578328c5f67f758ac01bfe6f4d35900f50a5dcd30d2f9261b6bbec4c1d1fc18d2a7e70c4d36c21faf8cf94a587c3a0d1a9cde7831ae626775468ddcd40a8ba18f42b34188de5741e1be8307b1084586515ec015e4e371d29443a40b0c069c641d8cee5e4611862987c3e356b1293b0518b4a4c8ea97fc5a4db1f0129abee72fb8092ea35c2dab67573850207b8e82718999ad99c4c839eac14636bd5e4d8436a270dd90b8e321302e52a92d891ff1891542ae2caa0d66e0f661eae37b25b08bb2e0eeec4838009778cd525984380983b2baadd7102a1e356734e41d76183829ea9ab8244c336597ca2d67988f281438467e453f562c67b22d0a4dd9fcb46a5f80d299db5f01f59160a19d74c644fa5a940e32c9d8d983bab7efb0d7c7da4e3fda1cd0d18a4558eb9fe46408aab5085912bf2f46ab63a9354f9027c93691223ffaab8463bac4c4bc3b11abc46ba68717c91780d3f30470dbdd88b3780a194c8a40a2c0a81a4d56dec2d8962c34d2ab73369028e1bfeaa6bb58241ff4f898f80ad3bb1c691b8647f2c6983954c1c77957458eebf1c5055c31693abced05384735a4f741968bd6ac31565cfee71c884c1e29e9e7ae0f7ecd04d463b1dc389c36037e81458dcec61d0764032dd589b92afda2fc9028f41ab53cca2d04ec6a9565955cbcf1a3463989c7139bb902a5921e8b2c99c48e13711f0bcc399259516c81ae942a679d4ba33979eb12fcd2860602e4724b1330f1cd257b5b2891daee8ef4c92fc3bfdb34e532d5870f3805986ac97b503fd85873548e30950000f8a70be51fa757603501f2d30e852efeac4826862aed7f6d20c9a8c8dbe362dfee41893f27e6fd5e91d0e7e3d4fd8155f44fd8ef17af14a848d44a87631aeee751462b2a54087068daeab3ea3289ece6212b3b52ce7a8886df2a727b72a570c2fb9c50341", "signature": "c9c099e21d095afadd4e71c9abf6b7083324776225b587b60a0e6092ecb3d33cff39c67d34776ae99dda754a3c2b3f781135a38c78ed6455aaf0ae0c313b6205" }, { "secret_key": "db9aaee198cd26a52b1181fa3fd92abe425e666d890bf969467dd2ce280ed4a7", "public_key": "3c897cafe2b499ecb2e1dd01ea55f3fc88f68c25b64a636b31a1fd1c78f37f3f", "message": "47fb621561f8b7eecec6033f2bcb6f43ac68c958dfd2656f52a0c29b4acd44f4304c6bf77eeaa0c5f6d3b22db19699c3dcdede698abde623ec4b2b90910c80ac3af39c550b6dd409e63d77706655a9199cb5c0258f5ba38285ffdc64b8a8f373d1fb29ba87f84ddf5f34d8f140bbc17b3961682df5d0a8f9102e379a9998139dfe40ab8ce753bf5626108237771a7d8e109e9e0afe9b66d0420942e163a4f3c03f71813ee078bd090ac3d0772e2622c259e682552c75b08dd055a4a5eb5e609440bcd3f3a6feb876fd16921520c6cb6884710d2e15cdad6daaeed95962dda21c6788f784917917982e1ccbb5fdd9bdc1769db6b6db57ca354e01a1339d8e77e9dbbb5812fbab6a14c54085c0659599f150e22472470f1e5e672c425f375f9e0d6e8d52fa17b7a8d7a4d7ca3e12f4db53836aed2bebd74589baca8ce9100291bfb7e456db7f2f0a84dc0a7488851366a9a5fea0e3efc74b9cdd4bd97b65abf361393ce1703d8571805ee68a13d3654f03dcecfb77a53430d09496ad73ec01759957e51046aa7396f592338650117ac7b4dd3573eb53d9c9f9dfa62e2369c77af9c0d42f61bae74b287ddfa27b7f1c1be9883a044691d56dc13734ad4ee3a32a9f40e328c500d0fed8ea0510e938f2758004022bcaa6902bda1014b8ae3365272829ed94faba63cb14a36cf81390eca83fc1c627172013261b3993779aa076a5c5d81d90d27062e1a6d90b5cf1005c701917b7adac180cb75bbce0f27f2f180e2cb90140c14cc6009d2d41aab1db9418f91d4cf394002cd70ac9dc11ce865347fa3f56f87c149e2b17d2c72b663a58e3187bb19b9bac2d11483ba12f770ac04dc46d388518fa54dc152e9a9dfbff14f14c61cb375897e30c53e6de42d5e1401dae1b22baaa0e8a41c6af9d0e0b13a91a23d9b7d5552047029a3521946c7120d3d258b3aefcf754d1959487a1fe7743ac7e1cc89e368b197809c3a27317e0ec48d546db1e21eb629a29bc6247cdd4a1371437563edd12faea2c5cb77eededbfc58008fad1f65af35843fa274c734e3fbbaa9cc50d683748b75a485f94d630b032a5f1067d1deb30e9d2218c935c981d01c0c547fd68413136edf4c0c770286e823442e1c513651929213c121c1de700989141ab4af3b3fe7404b4d2a38c530bafb498e64953ce1c0fb7d340e21135bf8afdd8dd65b1b18cf1c8fb9f402b2670400b86ddafb184cc51d5fda273b80c26521f912f3583b4ae301dae151cb55c75703aadef032415227d53e395db6c150a1ee839ad26bae552e1ab736214dc04b0f3c41b7cfbd049681bc84c3d16530768", "signed": "b2e3d9c5d0ff329996bc89d26fb3ac126bded313cbf8df86718638c199e057273d09eb163c6c181fd8bce51f72d4d9d2e84abbe08330773b9fcc2166f140d60e47fb621561f8b7eecec6033f2bcb6f43ac68c958dfd2656f52a0c29b4acd44f4304c6bf77eeaa0c5f6d3b22db19699c3dcdede698abde623ec4b2b90910c80ac3af39c550b6dd409e63d77706655a9199cb5c0258f5ba38285ffdc64b8a8f373d1fb29ba87f84ddf5f34d8f140bbc17b3961682df5d0a8f9102e379a9998139dfe40ab8ce753bf5626108237771a7d8e109e9e0afe9b66d0420942e163a4f3c03f71813ee078bd090ac3d0772e2622c259e682552c75b08dd055a4a5eb5e609440bcd3f3a6feb876fd16921520c6cb6884710d2e15cdad6daaeed95962dda21c6788f784917917982e1ccbb5fdd9bdc1769db6b6db57ca354e01a1339d8e77e9dbbb5812fbab6a14c54085c0659599f150e22472470f1e5e672c425f375f9e0d6e8d52fa17b7a8d7a4d7ca3e12f4db53836aed2bebd74589baca8ce9100291bfb7e456db7f2f0a84dc0a7488851366a9a5fea0e3efc74b9cdd4bd97b65abf361393ce1703d8571805ee68a13d3654f03dcecfb77a53430d09496ad73ec01759957e51046aa7396f592338650117ac7b4dd3573eb53d9c9f9dfa62e2369c77af9c0d42f61bae74b287ddfa27b7f1c1be9883a044691d56dc13734ad4ee3a32a9f40e328c500d0fed8ea0510e938f2758004022bcaa6902bda1014b8ae3365272829ed94faba63cb14a36cf81390eca83fc1c627172013261b3993779aa076a5c5d81d90d27062e1a6d90b5cf1005c701917b7adac180cb75bbce0f27f2f180e2cb90140c14cc6009d2d41aab1db9418f91d4cf394002cd70ac9dc11ce865347fa3f56f87c149e2b17d2c72b663a58e3187bb19b9bac2d11483ba12f770ac04dc46d388518fa54dc152e9a9dfbff14f14c61cb375897e30c53e6de42d5e1401dae1b22baaa0e8a41c6af9d0e0b13a91a23d9b7d5552047029a3521946c7120d3d258b3aefcf754d1959487a1fe7743ac7e1cc89e368b197809c3a27317e0ec48d546db1e21eb629a29bc6247cdd4a1371437563edd12faea2c5cb77eededbfc58008fad1f65af35843fa274c734e3fbbaa9cc50d683748b75a485f94d630b032a5f1067d1deb30e9d2218c935c981d01c0c547fd68413136edf4c0c770286e823442e1c513651929213c121c1de700989141ab4af3b3fe7404b4d2a38c530bafb498e64953ce1c0fb7d340e21135bf8afdd8dd65b1b18cf1c8fb9f402b2670400b86ddafb184cc51d5fda273b80c26521f912f3583b4ae301dae151cb55c75703aadef032415227d53e395db6c150a1ee839ad26bae552e1ab736214dc04b0f3c41b7cfbd049681bc84c3d16530768", "signature": "b2e3d9c5d0ff329996bc89d26fb3ac126bded313cbf8df86718638c199e057273d09eb163c6c181fd8bce51f72d4d9d2e84abbe08330773b9fcc2166f140d60e" }, { "secret_key": "a804c33b4d38cb3ce31cf3bac1049e0d4ec63a1a0b7b59fd8a36ee37541656aa", "public_key": "6072256d6574a293bd7c221c551c32cf2f7715e19e433a49d9b8b0490e56ef62", "message": "dbfe307f2aae9e07ec7c4b682106d2c9367b0c4aaa58ae804e0a3904754e6cf8fee73cf9e2d45d0289e5078293dfc469d46ea67026c5aa692d2f2c9fb4ec57cdab4c043ff9ae6185f27a704454e5f53950aabd25c9910474d45af8836862723e0e6a27823d82bcbb68a96052422a1819512e3b43408cf48957ad6ae235b7233df18284749153dfa57de35074a30edfab8a56df28ab2e2940306c221aa55490cc664e14683f30ee615e2d93fdf971f596663465843b3add6392ba3390311ef8dc59f251445d669e10a0061991e113561923aa215244463d8264199ac588924e231e8419d8685f338e599b5f40bf9bd1aece772535bbbcb8f6881c2e800491ab3b57b44b8ae43aeb5c4ae5e7edeb228fedc9f6b9cadea176e134936ded60af1c228734fb00570f2374bbbfa1bb170785805d6b6c701e820952eae45b8c2366113a1dfb2e35852af419b754f9cf7a081c3dde6c8053bf1ce0c85339d5699c422476fc21f26ce75d2a7fed09fc0f4175789847d876c51aa4e0bf7ce842b8308dc7a28c8239520714dc233136e09f557c7ef3e0f83bad63cb28ac616d3928f3837dce1dd58acb8ddbc72e822deee45f00776acc88e00cd3a9db486d92d535a57a0fdc4f903b62e517221c308cba2e30ffe7b91937a99417721f56fe6df44840e9e41136929c0ca3dc28ddf2379e4dcfde83723e2d4c9e23299c056afb31d3e70d085d0a312c5cd570b699dea8717458531348c96f6eb52d7ee61d5660f65e909a14ce1033dc853f2f25d09cf4e40d07eff72e15a390564a2be3c042d89a68660a97ffacec4967a4b618712d7060756520c29ee8d9220ad8615c4fcf3969bd3b2e0947e1f0be7e2d80e0a61480c3166db5582218bb0a8be9848efd41b6ce0cd795c486abb67210beb60cd078b46aeb7f4f485031902bcd7131e00b7035aa2d43fee063f7f30bd570da1dbb65c0ca92a4812632e432778553e35e856caa8218221fd6316ab0869173b38409bcefe6d2db9210f9024173b66dbb92677cbc71c8a1cd583fa6f354d3c93fa8b16c71374f25a00c332f85a8befd540388fb50db9f5d96e4e4e698833ce3d63c10b8eec70a243b9015db459431b62f5668bba60f0704f6bdfe9546ea475cef2ebccba4b7680848e82beff5854e49f65bb773a4922e90f9b8afc7cf818730588ed5aa7b399826aadd54372fcb761458b64de66857f4adacd4c32900cb77136a535d7bbbb554597aecf39ff698b45e6a218df1d2abe615eb8d9e1824c0becce90767899ebfd2c730144b32c74604c0e53e2505bb15d28007a87b9931d6eec0a6cb5b0f96d3194b2423", "signed": "b1b44a142a7c4c3d0bf4661edac5b767005726c14a2769b7c214fb58737ec2e4bc51c3a195d2ba1b74a54eff4c33a90f41ccdefa9e9365fde8dd859fd3978c0adbfe307f2aae9e07ec7c4b682106d2c9367b0c4aaa58ae804e0a3904754e6cf8fee73cf9e2d45d0289e5078293dfc469d46ea67026c5aa692d2f2c9fb4ec57cdab4c043ff9ae6185f27a704454e5f53950aabd25c9910474d45af8836862723e0e6a27823d82bcbb68a96052422a1819512e3b43408cf48957ad6ae235b7233df18284749153dfa57de35074a30edfab8a56df28ab2e2940306c221aa55490cc664e14683f30ee615e2d93fdf971f596663465843b3add6392ba3390311ef8dc59f251445d669e10a0061991e113561923aa215244463d8264199ac588924e231e8419d8685f338e599b5f40bf9bd1aece772535bbbcb8f6881c2e800491ab3b57b44b8ae43aeb5c4ae5e7edeb228fedc9f6b9cadea176e134936ded60af1c228734fb00570f2374bbbfa1bb170785805d6b6c701e820952eae45b8c2366113a1dfb2e35852af419b754f9cf7a081c3dde6c8053bf1ce0c85339d5699c422476fc21f26ce75d2a7fed09fc0f4175789847d876c51aa4e0bf7ce842b8308dc7a28c8239520714dc233136e09f557c7ef3e0f83bad63cb28ac616d3928f3837dce1dd58acb8ddbc72e822deee45f00776acc88e00cd3a9db486d92d535a57a0fdc4f903b62e517221c308cba2e30ffe7b91937a99417721f56fe6df44840e9e41136929c0ca3dc28ddf2379e4dcfde83723e2d4c9e23299c056afb31d3e70d085d0a312c5cd570b699dea8717458531348c96f6eb52d7ee61d5660f65e909a14ce1033dc853f2f25d09cf4e40d07eff72e15a390564a2be3c042d89a68660a97ffacec4967a4b618712d7060756520c29ee8d9220ad8615c4fcf3969bd3b2e0947e1f0be7e2d80e0a61480c3166db5582218bb0a8be9848efd41b6ce0cd795c486abb67210beb60cd078b46aeb7f4f485031902bcd7131e00b7035aa2d43fee063f7f30bd570da1dbb65c0ca92a4812632e432778553e35e856caa8218221fd6316ab0869173b38409bcefe6d2db9210f9024173b66dbb92677cbc71c8a1cd583fa6f354d3c93fa8b16c71374f25a00c332f85a8befd540388fb50db9f5d96e4e4e698833ce3d63c10b8eec70a243b9015db459431b62f5668bba60f0704f6bdfe9546ea475cef2ebccba4b7680848e82beff5854e49f65bb773a4922e90f9b8afc7cf818730588ed5aa7b399826aadd54372fcb761458b64de66857f4adacd4c32900cb77136a535d7bbbb554597aecf39ff698b45e6a218df1d2abe615eb8d9e1824c0becce90767899ebfd2c730144b32c74604c0e53e2505bb15d28007a87b9931d6eec0a6cb5b0f96d3194b2423", "signature": "b1b44a142a7c4c3d0bf4661edac5b767005726c14a2769b7c214fb58737ec2e4bc51c3a195d2ba1b74a54eff4c33a90f41ccdefa9e9365fde8dd859fd3978c0a" }, { "secret_key": "f820e6f24a8418b6acda165f29a360f767cdedde8f64d768b95fc2a5f3f404e7", "public_key": "79c4b263b2e58f678628d4ea82b175aca230b9a20285c828f94e1ffd63d75b23", "message": "ab6bd45bb06dfb9069118ff998f3bd393ea8e944979e89e049f2505cd8931b93086b7e9d8ee764e9b447ea4ea12138bb45275a21a19843f75dc5421d61ffd861838e5833825d67162f3259c26447be51dc1802ef5a04ba73b783935706abb42c513b65f2bbc44f83da1061242f2d5e5198f38c10717a86a3a197e7cd9034f636114499037277acb4722c06a91cb2f65e21eb8d22d36ad73b4265f7a7947e00e722bda67043cd1281bcd87e763fc97b54c8f86836cdbf08c9a1f700f4eaed9ea59a6fc1bc0df8c9ec1fc2977cad60f978abc0c8381aa9fb060e3f99378a51b2d9afbef358d55162a38922ebb87d2a3e0f0f4000b1c39b1502e95945e8ac9f4a3ea7c9ddb581a5ec06c00ba87a737084b384faba09c84871ddd67dc1bebb2f7fbd94a5597d019fe629e5bf12bea2e33ca84c680dc5a3989bbf3af9eeece8ab8fc861e3b8bfc1e67e2aee326b37fb9b51cfa0b5f5fc160069b450b704e0fab7fb6c5ab3c40b8f0b3d0930b9112d64b9dacab4dd875f29d8c58c5d2053ad9148ffde22d90bc0d50f5deca68d3ea25c5b4c7688871c0c77dbceeacbd0a4229f4970ec87b34499e278303c06694c30ac68524d11b172794b481273a5dac46122d2472095a563a435d185d5e91da726e74592999cdac688a33f38f7c035588f625dc6ac73d0047ab3d6d12f1ae33d8b62d6d6c6cacff0bdd894b57e318912ac0cf4a534762b2f6d263c935804423ed868cf8cfbb8be8f6d8a714a268a390edc2dd509d2dc96851d1bd43249bd0f69b0c4cb2ff4080d1fd5622bc238dda6e930025d8a2b12b972f9eba17421d4cea642f40ad9ea8547ae59498c3ad1b9a0c34ed8c01aae3bd21ac17743b577f9515cfbdde2704dc57e80f125323d55100b9f697927d431dfe73631b58e52aa6aeb0478bf459552438689fbeb9c60d87aae09954362cd02a2b0b479efd38f17821af39b21926ee02f7d972ad0f54ea6572cc3ebd020b1ee26882533bd19114323815f672ec8c90568730a58e4e1e35f6821219a32b8a6c52ced6f9573d9f3beb28513ba62fb201f7fd41bb10ca34bb1c70f2fd7bb9299a7c5f7f2e0fa1d1af0e9aef5ede7c16950e860ecd61f1842a1a22c9831c0c0d4eda840b088a54520c9b18c76eba9bebcd591381c180d7f86a0e58add92b9b0c8076a7cdcab60dea4c1afb18c8b94b1b392ccfb4dae2711e7d12d2bc7c7825f63992ec3247163c283b1075e32245f69cf47240aef0db43efae86fc1fd3bb99cf5b789f5bcba9504657d9e622a4aa16f01d4d844413124447d6d1a4423e7b55db7e6a31a319f4bacae430a33a9bdd4ef3680", "signed": "f9fd72f321ca2133bf8585908d9ca7b8e336227e3ffb3749a1fbe8c9b1e5d50ef01f9db5f0d2a7c7c1399b97c9044e1bc1adc32b8bea46dad7b8102646960303ab6bd45bb06dfb9069118ff998f3bd393ea8e944979e89e049f2505cd8931b93086b7e9d8ee764e9b447ea4ea12138bb45275a21a19843f75dc5421d61ffd861838e5833825d67162f3259c26447be51dc1802ef5a04ba73b783935706abb42c513b65f2bbc44f83da1061242f2d5e5198f38c10717a86a3a197e7cd9034f636114499037277acb4722c06a91cb2f65e21eb8d22d36ad73b4265f7a7947e00e722bda67043cd1281bcd87e763fc97b54c8f86836cdbf08c9a1f700f4eaed9ea59a6fc1bc0df8c9ec1fc2977cad60f978abc0c8381aa9fb060e3f99378a51b2d9afbef358d55162a38922ebb87d2a3e0f0f4000b1c39b1502e95945e8ac9f4a3ea7c9ddb581a5ec06c00ba87a737084b384faba09c84871ddd67dc1bebb2f7fbd94a5597d019fe629e5bf12bea2e33ca84c680dc5a3989bbf3af9eeece8ab8fc861e3b8bfc1e67e2aee326b37fb9b51cfa0b5f5fc160069b450b704e0fab7fb6c5ab3c40b8f0b3d0930b9112d64b9dacab4dd875f29d8c58c5d2053ad9148ffde22d90bc0d50f5deca68d3ea25c5b4c7688871c0c77dbceeacbd0a4229f4970ec87b34499e278303c06694c30ac68524d11b172794b481273a5dac46122d2472095a563a435d185d5e91da726e74592999cdac688a33f38f7c035588f625dc6ac73d0047ab3d6d12f1ae33d8b62d6d6c6cacff0bdd894b57e318912ac0cf4a534762b2f6d263c935804423ed868cf8cfbb8be8f6d8a714a268a390edc2dd509d2dc96851d1bd43249bd0f69b0c4cb2ff4080d1fd5622bc238dda6e930025d8a2b12b972f9eba17421d4cea642f40ad9ea8547ae59498c3ad1b9a0c34ed8c01aae3bd21ac17743b577f9515cfbdde2704dc57e80f125323d55100b9f697927d431dfe73631b58e52aa6aeb0478bf459552438689fbeb9c60d87aae09954362cd02a2b0b479efd38f17821af39b21926ee02f7d972ad0f54ea6572cc3ebd020b1ee26882533bd19114323815f672ec8c90568730a58e4e1e35f6821219a32b8a6c52ced6f9573d9f3beb28513ba62fb201f7fd41bb10ca34bb1c70f2fd7bb9299a7c5f7f2e0fa1d1af0e9aef5ede7c16950e860ecd61f1842a1a22c9831c0c0d4eda840b088a54520c9b18c76eba9bebcd591381c180d7f86a0e58add92b9b0c8076a7cdcab60dea4c1afb18c8b94b1b392ccfb4dae2711e7d12d2bc7c7825f63992ec3247163c283b1075e32245f69cf47240aef0db43efae86fc1fd3bb99cf5b789f5bcba9504657d9e622a4aa16f01d4d844413124447d6d1a4423e7b55db7e6a31a319f4bacae430a33a9bdd4ef3680", "signature": "f9fd72f321ca2133bf8585908d9ca7b8e336227e3ffb3749a1fbe8c9b1e5d50ef01f9db5f0d2a7c7c1399b97c9044e1bc1adc32b8bea46dad7b8102646960303" }, { "secret_key": "0a056be039fd55dada441d037361273f206e000a74a05c51c0cbb62743f1f340", "public_key": "73140217a493a17866fff5154832273df79d5811543c222a39d056b8c970dbfa", "message": "a5ab147684e4d4a7bcb5a96fb39818e23f56c2d8a744e9123d62083930ab1d0bb532e68714fcec7e6c41134b6b19ddd867fe635c9ed65393ee39c5e8fab456cb5b32797883f3cd9a0902b9796348ee66c691fb4f2bb14764410657c74ab364567879b6fa0a6f4dafd930d9234cd7834fb9d0eedfbb5a394bf0846ec6969c2ef7ce39e3853895ff5b4da31e54341b4272e4a26049189ff28241ceeffb7d2e1faf4f779fa65cac0f5783c60ae77de30ad4465fdb390d42571eff4a63136349937d6caeefcdae229e2f28cea8abf3ffae3c3eccd90670a4212a2bee1ca6a5b54f094fc3231058f5cb9eceb9993be47027d51c18deca41cddaf4e8bc56a99fd270355ff45971950e3437a198ccc3254168dfc1574080802ee101a617fb604e868f8fa8fb30daeb43074de11f2483d916de5643b7cac23d9340508a3fd621ecd25004356a53554ad3ad7d5d25817ad7c9a610008c67ac16ba4211c42f5dadf86c2c3aed825cf2a9b523bfc03dd7de400c67807e139ea5dbce4ee1f7d318889b01a9f44803c322ac3b61e20e6312d0a03bf9927fa33f04ed7e207b16f26502c2983a3a961f224461fe9b64923b1d09189476ae8d001d0ecaae4df60db35f448bb612f9655a5fb144df11d83aa6936886c304949e59aa46df65c22ce7bf289b3c77c25d896be6d51dee10748261688c8b071c856f9962c66775ddf16083dae06587e32a6361199d72097e383ad7439491b5a563a3e6d58da3d5abb1de84890a36b421ce03d484dfd60039638d46edfb60659e3a25ac6e9a935ad6dad50f927bcc2ff99f9924a5b7995dc23c8f301ccc7769f71c18260904a3dcfb817d2d805cb1f196be8b6ecf352bc296bc3f76ea91353f8cf35bcd2b57eb5942773d6834ac50eeadc7e66461d1da098ccec75ff7205215f52459d97620f9f0289e93911db39b21df818fdf0bed45509244633df01cdddb4b75972fa7ea6f73281cbdbbd1bcb00c3bc1b1728eeae0bba172b131f5d30890a341e6b72f7e89dd4b6db3e79b6927586cf2c8ac38dd14f374d7f5bba9f4353def10ddc94d3d1118c5699e38b6b504918e589efe3f7e973fb40e2ebd057de1385e39d699a8f683b962fae4f3902881f1afbed7c783823558c36d68c6875d166fa243eb2ae14f7e6315a6d2ab4e79ea8e16e69d30edc708f1e7af7adafedcd3168898b331878178c4ba8833d20b3cac9d32b8888cc6783206397470a2e7cc4c9809ff79ceac9dc24ca1438c919c8a415e82f0902b4d9cf4ccd576968d5bee81c5f19c7d57b9bada8eab4756ea270dd26129e6122ee2d615242bc7fabff4f8312e686c8f", "signed": "fab8e5d93d7d46c65ee117c5375e73c9705f8754177fdd46efed4737c28768cc4b95a9c84c529b4b916b28dabd8741183144bcdb483df98af89d8240cf094604a5ab147684e4d4a7bcb5a96fb39818e23f56c2d8a744e9123d62083930ab1d0bb532e68714fcec7e6c41134b6b19ddd867fe635c9ed65393ee39c5e8fab456cb5b32797883f3cd9a0902b9796348ee66c691fb4f2bb14764410657c74ab364567879b6fa0a6f4dafd930d9234cd7834fb9d0eedfbb5a394bf0846ec6969c2ef7ce39e3853895ff5b4da31e54341b4272e4a26049189ff28241ceeffb7d2e1faf4f779fa65cac0f5783c60ae77de30ad4465fdb390d42571eff4a63136349937d6caeefcdae229e2f28cea8abf3ffae3c3eccd90670a4212a2bee1ca6a5b54f094fc3231058f5cb9eceb9993be47027d51c18deca41cddaf4e8bc56a99fd270355ff45971950e3437a198ccc3254168dfc1574080802ee101a617fb604e868f8fa8fb30daeb43074de11f2483d916de5643b7cac23d9340508a3fd621ecd25004356a53554ad3ad7d5d25817ad7c9a610008c67ac16ba4211c42f5dadf86c2c3aed825cf2a9b523bfc03dd7de400c67807e139ea5dbce4ee1f7d318889b01a9f44803c322ac3b61e20e6312d0a03bf9927fa33f04ed7e207b16f26502c2983a3a961f224461fe9b64923b1d09189476ae8d001d0ecaae4df60db35f448bb612f9655a5fb144df11d83aa6936886c304949e59aa46df65c22ce7bf289b3c77c25d896be6d51dee10748261688c8b071c856f9962c66775ddf16083dae06587e32a6361199d72097e383ad7439491b5a563a3e6d58da3d5abb1de84890a36b421ce03d484dfd60039638d46edfb60659e3a25ac6e9a935ad6dad50f927bcc2ff99f9924a5b7995dc23c8f301ccc7769f71c18260904a3dcfb817d2d805cb1f196be8b6ecf352bc296bc3f76ea91353f8cf35bcd2b57eb5942773d6834ac50eeadc7e66461d1da098ccec75ff7205215f52459d97620f9f0289e93911db39b21df818fdf0bed45509244633df01cdddb4b75972fa7ea6f73281cbdbbd1bcb00c3bc1b1728eeae0bba172b131f5d30890a341e6b72f7e89dd4b6db3e79b6927586cf2c8ac38dd14f374d7f5bba9f4353def10ddc94d3d1118c5699e38b6b504918e589efe3f7e973fb40e2ebd057de1385e39d699a8f683b962fae4f3902881f1afbed7c783823558c36d68c6875d166fa243eb2ae14f7e6315a6d2ab4e79ea8e16e69d30edc708f1e7af7adafedcd3168898b331878178c4ba8833d20b3cac9d32b8888cc6783206397470a2e7cc4c9809ff79ceac9dc24ca1438c919c8a415e82f0902b4d9cf4ccd576968d5bee81c5f19c7d57b9bada8eab4756ea270dd26129e6122ee2d615242bc7fabff4f8312e686c8f", "signature": "fab8e5d93d7d46c65ee117c5375e73c9705f8754177fdd46efed4737c28768cc4b95a9c84c529b4b916b28dabd8741183144bcdb483df98af89d8240cf094604" }, { "secret_key": "220524860cb89ab295bd884f988a57911868693d6b105a80b230f21e57805a7d", "public_key": "4ab32bc1566a7677e799734dc84181fbb654b813379180f1dd35aef2d324c12c", "message": "024a54ac5e0163b3a4fdd02f5936888ae2f9b74a6414b53c6381173b095a4ddacfc3a69f19167d0f1ae0c120bba7e9fcb7ccfc796d89ea46ef8058866ef6da7d01a6a142ea69d720c4f805ac5405a8012c3c2a8263b5372d59bf7f4099299013d26259dfd5193ece56179777be51b86bd1ce5f1fc9156f2b3a32c09d86bc6132de576102e2f03c716db5366ccbe742aee3552ac3b39d0ec7d4e4e9626bf8ece031d678d3480905c0e338fb7cc026e3e79cf2c2781ac2a5a40df4284e235a0389e928fc63557dc6f199fcec5f361ea24759fa7c5f71978c0ba245e4b03ae435941c86c81a51430c2dc9927e3b0f4ec4eba7c2745b493987154d7da85b67de21c598407fb2a760804ad05bfdfa45a613224b22a08588ccea3cbdf47a198bebf8cfed8649d6d5f3fa501376bdfba4003dac2237dcace5315b7fefb879a89a85bce6da526fc360cbb4fd554ef013f33b7384cd2b22a88577f3a2d366422aae46417ba916e1646e24404a88b5d53ff1aed2a47baf81fcb4286397991394b2ecc39667ac46c2bdb6d023b33db013457c4005d839015d8851f028ac334fb24bbad2902a4d63ae68e0eca7eaea1e856529647baf1412213754ed50af3f436e9bafc1601639b39d3e52a93a898fb6019fd5ed6e7dfc050e7ce5f3d35ceb5067021c0fbdc708d3f26bd60568d1ed2b612b696235d5333318f9a6c987235a7a07f8c6a9354fb8e734763065afcd4d937764a4f037cc7e7e2b93217f1641684fa81b7ff7986a28b38e95b332e74649e83d0ded795c57f24cf276e0143901bafef0f1693fe7cf10904fb0d880d72e44716a7069daaae742cf0ff3ed92f5f7d1e10e049d8df043631ed0ed4c4ac4022d8403cb0421b454cbfb6f48a30e9ee1609ad7b68211977acb33b9c1a1be735814c58f66db5f0b8ac773b1d58d4e6bc45dfd48a294bbd25e92671f56f302f29b50d80431c8f2ea33996257b208e057ea7672cc2d1cd4204b85b2ab509027131359aeb42e3eccdbaecfe2cd3e5a3313266e761194ff69cae9e37e51cc0a54f086dde13cb33118e34fe33c74d735582752d68d21c79e5c3aaea94ba107cb7ee8a70a3f9a01e9808c0aeba6665315b45625840a033a6e2a875495057942ed9bb2ce6e4ee60bed47cd9d584bc24524397a109498ee2a973aad6a29b70a1cfbfe9aa5c7cb9f35f0fa00227f43988d07619b6fb2f6d3bee28e10ee705347015a922e2e88d34fb0ce515b08df3a1b634ff9ec15d0594182c86ebb0db783612a7d19e4b22e822d566245aed72e694c3d101bfa4ca879862e5f99c23a5d66083ce06d87f399aa7888ab83b8664472", "signed": "db1cc0c5db773ec51689be28842fa6791a7d75e29c228ae9593a580e0875b1670f09b03442929a18f1e9414ea34315ff09d91d922ee47f10f71da4ab13b7d901024a54ac5e0163b3a4fdd02f5936888ae2f9b74a6414b53c6381173b095a4ddacfc3a69f19167d0f1ae0c120bba7e9fcb7ccfc796d89ea46ef8058866ef6da7d01a6a142ea69d720c4f805ac5405a8012c3c2a8263b5372d59bf7f4099299013d26259dfd5193ece56179777be51b86bd1ce5f1fc9156f2b3a32c09d86bc6132de576102e2f03c716db5366ccbe742aee3552ac3b39d0ec7d4e4e9626bf8ece031d678d3480905c0e338fb7cc026e3e79cf2c2781ac2a5a40df4284e235a0389e928fc63557dc6f199fcec5f361ea24759fa7c5f71978c0ba245e4b03ae435941c86c81a51430c2dc9927e3b0f4ec4eba7c2745b493987154d7da85b67de21c598407fb2a760804ad05bfdfa45a613224b22a08588ccea3cbdf47a198bebf8cfed8649d6d5f3fa501376bdfba4003dac2237dcace5315b7fefb879a89a85bce6da526fc360cbb4fd554ef013f33b7384cd2b22a88577f3a2d366422aae46417ba916e1646e24404a88b5d53ff1aed2a47baf81fcb4286397991394b2ecc39667ac46c2bdb6d023b33db013457c4005d839015d8851f028ac334fb24bbad2902a4d63ae68e0eca7eaea1e856529647baf1412213754ed50af3f436e9bafc1601639b39d3e52a93a898fb6019fd5ed6e7dfc050e7ce5f3d35ceb5067021c0fbdc708d3f26bd60568d1ed2b612b696235d5333318f9a6c987235a7a07f8c6a9354fb8e734763065afcd4d937764a4f037cc7e7e2b93217f1641684fa81b7ff7986a28b38e95b332e74649e83d0ded795c57f24cf276e0143901bafef0f1693fe7cf10904fb0d880d72e44716a7069daaae742cf0ff3ed92f5f7d1e10e049d8df043631ed0ed4c4ac4022d8403cb0421b454cbfb6f48a30e9ee1609ad7b68211977acb33b9c1a1be735814c58f66db5f0b8ac773b1d58d4e6bc45dfd48a294bbd25e92671f56f302f29b50d80431c8f2ea33996257b208e057ea7672cc2d1cd4204b85b2ab509027131359aeb42e3eccdbaecfe2cd3e5a3313266e761194ff69cae9e37e51cc0a54f086dde13cb33118e34fe33c74d735582752d68d21c79e5c3aaea94ba107cb7ee8a70a3f9a01e9808c0aeba6665315b45625840a033a6e2a875495057942ed9bb2ce6e4ee60bed47cd9d584bc24524397a109498ee2a973aad6a29b70a1cfbfe9aa5c7cb9f35f0fa00227f43988d07619b6fb2f6d3bee28e10ee705347015a922e2e88d34fb0ce515b08df3a1b634ff9ec15d0594182c86ebb0db783612a7d19e4b22e822d566245aed72e694c3d101bfa4ca879862e5f99c23a5d66083ce06d87f399aa7888ab83b8664472", "signature": "db1cc0c5db773ec51689be28842fa6791a7d75e29c228ae9593a580e0875b1670f09b03442929a18f1e9414ea34315ff09d91d922ee47f10f71da4ab13b7d901" }, { "secret_key": "4ef60f0691d737e64d437bfd3398330e55e3c094cf41fc557b0fe0b643909ab8", "public_key": "306ab146e5c8cd630f9b48bf8b685db0b6b553ef69686853b6b531960118548c", "message": "0a188ac26f3c5d89f3d588374fac5ecf9a467e2165b31d0b0f23501bd22e62bf3555ffba94631de74a6a3c3cf63b03ac1bbb37d233eca5993b0970a0220de8d6c41a970307309a52da0576dc334d806447aa09d0b245eacd0b42c4e19fa3d6fbdc229430eb3c7558af5331c6e7fcc2e552ce35d579073b548dc115bbd27e5a33ce1c47fc8461e391b6d767953487cc52ee673bc4be96569c8557369ebb6e02f79238108c3b5856ee381a79ff464c8f6009fd47e67b4c80201e11e61ab8f59ba5d07b15ace3fb374c64b6b4c345e2b00e9151ab8e1c5c98568bc58dd0812aaa3beee165e7eae58fbde63077203c4fd6e16068d76e3d3a13f1cdd73288bd5e4da44eb119a04c4d32efa2f13e7426a2f41c5623c9b066b1303639b8fcea0d8774cc08045f7e346365ff31d3b1ed99e97bca5f25c92b2843ac585d02193a2fd39466f73aaa989b1fa05b9a157fd0277c5e745d258e027803a524ad94309425c3f4dec31c0efc547752f4c7194cbb272f849a52169c6a078d20ede1432016528477b58c2bdf6063f9447e33837ccb437d8d6b95cf4c44be70c8193ad980a105f3db6f9930bab4678c776342faf170edf74248d3b1ca96f731b9d026d8f0f7c34ed372c1cde176f55f558675cc3180c23902f4ba9508d1c91c3c9e688730327f3f7b637a8fee54373759fcb17c9217ea44ce43691a8f6463640a4a5e151e6254c4ef12623b49394da7cc79452693817d6baea9a0a75876948b1f8d3b717f9ec36753f53263710383b98262ae6354ff2a2283220ad42c5cb2cbbdf12c879513710b16be856f3b1355b36f4b80c017c21be85e96053da050c40312100abb640b873d88fb6ee0d19e9e61b04c970bd1f060dd311bbb9a6e35b985fdca17caee8cd5db637acd90cb8e823255c056018fef5920db640d2201c5eddbd8a9c9474da8def7e1325b3cc436c74f815db1e42b421faab626a4378c2d84261bf649a53b321f598c44bbd3002b06cf7f1fdef84ab35f73ed7dc65096cb1dc0cc0e34c561c8a15cf5279abbed9b16ff24a9744e3f5e649cc9d8884f891c3fb78902031ffe0e0121c72080ad10c247b7c93a9ebb2d84d4f877750d7b3416393d03045226bb7994eea58e272dc18c46b382d1f97b23765fda7a8ce21fc6b98d723ffccd99ac4655cc5d10105a2a5b7c8cfbfb90e27a9a809e41ae640063286405a9be83ac5d2907a45f163c7764b09f99a55593220d6901292b9b5803a0fe71b0e4441cbfef841c33cebc98364d666e5a9f5e7e69a1508e4380ed361345b7248a4c1c1ce08769bc7152ddb332fba176200f5abbae3812f406da72dde5db", "signed": "cbf7cf22081c5f235dba35630fb3f0408fceccefeb28b99d74dbd98c902c7d99ba9ca7fab3747c504cc219f4dd101081f58ce616e29280e362539fe49f34d7050a188ac26f3c5d89f3d588374fac5ecf9a467e2165b31d0b0f23501bd22e62bf3555ffba94631de74a6a3c3cf63b03ac1bbb37d233eca5993b0970a0220de8d6c41a970307309a52da0576dc334d806447aa09d0b245eacd0b42c4e19fa3d6fbdc229430eb3c7558af5331c6e7fcc2e552ce35d579073b548dc115bbd27e5a33ce1c47fc8461e391b6d767953487cc52ee673bc4be96569c8557369ebb6e02f79238108c3b5856ee381a79ff464c8f6009fd47e67b4c80201e11e61ab8f59ba5d07b15ace3fb374c64b6b4c345e2b00e9151ab8e1c5c98568bc58dd0812aaa3beee165e7eae58fbde63077203c4fd6e16068d76e3d3a13f1cdd73288bd5e4da44eb119a04c4d32efa2f13e7426a2f41c5623c9b066b1303639b8fcea0d8774cc08045f7e346365ff31d3b1ed99e97bca5f25c92b2843ac585d02193a2fd39466f73aaa989b1fa05b9a157fd0277c5e745d258e027803a524ad94309425c3f4dec31c0efc547752f4c7194cbb272f849a52169c6a078d20ede1432016528477b58c2bdf6063f9447e33837ccb437d8d6b95cf4c44be70c8193ad980a105f3db6f9930bab4678c776342faf170edf74248d3b1ca96f731b9d026d8f0f7c34ed372c1cde176f55f558675cc3180c23902f4ba9508d1c91c3c9e688730327f3f7b637a8fee54373759fcb17c9217ea44ce43691a8f6463640a4a5e151e6254c4ef12623b49394da7cc79452693817d6baea9a0a75876948b1f8d3b717f9ec36753f53263710383b98262ae6354ff2a2283220ad42c5cb2cbbdf12c879513710b16be856f3b1355b36f4b80c017c21be85e96053da050c40312100abb640b873d88fb6ee0d19e9e61b04c970bd1f060dd311bbb9a6e35b985fdca17caee8cd5db637acd90cb8e823255c056018fef5920db640d2201c5eddbd8a9c9474da8def7e1325b3cc436c74f815db1e42b421faab626a4378c2d84261bf649a53b321f598c44bbd3002b06cf7f1fdef84ab35f73ed7dc65096cb1dc0cc0e34c561c8a15cf5279abbed9b16ff24a9744e3f5e649cc9d8884f891c3fb78902031ffe0e0121c72080ad10c247b7c93a9ebb2d84d4f877750d7b3416393d03045226bb7994eea58e272dc18c46b382d1f97b23765fda7a8ce21fc6b98d723ffccd99ac4655cc5d10105a2a5b7c8cfbfb90e27a9a809e41ae640063286405a9be83ac5d2907a45f163c7764b09f99a55593220d6901292b9b5803a0fe71b0e4441cbfef841c33cebc98364d666e5a9f5e7e69a1508e4380ed361345b7248a4c1c1ce08769bc7152ddb332fba176200f5abbae3812f406da72dde5db", "signature": "cbf7cf22081c5f235dba35630fb3f0408fceccefeb28b99d74dbd98c902c7d99ba9ca7fab3747c504cc219f4dd101081f58ce616e29280e362539fe49f34d705" }, { "secret_key": "197e15dce4c47d734dbce4688a7ad5fe41ebf2aa29a2bddb2bee628429c1bc02", "public_key": "30fac323048b0c781a9f63c1ee69f2b9e75a2706d249512a2739607f26db138f", "message": "fd971d48946b51ffed7b62c5d099c1e56b1358b92235e1010e3f23844ddb73bcee8d2e1c9977353bc96a221c05602931fa16ccc2ab6d0f01c846c2920e99de026dc2897f3d5f3cee174ce751d4a805ee1959a3c69cfd42d7c9afd31fa9b1cf05786d8f9042a4f9f81cf7ac9c1c39b36f1ee95b98cf7ee3f43e2c343733d1d82cc08b2cdeb78d982034085ff4dc6536cd154a790c85c8613ec4e5e1dc377d38a745d938cfb15c8b8aa86121835f2e25e9e6d0de68025d810c3dc9df991dadad39dc6981fdbac1ff9b7a791c3960d8564366e5aa39a9e9c7cbf1d3f0f820d1b90108751ac764dabe05c51c18529da1b0349614668424ab4e936440c4a2513be528539372eee78754589dbe7994faa1f6229124f839950ed0923f4323315ac963bbe4c8e177dac516e7342238f1cdf140befc8acdca3d002b16c1398d868600304c7e9853b23a51b17d9fd06156e1d1d08a28460909fa209ccccc4cecbdb1a46348089115318681a95ae580ab6766041384651cc4e6145103923bdf4a32a93d93eed318791f20805f7ea84b743ee11ead9e4ca03da76ddd249fd4475fc1a353c70a83389bfac52098db066d1029c4effbed864ebe7f107e0103b3a8f3fd1d6ab4360b99e8b140c5ea133e923c392b8e4063aa6e522638f61d7a71c9225897d9f8a1e16cfcc801e7d54104eb10e61a5ae63c5c85a5b29392ab3ab8e5c039f100d0f4600c610e0209436ef2ece4d0bdb0bab437b2db5f3708fddf96660f6fb1a90d6048d395afafa760ccaf15deaa0effeb26ec17681d172c1330f78e78a8736b285f615f15d4f2c313d25f30aee9d1db39f535fcdd0ebc8e71b89ce6b3fcb567cd0fa288f48ed3a759bb2ed200fdc23091502fd9ca651ce5e3422a98335a81d74a65cc1500e9070abb609c1c1f68fc2ca94cdd550f99bcb2d092416b9bd388410b8fe748fb8c9a5ab8615f2ed968f85dcb2727726984beada7a18afdb0c72aa65de7abb7a86f11169a6eadf1c21d614e52c0c8f019747d341a05d85e37bf58d8327e9939c2387c2744edf838563cb37f0b16e8a06fc628a97230506fa4183954dc74815f3be2eb2aff4a13c065f743b7d85de804eb28efe570ed5ecc71aba97f9763b436173247f38e0cf6297209b65128465a382664ced8011fcc3d0e563f155bc63c94dde73c7b17247b8c3a4e8034ebd4364635185ce9c7081dbdbe8545f79d01aa532a0dc52cb790a31fc2ff41acebad27cce9244554db652fa287bae7decbcc8ce9e01d1a88ab412b6c6578203b42dec982b7f3b82314db2cc7c5c3dc1d3d8b17144da7fe60e7a8725fd0a97c610607cf413c72", "signed": "2c3c8cd299c9060b65999b03a6579bc50ef1fe0d851f23be9cb58f8fb8c672ee086a539ead949e087df091122d26faaad206a5c52fcd58b514d7a935be017908fd971d48946b51ffed7b62c5d099c1e56b1358b92235e1010e3f23844ddb73bcee8d2e1c9977353bc96a221c05602931fa16ccc2ab6d0f01c846c2920e99de026dc2897f3d5f3cee174ce751d4a805ee1959a3c69cfd42d7c9afd31fa9b1cf05786d8f9042a4f9f81cf7ac9c1c39b36f1ee95b98cf7ee3f43e2c343733d1d82cc08b2cdeb78d982034085ff4dc6536cd154a790c85c8613ec4e5e1dc377d38a745d938cfb15c8b8aa86121835f2e25e9e6d0de68025d810c3dc9df991dadad39dc6981fdbac1ff9b7a791c3960d8564366e5aa39a9e9c7cbf1d3f0f820d1b90108751ac764dabe05c51c18529da1b0349614668424ab4e936440c4a2513be528539372eee78754589dbe7994faa1f6229124f839950ed0923f4323315ac963bbe4c8e177dac516e7342238f1cdf140befc8acdca3d002b16c1398d868600304c7e9853b23a51b17d9fd06156e1d1d08a28460909fa209ccccc4cecbdb1a46348089115318681a95ae580ab6766041384651cc4e6145103923bdf4a32a93d93eed318791f20805f7ea84b743ee11ead9e4ca03da76ddd249fd4475fc1a353c70a83389bfac52098db066d1029c4effbed864ebe7f107e0103b3a8f3fd1d6ab4360b99e8b140c5ea133e923c392b8e4063aa6e522638f61d7a71c9225897d9f8a1e16cfcc801e7d54104eb10e61a5ae63c5c85a5b29392ab3ab8e5c039f100d0f4600c610e0209436ef2ece4d0bdb0bab437b2db5f3708fddf96660f6fb1a90d6048d395afafa760ccaf15deaa0effeb26ec17681d172c1330f78e78a8736b285f615f15d4f2c313d25f30aee9d1db39f535fcdd0ebc8e71b89ce6b3fcb567cd0fa288f48ed3a759bb2ed200fdc23091502fd9ca651ce5e3422a98335a81d74a65cc1500e9070abb609c1c1f68fc2ca94cdd550f99bcb2d092416b9bd388410b8fe748fb8c9a5ab8615f2ed968f85dcb2727726984beada7a18afdb0c72aa65de7abb7a86f11169a6eadf1c21d614e52c0c8f019747d341a05d85e37bf58d8327e9939c2387c2744edf838563cb37f0b16e8a06fc628a97230506fa4183954dc74815f3be2eb2aff4a13c065f743b7d85de804eb28efe570ed5ecc71aba97f9763b436173247f38e0cf6297209b65128465a382664ced8011fcc3d0e563f155bc63c94dde73c7b17247b8c3a4e8034ebd4364635185ce9c7081dbdbe8545f79d01aa532a0dc52cb790a31fc2ff41acebad27cce9244554db652fa287bae7decbcc8ce9e01d1a88ab412b6c6578203b42dec982b7f3b82314db2cc7c5c3dc1d3d8b17144da7fe60e7a8725fd0a97c610607cf413c72", "signature": "2c3c8cd299c9060b65999b03a6579bc50ef1fe0d851f23be9cb58f8fb8c672ee086a539ead949e087df091122d26faaad206a5c52fcd58b514d7a935be017908" }, { "secret_key": "08b5fd4e419d2370c0fcd6c3b92f8db3afd42268f533085d9fce32b522824e34", "public_key": "cd0da699379e4f9425e84b9757300a51a163f358734cc37a91ff0ea488d29779", "message": "3ceeeea30fa401563df36b198b9b59698c10e100a2f30e6f78fe62b92ecac989e8aa09ec760e89cac0a16bde3cac73622a8627efedfa4ec09b873f7e1000e76982910ca0aa4afb1ff5a8448b76f7b0d2a2d52a7f40dedefc68d60ce6622ca080d6698ea6c3bd7210b3b648f53252291494b35a55ff40fa1a631a57c510011a46bfb9e271bae1e78ce6c6ea60c55ba0cce36059bfb01e394556987f744b72aebbdb4b1bdbb3bbaaee1b8b2f3174506a793f0a511b2b569049b30a2e0841424184a48eca9e2d83783ac5b61eb947cbd8bab7ad38b0c68427d8f94ae285190dbb6e0c6d580a25142394be948158d8da83b4f34a8d258b97075632b3c28bfae3105ed1872e356e43aed59397b9110bbf9d8ca2a044d5271e6cc361e14e69a932517683ec81818f02cfa0295e5661cea3e586afc0db41ba95553ee75b200b0f9790111d3757a739e563557aff9b70ca14e87b795437ba91a95dd07ea69a11359f36ca03298e0bfa4f912f64a2924ad901975a2a960ba1be89921b1f5485496b7ea5da6d8a6937ac105bf3760e4876990a0f5c5a634f74cb57df7c172c8a415372e6d903298717499616f8971c68bbece92ea878a18e23f327c3649b6a852ef23b7b3e603cdf80452dbf1be2fb77e814d2525496bb31fb6e4ed2533248b39d5fbe2390a9b6fccaba997e8b49b59836e3e09529ea5e4113eee451c9c6bb26741d0e4c586f53d604c6ea0c0e60db02e5109f3734f51cdd8985afeb3ecaff65e059e312cd50fa349ff28bdc9b70b7f532dbab1df43b03167c1d2e3fa6ee8c9b174a0b2cf8aa9ffa406bf5bd7288780c9c4a6b697949b48638d42079c8c66e14d9b572a210a093eaf1d2f7a703b5cd20adc4f9927a6ea8ea78faa61bc62b3c5cbd3a53252566d043ba556590d9a763be7fea4b20e1e9cfbebfae15439b334dc539b17dada2e434e9c83225b1e8f6beb7d556b47d7f69f7eb7df5ede2eebd84e250b7c9468c21fdc0170ea8df662d6180581f657fe76cef1858b6b02f7325c7219643fba2f7e9963a33322d6504ab91bf10a978fa07b47d5db0be000dcd002bddaf676b77259c9f60ad0b11671cd5777c1e80b13f82eb0fb6a180b5666293a43240862fbfa3978d95311971afab9e1cc8ab14a876b6572ac8a4b7e0b40aaf6b52a1cf4c1ebc6c1c487df5a3cbc4005a0ee329cabc286db10f17d0f1782e07d3324f0c73efbd3c2fb52b71f98ad95db95062d91425e73467bc1e4e9bf552e8a24429d97db1d66dd4d995e5f8d24e9c910b2eb1758ef75525c3d65a3f430a027348820ce3053b6f3af4ec96d0493731c818c6b1a70c250ac686a4fc", "signed": "42a13756b75c6722485fa3f694041b39b7d7c5fd40ebc06a52e0ff34ce14d8d40fa82a9508b568537d26d0dd7c0a31be710da80aab35196a039b60641db1e1013ceeeea30fa401563df36b198b9b59698c10e100a2f30e6f78fe62b92ecac989e8aa09ec760e89cac0a16bde3cac73622a8627efedfa4ec09b873f7e1000e76982910ca0aa4afb1ff5a8448b76f7b0d2a2d52a7f40dedefc68d60ce6622ca080d6698ea6c3bd7210b3b648f53252291494b35a55ff40fa1a631a57c510011a46bfb9e271bae1e78ce6c6ea60c55ba0cce36059bfb01e394556987f744b72aebbdb4b1bdbb3bbaaee1b8b2f3174506a793f0a511b2b569049b30a2e0841424184a48eca9e2d83783ac5b61eb947cbd8bab7ad38b0c68427d8f94ae285190dbb6e0c6d580a25142394be948158d8da83b4f34a8d258b97075632b3c28bfae3105ed1872e356e43aed59397b9110bbf9d8ca2a044d5271e6cc361e14e69a932517683ec81818f02cfa0295e5661cea3e586afc0db41ba95553ee75b200b0f9790111d3757a739e563557aff9b70ca14e87b795437ba91a95dd07ea69a11359f36ca03298e0bfa4f912f64a2924ad901975a2a960ba1be89921b1f5485496b7ea5da6d8a6937ac105bf3760e4876990a0f5c5a634f74cb57df7c172c8a415372e6d903298717499616f8971c68bbece92ea878a18e23f327c3649b6a852ef23b7b3e603cdf80452dbf1be2fb77e814d2525496bb31fb6e4ed2533248b39d5fbe2390a9b6fccaba997e8b49b59836e3e09529ea5e4113eee451c9c6bb26741d0e4c586f53d604c6ea0c0e60db02e5109f3734f51cdd8985afeb3ecaff65e059e312cd50fa349ff28bdc9b70b7f532dbab1df43b03167c1d2e3fa6ee8c9b174a0b2cf8aa9ffa406bf5bd7288780c9c4a6b697949b48638d42079c8c66e14d9b572a210a093eaf1d2f7a703b5cd20adc4f9927a6ea8ea78faa61bc62b3c5cbd3a53252566d043ba556590d9a763be7fea4b20e1e9cfbebfae15439b334dc539b17dada2e434e9c83225b1e8f6beb7d556b47d7f69f7eb7df5ede2eebd84e250b7c9468c21fdc0170ea8df662d6180581f657fe76cef1858b6b02f7325c7219643fba2f7e9963a33322d6504ab91bf10a978fa07b47d5db0be000dcd002bddaf676b77259c9f60ad0b11671cd5777c1e80b13f82eb0fb6a180b5666293a43240862fbfa3978d95311971afab9e1cc8ab14a876b6572ac8a4b7e0b40aaf6b52a1cf4c1ebc6c1c487df5a3cbc4005a0ee329cabc286db10f17d0f1782e07d3324f0c73efbd3c2fb52b71f98ad95db95062d91425e73467bc1e4e9bf552e8a24429d97db1d66dd4d995e5f8d24e9c910b2eb1758ef75525c3d65a3f430a027348820ce3053b6f3af4ec96d0493731c818c6b1a70c250ac686a4fc", "signature": "42a13756b75c6722485fa3f694041b39b7d7c5fd40ebc06a52e0ff34ce14d8d40fa82a9508b568537d26d0dd7c0a31be710da80aab35196a039b60641db1e101" }, { "secret_key": "1e85c9e451b7acf801d16bc8268eb42ae85c72c68e9f90927aa0f3b50befd229", "public_key": "a69d057f4b743811e07ac74561c225be0381c7d5849e6018793701a8cb6c99b5", "message": "189ea9c8d9ed14b0de82b44cbdd58757a27c68383fba597761f9e862e08de15b1e44c3db1badbde76980ee39e699629f6fcfef32d36b3393da2ca5a81f959c8b0f1b801b5fa4c47ca39591e612a2435c5bafd77a5c7ab74359210906f47533b1879e2a5af5864d961c8146e25dac772555e042a887261419ab8c9f6f625625481da5b93526a131f37b534a0050a8a462b33f20a7e94b891530b19bf654ee9534c9a8361d03635d8d27d46be7bf84781ad0d42d1e7c4854a49ba1ba458262fe5ea19021b935a6949492d70b605e151989ef2641b2bf81ec4b92020fc7074c2a63229d51a944186a28895e8ea95292c2f872bb21a3149399e23ccd8e2fc4f17a46b59c282c51b58d00266a5c16b1ce350d5485e8d8016dd0a50a5984cc948154cd5ce7cda0ee0ab1d7251bdc70a1785b8e9103917f4b917ab2b494f3483389a2f9237541849ed3bd565cffac9e756db56ef5e23495bc771e88bffa8707ceea5c09becadd059ab889d1df7e887b71a9e6c238378fbe0c3630386616363f207b16c3270d39acded511529992f4e598789121d316135810636baade8a28edc66bbf5ede3f404a70b47d35988be706b4eaa03023a39093d583cd4cd8bf4c74341a028c19d60da31b6a7a034c081a2b030feb3cd2f03d0faabffb58e3fc36c006cfb92947a7de5ba87476c1b051e18283c03e9c6e5a5c3c2777d9a0757372379664e82f8485824fedb70a4bc4e356edd1b5ce0fb6e41de0171621b84fafa00189afa8a6a900b14c70758f7aa4fb82400e0d18ab3cd7e48acfd489cab0e72e719f79a07d066c531a891c55291f2245dbbee44e52b1dfc8727aae387ab9e71994a3854e1add73d9a7965c775521c2f540842276dd309e2f6a341e7f0f37f22bb6627b6e9cb25ba24c6c4f4eb9f5e7622d88da1984e29c5da001039c44042b59351406a41336dd772d497d3fc8aac41172eb5aa6417fe422ec7c150b96b0454ee331247cb1538aeff3eca2d50e53d6d13170a76a0049ea0c05904a6390ed14ce7491e97f754c5222dac4b6118ba381f552e73ea8491e3b7ac949569b569cf2d29a80410e065b5cc4a466bb04eb7a15f596792e8490ba7002ec361571af5d8f57675c956449470a2f9955407367e409a232899553120a277db863e9a82ddabae87b789145ba898df3c28b96fbe3014cd085c6e60ee8831701036d99c5425d58e8bcc9fd9271d46aec1eb955130102eaaab44e0770c30b2b127efb0e5f8a3f7a0ca34ec9984a46011bc26bfde0c0819bb54706b565638b7542dc4b8bf8098dc01f161b3b129618b59aded33cb59ce9189a6762dbae5b0d34b71c8dbf", "signed": "6c36da9ad6c456343ce642aca454923a52a2844ce5ee58947c8df7bab2ebe467823c5633e530b167d71c47ad9549df05943f99421e17475c4d4f08dedf6f3205189ea9c8d9ed14b0de82b44cbdd58757a27c68383fba597761f9e862e08de15b1e44c3db1badbde76980ee39e699629f6fcfef32d36b3393da2ca5a81f959c8b0f1b801b5fa4c47ca39591e612a2435c5bafd77a5c7ab74359210906f47533b1879e2a5af5864d961c8146e25dac772555e042a887261419ab8c9f6f625625481da5b93526a131f37b534a0050a8a462b33f20a7e94b891530b19bf654ee9534c9a8361d03635d8d27d46be7bf84781ad0d42d1e7c4854a49ba1ba458262fe5ea19021b935a6949492d70b605e151989ef2641b2bf81ec4b92020fc7074c2a63229d51a944186a28895e8ea95292c2f872bb21a3149399e23ccd8e2fc4f17a46b59c282c51b58d00266a5c16b1ce350d5485e8d8016dd0a50a5984cc948154cd5ce7cda0ee0ab1d7251bdc70a1785b8e9103917f4b917ab2b494f3483389a2f9237541849ed3bd565cffac9e756db56ef5e23495bc771e88bffa8707ceea5c09becadd059ab889d1df7e887b71a9e6c238378fbe0c3630386616363f207b16c3270d39acded511529992f4e598789121d316135810636baade8a28edc66bbf5ede3f404a70b47d35988be706b4eaa03023a39093d583cd4cd8bf4c74341a028c19d60da31b6a7a034c081a2b030feb3cd2f03d0faabffb58e3fc36c006cfb92947a7de5ba87476c1b051e18283c03e9c6e5a5c3c2777d9a0757372379664e82f8485824fedb70a4bc4e356edd1b5ce0fb6e41de0171621b84fafa00189afa8a6a900b14c70758f7aa4fb82400e0d18ab3cd7e48acfd489cab0e72e719f79a07d066c531a891c55291f2245dbbee44e52b1dfc8727aae387ab9e71994a3854e1add73d9a7965c775521c2f540842276dd309e2f6a341e7f0f37f22bb6627b6e9cb25ba24c6c4f4eb9f5e7622d88da1984e29c5da001039c44042b59351406a41336dd772d497d3fc8aac41172eb5aa6417fe422ec7c150b96b0454ee331247cb1538aeff3eca2d50e53d6d13170a76a0049ea0c05904a6390ed14ce7491e97f754c5222dac4b6118ba381f552e73ea8491e3b7ac949569b569cf2d29a80410e065b5cc4a466bb04eb7a15f596792e8490ba7002ec361571af5d8f57675c956449470a2f9955407367e409a232899553120a277db863e9a82ddabae87b789145ba898df3c28b96fbe3014cd085c6e60ee8831701036d99c5425d58e8bcc9fd9271d46aec1eb955130102eaaab44e0770c30b2b127efb0e5f8a3f7a0ca34ec9984a46011bc26bfde0c0819bb54706b565638b7542dc4b8bf8098dc01f161b3b129618b59aded33cb59ce9189a6762dbae5b0d34b71c8dbf", "signature": "6c36da9ad6c456343ce642aca454923a52a2844ce5ee58947c8df7bab2ebe467823c5633e530b167d71c47ad9549df05943f99421e17475c4d4f08dedf6f3205" }, { "secret_key": "51cf868f820eeda0dbd10180f777e6065c93a483c58a778b67e7d842302fb767", "public_key": "ab088f502fbcf2150e4846b34d2c8097ff013c02a8b97cfcf2b95a1c72df3e24", "message": "7c2d8ee82d9abf8aa9c724c75b90990473f131763fe93b30cb04723588621da2a327928b22649fa062cdeabd77761538b2709b8fb7a2006e503509134c929c3011e1d728a57a4e175198075e214253f3f30e01b6e04eabd4de06789558e698b186efe34b32129568b3e8d0d7ea3ff00b3f25a42236893aa8a41b674a0ab5f41e7b28cf5a7cb765e18ead6de6a353a7824a3c49786038d6f4937f3264d6ccf0c0a2465bb693e52b3d1e6eb9ae4cb65d09cff54842e85362857a59f7198a688a3df38513cdd61e21dfd859142c8344a3b8b2a7c7db170f39f87ca3ff8ed427962b2b1a14d122fa2d5aea2a6640117dd258fa0fc54ac6e940bc16d211ec9adf914ab16578f521f655d2127e79e871bf7fa7544719d58ed847850cb27b99eb8f29b16cdcc28b15c1259ab4d589705a406688f605a2ebf58051c43a77c4e01fd6f749d32db4e89f263c2c16de181f0e6bdd0a6a64ffe6f1829444096d9f3e2b67e4bb006650b5929d1f82eb11bbed24e8f1018a7384605a3cf29ab598337939c76a3be861e483c5805ec3cee45e3424847a08558dcc99499fb9382acae56cdc87fbd5b26ff94c86f2e108794383501c8b33366850a76a0dfc0a7cd789a03f01a3e9d9e9ae39fd7245dc29299d24f3b4b167caccd223a99b6b20a3b673dc5f7466d0b2f815098a497ccaf80420168eddbf4da57b8666e9d33c48eb304b4cfcf457cd7659543f6d1e661890f562b43b8b6d1c4dcc077b60bfa533ffab928dbfd955dc5116d770950b690e2106ad52d42c31c22b8848894332b5c699e5c331fb381e5812e7526fdf4b8aa2daaa2ca2cfb9c92111b61cbc3d1eef6c8c6737f05588f04467db8330843acc98dc1a16fbd9d9d94bd8bfde26c3f71dee72b50910c36b240f802a61ca16372f6ffaadb2be4e853c5ed69a3d1f6c7b2de513c53a3fdd0a676f83d09d5c51176047d9200716bf22bae45fe01b3e0c2c51c16e46ad0637f79f9b4d83867704feda9f227831dea263399ca2771a4e78b4df8ac0de6a941eab370b1fdb47daf6642aaeaa63170fa9b3d1e1628f7c4e7cf0ea8b8a8e518cbacef9ade84df032484847ffb61bbd07e8727cc4c25da577b264519b4999fa7c0bc323d4f3f9739f780b9b2c23c77855ee5f6dcc401544d6b64b2770158fdc6c12f4d89beb044e0e85ac7a68d42917b1345114b9a672d1231b2c6c0f969f203531e71bbb4005b103a7dc3a58b5b824a7e01b6eb9f496dfa64d64d8c6777f53aa58d5da046d726f55454c88b6d7d4ab0d2198a89709f118a6b32460b9ebceff3fddc605da77ef3d1ba30fecf07be2f5313f4ee635af5e9561d877e99c", "signed": "e15342a11caf892895e466228863d083b0692f010610748c23df2f11d29475bafce927cafe7f07efb8c347ed5663e73bea89531cedc0c348e79b6e58a75749077c2d8ee82d9abf8aa9c724c75b90990473f131763fe93b30cb04723588621da2a327928b22649fa062cdeabd77761538b2709b8fb7a2006e503509134c929c3011e1d728a57a4e175198075e214253f3f30e01b6e04eabd4de06789558e698b186efe34b32129568b3e8d0d7ea3ff00b3f25a42236893aa8a41b674a0ab5f41e7b28cf5a7cb765e18ead6de6a353a7824a3c49786038d6f4937f3264d6ccf0c0a2465bb693e52b3d1e6eb9ae4cb65d09cff54842e85362857a59f7198a688a3df38513cdd61e21dfd859142c8344a3b8b2a7c7db170f39f87ca3ff8ed427962b2b1a14d122fa2d5aea2a6640117dd258fa0fc54ac6e940bc16d211ec9adf914ab16578f521f655d2127e79e871bf7fa7544719d58ed847850cb27b99eb8f29b16cdcc28b15c1259ab4d589705a406688f605a2ebf58051c43a77c4e01fd6f749d32db4e89f263c2c16de181f0e6bdd0a6a64ffe6f1829444096d9f3e2b67e4bb006650b5929d1f82eb11bbed24e8f1018a7384605a3cf29ab598337939c76a3be861e483c5805ec3cee45e3424847a08558dcc99499fb9382acae56cdc87fbd5b26ff94c86f2e108794383501c8b33366850a76a0dfc0a7cd789a03f01a3e9d9e9ae39fd7245dc29299d24f3b4b167caccd223a99b6b20a3b673dc5f7466d0b2f815098a497ccaf80420168eddbf4da57b8666e9d33c48eb304b4cfcf457cd7659543f6d1e661890f562b43b8b6d1c4dcc077b60bfa533ffab928dbfd955dc5116d770950b690e2106ad52d42c31c22b8848894332b5c699e5c331fb381e5812e7526fdf4b8aa2daaa2ca2cfb9c92111b61cbc3d1eef6c8c6737f05588f04467db8330843acc98dc1a16fbd9d9d94bd8bfde26c3f71dee72b50910c36b240f802a61ca16372f6ffaadb2be4e853c5ed69a3d1f6c7b2de513c53a3fdd0a676f83d09d5c51176047d9200716bf22bae45fe01b3e0c2c51c16e46ad0637f79f9b4d83867704feda9f227831dea263399ca2771a4e78b4df8ac0de6a941eab370b1fdb47daf6642aaeaa63170fa9b3d1e1628f7c4e7cf0ea8b8a8e518cbacef9ade84df032484847ffb61bbd07e8727cc4c25da577b264519b4999fa7c0bc323d4f3f9739f780b9b2c23c77855ee5f6dcc401544d6b64b2770158fdc6c12f4d89beb044e0e85ac7a68d42917b1345114b9a672d1231b2c6c0f969f203531e71bbb4005b103a7dc3a58b5b824a7e01b6eb9f496dfa64d64d8c6777f53aa58d5da046d726f55454c88b6d7d4ab0d2198a89709f118a6b32460b9ebceff3fddc605da77ef3d1ba30fecf07be2f5313f4ee635af5e9561d877e99c", "signature": "e15342a11caf892895e466228863d083b0692f010610748c23df2f11d29475bafce927cafe7f07efb8c347ed5663e73bea89531cedc0c348e79b6e58a7574907" }, { "secret_key": "543d5f1d4a6e1029b1914138fb1f4659e69456557207406688a2035cbbb2a68a", "public_key": "3c83790c3b4553deae4f843b501d26f6167093ee54e279759ffad8cbc061e720", "message": "fe0057f062fc871324b8bd5d427e9a5276231bd309907e5881d7ae53b1f370c2a43302a16510b46064a30736bac90951f1d9881af62c701483ebb9272ad77212eeb5fcbc7ec228d969f8902732113b98e3bf82dfeadd0de5e765d2870b12d1f9b5a28297c9fdd1495cf87789196a7d644eecd93587dbf20c28eb09da286603c582d2129a657db2d17add3558dde029ce27b88352de3f95aba17e1ed1913722db08a795dfbb70d62a8802724cb0f535f848d052aa3dde9166963a8041fccc4e60bfb11de2bf286eb602a4af842f4d1a340d78bbbcb2857f0c308f44bb101e7bc8b741d506094e27bbafa72428ef666ea6ea16f799b4ee58278f045974d86dc72cf5260d96f9c09b2f1181e1a4500f9283dc677f384ff64e51e89f76582020326c388c08a0fd00de73d5d49c06c0c684191a264fff726d872dc3ae496c7b478cfc61b51714192f76463e3d0aab410ea115e8befedb997ddd169921b3207ea66c1f59450b7623129fd1e2dd3da8f5206391171338ea0ec8ef3c59ed8afc69f3865c29a0723a9bbe95a742681ef9857e81abc80c92d2a718a804f5304fef3c63d799a6ef8782a7db46681d0de3506446982267b2152b0c321869e23cce8c4ebebeaf4aa1ebe9283b692605260ff621b03c10822aa5f6d03bdef49c462a68d471e849e164e3874f6e9f6cb3b5f293eb38ae5245a159ec4261a9bf6b5f7b7615fd339ea12733113ce767f883ae6675417fc770b50bd60e6f20addb29c1f7506233e32a7ebfadabff98cfd09b2b3bbd3eae0069548b9d8987af46ca98eb095bacbd874724ba10f3633aa08ab6ec26494ddf6854309b55d43bdbd29a7556f12dfb23cd0db4eb3937a65c4aed96e87b346555f9fc6897943a0faee65ccf394bd89b381beece25d1ba68f8fe32c23b3354f5be7e3ea3c0dec0f7ec2dd83f92b73058892b638d4c3b7242bb8f55bf087ba45a190a698bae675e0cd5e8446f2b21aeb63d2caea0f679a837e79357308d9f0b8af31f9d08008c39ee8d347528713c8850017a7f4ab98a35c7531940fa7621e67203ee782db3a2faa30f3aa850a5ff7aaed84c00ffd214f2c9261735fac3259d50e03c2652505279d91251927de5e56a8b9064ccf9f45dcbef46e1189ced2bc79e6ff652e69097ace5568bb2d5bef3ce21a25b3f79ee275ea34e621380566d704cd93f24dd9020932cc05218c23b5b22fffa7e99ee7fe457876a5e3364c9a8e8b049cfa20969774f506d1996cbe6ef5a37793ecdb04cfdeaed7dcf79ab278474dd770822d4b36fc68e4b2dd661ef99de01de6eec57fa573ede10fbbd5ac6fd6cd8bb4eee509dbb4610374401", "signed": "55201194026fd6448b1d52f83ed20ac284e7e77fa92d5295d33825cea3aca47ec7aaca2fc08679f9acfcedb376fda4619be3272c7445e8705c306141cde16c0ffe0057f062fc871324b8bd5d427e9a5276231bd309907e5881d7ae53b1f370c2a43302a16510b46064a30736bac90951f1d9881af62c701483ebb9272ad77212eeb5fcbc7ec228d969f8902732113b98e3bf82dfeadd0de5e765d2870b12d1f9b5a28297c9fdd1495cf87789196a7d644eecd93587dbf20c28eb09da286603c582d2129a657db2d17add3558dde029ce27b88352de3f95aba17e1ed1913722db08a795dfbb70d62a8802724cb0f535f848d052aa3dde9166963a8041fccc4e60bfb11de2bf286eb602a4af842f4d1a340d78bbbcb2857f0c308f44bb101e7bc8b741d506094e27bbafa72428ef666ea6ea16f799b4ee58278f045974d86dc72cf5260d96f9c09b2f1181e1a4500f9283dc677f384ff64e51e89f76582020326c388c08a0fd00de73d5d49c06c0c684191a264fff726d872dc3ae496c7b478cfc61b51714192f76463e3d0aab410ea115e8befedb997ddd169921b3207ea66c1f59450b7623129fd1e2dd3da8f5206391171338ea0ec8ef3c59ed8afc69f3865c29a0723a9bbe95a742681ef9857e81abc80c92d2a718a804f5304fef3c63d799a6ef8782a7db46681d0de3506446982267b2152b0c321869e23cce8c4ebebeaf4aa1ebe9283b692605260ff621b03c10822aa5f6d03bdef49c462a68d471e849e164e3874f6e9f6cb3b5f293eb38ae5245a159ec4261a9bf6b5f7b7615fd339ea12733113ce767f883ae6675417fc770b50bd60e6f20addb29c1f7506233e32a7ebfadabff98cfd09b2b3bbd3eae0069548b9d8987af46ca98eb095bacbd874724ba10f3633aa08ab6ec26494ddf6854309b55d43bdbd29a7556f12dfb23cd0db4eb3937a65c4aed96e87b346555f9fc6897943a0faee65ccf394bd89b381beece25d1ba68f8fe32c23b3354f5be7e3ea3c0dec0f7ec2dd83f92b73058892b638d4c3b7242bb8f55bf087ba45a190a698bae675e0cd5e8446f2b21aeb63d2caea0f679a837e79357308d9f0b8af31f9d08008c39ee8d347528713c8850017a7f4ab98a35c7531940fa7621e67203ee782db3a2faa30f3aa850a5ff7aaed84c00ffd214f2c9261735fac3259d50e03c2652505279d91251927de5e56a8b9064ccf9f45dcbef46e1189ced2bc79e6ff652e69097ace5568bb2d5bef3ce21a25b3f79ee275ea34e621380566d704cd93f24dd9020932cc05218c23b5b22fffa7e99ee7fe457876a5e3364c9a8e8b049cfa20969774f506d1996cbe6ef5a37793ecdb04cfdeaed7dcf79ab278474dd770822d4b36fc68e4b2dd661ef99de01de6eec57fa573ede10fbbd5ac6fd6cd8bb4eee509dbb4610374401", "signature": "55201194026fd6448b1d52f83ed20ac284e7e77fa92d5295d33825cea3aca47ec7aaca2fc08679f9acfcedb376fda4619be3272c7445e8705c306141cde16c0f" }, { "secret_key": "f8d257fdfcf99796f8ce4d8aade3b225a53c26feecef395b9561d9d587f5a33c", "public_key": "f66bd4877df78aec04ca7e77732899de06777e698629f29969f8fa9c2f47ab9e", "message": "233e1ef901abcb69fb486085d8db0233ff78f37b136f0afe24f7dac1944c3678e74fed58a1ad54835b7dbcb46fff6c3524312273300b6d878a93e0608a4abaca4e3194722bb9e23d17194d8667b84f2db038c24efb8f53409cf5594fddb8bcd61f74cf0726b51c651ce01eb66a59b455f7d8a7d60d3927e0c6c54b138e01925371d2d9d962aa982f5e6085280cc05f356993911fd2039dfc342117970291381d82027db36c799100057d9352b2cd879d9c82af734b7fa297d21149c978aa5e125b20372a9b2e0ed357337efaea1391f3b9ef11e3e5135bb70bdbe32a9bdb7c3c42d5d57cc8dab6811628a01089495cb8a4a76a48296cd8dfafc005ad49d70bb19faca2084a1b6f5e48d23c03fbcf6f106db770f07c33e8e7f4757da904a44dd0e738f3d5733a329375ced74f3c42bfcdbb910100455d6aa7d2e3e3aaa58a829630d376b0b466dc85aac48fe269946a7bc72d91eb37ded2f4a77c684be01093fd12de9d9d83199ccc50959a48d6e9a41427566092f04a0f95ca52372e0762b966ce6232055a4fd757c61b8bad83baef91a3c2772fb32ead8f591ac1e02bbf90a7f6c39079b86fb814cc242e980f0b8b1a2cecb8e6d4e8a5211bf8babf38e829ab9883608bd6d59ea5e836a9b4a4fbeded1bea2ffe977e8cf3615ca4a50fea1f05f1fe53c8eac500323e1f52a806831539957988d79acc7b54f7d02b480c469fd69540fea4bdd68cbdc68cf9c7872fd792591b01e9d9902d8a614f4c21823f23508ffd49ff218bea922ec141eff60da177ccad7d7b9d444f3b03458115f116cc6e37625c39cbadf09362f31d33f4c13c33b6292007f2cafd194f62c643e7a25571564febad7d33e364b633d008b090d7a091358bc69c567b9522b5c1cd01218d38529aebb03d9c2a5eb2285a7176f98c28036f21e19e92b406e94895fa281b35228fbf76e73e1758af1b434a4df98e8cc556b9d83f6b0b7ff52c680f65efe4e00c59b46ce593bf98899805d02b9165b7429849e73953770ae393e4f1f97cb90cd6159cc93952ae8a4d3d56a9a95df7cfabacd4d030d736ea454dfa4b4aed1bcd885d2fbea5ffa2cf2927c137c86be4fe016412628fe7a0a0f02b6b6a9a2168932b943ff8b28dd587e77287790aaaa69a98506c764e6f5ba6338c09f382e1b987d99f14a3e1958cb62ae6705a577f9ffc67306401128741a8d0af03c0aaaf6af06bd88ee4b0af6703e0ea60b0409ace24572fb386e07e9c22c9686bdc66d4fcf3c7461d3833a4c3013243607d4d158217187326df51725a6bc5116e990bef8a5a9579600207206bfc3a6dcf0746ef756fd939e187f668750716c0", "signed": "9235d44807869816e28e42c81c801ffb121de826c0d33dcc4a4e1c932d5228b639bb294e16090a93d1f6904a7004222fda0a55446d9901c72340007bb45ae103233e1ef901abcb69fb486085d8db0233ff78f37b136f0afe24f7dac1944c3678e74fed58a1ad54835b7dbcb46fff6c3524312273300b6d878a93e0608a4abaca4e3194722bb9e23d17194d8667b84f2db038c24efb8f53409cf5594fddb8bcd61f74cf0726b51c651ce01eb66a59b455f7d8a7d60d3927e0c6c54b138e01925371d2d9d962aa982f5e6085280cc05f356993911fd2039dfc342117970291381d82027db36c799100057d9352b2cd879d9c82af734b7fa297d21149c978aa5e125b20372a9b2e0ed357337efaea1391f3b9ef11e3e5135bb70bdbe32a9bdb7c3c42d5d57cc8dab6811628a01089495cb8a4a76a48296cd8dfafc005ad49d70bb19faca2084a1b6f5e48d23c03fbcf6f106db770f07c33e8e7f4757da904a44dd0e738f3d5733a329375ced74f3c42bfcdbb910100455d6aa7d2e3e3aaa58a829630d376b0b466dc85aac48fe269946a7bc72d91eb37ded2f4a77c684be01093fd12de9d9d83199ccc50959a48d6e9a41427566092f04a0f95ca52372e0762b966ce6232055a4fd757c61b8bad83baef91a3c2772fb32ead8f591ac1e02bbf90a7f6c39079b86fb814cc242e980f0b8b1a2cecb8e6d4e8a5211bf8babf38e829ab9883608bd6d59ea5e836a9b4a4fbeded1bea2ffe977e8cf3615ca4a50fea1f05f1fe53c8eac500323e1f52a806831539957988d79acc7b54f7d02b480c469fd69540fea4bdd68cbdc68cf9c7872fd792591b01e9d9902d8a614f4c21823f23508ffd49ff218bea922ec141eff60da177ccad7d7b9d444f3b03458115f116cc6e37625c39cbadf09362f31d33f4c13c33b6292007f2cafd194f62c643e7a25571564febad7d33e364b633d008b090d7a091358bc69c567b9522b5c1cd01218d38529aebb03d9c2a5eb2285a7176f98c28036f21e19e92b406e94895fa281b35228fbf76e73e1758af1b434a4df98e8cc556b9d83f6b0b7ff52c680f65efe4e00c59b46ce593bf98899805d02b9165b7429849e73953770ae393e4f1f97cb90cd6159cc93952ae8a4d3d56a9a95df7cfabacd4d030d736ea454dfa4b4aed1bcd885d2fbea5ffa2cf2927c137c86be4fe016412628fe7a0a0f02b6b6a9a2168932b943ff8b28dd587e77287790aaaa69a98506c764e6f5ba6338c09f382e1b987d99f14a3e1958cb62ae6705a577f9ffc67306401128741a8d0af03c0aaaf6af06bd88ee4b0af6703e0ea60b0409ace24572fb386e07e9c22c9686bdc66d4fcf3c7461d3833a4c3013243607d4d158217187326df51725a6bc5116e990bef8a5a9579600207206bfc3a6dcf0746ef756fd939e187f668750716c0", "signature": "9235d44807869816e28e42c81c801ffb121de826c0d33dcc4a4e1c932d5228b639bb294e16090a93d1f6904a7004222fda0a55446d9901c72340007bb45ae103" }, { "secret_key": "8da9f54da0b6a5a38985b88b71339dc7384cfd5a60bee159c394c22363bc7edd", "public_key": "1ac1a8edeb217ae9b3a3de530d24d83e11fb6538cc709b52994fa9c3f1faddc8", "message": "bd53baba6657d8db8becae6eabffa52b015a5a05fdd2e070647de96f9ca4dd219fe0da608fa0447f46d17c9a358244cd5408596582ccd3cdd0151d6f0923e63d166837845f273fca7af6c89d8d5246175c2167fbb9c2ebf6a7595491f97a9713b02bdf413e209ab22db7dd2b37fc49436918ccebe5746bc64ddd6dce19ec4558c40e0896e21909280cba06d16b72f31d987685d071db8155e99ebcc6c821d92683fdcee08668a5ed58f839d9edafb9f1459d48de8e1bb6f7ce84da0be411c8f7be1b9a24bc5d0fe3a96b02350750a5cb250b49555a487672bdff3c3f784e3fb63c1c97ba6ae43a10e196f188dcc635e214e29df509e5608a5367aa2800c1a96ad936a9e2a579b8592ec13a359336a62788c3ec55c0ffd6a7d49ecb7c682efa308199f708d79d0e8856366d269fab24eb1a075c96c881cab89708ced279230d3f1f3ee173672283eb8d8a824038f648ac437275d75a0e15f71ce56a8aeb771f07a7f32afc9d612a13bd83b7f93990d38fc3f4f4ab8aa9430c65736eb64b16806e995c1ce9dcf4c5544e7b3d01541c5721bb4be4cf0ae382a0c1b169d8e418defd559442acea14b00d705bcfa78be0756a8f377cbf183bf25906874115d8ce4c3ba874102938a4ea16036d91a42c5f8f188655cacb00c88e3a68508816e5e1c31d27180bbba9518a9630726d7d047dd8d2c0401219e14e6badfc9b95b77a6ace9bea71d1b47c218903a115ad029e7f2039ea23cfd1fa6a44d089fcacb678153d674c0e081764995595cb6894895f08e25b984e3a694c92fc7cbe0ffc4697230bcb0ca408c2d7085c11badeb3e6c0e75e6c498db1bec1ed2a3e2445c32b1913a89500f69e7f23f41d62e5c189f39a056cb9fc68a452023a333f75220cb9b94484acac6bbc671f59ffa072b71a1896a1b306e9dc558da0ec20f373e4c355e0c5eccbbf1350c8c07914892c454defcefb717be34d087aeb244a86ff49a6c470afb36b40fe8b71c505a4ff7af2984c65284938ec0e405231521f4810147dc4e373fdab6647b86f79827502fd087e27f310d6b312363113842155c57a32ba03b6cff965530bd795fc292e241c9b6ca085140032efe746f37d57e958421184b8a4c1a6a1e37d45e077319833068ddcb89d38c75beba1a6e8e4052888ec18162dd6ff0c59a2fd0b47f3119195680ffccddf5f76b35f022aa66bd1ac56f1ae333e9b9d046f0b79a892ecc4f8d2f31e17536c4c62a9b5e063dd2dce37d3d0acb42023eb2f2ea329d3876c2386a02276fff9d308abbadb7274301a6962ecaeeb20bef5e36afffc387ca8e185e562b865b49204c17b2a70119b061c29c0fe9004", "signed": "f6dcc2d27baf16c4f4817f87499157d3ac1f84ed398a5e8b0d50f42edd7385cf06337a0236109970b79ca09d7c9831c876a802799421c2abd07587f5eb66160fbd53baba6657d8db8becae6eabffa52b015a5a05fdd2e070647de96f9ca4dd219fe0da608fa0447f46d17c9a358244cd5408596582ccd3cdd0151d6f0923e63d166837845f273fca7af6c89d8d5246175c2167fbb9c2ebf6a7595491f97a9713b02bdf413e209ab22db7dd2b37fc49436918ccebe5746bc64ddd6dce19ec4558c40e0896e21909280cba06d16b72f31d987685d071db8155e99ebcc6c821d92683fdcee08668a5ed58f839d9edafb9f1459d48de8e1bb6f7ce84da0be411c8f7be1b9a24bc5d0fe3a96b02350750a5cb250b49555a487672bdff3c3f784e3fb63c1c97ba6ae43a10e196f188dcc635e214e29df509e5608a5367aa2800c1a96ad936a9e2a579b8592ec13a359336a62788c3ec55c0ffd6a7d49ecb7c682efa308199f708d79d0e8856366d269fab24eb1a075c96c881cab89708ced279230d3f1f3ee173672283eb8d8a824038f648ac437275d75a0e15f71ce56a8aeb771f07a7f32afc9d612a13bd83b7f93990d38fc3f4f4ab8aa9430c65736eb64b16806e995c1ce9dcf4c5544e7b3d01541c5721bb4be4cf0ae382a0c1b169d8e418defd559442acea14b00d705bcfa78be0756a8f377cbf183bf25906874115d8ce4c3ba874102938a4ea16036d91a42c5f8f188655cacb00c88e3a68508816e5e1c31d27180bbba9518a9630726d7d047dd8d2c0401219e14e6badfc9b95b77a6ace9bea71d1b47c218903a115ad029e7f2039ea23cfd1fa6a44d089fcacb678153d674c0e081764995595cb6894895f08e25b984e3a694c92fc7cbe0ffc4697230bcb0ca408c2d7085c11badeb3e6c0e75e6c498db1bec1ed2a3e2445c32b1913a89500f69e7f23f41d62e5c189f39a056cb9fc68a452023a333f75220cb9b94484acac6bbc671f59ffa072b71a1896a1b306e9dc558da0ec20f373e4c355e0c5eccbbf1350c8c07914892c454defcefb717be34d087aeb244a86ff49a6c470afb36b40fe8b71c505a4ff7af2984c65284938ec0e405231521f4810147dc4e373fdab6647b86f79827502fd087e27f310d6b312363113842155c57a32ba03b6cff965530bd795fc292e241c9b6ca085140032efe746f37d57e958421184b8a4c1a6a1e37d45e077319833068ddcb89d38c75beba1a6e8e4052888ec18162dd6ff0c59a2fd0b47f3119195680ffccddf5f76b35f022aa66bd1ac56f1ae333e9b9d046f0b79a892ecc4f8d2f31e17536c4c62a9b5e063dd2dce37d3d0acb42023eb2f2ea329d3876c2386a02276fff9d308abbadb7274301a6962ecaeeb20bef5e36afffc387ca8e185e562b865b49204c17b2a70119b061c29c0fe9004", "signature": "f6dcc2d27baf16c4f4817f87499157d3ac1f84ed398a5e8b0d50f42edd7385cf06337a0236109970b79ca09d7c9831c876a802799421c2abd07587f5eb66160f" }, { "secret_key": "7a2efd390124d3fbefc54a577106e74b2d1f5dd504c050d0d359e53c0f5c872b", "public_key": "efc303d922e88f70f38c1a2b920684ef663034a1b23ab9d69b6ce8ed8706f7f7", "message": "238fbe9fb35c725c6c1f329248094bc7da1b273edc7699a7e3452b5788d87867defc40a00590e87580d2c0275df5abcce0e1aaa18290bf93b44e5ad9d760dd21f1aaca383178f9fff9130f73187ba9d31ea3604a1cdf3911e14377a0ce8b44189adaa7aac23b6cdc7a425b7ea745508455704f9ad7a8952718c398b421b6e09cb78cb52a1814ee2e9639ec68d361f0a32041d6e7425b4bb33c70196e2400eb812db8506c9f3245bd988fbc891be20cb0691559fc916b57ff96c9b14489e0993cb739a39da246d01a6ebd07583581f250bf480bc44b2c3391542d595e4d399490195f8445df638f34698f1a96ed27b3533e3eb67e8f865865fa9555ed34df11157641a00e6d60cf623fec1a92b87a15d765185fd9055acb38d75c99db4fce7b0e39fdc3f851daf65c7a33f464816931839fefe8e58d9ab742b861873fd229189e59cd4ce8239fc9543f539d2d296114266ea8c6fd152ac6b342e5d1a557ab35cac51e2d1212ee317c4d26716829e25746df17d2a622c243f3ecbb65f57ab0f4270e3d0668a962502245b94c06df0c5e39e353aa842ea080cf502708b1dda2d001824de458d37762af2cdfd5a6d3f35e08a18e14aa7a642c51e4047e637517846df646d07336fb172434e0883e2b77d8ed1c52c9cc636a56a19e57a5f161b92d1dcbfa496f344ae6d4dfdc9569ade457a49091362e5a0cdd81b3753243fdac30a2d27ea026a5e601441ecd5537a7201bdcb7fd58b240d0229fdd9babf112b5694812250e768d7c0ce6ca565ad06ab8f78a5c9950eef538726f576c4bd2e0755c7f983929372a5fe11c73f9e1fa453ab54b5817aad3596756127d84e3119453e8825bb8460d851f1f7e4a2838a2be786b233504a691db0fa22a5f41fe3fd3c9b538b04f409e091809486b28ad0deda7b38a42cefc48de7d8679c03bf877238511820d0770cc8d7b4172377823a0b99149abb8918bfb66d5abfcd10060b05cb4f239dd4281d93483504b731eaf5add515f1f3c3b52b4e3bdaf976a17b3c9ec61bfc8e77116715804532cf2dbf20b7ba5ead85afb952beec2fccff85ff5072ba4ed6b5438ab1520c6ef4b0b26f12e84aedd65ce5c7bbe6acb6772f593a6b4f81ddd9d502746505047c812a0067afceb8dc9bff30d4087f8d5a375eca605a0622784d8fea278cd1a5241ad4b3f1b914f74f73bc36ee7cc82d96efda63a3b6799730f20656c12356c79069b2be6f9b77be101983118823ea66e7c2098fbc72fc9c039dfe30f2daba13c3bdefb8a780beb5cb1b6c286a6b3ef48fd15c66c045ba29f0970413b988d0ea004ab84c93919f04f9bf8caf58c4eb478f358ef8b68", "signed": "c28b34804805d81f7aef784970670edaa417232bcc67da9b51e9c3d74fc4991bde97a06bd53fa00bb440fd5616cd0de6e9b0d19f2f68bfaf9d4c5172c4e5200a238fbe9fb35c725c6c1f329248094bc7da1b273edc7699a7e3452b5788d87867defc40a00590e87580d2c0275df5abcce0e1aaa18290bf93b44e5ad9d760dd21f1aaca383178f9fff9130f73187ba9d31ea3604a1cdf3911e14377a0ce8b44189adaa7aac23b6cdc7a425b7ea745508455704f9ad7a8952718c398b421b6e09cb78cb52a1814ee2e9639ec68d361f0a32041d6e7425b4bb33c70196e2400eb812db8506c9f3245bd988fbc891be20cb0691559fc916b57ff96c9b14489e0993cb739a39da246d01a6ebd07583581f250bf480bc44b2c3391542d595e4d399490195f8445df638f34698f1a96ed27b3533e3eb67e8f865865fa9555ed34df11157641a00e6d60cf623fec1a92b87a15d765185fd9055acb38d75c99db4fce7b0e39fdc3f851daf65c7a33f464816931839fefe8e58d9ab742b861873fd229189e59cd4ce8239fc9543f539d2d296114266ea8c6fd152ac6b342e5d1a557ab35cac51e2d1212ee317c4d26716829e25746df17d2a622c243f3ecbb65f57ab0f4270e3d0668a962502245b94c06df0c5e39e353aa842ea080cf502708b1dda2d001824de458d37762af2cdfd5a6d3f35e08a18e14aa7a642c51e4047e637517846df646d07336fb172434e0883e2b77d8ed1c52c9cc636a56a19e57a5f161b92d1dcbfa496f344ae6d4dfdc9569ade457a49091362e5a0cdd81b3753243fdac30a2d27ea026a5e601441ecd5537a7201bdcb7fd58b240d0229fdd9babf112b5694812250e768d7c0ce6ca565ad06ab8f78a5c9950eef538726f576c4bd2e0755c7f983929372a5fe11c73f9e1fa453ab54b5817aad3596756127d84e3119453e8825bb8460d851f1f7e4a2838a2be786b233504a691db0fa22a5f41fe3fd3c9b538b04f409e091809486b28ad0deda7b38a42cefc48de7d8679c03bf877238511820d0770cc8d7b4172377823a0b99149abb8918bfb66d5abfcd10060b05cb4f239dd4281d93483504b731eaf5add515f1f3c3b52b4e3bdaf976a17b3c9ec61bfc8e77116715804532cf2dbf20b7ba5ead85afb952beec2fccff85ff5072ba4ed6b5438ab1520c6ef4b0b26f12e84aedd65ce5c7bbe6acb6772f593a6b4f81ddd9d502746505047c812a0067afceb8dc9bff30d4087f8d5a375eca605a0622784d8fea278cd1a5241ad4b3f1b914f74f73bc36ee7cc82d96efda63a3b6799730f20656c12356c79069b2be6f9b77be101983118823ea66e7c2098fbc72fc9c039dfe30f2daba13c3bdefb8a780beb5cb1b6c286a6b3ef48fd15c66c045ba29f0970413b988d0ea004ab84c93919f04f9bf8caf58c4eb478f358ef8b68", "signature": "c28b34804805d81f7aef784970670edaa417232bcc67da9b51e9c3d74fc4991bde97a06bd53fa00bb440fd5616cd0de6e9b0d19f2f68bfaf9d4c5172c4e5200a" }, { "secret_key": "ef3648cbe73402ab450cd6ec37e545d0cd2c999ecc1fa381a45c660e18533032", "public_key": "52a1a45273872676582cc767339926414cd5d03d980cf629dda2d1a205e9830a", "message": "6a93378f880cf0ffdb8e07d683cc352e2a1033c450baa0e8c4e16205fd0c02743b0ea064971d911e494713e6d94a02172ed014d506592ec6c70a9c97855246bf3d26f3cf74f493c1b697a0c414160c341412830985430806a0cb3c8475e7e5a973686c24d5ef1be7d0065096feb52eab260b5c488af09270de6decd33fea8589dd1021baf41e3f255fb8fa1916ebd8531eeb2f886bb3b3b04f9af6b276c35923f10d3a0af1e3f58b0d15aed165045f206f3f430abdff09449097e4b26d00a8f9f1e8f7a19f38588124c328ec43a9cfb43d3b2c6bdf6a3c1a102e0e333de1ac214a6df76dab44ba76bf035273b7ff6238ec82483b2d2d9d54291a72270f88933b786cac051d990b3cf740845fed3a67867d7c7c05674e7cb02ca5b7acdfba3852803a3d56c4d5c13bb1d7723467741eac1f2a7acd3a95f3a51610a486fc53a9851628c557d36d8a4cd37aae9c4174dbbdb6bd885cf40b382b8ded24a4522a278fef76c45319067e55286e7b08c603486e38a0acf47edef848ecbe942eceadb8636c833feb882a51a4595e24f607ca3c9da1b2404ce5c747e06264174d64504331709bef30055a5d695e09537c8f8c1e5a3a5db06599e319dfdb28729665273bf868955ea56427f08bacd777f179b302f3f68d04f3f3883d344955b655ddc6d5282b6d4df1d83630210e699178e11f722e9e5cda672892ae9b23e8169cbb548093b83e643eb499d937d28f3811597b6484102f0c8eb8c8888cdac229aebf89086a6495ac551f3bbdf2d1c9a93ed1d3a861eecd9eb839949bfbe6a4f6e6486ededab5229d532b58976d67512f9f71ae79b4145ca2fa497a165f110717666ca3340bbda8df1f82b8c054cf7654c35690168f96277d41c1c236b68198173c6e2b0a208ef83c02a43e473d90686ace75b5bd321b3f54281327a673cad4d4ad3040d48cf493ea231b3fec06f39932d7f70a38428df8fee4370532ae5fb112059f0a1d4fbe11b5a23bb87635429ed33ad1f6148014cbc160d93ca2592053a6e95378d6cd3f50db52be928e4092fe5d2b7095a9566864adfda59fd5f2fb6254bd5917b70fa14699665a37297c983c1bb9efe1c67b413dd1a8530cbf227297a8bbf93a8a02454e8e461ac212b846a70d5d56d6c3a6e65a03be0580219bddec88d4038911fd9574563f33e0f9e6044688d3dd48fac703869aa09d96efee7d6c68071d9922d5e8ed8dc40f1b798f1c580f7859cb84f1e14b5e74ddea16ad5cbeea4c48fbcffd29531accc0633938e3bcb2212676b61ef901e9c831a41774d8317ef35af76990bd24931fde6d407e22e763cf6a5790b23761908eee609637a2c11059", "signed": "f670792942ec414428475638853c42728e86ba12bbe85948b39134cf6e2bd12813e0d83e51e657c90107ad93a4788aa38313fa962f6767a8f7805bde65ca420d6a93378f880cf0ffdb8e07d683cc352e2a1033c450baa0e8c4e16205fd0c02743b0ea064971d911e494713e6d94a02172ed014d506592ec6c70a9c97855246bf3d26f3cf74f493c1b697a0c414160c341412830985430806a0cb3c8475e7e5a973686c24d5ef1be7d0065096feb52eab260b5c488af09270de6decd33fea8589dd1021baf41e3f255fb8fa1916ebd8531eeb2f886bb3b3b04f9af6b276c35923f10d3a0af1e3f58b0d15aed165045f206f3f430abdff09449097e4b26d00a8f9f1e8f7a19f38588124c328ec43a9cfb43d3b2c6bdf6a3c1a102e0e333de1ac214a6df76dab44ba76bf035273b7ff6238ec82483b2d2d9d54291a72270f88933b786cac051d990b3cf740845fed3a67867d7c7c05674e7cb02ca5b7acdfba3852803a3d56c4d5c13bb1d7723467741eac1f2a7acd3a95f3a51610a486fc53a9851628c557d36d8a4cd37aae9c4174dbbdb6bd885cf40b382b8ded24a4522a278fef76c45319067e55286e7b08c603486e38a0acf47edef848ecbe942eceadb8636c833feb882a51a4595e24f607ca3c9da1b2404ce5c747e06264174d64504331709bef30055a5d695e09537c8f8c1e5a3a5db06599e319dfdb28729665273bf868955ea56427f08bacd777f179b302f3f68d04f3f3883d344955b655ddc6d5282b6d4df1d83630210e699178e11f722e9e5cda672892ae9b23e8169cbb548093b83e643eb499d937d28f3811597b6484102f0c8eb8c8888cdac229aebf89086a6495ac551f3bbdf2d1c9a93ed1d3a861eecd9eb839949bfbe6a4f6e6486ededab5229d532b58976d67512f9f71ae79b4145ca2fa497a165f110717666ca3340bbda8df1f82b8c054cf7654c35690168f96277d41c1c236b68198173c6e2b0a208ef83c02a43e473d90686ace75b5bd321b3f54281327a673cad4d4ad3040d48cf493ea231b3fec06f39932d7f70a38428df8fee4370532ae5fb112059f0a1d4fbe11b5a23bb87635429ed33ad1f6148014cbc160d93ca2592053a6e95378d6cd3f50db52be928e4092fe5d2b7095a9566864adfda59fd5f2fb6254bd5917b70fa14699665a37297c983c1bb9efe1c67b413dd1a8530cbf227297a8bbf93a8a02454e8e461ac212b846a70d5d56d6c3a6e65a03be0580219bddec88d4038911fd9574563f33e0f9e6044688d3dd48fac703869aa09d96efee7d6c68071d9922d5e8ed8dc40f1b798f1c580f7859cb84f1e14b5e74ddea16ad5cbeea4c48fbcffd29531accc0633938e3bcb2212676b61ef901e9c831a41774d8317ef35af76990bd24931fde6d407e22e763cf6a5790b23761908eee609637a2c11059", "signature": "f670792942ec414428475638853c42728e86ba12bbe85948b39134cf6e2bd12813e0d83e51e657c90107ad93a4788aa38313fa962f6767a8f7805bde65ca420d" }, { "secret_key": "2c8ee7fa9ba28ce7049676087b1163b241118d34cdf534aebe8ba59282a62ac2", "public_key": "244c24f5ecb2dd1d1463512221325d73c81ee4d8adb8e01e23345caf9ca5353b", "message": "07669a8964f06380d2d4982cb6349de550b38cbc35db2ce572de887f663055736faac7ec07c32df60ee2598422bf37e7cf319ab3c9055608ca0c49757d7688e2013b8244f35404f45ac219497fe924de93a58d0f721aed7825f63b2667077c161eb4dd8bf7ddbdbbc19a9eae5978978d5aeb33a06dde18e612e05bdbcae0161aa2389038026429960dda3aa17e967d10773ca49735d8ecd7409be165c09bb0b509691d591c185c93cdeeae95352316544680523821458caccf528ac0454e4cddc6df0d1ea5f1f5cc1eeee05e19a2ad0b6a49736ed8552336fcfcadbd931b0b8e963be05c8e7037388552512b6823583e4a14384cef5029232d3e0bafe466351b4bb3f567545ab41fa46bffafa877a12b38a27abd64f77fbb4db466ff7f706504141d3add0d7372f16fe3d8c69f6299d93966d624a3070eadb8b49f29fab4844c7528a2a40b66987060695caa66b86718c51049acf4cfad3853edb492e368cbd073968ecaa4a1ee6046b5e826e901f4a808c0427c026fe2f7b2e1968667b53a7d36d702f2ff82c642d34919f8e9aaafe462a3d4f92692deac752be348f54cf089dd9cd051846b04b71931e19e89d125864bfa8948ace0eff33c45110569a0df3753f4c58d8002b5bc38102ec2ecf695fafa8916da9002387e44f96dabf8a982c53c9badbc37bde437f146f77d8f7baf12873196b0c36193af55f542d9968aed8069ab9fbcd6814ec472799ad09c730d41eddeca3b6269d31ab523b59547077376345b05f2ae69b4ee728c863d1bc04e9b7d3d0fcceb359cbd0858597af2d6063e253fae2c3f25034c33ed59edd2782868298681caf564db8d19366f34eae85ba73c1e2389b0dd78a9d2caa0f23c9ad5f6cd9f2c4ad5d58946adb718cb83da58e2fcbb6025bef4660a83e0af55e2030802932f2a896a096079b754c99f7b6423b45a86472e6723ef8896c4324c73d34ad58a4c01b38a97c73be5aa7f74a2fa4d0795af6dbfcd6d4eb442a7e204db4ecb1f8a226bdfa21b6eb171c9e59f1a192e23a76c352b04d8a80233985b77a29c020119ce651c7f4183d0e9c19fe18aa1020c25e4589dee34b901bdaf9ff9450c91af3c1db670b477e0ac2107696c9ec0d31d82647b68ea19499fe34a8e2e7b378dc7e75424e8c45645b0c2818e9f885a1c58415bba1c3f2a77549bdc4680dbcd1650c75d0f452a6b208591df0fa6e181da2abfab444621d5f77c2cd79556467246447a89f0aaacad660c9a925ebafbad43c478a3c850a27e01019d88a5b1dc81b5d2e9f740a028ccb72c1acf897ea5ad89e0f9448888d5b15ce6e42977f7a729155a284d118758ac65f3fbb98deb65", "signed": "ca0bb6c12356555f6e1d8f5c8aa7b5e80cd280e8b1b9ba2ec9550f622f482c3a9ad3be03a4c9dfc10d0112b0189de94bffafd7034114e0e0d42c23f32dc8180707669a8964f06380d2d4982cb6349de550b38cbc35db2ce572de887f663055736faac7ec07c32df60ee2598422bf37e7cf319ab3c9055608ca0c49757d7688e2013b8244f35404f45ac219497fe924de93a58d0f721aed7825f63b2667077c161eb4dd8bf7ddbdbbc19a9eae5978978d5aeb33a06dde18e612e05bdbcae0161aa2389038026429960dda3aa17e967d10773ca49735d8ecd7409be165c09bb0b509691d591c185c93cdeeae95352316544680523821458caccf528ac0454e4cddc6df0d1ea5f1f5cc1eeee05e19a2ad0b6a49736ed8552336fcfcadbd931b0b8e963be05c8e7037388552512b6823583e4a14384cef5029232d3e0bafe466351b4bb3f567545ab41fa46bffafa877a12b38a27abd64f77fbb4db466ff7f706504141d3add0d7372f16fe3d8c69f6299d93966d624a3070eadb8b49f29fab4844c7528a2a40b66987060695caa66b86718c51049acf4cfad3853edb492e368cbd073968ecaa4a1ee6046b5e826e901f4a808c0427c026fe2f7b2e1968667b53a7d36d702f2ff82c642d34919f8e9aaafe462a3d4f92692deac752be348f54cf089dd9cd051846b04b71931e19e89d125864bfa8948ace0eff33c45110569a0df3753f4c58d8002b5bc38102ec2ecf695fafa8916da9002387e44f96dabf8a982c53c9badbc37bde437f146f77d8f7baf12873196b0c36193af55f542d9968aed8069ab9fbcd6814ec472799ad09c730d41eddeca3b6269d31ab523b59547077376345b05f2ae69b4ee728c863d1bc04e9b7d3d0fcceb359cbd0858597af2d6063e253fae2c3f25034c33ed59edd2782868298681caf564db8d19366f34eae85ba73c1e2389b0dd78a9d2caa0f23c9ad5f6cd9f2c4ad5d58946adb718cb83da58e2fcbb6025bef4660a83e0af55e2030802932f2a896a096079b754c99f7b6423b45a86472e6723ef8896c4324c73d34ad58a4c01b38a97c73be5aa7f74a2fa4d0795af6dbfcd6d4eb442a7e204db4ecb1f8a226bdfa21b6eb171c9e59f1a192e23a76c352b04d8a80233985b77a29c020119ce651c7f4183d0e9c19fe18aa1020c25e4589dee34b901bdaf9ff9450c91af3c1db670b477e0ac2107696c9ec0d31d82647b68ea19499fe34a8e2e7b378dc7e75424e8c45645b0c2818e9f885a1c58415bba1c3f2a77549bdc4680dbcd1650c75d0f452a6b208591df0fa6e181da2abfab444621d5f77c2cd79556467246447a89f0aaacad660c9a925ebafbad43c478a3c850a27e01019d88a5b1dc81b5d2e9f740a028ccb72c1acf897ea5ad89e0f9448888d5b15ce6e42977f7a729155a284d118758ac65f3fbb98deb65", "signature": "ca0bb6c12356555f6e1d8f5c8aa7b5e80cd280e8b1b9ba2ec9550f622f482c3a9ad3be03a4c9dfc10d0112b0189de94bffafd7034114e0e0d42c23f32dc81807" }, { "secret_key": "ddd8e9ff855679896a1397b427db8543abe8bb5dd122e3e302ccfce5fdc63e12", "public_key": "5a9a312e892a10b98d0dcdd28db3481c3c28add5ad0b194616da4a3df7660109", "message": "5e8feec509350d2ee7955b6f3e278278a4cb48ae72b46589e478be59747df5394a169f19e10db53202a6a52320b63a9a2b723fd31aa2db6d58c57332da3178bcf966c53abda35f12daef9edcf399e4a8c5f83d36f44a17d79846bfc96ce690194c219a29892f0367a7ab3844837879e3818db8d70c4e3fba4d28073464df2085951038fea43281b6b606dc8846b30b0763f2ca82bd5021f9117035a77bcd1075477c5f43214334d4d4cedd18f738d676c7b51a185ffa8d04101186a4952bbd8722f53990b60637041e114aeb8ce7111131d4db3fb4d35d995ad8d6650c0c4ccdce9dcc39db188a68785562740626b3ae3e023f40772ded876a45cbef74a058fd78c1a1ff2c2451e111ac1b4b7ee4c81cd76310d4d298fb3c49f5e6401908a630fa85db7471804fe990847f0f759472f593dcf02e113e15e564d30d5984692da55b0b7f2219c4ac1626511acf194dc7026eb9d367a4a2f1dfb515cb2c08da4fe595c85811120cba2ae7b66e67c91fb8fbcb9d99f13e50fd67464d90c8dcf6935523cf6d13fdd10635b9232b7a61dcec9a2b921061410df1de6a45167fb9f6f109dcc08891f203b274a3b68271b3f35e74f94bdced0c5ff8637173a176e7dacc81f2cdc4fb0d52d1dfa7f27b552fd8d87a1c55d6947fd92ed3253f9594db7df17a7fc6a75ecf4faa4d1e21b676b3727d77fbd43fa7be76bfb58fc309e5675f0a859cc47f37b1bf455932d824e86378de7a7e8c40ced22090044dbbf91c70e528eacdef3785ba3c69a3735af6709cd76aab28a6aca6e844974b10b3fb7b0986007a727c2c8fc95b25f31f146b36acd4c537074920aff247de0f179c13ca57790a6a71d62e23321ccc75b7f3b0afa0d03527c9114a7d4e30c1ace6d7712013dee66699af9c561c44ae6198ed39104e6061ae2c45a9a3c74b5d0fbc4a33e8dfe2a8acc9511ef7e6567133f9fe3554284a75a059a649dd24ec04a57730c6d2e9bf114ea58a8994abdb0c1943241572c79ead043ad1c8caaf5c9da53dd05522febc403354d62fe3ff93882df75fb29458d22e6996c35b69faaef2e0c4163886cb3c3d0f60e150d363d6db59fefc626b1bbb1e052a62414c4b7856d72093432b08f821bc784a5a6b0bc2649c2daa508658980d802291e734abaff06afbf2795e4e354d5221dc4f52cc96d6b8cf1808b1a8208db7daa80ab710c56a8b0e9cb8081dee93f5f015f07664463a3dccff7c8ad19923a97e39045bcc4dce0a73d49c56d5e937bd11e61823401c066206e313e60b47537e34704d7d3515559bb9d0532d028e28a57a879fd617cc61f7f776bd6a008cd4f812378ed37f394bb97e6e756da819", "signed": "df849b7bd29745f8becdddf6c9baf094d7a98cc9338c344eca17fde075fda8d1543299f625982317db7b3c773b64f7d1f28692ac453b81d7ec7b7ec3417ace045e8feec509350d2ee7955b6f3e278278a4cb48ae72b46589e478be59747df5394a169f19e10db53202a6a52320b63a9a2b723fd31aa2db6d58c57332da3178bcf966c53abda35f12daef9edcf399e4a8c5f83d36f44a17d79846bfc96ce690194c219a29892f0367a7ab3844837879e3818db8d70c4e3fba4d28073464df2085951038fea43281b6b606dc8846b30b0763f2ca82bd5021f9117035a77bcd1075477c5f43214334d4d4cedd18f738d676c7b51a185ffa8d04101186a4952bbd8722f53990b60637041e114aeb8ce7111131d4db3fb4d35d995ad8d6650c0c4ccdce9dcc39db188a68785562740626b3ae3e023f40772ded876a45cbef74a058fd78c1a1ff2c2451e111ac1b4b7ee4c81cd76310d4d298fb3c49f5e6401908a630fa85db7471804fe990847f0f759472f593dcf02e113e15e564d30d5984692da55b0b7f2219c4ac1626511acf194dc7026eb9d367a4a2f1dfb515cb2c08da4fe595c85811120cba2ae7b66e67c91fb8fbcb9d99f13e50fd67464d90c8dcf6935523cf6d13fdd10635b9232b7a61dcec9a2b921061410df1de6a45167fb9f6f109dcc08891f203b274a3b68271b3f35e74f94bdced0c5ff8637173a176e7dacc81f2cdc4fb0d52d1dfa7f27b552fd8d87a1c55d6947fd92ed3253f9594db7df17a7fc6a75ecf4faa4d1e21b676b3727d77fbd43fa7be76bfb58fc309e5675f0a859cc47f37b1bf455932d824e86378de7a7e8c40ced22090044dbbf91c70e528eacdef3785ba3c69a3735af6709cd76aab28a6aca6e844974b10b3fb7b0986007a727c2c8fc95b25f31f146b36acd4c537074920aff247de0f179c13ca57790a6a71d62e23321ccc75b7f3b0afa0d03527c9114a7d4e30c1ace6d7712013dee66699af9c561c44ae6198ed39104e6061ae2c45a9a3c74b5d0fbc4a33e8dfe2a8acc9511ef7e6567133f9fe3554284a75a059a649dd24ec04a57730c6d2e9bf114ea58a8994abdb0c1943241572c79ead043ad1c8caaf5c9da53dd05522febc403354d62fe3ff93882df75fb29458d22e6996c35b69faaef2e0c4163886cb3c3d0f60e150d363d6db59fefc626b1bbb1e052a62414c4b7856d72093432b08f821bc784a5a6b0bc2649c2daa508658980d802291e734abaff06afbf2795e4e354d5221dc4f52cc96d6b8cf1808b1a8208db7daa80ab710c56a8b0e9cb8081dee93f5f015f07664463a3dccff7c8ad19923a97e39045bcc4dce0a73d49c56d5e937bd11e61823401c066206e313e60b47537e34704d7d3515559bb9d0532d028e28a57a879fd617cc61f7f776bd6a008cd4f812378ed37f394bb97e6e756da819", "signature": "df849b7bd29745f8becdddf6c9baf094d7a98cc9338c344eca17fde075fda8d1543299f625982317db7b3c773b64f7d1f28692ac453b81d7ec7b7ec3417ace04" }, { "secret_key": "a886f4d3f34e320ec6d5f4caa863f81477df772eff97e64a37a05f4211d190a8", "public_key": "e9bc96c81e878110268b55def7ea4007a4ef9f54d383d5fb0f6d4343e1010f38", "message": "8b831b877bc3a99f613c89cda698b3759d643822b5a88faf3822ecb2ce98f671d7554321b24b74b4e30a663f7a5570ae917f479bda29894b1a8c028c9d193e4e7ac11916dd8e9c3f0ec0ef80bd27fdfeee80c170c78140b24c15271415acf75c26956a4d4bf99d40e861e9078320d097e1259e5ec17b583a95e52430dd8c008ed8c7dd1de1becdd1e6bfec4bf3347a22dd249f3ac307a2945e9137fa4a8c26c8021077239cb324816a8dad32b01ee34a08903098cb9c4245291b903c9627074095249e782813477032ba32ef041a07486eb4478c57b9d532269a4a47cb5e974df7e01096fbe4f1ccd4e663663487974c62cdd94d77716c8479d79f6b6a7d9c155988cf3902fb697424963ec4ec34ff2a35d742c4455a593bacffc4d9699ba7626c76cb1a616253751887f6ffe2be208c713df1ab636d722ea06c1c03a57f2cec0803866cca3335c28bf41c7def81acb38858dc10e59467208624967e2e22d9e5661bb945f9e0517687dc80f9b8fdecc8a97600b6c219a3b23a90b6d18aaace2c78400ff38c8c05967f544b6a606c71ac199eafd07eb5848df1657efb233fbabae63a05638191a0af7484a1bae1581375672c571e264f604225173a54a38dd62ae7130d05dd291ad12354de86a6e113e83f6d668516157b7967020dc6517d8cf42dd7b1a897fe1b4e04553ce26e299980aa5f7ce0179bf4954f01c2a23654e5e9731e1447347fa43aa8b2cbd6d4b2df93fa54af71e5028a6da8c71ef3c50c0de24dcaee785678e92aafabeb233b011f45c1064965085d2547050f21c652aa533afe918aa0f9bdaa2607b873ccd3dbd1d3a8cc62172ceb43b921ef6b25c06b0992e4df2b91e371b0ef2b3947388daec8ec6f7e3867d1f61072af590154fa619a07f87e02bddc7406314270af1c15e8ee88b39c01be602e4f0b52d9a0724e71eddd7fa9134169c5faab915979eea9362d0f1f9160268162dd38db02fcfb41350aa08e1e1409b2288db1fe4a0e586b5910f4de894bf9974f6a4983013a190e7a736d14ec54c3644a3ee958a5bdfbcb6297aba43af6c72746bb135410507d8fdde73a2a48b746f918bef9ed92c5be62dd5523fe14b16d6384ca46ef59b2185fe933383a2c7a9bf02da9d0fd8b0c7d7bde6b439f9960155e345d685d4dc3c71404d656811923aa3c47d4b09a0baef0a12e75b6439ba8135db15865874222cd7aa428f5ca5ce5140e22ff92697f37fc70b5b4c94d3314e6aa16b2146bca4fc94157951fc49245da53f6c43d1bebd894e31a1349884d711b55dbe778ffa727165cf7cb676435866c2d2cb839745ca40166a2f7cfc77a842468b51a8e76575fc9ddfb5f", "signed": "abf283db1f80c54c583b499dbe20aa04248c1dce121f3911677813ac3e011fd159ad0bf76b1aa7cc7b14d7b550848688252acc7fece90487240c3d399dd343088b831b877bc3a99f613c89cda698b3759d643822b5a88faf3822ecb2ce98f671d7554321b24b74b4e30a663f7a5570ae917f479bda29894b1a8c028c9d193e4e7ac11916dd8e9c3f0ec0ef80bd27fdfeee80c170c78140b24c15271415acf75c26956a4d4bf99d40e861e9078320d097e1259e5ec17b583a95e52430dd8c008ed8c7dd1de1becdd1e6bfec4bf3347a22dd249f3ac307a2945e9137fa4a8c26c8021077239cb324816a8dad32b01ee34a08903098cb9c4245291b903c9627074095249e782813477032ba32ef041a07486eb4478c57b9d532269a4a47cb5e974df7e01096fbe4f1ccd4e663663487974c62cdd94d77716c8479d79f6b6a7d9c155988cf3902fb697424963ec4ec34ff2a35d742c4455a593bacffc4d9699ba7626c76cb1a616253751887f6ffe2be208c713df1ab636d722ea06c1c03a57f2cec0803866cca3335c28bf41c7def81acb38858dc10e59467208624967e2e22d9e5661bb945f9e0517687dc80f9b8fdecc8a97600b6c219a3b23a90b6d18aaace2c78400ff38c8c05967f544b6a606c71ac199eafd07eb5848df1657efb233fbabae63a05638191a0af7484a1bae1581375672c571e264f604225173a54a38dd62ae7130d05dd291ad12354de86a6e113e83f6d668516157b7967020dc6517d8cf42dd7b1a897fe1b4e04553ce26e299980aa5f7ce0179bf4954f01c2a23654e5e9731e1447347fa43aa8b2cbd6d4b2df93fa54af71e5028a6da8c71ef3c50c0de24dcaee785678e92aafabeb233b011f45c1064965085d2547050f21c652aa533afe918aa0f9bdaa2607b873ccd3dbd1d3a8cc62172ceb43b921ef6b25c06b0992e4df2b91e371b0ef2b3947388daec8ec6f7e3867d1f61072af590154fa619a07f87e02bddc7406314270af1c15e8ee88b39c01be602e4f0b52d9a0724e71eddd7fa9134169c5faab915979eea9362d0f1f9160268162dd38db02fcfb41350aa08e1e1409b2288db1fe4a0e586b5910f4de894bf9974f6a4983013a190e7a736d14ec54c3644a3ee958a5bdfbcb6297aba43af6c72746bb135410507d8fdde73a2a48b746f918bef9ed92c5be62dd5523fe14b16d6384ca46ef59b2185fe933383a2c7a9bf02da9d0fd8b0c7d7bde6b439f9960155e345d685d4dc3c71404d656811923aa3c47d4b09a0baef0a12e75b6439ba8135db15865874222cd7aa428f5ca5ce5140e22ff92697f37fc70b5b4c94d3314e6aa16b2146bca4fc94157951fc49245da53f6c43d1bebd894e31a1349884d711b55dbe778ffa727165cf7cb676435866c2d2cb839745ca40166a2f7cfc77a842468b51a8e76575fc9ddfb5f", "signature": "abf283db1f80c54c583b499dbe20aa04248c1dce121f3911677813ac3e011fd159ad0bf76b1aa7cc7b14d7b550848688252acc7fece90487240c3d399dd34308" }, { "secret_key": "497e3ebd9e4caa81c5a8973d52f1d23f60c134ca53f62a853a0ac043e51cb517", "public_key": "71c0ca7cfa05cafabb143d84ae41de83846f42c77caa7a91a2e348397d07d52f", "message": "e132f9d67b1729389b828a9fae05a67aa57f0ef7e7d4d1ba244dec8704db969565d1cab809e48fc0abf950bcd4a37d97aeace6da546d4914cb5b86d6ab181d831870c309bca616468f2a34d3dfafcdbb7580b0c5d9ff98e2c54ec803be0d3fda1d4b8c0d7709c89e680b008bf9b8d903b5e934b019705fe0b0c8cfbc3c0967843b0a1fa1b3f162776ebe96b740edd64ad7c35b3fd1a085c99d16f5416782de17358587470dd13b5194f20f23232b2f702f10aafcaa59c7066f24c4c471e42fa86c6b9c5c3e1e8f8365f4dd75acb32fffc053c9af41c6fd2efac30ecf6a2dd0085de9b1d8cdc50b1660a866df7767198bd9c87370615d2bca99f77b84d98d7b24c9c20fd7768fd0380d6b37360340d13598047820dced88a8d42d572937b6efa16921a1b2b2d0eb931673070838e611e6c023290d86fe902f14ac3acd029e3397feb97b17166245ab407a766d2e0904424d33cd3d6e2e62a52c65df7cf004d1415c0b430c1127623dab272a2c2e2b43e02b481be928e89954272832be098b502b8b5643c67482f5de4403032581f08afb0aea48868582607bb39198c1bf13a869b63258a75890b69445ffd34564023e47f8b1884a5e49b7d9425f28d5153013fe3755c6cb114db180e60b3dc4adb36a21428128005a772fb57189345565bbd1759813523bad62855e7928eef5880d3bfff1d0ec65c24592335cda47cfcc5b5fa652b47263225224846a209a3dd7766661fca4ccca59c456fc9cc3e1cf804255aa5f397bab199804336bde29e55c6c377d583f082ce64723739e4f024606f906c110d0a5b610e5fed96dab5f08f4cb3cfc40a35557e1a740b8c7c01f7d3279dd9c4e8764c90bc14f4161db5a37f0989b7bd8035f8bea394ea1d6002ce9c34f1e9c52c6a15d15bc5b25c6c15ab00dfd6a5b1bc917af0b1b05fd10d061b3683d75b5f9effb22ae72085be4f6797b58cb0cab561844121f98bfd9583e0bccb70fad76980a7a73b23c70b3fd02f7757c11a3c21d19e05650ffb82b9e0df8a6735d480156f47949d445851baeaa5ee23814a41b25234fb92cc0df1980d023d51b5cf4c31185c118e3ee3c0c0a46e0a2be6f1d3ae452cbb66f0fd91971342da7b1b996589d94096781552195c433caf19c37f9f14fa0ae15ae0b02b939e402034ff81885939d944e604f474f21524389390fdada06e30d69068c8848cf0a951eab25c4912562944f402468187a23239d33632f29123d49b7de13083398dba97dede12f7959b95247a08fc8e4b5399d1c035c0894cc75ae981c2dd4935413bbeb6853fe04655c77d158c1237b3e0deca5636d69e0dbc5acaf72b60c10bb98ccdd60098a03", "signed": "12740839b3c9f1ba879896dff6d725e84e0443ef96c349eff94dc4833143e5b419804da9db118a9592b1b1ca48af18f75bef1ca468a1a5c74c7ac813bb2cf306e132f9d67b1729389b828a9fae05a67aa57f0ef7e7d4d1ba244dec8704db969565d1cab809e48fc0abf950bcd4a37d97aeace6da546d4914cb5b86d6ab181d831870c309bca616468f2a34d3dfafcdbb7580b0c5d9ff98e2c54ec803be0d3fda1d4b8c0d7709c89e680b008bf9b8d903b5e934b019705fe0b0c8cfbc3c0967843b0a1fa1b3f162776ebe96b740edd64ad7c35b3fd1a085c99d16f5416782de17358587470dd13b5194f20f23232b2f702f10aafcaa59c7066f24c4c471e42fa86c6b9c5c3e1e8f8365f4dd75acb32fffc053c9af41c6fd2efac30ecf6a2dd0085de9b1d8cdc50b1660a866df7767198bd9c87370615d2bca99f77b84d98d7b24c9c20fd7768fd0380d6b37360340d13598047820dced88a8d42d572937b6efa16921a1b2b2d0eb931673070838e611e6c023290d86fe902f14ac3acd029e3397feb97b17166245ab407a766d2e0904424d33cd3d6e2e62a52c65df7cf004d1415c0b430c1127623dab272a2c2e2b43e02b481be928e89954272832be098b502b8b5643c67482f5de4403032581f08afb0aea48868582607bb39198c1bf13a869b63258a75890b69445ffd34564023e47f8b1884a5e49b7d9425f28d5153013fe3755c6cb114db180e60b3dc4adb36a21428128005a772fb57189345565bbd1759813523bad62855e7928eef5880d3bfff1d0ec65c24592335cda47cfcc5b5fa652b47263225224846a209a3dd7766661fca4ccca59c456fc9cc3e1cf804255aa5f397bab199804336bde29e55c6c377d583f082ce64723739e4f024606f906c110d0a5b610e5fed96dab5f08f4cb3cfc40a35557e1a740b8c7c01f7d3279dd9c4e8764c90bc14f4161db5a37f0989b7bd8035f8bea394ea1d6002ce9c34f1e9c52c6a15d15bc5b25c6c15ab00dfd6a5b1bc917af0b1b05fd10d061b3683d75b5f9effb22ae72085be4f6797b58cb0cab561844121f98bfd9583e0bccb70fad76980a7a73b23c70b3fd02f7757c11a3c21d19e05650ffb82b9e0df8a6735d480156f47949d445851baeaa5ee23814a41b25234fb92cc0df1980d023d51b5cf4c31185c118e3ee3c0c0a46e0a2be6f1d3ae452cbb66f0fd91971342da7b1b996589d94096781552195c433caf19c37f9f14fa0ae15ae0b02b939e402034ff81885939d944e604f474f21524389390fdada06e30d69068c8848cf0a951eab25c4912562944f402468187a23239d33632f29123d49b7de13083398dba97dede12f7959b95247a08fc8e4b5399d1c035c0894cc75ae981c2dd4935413bbeb6853fe04655c77d158c1237b3e0deca5636d69e0dbc5acaf72b60c10bb98ccdd60098a03", "signature": "12740839b3c9f1ba879896dff6d725e84e0443ef96c349eff94dc4833143e5b419804da9db118a9592b1b1ca48af18f75bef1ca468a1a5c74c7ac813bb2cf306" }, { "secret_key": "85b4d764169128626fd9c782ad6116229edd77631c2bc9b8ee54b36542c149eb", "public_key": "6a09897e629bb43704debb6715c9dea5d892b634306440997c3c9e94be8ab547", "message": "b2a0493d471c3391f7add1e2cf0bfb32ab05dbcb14f6e4f5f3463aa8d99552f433022046d2f8eb763c0171fcb1e74a049ffeb4b8f0100b8210fce856b2e1a8e739d2f93673ef8f8f40498b3081fa1fd785198c6d370e162d41abe83186f2329783408b9b880d00f81d53100b42d27a261f20cdeed19cc58cb8631281d80db1925310e235e44966309b879bdfc232221433bae5cae46690cb527b6779e11f1bd2a56b59c56ed4d94fdf7aa89dfa9bf20dbfa6a4398b98384517e1dd5d2cd9ce524a47362ef32ac792742a129c9e06130876ab5ad5518eabc5e80b022d8fa13e50d55ded589533e6ea32242c1b3fd7e65f80dee720b6d87dcff3e3df04c802d2e914a87a3629c90bb69e0a6f8bbb5ee505f143c9977375adb065c3e3d391f905fa3c336c9da41e4a2320bcf460976fc7eb1fb6c6a3c395dbd1d28a1b09cdb9ae9f9aaee4d9c566a2ac40add870479faf54ad1b7697710b4eb6f7320244b59757d1eac3d922b7a730b1acf0de9a45d4ac879d21fc616ef3965d74345ed70779eb683280cee25bf3739beb6b4cdfa25d202da13a4a673040d97048658b9205479505d0bee4880a73997c70825a6ec5fd9f952e65fa02225445fc3bdf4adea3d4d22551cbaceb3874798d6a33a6663fe3757081d6243dfd7cd2eebf60a3899fa1f8f6c956a3b183f89b9e7d2ca36448584d53aa8b44e65ad3e527f78723fa6f59224298df31d5e8ada567c8d1b11f3b1314755331c1732dc54a12a4356edda47e3c130b325282a354bfe15c3000d207822931794187e0973ab8ef87bf89c354a035a81f45911223563bfd99f90a75e53d010d8929f4f85a5a5a4f9fcc1c78f0a2fc466f5f1c6522cf62a7be37880796e9b3ca0911ecca3f22c3b24d5d9daa6888f89a8f71a15859359cea468ef238ecf646192783a257addade9047e13edd8bcc1fd4177cb20f88d11998d9c7262d648c2bf66fb227b9b3a9ed46962d2257a420f64bead9e28657b521db2e22165287791f3a1bec4c7822a6cabde5ec770188cb74498a4f08e5a3a7639d240ae3f4fd0353c0dda8ae410b9fa7f43feed13e9f13e6c9410a1d24cdfc2c8e64a15a12f75545b0a575713523d4dfa1a47427a8851ba9acccad78b4ef6a185f5c3b001190dd8f37088a000accf448be8d49371d9da2e1cb5ffe07d41a5c22e94660ac37135ac858cb1769cb66e8269fd53358ecacf5dd92c7eb6186b4d4d6130a732dc10bbb2be32f9b1d6951014a635c12d22f0dc5bd5c2a3f96aec62e7777947eaa022812caced33a5bef9ff8835f880367a37b0b76d2dde396c614e1a4721e000c00f161935b14a738a1b70f6ea54255b7951869646212", "signed": "4a79c442a4c39c62892617ef8e80b40911c4b9d3ff0a5673b57bdb8454ad736769df27c78a4bf7ad566040e747278b11eb65cf9ec7eba866120a3654f4716e00b2a0493d471c3391f7add1e2cf0bfb32ab05dbcb14f6e4f5f3463aa8d99552f433022046d2f8eb763c0171fcb1e74a049ffeb4b8f0100b8210fce856b2e1a8e739d2f93673ef8f8f40498b3081fa1fd785198c6d370e162d41abe83186f2329783408b9b880d00f81d53100b42d27a261f20cdeed19cc58cb8631281d80db1925310e235e44966309b879bdfc232221433bae5cae46690cb527b6779e11f1bd2a56b59c56ed4d94fdf7aa89dfa9bf20dbfa6a4398b98384517e1dd5d2cd9ce524a47362ef32ac792742a129c9e06130876ab5ad5518eabc5e80b022d8fa13e50d55ded589533e6ea32242c1b3fd7e65f80dee720b6d87dcff3e3df04c802d2e914a87a3629c90bb69e0a6f8bbb5ee505f143c9977375adb065c3e3d391f905fa3c336c9da41e4a2320bcf460976fc7eb1fb6c6a3c395dbd1d28a1b09cdb9ae9f9aaee4d9c566a2ac40add870479faf54ad1b7697710b4eb6f7320244b59757d1eac3d922b7a730b1acf0de9a45d4ac879d21fc616ef3965d74345ed70779eb683280cee25bf3739beb6b4cdfa25d202da13a4a673040d97048658b9205479505d0bee4880a73997c70825a6ec5fd9f952e65fa02225445fc3bdf4adea3d4d22551cbaceb3874798d6a33a6663fe3757081d6243dfd7cd2eebf60a3899fa1f8f6c956a3b183f89b9e7d2ca36448584d53aa8b44e65ad3e527f78723fa6f59224298df31d5e8ada567c8d1b11f3b1314755331c1732dc54a12a4356edda47e3c130b325282a354bfe15c3000d207822931794187e0973ab8ef87bf89c354a035a81f45911223563bfd99f90a75e53d010d8929f4f85a5a5a4f9fcc1c78f0a2fc466f5f1c6522cf62a7be37880796e9b3ca0911ecca3f22c3b24d5d9daa6888f89a8f71a15859359cea468ef238ecf646192783a257addade9047e13edd8bcc1fd4177cb20f88d11998d9c7262d648c2bf66fb227b9b3a9ed46962d2257a420f64bead9e28657b521db2e22165287791f3a1bec4c7822a6cabde5ec770188cb74498a4f08e5a3a7639d240ae3f4fd0353c0dda8ae410b9fa7f43feed13e9f13e6c9410a1d24cdfc2c8e64a15a12f75545b0a575713523d4dfa1a47427a8851ba9acccad78b4ef6a185f5c3b001190dd8f37088a000accf448be8d49371d9da2e1cb5ffe07d41a5c22e94660ac37135ac858cb1769cb66e8269fd53358ecacf5dd92c7eb6186b4d4d6130a732dc10bbb2be32f9b1d6951014a635c12d22f0dc5bd5c2a3f96aec62e7777947eaa022812caced33a5bef9ff8835f880367a37b0b76d2dde396c614e1a4721e000c00f161935b14a738a1b70f6ea54255b7951869646212", "signature": "4a79c442a4c39c62892617ef8e80b40911c4b9d3ff0a5673b57bdb8454ad736769df27c78a4bf7ad566040e747278b11eb65cf9ec7eba866120a3654f4716e00" }, { "secret_key": "33d477602f296305a6719ea694c044e90d233c2dea85c46abe1920e88c317849", "public_key": "ff6feea028ec346dd49107bb713fddbb282ebcd034e2eafc7cdb1c5adf926390", "message": "cfea07a779f1537e498123c676290573efcc5db70245d93dea5c05726f8713d002ae66c1c9690747ca9230b1629d3662ab73d66b949879164b21a35f40cf3799041908ed6f9229ecb390c5f22234e1c5f26b3ab5ba59e78c64969871b428b78516777555af4e89c6fbc193a94695226c6d329991a11bd580d18956089b58a0e42ca35f6c6d2609ade0d0b619d48925c68cd9d2250dff27cf2f0d44448709b679f35bbdce0f496b0a16ca67eaceec258b1aec91775a3a2ee801b1c9a226a6b001926a057a06306727eedae8c577531df04ac09b5b49bcdeabdeb8ac4e8e82cf1e7af835fc611ca7a684b83526042415b1d6652e8634311e194627eae78d011e6f40f645794e36895a23e1bd84883a393ecfe5a248026aea86447059f7a429368f21c89e0145207978b913c80a22d7caf2673f7c76f6c26cf884412e17d0c255430f502bce74e3a310d17f6f4d485da280ed5b5eea6c49ba748d764814b9e3daf6fcc218c2740ca77018f71344519da82ada31e001924fc77679e3e9ff9fab67dd09a61924c821a1fd999f74dfa3f819adb31d15e5ed8aaa52c1bd7cca266711a74dd62104ef3c2bf737fce6942b348a33c3dfd6d92a724b6d5878421aeb230a533fe21c8b2fd3da596a6180a45c986d7ece4cdc8ad681ead69064bbddfc20f3c52125f83395bed1557f67182b9fe99138af3c356c5e652978dd238b761c742f8158e2314b964208330978b0620a13a16d761d52f06e466a4094b65cd6f26854aed6f9a8c2a884a0d0bf4ee587eeb8b602487239a7e58172c809983a8db1c1fc7ce8c48bc8a6fb812d6aa9e83a3ab4ddf7a8d40d3fe00ea16e04062b8aceb9c99eefa41f4f87447828126d0d9c9f8605e8467c5e4d671d5c6d9fa70d747098d941211223b9bcf261938d6704a32d22c61e30f3570a1f5d0998b4791080882aa5623167b63a23f340f0e7c6f9a830a75b74631fa5b57afdb1e6bc22699bb03156675d598353a5d1b55897e4c11061dd145f23e8537c632f75c10df05b25547238574017fe7b64b8e99869157fee35f7ad7e63e99593302929503a96768023b4125ad749dff4b992ee5c2b4f3ada4889e4ae62ec15d2db5969d730db307547f638c3185032b12f75fbb317e47df7b9292ae9e76a2c0a06fcad108cdd235f6e38d967b6379511ff6965c22f2c6680a12b0304eb2b296c99a76c2729d98e0a7824b67f3fe842d6f6ab273e894845b32dc6ddfc7a220f76bd965c69858183c8f357395fc57dc829defaacb5603a757868d5e562f9781ee39e0e94688ad3545b32dd7366b6b047e8d1d3d565997b236e7f7596c5f8d7c1c11bcf4a244620cbd21d559a7c9b3f", "signed": "caa2879895d4f620b9eb5fed22b4562eeb1ad63822968f76ad91076b166c05ee20864d98bbbc6e79dd0362cacf7a21b4cfc230d6355d43120cfffb948b8f6c0ecfea07a779f1537e498123c676290573efcc5db70245d93dea5c05726f8713d002ae66c1c9690747ca9230b1629d3662ab73d66b949879164b21a35f40cf3799041908ed6f9229ecb390c5f22234e1c5f26b3ab5ba59e78c64969871b428b78516777555af4e89c6fbc193a94695226c6d329991a11bd580d18956089b58a0e42ca35f6c6d2609ade0d0b619d48925c68cd9d2250dff27cf2f0d44448709b679f35bbdce0f496b0a16ca67eaceec258b1aec91775a3a2ee801b1c9a226a6b001926a057a06306727eedae8c577531df04ac09b5b49bcdeabdeb8ac4e8e82cf1e7af835fc611ca7a684b83526042415b1d6652e8634311e194627eae78d011e6f40f645794e36895a23e1bd84883a393ecfe5a248026aea86447059f7a429368f21c89e0145207978b913c80a22d7caf2673f7c76f6c26cf884412e17d0c255430f502bce74e3a310d17f6f4d485da280ed5b5eea6c49ba748d764814b9e3daf6fcc218c2740ca77018f71344519da82ada31e001924fc77679e3e9ff9fab67dd09a61924c821a1fd999f74dfa3f819adb31d15e5ed8aaa52c1bd7cca266711a74dd62104ef3c2bf737fce6942b348a33c3dfd6d92a724b6d5878421aeb230a533fe21c8b2fd3da596a6180a45c986d7ece4cdc8ad681ead69064bbddfc20f3c52125f83395bed1557f67182b9fe99138af3c356c5e652978dd238b761c742f8158e2314b964208330978b0620a13a16d761d52f06e466a4094b65cd6f26854aed6f9a8c2a884a0d0bf4ee587eeb8b602487239a7e58172c809983a8db1c1fc7ce8c48bc8a6fb812d6aa9e83a3ab4ddf7a8d40d3fe00ea16e04062b8aceb9c99eefa41f4f87447828126d0d9c9f8605e8467c5e4d671d5c6d9fa70d747098d941211223b9bcf261938d6704a32d22c61e30f3570a1f5d0998b4791080882aa5623167b63a23f340f0e7c6f9a830a75b74631fa5b57afdb1e6bc22699bb03156675d598353a5d1b55897e4c11061dd145f23e8537c632f75c10df05b25547238574017fe7b64b8e99869157fee35f7ad7e63e99593302929503a96768023b4125ad749dff4b992ee5c2b4f3ada4889e4ae62ec15d2db5969d730db307547f638c3185032b12f75fbb317e47df7b9292ae9e76a2c0a06fcad108cdd235f6e38d967b6379511ff6965c22f2c6680a12b0304eb2b296c99a76c2729d98e0a7824b67f3fe842d6f6ab273e894845b32dc6ddfc7a220f76bd965c69858183c8f357395fc57dc829defaacb5603a757868d5e562f9781ee39e0e94688ad3545b32dd7366b6b047e8d1d3d565997b236e7f7596c5f8d7c1c11bcf4a244620cbd21d559a7c9b3f", "signature": "caa2879895d4f620b9eb5fed22b4562eeb1ad63822968f76ad91076b166c05ee20864d98bbbc6e79dd0362cacf7a21b4cfc230d6355d43120cfffb948b8f6c0e" }, { "secret_key": "7074568611a66dfca8307cae608bb26995844df435e5300e5b4d7291cc22907f", "public_key": "ddabddd15eaf83115ddd065d7e220b1efc262a61c52e914347442bde6d002506", "message": "6c137423eac790b8e8e418b290e0579c7b86b14aed818de8ce53cea3f340a1a95391f984968f2b4229282a8161c09ab149cdacd66970b4013f52e5e68ea8c9db685b2c53073500e5b35e29ea0ba1f4d159a558d361b06516836cf7b9ea501fa0506b985f036a82d9e084489d3bfed34093e2d6d9edf55785ed35a90ce56c761686cc3ea1a2c76ada5ec8c145d818b047cc516eec5d2d6a93a55592d892e3d5cd10c250c04b049b38fc7ec0f39aba15824007336c2b0f7f81d64d5ca3e29d6fda4c23d9ba65d9fe3cb4e03913697287b46a0b1fccd2624e397ae95c5254bcd88d2c7c8f70fdc8173f64c1de32281ab4184693b48a349e6782bc8992b43c7de7cb9d33929bf95306c2af7e938d8486b386f9fd3f0f7161e0e6862d4f9281446865a1c9be2460efbc20151b06e79d014617d0300e671d48767458596625b76dffc558aa9b40612196ec827e1c6fff518fb7ad4bf8c46fcb278885aa491b77a28995cfb9d79640aad174c6df43938e3f1385205c54595b33dede50143746a1705e7e0b69af4a26c3b76515051892b15ca6e48c3d91fbc75e8fe4a0fe8ed2c26c1073beb70ea38d0927029278406755ae6e11da378653649515e0085b5ea7db3249208e33a6c8b6ae8cd80c9bd6b983e73e9b91dbec091fae995f8032427edec02cad9055eb8b7dbcfa80d4f64f5727a152f11c47e52d753a57b6e5fddf774cea4da910026819c41e32b4f199727e23c54ab5d70142b854a27b04e64cf44af2a8995e1200bd117c7a1674edef59bc53f73adaf638e0773b85b56334aff6e11743e3a3d3614aa8a375b3781ec814cc08e71efa7818519cb24af82c331dfd6ac78ec17fd7174b61021e8cf901a2aaa6adbc902a916b2a2f4f79e551501fbf01df6b8518504c1e94646938bed1a8509c2a38fb6a798a7858f409b0f2fb9b3f4817e568c52d9abfe2168cc3650fc43e0f9975fe29e33aed1a7bf30d8631150790650a3cb78c368f1aea9ac60c5eeb969a45f84aa37366a83977190f41ae421e0c46fda3fa01b926fcef8224fda36df4f8a87701fe79fe0628ef0cc02df2bd783207c7db87119a0369fe16eeb38fdc9fb35d9e195fe14f8c1038208ab97700af79f2e2e05496830207c7da8dbe8e9bb73bc471a43f1be650fa92819aeb5dc7eed7eed8171270d219257d19610b89d2d62d3f5b648e139eedf1ff74be01a5ef1d95f812922601ee92515157c4ecadfa3eef9f2a677c003ca4ab9b2c45472ce55e18f40a21fe1b0d45b50b50c52a0b1a5d7c37d8ebc15e020584d9edd7b56505f82078e0f899389135014c86d1e2ed49f9cd319076943553a312ae05ab333526e136714f09a402b3c8", "signed": "7f653134c0b90f44a489f0b05fc40707ad9f1398f340b447a3c9861f511c9f1568803b7684a04a898c45154dd486bd50758998e126439378b3f59ff367492a0a6c137423eac790b8e8e418b290e0579c7b86b14aed818de8ce53cea3f340a1a95391f984968f2b4229282a8161c09ab149cdacd66970b4013f52e5e68ea8c9db685b2c53073500e5b35e29ea0ba1f4d159a558d361b06516836cf7b9ea501fa0506b985f036a82d9e084489d3bfed34093e2d6d9edf55785ed35a90ce56c761686cc3ea1a2c76ada5ec8c145d818b047cc516eec5d2d6a93a55592d892e3d5cd10c250c04b049b38fc7ec0f39aba15824007336c2b0f7f81d64d5ca3e29d6fda4c23d9ba65d9fe3cb4e03913697287b46a0b1fccd2624e397ae95c5254bcd88d2c7c8f70fdc8173f64c1de32281ab4184693b48a349e6782bc8992b43c7de7cb9d33929bf95306c2af7e938d8486b386f9fd3f0f7161e0e6862d4f9281446865a1c9be2460efbc20151b06e79d014617d0300e671d48767458596625b76dffc558aa9b40612196ec827e1c6fff518fb7ad4bf8c46fcb278885aa491b77a28995cfb9d79640aad174c6df43938e3f1385205c54595b33dede50143746a1705e7e0b69af4a26c3b76515051892b15ca6e48c3d91fbc75e8fe4a0fe8ed2c26c1073beb70ea38d0927029278406755ae6e11da378653649515e0085b5ea7db3249208e33a6c8b6ae8cd80c9bd6b983e73e9b91dbec091fae995f8032427edec02cad9055eb8b7dbcfa80d4f64f5727a152f11c47e52d753a57b6e5fddf774cea4da910026819c41e32b4f199727e23c54ab5d70142b854a27b04e64cf44af2a8995e1200bd117c7a1674edef59bc53f73adaf638e0773b85b56334aff6e11743e3a3d3614aa8a375b3781ec814cc08e71efa7818519cb24af82c331dfd6ac78ec17fd7174b61021e8cf901a2aaa6adbc902a916b2a2f4f79e551501fbf01df6b8518504c1e94646938bed1a8509c2a38fb6a798a7858f409b0f2fb9b3f4817e568c52d9abfe2168cc3650fc43e0f9975fe29e33aed1a7bf30d8631150790650a3cb78c368f1aea9ac60c5eeb969a45f84aa37366a83977190f41ae421e0c46fda3fa01b926fcef8224fda36df4f8a87701fe79fe0628ef0cc02df2bd783207c7db87119a0369fe16eeb38fdc9fb35d9e195fe14f8c1038208ab97700af79f2e2e05496830207c7da8dbe8e9bb73bc471a43f1be650fa92819aeb5dc7eed7eed8171270d219257d19610b89d2d62d3f5b648e139eedf1ff74be01a5ef1d95f812922601ee92515157c4ecadfa3eef9f2a677c003ca4ab9b2c45472ce55e18f40a21fe1b0d45b50b50c52a0b1a5d7c37d8ebc15e020584d9edd7b56505f82078e0f899389135014c86d1e2ed49f9cd319076943553a312ae05ab333526e136714f09a402b3c8", "signature": "7f653134c0b90f44a489f0b05fc40707ad9f1398f340b447a3c9861f511c9f1568803b7684a04a898c45154dd486bd50758998e126439378b3f59ff367492a0a" }, { "secret_key": "7d7ca8e8d3b84344a5e4dea08b338d8faa5ffc119ce566ef656f0f4584775b21", "public_key": "0bde34b746d2c5490853064d48c6b4c1cbbc3ee7beff5e8f684c120f315d7e4e", "message": "0b727075345d619f5cdc7fc4c43cdc19105811d95d069f81c0a62fe1e1178cf1c35db05e2de87d11ae1a6f53ef38b39bf4ed8fbf56ef017a1d3c15b64fe4b2610bf69bd19ac7afd46a2b87b488b6c78ad456811c1dd6bd4a6b5da698739fd1a14ceb9f27f124b69f6bd16de5537aad80681c5633580394da3b84e9b7a55ebab8522d2d6bf1aa4e7b159cbf4e20b50bfe9c711aa047119f1dad8749260b87639e9c141def62026a990373dcfd99f77b0f5ea6adfd8f594b9ce41064a5ed307bf2d8d17370498ad7f45f9c4dd26c420f450f53623bb6d7f3f46a149d8f135bc2913310fb8f9043d099278bbeba39179fa367b01673e1c953effd2caea7311c47c0372744095b1c8f90eef5f1929db1996cd584f615d56fae3aecac3ee88bd0b296f449cc2713c52da695248faa8e389b05a0bcac69dce9719723194f433b0297eb0859019f141a207ce8ccb59882caa6e18f0b43bdddb90a0a85ffd577d6394a1d80489410f92afb85ba506aa9f3f427445d21224b9cb046c05f1bacd7b749fb7b1024d092e4ee4b30a46edf718470c99491c68f4879d62bfce7046d8138cbb9e7212999a4498b455fc90ac283e935de04df6fc999e4434be11063d6e4ee9e096a87bc716d2c819916c37a4e6298c49945366ec3f500720b06dc99d3d8ac303e6c264e28a7c2d419ec622a97a711544fb1f4735b11f8bb1d7e2c816a156287b4cc0c65aaa280b837737f0a84e36de2df2fc3a50df980918fb9e5834b42ac0e0c7278d7fe8db4dbdeca0141d5fef5dc6151f87b8634c241a8fa0a82717899773ae89f537890b9155a7a05bce47866ec2028a47898d485823a2e992319680eb699b0dd5358f546fc537c73d3a4b223a0941518b6d1e66b27676c1b1fc76a08320524a72e297fce17aa80d8ea7b388a55168e7dadb836e9dee707ed25c0ee4db25bee3c485b39649204efaf2820b2736368fc773ce090c385378002c471b094795cb266d39eb7580d701be4c8916f6b38bfe25fdf36d6c4adafa9ae9864c57bb737b49506ed38d62de60cc0599ec6bb1acf24b1d37d60efdeb7d942c53603a2f0476e9512c938b28d495a6f26a907c396b841aedd8e14ac447b495df1f676daccd5a740c042f5772b7db17f4f1a3a1c8e7c488370e736b51e690fd2ddcb5aa61957a7c7975acb2dcb915d074d744279ea1c4169f868873ac5c20890162c1df9656419975a43d3198e18c309a1eb7c1d87873fb15c6da47f548a01f69bdab9c39ef00d418a6f619dd73d7db45cbb6ad225a2de787ba777bc73d28fc304f10009f4022c2cf84de008d70fcdc8ba7f107c369859e9c90ca8a393b553f26605ffd7230c921490700f", "signed": "d0c3e248a8cb2ddc7e9f21c9c5b009f70ea29da6897cd92c260f047ed68aa1c8b9657f9d826e88f4a512c5003be6406880741263ae7ce6860efe73ad54d482040b727075345d619f5cdc7fc4c43cdc19105811d95d069f81c0a62fe1e1178cf1c35db05e2de87d11ae1a6f53ef38b39bf4ed8fbf56ef017a1d3c15b64fe4b2610bf69bd19ac7afd46a2b87b488b6c78ad456811c1dd6bd4a6b5da698739fd1a14ceb9f27f124b69f6bd16de5537aad80681c5633580394da3b84e9b7a55ebab8522d2d6bf1aa4e7b159cbf4e20b50bfe9c711aa047119f1dad8749260b87639e9c141def62026a990373dcfd99f77b0f5ea6adfd8f594b9ce41064a5ed307bf2d8d17370498ad7f45f9c4dd26c420f450f53623bb6d7f3f46a149d8f135bc2913310fb8f9043d099278bbeba39179fa367b01673e1c953effd2caea7311c47c0372744095b1c8f90eef5f1929db1996cd584f615d56fae3aecac3ee88bd0b296f449cc2713c52da695248faa8e389b05a0bcac69dce9719723194f433b0297eb0859019f141a207ce8ccb59882caa6e18f0b43bdddb90a0a85ffd577d6394a1d80489410f92afb85ba506aa9f3f427445d21224b9cb046c05f1bacd7b749fb7b1024d092e4ee4b30a46edf718470c99491c68f4879d62bfce7046d8138cbb9e7212999a4498b455fc90ac283e935de04df6fc999e4434be11063d6e4ee9e096a87bc716d2c819916c37a4e6298c49945366ec3f500720b06dc99d3d8ac303e6c264e28a7c2d419ec622a97a711544fb1f4735b11f8bb1d7e2c816a156287b4cc0c65aaa280b837737f0a84e36de2df2fc3a50df980918fb9e5834b42ac0e0c7278d7fe8db4dbdeca0141d5fef5dc6151f87b8634c241a8fa0a82717899773ae89f537890b9155a7a05bce47866ec2028a47898d485823a2e992319680eb699b0dd5358f546fc537c73d3a4b223a0941518b6d1e66b27676c1b1fc76a08320524a72e297fce17aa80d8ea7b388a55168e7dadb836e9dee707ed25c0ee4db25bee3c485b39649204efaf2820b2736368fc773ce090c385378002c471b094795cb266d39eb7580d701be4c8916f6b38bfe25fdf36d6c4adafa9ae9864c57bb737b49506ed38d62de60cc0599ec6bb1acf24b1d37d60efdeb7d942c53603a2f0476e9512c938b28d495a6f26a907c396b841aedd8e14ac447b495df1f676daccd5a740c042f5772b7db17f4f1a3a1c8e7c488370e736b51e690fd2ddcb5aa61957a7c7975acb2dcb915d074d744279ea1c4169f868873ac5c20890162c1df9656419975a43d3198e18c309a1eb7c1d87873fb15c6da47f548a01f69bdab9c39ef00d418a6f619dd73d7db45cbb6ad225a2de787ba777bc73d28fc304f10009f4022c2cf84de008d70fcdc8ba7f107c369859e9c90ca8a393b553f26605ffd7230c921490700f", "signature": "d0c3e248a8cb2ddc7e9f21c9c5b009f70ea29da6897cd92c260f047ed68aa1c8b9657f9d826e88f4a512c5003be6406880741263ae7ce6860efe73ad54d48204" }, { "secret_key": "d21fdd7b10e54a8b6be95a0224ad70664dd92112e2683a4fd279c407db3871bb", "public_key": "f89c272e7d1cc93d69f694dec9cce05ac247734504829c56997413c8958b9330", "message": "b8644adbef9c7cab9120acedc8e75c433d036ffae0f955be6a488f1f427a68a8902d026e63dd6c9bf9d97de786b31dd4f4c9a4f8a622f1ffc84da6967ca77433c398f4d3f1c4434989b7ac9d0f3b1be0c8b352824f4e7a083f342ec1be1da8fb755242a654880ef298f05979ff026ddcc044860e6757a29cfaa222a3597e38f1779962a41a4c8ce6a65b878199b4d80f4a0390cac19c226eea4b6036e57ad830ecfc00693e2613d3edf465fc8c4fa293fd8cfc36dc8e37bcebabec0349ebd884e1b28bce824e0d55b6d015383801668b34f5ba723d2ac0a264fab2c728608f162de01179259be2ccb0815002fded8e0d78b02807313e910eb3a7337c534e846f9ee155426e4aef643661b0edb44596fddcd0b3e814c137817a422baa40c9053d0386c6ecdb589052594742677c48dcfc8cd4a93667ed4d87646001eda079e8b99d52ba21c5ec5669fedf6f40447a7ff8901db0ef1847d3cacf0198a2f3bd7bcf2dd811a097fc5e5188b03fdf54e517637a14501000d0d35516caf0699402b48f8d8cc3afb17a56132d08237035a0c95490bfe5d7b7fb40178f281e4d872e47a0e955ce9736f3c333a6adf50ad31994eb9f45327facc8c5d113fad4713fe7f198010d42046bbfe68b0daa79dcb8755929be92f9caa150dfbde3fc9e392b2b701c3021c240e4679de41124b1888e5db5a83d05ceaf49eb440dc45026d450bc984b8d6f02850ecb570eee0a3819b12bc26367b5b98e1b141c9b0a9690ea4a3700dad12395f975d11cd77f96368831f21f4e968cc5ba9ef82474038bc7aa26122d218b743041506aebbd1f987959fd160d6eb7d58d4f576f8c0ca8af868e39b5ea87203937e0308acbeae91e10607e44e8ab495bc01dd573fbadc94479ff92082c7bb7513479c70f0407769025d34d72140c25d821f034a39851a93c623b71c9400e942639f28bbd032e1d8d3c059f7c2cd31d7476462d2776035d07880202dbfe9e07d154622d7ac6175a5afa79fed4dcc13712620c41994e11d924308fb2ff3a1eda44c761bc736f345122f02a40ae6f7dbd03d9fe96ee3d7a3b4a5eefbfcc56dc42ef27bd8085176038b9ebae63aa75035275ec34e4185739d636246770acccc6dc620e2fc9156fa9483e0d9cae0e8c463948a3d97ae8dda5966c88f07093292cce22bbda062baafa7fe84d0ba2d2dd295b23458bcaeb2ef742a2ed1c834483cd709385afeadcbc0a9c6a4f387babf7e3dc36c810db209beb66c8666404c661dfe9d32c4c08afc6f3b1257d6484a755f5ac701eb13f87763fee330ffa0422cd80a92038c6f45292bdee5f89e94c7a652197fc1906b48258372449b1081c6b97134c43c89ee2", "signed": "6d69e83b3e7ed55a85f9fc9d2519da0b0a1eb4daaee991a6651f5c89190c0de72373cd989d46be1367f9daf1b92fed3b52bba54a1e4cca5bc8726ed07f302501b8644adbef9c7cab9120acedc8e75c433d036ffae0f955be6a488f1f427a68a8902d026e63dd6c9bf9d97de786b31dd4f4c9a4f8a622f1ffc84da6967ca77433c398f4d3f1c4434989b7ac9d0f3b1be0c8b352824f4e7a083f342ec1be1da8fb755242a654880ef298f05979ff026ddcc044860e6757a29cfaa222a3597e38f1779962a41a4c8ce6a65b878199b4d80f4a0390cac19c226eea4b6036e57ad830ecfc00693e2613d3edf465fc8c4fa293fd8cfc36dc8e37bcebabec0349ebd884e1b28bce824e0d55b6d015383801668b34f5ba723d2ac0a264fab2c728608f162de01179259be2ccb0815002fded8e0d78b02807313e910eb3a7337c534e846f9ee155426e4aef643661b0edb44596fddcd0b3e814c137817a422baa40c9053d0386c6ecdb589052594742677c48dcfc8cd4a93667ed4d87646001eda079e8b99d52ba21c5ec5669fedf6f40447a7ff8901db0ef1847d3cacf0198a2f3bd7bcf2dd811a097fc5e5188b03fdf54e517637a14501000d0d35516caf0699402b48f8d8cc3afb17a56132d08237035a0c95490bfe5d7b7fb40178f281e4d872e47a0e955ce9736f3c333a6adf50ad31994eb9f45327facc8c5d113fad4713fe7f198010d42046bbfe68b0daa79dcb8755929be92f9caa150dfbde3fc9e392b2b701c3021c240e4679de41124b1888e5db5a83d05ceaf49eb440dc45026d450bc984b8d6f02850ecb570eee0a3819b12bc26367b5b98e1b141c9b0a9690ea4a3700dad12395f975d11cd77f96368831f21f4e968cc5ba9ef82474038bc7aa26122d218b743041506aebbd1f987959fd160d6eb7d58d4f576f8c0ca8af868e39b5ea87203937e0308acbeae91e10607e44e8ab495bc01dd573fbadc94479ff92082c7bb7513479c70f0407769025d34d72140c25d821f034a39851a93c623b71c9400e942639f28bbd032e1d8d3c059f7c2cd31d7476462d2776035d07880202dbfe9e07d154622d7ac6175a5afa79fed4dcc13712620c41994e11d924308fb2ff3a1eda44c761bc736f345122f02a40ae6f7dbd03d9fe96ee3d7a3b4a5eefbfcc56dc42ef27bd8085176038b9ebae63aa75035275ec34e4185739d636246770acccc6dc620e2fc9156fa9483e0d9cae0e8c463948a3d97ae8dda5966c88f07093292cce22bbda062baafa7fe84d0ba2d2dd295b23458bcaeb2ef742a2ed1c834483cd709385afeadcbc0a9c6a4f387babf7e3dc36c810db209beb66c8666404c661dfe9d32c4c08afc6f3b1257d6484a755f5ac701eb13f87763fee330ffa0422cd80a92038c6f45292bdee5f89e94c7a652197fc1906b48258372449b1081c6b97134c43c89ee2", "signature": "6d69e83b3e7ed55a85f9fc9d2519da0b0a1eb4daaee991a6651f5c89190c0de72373cd989d46be1367f9daf1b92fed3b52bba54a1e4cca5bc8726ed07f302501" }, { "secret_key": "d336fd8408196d22fb698eb25b7654fda46f5de4c9b4d04950c398b59a44290a", "public_key": "f3cd96347cea63e500a4c92c3bf215662dd0400784dbf8b595dd3d395f90cc12", "message": "fb49c19bc4444c28eb2625f31d996d5e36c57fa6fdd772e67b7199cec67eda5451712df7a69dbbd56e7c398796b2001def651c4b9c05ee31d95679535c812a37d31ddb3073199cd704ff7ca2981f7b9c927a7f7d776fb6f609f727e6ea709ce7f43a60793504169a8905d9b23109f0d867966aa3e300c7e11ddedb9cc117b904f62927e48e4d73fe1a6ceccc4ceb08e64ab55f25c98216cec937608ad793146998f14c2985e6c2910df7b1388f9dd863f1e4d7d1621479b8512cdb34e673eb02a48934e39c2d18d70f966d676a2bd75db543d25c5dcdc3ef3b8bc8201848c30961e915d968bdc31946b0d18ede7cb0166dbe1ffeff9439c9c3404af6016c73edeb253d93f562a1a6cdd57898a9b3422587d5f56af3d06b3f6c25751f44460fb3299656dc11227ef4837aabddee400fa53f69e5ced053c76dcecdf0adc9ef80f4b330542ff1fa2df0b8d43cd1c311b1b9955c632c8e5f0491931c04de434df8f7a394e5fef016db2eb7c87b2ac7a4a73043bd7f98ad0a4d453abfb0be8be4cb145742aa56aa5ef2dff12230a510e3b7f82f7847700eeea5905b0289696c4c142bf34bcf81a962d75b8d091055733779335b7fd47a20d17c948ab732947832674371e22e711134f5c919792357f79bf70c4470787528434fc0b4ca093ee92543420d1ca81124f5585317e250821a4f3d8ce0f919de9fbf0127087e676903f6cb39025bcc73a0762954b72e66a6be9b96c97b6f6030bf5ca0bc2727a9a179cf9d9405f3fe18f3492389079a5b65bcb13a0d5ef41c2cd97e702cee4a2feb1e6702bd4c63fe0a4ae994c4287a837bc3f64c2d898857cdb32acd4bd133676e51f77bc7110e3ce52d9204fd2691a6d37078f68e7bcef30fc9c483985822b661119238e40f9cfdcabef2d7b16b059ab24adc05003712bbb128096e37f91bc4c5c81508be27fa0b84940be36bced2e65cd36b39fbdc5ea68614159228ca65c5d8407baf663b528e7d87734c7bc77dc8431a1dd6873cfddfc3e757d9ad1fedd3c798f1fe60e715ee48a6bcbb13b616a89a38e336489d3d6ccb726914112a1bc5d977c9b2a3fac107ad094b038ab75468263c34bda817c056e07a6c56697cb64a0b1f966f6de0bb1c0a71c8a5fe133ba2036d24daccad3fa03b39cd27f832752751055a8155913d040f51dae78d71946ca04d83c7c894c280aaec285543e5fd5e327accca9abef156a13b9571446bd8007ff92dbc0fbaf23a9441b53c1cd740c34c282929101ad2ea8b85d70052991b774e92ff75cc85113e0900b51b863e1f2adaab2dbcf46af479ea248ec2889afbfe737408393a2b1b3301f65c1fac8b676795ab5bf447f05e0daf6776", "signed": "af7e2df7529fd18d1b21b8fd4c0681505918e2511434fe4e4954e743c1cfa45e4109d36c3eecf2e25d209b9b5d25f7cbc380296d647752e30d3bea3b929b0903fb49c19bc4444c28eb2625f31d996d5e36c57fa6fdd772e67b7199cec67eda5451712df7a69dbbd56e7c398796b2001def651c4b9c05ee31d95679535c812a37d31ddb3073199cd704ff7ca2981f7b9c927a7f7d776fb6f609f727e6ea709ce7f43a60793504169a8905d9b23109f0d867966aa3e300c7e11ddedb9cc117b904f62927e48e4d73fe1a6ceccc4ceb08e64ab55f25c98216cec937608ad793146998f14c2985e6c2910df7b1388f9dd863f1e4d7d1621479b8512cdb34e673eb02a48934e39c2d18d70f966d676a2bd75db543d25c5dcdc3ef3b8bc8201848c30961e915d968bdc31946b0d18ede7cb0166dbe1ffeff9439c9c3404af6016c73edeb253d93f562a1a6cdd57898a9b3422587d5f56af3d06b3f6c25751f44460fb3299656dc11227ef4837aabddee400fa53f69e5ced053c76dcecdf0adc9ef80f4b330542ff1fa2df0b8d43cd1c311b1b9955c632c8e5f0491931c04de434df8f7a394e5fef016db2eb7c87b2ac7a4a73043bd7f98ad0a4d453abfb0be8be4cb145742aa56aa5ef2dff12230a510e3b7f82f7847700eeea5905b0289696c4c142bf34bcf81a962d75b8d091055733779335b7fd47a20d17c948ab732947832674371e22e711134f5c919792357f79bf70c4470787528434fc0b4ca093ee92543420d1ca81124f5585317e250821a4f3d8ce0f919de9fbf0127087e676903f6cb39025bcc73a0762954b72e66a6be9b96c97b6f6030bf5ca0bc2727a9a179cf9d9405f3fe18f3492389079a5b65bcb13a0d5ef41c2cd97e702cee4a2feb1e6702bd4c63fe0a4ae994c4287a837bc3f64c2d898857cdb32acd4bd133676e51f77bc7110e3ce52d9204fd2691a6d37078f68e7bcef30fc9c483985822b661119238e40f9cfdcabef2d7b16b059ab24adc05003712bbb128096e37f91bc4c5c81508be27fa0b84940be36bced2e65cd36b39fbdc5ea68614159228ca65c5d8407baf663b528e7d87734c7bc77dc8431a1dd6873cfddfc3e757d9ad1fedd3c798f1fe60e715ee48a6bcbb13b616a89a38e336489d3d6ccb726914112a1bc5d977c9b2a3fac107ad094b038ab75468263c34bda817c056e07a6c56697cb64a0b1f966f6de0bb1c0a71c8a5fe133ba2036d24daccad3fa03b39cd27f832752751055a8155913d040f51dae78d71946ca04d83c7c894c280aaec285543e5fd5e327accca9abef156a13b9571446bd8007ff92dbc0fbaf23a9441b53c1cd740c34c282929101ad2ea8b85d70052991b774e92ff75cc85113e0900b51b863e1f2adaab2dbcf46af479ea248ec2889afbfe737408393a2b1b3301f65c1fac8b676795ab5bf447f05e0daf6776", "signature": "af7e2df7529fd18d1b21b8fd4c0681505918e2511434fe4e4954e743c1cfa45e4109d36c3eecf2e25d209b9b5d25f7cbc380296d647752e30d3bea3b929b0903" }, { "secret_key": "6573227841f6f92831146c44c0e480cdf544bb876552cc5f9d42f15bdcc044b8", "public_key": "192257a54ce5d04c19439fdc9ede18ec856e29870e24d3731fe2224799949b7e", "message": "6e7c6b122ab36bd135f69e2b85e7fccefb072c12cf088a3229d876eff532389f0577116f7af29f1195e3828839381380467178b229c5a18d7c4943ec970dd18bce723bd0ca91ffa95563546a324fe0b9bf6c0455d4276039e8d291fc7276aa55a1cd3ea05282654a7f9700adcbc78077c5dd0fc86eced48f4a60ccb76bfb8b4562bac22a02d19e4489394ab9719fc144f5db2ef039b37f3b51d1d657a0cf835d71f1a4af01eb9fd885c604a624cbe910bfde093ad3f0cbfd9a48307329d44234bd01191d56e522d72b54e1fe4733da3aec6827eab3554898e03e577b4e7b9dd3f308e616808d0294499f2886295e54c360199ca83a83ff46195ea3c484a66838d51acbe9611eee036ae281c6793cbd451f9271fb5d25ea7c1899ab5d43ed8b9d067bc56d8d4a15f1dab8d8d95d1b17af64cb18c1147551147addcbdd53fbccd9026f855547131bee95071639f649f2d035a25a3e42e38e22bbf038106ce8bc4ad6768ab92cd57afacd04ee55cf0714b768952dac240b1e9b2835ecf7b0d6c407c82524a923b9f54d1b8f12564a872144efad3f3a7d2397cd1217dc5a9c96e43b2960a8425e97e07a02b0dac90f346b91a346a23ed2bb7fe6919c22dff03f62da7dba176e8ddb22f3f3a668891d3f4e69548d0ac4e71e6d28ed5a67ab5ac611d460b67a201f4f56a5003ca7a7d1cd1db6c10075b09227cb8c5dc1666f8be710b4b7bc2b95ae60da4f64179a50d2f88744361591671d36b7296315f6996439ad79821da8e772dfbf55a90d5d52ef7d76b35ffebd42e3525f4530c54a0f23b4d07c5f5974470e89404d176eeff9ef2333619691c59b7aadd42c296b1d0d328d9a3bd59a54bba93a0c1f1d62418c2190c38174b6abea02db66e818320ec4b8bac1c12f18f30dade27e63c58f9e7caf4bf69b265a2f9d91800861acf479e65ec17e680577e058cb16c109bcf9b2909fce3361a2c2685c10be8540a1222db5ecf0cc4d53a4214b7bf6248adc3a861e34841a3779c46046c5364f1ea91a78c9700d462ecfaae36ba760c1bd6a237c961edf4022cedefe5e937bbed7051ae61b96d08b0487ce0568ff0d32740bbd49ad0db86e09102ab21a915616e9dfddc81ebfb36c903e07a40cd2dd119ff4a50b93fc6fdfc0f36e59e0148fcff3fe8e2cd6d30a9e4b8f015567d118b6274e1ed75b22e44ca9d9dbfc160742cfac581e1a0bf5ff3326bc5f7896b9ca05a811d55e97c834d37a6495cc26cf442bd2d90129895e9cc0ed01e2155293f47a07ab5880c6ca29ed44d9ccbcaada7f3eb60402181488654e04911578b1aa9cdd4b86b0dd2450df3a43081e4110ab58de763924d3c89152e99293e638f9acd8d7", "signed": "538eace493de53384b1e985bb907c094f8168430dab14d37791be6e78ff3f5a306ec70dcac86d993a4c1f75850786d795f022b79be6a547769e41569c5a9a30a6e7c6b122ab36bd135f69e2b85e7fccefb072c12cf088a3229d876eff532389f0577116f7af29f1195e3828839381380467178b229c5a18d7c4943ec970dd18bce723bd0ca91ffa95563546a324fe0b9bf6c0455d4276039e8d291fc7276aa55a1cd3ea05282654a7f9700adcbc78077c5dd0fc86eced48f4a60ccb76bfb8b4562bac22a02d19e4489394ab9719fc144f5db2ef039b37f3b51d1d657a0cf835d71f1a4af01eb9fd885c604a624cbe910bfde093ad3f0cbfd9a48307329d44234bd01191d56e522d72b54e1fe4733da3aec6827eab3554898e03e577b4e7b9dd3f308e616808d0294499f2886295e54c360199ca83a83ff46195ea3c484a66838d51acbe9611eee036ae281c6793cbd451f9271fb5d25ea7c1899ab5d43ed8b9d067bc56d8d4a15f1dab8d8d95d1b17af64cb18c1147551147addcbdd53fbccd9026f855547131bee95071639f649f2d035a25a3e42e38e22bbf038106ce8bc4ad6768ab92cd57afacd04ee55cf0714b768952dac240b1e9b2835ecf7b0d6c407c82524a923b9f54d1b8f12564a872144efad3f3a7d2397cd1217dc5a9c96e43b2960a8425e97e07a02b0dac90f346b91a346a23ed2bb7fe6919c22dff03f62da7dba176e8ddb22f3f3a668891d3f4e69548d0ac4e71e6d28ed5a67ab5ac611d460b67a201f4f56a5003ca7a7d1cd1db6c10075b09227cb8c5dc1666f8be710b4b7bc2b95ae60da4f64179a50d2f88744361591671d36b7296315f6996439ad79821da8e772dfbf55a90d5d52ef7d76b35ffebd42e3525f4530c54a0f23b4d07c5f5974470e89404d176eeff9ef2333619691c59b7aadd42c296b1d0d328d9a3bd59a54bba93a0c1f1d62418c2190c38174b6abea02db66e818320ec4b8bac1c12f18f30dade27e63c58f9e7caf4bf69b265a2f9d91800861acf479e65ec17e680577e058cb16c109bcf9b2909fce3361a2c2685c10be8540a1222db5ecf0cc4d53a4214b7bf6248adc3a861e34841a3779c46046c5364f1ea91a78c9700d462ecfaae36ba760c1bd6a237c961edf4022cedefe5e937bbed7051ae61b96d08b0487ce0568ff0d32740bbd49ad0db86e09102ab21a915616e9dfddc81ebfb36c903e07a40cd2dd119ff4a50b93fc6fdfc0f36e59e0148fcff3fe8e2cd6d30a9e4b8f015567d118b6274e1ed75b22e44ca9d9dbfc160742cfac581e1a0bf5ff3326bc5f7896b9ca05a811d55e97c834d37a6495cc26cf442bd2d90129895e9cc0ed01e2155293f47a07ab5880c6ca29ed44d9ccbcaada7f3eb60402181488654e04911578b1aa9cdd4b86b0dd2450df3a43081e4110ab58de763924d3c89152e99293e638f9acd8d7", "signature": "538eace493de53384b1e985bb907c094f8168430dab14d37791be6e78ff3f5a306ec70dcac86d993a4c1f75850786d795f022b79be6a547769e41569c5a9a30a" }, { "secret_key": "a63c1f54b2ca058fed2ee2504b983ff33d570a9baba583c086cefe19f43ec49d", "public_key": "329b866bca4194297fc1ad5a0eba0df956699c74ab7da5fa5462bd0661471020", "message": "791b86fd587713478f9234ff30cefc123cd7c3eb125fa74e4c6db64e7844f7c85b1686e71ed08d1a6a04e0ebbdff4ab160c976c8ab9b505f6a7eb0a18427e999a8828df10684f8c75b6a6b0a64c0afa4bb22bed1cb9325359cac3b8c508d98bcb0ebcd748dc132f1d6a360a4450d1292a1fefc4e57e4107a223f421e7d14a384b85c18844d0b9eed2ecb81bb74e8a12652d98505795a013116a7076ccb5493d6a711f7637e97a780e74da1b39b15cc7bbde2e6c4d0d3e8300597c836e80bcb8d8081d974e02432eac88368211d3aaae89a14417108e1ff6737083849c625b40d631f6c8357220c7f37380b3b2cc5d0e2df6b4d1196579dbc57b6c9ea0d41f4fa0e556f943c9448ef42fc78df5996648ce2f3de04d8a663f967f3d933d4f65357ab29ba5b6405fb162972578ddbb2367bed143c854c1088de921d79f5a92a854837eb7702e1ba925c6eac23d134ba1bafc5d46de2a1942c7f366f701b0afabb75cb1d808e1a1e4e3ae5de88e8e9989757458bddd8a806c110cc3a733d1d4ac58a405c4d81134fbc24ccde7d5afe420f9f1785f0a5020fafbb2261222508aa0528b7b48b567200958425efcb42934a880b133444bb109f2a954cfa35a2d17cb05ee3f16d06b321a15f91339abeda243ad6c0919fac51e907e053fdeed1cf03003734137793941b8adf9ab6af819c245d6d56f16964c8a75b0756a8cb0ca8c12ac6e6b3942eebec2f868835f81b109db498a4ca2e021fa765608d23d803dedc9e51453fc1d2a6a38a4aab257c0fe7d67d32a541e014b60e1013a92c1b3ad9e6f11be293b246f9a0c6440b0b54fee75fed2fb75cc91ecb32738c495831586a11242d87dcb4883edf6757a50b18843759b98dd0cef4a3fe10d76370ecda8c83fab87eee2656c5f261c340ea91a560d0e2c64289267f0036ba35944800a5a0aef3f1df839a724e181d79b8a3c16f65ae27953c4aae8ccd30ff5acc4b31e4765c68fb38319f10acf89247b5a39b3b08a191754a24aca9596a1f8a70b6e4f03a2004a9086ff6ed07652a926e1e2df7bdccd5bec16e5c4e968364a09abf9ded93df5fca0bcca5c812976e5cfb3c3493fc175d1d92ee8d1c98fb3382b3ab90c5c0e4bdf6a3ac94767b68d47e6b9c244265e3b1ab0623a8f0100273f2c607de89612c72d39be4c0b4d77a3c61368df40b3608652989d1e19c0aaf0e3c253e562c6409fe6448929b33753de162e6de5bd466a5114fc0e5f57102755e29544f03b28d4f78de9a024dd4c4e8c3c2d44115a7ae15edb4f558aa7dba6426e7e372c54f7940bd7714467f8c3a1add3c640189c31660d8cc01d3c5382e42abc104c723f948a804ca853047b6b87b5b6ef4", "signed": "283359be41290a51e6a7c5d5725ca4ea0a68f14aca14b0f02566dee21f490da3c7e95f7ab739bc35a7f4f232e971aa157657a633eba0e72dc97af32cdb928702791b86fd587713478f9234ff30cefc123cd7c3eb125fa74e4c6db64e7844f7c85b1686e71ed08d1a6a04e0ebbdff4ab160c976c8ab9b505f6a7eb0a18427e999a8828df10684f8c75b6a6b0a64c0afa4bb22bed1cb9325359cac3b8c508d98bcb0ebcd748dc132f1d6a360a4450d1292a1fefc4e57e4107a223f421e7d14a384b85c18844d0b9eed2ecb81bb74e8a12652d98505795a013116a7076ccb5493d6a711f7637e97a780e74da1b39b15cc7bbde2e6c4d0d3e8300597c836e80bcb8d8081d974e02432eac88368211d3aaae89a14417108e1ff6737083849c625b40d631f6c8357220c7f37380b3b2cc5d0e2df6b4d1196579dbc57b6c9ea0d41f4fa0e556f943c9448ef42fc78df5996648ce2f3de04d8a663f967f3d933d4f65357ab29ba5b6405fb162972578ddbb2367bed143c854c1088de921d79f5a92a854837eb7702e1ba925c6eac23d134ba1bafc5d46de2a1942c7f366f701b0afabb75cb1d808e1a1e4e3ae5de88e8e9989757458bddd8a806c110cc3a733d1d4ac58a405c4d81134fbc24ccde7d5afe420f9f1785f0a5020fafbb2261222508aa0528b7b48b567200958425efcb42934a880b133444bb109f2a954cfa35a2d17cb05ee3f16d06b321a15f91339abeda243ad6c0919fac51e907e053fdeed1cf03003734137793941b8adf9ab6af819c245d6d56f16964c8a75b0756a8cb0ca8c12ac6e6b3942eebec2f868835f81b109db498a4ca2e021fa765608d23d803dedc9e51453fc1d2a6a38a4aab257c0fe7d67d32a541e014b60e1013a92c1b3ad9e6f11be293b246f9a0c6440b0b54fee75fed2fb75cc91ecb32738c495831586a11242d87dcb4883edf6757a50b18843759b98dd0cef4a3fe10d76370ecda8c83fab87eee2656c5f261c340ea91a560d0e2c64289267f0036ba35944800a5a0aef3f1df839a724e181d79b8a3c16f65ae27953c4aae8ccd30ff5acc4b31e4765c68fb38319f10acf89247b5a39b3b08a191754a24aca9596a1f8a70b6e4f03a2004a9086ff6ed07652a926e1e2df7bdccd5bec16e5c4e968364a09abf9ded93df5fca0bcca5c812976e5cfb3c3493fc175d1d92ee8d1c98fb3382b3ab90c5c0e4bdf6a3ac94767b68d47e6b9c244265e3b1ab0623a8f0100273f2c607de89612c72d39be4c0b4d77a3c61368df40b3608652989d1e19c0aaf0e3c253e562c6409fe6448929b33753de162e6de5bd466a5114fc0e5f57102755e29544f03b28d4f78de9a024dd4c4e8c3c2d44115a7ae15edb4f558aa7dba6426e7e372c54f7940bd7714467f8c3a1add3c640189c31660d8cc01d3c5382e42abc104c723f948a804ca853047b6b87b5b6ef4", "signature": "283359be41290a51e6a7c5d5725ca4ea0a68f14aca14b0f02566dee21f490da3c7e95f7ab739bc35a7f4f232e971aa157657a633eba0e72dc97af32cdb928702" }, { "secret_key": "5b67a6d7c650dd92ddd036ce7a305bc959a497c5e515a68493035cb3850ee03d", "public_key": "4c6fc1640505fb46669f93048f8ef557099f3fd92a53064b163363a31b7f00aa", "message": "62ccde31772c57e4853aaf2a8181fdb53fb82790ea6501bfc8f5d4ae8dbd52de42ce2e8961ac1731f4bc085fb561ef09a2442970b6297901aeaa2ee555b7d5e3951c7c351239ddee95ff54f924da95cae7b15ba6a9a1337b8ce4921ed913cd791c1c6941080e548f3c36e845acbfd8d8ce35e2fdc2a2ad6c7e2461bfcbf1aabc55cf0fae428885be5e86533308c9756805219abd7ffc1657b6f4632920a0c10e0e363319d900fcd61e7ddbcd6e762a7db92480c363b2c0640c6bf32d690dd829d8405fa66e4783ebe1cbde9547954a90baad9f774e94549abbff2c1f5caec2bfd28e415d36429d58518c3e17e8699e1989d47b8d627ef9ab4d1e7d120b372c2141304f7fabd0265b8be41f5467f4de9e65c125ee1f27a289c4f7c9a1fbf25bfc2f8d308e7ff52191cb7644c6af204522f2ac87b5f40525fd43d308c8dbc6a861d25db23ee276678a1b6e8e91283be02470482ed6cc9f6e396351d11b1c7e22329c091fe7d368f60653f93b0f6a3f712c20f9d2d8a9a0819872f0c71d7b1c0bc1683a152b484bc21cf556093ab4c0ac16d322ff0bf452e5581e1e7241673884023c7d6e17e2de8059f60e4c18e13bd55fcfee623fd0469c0d0911611d099a257020f2f31bf5078e6e65a135d5bf407620236d6cc759310fa728ff8bb5ec56abbe1a3cd15153f892d958d30d162d01ee665f5b562781d8dcf8428059e5fd225ad78a99ea760fe5d9ee8219c95acb18d05622e10a9b6c67f6d4f6ed11635c5e2e0f85dd5d3cbda65aa423d594a80b40427bc321e0eef9afd2bc8746ab7399ff6d0e1287b661ddc4062d072018f4c10e86cfaed72d9e686ed09d5255d360e3eea2c29b9eaea05fc78c8cdb8c9d4afc7adc6d4aa067b7abfb0a4e940a77580ec206456cb9e9f95f6d565d536e535a167ede8e20ec36081e2fc55aefaf24d227fffe5e6cb03093f443b4c51655d91ca6f275959d1a802adeab44701b31e8b0fd0222c499966c72d1020ad9370e2802be04c9933f6b774f6e8c69fc0bfd315939a127b4e06d0f6f5ede671ce11612126b5187b53329b0a9cb7da3b1ccd67b8c07bab99a662df8ce851f502fc4e1ed1632b6ba555544018f7527e362efc7e3b2ba6f75a1254f428b3b7e0bea69549e7f9c736275550080aee3af5914e3a34be656c77f6b29420e5433f3dff3811f3528208e9d850aa3c29b0f778a2427d5fde30732dfe50443a9c1ad55c72a08ab26ffaf8efb90bcafd3726b00c005c8c0f0dbf2a1353086721e446545b813441194a755fd26b963afd977278d1b10f09001c7ed975403c15cbe7f992ab07b8470c939f866f420f77db779af839700329e0777a6116365d76c36d09d860472a5", "signed": "0f073c9a586f6f5e08389a2a5e1808e270f0edb6af104496f93757623fea53133a731c445ac23578cd56a3883c08958668631fedf1446ce34f857f90822ba80a62ccde31772c57e4853aaf2a8181fdb53fb82790ea6501bfc8f5d4ae8dbd52de42ce2e8961ac1731f4bc085fb561ef09a2442970b6297901aeaa2ee555b7d5e3951c7c351239ddee95ff54f924da95cae7b15ba6a9a1337b8ce4921ed913cd791c1c6941080e548f3c36e845acbfd8d8ce35e2fdc2a2ad6c7e2461bfcbf1aabc55cf0fae428885be5e86533308c9756805219abd7ffc1657b6f4632920a0c10e0e363319d900fcd61e7ddbcd6e762a7db92480c363b2c0640c6bf32d690dd829d8405fa66e4783ebe1cbde9547954a90baad9f774e94549abbff2c1f5caec2bfd28e415d36429d58518c3e17e8699e1989d47b8d627ef9ab4d1e7d120b372c2141304f7fabd0265b8be41f5467f4de9e65c125ee1f27a289c4f7c9a1fbf25bfc2f8d308e7ff52191cb7644c6af204522f2ac87b5f40525fd43d308c8dbc6a861d25db23ee276678a1b6e8e91283be02470482ed6cc9f6e396351d11b1c7e22329c091fe7d368f60653f93b0f6a3f712c20f9d2d8a9a0819872f0c71d7b1c0bc1683a152b484bc21cf556093ab4c0ac16d322ff0bf452e5581e1e7241673884023c7d6e17e2de8059f60e4c18e13bd55fcfee623fd0469c0d0911611d099a257020f2f31bf5078e6e65a135d5bf407620236d6cc759310fa728ff8bb5ec56abbe1a3cd15153f892d958d30d162d01ee665f5b562781d8dcf8428059e5fd225ad78a99ea760fe5d9ee8219c95acb18d05622e10a9b6c67f6d4f6ed11635c5e2e0f85dd5d3cbda65aa423d594a80b40427bc321e0eef9afd2bc8746ab7399ff6d0e1287b661ddc4062d072018f4c10e86cfaed72d9e686ed09d5255d360e3eea2c29b9eaea05fc78c8cdb8c9d4afc7adc6d4aa067b7abfb0a4e940a77580ec206456cb9e9f95f6d565d536e535a167ede8e20ec36081e2fc55aefaf24d227fffe5e6cb03093f443b4c51655d91ca6f275959d1a802adeab44701b31e8b0fd0222c499966c72d1020ad9370e2802be04c9933f6b774f6e8c69fc0bfd315939a127b4e06d0f6f5ede671ce11612126b5187b53329b0a9cb7da3b1ccd67b8c07bab99a662df8ce851f502fc4e1ed1632b6ba555544018f7527e362efc7e3b2ba6f75a1254f428b3b7e0bea69549e7f9c736275550080aee3af5914e3a34be656c77f6b29420e5433f3dff3811f3528208e9d850aa3c29b0f778a2427d5fde30732dfe50443a9c1ad55c72a08ab26ffaf8efb90bcafd3726b00c005c8c0f0dbf2a1353086721e446545b813441194a755fd26b963afd977278d1b10f09001c7ed975403c15cbe7f992ab07b8470c939f866f420f77db779af839700329e0777a6116365d76c36d09d860472a5", "signature": "0f073c9a586f6f5e08389a2a5e1808e270f0edb6af104496f93757623fea53133a731c445ac23578cd56a3883c08958668631fedf1446ce34f857f90822ba80a" }, { "secret_key": "2631c8c34d2948ddd5996b4149cefd238ea7452ec22e246124dfa279ccc27db8", "public_key": "c3906786ffb8a7c27c44c2447f9dde7d666dfe588cfc54f2d25040512a371bc1", "message": "6f9bdce1443f2856d4a2f22782835012b7818a0e020dbcc22a821658305f134234d14cea636100ed896c2a8fb0e87048ec6f8b31484f78eb171045add72c85710ec9f9b5d43623417b5653be86e7fbf8b4ff91110a808cb41acf66d436e89a737faea4eff3544960f114b833b0b4ebc2c14070b0bfb7b0057eebb842bd1c1ed458ad3428f8f72a1d1db3c4cb4797a399d47a1e6db74dcb2ee24ae81585cf66ef6d9bd223f0f54bc8c1cec1bb4460bef4ffd32ee805c3ca5ee976ff9c14559f8d756662a2bc19e4c5985406a07305c9950d866c9a79a3e5f6c5969753a170e0fc4cc09c6d87a12b44cdf3be1623159e90cab7a8a3e6f01f268595b021b1ef7d00769477270d5584c912e22a367438277f59df20c5620dd5beaa9bb60bee47f4af527d892957b2d12b678b5279a3f83264654c0a0f8d21e709668f30fb6e68f047d0d9a7c2ae9a28f7cb9dbf18f63fc1661f07d310e540c77631f5bdac5824685d7c9aba0fe1d09407a9662ef18eb3e28fd1e8bc892657bc38243a2e6453bdaeabb2791fc5489521295457ad04180ca871f6318792bd15fd1800ce59dd3ecc7e0b72979267d8183e804fdd45daad84fc4cafeb561ea8d6a74a7cde722d96253ab3e75f0adde02a61fd5e1f59cb1f5f1b2e052643589a9e4be4dd6ee64538cb0b109a113f30a58b3565624043662abe17f60e31e89c36c995e00ae07f56a9118a31aec24ad544bc965811218df827c1730bb904bb79b68613f6c994679b6990d775b5cb32db97194bd81019bea41f3a7eef501bf8491b0ea859388452e3ecbe16aa7d5691510a6606c493e4c293961bf40b4cd300d9d22ea1a7724c078b8bab1fd16504e989b136d9251ac9f1ed94a5e9acbd9c04f8058afe03049aed8ba29fa2e8fb44f8e8c04e8727f399e735e6c1496a91a9b2cd2ab02d43b285e9d7610293b6749df1044b30e2da99a564429a23e68c96fce92b08a00b7b742ba97a62ee58776d7dd565a490071d4b19dc648e03329cc5c825d387eba49e2eff6c4341865c464f13f1beb1827a7f268cc15a982480bf084fe3652c1b0e0b4ad26255859abf1c8a7f9b3bef098a9407fdea0a539eb008fdd749fa0186cc0169d9d9e68fe5e54cac32ce57b5c84c2d805eca39c2dbbdd2e02f7d228826712ff4a61411ca0aeb6f01a1f80ef29eeb071a43222d9497184bd85d9e44b166be97cfd2a732af4a233463d3ab543a7a3c7aec555656568840f4dfea217f6553aa98af324c12b2c3214ee76eec700670af68c8c1f36946efd7ff0933e5453f128e9715fdb3344ac10c4bb7ec8f10ddf5db71f1cf0efe40f75e5b6334ef8cf8429b3291e6e4ce379c178affcbc61030eb896d744d", "signed": "0adc6fa40ffb81f6ef4e4187554917775cf465e7b5e857f2e1e7f400977106d2377ebc76abb1db924c64867e3c6fe38c0b4fcb1d0f9468e8fb235029a81ce6046f9bdce1443f2856d4a2f22782835012b7818a0e020dbcc22a821658305f134234d14cea636100ed896c2a8fb0e87048ec6f8b31484f78eb171045add72c85710ec9f9b5d43623417b5653be86e7fbf8b4ff91110a808cb41acf66d436e89a737faea4eff3544960f114b833b0b4ebc2c14070b0bfb7b0057eebb842bd1c1ed458ad3428f8f72a1d1db3c4cb4797a399d47a1e6db74dcb2ee24ae81585cf66ef6d9bd223f0f54bc8c1cec1bb4460bef4ffd32ee805c3ca5ee976ff9c14559f8d756662a2bc19e4c5985406a07305c9950d866c9a79a3e5f6c5969753a170e0fc4cc09c6d87a12b44cdf3be1623159e90cab7a8a3e6f01f268595b021b1ef7d00769477270d5584c912e22a367438277f59df20c5620dd5beaa9bb60bee47f4af527d892957b2d12b678b5279a3f83264654c0a0f8d21e709668f30fb6e68f047d0d9a7c2ae9a28f7cb9dbf18f63fc1661f07d310e540c77631f5bdac5824685d7c9aba0fe1d09407a9662ef18eb3e28fd1e8bc892657bc38243a2e6453bdaeabb2791fc5489521295457ad04180ca871f6318792bd15fd1800ce59dd3ecc7e0b72979267d8183e804fdd45daad84fc4cafeb561ea8d6a74a7cde722d96253ab3e75f0adde02a61fd5e1f59cb1f5f1b2e052643589a9e4be4dd6ee64538cb0b109a113f30a58b3565624043662abe17f60e31e89c36c995e00ae07f56a9118a31aec24ad544bc965811218df827c1730bb904bb79b68613f6c994679b6990d775b5cb32db97194bd81019bea41f3a7eef501bf8491b0ea859388452e3ecbe16aa7d5691510a6606c493e4c293961bf40b4cd300d9d22ea1a7724c078b8bab1fd16504e989b136d9251ac9f1ed94a5e9acbd9c04f8058afe03049aed8ba29fa2e8fb44f8e8c04e8727f399e735e6c1496a91a9b2cd2ab02d43b285e9d7610293b6749df1044b30e2da99a564429a23e68c96fce92b08a00b7b742ba97a62ee58776d7dd565a490071d4b19dc648e03329cc5c825d387eba49e2eff6c4341865c464f13f1beb1827a7f268cc15a982480bf084fe3652c1b0e0b4ad26255859abf1c8a7f9b3bef098a9407fdea0a539eb008fdd749fa0186cc0169d9d9e68fe5e54cac32ce57b5c84c2d805eca39c2dbbdd2e02f7d228826712ff4a61411ca0aeb6f01a1f80ef29eeb071a43222d9497184bd85d9e44b166be97cfd2a732af4a233463d3ab543a7a3c7aec555656568840f4dfea217f6553aa98af324c12b2c3214ee76eec700670af68c8c1f36946efd7ff0933e5453f128e9715fdb3344ac10c4bb7ec8f10ddf5db71f1cf0efe40f75e5b6334ef8cf8429b3291e6e4ce379c178affcbc61030eb896d744d", "signature": "0adc6fa40ffb81f6ef4e4187554917775cf465e7b5e857f2e1e7f400977106d2377ebc76abb1db924c64867e3c6fe38c0b4fcb1d0f9468e8fb235029a81ce604" }, { "secret_key": "39769a66f0ca1290fda14375b35c663f6a4b2ab3607179abd99063e2efa2c6a8", "public_key": "f9fd4c191f38f12190d3285e20c6cee54cfd6ff315300a4efdc8a90e80af4083", "message": "ff4d8987e3fa36012b7586736b793d659754698cd12b65e5ba9d758cac1649288d20224377283ea5425dec10ab9917d18cd13d1bdf4a769f37044c84faa2a449c689e004c14e005c49da4106ff75ce1303361c6e3e34ccfee75ee9c31cbd06a4bcdbb42fd649be4dfcd664006d6a5f61077c04a6a81db36be86ba42c2951f051aeda64acea496cb924982b9f7d234ac9723fef98a8e12755e326a52fbe35851f411eeb867606d45b513f54526391c554635c180b8fd0ee451afc96e4efd360b61e6baf03dd6d19ba515c31ec1cdd3affffdb27354e3e6b56e9e1a1a1b7d4b57d9d7689bb2fea6c8d3f9ce0df2d9ee919c4230a1f20b85dfefe1ea3d7f77db470e4022429ef609b0ff44946440acb44cd13445bcfa3f20503c26c2fb663c89065fb9334a603eb9ab7152e62629233c44cb00e77716d9b72c84fd1b340634ff1cea347501576100ecb0fd1bb76ae0dff1c2b0948eb71ee2cc31e79d3015d72dbee224a980e0f95a69f793da83a2daa56efe57b2f8ceaac9e55f443ca9e732b48c75fac21c36fa77273c3f34835ffd83c96f00ac6e86cffed08153646c1cea223da9ca360cab97e03b2b6c8fba7c195a39ae52eb2ee864300ae56a10f547f99a3169872249f97774b1798935536f2f5f011ce57613a94fcb7e7286a6d49c10fd929d7671cbb8cf17dfcad4b2485c3d8fd79128721e55d84808763c2afa9c55e3b0cd7bf2f0a66b5e467bec5ee89ad570b60f188b3f7b4a511ff859312ded078d8d0091134fd49bc792d2d7d60b304941c7f23206f99e863b1e2d8c9ecffd2ff0a3a3c754985615a9a92edcead00fe0e05493b198d1f7c90088446bba46038a71f32653b5912b24f43137748b75aec2c15fe4bf5a6f86b8a6cdd9c7447f2ebb0f43b01ca1523e0d496240006ad7ffffafe0df5754b342caff3555d72a27d0b92ca1667665cec43bfb583077a9c1741fa492ce3dc2c7529cded81b8281a3f375948b8a7ced096b2facc25e39029e221b66a53d3979e1f405fd88afc06ec6e4309dc85e69d6ef2b4b49266164a9d9d1c31ee3921127b13381bfb740dd38dc1c7315921f9c2fe58b61b631a7d9fde2dd8a4be3ded0490ae3b8376791955c1c4b4fed00b9f4c38ab7350fc2e37a3150c18162b1faf0337894bc23e74f595e4be33466deab35458be97b4f7565897f06852f71c60fef9101d726b72e0102a97b2ca5211e3806834b0ac1a7df87c2a078df263ef8ba457dc891b7f2e627811ab622b9946f8c6b731f24078d17b06b200c3447f8032aa3e7a243ee422dda2e652fd75713afbce8a59ef8536653a48dcf42a70e7621f9b2802409be1c1a61f32e36789a5c5055e1a8268e9dc438c2e1527", "signed": "1442dea2807e031159ec6a412d8e07bb3e299308090f218fa7c10a9c5068ef9b64ef11ca9fb92be1d0216b99318ff0f03cb871cd7dd63a38ae1702313e5b250cff4d8987e3fa36012b7586736b793d659754698cd12b65e5ba9d758cac1649288d20224377283ea5425dec10ab9917d18cd13d1bdf4a769f37044c84faa2a449c689e004c14e005c49da4106ff75ce1303361c6e3e34ccfee75ee9c31cbd06a4bcdbb42fd649be4dfcd664006d6a5f61077c04a6a81db36be86ba42c2951f051aeda64acea496cb924982b9f7d234ac9723fef98a8e12755e326a52fbe35851f411eeb867606d45b513f54526391c554635c180b8fd0ee451afc96e4efd360b61e6baf03dd6d19ba515c31ec1cdd3affffdb27354e3e6b56e9e1a1a1b7d4b57d9d7689bb2fea6c8d3f9ce0df2d9ee919c4230a1f20b85dfefe1ea3d7f77db470e4022429ef609b0ff44946440acb44cd13445bcfa3f20503c26c2fb663c89065fb9334a603eb9ab7152e62629233c44cb00e77716d9b72c84fd1b340634ff1cea347501576100ecb0fd1bb76ae0dff1c2b0948eb71ee2cc31e79d3015d72dbee224a980e0f95a69f793da83a2daa56efe57b2f8ceaac9e55f443ca9e732b48c75fac21c36fa77273c3f34835ffd83c96f00ac6e86cffed08153646c1cea223da9ca360cab97e03b2b6c8fba7c195a39ae52eb2ee864300ae56a10f547f99a3169872249f97774b1798935536f2f5f011ce57613a94fcb7e7286a6d49c10fd929d7671cbb8cf17dfcad4b2485c3d8fd79128721e55d84808763c2afa9c55e3b0cd7bf2f0a66b5e467bec5ee89ad570b60f188b3f7b4a511ff859312ded078d8d0091134fd49bc792d2d7d60b304941c7f23206f99e863b1e2d8c9ecffd2ff0a3a3c754985615a9a92edcead00fe0e05493b198d1f7c90088446bba46038a71f32653b5912b24f43137748b75aec2c15fe4bf5a6f86b8a6cdd9c7447f2ebb0f43b01ca1523e0d496240006ad7ffffafe0df5754b342caff3555d72a27d0b92ca1667665cec43bfb583077a9c1741fa492ce3dc2c7529cded81b8281a3f375948b8a7ced096b2facc25e39029e221b66a53d3979e1f405fd88afc06ec6e4309dc85e69d6ef2b4b49266164a9d9d1c31ee3921127b13381bfb740dd38dc1c7315921f9c2fe58b61b631a7d9fde2dd8a4be3ded0490ae3b8376791955c1c4b4fed00b9f4c38ab7350fc2e37a3150c18162b1faf0337894bc23e74f595e4be33466deab35458be97b4f7565897f06852f71c60fef9101d726b72e0102a97b2ca5211e3806834b0ac1a7df87c2a078df263ef8ba457dc891b7f2e627811ab622b9946f8c6b731f24078d17b06b200c3447f8032aa3e7a243ee422dda2e652fd75713afbce8a59ef8536653a48dcf42a70e7621f9b2802409be1c1a61f32e36789a5c5055e1a8268e9dc438c2e1527", "signature": "1442dea2807e031159ec6a412d8e07bb3e299308090f218fa7c10a9c5068ef9b64ef11ca9fb92be1d0216b99318ff0f03cb871cd7dd63a38ae1702313e5b250c" }, { "secret_key": "0c808b066f0c8e8dbb1c23d6c2cedd0be866d8425f241a9285700ea54536cf6d", "public_key": "44ee72900450c56ab21f2686d29525d0663e0bdd87725beac5d68baceb69f1d2", "message": "c945714100581f4e24da11fc0f6c6d0210433f9777525124c55ee072d85d798b705f9d31c8f977db6edfb7a65c78ad2d7d31d6b7b5be40ff1178d303b6839bb0c63210c1d338c103afa0d453eca1bca277d930778ad50802272f03dbe2184fc31ef8ea6abe216997199f7c1b337737968907272aa51bd49c07389c95468cef4fd99ae78ca4542a2bbc0e8aa95214ad1cfff9d5085a434394473b84b74be9bf2f0202ad1ee4616604ca1dd75f4a195342ebbf8fc59f3f79616554dc7bfdd556be437221c10bfad39e119e06045be5fed683d3534fb6cfed33891c96f9c330f28b684f8fbad47c01418eab6ceecc2ed777f4c218a27ac22582392315c53aa7309ec54c6175236e4424dc978465ab628d9544b0be84103eb56f1bafe5e5eaed04c98bfe2e8a2418c6c52a61eace85236b66c7b3b8707ed55641dd9d5da97c99c11cbeb9aa2db147820dc724800a9d80f505fa5af20921cad2435683bb4fc60bddd475f863e2f5950d236399d8d75b404b394a546737f93a62408700b3ab3c1e922b1a859a2915c2d35368815cd45b85b2ac083121ff000f050dcdf415e5275a5c42dae3b15400f3ddaf9339f20a1261a88cd90205639763211152df414a9a6a6218f56b35a2de9e8482449f6da77c9e3d4af0493015a726217f82ac58954fe3e2e34440356b112e06a6f671fb5a6ef4619a6ea7b4e04db3757fb664c396b341ca89001dc1604b51fa9153f9130c1020ff88909287823ab3915ccc85c4e35df6c2f8e6f902be82ba21297fd3835aff5ce02f3c07dc093fcb1aba26e06dfe6f02df79291aaca069ecab9381404c9c3ea1ad409adf292a91e3a582d5a7b68ffbe10a0305248e0967e6df372f281bd192e139979c9866ca8fe1e10e0616dc2d4f85e119e0cb4bfe8cc31d9f5c018b65408524000a3016a23d9914d57e955576e2660b0e0d96c8495a12c3d73122d200b0f0e5ebd446562b08f47934ab499a96991dcf99c96a62880739845d29820150553eae9be0bb41d53d3af01d9867bb4732c90bf6e137316e3b1edcc209a8a09fb062a6ef05f37e57f2c5d1d0cabaf07a8ed7d41455407b096754180aa96d3d96591945dd7a1040a2de60d8e1c054f7854652b732e7a8f5b6474c3baa1840fbe81b1e6b54e201ef0bc8d0f213d7cec1d824d22209ac72525a64b903e773b83f1b68f640279f15053d21ec15ce2ff75922176b7584a16bf1a1f0d636b7942a3d61862f6fd1309972d3141eb769314ca975d020bf02bfddf17d14b60eb786bf9f55989fe473320d4429677e301c682633f813ff26c0a3da92f6d0680616105b0425af338c2ea6153bdd5216fae2afe461e9249c05e32f76ad7c429d92534b686dd1", "signed": "38c682cedefb13e46b11f7b5f800cc8120d45a83cd8d8dec10c577bb0153d509ba4fdf400998788b706007ce162b96945c7140beee74e19d0743afa4ecfd250ac945714100581f4e24da11fc0f6c6d0210433f9777525124c55ee072d85d798b705f9d31c8f977db6edfb7a65c78ad2d7d31d6b7b5be40ff1178d303b6839bb0c63210c1d338c103afa0d453eca1bca277d930778ad50802272f03dbe2184fc31ef8ea6abe216997199f7c1b337737968907272aa51bd49c07389c95468cef4fd99ae78ca4542a2bbc0e8aa95214ad1cfff9d5085a434394473b84b74be9bf2f0202ad1ee4616604ca1dd75f4a195342ebbf8fc59f3f79616554dc7bfdd556be437221c10bfad39e119e06045be5fed683d3534fb6cfed33891c96f9c330f28b684f8fbad47c01418eab6ceecc2ed777f4c218a27ac22582392315c53aa7309ec54c6175236e4424dc978465ab628d9544b0be84103eb56f1bafe5e5eaed04c98bfe2e8a2418c6c52a61eace85236b66c7b3b8707ed55641dd9d5da97c99c11cbeb9aa2db147820dc724800a9d80f505fa5af20921cad2435683bb4fc60bddd475f863e2f5950d236399d8d75b404b394a546737f93a62408700b3ab3c1e922b1a859a2915c2d35368815cd45b85b2ac083121ff000f050dcdf415e5275a5c42dae3b15400f3ddaf9339f20a1261a88cd90205639763211152df414a9a6a6218f56b35a2de9e8482449f6da77c9e3d4af0493015a726217f82ac58954fe3e2e34440356b112e06a6f671fb5a6ef4619a6ea7b4e04db3757fb664c396b341ca89001dc1604b51fa9153f9130c1020ff88909287823ab3915ccc85c4e35df6c2f8e6f902be82ba21297fd3835aff5ce02f3c07dc093fcb1aba26e06dfe6f02df79291aaca069ecab9381404c9c3ea1ad409adf292a91e3a582d5a7b68ffbe10a0305248e0967e6df372f281bd192e139979c9866ca8fe1e10e0616dc2d4f85e119e0cb4bfe8cc31d9f5c018b65408524000a3016a23d9914d57e955576e2660b0e0d96c8495a12c3d73122d200b0f0e5ebd446562b08f47934ab499a96991dcf99c96a62880739845d29820150553eae9be0bb41d53d3af01d9867bb4732c90bf6e137316e3b1edcc209a8a09fb062a6ef05f37e57f2c5d1d0cabaf07a8ed7d41455407b096754180aa96d3d96591945dd7a1040a2de60d8e1c054f7854652b732e7a8f5b6474c3baa1840fbe81b1e6b54e201ef0bc8d0f213d7cec1d824d22209ac72525a64b903e773b83f1b68f640279f15053d21ec15ce2ff75922176b7584a16bf1a1f0d636b7942a3d61862f6fd1309972d3141eb769314ca975d020bf02bfddf17d14b60eb786bf9f55989fe473320d4429677e301c682633f813ff26c0a3da92f6d0680616105b0425af338c2ea6153bdd5216fae2afe461e9249c05e32f76ad7c429d92534b686dd1", "signature": "38c682cedefb13e46b11f7b5f800cc8120d45a83cd8d8dec10c577bb0153d509ba4fdf400998788b706007ce162b96945c7140beee74e19d0743afa4ecfd250a" }, { "secret_key": "049dac3c977d9df503496b43d76e5540e315001ad57f15ea9f0870cad2d4f9e9", "public_key": "fc6f4b7eb39a711680f966d468a61abb13a9b6449bb99fda3d12ce1b506d1b4b", "message": "7f31e346f68da73716aacb16eea19bb24142dc283e7263ffc3f704a22ae5275a0ef95f0669bae5a54c7feb84bc74873cca0f335d6cff3d8b4a20056c64f5e882cbbbd2ac74207676467e5466ddd56aedf56e097c7f59d945915eb0ebd0c3c83d48888d3e9ede51ad2dd8a0ee1eab4cf87ffa78635afc4d6ef3e87dda3b65565c2985a4ad0acfdfb81cb0e61c67826a6ea0bed4c08aa1a541de60458704ac21ca12f1c8118bb3092c35a40c921e684564562c2c1049dcdc2b8d6a97e3567d356bffb5692a41d89ddda0ec3552152a27577f1cce57d00986dca77edf5e2518158200adf690affb31aaf2b574836839440999f15791cea85342ac94a96c7af7a19e494310ae26675f43c35258e85b6840b99c6b09cfa58d19f1e43a77e397b08c0db1830bca67b39ecd8752da611e0832c6cae7bb8ce74a82e7e7330be5062ed05aa5c84457b007fb5ccdc20a55d54d8e0409c8bd83883d2e029dff26ea5db275dce099e418659a0400f13be9ffdc14e7d645a94677ca846970b7e6ac527fa009a359454b3c49364905189fb49c9bacb650c03cd82875894e3546ba03c32e336fc6516a87676c50d5b80b3054273b157c5d767514e54574b8a101985a8e967e95da8f929800260e08148beee2d7781e9e85d463a94ffefdbb75c28fa8898015680999429cee798b3fd2d96737868a263fba9fb6f4aad56a15c6412ff85e7d3752102daaf25e745fa5f6f174a231fcce8624dd70856f9babcc209144ff6864648dea0d6884566a4c39147805be084e4740bc509309bcb142964bb0cfcf6726a0e04bbf32ae6834732bda0384cea8f4a4849bba0d18646c1c34471896b5bef149f8cab9ec83722b0fb209efe8a04c4a235dc8ddb20acd92765afbf3058740ea70b9c10d9c5aef8606298fe4151593b21f797d92ae9f1e0881b0d271b0d5b10c6ed83c349ec2473fbf2ff780dcd076d8cf0aeafa71fe2b8c5128015f8fbbcfecd5281cd5eacb6fe9ac6eaa6e47d667b9ad4b7e411e6cb7463d567607afbfd0418c4eb06afe847f5e40b499443828d5a273a4a87e46def21a919d73863af0054a099e3adc5450b8e32f51ea52c599a4a2a35351788af7cb71e5c44bcb8df54a601e6ec2c1828b48c4b1ae4463106f10efa5caf3091abf99aaba5252f484d3bbc62bfa6b2a806d23c6331a62fc46bc627679e73ec82dcc08f79143f4b71ecf357ea2f0d74e6d3058e606043f6e8fed704282c16b1f988ffa365cfae9a3cf792e0c5baad70ca7e25776018b5e7f0e9544e1d73f3e5d1e416a5e50fbed296dc1bf4b29a3fbe32efbd7e99c83015d27f535adecf175fc36c1ea4f4423b36dcdc054ba993278e85ac3622d435f5237ba61b49a", "signed": "7532d1a61a981f303d7c2454354f99540cd484cde9ab337d6f7b51f179220f7fa2073476b41c71529f9836db6b1d0f5a482bbb4c68366176ed14d4d8eefade0d7f31e346f68da73716aacb16eea19bb24142dc283e7263ffc3f704a22ae5275a0ef95f0669bae5a54c7feb84bc74873cca0f335d6cff3d8b4a20056c64f5e882cbbbd2ac74207676467e5466ddd56aedf56e097c7f59d945915eb0ebd0c3c83d48888d3e9ede51ad2dd8a0ee1eab4cf87ffa78635afc4d6ef3e87dda3b65565c2985a4ad0acfdfb81cb0e61c67826a6ea0bed4c08aa1a541de60458704ac21ca12f1c8118bb3092c35a40c921e684564562c2c1049dcdc2b8d6a97e3567d356bffb5692a41d89ddda0ec3552152a27577f1cce57d00986dca77edf5e2518158200adf690affb31aaf2b574836839440999f15791cea85342ac94a96c7af7a19e494310ae26675f43c35258e85b6840b99c6b09cfa58d19f1e43a77e397b08c0db1830bca67b39ecd8752da611e0832c6cae7bb8ce74a82e7e7330be5062ed05aa5c84457b007fb5ccdc20a55d54d8e0409c8bd83883d2e029dff26ea5db275dce099e418659a0400f13be9ffdc14e7d645a94677ca846970b7e6ac527fa009a359454b3c49364905189fb49c9bacb650c03cd82875894e3546ba03c32e336fc6516a87676c50d5b80b3054273b157c5d767514e54574b8a101985a8e967e95da8f929800260e08148beee2d7781e9e85d463a94ffefdbb75c28fa8898015680999429cee798b3fd2d96737868a263fba9fb6f4aad56a15c6412ff85e7d3752102daaf25e745fa5f6f174a231fcce8624dd70856f9babcc209144ff6864648dea0d6884566a4c39147805be084e4740bc509309bcb142964bb0cfcf6726a0e04bbf32ae6834732bda0384cea8f4a4849bba0d18646c1c34471896b5bef149f8cab9ec83722b0fb209efe8a04c4a235dc8ddb20acd92765afbf3058740ea70b9c10d9c5aef8606298fe4151593b21f797d92ae9f1e0881b0d271b0d5b10c6ed83c349ec2473fbf2ff780dcd076d8cf0aeafa71fe2b8c5128015f8fbbcfecd5281cd5eacb6fe9ac6eaa6e47d667b9ad4b7e411e6cb7463d567607afbfd0418c4eb06afe847f5e40b499443828d5a273a4a87e46def21a919d73863af0054a099e3adc5450b8e32f51ea52c599a4a2a35351788af7cb71e5c44bcb8df54a601e6ec2c1828b48c4b1ae4463106f10efa5caf3091abf99aaba5252f484d3bbc62bfa6b2a806d23c6331a62fc46bc627679e73ec82dcc08f79143f4b71ecf357ea2f0d74e6d3058e606043f6e8fed704282c16b1f988ffa365cfae9a3cf792e0c5baad70ca7e25776018b5e7f0e9544e1d73f3e5d1e416a5e50fbed296dc1bf4b29a3fbe32efbd7e99c83015d27f535adecf175fc36c1ea4f4423b36dcdc054ba993278e85ac3622d435f5237ba61b49a", "signature": "7532d1a61a981f303d7c2454354f99540cd484cde9ab337d6f7b51f179220f7fa2073476b41c71529f9836db6b1d0f5a482bbb4c68366176ed14d4d8eefade0d" }, { "secret_key": "f07d61b5ca1c2700cb50f900c26b7c28f6c6940808c7bafff74fca4b11f425d4", "public_key": "eb243dfacc2dc6435776d554eced8bf92390604b35557cda51fd203eddb493fa", "message": "c1c67843d69a0e62e7bf71f90206a3d5595ca3c482aaa767e931b0d6c2f4752ab86991f03583bb138e9f72fab58fd602a4b6b29602cf891408af5a1bfd3398c0178c441461e3f49bc81d64c0d97f5ded692c75d4d64dac5d80d63bd4dc5210c1d9350b142ba6e768f150807ab8a86cacdb59d84ddf660be56203c014fba1e0dc16fa6d32694e14b128edd1f6c6ab445a3ad34174fa9e4b01f25b1d5e6eb76983b4295ce4914d3ae48c704a30e554fc1f868b6272eff06da24bfe17e4e0f0fa46bb08ffb907cb61bebe52df311a64cb578b30fd627df11221ae4003a0b0c68e3c6f95a21c8500d41b2c589cc46a139cacff57dcf00759f52e9ca3dabdb1788ab6b38a5048f58e08e05c394f9d3c72113d452b7084c519f86c1689ffdbae506ed8450522cbe43de27aa3bfdd92a91b71e52a3cbf77c1bd2893eabd407a57fe5e146873bfb2043f4a6147df083e54a2208d1925813fa404e4c47406e7728643ebfb0b10142f909ef856fd3a916bc0851543b82a55f8cd529bd21d9e2909d6d7e77bdcea4673e545ff4a67fa37d65f1f63f11d5d0d55974a30abe188335db5dcbd356658f9b77682d96dabb258ea95951a0559aea4064d5ea1680501dcb4228f2c956f81d2101144af74c716bc8bf4296dc3b831725cc17d3bfd9066a29953b2ecd75059435b49a25ac525b4fbab1779022dfb6de525149dcd902ac8a7e21f344f5f0101480692d61608952c71413e30037945e206c5eeadfc3edc4bae0d796ca0c5f56d6ffb3f0969df9df8a794f5dc83a3b2f5c3ab36bb901bcc31551c550c63fa41d6a8d57bdb9b5c65bc610c3a989752ab28a015e7c2f6b2fbf199a76b9750c0d3d592119c8b4022fa45bade2fbb41432679b52acb4608a95c34aa40bffec10bc98f4729dfccb650b2a052dfb068959e648a92d5aa4dd2d17dde67cdf2e6377af0d4ae379607389d7e3596441b9f4222cff6af73b3300270ce54800bd934a9109a02563adc56ae46584451cdaf4a77538157e5870f4ae12dbc81870f5db41a2cb55e00db3d2231628f1727c3acb99ed3acd8b67156a8005a4cc8f3d3555b79a03773a931f14eebce40b9fe46ede5da0881fb220717e418e8b5a0fe5e477e7285c554e859e16441672b489934a3a9eeb88d78fcc5c1db2d1fbdde392773f6c939972ee8fa3189f4e9872b4abdc83b379c0c10e818dcff75c83d6870729284ced41f2ff55a87c960e63d1211f08071293f6ac63f9bdef38fd5919ca90b3f5e25a6c0c664c4ecf831c64e2d4c6e798a98a3a0f7be7a2463eadaa6a2a348f9a494717123cc0a28c0a5eae3f5b585f2cb8cb260c2c503e41578573cd9b7cba1408dca9d860ae4f8c3d3f322a45b58a2c4", "signed": "c19b532b8248563932639701bf15bc015faebb17bb98d871616e1048d64ca5f955f558f63b5353a1576fa1acaef39bcbc9021756df5d1ab3bc741accf9059b04c1c67843d69a0e62e7bf71f90206a3d5595ca3c482aaa767e931b0d6c2f4752ab86991f03583bb138e9f72fab58fd602a4b6b29602cf891408af5a1bfd3398c0178c441461e3f49bc81d64c0d97f5ded692c75d4d64dac5d80d63bd4dc5210c1d9350b142ba6e768f150807ab8a86cacdb59d84ddf660be56203c014fba1e0dc16fa6d32694e14b128edd1f6c6ab445a3ad34174fa9e4b01f25b1d5e6eb76983b4295ce4914d3ae48c704a30e554fc1f868b6272eff06da24bfe17e4e0f0fa46bb08ffb907cb61bebe52df311a64cb578b30fd627df11221ae4003a0b0c68e3c6f95a21c8500d41b2c589cc46a139cacff57dcf00759f52e9ca3dabdb1788ab6b38a5048f58e08e05c394f9d3c72113d452b7084c519f86c1689ffdbae506ed8450522cbe43de27aa3bfdd92a91b71e52a3cbf77c1bd2893eabd407a57fe5e146873bfb2043f4a6147df083e54a2208d1925813fa404e4c47406e7728643ebfb0b10142f909ef856fd3a916bc0851543b82a55f8cd529bd21d9e2909d6d7e77bdcea4673e545ff4a67fa37d65f1f63f11d5d0d55974a30abe188335db5dcbd356658f9b77682d96dabb258ea95951a0559aea4064d5ea1680501dcb4228f2c956f81d2101144af74c716bc8bf4296dc3b831725cc17d3bfd9066a29953b2ecd75059435b49a25ac525b4fbab1779022dfb6de525149dcd902ac8a7e21f344f5f0101480692d61608952c71413e30037945e206c5eeadfc3edc4bae0d796ca0c5f56d6ffb3f0969df9df8a794f5dc83a3b2f5c3ab36bb901bcc31551c550c63fa41d6a8d57bdb9b5c65bc610c3a989752ab28a015e7c2f6b2fbf199a76b9750c0d3d592119c8b4022fa45bade2fbb41432679b52acb4608a95c34aa40bffec10bc98f4729dfccb650b2a052dfb068959e648a92d5aa4dd2d17dde67cdf2e6377af0d4ae379607389d7e3596441b9f4222cff6af73b3300270ce54800bd934a9109a02563adc56ae46584451cdaf4a77538157e5870f4ae12dbc81870f5db41a2cb55e00db3d2231628f1727c3acb99ed3acd8b67156a8005a4cc8f3d3555b79a03773a931f14eebce40b9fe46ede5da0881fb220717e418e8b5a0fe5e477e7285c554e859e16441672b489934a3a9eeb88d78fcc5c1db2d1fbdde392773f6c939972ee8fa3189f4e9872b4abdc83b379c0c10e818dcff75c83d6870729284ced41f2ff55a87c960e63d1211f08071293f6ac63f9bdef38fd5919ca90b3f5e25a6c0c664c4ecf831c64e2d4c6e798a98a3a0f7be7a2463eadaa6a2a348f9a494717123cc0a28c0a5eae3f5b585f2cb8cb260c2c503e41578573cd9b7cba1408dca9d860ae4f8c3d3f322a45b58a2c4", "signature": "c19b532b8248563932639701bf15bc015faebb17bb98d871616e1048d64ca5f955f558f63b5353a1576fa1acaef39bcbc9021756df5d1ab3bc741accf9059b04" }, { "secret_key": "50864a75aa0c69b59350077c204b20757f2b8b6855c37ed721b49f2ac917d6b2", "public_key": "cff3ebd5ea0c8b5531d9211e2219e4cfe5ded991d8ec424df54cf53c8376f9bd", "message": "b365f476ac92e76012a7ffd8782af15a3f5ee147f603a367adf2f9724613e8765b037ac0eb1f673736e11363e352ed5ae9eb5a67125ed818900342ae93371c433b91f6021d4be2a052b0da43b3682e7f740ae801d0541057858eb0c9c28d98f03b45e128aaa342c6b602776792aa81241cad06f1338fa0c71757180f588c8301d91c27679b5021cd75d7f6171ee9f8d56e4377679812f6ec5ed46538caed500c1d15f5fc86eaf9ed9cf9a0606b22614faf676462134e3db3582332b483dfa54ca29a5eb0d6bae3380e19d060113453f32bbab7e118627b40bcabf1711bcfeab8957de339436c7088bb883101539a09d3bef088fc1f840764036ffbb33decd12aac57fd26f84823e19553d4d67e000e9436ca323de099bc1ce75ebf5ddccb448cd7a2e4bbd6b32e3f2024f96cc5c7152b8be8ed0bd8e436d324d1ce1dd3cfcc452a28c73a95af8482aa772ae53d5be1292e39d1716b43758fe563c8aa3b74bba5c02d04778d91e3d43dcc72bb7c7b043c05c8745b705ee75b5a4ec7b95b654359fb5e853338219851d40a8afbb4f91ecbb41eb81534196cc0cc9d3eb714396caf045b231722d4486503640419988480a7815808be974287372cfc489965aac5b8095c637581eb910f9055cd1c0a0a3b0b33aca90f7c5b8e6ef683abf0ce53aeba51bec4fc7b427a2347360fca8636d3f1469284f269a9abf0cb1a244a15d6b40465e75cf89092474a8beda033391dd311c499519a08c4f034e71918d7cad41845327c89e7b1e94afb0723782ce5c553ef36791bba63de17d746491894012cebd87b1837a821ef5c624bbc84cc5035f5e70cd9f21b42219a2dce30e0e65c250d0d194d2b52486b03ee66332981a5225174db17e5a8bb4a10ed9c8a445c41442f3bcdb6b4f49e4e1dc87661a7b6e41f35f55dd67bd4cbc6ff58bfbffaffd2c382fcad0cae8f0df9af6acf0940007618a54aee31d932cbd8e8b41ca03821c428a0ef8e58d2435eecd503c54da9c1628f3c749b770519f53bf2d57ed712d075d37337b77a2b10a72d2d590c20d5cec2cacc6c3a8dc113e2d16ef2d1b390ed96e4036acd304e0c7cef9d431f88218aa1f83828dda636b94aa761c7317ecf116cbfc611e5ba6d94c50e994693023bdf2d248ed603f85be73a0008b75adef951dccfa30e42e9f5bb05023ade797506cbf90bb6dce43cf3a1c3141a5cc5fd9a4f3cc557b90e18049b3c130f461e4f32299fa1d1cf9c7f2ea2053565e8160a341cddf99acddd491697fa705124abdab42a5e8fcf048dd9f179384ec92a469aeb11e8bc62b69dbcfcec6681754757e4c5d0fdd9b9cfda49af09b83a5a4a10aed9a4cf7ddfa289209d475ab3318cd4b965e007dce1", "signed": "177455a71694f12b762fd17e08bdf010a7fc91d19141d7ae2399bd241a998a6a50a9722ac1232c59e4e2aaa828078b2b92f4a54cdf0efebba2c16dbeaf072203b365f476ac92e76012a7ffd8782af15a3f5ee147f603a367adf2f9724613e8765b037ac0eb1f673736e11363e352ed5ae9eb5a67125ed818900342ae93371c433b91f6021d4be2a052b0da43b3682e7f740ae801d0541057858eb0c9c28d98f03b45e128aaa342c6b602776792aa81241cad06f1338fa0c71757180f588c8301d91c27679b5021cd75d7f6171ee9f8d56e4377679812f6ec5ed46538caed500c1d15f5fc86eaf9ed9cf9a0606b22614faf676462134e3db3582332b483dfa54ca29a5eb0d6bae3380e19d060113453f32bbab7e118627b40bcabf1711bcfeab8957de339436c7088bb883101539a09d3bef088fc1f840764036ffbb33decd12aac57fd26f84823e19553d4d67e000e9436ca323de099bc1ce75ebf5ddccb448cd7a2e4bbd6b32e3f2024f96cc5c7152b8be8ed0bd8e436d324d1ce1dd3cfcc452a28c73a95af8482aa772ae53d5be1292e39d1716b43758fe563c8aa3b74bba5c02d04778d91e3d43dcc72bb7c7b043c05c8745b705ee75b5a4ec7b95b654359fb5e853338219851d40a8afbb4f91ecbb41eb81534196cc0cc9d3eb714396caf045b231722d4486503640419988480a7815808be974287372cfc489965aac5b8095c637581eb910f9055cd1c0a0a3b0b33aca90f7c5b8e6ef683abf0ce53aeba51bec4fc7b427a2347360fca8636d3f1469284f269a9abf0cb1a244a15d6b40465e75cf89092474a8beda033391dd311c499519a08c4f034e71918d7cad41845327c89e7b1e94afb0723782ce5c553ef36791bba63de17d746491894012cebd87b1837a821ef5c624bbc84cc5035f5e70cd9f21b42219a2dce30e0e65c250d0d194d2b52486b03ee66332981a5225174db17e5a8bb4a10ed9c8a445c41442f3bcdb6b4f49e4e1dc87661a7b6e41f35f55dd67bd4cbc6ff58bfbffaffd2c382fcad0cae8f0df9af6acf0940007618a54aee31d932cbd8e8b41ca03821c428a0ef8e58d2435eecd503c54da9c1628f3c749b770519f53bf2d57ed712d075d37337b77a2b10a72d2d590c20d5cec2cacc6c3a8dc113e2d16ef2d1b390ed96e4036acd304e0c7cef9d431f88218aa1f83828dda636b94aa761c7317ecf116cbfc611e5ba6d94c50e994693023bdf2d248ed603f85be73a0008b75adef951dccfa30e42e9f5bb05023ade797506cbf90bb6dce43cf3a1c3141a5cc5fd9a4f3cc557b90e18049b3c130f461e4f32299fa1d1cf9c7f2ea2053565e8160a341cddf99acddd491697fa705124abdab42a5e8fcf048dd9f179384ec92a469aeb11e8bc62b69dbcfcec6681754757e4c5d0fdd9b9cfda49af09b83a5a4a10aed9a4cf7ddfa289209d475ab3318cd4b965e007dce1", "signature": "177455a71694f12b762fd17e08bdf010a7fc91d19141d7ae2399bd241a998a6a50a9722ac1232c59e4e2aaa828078b2b92f4a54cdf0efebba2c16dbeaf072203" }, { "secret_key": "e55f220fff8079148b254189bb294174f8e2c575e57f39d4bac8165c5e56e769", "public_key": "7fd507d03fe1d6e3f911f059597b0e292ea096f5bc851852916bf1217cafdc6c", "message": "1e2ce8bf0ea7875df285b1dbd34bbe67307f2e8ac8bc142c3ba314c1642c65a2d62eb2c783f916283ca4ec3e536d3eeb65cfdcc0549ac4f6a45f539ac5df79a6d5768219739d0c9a0cdbb31242296c3312b7ed560043f536cd1de9a9c2b289641a1c2d84f9a68b7c03b8b8567e5dc7138c2cb967c628aa25b2eab434d4490b23507409717cde94da59dc1dc25c7be42a8aa02edcf4d995368e6ba0ee1f953600db98d22de0f8d257020e0a406ee1669bd527b9fe1c611f9be5a3d7528e8b6151670a8663d2ed1a58d3e369bb722a6302d7c172a19bdaf357eedb02279156e3b9034431a7d68a39528eb4023587573eb88f30f94e833e8a23b9d0ac7b5ca87824596bbb0a3d0ca1b16a6878fdf7e2cea34a6ffb95a9ff4e888a97593735b868da75d8707bbfdb1d93eb86a51e2d215f1dd9dcf78388729a3eb0f066ddc941e950c92127198bce63a54868d997029572ffa6f6fea1d3a69164c9996953dc8b6f9dad0635c9b081f55f983340f0814bf5470803090e7997f7ab796c2b15adaf4021d67cffaf6e1ef62867503945c21a329664e08a95a41582300da9bed208444ce6aa12b3f867795c6ee4c4c9257018627361293bd527821a29a339b404a2da4bd9944f877040798bb54abd2d76cbb18df4297f4ce3337f64d20580aa64bdecac376a6a4ff74d0144b2fe74cef82d50a5e6bdd799e55ff69662bac537adcb6881228cb63704500c143a4f4d1db28d4556bee604a399ffd206546597dee92252547f6c657f36841a87d565f6552716c25a21151477bee9ef961855fb1af2da8068f28ce9ff70d5252c7a63a2e14ded6b8977b1d7691a77ed2e57d22ff2e1fc4cdbceb5e805858d903896ea6707e48b345f60e2818b2fcec4dba48caea9efa38279fb83d5b0f46a45e42c41765d0171baacd8d6dda7991314b34e15fd36127c467d1de01c01a3a78a8c1b103bee17a7a0b7ac5576fdc226dd2459773146cf38261417ca19135dbda9bdbe54cd17aa7ddd38fdcac2aba396b365ceae98919f6c5177fc583f5bee3f48704914306aa19ee90e3fd0de5591c669ff35ab16fef38dee187bae1e5aaa566df10544b7d6d4eb00da7ebeb4ecdcc4d8e32b49cbbdc6e66640bdb0f72e05918a05c35d9bff7e0e88f241d7c6c8cb2fedccdf65560af0e7833efe34af790db63189022cfd71fc8acf88860127bd4fbf026bcbe360e33a8995e636d03bb86dfd0198ada959342d8e9c9ed93e23297da98d66a0d4fc965162733bc86541b95a6c9097cb55a973c6fac194e8f8a164274c479c510e62d8a035eb751181b502afb614d8c4467b5445c268dc3dd0abbd577004c0bc47b15fcb801b79359757b5ea89cf8cf77fc6d160e6cd73c4", "signed": "c1023a7068743ec4668f495eb7bd4db58129c11e58299ea87d6facd302bf296a98e298fdb48eddf9c44e79ae8641f734503bb83dc0b31f610df1d1e9d619a7051e2ce8bf0ea7875df285b1dbd34bbe67307f2e8ac8bc142c3ba314c1642c65a2d62eb2c783f916283ca4ec3e536d3eeb65cfdcc0549ac4f6a45f539ac5df79a6d5768219739d0c9a0cdbb31242296c3312b7ed560043f536cd1de9a9c2b289641a1c2d84f9a68b7c03b8b8567e5dc7138c2cb967c628aa25b2eab434d4490b23507409717cde94da59dc1dc25c7be42a8aa02edcf4d995368e6ba0ee1f953600db98d22de0f8d257020e0a406ee1669bd527b9fe1c611f9be5a3d7528e8b6151670a8663d2ed1a58d3e369bb722a6302d7c172a19bdaf357eedb02279156e3b9034431a7d68a39528eb4023587573eb88f30f94e833e8a23b9d0ac7b5ca87824596bbb0a3d0ca1b16a6878fdf7e2cea34a6ffb95a9ff4e888a97593735b868da75d8707bbfdb1d93eb86a51e2d215f1dd9dcf78388729a3eb0f066ddc941e950c92127198bce63a54868d997029572ffa6f6fea1d3a69164c9996953dc8b6f9dad0635c9b081f55f983340f0814bf5470803090e7997f7ab796c2b15adaf4021d67cffaf6e1ef62867503945c21a329664e08a95a41582300da9bed208444ce6aa12b3f867795c6ee4c4c9257018627361293bd527821a29a339b404a2da4bd9944f877040798bb54abd2d76cbb18df4297f4ce3337f64d20580aa64bdecac376a6a4ff74d0144b2fe74cef82d50a5e6bdd799e55ff69662bac537adcb6881228cb63704500c143a4f4d1db28d4556bee604a399ffd206546597dee92252547f6c657f36841a87d565f6552716c25a21151477bee9ef961855fb1af2da8068f28ce9ff70d5252c7a63a2e14ded6b8977b1d7691a77ed2e57d22ff2e1fc4cdbceb5e805858d903896ea6707e48b345f60e2818b2fcec4dba48caea9efa38279fb83d5b0f46a45e42c41765d0171baacd8d6dda7991314b34e15fd36127c467d1de01c01a3a78a8c1b103bee17a7a0b7ac5576fdc226dd2459773146cf38261417ca19135dbda9bdbe54cd17aa7ddd38fdcac2aba396b365ceae98919f6c5177fc583f5bee3f48704914306aa19ee90e3fd0de5591c669ff35ab16fef38dee187bae1e5aaa566df10544b7d6d4eb00da7ebeb4ecdcc4d8e32b49cbbdc6e66640bdb0f72e05918a05c35d9bff7e0e88f241d7c6c8cb2fedccdf65560af0e7833efe34af790db63189022cfd71fc8acf88860127bd4fbf026bcbe360e33a8995e636d03bb86dfd0198ada959342d8e9c9ed93e23297da98d66a0d4fc965162733bc86541b95a6c9097cb55a973c6fac194e8f8a164274c479c510e62d8a035eb751181b502afb614d8c4467b5445c268dc3dd0abbd577004c0bc47b15fcb801b79359757b5ea89cf8cf77fc6d160e6cd73c4", "signature": "c1023a7068743ec4668f495eb7bd4db58129c11e58299ea87d6facd302bf296a98e298fdb48eddf9c44e79ae8641f734503bb83dc0b31f610df1d1e9d619a705" }, { "secret_key": "d5e3a40671bd45f08842ddc78abe57de3b9ce5646b730d2e59fecf5a7df80f40", "public_key": "416c37ae1ad15b632b0ea43932c17637282cd91d5979552e5eebb99a419d5c97", "message": "09fe6ffa8bf0942a64921357659dbc6e4f8b63ca3b9ea475ea39d7925290a148d87bb155741dfa28ae1beadc1f3e1ab76737eb5d5ddaded0bb382d7e11ea81a5e7801612696260ba3bd09c80b623f636380aa0208fee0aff70812d5307b27183832343debaa3605ddad17ddd70d611400ddd10d638aa3d6c68a28cf0e97c1dedf6ccd9c731a84ff0405a3a22dcba00ab44d5b21844f14d1374ac0cb1e58df4a90c412563cfe69d882d350f6aafbfa64fa2f9ff826032326780aecf9305d8217c179dbb63c151541232eb65979265d876c4bc4305c02f40bc1d05dbaf7dcf4f7dd9232c17ee0f7a0555f504ba3774548488933e7571eb3f71c4cbb20cc4e4a7322f35ac0e79a59155798dd0f5b3c11319b7d8f3ea79ee3acc68bdb9f37c7d4c8f9caba1ebf8eb7f43b462aefd38e8c0d4c63979cf6631dec31ab5ced3937ef5b2362cb09c71dd096657700fd96bda555e22712f71aec11ae5e91b24bd1649498b8d9f867fb6c41e076080f740d074c2a25572d34e666b6367bf7cbb3dd42a2382dc1973961268605396810a456ac081bbfd3a54b44881fcfc45b4245ee72465b487d07f2ef3f74add71cdfdd16e92fe257d334645b0a9bc7d072613fb9c0cdea9db4c72bc87109e102d7cbaf366ecd67fbe3ded32747307a7aeef61735ad3aa5ce95deecc16a16eb2a0bcc7adc0a11d888032260e7c7ec9e54f5a2531702a7e5dfb87c36ce313a3147588aef962c72fa966d241637c388b83ddec9343bb86343e920b12ce1cc915c83b31e99862690674ea4935a48809d4d279054137546392ad9f08e7b8de61ae73e81e483d3c63b5ae734e18e7a22feed1233d0ca63355f3a48a33067e1a0e1971f36aa929fe0613c21c4aeff9418429c3b072a5984959287a5e5c40be02bd22b9a79c7f3f5359d2bbe493f556dacbb0cb4c293c7d941265e777392d148d68c07a13c8dec8e5d1e1c7f041e8983edddaa4649dac1572a39ae4c6480ca550e2e4462dcc849c1bab781d28a3552b2d98e02e1518e6555340fb76d68db58916d556a7b81563aba81d9a57ae50f04cf5686021847d79b6bb3da8017a60b1c3beefd48d2b3cd39c6f53c08bcc967d93069f562bb36e0c4f4ca6bccc5e57d35903cd800a61785a93770e377f4fe8e9f4b66680984968f9649e105e7a119d97636f3a05caeab1d7ea0bc81334b42d5cc080830ec24d369cf8673a490d59eb4cb08181da39a46d966e23fed8d38a5fabc7e843bcfb015a4474bfd46d4a43ff4a51a9567661e2696db87c3758d3b54ce7846d1391d7f46526ef30844d49320018d749b5d4dfd30d380c6e573fc414d8fefc5d710470756bec00d88ac4afc925d1ede37eaee6004a23ea0ef8b60e48", "signed": "63de6a981142365a3e592631c8277237809739d1c98f5a1cb2cccd34067d1ca5dc8f2fc63b8ae1a689dcaa291ba6b69b1a6795c579a5db6dccee73f6a420ac0a09fe6ffa8bf0942a64921357659dbc6e4f8b63ca3b9ea475ea39d7925290a148d87bb155741dfa28ae1beadc1f3e1ab76737eb5d5ddaded0bb382d7e11ea81a5e7801612696260ba3bd09c80b623f636380aa0208fee0aff70812d5307b27183832343debaa3605ddad17ddd70d611400ddd10d638aa3d6c68a28cf0e97c1dedf6ccd9c731a84ff0405a3a22dcba00ab44d5b21844f14d1374ac0cb1e58df4a90c412563cfe69d882d350f6aafbfa64fa2f9ff826032326780aecf9305d8217c179dbb63c151541232eb65979265d876c4bc4305c02f40bc1d05dbaf7dcf4f7dd9232c17ee0f7a0555f504ba3774548488933e7571eb3f71c4cbb20cc4e4a7322f35ac0e79a59155798dd0f5b3c11319b7d8f3ea79ee3acc68bdb9f37c7d4c8f9caba1ebf8eb7f43b462aefd38e8c0d4c63979cf6631dec31ab5ced3937ef5b2362cb09c71dd096657700fd96bda555e22712f71aec11ae5e91b24bd1649498b8d9f867fb6c41e076080f740d074c2a25572d34e666b6367bf7cbb3dd42a2382dc1973961268605396810a456ac081bbfd3a54b44881fcfc45b4245ee72465b487d07f2ef3f74add71cdfdd16e92fe257d334645b0a9bc7d072613fb9c0cdea9db4c72bc87109e102d7cbaf366ecd67fbe3ded32747307a7aeef61735ad3aa5ce95deecc16a16eb2a0bcc7adc0a11d888032260e7c7ec9e54f5a2531702a7e5dfb87c36ce313a3147588aef962c72fa966d241637c388b83ddec9343bb86343e920b12ce1cc915c83b31e99862690674ea4935a48809d4d279054137546392ad9f08e7b8de61ae73e81e483d3c63b5ae734e18e7a22feed1233d0ca63355f3a48a33067e1a0e1971f36aa929fe0613c21c4aeff9418429c3b072a5984959287a5e5c40be02bd22b9a79c7f3f5359d2bbe493f556dacbb0cb4c293c7d941265e777392d148d68c07a13c8dec8e5d1e1c7f041e8983edddaa4649dac1572a39ae4c6480ca550e2e4462dcc849c1bab781d28a3552b2d98e02e1518e6555340fb76d68db58916d556a7b81563aba81d9a57ae50f04cf5686021847d79b6bb3da8017a60b1c3beefd48d2b3cd39c6f53c08bcc967d93069f562bb36e0c4f4ca6bccc5e57d35903cd800a61785a93770e377f4fe8e9f4b66680984968f9649e105e7a119d97636f3a05caeab1d7ea0bc81334b42d5cc080830ec24d369cf8673a490d59eb4cb08181da39a46d966e23fed8d38a5fabc7e843bcfb015a4474bfd46d4a43ff4a51a9567661e2696db87c3758d3b54ce7846d1391d7f46526ef30844d49320018d749b5d4dfd30d380c6e573fc414d8fefc5d710470756bec00d88ac4afc925d1ede37eaee6004a23ea0ef8b60e48", "signature": "63de6a981142365a3e592631c8277237809739d1c98f5a1cb2cccd34067d1ca5dc8f2fc63b8ae1a689dcaa291ba6b69b1a6795c579a5db6dccee73f6a420ac0a" }, { "secret_key": "4ed7048aa1284dbbcc248938b40c35742193597addafdde06413b8d4ccfbe137", "public_key": "bf841fe444add1f7c3eacdfd0784b4e855d2405f4021cd9d8266071c32c8a273", "message": "dcff9587d6046c1132be07df26df6382ff92cfc8eb5345c51dd50dd188ee769f10a4de5e8883d116967bea97d3b32bc8aebb9f013d6df952f251c1a312346e72cee135a1bfd76bf3080a35c838b44d755f263d210310fa8d28c4ca52f08cac5b83a8a3b1dfc46d9b752d9fc73649d00bb9ee992650639c225deac1f39b9e803689d19e6d9f8ef4f51f1d11601facf410db648bcc82bf648769a7dd59c6e8a237db239d3f661d7852c426d394a90509526a859b476459dedbe6d89936c0f3989995511d4a576e542cce5e0dd7eeefeb0326d33f25c22ab6e7690633f4c9ed2aadf1d24f94862123a464042cea193a2f0479d39bcd1bbd1c7a0ca7e6258ed3732372f54e0ed5e3f1e2e4d4a04c510bee08d1c6d570cfd63abf14b4eef0b96f39ca29e43c52f2ca3dfd460f66e30235b159aaef2cc156012969fd3d159978d6caa0a94522291f7989d8af10831996137b68d97fc17f6a9bc2845ef3dd47cbc386e8977a8654363412dac3ac51c63817b7c051878dcf458ab3630dd7aef68d270f8da7880a467b3304f5baedfba9173e7efd007c412d17209c56d23968e340b8a0edb41b7e2a4088bec01b532df89b5215813131107b7b474f03c2e47d4317f11c4f5160904304997e76a121a9560235208d79b2dab4f7e196793202c0902ce9c4bfc10b8fe397e35ca0256454662ae878efb0a0a606fac0a952c9f6baaeb2d45b258c617559c0ed2528a88b49aa44ee43035b0d793aad3953c1a5a3463866bc815b1ffce2ff2b65e0fd47dbc15f4e7a06bfabc290fc62090bf7d94853f77c0444a9b90efe77d1ceb4bd39e203bc884011624e6846e2a371058daba63c23f86c42c3e31eaa4bd7d7a42af2d524896e31baa3e20763f85dcfd52775f28072d89f0bd4fae30d0b137ee37ab063ba06fe9d4ec62abb2fea0f81b8cbeefc030080b8026a58fd1867f66be1154e65bfea7dcec55fe32d51fb0b4a8a5a8a044263943d6ac8011c6e6701beec3a88655840c4892d450d312b7652d2514769f23bfd6e7046467df29a287ff3c4c9d0e64e6d9e4edee1b935d07681d47004352886e847b0c6d5762fd45a81a53cce9476c887221aea6c0c82bbf3b297932e5b11e538a3245d63d7b7b091dfa1d7b9a0e2db6698a4c5e9fe931662d7c6ec6d9d5b92bc7e041555df4df0ca11cabc485f9c556138a71745f03b9783bb200b72d233697e8bcf6b4117ee6763d792d7422264852f4f30f8d1890e2ea08098040f7f288e4abe90b63cab2c14373060840ef827ecc846cd560e90a20b8305f463c36ea03884a5df4c25f1ba9ea125952dc091b97516de1d287c0e2bf529775ba6d2f8ede03cb42c1e400ec804a9df08e46f44b5066346e3f7c7a1a8", "signed": "106a9deb2327f338ccb71bcc94e2fe3d2e973ce6dd8fa7baca808b4111813e3bc3b4d88efa6a00c4710bbfe53196f9ab3a150b1654b908feacf9c13df2d63802dcff9587d6046c1132be07df26df6382ff92cfc8eb5345c51dd50dd188ee769f10a4de5e8883d116967bea97d3b32bc8aebb9f013d6df952f251c1a312346e72cee135a1bfd76bf3080a35c838b44d755f263d210310fa8d28c4ca52f08cac5b83a8a3b1dfc46d9b752d9fc73649d00bb9ee992650639c225deac1f39b9e803689d19e6d9f8ef4f51f1d11601facf410db648bcc82bf648769a7dd59c6e8a237db239d3f661d7852c426d394a90509526a859b476459dedbe6d89936c0f3989995511d4a576e542cce5e0dd7eeefeb0326d33f25c22ab6e7690633f4c9ed2aadf1d24f94862123a464042cea193a2f0479d39bcd1bbd1c7a0ca7e6258ed3732372f54e0ed5e3f1e2e4d4a04c510bee08d1c6d570cfd63abf14b4eef0b96f39ca29e43c52f2ca3dfd460f66e30235b159aaef2cc156012969fd3d159978d6caa0a94522291f7989d8af10831996137b68d97fc17f6a9bc2845ef3dd47cbc386e8977a8654363412dac3ac51c63817b7c051878dcf458ab3630dd7aef68d270f8da7880a467b3304f5baedfba9173e7efd007c412d17209c56d23968e340b8a0edb41b7e2a4088bec01b532df89b5215813131107b7b474f03c2e47d4317f11c4f5160904304997e76a121a9560235208d79b2dab4f7e196793202c0902ce9c4bfc10b8fe397e35ca0256454662ae878efb0a0a606fac0a952c9f6baaeb2d45b258c617559c0ed2528a88b49aa44ee43035b0d793aad3953c1a5a3463866bc815b1ffce2ff2b65e0fd47dbc15f4e7a06bfabc290fc62090bf7d94853f77c0444a9b90efe77d1ceb4bd39e203bc884011624e6846e2a371058daba63c23f86c42c3e31eaa4bd7d7a42af2d524896e31baa3e20763f85dcfd52775f28072d89f0bd4fae30d0b137ee37ab063ba06fe9d4ec62abb2fea0f81b8cbeefc030080b8026a58fd1867f66be1154e65bfea7dcec55fe32d51fb0b4a8a5a8a044263943d6ac8011c6e6701beec3a88655840c4892d450d312b7652d2514769f23bfd6e7046467df29a287ff3c4c9d0e64e6d9e4edee1b935d07681d47004352886e847b0c6d5762fd45a81a53cce9476c887221aea6c0c82bbf3b297932e5b11e538a3245d63d7b7b091dfa1d7b9a0e2db6698a4c5e9fe931662d7c6ec6d9d5b92bc7e041555df4df0ca11cabc485f9c556138a71745f03b9783bb200b72d233697e8bcf6b4117ee6763d792d7422264852f4f30f8d1890e2ea08098040f7f288e4abe90b63cab2c14373060840ef827ecc846cd560e90a20b8305f463c36ea03884a5df4c25f1ba9ea125952dc091b97516de1d287c0e2bf529775ba6d2f8ede03cb42c1e400ec804a9df08e46f44b5066346e3f7c7a1a8", "signature": "106a9deb2327f338ccb71bcc94e2fe3d2e973ce6dd8fa7baca808b4111813e3bc3b4d88efa6a00c4710bbfe53196f9ab3a150b1654b908feacf9c13df2d63802" }, { "secret_key": "c7eca83e948576bd9f278fd7b82800a41d92da9b72d5a1ccdbbc65581052568b", "public_key": "076b8352dca8031e853c8d9099c2ef579337cc7b2b4c75d1a063ea3ec725b7fd", "message": "8d8cefd673855ccd8eb8534c312d338005bb05f5b9507d58859e1e953b0a4d913be759d8edfa92898c6e70a53f81954fc344b4ad6246b0109481ba6f73ae6331abf2df108eb2e85ceb087c1f6fcfc9de2c1f139ba1771b72680302d811ccd0ccd4e0c7feb0132eb20b334e5aabe5f6119fd8947d9e8852e1eb1b74107e174100e3e6df0c3a68130ca6309402594bb50c1c8e2774f13214496a7b1f348385eabfbccbac165a5a2e7d9dea5ffd58b0bd88b49cb331ecb7f4e9d6bae9791ad788e6ab8926c1cc1615deaf4cc400c77a316197bca1904995e1365d1b9702648376116930f6f91166e6148629e75be2d06895f6a8d15d5a94ca69b712f33bcf95be0c1be6902bb78b8a230d7a8560c4d84e2389552a81571aa665c19c2e93b0d43e8c2cbd9e885d7052518b77c47e841d119dc28b65a7504f664271f06c7ff393f825b1e5930d02b9c70035e292411c4aedf66047006970e349dfca7fb41c10fd537e35252e109e3336d7a82a14de5d5540c6fc6571d5774f39b7c403e7b8875ec215877efc6cc8ea48b186b46821ea5ef2ba8bacd40d797e6add06413283145b60462b3503c5b881d79a592955d18afa08969e31457f5b27daec010338ed867f300878fd87ce321880b860a0c64284ca2dc15f5e5310e10e6a73a7ea650ea9d373694da4dd429ae7412ef9b29c83b3b068c74769f431ce0615f9ff4f82baac47b4bce90449ec41c2a2d573d92b92e05631486165bc710ef5840f80dae9f9dd5cffd4ebf5d10746510c5fcbfe62cb9703c0b154c86f10816672497670a3b0150bb4e1b03b3bd544c12a90c3edccd7900ebb5b31c91117cc8281a3c4ed04998e99aed41bb41fce9990a406485b14dbe3bc1a5fcf7719507990da3b0b3c68ad40d8950c0d49ced1019319a3f36aff6caf75d7f9a0933dd3abdd7692a1562f0613fe4a278d5ce4c8dafbb55b2ec2af2b24e8396f587b170c9ca6547508facde73490dfb01eb6657e3f4f272304b70bf047a43a2b58e5568bc52b2c8d4c03219a5a8bd3dc0643185913c0af7411f81b77be2a9bfd5cb26977113d2658a97192b41cf6c7011b0ff6a11cbff3505546322f0bef6097e46b36492b016a4562e092b67c3fccc7780ea274d96d595849f7e2a56d79edcb32d784049fc1324a5beefc24193a66e1cac4a13a811b909583cc910cf08d4b104dbdb8a6f2b21fbc1db1175a1a2356a63d3eea9dbb8537d2c68627543df0d1f8fd8d57a18b0dbd69b920cb9b286e3c07ae44ae2e1beec01cee6ba988b5d1afb99790b1dd910655c43d7f2a3ed3754ba46516d278705559f5741622a9abb5c8f23fa976a9d146948ade6ba6608a35e4e0d330e82e96a2be6c78ad0cd4d8704e57cea146", "signed": "86996a1b8e495d425277e97cc0830549349bc2b6f3dcda60f3b7d3501b8b50b5b458cda58b436e23c02cd4a22b234813aa9bcc3c61f983c0b7efeca0f1bec20d8d8cefd673855ccd8eb8534c312d338005bb05f5b9507d58859e1e953b0a4d913be759d8edfa92898c6e70a53f81954fc344b4ad6246b0109481ba6f73ae6331abf2df108eb2e85ceb087c1f6fcfc9de2c1f139ba1771b72680302d811ccd0ccd4e0c7feb0132eb20b334e5aabe5f6119fd8947d9e8852e1eb1b74107e174100e3e6df0c3a68130ca6309402594bb50c1c8e2774f13214496a7b1f348385eabfbccbac165a5a2e7d9dea5ffd58b0bd88b49cb331ecb7f4e9d6bae9791ad788e6ab8926c1cc1615deaf4cc400c77a316197bca1904995e1365d1b9702648376116930f6f91166e6148629e75be2d06895f6a8d15d5a94ca69b712f33bcf95be0c1be6902bb78b8a230d7a8560c4d84e2389552a81571aa665c19c2e93b0d43e8c2cbd9e885d7052518b77c47e841d119dc28b65a7504f664271f06c7ff393f825b1e5930d02b9c70035e292411c4aedf66047006970e349dfca7fb41c10fd537e35252e109e3336d7a82a14de5d5540c6fc6571d5774f39b7c403e7b8875ec215877efc6cc8ea48b186b46821ea5ef2ba8bacd40d797e6add06413283145b60462b3503c5b881d79a592955d18afa08969e31457f5b27daec010338ed867f300878fd87ce321880b860a0c64284ca2dc15f5e5310e10e6a73a7ea650ea9d373694da4dd429ae7412ef9b29c83b3b068c74769f431ce0615f9ff4f82baac47b4bce90449ec41c2a2d573d92b92e05631486165bc710ef5840f80dae9f9dd5cffd4ebf5d10746510c5fcbfe62cb9703c0b154c86f10816672497670a3b0150bb4e1b03b3bd544c12a90c3edccd7900ebb5b31c91117cc8281a3c4ed04998e99aed41bb41fce9990a406485b14dbe3bc1a5fcf7719507990da3b0b3c68ad40d8950c0d49ced1019319a3f36aff6caf75d7f9a0933dd3abdd7692a1562f0613fe4a278d5ce4c8dafbb55b2ec2af2b24e8396f587b170c9ca6547508facde73490dfb01eb6657e3f4f272304b70bf047a43a2b58e5568bc52b2c8d4c03219a5a8bd3dc0643185913c0af7411f81b77be2a9bfd5cb26977113d2658a97192b41cf6c7011b0ff6a11cbff3505546322f0bef6097e46b36492b016a4562e092b67c3fccc7780ea274d96d595849f7e2a56d79edcb32d784049fc1324a5beefc24193a66e1cac4a13a811b909583cc910cf08d4b104dbdb8a6f2b21fbc1db1175a1a2356a63d3eea9dbb8537d2c68627543df0d1f8fd8d57a18b0dbd69b920cb9b286e3c07ae44ae2e1beec01cee6ba988b5d1afb99790b1dd910655c43d7f2a3ed3754ba46516d278705559f5741622a9abb5c8f23fa976a9d146948ade6ba6608a35e4e0d330e82e96a2be6c78ad0cd4d8704e57cea146", "signature": "86996a1b8e495d425277e97cc0830549349bc2b6f3dcda60f3b7d3501b8b50b5b458cda58b436e23c02cd4a22b234813aa9bcc3c61f983c0b7efeca0f1bec20d" }, { "secret_key": "7b469df9c8f78489ab47cc70a88503f1b8f3d929c33feab1c503f0969a3ac37b", "public_key": "a814c7e373d0113b90624a8ab2bca5cf53bf528e39fc3d367de154b94bb22f1d", "message": "1c0fd7450e29675c93091638c2ac933ca997766e380ec33a92b8a7e1a1ed9821c75fccb5c5f3760e76d0e8810311ddc624ea8742131c1c4308f4178e04d04960693d846c1f51d8773b6deb3443d874b9e2de3b77785185518b2e9ee736c63a39c8212ca8669e161d131b1ab2264fdd72dc5628b11c06f2af9f0789047bdd4ebb5d55899f74dc4e12e7975363f63a8da76b5585c16bb6d55b05fade8713d19cad1a211640262691aac9b437a9ecf89a9246ecdba1ff0bea78494cee15296216ea6bb882479d2437c9494ac7fa4f3015d1d3149d5564d7c11a7e7b614f7d3e9d454f0a05b040a1e06fe7837c2a9da2794d918bffa9e61a0c3f089f6c9f7eeac586e34bf94470d913da41371cacdfc7ee8bd1135655566924eadf096ac030a65902c103b172d12e88f053fc56ee73f31870817083afa802f7668b815ee790f7d40b437a2e6db2f0fb26836b4b2331eba55539614c0fe17240242dd3af7383bcff7d3f47d6544b08720c0a52441f7411935dd4a952d38651a80005fa3eb0eaecc735d290e8bd5e31b740140e136b2c002523d8eb2a0ab5bd687002b3b926f75eb690d1da73ad235892f3b23a756b605a437c00e0621304e810f99e314c4d63e322d9b69815f382ffa1ec6280fc0e641c8a6f6f7f61985bd3567e0f440de9f7621715dacd07428c0090154d59ce6db40169c658ac5bf44b67671fe19e4b5b38aad2d3d4e190a550aad4188352f7981a6d88062502df86791350392d41cefacb24e37bc700cb029190c3b1821477e117d5a462fb3e79133b1073598966f52b63256dbf326ace14db0c80058cf00d689a0a58111af1692744bf791bcbb427a372246e9501a85cd520c61a1e59ee180e8c97192f60fa5d3ab05df8d8551c1ac6ca0a9a012ffeceb3c1f521411edb6509bc278a651e129e96b0adc7aed707221caeac229884413daa10595d22d1db7082125f4f969500a1d48dacdae80f4029c163dcd79ddc6468fcda1637b87ddcf2a3d9b4d299a0e5394df90ed03b62137ba67b9fea8ae1f0d22f91c63a24b5934f74c265c43f1b923db980adfcee8313da520176730ef9736b27e6ba32d17ea69dcac6f4a016edfe2db5a5bb3b64932f7011f1c453bbe88bbac8c7035f93fe39b581fcaa7aaf082fbed004fd1fd5a4e2d9c19716604b19ce199e2169a7be518d5fadd2ac31b95478082ac91306008de4ec0ef4c9f9d6f96d2f66d62fafc2194082808af0d67b9fba0d189b055f061ccac24b27610bfbd5a2232dd6f3c890a9b1266471b322e9e1bf97757bef72abcee93b051fc923cfd4e723be3e17143f38eebb900b5bbcf7304732b9c0a1c5fc9509a693580ae73a4cdfc5fbf20ce81ebc835c6c909d831141b194f6", "signed": "18faf82d08e1068e9f983d812f05fdb6929d2723db1f77c45a74bb09cff27773b54ce8f43b3015419112e725ea7acda4b23b8120e7b0cf420153e5b03dd061091c0fd7450e29675c93091638c2ac933ca997766e380ec33a92b8a7e1a1ed9821c75fccb5c5f3760e76d0e8810311ddc624ea8742131c1c4308f4178e04d04960693d846c1f51d8773b6deb3443d874b9e2de3b77785185518b2e9ee736c63a39c8212ca8669e161d131b1ab2264fdd72dc5628b11c06f2af9f0789047bdd4ebb5d55899f74dc4e12e7975363f63a8da76b5585c16bb6d55b05fade8713d19cad1a211640262691aac9b437a9ecf89a9246ecdba1ff0bea78494cee15296216ea6bb882479d2437c9494ac7fa4f3015d1d3149d5564d7c11a7e7b614f7d3e9d454f0a05b040a1e06fe7837c2a9da2794d918bffa9e61a0c3f089f6c9f7eeac586e34bf94470d913da41371cacdfc7ee8bd1135655566924eadf096ac030a65902c103b172d12e88f053fc56ee73f31870817083afa802f7668b815ee790f7d40b437a2e6db2f0fb26836b4b2331eba55539614c0fe17240242dd3af7383bcff7d3f47d6544b08720c0a52441f7411935dd4a952d38651a80005fa3eb0eaecc735d290e8bd5e31b740140e136b2c002523d8eb2a0ab5bd687002b3b926f75eb690d1da73ad235892f3b23a756b605a437c00e0621304e810f99e314c4d63e322d9b69815f382ffa1ec6280fc0e641c8a6f6f7f61985bd3567e0f440de9f7621715dacd07428c0090154d59ce6db40169c658ac5bf44b67671fe19e4b5b38aad2d3d4e190a550aad4188352f7981a6d88062502df86791350392d41cefacb24e37bc700cb029190c3b1821477e117d5a462fb3e79133b1073598966f52b63256dbf326ace14db0c80058cf00d689a0a58111af1692744bf791bcbb427a372246e9501a85cd520c61a1e59ee180e8c97192f60fa5d3ab05df8d8551c1ac6ca0a9a012ffeceb3c1f521411edb6509bc278a651e129e96b0adc7aed707221caeac229884413daa10595d22d1db7082125f4f969500a1d48dacdae80f4029c163dcd79ddc6468fcda1637b87ddcf2a3d9b4d299a0e5394df90ed03b62137ba67b9fea8ae1f0d22f91c63a24b5934f74c265c43f1b923db980adfcee8313da520176730ef9736b27e6ba32d17ea69dcac6f4a016edfe2db5a5bb3b64932f7011f1c453bbe88bbac8c7035f93fe39b581fcaa7aaf082fbed004fd1fd5a4e2d9c19716604b19ce199e2169a7be518d5fadd2ac31b95478082ac91306008de4ec0ef4c9f9d6f96d2f66d62fafc2194082808af0d67b9fba0d189b055f061ccac24b27610bfbd5a2232dd6f3c890a9b1266471b322e9e1bf97757bef72abcee93b051fc923cfd4e723be3e17143f38eebb900b5bbcf7304732b9c0a1c5fc9509a693580ae73a4cdfc5fbf20ce81ebc835c6c909d831141b194f6", "signature": "18faf82d08e1068e9f983d812f05fdb6929d2723db1f77c45a74bb09cff27773b54ce8f43b3015419112e725ea7acda4b23b8120e7b0cf420153e5b03dd06109" }, { "secret_key": "dfecde7a56a18c1f19d80a19a4f1daddd0bcecb01eecad6dfca0f957a914ed7a", "public_key": "afbaa6e73e85b02b25a4b587ecb8c4dfb79aa9202761efa8d1df2cd0aa6316c4", "message": "ae6e8ff65ccde6f26484950826b43623058a5efe020bb19b7d8b4e25768b692734fe07c913b9e88126becbf14a0fd0205b39fcc2aec373f8c184c6a9bbbb84449a7ca3b920ada08801dfc66ff19aeb92f2555399a430277ae22d23754eaace3c73846797536dd71a56f4b5842c0f410d1989acac5d805d26572c0f3a64dd2071662212d52fe99e59d966047777f9030fa4fd2ee74b7a7c9f7c34a6dc7e03593a13d64ce62453ee3ca30d84672839f19f1c15d0c45d2755bb394acf4dcb7f7f0711ac40ea46612ea37a7607ad32e818265fab1933f5094e2d03bcfaa5f61667f3b37f00c4c58d9b41b9af3900482b0ffb4fa4376aa040009dec2f4525799cb005f39d74cb2d8dce8c20c2c3f5409703af156cfba28a9d916439cb29f83d2429ce6223519e75e15c7c7fa215119e073fa7974db14f7a01093faa94ad52ab1eadce1a89366ca13adb89066438a2beb73034170aa42d9c2ddb97c14a17c3094376d2a3ffd8095fc4053d91d16e06d27693a1310f01a75111cfeda892c3972a133a09addaa8f74145f88681b6d277964bfe38551a2c619fa3cae394acb29c9410b45e101b1740e8b2aa6febc3a45dadb9d9589d597e57cd947b684cc355246ce6c326dd98cf92b6eea3ba5ab03700622636324dc1222cd748fa07bfd39a1e069809e567141a613e2e8be9dd398ab6beaafd85ff3628ee2aa32d0a57bbacf956190b5c4242eb5b8587d2fdcb0741b9416a05f5fecb1fb2d64788dce783c1f63e60641fce5e1d2b18a9500cd6a1fd335cc1db46ef04752b2d22072e6dfcfcfa569bb25e457afeb63a4fbedc293ad9d1aba4e394aa1097e12b0fc90c89f76df0d6441fa99808b60be07dfcc7f9010bbf9033556d5ee2d448937b783493920f681e4da708671097e199481b8ef0e0150d7c2851df44c545122f9b0e5ba2eeff2d988d56d9bbb55d9896111151a436af065e0cad178a2c9fa8f6974ecdf09adf013300cffedaf4b8791b467ba7933ada5d632db44ed6dcf2aa648917be6337d2e2d206856d08f9ee7b5e2f14ddc6d3ac429215a87923ad32d5dcfee3686316ddd1b27bb193a5fc05c893a939a5b98987366c829e392f485ea15e22cd8f857a134afa98f37215576ddc5aab4f2d10caaf050059a335f24bcdcbac819f66db07aabdfb76271d17bce22cba463a80aa892d0d8e055f948df7f6e6c300daeffd3a236dddcf238fe10666a57c6e3ae7e3673d35578f8b8ea69d3c08e0140afd3ee030b22a372160f908a378f8101b5f5969fea310eed37a00d97302d5c2dbe8cc600075dccd33ad63d265aaf60e241ce311bed7dd5e2745241ae02ae532d15c18886e818138751afc51850e506c6d31a8eef451adfd4b3d266b415a7e", "signed": "b4fde55b916cf60068f19b25351c1410dcf66bfc40f96d1ba2368bc2b9115aaa5b2d1cf0e3dfca02ac902a943e2489a5681bbafed39c6e33211a9cb2ff6e5409ae6e8ff65ccde6f26484950826b43623058a5efe020bb19b7d8b4e25768b692734fe07c913b9e88126becbf14a0fd0205b39fcc2aec373f8c184c6a9bbbb84449a7ca3b920ada08801dfc66ff19aeb92f2555399a430277ae22d23754eaace3c73846797536dd71a56f4b5842c0f410d1989acac5d805d26572c0f3a64dd2071662212d52fe99e59d966047777f9030fa4fd2ee74b7a7c9f7c34a6dc7e03593a13d64ce62453ee3ca30d84672839f19f1c15d0c45d2755bb394acf4dcb7f7f0711ac40ea46612ea37a7607ad32e818265fab1933f5094e2d03bcfaa5f61667f3b37f00c4c58d9b41b9af3900482b0ffb4fa4376aa040009dec2f4525799cb005f39d74cb2d8dce8c20c2c3f5409703af156cfba28a9d916439cb29f83d2429ce6223519e75e15c7c7fa215119e073fa7974db14f7a01093faa94ad52ab1eadce1a89366ca13adb89066438a2beb73034170aa42d9c2ddb97c14a17c3094376d2a3ffd8095fc4053d91d16e06d27693a1310f01a75111cfeda892c3972a133a09addaa8f74145f88681b6d277964bfe38551a2c619fa3cae394acb29c9410b45e101b1740e8b2aa6febc3a45dadb9d9589d597e57cd947b684cc355246ce6c326dd98cf92b6eea3ba5ab03700622636324dc1222cd748fa07bfd39a1e069809e567141a613e2e8be9dd398ab6beaafd85ff3628ee2aa32d0a57bbacf956190b5c4242eb5b8587d2fdcb0741b9416a05f5fecb1fb2d64788dce783c1f63e60641fce5e1d2b18a9500cd6a1fd335cc1db46ef04752b2d22072e6dfcfcfa569bb25e457afeb63a4fbedc293ad9d1aba4e394aa1097e12b0fc90c89f76df0d6441fa99808b60be07dfcc7f9010bbf9033556d5ee2d448937b783493920f681e4da708671097e199481b8ef0e0150d7c2851df44c545122f9b0e5ba2eeff2d988d56d9bbb55d9896111151a436af065e0cad178a2c9fa8f6974ecdf09adf013300cffedaf4b8791b467ba7933ada5d632db44ed6dcf2aa648917be6337d2e2d206856d08f9ee7b5e2f14ddc6d3ac429215a87923ad32d5dcfee3686316ddd1b27bb193a5fc05c893a939a5b98987366c829e392f485ea15e22cd8f857a134afa98f37215576ddc5aab4f2d10caaf050059a335f24bcdcbac819f66db07aabdfb76271d17bce22cba463a80aa892d0d8e055f948df7f6e6c300daeffd3a236dddcf238fe10666a57c6e3ae7e3673d35578f8b8ea69d3c08e0140afd3ee030b22a372160f908a378f8101b5f5969fea310eed37a00d97302d5c2dbe8cc600075dccd33ad63d265aaf60e241ce311bed7dd5e2745241ae02ae532d15c18886e818138751afc51850e506c6d31a8eef451adfd4b3d266b415a7e", "signature": "b4fde55b916cf60068f19b25351c1410dcf66bfc40f96d1ba2368bc2b9115aaa5b2d1cf0e3dfca02ac902a943e2489a5681bbafed39c6e33211a9cb2ff6e5409" }, { "secret_key": "07828c580ebf9e1d825a59c3bf35f072ae123355bdcc249eec7f2fc5755e29b5", "public_key": "58e5ed85100bbd9b2221afc9c93184330ad59e1385606244bf003b8d2018501b", "message": "0edad5cae6ed9843e91c50d934cf55dd658f3d252039cd6c75be4f6b866fb75f35c8f98f1721d7e6d9d98a22e0b4934dcc129261bf6723b2fa7a995e35c4bd79c5816a321607d9dcce39fefa1d55de4e7617548ec385c3de01e366bf50c457a555e932070e2a5a0197b79efbe7006f0cec78b60ebb8fa8781d8eb7326edc30e62d3297a1e0a1117108c46ee5dbefc6594289335e780d55a084f552da3f36d3c4c6178ba74d4decefc5a3b8c47c16f534bdb60895d3d54cd2bb266b399e4d4fb48d7a8cde17f42412560737d3c06e29df524d0cbd3093efca1c8fedcaa124abb27abdac6a29e0e8246abd6f5f531950037f76323aa56cc3fefa603041d55f1929e277e72cda1f96541d2af3e90c0f0e28be196d8f6921f3cd57a7926b860aa1bc403576892a96b93190ae383f631b72802658b2e8451d52a2f45db4f8bc3b0e4e50b6d603a5bdd30c234200ad7debb963f58a4fa20330b3696449445aa371824842fbf326d901dfe3be045452a3740dd160e72733f6e2733525a29a865f6f50d53bf7191c599c876f5c9ca1e3fad7960648e0d471f7d5c01c673f42d659bc3d98dbf07d8febfb995d17f9a02cd6c39f2ddcd0f1d222b9e11f2dd7d3c7518224bb6bfb8b7c58fe8ac105405903a1b9da7516715b7afc38a555e6bbcdbad46e34e576fea34ce35734ed20af5d88eeb1047a2660648bbb113ad9db8c53edb6ed9871a1e44c9ed2df5656fb2b2806ecf03b1eca9eab50a6eaab55b933b2dd1f21d450de9d5cb2232f07a392081b0b4b885d54789e2f75bf2c4cdad878989b1d6dabd9ed23c7c5b0356a7d9e7335290d7c85b966e80184bd07998602886d7076193565c81cccda4cc7d33c85d905b1beb6e8e7418e8acaedf0d9a32a7d29d07cf44d3119d4e7896820b77de64b655e4f148800434af7bdb2a56b25eb94ea39f2169596bb2b11761f082baec08885f4a0eb6c95767135a7f7cd72e743d2dff144dd8bafb1b318006e5876f8e2cb44aa588f906266ac67119c17f5de114e72e42a1fb39944321a111fa795ff7017f2fb8caf482f55d77a80855428ded7ec20acecca83f8d1eb137b588ccb745c105f2b2ca41c3a9f49d3c6e9d7c648b003b9707c906462edad617a8cfbf9bcc6c5fb6fa984325d6582e28f62005383f338df5b38fa9d19c22a2a7ea1d68a92d1d93b7fb0b8f33bc8760f28aeb1439a8b07f3da58ddb155b498cb09c75a5596838a65013e24d5640d0842a7699322cf3ffcb5703f414ffd168860bad3e308b2b5bf3cdf7f363bf9aaf4b3bc424c146c6f5421430f9f476aa34a0c6ee80131fc4d4d970723a2186ae3625e286d17dddc435ccb00831678aba584a62dbff002bead6e11e23c54d33cf3a4b231a908", "signed": "bb09360439a82dee5c7d85779e54c13f88e06d38f4b94960fe17a1ebcaa3ee2f330c649154bbc875a4076cf0bbf7eebf7b8d08d5aa4be7413881245fc2d2b6010edad5cae6ed9843e91c50d934cf55dd658f3d252039cd6c75be4f6b866fb75f35c8f98f1721d7e6d9d98a22e0b4934dcc129261bf6723b2fa7a995e35c4bd79c5816a321607d9dcce39fefa1d55de4e7617548ec385c3de01e366bf50c457a555e932070e2a5a0197b79efbe7006f0cec78b60ebb8fa8781d8eb7326edc30e62d3297a1e0a1117108c46ee5dbefc6594289335e780d55a084f552da3f36d3c4c6178ba74d4decefc5a3b8c47c16f534bdb60895d3d54cd2bb266b399e4d4fb48d7a8cde17f42412560737d3c06e29df524d0cbd3093efca1c8fedcaa124abb27abdac6a29e0e8246abd6f5f531950037f76323aa56cc3fefa603041d55f1929e277e72cda1f96541d2af3e90c0f0e28be196d8f6921f3cd57a7926b860aa1bc403576892a96b93190ae383f631b72802658b2e8451d52a2f45db4f8bc3b0e4e50b6d603a5bdd30c234200ad7debb963f58a4fa20330b3696449445aa371824842fbf326d901dfe3be045452a3740dd160e72733f6e2733525a29a865f6f50d53bf7191c599c876f5c9ca1e3fad7960648e0d471f7d5c01c673f42d659bc3d98dbf07d8febfb995d17f9a02cd6c39f2ddcd0f1d222b9e11f2dd7d3c7518224bb6bfb8b7c58fe8ac105405903a1b9da7516715b7afc38a555e6bbcdbad46e34e576fea34ce35734ed20af5d88eeb1047a2660648bbb113ad9db8c53edb6ed9871a1e44c9ed2df5656fb2b2806ecf03b1eca9eab50a6eaab55b933b2dd1f21d450de9d5cb2232f07a392081b0b4b885d54789e2f75bf2c4cdad878989b1d6dabd9ed23c7c5b0356a7d9e7335290d7c85b966e80184bd07998602886d7076193565c81cccda4cc7d33c85d905b1beb6e8e7418e8acaedf0d9a32a7d29d07cf44d3119d4e7896820b77de64b655e4f148800434af7bdb2a56b25eb94ea39f2169596bb2b11761f082baec08885f4a0eb6c95767135a7f7cd72e743d2dff144dd8bafb1b318006e5876f8e2cb44aa588f906266ac67119c17f5de114e72e42a1fb39944321a111fa795ff7017f2fb8caf482f55d77a80855428ded7ec20acecca83f8d1eb137b588ccb745c105f2b2ca41c3a9f49d3c6e9d7c648b003b9707c906462edad617a8cfbf9bcc6c5fb6fa984325d6582e28f62005383f338df5b38fa9d19c22a2a7ea1d68a92d1d93b7fb0b8f33bc8760f28aeb1439a8b07f3da58ddb155b498cb09c75a5596838a65013e24d5640d0842a7699322cf3ffcb5703f414ffd168860bad3e308b2b5bf3cdf7f363bf9aaf4b3bc424c146c6f5421430f9f476aa34a0c6ee80131fc4d4d970723a2186ae3625e286d17dddc435ccb00831678aba584a62dbff002bead6e11e23c54d33cf3a4b231a908", "signature": "bb09360439a82dee5c7d85779e54c13f88e06d38f4b94960fe17a1ebcaa3ee2f330c649154bbc875a4076cf0bbf7eebf7b8d08d5aa4be7413881245fc2d2b601" }, { "secret_key": "f08ee8daa73e1feb61a88e062dfb1003c8578a0d53bd3bc9e589efb92f68be14", "public_key": "76692ce8d116eccb897077edcaafdd3eb44ea1a486b90e49e97f966901015502", "message": "64de90044d0e76bc02fcffcb75263667b3bd733b40bfb26c6c52fdb4b0782278cabae41e2129ea4017e94de86087964f66d86207987467a1688f9fab3ffb2f1d0063bf626c941367c12e319ab7ca3020c9b3a7215a19303e2d0e8988791de0d8e1632daa38c7f3e7f6e48ce122143d1e2cb661ba77c69e6a710911644bc110ff58bb00b5290820ce30970e7fde189e140e5c70c783eed53f0e2ac7ecae4f27db81d15b8646faa9c5a3ae2b7f47cd580d7707b002499b4cfeb8c591afdf1cc62af2595c184abcf0b2623a1bae60af7026b28d0540b41526e3020f81b894eb3fe31b72b21a3260dae3210c4ce4fd69e2e5ea0c8632a583262a12b3a8b16c9c1206ad73023037cf30653cb80aa7df8314b0f5bc6e9d5fa00b009d5552d83b7970b5bc4b9984f69d1cca9ce4cb74ddd2d879d37312a0e159d7a6afb77ac585e6b459c551304e1eebfbcab43a10b505924e03ea332f5d020a55c7aa683c541dcf7790a240af079baba94096b46060fd7afe9056ca99e688df280a9be8c8c73e6e6fb052a33eb3328a7f602542fe280c890e3ccaf22c7f34f87b5e5ba784b472b1e1a99347a9e0d240858d1277a5c6b349383fe4fd55cf92e69faad326b8d6db46233026221ee6d0a1c4246533c4a0e5bd172eb8936a9c0d30066538e3eb4ad5cb9877fd861b482b30150a06104161647e01d004d997403ee06726cb97e2e25f18c668eee4c5bf72529803189ee6a7aec238d5906ea5ae10722c9a61a78aea52af33eaac75406b1a60befbaad48476d9ff887fd283eb1655bcc07cf753331436db5b3b13032ff9c3d696380e9f5abf50d3556fda0df0b53897a737ac7a3b87c2a832b0c7273ea9fc54a767f1a812bf0164bf7521630b81b9dd930d92ee2ca28e3203b77bc082ceb37d55edbcb71df0b79236789a25d418cbb95544e2cef33bbdeb27a3f7909c1f498f47135ae9033adf250ad4f6575361e4cfcc9bcf4b90c3ad47a3442297a223cca843d7205ed08a9b87160a6d01b46a7d1c844e8d1f18f618682bfb22955f395b2a5790a51a696499d9e71a501f3fa546de9b10ae47bcee42ba7f869fb9ce4ed7c6453326c034cf05d9f1e3c200701ba752dabbd868521c3d8f80672d42f6cf4564f08cd7b390e6d49dd90090afdb84486ffcaa4e84d88682744dc0a878faa7cd440a8b276710902081f4dc84174619a66ea3a371f95505400d99fa999017710c8e2714be60949d461310f7d43a0dc123516d77d362213f9f75a5a1c393affc49ea151d46a81ffad239f28c07f65f59ea077d9a4d9c752de49b9ef36be60d112d795f588b00ef6e7730dea65e1016da0dd462370e0ba5c660001e457c08b436da2903b62906932084728c81671cbfb079bb29", "signed": "66dfa4c1575beff2f5a230b28c58c3eea0736df379d75559bc9d37a9579d121c05c373e8484c9747ef4477e80c4b2cb4ddf16ae9fdfa08a07547d107dcea120364de90044d0e76bc02fcffcb75263667b3bd733b40bfb26c6c52fdb4b0782278cabae41e2129ea4017e94de86087964f66d86207987467a1688f9fab3ffb2f1d0063bf626c941367c12e319ab7ca3020c9b3a7215a19303e2d0e8988791de0d8e1632daa38c7f3e7f6e48ce122143d1e2cb661ba77c69e6a710911644bc110ff58bb00b5290820ce30970e7fde189e140e5c70c783eed53f0e2ac7ecae4f27db81d15b8646faa9c5a3ae2b7f47cd580d7707b002499b4cfeb8c591afdf1cc62af2595c184abcf0b2623a1bae60af7026b28d0540b41526e3020f81b894eb3fe31b72b21a3260dae3210c4ce4fd69e2e5ea0c8632a583262a12b3a8b16c9c1206ad73023037cf30653cb80aa7df8314b0f5bc6e9d5fa00b009d5552d83b7970b5bc4b9984f69d1cca9ce4cb74ddd2d879d37312a0e159d7a6afb77ac585e6b459c551304e1eebfbcab43a10b505924e03ea332f5d020a55c7aa683c541dcf7790a240af079baba94096b46060fd7afe9056ca99e688df280a9be8c8c73e6e6fb052a33eb3328a7f602542fe280c890e3ccaf22c7f34f87b5e5ba784b472b1e1a99347a9e0d240858d1277a5c6b349383fe4fd55cf92e69faad326b8d6db46233026221ee6d0a1c4246533c4a0e5bd172eb8936a9c0d30066538e3eb4ad5cb9877fd861b482b30150a06104161647e01d004d997403ee06726cb97e2e25f18c668eee4c5bf72529803189ee6a7aec238d5906ea5ae10722c9a61a78aea52af33eaac75406b1a60befbaad48476d9ff887fd283eb1655bcc07cf753331436db5b3b13032ff9c3d696380e9f5abf50d3556fda0df0b53897a737ac7a3b87c2a832b0c7273ea9fc54a767f1a812bf0164bf7521630b81b9dd930d92ee2ca28e3203b77bc082ceb37d55edbcb71df0b79236789a25d418cbb95544e2cef33bbdeb27a3f7909c1f498f47135ae9033adf250ad4f6575361e4cfcc9bcf4b90c3ad47a3442297a223cca843d7205ed08a9b87160a6d01b46a7d1c844e8d1f18f618682bfb22955f395b2a5790a51a696499d9e71a501f3fa546de9b10ae47bcee42ba7f869fb9ce4ed7c6453326c034cf05d9f1e3c200701ba752dabbd868521c3d8f80672d42f6cf4564f08cd7b390e6d49dd90090afdb84486ffcaa4e84d88682744dc0a878faa7cd440a8b276710902081f4dc84174619a66ea3a371f95505400d99fa999017710c8e2714be60949d461310f7d43a0dc123516d77d362213f9f75a5a1c393affc49ea151d46a81ffad239f28c07f65f59ea077d9a4d9c752de49b9ef36be60d112d795f588b00ef6e7730dea65e1016da0dd462370e0ba5c660001e457c08b436da2903b62906932084728c81671cbfb079bb29", "signature": "66dfa4c1575beff2f5a230b28c58c3eea0736df379d75559bc9d37a9579d121c05c373e8484c9747ef4477e80c4b2cb4ddf16ae9fdfa08a07547d107dcea1203" }, { "secret_key": "272d64de50b1312bee23d7f4cea508a8fccf3e9b324e97b1c8e72502f61fbf45", "public_key": "33498c3b712ab9c01ec76b2efe2b83add1e1f2b5eb78f21692323451820cbe10", "message": "d6260d7eec5d436208e7e737655e0971814270194405e36e39f8f17b649fbc16c0f3d7f2bef5ebc02bb1c4df48e8470a3eae8a3ccaf640abcc094aa91150ff1a8cf1169693ebf5ac0034b9b919ecf17db791dfe5fedc90918b23e54e9004a1ae771c213ed7ed7334434e5bc02c0dda2bd1a876fb824a197bc99613b1409e7052310b0820da71446929ae7cfd3afba042de54578a5bfd94c1544391a3d9acbd5663ef65c6920d78516dec1cd55f6eb7290ba0aaf9a171658200b24a47a071b96fea03c6ca7ed0d6fe675dd63761833d75bc5e58a958582db02a60c6ce0a63f42ba837ae77c17a32705fd9cafa587b555dd4619851079794e24eb44608835a6f4824920d577a270396c9573bc7d82fe2aa0465956613a2c508cf2432337a365e6c984cba917f0cf842af122dc89dea958d418cae44a6e4ed263a415ff994a5ffb2ff13913df214bbfe90a34b247e71ab73f7ff004c23acfd90c767611aa55814c66964168e568ba75bf34903597cdcac78c24bb9f14f5c86a51f364f9ab41e464aee64fa50a1c159cbd850832c504ab42a584a96d5aee082d82c1edda19338160b8dcfa3419b3af64d9cfb104f98f9d35e5394e23228e275c87db50ca867540b880c7af29fbf534294581c22240bcd4d7d2c20ffc36733ada27653d3ae1a8c2203eac626e2e9bb4b52ce523e5adb3b2c10dcf78c2a1e626a16ebfa1bdb8c161493a5aaa2d84bfaa0f2027ffe4e9eaeb332ebda7cbbb677769d78517adf72f823a7f844165a079878d258fd95225c21177837e69c19685a051ca92b120b7d86d78595471ffc42a5e6e6431be7b64f8076458bacd6c72903cc34fc63a40cf3df00eff9d6ee9a8f39d25ead81a8128888b0a1ac0e5e3ad927712c14146adf828770ff958709eb19288e77bb70734881e9e016cd29e7d0899341ff6b297ac796bbde486ec35949f6a32b2ca647385915ecba3b9f0225087145c18d6559d3a31d6f22fc49f8a6315f1d32abeeb7cf2c2c776ea7350fd5ebc0e0f265baccc2697a7c8ca40c135f6cfcb0b58a61431960ffa9065709a961a633d570b73fb4491de52ad0d7b204b6e997b037ede3f7eca820a7cdb2c69ac29148be3523508ae7e4c3d1a717f55a821d14c3b64f08ca9ae49613b115773ef618d321c908bd2156717a434e5089a5948c045c8da8a4bd86ed5fabc6b13466e6deda583207d2ada2b2ab9cb1543df7a3734dfbc6fc428106d4844724a13df42faab18ca89db20ac9bc27b85394667c5a2779ca63ed7ac2b7c0d4122391ee4602d61ea0381764fb72dcc224e65eae2bc4506b0f09e23205d0bb21c77d8287c165e0b42c551579778acb7258a2479d7cf25b902e8d0da429bde36b4590dae96f525481ac8378", "signed": "33814c6ef375ab963769b2de4a25e7020fcd97f78f8fc93455c4b1c2bd45d4b01e192900e3122265fc552cd5c5f00e931e3a183cca5ba0802dafdebb79ebeb03d6260d7eec5d436208e7e737655e0971814270194405e36e39f8f17b649fbc16c0f3d7f2bef5ebc02bb1c4df48e8470a3eae8a3ccaf640abcc094aa91150ff1a8cf1169693ebf5ac0034b9b919ecf17db791dfe5fedc90918b23e54e9004a1ae771c213ed7ed7334434e5bc02c0dda2bd1a876fb824a197bc99613b1409e7052310b0820da71446929ae7cfd3afba042de54578a5bfd94c1544391a3d9acbd5663ef65c6920d78516dec1cd55f6eb7290ba0aaf9a171658200b24a47a071b96fea03c6ca7ed0d6fe675dd63761833d75bc5e58a958582db02a60c6ce0a63f42ba837ae77c17a32705fd9cafa587b555dd4619851079794e24eb44608835a6f4824920d577a270396c9573bc7d82fe2aa0465956613a2c508cf2432337a365e6c984cba917f0cf842af122dc89dea958d418cae44a6e4ed263a415ff994a5ffb2ff13913df214bbfe90a34b247e71ab73f7ff004c23acfd90c767611aa55814c66964168e568ba75bf34903597cdcac78c24bb9f14f5c86a51f364f9ab41e464aee64fa50a1c159cbd850832c504ab42a584a96d5aee082d82c1edda19338160b8dcfa3419b3af64d9cfb104f98f9d35e5394e23228e275c87db50ca867540b880c7af29fbf534294581c22240bcd4d7d2c20ffc36733ada27653d3ae1a8c2203eac626e2e9bb4b52ce523e5adb3b2c10dcf78c2a1e626a16ebfa1bdb8c161493a5aaa2d84bfaa0f2027ffe4e9eaeb332ebda7cbbb677769d78517adf72f823a7f844165a079878d258fd95225c21177837e69c19685a051ca92b120b7d86d78595471ffc42a5e6e6431be7b64f8076458bacd6c72903cc34fc63a40cf3df00eff9d6ee9a8f39d25ead81a8128888b0a1ac0e5e3ad927712c14146adf828770ff958709eb19288e77bb70734881e9e016cd29e7d0899341ff6b297ac796bbde486ec35949f6a32b2ca647385915ecba3b9f0225087145c18d6559d3a31d6f22fc49f8a6315f1d32abeeb7cf2c2c776ea7350fd5ebc0e0f265baccc2697a7c8ca40c135f6cfcb0b58a61431960ffa9065709a961a633d570b73fb4491de52ad0d7b204b6e997b037ede3f7eca820a7cdb2c69ac29148be3523508ae7e4c3d1a717f55a821d14c3b64f08ca9ae49613b115773ef618d321c908bd2156717a434e5089a5948c045c8da8a4bd86ed5fabc6b13466e6deda583207d2ada2b2ab9cb1543df7a3734dfbc6fc428106d4844724a13df42faab18ca89db20ac9bc27b85394667c5a2779ca63ed7ac2b7c0d4122391ee4602d61ea0381764fb72dcc224e65eae2bc4506b0f09e23205d0bb21c77d8287c165e0b42c551579778acb7258a2479d7cf25b902e8d0da429bde36b4590dae96f525481ac8378", "signature": "33814c6ef375ab963769b2de4a25e7020fcd97f78f8fc93455c4b1c2bd45d4b01e192900e3122265fc552cd5c5f00e931e3a183cca5ba0802dafdebb79ebeb03" }, { "secret_key": "0c9fe559ad1ed3ba164daceacb023567b2430320b6715de732a03c59c7303130", "public_key": "e70fc466fb2acd74e099c36e2c22fa51290bdde96df9c31b6dfbfdc2e2c14a40", "message": "26ebc648cf8c7965ec6ebe965d9c792bed90655ad440183c6d70ea6467bb8e6f04ec843f333156917bf4c51d0ed0f28b7cd31bc12cf840686b82b0c2c350bbdac805333725d6b69c2ab7f34ee593fa1cccedf3f0642a688fcc1cd98b0987d01f713a2fa6416c961921de0cc2c9ec7a555855e7fcd4c7ddaa14fd91ecb04224e1761b7d6b35f4aa5618a500ca00d1ca2451b5d368afde3a407e783135f39019a5b984e82ac279c05e48c295ebd1563821a0743c52246b5d2b2034e3aeb6ce7c5cf919e74a9c7bbc9e25da30430eb16ecf3837eb38a0f559792a729890ba8310260f8aeb9b5af00eb633c12dee022628ba418d75cf18de2f2e65e49b1a69684d6127ef481ca861ecbce3be86497e65df4c5fcd0817c9716b59f2a263d5e9eb606839f85c5a365837b0fbe2c4274d66cb2c65ed365fabf58f15be52b51cb60118ca4f730d447359f7ef346b750217d47b2e79c86c0c62816a0c7c18a2ce2b688e0cce0d752321e79b423857dac59f8fbeb09411e71669ef9a2643f2e99f387ac183e0b0ac72c59a0c3c18c0de8b010878074acc1a2b39f9df99d9f8f8b52fefe4943c525fd4d06ad878e46608abf27a54bc5006f647db724851db7c4578ae66583dc4bb518ef028890347e8fce0927d7d9af3ab5d0d2d202a4026aa2ea7487962676a603298e7d2e7b90921ee1b52806d71a764e03e25ddd6848f61d46fad3d008e10ee5cd5a3390f9d158a4437ef615fc90ac5bf3a9d682e12c3398ac77680d22cd1a6a56ec3b25cede867edd383159c6164d63e9cd1c956ac7235fffae936166ccd35898e29c9b4ca4e2925da323b6fbf67cfd596c88a1a35a8359851ddcba8f6134a9faa244dcb47e691276ee625cc20adcec21cbe77a3acb9ba72f0c9d3da7e9cd5be3b95990ba54a9f31af171f95aeead3331cb188a5b2c6f539acb48b98b3f7341f60251cb60429ccd9cf32f009205f2753fbbb26aa53174342ad184dab6870c0fb52930119d9f97d8489a60076aadb2e96054ac7cb7f84e13c75bbf9e4d924d2272afef0871915e243ce66fc2a8888513535b10bb4079c806bd949281e28283523d0d210b31ef62a95dcae0cd25290c7edf2c24b432822debe347f1cae945f5728c71b5403ef14e72c3d8342e198b362ee20f809e46aca015f35477ff89ac4b37e6615856f7ea251fbfe13f9065259b0946aaef24943270a854de889780033d63dda5447998a3ed7e506aeb51ea37b681ac3076797acdbfcc27883630adb72260a46af0a60d53f6654566e20d6088cd48e23b28d81f0eed205b92aafd96164d6d3ca3fc8b171804ee9fce7abaed2ea4ddf9cb2b3ae73a70ed63de45e14101428d0a7a226db39ab6cd04374080e6983f018ce93da4c89ac", "signed": "6cd8aed97d9c62d5fdae597d061c0c2bc37e42df06b8327a468f92b3f438a1e6b6b1ef2be78549a289fd3fc1a6299e5a33d5396cb4fac1e8e9982f0cb3d20d0726ebc648cf8c7965ec6ebe965d9c792bed90655ad440183c6d70ea6467bb8e6f04ec843f333156917bf4c51d0ed0f28b7cd31bc12cf840686b82b0c2c350bbdac805333725d6b69c2ab7f34ee593fa1cccedf3f0642a688fcc1cd98b0987d01f713a2fa6416c961921de0cc2c9ec7a555855e7fcd4c7ddaa14fd91ecb04224e1761b7d6b35f4aa5618a500ca00d1ca2451b5d368afde3a407e783135f39019a5b984e82ac279c05e48c295ebd1563821a0743c52246b5d2b2034e3aeb6ce7c5cf919e74a9c7bbc9e25da30430eb16ecf3837eb38a0f559792a729890ba8310260f8aeb9b5af00eb633c12dee022628ba418d75cf18de2f2e65e49b1a69684d6127ef481ca861ecbce3be86497e65df4c5fcd0817c9716b59f2a263d5e9eb606839f85c5a365837b0fbe2c4274d66cb2c65ed365fabf58f15be52b51cb60118ca4f730d447359f7ef346b750217d47b2e79c86c0c62816a0c7c18a2ce2b688e0cce0d752321e79b423857dac59f8fbeb09411e71669ef9a2643f2e99f387ac183e0b0ac72c59a0c3c18c0de8b010878074acc1a2b39f9df99d9f8f8b52fefe4943c525fd4d06ad878e46608abf27a54bc5006f647db724851db7c4578ae66583dc4bb518ef028890347e8fce0927d7d9af3ab5d0d2d202a4026aa2ea7487962676a603298e7d2e7b90921ee1b52806d71a764e03e25ddd6848f61d46fad3d008e10ee5cd5a3390f9d158a4437ef615fc90ac5bf3a9d682e12c3398ac77680d22cd1a6a56ec3b25cede867edd383159c6164d63e9cd1c956ac7235fffae936166ccd35898e29c9b4ca4e2925da323b6fbf67cfd596c88a1a35a8359851ddcba8f6134a9faa244dcb47e691276ee625cc20adcec21cbe77a3acb9ba72f0c9d3da7e9cd5be3b95990ba54a9f31af171f95aeead3331cb188a5b2c6f539acb48b98b3f7341f60251cb60429ccd9cf32f009205f2753fbbb26aa53174342ad184dab6870c0fb52930119d9f97d8489a60076aadb2e96054ac7cb7f84e13c75bbf9e4d924d2272afef0871915e243ce66fc2a8888513535b10bb4079c806bd949281e28283523d0d210b31ef62a95dcae0cd25290c7edf2c24b432822debe347f1cae945f5728c71b5403ef14e72c3d8342e198b362ee20f809e46aca015f35477ff89ac4b37e6615856f7ea251fbfe13f9065259b0946aaef24943270a854de889780033d63dda5447998a3ed7e506aeb51ea37b681ac3076797acdbfcc27883630adb72260a46af0a60d53f6654566e20d6088cd48e23b28d81f0eed205b92aafd96164d6d3ca3fc8b171804ee9fce7abaed2ea4ddf9cb2b3ae73a70ed63de45e14101428d0a7a226db39ab6cd04374080e6983f018ce93da4c89ac", "signature": "6cd8aed97d9c62d5fdae597d061c0c2bc37e42df06b8327a468f92b3f438a1e6b6b1ef2be78549a289fd3fc1a6299e5a33d5396cb4fac1e8e9982f0cb3d20d07" }, { "secret_key": "15d75ad8e4afb12634cc8e600f1a4267ef9584f4c4ac44fffe4b9fcb885c9d2a", "public_key": "09d126f017e0169774e8c37ab379263a8075746127c2d11ecb0e4cb454709ff1", "message": "d1cea2b7e9afc1f0fab890d2700a5ae41e15e7d34d3bf19d0f34d9f9f0ab9812dc7c2a8dc44c8ee7f3788761ecd988ee72c736b62a7cac3cc9b738e938df7787377eb9ffd120d4ff58cf1c0675633f7e83c4b115548f14d2f70c6d482211443a8499599558c14277980fa42a78427907f73a41f5f6693b2f75fe5e7a6ff0a6c3a4e2ed1d0d968d5cc9d6f13d41c3d291396ae7e434e664b2ff243e7f6d88010210078c39b5a576caf409bb4711b3eefc486b67b7ffeae0cbac6a0fbdf5343fb2ae4e057edc8c9d2ed31eae9ec83d2bedd219eb989b2d4419618c2d3ce4490e35fbcad432b0124795f9c5cbdc1eb0c3072b4aa801d26fbcc7b07b8257f5fe47acd9bc587b5657cf07ca545bb568c9e4e73cddf6254e22f78ab2f8064519f8abfd16fcfa90f87687db0c4209be2c6c79a5521f44189678d932c54585700a2437702e56aab588a17cb2cc94c00e87570ef3ac5133d753038aa46510a260c1fe80479bc02eed9a8d1de99354ac2648b48b96ab1b80cca6cae1877f37d70428bb50850e0308db0b423087bf7dde279e096766f2ab3ab2385b0464a5bed7bbd8d457e935e200aaaa8d951570e053076db18a6a62f72b319579884a0826ba2b436371dd218b01a0c5e58d0cd5ff9825e4466fe966df05cc31c803e5212183ddf29cef7fb91648a4f8ee19fd5f8dbd8a56be7abf33659a9224a1e27a1024effdfb88e8806148d0d1780906af1ebe3e5f14363190d88cc6e5089444f125d063155dcf86ca9263f2f5f183c26974fe000b9342d24c781e2058287cb6f3f1e3270c22b7707b8323a5cc8db81aa906bb59d696cb97cc74e359595ffb8373cad3710ea09ea9744c20e9a12e05be5a95f085ac561678d7da432e4c7cb53e1271df5cd5a339d2d7520f1c1848d15071d8c69846b23c5d2432c73890f2eded37c3d2964a4b5b55225888e892f526d1cac31eac356f361c2bf336c462d60c82e82b616f2a519c2f67bf01290369be9b55e9f5c8cec4f2e1b2ab302506c903dc3e7b9c978141dc904b01b1c23d25004399bf8b73d69cd539c79af5e9a0a511eca221078a1ff7b0f604aea84246c3cb32db9381be121767e097bea517bfcd82dfe921379840efb4b6f02a48ecdaf12d2cd38930d4473adf97cd71dc4ea10382f4f5d1dd7562cd4bf5115932f6c4700aa8fe8deca9d5e7277902b8f886529765db2486074b23a19fd4b04356bfa6226c82baf69a087d9ca18823f8e3e68308e16b804c363df5b6307e76240db1ed841b612d65548ddfbe8367da60772c6aff554dc85d041948345e567da9333151858fdf6993273925bfdc7181b5f646d063a8c8f310569b0ed093bd9dff04febf0b41c6dc55169a14a3c862e5416f1e582fdee8fe87dc", "signed": "a8f2f4b9e2072ca9fade37fdd62d8d0242fd4daa09fd856e75f4e343c7260ea677f753a627aed08cb96c444e29bdb5b5385d43843bbe79a3dda36e1e1101c50fd1cea2b7e9afc1f0fab890d2700a5ae41e15e7d34d3bf19d0f34d9f9f0ab9812dc7c2a8dc44c8ee7f3788761ecd988ee72c736b62a7cac3cc9b738e938df7787377eb9ffd120d4ff58cf1c0675633f7e83c4b115548f14d2f70c6d482211443a8499599558c14277980fa42a78427907f73a41f5f6693b2f75fe5e7a6ff0a6c3a4e2ed1d0d968d5cc9d6f13d41c3d291396ae7e434e664b2ff243e7f6d88010210078c39b5a576caf409bb4711b3eefc486b67b7ffeae0cbac6a0fbdf5343fb2ae4e057edc8c9d2ed31eae9ec83d2bedd219eb989b2d4419618c2d3ce4490e35fbcad432b0124795f9c5cbdc1eb0c3072b4aa801d26fbcc7b07b8257f5fe47acd9bc587b5657cf07ca545bb568c9e4e73cddf6254e22f78ab2f8064519f8abfd16fcfa90f87687db0c4209be2c6c79a5521f44189678d932c54585700a2437702e56aab588a17cb2cc94c00e87570ef3ac5133d753038aa46510a260c1fe80479bc02eed9a8d1de99354ac2648b48b96ab1b80cca6cae1877f37d70428bb50850e0308db0b423087bf7dde279e096766f2ab3ab2385b0464a5bed7bbd8d457e935e200aaaa8d951570e053076db18a6a62f72b319579884a0826ba2b436371dd218b01a0c5e58d0cd5ff9825e4466fe966df05cc31c803e5212183ddf29cef7fb91648a4f8ee19fd5f8dbd8a56be7abf33659a9224a1e27a1024effdfb88e8806148d0d1780906af1ebe3e5f14363190d88cc6e5089444f125d063155dcf86ca9263f2f5f183c26974fe000b9342d24c781e2058287cb6f3f1e3270c22b7707b8323a5cc8db81aa906bb59d696cb97cc74e359595ffb8373cad3710ea09ea9744c20e9a12e05be5a95f085ac561678d7da432e4c7cb53e1271df5cd5a339d2d7520f1c1848d15071d8c69846b23c5d2432c73890f2eded37c3d2964a4b5b55225888e892f526d1cac31eac356f361c2bf336c462d60c82e82b616f2a519c2f67bf01290369be9b55e9f5c8cec4f2e1b2ab302506c903dc3e7b9c978141dc904b01b1c23d25004399bf8b73d69cd539c79af5e9a0a511eca221078a1ff7b0f604aea84246c3cb32db9381be121767e097bea517bfcd82dfe921379840efb4b6f02a48ecdaf12d2cd38930d4473adf97cd71dc4ea10382f4f5d1dd7562cd4bf5115932f6c4700aa8fe8deca9d5e7277902b8f886529765db2486074b23a19fd4b04356bfa6226c82baf69a087d9ca18823f8e3e68308e16b804c363df5b6307e76240db1ed841b612d65548ddfbe8367da60772c6aff554dc85d041948345e567da9333151858fdf6993273925bfdc7181b5f646d063a8c8f310569b0ed093bd9dff04febf0b41c6dc55169a14a3c862e5416f1e582fdee8fe87dc", "signature": "a8f2f4b9e2072ca9fade37fdd62d8d0242fd4daa09fd856e75f4e343c7260ea677f753a627aed08cb96c444e29bdb5b5385d43843bbe79a3dda36e1e1101c50f" }, { "secret_key": "bf3c0cbbbe20be2acfafb27a3611b48921a728ab17334b8afdee8305178f613b", "public_key": "4500a03c3a3fc78ac79d0c6e03dfc27cfc3616a42ed2c8c187886d4e6e0c27fd", "message": "8f30ba2f792e9a97f6eafe29f976a48028cb8857b5c798bc2b6168c46444c0ce696070374c5e6a40c3d18a5dc7669fc41db9a81cff759b8ca0159871c3442e8c7512698fa447b5783ee01d1b611449abad237162922b02d1aec5de1d666f17da1613106301d30586d116e2ac09007dd71e8123ede4c5a6a9ac077fe3d93909da628e865870a4e25cb35591675a0690bec4af0281714fe6661bd5c00a27d79f959fb4d4fb1636a6a3575f4f01470663899d737472b096be4db723715367a41a3a4c13f742d908f4d921cfdd156e75868261ba9c10d85874ca2d6c0c9e7295e5662bd916a363c7a796ead617c4251e6794da06c3d08f2fdc3886944a7509e6409c906b593113b4b1f9850132960d9f3a4eeb7386fa592f6193beab8e0ff0f28908a0d548db87bae978b05abbca9b3e96d8795b88077f620f2124e31590eb099e94e0e6e3cd620ae6290f3e2d01467e5bef4fabdef79d9ab9239e753ec4fa0bb110ff1d393fca02243502d7e987991eb76d08f8be7eb2b1ee00c3b68bbf72a623baa15be896b3215ebe8a82313109fc629b0cce6491f813c24970e4ffe6869e40b46b4ed22986d0042155276c230de4c05d678552f2e851cacf5a472157dbb1a99a2b42ff4037f0dc6380672921c909206e80050e61a6b3056b17e3ae835009b20419a3b9846d374892e719f1b35bc1257da93ccc6d8f8fcaa8e609a8d204df108be7193467e7f105935282c3fe6670a5329442ea3edda2376a03a1cfe8723a909c064d30fe9bb0212c33afe2bea30c9143c001da01c7ed504559b97fe2cea09beb9db51900dc136705921e20297845ba72a97aa7c953814571be3f08cef968045a5ac34004f67fbfa54e996b311bd8dc527d89e1d4f53453a6713720101c45a60ee3a05c2ee66f134b5af40e4b70ef37ba3f0afdefc039f342c28af9198251381a1079a5dd035a8c28976c6b7f4db09ea383a3a87f0f851fd331aea7fa4bfcd95631d652fa2f50f1c23ff2bc137a0604e3d9f39ccb965145bca48b06dc8a817547b625effa796d000c3774bad198db1241be7a2c0dc4a4641b9a8cb9cb8c8c3887576f5272c33aaffe45615f51a96fae76cf5125bc69ad0a4038790799b5c2624421a6433dbab39cccb0b1787b5bce289594489d17edb5f9310374807d36c6e6734726bb33004ecae8bb691dcd387601f4ea911b4b90ebff756d7d8d9eb422cbb9aaf7f4772e0a5436430685e57b697454e82eeadce4aba062b77682cf219be1fd9b00f1cb1135a1021349539a4b93ae213f193d2932738ef72920499b7be2a81c9baaed17c54641a5974d27223241e3c6a095226bd237e0591e002b3af0565df3e976420f9764a09ae8bfa2795f8fad7fc687bd2de23d1488f449d8", "signed": "8f8703bcf4c0329417339eb026f2b72d314d922e9accb5d8bb7eec87e07e6138551672a6132cb4f875508ed3299567b4a74134d2bdf0d857f980861d18be7e018f30ba2f792e9a97f6eafe29f976a48028cb8857b5c798bc2b6168c46444c0ce696070374c5e6a40c3d18a5dc7669fc41db9a81cff759b8ca0159871c3442e8c7512698fa447b5783ee01d1b611449abad237162922b02d1aec5de1d666f17da1613106301d30586d116e2ac09007dd71e8123ede4c5a6a9ac077fe3d93909da628e865870a4e25cb35591675a0690bec4af0281714fe6661bd5c00a27d79f959fb4d4fb1636a6a3575f4f01470663899d737472b096be4db723715367a41a3a4c13f742d908f4d921cfdd156e75868261ba9c10d85874ca2d6c0c9e7295e5662bd916a363c7a796ead617c4251e6794da06c3d08f2fdc3886944a7509e6409c906b593113b4b1f9850132960d9f3a4eeb7386fa592f6193beab8e0ff0f28908a0d548db87bae978b05abbca9b3e96d8795b88077f620f2124e31590eb099e94e0e6e3cd620ae6290f3e2d01467e5bef4fabdef79d9ab9239e753ec4fa0bb110ff1d393fca02243502d7e987991eb76d08f8be7eb2b1ee00c3b68bbf72a623baa15be896b3215ebe8a82313109fc629b0cce6491f813c24970e4ffe6869e40b46b4ed22986d0042155276c230de4c05d678552f2e851cacf5a472157dbb1a99a2b42ff4037f0dc6380672921c909206e80050e61a6b3056b17e3ae835009b20419a3b9846d374892e719f1b35bc1257da93ccc6d8f8fcaa8e609a8d204df108be7193467e7f105935282c3fe6670a5329442ea3edda2376a03a1cfe8723a909c064d30fe9bb0212c33afe2bea30c9143c001da01c7ed504559b97fe2cea09beb9db51900dc136705921e20297845ba72a97aa7c953814571be3f08cef968045a5ac34004f67fbfa54e996b311bd8dc527d89e1d4f53453a6713720101c45a60ee3a05c2ee66f134b5af40e4b70ef37ba3f0afdefc039f342c28af9198251381a1079a5dd035a8c28976c6b7f4db09ea383a3a87f0f851fd331aea7fa4bfcd95631d652fa2f50f1c23ff2bc137a0604e3d9f39ccb965145bca48b06dc8a817547b625effa796d000c3774bad198db1241be7a2c0dc4a4641b9a8cb9cb8c8c3887576f5272c33aaffe45615f51a96fae76cf5125bc69ad0a4038790799b5c2624421a6433dbab39cccb0b1787b5bce289594489d17edb5f9310374807d36c6e6734726bb33004ecae8bb691dcd387601f4ea911b4b90ebff756d7d8d9eb422cbb9aaf7f4772e0a5436430685e57b697454e82eeadce4aba062b77682cf219be1fd9b00f1cb1135a1021349539a4b93ae213f193d2932738ef72920499b7be2a81c9baaed17c54641a5974d27223241e3c6a095226bd237e0591e002b3af0565df3e976420f9764a09ae8bfa2795f8fad7fc687bd2de23d1488f449d8", "signature": "8f8703bcf4c0329417339eb026f2b72d314d922e9accb5d8bb7eec87e07e6138551672a6132cb4f875508ed3299567b4a74134d2bdf0d857f980861d18be7e01" }, { "secret_key": "287fafd21374572f57810047d0d98cb1ff3d0120faa4886132245732c1a6ab78", "public_key": "e8252063f5ad7e95bd05c502a8bc4a17556360869b9de0a3b858938e11117619", "message": "b3c443e4e5899c16d39e81b4f8074042a904a735074b2795d9ac06b1379ef7618d2a534b6bef81569e60719267bf29cd9d16acc9a174d8026b14b127d0d2d8b4583998895ad7ef72fedc53b8f08a2250100e1f1f0aab48bc7074643488e6b670e1b0727c385a34ff65a0d7e83ba86083b873dff0559209b14b2ac42bf7c572d0c5917ac42e4ae4dae1dd4235795276a076132cfe3e0c350b26580fbb3af81777b93ad95cb7ff17c2d980ce0d492f6d40fa90ba3fcaa21bb68735ee1ef208495ebf7b02276ffa1efc081658bb44cd2761ef5e3e1ca60ec8b5d816d4abacd0bcc80268d8f4df8b3a52049db0157e2b6e81acd6f3f28947c07627955cdac9eaa1de17d4b9daa361fb49782664d7d6d2ca5cec6d14893c3e80b6d16daacffcc0b75937e8bef6f9e112a87f4b035f9036070a2ccc55c2aad939df674f7e4e12685e016ea0e4902aaaafaffe38ddb2f90d9cf78537f61391696ff0330ae8f79a1c1ed5d52b4ee2a62d90fb82d9a48393fa33810b40d0455902d574ff052003e0160c0f47b5e580a078bceef06073dda8b2d1f104a595e90bb6a48eddd865f1cae4f178fe22e75f2f6124a9da0682447112b3db5be8c42472b241e944fd2370c2dc2715c05a41bdbc890c41c65fb08c2f593174391ac880f3cb67d1b74ff802ef962afef7b9f3ea326f9527e7fba698187924b64ccdd0866248c76ee64c79069be0a057b10ae190f38ff5aba844e39331cf1db13c900906bee0d7e7546ef52324e37c590675f139f58f573a494f4ae82c4ec81066a68e2d92900191c47d3062f0f9aaed191137cda9b83cd130e8262960e6244f8f6ef39f15a4fed13cb669edc19f5ce162ceb8d242b9addbfba8772ce74985a5f3720d590a920e1dca75a879b1aa459f7462fff2e95072761b209254fe38c54d833a8e2cb8fc40c598f3c7f7d6c5705715d0308dc30eaa84676d209d7b7b31344756e69a9a4cb4e4a251817a3786fea6728dd60822336b45ae5d47c704b45c4cad38c1e01ab93d141692d55d12fdb9740f1d181582f1c48ce5434860d930f0e7e70edcffb85560a53dba95d57b31e8924137bc2c19e34bb9c9866877174280e80c23978d57795864a7374aef383f3bf6375359bf63564740098461a6c76e8f238913288769a1cb1c95b22c32a9ebb3eceb048ee324cf0d7e85a389b04dedbbcbeef298d0527816085c0c83efaa298546e8390bd1bfe465ec1bafae69ee5218e72caedb9b649cf73eec454a2b484965179672debcf9441363995a8a907de17dc0684f2aea579a2fb4484195db4115ca32e970526dc00a5cacaf588711dbd469ce80bd297c4f41d6fa28a597c6372c0d214960b54598cd8bc849ebdca36d6225b20dec0d031169cebb36eadc3a", "signed": "6201e30591d36b7b226e36fdf56434c47cd3051837af31313a9917fd02dded2b5bbb4bbc368b3bd15d062045f105b6e7341b15150d36f90087591d839901b801b3c443e4e5899c16d39e81b4f8074042a904a735074b2795d9ac06b1379ef7618d2a534b6bef81569e60719267bf29cd9d16acc9a174d8026b14b127d0d2d8b4583998895ad7ef72fedc53b8f08a2250100e1f1f0aab48bc7074643488e6b670e1b0727c385a34ff65a0d7e83ba86083b873dff0559209b14b2ac42bf7c572d0c5917ac42e4ae4dae1dd4235795276a076132cfe3e0c350b26580fbb3af81777b93ad95cb7ff17c2d980ce0d492f6d40fa90ba3fcaa21bb68735ee1ef208495ebf7b02276ffa1efc081658bb44cd2761ef5e3e1ca60ec8b5d816d4abacd0bcc80268d8f4df8b3a52049db0157e2b6e81acd6f3f28947c07627955cdac9eaa1de17d4b9daa361fb49782664d7d6d2ca5cec6d14893c3e80b6d16daacffcc0b75937e8bef6f9e112a87f4b035f9036070a2ccc55c2aad939df674f7e4e12685e016ea0e4902aaaafaffe38ddb2f90d9cf78537f61391696ff0330ae8f79a1c1ed5d52b4ee2a62d90fb82d9a48393fa33810b40d0455902d574ff052003e0160c0f47b5e580a078bceef06073dda8b2d1f104a595e90bb6a48eddd865f1cae4f178fe22e75f2f6124a9da0682447112b3db5be8c42472b241e944fd2370c2dc2715c05a41bdbc890c41c65fb08c2f593174391ac880f3cb67d1b74ff802ef962afef7b9f3ea326f9527e7fba698187924b64ccdd0866248c76ee64c79069be0a057b10ae190f38ff5aba844e39331cf1db13c900906bee0d7e7546ef52324e37c590675f139f58f573a494f4ae82c4ec81066a68e2d92900191c47d3062f0f9aaed191137cda9b83cd130e8262960e6244f8f6ef39f15a4fed13cb669edc19f5ce162ceb8d242b9addbfba8772ce74985a5f3720d590a920e1dca75a879b1aa459f7462fff2e95072761b209254fe38c54d833a8e2cb8fc40c598f3c7f7d6c5705715d0308dc30eaa84676d209d7b7b31344756e69a9a4cb4e4a251817a3786fea6728dd60822336b45ae5d47c704b45c4cad38c1e01ab93d141692d55d12fdb9740f1d181582f1c48ce5434860d930f0e7e70edcffb85560a53dba95d57b31e8924137bc2c19e34bb9c9866877174280e80c23978d57795864a7374aef383f3bf6375359bf63564740098461a6c76e8f238913288769a1cb1c95b22c32a9ebb3eceb048ee324cf0d7e85a389b04dedbbcbeef298d0527816085c0c83efaa298546e8390bd1bfe465ec1bafae69ee5218e72caedb9b649cf73eec454a2b484965179672debcf9441363995a8a907de17dc0684f2aea579a2fb4484195db4115ca32e970526dc00a5cacaf588711dbd469ce80bd297c4f41d6fa28a597c6372c0d214960b54598cd8bc849ebdca36d6225b20dec0d031169cebb36eadc3a", "signature": "6201e30591d36b7b226e36fdf56434c47cd3051837af31313a9917fd02dded2b5bbb4bbc368b3bd15d062045f105b6e7341b15150d36f90087591d839901b801" }, { "secret_key": "9ad049100851d0f79b711225c98847795acfc3601c14b8a9778d6270cd4c05ed", "public_key": "e7cacf4f3714543c27a3e9ed833baf3bde4c09563bef59e763fab71fb5e4ff56", "message": "c284bdd8f8275b49ac808c39045e50e1ed50c8a1afd011afe5db3dda620be8aec37f45605762e225d04111f21b49fcefca3f3d5f813b2020a52c49f95c4ad61ca214618ade7eed6cd8d314dc4c6355955277d457462f03b9fba2e225b1b537cd4b5237505c90d43205e1715c3963ccfbec379e6c1705e08034a31afce646727e78a20eed88aeb0dcdabc5c86e86979e63a5c26c3e2177973b6983cebfeda9f31479361b661763aa7261c0939cad48b71908ea90768bb6c9583d8eaeb9e0338515aca1242626dc6be04ecc4429e4cbb4ff336096192f7501ec471b596a99d4c027582cc69e204b6fbcddf59f5bf7462ddcd5989121fd10f11a0675b6c4e4f6520d27d7c61431ba7d174f57395a0bf72d38c1142736ded6b91e4811c0e8541a6c0d996c5a17dc97db388f721d2357d3c6af5c86b1d5e476ea0ac0b1c11d4387f769039bdf538a0216edd0045ee6dd89eef82a425a83faa1b12807038ca19ebec002e8b3c15344c61cfd1e5f0e3b0273deb37278cf197d8a83b13d992308a51373eb38114c9e45b438780277d1e32f3972962a3e14a8d08db9f09aec3dd32a5b99423e61f5e79944ab57a36f6ec07cc3204f9165ee021ada93e6fecb7ec456aa0288c378a75afd6e9dad6c6f88e959a2cf28bfe56d2e61b2adaecf0d86dd8928bceda26b0540246b7337f5cdcec11fb0c1a59d631fcca19408f9522b68a39f86ef970b883a0f0bd6b7b1415ec9aa043b52e19bac176d67b79e2a5dca8bfd29102ac608e473e9f982c3ec8932d8aa8cd565284491de52f516b9ebfb7dbe1299511ae732c2ad1ee4992b077faffc65f488f1ba215da6979600971196d0ff3a08ad9f00e829c1de1afca10ca476be664aad261889b0eb7aeb6ed8637618900acf481e2d224ec64a6e6cf4fa4df731b7a4feeff2580c99b6d75b4dcd0976965cb2b0b5635227842d08a7d907aaebc2fded8009811dcdd73354921753bc5dec017689335f56d0fb7ae213b41792b1f4eb14a24535977a305b19eb9838dc6b51528b98a39bda06010717a208c347aa158eecdfd9a0472d3b8d920f969e12b65919bda38b461949850cc9cc18d8e3baa8c886d93cd096a209d543ca3375fc4e7d65103cb6424beab44e8bc4a5b62c29a01bcf44dcc61e7675c025dec0724200194bde74d72c02e94a946a752f3608457fd91f292715771487d26cad4e5cf6ef7c6f71627a4daf8a4c9b891c1ee8f04aeaa99fe0c8b4e833b7609066b6132a968890e2695da22b2d857c8c0ad9187c96069e476e27e4632c447ee76714a31d1e5149ecb337ee132f3552da33ab2d6fa9d7e93f68a77cbf191cb06bc22f3470af6d7581e3accbeca0b6feb08a14b9a80c1ef59374ccdc0523c3684504c0104bba22c10", "signed": "fec0af34cbc5cffc56e96dd5ed5968e52cbd4269844fc30e3ab0d3472b5d180c8d1b7690518f41f14438e7f3a83d5e8976cb9a26151fc4149a3298d7e42c0503c284bdd8f8275b49ac808c39045e50e1ed50c8a1afd011afe5db3dda620be8aec37f45605762e225d04111f21b49fcefca3f3d5f813b2020a52c49f95c4ad61ca214618ade7eed6cd8d314dc4c6355955277d457462f03b9fba2e225b1b537cd4b5237505c90d43205e1715c3963ccfbec379e6c1705e08034a31afce646727e78a20eed88aeb0dcdabc5c86e86979e63a5c26c3e2177973b6983cebfeda9f31479361b661763aa7261c0939cad48b71908ea90768bb6c9583d8eaeb9e0338515aca1242626dc6be04ecc4429e4cbb4ff336096192f7501ec471b596a99d4c027582cc69e204b6fbcddf59f5bf7462ddcd5989121fd10f11a0675b6c4e4f6520d27d7c61431ba7d174f57395a0bf72d38c1142736ded6b91e4811c0e8541a6c0d996c5a17dc97db388f721d2357d3c6af5c86b1d5e476ea0ac0b1c11d4387f769039bdf538a0216edd0045ee6dd89eef82a425a83faa1b12807038ca19ebec002e8b3c15344c61cfd1e5f0e3b0273deb37278cf197d8a83b13d992308a51373eb38114c9e45b438780277d1e32f3972962a3e14a8d08db9f09aec3dd32a5b99423e61f5e79944ab57a36f6ec07cc3204f9165ee021ada93e6fecb7ec456aa0288c378a75afd6e9dad6c6f88e959a2cf28bfe56d2e61b2adaecf0d86dd8928bceda26b0540246b7337f5cdcec11fb0c1a59d631fcca19408f9522b68a39f86ef970b883a0f0bd6b7b1415ec9aa043b52e19bac176d67b79e2a5dca8bfd29102ac608e473e9f982c3ec8932d8aa8cd565284491de52f516b9ebfb7dbe1299511ae732c2ad1ee4992b077faffc65f488f1ba215da6979600971196d0ff3a08ad9f00e829c1de1afca10ca476be664aad261889b0eb7aeb6ed8637618900acf481e2d224ec64a6e6cf4fa4df731b7a4feeff2580c99b6d75b4dcd0976965cb2b0b5635227842d08a7d907aaebc2fded8009811dcdd73354921753bc5dec017689335f56d0fb7ae213b41792b1f4eb14a24535977a305b19eb9838dc6b51528b98a39bda06010717a208c347aa158eecdfd9a0472d3b8d920f969e12b65919bda38b461949850cc9cc18d8e3baa8c886d93cd096a209d543ca3375fc4e7d65103cb6424beab44e8bc4a5b62c29a01bcf44dcc61e7675c025dec0724200194bde74d72c02e94a946a752f3608457fd91f292715771487d26cad4e5cf6ef7c6f71627a4daf8a4c9b891c1ee8f04aeaa99fe0c8b4e833b7609066b6132a968890e2695da22b2d857c8c0ad9187c96069e476e27e4632c447ee76714a31d1e5149ecb337ee132f3552da33ab2d6fa9d7e93f68a77cbf191cb06bc22f3470af6d7581e3accbeca0b6feb08a14b9a80c1ef59374ccdc0523c3684504c0104bba22c10", "signature": "fec0af34cbc5cffc56e96dd5ed5968e52cbd4269844fc30e3ab0d3472b5d180c8d1b7690518f41f14438e7f3a83d5e8976cb9a26151fc4149a3298d7e42c0503" }, { "secret_key": "de54e13f9e2cc754546c99b33b3d72f4d1f7715038a9659f33636577bb526adb", "public_key": "36338db3326b005e5c61ff782be2eab166d4eb7234a98ea1cd855e1ad535e94c", "message": "dc4041ad61423a12a0411318a6e62a5ef64a19abe2d9852297be2d4a35eb8670ca36c521531b3038acdaeea2ea01a0b6187862a4e1a89d4b81c5318ed4d67131bc38f841a142a2f6f316dff076939dc0eb81b230fea9881f8f0ff7ed0b293f69b289fe770881fb3710808e8e59e64e190c1e379b9dd348b02c2347d7e20696790b62776a2e825bed6917037cb635c92fbc76b4c5851027e7f13852ee7e7c52573a9030b79f22b60d5869efe680c01664929fe9a06fa333052be1d6af3a0b482c332e18051e78b333839d6cb93d93ebfb277e4268fbeeeeba1e8f96a5c9e328c4267212cac251215bfaa78fd88a87417a80602dcd8828e80400da304e989862d13201082de3530925e0edc2c130a9a419071b31088da6f6ff4056301c129fc2135233628d16d8bf160f6ce86d83cd4e29ae0c73843d70b53056c5af3f3dc561271cb5aff393f0803ade072d9ceb745b6187b28d24696767d5c21f4d4ac58d5bb66c5cadfefb1626ef93f714c782b6ef3ccf4b44ee75f0bb757a25d9b46a9d931a03727d496a22810c634f5c1ae60cbdf2f1ea29b54607cff50d9f8e03a0a4513cf68dfb619773411b6180959a8aac30b2eee4ad327915f60ae52b90e04a9bcef8dc67e71ea10aca553db9895cd8008457d76f02ceb53500211109e89603f304d880aaf02861fe37c9534a9d672d83713cd326c9ab81c353764ca5ad5ac0e7f1ff880fb48acd9cbb949064e21183bc38fb1d90cfe619a8b8fbf5321889bb15c02a53e4d367fc668877b662281c4a2af678f86e691daa8afdcac1b820189fe5c2508ce36edd9c6f8f51575071839439a003352c1573e12768dd6debdf1ed4f94ac79df1ab6a0bc25079c0935477d9149988ec3b8793efcda859acc392ab3fa99493d7ae0a6575b695a1ce076532860287dd498967c46f7add49494c02e744c40280195782e2424476165e72cee23642e51cec432191116aec59b59fcf0a3683b95f760760a20bd67454d8de647c0f9ffc4f90f6e45ac93d802f338299ef280d3bb7a4a89db8c59a12526f2783024c8ade9002f00e3d529b78dcdd4903daf5767a2bed75145396efb69790712de6a5901e6d8c15280182388285021d0e70929215d9f2b799bb92f2ca56f48e8cbba2f19b085845126567cfafa603c2946ea1e7d274554a38bf7d86511f3e474f9fa5cb11105fb52fc68177f3385fe1397be584a70089dc741b4b0095bf7eb2993b418df87b14a1f97926e868df6e568beca2215f2dd7ce8a3c9ee849cb41346c684f7ffef0a792edf433ca99ef34c73f9272a7eb97587c8fce4a5136444737138d53eadf3a84f501bb10456e8e4a4047082c9e1435f576526c2164714d70b3d0a6e9c08a53e323840f4dcfe8f2d19f0be2c88e", "signed": "37aca8f248394a9e04d06a7da84a7defa39de4da2bcb18d5f64cc34db08651af4abb19fa2a92a7dda56ec9930b81aebd23990511f684c6d15ba595f7d4a2740edc4041ad61423a12a0411318a6e62a5ef64a19abe2d9852297be2d4a35eb8670ca36c521531b3038acdaeea2ea01a0b6187862a4e1a89d4b81c5318ed4d67131bc38f841a142a2f6f316dff076939dc0eb81b230fea9881f8f0ff7ed0b293f69b289fe770881fb3710808e8e59e64e190c1e379b9dd348b02c2347d7e20696790b62776a2e825bed6917037cb635c92fbc76b4c5851027e7f13852ee7e7c52573a9030b79f22b60d5869efe680c01664929fe9a06fa333052be1d6af3a0b482c332e18051e78b333839d6cb93d93ebfb277e4268fbeeeeba1e8f96a5c9e328c4267212cac251215bfaa78fd88a87417a80602dcd8828e80400da304e989862d13201082de3530925e0edc2c130a9a419071b31088da6f6ff4056301c129fc2135233628d16d8bf160f6ce86d83cd4e29ae0c73843d70b53056c5af3f3dc561271cb5aff393f0803ade072d9ceb745b6187b28d24696767d5c21f4d4ac58d5bb66c5cadfefb1626ef93f714c782b6ef3ccf4b44ee75f0bb757a25d9b46a9d931a03727d496a22810c634f5c1ae60cbdf2f1ea29b54607cff50d9f8e03a0a4513cf68dfb619773411b6180959a8aac30b2eee4ad327915f60ae52b90e04a9bcef8dc67e71ea10aca553db9895cd8008457d76f02ceb53500211109e89603f304d880aaf02861fe37c9534a9d672d83713cd326c9ab81c353764ca5ad5ac0e7f1ff880fb48acd9cbb949064e21183bc38fb1d90cfe619a8b8fbf5321889bb15c02a53e4d367fc668877b662281c4a2af678f86e691daa8afdcac1b820189fe5c2508ce36edd9c6f8f51575071839439a003352c1573e12768dd6debdf1ed4f94ac79df1ab6a0bc25079c0935477d9149988ec3b8793efcda859acc392ab3fa99493d7ae0a6575b695a1ce076532860287dd498967c46f7add49494c02e744c40280195782e2424476165e72cee23642e51cec432191116aec59b59fcf0a3683b95f760760a20bd67454d8de647c0f9ffc4f90f6e45ac93d802f338299ef280d3bb7a4a89db8c59a12526f2783024c8ade9002f00e3d529b78dcdd4903daf5767a2bed75145396efb69790712de6a5901e6d8c15280182388285021d0e70929215d9f2b799bb92f2ca56f48e8cbba2f19b085845126567cfafa603c2946ea1e7d274554a38bf7d86511f3e474f9fa5cb11105fb52fc68177f3385fe1397be584a70089dc741b4b0095bf7eb2993b418df87b14a1f97926e868df6e568beca2215f2dd7ce8a3c9ee849cb41346c684f7ffef0a792edf433ca99ef34c73f9272a7eb97587c8fce4a5136444737138d53eadf3a84f501bb10456e8e4a4047082c9e1435f576526c2164714d70b3d0a6e9c08a53e323840f4dcfe8f2d19f0be2c88e", "signature": "37aca8f248394a9e04d06a7da84a7defa39de4da2bcb18d5f64cc34db08651af4abb19fa2a92a7dda56ec9930b81aebd23990511f684c6d15ba595f7d4a2740e" }, { "secret_key": "8504fbcaaba67683f815499282b6ebd497a81a9156f53e025c2d3ecee0db6559", "public_key": "e62da86493a0caf52921d5602fbdc3dd3a8436941f6be240b31509681238746d", "message": "6c63edbd40a03874ecaef81602cd6850c09f4915b7aaf418258c568364538e8392a8c379838b0c95345bf64c3dbc175853fb641f350f0b53a05a8ec290288c0326d435ff776f8683a273333f9bb2802184ecc53b06b28c2c402a54bf134c1a23299749a6ce2b51a7ba22232148797e993ff258286e947778a8742d3f36cc7842976043fc23da8a97ecb9715fc05fb0f23fa7321ddc1932861631604eba2ef25d8b756ce4733656bfd1e14708923ac7c60a79846136d741973ba5514189720bc0f7774b7bd3574595bde2515031b25b62654b161035778070ace14971df1fe0be4ea1ef55cf8747d3716c1ce707b1a7c8520e6deb334eb186338fc93000768eb2be40c6e0dc3f5df831b32c3a2c33e28898d6762a1522d3d48daee56a0269bddf6cfc9d73f8d178aeccbffef7ce164f98afea224a9b60ede46a95fadc9fc5d94d209c166d9b8de253381ea2248862946b9cf534947455c24458cf56683a0ec47a2c65075c694c7c3d6adf9ae5e8ad31ac769f83aa26e312c5b01a9a09404b15b814baa7666b3e03f06a8d6348ab8ccb9b60a4a4faf86f7135df039d955c07bd92e7b8e327ee6c1b40196a28b4446aa5a9b2b9773ab76e3ce21180f09d6c08d277c6771d67e22d84540fa43b38f634cfc46e5b8c33f15a568a77e4914aad9ab8c9f7fea47f7677c01880b3e85d2d0e3fbd6dc6e99e437ddc736f92b5a2ff2927e0b442142f0897d0b8a19ac203633df413feaf8ef50a5f767bedaf20f1c13f3b89d1e8b7bd18d591f9de116ee34f9824e4ead1ae9da2e8caaef88b29516aa942de77a7467b6fb26a666f30648c715a2ee9f946743b543a4428e0dfd06178e7e93ec6f26e003e058bec14a4aa2e3b8de11295a764cab30b313fcc5743b2fb89962ddc5cdc6aa0d2e4a306e77af76a05a598923f628a85df1cc73ad3bc01c4b979bd7cb296590a88b0a41b445d50a08423e4ed80f1763c716b6c457d845dfaa68d12b0d03c55fde8ae6b2b92bc6322943dbe54c706bc8e5fcee70654b26f3bfd877f5f5339ac182d5417bd4c0735d825bf70e85eab8216edda632ae7e22b3e53d078a8b20b5a7e2385337cf92b3c16b023563e11cb5043b704d37eb5ed9e85fcdc95cf7a6eade40803175a008ef653ac6136f16129abae1137c5823400748a81256254d317cfc939e26ea0cef9f6548db42890c48beb0479103ba089e514118038b1b90943d716f7a8d4cda5983a674b83a002d8ac9c65734a28b77b760c8e3803f8781ea9199f797ce729e06bfffe8c29b20bc85227c09cc05219ff2ba38e18051083732f83cbfccc310756450b261d5be183d9fb44ec18529f2cc9848c40119c607676bc4d9015fd4bd2fc918dc8031ec19a05ff362c184043be7fe066019ac5", "signed": "c0ea074bf9addee2e3350a969e7c569e3aea1a4188ee5af34cb73f388298653d299b5dbd94163fba209e8f7dc2e2634d3a52a02810a88c6152945bc16bbdfb0c6c63edbd40a03874ecaef81602cd6850c09f4915b7aaf418258c568364538e8392a8c379838b0c95345bf64c3dbc175853fb641f350f0b53a05a8ec290288c0326d435ff776f8683a273333f9bb2802184ecc53b06b28c2c402a54bf134c1a23299749a6ce2b51a7ba22232148797e993ff258286e947778a8742d3f36cc7842976043fc23da8a97ecb9715fc05fb0f23fa7321ddc1932861631604eba2ef25d8b756ce4733656bfd1e14708923ac7c60a79846136d741973ba5514189720bc0f7774b7bd3574595bde2515031b25b62654b161035778070ace14971df1fe0be4ea1ef55cf8747d3716c1ce707b1a7c8520e6deb334eb186338fc93000768eb2be40c6e0dc3f5df831b32c3a2c33e28898d6762a1522d3d48daee56a0269bddf6cfc9d73f8d178aeccbffef7ce164f98afea224a9b60ede46a95fadc9fc5d94d209c166d9b8de253381ea2248862946b9cf534947455c24458cf56683a0ec47a2c65075c694c7c3d6adf9ae5e8ad31ac769f83aa26e312c5b01a9a09404b15b814baa7666b3e03f06a8d6348ab8ccb9b60a4a4faf86f7135df039d955c07bd92e7b8e327ee6c1b40196a28b4446aa5a9b2b9773ab76e3ce21180f09d6c08d277c6771d67e22d84540fa43b38f634cfc46e5b8c33f15a568a77e4914aad9ab8c9f7fea47f7677c01880b3e85d2d0e3fbd6dc6e99e437ddc736f92b5a2ff2927e0b442142f0897d0b8a19ac203633df413feaf8ef50a5f767bedaf20f1c13f3b89d1e8b7bd18d591f9de116ee34f9824e4ead1ae9da2e8caaef88b29516aa942de77a7467b6fb26a666f30648c715a2ee9f946743b543a4428e0dfd06178e7e93ec6f26e003e058bec14a4aa2e3b8de11295a764cab30b313fcc5743b2fb89962ddc5cdc6aa0d2e4a306e77af76a05a598923f628a85df1cc73ad3bc01c4b979bd7cb296590a88b0a41b445d50a08423e4ed80f1763c716b6c457d845dfaa68d12b0d03c55fde8ae6b2b92bc6322943dbe54c706bc8e5fcee70654b26f3bfd877f5f5339ac182d5417bd4c0735d825bf70e85eab8216edda632ae7e22b3e53d078a8b20b5a7e2385337cf92b3c16b023563e11cb5043b704d37eb5ed9e85fcdc95cf7a6eade40803175a008ef653ac6136f16129abae1137c5823400748a81256254d317cfc939e26ea0cef9f6548db42890c48beb0479103ba089e514118038b1b90943d716f7a8d4cda5983a674b83a002d8ac9c65734a28b77b760c8e3803f8781ea9199f797ce729e06bfffe8c29b20bc85227c09cc05219ff2ba38e18051083732f83cbfccc310756450b261d5be183d9fb44ec18529f2cc9848c40119c607676bc4d9015fd4bd2fc918dc8031ec19a05ff362c184043be7fe066019ac5", "signature": "c0ea074bf9addee2e3350a969e7c569e3aea1a4188ee5af34cb73f388298653d299b5dbd94163fba209e8f7dc2e2634d3a52a02810a88c6152945bc16bbdfb0c" }, { "secret_key": "eac0f06c2c14f37d434bc99897225dd2e3f1ed74aa7442c550339df77d0b7b32", "public_key": "43e62055db6e1349c94d89029187882020cbcf9d75e03eb656fa0a15b19002d7", "message": "27b7fd0e71adf194cf5407b6771793060de0fca7ca0ae64835c43187408a704f533d5ea0c83a654387ba7db16ed58ec837226df57c1fe6382c5919e92213f6f18cbb5735d178a476af35d390b7cd2556217c530f3a1f8ab2339c1a5e8d969387efd39414b56bb784dfd5eb89b859e1f403a238eca2a941e6db56ac456b73450698d1455ec1e9b39a1e907d6bc7e6cff424a28eed579af16310115b67f5fcf7f8346b3fa0260c6da2e27755aca570babb3d303cc832460c963bfdd5c1ffb2fc19921929dda2a717fbcbeb2b8525761bd660ce4a0f7685285d7fad6115ab09f8e63f5f773914494e20be1b512d1114cce3f0f68c7d94f54857694f22af4c698d782ce837b0c1722bb7313bb2c41f6d3dd1a02877fb4296d8662a9e8625984dc1fd1a9510eba9d643ac58a886a045cd0e53c056a833f968b35d01320e9cc0b435d3f6bfad26f9eb5754d38ddf6d5c4bf615a7644a23f9826bcc976092d82d81d547000de0081b7a40a93fbddac13f7d99708ccdeeb9405cd634ca0748cad2c1d8f164f5d77a4f364ae488bedcf1f20eb954bc8a278af81432417856a900f8f152921afbe17914229a513bd71ab7e661cde129af93e25094c56118ed1f22db644428b474651fe36be82fa3695c41fc8699667e053743b0a41155c31f1e2679c6e8cb9c9d1f5f4b40a320a9fd9f47da9b94211ba601b22a115210d9f559c4496f01732458f49ac34eb386636c8b6c68c7bbc0078ab6f398a624b8bafb1c622958562d231dffd4db096196bb87479e42ea22acbdcde8deb10e311632f02fca14787fd3140569b9428991543ec6e834e10b149f23c74bb99ac7b3799a2096d22e387a712b6f9011ea34c5be4c468581ac62ce662063252e066a9a3b15c9570d065dc1619929f06bc75a3179468bc8a16e3ddc4fe185ceba0a92a546b8675fc1ade56307150c7e4c844f6aa5f1edbfb54ac632ca2b259c32a33ee2867856c3390a6740364cb0dfb976e53d0cc6c42a106a1c26918c8a6a033b2aa3c7f2e4392e79f8eca5b336bac5061d7698a3bfe7c2c292892554030de6ce7c0d06eefc54906f81e0097fcff27d14b9b7994a7970e1a5f5c6b6405dca22033dff0eae138ad899f6ee68120b8f22744b0269a9a8989b6f7e08affae77bca2168ade24058ae68a7f800e02e7c38391baf565dd40b55fa3ab3c247b9ceb4d967471775e663d6a1c6c7e17350bbd6b9a3eb1e484ac2e7a7a5c84f5083e5ace8730de89c47e8dcf8341e40ba345dbd66bae0f7f076a705b1bb7f470e3edfb2b78e4d6359413d18d33280b454a0dbb881d8606726fa9bea272475e79fea6a54cb4c0619541b4e77c170c8616874b954beb8d105b86bd1917e25cfba9267187ee2038b3f0078f4c318b587cf44", "signed": "45f2803afeb0fc44d3aa965b12659bf502e47295706184b2a1c6f16d050613f596a2001394e00e2a44c46cf6505d5cf5b8ab8412f07eda951a15005e338f3c0e27b7fd0e71adf194cf5407b6771793060de0fca7ca0ae64835c43187408a704f533d5ea0c83a654387ba7db16ed58ec837226df57c1fe6382c5919e92213f6f18cbb5735d178a476af35d390b7cd2556217c530f3a1f8ab2339c1a5e8d969387efd39414b56bb784dfd5eb89b859e1f403a238eca2a941e6db56ac456b73450698d1455ec1e9b39a1e907d6bc7e6cff424a28eed579af16310115b67f5fcf7f8346b3fa0260c6da2e27755aca570babb3d303cc832460c963bfdd5c1ffb2fc19921929dda2a717fbcbeb2b8525761bd660ce4a0f7685285d7fad6115ab09f8e63f5f773914494e20be1b512d1114cce3f0f68c7d94f54857694f22af4c698d782ce837b0c1722bb7313bb2c41f6d3dd1a02877fb4296d8662a9e8625984dc1fd1a9510eba9d643ac58a886a045cd0e53c056a833f968b35d01320e9cc0b435d3f6bfad26f9eb5754d38ddf6d5c4bf615a7644a23f9826bcc976092d82d81d547000de0081b7a40a93fbddac13f7d99708ccdeeb9405cd634ca0748cad2c1d8f164f5d77a4f364ae488bedcf1f20eb954bc8a278af81432417856a900f8f152921afbe17914229a513bd71ab7e661cde129af93e25094c56118ed1f22db644428b474651fe36be82fa3695c41fc8699667e053743b0a41155c31f1e2679c6e8cb9c9d1f5f4b40a320a9fd9f47da9b94211ba601b22a115210d9f559c4496f01732458f49ac34eb386636c8b6c68c7bbc0078ab6f398a624b8bafb1c622958562d231dffd4db096196bb87479e42ea22acbdcde8deb10e311632f02fca14787fd3140569b9428991543ec6e834e10b149f23c74bb99ac7b3799a2096d22e387a712b6f9011ea34c5be4c468581ac62ce662063252e066a9a3b15c9570d065dc1619929f06bc75a3179468bc8a16e3ddc4fe185ceba0a92a546b8675fc1ade56307150c7e4c844f6aa5f1edbfb54ac632ca2b259c32a33ee2867856c3390a6740364cb0dfb976e53d0cc6c42a106a1c26918c8a6a033b2aa3c7f2e4392e79f8eca5b336bac5061d7698a3bfe7c2c292892554030de6ce7c0d06eefc54906f81e0097fcff27d14b9b7994a7970e1a5f5c6b6405dca22033dff0eae138ad899f6ee68120b8f22744b0269a9a8989b6f7e08affae77bca2168ade24058ae68a7f800e02e7c38391baf565dd40b55fa3ab3c247b9ceb4d967471775e663d6a1c6c7e17350bbd6b9a3eb1e484ac2e7a7a5c84f5083e5ace8730de89c47e8dcf8341e40ba345dbd66bae0f7f076a705b1bb7f470e3edfb2b78e4d6359413d18d33280b454a0dbb881d8606726fa9bea272475e79fea6a54cb4c0619541b4e77c170c8616874b954beb8d105b86bd1917e25cfba9267187ee2038b3f0078f4c318b587cf44", "signature": "45f2803afeb0fc44d3aa965b12659bf502e47295706184b2a1c6f16d050613f596a2001394e00e2a44c46cf6505d5cf5b8ab8412f07eda951a15005e338f3c0e" }, { "secret_key": "e608d5de9797907db6d98e0345d5caf2ad33e0eddebf18b81d61e8373ecfb499", "public_key": "60e0c16ada586e3646912a5f2bb318fbc3d50b57d36fabb637696f9d8d4dc761", "message": "e610fa7d8385c09c78989ed5ef7a230547f013cb7e8ddf31749ffc31cee10ab3efaca3f14ea194510f0985a818ef8b040e10c3a5114de1ac080f14c3d65d3c244f9242f75492cabae800fcfc9bc275ea1f27728c920c258fe7aa73948060299cb87835792edcc072150b73cefeb0d51562e53b46810e27a4d7f6abd32e959f7d731dde01d94bc41ed835efcd42c922437037a87dd366ffad2eecab6abaeb4fcf07392b3ab40cfaefeaa4266bc537671693c9093dabe8a0538cafd12c639a04bd2ba80ce0f29adbfc66bd4637ca0543a53b0e371d0e2e470d31ba360642a45ab4cfe3e790f587f6c5a5583fd15b18997838a200921c1c399c0b16278b7dd6d3aaab6f325b16afdf761a1bbf867de2bdd48615f15b526770ed20d79f0f30714beeeda58f52a3cc0c5a618315e522b9ebe7cd99b65ed532a62e0f0df72764d6ec6d6d1ba40ef40e05426360795d6dd85bb39f7321d3fb06275de096aae4a2fa2293f31b33f4ad4d7c251ac13e8e15c2bfb1f98f4962c54b6ce033b08aa626f2905d463f55b71cbdadecdb3e0b365dae07b170301983aeb83b1e9f2f28cf65419fd6b0a1a9c26cb54b5949f4bc01a98681844b43034c372a453d38f0473d0ddc709d9f49c8753a75b856c7e9775517df574a09a3953bde5daedf8e4a8da9d773a215120e269fa1861133cd4ceaeb91d5cca2606325458e50cb966d14055b22447eb65dc10118da0831df28c3b4ee8b11f0732f1521bb9482b11f5a86b22f18e83dd1d967d3944285e5d63a5a989817ab2418bc7ed891a373846747a12b527c2f44ee0197b946c67e67fa4aa1c29f3379d46fe07d3aab83da17f9d76bedd38436a055e34ca1d3af5a8754d38c17b9ba4e6419cbab515f431a2595954e428c2670fae3bed62b4596179cb59e21108708d071bcf9c621c6dff03d3cdc9202029454013b9d133847f26544811c0169770fdc6fe5638bfd7a720d8b38f7e30a7e6879060b5f28c8ab17b00200713207e8637bff4844d842d9ca788391340198a3fe0172dfa74de1e55adefbc2e9bc7e885476d1b9c055813408a47528434355bf03fdd4e27d8b3461b0fb66ab3e15a879a184457e9ed9ea6c51b663b31edc8c4a3cd454f69d9ce518d1b87888ee3d9dd5416e43e114ac05721352dffc2ca88597377bbc414009b0c2fd369be5ba35a6dce3478b6c11b33c0a33918b6ee5ac4cd4c2f1ca6bd190a000a838da38f53077560335596d1358937793963810a79a21b8d46140e768898dcda88a0faf8ddd0d633847aaea0e030be6455b41e3ede1e2873730eb8481acaa7a519cf9195847a86afa57f9071d44f4af4ca0d343c90c0d22d946146585f00ef3aef57f0f9e55e818c0128ae255dbc3116cf0fe02166d54859decbfdccc", "signed": "0d8f095e42a2730a3c7bedf42d5c83398b5c0ee9c77c5a61d982291396a9182a0802a37f324bc4fb5d4aa4ed60444b66144bacbc865105d7690f140650691d03e610fa7d8385c09c78989ed5ef7a230547f013cb7e8ddf31749ffc31cee10ab3efaca3f14ea194510f0985a818ef8b040e10c3a5114de1ac080f14c3d65d3c244f9242f75492cabae800fcfc9bc275ea1f27728c920c258fe7aa73948060299cb87835792edcc072150b73cefeb0d51562e53b46810e27a4d7f6abd32e959f7d731dde01d94bc41ed835efcd42c922437037a87dd366ffad2eecab6abaeb4fcf07392b3ab40cfaefeaa4266bc537671693c9093dabe8a0538cafd12c639a04bd2ba80ce0f29adbfc66bd4637ca0543a53b0e371d0e2e470d31ba360642a45ab4cfe3e790f587f6c5a5583fd15b18997838a200921c1c399c0b16278b7dd6d3aaab6f325b16afdf761a1bbf867de2bdd48615f15b526770ed20d79f0f30714beeeda58f52a3cc0c5a618315e522b9ebe7cd99b65ed532a62e0f0df72764d6ec6d6d1ba40ef40e05426360795d6dd85bb39f7321d3fb06275de096aae4a2fa2293f31b33f4ad4d7c251ac13e8e15c2bfb1f98f4962c54b6ce033b08aa626f2905d463f55b71cbdadecdb3e0b365dae07b170301983aeb83b1e9f2f28cf65419fd6b0a1a9c26cb54b5949f4bc01a98681844b43034c372a453d38f0473d0ddc709d9f49c8753a75b856c7e9775517df574a09a3953bde5daedf8e4a8da9d773a215120e269fa1861133cd4ceaeb91d5cca2606325458e50cb966d14055b22447eb65dc10118da0831df28c3b4ee8b11f0732f1521bb9482b11f5a86b22f18e83dd1d967d3944285e5d63a5a989817ab2418bc7ed891a373846747a12b527c2f44ee0197b946c67e67fa4aa1c29f3379d46fe07d3aab83da17f9d76bedd38436a055e34ca1d3af5a8754d38c17b9ba4e6419cbab515f431a2595954e428c2670fae3bed62b4596179cb59e21108708d071bcf9c621c6dff03d3cdc9202029454013b9d133847f26544811c0169770fdc6fe5638bfd7a720d8b38f7e30a7e6879060b5f28c8ab17b00200713207e8637bff4844d842d9ca788391340198a3fe0172dfa74de1e55adefbc2e9bc7e885476d1b9c055813408a47528434355bf03fdd4e27d8b3461b0fb66ab3e15a879a184457e9ed9ea6c51b663b31edc8c4a3cd454f69d9ce518d1b87888ee3d9dd5416e43e114ac05721352dffc2ca88597377bbc414009b0c2fd369be5ba35a6dce3478b6c11b33c0a33918b6ee5ac4cd4c2f1ca6bd190a000a838da38f53077560335596d1358937793963810a79a21b8d46140e768898dcda88a0faf8ddd0d633847aaea0e030be6455b41e3ede1e2873730eb8481acaa7a519cf9195847a86afa57f9071d44f4af4ca0d343c90c0d22d946146585f00ef3aef57f0f9e55e818c0128ae255dbc3116cf0fe02166d54859decbfdccc", "signature": "0d8f095e42a2730a3c7bedf42d5c83398b5c0ee9c77c5a61d982291396a9182a0802a37f324bc4fb5d4aa4ed60444b66144bacbc865105d7690f140650691d03" }, { "secret_key": "0e86872c78620f10cb6dfc463d2c2872c4da660748c9cda01ab1456958afba7f", "public_key": "de4989989269cabd8f4f409cf1a4d974038b275502273557f312d5553fab93c3", "message": "a900f3e9c643a5649b076fb69c3b2ac084d52ccbafcdca5a9db1daa70500de9933d23d153f74954e1bd5f57b899fe8a4b134c195412b49833b6e5095a6554eaa6d844b11f1584c85055b87f41c999669046c71aeb5c0453fd6a3c437f815f068987c3868cc07aa2af65819046c307bafb7530de84f7130aea78ef005d5fff52f8deaf1d5e9c326d3217fc55b94f628aa104f6a24a395e62d1b62bd9c0d82436319c5d73e5765435f3ba856a4734fd60ae617f7f0c3ba5722a73366c88a6dfeca85c444639f441f2c55fdc464ecb299eee36d8eae063bb94bb2439da04fa5ebc5092338a5035e480f0834aeee8d711f28c46dc960de1be9df307c18c5c178b26296dc567f15bf60863a36710867e92fd51048865674c2af0c53b2e7a248ae5bd09a49aa030618495f82480c420ae106889bec006278b92272075709fec95487cfb10061e6722b93eebfc0bc587bf7ba5f6692b074f55a98d5c302760b1bf1d09f7e8668479ca6f01eeda2fdaf584ac2058fbf7cf3100d06b8091bfeab51c0c0b1d4ee3a8257f69b1617604fce953bb5f7f271c6a1880ea1b3f66267e2439f34580628917877c66ec0fed76e44e8bb2b91a8806df4baca6cc92889b8805070c9a617f807157530751cc17c47b09eeba94d22b4e547c370ce7a496fcaa3412affffb8c9b4de89b9f121aaec5f544b0c725ec5ee9d4b3476adc9d050edb0fdbaf02ca9e38af15f515015a267292ec9aa5444ed1decd9cd9e1ead6487a0ccef995b1c600a036935838660acab276d8b0e5b07d9f36353214bf80f941ac88cf40a08af917926234112eccdaa162dc99de3e25baff65bb01e49898986332bdc2d705d5aea40f9bc4fbb2806894496038da236e9dc29600c9cedeac3b616cc56d89ec2fa67389666c6c4fe233b639105023e101b874a6330fe573f80ace55d037cc612e6dfd5a6e686f9a83054fc46e15bb6da453d810cf138a178bf039d1e181614ff40cbe6bb3b473663752ea8025ff7f739ee4b67110f968089b2473cd044d48b009d0677f791f54e2df6afdc3acb9e99dd6958a450c0e1b6dd5e97a2cc46298b4f48ac6adaf013d75b2c42072d2ee13f733687ee83c3f70c4fdd9720fd1798c662fef3ba012bedd445c4729f2130484fe77ac1b4c4ddeb81faf60f76e3bd7d21a9a6c57a69a9cd9cc203fc63b59ee84b8915b3c18a5954e227c86ebbb7d4c4c1a08d0c5e467c68a06970751ef584bdd611e1dd1b48900ab354b99cec6e1df3bd4146ea0755350dc11c3a3f600d470a74f475e4feedaf0865276fa8a97713471d0ca9955c713588339dee79656e567e6ab1dbf9830703817ae620929a0684a5caf20fef81a8ee897be7e505ade6496b9aef0272bd8f350860233b338c2e36d3138db69538", "signed": "2037e97741c3e6409c66fc6782aab389c5d778097ac778999e8576e49ef4f6a0c7730bd9e093dd3c0ae7ec76203380da657147d33a8d9dd65ed00cf76224d601a900f3e9c643a5649b076fb69c3b2ac084d52ccbafcdca5a9db1daa70500de9933d23d153f74954e1bd5f57b899fe8a4b134c195412b49833b6e5095a6554eaa6d844b11f1584c85055b87f41c999669046c71aeb5c0453fd6a3c437f815f068987c3868cc07aa2af65819046c307bafb7530de84f7130aea78ef005d5fff52f8deaf1d5e9c326d3217fc55b94f628aa104f6a24a395e62d1b62bd9c0d82436319c5d73e5765435f3ba856a4734fd60ae617f7f0c3ba5722a73366c88a6dfeca85c444639f441f2c55fdc464ecb299eee36d8eae063bb94bb2439da04fa5ebc5092338a5035e480f0834aeee8d711f28c46dc960de1be9df307c18c5c178b26296dc567f15bf60863a36710867e92fd51048865674c2af0c53b2e7a248ae5bd09a49aa030618495f82480c420ae106889bec006278b92272075709fec95487cfb10061e6722b93eebfc0bc587bf7ba5f6692b074f55a98d5c302760b1bf1d09f7e8668479ca6f01eeda2fdaf584ac2058fbf7cf3100d06b8091bfeab51c0c0b1d4ee3a8257f69b1617604fce953bb5f7f271c6a1880ea1b3f66267e2439f34580628917877c66ec0fed76e44e8bb2b91a8806df4baca6cc92889b8805070c9a617f807157530751cc17c47b09eeba94d22b4e547c370ce7a496fcaa3412affffb8c9b4de89b9f121aaec5f544b0c725ec5ee9d4b3476adc9d050edb0fdbaf02ca9e38af15f515015a267292ec9aa5444ed1decd9cd9e1ead6487a0ccef995b1c600a036935838660acab276d8b0e5b07d9f36353214bf80f941ac88cf40a08af917926234112eccdaa162dc99de3e25baff65bb01e49898986332bdc2d705d5aea40f9bc4fbb2806894496038da236e9dc29600c9cedeac3b616cc56d89ec2fa67389666c6c4fe233b639105023e101b874a6330fe573f80ace55d037cc612e6dfd5a6e686f9a83054fc46e15bb6da453d810cf138a178bf039d1e181614ff40cbe6bb3b473663752ea8025ff7f739ee4b67110f968089b2473cd044d48b009d0677f791f54e2df6afdc3acb9e99dd6958a450c0e1b6dd5e97a2cc46298b4f48ac6adaf013d75b2c42072d2ee13f733687ee83c3f70c4fdd9720fd1798c662fef3ba012bedd445c4729f2130484fe77ac1b4c4ddeb81faf60f76e3bd7d21a9a6c57a69a9cd9cc203fc63b59ee84b8915b3c18a5954e227c86ebbb7d4c4c1a08d0c5e467c68a06970751ef584bdd611e1dd1b48900ab354b99cec6e1df3bd4146ea0755350dc11c3a3f600d470a74f475e4feedaf0865276fa8a97713471d0ca9955c713588339dee79656e567e6ab1dbf9830703817ae620929a0684a5caf20fef81a8ee897be7e505ade6496b9aef0272bd8f350860233b338c2e36d3138db69538", "signature": "2037e97741c3e6409c66fc6782aab389c5d778097ac778999e8576e49ef4f6a0c7730bd9e093dd3c0ae7ec76203380da657147d33a8d9dd65ed00cf76224d601" }, { "secret_key": "520354d85a87d7c22ca6f784714410ec98bf6a65f803ef9379bdc804359b2349", "public_key": "d8511ceac2fd661acbffb01ba2741cad889934de6392961bdec6fa46123b7f0f", "message": "a1d4ad486ebb7c1a0acb8f117013e8e4746789c6244a56c9edfbf1ef37ac1309aaf51c9375fc12cacd6897a4479545f2bf390ab7c0c0e5c592f5506e9938378a11b636bf857029b968547aa506c4a0829a15fd3995fead4f860fd7c623c63e8695436eae55816414778347092f5f4d422bb1b5e5a06966241efec14f1e4fca06639114718c30ebcadd4c6d8abe7fe93b25d17173533954188b1ab03fcb7792cb635ce36e9bdbdde7a561c5f66920d910cb269c8c1c3f593265090072c48932e692a9c738c704897489a715c2b394d5a86f7036a4cac5dcb5b85cfa162156e0bc6bfe02fb4c38608cfb23c92b8b6a3cb46e487d60e0dc97aa2e33e3dada925e4e6612cc5af125e5aca45817a2fd6c3ff10b18938b44bd4dd20d7fccf7f26b40a66f48aaffc9a541e6d37138fc55469868e2d10365eff37fac360fab3dc55437ac2d8fea7474405fb3630f7963d2d45958f909d14830286ff152aa752f510ce980bd5754e3fa32c69924dd95d5c152a737a8fadcfd0a4560e0b114f8e8aaa618d438b9877111da1740ef817c441939ecec799ba16b1b171ca9b649b7d78fa052d1497a507688bede4900abc53a9648da5917035ceffe0da21c25c09b06d6185bdda2d778f7ede6153e3eaff495c9796d4d166d2d2ea418e4a4aa6e678faf0696e752a09e02eaade763070e088e9964919ff4aa4c82f8629a3d5c797c2a64594d206835da0bfa43ccd9ddfcdb6aac4d486e03c84122375939a5270bc1519e0707e51c3f46f1e5c566b33a245fa0c202838472363de9f0edde2e791d82293095f750bff545e6c34739dcc54db0a36ae2e2aa39b07cb4f6a9646240d2d31488f67815b29545d220be929e3339f8281a937e05a8c5c3887e06048ea7b18a48f8d91b1e3af5cab5ceda0ebd71bf54edec203d37165e4c9f9f80461cd29fcd99ddea439693941b5d53ff94379cf642571dd559a11f8f383d943f2255cf715800af776b1045bf19a9c9bb095155dfb646b65f4a280f2a97ef927ddabe24a2f971a8170dd42a089276825cb9148c015aae1e9dadf22c10e7548c59bf6b868b20e86c83a9e7343aec2754ee6225f9fdceaf8e51c40e955bda49c35ded38fa8bcc1e6c8fc9c2412e9104c5c2368b1f9923e010fa2ede911d42b139f4007e3426922ffb6158eca97b47cfc997853512bb9d4ca2f017c2c263dc199f3bf1eb4f1508ef828b0e00db21002736a7f22ec91298194583139ad75f58e21b518daa49a4076c6375faa60891a69e52a656699d8034a7ab7fcbe42175491441fe61b1783e837857522215a5fac5590bed2e9d206606096d3be8ee92873bfc30cab15ce9f9910d01a117f89926cc3afa8d104f799ff38098de28b8ff0f038725c2903b24c1429cea4925249d8781", "signed": "754e60d3f6f4ab4f5d0ddbb001532009166388487f780b76f60bd0bc9fefabfaab6be2ae7869573a64796ef2846e85e5cdae52db1044fefa796bacf48b968b0da1d4ad486ebb7c1a0acb8f117013e8e4746789c6244a56c9edfbf1ef37ac1309aaf51c9375fc12cacd6897a4479545f2bf390ab7c0c0e5c592f5506e9938378a11b636bf857029b968547aa506c4a0829a15fd3995fead4f860fd7c623c63e8695436eae55816414778347092f5f4d422bb1b5e5a06966241efec14f1e4fca06639114718c30ebcadd4c6d8abe7fe93b25d17173533954188b1ab03fcb7792cb635ce36e9bdbdde7a561c5f66920d910cb269c8c1c3f593265090072c48932e692a9c738c704897489a715c2b394d5a86f7036a4cac5dcb5b85cfa162156e0bc6bfe02fb4c38608cfb23c92b8b6a3cb46e487d60e0dc97aa2e33e3dada925e4e6612cc5af125e5aca45817a2fd6c3ff10b18938b44bd4dd20d7fccf7f26b40a66f48aaffc9a541e6d37138fc55469868e2d10365eff37fac360fab3dc55437ac2d8fea7474405fb3630f7963d2d45958f909d14830286ff152aa752f510ce980bd5754e3fa32c69924dd95d5c152a737a8fadcfd0a4560e0b114f8e8aaa618d438b9877111da1740ef817c441939ecec799ba16b1b171ca9b649b7d78fa052d1497a507688bede4900abc53a9648da5917035ceffe0da21c25c09b06d6185bdda2d778f7ede6153e3eaff495c9796d4d166d2d2ea418e4a4aa6e678faf0696e752a09e02eaade763070e088e9964919ff4aa4c82f8629a3d5c797c2a64594d206835da0bfa43ccd9ddfcdb6aac4d486e03c84122375939a5270bc1519e0707e51c3f46f1e5c566b33a245fa0c202838472363de9f0edde2e791d82293095f750bff545e6c34739dcc54db0a36ae2e2aa39b07cb4f6a9646240d2d31488f67815b29545d220be929e3339f8281a937e05a8c5c3887e06048ea7b18a48f8d91b1e3af5cab5ceda0ebd71bf54edec203d37165e4c9f9f80461cd29fcd99ddea439693941b5d53ff94379cf642571dd559a11f8f383d943f2255cf715800af776b1045bf19a9c9bb095155dfb646b65f4a280f2a97ef927ddabe24a2f971a8170dd42a089276825cb9148c015aae1e9dadf22c10e7548c59bf6b868b20e86c83a9e7343aec2754ee6225f9fdceaf8e51c40e955bda49c35ded38fa8bcc1e6c8fc9c2412e9104c5c2368b1f9923e010fa2ede911d42b139f4007e3426922ffb6158eca97b47cfc997853512bb9d4ca2f017c2c263dc199f3bf1eb4f1508ef828b0e00db21002736a7f22ec91298194583139ad75f58e21b518daa49a4076c6375faa60891a69e52a656699d8034a7ab7fcbe42175491441fe61b1783e837857522215a5fac5590bed2e9d206606096d3be8ee92873bfc30cab15ce9f9910d01a117f89926cc3afa8d104f799ff38098de28b8ff0f038725c2903b24c1429cea4925249d8781", "signature": "754e60d3f6f4ab4f5d0ddbb001532009166388487f780b76f60bd0bc9fefabfaab6be2ae7869573a64796ef2846e85e5cdae52db1044fefa796bacf48b968b0d" }, { "secret_key": "061bcf1aa6fd989897b322e591ccef5454ef4a5adb1a4800f32611cff2b5bc78", "public_key": "73c80b734bfc9417d576890c20166da5c7fabd613f75474f7649732e00295be2", "message": "d63bb9208c1f4c7d43326cf35fa5d83933151804ab891d49b0bdaf429e4c39a321428e0d90aa00318b97e08c7024c912cf388879f3cf974bb253a1e7a4c8eec193bf4c14af6fb9794df0d497850edb04d574c97ed76c702139968401b40eb54394ef4cfaa7e5d3cd943af12192538ddee593c2a24a267afa1371fd77feee2071f4369fbef87976e7ebd81d1e5b31d6e09e02d830357d36bff8596703e4146d0827bec9c0f87b26f31195c96c93b6d8c46767ec1bc6de39f0008a41ff875da050a3f865ab92cbf29c38a280f3bf69f68e92b5f430cdee3501981d0b3d189096e0aeacd64c33102421348812158bb61e51ae936592b2f8f1b910949ef3723258a9b44e4e1bdadf1ae2cfc18e37d2ed0dd1734404b8baa5f393cd56069ecebf7edd7c06cf6c8aa3e8e12fbf946d7b32d8453b6fbb6535526c8fb8fc1d5815560bb31b995df2adbd836add929a56fdd93a1747d93a40c05e129eb6f8583c2921cc9dbdda4225e176db386a02ec40af1032c9b62e95147025f4ac8dd58433b64ac073150c69b9c4154dcbb00344f308113cd9199ccfb5075801c705b8fc43b7c8bc167365e46293d06c4f4835c64ee5d5383f6890ca35a80af917748162df2518ab1468f153629899406cde66ce07fa7d2993dabe0c60089c91892488f3bcaaec408a0cd08c9aa98e0937e02c41ad52d241a99833e3b83f7d3f1b078c31d45c34fa0175abbd0f322b8fd2dc83491da292ad00762e3e577b9eee0aae08729070ac25e33bc94525bc0d2ab59704efec5c0148421a47928d34b1e45ce721ee6447fb082ac400b3e6846d204f7f9db6f0a32b2a69738b3ee9ddbb0dbd7e0f041d7ea53a5d647fb50b39ae24d78c8b07cfc4e052711f0d4639e721d5c36f31b588866712b757108a40cc7abbb9913083303aae05a0f1af0ec6878441a25cf8729aba42a3a94ce9b73888a0f5c9e40c9fc45410f0681fa7f90898562ccb4bbc55f0ab1fe9c70ea66026dda8d7090f7b38edb5aec1557b1166987cd41a7059cdee609b74d8fe06b7059b7724bff53007f7e110462f06ad14d07ee1b4d69ac823bcf576d2fa9e2e8ed7f3198040d471296063137c981adbf364cb20f0a1ad2054472f7cee2527f99809615d2e4b734b06f35deecbd62619663dde81d6e23528b0c97132af0a23bad63d9c08142a26e2743f8618ecfe723b19ffdd0b19abd9a3f4fe210b1e71acdfe38abebe23f7fdef66381cbc75f307e5577235b02e4cd9cfaa15030868ed1453da58f783b7352b04656844c042441efe6a3b4f8fec8f7de80744540c4fc7a107f4e1bfcbd99da25b9746095ddf0125d56da7e7f8603f04d359a088b4c044f936ccb7d8f89ed53cc991a3497ca952094ff3c33046f2609d07b29b633981369cb2f0eecd", "signed": "5adaa94330a0353712a34dbe973b7518f9a2c713f8aad100251b086ae8de26f6d2b6ccf0528cc5dedca318df19cc7e45deae281e1324b96e32fef45aaf60b10cd63bb9208c1f4c7d43326cf35fa5d83933151804ab891d49b0bdaf429e4c39a321428e0d90aa00318b97e08c7024c912cf388879f3cf974bb253a1e7a4c8eec193bf4c14af6fb9794df0d497850edb04d574c97ed76c702139968401b40eb54394ef4cfaa7e5d3cd943af12192538ddee593c2a24a267afa1371fd77feee2071f4369fbef87976e7ebd81d1e5b31d6e09e02d830357d36bff8596703e4146d0827bec9c0f87b26f31195c96c93b6d8c46767ec1bc6de39f0008a41ff875da050a3f865ab92cbf29c38a280f3bf69f68e92b5f430cdee3501981d0b3d189096e0aeacd64c33102421348812158bb61e51ae936592b2f8f1b910949ef3723258a9b44e4e1bdadf1ae2cfc18e37d2ed0dd1734404b8baa5f393cd56069ecebf7edd7c06cf6c8aa3e8e12fbf946d7b32d8453b6fbb6535526c8fb8fc1d5815560bb31b995df2adbd836add929a56fdd93a1747d93a40c05e129eb6f8583c2921cc9dbdda4225e176db386a02ec40af1032c9b62e95147025f4ac8dd58433b64ac073150c69b9c4154dcbb00344f308113cd9199ccfb5075801c705b8fc43b7c8bc167365e46293d06c4f4835c64ee5d5383f6890ca35a80af917748162df2518ab1468f153629899406cde66ce07fa7d2993dabe0c60089c91892488f3bcaaec408a0cd08c9aa98e0937e02c41ad52d241a99833e3b83f7d3f1b078c31d45c34fa0175abbd0f322b8fd2dc83491da292ad00762e3e577b9eee0aae08729070ac25e33bc94525bc0d2ab59704efec5c0148421a47928d34b1e45ce721ee6447fb082ac400b3e6846d204f7f9db6f0a32b2a69738b3ee9ddbb0dbd7e0f041d7ea53a5d647fb50b39ae24d78c8b07cfc4e052711f0d4639e721d5c36f31b588866712b757108a40cc7abbb9913083303aae05a0f1af0ec6878441a25cf8729aba42a3a94ce9b73888a0f5c9e40c9fc45410f0681fa7f90898562ccb4bbc55f0ab1fe9c70ea66026dda8d7090f7b38edb5aec1557b1166987cd41a7059cdee609b74d8fe06b7059b7724bff53007f7e110462f06ad14d07ee1b4d69ac823bcf576d2fa9e2e8ed7f3198040d471296063137c981adbf364cb20f0a1ad2054472f7cee2527f99809615d2e4b734b06f35deecbd62619663dde81d6e23528b0c97132af0a23bad63d9c08142a26e2743f8618ecfe723b19ffdd0b19abd9a3f4fe210b1e71acdfe38abebe23f7fdef66381cbc75f307e5577235b02e4cd9cfaa15030868ed1453da58f783b7352b04656844c042441efe6a3b4f8fec8f7de80744540c4fc7a107f4e1bfcbd99da25b9746095ddf0125d56da7e7f8603f04d359a088b4c044f936ccb7d8f89ed53cc991a3497ca952094ff3c33046f2609d07b29b633981369cb2f0eecd", "signature": "5adaa94330a0353712a34dbe973b7518f9a2c713f8aad100251b086ae8de26f6d2b6ccf0528cc5dedca318df19cc7e45deae281e1324b96e32fef45aaf60b10c" }, { "secret_key": "2e19cd442f22a4a99dffc55e7bf625f89d1344b563f6785313a7eee973b4aa36", "public_key": "ee3da76a8fcf403a2958d4551da0a72b2e738522b2e6b20fba6aa26b32307357", "message": "1bfc5c6aa6a5354fbb861469796348ac6319124da3f10d20d50bbdc7159d41b5abb136c7996a773797122b525e8e2dca1954f6391707301d90f2101b46c7b086efa15877cadcd05812db34b996cb4f531abcd1e98db08a5cf1368e8f4b1109142e9562bd0085ffae5e660f59c930793ebdb6e80b0a2f4f3f59bf9d395c48d26e0a72a60f9d1ff87fd2d7a3f5383aa902adededebc6cd1befd038336162749d91a957ca2e3dd47091c5593113da87c3d66a02c80a6eddb535c48ca1f34a97fd1c95ebc2e570fc8fafe6e5d6546d1f3a9ba8daac334cf47bf117e1280d0ebdf14b0fcdbb43b8d248cc6b61320fdb0449ed5f5de8bab121af0d8554956e6a12016b42677b44367892c3b20afcc2cb9cfb5b100a95b51e8b07da9f51415f4cd7781a313765e20db27f2343e0f719ecea9af026956f3387e9ea7ed0a293759b4a262202807b41309fb80f50185db6a5f8bdca178841bec06addc7610df76017b514bc4142f26a36bf5bacecb012fa41710dd849bef7a7e451432836fe9b3265fd5b59ee40b04dad85cf48f891465a842cd4500a1024eefdf0f554f0ca17ec9f7b715256a9b9dbe27966386d8ac37d3c515896de0f7cdf7cf5b320ff7a8ef6b34ba820aba9066dd253c5b7763777f94b2d6ad8c710221e1137535dff8a1b7565ec81bd8ddeb502e3d58ff8f1fe6e86b8dc15a3aaec688bbbecd4688281db0f818de0f7261ba9cc58c8bc0d02e06632efe7287ad7a84331a824d9287344efaaa74f1fc576d0269430f856a8565265b9d6ef71fe134d2510ab06b60bf3c153b57ecfd2e6342403fe678b5886b6b734b7d3690662b6c8c6f6e250e5af6a8183166ddcd0a17f0cddc8636ef1a68498be50b6599539d46b4cea97130e08f94ca53e884644eda75d23cd2c038a5f17b591e21369378cd3fb5762d1a7c3e66a11ae6e91cbae616ad055e39dc41e154f4fced7b2696d9dc67380bb8eef474e9aa83cec47fafafb941d626564b2075bcc0856da8d6e1b0b8f18baf7513bbd14e491ed517968c4f7241af25098ee8df130b7a34d59736d7836d323fe3f43f508cdcb755895f59a00c804ed164cc33992f3aee962ae9e990b74272eb987b12d90b27314d57400e737d1343e970985c4271060876abcd7049e7c9fe244ff3ef98560995b7482d31bc7c09d9969f7cd41f4e4e252750dc16ccdb29b985314a0b6e749c95f9bd2838d5ac49ee031fd079bec3028dd9dd07db6fa622ad621b3b1e127e8fca37bd146e3cf703e911701b7a16c2d30369c94648ecc03df10d7dd5c0558fa9593425d948727d6860c3a14f811245106616d2a5fa981c6b7f47ec9def65412d132acc6919da4e88597aa9190ca614b218066a0f7b16997ee747c5a09785e50d0a891d95937863d613ceff7", "signed": "28326b5b978e0dbdab5dde703785a667a7ef439d81ea47e066b089d116c25a34bb633f260d55f45bdf6bcda74803d7624b1927cec18eb1992260beefc399d90e1bfc5c6aa6a5354fbb861469796348ac6319124da3f10d20d50bbdc7159d41b5abb136c7996a773797122b525e8e2dca1954f6391707301d90f2101b46c7b086efa15877cadcd05812db34b996cb4f531abcd1e98db08a5cf1368e8f4b1109142e9562bd0085ffae5e660f59c930793ebdb6e80b0a2f4f3f59bf9d395c48d26e0a72a60f9d1ff87fd2d7a3f5383aa902adededebc6cd1befd038336162749d91a957ca2e3dd47091c5593113da87c3d66a02c80a6eddb535c48ca1f34a97fd1c95ebc2e570fc8fafe6e5d6546d1f3a9ba8daac334cf47bf117e1280d0ebdf14b0fcdbb43b8d248cc6b61320fdb0449ed5f5de8bab121af0d8554956e6a12016b42677b44367892c3b20afcc2cb9cfb5b100a95b51e8b07da9f51415f4cd7781a313765e20db27f2343e0f719ecea9af026956f3387e9ea7ed0a293759b4a262202807b41309fb80f50185db6a5f8bdca178841bec06addc7610df76017b514bc4142f26a36bf5bacecb012fa41710dd849bef7a7e451432836fe9b3265fd5b59ee40b04dad85cf48f891465a842cd4500a1024eefdf0f554f0ca17ec9f7b715256a9b9dbe27966386d8ac37d3c515896de0f7cdf7cf5b320ff7a8ef6b34ba820aba9066dd253c5b7763777f94b2d6ad8c710221e1137535dff8a1b7565ec81bd8ddeb502e3d58ff8f1fe6e86b8dc15a3aaec688bbbecd4688281db0f818de0f7261ba9cc58c8bc0d02e06632efe7287ad7a84331a824d9287344efaaa74f1fc576d0269430f856a8565265b9d6ef71fe134d2510ab06b60bf3c153b57ecfd2e6342403fe678b5886b6b734b7d3690662b6c8c6f6e250e5af6a8183166ddcd0a17f0cddc8636ef1a68498be50b6599539d46b4cea97130e08f94ca53e884644eda75d23cd2c038a5f17b591e21369378cd3fb5762d1a7c3e66a11ae6e91cbae616ad055e39dc41e154f4fced7b2696d9dc67380bb8eef474e9aa83cec47fafafb941d626564b2075bcc0856da8d6e1b0b8f18baf7513bbd14e491ed517968c4f7241af25098ee8df130b7a34d59736d7836d323fe3f43f508cdcb755895f59a00c804ed164cc33992f3aee962ae9e990b74272eb987b12d90b27314d57400e737d1343e970985c4271060876abcd7049e7c9fe244ff3ef98560995b7482d31bc7c09d9969f7cd41f4e4e252750dc16ccdb29b985314a0b6e749c95f9bd2838d5ac49ee031fd079bec3028dd9dd07db6fa622ad621b3b1e127e8fca37bd146e3cf703e911701b7a16c2d30369c94648ecc03df10d7dd5c0558fa9593425d948727d6860c3a14f811245106616d2a5fa981c6b7f47ec9def65412d132acc6919da4e88597aa9190ca614b218066a0f7b16997ee747c5a09785e50d0a891d95937863d613ceff7", "signature": "28326b5b978e0dbdab5dde703785a667a7ef439d81ea47e066b089d116c25a34bb633f260d55f45bdf6bcda74803d7624b1927cec18eb1992260beefc399d90e" }, { "secret_key": "82109099d1eafeed5a85206046491b34d06dcde33f080960287b10fb23ff9f78", "public_key": "081cfdf2d758654c41c447e1e6273810f8a738a733afc42294a2b1bbb769efce", "message": "84f47dd794977a6c1505ac8c05680c5615a2d5b057e39b04f85e3f9ff04960e0e016685a86eebcecf6fbce5fddcdac1a474c8a0d502c40e10f948646fdac6c81f1ffbb177a2a4963b67825903cde65b5dbe0d8941d546cffa2bf8a8ca8d6c6408530a6290f5d0882f1a1672dbf978e10c5c8af5e0a6239f0655ee7fd9e66963077a0e847137397d1f06999dc6f8a945c6003ea4ea7fd58378acb44ed5780eaa367796beea37ddc236999d012d6a716d7915649cc28e58875647e9f5ac0553c0f544df56469c67081d5e30395f3e960e6a52f0833192c548cd57c926b82db48c361bde70333a370083eaaa068dc2ae452d21ef1331aed190bd3e1289a104cf667834377cf7b5a29774807c3f1ea9e7b28831d0f6c4294785867b137b65028c14f932a1ba8e6f9f59624fe0c396843ea19e46fba09142cf9d42497312f360244032f1e00f38dd0de29f963b5ccc1ef12b2cc6204b994af1f3baf196d9e21e8fa4f097320c64404d0b7d5ab38560ca0655364b0b09cd6dc0f0e05b8c9110364f1424a9672b7efdf7e1f378e234550566dbe13b01578b04153e9c37b553e32a4441bc97e2953bec2e41455510f9802ef948dcbf13faddd722ede573627b258d55e83c0895b22919e4be5ce8d819ce6ad843b2dd09df64004c826c1dde7ce6480a271a858a1db169e1494d4469032bcc1ccd89653198b7c073f76a26a2999b5648cbadc1574c78ead8eece83b91e129c437f9eeec04c807459002e66dcca9bfc2caed9e6c0ba23d2355def75665749430ee92c532a695479fec929174f440ecb61a5ae8b2b7e958920558268978f7fb4da1b38b12014f5d61b0fdd7f6136ba4281b41a3a3cd188052b698765b6f05e41e78373ea830469787a37510993d12f93e96c72d72f4461984f691a41c7d3397ddd5a1b39237d1308864d415fc6c22b63f376cedde37f5252b51ec72e5155f3bdb4fcd5412498bd2e0c1f9850b3a85d1dfd25167a3cd771e8e4c9d868c95a7175e3775f6cef17e4e36497ce9e45532bd7f44b2776e40f91a07ca4fa1b95dbe81cf8f49e46b6c82a6ee4347918a7643b0d9a38857212c693eadacfd37a5f1d91558f5454dcdd05935f290e62d7e65006cd549f6553ce741df44d39644001eb479ca69568ad1f23bba099a41a47294db938731c530af1ceb9217d29bc2705613c1a1fe9c208d0b01ba6f4d9b4c7ba8f021df91ea2d578ce083123e83ba4b9c50407f6666fbe61158b0d1b9577772e3eaff8fb429d0f6d2e384126130f21b449fb1dc170db45af505bd3182678a9b5f9fdff65f0413b672c4786340fcf2522ea7f3d8ade8a059529649dbda9ce51ff05a2a2a3d66d2166bf2c9c6772ba0ef4105e68c055e0213d42c1ee123b3c1217843e6ec575d754df3c90a75", "signed": "b3987f324bc7e776c0f287fa13ad28741695e2e7bce8d143e29fad5d00994758e225fb802100d23fd6ccafee8e0a95bc479be8c23a11319745765b7cd47e700684f47dd794977a6c1505ac8c05680c5615a2d5b057e39b04f85e3f9ff04960e0e016685a86eebcecf6fbce5fddcdac1a474c8a0d502c40e10f948646fdac6c81f1ffbb177a2a4963b67825903cde65b5dbe0d8941d546cffa2bf8a8ca8d6c6408530a6290f5d0882f1a1672dbf978e10c5c8af5e0a6239f0655ee7fd9e66963077a0e847137397d1f06999dc6f8a945c6003ea4ea7fd58378acb44ed5780eaa367796beea37ddc236999d012d6a716d7915649cc28e58875647e9f5ac0553c0f544df56469c67081d5e30395f3e960e6a52f0833192c548cd57c926b82db48c361bde70333a370083eaaa068dc2ae452d21ef1331aed190bd3e1289a104cf667834377cf7b5a29774807c3f1ea9e7b28831d0f6c4294785867b137b65028c14f932a1ba8e6f9f59624fe0c396843ea19e46fba09142cf9d42497312f360244032f1e00f38dd0de29f963b5ccc1ef12b2cc6204b994af1f3baf196d9e21e8fa4f097320c64404d0b7d5ab38560ca0655364b0b09cd6dc0f0e05b8c9110364f1424a9672b7efdf7e1f378e234550566dbe13b01578b04153e9c37b553e32a4441bc97e2953bec2e41455510f9802ef948dcbf13faddd722ede573627b258d55e83c0895b22919e4be5ce8d819ce6ad843b2dd09df64004c826c1dde7ce6480a271a858a1db169e1494d4469032bcc1ccd89653198b7c073f76a26a2999b5648cbadc1574c78ead8eece83b91e129c437f9eeec04c807459002e66dcca9bfc2caed9e6c0ba23d2355def75665749430ee92c532a695479fec929174f440ecb61a5ae8b2b7e958920558268978f7fb4da1b38b12014f5d61b0fdd7f6136ba4281b41a3a3cd188052b698765b6f05e41e78373ea830469787a37510993d12f93e96c72d72f4461984f691a41c7d3397ddd5a1b39237d1308864d415fc6c22b63f376cedde37f5252b51ec72e5155f3bdb4fcd5412498bd2e0c1f9850b3a85d1dfd25167a3cd771e8e4c9d868c95a7175e3775f6cef17e4e36497ce9e45532bd7f44b2776e40f91a07ca4fa1b95dbe81cf8f49e46b6c82a6ee4347918a7643b0d9a38857212c693eadacfd37a5f1d91558f5454dcdd05935f290e62d7e65006cd549f6553ce741df44d39644001eb479ca69568ad1f23bba099a41a47294db938731c530af1ceb9217d29bc2705613c1a1fe9c208d0b01ba6f4d9b4c7ba8f021df91ea2d578ce083123e83ba4b9c50407f6666fbe61158b0d1b9577772e3eaff8fb429d0f6d2e384126130f21b449fb1dc170db45af505bd3182678a9b5f9fdff65f0413b672c4786340fcf2522ea7f3d8ade8a059529649dbda9ce51ff05a2a2a3d66d2166bf2c9c6772ba0ef4105e68c055e0213d42c1ee123b3c1217843e6ec575d754df3c90a75", "signature": "b3987f324bc7e776c0f287fa13ad28741695e2e7bce8d143e29fad5d00994758e225fb802100d23fd6ccafee8e0a95bc479be8c23a11319745765b7cd47e7006" }, { "secret_key": "65fcbd626d002111334baad4e6a8006e47a1f91397bee6dd6cd7da5a0e0248a4", "public_key": "20409a146b42c96beab0b42ea7f2c25193119d0df44dc2bf14d11a32fd733615", "message": "e4c0947fc8ca78fa8863f4d044499d036e2e7ef8c17e838f2fac02675b7b5381e5f9abceafd0d8886a929d9d9b49fcb73861b29d1518ac5f83f7f8fc26bd1cebc22d873a9a08231406fb032e4866e5f55c7c0441c519041bb2cc73f9226dd5d07eceb660d6c967db23365574bee8fc10222928767713571a71c93a85278d42299a70599ca99326cc86f6d98daac000fdfa710562f481faa020c72a76e2067d154c235a7a4f29708cc544533bd799ed6363eb3b56aa4a6d0e379bbf07600595c23ab1f3f9f1708e0070261bbbf4bfeaf6d6ced4d7ff722c9cc52d9133ea68d495dc9489c3edf6830231351f65cb5272f5396e2c4a1a5c88661a101892249e23d6ce9fdb6a9abf74272c2f59c3d8fd8743cce461126ca0a8b832b4b218336b1ae14da677ba7f1b2cc5ca3c7158f727a9e1b8fdd9edf5c2187fcb83db862ad0c6b39216de3116919556465100ade0a42bd6ba10d95418b69a3e005e9f104589ea5948b2b51bc7b1a9a0749da8f013781bc05c805bb51e187761ac24c76414f668eb45fb0a5024dfe5a5ca06f0403a02e3b2fef7a2c4bcfb1d075d310d5197e659cd14023faec20e045cabcb86b221a1d4827113ff3267a64debe9939004cabac85e5c7461e7e82a975acfae0b6c516a1c605374cfea7d819044efd6d74654424fd5c90ff2574fcd8e007740d975861d0df5259fe43e43639e36e52895439ba2c27c1e889c93094104fe914921bd6f25d3985ab1f22ca557b0e49afc7375243c521c6d5fafe0381ccea828e88e647fd90976b3fbec19fe9adb113c6404bd352bfc000446d21005b5f950ae07e51c768ca3ff6177b2eac50f10dd2e64610fa8ab5788faeee29d129009d7fe46aa3da6b9d86c73065eb5161fbdbdfac5777c4e75452e6e16ae9fd66bb7d9aaa426bcb7a6915f0ff44a1f8ec71394e9352fdf20e02fafe1e0cefe50744c3194956f928f82533755373838dcc1296a891adf641c7382d69b4f5a43d4af7772a4a1ee879292d7a4f32ac35ee121c6c34ca5f98487a941fcb1e65b44d4456127eedb2fcc1c3f48eff9300981e52ac38b496ab8bbce144a85eb9c07638b31fdaa781744bce17e8d93dcdc60afeda488807617f88d6aa54422fd347ddaddeff37a563dbf19974b2a23be300fbfa6c7fc41f84c6905415269f195990b5b4de12668c71c87b504f41124bf94436f333045631518152c5162a2475c40efb6cbdaaf9af428fed325b3a7d94c17520fd89e00ddf08b22adf661f0acd723b3969dc6434ea6f92ef58e8dfae5b0cc2885ba987ea1d16c39b34ef65023009d6345e48e3691a41f02a77b7fe133ea9de7565f157a2078ae988bbb266d22d5fa91a7b263e98ad2dc0731fe5a29025a0cb436864a5a60db257f1e76b5c608f25cdecc87eae6", "signed": "bc78e16ba674e0a7dba57a19094f9733c55d74b9d15f8a44d1bbc0a023f70155de2977111a417eefa8cb30ec12abc8384228167c70982a8206b1ffb72174af01e4c0947fc8ca78fa8863f4d044499d036e2e7ef8c17e838f2fac02675b7b5381e5f9abceafd0d8886a929d9d9b49fcb73861b29d1518ac5f83f7f8fc26bd1cebc22d873a9a08231406fb032e4866e5f55c7c0441c519041bb2cc73f9226dd5d07eceb660d6c967db23365574bee8fc10222928767713571a71c93a85278d42299a70599ca99326cc86f6d98daac000fdfa710562f481faa020c72a76e2067d154c235a7a4f29708cc544533bd799ed6363eb3b56aa4a6d0e379bbf07600595c23ab1f3f9f1708e0070261bbbf4bfeaf6d6ced4d7ff722c9cc52d9133ea68d495dc9489c3edf6830231351f65cb5272f5396e2c4a1a5c88661a101892249e23d6ce9fdb6a9abf74272c2f59c3d8fd8743cce461126ca0a8b832b4b218336b1ae14da677ba7f1b2cc5ca3c7158f727a9e1b8fdd9edf5c2187fcb83db862ad0c6b39216de3116919556465100ade0a42bd6ba10d95418b69a3e005e9f104589ea5948b2b51bc7b1a9a0749da8f013781bc05c805bb51e187761ac24c76414f668eb45fb0a5024dfe5a5ca06f0403a02e3b2fef7a2c4bcfb1d075d310d5197e659cd14023faec20e045cabcb86b221a1d4827113ff3267a64debe9939004cabac85e5c7461e7e82a975acfae0b6c516a1c605374cfea7d819044efd6d74654424fd5c90ff2574fcd8e007740d975861d0df5259fe43e43639e36e52895439ba2c27c1e889c93094104fe914921bd6f25d3985ab1f22ca557b0e49afc7375243c521c6d5fafe0381ccea828e88e647fd90976b3fbec19fe9adb113c6404bd352bfc000446d21005b5f950ae07e51c768ca3ff6177b2eac50f10dd2e64610fa8ab5788faeee29d129009d7fe46aa3da6b9d86c73065eb5161fbdbdfac5777c4e75452e6e16ae9fd66bb7d9aaa426bcb7a6915f0ff44a1f8ec71394e9352fdf20e02fafe1e0cefe50744c3194956f928f82533755373838dcc1296a891adf641c7382d69b4f5a43d4af7772a4a1ee879292d7a4f32ac35ee121c6c34ca5f98487a941fcb1e65b44d4456127eedb2fcc1c3f48eff9300981e52ac38b496ab8bbce144a85eb9c07638b31fdaa781744bce17e8d93dcdc60afeda488807617f88d6aa54422fd347ddaddeff37a563dbf19974b2a23be300fbfa6c7fc41f84c6905415269f195990b5b4de12668c71c87b504f41124bf94436f333045631518152c5162a2475c40efb6cbdaaf9af428fed325b3a7d94c17520fd89e00ddf08b22adf661f0acd723b3969dc6434ea6f92ef58e8dfae5b0cc2885ba987ea1d16c39b34ef65023009d6345e48e3691a41f02a77b7fe133ea9de7565f157a2078ae988bbb266d22d5fa91a7b263e98ad2dc0731fe5a29025a0cb436864a5a60db257f1e76b5c608f25cdecc87eae6", "signature": "bc78e16ba674e0a7dba57a19094f9733c55d74b9d15f8a44d1bbc0a023f70155de2977111a417eefa8cb30ec12abc8384228167c70982a8206b1ffb72174af01" }, { "secret_key": "b500768a2823915c4a6848d35f6487d43bd766d2ce0945f8a3ccdb8d82a3892b", "public_key": "b8cea215a0124eed27005725d897781ea064dcefb21422c8bd2402c56a10571c", "message": "0a9fda8b8cfca7a5b05d78116fcee19ab803c1c6010ce11daa8e93a66d12c12e474eb91c2640d97a813d9a830d268868eb2e3770425f10c75840468e669dc7f61d3be2de88ae0e542bc809679113957a14da4eaff549bfde637d7cafdc6aa83994837397f86e4fde86d402fa9aef7f65549a214373e560e6d7a1c2769e0c7d5a0171e7cc00dff36e0429798b53aa621624bda74d6df0bffffbd8fd7bef1a64f36c000782f6ed031af5c2a74a18963598c9ba062392de9602036794b7b5e68c25c93fe7cfad47a7c5b979d476cd513a12bf0307cb1631740042a9fbf3eb0be5170620dafd5f16ed89342c2625d783e74ee0d784bf051943740c88b0bef7bc85e1a6a4a517d492fb737e776699590c93224cd4d9245d4e9371a367c0712f87490f9247c49add9313f277a4d9f26b75aae4ded6a3def85f83fc995910405548af670ed8aaa30524ab829ccb56a5005b58bce868c9e8074f07dd7f3818f299e4e086bed9eab902cf11b398d531b8632e7d523a8f877695f46ccf9ce24e62cab2c7cd0aaee17db52676a4b5058e9c1d7c47bffcb641b0ea2b0944f39a75665a7ef29b7f02a878db823883bdacfb0fbe5dfe5a9bed9fdac7e4142e3eb50d5e840bd0ac0becf4fa97e1fc4827c397a52465d916889954b3701b0fac61159b23092f4685f4788bad35d00da2679ecc54921f1a8647101657ab49477420567aed67c8605930444b5d07927c17eff1f8570cf2af29e719f85ca7849b895549f13dfeca68bbef71e3ce8b6cedd2ff68d32b02caf5951a0b3e6b0bae6a96c02058191f305e090711c46daddcd5aeee769c3a105e9a827bbd195d329231c26238479a9bb0071afb160ef955e874d7a420c56785f44ae0a18c52d8280c5998cf3888feaf89898134bc8d411fc9f6c5768ea7a249729413739e532b643937152cdfb8d2ff87fd48084dd8aeebeaf0f7b10d87b6e4423228c9fc8dc5e3852aa8b8acc545d18f25c55d73da1bb82e3eb376f9ef05b274d7ecb1845d65ca0cd2629f038a2d664d7a69781c84e98de2c209c46efc51162172856649469e673308dcc145eaf783f5cb5b4be7d9fd58ee0974c981a38fea8e31267abfa410e69e46482f5134f3da1ffe381bd69d8d0b78ea909b4af9396dcaff89960a049eda6946616fc27ccf9a9e5ba1a0135764f37719da4d28078185d04d72419c2c70f290d97e1f82b879f71b9e19d504d364cd3ba22cf905250fd37d58e5fe40209f6072a06d8b5ba70196230577877ec46153167a7c7aea270fa1098aba9e3a74acb36a11b09bd07a3b88ea654e268365625b589b2206c710d960f42ea419b7e4e3da4759fcbca50e4bf4cc55cf88f70b3180c805a7045086afa04c6be23223ecae5f82c146d54311d1807c2e4a53f9e0a4482b4e1e", "signed": "e3db47a11e10e788925d14b1e28b54c9fcf9b6acc1df8c14f683a5672fd504dd4a475a3393b3ef8bceac2361dbba3530af25c246c3ec4c05899b517f6cd34f0a0a9fda8b8cfca7a5b05d78116fcee19ab803c1c6010ce11daa8e93a66d12c12e474eb91c2640d97a813d9a830d268868eb2e3770425f10c75840468e669dc7f61d3be2de88ae0e542bc809679113957a14da4eaff549bfde637d7cafdc6aa83994837397f86e4fde86d402fa9aef7f65549a214373e560e6d7a1c2769e0c7d5a0171e7cc00dff36e0429798b53aa621624bda74d6df0bffffbd8fd7bef1a64f36c000782f6ed031af5c2a74a18963598c9ba062392de9602036794b7b5e68c25c93fe7cfad47a7c5b979d476cd513a12bf0307cb1631740042a9fbf3eb0be5170620dafd5f16ed89342c2625d783e74ee0d784bf051943740c88b0bef7bc85e1a6a4a517d492fb737e776699590c93224cd4d9245d4e9371a367c0712f87490f9247c49add9313f277a4d9f26b75aae4ded6a3def85f83fc995910405548af670ed8aaa30524ab829ccb56a5005b58bce868c9e8074f07dd7f3818f299e4e086bed9eab902cf11b398d531b8632e7d523a8f877695f46ccf9ce24e62cab2c7cd0aaee17db52676a4b5058e9c1d7c47bffcb641b0ea2b0944f39a75665a7ef29b7f02a878db823883bdacfb0fbe5dfe5a9bed9fdac7e4142e3eb50d5e840bd0ac0becf4fa97e1fc4827c397a52465d916889954b3701b0fac61159b23092f4685f4788bad35d00da2679ecc54921f1a8647101657ab49477420567aed67c8605930444b5d07927c17eff1f8570cf2af29e719f85ca7849b895549f13dfeca68bbef71e3ce8b6cedd2ff68d32b02caf5951a0b3e6b0bae6a96c02058191f305e090711c46daddcd5aeee769c3a105e9a827bbd195d329231c26238479a9bb0071afb160ef955e874d7a420c56785f44ae0a18c52d8280c5998cf3888feaf89898134bc8d411fc9f6c5768ea7a249729413739e532b643937152cdfb8d2ff87fd48084dd8aeebeaf0f7b10d87b6e4423228c9fc8dc5e3852aa8b8acc545d18f25c55d73da1bb82e3eb376f9ef05b274d7ecb1845d65ca0cd2629f038a2d664d7a69781c84e98de2c209c46efc51162172856649469e673308dcc145eaf783f5cb5b4be7d9fd58ee0974c981a38fea8e31267abfa410e69e46482f5134f3da1ffe381bd69d8d0b78ea909b4af9396dcaff89960a049eda6946616fc27ccf9a9e5ba1a0135764f37719da4d28078185d04d72419c2c70f290d97e1f82b879f71b9e19d504d364cd3ba22cf905250fd37d58e5fe40209f6072a06d8b5ba70196230577877ec46153167a7c7aea270fa1098aba9e3a74acb36a11b09bd07a3b88ea654e268365625b589b2206c710d960f42ea419b7e4e3da4759fcbca50e4bf4cc55cf88f70b3180c805a7045086afa04c6be23223ecae5f82c146d54311d1807c2e4a53f9e0a4482b4e1e", "signature": "e3db47a11e10e788925d14b1e28b54c9fcf9b6acc1df8c14f683a5672fd504dd4a475a3393b3ef8bceac2361dbba3530af25c246c3ec4c05899b517f6cd34f0a" }, { "secret_key": "9eb5c9ef13535f808109f4a43cfad5684f80daf02eed5410ac0b0a09a6082d69", "public_key": "367eea1ecb4e5eecdf7e471b90bb34f9b7982c8cd66d42555c240b41cd8739db", "message": "2d7cb05e61dbae26258e3861c639ef0e1d17fc711a00f335ba3c027137e00708d708c1ff457ff2c65112f7dcd7d02f24d56f072158ea1c71832550a58366fd9197296bbe61aa4d00de18a453ef9174fa81968305c41c3455f42d447a9234f06e13bf8bcaa1babb11695fafdc08f7a584b2ea1f61e9389260ce7335a07de72c8911a58a313f1088dcdf5c8d4c456cba2dcb4f2d156b4943b95bd493ea4fe1a82d4e3ea02aa02972400b5ee17842832d59979fc179f843c44b03eb3c302416d0cdaf11c4ca8a66ccbb6997395edf6fca2ea004cf3486971004a42042af8ece005b94461d86dcde212a2eb1be3b914c783e48ac1ad46cacd73e1eb448368322d2678efcb2abff52093db0f259dce5c1e19a512820f235d6aeaf0e1a723c2c650cff1ee3b6b4f4cc989c0b7d6de3cd7e6daa39bb690710df00a7194c17201f0e81be64b6739e1c1e8176b7e12a353427c067c19314db642e5c76266b640eb1cc0c73f84fc0227e5a96060d814071cde2fed944767b7466f9001dfc223685429bc4e5e48f5c13a63a4e0d826133ad920d11772145ad6e13c93897398a8a401f93dbd103005c7dae44387f3e80b793607d05d2d8bc0d0351a3a452b8ce759c1ad48df7b9ba9e4a17df61fdabb9b577b5cec3e9461fbb5e128155a3c9c89f8f6bebb7322a16678e8ecb98953d958310db1b063448c349f36e168fac484cb3c0d4cb2c251bd92ef8e9262b44093d7e650a7d3bed3791fa88100fee6ef0d5e23d1e9a8099cc0335202a4f106c24777e98f81d26efba15c9ad1541e0adbf1d1d76076b0dfd7b7d6c8b82f9c093468cd196672dc5478e91ce701cdd7b68b353c97111f0429760635762f8683ae970564bceba9120517642e8b3a2baaa85c25b54a943766184904c72d929634ec5f0c28473415f12538906c678fca4e682db4879758492537e7850b9bfef3eb9053b43920d810e55be966aec68c9dd3b62ccf57e8178cb5ef6d16d172a56dd924f00f2d3b5e93aaa92b29fb8336d73e29e59d1c47ea6230cda1d5b03bba5dfdb331feb19443f123d2a03ff4f10eca166c2998588f1e584ed194dd6f73c8aca846631904d9fe4a98b367823e46edba2885129879e9277e150f029b8fa7bd11eab9ce1336777c80b56b3a1f0811adbca0f5b4025a5503c8196661aee90006e9c85bbfa4c5a0e902885c8ce51212ee67f0fe0b6afbc8bad453727543b3c68b890ddaba269d25fc1643f54835136a1a25ba18d916cedd6a47fc07adf6fc69fa508949dc10d9dc5e0261b52f3657170384eccd9c80541354b1ce0f6fb5ed3e8d54af0b5bf0a92835125c7d9bc4f092ff380e5e896fbf302552b14d5b61a224d86e301c7a66a66e4e4329aac0a66b156772374dc1c7168d5b561652f8f4387e4f289b6366a", "signed": "429ce1fe846d250849eca7d456f8c59f8675b1f4c13f2be41688dfb8ca2a3b24ae29d5b6bf471157bcb6e2ec9d4a26b038e6ec28584cc23f2a03556dbb37e9002d7cb05e61dbae26258e3861c639ef0e1d17fc711a00f335ba3c027137e00708d708c1ff457ff2c65112f7dcd7d02f24d56f072158ea1c71832550a58366fd9197296bbe61aa4d00de18a453ef9174fa81968305c41c3455f42d447a9234f06e13bf8bcaa1babb11695fafdc08f7a584b2ea1f61e9389260ce7335a07de72c8911a58a313f1088dcdf5c8d4c456cba2dcb4f2d156b4943b95bd493ea4fe1a82d4e3ea02aa02972400b5ee17842832d59979fc179f843c44b03eb3c302416d0cdaf11c4ca8a66ccbb6997395edf6fca2ea004cf3486971004a42042af8ece005b94461d86dcde212a2eb1be3b914c783e48ac1ad46cacd73e1eb448368322d2678efcb2abff52093db0f259dce5c1e19a512820f235d6aeaf0e1a723c2c650cff1ee3b6b4f4cc989c0b7d6de3cd7e6daa39bb690710df00a7194c17201f0e81be64b6739e1c1e8176b7e12a353427c067c19314db642e5c76266b640eb1cc0c73f84fc0227e5a96060d814071cde2fed944767b7466f9001dfc223685429bc4e5e48f5c13a63a4e0d826133ad920d11772145ad6e13c93897398a8a401f93dbd103005c7dae44387f3e80b793607d05d2d8bc0d0351a3a452b8ce759c1ad48df7b9ba9e4a17df61fdabb9b577b5cec3e9461fbb5e128155a3c9c89f8f6bebb7322a16678e8ecb98953d958310db1b063448c349f36e168fac484cb3c0d4cb2c251bd92ef8e9262b44093d7e650a7d3bed3791fa88100fee6ef0d5e23d1e9a8099cc0335202a4f106c24777e98f81d26efba15c9ad1541e0adbf1d1d76076b0dfd7b7d6c8b82f9c093468cd196672dc5478e91ce701cdd7b68b353c97111f0429760635762f8683ae970564bceba9120517642e8b3a2baaa85c25b54a943766184904c72d929634ec5f0c28473415f12538906c678fca4e682db4879758492537e7850b9bfef3eb9053b43920d810e55be966aec68c9dd3b62ccf57e8178cb5ef6d16d172a56dd924f00f2d3b5e93aaa92b29fb8336d73e29e59d1c47ea6230cda1d5b03bba5dfdb331feb19443f123d2a03ff4f10eca166c2998588f1e584ed194dd6f73c8aca846631904d9fe4a98b367823e46edba2885129879e9277e150f029b8fa7bd11eab9ce1336777c80b56b3a1f0811adbca0f5b4025a5503c8196661aee90006e9c85bbfa4c5a0e902885c8ce51212ee67f0fe0b6afbc8bad453727543b3c68b890ddaba269d25fc1643f54835136a1a25ba18d916cedd6a47fc07adf6fc69fa508949dc10d9dc5e0261b52f3657170384eccd9c80541354b1ce0f6fb5ed3e8d54af0b5bf0a92835125c7d9bc4f092ff380e5e896fbf302552b14d5b61a224d86e301c7a66a66e4e4329aac0a66b156772374dc1c7168d5b561652f8f4387e4f289b6366a", "signature": "429ce1fe846d250849eca7d456f8c59f8675b1f4c13f2be41688dfb8ca2a3b24ae29d5b6bf471157bcb6e2ec9d4a26b038e6ec28584cc23f2a03556dbb37e900" }, { "secret_key": "ef0948e13281f3cf352cbfaf8d89d117768552d5a1548ecbaf37412e97670fac", "public_key": "58c2457f5a5e3cfbf47119a87f2aff1918f1e67ae6fa9171d3f41eee07a86872", "message": "7ec47f2f1fe3b70a6d1d82c7cd924b4bf9b2029fc12c52a6e1cc06cf5abfc0a442e7cf145c1542b9b135049665711035e3c29a91d4fdaed6127057a812c22cd75ad1879be1d2c6110e79e987524e4e8f27f16eda90cbd4733f111825b516d1067f81eca5e6948576d5bfedb3277c1abc1e60f374d0701b32ccfd6a5e9c8d1659aaf3d0818613613b7e288d845e9aaaba2e3e9b411d501dffe856fd313e9fcc9e7430b9983f20ab4ebf4eb616bd63e2c57743658995ed0a149ae620a395613719b3ed7ced4588d5915d70a2f0c687680ec34fe3e9f72392e189e13a4749d5ca9fac651b92c084c4066fdf98a869223e4e0c9bec5812b5c1900e6e60d3a188d48a74dfd415b5cad2e91ff76df75089d20a755f260756c8f1382a29f7b93726e731071cd477458c6f2022dfad7d4fc7ab2380541864f6b58774f9ae8e5f077c1a8da073c39853eb2fd477220b45a3d92263dc7e14d3bb2b36fca466c7ef8a247538725f2fce5c7221bc751cde1394604f5931d733360ccd47ce087712958180ad84fae713b543f05eef6abc0661433121ed3b4506a1465025316fb8f9d64535cc4538acd4064dd576b0740e1beb13bceaf155543dc89097ca5ca1cffa0ad65a10bcb759354eab8a42de734af909c2feba380d66409f325d5f17af9ca7f8cb4134fd6a2b6a528d9e60d9612b8e8b4062f8e0fad1e7eeb9cbfef6e9738ec7973e1cb2ba2327deca4ea46568f31e12f730e247c1d07029fd4422b298ff2398023b4120a3a425ffb652880c19ea69f3639e0f6df4f00876cc4528e267e81d5943199d0feb6cb4e1baf404bb6f8b39b12dbce9fdc35dc158066e9975ae5bd3b55f2a41a791baf3e8351ec604944790a22c933c80b1590ba197a4706f7f5128682edcd74dd78d435e787c2b76a57b3f4e7d7be2efd26da5f9a829119b01508b7072c7699ce52bb578cc5b1b93661b5172fb84daf1ba364d2cbd80e2c99bca9caea873cc0a1629eac384e9b206842a6e6183387591b4aa34a95fd89b49d8d15d91e21940e17dcaf1eff8a0a47a0d7a95daead82aa3df8204a0cd206924ae510fec8a9c4e8d85d466fdb4dd365dc99336b22ce0b956b5ee0017f29d25ee66fbdcecb0d996ffb97c8defde40a9ff9993193ca8f1685067c19c526e0efed236f8edb8def6c2a03e21952c8612d624e6886a311ffb9e2f15da44abe180d26a14b15f63561e097a730ecabb792c7c235fdd360f571f27ef68677a7d63beb4975982cb199a560f816ee12989445f7f75b83eb278d62825947d84099af2a6ff2eadbbf589b5eb2f72ed114c73151153ae0022bc9564d15c2d5cdbbaabbef638f03095f53eebac9683409ad3060cfb7c7037b9b0befe069c92a02be953388e9ea45d36ddf4f5a8389432ccf504c50808b07f69", "signed": "cc12f69db63a678ec477a605a505c57dc2b810ef85e3e34519cb25c51063aa66355d3f1e2974695866edf6f17171ce37842fbab5075fc895d18ed743c546080c7ec47f2f1fe3b70a6d1d82c7cd924b4bf9b2029fc12c52a6e1cc06cf5abfc0a442e7cf145c1542b9b135049665711035e3c29a91d4fdaed6127057a812c22cd75ad1879be1d2c6110e79e987524e4e8f27f16eda90cbd4733f111825b516d1067f81eca5e6948576d5bfedb3277c1abc1e60f374d0701b32ccfd6a5e9c8d1659aaf3d0818613613b7e288d845e9aaaba2e3e9b411d501dffe856fd313e9fcc9e7430b9983f20ab4ebf4eb616bd63e2c57743658995ed0a149ae620a395613719b3ed7ced4588d5915d70a2f0c687680ec34fe3e9f72392e189e13a4749d5ca9fac651b92c084c4066fdf98a869223e4e0c9bec5812b5c1900e6e60d3a188d48a74dfd415b5cad2e91ff76df75089d20a755f260756c8f1382a29f7b93726e731071cd477458c6f2022dfad7d4fc7ab2380541864f6b58774f9ae8e5f077c1a8da073c39853eb2fd477220b45a3d92263dc7e14d3bb2b36fca466c7ef8a247538725f2fce5c7221bc751cde1394604f5931d733360ccd47ce087712958180ad84fae713b543f05eef6abc0661433121ed3b4506a1465025316fb8f9d64535cc4538acd4064dd576b0740e1beb13bceaf155543dc89097ca5ca1cffa0ad65a10bcb759354eab8a42de734af909c2feba380d66409f325d5f17af9ca7f8cb4134fd6a2b6a528d9e60d9612b8e8b4062f8e0fad1e7eeb9cbfef6e9738ec7973e1cb2ba2327deca4ea46568f31e12f730e247c1d07029fd4422b298ff2398023b4120a3a425ffb652880c19ea69f3639e0f6df4f00876cc4528e267e81d5943199d0feb6cb4e1baf404bb6f8b39b12dbce9fdc35dc158066e9975ae5bd3b55f2a41a791baf3e8351ec604944790a22c933c80b1590ba197a4706f7f5128682edcd74dd78d435e787c2b76a57b3f4e7d7be2efd26da5f9a829119b01508b7072c7699ce52bb578cc5b1b93661b5172fb84daf1ba364d2cbd80e2c99bca9caea873cc0a1629eac384e9b206842a6e6183387591b4aa34a95fd89b49d8d15d91e21940e17dcaf1eff8a0a47a0d7a95daead82aa3df8204a0cd206924ae510fec8a9c4e8d85d466fdb4dd365dc99336b22ce0b956b5ee0017f29d25ee66fbdcecb0d996ffb97c8defde40a9ff9993193ca8f1685067c19c526e0efed236f8edb8def6c2a03e21952c8612d624e6886a311ffb9e2f15da44abe180d26a14b15f63561e097a730ecabb792c7c235fdd360f571f27ef68677a7d63beb4975982cb199a560f816ee12989445f7f75b83eb278d62825947d84099af2a6ff2eadbbf589b5eb2f72ed114c73151153ae0022bc9564d15c2d5cdbbaabbef638f03095f53eebac9683409ad3060cfb7c7037b9b0befe069c92a02be953388e9ea45d36ddf4f5a8389432ccf504c50808b07f69", "signature": "cc12f69db63a678ec477a605a505c57dc2b810ef85e3e34519cb25c51063aa66355d3f1e2974695866edf6f17171ce37842fbab5075fc895d18ed743c546080c" }, { "secret_key": "903f3b5399892e29ccfafbafbd7cc4533c154a625682406c89bf894c889e43f4", "public_key": "8fa5ff5b6b26bd67df864046429df124b523005dd89444275c8ab7ebddb6f4db", "message": "a2c11b5fb884a822fae64da8dcb4452cfd7a04ca6d7a5abc8d8271e93f93449e1feb8e02975f496b9034400d3599ab97aa3997dad1c9ffab5b9f8df4aaa5b840d90d862fff7ff0cf73a60c66150009e01c937bd1af6807b5ba2ef612ee13d6def40bb09c46811a2d4e468e038b323055f9dfbd01829ae2f1a535ef0295ca1ed176e46de996cc87bace45356233211835b6f4757c99bd527e766a5f0b127c8cff8e6d66f8bab86d0000452cd7f67be557788513ec0709b537b007b42016e7a89683469bd8ff8d21eb10c14917d47f2dc4f826324f7c01b24f8dcff04aa6d85095d9ab154ba5c3bd919c9d728dbdc990d19ceb237b452907bdbe21f9f08cddae5be479276709b8ae73f8974c4b113841ad535d6ff6223eea47d185c8e8a65fdee2c2d45800c17cb556eafd676647d9968e55ca9c59232b9770ad10f955fcb5858edf0b7483adc1817c0f8d02240482caa76f43c6d2e96a4ff9591cd7b878ea619ea56d1b588631e7633c5ecb2ba6998398cb06e3cf75aeb3e08dab19632d454ff7dc0e2a41f09737e8ee823d1b9e24dda84a2ce0313cb9fce31cb663c55c05645e63401756e8ad38f5174c02a663d815ad64422ff7727d4fda16e48d4bf8f6602e7260da62330e6878c34764e129afbd552208f6bed4f7cee9b671f488388815d74b4951b8682ce76cfe31e938c470b8f7a45fd63a9691f426a75c58ed3dbce3ae8fd9d10a8352e47cc1b12c9192ac8626d1b384b77a18b986e71a998646c137992b67c4817e346345faf50a2659fdc5cad5c719648efee3847c0ff6bd7095c28b4c5195967c90cf84e1ef68a1ada01f6274ede363fb82e0b549a870245d608cae8234f6d84abeb61b718466093620d85c584ab01eeda091ee8aff1cf67a4675679a1f4003e66aaf43871b88ecda6a16dc5acb05395f2da9df70d3bdb61438e1c3d40981e034627d026ee1d2e79f65cbb8189fcbb3cc8b5c2e7e796b5d2889411d5641fb869c7b0a589c43254f8c5438aaf5ac423832f018d79a51b96f242e2de0c851cc5fc2b206bca4b5be836125aca144bbc38c8c638be0d3bbe025a1be8b3d03d5929baa649c3544a32a915e926a38791b134a971bc52d1b6ca625efb7c2f3bb47ab51d43c8e374d16cda882204b71cafe9093cb6078ef2bdfad59edeaf36d0c1a4dc425b9e718c45185225a9c3084b782bfe163492f8e8482ec9aa073f6901ff3d1117ce917e19122fa67650d858f8f82b37669723c226d721697e7ae3359f5a6b02424ee8794cbeaa641edbbf753b103a5fe158be0ba60d8a212d42f8c5c2af254bf1b9c80df6f1cf09d70793cae1abb4627b1780f1bce7f617ee50f6bd4b083b2fc7cd844afb72380d5cb6b255bf47ea71cad6c6c4df021f81b548f432c18ac366c6aecd03b6c8ce2", "signed": "495a8f991941c629bd641a67471ab860bfd39b72f23355f7270909d5307c77b1b94bae3ed19450780e9085305f31b1e1683facf0d1fc8840aec77df67aeab302a2c11b5fb884a822fae64da8dcb4452cfd7a04ca6d7a5abc8d8271e93f93449e1feb8e02975f496b9034400d3599ab97aa3997dad1c9ffab5b9f8df4aaa5b840d90d862fff7ff0cf73a60c66150009e01c937bd1af6807b5ba2ef612ee13d6def40bb09c46811a2d4e468e038b323055f9dfbd01829ae2f1a535ef0295ca1ed176e46de996cc87bace45356233211835b6f4757c99bd527e766a5f0b127c8cff8e6d66f8bab86d0000452cd7f67be557788513ec0709b537b007b42016e7a89683469bd8ff8d21eb10c14917d47f2dc4f826324f7c01b24f8dcff04aa6d85095d9ab154ba5c3bd919c9d728dbdc990d19ceb237b452907bdbe21f9f08cddae5be479276709b8ae73f8974c4b113841ad535d6ff6223eea47d185c8e8a65fdee2c2d45800c17cb556eafd676647d9968e55ca9c59232b9770ad10f955fcb5858edf0b7483adc1817c0f8d02240482caa76f43c6d2e96a4ff9591cd7b878ea619ea56d1b588631e7633c5ecb2ba6998398cb06e3cf75aeb3e08dab19632d454ff7dc0e2a41f09737e8ee823d1b9e24dda84a2ce0313cb9fce31cb663c55c05645e63401756e8ad38f5174c02a663d815ad64422ff7727d4fda16e48d4bf8f6602e7260da62330e6878c34764e129afbd552208f6bed4f7cee9b671f488388815d74b4951b8682ce76cfe31e938c470b8f7a45fd63a9691f426a75c58ed3dbce3ae8fd9d10a8352e47cc1b12c9192ac8626d1b384b77a18b986e71a998646c137992b67c4817e346345faf50a2659fdc5cad5c719648efee3847c0ff6bd7095c28b4c5195967c90cf84e1ef68a1ada01f6274ede363fb82e0b549a870245d608cae8234f6d84abeb61b718466093620d85c584ab01eeda091ee8aff1cf67a4675679a1f4003e66aaf43871b88ecda6a16dc5acb05395f2da9df70d3bdb61438e1c3d40981e034627d026ee1d2e79f65cbb8189fcbb3cc8b5c2e7e796b5d2889411d5641fb869c7b0a589c43254f8c5438aaf5ac423832f018d79a51b96f242e2de0c851cc5fc2b206bca4b5be836125aca144bbc38c8c638be0d3bbe025a1be8b3d03d5929baa649c3544a32a915e926a38791b134a971bc52d1b6ca625efb7c2f3bb47ab51d43c8e374d16cda882204b71cafe9093cb6078ef2bdfad59edeaf36d0c1a4dc425b9e718c45185225a9c3084b782bfe163492f8e8482ec9aa073f6901ff3d1117ce917e19122fa67650d858f8f82b37669723c226d721697e7ae3359f5a6b02424ee8794cbeaa641edbbf753b103a5fe158be0ba60d8a212d42f8c5c2af254bf1b9c80df6f1cf09d70793cae1abb4627b1780f1bce7f617ee50f6bd4b083b2fc7cd844afb72380d5cb6b255bf47ea71cad6c6c4df021f81b548f432c18ac366c6aecd03b6c8ce2", "signature": "495a8f991941c629bd641a67471ab860bfd39b72f23355f7270909d5307c77b1b94bae3ed19450780e9085305f31b1e1683facf0d1fc8840aec77df67aeab302" }, { "secret_key": "ee81e0fb052e23ad759de6aa9838de98e36d4820dc0e1b7b3ef1141ab9de3340", "public_key": "98f3c9880794de64fa269bdf336095e0e01b1a3b375f965b93700bbdf4b96869", "message": "28d99e9518b88283c220e76de205d7b6162359b1dfec1fbaab98ec0ef1df8da40b6b7a775e9728450aeb2351fe5c16afda3aec0d71049da4cb7d4c63713a2410abb022f81611cc064587c8047d4383c00c3c562e9ceea35775095391b5f3dda0e373c4a77ff618a28ef68787ebfc3ebcccc5d1ce32ddf43bfce57203da76a8664b3c616a8869282db0b72811b5fd5a2a03a4ff66724b0489ea2e1073d781c3f189115d79ba20a46d1dfaf5b1a5847b2a2e31b2808737569e60b57231e6a99af26f58afeb15770810474812fe4afacf884506b8c314bc6751bb42b4bd6e87d2e5de70fec5f0014c4257b13472a3b0111a7a8cf83b1dc0cf962022cd44468a3ab1f0016b70cafb1d0246acd7053937c9ac40207cf13b50dd15e2a2e15f50a05bca2f28e770262371dacee02e25b2a59658ed90c0600fa265b7de3d44f8ef0721bf39ec4d4eca5888527b778067b1d659c00514c8d7056273a294cbafe45090d069bbd09f92f461e648f3e682882c71576e974debb0cb7e0e8316406660150dabb58e76246614a291c12ce9e0346c02774d4d09cecc23696712fee250c0bb5df7a2a4c43a5563331bcbbf84be3f2eeb0654532e85ec597b53b32f3954ccaf0cd426def91ec4b208416948af27de04d832705897a04c5e24a2e88b20040fd4eca3089fdb918a92e35c4d31da26850b9dd34118c74449a855ff4bc9fff0d1447839654b00417999fa4eb89102133cd320409153584957c10489db4b7244c95907988e83dc821271dc1ab643d6992d0fd820492ae642e24d19a179fa75d9363b321662606fd94a47fdb2e68d3f30c04673f809de0144945ea4d4183d48f175079eed50323c6b192e020e162a3503aa582fb08b403624a23e357eeda08d904386f358c36c64d314c77cd9d4d23d581ee53d81ff97ada019cfcf04eb9dcc1de9b74c3db6b811578bd4f219c5ca48ef4c826b09e6c96d031f65dd48b6e73d0c100586b21df0293a03d2ed7e5009ad025340c21d09060691f5cd8af2ab12f9b860ee87815e1a9f400c2a6f634ea8f9b3425a08d10b3c815367388f4d1be356318ecf9035d0ee975affa859caac28ebccd0599bb2f6f3523661bd178fc9e4cac378bb9dd4716bb06923fd2bbd56c959c42b95d50193f8bf299fcca3b2eea94ec5f98583924c080416e28b54fe57658458b055ce4de8a75fc82715cae91d375cf69281378051bb61fdd7bb0068f63efa6d6e83d8fd4257af80970f4a9e6924b2de0ad966dffe6fa4a113b0e772f1768785b3b42049f76c48ad80f2c67fb0f91a5fc4107912520d8d683c062c3a222bcda7e710bacd478ee88367b6a059a452fd26f114a5acbd6979ba019f7da68ac04a193026bc1c27e4837b1de29cce090e3380d5051a586409e628e3145665bb1d84ecd8", "signed": "f0d873be15cf454c7434deab71de25cfe99e81a48d2dce6a35d1633714df0f8b4029e0582511efc4d06892f672850246bcf070c46fadc2faab44dc435045de0028d99e9518b88283c220e76de205d7b6162359b1dfec1fbaab98ec0ef1df8da40b6b7a775e9728450aeb2351fe5c16afda3aec0d71049da4cb7d4c63713a2410abb022f81611cc064587c8047d4383c00c3c562e9ceea35775095391b5f3dda0e373c4a77ff618a28ef68787ebfc3ebcccc5d1ce32ddf43bfce57203da76a8664b3c616a8869282db0b72811b5fd5a2a03a4ff66724b0489ea2e1073d781c3f189115d79ba20a46d1dfaf5b1a5847b2a2e31b2808737569e60b57231e6a99af26f58afeb15770810474812fe4afacf884506b8c314bc6751bb42b4bd6e87d2e5de70fec5f0014c4257b13472a3b0111a7a8cf83b1dc0cf962022cd44468a3ab1f0016b70cafb1d0246acd7053937c9ac40207cf13b50dd15e2a2e15f50a05bca2f28e770262371dacee02e25b2a59658ed90c0600fa265b7de3d44f8ef0721bf39ec4d4eca5888527b778067b1d659c00514c8d7056273a294cbafe45090d069bbd09f92f461e648f3e682882c71576e974debb0cb7e0e8316406660150dabb58e76246614a291c12ce9e0346c02774d4d09cecc23696712fee250c0bb5df7a2a4c43a5563331bcbbf84be3f2eeb0654532e85ec597b53b32f3954ccaf0cd426def91ec4b208416948af27de04d832705897a04c5e24a2e88b20040fd4eca3089fdb918a92e35c4d31da26850b9dd34118c74449a855ff4bc9fff0d1447839654b00417999fa4eb89102133cd320409153584957c10489db4b7244c95907988e83dc821271dc1ab643d6992d0fd820492ae642e24d19a179fa75d9363b321662606fd94a47fdb2e68d3f30c04673f809de0144945ea4d4183d48f175079eed50323c6b192e020e162a3503aa582fb08b403624a23e357eeda08d904386f358c36c64d314c77cd9d4d23d581ee53d81ff97ada019cfcf04eb9dcc1de9b74c3db6b811578bd4f219c5ca48ef4c826b09e6c96d031f65dd48b6e73d0c100586b21df0293a03d2ed7e5009ad025340c21d09060691f5cd8af2ab12f9b860ee87815e1a9f400c2a6f634ea8f9b3425a08d10b3c815367388f4d1be356318ecf9035d0ee975affa859caac28ebccd0599bb2f6f3523661bd178fc9e4cac378bb9dd4716bb06923fd2bbd56c959c42b95d50193f8bf299fcca3b2eea94ec5f98583924c080416e28b54fe57658458b055ce4de8a75fc82715cae91d375cf69281378051bb61fdd7bb0068f63efa6d6e83d8fd4257af80970f4a9e6924b2de0ad966dffe6fa4a113b0e772f1768785b3b42049f76c48ad80f2c67fb0f91a5fc4107912520d8d683c062c3a222bcda7e710bacd478ee88367b6a059a452fd26f114a5acbd6979ba019f7da68ac04a193026bc1c27e4837b1de29cce090e3380d5051a586409e628e3145665bb1d84ecd8", "signature": "f0d873be15cf454c7434deab71de25cfe99e81a48d2dce6a35d1633714df0f8b4029e0582511efc4d06892f672850246bcf070c46fadc2faab44dc435045de00" }, { "secret_key": "69d01d829113081cbf5d0c6ef77b21775c8d9b680000056f03c75a7d0a0587d2", "public_key": "ee8469dd61cf5de400da7d7a479a4418e6772e69ff5330ce5ca77859fe271755", "message": "0b9e110f29d19816a17b2c75478f13cee953811a1983014cb7eb0f75526912044c3ea6829780e657f817c5597d4661080d9034c9778722418f2c3aeecaef6b690c5bd3b593701086988e4340aec34e0172758eb24087d03a8f76e7cbca53aaafc4d2155c7532ab54be48872653066fa1fdd54acfe9daaeca356c290e6be63355b6d9fc52eb5e4fccbbc6083507132de485bfae9f42e19712232b716402c23fea74efa69d73c8c2e3a8662b8b65b0fd007741013e1f6e3cfe4345d5c830682fe60021d708e10a9e9f4052ff7a6abf28acb1d6b5fb038eed3f72513c355bbfd5c2274fa85fc4f446974b2d1bc036507a1eb5fcf55dbd44210e538274de808b900bf1c0fcc0241270db8dbdcd88349d67224f087e5f07f699b0bae68b2ebc9a4e27c70d3ac7d996fa7d4dabd568378e3f93905b1c89c652d384c16c2bcb1c9844c38f71bb13e0c6a2ea95b612e390c5f86d248ea531f2ec6f639a402dfaccf37217005344030745d1f1e520cc195dafdd7f295f377b8d614716703836219bb7b09fea7aae9ac33e42dcab65cc6142fcd8ce15e97717fdb33e9538c44f6cd9c1c65db62751f552f870f10142c96f9df1855abb39e42706a563ab154511fdce687c9576f9edc3b4ba55346ce66802fffef4b1b5e12015ce8b57de5458caa0daf341968128584288c2f27cbfb76eab286bac5f66aad0049e0ca60a9014e17901c4130e83ceaeb4c2713e971a235eff995a813ae4ea64a583ffdefdac82ac76eaf4d47c4ac8250fcbafd6b88faeb48015f5b42b5334a50b31d4502ea491da90dce93c08fd56f5c58eedb379166a23762be5e4adeaa6f4ae1c24e0cac4ddca0383458560cdc48b8cd1f42a3ba2f6ffb6077909fcb294ad1ef4a44c22ec4b3987ddbeef325b98ced56815ea7d5fccf5afdfe98e0e6d920f7ada2eb5c91624c76cbba2993a9c7a55021d127a667b39e235df4f81dee7dd142898778dbd92135b70b3acf59f6c29a2c9d4a7006ef11a918b3a2906264a15d6b529308cbc89f85601fc1ea1314d67f7566cf109165c7f92de1a18d70debe024349db3560a6e527e2ac3e06789468704e6b8f1871f16bae9827392b418f1086cc497086ced14b1249d6d8794f23bb8779d418648f2155656a6fda7440c56284d9b2188fa7d1736bccc9cff0be5b1e1f551ff8137ff5966ed9d0f7f01c3dff298e9102ffbd324bfca5ffe0968e66f9d82f487d303934f27f78b28378eb72c38272962a5f735d7392e5d333fd86de167269c17a165b92d31a4880a41e136f718960a919b3d7c4e74cbd73c73f921be513f739affb2e41f80426bb8cfb4564b98fc4de53255ce3f98b4d22ae6fce9190b55bf2c93861c1dcac101b5e16cf09991c5defa33f8d51056d934bb4b477b6520d4c7ae22ea7fb3109de7f4", "signed": "408cefcf01417e2dc6a8a18284e411657f039250c31278db2819f9eaea4293fbf6831a2801fc1ea6871657b841e173f451b0d575a9379e35857e8c7297fa14040b9e110f29d19816a17b2c75478f13cee953811a1983014cb7eb0f75526912044c3ea6829780e657f817c5597d4661080d9034c9778722418f2c3aeecaef6b690c5bd3b593701086988e4340aec34e0172758eb24087d03a8f76e7cbca53aaafc4d2155c7532ab54be48872653066fa1fdd54acfe9daaeca356c290e6be63355b6d9fc52eb5e4fccbbc6083507132de485bfae9f42e19712232b716402c23fea74efa69d73c8c2e3a8662b8b65b0fd007741013e1f6e3cfe4345d5c830682fe60021d708e10a9e9f4052ff7a6abf28acb1d6b5fb038eed3f72513c355bbfd5c2274fa85fc4f446974b2d1bc036507a1eb5fcf55dbd44210e538274de808b900bf1c0fcc0241270db8dbdcd88349d67224f087e5f07f699b0bae68b2ebc9a4e27c70d3ac7d996fa7d4dabd568378e3f93905b1c89c652d384c16c2bcb1c9844c38f71bb13e0c6a2ea95b612e390c5f86d248ea531f2ec6f639a402dfaccf37217005344030745d1f1e520cc195dafdd7f295f377b8d614716703836219bb7b09fea7aae9ac33e42dcab65cc6142fcd8ce15e97717fdb33e9538c44f6cd9c1c65db62751f552f870f10142c96f9df1855abb39e42706a563ab154511fdce687c9576f9edc3b4ba55346ce66802fffef4b1b5e12015ce8b57de5458caa0daf341968128584288c2f27cbfb76eab286bac5f66aad0049e0ca60a9014e17901c4130e83ceaeb4c2713e971a235eff995a813ae4ea64a583ffdefdac82ac76eaf4d47c4ac8250fcbafd6b88faeb48015f5b42b5334a50b31d4502ea491da90dce93c08fd56f5c58eedb379166a23762be5e4adeaa6f4ae1c24e0cac4ddca0383458560cdc48b8cd1f42a3ba2f6ffb6077909fcb294ad1ef4a44c22ec4b3987ddbeef325b98ced56815ea7d5fccf5afdfe98e0e6d920f7ada2eb5c91624c76cbba2993a9c7a55021d127a667b39e235df4f81dee7dd142898778dbd92135b70b3acf59f6c29a2c9d4a7006ef11a918b3a2906264a15d6b529308cbc89f85601fc1ea1314d67f7566cf109165c7f92de1a18d70debe024349db3560a6e527e2ac3e06789468704e6b8f1871f16bae9827392b418f1086cc497086ced14b1249d6d8794f23bb8779d418648f2155656a6fda7440c56284d9b2188fa7d1736bccc9cff0be5b1e1f551ff8137ff5966ed9d0f7f01c3dff298e9102ffbd324bfca5ffe0968e66f9d82f487d303934f27f78b28378eb72c38272962a5f735d7392e5d333fd86de167269c17a165b92d31a4880a41e136f718960a919b3d7c4e74cbd73c73f921be513f739affb2e41f80426bb8cfb4564b98fc4de53255ce3f98b4d22ae6fce9190b55bf2c93861c1dcac101b5e16cf09991c5defa33f8d51056d934bb4b477b6520d4c7ae22ea7fb3109de7f4", "signature": "408cefcf01417e2dc6a8a18284e411657f039250c31278db2819f9eaea4293fbf6831a2801fc1ea6871657b841e173f451b0d575a9379e35857e8c7297fa1404" }, { "secret_key": "4b8ed29731f104795e97dee7c8b401a02afaa9a795e613353d2b95001765027a", "public_key": "f22298210b09fd617fc8b35074ca1801e6075dc92a8f50344b80e85405a038f5", "message": "cbb5f13a0ef2837b805d3b785109f9f2e0d0a017bfe7692d91ec23ddab7817330bef247fd91ab2c77dd4412519cbd38475ce0cb39b1480092bc738d4152b8a6d55248e3b9f32cdcd15ec5d059ec3c8847554ee47005394974d8eb23592d17f5a396e3c19f8e898370679fef5318c4dd299c6217d6abcc9b61a5b2d0cfef695d170ca20a83d6fd3c666c8fd1c10ad970e2fa6af10ff0ed0cbfe752246d03f3a3c6032dbb319bcfdac4dafc50bc3e6bf595f491dec388b3441b8cee0df91f55cc7807d07f8f541ed7322ffc39d18f89560e4123aec1d77969cf1877786f4cf94b1770b1090655e8c72eecea4572e46f580f963966db2a1085eeabc57bf4a84724b9c8599a433abf58bca804091d3d5e6e5048ec27bf8129b670cc2c88d9cac471859f469b918f3f6d70f7d6663501ffbefef026d79ea70927ccf6075ee5105423321e11aee9ad16f987efbdd00b62aff698e521adf9203b15e9f0f3ad07dcad9ddccaae9b490247f12c311dee6b73b8f9124fdce1299b47fb1914cee7e3a07814e312c3ce56927672c51b3185980cde57f3a759b50bcfc4cb0753b954d97135deb2a0532e98b66f39a7c08cf4d548539e2eb9f422f6649658893a7c3c25a4fc901f8c398b8c72733911a0072ed6bd2f4189389ae10a814f648d71f69c37e8295784428183b93c8013b964a9fef86b48f489316bc222e96b3bd15ff149b96820329551c15e0d095d1569b1e2131c78751565c3041f29785395b97151317f62e3582e407b1649e60d03a8599120a302a4695fa862b4120f94d22ecae72398d2094d108ad2dbc1b959735902142aa5fe6e7996559f6f601448aea02f356f8dcdd144340eb3619f9865bf7672aea326c4e93c99f0ed1f9ed866be15d3af2675f6dd6e296602ca373a815b0be46bc2a3fbba06b8805c731fe08007daa06050961b24d14693a72898ccfb8b8fedc60a4eef8ff79b6dd7592591833b576ef48294e5e0485942e57c119602eddf88b1faea517f2fc2e3d14d246a52cbd71a108c66b6cc4f2d45804a282ecedb1b0ad3dc3b4880ab2ff78b8ddde48f7466c14fed349e95b5053abf1bf0991126031d97547d143c2ae164928b61c0708af8ca3e4f55154d13d75e97db4ba3e69d36e9b37082368c2f721bd3f95126a1e004eb2a1bf268343ae21d2995044a2cadd67ffac9e1538175b3cc44db5d26f1d5cc89ca0e1c1ee8537a8a91d324c2e02e18b9fb9730d6dda55f72d843389693ebfcba7fbe1a0bcffb9aa284f4ae66f44a8b89302983b22736d0c72d6a044e4291624243a4e0ce65d5e5346d67fed3760ddb0c510b50ff3eef0a18a267de730476dd82dff7072cba0984825a004dd4bcd8c37fdaf1f683d1d9380e135a95d24b89fad0be941c548251bec90ccae015bc0567da84b371e50", "signed": "2345886686eb39b5199caaa9615bc6b4896f076e8bd736c0038a6517f9c2b167e759f37372268a697e9b78605f2ed94725f6905a7900153fc9e8beed31ffae05cbb5f13a0ef2837b805d3b785109f9f2e0d0a017bfe7692d91ec23ddab7817330bef247fd91ab2c77dd4412519cbd38475ce0cb39b1480092bc738d4152b8a6d55248e3b9f32cdcd15ec5d059ec3c8847554ee47005394974d8eb23592d17f5a396e3c19f8e898370679fef5318c4dd299c6217d6abcc9b61a5b2d0cfef695d170ca20a83d6fd3c666c8fd1c10ad970e2fa6af10ff0ed0cbfe752246d03f3a3c6032dbb319bcfdac4dafc50bc3e6bf595f491dec388b3441b8cee0df91f55cc7807d07f8f541ed7322ffc39d18f89560e4123aec1d77969cf1877786f4cf94b1770b1090655e8c72eecea4572e46f580f963966db2a1085eeabc57bf4a84724b9c8599a433abf58bca804091d3d5e6e5048ec27bf8129b670cc2c88d9cac471859f469b918f3f6d70f7d6663501ffbefef026d79ea70927ccf6075ee5105423321e11aee9ad16f987efbdd00b62aff698e521adf9203b15e9f0f3ad07dcad9ddccaae9b490247f12c311dee6b73b8f9124fdce1299b47fb1914cee7e3a07814e312c3ce56927672c51b3185980cde57f3a759b50bcfc4cb0753b954d97135deb2a0532e98b66f39a7c08cf4d548539e2eb9f422f6649658893a7c3c25a4fc901f8c398b8c72733911a0072ed6bd2f4189389ae10a814f648d71f69c37e8295784428183b93c8013b964a9fef86b48f489316bc222e96b3bd15ff149b96820329551c15e0d095d1569b1e2131c78751565c3041f29785395b97151317f62e3582e407b1649e60d03a8599120a302a4695fa862b4120f94d22ecae72398d2094d108ad2dbc1b959735902142aa5fe6e7996559f6f601448aea02f356f8dcdd144340eb3619f9865bf7672aea326c4e93c99f0ed1f9ed866be15d3af2675f6dd6e296602ca373a815b0be46bc2a3fbba06b8805c731fe08007daa06050961b24d14693a72898ccfb8b8fedc60a4eef8ff79b6dd7592591833b576ef48294e5e0485942e57c119602eddf88b1faea517f2fc2e3d14d246a52cbd71a108c66b6cc4f2d45804a282ecedb1b0ad3dc3b4880ab2ff78b8ddde48f7466c14fed349e95b5053abf1bf0991126031d97547d143c2ae164928b61c0708af8ca3e4f55154d13d75e97db4ba3e69d36e9b37082368c2f721bd3f95126a1e004eb2a1bf268343ae21d2995044a2cadd67ffac9e1538175b3cc44db5d26f1d5cc89ca0e1c1ee8537a8a91d324c2e02e18b9fb9730d6dda55f72d843389693ebfcba7fbe1a0bcffb9aa284f4ae66f44a8b89302983b22736d0c72d6a044e4291624243a4e0ce65d5e5346d67fed3760ddb0c510b50ff3eef0a18a267de730476dd82dff7072cba0984825a004dd4bcd8c37fdaf1f683d1d9380e135a95d24b89fad0be941c548251bec90ccae015bc0567da84b371e50", "signature": "2345886686eb39b5199caaa9615bc6b4896f076e8bd736c0038a6517f9c2b167e759f37372268a697e9b78605f2ed94725f6905a7900153fc9e8beed31ffae05" }, { "secret_key": "080d7f76182ee6bcea894b1e0060558b3b125a3499df3973b8dd6693408ee469", "public_key": "4124713d7c2df50f93055730d1b281daec3028cf2c1e4858d128707a23d6deb0", "message": "ab0a6de2351b9a8498f68272d9a0a7a057365d34efa0fd34cc3bf862e49cdc302b2bd5a30d601a130ec4032f541ae6cb7ba97f84183d2d2581287ca701d7d7a9aba110ce58b946ac0824305df7929f3dd7fc9c8732238637e2b181d6e116c7f66e3226aae3ced1610262da1a0a4aa50a1b9443ec828329e4734d28fc25ab9c1de9b8987e5dc0c8131916c5f18928704a71e80622b1492bf2fec5d4b6dbe415c8af2ce3ef109b34dd5e64d56846f085935a4a5d1073497fb3fb8fb77e8f5d5e3fd00c30652e3c5cde40a335d14e5425ffba942885ed17bd36df506924237e75be84da821950b91424fd9f16c1b2c783e90f8cc2ccc7980ce915c7696b06a586730259e6d14588582bab9d2a39f69e98e7f2ae9bc0c2610d7e0457f26a5d66543be1d65b79c4b7c0d8ee73d0c2b67bf50d8082f006f96d119505873193dfdbd432bb1c9ee0d03ee54cf95d20e91f7f3a069b6256f42159cdc1e600a9a1c2f5a8e467d5c2a9dff8730e6be826fb2a1e6448bfc4fcaaaacdaa7662351faadc91f7caa7737dc82ec3d4b21936bca1bd7ce373ad66264af13241167549318cdd78e563827f85eab20e0b42bc554a712c0051a5010dc2f2c7db85acf6549f9d102c903c1be5a05292c30f21ab1b2b8abcbbf104723c63f0ebc554fbee42020ccb14f443478df77c6aa44db9a57f8fd44d97ea099e4774823ebe123fcf5016a66e837b2f65c1845e681ee2a7059fb1290cd0a933129855cc83c87e0b3bb61e44134addd3637850246cdcdaa29f15c41a3d4dd2c1d760062124333124cf091435fdce711f52316368999befa4c80a39b3750e4e386289e4e2855e97b619b0a25799912408b7d58a4dd9819571e901430f6d555529dd630a1867459b8022d0e0add6ab4f12f60baac75979bbff7f6258d28d6760b1ff243c39e4bbd6cf9bea572a9c082d05adcfd4ccf9fa026f2c904b6e782ed709df7748a307cd2dc3a0fc4123df580cbf49e05ceeabc9f39e57b7f300905d8b310091fb953f3def36deb3e8bf372f5916b51597df024ce85cc4c36eabdc580b5cf152994648f1d7f35fed5cd10f6e2949161a3359b3034d450ea6f61cdf1d5af76d40102b60294f4e49078249026d62fe35fdf224928b0c49ba2b5339ebb192c5ab7f05cdb946e37d671a4a5ef2a5827220b4438cbda05736292806648f5bdd52420fa76b84a6addb1263eb0c500e81566d718d5066026da097054a86631016ddfb706a5677d502ef84aa73b5863bc40fdc42cb7321ac5f00e2928fed7b0418596db4b6151dd6bc6e818f0253552bf13741e69680e966c92c293e13c90f7c9999bd1ec6afe3b4affb47340c89859829feb599db3a8c3d33fc8d45fa5381078ae9f75d85c1496f5fb5addf4e4009b764bcc9118e9275dc7219f281d0d1ef7158", "signed": "185fb1b6d86dc4444810cf5ec6fef0abdafa2a6fccb45d11cfb54ba16a6843f280d380471002ae0d71508556c78ed5415e42338c161f2b621e74cba4f6a1d402ab0a6de2351b9a8498f68272d9a0a7a057365d34efa0fd34cc3bf862e49cdc302b2bd5a30d601a130ec4032f541ae6cb7ba97f84183d2d2581287ca701d7d7a9aba110ce58b946ac0824305df7929f3dd7fc9c8732238637e2b181d6e116c7f66e3226aae3ced1610262da1a0a4aa50a1b9443ec828329e4734d28fc25ab9c1de9b8987e5dc0c8131916c5f18928704a71e80622b1492bf2fec5d4b6dbe415c8af2ce3ef109b34dd5e64d56846f085935a4a5d1073497fb3fb8fb77e8f5d5e3fd00c30652e3c5cde40a335d14e5425ffba942885ed17bd36df506924237e75be84da821950b91424fd9f16c1b2c783e90f8cc2ccc7980ce915c7696b06a586730259e6d14588582bab9d2a39f69e98e7f2ae9bc0c2610d7e0457f26a5d66543be1d65b79c4b7c0d8ee73d0c2b67bf50d8082f006f96d119505873193dfdbd432bb1c9ee0d03ee54cf95d20e91f7f3a069b6256f42159cdc1e600a9a1c2f5a8e467d5c2a9dff8730e6be826fb2a1e6448bfc4fcaaaacdaa7662351faadc91f7caa7737dc82ec3d4b21936bca1bd7ce373ad66264af13241167549318cdd78e563827f85eab20e0b42bc554a712c0051a5010dc2f2c7db85acf6549f9d102c903c1be5a05292c30f21ab1b2b8abcbbf104723c63f0ebc554fbee42020ccb14f443478df77c6aa44db9a57f8fd44d97ea099e4774823ebe123fcf5016a66e837b2f65c1845e681ee2a7059fb1290cd0a933129855cc83c87e0b3bb61e44134addd3637850246cdcdaa29f15c41a3d4dd2c1d760062124333124cf091435fdce711f52316368999befa4c80a39b3750e4e386289e4e2855e97b619b0a25799912408b7d58a4dd9819571e901430f6d555529dd630a1867459b8022d0e0add6ab4f12f60baac75979bbff7f6258d28d6760b1ff243c39e4bbd6cf9bea572a9c082d05adcfd4ccf9fa026f2c904b6e782ed709df7748a307cd2dc3a0fc4123df580cbf49e05ceeabc9f39e57b7f300905d8b310091fb953f3def36deb3e8bf372f5916b51597df024ce85cc4c36eabdc580b5cf152994648f1d7f35fed5cd10f6e2949161a3359b3034d450ea6f61cdf1d5af76d40102b60294f4e49078249026d62fe35fdf224928b0c49ba2b5339ebb192c5ab7f05cdb946e37d671a4a5ef2a5827220b4438cbda05736292806648f5bdd52420fa76b84a6addb1263eb0c500e81566d718d5066026da097054a86631016ddfb706a5677d502ef84aa73b5863bc40fdc42cb7321ac5f00e2928fed7b0418596db4b6151dd6bc6e818f0253552bf13741e69680e966c92c293e13c90f7c9999bd1ec6afe3b4affb47340c89859829feb599db3a8c3d33fc8d45fa5381078ae9f75d85c1496f5fb5addf4e4009b764bcc9118e9275dc7219f281d0d1ef7158", "signature": "185fb1b6d86dc4444810cf5ec6fef0abdafa2a6fccb45d11cfb54ba16a6843f280d380471002ae0d71508556c78ed5415e42338c161f2b621e74cba4f6a1d402" }, { "secret_key": "49846ada7ae684971dd91710799090b37fe5ad561d72a35f2efb405f196ab0ec", "public_key": "4d370a8194a3045b09b3bdafa27fb9acd59943a54ae14cbaaa2200eb0f3da71b", "message": "ab398d94f928b1d42102a3e513ccd1cb10899011039410a8888bba26df1a0372bdba0ce8d854af51e9330a8daa93c10580906a8ac72d294aeb9566fe1c78ba8471c06c4a8a75113b34893f6276ed813292053b956a465d847d2ece86e2da8a9f0fe3db52a5aac746ef96485ef81f1362b5a42eaaee1fbb0646704471a21bf76367beaa07812b3d32adcdedded7539e3a501b83c05b19a49b520ededc9a78a5fc2d5012f1d4e381844e792ed90b0f57bce375c75a658b2c78c6ff7d9efcd4bfa35c4768cbb195e4823d9bbd835a374fa04ca1eaae9c566d8fd5aa7ca5efe0dfc317fffa409ef1022f1c3b376a935af557083e95287b07a98ac6c1b7bd8bb26b60fa7c4bc91973b201b29922b4b9d03dd6882a0bd3b7d9e5b81ee74c36bec665e4343c8c9ad336da3850c9b2697fe1cce29c378622a33c248f448c88f48df0260143b2a342f1ddee74d3b97ca3e1166b156993dad30c49d810d74048bc6d467652004d7edb65c6dac3a2c5d300b97ee3a10a9e14b69f3cad675972962e1f8ed97547adedc47d1cf3471ef3b22fdbf78e34f31a3bb7669c41bd9292c380bce9a42d84bc27ac928b8bfc3c63d20ccdb478df7ddf421fb1cd905ffc4c04786fd9aef06b8938ab8ef522217b2c04515f61a1c312ea83253f8458c0918fcfe874e6e7fb11275db2a2ec79a2d868303233c1b697952a3bfd3ad0a6f6cdd5e72cc9409f7410a40d5b4536dd46eb1611ae86703671b3a0515a0377bea15654ba0a0d1e4e9602632842f2acd4ef993236e993f2650d59923f24e2cd30932d8bf8aeec644472ba46a07881496c92a0135c675aeb0ce6181088db8f156cfe7435cac6c97da637db4a89f51331da13731e741fccc0355542ce11efa69d0538d3ef127aa68745ed3085d29da90dc583701b6b3a70a3ef3e16a924b33203b92396c4b945f127a7888fa05015c0603007566729237cc0782b30c020d9959547feec9f4d676460bfe0c5c19ceabaee0682db8be69135181ec0fdd9f7a66d50bdc379e4a2c598178f9593946aca6405b177fcade0f86421583ed67eba187222a1e44495b3ae544fdca28e2c14485eab0471aaa803c29a9d8a48926764fca1df51407ad33ec17e941e6e2617237a84309873dc71365587bde4274b5dc327ccb1e1e9c857e042ccca8d8552ba288c978cfa0af99d67cd034060628e23525dbca207679ce29690878448553cd38675bce07bf97b9317dc44468b768b158b0c111d63a572235655c40e16597ca059f40c3d8ac5bd61a487c15313846a704a7811b8bc0cee61e34762b6c1b7cea1c46e6087e9a36f89918a258b3fa77620be10c184c3fc39739024e98278fd65b82cad83699f3ad8c6eccbec8b7b1bd7914d3f6c3d02bf40283b1c1f1e98e308beaebbf894b8f5e91bbbc62535f923", "signed": "a5c809d1ca4cfbb3dc70a2a3a1f267c27330420719e3606218a1471cac57cb674b9b42827c5e9a7b25c8139c13dff60bde6c2dbad3a8361197c1fb19d2cd520bab398d94f928b1d42102a3e513ccd1cb10899011039410a8888bba26df1a0372bdba0ce8d854af51e9330a8daa93c10580906a8ac72d294aeb9566fe1c78ba8471c06c4a8a75113b34893f6276ed813292053b956a465d847d2ece86e2da8a9f0fe3db52a5aac746ef96485ef81f1362b5a42eaaee1fbb0646704471a21bf76367beaa07812b3d32adcdedded7539e3a501b83c05b19a49b520ededc9a78a5fc2d5012f1d4e381844e792ed90b0f57bce375c75a658b2c78c6ff7d9efcd4bfa35c4768cbb195e4823d9bbd835a374fa04ca1eaae9c566d8fd5aa7ca5efe0dfc317fffa409ef1022f1c3b376a935af557083e95287b07a98ac6c1b7bd8bb26b60fa7c4bc91973b201b29922b4b9d03dd6882a0bd3b7d9e5b81ee74c36bec665e4343c8c9ad336da3850c9b2697fe1cce29c378622a33c248f448c88f48df0260143b2a342f1ddee74d3b97ca3e1166b156993dad30c49d810d74048bc6d467652004d7edb65c6dac3a2c5d300b97ee3a10a9e14b69f3cad675972962e1f8ed97547adedc47d1cf3471ef3b22fdbf78e34f31a3bb7669c41bd9292c380bce9a42d84bc27ac928b8bfc3c63d20ccdb478df7ddf421fb1cd905ffc4c04786fd9aef06b8938ab8ef522217b2c04515f61a1c312ea83253f8458c0918fcfe874e6e7fb11275db2a2ec79a2d868303233c1b697952a3bfd3ad0a6f6cdd5e72cc9409f7410a40d5b4536dd46eb1611ae86703671b3a0515a0377bea15654ba0a0d1e4e9602632842f2acd4ef993236e993f2650d59923f24e2cd30932d8bf8aeec644472ba46a07881496c92a0135c675aeb0ce6181088db8f156cfe7435cac6c97da637db4a89f51331da13731e741fccc0355542ce11efa69d0538d3ef127aa68745ed3085d29da90dc583701b6b3a70a3ef3e16a924b33203b92396c4b945f127a7888fa05015c0603007566729237cc0782b30c020d9959547feec9f4d676460bfe0c5c19ceabaee0682db8be69135181ec0fdd9f7a66d50bdc379e4a2c598178f9593946aca6405b177fcade0f86421583ed67eba187222a1e44495b3ae544fdca28e2c14485eab0471aaa803c29a9d8a48926764fca1df51407ad33ec17e941e6e2617237a84309873dc71365587bde4274b5dc327ccb1e1e9c857e042ccca8d8552ba288c978cfa0af99d67cd034060628e23525dbca207679ce29690878448553cd38675bce07bf97b9317dc44468b768b158b0c111d63a572235655c40e16597ca059f40c3d8ac5bd61a487c15313846a704a7811b8bc0cee61e34762b6c1b7cea1c46e6087e9a36f89918a258b3fa77620be10c184c3fc39739024e98278fd65b82cad83699f3ad8c6eccbec8b7b1bd7914d3f6c3d02bf40283b1c1f1e98e308beaebbf894b8f5e91bbbc62535f923", "signature": "a5c809d1ca4cfbb3dc70a2a3a1f267c27330420719e3606218a1471cac57cb674b9b42827c5e9a7b25c8139c13dff60bde6c2dbad3a8361197c1fb19d2cd520b" }, { "secret_key": "83343e37ad091a85eec370701b81a58f9370a4b0423a070d60f92d8d1809844e", "public_key": "50b68bf726eabca53ac6c90d4eac554703712d22105554f05bf79f9d08fcc493", "message": "c7dadcac5d8795e174b69138912e70ff41e7a725faf385b773ed15098972b30d9b739372d975b480ccfdfc580e2e2ddf5e3c27ee791279ab95e4382b1459dd8d41ae360d4a878846692924feef390c0dbbfa35e4b82d7cbc33ee1581c52bd949385b2ee40263a57da1174bb4acad37cd8ae2a6b45f7a6d6bbef5a798ce85b9e05e7647e334ecfc776378de174c497c0f4075e625af7aed502cd1cf7f588d0d807f02e32f4300f228a50a667b5ad1fbbc17e0b3c57051ddc602f576079f6fc5889b7f2900711334420fc666f66dbaff4126336c353f1e5b564a664537f83786da5c5627745406d7b2fe3233bfd58ef464a06c95cfd0b988a76d053a644bcc159cad53a7c5dbb40eef5cd047056a3f09265b1325699c7d159d5c902440173357ffab8f7a5e389f468c333b782f80170ae90983af153f2e73bd2bef125e3d3868c2ab9ecf03aff76ecbeb18167ca2f711cd565851d7f04ee9d9b01b6d83a7605722620d28c84d6c1af42f6a769258f53c1f66da36666da5caa9bd9e8fbc169211b1aed9c2558f6aaf5b145abc721abb00720194e027035468bde3fe0b88884f4e9b26e771e6c7a0a55ea36fc50dec8cef162f9bba5b4b16105afd6e374e038d5c8587cfd7dd88290b2c9cab45a264d6540ea1416e6e4e74a12f45a2ef13cc8a36e7b0a26b902c3d96e2e2229202e25765694b943373d16e600bd786d955a4b3f1021640c39a0b6c691500281ae0d098cc7f385e18a07e62fa4a101ef5b78551fa29bd15ee0353a1a5ef9b216e8b0fa50750a34162b635a0bc5e5d7230aa19afa128aba6422d38eb77a3f0bb9dd8e4652f12070a37361c3725503c9d22e2face2ea74a7002406247dd86975f07575c9e7c6f41b53b26d5cf52c5acc2c5d98271434e9fa509c6dfbd724372aa5c13451aae393de0a186464f5d337e9f627b4f1c2909467065e89a422ec40ee1d80a133900a62f4e4f7e94eb72615e7ec2996c6c2430c3e957ceae2105a1e90eaeac0d31affa9f57926d71d972a9a2de11258cc1e728599c9fb3872491847e10c67efaef6b696a030ff0533a583bea1d04df25f7eef3a13b8e31aad133857df1b4e5ffbdee37f40f38d224c70ae04ef33b41b02e7191a86656b0d72b2cbb53c4908ca206f75734b27708154fcd8a97429cfd1f2da2429778438003f5b5b9c21d9ed23b8ad8a228eb4f65c24c1c59699a5c90aff773e5c676db362a1930ba16aba76ef8daa42b3eb2ccc45c934d23d4929a7ad9e3ef468b06a4995c80dd236a7bcf3879d8b79467f72b3384c160cc181714e92f2035e7b972a2cc5242d932525eae7c50bd263b0fa09cbd9d6f984b9cf6152d9a133c27843202d1e87fa5a6e1235d9c756bb8e68b05b98da54195223fdf0210253250633c11c5f60b5e67d7eefcaa6c2daa523137", "signed": "9c6989cbe17e16caa253ffb1a64a106fb01782c99b1722baf1acaa42ae5b36b79b2a2cd8fc91f5ad8923817025a77825a05df8c417ec53c4a3aa1c0efd5bbe0fc7dadcac5d8795e174b69138912e70ff41e7a725faf385b773ed15098972b30d9b739372d975b480ccfdfc580e2e2ddf5e3c27ee791279ab95e4382b1459dd8d41ae360d4a878846692924feef390c0dbbfa35e4b82d7cbc33ee1581c52bd949385b2ee40263a57da1174bb4acad37cd8ae2a6b45f7a6d6bbef5a798ce85b9e05e7647e334ecfc776378de174c497c0f4075e625af7aed502cd1cf7f588d0d807f02e32f4300f228a50a667b5ad1fbbc17e0b3c57051ddc602f576079f6fc5889b7f2900711334420fc666f66dbaff4126336c353f1e5b564a664537f83786da5c5627745406d7b2fe3233bfd58ef464a06c95cfd0b988a76d053a644bcc159cad53a7c5dbb40eef5cd047056a3f09265b1325699c7d159d5c902440173357ffab8f7a5e389f468c333b782f80170ae90983af153f2e73bd2bef125e3d3868c2ab9ecf03aff76ecbeb18167ca2f711cd565851d7f04ee9d9b01b6d83a7605722620d28c84d6c1af42f6a769258f53c1f66da36666da5caa9bd9e8fbc169211b1aed9c2558f6aaf5b145abc721abb00720194e027035468bde3fe0b88884f4e9b26e771e6c7a0a55ea36fc50dec8cef162f9bba5b4b16105afd6e374e038d5c8587cfd7dd88290b2c9cab45a264d6540ea1416e6e4e74a12f45a2ef13cc8a36e7b0a26b902c3d96e2e2229202e25765694b943373d16e600bd786d955a4b3f1021640c39a0b6c691500281ae0d098cc7f385e18a07e62fa4a101ef5b78551fa29bd15ee0353a1a5ef9b216e8b0fa50750a34162b635a0bc5e5d7230aa19afa128aba6422d38eb77a3f0bb9dd8e4652f12070a37361c3725503c9d22e2face2ea74a7002406247dd86975f07575c9e7c6f41b53b26d5cf52c5acc2c5d98271434e9fa509c6dfbd724372aa5c13451aae393de0a186464f5d337e9f627b4f1c2909467065e89a422ec40ee1d80a133900a62f4e4f7e94eb72615e7ec2996c6c2430c3e957ceae2105a1e90eaeac0d31affa9f57926d71d972a9a2de11258cc1e728599c9fb3872491847e10c67efaef6b696a030ff0533a583bea1d04df25f7eef3a13b8e31aad133857df1b4e5ffbdee37f40f38d224c70ae04ef33b41b02e7191a86656b0d72b2cbb53c4908ca206f75734b27708154fcd8a97429cfd1f2da2429778438003f5b5b9c21d9ed23b8ad8a228eb4f65c24c1c59699a5c90aff773e5c676db362a1930ba16aba76ef8daa42b3eb2ccc45c934d23d4929a7ad9e3ef468b06a4995c80dd236a7bcf3879d8b79467f72b3384c160cc181714e92f2035e7b972a2cc5242d932525eae7c50bd263b0fa09cbd9d6f984b9cf6152d9a133c27843202d1e87fa5a6e1235d9c756bb8e68b05b98da54195223fdf0210253250633c11c5f60b5e67d7eefcaa6c2daa523137", "signature": "9c6989cbe17e16caa253ffb1a64a106fb01782c99b1722baf1acaa42ae5b36b79b2a2cd8fc91f5ad8923817025a77825a05df8c417ec53c4a3aa1c0efd5bbe0f" }, { "secret_key": "da013221b2f588af40e211a0f975d44f9d65028160514c396189f27c7b0666ea", "public_key": "07117c6b0db5b6fda1edc4396c47c22b54ee0ce5375c3ec633c83afc53ad6ce4", "message": "bc93ee1ec4728ac636a6248fcc4551c9d15980db8e5f54b0ef075a71970e176a3cb9182e32da7a8c2ac0cd7e595774575f9c83506a606face89512135d032ab05e39fff9c8ca6c25cd5d78ecc3ac323290c9c81626735e190eb5ae345ca7a958409f7743b0b1614916832217c57eee1b4f8e622ac052a93dd5b39d0761e40e9fbd8396f60a3bf6660c5fa99cd8139f68cbe0894e5c67e168cc74b2724e9d91d6000a0cec587a11463f72ee6ed255bd87eb30fd457596f688ca0ea73f30497238de21c93fbb1294db61e4a56089106d1cf7ce5a65ec3d12170ce7840f088a8d0e3aef17e531de478003570258e927f156e7961065afa666af38582b353cc477ba775cae45946d08db75215914da3261b62294e92afb381459c21dda4ea6ed795f79257c094dd608dc8e1b7c40cd29fea222088f65697ea88895d10acea8797360dcbacee269c606600adffdcf9c7c381d0ad6696967d9ff03e61a24906502b295e76f4d0875655b01e6ffcacc8ef01129c72a5846b60ec80017374e75d306403d9eccf26495d298120a0633835c5d1eff17c9c62476f752c89710adfa4d51617b5918173cba722540e388ffbffb966874db00404d06b0ce1139ba74143c76b8f4d33b2116e1cce175173a96fc151ea239bfc20d66fbb6f52a666c0e81cc2b80209106e2480e4111c70e7be4aabb68422f0b8c6ba15c142f82e6c7f378d7800a09eaa4da253c2fd91e1263c6b655bf70255d7e3bb4775523a0a9e7ff03797ee3ffca8a50d10f20d5e5a889ec5e334ef26cf7998b0836f656456888e137f39d3e43e2ce3c6ef540d95d9a20c42cb8ae2d9d0f25a891c363ead9cc423f9a323fe232281fb67f5be1c0784361460468a87e95dfa35d7f0ffa2211be6b5fb32d42ba6518ab6ea93780f431d3006731be4440e712974f74baea419f4022fa2502e1b2398e9386167d93eca92ca60dd7d91fe82324f682d94aa7a86ab034f8a9e952e8fc95bff4dfed6a43313abb92401b30c33c79a7ba3efdbe1628040fbaf443f3f980846fdb283dccd93fab09708b7d54861d74b1fe8f10701f211ba3d390e8a6ae407739646a79a58337a717a872009c2df6761c2425a32a0018aaf9646470cbc87c3a65c0e0effbaa528fe4783c772ab266b8f28268cf14af234b15816d1a3a491af5f297e33d5729715d512c373fef5ecc3f3954a60a2a0f64d829474119ca1a18f10578d04d638d5eeafc371a946f6ce7efbd2acce34e20441cde9a37d5a87dc619b0a727596cd12e15cd9784bb91f1399a59fc0a7a4af68b0d575d93387172973375c465df5d2d5e061a2a9b23b4915a0a8b8c1f0942094af728c8c31145fa7aaf74a21a3b032bb09c392205bf095bda986e5dd6627c1e417f650326dfe3a9c9994c6e0e01276f91f2987d2b85deda965491", "signed": "10cb52d610e4a81d32869bffce3807e6391f782fcd538b554d09037fda72285b9662b1b1107c408178ac009f0525967388a7d85fa12359d3ce3875037dcf6a04bc93ee1ec4728ac636a6248fcc4551c9d15980db8e5f54b0ef075a71970e176a3cb9182e32da7a8c2ac0cd7e595774575f9c83506a606face89512135d032ab05e39fff9c8ca6c25cd5d78ecc3ac323290c9c81626735e190eb5ae345ca7a958409f7743b0b1614916832217c57eee1b4f8e622ac052a93dd5b39d0761e40e9fbd8396f60a3bf6660c5fa99cd8139f68cbe0894e5c67e168cc74b2724e9d91d6000a0cec587a11463f72ee6ed255bd87eb30fd457596f688ca0ea73f30497238de21c93fbb1294db61e4a56089106d1cf7ce5a65ec3d12170ce7840f088a8d0e3aef17e531de478003570258e927f156e7961065afa666af38582b353cc477ba775cae45946d08db75215914da3261b62294e92afb381459c21dda4ea6ed795f79257c094dd608dc8e1b7c40cd29fea222088f65697ea88895d10acea8797360dcbacee269c606600adffdcf9c7c381d0ad6696967d9ff03e61a24906502b295e76f4d0875655b01e6ffcacc8ef01129c72a5846b60ec80017374e75d306403d9eccf26495d298120a0633835c5d1eff17c9c62476f752c89710adfa4d51617b5918173cba722540e388ffbffb966874db00404d06b0ce1139ba74143c76b8f4d33b2116e1cce175173a96fc151ea239bfc20d66fbb6f52a666c0e81cc2b80209106e2480e4111c70e7be4aabb68422f0b8c6ba15c142f82e6c7f378d7800a09eaa4da253c2fd91e1263c6b655bf70255d7e3bb4775523a0a9e7ff03797ee3ffca8a50d10f20d5e5a889ec5e334ef26cf7998b0836f656456888e137f39d3e43e2ce3c6ef540d95d9a20c42cb8ae2d9d0f25a891c363ead9cc423f9a323fe232281fb67f5be1c0784361460468a87e95dfa35d7f0ffa2211be6b5fb32d42ba6518ab6ea93780f431d3006731be4440e712974f74baea419f4022fa2502e1b2398e9386167d93eca92ca60dd7d91fe82324f682d94aa7a86ab034f8a9e952e8fc95bff4dfed6a43313abb92401b30c33c79a7ba3efdbe1628040fbaf443f3f980846fdb283dccd93fab09708b7d54861d74b1fe8f10701f211ba3d390e8a6ae407739646a79a58337a717a872009c2df6761c2425a32a0018aaf9646470cbc87c3a65c0e0effbaa528fe4783c772ab266b8f28268cf14af234b15816d1a3a491af5f297e33d5729715d512c373fef5ecc3f3954a60a2a0f64d829474119ca1a18f10578d04d638d5eeafc371a946f6ce7efbd2acce34e20441cde9a37d5a87dc619b0a727596cd12e15cd9784bb91f1399a59fc0a7a4af68b0d575d93387172973375c465df5d2d5e061a2a9b23b4915a0a8b8c1f0942094af728c8c31145fa7aaf74a21a3b032bb09c392205bf095bda986e5dd6627c1e417f650326dfe3a9c9994c6e0e01276f91f2987d2b85deda965491", "signature": "10cb52d610e4a81d32869bffce3807e6391f782fcd538b554d09037fda72285b9662b1b1107c408178ac009f0525967388a7d85fa12359d3ce3875037dcf6a04" }, { "secret_key": "5a868fb75ea0721f7e86c7bc106d7413c8cf4d033ce14005df23ce4c155bbd27", "public_key": "6d1e29f39deda2bbfbb57cb01cb39e58808278e5196ada1c027646f20487d252", "message": "d5aa11825b99448c80630623d8c746017cfe3de6fa8a0c6ed6627127cfc1f84d4e0a54e6a7d908d3719f1421d1d4c78b3cdd94769ab6033bce979dd90e106802eba9a03295d48f9b9a95d57ee7745402a48023bf3bddd5c6b91c773e491913a38ac3462605cf282deac75742fbd27529276e81dcce8dff9605035e8cf05df6a43db151f0415765bcbd1f1bb668ad6273b891c0dc4f3dba590ea82f8363769b9c77511947117375dc4904d48b88b68a255b28011b11048194093e98207ab1cf756ab8331f8d6f9d5be2e1190573e95e710f2a3501b53aa0825d6c12dcfb94ac80dc1082cb4ad262e6d493adceb6bc19145fbf738df76f2134fa04cbbe44ffc55ffe5f9d3e9bebd159a001aa9bf78892a16538a520823cde5d61e29a56a77ab96e49e300d9865962c7e7fb8bcf5de0b938297c3f4d6f6021e24dfdad9861652f340f421e7af2c71ed9a71587fc753b115549b2f7f7cb29690ea2b158a94cd2bc42e7063d619b939d523e3c237eb1f40810de0b44aa6937863d629edd5575e6c0475261b627473092775c84360011d57c57209c2e875a3f8963e8b241a7aa75ef30c4a718ac4dd466dc7a3e40e5874f157a849ed3a3a9d4aeb7d94df09bb55a0b2bc9f8b695c37179302367606367c5f324828ce75a944f50703a47906a8088f3a11cfe4a854e01f1741252c486337d06b1cc6c6b9b1295431ee07359357b3a78ef5075b65d7fed5eb742e5101598444b46623f89a303acc10c732449513b70dc456a79d37c48e5e726c2f558da0a1c46efbd2d920326a678b8a22f0944be4af55b6c71f453fbae400e6acc04e0e95ca200167e96ee98ea839316da93a12c2d76f11aeebeb78e65ea48f7feebbb137b2ac67eaef02a2d9e6471dd634a037d4f5d35a2f78af41a8ea5af5bc8150a99ed68a6a0ccff2b1d7965d8bc3ef9285ba6421d87c33aad8103a587be01926845bfbddbafc69c4b9252886720d418509f40f3dcf55765dccc3deed8277215e69f056ba31b8a30b50094ea8f144720760c8f8c055cf1a86964ffcbb8ee1bb2181276ea99a7b8e71067fa310ba4471e84279037bc492a55de205548e77b014504ee6664c4988cbb9ed91ff32e2259ed4cfd61a197d0dbc32c68f6549c0d29fc45f36acb26b164de97ccdc37900d93cdbcf9687ef53f1f4da1b1ae4225b884209e81ba4311520477ed4211b09240bd7b825e54739fe25d8624af04b86f6d1106d18170e5064d1a73c1fb1a27b289a948d771a2f6b8b09a635db96c6251c35a1876d369626699416c0e40298a681fdaf5255f58c2557759d8f5df148dec9dbe1ce6df041c36f83e69ccfb4aaca5cb48fa6a85c8ff66061524d8b11bd7ffaed99d0cd45c42010f21d36cc316ca860955635bffaa7d9aac572dccf3153d42ee8a2b12baa57c160bd0ad", "signed": "38c48dba99a6524a188d5cd78a98e677dd263ef6b4df446b310b3dd89cafddb9b17a65bba8e13968bdc25b1d84b6e2436edf31aa756e3a48726d6f91c808ee0ed5aa11825b99448c80630623d8c746017cfe3de6fa8a0c6ed6627127cfc1f84d4e0a54e6a7d908d3719f1421d1d4c78b3cdd94769ab6033bce979dd90e106802eba9a03295d48f9b9a95d57ee7745402a48023bf3bddd5c6b91c773e491913a38ac3462605cf282deac75742fbd27529276e81dcce8dff9605035e8cf05df6a43db151f0415765bcbd1f1bb668ad6273b891c0dc4f3dba590ea82f8363769b9c77511947117375dc4904d48b88b68a255b28011b11048194093e98207ab1cf756ab8331f8d6f9d5be2e1190573e95e710f2a3501b53aa0825d6c12dcfb94ac80dc1082cb4ad262e6d493adceb6bc19145fbf738df76f2134fa04cbbe44ffc55ffe5f9d3e9bebd159a001aa9bf78892a16538a520823cde5d61e29a56a77ab96e49e300d9865962c7e7fb8bcf5de0b938297c3f4d6f6021e24dfdad9861652f340f421e7af2c71ed9a71587fc753b115549b2f7f7cb29690ea2b158a94cd2bc42e7063d619b939d523e3c237eb1f40810de0b44aa6937863d629edd5575e6c0475261b627473092775c84360011d57c57209c2e875a3f8963e8b241a7aa75ef30c4a718ac4dd466dc7a3e40e5874f157a849ed3a3a9d4aeb7d94df09bb55a0b2bc9f8b695c37179302367606367c5f324828ce75a944f50703a47906a8088f3a11cfe4a854e01f1741252c486337d06b1cc6c6b9b1295431ee07359357b3a78ef5075b65d7fed5eb742e5101598444b46623f89a303acc10c732449513b70dc456a79d37c48e5e726c2f558da0a1c46efbd2d920326a678b8a22f0944be4af55b6c71f453fbae400e6acc04e0e95ca200167e96ee98ea839316da93a12c2d76f11aeebeb78e65ea48f7feebbb137b2ac67eaef02a2d9e6471dd634a037d4f5d35a2f78af41a8ea5af5bc8150a99ed68a6a0ccff2b1d7965d8bc3ef9285ba6421d87c33aad8103a587be01926845bfbddbafc69c4b9252886720d418509f40f3dcf55765dccc3deed8277215e69f056ba31b8a30b50094ea8f144720760c8f8c055cf1a86964ffcbb8ee1bb2181276ea99a7b8e71067fa310ba4471e84279037bc492a55de205548e77b014504ee6664c4988cbb9ed91ff32e2259ed4cfd61a197d0dbc32c68f6549c0d29fc45f36acb26b164de97ccdc37900d93cdbcf9687ef53f1f4da1b1ae4225b884209e81ba4311520477ed4211b09240bd7b825e54739fe25d8624af04b86f6d1106d18170e5064d1a73c1fb1a27b289a948d771a2f6b8b09a635db96c6251c35a1876d369626699416c0e40298a681fdaf5255f58c2557759d8f5df148dec9dbe1ce6df041c36f83e69ccfb4aaca5cb48fa6a85c8ff66061524d8b11bd7ffaed99d0cd45c42010f21d36cc316ca860955635bffaa7d9aac572dccf3153d42ee8a2b12baa57c160bd0ad", "signature": "38c48dba99a6524a188d5cd78a98e677dd263ef6b4df446b310b3dd89cafddb9b17a65bba8e13968bdc25b1d84b6e2436edf31aa756e3a48726d6f91c808ee0e" }, { "secret_key": "c54bd3431f2659281d31e93b30787668bcba6e5ee47db46e50deabe3f48c9ed8", "public_key": "1eba6eb3f7f24cdf80abf8a19d308c24f1e25ba15970eda7116707b0f12cf932", "message": "6f8cdd75e1b856bbbe9cdc25537fdf7e8236cb029acd3984492110d0c30441d42184b5fb183da9f3140378dfa7d74ccc9ef500193cc9579fffa60bd2a8ab9e09581500cf06cd35abc171d9d12c6580d9682f9f49fe36d0a3177238fa50e7eb4c27e460f5e4580a56568a19e03d95b0ff4f4a231824cd2f3442e0ba400bc11b7a989d501f5df35e4301508f72a852014bfbf4001e28095473d9659eed6067baf68f92bef312c09b19aaf7c4fba3d902b9f6cf952eb9b9a53ca8bcbd042d842e9853b672a1d009d823838bebe5637c4c07ed1b1948554b23b32de1d6c116f933b354f28bbb779fa6548c48292b612c7f551a75fbc46c02736bf99e9c8ead56f05ab0427a6ec616e3dcc7757efdb7628d4e96325fe0ae254cef5cb7a704b35a920cb3fa2a03e961daf371821be0b30f19ae4952441e08a7d22f5431390a5be8097fd5797a1a6297664da42c2008d0321060ebe3181eb795a728925808da7867293b7208f377d3a771185e6d2c1c8ce18376fe3c0c1458c7f5be34f428a0d575931074c97cbfce8ad81313ecca73a9f3db434fbad4bbbff502bf7297e17a97a8864211e6789ba192036ea59a34d84ff2a111074c3f2373b10111b5daa789560cb35490954c88ea00c410df850ad00cae2f28e719fb06716988a9bb0bfc6c989d587e5685ae883c2c2e74ddbf915c9856aae8f3288fc625bfb2fe268d74f59f8b7d8363749769169007d5e67b7d0b8c8f5a9d9f9c7b745c0a4294762cbeca42d5384961e921a7efb65da8d1e03b6745cdf308097fb13d64fd2f8c10fa9509eb2d91387f00645ca7d0483b2cd14c206b8d7ae0a3fb7c09bc6843d102adcda19f8bbd851eb683c4435ceb4b3d23d38f56d4d1114eef0fc6f24df52770d8f1f3f82f4720e892b315244ef56c36b23fcd407978524140382e11740fd46fe4299923f52b88b4a9cff4b2b4b23a2e760ad81c78ba876931d9aaa4beed40fb10a799eb30d37f754778bac85bf0631d852be7d74a6431f384a4025c1091421d67a4e9c94c1be3690c6bf81d06bdaf32feabbaf1dc263f273a0b9ed65460baefcefcf6acccda0edd23df9e05128e29d661c4b44bd92d640faa853afd8370e563b40ae0149a1428e06e3dd8e66b79da21cc753ddc476e3d76e2f36f2b6c6bc1b65087d5f86c8ac354711a8c08f3486e479d6ae943f8846332d4e5b4bb2e8257e3083df4f81dd4f0c1ee1d97182166161a18597ee0b959de1c45591abf7c51033d7c66352deeb682e777aeae2fa8d3a77f470db78ddc1b1fc82840c4065776d9bfca9d392d9288ee9132aa3e4f2d19d0d93e01b666f3647abaf225c292419c8a82eba3e11ab103846fcd4935f41241477c0f152b7965ad54bb72bc3de2e0b79d6225e8fa7a6286b5fccbb35822e80c8bfea74cb48a22d241385395c2", "signed": "df4541dff1a9797feb617f98e4b57aa7714131ee8ff545ed5082e3568efd1c399cdc56f5582991eb8785fb33864eef7f553f3e248262ed548a1a6888f92e920e6f8cdd75e1b856bbbe9cdc25537fdf7e8236cb029acd3984492110d0c30441d42184b5fb183da9f3140378dfa7d74ccc9ef500193cc9579fffa60bd2a8ab9e09581500cf06cd35abc171d9d12c6580d9682f9f49fe36d0a3177238fa50e7eb4c27e460f5e4580a56568a19e03d95b0ff4f4a231824cd2f3442e0ba400bc11b7a989d501f5df35e4301508f72a852014bfbf4001e28095473d9659eed6067baf68f92bef312c09b19aaf7c4fba3d902b9f6cf952eb9b9a53ca8bcbd042d842e9853b672a1d009d823838bebe5637c4c07ed1b1948554b23b32de1d6c116f933b354f28bbb779fa6548c48292b612c7f551a75fbc46c02736bf99e9c8ead56f05ab0427a6ec616e3dcc7757efdb7628d4e96325fe0ae254cef5cb7a704b35a920cb3fa2a03e961daf371821be0b30f19ae4952441e08a7d22f5431390a5be8097fd5797a1a6297664da42c2008d0321060ebe3181eb795a728925808da7867293b7208f377d3a771185e6d2c1c8ce18376fe3c0c1458c7f5be34f428a0d575931074c97cbfce8ad81313ecca73a9f3db434fbad4bbbff502bf7297e17a97a8864211e6789ba192036ea59a34d84ff2a111074c3f2373b10111b5daa789560cb35490954c88ea00c410df850ad00cae2f28e719fb06716988a9bb0bfc6c989d587e5685ae883c2c2e74ddbf915c9856aae8f3288fc625bfb2fe268d74f59f8b7d8363749769169007d5e67b7d0b8c8f5a9d9f9c7b745c0a4294762cbeca42d5384961e921a7efb65da8d1e03b6745cdf308097fb13d64fd2f8c10fa9509eb2d91387f00645ca7d0483b2cd14c206b8d7ae0a3fb7c09bc6843d102adcda19f8bbd851eb683c4435ceb4b3d23d38f56d4d1114eef0fc6f24df52770d8f1f3f82f4720e892b315244ef56c36b23fcd407978524140382e11740fd46fe4299923f52b88b4a9cff4b2b4b23a2e760ad81c78ba876931d9aaa4beed40fb10a799eb30d37f754778bac85bf0631d852be7d74a6431f384a4025c1091421d67a4e9c94c1be3690c6bf81d06bdaf32feabbaf1dc263f273a0b9ed65460baefcefcf6acccda0edd23df9e05128e29d661c4b44bd92d640faa853afd8370e563b40ae0149a1428e06e3dd8e66b79da21cc753ddc476e3d76e2f36f2b6c6bc1b65087d5f86c8ac354711a8c08f3486e479d6ae943f8846332d4e5b4bb2e8257e3083df4f81dd4f0c1ee1d97182166161a18597ee0b959de1c45591abf7c51033d7c66352deeb682e777aeae2fa8d3a77f470db78ddc1b1fc82840c4065776d9bfca9d392d9288ee9132aa3e4f2d19d0d93e01b666f3647abaf225c292419c8a82eba3e11ab103846fcd4935f41241477c0f152b7965ad54bb72bc3de2e0b79d6225e8fa7a6286b5fccbb35822e80c8bfea74cb48a22d241385395c2", "signature": "df4541dff1a9797feb617f98e4b57aa7714131ee8ff545ed5082e3568efd1c399cdc56f5582991eb8785fb33864eef7f553f3e248262ed548a1a6888f92e920e" }, { "secret_key": "ea60da0179bcaf6b218142b1119046ffe6d85a741b0d166230bc6de3304f6773", "public_key": "506b2ebb49bd9b9ff66e6b7b1fab9668cb181b4fb5e4343dddd3f8a9d702031c", "message": "612d6ef6e4349ffae516e983e8fa7b52d9fd134282240d95143824bd4aae03234b76a8cd6d4068cf009e481c2685361c755042c4e6ab8703ecbf8f020cf5739a4c2a03c3731e9cf75aee25966153b9711515c6c39afa95f221ac3395b089c97ac9b514e17d55f796a3ecc135faaaee907aab1029647b48ac81749bab26627cf7095d74c2fcee35671c8bb46053f5151b0c2e5dabe0f2d6aa20413305020b2afd9ee3387b2c9ed0bc3fe2902af4100cec23327b0f1e4ca39ef6eaf6fdf5d5acf93fc868536d8cba401769329fbe93effc7ee6bf93a6e588bd551eaa512853952c81b245e5d229d294e41370b867808667887a6f9eba2a8d56a7a704e66b1c02f96e73895f483e44a5c566cb1af26573bfe2afce06b1fb5877e51ef3126a3f210fbf213ed65d5ca46c46ce4aa945bd8ca611e3836250f564f7ea35423982f9705fcd6bef46ae16cb0f6bc912c3f28642b8d87775b818e4e4e8061167899bd27a7e2fb8187ee9917d2d586bf9d499e8fabca83ddf58c7437eaacec4f444fb2bf745dccd8cae38944571dede2037dc41f0818a3d91e3020a7274c6674247876083d0e39746c9684061bf74ad588436ce1b763dbf4bfcf8de6e35c5a7626675c127292b21df3c16f81063322a75f3438886f1f0cebfc1a96f41384cbdd861b04f519ff6a9344d94f3d3a0aba8409dfcf18d01f2b5b455171639eea77dee706ea83dcd2b8b1fc5ec0d740761a5f05f7ec8d87ad1f292a50c8bae0ad32b03419a950d9fe3b3ecc4d8d3aa95e02b51b1831d83eadeaa44238635f9c65efe2f6744a70b9ae41ef15d97908c0533934412f79583d0e9b3d706a128e88fb51eedb65e46d8a2b38bbdd6455554967a8dc0c68bddfeae0f8f72f0b886c3c741fac4f91e5c491dbae9da4594836cf1d9fb6ee130025089aed350ef247bc9887a2050159dded1428ffd9b07b9ec2e3d4bbdc2ddb54e873b63f2475233e19133a14b6658509457008186d6225995a96726b529f44281aa24fefd1cff8f815d93a5986931662290b3ee16833c60f0afcef2cbc000623f3931909ca976a094e2b0fdb7dcf7c485e14988a36f19b66425385f5632cef65d1d3414623ae3ee816e763a5f606466622be6602114502951cf0c097c1648a72e2c43d9afa9689f2c3cfe026cdce3bd1bf9ebf777562ecd8ff1b0d775306d900443f30a843310b8de6a38ff108b723913d7899b9fbe7c3d766ef8bdfb6d8b0b52956cb1cec9936d70b487c01440a842b2fabe38e7b8851a387d358be7ef12a7e4f2b527e83090d67eb013c9c2cfd3de5a1a3f99748a41f4819d9036e500c504c988bfd24f617d6ebdcab2ddeaa61579414f360b469a33a6ded96ba1d8c140c4ffc94990d8adf78cd38780bd68663d1a0ee33f537cdf892d562e82dcd1d912cad38d65567d291406", "signed": "27fb6b5f06528a64198a3e7d67c738840a8cff4b482b4d524b122d17d2aebcc0389be2c6e28e2cdfc484c18de425db56cdfa561c507cd970602d3a385d3aea0f612d6ef6e4349ffae516e983e8fa7b52d9fd134282240d95143824bd4aae03234b76a8cd6d4068cf009e481c2685361c755042c4e6ab8703ecbf8f020cf5739a4c2a03c3731e9cf75aee25966153b9711515c6c39afa95f221ac3395b089c97ac9b514e17d55f796a3ecc135faaaee907aab1029647b48ac81749bab26627cf7095d74c2fcee35671c8bb46053f5151b0c2e5dabe0f2d6aa20413305020b2afd9ee3387b2c9ed0bc3fe2902af4100cec23327b0f1e4ca39ef6eaf6fdf5d5acf93fc868536d8cba401769329fbe93effc7ee6bf93a6e588bd551eaa512853952c81b245e5d229d294e41370b867808667887a6f9eba2a8d56a7a704e66b1c02f96e73895f483e44a5c566cb1af26573bfe2afce06b1fb5877e51ef3126a3f210fbf213ed65d5ca46c46ce4aa945bd8ca611e3836250f564f7ea35423982f9705fcd6bef46ae16cb0f6bc912c3f28642b8d87775b818e4e4e8061167899bd27a7e2fb8187ee9917d2d586bf9d499e8fabca83ddf58c7437eaacec4f444fb2bf745dccd8cae38944571dede2037dc41f0818a3d91e3020a7274c6674247876083d0e39746c9684061bf74ad588436ce1b763dbf4bfcf8de6e35c5a7626675c127292b21df3c16f81063322a75f3438886f1f0cebfc1a96f41384cbdd861b04f519ff6a9344d94f3d3a0aba8409dfcf18d01f2b5b455171639eea77dee706ea83dcd2b8b1fc5ec0d740761a5f05f7ec8d87ad1f292a50c8bae0ad32b03419a950d9fe3b3ecc4d8d3aa95e02b51b1831d83eadeaa44238635f9c65efe2f6744a70b9ae41ef15d97908c0533934412f79583d0e9b3d706a128e88fb51eedb65e46d8a2b38bbdd6455554967a8dc0c68bddfeae0f8f72f0b886c3c741fac4f91e5c491dbae9da4594836cf1d9fb6ee130025089aed350ef247bc9887a2050159dded1428ffd9b07b9ec2e3d4bbdc2ddb54e873b63f2475233e19133a14b6658509457008186d6225995a96726b529f44281aa24fefd1cff8f815d93a5986931662290b3ee16833c60f0afcef2cbc000623f3931909ca976a094e2b0fdb7dcf7c485e14988a36f19b66425385f5632cef65d1d3414623ae3ee816e763a5f606466622be6602114502951cf0c097c1648a72e2c43d9afa9689f2c3cfe026cdce3bd1bf9ebf777562ecd8ff1b0d775306d900443f30a843310b8de6a38ff108b723913d7899b9fbe7c3d766ef8bdfb6d8b0b52956cb1cec9936d70b487c01440a842b2fabe38e7b8851a387d358be7ef12a7e4f2b527e83090d67eb013c9c2cfd3de5a1a3f99748a41f4819d9036e500c504c988bfd24f617d6ebdcab2ddeaa61579414f360b469a33a6ded96ba1d8c140c4ffc94990d8adf78cd38780bd68663d1a0ee33f537cdf892d562e82dcd1d912cad38d65567d291406", "signature": "27fb6b5f06528a64198a3e7d67c738840a8cff4b482b4d524b122d17d2aebcc0389be2c6e28e2cdfc484c18de425db56cdfa561c507cd970602d3a385d3aea0f" }, { "secret_key": "b62c241878273513e0bf6f33d2104365b2ce9c5a1b786058e9c5b4d1d192f87f", "public_key": "bbf6fc5198f3fba5ab007f8a632d28d1af865d290fa0a90faa9a9b5b9c13f3fb", "message": "26a3c26a5a189cad407cbaa3a6867ac0a26088c75f9d0fa19bd50274cec5755a497109a473284d6fc81ad4b9ec29fa7ec9764fd3099f060e36836552ff2413e3d5095fe0b1a8bfcf67ee06aa9032e7bb3249698047714d281415273c9834ad9eb665a7d97220e72d9ca73f31afa7738675ba3162efefe7479a5bc4bce2e8b7af4741d703dc9bbd60b4cf4b9087f6cf86cf53aed02bf4ca6a18f607cb52a303d78e85ad88fdfc86dcb7187727b03be227745bea744fd006525bc59a4dddab915cef40a8f30802913b7913eaf974336552e2f1456ad803dc58c9b4b18efaf7f7e357e2cd77d138d90080e296d1364a2f324d3e0d6edc20b8bdaa9d2e871f5e7b051fb6fcdb5595f21d3f8de29fb78678fa479eaa32579c784d513ac5f836d954d0d3fc0e5fc8a6eeab90202b4c4a2bec24cf63ea67c470096218cd431e883105fc9c27f9ea77c18eda69bc00a2242bd420f095c9b9a92d956ccc5a8572b057a7fe173eeb2a3166cb2089d113a816462b25805b8abaff5b0b2287c508ec2b8c34b2195c332870d3cc396017a16b9e0da6182d071d3bf363d3f1e7b7da11d711250a58afd74ed3e3158d4718bad4d274bb3444cfc318074b53beba44a2a34ff8eb726e4a1daa911051621651898b887169f62b9c0f4020483ef544f8f572fa6a6640a4cffce976cb7024f847bdc95d1d7ce653505debfc6988ed289dd47a9eb261259e3e65e45fc9d714946935cd8ea13bc6db5eaab9e8b10dae0fdd6979c2035cfb8098252f2205443b808816bf7787b7f1e78bc98a7285e733d45fc4610c20977ca3229889bb8cd2b694ce9e3fe78303af83e106422542fb7961d32eb1d2c5fbe60751674b074773ee0616e02973f6a74a3ae4664a2650915a3e10493b9e66a39fa5c89c61d44735f107d33757ae679b43a8d43a01757ae1f3279e862442e150715550ee82e49c0d4943faf13f22791f0e66f24ac50ab3c003852b21e15b2f006edc2cd6a879c476ab5b352eb1099dad4c50372400faa5498d78c6b857034c25caf7b933faf6bd7c59fa3da57397b603de9cb9d80e51f7997baa462acd537e2c4194c76c7e0be6512bce4d63660b36c7cc46631fb9671ad8c5d28e2f2ee2edce81954421b8a3d9ff6f66699f4bce88bcb8ef192c262a74ab7e191eee9101a28d4b66282b5122093d141c6496c7aba4d352e472ee7440e05af60da0cfc93e303642ba8fb8e5c568687abd63afb3ed6a32b6dae56a7e5d73debaf41d35ca36adb97a22c0adbe718bec1fa51998de9b4b96a79c5b9655b0165d5e1b9a8cc552e8c9329ede58df74c67b2ba1a842fd3e8158c1fea3a99b56a2c2a96207853d26022cec170d7e79944d2f56aab1f191bfd48d725490ca82b8d906f0680e69eeb9575774fb9d604513fbc26f5d303b6885cac0bf8efee0538f92", "signed": "c59039587b38dc141e055a93850104d629e380705b8fc918847c5e2a352da3a02fce7f7199f4ae2b1e2a59483418932e185f7e45b5050c642cecc7e78199850726a3c26a5a189cad407cbaa3a6867ac0a26088c75f9d0fa19bd50274cec5755a497109a473284d6fc81ad4b9ec29fa7ec9764fd3099f060e36836552ff2413e3d5095fe0b1a8bfcf67ee06aa9032e7bb3249698047714d281415273c9834ad9eb665a7d97220e72d9ca73f31afa7738675ba3162efefe7479a5bc4bce2e8b7af4741d703dc9bbd60b4cf4b9087f6cf86cf53aed02bf4ca6a18f607cb52a303d78e85ad88fdfc86dcb7187727b03be227745bea744fd006525bc59a4dddab915cef40a8f30802913b7913eaf974336552e2f1456ad803dc58c9b4b18efaf7f7e357e2cd77d138d90080e296d1364a2f324d3e0d6edc20b8bdaa9d2e871f5e7b051fb6fcdb5595f21d3f8de29fb78678fa479eaa32579c784d513ac5f836d954d0d3fc0e5fc8a6eeab90202b4c4a2bec24cf63ea67c470096218cd431e883105fc9c27f9ea77c18eda69bc00a2242bd420f095c9b9a92d956ccc5a8572b057a7fe173eeb2a3166cb2089d113a816462b25805b8abaff5b0b2287c508ec2b8c34b2195c332870d3cc396017a16b9e0da6182d071d3bf363d3f1e7b7da11d711250a58afd74ed3e3158d4718bad4d274bb3444cfc318074b53beba44a2a34ff8eb726e4a1daa911051621651898b887169f62b9c0f4020483ef544f8f572fa6a6640a4cffce976cb7024f847bdc95d1d7ce653505debfc6988ed289dd47a9eb261259e3e65e45fc9d714946935cd8ea13bc6db5eaab9e8b10dae0fdd6979c2035cfb8098252f2205443b808816bf7787b7f1e78bc98a7285e733d45fc4610c20977ca3229889bb8cd2b694ce9e3fe78303af83e106422542fb7961d32eb1d2c5fbe60751674b074773ee0616e02973f6a74a3ae4664a2650915a3e10493b9e66a39fa5c89c61d44735f107d33757ae679b43a8d43a01757ae1f3279e862442e150715550ee82e49c0d4943faf13f22791f0e66f24ac50ab3c003852b21e15b2f006edc2cd6a879c476ab5b352eb1099dad4c50372400faa5498d78c6b857034c25caf7b933faf6bd7c59fa3da57397b603de9cb9d80e51f7997baa462acd537e2c4194c76c7e0be6512bce4d63660b36c7cc46631fb9671ad8c5d28e2f2ee2edce81954421b8a3d9ff6f66699f4bce88bcb8ef192c262a74ab7e191eee9101a28d4b66282b5122093d141c6496c7aba4d352e472ee7440e05af60da0cfc93e303642ba8fb8e5c568687abd63afb3ed6a32b6dae56a7e5d73debaf41d35ca36adb97a22c0adbe718bec1fa51998de9b4b96a79c5b9655b0165d5e1b9a8cc552e8c9329ede58df74c67b2ba1a842fd3e8158c1fea3a99b56a2c2a96207853d26022cec170d7e79944d2f56aab1f191bfd48d725490ca82b8d906f0680e69eeb9575774fb9d604513fbc26f5d303b6885cac0bf8efee0538f92", "signature": "c59039587b38dc141e055a93850104d629e380705b8fc918847c5e2a352da3a02fce7f7199f4ae2b1e2a59483418932e185f7e45b5050c642cecc7e781998507" }, { "secret_key": "0f77f77a1c7e04bda8e534f4e3eff9a238cc14876b7e3eca8bede1923a336406", "public_key": "1045ea9fe214583a0cdbc494932bc44afeeb080bec485cc234fddcff139cce00", "message": "0ecb746dbdb0161421afeb7adea7a37c2ea4408a592c9d781ed6ac6f4ee5cc65d5270e4cf27632f7c5c133d439b78d1f71aa6dd80713d90b151e19121bfa87710e84a4850a3b5b0265ba2603d0716e9b7e1122109c39c6f1027fce18798cbb4f6bc5e4d7aca4704690f5c981510871c313595798338681107f2b5794d46f6e0bde2cd064b3b1fc00ca47188bbbc1f4a0ce305cc6d8a896920eb9ebae579fd3385f8f1f35976288f4c58ffc4760f359b003c872e9a24055355ea9585e951069dca25fd0cc0b9db52aaeaf19d43f2eab4f835603ad12d2dc49b310256b94bed54896a16b69b09cb4c8ff5c23cce5593d87ade2a82ada50859e1544c18618a65c007ef424c9854a175b6e6c0e64b2c8eb8ad4d28b977d68e78169915198975394d3b9b269cab0d3261b2b56cd2cc4bddbd4f1439e0dbe2c9b3f3f7514edac5ebb4622b92a69a840a9028550b221db59ddfb001396f86392a17f08ccb194cd9e1a0081d7dd9cca2357feb8b795e517029f79c82a3be6f9a031dd1af1e79e4982bf8e76b310f9d355efcd5b1efa9f359c17cf3b510d513e8cd5786a0d3445dc59a8433a46488687b0f58b1bd6567c2af4873b51fc845e767e243005192f8f0674f281265a55d76cea322260c932cea6717adb98a2dda8c698e2e89255feb77da7648167bc1e58877feb72d1d14b0c304f07372d955675237c49f7a6dbc915e6814abae6cce4caf9f48087e9dfb282d8f340377c1e29c6731ccc2667da6695b712be0312d865111934f168d5544365ddae27abc64aefbcb322db7d97d90d957a637bd826c227e9eb180b45a431626a6fd890c0e5f4ed7e856474752f80b5aef6e73efdaa6c2c451bd74c1ef466ca3aaa2573bb52cb2b1ca96a1b574403ceae1cf05ffc53430e1e4cd5593bd1ef84bcbfe219f08160d166f2731d99b8d7a32b12991f77775a267ec08297ec512d7b72435632525c04000fb00a793f8b5f8f3747b55359df21b7e2c49f2b0b9ae082afc70a146871370b8d50086de00f9448be8902174ba2cc851fa379dd7031ca457a8869af4b6c2729dac519556b8bb4ab519ef1bb024ea8b7f01771c9aab748e57381a0192a6e398cbe6dd9f367cc7b3354f83b79bcda46b793a4ada85549c8d6bdd6168124362ff908aa1a0cb78aa330c42d5a5d481235acac3a919b969c50987266d404d15d0e706fd9007634f69e13c56ec47133884fcaddc16beeeed19e0cd917aa496367867dfcea274e1a47da774f3c9363021e7c8d6bf8f00053facc11cb68a9d6e1fc2d6d19175d6324ff7ca6c23058b8b693d8fd4e0b51dcbb113543f2fcc0452eb9d967ac0fa9b23e9e0b1da8d83a3c1fc9e9ec971f0f67fc745bb17376bc46245f528cb6e5fee11bcdda867b7f79019cf9db591858230aecb4d1e93d167cd86b42dd879a13fa0e", "signed": "b20b9c4246f0d2970138af7dc9af629b68fbc37df87afdcadcb545c1768376a09c3babc3eb1af3b7519852f75fab1c9c119c662c5877fb2f7299cab57fad3d0e0ecb746dbdb0161421afeb7adea7a37c2ea4408a592c9d781ed6ac6f4ee5cc65d5270e4cf27632f7c5c133d439b78d1f71aa6dd80713d90b151e19121bfa87710e84a4850a3b5b0265ba2603d0716e9b7e1122109c39c6f1027fce18798cbb4f6bc5e4d7aca4704690f5c981510871c313595798338681107f2b5794d46f6e0bde2cd064b3b1fc00ca47188bbbc1f4a0ce305cc6d8a896920eb9ebae579fd3385f8f1f35976288f4c58ffc4760f359b003c872e9a24055355ea9585e951069dca25fd0cc0b9db52aaeaf19d43f2eab4f835603ad12d2dc49b310256b94bed54896a16b69b09cb4c8ff5c23cce5593d87ade2a82ada50859e1544c18618a65c007ef424c9854a175b6e6c0e64b2c8eb8ad4d28b977d68e78169915198975394d3b9b269cab0d3261b2b56cd2cc4bddbd4f1439e0dbe2c9b3f3f7514edac5ebb4622b92a69a840a9028550b221db59ddfb001396f86392a17f08ccb194cd9e1a0081d7dd9cca2357feb8b795e517029f79c82a3be6f9a031dd1af1e79e4982bf8e76b310f9d355efcd5b1efa9f359c17cf3b510d513e8cd5786a0d3445dc59a8433a46488687b0f58b1bd6567c2af4873b51fc845e767e243005192f8f0674f281265a55d76cea322260c932cea6717adb98a2dda8c698e2e89255feb77da7648167bc1e58877feb72d1d14b0c304f07372d955675237c49f7a6dbc915e6814abae6cce4caf9f48087e9dfb282d8f340377c1e29c6731ccc2667da6695b712be0312d865111934f168d5544365ddae27abc64aefbcb322db7d97d90d957a637bd826c227e9eb180b45a431626a6fd890c0e5f4ed7e856474752f80b5aef6e73efdaa6c2c451bd74c1ef466ca3aaa2573bb52cb2b1ca96a1b574403ceae1cf05ffc53430e1e4cd5593bd1ef84bcbfe219f08160d166f2731d99b8d7a32b12991f77775a267ec08297ec512d7b72435632525c04000fb00a793f8b5f8f3747b55359df21b7e2c49f2b0b9ae082afc70a146871370b8d50086de00f9448be8902174ba2cc851fa379dd7031ca457a8869af4b6c2729dac519556b8bb4ab519ef1bb024ea8b7f01771c9aab748e57381a0192a6e398cbe6dd9f367cc7b3354f83b79bcda46b793a4ada85549c8d6bdd6168124362ff908aa1a0cb78aa330c42d5a5d481235acac3a919b969c50987266d404d15d0e706fd9007634f69e13c56ec47133884fcaddc16beeeed19e0cd917aa496367867dfcea274e1a47da774f3c9363021e7c8d6bf8f00053facc11cb68a9d6e1fc2d6d19175d6324ff7ca6c23058b8b693d8fd4e0b51dcbb113543f2fcc0452eb9d967ac0fa9b23e9e0b1da8d83a3c1fc9e9ec971f0f67fc745bb17376bc46245f528cb6e5fee11bcdda867b7f79019cf9db591858230aecb4d1e93d167cd86b42dd879a13fa0e", "signature": "b20b9c4246f0d2970138af7dc9af629b68fbc37df87afdcadcb545c1768376a09c3babc3eb1af3b7519852f75fab1c9c119c662c5877fb2f7299cab57fad3d0e" }, { "secret_key": "c5a5053477ae31158e7469dd1504867650d46f1589067f5cd881caf25c26cb21", "public_key": "70f85db9807b26fcf3e6690b91724f7ae3d20ec3604ab7d6308d9094308b2d59", "message": "8571ff3903486a43a6126c323e7b3a74141d1385d4bd703f19e2d1b64b50281d27168ae3e769c6dd9df7d97864fb37822f0021852e3168ab7d845a6545ed0c377d9f7c048a2b96e8dcf445779684a058c2b9c21ac68a0c341d1d6c0981456457458eb7cebf66678740777eca26e01e1c8f53b5d4756cc5f0b90f0c5db05393cd4b8e44f6810caa5a116a33577724395d413af619632a6fed14e215c2f19d105ce2bf1498e6d2ab4f650f61ba5cf6d0c73bbbde98e30429910a4e67dfbc717cb091182d597058b5d765d097e6875831b588aaeb3e7327e856b42fa983fd254ef1f918b043d1dd3d7b7e30b315386eec91e7f94d598f4beb3b27b42f4ee1fbf7afb486bdcc6081ccb867f04111044f4bbbe3c8122edeadefa9d693906e0d6e133bf6f2da6158feedbda024410f12086e7accf1c68e1557f00c14e9c7ea76a5ed1337a054ac2c949c05977e030274f6a4f2a6b30a15c570ec9433f74f47528087c9ce9a6292951c54354996fb283c0dc4cf33c001bc96875ea6e1f46f837ff18dd9545fb9934655342b12c2990b9f1c6ff4d66489d6aedce75c7cb03ac134bfd39b181dfb7f9a97ce737fe570ad5f81345939a6de5a40a33a0e44bf957503d5ca0283512e57fba8a3a6f2c390687b1b7708676e0fd03b7c188d4561c1879163eaf2b596ddd5f3c1f4dadbc139c2164892820b2fe09cbc3d19088076364510254f2b6d410329e70f2e5a945bbacd2ca89bd4b6e1f5e2e1d4f4ed2fe0113bcf32962f00d5c33b1df988402ba0dc8804c1af66ccae2670efa3134c67fc90feed8d8deedccf6a46f22940454af2bb6754cf235ddbb0001c6c741bf874bcd8d41d9dba8162581c3746d7f30e73def69415af5181c149914295122d45982f94943e20b0ffc7fe6ddf19a022e87a52133357a1e80f37f28a4c4a8a61c148dd875c1e8ecdcd840dd863e44d9bcb16b6e5af0147b34a7a9052c8d3f452013d2d354f6803f9eaf6056f3b013c616e47f398819146320a5e3dbdf16843ea29def262cc9a343672cf96bccc6e87e6a6baf0712e6ee89aa60489f17cb72ddc44bad161587d87f54d67cc0a2778497d831088315ffeee3d268c59befe884c3aa0e0ae2296bbb60eac9097cdf8dc0987ceb1742b0586dfce79ec10425b28f4e64520d712e3f46ea83be2de6a1574073bc5c7557b8e25b6411184ea283d8800232c79069421811f883c2994e7b7e2ad9f8dc489c9347724394609c98909a6c26017b50f20d50ccacbde36b76ba646a76dc6a5b0f50649c5658bbdfdd3b5cafc5479a2f48ee51542f23e9fc92132060fd635eff452111cdaf3efbdb7db9e7d4716d0d6011c29118a55d4c1a436abe24e3cbf40235b76dd1923503c5f3598124e2df55a2d1f246e90de4b71645d5175b61b0174e7e57df1285ccf8c86b8382c258079", "signed": "f5191b44bd6cc3ea281771df12549ba2be228b51eb791b9e5ed2815f862aa630b56967cdef8b6af0b9d21ab8c97a6dff681cced9f5019713d4357cb3e54c0d088571ff3903486a43a6126c323e7b3a74141d1385d4bd703f19e2d1b64b50281d27168ae3e769c6dd9df7d97864fb37822f0021852e3168ab7d845a6545ed0c377d9f7c048a2b96e8dcf445779684a058c2b9c21ac68a0c341d1d6c0981456457458eb7cebf66678740777eca26e01e1c8f53b5d4756cc5f0b90f0c5db05393cd4b8e44f6810caa5a116a33577724395d413af619632a6fed14e215c2f19d105ce2bf1498e6d2ab4f650f61ba5cf6d0c73bbbde98e30429910a4e67dfbc717cb091182d597058b5d765d097e6875831b588aaeb3e7327e856b42fa983fd254ef1f918b043d1dd3d7b7e30b315386eec91e7f94d598f4beb3b27b42f4ee1fbf7afb486bdcc6081ccb867f04111044f4bbbe3c8122edeadefa9d693906e0d6e133bf6f2da6158feedbda024410f12086e7accf1c68e1557f00c14e9c7ea76a5ed1337a054ac2c949c05977e030274f6a4f2a6b30a15c570ec9433f74f47528087c9ce9a6292951c54354996fb283c0dc4cf33c001bc96875ea6e1f46f837ff18dd9545fb9934655342b12c2990b9f1c6ff4d66489d6aedce75c7cb03ac134bfd39b181dfb7f9a97ce737fe570ad5f81345939a6de5a40a33a0e44bf957503d5ca0283512e57fba8a3a6f2c390687b1b7708676e0fd03b7c188d4561c1879163eaf2b596ddd5f3c1f4dadbc139c2164892820b2fe09cbc3d19088076364510254f2b6d410329e70f2e5a945bbacd2ca89bd4b6e1f5e2e1d4f4ed2fe0113bcf32962f00d5c33b1df988402ba0dc8804c1af66ccae2670efa3134c67fc90feed8d8deedccf6a46f22940454af2bb6754cf235ddbb0001c6c741bf874bcd8d41d9dba8162581c3746d7f30e73def69415af5181c149914295122d45982f94943e20b0ffc7fe6ddf19a022e87a52133357a1e80f37f28a4c4a8a61c148dd875c1e8ecdcd840dd863e44d9bcb16b6e5af0147b34a7a9052c8d3f452013d2d354f6803f9eaf6056f3b013c616e47f398819146320a5e3dbdf16843ea29def262cc9a343672cf96bccc6e87e6a6baf0712e6ee89aa60489f17cb72ddc44bad161587d87f54d67cc0a2778497d831088315ffeee3d268c59befe884c3aa0e0ae2296bbb60eac9097cdf8dc0987ceb1742b0586dfce79ec10425b28f4e64520d712e3f46ea83be2de6a1574073bc5c7557b8e25b6411184ea283d8800232c79069421811f883c2994e7b7e2ad9f8dc489c9347724394609c98909a6c26017b50f20d50ccacbde36b76ba646a76dc6a5b0f50649c5658bbdfdd3b5cafc5479a2f48ee51542f23e9fc92132060fd635eff452111cdaf3efbdb7db9e7d4716d0d6011c29118a55d4c1a436abe24e3cbf40235b76dd1923503c5f3598124e2df55a2d1f246e90de4b71645d5175b61b0174e7e57df1285ccf8c86b8382c258079", "signature": "f5191b44bd6cc3ea281771df12549ba2be228b51eb791b9e5ed2815f862aa630b56967cdef8b6af0b9d21ab8c97a6dff681cced9f5019713d4357cb3e54c0d08" }, { "secret_key": "05c719cae06e2bb7d87863ab3150272cb2f8c3aa2421912d87f98e7589638ce9", "public_key": "90211796fed3d53b81f8feeb1bad1ffc933e5f10d3bc1b36ddf210a47923df03", "message": "ec241918418e60522042e67339e6649499f31a6c7cf8925f1f61dde894603602ae8bb5f58809821f83344f23cd31e64ec9ffe79a986b7e29e4319a63414316bd6ee20e02a50da44012bd2d6f9f679e88ed0c8bb1e2cad55e565789883345b7546f3d54b1b362b1c650502c019d7313afbc82689b23a3a52d8f1af9f81e188dbdf203fb5300b4225bfb6773337be6750b3db88ce097343f62ee2c118574ef150cbd4c62760c3e43dcbc39218bd6d98565fa389811b1a674f617fd756733dcb567a92dbf3855b57b1f4a46d5b8974b39ac0d0e24d99d2037c04f60d9140f64b07a77d7eaa1ce8a78e844b1dcf0e37424f3f9d253a548561a0375a8d4341297bfedb7048c7935e1481418f9bba9271f9fd6026224e78e055d8a0939fa2fe1dbc0fc7b583e4cff3490e1d0f610b252e30d8497d00e4aacb375f19a4719f79ca1ea583a2f8b1406a4aa5cb55c08b6593b676eb5c34abe89392d62d23308a3348b57affbba7739cde8e1909d3425eeb20926a977d3a94a86e0ba10b386926698827e86b4fd6c6180047c87ec3b31619d05a9df34efd3d76a836962b2ef604d07af0975eb8f3dd22594323802564c929b3f65dacb572b32553d69b31a197690a9bb860b080a77cfbb3c175aafce0146a82a4d06e8c750521b726ef1cb29d021e5915e5e8462ede5395445245c9ae882eec4b1745e11791f7621d3fe702cac1525e1f7b46e1105cdd06da2afde26475dc1f78df8e2d72b0ec3ef7dd956193c996842a432696538cf123d7687211ffcd090b9381eabec879f769aac0d3564e16df794fa24728d7172fd07732eab077ed81c22084f6f781b626dac67428a9ddf3b0db0465251220d18b8bf620464c51a578decccbbaba545ed442cf12c4c66f6cb6e6901ea54aeda236ec45eef886a7ddd2c041caba3a6cee339715b6ce97e765ec3479f3d52824a8194bec2a89647e8c63ff7645ff6d05367c767bc48cc96baf05d6a415b2a5aff9bfb217948fad357b98f47dfed62ff1285eb9f468f0f29edd75adc0c8c2ff6a565edb8edfb48bea03b70c447369c52d881eea0eedb08c315cdf0bfeb979c1c0250946bb100c2866b4169b8cbd44d658f0236e1e9f3aa13bb8e8022a38ce997c94b5baf97e0ba621f7e09671ce638c2a39ee6c6e25a688019dd167675ceaec21c6b42a7c8c476d129dcc693c392a02be91b87437a08a0ebf1a7bd976ba23774766838b8d6024f5bb9b07f3c6b719b4de15b72448048ab70db3d4bea77ba359b51b1ec17dbe8010aef0244a8079ca8b9a2a797f3b1fe047c8dd5cab7fb486829239c4ef6d9a38370d488c47b7c030e49a5500c9abb39a9a5abfe72e918b76384ecaafe1627266cd14e696c09d2512e312582a8a911e7b7bfa04c21819af687f04c5e0cbe9a2ce24d4d3fd12190b253dabc12c63cabfa94", "signed": "ba6eb751371df721b7707a5b3339edb55f138640b97be6334d6cda5191a3ff6367911761882a4a007f161b748cec95b19e995f2858c257cd6169256662301102ec241918418e60522042e67339e6649499f31a6c7cf8925f1f61dde894603602ae8bb5f58809821f83344f23cd31e64ec9ffe79a986b7e29e4319a63414316bd6ee20e02a50da44012bd2d6f9f679e88ed0c8bb1e2cad55e565789883345b7546f3d54b1b362b1c650502c019d7313afbc82689b23a3a52d8f1af9f81e188dbdf203fb5300b4225bfb6773337be6750b3db88ce097343f62ee2c118574ef150cbd4c62760c3e43dcbc39218bd6d98565fa389811b1a674f617fd756733dcb567a92dbf3855b57b1f4a46d5b8974b39ac0d0e24d99d2037c04f60d9140f64b07a77d7eaa1ce8a78e844b1dcf0e37424f3f9d253a548561a0375a8d4341297bfedb7048c7935e1481418f9bba9271f9fd6026224e78e055d8a0939fa2fe1dbc0fc7b583e4cff3490e1d0f610b252e30d8497d00e4aacb375f19a4719f79ca1ea583a2f8b1406a4aa5cb55c08b6593b676eb5c34abe89392d62d23308a3348b57affbba7739cde8e1909d3425eeb20926a977d3a94a86e0ba10b386926698827e86b4fd6c6180047c87ec3b31619d05a9df34efd3d76a836962b2ef604d07af0975eb8f3dd22594323802564c929b3f65dacb572b32553d69b31a197690a9bb860b080a77cfbb3c175aafce0146a82a4d06e8c750521b726ef1cb29d021e5915e5e8462ede5395445245c9ae882eec4b1745e11791f7621d3fe702cac1525e1f7b46e1105cdd06da2afde26475dc1f78df8e2d72b0ec3ef7dd956193c996842a432696538cf123d7687211ffcd090b9381eabec879f769aac0d3564e16df794fa24728d7172fd07732eab077ed81c22084f6f781b626dac67428a9ddf3b0db0465251220d18b8bf620464c51a578decccbbaba545ed442cf12c4c66f6cb6e6901ea54aeda236ec45eef886a7ddd2c041caba3a6cee339715b6ce97e765ec3479f3d52824a8194bec2a89647e8c63ff7645ff6d05367c767bc48cc96baf05d6a415b2a5aff9bfb217948fad357b98f47dfed62ff1285eb9f468f0f29edd75adc0c8c2ff6a565edb8edfb48bea03b70c447369c52d881eea0eedb08c315cdf0bfeb979c1c0250946bb100c2866b4169b8cbd44d658f0236e1e9f3aa13bb8e8022a38ce997c94b5baf97e0ba621f7e09671ce638c2a39ee6c6e25a688019dd167675ceaec21c6b42a7c8c476d129dcc693c392a02be91b87437a08a0ebf1a7bd976ba23774766838b8d6024f5bb9b07f3c6b719b4de15b72448048ab70db3d4bea77ba359b51b1ec17dbe8010aef0244a8079ca8b9a2a797f3b1fe047c8dd5cab7fb486829239c4ef6d9a38370d488c47b7c030e49a5500c9abb39a9a5abfe72e918b76384ecaafe1627266cd14e696c09d2512e312582a8a911e7b7bfa04c21819af687f04c5e0cbe9a2ce24d4d3fd12190b253dabc12c63cabfa94", "signature": "ba6eb751371df721b7707a5b3339edb55f138640b97be6334d6cda5191a3ff6367911761882a4a007f161b748cec95b19e995f2858c257cd6169256662301102" }, { "secret_key": "5311f3c96101cb8b7abc622bb9326b8f513c2b16d294df797f56dfd8203dda27", "public_key": "230b7002f57c79ae2e6bfdb8df30db3e900756b54af3968c670ee2f32bb11e0a", "message": "61b15be37c4eb397d9e77e00151a28ed3e86d50a9552bb4850b621763f012e7e77bb5db8f3df7dcf769f2d1d46d8d60bae40c8ca6e25c6410b60078a93fd05902114bd91045c06192c70c42c9f41f8161ca46564ebc21a4bdd8190eba2aeb309823072ec2c0200ce6498f9d72b37b3fb466774326df37ad880d8eddb32af673e45d88eec49b1577b43b8639111c2e0b94187d2d4e0173c000f4c37be845d68810b7889ff2a049f3f9f245ec70f21def97780b611400a83c31a79d93a8e98b608fdcf2488b068fe1ae4217293a9367bb734b5bc7bd8819b377f090b4f8fdbff50799c76880d19133580e1ddfc2b9baaddbab34fc6fdc078014bd1ff739daafe5476f3f79d4dbec216fa7680ee8e84002dcb9ddbc7fc1e1c8ef4f1b2a2081b9282243da6153c1fce0905cf35f83a684c01b04557ec84f7e9a94fc2882e2ff19fea21d2ce6167861ce01df8b8d3c3e8d255610b7af2596cd5cf0016734942cc714c272c05fda9d34723626646a46130182cebcf179ec00a6a173bd8577fa845c44d19c6997944755f2b4e468563a75e9016523b87ddac3eee21bcbca08fcc29546a43cbe0d8d10a0e8ddcba172d1ded150378e18b368c7763913e4b407012fd76a872d2cb04930b8e22b308243d4cc278fdf2e1f940ae89ac891b9e0661aee553937bf350b407070a1bdfc4f7a3787ef399d2caf4ec74439c587376c77be0c3de539d3ac26089765b9be10b9038694636e262d7baa0b3a8941a2015967639f6044c67e59bc81cf2fba704ac0df48da6037405a8e8b8a7ce3c58ef38a883538b247ffe18097af095242b058bdd1e3e245eece0a71b75b97d52f20d6d51bb9766b0da0fc09c8ac2a30fb6e7b32ee06dadf46d7359cc066aa94785d8a882ff097d78a86be2d45600dd3d3060125f01c063e488d5c3efee1bca1e58516455ffcaec1b81ef433876bf09ffa51d6f5018585224579cb67b56ce1c216ec0a883e06c8e1563421ea72b0c10d4bb31e491c2ae2fe8139f249ec927d806ba08db52b1b506669047f0c116ff37ac5ba6cdb1eaaf33fdadb0705c799d35ac6d9c80da90c1438b585ffd59350a2686b1ec35166cb9b69ad0f56586aa03274d782e3f858db64adfbf04d5228a7b1c4a2048bbcdb941153a436d742c38b58b4d7d13c9f1d60e152aa2792349a3d94e7e6b1104aa1b870998c18dd7065654a85281bb6f027faad556b1f532e7a1e22d564069289587a0efc9c1585d135f31233c41f440466e71fe9012e5f9a0d74a7282ee392fb0165db79ff1d3176ed08afe1daa66cfbf4305ae16ac1792334399f71b1917ddec270acff665ea05d184c2c5cd2ccd902b22f9b7195e66a65556ca884ba6f5da04dcd4617f33dc2b44a0ea742aeb2b93f3a41df7957a026797a585ceee814b1975f523d2db5dbb9be0ca649d1d45dcfd", "signed": "3cbbb2608870dea1efeebb3fbf681e27705c35e4ddeea86c1b342a77dc296b498419808eacbc78855611ffbc9265a74798e51827e6e5d811816d3ca21e8b9c0661b15be37c4eb397d9e77e00151a28ed3e86d50a9552bb4850b621763f012e7e77bb5db8f3df7dcf769f2d1d46d8d60bae40c8ca6e25c6410b60078a93fd05902114bd91045c06192c70c42c9f41f8161ca46564ebc21a4bdd8190eba2aeb309823072ec2c0200ce6498f9d72b37b3fb466774326df37ad880d8eddb32af673e45d88eec49b1577b43b8639111c2e0b94187d2d4e0173c000f4c37be845d68810b7889ff2a049f3f9f245ec70f21def97780b611400a83c31a79d93a8e98b608fdcf2488b068fe1ae4217293a9367bb734b5bc7bd8819b377f090b4f8fdbff50799c76880d19133580e1ddfc2b9baaddbab34fc6fdc078014bd1ff739daafe5476f3f79d4dbec216fa7680ee8e84002dcb9ddbc7fc1e1c8ef4f1b2a2081b9282243da6153c1fce0905cf35f83a684c01b04557ec84f7e9a94fc2882e2ff19fea21d2ce6167861ce01df8b8d3c3e8d255610b7af2596cd5cf0016734942cc714c272c05fda9d34723626646a46130182cebcf179ec00a6a173bd8577fa845c44d19c6997944755f2b4e468563a75e9016523b87ddac3eee21bcbca08fcc29546a43cbe0d8d10a0e8ddcba172d1ded150378e18b368c7763913e4b407012fd76a872d2cb04930b8e22b308243d4cc278fdf2e1f940ae89ac891b9e0661aee553937bf350b407070a1bdfc4f7a3787ef399d2caf4ec74439c587376c77be0c3de539d3ac26089765b9be10b9038694636e262d7baa0b3a8941a2015967639f6044c67e59bc81cf2fba704ac0df48da6037405a8e8b8a7ce3c58ef38a883538b247ffe18097af095242b058bdd1e3e245eece0a71b75b97d52f20d6d51bb9766b0da0fc09c8ac2a30fb6e7b32ee06dadf46d7359cc066aa94785d8a882ff097d78a86be2d45600dd3d3060125f01c063e488d5c3efee1bca1e58516455ffcaec1b81ef433876bf09ffa51d6f5018585224579cb67b56ce1c216ec0a883e06c8e1563421ea72b0c10d4bb31e491c2ae2fe8139f249ec927d806ba08db52b1b506669047f0c116ff37ac5ba6cdb1eaaf33fdadb0705c799d35ac6d9c80da90c1438b585ffd59350a2686b1ec35166cb9b69ad0f56586aa03274d782e3f858db64adfbf04d5228a7b1c4a2048bbcdb941153a436d742c38b58b4d7d13c9f1d60e152aa2792349a3d94e7e6b1104aa1b870998c18dd7065654a85281bb6f027faad556b1f532e7a1e22d564069289587a0efc9c1585d135f31233c41f440466e71fe9012e5f9a0d74a7282ee392fb0165db79ff1d3176ed08afe1daa66cfbf4305ae16ac1792334399f71b1917ddec270acff665ea05d184c2c5cd2ccd902b22f9b7195e66a65556ca884ba6f5da04dcd4617f33dc2b44a0ea742aeb2b93f3a41df7957a026797a585ceee814b1975f523d2db5dbb9be0ca649d1d45dcfd", "signature": "3cbbb2608870dea1efeebb3fbf681e27705c35e4ddeea86c1b342a77dc296b498419808eacbc78855611ffbc9265a74798e51827e6e5d811816d3ca21e8b9c06" }, { "secret_key": "d290ffd93395bd5fc587d1ab511866e72b371a1735732d9d5c6a18dd465e9363", "public_key": "fd4aad73b032461ca0aae871ca7016383b2be0169053fdbf6c5914fdd6dd6f92", "message": "ebd900bc910c5ecc4d97daf7cb5ebb5491500b7ad116e30660950709d8084bb6434c5bea4a8ccc1ed5a801bebb1a117878c03747003e148ed91434832e8966241a7fff22fe1d6d8c3c3ddd7215a1efaf4b07afee1b25673a1439eaac324e895d4be839e976c03ac001254876888ccaaf3912727a60106a87be69247c9e438c31fca8d9c61bae368c83e40901a99700dff839b513ba8dc42d93ce0987a2333470a9f983313f91988659da54039e499cd1af2b8fa0ebe750e24d55c2a5bd1ade3f680092542bd1be0b9735ba393ad5697d241e8e8b28646db27d2fb5a940e8faeaf0b6c9efda88615dec891ce732930813bfbbd0bc5f8210abe843beb5e4f028f49bea34f1e5b09eac4c6662c74fba39de4a9602a9694a85c7c1375fdadfda6a1957fc5b5987a687b03995e51697a1ab5bb6cb11b663c1372fade4c0aca8fbebb4eb54ce7ce36c6904eaf6eab2f34facd8c768c8d36da2397b1a02735aea72cfaad0393410db527a8ab236d4cdabdc888fac6f182148b132614425d390ff036e54855e4203c51203c1f43e37bbf6b9bf27f5b7e7c665151465401ac32cbe9e3350535edf48a7bc3603e2232e938f9a815ac4d1deec991ef9620948441f7a2f4a46e2c400ab914c4be51dcaad8ed8239cbbe977a9f09c02698319d9fe2a8c6eb60b799f29ae7659970d2ebdff3c6cf709bbf6f4bb55b9df4f61a241dec144b5993f087e784b97be1e53608c2e817ce3d9aaf914e6b723f5b4afffd2a6b9fe9d2d73915c7ad1ffb13efcb73c56238195645203984c99aafd0235f73b3f882e073939bf786657280138db05b86fcc9460b385ef4559204ecd81e2f12f5f062aa448dccc82ea8d89466dd1be46f82c4f87bf0db2b878acbb0d9112c8db6f51d35f6d42f749856b99e550b6c454e9e8be4da175f0b5e86be66c979fd878237e57f691f0d2acd028fbffa5b0668775034db1f21ddbe7114ee3dc0b44daca64c5a03a2feeaeabeb7063bfcccc559baf27f1ccb2202fa4d1b2bf44c04b2c2f81f94e281b1a5adc850da1b9479fcabddadea56a115bb5f06cc016f141c0fcb5e83ab248eaec90158d8be647aff12e7eeb5e57dbcc293cb3b6aacb55236d4a839a0620f4762387dd1714df5c135e3d9d6824f93b7c90d3ae38c518d607120c839570413b46b8ccd7370492d8ae5c609e00cf8251e2e7df81e5b4f9c16a5a539f0afcce41bb4362e5eaa5f940a1706f4afb6b14432c81d4ba1a33d322dbf10645ab63737eadc86fe6e0976f763397fb898637595dfd36934792d779e24c2a3f0bacf53e0473c5fda9c61284e4419bdc0eef5d22f4d9bf42e8c04933bb93b53c295d7ac9395abb6dcbd742b1e1bc3b0ea4434ea21b8eca9ae682d3315a41e9c3c3371840761dc59cac45da7e3813e28788dc89de355b5aee088090a38dd39d83e5e4", "signed": "21704d5e626dcf6a9dcdef935429eb7fb5b257eecd7bf74acb0cd30ecfcf608d0c5b633a4a8a9ba2cc82a21e03355e01d85dae7ecac8896dc15dae0485707104ebd900bc910c5ecc4d97daf7cb5ebb5491500b7ad116e30660950709d8084bb6434c5bea4a8ccc1ed5a801bebb1a117878c03747003e148ed91434832e8966241a7fff22fe1d6d8c3c3ddd7215a1efaf4b07afee1b25673a1439eaac324e895d4be839e976c03ac001254876888ccaaf3912727a60106a87be69247c9e438c31fca8d9c61bae368c83e40901a99700dff839b513ba8dc42d93ce0987a2333470a9f983313f91988659da54039e499cd1af2b8fa0ebe750e24d55c2a5bd1ade3f680092542bd1be0b9735ba393ad5697d241e8e8b28646db27d2fb5a940e8faeaf0b6c9efda88615dec891ce732930813bfbbd0bc5f8210abe843beb5e4f028f49bea34f1e5b09eac4c6662c74fba39de4a9602a9694a85c7c1375fdadfda6a1957fc5b5987a687b03995e51697a1ab5bb6cb11b663c1372fade4c0aca8fbebb4eb54ce7ce36c6904eaf6eab2f34facd8c768c8d36da2397b1a02735aea72cfaad0393410db527a8ab236d4cdabdc888fac6f182148b132614425d390ff036e54855e4203c51203c1f43e37bbf6b9bf27f5b7e7c665151465401ac32cbe9e3350535edf48a7bc3603e2232e938f9a815ac4d1deec991ef9620948441f7a2f4a46e2c400ab914c4be51dcaad8ed8239cbbe977a9f09c02698319d9fe2a8c6eb60b799f29ae7659970d2ebdff3c6cf709bbf6f4bb55b9df4f61a241dec144b5993f087e784b97be1e53608c2e817ce3d9aaf914e6b723f5b4afffd2a6b9fe9d2d73915c7ad1ffb13efcb73c56238195645203984c99aafd0235f73b3f882e073939bf786657280138db05b86fcc9460b385ef4559204ecd81e2f12f5f062aa448dccc82ea8d89466dd1be46f82c4f87bf0db2b878acbb0d9112c8db6f51d35f6d42f749856b99e550b6c454e9e8be4da175f0b5e86be66c979fd878237e57f691f0d2acd028fbffa5b0668775034db1f21ddbe7114ee3dc0b44daca64c5a03a2feeaeabeb7063bfcccc559baf27f1ccb2202fa4d1b2bf44c04b2c2f81f94e281b1a5adc850da1b9479fcabddadea56a115bb5f06cc016f141c0fcb5e83ab248eaec90158d8be647aff12e7eeb5e57dbcc293cb3b6aacb55236d4a839a0620f4762387dd1714df5c135e3d9d6824f93b7c90d3ae38c518d607120c839570413b46b8ccd7370492d8ae5c609e00cf8251e2e7df81e5b4f9c16a5a539f0afcce41bb4362e5eaa5f940a1706f4afb6b14432c81d4ba1a33d322dbf10645ab63737eadc86fe6e0976f763397fb898637595dfd36934792d779e24c2a3f0bacf53e0473c5fda9c61284e4419bdc0eef5d22f4d9bf42e8c04933bb93b53c295d7ac9395abb6dcbd742b1e1bc3b0ea4434ea21b8eca9ae682d3315a41e9c3c3371840761dc59cac45da7e3813e28788dc89de355b5aee088090a38dd39d83e5e4", "signature": "21704d5e626dcf6a9dcdef935429eb7fb5b257eecd7bf74acb0cd30ecfcf608d0c5b633a4a8a9ba2cc82a21e03355e01d85dae7ecac8896dc15dae0485707104" }, { "secret_key": "d7fd73d1d229a65894420e4ba734270d5a20758364de897d8555e24197453c19", "public_key": "3c22772aec0a0c1559077f2cfd1f2465d4b48495c5d05f1f837c31845f34cad1", "message": "c9225859d555bc42011af1b4f14998e6e9b0a65e2172713e968380fb6ceedda22e022c51303031d9931ccef2f7bc705c9e215c1d089d488daddaee155c939b6202ca53bfc7f6e88e1529d82fb45e02b5d05a82bbb9db5f415c58ba8bd56cffd92270b24749e56d12c99ae90c7800f54f55254ea42da5dcfbe0e1d989cd2f6897e232df04707b34af75fa7fec33e55ed56aee39c22b045bedd161083bc5514c1f81ca907b7c760317a7fd5a5a02a5d40e2e823e24ad96aef6da8ea982b5161cc39d84aa2ffd9544c11b634037ab0a1c8e36ac63019da1b2d995cb7bd3d62fe574deabccbd0d3ae7a56e5bec91e4ba3f3db8bfea88e67da62e88278a6e3b418dceea0589f25f7dd8ad19dd845089419b472efccc879c172b32ee4a4dbc2e6c2e865bb3b8ca0adcb71fdf89e1973910ef242915f33e236d2f7c8e9f1ee5b07c6e3c25360f8cb1460be87db31a291d4dee34953e75c675bf181bb7a0b7b5c1befdc86ada072a48f6ac755d499bd68d625d8514525cc3ab8f54ce15a871291778de1305d2219361aa30e332a2e069077c5c53457520379d8b90d24bd8a3a7700ff766231cb5697f9ace521a99e896da54c40793bc7c1fb1584bb1c86194d2fb7a4b802f30885e0ee8af88d6886e3a3a4d4c854649cc01abdf35319a0856cc65d092a386f8869625cd0acac087e9351790ccb4a865f651a881c3ebf109072774f940f5aa98a2a2aa3dd36647d0de83001aa7cdc031cc4a4d75dc11ce551676a2ad43a3f6a16a4bc5aee80e5364206087364eb8b2b15fb705380a072d7c8b51995943aa762e8deb4c568cdaa1411ab68f28489e1323bb6156ce2500b06e7793c510a3de29150840bfdb0b2b7b21c2bb8a7746167c929dd0adad44fed8f36e8381b342080b2a7d82a3f81ff72630cb78df91f7b65a44eff6ed64d48afed109dd7a693a1ba8c37e008fcb157e37297d32eba765a6c7193e73bd97647985b16038c74a084a8f25654cd8cd2cdd27ff17334e06adaa058264017a3b2da78e5738a27e350d882f5fae199278d4e50b8badf57c2141dfdc3cff99df5de86fec293c76cb94b6b19ba3034e460f84c280a2e6412fab5698ce890207cababca0a95b5ad533ce114bf71a404a87590d35fa7cedba43131c4ee92344839f25cbfaeb12aeebc8040893951a346bd28fdd167bd20f71a1e59fb60d55e1c567f478f027cf679a37d1d9db867e17bfdd60b347d89d322639d315bb7a2c9134f00ea03a367f305ea4d60dc9d567cf924851e469ea954ed3ea63ea8606f79f077339bfa2b51ae49baa0fb25377821d7c11ef9ad4bb4c0fe489acbab0ef000d618c7af5efd205d68599fcbdd95e28f836e0916f9ff548d0ba17da62536e74646801eeb6122ba32c41073ae04e42c6c1d5d8d22976a56226ddf4b6ac95455fb53099f20215b2ebc907", "signed": "400c3505f1dfa80df4b26db24c027eb81977f0fb9b5aca524ad51200f4bfb133db834823314195f4edc292d5f530d08556e7809caf2339768aa38029fdbc280fc9225859d555bc42011af1b4f14998e6e9b0a65e2172713e968380fb6ceedda22e022c51303031d9931ccef2f7bc705c9e215c1d089d488daddaee155c939b6202ca53bfc7f6e88e1529d82fb45e02b5d05a82bbb9db5f415c58ba8bd56cffd92270b24749e56d12c99ae90c7800f54f55254ea42da5dcfbe0e1d989cd2f6897e232df04707b34af75fa7fec33e55ed56aee39c22b045bedd161083bc5514c1f81ca907b7c760317a7fd5a5a02a5d40e2e823e24ad96aef6da8ea982b5161cc39d84aa2ffd9544c11b634037ab0a1c8e36ac63019da1b2d995cb7bd3d62fe574deabccbd0d3ae7a56e5bec91e4ba3f3db8bfea88e67da62e88278a6e3b418dceea0589f25f7dd8ad19dd845089419b472efccc879c172b32ee4a4dbc2e6c2e865bb3b8ca0adcb71fdf89e1973910ef242915f33e236d2f7c8e9f1ee5b07c6e3c25360f8cb1460be87db31a291d4dee34953e75c675bf181bb7a0b7b5c1befdc86ada072a48f6ac755d499bd68d625d8514525cc3ab8f54ce15a871291778de1305d2219361aa30e332a2e069077c5c53457520379d8b90d24bd8a3a7700ff766231cb5697f9ace521a99e896da54c40793bc7c1fb1584bb1c86194d2fb7a4b802f30885e0ee8af88d6886e3a3a4d4c854649cc01abdf35319a0856cc65d092a386f8869625cd0acac087e9351790ccb4a865f651a881c3ebf109072774f940f5aa98a2a2aa3dd36647d0de83001aa7cdc031cc4a4d75dc11ce551676a2ad43a3f6a16a4bc5aee80e5364206087364eb8b2b15fb705380a072d7c8b51995943aa762e8deb4c568cdaa1411ab68f28489e1323bb6156ce2500b06e7793c510a3de29150840bfdb0b2b7b21c2bb8a7746167c929dd0adad44fed8f36e8381b342080b2a7d82a3f81ff72630cb78df91f7b65a44eff6ed64d48afed109dd7a693a1ba8c37e008fcb157e37297d32eba765a6c7193e73bd97647985b16038c74a084a8f25654cd8cd2cdd27ff17334e06adaa058264017a3b2da78e5738a27e350d882f5fae199278d4e50b8badf57c2141dfdc3cff99df5de86fec293c76cb94b6b19ba3034e460f84c280a2e6412fab5698ce890207cababca0a95b5ad533ce114bf71a404a87590d35fa7cedba43131c4ee92344839f25cbfaeb12aeebc8040893951a346bd28fdd167bd20f71a1e59fb60d55e1c567f478f027cf679a37d1d9db867e17bfdd60b347d89d322639d315bb7a2c9134f00ea03a367f305ea4d60dc9d567cf924851e469ea954ed3ea63ea8606f79f077339bfa2b51ae49baa0fb25377821d7c11ef9ad4bb4c0fe489acbab0ef000d618c7af5efd205d68599fcbdd95e28f836e0916f9ff548d0ba17da62536e74646801eeb6122ba32c41073ae04e42c6c1d5d8d22976a56226ddf4b6ac95455fb53099f20215b2ebc907", "signature": "400c3505f1dfa80df4b26db24c027eb81977f0fb9b5aca524ad51200f4bfb133db834823314195f4edc292d5f530d08556e7809caf2339768aa38029fdbc280f" }, { "secret_key": "fda7cb084016ba513c7c4f8f7180480bb181e95695ea68737fa34a40ecbdf3ef", "public_key": "a2de3a0ef97298fd716106e2f3f54513057a40072d234c3518154c1bd12de037", "message": "c21bb3f8e37befa367c913673101ba30d3b5c74bd8bdb09cd28640012db41120c2bcc4085de2a0f95c9215ddef8cb5fc8d8b1251b41527c67dfaa3f95ba3578391ea5a6629a733095fd0a43fdba40ffe260fff82acee2ebe980e9ececcfe7e10b2ed8c2e6b410d547a1286571df3d701174e579fcf19d3bd8086c0423f37117789f305d9670ad28c99674f52cf64211a081d0c6c3096da2c71bf5f5799a7910e6f38104a37a6557c2daef340814a1f830d593773c6cf48d83ea07294b94eb080b85d6970e28f4051d5066db10e961973a626a826aeaf8a06ec0d566b7e0c4ef60f0c5678fcbb5b2ac63f7bed06448a247b3d427b87086d33573fb2d7228c5c34ea6640eefa9564485a79638e9c97c0af84cfee7ce4a739220c8429e067143953d550668dadc84e7bed9ab070a5943390c611d75b1cb12873a37d9850661a0077bfa9ca9b8b263766c149ff0ee4b4adba25eaf7d7f501f362454256bc1269378ef3359a8ed6b960b86621fa3b613eb132122f49f2eb2ceb6832a3991e961cb0e78b742ef4d65e8de3469666fec7c5b874789571c5c99a2c02a053ff7d2fc90076bafe1f267fa81a3990f27ff14f03000af00c59286cb9bb98e204e90190ae2a50edef049ea92a1f785088f94adf6588fb43bb40fbe2324235cc7e168b80264b069f944f503692c949234d5b76bcffabe29ff9064bd7cbed9e00e5b7fdda4312eb801465f127d0ca68832a7f4ed0eaed8f559c1631cd4d34f0dc414d9fcfe849a91e25f3e0ff013a8cffa806ed8e93d08a1e5a757682ca3d26abc869c76f1c79007d559dfe67e78d8af0195808b0e771c71e64b5716fb36309c25025fae6414c28bbdbd4de597a74996c9da974920d59e6f4c2edfe110ff817fd480a5080978048865712058c5fe7b560b12b67f737ea6e2af9242cf07ad0a8a679f26430046adc3e70664cc9c0ee5abcef6d726b4e04176048b795be12851bdb74003a13204119b86864d6535ba095040a85d9781cf4f3480a304e227f787ad538e68f4bab014179e30d3fdef9eff11bcf471fa3a0bc74b5576f302d3a6b499f11f2ef326ac026c98db10e2741413f322228b3cff0f337ba2f294c78ef73f0e877878f8fc7ff6d10bce66ad6284379b80ca89327d4db0bf14e6d8f01b22ab202b716cc07e3c8866d168a5094bac5a495e73868eedc27222e6444f83bcf65acdc3ec89120bb50e8abfc28b78e6d980c775f4849a0e8cada80240bca245e39966e89a0344df8363a7dcc81b201ce9c753ad544e1124e21020d4c62deda9ed9b9d1f2fb7c54ca7ab09f383bef48cfc6848c271302a10fa687f56e00e0a7d093c927b4fdd8f1bedf6288a0e302848a8012f127a79d2d30a06ce17d94aa6f7f8a1e6eb9d0681c3774f614cc6dbcb2a813f925c6306a630572a83ec109d5f533c0584cb421d919", "signed": "33614b7a94f75e036534d76e30147eccdd2a04e00cd4704ab6e807d6a2acc1e1d963b8eee0810d412d9d56e54556302b10730c15abf89c29a027303ea88ae701c21bb3f8e37befa367c913673101ba30d3b5c74bd8bdb09cd28640012db41120c2bcc4085de2a0f95c9215ddef8cb5fc8d8b1251b41527c67dfaa3f95ba3578391ea5a6629a733095fd0a43fdba40ffe260fff82acee2ebe980e9ececcfe7e10b2ed8c2e6b410d547a1286571df3d701174e579fcf19d3bd8086c0423f37117789f305d9670ad28c99674f52cf64211a081d0c6c3096da2c71bf5f5799a7910e6f38104a37a6557c2daef340814a1f830d593773c6cf48d83ea07294b94eb080b85d6970e28f4051d5066db10e961973a626a826aeaf8a06ec0d566b7e0c4ef60f0c5678fcbb5b2ac63f7bed06448a247b3d427b87086d33573fb2d7228c5c34ea6640eefa9564485a79638e9c97c0af84cfee7ce4a739220c8429e067143953d550668dadc84e7bed9ab070a5943390c611d75b1cb12873a37d9850661a0077bfa9ca9b8b263766c149ff0ee4b4adba25eaf7d7f501f362454256bc1269378ef3359a8ed6b960b86621fa3b613eb132122f49f2eb2ceb6832a3991e961cb0e78b742ef4d65e8de3469666fec7c5b874789571c5c99a2c02a053ff7d2fc90076bafe1f267fa81a3990f27ff14f03000af00c59286cb9bb98e204e90190ae2a50edef049ea92a1f785088f94adf6588fb43bb40fbe2324235cc7e168b80264b069f944f503692c949234d5b76bcffabe29ff9064bd7cbed9e00e5b7fdda4312eb801465f127d0ca68832a7f4ed0eaed8f559c1631cd4d34f0dc414d9fcfe849a91e25f3e0ff013a8cffa806ed8e93d08a1e5a757682ca3d26abc869c76f1c79007d559dfe67e78d8af0195808b0e771c71e64b5716fb36309c25025fae6414c28bbdbd4de597a74996c9da974920d59e6f4c2edfe110ff817fd480a5080978048865712058c5fe7b560b12b67f737ea6e2af9242cf07ad0a8a679f26430046adc3e70664cc9c0ee5abcef6d726b4e04176048b795be12851bdb74003a13204119b86864d6535ba095040a85d9781cf4f3480a304e227f787ad538e68f4bab014179e30d3fdef9eff11bcf471fa3a0bc74b5576f302d3a6b499f11f2ef326ac026c98db10e2741413f322228b3cff0f337ba2f294c78ef73f0e877878f8fc7ff6d10bce66ad6284379b80ca89327d4db0bf14e6d8f01b22ab202b716cc07e3c8866d168a5094bac5a495e73868eedc27222e6444f83bcf65acdc3ec89120bb50e8abfc28b78e6d980c775f4849a0e8cada80240bca245e39966e89a0344df8363a7dcc81b201ce9c753ad544e1124e21020d4c62deda9ed9b9d1f2fb7c54ca7ab09f383bef48cfc6848c271302a10fa687f56e00e0a7d093c927b4fdd8f1bedf6288a0e302848a8012f127a79d2d30a06ce17d94aa6f7f8a1e6eb9d0681c3774f614cc6dbcb2a813f925c6306a630572a83ec109d5f533c0584cb421d919", "signature": "33614b7a94f75e036534d76e30147eccdd2a04e00cd4704ab6e807d6a2acc1e1d963b8eee0810d412d9d56e54556302b10730c15abf89c29a027303ea88ae701" }, { "secret_key": "a1ac48aa5ffa3d800819d03b7f62babf291f20904c11a6400e4f45205f103e38", "public_key": "0854e0340f814985fb122b78729479e3fde855c211cadeae56f0d4dc0828d5fa", "message": "d6f124ed752021c10926972a0c26f3b1838b3c7af247c18009a231ecce964bf6698637833f607dca836f8a606c72ae3cb170174447a2cce583f6e244dbc163e215b9820de7496ffc5b7050c48f2830246678cba4dc5caa07c1458563aa2d10dcb7770ef8fede027dd7f20ddc8cc78c3a2e2e958bd18c0006cf8fb82d44e53e1da7aa80fd1006f3b2300c9b079d8a66f1e4a3f47061f9e2f45dae35dc295204b19460ca5707ab57ce215a24c10faab3fa20bccd101e7a7d70077599f3d6725707552129cad757d6514c1b28997e471f94b0fded8fbbd065dead196d2c07d3dfa7b9fb3bae7680f76621200d099eebebbea0e8957df5b5e204ca3e9e2952b8a30f0a131a6867b1381e394b1b444310f076326656cf9341678008e9525147d8d61ce93d3bf53900cab912663717e0987293833d1902d7fb047b997b86026c467d7bb17cf45796738f7a774ac126764ed4eb45124309f4586260176ba465918d48330a9cc18c4ecea0ddaf38946acc0e361dd40a7e9133ceb50e1c317ea42bd0980a72b8ba3d8a6c7693dd5602f374f2664df4ba56df01e882fca42cb4db621f476c76e1ea9fd105911a74b77952d9914a5ac0f98a900c1b2e1a56c4ea8518a9ee47c4ed14d0bd35eca560319c8ea24755d71a4e030850bc4dc60389f325804021204ccebc25fedbd32edd8d8446aa23ce56a85f779e858d36af7c073c115e341f412c660fab800fe74c50e714ee086e2fbc8d7abbf3e98fb40ca27f1f01a9aadd8cc2275c2dd3f76e4c1d81c4b792daecc9fe66044941b8b2918486dd4acb562a7b58ad8c60c21b83cf48aefa7256a1ed809e669811f484364970bc5695089919bc32d28ea752e8e318ceff467f77ae1977c5ffd79c17c2da8bc7f823dd94398683189945f8b79238a4e815b142b866acbdbcb7aea7f143fffb7cc2b4b54bbf361afda913ad6df1e49dfd6b532642e63f55d893a470d40370665cfb74efd3f59cb0ff6006174ca35f53b97c543e08af4bf5bb75ff9031610652a3f6f2a0cfe97e7a521f3d2a289114ded34772b0e49817bde1cb924ff514e2866a09e3ede0782d2c0c98e6814b8c1e778cf8306348c933adb2e472dba09db954ff49648373395a2f0181958feb1ea2834c99532873db5c88eb5289c77e90015203ef502ac8e1c48fa1a06dafa6519d52dae3c5567570dd2434e671927c66363f783156893f138a84c75664b30ae4275112736d53d4f399ddda3d23067c073f521afba1f7be585513c2cec9c8f08d2a22c3c85392cd2ae50f3928251f86b310c69a0f8c4e853ab3f3e8129b0566ef4bbbe80b8c02c8928a4de56c0d119a45bbf5af1808d488852d8a45beb0d683248a4d65de1526b3d1d2ffc1f22215b608468cbc3bd39514b397fc0db0f113dbe6fce4652e82ff895b2b4387e041d7e4e7bde4694769665e81", "signed": "c57e3c091ed24e5e84665bd9bb102db49797df9008f05557fa0d5ad7a295e5e4d2a4716b17f8c91cb12f5abfb1af027fb0411199acc5d285d842a4b65bde4902d6f124ed752021c10926972a0c26f3b1838b3c7af247c18009a231ecce964bf6698637833f607dca836f8a606c72ae3cb170174447a2cce583f6e244dbc163e215b9820de7496ffc5b7050c48f2830246678cba4dc5caa07c1458563aa2d10dcb7770ef8fede027dd7f20ddc8cc78c3a2e2e958bd18c0006cf8fb82d44e53e1da7aa80fd1006f3b2300c9b079d8a66f1e4a3f47061f9e2f45dae35dc295204b19460ca5707ab57ce215a24c10faab3fa20bccd101e7a7d70077599f3d6725707552129cad757d6514c1b28997e471f94b0fded8fbbd065dead196d2c07d3dfa7b9fb3bae7680f76621200d099eebebbea0e8957df5b5e204ca3e9e2952b8a30f0a131a6867b1381e394b1b444310f076326656cf9341678008e9525147d8d61ce93d3bf53900cab912663717e0987293833d1902d7fb047b997b86026c467d7bb17cf45796738f7a774ac126764ed4eb45124309f4586260176ba465918d48330a9cc18c4ecea0ddaf38946acc0e361dd40a7e9133ceb50e1c317ea42bd0980a72b8ba3d8a6c7693dd5602f374f2664df4ba56df01e882fca42cb4db621f476c76e1ea9fd105911a74b77952d9914a5ac0f98a900c1b2e1a56c4ea8518a9ee47c4ed14d0bd35eca560319c8ea24755d71a4e030850bc4dc60389f325804021204ccebc25fedbd32edd8d8446aa23ce56a85f779e858d36af7c073c115e341f412c660fab800fe74c50e714ee086e2fbc8d7abbf3e98fb40ca27f1f01a9aadd8cc2275c2dd3f76e4c1d81c4b792daecc9fe66044941b8b2918486dd4acb562a7b58ad8c60c21b83cf48aefa7256a1ed809e669811f484364970bc5695089919bc32d28ea752e8e318ceff467f77ae1977c5ffd79c17c2da8bc7f823dd94398683189945f8b79238a4e815b142b866acbdbcb7aea7f143fffb7cc2b4b54bbf361afda913ad6df1e49dfd6b532642e63f55d893a470d40370665cfb74efd3f59cb0ff6006174ca35f53b97c543e08af4bf5bb75ff9031610652a3f6f2a0cfe97e7a521f3d2a289114ded34772b0e49817bde1cb924ff514e2866a09e3ede0782d2c0c98e6814b8c1e778cf8306348c933adb2e472dba09db954ff49648373395a2f0181958feb1ea2834c99532873db5c88eb5289c77e90015203ef502ac8e1c48fa1a06dafa6519d52dae3c5567570dd2434e671927c66363f783156893f138a84c75664b30ae4275112736d53d4f399ddda3d23067c073f521afba1f7be585513c2cec9c8f08d2a22c3c85392cd2ae50f3928251f86b310c69a0f8c4e853ab3f3e8129b0566ef4bbbe80b8c02c8928a4de56c0d119a45bbf5af1808d488852d8a45beb0d683248a4d65de1526b3d1d2ffc1f22215b608468cbc3bd39514b397fc0db0f113dbe6fce4652e82ff895b2b4387e041d7e4e7bde4694769665e81", "signature": "c57e3c091ed24e5e84665bd9bb102db49797df9008f05557fa0d5ad7a295e5e4d2a4716b17f8c91cb12f5abfb1af027fb0411199acc5d285d842a4b65bde4902" }, { "secret_key": "f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5", "public_key": "278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e", "message": "08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0", "signed": "0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a0308b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0", "signature": "0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03" } ] ================================================ FILE: tests/hydra/algebra/test_polynomial.py ================================================ import pytest from garaga.algebra import BaseField, Polynomial from garaga.curves import CURVES, CurveID # List of curve IDs to test p = CURVES[CurveID.SECP256K1.value].p zero = Polynomial.zero(p) @pytest.mark.parametrize("degree_x", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) @pytest.mark.parametrize("degree_y", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) def test_xgcd(degree_x: int, degree_y: int): field = BaseField(p) x_coeffs = [field.random() for _ in range(degree_x + 1)] y_coeffs = [field.random() for _ in range(degree_y + 1)] x = Polynomial(x_coeffs) y = Polynomial(y_coeffs) a, b, g = Polynomial.xgcd(x, y) assert a * x + b * y == g assert x % g == zero assert y % g == zero @pytest.mark.parametrize("degree", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) def test_lagrange_interpolation(degree: int): field = BaseField(p) # Define domain and values for interpolation domain = [field(i) for i in range(1, degree + 2)] values = [field(i * i) for i in range(1, degree + 2)] # Perform Lagrange interpolation interpolated_poly = Polynomial.lagrange_interpolation(p, domain, values) # Check that the polynomial evaluates correctly at the domain points for x, y in zip(domain, values): assert interpolated_poly.evaluate(x) == y # Additional checks for edge cases domain_edge = [field(0)] values_edge = [field(7)] interpolated_poly_edge = Polynomial.lagrange_interpolation( p, domain_edge, values_edge ) assert interpolated_poly_edge.evaluate(domain_edge[0]) == values_edge[0] # Check for larger set of points domain_large = [field(i) for i in range(1, 11)] values_large = [field(i * i) for i in range(1, 11)] interpolated_poly_large = Polynomial.lagrange_interpolation( p, domain_large, values_large ) for x, y in zip(domain_large, values_large): assert interpolated_poly_large.evaluate(x) == y ================================================ FILE: tests/hydra/algebra/test_pyfelt.py ================================================ import pytest from garaga.algebra import PyFelt # Define a prime number for the finite field p = 101 def test_pyfelt_addition(): a = PyFelt(10, p) b = PyFelt(20, p) c = 30 assert a + b == PyFelt(30, p) assert a + c == PyFelt(40, p) assert c + a == PyFelt(40, p) def test_pyfelt_subtraction(): a = PyFelt(10, p) b = PyFelt(20, p) c = 5 assert a - b == PyFelt(-10 % p, p) assert a - c == PyFelt(5, p) assert c - a == PyFelt(-5 % p, p) def test_pyfelt_multiplication(): a = PyFelt(10, p) b = PyFelt(20, p) c = 2 assert a * b == PyFelt(200 % p, p) assert a * c == PyFelt(20, p) assert c * a == PyFelt(20, p) def test_pyfelt_division(): a = PyFelt(10, p) c = PyFelt(1, p) assert a / c == a with pytest.raises(ValueError): a / PyFelt(0, p) def test_pyfelt_negation(): a = PyFelt(10, p) assert -a == PyFelt(-10 % p, p) def test_pyfelt_inversion(): a = PyFelt(10, p) inv_a = a.__inv__() assert a * inv_a == PyFelt(1, p) with pytest.raises(ValueError): PyFelt(0, p).__inv__() def test_pyfelt_exponentiation(): a = PyFelt(10, p) assert a**3 == PyFelt(1000 % p, p) assert a**0 == PyFelt(1, p) def test_pyfelt_equality(): a = PyFelt(10, p) b = PyFelt(10, p) c = PyFelt(20, p) assert a == b assert a != c assert a == 10 assert a != 20 def test_pyfelt_comparison(): a = PyFelt(10, p) b = PyFelt(20, p) c = 15 assert a < b assert a <= b assert b > a assert b >= a assert a < c assert a <= c assert b > c assert b >= c def test_pyfelt_quadratic_residue(): a = PyFelt(4, p) b = PyFelt(99, p) assert a.is_quad_residue() assert not b.is_quad_residue() def test_pyfelt_sqrt(): a = PyFelt(4, p) b = PyFelt(99, p) assert a.sqrt() == PyFelt(2, p) with pytest.raises(ValueError): print(b.sqrt()) def test_pyfelt_repr(): a = PyFelt(10, p) assert repr(a) == "PyFelt(10, 0x65)" def test_pyfelt_invalid_operations(): a = PyFelt(10, p) with pytest.raises(Exception): a + "invalid" with pytest.raises(Exception): a - "invalid" with pytest.raises(Exception): a * "invalid" with pytest.raises(Exception): a / "invalid" with pytest.raises(Exception): a == "invalid" with pytest.raises(Exception): a < "invalid" with pytest.raises(Exception): a <= "invalid" with pytest.raises(Exception): a > "invalid" with pytest.raises(Exception): a >= "invalid" if __name__ == "__main__": pytest.main() ================================================ FILE: tests/hydra/algebra/test_tower_final_exp.py ================================================ import time import pytest from garaga.curves import CurveID from garaga.hints.tower_backup import E12, get_base_field @pytest.mark.parametrize("curve_id", [CurveID.BN254.value, CurveID.BLS12_381.value]) def test_tower_final_exp(curve_id): e12 = E12.random(curve_id) start = time.time() e12t = e12.final_exp(use_rust=False) end = time.time() print(f"Python final_exp time: {end - start}") start = time.time() e12t_rust = e12.final_exp(use_rust=True) end = time.time() print(f"Rust final_exp time: {end - start}") assert e12t == e12t_rust @pytest.mark.parametrize("curve_id", [CurveID.BN254.value, CurveID.BLS12_381.value]) def test_tower_final_exp_zero_numerator(curve_id): field = get_base_field(curve_id) for _ in range(5): e12 = E12.from_direct( [ field.zero(), field.random(), field.zero(), field.random(), field.zero(), field.random(), field.zero(), field.random(), field.zero(), field.random(), field.zero(), field.random(), ], curve_id, ) e12t_rust = e12.final_exp(use_rust=True) assert e12t_rust == E12.one(curve_id) ================================================ FILE: tests/hydra/circuits/test_ec.py ================================================ import pytest from garaga.curves import CURVES, CurveID, get_base_field from garaga.modulo_circuit import WriteOps from garaga.points import G1Point, G2Point from garaga.precompiled_circuits.ec import BasicEC, BasicECG2 @pytest.mark.parametrize("curve_id", [CurveID.BLS12_381]) def test_double_point_g1(curve_id: CurveID): g = G1Point.get_nG(curve_id, 1) circuit = BasicEC("test", 1) gxys = circuit.write_elements(g.to_pyfelt_list(), WriteOps.INPUT) field = get_base_field(CurveID.BLS12_381) A = CURVES[CurveID.BLS12_381.value].a a = circuit.write_element(field(A)) resx, resy = circuit.double_point(gxys, a) got = G1Point( resx.value, resy.value, curve_id, ) expected = G1Point.get_nG(CurveID.BLS12_381, 2) assert got == expected, f"{got} != {expected}" @pytest.mark.parametrize("curve_id", [CurveID.BLS12_381]) def test_add_point_g1(curve_id: CurveID): g = G1Point.get_nG(curve_id, 1) h = G1Point.get_nG(curve_id, 2) circuit = BasicEC("test", 1) gxys = circuit.write_elements(g.to_pyfelt_list(), WriteOps.INPUT) hxys = circuit.write_elements(h.to_pyfelt_list(), WriteOps.INPUT) resx, resy = circuit.add_points(gxys, hxys) got = G1Point( resx.value, resy.value, curve_id, ) expected = G1Point.get_nG(curve_id, 3) assert got == expected, f"{got} != {expected}" @pytest.mark.parametrize("curve_id", [CurveID.BLS12_381]) def test_double_point_g2(curve_id: CurveID): # Arrange g = G2Point.get_nG(CurveID.BLS12_381, 1) circuit = BasicECG2("test", 1) gxys = circuit.write_elements(g.to_pyfelt_list(), WriteOps.INPUT) # Act resx, resy = circuit.double_point_a_eq_0((gxys[0:2], gxys[2:4])) # Assert got = G2Point( (resx[0].value, resx[1].value), (resy[0].value, resy[1].value), CurveID.BLS12_381, ) expected = G2Point.get_nG(CurveID.BLS12_381, 2) assert got == expected, f"{got} != {expected}" @pytest.mark.parametrize("curve_id", [CurveID.BLS12_381]) def test_add_point_g2(curve_id: CurveID): # Arrange g = G2Point.get_nG(curve_id, 1) h = G2Point.get_nG(curve_id, 2) circuit = BasicECG2("test", 1) gxys = circuit.write_elements(g.to_pyfelt_list(), WriteOps.INPUT) hxys = circuit.write_elements(h.to_pyfelt_list(), WriteOps.INPUT) # Act resx, resy = circuit.add_points((gxys[0:2], gxys[2:4]), (hxys[0:2], hxys[2:4])) # Assert got = G2Point( (resx[0].value, resx[1].value), (resy[0].value, resy[1].value), CurveID.BLS12_381, ) expected = G2Point.get_nG(curve_id, 3) assert got == expected, f"{got} != {expected}" ================================================ FILE: tests/hydra/circuits/test_honk.py ================================================ import pytest import garaga.hints.io as io from garaga.curves import ProofSystem from garaga.hints.keccak256 import keccak_256 from garaga.points import G1G2Pair from garaga.precompiled_circuits.zk_honk import ( CURVES, G2_POINT_KZG_1, G2_POINT_KZG_2, CurveID, G1Point, HonkVk, ZKHonkProof, ZKHonkTranscript, ZKHonkVerifierCircuits, get_msm_points_from_vk_and_proof, honk_proof_from_bytes, ) PATH = "hydra/garaga/starknet/honk_contract_generator/examples" def convert_pairing_points_to_g1( pairing_point_object: list[int], ) -> tuple[G1Point, G1Point]: """Convert the 16 field element pairing point object to two G1 points (lhs, rhs). Each point is encoded as 4 68-bit limbs for x and 4 68-bit limbs for y. """ def decode_coord(limbs): return limbs[0] | (limbs[1] << 68) | (limbs[2] << 136) | (limbs[3] << 204) lhs_x = decode_coord(pairing_point_object[0:4]) lhs_y = decode_coord(pairing_point_object[4:8]) rhs_x = decode_coord(pairing_point_object[8:12]) rhs_y = decode_coord(pairing_point_object[12:16]) lhs = G1Point(x=lhs_x, y=lhs_y, curve_id=CurveID.BN254) rhs = G1Point(x=rhs_x, y=rhs_y, curve_id=CurveID.BN254) return lhs, rhs def generate_recursion_separator( pairing_point_object: list[int], acc_lhs: G1Point, acc_rhs: G1Point ) -> int: """Generate the recursion separator by hashing the proof and accumulator points. Matches Solidity's generateRecursionSeparator function. """ proof_lhs, proof_rhs = convert_pairing_points_to_g1(pairing_point_object) # Hash 8 uint256 values: proofLhs.x, proofLhs.y, proofRhs.x, proofRhs.y, accLhs.x, accLhs.y, accRhs.x, accRhs.y data = b"" data += proof_lhs.x.to_bytes(32, "big") data += proof_lhs.y.to_bytes(32, "big") data += proof_rhs.x.to_bytes(32, "big") data += proof_rhs.y.to_bytes(32, "big") data += acc_lhs.x.to_bytes(32, "big") data += acc_lhs.y.to_bytes(32, "big") data += acc_rhs.x.to_bytes(32, "big") data += acc_rhs.y.to_bytes(32, "big") hash_result = keccak_256(data).digest() # Convert to field element (mod p) FR = CURVES[CurveID.GRUMPKIN.value].p return int.from_bytes(hash_result, "big") % FR @pytest.mark.parametrize( "proof_path, system", [ (f"{PATH}/proof_ultra_keccak_zk.bin", ProofSystem.UltraKeccakZKHonk), ], ) def test_verify_honk_proof(proof_path: str, system: ProofSystem): vk: HonkVk = HonkVk.from_bytes(open(f"{PATH}/vk_ultra_keccak.bin", "rb").read()) proof: ZKHonkProof = honk_proof_from_bytes( open(proof_path, "rb").read(), open(f"{PATH}/public_inputs_ultra_keccak.bin", "rb").read(), vk, system, ) tp = ZKHonkTranscript.from_proof(vk, proof, system) circuit: ZKHonkVerifierCircuits = ZKHonkVerifierCircuits( name="test", log_n=vk.log_circuit_size ) vk_circuit = vk.to_circuit_elements(circuit) proof_circuit = proof.to_circuit_elements(circuit) tp = tp.to_circuit_elements(circuit) public_input_delta = circuit.compute_public_input_delta( public_inputs=proof_circuit.public_inputs, pairing_point_object=proof_circuit.pairing_point_object, beta=tp.beta, gamma=tp.gamma, ) vanishing_check, diff_check = circuit.check_evals_consistency( proof_circuit.libra_evaluation, proof_circuit.libra_poly_evals, tp.gemini_r, tp.sum_check_u_challenges, ) assert vanishing_check.value != 0 assert diff_check.value == 0 rlc_check, check = circuit.verify_sum_check( libra_sum=proof_circuit.libra_sum, sumcheck_univariates=proof_circuit.sumcheck_univariates, sumcheck_evaluations=(proof_circuit.sumcheck_evaluations), libra_evaluation=proof_circuit.libra_evaluation, beta=tp.beta, gamma=tp.gamma, public_inputs_delta=public_input_delta, eta=tp.eta, eta_two=tp.etaTwo, eta_three=tp.etaThree, libra_challenge=tp.libra_challenge, sum_check_u_challenges=tp.sum_check_u_challenges, gate_challenge=tp.gate_challenge, alpha=tp.alpha, log_n=vk.log_circuit_size, base_rlc=circuit.write_element(1234), ) assert rlc_check.value == 0 assert check.value == 0 print(f"Pub input delta: {io.int_to_u384(public_input_delta, as_hex=False)}") scalars = circuit.compute_shplemini_msm_scalars( proof_circuit.sumcheck_evaluations, proof_circuit.gemini_masking_eval, proof_circuit.gemini_a_evaluations, proof_circuit.libra_poly_evals, tp.gemini_r, tp.rho, tp.shplonk_z, tp.shplonk_nu, tp.sum_check_u_challenges, ) print([scalar.value if scalar else scalar for scalar in scalars]) print(len(scalars)) points = get_msm_points_from_vk_and_proof(vk, proof) for i, (p, s) in enumerate(zip(points, scalars)): if s: print(i, hex(s.value)) P_0 = G1Point.msm(points=points, scalars=[scalar.value for scalar in scalars]) P_1 = -proof.kzg_quotient # Extract the points from pairing_point_object P_0_other, P_1_other = convert_pairing_points_to_g1(proof.pairing_point_object) print(f"P_0_other: x={hex(P_0_other.x)}, y={hex(P_0_other.y)}") print(f"P_1_other: x={hex(P_1_other.x)}, y={hex(P_1_other.y)}") # Generate recursion separator recursion_separator = generate_recursion_separator( proof.pairing_point_object, P_0, P_1 ) print(f"Recursion separator: {hex(recursion_separator)}") # Aggregate: P_0_final = recursionSeparator * P_0 + P_0_other # P_1_final = recursionSeparator * P_1 + P_1_other P_0_final = P_0.scalar_mul(recursion_separator).add(P_0_other) P_1_final = P_1.scalar_mul(recursion_separator).add(P_1_other) print(f"P_0_final: x={hex(P_0_final.x)}, y={hex(P_0_final.y)}") print(f"P_1_final: x={hex(P_1_final.x)}, y={hex(P_1_final.y)}") # Final pairing check with aggregated points pairs = [G1G2Pair(P_0_final, G2_POINT_KZG_1), G1G2Pair(P_1_final, G2_POINT_KZG_2)] pairing_result = G1G2Pair.pair(pairs).value_coeffs print(f"Pairing result WITH recursion aggregation: {pairing_result[:3]}...") assert ( pairing_result == [1] + [0] * 11 ), "Pairing check failed with recursion aggregation" @pytest.mark.parametrize( "proof_path, system", [ (f"{PATH}/proof_ultra_keccak_zk.bin", ProofSystem.UltraKeccakZKHonk), ], ) def test_check_evals_consistency(proof_path: str, system: ProofSystem): vk: HonkVk = HonkVk.from_bytes(open(f"{PATH}/vk_ultra_keccak.bin", "rb").read()) proof = honk_proof_from_bytes( open(proof_path, "rb").read(), open(f"{PATH}/public_inputs_ultra_keccak.bin", "rb").read(), vk, system, ) tp = ZKHonkTranscript.from_proof(vk, proof, system) circuit = ZKHonkVerifierCircuits(name="test", log_n=vk.log_circuit_size) proof_circuit = proof.to_circuit_elements(circuit) tp = tp.to_circuit_elements(circuit) vanishing_check_expected, diff_check_expected = circuit.check_evals_consistency( proof_circuit.libra_evaluation, proof_circuit.libra_poly_evals, tp.gemini_r, tp.sum_check_u_challenges, ) vanishing_check, diff_check = circuit.check_evals_consistency_split( proof_circuit.libra_evaluation, proof_circuit.libra_poly_evals, tp.gemini_r, tp.sum_check_u_challenges, ) assert vanishing_check.value == vanishing_check_expected.value assert diff_check.value == diff_check_expected.value ================================================ FILE: tests/hydra/circuits/test_multi_miller_loop.py ================================================ import copy import pytest from garaga.curves import CurveID from garaga.hints.extf_mul import nondeterministic_extension_field_mul_divmod from garaga.modulo_circuit import WriteOps from garaga.points import G1Point, G2Point from garaga.precompiled_circuits.multi_miller_loop import ( MultiMillerLoopCircuit, precompute_lines, ) @pytest.fixture( params=[ (CurveID.BN254, 1), (CurveID.BLS12_381, 1), (CurveID.BN254, 2), (CurveID.BLS12_381, 2), (CurveID.BN254, 3), (CurveID.BLS12_381, 3), (CurveID.BN254, 4), (CurveID.BLS12_381, 4), ] ) def circuit_and_points( request, ) -> tuple[MultiMillerLoopCircuit, list[G1Point], list[G2Point]]: curve_id, n_pairs = request.param def init_miller_loop_circuit() -> ( tuple[MultiMillerLoopCircuit, list[G1Point], list[G2Point]] ): circuit = MultiMillerLoopCircuit( name="test", curve_id=curve_id.value, n_pairs=n_pairs, hash_input=False ) Ps = [G1Point.gen_random_point(curve_id) for _ in range(n_pairs)] Qs = [G2Point.gen_random_point(curve_id) for _ in range(n_pairs)] circuit.write_p_and_q(Ps, Qs) return circuit, Ps, Qs return init_miller_loop_circuit() def test_precomputed_and_without_precompute_gives_same_output( circuit_and_points: tuple[MultiMillerLoopCircuit, list[G1Point], list[G2Point]], ): circuit0, Ps, Qs = circuit_and_points n_pairs = len(Ps) f0 = circuit0.miller_loop(n_pairs) f0 = [fi.felt for fi in f0] circuit1 = copy.deepcopy(circuit0) circuit1.precompute_lines = True circuit1.precomputed_lines = circuit1.write_elements( precompute_lines(Qs), WriteOps.INPUT ) circuit1._precomputed_lines_generator = ( circuit1._create_precomputed_lines_generator() ) circuit1.n_points_precomputed_lines = n_pairs f1 = circuit1.miller_loop(n_pairs) f1 = [fi.felt for fi in f1] assert f0 == f1 def test_partially_precomputed_and_without_precompute_gives_same_output( circuit_and_points: tuple[MultiMillerLoopCircuit, list[G1Point], list[G2Point]], ): circuit0, Ps, Qs = circuit_and_points n_pairs = len(Ps) f0 = circuit0.miller_loop(n_pairs) f0 = [fi.felt for fi in f0] circuit1 = copy.deepcopy(circuit0) circuit1.precompute_lines = True circuit1.precomputed_lines = circuit1.write_elements( precompute_lines(Qs[: n_pairs // 2]), WriteOps.INPUT ) circuit1._precomputed_lines_generator = ( circuit1._create_precomputed_lines_generator() ) circuit1.n_points_precomputed_lines = n_pairs // 2 f1 = circuit1.miller_loop(n_pairs) f1 = [fi.felt for fi in f1] assert f0 == f1 def test_prod_miller_loop_equals_multi_miller_loop( circuit_and_points: tuple[MultiMillerLoopCircuit, list[G1Point], list[G2Point]], ): circuit_multi, Ps, Qs = circuit_and_points curve_id = circuit_multi.curve_id n_pairs = len(Ps) f0 = circuit_multi.miller_loop(n_pairs) f0 = [fi.felt for fi in f0] fis = [] for i in range(n_pairs): circuit_prod_i = MultiMillerLoopCircuit( name="test", curve_id=curve_id, n_pairs=1, hash_input=False ) circuit_prod_i.write_p_and_q(Ps[i : i + 1], Qs[i : i + 1]) f_i = circuit_prod_i.miller_loop(1) fis.append(f_i) _, R = nondeterministic_extension_field_mul_divmod(fis, curve_id, 12) assert f0 == R ================================================ FILE: tests/hydra/hints/test_ecip.py ================================================ import random import pytest from garaga.curves import CURVES, CurveID, PairingCurve from garaga.hints.ecip import verify_ecip, zk_ecip_hint from garaga.points import G1Point, G2Point # Define the curves to be tested curves = list(CurveID) @pytest.mark.parametrize("curve_id", curves) @pytest.mark.parametrize("msm_size", range(1, 3)) def test_verify_ecip(curve_id, msm_size): curve = CURVES[curve_id.value] order = curve.n # Test for G1 points Bs_G1 = [G1Point.get_nG(curve_id, 1) for _ in range(msm_size)] scalars = [random.randint(1, order - 1) for _ in range(msm_size)] Q, sum_dlog = zk_ecip_hint(Bs_G1, scalars, use_rust=False) Q_rust, sum_dlog_rust = zk_ecip_hint(Bs_G1, scalars, use_rust=True) assert Q == Q_rust, f"Q: {Q}, \nQ_rust: {Q_rust}" assert ( sum_dlog == sum_dlog_rust ), f"sum_dlog: {sum_dlog}, \nsum_dlog_rust: {sum_dlog_rust}" assert verify_ecip(Bs_G1, scalars, Q=Q_rust, sum_dlog=sum_dlog_rust) # Test for G2 points if the curve supports pairing if isinstance(CURVES[curve_id.value], PairingCurve): Bs_G2 = [G2Point.gen_random_point(curve_id) for _ in range(msm_size)] assert verify_ecip(Bs_G2, scalars) @pytest.mark.parametrize("curve_id", curves) @pytest.mark.parametrize("msm_size", range(0, 3)) def test_verify_ecip_edge_cases(curve_id, msm_size): curve = CURVES[curve_id.value] order = curve.n # Test for G1 points Bs_G1 = [G1Point.gen_random_point(curve_id) for _ in range(msm_size)] + [ G1Point.infinity(curve_id) ] scalars = [0] + [random.randint(1, order - 1) for _ in range(msm_size)] assert verify_ecip(Bs_G1, scalars) # Test for G2 points if the curve supports pairing if isinstance(CURVES[curve_id.value], PairingCurve): Bs_G2 = [G2Point.gen_random_point(curve_id) for _ in range(msm_size)] + [ G2Point.infinity(curve_id) ] assert verify_ecip(Bs_G2, scalars) if __name__ == "__main__": pytest.main() ================================================ FILE: tests/hydra/hints/test_eisenstein.py ================================================ import pytest from hypothesis import given, settings from hypothesis import strategies as st from hydra.garaga.hints.eisenstein import EisensteinInteger, half_gcd # --- Hypothesis Strategies --- # Define reasonable bounds for generated integers to avoid excessively long tests # Using 64-bit range as a starting point, adjust if needed based on performance/coverage MAX_BITS = 64 min_int = -(2 ** (MAX_BITS - 1)) max_int = 2 ** (MAX_BITS - 1) - 1 MAX_EXAMPLES = 50 # Strategy for generating individual integers integer_strategy = st.integers(min_value=min_int, max_value=max_int) # Strategy for generating EisensteinInteger instances eisenstein_integer_strategy = st.builds( EisensteinInteger, a0=integer_strategy, a1=integer_strategy ) # Strategy for generating non-zero EisensteinInteger instances (for division) non_zero_eisenstein_integer_strategy = eisenstein_integer_strategy.filter( lambda x: not x.is_zero() ) # --- Test Constants --- ZERO = EisensteinInteger(0, 0) ONE = EisensteinInteger(1, 0) # --- Test Functions --- @settings(max_examples=MAX_EXAMPLES) # Adjust number of examples as needed @given(eisenstein_integer_strategy) def test_neg_twice_invariant(a: EisensteinInteger): """Test that negating twice returns the original number: -(-a) == a""" assert -(-a) == a @settings(max_examples=MAX_EXAMPLES) @given(eisenstein_integer_strategy) def test_conj_twice_invariant(a: EisensteinInteger): """Test that conjugating twice returns the original number: conj(conj(a)) == a""" assert a.conjugate().conjugate() == a @settings(max_examples=MAX_EXAMPLES) @given(eisenstein_integer_strategy, eisenstein_integer_strategy) def test_add_sub_invariant(a: EisensteinInteger, b: EisensteinInteger): """Test that adding then subtracting the same number is invariant: (a + b) - b == a""" assert (a + b) - b == a @settings(max_examples=MAX_EXAMPLES) @given(eisenstein_integer_strategy, eisenstein_integer_strategy) def test_sub_add_invariant(a: EisensteinInteger, b: EisensteinInteger): """Test that subtracting then adding the same number is invariant: (a - b) + b == a""" assert (a - b) + b == a @settings(max_examples=MAX_EXAMPLES) @given(eisenstein_integer_strategy) def test_add_zero_invariant(a: EisensteinInteger): """Test that adding zero is invariant: a + 0 == a""" assert a + ZERO == a assert ZERO + a == a @settings(max_examples=MAX_EXAMPLES) @given(eisenstein_integer_strategy) def test_mul_one_invariant(a: EisensteinInteger): """Test that multiplying by one is invariant: a * 1 == a""" assert a * ONE == a assert ONE * a == a @settings(max_examples=MAX_EXAMPLES) @given(eisenstein_integer_strategy) def test_mul_zero(a: EisensteinInteger): """Test that multiplying by zero results in zero: a * 0 == 0""" assert a * ZERO == ZERO assert ZERO * a == ZERO @settings(max_examples=MAX_EXAMPLES) @given(eisenstein_integer_strategy, eisenstein_integer_strategy) def test_add_commutative(a: EisensteinInteger, b: EisensteinInteger): """Test addition commutativity: a + b == b + a""" assert a + b == b + a @settings(max_examples=MAX_EXAMPLES) @given( eisenstein_integer_strategy, eisenstein_integer_strategy, eisenstein_integer_strategy, ) def test_add_associative( a: EisensteinInteger, b: EisensteinInteger, c: EisensteinInteger ): """Test addition associativity: (a + b) + c == a + (b + c)""" assert (a + b) + c == a + (b + c) @settings(max_examples=MAX_EXAMPLES) @given(eisenstein_integer_strategy, eisenstein_integer_strategy) def test_mul_commutative(a: EisensteinInteger, b: EisensteinInteger): """Test multiplication commutativity: a * b == b * a""" assert a * b == b * a @settings(max_examples=MAX_EXAMPLES) @given( eisenstein_integer_strategy, eisenstein_integer_strategy, eisenstein_integer_strategy, ) def test_mul_associative( a: EisensteinInteger, b: EisensteinInteger, c: EisensteinInteger ): """Test multiplication associativity: (a * b) * c == a * (b * c)""" assert (a * b) * c == a * (b * c) @settings(max_examples=MAX_EXAMPLES) @given( eisenstein_integer_strategy, eisenstein_integer_strategy, eisenstein_integer_strategy, ) def test_distributive(a: EisensteinInteger, b: EisensteinInteger, c: EisensteinInteger): """Test distributivity: a * (b + c) == (a * b) + (a * c)""" assert a * (b + c) == (a * b) + (a * c) assert (b + c) * a == (b * a) + (c * a) # Right distributivity @settings(max_examples=MAX_EXAMPLES) @given(eisenstein_integer_strategy, eisenstein_integer_strategy) def test_sub_definition(a: EisensteinInteger, b: EisensteinInteger): """Test subtraction definition: a - b == a + (-b)""" assert a - b == a + (-b) @settings(max_examples=MAX_EXAMPLES) @given(eisenstein_integer_strategy) def test_norm_positive(a: EisensteinInteger): """Test that the norm is always non-negative: norm(a) >= 0""" assert a.norm() >= 0 @settings( max_examples=MAX_EXAMPLES ) # Reduced examples, increased deadline for performance @given(eisenstein_integer_strategy, non_zero_eisenstein_integer_strategy) def test_half_gcd(a: EisensteinInteger, b: EisensteinInteger): """ Test the half_gcd identity: w = a*u + b*v Where (w, v, u) is the result of half_gcd(a, b). Handles the case where b might become zero during the process. """ # half_gcd might raise ZeroDivisionError if b is zero initially or becomes zero # in an unexpected way, although the internal check should prevent this normally. try: w, v, u = half_gcd(a, b) # Verify the Bézout-like identity returned by half_gcd assert a * u + b * v == w except ZeroDivisionError: # This case might occur if the input 'b' leads to division by zero internally, # which shouldn't happen with the non_zero strategy and internal checks, # but we catch it defensively. pytest.skip( "Skipping test case due to potential division by zero in half_gcd internals." ) except Exception as e: # Catch any other unexpected exceptions pytest.fail(f"half_gcd raised an unexpected exception: {e}") # You might want to add specific edge case tests manually as well def test_specific_cases(): z1 = EisensteinInteger(3, 2) z2 = EisensteinInteger(1, -1) assert z1 + z2 == EisensteinInteger(4, 1) assert z1 * z2 == EisensteinInteger(5, 1) assert z1.norm() == 7 assert z2.norm() == 3 q, r = z1.quo_rem(z2) assert z1 == z2 * q + r # Test half_gcd with a specific case from the original Python example a_int = EisensteinInteger(0, 1) b_int = EisensteinInteger(-3, 19999) w, v, u = half_gcd(a_int, b_int) assert a_int * u + b_int * v == w def test_zero_division(): a = EisensteinInteger(5, 2) with pytest.raises(ZeroDivisionError): a.quo_rem(ZERO) with pytest.raises(ZeroDivisionError): a // ZERO with pytest.raises(ZeroDivisionError): a % ZERO # half_gcd(a, ZERO) should ideally handle this gracefully or be caught by tests # Let's see how the current implementation handles it try: w, v, u = half_gcd(a, ZERO) # If b is zero, the loop condition `b_run.norm() >= limit` might be false initially # The result should be (a, 0, 1) according to standard extended Euclidean Alg. conventions? # Let's check what the code *actually* does. # The loop `while b_run.norm() >= limit:` will not run if b_run is zero. # It returns `b_run, v_, u_` initialized as `(b, 1, 0)` before loop. # So it should return (ZERO, 1, 0) assert w == ZERO assert v == ONE # Initial v_ assert u == ZERO # Initial u_ # Let's check the identity a*u + b*v == w # a*0 + 0*1 == 0 -> Correct except ZeroDivisionError: pytest.fail("half_gcd(a, ZERO) raised ZeroDivisionError unexpectedly") except Exception as e: pytest.fail(f"half_gcd(a, ZERO) raised an unexpected exception: {e}") def test_half_gcd_a_zero(): b = EisensteinInteger(3, 5) # half_gcd(0, b) try: w, v, u = half_gcd(ZERO, b) # Initialization: a_run=0, b_run=b, u=1, v=0, u_=0, v_=1 # limit = isqrt(0) = 0 # Loop condition: b.norm() >= 0 (true if b != 0) # Inside loop: quotient, remainder = a_run.quo_rem(b_run) -> 0.quo_rem(b) # 0 // b = 0, 0 % b = 0 # quotient = 0, remainder = 0 # next_u_ = u - quotient * u_ = 1 - 0*0 = 1 # next_v_ = v - quotient * v_ = 0 - 0*1 = 0 # a_run = b_run = b # b_run = remainder = 0 # u = u_ = 0 # v = v_ = 1 # u_ = next_u_ = 1 # v_ = next_v_ = 0 # Loop condition: b_run.norm() (0) >= limit (0) -> true? No, condition is >= limit, should be false if limit=0. # Let's re-read loop: `while b_run.norm() >= limit:` # If limit is 0, loop runs as long as norm is non-negative. Needs a b_run.is_zero() check. # The code *has* `if b_run.is_zero(): break` # So, in the first iteration: a_run=0, b_run=b. limit=0. norm(b) >= 0. # quo=0, rem=0. # next_u_=1, next_v_=0 # a_run becomes b. b_run becomes 0. u becomes 0, v becomes 1. u_ becomes 1, v_ becomes 0. # Next iteration: b_run is 0. Break. # Return b_run, v_, u_ -> (0, 0, 1) assert w == ZERO assert v == ZERO # Final v_ assert u == ONE # Final u_ # Check identity: a*u + b*v == w # 0*1 + b*0 == 0 -> Correct except ZeroDivisionError: pytest.fail("half_gcd(ZERO, b) raised ZeroDivisionError unexpectedly") except Exception as e: pytest.fail(f"half_gcd(ZERO, b) raised an unexpected exception: {e}") ================================================ FILE: tests/hydra/hints/test_fake_glv.py ================================================ import random import pytest from garaga.curves import CURVES, CurveID from garaga.hints.fake_glv import ( half_gcd_eisenstein_hint, scalar_mul_fake_glv, scalar_mul_glv_and_fake_glv, ) from garaga.points import G1Point GLV_FAKE_GLV_CURVES = [ CurveID(k) for k, v in CURVES.items() if v.is_endomorphism_available() ] FAKE_GLV_CURVES = [ CurveID(k) for k, v in CURVES.items() if not v.is_endomorphism_available() ] @pytest.mark.parametrize("curve_id", GLV_FAKE_GLV_CURVES) def test_half_gcd_eisenstein_hint(curve_id): curve = CURVES[curve_id.value] eigen_value = curve.eigen_value order = curve.n max_bit_length = curve.n.bit_length() // 4 + 9 print(f"max_bit_length: {max_bit_length}") for _ in range(10000): scalar = random.randint(1, order) u1, u2, v1, v2 = half_gcd_eisenstein_hint(order, scalar, eigen_value) # assert (scalar * (v1 + eigen_value * v2) + u1 + eigen_value * u2) % order == 0 assert abs(u1).bit_length() <= max_bit_length assert abs(u2).bit_length() <= max_bit_length assert abs(v1).bit_length() <= max_bit_length assert abs(v2).bit_length() <= max_bit_length @pytest.mark.parametrize("curve_id", GLV_FAKE_GLV_CURVES) def test_glv_fake_glv(curve_id): curve = CURVES[curve_id.value] random_point = G1Point.get_nG(curve_id, 1) # for _ in range(100): # scalar = random.randint(1, curve.n) # _ = scalar_mul_glv_and_fake_glv(random_point, scalar) scalar = curve.n - 2 _ = scalar_mul_glv_and_fake_glv(random_point, scalar) # for _ in range(100): # _ = scalar_mul_glv_and_fake_glv(random_point, scalar) # scalar -= 1 def test_glv_fake_glv_bls12_381_2(): curve = CURVES[CurveID.BLS12_381.value] n_failed = 0 n_passed = 0 for _ in range(10): try: point = G1Point.gen_random_point_not_in_subgroup(CurveID.BLS12_381) scalar = random.randint(1, 2**63) expected_point = point.scalar_mul(scalar) print(f"expected_point: {expected_point}") _ = scalar_mul_glv_and_fake_glv(point, scalar) n_passed += 1 except AssertionError as e: print(f"Assertion error for scalar = {e}") n_failed += 1 print(f"n_failed: {n_failed}, n_passed: {n_passed}") # _ = scalar_mul_glv_and_fake_glv(point, scalar) assert not point.is_in_prime_order_subgroup_generic() print(f"point nisg: {point}") def test_glv_fake_glv_bls12_381_3(): curve = CURVES[CurveID.BLS12_381.value] n_failed = 0 n_passed = 0 for _ in range(100): try: point = G1Point.gen_random_point(CurveID.BLS12_381) scalar = random.randint(1, curve.n) _ = scalar_mul_glv_and_fake_glv(point, scalar) n_passed += 1 except AssertionError as e: print(f"Assertion error for scalar = {scalar}") n_failed += 1 print(f"n_failed: {n_failed}, n_passed: {n_passed}") # _ = scalar_mul_glv_and_fake_glv(point, scalar) @pytest.mark.parametrize("curve_id", FAKE_GLV_CURVES) def test_scalar_mul_fake_glv(curve_id): curve = CURVES[curve_id.value] G = G1Point.get_nG(curve_id, 1) infinity_point = G1Point.infinity(curve_id) n = curve.n test_cases = [ # Point, Scalar, Description (G, 0, "Generator * 0"), (G, 1, "Generator * 1"), (G, 2, "Generator * 2"), (G, n - 1, "Generator * (n-1)"), (G, n, "Generator * n"), (infinity_point, 5, "Infinity * 5"), (infinity_point, 0, "Infinity * 0"), ] # Add a random point case random_point = G1Point.gen_random_point(curve_id) test_cases.extend( [ (random_point, 0, "Random * 0"), (random_point, 1, "Random * 1"), (random_point, n, "Random * n"), ] ) print(f"\nTesting Curve: {curve_id.name}") for point, scalar, desc in test_cases: print(f" Case: {desc} (P={point}, s={scalar})") expected = point.scalar_mul(scalar) actual = scalar_mul_fake_glv(point, scalar) assert actual == expected, f"Mismatch for {desc}" # Test more random points and scalars num_random_tests = 10 print(f" Running {num_random_tests} random tests...") for i in range(num_random_tests): point = G1Point.gen_random_point(curve_id) scalar = random.randint(1, n) # print(f" Random Test {i+1}: P={point}, s={scalar}") # Optional: verbose logging expected = point.scalar_mul(scalar) actual = scalar_mul_fake_glv(point, scalar) assert ( actual == expected ), f"Mismatch for random test {i+1} (P={point}, s={scalar})" print(f" {num_random_tests} random tests passed.") # Test random scalars for each bit length up to n.bit_length() print(f" Running tests for scalar bit lengths 1 to {n.bit_length()}...") for k in range(1, n.bit_length() + 1, 4): # Generate a scalar with exactly k bits if k == 1: scalar = 1 # Only possible 1-bit scalar > 0 else: lower_bound = 1 << (k - 1) upper_bound = (1 << k) - 1 scalar = random.randint(lower_bound, upper_bound) # Ensure scalar is less than n (important for high bit lengths) scalar = scalar % n if scalar == 0: # Avoid scalar 0 if it happens by modulo scalar = 1 # Or continue; let's test with 1 in this rare case point_to_test = G # Use generator for consistency # print(f" Bit Length {k}: s={scalar}") # Optional: verbose logging expected = point_to_test.scalar_mul(scalar) actual = scalar_mul_fake_glv(point_to_test, scalar) assert actual == expected, f"Mismatch for scalar bit length {k} (s={scalar})" print(f" Scalar bit length tests passed.") ================================================ FILE: tests/hydra/hints/test_final_exp_witness.py ================================================ import random import pytest from garaga.algebra import get_sparsity from garaga.curves import CURVES, CurveID from garaga.hints.multi_miller_witness import ( get_final_exp_witness, get_lambda, get_miller_loop_output, ) from garaga.hints.tower_backup import E6, E12 from garaga.precompiled_circuits.multi_pairing_check import ( MultiPairingCheckCircuit, WriteOps, get_max_Q_degree, get_pairing_check_input, ) @pytest.mark.parametrize("seed", range(4)) @pytest.mark.parametrize("curve_id", [CurveID.BN254, CurveID.BLS12_381]) def test_final_exp_witness(seed, curve_id): random.seed(seed) ONE = E12.one(curve_id.value) λ = get_lambda(curve_id) q = CURVES[curve_id.value].p r = CURVES[curve_id.value].n h = (q**12 - 1) // r # Test correct case f_correct = get_miller_loop_output(curve_id=curve_id, will_be_one=True) root_correct_rust, w_full_correct_rust = get_final_exp_witness( curve_id.value, f_correct, use_rust=True ) root_correct_python, w_full_correct_python = get_final_exp_witness( curve_id.value, f_correct, use_rust=False ) # Compare Rust and Python implementations assert ( root_correct_rust == root_correct_python ), "Roots should match between Rust and Python implementations" assert ( w_full_correct_rust == w_full_correct_python ), "Scaling factors should match between Rust and Python implementations" e6_subfield = E12( [E6.random(curve_id.value), E6.zero(curve_id.value)], curve_id.value ) scaling_factor_sparsity = get_sparsity(e6_subfield.to_direct()) scaling_factor = w_full_correct_rust.to_direct() # Assert sparsity is correct: for every index where the sparsity is 0, the coefficient must 0 in scaling factor for i in range(len(scaling_factor_sparsity)): if scaling_factor_sparsity[i] == 0: assert scaling_factor[i].value == 0 # Therefore scaling factor lies in Fp6 assert f_correct**h == ONE, "f^h should equal 1 for correct case" assert ( f_correct * w_full_correct_rust == root_correct_rust**λ ), "f * w_full should equal root**λ for correct case" # Test incorrect case f_incorrect = get_miller_loop_output(curve_id=curve_id, will_be_one=False) root_incorrect_rust, w_full_incorrect_rust = get_final_exp_witness( curve_id.value, f_incorrect, use_rust=True ) root_incorrect_python, w_full_incorrect_python = get_final_exp_witness( curve_id.value, f_incorrect, use_rust=False ) # Compare Rust and Python implementations assert ( root_incorrect_rust == root_incorrect_python ), "Roots should match between Rust and Python implementations" assert ( w_full_incorrect_rust == w_full_incorrect_python ), "Scaling factors should match between Rust and Python implementations" assert f_incorrect**h != ONE, "f^h should not equal 1 for incorrect case" assert ( f_incorrect * w_full_incorrect_rust != root_incorrect_rust**λ ), "f * w_full should not equal root**λ for incorrect case" print(f"{seed}-th check ok") @pytest.mark.parametrize("curve_id", [CurveID.BN254, CurveID.BLS12_381]) @pytest.mark.parametrize("n_pairs", [2, 3, 4, 5]) @pytest.mark.parametrize("include_m", [False, True]) def test_mpcheck(curve_id: CurveID, n_pairs: int, include_m: bool): c = MultiPairingCheckCircuit(name="mock", curve_id=curve_id.value, n_pairs=n_pairs) circuit_input, m = get_pairing_check_input(curve_id, n_pairs, include_m=include_m) c.write_p_and_q_raw(circuit_input) M = c.write_elements(m, WriteOps.INPUT) if m is not None else None c.multi_pairing_check(n_pairs, M) # Check done implicitely here c.finalize_circuit() def total_cost(c): summ = c.summarize() summ["total_steps_cost"] = ( summ["MULMOD"] * 8 + summ["ADDMOD"] * 4 + summ["ASSERT_EQ"] * 2 + summ["POSEIDON"] * 17 + summ["RLC"] * 28 ) return summ cost = total_cost(c) q_max_degree = max([q.degree() for q in c.accumulate_poly_instructions[0].Qis]) # Assertions assert q_max_degree <= get_max_Q_degree(curve_id.value, n_pairs) print(f"\nTest {curve_id.name} {n_pairs=} {'with m' if include_m else 'without m'}") print(f"Total cost: {cost}") print(f"Q max degree: {q_max_degree}") ================================================ FILE: tests/hydra/hints/test_frobenius.py ================================================ import pytest from garaga.curves import CurveID from garaga.hints.frobenius import generate_frobenius_maps, get_frobenius_maps @pytest.mark.parametrize("curve_id", [CurveID.BN254.value, CurveID.BLS12_381.value]) @pytest.mark.parametrize("extension_degree", [6, 12]) @pytest.mark.parametrize("frob_power", [1, 2, 3]) def test_get_frobenius_maps(curve_id, extension_degree, frob_power): k_expressions, constants_list = get_frobenius_maps( curve_id, extension_degree, frob_power ) k_expressions_gen, constants_list_gen = generate_frobenius_maps( curve_id, extension_degree, frob_power ) assert k_expressions == k_expressions_gen, f"{k_expressions} != {k_expressions_gen}" assert constants_list == constants_list_gen ================================================ FILE: tests/hydra/hints/test_neg3.py ================================================ import random import pytest from garaga.hints.neg_3 import neg_3_base_le, positive_negative_multiplicities @pytest.fixture def test_params(): return list(range(128)) + [random.randint(0, 2**128) for _ in range(128)] def test_neg_3_base_le(test_params): for integer in test_params: assert ( sum((-3) ** i * x for i, x in enumerate(neg_3_base_le(integer))) == integer ) def test_positive_negative_multiplicities(test_params): for integer in test_params: ep, en = positive_negative_multiplicities(neg_3_base_le(integer)) assert integer == ep - en if __name__ == "__main__": pytest.main() ================================================ FILE: tests/hydra/starknet/test_calldata.py ================================================ import random import pytest from garaga.curves import CURVES, CurveID from garaga.points import G1Point from garaga.precompiled_circuits.multi_pairing_check import get_pairing_check_input from garaga.starknet.tests_and_calldata_generators.drand_calldata import ( drand_encrypt_to_calldata, drand_round_to_calldata, ) from garaga.starknet.tests_and_calldata_generators.mpcheck import MPCheckCalldataBuilder from garaga.starknet.tests_and_calldata_generators.msm import MSMCalldataBuilder # Define the curves to be tested curves = list(CurveID) @pytest.mark.parametrize("curve_id", [CurveID.BN254, CurveID.BLS12_381]) @pytest.mark.parametrize("mpc_size", [2, 3]) @pytest.mark.parametrize("n_fixed_g2", [2]) @pytest.mark.parametrize("include_m", [True, False]) def test_mpc_calldata_builder( curve_id, mpc_size, n_fixed_g2, include_m, ): pairs, public_pair = get_pairing_check_input( curve_id=curve_id, n_pairs=mpc_size, include_m=include_m, return_pairs=True, ) mpc = MPCheckCalldataBuilder( curve_id=curve_id, pairs=pairs, n_fixed_g2=n_fixed_g2, public_pair=public_pair, ) calldata_py = mpc.serialize_to_calldata(use_rust=False) calldata_rs = mpc.serialize_to_calldata(use_rust=True) assert len(calldata_py) == len(calldata_rs) assert calldata_py == calldata_rs @pytest.mark.parametrize("curve_id", curves) @pytest.mark.parametrize("msm_size", [1, 2]) @pytest.mark.parametrize("include_points_and_scalars", [True, False]) @pytest.mark.parametrize("serialize_as_pure_felt252_array", [True, False]) def test_msm_calldata_builder( curve_id, msm_size, include_points_and_scalars, serialize_as_pure_felt252_array, ): curve = CURVES[curve_id.value] order = curve.n scalar_limit = order points = [G1Point.gen_random_point(curve_id) for _ in range(msm_size)] scalars = [random.randint(0, scalar_limit - 1) for _ in range(msm_size)] msm = MSMCalldataBuilder( points=points, scalars=scalars, curve_id=curve_id, ) calldata1 = msm.serialize_to_calldata( include_points_and_scalars=include_points_and_scalars, serialize_as_pure_felt252_array=serialize_as_pure_felt252_array, use_rust=False, ) calldata2 = msm.serialize_to_calldata( include_points_and_scalars=include_points_and_scalars, serialize_as_pure_felt252_array=serialize_as_pure_felt252_array, use_rust=True, ) assert calldata1 == calldata2 @pytest.mark.parametrize("round_number", [1, 2, 3]) def test_drand_randomness_to_calldata( round_number, ): calldata1 = drand_round_to_calldata( round_number, use_rust=False, ) calldata2 = drand_round_to_calldata( round_number, use_rust=True, ) assert calldata1 == calldata2 @pytest.mark.parametrize("round_number", [1, 2, 3]) @pytest.mark.parametrize( "message", [b"0000000000000000", b"1234567890abcdef", b"fedababafecacaca"] ) @pytest.mark.parametrize("randomness", [b"0000000000000000", b"dead00013000beef"]) def test_drand_encrypt_to_round_calldata( round_number, message, randomness, ): calldata1 = drand_encrypt_to_calldata( round_number, message, randomness, use_rust=False, ) calldata2 = drand_encrypt_to_calldata( round_number, message, randomness, use_rust=True, ) assert calldata1 == calldata2 if __name__ == "__main__": pytest.main() ================================================ FILE: tests/hydra/starknet/test_groth16_vk_proof_parsing.py ================================================ import pytest from garaga.starknet.groth16_contract_generator.calldata import ( groth16_calldata_from_vk_and_proof, ) from garaga.starknet.groth16_contract_generator.parsing_utils import ( Groth16Proof, Groth16VerifyingKey, ) PATH = "hydra/garaga/starknet/groth16_contract_generator/examples" @pytest.mark.parametrize( "vk_path", [ f"{PATH}/snarkjs_vk_bn254.json", f"{PATH}/snarkjs_vk_bls12381.json", f"{PATH}/vk_bn254.json", f"{PATH}/vk_bls.json", f"{PATH}/gnark_vk_bn254.json", f"{PATH}/vk_risc0.json", f"{PATH}/vk_sp1.json", ], ) def test_vk_parsing(vk_path: str): vk = Groth16VerifyingKey.from_json(vk_path) print(vk) # if vk_path == f"{PATH}/vk_sp1.json": # print("[") # for e in vk.flatten(): # print(f'"{hex(e)[2:]}",') # print("]") @pytest.mark.parametrize( "proof_path", [ f"{PATH}/proof_bn254.json", f"{PATH}/proof_bls.json", f"{PATH}/proof_risc0.json", f"{PATH}/proof_sp1.json", ], ) def test_proof_parsing(proof_path: str): proof = Groth16Proof.from_json(proof_path) print(proof) @pytest.mark.parametrize( "proof_path, pub_inputs_path", [ (f"{PATH}/snarkjs_proof_bn254.json", f"{PATH}/snarkjs_public_bn254.json"), (f"{PATH}/snarkjs_proof_bls12381.json", f"{PATH}/snarkjs_public_bls12381.json"), (f"{PATH}/gnark_proof_bn254.json", f"{PATH}/gnark_public_bn254.json"), ], ) def test_proof_parsing_with_public_input(proof_path: str, pub_inputs_path: str): proof = Groth16Proof.from_json(proof_path, pub_inputs_path) print(proof) @pytest.mark.parametrize( "proof_path, vk_path, pub_inputs_path", [ (f"{PATH}/proof_bn254.json", f"{PATH}/vk_bn254.json", None), (f"{PATH}/proof_bls.json", f"{PATH}/vk_bls.json", None), ( f"{PATH}/gnark_proof_bn254.json", f"{PATH}/gnark_vk_bn254.json", f"{PATH}/gnark_public_bn254.json", ), ( f"{PATH}/snarkjs_proof_bn254.json", f"{PATH}/snarkjs_vk_bn254.json", f"{PATH}/snarkjs_public_bn254.json", ), (f"{PATH}/proof_risc0.json", f"{PATH}/vk_risc0.json", None), (f"{PATH}/proof_sp1.json", f"{PATH}/vk_sp1.json", None), ], ) def test_calldata_generation( proof_path: str, vk_path: str, pub_inputs_path: str | None ): import time vk = Groth16VerifyingKey.from_json(vk_path) proof = Groth16Proof.from_json(proof_path, pub_inputs_path) start = time.time() calldata = groth16_calldata_from_vk_and_proof(vk, proof, use_rust=False) end = time.time() print(f"Python time: {end - start}") start = time.time() calldata_rust = groth16_calldata_from_vk_and_proof(vk, proof, use_rust=True) end = time.time() print(f"Rust time: {end - start}") assert calldata == calldata_rust ================================================ FILE: tests/hydra/starknet/test_honk_vk_proof_parsing.py ================================================ import pytest from garaga.curves import ProofSystem from garaga.precompiled_circuits.zk_honk import HonkVk, honk_proof_from_bytes from garaga.starknet.honk_contract_generator.calldata import ( get_ultra_flavor_honk_calldata_from_vk_and_proof, ) PATH = "hydra/garaga/starknet/honk_contract_generator/examples" @pytest.mark.parametrize( "vk_path, vk_hash_path", [ (f"{PATH}/vk_ultra_keccak.bin", f"{PATH}/vk_hash_ultra_keccak.bin"), ], ) def test_vk_parsing(vk_path: str, vk_hash_path: str): vk = HonkVk.from_bytes(open(vk_path, "rb").read()) vk_hash_expected = int.from_bytes(open(vk_hash_path, "rb").read(), "big") assert ( vk.vk_hash == vk_hash_expected ), f"vk_hash: {hex(vk.vk_hash)} != vk_hash_expected: {hex(vk_hash_expected)}" print(vk) @pytest.mark.parametrize( "proof_path, public_inputs_path, vk_path, system", [ ( f"{PATH}/proof_ultra_keccak_zk.bin", f"{PATH}/public_inputs_ultra_keccak.bin", f"{PATH}/vk_ultra_keccak.bin", ProofSystem.UltraKeccakZKHonk, ), ], ) def test_proof_parsing( proof_path: str, public_inputs_path: str, vk_path: str, system: ProofSystem, ): vk = HonkVk.from_bytes(open(vk_path, "rb").read()) proof = honk_proof_from_bytes( open(proof_path, "rb").read(), open(public_inputs_path, "rb").read(), vk, system ) print(proof) @pytest.mark.parametrize( "proof_path, public_inputs_path, vk_path, system", [ ( f"{PATH}/proof_ultra_keccak_zk.bin", f"{PATH}/public_inputs_ultra_keccak.bin", f"{PATH}/vk_ultra_keccak.bin", ProofSystem.UltraKeccakZKHonk, ), ], ) def test_calldata_generation( proof_path: str, public_inputs_path: str, vk_path: str, system: ProofSystem, ): import time vk = HonkVk.from_bytes(open(vk_path, "rb").read()) proof = honk_proof_from_bytes( open(proof_path, "rb").read(), open(public_inputs_path, "rb").read(), vk, system ) start = time.time() calldata = get_ultra_flavor_honk_calldata_from_vk_and_proof( vk, proof, system, use_rust=False ) end = time.time() print(f"Python time: {end - start}") start = time.time() calldata_rust = get_ultra_flavor_honk_calldata_from_vk_and_proof( vk, proof, system, use_rust=True ) end = time.time() print(f"Rust time: {end - start}") assert calldata == calldata_rust ================================================ FILE: tests/hydra/starknet/test_signatures_calldata.py ================================================ import json import pytest from garaga.curves import CurveID from garaga.starknet.tests_and_calldata_generators.signatures import ( ECDSASignature, EdDSA25519Signature, RSA2048Signature, SchnorrSignature, ) # Define the curves to be tested curves = list(CurveID) @pytest.mark.parametrize("curve_id", curves) @pytest.mark.parametrize("prepend_public_key", [True, False]) def test_schnorr_calldata_builder(curve_id, prepend_public_key): """Test that Python and Rust implementations of Schnorr signature calldata match""" for _ in range(3): # Test 3 random samples # Generate a random valid signature sig = SchnorrSignature.sample(curve_id) # Get calldata from Python implementation calldata1 = sig.serialize_with_hints( use_rust=False, prepend_public_key=prepend_public_key ) # Get calldata from Rust implementation calldata2 = sig.serialize_with_hints( use_rust=True, prepend_public_key=prepend_public_key ) assert ( calldata1 == calldata2 ), f"Mismatch in Schnorr calldata for curve {curve_id.name}" @pytest.mark.parametrize("curve_id", curves) @pytest.mark.parametrize("prepend_public_key", [True, False]) def test_ecdsa_calldata_builder(curve_id, prepend_public_key): """Test that Python and Rust implementations of ECDSA signature calldata match""" for _ in range(4): # Test 4 random samples # Generate a random valid signature sig = ECDSASignature.sample(curve_id) # Get calldata from Python implementation calldata1 = sig.serialize_with_hints( use_rust=False, prepend_public_key=prepend_public_key ) # Get calldata from Rust implementation calldata2 = sig.serialize_with_hints( use_rust=True, prepend_public_key=prepend_public_key ) assert ( calldata1 == calldata2 ), f"Mismatch in ECDSA calldata for curve {curve_id.name}" @pytest.mark.parametrize("prepend_public_key", [True, False]) def test_eddsa_25519_signatures(prepend_public_key, full=False): with open("tests/ed25519_test_vectors.json", "r") as f: test_vectors = json.load(f) if full: test_vectors = test_vectors else: test_vectors = test_vectors[0:96] for i, test_vector in enumerate(test_vectors): signature = EdDSA25519Signature.from_json(test_vector) assert signature.is_valid(), f"Signature {i} is invalid" calldata_py = signature.serialize_with_hints( use_rust=False, prepend_public_key=prepend_public_key ) calldata_rust = signature.serialize_with_hints( use_rust=True, prepend_public_key=prepend_public_key ) assert ( calldata_py == calldata_rust ), f"Mismatch in EdDSA calldata for test vector {i}" @pytest.mark.parametrize("prepend_public_key", [True, False]) def test_rsa2048_calldata_lengths(prepend_public_key): signature = RSA2048Signature.sample(seed=0) calldata = signature.serialize_with_hints( use_rust=False, prepend_public_key=prepend_public_key ) expected_len = 888 if prepend_public_key else 864 assert len(calldata) == expected_len def test_rsa2048_calldata_public_key_prefix(): signature = RSA2048Signature.sample(seed=0) full = signature.serialize_with_hints(use_rust=False, prepend_public_key=True) public_key = signature.serialize_public_key() witness = signature.serialize_signature_with_hints() assert full[: len(public_key)] == public_key assert full[len(public_key) :] == witness @pytest.mark.parametrize("prepend_public_key", [True, False]) def test_rsa2048_calldata_builder(prepend_public_key): """Test that Python and Rust implementations of RSA-2048 calldata match""" for seed in range(3): sig = RSA2048Signature.sample(seed=seed) calldata_py = sig.serialize_with_hints( use_rust=False, prepend_public_key=prepend_public_key ) calldata_rs = sig.serialize_with_hints( use_rust=True, prepend_public_key=prepend_public_key ) assert ( calldata_py == calldata_rs ), f"Mismatch in RSA-2048 calldata for seed {seed}" @pytest.mark.parametrize("prepend_public_key", [True, False]) @pytest.mark.parametrize("message", [b"hello garaga", b"", b"a" * 100, b"\x00\x01\x02"]) def test_rsa2048_sha256_calldata_builder(prepend_public_key, message): """Test that Python and Rust implementations of RSA-2048 SHA-256 calldata match""" sig = RSA2048Signature.from_sha256_message(message, seed=0) calldata_py = sig.serialize_sha256_with_hints( message=message, use_rust=False, prepend_public_key=prepend_public_key, ) calldata_rs = sig.serialize_sha256_with_hints( message=message, use_rust=True, prepend_public_key=prepend_public_key, ) assert ( calldata_py == calldata_rs ), f"Mismatch in RSA-2048 SHA-256 calldata for message {message!r}" if __name__ == "__main__": pytest.main() ================================================ FILE: tests/hydra/test_bls18_381_map_to_curve.py ================================================ from garaga.modulo_circuit import WriteOps from garaga.precompiled_circuits.map_to_curve import MapToCurveG1, MapToCurveG2 def test_bls18_381_map_to_curve_g2_non_quadratic(): circuit = MapToCurveG2("test", 1) circuit.set_consts() field = circuit.write_elements( [ circuit.field( 3741944764571472160006322193608041966151877622471123223277469611910821820061028054244113212685535996904839352799402 ), circuit.field( 2076377621229436486953902801269393160218977179950230047408992877427440885760409779221205731516804245080380194857867 ), ], WriteOps.INPUT, ) g1x, div, num_x1, zeta_u2 = circuit.map_to_curve_part_1(field) # Assert intermediate results assert ( g1x[0].emulated_felt.value == 953996773580150187658453355749387256203585747550541475689949001565592017941792784008487857020741875161940439358169 ) assert ( g1x[1].emulated_felt.value == 1091041959624877033265075916985653082630429384881674462548287154185532968300913190673468388150241943339667076518253 ) assert ( div[0].emulated_felt.value == 1271124738425673168909051490409346544806999942963856749219399676853245141674638476952210593612982147617933716830990 ) assert ( div[1].emulated_felt.value == 2707549614030537572533166896762785147996244686855330285575235995466755739337470183080976608052299087222211278178288 ) assert ( num_x1[0].emulated_felt.value == 3368717908425370587121521256961562283349295337955434359453978866874955592536159067888255032927442968748123109596151 ) assert ( num_x1[1].emulated_felt.value == 3415444388557434595807082624117973727069974003779938583652094445339905219350042585004730694719550642891646061378068 ) assert ( zeta_u2[0].emulated_felt.value == 2066503771099735372725208757434934470387642893685367231392552060087408173898621033802030119021772665098131312925308 ) assert ( zeta_u2[1].emulated_felt.value == 1011496392125783422068061997226415746244229915320831072846626167000664891392171563621675612638222437312051389941143 ) x_affine, y, field = circuit.compute_initial_coordinates_non_quadratic( field, g1x, div, num_x1, zeta_u2 ) y_affine, qfield, qy = circuit.adjust_y_sign(y, field) # Assert final results assert ( x_affine[0].emulated_felt.value == 2006413752686223508612366075043722458232321744863932880413784802489452766740742045984482044248764924205010366531647 ) assert ( x_affine[1].emulated_felt.value == 2103918733930157635900741069076788853417130098910518594897125230089087553459780427160470339353748226243766968776215 ) assert ( y_affine[0].emulated_felt.value == 2345181275451808874246097791768578660839971403546046193253448677984295781774410213317345275973043584946083029690838 ) assert ( y_affine[1].emulated_felt.value == 491718355885353185704655750809656447183587281146662745649897882009019112506313662303269809992594062560315039747134 ) def test_bls18_381_map_to_curve_g2_quadratic(): circuit = MapToCurveG2("test", 1) circuit.set_consts() field = circuit.write_elements( [ circuit.field( 1556800727266659224486307223710983989761661593776178353933175239605467918853638579207638742450628877266610077644019 ), circuit.field( 2231413721970278425038638834062370180699174210864795385441649994565282274875534254514118105433862522641883533654145 ), ], WriteOps.INPUT, ) g1x, div, num_x1, zeta_u2 = circuit.map_to_curve_part_1(field) # Assert intermediate results assert ( g1x[0].emulated_felt.value == 1741461048819108320601120926297383578798673393844727619465122674954412335152552581570073244593349691385858884173583 ) assert ( g1x[1].emulated_felt.value == 622728400870450638897257156989331087788861565586056105959821305999301052577755232615332472975146795773248285518397 ) assert ( div[0].emulated_felt.value == 245484112468371472016059514225945212312552892410862615098545961349697995155733061412689120985823985643121008707443 ) assert ( div[1].emulated_felt.value == 2710033076136311888860218740720521072952923210029411465485968205608170799418483286817121694092479356648635501832540 ) assert ( num_x1[0].emulated_felt.value == 678813894361393103360103286141952477825674360176586850375556142934890501990305386551122112060089003594179575462051 ) assert ( num_x1[1].emulated_felt.value == 481031161552380994425457621530411412945970154876090436018460806513725659192179414613944042534095739563026661110941 ) assert ( zeta_u2[0].emulated_felt.value == 2605347211487192472869035898066121846694525878433542755302801455037350149869786867270039608133704248908541829065188 ) assert ( zeta_u2[1].emulated_felt.value == 2186733141282187687524429079326838649285331456588145172920951615849025076744838489106511432055390831654029460361575 ) x_affine, y, field = circuit.compute_initial_coordinates_quadratic( field, g1x, div, num_x1 ) y_affine, qfield, qy = circuit.adjust_y_sign(y, field) # Assert final results assert ( x_affine[0].emulated_felt.value == 2843075373688611471290556504186176053275483247291128525980163517764803526616259371130035811825227707920936817728741 ) assert ( x_affine[1].emulated_felt.value == 3661712616179456093275454398202160102594067191736010383603184812959944211042529505618295008186663134429283699505891 ) assert ( y_affine[0].emulated_felt.value == 2229899020770589661585214900480830515873415727829711460134445858387853696109925143060238999266818473086058450471795 ) assert ( y_affine[1].emulated_felt.value == 3127664777588830509127251096086955764006894160737524705993294599144750103128110100147816255502757346871240956727581 ) def test_bls18_381_map_to_curve_g1_quadratic(): circuit = MapToCurveG1("test", 1) circuit.set_consts() field = circuit.write_element( circuit.field( 2231413721970278425038638834062370180699174210864795385441649994565282274875534254514118105433862522641883533654145 ) ) g1x, div, num_x1, zeta_u2 = circuit.map_to_curve_part_1(field) # Assert intermediate results assert ( g1x.emulated_felt.value == 2597611908074869266676097344052780591254059561619989704088799034359084350987704445977946845985385140941235233170571 ) assert ( div.emulated_felt.value == 2805237479025562283149334731040192757369528037210657601602127558394884972035943561694397352660127862349210615463142 ) assert ( num_x1.emulated_felt.value == 357516532893183420527219030989999274866612035539674613298479245292141662614414253856542640697610990033784993055353 ) assert ( zeta_u2.emulated_felt.value == 1458720157247399937074920312179320190319011370446888399995409372377477911247349655187476411795089883075347478260790 ) x_affine, y_initial, field = circuit.compute_initial_coordinates_quadratic( field, g1x, div, num_x1 ) y_affine, qy, qfield = circuit.adjust_y_sign(y_initial, field) # Assert final results assert ( x_affine.emulated_felt.value == 821680820282835312240647697969669528662337868557420531415876216710180320418897646214379495222032594074174798424202 ) assert ( y_affine.emulated_felt.value == 2810929796268343801118836101228108033947242316820103062127644703467142871560955216144508646104360230898984292110363 ) def test_bls18_381_map_to_curve_g1_non_quadratic(): circuit = MapToCurveG1("test", 1) circuit.set_consts() field = circuit.write_element( circuit.field( 1556800727266659224486307223710983989761661593776178353933175239605467918853638579207638742450628877266610077644019 ) ) g1x, div, num_x1, zeta_u2 = circuit.map_to_curve_part_1(field) # Assert intermediate results assert ( g1x.emulated_felt.value == 341972610627912974245460429393853020244324285563375868527372516439156668443097006714852415949547549919046535667616 ) assert ( div.emulated_felt.value == 437377489188823988571636230286582387258102034988413032009071756963827842481400269867189494736241034037731549310834 ) assert ( num_x1.emulated_felt.value == 859079108276904279242178106413495842276094320054147243681841678369946208284556898300157013329362279916993343726889 ) assert ( zeta_u2.emulated_felt.value == 3595463469902610153619251584554498156597029272564817168764456841515827675239496939601340079478403412813212271353518 ) x_affine, y_initial, field = circuit.compute_initial_coordinates_non_quadratic( field, g1x, div, num_x1, zeta_u2 ) y_affine, qy, qfield = circuit.adjust_y_sign(y_initial, field) # Assert final results assert ( x_affine.emulated_felt.value == 1412853964218444964438936699552956047210482383152224645596624291427056376487356261681298103080878386132407858666637 ) assert ( y_affine.emulated_felt.value == 752734926215712395741522221355891264404138695398702662135908094550118515106801651502315795564392519475687558113863 ) ================================================ FILE: tests/hydra/test_cofactor_clearing.py ================================================ import garaga.modulo_circuit_structs as structs from garaga.curves import CURVES, PyFelt from garaga.modulo_circuit import WriteOps from hydra.garaga.precompiled_circuits.cofactor_clearing import ( FastG2CofactorClearing, G1CofactorClearing, SlowG2CofactorClearing, ) def test_cofactor_clearing(): # Initialize circuit circuit = FastG2CofactorClearing(name="cofactor_clearing", curve_id=1) # Input values values = [ PyFelt( 3789617024712504402204306620295003375951143917889162928515122476381982967144814366712031831841518399614182231387665, CURVES[1].p, ), PyFelt( 1467567314213963969852279817989131104935039564231603908576814773321528757289376676761397368853965316423532584391899, CURVES[1].p, ), PyFelt( 1292375129422168617658520396283100687686347104559592203462491249161639006037671760603453326853098986903549775136448, CURVES[1].p, ), PyFelt( 306655960768766438834866368706782505873384691666290681181893693450298456233972904889955517117016529975705729523733, CURVES[1].p, ), ] # Write struct and get coordinates px0, px1, py0, py1 = circuit.write_struct( structs.G2PointCircuit("G2", values), WriteOps.INPUT ) # Run cofactor clearing result = circuit.clear_cofactor(([px0, px1], [py0, py1])) print(result) # Assert x coordinates assert ( result[0][0].emulated_felt.value == 3553105769882656599146811322193073462254184878577379981354181602459568891247079537874757677386646278295787021209189 ) assert ( result[0][1].emulated_felt.value == 214383232028397026483172293507406653308736549333914058501039576182920645751681896937109061242049824624418352241545 ) # Assert y coordinates assert ( result[1][0].emulated_felt.value == 3739747178790495019675321498823208242976352322769291665915571365507822310651678949551185523146598688776619260961478 ) assert ( result[1][1].emulated_felt.value == 2892856738085945244799268348340138656888776287206503012318583837503972113824639536543638524553710065178322083313320 ) # Test slow cofactor clearing produces same results slow_circuit = SlowG2CofactorClearing(name="slow_co_clear", curve_id=1) # Write struct and get coordinates slow_px0, slow_px1, slow_py0, slow_py1 = slow_circuit.write_struct( structs.G2PointCircuit("G2", values), WriteOps.INPUT ) # Run slow cofactor clearing slow_result = slow_circuit.clear_cofactor( ([slow_px0, slow_px1], [slow_py0, slow_py1]) ) # Assert results match fast implementation assert slow_result[0][0].emulated_felt.value == result[0][0].emulated_felt.value assert slow_result[0][1].emulated_felt.value == result[0][1].emulated_felt.value assert slow_result[1][0].emulated_felt.value == result[1][0].emulated_felt.value assert slow_result[1][1].emulated_felt.value == result[1][1].emulated_felt.value def test_cofactor_clearing_g1(): circuit = G1CofactorClearing(name="cofactor_clearing", curve_id=1) val_x = circuit.write_element( circuit.field( 3789617024712504402204306620295003375951143917889162928515122476381982967144814366712031831841518399614182231387665 ) ) val_y = circuit.write_element( circuit.field( 1292375129422168617658520396283100687686347104559592203462491249161639006037671760603453326853098986903549775136448 ) ) x, y = circuit.clear_cofactor((val_x, val_y)) assert ( x.emulated_felt.value == 124653168926536040050712523694358620626733702681766514335826706855268535061758110145263289951074346182616444645930 ) assert ( y.emulated_felt.value == 1763117104256928975303050316870512727100973588519940064853641891041664131774050255702157308774582078610333186925605 ) ================================================ FILE: tests/hydra/test_drand.py ================================================ import hashlib import random import pytest import requests from garaga.curves import CurveID from garaga.drand.client import ( BASE_URLS, DrandNetwork, digest_func, get_randomness, print_all_chain_info, ) from garaga.drand.tlock import decrypt_at_round, encrypt_for_round from garaga.points import G1G2Pair, G2Point from garaga.signature import hash_to_curve @pytest.mark.parametrize("round_number", list(range(1, 5)) + list(range(1000, 1005))) def test_drand_sig_verification(round_number: int): chain_infos = print_all_chain_info() network = DrandNetwork.quicknet chain = chain_infos[network] round = get_randomness(chain.hash, round_number) print(f"Randomness for round {round_number}:", round) sha256 = hashlib.sha256() sha256.update(bytes.fromhex(round.signature)) print("randomness", sha256.hexdigest()) print("random beacon", hex(round.randomness)) msg_point = hash_to_curve( digest_func(round.round_number), CurveID.BLS12_381, "sha256" ) print("message", msg_point) assert ( G1G2Pair.pair( [ G1G2Pair( p=round.signature_point, q=G2Point.get_nG(CurveID.BLS12_381, 1) ), G1G2Pair(p=msg_point, q=-chain.public_key), ], curve_id=CurveID.BLS12_381, ).value_coeffs == [1] + [0] * 11 ), "Signature verification failed" @pytest.mark.parametrize("round", list(range(1, 5)) + list(range(1000, 1005))) def test_tlock_encrypt_decrypt(round: int): random.seed(42) chain_infos = print_all_chain_info() network = DrandNetwork.quicknet chain = chain_infos[network] master = chain.public_key msg = random.randbytes(16) ciph = encrypt_for_round(master, round, msg) chain = chain_infos[network] beacon = get_randomness(chain.hash, round) signature_at_round = beacon.signature_point msg_decrypted = decrypt_at_round(signature_at_round, ciph) assert msg_decrypted == msg @pytest.mark.parametrize("round", list(range(1, 5))) def test_tlock_encrypt_same_message_gives_different_ciphertexts(round: int): random.seed(42) chain_infos = print_all_chain_info() network = DrandNetwork.quicknet chain = chain_infos[network] master = chain.public_key msg = b"0123456789abcdef" ciph1 = encrypt_for_round(master, round, msg) ciph2 = encrypt_for_round(master, round, msg) assert ciph1.U != ciph2.U assert ciph1.V != ciph2.V assert ciph1.W != ciph2.W chain = chain_infos[network] beacon = get_randomness(chain.hash, round) signature_at_round = beacon.signature_point msg_decrypted1 = decrypt_at_round(signature_at_round, ciph1) msg_decrypted2 = decrypt_at_round(signature_at_round, ciph2) assert msg_decrypted1 == msg assert msg_decrypted2 == msg def test_all_base_urls_return_chains(): for url in BASE_URLS: try: response = requests.get(f"{url}/chains") response.raise_for_status() chains = response.json() # Check that both default and quicknet chains are present expected_chains = {network.value for network in DrandNetwork} found_chains = set(chains) assert expected_chains.issubset( found_chains ), f"URL {url} missing chains: {expected_chains - found_chains}" print(f"✓ {url} returned all expected chains") except Exception as e: print(f"✗ {url} failed: {str(e)}") continue ================================================ FILE: tests/hydra/test_extension_field_modulo_circuit.py ================================================ import random import pytest from garaga.algebra import PyFelt from garaga.curves import CurveID from garaga.extension_field_modulo_circuit import ExtensionFieldModuloCircuit from garaga.modulo_circuit import ModuloCircuitElement, WriteOps @pytest.fixture( params=[ (CurveID.BN254, 6), (CurveID.BLS12_381, 6), (CurveID.BN254, 12), (CurveID.BLS12_381, 12), ] ) def circuit(request) -> tuple[ExtensionFieldModuloCircuit, list[ModuloCircuitElement]]: curve_id, extension_degree = request.param def init_z_circuit( z: int = 2, ) -> tuple[ExtensionFieldModuloCircuit, list[ModuloCircuitElement]]: c = ExtensionFieldModuloCircuit( name="test", curve_id=curve_id.value, extension_degree=extension_degree ) c.create_powers_of_Z(c.field(z)) X = c.write_elements( [PyFelt(i + 1, c.field.p) for i in range(extension_degree)], operation=WriteOps.INPUT, ) return c, X return init_z_circuit() def test_eval(circuit: tuple[ExtensionFieldModuloCircuit, list[ModuloCircuitElement]]): c, X = circuit X_of_z = c.eval_poly_in_precomputed_Z(X) assert ( X_of_z.value == sum((i + 1) * 2**i for i in range(c.extension_degree)) % c.field.p ) assert len(c.z_powers) == c.extension_degree def generate_random_sparsity( extension_degree: int, num_cases: int = 32 ) -> list[list[int]]: sparsities = [ [random.choice([0, 1, 2]) for _ in range(extension_degree)] for _ in range(num_cases) ] for sparsity in sparsities: if all(x == 0 for x in sparsity): # Make sure there is at least one non-zero element somewhere sparsity[random.randint(0, extension_degree - 1)] = random.choice([1, 2]) return sparsities def test_eval_sparse( circuit: tuple[ExtensionFieldModuloCircuit, list[ModuloCircuitElement]], ): c, X = circuit sparsities = generate_random_sparsity(c.extension_degree) for sparsity in sparsities: X_of_z = c.eval_poly_in_precomputed_Z(X, sparsity=sparsity) assert ( X_of_z.value == ( sum((i + 1) * 2**i for i, s in enumerate(sparsity) if s == 1) + sum(2**i for i, s in enumerate(sparsity) if s == 2) ) % c.field.p ) if __name__ == "__main__": pytest.main() ================================================ FILE: tests/hydra/test_g1_point.py ================================================ import pytest from garaga.curves import CURVES, CurveID, TwistedEdwardsCurve, is_generator from garaga.points import G1Point # List of curve IDs to test curve_ids = list(CurveID) @pytest.mark.parametrize("curve_id", [CurveID.ED25519]) def test_weierstrass_to_twistededwards_and_back(curve_id): curve: TwistedEdwardsCurve = CURVES[curve_id.value] # Define a point in Weierstrass form x_weierstrass = curve.Gx y_weierstrass = curve.Gy x_twisted, y_twisted = curve.to_twistededwards(x_weierstrass, y_weierstrass) x_weierstrass_back, y_weierstrass_back = curve.to_weierstrass(x_twisted, y_twisted) assert x_weierstrass == x_weierstrass_back assert y_weierstrass == y_weierstrass_back @pytest.mark.parametrize("curve_id", curve_ids) def test_fp_generator(curve_id): if curve_id == CurveID.BLS12_381: pytest.skip( "Skipping test for curve BLS12_381, it's a bit too slow to factorize p-1, but already tested. Uncomment to convince yourself." ) g = CURVES[curve_id.value].fp_generator p = CURVES[curve_id.value].p assert is_generator(g, p) @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_equality(curve_id): p1 = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) p2 = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) p3 = p1.add(p2) assert p1 == p2 assert p1 != p3 @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_infinity(curve_id): inf = G1Point.infinity(curve_id) assert inf.is_infinity() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_on_curve(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) assert p.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_not_on_curve(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) p.y = 3 # Modify y to make it not on the curve assert not p.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_scalar_mul(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) result = p.scalar_mul(2) assert result.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_addition(curve_id): p1 = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) p2 = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) result = p1.add(p2) assert result.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_addition_with_negative_point(curve_id): p1 = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) p2 = -p1 result = p1.add(p2) assert result.is_infinity() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_negation(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) neg_p = -p assert neg_p.is_on_curve() assert p.add(neg_p).is_infinity() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_msm(curve_id): p1 = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) p2 = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) points = [p1, p2] scalars = [2, 3] result = G1Point.msm(points, scalars) assert result.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_gen_random_point(curve_id): p = G1Point.gen_random_point(curve_id) assert p.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_gen_random_point_not_in_subgroup(curve_id): if CURVES[curve_id.value].h == 1: pytest.skip(f"Skipping test for curve {curve_id} because the cofactor is 1") p = G1Point.gen_random_point_not_in_subgroup(curve_id, force_gen=True) assert p.is_on_curve() assert not p.is_in_prime_order_subgroup_generic() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_to_cairo_1(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) cairo_repr = p.to_cairo_1() assert isinstance(cairo_repr, str) @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_doubling(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) doubled = p.add(p) assert doubled.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_addition_vs_doubling(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) doubled = p.add(p) scalar_mul_2 = p.scalar_mul(2) assert doubled == scalar_mul_2 @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_msm_vs_scalar_mul(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) scalar = 3 msm_result = G1Point.msm([p], [scalar]) scalar_mul_result = p.scalar_mul(scalar) assert msm_result == scalar_mul_result # Edge case tests for scalar multiplication @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_scalar_mul_zero(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) result = p.scalar_mul(0) assert result.is_infinity() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_scalar_mul_one(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) result = p.scalar_mul(1) assert result == p @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_scalar_mul_negative(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) result = p.scalar_mul(-1) assert result == -p @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_scalar_mul_large(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) large_scalar = 10**18 result = p.scalar_mul(large_scalar) assert result.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_scalar_mul_invalid(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) with pytest.raises(TypeError): p.scalar_mul("invalid_scalar") @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_scalar_mul_order(curve_id): p = G1Point(CURVES[curve_id.value].Gx, CURVES[curve_id.value].Gy, curve_id) result = p.scalar_mul(CURVES[curve_id.value].n) assert result.is_infinity() @pytest.mark.parametrize("curve_id", curve_ids) def test_g1point_scalar_mul_larger_than_order(curve_id): # Generate 10 random points on the curve random_points = [G1Point.gen_random_point(curve_id) for _ in range(10)] for p in random_points: result = p.scalar_mul(CURVES[curve_id.value].n + 1) assert result == p @pytest.mark.parametrize("curve_id", curve_ids) def test_is_in_subgroup(curve_id): for _ in range(10): p = G1Point.gen_random_point(curve_id) assert p.is_in_prime_order_subgroup() assert p.is_in_prime_order_subgroup_generic() if CURVES[curve_id.value].h != 1: p = G1Point.gen_random_point_not_in_subgroup(curve_id) assert not p.is_in_prime_order_subgroup() assert not p.is_in_prime_order_subgroup_generic() ================================================ FILE: tests/hydra/test_g2_point.py ================================================ import random import pytest from garaga.curves import CURVES, CurveID from garaga.points import G2Point # List of curve IDs to test curve_ids = [CurveID.BN254, CurveID.BLS12_381] def get_g2_generator_point(curve_id): return G2Point(CURVES[curve_id.value].G2x, CURVES[curve_id.value].G2y, curve_id) @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_equality(curve_id): p1 = get_g2_generator_point(curve_id) p2 = get_g2_generator_point(curve_id) p3 = p1.add(p2) assert p1 == p2 assert p1 != p3 @pytest.mark.parametrize("curve_id", curve_ids) def test_ng2(curve_id): p = get_g2_generator_point(curve_id) nG = G2Point.get_nG(curve_id, 1) assert nG == p @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_infinity(curve_id): inf = G2Point.infinity(curve_id) assert inf.is_infinity() @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_on_curve(curve_id): p = get_g2_generator_point(curve_id) assert p.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_not_on_curve(curve_id): with pytest.raises(ValueError): _ = G2Point((1, 2), (3, 4), curve_id) @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_scalar_mul(curve_id): p = get_g2_generator_point(curve_id) result = p.scalar_mul(2) assert result.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_addition(curve_id): p1 = get_g2_generator_point(curve_id) p2 = get_g2_generator_point(curve_id) result = p1.add(p2) assert result.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_negation(curve_id): p = get_g2_generator_point(curve_id) neg_p = -p assert neg_p.is_on_curve() assert p.add(neg_p).is_infinity() @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_msm(curve_id): p1 = get_g2_generator_point(curve_id) p2 = get_g2_generator_point(curve_id) points = [p1, p2] scalars = [2, 3] result = G2Point.msm(points, scalars) assert result.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_gen_random_point(curve_id): p = G2Point.gen_random_point(curve_id) assert p.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_scalar_mul_zero(curve_id): p = get_g2_generator_point(curve_id) result = p.scalar_mul(0) assert result.is_infinity() @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_scalar_mul_one(curve_id): p = get_g2_generator_point(curve_id) result = p.scalar_mul(1) assert result == p @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_scalar_mul_negative(curve_id): p = get_g2_generator_point(curve_id) result = p.scalar_mul(-1) assert result == -p @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_scalar_mul_large(curve_id): p = get_g2_generator_point(curve_id) large_scalar = 10**18 result = p.scalar_mul(large_scalar) assert result.is_on_curve() @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_scalar_mul_invalid(curve_id): p = get_g2_generator_point(curve_id) with pytest.raises(TypeError): p.scalar_mul("invalid_scalar") @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_scalar_mul_order(curve_id): p = get_g2_generator_point(curve_id) result = p.scalar_mul(CURVES[curve_id.value].n) assert result.is_infinity() @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_scalar_mul_larger_than_order(curve_id): p = get_g2_generator_point(curve_id) result = p.scalar_mul(CURVES[curve_id.value].n + 1) assert result == p @pytest.mark.parametrize("curve_id", curve_ids) def test_g2point_scalar_mul_larger_than_order_random_points(curve_id): # Generate 10 random points on the curve random_points = [G2Point.gen_random_point(curve_id) for _ in range(10)] # Shuffle the points random.shuffle(random_points) for p in random_points: result = p.scalar_mul(CURVES[curve_id.value].n + 1) assert result == p @pytest.mark.parametrize("curve_id", curve_ids) def test_is_in_subgroup(curve_id): for _ in range(10): p = G2Point.gen_random_point(curve_id) assert p.is_in_prime_order_subgroup() assert p.is_in_prime_order_subgroup_generic() if CURVES[curve_id.value].h != 1: p = G2Point.gen_random_point_not_in_subgroup(curve_id) assert not p.is_in_prime_order_subgroup() assert not p.is_in_prime_order_subgroup_generic() ================================================ FILE: tests/hydra/test_isogeny.py ================================================ from garaga.modulo_circuit import WriteOps from hydra.garaga.precompiled_circuits.isogeny import IsogenyG1, IsogenyG2 def test_isogeny_g2(): # Initialize circuit circuit = IsogenyG2("isogeny", 1) # BLS12-381 # Input coordinates field_x = circuit.write_elements( [ circuit.field( 169519152402139697623491793754012113789032894758910773796231348501731795490199910990796174115277871812568749679080 ), circuit.field( 1728095456082680609005278389175634228411286941580472237217092659287996601824281397719739792814994738024437208024916 ), ], WriteOps.INPUT, ) field_y = circuit.write_elements( [ circuit.field( 921899175962300040840420456901482071750200770271137541308616448315528969776376924836021205171957295791079922974103 ), circuit.field( 3684633599184560222490700115577520911020962810206788383522966831012065752604210815152740734710545831758791724608234 ), ], WriteOps.INPUT, ) # Run isogeny calculation x_affine, y_affine = circuit.run_isogeny(field_x, field_y) # Expected values for x_affine coordinates expected_x = [ 3789617024712504402204306620295003375951143917889162928515122476381982967144814366712031831841518399614182231387665, 1467567314213963969852279817989131104935039564231603908576814773321528757289376676761397368853965316423532584391899, ] # Expected values for y_affine coordinates expected_y = [ 1292375129422168617658520396283100687686347104559592203462491249161639006037671760603453326853098986903549775136448, 306655960768766438834866368706782505873384691666290681181893693450298456233972904889955517117016529975705729523733, ] # Assert x coordinates match assert len(x_affine) == 2, "Expected x_affine to have 2 coordinates" assert ( x_affine[0].emulated_felt.value == expected_x[0] ), "First x coordinate doesn't match" assert ( x_affine[1].emulated_felt.value == expected_x[1] ), "Second x coordinate doesn't match" # Assert y coordinates match assert len(y_affine) == 2, "Expected y_affine to have 2 coordinates" assert ( y_affine[0].emulated_felt.value == expected_y[0] ), "First y coordinate doesn't match" assert ( y_affine[1].emulated_felt.value == expected_y[1] ), "Second y coordinate doesn't match" def test_isogeny_g1(): circuit = IsogenyG1("isogeny", 1) # BLS12-381 field_x = circuit.write_element( circuit.field( 1412853964218444964438936699552956047210482383152224645596624291427056376487356261681298103080878386132407858666637 ) ) field_y = circuit.write_element( circuit.field( 752734926215712395741522221355891264404138695398702662135908094550118515106801651502315795564392519475687558113863 ) ) x_affine, y_affine = circuit.run_isogeny(field_x, field_y) assert ( x_affine.emulated_felt.value == 446982818448762443925483450503077743305378332574765060957007466897598303326699997098749910515002846743254056890542 ) assert ( y_affine.emulated_felt.value == 3454829136341282129428339331123792952068649713505379945415096993679155752159553081385690994340465600247693047311369 ) ================================================ FILE: tests/hydra/test_poseidon_hash.py ================================================ import time import pytest from garaga import garaga_rs from garaga.precompiled_circuits.poseidon_bn254 import poseidon_hash def test_poseidon_hash_bn254(): # Test with valid inputs x = 1 y = 2 expected = 0x115CC0F5E7D690413DF64C6B9662E9CF2A3617F2743245519E19607A4417189A tr0 = time.time() for _ in range(20): result = garaga_rs.poseidon_hash_bn254(x, y) tr1 = time.time() print(f"Garaga RS time: {tr1 - tr0} seconds") assert result == expected tp0 = time.time() for _ in range(20): result = poseidon_hash(x, y) tp1 = time.time() print(f"Garaga Python time: {tp1 - tp0} seconds") assert result.value == expected # Test different inputs give different results result2 = garaga_rs.poseidon_hash_bn254(2, 1) assert result != result2 # Test with large numbers x_large = 2**255 - 1 y_large = 2**255 - 2 result = garaga_rs.poseidon_hash_bn254(x_large, y_large) assert isinstance(result, int) assert len(hex(result)[2:]) <= 64 # Result should be within field size # Test invalid inputs with pytest.raises((OverflowError, ValueError)): garaga_rs.poseidon_hash_bn254(-1, 1) # Negative numbers not allowed ================================================ FILE: tests/hydra/test_rsa_rns.py ================================================ import math from garaga.rsa_rns import ( BASE, CHANNEL_MODULI, CHUNK_LIMBS, CRT_EXACTNESS_BOUND, PKCS1_SHA256_DIGEST_INFO_PREFIX, RSA_PUBLIC_EXPONENT, RSA_REDUCTION_COUNT, RNSContext, generate_rsa2048_sha256_witness, generate_rsa2048_witness, is_valid_rsa2048_witness, modular_exponentiation_with_proof, pkcs1_v1_5_encode_sha256, ) from garaga.starknet.tests_and_calldata_generators.signatures import RSA2048Signature def eval_chunks_mod(chunks: tuple[int, ...], step: int, modulus: int) -> int: """Horner evaluation of chunk polynomial at step, reduced modulo modulus.""" acc = 0 for chunk in reversed(chunks): acc = (acc * step + chunk) % modulus return acc def test_rsa_channel_moduli_are_pairwise_coprime(): for i, lhs in enumerate(CHANNEL_MODULI): assert lhs > 1 for j, rhs in enumerate(CHANNEL_MODULI[i + 1 :], start=i + 1): assert ( math.gcd(lhs, rhs) == 1 ), f"channel moduli {i} and {j} are not coprime" def test_rsa_chunk_steps_match_chunk_radix_mod_channel_moduli(): expected_steps = [pow(BASE, CHUNK_LIMBS, p) for p in CHANNEL_MODULI] assert expected_steps == [ 5880, 9624, 24728, 32024, 38504, 45624, 48200, 55592, 57224, 64488, 71448, ] def test_rsa_chunk_horner_evaluation_matches_residues(): ctx = RNSContext(CHANNEL_MODULI) steps = [pow(BASE, CHUNK_LIMBS, p) for p in CHANNEL_MODULI] for seed in range(3): sample = RSA2048Signature.sample(seed=seed) encoded_values = [ sample.modulus, sample.signature, sample.expected_message, sample.reductions[0].quotient, sample.reductions[0].remainder, sample.reductions[-1].quotient, sample.reductions[-1].remainder, ] for encoded_value in encoded_values: horner_residues = tuple( eval_chunks_mod(encoded_value.chunks, step, modulus) for step, modulus in zip(steps, CHANNEL_MODULI) ) assert horner_residues == ctx.residues_from_limbs(encoded_value.limbs) def test_rsa_context_exactness_bound(): ctx = RNSContext(CHANNEL_MODULI) assert ctx.M > CRT_EXACTNESS_BOUND def test_rsa_sample_is_valid(): sample = RSA2048Signature.sample(seed=0) assert sample.is_valid() assert len(sample.reductions) == RSA_REDUCTION_COUNT assert len(sample.serialize_public_key()) == 24 assert len(sample.serialize_signature_with_hints()) == 864 assert len(sample.serialize()) == 888 def test_rsa_verification_path_uses_expected_reductions(): ctx = RNSContext(CHANNEL_MODULI) bundle = generate_rsa2048_witness(seed=0) verified_message, reduction_count = modular_exponentiation_with_proof( ctx, bundle.signature.value, RSA_PUBLIC_EXPONENT, bundle.modulus.value, ) assert reduction_count == RSA_REDUCTION_COUNT assert verified_message == bundle.expected_message.value def test_rsa_tampered_residue_is_invalid(): assert not RSA2048Signature.tampered_residue_sample(seed=0).is_valid() def test_rsa_tampered_limb_is_invalid(): assert not RSA2048Signature.tampered_limb_sample(seed=0).is_valid() def test_rsa_tampered_expected_message_is_invalid(): assert not RSA2048Signature.tampered_expected_message_sample(seed=0).is_valid() def test_pkcs1_v1_5_encode_sha256_structure(): message_hash = bytes(range(32)) encoded = pkcs1_v1_5_encode_sha256(message_hash) encoded_bytes = encoded.to_bytes(256, byteorder="big") # 0x00 || 0x01 || PS(0xFF × 202) || 0x00 || DigestInfo(19) || Hash(32) = 256 assert encoded_bytes[0] == 0x00 assert encoded_bytes[1] == 0x01 assert encoded_bytes[2:204] == b"\xff" * 202 assert encoded_bytes[204] == 0x00 assert encoded_bytes[205:224] == PKCS1_SHA256_DIGEST_INFO_PREFIX assert encoded_bytes[224:256] == message_hash def test_rsa2048_sha256_witness_is_valid(): bundle = generate_rsa2048_sha256_witness(b"hello garaga", seed=0) assert is_valid_rsa2048_witness(bundle) assert len(bundle.reductions) == RSA_REDUCTION_COUNT # Verify the expected message is a valid PKCS#1 v1.5 encoding import hashlib message_hash = hashlib.sha256(b"hello garaga").digest() expected = pkcs1_v1_5_encode_sha256(message_hash) assert bundle.expected_message.value == expected def test_rsa2048_sha256_byte_array_serialization(): """Test that ByteArray serialization matches Cairo's format.""" from garaga.starknet.tests_and_calldata_generators.signatures import ( _serialize_byte_array, ) # Empty cd = _serialize_byte_array(b"") assert cd == [0, 0, 0] # Short message (< 31 bytes) cd = _serialize_byte_array(b"hello") assert cd[0] == 0 # 0 full words assert cd[1] == int.from_bytes(b"hello", "big") # pending word assert cd[2] == 5 # pending len # Exactly 31 bytes data = bytes(range(31)) cd = _serialize_byte_array(data) assert cd[0] == 1 # 1 full word assert cd[1] == int.from_bytes(data[:31], "big") assert cd[2] == 0 # pending = 0 assert cd[3] == 0 # pending len = 0 # 65 bytes = 2 full words + 3 pending data = bytes([0xCD] * 65) cd = _serialize_byte_array(data) assert cd[0] == 2 assert len(cd) == 5 assert cd[4] == 3 # pending len ================================================ FILE: tools/addchain/bls12_381_e.acc ================================================ _10 = 2*1 _11 = 1 + _10 _101 = _10 + _11 _111 = _10 + _101 _1001 = _10 + _111 _1011 = _10 + _1001 _1101 = _10 + _1011 _1111 = _10 + _1101 _10001 = _10 + _1111 _10011 = _10 + _10001 _10101 = _10 + _10011 _10111 = _10 + _10101 _11001 = _10 + _10111 _11011 = _10 + _11001 _11101 = _10 + _11011 _11111 = _10 + _11101 _100001 = _10 + _11111 _100011 = _10 + _100001 _100101 = _10 + _100011 _100111 = _10 + _100101 _101001 = _10 + _100111 _101011 = _10 + _101001 _101101 = _10 + _101011 _101111 = _10 + _101101 _110001 = _10 + _101111 _110011 = _10 + _110001 _110101 = _10 + _110011 _110111 = _10 + _110101 _111001 = _10 + _110111 _111011 = _10 + _111001 _111101 = _10 + _111011 _111111 = _10 + _111101 _1000001 = _10 + _111111 _1000011 = _10 + _1000001 _1000101 = _10 + _1000011 _1000111 = _10 + _1000101 _1001001 = _10 + _1000111 _1001011 = _10 + _1001001 _1001101 = _10 + _1001011 _1001111 = _10 + _1001101 _1010001 = _10 + _1001111 _1010011 = _10 + _1010001 _1010101 = _10 + _1010011 _1010111 = _10 + _1010101 _1011001 = _10 + _1010111 _1011011 = _10 + _1011001 _1011101 = _10 + _1011011 _1011111 = _10 + _1011101 _1100001 = _10 + _1011111 _1100011 = _10 + _1100001 _1100101 = _10 + _1100011 _1100111 = _10 + _1100101 _1101001 = _10 + _1100111 _1101011 = _10 + _1101001 _1101101 = _10 + _1101011 _1101111 = _10 + _1101101 _1110001 = _10 + _1101111 _1110011 = _10 + _1110001 _1110101 = _10 + _1110011 _1110111 = _10 + _1110101 _1111001 = _10 + _1110111 _1111011 = _10 + _1111001 _1111101 = _10 + _1111011 _1111111 = _10 + _1111101 _11111110 = 2*_1111111 _11111111 = 1 + _11111110 x9 = 2*_11111111 + 1 i69 = _1110001 + x9 x10 = 2*x9 + 1 i72 = 2*i69 x11 = 2*x10 + 1 i95 = ((i72 << 2 + _101001) << 8 + _100011) << 9 i118 = ((_1100101 + i95) << 7 + _1100101) << 13 + _1101011 i140 = ((i118 << 7 + _1010111) << 4 + _101) << 9 i163 = ((_101 + i140) << 13 + _1110111) << 7 + _10001 i188 = ((i163 << 9 + _100001) << 7 + _100001) << 7 i214 = ((_101011 + i188) << 7 + _11) << 16 + _111001 i242 = ((i214 << 8 + _101001) << 8 + _111011) << 10 i258 = ((_1010011 + i242) << 7 + _1001001) << 6 + _101001 i286 = ((i258 << 9 + _1010111) << 7 + _1101) << 10 i306 = ((_1100011 + i286) << 7 + _101011) << 10 + _1110111 i331 = ((i306 << 7 + _1110001) << 7 + _11101) << 9 i349 = ((_1000111 + i331) << 8 + _1011101) << 7 + _1101 i380 = ((i349 << 9 + _110101) << 10 + _1111001) << 10 i400 = ((_110101 + i380) << 10 + _1101111) << 7 + _1101101 i428 = ((i400 << 8 + _1111) << 11 + _1011011) << 7 i449 = ((_1110111 + i428) << 8 + _101011) << 10 + _1000011 i473 = ((i449 << 7 + _1010111) << 6 + _100101) << 9 i489 = ((_1010001 + i473) << 5 + _1011) << 8 + _1001 i518 = ((i489 << 12 + _1001011) << 8 + _1010001) << 7 i537 = ((_1101111 + i518) << 8 + _1010001) << 8 + _1110111 i562 = ((i537 << 8 + _1001001) << 5 + _11101) << 10 i578 = ((_101111 + i562) << 8 + _1001101) << 5 + _10001 i609 = ((i578 << 9 + _1011101) << 13 + _110011) << 7 i627 = ((_110001 + i609) << 6 + _11011) << 9 + _1100111 i651 = ((i627 << 7 + _1101) << 10 + _1000111) << 5 i672 = ((_10001 + i651) << 10 + _1000001) << 8 + _1100011 i699 = ((i672 << 10 + _1111011) << 8 + _1001101) << 7 i715 = ((_1110101 + i699) << 9 + _1000011) << 4 + _1101 i742 = ((i715 << 14 + _1010101) << 6 + _111101) << 5 i764 = ((_111 + i742) << 10 + _110111) << 9 + _1101001 i789 = ((i764 << 7 + _1100101) << 3 + _11) << 13 i807 = ((_1010011 + i789) << 4 + _11) << 11 + _11001 i833 = ((i807 << 9 + _100111) << 8 + _1111011) << 7 i855 = ((_1100111 + i833) << 2 + _11) << 17 + x11 i882 = ((i855 << 7 + _101111) << 10 + _1101011) << 8 i902 = ((_1001111 + i882) << 7 + _111001) << 10 + _11111111 i928 = ((i902 << 8 + _100111) << 8 + _110011) << 8 i946 = ((_10111 + i928) << 6 + _1101) << 9 + _11011 i971 = ((i946 << 9 + _110101) << 6 + _11101) << 8 i992 = ((_100011 + i971) << 10 + _110001) << 8 + _10101 i1018 = ((i992 << 10 + _1010001) << 7 + _111111) << 7 i1039 = ((_101101 + i1018) << 9 + _11011) << 9 + _101111 i1063 = ((i1039 << 8 + _1001001) << 6 + _111001) << 8 i1081 = ((_110111 + i1063) << 8 + _1010101) << 7 + _1111001 i1101 = ((i1081 << 6 + _111011) << 8 + _1100011) << 4 i1123 = ((_1101 + i1101) << 13 + _1111011) << 6 + _110001 i1147 = ((i1123 << 8 + _1101101) << 7 + _1000001) << 7 i1163 = ((_1100001 + i1147) << 6 + _111011) << 7 + _100111 i1193 = ((i1163 << 8 + _10011) << 11 + _1111111) << 9 i1210 = ((_1001101 + i1193) << 6 + _101011) << 8 + _1011011 i1233 = ((i1210 << 7 + _1110111) << 7 + _1001011) << 7 i1254 = ((_110101 + i1233) << 8 + _1011111) << 10 + _1101111 i1283 = ((i1254 << 7 + _101101) << 5 + _111) << 15 i1297 = ((_1000001 + i1283) << 8 + _1110001) << 3 + 1 i1331 = ((i1297 << 15 + _110001) << 8 + _1100001) << 9 i1351 = ((_1111011 + i1331) << 7 + _10011) << 10 + _1011101 i1372 = ((i1351 << 8 + _1110111) << 5 + _10111) << 6 i1395 = ((_1011 + i1372) << 6 + _11) << 14 + x11 i1415 = ((2*i1395 + 1) << 8 + _1011001) << 9 i1437 = ((_1110101 + i1415) << 9 + _1111011) << 10 + _1101011 i1459 = ((i1437 << 8 + _100101) << 3 + 1) << 9 i1480 = ((_11111111 + i1459) << 11 + _101011) << 7 + _110011 i1503 = ((i1480 << 7 + _111111) << 7 + _101011) << 7 i1529 = ((_100101 + i1503) << 13 + _1000001) << 10 + _1001101 i1553 = ((i1529 << 8 + _1100101) << 8 + _1010101) << 6 i1573 = ((_100101 + i1553) << 9 + _1010001) << 8 + _1011101 i1599 = ((i1573 << 6 + _111011) << 8 + _1011111) << 10 i1617 = ((_1011101 + i1599) << 7 + _1001111) << 8 + _1111001 i1642 = ((i1617 << 8 + _1100001) << 7 + _1010111) << 8 i1662 = ((_1001001 + i1642) << 7 + _1000111) << 10 + _1001001 i1695 = ((i1662 << 12 + _1011101) << 9 + _1110101) << 10 i1713 = ((_111101 + i1695) << 8 + _111011) << 7 + _111101 i1735 = ((i1713 << 6 + _11011) << 9 + _1101011) << 5 i1758 = ((_11011 + i1735) << 10 + _1001011) << 10 + _1001001 i1782 = ((i1758 << 4 + _1111) << 11 + _1000011) << 7 i1803 = ((_10101 + i1782) << 9 + _111001) << 9 + _1000011 i1829 = ((i1803 << 5 + _10011) << 10 + _1011001) << 9 i1846 = ((_1110011 + i1829) << 8 + _1100001) << 6 + _110011 i1875 = ((i1846 << 9 + _110001) << 7 + _101101) << 11 i1898 = ((_1100111 + i1875) << 8 + _1011011) << 12 + _1101101 i1927 = ((i1898 << 11 + _1000011) << 7 + _1110111) << 9 i1945 = ((_1101001 + i1927) << 4 + _1011) << 11 + _1100011 i1967 = ((i1945 << 4 + _1001) << 11 + _1001111) << 5 i1986 = ((_10111 + i1967) << 6 + _1001) << 10 + _1001011 i2009 = ((i1986 << 8 + _1011011) << 4 + _1001) << 9 i2029 = ((_100101 + i2009) << 10 + _11111111) << 7 + _101011 i2057 = ((i2029 << 10 + _1111) << 10 + _1011011) << 6 i2075 = ((_111001 + i2057) << 9 + _1101001) << 6 + _101111 i2100 = ((i2075 << 7 + _10011) << 9 + _1110011) << 7 i2125 = ((_1110011 + i2100) << 10 + _101101) << 12 + _1110001 i2153 = ((i2125 << 6 + _11) << 12 + _1101101) << 8 i2171 = ((_110011 + i2153) << 6 + _10111) << 9 + _1011011 i2199 = ((i2171 << 10 + _1000111) << 7 + _1111011) << 9 i2220 = ((_1111111 + i2199) << 11 + _1110001) << 7 + _1101111 i2244 = ((i2220 << 9 + _1001101) << 7 + _1000111) << 6 i2264 = ((_1011 + i2244) << 11 + _1010001) << 6 + _11001 i2289 = ((i2264 << 10 + _1101001) << 8 + _1010111) << 5 i2309 = ((_10111 + i2289) << 6 + _101) << 11 + _1010011 i2333 = ((i2309 << 6 + _110101) << 5 + _1101) << 11 i2354 = ((_110101 + i2333) << 8 + _11001) << 10 + _1111011 i2378 = ((i2354 << 8 + _1110111) << 6 + _1011) << 8 i2398 = ((_11001 + i2378) << 9 + _11111111) << 8 + _1011111 i2427 = ((i2398 << 6 + _1111) << 13 + _1100001) << 8 i2444 = ((_1100001 + i2427) << 5 + _11001) << 9 + _1101001 i2470 = ((i2444 << 9 + _1010111) << 3 + _111) << 12 i2487 = ((_1000011 + i2470) << 6 + _100011) << 8 + _1011111 i2519 = ((i2487 << 10 + _111011) << 10 + _101011) << 10 i2538 = ((_11111111 + i2519) << 9 + _111101) << 7 + _11111 i2566 = ((i2538 << 7 + _11001) << 9 + _10101) << 10 i2586 = ((_1111001 + i2566) << 9 + _1010101) << 8 + _10101 i2609 = ((i2586 << 9 + _1110001) << 5 + _1001) << 7 i2631 = ((_1011 + i2609) << 12 + _1011101) << 7 + _1000011 i2658 = ((i2631 << 9 + _1011001) << 9 + _1100101) << 7 i2679 = ((_1010111 + i2658) << 10 + _11111) << 8 + _11111 i2703 = ((i2679 << 7 + _10111) << 10 + _1110011) << 5 i2725 = ((_10111 + i2703) << 9 + _100101) << 10 + _1011101 i2749 = ((i2725 << 4 + _1111) << 11 + _1010011) << 7 i2771 = ((_1000001 + i2749) << 9 + _1111001) << 10 + _1100101 i2799 = ((2*i2771 + 1) << 17 + _1000001) << 8 i2815 = ((_1011101 + i2799) << 7 + _1010101) << 6 + _111011 i2842 = ((i2815 << 8 + _1100011) << 5 + _11011) << 12 i2861 = ((_1101011 + i2842) << 8 + _1101111) << 8 + _1000111 i2882 = ((i2861 << 2 + 1) << 10 + x9) << 7 i2900 = ((_101101 + i2882) << 3 + _11) << 12 + _1110111 i2929 = ((i2900 << 6 + 1) << 12 + _100111) << 9 i2949 = ((_1010001 + i2929) << 6 + _110011) << 11 + _1100011 i2971 = ((i2949 << 6 + _101111) << 11 + _1110011) << 3 i2990 = ((_111 + i2971) << 11 + _1010111) << 5 + _11101 i3017 = ((i2990 << 9 + _1110011) << 5 + _1101) << 11 i3037 = ((x9 + i3017) << 6 + _10011) << 11 + _1101011 i3061 = ((i3037 << 7 + _1110111) << 6 + _10011) << 9 i3081 = ((_1101111 + i3061) << 10 + _1100011) << 7 + _1000111 i3099 = 2*((i3081 << 3 + _111) << 12 + _1111001) i3125 = ((1 + i3099) << 15 + _111101) << 8 + _1101111 i3152 = ((i3125 << 5 + _1101) << 10 + _1011001) << 10 i3172 = ((_1101011 + i3152) << 6 + _110111) << 11 + _10011 i3200 = ((i3172 << 12 + _1111011) << 8 + _1100001) << 6 i3220 = ((_10101 + i3200) << 9 + _1011011) << 8 + _1010111 i3243 = ((i3220 << 5 + _11101) << 8 + _100001) << 8 i3262 = ((_1101101 + i3243) << 8 + _1001101) << 8 + _100101 i3286 = 2*((i3262 << 12 + _1111101) << 9 + _1000011) i3309 = ((1 + i3286) << 11 + x10) << 9 + _1110111 i3330 = ((i3309 << 7 + _101011) << 8 + _1110101) << 4 i3350 = ((_1111 + i3330) << 10 + _1000101) << 7 + _111101 i3373 = ((i3350 << 9 + _1101101) << 6 + _110101) << 6 i3395 = ((_11101 + i3373) << 8 + _101) << 11 + _1001101 i3420 = ((i3395 << 9 + _1000111) << 2 + _11) << 12 i3435 = ((_1110111 + i3420) << 6 + _111011) << 6 + _10101 i3462 = ((i3435 << 9 + _100001) << 7 + _101101) << 9 i3480 = ((_1101001 + i3462) << 7 + _101001) << 8 + _101101 i3505 = ((i3480 << 8 + _1000101) << 4 + _1001) << 11 i3522 = ((_1111001 + i3505) << 7 + _110001) << 7 + _100011 i3551 = ((i3522 << 12 + _1011001) << 4 + _1101) << 11 i3568 = ((_1100011 + i3551) << 5 + _11111) << 9 + _111001 i3592 = ((i3568 << 8 + _1010011) << 7 + _1100011) << 7 i3609 = ((_101101 + i3592) << 8 + _1101111) << 6 + _100111 i3637 = ((i3609 << 8 + _1000101) << 9 + _100001) << 9 i3657 = ((_1010111 + i3637) << 7 + _1101101) << 10 + _1100001 i3682 = ((i3657 << 10 + _100101) << 7 + _101111) << 6 i3704 = ((_11111 + i3682) << 9 + _101101) << 10 + _1101001 i3728 = ((i3704 << 7 + _101101) << 8 + _1110111) << 7 i3746 = ((_100011 + i3728) << 8 + _1000111) << 7 + _110101 i3769 = ((i3746 << 8 + _1110101) << 7 + _1010001) << 6 i3785 = ((_101001 + i3769) << 6 + _10001) << 7 + _10111 i3811 = ((i3785 << 9 + _1110011) << 8 + _110001) << 7 i3831 = ((_100101 + i3811) << 8 + _1010011) << 9 + _1100111 i3857 = ((i3831 << 7 + _1000011) << 10 + _1111011) << 7 i3879 = ((_101 + i3857) << 12 + _1111001) << 7 + _1101011 i3902 = ((i3879 << 6 + _110011) << 9 + _10101) << 6 i3928 = ((_101 + i3902) << 13 + _10111) << 10 + _1011101 i3953 = ((i3928 << 5 + _1001) << 12 + _100001) << 6 i3977 = ((_1001 + i3953) << 9 + _11111) << 12 + _1111101 i4010 = ((i3977 << 10 + _1011101) << 12 + _1111101) << 9 i4029 = ((_1001001 + i4010) << 7 + _101011) << 9 + _100111 i4058 = ((i4029 << 9 + _11011) << 9 + _1100011) << 9 i4075 = ((_1010101 + i4058) << 6 + _110001) << 8 + _1101101 i4098 = ((i4075 << 7 + _110101) << 8 + _1000111) << 6 i4120 = ((_101011 + i4098) << 10 + _11011) << 9 + _101011 i4145 = ((i4120 << 5 + _101) << 8 + _111) << 10 i4169 = ((_11101 + i4145) << 10 + _1110011) << 11 + _101001 i4194 = ((i4169 << 7 + _111011) << 14 + _101111) << 2 i4218 = ((1 + i4194) << 14 + _1011111) << 7 + _1101101 i4243 = ((i4218 << 7 + _1110101) << 4 + _101) << 12 i4262 = ((_110001 + i4243) << 5 + _1101) << 11 + _1011001 i4286 = ((i4262 << 7 + _1011011) << 6 + _110011) << 9 i4311 = ((_110101 + i4286) << 15 + _1100001) << 7 + _101001 i4336 = ((i4311 << 9 + _1001011) << 7 + _110011) << 7 i4354 = ((_10101 + i4336) << 6 + _1101) << 9 + _101001 i4382 = ((i4354 << 9 + _1010011) << 9 + _1111111) << 8 i4400 = ((_1010101 + i4382) << 5 + _10101) << 10 + _1000111 i4424 = ((i4400 << 8 + _110101) << 4 + _101) << 10 i4444 = ((_111001 + i4424) << 8 + _11001) << 9 + _1011101 i4471 = ((i4444 << 7 + _1101101) << 11 + _1110001) << 7 i4491 = ((_1100001 + i4471) << 2 + _11) << 15 + _1010001 i4515 = ((i4491 << 5 + _1101) << 8 + _10011) << 9 i4532 = ((_1010011 + i4515) << 7 + _1110101) << 7 + _1010111 i4561 = ((i4532 << 8 + _1010001) << 8 + _101101) << 11 i4580 = ((_1100101 + i4561) << 7 + _101111) << 9 + _111011 i4605 = ((i4580 << 6 + _11111) << 6 + _1011) << 11 i4619 = ((_1000001 + i4605) << 7 + _1101001) << 4 + _1011 i4646 = ((i4619 << 10 + _1111101) << 3 + 1) << 12 i4665 = ((_111001 + i4646) << 9 + _1000101) << 7 + _1111011 i4688 = ((i4665 << 7 + _1110011) << 6 + _100011) << 8 i4704 = ((_1001001 + i4688) << 8 + _1011101) << 5 + _101 i4731 = ((i4704 << 11 + _1111011) << 5 + _10101) << 9 i4747 = ((_1000011 + i4731) << 5 + _10101) << 8 + _100101 i4778 = ((i4747 << 6 + _10011) << 8 + _110111) << 15 i4797 = ((_1011011 + i4778) << 4 + _111) << 12 + x9 i4822 = ((i4797 << 8 + _1111101) << 8 + _1010111) << 7 return (_1011011 + i4822) << 10 + _100011 ================================================ FILE: tools/addchain/bls12_381_h3_s.acc ================================================ _10 = 2*1 _11 = 1 + _10 _101 = _10 + _11 _111 = _10 + _101 _1001 = _10 + _111 _1011 = _10 + _1001 _1101 = _10 + _1011 _1111 = _10 + _1101 _10001 = _10 + _1111 _10011 = _10 + _10001 _10101 = _10 + _10011 _10111 = _10 + _10101 _11001 = _10 + _10111 _11011 = _10 + _11001 _11101 = _10 + _11011 _11111 = _10 + _11101 _100001 = _10 + _11111 _100011 = _10 + _100001 _100101 = _10 + _100011 _100110 = 1 + _100101 _100111 = 1 + _100110 _101001 = _10 + _100111 _101011 = _10 + _101001 _101101 = _10 + _101011 _110001 = _1011 + _100110 _110011 = _10 + _110001 _110101 = _10 + _110011 _110111 = _10 + _110101 _111001 = _10 + _110111 _111011 = _10 + _111001 _111101 = _10 + _111011 _111111 = _10 + _111101 _1000001 = _10 + _111111 _1000011 = _10 + _1000001 _1000101 = _10 + _1000011 _1000111 = _10 + _1000101 _1001001 = _10 + _1000111 _1001011 = _10 + _1001001 _1001101 = _10 + _1001011 _1001111 = _10 + _1001101 _1010001 = _10 + _1001111 _1010011 = _10 + _1010001 _1010101 = _10 + _1010011 _1010111 = _10 + _1010101 _1011001 = _10 + _1010111 _1011011 = _10 + _1011001 _1011101 = _10 + _1011011 _1011111 = _10 + _1011101 _1100001 = _10 + _1011111 _1100011 = _10 + _1100001 _1100101 = _10 + _1100011 _1100111 = _10 + _1100101 _1101001 = _10 + _1100111 _1101011 = _10 + _1101001 _1101101 = _10 + _1101011 _1101111 = _10 + _1101101 _1110001 = _10 + _1101111 _1110011 = _10 + _1110001 _1110101 = _10 + _1110011 _1110111 = _10 + _1110101 _1111001 = _10 + _1110111 _1111011 = _10 + _1111001 _1111101 = _10 + _1111011 _1111111 = _10 + _1111101 _10000001 = _10 + _1111111 _10000011 = _10 + _10000001 _10000101 = _10 + _10000011 _10000111 = _10 + _10000101 _10001001 = _10 + _10000111 _10001011 = _10 + _10001001 _10001101 = _10 + _10001011 _10001111 = _10 + _10001101 _10010001 = _10 + _10001111 _10010011 = _10 + _10010001 _10010101 = _10 + _10010011 _10010111 = _10 + _10010101 _10011001 = _10 + _10010111 _10011011 = _10 + _10011001 _10011101 = _10 + _10011011 _10011111 = _10 + _10011101 _10100001 = _10 + _10011111 _10100011 = _10 + _10100001 _10100101 = _10 + _10100011 _10100111 = _10 + _10100101 _10101001 = _10 + _10100111 _10101011 = _10 + _10101001 _10101101 = _10 + _10101011 _10101111 = _10 + _10101101 _10110001 = _10 + _10101111 _10110011 = _10 + _10110001 _10110101 = _10 + _10110011 _10110111 = _10 + _10110101 _10111001 = _10 + _10110111 _10111011 = _10 + _10111001 _10111101 = _10 + _10111011 _10111111 = _10 + _10111101 _11000001 = _10 + _10111111 _11000011 = _10 + _11000001 _11000101 = _10 + _11000011 _11000111 = _10 + _11000101 _11001001 = _10 + _11000111 _11001011 = _10 + _11001001 _11001101 = _10 + _11001011 _11001111 = _10 + _11001101 _11010001 = _10 + _11001111 _11010011 = _10 + _11010001 _11010101 = _10 + _11010011 _11010111 = _10 + _11010101 _11011001 = _10 + _11010111 _11011011 = _10 + _11011001 _11011101 = _10 + _11011011 _11011111 = _10 + _11011101 _11100001 = _10 + _11011111 _11100011 = _10 + _11100001 _11100101 = _10 + _11100011 _11100111 = _10 + _11100101 _11101001 = _10 + _11100111 _11101011 = _10 + _11101001 _11101101 = _10 + _11101011 _11101111 = _10 + _11101101 _11110101 = _100110 + _11001111 _11110111 = _10 + _11110101 _11111001 = _10 + _11110111 _11111101 = _100110 + _11010111 _11111111 = _10 + _11111101 i145 = ((_110001 + _11111111) << 7 + _11001101) << 10 + _10100111 i172 = ((i145 << 9 + _1001011) << 8 + _1011001) << 8 i199 = ((_100001 + i172) << 10 + _10111) << 14 + _1111101 i228 = ((i199 << 11 + _1000111) << 9 + _11111101) << 7 i248 = ((_1101011 + i228) << 10 + _11011001) << 7 + _1011111 i274 = ((i248 << 8 + _1101011) << 9 + _1001111) << 7 i295 = ((_101001 + i274) << 10 + _10100011) << 8 + _11101011 i321 = ((i295 << 9 + _11011011) << 6 + _111111) << 9 i342 = ((_100111 + i321) << 9 + _1011001) << 9 + _11000101 i368 = ((i342 << 7 + _1101111) << 9 + _10010011) << 8 i388 = ((_10001001 + i368) << 9 + _11101001) << 8 + _1010011 i417 = ((i388 << 3 + _11) << 15 + _1110101) << 9 i437 = ((_10110111 + i417) << 5 + _10001) << 12 + _10010111 i463 = ((i437 << 9 + _10101001) << 9 + _10100111) << 6 i486 = ((_10101 + i463) << 9 + _10101) << 11 + _10101011 i513 = ((i486 << 4 + _101) << 13 + _10001101) << 8 i530 = ((_10100011 + i513) << 8 + _11011101) << 6 + _10011 i560 = ((i530 << 11 + _1101111) << 8 + _101001) << 9 i582 = ((_1001101 + i560) << 11 + _10111001) << 8 + _11000011 i606 = ((i582 << 9 + _11100111) << 10 + _11010011) << 3 i630 = ((_101 + i606) << 13 + _10110011) << 8 + _11011101 i661 = ((i630 << 8 + _1000011) << 12 + _10101111) << 9 i679 = ((_10010001 + i661) << 9 + _10000001) << 6 + _100101 i708 = ((i679 << 8 + _100101) << 10 + _1100111) << 9 i727 = ((_1100001 + i708) << 9 + _10110101) << 7 + _110011 i755 = ((i727 << 8 + _101101) << 10 + _1101101) << 8 i776 = ((_1110111 + i755) << 9 + _1101011) << 9 + _11001011 i806 = ((i776 << 4 + _1001) << 9 + _10011) << 15 i826 = ((_11000011 + i806) << 10 + _10001001) << 7 + _1011101 i855 = ((i826 << 9 + _10011111) << 8 + _1100111) << 10 i876 = ((_11100101 + i855) << 9 + _10101111) << 9 + _10001111 i904 = ((i876 << 7 + _110001) << 9 + _1110111) << 10 i925 = ((_1100011 + i904) << 9 + _1010101) << 9 + _11110111 i955 = ((i925 << 10 + _10100011) << 10 + _11110101) << 8 i978 = ((_11101111 + i955) << 12 + _11100001) << 8 + _10000001 i1010 = ((i978 << 5 + _10101) << 11 + _1111101) << 14 i1029 = ((_11101001 + i1010) << 7 + _1110011) << 9 + _11000101 i1057 = ((i1029 << 11 + _1001011) << 9 + _10101011) << 6 i1081 = ((_111011 + i1057) << 11 + _111101) << 10 + _10011101 i1108 = ((i1081 << 8 + _10000011) << 8 + _11010111) << 9 i1129 = ((_11010001 + i1108) << 8 + _11011001) << 10 + _10101001 i1157 = ((i1129 << 5 + _10011) << 12 + _11010011) << 9 i1176 = ((_10101101 + i1157) << 8 + _11110101) << 8 + _10000101 i1201 = ((i1176 << 7 + _1111011) << 8 + _1110001) << 8 i1222 = ((_1111011 + i1201) << 9 + _11010001) << 9 + _11111101 i1250 = ((i1222 << 7 + _1101101) << 8 + _1111011) << 11 i1270 = ((_11101111 + i1250) << 8 + _11101101) << 9 + _11111001 i1299 = ((i1270 << 10 + _10000011) << 8 + _11110111) << 9 i1322 = ((_101101 + i1299) << 8 + _100101) << 12 + _1111101 i1354 = ((i1322 << 10 + _1001011) << 11 + _11011001) << 9 i1376 = ((_100101 + i1354) << 10 + _10001011) << 9 + _11101111 i1399 = ((i1376 << 8 + _1010111) << 8 + _1010111) << 5 i1423 = ((_111 + i1399) << 12 + _1001001) << 9 + _10000111 i1449 = ((i1423 << 7 + _1111111) << 7 + _11011) << 10 i1470 = ((_1111011 + i1449) << 10 + _10011101) << 8 + _11011001 i1499 = ((i1470 << 6 + _11001) << 11 + _10111101) << 10 i1522 = ((_1111101 + i1499) << 12 + _11010001) << 8 + _11010011 i1548 = ((i1522 << 8 + _11000011) << 8 + _10010011) << 8 i1563 = ((_10011001 + i1548) << 7 + _1110111) << 5 + _1011 i1599 = ((i1563 << 18 + _10001101) << 9 + _10101101) << 7 i1618 = ((_1100101 + i1599) << 8 + _1001001) << 8 + _1111111 i1651 = ((i1618 << 10 + _10010101) << 10 + _100011) << 11 i1672 = ((_11100111 + i1651) << 7 + _1101111) << 11 + _1000001 i1701 = ((i1672 << 9 + _10100011) << 10 + _10010111) << 8 i1720 = ((_11101001 + i1701) << 9 + _1111101) << 7 + _110011 i1752 = ((i1720 << 8 + _110101) << 12 + _1010011) << 10 i1775 = ((_1101001 + i1752) << 9 + _1000001) << 11 + _11001111 i1801 = ((i1775 << 6 + _110001) << 10 + _11010011) << 8 i1825 = ((_11001011 + i1801) << 13 + _11101001) << 8 + _10010111 i1852 = ((i1825 << 7 + _1111011) << 10 + _11001001) << 8 i1874 = ((_11111101 + i1852) << 7 + _1011011) << 12 + _1010111 i1906 = ((i1874 << 11 + _11101) << 9 + _110001) << 10 i1925 = ((_10111001 + i1906) << 8 + _10011001) << 8 + _10110101 i1954 = ((i1925 << 11 + _10100011) << 7 + _1010101) << 9 i1971 = ((_11001011 + i1954) << 9 + _10110111) << 5 + _10001 i2003 = ((i1971 << 11 + _1101011) << 9 + _100011) << 10 i2023 = ((_11110111 + i2003) << 10 + _1011101) << 7 + _11011 i2052 = ((i2023 << 10 + _1001001) << 6 + _11001) << 11 i2076 = ((_10011011 + i2052) << 8 + _1100111) << 13 + _11001001 i2102 = ((i2076 << 8 + _11110111) << 8 + _11100101) << 8 i2127 = ((_10111011 + i2102) << 7 + _111001) << 15 + _11101011 i2153 = ((i2127 << 9 + _11010011) << 6 + _10001) << 9 i2178 = ((_110111 + i2153) << 10 + _11101001) << 12 + _11100011 i2205 = ((i2178 << 7 + _1010011) << 9 + _10101111) << 9 i2237 = ((_10001 + i2205) << 20 + _11111111) << 9 + _11111001 i2267 = ((i2237 << 8 + _10011111) << 8 + _101001) << 12 i2287 = ((_10110011 + i2267) << 7 + _1011101) << 10 + _10111111 i2312 = ((i2287 << 8 + _11111101) << 8 + _11011001) << 7 i2333 = ((_1011111 + i2312) << 8 + _100011) << 10 + _10011101 i2357 = ((i2333 << 8 + _11101001) << 10 + _10101001) << 4 i2381 = ((_111 + i2357) << 14 + _10010101) << 7 + _101011 i2407 = ((i2381 << 9 + _1111111) << 5 + _1011) << 10 i2428 = ((_101101 + i2407) << 11 + _1000101) << 7 + _11101 i2458 = ((i2428 << 11 + _10101111) << 4 + _11) << 13 i2482 = ((_110111 + i2458) << 10 + _10110011) << 11 + _1100111 i2514 = ((i2482 << 10 + _1101001) << 9 + _101011) << 11 i2536 = ((_1101001 + i2514) << 8 + _1100011) << 11 + _10011001 i2564 = ((i2536 << 4 + _1101) << 15 + _1111011) << 7 i2586 = ((_11011 + i2564) << 8 + _10101) << 11 + _10111101 i2612 = ((i2586 << 6 + _110011) << 7 + _11111) << 11 i2633 = ((_11100101 + i2612) << 8 + _111001) << 10 + _10101111 i2661 = ((i2633 << 8 + _10000111) << 7 + _110011) << 11 i2685 = ((_11100101 + i2661) << 10 + _11010111) << 11 + _10000001 i2715 = ((i2685 << 6 + _110001) << 12 + _11100001) << 10 i2737 = ((_1011111 + i2715) << 9 + _11001101) << 10 + _1111011 i2767 = ((i2737 << 8 + _1100011) << 8 + _110101) << 12 i2789 = ((_10101111 + i2767) << 8 + _10010011) << 11 + _11011001 i2815 = ((i2789 << 9 + _1100111) << 10 + _10101101) << 5 i2839 = ((_11011 + i2815) << 11 + _101101) << 10 + _1001111 i2866 = ((i2839 << 9 + _11110101) << 7 + _1111001) << 9 i2888 = ((_10110001 + i2866) << 3 + _101) << 16 + _10011111 i2912 = ((i2888 << 7 + _1011101) << 6 + _11001) << 9 i2934 = ((_100011 + i2912) << 10 + _10111101) << 9 + _1001011 i2960 = ((i2934 << 6 + _10011) << 12 + _11111001) << 6 i2982 = ((_101001 + i2960) << 13 + _10001101) << 6 + _111011 i3017 = ((i2982 << 11 + _10001001) << 15 + _11111001) << 7 i3042 = ((_111011 + i3017) << 9 + _10101) << 13 + _10111011 i3071 = ((i3042 << 9 + _11001011) << 4 + _1111) << 14 i3096 = ((_10001001 + i3071) << 13 + _10011011) << 9 + _100111 i3123 = ((i3096 << 10 + _11110101) << 7 + _1110111) << 8 i3146 = ((_1100001 + i3123) << 10 + _11111111) << 10 + _1011001 i3174 = ((i3146 << 9 + _11001101) << 7 + _1000011) << 10 i3193 = ((_11000111 + i3174) << 8 + _10110001) << 8 + _11001011 i3221 = ((i3193 << 5 + _10001) << 8 + _11001) << 13 i3241 = ((_1101101 + i3221) << 9 + _10000011) << 8 + _11000011 i3269 = ((i3241 << 9 + _11101001) << 9 + _10011111) << 8 i3288 = ((_10110011 + i3269) << 3 + _11) << 13 + _1000001 i3317 = ((i3288 << 10 + _1010011) << 8 + _1010111) << 9 i3340 = ((_1000101 + i3317) << 11 + _11001001) << 9 + _1000101 i3366 = ((i3340 << 8 + _1010001) << 3 + _11) << 13 i3386 = ((_1001011 + i3366) << 9 + _1000101) << 8 + _1110011 i3414 = ((i3386 << 10 + _10110101) << 9 + _10101101) << 7 i3433 = ((_1010001 + i3414) << 12 + _10001111) << 4 + _1101 i3463 = ((i3433 << 12 + _10000111) << 7 + _100111) << 9 i3485 = ((_1110101 + i3463) << 9 + _1000001) << 10 + _11111101 i3514 = ((i3485 << 9 + _11000001) << 8 + _1011011) << 10 i3534 = ((_1101001 + i3514) << 9 + _10000001) << 8 + _11000111 i3564 = ((i3534 << 8 + _10000011) << 8 + _10110011) << 12 i3580 = ((_10011111 + i3564) << 8 + _1000101) << 5 + _1011 i3611 = ((i3580 << 11 + _1111001) << 10 + _11000011) << 8 i3633 = ((_10011111 + i3611) << 11 + _10001) << 8 + _101 i3663 = ((i3633 << 13 + _1100001) << 7 + _100001) << 8 i3684 = ((_100011 + i3663) << 10 + _10011111) << 8 + _1101001 i3712 = ((i3684 << 7 + _100101) << 10 + _11110111) << 9 i3733 = ((_1110001 + i3712) << 9 + _101001) << 9 + _11001 i3766 = ((i3733 << 14 + _11011001) << 10 + _10101101) << 7 i3789 = ((_100111 + i3766) << 9 + _11101) << 11 + _11101111 i3814 = ((i3789 << 9 + _11100001) << 8 + _11010001) << 6 i3838 = ((_100101 + i3814) << 11 + _11011001) << 10 + _11101001 i3864 = ((i3838 << 8 + _11111111) << 8 + _11110111) << 8 i3884 = ((_10101111 + i3864) << 5 + _10101) << 12 + _10100001 i3910 = ((i3884 << 8 + _11010101) << 9 + _10000001) << 7 i3932 = ((_1010001 + i3910) << 9 + _1101101) << 10 + _1000011 i3958 = ((i3932 << 8 + _1010011) << 8 + _1001101) << 8 i3980 = ((_1100011 + i3958) << 11 + _11111101) << 8 + _11100001 i4013 = ((i3980 << 12 + _11001111) << 5 + _1101) << 14 i4033 = ((_10100101 + i4013) << 7 + _1001111) << 10 + _10110111 i4065 = ((i4033 << 12 + _11100111) << 11 + _11100001) << 7 i4087 = ((_1010101 + i4065) << 8 + _11011) << 11 + _11101011 i4116 = ((i4087 << 8 + _10110101) << 8 + _100111) << 11 i4136 = ((_11001011 + i4116) << 9 + _10110001) << 8 + _10001011 i4162 = ((i4136 << 4 + _1111) << 7 + _101) << 13 i4181 = ((_10111001 + i4162) << 8 + _10101101) << 8 + _10100111 i4208 = ((i4181 << 8 + _10010101) << 9 + _11110101) << 8 i4227 = ((_11001001 + i4208) << 8 + _10101101) << 8 + _1101001 i4263 = ((i4227 << 17 + _1100001) << 8 + _1001011) << 9 i4284 = ((_10001 + i4263) << 11 + _11001001) << 7 + _111111 i4316 = ((i4284 << 14 + _11111001) << 8 + _11101011) << 8 i4344 = ((_1101011 + i4316) << 12 + _10001111) << 13 + _1000011 i4375 = ((i4344 << 8 + _1011001) << 10 + _1101011) << 11 i4389 = ((_11110111 + i4375) << 7 + _1111001) << 4 + _101 i4421 = ((i4389 << 12 + _100001) << 7 + _10101) << 11 i4440 = ((_10001001 + i4421) << 8 + _10111011) << 8 + _1000101 i4475 = ((i4440 << 11 + _110101) << 12 + _11001) << 10 i4493 = ((_1011111 + i4475) << 8 + _1111101) << 7 + _100001 i4523 = ((i4493 << 11 + _11101011) << 6 + _111111) << 11 i4545 = ((_10010111 + i4523) << 10 + _1010001) << 9 + _11110101 i4565 = ((i4545 << 6 + _110011) << 10 + _10101001) << 2 i4590 = ((1 + i4565) << 16 + _10100011) << 6 + _111111 i4620 = ((i4590 << 7 + _10001) << 10 + _1100011) << 11 i4638 = ((_1101111 + i4620) << 9 + _10000101) << 6 + _100111 i4665 = ((i4638 << 13 + _111111) << 10 + _11011101) << 2 i4687 = ((1 + i4665) << 14 + _1000101) << 5 + _1111 i4719 = ((i4687 << 14 + _10000111) << 8 + _11110101) << 8 i4741 = ((_11011001 + i4719) << 8 + _11011111) << 11 + _11000011 i4767 = ((i4741 << 7 + _1111101) << 9 + _10001011) << 8 i4787 = ((_1010011 + i4767) << 9 + _1000001) << 8 + _110011 i4814 = ((i4787 << 11 + _1111001) << 9 + _11100001) << 5 i4836 = ((_11101 + i4814) << 12 + _10000101) << 7 + _1010111 i4867 = ((i4836 << 10 + _11010101) << 11 + _11011001) << 8 i4886 = ((_11011111 + i4867) << 4 + _111) << 12 + _10001 return ((i4886 << 7 + _1001) << 8 + _1111) << 4 ================================================ FILE: tools/addchain/bn254_exp.acc ================================================ _10 = 2*1 _11 = 1 + _10 _101 = _10 + _11 _111 = _10 + _101 _1001 = _10 + _111 _1011 = _10 + _1001 _1101 = _10 + _1011 _1111 = _10 + _1101 _10001 = _10 + _1111 _10011 = _10 + _10001 _10101 = _10 + _10011 _10111 = _10 + _10101 _11001 = _10 + _10111 _11011 = _10 + _11001 _11101 = _10 + _11011 _11111 = _10 + _11101 _100001 = _10 + _11111 _100011 = _10 + _100001 _100101 = _10 + _100011 _100111 = _10 + _100101 _101001 = _10 + _100111 _101011 = _10 + _101001 _101101 = _10 + _101011 _101111 = _10 + _101101 _110001 = _10 + _101111 _110011 = _10 + _110001 _110101 = _10 + _110011 _110111 = _10 + _110101 _111001 = _10 + _110111 _111011 = _10 + _111001 _111101 = _10 + _111011 _111111 = _10 + _111101 _1000001 = _10 + _111111 _1000011 = _10 + _1000001 _1000101 = _10 + _1000011 _1000111 = _10 + _1000101 _1001001 = _10 + _1000111 _1001011 = _10 + _1001001 _1001101 = _10 + _1001011 _1001111 = _10 + _1001101 _1010001 = _10 + _1001111 _1010011 = _10 + _1010001 _1010101 = _10 + _1010011 _1010111 = _10 + _1010101 _1011001 = _10 + _1010111 _1011011 = _10 + _1011001 _1011101 = _10 + _1011011 _1011111 = _10 + _1011101 _1100001 = _10 + _1011111 _1100011 = _10 + _1100001 _1100101 = _10 + _1100011 _1100111 = _10 + _1100101 _1101001 = _10 + _1100111 _1101011 = _10 + _1101001 _1101101 = _10 + _1101011 _1101111 = _10 + _1101101 _1110001 = _10 + _1101111 _1110011 = _10 + _1110001 _1110101 = _10 + _1110011 _1110111 = _10 + _1110101 _1111001 = _10 + _1110111 _1111011 = _10 + _1111001 _1111101 = _10 + _1111011 _1111111 = _10 + _1111101 _11111110 = 2*_1111111 _11111111 = 1 + _11111110 i81 = ((_1111101 + _11111111) << 4 + _10111) << 8 + _100001 i105 = ((i81 << 7 + _111001) << 9 + _1001011) << 6 i125 = ((_100111 + i105) << 9 + _1001001) << 8 + _101001 i150 = ((i125 << 8 + _1110101) << 7 + _1001111) << 8 i168 = ((_1001011 + i150) << 6 + _101001) << 9 + _1011001 i192 = ((i168 << 6 + _11001) << 4 + 1) << 12 i209 = ((_110111 + i192) << 6 + _10011) << 8 + _10101 i236 = ((i209 << 9 + _1110001) << 9 + _1011111) << 7 i256 = ((_1101 + i236) << 9 + _110101) << 8 + _1000101 i281 = ((i256 << 6 + _101101) << 11 + _110001) << 6 i307 = ((_11111 + i281) << 17 + _1010111) << 6 + _110011 i337 = ((i307 << 6 + _11011) << 12 + _11111111) << 10 i356 = ((_10101 + i337) << 7 + _10101) << 9 + _1110011 i384 = ((i356 << 10 + _1000101) << 8 + _100001) << 8 i399 = ((_1100111 + i384) << 6 + _101011) << 6 + _10011 i427 = ((i399 << 8 + _111011) << 9 + _11111) << 9 i437 = (2*(_11111111 + i427) + 1) << 6 + _111 i466 = ((i437 << 11 + _1001011) << 6 + _110001) << 10 i484 = ((_1100111 + i466) << 7 + _1001101) << 8 + _1100111 i510 = ((i484 << 6 + _11011) << 9 + _110111) << 9 i527 = ((_1111011 + i510) << 4 + _1101) << 10 + _1101111 i557 = ((i527 << 5 + _11011) << 13 + _101111) << 10 i577 = ((_1110011 + i557) << 10 + _1000101) << 7 + _1000011 i598 = ((i577 << 7 + _1010101) << 6 + _11111) << 6 i613 = ((_1001 + i598) << 10 + _100101) << 2 + 1 i644 = ((i613 << 9 + _11111111) << 9 + _1110111) << 11 i661 = ((_1100011 + i644) << 6 + _110011) << 8 + _1110011 i684 = ((i661 << 7 + _1000101) << 7 + _1110001) << 7 i700 = ((_1001111 + i684) << 9 + _1000101) << 4 + _11 i727 = ((i700 << 12 + _1001101) << 3 + _101) << 10 i746 = ((_1101 + i727) << 10 + _1001011) << 6 + _110001 i772 = ((i746 << 8 + _110111) << 8 + _110011) << 8 i790 = (2*(_1001011 + i772) + 1) << 14 + _1101011 i815 = ((i790 << 8 + _1000111) << 5 + _10101) << 10 i834 = ((_1000101 + i815) << 6 + _11101) << 10 + _100111 i856 = ((i834 << 5 + _1101) << 10 + _100011) << 5 i876 = ((_1011 + i856) << 9 + _110111) << 8 + _1010011 i900 = ((i876 << 7 + _1000001) << 7 + _110101) << 8 i925 = ((_1101101 + i900) << 11 + _1111101) << 11 + _1010101 i953 = ((i925 << 7 + _1001111) << 9 + _1000111) << 10 i971 = ((_1111011 + i953) << 8 + _1100111) << 7 + _1011011 i996 = ((i971 << 8 + _1011111) << 7 + _101001) << 8 i1012 = ((_110001 + i996) << 5 + _1101) << 8 + _10011 i1037 = ((i1012 << 9 + _1001101) << 6 + _110101) << 8 i1055 = ((_1101111 + i1037) << 8 + _1110101) << 7 + _101001 i1081 = ((i1055 << 10 + _1001101) << 7 + _1010001) << 7 i1098 = ((_1111101 + i1081) << 5 + _10101) << 9 + _100111 i1125 = ((i1098 << 7 + _11111) << 8 + _110111) << 10 i1144 = ((_101111 + i1125) << 8 + _1000111) << 8 + _1111101 i1169 = ((i1144 << 5 + _10001) << 12 + _110101) << 6 i1189 = ((_11011 + i1169) << 10 + _1110101) << 7 + _1010111 i1217 = ((i1189 << 7 + _111101) << 12 + _1101011) << 7 i1236 = ((_101111 + i1217) << 8 + _1001001) << 8 + _1001011 i1267 = ((i1236 << 12 + _1100001) << 10 + _100011) << 7 i1287 = ((_100111 + i1267) << 10 + _1011011) << 7 + _1001001 i1309 = ((i1287 << 7 + _1101111) << 7 + _1101011) << 6 i1329 = ((_10001 + i1309) << 8 + _111011) << 9 + _1010001 i1351 = ((i1329 << 7 + _1100011) << 8 + _1001101) << 5 i1374 = ((_10111 + i1351) << 13 + _1111001) << 7 + _1011001 i1398 = ((i1374 << 7 + _1010101) << 7 + _1101001) << 8 i1417 = ((_110011 + i1398) << 6 + _1011) << 10 + _1001011 i1444 = ((i1417 << 8 + _1111101) << 4 + _101) << 13 i1463 = ((_1100101 + i1444) << 7 + _1000101) << 9 + _100111 i1491 = ((i1463 << 8 + _1101101) << 10 + _1001011) << 8 i1509 = ((_1000011 + i1491) << 9 + _110101) << 6 + _10111 i1539 = ((i1509 << 9 + _110111) << 9 + _111101) << 10 i1558 = ((_101011 + i1539) << 2 + 1) << 14 + _1111101 i1585 = ((i1558 << 7 + _1101) << 10 + _101111) << 8 i1610 = ((_1110001 + i1585) << 15 + _1011101) << 7 + _1101001 i1637 = ((i1610 << 6 + _11001) << 9 + _101011) << 10 i1654 = (2*(_1001111 + i1637) + 1) << 13 + _1011001 i1678 = ((i1654 << 4 + _1111) << 9 + _111011) << 9 i1695 = ((_1011011 + i1678) << 6 + _110011) << 8 + _1101 i1725 = ((i1695 << 10 + _1101011) << 7 + _1010001) << 11 i1746 = ((_1111001 + i1725) << 6 + _100011) << 12 + _1111111 i1769 = ((i1746 << 8 + _1000111) << 7 + _1010001) << 6 i1788 = ((_110101 + i1769) << 8 + _1011001) << 8 + _110111 i1812 = ((i1788 << 10 + _1110011) << 6 + _101011) << 6 i1834 = ((_11111 + i1812) << 8 + _101101) << 11 + _1111001 i1863 = ((i1834 << 9 + _10111) << 10 + _1000111) << 8 i1880 = ((_1011001 + i1863) << 5 + _11011) << 9 + _1000001 i1907 = ((i1880 << 2 + _11) << 16 + _1100011) << 7 i1923 = ((_1001001 + i1907) << 7 + _1100111) << 6 + _110111 i1950 = ((i1923 << 8 + _1111011) << 10 + _1100111) << 7 i1971 = ((_11011 + i1950) << 6 + _111) << 12 + _101101 i1994 = ((i1971 << 8 + _1001001) << 7 + _1101111) << 6 i2016 = ((_110011 + i1994) << 10 + _100101) << 9 + _1101001 i2041 = ((i2016 << 7 + _1110101) << 6 + _10101) << 10 i2060 = ((_1100001 + i2041) << 7 + _1000101) << 9 + _110101 i2085 = ((i2060 << 5 + _1101) << 11 + _1100111) << 7 i2103 = ((_1010011 + i2085) << 6 + _100001) << 9 + _1000111 i2129 = ((i2103 << 5 + _11011) << 9 + _1100011) << 10 i2146 = ((_1001011 + i2129) << 7 + _1110011) << 7 + _101111 i2167 = ((i2146 << 6 + _11101) << 9 + _1010111) << 4 i2195 = ((1 + i2167) << 16 + _101111) << 9 + _100011 i2220 = ((i2195 << 7 + _11101) << 8 + _111111) << 8 i2238 = ((_1011101 + i2220) << 6 + _10001) << 9 + _1100011 i2264 = ((i2238 << 7 + _1101111) << 8 + _1001001) << 9 i2283 = ((_10011 + i2264) << 9 + _1111011) << 7 + _1110111 i2308 = ((i2283 << 7 + _1110101) << 7 + _1101111) << 9 i2327 = ((_10001 + i2308) << 8 + _100111) << 8 + _1001011 i2351 = ((i2327 << 5 + _10101) << 9 + _1110101) << 8 i2371 = ((_1010011 + i2351) << 7 + _1101111) << 10 + _1010011 i2402 = ((i2371 << 13 + _1010111) << 9 + _1010001) << 7 i2420 = ((_1111101 + i2402) << 7 + _110001) << 8 + _1001001 i2446 = (2*(i2420 << 7 + _1001101) + 1) << 16 i2465 = ((_111011 + i2446) << 8 + _1010011) << 8 + _1111011 i2492 = ((i2465 << 8 + _1011111) << 8 + _111001) << 9 i2511 = ((_100001 + i2492) << 8 + _1100101) << 8 + _1010011 i2542 = ((i2511 << 9 + _1010111) << 9 + _1001) << 11 i2562 = ((_10111 + i2542) << 9 + _1111111) << 8 + _1010111 i2585 = ((i2562 << 6 + _110001) << 8 + _1010001) << 7 i2607 = ((_1100101 + i2585) << 7 + _1011001) << 12 + _1000011 i2635 = ((i2607 << 6 + _110111) << 11 + _1110111) << 9 i2656 = ((_110111 + i2635) << 6 + _1111) << 12 + _1000011 i2679 = ((i2656 << 7 + _1101101) << 5 + _10111) << 9 i2691 = 2*((_101001 + i2679) << 8 + _1110001) + 1 i2720 = ((i2691 << 14 + _1100001) << 6 + _111101) << 7 i2740 = ((_110101 + i2720) << 11 + _1110001) << 6 + _111011 i2770 = ((i2740 << 9 + _1110011) << 12 + _1000101) << 7 i2788 = ((_101101 + i2770) << 6 + _10101) << 9 + _1001001 i2811 = ((i2788 << 4 + _1001) << 10 + _1100011) << 7 i2829 = ((_1011001 + i2811) << 5 + _11111) << 10 + _1101011 i2853 = ((i2829 << 6 + _11011) << 9 + _110001) << 7 i2866 = 2*((_11111 + i2853) << 9 + _1101111) + 1 i2896 = ((i2866 << 12 + _111011) << 8 + _110101) << 8 i2915 = ((_1000101 + i2896) << 7 + _11101) << 9 + _1111101 i2941 = ((i2915 << 9 + _1001011) << 6 + _10011) << 9 i2957 = ((_1110001 + i2941) << 6 + _111101) << 7 + _10111 i2984 = ((i2957 << 9 + _111011) << 8 + _100111) << 8 i3001 = ((_1001101 + i2984) << 6 + _110011) << 8 + _1001111 i3025 = ((i3001 << 8 + _1001001) << 6 + _100111) << 8 i3040 = ((_1110011 + i3025) << 5 + _10011) << 7 + _10101 i3065 = ((i3040 << 9 + _1111001) << 7 + _1101001) << 7 i3085 = ((_1111011 + i3065) << 8 + _101101) << 9 + _1000001 i3110 = ((i3085 << 8 + _111001) << 8 + _1011101) << 7 i3126 = ((_1111011 + i3110) << 5 + _10001) << 8 + _110111 i3150 = ((i3126 << 8 + _1000101) << 6 + _101111) << 8 i3168 = ((_1101011 + i3150) << 2 + _11) << 13 + _1110011 i3191 = ((i3168 << 7 + _1000001) << 5 + _10011) << 9 i3207 = ((_1111101 + i3191) << 7 + _1010011) << 6 + _110011 i3232 = ((i3207 << 8 + _1010011) << 5 + _1011) << 10 i3251 = ((_1110101 + i3232) << 10 + _1101111) << 6 + _110001 i3282 = ((i3251 << 12 + _100011) << 9 + _1011011) << 8 i3299 = ((_1001011 + i3282) << 6 + _100111) << 8 + _1100011 i3324 = ((i3299 << 7 + _1011111) << 7 + _1101101) << 9 i3341 = ((_10001 + i3324) << 10 + _1101001) << 4 + _1111 i3372 = ((i3341 << 12 + _100101) << 8 + _1000001) << 9 i3391 = ((_1100111 + i3372) << 9 + _1010111) << 7 + _1000001 i3415 = ((i3391 << 2 + _11) << 11 + _11111111) << 9 i3433 = ((_1111101 + i3415) << 5 + _1101) << 10 + _1101111 i3456 = ((i3433 << 6 + _11001) << 8 + _11001) << 7 i3477 = ((_111 + i3456) << 11 + _100101) << 7 + _11 return i3477 << 5 ================================================ FILE: tools/addchain/bn254_exp0.acc ================================================ _10 = 2*1 _11 = 1 + _10 _101 = _10 + _11 _111 = _10 + _101 _1001 = _10 + _111 _1011 = _10 + _1001 _1101 = _10 + _1011 _1111 = _10 + _1101 _10001 = _10 + _1111 _10011 = _10 + _10001 _10101 = _10 + _10011 _10111 = _10 + _10101 _11001 = _10 + _10111 _11011 = _10 + _11001 _11101 = _10 + _11011 _11111 = _10 + _11101 _100001 = _10 + _11111 _100011 = _10 + _100001 _100101 = _10 + _100011 _100111 = _10 + _100101 _101001 = _10 + _100111 _101011 = _10 + _101001 _101101 = _10 + _101011 _101111 = _10 + _101101 _110001 = _10 + _101111 _110011 = _10 + _110001 _110101 = _10 + _110011 _110111 = _10 + _110101 _111001 = _10 + _110111 _111011 = _10 + _111001 _111101 = _10 + _111011 _111111 = _10 + _111101 _1000001 = _10 + _111111 _1000011 = _10 + _1000001 _1000101 = _10 + _1000011 _1000111 = _10 + _1000101 _1001001 = _10 + _1000111 _1001011 = _10 + _1001001 _1001101 = _10 + _1001011 _1001111 = _10 + _1001101 _1010001 = _10 + _1001111 _1010011 = _10 + _1010001 _1010101 = _10 + _1010011 _1010111 = _10 + _1010101 _1011001 = _10 + _1010111 _1011011 = _10 + _1011001 _1011101 = _10 + _1011011 _1011111 = _10 + _1011101 _1100001 = _10 + _1011111 _1100011 = _10 + _1100001 _1100101 = _10 + _1100011 _1100111 = _10 + _1100101 _1101001 = _10 + _1100111 _1101011 = _10 + _1101001 _1101101 = _10 + _1101011 _1101111 = _10 + _1101101 _1110001 = _10 + _1101111 _1110011 = _10 + _1110001 _1110101 = _10 + _1110011 _1110111 = _10 + _1110101 _1111001 = _10 + _1110111 _1111011 = _10 + _1111001 _1111101 = _10 + _1111011 _1111111 = _10 + _1111101 _11100010 = _1100011 + _1111111 _11111111 = _11101 + _11100010 i67 = 2*_11100010 x9 = _111011 + i67 i94 = ((i67 << 10 + _1010101) << 7 + _1100001) << 7 i118 = ((_1000011 + i94) << 8 + _111011) << 13 + _101011 i146 = ((i118 << 8 + _1101111) << 8 + _110111) << 10 i165 = ((_1010111 + i146) << 11 + _1110111) << 5 + _1011 i191 = ((i165 << 6 + _101) << 10 + _111001) << 8 i212 = ((_100101 + i191) << 5 + _11) << 13 + _1100011 i243 = ((i212 << 10 + _111) << 11 + _1011011) << 8 i261 = ((_1100001 + i243) << 4 + _1111) << 11 + _110101 i287 = ((i261 << 6 + _10111) << 9 + _1010101) << 9 i308 = ((_10011 + i287) << 9 + _100001) << 9 + _100011 i334 = ((i308 << 9 + _1100001) << 8 + _101101) << 7 i359 = ((_1011 + i334) << 13 + _1100011) << 9 + _100111 i384 = ((i359 << 9 + _1101001) << 5 + _10001) << 9 i402 = ((_100101 + i384) << 9 + _1010001) << 6 + _100011 i426 = ((i402 << 9 + _1100001) << 9 + _1001011) << 4 i445 = ((_1101 + i426) << 7 + _1101) << 9 + _101001 i469 = ((i445 << 8 + _1101001) << 5 + _10011) << 9 i489 = ((_1111101 + i469) << 9 + _1111101) << 8 + _1110101 i515 = ((i489 << 7 + _111011) << 10 + _100011) << 7 i532 = ((_111001 + i515) << 5 + _1101) << 9 + _111 i561 = ((i532 << 11 + _11111111) << 8 + _1111001) << 8 i576 = ((_1010111 + i561) << 5 + _11101) << 7 + _1001 i602 = ((i576 << 10 + _1011001) << 7 + _1111001) << 7 i625 = ((_11001 + i602) << 9 + _101101) << 11 + _111101 i649 = ((i625 << 6 + _10011) << 6 + _101) << 10 i671 = ((_10111 + i649) << 11 + _1101101) << 8 + _1111001 i696 = ((i671 << 9 + _1000001) << 7 + _1101101) << 7 i716 = ((_1100111 + i696) << 7 + _10001) << 10 + _1100011 i737 = ((i716 << 6 + _100111) << 8 + _1101101) << 5 i762 = ((_11101 + i737) << 8 + _10101) << 14 + _1111001 i787 = ((i762 << 7 + _1001011) << 8 + _1000011) << 8 i805 = ((_1011101 + i787) << 9 + _110111) << 6 + _10001 i830 = ((i805 << 6 + _1111) << 10 + _1010101) << 7 i847 = ((_1011001 + i830) << 8 + _1011111) << 6 + _1001 i872 = ((i847 << 5 + _11) << 11 + _110111) << 7 i887 = ((_100101 + i872) << 5 + _1011) << 7 + _1011 i913 = ((i887 << 10 + _1011011) << 6 + _10101) << 8 i936 = ((_111001 + i913) << 8 + _1001001) << 12 + _1110111 i965 = ((i936 << 10 + _101111) << 8 + _10001) << 9 i984 = ((_1010011 + i965) << 7 + _1111011) << 9 + _1010001 i1004 = ((i984 << 6 + _10011) << 9 + _1010111) << 3 i1023 = ((_111 + i1004) << 10 + _110001) << 6 + _11101 i1051 = ((i1023 << 11 + x9) << 8 + _1011011) << 7 i1071 = ((_1010001 + i1051) << 7 + _1101111) << 10 + _111011 i1099 = ((i1071 << 9 + _1111001) << 6 + _101001) << 11 i1118 = ((_101111 + i1099) << 9 + _1011001) << 7 + _1000001 i1143 = ((i1118 << 9 + _1000011) << 7 + _111101) << 7 i1162 = ((_111001 + i1143) << 4 + _11) << 12 + _1100101 i1187 = ((i1162 << 4 + _1001) << 11 + _110011) << 8 i1205 = ((_1100101 + i1187) << 4 + _1101) << 11 + _1101011 i1231 = ((i1205 << 7 + _1010101) << 8 + _11111) << 9 i1248 = ((_1100101 + i1231) << 5 + _1011) << 9 + _111011 i1272 = ((i1248 << 8 + _1010111) << 7 + _100101) << 7 i1292 = ((_110001 + i1272) << 8 + _1110011) << 9 + _1111011 i1317 = ((i1292 << 9 + _1010011) << 5 + _10011) << 9 i1336 = ((_1111001 + i1317) << 6 + _10001) << 10 + _1111001 i1357 = ((i1336 << 7 + _1001101) << 7 + _1110001) << 5 i1382 = ((_11011 + i1357) << 9 + _1001001) << 13 + _1100111 i1407 = ((i1382 << 8 + _1110011) << 6 + _101011) << 9 i1423 = ((_100111 + i1407) << 7 + _101001) << 6 + _11101 i1458 = ((i1423 << 8 + _111001) << 14 + _1101001) << 11 i1478 = ((_1100011 + i1458) << 8 + _110111) << 9 + _1001111 i1498 = ((i1478 << 4 + _11) << 12 + _1010011) << 2 i1519 = ((_11 + i1498) << 12 + _1110101) << 6 + _110111 i1544 = ((i1519 << 10 + _1010101) << 7 + _1011101) << 6 i1559 = ((_111011 + i1544) << 8 + _1100111) << 4 + _111 i1594 = ((i1559 << 12 + _111) << 10 + _11101) << 11 i1610 = ((_1001111 + i1594) << 8 + _1010011) << 5 + _10101 i1636 = ((i1610 << 10 + _1001111) << 11 + _1010111) << 3 i1658 = ((_101 + i1636) << 11 + _1011001) << 8 + _101101 i1680 = ((i1658 << 8 + _1001111) << 7 + _1001111) << 5 i1700 = ((_1011 + i1680) << 10 + _1111001) << 7 + _1000101 i1727 = ((i1700 << 7 + _1001101) << 9 + _111011) << 9 i1744 = ((_1000111 + i1727) << 7 + _1000111) << 7 + _1011001 i1766 = ((i1744 << 6 + _101001) << 8 + _1101101) << 6 i1784 = ((_100101 + i1766) << 9 + _1000111) << 6 + _110101 i1812 = ((i1784 << 9 + _1100111) << 7 + _110001) << 10 i1828 = ((_1101111 + i1812) << 7 + _1101001) << 6 + _100011 i1854 = ((i1828 << 6 + _10011) << 10 + _1000111) << 8 i1876 = ((_1110001 + i1854) << 12 + _100011) << 7 + _101 i1918 = ((i1876 << 20 + _111011) << 11 + _10001) << 9 i1937 = ((_1011001 + i1918) << 6 + _110001) << 10 + _110101 i1962 = ((i1937 << 8 + _110111) << 4 + _111) << 11 i1978 = ((_1001101 + i1962) << 7 + _1000011) << 6 + _101111 i2002 = ((i1978 << 8 + _1000001) << 7 + _1110001) << 7 i2019 = ((_1111001 + i2002) << 7 + _1001101) << 7 + _101001 i2043 = ((i2019 << 10 + _1010111) << 6 + _111011) << 6 i2061 = ((_11111 + i2043) << 8 + _110001) << 7 + _110001 i2084 = ((i2061 << 8 + _1010111) << 2 + 1) << 11 i2103 = ((_10111 + i2084) << 9 + _1000011) << 7 + _1011001 i2126 = ((i2103 << 7 + _1011011) << 5 + _11101) << 9 i2144 = ((_101001 + i2126) << 8 + _1110011) << 7 + _1100011 i2173 = ((i2144 << 9 + _1110111) << 8 + _1010011) << 10 i2184 = 2*((_1110001 + i2173) << 7 + _1110001) + 1 i2216 = ((i2184 << 14 + _111101) << 9 + _1110001) << 7 i2233 = ((_1001011 + i2216) << 7 + _111001) << 7 + _11111 i2259 = ((i2233 << 10 + _1100111) << 7 + _1101111) << 7 i2280 = ((_1011011 + i2259) << 10 + x9) << 8 + _1100101 i2305 = ((i2280 << 7 + _1110011) << 6 + _100001) << 10 i2327 = ((_101011 + i2305) << 13 + _1000101) << 6 + _1011 i2354 = ((i2327 << 10 + _110111) << 7 + _100111) << 8 i2374 = ((_1100101 + i2354) << 7 + _1100101) << 10 + _1011111 i2402 = ((i2374 << 12 + _1000011) << 7 + _1110001) << 7 i2421 = ((_1011101 + i2402) << 8 + _1011011) << 8 + _1101111 i2446 = ((i2421 << 5 + _11101) << 9 + _10011) << 9 i2461 = ((_1111001 + i2446) << 5 + _10101) << 7 + _10111 i2494 = ((i2461 << 11 + _100101) << 10 + _101) << 10 i2519 = ((_110011 + i2494) << 8 + _101001) << 14 + _1100111 i2543 = ((i2519 << 9 + _1000011) << 4 + _1001) << 9 i2561 = ((_110101 + i2543) << 8 + _1010011) << 7 + _1100011 i2586 = ((i2561 << 5 + _1001) << 6 + _101) << 12 i2614 = ((_11011 + i2586) << 13 + _101) << 12 + _1101101 i2641 = ((i2614 << 4 + _101) << 14 + _1000001) << 7 i2658 = ((_111011 + i2641) << 6 + _10011) << 8 + _11011 i2684 = ((i2658 << 8 + _10111) << 9 + _1010001) << 7 i2702 = ((_111001 + i2684) << 8 + _1010101) << 7 + _1000111 i2726 = ((i2702 << 4 + _1011) << 10 + _1000101) << 8 i2741 = ((_1011101 + i2726) << 6 + _110001) << 6 + _11011 i2767 = ((i2741 << 9 + _1000111) << 9 + _1100001) << 6 i2792 = ((_111111 + i2767) << 9 + _1101011) << 13 + _111011 i2820 = ((i2792 << 8 + _1111101) << 6 + _11101) << 12 i2837 = ((_1110101 + i2820) << 2 + _11) << 12 + _1101001 i2862 = ((i2837 << 8 + _110101) << 8 + _1001101) << 7 i2878 = ((_1110101 + i2862) << 8 + _1011001) << 5 + _10111 i2910 = ((i2878 << 8 + _11) << 13 + _1011101) << 9 i2932 = ((_1011101 + i2910) << 10 + _1111111) << 9 + _1010111 i2956 = ((i2932 << 8 + _1110001) << 4 + _1001) << 10 i2972 = ((_1101001 + i2956) << 6 + _11001) << 7 + _1001 i3000 = ((i2972 << 9 + _100011) << 7 + _101001) << 10 i3019 = ((_11111 + i3000) << 9 + _1010111) << 7 + _1000101 i3046 = ((i3019 << 7 + _100011) << 11 + _1111101) << 7 i3065 = ((_1000001 + i3046) << 7 + _1111011) << 9 + _1010111 i3094 = ((i3065 << 14 + _1001101) << 8 + _1001101) << 5 i3115 = ((_1111 + i3094) << 8 + _11011) << 10 + _1111101 i3140 = ((i3115 << 7 + _100111) << 9 + _1101111) << 7 i3160 = ((_101001 + i3140) << 9 + _1010101) << 8 + _1110111 i3182 = ((i3160 << 7 + _1000111) << 6 + _100101) << 7 i3202 = ((_111101 + i3182) << 5 + _1001) << 12 + _1111001 i3225 = ((i3202 << 5 + _10101) << 9 + _1000111) << 7 i3243 = ((_1010011 + i3225) << 7 + _1001111) << 8 + _1100011 i3266 = ((i3243 << 7 + _1101101) << 6 + _10111) << 8 i3284 = ((_110111 + i3266) << 7 + _111111) << 8 + _1011001 i3309 = ((i3284 << 7 + _1011011) << 8 + _101111) << 8 i3326 = ((_1010001 + i3309) << 4 + _1101) << 10 + _1001111 i3354 = ((i3326 << 7 + _1100011) << 8 + _1000011) << 11 i3369 = ((_1111011 + i3354) << 3 + _11) << 9 + _11111111 i3396 = ((i3369 << 12 + _1000111) << 7 + _11111) << 6 i3421 = ((_111 + i3396) << 11 + _1110001) << 11 + _10101 i3449 = ((i3421 << 12 + _1101001) << 5 + _10011) << 9 i3470 = ((_111101 + i3449) << 11 + _1100001) << 7 + _1100101 return 2*i3470 + 1 ================================================ FILE: tools/addchain/bn254_r_m_d_inv.acc ================================================ _10 = 2*1 _11 = 1 + _10 _100 = 1 + _11 _101 = 1 + _100 _111 = _10 + _101 _1001 = _10 + _111 _1011 = _10 + _1001 _1101 = _10 + _1011 _1111 = _10 + _1101 _10001 = _10 + _1111 _10011 = _10 + _10001 _10101 = _10 + _10011 _10111 = _10 + _10101 _11001 = _10 + _10111 _11011 = _10 + _11001 _11101 = _10 + _11011 _11111 = _10 + _11101 _100001 = _10 + _11111 _100011 = _10 + _100001 _100101 = _10 + _100011 _100111 = _10 + _100101 _101001 = _10 + _100111 _101011 = _10 + _101001 _101101 = _10 + _101011 _101111 = _10 + _101101 _110001 = _10 + _101111 _110011 = _10 + _110001 _110101 = _10 + _110011 _110111 = _10 + _110101 _111001 = _10 + _110111 _111011 = _10 + _111001 _111101 = _10 + _111011 _111111 = _10 + _111101 _1000001 = _10 + _111111 _1000011 = _10 + _1000001 _1000101 = _10 + _1000011 _1000111 = _10 + _1000101 _1001001 = _10 + _1000111 _1001011 = _10 + _1001001 _1001101 = _10 + _1001011 _1001111 = _10 + _1001101 _1010001 = _10 + _1001111 _1010011 = _10 + _1010001 _1010101 = _10 + _1010011 _1010111 = _10 + _1010101 _1011001 = _10 + _1010111 _1011011 = _10 + _1011001 _1011101 = _10 + _1011011 _1011111 = _10 + _1011101 _1100001 = _10 + _1011111 _1100011 = _10 + _1100001 _1100101 = _10 + _1100011 _1100111 = _10 + _1100101 _1101001 = _10 + _1100111 _1101011 = _10 + _1101001 _1101101 = _10 + _1101011 _1101111 = _10 + _1101101 _1110001 = _10 + _1101111 _1110011 = _10 + _1110001 _1110101 = _10 + _1110011 _1110111 = _10 + _1110101 _1111001 = _10 + _1110111 _1111011 = _10 + _1111001 _1111101 = _10 + _1111011 _1111111 = _10 + _1111101 _10000001 = _10 + _1111111 _10000011 = _10 + _10000001 _10000101 = _10 + _10000011 _10000111 = _10 + _10000101 _10001001 = _10 + _10000111 _10001011 = _10 + _10001001 _10001101 = _10 + _10001011 _10001111 = _10 + _10001101 _10010001 = _10 + _10001111 _10010011 = _10 + _10010001 _10010101 = _10 + _10010011 _10010111 = _10 + _10010101 _10011001 = _10 + _10010111 _10011011 = _10 + _10011001 _10011101 = _10 + _10011011 _10011111 = _10 + _10011101 _10100001 = _10 + _10011111 _10100011 = _10 + _10100001 _10100101 = _10 + _10100011 _10100111 = _10 + _10100101 _10101001 = _10 + _10100111 _10101011 = _10 + _10101001 _10101101 = _10 + _10101011 _10101111 = _10 + _10101101 _10110001 = _10 + _10101111 _10110011 = _10 + _10110001 _10110101 = _10 + _10110011 _10110111 = _10 + _10110101 _10111001 = _10 + _10110111 _10111011 = _10 + _10111001 _10111101 = _10 + _10111011 _10111111 = _10 + _10111101 _11000001 = _10 + _10111111 _11000011 = _10 + _11000001 _11000101 = _10 + _11000011 _11000111 = _10 + _11000101 _11001001 = _10 + _11000111 _11001011 = _10 + _11001001 _11001101 = _10 + _11001011 _11001111 = _10 + _11001101 _11010001 = _10 + _11001111 _11010011 = _10 + _11010001 _11010111 = _100 + _11010011 _11011001 = _10 + _11010111 _11011011 = _10 + _11011001 _11011101 = _10 + _11011011 _11011111 = _10 + _11011101 _11100001 = _10 + _11011111 _11100011 = _10 + _11100001 _11100101 = _10 + _11100011 _11100111 = _10 + _11100101 _11101001 = _10 + _11100111 _11101011 = _10 + _11101001 _11101101 = _10 + _11101011 _11101111 = _10 + _11101101 _11110001 = _10 + _11101111 _11110011 = _10 + _11110001 _11110101 = _10 + _11110011 _11110111 = _10 + _11110101 _11111001 = _10 + _11110111 _11111011 = _10 + _11111001 _11111101 = _10 + _11111011 _11111111 = _10 + _11111101 i146 = ((_11 + _11111111) << 7 + _10100011) << 8 + _11010011 i174 = ((i146 << 9 + _1110011) << 9 + _10101001) << 8 i199 = ((_101011 + i174) << 11 + _100011) << 11 + _11100011 i229 = ((i199 << 8 + _10011011) << 8 + _11000001) << 12 i255 = ((_11110111 + i229) << 9 + _10000111) << 14 + _10100001 i278 = ((i255 << 5 + _11101) << 9 + _10101) << 7 i298 = ((_1011 + i278) << 10 + _100011) << 7 + _11111 i330 = ((i298 << 12 + _10111111) << 8 + _1000011) << 10 i352 = ((_1011111 + i330) << 8 + _1100001) << 11 + _11111111 i387 = ((i352 << 10 + _11011001) << 10 + _10001) << 13 i411 = ((_1000111 + i387) << 6 + _10111) << 15 + _1101101 i441 = ((i411 << 12 + _11100011) << 7 + _1111011) << 9 i461 = ((_11111011 + i441) << 8 + _11111011) << 9 + _10101011 i490 = ((i461 << 11 + _10111111) << 9 + _10011011) << 7 i508 = ((_1100111 + i490) << 8 + _1101111) << 7 + _101111 i537 = ((i508 << 10 + _11000011) << 6 + _11011) << 11 i560 = ((_10111111 + i537) << 9 + _10010101) << 11 + _10100101 i587 = ((i560 << 9 + _1001101) << 9 + _1100001) << 7 i609 = ((_110111 + i587) << 7 + _10111) << 12 + _11101 i638 = ((i609 << 11 + _11100111) << 6 + _100111) << 10 i660 = ((_100111 + i638) << 12 + _10110011) << 7 + _1111101 i686 = ((i660 << 12 + _10100101) << 8 + _11110011) << 4 i710 = ((_1001 + i686) << 13 + _10001011) << 8 + _1001101 i737 = ((i710 << 5 + _1001) << 12 + _10100011) << 8 i755 = ((_10001101 + i737) << 7 + _1010101) << 8 + _1001001 i788 = ((i755 << 5 + _1011) << 13 + _1001001) << 13 i806 = ((_10110011 + i788) << 8 + _11001101) << 7 + _1010011 i838 = ((i806 << 11 + _1101111) << 10 + _10000001) << 9 i860 = ((_10111011 + i838) << 11 + _11100111) << 8 + _11101011 i884 = ((i860 << 2 + _11) << 13 + _1010101) << 7 i912 = ((_101101 + i884) << 12 + _10101011) << 13 + _111011 i937 = ((i912 << 7 + _11101) << 7 + _1111) << 9 i962 = ((_10011 + i937) << 10 + _100001) << 12 + _101011 i993 = ((i962 << 10 + _11100011) << 10 + _10111011) << 9 i1013 = ((_11001111 + i993) << 10 + _10101101) << 7 + _1001111 i1041 = ((i1013 << 10 + _11110011) << 8 + _10001001) << 8 i1060 = ((_10011101 + i1041) << 8 + _10001001) << 8 + _1101011 i1092 = ((i1060 << 7 + _111011) << 12 + _1000101) << 11 i1116 = ((_10011011 + i1092) << 10 + _111001) << 11 + _10111011 i1151 = ((i1116 << 11 + _10111011) << 10 + _11011011) << 12 i1173 = ((_10011111 + i1151) << 12 + _11100111) << 7 + _1000111 i1204 = ((i1173 << 9 + _10001111) << 10 + _11110001) << 10 i1223 = ((_10001001 + i1204) << 8 + _10000011) << 8 + _10001001 i1250 = ((i1223 << 6 + _100111) << 11 + _10011011) << 8 i1273 = ((_11101001 + i1250) << 13 + _1110111) << 7 + _100011 i1304 = ((i1273 << 11 + _1100001) << 9 + _11110111) << 9 i1324 = ((_1011011 + i1304) << 10 + _11100001) << 7 + _1100011 i1352 = ((i1324 << 9 + _11010001) << 8 + _11000111) << 9 i1378 = ((_10010101 + i1352) << 14 + _11010001) << 9 + _1001101 i1409 = ((i1378 << 8 + _1010001) << 12 + _1011011) << 9 i1430 = ((_1101111 + i1409) << 8 + _111101) << 10 + _1010011 i1460 = ((i1430 << 12 + _10101101) << 8 + _10011011) << 8 i1485 = ((_10100001 + i1460) << 8 + _10001111) << 14 + _1111101 i1511 = ((i1485 << 7 + _100011) << 9 + _1000111) << 8 i1532 = ((_1100001 + i1511) << 9 + _1110011) << 9 + _11110001 i1559 = ((i1532 << 7 + _1100111) << 10 + _11101101) << 8 i1579 = ((_1101101 + i1559) << 8 + _11001) << 9 + _110001 i1613 = ((i1579 << 9 + _1000011) << 10 + _1000011) << 13 i1640 = ((_11001101 + i1613) << 12 + _1110001) << 12 + _10101011 i1666 = ((i1640 << 4 + _1011) << 12 + _10111011) << 8 i1685 = ((_11011011 + i1666) << 7 + _1010101) << 9 + _11101101 i1712 = ((i1685 << 8 + _11001011) << 7 + _1111101) << 10 i1732 = ((_11100101 + i1712) << 7 + _1101011) << 10 + _10101101 i1759 = ((i1732 << 8 + _1000001) << 9 + _11001011) << 8 i1778 = ((_11001011 + i1759) << 3 + _111) << 13 + _11011111 i1809 = ((i1778 << 8 + _100011) << 12 + _11100111) << 9 i1827 = ((_10001111 + i1809) << 6 + _110101) << 9 + _1111111 i1854 = ((i1827 << 10 + _10111101) << 8 + _10001101) << 7 i1877 = ((_1101011 + i1854) << 10 + _11101101) << 10 + _10001111 i1900 = ((i1877 << 9 + _11110101) << 8 + _11000111) << 4 i1922 = ((_1111 + i1900) << 12 + _10110111) << 7 + _10001 i1945 = ((i1922 << 12 + _11101001) << 6 + _111101) << 3 i1970 = ((1 + i1945) << 14 + _1101011) << 8 + _111011 i1997 = ((i1970 << 11 + _11011001) << 7 + _1100001) << 7 i2018 = ((_110001 + i1997) << 10 + _11000111) << 8 + _11110111 i2044 = ((i2018 << 6 + _11011) << 12 + _10110011) << 6 i2067 = ((_11111 + i2044) << 11 + _1101101) << 9 + _10110011 i2093 = ((i2067 << 8 + _11010001) << 5 + _10011) << 11 i2112 = ((_10001001 + i2093) << 5 + _11001) << 11 + _11011111 i2138 = ((i2112 << 8 + _11001001) << 8 + _11111001) << 8 i2160 = ((_10101111 + i2138) << 11 + _10111001) << 8 + _1001001 i2189 = ((i2160 << 10 + _11100111) << 9 + _10111101) << 8 i2210 = ((_11101011 + i2189) << 8 + _1111001) << 10 + _1100001 i2238 = ((i2210 << 9 + _11010111) << 10 + _10100011) << 7 i2258 = ((_1111101 + i2238) << 9 + _11000011) << 8 + _1001001 i2284 = ((i2258 << 9 + _1000001) << 12 + _11001001) << 3 i2312 = ((_111 + i2284) << 18 + _10011001) << 7 + _1010111 i2340 = ((i2312 << 9 + _11100001) << 8 + _11110101) << 9 i2359 = ((_10011011 + i2340) << 8 + _10000011) << 8 + _1001101 i2387 = ((i2359 << 8 + _100111) << 9 + _1100001) << 9 i2409 = ((_10100011 + i2387) << 8 + _1000011) << 11 + _10001 i2451 = ((i2409 << 18 + _1111001) << 9 + _111001) << 13 i2469 = ((_11101011 + i2451) << 7 + _1011101) << 8 + _1001101 i2491 = ((i2469 << 10 + _10000111) << 8 + _11001001) << 2 i2515 = ((_11 + i2491) << 13 + _1011011) << 8 + _1010101 i2544 = ((i2515 << 9 + _100011) << 9 + _111101) << 9 i2568 = ((_10001 + i2544) << 14 + _10010011) << 7 + _1001101 i2599 = ((i2568 << 3 + 1) << 18 + _110011) << 8 i2618 = ((_110011 + i2599) << 10 + _10100111) << 6 + _11011 i2648 = ((i2618 << 8 + _11101) << 12 + _10101111) << 8 i2671 = ((_101101 + i2648) << 10 + _10101111) << 10 + _11100101 i2696 = ((i2671 << 7 + _110111) << 10 + _10110001) << 6 i2716 = ((_101101 + i2696) << 11 + _10001001) << 6 + _1001 i2749 = ((i2716 << 9 + _11101) << 12 + _101011) << 10 i2769 = ((_100001 + i2749) << 11 + _10001111) << 6 + _101001 i2800 = ((i2769 << 12 + _10111101) << 8 + _10111011) << 9 i2820 = ((_101101 + i2800) << 10 + _10101001) << 7 + _1110011 i2849 = ((i2820 << 9 + _10000001) << 7 + _101011) << 11 i2869 = ((_10110101 + i2849) << 8 + _1110101) << 9 + _10001101 i2895 = ((i2869 << 8 + _11111001) << 8 + _1110101) << 8 i2918 = ((_1111 + i2895) << 6 + _11) << 14 + _1011111 i2939 = ((i2918 << 5 + _1111) << 11 + _1100101) << 3 i2968 = ((_11 + i2939) << 13 + _1011011) << 13 + _10001001 i2994 = ((i2968 << 8 + _10000111) << 8 + _10100001) << 8 i3013 = ((_11001101 + i2994) << 8 + _1000111) << 8 + _1101111 i3042 = ((i3013 << 11 + _10010001) << 8 + _1011001) << 8 i3064 = ((_100001 + i3042) << 9 + _1101001) << 10 + _11010011 i3092 = ((i3064 << 8 + _11110011) << 8 + _110111) << 10 i3114 = ((_101111 + i3092) << 11 + _11100001) << 8 + _10000111 i3140 = ((i3114 << 5 + _10111) << 12 + _10111111) << 7 i3165 = ((_1110011 + i3140) << 10 + _11110111) << 12 + _10110011 i3191 = ((i3165 << 8 + _10111111) << 7 + _1010011) << 9 i3212 = ((_1100101 + i3191) << 9 + _10000001) << 9 + _10101101 i3239 = ((i3212 << 6 + _11011) << 11 + _10111101) << 8 i3258 = ((_11100001 + i3239) << 7 + _1111001) << 9 + _1110111 i3287 = ((i3258 << 10 + _11111001) << 6 + _10011) << 11 i3308 = ((_11110101 + i3287) << 7 + _100101) << 11 + _11101111 i3344 = ((i3308 << 11 + _1100111) << 10 + _1110001) << 13 i3365 = ((_1100011 + i3344) << 12 + _11110111) << 6 + _111011 i3399 = ((i3365 << 12 + _10010001) << 7 + _1110101) << 13 i3418 = ((_11100101 + i3399) << 7 + _1010111) << 9 + _1100111 i3444 = ((i3418 << 9 + _11110101) << 9 + _1010011) << 6 i3470 = ((_10001 + i3444) << 9 + _101101) << 14 + _1101001 i3497 = ((i3470 << 9 + _10100101) << 4 + _101) << 12 i3515 = ((_1010001 + i3497) << 3 + 1) << 12 + _11011 i3551 = ((i3515 << 14 + _11011001) << 12 + _1101011) << 8 i3570 = ((_1101111 + i3551) << 9 + _10110111) << 7 + _110001 i3604 = ((i3570 << 10 + _11110111) << 8 + _11111111) << 14 i3623 = ((_10101001 + i3604) << 9 + _11010001) << 7 + _1011011 i3650 = ((i3623 << 9 + _10100111) << 4 + _1111) << 12 i3676 = ((_100101 + i3650) << 15 + _10011111) << 8 + _11001011 i3706 = ((i3676 << 9 + _11000101) << 8 + _11101111) << 11 i3726 = ((_11101101 + i3706) << 6 + _100101) << 11 + _10001011 i3753 = ((i3726 << 7 + _1010001) << 9 + _1011001) << 9 i3771 = ((_10001001 + i3753) << 8 + _11101011) << 7 + _1000101 i3804 = ((i3771 << 11 + _1010011) << 8 + _1001111) << 12 i3825 = ((_1101111 + i3804) << 10 + _11111101) << 8 + _1100111 i3852 = ((i3825 << 8 + _1000001) << 3 + _11) << 14 i3867 = ((_10101101 + i3852) << 8 + _10011001) << 4 + _1011 i3895 = ((i3867 << 14 + _11110011) << 8 + _10101001) << 4 i3919 = ((_1101 + i3895) << 11 + _110111) << 10 + _11011111 i3946 = ((i3919 << 9 + _10010011) << 6 + _10101) << 10 i3967 = ((_1101001 + i3946) << 12 + _10011011) << 6 + _110111 i3998 = ((i3967 << 10 + _11000111) << 6 + _11011) << 13 i4017 = ((_11010111 + i3998) << 7 + _1001001) << 9 + _11100011 i4047 = ((i4017 << 8 + _11101) << 11 + _11111011) << 9 i4063 = ((_10111111 + i4047) << 8 + _10100011) << 5 + _1101 i4093 = ((i4063 << 11 + _1110001) << 9 + _10111101) << 8 i4113 = ((_10111011 + i4093) << 9 + _10001101) << 8 + _10100001 i4143 = ((i4113 << 9 + _11111001) << 11 + _10111111) << 8 i4168 = ((_11111001 + i4143) << 5 + _111) << 17 + _10001001 i4191 = ((i4168 << 4 + _1001) << 12 + _1111001) << 5 i4217 = ((_1001 + i4191) << 14 + _10111101) << 9 + _11111111 i4245 = ((i4217 << 8 + _10101011) << 8 + _10101101) << 10 i4267 = ((_101111 + i4245) << 11 + _110011) << 8 + _101101 i4294 = ((i4267 << 9 + _1100001) << 9 + _10111001) << 7 i4317 = ((_100001 + i4294) << 12 + _11110001) << 8 + _10101101 i4345 = ((i4317 << 11 + _10111011) << 7 + _1111011) << 8 i4366 = ((_1101101 + i4345) << 10 + _10100101) << 8 + _1110111 i4396 = ((i4366 << 11 + _11100101) << 4 + _111) << 13 i4418 = ((_1100011 + i4396) << 9 + _111111) << 10 + _10010011 i4446 = ((i4418 << 9 + _11111011) << 8 + _1111111) << 9 i4462 = ((_10010101 + i4446) << 8 + _10010101) << 5 + _10011 i4495 = ((i4462 << 11 + _1101101) << 8 + _1000111) << 12 i4514 = ((_11000001 + i4495) << 8 + _1101111) << 8 + _1100001 i4543 = ((i4514 << 10 + _10011101) << 8 + _11000001) << 9 i4562 = ((_1010011 + i4543) << 7 + _111111) << 9 + _101001 i4589 = ((i4562 << 10 + _11010001) << 9 + _11110111) << 6 i4609 = ((_111001 + i4589) << 4 + _11) << 13 + _1001001 i4637 = ((i4609 << 8 + _1010001) << 9 + _11101011) << 9 i4658 = ((_10100101 + i4637) << 10 + _11100101) << 8 + _10001 i4686 = ((i4658 << 11 + _10011011) << 8 + _10001011) << 7 i4706 = ((_1111111 + i4686) << 7 + _100011) << 10 + _1101011 i4732 = ((i4706 << 9 + _10010001) << 5 + _10011) << 10 i4760 = ((_10001 + i4732) << 17 + _10000101) << 8 + _11001111 i4787 = ((i4760 << 7 + _1000111) << 9 + _11011011) << 9 i4806 = ((_10011101 + i4787) << 6 + _101101) << 10 + _111001 i4834 = ((i4806 << 10 + _11111) << 9 + _110011) << 7 i4863 = ((_10101 + i4834) << 11 + _1111) << 15 + _11111011 i4889 = ((i4863 << 7 + _1001101) << 6 + _11001) << 11 i4914 = ((_11110111 + i4889) << 13 + _1111111) << 9 + _10000011 i4942 = ((i4914 << 10 + _11100011) << 10 + _11010011) << 6 i4959 = ((_111011 + i4942) << 10 + _11111111) << 4 + _1001 i4991 = ((i4959 << 12 + _10111111) << 8 + _110001) << 10 i5010 = ((_11001111 + i4991) << 6 + _111111) << 10 + _11011 i5033 = ((i5010 << 11 + _11110001) << 7 + _1111111) << 3 i5060 = ((_11 + i5033) << 13 + _1010001) << 11 + _11101111 i5088 = ((i5060 << 6 + _101111) << 11 + _11010111) << 9 i5109 = ((_10101101 + i5088) << 11 + _11011001) << 7 + _1011101 i5134 = ((i5109 << 9 + _10101011) << 8 + _10010111) << 6 i5161 = ((_100101 + i5134) << 12 + _11001101) << 12 + _10000011 i5192 = ((i5161 << 7 + _1101011) << 10 + _10110011) << 12 i5209 = ((_1100001 + i5192) << 9 + _1001001) << 5 + _1011 i5243 = ((i5209 << 12 + _11100101) << 8 + _110111) << 12 i5264 = ((_11111111 + i5243) << 9 + _11110001) << 9 + _11101101 i5291 = ((i5264 << 9 + _11100111) << 7 + _1100101) << 9 i5314 = ((_1101011 + i5291) << 4 + _11) << 16 + _11001011 i5341 = ((i5314 << 7 + _1010101) << 10 + _10100111) << 8 i5359 = ((_10100001 + i5341) << 4 + _1111) << 11 + _1011101 i5388 = ((i5359 << 10 + _10111101) << 10 + _11111101) << 7 i5406 = ((_1011011 + i5388) << 8 + _1011111) << 7 + _110101 i5435 = ((i5406 << 10 + _10110001) << 8 + _11010011) << 9 i5457 = ((_11011011 + i5435) << 10 + _11101101) << 9 + _1010011 i5485 = ((i5457 << 3 + _11) << 13 + _1001111) << 10 i5506 = ((_1010101 + i5485) << 9 + _10100011) << 9 + _11110111 i5530 = ((i5506 << 8 + _11110011) << 7 + _1011011) << 7 i5547 = ((_111011 + i5530) << 10 + _11010111) << 4 + _1011 i5576 = ((i5547 << 12 + _1000101) << 11 + _11110111) << 4 i5600 = ((_1001 + i5576) << 13 + _11001111) << 8 + _11001011 i5631 = ((i5600 << 9 + _10010111) << 9 + _10101) << 11 i5650 = ((_10011111 + i5631) << 9 + _11011101) << 7 + _1101011 i5676 = ((i5650 << 7 + _100011) << 10 + _10111001) << 7 i5697 = ((_1001011 + i5676) << 8 + _110011) << 10 + _11100011 i5725 = ((i5697 << 8 + _11001001) << 9 + _10011011) << 9 i5744 = ((_10100111 + i5725) << 8 + _11001011) << 8 + _10011001 i5773 = ((i5744 << 7 + _11111) << 11 + _11110111) << 9 i5793 = ((_11100101 + i5773) << 9 + _11010111) << 8 + _10011001 i5821 = ((i5793 << 6 + _11101) << 12 + _11101011) << 8 i5844 = ((_1111001 + i5821) << 9 + _10110111) << 11 + _10100001 i5867 = ((i5844 << 9 + _10111001) << 8 + _11001001) << 4 i5890 = ((_1011 + i5867) << 13 + _11110101) << 7 + _1001001 i5917 = ((i5890 << 8 + _1011101) << 6 + _10111) << 11 i5939 = ((_10010101 + i5917) << 9 + _1011101) << 10 + _11110101 i5969 = ((i5939 << 5 + _1001) << 11 + _1110111) << 12 i5985 = ((_10110011 + i5969) << 8 + _10110101) << 5 + _10111 i6017 = ((i5985 << 12 + _11011111) << 10 + _11111011) << 8 i6037 = ((_10101011 + i6017) << 8 + _11010001) << 9 + _10000011 i6066 = ((i6037 << 9 + _11011111) << 11 + _1010111) << 7 i6088 = ((_110001 + i6066) << 5 + _111) << 14 + _11011111 i6112 = ((i6088 << 6 + _101101) << 9 + _1101101) << 7 i6137 = ((_110111 + i6112) << 9 + _10001) << 13 + _11100011 i6161 = ((i6137 << 8 + _10010001) << 5 + _11001) << 9 i6182 = ((_101101 + i6161) << 10 + _1011101) << 8 + _1110101 i6208 = ((i6182 << 10 + _10101001) << 11 + _10000101) << 3 i6235 = ((_111 + i6208) << 10 + _10101) << 14 + _101001 i6263 = ((i6235 << 10 + _1100001) << 9 + _10010011) << 7 i6283 = ((_100111 + i6263) << 10 + _10111111) << 7 + _1111101 i6314 = ((i6283 << 12 + _11101111) << 9 + _1111101) << 8 return _10111 + i6314 ================================================ FILE: tools/addchain/gen_rust_addchain.py ================================================ #!/usr/bin/env python3 from __future__ import annotations from dataclasses import dataclass from pathlib import Path from typing import List, Tuple ACC_DIR = Path(__file__).resolve().parent OUTPUT_FILE = ( ACC_DIR.parent / "garaga_rs" / "src" / "pairing" / "final_exp_witness" / "addchain_pow_generated.rs" ) CHAINS: List[Tuple[str, str, str]] = [ ("bn254_exp.acc", "bn254", "pow_exp"), ("bn254_exp0.acc", "bn254", "pow_exp0"), ("bn254_r_m_d_inv.acc", "bn254", "pow_r_m_d_inv"), ("bls12_381_h3_s.acc", "bls12_381", "pow_h3_s"), ("bls12_381_e.acc", "bls12_381", "pow_e"), ] @dataclass(frozen=True) class Var: name: str @dataclass(frozen=True) class Add: left: "Expr" right: "Expr" @dataclass(frozen=True) class Shift: value: "Expr" amount: int Expr = Var | Add | Shift @dataclass(frozen=True) class Token: kind: str value: str | int def tokenize(expr: str) -> List[Token]: tokens: List[Token] = [] i = 0 while i < len(expr): ch = expr[i] if ch.isspace(): i += 1 continue if expr.startswith("<<", i): tokens.append(Token("SYMBOL", "<<")) i += 2 continue if ch.isdigit(): j = i + 1 while j < len(expr) and expr[j].isdigit(): j += 1 tokens.append(Token("NUMBER", int(expr[i:j]))) i = j continue if ch.isalpha() or ch == "_": j = i + 1 while j < len(expr) and (expr[j].isalnum() or expr[j] == "_"): j += 1 tokens.append(Token("NAME", expr[i:j])) i = j continue if ch in "+*()": tokens.append(Token("SYMBOL", ch)) i += 1 continue raise ValueError(f"Unexpected character {ch!r} in {expr!r}") return tokens class Parser: def __init__(self, tokens: List[Token]) -> None: self.tokens = tokens self.pos = 0 def _peek(self) -> Token | None: if self.pos >= len(self.tokens): return None return self.tokens[self.pos] def _peek_next(self) -> Token | None: if self.pos + 1 >= len(self.tokens): return None return self.tokens[self.pos + 1] def _match(self, kind: str, value: str | None = None) -> bool: tok = self._peek() if tok is None or tok.kind != kind: return False if value is not None and tok.value != value: return False self.pos += 1 return True def _expect(self, kind: str, value: str | None = None) -> Token: tok = self._peek() if ( tok is None or tok.kind != kind or (value is not None and tok.value != value) ): raise ValueError( f"Expected {kind} {value or ''} at {self.pos}, got {tok!r}" ) self.pos += 1 return tok def parse(self) -> Expr: expr = self._parse_expr() if self._peek() is not None: raise ValueError(f"Unexpected trailing tokens at {self.pos}") return expr def _parse_expr(self) -> Expr: expr = self._parse_chain() while self._match("SYMBOL", "+"): rhs = self._parse_chain() expr = Add(expr, rhs) return expr def _parse_chain(self) -> Expr: expr = self._parse_term() while self._match("SYMBOL", "<<"): amount = self._expect("NUMBER").value if not isinstance(amount, int): raise ValueError("Shift amount must be integer") expr = Shift(expr, amount) if self._match("SYMBOL", "+"): rhs = self._parse_term() expr = Add(expr, rhs) return expr def _parse_term(self) -> Expr: tok = self._peek() if tok and tok.kind == "NUMBER" and tok.value == 2: if self._peek_next() and self._peek_next().kind == "SYMBOL": if self._peek_next().value == "*": self._expect("NUMBER", None) self._expect("SYMBOL", "*") atom = self._parse_atom() return Shift(atom, 1) return self._parse_atom() def _parse_atom(self) -> Expr: if self._match("SYMBOL", "("): expr = self._parse_expr() self._expect("SYMBOL", ")") return expr tok = self._peek() if tok is None: raise ValueError("Unexpected end of expression") if tok.kind == "NAME": self.pos += 1 return Var(str(tok.value)) if tok.kind == "NUMBER": self.pos += 1 if tok.value != 1: raise ValueError(f"Unsupported literal {tok.value}") return Var("1") raise ValueError(f"Unexpected token {tok!r}") def parse_expr(expr: str) -> Expr: tokens = tokenize(expr) return Parser(tokens).parse() def load_chain(path: Path) -> Tuple[List[Tuple[str, Expr]], Expr]: defs: List[Tuple[str, Expr]] = [] return_expr: Expr | None = None for raw_line in path.read_text(encoding="utf-8").splitlines(): line = raw_line.strip() if not line: continue if line.startswith("return"): expr = line[len("return") :].strip() return_expr = parse_expr(expr) continue name, expr = line.split("=", 1) defs.append((name.strip(), parse_expr(expr.strip()))) if return_expr is None: raise ValueError(f"{path} missing return expression") return defs, return_expr class Emitter: def __init__(self) -> None: self.temp_counter = 0 def _temp(self) -> str: name = f"t{self.temp_counter}" self.temp_counter += 1 return name def emit_expr(self, expr: Expr, lines: List[str]) -> str: if isinstance(expr, Var): if expr.name == "1": return "base" return expr.name if isinstance(expr, Add): left = self.emit_expr(expr.left, lines) right = self.emit_expr(expr.right, lines) temp = self._temp() lines.append(f"let {temp} = &{left} * &{right};") return temp if isinstance(expr, Shift): value = self.emit_expr(expr.value, lines) temp = self._temp() lines.append(f"let {temp} = square_n(&{value}, {expr.amount});") return temp raise TypeError(f"Unknown expr type {expr}") def emit_assignment(self, name: str, expr: Expr, indent: str) -> str: self.temp_counter = 0 lines: List[str] = [] result = self.emit_expr(expr, lines) if not lines: return f"{indent}let {name} = {result}.clone();" lines.append(result) inner = "\n".join(f"{indent} {line}" for line in lines) return f"{indent}let {name} = {{\n{inner}\n{indent}}};" def emit_chain_function(name: str, defs: List[Tuple[str, Expr]], ret: Expr) -> str: emitter = Emitter() indent = " " body_lines: List[str] = [f"{indent}let base = base.clone();"] for var, expr in defs: body_lines.append(emitter.emit_assignment(var, expr, indent)) body_lines.append(emitter.emit_assignment("result", ret, indent)) body_lines.append(f"{indent}result") return "\n".join(body_lines) def main() -> int: header_lines = [ "// AUTO-GENERATED: DO NOT EDIT BY HAND.", "// Generated by tools/addchain/gen_rust_addchain.py from:", ] for acc_name, _, _ in CHAINS: header_lines.append(f"// - tools/addchain/{acc_name}") header = "\n".join(header_lines) blocks: List[str] = [ header, "", "use lambdaworks_math::field::element::FieldElement;", "use lambdaworks_math::field::traits::IsField;", "", "fn square_n(x: &FieldElement, n: usize) -> FieldElement {", " let mut t = x.clone();", " for _ in 0..n {", " t = t.square();", " }", " t", "}", "", "pub mod bn254 {", " use super::square_n;", " use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree12ExtensionField;", " use lambdaworks_math::field::element::FieldElement;", "", ] for acc_name, module, func_name in CHAINS: acc_path = ACC_DIR / acc_name defs, ret = load_chain(acc_path) if module != "bn254": continue blocks.append(f" /// Generated from tools/addchain/{acc_name}") blocks.append( f" pub fn {func_name}(base: &FieldElement) -> FieldElement {{" ) blocks.append(emit_chain_function(func_name, defs, ret)) blocks.append(" }") blocks.append("") blocks.append("}") blocks.append("") blocks.append("pub mod bls12_381 {") blocks.append(" use super::square_n;") blocks.append( " use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree12ExtensionField;" ) blocks.append(" use lambdaworks_math::field::element::FieldElement;") blocks.append("") for acc_name, module, func_name in CHAINS: acc_path = ACC_DIR / acc_name defs, ret = load_chain(acc_path) if module != "bls12_381": continue blocks.append(f" /// Generated from tools/addchain/{acc_name}") blocks.append( f" pub fn {func_name}(base: &FieldElement) -> FieldElement {{" ) blocks.append(emit_chain_function(func_name, defs, ret)) blocks.append(" }") blocks.append("") blocks.append("}") blocks.append("") OUTPUT_FILE.write_text("\n".join(blocks), encoding="utf-8") return 0 if __name__ == "__main__": raise SystemExit(main()) ================================================ FILE: tools/garaga_rs/Cargo.toml ================================================ [package] name = "garaga_rs" version = "1.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] name = "garaga_rs" crate-type = ["cdylib", "rlib"] [features] # By default, we don't include any bindings - pure Rust library mode # This allows users to import garaga_rs without pulling in pyo3 or wasm-bindgen default = [] # Enable Python bindings (for maturin builds) python = ["dep:pyo3"] # Enable WASM bindings (for wasm-pack builds) wasm = ["dep:wasm-bindgen", "dep:js-sys"] [dev-dependencies] #proptest = "1.6.0" #proptest-arbitrary-interop = "0.1" test-strategy = "0.4.0" # WASM-specific dev dependencies - only included when target is wasm32 [target.'cfg(target_arch = "wasm32")'.dev-dependencies] wasm-bindgen-test = "0.3" # Platform-specific optional dependencies: # These ensure the right bindings are available only when needed and on the right platform # Python bindings - only available when: # 1. Not on wasm32 target AND # 2. "python" feature is enabled (e.g., when building with maturin) [target.'cfg(not(target_arch = "wasm32"))'.dependencies] pyo3 = { version = "0.28", features = ["extension-module", "num-bigint"], optional = true } # WASM bindings - only available when: # 1. On wasm32 target AND # 2. "wasm" feature is enabled (e.g., when building with wasm-pack) [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = { version = "0.2", optional = true } js-sys = { version = "0.3", optional = true } [dependencies] getrandom = { version = "0.3.1", features = ["wasm_js"] } num-bigint = "0.4" num-integer = "0.1" num-traits = "0.2" hex = "0.4" sha2 = "0.10" sha3 = "0.10" lazy_static = "1.4" rand = "0.9.0" starknet-types-core = { version = "1.0", default-features = false, features = ["curve"] } lambdaworks-crypto = { git = "https://github.com/lambdaclass/lambdaworks.git", rev="be4a329" } lambdaworks-math = { git = "https://github.com/lambdaclass/lambdaworks.git", rev="be4a329" } arbitrary = "1.0" thiserror = "2.0.11" itertools = "0.14" rayon = "1.8" ================================================ FILE: tools/garaga_rs/src/algebra/extf_mul.rs ================================================ use crate::algebra::polynomial::{pad_with_zero_coefficients_to_length, Polynomial}; use crate::definitions::{get_irreducible_poly, CurveParamsProvider}; use lambdaworks_math::field::element::FieldElement; use lambdaworks_math::field::traits::{IsField, IsPrimeField, IsSubFieldOf}; // Returns (Q(X), R(X)) such that Π(Pi)(X) = Q(X) * P_irr(X) + R(X), for a given curve and extension degree. // R(X) is the result of the multiplication in the extension field. // Q(X) is used for verification. pub fn nondeterministic_extension_field_mul_divmod>( ext_degree: usize, ps: Vec>, ) -> (Polynomial, Polynomial) { let mut z_poly = Polynomial::one(); for poly in ps { z_poly = z_poly.mul_with_ref(&poly); } let p_irr = get_irreducible_poly(ext_degree); let (z_polyq, mut z_polyr) = z_poly.divmod(&p_irr); assert!(z_polyr.coefficients.len() <= ext_degree); // Extend polynomial with 0 coefficients to match the expected length. if z_polyr.coefficients.len() < ext_degree { pad_with_zero_coefficients_to_length(&mut z_polyr, ext_degree); } (z_polyq, z_polyr) } pub fn nondeterministic_extension_field_div( x: Polynomial, y: Polynomial, ext_degree: usize, ) -> Polynomial where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, { let a = direct_to_tower(&x.get_coefficients_ext_degree(ext_degree), ext_degree); let b = direct_to_tower(&y.get_coefficients_ext_degree(ext_degree), ext_degree); let div = tower_div(&a, &b, ext_degree); Polynomial::new(tower_to_direct(&div, ext_degree)) } pub fn tower_to_direct(x: &[FieldElement], ext_degree: usize) -> Vec> where F: IsPrimeField + CurveParamsProvider, { assert_eq!(x.len(), ext_degree); let nr_a0 = &FieldElement::::from(F::get_curve_params().nr_a0); match ext_degree { 2 => x.to_vec(), 6 => vec![ &x[0] - nr_a0 * &x[1], &x[2] - nr_a0 * &x[3], &x[4] - nr_a0 * &x[5], x[1].clone(), x[3].clone(), x[5].clone(), ], 12 => vec![ &x[0] - nr_a0 * &x[1], &x[6] - nr_a0 * &x[7], &x[2] - nr_a0 * &x[3], &x[8] - nr_a0 * &x[9], &x[4] - nr_a0 * &x[5], &x[10] - nr_a0 * &x[11], x[1].clone(), x[7].clone(), x[3].clone(), x[9].clone(), x[5].clone(), x[11].clone(), ], _ => panic!("Unsupported extension degree"), } } pub fn direct_to_tower(x: &[FieldElement], ext_degree: usize) -> Vec> where F: IsPrimeField + CurveParamsProvider, { assert_eq!(x.len(), ext_degree); let nr_a0 = &FieldElement::::from(F::get_curve_params().nr_a0); match ext_degree { 2 => x.to_vec(), 6 => vec![ &x[0] + nr_a0 * &x[3], x[3].clone(), &x[1] + nr_a0 * &x[4], x[4].clone(), &x[2] + nr_a0 * &x[5], x[5].clone(), ], 12 => vec![ &x[0] + nr_a0 * &x[6], x[6].clone(), &x[2] + nr_a0 * &x[8], x[8].clone(), &x[4] + nr_a0 * &x[10], x[10].clone(), &x[1] + nr_a0 * &x[7], x[7].clone(), &x[3] + nr_a0 * &x[9], x[9].clone(), &x[5] + nr_a0 * &x[11], x[11].clone(), ], _ => panic!("Unsupported extension degree"), } } pub fn tower_mul( a: &[FieldElement], b: &[FieldElement], ext_degree: usize, ) -> Vec> where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, { assert_eq!(a.len(), ext_degree); assert_eq!(b.len(), ext_degree); match ext_degree { 2 => { let a = to_e2(a.to_vec().try_into().unwrap()); let b = to_e2(b.to_vec().try_into().unwrap()); let c = a * b; from_e2(c).to_vec() } 6 => { let a = to_e6(a.to_vec().try_into().unwrap()); let b = to_e6(b.to_vec().try_into().unwrap()); let c = a * b; from_e6(c).to_vec() } 12 => { let a = to_e12(a.to_vec().try_into().unwrap()); let b = to_e12(b.to_vec().try_into().unwrap()); let c = a * b; from_e12(c).to_vec() } _ => panic!("Unsupported extension degree"), } } pub fn tower_div( a: &[FieldElement], b: &[FieldElement], ext_degree: usize, ) -> Vec> where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, { assert_eq!(a.len(), ext_degree); assert_eq!(b.len(), ext_degree); match ext_degree { 2 => { let a = to_e2(a.to_vec().try_into().unwrap()); let b = to_e2(b.to_vec().try_into().unwrap()); let c = (a / b).unwrap(); from_e2(c).to_vec() } 6 => { let a = to_e6(a.to_vec().try_into().unwrap()); let b = to_e6(b.to_vec().try_into().unwrap()); let c = (a / b).unwrap(); from_e6(c).to_vec() } 12 => { let a = to_e12(a.to_vec().try_into().unwrap()); let b = to_e12(b.to_vec().try_into().unwrap()); let c = (a / b).unwrap(); from_e12(c).to_vec() } _ => panic!("Unsupported extension degree"), } } pub fn tower_inv(a: &[FieldElement], ext_degree: usize) -> Vec> where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, { let mut one = vec![FieldElement::from(0); ext_degree]; one[0] = FieldElement::from(1); tower_div(&one, a, ext_degree) } pub fn to_e2(v: [FieldElement; 2]) -> FieldElement where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]>, { FieldElement::new(v) } pub fn to_e6(v: [FieldElement; 6]) -> FieldElement where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]>, { let [v0, v1, v2, v3, v4, v5] = v; FieldElement::new([to_e2([v0, v1]), to_e2([v2, v3]), to_e2([v4, v5])]) } pub fn to_e12(v: [FieldElement; 12]) -> FieldElement where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, { let [v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11] = v; FieldElement::new([ to_e6([v0, v1, v2, v3, v4, v5]), to_e6([v6, v7, v8, v9, v10, v11]), ]) } pub fn from_e2(v: FieldElement) -> [FieldElement; 2] where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]>, { let [v0, v1] = v.to_subfield_vec().try_into().unwrap(); [v0, v1] } pub fn from_e6(v: FieldElement) -> [FieldElement; 6] where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]>, { let [a1, a2, a3] = v.to_subfield_vec().try_into().unwrap(); let [v0, v1] = from_e2(a1); let [v2, v3] = from_e2(a2); let [v4, v5] = from_e2(a3); [v0, v1, v2, v3, v4, v5] } pub fn from_e12(v: FieldElement) -> [FieldElement; 12] where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, { let [a0, a1] = v.to_subfield_vec().try_into().unwrap(); let [v0, v1, v2, v3, v4, v5] = from_e6(a0); let [v6, v7, v8, v9, v10, v11] = from_e6(a1); [v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11] } pub fn e2_conjugate(a: FieldElement) -> FieldElement where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let [x, y] = from_e2(a); to_e2([x, -y]) } #[cfg(test)] mod tests { use super::*; use crate::definitions::{BLS12381PrimeField, BN254PrimeField}; #[test] fn test_nondeterministic_extension_field_mul_divmod_1() { let ps = [ [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ], [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ], [ "0x1", "0x3049ed443e0ee79060270c9094ac6390a5c1ab3db65328a47174c6c33f6bd5f2", "0x0", "0xa279a60d390f263fa2b23afda6a2160c7af52ea6fdddb7ffe26ded0e216c821", "0x0", "0x0", "0x0", "0x146bccf3dc47e8eedf574326c5188ea8e4978a568116c9aa5b8517cdeb0e1f38", "0x0", "0x10b71d55b795eb0c1590286e48c412e3434b0def1afddfc8840541b6936825fd", "0x0", "0x0", ], [ "0x1", "0x10b80d23f4e55970de219c8bb6cc99af9ca48837a7da389ff6e02693c8912bf3", "0x0", "0x1999e3b5911b71ef05b218f5be987ba6f43afb6a702ffca89c7a6643b411046f", "0x0", "0x0", "0x0", "0x2a00794e593076aab0ec5e6283a9ed0ddbe6ef97af88861febd351722d50802a", "0x0", "0x22583e5a131ce5504fbb720b2081781441eeb10978efac409e27787d1fa359b6", "0x0", "0x0", ], ]; let q = [ "0xe894c747efef08ab122e832492446abf3359cf28786e81ab3a81a74fce2c75b", "0x0", "0x221a77eeae1aacc77e771d8440e698d3b8d2447bb8de2a046cf8c063f7523fb7", "0x0", "0x1d9393fe1dfd5bf8174a7b2086cdc6288de8ee5409946e58d5385d342633aa56", "0x0", "0x122377527927c40e63ddc4c9ef6a51a864d1e6575602045f81ddf7ae83afc4c3", ]; let r = [ "0x11d12be7502f97a642a86eb73802fe0fe4772283c9e66f3d535534c22390e0ca", "0x109dabf551c2a0d785f86365c9f7a4e2aae4c8e3f5bb96b72c3461402f80049e", "0x15e06e6b765f21da4c21d50705a9bf0f72ba0283f93e75a896235fa107d4ca4d", "0x23c17e1664ac6452ffdd3ca599029d07bbea4e54e00dd8289aa145149627cc90", "0x751d37ad50cc00d6245f08ca81ce16f9a3714c3efe87c95ae8e132234b5dd07", "0x0", "0x1535e3c0e51be5f14093e8501425031896dfb26ec8759e3409e44e94d81e17cf", "0xe07f7cf5446bf6fd7f35bd2c741235928fd0f5cc82d853d0b37dd293fe1a21b", "0x2eae2d9b2332fb1f1c3617826ac6ede574d04ed01692a36b9743fc604b3f3bf", "0x2ab0d3ce9813032acfb54c2e7c43299edb854672b7bc17be60c2e1cda8e826c", "0x1f316d8807400efe60a15b7e5311a9031439eb344c0d84fb80044f8786d59de4", "0x0", ]; let ps = ps .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xq = q .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xr = r .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let (q, r) = nondeterministic_extension_field_mul_divmod(12, ps); let q = q.coefficients; let r = r.coefficients; assert_eq!(q, xq); assert_eq!(r, xr); } #[test] fn test_nondeterministic_extension_field_mul_divmod_2() { let ps = [ [ "0x1d7a9ffbbe137d697794dbccbd7925ea98507cf8d4445d3e89123811ede12825", "0x1f45aa2ee73f15e275e5c1fc0ff08be0981a61d8e7642301653a6307c7467811", "0x2446d99f276e4c8bc63d81e8d0c1e37c901a5a569865533968e39b5083fc576e", "0x223bd50b771fcaa905131a5f04c3c634c9df344731b5aada49be919aaa447cc7", "0x24cfef2958a7c9c4d7ddfacdd59750105dcc37f6aefbf4a9ce706bc36252c47", "0x3a974db52b274684955cb370b0ac66e3e295ea6e9789fb7259c294210f7720e", "0x160b7346ec9fdd9841feb355a44845dc30c2a9ae3fb8266ad697b531de5e2fb6", "0xe46af84e1cbba805f204fa5ce1c9a99c79799110a56b5d534495a358f9c739f", "0x1f2b5709d0d7c9499b9524e9708ac412d3fa05fea9b51192113e131bd5572a21", "0x8a75eef583ffc3b0f690cd9eab121b1f329194c1052a86d50224b92838c5d76", "0xef3a64570d17038de7ec74175c125ac7e8780509764f07572ce9593878da9fb", "0x2a6290607745b58a7b87bc78053320664e06d12b35825f15893ad52a39f54331", ], [ "0x14156ca1853095df27f3cb7c50eca75e794d2f14195c16df4a0f8f9dcb48bee9", "0xdc2a20a6107d4c49fed6b2018946bcc2a8dad06f01d099a6df0a4a55ed21b59", "0x14260c5afb0b1148ed80f8339cf9e06ff04257cb6c1817c4efa721fc98f69503", "0xafe8a09df07bf3dffefe512eb9448ef436dd090f98323135baab8ae3c766c60", "0x114692950f53d4f707bb02cc2b5dc98aff5936811707d6579371dae20368253c", "0x2dd3fca72591963149646f1e106dc0ee917551f5a9da397fe12d4a3939ce650c", "0x1750bd450b85cbd62ea3f1b228beff5fd364a127d6054be99a9248497b82062a", "0x1248cfad33a2147726169d3ce55db12ecafd74bc4b83377c168d89b919386546", "0x28d156bac04e64938816b055888399c99a954b82724e5f5589d549a709b2b5ef", "0x39e1ab153bd709556afece475580f453f9126f256fbb49c235bc75082f5f26e", "0x14853f940bf5c557c7f558d3e74e6617d7f08b54fd83597fed1d7e7b9d09e04", "0xaa480d613601947fee14a3ce2b7af4e1872fe49ae3473546aa01a618b78b125", ], ]; let q = [ "0x13e8e196ed7970229c16369f6f62a54fe9848ec0abbb56e77355358805db92a6", "0x29aa20be8afc3104b3211fb1c2636e3291bca41e1276bdbbb485917fae34c150", "0xcbdf387c0036815f944eeedb8a3ed8babb406326444cbed0df3e47fc7a3f440", "0xcc614e3d877550dc9bb19f8dfdc513f2f8fed01d3a180a2a9e475c9a29f6d96", "0x1a6e474f0a5394b39bd15f2390e0cfa64391cb4ffc5d435a63028ac3c744d064", "0x8fc0b38f1129ab34ebd5a5888f0711adecaecc7aa5312cc62508d51da03aa1e", "0xff9b26cf44e068601c663a62662f0ef698166a3410d4f36a68b2e46800daa6e", "0xf4ec161da901a5ab3f6088ede93acdbf15f0c18b653b9f7146d132c6d4111c5", "0x1843faa07a91bed2c949f1b3f126e0ae88d429bf7d37b5e00696b22be53ac607", "0x1c151df931008732415af45f4616affed9e0e64976e66cc5e2e57c799ddfa646", "0x1526c80d7045ccb0ae04a7cf1de7a2519ad52f885c7b9acb7bed0d027459433", ]; let r = [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ]; let ps = ps .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xq = q .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xr = r .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let (q, r) = nondeterministic_extension_field_mul_divmod(12, ps); let q = q.coefficients; let r = r.coefficients; assert_eq!(q, xq); assert_eq!(r, xr); } #[test] fn test_nondeterministic_extension_field_mul_divmod_3() { let ps = [ ["0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0"], ["0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0"], ["0x183a80ffaffb035552f419948ba0d8b0148bb90e6bcbb072eece2a095bc3205571aa45062fb615d5204db9b0c13f16e4", "0x0", "0x141ce6d849b3b3ffd366962219920de592e0ea7888507ff651543f3d3a8c57b5778f9afcad1c00079fa2fc01d02a31de", "0x1", "0x0", "0x0", "0x12b7ea026b36040c682213ecc6663b4f916612568d3ceaa4876f9acffd4c8fb349a27daa5d44ff45bb92b5007dd00a56", "0x0", "0xead53480ba83b742644a3d8bfd432993007ed23c1a85090c6434e1ddd4dc8f16f8f6673fda2e538f5e9e9599b6062bc", "0x0", "0x0", "0x0"], ["0x9cbaaa39d75e767a38004c5e4e834cda92fe4fff0759cdfb078c61cff1349b3342fb6a19dc7ce19412c60791e787332", "0x0", "0x16422cfd0179e176be2c6e27226f61c162e6b3a7051f9e20ca33a1c7e99bd8cd5877aff6a82f042819707e2978027054", "0x1", "0x0", "0x0", "0x12138c3d7561ca85c9104207590388d773edbd1c46ecd9a2c1361c65ba39f487ff39a9d5edbbd942ee1bd5aae5fba357", "0x0", "0x709ac70c47538c5c9b0049aed2d39ed130b9053cd39a2c8534dfa6cb7ae9a6e13d78c0d5c7382ae146e085e91eeb43c", "0x0", "0x0", "0x0"], ["0x9f80115619172e4eaaf3a62b7d000cc462cff591e011ff8c39ec0595d8b263320711ed10ee74568947c52ac80f129bc", "0x0", "0x31679196cf9cc8a93705f2bb6cbcbb0e7b0196b962472706b416552474f667dd33b2d50a9800ac99110e7750e1d1618", "0x1", "0x0", "0x0", "0x4569b6e40372c16710ab2e2f85b80033cfab50f70f991c76de84083a53f47d14e26fa59b9a8fc74f8b95bcefb1f92fb", "0x0", "0x11efd369477790f94456f4fc5baea8c480249c8f56623b31e444435bd1e8b39e757ca81b8d19b958d6b425a17c15ec7f", "0x0", "0x0", "0x0"], ["0x142105c43e7e33dbcc983f7b693970ae4ea601a5c627832343932cf6f182d6ef712a0d4b0cfbfb92da1e505c39cf5bc0", "0x0", "0x83e650c23da50b57d95f2ef421a27900ff6e0f98249dd136de37c6c48fa04f830455843af17f7b00406d3ee2534e65d", "0x1", "0x0", "0x0", "0x15ad49314f1e2bbf517f7d37bb828abdedefb77d9e7762477bac0436451e74e9131399b84307d62da5495a0f3708b9cb", "0x0", "0x195ed72d7f572bb7dc0a78b45f824d75e155eb0dc7430f1544193109d75e4dbf5167d465a21b346c1ece84d7938e7107", "0x0", "0x0", "0x0"], ]; let q = ["0x15b1a92444c003fd30d2759337ee1d2b521d89eb3e8d5f9c89def701a70b9e590d409ee54018189157fb5b83fbc6e281", "0x3b383b5cd40d3b067def58412145c9dabdd2b59b7cd1cf07f832e97d05219ca794c099ba76477110a811e0a886fb833", "0xadbf541db6df55a263938da2e0ae43b6c9217f748fc8d2e668133cc88eec729e76b65fc361a4b58266ae0c46b5d3b7e", "0x19da2ede02f3dc475518f4df24b7478c26ef3e18edce534e307f24161b09dd2f287fe8a27c63bd9f145b2a3f782eb0d1", "0x13f314681f4f7af49a1de550de5c171c36fa385ab2c0ecdbc73aee60cf8374ab43795b72d38f3e3bfe70505932163789", "0x12426b3d3990b9b961f1686e6274f1b97fbd3646512c80a0e5ee05c2ff5193709e760abbb6c676531078a768bedd7124", "0x10c8f0fec5ead5f4d5d7bb706d5e3da8f609a48a4da086ee82bc3b9d27ef5e52af16c8b309cf88c0d433985fc56b1e42", "0x5cb67da1dd940f40ecffb3f4683b6f6253fc005fbd345d5fa74ed9b0c33de90b875699040e7a4298059eb58baced6bf", "0xecffb82dcfdf5bdf438503c919684f0cfe228611387f6b404c7fdd0d0a4c1f2615e65450f4cc416f27038f083bc5e9c", "0x44b8912d0d9311ae5eb2205969a85d426b3d6c5d58cd3db35ffe118abb24510c503b91a0c476274832acc12327506d8", "0x151de551fd53045ea8127ed3887126378157871289970127638dcf0214f26b2c946216c5e4418a0b5b8e19e14984714b", "0x1b9bcc051f541e88e9377684505f5ded93b7d350b427ec2ba79970220ad2f6f781be5559762b1789038fe7c8f1d8fd7", "0x539e9ef4cfe0c1c409c6b724f8420997dcd0d0e0b8c12d44a883d8188fc1f8802753128bcb3533c154c449e4986e2d7", "0x10e1aafbcaeb68abb0fa69263c5a78ffea85c3fcee39a9ea478f3e7953407c81d32bb8808bde55c8c2b4fd37a4aeea73", "0x17b51d4ffaf4e7cb1b66757d4658959ee4492146684bac3062740594c753d58362c79d57ba6a46323404ea6219f70a51", "0xc0084a4d0393cd3768c8733ac77addd268dd86fcd3de379a08aab70a1a96c8bad202694ab0cc9e9dd401bf576ccc0ac", "0x14fdce739f217fefb6716848b5618143fdfb07de6c348ce5d0dcaaf3d3dfb07f8bc0883376eb80ccdc7db9ca23acee1c", "0x0", "0x2b05f7876fe128e401cd7f696383c57f638f58d1dd09fdcbd0d28ff4561e9e3f3a90da3b62783914f74a2bce9c76cfc", "0x0", "0x186ebefaece7849868ec8c230d6c288155e9f9376c0e6db3e75dbd02d80456323a4bfd6ea33441ab580942a3fe2f9364"]; let r = ["0xc71fb5b76cf57e5c7c9dbbd201062289f97dedce8bbb72d15abaec86c40039d3b4f3fccb7338ff3e7701b7f6619769b", "0x129a0a7e9efe3f397b5dbcae1f22f39c0cbcf4d183ead8de682a7571560cc28f2c13ecc7628b11dda4fcc3eaef203a45", "0x162ca20e57a4ad07f919b85c9975acd11d5f0cddd22192ebc465e5a89a0546be2ec98581fcda54c808aa8790189addd6", "0x10a05ef6bc41b1ac2ba68a585a4c7016589ffad9c5412bf00fd0f50f8ac9ea3d9a7db639e62eae3ca960447fb588a60b", "0x16dbc5bd5769b32d94959f3a71085f5adc66454928e158caeecda06706afd32cea844001820431c1f3534760c01c3ce5", "0x199988fcc386f48448a34d747599bd68a9bb4993cc0e6d2434e9182475096fe323352ae743be4cec47278fbbb8d52f52", "0x189109c92dac219f6b362d169e4ca995bbd0536c8727610f0f361f3490e9d41a94c69d397c1401b31b5a973bc393f3b1", "0x19ea64dde64bbb01d1072ca0532cbe26f8227deaf22155b2ba4bacf79ec45d43bbecca1bb35c6efdd163d6d7ff862979", "0xd9b819680b2cfa830393d2a883cbf07d691020e2a01580c62c9bb1869a1c40317ab6b0df57ff873f2b4bc93d71985e5", "0x704a7bc9193e53c9dde39b3a0a34d0e76345261a4caa612bb3ee39b3715a0d649760f83a32b24cc4b37fe549e80afde", "0x117957ce838607a66a58785c7af8af5a2d3a1832a559f19b20af84c9a5e968cabea23dd6815968b93234b9b34f8108e1", "0xae22d05bd7cd226ba438387b13606f1ad88319c787ccdcec28ab4de6e9bd5fd1ede497ebb746c3313cd6655b961689d"]; let ps = ps .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xq = q .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xr = r .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let (q, r) = nondeterministic_extension_field_mul_divmod(12, ps); let q = q.coefficients; let r = r.coefficients; assert_eq!(q, xq); assert_eq!(r, xr); } #[test] fn nondeterministic_extension_field_div_1() { let x = [ "0x2f6a437ba87bf892de86475ec2155dd6bf2acf7ddb7ad74c028c1a0bd146a17d", "0xc2fc4dd8bf1d0a89f2a486ff97fe6ba7ef3267310f51196b7463fd620b3b35a", ]; let y = [ "0x2590bd4bb718dbd69556e3011b96811fc7a3ced21887a6f699cd9802cdf4fb54", "0x120d13a0b0bfe0ebd93d335ad218672b78966266e1671de6ab59b5b9a2452eb6", ]; let z = [ "0x237db2935c4432bc98005e68cacde68a193b54e64d347301094edcbfa224d3d5", "0x124077e14a7d826a707c3ec1809ae9bafafa05dd6b4ba735fba44e801d415637", ]; let x = Polynomial::new( x.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let y = Polynomial::new( y.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xz = z .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree12ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree6ExtensionField; let z = nondeterministic_extension_field_div::< BN254PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(x, y, 2); let z = z.coefficients; assert_eq!(z, xz); } #[test] fn nondeterministic_extension_field_div_2() { let x = [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ]; let y = [ "0x14156ca1853095df27f3cb7c50eca75e794d2f14195c16df4a0f8f9dcb48bee9", "0xdc2a20a6107d4c49fed6b2018946bcc2a8dad06f01d099a6df0a4a55ed21b59", "0x14260c5afb0b1148ed80f8339cf9e06ff04257cb6c1817c4efa721fc98f69503", "0xafe8a09df07bf3dffefe512eb9448ef436dd090f98323135baab8ae3c766c60", "0x114692950f53d4f707bb02cc2b5dc98aff5936811707d6579371dae20368253c", "0x2dd3fca72591963149646f1e106dc0ee917551f5a9da397fe12d4a3939ce650c", "0x1750bd450b85cbd62ea3f1b228beff5fd364a127d6054be99a9248497b82062a", "0x1248cfad33a2147726169d3ce55db12ecafd74bc4b83377c168d89b919386546", "0x28d156bac04e64938816b055888399c99a954b82724e5f5589d549a709b2b5ef", "0x39e1ab153bd709556afece475580f453f9126f256fbb49c235bc75082f5f26e", "0x14853f940bf5c557c7f558d3e74e6617d7f08b54fd83597fed1d7e7b9d09e04", "0xaa480d613601947fee14a3ce2b7af4e1872fe49ae3473546aa01a618b78b125", ]; let z = [ "0x1d7a9ffbbe137d697794dbccbd7925ea98507cf8d4445d3e89123811ede12825", "0x1f45aa2ee73f15e275e5c1fc0ff08be0981a61d8e7642301653a6307c7467811", "0x2446d99f276e4c8bc63d81e8d0c1e37c901a5a569865533968e39b5083fc576e", "0x223bd50b771fcaa905131a5f04c3c634c9df344731b5aada49be919aaa447cc7", "0x24cfef2958a7c9c4d7ddfacdd59750105dcc37f6aefbf4a9ce706bc36252c47", "0x3a974db52b274684955cb370b0ac66e3e295ea6e9789fb7259c294210f7720e", "0x160b7346ec9fdd9841feb355a44845dc30c2a9ae3fb8266ad697b531de5e2fb6", "0xe46af84e1cbba805f204fa5ce1c9a99c79799110a56b5d534495a358f9c739f", "0x1f2b5709d0d7c9499b9524e9708ac412d3fa05fea9b51192113e131bd5572a21", "0x8a75eef583ffc3b0f690cd9eab121b1f329194c1052a86d50224b92838c5d76", "0xef3a64570d17038de7ec74175c125ac7e8780509764f07572ce9593878da9fb", "0x2a6290607745b58a7b87bc78053320664e06d12b35825f15893ad52a39f54331", ]; let x = Polynomial::new( x.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let y = Polynomial::new( y.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xz = z .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree12ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree6ExtensionField; let z = nondeterministic_extension_field_div::< BN254PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(x, y, 12); let z = z.coefficients; assert_eq!(z, xz); } #[test] fn nondeterministic_extension_field_div_3() { let x = ["0xcebfbdf0b4abf3a47cd17cf6b889effc2af960568f453fe4b87e955f8a854ba4df986c2aa1974e16b32c53379d3e81f", "0x8acd6cd869315ed3703b767ffdbb324a2e3f13b6352bdcb503496ebf38b120e3b623f3a913c43356e4431c1e9ca9332"]; let y = ["0x19cbaa4ee4fadc2319939b8db45c6a355bfb3755197ba74eda8534d2a2c1a2592475939877594513c326a90c11705002", "0xc0d89405d4e69986559a56057851733967c50fd0b4ec75e4ce92556ae5d33567e6e1a4eb9d83b4355520ebfe0bef37c"]; let z = ["0x15a76ee3d8d1c3451005d56067cd27cf7598a85f81c23cd926ad0ec05ad6440f1df034cf36701a5831c9fb39250e2ea9", "0x16d96e785c797fb5d6afcb1400d7656829a6a71c42deb7ddce5cd2ccda4704dc0e4b92b69009367bbf6e6aa19488df66"]; let x = Polynomial::new( x.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let y = Polynomial::new( y.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xz = z .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree6ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree12ExtensionField; let z = nondeterministic_extension_field_div::< BLS12381PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(x, y, 2); let z = z.coefficients; assert_eq!(z, xz); } } ================================================ FILE: tools/garaga_rs/src/algebra/g1g2pair.rs ================================================ use crate::algebra::g1point::G1Point; use crate::algebra::g2point::G2Point; use crate::definitions::{CurveParamsProvider, FieldElement}; use lambdaworks_math::field::traits::{IsField, IsPrimeField, IsSubFieldOf}; #[derive(Debug, Clone)] pub struct G1G2Pair where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]>, { pub g1: G1Point, pub g2: G2Point, } impl G1G2Pair where F: IsPrimeField + IsSubFieldOf + CurveParamsProvider, E2: IsField; 2]>, { pub fn new(g1: G1Point, g2: G2Point) -> Self { Self { g1, g2 } } pub fn flatten(&self) -> Vec> { let mut elements = vec![]; let (x, y) = self.g1.get_coords(); elements.push(x[0].clone()); elements.push(y[0].clone()); let (x, y) = self.g2.get_coords(); elements.push(x[0].clone()); elements.push(x[1].clone()); elements.push(y[0].clone()); elements.push(y[1].clone()); elements } } ================================================ FILE: tools/garaga_rs/src/algebra/g1point.rs ================================================ use crate::definitions::{CurveParamsProvider, FieldElement}; use lambdaworks_math::field::traits::IsPrimeField; use num_bigint::{BigInt, BigUint, Sign}; #[derive(Debug, Clone)] pub struct G1Point { pub x: FieldElement, pub y: FieldElement, pub iso_point: bool, } impl G1Point { pub fn is_infinity(&self) -> bool { let zero = FieldElement::zero(); self.x.eq(&zero) && self.y.eq(&zero) } pub fn representative(&self) -> String { format!( "({:?}, {:?})", self.x.representative().to_string(), self.y.representative().to_string() ) } } impl> G1Point { pub fn get_coords(&self) -> ([FieldElement; 1], [FieldElement; 1]) { ([self.x.clone()], [self.y.clone()]) } pub fn new(x: FieldElement, y: FieldElement, iso_point: bool) -> Result { let point = Self { x, y, iso_point }; if !point.is_infinity() && !point.is_on_curve() { return Err(format!( "Point ({:?}, {:?}) is not on the curve", point.x.representative().to_string(), point.y.representative().to_string(), )); } Ok(point) } pub fn new_unchecked(x: FieldElement, y: FieldElement, iso_point: bool) -> Self { Self { x, y, iso_point } } pub fn add(&self, other: &G1Point) -> G1Point { assert!(self.iso_point == other.iso_point); if self.is_infinity() { return other.clone(); } if other.is_infinity() { return self.clone(); } if self.x == other.x && self.y != other.y { return Self::new_unchecked( FieldElement::::zero(), FieldElement::::zero(), self.iso_point, ); } let lambda = if self.eq(other) { let curve_params = F::get_curve_params(); let alpha = if self.iso_point { let swu_params = curve_params.swu_params.unwrap(); swu_params.a } else { curve_params.a }; let numerator = FieldElement::::from(3_u64) * &self.x.square() + alpha; let denominator = FieldElement::::from(2_u64) * &self.y; numerator / denominator } else { (&other.y - &self.y) / (&other.x - &self.x) } .unwrap(); let x3 = &lambda.square() - &self.x - &other.x; let y3 = &lambda * &(self.x.clone() - &x3) - &self.y; Self::new_unchecked(x3, y3, self.iso_point) } pub fn neg(&self) -> Self { if self.is_infinity() { self.clone() } else { Self::new_unchecked(self.x.clone(), -self.y.clone(), self.iso_point) } } pub fn scalar_mul_neg_3(&self) -> G1Point { let double_point = self.add(self); let triple_point = self.add(&double_point); triple_point.neg() } pub fn scalar_mul(&self, scalar: BigInt) -> G1Point { if self.is_infinity() { return self.clone(); } if scalar == BigInt::ZERO { return Self::new_unchecked( FieldElement::::zero(), FieldElement::::zero(), self.iso_point, ); } let mut result = Self::new_unchecked( FieldElement::::zero(), FieldElement::::zero(), self.iso_point, ); let mut base = self.clone(); //println!("scalar mul scalar: {:?}", scalar); let sign = scalar.sign(); let abs_scalar = match sign { Sign::Plus => scalar, Sign::Minus => -scalar, _ => scalar, }; let mut scalar: BigUint = abs_scalar.to_biguint().unwrap(); while scalar > BigUint::ZERO { if &scalar & BigUint::from(1_u64) != BigUint::ZERO { result = result.add(&base); } base = base.add(&base); scalar >>= 1; } if sign == num_bigint::Sign::Minus { result = result.neg(); } result } pub fn is_on_curve(&self) -> bool { if self.is_infinity() { return true; } let curve_params = F::get_curve_params(); let (a, b) = if self.iso_point { let swu_params = curve_params.swu_params.unwrap(); (swu_params.a, swu_params.b) } else { (curve_params.a, curve_params.b) }; self.y.square() == self.x.clone().square() * self.x.clone() + a * self.x.clone() + b } pub fn print(&self) { println!( "G1Point: x = {:?}, y = {:?}", self.x.representative().to_string(), self.y.representative().to_string() ); } pub fn generator() -> Self { let curve_params = F::get_curve_params(); let generator_x = curve_params.g_x; let generator_y = curve_params.g_y; G1Point::new(generator_x, generator_y, false).unwrap() } pub fn msm(points: &[Self], scalars: &[BigUint]) -> Self { assert!(!points.is_empty()); assert_eq!(points.len(), scalars.len()); let mut result = points[0].scalar_mul(scalars[0].clone().into()); for i in 1..points.len() { result = result.add(&points[i].scalar_mul(scalars[i].clone().into())); } result } pub fn new_infinity() -> Self { G1Point::new_unchecked(FieldElement::::zero(), FieldElement::::zero(), false) } } impl PartialEq for G1Point { fn eq(&self, other: &Self) -> bool { self.x == other.x && self.y == other.y } } ================================================ FILE: tools/garaga_rs/src/algebra/g2point.rs ================================================ use crate::algebra::extf_mul::{from_e2, to_e2}; use crate::definitions::{CurveParamsProvider, FieldElement}; use crate::io::biguint_to_u256; use lambdaworks_math::elliptic_curve::short_weierstrass::traits::IsShortWeierstrass; use lambdaworks_math::field::traits::{IsField, IsPrimeField, IsSubFieldOf}; use num_bigint::{BigInt, BigUint, Sign}; #[derive(Debug, Clone)] pub struct G2Point where F: IsPrimeField + IsSubFieldOf, E2: IsField; 2]>, { pub x: FieldElement, pub y: FieldElement, } impl G2Point where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { pub fn get_coords(&self) -> ([FieldElement; 2], [FieldElement; 2]) { (from_e2(self.x.clone()), from_e2(self.y.clone())) } pub fn representative(&self) -> String { let ([x0, x1], [y0, y1]) = self.get_coords(); format!( "G2Point: X = ({:?}, {:?}), Y = ({:?}, {:?})", x0.representative().to_string(), x1.representative().to_string(), y0.representative().to_string(), y1.representative().to_string() ) } pub fn new(x: [FieldElement; 2], y: [FieldElement; 2]) -> Result { let x = to_e2(x); let y = to_e2(y); let point = Self { x, y }; if !point.is_infinity() && !point.is_on_curve() { let x = from_e2(point.x); let y = from_e2(point.y); return Err(format!( "Point (({:?}, {:?}), ({:?}, {:?})) is not on the curve", x[0].representative().to_string(), x[1].representative().to_string(), y[0].representative().to_string(), y[1].representative().to_string(), )); } Ok(point) } pub fn new_unchecked(x: FieldElement, y: FieldElement) -> Self { Self { x, y } } pub fn is_infinity(&self) -> bool { let zero = to_e2([FieldElement::zero(), FieldElement::zero()]); self.x.eq(&zero) && self.y.eq(&zero) } pub fn neg(&self) -> Self { if self.is_infinity() { self.clone() } else { G2Point::new_unchecked(self.x.clone(), -self.y.clone()) } } pub fn is_on_curve(&self) -> bool { if self.is_infinity() { return true; } let curve_params = F::get_curve_params(); let a = curve_params.a; let b = to_e2([curve_params.b20, curve_params.b21]); self.y.square() == self.x.clone().square() * self.x.clone() + a * self.x.clone() + b } pub fn generator() -> Self { let curve_params = F::get_curve_params(); let generator_x = curve_params .g2_x .expect("G2 generator coordinates not defined for this curve"); let generator_y = curve_params .g2_y .expect("G2 generator coordinates not defined for this curve"); G2Point::new(generator_x, generator_y).unwrap() } pub fn compute_doubling_slope(a: &Self) -> FieldElement { let [x, y] = &from_e2(a.x.clone()); let num = to_e2([ (x + y) * (x - y) * FieldElement::::from(3), x * y * FieldElement::::from(6), ]); (num / (&a.y + &a.y)).unwrap() } pub fn compute_adding_slope(a: &Self, b: &Self) -> FieldElement { ((&a.y - &b.y) / (&a.x - &b.x)).unwrap() } pub fn new_infinity() -> Self { let zero = to_e2([FieldElement::zero(), FieldElement::zero()]); G2Point::new_unchecked(zero.clone(), zero) } pub fn add(&self, other: &G2Point) -> G2Point where C: IsShortWeierstrass, { g2_point_add::(self.clone(), other.clone()) } pub fn scalar_mul(&self, scalar: BigInt) -> G2Point where C: IsShortWeierstrass, { if self.is_infinity() { return self.clone(); } if scalar == BigInt::ZERO { return Self::new_infinity(); } let base = self.clone(); let sign = scalar.sign(); let abs_scalar = match sign { Sign::Plus => scalar, Sign::Minus => -scalar, _ => scalar, }; let scalar: BigUint = abs_scalar.to_biguint().unwrap(); let mut result = g2_point_scalar_mul::(base, scalar); if sign == num_bigint::Sign::Minus { result = result.neg(); } result } } fn g2_point_add(a: G2Point, b: G2Point) -> G2Point where F: IsPrimeField + IsSubFieldOf + CurveParamsProvider, E2: IsField; 2]>, C: IsShortWeierstrass, { use lambdaworks_math::cyclic_group::IsGroup; use lambdaworks_math::elliptic_curve::short_weierstrass::point::ShortWeierstrassProjectivePoint; use lambdaworks_math::elliptic_curve::traits::FromAffine; let a = ShortWeierstrassProjectivePoint::::from_affine(a.x, a.y).unwrap(); let b = ShortWeierstrassProjectivePoint::::from_affine(b.x, b.y).unwrap(); let c = a.operate_with(&b).to_affine(); if c.z() == &FieldElement::zero() { G2Point::new_infinity() } else { let x = c.x().value().clone(); let y = c.y().value().clone(); G2Point::new(x, y).unwrap() } } fn g2_point_scalar_mul(a: G2Point, k: BigUint) -> G2Point where F: IsPrimeField + IsSubFieldOf + CurveParamsProvider, E2: IsField; 2]>, C: IsShortWeierstrass, { use lambdaworks_math::cyclic_group::IsGroup; use lambdaworks_math::elliptic_curve::short_weierstrass::point::ShortWeierstrassProjectivePoint; use lambdaworks_math::elliptic_curve::traits::FromAffine; let a = ShortWeierstrassProjectivePoint::::from_affine(a.x, a.y).unwrap(); let c = a.operate_with_self(biguint_to_u256(&k)).to_affine(); if c.z() == &FieldElement::zero() { G2Point::new_infinity() } else { let x = c.x().value().clone(); let y = c.y().value().clone(); G2Point::new(x, y).unwrap() } } ================================================ FILE: tools/garaga_rs/src/algebra/polynomial.rs ================================================ use crate::definitions::FieldElement; use lambdaworks_math::field::traits::IsPrimeField; #[derive(Debug, Clone)] pub struct Polynomial { pub coefficients: Vec>, // Cache the degree to avoid recomputing it degree: isize, } impl Polynomial { pub fn get_coefficients_ext_degree(&self, ext_degree: usize) -> Vec> { assert!(self.coefficients.len() <= ext_degree); let mut coefficients = self.coefficients.clone(); coefficients.resize(ext_degree, FieldElement::zero()); coefficients } pub fn new(mut coefficients: Vec>) -> Self { // Find the position of the last non-zero coefficient let last_non_zero = coefficients .iter() .rposition(|x| *x != FieldElement::zero()); // Truncate the vector to remove trailing zeros let degree = if let Some(pos) = last_non_zero { coefficients.truncate(pos + 1); pos as isize } else { // All coefficients are zero, return a zero polynomial coefficients = vec![FieldElement::zero()]; -1 }; Self { coefficients, degree, } } pub fn print_as_sage_poly(&self) -> String { let var_name = 'x'; if self.degree == -1 { return String::new(); } let mut string = String::new(); let zero = FieldElement::::zero(); for (i, coeff) in self.coefficients.iter().rev().enumerate() { if *coeff == zero { continue; } let coeff_str = coeff.representative().to_string(); if i == self.coefficients.len() - 1 { string.push_str(&coeff_str); } else if i == self.coefficients.len() - 2 { string.push_str(&format!("{}*{} + ", coeff_str, var_name)); } else { string.push_str(&format!( "{}*{}^{} + ", coeff_str, var_name, self.coefficients.len() - 1 - i )); } } string } #[inline] pub fn degree(&self) -> isize { // Use cached degree value self.degree } pub fn evaluate(&self, x: &FieldElement) -> FieldElement { // Use Horner's method for polynomial evaluation if self.degree == -1 { return FieldElement::zero(); } let mut result = self.coefficients[self.degree as usize].clone(); for i in (0..self.degree as usize).rev() { result = &result * x + &self.coefficients[i]; } result } pub fn leading_coefficient(&self) -> FieldElement { if self.degree == -1 { return FieldElement::zero(); } self.coefficients[self.degree as usize].clone() } pub fn zero() -> Self { Self { coefficients: vec![FieldElement::::zero()], degree: -1, } } pub fn one() -> Self { Self { coefficients: vec![FieldElement::::one()], degree: 0, } } pub fn mul_with_ref(&self, other: &Polynomial) -> Polynomial { if self.degree == -1 || other.degree == -1 { return Polynomial::zero(); } let result_len = (self.degree + other.degree + 1) as usize; let mut result_coeffs = vec![FieldElement::::zero(); result_len]; for (i, self_coeff) in self.coefficients.iter().enumerate() { for (j, other_coeff) in other.coefficients.iter().enumerate() { result_coeffs[i + j] += self_coeff * other_coeff; } } // We already know the degree, so construct directly let degree = self.degree + other.degree; Polynomial { coefficients: result_coeffs, degree, } } pub fn divmod(self, denominator: &Self) -> (Self, Self) { let den_deg = denominator.degree; if den_deg == -1 { panic!("Division by zero polynomial"); } let num_deg = self.degree; let mut remainder = self.clone(); if num_deg < den_deg { return (Polynomial::zero(), self); } let mut quotient_coeffs = vec![FieldElement::::zero(); (num_deg - den_deg + 1) as usize]; let denom_lead_inv = denominator.leading_coefficient().inv().unwrap(); let mut rem_deg = num_deg; while rem_deg >= den_deg { let shift = rem_deg - den_deg; let coefficient = &remainder.coefficients[rem_deg as usize] * &denom_lead_inv; quotient_coeffs[shift as usize] = coefficient.clone(); let subtractee = denominator .scale_by_coeff(&coefficient) .shift(shift as usize); remainder = remainder - subtractee; rem_deg = remainder.degree; } let degree = num_deg - den_deg; let quotient = Polynomial { coefficients: quotient_coeffs, degree, }; (quotient, remainder) } pub fn shift(&self, shift: usize) -> Self { if self.degree == -1 { return Polynomial::zero(); } let mut shifted_coeffs = vec![FieldElement::::zero(); shift]; shifted_coeffs.extend(self.coefficients.clone()); Self { coefficients: shifted_coeffs, degree: self.degree + shift as isize, } } pub fn divfloor(&self, denominator: &Self) -> Self { let (quotient, _remainder) = self.clone().divmod(denominator); quotient } pub fn differentiate(&self) -> Self { if self.degree <= 0 { return Polynomial::zero(); } let new_deg = self.degree - 1; let mut new_coeffs = vec![FieldElement::::zero(); new_deg as usize + 1]; for i in 1..=self.degree as usize { let u_64 = i as u64; let degree = &FieldElement::::from(u_64); new_coeffs[i - 1] = &self.coefficients[i] * degree; } Polynomial { coefficients: new_coeffs, degree: new_deg, } } pub fn xgcd(&self, other: &Polynomial) -> (Polynomial, Polynomial, Polynomial) { let mut old_r = self.clone(); let mut r = other.clone(); let mut old_s = Polynomial::one(); let mut s = Polynomial::zero(); let mut old_t = Polynomial::zero(); let mut t = Polynomial::one(); while r.degree != -1 { let quotient = old_r.clone().div_with_ref(&r); let new_r = old_r - quotient.clone().mul_with_ref(&r); old_r = r; r = new_r; let new_s = old_s - quotient.clone().mul_with_ref(&s); old_s = s; s = new_s; let new_t = old_t - quotient.clone().mul_with_ref(&t); old_t = t; t = new_t; } let lcinv = old_r.leading_coefficient().inv().unwrap(); ( old_s.scale_by_coeff(&lcinv), old_t.scale_by_coeff(&lcinv), old_r.scale_by_coeff(&lcinv), ) } pub fn div_with_ref(self, dividend: &Self) -> Self { let (quotient, _remainder) = self.divmod(dividend); quotient } pub fn scale_by_coeff(&self, coeff: &FieldElement) -> Polynomial { if *coeff == FieldElement::zero() { return Polynomial::zero(); } if self.degree == -1 { return Polynomial::zero(); } let scaled_coeffs = self.coefficients.iter().map(|c| c * coeff).collect(); // Degree remains the same when scaling by non-zero coefficient Polynomial { coefficients: scaled_coeffs, degree: self.degree, } } } pub fn pad_with_zero_coefficients_to_length(pa: &mut Polynomial, n: usize) { if pa.coefficients.len() < n { pa.coefficients.resize(n, FieldElement::zero()); // Degree doesn't change when adding trailing zeros } } pub fn pad_with_zero_coefficients( pa: &Polynomial, pb: &Polynomial, ) -> (Polynomial, Polynomial) { let mut pa = pa.clone(); let mut pb = pb.clone(); if pa.coefficients.len() > pb.coefficients.len() { pad_with_zero_coefficients_to_length(&mut pb, pa.coefficients.len()); } else { pad_with_zero_coefficients_to_length(&mut pa, pb.coefficients.len()); } (pa, pb) } impl std::ops::Add<&Polynomial> for &Polynomial { type Output = Polynomial; fn add(self, a_polynomial: &Polynomial) -> Self::Output { let (pa, pb) = pad_with_zero_coefficients(self, a_polynomial); // Calculate new coefficients let mut new_coefficients = Vec::with_capacity(pa.coefficients.len()); for (x, y) in pa.coefficients.iter().zip(pb.coefficients.iter()) { new_coefficients.push(x + y); } // Find max degree - this is a potential optimization spot if we find this is slow let degree = if self.degree > a_polynomial.degree { self.degree } else if self.degree < a_polynomial.degree { a_polynomial.degree } else { // If degrees are equal, we need to check if leading terms cancel out let mut max_deg = self.degree; // Find the actual degree by scanning backward for first non-zero term while max_deg >= 0 && new_coefficients[max_deg as usize] == FieldElement::::zero() { max_deg -= 1; } max_deg }; // If degree is -1, ensure we have a single zero if degree == -1 { Polynomial::zero() } else { // Trim the vector to actual degree + 1 new_coefficients.truncate(degree as usize + 1); Polynomial { coefficients: new_coefficients, degree, } } } } impl std::ops::Add for Polynomial { type Output = Polynomial; fn add(self, other: Polynomial) -> Polynomial { // Fast path for zeros if self.degree == -1 { return other; } if other.degree == -1 { return self; } let (mut longer, shorter, longer_deg) = if self.degree >= other.degree { (self.coefficients, other.coefficients, self.degree) } else { (other.coefficients, self.coefficients, other.degree) }; // Add shorter polynomial terms to longer one for (i, coeff) in shorter.into_iter().enumerate() { longer[i] += coeff; } // Check if the degree has changed due to cancellations let mut actual_deg = longer_deg; while actual_deg >= 0 && longer[actual_deg as usize] == FieldElement::::zero() { actual_deg -= 1; } if actual_deg == -1 { Polynomial::zero() } else { longer.truncate(actual_deg as usize + 1); Polynomial { coefficients: longer, degree: actual_deg, } } } } impl std::ops::Neg for &Polynomial { type Output = Polynomial; fn neg(self) -> Polynomial { if self.degree == -1 { return Polynomial::zero(); } Polynomial { coefficients: self.coefficients.iter().map(|c| -c).collect(), degree: self.degree, } } } impl std::ops::Neg for Polynomial { type Output = Polynomial; fn neg(self) -> Polynomial { -&self } } impl std::ops::Sub for Polynomial { type Output = Polynomial; fn sub(self, other: Polynomial) -> Polynomial { // Fast path for zeros if self.degree == -1 { return -other; } if other.degree == -1 { return self; } self + (-other) } } impl PartialEq for Polynomial { fn eq(&self, other: &Self) -> bool { // Quick check based on degree if self.degree != other.degree { return false; } // If both are zero polynomials if self.degree == -1 { return true; } // Compare coefficients for i in 0..=self.degree as usize { if self.coefficients[i] != other.coefficients[i] { return false; } } true } } impl std::ops::Mul<&Polynomial> for &Polynomial { type Output = Polynomial; fn mul(self, factor: &Polynomial) -> Polynomial { self.mul_with_ref(factor) } } impl std::ops::Mul> for Polynomial { type Output = Polynomial; fn mul(self, factor: Polynomial) -> Polynomial { &self * &factor } } impl std::ops::Mul> for &Polynomial { type Output = Polynomial; fn mul(self, factor: Polynomial) -> Polynomial { self * &factor } } impl std::ops::Mul<&Polynomial> for Polynomial { type Output = Polynomial; fn mul(self, factor: &Polynomial) -> Polynomial { &self * factor } } ================================================ FILE: tools/garaga_rs/src/algebra/rational_function.rs ================================================ use crate::algebra::polynomial::Polynomial; use crate::definitions::FieldElement; use lambdaworks_math::field::traits::IsPrimeField; #[derive(Debug, Clone)] pub struct RationalFunction { pub numerator: Polynomial, pub denominator: Polynomial, } impl RationalFunction { pub fn new(numerator: Polynomial, denominator: Polynomial) -> Self { Self { numerator, denominator, } } pub fn simplify(&self) -> RationalFunction { let (_, _, gcd) = self.numerator.xgcd(&self.denominator); let num_simplified = self.numerator.clone().div_with_ref(&gcd); let den_simplified = self.denominator.clone().div_with_ref(&gcd); RationalFunction::new( num_simplified.scale_by_coeff(&self.denominator.leading_coefficient().inv().unwrap()), den_simplified.scale_by_coeff(&den_simplified.leading_coefficient().inv().unwrap()), ) } pub fn evaluate(&self, x: FieldElement) -> FieldElement { (self.numerator.evaluate(&x.clone()) / self.denominator.evaluate(&x.clone())).unwrap() } pub fn scale_by_coeff(&self, coeff: FieldElement) -> RationalFunction { RationalFunction::new( self.numerator.scale_by_coeff(&coeff), self.denominator.clone(), ) } } impl std::ops::Add for RationalFunction { type Output = RationalFunction; fn add(self, other: RationalFunction) -> RationalFunction { let num_1: Polynomial = self.numerator.clone() * other.denominator.clone(); let num_2 = other.numerator.clone() * self.denominator.clone(); let num = num_1 + num_2; let den: Polynomial = self.denominator.clone() * other.denominator.clone(); RationalFunction::new(num, den).simplify() } } #[derive(Debug, Clone)] pub struct FunctionFelt { pub a: RationalFunction, pub b: RationalFunction, } impl FunctionFelt { pub fn new(a: RationalFunction, b: RationalFunction) -> Self { Self { a, b } } pub fn simplify(&self) -> FunctionFelt { FunctionFelt::new(self.a.simplify(), self.b.simplify()) } pub fn evaluate(&self, x: FieldElement, y: &FieldElement) -> FieldElement { self.a.evaluate(x.clone()) + y * self.b.evaluate(x.clone()) } pub fn scale_by_coeff(&self, coeff: FieldElement) -> FunctionFelt { FunctionFelt::new( self.a.scale_by_coeff(coeff.clone()), self.b.scale_by_coeff(coeff), ) } // def print_as_sage_poly(self, var: str = "x") -> str: // return f"(({self.b.numerator.print_as_sage_poly(var)}) / ({self.b.denominator.print_as_sage_poly(var)}) * y + ({self.a.numerator.print_as_sage_poly(var)} / ({self.a.denominator.print_as_sage_poly(var)})" pub fn print_as_sage_poly(&self) -> String { format!( "(({}) / ({}) * y + ({}) / ({})", self.b.numerator.print_as_sage_poly(), self.b.denominator.print_as_sage_poly(), self.a.numerator.print_as_sage_poly(), self.a.denominator.print_as_sage_poly() ) } } impl std::ops::Add for FunctionFelt { type Output = FunctionFelt; fn add(self, other: FunctionFelt) -> FunctionFelt { FunctionFelt { a: self.a + other.a, b: self.b + other.b, } } } ================================================ FILE: tools/garaga_rs/src/calldata/drand_calldata.rs ================================================ use crate::algebra::g1g2pair::G1G2Pair; use crate::algebra::g1point::G1Point; use crate::algebra::g2point::G2Point; use crate::algebra::polynomial::Polynomial; use crate::algebra::rational_function::RationalFunction; use crate::calldata::mpc_calldata; use crate::definitions::{BLS12381PrimeField, CurveID, CurveParamsProvider, FieldElement}; use crate::io::{ element_from_biguint, element_from_bytes_be, element_to_biguint, field_element_to_u384_limbs, }; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree12ExtensionField as BLS12381Degree12ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField as BLS12381Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree6ExtensionField as BLS12381Degree6ExtensionField; use lambdaworks_math::field::traits::{IsPrimeField, LegendreSymbol}; use lambdaworks_math::traits::ByteConversion; use num_bigint::{BigInt, BigUint}; use num_traits::Num; use sha2::{Digest, Sha256}; pub fn drand_calldata_builder(values: &[BigUint]) -> Result, String> { if values.len() != 3 { return Err(format!("Invalid data array length: {}", values.len())); } let round_number: usize = (&values[0]) .try_into() .map_err(|e| format!("Invalid round number: {}", e))?; let randomness = { let bytes = values[1].to_bytes_be(); if bytes.len() > 32 { return Err(format!("Invalid randomness array length: {}", bytes.len())); } let mut padded_bytes = [0; 32]; let len = bytes.len(); padded_bytes[32 - len..].copy_from_slice(&bytes); padded_bytes }; let signature = { let bytes = values[2].to_bytes_be(); // Only supports G1 compressed points as per Quicknet if bytes.len() > 48 { return Err(format!("Invalid signature array length: {}", bytes.len())); } let mut padded_bytes = [0; 48]; let len = bytes.len(); padded_bytes[48 - len..].copy_from_slice(&bytes); deserialize_bls_point(&padded_bytes)? }; let round = RandomnessBeacon { round_number, randomness, signature, previous_signature: None, }; drand_randomness_to_calldata(round) } pub fn drand_randomness_to_calldata(round: RandomnessBeacon) -> Result, String> { let chain = get_chain_info(get_chain_hash(DrandNetwork::Quicknet))?; let round_number = round.round_number.try_into().unwrap(); let message = digest_func(round_number); let msg_point = hash_to_curve(message, "sha256")?; let sig_pt = round.signature.g1_point().unwrap().clone(); let hash_to_curve_hint = build_hash_to_curve_hint(message)?.to_calldata()?; let pairs = [ G1G2Pair::new(sig_pt.clone(), G2Point::generator()), G1G2Pair::new(msg_point, chain.public_key.g2_point().unwrap().neg()), ]; let mpc_data = { mpc_calldata::calldata_builder::< false, BLS12381PrimeField, BLS12381Degree2ExtensionField, BLS12381Degree6ExtensionField, BLS12381Degree12ExtensionField, >(&pairs, 2, &None)? }; let size = 1 + 4 + 4 + hash_to_curve_hint.len() + mpc_data.len(); let mut call_data = vec![size.into()]; call_data.push(round_number.into()); call_data.extend(field_element_to_u384_limbs(&sig_pt.x).map(BigUint::from)); call_data.extend(field_element_to_u384_limbs(&sig_pt.y).map(BigUint::from)); call_data.extend(hash_to_curve_hint); call_data.extend(mpc_data); assert!(call_data.len() == 1 + size); Ok(call_data) } pub fn drand_round_to_calldata(round_number: usize) -> Result, String> { let round_number = round_number.try_into().map_err(|err| format!("{}", err))?; let round = get_randomness(get_chain_hash(DrandNetwork::Quicknet), round_number); drand_randomness_to_calldata(round) } pub fn digest_func(round_number: u64) -> [u8; 32] { let bytes = round_number.to_be_bytes(); let digest = Sha256::digest(bytes); digest.into() } pub fn hash_to_curve(message: [u8; 32], hash_name: &str) -> Result, String> where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { let [felt0, felt1] = hash_to_field::(message, 2, hash_name)? .try_into() .unwrap(); let pt0 = map_to_curve(felt0); let pt1 = map_to_curve(felt1); assert!(pt0.iso_point, "Point {:?} is not an iso point", pt0); assert!(pt1.iso_point, "Point {:?} is not an iso point", pt1); let curve_params = F::get_curve_params(); let cofactor = match curve_params.curve_id { CurveID::BLS12_381 => { let x = BigInt::from(curve_params.x); let n: BigInt = curve_params.n.into(); (BigInt::from(1) - (&x % &n)) % &n } _ => BigInt::from(curve_params.h), }; let sum = pt0.add(&pt1); assert!(sum.iso_point, "Point {:?} is not an iso point", sum); Ok(apply_isogeny(sum).scalar_mul(cofactor)) } fn map_to_curve(field_element: FieldElement) -> G1Point where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { let curve_params = F::get_curve_params(); let swu_params = curve_params.swu_params.unwrap(); let a = swu_params.a; let b = swu_params.b; let z = swu_params.z; let u = field_element; let zeta_u2 = &z * (&u * &u); let ta = (&zeta_u2 * &zeta_u2) + &zeta_u2; let num_x1 = &b * (&ta + FieldElement::::from(1)); let div = if ta == FieldElement::from(0) { &a * &z } else { &a * -ta }; let num2_x1 = &num_x1 * &num_x1; let div2 = &div * ÷ let div3 = &div2 * ÷ assert!(div3 != FieldElement::from(0)); let num_gx1 = (&num2_x1 + &a * &div2) * &num_x1 + &b * &div3; let num_x2 = &zeta_u2 * &num_x1; let gx1 = (&num_gx1 / &div3).unwrap(); let gx1_square = is_quad_residue(&gx1); let y1 = if gx1_square { let y1 = max_sqrt(&gx1); assert!(&y1 * &y1 == gx1); y1 } else { let y1 = max_sqrt(&(&z * &gx1)); assert!(&y1 * &y1 == &z * &gx1); y1 }; let y2 = &zeta_u2 * &u * &y1; let num_x = if gx1_square { num_x1 } else { num_x2 }; let y = if gx1_square { y1.clone() } else { y2.clone() }; let x_affine = (&num_x / &div).unwrap(); let y_flag = element_to_biguint(&y) % BigUint::from(2usize) == element_to_biguint(&u) % BigUint::from(2usize); let y_affine = if !y_flag { -y.clone() } else { y.clone() }; G1Point::new(x_affine, y_affine, true).unwrap() } fn hash_to_field( message: [u8; 32], count: usize, hash_name: &str, ) -> Result>, String> where F: IsPrimeField, FieldElement: ByteConversion, { let len_per_elem = get_len_per_elem::(None); let output = match hash_name { "sha256" => hash_to_bytes::(message, count, len_per_elem), _ => return Err(format!("Unsupported hash function: {}", hash_name)), }; Ok(output .into_iter() .map(|v| element_from_bytes_be(&v)) .collect()) } fn hash_to_bytes(message: [u8; 32], count: usize, len_per_elem: usize) -> Vec> { let len_in_bytes = count * len_per_elem; assert!( len_in_bytes < (1 << 16), "Length should be smaller than 2^16" ); let mut expander = ExpanderXmd::::new(DST, len_per_elem); let uniform_bytes = expander.expand_message_xmd(&message, len_in_bytes.try_into().unwrap()); let mut output = vec![]; for i in (0..len_in_bytes).step_by(len_per_elem) { output.push(uniform_bytes[i..i + len_per_elem].to_vec()); } output } /* This function computes the length in bytes that a hash function should output for hashing an element of type `Field`. :param sec_param: The security parameter. :return: The length in bytes. */ fn get_len_per_elem(sec_param: Option) -> usize where F: IsPrimeField, { let sec_param = sec_param.unwrap_or(128); let base_field_size_in_bits = F::field_bit_size(); let base_field_size_with_security_padding_in_bits = base_field_size_in_bits + sec_param; base_field_size_with_security_padding_in_bits.div_ceil(8) } fn is_quad_residue(element: &FieldElement) -> bool { if element == &FieldElement::from(0) { true } else { element.legendre_symbol() == LegendreSymbol::One } } fn min_sqrt(element: &FieldElement) -> FieldElement where F: IsPrimeField, FieldElement: ByteConversion, { let (sqrt1, sqrt2) = element.sqrt().unwrap(); if element_to_biguint(&sqrt1) < element_to_biguint(&sqrt2) { sqrt1 } else { sqrt2 } } fn max_sqrt(element: &FieldElement) -> FieldElement where F: IsPrimeField, FieldElement: ByteConversion, { let (sqrt1, sqrt2) = element.sqrt().unwrap(); if element_to_biguint(&sqrt1) > element_to_biguint(&sqrt2) { sqrt1 } else { sqrt2 } } pub trait Hasher: Clone { fn new() -> Self; fn reset(&mut self); fn update(&mut self, bytes: &[u8]); fn digest_size(&self) -> usize; fn digest(&self) -> Vec; } #[derive(Clone)] pub struct Sha256Hasher { data: Vec, } impl Hasher for Sha256Hasher { fn new() -> Self { Self { data: vec![] } } fn reset(&mut self) { self.data = vec![]; } fn update(&mut self, bytes: &[u8]) { self.data.extend_from_slice(bytes); } fn digest_size(&self) -> usize { 32 } fn digest(&self) -> Vec { Sha256::digest(&self.data).to_vec() } } const G1_DOMAIN: &[u8] = b"BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_"; const DST: &[u8] = G1_DOMAIN; const LONG_DST_PREFIX: &[u8] = b"H2C-OVERSIZE-DST-"; const MAX_DST_LENGTH: usize = 255; pub struct ExpanderXmd { pub hasher: H, pub dst: Vec, pub block_size: usize, } impl ExpanderXmd { fn new(dst: &[u8], block_size: usize) -> Self { Self { hasher: H::new(), dst: dst.to_vec(), block_size, } } fn construct_dst_prime(&self) -> Vec { let mut dst_prime = if self.dst.len() > MAX_DST_LENGTH { let mut hasher_copy = self.hasher.clone(); hasher_copy.update(LONG_DST_PREFIX); hasher_copy.update(&self.dst); hasher_copy.digest() } else { self.dst.clone() }; dst_prime.push(dst_prime.len().try_into().unwrap()); dst_prime } fn expand_message_xmd(&mut self, msg: &[u8], n: u16) -> Vec { let mut uniform_bytes = vec![]; let b_len = self.hasher.digest_size(); let ell = Into::::into(n).div_ceil(b_len); assert!( ell <= 255, "The ratio of desired output to the output size of hash function is too large!" ); let dst_prime = self.construct_dst_prime(); let z_pad = vec![0u8; self.block_size]; let lib_str: [u8; 2] = n.to_be_bytes(); self.hasher.update(&z_pad); self.hasher.update(msg); let mut lib_str_dst_prime = lib_str.to_vec(); lib_str_dst_prime.push(0); lib_str_dst_prime.extend_from_slice(&dst_prime); self.hasher.update(&lib_str_dst_prime); let b0 = self.hasher.digest(); let mut hasher = self.hasher.clone(); hasher.reset(); hasher.update(&b0); let mut one_dst_prime = vec![1]; one_dst_prime.extend_from_slice(&dst_prime); hasher.update(&one_dst_prime); let mut bi = hasher.digest(); uniform_bytes.extend_from_slice(&bi); for i in 2..ell + 1 { let b0_xor_bi = b0 .iter() .zip(bi.iter()) .map(|(&x, &y)| x ^ y) .collect::>(); let mut hasher = self.hasher.clone(); hasher.reset(); hasher.update(&b0_xor_bi); let mut bytes_i_dst_prime = vec![i.try_into().unwrap()]; bytes_i_dst_prime.extend_from_slice(&dst_prime); hasher.update(&bytes_i_dst_prime); bi = hasher.digest(); uniform_bytes.extend_from_slice(&bi); } uniform_bytes[0..n.into()].to_vec() } } fn apply_isogeny(pt: G1Point) -> G1Point where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { assert!(pt.iso_point, "Point {:?} is not an iso point", pt); let (x_rational, y_rational) = get_isogeny_to_g1_map::(); let x_affine = x_rational.evaluate(pt.x.clone()); let y_affine = y_rational.evaluate(pt.x) * pt.y; G1Point::new(x_affine, y_affine, false).unwrap() } fn get_isogeny_to_g1_map() -> (RationalFunction, RationalFunction) where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { let curve_params = F::get_curve_params(); match curve_params.curve_id { CurveID::BLS12_381 => { let f1 = RationalFunction::new( Polynomial::new( [ BigUint::from_str_radix("11A05F2B1E833340B809101DD99815856B303E88A2D7005FF2627B56CDB4E2C85610C2D5F2E62D6EAEAC1662734649B7", 16).unwrap(), BigUint::from_str_radix("17294ED3E943AB2F0588BAB22147A81C7C17E75B2F6A8417F565E33C70D1E86B4838F2A6F318C356E834EEF1B3CB83BB", 16).unwrap(), BigUint::from_str_radix("D54005DB97678EC1D1048C5D10A9A1BCE032473295983E56878E501EC68E25C958C3E3D2A09729FE0179F9DAC9EDCB0", 16).unwrap(), BigUint::from_str_radix("1778E7166FCC6DB74E0609D307E55412D7F5E4656A8DBF25F1B33289F1B330835336E25CE3107193C5B388641D9B6861", 16).unwrap(), BigUint::from_str_radix("E99726A3199F4436642B4B3E4118E5499DB995A1257FB3F086EEB65982FAC18985A286F301E77C451154CE9AC8895D9", 16).unwrap(), BigUint::from_str_radix("1630C3250D7313FF01D1201BF7A74AB5DB3CB17DD952799B9ED3AB9097E68F90A0870D2DCAE73D19CD13C1C66F652983", 16).unwrap(), BigUint::from_str_radix("D6ED6553FE44D296A3726C38AE652BFB11586264F0F8CE19008E218F9C86B2A8DA25128C1052ECADDD7F225A139ED84", 16).unwrap(), BigUint::from_str_radix("17B81E7701ABDBE2E8743884D1117E53356DE5AB275B4DB1A682C62EF0F2753339B7C8F8C8F475AF9CCB5618E3F0C88E", 16).unwrap(), BigUint::from_str_radix("80D3CF1F9A78FC47B90B33563BE990DC43B756CE79F5574A2C596C928C5D1DE4FA295F296B74E956D71986A8497E317", 16).unwrap(), BigUint::from_str_radix("169B1F8E1BCFA7C42E0C37515D138F22DD2ECB803A0C5C99676314BAF4BB1B7FA3190B2EDC0327797F241067BE390C9E", 16).unwrap(), BigUint::from_str_radix("10321DA079CE07E272D8EC09D2565B0DFA7DCCDDE6787F96D50AF36003B14866F69B771F8C285DECCA67DF3F1605FB7B", 16).unwrap(), BigUint::from_str_radix("6E08C248E260E70BD1E962381EDEE3D31D79D7E22C837BC23C0BF1BC24C6B68C24B1B80B64D391FA9C8BA2E8BA2D229", 16).unwrap(), ].iter().map(element_from_biguint).collect() ), Polynomial::new( [ BigUint::from_str_radix("8CA8D548CFF19AE18B2E62F4BD3FA6F01D5EF4BA35B48BA9C9588617FC8AC62B558D681BE343DF8993CF9FA40D21B1C", 16).unwrap(), BigUint::from_str_radix("12561A5DEB559C4348B4711298E536367041E8CA0CF0800C0126C2588C48BF5713DAA8846CB026E9E5C8276EC82B3BFF", 16).unwrap(), BigUint::from_str_radix("B2962FE57A3225E8137E629BFF2991F6F89416F5A718CD1FCA64E00B11ACEACD6A3D0967C94FEDCFCC239BA5CB83E19", 16).unwrap(), BigUint::from_str_radix("3425581A58AE2FEC83AAFEF7C40EB545B08243F16B1655154CCA8ABC28D6FD04976D5243EECF5C4130DE8938DC62CD8", 16).unwrap(), BigUint::from_str_radix("13A8E162022914A80A6F1D5F43E7A07DFFDFC759A12062BB8D6B44E833B306DA9BD29BA81F35781D539D395B3532A21E", 16).unwrap(), BigUint::from_str_radix("E7355F8E4E667B955390F7F0506C6E9395735E9CE9CAD4D0A43BCEF24B8982F7400D24BC4228F11C02DF9A29F6304A5", 16).unwrap(), BigUint::from_str_radix("772CAACF16936190F3E0C63E0596721570F5799AF53A1894E2E073062AEDE9CEA73B3538F0DE06CEC2574496EE84A3A", 16).unwrap(), BigUint::from_str_radix("14A7AC2A9D64A8B230B3F5B074CF01996E7F63C21BCA68A81996E1CDF9822C580FA5B9489D11E2D311F7D99BBDCC5A5E", 16).unwrap(), BigUint::from_str_radix("A10ECF6ADA54F825E920B3DAFC7A3CCE07F8D1D7161366B74100DA67F39883503826692ABBA43704776EC3A79A1D641", 16).unwrap(), BigUint::from_str_radix("95FC13AB9E92AD4476D6E3EB3A56680F682B4EE96F7D03776DF533978F31C1593174E4B4B7865002D6384D168ECDD0A", 16).unwrap(), BigUint::from_str_radix("1", 16).unwrap(), ].iter().map(element_from_biguint).collect() ), ); let f2 = RationalFunction::new( Polynomial::new( [ BigUint::from_str_radix("90d97c81ba24ee0259d1f094980dcfa11ad138e48a869522b52af6c956543d3cd0c7aee9b3ba3c2be9845719707bb33", 16).unwrap(), BigUint::from_str_radix("134996a104ee5811d51036d776fb46831223e96c254f383d0f906343eb67ad34d6c56711962fa8bfe097e75a2e41c696", 16).unwrap(), BigUint::from_str_radix("cc786baa966e66f4a384c86a3b49942552e2d658a31ce2c344be4b91400da7d26d521628b00523b8dfe240c72de1f6", 16).unwrap(), BigUint::from_str_radix("1f86376e8981c217898751ad8746757d42aa7b90eeb791c09e4a3ec03251cf9de405aba9ec61deca6355c77b0e5f4cb", 16).unwrap(), BigUint::from_str_radix("8cc03fdefe0ff135caf4fe2a21529c4195536fbe3ce50b879833fd221351adc2ee7f8dc099040a841b6daecf2e8fedb", 16).unwrap(), BigUint::from_str_radix("16603fca40634b6a2211e11db8f0a6a074a7d0d4afadb7bd76505c3d3ad5544e203f6326c95a807299b23ab13633a5f0", 16).unwrap(), BigUint::from_str_radix("4ab0b9bcfac1bbcb2c977d027796b3ce75bb8ca2be184cb5231413c4d634f3747a87ac2460f415ec961f8855fe9d6f2", 16).unwrap(), BigUint::from_str_radix("987c8d5333ab86fde9926bd2ca6c674170a05bfe3bdd81ffd038da6c26c842642f64550fedfe935a15e4ca31870fb29", 16).unwrap(), BigUint::from_str_radix("9fc4018bd96684be88c9e221e4da1bb8f3abd16679dc26c1e8b6e6a1f20cabe69d65201c78607a360370e577bdba587", 16).unwrap(), BigUint::from_str_radix("e1bba7a1186bdb5223abde7ada14a23c42a0ca7915af6fe06985e7ed1e4d43b9b3f7055dd4eba6f2bafaaebca731c30", 16).unwrap(), BigUint::from_str_radix("19713e47937cd1be0dfd0b8f1d43fb93cd2fcbcb6caf493fd1183e416389e61031bf3a5cce3fbafce813711ad011c132", 16).unwrap(), BigUint::from_str_radix("18b46a908f36f6deb918c143fed2edcc523559b8aaf0c2462e6bfe7f911f643249d9cdf41b44d606ce07c8a4d0074d8e", 16).unwrap(), BigUint::from_str_radix("b182cac101b9399d155096004f53f447aa7b12a3426b08ec02710e807b4633f06c851c1919211f20d4c04f00b971ef8", 16).unwrap(), BigUint::from_str_radix("245a394ad1eca9b72fc00ae7be315dc757b3b080d4c158013e6632d3c40659cc6cf90ad1c232a6442d9d3f5db980133", 16).unwrap(), BigUint::from_str_radix("5c129645e44cf1102a159f748c4a3fc5e673d81d7e86568d9ab0f5d396a7ce46ba1049b6579afb7866b1e715475224b", 16).unwrap(), BigUint::from_str_radix("15e6be4e990f03ce4ea50b3b42df2eb5cb181d8f84965a3957add4fa95af01b2b665027efec01c7704b456be69c8b604", 16).unwrap(), ].iter().map(element_from_biguint).collect() ), Polynomial::new( [ BigUint::from_str_radix("16112c4c3a9c98b252181140fad0eae9601a6de578980be6eec3232b5be72e7a07f3688ef60c206d01479253b03663c1", 16).unwrap(), BigUint::from_str_radix("1962d75c2381201e1a0cbd6c43c348b885c84ff731c4d59ca4a10356f453e01f78a4260763529e3532f6102c2e49a03d", 16).unwrap(), BigUint::from_str_radix("58df3306640da276faaae7d6e8eb15778c4855551ae7f310c35a5dd279cd2eca6757cd636f96f891e2538b53dbf67f2", 16).unwrap(), BigUint::from_str_radix("16b7d288798e5395f20d23bf89edb4d1d115c5dbddbcd30e123da489e726af41727364f2c28297ada8d26d98445f5416", 16).unwrap(), BigUint::from_str_radix("be0e079545f43e4b00cc912f8228ddcc6d19c9f0f69bbb0542eda0fc9dec916a20b15dc0fd2ededda39142311a5001d", 16).unwrap(), BigUint::from_str_radix("8d9e5297186db2d9fb266eaac783182b70152c65550d881c5ecd87b6f0f5a6449f38db9dfa9cce202c6477faaf9b7ac", 16).unwrap(), BigUint::from_str_radix("166007c08a99db2fc3ba8734ace9824b5eecfdfa8d0cf8ef5dd365bc400a0051d5fa9c01a58b1fb93d1a1399126a775c", 16).unwrap(), BigUint::from_str_radix("16a3ef08be3ea7ea03bcddfabba6ff6ee5a4375efa1f4fd7feb34fd206357132b920f5b00801dee460ee415a15812ed9", 16).unwrap(), BigUint::from_str_radix("1866c8ed336c61231a1be54fd1d74cc4f9fb0ce4c6af5920abc5750c4bf39b4852cfe2f7bb9248836b233d9d55535d4a", 16).unwrap(), BigUint::from_str_radix("167a55cda70a6e1cea820597d94a84903216f763e13d87bb5308592e7ea7d4fbc7385ea3d529b35e346ef48bb8913f55", 16).unwrap(), BigUint::from_str_radix("4d2f259eea405bd48f010a01ad2911d9c6dd039bb61a6290e591b36e636a5c871a5c29f4f83060400f8b49cba8f6aa8", 16).unwrap(), BigUint::from_str_radix("accbb67481d033ff5852c1e48c50c477f94ff8aefce42d28c0f9a88cea7913516f968986f7ebbea9684b529e2561092", 16).unwrap(), BigUint::from_str_radix("ad6b9514c767fe3c3613144b45f1496543346d98adf02267d5ceef9a00d9b8693000763e3b90ac11e99b138573345cc", 16).unwrap(), BigUint::from_str_radix("2660400eb2e4f3b628bdd0d53cd76f2bf565b94e72927c1cb748df27942480e420517bd8714cc80d1fadc1326ed06f7", 16).unwrap(), BigUint::from_str_radix("e0fa1d816ddc03e6b24255e0d7819c171c40f65e273b853324efcd6356caa205ca2f570f13497804415473a1d634b8f", 16).unwrap(), BigUint::from_str_radix("1", 16).unwrap(), ].iter().map(element_from_biguint).collect() ), ); (f1, f2) } curve_id => unimplemented!("Isogeny for curve {:?} is not implemented", curve_id), } } pub struct MapToCurveHint { pub gx1_is_square: bool, pub y1: FieldElement, pub y_flag: bool, } impl MapToCurveHint { fn to_calldata(&self) -> Vec { let mut call_data = vec![]; call_data.push(self.gx1_is_square.into()); call_data.extend(field_element_to_u384_limbs(&self.y1).map(BigUint::from)); call_data.push(self.y_flag.into()); call_data } } pub struct HashToCurveHint { pub f0_hint: MapToCurveHint, pub f1_hint: MapToCurveHint, } impl HashToCurveHint { fn to_calldata(&self) -> Result, String> { let mut call_data = vec![]; call_data.extend(self.f0_hint.to_calldata()); call_data.extend(self.f1_hint.to_calldata()); Ok(call_data) } } fn build_hash_to_curve_hint(message: [u8; 32]) -> Result { let [felt0, felt1] = hash_to_field::(message, 2, "sha256")? .try_into() .unwrap(); let f0_hint = build_map_to_curve_hint(felt0); let f1_hint = build_map_to_curve_hint(felt1); Ok(HashToCurveHint { f0_hint, f1_hint }) } fn build_map_to_curve_hint(u: FieldElement) -> MapToCurveHint { let curve_params = BLS12381PrimeField::get_curve_params(); let swu_params = curve_params.swu_params.unwrap(); let a = swu_params.a; let b = swu_params.b; let z = swu_params.z; let zeta_u2 = &z * (&u * &u); let ta = (&zeta_u2 * &zeta_u2) + &zeta_u2; let num_x1 = &b * (&ta + FieldElement::::from(1)); let div = if ta == FieldElement::from(0) { &a * &z } else { &a * -ta }; let num2_x1 = &num_x1 * &num_x1; let div2 = &div * ÷ let div3 = &div2 * ÷ assert!(div3 != FieldElement::from(0)); let num_gx1 = (&num2_x1 + &a * &div2) * &num_x1 + &b * &div3; let gx1 = (&num_gx1 / &div3).unwrap(); let gx1_square = is_quad_residue(&gx1); let y1 = if gx1_square { let y1 = max_sqrt(&gx1); assert!(&y1 * &y1 == gx1); y1 } else { let y1 = max_sqrt(&(&z * &gx1)); assert!(&y1 * &y1 == &z * &gx1); y1 }; let y2 = &zeta_u2 * &u * &y1; let y = if gx1_square { y1.clone() } else { y2 }; let y_flag = element_to_biguint(&y) % BigUint::from(2usize) == element_to_biguint(&u) % BigUint::from(2usize); MapToCurveHint { gx1_is_square: gx1_square, y1, y_flag, } } pub fn get_base_urls() -> Vec<&'static str> { vec![ "https://drand.cloudflare.com", "https://api.drand.sh", "https://api2.drand.sh", "https://api3.drand.sh", ] } pub enum DrandNetwork { Default, Quicknet, } pub fn get_chain_hash(network: DrandNetwork) -> [u8; 32] { match network { DrandNetwork::Default => { from_hex("8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce") } DrandNetwork::Quicknet => { from_hex("52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971") } } } pub enum CurvePoint { G1Point(G1Point), G2Point(G2Point), } impl CurvePoint { pub fn g1_point(&self) -> Option<&G1Point> { match self { Self::G1Point(point) => Some(point), _ => None, } } pub fn g2_point(&self) -> Option<&G2Point> { match self { Self::G2Point(point) => Some(point), _ => None, } } } pub fn deserialize_bls_point(s_string: &[u8]) -> Result { let m_byte = s_string[0] & 0xE0; if [0x20, 0x60, 0xE0].contains(&m_byte) { return Err("Invalid encoding".to_string()); } let c_bit = (m_byte & 0x80) >> 7; // Compression bit let i_bit = (m_byte & 0x40) >> 6; // Infinity bit let s_bit = (m_byte & 0x20) >> 5; // Sign bit let mut s_string = s_string.to_vec(); s_string[0] &= 0x1F; if i_bit == 1 { if !s_string.iter().all(|&b| b == 0) { return Err("Invalid encoding for point at infinity".to_string()); } let point = if [48, 96].contains(&s_string.len()) { CurvePoint::G1Point(G1Point::new_infinity()) } else { CurvePoint::G2Point(G2Point::new_infinity()) }; return Ok(point); } if c_bit == 0 { if s_string.len() == 96 { // G1 point (uncompressed) let x = element_from_bytes_be(&s_string[..48]); let y = element_from_bytes_be(&s_string[48..]); return Ok(CurvePoint::G1Point(G1Point::new(x, y, false)?)); } if s_string.len() == 192 { // G2 point (uncompressed) let x0 = element_from_bytes_be(&s_string[..48]); let x1 = element_from_bytes_be(&s_string[48..96]); let y0 = element_from_bytes_be(&s_string[96..144]); let y1 = element_from_bytes_be(&s_string[144..]); return Ok(CurvePoint::G2Point(G2Point::new([x0, x1], [y0, y1])?)); } Err(format!( "Invalid length for uncompressed point: {}", s_string.len() )) } else { // C_bit == 1 if s_string.len() == 48 { // G1 point (compressed) let x = element_from_bytes_be(&s_string); let y2 = &x * &x * &x + FieldElement::from(4); let y = if s_bit == 1 { max_sqrt(&y2) } else { min_sqrt(&y2) }; return Ok(CurvePoint::G1Point(G1Point::new(x, y, false)?)); } if s_string.len() == 96 { // G2 point (compressed) unimplemented!("Decoding of compressed G2 points not yet supported"); } Err(format!( "Invalid length for compressed point: {}", s_string.len() )) } } pub struct NetworkInfo { pub public_key: CurvePoint, pub period: usize, pub genesis_time: usize, pub hash: [u8; 32], pub group_hash: [u8; 32], pub scheme_id: String, pub beacon_id: DrandNetwork, } pub fn get_chain_info(chain_hash: [u8; 32]) -> Result { let network = if chain_hash == get_chain_hash(DrandNetwork::Default) { DrandNetwork::Default } else if chain_hash == get_chain_hash(DrandNetwork::Quicknet) { DrandNetwork::Quicknet } else { return Err(format!("Unknown chain hash: {:?}", chain_hash)); }; let info = match network { DrandNetwork::Default => { let x = FieldElement::from_hex_unchecked("68f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31"); let y = FieldElement::from_hex_unchecked("26fa5eef143aaa17c53b3c150d96a18051b718531af576803cfb9acf29b8774a8184e63c62da81ddf4d76fb0a65895c"); NetworkInfo { public_key: CurvePoint::G1Point(G1Point::new(x, y, false).unwrap()), period: 30, genesis_time: 1595431050, hash: chain_hash, group_hash: from_hex( "176f93498eac9ca337150b46d21dd58673ea4e3581185f869672e59fa4cb390a", ), scheme_id: "pedersen-bls-chained".to_string(), beacon_id: DrandNetwork::Default, } } DrandNetwork::Quicknet => { let x = [ FieldElement::from_hex_unchecked("d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a"), FieldElement::from_hex_unchecked("3cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d106451"), ]; let y = [ FieldElement::from_hex_unchecked("e5db2b6bfbb01c867749cadffca88b36c24f3012ba09fc4d3022c5c37dce0f977d3adb5d183c7477c442b1f04515273"), FieldElement::from_hex_unchecked("1a714f2edb74119a2f2b0d5a7c75ba902d163700a61bc224ededd8e63aef7be1aaf8e93d7a9718b047ccddb3eb5d68b"), ]; NetworkInfo { public_key: CurvePoint::G2Point(G2Point::new(x, y).unwrap()), period: 3, genesis_time: 1692803367, hash: chain_hash, group_hash: from_hex( "f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", ), scheme_id: "bls-unchained-g1-rfc9380".to_string(), beacon_id: DrandNetwork::Quicknet, } } }; Ok(info) } pub struct RandomnessBeacon { pub round_number: usize, pub randomness: [u8; 32], pub signature: CurvePoint, pub previous_signature: Option, } fn from_hex(hex: &str) -> [u8; 32] { assert!(hex.len() == 64); let mut bytes = [0u8; 32]; for i in 0..32 { bytes[i] = u8::from_str_radix(&hex[2 * i..2 * (i + 1)], 16).unwrap(); } bytes } fn get_randomness(chain_hash: [u8; 32], round_number: u64) -> RandomnessBeacon { /* hardcoded for testing */ if chain_hash == get_chain_hash(DrandNetwork::Quicknet) { match round_number { 1 => { let x = FieldElement::from_hex_unchecked("155e7cb2d5c613ee0b2e28d6750aabbb78c39dcc96bd9d38c2c2e12198df95571de8e8e402a0cc48871c7089a2b3af4b"); let y = FieldElement::from_hex_unchecked("0fbb74ee8788264320f2501b0fa0dd56363bcec5ce4b113b2bf1de6e331116c79191af99234824f03aeb10ab1c4c7771"); return RandomnessBeacon { round_number: round_number.try_into().unwrap(), randomness: from_hex( "1466a6cd24e327188770752f6134001c64d6efcc590ccc26b721611ad96f165a", ), signature: CurvePoint::G1Point(G1Point::new(x, y, false).unwrap()), previous_signature: None, }; } 2 => { let x = FieldElement::from_hex_unchecked("16b6a585449b66eb12e875b64fcbab3799861a00e4dbf092d99e969a5eac57dd3f798acf61e705fe4f093db926626807"); let y = FieldElement::from_hex_unchecked("15ff2dfd0adad43e0219d11f00f14d4e14cb0d8292bd2c0a8ec634c1b402c2a067fc5d9c53aa2aa0aab8214ca1fce58c"); return RandomnessBeacon { round_number: round_number.try_into().unwrap(), randomness: from_hex( "5782d6987841c654515a0e72b2d1ebb4e741234042c37cb19608ae50d93fb60c", ), signature: CurvePoint::G1Point(G1Point::new(x, y, false).unwrap()), previous_signature: None, }; } 3 => { let x = FieldElement::from_hex_unchecked("13fab6df720b68cc47175f2c777e86d84187caab5770906f515ff1099cb01e4deaa027075d860823e49477b93c72bd64"); let y = FieldElement::from_hex_unchecked("18a83e0a35ee138a879bebc1ac56ab46832bf67deaa63061fb98c8d35333557003c4cde8c2b5320ce2be2073a12b6112"); return RandomnessBeacon { round_number: round_number.try_into().unwrap(), randomness: from_hex( "7ef4621ace1c6da4eb2eee7cd901f81385bca5b189771ec0f08d0d2566dd1a21", ), signature: CurvePoint::G1Point(G1Point::new(x, y, false).unwrap()), previous_signature: None, }; } _ => (), } } unimplemented!("Not to be used in production"); } #[cfg(test)] mod tests { use super::*; #[test] fn test_drand_round_to_calldata_1() { let _ = drand_round_to_calldata(1).unwrap(); } #[test] fn test_drand_round_to_calldata_2() { let _ = drand_round_to_calldata(2).unwrap(); } #[test] fn test_drand_round_to_calldata_3() { let _ = drand_round_to_calldata(3).unwrap(); } } ================================================ FILE: tools/garaga_rs/src/calldata/drand_tlock_calldata.rs ================================================ use crate::algebra::extf_mul::from_e2; use crate::algebra::g1point::G1Point; use crate::algebra::g2point::G2Point; use crate::calldata::drand_calldata::{ digest_func, get_chain_hash, get_chain_info, hash_to_curve, DrandNetwork, }; use crate::definitions::{BLS12381PrimeField, CurveParamsProvider, FieldElement}; use crate::io::field_element_to_u384_limbs; use crate::pairing::final_exp_witness::{bls12_381_final_exp_witness, to_bls}; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree12ExtensionField as BLS12381Degree12ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField as BLS12381Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::pairing::BLS12381AtePairing; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::twist::BLS12381TwistCurve; use lambdaworks_math::elliptic_curve::short_weierstrass::point::ShortWeierstrassProjectivePoint; use lambdaworks_math::elliptic_curve::traits::{FromAffine, IsPairing}; use num_bigint::BigUint; use sha2::{Digest, Sha256}; pub fn drand_tlock_encrypt_calldata_builder(values: &[BigUint]) -> Result, String> { if values.len() != 3 { return Err(format!("Invalid data array length: {}", values.len())); } let round_number: usize = (&values[0]) .try_into() .map_err(|e| format!("Invalid round number: {}", e))?; let message = { let bytes = values[1].to_bytes_be(); if bytes.len() > 16 { return Err(format!("Invalid message array length: {}", bytes.len())); } let mut padded_bytes = [0; 16]; let len = bytes.len(); padded_bytes[16 - len..].copy_from_slice(&bytes); padded_bytes }; let randomness = { let bytes = values[2].to_bytes_be(); if bytes.len() > 16 { return Err(format!("Invalid randomness array length: {}", bytes.len())); } let mut padded_bytes = [0; 16]; let len = bytes.len(); padded_bytes[16 - len..].copy_from_slice(&bytes); padded_bytes }; let chain = get_chain_info(get_chain_hash(DrandNetwork::Quicknet))?; let public_key = chain.public_key.g2_point().unwrap().clone(); let cipher_text = encrypt_for_round(public_key, round_number, message, randomness)?; let cipher_text_hint = cipher_text.to_calldata(); let size = 1 + cipher_text_hint.len(); let mut call_data = vec![size.into()]; call_data.push(round_number.into()); call_data.extend(cipher_text_hint); assert!(call_data.len() == 1 + size); Ok(call_data) } pub struct CipherText { pub u: G2Point, pub v: [u8; 16], pub w: [u8; 16], } impl CipherText { pub fn to_calldata(&self) -> Vec { let u_x = from_e2(self.u.x.clone()); let u_y = from_e2(self.u.y.clone()); let mut call_data = vec![]; call_data.extend(field_element_to_u384_limbs(&u_x[0]).map(BigUint::from)); call_data.extend(field_element_to_u384_limbs(&u_x[1]).map(BigUint::from)); call_data.extend(field_element_to_u384_limbs(&u_y[0]).map(BigUint::from)); call_data.extend(field_element_to_u384_limbs(&u_y[1]).map(BigUint::from)); for b in self.v { call_data.push(b.into()); } for b in self.w { call_data.push(b.into()); } call_data } } pub fn encrypt_for_round( public_key: G2Point, round_number: usize, message: [u8; 16], sigma: [u8; 16], ) -> Result { let round_number = round_number.try_into().unwrap(); let msg_at_round = digest_func(round_number); let pt_at_round = hash_to_curve::(msg_at_round, "sha256")?; let gid = bls12381_single_pairing(pt_at_round, public_key)?; let r = { let mut bytes = vec![]; bytes.extend(b"IBE-H3"); bytes.extend(sigma); bytes.extend(message); let output = sha256_digest(&bytes); BigUint::from_bytes_le(&expand_message_drand(&output, 32)) }; let r = { let curve_params = BLS12381PrimeField::get_curve_params(); r % curve_params.n }; let u = G2Point::generator().scalar_mul::(r.clone().into()); let r_gid = bls12_381_final_exp_witness::pow_custom(&gid, &r); let r_gid_serialized = { let mut bytes = vec![]; let mut values = to_bls(r_gid); values.reverse(); for value in values { let mut padded_value_bytes = [0u8; 48]; let value_bytes = value.to_bytes_be(); let len = value_bytes.len(); assert!(len <= 48); padded_value_bytes[48 - len..].copy_from_slice(&value_bytes); bytes.extend(padded_value_bytes); } bytes }; let r_gid_hash: [u8; 16] = { let mut bytes = vec![]; bytes.extend(b"IBE-H2"); bytes.extend(r_gid_serialized); let output = sha256_digest(&bytes); output[..16].to_vec().try_into().unwrap() }; let v: [u8; 16] = { let bytes = sigma .into_iter() .zip(r_gid_hash) .map(|(a, b)| a ^ b) .collect::>(); bytes.try_into().unwrap() }; let sigma_hash: [u8; 16] = { let mut bytes = vec![]; bytes.extend(b"IBE-H4"); bytes.extend(sigma); let output = sha256_digest(&bytes); output[..16].to_vec().try_into().unwrap() }; let w: [u8; 16] = { let bytes = message .into_iter() .zip(sigma_hash) .map(|(a, b)| a ^ b) .collect::>(); bytes.try_into().unwrap() }; Ok(CipherText { u, v, w }) } fn bls12381_single_pairing( g1_point: G1Point, g2_point: G2Point, ) -> Result, String> { let g1_point = ShortWeierstrassProjectivePoint::from_affine(g1_point.x, g1_point.y) .map_err(|err| format!("{:?}", err))?; let g2_point = ShortWeierstrassProjectivePoint::from_affine(g2_point.x, g2_point.y) .map_err(|err| format!("{:?}", err))?; let product = BLS12381AtePairing::compute_batch(&[(&g1_point, &g2_point)]) .map_err(|err| format!("{:?}", err))?; Ok(product) } fn expand_message_drand(msg: &[u8], buf_size: usize) -> Vec { assert!(buf_size <= 32); const BITS_TO_MASK_FOR_BLS12381: usize = 1; let curve_params = BLS12381PrimeField::get_curve_params(); let order = curve_params.n; for i in 1..65536 { let i: u16 = i.try_into().unwrap(); let hash_result = { let mut bytes = vec![]; bytes.extend(i.to_le_bytes()); bytes.extend(msg); sha256_digest(&bytes) }; let hash_result = { let mut bytes = hash_result; bytes[0] >>= BITS_TO_MASK_FOR_BLS12381; bytes }; let reversed_hash = { let mut bytes = hash_result; bytes.reverse(); bytes }; let scalar = &BigUint::from_bytes_le(&reversed_hash) % ℴ if scalar != BigUint::from(0usize) { return reversed_hash[..buf_size].to_vec(); } } panic!("You are insanely unlucky and should have been hit by a meteor before now"); } fn sha256_digest(data: &[u8]) -> [u8; 32] { Sha256::digest(data).into() } pub fn get_drand_round_at(genesis_time: usize, period: usize, time: usize) -> usize { assert!(time >= genesis_time); (time - genesis_time) / period + 1 } pub fn get_drand_round_time(genesis_time: usize, period: usize, round_number: usize) -> usize { assert!(round_number >= 1); genesis_time + period * (round_number - 1) } #[cfg(test)] mod tests { use super::*; #[test] fn test_encrypt_for_round_1() { let chain = get_chain_info(get_chain_hash(DrandNetwork::Quicknet)).unwrap(); let public_key = chain.public_key.g2_point().unwrap().clone(); let cypher_text = encrypt_for_round(public_key, 1, *b"1234567890abcdef", *b"deaf00013000beef").unwrap(); let expected_v = [ 211, 169, 110, 124, 57, 249, 177, 59, 54, 206, 185, 125, 242, 220, 74, 184, ]; let expected_w = [ 60, 105, 170, 165, 30, 223, 128, 199, 37, 162, 104, 106, 18, 148, 250, 43, ]; assert_eq!(cypher_text.v, expected_v); assert_eq!(cypher_text.w, expected_w); } } ================================================ FILE: tools/garaga_rs/src/calldata/full_proof_with_hints/groth16.rs ================================================ // use crate::algebra::g1g2pair::G1G2Pair; use crate::calldata::mpc_calldata::mpc_calldata_builder; use crate::calldata::msm_calldata::msm_calldata_builder; use crate::calldata::G1PointBigUint; use crate::calldata::G2PointBigUint; use crate::constants::{get_risc0_constants, SP1_VERIFIER_HASH, SP1_VERIFIER_VERSION}; use crate::definitions::{ BLS12381PrimeField, BN254PrimeField, CurveID, CurveParamsProvider, FieldElement, }; use crate::io::{ biguint_split, element_to_biguint, field_elements_from_big_uints, parse_g1_points_from_flattened_field_elements_list, }; use hex; use lambdaworks_math::field::traits::IsPrimeField; use lambdaworks_math::traits::ByteConversion; use num_bigint::{BigInt, BigUint, Sign}; use num_traits::Num; use sha2::{Digest, Sha256}; use starknet_types_core::felt::Felt; pub struct Groth16Proof { pub a: G1PointBigUint, pub b: G2PointBigUint, pub c: G1PointBigUint, pub public_inputs: Vec, pub image_id_journal_risc0: Option<(Vec, Vec)>, // Only used for risc0 proofs pub vkey_public_values_sp1: Option<(Vec, Vec)>, // Only used for sp1 proofs } impl Groth16Proof { pub fn flatten(&self) -> Vec { let mut result = Vec::new(); result.extend(self.a.flatten()); result.extend(self.b.flatten()); result.extend(self.c.flatten()); result } pub fn from( values: Vec, image_id_journal_risc0: Option<(Vec, Vec)>, vkey_public_values_sp1: Option<(Vec, Vec)>, ) -> Self { let a = G1PointBigUint::from(values[0..2].to_vec()); let b = G2PointBigUint::from(values[2..6].to_vec()); let c = G1PointBigUint::from(values[6..8].to_vec()); let public_inputs = values[8..].to_vec(); Groth16Proof { a, b, c, public_inputs, image_id_journal_risc0, vkey_public_values_sp1, } } pub fn serialize_to_calldata(&self) -> Vec { let mut cd: Vec = vec![]; // Serialize a.x, a.y, b.x[0], b.x[1], b.y[0], b.y[1], c.x, c.y directly // This matches the Python: cd.extend(io.bigint_split(self.a.x)) etc. for v in [ &self.a.x, &self.a.y, &self.b.x0, &self.b.x1, &self.b.y0, &self.b.y1, &self.c.x, &self.c.y, ] { cd.extend(biguint_split::<4, 96>(v).iter().map(|&x| BigUint::from(x))); } let risc0_mode = self.image_id_journal_risc0.is_some(); let _sp1_mode = self.vkey_public_values_sp1.is_some(); if risc0_mode && !_sp1_mode { // Risc0 mode. // Public inputs will be reconstructed from image id and journal. let (image_id, journal) = self.image_id_journal_risc0.as_ref().unwrap(); let image_id_u256 = BigUint::from_bytes_be(image_id); let image_id_u256_split = biguint_split::<8, 32>(&image_id_u256).map(BigUint::from); let image_id_u256_split_reversed: Vec = image_id_u256_split.iter().rev().cloned().collect(); // Span of u32, length 8. cd.push(BigUint::from(8u64)); cd.extend(image_id_u256_split_reversed); // Span of u8, length depends on input cd.push(BigUint::from(journal.len())); cd.extend(journal.iter().map(|&x| BigUint::from(x))); } else if _sp1_mode && !risc0_mode { // SP1 mode - matches Python implementation exactly let (_vkey, public_values) = self.vkey_public_values_sp1.as_ref().unwrap(); // public_inputs[0] is the vkey as BigUint - serialize as 2 limbs of 128 bits // This matches Python: cd.extend(io.bigint_split(self.public_inputs[0], 2, 2**128)) let vkey_int = &self.public_inputs[0]; // This should already be the vkey as BigUint let vkey_limbs = biguint_split::<2, 128>(vkey_int); cd.extend(vkey_limbs.iter().map(|&x| BigUint::from(x))); // Serialize public_values (public_inputs_sp1) as u32 array // This matches Python SP1 serialization exactly let n_bytes = public_values.len(); assert_eq!( n_bytes % 32, 0, "SP1 public inputs must be a multiple of 32 bytes" ); let n_words = n_bytes / 32; // Add number of words first (matches Python: cd.append(n_words)) cd.push(BigUint::from(n_words)); // Then serialize as u32 values (matches Python: for i in range(0, n_bytes, 4): cd.append(int.from_bytes(...))) for i in (0..n_bytes).step_by(4) { let word = u32::from_be_bytes([ public_values[i], public_values[i + 1], public_values[i + 2], public_values[i + 3], ]); cd.push(BigUint::from(word)); } } else if risc0_mode && _sp1_mode { panic!("Cannot have both RISC0 and SP1 modes enabled"); } else { // Normal mode. cd.push(BigUint::from(self.public_inputs.len())); for pub_input in &self.public_inputs { cd.extend( biguint_split::<2, 128>(pub_input) .iter() .map(|&x| BigUint::from(x)), ); } } cd } pub fn from_risc0(seal: Vec, image_id: Vec, journal: Vec) -> Self { assert!(image_id.len() <= 32, "image_id must be 32 bytes"); let (control_root, bn254_control_id) = get_risc0_constants(); let (control_root_0, control_root_1) = risc0_utils::split_digest(&control_root); let proof = &seal[4..]; let mut hasher = Sha256::new(); hasher.update(&journal); let journal_digest = hasher.finalize(); let claim_digest = risc0_utils::ok_digest(&image_id, &journal_digest); let claim_digest_biguint = BigUint::from_bytes_be(&claim_digest); let (claim0, claim1) = risc0_utils::split_digest(&claim_digest_biguint); Groth16Proof { a: G1PointBigUint { x: BigUint::from_bytes_be(&proof[0..32]), y: BigUint::from_bytes_be(&proof[32..64]), }, b: G2PointBigUint { x0: BigUint::from_bytes_be(&proof[96..128]), x1: BigUint::from_bytes_be(&proof[64..96]), y0: BigUint::from_bytes_be(&proof[160..192]), y1: BigUint::from_bytes_be(&proof[128..160]), }, c: G1PointBigUint { x: BigUint::from_bytes_be(&proof[192..224]), y: BigUint::from_bytes_be(&proof[224..256]), }, public_inputs: vec![ control_root_0, control_root_1, claim0, claim1, bn254_control_id, ], image_id_journal_risc0: Some((image_id, journal)), vkey_public_values_sp1: None, } } pub fn from_sp1(vkey: Vec, public_values: Vec, proof: Vec) -> Self { // Skip the first 4 bytes (selector) let selector = &proof[..4]; let proof = &proof[4..]; // Validate SP1 verifier version by checking selector against expected hash let expected_selector = hex::decode(&SP1_VERIFIER_HASH[2..]).unwrap()[..4].to_vec(); if selector != expected_selector { panic!( "Invalid SP1 proof version. Expected {:02x}{:02x}{:02x}{:02x} for version {}, got {:02x}{:02x}{:02x}{:02x}\nPlease use SP1 verifier version {} or contact garaga developers to update the SP1 verifier version.", expected_selector[0], expected_selector[1], expected_selector[2], expected_selector[3], SP1_VERIFIER_VERSION, selector[0], selector[1], selector[2], selector[3], SP1_VERIFIER_VERSION ); } // sha256(public_values) % 2**253 assert!( public_values.len().is_multiple_of(32), "public_values must be a multiple of 32 bytes" ); let pub_input_hash = BigUint::from_bytes_be(&Sha256::digest(&public_values)); // 2^253 as BigUint to avoid overflow let modulus = BigUint::from(2u64).pow(253); let pub_input_hash = pub_input_hash % modulus; let mut public_inputs_sp1 = Vec::new(); for i in 0..public_values.len() / 32 { let public_input = BigUint::from_bytes_be(&public_values[i * 32..(i + 1) * 32]); public_inputs_sp1.push(public_input); } Groth16Proof { a: G1PointBigUint { x: BigUint::from_bytes_be(&proof[0..32]), y: BigUint::from_bytes_be(&proof[32..64]), }, b: G2PointBigUint { x0: BigUint::from_bytes_be(&proof[96..128]), x1: BigUint::from_bytes_be(&proof[64..96]), y0: BigUint::from_bytes_be(&proof[160..192]), y1: BigUint::from_bytes_be(&proof[128..160]), }, c: G1PointBigUint { x: BigUint::from_bytes_be(&proof[192..224]), y: BigUint::from_bytes_be(&proof[224..256]), }, public_inputs: vec![BigUint::from_bytes_be(&vkey), pub_input_hash], image_id_journal_risc0: None, vkey_public_values_sp1: Some((vkey, public_values)), } } } #[derive(Debug, PartialEq)] pub struct Groth16VerificationKey { pub alpha: G1PointBigUint, pub beta: G2PointBigUint, pub gamma: G2PointBigUint, pub delta: G2PointBigUint, pub ic: Vec, } impl Groth16VerificationKey { pub fn from(values: Vec) -> Self { let alpha = G1PointBigUint::from(values[0..2].to_vec()); let beta = G2PointBigUint::from(values[2..6].to_vec()); let gamma = G2PointBigUint::from(values[6..10].to_vec()); let delta = G2PointBigUint::from(values[10..14].to_vec()); let ic = values[14..] .chunks(2) .map(|chunk| G1PointBigUint::from(chunk.to_vec())) .collect(); Groth16VerificationKey { alpha, beta, gamma, delta, ic, } } } pub fn get_sp1_vk() -> Groth16VerificationKey { let vk_hex = [ "2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e2", "14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d1926", "e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab", "967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c", "1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8", "304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a7", "1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed", "198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2", "12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", "90689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b", "3ff41f4ba0c37fe2caf27354d28e4b8f83d3b76777a63b327d736bffb0122ed", "1cc7cb8de715675f21f01ecc9b46d236e0865e0cc020024521998269845f74e6", "17387b4b9cf03927909b4f1c3d80fcd6865afc4a264a04499f7e2f6df690dd85", "2ed3b19b5eb39db0d19a3d72dcd590ac85a971def614f4fd11b56b3c5e53c44c", "26091e1cafb0ad8a4ea0a694cd3743ebf524779233db734c451d28b58aa9758e", "9ff50a6b8b11c3ca6fdb2690a124f8ce25489fefa65a3e782e7ba70b66690e", "61c3fd0fd3da25d2607c227d090cca750ed36c6ec878755e537c1c48951fb4c", "fa17ae9c2033379df7b5c65eff0e107055e9a273e6119a212dd09eb51707219", "4eab241388a79817fe0e0e2ead0b2ec4ffdec51a16028dee020634fd129e71c", "7236256d21c60d02f0bdbf95cff83e03ea9e16fca56b18d5544b0889a65c1f5", ]; Groth16VerificationKey::from( vk_hex .iter() .map(|s| BigUint::from_str_radix(s, 16).unwrap()) .collect::>(), ) } pub fn get_groth16_calldata_felt( proof: &Groth16Proof, vk: &Groth16VerificationKey, curve_id: CurveID, ) -> Result, String> { let calldata = get_groth16_calldata(proof, vk, curve_id)?; Ok(calldata.into_iter().map(Felt::from).collect()) } pub fn get_groth16_calldata( proof: &Groth16Proof, vk: &Groth16VerificationKey, curve_id: CurveID, ) -> Result, String> { let mut calldata: Vec = Vec::new(); let risc0_mode = proof.image_id_journal_risc0.is_some(); let _sp1_mode = proof.vkey_public_values_sp1.is_some(); // Calculate vk_x let vk_x = calculate_vk_x(vk, &proof.public_inputs, curve_id); // MPC calldata let mut mpc_values: Vec = vec![]; mpc_values.extend(vk_x.flatten()); mpc_values.extend(vk.gamma.flatten()); mpc_values.extend(proof.c.flatten()); mpc_values.extend(vk.delta.flatten()); mpc_values.extend(proof.a.neg(curve_id).flatten()); mpc_values.extend(proof.b.flatten()); let mut mpc_public_pair: Vec = vec![]; mpc_public_pair.extend(vk.alpha.flatten()); mpc_public_pair.extend(vk.beta.flatten()); let mpc_calldata = mpc_calldata_builder(curve_id as usize, &mpc_values, 2, &mpc_public_pair)?; // MSM calldata let msm_calldata = match risc0_mode { false => msm_calldata_builder( &vk.ic .iter() .skip(1) .flat_map(|point| vec![point.x.clone(), point.y.clone()]) .collect::>(), &proof.public_inputs, curve_id as usize, false, true, )?, true => msm_calldata_builder( &[ vk.ic[3].x.clone(), vk.ic[3].y.clone(), vk.ic[4].x.clone(), vk.ic[4].y.clone(), ], &[ proof.public_inputs[2].clone(), proof.public_inputs[3].clone(), ], curve_id as usize, false, true, )?, }; calldata.push(BigUint::from(0u64)); // Len Placeholder. calldata.extend(proof.serialize_to_calldata()); calldata.extend(mpc_calldata); calldata.extend(msm_calldata); // Update length calldata[0] = BigUint::from(calldata.len() - 1); Ok(calldata) } fn calculate_vk_x( vk: &Groth16VerificationKey, pub_inputs: &[BigUint], curve_id: CurveID, ) -> G1PointBigUint { match curve_id { CurveID::BN254 => vk_x_handle_curve::(vk, pub_inputs), CurveID::BLS12_381 => vk_x_handle_curve::(vk, pub_inputs), _ => panic!("Unsupported curve ID for vk_x"), } } fn vk_x_handle_curve(vk: &Groth16VerificationKey, pub_inputs: &[BigUint]) -> G1PointBigUint where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { // Parse IC points from BigUint to FieldElement let ic_elements = field_elements_from_big_uints::( &vk.ic .iter() .flat_map(|point| vec![point.x.clone(), point.y.clone()]) .collect::>(), ); let ic_points = parse_g1_points_from_flattened_field_elements_list(&ic_elements).unwrap(); // Start with IC[0] let mut vk_x = ic_points[0].clone(); // Compute IC[0] + pub_input_i * IC[i] for each public input for (i, pub_input) in pub_inputs.iter().enumerate() { let pub_input_bigint = BigInt::from_biguint(Sign::Plus, pub_input.clone()); let scaled_ic = ic_points[i + 1].scalar_mul(pub_input_bigint); vk_x = vk_x.add(&scaled_ic); } // Convert G1Point back to G1PointBigUint G1PointBigUint { x: element_to_biguint(&vk_x.x), y: element_to_biguint(&vk_x.y), } } pub mod risc0_utils { use super::Groth16VerificationKey; use hex; use num_bigint::BigUint; use num_traits::Num; use sha2::{Digest, Sha256}; pub fn get_risc0_vk() -> Groth16VerificationKey { let vk_hex = [ "2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e2", "14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d1926", "e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab", "967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c", "1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8", "304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a7", "1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed", "198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2", "12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", "90689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b", "1aa085ff28179a12d922dba0547057ccaae94b9d69cfaa4e60401fea7f3e0333", "3b03cd5effa95ac9bee94f1f5ef907157bda4812ccf0b4c91f42bb629f83a1c", "1e60f31fcbf757e837e867178318832d0b2d74d59e2fea1c7142df187d3fc6d3", "110c10134f200b19f6490846d518c9aea868366efb7228ca5c91d2940d030762", "12ac9a25dcd5e1a832a9061a082c15dd1d61aa9c4d553505739d0f5d65dc3be4", "25aa744581ebe7ad91731911c898569106ff5a2d30f3eee2b23c60ee980acd4", "707b920bc978c02f292fae2036e057be54294114ccc3c8769d883f688a1423f", "2e32a094b7589554f7bc357bf63481acd2d55555c203383782a4650787ff6642", "bca36e2cbe6394b3e249751853f961511011c7148e336f4fd974644850fc347", "2ede7c9acf48cf3a3729fa3d68714e2a8435d4fa6db8f7f409c153b1fcdf9b8b", "1b8af999dbfbb3927c091cc2aaf201e488cbacc3e2c6b6fb5a25f9112e04f2a7", "2b91a26aa92e1b6f5722949f192a81c850d586d81a60157f3e9cf04f679cccd6", "2b5f494ed674235b8ac1750bdfd5a7615f002d4a1dcefeddd06eda5a076ccd0d", "2fe520ad2020aab9cbba817fcbb9a863b8a76ff88f14f912c5e71665b2ad5e82", "f1c3c0d5d9da0fa03666843cde4e82e869ba5252fce3c25d5940320b1c4d493", "214bfcff74f425f6fe8c0d07b307482d8bc8bb2f3608f68287aa01bd0b69e809", ]; Groth16VerificationKey::from( vk_hex .iter() .map(|s| BigUint::from_str_radix(s, 16).unwrap()) .collect::>(), ) } pub fn split_digest(digest: &BigUint) -> (BigUint, BigUint) { // Convert to bytes, ensure 32 bytes, and reverse let mut bytes = digest.to_bytes_be(); bytes.resize(32, 0); bytes.reverse(); // Split into two 128-bit parts let lower = BigUint::from_bytes_be(&bytes[0..16]); let upper = BigUint::from_bytes_be(&bytes[16..32]); (upper, lower) } struct ExitCode { system: u32, user: u32, } struct Output { journal_digest: Vec, assumptions_digest: Vec, } impl Output { fn digest(&self) -> Vec { let mut hasher = Sha256::new(); hasher.update(Sha256::digest(b"risc0.Output")); hasher.update(&self.journal_digest); hasher.update(&self.assumptions_digest); hasher.update((2u16 << 8).to_be_bytes()); hasher.finalize().to_vec() } } struct ReceiptClaim { pre_state_digest: Vec, post_state_digest: Vec, exit_code: ExitCode, input: Vec, output: Vec, tag_digest: Vec, } impl ReceiptClaim { fn digest(&self) -> Vec { let mut hasher = Sha256::new(); hasher.update(&self.tag_digest); hasher.update(&self.input); hasher.update(&self.pre_state_digest); hasher.update(&self.post_state_digest); hasher.update(&self.output); hasher.update((self.exit_code.system << 24).to_be_bytes()); hasher.update((self.exit_code.user << 24).to_be_bytes()); hasher.update((4u16 << 8).to_be_bytes()); hasher.finalize().to_vec() } } pub fn ok_digest(image_id: &[u8], journal_digest: &[u8]) -> Vec { let system_state_zero_digest = hex::decode("A3ACC27117418996340B84E5A90F3EF4C49D22C79E44AAD822EC9C313E1EB8E2") .unwrap(); let output = Output { journal_digest: journal_digest.to_vec(), assumptions_digest: vec![0; 32], }; let receipt_claim = ReceiptClaim { pre_state_digest: image_id.to_vec(), post_state_digest: system_state_zero_digest, exit_code: ExitCode { system: 0, user: 0 }, input: vec![0; 32], output: output.digest(), tag_digest: Sha256::digest(b"risc0.ReceiptClaim").to_vec(), }; receipt_claim.digest() } } #[cfg(test)] mod test_groth16_calldata { use super::risc0_utils::{ok_digest, split_digest}; use super::Groth16Proof; use hex; use num_bigint::BigUint; use sha2::{Digest, Sha256}; #[test] fn test_ok_digest_1() { let image_id = vec![ 0xd0, 0x1c, 0x15, 0xaf, 0xa7, 0x68, 0xa0, 0x5b, 0x21, 0x3a, 0x9e, 0x5f, 0xcd, 0xcc, 0x57, 0x24, 0xa2, 0x94, 0x7e, 0x00, 0x09, 0x8c, 0x7e, 0xc3, 0x4c, 0xcb, 0xe2, 0x94, 0x6b, 0xbc, 0x00, 0x13, ]; let journal = vec![ 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, ]; let journal_digest = Sha256::digest(&journal); let digest = ok_digest(&image_id, &journal_digest); let (claim0, claim1) = split_digest(&BigUint::from_bytes_be(&digest)); assert_eq!( hex::encode(digest), "e58e40abecebcfa4af85692fca5ed77d4ccb4b3f640f5e684e4faf3a36b0c4e0" ); assert_eq!( hex::encode(claim0.to_bytes_be()), "7dd75eca2f6985afa4cfebecab408ee5" ); assert_eq!( hex::encode(claim1.to_bytes_be()), "e0c4b0363aaf4f4e685e0f643f4bcb4c" ); } #[test] fn test_ok_digest_2() { let image_id = vec![ 0x07, 0x9f, 0x23, 0xf1, 0x3e, 0xa8, 0x1b, 0xde, 0x11, 0xa9, 0x49, 0x12, 0xba, 0xdf, 0xe8, 0xd9, 0x2d, 0x5b, 0xe1, 0x13, 0x4b, 0x2c, 0x99, 0x1b, 0x99, 0x55, 0xe9, 0xc1, 0x89, 0x41, 0xba, 0x69, ]; let journal: Vec = vec![0x01, 0x00, 0x00, 0x78]; let journal_digest = Sha256::digest(&journal); let digest = ok_digest(&image_id, &journal_digest); let (claim0, claim1) = split_digest(&BigUint::from_bytes_be(&digest)); assert_eq!( hex::encode(claim0.to_bytes_be()), "d284212f0d87311c45e710301d86639f" ); assert_eq!( hex::encode(claim1.to_bytes_be()), "8875bcad22cdcfda1e2878df4e414108" ); } #[test] #[should_panic(expected = "Invalid SP1 proof version")] fn test_from_sp1_invalid_selector() { // Create test data with invalid selector (wrong first 4 bytes) let vkey = vec![0u8; 32]; let public_values = vec![0u8; 64]; // Must be multiple of 32 let mut proof = vec![0xde, 0xad, 0xbe, 0xef]; // Invalid selector proof.extend(vec![0u8; 252]); // Add remaining proof data // This should panic with our error message Groth16Proof::from_sp1(vkey, public_values, proof); } } ================================================ FILE: tools/garaga_rs/src/calldata/full_proof_with_hints/zk_honk.rs ================================================ use crate::algebra::g1g2pair::G1G2Pair; use crate::algebra::g1point::G1Point; use crate::algebra::g2point::G2Point; use crate::calldata::mpc_calldata; use crate::calldata::msm_calldata; use crate::calldata::G1PointBigUint; use crate::definitions::BN254PrimeField; use crate::definitions::CurveID; use crate::definitions::FieldElement; use crate::definitions::GrumpkinPrimeField; use crate::definitions::Stark252PrimeField; use crate::io::{element_from_biguint, element_to_biguint, field_element_to_u256_limbs}; use lambdaworks_crypto::hash::poseidon::starknet::PoseidonCairoStark252; use lambdaworks_crypto::hash::poseidon::Poseidon; use lambdaworks_math::field::errors::FieldError; use lambdaworks_math::field::traits::IsPrimeField; use lambdaworks_math::traits::ByteConversion; use num_bigint::BigUint; use sha3::{Digest, Keccak256}; pub const NUMBER_OF_SUBRELATIONS: usize = 28; pub const NUMBER_OF_ALPHAS: usize = NUMBER_OF_SUBRELATIONS - 1; pub const NUMBER_OF_ENTITIES: usize = 41; pub const NUMBER_UNSHIFTED: usize = 36; pub const NUMBER_TO_BE_SHIFTED: usize = 5; pub const SHIFTED_COMMITMENTS_START: usize = 30; pub const MAX_LOG_N: usize = 23; pub const MAX_CIRCUIT_SIZE: usize = 1 << MAX_LOG_N; pub const PAIRING_POINT_OBJECT_LENGTH: usize = 16; pub const CONST_PROOF_SIZE_LOG_N: usize = 28; pub const NUM_WITNESS_ENTITIES: usize = 8; pub const NUM_ELEMENTS_COMM: usize = 2; pub const NUM_ELEMENTS_FR: usize = 1; /// Calculate expected proof size based on log_circuit_size pub fn calculate_proof_size(log_circuit_size: usize) -> usize { let mut proof_size = NUM_WITNESS_ENTITIES * NUM_ELEMENTS_COMM; // 16 proof_size += NUM_ELEMENTS_COMM * 4; // 8 (Libra concat, grand sum, quotient comms + Gemini masking) proof_size += log_circuit_size * ZK_BATCHED_RELATION_PARTIAL_LENGTH * NUM_ELEMENTS_FR; // sumcheck univariates proof_size += NUMBER_OF_ENTITIES * NUM_ELEMENTS_FR; // 41 (sumcheck evaluations) proof_size += NUM_ELEMENTS_FR * 3; // 3 (Libra sum, claimed eval, Gemini masking eval) proof_size += log_circuit_size * NUM_ELEMENTS_FR; // Gemini a evaluations proof_size += LIBRA_EVALUATIONS * NUM_ELEMENTS_FR; // 4 (libra evaluations) proof_size += (log_circuit_size - 1) * NUM_ELEMENTS_COMM; // Gemini Fold commitments proof_size += NUM_ELEMENTS_COMM * 2; // 4 (Shplonk Q and KZG W) proof_size += PAIRING_POINT_OBJECT_LENGTH; // 16 (pairing inputs) proof_size } pub const ZK_BATCHED_RELATION_PARTIAL_LENGTH: usize = 9; pub const SUBGROUP_SIZE: usize = 256; pub const LIBRA_COMMITMENTS: usize = 3; pub const LIBRA_EVALUATIONS: usize = 4; pub const LIBRA_UNIVARIATES_LENGTH: usize = 9; // Number of G1 points in the VK pub const VK_NUM_POINTS: usize = 28; pub struct HonkVerificationKey { pub log_circuit_size: usize, pub public_inputs_size: usize, pub public_inputs_offset: usize, pub qm: G1PointBigUint, pub qc: G1PointBigUint, pub ql: G1PointBigUint, pub qr: G1PointBigUint, pub qo: G1PointBigUint, pub q4: G1PointBigUint, pub q_lookup: G1PointBigUint, pub q_arith: G1PointBigUint, pub q_delta_range: G1PointBigUint, pub q_elliptic: G1PointBigUint, pub q_memory: G1PointBigUint, pub q_nnf: G1PointBigUint, pub q_poseidon2_external: G1PointBigUint, pub q_poseidon2_internal: G1PointBigUint, pub s1: G1PointBigUint, pub s2: G1PointBigUint, pub s3: G1PointBigUint, pub s4: G1PointBigUint, pub id1: G1PointBigUint, pub id2: G1PointBigUint, pub id3: G1PointBigUint, pub id4: G1PointBigUint, pub t1: G1PointBigUint, pub t2: G1PointBigUint, pub t3: G1PointBigUint, pub t4: G1PointBigUint, pub lagrange_first: G1PointBigUint, pub lagrange_last: G1PointBigUint, pub vk_hash: BigUint, } impl HonkVerificationKey { pub fn from_bytes(vk_bytes: &[u8]) -> Result { // VK format: 3 * 32 bytes for log_circuit_size, public_inputs_size, public_inputs_offset // then 28 * 64 bytes for G1 points let expected_len = 3 * 32 + VK_NUM_POINTS * 64; if vk_bytes.len() != expected_len { return Err(format!( "Invalid input length: {} (expected {})", vk_bytes.len(), expected_len )); } // Compute vk_hash using keccak256, then mod by BN254 curve order let vk_hash_bytes = Keccak256::digest(vk_bytes); let vk_hash_full = BigUint::from_bytes_be(&vk_hash_bytes); // BN254 curve order (n) let bn254_n = BigUint::parse_bytes( b"30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001", 16, ) .unwrap(); let vk_hash = vk_hash_full % bn254_n; // Parse header fields (32 bytes each) let log_circuit_size = BigUint::from_bytes_be(&vk_bytes[0..32]); let public_inputs_size = BigUint::from_bytes_be(&vk_bytes[32..64]); let public_inputs_offset = BigUint::from_bytes_be(&vk_bytes[64..96]); let log_circuit_size: usize = log_circuit_size .try_into() .map_err(|e: num_bigint::TryFromBigIntError| e.to_string())?; let public_inputs_size: usize = public_inputs_size .try_into() .map_err(|e: num_bigint::TryFromBigIntError| e.to_string())?; let public_inputs_offset: usize = public_inputs_offset .try_into() .map_err(|e: num_bigint::TryFromBigIntError| e.to_string())?; if public_inputs_offset != 1 { return Err(format!( "Invalid public inputs offset: {}", public_inputs_offset )); } if log_circuit_size > CONST_PROOF_SIZE_LOG_N { return Err(format!("Invalid log circuit size: {}", log_circuit_size)); } if public_inputs_size < PAIRING_POINT_OBJECT_LENGTH { return Err(format!( "Invalid public inputs size: {}", public_inputs_size )); } // Parse G1 points (64 bytes each: 32 for x, 32 for y) let mut cursor = 96; let mut points = vec![]; for _ in 0..VK_NUM_POINTS { let x = BigUint::from_bytes_be(&vk_bytes[cursor..cursor + 32]); let y = BigUint::from_bytes_be(&vk_bytes[cursor + 32..cursor + 64]); points.push(G1PointBigUint { x, y }); cursor += 64; } let [qm, qc, ql, qr, qo, q4, q_lookup, q_arith, q_delta_range, q_elliptic, q_memory, q_nnf, q_poseidon2_external, q_poseidon2_internal, s1, s2, s3, s4, id1, id2, id3, id4, t1, t2, t3, t4, lagrange_first, lagrange_last] = points.try_into().unwrap(); Ok(Self { log_circuit_size, public_inputs_size, public_inputs_offset, qm, qc, ql, qr, qo, q4, q_lookup, q_arith, q_delta_range, q_elliptic, q_memory, q_nnf, q_poseidon2_external, q_poseidon2_internal, s1, s2, s3, s4, id1, id2, id3, id4, t1, t2, t3, t4, lagrange_first, lagrange_last, vk_hash, }) } } pub trait Hasher { fn reset(&mut self); fn digest_as_bytes(&self) -> Vec; fn update_bytes(&mut self, data: &[u8]); fn digest(&self) -> BigUint { let bytes = self.digest_as_bytes(); BigUint::from_bytes_be(&bytes) } fn digest_reset(&mut self) -> Vec { let result = self.digest_as_bytes(); self.reset(); result } fn update(&mut self, value: &BigUint) { // Pad to 32 bytes let mut bytes = value.to_bytes_be(); while bytes.len() < 32 { bytes.insert(0, 0); } self.update_bytes(&bytes); } fn update_point(&mut self, point: &G1PointBigUint) { self.update(&point.x); self.update(&point.y); } } pub struct KeccakHasher { data: Vec, } impl Default for KeccakHasher { fn default() -> Self { Self::new() } } impl KeccakHasher { pub fn new() -> Self { KeccakHasher { data: vec![] } } } impl Hasher for KeccakHasher { fn reset(&mut self) { self.data = vec![]; } fn update_bytes(&mut self, data: &[u8]) { self.data.extend_from_slice(data); } fn digest_as_bytes(&self) -> Vec { let hash = Keccak256::digest(&self.data); let hash_int = BigUint::from_bytes_be(&hash); // Reduce modulo Grumpkin field prime (same as BN254 curve order) let grumpkin_p = BigUint::parse_bytes( b"30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001", 16, ) .unwrap(); let reduced = hash_int % grumpkin_p; // Convert back to 32 bytes let mut bytes = reduced.to_bytes_be(); while bytes.len() < 32 { bytes.insert(0, 0); } bytes } } pub struct ZKHonkProof { pub public_inputs: Vec, pub pairing_point_object: [BigUint; PAIRING_POINT_OBJECT_LENGTH], pub w1: G1PointBigUint, pub w2: G1PointBigUint, pub w3: G1PointBigUint, pub w4: G1PointBigUint, pub z_perm: G1PointBigUint, pub lookup_read_counts: G1PointBigUint, pub lookup_read_tags: G1PointBigUint, pub lookup_inverses: G1PointBigUint, pub libra_commitments: [G1PointBigUint; 3], pub libra_sum: BigUint, pub sumcheck_univariates: [[BigUint; ZK_BATCHED_RELATION_PARTIAL_LENGTH]; CONST_PROOF_SIZE_LOG_N], pub sumcheck_evaluations: [BigUint; NUMBER_OF_ENTITIES], pub libra_evaluation: BigUint, pub gemini_masking_poly: G1PointBigUint, pub gemini_masking_eval: BigUint, pub gemini_fold_comms: [G1PointBigUint; CONST_PROOF_SIZE_LOG_N - 1], pub gemini_a_evaluations: [BigUint; CONST_PROOF_SIZE_LOG_N], pub libra_poly_evals: [BigUint; 4], pub shplonk_q: G1PointBigUint, pub kzg_quotient: G1PointBigUint, } impl ZKHonkProof { pub fn from_bytes( proof_bytes: &[u8], public_inputs_bytes: &[u8], log_circuit_size: usize, ) -> Result { let expected_proof_size = calculate_proof_size(log_circuit_size); if proof_bytes.len() != 32 * expected_proof_size { return Err(format!( "Invalid proof bytes length: {} (expected {})", proof_bytes.len(), 32 * expected_proof_size )); } let mut values = vec![]; for i in (0..).step_by(32).take(expected_proof_size) { values.push(BigUint::from_bytes_be(&proof_bytes[i..i + 32])); } if !public_inputs_bytes.len().is_multiple_of(32) { return Err(format!( "Invalid public input bytes length: {}", public_inputs_bytes.len() )); } let public_inputs_size = public_inputs_bytes.len() / 32; let mut public_inputs = vec![]; for i in (0..).step_by(32).take(public_inputs_size) { public_inputs.push(BigUint::from_bytes_be(&public_inputs_bytes[i..i + 32])); } Self::from(values, public_inputs, log_circuit_size) } pub fn from( values: Vec, public_inputs: Vec, log_circuit_size: usize, ) -> Result { let expected_proof_size = calculate_proof_size(log_circuit_size); if values.len() != expected_proof_size { return Err(format!( "Invalid proof length: {} (expected {})", values.len(), expected_proof_size )); } let mut offset = 0; // Parse pairing point object let pairing_point_object: [BigUint; PAIRING_POINT_OBJECT_LENGTH] = values [offset..offset + PAIRING_POINT_OBJECT_LENGTH] .to_vec() .try_into() .unwrap(); offset += PAIRING_POINT_OBJECT_LENGTH; fn parse_g1_proof_point(values: [BigUint; 2]) -> G1PointBigUint { let [x, y] = values; G1PointBigUint { x, y } } // Parse 9 G1 points: w1, w2, w3, lookup_read_counts, lookup_read_tags, w4, lookup_inverses, z_perm, libra_commitment_0 let mut points = vec![]; for i in (offset..).step_by(2).take(9) { points.push(parse_g1_proof_point( values[i..i + 2].to_vec().try_into().unwrap(), )); } offset += 9 * 2; let [w1, w2, w3, lookup_read_counts, lookup_read_tags, w4, lookup_inverses, z_perm, libra_commitment_0] = points.try_into().unwrap(); let libra_sum = values[offset].clone(); offset += 1; // Parse sumcheck univariates let mut sumcheck_univariates = vec![]; for i in (offset..) .step_by(ZK_BATCHED_RELATION_PARTIAL_LENGTH) .take(log_circuit_size) { sumcheck_univariates.push( values[i..i + ZK_BATCHED_RELATION_PARTIAL_LENGTH] .to_vec() .try_into() .unwrap(), ); } // Fill rest with zeros while sumcheck_univariates.len() < CONST_PROOF_SIZE_LOG_N { sumcheck_univariates.push([0u8; ZK_BATCHED_RELATION_PARTIAL_LENGTH].map(BigUint::from)); } let sumcheck_univariates: [[BigUint; ZK_BATCHED_RELATION_PARTIAL_LENGTH]; CONST_PROOF_SIZE_LOG_N] = sumcheck_univariates.try_into().unwrap(); offset += log_circuit_size * ZK_BATCHED_RELATION_PARTIAL_LENGTH; // Parse sumcheck evaluations let sumcheck_evaluations: [BigUint; NUMBER_OF_ENTITIES] = values [offset..offset + NUMBER_OF_ENTITIES] .to_vec() .try_into() .unwrap(); offset += NUMBER_OF_ENTITIES; let libra_evaluation = values[offset].clone(); offset += 1; // Parse libra_commitment_1, libra_commitment_2, gemini_masking_poly let mut points = vec![]; for i in (offset..).step_by(2).take(3) { points.push(parse_g1_proof_point( values[i..i + 2].to_vec().try_into().unwrap(), )); } offset += 3 * 2; let [libra_commitment_1, libra_commitment_2, gemini_masking_poly] = points.try_into().unwrap(); let libra_commitments = [libra_commitment_0, libra_commitment_1, libra_commitment_2]; let gemini_masking_eval = values[offset].clone(); offset += 1; // Parse gemini fold comms let mut gemini_fold_comms = vec![]; for i in (offset..).step_by(2).take(log_circuit_size - 1) { gemini_fold_comms.push(parse_g1_proof_point( values[i..i + 2].to_vec().try_into().unwrap(), )); } // Fill rest with dummy points while gemini_fold_comms.len() < CONST_PROOF_SIZE_LOG_N - 1 { gemini_fold_comms.push(G1PointBigUint { x: BigUint::from(0u8), y: BigUint::from(0u8), }); } let gemini_fold_comms: [G1PointBigUint; CONST_PROOF_SIZE_LOG_N - 1] = gemini_fold_comms.try_into().unwrap(); offset += (log_circuit_size - 1) * 2; // Parse gemini a evaluations let mut gemini_a_evaluations = values[offset..offset + log_circuit_size].to_vec(); // Fill rest with zeros while gemini_a_evaluations.len() < CONST_PROOF_SIZE_LOG_N { gemini_a_evaluations.push(BigUint::from(0u8)); } let gemini_a_evaluations: [BigUint; CONST_PROOF_SIZE_LOG_N] = gemini_a_evaluations.try_into().unwrap(); offset += log_circuit_size; let libra_poly_evals: [BigUint; 4] = values[offset..offset + 4].to_vec().try_into().unwrap(); offset += 4; // Parse shplonk_q, kzg_quotient let mut points = vec![]; for i in (offset..).step_by(2).take(2) { points.push(parse_g1_proof_point( values[i..i + 2].to_vec().try_into().unwrap(), )); } let [shplonk_q, kzg_quotient] = points.try_into().unwrap(); offset += 2 * 2; assert_eq!(offset, expected_proof_size); Ok(Self { public_inputs, pairing_point_object, w1, w2, w3, w4, z_perm, lookup_read_counts, lookup_read_tags, lookup_inverses, libra_commitments, libra_sum, sumcheck_univariates, sumcheck_evaluations, libra_evaluation, gemini_masking_poly, gemini_masking_eval, gemini_fold_comms, gemini_a_evaluations, libra_poly_evals, shplonk_q, kzg_quotient, }) } } pub struct ZKHonkTranscript { pub eta: BigUint, pub eta_two: BigUint, pub eta_three: BigUint, pub beta: BigUint, pub gamma: BigUint, pub alpha: BigUint, pub gate_challenge: BigUint, pub libra_challenge: BigUint, pub sumcheck_u_challenges: [BigUint; CONST_PROOF_SIZE_LOG_N], pub rho: BigUint, pub gemini_r: BigUint, pub shplonk_nu: BigUint, pub shplonk_z: BigUint, } impl ZKHonkTranscript { pub fn from_proof( vk: &HonkVerificationKey, proof: &ZKHonkProof, ) -> Result< ( Self, FieldElement, FieldElement, ), String, > { if proof.public_inputs.len() != vk.public_inputs_size - PAIRING_POINT_OBJECT_LENGTH { return Err(format!( "Public inputs length mismatch: proof {}, vk {}", proof.public_inputs.len(), vk.public_inputs_size - PAIRING_POINT_OBJECT_LENGTH )); } Ok(compute_zk_transcript(vk, proof, KeccakHasher::new())) } } pub fn get_zk_honk_calldata( proof: &ZKHonkProof, vk: &HonkVerificationKey, ) -> Result, String> { let (transcript, transcript_state, _) = ZKHonkTranscript::from_proof(vk, proof)?; fn element_on_curve(element: &BigUint) -> FieldElement { element_from_biguint(element) } fn g1_point_on_curve(point: &G1PointBigUint) -> Result, String> { G1Point::new( element_from_biguint(&point.x), element_from_biguint(&point.y), false, ) } let public_inputs: Vec> = proof.public_inputs.iter().map(element_on_curve).collect(); let pairing_point_object: Vec> = proof .pairing_point_object .iter() .map(element_on_curve) .collect(); let w1 = g1_point_on_curve(&proof.w1)?; let w2 = g1_point_on_curve(&proof.w2)?; let w3 = g1_point_on_curve(&proof.w3)?; let w4 = g1_point_on_curve(&proof.w4)?; let z_perm = g1_point_on_curve(&proof.z_perm)?; let lookup_read_counts = g1_point_on_curve(&proof.lookup_read_counts)?; let lookup_read_tags = g1_point_on_curve(&proof.lookup_read_tags)?; let lookup_inverses = g1_point_on_curve(&proof.lookup_inverses)?; let libra_commitments: Vec> = proof .libra_commitments .iter() .map(g1_point_on_curve) .collect::, _>>()?; let libra_sum = element_on_curve(&proof.libra_sum); let sumcheck_univariates: Vec>> = proof .sumcheck_univariates .iter() .map(|v| v.iter().map(element_on_curve).collect()) .collect(); let sumcheck_evaluations: [FieldElement; NUMBER_OF_ENTITIES] = proof .sumcheck_evaluations .iter() .map(element_on_curve) .collect::>() .try_into() .unwrap(); let libra_evaluation = element_on_curve(&proof.libra_evaluation); let gemini_masking_poly = g1_point_on_curve(&proof.gemini_masking_poly)?; let gemini_masking_eval = element_on_curve(&proof.gemini_masking_eval); let gemini_fold_comms: Vec> = proof .gemini_fold_comms .iter() .map(g1_point_on_curve) .collect::, _>>()?; let gemini_a_evaluations: [FieldElement; CONST_PROOF_SIZE_LOG_N] = proof .gemini_a_evaluations .iter() .map(element_on_curve) .collect::>() .try_into() .unwrap(); let libra_poly_evals: [FieldElement; 4] = proof .libra_poly_evals .iter() .map(element_on_curve) .collect::>() .try_into() .unwrap(); let shplonk_q = g1_point_on_curve(&proof.shplonk_q)?; let kzg_quotient = g1_point_on_curve(&proof.kzg_quotient)?; let qm = g1_point_on_curve(&vk.qm)?; let qc = g1_point_on_curve(&vk.qc)?; let ql = g1_point_on_curve(&vk.ql)?; let qr = g1_point_on_curve(&vk.qr)?; let qo = g1_point_on_curve(&vk.qo)?; let q4 = g1_point_on_curve(&vk.q4)?; let q_lookup = g1_point_on_curve(&vk.q_lookup)?; let q_arith = g1_point_on_curve(&vk.q_arith)?; let q_delta_range = g1_point_on_curve(&vk.q_delta_range)?; let q_elliptic = g1_point_on_curve(&vk.q_elliptic)?; let q_memory = g1_point_on_curve(&vk.q_memory)?; let q_nnf = g1_point_on_curve(&vk.q_nnf)?; let q_poseidon2_external = g1_point_on_curve(&vk.q_poseidon2_external)?; let q_poseidon2_internal = g1_point_on_curve(&vk.q_poseidon2_internal)?; let s1 = g1_point_on_curve(&vk.s1)?; let s2 = g1_point_on_curve(&vk.s2)?; let s3 = g1_point_on_curve(&vk.s3)?; let s4 = g1_point_on_curve(&vk.s4)?; let id1 = g1_point_on_curve(&vk.id1)?; let id2 = g1_point_on_curve(&vk.id2)?; let id3 = g1_point_on_curve(&vk.id3)?; let id4 = g1_point_on_curve(&vk.id4)?; let t1 = g1_point_on_curve(&vk.t1)?; let t2 = g1_point_on_curve(&vk.t2)?; let t3 = g1_point_on_curve(&vk.t3)?; let t4 = g1_point_on_curve(&vk.t4)?; let lagrange_first = g1_point_on_curve(&vk.lagrange_first)?; let lagrange_last = g1_point_on_curve(&vk.lagrange_last)?; let sumcheck_u_challenges: [FieldElement; CONST_PROOF_SIZE_LOG_N] = transcript .sumcheck_u_challenges .iter() .map(element_on_curve) .collect::>() .try_into() .unwrap(); let rho = element_on_curve(&transcript.rho); let gemini_r = element_on_curve(&transcript.gemini_r); let shplonk_nu = element_on_curve(&transcript.shplonk_nu); let shplonk_z = element_on_curve(&transcript.shplonk_z); let consistent = check_evals_consistency( &libra_evaluation, &libra_poly_evals, &gemini_r, &sumcheck_u_challenges, vk.log_circuit_size, ) .map_err(|e| format!("Field error: {:?}", e))?; if !consistent { return Err("Consistency check failed".to_string()); } let scalars = extract_msm_scalars( vk.log_circuit_size, compute_shplemini_msm_scalars( vk.log_circuit_size, &sumcheck_evaluations, &gemini_masking_eval, &gemini_a_evaluations, &libra_poly_evals, &gemini_r, &rho, &shplonk_z, &shplonk_nu, &sumcheck_u_challenges, ) .map_err(|e| format!("Field error: {:?}", e))?, ); let mut scalars_msm = scalars; // Swap last two scalars let len = scalars_msm.len(); if len >= 2 { scalars_msm.swap(len - 1, len - 2); } // Place first scalar just after the vk_lagrange_last point (index 28) if !scalars_msm.is_empty() { let first_scalar = scalars_msm.remove(0); scalars_msm.insert(28, first_scalar); } let proof_data = { let mut call_data = vec![]; let call_data_ref = &mut call_data; fn push(call_data_ref: &mut Vec, value: T) where BigUint: From, { call_data_ref.push(value.into()); } fn push_element(call_data_ref: &mut Vec, element: &FieldElement) where F: IsPrimeField, FieldElement: ByteConversion, { let limbs = field_element_to_u256_limbs(element); for limb in limbs { push(call_data_ref, limb); } } fn push_elements( call_data_ref: &mut Vec, elements: &[FieldElement], prepend_length: bool, ) { if prepend_length { push(call_data_ref, elements.len()); } for element in elements { push_element(call_data_ref, element); } } fn push_point(call_data_ref: &mut Vec, point: &G1Point) { push_element(call_data_ref, &point.x); push_element(call_data_ref, &point.y); } push_elements(call_data_ref, &public_inputs, true); push_elements(call_data_ref, &pairing_point_object, true); push_point(call_data_ref, &w1); push_point(call_data_ref, &w2); push_point(call_data_ref, &w3); push_point(call_data_ref, &w4); push_point(call_data_ref, &z_perm); push_point(call_data_ref, &lookup_read_counts); push_point(call_data_ref, &lookup_read_tags); push_point(call_data_ref, &lookup_inverses); push(call_data_ref, libra_commitments.len()); for point in &libra_commitments { push_point(call_data_ref, point); } push_element(call_data_ref, &libra_sum); push_elements( call_data_ref, &(0..vk.log_circuit_size) .flat_map(|i| sumcheck_univariates[i].clone()) .collect::>(), true, ); push_elements(call_data_ref, &sumcheck_evaluations, true); push_element(call_data_ref, &libra_evaluation); push_point(call_data_ref, &gemini_masking_poly); push_element(call_data_ref, &gemini_masking_eval); push(call_data_ref, vk.log_circuit_size - 1); for point in &gemini_fold_comms[..vk.log_circuit_size - 1] { push_point(call_data_ref, point); } push_elements( call_data_ref, &gemini_a_evaluations[..vk.log_circuit_size], true, ); push_elements(call_data_ref, &libra_poly_evals, true); push_point(call_data_ref, &shplonk_q); push_point(call_data_ref, &kzg_quotient); call_data }; let mut points = vec![ qm, // 0 qc, // 1 ql, // 2 qr, // 3 qo, // 4 q4, // 5 q_lookup, // 6 q_arith, // 7 q_delta_range, // 8 q_elliptic, // 9 q_memory, // 10 q_nnf, // 11 q_poseidon2_external, // 12 q_poseidon2_internal, // 13 s1, // 14 s2, // 15 s3, // 16 s4, // 17 id1, // 18 id2, // 19 id3, // 20 id4, // 21 t1, // 22 t2, // 23 t3, // 24 t4, // 25 lagrange_first, // 26 lagrange_last, // 27 gemini_masking_poly, // 28 w1, // 29 w2, // 30 w3, // 31 w4, // 32 z_perm, // 33 lookup_inverses, // 34 lookup_read_counts, // 35 lookup_read_tags, // 36 ]; points.extend(gemini_fold_comms[0..vk.log_circuit_size - 1].to_vec()); points.extend(libra_commitments); points.push(kzg_quotient.clone()); points.push(G1Point::generator()); let two = FieldElement::::one().double(); let vk_hash_element: FieldElement = element_from_biguint(&vk.vk_hash); let mut state = [vk_hash_element, transcript_state, two]; PoseidonCairoStark252::hades_permutation(&mut state); let msm_data = msm_calldata::calldata_builder(&points, &scalars_msm, CurveID::BN254 as usize, false, true); let p_0 = G1Point::msm(&points, &scalars_msm).add(&shplonk_q); let p_1 = kzg_quotient.neg(); let g2_point_kzg_1 = G2Point::generator(); let g2_point_kzg_2 = G2Point::new( [ FieldElement::from_hex_unchecked( "0118C4D5B837BCC2BC89B5B398B5974E9F5944073B32078B7E231FEC938883B0", ), FieldElement::from_hex_unchecked( "260E01B251F6F1C7E7FF4E580791DEE8EA51D87A358E038B4EFE30FAC09383C1", ), ], [ FieldElement::from_hex_unchecked( "22FEBDA3C0C0632A56475B4214E5615E11E6DD3F96E6CEA2854A87D4DACC5E55", ), FieldElement::from_hex_unchecked( "04FC6369F7110FE3D25156C1BB9A72859CF2A04641F99BA4EE413C80DA6A5FE4", ), ], )?; let pairs = [ G1G2Pair::new(p_0, g2_point_kzg_1), G1G2Pair::new(p_1, g2_point_kzg_2), ]; let mpc_data = { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree12ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree6ExtensionField; mpc_calldata::calldata_builder::< true, BN254PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(&pairs, 2, &None)? }; let size = proof_data.len() + msm_data.len() + mpc_data.len(); let mut call_data = vec![size.into()]; call_data.extend(proof_data); call_data.extend(msm_data); call_data.extend(mpc_data); Ok(call_data) } #[allow(clippy::needless_range_loop)] fn compute_zk_transcript( vk: &HonkVerificationKey, proof: &ZKHonkProof, mut hasher: T, ) -> ( ZKHonkTranscript, FieldElement, FieldElement, ) { fn split(ch: &[u8]) -> [BigUint; 2] { let ch_int = BigUint::from_bytes_be(ch); let mask = (BigUint::from(1u8) << 128) - 1u8; let low_128 = &ch_int & &mask; let high_128 = &ch_int >> 128; [low_128, high_128] } // Round 0: vk_hash, public_inputs, pairing_point_object, w1, w2, w3 hasher.update(&vk.vk_hash); for pub_input in &proof.public_inputs { hasher.update(pub_input); } for pub_input in &proof.pairing_point_object { hasher.update(pub_input); } hasher.update_point(&proof.w1); hasher.update_point(&proof.w2); hasher.update_point(&proof.w3); let ch0 = hasher.digest_reset(); let [eta, eta_two] = split(&ch0); hasher.update_bytes(&ch0); let ch0 = hasher.digest_reset(); let [eta_three, _] = split(&ch0); // Round 1: ch0, lookup_read_counts, lookup_read_tags, w4 hasher.update_bytes(&ch0); hasher.update_point(&proof.lookup_read_counts); hasher.update_point(&proof.lookup_read_tags); hasher.update_point(&proof.w4); let ch1 = hasher.digest_reset(); let [beta, gamma] = split(&ch1); // Round 2: ch1, lookup_inverses, z_perm -> alpha hasher.update_bytes(&ch1); hasher.update_point(&proof.lookup_inverses); hasher.update_point(&proof.z_perm); let ch2 = hasher.digest_reset(); let [alpha, _] = split(&ch2); // Round 3: Gate challenge hasher.update_bytes(&ch2); let ch3 = hasher.digest_reset(); let [gate_challenge, _] = split(&ch3); // Round 3.5: Libra challenge hasher.update_bytes(&ch3); hasher.update_point(&proof.libra_commitments[0]); hasher.update(&proof.libra_sum); let ch3 = hasher.digest_reset(); let [libra_challenge, _] = split(&ch3); // Round 4: Sumcheck u challenges let mut sumcheck_u_challenges = [0u8; CONST_PROOF_SIZE_LOG_N].map(BigUint::from); let mut ch4 = ch3; for i in 0..vk.log_circuit_size { hasher.update_bytes(&ch4); for j in 0..ZK_BATCHED_RELATION_PARTIAL_LENGTH { hasher.update(&proof.sumcheck_univariates[i][j]); } ch4 = hasher.digest_reset(); let [challenge, _] = split(&ch4); sumcheck_u_challenges[i] = challenge; } // Rho challenge hasher.update_bytes(&ch4); for i in 0..NUMBER_OF_ENTITIES { hasher.update(&proof.sumcheck_evaluations[i]); } hasher.update(&proof.libra_evaluation); hasher.update_point(&proof.libra_commitments[1]); hasher.update_point(&proof.libra_commitments[2]); hasher.update_point(&proof.gemini_masking_poly); hasher.update(&proof.gemini_masking_eval); let c5 = hasher.digest_reset(); let [rho, _] = split(&c5); // Gemini R hasher.update_bytes(&c5); for i in 0..vk.log_circuit_size - 1 { hasher.update_point(&proof.gemini_fold_comms[i]); } let c6 = hasher.digest_reset(); let [gemini_r, _] = split(&c6); // Shplonk Nu hasher.update_bytes(&c6); for i in 0..vk.log_circuit_size { hasher.update(&proof.gemini_a_evaluations[i]); } for i in 0..4 { hasher.update(&proof.libra_poly_evals[i]); } let c7 = hasher.digest_reset(); let [shplonk_nu, _] = split(&c7); // Shplonk Z hasher.update_bytes(&c7); hasher.update_point(&proof.shplonk_q); let c8 = hasher.digest_reset(); let [shplonk_z_low, shplonk_z_high] = split(&c8); let mut state: [FieldElement; 3] = [ element_from_biguint(&shplonk_z_low), element_from_biguint(&shplonk_z_high), FieldElement::one().double(), ]; PoseidonCairoStark252::hades_permutation(&mut state); let [s0, s1, _] = state; ( ZKHonkTranscript { eta, eta_two, eta_three, beta, gamma, alpha, gate_challenge, libra_challenge, sumcheck_u_challenges, rho, gemini_r, shplonk_nu, shplonk_z: shplonk_z_low, }, s0, s1, ) } #[allow(clippy::needless_range_loop, clippy::too_many_arguments)] fn compute_shplemini_msm_scalars( log_circuit_size: usize, sumcheck_evaluations: &[FieldElement; NUMBER_OF_ENTITIES], gemini_masking_eval: &FieldElement, gemini_a_evaluations: &[FieldElement; CONST_PROOF_SIZE_LOG_N], libra_poly_evals: &[FieldElement; 4], gemini_r: &FieldElement, rho: &FieldElement, shplonk_z: &FieldElement, shplonk_nu: &FieldElement, sumcheck_u_challenges: &[FieldElement; CONST_PROOF_SIZE_LOG_N], ) -> Result< [Option; NUMBER_UNSHIFTED + CONST_PROOF_SIZE_LOG_N + LIBRA_COMMITMENTS + 3], FieldError, > { let powers_of_evaluations_challenge = { let mut values = vec![]; let mut value = *gemini_r; for _ in 0..log_circuit_size { values.push(value); value = value * value; } values }; let mut pos_inverted_denominator = (shplonk_z - powers_of_evaluations_challenge[0]).inv()?; let mut neg_inverted_denominator = (shplonk_z + powers_of_evaluations_challenge[0]).inv()?; let mut scalars = { const NONE: Option> = None; let mut values = [NONE; NUMBER_UNSHIFTED + CONST_PROOF_SIZE_LOG_N + LIBRA_COMMITMENTS + 3]; for i in 0..values.len() { values[i] = Some(FieldElement::zero()); } values }; let unshifted_scalar = pos_inverted_denominator + (shplonk_nu * neg_inverted_denominator); let unshifted_scalar_neg = -unshifted_scalar; let shifted_scalar_neg = -(gemini_r.inv()? * (pos_inverted_denominator - (shplonk_nu * neg_inverted_denominator))); scalars[0] = Some(FieldElement::one()); let mut batched_evaluation = *gemini_masking_eval; let mut batching_challenge = *rho; scalars[1] = Some(unshifted_scalar_neg); for i in 0..NUMBER_UNSHIFTED { scalars[i + 2] = Some(unshifted_scalar_neg * batching_challenge); batched_evaluation += sumcheck_evaluations[i] * batching_challenge; batching_challenge *= rho; } for i in 0..NUMBER_TO_BE_SHIFTED { let scalar_offset = i + SHIFTED_COMMITMENTS_START; let evaluation_offset = i + NUMBER_UNSHIFTED; scalars[scalar_offset] = Some(scalars[scalar_offset].unwrap() + (shifted_scalar_neg * batching_challenge)); batched_evaluation += sumcheck_evaluations[evaluation_offset] * batching_challenge; // skip last round: if i < NUMBER_TO_BE_SHIFTED - 1 { batching_challenge *= rho; } } // computeFoldPosEvaluations let fold_pos_evaluations = { let mut values = vec![FieldElement::from(0); CONST_PROOF_SIZE_LOG_N]; let mut batched_eval_accumulator = batched_evaluation; for i in (0..log_circuit_size).rev() { let challenge_power = &powers_of_evaluations_challenge[i]; let u = &sumcheck_u_challenges[i]; let eval_neg = &gemini_a_evaluations[i]; let term = challenge_power * (FieldElement::::one() - u); let batched_eval_round_acc = (FieldElement::::from(2) * challenge_power * batched_eval_accumulator) - (eval_neg * (term - u)); let den = term + u; batched_eval_accumulator = batched_eval_round_acc * den.inv()?; values[i] = batched_eval_accumulator; } values }; let mut constant_term_accumulator = fold_pos_evaluations[0] * pos_inverted_denominator; constant_term_accumulator += gemini_a_evaluations[0] * shplonk_nu * neg_inverted_denominator; let mut batching_challenge = shplonk_nu * shplonk_nu; let boundary = NUMBER_UNSHIFTED + 2; for i in 0..log_circuit_size - 1 { pos_inverted_denominator = (shplonk_z - powers_of_evaluations_challenge[i + 1]).inv()?; neg_inverted_denominator = (shplonk_z + powers_of_evaluations_challenge[i + 1]).inv()?; let scaling_factor_pos = batching_challenge * pos_inverted_denominator; let scaling_factor_neg = batching_challenge * shplonk_nu * neg_inverted_denominator; scalars[boundary + i] = Some(-(scaling_factor_neg + scaling_factor_pos)); let mut accum_contribution = scaling_factor_neg * gemini_a_evaluations[i + 1]; accum_contribution += scaling_factor_pos * fold_pos_evaluations[i + 1]; constant_term_accumulator += accum_contribution; batching_challenge *= shplonk_nu * shplonk_nu; } let boundary = boundary + log_circuit_size - 1; let subgroup_generator = FieldElement::::from_hex_unchecked( "07B0C561A6148404F086204A9F36FFB0617942546750F230C893619174A57A76", ); let denom_0 = (FieldElement::::from(1) / (shplonk_z - gemini_r)).unwrap(); let denom_1 = (FieldElement::::from(1) / (shplonk_z - subgroup_generator * gemini_r)) .unwrap(); let denominators = [denom_0, denom_1, denom_0, denom_0]; let mut batching_scalars = vec![]; batching_challenge *= shplonk_nu * shplonk_nu; for i in 0..LIBRA_EVALUATIONS { let scaling_factor = denominators[i] * batching_challenge; batching_scalars.push(-scaling_factor); // skip last step: if i < LIBRA_EVALUATIONS - 1 { batching_challenge *= shplonk_nu; } constant_term_accumulator += scaling_factor * libra_poly_evals[i]; } scalars[boundary] = Some(batching_scalars[0]); scalars[boundary + 1] = Some(batching_scalars[1] + batching_scalars[2]); scalars[boundary + 2] = Some(batching_scalars[3]); scalars[boundary + 3] = Some(constant_term_accumulator); scalars[boundary + 4] = Some(*shplonk_z); Ok(scalars .into_iter() .map(|v| v.map(|e| element_to_biguint(&e))) .collect::>() .try_into() .unwrap()) } fn check_evals_consistency( libra_evaluation: &FieldElement, libra_poly_evals: &[FieldElement; 4], gemini_r: &FieldElement, sumcheck_u_challenges: &[FieldElement; CONST_PROOF_SIZE_LOG_N], log_circuit_size: usize, ) -> Result { let vanishing_poly_eval = gemini_r.pow(SUBGROUP_SIZE) - FieldElement::::from(1); if vanishing_poly_eval == FieldElement::::from(0) { return Ok(false); } let mut challenge_poly_lagrange = vec![FieldElement::::from(0); SUBGROUP_SIZE]; challenge_poly_lagrange[0] = FieldElement::::from(1); for (round, u_challenge) in sumcheck_u_challenges .iter() .enumerate() .take(log_circuit_size) { let curr_idx = 1 + LIBRA_UNIVARIATES_LENGTH * round; challenge_poly_lagrange[curr_idx] = FieldElement::::from(1); for idx in curr_idx + 1..curr_idx + LIBRA_UNIVARIATES_LENGTH { challenge_poly_lagrange[idx] = challenge_poly_lagrange[idx - 1] * u_challenge; } } let subgroup_generator_inverse = FieldElement::::from_hex_unchecked( "204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6", ); let mut root_power = FieldElement::::from(1); let mut challenge_poly_eval = FieldElement::::from(0); let mut denominators = vec![FieldElement::::from(0); SUBGROUP_SIZE]; for idx in 0..SUBGROUP_SIZE { denominators[idx] = root_power * gemini_r - FieldElement::::from(1); denominators[idx] = denominators[idx].inv()?; challenge_poly_eval += challenge_poly_lagrange[idx] * denominators[idx]; // skip last step: if idx < SUBGROUP_SIZE - 1 { root_power *= subgroup_generator_inverse; } } let numerator = vanishing_poly_eval * FieldElement::::from(SUBGROUP_SIZE as u64).inv()?; challenge_poly_eval *= numerator; let lagrange_first = denominators[0] * numerator; let lagrange_last = denominators[SUBGROUP_SIZE - 1] * numerator; let mut diff = lagrange_first * libra_poly_evals[2]; diff += (gemini_r - subgroup_generator_inverse) * (libra_poly_evals[1] - libra_poly_evals[2] - libra_poly_evals[0] * challenge_poly_eval); diff = diff + lagrange_last * (libra_poly_evals[2] - libra_evaluation) - vanishing_poly_eval * libra_poly_evals[3]; if diff != FieldElement::::from(0) { return Ok(false); } Ok(true) } fn extract_msm_scalars( log_circuit_size: usize, scalars: [Option; NUMBER_UNSHIFTED + CONST_PROOF_SIZE_LOG_N + LIBRA_COMMITMENTS + 3], ) -> Vec { // Remove first element (==1) // scalars[1..NUMBER_UNSHIFTED+2] are the unshifted/shifted scalars // scalars[NUMBER_UNSHIFTED+2..NUMBER_UNSHIFTED+2+log_n-1] are gemini fold comm scalars // scalars[NUMBER_UNSHIFTED+2+log_n-1..NUMBER_UNSHIFTED+2+log_n-1+5] are libra + final scalars let gemini_end = NUMBER_UNSHIFTED + 2 + log_circuit_size - 1; let libra_start = gemini_end; let libra_end = libra_start + 5; // 3 libra + constant_term + shplonk_z [&scalars[1..gemini_end], &scalars[libra_start..libra_end]] .concat() .into_iter() .flatten() .collect() } ================================================ FILE: tools/garaga_rs/src/calldata/mod.rs ================================================ pub mod drand_calldata; pub mod drand_tlock_calldata; pub mod full_proof_with_hints { pub mod groth16; pub mod zk_honk; } pub mod mpc_calldata; pub mod msm_calldata; pub mod signatures; use crate::definitions::{get_modulus_from_curve_id, CurveID}; use num_bigint::BigUint; #[derive(Debug, PartialEq)] pub struct G1PointBigUint { pub x: BigUint, pub y: BigUint, } #[derive(Debug, PartialEq)] pub struct G2PointBigUint { pub x0: BigUint, pub x1: BigUint, pub y0: BigUint, pub y1: BigUint, } impl G1PointBigUint { pub fn neg(&self, curve_id: CurveID) -> Self { let modulus = get_modulus_from_curve_id(curve_id); G1PointBigUint { x: self.x.clone(), y: &modulus - &self.y, } } pub fn flatten(&self) -> Vec { vec![self.x.clone(), self.y.clone()] } pub fn from(values: Vec) -> Self { G1PointBigUint { x: values[0].clone(), y: values[1].clone(), } } } impl G2PointBigUint { pub fn flatten(&self) -> Vec { vec![ self.x0.clone(), self.x1.clone(), self.y0.clone(), self.y1.clone(), ] } pub fn from(values: Vec) -> Self { G2PointBigUint { x0: values[0].clone(), x1: values[1].clone(), y0: values[2].clone(), y1: values[3].clone(), } } } ================================================ FILE: tools/garaga_rs/src/calldata/mpc_calldata.rs ================================================ use crate::algebra::g1g2pair::G1G2Pair; use crate::algebra::polynomial::Polynomial; use crate::definitions::{CurveID, CurveParamsProvider, Stark252PrimeField}; use crate::io::{ element_from_bytes_be, field_element_to_u288_limbs, field_element_to_u384_limbs, field_elements_from_big_uints, parse_g1_g2_pairs_from_flattened_field_elements_list, }; use crate::pairing::multi_miller_loop::miller_loop; use crate::pairing::multi_pairing_check::{get_max_q_degree, multi_pairing_check}; use crate::poseidon_transcript::CairoPoseidonTranscript; use lambdaworks_math::field::element::FieldElement; use lambdaworks_math::field::traits::{IsField, IsPrimeField, IsSubFieldOf}; use lambdaworks_math::traits::ByteConversion; use num_bigint::BigUint; pub fn mpc_calldata_builder( curve_id: usize, values1: &[BigUint], n_fixed_g2: usize, values2: &[BigUint], ) -> Result, String> { if !values1.len().is_multiple_of(6) { return Err("Pairs values length must be a multiple of 6".to_string()); } let n_pairs = values1.len() / 6; if n_pairs < 2 { return Err("A minimum number of 2 pairs is required".to_string()); } if !values2.is_empty() && values2.len() != 6 { return Err("Public pair values length must be 0 or 6".to_string()); } if n_fixed_g2 > n_pairs { return Err("Fixed G2 count must be less than or equal to pairs count".to_string()); } let curve_id = CurveID::try_from(curve_id)?; match curve_id { CurveID::BN254 => { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::BN254PrimeField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree6ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree12ExtensionField; handle_curve::< true, BN254PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(values1, n_fixed_g2, values2) } CurveID::BLS12_381 => { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::BLS12381PrimeField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree6ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree12ExtensionField; handle_curve::< false, BLS12381PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(values1, n_fixed_g2, values2) } _ => Err("Unsupported curve".to_string()), } } fn handle_curve( values1: &[BigUint], n_fixed_g2: usize, values2: &[BigUint], ) -> Result, String> where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, FieldElement: ByteConversion, { let elements = field_elements_from_big_uints::(values1); let pairs = parse_g1_g2_pairs_from_flattened_field_elements_list(&elements)?; let public_pair = if values2.len() == 6 { let elements = field_elements_from_big_uints::(values2); let pairs = parse_g1_g2_pairs_from_flattened_field_elements_list(&elements)?; Some(pairs[0].clone()) } else { None }; calldata_builder::(&pairs, n_fixed_g2, &public_pair) } fn extra_miller_loop_result(public_pair: &G1G2Pair) -> Polynomial where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { miller_loop( std::slice::from_ref(&public_pair.g1), std::slice::from_ref(&public_pair.g2), ) } #[allow(clippy::type_complexity)] fn multi_pairing_check_result( pairs: &[G1G2Pair], m: &Option>, ) -> ( Polynomial, Option>, Polynomial, Vec>, Vec>, Vec>, ) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, FieldElement: ByteConversion, { assert!(pairs.len() >= 2); let mut p = vec![]; let mut q = vec![]; for pair in pairs { p.push(pair.g1.clone()); q.push(pair.g2.clone()); } let (f, lambda_root, lambda_root_inverse, scaling_factor, qis, ris) = multi_pairing_check(&p, &q, m); let curve_id = F::get_curve_params().curve_id; let ris = match curve_id { CurveID::BN254 => ris[1..].to_vec(), CurveID::BLS12_381 => ris, _ => unimplemented!(), }; ( f, lambda_root, lambda_root_inverse, scaling_factor, qis, ris, ) } #[allow(clippy::too_many_arguments)] fn hash_hints_and_get_base_random_rlc_coeff( pairs: &[G1G2Pair], n_fixed_g2: usize, curve_id: CurveID, three_limbs_only: bool, lambda_root: &Option>, lambda_root_inverse: &Polynomial, scaling_factor: &[FieldElement], ris: &[Polynomial], m: Option>, ) -> (FieldElement, CairoPoseidonTranscript) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, FieldElement: ByteConversion, { let curve_name = match curve_id { CurveID::BN254 => "BN254", CurveID::BLS12_381 => "BLS12_381", _ => unimplemented!(), }; let init_hash_text = format!("MPCHECK_{}_{}P_{}F", curve_name, pairs.len(), n_fixed_g2); let init_hash_hex = "0x".to_owned() + &init_hash_text .as_bytes() .iter() .fold(String::new(), |mut acc, byte| { use std::fmt::Write; write!(&mut acc, "{:02X}", byte).unwrap(); acc }); let init_hash = FieldElement::from_hex(&init_hash_hex).unwrap(); let mut transcript = CairoPoseidonTranscript::new(init_hash); for pair in pairs { let pairs_elements_flat = pair.flatten(); transcript.hash_emulated_field_elements(&pairs_elements_flat, None, false); } // println!( // "RS transcript.state1: {:?}", // transcript.state[0].representative().to_string() // ); if let Some(lambda_root) = lambda_root { assert_eq!(curve_id, CurveID::BN254); transcript.hash_emulated_field_elements( &lambda_root.get_coefficients_ext_degree(12), None, three_limbs_only, ); } transcript.hash_emulated_field_elements( &lambda_root_inverse.get_coefficients_ext_degree(12), None, three_limbs_only, ); transcript.hash_emulated_field_elements(scaling_factor, None, three_limbs_only); for ri in ris { transcript.hash_emulated_field_elements( &ri.get_coefficients_ext_degree(12), None, three_limbs_only, ); } if let Some(m) = m { transcript.hash_emulated_field_elements( &m.get_coefficients_ext_degree(12), None, three_limbs_only, ); } ( element_from_bytes_be(&transcript.state[1].to_bytes_be()), transcript, ) } fn compute_big_q_coeffs( n_pairs: usize, qis: &[Polynomial], ris_len: usize, c1: &FieldElement, ) -> Vec> where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { let curve_id = F::get_curve_params().curve_id; let extra_n = match curve_id { CurveID::BN254 => 1, CurveID::BLS12_381 => 0, _ => unimplemented!(), }; let n_relations_with_ci = ris_len + extra_n; let (mut ci, mut big_q) = (FieldElement::one(), Polynomial::::zero()); for i in (0..n_relations_with_ci).rev() { big_q = big_q + (&qis[i] * &Polynomial::new(vec![ci.clone()])); ci *= c1; } let big_q_expected_len = get_max_q_degree(curve_id, n_pairs) + 1; let mut big_q_coeffs = big_q.coefficients; while big_q_coeffs.len() < big_q_expected_len { big_q_coeffs.push(FieldElement::from(0)); } big_q_coeffs } fn hash_big_q_and_get_z( big_q: &[FieldElement], n_pairs: usize, n_fixed_g2: usize, three_limbs_only: bool, c1: &FieldElement, ) -> FieldElement where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, FieldElement: ByteConversion, { let init_hash_text = init_hash_label::(n_pairs, n_fixed_g2, true); let mut new_transcript = new_transcript_from_text(init_hash_text); seed_transcript_with_base_rlc::(&mut new_transcript, c1, three_limbs_only); new_transcript.hash_emulated_field_elements(big_q, None, three_limbs_only); new_transcript.state[0] } #[allow(clippy::type_complexity)] fn build_mpcheck_hint( pairs: &[G1G2Pair], n_fixed_g2: usize, public_pair: &Option>, ) -> ( Polynomial, Option>, Polynomial, Vec>, Vec>, Vec>, FieldElement, ) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, FieldElement: ByteConversion, { let n_pairs = pairs.len(); assert!(n_pairs >= 2); assert!(n_fixed_g2 <= n_pairs); let curve_id = F::get_curve_params().curve_id; let three_limbs_only: bool = !matches!(curve_id, CurveID::BLS12_381); let m = public_pair .as_ref() .map(|public_pair| extra_miller_loop_result(public_pair)); let (f, lambda_root, lambda_root_inverse, scaling_factor, qis, ris) = multi_pairing_check_result(pairs, &m); let (c1, _transcript) = hash_hints_and_get_base_random_rlc_coeff( pairs, n_fixed_g2, curve_id, three_limbs_only, &lambda_root, &lambda_root_inverse, &scaling_factor, &ris, m, ); let big_q_coeffs = compute_big_q_coeffs(n_pairs, &qis, ris.len(), &c1); let z = hash_big_q_and_get_z::(&big_q_coeffs, n_pairs, n_fixed_g2, three_limbs_only, &c1); // Assert last Ri is 1 assert_eq!(ris[ris.len() - 1], Polynomial::one()); // Skip last Ri as it is known to be 1 for pairing checks let ris = ris[..ris.len() - 1].to_vec(); ( f, lambda_root, lambda_root_inverse, scaling_factor, ris, big_q_coeffs, z, ) } fn init_hash_label>( n_pairs: usize, n_fixed_g2: usize, second_stage: bool, ) -> String { let curve_name = match F::get_curve_params().curve_id { CurveID::BN254 => "BN254", CurveID::BLS12_381 => "BLS12_381", _ => unreachable!(), }; if second_stage { format!("MPCHECK_{}_{}P_{}F_II", curve_name, n_pairs, n_fixed_g2) } else { format!("MPCHECK_{}_{}P_{}F", curve_name, n_pairs, n_fixed_g2) } } fn seed_transcript_with_base_rlc( transcript: &mut CairoPoseidonTranscript, c1: &FieldElement, three_limbs_only: bool, ) where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { transcript.hash_emulated_field_elements(std::slice::from_ref(c1), None, three_limbs_only); } fn new_transcript_from_text(init_hash_text: String) -> CairoPoseidonTranscript { let init_hash_hex = "0x".to_owned() + &init_hash_text .as_bytes() .iter() .fold(String::new(), |mut acc, byte| { use std::fmt::Write; write!(&mut acc, "{:02X}", byte).unwrap(); acc }); let init_hash = FieldElement::from_hex(&init_hash_hex).unwrap(); CairoPoseidonTranscript::new(init_hash) } pub fn calldata_builder( pairs: &[G1G2Pair], n_fixed_g2: usize, public_pair: &Option>, ) -> Result, String> where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, FieldElement: ByteConversion, { let (f, lambda_root, lambda_root_inverse, scaling_factor, ris, big_q_coeffs, z) = build_mpcheck_hint(pairs, n_fixed_g2, public_pair); if f != Polynomial::one() { return Err("Pairing check is not == 1".to_string()); } let mut call_data = vec![]; let call_data_ref = &mut call_data; fn push(call_data_ref: &mut Vec, value: T) where BigUint: From, { call_data_ref.push(value.into()); } fn push_element( call_data_ref: &mut Vec, element: &FieldElement, ) where F: IsPrimeField, FieldElement: ByteConversion, { if USE_288 { let limbs = field_element_to_u288_limbs(element); for limb in limbs { push(call_data_ref, limb); } } else { let limbs = field_element_to_u384_limbs(element); for limb in limbs { push(call_data_ref, limb); } } } fn push_elements( call_data_ref: &mut Vec, elements: &[FieldElement], prepend_length: bool, ) where F: IsPrimeField, FieldElement: ByteConversion, { if prepend_length { push(call_data_ref, elements.len()); } for element in elements { push_element::(call_data_ref, element); } } if let Some(lambda_root) = lambda_root { push_elements::( call_data_ref, &lambda_root.get_coefficients_ext_degree(12), false, ); } push_elements::( call_data_ref, &lambda_root_inverse.get_coefficients_ext_degree(12), false, ); push_elements::(call_data_ref, &scaling_factor, false); push(call_data_ref, ris.len()); for ri in ris { push_elements::(call_data_ref, &ri.get_coefficients_ext_degree(12), false); } push_elements::(call_data_ref, &big_q_coeffs, true); push(call_data_ref, BigUint::from_bytes_be(&z.to_bytes_be())); Ok(call_data) } ================================================ FILE: tools/garaga_rs/src/calldata/msm_calldata.rs ================================================ use crate::algebra::g1point::G1Point; use crate::definitions::{ BLS12381PrimeField, BN254PrimeField, CurveParamsProvider, FieldElement, GrumpkinPrimeField, SECP256K1PrimeField, SECP256R1PrimeField, X25519PrimeField, }; use crate::hints::fake_glv::{get_fake_glv_hint, get_glv_fake_glv_hint}; use crate::io::{ element_to_biguint, field_element_to_u288_limbs, field_element_to_u384_limbs, field_elements_from_big_uints, parse_g1_points_from_flattened_field_elements_list, scalar_to_limbs, }; use lambdaworks_math::{field::traits::IsPrimeField, traits::ByteConversion}; use num_bigint::BigUint; use crate::definitions::CurveID; pub fn msm_calldata_builder( values: &[BigUint], scalars: &[BigUint], curve_id: usize, include_points_and_scalars: bool, serialize_as_pure_felt252_array: bool, ) -> Result, String> { if values.len() != 2 * scalars.len() { return Err("Values length must be twice the scalars length".to_string()); } let curve_id = CurveID::try_from(curve_id)?; match curve_id { CurveID::BN254 => handle_curve::( values, scalars, curve_id as usize, include_points_and_scalars, serialize_as_pure_felt252_array, ), CurveID::BLS12_381 => handle_curve::( values, scalars, curve_id as usize, include_points_and_scalars, serialize_as_pure_felt252_array, ), CurveID::SECP256K1 => handle_curve::( values, scalars, curve_id as usize, include_points_and_scalars, serialize_as_pure_felt252_array, ), CurveID::SECP256R1 => handle_curve::( values, scalars, curve_id as usize, include_points_and_scalars, serialize_as_pure_felt252_array, ), CurveID::X25519 => handle_curve::( values, scalars, curve_id as usize, include_points_and_scalars, serialize_as_pure_felt252_array, ), CurveID::GRUMPKIN => handle_curve::( values, scalars, curve_id as usize, include_points_and_scalars, serialize_as_pure_felt252_array, ), } } fn handle_curve( values: &[BigUint], scalars: &[BigUint], curve_id: usize, include_points_and_scalars: bool, serialize_as_pure_felt252_array: bool, ) -> Result, String> where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { let elements = field_elements_from_big_uints::(values); let points = parse_g1_points_from_flattened_field_elements_list(&elements)?; let limit = &F::get_curve_params().n; if !scalars.iter().all(|x| x < limit) { return Err("Scalar value must be less than the curve order".to_string()); } Ok(calldata_builder::( &points, scalars, curve_id, include_points_and_scalars, serialize_as_pure_felt252_array, )) } #[allow(non_snake_case)] pub fn calldata_builder>( points: &[G1Point], scalars: &[BigUint], curve_id: usize, include_points_and_scalars: bool, serialize_as_pure_felt252_array: bool, ) -> Vec where FieldElement: ByteConversion, { let mut scalars_low = vec![]; let mut scalars_high = vec![]; for scalar in scalars { let [low, high] = scalar_to_limbs(scalar); scalars_low.push(BigUint::from(low)); scalars_high.push(BigUint::from(high)); } let mut call_data = vec![]; let call_data_ref = &mut call_data; fn push(call_data_ref: &mut Vec, value: T) where BigUint: From, { call_data_ref.push(value.into()); } fn push_element(call_data_ref: &mut Vec, element: &FieldElement, use_288: bool) where F: IsPrimeField, FieldElement: ByteConversion, { if use_288 { let limbs = field_element_to_u288_limbs(element); for limb in limbs { push(call_data_ref, limb); } } else { let limbs = field_element_to_u384_limbs(element); for limb in limbs { push(call_data_ref, limb); } } } if serialize_as_pure_felt252_array { // placeholder, actual length is updated at the end push(call_data_ref, 0usize); } if include_points_and_scalars { // points { push(call_data_ref, points.len()); for point in points { push_element(call_data_ref, &point.x, false); push_element(call_data_ref, &point.y, false); } } // scalars { push(call_data_ref, scalars.len()); for i in 0..scalars.len() { push(call_data_ref, scalars_low[i].clone()); push(call_data_ref, scalars_high[i].clone()); } } // curve id push(call_data_ref, curve_id); } // Hint for (pt, scalar) in points.iter().zip(scalars.iter()) { match curve_id { 0..=2 => { let (Q, u1, u2, v1, v2) = get_glv_fake_glv_hint(pt, scalar).unwrap(); push_element(call_data_ref, &Q.x, false); push_element(call_data_ref, &Q.y, false); push(call_data_ref, u1); push(call_data_ref, u2); push(call_data_ref, v1); push(call_data_ref, v2); } _ => { let scalar = if scalar == &BigUint::from(0u64) { BigUint::from(1u64) } else { scalar.clone() }; let (Q, u1, u2) = get_fake_glv_hint(pt, &scalar).unwrap(); push_element(call_data_ref, &Q.x, false); push_element(call_data_ref, &Q.y, false); push(call_data_ref, u1); push(call_data_ref, u2); } } } if serialize_as_pure_felt252_array { // updates overall length call_data[0] = (call_data.len() - 1).into(); } call_data } #[allow(dead_code)] fn sqrt(value: &FieldElement) -> FieldElement where F: IsPrimeField, FieldElement: ByteConversion, { let (root1, root2) = value.sqrt().expect("there is no root"); if element_to_biguint(&root1) < element_to_biguint(&root2) { root1 } else { root2 } } #[cfg(test)] mod tests {} ================================================ FILE: tools/garaga_rs/src/calldata/signatures.rs ================================================ use crate::algebra::g1point::G1Point; use crate::definitions::{ get_modulus_from_curve_id, BLS12381PrimeField, BN254PrimeField, CurveParamsProvider, GrumpkinPrimeField, SECP256K1PrimeField, SECP256R1PrimeField, ToWeierstrassCurve, X25519PrimeField, }; use crate::calldata::msm_calldata::msm_calldata_builder; use crate::io::{biguint_split, element_from_biguint, element_to_biguint}; use lambdaworks_math::field::element::FieldElement; use lambdaworks_math::unsigned_integer::element::U256; use num_bigint::BigUint; use num_traits::{One, Zero}; use sha2::{Digest, Sha256, Sha512}; use crate::definitions::CurveID; // Fix the get_curve_order function to use FieldElement pub fn get_curve_order(curve_id: CurveID) -> BigUint { match curve_id { CurveID::BLS12_381 => BLS12381PrimeField::get_curve_params().n, CurveID::BN254 => BN254PrimeField::get_curve_params().n, CurveID::SECP256K1 => SECP256K1PrimeField::get_curve_params().n, CurveID::SECP256R1 => SECP256R1PrimeField::get_curve_params().n, CurveID::X25519 => X25519PrimeField::get_curve_params().n, CurveID::GRUMPKIN => GrumpkinPrimeField::get_curve_params().n, } } /// Build calldata for Schnorr signature verification /// /// Arguments: /// * `rx` - x-coordinate of R point /// * `s` - signature value /// * `e` - challenge hash /// * `px` - public key x-coordinate /// * `py` - public key y-coordinate /// * `prepend_public_key` - whether to prepend the public key to the calldata /// * `curve_id` - curve identifier pub fn schnorr_calldata_builder( rx: BigUint, s: BigUint, e: BigUint, px: BigUint, py: BigUint, prepend_public_key: bool, curve_id: usize, ) -> Result, String> { let mut cd = Vec::new(); if prepend_public_key { cd.extend(biguint_split::<4, 96>(&px).map(BigUint::from)); cd.extend(biguint_split::<4, 96>(&py).map(BigUint::from)); } // Add base signature components cd.extend(biguint_split::<4, 96>(&rx).map(BigUint::from)); cd.extend(biguint_split::<2, 128>(&s).map(BigUint::from)); cd.extend(biguint_split::<2, 128>(&e).map(BigUint::from)); // Calculate e_neg = -e mod n let curve_id = CurveID::try_from(curve_id)?; let n = get_curve_order(curve_id); let e_neg = n - e; // Add MSM calldata for sG + (-e)P let msm_cd = msm_calldata_builder( &[ match curve_id { CurveID::BN254 => element_to_biguint(&BN254PrimeField::get_curve_params().g_x), CurveID::BLS12_381 => { element_to_biguint(&BLS12381PrimeField::get_curve_params().g_x) } CurveID::SECP256K1 => { element_to_biguint(&SECP256K1PrimeField::get_curve_params().g_x) } CurveID::SECP256R1 => { element_to_biguint(&SECP256R1PrimeField::get_curve_params().g_x) } CurveID::X25519 => element_to_biguint(&X25519PrimeField::get_curve_params().g_x), CurveID::GRUMPKIN => { element_to_biguint(&GrumpkinPrimeField::get_curve_params().g_x) } }, match curve_id { CurveID::BN254 => element_to_biguint(&BN254PrimeField::get_curve_params().g_y), CurveID::BLS12_381 => { element_to_biguint(&BLS12381PrimeField::get_curve_params().g_y) } CurveID::SECP256K1 => { element_to_biguint(&SECP256K1PrimeField::get_curve_params().g_y) } CurveID::SECP256R1 => { element_to_biguint(&SECP256R1PrimeField::get_curve_params().g_y) } CurveID::X25519 => element_to_biguint(&X25519PrimeField::get_curve_params().g_y), CurveID::GRUMPKIN => { element_to_biguint(&GrumpkinPrimeField::get_curve_params().g_y) } }, px, py, ], &[s, e_neg], curve_id as usize, false, true, )?; cd.extend(msm_cd); Ok(cd) } /// Build calldata for ECDSA signature verification /// /// Arguments: /// * `r` - signature r value /// * `s` - signature s value /// * `v` - recovery parameter (0 or 1) /// * `px` - public key x-coordinate /// * `py` - public key y-coordinate /// * `z` - message hash /// * `prepend_public_key` - whether to prepend the public key to the calldata /// * `curve_id` - curve identifier #[allow(clippy::too_many_arguments)] pub fn ecdsa_calldata_builder( r: BigUint, s: BigUint, v: u8, px: BigUint, py: BigUint, z: BigUint, prepend_public_key: bool, curve_id: usize, ) -> Result, String> { let mut cd = Vec::new(); if prepend_public_key { cd.extend(biguint_split::<4, 96>(&px).map(BigUint::from)); cd.extend(biguint_split::<4, 96>(&py).map(BigUint::from)); } // Add base signature components cd.extend(biguint_split::<4, 96>(&r).map(BigUint::from)); cd.extend(biguint_split::<2, 128>(&s).map(BigUint::from)); cd.push(BigUint::from(v)); cd.extend(biguint_split::<2, 128>(&z).map(BigUint::from)); // Calculate s_inv, u1, u2 let curve_id = CurveID::try_from(curve_id)?; let n = get_curve_order(curve_id); let s_inv = s.modpow(&(n.clone() - BigUint::from(2u32)), &n); let u1 = (z * &s_inv) % &n; let u2 = (r * &s_inv) % &n; // Add MSM calldata for u1*G + u2*P let msm_cd = msm_calldata_builder( &[ match curve_id { CurveID::BN254 => element_to_biguint(&BN254PrimeField::get_curve_params().g_x), CurveID::BLS12_381 => { element_to_biguint(&BLS12381PrimeField::get_curve_params().g_x) } CurveID::SECP256K1 => { element_to_biguint(&SECP256K1PrimeField::get_curve_params().g_x) } CurveID::SECP256R1 => { element_to_biguint(&SECP256R1PrimeField::get_curve_params().g_x) } CurveID::X25519 => element_to_biguint(&X25519PrimeField::get_curve_params().g_x), CurveID::GRUMPKIN => { element_to_biguint(&GrumpkinPrimeField::get_curve_params().g_x) } }, match curve_id { CurveID::BN254 => element_to_biguint(&BN254PrimeField::get_curve_params().g_y), CurveID::BLS12_381 => { element_to_biguint(&BLS12381PrimeField::get_curve_params().g_y) } CurveID::SECP256K1 => { element_to_biguint(&SECP256K1PrimeField::get_curve_params().g_y) } CurveID::SECP256R1 => { element_to_biguint(&SECP256R1PrimeField::get_curve_params().g_y) } CurveID::X25519 => element_to_biguint(&X25519PrimeField::get_curve_params().g_y), CurveID::GRUMPKIN => { element_to_biguint(&GrumpkinPrimeField::get_curve_params().g_y) } }, px, py, ], &[u1, u2], curve_id as usize, false, true, )?; cd.extend(msm_cd); Ok(cd) } pub fn eddsa_calldata_builder( ry_twisted: BigUint, s: BigUint, py_twisted: BigUint, msg: Vec, prepend_public_key: bool, ) -> Result, String> { let mut cd = Vec::new(); let max_value = BigUint::from(1u64) << 256; if ry_twisted >= max_value { return Err("Invalid Ry value".to_string()); } if py_twisted >= max_value { return Err("Invalid Py value".to_string()); } if s >= max_value { return Err("Invalid s value".to_string()); } if prepend_public_key { cd.extend(biguint_split::<2, 128>(&py_twisted).map(BigUint::from)); } cd.extend(biguint_split::<2, 128>(&ry_twisted).map(BigUint::from)); cd.extend(biguint_split::<2, 128>(&s).map(BigUint::from)); cd.push(BigUint::from(msg.len() as u64)); for byte in msg.clone() { cd.push(BigUint::from(byte as u64)); } let mut hasher = Sha512::new(); let ry_bytes = ry_twisted.to_bytes_le(); let py_bytes = py_twisted.to_bytes_le(); // Ensure the byte arrays are of length 32 let ry_bytes_padded = if ry_bytes.len() < 32 { let mut padded = vec![0; 32]; padded[..ry_bytes.len()].copy_from_slice(&ry_bytes); padded } else { ry_bytes }; let py_bytes_padded = if py_bytes.len() < 32 { let mut padded = vec![0; 32]; padded[..py_bytes.len()].copy_from_slice(&py_bytes); padded } else { py_bytes }; hasher.update(&ry_bytes_padded); hasher.update(&py_bytes_padded); hasher.update(msg); let hash = hasher.finalize(); let hash_biguint = BigUint::from_bytes_le(&hash); fn xrecover(y_twisted: FieldElement) -> FieldElement { let d_twisted = FieldElement::::from_hex( "52036CEE2B6FFE738CC740797779E89800700A4D4141D8AB75EB4DCA135978A3", ) .unwrap(); let i = FieldElement::::from_hex( "2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0", ) .unwrap(); let y_sq = y_twisted.square(); let xx = ((y_sq - FieldElement::::one()) / (d_twisted * y_sq + FieldElement::::one())) .unwrap(); // exp =(p+3) // 8 let exp = U256::from_hex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe") .unwrap(); let x = xx.pow(exp); let x = if x.square() != xx { x * i } else { x }; let is_even = element_to_biguint(&x) % 2_u32 == BigUint::zero(); if is_even { x } else { -x } } fn decode_point( compressed_point_le: BigUint, ) -> ( FieldElement, FieldElement, ) { let two_pow_255: BigUint = BigUint::from(1u64) << 255; let sign_bit: BigUint = compressed_point_le.clone() / two_pow_255.clone(); let y_twisted = compressed_point_le % two_pow_255; let y_twisted = element_from_biguint(&y_twisted); let x_twisted = xrecover(y_twisted); let x_twisted = if element_to_biguint(&x_twisted.clone()) % 2_u32 != sign_bit { -x_twisted } else { x_twisted }; (x_twisted, y_twisted) } let (r_point_x_twisted, r_point_y_twisted) = decode_point(ry_twisted); let (p_point_x_twisted, p_point_y_twisted) = decode_point(py_twisted); let (r_point_x_weierstrass, r_point_y_weierstrass) = X25519PrimeField::to_weirstrass(r_point_x_twisted, r_point_y_twisted); let (p_point_x_weierstrass, p_point_y_weierstrass) = X25519PrimeField::to_weirstrass(p_point_x_twisted, p_point_y_twisted); let _p_pt = G1Point::new(p_point_x_weierstrass, p_point_y_weierstrass, false).expect("Invalid point P"); let _r_pt = G1Point::new(r_point_x_weierstrass, r_point_y_weierstrass, false).expect("Invalid point R"); let gx = element_to_biguint(&X25519PrimeField::get_curve_params().g_x); let modulus = get_modulus_from_curve_id(CurveID::X25519); let neg_gy = modulus - element_to_biguint(&X25519PrimeField::get_curve_params().g_y); let h = hash_biguint % get_curve_order(CurveID::X25519); let values = &[ gx, neg_gy, element_to_biguint(&p_point_x_weierstrass), element_to_biguint(&p_point_y_weierstrass), ]; let scalars = &[s, h]; let msm_cd = msm_calldata_builder(values, scalars, CurveID::X25519 as usize, false, true)?; cd.extend(msm_cd); cd.extend(biguint_split::<2, 128>(&element_to_biguint(&r_point_x_twisted)).map(BigUint::from)); cd.extend(biguint_split::<2, 128>(&element_to_biguint(&p_point_x_twisted)).map(BigUint::from)); Ok(cd) } /// PKCS#1 v1.5 SHA-256 DigestInfo prefix (DER-encoded AlgorithmIdentifier + NULL param). /// RFC 8017, Section 9.2, Note 1. const PKCS1_SHA256_DIGEST_INFO_PREFIX: [u8; 19] = [ 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20, ]; /// Encode a SHA-256 hash as a PKCS#1 v1.5 padded integer (RFC 8017, Section 9.2). /// /// Constructs: 0x00 || 0x01 || PS(0xFF × 202) || 0x00 || DigestInfo || H fn pkcs1_v1_5_encode_sha256(message_hash: &[u8; 32]) -> BigUint { let mut encoded = vec![0x00, 0x01]; encoded.extend(std::iter::repeat_n(0xff, 202)); encoded.push(0x00); encoded.extend_from_slice(&PKCS1_SHA256_DIGEST_INFO_PREFIX); encoded.extend_from_slice(message_hash); BigUint::from_bytes_be(&encoded) } /// Serialize a Cairo `ByteArray` as felt252 calldata. /// /// Layout: [num_full_words, word_0, ..., word_{n-1}, pending_word, pending_word_len] /// Each full word is 31 bytes. The pending word is 0-30 bytes. fn serialize_byte_array(data: &[u8]) -> Vec { let full_word_count = data.len() / 31; let pending_len = data.len() % 31; let mut cd = Vec::new(); cd.push(BigUint::from(full_word_count as u64)); for i in 0..full_word_count { let start = i * 31; let word = BigUint::from_bytes_be(&data[start..start + 31]); cd.push(word); } if pending_len > 0 { let pending = BigUint::from_bytes_be(&data[full_word_count * 31..]); cd.push(pending); } else { cd.push(BigUint::zero()); } cd.push(BigUint::from(pending_len as u64)); cd } /// Build calldata for RSA-2048 SHA-256 signature verification. /// /// Computes SHA-256(message), builds PKCS#1 v1.5 encoding, generates /// the RSA reduction witnesses, and appends the ByteArray-serialized message. /// /// Arguments: /// * `signature` - RSA signature s in [0, modulus) /// * `message` - Raw message bytes /// * `modulus` - RSA-2048 modulus n /// * `prepend_public_key` - Whether to prepend n to the calldata pub fn rsa_2048_sha256_calldata_builder( signature: BigUint, message: &[u8], modulus: BigUint, prepend_public_key: bool, ) -> Result, String> { let hash: [u8; 32] = Sha256::digest(message) .as_slice() .try_into() .map_err(|_| "SHA-256 digest failed")?; let expected_message = pkcs1_v1_5_encode_sha256(&hash); let mut cd = rsa_2048_calldata_builder(signature, expected_message, modulus, prepend_public_key)?; cd.extend(serialize_byte_array(message)); Ok(cd) } /// Serialize a 2048-bit integer to 24 calldata elements (96-bit words). /// /// Layout: 6 chunks of 4 words each. The first 5 chunks hold 384 bits, /// the last chunk holds 128 bits (top 2 words are zero). fn serialize_rsa2048_integer(x: &BigUint) -> Vec { biguint_split::<24, 96>(x) .iter() .map(|&w| BigUint::from(w)) .collect() } /// Build calldata for RSA-2048 signature verification. /// /// Computes s^{65537} mod n via square-and-multiply, generating 17 /// reduction witnesses (quotient, remainder) that certify each step. /// /// Arguments: /// * `signature` - RSA signature s in [0, modulus) /// * `expected_message` - Expected result m = s^{65537} mod n /// * `modulus` - RSA-2048 modulus n /// * `prepend_public_key` - Whether to prepend n to the calldata pub fn rsa_2048_calldata_builder( signature: BigUint, expected_message: BigUint, modulus: BigUint, prepend_public_key: bool, ) -> Result, String> { if modulus.bits() > 2048 || modulus <= BigUint::one() { return Err("modulus must be a positive integer fitting in 2048 bits".into()); } if signature >= modulus { return Err("signature must be less than modulus".into()); } if expected_message >= modulus { return Err("expected_message must be less than modulus".into()); } // Verify s^{65537} ≡ m (mod n) let e = BigUint::from(65537u32); if signature.modpow(&e, &modulus) != expected_message { return Err("signature^65537 mod modulus does not equal expected_message".into()); } // Square-and-multiply for e = 65537 = 2^16 + 1: // 16 squarings followed by 1 multiplication = 17 reductions. let mut acc = signature.clone(); let mut witnesses: Vec<(BigUint, BigUint)> = Vec::with_capacity(17); for _ in 0..16 { let product = &acc * &acc; let quotient = &product / &modulus; let remainder = &product % &modulus; witnesses.push((quotient, remainder.clone())); acc = remainder; } let product = &acc * &signature; let quotient = &product / &modulus; let remainder = &product % &modulus; witnesses.push((quotient, remainder)); // Serialize to calldata let mut cd = Vec::new(); if prepend_public_key { cd.extend(serialize_rsa2048_integer(&modulus)); } cd.extend(serialize_rsa2048_integer(&signature)); cd.extend(serialize_rsa2048_integer(&expected_message)); for (q, r) in &witnesses { cd.extend(serialize_rsa2048_integer(q)); cd.extend(serialize_rsa2048_integer(r)); } Ok(cd) } #[cfg(test)] mod tests { use super::*; #[test] fn test_pkcs1_v1_5_encode_sha256_structure() { let hash = [0u8; 32]; let encoded = pkcs1_v1_5_encode_sha256(&hash); let encoded_bytes = encoded.to_bytes_be(); // Pad to 256 bytes (leading 0x00 is dropped by BigUint) let mut padded = vec![0u8; 256 - encoded_bytes.len()]; padded.extend_from_slice(&encoded_bytes); assert_eq!(padded[0], 0x00); assert_eq!(padded[1], 0x01); assert!(padded[2..204].iter().all(|&b| b == 0xff)); assert_eq!(padded[204], 0x00); assert_eq!(&padded[205..224], &PKCS1_SHA256_DIGEST_INFO_PREFIX); assert_eq!(&padded[224..256], &hash); } #[test] fn test_serialize_byte_array_empty() { let cd = serialize_byte_array(b""); // [0 full words, pending_word=0, pending_word_len=0] assert_eq!(cd.len(), 3); assert_eq!(cd[0], BigUint::zero()); assert_eq!(cd[1], BigUint::zero()); assert_eq!(cd[2], BigUint::zero()); } #[test] fn test_serialize_byte_array_short() { let msg = b"hello"; let cd = serialize_byte_array(msg); // 5 bytes < 31, so 0 full words, pending = "hello", pending_len = 5 assert_eq!(cd.len(), 3); assert_eq!(cd[0], BigUint::zero()); // 0 full words assert_eq!(cd[1], BigUint::from_bytes_be(msg)); // pending word assert_eq!(cd[2], BigUint::from(5u32)); // pending len } #[test] fn test_serialize_byte_array_exact_word() { let msg = vec![0xABu8; 31]; // exactly one full word let cd = serialize_byte_array(&msg); // 1 full word, pending = 0, pending_len = 0 assert_eq!(cd.len(), 4); assert_eq!(cd[0], BigUint::one()); // 1 full word assert_eq!(cd[1], BigUint::from_bytes_be(&msg)); // word_0 assert_eq!(cd[2], BigUint::zero()); // pending = 0 assert_eq!(cd[3], BigUint::zero()); // pending_len = 0 } #[test] fn test_serialize_byte_array_multi() { let msg = vec![0xCDu8; 65]; // 2 full words (62 bytes) + 3 pending let cd = serialize_byte_array(&msg); assert_eq!(cd.len(), 5); // num_full + word0 + word1 + pending + pending_len assert_eq!(cd[0], BigUint::from(2u32)); assert_eq!(cd[4], BigUint::from(3u32)); // pending_len } #[test] fn test_rsa_2048_sha256_calldata_pkcs_encoding() { let hash: [u8; 32] = Sha256::digest(b"hello garaga").into(); let expected_message = pkcs1_v1_5_encode_sha256(&hash); let em_bytes = expected_message.to_bytes_be(); let mut padded = vec![0u8; 256 - em_bytes.len()]; padded.extend_from_slice(&em_bytes); assert_eq!(&padded[224..256], &hash); } } ================================================ FILE: tools/garaga_rs/src/constants.rs ================================================ //! Auto-generated constants file from constants.json. Do not edit manually. use num_bigint::BigUint; use num_traits::Num; // RISC0 Constants // https://github.com/risc0/risc0-ethereum/blob/v2.2.2/contracts/src/groth16/ControlID.sol // release v2.2.2 pub fn get_risc0_constants() -> (BigUint, BigUint) { let risc0_control_root = BigUint::from_str_radix( "CE52BF56033842021AF3CF6DB8A50D1B7535C125A34F1A22C6FDCF002C5A1529", 16, ) .unwrap(); let risc0_bn254_control_id = BigUint::from_str_radix( "04446E66D300EB7FB45C9726BB53C793DDA407A62E9601618BB43C5C14657AC0", 16, ) .unwrap(); (risc0_control_root, risc0_bn254_control_id) } // SP1 Constants // https://github.com/succinctlabs/sp1-contracts/blob/main/contracts/src/v5.0.0/SP1VerifierGroth16.sol pub const SP1_VERIFIER_VERSION: &str = "v5.0.0"; pub const SP1_VERIFIER_HASH: &str = "0xa4594c59bbc142f3b81c3ecb7f50a7c34bc9af7c4c444b5d48b795427e285913"; // Additional RISC0 constants for internal use pub const RISC0_SYSTEM_STATE_ZERO_DIGEST: &str = "0xA3ACC27117418996340B84E5A90F3EF4C49D22C79E44AAD822EC9C313E1EB8E2"; pub const RISC0_TAG_DIGEST: &str = "0xcb1fefcd1f2d9a64975cbbbf6e161e2914434b0cbb9960b84df5d717e86b48af"; pub const RISC0_OUTPUT_TAG: &str = "0x77eafeb366a78b47747de0d7bb176284085ff5564887009a5be63da32d3559d4"; ================================================ FILE: tools/garaga_rs/src/crypto/digest.rs ================================================ use core::fmt; // use arbitrary::Arbitrary; // use bfieldcodec_derive::BFieldCodec; // use get_size2::GetSize; // use itertools::Itertools; // use num_traits::Zero; // use rand::distr::Distribution; // use rand::distr::StandardUniform; // use rand::Rng; // use serde::Deserialize; // use serde::Deserializer; // use serde::Serialize; // use serde::Serializer; // use crate::crypto::poseidon_bn254::poseidon_hash_bn254; use crate::crypto::poseidon_bn254::poseidon_hash_bn254; use crate::definitions::{FieldElement, GrumpkinPrimeField, Random}; // use crate::error::TryFromDigestError; // use crate::error::TryFromHexDigestError; // use crate::math::b_field_element::BFieldElement; // use crate::prelude::Tip5; /// A trait defining the hash function interface pub trait HashFunction: Clone + Copy + fmt::Debug + PartialEq { /// The type of elements being hashed type Element: Clone + Copy + PartialEq + Eq + Default + fmt::Debug + From; /// Hash two elements together fn hash_pair(left: &Self::Element, right: &Self::Element) -> Self::Element; fn hash_single(element: &Self::Element) -> Self::Element; fn random() -> Self::Element; } // /// A fixed-size array of BFieldElements // #[derive(Clone, Copy, Debug, PartialEq, Eq)] // pub struct Tip5Element([BFieldElement; 5]); // /// Implementation for Tip5 hash function // pub struct Tip5Hash; // impl HashFunction for Tip5Hash { // type Element = Tip5Element; // fn hash_pair(left: &Self::Element, right: &Self::Element) -> Self::Element { // let result = Tip5::hash_pair(&left.0, &right.0); // Tip5Element(result.try_into().unwrap()) // } // } /// Implementation for Poseidon BN254 hash function #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct PoseidonBn254Hash; impl HashFunction for PoseidonBn254Hash { type Element = FieldElement; fn hash_pair(left: &Self::Element, right: &Self::Element) -> Self::Element { poseidon_hash_bn254(left, right) } fn hash_single(element: &Self::Element) -> Self::Element { let zero = FieldElement::::zero(); poseidon_hash_bn254(element, &zero) } fn random() -> Self::Element { FieldElement::::random() } } /// Generate a vector of n random digests for the given hash function type pub fn random_elements(n: usize) -> Vec> { (0..n).map(|_| Digest::new(H::random())).collect() } /// A fixed-size digest for hash functions #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] pub struct Digest where H::Element: Clone + Copy + PartialEq + Eq + fmt::Debug, { pub data: H::Element, } impl Digest { /// The number of bytes in a digest. // pub const BYTES: usize = BFieldElement::BYTES; /// The all-zero digest. pub(crate) fn all_zero() -> Self { Self { data: H::Element::default(), } } pub const fn value(self) -> H::Element { self.data } pub const fn new(element: H::Element) -> Self { Self { data: element } } /// Hash this digest using the specified hash function H pub fn hash_pair(left: &Self, right: &Self) -> Self { Self { data: H::hash_pair(&left.data, &right.data), } } pub fn to_element(self) -> H::Element { self.data } pub fn from_element(element: H::Element) -> Self { Self { data: element } } } impl Default for Digest { fn default() -> Self { Self::all_zero() } } impl fmt::Display for Digest { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self.data) } } // impl fmt::LowerHex for Digest { // fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // let bytes = <[u8; Self::BYTES]>::from(*self); // write!(f, "{}", hex::encode(bytes)) // } // } // impl fmt::UpperHex for Digest { // fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // let bytes = <[u8; Self::BYTES]>::from(*self); // write!(f, "{}", hex::encode_upper(bytes)) // } // } // impl Distribution> for StandardUniform { // fn sample(&self, rng: &mut R) -> Digest { // Digest::new(rng.random()) // } // } // impl FromStr for Digest { // type Err = TryFromDigestError; // fn from_str(string: &str) -> Result { // let bfes: Vec<_> = string // .split(',') // .map(str::parse::) // .try_collect()?; // let invalid_len_err = Self::Err::InvalidLength(bfes.len()); // let digest_innards = bfes.try_into().map_err(|_| invalid_len_err)?; // Ok(Digest { // data: digest_innards, // }) // } // } #[derive(Debug)] pub struct TryFromDigestError; #[derive(Debug)] pub struct TryFromHexDigestError; // impl TryFrom> for Digest { // type Error = TryFromDigestError; // fn try_from(value: Vec) -> Result { // Digest::try_from(&value as &[H::Element]) // } // } // impl From> for Vec { // fn from(val: Digest) -> Self { // val.data.to_vec() // } // } // impl From> for [u8; BFieldElement::BYTES] { // fn from(Digest { data }: Digest) -> Self { // // This needs to be implemented based on how you want to serialize your Element type // unimplemented!("Implement byte serialization for Element type") // } // } // impl TryFrom<[u8; BFieldElement::BYTES]> for Digest { // type Error = TryFromDigestError; // fn try_from(bytes: [u8; BFieldElement::BYTES]) -> Result { // // This needs to be implemented based on how you want to deserialize your Element type // unimplemented!("Implement byte deserialization for Element type") // } // } // impl TryFrom for Digest // where // H::Element: TryFrom, // { // type Error = TryFromDigestError; // fn try_from(value: BigUint) -> Result { // let mut remaining = value; // let mut digest_innards = H::Element::ZERO; // let modulus: BigUint = BFieldElement::P.into(); // for digest_element in &mut digest_innards { // let element = u64::try_from(remaining.clone() % modulus.clone()).unwrap(); // *digest_element = H::Element::new(element); // remaining /= modulus.clone(); // } // if !remaining.is_zero() { // return Err(Self::Error::Overflow); // } // Ok(Self { // data: digest_innards, // }) // } // } // impl From> for BigUint // where // H::Element: Into, // { // fn from(digest: Digest) -> Self { // let Digest { data } = digest; // let mut ret = BigUint::zero(); // let modulus: BigUint = BFieldElement::P.into(); // for i in (0..BFieldElement::BYTES).rev() { // ret *= modulus.clone(); // let digest_element: BigUint = data[i].value().into(); // ret += digest_element; // } // ret // } // } // impl Digest { // /// Encode digest as hex. // /// // /// Since `Digest` also implements [`LowerHex`][lo] and [`UpperHex`][up], it is // /// possible to `{:x}`-format directly, _e.g._, `print!("{digest:x}")`. // /// // /// [lo]: fmt::LowerHex // /// [up]: fmt::UpperHex // pub fn to_hex(self) -> String { // format!("{self:x}") // } // /// Decode hex string to [`Digest`]. Must not include leading "0x". // pub fn try_from_hex(data: impl AsRef<[u8]>) -> Result { // let slice = hex::decode(data)?; // Ok(Self::try_from(&slice as &[u8])?) // } // } // we implement Serialize so that we can serialize as hex for human readable // formats like JSON but use default serializer for other formats likes bincode // impl Serialize for Digest // where // H::Element: Serialize, // { // fn serialize(&self, serializer: S) -> Result // where // S: Serializer, // { // if serializer.is_human_readable() { // self.to_hex().serialize(serializer) // } else { // self.data.serialize(serializer) // } // } // } // we impl Deserialize so that we can deserialize as hex for human readable // formats like JSON but use default deserializer for other formats like bincode // impl<'de, H: HashFunction> Deserialize<'de> for Digest // where // H::Element: Deserialize<'de>, // { // fn deserialize(deserializer: D) -> Result // where // D: Deserializer<'de>, // { // if deserializer.is_human_readable() { // let hex_string = String::deserialize(deserializer)?; // Self::try_from_hex(hex_string).map_err(serde::de::Error::custom) // } else { // Ok(Self::new(H::Element::deserialize(deserializer)?)) // } // } // } // Implement conversion between Digest and FieldElement for PoseidonBn254 impl From> for FieldElement { fn from(_digest: Digest) -> Self { // Implement conversion logic here // This might need to be adjusted based on your specific requirements unimplemented!("Need to implement conversion from Digest to FieldElement") } } impl From> for Digest { fn from(_field: FieldElement) -> Self { // Implement conversion logic here // This might need to be adjusted based on your specific requirements unimplemented!("Need to implement conversion from FieldElement to Digest") } } // // Keep existing implementations but make them generic over H // impl PartialOrd for Digest { // fn partial_cmp(&self, other: &Self) -> Option { // self.data.partial_cmp(&other.data) // } // } // impl Ord for Digest { // fn cmp(&self, other: &Self) -> std::cmp::Ordering { // self.data.cmp(&other.data) // } // } // impl GetSize for Digest // where // H::Element: GetSize, // { // fn get_stack_size() -> usize { // std::mem::size_of::() // } // fn get_heap_size(&self) -> usize { // self.data.get_heap_size() // } // } // impl fmt::Display for Tip5Element { // fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // write!(f, "{:?}", self.0) // } // } // // Implement conversion between array and Tip5Element // impl From<[BFieldElement; 5]> for Tip5Element { // fn from(array: [BFieldElement; 5]) -> Self { // Self(array) // } // } // impl From for [BFieldElement; 5] { // fn from(element: Tip5Element) -> Self { // element.0 // } // } // // Add AsRef for convenient slice access // impl AsRef<[BFieldElement]> for Tip5Element { // fn as_ref(&self) -> &[BFieldElement] { // &self.0 // } // } // // Add AsMut for convenient mutable slice access // impl AsMut<[BFieldElement]> for Tip5Element { // fn as_mut(&mut self) -> &mut [BFieldElement] { // &mut self.0 // } // } // // Add these impls // impl From> for H::Element { // fn from(digest: Digest) -> Self { // digest.data // } // } impl AsRef for Digest { fn as_ref(&self) -> &H::Element { &self.data } } impl<'a, H: HashFunction> arbitrary::Arbitrary<'a> for Digest { fn arbitrary(_u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { Ok(Self::new(H::random())) } } // #[cfg(test)] // pub(crate) mod digest_tests { // use num_traits::One; // use proptest::collection::vec; // use proptest::prelude::Arbitrary as ProptestArbitrary; // use proptest::prelude::*; // use proptest_arbitrary_interop::arb; // use test_strategy::proptest; // use super::*; // // use crate::prelude::*; // impl ProptestArbitrary for Digest { // type Parameters = (); // fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { // arb().prop_map(|d| d).no_shrink().boxed() // } // type Strategy = BoxedStrategy; // } // /// Test helper struct for corrupting digests. Primarily used for negative tests. // #[derive(Debug, Clone, PartialEq, Eq, test_strategy::Arbitrary)] // pub(crate) struct DigestCorruptor; // impl DigestCorruptor { // pub fn corrupt_digest(&self, digest: Digest) -> Digest { // // Generate a new random digest different from the input // loop { // let new_digest = Digest::new(H::random()); // if new_digest != digest { // return new_digest; // } // } // } // } // // mod serde_test { // // use super::hex_test::hex_examples; // // use super::*; // // mod json_test { // // use super::*; // // #[test] // // fn serialize() -> Result<(), serde_json::Error> { // // for (digest, hex) in hex_examples() { // // assert_eq!(serde_json::to_string(&digest)?, format!("\"{}\"", hex)); // // } // // Ok(()) // // } // // #[test] // // fn deserialize() -> Result<(), serde_json::Error> { // // for (digest, hex) in hex_examples() { // // let json_hex = format!("\"{}\"", hex); // // let digest_deserialized: Digest = serde_json::from_str::(&json_hex)?; // // assert_eq!(digest_deserialized, digest); // // } // // Ok(()) // // } // // } // // mod bincode_test { // // use super::*; // // fn bincode_examples() -> Vec<(Digest, [u8; Digest::BYTES])> { // // vec![ // // (Digest::default(), [0u8; Digest::BYTES]), // // ( // // Digest::new(bfe_array![0, 1, 10, 15, 255]), // // [ // // 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, // // 0, 15, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, // // ], // // ), // // ] // // } // // #[test] // // fn serialize() { // // for (digest, bytes) in bincode_examples() { // // assert_eq!(bincode::serialize(&digest).unwrap(), bytes); // // } // // } // // #[test] // // fn deserialize() { // // for (digest, bytes) in bincode_examples() { // // assert_eq!(bincode::deserialize::(&bytes).unwrap(), digest); // // } // // } // // } // // } // } ================================================ FILE: tools/garaga_rs/src/crypto/merkle_tree.rs ================================================ use crate::crypto::digest::{Digest, HashFunction}; use arbitrary::{Arbitrary, Unstructured}; use itertools::Itertools; use lazy_static::lazy_static; // use rayon::prelude::*; use std::collections::hash_map::Entry::*; use std::collections::*; use std::fmt::Debug; use std::result; use thiserror::Error; // Add this import // use crate::prelude::*; const DEFAULT_PARALLELIZATION_CUTOFF: usize = 512; lazy_static! { static ref PARALLELIZATION_CUTOFF: usize = std::env::var("TWENTY_FIRST_MERKLE_TREE_PARALLELIZATION_CUTOFF") .ok() .and_then(|v| v.parse().ok()) .unwrap_or(DEFAULT_PARALLELIZATION_CUTOFF); } /// Enforces that all compilation targets have a consistent [`MAX_TREE_HEIGHT`]. /// In particular, if `usize` has more than 32 bits, the maximum height of a /// Merkle tree is limited as if only 32 bits were available. If `usize` has /// less than 32 bits, compilation will fail. /// /// Using a type other than `usize` could enable a higher maximum height, but /// would require a different storage mechanism for the Merkle tree's nodes: /// indexing into a `Vec<_>` can only be done with `usize`. const MAX_NUM_NODES: usize = 1 << (32 - 1); const MAX_NUM_LEAFS: usize = MAX_NUM_NODES / 2; /// The maximum height of a Merkle tree. pub const MAX_TREE_HEIGHT: usize = MAX_NUM_LEAFS.ilog2() as usize; type Result = result::Result; /// A [Merkle tree][merkle_tree] is a binary tree of [digests](Digest) that is /// used to efficiently prove the inclusion of items in a set. Set inclusion can /// be verified through an [inclusion proof](MerkleTreeInclusionProof). /// /// The used hash function is [`Tip5`]. /// /// [merkle_tree]: https://en.wikipedia.org/wiki/Merkle_tree #[derive(Debug, Clone, PartialEq, Eq)] pub struct MerkleTree { nodes: Vec>, } /// A full inclusion proof for the leafs at the supplied indices, including the /// leafs themselves. The proof is relative to some [Merkle tree](MerkleTree), /// which is not necessarily (and generally cannot be) known in its entirety by /// the verifier. #[derive(Debug, Clone, PartialEq, Eq, Default)] pub struct MerkleTreeInclusionProof { /// The stated height of the Merkle tree this proof is relative to. pub tree_height: usize, /// The leafs the proof is about, _i.e._, the revealed leafs. /// /// Purposefully not a [`HashMap`] to preserve order of the keys, which is /// relevant for [`into_authentication_paths`][paths]. /// /// [paths]: MerkleTreeInclusionProof::into_authentication_paths pub indexed_leafs: Vec<(usize, Digest)>, /// The proof's witness: de-duplicated authentication structure for the /// leafs this proof is about. See [`authentication_structure`][auth_structure] /// for details. /// /// [auth_structure]: MerkleTree::authentication_structure pub authentication_structure: Vec>, } /// Helper struct for verifying inclusion of items in a Merkle tree. /// /// Continuing the example from [`authentication_structure`][auth_structure], /// the partial tree for leafs 0 and 2, _i.e._, nodes 8 and 10 respectively, /// with nodes [11, 9, 3] from the authentication structure is: /// /// ```markdown /// ──── _ ──── /// ╱ ╲ /// _ 3 /// ╱ ╲ /// ╱ ╲ /// _ _ /// ╱ ╲ ╱ ╲ /// 8 9 10 11 /// ``` /// /// [auth_structure]: MerkleTree::authentication_structure #[derive(Debug, Clone, PartialEq, Eq, Default)] pub(crate) struct PartialMerkleTree { tree_height: usize, leaf_indices: Vec, nodes: HashMap>, } impl MerkleTree { /// The index of the root node. /// /// If you need to read the root, try [`root()`](Self::root) instead. pub(crate) const ROOT_INDEX: usize = 1; /// Build a MerkleTree with the given leafs. /// /// [`MerkleTree::par_new`] is equivalent and usually faster. /// /// # Errors /// /// - If the number of leafs is zero. /// - If the number of leafs is not a power of two. pub fn sequential_new(leafs: &[Digest]) -> Result { let mut nodes = Self::initialize_merkle_tree_nodes(leafs)?; for i in (MerkleTree::::ROOT_INDEX..leafs.len()).rev() { nodes[i] = Digest::::from_element(H::hash_pair(&nodes[i * 2].data, &nodes[i * 2 + 1].data)); } Ok(MerkleTree { nodes }) } /// Build a MerkleTree with the given leafs. /// /// Uses [`rayon`] to parallelize Merkle tree construction. If the use of /// [`rayon`] is not an option in your context, use /// [`MerkleTree::sequential_new`], which is equivalent but usually slower. /// /// # Errors /// /// - If the number of leafs is zero. /// - If the number of leafs is not a power of two. pub fn par_new(leafs: &[Digest]) -> Result { let mut nodes = Self::initialize_merkle_tree_nodes(leafs)?; // (not) parallel let mut num_nodes_on_this_level = leafs.len(); while num_nodes_on_this_level >= *PARALLELIZATION_CUTOFF { num_nodes_on_this_level /= 2; let node_indices_on_this_level = num_nodes_on_this_level..2 * num_nodes_on_this_level; let nodes_on_this_level = node_indices_on_this_level .clone() .map(|i| { Digest::::from_element(H::hash_pair( &nodes[i * 2].data, &nodes[i * 2 + 1].data, )) }) .collect::>(); nodes[node_indices_on_this_level].copy_from_slice(&nodes_on_this_level); } // sequential let num_remaining_nodes = num_nodes_on_this_level; for i in (MerkleTree::::ROOT_INDEX..num_remaining_nodes).rev() { nodes[i] = Digest::::from_element(H::hash_pair(&nodes[i * 2].data, &nodes[i * 2 + 1].data)); } Ok(MerkleTree { nodes }) } /// Helps to kick off Merkle tree construction. Sets up the Merkle tree's /// internal nodes if (and only if) it is possible to construct a Merkle /// tree with the given leafs. fn initialize_merkle_tree_nodes(leafs: &[Digest]) -> Result>> { if leafs.is_empty() { return Err(MerkleTreeError::TooFewLeafs); } let num_leafs = leafs.len(); if !num_leafs.is_power_of_two() { return Err(MerkleTreeError::IncorrectNumberOfLeafs); } if num_leafs > MAX_NUM_LEAFS { return Err(MerkleTreeError::TreeTooHigh); } let mut nodes = vec![Digest::::default(); 2 * num_leafs]; nodes[num_leafs..].copy_from_slice(leafs); Ok(nodes) } /// Given a list of leaf indices, return the indices of exactly those nodes that /// are needed to prove (or verify) that the indicated leafs are in the Merkle /// tree. // This function is not defined as a method (taking self as argument) since it's // needed by the verifier, who does not have access to the Merkle tree. fn authentication_structure_node_indices( num_leafs: usize, leaf_indices: &[usize], ) -> Result> { // The set of indices of nodes that need to be included in the authentications // structure. In principle, every node of every authentication path is needed. // The root is never needed. Hence, it is not considered below. let mut node_is_needed = HashSet::new(); // The set of indices of nodes that can be computed from other nodes in the // authentication structure or the leafs that are explicitly supplied during // verification. Every node on the direct path from the leaf to the root can // be computed by the very nature of "authentication path". let mut node_can_be_computed = HashSet::new(); for &leaf_index in leaf_indices { if leaf_index >= num_leafs { return Err(MerkleTreeError::LeafIndexInvalid { num_leafs }); } let mut node_index = leaf_index + num_leafs; while node_index > Self::ROOT_INDEX { let sibling_index = node_index ^ 1; node_can_be_computed.insert(node_index); node_is_needed.insert(sibling_index); node_index /= 2; } } let set_difference = node_is_needed.difference(&node_can_be_computed).copied(); Ok(set_difference.sorted_unstable().rev()) } /// Generate a de-duplicated authentication structure for the given leaf indices. /// If a single index is supplied, the authentication structure is the /// authentication path for the indicated leaf. /// /// For example, consider the following Merkle tree. /// /// ```markdown /// ──── 1 ──── ╮ /// ╱ ╲ │ /// 2 3 │ /// ╱ ╲ ╱ ╲ ├╴ node indices /// ╱ ╲ ╱ ╲ │ /// 4 5 6 7 │ /// ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ │ /// 8 9 10 11 12 13 14 15 ╯ /// /// 0 1 2 3 4 5 6 7 ←── leaf indices /// ``` /// /// The authentication path for leaf 2, _i.e._, node 10, is nodes [11, 4, 3]. /// /// The authentication structure for leafs 0 and 2, _i.e._, nodes 8 and 10 /// respectively, is nodes [11, 9, 3]. /// Note how: /// - Node 3 is included only once, even though the individual authentication /// paths for leafs 0 and 2 both include node 3. This is one part of the /// de-duplication. /// - Node 4 is not included at all, even though the authentication path for /// leaf 2 requires the node: node 4 can be computed from nodes 8 and 9; /// the former is supplied explicitly during [verification][verify], /// the latter is included in the authentication structure. /// This is the other part of the de-duplication. /// /// [verify]: MerkleTreeInclusionProof::verify pub fn authentication_structure(&self, leaf_indices: &[usize]) -> Result>> { let num_leafs = self.num_leafs(); let indices = Self::authentication_structure_node_indices(num_leafs, leaf_indices)?; let auth_structure = indices.map(|idx| self.nodes[idx]).collect(); Ok(auth_structure) } pub fn root(&self) -> Digest { self.nodes[Self::ROOT_INDEX] } pub fn num_leafs(&self) -> usize { let node_count = self.nodes.len(); debug_assert!(node_count.is_power_of_two()); node_count / 2 } pub fn height(&self) -> usize { let leaf_count = self.num_leafs(); debug_assert!(leaf_count.is_power_of_two()); leaf_count.ilog2() as usize } /// All nodes of the Merkle tree. pub fn nodes(&self) -> &[Digest] { &self.nodes } /// The node at the given node index, if it exists. pub fn node(&self, index: usize) -> Option> { self.nodes.get(index).copied() } /// All leafs of the Merkle tree. pub fn leafs(&self) -> &[Digest] { let first_leaf = self.nodes.len() / 2; &self.nodes[first_leaf..] } /// The leaf at the given index, if it exists. pub fn leaf(&self, index: usize) -> Option> { let first_leaf_index = self.nodes.len() / 2; self.nodes.get(first_leaf_index + index).copied() } pub fn indexed_leafs(&self, indices: &[usize]) -> Result)>> { let num_leafs = self.num_leafs(); let invalid_index = MerkleTreeError::LeafIndexInvalid { num_leafs }; let maybe_indexed_leaf = |&i| self.leaf(i).ok_or(invalid_index).map(|leaf| (i, leaf)); indices.iter().map(maybe_indexed_leaf).collect() } /// A full inclusion proof for the leafs at the supplied indices, including the /// leafs. Generally, using [`authentication_structure`][auth_structure] is /// preferable. Use this method only if the verifier needs explicit access to the /// leafs, _i.e._, cannot compute them from other information. /// /// [auth_structure]: Self::authentication_structure pub fn inclusion_proof_for_leaf_indices( &self, indices: &[usize], ) -> Result> { let proof = MerkleTreeInclusionProof { tree_height: self.height(), indexed_leafs: self.indexed_leafs(indices)?, authentication_structure: self.authentication_structure(indices)?, }; Ok(proof) } // fn test_tree_of_height(tree_height: usize) -> Self { // let num_leafs = 1 << tree_height; // let leafs = (0..num_leafs) // .map(|i| Digest::new(H::random())) // .collect_vec(); // let tree = Self::par_new(&leafs).unwrap(); // assert!(leafs.iter().all_unique()); // tree // } } impl<'a, H: HashFunction> Arbitrary<'a> for MerkleTree { fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { let height = u.int_in_range(0..=13)?; let num_leafs = 1 << height; let leaf_digests: arbitrary::Result> = (0..num_leafs).map(|_| u.arbitrary()).collect(); let tree = Self::par_new(&leaf_digests?).unwrap(); Ok(tree) } } impl MerkleTreeInclusionProof { fn leaf_indices(&self) -> impl Iterator { self.indexed_leafs.iter().map(|(index, _)| index) } fn is_trivial(&self) -> bool { self.indexed_leafs.is_empty() && self.authentication_structure.is_empty() } /// Verify that the given root digest is the root of a Merkle tree that contains /// the indicated leafs. pub fn verify(self, expected_root: Digest) -> bool { if self.is_trivial() { return true; } let Ok(partial_tree) = PartialMerkleTree::try_from(self) else { return false; }; let Ok(computed_root) = partial_tree.root() else { return false; }; computed_root == expected_root } /// Transform the inclusion proof into a list of authentication paths. /// /// This corresponds to a decompression of the authentication structure. /// In some contexts, it is easier to deal with individual authentication paths /// than with the de-duplicated authentication structure. /// /// Continuing the example from [`authentication_structure`][auth_structure], /// the authentication structure for leafs 0 and 2, _i.e._, nodes 8 and 10 /// respectively, is nodes [11, 9, 3]. /// /// The authentication path /// - for leaf 0 is [9, 5, 3], and /// - for leaf 2 is [11, 4, 3]. /// /// ```markdown /// ──── 1 ──── /// ╱ ╲ /// 2 3 /// ╱ ╲ ╱ ╲ /// ╱ ╲ ╱ ╲ /// 4 5 6 7 /// ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ /// 8 9 10 11 12 13 14 15 /// ``` /// /// [auth_structure]: MerkleTree::authentication_structure pub fn into_authentication_paths(self) -> Result>>> { let partial_tree = PartialMerkleTree::try_from(self)?; partial_tree.into_authentication_paths() } } impl PartialMerkleTree { pub fn root(&self) -> Result> { self.nodes .get(&MerkleTree::::ROOT_INDEX) .copied() .ok_or(MerkleTreeError::RootNotFound) } fn node(&self, index: usize) -> Result> { self.nodes .get(&index) .copied() .ok_or(MerkleTreeError::MissingNodeIndex(index)) } fn num_leafs(&self) -> Result { if self.tree_height > MAX_TREE_HEIGHT { return Err(MerkleTreeError::TreeTooHigh); } Ok(1 << self.tree_height) } /// Compute all computable digests of the partial Merkle tree, modifying self. /// Returns an error if self is either /// - incomplete, _i.e._, does not contain all the nodes required to compute /// the root, or /// - not minimal, _i.e._, if it contains nodes that can be computed from other /// nodes. pub fn fill(&mut self) -> Result<()> { let mut parent_node_indices = self.first_layer_parent_node_indices()?; for _ in 0..self.tree_height { for &parent_node_index in &parent_node_indices { self.insert_digest_for_index(parent_node_index)?; } parent_node_indices = Self::move_indices_one_layer_up(parent_node_indices); } Ok(()) } /// Any parent node index is included only once. This guarantees that the number /// of hash operations is minimal. fn first_layer_parent_node_indices(&self) -> Result> { let num_leafs = self.num_leafs()?; let leaf_to_parent_node_index = |&leaf_index| (leaf_index + num_leafs) / 2; let parent_node_indices = self.leaf_indices.iter().map(leaf_to_parent_node_index); let mut parent_node_indices = parent_node_indices.collect_vec(); parent_node_indices.sort_unstable(); parent_node_indices.dedup(); Ok(parent_node_indices) } fn insert_digest_for_index(&mut self, parent_index: usize) -> Result<()> { let (left_child, right_child) = self.children_of_node(parent_index)?; let parent_digest = Digest::::from_element(H::hash_pair(&left_child.data, &right_child.data)); match self.nodes.insert(parent_index, parent_digest) { Some(_) => Err(MerkleTreeError::SpuriousNodeIndex(parent_index)), None => Ok(()), } } fn children_of_node(&self, parent_index: usize) -> Result<(Digest, Digest)> { let left_child_index = parent_index * 2; let right_child_index = left_child_index ^ 1; let left_child = self.node(left_child_index)?; let right_child = self.node(right_child_index)?; Ok((left_child, right_child)) } /// Indices are deduplicated to guarantee minimal number of hash operations. fn move_indices_one_layer_up(mut indices: Vec) -> Vec { indices.iter_mut().for_each(|i| *i /= 2); indices.dedup(); indices } /// Collect all individual authentication paths for the indicated leafs. fn into_authentication_paths(self) -> Result>>> { self.leaf_indices .iter() .map(|&i| self.authentication_path_for_index(i)) .collect() } /// Given a single leaf index and a partial Merkle tree, collect the /// authentication path for the indicated leaf. /// /// Fails if the partial Merkle tree does not contain the entire /// authentication path. fn authentication_path_for_index(&self, leaf_index: usize) -> Result>> { let num_leafs = self.num_leafs()?; let mut authentication_path = vec![]; let mut node_index = leaf_index + num_leafs; while node_index > MerkleTree::::ROOT_INDEX { let sibling_index = node_index ^ 1; let sibling = self.node(sibling_index)?; authentication_path.push(sibling); node_index /= 2; } Ok(authentication_path) } } impl TryFrom> for PartialMerkleTree { type Error = MerkleTreeError; fn try_from(proof: MerkleTreeInclusionProof) -> Result { let leaf_indices = proof.leaf_indices().copied().collect(); let mut partial_tree = PartialMerkleTree { tree_height: proof.tree_height, leaf_indices, nodes: HashMap::new(), }; let num_leafs = partial_tree.num_leafs()?; if partial_tree.leaf_indices.iter().any(|&i| i >= num_leafs) { return Err(MerkleTreeError::LeafIndexInvalid { num_leafs }); } let node_indices = MerkleTree::::authentication_structure_node_indices( num_leafs, &partial_tree.leaf_indices, )?; if proof.authentication_structure.len() != node_indices.len() { return Err(MerkleTreeError::AuthenticationStructureLengthMismatch); } let mut nodes: HashMap<_, _> = node_indices .zip_eq(proof.authentication_structure) .collect(); for (leaf_index, leaf_digest) in proof.indexed_leafs { let node_index = leaf_index + num_leafs; if let Vacant(entry) = nodes.entry(node_index) { entry.insert(leaf_digest); } else if nodes[&node_index] != leaf_digest { return Err(MerkleTreeError::RepeatedLeafDigestMismatch); } } partial_tree.nodes = nodes; partial_tree.fill()?; Ok(partial_tree) } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Error)] pub enum MerkleTreeError { #[error("All leaf indices must be valid, i.e., less than {num_leafs}.")] LeafIndexInvalid { num_leafs: usize }, #[error("The length of the supplied authentication structure must match the expected length.")] AuthenticationStructureLengthMismatch, #[error("Leaf digests of repeated indices must be identical.")] RepeatedLeafDigestMismatch, #[error("The partial tree must be minimal. Node {0} was supplied but can be computed.")] SpuriousNodeIndex(usize), #[error("The partial tree must contain all necessary information. Node {0} is missing.")] MissingNodeIndex(usize), #[error("Could not compute the root. Maybe no leaf indices were supplied?")] RootNotFound, #[error("Too few leafs to build a Merkle tree.")] TooFewLeafs, #[error("The number of leafs must be a power of two.")] IncorrectNumberOfLeafs, #[error("Tree height must not exceed {MAX_TREE_HEIGHT}.")] TreeTooHigh, } // #[cfg(test)] // pub mod merkle_tree_test { // use crate::crypto::digest::*; // use crate::definitions::{FieldElement, GrumpkinPrimeField}; // use proptest::collection::vec; // use proptest::prelude::*; // use proptest_arbitrary_interop::arb; // use test_strategy::proptest; // use super::*; // use crate::crypto::digest::digest_tests::DigestCorruptor; // impl MerkleTree { // fn test_tree_of_height(tree_height: usize) -> Self { // let num_leafs = 1 << tree_height; // let leafs = (0..num_leafs) // .map(|i| Digest::new(FieldElement::::from(i))) // .collect_vec(); // let tree = Self::par_new(&leafs).unwrap(); // assert!(leafs.iter().all_unique()); // tree // } // } // impl PartialMerkleTree { // fn dummy_nodes_for_indices( // node_indices: &[usize], // ) -> HashMap> { // node_indices // .iter() // .map(|&i| (i, FieldElement::::from(i as u64))) // .map(|(i, leaf)| (i, Digest::new(PoseidonBn254Hash::hash_single(&leaf)))) // .collect() // } // } // /// Test helper to deduplicate generation of Merkle trees. // #[derive(Debug, Clone, test_strategy::Arbitrary)] // pub(crate) struct MerkleTreeToTest { // #[strategy(arb())] // pub tree: MerkleTree, // #[strategy(vec(0..#tree.num_leafs(), 0..#tree.num_leafs()))] // pub selected_indices: Vec, // } // impl MerkleTreeToTest { // fn has_non_trivial_proof(&self) -> bool { // !self.selected_indices.is_empty() // } // fn proof(&self) -> MerkleTreeInclusionProof { // // test helper – unwrap is fine // self.tree // .inclusion_proof_for_leaf_indices(&self.selected_indices) // .unwrap() // } // } // #[test] // fn building_merkle_tree_from_empty_list_of_digests_fails_with_expected_error() { // let maybe_tree = MerkleTree::::par_new(&[]); // let err = maybe_tree.unwrap_err(); // assert_eq!(MerkleTreeError::TooFewLeafs, err); // } // #[test] // fn merkle_tree_with_one_leaf_has_expected_height_and_number_of_leafs() { // let digest = Digest::::default(); // let tree = MerkleTree::::par_new(&[digest]).unwrap(); // assert_eq!(1, tree.num_leafs()); // assert_eq!(0, tree.height()); // } // #[proptest] // fn building_merkle_tree_from_one_digest_makes_that_digest_the_root( // digest: Digest, // ) { // let tree = MerkleTree::par_new(&[digest]).unwrap(); // assert_eq!(digest, tree.root()); // } // #[proptest] // fn building_merkle_tree_from_list_of_digests_with_incorrect_number_of_leafs_fails( // #[filter(!#num_leafs.is_power_of_two())] // #[strategy(1_usize..1 << 13)] // num_leafs: usize, // ) { // let digest = Digest::::default(); // let digests = vec![digest; num_leafs]; // let maybe_tree = MerkleTree::::par_new(&digests); // let err = maybe_tree.unwrap_err(); // assert_eq!(MerkleTreeError::IncorrectNumberOfLeafs, err); // } // #[proptest] // fn merkle_tree_construction_strategies_behave_identically_on_random_input( // leafs: Vec>, // ) { // let sequential = MerkleTree::sequential_new(&leafs); // let parallel = MerkleTree::par_new(&leafs); // prop_assert_eq!(sequential, parallel); // } // #[proptest] // fn merkle_tree_construction_strategies_produce_identical_trees( // #[strategy(0_usize..10)] _tree_height: usize, // #[strategy(vec(arb(), 1 << #_tree_height))] leafs: Vec>, // ) { // let sequential = MerkleTree::sequential_new(&leafs)?; // let parallel = MerkleTree::par_new(&leafs)?; // prop_assert_eq!(sequential, parallel); // } // #[proptest(cases = 100)] // fn accessing_number_of_leafs_and_height_never_panics( // #[strategy(arb())] merkle_tree: MerkleTree, // ) { // let _ = merkle_tree.num_leafs(); // let _ = merkle_tree.height(); // } // #[proptest(cases = 50)] // fn trivial_proof_can_be_verified( // #[strategy(arb())] merkle_tree: MerkleTree, // ) { // let proof = merkle_tree.inclusion_proof_for_leaf_indices(&[]).unwrap(); // prop_assert!(proof.authentication_structure.is_empty()); // let verdict = proof.verify(merkle_tree.root()); // prop_assert!(verdict); // } // #[proptest(cases = 40)] // fn honestly_generated_authentication_structure_can_be_verified(test_tree: MerkleTreeToTest) { // let proof = test_tree.proof(); // let verdict = proof.verify(test_tree.tree.root()); // prop_assert!(verdict); // } // #[proptest(cases = 30)] // fn corrupt_root_leads_to_verification_failure( // #[filter(#test_tree.has_non_trivial_proof())] test_tree: MerkleTreeToTest, // corruptor: DigestCorruptor, // ) { // let bad_root = corruptor.corrupt_digest(test_tree.tree.root()); // let proof = test_tree.proof(); // let verdict = proof.verify(bad_root); // prop_assert!(!verdict); // } // #[proptest(cases = 20)] // fn corrupt_authentication_structure_leads_to_verification_failure( // #[filter(!#test_tree.proof().authentication_structure.is_empty())] // test_tree: MerkleTreeToTest, // #[strategy(Just(#test_tree.proof().authentication_structure.len()))] // _num_auth_structure_entries: usize, // #[strategy(vec(0..#_num_auth_structure_entries, 1..=#_num_auth_structure_entries))] // indices_to_corrupt: Vec, // #[strategy(vec(any::(), #indices_to_corrupt.len()))] // digest_corruptors: Vec, // ) { // let mut proof = test_tree.proof(); // for (i, digest_corruptor) in indices_to_corrupt.into_iter().zip_eq(digest_corruptors) { // proof.authentication_structure[i] = // digest_corruptor.corrupt_digest(proof.authentication_structure[i]); // } // if proof == test_tree.proof() { // let reject_reason = "corruption must change authentication structure".into(); // return Err(TestCaseError::Reject(reject_reason)); // } // let verdict = proof.verify(test_tree.tree.root()); // prop_assert!(!verdict); // } // #[proptest(cases = 30)] // fn corrupt_leaf_digests_lead_to_verification_failure( // #[filter(#test_tree.has_non_trivial_proof())] test_tree: MerkleTreeToTest, // #[strategy(Just(#test_tree.proof().indexed_leafs.len()))] _n_leafs: usize, // #[strategy(vec(0..#_n_leafs, 1..=#_n_leafs))] leafs_to_corrupt: Vec, // #[strategy(vec(any::(), #leafs_to_corrupt.len()))] digest_corruptors: Vec< // DigestCorruptor, // >, // ) { // let mut proof = test_tree.proof(); // for (&i, digest_corruptor) in leafs_to_corrupt.iter().zip_eq(&digest_corruptors) { // let (leaf_index, leaf_digest) = proof.indexed_leafs[i]; // let corrupt_digest = digest_corruptor.corrupt_digest(leaf_digest); // proof.indexed_leafs[i] = (leaf_index, corrupt_digest); // } // if proof == test_tree.proof() { // let reject_reason = "corruption must change leaf digests".into(); // return Err(TestCaseError::Reject(reject_reason)); // } // let verdict = proof.verify(test_tree.tree.root()); // prop_assert!(!verdict); // } // #[proptest(cases = 30)] // fn removing_leafs_from_proof_leads_to_verification_failure( // #[filter(#test_tree.has_non_trivial_proof())] test_tree: MerkleTreeToTest, // #[strategy(Just(#test_tree.proof().indexed_leafs.len()))] _n_leafs: usize, // #[strategy(vec(0..#_n_leafs, 1..=#_n_leafs))] leaf_indices_to_remove: Vec, // ) { // let mut proof = test_tree.proof(); // let leafs_to_keep = proof // .indexed_leafs // .iter() // .filter(|(i, _)| !leaf_indices_to_remove.contains(i)); // proof.indexed_leafs = leafs_to_keep.copied().collect(); // if proof == test_tree.proof() { // let reject_reason = "removing leafs must change proof".into(); // return Err(TestCaseError::Reject(reject_reason)); // } // let verdict = proof.verify(test_tree.tree.root()); // prop_assert!(!verdict); // } // #[proptest(cases = 30)] // fn checking_set_inclusion_of_items_not_in_set_leads_to_verification_failure( // #[filter(#test_tree.has_non_trivial_proof())] test_tree: MerkleTreeToTest, // #[strategy(vec(0..#test_tree.tree.num_leafs(), 1..=#test_tree.tree.num_leafs()))] // spurious_indices: Vec, // #[strategy(vec(any::>(), #spurious_indices.len()))] // spurious_digests: Vec>, // ) { // let spurious_leafs = spurious_indices // .into_iter() // .zip_eq(spurious_digests) // .collect_vec(); // let mut proof = test_tree.proof(); // proof.indexed_leafs.extend(spurious_leafs); // let verdict = proof.verify(test_tree.tree.root()); // prop_assert!(!verdict); // } // #[proptest(cases = 30)] // fn honestly_generated_proof_with_duplicate_leafs_can_be_verified( // #[filter(#test_tree.has_non_trivial_proof())] test_tree: MerkleTreeToTest, // #[strategy(Just(#test_tree.proof().indexed_leafs.len()))] _n_leafs: usize, // #[strategy(vec(0..#_n_leafs, 1..=#_n_leafs))] indices_to_duplicate: Vec, // ) { // let mut proof = test_tree.proof(); // let duplicate_leafs = indices_to_duplicate // .into_iter() // .map(|i| proof.indexed_leafs[i]) // .collect_vec(); // proof.indexed_leafs.extend(duplicate_leafs); // let verdict = proof.verify(test_tree.tree.root()); // prop_assert!(verdict); // } // #[proptest(cases = 40)] // fn incorrect_tree_height_leads_to_verification_failure( // #[filter(#test_tree.has_non_trivial_proof())] test_tree: MerkleTreeToTest, // #[strategy(0..=MAX_TREE_HEIGHT)] // #[filter(#test_tree.tree.height() != #incorrect_height)] // incorrect_height: usize, // ) { // let mut proof = test_tree.proof(); // proof.tree_height = incorrect_height; // let verdict = proof.verify(test_tree.tree.root()); // prop_assert!(!verdict); // } // #[proptest(cases = 20)] // fn honestly_generated_proof_with_all_leafs_revealed_can_be_verified( // #[strategy(arb())] tree: MerkleTree, // ) { // let leaf_indices = (0..tree.num_leafs()).collect_vec(); // let proof = tree // .inclusion_proof_for_leaf_indices(&leaf_indices) // .unwrap(); // let verdict = proof.verify(tree.root()); // prop_assert!(verdict); // } // #[proptest(cases = 30)] // fn requesting_inclusion_proof_for_nonexistent_leaf_fails_with_expected_error( // #[strategy(arb())] tree: MerkleTree, // #[filter(#leaf_indices.iter().any(|&i| i > #tree.num_leafs()))] leaf_indices: Vec, // ) { // let maybe_proof = tree.inclusion_proof_for_leaf_indices(&leaf_indices); // let err = maybe_proof.unwrap_err(); // let num_leafs = tree.num_leafs(); // assert_eq!(MerkleTreeError::LeafIndexInvalid { num_leafs }, err); // } // #[test] // fn authentication_paths_of_extremely_small_tree_use_expected_digests() { // // _ 1_ // // / \ // // 2 3 // // / \ / \ // // 4 5 6 7 // // // // 0 1 2 3 <- leaf indices // let tree = MerkleTree::test_tree_of_height(2); // let auth_path_with_nodes = |indices: [usize; 2]| indices.map(|i| tree.nodes[i]).to_vec(); // let auth_path_for_leaf = |index| tree.authentication_structure(&[index]).unwrap(); // assert_eq!(auth_path_with_nodes([5, 3]), auth_path_for_leaf(0)); // assert_eq!(auth_path_with_nodes([4, 3]), auth_path_for_leaf(1)); // assert_eq!(auth_path_with_nodes([7, 2]), auth_path_for_leaf(2)); // assert_eq!(auth_path_with_nodes([6, 2]), auth_path_for_leaf(3)); // } // #[test] // fn authentication_paths_of_very_small_tree_use_expected_digests() { // // ──── 1 ──── // // ╱ ╲ // // 2 3 // // ╱ ╲ ╱ ╲ // // ╱ ╲ ╱ ╲ // // 4 5 6 7 // // ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ // // 8 9 10 11 12 13 14 15 // // // // 0 1 2 3 4 5 6 7 <- leaf indices // let tree = MerkleTree::test_tree_of_height(3); // let auth_path_with_nodes = |indices: [usize; 3]| indices.map(|i| tree.nodes[i]).to_vec(); // let auth_path_for_leaf = |index| tree.authentication_structure(&[index]).unwrap(); // assert_eq!(auth_path_with_nodes([9, 5, 3]), auth_path_for_leaf(0)); // assert_eq!(auth_path_with_nodes([8, 5, 3]), auth_path_for_leaf(1)); // assert_eq!(auth_path_with_nodes([11, 4, 3]), auth_path_for_leaf(2)); // assert_eq!(auth_path_with_nodes([10, 4, 3]), auth_path_for_leaf(3)); // assert_eq!(auth_path_with_nodes([13, 7, 2]), auth_path_for_leaf(4)); // assert_eq!(auth_path_with_nodes([12, 7, 2]), auth_path_for_leaf(5)); // assert_eq!(auth_path_with_nodes([15, 6, 2]), auth_path_for_leaf(6)); // assert_eq!(auth_path_with_nodes([14, 6, 2]), auth_path_for_leaf(7)); // } // #[proptest(cases = 10)] // fn each_leaf_can_be_verified_individually(test_tree: MerkleTreeToTest) { // let tree = test_tree.tree; // for (leaf_index, &leaf) in tree.leafs().iter().enumerate() { // let authentication_path = tree.authentication_structure(&[leaf_index]).unwrap(); // let proof = MerkleTreeInclusionProof { // tree_height: tree.height(), // indexed_leafs: [(leaf_index, leaf)].into(), // authentication_structure: authentication_path, // }; // let verdict = proof.verify(tree.root()); // prop_assert!(verdict); // } // } // #[test] // fn partial_merkle_tree_built_from_authentication_structure_contains_expected_nodes() { // let merkle_tree = MerkleTree::test_tree_of_height(3); // let proof = merkle_tree // .inclusion_proof_for_leaf_indices(&[0, 2]) // .unwrap(); // let partial_tree = PartialMerkleTree::try_from(proof).unwrap(); // // ──── 1 ──── // // ╱ ╲ // // 2 3 // // ╱ ╲ // // ╱ ╲ // // 4 5 // // ╱ ╲ ╱ ╲ // // 8 9 10 11 // // // // 0 2 <-- opened_leaf_indices // let expected_node_indices = vec![1, 2, 3, 4, 5, 8, 9, 10, 11]; // let node_indices = partial_tree.nodes.keys().copied().sorted().collect_vec(); // assert_eq!(expected_node_indices, node_indices); // } // #[test] // fn manually_constructed_partial_tree_can_be_filled() { // // ──── _ ─── // // ╱ ╲ // // _ 3 // // ╱ ╲ // // ╱ ╲ // // _ _ // // ╱ ╲ ╱ ╲ // // 8 9 10 11 // // // // 0 2 <-- opened_leaf_indices // let node_indices = [3, 8, 9, 10, 11]; // let mut partial_tree = PartialMerkleTree { // tree_height: 3, // leaf_indices: vec![0, 2], // nodes: PartialMerkleTree::dummy_nodes_for_indices(&node_indices), // }; // partial_tree.fill().unwrap(); // } // #[test] // fn trying_to_compute_root_of_partial_tree_with_necessary_node_missing_gives_expected_error() { // // ──── _ ──── // // ╱ ╲ // // _ _ (!) // // ╱ ╲ // // ╱ ╲ // // _ _ // // ╱ ╲ ╱ ╲ // // 8 9 10 11 // // // // 0 2 <-- opened_leaf_indices // let node_indices = [8, 9, 10, 11]; // let mut partial_tree = PartialMerkleTree { // tree_height: 3, // leaf_indices: vec![0, 2], // nodes: PartialMerkleTree::dummy_nodes_for_indices(&node_indices), // }; // let err = partial_tree.fill().unwrap_err(); // assert_eq!(MerkleTreeError::MissingNodeIndex(3), err); // } // #[test] // fn trying_to_compute_root_of_partial_tree_with_redundant_node_gives_expected_error() { // // ──── _ ──── // // ╱ ╲ // // 2 (!) 3 // // ╱ ╲ // // ╱ ╲ // // _ _ // // ╱ ╲ ╱ ╲ // // 8 9 10 11 // // // // 0 2 <-- opened_leaf_indices // let node_indices = [2, 3, 8, 9, 10, 11]; // let mut partial_tree = PartialMerkleTree { // tree_height: 3, // leaf_indices: vec![0, 2], // nodes: PartialMerkleTree::dummy_nodes_for_indices(&node_indices), // }; // let err = partial_tree.fill().unwrap_err(); // assert_eq!(MerkleTreeError::SpuriousNodeIndex(2), err); // } // #[test] // fn converting_authentication_structure_to_authentication_paths_results_in_expected_paths() { // const TREE_HEIGHT: usize = 3; // let merkle_tree = MerkleTree::test_tree_of_height(TREE_HEIGHT); // let proof = merkle_tree // .inclusion_proof_for_leaf_indices(&[0, 2]) // .unwrap(); // let auth_paths = proof.into_authentication_paths().unwrap(); // let auth_path_with_nodes = // |indices: [usize; TREE_HEIGHT]| indices.map(|i| merkle_tree.nodes[i]).to_vec(); // let expected_path_0 = auth_path_with_nodes([9, 5, 3]); // let expected_path_1 = auth_path_with_nodes([11, 4, 3]); // let expected_paths = vec![expected_path_0, expected_path_1]; // assert_eq!(expected_paths, auth_paths); // } // } ================================================ FILE: tools/garaga_rs/src/crypto/mmr/mmr_accumulator.rs ================================================ use std::collections::HashMap; use std::fmt::Debug; // use arbitrary::Arbitrary; // use get_size2::GetSize; use itertools::Itertools; // use serde::Deserialize; // use serde::Serialize; use super::mmr_trait::LeafMutation; use super::shared_basic; use super::TOO_MANY_LEAFS_ERR; use crate::crypto::digest::Digest; use crate::crypto::digest::HashFunction; use crate::crypto::mmr::mmr_membership_proof::MmrMembershipProof; use crate::crypto::mmr::mmr_trait::Mmr; use crate::crypto::mmr::shared_advanced; // use crate::prelude::*; #[derive(Debug, Clone, PartialEq, Eq)] // Serialize, Deserialize, , GetSize)] pub struct MmrAccumulator { leaf_count: u64, peaks: Vec>, } impl MmrAccumulator { pub fn init(peaks: Vec>, leaf_count: u64) -> Self { Self { leaf_count, peaks } } pub fn new_from_leafs(digests: Vec>) -> Self { let mut mmra = MmrAccumulator { leaf_count: 0, peaks: vec![], }; for digest in digests { mmra.append(digest); } mmra } /// Is `self` self-consistent? That is, is it possible to have the claimed /// number of leafs given the number of peaks? pub(crate) fn is_consistent(&self) -> bool { let num_peaks = u32::try_from(self.peaks.len()).expect(TOO_MANY_LEAFS_ERR); num_peaks == self.num_leafs().count_ones() } } impl Mmr for MmrAccumulator { /// Calculate a commitment to the entire MMR. fn bag_peaks(&self) -> Digest { bag_peaks(&self.peaks, self.leaf_count) } /// Return the Merkle tree roots of the Merkle trees that this MMR consists /// of. fn peaks(&self) -> Vec> { self.peaks.clone() } /// Returns true iff there are no leafs in the MMR. fn is_empty(&self) -> bool { self.leaf_count == 0 } /// Return the number of leafs in the MMR. fn num_leafs(&self) -> u64 { self.leaf_count } /// Add a leaf to the MMR. Returns the membership proof of the newly added /// leaf. fn append(&mut self, new_leaf: Digest) -> MmrMembershipProof { let (new_peaks, membership_proof) = shared_basic::calculate_new_peaks_from_append( self.leaf_count, self.peaks.clone(), new_leaf, ); self.peaks = new_peaks; self.leaf_count += 1; membership_proof } /// Mutate an existing leaf. It is the caller's responsibility that the /// membership proof is valid. If the membership proof is wrong, the MMR /// will end up in a broken state. fn mutate_leaf(&mut self, leaf_mutation: LeafMutation) { self.peaks = shared_basic::calculate_new_peaks_from_leaf_mutation( &self.peaks, self.leaf_count, leaf_mutation.new_leaf, leaf_mutation.leaf_index, &leaf_mutation.membership_proof, ) } /// Mutate multiple leafs in the MMR. Takes a list of membership proofs /// that will be updated accordingly. Meaning that the provided membership /// proofs will be valid for the new MMR, provided they were valid before /// the update was applied. /// Panics if `membership_proofs` and `membership_proof_leaf_indices` do not have /// the same length, or if a leaf index is out-of-bounds for the MMR. fn batch_mutate_leaf_and_update_mps( &mut self, membership_proofs: &mut [&mut MmrMembershipProof], membership_proof_leaf_indices: &[u64], mut mutation_data: Vec>, ) -> Vec { assert_eq!( membership_proofs.len(), membership_proof_leaf_indices.len(), "Lists must have same length. Got: {} and {}", membership_proofs.len(), membership_proof_leaf_indices.len() ); assert!( membership_proof_leaf_indices .iter() .all(|x| *x < self.leaf_count), "All leaf indices must be in-bounds. Got indices [{}] and leaf_count = {}", membership_proof_leaf_indices.iter().join(", "), self.leaf_count ); // Calculate all derivable paths let mut new_ap_digests: HashMap> = HashMap::new(); // Calculate the derivable digests from a number of leaf mutations and their // associated authentication paths. Notice that all authentication paths // are only valid *prior* to any updates. They get invalidated (unless updated) // throughout the updating as their neighbor leaf digests change values. // The hash map `new_ap_digests` takes care of that. while let Some(LeafMutation { leaf_index, new_leaf, membership_proof, }) = mutation_data.pop() { let mut node_index = shared_advanced::leaf_index_to_node_index(leaf_index); let former_value = new_ap_digests.insert(node_index, new_leaf); assert!( former_value.is_none(), "Duplicated leaf indices are not allowed in membership proof updater" ); let mut acc_hash: Digest = new_leaf.to_owned(); for (count, &hash) in membership_proof.authentication_path.iter().enumerate() { // If sibling node is something that has already been calculated, we use that // hash digest. Otherwise, we use the one in our authentication path. let (right_ancestor_count, height) = shared_advanced::right_lineage_length_and_own_height(node_index); let is_right_child = right_ancestor_count != 0; if is_right_child { let left_sibling_index = shared_advanced::left_sibling(node_index, height); let sibling_hash: Digest = new_ap_digests .get(&left_sibling_index) .copied() .unwrap_or(hash); acc_hash = Digest::::from_element(H::hash_pair(&sibling_hash.data, &acc_hash.data)); // Find parent node index node_index += 1; } else { let right_sibling_index = shared_advanced::right_sibling(node_index, height); let sibling_hash: Digest = new_ap_digests .get(&right_sibling_index) .copied() .unwrap_or(hash); acc_hash = Digest::::from_element(H::hash_pair(&acc_hash.data, &sibling_hash.data)); // Find parent node index node_index += 1 << (height + 1); } // The last hash calculated is the peak hash // This is not inserted in the hash map, as it will never be in any // authentication path if count < membership_proof.authentication_path.len() - 1 { new_ap_digests.insert(node_index, acc_hash); } } // Update the peak let (_, peak_index) = shared_basic::leaf_index_to_mt_index_and_peak_index(leaf_index, self.num_leafs()); self.peaks[peak_index as usize] = acc_hash; } // Update all the supplied membership proofs let mut modified_membership_proof_indices: Vec = vec![]; for (i, (membership_proof, mp_leaf_index)) in membership_proofs .iter_mut() .zip(membership_proof_leaf_indices) .enumerate() { let ap_indices = membership_proof.get_node_indices(*mp_leaf_index); // Some of the hashes in `membership_proof` might need to be updated. We can // loop over `authentication_path_indices` and check if the element is // contained `deducible_hashes`. If it is, then the appropriate element in // `membership_proof.authentication_path` needs to be replaced with an element // from `deducible_hashes`. for (digest, authentication_path_indices) in membership_proof .authentication_path .iter_mut() .zip(ap_indices.into_iter()) { // Any number of hashes can be updated in the authentication path, since // we're modifying multiple leafs in the MMR // Since this function returns the indices of the modified membership proofs, // a check if the new digest is actually different from the previous value is // needed. if new_ap_digests.contains_key(&authentication_path_indices) && *digest != new_ap_digests[&authentication_path_indices] { *digest = new_ap_digests[&authentication_path_indices]; modified_membership_proof_indices.push(i); } } } modified_membership_proof_indices.dedup(); modified_membership_proof_indices } /// `true` if the `new_peaks` input matches the calculated new MMR peaks /// resulting from the provided appends and mutations. Can panic if initial /// state is not a valid MMR. fn verify_batch_update( &self, new_peaks: &[Digest], appended_leafs: &[Digest], leaf_mutations: Vec>, ) -> bool { let mut manipulated_leaf_indices = leaf_mutations.iter().map(|x| x.leaf_index); if !manipulated_leaf_indices.clone().all_unique() { return false; } if manipulated_leaf_indices.any(|idx| idx >= self.leaf_count) { return false; } // Reverse the leaf mutation vectors, since we want to apply them using `pop` let ( mut leaf_mutation_indices, mut leaf_mutation_target_values, mut updated_membership_proofs, ): (Vec<_>, Vec<_>, Vec<_>) = leaf_mutations .into_iter() .rev() .map(|m| (m.leaf_index, m.new_leaf, m.membership_proof)) .multiunzip(); let mut running_peaks = self.peaks.clone(); while let Some(membership_proof) = updated_membership_proofs.pop() { let new_leaf_value = leaf_mutation_target_values.pop().unwrap(); let leaf_index_mutated_leaf = leaf_mutation_indices.pop().unwrap(); // TODO: Should we verify the membership proof here? // Calculate the new peaks after mutating a leaf running_peaks = shared_basic::calculate_new_peaks_from_leaf_mutation( &running_peaks, self.leaf_count, new_leaf_value, leaf_index_mutated_leaf, &membership_proof, ); // TODO: Replace this with the new batch updater `batch_update_from_batch_leaf_mutation` // Update all remaining membership proofs with this leaf mutation let leaf_mutation = LeafMutation::new(leaf_index_mutated_leaf, new_leaf_value, membership_proof); MmrMembershipProof::batch_update_from_leaf_mutation( &mut updated_membership_proofs, &leaf_mutation_indices, leaf_mutation, ); } for (append_count, &leaf_to_append) in (0..).zip(appended_leafs) { let (calculated_new_peaks, _) = shared_basic::calculate_new_peaks_from_append( self.leaf_count + append_count, running_peaks, leaf_to_append, ); running_peaks = calculated_new_peaks; } running_peaks == new_peaks } fn to_accumulator(&self) -> MmrAccumulator { self.to_owned() } } /// Follows the description on /// /// to calculate a root from a list of peaks and the size of the MMR. pub(crate) fn bag_peaks(peaks: &[Digest], leaf_count: u64) -> Digest { // use `hash_10` over `hash` or `hash_varlen` to simplify hashing in Triton VM let leaf_count_elem = H::Element::from(leaf_count); let hashed_leaf_count = Digest::::from_element(H::hash_single(&leaf_count_elem)); peaks.iter().rev().fold(hashed_leaf_count, |acc, &peak| { Digest::::from_element(H::hash_pair(&peak.data, &acc.data)) }) } pub mod util { // use itertools::Itertools; use super::super::shared_advanced::right_lineage_length_from_node_index; use super::super::shared_basic::leaf_index_to_mt_index_and_peak_index; use super::*; use crate::crypto::digest::random_elements; /// Get an MMR accumulator with a requested number of leafs, and requested leaf /// digests at specified indices. Also returns the MMR membership proofs for the /// specified leafs. pub fn mmra_with_mps( leaf_count: u64, specified_leafs: Vec<(u64, Digest)>, ) -> (MmrAccumulator, Vec>) { assert!( specified_leafs.iter().map(|&(idx, _)| idx).all_unique(), "Specified leaf indices must be unique" ); // initial_setup let mut peaks: Vec> = random_elements::(leaf_count.count_ones() as usize); if specified_leafs.is_empty() { return (MmrAccumulator::init(peaks, leaf_count), vec![]); } let (first_leaf_index, first_specified_digest) = specified_leafs[0]; let (first_mt_index, first_peak_index) = leaf_index_to_mt_index_and_peak_index(first_leaf_index, leaf_count); // Change peaks such that the 1st specification belongs in the MMR let first_mt_height = (first_mt_index + 1).next_power_of_two().ilog2() - 1; let first_ap: Vec> = random_elements(first_mt_height as usize); let first_mp = MmrMembershipProof::new(first_ap); let original_node_indices = first_mp.get_node_indices(first_leaf_index); let mut derivable_node_values: HashMap> = HashMap::default(); let mut first_acc_hash = first_specified_digest; for (height, node_index_in_path) in first_mp .get_direct_path_indices(first_leaf_index) .into_iter() .enumerate() { derivable_node_values.insert(node_index_in_path, first_acc_hash); if first_mp.authentication_path.len() > height { if right_lineage_length_from_node_index(node_index_in_path) != 0 { first_acc_hash = Digest::::from_element(H::hash_pair( &first_mp.authentication_path[height].data, &first_acc_hash.data, )); } else { first_acc_hash = Digest::::from_element(H::hash_pair( &first_acc_hash.data, &first_mp.authentication_path[height].data, )); } } } // Update root peaks[first_peak_index as usize] = first_acc_hash; let mut all_ap_elements: HashMap> = original_node_indices .into_iter() .zip_eq(first_mp.authentication_path.clone()) .collect(); let mut all_mps = vec![first_mp]; let mut all_leaf_indices = vec![first_leaf_index]; let mut all_leafs = vec![first_specified_digest]; for (new_leaf_index, new_leaf) in specified_leafs.into_iter().skip(1) { let (new_leaf_mt_index, _new_leaf_peaks_index) = leaf_index_to_mt_index_and_peak_index(new_leaf_index, leaf_count); let height_of_new_mt = (new_leaf_mt_index + 1).next_power_of_two().ilog2() - 1; let mut new_mp = MmrMembershipProof::new(random_elements(height_of_new_mt as usize)); let new_node_indices = new_mp.get_node_indices(new_leaf_index); for (height, new_node_index) in new_node_indices.iter().enumerate() { if all_ap_elements.contains_key(new_node_index) { // AP element may not be mutated new_mp.authentication_path[height] = all_ap_elements[new_node_index]; } else if derivable_node_values.contains_key(new_node_index) { // AP element must refer to both old and new leaf new_mp.authentication_path[height] = derivable_node_values[new_node_index]; } } let new_peaks = shared_basic::calculate_new_peaks_from_leaf_mutation( &peaks, leaf_count, new_leaf, new_leaf_index, &new_mp, ); assert!(new_mp.verify(new_leaf_index, new_leaf, &new_peaks, leaf_count)); let leaf_mutations = vec![LeafMutation::new(new_leaf_index, new_leaf, new_mp.clone())]; let mutated = MmrMembershipProof::batch_update_from_batch_leaf_mutation( &mut all_mps.iter_mut().collect_vec(), &all_leaf_indices, leaf_mutations, ); // Sue me for muta in mutated.iter() { let mp = &all_mps[*muta]; let mp_leaf_index = all_leaf_indices[*muta]; for (hght, idx) in mp.get_node_indices(mp_leaf_index).iter().enumerate() { all_ap_elements.insert(*idx, mp.authentication_path[hght]); } } // Update derivable node values let mut acc_hash = new_leaf; for (height, node_index_in_path) in new_mp .get_direct_path_indices(new_leaf_index) .into_iter() .enumerate() { if height == new_mp.get_direct_path_indices(new_leaf_index).len() - 1 { break; } derivable_node_values.insert(node_index_in_path, acc_hash); if right_lineage_length_from_node_index(node_index_in_path) != 0 { acc_hash = Digest::::from_element(H::hash_pair( &new_mp.authentication_path[height].data, &acc_hash.data, )); } else { acc_hash = Digest::::from_element(H::hash_pair( &acc_hash.data, &new_mp.authentication_path[height].data, )); } } // Update all_ap_elements for (node_index, ap_element) in new_node_indices .into_iter() .zip_eq(new_mp.authentication_path.clone().into_iter()) { all_ap_elements.insert(node_index, ap_element); } all_mps.push(new_mp); peaks = new_peaks; all_leafs.push(new_leaf); all_leaf_indices.push(new_leaf_index); } (MmrAccumulator::init(peaks, leaf_count), all_mps) } } use arbitrary::Arbitrary; impl<'a, H: HashFunction> Arbitrary<'a> for MmrAccumulator { fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { let num_leafs = u.arbitrary::()? >> 1; // num_leafs can be at most 63 bits let peaks = (0..num_leafs.count_ones()) .map(|_| Digest::arbitrary(u)) .try_collect()?; Ok(MmrAccumulator::init(peaks, num_leafs)) } } // #[cfg(test)] // mod accumulator_mmr_tests { // use std::cmp; // use insta::assert_snapshot; // use itertools::izip; // use itertools::Itertools; // use num_traits::ConstZero; // use proptest::collection::vec; // use proptest::prop_assert_eq; // use proptest_arbitrary_interop::arb; // use rand::distr::Uniform; // use rand::prelude::*; // use rand::random; // use test_strategy::proptest; // use super::*; // use crate::math::b_field_element::BFieldElement; // use crate::math::other::random_elements; // use crate::math::tip5::Tip5; // use crate::mock::mmr::get_mock_ammr_from_digests; // use crate::mock::mmr::MockMmr; // impl From for MmrAccumulator { // fn from(ammr: MockMmr) -> Self { // MmrAccumulator { // leaf_count: ammr.num_leafs(), // peaks: ammr.peaks(), // } // } // } // impl From<&MockMmr> for MmrAccumulator { // fn from(ammr: &MockMmr) -> Self { // MmrAccumulator { // leaf_count: ammr.num_leafs(), // peaks: ammr.peaks(), // } // } // } // #[test] // fn conversion_test() { // let leaf_hashes: Vec = random_elements(3); // let mock_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes); // let accumulator_mmr = MmrAccumulator::from(mock_mmr.clone()); // assert_eq!(mock_mmr.peaks(), accumulator_mmr.peaks()); // assert_eq!(mock_mmr.bag_peaks(), accumulator_mmr.bag_peaks()); // assert_eq!(mock_mmr.is_empty(), accumulator_mmr.is_empty()); // assert!(!mock_mmr.is_empty()); // assert_eq!(mock_mmr.num_leafs(), accumulator_mmr.num_leafs()); // assert_eq!(3, accumulator_mmr.num_leafs()); // } // #[test] // fn verify_batch_update_single_append_test() { // let leaf_hashes_start: Vec = random_elements(3); // let appended_leaf: Digest = random(); // let mut leaf_hashes_end: Vec = leaf_hashes_start.clone(); // leaf_hashes_end.push(appended_leaf); // let accumulator_mmr_start: MmrAccumulator = // MmrAccumulator::new_from_leafs(leaf_hashes_start); // let accumulator_mmr_end: MmrAccumulator = MmrAccumulator::new_from_leafs(leaf_hashes_end); // let leafs_were_appended = accumulator_mmr_start.verify_batch_update( // &accumulator_mmr_end.peaks(), // &[appended_leaf], // vec![], // ); // assert!(leafs_were_appended); // } // #[test] // fn verify_batch_update_single_mutate_test() { // let leaf0: Digest = random(); // let leaf1: Digest = random(); // let leaf2: Digest = random(); // let leaf3: Digest = random(); // let leaf4: Digest = random(); // let leaf_hashes_start: Vec = vec![leaf0, leaf1, leaf2, leaf4]; // let leaf_hashes_end: Vec = vec![leaf0, leaf1, leaf2, leaf3]; // let accumulator_mmr_start: MmrAccumulator = // MmrAccumulator::new_from_leafs(leaf_hashes_start.clone()); // let archive_mmr_start: MockMmr = get_mock_ammr_from_digests(leaf_hashes_start); // let leaf_index_3 = 3; // let membership_proof = archive_mmr_start.prove_membership(leaf_index_3); // let accumulator_mmr_end: MmrAccumulator = MmrAccumulator::new_from_leafs(leaf_hashes_end); // { // let appended_leafs = []; // let leaf_mutations = vec![LeafMutation::new( // leaf_index_3, // leaf3, // membership_proof.clone(), // )]; // assert!(accumulator_mmr_start.verify_batch_update( // &accumulator_mmr_end.peaks(), // &appended_leafs, // leaf_mutations, // )); // } // // Verify that repeated mutations are disallowed // { // let appended_leafs = []; // let leaf_mutations = vec![ // LeafMutation::new(leaf_index_3, leaf3, membership_proof.clone()), // LeafMutation::new(leaf_index_3, leaf3, membership_proof), // ]; // assert!(!accumulator_mmr_start.verify_batch_update( // &accumulator_mmr_end.peaks(), // &appended_leafs, // leaf_mutations, // )); // } // } // #[test] // fn verify_batch_update_two_append_test() { // let leaf_hashes_start: Vec = random_elements(3); // let appended_leafs: Vec = random_elements(2); // let leaf_hashes_end: Vec = // [leaf_hashes_start.clone(), appended_leafs.clone()].concat(); // let accumulator_mmr_start: MmrAccumulator = // MmrAccumulator::new_from_leafs(leaf_hashes_start); // let accumulator_mmr_end: MmrAccumulator = MmrAccumulator::new_from_leafs(leaf_hashes_end); // let leafs_were_appended = accumulator_mmr_start.verify_batch_update( // &accumulator_mmr_end.peaks(), // &appended_leafs, // vec![], // ); // assert!(leafs_were_appended); // } // #[test] // fn verify_batch_update_two_mutate_test() { // let leaf14: Digest = random(); // let leaf15: Digest = random(); // let leaf16: Digest = random(); // let leaf17: Digest = random(); // let leaf20: Digest = random(); // let leaf21: Digest = random(); // let leaf_hashes_start: Vec = vec![leaf14, leaf15, leaf16, leaf17]; // let leaf_hashes_end: Vec = vec![leaf14, leaf20, leaf16, leaf21]; // let accumulator_mmr_start: MmrAccumulator = // MmrAccumulator::new_from_leafs(leaf_hashes_start.clone()); // let archive_mmr_start: MockMmr = get_mock_ammr_from_digests(leaf_hashes_start); // let leaf_index_1 = 1; // let leaf_index_3 = 3; // let membership_proof1 = archive_mmr_start.prove_membership(leaf_index_1); // let membership_proof3 = archive_mmr_start.prove_membership(leaf_index_3); // let accumulator_mmr_end: MmrAccumulator = MmrAccumulator::new_from_leafs(leaf_hashes_end); // let leaf_mutations = vec![ // LeafMutation::new(leaf_index_1, leaf20, membership_proof1), // LeafMutation::new(leaf_index_3, leaf21, membership_proof3), // ]; // assert!(accumulator_mmr_start.verify_batch_update( // &accumulator_mmr_end.peaks(), // &[], // leaf_mutations // )); // } // #[test] // fn batch_mutate_leaf_and_update_mps_test() { // let mut rng = rand::rng(); // for mmr_leaf_count in 1..100 { // let initial_leaf_digests: Vec = random_elements(mmr_leaf_count); // let mut mmra: MmrAccumulator = // MmrAccumulator::new_from_leafs(initial_leaf_digests.clone()); // let mut ammr: MockMmr = get_mock_ammr_from_digests(initial_leaf_digests.clone()); // let mut ammr_copy: MockMmr = get_mock_ammr_from_digests(initial_leaf_digests.clone()); // let mutated_leaf_count = rng.random_range(0..mmr_leaf_count); // let all_indices: Vec = (0..mmr_leaf_count as u64).collect(); // // Pick indices for leafs that are being mutated // let mut all_indices_mut0 = all_indices.clone(); // let mut mutated_leaf_indices: Vec = vec![]; // for _ in 0..mutated_leaf_count { // let leaf_index = // all_indices_mut0.remove(rng.random_range(0..all_indices_mut0.len())); // mutated_leaf_indices.push(leaf_index); // } // // Pick membership proofs that we want to update // let membership_proof_count = rng.random_range(0..mmr_leaf_count); // let mut all_indices_mut1 = all_indices.clone(); // let mut membership_proof_indices: Vec = vec![]; // for _ in 0..membership_proof_count { // let leaf_index = // all_indices_mut1.remove(rng.random_range(0..all_indices_mut1.len())); // membership_proof_indices.push(leaf_index); // } // // Calculate the terminal leafs, as they look after the batch leaf mutation // // that we are preparing to execute // let new_leafs: Vec = random_elements(mutated_leaf_count); // let mut terminal_leafs: Vec = initial_leaf_digests; // for (i, new_leaf) in mutated_leaf_indices.iter().zip(new_leafs.iter()) { // new_leaf.clone_into(&mut terminal_leafs[*i as usize]); // } // // Calculate the leafs digests associated with the membership proofs, as they look // // *after* the batch leaf mutation // let mut terminal_leafs_for_mps: Vec = vec![]; // for i in membership_proof_indices.iter() { // terminal_leafs_for_mps.push(terminal_leafs[*i as usize]); // } // // Construct the mutation data // let all_mps = mutated_leaf_indices // .iter() // .map(|i| ammr.prove_membership(*i)) // .collect_vec(); // let mutation_data: Vec = new_leafs // .into_iter() // .zip(mutated_leaf_indices) // .zip(all_mps.iter()) // .map(|((leaf, leaf_index), mp)| LeafMutation::new(leaf_index, leaf, mp.clone())) // .collect_vec(); // assert_eq!(mutated_leaf_count, mutation_data.len()); // let original_membership_proofs: Vec = membership_proof_indices // .iter() // .map(|i| ammr.prove_membership(*i)) // .collect(); // // Do the update on both MMRs // let mut mmra_mps = original_membership_proofs.clone(); // let mut ammr_mps = original_membership_proofs.clone(); // let mutated_mps_mmra = mmra.batch_mutate_leaf_and_update_mps( // &mut mmra_mps.iter_mut().collect::>(), // &membership_proof_indices, // mutation_data.clone(), // ); // let mutated_mps_ammr = ammr.batch_mutate_leaf_and_update_mps( // &mut ammr_mps.iter_mut().collect::>(), // &membership_proof_indices, // mutation_data.clone(), // ); // assert_eq!(mutated_mps_mmra, mutated_mps_ammr); // // Verify that both MMRs end up with same peaks // assert_eq!(mmra.peaks(), ammr.peaks()); // // Verify that membership proofs from AMMR and MMRA are equal // assert_eq!(membership_proof_count, mmra_mps.len()); // assert_eq!(membership_proof_count, ammr_mps.len()); // assert_eq!(ammr_mps, mmra_mps); // // Verify that all membership proofs still work // assert!(mmra_mps // .iter() // .zip(terminal_leafs_for_mps.iter()) // .zip(membership_proof_indices.iter()) // .all(|((mp, &leaf), leaf_index)| mp.verify( // *leaf_index, // leaf, // &mmra.peaks(), // mmra.num_leafs() // ))); // // Manually construct an MMRA from the new data and verify that peaks and leaf // // count matches // assert!( // mutated_leaf_count == 0 || ammr_copy.peaks() != ammr.peaks(), // "If mutated leaf count is non-zero, at least on peaks must be different" // ); // mutation_data.into_iter().for_each( // |LeafMutation { // leaf_index, // new_leaf, // .. // }| { // ammr_copy.mutate_leaf_raw(leaf_index, new_leaf); // }, // ); // assert_eq!( // ammr_copy.peaks(), // ammr.peaks(), // "Mutation though batch mutation function must transform the MMR \ // like a list of individual leaf mutations" // ); // } // } // #[test] // fn verify_batch_update_pbt() { // type H = Tip5; // for start_size in 1..18 { // let leaf_hashes_start: Vec = random_elements(start_size); // let local_hash = |x: u128| H::hash_varlen(&[BFieldElement::new(x as u64)]); // let bad_digests: Vec = (12..12 + start_size) // .map(|x| local_hash(x as u128)) // .collect(); // let bad_mmr: MockMmr = get_mock_ammr_from_digests(bad_digests.clone()); // let bad_membership_proof: MmrMembershipProof = bad_mmr.prove_membership(0); // let bad_membership_proof_digest = bad_digests[0]; // let bad_leaf: Digest = local_hash(8765432165123u128); // let mock_mmr_init: MockMmr = get_mock_ammr_from_digests(leaf_hashes_start.clone()); // let accumulator_mmr = MmrAccumulator::new_from_leafs(leaf_hashes_start.clone()); // for append_size in 0..18 { // let appends: Vec = (2000..2000 + append_size).map(local_hash).collect(); // let mutate_count = cmp::min(12, start_size); // for mutate_size in 0..mutate_count { // let new_leaf_values: Vec = (13..13 + mutate_size) // .map(|x| local_hash(x as u128)) // .collect(); // // Ensure that indices are unique since batch updating cannot update // // the same leaf twice in one go // let mutated_indices: Vec = rand::rng() // .sample_iter(Uniform::new(0, start_size as u64).unwrap()) // .take(mutate_size) // .sorted() // .unique() // .collect(); // // Create the expected MMRs // let mut leaf_hashes_mutated = leaf_hashes_start.clone(); // for (index, new_leaf) in izip!(mutated_indices.clone(), new_leaf_values.clone()) // { // leaf_hashes_mutated[index as usize] = new_leaf; // } // for appended_digest in appends.iter() { // leaf_hashes_mutated.push(appended_digest.to_owned()); // } // // let mutated_mock_mmr = // // MockMmr::::new(leaf_hashes_mutated.clone()); // let mutated_mock_mmr: MockMmr = // get_mock_ammr_from_digests(leaf_hashes_mutated.clone()); // let mutated_accumulator_mmr = // MmrAccumulator::new_from_leafs(leaf_hashes_mutated); // let expected_new_peaks_from_archival = mutated_mock_mmr.peaks(); // let expected_new_peaks_from_accumulator = mutated_accumulator_mmr.peaks(); // assert_eq!( // expected_new_peaks_from_archival, // expected_new_peaks_from_accumulator // ); // // Create the inputs to the method call // let all_mps = mutated_indices // .iter() // .map(|i| mock_mmr_init.prove_membership(*i)) // .collect_vec(); // let mut leaf_mutations: Vec = new_leaf_values // .clone() // .into_iter() // .zip(mutated_indices.iter()) // .zip(all_mps.iter()) // .map(|((leaf, leaf_index), mp)| { // LeafMutation::new(*leaf_index, leaf, mp.clone()) // }) // .collect_vec(); // assert!(accumulator_mmr.verify_batch_update( // &expected_new_peaks_from_accumulator, // &appends, // leaf_mutations.clone() // )); // assert!(mock_mmr_init.verify_batch_update( // &expected_new_peaks_from_accumulator, // &appends, // leaf_mutations.clone() // )); // // Negative tests // let mut bad_appends = appends.clone(); // if append_size > 0 && mutate_size > 0 { // // bad append vector // bad_appends[(mutated_indices[0] % append_size as u64) as usize] = bad_leaf; // assert!(!accumulator_mmr.verify_batch_update( // &expected_new_peaks_from_accumulator, // &bad_appends, // leaf_mutations.clone() // )); // // Bad membership proof // let bad_index = mutated_indices[0] as usize % mutated_indices.len(); // leaf_mutations[bad_index].new_leaf = bad_membership_proof_digest; // assert!(!accumulator_mmr.verify_batch_update( // &expected_new_peaks_from_accumulator, // &appends, // leaf_mutations.clone() // )); // leaf_mutations[mutated_indices[0] as usize % mutated_indices.len()] // .membership_proof = bad_membership_proof.clone(); // assert!(!accumulator_mmr.verify_batch_update( // &expected_new_peaks_from_accumulator, // &appends, // leaf_mutations // )); // } // } // } // } // } // #[test] // fn mmra_serialization_test() { // // You could argue that this test doesn't belong here, as it tests the behavior of // // an imported library. I included it here, though, because the setup seems a bit clumsy // // to me so far. // type H = Tip5; // type Mmr = MmrAccumulator; // let mut mmra: Mmr = MmrAccumulator::new_from_leafs(vec![]); // mmra.append(H::hash(&BFieldElement::ZERO)); // let json = serde_json::to_string(&mmra).unwrap(); // let s_back = serde_json::from_str::(&json).unwrap(); // assert_eq!(mmra.bag_peaks(), s_back.bag_peaks()); // assert_eq!(1, mmra.num_leafs()); // } // #[test] // fn get_size_test() { // type Mmr = MmrAccumulator; // // 10 digests produces an MMRA with two peaks // let digests: Vec = random_elements(10); // let mmra: Mmr = MmrAccumulator::new_from_leafs(digests); // println!("mmra.get_size() = {}", mmra.get_size()); // // Sanity check of measured size in RAM // assert!(mmra.get_size() > 2 * std::mem::size_of::()); // // For some reason this failed on GitHub's server when only multiplied by 4. This worked // // consistently on my machine with `4`. It's probably because of a different architecture. // // So the number was just increased to 100. See: // // https://github.com/Neptune-Crypto/twenty-first/actions/runs/4928129170/jobs/8806086355 // assert!(mmra.get_size() < 100 * std::mem::size_of::()); // } // #[test] // fn test_mmr_accumulator_decode() { // for _ in 0..100 { // let num_leafs = rand::random_range(0..100); // let leafs = random_elements(num_leafs); // let mmra = MmrAccumulator::new_from_leafs(leafs); // let encoded = mmra.encode(); // let decoded = *MmrAccumulator::decode(&encoded).unwrap(); // assert_eq!(mmra, decoded); // } // } // #[test] // #[should_panic(expected = "Lists must have same length. Got: 0 and 3")] // fn test_diff_len_lists_batch_mutate_leaf_and_update_mps() { // // Checks that batch_mutate_leaf_and_update_mps panics when passed differing length lists // // differing length lists // let mut mock_membership_proofs: Vec = vec![]; // let membership_proof_leaf_indices = vec![1, 2, 3]; // // This should trigger the panic due to the lengths mismatch // let mut mmra: MmrAccumulator = MmrAccumulator::new_from_leafs(vec![]); // mmra.batch_mutate_leaf_and_update_mps( // mock_membership_proofs // .iter_mut() // .collect::>() // .as_mut_slice(), // &membership_proof_leaf_indices, // vec![], // ); // } // #[proptest] // fn arbitrary_mmra_has_consistent_num_leafs_and_peaks( // #[strategy(arb::())] mmra: MmrAccumulator, // ) { // prop_assert_eq!(mmra.peaks().len(), mmra.num_leafs().count_ones() as usize); // } // #[proptest(cases = 20)] // fn mmra_with_mps_produces_valid_output( // #[strategy(0..u64::MAX / 2)] mmr_leaf_count: u64, // #[strategy(0usize..10)] _num_revealed_leafs: usize, // #[strategy(vec(0u64..#mmr_leaf_count, #_num_revealed_leafs))] // mmr_revealed_leaf_indices: Vec, // ) { // let indexed_leafs_input: Vec<(u64, Digest)> = mmr_revealed_leaf_indices // .iter() // .map(|idx| (*idx, random())) // .collect_vec(); // let (mmra, mmr_mps) = util::mmra_with_mps(mmr_leaf_count, indexed_leafs_input.clone()); // for (mmr_mp, (mmr_leaf_index, leaf)) in // mmr_mps.into_iter().zip_eq(indexed_leafs_input.iter()) // { // mmr_mp.verify(*mmr_leaf_index, *leaf, &mmra.peaks(), mmra.num_leafs()); // } // } // #[test] // fn computing_mmr_root_for_no_leafs_produces_some_digest() { // MmrAccumulator::new_from_leafs(vec![]).bag_peaks(); // } // #[test] // fn bag_peaks_snapshot() { // let mut rng = StdRng::seed_from_u64(0x92ca758afeec6d29); // let empty_mmr = MmrAccumulator::new_from_leafs(vec![]); // assert_snapshot!(empty_mmr.bag_peaks().0[0], @"00941080798860502477"); // let one_leaf_mmr = MmrAccumulator::new_from_leafs(vec![rng.random()]); // assert_snapshot!(one_leaf_mmr.bag_peaks().0[0], @"16030278140236594076"); // let two_leafs_mmr = MmrAccumulator::new_from_leafs(vec![rng.random()]); // assert_snapshot!(two_leafs_mmr.bag_peaks().0[0], @"09405464453414142998"); // let ten_peaks: [Digest; 10] = rng.random(); // let ten_peak_mmr = MmrAccumulator::init(ten_peaks.to_vec(), 0b11_1111_1111); // assert_snapshot!(ten_peak_mmr.bag_peaks().0[0], @"03780783030734820370"); // } // } ================================================ FILE: tools/garaga_rs/src/crypto/mmr/mmr_membership_proof.rs ================================================ use std::collections::hash_map::RandomState; use std::collections::hash_set::Intersection; use std::collections::HashMap; use std::collections::HashSet; use std::fmt::Debug; use std::iter::FromIterator; // use arbitrary::Arbitrary; // use get_size2::GetSize; use itertools::Itertools; // use serde::Deserialize; // use serde::Serialize; use super::mmr_trait::LeafMutation; use super::shared_advanced; use super::shared_basic; use super::TOO_MANY_LEAFS_ERR; use crate::crypto::digest::{Digest, HashFunction}; use crate::crypto::merkle_tree::MerkleTree; // use crate::error::U32_TO_USIZE_ERR; // use crate::error::USIZE_TO_U64_ERR; // use crate::prelude::*; #[derive(Debug, Clone, Eq, PartialEq)] // Serialize, Deserialize, GetSize, Arbitrary)] pub struct MmrMembershipProof { pub authentication_path: Vec>, } impl MmrMembershipProof { pub fn new(authentication_path: Vec>) -> Self { Self { authentication_path, } } /// Verify a membership proof for an MMR. pub fn verify( &self, leaf_index: u64, leaf_hash: Digest, peaks: &[Digest], num_leafs: u64, ) -> bool { if leaf_index >= num_leafs { // out of bounds return false; } let (mut mt_index, peak_index) = shared_basic::leaf_index_to_mt_index_and_peak_index(leaf_index, num_leafs); let expected_peak_count = num_leafs.count_ones(); let actual_peak_count = u32::try_from(peaks.len()).expect(TOO_MANY_LEAFS_ERR); if expected_peak_count != actual_peak_count { return false; } let merkle_tree_height = u64::from(mt_index.ilog2()); let auth_path_len = u64::try_from(self.authentication_path.len()) .expect("Authentication path length is too large"); if merkle_tree_height != auth_path_len { return false; } let mut current_node = leaf_hash; for &sibling in &self.authentication_path { let current_node_is_left_sibling = mt_index % 2 == 0; current_node = if current_node_is_left_sibling { Digest::::from_element(H::hash_pair(¤t_node.data, &sibling.data)) } else { Digest::::from_element(H::hash_pair(&sibling.data, ¤t_node.data)) }; mt_index /= 2; } debug_assert_eq!(MerkleTree::::ROOT_INDEX as u64, mt_index); let peak_index = usize::try_from(peak_index).expect("Peak index is too large"); peaks[peak_index] == current_node } /// Return the node indices for the authentication path in this membership proof pub(crate) fn get_node_indices(&self, leaf_index: u64) -> Vec { let mut node_index = shared_advanced::leaf_index_to_node_index(leaf_index); let mut node_indices = vec![]; for _ in 0..self.authentication_path.len() { let (right_ancestor_count, height) = shared_advanced::right_lineage_length_and_own_height(node_index); let is_right_child = right_ancestor_count != 0; if is_right_child { node_indices.push(shared_advanced::left_sibling(node_index, height)); // parent of right child is +1 node_index += 1; } else { node_indices.push(shared_advanced::right_sibling(node_index, height)); // parent of left child: node_index += 1 << (height + 1); } } node_indices } /// Return the node indices for the hash values that can be derived from this proof, /// including the node index for the leaf itself. pub(crate) fn get_direct_path_indices(&self, leaf_index: u64) -> Vec { let mut node_index = shared_advanced::leaf_index_to_node_index(leaf_index); let mut node_indices = vec![node_index]; for _ in 0..self.authentication_path.len() { node_index = shared_advanced::parent(node_index); node_indices.push(node_index); } node_indices } /// Return the node index of the peak that the membership proof is pointing /// to, as well as this peak's height. fn get_peak_index_and_height(&self, leaf_index: u64) -> (u64, u32) { ( *self.get_direct_path_indices(leaf_index).last().unwrap(), self.authentication_path.len() as u32, ) } /// Update a membership proof with a `verify_append` proof. Returns `true` if an /// authentication path has been mutated, false otherwise. pub fn update_from_append( &mut self, membership_proof_leaf_index: u64, old_mmr_leaf_count: u64, new_mmr_leaf: Digest, old_mmr_peaks: &[Digest], ) -> bool { // 1. Get index of authentication paths's peak // 2. Get node indices for nodes added by the append // 3. Check if authentication path's peak's parent is present in the added nodes // (peak can only be left child) // a. If not, then we are done, return from method // 4. Get the indices that auth path must be extended with // 5. Get all derivable node digests, store in hash map // a. Get the node digests from the previous peaks // b. Get the node digests that can be calculated by hashing from the new leaf // 6. Push required digests to the authentication path // 1 let (own_old_peak_index, own_old_peak_height) = self.get_peak_index_and_height(membership_proof_leaf_index); // 2 let added_node_indices = shared_advanced::node_indices_added_by_append(old_mmr_leaf_count); // 3 // Any peak is a left child, so we don't have to check if it's a right or left child. // This means we can use a faster method to find the parent index than the generic method. let peak_parent_index = own_old_peak_index + (1 << (own_old_peak_height + 1)); // 3a if !added_node_indices.contains(&peak_parent_index) { return false; } // 4 Get node indices of missing digests let new_peak_index: u64 = *added_node_indices.last().unwrap(); let new_node_count: u64 = shared_advanced::num_leafs_to_num_nodes(old_mmr_leaf_count + 1); let node_indices_for_missing_digests: Vec = shared_advanced::get_authentication_path_node_indices( own_old_peak_index, new_peak_index, new_node_count, ) .unwrap(); // 5 collect all derivable peaks in a hashmap indexed by node index // 5.a, collect all node hash digests that are present in the old peaks // The keys in the hash map are node indices let mut known_digests: HashMap> = HashMap::new(); let (_old_mmr_peak_heights, old_mmr_peak_indices) = shared_advanced::get_peak_heights_and_peak_node_indices(old_mmr_leaf_count); for (old_peak_index, old_peak_digest) in old_mmr_peak_indices.iter().zip(old_mmr_peaks.iter()) { known_digests.insert(*old_peak_index, old_peak_digest.to_owned()); } // 5.b collect all node hash digests that are derivable from `new_leaf` and // `old_peaks`. These are the digests of `new_leaf`'s path to the root. // break out of loop once *one* digest is found this way since that will // always suffice. let mut acc_hash = new_mmr_leaf.to_owned(); for (node_index, &old_peak_digest) in added_node_indices.iter().zip(old_mmr_peaks.iter().rev()) { known_digests.insert(*node_index, acc_hash.to_owned()); // peaks are always left children, so we don't have to check for that acc_hash = Digest::::from_element(H::hash_pair(&old_peak_digest.data, &acc_hash.data)); // once we encounter the first of the needed accumulator indices, // we can break. Just like we could in the update for the leaf update // membership proof update. // The reason for this break is that the authentication path consists of // commits to disjoint sets, so anything that can be derived from a // hash that is part of the missing digests cannot possible be an // element in an authentication path if node_indices_for_missing_digests.contains(node_index) { break; } } // 6 for missing_digest_node_index in node_indices_for_missing_digests { self.authentication_path .push(known_digests[&missing_digest_node_index]); } true } /// Batch update multiple membership proofs. /// Returns the indices of the membership proofs that were modified where index refers /// to the order in which the membership proofs were given to this function. /// Panics if `membership_proofs` and `membership_proof_leaf_indices` do not have /// the same length, or if a leaf index is out-of-bounds for the MMR. pub fn batch_update_from_append( membership_proofs: &mut [&mut Self], membership_proof_leaf_indices: &[u64], old_leaf_count: u64, new_leaf: Digest, old_peaks: &[Digest], ) -> Vec { assert_eq!( membership_proofs.len(), membership_proof_leaf_indices.len(), "Lists must have same length. Got: {} and {}", membership_proofs.len(), membership_proof_leaf_indices.len() ); assert!( membership_proof_leaf_indices .iter() .all(|x| *x < old_leaf_count), "All leaf indices must be in-bounds. Got indices [{}] and old_leaf_count = {}", membership_proof_leaf_indices.iter().join(", "), old_leaf_count ); // 1. Get node indices for nodes added by the append // a. If length of this list is one, newly added leaf was a left child. Return. // 2. Get all derivable node digests, store in hash map let added_node_indices = shared_advanced::node_indices_added_by_append(old_leaf_count); if added_node_indices.len() == 1 { return vec![]; } // 2 collect all derivable peaks in a hashmap indexed by node index // 2.a, collect all node hash digests that are present in the old peaks // The keys in the hash map are node indices let mut known_digests: HashMap> = HashMap::new(); let (_old_peak_heights, old_peak_indices) = shared_advanced::get_peak_heights_and_peak_node_indices(old_leaf_count); for (old_peak_index, old_peak_digest) in old_peak_indices.iter().zip(old_peaks.iter()) { known_digests.insert(*old_peak_index, old_peak_digest.to_owned()); } // 2.b collect all node hash digests that are derivable from `new_leaf` and // `old_peaks`. These are the digests of `new_leaf`'s path to the root. let mut acc_hash = new_leaf.to_owned(); for ((count, node_index), &old_peak_digest) in added_node_indices .iter() .enumerate() .zip(old_peaks.iter().rev()) { known_digests.insert(*node_index, acc_hash.to_owned()); // The last index in `added_node_indices` is the new peak // and the 2nd last will hash to the digest of the new peak, // so we can skip the last two values from this list if count == added_node_indices.len() - 2 { break; } // peaks are always left children, so we don't have to check for that acc_hash = Digest::::from_element(H::hash_pair(&old_peak_digest.data, &acc_hash.data)); } // Loop over all membership proofs and insert missing hashes for each let mut modified: Vec = vec![]; let new_peak_index: u64 = *added_node_indices.last().unwrap(); let new_node_count: u64 = shared_advanced::num_leafs_to_num_nodes(old_leaf_count + 1); for (i, (membership_proof, mp_leaf_index)) in membership_proofs .iter_mut() .zip(membership_proof_leaf_indices) .enumerate() { let (old_peak_index, old_peak_height) = membership_proof.get_peak_index_and_height(*mp_leaf_index); // Any peak is a left child, so we don't have to check if it's a right or left child. // This means we can use a faster method to find the parent index than the generic // method. let peak_parent_index = old_peak_index + (1 << (old_peak_height + 1)); if !added_node_indices.contains(&peak_parent_index) { continue; } modified.push(i); let node_indices_for_missing_digests: Vec = shared_advanced::get_authentication_path_node_indices( old_peak_index, new_peak_index, new_node_count, ) .unwrap(); // Sanity check debug_assert!( !node_indices_for_missing_digests.is_empty(), "authentication path must be missing digests at this point" ); for missing_digest_node_index in node_indices_for_missing_digests { membership_proof .authentication_path .push(known_digests[&missing_digest_node_index]); } } modified } /// Update a membership proof with a `leaf_mutation` data structure. In /// other words: Given a valid MMR membership proof for an MMR, calculate /// the updated MMR membership proof after one of the MMR's leafs have been /// changed. pub fn update_from_leaf_mutation( &mut self, own_mp_leaf_index: u64, leaf_mutation: &LeafMutation, ) -> bool { let affected_node_indices: HashSet = leaf_mutation.affected_node_indices().into_iter().collect(); let own_node_ap_indices = self.get_node_indices(own_mp_leaf_index); let own_node_indices_hash_set: HashSet = HashSet::from_iter(own_node_ap_indices.clone()); let mut intersection: Intersection = own_node_indices_hash_set.intersection(&affected_node_indices); // If intersection is empty no change is needed let Some(&intersection_index) = intersection.next() else { return false; }; // Sanity check, should always be true, since `intersection` can at most // contain *one* element. assert!(intersection.next().is_none()); // If intersection is **not** empty, we need to calculate all deducible node hashes from the // `leaf_mutation_membership_proof`, until we meet the intersecting node. let mut deducible_hashes: HashMap> = HashMap::new(); let mut node_index = shared_advanced::leaf_index_to_node_index(leaf_mutation.leaf_index); deducible_hashes.insert(node_index, leaf_mutation.new_leaf); let mut acc_hash: Digest = leaf_mutation.new_leaf; // Calculate hashes from the bottom towards the peak. Break when // the intersecting node is reached. for &hash in leaf_mutation.membership_proof.authentication_path.iter() { // It's not necessary to calculate all the way to the root since, // the intersection set has a size of at most one. // So we can break the loop when we find a `node_index` that // is equal to the intersection index. This way we same some // hash calculations here. if intersection_index == node_index { break; } let (acc_right_ancestor_count, acc_height) = shared_advanced::right_lineage_length_and_own_height(node_index); if acc_right_ancestor_count != 0 { acc_hash = Digest::::from_element(H::hash_pair(&hash.data, &acc_hash.data)); // parent of right child is +1 node_index += 1; } else { acc_hash = Digest::::from_element(H::hash_pair(&acc_hash.data, &hash.data)); // parent of left child: node_index += 1 << (acc_height + 1); }; deducible_hashes.insert(node_index, acc_hash); } // Some of the hashes in `self` need to be updated. We can loop over // `own_node_indices` and check if the element is contained `deducible_hashes`. // If it is, then the appropriate element in `self.authentication_path` needs to // be replaced with an element from `deducible_hashes`. for (digest, own_node_index) in self .authentication_path .iter_mut() .zip(own_node_ap_indices.into_iter()) { if !deducible_hashes.contains_key(&own_node_index) { continue; } *digest = deducible_hashes[&own_node_index]; } true } /// Update multiple membership proofs with a `leaf_mutation` proof. For the /// `leaf_mutation_membership_proof` parameter, it doesn't matter if you use the /// old or new membership proof associated with the leaf mutation, as they are /// the same before and after the leaf mutation. /// /// Returns the indices of the membership proofs that were modified where index refers /// to the order in which the membership proofs were given to this function. /// Panics if `membership_proofs` and `membership_proof_leaf_indices` do not have /// the same length. pub fn batch_update_from_leaf_mutation( membership_proofs: &mut [Self], membership_proof_leaf_indices: &[u64], leaf_mutation: LeafMutation, ) -> Vec { assert_eq!( membership_proofs.len(), membership_proof_leaf_indices.len(), "Lists must have same length. Got: {} and {}", membership_proofs.len(), membership_proof_leaf_indices.len() ); // 1. Calculate all hashes that are deducible from the leaf update // 2. Iterate through all membership proofs and update digests that // are deducible from the leaf update proof. // Calculate hashes from the bottom towards the peak. Break before we // calculate the hash of the peak, since peaks are never included in // authentication paths let mut deducible_hashes: HashMap> = HashMap::new(); let mut node_index = shared_advanced::leaf_index_to_node_index(leaf_mutation.leaf_index); deducible_hashes.insert(node_index, leaf_mutation.new_leaf); let mut acc_hash: Digest = leaf_mutation.new_leaf; for (count, &hash) in leaf_mutation .membership_proof .authentication_path .iter() .enumerate() { // Do not calculate the last hash as it will always be a peak which // are never included in the authentication path if count == leaf_mutation.membership_proof.authentication_path.len() - 1 { break; } let (right_ancestor_count, acc_height) = shared_advanced::right_lineage_length_and_own_height(node_index); if right_ancestor_count != 0 { // node is right child acc_hash = Digest::::from_element(H::hash_pair(&hash.data, &acc_hash.data)); // parent of right child is +1 node_index += 1; } else { // node is left child acc_hash = Digest::::from_element(H::hash_pair(&acc_hash.data, &hash.data)); // parent of left child: node_index += 1 << (acc_height + 1); }; deducible_hashes.insert(node_index, acc_hash); } let mut modified_membership_proofs: Vec = vec![]; for (i, (membership_proof, mp_leaf_index)) in membership_proofs .iter_mut() .zip(membership_proof_leaf_indices) .enumerate() { let ap_indices = membership_proof.get_node_indices(*mp_leaf_index); // Some of the hashes in `membership_proof` might need to be updated. We can loop over // `authentication_path_indices` and check if the element is contained // `deducible_hashes`. // If it is, then the appropriate element in `membership_proof.authentication_path` // needs to be replaced with an element from `deducible_hashes`. for (digest, authentication_path_indices) in membership_proof .authentication_path .iter_mut() .zip(ap_indices.into_iter()) { // Maximum 1 digest can be updated in each authentication path // so if that is encountered, we might as well break and go to // the next membership proof // Since this function returns the indices of the modified membership proofs, // a check if the new digest is actually different from the previous value is // needed. if deducible_hashes.contains_key(&authentication_path_indices) && *digest != deducible_hashes[&authentication_path_indices] { *digest = deducible_hashes[&authentication_path_indices]; modified_membership_proofs.push(i as u64); break; } } } modified_membership_proofs } /// batch_update_from_batch_leaf_mutation /// Update a batch of own membership proofs given a batch of /// authenticated leaf modifications. It is the caller's res- /// ponsibility to ensure that the authentication paths are /// valid; if not, the updated membership proofs will become /// invalid as well. /// @params /// - membership_proofs -- own membership proofs, to be updated /// - authentication_paths_and_leafs -- membership proofs of the mutated /// leafs, and the new leaf values /// /// Returns those indices into the slice of membership proofs that were updated. pub fn batch_update_from_batch_leaf_mutation( membership_proofs: &mut [&mut Self], membership_proof_leaf_indices: &[u64], mut leaf_mutations: Vec>, ) -> Vec { assert_eq!( membership_proofs.len(), membership_proof_leaf_indices.len(), "Lists must have same length. Got: {} and {}", membership_proofs.len(), membership_proof_leaf_indices.len() ); // Calculate all derivable paths let mut new_ap_digests: HashMap> = HashMap::new(); // Calculate the derivable digests from a number of leaf mutations and their // associated authentication paths. Notice that all authentication paths // are only valid *prior* to any updates. They get invalidated (unless updated) // throughout the updating as their neighbor leaf digests change values. // The hash map `new_ap_digests` takes care of that. while let Some(LeafMutation { leaf_index, new_leaf, membership_proof, }) = leaf_mutations.pop() { let mut node_index = shared_advanced::leaf_index_to_node_index(leaf_index); let former_value = new_ap_digests.insert(node_index, new_leaf); assert!( former_value.is_none(), "Duplicated leafs are not allowed in membership proof updater" ); let mut acc_hash: Digest = new_leaf.to_owned(); for (i, &hash) in membership_proof.authentication_path.iter().enumerate() { // Do not calculate the last hash as it will always be a peak which // are never included in the authentication path if i == membership_proof.authentication_path.len() - 1 { break; } // If sibling node is something that has already been calculated, we use that // hash digest. Otherwise, we use the one in our authentication path. let (right_ancestor_count, height) = shared_advanced::right_lineage_length_and_own_height(node_index); if right_ancestor_count != 0 { let left_sibling_index = shared_advanced::left_sibling(node_index, height); let sibling_hash: Digest = new_ap_digests .get(&left_sibling_index) .copied() .unwrap_or(hash); acc_hash = Digest::::from_element(H::hash_pair(&sibling_hash.data, &acc_hash.data)); // Find parent node index node_index += 1; } else { let right_sibling_index = shared_advanced::right_sibling(node_index, height); let sibling_hash: Digest = new_ap_digests .get(&right_sibling_index) .copied() .unwrap_or(hash); acc_hash = Digest::::from_element(H::hash_pair(&acc_hash.data, &sibling_hash.data)); // Find parent node index node_index += 1 << (height + 1); } new_ap_digests.insert(node_index, acc_hash); } } let mut modified_membership_proof_indices: Vec = vec![]; for (i, (membership_proof, mp_leaf_index)) in membership_proofs .iter_mut() .zip(membership_proof_leaf_indices) .enumerate() { let ap_indices = membership_proof.get_node_indices(*mp_leaf_index); // Some of the hashes in `membership_proof` might need to be updated. We can // loop over `authentication_path_indices` and check if the element is contained // `deducible_hashes`. If it is, then the appropriate element in // `membership_proof.authentication_path` needs to be replaced with an element // from `deducible_hashes`. for (digest, authentication_path_indices) in membership_proof .authentication_path .iter_mut() .zip(ap_indices.into_iter()) { // Any number of hashes can be updated in the authentication path, since // we're modifying multiple leafs in the MMR // Since this function returns the indices of the modified membership proofs, // a check if the new digest is actually different from the previous value is // needed. if new_ap_digests.contains_key(&authentication_path_indices) && *digest != new_ap_digests[&authentication_path_indices] { modified_membership_proof_indices.push(i); *digest = new_ap_digests[&authentication_path_indices]; } } } modified_membership_proof_indices.dedup(); modified_membership_proof_indices } } // #[cfg(test)] // mod mmr_membership_proof_test { // use itertools::Itertools; // use proptest_arbitrary_interop::arb; // use rand::random; // use rand::Rng; // use test_strategy::proptest; // use super::*; // use crate::math::b_field_element::BFieldElement; // use crate::math::digest::Digest; // use crate::math::other::random_elements; // use crate::math::tip5::Tip5; // use crate::mock::mmr::get_mock_ammr_from_digests; // use crate::mock::mmr::MockMmr; // use crate::util_types::mmr::mmr_accumulator::util::mmra_with_mps; // use crate::util_types::mmr::mmr_accumulator::MmrAccumulator; // use crate::util_types::mmr::mmr_trait::Mmr; // #[test] // fn equality_and_hash_test() { // type H = Tip5; // let mut rng = rand::rng(); // let some_digest: Digest = rng.random(); // let other_digest: Digest = rng.random(); // // Assert that both membership proofs and their digests are equal // let mp0 = MmrMembershipProof::new(vec![]); // let mp1 = MmrMembershipProof::new(vec![]); // assert_eq!(mp0, mp1); // assert_eq!(H::hash(&mp0), H::hash(&mp1)); // let mp2 = MmrMembershipProof::new(vec![some_digest]); // let mp3 = MmrMembershipProof::new(vec![some_digest]); // assert_eq!(mp2, mp3); // assert_eq!(H::hash(&mp2), H::hash(&mp3)); // assert_ne!(mp0, mp2); // assert_ne!(H::hash(&mp0), H::hash(&mp2)); // let mp4 = MmrMembershipProof::new(vec![other_digest]); // assert_ne!(mp2, mp4); // assert_ne!(H::hash(&mp2), H::hash(&mp4)); // let mp5 = MmrMembershipProof::new(vec![some_digest, other_digest]); // let mp6 = MmrMembershipProof::new(vec![other_digest, some_digest]); // assert_eq!(mp5, mp5); // assert_eq!(H::hash(&mp5), H::hash(&mp5)); // assert_ne!(mp5, mp6); // assert_ne!(H::hash(&mp5), H::hash(&mp6)); // assert_ne!(mp0, mp5); // assert_ne!(H::hash(&mp0), H::hash(&mp5)); // assert_ne!(mp2, mp5); // assert_ne!(H::hash(&mp2), H::hash(&mp5)); // assert_ne!(mp4, mp5); // assert_ne!(H::hash(&mp4), H::hash(&mp5)); // } // #[test] // fn get_node_indices_simple_test() { // const LEAF_INDEX: u64 = 4; // let leaf_hashes: Vec = random_elements(8); // let archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes); // let membership_proof = archival_mmr.prove_membership(LEAF_INDEX); // assert_eq!( // vec![9, 13, 7], // membership_proof.get_node_indices(LEAF_INDEX) // ); // assert_eq!( // vec![8, 10, 14, 15], // membership_proof.get_direct_path_indices(LEAF_INDEX) // ); // } // #[test] // fn get_peak_index_simple_test() { // type H = Tip5; // let mut mmr_size = 7; // let leaf_digests: Vec = random_elements(mmr_size); // let mut archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_digests); // let mut expected_peak_indices_and_heights: Vec<(u64, u32)> = // vec![(7, 2), (7, 2), (7, 2), (7, 2), (10, 1), (10, 1), (11, 0)]; // for (leaf_index, expected_peak_index) in // (0..mmr_size as u64).zip(expected_peak_indices_and_heights.into_iter()) // { // let membership_proof = archival_mmr.prove_membership(leaf_index); // assert_eq!( // expected_peak_index, // membership_proof.get_peak_index_and_height(leaf_index) // ); // } // // Increase size to 8 and verify that the peaks are now different // mmr_size = 8; // let leaf_hash: Digest = H::hash(&1337u64); // archival_mmr.append(leaf_hash); // expected_peak_indices_and_heights = vec![(15, 3); mmr_size]; // for (leaf_index, expected_peak_index) in // (0..mmr_size as u64).zip(expected_peak_indices_and_heights.into_iter()) // { // let membership_proof = archival_mmr.prove_membership(leaf_index); // assert_eq!( // expected_peak_index, // membership_proof.get_peak_index_and_height(leaf_index) // ); // } // // Increase size to 9 and verify that the peaks are now different // mmr_size = 9; // let another_leaf_hash: Digest = H::hash(&13337u64); // archival_mmr.append(another_leaf_hash); // expected_peak_indices_and_heights = vec![ // (15, 3), // (15, 3), // (15, 3), // (15, 3), // (15, 3), // (15, 3), // (15, 3), // (15, 3), // (16, 0), // ]; // for (leaf_index, expected_peak_index) in // (0..mmr_size as u64).zip(expected_peak_indices_and_heights.into_iter()) // { // let membership_proof = archival_mmr.prove_membership(leaf_index); // assert_eq!( // expected_peak_index, // membership_proof.get_peak_index_and_height(leaf_index) // ); // } // } // #[proptest(cases = 10)] // fn mmr_verification_if_leaf_index_is_out_of_bounds( // #[strategy(0..=121usize)] leaf_count: usize, // ) { // let leafs: Vec = random_elements(leaf_count); // let archival_mmr: MockMmr = get_mock_ammr_from_digests(leafs.clone()); // let peaks = archival_mmr.peaks(); // for (i, leaf) in leafs.into_iter().enumerate() { // let leaf_index = i as u64; // let mp = archival_mmr.prove_membership(leaf_index); // assert!(mp.verify(leaf_index, leaf, &peaks, leaf_count as u64)); // let bad_leaf_index = leaf_index + leaf_count as u64; // assert!(!mp.verify(bad_leaf_index, leaf, &peaks, leaf_count as u64)); // } // } // #[test] // fn mmr_verify_does_not_crash_on_too_short_peaks_list_unit() { // let mmr_mp = MmrMembershipProof::new(vec![Default::default()]); // assert!(!mmr_mp.verify(0, Default::default(), &[], 2)); // } // #[proptest(cases = 10)] // fn mmr_verification_with_wrong_length_of_peak_list( // #[strategy(0..=1_000_000u64)] leaf_count: u64, // #[strategy(0..=#leaf_count)] leaf_index: u64, // #[strategy(arb())] leaf: Digest, // ) { // let (mmra, mps) = mmra_with_mps(leaf_count, vec![(leaf_index, leaf)]); // let mp = mps[0].clone(); // let peaks_list = mmra.peaks(); // assert!(mp.verify(leaf_index, leaf, &peaks_list, leaf_count)); // let one_too_few = if peaks_list.is_empty() { // return Ok(()); // } else { // &peaks_list[..peaks_list.len() - 1] // }; // assert!(!mp.verify(leaf_index, leaf, one_too_few, leaf_count)); // let one_too_many = [peaks_list.clone(), vec![Digest::default()]].concat(); // assert!(!mp.verify(leaf_index, leaf, &one_too_many, leaf_count)); // } // #[test] // fn update_batch_membership_proofs_from_leaf_mutations_new_test() { // type H = Tip5; // let total_leaf_count = 8; // let leaf_hashes: Vec = random_elements(total_leaf_count); // let mut archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes.clone()); // let mut membership_proofs: Vec = vec![]; // for i in 0..total_leaf_count { // let leaf_index = i as u64; // membership_proofs.push(archival_mmr.prove_membership(leaf_index)); // } // let new_leaf2: Digest = H::hash(&133337u64); // let new_leaf3: Digest = H::hash(&12345678u64); // let mutation_membership_proof_old2 = archival_mmr.prove_membership(2); // let mutation_membership_proof_old3 = archival_mmr.prove_membership(3); // archival_mmr.mutate_leaf_raw(2, new_leaf2); // archival_mmr.mutate_leaf_raw(3, new_leaf3); // for (mp_leaf_index, mp) in membership_proofs.iter_mut().enumerate() { // let leaf_mutation = // LeafMutation::new(2, new_leaf2, mutation_membership_proof_old2.clone()); // mp.update_from_leaf_mutation(mp_leaf_index as u64, &leaf_mutation); // } // for (mp_leaf_index, mp) in membership_proofs.iter_mut().enumerate() { // let leaf_mutation = // LeafMutation::new(3, new_leaf3, mutation_membership_proof_old3.clone()); // mp.update_from_leaf_mutation(mp_leaf_index as u64, &leaf_mutation); // } // let mut updated_leaf_hashes = leaf_hashes; // updated_leaf_hashes[2] = new_leaf2; // updated_leaf_hashes[3] = new_leaf3; // for (mp_leaf_index, (mp, &leaf_hash)) in membership_proofs // .iter() // .zip(&updated_leaf_hashes) // .enumerate() // { // mp.verify( // mp_leaf_index as u64, // leaf_hash, // &archival_mmr.peaks(), // archival_mmr.num_leafs(), // ); // } // } // #[test] // fn batch_update_from_batch_leaf_mutation_total_replacement_test() { // let total_leaf_count = 268; // let leaf_hashes_init: Vec = random_elements(total_leaf_count); // let archival_mmr_init: MockMmr = get_mock_ammr_from_digests(leaf_hashes_init); // let leaf_hashes_final: Vec = random_elements(total_leaf_count); // let archival_mmr_final: MockMmr = get_mock_ammr_from_digests(leaf_hashes_final.clone()); // let mp_leaf_indices = 0..total_leaf_count as u64; // let mut membership_proofs: Vec = mp_leaf_indices // .clone() // .map(|leaf_index| archival_mmr_init.prove_membership(leaf_index)) // .collect(); // let membership_proofs_clone = membership_proofs.clone(); // let leaf_mutations: Vec = leaf_hashes_final // .clone() // .into_iter() // .zip(mp_leaf_indices.clone()) // .zip(membership_proofs_clone) // .map(|((leaf, leaf_index), mp)| LeafMutation::new(leaf_index, leaf, mp)) // .collect(); // let changed_values = MmrMembershipProof::batch_update_from_batch_leaf_mutation( // &mut membership_proofs.iter_mut().collect::>(), // &mp_leaf_indices.clone().collect_vec(), // leaf_mutations, // ); // // This assert only works if `total_leaf_count` is an even number since there // // otherwise is a membership proof that's an empty authentication path, and that // // does not change // assert_eq!( // (0..total_leaf_count).collect::>(), // changed_values, // "All membership proofs must be indicated as changed" // ); // for ((mp, final_leaf_hash), leaf_index) in membership_proofs // .into_iter() // .zip(leaf_hashes_final) // .zip(mp_leaf_indices) // { // assert!(mp.verify( // leaf_index, // final_leaf_hash, // &archival_mmr_final.peaks(), // total_leaf_count as u64 // )); // } // } // #[test] // fn batch_update_from_batch_leaf_mutation_test() { // let total_leaf_count = 34; // let mut leaf_hashes: Vec = random_elements(total_leaf_count); // let mut archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes.clone()); // let mut rng = rand::rng(); // for modified_leaf_count in 0..=total_leaf_count { // // Pick a set of membership proofs that we want to batch-update // let own_membership_proof_count = rng.random_range(0..total_leaf_count); // let mut all_leaf_indices: Vec = (0..total_leaf_count as u64).collect(); // let mut own_mp_leaf_indices = vec![]; // let mut own_membership_proofs: Vec = vec![]; // for _ in 0..own_membership_proof_count { // let leaf_index = // all_leaf_indices.remove(rng.random_range(0..all_leaf_indices.len())); // own_membership_proofs.push(archival_mmr.prove_membership(leaf_index)); // own_mp_leaf_indices.push(leaf_index); // } // // Set the new leafs and their associated authentication paths for the mutation // // argument // let new_leafs: Vec = random_elements(modified_leaf_count); // let mut all_leaf_indices_new: Vec = (0..total_leaf_count as u64).collect(); // let mut authentication_paths: Vec = vec![]; // let mut mutated_leaf_leaf_indices = vec![]; // for _ in 0..modified_leaf_count { // let leaf_index = // all_leaf_indices_new.remove(rng.random_range(0..all_leaf_indices_new.len())); // authentication_paths.push(archival_mmr.prove_membership(leaf_index)); // mutated_leaf_leaf_indices.push(leaf_index); // } // // let the magic start // let original_mps = own_membership_proofs.clone(); // let mutation_argument: Vec = authentication_paths // .into_iter() // .zip(new_leafs.clone().into_iter()) // .zip(mutated_leaf_leaf_indices.iter()) // .map(|((mp, leaf), leaf_idx)| LeafMutation::new(*leaf_idx, leaf, mp)) // .collect(); // let updated_mp_indices_0 = MmrMembershipProof::batch_update_from_batch_leaf_mutation( // &mut own_membership_proofs.iter_mut().collect::>(), // &own_mp_leaf_indices, // mutation_argument.clone(), // ); // // update MMR // for (i, mutated_leaf_index) in mutated_leaf_leaf_indices.iter().enumerate() { // leaf_hashes[*mutated_leaf_index as usize] = new_leafs[i]; // archival_mmr.mutate_leaf_raw(*mutated_leaf_index, new_leafs[i]); // } // // Let's verify that `batch_mutate_leaf_and_update_mps` from the // // MmrAccumulator agrees // let mut mmra: MmrAccumulator = (&archival_mmr).into(); // let mut mps_copy = original_mps; // let updated_mp_indices_1 = mmra.batch_mutate_leaf_and_update_mps( // &mut mps_copy.iter_mut().collect::>(), // &own_mp_leaf_indices, // mutation_argument, // ); // assert_eq!(own_membership_proofs, mps_copy); // assert_eq!(mmra.peaks(), archival_mmr.peaks()); // assert_eq!(updated_mp_indices_0, updated_mp_indices_1); // // test that all updated membership proofs are valid under the updated MMR // (0..own_membership_proof_count) // .zip(own_mp_leaf_indices) // .for_each(|(i, own_leaf_index)| { // let membership_proof = own_membership_proofs[i].clone(); // assert!(membership_proof.verify( // own_leaf_index, // leaf_hashes[own_leaf_index as usize], // &archival_mmr.peaks(), // archival_mmr.num_leafs(), // )); // }); // } // } // #[test] // fn batch_update_from_leaf_mutation_no_change_return_value_test() { // // This test verifies that the return value indicating changed membership proofs is empty // // even though the mutations affect the membership proofs. The reason it is empty is that // // the resulting membership proof digests are unchanged, since the leaf hashes mutations // // are the identity operators. In other words: the leafs don't change. // let total_leaf_count = 8; // let (leaf_hashes, mut membership_proofs) = make_populated_archival_mmr(total_leaf_count); // let own_leaf_indices = (0..total_leaf_count as u64).collect_vec(); // for leaf_index in own_leaf_indices.iter() { // let leaf_mutation_membership_proof = membership_proofs[*leaf_index as usize].clone(); // let new_leaf = leaf_hashes[*leaf_index as usize]; // let leaf_mutation = // LeafMutation::new(*leaf_index, new_leaf, leaf_mutation_membership_proof); // let ret = MmrMembershipProof::batch_update_from_leaf_mutation( // &mut membership_proofs, // &own_leaf_indices, // leaf_mutation, // ); // // the return value must be empty since no membership proof has changed // assert!(ret.is_empty()); // } // let membership_proofs_clone = membership_proofs.clone(); // let membership_proofs_init_and_new_leafs: Vec = leaf_hashes // .clone() // .into_iter() // .zip(membership_proofs_clone) // .zip(own_leaf_indices.iter()) // .map(|((leaf, mp), leaf_idx)| LeafMutation::new(*leaf_idx, leaf, mp)) // .collect(); // let ret = MmrMembershipProof::batch_update_from_batch_leaf_mutation( // &mut membership_proofs.iter_mut().collect::>(), // &own_leaf_indices, // membership_proofs_init_and_new_leafs.clone(), // ); // // the return value must be empty since no membership proof has changed // assert!(ret.is_empty()); // // Let's test the exact same for the MMR accumulator scheme // let mut mmra: MmrAccumulator = MmrAccumulator::new_from_leafs(leaf_hashes); // let ret_from_acc = mmra.batch_mutate_leaf_and_update_mps( // &mut membership_proofs.iter_mut().collect::>(), // &own_leaf_indices, // membership_proofs_init_and_new_leafs, // ); // assert!(ret_from_acc.is_empty()); // } // fn make_populated_archival_mmr( // total_leaf_count: usize, // ) -> (Vec, Vec) { // let leaf_hashes: Vec = random_elements(total_leaf_count); // let archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes.clone()); // let mut membership_proofs: Vec = vec![]; // for i in 0..total_leaf_count { // let leaf_index = i as u64; // membership_proofs.push(archival_mmr.prove_membership(leaf_index)); // } // (leaf_hashes, membership_proofs) // } // #[test] // fn update_batch_membership_proofs_from_batch_leaf_mutations_test() { // let total_leaf_count = 8; // let leaf_hashes: Vec = random_elements(total_leaf_count); // let mut archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes); // let modified_leaf_count: usize = 8; // let mut membership_proofs: Vec = vec![]; // let mut own_mp_leaf_indices = vec![]; // for i in 0..modified_leaf_count { // let leaf_index = i as u64; // membership_proofs.push(archival_mmr.prove_membership(leaf_index)); // own_mp_leaf_indices.push(leaf_index); // } // let new_leafs: Vec = random_elements(modified_leaf_count); // for i in 0..modified_leaf_count { // let leaf_mutation_membership_proof = membership_proofs[i].clone(); // let new_leaf = new_leafs[i]; // let leaf_mutation = // LeafMutation::new(i as u64, new_leaf, leaf_mutation_membership_proof); // MmrMembershipProof::batch_update_from_leaf_mutation( // &mut membership_proofs, // &own_mp_leaf_indices, // leaf_mutation, // ); // } // (0..modified_leaf_count).for_each(|i| { // let leaf_index = i as u64; // archival_mmr.mutate_leaf_raw(leaf_index, new_leafs[i]); // }); // for (i, (mp, mp_leaf_idx)) in membership_proofs // .into_iter() // .zip_eq(own_mp_leaf_indices) // .enumerate() // { // assert!(mp.verify( // mp_leaf_idx, // new_leafs[i], // &archival_mmr.peaks(), // archival_mmr.num_leafs() // )); // } // } // #[test] // fn update_membership_proof_from_leaf_mutation_test() { // type H = Tip5; // let leaf_hashes: Vec = random_elements(8); // let new_leaf: Digest = H::hash(&133337u64); // let mut accumulator_mmr = MmrAccumulator::new_from_leafs(leaf_hashes.clone()); // assert_eq!(8, accumulator_mmr.num_leafs()); // let mut an_archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes.clone()); // let original_archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes.clone()); // let own_leaf_leaf_index = 4; // let mut membership_proof = an_archival_mmr.prove_membership(own_leaf_leaf_index); // // 1. Update a leaf in both the accumulator MMR and in the archival MMR // let old_peaks = an_archival_mmr.peaks(); // let mutated_leaf_leaf_index = 2; // let membership_proof_for_manipulated_leaf = // an_archival_mmr.prove_membership(mutated_leaf_leaf_index); // an_archival_mmr.mutate_leaf_raw(mutated_leaf_leaf_index, new_leaf); // let leaf_mutation = LeafMutation::new( // mutated_leaf_leaf_index, // new_leaf, // membership_proof_for_manipulated_leaf, // ); // accumulator_mmr.mutate_leaf(leaf_mutation.clone()); // assert_eq!(an_archival_mmr.peaks(), accumulator_mmr.peaks()); // let new_peaks_1 = an_archival_mmr.peaks(); // assert_ne!( // new_peaks_1, old_peaks, // "Peaks must change when leaf is mutated" // ); // let real_membership_proof_from_archival = // an_archival_mmr.prove_membership(own_leaf_leaf_index); // let archival_peaks = an_archival_mmr.peaks(); // assert_eq!( // new_peaks_1, archival_peaks, // "peaks returned from `get_peaks` must match that returned with membership proof" // ); // // 2. Verify that the proof fails but that the one from archival works // assert!(!membership_proof.verify( // own_leaf_leaf_index, // new_leaf, // &new_peaks_1, // accumulator_mmr.num_leafs() // )); // assert!(membership_proof.verify( // own_leaf_leaf_index, // leaf_hashes[own_leaf_leaf_index as usize], // &old_peaks, // accumulator_mmr.num_leafs() // )); // assert!(real_membership_proof_from_archival.verify( // own_leaf_leaf_index, // leaf_hashes[own_leaf_leaf_index as usize], // &new_peaks_1, // accumulator_mmr.num_leafs() // )); // // 3. Update the membership proof with the membership method // membership_proof.update_from_leaf_mutation(own_leaf_leaf_index, &leaf_mutation); // // 4. Verify that the proof now succeeds // assert!(membership_proof.verify( // own_leaf_leaf_index, // leaf_hashes[own_leaf_leaf_index as usize], // &new_peaks_1, // accumulator_mmr.num_leafs() // )); // // 5. test batch update from leaf update // let all_leaf_indices = (0..8u64).collect_vec(); // for leaf_index_mutated in all_leaf_indices.iter() { // let mut archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes.clone()); // let mut mps: Vec = vec![]; // for j in all_leaf_indices.iter() { // mps.push(original_archival_mmr.prove_membership(*j)); // } // let original_mps = mps.clone(); // let leaf_mutation_membership_proof = archival_mmr.prove_membership(*leaf_index_mutated); // archival_mmr.mutate_leaf_raw(*leaf_index_mutated, new_leaf); // let new_peaks_2 = archival_mmr.peaks(); // let new_leaf_mutation = LeafMutation::new( // *leaf_index_mutated, // new_leaf, // leaf_mutation_membership_proof, // ); // let modified = MmrMembershipProof::batch_update_from_leaf_mutation( // &mut mps, // &all_leaf_indices, // new_leaf_mutation, // ); // // when updating data index i, all authentication paths are updated // // *except* for element i. // let mut expected_modified = all_leaf_indices.clone(); // expected_modified.remove(*leaf_index_mutated as usize); // assert_eq!(expected_modified, modified); // for j in all_leaf_indices.iter() { // let our_leaf = if *leaf_index_mutated == *j { // new_leaf // } else { // leaf_hashes[*j as usize] // }; // assert!(mps[*j as usize].verify(*j, our_leaf, &new_peaks_2, 8)); // // Verify that original membership proofs are no longer valid // // For size = 8, all membership proofs except the one for element 0 // // will be updated since this MMR only contains a single peak. // // An updated leaf (0 in this case) retains its authentication path after // // the update. But all other leafs pointing to the same MMR will have updated // // authentication paths. // if j == leaf_index_mutated { // assert!( // original_mps[*j as usize].verify(*j, our_leaf, &new_peaks_2, 8), // "original membership proof must be valid when j = i" // ); // } else { // assert!( // !original_mps[*j as usize].verify(*j, our_leaf, &new_peaks_2, 8), // "original membership proof must be invalid when j != i" // ); // } // } // } // } // #[test] // fn update_membership_proof_from_leaf_mutation_big_test() { // // Build MMR from leaf count 0 to 22, and loop through *each* // // leaf index for MMR, modifying its membership proof with a // // leaf update. // for leaf_count in 0..=22 { // let leaf_hashes: Vec = random_elements(leaf_count); // let new_leaf: Digest = random(); // let archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes.clone()); // // Loop over all leaf indices that we want to modify in the MMR // for i in 0..leaf_count { // let leaf_index_i = i as u64; // let leaf_mutation_membership_proof = archival_mmr.prove_membership(leaf_index_i); // let mut modified_archival_mmr: MockMmr = // get_mock_ammr_from_digests(leaf_hashes.clone()); // modified_archival_mmr.mutate_leaf_raw(leaf_index_i, new_leaf); // let new_peaks = modified_archival_mmr.peaks(); // // Loop over all leaf indices want a membership proof of, for modification // for j in 0..leaf_count { // let leaf_index_j = j as u64; // let mut membership_proof: MmrMembershipProof = // archival_mmr.prove_membership(leaf_index_j); // let original_membership_roof = membership_proof.clone(); // let leaf_mutation = LeafMutation::new( // leaf_index_i, // new_leaf, // leaf_mutation_membership_proof.clone(), // ); // let membership_proof_was_mutated = // membership_proof.update_from_leaf_mutation(leaf_index_j, &leaf_mutation); // let our_leaf = if leaf_index_i == leaf_index_j { // new_leaf // } else { // leaf_hashes[leaf_index_j as usize] // }; // assert!(membership_proof.verify( // leaf_index_j, // our_leaf, // &new_peaks, // leaf_count as u64 // )); // // If membership proof was mutated, the original proof must fail // if membership_proof_was_mutated { // assert!(!original_membership_roof.verify( // leaf_index_j, // our_leaf, // &new_peaks, // leaf_count as u64 // )); // } // // Verify that modified membership proof matches that which can be // // fetched from the modified archival MMR // assert_eq!( // modified_archival_mmr.prove_membership(leaf_index_j), // membership_proof // ); // } // } // } // } // #[test] // fn update_membership_proof_from_append_simple_with_bit_mmra() { // let original_leaf_count = (1 << 35) + (1 << 7) - 1; // let specified_count = 40; // let mut rng = rand::rng(); // let mut specified_indices: HashSet = HashSet::default(); // for _ in 0..specified_count { // specified_indices.insert(rng.random_range(0..original_leaf_count)); // } // // Ensure that at least *one* MP will be mutated upon insertion of a new leaf // specified_indices.insert(original_leaf_count - 1); // let collected_values = specified_indices.len(); // let specified_leafs: Vec<(u64, Digest)> = specified_indices // .clone() // .into_iter() // .zip_eq(random_elements(collected_values)) // .collect_vec(); // let (mut mmra, mut mps) = mmra_with_mps(original_leaf_count, specified_leafs.clone()); // let new_leaf: Digest = random(); // let old_peaks = mmra.peaks(); // mmra.append(new_leaf); // assert!(!mps // .iter() // .zip_eq(specified_leafs.iter()) // .all(|(mp, (leaf_index, leaf))| mp.verify( // *leaf_index, // *leaf, // &mmra.peaks(), // mmra.num_leafs() // ))); // MmrMembershipProof::batch_update_from_append( // &mut mps.iter_mut().collect_vec(), // &specified_indices.into_iter().collect_vec(), // original_leaf_count, // new_leaf, // &old_peaks, // ); // assert!(mps // .iter() // .zip_eq(specified_leafs.iter()) // .all(|(mp, (leaf_index, leaf))| mp.verify( // *leaf_index, // *leaf, // &mmra.peaks(), // mmra.num_leafs() // ))); // } // #[test] // fn update_membership_proof_from_append_simple() { // type H = Tip5; // let leaf_count = 7; // let leaf_hashes: Vec = random_elements(leaf_count); // let new_leaf: Digest = H::hash(&133337u64); // let archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes.clone()); // for i in 0..leaf_count { // let leaf_index = i as u64; // let mut membership_proof = archival_mmr.prove_membership(leaf_index); // let old_peaks = archival_mmr.peaks(); // let mut appended_archival_mmr: MockMmr = // get_mock_ammr_from_digests(leaf_hashes.clone()); // // let mut appended_archival_mmr = archival_mmr.clone(); // appended_archival_mmr.append(new_leaf); // let new_peaks = appended_archival_mmr.peaks(); // // Verify that membership proof fails before update and succeeds after // // for the case of leaf_count 7, **all** membership proofs have to be // // updated to be valid, so they should all fail prior to the update. // let last_leaf_index = leaf_count as u64; // assert!(!membership_proof.verify( // leaf_index, // leaf_hashes[leaf_index as usize], // &new_peaks, // last_leaf_index + 1 // )); // membership_proof.update_from_append(leaf_index, last_leaf_index, new_leaf, &old_peaks); // assert!(membership_proof.verify( // leaf_index, // leaf_hashes[leaf_index as usize], // &new_peaks, // last_leaf_index + 1 // )); // // Verify that the appended Arhival MMR produces the same membership proof // // as the one we got by updating the old membership proof // assert_eq!( // appended_archival_mmr.prove_membership(leaf_index), // membership_proof // ); // } // } // #[test] // fn update_membership_proof_from_append_big_tests() { // for leaf_count in 0..68u64 { // // 1. Build a MockMmr with a variable amount of leafs // let leaf_digests: Vec = random_elements(leaf_count as usize); // let new_leaf_digest: Digest = random(); // let archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_digests.clone()); // // For every valid data index // for leaf_index in 0..leaf_count { // // 2. Create an equivalent MockMmr, but with `new_leaf_digest` appended // let mut appended_archival_mmr: MockMmr = // get_mock_ammr_from_digests(leaf_digests.clone()); // appended_archival_mmr.append(new_leaf_digest); // let new_peaks = appended_archival_mmr.peaks(); // // 3. Create membership proof for MockMmr from before `new_leaf_digest` // let original_membership_proof = archival_mmr.prove_membership(leaf_index); // // 4. Update (a copy of) membership proof and verify it // let mut updated_membership_proof = original_membership_proof.clone(); // let is_updated_membership_proof_changed = updated_membership_proof // .update_from_append( // leaf_index, // leaf_count, // new_leaf_digest, // &archival_mmr.peaks(), // ); // let updated_membership_proof_verifies = updated_membership_proof.verify( // leaf_index, // leaf_digests[leaf_index as usize], // &new_peaks, // leaf_count + 1, // ); // assert!(updated_membership_proof_verifies); // // 5. Assert that original membership proof fails iff a change was indicated // let original_membership_proof_verifies = original_membership_proof.verify( // leaf_index, // leaf_digests[leaf_index as usize], // &new_peaks, // leaf_count + 1, // ); // if is_updated_membership_proof_changed { // assert!(!original_membership_proof_verifies,); // } else { // assert!(original_membership_proof_verifies,); // } // // 6. Assert that updating an old membership proof is equivalent to getting a // // proof for an appended MockMmr // assert_eq!( // updated_membership_proof, // appended_archival_mmr.prove_membership(leaf_index) // ); // } // // 7. Test batch update of membership proofs... // let old_peaks = archival_mmr.peaks(); // let mp_leaf_indices = (0..leaf_count).collect_vec(); // let original_membership_proofs = mp_leaf_indices // .iter() // .map(|leaf_index| archival_mmr.prove_membership(*leaf_index)) // .collect_vec(); // // ...first by asserting that all leafs are members... // for (membership_proof, leaf_index) in original_membership_proofs // .iter() // .zip(mp_leaf_indices.iter()) // { // let membership_proof_verifies_before_batch_update = membership_proof.verify( // *leaf_index, // leaf_digests[*leaf_index as usize], // &old_peaks, // leaf_count, // ); // assert!(membership_proof_verifies_before_batch_update); // } // // ...and then create an equivalent MockMmr, but with `new_leaf_digest` appended... // let mut appended_archival_mmr: MockMmr = // get_mock_ammr_from_digests(leaf_digests.clone()); // appended_archival_mmr.append(new_leaf_digest); // let new_peaks = appended_archival_mmr.peaks(); // let mut mutated_membership_proofs = original_membership_proofs.clone(); // // ...run batch_update_from_append()... // let indices_of_mutated_membership_proofs: Vec = // MmrMembershipProof::batch_update_from_append( // &mut mutated_membership_proofs.iter_mut().collect_vec(), // &mp_leaf_indices, // leaf_count, // new_leaf_digest, // &old_peaks, // ); // // ...and assert that mutated membership proofs with new peaks verify! // for (leaf_index, mutated_membership_proof) in // mutated_membership_proofs.iter().enumerate() // { // let mutated_membership_proof_verifies_with_new_peaks = mutated_membership_proof // .verify( // leaf_index as u64, // leaf_digests[leaf_index], // &new_peaks, // leaf_count + 1, // ); // assert!(mutated_membership_proof_verifies_with_new_peaks); // } // // Finally, assert that original membership proofs only work if they're not mutated. // for (leaf_index, original_membership_proof) in // original_membership_proofs.iter().enumerate() // { // let original_membership_proof_verifies = original_membership_proof.verify( // leaf_index as u64, // leaf_digests[leaf_index], // &new_peaks, // leaf_count + 1, // ); // if indices_of_mutated_membership_proofs.contains(&leaf_index) { // assert!(!original_membership_proof_verifies) // } else { // assert!(original_membership_proof_verifies); // } // } // } // } // #[test] // fn update_membership_proof_from_append_big_tip5() { // type H = Tip5; // // Build MMR from leaf count 0 to 9, and loop through *each* // // leaf index for MMR, modifying its membership proof with an // // append update. // for leaf_count in 0..9 { // let leaf_hashes: Vec = random_elements(leaf_count); // let archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes.clone()); // let new_leaf = H::hash(&BFieldElement::new(13333337)); // for i in 0..leaf_count { // let leaf_index = i as u64; // let leaf_count_index = leaf_count as u64; // let original_membership_proof = archival_mmr.prove_membership(leaf_index); // let mut appended_archival_mmr: MockMmr = // get_mock_ammr_from_digests(leaf_hashes.clone()); // appended_archival_mmr.append(new_leaf); // let new_peaks = appended_archival_mmr.peaks(); // // Update membership proof and verify that it succeeds // let mut membership_proof_mutated = original_membership_proof.clone(); // let mutated = membership_proof_mutated.update_from_append( // leaf_index, // leaf_count_index, // new_leaf, // &archival_mmr.peaks(), // ); // assert!(membership_proof_mutated.verify( // leaf_index, // leaf_hashes[i], // &new_peaks, // leaf_count_index + 1 // )); // // If membership proof mutated, then the old proof must be invalid // if mutated { // assert!(!original_membership_proof.verify( // leaf_index, // leaf_hashes[i], // &new_peaks, // leaf_count_index + 1 // )); // } // // Verify that the appended Arhival MMR produces the same membership proof // // as the one we got by updating the old membership proof // assert_eq!( // appended_archival_mmr.prove_membership(leaf_index), // membership_proof_mutated // ); // } // } // } // #[test] // fn serialization_test() { // // You could argue that this test doesn't belong here, as it tests the behavior of // // an imported library. I included it here, though, because the setup seems a bit clumsy // // to me so far. // let leaf_index = 1; // let leaf_count = 3; // let leaf_hashes: Vec = random_elements(leaf_count); // let archival_mmr: MockMmr = get_mock_ammr_from_digests(leaf_hashes.clone()); // let mp: MmrMembershipProof = archival_mmr.prove_membership(1); // let json = serde_json::to_string(&mp).unwrap(); // let s_back = serde_json::from_str::(&json).unwrap(); // assert!(s_back.verify( // leaf_index, // leaf_hashes[leaf_index as usize], // &archival_mmr.peaks(), // leaf_count as u64 // )); // } // #[test] // fn test_decode_mmr_membership_proof() { // let mut rng = rand::rng(); // for _ in 0..100 { // let num_leafs = 2 + rng.random_range(0..1000); // let leaf_hashes = random_elements(num_leafs); // let archival_mmr = get_mock_ammr_from_digests(leaf_hashes); // let leaf_index = rng.random_range(0..num_leafs) as u64; // let mp = archival_mmr.prove_membership(leaf_index); // let mp_encoded = mp.encode(); // let mp_decoded = *MmrMembershipProof::decode(&mp_encoded).unwrap(); // assert_eq!(mp, mp_decoded); // } // } // #[test] // #[should_panic(expected = "Lists must have same length. Got: 0 and 3")] // fn test_diff_len_lists_batch_update_from_append() { // // Checks that batch_update_from_append() panics when passed differing length lists // // different length lists // let mut mock_membership_proofs: Vec = vec![]; // let mock_membership_proof_leaf_indices: Vec = vec![0, 1, 2]; // // This should panic due to mismatched lengths // MmrMembershipProof::batch_update_from_append( // &mut mock_membership_proofs.iter_mut().collect_vec(), // &mock_membership_proof_leaf_indices, // 3, // random(), // &[], // ); // } // #[test] // #[should_panic(expected = "Lists must have same length. Got: 0 and 3")] // fn test_diff_len_lists_batch_update_from_leaf_mutation() { // // Checks that batch_update_from_leaf_mutation() panics when passed differing length lists // // differing length lists // let mut mock_membership_proofs: Vec = vec![]; // let mock_membership_proof_leaf_indices: Vec = vec![0, 1, 2]; // // other mock input params // let membership_proof = MmrMembershipProof::new(vec![random()]); // let mock_leaf_mutation = LeafMutation::new(0, random(), membership_proof); // // This should panic due to mismatched lengths // MmrMembershipProof::batch_update_from_leaf_mutation( // &mut mock_membership_proofs, // &mock_membership_proof_leaf_indices, // mock_leaf_mutation, // ); // } // #[test] // #[should_panic(expected = "Lists must have same length. Got: 0 and 3")] // fn test_diff_len_lists_batch_update_from_batch_leaf_mutation() { // // Checks that batch_update_from_batch_leaf_mutation() panics when passed // // differing length lists // // differing length lists // let mut mock_membership_proofs: Vec = vec![]; // let mock_membership_proof_leaf_indices: Vec = vec![0, 1, 2]; // // other mock input params // let membership_proof = MmrMembershipProof::new(vec![random()]); // let mock_leaf_mutation = LeafMutation::new(0, random(), membership_proof); // let mock_leaf_mutations = vec![mock_leaf_mutation; 3]; // // This should panic due to mismatched lengths // MmrMembershipProof::batch_update_from_batch_leaf_mutation( // &mut mock_membership_proofs.iter_mut().collect::>(), // &mock_membership_proof_leaf_indices, // mock_leaf_mutations, // ); // } // } ================================================ FILE: tools/garaga_rs/src/crypto/mmr/mmr_successor_proof.rs ================================================ // use arbitrary::Arbitrary; use super::mmr_accumulator::MmrAccumulator; use super::mmr_trait::Mmr; use super::shared_basic::leaf_index_to_mt_index_and_peak_index; // use crate::error::USIZE_TO_U64_ERR; // use crate::prelude::*; use super::super::digest::{Digest, HashFunction}; use crate::crypto::merkle_tree::MerkleTree; /// Asserts that one [MMR Accumulator] is the descendant of another, *i.e.*, /// that the second can be obtained by appending a set of leafs to the first. It /// consists of an authentication path connecting the relevant old peaks to the /// new peaks. /// /// [MMR Accumulator]: MmrAccumulator #[derive(Debug, Clone)] pub struct MmrSuccessorProof { pub paths: Vec>, } impl MmrSuccessorProof { /// Compute a new `MmrSuccessorProof` given the starting MMR accumulator (MMRA) /// and a list of digests to be appended. /// /// # Panics /// /// This function will panic if the number of leafs in the MMRA is greater than /// or equal to 2^63. /// /// This function may panic if the passed-in MMRA is inconsistent, that is, has /// fewer peaks than is possible for its claimed number of leafs. // // For an introduction to the inner workings of this function, see // [`Self::verify_internal`]. pub fn new_from_batch_append(mmra: &MmrAccumulator, new_leafs: &[Digest]) -> Self { if mmra.num_leafs() == 0 { // any MMR is a successor to the empty MMR – nothing to check, nothing to prove return Self { paths: vec![] }; } let height_of_lowest_peak = mmra.num_leafs().trailing_zeros(); let num_leafs_in_lowest_peak = 1 << height_of_lowest_peak; if new_leafs.len() < num_leafs_in_lowest_peak { // the new leafs do not affect the old peaks return Self { paths: vec![] }; } let leafs_in_initial_right_tree = &new_leafs[..num_leafs_in_lowest_peak]; let initial_right_tree = MerkleTree::par_new(leafs_in_initial_right_tree) .expect("internal error: should be able to build Merkle tree"); let num_total_leafs = mmra.num_leafs() + u64::try_from(new_leafs.len()).expect("USIZE_TO_U64_ERR"); let first_new_leaf_index = mmra.num_leafs(); let (mut merkle_tree_index, _) = leaf_index_to_mt_index_and_peak_index(first_new_leaf_index, num_total_leafs); let height_of_new_peak = merkle_tree_index.ilog2(); merkle_tree_index >>= height_of_lowest_peak; let mut current_node = initial_right_tree.root(); let mut paths = vec![current_node]; let mut old_peaks = mmra.peaks().into_iter(); let mut first_unused_new_leaf_idx = num_leafs_in_lowest_peak; let merkle_tree_root_index = u64::try_from(MerkleTree::::ROOT_INDEX).expect("USIZE_TO_U64_ERR"); while merkle_tree_index > merkle_tree_root_index { let current_node_is_left_sibling = merkle_tree_index % 2 == 0; current_node = if current_node_is_left_sibling { let current_height = height_of_new_peak - merkle_tree_index.ilog2(); let num_leafs_in_right_tree = 1 << current_height; let indices_of_leafs_in_right_tree = first_unused_new_leaf_idx..first_unused_new_leaf_idx + num_leafs_in_right_tree; let leafs_in_right_tree = &new_leafs[indices_of_leafs_in_right_tree]; let right_tree = MerkleTree::par_new(leafs_in_right_tree) .expect("internal error: should be able to build Merkle tree"); first_unused_new_leaf_idx += num_leafs_in_right_tree; paths.push(right_tree.root()); Digest::::from_element(H::hash_pair( ¤t_node.to_element(), &right_tree.root().to_element(), )) } else { let left_sibling = old_peaks .next_back() .expect("Merkle Mountain Range Accumulator should be consistent"); Digest::::from_element(H::hash_pair( &left_sibling.to_element(), ¤t_node.to_element(), )) }; merkle_tree_index /= 2; } debug_assert_eq!(merkle_tree_root_index, merkle_tree_index); Self { paths } } /// Verify that the `old` [`MmrAccumulator`] is a predecessor of the `new` one. pub fn verify(&self, old: &MmrAccumulator, new: &MmrAccumulator) -> bool { self.verify_internal(old, new).is_ok() } /// Like [`Self::verify`], but with failure reasons instead of a `bool` to /// increase testability. // // An explanation of the algorithm follows. As an example, take the following // Merkle Mountain Range with 42 = 101010₂ leafs. Peaks are marked with `·`s. // // · // ╭───────────────┴───────────────╮ // ╭───────┴───────╮ ╭───────┴───────╮ · // ╭───┴───╮ ╭───┴───╮ ╭───┴───╮ ╭───┴───╮ ╭───┴───╮ // ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ · // ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ // // Adding 8 leafs to it results in the following new Merkle Mountain Range with // 50 = 110010₂ leafs. The addition is drawn boxy and bold. The elements of the // required authentication path are marked with `x`es. The new peaks are marked // with `○`. The one peak that's both old and new is marked `⊙`. // // ⊙ // ╭─────────┴─────────╮ ○ // ┄┄┴┄┄ ╭───────┴───────╮ ·━━━━━━━┻━━━━━━━┓ // ╭───┴───╮ ╭───┴───╮ ╭───┴───╮ ┏━━━┻━━━x // ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ·━┻━x ┏━┻━┓ ○ // ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ┏┻┓ ┏┻┓ ┏┻┓ ┏┻┓ // // The new MMR Accumulator (the one with 50 leafs) is a successor to the old // MMR Accumulator (the one with 42 leafs) if all of the following are true: // - Both MMR Accumulators are self-consistent. // - The new MMR Accumulator has more or equal the number of leafs as the old // one. // - All “shared peaks” are identical. In the example, only the highest peak is // shared. // - The first unshared peak in the new MMR Accumulator is a Merkle tree that // contains all remaining old peaks. In the example, the second new peak // contains the second and third old peaks. // // All subsequent new peaks are irrelevant for verification. In the example, // this is only the smallest peak of the new MMR Accumulator. // // To re-compute the first unshared peak in the new MMR Accumulator, // - start the Merkle tree authentication from the correct height, that is, from // the height of the smallest old peak; // - for any left sibling, use an old peak; and // - for any right sibling, use an element of the authentication path. fn verify_internal( &self, old: &MmrAccumulator, new: &MmrAccumulator, ) -> Result<(), Error> { if !old.is_consistent() { return Err(Error::InconsistentOldMmr); } if !new.is_consistent() { return Err(Error::InconsistentNewMmr); } let verify_auth_path_is_empty = || { if self.paths.is_empty() { Ok(()) } else { Err(Error::AuthenticationPathTooLong) } }; match old.num_leafs() { 0 => return verify_auth_path_is_empty(), // any MMR is a successor to the empty MMR n if n < new.num_leafs() => (), // nominal case, continued below n if n == new.num_leafs() => { // treated separately to simplify logic in nominal case return if old.peaks() == new.peaks() { verify_auth_path_is_empty() } else { Err(Error::DifferentSharedPeak) }; } _ => return Err(Error::OldHasMoreLeafsThanNew), }; let index_of_first_unverified_leaf = old.num_leafs(); let (merkle_tree_index, num_unchanged_peaks) = leaf_index_to_mt_index_and_peak_index(index_of_first_unverified_leaf, new.num_leafs()); let mut old_peaks = old.peaks().into_iter(); let mut new_peaks = new.peaks().into_iter(); for _ in 0..num_unchanged_peaks { let old_peak = old_peaks.next().ok_or(Error::MissingOldPeak)?; let new_peak = new_peaks.next().ok_or(Error::MissingNewPeak)?; if old_peak != new_peak { return Err(Error::DifferentSharedPeak); } } let height_of_lowest_old_peak = old.num_leafs().trailing_zeros(); let num_leafs_in_lowest_old_peak = 1 << height_of_lowest_old_peak; let num_new_leafs = new.num_leafs() - old.num_leafs(); if num_new_leafs < num_leafs_in_lowest_old_peak { // the new leafs don't affect the old peaks return verify_auth_path_is_empty(); } let mut auth_path = self.paths.iter(); let mut current_node = *auth_path.next().ok_or(Error::AuthenticationPathTooShort)?; let mut merkle_tree_index = merkle_tree_index >> height_of_lowest_old_peak; let merkle_tree_root_index = u64::try_from(MerkleTree::::ROOT_INDEX).expect("USIZE_TO_U64_ERR"); while merkle_tree_index > merkle_tree_root_index { let current_node_is_left_sibling = merkle_tree_index % 2 == 0; current_node = if current_node_is_left_sibling { let &right_sibling = auth_path.next().ok_or(Error::AuthenticationPathTooShort)?; Digest::::from_element(H::hash_pair( ¤t_node.to_element(), &right_sibling.to_element(), )) } else { let left_sibling = old_peaks.next_back().ok_or(Error::MissingOldPeak)?; Digest::::from_element(H::hash_pair( &left_sibling.to_element(), ¤t_node.to_element(), )) }; merkle_tree_index /= 2; } debug_assert_eq!(0, old_peaks.len()); if auth_path.len() > 0 { return Err(Error::AuthenticationPathTooLong); } let first_unshared_peak = new_peaks.next().ok_or(Error::MissingNewPeak)?; if current_node != first_unshared_peak { return Err(Error::DifferentUnsharedPeak); } Ok(()) } } #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, thiserror::Error)] // , Arbitrary)] enum Error { #[error("the new MMRA must not take away any leafs")] OldHasMoreLeafsThanNew, #[error("the old MMRA must be self-consistent")] InconsistentOldMmr, #[error("the new MMRA must be self-consistent")] InconsistentNewMmr, #[error("the old MMRA has too few peaks – is it consistent?")] MissingOldPeak, #[error("the new MMRA has too few peaks – is it consistent?")] MissingNewPeak, #[error("the authentication path contains too few elements")] AuthenticationPathTooShort, #[error("the authentication path contains spurious elements")] AuthenticationPathTooLong, #[error("a peak that should be shared between old and new MMRA is unequal")] DifferentSharedPeak, #[error("the first peak that's unshared between old and new MMRA is not as claimed")] DifferentUnsharedPeak, } // #[cfg(test)] // mod test { // use std::ops::Range; // use itertools::Itertools; // use proptest::prelude::*; // use proptest_arbitrary_interop::arb; // use test_strategy::proptest; // use super::*; // use crate::math::digest::digest_tests::DigestCorruptor; // /// A type exclusive to testing. Simplifies construction and verification of // /// [`MmrSuccessorProof`]s. // #[derive(Debug, Clone)] // struct MmrSuccessorRelation { // old: MmrAccumulator, // new: MmrAccumulator, // proof: MmrSuccessorProof, // } // impl MmrSuccessorRelation { // fn new(old_leafs: Vec, new_leafs: Vec) -> Self { // let old = MmrAccumulator::new_from_leafs(old_leafs.clone()); // let proof = MmrSuccessorProof::new_from_batch_append(&old, &new_leafs); // let new = MmrAccumulator::new_from_leafs([old_leafs, new_leafs].concat()); // Self { old, new, proof } // } // fn new_with_numbered_leafs(num_old_leafs: u64, num_new_leafs: u64) -> Self { // let numbered_leafs = |r: Range<_>| r.map(|leaf| Tip5::hash(&leaf)).collect(); // let old_leafs = numbered_leafs(0..num_old_leafs); // let new_leafs = numbered_leafs(num_old_leafs..num_old_leafs + num_new_leafs); // Self::new(old_leafs, new_leafs) // } // fn verify(&self) -> Result<(), Error> { // self.proof.verify_internal(&self.old, &self.new) // } // } // impl<'a> arbitrary::Arbitrary<'a> for MmrSuccessorRelation { // fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { // let mut leafs = |upper_bound| -> Result, _> { // let num_leafs = u.int_in_range(0..=upper_bound)?; // (0..num_leafs).map(|_| u.arbitrary()).collect() // }; // Ok(Self::new(leafs(1 << 8)?, leafs(1 << 8)?)) // } // } // impl proptest::arbitrary::Arbitrary for MmrSuccessorRelation { // type Parameters = (); // fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { // arb().boxed() // } // type Strategy = BoxedStrategy; // } // #[test] // fn append_nothing_to_empty_mmra() { // let relation = MmrSuccessorRelation::new_with_numbered_leafs(0, 0); // assert_eq!(0, relation.proof.paths.len()); // relation.verify().unwrap(); // } // #[test] // fn append_one_thing_to_empty_mmra() { // let relation = MmrSuccessorRelation::new_with_numbered_leafs(0, 1); // assert_eq!(0, relation.proof.paths.len()); // relation.verify().unwrap(); // } // #[test] // fn append_leafs_without_influence_on_existing_peaks() { // let relation = MmrSuccessorRelation::new_with_numbered_leafs(1 << 3, 3); // assert_eq!(0, relation.proof.paths.len()); // relation.verify().unwrap(); // } // /// 42 = 101010₂ gives nice gaps between peaks, the additional 8 leafs fill some // /// of them nicely and adds a non-trivial new peak that's irrelevant for // /// verification. // /// // /// See the figure below, where the old Merkle Mountain Range is drawn rounded // /// and thin, the addition boxy and bold. The elements of the authentication // /// path are marked with `x`es, the “old peaks” required for authentication are // /// marked with `·`s. // /// // /// ```markdown // /// ╭─────────┴─────────╮ // /// ┄┄┴┄┄ ╭───────┴───────╮ ·━━━━━━━┻━━━━━━━┓ // /// ╭───┴───╮ ╭───┴───╮ ╭───┴───╮ ┏━━━┻━━━x // /// ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ╭─┴─╮ ·━┻━x ┏━┻━┓ // /// ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ╭┴╮ ┏┻┓ ┏┻┓ ┏┻┓ ┏┻┓ // /// ``` // #[test] // fn append_8_leafs_to_mmra_with_42_leafs() { // let relation = MmrSuccessorRelation::new_with_numbered_leafs(42, 8); // assert_eq!(2, relation.proof.paths.len()); // let first_merkle_tree_leafs = [42_u64, 43].map(|i| Tip5::hash(&i)); // let first_merkle_tree = MerkleTree::par_new(&first_merkle_tree_leafs).unwrap(); // assert_eq!(first_merkle_tree.root(), relation.proof.paths[0]); // let second_merkle_tree_leafs = [44_u64, 45, 46, 47].map(|i| Tip5::hash(&i)); // let second_merkle_tree = MerkleTree::par_new(&second_merkle_tree_leafs).unwrap(); // assert_eq!(second_merkle_tree.root(), relation.proof.paths[1]); // relation.verify().unwrap(); // } // #[test] // fn unit_tests() { // for (n, m) in (0..18).cartesian_product(0..18) { // dbg!((n, m)); // let relation = MmrSuccessorRelation::new_with_numbered_leafs(n, m); // relation.verify().unwrap(); // } // } // #[proptest] // fn arbitrary_mmr_successor_relation_holds(relation: MmrSuccessorRelation) { // relation.verify()?; // } // #[proptest] // fn verification_fails_if_old_mmr_is_inconsistent( // mut relation: MmrSuccessorRelation, // wrong_num_leafs: u64, // ) { // prop_assume!(wrong_num_leafs != relation.old.num_leafs()); // relation.old = MmrAccumulator::init(relation.old.peaks(), wrong_num_leafs); // prop_assert_eq!(Err(Error::InconsistentOldMmr), relation.verify()); // } // #[proptest] // fn verification_fails_if_new_mmr_is_inconsistent( // mut relation: MmrSuccessorRelation, // wrong_num_leafs: u64, // ) { // prop_assume!(wrong_num_leafs != relation.new.num_leafs()); // relation.new = MmrAccumulator::init(relation.new.peaks(), wrong_num_leafs); // prop_assert_eq!(Err(Error::InconsistentNewMmr), relation.verify()); // } // #[proptest] // fn verification_fails_if_old_mmra_has_more_leafs_than_new_mmra( // #[filter(#relation.old != #relation.new)] mut relation: MmrSuccessorRelation, // ) { // std::mem::swap(&mut relation.old, &mut relation.new); // prop_assert_eq!(Err(Error::OldHasMoreLeafsThanNew), relation.verify()); // } // #[proptest] // fn verification_fails_if_old_mmra_has_swapped_peaks( // #[filter(#relation.old.peaks().len() >= 2)] mut relation: MmrSuccessorRelation, // #[strategy(0..#relation.old.peaks().len())] first_swap_idx: usize, // #[strategy(0..#relation.old.peaks().len())] second_swap_idx: usize, // ) { // prop_assume!(first_swap_idx != second_swap_idx); // let mut wrong_peaks = relation.old.peaks(); // wrong_peaks.swap(first_swap_idx, second_swap_idx); // relation.old = MmrAccumulator::init(wrong_peaks, relation.old.num_leafs()); // prop_assert!(matches!( // relation.verify(), // Err(Error::DifferentSharedPeak) | Err(Error::DifferentUnsharedPeak) // )); // } // /// Because some peaks of the new MMRA might be irrelevant for the successor // /// relation, it is impossible to swap arbitrary peaks and guarantee a // /// verification failure. However, if the old MMRA is non-empty, the first // /// peak of the new MMRA is always relevant. // #[proptest] // fn verification_fails_if_new_mmra_has_first_peak_swapped_out( // #[filter(#relation.old.num_leafs() > 0)] // #[filter(#relation.new.peaks().len() >= 2)] // mut relation: MmrSuccessorRelation, // #[strategy(1..#relation.new.peaks().len())] swap_idx: usize, // ) { // let mut wrong_peaks = relation.new.peaks(); // wrong_peaks.swap(0, swap_idx); // relation.new = MmrAccumulator::init(wrong_peaks, relation.new.num_leafs()); // prop_assert!(matches!( // relation.verify(), // Err(Error::DifferentSharedPeak) | Err(Error::DifferentUnsharedPeak) // )); // } // #[proptest(cases = 50)] // fn verification_fails_if_authentication_path_is_corrupt( // #[filter(!#relation.proof.paths.is_empty())] mut relation: MmrSuccessorRelation, // #[strategy(0..#relation.proof.paths.len())] corruption_idx: usize, // corruptor: DigestCorruptor, // ) { // let auth_path = &mut relation.proof.paths; // auth_path[corruption_idx] = corruptor.corrupt_digest(auth_path[corruption_idx])?; // prop_assert!(matches!( // relation.verify(), // Err(Error::DifferentSharedPeak) | Err(Error::DifferentUnsharedPeak) // )); // } // #[proptest] // fn verification_fails_if_authentication_path_has_too_few_elements( // #[filter(!#relation.proof.paths.is_empty())] mut relation: MmrSuccessorRelation, // #[strategy(0..#relation.proof.paths.len())] deletion_idx: usize, // ) { // relation.proof.paths.remove(deletion_idx); // prop_assert_eq!(Err(Error::AuthenticationPathTooShort), relation.verify()); // } // #[proptest] // fn verification_fails_if_authentication_path_has_too_many_elements( // mut relation: MmrSuccessorRelation, // #[strategy(arb())] spurious_element: Digest, // ) { // relation.proof.paths.push(spurious_element); // prop_assert_eq!(Err(Error::AuthenticationPathTooLong), relation.verify()); // } // } ================================================ FILE: tools/garaga_rs/src/crypto/mmr/mmr_trait.rs ================================================ use super::mmr_accumulator::MmrAccumulator; use super::mmr_membership_proof::MmrMembershipProof; use crate::crypto::digest::{Digest, HashFunction}; /// A wrapper for the data needed to change the value of a leaf in an MMR when /// only the MMR-accumulator is known, i.e., only the peaks and the leaf-count /// are known. #[derive(Debug, Clone)] pub struct LeafMutation { /// The leaf-index of the leaf being mutated. If the MMR is viewed as a /// commitment to a list, then this is simply the (0-indexed) list-index /// into that list. pub leaf_index: u64, /// The new leaf value, after the mutation has been applied. pub new_leaf: Digest, /// MMR membership proof (authentication path) both before *and* after the /// leaf has been mutated. An authentication path is a commitment to all /// other leafs in the Merkle tree than the one it is a membership proof /// for. pub membership_proof: MmrMembershipProof, } impl LeafMutation { pub fn new( leaf_index: u64, new_leaf: Digest, membership_proof: MmrMembershipProof, ) -> Self { Self { leaf_index, new_leaf, membership_proof, } } /// Returns the node indices into the MMR of the nodes that are mutated by /// this leaf-mutation. pub fn affected_node_indices(&self) -> Vec { self.membership_proof .get_direct_path_indices(self.leaf_index) } } /// A “Merkle Mountain Range” (MMR) is a data structure for storing lists of /// hashes. Similar to [Merkle trees](crate::prelude::MerkleTree), they enable /// efficient set inclusion proofs. Unlike Merkle trees, the number of leafs of /// an MMR is not required to be a power of 2. /// /// One valid perspective of this data structure is to see it as a list of /// Merkle trees. Each of the Merkle tree's roots is one peak of the MMR. /// In order to keep the number of peaks to a minimum, any two Merkle trees of /// the same height are merged, which results in a single tree that has one /// additional “tier”, _i.e._, it's height is one more than that of the two /// trees that got merged. /// /// # Example /// /// The following is a Merkle Mountain Range, annotated with both node and leaf /// indices: /// /// ```markdown /// ──── 15 ─── ╮ /// ╱ ╲ │ /// 7 14 22 │ /// ╱ ╲ ╱ ╲ ╱ ╲ ├╴ node indices /// ╱ ╲ ╱ ╲ ╱ ╲ │ /// 3 6 10 13 18 21 │ /// ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ │ /// 1 2 4 5 8 9 11 12 16 17 19 20 21 ╯ /// /// 0 1 2 3 4 5 6 7 8 9 10 11 12 ←── leaf indices /// ``` /// /// Adding another leaf to the above MMR will result in the following MMR: /// /// ```markdown /// ──── 15 ─── /// ╱ ╲ /// 7 14 22 /// ╱ ╲ ╱ ╲ ╱ ╲ /// ╱ ╲ ╱ ╲ ╱ ╲ /// 3 6 10 13 18 21 25 /// ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ /// 1 2 4 5 8 9 11 12 16 17 19 20 21 23 24 /// /// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /// ``` /// /// Note how the new leaf with index 13, which by itself is a Merkle tree of /// height 0, was merged with its neighboring Merkle tree of equal height, /// resulting in a new Merkle tree of height 1 (the nodes 23, 24, and 25). /// /// Adding two more leafs to this MMR results in a single Merkle tree of height /// four. /// /// # Counterexample /// /// The following is **not** a valid Merkle Mountain Range, since it contains /// trees of equal height. /// /// ```markdown /// _ _ /// ╱ ╲ ╱ ╲ /// ╱ ╲ ╱ ╲ /// _ _ _ _ _ _ /// ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ /// _ _ _ _ _ _ _ _ _ _ _ _ /// ``` /// /// # Terminology /// /// Similar to Merkle trees, Merkle Mountain Ranges have “leafs” and “nodes”. /// Any leaf is a node, but the reverse is not true. Note that the indexing /// scheme for the nodes does not follow that of a Merkle tree – see /// [this][mt_proof] explanation for Merkle tree indexing. /// /// A single Merkle tree's root is one “peak” of the MMR. The number of peaks in /// the MMR equals the number of Merkle trees it is made out of. Because of the /// 1-to-1 mapping between peaks and Merkle trees, the “peak index” uniquely /// identifies any one Merkle tree. /// /// When selecting for a single Merkle tree within a Merkle Mountain Range, the /// usual Merkel tree indexing is used to identify nodes. This is called the /// “Merkle tree index” and is usually only meaningful in combination with a /// peak index, for example like [here][mt_peak_idx]. /// /// [mt_proof]: crate::util_types::merkle_tree::MerkleTree::authentication_structure /// [mt_peak_idx]: crate::util_types::mmr::shared_basic::leaf_index_to_mt_index_and_peak_index pub trait Mmr { /// A single digest committing to the entire MMR. fn bag_peaks(&self) -> Digest; /// The peaks of the MMR, _i.e._, the roots of the Merkle trees that constitute /// the MMR. fn peaks(&self) -> Vec>; /// `true` iff the MMR has no leafs. fn is_empty(&self) -> bool; /// The number of leafs in the MMR. fn num_leafs(&self) -> u64; /// Append a hash digest to the MMR. fn append(&mut self, new_leaf: Digest) -> MmrMembershipProof; /// Mutate an existing leaf. It is the caller's responsibility that the /// membership proof is valid. If the membership proof is wrong, the MMR /// will end up in a broken state. fn mutate_leaf(&mut self, leaf_mutation: LeafMutation); /// Batch mutate an MMR while updating a list of membership proofs. Returns the /// indices of the membership proofs that have changed as a result of this /// operation. fn batch_mutate_leaf_and_update_mps( &mut self, membership_proofs: &mut [&mut MmrMembershipProof], membership_proof_leaf_indices: &[u64], mutation_data: Vec>, ) -> Vec; /// `true` iff a list of leaf mutations and a list of appends results in the expected /// `new_peaks`. fn verify_batch_update( &self, new_peaks: &[Digest], appended_leafs: &[Digest], leaf_mutations: Vec>, ) -> bool; /// Derive an MMR accumulator, which contains only peaks and the number of /// leafs. fn to_accumulator(&self) -> MmrAccumulator; } ================================================ FILE: tools/garaga_rs/src/crypto/mmr/shared_advanced.rs ================================================ use super::shared_basic::*; /// Get (index, height) of leftmost ancestor /// This ancestor does *not* have to be in the MMR /// This algorithm finds the closest $2^n - 1$ that's bigger than /// or equal to `node_index`. #[inline] pub fn leftmost_ancestor(node_index: u64) -> (u64, u32) { if node_index.leading_zeros() == 0 { return (u64::MAX, 63); } let height = node_index.ilog2(); let index = (1 << (height + 1)) - 1; (index, height) } /// Traversing from this node upwards, count how many of the ancestor (including itself) /// is a right child. Also returns node's height. pub fn right_lineage_length_and_own_height(node_index: u64) -> (u32, u32) { let (mut candidate, mut candidate_height) = leftmost_ancestor(node_index); // leftmost ancestor is always a left node, so count starts at 0. let mut right_ancestor_count = 0; loop { if candidate == node_index { return (right_ancestor_count, candidate_height); } let left_child = left_child(candidate, candidate_height); let candidate_is_right_child = left_child < node_index; if candidate_is_right_child { candidate = right_child(candidate); right_ancestor_count += 1; } else { candidate = left_child; right_ancestor_count = 0; }; candidate_height -= 1; } } pub fn right_lineage_length_from_node_index(node_index: u64) -> u32 { let bit_width = u64::BITS - node_index.leading_zeros(); let npo2 = 1u128 << bit_width; let dist = (npo2 - (node_index as u128)) as u64; if (bit_width as u64) < dist { right_lineage_length_from_node_index(node_index - (1 << (bit_width - 1)) + 1) } else { (dist - 1) as u32 } } /// Convert from leaf index to node index. /// /// Crashes if `leaf_index` exceeds 63 bits. pub fn leaf_index_to_node_index(leaf_index: u64) -> u64 { let hamming_weight = leaf_index.count_ones() as u64; 2 * leaf_index - hamming_weight + 1 } /// Get the node_index of the parent #[inline] pub fn parent(node_index: u64) -> u64 { let (right_ancestor_count, height) = right_lineage_length_and_own_height(node_index); if right_ancestor_count != 0 { node_index + 1 } else { node_index + (1 << (height + 1)) } } /// Get the node index of the left sibling, given the right sibling's node index /// and the height of the layer on which it lives. #[inline] pub fn left_sibling(node_index: u64, height: u32) -> u64 { node_index - (1 << (height + 1)) + 1 } /// Get the node index of the right sibling, given the left sibling's node index /// and the height of the layer on which it lives. #[inline] pub fn right_sibling(node_index: u64, height: u32) -> u64 { node_index + (1 << (height + 1)) - 1 } /// The number of nodes in an MMR with `leaf_count` leafs. pub fn num_leafs_to_num_nodes(num_leafs: u64) -> u64 { let hamming_weight = num_leafs.count_ones() as u64; 2 * num_leafs - hamming_weight } /// Return the indices of the nodes added by an append, including the (node index /// of the) peak that this append gave rise to and (that of) the new leaf. pub fn node_indices_added_by_append(old_leaf_count: u64) -> Vec { let mut node_index = leaf_index_to_node_index(old_leaf_count); let mut added_node_indices = vec![node_index]; let mut right_count = right_lineage_length_from_node_index(node_index); while right_count != 0 { // a right child's parent is found by adding 1 to the node index node_index += 1; added_node_indices.push(node_index); right_count -= 1; } added_node_indices } /// Get the node indices of the authentication path starting from the specified /// leaf, to its peak. /// /// # Panics /// /// Panics if the leaf index is out-of-bounds. pub fn auth_path_node_indices(num_leafs: u64, leaf_index: u64) -> Vec { assert!( leaf_index < num_leafs, "Leaf index out-of-bounds: {leaf_index}/{num_leafs}" ); let (mut merkle_tree_index, _) = leaf_index_to_mt_index_and_peak_index(leaf_index, num_leafs); let mut node_index = leaf_index_to_node_index(leaf_index); let mut height = 0; let tree_height = u64::BITS - merkle_tree_index.leading_zeros() - 1; let mut ret = Vec::with_capacity(tree_height as usize); while merkle_tree_index > 1 { let is_left_sibling = merkle_tree_index & 1 == 0; let height_pow = 1u64 << (height + 1); let as_1_or_minus_1: u64 = (2 * (is_left_sibling as i64) - 1) as u64; let signed_height_pow = height_pow.wrapping_mul(as_1_or_minus_1); let sibling = node_index .wrapping_add(signed_height_pow) .wrapping_sub(as_1_or_minus_1); node_index += 1 << ((height + 1) * is_left_sibling as u32); ret.push(sibling); merkle_tree_index >>= 1; height += 1; } debug_assert_eq!(tree_height, ret.len() as u32, "Allocation must be optimal"); ret } /// Get the node indices of the authentication path hash digest needed /// to calculate the digest of `peak_node_index` from `start_node_index` pub fn get_authentication_path_node_indices( start_node_index: u64, peak_node_index: u64, node_count: u64, ) -> Option> { let mut authentication_path_node_indices = vec![]; let mut node_index = start_node_index; while node_index <= node_count && node_index != peak_node_index { // TODO: Consider if this function can be written better, or discard // it entirely. let (right_ancestor_count, height) = right_lineage_length_and_own_height(node_index); let sibling_node_index: u64; if right_ancestor_count != 0 { sibling_node_index = left_sibling(node_index, height); // parent of right child is +1 node_index += 1; } else { sibling_node_index = right_sibling(node_index, height); // parent of left child: node_index += 1 << (height + 1); } authentication_path_node_indices.push(sibling_node_index); } if node_index == peak_node_index { Some(authentication_path_node_indices) } else { None } } /// Return a list of the peak heights for a given leaf count. /// /// # Examples /// /// ``` // /// use twenty_first::util_types::mmr::shared_advanced::get_peak_heights; // /// assert_eq!(get_peak_heights(0b1010), vec![3, 1]); // /// assert_eq!(get_peak_heights(0b1011), vec![3, 1, 0]); // /// ``` pub fn get_peak_heights(leaf_count: u64) -> Vec { // In an MMR, the peak heights directly correspond the leaf count's bit decomposition. That is, // the indices of the bits that are set in the binary representation of the leaf count are the // peaks' heights. let Some(num_bits_in_leaf_count) = leaf_count.checked_ilog2() else { return vec![]; }; let mut indices_of_set_bits = vec![]; for bit_index in 0..=num_bits_in_leaf_count { let bit_mask = 1 << bit_index; let is_set_bit_in_leaf_count = bit_mask & leaf_count != 0; if is_set_bit_in_leaf_count { indices_of_set_bits.push(bit_index); } } // put highest index first indices_of_set_bits.reverse(); indices_of_set_bits } /// Given the number of leafs in the MMR, return one vector representing the heights /// of the peaks, and another vector representing their MMR node indices. pub fn get_peak_heights_and_peak_node_indices(leaf_count: u64) -> (Vec, Vec) { if leaf_count == 0 { return (vec![], vec![]); } let node_index_of_rightmost_leaf = leaf_index_to_node_index(leaf_count - 1); let node_count = num_leafs_to_num_nodes(leaf_count); let (mut top_peak, mut top_height) = leftmost_ancestor(node_index_of_rightmost_leaf); if top_peak > node_count { top_peak = left_child(top_peak, top_height); top_height -= 1; } let mut heights: Vec = vec![top_height]; let mut node_indices: Vec = vec![top_peak]; let mut height = top_height; let mut candidate = right_sibling(top_peak, height); 'outer: while height > 0 { '_inner: while candidate > node_count && height > 0 { candidate = left_child(candidate, height); height -= 1; if candidate <= node_count { heights.push(height); node_indices.push(candidate); candidate = right_sibling(candidate, height); continue 'outer; } } } (heights, node_indices) } /// Convert from node index to leaf index in log(size) time pub fn node_index_to_leaf_index(node_index: u64) -> Option { let (_right, own_height) = right_lineage_length_and_own_height(node_index); if own_height != 0 { return None; } let (mut node, mut node_height) = leftmost_ancestor(node_index); let mut leaf_index = 0; while node_height > 0 { let left_child = left_child(node, node_height); if node_index <= left_child { node = left_child; node_height -= 1; } else { node = right_child(node); node_height -= 1; leaf_index += 1 << node_height; } } Some(leaf_index) } // #[cfg(test)] // mod mmr_test { // use proptest::prelude::Just; // use proptest::prop_assert_eq; // use rand::RngCore; // use test_strategy::proptest; // use super::*; // use crate::prelude::Digest; // use crate::prelude::MmrMembershipProof; // #[test] // fn leaf_index_to_node_index_test() { // assert_eq!(1, leaf_index_to_node_index(0)); // assert_eq!(2, leaf_index_to_node_index(1)); // assert_eq!(4, leaf_index_to_node_index(2)); // assert_eq!(5, leaf_index_to_node_index(3)); // assert_eq!(8, leaf_index_to_node_index(4)); // assert_eq!(9, leaf_index_to_node_index(5)); // assert_eq!(11, leaf_index_to_node_index(6)); // assert_eq!(12, leaf_index_to_node_index(7)); // assert_eq!(16, leaf_index_to_node_index(8)); // assert_eq!(17, leaf_index_to_node_index(9)); // assert_eq!(19, leaf_index_to_node_index(10)); // assert_eq!(20, leaf_index_to_node_index(11)); // assert_eq!(23, leaf_index_to_node_index(12)); // assert_eq!(24, leaf_index_to_node_index(13)); // assert_eq!(26, leaf_index_to_node_index(14)); // assert_eq!(27, leaf_index_to_node_index(15)); // assert_eq!(32, leaf_index_to_node_index(16)); // assert_eq!(33, leaf_index_to_node_index(17)); // assert_eq!(35, leaf_index_to_node_index(18)); // assert_eq!(36, leaf_index_to_node_index(19)); // assert_eq!(39, leaf_index_to_node_index(20)); // assert_eq!(40, leaf_index_to_node_index(21)); // } // #[test] // fn node_indices_added_by_append_test() { // assert_eq!(vec![1], node_indices_added_by_append(0)); // assert_eq!(vec![2, 3], node_indices_added_by_append(1)); // assert_eq!(vec![4], node_indices_added_by_append(2)); // assert_eq!(vec![5, 6, 7], node_indices_added_by_append(3)); // assert_eq!(vec![8], node_indices_added_by_append(4)); // assert_eq!(vec![9, 10], node_indices_added_by_append(5)); // assert_eq!(vec![11], node_indices_added_by_append(6)); // assert_eq!(vec![12, 13, 14, 15], node_indices_added_by_append(7)); // assert_eq!(vec![16], node_indices_added_by_append(8)); // assert_eq!(vec![17, 18], node_indices_added_by_append(9)); // assert_eq!(vec![19], node_indices_added_by_append(10)); // assert_eq!(vec![20, 21, 22], node_indices_added_by_append(11)); // assert_eq!(vec![23], node_indices_added_by_append(12)); // assert_eq!(vec![24, 25], node_indices_added_by_append(13)); // assert_eq!(vec![26], node_indices_added_by_append(14)); // assert_eq!(vec![27, 28, 29, 30, 31], node_indices_added_by_append(15)); // assert_eq!(vec![32], node_indices_added_by_append(16)); // assert_eq!(vec![33, 34], node_indices_added_by_append(17)); // assert_eq!(vec![35], node_indices_added_by_append(18)); // assert_eq!(vec![36, 37, 38], node_indices_added_by_append(19)); // assert_eq!( // vec![58, 59, 60, 61, 62, 63], // node_indices_added_by_append(31) // ); // assert_eq!(vec![64], node_indices_added_by_append(32)); // } // #[test] // fn leaf_index_node_index_pbt() { // let mut rng = rand::rng(); // for _ in 0..10_000 { // let rand = rng.next_u32(); // let inversion_result = node_index_to_leaf_index(leaf_index_to_node_index(rand as u64)); // let inversion = inversion_result.unwrap(); // assert_eq!(rand, inversion as u32); // } // } // #[test] // fn right_ancestor_count_test() { // assert_eq!((0, 0), right_lineage_length_and_own_height(1)); // 0b1 => 0 // assert_eq!((1, 0), right_lineage_length_and_own_height(2)); // 0b10 => 1 // assert_eq!((0, 1), right_lineage_length_and_own_height(3)); // 0b11 => 0 // assert_eq!((0, 0), right_lineage_length_and_own_height(4)); // 0b100 => 0 // assert_eq!((2, 0), right_lineage_length_and_own_height(5)); // 0b101 => 2 // assert_eq!((1, 1), right_lineage_length_and_own_height(6)); // 0b110 => 1 // assert_eq!((0, 2), right_lineage_length_and_own_height(7)); // 0b111 => 0 // assert_eq!((0, 0), right_lineage_length_and_own_height(8)); // 0b1000 => 0 // assert_eq!((1, 0), right_lineage_length_and_own_height(9)); // 0b1001 => 1 // assert_eq!((0, 1), right_lineage_length_and_own_height(10)); // 0b1010 => 0 // assert_eq!((0, 0), right_lineage_length_and_own_height(11)); // 0b1011 => 0 // assert_eq!((3, 0), right_lineage_length_and_own_height(12)); // 0b1100 => 3 // assert_eq!((2, 1), right_lineage_length_and_own_height(13)); // 0b1101 => 2 // assert_eq!((1, 2), right_lineage_length_and_own_height(14)); // 0b1110 => 1 // assert_eq!((0, 3), right_lineage_length_and_own_height(15)); // 0b1111 => 0 // assert_eq!((0, 0), right_lineage_length_and_own_height(16)); // 0b10000 => 0 // assert_eq!((1, 0), right_lineage_length_and_own_height(17)); // 0b10001 => 1 // assert_eq!((0, 1), right_lineage_length_and_own_height(18)); // 0b10010 => 0 // assert_eq!((0, 0), right_lineage_length_and_own_height(19)); // 0b10011 => 0 // assert_eq!((2, 0), right_lineage_length_and_own_height(20)); // 0b10100 => 2 // assert_eq!((1, 1), right_lineage_length_and_own_height(21)); // 0b10101 => 1 // assert_eq!((0, 2), right_lineage_length_and_own_height(22)); // 0b10110 => 0 // assert_eq!((0, 0), right_lineage_length_and_own_height(23)); // 0b10111 => 0 // assert_eq!((1, 0), right_lineage_length_and_own_height(24)); // 0b11000 => 1 // assert_eq!((0, 1), right_lineage_length_and_own_height(25)); // 0b11001 => 0 // assert_eq!((0, 0), right_lineage_length_and_own_height(26)); // 0b11010 => 0 // assert_eq!((4, 0), right_lineage_length_and_own_height(27)); // 0b11011 => 4 // assert_eq!((3, 1), right_lineage_length_and_own_height(28)); // 0b11100 => 3 // assert_eq!((2, 2), right_lineage_length_and_own_height(29)); // 0b11101 => 2 // assert_eq!((1, 3), right_lineage_length_and_own_height(30)); // 0b11110 => 1 // assert_eq!((0, 4), right_lineage_length_and_own_height(31)); // 0b11111 => 0 // assert_eq!((0, 0), right_lineage_length_and_own_height(32)); // 0b100000 => 0 // assert_eq!((1, 0), right_lineage_length_and_own_height(33)); // 0b100001 => 1 // assert_eq!((0, 1), right_lineage_length_and_own_height(34)); // 0b100010 => 0 // assert_eq!((0, 0), right_lineage_length_and_own_height(35)); // 0b100011 => 0 // assert_eq!((2, 0), right_lineage_length_and_own_height(36)); // 0b100100 => 2 // assert_eq!((1, 1), right_lineage_length_and_own_height(37)); // 0b100101 => 1 // assert_eq!((0, 2), right_lineage_length_and_own_height(38)); // 0b100110 => 0 // assert_eq!((0, 0), right_lineage_length_and_own_height(39)); // 0b100111 => 0 // assert_eq!((1, 0), right_lineage_length_and_own_height(40)); // 0b101000 => 1 // assert_eq!((0, 1), right_lineage_length_and_own_height(41)); // 0b101001 => 0 // assert_eq!( // (61, 1), // right_lineage_length_and_own_height(u64::MAX / 2 - 61) // ); // 0b111...11 => 0 // assert_eq!( // (3, 59), // right_lineage_length_and_own_height(u64::MAX / 2 - 3) // ); // 0b111...11 => 0 // assert_eq!( // (2, 60), // right_lineage_length_and_own_height(u64::MAX / 2 - 2) // ); // 0b111...11 => 0 // assert_eq!( // (1, 61), // right_lineage_length_and_own_height(u64::MAX / 2 - 1) // ); // 0b111...11 => 0 // assert_eq!((0, 62), right_lineage_length_and_own_height(u64::MAX / 2)); // 0b111...11 => 0 // } // #[proptest] // fn right_lineage_length_property(#[strategy(0u64..(1<<63))] leaf_index: u64) { // let rll = right_lineage_length_from_leaf_index(leaf_index); // let rac = right_lineage_length_and_own_height(leaf_index_to_node_index(leaf_index)).0; // prop_assert_eq!(rac, rll); // } // #[test] // fn leftmost_ancestor_test() { // assert_eq!((1, 0), leftmost_ancestor(1)); // assert_eq!((3, 1), leftmost_ancestor(2)); // assert_eq!((3, 1), leftmost_ancestor(3)); // assert_eq!((7, 2), leftmost_ancestor(4)); // assert_eq!((7, 2), leftmost_ancestor(5)); // assert_eq!((7, 2), leftmost_ancestor(6)); // assert_eq!((7, 2), leftmost_ancestor(7)); // assert_eq!((15, 3), leftmost_ancestor(8)); // assert_eq!((15, 3), leftmost_ancestor(9)); // assert_eq!((15, 3), leftmost_ancestor(10)); // assert_eq!((15, 3), leftmost_ancestor(11)); // assert_eq!((15, 3), leftmost_ancestor(12)); // assert_eq!((15, 3), leftmost_ancestor(13)); // assert_eq!((15, 3), leftmost_ancestor(14)); // assert_eq!((15, 3), leftmost_ancestor(15)); // assert_eq!((31, 4), leftmost_ancestor(16)); // } // #[test] // fn left_sibling_test() { // assert_eq!(3, left_sibling(6, 1)); // assert_eq!(1, left_sibling(2, 0)); // assert_eq!(4, left_sibling(5, 0)); // assert_eq!(15, left_sibling(30, 3)); // assert_eq!(22, left_sibling(29, 2)); // assert_eq!(7, left_sibling(14, 2)); // } // #[test] // fn node_index_to_leaf_index_test() { // assert_eq!(Some(0), node_index_to_leaf_index(1)); // assert_eq!(Some(1), node_index_to_leaf_index(2)); // assert_eq!(None, node_index_to_leaf_index(3)); // assert_eq!(Some(2), node_index_to_leaf_index(4)); // assert_eq!(Some(3), node_index_to_leaf_index(5)); // assert_eq!(None, node_index_to_leaf_index(6)); // assert_eq!(None, node_index_to_leaf_index(7)); // assert_eq!(Some(4), node_index_to_leaf_index(8)); // assert_eq!(Some(5), node_index_to_leaf_index(9)); // assert_eq!(None, node_index_to_leaf_index(10)); // assert_eq!(Some(6), node_index_to_leaf_index(11)); // assert_eq!(Some(7), node_index_to_leaf_index(12)); // assert_eq!(None, node_index_to_leaf_index(13)); // assert_eq!(None, node_index_to_leaf_index(14)); // assert_eq!(None, node_index_to_leaf_index(15)); // assert_eq!(Some(8), node_index_to_leaf_index(16)); // assert_eq!(Some(9), node_index_to_leaf_index(17)); // assert_eq!(None, node_index_to_leaf_index(18)); // assert_eq!(Some(10), node_index_to_leaf_index(19)); // assert_eq!(Some(11), node_index_to_leaf_index(20)); // assert_eq!(None, node_index_to_leaf_index(21)); // assert_eq!(None, node_index_to_leaf_index(22)); // } // #[test] // fn leaf_count_to_node_count_test() { // let node_counts: Vec = vec![ // 0, 1, 3, 4, 7, 8, 10, 11, 15, 16, 18, 19, 22, 23, 25, 26, 31, 32, 34, 35, 38, 39, 41, // 42, 46, 47, 49, 50, 53, 54, 56, 57, 63, 64, // ]; // for (i, node_count) in node_counts.iter().enumerate() { // assert_eq!(*node_count, num_leafs_to_num_nodes(i as u64)); // } // } // #[test] // fn get_peak_heights_and_peak_node_indices_test() { // type TestCase = (u64, (Vec, Vec)); // let leaf_count_and_expected: Vec = vec![ // (0, (vec![], vec![])), // (1, (vec![0], vec![1])), // (2, (vec![1], vec![3])), // (3, (vec![1, 0], vec![3, 4])), // (4, (vec![2], vec![7])), // (5, (vec![2, 0], vec![7, 8])), // (6, (vec![2, 1], vec![7, 10])), // (7, (vec![2, 1, 0], vec![7, 10, 11])), // (8, (vec![3], vec![15])), // (9, (vec![3, 0], vec![15, 16])), // (10, (vec![3, 1], vec![15, 18])), // (11, (vec![3, 1, 0], vec![15, 18, 19])), // (12, (vec![3, 2], vec![15, 22])), // (13, (vec![3, 2, 0], vec![15, 22, 23])), // (14, (vec![3, 2, 1], vec![15, 22, 25])), // (15, (vec![3, 2, 1, 0], vec![15, 22, 25, 26])), // (16, (vec![4], vec![31])), // (17, (vec![4, 0], vec![31, 32])), // (18, (vec![4, 1], vec![31, 34])), // (19, (vec![4, 1, 0], vec![31, 34, 35])), // ]; // for (leaf_count, (expected_heights, expected_indices)) in leaf_count_and_expected { // assert_eq!( // (expected_heights.clone(), expected_indices), // get_peak_heights_and_peak_node_indices(leaf_count) // ); // assert_eq!(expected_heights, get_peak_heights(leaf_count)); // } // } // #[test] // fn get_authentication_path_node_indices_test() { // type Interval = (u64, u64, u64); // type TestCase = (Interval, Option>); // let start_end_node_count_expected: Vec = vec![ // ((1, 31, 31), Some(vec![2, 6, 14, 30])), // ((2, 31, 31), Some(vec![1, 6, 14, 30])), // ((3, 31, 31), Some(vec![6, 14, 30])), // ((4, 31, 31), Some(vec![5, 3, 14, 30])), // ((21, 31, 31), Some(vec![18, 29, 15])), // ((21, 31, 32), Some(vec![18, 29, 15])), // ((32, 32, 32), Some(vec![])), // ((1, 32, 32), None), // ]; // for ((start, end, node_count), expected) in start_end_node_count_expected { // assert_eq!( // expected, // get_authentication_path_node_indices(start, end, node_count) // ); // } // } // #[test] // #[should_panic(expected = "Leaf index out-of-bounds: 5/5")] // fn auth_path_indices_out_of_bounds_unit_test() { // auth_path_node_indices(5, 5); // } // #[proptest] // fn auth_path_indices_prop( // #[strategy(0u64..(u64::MAX>>1))] _num_leafs: u64, // #[strategy(0u64..(#_num_leafs))] leaf_index: u64, // #[strategy(Just(auth_path_node_indices(#_num_leafs, #leaf_index)))] node_indices: Vec, // ) { // let mp = MmrMembershipProof { // authentication_path: vec![Digest::default(); node_indices.len()], // }; // prop_assert_eq!(mp.get_node_indices(leaf_index), node_indices); // } // #[test] // fn auth_path_indices_unit_test() { // assert_eq!(vec![2, 6, 14, 30], auth_path_node_indices(16, 0)); // assert_eq!(vec![1, 6, 14, 30], auth_path_node_indices(16, 1)); // assert_eq!(vec![5, 3, 14, 30], auth_path_node_indices(16, 2)); // assert_eq!(vec![4, 3, 14, 30], auth_path_node_indices(16, 3)); // assert_eq!(vec![9, 13, 7, 30], auth_path_node_indices(16, 4)); // assert_eq!(vec![8, 13, 7, 30], auth_path_node_indices(16, 5)); // assert_eq!(vec![12, 10, 7, 30], auth_path_node_indices(16, 6)); // assert_eq!(vec![11, 10, 7, 30], auth_path_node_indices(16, 7)); // assert_eq!(vec![17, 21, 29, 15], auth_path_node_indices(16, 8)); // assert_eq!(vec![16, 21, 29, 15], auth_path_node_indices(16, 9)); // assert_eq!(vec![20, 18, 29, 15], auth_path_node_indices(16, 10)); // assert_eq!(vec![19, 18, 29, 15], auth_path_node_indices(16, 11)); // assert_eq!(vec![24, 28, 22, 15], auth_path_node_indices(16, 12)); // assert_eq!(vec![23, 28, 22, 15], auth_path_node_indices(16, 13)); // assert_eq!(vec![27, 25, 22, 15], auth_path_node_indices(16, 14)); // assert_eq!(vec![26, 25, 22, 15], auth_path_node_indices(16, 15)); // assert_eq!(Vec::::new(), auth_path_node_indices(1, 0)); // assert_eq!(vec![2], auth_path_node_indices(2, 0)); // assert_eq!(vec![1], auth_path_node_indices(2, 1)); // let mut expected = vec![]; // for i in 1..63 { // expected.push((1u64 << (i + 1)) - 2); // assert_eq!( // expected, // auth_path_node_indices(1 << i, 0), // "must match for i={i}" // ); // } // } // #[proptest] // fn right_lineage_length_from_node_index_does_not_crash(node_index: u64) { // right_lineage_length_from_node_index(node_index); // } // #[proptest] // fn leftmost_ancestor_does_not_crash(node_index: u64) { // leftmost_ancestor(node_index); // } // #[proptest] // fn right_lineage_length_and_own_height_does_not_crash(node_index: u64) { // right_lineage_length_and_own_height(node_index); // } // } ================================================ FILE: tools/garaga_rs/src/crypto/mmr/shared_basic.rs ================================================ // use crate::prelude::*; use crate::crypto::digest::{Digest, HashFunction}; use crate::crypto::merkle_tree::MerkleTree; use crate::crypto::mmr::mmr_membership_proof::MmrMembershipProof; pub(crate) const USIZE_TO_U64_ERR: &str = "internal error: type `usize` should have at most 64 bits"; pub(crate) const U32_TO_USIZE_ERR: &str = "internal error: type `usize` should have at least 32 bits"; #[inline] pub fn left_child(node_index: u64, height: u32) -> u64 { node_index - (1 << height) } #[inline] pub fn right_child(node_index: u64) -> u64 { node_index - 1 } /// Given the leaf index in the MMR as well as the number of leafs in the MMR, /// compute that leaf's Merkle tree index and its peak index. /// /// For an explanation of the terminology, see [`Mmr`]. /// /// # Panics /// /// - if the leaf index is larger than or equal to the number of leafs #[inline] pub fn leaf_index_to_mt_index_and_peak_index(leaf_index: u64, num_leafs: u64) -> (u64, u32) { // This algorithm works by first identifying how high the local Merkle tree is. This is // the Merkle tree that the leaf with `leaf_index` is part of. Then it finds the peak // index which identifies which of the N Merkle trees the leaf is part of. // // The height of local tree is the lowest index (from least significant) of the bits where // there is a discrepancy between `leaf_index` and `num_leafs`. The discrepant bits can // be identified with a xor. // // The bit-decomposition of `num_leafs` shows the height of the involved Merkle trees. // The number of ones in this bit-decomposition is the number of Merkle trees in the MMR; // the index of each one (counting from least-significant bit) is the height of that // Merkle tree. So counting the ones before and after the discrepancy bit reveals which // Merkle tree the leaf is in. This value is called "peak index" since we have a list // of digests that are the peaks of the MMR, and the peak index shows which element of // that list is the Merkle root that its authentication path refers to. assert!( leaf_index < num_leafs, "Leaf index must be strictly smaller than the number of leafs" ); // get node index, as if this was a Merkle tree let discrepancies = leaf_index ^ num_leafs; let local_mt_height = discrepancies.ilog2(); let local_mt_num_leafs = 1 << local_mt_height; let remainder_bitmask = local_mt_num_leafs - 1; let local_leaf_index = remainder_bitmask & leaf_index; let mt_node_index = local_leaf_index + local_mt_num_leafs; // peak index let num_peaks = num_leafs.count_ones(); let num_peaks_smaller_or_equal_own_peak = (num_leafs & remainder_bitmask).count_ones(); // subtract one to go from cardinal to ordinal let peak_index = num_peaks - num_peaks_smaller_or_equal_own_peak - 1; (mt_node_index, peak_index) } #[inline] /// The number of parents that need to be added when a new leaf is inserted. pub fn right_lineage_length_from_leaf_index(leaf_index: u64) -> u32 { leaf_index.trailing_ones() } /// Return the new peaks of the MMR after adding `new_leaf` as well as the membership /// proof for the added leaf. /// /// # Panics /// /// - if the `old_peaks` and the `old_num_leafs` are inconsistent pub fn calculate_new_peaks_from_append( old_num_leafs: u64, old_peaks: Vec>, new_leaf: Digest, ) -> (Vec>, MmrMembershipProof) { assert_eq!( old_peaks.len(), usize::try_from(old_num_leafs.count_ones()).expect(U32_TO_USIZE_ERR) ); let mut peaks = old_peaks; peaks.push(new_leaf); let mut authentication_path = vec![]; for _ in 0..right_lineage_length_from_leaf_index(old_num_leafs) { let in_progress_peak = peaks.pop().unwrap(); let previous_peak = peaks.pop().unwrap(); authentication_path.push(previous_peak); peaks.push(Digest::::from_element(H::hash_pair( &previous_peak.data, &in_progress_peak.data, ))); } (peaks, MmrMembershipProof::new(authentication_path)) } /// Calculate a new peak list given the mutation of a leaf /// The new peak list will only (max) have *one* element different /// from `old_peaks` /// /// # Panics /// /// Panics if the `membership_proof`'s authentication path is of insufficient /// length. This can only happen if the `membership_proof` is invalid (but /// there are other ways in which it can be invalid, too). pub fn calculate_new_peaks_from_leaf_mutation( old_peaks: &[Digest], num_leafs: u64, new_leaf: Digest, leaf_index: u64, membership_proof: &MmrMembershipProof, ) -> Vec> { let merkle_tree_root_index = u64::try_from(MerkleTree::::ROOT_INDEX).expect(USIZE_TO_U64_ERR); let (mut acc_mt_index, peak_index) = leaf_index_to_mt_index_and_peak_index(leaf_index, num_leafs); let mut acc_hash = new_leaf; let mut authentication_path = membership_proof.authentication_path.iter(); while acc_mt_index > merkle_tree_root_index { let &ap_element = authentication_path.next().unwrap(); let accumulator_is_left_child = acc_mt_index % 2 == 0; if accumulator_is_left_child { acc_hash = Digest::::from_element(H::hash_pair(&acc_hash.data, &ap_element.data)); } else { acc_hash = Digest::::from_element(H::hash_pair(&ap_element.data, &acc_hash.data)); } acc_mt_index /= 2; } debug_assert_eq!(merkle_tree_root_index, acc_mt_index); let mut calculated_peaks: Vec> = old_peaks.to_vec(); calculated_peaks[peak_index as usize] = acc_hash; calculated_peaks } // #[cfg(test)] // mod mmr_test { // use proptest::collection::vec; // use proptest_arbitrary_interop::arb; // use test_strategy::proptest; // use super::*; // #[test] // fn right_lineage_length_from_leaf_index_test() { // assert_eq!(0, right_lineage_length_from_leaf_index(0)); // assert_eq!(1, right_lineage_length_from_leaf_index(1)); // assert_eq!(0, right_lineage_length_from_leaf_index(2)); // assert_eq!(2, right_lineage_length_from_leaf_index(3)); // assert_eq!(0, right_lineage_length_from_leaf_index(4)); // assert_eq!(1, right_lineage_length_from_leaf_index(5)); // assert_eq!(0, right_lineage_length_from_leaf_index(6)); // assert_eq!(3, right_lineage_length_from_leaf_index(7)); // assert_eq!(0, right_lineage_length_from_leaf_index(8)); // assert_eq!(1, right_lineage_length_from_leaf_index(9)); // assert_eq!(0, right_lineage_length_from_leaf_index(10)); // assert_eq!(32, right_lineage_length_from_leaf_index((1 << 32) - 1)); // assert_eq!(63, right_lineage_length_from_leaf_index((1 << 63) - 1)); // } // #[test] // fn leaf_index_to_mt_index_test() { // // 1 leaf // assert_eq!((1, 0), leaf_index_to_mt_index_and_peak_index(0, 1)); // // 2 leafs // assert_eq!((2, 0), leaf_index_to_mt_index_and_peak_index(0, 2)); // assert_eq!((3, 0), leaf_index_to_mt_index_and_peak_index(1, 2)); // // 3 leafs // assert_eq!((2, 0), leaf_index_to_mt_index_and_peak_index(0, 3)); // assert_eq!((3, 0), leaf_index_to_mt_index_and_peak_index(1, 3)); // assert_eq!((1, 1), leaf_index_to_mt_index_and_peak_index(2, 3)); // // 4 leafs // assert_eq!((4, 0), leaf_index_to_mt_index_and_peak_index(0, 4)); // assert_eq!((5, 0), leaf_index_to_mt_index_and_peak_index(1, 4)); // assert_eq!((6, 0), leaf_index_to_mt_index_and_peak_index(2, 4)); // assert_eq!((7, 0), leaf_index_to_mt_index_and_peak_index(3, 4)); // // 14 leafs // assert_eq!((8, 0), leaf_index_to_mt_index_and_peak_index(0, 14)); // assert_eq!((9, 0), leaf_index_to_mt_index_and_peak_index(1, 14)); // assert_eq!((10, 0), leaf_index_to_mt_index_and_peak_index(2, 14)); // assert_eq!((11, 0), leaf_index_to_mt_index_and_peak_index(3, 14)); // assert_eq!((12, 0), leaf_index_to_mt_index_and_peak_index(4, 14)); // assert_eq!((13, 0), leaf_index_to_mt_index_and_peak_index(5, 14)); // assert_eq!((14, 0), leaf_index_to_mt_index_and_peak_index(6, 14)); // assert_eq!((15, 0), leaf_index_to_mt_index_and_peak_index(7, 14)); // assert_eq!((4, 1), leaf_index_to_mt_index_and_peak_index(8, 14)); // assert_eq!((5, 1), leaf_index_to_mt_index_and_peak_index(9, 14)); // assert_eq!((6, 1), leaf_index_to_mt_index_and_peak_index(10, 14)); // assert_eq!((7, 1), leaf_index_to_mt_index_and_peak_index(11, 14)); // assert_eq!((7, 1), leaf_index_to_mt_index_and_peak_index(11, 14)); // // 22 leafs // assert_eq!((16, 0), leaf_index_to_mt_index_and_peak_index(0, 23)); // assert_eq!((17, 0), leaf_index_to_mt_index_and_peak_index(1, 23)); // assert_eq!((18, 0), leaf_index_to_mt_index_and_peak_index(2, 23)); // assert_eq!((19, 0), leaf_index_to_mt_index_and_peak_index(3, 23)); // assert_eq!((30, 0), leaf_index_to_mt_index_and_peak_index(14, 23)); // assert_eq!((31, 0), leaf_index_to_mt_index_and_peak_index(15, 23)); // assert_eq!((4, 1), leaf_index_to_mt_index_and_peak_index(16, 23)); // assert_eq!((5, 1), leaf_index_to_mt_index_and_peak_index(17, 23)); // assert_eq!((6, 1), leaf_index_to_mt_index_and_peak_index(18, 23)); // assert_eq!((7, 1), leaf_index_to_mt_index_and_peak_index(19, 23)); // assert_eq!((2, 2), leaf_index_to_mt_index_and_peak_index(20, 23)); // assert_eq!((3, 2), leaf_index_to_mt_index_and_peak_index(21, 23)); // assert_eq!((1, 3), leaf_index_to_mt_index_and_peak_index(22, 23)); // // 32 leafs // for i in 0..32 { // assert_eq!((32 + i, 0), leaf_index_to_mt_index_and_peak_index(i, 32)); // } // // 33 leafs // for i in 0..32 { // assert_eq!((32 + i, 0), leaf_index_to_mt_index_and_peak_index(i, 33)); // } // assert_eq!((1, 1), leaf_index_to_mt_index_and_peak_index(32, 33)); // // 34 leafs // for i in 0..32 { // assert_eq!((32 + i, 0), leaf_index_to_mt_index_and_peak_index(i, 34)); // } // assert_eq!((2, 1), leaf_index_to_mt_index_and_peak_index(32, 34)); // assert_eq!((3, 1), leaf_index_to_mt_index_and_peak_index(33, 34)); // // 35 leafs // for i in 0..32 { // assert_eq!((32 + i, 0), leaf_index_to_mt_index_and_peak_index(i, 35)); // } // assert_eq!((2, 1), leaf_index_to_mt_index_and_peak_index(32, 35)); // assert_eq!((3, 1), leaf_index_to_mt_index_and_peak_index(33, 35)); // assert_eq!((1, 2), leaf_index_to_mt_index_and_peak_index(34, 35)); // // 36 leafs // for i in 0..32 { // assert_eq!((32 + i, 0), leaf_index_to_mt_index_and_peak_index(i, 36)); // } // assert_eq!((4, 1), leaf_index_to_mt_index_and_peak_index(32, 36)); // assert_eq!((5, 1), leaf_index_to_mt_index_and_peak_index(33, 36)); // assert_eq!((6, 1), leaf_index_to_mt_index_and_peak_index(34, 36)); // assert_eq!((7, 1), leaf_index_to_mt_index_and_peak_index(35, 36)); // // 37 leafs // for i in 0..32 { // assert_eq!((32 + i, 0), leaf_index_to_mt_index_and_peak_index(i, 37)); // } // assert_eq!((4, 1), leaf_index_to_mt_index_and_peak_index(32, 37)); // assert_eq!((5, 1), leaf_index_to_mt_index_and_peak_index(33, 37)); // assert_eq!((6, 1), leaf_index_to_mt_index_and_peak_index(34, 37)); // assert_eq!((7, 1), leaf_index_to_mt_index_and_peak_index(35, 37)); // assert_eq!((1, 2), leaf_index_to_mt_index_and_peak_index(36, 37)); // for i in (10..63).map(|x| 1 << x) { // assert_eq!((14 + i, 0), leaf_index_to_mt_index_and_peak_index(14, i)); // assert_eq!((3, 2), leaf_index_to_mt_index_and_peak_index(i + 9, i + 11)); // assert_eq!( // (1, 3), // leaf_index_to_mt_index_and_peak_index(i + 10, i + 11) // ); // } // } // #[test] // fn peak_index_test() { // let peak_index = |leaf_index, num_leafs| { // let (_, peak_index) = leaf_index_to_mt_index_and_peak_index(leaf_index, num_leafs); // peak_index // }; // assert_eq!(0, peak_index(0, 1)); // assert_eq!(0, peak_index(0, 2)); // assert_eq!(0, peak_index(1, 2)); // assert_eq!(0, peak_index(0, 3)); // assert_eq!(0, peak_index(1, 3)); // assert_eq!(1, peak_index(2, 3)); // assert_eq!(0, peak_index(0, 4)); // assert_eq!(0, peak_index(1, 4)); // assert_eq!(0, peak_index(2, 4)); // assert_eq!(0, peak_index(3, 4)); // assert_eq!(0, peak_index(0, 5)); // assert_eq!(0, peak_index(1, 5)); // assert_eq!(0, peak_index(2, 5)); // assert_eq!(0, peak_index(3, 5)); // assert_eq!(1, peak_index(4, 5)); // assert_eq!(0, peak_index(0, 7)); // assert_eq!(0, peak_index(1, 7)); // assert_eq!(0, peak_index(2, 7)); // assert_eq!(0, peak_index(3, 7)); // assert_eq!(1, peak_index(4, 7)); // assert_eq!(1, peak_index(5, 7)); // assert_eq!(2, peak_index(6, 7)); // assert_eq!(0, peak_index(0, (1 << 32) - 1)); // assert_eq!(0, peak_index(1, (1 << 32) - 1)); // assert_eq!(0, peak_index((0b01 << 31) - 1, (0b10 << 31) - 1)); // assert_eq!(1, peak_index(0b01 << 31, (0b10 << 31) - 1)); // assert_eq!(1, peak_index((0b011 << 30) - 1, (0b100 << 30) - 1)); // assert_eq!(2, peak_index(0b011 << 30, (0b100 << 30) - 1)); // assert_eq!(1, peak_index((0b0101 << 29) - 1, (0b1000 << 29) - 1)); // assert_eq!(2, peak_index((0b0111 << 29) - 1, (0b1000 << 29) - 1)); // } // #[test] // fn merkle_tree_and_peak_indices_can_be_computed_for_large_mmrs() { // leaf_index_to_mt_index_and_peak_index(0, u64::MAX); // leaf_index_to_mt_index_and_peak_index(u64::MAX - 1, u64::MAX); // } // #[proptest] // fn right_lineage_length_from_leaf_index_does_not_crash( // #[strategy(0..=u64::MAX >> 1)] leaf_index: u64, // ) { // right_lineage_length_from_leaf_index(leaf_index); // } // #[proptest] // fn calculate_new_peaks_from_append_does_not_crash( // #[strategy(0..u64::MAX >> 1)] old_num_leafs: u64, // #[strategy(vec(arb(), #old_num_leafs.count_ones() as usize))] old_peaks: Vec, // #[strategy(arb())] new_leaf: Digest, // ) { // calculate_new_peaks_from_append(old_num_leafs, old_peaks, new_leaf); // } // #[test] // fn calculate_new_peaks_from_append_to_empty_mmra_does_not_crash() { // calculate_new_peaks_from_append(0, vec![], rand::random()); // } // } ================================================ FILE: tools/garaga_rs/src/crypto/poseidon_bn254.rs ================================================ use crate::definitions::{FieldElement, GrumpkinPrimeField}; use lazy_static::lazy_static; type F = GrumpkinPrimeField; // Poseidon hash parameters. const T: usize = 3; // Width of the state const N_ROUNDS_F: usize = 8; // Number of full rounds const N_ROUNDS_P: usize = 57; // Number of partial rounds // Precompute and cache the Poseidon constants. lazy_static! { static ref POSEIDON_C_VEC: Vec> = POSEIDON_C .iter() .copied() .map(FieldElement::from_hex_unchecked) .collect(); static ref POSEIDON_M_MAT: Vec>> = POSEIDON_M .iter() .map(|row| row .iter() .copied() .map(FieldElement::from_hex_unchecked) .collect()) .collect(); static ref POSEIDON_P_MAT: Vec>> = POSEIDON_P .iter() .map(|row| row .iter() .copied() .map(FieldElement::from_hex_unchecked) .collect()) .collect(); static ref POSEIDON_S_VEC: Vec> = POSEIDON_S .iter() .copied() .map(FieldElement::from_hex_unchecked) .collect(); } /// Computes the Poseidon hash for BN254 given two inputs. pub fn poseidon_hash_bn254(x: &FieldElement, y: &FieldElement) -> FieldElement { let mut state = vec![FieldElement::zero(), *x, *y]; // Initial Ark state = ark(&state, &POSEIDON_C_VEC, 0); // First half of full rounds. for r in 0..(N_ROUNDS_F / 2 - 1) { state = state.iter().map(sigma).collect(); state = ark(&state, &POSEIDON_C_VEC, (r + 1) * T); state = mix(&state, &POSEIDON_M_MAT); } // Middle round. state = state.iter().map(sigma).collect(); state = ark(&state, &POSEIDON_C_VEC, (N_ROUNDS_F / 2) * T); state = mix(&state, &POSEIDON_P_MAT); // Partial rounds. for r in 0..N_ROUNDS_P { state[0] = sigma(&state[0]); let mut new_state = vec![state[0] + POSEIDON_C_VEC[(N_ROUNDS_F / 2 + 1) * T + r]]; new_state.extend_from_slice(&state[1..]); state = mix_s(&new_state, &POSEIDON_S_VEC, r); } // Second half of full rounds. for r in 0..(N_ROUNDS_F / 2 - 1) { state = state.iter().map(sigma).collect(); state = ark( &state, &POSEIDON_C_VEC, (N_ROUNDS_F / 2 + 1) * T + N_ROUNDS_P + r * T, ); state = mix(&state, &POSEIDON_M_MAT); } // Final round. state = state.iter().map(sigma).collect(); mix_last(&state, &POSEIDON_M_MAT) } // --- Utility functions --- fn sigma(value: &FieldElement) -> FieldElement { // Computes x^5 = x^2 * x^2 * x. let x2 = value * value; let x4 = x2 * x2; x4 * value } fn ark( state: &[FieldElement], constants: &[FieldElement], offset: usize, ) -> Vec> { state .iter() .enumerate() .map(|(i, s)| s + constants[i + offset]) .collect() } fn mix(state: &[FieldElement], matrix: &[Vec>]) -> Vec> { (0..T) .map(|i| { state .iter() .enumerate() .fold(FieldElement::zero(), |acc, (j, s)| acc + (matrix[j][i] * s)) }) .collect() } fn mix_last(state: &[FieldElement], matrix: &[Vec>]) -> FieldElement { state .iter() .enumerate() .fold(FieldElement::zero(), |acc, (j, s)| acc + (matrix[j][0] * s)) } fn mix_s( state: &[FieldElement], s_constants: &[FieldElement], r: usize, ) -> Vec> { let mut result = vec![state .iter() .enumerate() .fold(FieldElement::zero(), |acc, (i, s)| { acc + (s_constants[(T * 2 - 1) * r + i] * s) })]; for i in 1..T { result.push(state[i] + (state[0] * s_constants[(T * 2 - 1) * r + T + i - 1])); } result } // --- Poseidon constant definitions (unchanged) --- const POSEIDON_M: [[&str; 3]; 3] = [ [ "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771", "0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7", ], [ "0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0", "0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23", "0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911", ], [ "0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d", "0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa", "0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0", ], ]; const POSEIDON_P: [[&str; 3]; 3] = [ [ "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x1e6f20a11d1e31e43f83dcedddb9a0236203f5f24ae72c925a8a79a66831f51d", "0x1bd8c528472e57bdc722a141f8785694484f426725403ae24084e3027e782467", ], [ "0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0", "0x2d51ba82c8073c6d6bacf1ad5e56655b7143625b0a9e9c3190527a1a5f05079a", "0x1b07d6d51e6f7e97e0ab10fc2e51ea83ce0611f940ff0731b5f927fe8d6a77c9", ], [ "0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d", "0x11e12a40d262ae88e8376f62d19edf43093cdef1ccf34d985a3e53f0bc5765a0", "0x221c170e4d02a2479c6f3e47b5ff55781574f980d89038308a3ef37cce8463bd", ], ]; const POSEIDON_S: [&str; 285] = [ "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x3f0815ab463f1b76ee25a9b8768b3231a89752f427f4f063ab718e707576b31", "0x15648bf46f60d82954c7e33029b3617357012a3d3b1d34c8e008859f1dbfb317", "0x127e00c2253de07818ca7f2eafdd7564d05ea850cf61f1daa0cfefbf7fbfba85", "0x66365afd18a41ef9382fc0b1d265cb4d3ce470a8cbbb878f7d48051630747bd", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x219d14f823513140dc69a96f7fe7e086f4fa24c84e57dcf2b099715c4404aae7", "0x3a30bfbbf2cb86d4a6a63a8050d91f9f14f4d33696d37ebaefa9ac2302132d5", "0x2121bbcdeaa33a35b0270fb7d5c9f94edad5a84d74b06e3385104b0b41935bcc", "0x196b544fbeb0a792cfbb82c289e579b7cd5580c2e338a389d053ef8b3d10e70e", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2809c3a1547c0cee89c1db270ef479c26973ec73edb4bd4e7d907ea0202f560f", "0x11c34446b083ef92ca157585a02b8b342a4c67175b31f4b5d40d4e96dfc5c8f1", "0x253ea0b33a8bf3b2367c030e3289cbe0f6242ad7709d90b86d9d8026e2e39925", "0x30467dc1930f6afe90c89d4007ad29fc4f5a19c006d1030438c16df85637bd5f", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2f9d4b55495f7e377e20e6f5a3a88af7aa6a536458b38bbe13c8ebfbbba54f44", "0x1d9e9d5c736e3151f11d36d499e7e093d8ee2353be18aad54cfd03ff0feac4b8", "0x124b617b43e598f9ebf622f7823a3de7d1bfedb87e097c315f343de301e54841", "0x198e7cfc66ae45774055cf073bedc945a5f9c5b19cae08d789cc5748ffe199b2", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2eac25b3498dfadffd124ab3aad57789eb945ba57443099c5bb6c27ed977fe24", "0x1ee02c175cdfe1871b378305c1bb9c904e8af1d4454ed3550b3c6ab5f4f90126", "0x616f8c34c607266b29ea8f9d2dfa47ff6fbb1d9745c48609fa98301d0f679d5", "0x181d68b0a188504958b9f19cbbdb972a853e51ed385e4883a43a42832803370b", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2d5397ce863464a25d6b7f5b015d579181d1ce2f24cbabf6059e9327f5ba7004", "0x15bf817491b94d71e8912940cc0b80277713e7d32da2b6591724d8dbd4bc2618", "0x2a7cbd11460b177ab76feab28b69485ac8cc687740bc910994a3827d29c08714", "0xf7cd5ffa4661730ab56e447fae5cc1763cb462da80a85614c237b290de9d502", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0xe0766004b4c4176eb13273508eb6575f768137d86d305be644ce04531008100", "0x625fa7145813481f6d148be6b9c8bb7b54ee3c1afac00104e1f763000b9924c", "0x7c5472508b459916ee0f5461aad2e0b19cd9c7b184f515b65136318ce2c6a5", "0x567375470d189b693ac77ab3fb7557231d53073951d43c54685879cb7a89fcb", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x1d0406bcbec83f8d5165f56c063e42108ad21f51ea4bfc71601174ba5c7b8bcc", "0xc02b18eef22332d280a8aa1f86405f3375f06342f8696ee7c73b46c63272cb7", "0x17c1fc174cd9a6ebeaa7add2f801a664823509ad4fd1b15aad053a55ad6da4cf", "0x5f843c23024eb1dab7ebbc86709a021aaa6caf433f7ed258a08638e9584b32d", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x22df2420697ca28b5cc51c53165e002727b45ccd90a55c87589f792f0ad8cb37", "0x2f1438303a7b49d473400aaedf0f48009fd3af804b76be86417588efc4d7302a", "0x2323d5fcf2da8965c6b2b7b4fbf9a24bbaa7f4dccd35d5ca6155c5463093b23b", "0x26c85b9dfbbe48fe83b753a5e7336b9f40f7b961e9c54f94e37700073d4d26e", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x31511000251ec86feb38b5ab4e335f070b271df4c20979528e41d65384c318f", "0x18e588324a9bbaacb42fa69e5d90a0c0e27cd16b941e34a60ff5df9a26c03af1", "0x2642b5d8e16b953b070635775c8d3c9498357d6ad9bef2e7d99f03c10ea1f95f", "0x21fc313ba11c60e8e84ff60db906a0f031189b0b48335c4221f909aef836c133", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2d3562e3d4b42bc6890b698cc6ab89f7311298bcbac6e4e9f2f4d93d06dae151", "0xa74ef541d360e842e3e0b6ff7e5c7c77934a5f67616f01c189d886dfd2e0808", "0x140564b53e0a812ac3983d6e3b433afa43f434087d9e754967c2c9b1b02caf8a", "0x14709e32d98ae4cd18b400181e71ab9759c436c8e83fa6993adb6f2db6bba9d0", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x734b2366c59e394423f179e1266dd392372db4f2dba651f4a619a4b52bdc010", "0x11fb2d705c94b08d5ad3e3c5fb6629abe963ed92913642c7d02d7e71088fd2d4", "0x27d03abf5c1f290e5d715eba19371050ef6eb7f78fd84be834e4cc3618059484", "0x13ed9e9e6b452df27fb3353cfc2cd63ebe817f212a39c6a8bb9b441ac1395861", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x1319c51cf37aaa10246cdaaa04a12e88795de4452604263a7c5b79ab99cbd23c", "0xbca25588d187b7f9dad839f2c8cb526a4cf444eebbd0e715b6cea019ac3f2", "0x1d837ea0341c5964181226874b923cd01a069b493f02f7a3c01be23cf51d593f", "0x1b41ce9ed3634cbd42c427ce4c5c83774149e2a6dbd25f24012090db7de4e7f9", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x671f0e3b674ae7cddc790ecc4e946f4bca74b98b78a127c7b56bd6673f1ce1f", "0x19fc073797a39b272e40cd30615f55fefeb682c1ac14143071d0449a5426e4e", "0x17bee47d262a497fd1f7c5c6d5a7c70fa4209480bf5d97311c5096619e9fd13", "0x2073cff92d3141b480763539cff2978a4c7944721cc937ba00cc8527274471e3", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x3bd7b3e2c1885877f43182a55a91d48f9c58d152e730fe2c7aa46b1fa663baa", "0x226ebc9a538b5bbaff128edfb9bbf5fa0ceb100719a14c8dfed9ffbbbad9b6b7", "0xd395f0b08b9fede0373a06e1552c0e634a49572af1d830dc6e394e8a5d3b21a", "0x28242439b524540a30d49b68e19e31ba5284bd3bcf1e0f2f41f77d5331f99ffa", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x370d6fa19eaac142d2de034801ab85e0b457e129e91f929754b48c6154d4df6", "0x9a16f573b3280f390762abf269579eaa37939bc0c753feb0a2b2e0bcbde1659", "0x2228e360fb5b162b496ac443f98127ee3c0021a690b71b268d99981368231d97", "0x7e42c2ca633d2c49fabf83991476d209431e34d8032b6a1b97675f3c567f944", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2ce12d7269663770c3cab85a6215a32eed35fda1d8e9d753a50fe96097724a9f", "0x3d7427704c61e2009eeb9b1b45a0125084bc4daf70973a7ba0b2231815b15de", "0x10f8abf0764185861c1267fcf4b4b33ca096fb4ddc4626732d86921e553e69c6", "0x17ccaf6f26f7267a025d7cb456e3aeb251a1a620aaf6568a5c95644c7c5914cc", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x63bb306b96310051385c3ce00ca820ad0e3651a6e55754d59de6df28cea4d51", "0x1f761ee5553c5e86f2c304a18095ab7403242e0b65e608bc920cf993a4169974", "0xdc5f00bbfd7c1d9a23c0e666859ba6564bcde8761b45717cd6bdfc09de4e8f2", "0x6de511520e277b7df07c3536381c13eb44cf790a230abc391089760bfc40ef2", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2a134348c8660efcf9ef54863e70528a1fd4481b50a1fe21f24a8c06e10cca03", "0xaeb5023bbb9a64c4bd80089e99edf8ed5f6f1ffb63a7dbba1b33520bcfce37b", "0x141a6d0810366ae225ecb5f0bfdc9995406c5960ab26155836fc51fb7cb933d1", "0x9d2ea05ef54dadbbe776f404dca6626cc0b2539990bc0b8bfe87497f1e2c5b7", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x1e56d244a8e41be5d104d5f8ef70891d22d4a5432441bfe8ff1a16e91719cdde", "0x1d4f020c57c4f14aec908b2f99b5c4fd5e09447fa85c2fd68ba4d5c5f50c7b49", "0x763911a3a92a4f0e09f4e14cd03398d8d82a1e09db80fb0ee1e833764c18fd3", "0x12857275be2fe6b9ba2ec68f9061643f1fc5d9a2c5e47e55684366e54b302946", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2ed11ccd2e2e2376655ffe9a96c4b81adc0a60353c5d83d4d0ebf50d1bbf87c0", "0x3e31de8958e82645b320d5e3e966ef4726d5b1c2cfbb4acd288a21543c6d594", "0x11e880dfefdbd08858ae890046533d58da28a608d7e905366ec2ca4a36e71963", "0x1835b275deaed2d00704a9c3cc21ab7a44a34662978d53c190dc25e969a507b2", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x68b75315e25ed4ace5a4a9480e1d82ce5d44f76f1324240419f372ff8d3c3f5", "0x1b7ef7d04aec73d62b052d2ad12b92a4268fccd795c839d698ad3b22823274d1", "0x28c0c848022a90606f6193ff5501b57216b670727f4b8efcc240d30bbaa9f03f", "0x13bda49296cbcc51686a7bfb1c39f3f254370985a16660efd6e5d82d4f068e1b", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2e7987ea8204389d11eb10b34265e378a945729f86c3e0e2fd38490d3a594141", "0x826d4a2324ad3aa4b2b45c10a190fedef702aeffda3226ce5415fffd03935c8", "0x2dbeee85eaeaa9fa3675ef541c9df7bb964a85435c3b59685f93b434036ded", "0x227ee7a945edaee6919418ecb3279b11e6fa44f5f5c5abfb966a4be599cb86c7", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x1d0a6d1a9519877805ac90d696faf2a5ffadc23986de8c698d541471c7244220", "0x2208aaba508ae816da4f333b7854fbbcd10eea1db284ec3e9f4de02b25f6e9d4", "0x28a58901035b2c99e36a7d29b587a215c9e59268e2f8e01a175720971ccf04ec", "0x112f6d8d42b0a0d123a07865ca1376df317a2a14ffc0191226f38a8adfd6238", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x8c6eb19c016d1833174dda182d266d5c727f97fb4d01f1daf906b6d3c6e2308", "0x1359d2d6c8b5a116d0b38b95f9c642df75b1be9a48c8698ecfea9103f73f1879", "0x10c5052ec67ab9b6a467c1cc1878d91aaa07aacf7725f8a5ed42b699c4af3ca7", "0x583c4d292d54f3cdb708803e6338fc6afdb188d5d4e9f060193823684c96c75", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2d94a1c55be382151a4054c5b96322e7bcd1fe2b3e076e16ee2c18bfc06f57b4", "0x15e3402fdde8770fb997369579c1b1703ef77c671927ead80dbc64dd2211c3ec", "0x185be98784817f22f7b21e6b867d5a71b5000bef8bb902eb302677e20a727be3", "0x18db4321c721c03666ed8927c89890aa8aad1b00c054547b5ca14cd94de467b6", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2a852b6247f5d61f0c390b3f3d799188528849bcd2cd0aff4eb2134a039b5126", "0x2510aeed51b7f506e65fb9a18ee0124aa5276f6de1cd771b165930204da58f22", "0xf2074a32eb8260fb5bd3a236f03a47b47b7fb54dcad1d7977d6486513bab5f2", "0x2f4c69297866bd45a8270e19941926cec3531c9e12c4c2c84971404bfa044090", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x154668727d2dbadf05d083a65093c0d0e92df5fd5f3fd75e9b792c562a37473f", "0x1e6ffc5d6a1ff5dc4fd77fc5ab5c8c4e8d3e2e375bcd1194a91e5b0f7b13cadf", "0x2cf1a1d7c44309109d75acbc9395cb8398c8b2d428538571fafa389da29990c6", "0x140fb39a89f26f6d87cf76cd5ce8da47aa5d8a023e24cf016ecf64cf793c9880", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x1289d13d58a17b5bf0712b201fb3cddfce2c16dac159990b8298a93a8589f9e8", "0xf45cf974d2c9edb5781e8d3d207adc8370cf56bc5218749610920fe98b2db2e", "0x11909c81a16518046b79edfd24f5abcc585a81d1b333568b8687a1c9eceb44d4", "0x2990b23c81882f7709f3b891a0e3da4d6917672f2d5a1041fd7bbd6792330d16", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x609551b14716ca3cd5560e0821e7285e0a083ea9a16dc102ecf461e4aef7277", "0xc8c1abdfab99d03fd93dced2467354b6175de1755f4f93dc0880eaa08d03f77", "0x138bd098c4923b9fbd02f33f8bec6c730db3fed298ec09f78a7a55d08f2e0b10", "0x2e61e4bc021630114673f0f77161ae55dcd0b45ce07d9ae3f21bb5a3190f14c0", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x124860913e3df8f65a9c4060ce3297c626abd1c22401c905ddb408260d8e910", "0x13807f89c394a133ec104804d955cbe125f24c5701d98286c6ac8b7ed052ec8", "0x2e88d1a6938f0788132aa9eeaec08d2f59aa444050c8f4c4e85578abb0fc2fe5", "0x1f3d24f17cfc6050a0cbf64e1f1787e2257be3c3ba607c2e8fcc1f26abf3104", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x1fe1cb0e2ae169f83b9d4f133d41fb5b3fe6c76a82a916bfd9b62f82f0f8d0bf", "0xef79351229409cd353329221229827e19946f3d8d1c48bf5e3377f9177071f3", "0x18fb2e46fc1b90fe1c4893ef77a9d111507551883127860e89088608373beda9", "0x77afe2579f42ec14c32ef0761e23a3cc0ad6263a68c5cb61916bd57120d1868", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x79769092daa5a752642c04ccf8a6ea54e2ac9836fdd65d248b186f1490b7b99", "0x1d8bf229c19968f0254eb6e09c5c8bfd67eb9734606b676b663c76cf76bab4a5", "0x2a33b7d855e7fe55f93556e49e4b37737664f14236f17256428f29f6ec1bddad", "0x25b0331d7e2b15af4ec161c86e84ba6ab2056077e7aa7536340dc3187ccca8b2", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x762098f5fe26598ccbf45e4810211b0ffcf8ccbb92c16e2f4f13f22342474e2", "0xe234d720d70b2886d0da4c007b1bda42362e144185c70716dece2b6172c2514", "0x1d82bedccd2bc8a06e3742e720b7fec2ea72182f11c0c60d135c811152aa4b60", "0x480064d4b3eb0ada5e9a3e7d05930b7c3397fd6b94d481314bd1c690a17c979", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x10a892763b3cca9ef7593fbb1140edc8c8e4580568560cf41867f7464fb0c11a", "0xb5ec64548ea841ac921f9b2553680785978b315667ae4714dde4cd7f4de8b91", "0x10554aca4e348e5949761bd7131dfaebd78010edd030e1a9ce3c65c9db931d46", "0x15be66f38d86b0998b93655462b1f475b9be9de306e150d4ac648fab3db0cff6", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x176ad3600fd3491182d182957ffad01bf6c26e9d4ab0c23caaf308e427d3dbe8", "0x2b6f355b3dbf65f09335001d705ac125e3beb20f4fc11bd3ce82b5cf0af2e6f2", "0x1c85c06a6d5d40d81d7c89edefb32d1a8448c51288fa296b6de9ff788c77451", "0x20e1e876c4746a0cbd9a51d76b2e25f82361c389e43f7d1f51a70aaac2460d79", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x20e46219f684186d2a024b637bc35a29ee3b08ce737701392d987dda9217fa08", "0x2ea7279db9f2aa0f654e987907277c24480766367a8bd90e28be0f2ed6091367", "0x136be2a7f18924c9362096d472bc75ca0969dc077c9171b1641be95091780f74", "0x1ca2033501baa3f73067c4300fb0f51119ed5736fbc8f1f6c924baf0df5a0e9e", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0xa82f199c2505277ecaa75e495f34e3525824f7a4a9d9fa1da810832b48a50c7", "0xecf10485307b4bae92fefb0d7f7782a9f37a2722e7ed9eb7925a2dea580b7d5", "0x7b642138dfd6a6dd12aa22f08a8296d68615c8478f13af16aebbbb339a3936b", "0x1d9dda43a25593ffd2256d34921fb86ed70e760ba76d61e9cbc3b6dd0f1a2150", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2f1af228520c8b751dc91136c91c6bccd5367eb08213d392958ce2fd3d7d2fce", "0x1fecfe833ad540455c6d6c1ab3de4abae61ada625a1a2b6b18551a45a6cde123", "0x18fc8e608c735b2b3b0d7583460227575657ff8a77abe637bdd3ad28e4a23c88", "0x28f740bc1182e9706ebf03cb3f53aba8a43ce0b618783a5586388a7547faa815", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x47998cc0af5a26b94ad301e4b998d29e960a4851cfd13822bed35b7146966a4", "0x1b5f1525b31db911dda43e415e1b9a3a9725c7b52e880ee130a14a692b777b70", "0x275a83fa5d19b4535f65e965a90eac9bf770ae9bd1d7b1af945fa57ed5c8de6e", "0x2e8789257ed2cbcccb430568e49bc9dc2a563359808c9897ce3e40a6f6a27aa8", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x927f46cfe80feefeb2721a4c09e9d17f60c34500dcd6e41e2925a39c8e2c7c1", "0x1f868ae04832a5dbc37619bfe6ab6a97fd8fb2cfbc1ecf9e0e484bbfe7698101", "0x9d7a11e27d2f53109b73f745b2defed65d94ba80f308fb19ce6d56c9b45eff4", "0x282d857cfe8da3b5104e1c2823fb7c5b9a7b25924fda5995b0c351aa2b879dff", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x20ba8a9fcec815b13f349ff830ae663b27576e135c0744f6987fb0f6ff49c217", "0x11b6afc91e32f1ca4589fba12e657d226d57b471ddd2ab1b66a8ae4dcbfb136e", "0x2e666402ac9cc588316e335c7d93db344788eec2c72ddf3f908141736cebc3be", "0x17522e0e9e64f795a202a110e283faad7057aec5c9ed9a1a74920f2794f18595", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2d2ed17f7a1f3ee9e20b470cad4cc7319e6adb40e2ff24b7878cb9878edbd3b9", "0x1a81efb19d7e1edaa96fa276e89e85d08f75e54a8136f4d73c937da16c7bf9f4", "0x27ff57c1ca847e57210a7b44e52e5630f299c5f451c7a0d515a16bb3bd33e237", "0x1c1a8e22230abcd13c5be96031bfa167840d117b3c6a5a0a11be26a7f5fb1a94", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2a1c3f15d4927c843627a9cd533e4250d81e7774d2c32b59d5836f9c19a5657", "0x2ddbb7239eb904d81c52499b37cb4be1af0373a10ac112e185acb219899357e4", "0xdff198393085a754e0d6faec54be81d8edf8bc25edadab48a86fad6da0afb60", "0x10d50c2473146bbc76275fcc589d038dec8db28728789f28b6d5f504bd1645ca", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x61e8328fb5593f92a53dfd40e1022e6231ba45948506282536b08b4476c1538", "0x1b589243847198ded90b644bee31ac58067debf3f07d3c51cfa5a0dd9f6d9784", "0x4b00c0da1f851e59863b053bd4c6087190f0bdcced99d5ce6f67a420a3bd1f7", "0x239941a46c2b93d9126a70163009a7ac27f8a8d42e35018b3bec8cdcb5ddfd67", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x204f26ca7993b03ac2c35377cb0a3712bfc9bc3ec0bfecb4e87ef6814acf2ea2", "0x85aff9c7fdadba039d832d8be165a1e5747cf7308d515e348ef117e926d721c", "0x249042a8dc111f27c4ae9db044c0b0b3f10e57d05e093158efd375df00ea2068", "0x6e799bcdf2b4a74542854f3029803e2f84550665203327b3e0825977413e96b", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x1cb3caed4bffb6aca9f4d2c002921bc3fffed333cae12085c612496183b87996", "0xb47e9755fae480128a128bfd4faa6a3dd6ea03cab566889dcd99e84d310d51c", "0xc7e4cea365c2061920a0c9fd2c360a6506293bc024fd1ca3f0bb730da886a4f", "0x21da1f701bac77bcbbaa30d964d6f6f63dbe1b20d9d6988c8dcd7ba4187215df", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x9ae612e8ba1ca1370905fb67899d10db86b47bd19965b6edd1a9486e3c6cc55", "0x262e1e0b56cac47fc150f284491190e6aab75445b0c99373fe1f7a0e3b95cf3d", "0x234bf4a7dce7587c2c87c293e3bb7c9e2a7bfa5f29fd4ddeaa5d3f67491d34bd", "0x2f6cbac694c886b02d0a527cac744fb658d2690e213d7432eee67f6cb69f70c2", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x22accb18b7c49b4b7bb8c9fdf78b7aded52aa1842fff818d9a3300876dec3ad9", "0x81e2f0652f898c6d659f22d2c77be302eabd9182a0b3d3cbf623a1df7f8f2fc", "0x12c0a25e70d006eccea3ada75d669b8c534b962890f3ffc016b3186ad675b935", "0x10ef9c23848128cc2fd6fc869df24d7ab56efd349edd56f49f8d4f2381df3259", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x2161cd280772819dd4a81262b71df1bcc2c1d41b9491e0620bda347962b240f0", "0x2cebb0ae5108318eb406590041b5248292533364f799bc41b7f4fdd12cb8d38a", "0x2b2092f86b5979a7fe4f7c22d9561f3bf2852283a656880fb759e08709a0a62f", "0x1566b3402d774b8c08146188425a442450cfc900cf643e7382b2d8507a065fed", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x11a316aa31607f268fb4c56d6c57ba01627c3635fccf8d3d1a163e601d1a0173", "0xde7ee069c934256b782648b560e595408a5e8434644609152e353d9c2874e44", "0x2d36f4029245704cc84df0297708c5e5845c36ae706c72e67128b8949eab1af", "0x1b8cc326b5ee160f53198c217fb34e899bde46cd82dabdc284d7951d546f858", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x27625da0f73ea07110689fb2187b71694cbf9203fd4ddf8a96ece85407550ebb", "0x1cd8338a3e5b1ad7cdc0da581a6950f6dea349c3edda06cb99ba025b94e4790d", "0x5ea02d65b209f6da763856c94b6438c78a8aed8d3e67e877a10a84072741a56", "0x9f7cb68d4e388f85366cfcf284a895d8b6250ced627e810817743ce03330a55", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x18c6230ddc0f896827b043f5e58dbd1aec13995a202e4ebcdfeb969e9d5c1212", "0x73a6114b997285e1a91c0a0fdccdaa8452e4f07bfd2e1a10578232096db6dcd", "0x2e78746340b2a6d222c6a1fc0838adf5fe013f39b1660ce7a3e7742b2f37be7f", "0x7aa27e7150baddd06303ad8e5e4bf4249b7ea846553def28e675259d3e5c851", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0xb66fdec210ea4eabf623d2712cf4d9fa90273ccb4643f680cbc98345715ead8", "0x2fb6a29d9f394a589b633b8a4d6be51c9c0601ce0b140be641acea41c49aa5e3", "0x29025cc66fd041c4fc845e9c1c2cd1288569fb243d049bd675a69dc889b2ce2a", "0x150963f0aca9bcbe4126214ab9c627a6f7ed731cfa695168b85d534b17be3f48", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0xed59780302257663f72c1bfc6656eb7b5bca2e47bec0d5798a08a32a61a8a65", "0x7e19cb8a893369b3d30ae188c767f391c11888a3000debfc8d30c06143cc084", "0x600c7d2b6946345e5f1eeeafb5eb8ec2b6ecfe528d2c052cd860afb4a3aa272", "0x596083b6c972bc13022a1f33d6523b4773f2cd0a480e19ea0125119f0385705", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0x210b5c36f27a07d97f98b9d8663d85db2e64513099a8e1ef6db21043631e24c4", "0x13bb2764bf1475cfc7bb9f3d563c5cc201c2489874e9159326a8f4930b7883f9", "0x202cf557d625c26080eb082862a76757287872b181e89997219e4b7576e24d30", "0xe561c3f8bd4f76e76d49e97142d220601fbc5a03d905a4728ea1f95fd8824b2", "0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b", "0xde20097480e7555471785de07bd9809d57dd859bbe827307c33ae9ed7890597", "0x72f2a6287fb984bb810df8c5788eebcfd2825613cb72bb80cde8edd76d2e97d", "0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771", "0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7", ]; const POSEIDON_C: [&str; 81] = [ "0xee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e", "0xf1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864", "0x8dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5", "0x84d520e4e5bb469e1f9075cb7c490efa59565eedae2d00ca8ef88ceea2b0197", "0x2d15d982d99577fa33da56722416fd734b3e667a2f9f15d8eb3e767ae0fd811e", "0xed2538844aba161cf1578a43cf0364e91601f6536a5996d0efbe65632c41b6d", "0x2600c27d879fbca186e739e6363c71cf804c877d829b735dcc3e3af02955e60a", "0x28f8bd44a583cbaa475bd15396430e7ccb99a5517440dfd970058558282bf2c5", "0x9cd7d4c380dc5488781aad012e7eaef1ed314d7f697a5572d030c55df153221", "0x11bb6ee1291aabb206120ecaace460d24b6713febe82234951e2bee7d0f855f5", "0x2d74e8fa0637d9853310f3c0e3fae1d06f171580f5b8fd05349cadeecfceb230", "0x2735e4ec9d39bdffac9bef31bacba338b1a09559a511a18be4b4d316ed889033", "0xf03c1e9e0895db1a5da6312faa78e971106c33f826e08dcf617e24213132dfd", "0x17094cd297bf827caf92920205b719c18741090b8f777811848a7e9ead6778c4", "0xdb8f419c21f92461fc2b3219465798348df90d4178042c81ba7d4b4d559e2b8", "0x243443613f64ffa417427ed5933fcfbc66809db60b9ca1724a22709ceceeece2", "0x22af49fbfd5d7e9fcd256c25c07d3dd8ecbbae6deecd03aa04bb191fada75411", "0x14fbd37fa8ad6e4e0c78a20d93c7230c4677f797b4327323f7f7c097c19420e0", "0x15a9298bbb882534d4b2c9fbc6e4ef4189420c4eb3f3e1ea22faa7e18b5ae625", "0x2f7de75f23ddaaa5221323ebceb2f2ac83eef92e854e75434c2f1d90562232bc", "0x36a4432a868283b78a315e84c4ae5aeca216f2ff9e9b2e623584f7479cd5c27", "0x2180d7786a8cf810e277218ab14a11e5e39f3c962f11e860ae1c5682c797de5c", "0xa268ef870736eebd0cb55be640d73ee3778990484cc03ce53572377eefff8e4", "0x1eefefe11c0be4664f2999031f15994829e982e8c90e09069df9bae16809a5b2", "0x27e87f033bd1e0a89ca596e8cb77fe3a4b8fb93d9a1129946571a3c3cf244c52", "0x1498a3e6599fe243321f57d6c5435889979c4f9d2a3e184d21451809178ee39", "0x27c0a41f4cb9fe67e9dd4d7ce33707f74d5d6bcc235bef108dea1bbebde507aa", "0x1f75230908b141b46637238b120fc770f4f4ae825d5004c16a7c91fe1dae280f", "0x25f99a9198e923167bba831b15fffd2d7b97b3a089808d4eb1f0a085bee21656", "0x101bc318e9ea5920d0f6acdc2bb526593d3d56ec8ed14c67622974228ba900c6", "0x1a175607067d517397c1334ecb019754ebc0c852a3cf091ec1ccc43207a83c76", "0xf02f0e6d25f9ea3deb245f3e8c381ee6b2eb380ba4af5c1c4d89770155df37b", "0x151d757acc8237af08d8a6677203ec9692565de456ae789ff358b3163b393bc9", "0x256cd9577cea143049e0a1fe0068dd20084980ee5b757890a79d13a3a624fad4", "0x513abaff6195ea48833b13da50e0884476682c3fbdd195497b8ae86e1937c61", "0x1d9570dc70a205f36f610251ee6e2e8039246e84e4ac448386d19dbac4e4a655", "0x18f1a5194755b8c5d5d7f1bf8aaa6f56effb012dd784cf5e044eec50b29fc9d4", "0x266b53b615ef73ac866512c091e4a4f2fa4bb0af966ef420d88163238eebbca8", "0x2d63234c9207438aa42b8de27644c02268304dfeb8c89a1a3f4fd6e8344ae0f7", "0x2ab30fbe51ee49bc7b3adde219a6f0b5fbb976205ef8df7e0021daee6f55c693", "0x1aee6d4b3ebe9366dcb9cce48969d4df1dc42abcd528b270068d9207fa6a45c9", "0x1891aeab71e34b895a79452e5864ae1d11f57646c60bb34aa211d123f6095219", "0x24492b5f95c0b0876437e94b4101c69118e16b2657771bd3a7caab01c818aa4b", "0x1752161b3350f7e1b3b2c8663a0d642964628213d66c10ab2fddf71bcfde68f", "0xab676935722e2f67cfb84938e614c6c2f445b8d148de54368cfb8f90a00f3a7", "0xb0f72472b9a2f5f45bc730117ed9ae5683fc2e6e227e3d4fe0da1f7aa348189", "0x16aa6f9273acd5631c201d1a52fc4f8acaf2b2152c3ae6df13a78a513edcd369", "0x2f60b987e63614eb13c324c1d8716eb0bf62d9b155d23281a45c08d52435cd60", "0x18d24ae01dde92fd7606bb7884554e9df1cb89b042f508fd9db76b7cc1b21212", "0x4fc3bf76fe31e2f8d776373130df79d18c3185fdf1593960715d4724cffa586", "0xd18f6b53fc69546cfdd670b41732bdf6dee9e06b21260c6b5d26270468dbf82", "0xba4231a918f13acec11fbafa17c5223f1f70b4cdb045036fa5d7045bd10e24", "0x7b458b2e00cd7c6100985301663e7ec33c826da0635ff1ebedd0dd86120b4c8", "0x1c35c2d96db90f4f6058e76f15a0c8286bba24e2ed40b16cec39e9fd7baa5799", "0x1d12bea3d8c32a5d766568f03dd1ecdb0a4f589abbef96945e0dde688e292050", "0xd953e20022003270525f9a73526e9889c995bb62fdea94313db405a61300286", "0x29f053ec388795d786a40bec4c875047f06ff0b610b4040a760e33506d2671e1", "0x4188e33735f46b14a4952a98463bc12e264d5f446e0c3f64b9679caaae44fc2", "0x149ec28846d4f438a84f1d0529431bb9e996a408b7e97eb3bf1735cdbe96f68f", "0xde20fae0af5188bca24b5f63630bad47aeafd98e651922d148cce1c5fdddee8", "0x12d650e8f790b1253ea94350e722ad2f7d836c234b8660edf449fba6984c6709", "0x22ab53aa39f34ad30ea96717ba7446aafdadbc1a8abe28d78340dfc4babb8f6c", "0x26503e8d4849bdf5450dabea7907bc3de0de109871dd776904a129db9149166c", "0x1d5e7a0e2965dffa00f5454f5003c5c8ec34b23d897e7fc4c8064035b0d33850", "0xee3d8daa098bee012d96b7ec48448c6bc9a6aefa544615b9cb3c7bbd07104cb", "0x1bf282082a04979955d30754cd4d9056fa9ef7a7175703d91dc232b5f98ead00", "0x7ae1344abfc6c2ce3e951bc316bee49971645f16b693733a0272173ee9ad461", "0x217e3a247827c376ec21b131d511d7dbdc98a36b7a47d97a5c8e89762ee80488", "0x215ffe584b0eb067a003d438e2fbe28babe1e50efc2894117509b616addc30ee", "0x1e770fc8ecbfdc8692dcedc597c4ca0fbec19b84e33da57412a92d1d3ce3ec20", "0x2f6243cda919bf4c9f1e3a8a6d66a05742914fc19338b3c0e50e828f69ff6d1f", "0x246efddc3117ecd39595d0046f44ab303a195d0e9cc89345d3c03ff87a11b693", "0x53e8d9b3ea5b8ed4fe006f139cbc4e0168b1c89a918dfbe602bc62cec6adf1", "0x1b894a2f45cb96647d910f6a710d38b7eb4f261beefff135aec04c1abe59427b", "0xaeb1554e266693d8212652479107d5fdc077abf88651f5a42553d54ec242cc0", "0x16a735f6f7209d24e6888680d1781c7f04ba7d71bd4b7d0e11faf9da8d9ca28e", "0x487b8b7fab5fc8fd7c13b4df0543cd260e4bcbb615b19374ff549dcf073d41b", "0x1e75b9d2c2006307124bea26b0772493cfb5d512068c3ad677fdf51c92388793", "0x5120e3d0e28003c253b46d5ff77d272ae46fa1e239d1c6c961dcb02da3b388f", "0xda5feb534576492b822e8763240119ac0900a053b171823f890f5fd55d78372", "0x2e211b39a023031a22acc1a1f5f3bb6d8c2666a6379d9d2c40cc8f78b7bd9abe", ]; #[cfg(test)] mod tests { use super::*; #[test] fn test_poseidon_bn254() { let x = FieldElement::from_hex_unchecked("1"); let y = FieldElement::from_hex_unchecked("2"); let z = poseidon_hash_bn254(&x, &y); assert_eq!( z, FieldElement::from_hex_unchecked( "115cc0f5e7d690413df64c6b9662e9cf2a3617f2743245519e19607a4417189a" ) ); } } ================================================ FILE: tools/garaga_rs/src/definitions.rs ================================================ use crate::algebra::polynomial::Polynomial; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::BLS12381PrimeField as BLSPF; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::BN254PrimeField as BNPF; use lambdaworks_math::field::element::FieldElement as Felt; use lambdaworks_math::field::fields::fft_friendly::stark_252_prime_field::Stark252PrimeField as StrkPF; use lambdaworks_math::field::fields::montgomery_backed_prime_fields::{ IsModulus, MontgomeryBackendPrimeField, }; use lambdaworks_math::field::traits::IsPrimeField; use lambdaworks_math::traits::ByteConversion; use lambdaworks_math::unsigned_integer::element::U256; use num_bigint::BigInt; use num_bigint::BigUint; use num_traits::Num; use std::cmp::PartialEq; use std::collections::HashMap; use crate::io::{biguint_from_hex, element_from_biguint}; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum CurveID { BN254 = 0, BLS12_381 = 1, SECP256K1 = 2, SECP256R1 = 3, X25519 = 4, GRUMPKIN = 5, } impl TryFrom for CurveID { type Error = String; fn try_from(value: u8) -> Result { match value { 0 => Ok(CurveID::BN254), 1 => Ok(CurveID::BLS12_381), 2 => Ok(CurveID::SECP256K1), 3 => Ok(CurveID::SECP256R1), 4 => Ok(CurveID::X25519), 5 => Ok(CurveID::GRUMPKIN), _ => Err(format!("Invalid curve ID: {}", value)), } } } impl TryFrom for CurveID { type Error = String; fn try_from(value: usize) -> Result { match value { 0 => Ok(CurveID::BN254), 1 => Ok(CurveID::BLS12_381), 2 => Ok(CurveID::SECP256K1), 3 => Ok(CurveID::SECP256R1), 4 => Ok(CurveID::X25519), 5 => Ok(CurveID::GRUMPKIN), _ => Err(format!("Invalid curve ID: {}", value)), } } } pub type FieldElement = Felt; pub type BN254PrimeField = BNPF; pub type BLS12381PrimeField = BLSPF; pub type Stark252PrimeField = StrkPF; pub const SECP256K1_PRIME_FIELD_ORDER: U256 = U256::from_hex_unchecked("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"); #[derive(Clone, Debug, Copy)] pub struct SECP256K1FieldModulus; impl IsModulus for SECP256K1FieldModulus { const MODULUS: U256 = SECP256K1_PRIME_FIELD_ORDER; } pub type SECP256K1PrimeField = MontgomeryBackendPrimeField; pub const SECP256R1_PRIME_FIELD_ORDER: U256 = U256::from_hex_unchecked("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"); #[derive(Clone, Debug)] pub struct SECP256R1FieldModulus; impl IsModulus for SECP256R1FieldModulus { const MODULUS: U256 = SECP256R1_PRIME_FIELD_ORDER; } pub type SECP256R1PrimeField = MontgomeryBackendPrimeField; pub const X25519_PRIME_FIELD_ORDER: U256 = U256::from_hex_unchecked("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"); #[derive(Clone, Debug, Copy)] pub struct X25519FieldModulus; impl IsModulus for X25519FieldModulus { const MODULUS: U256 = X25519_PRIME_FIELD_ORDER; } pub type X25519PrimeField = MontgomeryBackendPrimeField; pub const GRUMPKIN_PRIME_FIELD_ORDER: U256 = U256::from_hex_unchecked("30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001"); #[derive(Clone, Debug, Copy, Hash)] pub struct GrumpkinFieldModulus; impl IsModulus for GrumpkinFieldModulus { const MODULUS: U256 = GRUMPKIN_PRIME_FIELD_ORDER; } pub type GrumpkinPrimeField = MontgomeryBackendPrimeField; /// A trait to generate random field elements. pub trait Random { fn random() -> Self; } impl Random for FieldElement where FieldElement: ByteConversion, { fn random() -> Self { use rand::Rng; let mut rng = rand::rng(); let bits = F::field_bit_size(); let bytes = bits.div_ceil(8); // Round up to nearest byte let random_bytes: Vec = (0..bytes).map(|_| rng.random()).collect(); let random_num = BigUint::from_bytes_be(&random_bytes); // Try to convert to field element element_from_biguint::(&random_num) } } pub struct CurveParams { pub curve_id: CurveID, pub a: FieldElement, pub b: FieldElement, pub b20: FieldElement, pub b21: FieldElement, pub g_x: FieldElement, pub g_y: FieldElement, pub g2_x: Option<[FieldElement; 2]>, // Only for pairing curves pub g2_y: Option<[FieldElement; 2]>, // Only for pairing curves pub n: BigUint, // Order of the curve pub h: u32, // Cofactor pub x: i128, pub fp_generator: FieldElement, pub irreducible_polys: HashMap, pub loop_counter: &'static [i8], pub nr_a0: u64, // E2 non residue pub eigen_value: Option, // Endomorphism eigenvalue pub swu_params: Option>, } pub struct SWUParams { pub a: FieldElement, pub b: FieldElement, pub z: FieldElement, } pub fn get_irreducible_poly>( ext_degree: usize, ) -> Polynomial { let coeffs = (F::get_curve_params().irreducible_polys)[&ext_degree]; fn lift(c: i8) -> FieldElement { if c >= 0 { FieldElement::from(c as u64) } else { -FieldElement::from(-c as u64) } } Polynomial::new(coeffs.iter().map(|x| lift::(*x)).collect()) } /// A trait that provides curve parameters for a specific field type. pub trait CurveParamsProvider { fn get_curve_params() -> CurveParams; } /// A trait to convert a BigUint into a FieldElement. pub trait FromBigUint { fn from_biguint(num: BigUint) -> FieldElement; } impl CurveParamsProvider for SECP256K1PrimeField { fn get_curve_params() -> CurveParams { CurveParams { curve_id: CurveID::SECP256K1, a: FieldElement::zero(), b: FieldElement::from_hex_unchecked("7"), b20: FieldElement::zero(), // Provide appropriate values here b21: FieldElement::zero(), // Provide appropriate values here g_x: FieldElement::from_hex_unchecked( "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", ), g_y: FieldElement::from_hex_unchecked( "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", ), g2_x: None, g2_y: None, n: BigUint::from_str_radix( "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16, ) .unwrap(), h: 1, x: 0, // Replace with actual 'x' fp_generator: FieldElement::from(3), irreducible_polys: HashMap::from([]), // Provide appropriate values here loop_counter: &[], // Provide appropriate values here nr_a0: 0, // Provide appropriate values here eigen_value: Some( BigInt::from_str_radix( "5363AD4CC05C30E0A5261C028812645A122E22EA20816678DF02967C1B23BD72", 16, ) .unwrap(), ), swu_params: None, } } } impl CurveParamsProvider for SECP256R1PrimeField { fn get_curve_params() -> CurveParams { CurveParams { curve_id: CurveID::SECP256R1, a: FieldElement::from_hex_unchecked( "ffffffff00000001000000000000000000000000fffffffffffffffffffffffc", ), b: FieldElement::from_hex_unchecked( "5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", ), b20: FieldElement::zero(), // Provide appropriate values here b21: FieldElement::zero(), // Provide appropriate values here g_x: FieldElement::from_hex_unchecked( "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", ), g_y: FieldElement::from_hex_unchecked( "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", ), g2_x: None, g2_y: None, n: BigUint::from_str_radix( "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", 16, ) .unwrap(), h: 1, x: 0, // Replace with actual 'x' fp_generator: FieldElement::from(6), irreducible_polys: HashMap::from([]), // Provide appropriate values here loop_counter: &[], // Provide appropriate values here nr_a0: 0, // Provide appropriate values here eigen_value: None, // SECP256R1 does not have a known endomorphism eigenvalue for GLV swu_params: None, } } } impl CurveParamsProvider for X25519PrimeField { fn get_curve_params() -> CurveParams { CurveParams { curve_id: CurveID::X25519, a: FieldElement::from_hex_unchecked( "0x5d4eacd3a5b9bee63197e10d617b3dd66bb8b65d0ca52af7ac71e18ef8bc172d", ), b: FieldElement::from_hex_unchecked( "0x1d11b29bcfd0b3e0550ddb06105780d5f54831976b9fbc329004ebc1f364b2a4", ), b20: FieldElement::zero(), // Provide appropriate values here b21: FieldElement::zero(), // Provide appropriate values here g_x: FieldElement::from_hex_unchecked( "2a78dd0fd02c0339f00b8f02f1c20618a9c13fdf0d617c9aca55c89b025aef35", ), g_y: FieldElement::from_hex_unchecked( "29c644a5c71da22ebe483ba563798323cf6fd061807131659b7830f3f62c1d14", ), g2_x: None, g2_y: None, n: BigUint::from_str_radix( "1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED", 16, ) .unwrap(), h: 8, x: 0, // Replace with actual 'x' fp_generator: FieldElement::from(6), irreducible_polys: HashMap::from([]), // Provide appropriate values here loop_counter: &[], // Provide appropriate values here nr_a0: 0, // Provide appropriate values here eigen_value: None, // X25519 (Edwards/Montgomery) does not typically use this type of endomorphism swu_params: None, } } } impl CurveParamsProvider for GrumpkinPrimeField { fn get_curve_params() -> CurveParams { CurveParams { curve_id: CurveID::GRUMPKIN, a: FieldElement::from_hex_unchecked("0"), b: FieldElement::from_hex_unchecked( "0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffff0", ), b20: FieldElement::zero(), b21: FieldElement::zero(), g_x: FieldElement::from_hex_unchecked("0x1"), g_y: FieldElement::from_hex_unchecked( "0x2CF135E7506A45D632D270D45F1181294833FC48D823F272C", ), g2_x: None, g2_y: None, n: BigUint::from_str_radix( "30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47", 16, ) .unwrap(), h: 1, x: 0, // Replace with actual 'x' fp_generator: FieldElement::from(5), irreducible_polys: HashMap::from([]), // Provide appropriate values here loop_counter: &[], // Provide appropriate values here nr_a0: 0, // Provide appropriate values here eigen_value: None, // Grumpkin does not have a known endomorphism eigenvalue for GLV swu_params: None, } } } impl CurveParamsProvider for BN254PrimeField { fn get_curve_params() -> CurveParams { CurveParams { curve_id: CurveID::BN254, a: FieldElement::zero(), b: FieldElement::from(3), b20: FieldElement::from_hex_unchecked( "2B149D40CEB8AAAE81BE18991BE06AC3B5B4C5E559DBEFA33267E6DC24A138E5", ), b21: FieldElement::from_hex_unchecked( "009713B03AF0FED4CD2CAFADEED8FDF4A74FA084E52D1852E4A2BD0685C315D2", ), g_x: FieldElement::from_hex_unchecked("1"), // Replace with actual 'g_x' g_y: FieldElement::from_hex_unchecked("2"), // Replace with actual 'g_y' g2_x: Some([ FieldElement::from_hex_unchecked( "1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED", ), FieldElement::from_hex_unchecked( "198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2", ), ]), g2_y: Some([ FieldElement::from_hex_unchecked( "12C85EA5DB8C6DEB4AAB71808DCB408FE3D1E7690C43D37B4CE6CC0166FA7DAA", ), FieldElement::from_hex_unchecked( "090689D0585FF075EC9E99AD690C3395BC4B313370B38EF355ACDADCD122975B", ), ]), n: BigUint::from_str_radix( "30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001", 16, ) .unwrap(), h: 1, // Replace with actual 'h' x: 0x44E992B44A6909F1, fp_generator: FieldElement::from(3), irreducible_polys: HashMap::from([ (6, [82, 0, 0, -18, 0, 0, 1].as_slice()), (12, [82, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0, 0, 1].as_slice()), ]), loop_counter: &[ 0, 0, 0, -1, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, -1, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 0, 1, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 1, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, 0, 0, 1, 0, -1, 0, 1, ], nr_a0: 9, eigen_value: Some( BigInt::from_str_radix("B3C4D79D41A917585BFC41088D8DAAA78B17EA66B99C90DD", 16) .unwrap(), ), swu_params: None, } } } impl CurveParamsProvider for BLS12381PrimeField { fn get_curve_params() -> CurveParams { CurveParams { curve_id: CurveID::BLS12_381, a: FieldElement::zero(), b: FieldElement::from(4), b20: FieldElement::from_hex_unchecked("4"), b21: FieldElement::from_hex_unchecked("4"), g_x: FieldElement::from_hex_unchecked("17F1D3A73197D7942695638C4FA9AC0FC3688C4F9774B905A14E3A3F171BAC586C55E83FF97A1AEFFB3AF00ADB22C6BB"), // Replace with actual 'g_x' g_y: FieldElement::from_hex_unchecked("08B3F481E3AAA0F1A09E30ED741D8AE4FCF5E095D5D00AF600DB18CB2C04B3EDD03CC744A2888AE40CAA232946C5E7E1"), // Replace with actual 'g_y' g2_x: Some([ FieldElement::from_hex_unchecked("24AA2B2F08F0A91260805272DC51051C6E47AD4FA403B02B4510B647AE3D1770BAC0326A805BBEFD48056C8C121BDB8"), // Replace with actual 'g2_x.0' FieldElement::from_hex_unchecked("13E02B6052719F607DACD3A088274F65596BD0D09920B61AB5DA61BBDC7F5049334CF11213945D57E5AC7D055D042B7E"), // Replace with actual 'g2_x.1' ]), g2_y: Some([ FieldElement::from_hex_unchecked("CE5D527727D6E118CC9CDC6DA2E351AADFD9BAA8CBDD3A76D429A695160D12C923AC9CC3BACA289E193548608B82801"), // Replace with actual 'g2_y.0' FieldElement::from_hex_unchecked("606C4A02EA734CC32ACD2B02BC28B99CB3E287E85A763AF267492AB572E99AB3F370D275CEC1DA1AAA9075FF05F79BE"), // Replace with actual 'g2_y.1' ]), n: BigUint::from_str_radix( "73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF00000001", 16, ) .unwrap(), h: 1, // Replace with actual 'h' x: -0xD201000000010000, fp_generator: FieldElement::from(3), irreducible_polys: HashMap::from([ (6, [2, 0, 0, -2, 0, 0, 1].as_slice()), (12, [2, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 1].as_slice()), ]), loop_counter: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, ], nr_a0: 1, eigen_value: Some( BigInt::from_str_radix("AC45A4010001A40200000000FFFFFFFF", 16).unwrap(), ), swu_params: Some(SWUParams { a: FieldElement::from_hex_unchecked("144698A3B8E9433D693A02C96D4982B0EA985383EE66A8D8E8981AEFD881AC98936F8DA0E0F97F5CF428082D584C1D"), b: FieldElement::from_hex_unchecked("12E2908D11688030018B12E8753EEE3B2016C1F0F24F4070A0B9C14FCEF35EF55A23215A316CEAA5D1CC48E98E172BE0"), z: FieldElement::from_hex_unchecked("B"), }), } } } pub trait ToWeierstrassCurve { fn to_weirstrass( x_twisted: FieldElement, y_twisted: FieldElement, ) -> ( FieldElement, FieldElement, ); } pub trait ToTwistedEdwardsCurve { fn to_twistededwards( x_weierstrass: FieldElement, y_weierstrass: FieldElement, ) -> ( FieldElement, FieldElement, ); } impl ToWeierstrassCurve for X25519PrimeField { fn to_weirstrass( x_twisted: FieldElement, y_twisted: FieldElement, ) -> ( FieldElement, FieldElement, ) { let a = element_from_biguint::(&biguint_from_hex( "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC", )); // Replace with actual a_twisted let d = element_from_biguint::(&biguint_from_hex( "0x52036CEE2B6FFE738CC740797779E89800700A4D4141D8AB75EB4DCA135978A3", )); // Replace with actual d_twisted let x = (FieldElement::::from(5) * a + a * y_twisted - FieldElement::::from(5) * d * y_twisted - d) * (FieldElement::::from(12) - FieldElement::::from(12) * y_twisted) .inv() .unwrap(); let y = (a + a * y_twisted - d * y_twisted - d) * (FieldElement::::from(4) * x_twisted - FieldElement::::from(4) * x_twisted * y_twisted) .inv() .unwrap(); (x, y) } } impl ToTwistedEdwardsCurve for X25519PrimeField { fn to_twistededwards( x_weierstrass: FieldElement, y_weierstrass: FieldElement, ) -> ( FieldElement, FieldElement, ) { let a = element_from_biguint::(&biguint_from_hex( "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC", )); // Replace with actual a_twisted let d = element_from_biguint::(&biguint_from_hex( "0x52036CEE2B6FFE738CC740797779E89800700A4D4141D8AB75EB4DCA135978A3", )); // Replace with actual d_twisted let y = (FieldElement::::from(5) * a - FieldElement::::from(12) * x_weierstrass - d) * (-FieldElement::::from(12) * x_weierstrass - a + FieldElement::::from(5) * d) .inv() .unwrap(); let x = (a + a * y - d * y - d) * (FieldElement::::from(4) * y_weierstrass - FieldElement::::from(4) * y_weierstrass * y) .inv() .unwrap(); (x, y) } } pub fn get_modulus_from_curve_id(curve_id: CurveID) -> BigUint { match curve_id { CurveID::BN254 => biguint_from_hex("0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47"), CurveID::BLS12_381 => biguint_from_hex("0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAB"), CurveID::SECP256K1 => biguint_from_hex("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"), CurveID::SECP256R1 => biguint_from_hex("0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"), CurveID::X25519 => biguint_from_hex("0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED"), CurveID::GRUMPKIN => biguint_from_hex("0x30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001"), } } #[cfg(test)] mod tests { use super::{CurveParamsProvider, ToTwistedEdwardsCurve, ToWeierstrassCurve, X25519PrimeField}; #[test] fn test_to_weierstrass_and_back() { let curve = X25519PrimeField::get_curve_params(); let x_weirstrass = curve.g_x; let y_weirstrass = curve.g_y; let (x_twisted, y_twisted) = X25519PrimeField::to_twistededwards(x_weirstrass.clone(), y_weirstrass.clone()); let (x_weirstrass_back, y_weirstrass_back) = X25519PrimeField::to_weirstrass(x_twisted, y_twisted); assert_eq!(x_weirstrass, x_weirstrass_back); assert_eq!(y_weirstrass, y_weirstrass_back); } } ================================================ FILE: tools/garaga_rs/src/ecip/core.rs ================================================ use crate::algebra::polynomial::Polynomial; use crate::definitions::FieldElement; use lambdaworks_math::field::traits::IsPrimeField; use lambdaworks_math::traits::ByteConversion; use crate::algebra::g1point::G1Point; use crate::algebra::rational_function::{FunctionFelt, RationalFunction}; use crate::definitions::{ BLS12381PrimeField, BN254PrimeField, CurveParamsProvider, GrumpkinPrimeField, SECP256K1PrimeField, SECP256R1PrimeField, X25519PrimeField, }; use crate::ecip::ff::FF; use crate::io::{ field_elements_from_big_uints, field_elements_to_big_uints, parse_g1_points_from_flattened_field_elements_list, }; use num_bigint::{BigInt, BigUint, ToBigInt}; pub fn zk_ecip_hint( points: Vec, scalars: Vec, curve_id: usize, ) -> Result<[Vec; 5], String> { match curve_id { 0 => handle_curve::(points, scalars, field_elements_from_big_uints), 1 => handle_curve::(points, scalars, field_elements_from_big_uints), 2 => handle_curve::(points, scalars, field_elements_from_big_uints), 3 => handle_curve::(points, scalars, field_elements_from_big_uints), 4 => handle_curve::(points, scalars, field_elements_from_big_uints), 5 => handle_curve::(points, scalars, field_elements_from_big_uints), _ => Err(String::from("Invalid curve ID")), } } fn handle_curve( values: Vec, scalars: Vec, parse_fn: fn(&[BigUint]) -> Vec>, ) -> Result<[Vec; 5], String> where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { let elements = parse_fn(&values); let points = parse_g1_points_from_flattened_field_elements_list(&elements)?; let (q, sum_dlog) = run_ecip(&points, &scalars); Ok(prepare_result(&q, &sum_dlog)) } fn construct_digits_vectors>( list: &[BigUint], ) -> Vec> { let mut dss_ = Vec::new(); for scalar_biguint in list { let neg_3_digits = neg_3_base_le(scalar_biguint); dss_.push(neg_3_digits); } let max_len = dss_.iter().map(|ds| ds.len()).max().unwrap(); dss_.iter_mut().for_each(|ds| { while ds.len() < max_len { ds.push(0); } }); // Transpose the matrix let mut dss = Vec::new(); for i in 0..max_len { let ds: Vec<_> = dss_.iter().map(|d| d[i]).collect(); dss.push(ds); } dss } pub fn neg_3_base_le(scalar: &BigUint) -> Vec { if scalar == &BigUint::from(0u32) { return vec![0]; } let mut iscalar = scalar.to_bigint().unwrap(); let mut digits = Vec::new(); let three = BigInt::from(3); let one = BigInt::from(1); let min_one = BigInt::from(-1); let zero = BigInt::from(0); let two = BigInt::from(2); while iscalar != zero { let mut remainder = iscalar.clone() % three.clone(); if remainder < zero { remainder += three.clone(); } if remainder == two { remainder = min_one.clone(); iscalar += one.clone(); } digits.push(remainder.try_into().unwrap()); iscalar = -floor_division(iscalar.clone(), three.clone()); // Use floor division } digits } fn floor_division(a: BigInt, b: BigInt) -> BigInt { let div = &a / &b; let rem = &a % &b; if (rem != BigInt::from(0)) && ((rem < BigInt::from(0)) != (b < BigInt::from(0))) { div - BigInt::from(1) } else { div } } pub fn run_ecip(points: &[G1Point], scalars: &[BigUint]) -> (G1Point, FunctionFelt) where F: IsPrimeField + CurveParamsProvider, { let dss = construct_digits_vectors::(scalars); // println!("Running ecip"); let (q, divisors) = ecip_functions(points, dss); // println!("Calculating dlogs"); let dlogs: Vec<_> = divisors.iter().map(|d| dlog(d.clone())).collect(); let mut sum_dlog = dlogs[0].clone(); let minus_three = FieldElement::::zero() - FieldElement::::from(3); let mut neg_3_power = FieldElement::::one(); for dlog in dlogs.iter().skip(1) { neg_3_power *= minus_three.clone(); sum_dlog = sum_dlog + dlog.clone().scale_by_coeff(neg_3_power.clone()); } // let sum_dlog = sum_dlog.simplify(); (q, sum_dlog) } fn prepare_result(q: &G1Point, sum_dlog: &FunctionFelt) -> [Vec; 5] where F: IsPrimeField, FieldElement: ByteConversion, { let q_list = &[q.x.clone(), q.y.clone()]; let a_num_list = &sum_dlog.a.numerator.coefficients; let a_den_list = &sum_dlog.a.denominator.coefficients; let b_num_list = &sum_dlog.b.numerator.coefficients; let b_den_list = &sum_dlog.b.denominator.coefficients; [ field_elements_to_big_uints(q_list), field_elements_to_big_uints(a_num_list), field_elements_to_big_uints(a_den_list), field_elements_to_big_uints(b_num_list), field_elements_to_big_uints(b_den_list), ] } // Equivalent to line(p, p.neg()), converted to a polynomial fn line_p_p_neg>(p: &G1Point) -> FF { if p.is_infinity() { // 1 + 0 * y. return FF::new(vec![Polynomial::new(vec![FieldElement::one()])]); } // (-px + x) + 0 * y FF::new(vec![Polynomial::new(vec![-&p.x, FieldElement::one()])]) } // Equivalent to (line(a, a.neg()) * line(b, b.neg())).to_poly() fn mul_line_line_p_p_neg(p: &G1Point, q: &G1Point) -> Polynomial { if p.is_infinity() { // 1 if q.is_infinity() { // 1 Polynomial::one() } else { // -qx + X Polynomial::new(vec![-&q.x, FieldElement::one()]) } } else if q.is_infinity() { // -px + X Polynomial::new(vec![-&p.x, FieldElement::one()]) } else { // (-px+X) * (-qx+X) = px*qx -px * X - qx* X + X^2 = px*qx -(px + qx)X + X^2 Polynomial::new(vec![&p.x * &q.x, -&p.x - &q.x, FieldElement::one()]) } } fn line>(p: &G1Point, q: &G1Point) -> FF { if p.is_infinity() { if q.is_infinity() { return FF::new(vec![Polynomial::new(vec![FieldElement::one()])]); } else { let qx = q.x.clone(); return FF::new(vec![Polynomial::new(vec![-qx, FieldElement::one()])]); } } if q.is_infinity() { let px = p.x.clone(); return FF::new(vec![Polynomial::new(vec![-px, FieldElement::one()])]); } let px = p.x.clone(); let py = p.y.clone(); let three: FieldElement = FieldElement::from(3); if p == q { let m = (three * &px.square() + F::get_curve_params().a) / (py.double()); let m = m.unwrap(); let b = py - &m * px; return FF::new(vec![ Polynomial::new(vec![-b, -m]), Polynomial::new(vec![FieldElement::one()]), ]); } if p == &q.neg() { return FF::new(vec![Polynomial::new(vec![-px, FieldElement::one()])]); } let qx = q.x.clone(); let qy = q.y.clone(); let m = (py - &qy) / (px - &qx); let m = m.unwrap(); let b = qy - &m * qx; FF::new(vec![ Polynomial::new(vec![-b, -m]), Polynomial::new(vec![FieldElement::one()]), ]) } fn construct_function>(ps: Vec>) -> FF { if ps.is_empty() { return FF::new(vec![Polynomial::new(vec![FieldElement::one()])]); } let mut xs: Vec<(G1Point, FF)> = ps.iter().map(|p| (p.clone(), line_p_p_neg(p))).collect(); while xs.len() != 1 { let mut xs2: Vec<(G1Point, FF)> = Vec::new(); let x0 = if !xs.len().is_multiple_of(2) { let x0 = xs[0].clone(); xs.remove(0); Some(x0) } else { None }; for n in 0..(xs.len() / 2) { let (a, a_num) = &xs[2 * n]; let (b, b_num) = &xs[2 * n + 1]; let a_num_b_num = a_num * b_num; let line_ab = line(a, b); let product = a_num_b_num * line_ab; let num = product.reduce(); let den = mul_line_line_p_p_neg(a, b); let d = num.div_by_poly(&den); xs2.push((a.add(b), d)); } if let Some(x0) = x0 { xs2.push(x0); } xs = xs2; } assert!(xs[0].0.is_infinity(), "xs[0] is not infinity"); xs.last().unwrap().1.normalize() } fn row_function>( ds: Vec, ps: &[G1Point], q: G1Point, ) -> (FF, G1Point) { let one = 1; let minus_one = -1; let digits_points: Vec> = ds .iter() .zip(ps.iter()) .map(|(&d, p)| { if d == one { p.clone() } else if d == minus_one { p.neg() } else { G1Point::new_infinity() } }) .collect(); let sum_digits_points = digits_points .iter() .cloned() .reduce(|x, y| x.add(&y)) .unwrap(); let q2 = q.scalar_mul_neg_3().add(&sum_digits_points); let q_neg = q.neg(); // Pre-allocate with exact capacity to avoid reallocations let mut div = Vec::with_capacity(4 + digits_points.len()); // Push negated points without cloning div.push(q_neg.clone()); // Only clone once div.push(q_neg.clone()); div.push(q_neg.clone()); div.push(q2.neg()); // Extend with non-infinity points directly to avoid double filtering div.extend(digits_points.iter().filter(|p| !p.is_infinity()).cloned()); let d = construct_function(div); (d, q2) } fn ecip_functions>( bs: &[G1Point], dss: Vec>, ) -> (G1Point, Vec>) { let mut dss = dss; dss.reverse(); let mut q = G1Point::new_infinity(); let mut divisors: Vec> = Vec::new(); for ds in dss.iter() { let (div, new_q) = row_function(ds.clone(), bs, q); divisors.push(div); q = new_q; } divisors.reverse(); (q, divisors) } fn dlog>(d: FF) -> FunctionFelt { let d = d.reduce(); assert!( d.coeffs.len() == 2, "D has {} coeffs: {:?}", d.coeffs.len(), d.coeffs ); let dx = FF::new(vec![ d.coeffs[0].differentiate(), d.coeffs[1].differentiate(), ]); let dy = d.coeffs[1].clone(); let two_y = FF::::new(vec![ Polynomial::::zero(), Polynomial::new(vec![FieldElement::::from(2)]), ]); let poly = dy.clone() * Polynomial::::new(vec![ F::get_curve_params().a, FieldElement::zero(), FieldElement::from(3), ]); let u = dx * two_y.clone() + FF::new(vec![poly, Polynomial::zero()]); let v = two_y * d; let num = (u * v.clone().neg_y()).reduce(); let den_ff = (v.clone() * v.neg_y()).reduce(); assert!( den_ff.coeffs[1].degree() == -1, "Den[1] is not zero: {:?}", den_ff.coeffs[1].degree() ); let den = den_ff.coeffs[0].clone(); let den_lead_inv = den.leading_coefficient().inv().unwrap(); let (_, _, gcd_0) = Polynomial::xgcd(&num.coeffs[0], &den); let (_, _, gcd_1) = Polynomial::xgcd(&num.coeffs[1], &den); let a_num = num.coeffs[0].divfloor(&gcd_0); let a_den = den.divfloor(&gcd_0); let b_num = num.coeffs[1].divfloor(&gcd_1); let b_den = den.divfloor(&gcd_1); FunctionFelt { a: RationalFunction::new( a_num.scale_by_coeff(&den_lead_inv), a_den.scale_by_coeff(&a_den.leading_coefficient().inv().unwrap()), ), b: RationalFunction::new( b_num.scale_by_coeff(&den_lead_inv), b_den.scale_by_coeff(&b_den.leading_coefficient().inv().unwrap()), ), } } ================================================ FILE: tools/garaga_rs/src/ecip/ff.rs ================================================ use crate::algebra::polynomial::Polynomial; use crate::definitions::FieldElement; use lambdaworks_math::field::traits::IsPrimeField; use std::ops::{Add, Mul}; use crate::definitions::CurveParamsProvider; #[derive(Debug, Clone)] pub struct FF { pub coeffs: Vec>, } impl> FF { pub fn new(coeffs: Vec>) -> Self { FF { coeffs } } pub fn degree(&self) -> usize { self.coeffs.len() - 1 } pub fn neg_y(self) -> FF { if self.coeffs.len() < 2 { self } else { let mut coeff_neg = self.coeffs.clone(); for i in (1..coeff_neg.len()).step_by(2) { coeff_neg[i] = -&coeff_neg[i]; } FF { coeffs: coeff_neg } } } pub fn reduce(&self) -> FF { match self.coeffs.len() { 0 => FF { coeffs: vec![Polynomial::zero(), Polynomial::zero()], }, 1 => FF { coeffs: vec![self.coeffs[0].clone(), Polynomial::zero()], }, _ => { let mut deg_0_coeff = self.coeffs[0].clone(); let mut deg_1_coeff = self.coeffs[1].clone(); let curve_params = F::get_curve_params(); let a = curve_params.a; let b = curve_params.b; let mut y2 = Polynomial::new(vec![b, a, FieldElement::zero(), FieldElement::one()]); for (i, poly) in self.coeffs.iter().enumerate().skip(2) { if i % 2 == 0 { deg_0_coeff = deg_0_coeff + poly * &y2; } else { deg_1_coeff = deg_1_coeff + poly * &y2; y2 = &y2 * &y2; } } FF { coeffs: vec![deg_0_coeff, deg_1_coeff], } } } } pub fn normalize(&self) -> FF { let coeff = self.coeffs[0].coefficients[0].clone(); let inv_coeff: FieldElement = coeff.inv().unwrap(); FF { coeffs: self .coeffs .iter() .map(|c| c.scale_by_coeff(&inv_coeff)) .collect(), } } pub fn to_poly(&self) -> Polynomial { assert!(self.coeffs.len() == 1); self.coeffs[0].clone() } pub fn div_by_poly(&self, poly: &Polynomial) -> FF { let coeffs: Vec> = self .coeffs .iter() .map(|c| c.clone().div_with_ref(poly)) .collect(); // println!("Final coefficients after division: {:?}", coeffs); FF { coeffs } } pub fn print_as_sage_poly(&self) -> String { let mut string = String::new(); let coeffs = &self.coeffs; for (i, p) in coeffs.iter().rev().enumerate() { let coeff_str = p.print_as_sage_poly(); if i == coeffs.len() - 1 { if coeff_str.is_empty() { string.truncate(string.len().saturating_sub(2)); } else { string.push_str(&coeff_str); } } else if i == coeffs.len() - 2 { string.push_str(&format!("({})*y + ", coeff_str)); } else { string.push_str(&format!("({})*y^{} + ", coeff_str, coeffs.len() - i - 1)); } } string } } impl> Add for FF { type Output = Self; fn add(self, other: Self) -> Self::Output { let max_degree = self.coeffs.len().max(other.coeffs.len()); let mut coeffs = vec![Polynomial::zero(); max_degree]; for i in 0..self.coeffs.len() { coeffs[i] = &coeffs[i] + &self.coeffs[i]; } for i in 0..other.coeffs.len() { coeffs[i] = &coeffs[i] + &other.coeffs[i]; } FF::new(coeffs) } } impl> Mul for FF { type Output = Self; fn mul(self, other: Self) -> Self::Output { let max_degree = self.coeffs.len() + other.coeffs.len() - 1; let mut coeffs = vec![Polynomial::zero(); max_degree]; if self.coeffs.is_empty() || other.coeffs.is_empty() { return FF::new(vec![Polynomial::zero()]); } for (i, self_poly) in self.coeffs.iter().enumerate() { for (j, other_poly) in other.coeffs.iter().enumerate() { let product = self_poly * other_poly; coeffs[i + j] = &coeffs[i + j] + &product; } } FF::new(coeffs) } } impl> Mul for &FF { type Output = FF; fn mul(self, other: Self) -> Self::Output { let max_degree = self.coeffs.len() + other.coeffs.len() - 1; let mut coeffs = vec![Polynomial::zero(); max_degree]; if self.coeffs.is_empty() || other.coeffs.is_empty() { return FF::new(vec![Polynomial::zero()]); } for (i, self_poly) in self.coeffs.iter().enumerate() { for (j, other_poly) in other.coeffs.iter().enumerate() { let product = self_poly * other_poly; coeffs[i + j] = &coeffs[i + j] + &product; } } FF::new(coeffs) } } ================================================ FILE: tools/garaga_rs/src/frobenius.rs ================================================ use crate::algebra::polynomial::Polynomial; use crate::definitions::CurveID; use lambdaworks_math::field::element::FieldElement; use lambdaworks_math::field::traits::IsPrimeField; use std::collections::HashMap; type FrobeniusMap = HashMap)>>>; pub fn frobenius( frobenius_maps: &FrobeniusMap, x: &Polynomial, frob_power: usize, ext_degree: usize, ) -> Polynomial { let frobenius_map = frobenius_maps.get(&frob_power).unwrap(); assert!(x.coefficients.len() <= ext_degree); let mut frob = vec![]; for coeffs in frobenius_map.iter().take(x.coefficients.len()) { let mut v = FieldElement::from(0); for (index, constant) in coeffs { v += constant * &x.coefficients[*index]; } frob.push(v); } Polynomial::new(frob) } // returns only the indices required by multi_pairing_check (bn254: 1, 2, 3; bls12-381: 1) pub fn get_frobenius_maps_ext_degree_12(curve_id: CurveID) -> FrobeniusMap { match curve_id { CurveID::BN254 => HashMap::from([ (1, vec![ vec![ (0, FieldElement::from_hex("1").unwrap()), (6, FieldElement::from_hex("12").unwrap()), ], vec![ (1, FieldElement::from_hex("1d8c8daef3eee1e81b2522ec5eb28ded6895e1cdfde6a43f5daa971f3fa65955").unwrap()), (7, FieldElement::from_hex("217e400dc9351e774e34e2ac06ead4000d14d1e242b29c567e9c385ce480a71a").unwrap()), ], vec![ (2, FieldElement::from_hex("242b719062f6737b8481d22c6934ce844d72f250fd28d102c0d147b2f4d521a7").unwrap()), (8, FieldElement::from_hex("359809094bd5c8e1b9c22d81246ffc2e794e17643ac198484b8d9094aa82536").unwrap()), ], vec![ (3, FieldElement::from_hex("21436d48fcb50cc60dd4ef1e69a0c1f0dd2949fa6df7b44cbb259ef7cb58d5ed").unwrap()), (9, FieldElement::from_hex("18857a58f3b5bb3038a4311a86919d9c7c6c15f88a4f4f0831364cf35f78f771").unwrap()), ], vec![ (4, FieldElement::from_hex("2c84bbad27c3671562b7adefd44038ab3c0bbad96fc008e7d6998c82f7fc048b").unwrap()), (10, FieldElement::from_hex("c33b1c70e4fd11b6d1eab6fcd18b99ad4afd096a8697e0c9c36d8ca3339a7b5").unwrap()), ], vec![ (5, FieldElement::from_hex("1b007294a55accce13fe08bea73305ff6bdac77c5371c546d428780a6e3dcfa8").unwrap()), (11, FieldElement::from_hex("215d42e7ac7bd17cefe88dd8e6965b3adae92c974f501fe811493d72543a3977").unwrap()), ], vec![ (6, FieldElement::from_hex("30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd46").unwrap()), ], vec![ (1, FieldElement::from_hex("246996f3b4fae7e6a6327cfe12150b8e747992778eeec7e5ca5cf05f80f362ac").unwrap()), (7, FieldElement::from_hex("12d7c0c3ed42be419d2b22ca22ceca702eeb88c36a8b264dde75f4f798d6a3f2").unwrap()), ], vec![ (2, FieldElement::from_hex("16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2").unwrap()), (8, FieldElement::from_hex("c38dce27e3b2cae33ce738a184c89d94a0e78406b48f98a7b4f4463e3a7dba0").unwrap()), ], vec![ (3, FieldElement::from_hex("7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3").unwrap()), (9, FieldElement::from_hex("f20e129e47c9363aa7b569817e0966cba582096fa7a164080faed1f0d24275a").unwrap()), ], vec![ (4, FieldElement::from_hex("2c145edbe7fd8aee9f3a80b03b0b1c923685d2ea1bdec763c13b4711cd2b8126").unwrap()), (10, FieldElement::from_hex("3df92c5b96e3914559897c6ad411fb25b75afb7f8b1c1a56586ff93e080f8bc").unwrap()), ], vec![ (5, FieldElement::from_hex("12acf2ca76fd0675a27fb246c7729f7db080cb99678e2ac024c6b8ee6e0c2c4b").unwrap()), (11, FieldElement::from_hex("1563dbde3bd6d35ba4523cf7da4e525e2ba6a3151500054667f8140c6a3f2d9f").unwrap()), ], ]), (2, vec![ vec![ (0, FieldElement::from_hex("1").unwrap()), ], vec![ (1, FieldElement::from_hex("30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd49").unwrap()), ], vec![ (2, FieldElement::from_hex("30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48").unwrap()), ], vec![ (3, FieldElement::from_hex("30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd46").unwrap()), ], vec![ (4, FieldElement::from_hex("59e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe").unwrap()), ], vec![ (5, FieldElement::from_hex("59e26bcea0d48bacd4f263f1acdb5c4f5763473177ffffff").unwrap()), ], vec![ (6, FieldElement::from_hex("1").unwrap()), ], vec![ (7, FieldElement::from_hex("30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd49").unwrap()), ], vec![ (8, FieldElement::from_hex("30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48").unwrap()), ], vec![ (9, FieldElement::from_hex("30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd46").unwrap()), ], vec![ (10, FieldElement::from_hex("59e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe").unwrap()), ], vec![ (11, FieldElement::from_hex("59e26bcea0d48bacd4f263f1acdb5c4f5763473177ffffff").unwrap()), ], ]), (3, vec![ vec![ (0, FieldElement::from_hex("1").unwrap()), (6, FieldElement::from_hex("12").unwrap()), ], vec![ (1, FieldElement::from_hex("13d0c369615f7bb0b2bdfa8fef85fa07122bde8d67dfc8fabd3581ad840ddd76").unwrap()), (7, FieldElement::from_hex("18a0f4219f4fdff6fc2bf531eb331a053a35744cac285af5685d3f90eacf7a66").unwrap()), ], vec![ (2, FieldElement::from_hex("c3a5e9c462a654779c3e050c9ca2a428908a81264e2b5a5bf22f67654883ae6").unwrap()), (8, FieldElement::from_hex("2ce02aa5f9bf8cd65bdd2055c255cf9d9e08c1d9345582cc92fd973c74bd77f4").unwrap()), ], vec![ (3, FieldElement::from_hex("f20e129e47c9363aa7b569817e0966cba582096fa7a164080faed1f0d24275a").unwrap()), (9, FieldElement::from_hex("17ded419ed7be4f97fac149bfaefbac11b155498de227b850aea3f23790405d6").unwrap()), ], vec![ (4, FieldElement::from_hex("1bfe7b214c0294242fb81a8dccd8a9b4441d64f34150a79753fb0cd31cc99cc0").unwrap()), (10, FieldElement::from_hex("697b9c523e0390ed15da0ec97a9b8346513297b9efaf0f0f1a228f0d5662fbd").unwrap()), ], vec![ (5, FieldElement::from_hex("7a0e052f2b1c443b5186d6ac4c723b85d3f78a3182d2db0c413901c32b0c6fe").unwrap()), (11, FieldElement::from_hex("1b76a37fba85f3cd5dc79824a3792597356c892c39c0d06b220500933945267f").unwrap()), ], vec![ (6, FieldElement::from_hex("30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd46").unwrap()), ], vec![ (1, FieldElement::from_hex("abf8b60be77d7306cbeee33576139d7f03a5e397d439ec7694aa2bf4c0c101").unwrap()), (7, FieldElement::from_hex("1c938b097fd2247905924b2691fb5e5685558c04009201927eeb0a69546f1fd1").unwrap()), ], vec![ (2, FieldElement::from_hex("4f1de41b3d1766fa9f30e6dec26094f0fdf31bf98ff2631380cab2baaa586de").unwrap()), (8, FieldElement::from_hex("2429efd69b073ae23e8c6565b7b72e1b0e78c27f038f14e77cfd95a083f4c261").unwrap()), ], vec![ (3, FieldElement::from_hex("28a411b634f09b8fb14b900e9507e9327600ecc7d8cf6ebab94d0cb3b2594c64").unwrap()), (9, FieldElement::from_hex("21436d48fcb50cc60dd4ef1e69a0c1f0dd2949fa6df7b44cbb259ef7cb58d5ed").unwrap()), ], vec![ (4, FieldElement::from_hex("23d5e999e1910a12feb0f6ef0cd21d04a44a9e08737f96e55fe3ed9d730c239f").unwrap()), (10, FieldElement::from_hex("1465d351952f0c0588982b28b4a8aea95364059e272122f5e8257f43bbb36087").unwrap()), ], vec![ (5, FieldElement::from_hex("16db366a59b1dd0b9fb1b2282a48633d3e2ddaea200280211f25041384282499").unwrap()), (11, FieldElement::from_hex("28c36e1fee7fdbe60337d84bbcba34a53a41f1ee50449cdc780cfbfaa5cc3649").unwrap()), ], ]), ]), CurveID::BLS12_381 => HashMap::from([ (1, vec![ vec![ (0, FieldElement::from_hex("1").unwrap()), (6, FieldElement::from_hex("2").unwrap()), ], vec![ (1, FieldElement::from_hex("18089593cbf626353947d5b1fd0c6d66bb34bc7585f5abdf8f17b50e12c47d65ce514a7c167b027b600febdb244714c5").unwrap()), (7, FieldElement::from_hex("18089593cbf626353947d5b1fd0c6d66bb34bc7585f5abdf8f17b50e12c47d65ce514a7c167b027b600febdb244714c5").unwrap()), ], vec![ (2, FieldElement::from_hex("5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffeffff").unwrap()), ], vec![ (9, FieldElement::from_hex("d5e1c086ffe8016d063c6dad7a2fffc9072bb5785a686bcefeedc2e0124838bdccf325ee5d80be9902109f7dbc79812").unwrap()), ], vec![ (4, FieldElement::from_hex("1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaad").unwrap()), (10, FieldElement::from_hex("1a0111ea397fe6998ce8d956845e1033efa3bf761f6622e9abc9802928bfc912627c4fd7ed3ffffb5dfb00000001aaaf").unwrap()), ], vec![ (5, FieldElement::from_hex("b659fb20274bfb1be8ff4d69163c08be7302c4818171fdd17d5be9b1d380acd8c747cdc4aff0e653631f5d3000f022c").unwrap()), (11, FieldElement::from_hex("b659fb20274bfb1be8ff4d69163c08be7302c4818171fdd17d5be9b1d380acd8c747cdc4aff0e653631f5d3000f022c").unwrap()), ], vec![ (6, FieldElement::from_hex("1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaaa").unwrap()), ], vec![ (1, FieldElement::from_hex("fc3e2b36c4e03288e9e902231f9fb854a14787b6c7b36fec0c8ec971f63c5f282d5ac14d6c7ec22cf78a126ddc4af3").unwrap()), (7, FieldElement::from_hex("1f87c566d89c06511d3d204463f3f70a9428f0f6d8f66dfd8191d92e3ec78be505ab5829ad8fd8459ef1424dbb895e6").unwrap()), ], vec![ (2, FieldElement::from_hex("1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac").unwrap()), (8, FieldElement::from_hex("1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac").unwrap()), ], vec![ (3, FieldElement::from_hex("6af0e0437ff400b6831e36d6bd17ffe48395dabc2d3435e77f76e17009241c5ee67992f72ec05f4c81084fbede3cc09").unwrap()), ], vec![ (10, FieldElement::from_hex("5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffefffe").unwrap()), ], vec![ (5, FieldElement::from_hex("144e4211384586c16bd3ad4afa99cc9170df3560e77982d0db45f3536814f0bd5871c1908bd478cd1ee605167ff82995").unwrap()), (11, FieldElement::from_hex("e9b7238370b26e88c8bb2dfb1e7ec4b7d471f3cdb6df2e24f5b1405d978eb56923783226654f19a83cd0a2cfff0a87f").unwrap()), ], ]), ]), _ => unimplemented!(), } } ================================================ FILE: tools/garaga_rs/src/hints/eisenstein.rs ================================================ use num_bigint::BigInt; use num_traits::{One, Signed, Zero}; /// Axial coordinates of the 6 unit directions in the hexagonal lattice. const NEIGHBOURS: [(i32, i32); 6] = [(1, 0), (0, 1), (-1, 1), (-1, 0), (0, -1), (1, -1)]; /// Symmetric integer rounding ⌊(z + d/2) / d⌋ valid for *any* sign of `z`. fn round_nearest(z: &BigInt, d: &BigInt) -> BigInt { debug_assert!(*d > BigInt::zero()); let half = d >> 1; // d / 2 if *z >= BigInt::zero() { (z + &half) / d } else { let quotient: BigInt = ((-z) + &half) / d; -quotient } } /* Represents an Eisenstein integer z = a0 + a1*ω, where ω = exp(2πi/3). ω satisfies ω^2 + ω + 1 = 0. Uses Python's built-in arbitrary-precision integers. Attributes: a0: The integer coefficient of 1. a1: The integer coefficient of ω. */ #[derive(Clone, Debug, Eq, PartialEq)] pub struct EisensteinInteger { pub a0: BigInt, pub a1: BigInt, } impl EisensteinInteger { /*Initializes an EisensteinInteger.*/ pub fn new(a0: BigInt, a1: BigInt) -> Self { Self { a0, a1 } } /*Sets the value of self to the value of other. Returns self.*/ pub fn set(&mut self, other: &Self) -> &Self { self.a0 = other.a0.clone(); self.a1 = other.a1.clone(); self } /*Sets the value of self to zero. Returns self.*/ pub fn set_zero(&mut self) -> &Self { self.a0 = BigInt::zero(); self.a1 = BigInt::zero(); self } /*Sets the value of self to one. Returns self.*/ pub fn set_one(&mut self) -> &Self { self.a0 = BigInt::one(); self.a1 = BigInt::zero(); self } /* Computes the complex conjugate. conj(a0 + a1*ω) = (a0 - a1) - a1*ω */ pub fn conjugate(&self) -> Self { Self::new(&self.a0 - &self.a1, -&self.a1) } /* Computes the norm N(self). N(a0 + a1*ω) = a0^2 + a1^2 - a0*a1 The norm is always non-negative. */ pub fn norm(&self) -> BigInt { &self.a0.pow(2) + &self.a1.pow(2) - &self.a0 * &self.a1 } /* Performs Euclidean division self / y using rounding to the NEAREST Eisenstein integer. This method guarantees norm(remainder) < norm(divisor). Args: y: The divisor (must be non-zero). Returns: A tuple (quotient, remainder). Raises: ZeroDivisionError: If y is zero. TypeError: If y is not an EisensteinInteger. */ /* ---------- Euclidean division in ℤ[ω] ---------- */ pub fn quo_rem(&self, y: &Self) -> Result<[Self; 2], String> { if y.is_zero() { return Err("division by zero EisensteinInteger".into()); } let nrm = y.norm(); // positive let num = self * &y.conjugate(); // still integer-only // first guess by independent symmetric rounding let mut q0 = round_nearest(&num.a0, &nrm); let mut q1 = round_nearest(&num.a1, &nrm); let mut q = Self::new(q0.clone(), q1.clone()); // Calculate product first, then subtract its reference let qy = &q * y; let mut r = self - &qy; // walk the neighbourhood until N(r) < N(y) (≤ 2 iterations) while r.norm() >= nrm { let mut best_q = None; let mut best_r = None; let mut best_n2 = r.norm(); // current (worst) remainder for (dp, dq) in NEIGHBOURS.iter() { let cand_q = Self::new(&q0 + dp, &q1 + dq); // Calculate product first, then subtract its reference let cand_qy = &cand_q * y; let cand_r = self - &cand_qy; let cand_n2 = cand_r.norm(); if cand_n2 < best_n2 { best_q = Some(cand_q); best_r = Some(cand_r); best_n2 = cand_n2; } } q = best_q.expect("Euclidean property violated"); r = best_r.unwrap(); q0 = q.a0.clone(); q1 = q.a1.clone(); // centre for 2nd lap } Ok([q, r]) } } impl std::fmt::Display for EisensteinInteger { /*Returns a user-friendly string representation (e.g., '3 + 2*ω').*/ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { if self.a1.is_zero() { write!(f, "{}", self.a0) } else { let a0_str = if !self.a0.is_zero() { format!("{}", self.a0) } else { "".into() }; let a1_str = if self.a1 == BigInt::one() { "ω".into() } else if self.a1 == (-1).into() { "-ω".into() } else { format!("{}*ω", self.a1) }; if a0_str.is_empty() { write!(f, "{}", a1_str) } else { let sign = if self.a1 > BigInt::zero() { " + " } else { " - " }; let a1_abs_str = if self.a1.abs() == BigInt::one() { "ω".into() } else { format!("{}*ω", self.a1.abs()) }; write!(f, "{}{}{}", a0_str, sign, a1_abs_str) } } } } impl std::ops::Neg for EisensteinInteger { type Output = Self; /*Computes the negation -self.*/ fn neg(self) -> Self::Output { Self { a0: -self.a0, a1: -self.a1, } } } impl std::ops::Add for EisensteinInteger { type Output = Self; /*Computes the sum self + other.*/ fn add(self, other: Self) -> Self::Output { &self + &other } } impl<'a> std::ops::Add<&'a EisensteinInteger> for &'a EisensteinInteger { type Output = EisensteinInteger; /*Computes the sum self + other.*/ fn add(self, other: Self) -> Self::Output { EisensteinInteger::new(&self.a0 + &other.a0, &self.a1 + &other.a1) } } impl std::ops::Sub for EisensteinInteger { type Output = Self; /*Computes the difference self - other.*/ fn sub(self, other: Self) -> Self::Output { &self - &other } } impl<'a> std::ops::Sub<&'a EisensteinInteger> for &'a EisensteinInteger { type Output = EisensteinInteger; /*Computes the difference self - other.*/ fn sub(self, other: Self) -> Self::Output { EisensteinInteger::new(&self.a0 - &other.a0, &self.a1 - &other.a1) } } impl std::ops::Mul for EisensteinInteger { type Output = Self; /* Computes the product self * other. Supports multiplication by another EisensteinInteger. Uses the identity (x0+x1ω)(y0+y1ω) = (x0y0 - x1y1) + (x0y1 + x1y0 - x1y1)ω. */ fn mul(self, other: Self) -> Self::Output { &self * &other } } impl<'a> std::ops::Mul<&'a EisensteinInteger> for &'a EisensteinInteger { type Output = EisensteinInteger; /* Computes the product self * other. Supports multiplication by another EisensteinInteger. Uses the identity (x0+x1ω)(y0+y1ω) = (x0y0 - x1y1) + (x0y1 + x1y0 - x1y1)ω. */ fn mul(self, other: Self) -> Self::Output { let (x0, x1) = (&self.a0, &self.a1); let (y0, y1) = (&other.a0, &other.a1); let res_a0 = x0 * y0 - x1 * y1; let res_a1 = x0 * y1 + x1 * y0 - x1 * y1; EisensteinInteger::new(res_a0, res_a1) } } impl std::ops::Mul for EisensteinInteger { type Output = Self; /*Computes the product self * int.*/ fn mul(self, other: BigInt) -> Self::Output { &self * &other } } impl<'a> std::ops::Mul<&'a BigInt> for &'a EisensteinInteger { type Output = EisensteinInteger; /*Computes the product self * int.*/ fn mul(self, other: &BigInt) -> Self::Output { other * self } } impl std::ops::Mul for BigInt { type Output = EisensteinInteger; /*Computes the product int * self.*/ fn mul(self, other: EisensteinInteger) -> Self::Output { &self * &other } } impl<'a> std::ops::Mul<&'a EisensteinInteger> for &'a BigInt { type Output = EisensteinInteger; /*Computes the product int * self.*/ fn mul(self, other: &EisensteinInteger) -> Self::Output { EisensteinInteger::new(self * &other.a0, self * &other.a1) } } impl std::ops::Div for EisensteinInteger { type Output = Self; /*Computes the quotient self // other using Euclidean rounding division.*/ fn div(self, other: Self) -> Self::Output { &self / &other } } impl<'a> std::ops::Div<&'a EisensteinInteger> for &'a EisensteinInteger { type Output = EisensteinInteger; /*Computes the quotient self // other using Euclidean rounding division.*/ fn div(self, other: Self) -> Self::Output { let [q, _] = self.quo_rem(other).unwrap(); q } } impl std::ops::Rem for EisensteinInteger { type Output = Self; /*Computes the remainder self % other using Euclidean rounding division.*/ fn rem(self, other: Self) -> Self::Output { &self % &other } } impl<'a> std::ops::Rem<&'a EisensteinInteger> for &'a EisensteinInteger { type Output = EisensteinInteger; /*Computes the remainder self % other using Euclidean rounding division.*/ fn rem(self, other: Self) -> Self::Output { let [_, r] = self.quo_rem(other).unwrap(); r } } impl Zero for EisensteinInteger { fn zero() -> Self { Self::new(BigInt::zero(), BigInt::zero()) } /*Checks if the value is zero.*/ fn is_zero(&self) -> bool { self.a0.is_zero() && self.a1.is_zero() } } impl One for EisensteinInteger { fn one() -> Self { Self::new(BigInt::one(), BigInt::zero()) } } /* Computes the partial GCD result using the Half-GCD approach based on norm reduction. Args: a: The first EisensteinInteger. b: The second EisensteinInteger. Returns: A tuple (w, v, u) such that w = a*u + b*v and norm(w) is approximately less than sqrt(norm(a)). The identity w = a*u + b*v always holds. Raises: TypeError: If inputs are not EisensteinInteger instances. ValueError: If the norm of 'a' is unexpectedly negative. RuntimeError: If the algorithm takes an excessive number of iterations. */ pub fn half_gcd( a: &EisensteinInteger, b: &EisensteinInteger, ) -> Result<[EisensteinInteger; 3], String> { // Initialize variables for the Extended Euclidean Algorithm let mut a_run = a.clone(); let mut b_run = b.clone(); let mut u = EisensteinInteger::one(); // Use class constant copies let mut v = EisensteinInteger::zero(); let mut u_ = EisensteinInteger::zero(); let mut v_ = EisensteinInteger::one(); // Invariants: a_run = a*u + b*v, b_run = a*u_ + b*v_ let norm_a = a.norm(); if norm_a < BigInt::zero() { return Err("Norm of input 'a' cannot be negative".into()); } // Calculate the termination threshold let limit = norm_a.sqrt(); // Loop while the norm of the 'smaller' value (b_run) is >= the limit let mut iteration = 0; let max_iterations = 20000; // Safety limit while b_run.norm() >= limit { if iteration > max_iterations { return Err(format!( "HalfGCD exceeded {} iterations for a={}, b={}", max_iterations, a, b )); } if b_run.is_zero() { break; // GCD is a_run } let [quotient, remainder] = match a_run.quo_rem(&b_run) { Ok(result) => result, _ => break, // Should ideally not happen if b_run.is_zero() check works }; // Update coefficients let next_u_ = u - "ient * &u_; let next_v_ = v - "ient * &v_; // Update state (a_run, b_run) = (b_run, remainder); (u, u_) = (u_, next_u_); (v, v_) = (v_, next_v_); iteration += 1; } // Return the final state corresponding to the Go implementation's return values // (b_run, v_, u_) which satisfy b_run = a*u_ + b*v_ Ok([b_run, v_, u_]) } #[allow(unused_imports)] mod tests { use super::*; #[test] fn test_01() -> Result<(), String> { let z1 = EisensteinInteger::new(3.into(), 2.into()); // 3 + 2ω let z2 = EisensteinInteger::new(1.into(), (-1).into()); // 1 - ω println!("z1 = {}", z1); println!("z2 = {}", z2); println!("z1 + z2 = {}", &z1 + &z2); println!("z1 - z2 = {}", &z1 - &z2); println!("z1 * z2 = {}", &z1 * &z2); println!("Norm(z1) = {}", z1.norm()); println!("Conj(z1) = {}", z1.conjugate()); println!("-z1 = {}", -z1.clone()); let [q, r] = z1.quo_rem(&z2)?; println!("z1 // z2 = {}", q); println!("z1 % z2 = {}", r); println!("Check: z2 * q + r = {}, Expected: {}", &(&z2 * &q) + &r, z1); assert_eq!(&(&z2 * &q) + &r, z1); // Half GCD example let a = EisensteinInteger::new(10.into(), 3.into()); let b = EisensteinInteger::new(3.into(), 1.into()); println!("\nHalf GCD for a = {}, b = {}", a, b); let [w, v_res, u_res] = half_gcd(&a, &b)?; println!(" w = {}", w); println!(" v = {}", v_res); println!(" u = {}", u_res); let check = &a * &u_res + &b * &v_res; println!(" Check: a*u + b*v = {}, Expected w: {}", check, w); println!(" Norm(w) = {}, Limit = {}", w.norm(), a.norm().sqrt()); assert_eq!(check, w); // a = EisensteinInteger(8+7j * (math.sqrt(3)/2 + 0.5j)) # Approximate large number let a_int = EisensteinInteger::new(13.into(), 14.into()); // Example large int coeffs let b_int = EisensteinInteger::new(5.into(), 3.into()); println!("\nHalf GCD for a = {}, b = {}", a_int, b_int); let [w, v_res, u_res] = half_gcd(&a_int, &b_int)?; println!(" w = {}", w); println!(" v = {}", v_res); println!(" u = {}", u_res); let check = &a_int * &u_res + &b_int * &v_res; println!(" Check: a*u + b*v = {}, Expected w: {}", check, w); println!(" Norm(w) = {}, Limit = {}", w.norm(), a_int.norm().sqrt()); assert_eq!(check, w); Ok(()) } } ================================================ FILE: tools/garaga_rs/src/hints/fake_glv.rs ================================================ use crate::algebra::g1point::G1Point; use crate::definitions::CurveParamsProvider; use crate::hints::eisenstein; use lambdaworks_math::field::traits::IsPrimeField; use num_bigint::{BigInt, BigUint, Sign, ToBigInt}; use num_integer::Integer; use num_traits::Signed; /* Represents a 2D lattice basis (V1, V2) derived from GLV decomposition. Attributes: V1: First basis vector [v11, v12]. V2: Second basis vector [v21, v22], chosen to be short. Det: Determinant of the lattice basis (v11*v22 - v12*v21). b1: Rounding coefficient derived from V2, used in scalar decomposition. b2: Rounding coefficient derived from V1, used in scalar decomposition. */ struct Lattice { v1: [BigInt; 2], v2: [BigInt; 2], det: BigInt, b1: BigInt, b2: BigInt, } /* Computes the first vector of a GLV lattice basis for a given modulus and input. This is a Python adaptation of a Go function likely used for cryptographic scalar multiplication optimizations (GLV method). Args: modu (int): The modulus (often the group order `r`). input_val (int): The input value (often the eigenvalue `lambda`). Returns: Tuple[int, int]: The components (v11, |v12|) of the first basis vector V1. */ pub fn half_gcd(modu: &BigInt, input_val: &BigInt) -> Result<[BigInt; 2], String> { let lattice = precompute_lattice(modu, input_val)?; let output0 = lattice.v1[0].clone(); let output1 = lattice.v1[1].clone(); // The GLV decomposition often requires the absolute value of the second component. Ok([output0, output1.abs()]) } /* Computes a short 2D lattice basis related to parameters (r, lambda). Uses a variant of the Extended Euclidean Algorithm to find short vectors (v1, v2) such that v1 = [a, b] and v2 = [c, d] satisfy a + b*lambda = 0 (mod r) and c + d*lambda = 0 (mod r). See https://www.iacr.org/archive/crypto2001/21390189.pdf (Algorithm 3.7) Args: r (int): The modulus. lam (int): The lambda value (e.g., eigenvalue in GLV). Returns: Lattice: An object containing the lattice basis vectors (V1, V2), determinant (Det), and rounding coefficients (b1, b2). Raises: ValueError: If intermediate steps lead to division by zero (e.g., lam=0 mod r) or if the final determinant is zero. */ fn precompute_lattice(r: &BigInt, lam: &BigInt) -> Result { // Extended Euclidean Algorithm State: [[value, s_coeff, t_coeff], ...] // We maintain two states [ri, si, ti] such that ri = si*r + ti*lambda let mut euclidean_state = [ [r.clone(), 1.into(), 0.into()], // Corresponds to r = 1*r + 0*lambda [lam.clone(), 0.into(), 1.into()], // Corresponds to lam = 0*r + 1*lambda ]; // Compute the integer square root of r as the termination threshold let sqrt_r = r.sqrt(); // Run Euclidean algorithm until the remainder (state[1][0]) is smaller than sqrt(r) while euclidean_state[1][0].abs() >= sqrt_r { let [current_rem, s_curr, t_curr] = euclidean_state[1].clone(); let [prev_rem, s_prev, t_prev] = euclidean_state[0].clone(); if current_rem == 0.into() { // This occurs if lambda is a multiple of r or lambda is 0. return Err("Division by zero in Euclidean algorithm. Check inputs r and lam.".into()); } let quotient = prev_rem.div_floor(¤t_rem); let next_rem = prev_rem.mod_floor(¤t_rem); // Update coefficients using the identity: R_next = R_prev - q * R_curr // where R represents [rem, s, t] let s_next = &s_prev - &s_curr * "ient; let t_next = &t_prev - &t_curr * "ient; // Shift states: current becomes previous, new becomes current euclidean_state[0] = [current_rem, s_curr, t_curr]; euclidean_state[1] = [next_rem, s_next, t_next]; } // One final step to potentially find a shorter vector combination let [current_rem, _s_curr, t_curr] = euclidean_state[1].clone(); let [prev_rem, _s_prev, t_prev] = euclidean_state[0].clone(); if current_rem == 0.into() { return Err( "Division by zero in Euclidean algorithm final step. Check inputs r and lam.".into(), ); } let quotient = prev_rem.div_floor(¤t_rem); // Calculate the next potential remainder and t-coefficient let final_rem = prev_rem.mod_floor(¤t_rem); let final_t = &t_prev - &t_curr * "ient; // First basis vector: V1 = [current_rem, -t_curr] // Satisfies current_rem + (-t_curr)*lambda = 0 mod r (since current_rem = s_curr*r + t_curr*lambda) let v1_list = [current_rem.clone(), -t_curr]; // Candidate vectors for the second basis vector V2 // Candidate 1: [prev_rem, -t_prev] let cand1 = [prev_rem.clone(), -t_prev]; // Candidate 2: [final_rem, -final_t] let cand2 = [final_rem.clone(), -final_t]; // Choose the shorter candidate vector based on squared Euclidean norm (||v||^2 = x^2 + y^2) let norm1_sq = cand1[0].pow(2) + cand1[1].pow(2); let norm2_sq = cand2[0].pow(2) + cand2[1].pow(2); let v2_list = if norm1_sq > norm2_sq { cand2 } else { cand1 }; // Calculate the determinant of the chosen basis {V1, V2} let det = &v1_list[0] * &v2_list[1] - &v1_list[1] * &v2_list[0]; if det == 0.into() { // Basis vectors are linearly dependent, which shouldn't happen for typical inputs. return Err("Lattice determinant is zero. Input parameters might be unsuitable.".into()); } /* Computes round(a / b), rounding ties away from zero. Equivalent to standard mathematical rounding, differs from Python's default round() which rounds ties to the nearest even number. Needed to potentially match specific Go implementation behavior. */ fn round_half_away_from_zero(a: &BigInt, b: &BigInt) -> Result { if *b == 0.into() { return Err("Division by zero in rounding.".into()); } // Perform division using absolute values let (mut quotient, remainder) = a.abs().div_rem(&b.abs()); // Check if the remainder is large enough to round up (away from zero) if remainder * 2 >= b.abs() { quotient += 1; } // Restore the sign based on the original signs of a and b if (*a < 0.into()) != (*b < 0.into()) { Ok(-quotient) // Result is negative } else { Ok(quotient) // Result is positive } } // Compute rounding coefficients b1, b2 used in scalar decomposition // n is calculated to ensure 2^n is sufficiently larger than |det|, // potentially matching Go's fixed-size integer/word alignment logic. // The `+ 32 >> 6 << 6` part aligns the bit length to a multiple of 64. let n_bit_length = std::cmp::max(&1.into(), &det).bits(); // Use max(1,...) for robustness if det=0 (though checked above) let n = 2 * (((n_bit_length + 32) >> 6) << 6); // Calculate b1 = round(2^n * V2[1] / det) let b1 = round_half_away_from_zero(&(&v2_list[1] << n), &det)?; // Calculate b2 = round(2^n * V1[1] / det) let b2 = round_half_away_from_zero(&(&v1_list[1] << n), &det)?; // Return the results structured in the Lattice dataclass Ok(Lattice { v1: v1_list, v2: v2_list, det, b1, b2, }) } /* Splits a scalar s into components (u, v) using a precomputed GLV lattice. Based on the approach described in https://www.iacr.org/archive/crypto2001/21390189.pdf, this function finds a vector (u, v) such that s = u + v*lambda (mod r), where lambda and r are the parameters used to generate the lattice l. The vector (u, v) is typically chosen such that u and v have smaller magnitudes than s. Args: s: The scalar to split. l: The precomputed Lattice object containing basis V1, V2, determinant Det, and rounding coefficients b1, b2. Returns: A tuple (u, v) representing the scalar decomposition. */ fn split_scalar(s: &BigInt, l: &Lattice) -> [BigInt; 2] { // Calculate intermediate values k1, k2 using the scalar and rounding coefficients let mut k1 = s * &l.b1; let mut k2 = -(s * &l.b2); // Determine the shift amount 'n' used during lattice precomputation // This should match the logic in precompute_lattice let n_bit_length = std::cmp::max(1.into(), l.det.clone()).bits(); let n = 2 * (((n_bit_length + 32) >> 6) << 6); // Right-shift k1 and k2 to effectively divide by 2^n, // approximating division by the determinant Det. // This gives the integer coefficients for the closest lattice vector approximation. k1 >>= n; k2 >>= n; // Calculate the lattice vector w = k1*V1 + k2*V2 let w_vec0 = &k1 * &l.v1[0] + &k2 * &l.v2[0]; let w_vec1 = &k1 * &l.v1[1] + &k2 * &l.v2[1]; // Calculate the final decomposition (u, v) // u = s - w[0] // v = -w[1] let u = s - &w_vec0; let v = -w_vec1; [u, v] } pub fn half_gcd_eisenstein_hint( modulus: &BigInt, scalar: &BigInt, eigen_value: &BigInt, ) -> Result<[BigInt; 4], String> { let glv_basis = precompute_lattice(modulus, eigen_value)?; let r = eisenstein::EisensteinInteger::new(glv_basis.v1[0].clone(), glv_basis.v1[1].clone()); let scalar = if scalar % modulus == modulus - 1 { BigInt::from(1) } else { scalar.clone() }; let sp = split_scalar(&scalar, &glv_basis); let s = eisenstein::EisensteinInteger::new(sp[0].clone(), sp[1].clone()); // in-circuit we check that Q - [s]P = 0 or equivalently Q + [-s]P = 0 // so here we return -s instead of s. let s = -s; // println!("r: {}, \ns: {}", r, s); let [w, v_res, _] = eisenstein::half_gcd(&r, &s)?; // Note : outputs can be negative. Ok([ w.a0.clone(), w.a1.clone(), v_res.a0.clone(), v_res.a1.clone(), ]) } fn encode_value(value: &BigInt) -> BigUint { // Corresponds to Python: abs(value) + 2**128 if value < 0 else value let power_128_bigint: BigInt = BigInt::from(1) << 128; let power_128_biguint = power_128_bigint.to_biguint().unwrap(); // Safe because 2^128 > 0 if value.sign() == Sign::Minus { // Convert `value.abs()` (BigInt) to BigUint before adding power_128 (BigUint) value.abs().to_biguint().unwrap() + power_128_biguint } else { // value is non-negative, safe to convert to BigUint value.to_biguint().unwrap() } } fn encode_glv_fake_glv_hint(u1: &BigInt, u2: &BigInt, v1: &BigInt, v2: &BigInt) -> [BigUint; 4] { // Re-use the standalone encode_value function [ encode_value(u1), encode_value(u2), encode_value(v1), encode_value(v2), ] } /// Corresponds to Python `get_glv_fake_glv_hint`. /// Computes the GLV hint components (u1, u2, v1, v2) encoded for Cairo, and the scalar multiplication result Q. pub fn get_glv_fake_glv_hint( point: &G1Point, scalar: &BigUint, ) -> Result<(G1Point, BigUint, BigUint, BigUint, BigUint), String> where F: IsPrimeField + CurveParamsProvider, { let curve_params = F::get_curve_params(); let curve_n_bigint = curve_params.n.to_bigint().unwrap(); let scalar_bigint = scalar.to_bigint().unwrap(); // Get eigen_value from curve_params let eigen_value = match &curve_params.eigen_value { Some(ev) => ev, None => { return Err(format!( "Curve {:?} does not have a known endomorphism eigenvalue or is not supported here.", curve_params.curve_id )); } }; // Call half_gcd_eisenstein_hint to get raw u1, u2, v1, v2 let hint_result = half_gcd_eisenstein_hint(&curve_n_bigint, &scalar_bigint, eigen_value)?; let [u1_raw, u2_raw, v1_raw, v2_raw] = hint_result; // Encode the results for Cairo compatibility let encoded_hints = encode_glv_fake_glv_hint(&u1_raw, &u2_raw, &v1_raw, &v2_raw); let [u1_encoded, u2_encoded, v1_encoded, v2_encoded] = encoded_hints; // Compute Q = [scalar]P let q = point.scalar_mul(scalar_bigint.clone()); // Assumes G1Point::scalar_mul takes BigInt Ok((q, u1_encoded, u2_encoded, v1_encoded, v2_encoded)) } pub fn get_fake_glv_hint( point: &G1Point, scalar: &BigUint, ) -> Result<(G1Point, BigUint, BigUint), String> where F: IsPrimeField + CurveParamsProvider, { let curve_params = F::get_curve_params(); let curve_n_bigint = curve_params.n.to_bigint().unwrap(); let scalar_bigint = scalar.to_bigint().unwrap(); // Check if the curve has an endomorphism; if so, this hint shouldn't be used. if curve_params.eigen_value.is_some() { return Err(format!( "Curve {:?} has an endomorphism, use get_glv_fake_glv_hint instead", curve_params.curve_id )); } // Call precompute_lattice using the scalar as the 'lambda' parameter, // mimicking the Python implementation. let glv_basis = precompute_lattice(&curve_n_bigint, &scalar_bigint)?; let s1 = &glv_basis.v1[0]; let s2 = &glv_basis.v1[1]; // Assertions from Python code converted to Rust checks if (s1 + &scalar_bigint * s2).mod_floor(&curve_n_bigint) != BigInt::from(0) { return Err("Assertion failed: (s1 + scalar * s2) % curve.n != 0".to_string()); } // Check s1 > 0 and s2 != 0 if !(s1.sign() == Sign::Plus && s2.sign() != Sign::NoSign) { return Err("Assertion failed: !(s1 > 0 and s2 != 0)".to_string()); } // Compute Q = [scalar]P let q = point.scalar_mul(scalar_bigint.clone()); // Convert s1 (known positive) to BigUint let s1_biguint = s1.to_biguint().unwrap(); // Encode s2 let s2_encoded = encode_value(s2); Ok((q, s1_biguint, s2_encoded)) } #[allow(unused_imports)] mod tests { use super::*; use num_traits::Num; use rand::Rng; use std::str::FromStr; #[test] fn test_bn254() -> Result<(), String> { let mut rng = rand::rng(); for _ in 0..100 { let scalar = rng.random::().into(); let curve_n = BigInt::from_str_radix( "30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001", 16, ) .unwrap(); let eigen_value = BigInt::from_str_radix("B3C4D79D41A917585BFC41088D8DAAA78B17EA66B99C90DD", 16) .unwrap(); let [u1, u2, v1, v2] = half_gcd_eisenstein_hint(&curve_n, &scalar, &eigen_value)?; assert!( (&scalar * (&v1 + &eigen_value * &v2) + &u1 + &eigen_value * &u2) .mod_floor(&curve_n) == 0.into() ); } Ok(()) } #[test] fn test_bls12_381() -> Result<(), String> { use rand::Rng; let mut rng = rand::rng(); for _ in 0..100 { let scalar = rng.random::().into(); let curve_n = BigInt::from_str_radix( "73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF00000001", 16, ) .unwrap(); let eigen_value = BigInt::from_str_radix("AC45A4010001A40200000000FFFFFFFF", 16).unwrap(); let [u1, u2, v1, v2] = half_gcd_eisenstein_hint(&curve_n, &scalar, &eigen_value)?; assert!( (&scalar * (&v1 + &eigen_value * &v2) + &u1 + &eigen_value * &u2) .mod_floor(&curve_n) == 0.into() ); } Ok(()) } #[test] fn test_secp256k1() -> Result<(), String> { use rand::Rng; let mut rng = rand::rng(); for _ in 0..100 { let scalar = rng.random::().into(); let curve_n = BigInt::from_str_radix( "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16, ) .unwrap(); let eigen_value = BigInt::from_str_radix( "5363AD4CC05C30E0A5261C028812645A122E22EA20816678DF02967C1B23BD72", 16, ) .unwrap(); let [u1, u2, v1, v2] = half_gcd_eisenstein_hint(&curve_n, &scalar, &eigen_value)?; assert!( (&scalar * (&v1 + &eigen_value * &v2) + &u1 + &eigen_value * &u2) .mod_floor(&curve_n) == 0.into() ); } Ok(()) } } ================================================ FILE: tools/garaga_rs/src/io.rs ================================================ use crate::algebra::{ g1g2pair::G1G2Pair, g1point::G1Point, g2point::G2Point, rational_function::FunctionFelt, }; use crate::definitions::{CurveParamsProvider, FieldElement, Stark252PrimeField}; use lambdaworks_math::{ field::traits::{IsField, IsPrimeField, IsSubFieldOf}, traits::ByteConversion, }; use num_bigint::BigUint; use lambdaworks_math::unsigned_integer::element::U256; pub fn biguint_to_u256(x: &BigUint) -> U256 { U256::from_hex_unchecked(&x.to_str_radix(16)) } pub fn parse_g1_points_from_flattened_field_elements_list( values: &[FieldElement], ) -> Result>, String> where F: IsPrimeField + CurveParamsProvider, { values .chunks(2) .map(|chunk| G1Point::new(chunk[0].clone(), chunk[1].clone(), false)) .collect::, _>>() } pub fn parse_g1_g2_pairs_from_flattened_field_elements_list( values: &[FieldElement], ) -> Result>, String> where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { values .chunks(6) .map(|chunk| { let g1 = G1Point::new(chunk[0].clone(), chunk[1].clone(), false)?; let g2 = G2Point::new( [chunk[2].clone(), chunk[3].clone()], [chunk[4].clone(), chunk[5].clone()], )?; Ok(G1G2Pair::new(g1, g2)) }) .collect::, _>>() } pub fn field_elements_from_big_uints(values: &[BigUint]) -> Vec> where F: IsPrimeField, FieldElement: ByteConversion, { values.iter().map(element_from_biguint).collect() } pub fn element_from_biguint(value: &BigUint) -> FieldElement where F: IsPrimeField, FieldElement: ByteConversion, { element_from_bytes_be(&value.to_bytes_be()) } pub fn element_from_bytes_be(bytes: &[u8]) -> FieldElement where F: IsPrimeField, FieldElement: ByteConversion, { let length = F::field_bit_size().div_ceil(8); if bytes.len() > length { let x = BigUint::from_bytes_be(bytes); let p = biguint_from_hex(&F::modulus_minus_one().to_string()) + 1usize; return element_from_bytes_be(&(x % p).to_bytes_be()); } let pad_length = length - bytes.len(); let mut padded_bytes = vec![0u8; pad_length]; padded_bytes.extend(bytes); FieldElement::from_bytes_be(&padded_bytes).unwrap() // must never fail } pub fn field_elements_to_big_uints(values: &[FieldElement]) -> Vec where F: IsPrimeField, FieldElement: ByteConversion, { values.iter().map(element_to_biguint).collect() } pub fn element_to_biguint(x: &FieldElement) -> BigUint where F: IsPrimeField, FieldElement: ByteConversion, { BigUint::from_bytes_be(&x.to_bytes_be()) } pub fn felt252_to_element(x: &FieldElement) -> FieldElement where F: IsPrimeField, FieldElement: ByteConversion, { element_from_bytes_be(&x.to_bytes_be()) } pub fn padd_function_felt( f: &FunctionFelt, n: usize, batched: bool, ) -> [Vec>; 4] { fn pad_vec(v: &mut Vec>, n: usize) { assert!(v.len() <= n); while v.len() < n { v.push((0u64).into()); } } let mut a_num = f.a.numerator.coefficients.clone(); let mut a_den = f.a.denominator.coefficients.clone(); let mut b_num = f.b.numerator.coefficients.clone(); let mut b_den = f.b.denominator.coefficients.clone(); let extra_padding = if batched { 2 } else { 0 }; pad_vec(&mut a_num, n + 1 + extra_padding); pad_vec(&mut a_den, n + 2 + extra_padding); pad_vec(&mut b_num, n + 2 + extra_padding); pad_vec(&mut b_den, n + 5 + extra_padding); [a_num, a_den, b_num, b_den] } pub fn u128_from_bytes_be(bytes: &[u8]) -> u128 { assert!(bytes.len() <= 16); let mut v = 0; for byte in bytes { v = (v << 8) | (*byte as u128); } v } pub fn u128_to_bytes_be(v: u128) -> Vec { let mut bytes = vec![]; let mut v = v; while v > 0 { bytes.push(v as u8); v >>= 8; } bytes.reverse(); bytes } pub fn element_from_u128(value: u128) -> FieldElement where F: IsPrimeField, FieldElement: ByteConversion, { element_from_bytes_be(&u128_to_bytes_be(value)) } pub fn field_element_to_u256_limbs(x: &FieldElement) -> [u128; 2] where F: IsPrimeField, FieldElement: ByteConversion, { byte_slice_split::<2, 128>(&x.to_bytes_be()) } pub fn field_element_to_u288_limbs(x: &FieldElement) -> [u128; 3] where F: IsPrimeField, FieldElement: ByteConversion, { byte_slice_split::<3, 96>(&x.to_bytes_be()) } pub fn field_element_to_u384_limbs(x: &FieldElement) -> [u128; 4] where F: IsPrimeField, FieldElement: ByteConversion, { byte_slice_split::<4, 96>(&x.to_bytes_be()) } pub fn scalar_to_limbs(x: &BigUint) -> [u128; 2] { byte_slice_split::<2, 128>(&x.to_bytes_be()) } pub fn biguint_split(x: &BigUint) -> [u128; N] { byte_slice_split::(&x.to_bytes_be()) } pub fn byte_slice_split(bytes: &[u8]) -> [u128; N] { assert!(SIZE <= 128 && SIZE.is_multiple_of(8)); assert!(bytes.len() <= N * SIZE / 8); let mut bytes = bytes; let mut limbs = [0u128; N]; for limb in limbs.iter_mut().take(N) { let index = bytes.len().saturating_sub(SIZE / 8); let slice = &bytes[index..]; *limb = u128_from_bytes_be(slice); bytes = &bytes[..index]; } limbs } pub fn biguint_from_hex(hex: &str) -> BigUint { let mut s = hex; if let Some(stripped) = s.strip_prefix("0x") { s = stripped; } BigUint::parse_bytes(s.as_bytes(), 16).unwrap_or_else(|| panic!("invalid hex string: {}", hex)) } #[cfg(test)] mod tests { use super::{biguint_from_hex, element_from_biguint, FieldElement}; use crate::definitions::{ BLS12381PrimeField, BN254PrimeField, SECP256K1PrimeField, SECP256R1PrimeField, Stark252PrimeField, X25519PrimeField, }; #[test] fn test_element_from_hex() { let s = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"; let x = biguint_from_hex(s); { let s = "6D89F71CAB8351F47AB1EFF0A417FF6B5E71911D44501FBF32CFC5B538AFA88"; let one = element_from_biguint::(&x); assert_eq!(one, FieldElement::from_hex(s).unwrap()); } { let s = "2CB5D3A884E56C4FAB7CD07EE4E16BC15EFEBB5D396D7CF82383087033108464532383FA8EAFF4E967D3988A62B6C9C"; let one = element_from_biguint::(&x); assert_eq!(one, FieldElement::from_hex(s).unwrap()); } { let s = "1000007A2000E90A0"; let one = element_from_biguint::(&x); assert_eq!(one, FieldElement::from_hex(s).unwrap()); } { let s = "4FFFFFFFDFFFFFFFFFFFFFFFEFFFFFFFBFFFFFFFF0000000000000002"; let one = element_from_biguint::(&x); assert_eq!(one, FieldElement::from_hex(s).unwrap()); } { let s = "5A3"; let one = element_from_biguint::(&x); assert_eq!(one, FieldElement::from_hex(s).unwrap()); } { let s = "7FFD4AB5E008810FFFFFFFFFF6F800000000001330FFFFFFFFFFD737E000400"; let one = element_from_biguint::(&x); assert_eq!(one, FieldElement::from_hex(s).unwrap()); } } } ================================================ FILE: tools/garaga_rs/src/lib.rs ================================================ pub mod algebra { pub mod extf_mul; pub mod g1g2pair; pub mod g1point; pub mod g2point; pub mod polynomial; pub mod rational_function; } pub mod calldata; pub mod constants; pub mod crypto { pub mod mmr { pub mod mmr_accumulator; pub mod mmr_membership_proof; pub mod mmr_successor_proof; pub mod mmr_trait; pub mod shared_advanced; pub mod shared_basic; pub const TOO_MANY_LEAFS_ERR: &str = "internal error: Merkle Mountain Ranges should have at most 2^63 leafs"; } pub mod digest; pub mod merkle_tree; #[allow(dead_code)] pub mod poseidon_bn254; } pub mod definitions; pub mod ecip { pub mod core; pub mod ff; } pub mod frobenius; pub mod io; pub mod pairing { pub mod final_exp_witness; pub mod multi_miller_loop; pub mod multi_pairing_check; } pub mod poseidon_transcript; pub mod hints { pub mod eisenstein; pub mod fake_glv; } // automatically excludes python bindings on wasm32-unknown-unknown (pyo3 not supported) #[cfg(all(feature = "python", not(target_arch = "wasm32")))] pub mod python_bindings; // only include wasm bindings when both wasm feature is enabled AND on wasm32 target #[cfg(all(feature = "wasm", target_arch = "wasm32"))] pub mod wasm_bindings; ================================================ FILE: tools/garaga_rs/src/pairing/final_exp_witness/addchain_pow_generated.rs ================================================ // AUTO-GENERATED: DO NOT EDIT BY HAND. // Generated by tools/addchain/gen_rust_addchain.py from: // - tools/addchain/bn254_exp.acc // - tools/addchain/bn254_exp0.acc // - tools/addchain/bn254_r_m_d_inv.acc // - tools/addchain/bls12_381_h3_s.acc // - tools/addchain/bls12_381_e.acc use lambdaworks_math::field::element::FieldElement; use lambdaworks_math::field::traits::IsField; fn square_n(x: &FieldElement, n: usize) -> FieldElement { let mut t = x.clone(); for _ in 0..n { t = t.square(); } t } pub mod bn254 { use super::square_n; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree12ExtensionField; use lambdaworks_math::field::element::FieldElement; /// Generated from tools/addchain/bn254_exp.acc pub fn pow_exp( base: &FieldElement, ) -> FieldElement { let base = base.clone(); let _10 = { let t0 = square_n(&base, 1); t0 }; let _11 = { let t0 = &base * &_10; t0 }; let _101 = { let t0 = &_10 * &_11; t0 }; let _111 = { let t0 = &_10 * &_101; t0 }; let _1001 = { let t0 = &_10 * &_111; t0 }; let _1011 = { let t0 = &_10 * &_1001; t0 }; let _1101 = { let t0 = &_10 * &_1011; t0 }; let _1111 = { let t0 = &_10 * &_1101; t0 }; let _10001 = { let t0 = &_10 * &_1111; t0 }; let _10011 = { let t0 = &_10 * &_10001; t0 }; let _10101 = { let t0 = &_10 * &_10011; t0 }; let _10111 = { let t0 = &_10 * &_10101; t0 }; let _11001 = { let t0 = &_10 * &_10111; t0 }; let _11011 = { let t0 = &_10 * &_11001; t0 }; let _11101 = { let t0 = &_10 * &_11011; t0 }; let _11111 = { let t0 = &_10 * &_11101; t0 }; let _100001 = { let t0 = &_10 * &_11111; t0 }; let _100011 = { let t0 = &_10 * &_100001; t0 }; let _100101 = { let t0 = &_10 * &_100011; t0 }; let _100111 = { let t0 = &_10 * &_100101; t0 }; let _101001 = { let t0 = &_10 * &_100111; t0 }; let _101011 = { let t0 = &_10 * &_101001; t0 }; let _101101 = { let t0 = &_10 * &_101011; t0 }; let _101111 = { let t0 = &_10 * &_101101; t0 }; let _110001 = { let t0 = &_10 * &_101111; t0 }; let _110011 = { let t0 = &_10 * &_110001; t0 }; let _110101 = { let t0 = &_10 * &_110011; t0 }; let _110111 = { let t0 = &_10 * &_110101; t0 }; let _111001 = { let t0 = &_10 * &_110111; t0 }; let _111011 = { let t0 = &_10 * &_111001; t0 }; let _111101 = { let t0 = &_10 * &_111011; t0 }; let _111111 = { let t0 = &_10 * &_111101; t0 }; let _1000001 = { let t0 = &_10 * &_111111; t0 }; let _1000011 = { let t0 = &_10 * &_1000001; t0 }; let _1000101 = { let t0 = &_10 * &_1000011; t0 }; let _1000111 = { let t0 = &_10 * &_1000101; t0 }; let _1001001 = { let t0 = &_10 * &_1000111; t0 }; let _1001011 = { let t0 = &_10 * &_1001001; t0 }; let _1001101 = { let t0 = &_10 * &_1001011; t0 }; let _1001111 = { let t0 = &_10 * &_1001101; t0 }; let _1010001 = { let t0 = &_10 * &_1001111; t0 }; let _1010011 = { let t0 = &_10 * &_1010001; t0 }; let _1010101 = { let t0 = &_10 * &_1010011; t0 }; let _1010111 = { let t0 = &_10 * &_1010101; t0 }; let _1011001 = { let t0 = &_10 * &_1010111; t0 }; let _1011011 = { let t0 = &_10 * &_1011001; t0 }; let _1011101 = { let t0 = &_10 * &_1011011; t0 }; let _1011111 = { let t0 = &_10 * &_1011101; t0 }; let _1100001 = { let t0 = &_10 * &_1011111; t0 }; let _1100011 = { let t0 = &_10 * &_1100001; t0 }; let _1100101 = { let t0 = &_10 * &_1100011; t0 }; let _1100111 = { let t0 = &_10 * &_1100101; t0 }; let _1101001 = { let t0 = &_10 * &_1100111; t0 }; let _1101011 = { let t0 = &_10 * &_1101001; t0 }; let _1101101 = { let t0 = &_10 * &_1101011; t0 }; let _1101111 = { let t0 = &_10 * &_1101101; t0 }; let _1110001 = { let t0 = &_10 * &_1101111; t0 }; let _1110011 = { let t0 = &_10 * &_1110001; t0 }; let _1110101 = { let t0 = &_10 * &_1110011; t0 }; let _1110111 = { let t0 = &_10 * &_1110101; t0 }; let _1111001 = { let t0 = &_10 * &_1110111; t0 }; let _1111011 = { let t0 = &_10 * &_1111001; t0 }; let _1111101 = { let t0 = &_10 * &_1111011; t0 }; let _1111111 = { let t0 = &_10 * &_1111101; t0 }; let _11111110 = { let t0 = square_n(&_1111111, 1); t0 }; let _11111111 = { let t0 = &base * &_11111110; t0 }; let i81 = { let t0 = &_1111101 * &_11111111; let t1 = square_n(&t0, 4); let t2 = &t1 * &_10111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_100001; t4 }; let i105 = { let t0 = square_n(&i81, 7); let t1 = &t0 * &_111001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1001011; let t4 = square_n(&t3, 6); t4 }; let i125 = { let t0 = &_100111 * &i105; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1001001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_101001; t4 }; let i150 = { let t0 = square_n(&i125, 8); let t1 = &t0 * &_1110101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1001111; let t4 = square_n(&t3, 8); t4 }; let i168 = { let t0 = &_1001011 * &i150; let t1 = square_n(&t0, 6); let t2 = &t1 * &_101001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1011001; t4 }; let i192 = { let t0 = square_n(&i168, 6); let t1 = &t0 * &_11001; let t2 = square_n(&t1, 4); let t3 = &t2 * &base; let t4 = square_n(&t3, 12); t4 }; let i209 = { let t0 = &_110111 * &i192; let t1 = square_n(&t0, 6); let t2 = &t1 * &_10011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10101; t4 }; let i236 = { let t0 = square_n(&i209, 9); let t1 = &t0 * &_1110001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1011111; let t4 = square_n(&t3, 7); t4 }; let i256 = { let t0 = &_1101 * &i236; let t1 = square_n(&t0, 9); let t2 = &t1 * &_110101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1000101; t4 }; let i281 = { let t0 = square_n(&i256, 6); let t1 = &t0 * &_101101; let t2 = square_n(&t1, 11); let t3 = &t2 * &_110001; let t4 = square_n(&t3, 6); t4 }; let i307 = { let t0 = &_11111 * &i281; let t1 = square_n(&t0, 17); let t2 = &t1 * &_1010111; let t3 = square_n(&t2, 6); let t4 = &t3 * &_110011; t4 }; let i337 = { let t0 = square_n(&i307, 6); let t1 = &t0 * &_11011; let t2 = square_n(&t1, 12); let t3 = &t2 * &_11111111; let t4 = square_n(&t3, 10); t4 }; let i356 = { let t0 = &_10101 * &i337; let t1 = square_n(&t0, 7); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1110011; t4 }; let i384 = { let t0 = square_n(&i356, 10); let t1 = &t0 * &_1000101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_100001; let t4 = square_n(&t3, 8); t4 }; let i399 = { let t0 = &_1100111 * &i384; let t1 = square_n(&t0, 6); let t2 = &t1 * &_101011; let t3 = square_n(&t2, 6); let t4 = &t3 * &_10011; t4 }; let i427 = { let t0 = square_n(&i399, 8); let t1 = &t0 * &_111011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_11111; let t4 = square_n(&t3, 9); t4 }; let i437 = { let t0 = &_11111111 * &i427; let t1 = square_n(&t0, 1); let t2 = &t1 * &base; let t3 = square_n(&t2, 6); let t4 = &t3 * &_111; t4 }; let i466 = { let t0 = square_n(&i437, 11); let t1 = &t0 * &_1001011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_110001; let t4 = square_n(&t3, 10); t4 }; let i484 = { let t0 = &_1100111 * &i466; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1001101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1100111; t4 }; let i510 = { let t0 = square_n(&i484, 6); let t1 = &t0 * &_11011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_110111; let t4 = square_n(&t3, 9); t4 }; let i527 = { let t0 = &_1111011 * &i510; let t1 = square_n(&t0, 4); let t2 = &t1 * &_1101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1101111; t4 }; let i557 = { let t0 = square_n(&i527, 5); let t1 = &t0 * &_11011; let t2 = square_n(&t1, 13); let t3 = &t2 * &_101111; let t4 = square_n(&t3, 10); t4 }; let i577 = { let t0 = &_1110011 * &i557; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1000011; t4 }; let i598 = { let t0 = square_n(&i577, 7); let t1 = &t0 * &_1010101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_11111; let t4 = square_n(&t3, 6); t4 }; let i613 = { let t0 = &_1001 * &i598; let t1 = square_n(&t0, 10); let t2 = &t1 * &_100101; let t3 = square_n(&t2, 2); let t4 = &t3 * &base; t4 }; let i644 = { let t0 = square_n(&i613, 9); let t1 = &t0 * &_11111111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1110111; let t4 = square_n(&t3, 11); t4 }; let i661 = { let t0 = &_1100011 * &i644; let t1 = square_n(&t0, 6); let t2 = &t1 * &_110011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1110011; t4 }; let i684 = { let t0 = square_n(&i661, 7); let t1 = &t0 * &_1000101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1110001; let t4 = square_n(&t3, 7); t4 }; let i700 = { let t0 = &_1001111 * &i684; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 4); let t4 = &t3 * &_11; t4 }; let i727 = { let t0 = square_n(&i700, 12); let t1 = &t0 * &_1001101; let t2 = square_n(&t1, 3); let t3 = &t2 * &_101; let t4 = square_n(&t3, 10); t4 }; let i746 = { let t0 = &_1101 * &i727; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1001011; let t3 = square_n(&t2, 6); let t4 = &t3 * &_110001; t4 }; let i772 = { let t0 = square_n(&i746, 8); let t1 = &t0 * &_110111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110011; let t4 = square_n(&t3, 8); t4 }; let i790 = { let t0 = &_1001011 * &i772; let t1 = square_n(&t0, 1); let t2 = &t1 * &base; let t3 = square_n(&t2, 14); let t4 = &t3 * &_1101011; t4 }; let i815 = { let t0 = square_n(&i790, 8); let t1 = &t0 * &_1000111; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10101; let t4 = square_n(&t3, 10); t4 }; let i834 = { let t0 = &_1000101 * &i815; let t1 = square_n(&t0, 6); let t2 = &t1 * &_11101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_100111; t4 }; let i856 = { let t0 = square_n(&i834, 5); let t1 = &t0 * &_1101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_100011; let t4 = square_n(&t3, 5); t4 }; let i876 = { let t0 = &_1011 * &i856; let t1 = square_n(&t0, 9); let t2 = &t1 * &_110111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1010011; t4 }; let i900 = { let t0 = square_n(&i876, 7); let t1 = &t0 * &_1000001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_110101; let t4 = square_n(&t3, 8); t4 }; let i925 = { let t0 = &_1101101 * &i900; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1111101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1010101; t4 }; let i953 = { let t0 = square_n(&i925, 7); let t1 = &t0 * &_1001111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1000111; let t4 = square_n(&t3, 10); t4 }; let i971 = { let t0 = &_1111011 * &i953; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1100111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1011011; t4 }; let i996 = { let t0 = square_n(&i971, 8); let t1 = &t0 * &_1011111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_101001; let t4 = square_n(&t3, 8); t4 }; let i1012 = { let t0 = &_110001 * &i996; let t1 = square_n(&t0, 5); let t2 = &t1 * &_1101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10011; t4 }; let i1037 = { let t0 = square_n(&i1012, 9); let t1 = &t0 * &_1001101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_110101; let t4 = square_n(&t3, 8); t4 }; let i1055 = { let t0 = &_1101111 * &i1037; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1110101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_101001; t4 }; let i1081 = { let t0 = square_n(&i1055, 10); let t1 = &t0 * &_1001101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1010001; let t4 = square_n(&t3, 7); t4 }; let i1098 = { let t0 = &_1111101 * &i1081; let t1 = square_n(&t0, 5); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_100111; t4 }; let i1125 = { let t0 = square_n(&i1098, 7); let t1 = &t0 * &_11111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110111; let t4 = square_n(&t3, 10); t4 }; let i1144 = { let t0 = &_101111 * &i1125; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1000111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1111101; t4 }; let i1169 = { let t0 = square_n(&i1144, 5); let t1 = &t0 * &_10001; let t2 = square_n(&t1, 12); let t3 = &t2 * &_110101; let t4 = square_n(&t3, 6); t4 }; let i1189 = { let t0 = &_11011 * &i1169; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1110101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1010111; t4 }; let i1217 = { let t0 = square_n(&i1189, 7); let t1 = &t0 * &_111101; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1101011; let t4 = square_n(&t3, 7); t4 }; let i1236 = { let t0 = &_101111 * &i1217; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1001001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001011; t4 }; let i1267 = { let t0 = square_n(&i1236, 12); let t1 = &t0 * &_1100001; let t2 = square_n(&t1, 10); let t3 = &t2 * &_100011; let t4 = square_n(&t3, 7); t4 }; let i1287 = { let t0 = &_100111 * &i1267; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1011011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1001001; t4 }; let i1309 = { let t0 = square_n(&i1287, 7); let t1 = &t0 * &_1101111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1101011; let t4 = square_n(&t3, 6); t4 }; let i1329 = { let t0 = &_10001 * &i1309; let t1 = square_n(&t0, 8); let t2 = &t1 * &_111011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1010001; t4 }; let i1351 = { let t0 = square_n(&i1329, 7); let t1 = &t0 * &_1100011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1001101; let t4 = square_n(&t3, 5); t4 }; let i1374 = { let t0 = &_10111 * &i1351; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1111001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1011001; t4 }; let i1398 = { let t0 = square_n(&i1374, 7); let t1 = &t0 * &_1010101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1101001; let t4 = square_n(&t3, 8); t4 }; let i1417 = { let t0 = &_110011 * &i1398; let t1 = square_n(&t0, 6); let t2 = &t1 * &_1011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1001011; t4 }; let i1444 = { let t0 = square_n(&i1417, 8); let t1 = &t0 * &_1111101; let t2 = square_n(&t1, 4); let t3 = &t2 * &_101; let t4 = square_n(&t3, 13); t4 }; let i1463 = { let t0 = &_1100101 * &i1444; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_100111; t4 }; let i1491 = { let t0 = square_n(&i1463, 8); let t1 = &t0 * &_1101101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1001011; let t4 = square_n(&t3, 8); t4 }; let i1509 = { let t0 = &_1000011 * &i1491; let t1 = square_n(&t0, 9); let t2 = &t1 * &_110101; let t3 = square_n(&t2, 6); let t4 = &t3 * &_10111; t4 }; let i1539 = { let t0 = square_n(&i1509, 9); let t1 = &t0 * &_110111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_111101; let t4 = square_n(&t3, 10); t4 }; let i1558 = { let t0 = &_101011 * &i1539; let t1 = square_n(&t0, 2); let t2 = &t1 * &base; let t3 = square_n(&t2, 14); let t4 = &t3 * &_1111101; t4 }; let i1585 = { let t0 = square_n(&i1558, 7); let t1 = &t0 * &_1101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_101111; let t4 = square_n(&t3, 8); t4 }; let i1610 = { let t0 = &_1110001 * &i1585; let t1 = square_n(&t0, 15); let t2 = &t1 * &_1011101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1101001; t4 }; let i1637 = { let t0 = square_n(&i1610, 6); let t1 = &t0 * &_11001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_101011; let t4 = square_n(&t3, 10); t4 }; let i1654 = { let t0 = &_1001111 * &i1637; let t1 = square_n(&t0, 1); let t2 = &t1 * &base; let t3 = square_n(&t2, 13); let t4 = &t3 * &_1011001; t4 }; let i1678 = { let t0 = square_n(&i1654, 4); let t1 = &t0 * &_1111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_111011; let t4 = square_n(&t3, 9); t4 }; let i1695 = { let t0 = &_1011011 * &i1678; let t1 = square_n(&t0, 6); let t2 = &t1 * &_110011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1101; t4 }; let i1725 = { let t0 = square_n(&i1695, 10); let t1 = &t0 * &_1101011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1010001; let t4 = square_n(&t3, 11); t4 }; let i1746 = { let t0 = &_1111001 * &i1725; let t1 = square_n(&t0, 6); let t2 = &t1 * &_100011; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1111111; t4 }; let i1769 = { let t0 = square_n(&i1746, 8); let t1 = &t0 * &_1000111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1010001; let t4 = square_n(&t3, 6); t4 }; let i1788 = { let t0 = &_110101 * &i1769; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1011001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_110111; t4 }; let i1812 = { let t0 = square_n(&i1788, 10); let t1 = &t0 * &_1110011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_101011; let t4 = square_n(&t3, 6); t4 }; let i1834 = { let t0 = &_11111 * &i1812; let t1 = square_n(&t0, 8); let t2 = &t1 * &_101101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1111001; t4 }; let i1863 = { let t0 = square_n(&i1834, 9); let t1 = &t0 * &_10111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1000111; let t4 = square_n(&t3, 8); t4 }; let i1880 = { let t0 = &_1011001 * &i1863; let t1 = square_n(&t0, 5); let t2 = &t1 * &_11011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1000001; t4 }; let i1907 = { let t0 = square_n(&i1880, 2); let t1 = &t0 * &_11; let t2 = square_n(&t1, 16); let t3 = &t2 * &_1100011; let t4 = square_n(&t3, 7); t4 }; let i1923 = { let t0 = &_1001001 * &i1907; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1100111; let t3 = square_n(&t2, 6); let t4 = &t3 * &_110111; t4 }; let i1950 = { let t0 = square_n(&i1923, 8); let t1 = &t0 * &_1111011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1100111; let t4 = square_n(&t3, 7); t4 }; let i1971 = { let t0 = &_11011 * &i1950; let t1 = square_n(&t0, 6); let t2 = &t1 * &_111; let t3 = square_n(&t2, 12); let t4 = &t3 * &_101101; t4 }; let i1994 = { let t0 = square_n(&i1971, 8); let t1 = &t0 * &_1001001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1101111; let t4 = square_n(&t3, 6); t4 }; let i2016 = { let t0 = &_110011 * &i1994; let t1 = square_n(&t0, 10); let t2 = &t1 * &_100101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1101001; t4 }; let i2041 = { let t0 = square_n(&i2016, 7); let t1 = &t0 * &_1110101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_10101; let t4 = square_n(&t3, 10); t4 }; let i2060 = { let t0 = &_1100001 * &i2041; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_110101; t4 }; let i2085 = { let t0 = square_n(&i2060, 5); let t1 = &t0 * &_1101; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1100111; let t4 = square_n(&t3, 7); t4 }; let i2103 = { let t0 = &_1010011 * &i2085; let t1 = square_n(&t0, 6); let t2 = &t1 * &_100001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1000111; t4 }; let i2129 = { let t0 = square_n(&i2103, 5); let t1 = &t0 * &_11011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1100011; let t4 = square_n(&t3, 10); t4 }; let i2146 = { let t0 = &_1001011 * &i2129; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1110011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_101111; t4 }; let i2167 = { let t0 = square_n(&i2146, 6); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1010111; let t4 = square_n(&t3, 4); t4 }; let i2195 = { let t0 = &base * &i2167; let t1 = square_n(&t0, 16); let t2 = &t1 * &_101111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_100011; t4 }; let i2220 = { let t0 = square_n(&i2195, 7); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_111111; let t4 = square_n(&t3, 8); t4 }; let i2238 = { let t0 = &_1011101 * &i2220; let t1 = square_n(&t0, 6); let t2 = &t1 * &_10001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1100011; t4 }; let i2264 = { let t0 = square_n(&i2238, 7); let t1 = &t0 * &_1101111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1001001; let t4 = square_n(&t3, 9); t4 }; let i2283 = { let t0 = &_10011 * &i2264; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1111011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1110111; t4 }; let i2308 = { let t0 = square_n(&i2283, 7); let t1 = &t0 * &_1110101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1101111; let t4 = square_n(&t3, 9); t4 }; let i2327 = { let t0 = &_10001 * &i2308; let t1 = square_n(&t0, 8); let t2 = &t1 * &_100111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001011; t4 }; let i2351 = { let t0 = square_n(&i2327, 5); let t1 = &t0 * &_10101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1110101; let t4 = square_n(&t3, 8); t4 }; let i2371 = { let t0 = &_1010011 * &i2351; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1101111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1010011; t4 }; let i2402 = { let t0 = square_n(&i2371, 13); let t1 = &t0 * &_1010111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1010001; let t4 = square_n(&t3, 7); t4 }; let i2420 = { let t0 = &_1111101 * &i2402; let t1 = square_n(&t0, 7); let t2 = &t1 * &_110001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001001; t4 }; let i2446 = { let t0 = square_n(&i2420, 7); let t1 = &t0 * &_1001101; let t2 = square_n(&t1, 1); let t3 = &t2 * &base; let t4 = square_n(&t3, 16); t4 }; let i2465 = { let t0 = &_111011 * &i2446; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1010011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1111011; t4 }; let i2492 = { let t0 = square_n(&i2465, 8); let t1 = &t0 * &_1011111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_111001; let t4 = square_n(&t3, 9); t4 }; let i2511 = { let t0 = &_100001 * &i2492; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1100101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1010011; t4 }; let i2542 = { let t0 = square_n(&i2511, 9); let t1 = &t0 * &_1010111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1001; let t4 = square_n(&t3, 11); t4 }; let i2562 = { let t0 = &_10111 * &i2542; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1111111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1010111; t4 }; let i2585 = { let t0 = square_n(&i2562, 6); let t1 = &t0 * &_110001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1010001; let t4 = square_n(&t3, 7); t4 }; let i2607 = { let t0 = &_1100101 * &i2585; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1011001; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1000011; t4 }; let i2635 = { let t0 = square_n(&i2607, 6); let t1 = &t0 * &_110111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1110111; let t4 = square_n(&t3, 9); t4 }; let i2656 = { let t0 = &_110111 * &i2635; let t1 = square_n(&t0, 6); let t2 = &t1 * &_1111; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1000011; t4 }; let i2679 = { let t0 = square_n(&i2656, 7); let t1 = &t0 * &_1101101; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10111; let t4 = square_n(&t3, 9); t4 }; let i2691 = { let t0 = &_101001 * &i2679; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1110001; let t3 = square_n(&t2, 1); let t4 = &t3 * &base; t4 }; let i2720 = { let t0 = square_n(&i2691, 14); let t1 = &t0 * &_1100001; let t2 = square_n(&t1, 6); let t3 = &t2 * &_111101; let t4 = square_n(&t3, 7); t4 }; let i2740 = { let t0 = &_110101 * &i2720; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1110001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_111011; t4 }; let i2770 = { let t0 = square_n(&i2740, 9); let t1 = &t0 * &_1110011; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1000101; let t4 = square_n(&t3, 7); t4 }; let i2788 = { let t0 = &_101101 * &i2770; let t1 = square_n(&t0, 6); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1001001; t4 }; let i2811 = { let t0 = square_n(&i2788, 4); let t1 = &t0 * &_1001; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1100011; let t4 = square_n(&t3, 7); t4 }; let i2829 = { let t0 = &_1011001 * &i2811; let t1 = square_n(&t0, 5); let t2 = &t1 * &_11111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1101011; t4 }; let i2853 = { let t0 = square_n(&i2829, 6); let t1 = &t0 * &_11011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_110001; let t4 = square_n(&t3, 7); t4 }; let i2866 = { let t0 = &_11111 * &i2853; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1101111; let t3 = square_n(&t2, 1); let t4 = &t3 * &base; t4 }; let i2896 = { let t0 = square_n(&i2866, 12); let t1 = &t0 * &_111011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110101; let t4 = square_n(&t3, 8); t4 }; let i2915 = { let t0 = &_1000101 * &i2896; let t1 = square_n(&t0, 7); let t2 = &t1 * &_11101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1111101; t4 }; let i2941 = { let t0 = square_n(&i2915, 9); let t1 = &t0 * &_1001011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 9); t4 }; let i2957 = { let t0 = &_1110001 * &i2941; let t1 = square_n(&t0, 6); let t2 = &t1 * &_111101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_10111; t4 }; let i2984 = { let t0 = square_n(&i2957, 9); let t1 = &t0 * &_111011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_100111; let t4 = square_n(&t3, 8); t4 }; let i3001 = { let t0 = &_1001101 * &i2984; let t1 = square_n(&t0, 6); let t2 = &t1 * &_110011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001111; t4 }; let i3025 = { let t0 = square_n(&i3001, 8); let t1 = &t0 * &_1001001; let t2 = square_n(&t1, 6); let t3 = &t2 * &_100111; let t4 = square_n(&t3, 8); t4 }; let i3040 = { let t0 = &_1110011 * &i3025; let t1 = square_n(&t0, 5); let t2 = &t1 * &_10011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_10101; t4 }; let i3065 = { let t0 = square_n(&i3040, 9); let t1 = &t0 * &_1111001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1101001; let t4 = square_n(&t3, 7); t4 }; let i3085 = { let t0 = &_1111011 * &i3065; let t1 = square_n(&t0, 8); let t2 = &t1 * &_101101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1000001; t4 }; let i3110 = { let t0 = square_n(&i3085, 8); let t1 = &t0 * &_111001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1011101; let t4 = square_n(&t3, 7); t4 }; let i3126 = { let t0 = &_1111011 * &i3110; let t1 = square_n(&t0, 5); let t2 = &t1 * &_10001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_110111; t4 }; let i3150 = { let t0 = square_n(&i3126, 8); let t1 = &t0 * &_1000101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_101111; let t4 = square_n(&t3, 8); t4 }; let i3168 = { let t0 = &_1101011 * &i3150; let t1 = square_n(&t0, 2); let t2 = &t1 * &_11; let t3 = square_n(&t2, 13); let t4 = &t3 * &_1110011; t4 }; let i3191 = { let t0 = square_n(&i3168, 7); let t1 = &t0 * &_1000001; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 9); t4 }; let i3207 = { let t0 = &_1111101 * &i3191; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1010011; let t3 = square_n(&t2, 6); let t4 = &t3 * &_110011; t4 }; let i3232 = { let t0 = square_n(&i3207, 8); let t1 = &t0 * &_1010011; let t2 = square_n(&t1, 5); let t3 = &t2 * &_1011; let t4 = square_n(&t3, 10); t4 }; let i3251 = { let t0 = &_1110101 * &i3232; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1101111; let t3 = square_n(&t2, 6); let t4 = &t3 * &_110001; t4 }; let i3282 = { let t0 = square_n(&i3251, 12); let t1 = &t0 * &_100011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1011011; let t4 = square_n(&t3, 8); t4 }; let i3299 = { let t0 = &_1001011 * &i3282; let t1 = square_n(&t0, 6); let t2 = &t1 * &_100111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1100011; t4 }; let i3324 = { let t0 = square_n(&i3299, 7); let t1 = &t0 * &_1011111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1101101; let t4 = square_n(&t3, 9); t4 }; let i3341 = { let t0 = &_10001 * &i3324; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1101001; let t3 = square_n(&t2, 4); let t4 = &t3 * &_1111; t4 }; let i3372 = { let t0 = square_n(&i3341, 12); let t1 = &t0 * &_100101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1000001; let t4 = square_n(&t3, 9); t4 }; let i3391 = { let t0 = &_1100111 * &i3372; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1010111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1000001; t4 }; let i3415 = { let t0 = square_n(&i3391, 2); let t1 = &t0 * &_11; let t2 = square_n(&t1, 11); let t3 = &t2 * &_11111111; let t4 = square_n(&t3, 9); t4 }; let i3433 = { let t0 = &_1111101 * &i3415; let t1 = square_n(&t0, 5); let t2 = &t1 * &_1101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1101111; t4 }; let i3456 = { let t0 = square_n(&i3433, 6); let t1 = &t0 * &_11001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11001; let t4 = square_n(&t3, 7); t4 }; let i3477 = { let t0 = &_111 * &i3456; let t1 = square_n(&t0, 11); let t2 = &t1 * &_100101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_11; t4 }; let result = { let t0 = square_n(&i3477, 5); t0 }; result } /// Generated from tools/addchain/bn254_exp0.acc pub fn pow_exp0( base: &FieldElement, ) -> FieldElement { let base = base.clone(); let _10 = { let t0 = square_n(&base, 1); t0 }; let _11 = { let t0 = &base * &_10; t0 }; let _101 = { let t0 = &_10 * &_11; t0 }; let _111 = { let t0 = &_10 * &_101; t0 }; let _1001 = { let t0 = &_10 * &_111; t0 }; let _1011 = { let t0 = &_10 * &_1001; t0 }; let _1101 = { let t0 = &_10 * &_1011; t0 }; let _1111 = { let t0 = &_10 * &_1101; t0 }; let _10001 = { let t0 = &_10 * &_1111; t0 }; let _10011 = { let t0 = &_10 * &_10001; t0 }; let _10101 = { let t0 = &_10 * &_10011; t0 }; let _10111 = { let t0 = &_10 * &_10101; t0 }; let _11001 = { let t0 = &_10 * &_10111; t0 }; let _11011 = { let t0 = &_10 * &_11001; t0 }; let _11101 = { let t0 = &_10 * &_11011; t0 }; let _11111 = { let t0 = &_10 * &_11101; t0 }; let _100001 = { let t0 = &_10 * &_11111; t0 }; let _100011 = { let t0 = &_10 * &_100001; t0 }; let _100101 = { let t0 = &_10 * &_100011; t0 }; let _100111 = { let t0 = &_10 * &_100101; t0 }; let _101001 = { let t0 = &_10 * &_100111; t0 }; let _101011 = { let t0 = &_10 * &_101001; t0 }; let _101101 = { let t0 = &_10 * &_101011; t0 }; let _101111 = { let t0 = &_10 * &_101101; t0 }; let _110001 = { let t0 = &_10 * &_101111; t0 }; let _110011 = { let t0 = &_10 * &_110001; t0 }; let _110101 = { let t0 = &_10 * &_110011; t0 }; let _110111 = { let t0 = &_10 * &_110101; t0 }; let _111001 = { let t0 = &_10 * &_110111; t0 }; let _111011 = { let t0 = &_10 * &_111001; t0 }; let _111101 = { let t0 = &_10 * &_111011; t0 }; let _111111 = { let t0 = &_10 * &_111101; t0 }; let _1000001 = { let t0 = &_10 * &_111111; t0 }; let _1000011 = { let t0 = &_10 * &_1000001; t0 }; let _1000101 = { let t0 = &_10 * &_1000011; t0 }; let _1000111 = { let t0 = &_10 * &_1000101; t0 }; let _1001001 = { let t0 = &_10 * &_1000111; t0 }; let _1001011 = { let t0 = &_10 * &_1001001; t0 }; let _1001101 = { let t0 = &_10 * &_1001011; t0 }; let _1001111 = { let t0 = &_10 * &_1001101; t0 }; let _1010001 = { let t0 = &_10 * &_1001111; t0 }; let _1010011 = { let t0 = &_10 * &_1010001; t0 }; let _1010101 = { let t0 = &_10 * &_1010011; t0 }; let _1010111 = { let t0 = &_10 * &_1010101; t0 }; let _1011001 = { let t0 = &_10 * &_1010111; t0 }; let _1011011 = { let t0 = &_10 * &_1011001; t0 }; let _1011101 = { let t0 = &_10 * &_1011011; t0 }; let _1011111 = { let t0 = &_10 * &_1011101; t0 }; let _1100001 = { let t0 = &_10 * &_1011111; t0 }; let _1100011 = { let t0 = &_10 * &_1100001; t0 }; let _1100101 = { let t0 = &_10 * &_1100011; t0 }; let _1100111 = { let t0 = &_10 * &_1100101; t0 }; let _1101001 = { let t0 = &_10 * &_1100111; t0 }; let _1101011 = { let t0 = &_10 * &_1101001; t0 }; let _1101101 = { let t0 = &_10 * &_1101011; t0 }; let _1101111 = { let t0 = &_10 * &_1101101; t0 }; let _1110001 = { let t0 = &_10 * &_1101111; t0 }; let _1110011 = { let t0 = &_10 * &_1110001; t0 }; let _1110101 = { let t0 = &_10 * &_1110011; t0 }; let _1110111 = { let t0 = &_10 * &_1110101; t0 }; let _1111001 = { let t0 = &_10 * &_1110111; t0 }; let _1111011 = { let t0 = &_10 * &_1111001; t0 }; let _1111101 = { let t0 = &_10 * &_1111011; t0 }; let _1111111 = { let t0 = &_10 * &_1111101; t0 }; let _11100010 = { let t0 = &_1100011 * &_1111111; t0 }; let _11111111 = { let t0 = &_11101 * &_11100010; t0 }; let i67 = { let t0 = square_n(&_11100010, 1); t0 }; let x9 = { let t0 = &_111011 * &i67; t0 }; let i94 = { let t0 = square_n(&i67, 10); let t1 = &t0 * &_1010101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1100001; let t4 = square_n(&t3, 7); t4 }; let i118 = { let t0 = &_1000011 * &i94; let t1 = square_n(&t0, 8); let t2 = &t1 * &_111011; let t3 = square_n(&t2, 13); let t4 = &t3 * &_101011; t4 }; let i146 = { let t0 = square_n(&i118, 8); let t1 = &t0 * &_1101111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110111; let t4 = square_n(&t3, 10); t4 }; let i165 = { let t0 = &_1010111 * &i146; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1110111; let t3 = square_n(&t2, 5); let t4 = &t3 * &_1011; t4 }; let i191 = { let t0 = square_n(&i165, 6); let t1 = &t0 * &_101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_111001; let t4 = square_n(&t3, 8); t4 }; let i212 = { let t0 = &_100101 * &i191; let t1 = square_n(&t0, 5); let t2 = &t1 * &_11; let t3 = square_n(&t2, 13); let t4 = &t3 * &_1100011; t4 }; let i243 = { let t0 = square_n(&i212, 10); let t1 = &t0 * &_111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1011011; let t4 = square_n(&t3, 8); t4 }; let i261 = { let t0 = &_1100001 * &i243; let t1 = square_n(&t0, 4); let t2 = &t1 * &_1111; let t3 = square_n(&t2, 11); let t4 = &t3 * &_110101; t4 }; let i287 = { let t0 = square_n(&i261, 6); let t1 = &t0 * &_10111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1010101; let t4 = square_n(&t3, 9); t4 }; let i308 = { let t0 = &_10011 * &i287; let t1 = square_n(&t0, 9); let t2 = &t1 * &_100001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_100011; t4 }; let i334 = { let t0 = square_n(&i308, 9); let t1 = &t0 * &_1100001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_101101; let t4 = square_n(&t3, 7); t4 }; let i359 = { let t0 = &_1011 * &i334; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1100011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_100111; t4 }; let i384 = { let t0 = square_n(&i359, 9); let t1 = &t0 * &_1101001; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10001; let t4 = square_n(&t3, 9); t4 }; let i402 = { let t0 = &_100101 * &i384; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1010001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_100011; t4 }; let i426 = { let t0 = square_n(&i402, 9); let t1 = &t0 * &_1100001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1001011; let t4 = square_n(&t3, 4); t4 }; let i445 = { let t0 = &_1101 * &i426; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_101001; t4 }; let i469 = { let t0 = square_n(&i445, 8); let t1 = &t0 * &_1101001; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 9); t4 }; let i489 = { let t0 = &_1111101 * &i469; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1111101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1110101; t4 }; let i515 = { let t0 = square_n(&i489, 7); let t1 = &t0 * &_111011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_100011; let t4 = square_n(&t3, 7); t4 }; let i532 = { let t0 = &_111001 * &i515; let t1 = square_n(&t0, 5); let t2 = &t1 * &_1101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_111; t4 }; let i561 = { let t0 = square_n(&i532, 11); let t1 = &t0 * &_11111111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1111001; let t4 = square_n(&t3, 8); t4 }; let i576 = { let t0 = &_1010111 * &i561; let t1 = square_n(&t0, 5); let t2 = &t1 * &_11101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1001; t4 }; let i602 = { let t0 = square_n(&i576, 10); let t1 = &t0 * &_1011001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1111001; let t4 = square_n(&t3, 7); t4 }; let i625 = { let t0 = &_11001 * &i602; let t1 = square_n(&t0, 9); let t2 = &t1 * &_101101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_111101; t4 }; let i649 = { let t0 = square_n(&i625, 6); let t1 = &t0 * &_10011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_101; let t4 = square_n(&t3, 10); t4 }; let i671 = { let t0 = &_10111 * &i649; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1101101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1111001; t4 }; let i696 = { let t0 = square_n(&i671, 9); let t1 = &t0 * &_1000001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1101101; let t4 = square_n(&t3, 7); t4 }; let i716 = { let t0 = &_1100111 * &i696; let t1 = square_n(&t0, 7); let t2 = &t1 * &_10001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1100011; t4 }; let i737 = { let t0 = square_n(&i716, 6); let t1 = &t0 * &_100111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1101101; let t4 = square_n(&t3, 5); t4 }; let i762 = { let t0 = &_11101 * &i737; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 14); let t4 = &t3 * &_1111001; t4 }; let i787 = { let t0 = square_n(&i762, 7); let t1 = &t0 * &_1001011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1000011; let t4 = square_n(&t3, 8); t4 }; let i805 = { let t0 = &_1011101 * &i787; let t1 = square_n(&t0, 9); let t2 = &t1 * &_110111; let t3 = square_n(&t2, 6); let t4 = &t3 * &_10001; t4 }; let i830 = { let t0 = square_n(&i805, 6); let t1 = &t0 * &_1111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1010101; let t4 = square_n(&t3, 7); t4 }; let i847 = { let t0 = &_1011001 * &i830; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1011111; let t3 = square_n(&t2, 6); let t4 = &t3 * &_1001; t4 }; let i872 = { let t0 = square_n(&i847, 5); let t1 = &t0 * &_11; let t2 = square_n(&t1, 11); let t3 = &t2 * &_110111; let t4 = square_n(&t3, 7); t4 }; let i887 = { let t0 = &_100101 * &i872; let t1 = square_n(&t0, 5); let t2 = &t1 * &_1011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1011; t4 }; let i913 = { let t0 = square_n(&i887, 10); let t1 = &t0 * &_1011011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_10101; let t4 = square_n(&t3, 8); t4 }; let i936 = { let t0 = &_111001 * &i913; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1001001; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1110111; t4 }; let i965 = { let t0 = square_n(&i936, 10); let t1 = &t0 * &_101111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10001; let t4 = square_n(&t3, 9); t4 }; let i984 = { let t0 = &_1010011 * &i965; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1111011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1010001; t4 }; let i1004 = { let t0 = square_n(&i984, 6); let t1 = &t0 * &_10011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1010111; let t4 = square_n(&t3, 3); t4 }; let i1023 = { let t0 = &_111 * &i1004; let t1 = square_n(&t0, 10); let t2 = &t1 * &_110001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_11101; t4 }; let i1051 = { let t0 = square_n(&i1023, 11); let t1 = &t0 * &x9; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1011011; let t4 = square_n(&t3, 7); t4 }; let i1071 = { let t0 = &_1010001 * &i1051; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1101111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_111011; t4 }; let i1099 = { let t0 = square_n(&i1071, 9); let t1 = &t0 * &_1111001; let t2 = square_n(&t1, 6); let t3 = &t2 * &_101001; let t4 = square_n(&t3, 11); t4 }; let i1118 = { let t0 = &_101111 * &i1099; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1011001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1000001; t4 }; let i1143 = { let t0 = square_n(&i1118, 9); let t1 = &t0 * &_1000011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_111101; let t4 = square_n(&t3, 7); t4 }; let i1162 = { let t0 = &_111001 * &i1143; let t1 = square_n(&t0, 4); let t2 = &t1 * &_11; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1100101; t4 }; let i1187 = { let t0 = square_n(&i1162, 4); let t1 = &t0 * &_1001; let t2 = square_n(&t1, 11); let t3 = &t2 * &_110011; let t4 = square_n(&t3, 8); t4 }; let i1205 = { let t0 = &_1100101 * &i1187; let t1 = square_n(&t0, 4); let t2 = &t1 * &_1101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1101011; t4 }; let i1231 = { let t0 = square_n(&i1205, 7); let t1 = &t0 * &_1010101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11111; let t4 = square_n(&t3, 9); t4 }; let i1248 = { let t0 = &_1100101 * &i1231; let t1 = square_n(&t0, 5); let t2 = &t1 * &_1011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_111011; t4 }; let i1272 = { let t0 = square_n(&i1248, 8); let t1 = &t0 * &_1010111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_100101; let t4 = square_n(&t3, 7); t4 }; let i1292 = { let t0 = &_110001 * &i1272; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1110011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1111011; t4 }; let i1317 = { let t0 = square_n(&i1292, 9); let t1 = &t0 * &_1010011; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 9); t4 }; let i1336 = { let t0 = &_1111001 * &i1317; let t1 = square_n(&t0, 6); let t2 = &t1 * &_10001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1111001; t4 }; let i1357 = { let t0 = square_n(&i1336, 7); let t1 = &t0 * &_1001101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1110001; let t4 = square_n(&t3, 5); t4 }; let i1382 = { let t0 = &_11011 * &i1357; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1001001; let t3 = square_n(&t2, 13); let t4 = &t3 * &_1100111; t4 }; let i1407 = { let t0 = square_n(&i1382, 8); let t1 = &t0 * &_1110011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_101011; let t4 = square_n(&t3, 9); t4 }; let i1423 = { let t0 = &_100111 * &i1407; let t1 = square_n(&t0, 7); let t2 = &t1 * &_101001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_11101; t4 }; let i1458 = { let t0 = square_n(&i1423, 8); let t1 = &t0 * &_111001; let t2 = square_n(&t1, 14); let t3 = &t2 * &_1101001; let t4 = square_n(&t3, 11); t4 }; let i1478 = { let t0 = &_1100011 * &i1458; let t1 = square_n(&t0, 8); let t2 = &t1 * &_110111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1001111; t4 }; let i1498 = { let t0 = square_n(&i1478, 4); let t1 = &t0 * &_11; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1010011; let t4 = square_n(&t3, 2); t4 }; let i1519 = { let t0 = &_11 * &i1498; let t1 = square_n(&t0, 12); let t2 = &t1 * &_1110101; let t3 = square_n(&t2, 6); let t4 = &t3 * &_110111; t4 }; let i1544 = { let t0 = square_n(&i1519, 10); let t1 = &t0 * &_1010101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1011101; let t4 = square_n(&t3, 6); t4 }; let i1559 = { let t0 = &_111011 * &i1544; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1100111; let t3 = square_n(&t2, 4); let t4 = &t3 * &_111; t4 }; let i1594 = { let t0 = square_n(&i1559, 12); let t1 = &t0 * &_111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11101; let t4 = square_n(&t3, 11); t4 }; let i1610 = { let t0 = &_1001111 * &i1594; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1010011; let t3 = square_n(&t2, 5); let t4 = &t3 * &_10101; t4 }; let i1636 = { let t0 = square_n(&i1610, 10); let t1 = &t0 * &_1001111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1010111; let t4 = square_n(&t3, 3); t4 }; let i1658 = { let t0 = &_101 * &i1636; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1011001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_101101; t4 }; let i1680 = { let t0 = square_n(&i1658, 8); let t1 = &t0 * &_1001111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1001111; let t4 = square_n(&t3, 5); t4 }; let i1700 = { let t0 = &_1011 * &i1680; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1111001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1000101; t4 }; let i1727 = { let t0 = square_n(&i1700, 7); let t1 = &t0 * &_1001101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_111011; let t4 = square_n(&t3, 9); t4 }; let i1744 = { let t0 = &_1000111 * &i1727; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1000111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1011001; t4 }; let i1766 = { let t0 = square_n(&i1744, 6); let t1 = &t0 * &_101001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1101101; let t4 = square_n(&t3, 6); t4 }; let i1784 = { let t0 = &_100101 * &i1766; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1000111; let t3 = square_n(&t2, 6); let t4 = &t3 * &_110101; t4 }; let i1812 = { let t0 = square_n(&i1784, 9); let t1 = &t0 * &_1100111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_110001; let t4 = square_n(&t3, 10); t4 }; let i1828 = { let t0 = &_1101111 * &i1812; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1101001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_100011; t4 }; let i1854 = { let t0 = square_n(&i1828, 6); let t1 = &t0 * &_10011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1000111; let t4 = square_n(&t3, 8); t4 }; let i1876 = { let t0 = &_1110001 * &i1854; let t1 = square_n(&t0, 12); let t2 = &t1 * &_100011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_101; t4 }; let i1918 = { let t0 = square_n(&i1876, 20); let t1 = &t0 * &_111011; let t2 = square_n(&t1, 11); let t3 = &t2 * &_10001; let t4 = square_n(&t3, 9); t4 }; let i1937 = { let t0 = &_1011001 * &i1918; let t1 = square_n(&t0, 6); let t2 = &t1 * &_110001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_110101; t4 }; let i1962 = { let t0 = square_n(&i1937, 8); let t1 = &t0 * &_110111; let t2 = square_n(&t1, 4); let t3 = &t2 * &_111; let t4 = square_n(&t3, 11); t4 }; let i1978 = { let t0 = &_1001101 * &i1962; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1000011; let t3 = square_n(&t2, 6); let t4 = &t3 * &_101111; t4 }; let i2002 = { let t0 = square_n(&i1978, 8); let t1 = &t0 * &_1000001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1110001; let t4 = square_n(&t3, 7); t4 }; let i2019 = { let t0 = &_1111001 * &i2002; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1001101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_101001; t4 }; let i2043 = { let t0 = square_n(&i2019, 10); let t1 = &t0 * &_1010111; let t2 = square_n(&t1, 6); let t3 = &t2 * &_111011; let t4 = square_n(&t3, 6); t4 }; let i2061 = { let t0 = &_11111 * &i2043; let t1 = square_n(&t0, 8); let t2 = &t1 * &_110001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_110001; t4 }; let i2084 = { let t0 = square_n(&i2061, 8); let t1 = &t0 * &_1010111; let t2 = square_n(&t1, 2); let t3 = &t2 * &base; let t4 = square_n(&t3, 11); t4 }; let i2103 = { let t0 = &_10111 * &i2084; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1000011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1011001; t4 }; let i2126 = { let t0 = square_n(&i2103, 7); let t1 = &t0 * &_1011011; let t2 = square_n(&t1, 5); let t3 = &t2 * &_11101; let t4 = square_n(&t3, 9); t4 }; let i2144 = { let t0 = &_101001 * &i2126; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1110011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1100011; t4 }; let i2173 = { let t0 = square_n(&i2144, 9); let t1 = &t0 * &_1110111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1010011; let t4 = square_n(&t3, 10); t4 }; let i2184 = { let t0 = &_1110001 * &i2173; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1110001; let t3 = square_n(&t2, 1); let t4 = &t3 * &base; t4 }; let i2216 = { let t0 = square_n(&i2184, 14); let t1 = &t0 * &_111101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1110001; let t4 = square_n(&t3, 7); t4 }; let i2233 = { let t0 = &_1001011 * &i2216; let t1 = square_n(&t0, 7); let t2 = &t1 * &_111001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_11111; t4 }; let i2259 = { let t0 = square_n(&i2233, 10); let t1 = &t0 * &_1100111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1101111; let t4 = square_n(&t3, 7); t4 }; let i2280 = { let t0 = &_1011011 * &i2259; let t1 = square_n(&t0, 10); let t2 = &t1 * &x9; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1100101; t4 }; let i2305 = { let t0 = square_n(&i2280, 7); let t1 = &t0 * &_1110011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_100001; let t4 = square_n(&t3, 10); t4 }; let i2327 = { let t0 = &_101011 * &i2305; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 6); let t4 = &t3 * &_1011; t4 }; let i2354 = { let t0 = square_n(&i2327, 10); let t1 = &t0 * &_110111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_100111; let t4 = square_n(&t3, 8); t4 }; let i2374 = { let t0 = &_1100101 * &i2354; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1100101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1011111; t4 }; let i2402 = { let t0 = square_n(&i2374, 12); let t1 = &t0 * &_1000011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1110001; let t4 = square_n(&t3, 7); t4 }; let i2421 = { let t0 = &_1011101 * &i2402; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1011011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1101111; t4 }; let i2446 = { let t0 = square_n(&i2421, 5); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 9); t4 }; let i2461 = { let t0 = &_1111001 * &i2446; let t1 = square_n(&t0, 5); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_10111; t4 }; let i2494 = { let t0 = square_n(&i2461, 11); let t1 = &t0 * &_100101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_101; let t4 = square_n(&t3, 10); t4 }; let i2519 = { let t0 = &_110011 * &i2494; let t1 = square_n(&t0, 8); let t2 = &t1 * &_101001; let t3 = square_n(&t2, 14); let t4 = &t3 * &_1100111; t4 }; let i2543 = { let t0 = square_n(&i2519, 9); let t1 = &t0 * &_1000011; let t2 = square_n(&t1, 4); let t3 = &t2 * &_1001; let t4 = square_n(&t3, 9); t4 }; let i2561 = { let t0 = &_110101 * &i2543; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1010011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1100011; t4 }; let i2586 = { let t0 = square_n(&i2561, 5); let t1 = &t0 * &_1001; let t2 = square_n(&t1, 6); let t3 = &t2 * &_101; let t4 = square_n(&t3, 12); t4 }; let i2614 = { let t0 = &_11011 * &i2586; let t1 = square_n(&t0, 13); let t2 = &t1 * &_101; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1101101; t4 }; let i2641 = { let t0 = square_n(&i2614, 4); let t1 = &t0 * &_101; let t2 = square_n(&t1, 14); let t3 = &t2 * &_1000001; let t4 = square_n(&t3, 7); t4 }; let i2658 = { let t0 = &_111011 * &i2641; let t1 = square_n(&t0, 6); let t2 = &t1 * &_10011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11011; t4 }; let i2684 = { let t0 = square_n(&i2658, 8); let t1 = &t0 * &_10111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1010001; let t4 = square_n(&t3, 7); t4 }; let i2702 = { let t0 = &_111001 * &i2684; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1010101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1000111; t4 }; let i2726 = { let t0 = square_n(&i2702, 4); let t1 = &t0 * &_1011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1000101; let t4 = square_n(&t3, 8); t4 }; let i2741 = { let t0 = &_1011101 * &i2726; let t1 = square_n(&t0, 6); let t2 = &t1 * &_110001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_11011; t4 }; let i2767 = { let t0 = square_n(&i2741, 9); let t1 = &t0 * &_1000111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1100001; let t4 = square_n(&t3, 6); t4 }; let i2792 = { let t0 = &_111111 * &i2767; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1101011; let t3 = square_n(&t2, 13); let t4 = &t3 * &_111011; t4 }; let i2820 = { let t0 = square_n(&i2792, 8); let t1 = &t0 * &_1111101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_11101; let t4 = square_n(&t3, 12); t4 }; let i2837 = { let t0 = &_1110101 * &i2820; let t1 = square_n(&t0, 2); let t2 = &t1 * &_11; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1101001; t4 }; let i2862 = { let t0 = square_n(&i2837, 8); let t1 = &t0 * &_110101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1001101; let t4 = square_n(&t3, 7); t4 }; let i2878 = { let t0 = &_1110101 * &i2862; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1011001; let t3 = square_n(&t2, 5); let t4 = &t3 * &_10111; t4 }; let i2910 = { let t0 = square_n(&i2878, 8); let t1 = &t0 * &_11; let t2 = square_n(&t1, 13); let t3 = &t2 * &_1011101; let t4 = square_n(&t3, 9); t4 }; let i2932 = { let t0 = &_1011101 * &i2910; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1111111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1010111; t4 }; let i2956 = { let t0 = square_n(&i2932, 8); let t1 = &t0 * &_1110001; let t2 = square_n(&t1, 4); let t3 = &t2 * &_1001; let t4 = square_n(&t3, 10); t4 }; let i2972 = { let t0 = &_1101001 * &i2956; let t1 = square_n(&t0, 6); let t2 = &t1 * &_11001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1001; t4 }; let i3000 = { let t0 = square_n(&i2972, 9); let t1 = &t0 * &_100011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_101001; let t4 = square_n(&t3, 10); t4 }; let i3019 = { let t0 = &_11111 * &i3000; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1010111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1000101; t4 }; let i3046 = { let t0 = square_n(&i3019, 7); let t1 = &t0 * &_100011; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1111101; let t4 = square_n(&t3, 7); t4 }; let i3065 = { let t0 = &_1000001 * &i3046; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1111011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1010111; t4 }; let i3094 = { let t0 = square_n(&i3065, 14); let t1 = &t0 * &_1001101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1001101; let t4 = square_n(&t3, 5); t4 }; let i3115 = { let t0 = &_1111 * &i3094; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1111101; t4 }; let i3140 = { let t0 = square_n(&i3115, 7); let t1 = &t0 * &_100111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1101111; let t4 = square_n(&t3, 7); t4 }; let i3160 = { let t0 = &_101001 * &i3140; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1010101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1110111; t4 }; let i3182 = { let t0 = square_n(&i3160, 7); let t1 = &t0 * &_1000111; let t2 = square_n(&t1, 6); let t3 = &t2 * &_100101; let t4 = square_n(&t3, 7); t4 }; let i3202 = { let t0 = &_111101 * &i3182; let t1 = square_n(&t0, 5); let t2 = &t1 * &_1001; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1111001; t4 }; let i3225 = { let t0 = square_n(&i3202, 5); let t1 = &t0 * &_10101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1000111; let t4 = square_n(&t3, 7); t4 }; let i3243 = { let t0 = &_1010011 * &i3225; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1001111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1100011; t4 }; let i3266 = { let t0 = square_n(&i3243, 7); let t1 = &t0 * &_1101101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_10111; let t4 = square_n(&t3, 8); t4 }; let i3284 = { let t0 = &_110111 * &i3266; let t1 = square_n(&t0, 7); let t2 = &t1 * &_111111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1011001; t4 }; let i3309 = { let t0 = square_n(&i3284, 7); let t1 = &t0 * &_1011011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_101111; let t4 = square_n(&t3, 8); t4 }; let i3326 = { let t0 = &_1010001 * &i3309; let t1 = square_n(&t0, 4); let t2 = &t1 * &_1101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1001111; t4 }; let i3354 = { let t0 = square_n(&i3326, 7); let t1 = &t0 * &_1100011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1000011; let t4 = square_n(&t3, 11); t4 }; let i3369 = { let t0 = &_1111011 * &i3354; let t1 = square_n(&t0, 3); let t2 = &t1 * &_11; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11111111; t4 }; let i3396 = { let t0 = square_n(&i3369, 12); let t1 = &t0 * &_1000111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_11111; let t4 = square_n(&t3, 6); t4 }; let i3421 = { let t0 = &_111 * &i3396; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1110001; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10101; t4 }; let i3449 = { let t0 = square_n(&i3421, 12); let t1 = &t0 * &_1101001; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 9); t4 }; let i3470 = { let t0 = &_111101 * &i3449; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1100001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1100101; t4 }; let result = { let t0 = square_n(&i3470, 1); let t1 = &t0 * &base; t1 }; result } /// Generated from tools/addchain/bn254_r_m_d_inv.acc pub fn pow_r_m_d_inv( base: &FieldElement, ) -> FieldElement { let base = base.clone(); let _10 = { let t0 = square_n(&base, 1); t0 }; let _11 = { let t0 = &base * &_10; t0 }; let _100 = { let t0 = &base * &_11; t0 }; let _101 = { let t0 = &base * &_100; t0 }; let _111 = { let t0 = &_10 * &_101; t0 }; let _1001 = { let t0 = &_10 * &_111; t0 }; let _1011 = { let t0 = &_10 * &_1001; t0 }; let _1101 = { let t0 = &_10 * &_1011; t0 }; let _1111 = { let t0 = &_10 * &_1101; t0 }; let _10001 = { let t0 = &_10 * &_1111; t0 }; let _10011 = { let t0 = &_10 * &_10001; t0 }; let _10101 = { let t0 = &_10 * &_10011; t0 }; let _10111 = { let t0 = &_10 * &_10101; t0 }; let _11001 = { let t0 = &_10 * &_10111; t0 }; let _11011 = { let t0 = &_10 * &_11001; t0 }; let _11101 = { let t0 = &_10 * &_11011; t0 }; let _11111 = { let t0 = &_10 * &_11101; t0 }; let _100001 = { let t0 = &_10 * &_11111; t0 }; let _100011 = { let t0 = &_10 * &_100001; t0 }; let _100101 = { let t0 = &_10 * &_100011; t0 }; let _100111 = { let t0 = &_10 * &_100101; t0 }; let _101001 = { let t0 = &_10 * &_100111; t0 }; let _101011 = { let t0 = &_10 * &_101001; t0 }; let _101101 = { let t0 = &_10 * &_101011; t0 }; let _101111 = { let t0 = &_10 * &_101101; t0 }; let _110001 = { let t0 = &_10 * &_101111; t0 }; let _110011 = { let t0 = &_10 * &_110001; t0 }; let _110101 = { let t0 = &_10 * &_110011; t0 }; let _110111 = { let t0 = &_10 * &_110101; t0 }; let _111001 = { let t0 = &_10 * &_110111; t0 }; let _111011 = { let t0 = &_10 * &_111001; t0 }; let _111101 = { let t0 = &_10 * &_111011; t0 }; let _111111 = { let t0 = &_10 * &_111101; t0 }; let _1000001 = { let t0 = &_10 * &_111111; t0 }; let _1000011 = { let t0 = &_10 * &_1000001; t0 }; let _1000101 = { let t0 = &_10 * &_1000011; t0 }; let _1000111 = { let t0 = &_10 * &_1000101; t0 }; let _1001001 = { let t0 = &_10 * &_1000111; t0 }; let _1001011 = { let t0 = &_10 * &_1001001; t0 }; let _1001101 = { let t0 = &_10 * &_1001011; t0 }; let _1001111 = { let t0 = &_10 * &_1001101; t0 }; let _1010001 = { let t0 = &_10 * &_1001111; t0 }; let _1010011 = { let t0 = &_10 * &_1010001; t0 }; let _1010101 = { let t0 = &_10 * &_1010011; t0 }; let _1010111 = { let t0 = &_10 * &_1010101; t0 }; let _1011001 = { let t0 = &_10 * &_1010111; t0 }; let _1011011 = { let t0 = &_10 * &_1011001; t0 }; let _1011101 = { let t0 = &_10 * &_1011011; t0 }; let _1011111 = { let t0 = &_10 * &_1011101; t0 }; let _1100001 = { let t0 = &_10 * &_1011111; t0 }; let _1100011 = { let t0 = &_10 * &_1100001; t0 }; let _1100101 = { let t0 = &_10 * &_1100011; t0 }; let _1100111 = { let t0 = &_10 * &_1100101; t0 }; let _1101001 = { let t0 = &_10 * &_1100111; t0 }; let _1101011 = { let t0 = &_10 * &_1101001; t0 }; let _1101101 = { let t0 = &_10 * &_1101011; t0 }; let _1101111 = { let t0 = &_10 * &_1101101; t0 }; let _1110001 = { let t0 = &_10 * &_1101111; t0 }; let _1110011 = { let t0 = &_10 * &_1110001; t0 }; let _1110101 = { let t0 = &_10 * &_1110011; t0 }; let _1110111 = { let t0 = &_10 * &_1110101; t0 }; let _1111001 = { let t0 = &_10 * &_1110111; t0 }; let _1111011 = { let t0 = &_10 * &_1111001; t0 }; let _1111101 = { let t0 = &_10 * &_1111011; t0 }; let _1111111 = { let t0 = &_10 * &_1111101; t0 }; let _10000001 = { let t0 = &_10 * &_1111111; t0 }; let _10000011 = { let t0 = &_10 * &_10000001; t0 }; let _10000101 = { let t0 = &_10 * &_10000011; t0 }; let _10000111 = { let t0 = &_10 * &_10000101; t0 }; let _10001001 = { let t0 = &_10 * &_10000111; t0 }; let _10001011 = { let t0 = &_10 * &_10001001; t0 }; let _10001101 = { let t0 = &_10 * &_10001011; t0 }; let _10001111 = { let t0 = &_10 * &_10001101; t0 }; let _10010001 = { let t0 = &_10 * &_10001111; t0 }; let _10010011 = { let t0 = &_10 * &_10010001; t0 }; let _10010101 = { let t0 = &_10 * &_10010011; t0 }; let _10010111 = { let t0 = &_10 * &_10010101; t0 }; let _10011001 = { let t0 = &_10 * &_10010111; t0 }; let _10011011 = { let t0 = &_10 * &_10011001; t0 }; let _10011101 = { let t0 = &_10 * &_10011011; t0 }; let _10011111 = { let t0 = &_10 * &_10011101; t0 }; let _10100001 = { let t0 = &_10 * &_10011111; t0 }; let _10100011 = { let t0 = &_10 * &_10100001; t0 }; let _10100101 = { let t0 = &_10 * &_10100011; t0 }; let _10100111 = { let t0 = &_10 * &_10100101; t0 }; let _10101001 = { let t0 = &_10 * &_10100111; t0 }; let _10101011 = { let t0 = &_10 * &_10101001; t0 }; let _10101101 = { let t0 = &_10 * &_10101011; t0 }; let _10101111 = { let t0 = &_10 * &_10101101; t0 }; let _10110001 = { let t0 = &_10 * &_10101111; t0 }; let _10110011 = { let t0 = &_10 * &_10110001; t0 }; let _10110101 = { let t0 = &_10 * &_10110011; t0 }; let _10110111 = { let t0 = &_10 * &_10110101; t0 }; let _10111001 = { let t0 = &_10 * &_10110111; t0 }; let _10111011 = { let t0 = &_10 * &_10111001; t0 }; let _10111101 = { let t0 = &_10 * &_10111011; t0 }; let _10111111 = { let t0 = &_10 * &_10111101; t0 }; let _11000001 = { let t0 = &_10 * &_10111111; t0 }; let _11000011 = { let t0 = &_10 * &_11000001; t0 }; let _11000101 = { let t0 = &_10 * &_11000011; t0 }; let _11000111 = { let t0 = &_10 * &_11000101; t0 }; let _11001001 = { let t0 = &_10 * &_11000111; t0 }; let _11001011 = { let t0 = &_10 * &_11001001; t0 }; let _11001101 = { let t0 = &_10 * &_11001011; t0 }; let _11001111 = { let t0 = &_10 * &_11001101; t0 }; let _11010001 = { let t0 = &_10 * &_11001111; t0 }; let _11010011 = { let t0 = &_10 * &_11010001; t0 }; let _11010111 = { let t0 = &_100 * &_11010011; t0 }; let _11011001 = { let t0 = &_10 * &_11010111; t0 }; let _11011011 = { let t0 = &_10 * &_11011001; t0 }; let _11011101 = { let t0 = &_10 * &_11011011; t0 }; let _11011111 = { let t0 = &_10 * &_11011101; t0 }; let _11100001 = { let t0 = &_10 * &_11011111; t0 }; let _11100011 = { let t0 = &_10 * &_11100001; t0 }; let _11100101 = { let t0 = &_10 * &_11100011; t0 }; let _11100111 = { let t0 = &_10 * &_11100101; t0 }; let _11101001 = { let t0 = &_10 * &_11100111; t0 }; let _11101011 = { let t0 = &_10 * &_11101001; t0 }; let _11101101 = { let t0 = &_10 * &_11101011; t0 }; let _11101111 = { let t0 = &_10 * &_11101101; t0 }; let _11110001 = { let t0 = &_10 * &_11101111; t0 }; let _11110011 = { let t0 = &_10 * &_11110001; t0 }; let _11110101 = { let t0 = &_10 * &_11110011; t0 }; let _11110111 = { let t0 = &_10 * &_11110101; t0 }; let _11111001 = { let t0 = &_10 * &_11110111; t0 }; let _11111011 = { let t0 = &_10 * &_11111001; t0 }; let _11111101 = { let t0 = &_10 * &_11111011; t0 }; let _11111111 = { let t0 = &_10 * &_11111101; t0 }; let i146 = { let t0 = &_11 * &_11111111; let t1 = square_n(&t0, 7); let t2 = &t1 * &_10100011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11010011; t4 }; let i174 = { let t0 = square_n(&i146, 9); let t1 = &t0 * &_1110011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10101001; let t4 = square_n(&t3, 8); t4 }; let i199 = { let t0 = &_101011 * &i174; let t1 = square_n(&t0, 11); let t2 = &t1 * &_100011; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11100011; t4 }; let i229 = { let t0 = square_n(&i199, 8); let t1 = &t0 * &_10011011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11000001; let t4 = square_n(&t3, 12); t4 }; let i255 = { let t0 = &_11110111 * &i229; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10000111; let t3 = square_n(&t2, 14); let t4 = &t3 * &_10100001; t4 }; let i278 = { let t0 = square_n(&i255, 5); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10101; let t4 = square_n(&t3, 7); t4 }; let i298 = { let t0 = &_1011 * &i278; let t1 = square_n(&t0, 10); let t2 = &t1 * &_100011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_11111; t4 }; let i330 = { let t0 = square_n(&i298, 12); let t1 = &t0 * &_10111111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1000011; let t4 = square_n(&t3, 10); t4 }; let i352 = { let t0 = &_1011111 * &i330; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1100001; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11111111; t4 }; let i387 = { let t0 = square_n(&i352, 10); let t1 = &t0 * &_11011001; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10001; let t4 = square_n(&t3, 13); t4 }; let i411 = { let t0 = &_1000111 * &i387; let t1 = square_n(&t0, 6); let t2 = &t1 * &_10111; let t3 = square_n(&t2, 15); let t4 = &t3 * &_1101101; t4 }; let i441 = { let t0 = square_n(&i411, 12); let t1 = &t0 * &_11100011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1111011; let t4 = square_n(&t3, 9); t4 }; let i461 = { let t0 = &_11111011 * &i441; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11111011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_10101011; t4 }; let i490 = { let t0 = square_n(&i461, 11); let t1 = &t0 * &_10111111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10011011; let t4 = square_n(&t3, 7); t4 }; let i508 = { let t0 = &_1100111 * &i490; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1101111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_101111; t4 }; let i537 = { let t0 = square_n(&i508, 10); let t1 = &t0 * &_11000011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_11011; let t4 = square_n(&t3, 11); t4 }; let i560 = { let t0 = &_10111111 * &i537; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10010101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10100101; t4 }; let i587 = { let t0 = square_n(&i560, 9); let t1 = &t0 * &_1001101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1100001; let t4 = square_n(&t3, 7); t4 }; let i609 = { let t0 = &_110111 * &i587; let t1 = square_n(&t0, 7); let t2 = &t1 * &_10111; let t3 = square_n(&t2, 12); let t4 = &t3 * &_11101; t4 }; let i638 = { let t0 = square_n(&i609, 11); let t1 = &t0 * &_11100111; let t2 = square_n(&t1, 6); let t3 = &t2 * &_100111; let t4 = square_n(&t3, 10); t4 }; let i660 = { let t0 = &_100111 * &i638; let t1 = square_n(&t0, 12); let t2 = &t1 * &_10110011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1111101; t4 }; let i686 = { let t0 = square_n(&i660, 12); let t1 = &t0 * &_10100101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11110011; let t4 = square_n(&t3, 4); t4 }; let i710 = { let t0 = &_1001 * &i686; let t1 = square_n(&t0, 13); let t2 = &t1 * &_10001011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001101; t4 }; let i737 = { let t0 = square_n(&i710, 5); let t1 = &t0 * &_1001; let t2 = square_n(&t1, 12); let t3 = &t2 * &_10100011; let t4 = square_n(&t3, 8); t4 }; let i755 = { let t0 = &_10001101 * &i737; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1010101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001001; t4 }; let i788 = { let t0 = square_n(&i755, 5); let t1 = &t0 * &_1011; let t2 = square_n(&t1, 13); let t3 = &t2 * &_1001001; let t4 = square_n(&t3, 13); t4 }; let i806 = { let t0 = &_10110011 * &i788; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11001101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1010011; t4 }; let i838 = { let t0 = square_n(&i806, 11); let t1 = &t0 * &_1101111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10000001; let t4 = square_n(&t3, 9); t4 }; let i860 = { let t0 = &_10111011 * &i838; let t1 = square_n(&t0, 11); let t2 = &t1 * &_11100111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11101011; t4 }; let i884 = { let t0 = square_n(&i860, 2); let t1 = &t0 * &_11; let t2 = square_n(&t1, 13); let t3 = &t2 * &_1010101; let t4 = square_n(&t3, 7); t4 }; let i912 = { let t0 = &_101101 * &i884; let t1 = square_n(&t0, 12); let t2 = &t1 * &_10101011; let t3 = square_n(&t2, 13); let t4 = &t3 * &_111011; t4 }; let i937 = { let t0 = square_n(&i912, 7); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1111; let t4 = square_n(&t3, 9); t4 }; let i962 = { let t0 = &_10011 * &i937; let t1 = square_n(&t0, 10); let t2 = &t1 * &_100001; let t3 = square_n(&t2, 12); let t4 = &t3 * &_101011; t4 }; let i993 = { let t0 = square_n(&i962, 10); let t1 = &t0 * &_11100011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10111011; let t4 = square_n(&t3, 9); t4 }; let i1013 = { let t0 = &_11001111 * &i993; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10101101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1001111; t4 }; let i1041 = { let t0 = square_n(&i1013, 10); let t1 = &t0 * &_11110011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10001001; let t4 = square_n(&t3, 8); t4 }; let i1060 = { let t0 = &_10011101 * &i1041; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10001001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1101011; t4 }; let i1092 = { let t0 = square_n(&i1060, 7); let t1 = &t0 * &_111011; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1000101; let t4 = square_n(&t3, 11); t4 }; let i1116 = { let t0 = &_10011011 * &i1092; let t1 = square_n(&t0, 10); let t2 = &t1 * &_111001; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10111011; t4 }; let i1151 = { let t0 = square_n(&i1116, 11); let t1 = &t0 * &_10111011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11011011; let t4 = square_n(&t3, 12); t4 }; let i1173 = { let t0 = &_10011111 * &i1151; let t1 = square_n(&t0, 12); let t2 = &t1 * &_11100111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1000111; t4 }; let i1204 = { let t0 = square_n(&i1173, 9); let t1 = &t0 * &_10001111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11110001; let t4 = square_n(&t3, 10); t4 }; let i1223 = { let t0 = &_10001001 * &i1204; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10000011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10001001; t4 }; let i1250 = { let t0 = square_n(&i1223, 6); let t1 = &t0 * &_100111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_10011011; let t4 = square_n(&t3, 8); t4 }; let i1273 = { let t0 = &_11101001 * &i1250; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1110111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_100011; t4 }; let i1304 = { let t0 = square_n(&i1273, 11); let t1 = &t0 * &_1100001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_11110111; let t4 = square_n(&t3, 9); t4 }; let i1324 = { let t0 = &_1011011 * &i1304; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11100001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1100011; t4 }; let i1352 = { let t0 = square_n(&i1324, 9); let t1 = &t0 * &_11010001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11000111; let t4 = square_n(&t3, 9); t4 }; let i1378 = { let t0 = &_10010101 * &i1352; let t1 = square_n(&t0, 14); let t2 = &t1 * &_11010001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1001101; t4 }; let i1409 = { let t0 = square_n(&i1378, 8); let t1 = &t0 * &_1010001; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1011011; let t4 = square_n(&t3, 9); t4 }; let i1430 = { let t0 = &_1101111 * &i1409; let t1 = square_n(&t0, 8); let t2 = &t1 * &_111101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1010011; t4 }; let i1460 = { let t0 = square_n(&i1430, 12); let t1 = &t0 * &_10101101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10011011; let t4 = square_n(&t3, 8); t4 }; let i1485 = { let t0 = &_10100001 * &i1460; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10001111; let t3 = square_n(&t2, 14); let t4 = &t3 * &_1111101; t4 }; let i1511 = { let t0 = square_n(&i1485, 7); let t1 = &t0 * &_100011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1000111; let t4 = square_n(&t3, 8); t4 }; let i1532 = { let t0 = &_1100001 * &i1511; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1110011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11110001; t4 }; let i1559 = { let t0 = square_n(&i1532, 7); let t1 = &t0 * &_1100111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11101101; let t4 = square_n(&t3, 8); t4 }; let i1579 = { let t0 = &_1101101 * &i1559; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_110001; t4 }; let i1613 = { let t0 = square_n(&i1579, 9); let t1 = &t0 * &_1000011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1000011; let t4 = square_n(&t3, 13); t4 }; let i1640 = { let t0 = &_11001101 * &i1613; let t1 = square_n(&t0, 12); let t2 = &t1 * &_1110001; let t3 = square_n(&t2, 12); let t4 = &t3 * &_10101011; t4 }; let i1666 = { let t0 = square_n(&i1640, 4); let t1 = &t0 * &_1011; let t2 = square_n(&t1, 12); let t3 = &t2 * &_10111011; let t4 = square_n(&t3, 8); t4 }; let i1685 = { let t0 = &_11011011 * &i1666; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1010101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11101101; t4 }; let i1712 = { let t0 = square_n(&i1685, 8); let t1 = &t0 * &_11001011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1111101; let t4 = square_n(&t3, 10); t4 }; let i1732 = { let t0 = &_11100101 * &i1712; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1101011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_10101101; t4 }; let i1759 = { let t0 = square_n(&i1732, 8); let t1 = &t0 * &_1000001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_11001011; let t4 = square_n(&t3, 8); t4 }; let i1778 = { let t0 = &_11001011 * &i1759; let t1 = square_n(&t0, 3); let t2 = &t1 * &_111; let t3 = square_n(&t2, 13); let t4 = &t3 * &_11011111; t4 }; let i1809 = { let t0 = square_n(&i1778, 8); let t1 = &t0 * &_100011; let t2 = square_n(&t1, 12); let t3 = &t2 * &_11100111; let t4 = square_n(&t3, 9); t4 }; let i1827 = { let t0 = &_10001111 * &i1809; let t1 = square_n(&t0, 6); let t2 = &t1 * &_110101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1111111; t4 }; let i1854 = { let t0 = square_n(&i1827, 10); let t1 = &t0 * &_10111101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10001101; let t4 = square_n(&t3, 7); t4 }; let i1877 = { let t0 = &_1101011 * &i1854; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11101101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_10001111; t4 }; let i1900 = { let t0 = square_n(&i1877, 9); let t1 = &t0 * &_11110101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11000111; let t4 = square_n(&t3, 4); t4 }; let i1922 = { let t0 = &_1111 * &i1900; let t1 = square_n(&t0, 12); let t2 = &t1 * &_10110111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_10001; t4 }; let i1945 = { let t0 = square_n(&i1922, 12); let t1 = &t0 * &_11101001; let t2 = square_n(&t1, 6); let t3 = &t2 * &_111101; let t4 = square_n(&t3, 3); t4 }; let i1970 = { let t0 = &base * &i1945; let t1 = square_n(&t0, 14); let t2 = &t1 * &_1101011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_111011; t4 }; let i1997 = { let t0 = square_n(&i1970, 11); let t1 = &t0 * &_11011001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1100001; let t4 = square_n(&t3, 7); t4 }; let i2018 = { let t0 = &_110001 * &i1997; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11000111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11110111; t4 }; let i2044 = { let t0 = square_n(&i2018, 6); let t1 = &t0 * &_11011; let t2 = square_n(&t1, 12); let t3 = &t2 * &_10110011; let t4 = square_n(&t3, 6); t4 }; let i2067 = { let t0 = &_11111 * &i2044; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1101101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_10110011; t4 }; let i2093 = { let t0 = square_n(&i2067, 8); let t1 = &t0 * &_11010001; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 11); t4 }; let i2112 = { let t0 = &_10001001 * &i2093; let t1 = square_n(&t0, 5); let t2 = &t1 * &_11001; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11011111; t4 }; let i2138 = { let t0 = square_n(&i2112, 8); let t1 = &t0 * &_11001001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11111001; let t4 = square_n(&t3, 8); t4 }; let i2160 = { let t0 = &_10101111 * &i2138; let t1 = square_n(&t0, 11); let t2 = &t1 * &_10111001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001001; t4 }; let i2189 = { let t0 = square_n(&i2160, 10); let t1 = &t0 * &_11100111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10111101; let t4 = square_n(&t3, 8); t4 }; let i2210 = { let t0 = &_11101011 * &i2189; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1111001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1100001; t4 }; let i2238 = { let t0 = square_n(&i2210, 9); let t1 = &t0 * &_11010111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10100011; let t4 = square_n(&t3, 7); t4 }; let i2258 = { let t0 = &_1111101 * &i2238; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11000011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001001; t4 }; let i2284 = { let t0 = square_n(&i2258, 9); let t1 = &t0 * &_1000001; let t2 = square_n(&t1, 12); let t3 = &t2 * &_11001001; let t4 = square_n(&t3, 3); t4 }; let i2312 = { let t0 = &_111 * &i2284; let t1 = square_n(&t0, 18); let t2 = &t1 * &_10011001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1010111; t4 }; let i2340 = { let t0 = square_n(&i2312, 9); let t1 = &t0 * &_11100001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11110101; let t4 = square_n(&t3, 9); t4 }; let i2359 = { let t0 = &_10011011 * &i2340; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10000011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001101; t4 }; let i2387 = { let t0 = square_n(&i2359, 8); let t1 = &t0 * &_100111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1100001; let t4 = square_n(&t3, 9); t4 }; let i2409 = { let t0 = &_10100011 * &i2387; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1000011; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10001; t4 }; let i2451 = { let t0 = square_n(&i2409, 18); let t1 = &t0 * &_1111001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_111001; let t4 = square_n(&t3, 13); t4 }; let i2469 = { let t0 = &_11101011 * &i2451; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1011101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001101; t4 }; let i2491 = { let t0 = square_n(&i2469, 10); let t1 = &t0 * &_10000111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11001001; let t4 = square_n(&t3, 2); t4 }; let i2515 = { let t0 = &_11 * &i2491; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1011011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1010101; t4 }; let i2544 = { let t0 = square_n(&i2515, 9); let t1 = &t0 * &_100011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_111101; let t4 = square_n(&t3, 9); t4 }; let i2568 = { let t0 = &_10001 * &i2544; let t1 = square_n(&t0, 14); let t2 = &t1 * &_10010011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1001101; t4 }; let i2599 = { let t0 = square_n(&i2568, 3); let t1 = &t0 * &base; let t2 = square_n(&t1, 18); let t3 = &t2 * &_110011; let t4 = square_n(&t3, 8); t4 }; let i2618 = { let t0 = &_110011 * &i2599; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10100111; let t3 = square_n(&t2, 6); let t4 = &t3 * &_11011; t4 }; let i2648 = { let t0 = square_n(&i2618, 8); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 12); let t3 = &t2 * &_10101111; let t4 = square_n(&t3, 8); t4 }; let i2671 = { let t0 = &_101101 * &i2648; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10101111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_11100101; t4 }; let i2696 = { let t0 = square_n(&i2671, 7); let t1 = &t0 * &_110111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10110001; let t4 = square_n(&t3, 6); t4 }; let i2716 = { let t0 = &_101101 * &i2696; let t1 = square_n(&t0, 11); let t2 = &t1 * &_10001001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_1001; t4 }; let i2749 = { let t0 = square_n(&i2716, 9); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 12); let t3 = &t2 * &_101011; let t4 = square_n(&t3, 10); t4 }; let i2769 = { let t0 = &_100001 * &i2749; let t1 = square_n(&t0, 11); let t2 = &t1 * &_10001111; let t3 = square_n(&t2, 6); let t4 = &t3 * &_101001; t4 }; let i2800 = { let t0 = square_n(&i2769, 12); let t1 = &t0 * &_10111101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10111011; let t4 = square_n(&t3, 9); t4 }; let i2820 = { let t0 = &_101101 * &i2800; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10101001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1110011; t4 }; let i2849 = { let t0 = square_n(&i2820, 9); let t1 = &t0 * &_10000001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_101011; let t4 = square_n(&t3, 11); t4 }; let i2869 = { let t0 = &_10110101 * &i2849; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1110101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_10001101; t4 }; let i2895 = { let t0 = square_n(&i2869, 8); let t1 = &t0 * &_11111001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1110101; let t4 = square_n(&t3, 8); t4 }; let i2918 = { let t0 = &_1111 * &i2895; let t1 = square_n(&t0, 6); let t2 = &t1 * &_11; let t3 = square_n(&t2, 14); let t4 = &t3 * &_1011111; t4 }; let i2939 = { let t0 = square_n(&i2918, 5); let t1 = &t0 * &_1111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1100101; let t4 = square_n(&t3, 3); t4 }; let i2968 = { let t0 = &_11 * &i2939; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1011011; let t3 = square_n(&t2, 13); let t4 = &t3 * &_10001001; t4 }; let i2994 = { let t0 = square_n(&i2968, 8); let t1 = &t0 * &_10000111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10100001; let t4 = square_n(&t3, 8); t4 }; let i3013 = { let t0 = &_11001101 * &i2994; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1000111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1101111; t4 }; let i3042 = { let t0 = square_n(&i3013, 11); let t1 = &t0 * &_10010001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1011001; let t4 = square_n(&t3, 8); t4 }; let i3064 = { let t0 = &_100001 * &i3042; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1101001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_11010011; t4 }; let i3092 = { let t0 = square_n(&i3064, 8); let t1 = &t0 * &_11110011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110111; let t4 = square_n(&t3, 10); t4 }; let i3114 = { let t0 = &_101111 * &i3092; let t1 = square_n(&t0, 11); let t2 = &t1 * &_11100001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10000111; t4 }; let i3140 = { let t0 = square_n(&i3114, 5); let t1 = &t0 * &_10111; let t2 = square_n(&t1, 12); let t3 = &t2 * &_10111111; let t4 = square_n(&t3, 7); t4 }; let i3165 = { let t0 = &_1110011 * &i3140; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11110111; let t3 = square_n(&t2, 12); let t4 = &t3 * &_10110011; t4 }; let i3191 = { let t0 = square_n(&i3165, 8); let t1 = &t0 * &_10111111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1010011; let t4 = square_n(&t3, 9); t4 }; let i3212 = { let t0 = &_1100101 * &i3191; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10000001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_10101101; t4 }; let i3239 = { let t0 = square_n(&i3212, 6); let t1 = &t0 * &_11011; let t2 = square_n(&t1, 11); let t3 = &t2 * &_10111101; let t4 = square_n(&t3, 8); t4 }; let i3258 = { let t0 = &_11100001 * &i3239; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1111001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1110111; t4 }; let i3287 = { let t0 = square_n(&i3258, 10); let t1 = &t0 * &_11111001; let t2 = square_n(&t1, 6); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 11); t4 }; let i3308 = { let t0 = &_11110101 * &i3287; let t1 = square_n(&t0, 7); let t2 = &t1 * &_100101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11101111; t4 }; let i3344 = { let t0 = square_n(&i3308, 11); let t1 = &t0 * &_1100111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1110001; let t4 = square_n(&t3, 13); t4 }; let i3365 = { let t0 = &_1100011 * &i3344; let t1 = square_n(&t0, 12); let t2 = &t1 * &_11110111; let t3 = square_n(&t2, 6); let t4 = &t3 * &_111011; t4 }; let i3399 = { let t0 = square_n(&i3365, 12); let t1 = &t0 * &_10010001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1110101; let t4 = square_n(&t3, 13); t4 }; let i3418 = { let t0 = &_11100101 * &i3399; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1010111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1100111; t4 }; let i3444 = { let t0 = square_n(&i3418, 9); let t1 = &t0 * &_11110101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1010011; let t4 = square_n(&t3, 6); t4 }; let i3470 = { let t0 = &_10001 * &i3444; let t1 = square_n(&t0, 9); let t2 = &t1 * &_101101; let t3 = square_n(&t2, 14); let t4 = &t3 * &_1101001; t4 }; let i3497 = { let t0 = square_n(&i3470, 9); let t1 = &t0 * &_10100101; let t2 = square_n(&t1, 4); let t3 = &t2 * &_101; let t4 = square_n(&t3, 12); t4 }; let i3515 = { let t0 = &_1010001 * &i3497; let t1 = square_n(&t0, 3); let t2 = &t1 * &base; let t3 = square_n(&t2, 12); let t4 = &t3 * &_11011; t4 }; let i3551 = { let t0 = square_n(&i3515, 14); let t1 = &t0 * &_11011001; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1101011; let t4 = square_n(&t3, 8); t4 }; let i3570 = { let t0 = &_1101111 * &i3551; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10110111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_110001; t4 }; let i3604 = { let t0 = square_n(&i3570, 10); let t1 = &t0 * &_11110111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11111111; let t4 = square_n(&t3, 14); t4 }; let i3623 = { let t0 = &_10101001 * &i3604; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11010001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1011011; t4 }; let i3650 = { let t0 = square_n(&i3623, 9); let t1 = &t0 * &_10100111; let t2 = square_n(&t1, 4); let t3 = &t2 * &_1111; let t4 = square_n(&t3, 12); t4 }; let i3676 = { let t0 = &_100101 * &i3650; let t1 = square_n(&t0, 15); let t2 = &t1 * &_10011111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11001011; t4 }; let i3706 = { let t0 = square_n(&i3676, 9); let t1 = &t0 * &_11000101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11101111; let t4 = square_n(&t3, 11); t4 }; let i3726 = { let t0 = &_11101101 * &i3706; let t1 = square_n(&t0, 6); let t2 = &t1 * &_100101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10001011; t4 }; let i3753 = { let t0 = square_n(&i3726, 7); let t1 = &t0 * &_1010001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1011001; let t4 = square_n(&t3, 9); t4 }; let i3771 = { let t0 = &_10001001 * &i3753; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11101011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1000101; t4 }; let i3804 = { let t0 = square_n(&i3771, 11); let t1 = &t0 * &_1010011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1001111; let t4 = square_n(&t3, 12); t4 }; let i3825 = { let t0 = &_1101111 * &i3804; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11111101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1100111; t4 }; let i3852 = { let t0 = square_n(&i3825, 8); let t1 = &t0 * &_1000001; let t2 = square_n(&t1, 3); let t3 = &t2 * &_11; let t4 = square_n(&t3, 14); t4 }; let i3867 = { let t0 = &_10101101 * &i3852; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10011001; let t3 = square_n(&t2, 4); let t4 = &t3 * &_1011; t4 }; let i3895 = { let t0 = square_n(&i3867, 14); let t1 = &t0 * &_11110011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10101001; let t4 = square_n(&t3, 4); t4 }; let i3919 = { let t0 = &_1101 * &i3895; let t1 = square_n(&t0, 11); let t2 = &t1 * &_110111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_11011111; t4 }; let i3946 = { let t0 = square_n(&i3919, 9); let t1 = &t0 * &_10010011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_10101; let t4 = square_n(&t3, 10); t4 }; let i3967 = { let t0 = &_1101001 * &i3946; let t1 = square_n(&t0, 12); let t2 = &t1 * &_10011011; let t3 = square_n(&t2, 6); let t4 = &t3 * &_110111; t4 }; let i3998 = { let t0 = square_n(&i3967, 10); let t1 = &t0 * &_11000111; let t2 = square_n(&t1, 6); let t3 = &t2 * &_11011; let t4 = square_n(&t3, 13); t4 }; let i4017 = { let t0 = &_11010111 * &i3998; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1001001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11100011; t4 }; let i4047 = { let t0 = square_n(&i4017, 8); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 11); let t3 = &t2 * &_11111011; let t4 = square_n(&t3, 9); t4 }; let i4063 = { let t0 = &_10111111 * &i4047; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10100011; let t3 = square_n(&t2, 5); let t4 = &t3 * &_1101; t4 }; let i4093 = { let t0 = square_n(&i4063, 11); let t1 = &t0 * &_1110001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10111101; let t4 = square_n(&t3, 8); t4 }; let i4113 = { let t0 = &_10111011 * &i4093; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10001101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10100001; t4 }; let i4143 = { let t0 = square_n(&i4113, 9); let t1 = &t0 * &_11111001; let t2 = square_n(&t1, 11); let t3 = &t2 * &_10111111; let t4 = square_n(&t3, 8); t4 }; let i4168 = { let t0 = &_11111001 * &i4143; let t1 = square_n(&t0, 5); let t2 = &t1 * &_111; let t3 = square_n(&t2, 17); let t4 = &t3 * &_10001001; t4 }; let i4191 = { let t0 = square_n(&i4168, 4); let t1 = &t0 * &_1001; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1111001; let t4 = square_n(&t3, 5); t4 }; let i4217 = { let t0 = &_1001 * &i4191; let t1 = square_n(&t0, 14); let t2 = &t1 * &_10111101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11111111; t4 }; let i4245 = { let t0 = square_n(&i4217, 8); let t1 = &t0 * &_10101011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10101101; let t4 = square_n(&t3, 10); t4 }; let i4267 = { let t0 = &_101111 * &i4245; let t1 = square_n(&t0, 11); let t2 = &t1 * &_110011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_101101; t4 }; let i4294 = { let t0 = square_n(&i4267, 9); let t1 = &t0 * &_1100001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10111001; let t4 = square_n(&t3, 7); t4 }; let i4317 = { let t0 = &_100001 * &i4294; let t1 = square_n(&t0, 12); let t2 = &t1 * &_11110001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10101101; t4 }; let i4345 = { let t0 = square_n(&i4317, 11); let t1 = &t0 * &_10111011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1111011; let t4 = square_n(&t3, 8); t4 }; let i4366 = { let t0 = &_1101101 * &i4345; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10100101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1110111; t4 }; let i4396 = { let t0 = square_n(&i4366, 11); let t1 = &t0 * &_11100101; let t2 = square_n(&t1, 4); let t3 = &t2 * &_111; let t4 = square_n(&t3, 13); t4 }; let i4418 = { let t0 = &_1100011 * &i4396; let t1 = square_n(&t0, 9); let t2 = &t1 * &_111111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_10010011; t4 }; let i4446 = { let t0 = square_n(&i4418, 9); let t1 = &t0 * &_11111011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1111111; let t4 = square_n(&t3, 9); t4 }; let i4462 = { let t0 = &_10010101 * &i4446; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10010101; let t3 = square_n(&t2, 5); let t4 = &t3 * &_10011; t4 }; let i4495 = { let t0 = square_n(&i4462, 11); let t1 = &t0 * &_1101101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1000111; let t4 = square_n(&t3, 12); t4 }; let i4514 = { let t0 = &_11000001 * &i4495; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1101111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1100001; t4 }; let i4543 = { let t0 = square_n(&i4514, 10); let t1 = &t0 * &_10011101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11000001; let t4 = square_n(&t3, 9); t4 }; let i4562 = { let t0 = &_1010011 * &i4543; let t1 = square_n(&t0, 7); let t2 = &t1 * &_111111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_101001; t4 }; let i4589 = { let t0 = square_n(&i4562, 10); let t1 = &t0 * &_11010001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_11110111; let t4 = square_n(&t3, 6); t4 }; let i4609 = { let t0 = &_111001 * &i4589; let t1 = square_n(&t0, 4); let t2 = &t1 * &_11; let t3 = square_n(&t2, 13); let t4 = &t3 * &_1001001; t4 }; let i4637 = { let t0 = square_n(&i4609, 8); let t1 = &t0 * &_1010001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_11101011; let t4 = square_n(&t3, 9); t4 }; let i4658 = { let t0 = &_10100101 * &i4637; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11100101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10001; t4 }; let i4686 = { let t0 = square_n(&i4658, 11); let t1 = &t0 * &_10011011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10001011; let t4 = square_n(&t3, 7); t4 }; let i4706 = { let t0 = &_1111111 * &i4686; let t1 = square_n(&t0, 7); let t2 = &t1 * &_100011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1101011; t4 }; let i4732 = { let t0 = square_n(&i4706, 9); let t1 = &t0 * &_10010001; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 10); t4 }; let i4760 = { let t0 = &_10001 * &i4732; let t1 = square_n(&t0, 17); let t2 = &t1 * &_10000101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11001111; t4 }; let i4787 = { let t0 = square_n(&i4760, 7); let t1 = &t0 * &_1000111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_11011011; let t4 = square_n(&t3, 9); t4 }; let i4806 = { let t0 = &_10011101 * &i4787; let t1 = square_n(&t0, 6); let t2 = &t1 * &_101101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_111001; t4 }; let i4834 = { let t0 = square_n(&i4806, 10); let t1 = &t0 * &_11111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_110011; let t4 = square_n(&t3, 7); t4 }; let i4863 = { let t0 = &_10101 * &i4834; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1111; let t3 = square_n(&t2, 15); let t4 = &t3 * &_11111011; t4 }; let i4889 = { let t0 = square_n(&i4863, 7); let t1 = &t0 * &_1001101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_11001; let t4 = square_n(&t3, 11); t4 }; let i4914 = { let t0 = &_11110111 * &i4889; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1111111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_10000011; t4 }; let i4942 = { let t0 = square_n(&i4914, 10); let t1 = &t0 * &_11100011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11010011; let t4 = square_n(&t3, 6); t4 }; let i4959 = { let t0 = &_111011 * &i4942; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11111111; let t3 = square_n(&t2, 4); let t4 = &t3 * &_1001; t4 }; let i4991 = { let t0 = square_n(&i4959, 12); let t1 = &t0 * &_10111111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110001; let t4 = square_n(&t3, 10); t4 }; let i5010 = { let t0 = &_11001111 * &i4991; let t1 = square_n(&t0, 6); let t2 = &t1 * &_111111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_11011; t4 }; let i5033 = { let t0 = square_n(&i5010, 11); let t1 = &t0 * &_11110001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1111111; let t4 = square_n(&t3, 3); t4 }; let i5060 = { let t0 = &_11 * &i5033; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1010001; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11101111; t4 }; let i5088 = { let t0 = square_n(&i5060, 6); let t1 = &t0 * &_101111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_11010111; let t4 = square_n(&t3, 9); t4 }; let i5109 = { let t0 = &_10101101 * &i5088; let t1 = square_n(&t0, 11); let t2 = &t1 * &_11011001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1011101; t4 }; let i5134 = { let t0 = square_n(&i5109, 9); let t1 = &t0 * &_10101011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10010111; let t4 = square_n(&t3, 6); t4 }; let i5161 = { let t0 = &_100101 * &i5134; let t1 = square_n(&t0, 12); let t2 = &t1 * &_11001101; let t3 = square_n(&t2, 12); let t4 = &t3 * &_10000011; t4 }; let i5192 = { let t0 = square_n(&i5161, 7); let t1 = &t0 * &_1101011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10110011; let t4 = square_n(&t3, 12); t4 }; let i5209 = { let t0 = &_1100001 * &i5192; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1001001; let t3 = square_n(&t2, 5); let t4 = &t3 * &_1011; t4 }; let i5243 = { let t0 = square_n(&i5209, 12); let t1 = &t0 * &_11100101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110111; let t4 = square_n(&t3, 12); t4 }; let i5264 = { let t0 = &_11111111 * &i5243; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11110001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11101101; t4 }; let i5291 = { let t0 = square_n(&i5264, 9); let t1 = &t0 * &_11100111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1100101; let t4 = square_n(&t3, 9); t4 }; let i5314 = { let t0 = &_1101011 * &i5291; let t1 = square_n(&t0, 4); let t2 = &t1 * &_11; let t3 = square_n(&t2, 16); let t4 = &t3 * &_11001011; t4 }; let i5341 = { let t0 = square_n(&i5314, 7); let t1 = &t0 * &_1010101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10100111; let t4 = square_n(&t3, 8); t4 }; let i5359 = { let t0 = &_10100001 * &i5341; let t1 = square_n(&t0, 4); let t2 = &t1 * &_1111; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1011101; t4 }; let i5388 = { let t0 = square_n(&i5359, 10); let t1 = &t0 * &_10111101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11111101; let t4 = square_n(&t3, 7); t4 }; let i5406 = { let t0 = &_1011011 * &i5388; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1011111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_110101; t4 }; let i5435 = { let t0 = square_n(&i5406, 10); let t1 = &t0 * &_10110001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11010011; let t4 = square_n(&t3, 9); t4 }; let i5457 = { let t0 = &_11011011 * &i5435; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11101101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1010011; t4 }; let i5485 = { let t0 = square_n(&i5457, 3); let t1 = &t0 * &_11; let t2 = square_n(&t1, 13); let t3 = &t2 * &_1001111; let t4 = square_n(&t3, 10); t4 }; let i5506 = { let t0 = &_1010101 * &i5485; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10100011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11110111; t4 }; let i5530 = { let t0 = square_n(&i5506, 8); let t1 = &t0 * &_11110011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1011011; let t4 = square_n(&t3, 7); t4 }; let i5547 = { let t0 = &_111011 * &i5530; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11010111; let t3 = square_n(&t2, 4); let t4 = &t3 * &_1011; t4 }; let i5576 = { let t0 = square_n(&i5547, 12); let t1 = &t0 * &_1000101; let t2 = square_n(&t1, 11); let t3 = &t2 * &_11110111; let t4 = square_n(&t3, 4); t4 }; let i5600 = { let t0 = &_1001 * &i5576; let t1 = square_n(&t0, 13); let t2 = &t1 * &_11001111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11001011; t4 }; let i5631 = { let t0 = square_n(&i5600, 9); let t1 = &t0 * &_10010111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10101; let t4 = square_n(&t3, 11); t4 }; let i5650 = { let t0 = &_10011111 * &i5631; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11011101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1101011; t4 }; let i5676 = { let t0 = square_n(&i5650, 7); let t1 = &t0 * &_100011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10111001; let t4 = square_n(&t3, 7); t4 }; let i5697 = { let t0 = &_1001011 * &i5676; let t1 = square_n(&t0, 8); let t2 = &t1 * &_110011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_11100011; t4 }; let i5725 = { let t0 = square_n(&i5697, 8); let t1 = &t0 * &_11001001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10011011; let t4 = square_n(&t3, 9); t4 }; let i5744 = { let t0 = &_10100111 * &i5725; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11001011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10011001; t4 }; let i5773 = { let t0 = square_n(&i5744, 7); let t1 = &t0 * &_11111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_11110111; let t4 = square_n(&t3, 9); t4 }; let i5793 = { let t0 = &_11100101 * &i5773; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11010111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10011001; t4 }; let i5821 = { let t0 = square_n(&i5793, 6); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 12); let t3 = &t2 * &_11101011; let t4 = square_n(&t3, 8); t4 }; let i5844 = { let t0 = &_1111001 * &i5821; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10110111; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10100001; t4 }; let i5867 = { let t0 = square_n(&i5844, 9); let t1 = &t0 * &_10111001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11001001; let t4 = square_n(&t3, 4); t4 }; let i5890 = { let t0 = &_1011 * &i5867; let t1 = square_n(&t0, 13); let t2 = &t1 * &_11110101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1001001; t4 }; let i5917 = { let t0 = square_n(&i5890, 8); let t1 = &t0 * &_1011101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_10111; let t4 = square_n(&t3, 11); t4 }; let i5939 = { let t0 = &_10010101 * &i5917; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1011101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_11110101; t4 }; let i5969 = { let t0 = square_n(&i5939, 5); let t1 = &t0 * &_1001; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1110111; let t4 = square_n(&t3, 12); t4 }; let i5985 = { let t0 = &_10110011 * &i5969; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10110101; let t3 = square_n(&t2, 5); let t4 = &t3 * &_10111; t4 }; let i6017 = { let t0 = square_n(&i5985, 12); let t1 = &t0 * &_11011111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11111011; let t4 = square_n(&t3, 8); t4 }; let i6037 = { let t0 = &_10101011 * &i6017; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11010001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_10000011; t4 }; let i6066 = { let t0 = square_n(&i6037, 9); let t1 = &t0 * &_11011111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1010111; let t4 = square_n(&t3, 7); t4 }; let i6088 = { let t0 = &_110001 * &i6066; let t1 = square_n(&t0, 5); let t2 = &t1 * &_111; let t3 = square_n(&t2, 14); let t4 = &t3 * &_11011111; t4 }; let i6112 = { let t0 = square_n(&i6088, 6); let t1 = &t0 * &_101101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1101101; let t4 = square_n(&t3, 7); t4 }; let i6137 = { let t0 = &_110111 * &i6112; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10001; let t3 = square_n(&t2, 13); let t4 = &t3 * &_11100011; t4 }; let i6161 = { let t0 = square_n(&i6137, 8); let t1 = &t0 * &_10010001; let t2 = square_n(&t1, 5); let t3 = &t2 * &_11001; let t4 = square_n(&t3, 9); t4 }; let i6182 = { let t0 = &_101101 * &i6161; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1011101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1110101; t4 }; let i6208 = { let t0 = square_n(&i6182, 10); let t1 = &t0 * &_10101001; let t2 = square_n(&t1, 11); let t3 = &t2 * &_10000101; let t4 = square_n(&t3, 3); t4 }; let i6235 = { let t0 = &_111 * &i6208; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 14); let t4 = &t3 * &_101001; t4 }; let i6263 = { let t0 = square_n(&i6235, 10); let t1 = &t0 * &_1100001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10010011; let t4 = square_n(&t3, 7); t4 }; let i6283 = { let t0 = &_100111 * &i6263; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10111111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1111101; t4 }; let i6314 = { let t0 = square_n(&i6283, 12); let t1 = &t0 * &_11101111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1111101; let t4 = square_n(&t3, 8); t4 }; let result = { let t0 = &_10111 * &i6314; t0 }; result } } pub mod bls12_381 { use super::square_n; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree12ExtensionField; use lambdaworks_math::field::element::FieldElement; /// Generated from tools/addchain/bls12_381_h3_s.acc pub fn pow_h3_s( base: &FieldElement, ) -> FieldElement { let base = base.clone(); let _10 = { let t0 = square_n(&base, 1); t0 }; let _11 = { let t0 = &base * &_10; t0 }; let _101 = { let t0 = &_10 * &_11; t0 }; let _111 = { let t0 = &_10 * &_101; t0 }; let _1001 = { let t0 = &_10 * &_111; t0 }; let _1011 = { let t0 = &_10 * &_1001; t0 }; let _1101 = { let t0 = &_10 * &_1011; t0 }; let _1111 = { let t0 = &_10 * &_1101; t0 }; let _10001 = { let t0 = &_10 * &_1111; t0 }; let _10011 = { let t0 = &_10 * &_10001; t0 }; let _10101 = { let t0 = &_10 * &_10011; t0 }; let _10111 = { let t0 = &_10 * &_10101; t0 }; let _11001 = { let t0 = &_10 * &_10111; t0 }; let _11011 = { let t0 = &_10 * &_11001; t0 }; let _11101 = { let t0 = &_10 * &_11011; t0 }; let _11111 = { let t0 = &_10 * &_11101; t0 }; let _100001 = { let t0 = &_10 * &_11111; t0 }; let _100011 = { let t0 = &_10 * &_100001; t0 }; let _100101 = { let t0 = &_10 * &_100011; t0 }; let _100110 = { let t0 = &base * &_100101; t0 }; let _100111 = { let t0 = &base * &_100110; t0 }; let _101001 = { let t0 = &_10 * &_100111; t0 }; let _101011 = { let t0 = &_10 * &_101001; t0 }; let _101101 = { let t0 = &_10 * &_101011; t0 }; let _110001 = { let t0 = &_1011 * &_100110; t0 }; let _110011 = { let t0 = &_10 * &_110001; t0 }; let _110101 = { let t0 = &_10 * &_110011; t0 }; let _110111 = { let t0 = &_10 * &_110101; t0 }; let _111001 = { let t0 = &_10 * &_110111; t0 }; let _111011 = { let t0 = &_10 * &_111001; t0 }; let _111101 = { let t0 = &_10 * &_111011; t0 }; let _111111 = { let t0 = &_10 * &_111101; t0 }; let _1000001 = { let t0 = &_10 * &_111111; t0 }; let _1000011 = { let t0 = &_10 * &_1000001; t0 }; let _1000101 = { let t0 = &_10 * &_1000011; t0 }; let _1000111 = { let t0 = &_10 * &_1000101; t0 }; let _1001001 = { let t0 = &_10 * &_1000111; t0 }; let _1001011 = { let t0 = &_10 * &_1001001; t0 }; let _1001101 = { let t0 = &_10 * &_1001011; t0 }; let _1001111 = { let t0 = &_10 * &_1001101; t0 }; let _1010001 = { let t0 = &_10 * &_1001111; t0 }; let _1010011 = { let t0 = &_10 * &_1010001; t0 }; let _1010101 = { let t0 = &_10 * &_1010011; t0 }; let _1010111 = { let t0 = &_10 * &_1010101; t0 }; let _1011001 = { let t0 = &_10 * &_1010111; t0 }; let _1011011 = { let t0 = &_10 * &_1011001; t0 }; let _1011101 = { let t0 = &_10 * &_1011011; t0 }; let _1011111 = { let t0 = &_10 * &_1011101; t0 }; let _1100001 = { let t0 = &_10 * &_1011111; t0 }; let _1100011 = { let t0 = &_10 * &_1100001; t0 }; let _1100101 = { let t0 = &_10 * &_1100011; t0 }; let _1100111 = { let t0 = &_10 * &_1100101; t0 }; let _1101001 = { let t0 = &_10 * &_1100111; t0 }; let _1101011 = { let t0 = &_10 * &_1101001; t0 }; let _1101101 = { let t0 = &_10 * &_1101011; t0 }; let _1101111 = { let t0 = &_10 * &_1101101; t0 }; let _1110001 = { let t0 = &_10 * &_1101111; t0 }; let _1110011 = { let t0 = &_10 * &_1110001; t0 }; let _1110101 = { let t0 = &_10 * &_1110011; t0 }; let _1110111 = { let t0 = &_10 * &_1110101; t0 }; let _1111001 = { let t0 = &_10 * &_1110111; t0 }; let _1111011 = { let t0 = &_10 * &_1111001; t0 }; let _1111101 = { let t0 = &_10 * &_1111011; t0 }; let _1111111 = { let t0 = &_10 * &_1111101; t0 }; let _10000001 = { let t0 = &_10 * &_1111111; t0 }; let _10000011 = { let t0 = &_10 * &_10000001; t0 }; let _10000101 = { let t0 = &_10 * &_10000011; t0 }; let _10000111 = { let t0 = &_10 * &_10000101; t0 }; let _10001001 = { let t0 = &_10 * &_10000111; t0 }; let _10001011 = { let t0 = &_10 * &_10001001; t0 }; let _10001101 = { let t0 = &_10 * &_10001011; t0 }; let _10001111 = { let t0 = &_10 * &_10001101; t0 }; let _10010001 = { let t0 = &_10 * &_10001111; t0 }; let _10010011 = { let t0 = &_10 * &_10010001; t0 }; let _10010101 = { let t0 = &_10 * &_10010011; t0 }; let _10010111 = { let t0 = &_10 * &_10010101; t0 }; let _10011001 = { let t0 = &_10 * &_10010111; t0 }; let _10011011 = { let t0 = &_10 * &_10011001; t0 }; let _10011101 = { let t0 = &_10 * &_10011011; t0 }; let _10011111 = { let t0 = &_10 * &_10011101; t0 }; let _10100001 = { let t0 = &_10 * &_10011111; t0 }; let _10100011 = { let t0 = &_10 * &_10100001; t0 }; let _10100101 = { let t0 = &_10 * &_10100011; t0 }; let _10100111 = { let t0 = &_10 * &_10100101; t0 }; let _10101001 = { let t0 = &_10 * &_10100111; t0 }; let _10101011 = { let t0 = &_10 * &_10101001; t0 }; let _10101101 = { let t0 = &_10 * &_10101011; t0 }; let _10101111 = { let t0 = &_10 * &_10101101; t0 }; let _10110001 = { let t0 = &_10 * &_10101111; t0 }; let _10110011 = { let t0 = &_10 * &_10110001; t0 }; let _10110101 = { let t0 = &_10 * &_10110011; t0 }; let _10110111 = { let t0 = &_10 * &_10110101; t0 }; let _10111001 = { let t0 = &_10 * &_10110111; t0 }; let _10111011 = { let t0 = &_10 * &_10111001; t0 }; let _10111101 = { let t0 = &_10 * &_10111011; t0 }; let _10111111 = { let t0 = &_10 * &_10111101; t0 }; let _11000001 = { let t0 = &_10 * &_10111111; t0 }; let _11000011 = { let t0 = &_10 * &_11000001; t0 }; let _11000101 = { let t0 = &_10 * &_11000011; t0 }; let _11000111 = { let t0 = &_10 * &_11000101; t0 }; let _11001001 = { let t0 = &_10 * &_11000111; t0 }; let _11001011 = { let t0 = &_10 * &_11001001; t0 }; let _11001101 = { let t0 = &_10 * &_11001011; t0 }; let _11001111 = { let t0 = &_10 * &_11001101; t0 }; let _11010001 = { let t0 = &_10 * &_11001111; t0 }; let _11010011 = { let t0 = &_10 * &_11010001; t0 }; let _11010101 = { let t0 = &_10 * &_11010011; t0 }; let _11010111 = { let t0 = &_10 * &_11010101; t0 }; let _11011001 = { let t0 = &_10 * &_11010111; t0 }; let _11011011 = { let t0 = &_10 * &_11011001; t0 }; let _11011101 = { let t0 = &_10 * &_11011011; t0 }; let _11011111 = { let t0 = &_10 * &_11011101; t0 }; let _11100001 = { let t0 = &_10 * &_11011111; t0 }; let _11100011 = { let t0 = &_10 * &_11100001; t0 }; let _11100101 = { let t0 = &_10 * &_11100011; t0 }; let _11100111 = { let t0 = &_10 * &_11100101; t0 }; let _11101001 = { let t0 = &_10 * &_11100111; t0 }; let _11101011 = { let t0 = &_10 * &_11101001; t0 }; let _11101101 = { let t0 = &_10 * &_11101011; t0 }; let _11101111 = { let t0 = &_10 * &_11101101; t0 }; let _11110101 = { let t0 = &_100110 * &_11001111; t0 }; let _11110111 = { let t0 = &_10 * &_11110101; t0 }; let _11111001 = { let t0 = &_10 * &_11110111; t0 }; let _11111101 = { let t0 = &_100110 * &_11010111; t0 }; let _11111111 = { let t0 = &_10 * &_11111101; t0 }; let i145 = { let t0 = &_110001 * &_11111111; let t1 = square_n(&t0, 7); let t2 = &t1 * &_11001101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_10100111; t4 }; let i172 = { let t0 = square_n(&i145, 9); let t1 = &t0 * &_1001011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1011001; let t4 = square_n(&t3, 8); t4 }; let i199 = { let t0 = &_100001 * &i172; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10111; let t3 = square_n(&t2, 14); let t4 = &t3 * &_1111101; t4 }; let i228 = { let t0 = square_n(&i199, 11); let t1 = &t0 * &_1000111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_11111101; let t4 = square_n(&t3, 7); t4 }; let i248 = { let t0 = &_1101011 * &i228; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11011001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1011111; t4 }; let i274 = { let t0 = square_n(&i248, 8); let t1 = &t0 * &_1101011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1001111; let t4 = square_n(&t3, 7); t4 }; let i295 = { let t0 = &_101001 * &i274; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10100011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11101011; t4 }; let i321 = { let t0 = square_n(&i295, 9); let t1 = &t0 * &_11011011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_111111; let t4 = square_n(&t3, 9); t4 }; let i342 = { let t0 = &_100111 * &i321; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1011001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11000101; t4 }; let i368 = { let t0 = square_n(&i342, 7); let t1 = &t0 * &_1101111; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10010011; let t4 = square_n(&t3, 8); t4 }; let i388 = { let t0 = &_10001001 * &i368; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11101001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1010011; t4 }; let i417 = { let t0 = square_n(&i388, 3); let t1 = &t0 * &_11; let t2 = square_n(&t1, 15); let t3 = &t2 * &_1110101; let t4 = square_n(&t3, 9); t4 }; let i437 = { let t0 = &_10110111 * &i417; let t1 = square_n(&t0, 5); let t2 = &t1 * &_10001; let t3 = square_n(&t2, 12); let t4 = &t3 * &_10010111; t4 }; let i463 = { let t0 = square_n(&i437, 9); let t1 = &t0 * &_10101001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10100111; let t4 = square_n(&t3, 6); t4 }; let i486 = { let t0 = &_10101 * &i463; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10101011; t4 }; let i513 = { let t0 = square_n(&i486, 4); let t1 = &t0 * &_101; let t2 = square_n(&t1, 13); let t3 = &t2 * &_10001101; let t4 = square_n(&t3, 8); t4 }; let i530 = { let t0 = &_10100011 * &i513; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11011101; let t3 = square_n(&t2, 6); let t4 = &t3 * &_10011; t4 }; let i560 = { let t0 = square_n(&i530, 11); let t1 = &t0 * &_1101111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_101001; let t4 = square_n(&t3, 9); t4 }; let i582 = { let t0 = &_1001101 * &i560; let t1 = square_n(&t0, 11); let t2 = &t1 * &_10111001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11000011; t4 }; let i606 = { let t0 = square_n(&i582, 9); let t1 = &t0 * &_11100111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11010011; let t4 = square_n(&t3, 3); t4 }; let i630 = { let t0 = &_101 * &i606; let t1 = square_n(&t0, 13); let t2 = &t1 * &_10110011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11011101; t4 }; let i661 = { let t0 = square_n(&i630, 8); let t1 = &t0 * &_1000011; let t2 = square_n(&t1, 12); let t3 = &t2 * &_10101111; let t4 = square_n(&t3, 9); t4 }; let i679 = { let t0 = &_10010001 * &i661; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10000001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_100101; t4 }; let i708 = { let t0 = square_n(&i679, 8); let t1 = &t0 * &_100101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1100111; let t4 = square_n(&t3, 9); t4 }; let i727 = { let t0 = &_1100001 * &i708; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10110101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_110011; t4 }; let i755 = { let t0 = square_n(&i727, 8); let t1 = &t0 * &_101101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1101101; let t4 = square_n(&t3, 8); t4 }; let i776 = { let t0 = &_1110111 * &i755; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1101011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11001011; t4 }; let i806 = { let t0 = square_n(&i776, 4); let t1 = &t0 * &_1001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 15); t4 }; let i826 = { let t0 = &_11000011 * &i806; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10001001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1011101; t4 }; let i855 = { let t0 = square_n(&i826, 9); let t1 = &t0 * &_10011111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1100111; let t4 = square_n(&t3, 10); t4 }; let i876 = { let t0 = &_11100101 * &i855; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10101111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_10001111; t4 }; let i904 = { let t0 = square_n(&i876, 7); let t1 = &t0 * &_110001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1110111; let t4 = square_n(&t3, 10); t4 }; let i925 = { let t0 = &_1100011 * &i904; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1010101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11110111; t4 }; let i955 = { let t0 = square_n(&i925, 10); let t1 = &t0 * &_10100011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11110101; let t4 = square_n(&t3, 8); t4 }; let i978 = { let t0 = &_11101111 * &i955; let t1 = square_n(&t0, 12); let t2 = &t1 * &_11100001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10000001; t4 }; let i1010 = { let t0 = square_n(&i978, 5); let t1 = &t0 * &_10101; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1111101; let t4 = square_n(&t3, 14); t4 }; let i1029 = { let t0 = &_11101001 * &i1010; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1110011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11000101; t4 }; let i1057 = { let t0 = square_n(&i1029, 11); let t1 = &t0 * &_1001011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10101011; let t4 = square_n(&t3, 6); t4 }; let i1081 = { let t0 = &_111011 * &i1057; let t1 = square_n(&t0, 11); let t2 = &t1 * &_111101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_10011101; t4 }; let i1108 = { let t0 = square_n(&i1081, 8); let t1 = &t0 * &_10000011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11010111; let t4 = square_n(&t3, 9); t4 }; let i1129 = { let t0 = &_11010001 * &i1108; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11011001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_10101001; t4 }; let i1157 = { let t0 = square_n(&i1129, 5); let t1 = &t0 * &_10011; let t2 = square_n(&t1, 12); let t3 = &t2 * &_11010011; let t4 = square_n(&t3, 9); t4 }; let i1176 = { let t0 = &_10101101 * &i1157; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11110101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10000101; t4 }; let i1201 = { let t0 = square_n(&i1176, 7); let t1 = &t0 * &_1111011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1110001; let t4 = square_n(&t3, 8); t4 }; let i1222 = { let t0 = &_1111011 * &i1201; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11010001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11111101; t4 }; let i1250 = { let t0 = square_n(&i1222, 7); let t1 = &t0 * &_1101101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1111011; let t4 = square_n(&t3, 11); t4 }; let i1270 = { let t0 = &_11101111 * &i1250; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11101101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11111001; t4 }; let i1299 = { let t0 = square_n(&i1270, 10); let t1 = &t0 * &_10000011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11110111; let t4 = square_n(&t3, 9); t4 }; let i1322 = { let t0 = &_101101 * &i1299; let t1 = square_n(&t0, 8); let t2 = &t1 * &_100101; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1111101; t4 }; let i1354 = { let t0 = square_n(&i1322, 10); let t1 = &t0 * &_1001011; let t2 = square_n(&t1, 11); let t3 = &t2 * &_11011001; let t4 = square_n(&t3, 9); t4 }; let i1376 = { let t0 = &_100101 * &i1354; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10001011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11101111; t4 }; let i1399 = { let t0 = square_n(&i1376, 8); let t1 = &t0 * &_1010111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1010111; let t4 = square_n(&t3, 5); t4 }; let i1423 = { let t0 = &_111 * &i1399; let t1 = square_n(&t0, 12); let t2 = &t1 * &_1001001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_10000111; t4 }; let i1449 = { let t0 = square_n(&i1423, 7); let t1 = &t0 * &_1111111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_11011; let t4 = square_n(&t3, 10); t4 }; let i1470 = { let t0 = &_1111011 * &i1449; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10011101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11011001; t4 }; let i1499 = { let t0 = square_n(&i1470, 6); let t1 = &t0 * &_11001; let t2 = square_n(&t1, 11); let t3 = &t2 * &_10111101; let t4 = square_n(&t3, 10); t4 }; let i1522 = { let t0 = &_1111101 * &i1499; let t1 = square_n(&t0, 12); let t2 = &t1 * &_11010001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11010011; t4 }; let i1548 = { let t0 = square_n(&i1522, 8); let t1 = &t0 * &_11000011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10010011; let t4 = square_n(&t3, 8); t4 }; let i1563 = { let t0 = &_10011001 * &i1548; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1110111; let t3 = square_n(&t2, 5); let t4 = &t3 * &_1011; t4 }; let i1599 = { let t0 = square_n(&i1563, 18); let t1 = &t0 * &_10001101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10101101; let t4 = square_n(&t3, 7); t4 }; let i1618 = { let t0 = &_1100101 * &i1599; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1001001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1111111; t4 }; let i1651 = { let t0 = square_n(&i1618, 10); let t1 = &t0 * &_10010101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_100011; let t4 = square_n(&t3, 11); t4 }; let i1672 = { let t0 = &_11100111 * &i1651; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1101111; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1000001; t4 }; let i1701 = { let t0 = square_n(&i1672, 9); let t1 = &t0 * &_10100011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10010111; let t4 = square_n(&t3, 8); t4 }; let i1720 = { let t0 = &_11101001 * &i1701; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1111101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_110011; t4 }; let i1752 = { let t0 = square_n(&i1720, 8); let t1 = &t0 * &_110101; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1010011; let t4 = square_n(&t3, 10); t4 }; let i1775 = { let t0 = &_1101001 * &i1752; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1000001; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11001111; t4 }; let i1801 = { let t0 = square_n(&i1775, 6); let t1 = &t0 * &_110001; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11010011; let t4 = square_n(&t3, 8); t4 }; let i1825 = { let t0 = &_11001011 * &i1801; let t1 = square_n(&t0, 13); let t2 = &t1 * &_11101001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10010111; t4 }; let i1852 = { let t0 = square_n(&i1825, 7); let t1 = &t0 * &_1111011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11001001; let t4 = square_n(&t3, 8); t4 }; let i1874 = { let t0 = &_11111101 * &i1852; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1011011; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1010111; t4 }; let i1906 = { let t0 = square_n(&i1874, 11); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_110001; let t4 = square_n(&t3, 10); t4 }; let i1925 = { let t0 = &_10111001 * &i1906; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10011001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10110101; t4 }; let i1954 = { let t0 = square_n(&i1925, 11); let t1 = &t0 * &_10100011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1010101; let t4 = square_n(&t3, 9); t4 }; let i1971 = { let t0 = &_11001011 * &i1954; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10110111; let t3 = square_n(&t2, 5); let t4 = &t3 * &_10001; t4 }; let i2003 = { let t0 = square_n(&i1971, 11); let t1 = &t0 * &_1101011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_100011; let t4 = square_n(&t3, 10); t4 }; let i2023 = { let t0 = &_11110111 * &i2003; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1011101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_11011; t4 }; let i2052 = { let t0 = square_n(&i2023, 10); let t1 = &t0 * &_1001001; let t2 = square_n(&t1, 6); let t3 = &t2 * &_11001; let t4 = square_n(&t3, 11); t4 }; let i2076 = { let t0 = &_10011011 * &i2052; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1100111; let t3 = square_n(&t2, 13); let t4 = &t3 * &_11001001; t4 }; let i2102 = { let t0 = square_n(&i2076, 8); let t1 = &t0 * &_11110111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11100101; let t4 = square_n(&t3, 8); t4 }; let i2127 = { let t0 = &_10111011 * &i2102; let t1 = square_n(&t0, 7); let t2 = &t1 * &_111001; let t3 = square_n(&t2, 15); let t4 = &t3 * &_11101011; t4 }; let i2153 = { let t0 = square_n(&i2127, 9); let t1 = &t0 * &_11010011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_10001; let t4 = square_n(&t3, 9); t4 }; let i2178 = { let t0 = &_110111 * &i2153; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11101001; let t3 = square_n(&t2, 12); let t4 = &t3 * &_11100011; t4 }; let i2205 = { let t0 = square_n(&i2178, 7); let t1 = &t0 * &_1010011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10101111; let t4 = square_n(&t3, 9); t4 }; let i2237 = { let t0 = &_10001 * &i2205; let t1 = square_n(&t0, 20); let t2 = &t1 * &_11111111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11111001; t4 }; let i2267 = { let t0 = square_n(&i2237, 8); let t1 = &t0 * &_10011111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_101001; let t4 = square_n(&t3, 12); t4 }; let i2287 = { let t0 = &_10110011 * &i2267; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1011101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_10111111; t4 }; let i2312 = { let t0 = square_n(&i2287, 8); let t1 = &t0 * &_11111101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11011001; let t4 = square_n(&t3, 7); t4 }; let i2333 = { let t0 = &_1011111 * &i2312; let t1 = square_n(&t0, 8); let t2 = &t1 * &_100011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_10011101; t4 }; let i2357 = { let t0 = square_n(&i2333, 8); let t1 = &t0 * &_11101001; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10101001; let t4 = square_n(&t3, 4); t4 }; let i2381 = { let t0 = &_111 * &i2357; let t1 = square_n(&t0, 14); let t2 = &t1 * &_10010101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_101011; t4 }; let i2407 = { let t0 = square_n(&i2381, 9); let t1 = &t0 * &_1111111; let t2 = square_n(&t1, 5); let t3 = &t2 * &_1011; let t4 = square_n(&t3, 10); t4 }; let i2428 = { let t0 = &_101101 * &i2407; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_11101; t4 }; let i2458 = { let t0 = square_n(&i2428, 11); let t1 = &t0 * &_10101111; let t2 = square_n(&t1, 4); let t3 = &t2 * &_11; let t4 = square_n(&t3, 13); t4 }; let i2482 = { let t0 = &_110111 * &i2458; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10110011; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1100111; t4 }; let i2514 = { let t0 = square_n(&i2482, 10); let t1 = &t0 * &_1101001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_101011; let t4 = square_n(&t3, 11); t4 }; let i2536 = { let t0 = &_1101001 * &i2514; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1100011; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10011001; t4 }; let i2564 = { let t0 = square_n(&i2536, 4); let t1 = &t0 * &_1101; let t2 = square_n(&t1, 15); let t3 = &t2 * &_1111011; let t4 = square_n(&t3, 7); t4 }; let i2586 = { let t0 = &_11011 * &i2564; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10111101; t4 }; let i2612 = { let t0 = square_n(&i2586, 6); let t1 = &t0 * &_110011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_11111; let t4 = square_n(&t3, 11); t4 }; let i2633 = { let t0 = &_11100101 * &i2612; let t1 = square_n(&t0, 8); let t2 = &t1 * &_111001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_10101111; t4 }; let i2661 = { let t0 = square_n(&i2633, 8); let t1 = &t0 * &_10000111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_110011; let t4 = square_n(&t3, 11); t4 }; let i2685 = { let t0 = &_11100101 * &i2661; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11010111; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10000001; t4 }; let i2715 = { let t0 = square_n(&i2685, 6); let t1 = &t0 * &_110001; let t2 = square_n(&t1, 12); let t3 = &t2 * &_11100001; let t4 = square_n(&t3, 10); t4 }; let i2737 = { let t0 = &_1011111 * &i2715; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11001101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1111011; t4 }; let i2767 = { let t0 = square_n(&i2737, 8); let t1 = &t0 * &_1100011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110101; let t4 = square_n(&t3, 12); t4 }; let i2789 = { let t0 = &_10101111 * &i2767; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10010011; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11011001; t4 }; let i2815 = { let t0 = square_n(&i2789, 9); let t1 = &t0 * &_1100111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10101101; let t4 = square_n(&t3, 5); t4 }; let i2839 = { let t0 = &_11011 * &i2815; let t1 = square_n(&t0, 11); let t2 = &t1 * &_101101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1001111; t4 }; let i2866 = { let t0 = square_n(&i2839, 9); let t1 = &t0 * &_11110101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1111001; let t4 = square_n(&t3, 9); t4 }; let i2888 = { let t0 = &_10110001 * &i2866; let t1 = square_n(&t0, 3); let t2 = &t1 * &_101; let t3 = square_n(&t2, 16); let t4 = &t3 * &_10011111; t4 }; let i2912 = { let t0 = square_n(&i2888, 7); let t1 = &t0 * &_1011101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_11001; let t4 = square_n(&t3, 9); t4 }; let i2934 = { let t0 = &_100011 * &i2912; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10111101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1001011; t4 }; let i2960 = { let t0 = square_n(&i2934, 6); let t1 = &t0 * &_10011; let t2 = square_n(&t1, 12); let t3 = &t2 * &_11111001; let t4 = square_n(&t3, 6); t4 }; let i2982 = { let t0 = &_101001 * &i2960; let t1 = square_n(&t0, 13); let t2 = &t1 * &_10001101; let t3 = square_n(&t2, 6); let t4 = &t3 * &_111011; t4 }; let i3017 = { let t0 = square_n(&i2982, 11); let t1 = &t0 * &_10001001; let t2 = square_n(&t1, 15); let t3 = &t2 * &_11111001; let t4 = square_n(&t3, 7); t4 }; let i3042 = { let t0 = &_111011 * &i3017; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 13); let t4 = &t3 * &_10111011; t4 }; let i3071 = { let t0 = square_n(&i3042, 9); let t1 = &t0 * &_11001011; let t2 = square_n(&t1, 4); let t3 = &t2 * &_1111; let t4 = square_n(&t3, 14); t4 }; let i3096 = { let t0 = &_10001001 * &i3071; let t1 = square_n(&t0, 13); let t2 = &t1 * &_10011011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_100111; t4 }; let i3123 = { let t0 = square_n(&i3096, 10); let t1 = &t0 * &_11110101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1110111; let t4 = square_n(&t3, 8); t4 }; let i3146 = { let t0 = &_1100001 * &i3123; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11111111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1011001; t4 }; let i3174 = { let t0 = square_n(&i3146, 9); let t1 = &t0 * &_11001101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1000011; let t4 = square_n(&t3, 10); t4 }; let i3193 = { let t0 = &_11000111 * &i3174; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10110001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11001011; t4 }; let i3221 = { let t0 = square_n(&i3193, 5); let t1 = &t0 * &_10001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11001; let t4 = square_n(&t3, 13); t4 }; let i3241 = { let t0 = &_1101101 * &i3221; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10000011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11000011; t4 }; let i3269 = { let t0 = square_n(&i3241, 9); let t1 = &t0 * &_11101001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10011111; let t4 = square_n(&t3, 8); t4 }; let i3288 = { let t0 = &_10110011 * &i3269; let t1 = square_n(&t0, 3); let t2 = &t1 * &_11; let t3 = square_n(&t2, 13); let t4 = &t3 * &_1000001; t4 }; let i3317 = { let t0 = square_n(&i3288, 10); let t1 = &t0 * &_1010011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1010111; let t4 = square_n(&t3, 9); t4 }; let i3340 = { let t0 = &_1000101 * &i3317; let t1 = square_n(&t0, 11); let t2 = &t1 * &_11001001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1000101; t4 }; let i3366 = { let t0 = square_n(&i3340, 8); let t1 = &t0 * &_1010001; let t2 = square_n(&t1, 3); let t3 = &t2 * &_11; let t4 = square_n(&t3, 13); t4 }; let i3386 = { let t0 = &_1001011 * &i3366; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1110011; t4 }; let i3414 = { let t0 = square_n(&i3386, 10); let t1 = &t0 * &_10110101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10101101; let t4 = square_n(&t3, 7); t4 }; let i3433 = { let t0 = &_1010001 * &i3414; let t1 = square_n(&t0, 12); let t2 = &t1 * &_10001111; let t3 = square_n(&t2, 4); let t4 = &t3 * &_1101; t4 }; let i3463 = { let t0 = square_n(&i3433, 12); let t1 = &t0 * &_10000111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_100111; let t4 = square_n(&t3, 9); t4 }; let i3485 = { let t0 = &_1110101 * &i3463; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1000001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_11111101; t4 }; let i3514 = { let t0 = square_n(&i3485, 9); let t1 = &t0 * &_11000001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1011011; let t4 = square_n(&t3, 10); t4 }; let i3534 = { let t0 = &_1101001 * &i3514; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10000001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11000111; t4 }; let i3564 = { let t0 = square_n(&i3534, 8); let t1 = &t0 * &_10000011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10110011; let t4 = square_n(&t3, 12); t4 }; let i3580 = { let t0 = &_10011111 * &i3564; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 5); let t4 = &t3 * &_1011; t4 }; let i3611 = { let t0 = square_n(&i3580, 11); let t1 = &t0 * &_1111001; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11000011; let t4 = square_n(&t3, 8); t4 }; let i3633 = { let t0 = &_10011111 * &i3611; let t1 = square_n(&t0, 11); let t2 = &t1 * &_10001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_101; t4 }; let i3663 = { let t0 = square_n(&i3633, 13); let t1 = &t0 * &_1100001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_100001; let t4 = square_n(&t3, 8); t4 }; let i3684 = { let t0 = &_100011 * &i3663; let t1 = square_n(&t0, 10); let t2 = &t1 * &_10011111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1101001; t4 }; let i3712 = { let t0 = square_n(&i3684, 7); let t1 = &t0 * &_100101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11110111; let t4 = square_n(&t3, 9); t4 }; let i3733 = { let t0 = &_1110001 * &i3712; let t1 = square_n(&t0, 9); let t2 = &t1 * &_101001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11001; t4 }; let i3766 = { let t0 = square_n(&i3733, 14); let t1 = &t0 * &_11011001; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10101101; let t4 = square_n(&t3, 7); t4 }; let i3789 = { let t0 = &_100111 * &i3766; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11101111; t4 }; let i3814 = { let t0 = square_n(&i3789, 9); let t1 = &t0 * &_11100001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11010001; let t4 = square_n(&t3, 6); t4 }; let i3838 = { let t0 = &_100101 * &i3814; let t1 = square_n(&t0, 11); let t2 = &t1 * &_11011001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_11101001; t4 }; let i3864 = { let t0 = square_n(&i3838, 8); let t1 = &t0 * &_11111111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11110111; let t4 = square_n(&t3, 8); t4 }; let i3884 = { let t0 = &_10101111 * &i3864; let t1 = square_n(&t0, 5); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 12); let t4 = &t3 * &_10100001; t4 }; let i3910 = { let t0 = square_n(&i3884, 8); let t1 = &t0 * &_11010101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10000001; let t4 = square_n(&t3, 7); t4 }; let i3932 = { let t0 = &_1010001 * &i3910; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1101101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1000011; t4 }; let i3958 = { let t0 = square_n(&i3932, 8); let t1 = &t0 * &_1010011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1001101; let t4 = square_n(&t3, 8); t4 }; let i3980 = { let t0 = &_1100011 * &i3958; let t1 = square_n(&t0, 11); let t2 = &t1 * &_11111101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11100001; t4 }; let i4013 = { let t0 = square_n(&i3980, 12); let t1 = &t0 * &_11001111; let t2 = square_n(&t1, 5); let t3 = &t2 * &_1101; let t4 = square_n(&t3, 14); t4 }; let i4033 = { let t0 = &_10100101 * &i4013; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1001111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_10110111; t4 }; let i4065 = { let t0 = square_n(&i4033, 12); let t1 = &t0 * &_11100111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_11100001; let t4 = square_n(&t3, 7); t4 }; let i4087 = { let t0 = &_1010101 * &i4065; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11011; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11101011; t4 }; let i4116 = { let t0 = square_n(&i4087, 8); let t1 = &t0 * &_10110101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_100111; let t4 = square_n(&t3, 11); t4 }; let i4136 = { let t0 = &_11001011 * &i4116; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10110001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10001011; t4 }; let i4162 = { let t0 = square_n(&i4136, 4); let t1 = &t0 * &_1111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_101; let t4 = square_n(&t3, 13); t4 }; let i4181 = { let t0 = &_10111001 * &i4162; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10101101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10100111; t4 }; let i4208 = { let t0 = square_n(&i4181, 8); let t1 = &t0 * &_10010101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_11110101; let t4 = square_n(&t3, 8); t4 }; let i4227 = { let t0 = &_11001001 * &i4208; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10101101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1101001; t4 }; let i4263 = { let t0 = square_n(&i4227, 17); let t1 = &t0 * &_1100001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1001011; let t4 = square_n(&t3, 9); t4 }; let i4284 = { let t0 = &_10001 * &i4263; let t1 = square_n(&t0, 11); let t2 = &t1 * &_11001001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_111111; t4 }; let i4316 = { let t0 = square_n(&i4284, 14); let t1 = &t0 * &_11111001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11101011; let t4 = square_n(&t3, 8); t4 }; let i4344 = { let t0 = &_1101011 * &i4316; let t1 = square_n(&t0, 12); let t2 = &t1 * &_10001111; let t3 = square_n(&t2, 13); let t4 = &t3 * &_1000011; t4 }; let i4375 = { let t0 = square_n(&i4344, 8); let t1 = &t0 * &_1011001; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1101011; let t4 = square_n(&t3, 11); t4 }; let i4389 = { let t0 = &_11110111 * &i4375; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1111001; let t3 = square_n(&t2, 4); let t4 = &t3 * &_101; t4 }; let i4421 = { let t0 = square_n(&i4389, 12); let t1 = &t0 * &_100001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_10101; let t4 = square_n(&t3, 11); t4 }; let i4440 = { let t0 = &_10001001 * &i4421; let t1 = square_n(&t0, 8); let t2 = &t1 * &_10111011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1000101; t4 }; let i4475 = { let t0 = square_n(&i4440, 11); let t1 = &t0 * &_110101; let t2 = square_n(&t1, 12); let t3 = &t2 * &_11001; let t4 = square_n(&t3, 10); t4 }; let i4493 = { let t0 = &_1011111 * &i4475; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1111101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_100001; t4 }; let i4523 = { let t0 = square_n(&i4493, 11); let t1 = &t0 * &_11101011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_111111; let t4 = square_n(&t3, 11); t4 }; let i4545 = { let t0 = &_10010111 * &i4523; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1010001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11110101; t4 }; let i4565 = { let t0 = square_n(&i4545, 6); let t1 = &t0 * &_110011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_10101001; let t4 = square_n(&t3, 2); t4 }; let i4590 = { let t0 = &base * &i4565; let t1 = square_n(&t0, 16); let t2 = &t1 * &_10100011; let t3 = square_n(&t2, 6); let t4 = &t3 * &_111111; t4 }; let i4620 = { let t0 = square_n(&i4590, 7); let t1 = &t0 * &_10001; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1100011; let t4 = square_n(&t3, 11); t4 }; let i4638 = { let t0 = &_1101111 * &i4620; let t1 = square_n(&t0, 9); let t2 = &t1 * &_10000101; let t3 = square_n(&t2, 6); let t4 = &t3 * &_100111; t4 }; let i4665 = { let t0 = square_n(&i4638, 13); let t1 = &t0 * &_111111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_11011101; let t4 = square_n(&t3, 2); t4 }; let i4687 = { let t0 = &base * &i4665; let t1 = square_n(&t0, 14); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 5); let t4 = &t3 * &_1111; t4 }; let i4719 = { let t0 = square_n(&i4687, 14); let t1 = &t0 * &_10000111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_11110101; let t4 = square_n(&t3, 8); t4 }; let i4741 = { let t0 = &_11011001 * &i4719; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11011111; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11000011; t4 }; let i4767 = { let t0 = square_n(&i4741, 7); let t1 = &t0 * &_1111101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10001011; let t4 = square_n(&t3, 8); t4 }; let i4787 = { let t0 = &_1010011 * &i4767; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1000001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_110011; t4 }; let i4814 = { let t0 = square_n(&i4787, 11); let t1 = &t0 * &_1111001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_11100001; let t4 = square_n(&t3, 5); t4 }; let i4836 = { let t0 = &_11101 * &i4814; let t1 = square_n(&t0, 12); let t2 = &t1 * &_10000101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1010111; t4 }; let i4867 = { let t0 = square_n(&i4836, 10); let t1 = &t0 * &_11010101; let t2 = square_n(&t1, 11); let t3 = &t2 * &_11011001; let t4 = square_n(&t3, 8); t4 }; let i4886 = { let t0 = &_11011111 * &i4867; let t1 = square_n(&t0, 4); let t2 = &t1 * &_111; let t3 = square_n(&t2, 12); let t4 = &t3 * &_10001; t4 }; let result = { let t0 = square_n(&i4886, 7); let t1 = &t0 * &_1001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1111; let t4 = square_n(&t3, 4); t4 }; result } /// Generated from tools/addchain/bls12_381_e.acc pub fn pow_e( base: &FieldElement, ) -> FieldElement { let base = base.clone(); let _10 = { let t0 = square_n(&base, 1); t0 }; let _11 = { let t0 = &base * &_10; t0 }; let _101 = { let t0 = &_10 * &_11; t0 }; let _111 = { let t0 = &_10 * &_101; t0 }; let _1001 = { let t0 = &_10 * &_111; t0 }; let _1011 = { let t0 = &_10 * &_1001; t0 }; let _1101 = { let t0 = &_10 * &_1011; t0 }; let _1111 = { let t0 = &_10 * &_1101; t0 }; let _10001 = { let t0 = &_10 * &_1111; t0 }; let _10011 = { let t0 = &_10 * &_10001; t0 }; let _10101 = { let t0 = &_10 * &_10011; t0 }; let _10111 = { let t0 = &_10 * &_10101; t0 }; let _11001 = { let t0 = &_10 * &_10111; t0 }; let _11011 = { let t0 = &_10 * &_11001; t0 }; let _11101 = { let t0 = &_10 * &_11011; t0 }; let _11111 = { let t0 = &_10 * &_11101; t0 }; let _100001 = { let t0 = &_10 * &_11111; t0 }; let _100011 = { let t0 = &_10 * &_100001; t0 }; let _100101 = { let t0 = &_10 * &_100011; t0 }; let _100111 = { let t0 = &_10 * &_100101; t0 }; let _101001 = { let t0 = &_10 * &_100111; t0 }; let _101011 = { let t0 = &_10 * &_101001; t0 }; let _101101 = { let t0 = &_10 * &_101011; t0 }; let _101111 = { let t0 = &_10 * &_101101; t0 }; let _110001 = { let t0 = &_10 * &_101111; t0 }; let _110011 = { let t0 = &_10 * &_110001; t0 }; let _110101 = { let t0 = &_10 * &_110011; t0 }; let _110111 = { let t0 = &_10 * &_110101; t0 }; let _111001 = { let t0 = &_10 * &_110111; t0 }; let _111011 = { let t0 = &_10 * &_111001; t0 }; let _111101 = { let t0 = &_10 * &_111011; t0 }; let _111111 = { let t0 = &_10 * &_111101; t0 }; let _1000001 = { let t0 = &_10 * &_111111; t0 }; let _1000011 = { let t0 = &_10 * &_1000001; t0 }; let _1000101 = { let t0 = &_10 * &_1000011; t0 }; let _1000111 = { let t0 = &_10 * &_1000101; t0 }; let _1001001 = { let t0 = &_10 * &_1000111; t0 }; let _1001011 = { let t0 = &_10 * &_1001001; t0 }; let _1001101 = { let t0 = &_10 * &_1001011; t0 }; let _1001111 = { let t0 = &_10 * &_1001101; t0 }; let _1010001 = { let t0 = &_10 * &_1001111; t0 }; let _1010011 = { let t0 = &_10 * &_1010001; t0 }; let _1010101 = { let t0 = &_10 * &_1010011; t0 }; let _1010111 = { let t0 = &_10 * &_1010101; t0 }; let _1011001 = { let t0 = &_10 * &_1010111; t0 }; let _1011011 = { let t0 = &_10 * &_1011001; t0 }; let _1011101 = { let t0 = &_10 * &_1011011; t0 }; let _1011111 = { let t0 = &_10 * &_1011101; t0 }; let _1100001 = { let t0 = &_10 * &_1011111; t0 }; let _1100011 = { let t0 = &_10 * &_1100001; t0 }; let _1100101 = { let t0 = &_10 * &_1100011; t0 }; let _1100111 = { let t0 = &_10 * &_1100101; t0 }; let _1101001 = { let t0 = &_10 * &_1100111; t0 }; let _1101011 = { let t0 = &_10 * &_1101001; t0 }; let _1101101 = { let t0 = &_10 * &_1101011; t0 }; let _1101111 = { let t0 = &_10 * &_1101101; t0 }; let _1110001 = { let t0 = &_10 * &_1101111; t0 }; let _1110011 = { let t0 = &_10 * &_1110001; t0 }; let _1110101 = { let t0 = &_10 * &_1110011; t0 }; let _1110111 = { let t0 = &_10 * &_1110101; t0 }; let _1111001 = { let t0 = &_10 * &_1110111; t0 }; let _1111011 = { let t0 = &_10 * &_1111001; t0 }; let _1111101 = { let t0 = &_10 * &_1111011; t0 }; let _1111111 = { let t0 = &_10 * &_1111101; t0 }; let _11111110 = { let t0 = square_n(&_1111111, 1); t0 }; let _11111111 = { let t0 = &base * &_11111110; t0 }; let x9 = { let t0 = square_n(&_11111111, 1); let t1 = &t0 * &base; t1 }; let i69 = { let t0 = &_1110001 * &x9; t0 }; let x10 = { let t0 = square_n(&x9, 1); let t1 = &t0 * &base; t1 }; let i72 = { let t0 = square_n(&i69, 1); t0 }; let x11 = { let t0 = square_n(&x10, 1); let t1 = &t0 * &base; t1 }; let i95 = { let t0 = square_n(&i72, 2); let t1 = &t0 * &_101001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_100011; let t4 = square_n(&t3, 9); t4 }; let i118 = { let t0 = &_1100101 * &i95; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1100101; let t3 = square_n(&t2, 13); let t4 = &t3 * &_1101011; t4 }; let i140 = { let t0 = square_n(&i118, 7); let t1 = &t0 * &_1010111; let t2 = square_n(&t1, 4); let t3 = &t2 * &_101; let t4 = square_n(&t3, 9); t4 }; let i163 = { let t0 = &_101 * &i140; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1110111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_10001; t4 }; let i188 = { let t0 = square_n(&i163, 9); let t1 = &t0 * &_100001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_100001; let t4 = square_n(&t3, 7); t4 }; let i214 = { let t0 = &_101011 * &i188; let t1 = square_n(&t0, 7); let t2 = &t1 * &_11; let t3 = square_n(&t2, 16); let t4 = &t3 * &_111001; t4 }; let i242 = { let t0 = square_n(&i214, 8); let t1 = &t0 * &_101001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_111011; let t4 = square_n(&t3, 10); t4 }; let i258 = { let t0 = &_1010011 * &i242; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1001001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_101001; t4 }; let i286 = { let t0 = square_n(&i258, 9); let t1 = &t0 * &_1010111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1101; let t4 = square_n(&t3, 10); t4 }; let i306 = { let t0 = &_1100011 * &i286; let t1 = square_n(&t0, 7); let t2 = &t1 * &_101011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1110111; t4 }; let i331 = { let t0 = square_n(&i306, 7); let t1 = &t0 * &_1110001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_11101; let t4 = square_n(&t3, 9); t4 }; let i349 = { let t0 = &_1000111 * &i331; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1011101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1101; t4 }; let i380 = { let t0 = square_n(&i349, 9); let t1 = &t0 * &_110101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1111001; let t4 = square_n(&t3, 10); t4 }; let i400 = { let t0 = &_110101 * &i380; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1101111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1101101; t4 }; let i428 = { let t0 = square_n(&i400, 8); let t1 = &t0 * &_1111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1011011; let t4 = square_n(&t3, 7); t4 }; let i449 = { let t0 = &_1110111 * &i428; let t1 = square_n(&t0, 8); let t2 = &t1 * &_101011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1000011; t4 }; let i473 = { let t0 = square_n(&i449, 7); let t1 = &t0 * &_1010111; let t2 = square_n(&t1, 6); let t3 = &t2 * &_100101; let t4 = square_n(&t3, 9); t4 }; let i489 = { let t0 = &_1010001 * &i473; let t1 = square_n(&t0, 5); let t2 = &t1 * &_1011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1001; t4 }; let i518 = { let t0 = square_n(&i489, 12); let t1 = &t0 * &_1001011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1010001; let t4 = square_n(&t3, 7); t4 }; let i537 = { let t0 = &_1101111 * &i518; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1010001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1110111; t4 }; let i562 = { let t0 = square_n(&i537, 8); let t1 = &t0 * &_1001001; let t2 = square_n(&t1, 5); let t3 = &t2 * &_11101; let t4 = square_n(&t3, 10); t4 }; let i578 = { let t0 = &_101111 * &i562; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1001101; let t3 = square_n(&t2, 5); let t4 = &t3 * &_10001; t4 }; let i609 = { let t0 = square_n(&i578, 9); let t1 = &t0 * &_1011101; let t2 = square_n(&t1, 13); let t3 = &t2 * &_110011; let t4 = square_n(&t3, 7); t4 }; let i627 = { let t0 = &_110001 * &i609; let t1 = square_n(&t0, 6); let t2 = &t1 * &_11011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1100111; t4 }; let i651 = { let t0 = square_n(&i627, 7); let t1 = &t0 * &_1101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1000111; let t4 = square_n(&t3, 5); t4 }; let i672 = { let t0 = &_10001 * &i651; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1000001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1100011; t4 }; let i699 = { let t0 = square_n(&i672, 10); let t1 = &t0 * &_1111011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1001101; let t4 = square_n(&t3, 7); t4 }; let i715 = { let t0 = &_1110101 * &i699; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1000011; let t3 = square_n(&t2, 4); let t4 = &t3 * &_1101; t4 }; let i742 = { let t0 = square_n(&i715, 14); let t1 = &t0 * &_1010101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_111101; let t4 = square_n(&t3, 5); t4 }; let i764 = { let t0 = &_111 * &i742; let t1 = square_n(&t0, 10); let t2 = &t1 * &_110111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1101001; t4 }; let i789 = { let t0 = square_n(&i764, 7); let t1 = &t0 * &_1100101; let t2 = square_n(&t1, 3); let t3 = &t2 * &_11; let t4 = square_n(&t3, 13); t4 }; let i807 = { let t0 = &_1010011 * &i789; let t1 = square_n(&t0, 4); let t2 = &t1 * &_11; let t3 = square_n(&t2, 11); let t4 = &t3 * &_11001; t4 }; let i833 = { let t0 = square_n(&i807, 9); let t1 = &t0 * &_100111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1111011; let t4 = square_n(&t3, 7); t4 }; let i855 = { let t0 = &_1100111 * &i833; let t1 = square_n(&t0, 2); let t2 = &t1 * &_11; let t3 = square_n(&t2, 17); let t4 = &t3 * &x11; t4 }; let i882 = { let t0 = square_n(&i855, 7); let t1 = &t0 * &_101111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1101011; let t4 = square_n(&t3, 8); t4 }; let i902 = { let t0 = &_1001111 * &i882; let t1 = square_n(&t0, 7); let t2 = &t1 * &_111001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_11111111; t4 }; let i928 = { let t0 = square_n(&i902, 8); let t1 = &t0 * &_100111; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110011; let t4 = square_n(&t3, 8); t4 }; let i946 = { let t0 = &_10111 * &i928; let t1 = square_n(&t0, 6); let t2 = &t1 * &_1101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_11011; t4 }; let i971 = { let t0 = square_n(&i946, 9); let t1 = &t0 * &_110101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_11101; let t4 = square_n(&t3, 8); t4 }; let i992 = { let t0 = &_100011 * &i971; let t1 = square_n(&t0, 10); let t2 = &t1 * &_110001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10101; t4 }; let i1018 = { let t0 = square_n(&i992, 10); let t1 = &t0 * &_1010001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_111111; let t4 = square_n(&t3, 7); t4 }; let i1039 = { let t0 = &_101101 * &i1018; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_101111; t4 }; let i1063 = { let t0 = square_n(&i1039, 8); let t1 = &t0 * &_1001001; let t2 = square_n(&t1, 6); let t3 = &t2 * &_111001; let t4 = square_n(&t3, 8); t4 }; let i1081 = { let t0 = &_110111 * &i1063; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1010101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1111001; t4 }; let i1101 = { let t0 = square_n(&i1081, 6); let t1 = &t0 * &_111011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1100011; let t4 = square_n(&t3, 4); t4 }; let i1123 = { let t0 = &_1101 * &i1101; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1111011; let t3 = square_n(&t2, 6); let t4 = &t3 * &_110001; t4 }; let i1147 = { let t0 = square_n(&i1123, 8); let t1 = &t0 * &_1101101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1000001; let t4 = square_n(&t3, 7); t4 }; let i1163 = { let t0 = &_1100001 * &i1147; let t1 = square_n(&t0, 6); let t2 = &t1 * &_111011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_100111; t4 }; let i1193 = { let t0 = square_n(&i1163, 8); let t1 = &t0 * &_10011; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1111111; let t4 = square_n(&t3, 9); t4 }; let i1210 = { let t0 = &_1001101 * &i1193; let t1 = square_n(&t0, 6); let t2 = &t1 * &_101011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1011011; t4 }; let i1233 = { let t0 = square_n(&i1210, 7); let t1 = &t0 * &_1110111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1001011; let t4 = square_n(&t3, 7); t4 }; let i1254 = { let t0 = &_110101 * &i1233; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1011111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1101111; t4 }; let i1283 = { let t0 = square_n(&i1254, 7); let t1 = &t0 * &_101101; let t2 = square_n(&t1, 5); let t3 = &t2 * &_111; let t4 = square_n(&t3, 15); t4 }; let i1297 = { let t0 = &_1000001 * &i1283; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1110001; let t3 = square_n(&t2, 3); let t4 = &t3 * &base; t4 }; let i1331 = { let t0 = square_n(&i1297, 15); let t1 = &t0 * &_110001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1100001; let t4 = square_n(&t3, 9); t4 }; let i1351 = { let t0 = &_1111011 * &i1331; let t1 = square_n(&t0, 7); let t2 = &t1 * &_10011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1011101; t4 }; let i1372 = { let t0 = square_n(&i1351, 8); let t1 = &t0 * &_1110111; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10111; let t4 = square_n(&t3, 6); t4 }; let i1395 = { let t0 = &_1011 * &i1372; let t1 = square_n(&t0, 6); let t2 = &t1 * &_11; let t3 = square_n(&t2, 14); let t4 = &t3 * &x11; t4 }; let i1415 = { let t0 = square_n(&i1395, 1); let t1 = &t0 * &base; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1011001; let t4 = square_n(&t3, 9); t4 }; let i1437 = { let t0 = &_1110101 * &i1415; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1111011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1101011; t4 }; let i1459 = { let t0 = square_n(&i1437, 8); let t1 = &t0 * &_100101; let t2 = square_n(&t1, 3); let t3 = &t2 * &base; let t4 = square_n(&t3, 9); t4 }; let i1480 = { let t0 = &_11111111 * &i1459; let t1 = square_n(&t0, 11); let t2 = &t1 * &_101011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_110011; t4 }; let i1503 = { let t0 = square_n(&i1480, 7); let t1 = &t0 * &_111111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_101011; let t4 = square_n(&t3, 7); t4 }; let i1529 = { let t0 = &_100101 * &i1503; let t1 = square_n(&t0, 13); let t2 = &t1 * &_1000001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1001101; t4 }; let i1553 = { let t0 = square_n(&i1529, 8); let t1 = &t0 * &_1100101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1010101; let t4 = square_n(&t3, 6); t4 }; let i1573 = { let t0 = &_100101 * &i1553; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1010001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1011101; t4 }; let i1599 = { let t0 = square_n(&i1573, 6); let t1 = &t0 * &_111011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1011111; let t4 = square_n(&t3, 10); t4 }; let i1617 = { let t0 = &_1011101 * &i1599; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1001111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1111001; t4 }; let i1642 = { let t0 = square_n(&i1617, 8); let t1 = &t0 * &_1100001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1010111; let t4 = square_n(&t3, 8); t4 }; let i1662 = { let t0 = &_1001001 * &i1642; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1000111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1001001; t4 }; let i1695 = { let t0 = square_n(&i1662, 12); let t1 = &t0 * &_1011101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1110101; let t4 = square_n(&t3, 10); t4 }; let i1713 = { let t0 = &_111101 * &i1695; let t1 = square_n(&t0, 8); let t2 = &t1 * &_111011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_111101; t4 }; let i1735 = { let t0 = square_n(&i1713, 6); let t1 = &t0 * &_11011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1101011; let t4 = square_n(&t3, 5); t4 }; let i1758 = { let t0 = &_11011 * &i1735; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1001011; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1001001; t4 }; let i1782 = { let t0 = square_n(&i1758, 4); let t1 = &t0 * &_1111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1000011; let t4 = square_n(&t3, 7); t4 }; let i1803 = { let t0 = &_10101 * &i1782; let t1 = square_n(&t0, 9); let t2 = &t1 * &_111001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1000011; t4 }; let i1829 = { let t0 = square_n(&i1803, 5); let t1 = &t0 * &_10011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1011001; let t4 = square_n(&t3, 9); t4 }; let i1846 = { let t0 = &_1110011 * &i1829; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1100001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_110011; t4 }; let i1875 = { let t0 = square_n(&i1846, 9); let t1 = &t0 * &_110001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_101101; let t4 = square_n(&t3, 11); t4 }; let i1898 = { let t0 = &_1100111 * &i1875; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1011011; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1101101; t4 }; let i1927 = { let t0 = square_n(&i1898, 11); let t1 = &t0 * &_1000011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1110111; let t4 = square_n(&t3, 9); t4 }; let i1945 = { let t0 = &_1101001 * &i1927; let t1 = square_n(&t0, 4); let t2 = &t1 * &_1011; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1100011; t4 }; let i1967 = { let t0 = square_n(&i1945, 4); let t1 = &t0 * &_1001; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1001111; let t4 = square_n(&t3, 5); t4 }; let i1986 = { let t0 = &_10111 * &i1967; let t1 = square_n(&t0, 6); let t2 = &t1 * &_1001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1001011; t4 }; let i2009 = { let t0 = square_n(&i1986, 8); let t1 = &t0 * &_1011011; let t2 = square_n(&t1, 4); let t3 = &t2 * &_1001; let t4 = square_n(&t3, 9); t4 }; let i2029 = { let t0 = &_100101 * &i2009; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11111111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_101011; t4 }; let i2057 = { let t0 = square_n(&i2029, 10); let t1 = &t0 * &_1111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1011011; let t4 = square_n(&t3, 6); t4 }; let i2075 = { let t0 = &_111001 * &i2057; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1101001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_101111; t4 }; let i2100 = { let t0 = square_n(&i2075, 7); let t1 = &t0 * &_10011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1110011; let t4 = square_n(&t3, 7); t4 }; let i2125 = { let t0 = &_1110011 * &i2100; let t1 = square_n(&t0, 10); let t2 = &t1 * &_101101; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1110001; t4 }; let i2153 = { let t0 = square_n(&i2125, 6); let t1 = &t0 * &_11; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1101101; let t4 = square_n(&t3, 8); t4 }; let i2171 = { let t0 = &_110011 * &i2153; let t1 = square_n(&t0, 6); let t2 = &t1 * &_10111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1011011; t4 }; let i2199 = { let t0 = square_n(&i2171, 10); let t1 = &t0 * &_1000111; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1111011; let t4 = square_n(&t3, 9); t4 }; let i2220 = { let t0 = &_1111111 * &i2199; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1110001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1101111; t4 }; let i2244 = { let t0 = square_n(&i2220, 9); let t1 = &t0 * &_1001101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1000111; let t4 = square_n(&t3, 6); t4 }; let i2264 = { let t0 = &_1011 * &i2244; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1010001; let t3 = square_n(&t2, 6); let t4 = &t3 * &_11001; t4 }; let i2289 = { let t0 = square_n(&i2264, 10); let t1 = &t0 * &_1101001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1010111; let t4 = square_n(&t3, 5); t4 }; let i2309 = { let t0 = &_10111 * &i2289; let t1 = square_n(&t0, 6); let t2 = &t1 * &_101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1010011; t4 }; let i2333 = { let t0 = square_n(&i2309, 6); let t1 = &t0 * &_110101; let t2 = square_n(&t1, 5); let t3 = &t2 * &_1101; let t4 = square_n(&t3, 11); t4 }; let i2354 = { let t0 = &_110101 * &i2333; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1111011; t4 }; let i2378 = { let t0 = square_n(&i2354, 8); let t1 = &t0 * &_1110111; let t2 = square_n(&t1, 6); let t3 = &t2 * &_1011; let t4 = square_n(&t3, 8); t4 }; let i2398 = { let t0 = &_11001 * &i2378; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11111111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1011111; t4 }; let i2427 = { let t0 = square_n(&i2398, 6); let t1 = &t0 * &_1111; let t2 = square_n(&t1, 13); let t3 = &t2 * &_1100001; let t4 = square_n(&t3, 8); t4 }; let i2444 = { let t0 = &_1100001 * &i2427; let t1 = square_n(&t0, 5); let t2 = &t1 * &_11001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1101001; t4 }; let i2470 = { let t0 = square_n(&i2444, 9); let t1 = &t0 * &_1010111; let t2 = square_n(&t1, 3); let t3 = &t2 * &_111; let t4 = square_n(&t3, 12); t4 }; let i2487 = { let t0 = &_1000011 * &i2470; let t1 = square_n(&t0, 6); let t2 = &t1 * &_100011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1011111; t4 }; let i2519 = { let t0 = square_n(&i2487, 10); let t1 = &t0 * &_111011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_101011; let t4 = square_n(&t3, 10); t4 }; let i2538 = { let t0 = &_11111111 * &i2519; let t1 = square_n(&t0, 9); let t2 = &t1 * &_111101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_11111; t4 }; let i2566 = { let t0 = square_n(&i2538, 7); let t1 = &t0 * &_11001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10101; let t4 = square_n(&t3, 10); t4 }; let i2586 = { let t0 = &_1111001 * &i2566; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1010101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_10101; t4 }; let i2609 = { let t0 = square_n(&i2586, 9); let t1 = &t0 * &_1110001; let t2 = square_n(&t1, 5); let t3 = &t2 * &_1001; let t4 = square_n(&t3, 7); t4 }; let i2631 = { let t0 = &_1011 * &i2609; let t1 = square_n(&t0, 12); let t2 = &t1 * &_1011101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1000011; t4 }; let i2658 = { let t0 = square_n(&i2631, 9); let t1 = &t0 * &_1011001; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1100101; let t4 = square_n(&t3, 7); t4 }; let i2679 = { let t0 = &_1010111 * &i2658; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_11111; t4 }; let i2703 = { let t0 = square_n(&i2679, 7); let t1 = &t0 * &_10111; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1110011; let t4 = square_n(&t3, 5); t4 }; let i2725 = { let t0 = &_10111 * &i2703; let t1 = square_n(&t0, 9); let t2 = &t1 * &_100101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1011101; t4 }; let i2749 = { let t0 = square_n(&i2725, 4); let t1 = &t0 * &_1111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1010011; let t4 = square_n(&t3, 7); t4 }; let i2771 = { let t0 = &_1000001 * &i2749; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1111001; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1100101; t4 }; let i2799 = { let t0 = square_n(&i2771, 1); let t1 = &t0 * &base; let t2 = square_n(&t1, 17); let t3 = &t2 * &_1000001; let t4 = square_n(&t3, 8); t4 }; let i2815 = { let t0 = &_1011101 * &i2799; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1010101; let t3 = square_n(&t2, 6); let t4 = &t3 * &_111011; t4 }; let i2842 = { let t0 = square_n(&i2815, 8); let t1 = &t0 * &_1100011; let t2 = square_n(&t1, 5); let t3 = &t2 * &_11011; let t4 = square_n(&t3, 12); t4 }; let i2861 = { let t0 = &_1101011 * &i2842; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1101111; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1000111; t4 }; let i2882 = { let t0 = square_n(&i2861, 2); let t1 = &t0 * &base; let t2 = square_n(&t1, 10); let t3 = &t2 * &x9; let t4 = square_n(&t3, 7); t4 }; let i2900 = { let t0 = &_101101 * &i2882; let t1 = square_n(&t0, 3); let t2 = &t1 * &_11; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1110111; t4 }; let i2929 = { let t0 = square_n(&i2900, 6); let t1 = &t0 * &base; let t2 = square_n(&t1, 12); let t3 = &t2 * &_100111; let t4 = square_n(&t3, 9); t4 }; let i2949 = { let t0 = &_1010001 * &i2929; let t1 = square_n(&t0, 6); let t2 = &t1 * &_110011; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1100011; t4 }; let i2971 = { let t0 = square_n(&i2949, 6); let t1 = &t0 * &_101111; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1110011; let t4 = square_n(&t3, 3); t4 }; let i2990 = { let t0 = &_111 * &i2971; let t1 = square_n(&t0, 11); let t2 = &t1 * &_1010111; let t3 = square_n(&t2, 5); let t4 = &t3 * &_11101; t4 }; let i3017 = { let t0 = square_n(&i2990, 9); let t1 = &t0 * &_1110011; let t2 = square_n(&t1, 5); let t3 = &t2 * &_1101; let t4 = square_n(&t3, 11); t4 }; let i3037 = { let t0 = &x9 * &i3017; let t1 = square_n(&t0, 6); let t2 = &t1 * &_10011; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1101011; t4 }; let i3061 = { let t0 = square_n(&i3037, 7); let t1 = &t0 * &_1110111; let t2 = square_n(&t1, 6); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 9); t4 }; let i3081 = { let t0 = &_1101111 * &i3061; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1100011; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1000111; t4 }; let i3099 = { let t0 = square_n(&i3081, 3); let t1 = &t0 * &_111; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1111001; let t4 = square_n(&t3, 1); t4 }; let i3125 = { let t0 = &base * &i3099; let t1 = square_n(&t0, 15); let t2 = &t1 * &_111101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1101111; t4 }; let i3152 = { let t0 = square_n(&i3125, 5); let t1 = &t0 * &_1101; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1011001; let t4 = square_n(&t3, 10); t4 }; let i3172 = { let t0 = &_1101011 * &i3152; let t1 = square_n(&t0, 6); let t2 = &t1 * &_110111; let t3 = square_n(&t2, 11); let t4 = &t3 * &_10011; t4 }; let i3200 = { let t0 = square_n(&i3172, 12); let t1 = &t0 * &_1111011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1100001; let t4 = square_n(&t3, 6); t4 }; let i3220 = { let t0 = &_10101 * &i3200; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1011011; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1010111; t4 }; let i3243 = { let t0 = square_n(&i3220, 5); let t1 = &t0 * &_11101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_100001; let t4 = square_n(&t3, 8); t4 }; let i3262 = { let t0 = &_1101101 * &i3243; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1001101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_100101; t4 }; let i3286 = { let t0 = square_n(&i3262, 12); let t1 = &t0 * &_1111101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1000011; let t4 = square_n(&t3, 1); t4 }; let i3309 = { let t0 = &base * &i3286; let t1 = square_n(&t0, 11); let t2 = &t1 * &x10; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1110111; t4 }; let i3330 = { let t0 = square_n(&i3309, 7); let t1 = &t0 * &_101011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1110101; let t4 = square_n(&t3, 4); t4 }; let i3350 = { let t0 = &_1111 * &i3330; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_111101; t4 }; let i3373 = { let t0 = square_n(&i3350, 9); let t1 = &t0 * &_1101101; let t2 = square_n(&t1, 6); let t3 = &t2 * &_110101; let t4 = square_n(&t3, 6); t4 }; let i3395 = { let t0 = &_11101 * &i3373; let t1 = square_n(&t0, 8); let t2 = &t1 * &_101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1001101; t4 }; let i3420 = { let t0 = square_n(&i3395, 9); let t1 = &t0 * &_1000111; let t2 = square_n(&t1, 2); let t3 = &t2 * &_11; let t4 = square_n(&t3, 12); t4 }; let i3435 = { let t0 = &_1110111 * &i3420; let t1 = square_n(&t0, 6); let t2 = &t1 * &_111011; let t3 = square_n(&t2, 6); let t4 = &t3 * &_10101; t4 }; let i3462 = { let t0 = square_n(&i3435, 9); let t1 = &t0 * &_100001; let t2 = square_n(&t1, 7); let t3 = &t2 * &_101101; let t4 = square_n(&t3, 9); t4 }; let i3480 = { let t0 = &_1101001 * &i3462; let t1 = square_n(&t0, 7); let t2 = &t1 * &_101001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_101101; t4 }; let i3505 = { let t0 = square_n(&i3480, 8); let t1 = &t0 * &_1000101; let t2 = square_n(&t1, 4); let t3 = &t2 * &_1001; let t4 = square_n(&t3, 11); t4 }; let i3522 = { let t0 = &_1111001 * &i3505; let t1 = square_n(&t0, 7); let t2 = &t1 * &_110001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_100011; t4 }; let i3551 = { let t0 = square_n(&i3522, 12); let t1 = &t0 * &_1011001; let t2 = square_n(&t1, 4); let t3 = &t2 * &_1101; let t4 = square_n(&t3, 11); t4 }; let i3568 = { let t0 = &_1100011 * &i3551; let t1 = square_n(&t0, 5); let t2 = &t1 * &_11111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_111001; t4 }; let i3592 = { let t0 = square_n(&i3568, 8); let t1 = &t0 * &_1010011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1100011; let t4 = square_n(&t3, 7); t4 }; let i3609 = { let t0 = &_101101 * &i3592; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1101111; let t3 = square_n(&t2, 6); let t4 = &t3 * &_100111; t4 }; let i3637 = { let t0 = square_n(&i3609, 8); let t1 = &t0 * &_1000101; let t2 = square_n(&t1, 9); let t3 = &t2 * &_100001; let t4 = square_n(&t3, 9); t4 }; let i3657 = { let t0 = &_1010111 * &i3637; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1101101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1100001; t4 }; let i3682 = { let t0 = square_n(&i3657, 10); let t1 = &t0 * &_100101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_101111; let t4 = square_n(&t3, 6); t4 }; let i3704 = { let t0 = &_11111 * &i3682; let t1 = square_n(&t0, 9); let t2 = &t1 * &_101101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1101001; t4 }; let i3728 = { let t0 = square_n(&i3704, 7); let t1 = &t0 * &_101101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1110111; let t4 = square_n(&t3, 7); t4 }; let i3746 = { let t0 = &_100011 * &i3728; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1000111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_110101; t4 }; let i3769 = { let t0 = square_n(&i3746, 8); let t1 = &t0 * &_1110101; let t2 = square_n(&t1, 7); let t3 = &t2 * &_1010001; let t4 = square_n(&t3, 6); t4 }; let i3785 = { let t0 = &_101001 * &i3769; let t1 = square_n(&t0, 6); let t2 = &t1 * &_10001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_10111; t4 }; let i3811 = { let t0 = square_n(&i3785, 9); let t1 = &t0 * &_1110011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110001; let t4 = square_n(&t3, 7); t4 }; let i3831 = { let t0 = &_100101 * &i3811; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1010011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1100111; t4 }; let i3857 = { let t0 = square_n(&i3831, 7); let t1 = &t0 * &_1000011; let t2 = square_n(&t1, 10); let t3 = &t2 * &_1111011; let t4 = square_n(&t3, 7); t4 }; let i3879 = { let t0 = &_101 * &i3857; let t1 = square_n(&t0, 12); let t2 = &t1 * &_1111001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1101011; t4 }; let i3902 = { let t0 = square_n(&i3879, 6); let t1 = &t0 * &_110011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_10101; let t4 = square_n(&t3, 6); t4 }; let i3928 = { let t0 = &_101 * &i3902; let t1 = square_n(&t0, 13); let t2 = &t1 * &_10111; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1011101; t4 }; let i3953 = { let t0 = square_n(&i3928, 5); let t1 = &t0 * &_1001; let t2 = square_n(&t1, 12); let t3 = &t2 * &_100001; let t4 = square_n(&t3, 6); t4 }; let i3977 = { let t0 = &_1001 * &i3953; let t1 = square_n(&t0, 9); let t2 = &t1 * &_11111; let t3 = square_n(&t2, 12); let t4 = &t3 * &_1111101; t4 }; let i4010 = { let t0 = square_n(&i3977, 10); let t1 = &t0 * &_1011101; let t2 = square_n(&t1, 12); let t3 = &t2 * &_1111101; let t4 = square_n(&t3, 9); t4 }; let i4029 = { let t0 = &_1001001 * &i4010; let t1 = square_n(&t0, 7); let t2 = &t1 * &_101011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_100111; t4 }; let i4058 = { let t0 = square_n(&i4029, 9); let t1 = &t0 * &_11011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1100011; let t4 = square_n(&t3, 9); t4 }; let i4075 = { let t0 = &_1010101 * &i4058; let t1 = square_n(&t0, 6); let t2 = &t1 * &_110001; let t3 = square_n(&t2, 8); let t4 = &t3 * &_1101101; t4 }; let i4098 = { let t0 = square_n(&i4075, 7); let t1 = &t0 * &_110101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1000111; let t4 = square_n(&t3, 6); t4 }; let i4120 = { let t0 = &_101011 * &i4098; let t1 = square_n(&t0, 10); let t2 = &t1 * &_11011; let t3 = square_n(&t2, 9); let t4 = &t3 * &_101011; t4 }; let i4145 = { let t0 = square_n(&i4120, 5); let t1 = &t0 * &_101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_111; let t4 = square_n(&t3, 10); t4 }; let i4169 = { let t0 = &_11101 * &i4145; let t1 = square_n(&t0, 10); let t2 = &t1 * &_1110011; let t3 = square_n(&t2, 11); let t4 = &t3 * &_101001; t4 }; let i4194 = { let t0 = square_n(&i4169, 7); let t1 = &t0 * &_111011; let t2 = square_n(&t1, 14); let t3 = &t2 * &_101111; let t4 = square_n(&t3, 2); t4 }; let i4218 = { let t0 = &base * &i4194; let t1 = square_n(&t0, 14); let t2 = &t1 * &_1011111; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1101101; t4 }; let i4243 = { let t0 = square_n(&i4218, 7); let t1 = &t0 * &_1110101; let t2 = square_n(&t1, 4); let t3 = &t2 * &_101; let t4 = square_n(&t3, 12); t4 }; let i4262 = { let t0 = &_110001 * &i4243; let t1 = square_n(&t0, 5); let t2 = &t1 * &_1101; let t3 = square_n(&t2, 11); let t4 = &t3 * &_1011001; t4 }; let i4286 = { let t0 = square_n(&i4262, 7); let t1 = &t0 * &_1011011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_110011; let t4 = square_n(&t3, 9); t4 }; let i4311 = { let t0 = &_110101 * &i4286; let t1 = square_n(&t0, 15); let t2 = &t1 * &_1100001; let t3 = square_n(&t2, 7); let t4 = &t3 * &_101001; t4 }; let i4336 = { let t0 = square_n(&i4311, 9); let t1 = &t0 * &_1001011; let t2 = square_n(&t1, 7); let t3 = &t2 * &_110011; let t4 = square_n(&t3, 7); t4 }; let i4354 = { let t0 = &_10101 * &i4336; let t1 = square_n(&t0, 6); let t2 = &t1 * &_1101; let t3 = square_n(&t2, 9); let t4 = &t3 * &_101001; t4 }; let i4382 = { let t0 = square_n(&i4354, 9); let t1 = &t0 * &_1010011; let t2 = square_n(&t1, 9); let t3 = &t2 * &_1111111; let t4 = square_n(&t3, 8); t4 }; let i4400 = { let t0 = &_1010101 * &i4382; let t1 = square_n(&t0, 5); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 10); let t4 = &t3 * &_1000111; t4 }; let i4424 = { let t0 = square_n(&i4400, 8); let t1 = &t0 * &_110101; let t2 = square_n(&t1, 4); let t3 = &t2 * &_101; let t4 = square_n(&t3, 10); t4 }; let i4444 = { let t0 = &_111001 * &i4424; let t1 = square_n(&t0, 8); let t2 = &t1 * &_11001; let t3 = square_n(&t2, 9); let t4 = &t3 * &_1011101; t4 }; let i4471 = { let t0 = square_n(&i4444, 7); let t1 = &t0 * &_1101101; let t2 = square_n(&t1, 11); let t3 = &t2 * &_1110001; let t4 = square_n(&t3, 7); t4 }; let i4491 = { let t0 = &_1100001 * &i4471; let t1 = square_n(&t0, 2); let t2 = &t1 * &_11; let t3 = square_n(&t2, 15); let t4 = &t3 * &_1010001; t4 }; let i4515 = { let t0 = square_n(&i4491, 5); let t1 = &t0 * &_1101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_10011; let t4 = square_n(&t3, 9); t4 }; let i4532 = { let t0 = &_1010011 * &i4515; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1110101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1010111; t4 }; let i4561 = { let t0 = square_n(&i4532, 8); let t1 = &t0 * &_1010001; let t2 = square_n(&t1, 8); let t3 = &t2 * &_101101; let t4 = square_n(&t3, 11); t4 }; let i4580 = { let t0 = &_1100101 * &i4561; let t1 = square_n(&t0, 7); let t2 = &t1 * &_101111; let t3 = square_n(&t2, 9); let t4 = &t3 * &_111011; t4 }; let i4605 = { let t0 = square_n(&i4580, 6); let t1 = &t0 * &_11111; let t2 = square_n(&t1, 6); let t3 = &t2 * &_1011; let t4 = square_n(&t3, 11); t4 }; let i4619 = { let t0 = &_1000001 * &i4605; let t1 = square_n(&t0, 7); let t2 = &t1 * &_1101001; let t3 = square_n(&t2, 4); let t4 = &t3 * &_1011; t4 }; let i4646 = { let t0 = square_n(&i4619, 10); let t1 = &t0 * &_1111101; let t2 = square_n(&t1, 3); let t3 = &t2 * &base; let t4 = square_n(&t3, 12); t4 }; let i4665 = { let t0 = &_111001 * &i4646; let t1 = square_n(&t0, 9); let t2 = &t1 * &_1000101; let t3 = square_n(&t2, 7); let t4 = &t3 * &_1111011; t4 }; let i4688 = { let t0 = square_n(&i4665, 7); let t1 = &t0 * &_1110011; let t2 = square_n(&t1, 6); let t3 = &t2 * &_100011; let t4 = square_n(&t3, 8); t4 }; let i4704 = { let t0 = &_1001001 * &i4688; let t1 = square_n(&t0, 8); let t2 = &t1 * &_1011101; let t3 = square_n(&t2, 5); let t4 = &t3 * &_101; t4 }; let i4731 = { let t0 = square_n(&i4704, 11); let t1 = &t0 * &_1111011; let t2 = square_n(&t1, 5); let t3 = &t2 * &_10101; let t4 = square_n(&t3, 9); t4 }; let i4747 = { let t0 = &_1000011 * &i4731; let t1 = square_n(&t0, 5); let t2 = &t1 * &_10101; let t3 = square_n(&t2, 8); let t4 = &t3 * &_100101; t4 }; let i4778 = { let t0 = square_n(&i4747, 6); let t1 = &t0 * &_10011; let t2 = square_n(&t1, 8); let t3 = &t2 * &_110111; let t4 = square_n(&t3, 15); t4 }; let i4797 = { let t0 = &_1011011 * &i4778; let t1 = square_n(&t0, 4); let t2 = &t1 * &_111; let t3 = square_n(&t2, 12); let t4 = &t3 * &x9; t4 }; let i4822 = { let t0 = square_n(&i4797, 8); let t1 = &t0 * &_1111101; let t2 = square_n(&t1, 8); let t3 = &t2 * &_1010111; let t4 = square_n(&t3, 7); t4 }; let result = { let t0 = &_1011011 * &i4822; let t1 = square_n(&t0, 10); let t2 = &t1 * &_100011; t2 }; result } } ================================================ FILE: tools/garaga_rs/src/pairing/final_exp_witness/bls12_381_final_exp_witness.rs ================================================ use super::addchain_pow_generated::bls12_381 as bls12_addchain; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree12ExtensionField; use lambdaworks_math::field::element::FieldElement; use num_bigint::BigUint; pub fn pow_custom( base: &FieldElement, exponent: &BigUint, ) -> FieldElement { if exponent == &BigUint::from(0u64) { return FieldElement::::one(); } if exponent == &BigUint::from(1u64) { return base.clone(); } let mut result = FieldElement::::one(); let temp = base.clone(); let exponent_bytes = exponent.to_bytes_be(); for byte in exponent_bytes { for i in (0..8).rev() { result = result.square(); if (byte >> i) & 1 == 1 { result = &result * &temp; } } } result } /// Takes a miller loop output and returns root, shift such that /// root ** lam = shift * mlo, if and only if mlo ** h == 1. pub fn get_final_exp_witness( mlo: FieldElement, ) -> ( FieldElement, FieldElement, ) { // Calculate shift and root let shift = bls12_addchain::pow_h3_s(&mlo); let root = bls12_addchain::pow_e(&(&shift * &mlo)); (root, shift) } #[cfg(test)] mod tests { use super::*; use crate::definitions::BLS12381PrimeField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::{ Degree2ExtensionField, Degree6ExtensionField, }; use num_bigint::BigUint; use num_traits::Num; fn sample_element() -> FieldElement { FieldElement::::new([ FieldElement::::new([ FieldElement::::new([ FieldElement::::from_hex_unchecked("2"), FieldElement::::zero(), ]), FieldElement::::zero(), FieldElement::::zero(), ]), FieldElement::::zero(), ]) } #[test] fn addchain_matches_pow_custom() { let base = sample_element(); let h3_s = BigUint::from_str_radix(H3_S, 16).unwrap(); let e = BigUint::from_str_radix(E, 16).unwrap(); assert_eq!(bls12_addchain::pow_h3_s(&base), pow_custom(&base, &h3_s)); assert_eq!(bls12_addchain::pow_e(&base), pow_custom(&base, &e)); } const H3_S: &str = "4c6694e4b592105c07d08efdd66cdf6b27a928fadb7f89cb2c5de938974a9b00eab7884baa54ea85455a82368f7530de524d17386e734e82cf750c2bd228194946730ad59968daee6b65c84c061913753ece72abd1ec4ee31955ee519ebde1c30350fa074f36284b55f60f49d83d768ec95330d356fac2fb717b68bf76bd8efed7c907ee2d2507d12c6c8948b77abab9c1250ffcd8f64eecb22f47d0d1d3c39399eeb002355b9525fc9508c73ef082a325fa4faccd414c69208cfc4d3cb074cbfb327f6d82b81d18973336a28eab2d6f10d6233dc5d3624b226d9c193efcb76e4075b4d11b9d21c74d5e11000ff7ccf94859dd2fff766f9193bd254b812aacfeb0b4229d15e60372cc338d22b0d2c6267403d9b1517b99f1ca7257c3b31ca6b881c43845f668f6c66a15f26364ce56ec1689ef5f2b1a013f7591197a4b4c3e69046f622407cbb0a82ed97e044826c4e7af7613fc5966c331ec72e23206d41e1ba53f66c08229ab9146491545812c8ae65aab68847e843a73a904fd60ad8d281c783b309f45587930e7c0882818509193ed294f7388a43206c95a9c3a3bdc3a328d93a7ffdebea143aa81a26d10d4d358c7ef0867b40a59e5b8738e1aa363aed49c65ac62fc282e6b69e55eb935ad200614b088c97e07cf5b5847810d646b1efe54084a889bb4506a0322fbea11d7f897145eb99528051fe44630de859c07e6ea022bc087f5d9df187f516a641330f2e1e842d73546cefb808890f0"; const E: &str = "4ea48ccb940d75d40a077222142ac1801c949d8a72692b8d18d58efc4e91d7468d4790d46fda1e16fb958875e528ac2412d477a8bba4f42f4d8974066c5b338d11e220b18f69bd487a02afa70dcd395814cc0c89def3e07ff5e35a7b93fc9ccc5cd0d8d5d230c454517eb4362f49e4dd57cf6c7a07bc5b60e1ed38987f26d6b7de5b55f1bd69c020b890062c27b262ebbdcb0c7ffac9d4f6359297f82b66fd5a502089acaab294577b5f1767bcb0d7498e2482e9d43d3b7ad9af625893e10ca8e4873164e6c398c568675b06d087dcd3618e427dc912d6e44a7fab03c5be4d379339f30b41c4306d335cb623fb3f871de4d8e5851646957b8a14f56835191eddcb197faf9e06161c9a4afc10e35f0ec2b3fc7a7cc854792a8a9c522c1761964cb5c1f1f2e39dc4a2ef853827919600415dabdb1ec1adbd1d7fd6b0770409ca39863bc39f0afd39b4ffa61afba66f18e3f079803d6f68b235ee04c1ed8552dabf485b534941f4877fe7756ebe22bd36eae8284d23e0efdaa215a69525a8b21e58a3059d0c7f1ca9e35adf3a2884afb4610957be2d1a56bba3476aeb46944b9ccc52a999e18f6141e75e6151402e2ea408490f83e8ba0fa4956270d98cab8b6b547ac1b15941c1d1cc14bb00bd017f6f550316859b798d4030a925b32a68a4a67f55a88e6aa1c8c9776871c3805168994fad7512d0cabc76f961074d8fa40e48bef9c692ba50f7521d49533700b6e3fefaaf6c23"; } ================================================ FILE: tools/garaga_rs/src/pairing/final_exp_witness/bn254_final_exp_witness.rs ================================================ use super::addchain_pow_generated::bn254 as bn254_addchain; use crate::definitions::BN254PrimeField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::{ Degree12ExtensionField, Degree2ExtensionField, Degree6ExtensionField, }; use lambdaworks_math::field::element::FieldElement; /// Algorithm for computing λ residues over BN254 curve /// Input: Output of a Miller loop f /// Output: (c, wi) such that c ** λ = f * wi pub fn get_final_exp_witness( f: FieldElement, ) -> ( FieldElement, FieldElement, ) { let w = get_27th_root(); let mut c = f.clone(); let mut ws = FieldElement::::one(); if bn254_addchain::pow_exp(&c) != FieldElement::::one() { c = &c * &w; ws = &ws * &w; if bn254_addchain::pow_exp(&c) != FieldElement::::one() { c = &c * &w; ws = &ws * &w; } } c = bn254_addchain::pow_r_m_d_inv(&c); (find_cube_root(c, w), ws) } fn get_27th_root() -> FieldElement { FieldElement::::new([ FieldElement::::new([ FieldElement::::zero(), FieldElement::::zero(), FieldElement::::new([ FieldElement::::from_hex_unchecked( "1223c9e5932f55ff4c5bb93e3ae400abc8ff620b6cd0ba64515fe1909e9f8e51", ), FieldElement::::from_hex_unchecked( "279a0a9dbd98089c184dac0e71909eb223ea52bfc24790f6d545aed52a2fbdb8", ), ]), ]), FieldElement::::zero(), ]) } fn find_cube_root( a: FieldElement, w: FieldElement, ) -> FieldElement { let a_inv = a.inv().unwrap(); let we = bn254_addchain::pow_exp0(&w); let mut x = bn254_addchain::pow_exp0(&a); let mut t = pow_3_ord(&(&x.pow(3u64) * &a_inv)); while t != 0 { x = &x * &we; t = pow_3_ord(&(&x.pow(3u64) * &a_inv)); } x } fn pow_3_ord(a: &FieldElement) -> usize { let mut a = a.clone(); let mut t = 0; while a != FieldElement::::one() { a = a.pow(3u64); t += 1; } t } #[cfg(test)] mod tests { use super::*; use num_bigint::BigUint; use num_traits::Num; // Optimized implementation of exponentiation using square-and-multiply algorithm // with binary representation scanning fn pow_custom( base: &FieldElement, exponent: &BigUint, ) -> FieldElement { if exponent == &BigUint::from(0u64) { return FieldElement::::one(); } if exponent == &BigUint::from(1u64) { return base.clone(); } let mut result = FieldElement::::one(); let temp = base.clone(); // Use bytes directly instead of string conversion for better performance let exponent_bytes = exponent.to_bytes_be(); for byte in exponent_bytes { for i in (0..8).rev() { result = result.square(); if (byte >> i) & 1 == 1 { result = &result * &temp; } } } result } fn sample_element() -> FieldElement { FieldElement::::new([ FieldElement::::new([ FieldElement::::new([ FieldElement::::from_hex_unchecked("2"), FieldElement::::zero(), ]), FieldElement::::zero(), FieldElement::::zero(), ]), FieldElement::::zero(), ]) } #[test] fn addchain_matches_pow_custom() { let base = sample_element(); let exp = BigUint::from_str_radix(EXP, 16).unwrap(); let exp0 = BigUint::from_str_radix(EXP0, 16).unwrap(); let r_m_d_inv = BigUint::from_str_radix(R_M_D_INV, 16).unwrap(); assert_eq!(bn254_addchain::pow_exp(&base), pow_custom(&base, &exp)); assert_eq!(bn254_addchain::pow_exp0(&base), pow_custom(&base, &exp0)); assert_eq!( bn254_addchain::pow_r_m_d_inv(&base), pow_custom(&base, &r_m_d_inv) ); } // (q ** k - 1) / 3 const EXP: &str = "2fae42e4973924a5d67a5d2596440dd3153897c68d516d062f8015f36c3fc152a73114859eb4cec3eff8e12f119e6b3b6373de8dfb0178e622c3aaf9212aff3b863cdce2f19e45304da0689789b99a5c06b47a88ae84ed08d6375382d5b43e8559e471ed9edafa93168993756f755226d1fb5139f370bd1df6206ad8eb5de835af494b06108d38b7277eb44eca38d36e079b3574999625bea8196289db44b431aae371e85680fa342f7100bba591589f02cf8ecb79868d7443cc60fe8f47559371ceb7cb43c85c4759d9070063939f77b19cd8e05a93bf3094d3d5518628d5a19e9c247d98c4be6bdd2b8801788ce9faea263de92133df7ebbc224e9753aa9ef14c0ae51fac5266c00ed4ded7ce442caa657048173fabe2a396c821ee1dc6e7821edb8a5c6030fad438f6730455aa926463b3f1adb189f37c0ecd514e9f49699c7d2e3b274dcd3d267739953ce9f65a41395df713745bdaf039c199f69e6a6b1d46fc408cb6973b1dfda111a7c09504ce57838ff3eb46f64643825060"; // (s + 1) / 3 const EXP0: &str = "1c41570c33b015b79b8ae1dd628724a303180e16d87c1aae550988446612d16063139a622528c66125e8d14b4ccfa7d757611b9681c7fbcabf448b3e4c8b41ea6282e1b5e483b739118e76de8a80f32d0d746e89e2ad95f2460dd2ac58b6a9ca483b85e2253f6514cafc3174ffadd1de1d9e6905e5982437ae4c196419b2e86baa3e6558ed5d2b1733d94e67944799bc7649033b9d62752e9c80d218cdc9e60a783aee2added9dc01c1d09ea7513c2bd0b25a9f3d63cc59a3b23c7b34b6ca47d4cec46fd31a623b8811850003b02259c43537709b0ef41e3e66a915fb7cc58aba05c8766df452e78ceea638f1807a7196e4f8cfbedbfecbce10ac08a586e9d9728be087c6eadb7f42679a9704a028665203390e46aa78d2280d80141b540417698d8b945caac7b1157716c8e61fcd603b7d741d7069354deab370302e9747f2bb8c8d2c8911a907caf15187d83ecae026a6bc6c7d4e6f5255778f2bd483cd48f4e7b1ed5cddfacdb2f51d13f1a187b6ff0473e387102a0d331e861cb"; // r_inv * m_dash_inv const R_M_D_INV: &str = "40d1e99cd525608c71cde087ba1c0a1e85458467c2fd0c5f611fe6c8220475c036871fb7dfdaac5fa6f3b7af30db17e9514a4d30b72e03a39e709c2cfe852f9c822d3521471b55256049059e6d30de40aec73f5e0555a15603b3a3c26108159c65db3cad9e79c4cec4b5bb0451361c8bb1766d84f873c7479e244c1c4ce26fa40ee8c30bdcb670e368e3a540d126a882d9bcf4530ad9ba18f01f5191d84e6f1ce76b68c8c4862183341c42aec2ef6eabb72fe9cbacad4165e5f06f91873a3f53f97b1baced23deb8fe16e443a7d20359d8d9c2c4c7f76c2cdf0dab3d19889c8dfc9f9af1729273af7ade4616b947f58692410c9e004cd770faa6e0d349cc2a343022003c8e41d7753487c9c0b6aa231e8440939a400333329db1d0af2d2bce56e58da22490e81584223e90bdbb16953cd02ac5abaa37e5d43c3017de195816c1130f439a8ede2456484d269f99b85e3861ee17fccf70b3bfa66540ab5b17bc3e4ee7ca63d528ef0ce38818c3dfb091ea0e5ae677a94d11680d2a55051203606c835b7add89effe054b46da9fc09404fe5b17bc76ca22e896513d71429a78379face82c0ad99b03cea741b9be93546909bdcc76c1af25c63a3ed7f46d0e2bdbb46d0be45ffc9c011320f2902f5ff575a178332d30ae50878d68bbf6da52bb8e570318fc937dbfa565661b51c305bd849dc129bf149a2f7e4c092a2eb529ca2226e2ffa31ad233044010b9f1db69db43907c66540780fb9ac8f703fa0ce334fb3fe42fcc4cffc1b1e3fd814477de35d5a366eaae5e50cd083d65983092561ca6e1fef176b9f29acc032ea94f43e174bd3f6dafb52c74db67694d813c5551bdfcedbb35ec1147bc833f2d2e1513eddd68cb9966671e4a6d4f97327c7bb95af32e875bcadc50ae726c1eb2575712a5d3d521dc2ced6e1be7dd5e8a0dbe15d89c0dfb4dadc220e391c8b45d752a442f054029185269cbffa1de7d17"; } ================================================ FILE: tools/garaga_rs/src/pairing/final_exp_witness/mod.rs ================================================ #[allow(clippy::all)] pub mod addchain_pow_generated; pub mod bls12_381_final_exp_witness; pub mod bn254_final_exp_witness; use crate::definitions::{BLS12381PrimeField, BN254PrimeField}; use crate::io::{element_from_biguint, element_to_biguint}; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254; use lambdaworks_math::field::element::FieldElement; use num_bigint::BigUint; pub fn to_bn(v: FieldElement) -> [BigUint; 12] { let [c0, c1] = v.value(); let [c0b0, c0b1, c0b2] = c0.value(); let [c1b0, c1b1, c1b2] = c1.value(); let [c0b0a0, c0b0a1] = c0b0.value(); let [c0b1a0, c0b1a1] = c0b1.value(); let [c0b2a0, c0b2a1] = c0b2.value(); let [c1b0a0, c1b0a1] = c1b0.value(); let [c1b1a0, c1b1a1] = c1b1.value(); let [c1b2a0, c1b2a1] = c1b2.value(); [ element_to_biguint(c0b0a0), element_to_biguint(c0b0a1), element_to_biguint(c0b1a0), element_to_biguint(c0b1a1), element_to_biguint(c0b2a0), element_to_biguint(c0b2a1), element_to_biguint(c1b0a0), element_to_biguint(c1b0a1), element_to_biguint(c1b1a0), element_to_biguint(c1b1a1), element_to_biguint(c1b2a0), element_to_biguint(c1b2a1), ] } pub fn to_bls( v: FieldElement, ) -> [BigUint; 12] { let [c0, c1] = v.value(); let [c0b0, c0b1, c0b2] = c0.value(); let [c1b0, c1b1, c1b2] = c1.value(); let [c0b0a0, c0b0a1] = c0b0.value(); let [c0b1a0, c0b1a1] = c0b1.value(); let [c0b2a0, c0b2a1] = c0b2.value(); let [c1b0a0, c1b0a1] = c1b0.value(); let [c1b1a0, c1b1a1] = c1b1.value(); let [c1b2a0, c1b2a1] = c1b2.value(); [ element_to_biguint(c0b0a0), element_to_biguint(c0b0a1), element_to_biguint(c0b1a0), element_to_biguint(c0b1a1), element_to_biguint(c0b2a0), element_to_biguint(c0b2a1), element_to_biguint(c1b0a0), element_to_biguint(c1b0a1), element_to_biguint(c1b1a0), element_to_biguint(c1b1a1), element_to_biguint(c1b2a0), element_to_biguint(c1b2a1), ] } pub fn get_final_exp_witness(curve_id: usize, f: [BigUint; 12]) -> ([BigUint; 12], [BigUint; 12]) { let [f_0, f_1, f_2, f_3, f_4, f_5, f_6, f_7, f_8, f_9, f_10, f_11] = f; if curve_id == 0 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::{Degree12ExtensionField, Degree6ExtensionField, Degree2ExtensionField}; let f = FieldElement::::new([ FieldElement::::new([ FieldElement::::new([ element_from_biguint::(&f_0), element_from_biguint::(&f_1), ]), FieldElement::::new([ element_from_biguint::(&f_2), element_from_biguint::(&f_3), ]), FieldElement::::new([ element_from_biguint::(&f_4), element_from_biguint::(&f_5), ]), ]), FieldElement::::new([ FieldElement::::new([ element_from_biguint::(&f_6), element_from_biguint::(&f_7), ]), FieldElement::::new([ element_from_biguint::(&f_8), element_from_biguint::(&f_9), ]), FieldElement::::new([ element_from_biguint::(&f_10), element_from_biguint::(&f_11), ]), ]), ]); let (c, wi) = bn254_final_exp_witness::get_final_exp_witness(f); return (to_bn(c), to_bn(wi)); } if curve_id == 1 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::{Degree12ExtensionField, Degree6ExtensionField, Degree2ExtensionField}; let f = FieldElement::::new([ FieldElement::::new([ FieldElement::::new([ element_from_biguint::(&f_0), element_from_biguint::(&f_1), ]), FieldElement::::new([ element_from_biguint::(&f_2), element_from_biguint::(&f_3), ]), FieldElement::::new([ element_from_biguint::(&f_4), element_from_biguint::(&f_5), ]), ]), FieldElement::::new([ FieldElement::::new([ element_from_biguint::(&f_6), element_from_biguint::(&f_7), ]), FieldElement::::new([ element_from_biguint::(&f_8), element_from_biguint::(&f_9), ]), FieldElement::::new([ element_from_biguint::(&f_10), element_from_biguint::(&f_11), ]), ]), ]); let (c, wi) = bls12_381_final_exp_witness::get_final_exp_witness(f); return (to_bls(c), to_bls(wi)); } panic!("Curve ID {} not supported", curve_id); } #[cfg(test)] mod tests { use super::*; use crate::definitions::{BLS12381PrimeField, BN254PrimeField, FieldElement}; use crate::io::element_to_biguint; #[test] fn get_final_exp_witness_1() { let x = [ "0x1783da1d016c7d380bab8db21a4f525528f83278c6254b13db77fe8107a60be8", "0x4416c4d771078798075d9cc460c7e56f7f542684531e2ee2edbac2c6ebbdbaa", "0xaea0397220f7c7c61e7177abe59b7dfae731041bb381ea6993f45b251ae79ce", "0x29b9c51055891c1a3b737806faf180242ad61412f5085b626fc947d8aee4d4c5", "0xa6cd400de616117bc7c37de0c125e55223b735265eca4e175be078132ad0392", "0x28c17a415e6aab151f632943c971274916c89f88e0826a7ad992060e110cf9a8", "0x218f7d922f219475c106f110a215a256f4c6853d96d4691f93ef8def3553244d", "0x18ba4cb6edcb80bdd3f053158786731fd54bd02afc16a4d65e82d41ee8f71269", "0x3ade11ccef2e9df15c2b9fa6144b5c707dd49b92fb62a4382f3c2e94ac20c84", "0x201b5f896062f80674ac89dc04ef8753139fbf37db26c3c7c9614977f007260d", "0x11f27b345af3ee8d876267a812b60c46c3868500f2e402d0493bc689dd6c5277", "0x2cde97e8c9b263ffbcb53d46c4ed015fdeeb692d8fbf301ad8dc0c1e656d5c27", ]; let y = [ "0x245ada43681e3fbfea7633e5b99e404689d12f34fdc497e0c8b1e9d7c0e70147", "0x1750bd450b85cbd62ea3f1b228beff5fd364a127d6054be99a9248497b82062a", "0x5fa554b43f992af3cafd815d8f8599a376aad62d4b1d5ce72258252c571032", "0x28d156bac04e64938816b055888399c99a954b82724e5f5589d549a709b2b5ef", "0x1cd18658560e13f8683504c35d79e2f868d084e0e5a1b8af88d272078bbdb360", "0x14853f940bf5c557c7f558d3e74e6617d7f08b54fd83597fed1d7e7b9d09e04", "0x212503c88e25ac77cdc82120a45b9d5886f287f15e649d4f8488d7e2b856b2fa", "0x1248cfad33a2147726169d3ce55db12ecafd74bc4b83377c168d89b919386546", "0x2b8d7a45d0b0b47e0c1f391b0bacd25e7f882f16085c7c9099e4ba82d71bf23e", "0x39e1ab153bd709556afece475580f453f9126f256fbb49c235bc75082f5f26e", "0x2cd3e748118f3965ceaf7fd505e039f23e7d6d69f8ceb25d288d1f797012a4cb", "0xaa480d613601947fee14a3ce2b7af4e1872fe49ae3473546aa01a618b78b125", ]; let z = [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ]; let x = x .into_iter() .map(|v| element_to_biguint(&FieldElement::::from_hex(v).unwrap())) .collect::>(); let xy = y .into_iter() .map(|v| element_to_biguint(&FieldElement::::from_hex(v).unwrap())) .collect::>(); let xz = z .into_iter() .map(|v| element_to_biguint(&FieldElement::::from_hex(v).unwrap())) .collect::>(); let (y, z) = get_final_exp_witness(0, x.try_into().unwrap()); assert_eq!(y.to_vec(), xy); assert_eq!(z.to_vec(), xz); } #[test] fn get_final_exp_witness_2() { let x = ["0x189edeac1525a5256ae8c76a82b4df330e0fdac10c95d7fb5f01e6c6b243a52cc62f55f9b74e8bcef7cf857ec72dce93", "0x1c5cc475a78741fb935272142f80370ecc6a698ef863d33e5e187f3cd4fcdb91c49236aafcce6c2b7e91ff0678305ee", "0x38f22b3f8377694c4b17bbea3afd26c71d6c07f64c4661a0d8d77bc9f8f1752bfcbe1e3c6ab95b6eb522fa601ea9305", "0x431d707ff3a55977c4868bc4de8c336ecf67b804ac90c2c739ff85161bbe9a730e3021edaed5902502eb385ea4cc50c", "0x14a833d75d7614710c13c79f3df94ae7d9fa9ec20fa02356381fd6755be5a71ca30e230a1bece62346f0bcfa0f10c949", "0x12bd3ae4a4aca5e0db13fd94c2c2b0127ee3d7d9491d3fa7faa9fb6046a0543f1092c5761636021e091d1a18beeccfba", "0x8577fff37edfad39505f3c47bd6df6fdd80d5f75aff4efd05edf11725abf6458c140d50d4b33c0560aaed4d8167373b", "0x71ad85945ebc453009cb5cf204e41fa0caf2075fc94cf9a57b2460ca293b6eb5c12df3ceb0d17ca563eb044181077c", "0xe17d78c3c7663a52347558b81f589708ad2e84bd32830f61b9d25f1d8f2fe668f9548e4f6bc8a2a6cbf63f72e538a1", "0x15b2f2eca1e3e6c52dc3e40ccdef2f63d0085c459442bdbf592cb6df02973c4f21c96db9ee3d7084d33b0699d260eb06", "0x110cf0e03683bd834bf62dfa7717e01f244814560f4bd540f96ab24703ecc763272a2594a640383e1496b1d6cbdd032f", "0xc54fb45e0131b724250f6b3cf02d8287133dd162bf106ab6ed3d3101b20f9045c77b25ad127a0e193d95f573796e10"]; let y = ["0x12deecbe6648e28516e35daa1e0c318027b97f93995f24274523f4382c02ce6aacce3efefec37100737f82dfe340a4d3", "0xb417c5f4b0e31cdc36e64f4220554380793013c3a3a18557ce659630295c5e67e4cc6131699b575e3435a2c495d3d34", "0x21b2745b9213155921a4e4f1f78aa93aacf1acab10c8f49685f617c0c881fd11ccb4a00d6198229a0f329755fdaa894", "0x174ce865876ea77ee960d6a7b9eada1e4b8afab93489903fbed3dd36c52f4b70fc0d52418a67418ee47875805d80b77d", "0x11307f8213b5a5cf011068461c937525fcc1bac74e8440a0011e899805c83143f52e11e2540f90027da0a3795bdbc359", "0x1976eebc878d175bc93678c0985755703c9866091b78ec8bef5f8948f3b6fa174a284c65e9913a4346aa72b17c319aa", "0xa35d36af451eb622dc96a60848761402315cca37f2fa9e861fb1ac89348be93bf05793ed4ac0c9fd9de3befa4f2577c", "0x36837217109690a2f7f6cd5df81e0f5d49597d200624b374626abf6d941253feb172c215a05d52f76a75caf3b6ea5d2", "0x3f0bccdc44d95bf26b464dcc1a586b8521061565c1ee05cfba8cb30479aaf08448f6451ea7fdc3fff0efd54f27ec0fb", "0xb98f31f1bce837a3fee2cd18f3d43a542e2b386b893be959d87e1541dd78939de6b6e3050e52f17111ab805cf5c0434", "0x177f4b467a8559f03d1ce53454a64dd7a5fdc0e2a0d2cb6593184986d2dcc78dab7bf8e95a1e41b3ed044ebe3aa84c2f", "0xb26abddfd9c70b423b180f3ea13c507dbe3396e795d2f2f8a303718e823dfb73f1073bdf99057642a29280f237244ef"]; let z = ["0x0", "0x0", "0x18bc5b99f39cbf0fd8d087688e9a0930581e2c940247cd0991e7a80fe41d8f58d83f1513f1ca42a0e74df934924892fb", "0x18bc5b99f39cbf0fd8d087688e9a0930581e2c940247cd0991e7a80fe41d8f58d83f1513f1ca42a0e74df934924892fb", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0"]; let x = x .into_iter() .map(|v| element_to_biguint(&FieldElement::::from_hex(v).unwrap())) .collect::>(); let xy = y .into_iter() .map(|v| element_to_biguint(&FieldElement::::from_hex(v).unwrap())) .collect::>(); let xz = z .into_iter() .map(|v| element_to_biguint(&FieldElement::::from_hex(v).unwrap())) .collect::>(); let (y, z) = get_final_exp_witness(1, x.try_into().unwrap()); assert_eq!(y.to_vec(), xy); assert_eq!(z.to_vec(), xz); } } ================================================ FILE: tools/garaga_rs/src/pairing/multi_miller_loop.rs ================================================ use crate::algebra::extf_mul::{ e2_conjugate, nondeterministic_extension_field_div, nondeterministic_extension_field_mul_divmod, }; use crate::algebra::g1point::G1Point; use crate::algebra::g2point::G2Point; use crate::algebra::polynomial::Polynomial; use crate::definitions::{CurveID, CurveParamsProvider}; use lambdaworks_math::field::element::FieldElement; use lambdaworks_math::field::traits::{IsField, IsPrimeField, IsSubFieldOf}; use lambdaworks_math::traits::ByteConversion; // Replaces elements in a list by zero where sparsity is not set // e.g. [1 2 3 4] [T F T F] => [1 0 3 0] pub fn replace_by_zero_elements_given_sparsity( elmts: &[FieldElement], sparsity: &[bool], ) -> Vec> { assert_eq!(sparsity.len(), elmts.len()); let mut result = vec![]; for i in 0..elmts.len() { result.push(if sparsity[i] { elmts[i].clone() } else { FieldElement::from(0) }); } result } // Removes elements from a list where sparsity is not set, it compacts the list // e.g. [1 2 3 4] [T F T F] => [1 3] pub fn remove_and_compact_elements_given_sparsity( elmts: &[FieldElement], sparsity: &[bool], ) -> Vec> { assert_eq!(sparsity.len(), elmts.len()); let mut result = vec![]; for i in 0..elmts.len() { if sparsity[i] { result.push(elmts[i].clone()); } } result } pub fn extf_mul( ps: Vec>, r_sparsity: Option>, qis: Option<&mut Vec>>, ris: Option<&mut Vec>>, ) -> Polynomial where F: IsPrimeField + CurveParamsProvider, { let (q, r) = nondeterministic_extension_field_mul_divmod(12, ps); let mut r = r.get_coefficients_ext_degree(12); if let Some(r_sparsity) = r_sparsity { r = replace_by_zero_elements_given_sparsity(&r, &r_sparsity); } let r = Polynomial::new(r); if let Some(qis) = qis { qis.push(q) } if let Some(ris) = ris { ris.push(r.clone()) } r } pub fn extf_inv( y: &Polynomial, qis: Option<&mut Vec>>, ris: Option<&mut Vec>>, ) -> Polynomial where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, FieldElement: ByteConversion, { let one = Polynomial::one(); let y_inv = nondeterministic_extension_field_div(one, y.clone(), 12); let (q, r) = nondeterministic_extension_field_mul_divmod(12, vec![y_inv.clone(), y.clone()]); let r = Polynomial::new(r.coefficients); // removes trailing zero coefficients assert_eq!(r, Polynomial::one()); if let Some(qis) = qis { qis.push(q) } if let Some(ris) = ris { ris.push(r) } y_inv } pub fn conjugate_e12d(f: Polynomial) -> Polynomial { let e12d = f.get_coefficients_ext_degree(12); Polynomial::new(vec![ e12d[0].clone(), -&e12d[1], e12d[2].clone(), -&e12d[3], e12d[4].clone(), -&e12d[5], e12d[6].clone(), -&e12d[7], e12d[8].clone(), -&e12d[9], e12d[10].clone(), -&e12d[11], ]) } pub fn precompute_consts( p: &[G1Point], ) -> (Vec>, Vec>) { let mut y_inv = vec![]; let mut x_neg_over_y = vec![]; for point in p { y_inv.push(point.y.inv().unwrap()); x_neg_over_y.push(-&(&point.x / &point.y).unwrap()); } (y_inv, x_neg_over_y) } fn build_sparse_line_eval( r0: &FieldElement, r1: &FieldElement, y_inv: &FieldElement, x_neg_over_y: &FieldElement, ) -> Polynomial where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { use crate::algebra::extf_mul::from_e2; let curve_id = F::get_curve_params().curve_id; let [r0x, r0y] = from_e2(r0.clone()); let [r1x, r1y] = from_e2(r1.clone()); let coefficients = match curve_id { CurveID::BN254 => vec![ FieldElement::from(1), &(&r0x + &(&-FieldElement::::from(9) * &r0y)) * x_neg_over_y, FieldElement::from(0), &(&r1x + &(&-FieldElement::::from(9) * &r1y)) * y_inv, FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), &r0y * x_neg_over_y, FieldElement::from(0), &r1y * y_inv, FieldElement::from(0), FieldElement::from(0), ], CurveID::BLS12_381 => vec![ &(&r1x - &r1y) * y_inv, FieldElement::from(0), &(&r0x - &r0y) * x_neg_over_y, FieldElement::from(1), FieldElement::from(0), FieldElement::from(0), &r1y * y_inv, FieldElement::from(0), &r0y * x_neg_over_y, FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), ], _ => unimplemented!(), }; Polynomial::new(coefficients) } pub fn add_step( qa: &G2Point, qb: &G2Point, y_inv: &FieldElement, x_neg_over_y: &FieldElement, ) -> (G2Point, Polynomial) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let λ = G2Point::compute_adding_slope(qa, qb); let xr = &(&λ * &λ) - &(&qa.x + &qb.x); let yr = &(&λ * &(&qa.x - &xr)) - &qa.y; let p = G2Point::new_unchecked(xr, yr); let line_r0 = λ.clone(); let line_r1 = &(&λ * &qa.x) - &qa.y; let line = build_sparse_line_eval(&line_r0, &line_r1, y_inv, x_neg_over_y); (p, line) } pub fn line_compute_step( qa: &G2Point, qb: &G2Point, y_inv: &FieldElement, x_neg_over_y: &FieldElement, ) -> Polynomial where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let λ = G2Point::compute_adding_slope(qa, qb); let line_r0 = λ.clone(); let line_r1 = &(&λ * &qa.x) - &qa.y; build_sparse_line_eval(&line_r0, &line_r1, y_inv, x_neg_over_y) } pub fn double_step( q: &G2Point, y_inv: &FieldElement, x_neg_over_y: &FieldElement, ) -> (G2Point, Polynomial) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let λ = G2Point::compute_doubling_slope(q); let xr = &(&λ * &λ) - &(&q.x + &q.x); let yr = &(&λ * &(&q.x - &xr)) - &q.y; let p = G2Point::new_unchecked(xr, yr); let line_r0 = λ.clone(); let line_r1 = &(&λ * &q.x) - &q.y; let line = build_sparse_line_eval(&line_r0, &line_r1, y_inv, x_neg_over_y); (p, line) } pub fn double_and_add_step( qa: &G2Point, qb: &G2Point, y_inv: &FieldElement, x_neg_over_y: &FieldElement, ) -> (G2Point, Polynomial, Polynomial) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let λ1 = G2Point::compute_adding_slope(qa, qb); let x3 = &(&λ1 * &λ1) - &(&qa.x + &qb.x); let line1_r0 = λ1.clone(); let line1_r1 = &(&λ1 * &qa.x) - &qa.y; let num = &qa.y + &qa.y; let den = &x3 - &qa.x; let λ2 = -&(&λ1 + &(&num / &den).unwrap()); let x4 = &(&(&λ2 * &λ2) - &qa.x) - &x3; let y4 = &(&λ2 * &(&qa.x - &x4)) - &qa.y; let p = G2Point::new_unchecked(x4, y4); let line2_r0 = λ2.clone(); let line2_r1 = &(&λ2 * &qa.x) - &qa.y; let line1 = build_sparse_line_eval(&line1_r0, &line1_r1, y_inv, x_neg_over_y); let line2 = build_sparse_line_eval(&line2_r0, &line2_r1, y_inv, x_neg_over_y); (p, line1, line2) } pub fn triple_step( q: &G2Point, y_inv: &FieldElement, x_neg_over_y: &FieldElement, ) -> (G2Point, Polynomial, Polynomial) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let λ1 = G2Point::compute_doubling_slope(q); let line1_r0 = λ1.clone(); let line1_r1 = &(&λ1 * &q.x) - &q.y; let x2 = &(&λ1 * &λ1) - &(&q.x + &q.x); let λ2 = &(((&q.y + &q.y) / &(&q.x - &x2)).unwrap()) - &λ1; let line2_r0 = λ2.clone(); let line2_r1 = &(&λ2 * &q.x) - &q.y; let xr = &(&λ2 * &λ2) - &(&q.x + &x2); let yr = &(&λ2 * &(&q.x - &xr)) - &q.y; let p = G2Point::new_unchecked(xr, yr); let line1 = build_sparse_line_eval(&line1_r0, &line1_r1, y_inv, x_neg_over_y); let line2 = build_sparse_line_eval(&line2_r0, &line2_r1, y_inv, x_neg_over_y); (p, line1, line2) } fn bit_0_case( f: &Polynomial, q: &[G2Point], y_inv: &[FieldElement], x_neg_over_y: &[FieldElement], ) -> (Polynomial, Vec>) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let mut new_lines = vec![f.clone(), f.clone()]; let mut new_points = vec![]; for k in 0..q.len() { let (t, l1) = double_step(&q[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1); new_points.push(t); } let new_f = extf_mul(new_lines, None, None, None); (new_f, new_points) } fn bit_1_init_case( f: &Polynomial, q: &[G2Point], y_inv: &[FieldElement], x_neg_over_y: &[FieldElement], ) -> (Polynomial, Vec>) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let mut new_lines = vec![f.clone(), f.clone()]; let mut new_points = vec![]; for k in 0..q.len() { let (t, l1, l2) = triple_step(&q[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1); new_lines.push(l2); new_points.push(t); } let new_f = extf_mul(new_lines, None, None, None); (new_f, new_points) } fn bit_1_case( f: &Polynomial, q: &[G2Point], q_select: &[G2Point], y_inv: &[FieldElement], x_neg_over_y: &[FieldElement], ) -> (Polynomial, Vec>) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let mut new_lines = vec![f.clone(), f.clone()]; let mut new_points = vec![]; for k in 0..q.len() { let (t, l1, l2) = double_and_add_step(&q[k], &q_select[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1); new_lines.push(l2); new_points.push(t); } let new_f = extf_mul(new_lines, None, None, None); (new_f, new_points) } pub fn bn254_finalize_step( qs: &[G2Point], q: &[G2Point], y_inv: &[FieldElement], x_neg_over_y: &[FieldElement], ) -> Vec> where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { use crate::algebra::extf_mul::to_e2; let nr1p2 = to_e2([ FieldElement::::from_hex( "2fb347984f7911f74c0bec3cf559b143b78cc310c2c3330c99e39557176f553d", ) .unwrap(), FieldElement::::from_hex( "16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2", ) .unwrap(), ]); let nr1p3 = to_e2([ FieldElement::::from_hex( "63cf305489af5dcdc5ec698b6e2f9b9dbaae0eda9c95998dc54014671a0135a", ) .unwrap(), FieldElement::::from_hex( "7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3", ) .unwrap(), ]); let nr2p2 = FieldElement::::from_hex( "30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48", ) .unwrap(); let nr2p3 = -FieldElement::::from_hex( "30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd46", ) .unwrap(); let mut lines = vec![]; for k in 0..q.len() { let q1x = nr1p2.clone() * e2_conjugate(q[k].x.clone()); let q1y = nr1p3.clone() * e2_conjugate(q[k].y.clone()); let q2x = nr2p2.clone() * q[k].x.clone(); let q2y = nr2p3.clone() * q[k].y.clone(); let (t, line1) = add_step( &qs[k], &G2Point::new_unchecked(q1x, q1y), &y_inv[k], &x_neg_over_y[k], ); lines.push(line1); let line2 = line_compute_step( &t, &G2Point::new_unchecked(q2x, q2y), &y_inv[k], &x_neg_over_y[k], ); lines.push(line2); } lines } pub fn miller_loop(p: &[G1Point], q: &[G2Point]) -> Polynomial where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { assert_eq!(p.len(), q.len()); let (y_inv, x_neg_over_y) = precompute_consts(p); let loop_counter = &F::get_curve_params().loop_counter; let mut f = Polynomial::new(vec![ FieldElement::from(1), FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), FieldElement::from(0), ]); let mut qs; let mut q_neg = vec![]; if loop_counter.contains(&-1) { for point in q { q_neg.push(point.neg()); } } let start_index = loop_counter.len() - 2; if loop_counter[start_index] == 1 { (f, qs) = bit_1_init_case(&f, q, &y_inv, &x_neg_over_y); } else if loop_counter[start_index] == 0 { (f, qs) = bit_0_case(&f, q, &y_inv, &x_neg_over_y); } else { unimplemented!(); } for i in (0..start_index).rev() { if loop_counter[i] == 0 { (f, qs) = bit_0_case(&f, &qs, &y_inv, &x_neg_over_y); } else if loop_counter[i] == 1 || loop_counter[i] == -1 { let mut q_selects = vec![]; for k in 0..q.len() { q_selects.push(if loop_counter[i] == 1 { q[k].clone() } else { q_neg[k].clone() }); } (f, qs) = bit_1_case(&f, &qs, &q_selects, &y_inv, &x_neg_over_y); } else { unimplemented!(); } } let curve_id = F::get_curve_params().curve_id; match curve_id { CurveID::BN254 => { let mut lines = bn254_finalize_step(&qs, q, &y_inv, &x_neg_over_y); lines.insert(0, f); f = extf_mul(lines, None, None, None); } CurveID::BLS12_381 => { f = conjugate_e12d(f); } _ => unimplemented!(), } f } #[cfg(test)] mod tests { use super::*; use crate::algebra::extf_mul::{from_e2, to_e2}; use crate::definitions::{BLS12381PrimeField, BN254PrimeField}; #[test] fn test_extf_mul_1() { let p = [ [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ], [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ], [ "0x1", "0x3049ed443e0ee79060270c9094ac6390a5c1ab3db65328a47174c6c33f6bd5f2", "0x0", "0xa279a60d390f263fa2b23afda6a2160c7af52ea6fdddb7ffe26ded0e216c821", "0x0", "0x0", "0x0", "0x146bccf3dc47e8eedf574326c5188ea8e4978a568116c9aa5b8517cdeb0e1f38", "0x0", "0x10b71d55b795eb0c1590286e48c412e3434b0def1afddfc8840541b6936825fd", "0x0", "0x0", ], [ "0x1", "0x10b80d23f4e55970de219c8bb6cc99af9ca48837a7da389ff6e02693c8912bf3", "0x0", "0x1999e3b5911b71ef05b218f5be987ba6f43afb6a702ffca89c7a6643b411046f", "0x0", "0x0", "0x0", "0x2a00794e593076aab0ec5e6283a9ed0ddbe6ef97af88861febd351722d50802a", "0x0", "0x22583e5a131ce5504fbb720b2081781441eeb10978efac409e27787d1fa359b6", "0x0", "0x0", ], ]; let xf = [ "0x11d12be7502f97a642a86eb73802fe0fe4772283c9e66f3d535534c22390e0ca", "0x109dabf551c2a0d785f86365c9f7a4e2aae4c8e3f5bb96b72c3461402f80049e", "0x15e06e6b765f21da4c21d50705a9bf0f72ba0283f93e75a896235fa107d4ca4d", "0x23c17e1664ac6452ffdd3ca599029d07bbea4e54e00dd8289aa145149627cc90", "0x751d37ad50cc00d6245f08ca81ce16f9a3714c3efe87c95ae8e132234b5dd07", "0x0", "0x1535e3c0e51be5f14093e8501425031896dfb26ec8759e3409e44e94d81e17cf", "0xe07f7cf5446bf6fd7f35bd2c741235928fd0f5cc82d853d0b37dd293fe1a21b", "0x2eae2d9b2332fb1f1c3617826ac6ede574d04ed01692a36b9743fc604b3f3bf", "0x2ab0d3ce9813032acfb54c2e7c43299edb854672b7bc17be60c2e1cda8e826c", "0x1f316d8807400efe60a15b7e5311a9031439eb344c0d84fb80044f8786d59de4", "0x0", ]; let p: Vec> = p .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let f = extf_mul(p, None, None, None); assert_eq!(f, xf); } #[test] fn test_extf_mul_2() { let p = [["0xc71fb5b76cf57e5c7c9dbbd201062289f97dedce8bbb72d15abaec86c40039d3b4f3fccb7338ff3e7701b7f6619769b", "0x129a0a7e9efe3f397b5dbcae1f22f39c0cbcf4d183ead8de682a7571560cc28f2c13ecc7628b11dda4fcc3eaef203a45", "0x162ca20e57a4ad07f919b85c9975acd11d5f0cddd22192ebc465e5a89a0546be2ec98581fcda54c808aa8790189addd6", "0x10a05ef6bc41b1ac2ba68a585a4c7016589ffad9c5412bf00fd0f50f8ac9ea3d9a7db639e62eae3ca960447fb588a60b", "0x16dbc5bd5769b32d94959f3a71085f5adc66454928e158caeecda06706afd32cea844001820431c1f3534760c01c3ce5", "0x199988fcc386f48448a34d747599bd68a9bb4993cc0e6d2434e9182475096fe323352ae743be4cec47278fbbb8d52f52", "0x189109c92dac219f6b362d169e4ca995bbd0536c8727610f0f361f3490e9d41a94c69d397c1401b31b5a973bc393f3b1", "0x19ea64dde64bbb01d1072ca0532cbe26f8227deaf22155b2ba4bacf79ec45d43bbecca1bb35c6efdd163d6d7ff862979", "0xd9b819680b2cfa830393d2a883cbf07d691020e2a01580c62c9bb1869a1c40317ab6b0df57ff873f2b4bc93d71985e5", "0x704a7bc9193e53c9dde39b3a0a34d0e76345261a4caa612bb3ee39b3715a0d649760f83a32b24cc4b37fe549e80afde", "0x117957ce838607a66a58785c7af8af5a2d3a1832a559f19b20af84c9a5e968cabea23dd6815968b93234b9b34f8108e1", "0xae22d05bd7cd226ba438387b13606f1ad88319c787ccdcec28ab4de6e9bd5fd1ede497ebb746c3313cd6655b961689d"], ["0xc71fb5b76cf57e5c7c9dbbd201062289f97dedce8bbb72d15abaec86c40039d3b4f3fccb7338ff3e7701b7f6619769b", "0x129a0a7e9efe3f397b5dbcae1f22f39c0cbcf4d183ead8de682a7571560cc28f2c13ecc7628b11dda4fcc3eaef203a45", "0x162ca20e57a4ad07f919b85c9975acd11d5f0cddd22192ebc465e5a89a0546be2ec98581fcda54c808aa8790189addd6", "0x10a05ef6bc41b1ac2ba68a585a4c7016589ffad9c5412bf00fd0f50f8ac9ea3d9a7db639e62eae3ca960447fb588a60b", "0x16dbc5bd5769b32d94959f3a71085f5adc66454928e158caeecda06706afd32cea844001820431c1f3534760c01c3ce5", "0x199988fcc386f48448a34d747599bd68a9bb4993cc0e6d2434e9182475096fe323352ae743be4cec47278fbbb8d52f52", "0x189109c92dac219f6b362d169e4ca995bbd0536c8727610f0f361f3490e9d41a94c69d397c1401b31b5a973bc393f3b1", "0x19ea64dde64bbb01d1072ca0532cbe26f8227deaf22155b2ba4bacf79ec45d43bbecca1bb35c6efdd163d6d7ff862979", "0xd9b819680b2cfa830393d2a883cbf07d691020e2a01580c62c9bb1869a1c40317ab6b0df57ff873f2b4bc93d71985e5", "0x704a7bc9193e53c9dde39b3a0a34d0e76345261a4caa612bb3ee39b3715a0d649760f83a32b24cc4b37fe549e80afde", "0x117957ce838607a66a58785c7af8af5a2d3a1832a559f19b20af84c9a5e968cabea23dd6815968b93234b9b34f8108e1", "0xae22d05bd7cd226ba438387b13606f1ad88319c787ccdcec28ab4de6e9bd5fd1ede497ebb746c3313cd6655b961689d"], ["0xed2ad16fd30c6bae9d4659d084faa4e8bbce72d77ce2867a8ccd2916078758f11a33bf3f6acad21af21aafd4dbe67c1", "0x0", "0x143159d9a3967261ec92e14b1108686052cbe30a24c1142a087b498252aaef8b03b69ea297bc174eb69de56e7a594cfa", "0x1", "0x0", "0x0", "0xd2c6c6d4383235e52ea373e1add3c36becb732dbd0fae843b6a12f2841cfa4243dd3bead4e582e60c1e81c3f4db03bb", "0x0", "0x5dd1d6911248fb5ef5a2e4f99c1f90767186060eda81b7f490cc99583db6989183cc9884244bc5b62a507c413c93e2e", "0x0", "0x0", "0x0"], ["0x4ca59a9615490d4871ae113788793a0ef5c6dbbfb2602731932d16dd279f227782505589090120984a32f00d5c17317", "0x0", "0x9649308cd68a27b4e25e3702dab91e62890a1fb24fa7318b413f60fc7b95245612a76f802df69650a6d78458addb193", "0x1", "0x0", "0x0", "0x6d3c6b1903e1d11b99026fac6088b42737e0e7cddf5e95d20f6b7b05c13589063d20aefc27a91c014a7b5f49957ff", "0x0", "0xc9fb3306280d86d70eb3b713248de91c6d4ef90148d3c2300b3d6b19df197e00e70af98bcd050a431a8c58b53832815", "0x0", "0x0", "0x0"]]; let xf = ["0x1913c7c566f59082bc8178020dbab618db967238ea9cd35f30a48e8f4e37b31fa826f2ce8023e3f492da64e7fc430262", "0xe88184d680a3c04ed182e6b263c806982325a7601dab1e928ee1cf7c98a702c77ef44f6202e8049b3eb05d0d530416d", "0x133b8d475abdbde6aa5ce6524599001bdebe394bd4b3c7a7c62a4c736176f27fabcb165d0e9db88c3aa8af04ac87b690", "0xff88e1756ceadda3075ef7ac6f1764de912e15b03a34e439b837bfa984174e90399e3fbda93a12cc209b1ed1469ab6f", "0xa2e5dd0e5330c07becfea58e47106140d177f1b1241de5c1e752050408f4970ed1275db43a9c3cc8b4f393a72148638", "0x1124c5ec5de53991b87616d2e433c3387e4ea68342f9713bcf93e2be0ff2b07e03ff0091e0ff71ae050db38a10394cca", "0x47203ee35055ffa8e288c3da40c9831b46d6c7b911ea92ee62d4af79903c75831bb79321155920b413155ca1f2424bf", "0x180ccf08a53eb9416fc958429dfea456e5e802217f5f5ecc44653622720256512e4c7f01efa251cd28065c103db44f11", "0xf4e1f72f26c9590b43bc7b7c45fff374a786d462f2dc275bc0812c9a26969ce0bd7d8fc5a90a9fa47cb7f40320d6418", "0x134043dade475ebc5c796603d3ae7161f7f06e07e968716ea64520685e44705bd9221f8d7d7b0b9e2d131576fdb3af44", "0x19ceec83acdc521e6a9dbf17392e097e01a2685cc2c9d7f3f1430e22221070d222e599ac3e9142d486383eec146b8dac", "0x7ca2e9db2452cc19c71ff5049bdd024819954fb83f0f903169da844e8fe4a584031b750f0678f8661f1c1e1f4653a84"]; let p: Vec> = p .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let f = extf_mul(p, None, None, None); assert_eq!(f, xf); } #[test] fn test_extf_inv_1() { let c = [ "0x14156ca1853095df27f3cb7c50eca75e794d2f14195c16df4a0f8f9dcb48bee9", "0xdc2a20a6107d4c49fed6b2018946bcc2a8dad06f01d099a6df0a4a55ed21b59", "0x14260c5afb0b1148ed80f8339cf9e06ff04257cb6c1817c4efa721fc98f69503", "0xafe8a09df07bf3dffefe512eb9448ef436dd090f98323135baab8ae3c766c60", "0x114692950f53d4f707bb02cc2b5dc98aff5936811707d6579371dae20368253c", "0x2dd3fca72591963149646f1e106dc0ee917551f5a9da397fe12d4a3939ce650c", "0x1750bd450b85cbd62ea3f1b228beff5fd364a127d6054be99a9248497b82062a", "0x1248cfad33a2147726169d3ce55db12ecafd74bc4b83377c168d89b919386546", "0x28d156bac04e64938816b055888399c99a954b82724e5f5589d549a709b2b5ef", "0x39e1ab153bd709556afece475580f453f9126f256fbb49c235bc75082f5f26e", "0x14853f940bf5c557c7f558d3e74e6617d7f08b54fd83597fed1d7e7b9d09e04", "0xaa480d613601947fee14a3ce2b7af4e1872fe49ae3473546aa01a618b78b125", ]; let xi = [[ "0x13e8e196ed7970229c16369f6f62a54fe9848ec0abbb56e77355358805db92a6", "0x29aa20be8afc3104b3211fb1c2636e3291bca41e1276bdbbb485917fae34c150", "0xcbdf387c0036815f944eeedb8a3ed8babb406326444cbed0df3e47fc7a3f440", "0xcc614e3d877550dc9bb19f8dfdc513f2f8fed01d3a180a2a9e475c9a29f6d96", "0x1a6e474f0a5394b39bd15f2390e0cfa64391cb4ffc5d435a63028ac3c744d064", "0x8fc0b38f1129ab34ebd5a5888f0711adecaecc7aa5312cc62508d51da03aa1e", "0xff9b26cf44e068601c663a62662f0ef698166a3410d4f36a68b2e46800daa6e", "0xf4ec161da901a5ab3f6088ede93acdbf15f0c18b653b9f7146d132c6d4111c5", "0x1843faa07a91bed2c949f1b3f126e0ae88d429bf7d37b5e00696b22be53ac607", "0x1c151df931008732415af45f4616affed9e0e64976e66cc5e2e57c799ddfa646", "0x1526c80d7045ccb0ae04a7cf1de7a2519ad52f885c7b9acb7bed0d027459433", ]]; let xj = [[ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ]]; let xc = [ "0x1d7a9ffbbe137d697794dbccbd7925ea98507cf8d4445d3e89123811ede12825", "0x1f45aa2ee73f15e275e5c1fc0ff08be0981a61d8e7642301653a6307c7467811", "0x2446d99f276e4c8bc63d81e8d0c1e37c901a5a569865533968e39b5083fc576e", "0x223bd50b771fcaa905131a5f04c3c634c9df344731b5aada49be919aaa447cc7", "0x24cfef2958a7c9c4d7ddfacdd59750105dcc37f6aefbf4a9ce706bc36252c47", "0x3a974db52b274684955cb370b0ac66e3e295ea6e9789fb7259c294210f7720e", "0x160b7346ec9fdd9841feb355a44845dc30c2a9ae3fb8266ad697b531de5e2fb6", "0xe46af84e1cbba805f204fa5ce1c9a99c79799110a56b5d534495a358f9c739f", "0x1f2b5709d0d7c9499b9524e9708ac412d3fa05fea9b51192113e131bd5572a21", "0x8a75eef583ffc3b0f690cd9eab121b1f329194c1052a86d50224b92838c5d76", "0xef3a64570d17038de7ec74175c125ac7e8780509764f07572ce9593878da9fb", "0x2a6290607745b58a7b87bc78053320664e06d12b35825f15893ad52a39f54331", ]; let c = c .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let c = Polynomial::new(c); let xc = Polynomial::new( xc.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xi = xi .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xj = xj .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let mut i = vec![]; let mut j = vec![]; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree12ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree6ExtensionField; let c = extf_inv::< BN254PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(&c, Some(&mut i), Some(&mut j)); assert_eq!(c, xc); assert_eq!(i, xi); assert_eq!(j, xj); } #[test] fn test_precompute_consts_1() { let p = [ ( "0x1d0634f3f21e7890d1df87eab84852372b905c9ccdb6d03cb7b9a5409b7efcd8", "0x24c53532773dce26eb3f1d6ba3b10e2b53dc193baa1d4f4d3021032564460978", ), ( "0x2585e4f8a31664cbfc531bccffafcf1e59d91fb9536c985db33c69f7c242e07a", "0x1d2d2799db056ed14f48d341183118d68ea4131357fa42444057cf0c1d62ae3c", ), ]; let y = [ "0x1ab9de59fc825e8b5326694c7d82556785cb9cbfd0d0a11721d1972c21c411f8", "0x16a475582082ae3616c808acd62684170d9fa7bf234110353e9cbceca19d2c69", ]; let x = [ "0x27783160c70b7ac760cff888c621846a7ed80e50c7ea8a7a718a4ad8a50886fb", "0x10a6d46618419682152a25b5f819b22c2e572d1f670d12026a18c384248dad2f", ]; let p = p .into_iter() .map(|(x, y)| { G1Point::new( FieldElement::::from_hex(x).unwrap(), FieldElement::::from_hex(y).unwrap(), false, ) .unwrap() }) .collect::>(); let xy = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xx = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let (y, x) = precompute_consts(&p); assert_eq!(y.to_vec(), xy); assert_eq!(x.to_vec(), xx); } #[test] fn test_precompute_consts_2() { let p = [("0x59d2a79bda5f8a941d4db9e360a80121d5ef96fd687003db24ddec0e0c3b63d82efa81fe174bb39be8658ef83c8c2d", "0x2df47e8cdf189985d5085bdcebb5ee96e40a033f5d3b7986f6992be16bc35f88c471acf7f68344f543e52fe891285a9"), ("0x105dcc4dce3960447d21d3c1dc39e973aaf31de52219df089bb5f797ac6d3395b71420b50de4f62a6588c9401ffefbd3", "0x17cb6c41f0c4e1a7394ab62a9db0be660d847ccc58358f3f9b63c98d9a7845c52e1e2b0faefd0d854043fd325dd3c34f")]; let y = ["0x6ce420ceafa50ff15baa710e1633d7893404a18b69ef5316a81b182dadbe66bb0ef4fe49ffa578c7698795e6d4a12cb", "0xf45ba6de68a0f1ab26ba5fac564f3f21a75239243fae800e2a8665fd9699e2795c674834c6ce016370aee9e4a1d38d1"]; let x = ["0x7f2db8fbcf121365e92ce3d77bf5d9a3537b5422e894c09e00053ace96a5403a8db66fbe03950e93033c5874bbe8046", "0xb190c99770f69f3e912d3ef69f63e082a05a1e63b50eb9a5de3e07b14aed7eded07b2f2b3c42c7e365d2a47945fc285"]; let p = p .into_iter() .map(|(x, y)| { G1Point::new( FieldElement::::from_hex(x).unwrap(), FieldElement::::from_hex(y).unwrap(), false, ) .unwrap() }) .collect::>(); let xy = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xx = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let (y, x) = precompute_consts(&p); assert_eq!(y.to_vec(), xy); assert_eq!(x.to_vec(), xx); } #[test] fn test_build_sparse_line_eval_1() { let r0 = [ "0x237db2935c4432bc98005e68cacde68a193b54e64d347301094edcbfa224d3d5", "0x124077e14a7d826a707c3ec1809ae9bafafa05dd6b4ba735fba44e801d415637", ]; let r1 = [ "0x3b7178c857630da7676d0000961488f8fbce03349a8dc1dd6e067932b6a7e0d", "0x2b17c2b12c26fdd0e3520b9dfa601ead6f0bf9cd98c81278efe1e96b86397652", ]; let y = "0x1ab9de59fc825e8b5326694c7d82556785cb9cbfd0d0a11721d1972c21c411f8"; let x = "0x27783160c70b7ac760cff888c621846a7ed80e50c7ea8a7a718a4ad8a50886fb"; let xl = [ "0x1", "0x3049ed443e0ee79060270c9094ac6390a5c1ab3db65328a47174c6c33f6bd5f2", "0x0", "0xa279a60d390f263fa2b23afda6a2160c7af52ea6fdddb7ffe26ded0e216c821", "0x0", "0x0", "0x0", "0x146bccf3dc47e8eedf574326c5188ea8e4978a568116c9aa5b8517cdeb0e1f38", "0x0", "0x10b71d55b795eb0c1590286e48c412e3434b0def1afddfc8840541b6936825fd", "0x0", "0x0", ]; let r0 = r0 .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let r1 = r1 .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xl = Polynomial::new( xl.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let r0: [FieldElement; 2] = r0.try_into().unwrap(); let r1: [FieldElement; 2] = r1.try_into().unwrap(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; let r0 = to_e2::(r0); let r1 = to_e2::(r1); let y = FieldElement::::from_hex(y).unwrap(); let x = FieldElement::::from_hex(x).unwrap(); let l = build_sparse_line_eval(&r0, &r1, &y, &x); assert_eq!(l, xl); } #[test] fn test_build_sparse_line_eval_2() { let r0 = ["0x56ceab5d5d994dee0ca07fc0d41aa908b1a833b94e768d2dec05cffe4a869aed2a64ee86a72f085ee4e78bd4c2aef8e", "0x39b596a976f556e5ea4016a3111e14b674a67295a242cf3b343a6878db6ec20bcac1275d23aad6cd3e84e398a4e7bc8"]; let r1 = ["0x4786cc02b147d13e701c1f52827dbba9d5d8516fb557dfb71bc60f1a68459eb52df6a9219fcdcac7feb1f0edbefdbf8", "0x145f508c63c10d270e027b2b0bf6789475132950c583823a43387d10f8329296e43e6610cb7555c0db86510eb99cfadd"]; let y = "0x6ce420ceafa50ff15baa710e1633d7893404a18b69ef5316a81b182dadbe66bb0ef4fe49ffa578c7698795e6d4a12cb"; let x = "0x7f2db8fbcf121365e92ce3d77bf5d9a3537b5422e894c09e00053ace96a5403a8db66fbe03950e93033c5874bbe8046"; let xl = ["0xed2ad16fd30c6bae9d4659d084faa4e8bbce72d77ce2867a8ccd2916078758f11a33bf3f6acad21af21aafd4dbe67c1", "0x0", "0x143159d9a3967261ec92e14b1108686052cbe30a24c1142a087b498252aaef8b03b69ea297bc174eb69de56e7a594cfa", "0x1", "0x0", "0x0", "0xd2c6c6d4383235e52ea373e1add3c36becb732dbd0fae843b6a12f2841cfa4243dd3bead4e582e60c1e81c3f4db03bb", "0x0", "0x5dd1d6911248fb5ef5a2e4f99c1f90767186060eda81b7f490cc99583db6989183cc9884244bc5b62a507c413c93e2e", "0x0", "0x0", "0x0"]; let r0 = r0 .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let r1 = r1 .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xl = Polynomial::new( xl.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let r0: [FieldElement; 2] = r0.try_into().unwrap(); let r1: [FieldElement; 2] = r1.try_into().unwrap(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; let r0 = to_e2::(r0); let r1 = to_e2::(r1); let y = FieldElement::::from_hex(y).unwrap(); let x = FieldElement::::from_hex(x).unwrap(); let l = build_sparse_line_eval(&r0, &r1, &y, &x); assert_eq!(l, xl); } #[test] fn test_bit_0_case_1() { let f = [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ]; let q = [ ( "0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed", "0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2", "0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", "0x90689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b", ), ( "0x1314aaf1c372e6d7635e573808d9d5c7178bdce7335eb0538f718d8e6651eeb1", "0x14c25d3aec745e5a2d4aba9e1448a8cc1048d01a5289f29ccc5acf5e81526673", "0x397391b7b25e2fba7d1de6d86501d49b6a8dab10d1d0efd5869ecd23aab8e9", "0x1863ac65eca09e89b058c1ff7e4c5c7ec7e5859b385a553ea12434f4eda6db36", ), ]; let y = [ "0x1ab9de59fc825e8b5326694c7d82556785cb9cbfd0d0a11721d1972c21c411f8", "0x16a475582082ae3616c808acd62684170d9fa7bf234110353e9cbceca19d2c69", ]; let x = [ "0x27783160c70b7ac760cff888c621846a7ed80e50c7ea8a7a718a4ad8a50886fb", "0x10a6d46618419682152a25b5f819b22c2e572d1f670d12026a18c384248dad2f", ]; let xf = [ "0x11d12be7502f97a642a86eb73802fe0fe4772283c9e66f3d535534c22390e0ca", "0x109dabf551c2a0d785f86365c9f7a4e2aae4c8e3f5bb96b72c3461402f80049e", "0x15e06e6b765f21da4c21d50705a9bf0f72ba0283f93e75a896235fa107d4ca4d", "0x23c17e1664ac6452ffdd3ca599029d07bbea4e54e00dd8289aa145149627cc90", "0x751d37ad50cc00d6245f08ca81ce16f9a3714c3efe87c95ae8e132234b5dd07", "0x0", "0x1535e3c0e51be5f14093e8501425031896dfb26ec8759e3409e44e94d81e17cf", "0xe07f7cf5446bf6fd7f35bd2c741235928fd0f5cc82d853d0b37dd293fe1a21b", "0x2eae2d9b2332fb1f1c3617826ac6ede574d04ed01692a36b9743fc604b3f3bf", "0x2ab0d3ce9813032acfb54c2e7c43299edb854672b7bc17be60c2e1cda8e826c", "0x1f316d8807400efe60a15b7e5311a9031439eb344c0d84fb80044f8786d59de4", "0x0", ]; let xp = [ ( "0x27dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9", "0x203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad79", "0x4bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e", "0x195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de152", ), ( "0x19092b3d714b3bb6599b735386dd05eab401e72057bab79773a6de8f5693387b", "0x1acb3fbdde3ce471791558747f0e52b1b7a708834dc533393bcfc2af317703ee", "0x258d7966e4b36382460549a44d5cbe96fbe1c412e36f25218438f72d7d387077", "0x2a58bf6a639ae104439ba4e8db873938a26fcd5bd0b68beb20c44705d9820860", ), ]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; let (f, p) = bit_0_case::(&f, &q, &y, &x); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); } #[test] fn test_bit_0_case_2() { let f = ["0xc71fb5b76cf57e5c7c9dbbd201062289f97dedce8bbb72d15abaec86c40039d3b4f3fccb7338ff3e7701b7f6619769b", "0x129a0a7e9efe3f397b5dbcae1f22f39c0cbcf4d183ead8de682a7571560cc28f2c13ecc7628b11dda4fcc3eaef203a45", "0x162ca20e57a4ad07f919b85c9975acd11d5f0cddd22192ebc465e5a89a0546be2ec98581fcda54c808aa8790189addd6", "0x10a05ef6bc41b1ac2ba68a585a4c7016589ffad9c5412bf00fd0f50f8ac9ea3d9a7db639e62eae3ca960447fb588a60b", "0x16dbc5bd5769b32d94959f3a71085f5adc66454928e158caeecda06706afd32cea844001820431c1f3534760c01c3ce5", "0x199988fcc386f48448a34d747599bd68a9bb4993cc0e6d2434e9182475096fe323352ae743be4cec47278fbbb8d52f52", "0x189109c92dac219f6b362d169e4ca995bbd0536c8727610f0f361f3490e9d41a94c69d397c1401b31b5a973bc393f3b1", "0x19ea64dde64bbb01d1072ca0532cbe26f8227deaf22155b2ba4bacf79ec45d43bbecca1bb35c6efdd163d6d7ff862979", "0xd9b819680b2cfa830393d2a883cbf07d691020e2a01580c62c9bb1869a1c40317ab6b0df57ff873f2b4bc93d71985e5", "0x704a7bc9193e53c9dde39b3a0a34d0e76345261a4caa612bb3ee39b3715a0d649760f83a32b24cc4b37fe549e80afde", "0x117957ce838607a66a58785c7af8af5a2d3a1832a559f19b20af84c9a5e968cabea23dd6815968b93234b9b34f8108e1", "0xae22d05bd7cd226ba438387b13606f1ad88319c787ccdcec28ab4de6e9bd5fd1ede497ebb746c3313cd6655b961689d"]; let q = [("0x122915c824a0857e2ee414a3dccb23ae691ae54329781315a0c75df1c04d6d7a50a030fc866f09d516020ef82324afae", "0x9380275bbc8e5dcea7dc4dd7e0550ff2ac480905396eda55062650f8d251c96eb480673937cc6d9d6a44aaa56ca66dc", "0xb21da7955969e61010c7a1abc1a6f0136961d1e3b20b1a7326ac738fef5c721479dfd948b52fdf2455e44813ecfd892", "0x8f239ba329b3967fe48d718a36cfe5f62a7e42e0bf1c1ed714150a166bfbd6bcf6b3b58b975b9edea56d53f23a0e849"), ("0x893227b499dab30e15b606ec3c375f9fabf7fbb574b9b11c9eefbe33fae82066297e23c518f59e74d5cf646cec6464f", "0x10578234a81819d1ebb3d77b03a128f3165642386fff1b0a74ad73c139425703a991ce459cdc1995351adff98061f0ea", "0x16efa85752a02d4358a92eb3b577c1e27a02ec36000c44403159baf7022541a02104b633549e05b774e1b76343a8e661", "0xaf65df48a519d9209257e3df9fb0a1bd3491799091df954380242592db0bead0ddd62dbe33aeeaf1d4a63bdbc4c6008")]; let y = ["0x6ce420ceafa50ff15baa710e1633d7893404a18b69ef5316a81b182dadbe66bb0ef4fe49ffa578c7698795e6d4a12cb", "0xf45ba6de68a0f1ab26ba5fac564f3f21a75239243fae800e2a8665fd9699e2795c674834c6ce016370aee9e4a1d38d1"]; let x = ["0x7f2db8fbcf121365e92ce3d77bf5d9a3537b5422e894c09e00053ace96a5403a8db66fbe03950e93033c5874bbe8046", "0xb190c99770f69f3e912d3ef69f63e082a05a1e63b50eb9a5de3e07b14aed7eded07b2f2b3c42c7e365d2a47945fc285"]; let xf = ["0x1913c7c566f59082bc8178020dbab618db967238ea9cd35f30a48e8f4e37b31fa826f2ce8023e3f492da64e7fc430262", "0xe88184d680a3c04ed182e6b263c806982325a7601dab1e928ee1cf7c98a702c77ef44f6202e8049b3eb05d0d530416d", "0x133b8d475abdbde6aa5ce6524599001bdebe394bd4b3c7a7c62a4c736176f27fabcb165d0e9db88c3aa8af04ac87b690", "0xff88e1756ceadda3075ef7ac6f1764de912e15b03a34e439b837bfa984174e90399e3fbda93a12cc209b1ed1469ab6f", "0xa2e5dd0e5330c07becfea58e47106140d177f1b1241de5c1e752050408f4970ed1275db43a9c3cc8b4f393a72148638", "0x1124c5ec5de53991b87616d2e433c3387e4ea68342f9713bcf93e2be0ff2b07e03ff0091e0ff71ae050db38a10394cca", "0x47203ee35055ffa8e288c3da40c9831b46d6c7b911ea92ee62d4af79903c75831bb79321155920b413155ca1f2424bf", "0x180ccf08a53eb9416fc958429dfea456e5e802217f5f5ecc44653622720256512e4c7f01efa251cd28065c103db44f11", "0xf4e1f72f26c9590b43bc7b7c45fff374a786d462f2dc275bc0812c9a26969ce0bd7d8fc5a90a9fa47cb7f40320d6418", "0x134043dade475ebc5c796603d3ae7161f7f06e07e968716ea64520685e44705bd9221f8d7d7b0b9e2d131576fdb3af44", "0x19ceec83acdc521e6a9dbf17392e097e01a2685cc2c9d7f3f1430e22221070d222e599ac3e9142d486383eec146b8dac", "0x7ca2e9db2452cc19c71ff5049bdd024819954fb83f0f903169da844e8fe4a584031b750f0678f8661f1c1e1f4653a84"]; let xp = [("0x19e384121b7d70927c49e6d044fd8517c36bc6ed2813a8956dd64f049869e8a77f7e46930240e6984abe26fa6a89658f", "0x3f4b4e761936d90fd5f55f99087138a07a69755ad4a46e4dd1c2cfe6d11371e1cc033111a0595e3bba98d0f538db451", "0x17a31a4fccfb5f768a2157517c77a4f8aaf0dee8f260d96e02e1175a8754d09600923beae02a019afc327b65a2fdbbfc", "0x88bb5832f4a4a452edda646ebaa2853a54205d56329960b44b2450070734724a74daaa401879bad142132316e9b3401"), ("0x1604bd06ba18d6d65bdd88e22c26eaef8a620a1a9fefe016d00eac356f9ceda8bc8eee5e46f9f4736ab22cff0e8cb9e8", "0x3e5755e9bfc250ff0a03efea22428a36a247504e613980918dc5319efb7f66b10d5fe2e7e86af7e014e1456aeaeac5f", "0x5655a99f7ff904c1e41382c25ff0360d9c51d0e331bfb1e38f5dd41c6909caaf6e313f47f727922109bf8c3204fe274", "0x62ec2ed9b207f63e0d9899ed11f9a125b472586b65bb77b8a04d5d446d15a8701ba5c361a07cd85e0743f5ae2e95a9f")]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; let (f, p) = bit_0_case::(&f, &q, &y, &x); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); } #[test] fn test_bit_1_init_case_1() { let f = [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ]; let q = [("0x24aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8", "0x13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e", "0xce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801", "0x606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be"), ("0x82dc9154807866eb0f36ccb665a5fc010510bd690ddd7b540e5bf3ff02d81e98b75703a3b3d3c305a70960906e6cb09", "0xdd18d077ad5bd58dabb18d84a6ceebe6375a83dd242851bb4dcf956002c4efb974ffceee6709deb0dcf81d4285e5e60", "0x4a468eb9e206b9833d8e8e2197d3446652372ce5ef50e93c91aa58105d3a281b2e84ddb61535fe1a90bae7e6692f9b0", "0x198fd0ab6249082bf7007d7e8be8992de81f47ae3341c590194fa3bf769a2e5a5253527727115c334e82ed4be8da6c10")]; let y = ["0x6ce420ceafa50ff15baa710e1633d7893404a18b69ef5316a81b182dadbe66bb0ef4fe49ffa578c7698795e6d4a12cb", "0xf45ba6de68a0f1ab26ba5fac564f3f21a75239243fae800e2a8665fd9699e2795c674834c6ce016370aee9e4a1d38d1"]; let x = ["0x7f2db8fbcf121365e92ce3d77bf5d9a3537b5422e894c09e00053ace96a5403a8db66fbe03950e93033c5874bbe8046", "0xb190c99770f69f3e912d3ef69f63e082a05a1e63b50eb9a5de3e07b14aed7eded07b2f2b3c42c7e365d2a47945fc285"]; let xf = ["0xc71fb5b76cf57e5c7c9dbbd201062289f97dedce8bbb72d15abaec86c40039d3b4f3fccb7338ff3e7701b7f6619769b", "0x129a0a7e9efe3f397b5dbcae1f22f39c0cbcf4d183ead8de682a7571560cc28f2c13ecc7628b11dda4fcc3eaef203a45", "0x162ca20e57a4ad07f919b85c9975acd11d5f0cddd22192ebc465e5a89a0546be2ec98581fcda54c808aa8790189addd6", "0x10a05ef6bc41b1ac2ba68a585a4c7016589ffad9c5412bf00fd0f50f8ac9ea3d9a7db639e62eae3ca960447fb588a60b", "0x16dbc5bd5769b32d94959f3a71085f5adc66454928e158caeecda06706afd32cea844001820431c1f3534760c01c3ce5", "0x199988fcc386f48448a34d747599bd68a9bb4993cc0e6d2434e9182475096fe323352ae743be4cec47278fbbb8d52f52", "0x189109c92dac219f6b362d169e4ca995bbd0536c8727610f0f361f3490e9d41a94c69d397c1401b31b5a973bc393f3b1", "0x19ea64dde64bbb01d1072ca0532cbe26f8227deaf22155b2ba4bacf79ec45d43bbecca1bb35c6efdd163d6d7ff862979", "0xd9b819680b2cfa830393d2a883cbf07d691020e2a01580c62c9bb1869a1c40317ab6b0df57ff873f2b4bc93d71985e5", "0x704a7bc9193e53c9dde39b3a0a34d0e76345261a4caa612bb3ee39b3715a0d649760f83a32b24cc4b37fe549e80afde", "0x117957ce838607a66a58785c7af8af5a2d3a1832a559f19b20af84c9a5e968cabea23dd6815968b93234b9b34f8108e1", "0xae22d05bd7cd226ba438387b13606f1ad88319c787ccdcec28ab4de6e9bd5fd1ede497ebb746c3313cd6655b961689d"]; let xp = [("0x122915c824a0857e2ee414a3dccb23ae691ae54329781315a0c75df1c04d6d7a50a030fc866f09d516020ef82324afae", "0x9380275bbc8e5dcea7dc4dd7e0550ff2ac480905396eda55062650f8d251c96eb480673937cc6d9d6a44aaa56ca66dc", "0xb21da7955969e61010c7a1abc1a6f0136961d1e3b20b1a7326ac738fef5c721479dfd948b52fdf2455e44813ecfd892", "0x8f239ba329b3967fe48d718a36cfe5f62a7e42e0bf1c1ed714150a166bfbd6bcf6b3b58b975b9edea56d53f23a0e849"), ("0x893227b499dab30e15b606ec3c375f9fabf7fbb574b9b11c9eefbe33fae82066297e23c518f59e74d5cf646cec6464f", "0x10578234a81819d1ebb3d77b03a128f3165642386fff1b0a74ad73c139425703a991ce459cdc1995351adff98061f0ea", "0x16efa85752a02d4358a92eb3b577c1e27a02ec36000c44403159baf7022541a02104b633549e05b774e1b76343a8e661", "0xaf65df48a519d9209257e3df9fb0a1bd3491799091df954380242592db0bead0ddd62dbe33aeeaf1d4a63bdbc4c6008")]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; let (f, p) = bit_1_init_case::(&f, &q, &y, &x); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); } #[test] fn test_bit_1_case_1() { let f = [ "0x11d12be7502f97a642a86eb73802fe0fe4772283c9e66f3d535534c22390e0ca", "0x109dabf551c2a0d785f86365c9f7a4e2aae4c8e3f5bb96b72c3461402f80049e", "0x15e06e6b765f21da4c21d50705a9bf0f72ba0283f93e75a896235fa107d4ca4d", "0x23c17e1664ac6452ffdd3ca599029d07bbea4e54e00dd8289aa145149627cc90", "0x751d37ad50cc00d6245f08ca81ce16f9a3714c3efe87c95ae8e132234b5dd07", "0x0", "0x1535e3c0e51be5f14093e8501425031896dfb26ec8759e3409e44e94d81e17cf", "0xe07f7cf5446bf6fd7f35bd2c741235928fd0f5cc82d853d0b37dd293fe1a21b", "0x2eae2d9b2332fb1f1c3617826ac6ede574d04ed01692a36b9743fc604b3f3bf", "0x2ab0d3ce9813032acfb54c2e7c43299edb854672b7bc17be60c2e1cda8e826c", "0x1f316d8807400efe60a15b7e5311a9031439eb344c0d84fb80044f8786d59de4", "0x0", ]; let q = [ ( "0x27dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9", "0x203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad79", "0x4bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e", "0x195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de152", ), ( "0x19092b3d714b3bb6599b735386dd05eab401e72057bab79773a6de8f5693387b", "0x1acb3fbdde3ce471791558747f0e52b1b7a708834dc533393bcfc2af317703ee", "0x258d7966e4b36382460549a44d5cbe96fbe1c412e36f25218438f72d7d387077", "0x2a58bf6a639ae104439ba4e8db873938a26fcd5bd0b68beb20c44705d9820860", ), ]; let s = [ ( "0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed", "0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2", "0x1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d", "0x275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec", ), ( "0x1314aaf1c372e6d7635e573808d9d5c7178bdce7335eb0538f718d8e6651eeb1", "0x14c25d3aec745e5a2d4aba9e1448a8cc1048d01a5289f29ccc5acf5e81526673", "0x302adae1297f41f9fdd327cfa91c5688fc16dce6579ff99d6699ed49b4d2445e", "0x1800a20cf49101a007f783b70334fbdecf9be4f63017754e9afc5721ead62211", ), ]; let y = [ "0x1ab9de59fc825e8b5326694c7d82556785cb9cbfd0d0a11721d1972c21c411f8", "0x16a475582082ae3616c808acd62684170d9fa7bf234110353e9cbceca19d2c69", ]; let x = [ "0x27783160c70b7ac760cff888c621846a7ed80e50c7ea8a7a718a4ad8a50886fb", "0x10a6d46618419682152a25b5f819b22c2e572d1f670d12026a18c384248dad2f", ]; let xf = [ "0x44e300afb5d8c9fe4ed7556cdf91d67bae6f78cdd7b5afdb2d62ae76d668cf9", "0x2d6f11dc8d07f13fae893dc146f477a28fdcbe346b5536270b156027e060cbb6", "0x1d6149797ffea4e32ec9ad26f54081fc57e62a50c0657a81f91fe7e5b0ee93d0", "0x297f8335441b111054cbff68ca424972bff570bcb8b05d4876e93c92fe0b6ff0", "0x7aedbe74e081653144a40e4713c7d64ce54773908e447526ec741ff71182e8d", "0x164a744315557a2bcc0654ff50e4d8a2ee66dd2a5046c3a93c677b5d76febcf5", "0x2b1a554f7baf8c4b91a81e797d2cafbc401bd86d331a29d9309ced81b8b81c26", "0x197d1963b67e5a1ffff3e87eca2bc07326ce5e0b7be87d82a1f0ed18c864f08c", "0x1bf49bd642edf7a1b83ca6efc6293abfcf04bdc29066ceb99b02c0e71bd454f0", "0x243aef64db80f1e463301ece27afe624978d8bfc8033b3470b14731fd488561f", "0x2c2632c4740be43538ff3ac49b28b87df2ae5ebe6c5f5853b62815d62cb02e1e", "0x4a1156582f27dbbb55d2203377de72269bee7a13ed0105a8a6f2e434c3bcc6d", ]; let xp = [ ( "0x6064e784db10e9051e52826e192715e8d7e478cb09a5e0012defa0694fbc7f5", "0x1014772f57bb9742735191cd5dcfe4ebbc04156b6878a0a7c9824f32ffb66e85", "0x58e1d5681b5b9e0074b0f9c8d2c68a069b920d74521e79765036d57666c5597", "0x21e2335f3354bb7922ffcc2f38d3323dd9453ac49b55441452aeaca147711b2", ), ( "0xbddb1ea5c182ba12d0762b9c85ebd180541e0b153ca85ff24489f09cb0d44a7", "0x2170b47e91296dad38a19f370fa3368b1f333b8f05e5018b7a38af0a045be237", "0x760488b80e6b5dd63b4b7422f5609df112bf8a63604449ae3020c63ad8e2489", "0x1c937b1f996ef4397c744c8b2503cf644feb5b6d8b7f77237a7b8a2bcb98583a", ), ]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let s = s .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; let (f, p) = bit_1_case::(&f, &q, &s, &y, &x); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); } #[test] fn test_bit_1_case_2() { let f = ["0x1913c7c566f59082bc8178020dbab618db967238ea9cd35f30a48e8f4e37b31fa826f2ce8023e3f492da64e7fc430262", "0xe88184d680a3c04ed182e6b263c806982325a7601dab1e928ee1cf7c98a702c77ef44f6202e8049b3eb05d0d530416d", "0x133b8d475abdbde6aa5ce6524599001bdebe394bd4b3c7a7c62a4c736176f27fabcb165d0e9db88c3aa8af04ac87b690", "0xff88e1756ceadda3075ef7ac6f1764de912e15b03a34e439b837bfa984174e90399e3fbda93a12cc209b1ed1469ab6f", "0xa2e5dd0e5330c07becfea58e47106140d177f1b1241de5c1e752050408f4970ed1275db43a9c3cc8b4f393a72148638", "0x1124c5ec5de53991b87616d2e433c3387e4ea68342f9713bcf93e2be0ff2b07e03ff0091e0ff71ae050db38a10394cca", "0x47203ee35055ffa8e288c3da40c9831b46d6c7b911ea92ee62d4af79903c75831bb79321155920b413155ca1f2424bf", "0x180ccf08a53eb9416fc958429dfea456e5e802217f5f5ecc44653622720256512e4c7f01efa251cd28065c103db44f11", "0xf4e1f72f26c9590b43bc7b7c45fff374a786d462f2dc275bc0812c9a26969ce0bd7d8fc5a90a9fa47cb7f40320d6418", "0x134043dade475ebc5c796603d3ae7161f7f06e07e968716ea64520685e44705bd9221f8d7d7b0b9e2d131576fdb3af44", "0x19ceec83acdc521e6a9dbf17392e097e01a2685cc2c9d7f3f1430e22221070d222e599ac3e9142d486383eec146b8dac", "0x7ca2e9db2452cc19c71ff5049bdd024819954fb83f0f903169da844e8fe4a584031b750f0678f8661f1c1e1f4653a84"]; let q = [("0x19e384121b7d70927c49e6d044fd8517c36bc6ed2813a8956dd64f049869e8a77f7e46930240e6984abe26fa6a89658f", "0x3f4b4e761936d90fd5f55f99087138a07a69755ad4a46e4dd1c2cfe6d11371e1cc033111a0595e3bba98d0f538db451", "0x17a31a4fccfb5f768a2157517c77a4f8aaf0dee8f260d96e02e1175a8754d09600923beae02a019afc327b65a2fdbbfc", "0x88bb5832f4a4a452edda646ebaa2853a54205d56329960b44b2450070734724a74daaa401879bad142132316e9b3401"), ("0x1604bd06ba18d6d65bdd88e22c26eaef8a620a1a9fefe016d00eac356f9ceda8bc8eee5e46f9f4736ab22cff0e8cb9e8", "0x3e5755e9bfc250ff0a03efea22428a36a247504e613980918dc5319efb7f66b10d5fe2e7e86af7e014e1456aeaeac5f", "0x5655a99f7ff904c1e41382c25ff0360d9c51d0e331bfb1e38f5dd41c6909caaf6e313f47f727922109bf8c3204fe274", "0x62ec2ed9b207f63e0d9899ed11f9a125b472586b65bb77b8a04d5d446d15a8701ba5c361a07cd85e0743f5ae2e95a9f")]; let s = [("0x24aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8", "0x13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e", "0xce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801", "0x606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be"), ("0x82dc9154807866eb0f36ccb665a5fc010510bd690ddd7b540e5bf3ff02d81e98b75703a3b3d3c305a70960906e6cb09", "0xdd18d077ad5bd58dabb18d84a6ceebe6375a83dd242851bb4dcf956002c4efb974ffceee6709deb0dcf81d4285e5e60", "0x4a468eb9e206b9833d8e8e2197d3446652372ce5ef50e93c91aa58105d3a281b2e84ddb61535fe1a90bae7e6692f9b0", "0x198fd0ab6249082bf7007d7e8be8992de81f47ae3341c590194fa3bf769a2e5a5253527727115c334e82ed4be8da6c10")]; let y = ["0x6ce420ceafa50ff15baa710e1633d7893404a18b69ef5316a81b182dadbe66bb0ef4fe49ffa578c7698795e6d4a12cb", "0xf45ba6de68a0f1ab26ba5fac564f3f21a75239243fae800e2a8665fd9699e2795c674834c6ce016370aee9e4a1d38d1"]; let x = ["0x7f2db8fbcf121365e92ce3d77bf5d9a3537b5422e894c09e00053ace96a5403a8db66fbe03950e93033c5874bbe8046", "0xb190c99770f69f3e912d3ef69f63e082a05a1e63b50eb9a5de3e07b14aed7eded07b2f2b3c42c7e365d2a47945fc285"]; let xf = ["0x1a009648cc19099f6492fffcdbb1fbed70f61197872a6cbe7e8dda188a5d86701784d71b61130b358bf54a34a90ef1b9", "0x12a81cb61e9b5488fd7cdce673b05acb85475e23b8a68a787721d157650449c422c2903f1f40bab857321ca2aa7ad526", "0x9f9613378d1e258091b5642054bd71a71b047398ae80810d638e9376ae6e45487b41b4d0e5f766f5213b574c27049a1", "0xa211beb012676eacf4c5b94424d3691722b63d3d4493933ffac06589780f351522a8581a194c0663460652181577475", "0x7cdae4413bdf98e6ddbde01882644efcf0cda6141b28ae006abaea3bd405dfcece6208283faef1dad7be06019612c51", "0x1000cb1d25ade5a4224ab93d088ac6a9c5a26cb42b515b71b62ea00d23d39580d75fc848b3ed14fe32b393cd2aa77a29", "0xdfa1993791bd8119033f1734210190856724381a8c45726a9f0f2639f7d5d6b088f4771ae23235234d8108f4beb088", "0x3defca275c0c70ef01a514491daac5461b809ecd6890ef97bafc8e603d20c8e1c75650097bcbc9aaf67428bff100652", "0x62dde56c4a01536859050695f6b9236a150fe6cc3bfd1cfe15921706a387e20dc210c1e0d186abb3a2bcbf8c468135d", "0x15c7bab248f754a557cbaac90c4dda45383bdb5d55cc267955f7b12c32aadcce7f967fcc20f5e803369dfbb63332db60", "0x16a53e4e17f1ba363ae7d2374caaf5b1c11876e4979c1d9ad8f6503f3e2bc05b4fecb1c25d4639d2664929ce90b9552f", "0xb943117f90666049d9ca925443e630eb956afcd48a48f44b90da802913f096aad69e0be1318bff8e88512eaa1f1e13d"]; let xp = [("0x152110e866f1a6e8c5348f6e005dbd93de671b7d0fbfa04d6614bcdd27a3cb2a70f0deacb3608ba95226268481a0be7c", "0xbf78a97086750eb166986ed8e428ca1d23ae3bbf8b2ee67451d7dd84445311e8bc8ab558b0bc008199f577195fc39b7", "0x845be51ad0d708657bfb0da8eec64cd7779c50d90b59a3ac6a2045cad0561d654af9a84dd105cea5409d2adf286b561", "0xa298f69fd652551e12219252baacab101768fc6651309450e49c7d3bb52b7547f218d12de64961aa7f059025b8e0cb5"), ("0xbfa363ea499e05a429d9af2a73ba635e0ff3825edddacfab8afc6b9188700c835282a2c4c7effe70dc61c557b8d90e1", "0x5c3fefe5849b36814f32ce71dee6eba467b220e1b53f01421b9ec6d23209f6206e864539ddaa327b085ad8d78a8589b", "0x17b304f1c4f58afee1ecd75f1570b13da2ee02dfc5731f82ac55d5b6d011ce70ae42061b3d205cbe49efdfcd8d2c04b4", "0x101d88f38de6be9d7eb2c074905585f487715b3e6d8179a066ba56988207caa28f7a5f1ba2f7abd01e200ac71d198282")]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let s = s .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; let (f, p) = bit_1_case::(&f, &q, &s, &y, &x); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); } } ================================================ FILE: tools/garaga_rs/src/pairing/multi_pairing_check.rs ================================================ use crate::algebra::extf_mul::{direct_to_tower, tower_inv, tower_mul, tower_to_direct}; use crate::algebra::g1point::G1Point; use crate::algebra::g2point::G2Point; use crate::algebra::polynomial::Polynomial; use crate::definitions::{CurveID, CurveParamsProvider}; use crate::frobenius::{frobenius, get_frobenius_maps_ext_degree_12}; use crate::pairing::multi_miller_loop::{ bn254_finalize_step, conjugate_e12d, double_and_add_step, double_step, extf_inv, extf_mul, miller_loop, precompute_consts, remove_and_compact_elements_given_sparsity, triple_step, }; use lambdaworks_math::field::element::FieldElement; use lambdaworks_math::field::traits::{IsField, IsPrimeField, IsSubFieldOf}; use lambdaworks_math::traits::ByteConversion; pub fn get_max_q_degree(curve_id: CurveID, n_pairs: usize) -> usize { let line_degree = match curve_id { CurveID::BN254 => 9, CurveID::BLS12_381 => 8, _ => unimplemented!(), }; let f_degree = 11; let lambda_root_degree = 11; match curve_id { CurveID::BN254 => { // Largest degree happens in bit_10 case where we do (f*f*C * Π_n_pairs(line)^2 * Π_n_pairs(line)) 4 * f_degree + 2 * lambda_root_degree + 4 * line_degree * n_pairs + line_degree * n_pairs - 12 } CurveID::BLS12_381 => { // Largest Q happens in bit_00 case where we do (f*f* Π_n_pairs(line)^2 * Π_n_pairs(line) 4 * f_degree + 2 * line_degree * n_pairs + line_degree * n_pairs - 12 } _ => unimplemented!(), } } fn get_final_exp_witness(f: &[FieldElement]) -> (Vec>, Vec>) where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { use crate::io::{element_from_biguint, element_to_biguint}; let f = f.iter().map(element_to_biguint).collect::>(); let curve_id = F::get_curve_params().curve_id; let (c, wi) = crate::pairing::final_exp_witness::get_final_exp_witness( curve_id as usize, f.try_into().unwrap(), ); let c = c.iter().map(element_from_biguint).collect::>(); let wi = wi.iter().map(element_from_biguint).collect::>(); (c, wi) } pub fn get_root_and_scaling_factor( p: &[G1Point], q: &[G2Point], m: &Option>, ) -> (Polynomial, Vec>, Vec) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, FieldElement: ByteConversion, { assert!(p.len() >= 2); let f = miller_loop(p, q); let mut f = direct_to_tower(&f.get_coefficients_ext_degree(12), 12); if let Some(m) = m { let m = direct_to_tower(&m.get_coefficients_ext_degree(12), 12); f = tower_mul(&f, &m, 12); } let (lambda_root, scaling_factor) = get_final_exp_witness(&f); let curve_id = F::get_curve_params().curve_id; let lambda_root_or_inv = match curve_id { CurveID::BN254 => lambda_root, CurveID::BLS12_381 => tower_inv(&lambda_root, 12), _ => unimplemented!(), }; let lambda_root = Polynomial::new(tower_to_direct(&lambda_root_or_inv, 12)); let scaling_factor = tower_to_direct(&scaling_factor, 12); let scaling_factor_sparsity = vec![ true, false, true, false, true, false, true, false, true, false, true, false, ]; for i in 0..scaling_factor.len() { if !scaling_factor_sparsity[i] { assert_eq!(scaling_factor[i], FieldElement::from(0)); } } (lambda_root, scaling_factor, scaling_factor_sparsity) } fn bit_0_case( f: &Polynomial, q: &[G2Point], y_inv: &[FieldElement], x_neg_over_y: &[FieldElement], qis: &mut Vec>, ris: &mut Vec>, ) -> (Polynomial, Vec>) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let mut new_lines = vec![f.clone(), f.clone()]; let mut new_points = vec![]; for k in 0..q.len() { let (t, l1) = double_step(&q[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1); new_points.push(t); } let new_f = extf_mul(new_lines, None, Some(qis), Some(ris)); (new_f, new_points) } fn bit_00_case( f: &Polynomial, q: &[G2Point], y_inv: &[FieldElement], x_neg_over_y: &[FieldElement], qis: &mut Vec>, ris: &mut Vec>, ) -> (Polynomial, Vec>) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let mut new_lines = vec![f.clone(), f.clone(), f.clone(), f.clone()]; let mut new_points = vec![]; for k in 0..q.len() { let (t, l1) = double_step(&q[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1.clone()); new_lines.push(l1); new_points.push(t); } let mut new_new_points = vec![]; for k in 0..q.len() { let (t, l1) = double_step(&new_points[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1); new_new_points.push(t); } let new_f = extf_mul(new_lines, None, Some(qis), Some(ris)); (new_f, new_new_points) } fn bit_1_init_case( f: &Polynomial, q: &[G2Point], y_inv: &[FieldElement], x_neg_over_y: &[FieldElement], c: &Polynomial, qis: &mut Vec>, ris: &mut Vec>, ) -> (Polynomial, Vec>) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let mut new_lines = vec![f.clone(), f.clone(), c.clone()]; let mut new_points = vec![]; for k in 0..q.len() { let (t, l1, l2) = triple_step(&q[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1); new_lines.push(l2); new_points.push(t); } let new_f = extf_mul(new_lines, None, Some(qis), Some(ris)); (new_f, new_points) } #[allow(clippy::too_many_arguments)] fn bit_1_case( f: &Polynomial, q: &[G2Point], q_select: &[G2Point], y_inv: &[FieldElement], x_neg_over_y: &[FieldElement], c_or_c_inv: &Polynomial, qis: &mut Vec>, ris: &mut Vec>, ) -> (Polynomial, Vec>) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let mut new_lines = vec![f.clone(), f.clone(), c_or_c_inv.clone()]; let mut new_points = vec![]; for k in 0..q.len() { let (t, l1, l2) = double_and_add_step(&q[k], &q_select[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1); new_lines.push(l2); new_points.push(t); } let new_f = extf_mul(new_lines, None, Some(qis), Some(ris)); (new_f, new_points) } #[allow(clippy::too_many_arguments)] fn bit_01_case( f: &Polynomial, q: &[G2Point], q_select: &[G2Point], y_inv: &[FieldElement], x_neg_over_y: &[FieldElement], c_or_c_inv: &Polynomial, qis: &mut Vec>, ris: &mut Vec>, ) -> (Polynomial, Vec>) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let mut new_lines = vec![f.clone(), f.clone(), f.clone(), f.clone()]; let mut new_points = vec![]; for k in 0..q.len() { let (t, l1) = double_step(&q[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1.clone()); new_lines.push(l1); new_points.push(t); } let mut new_new_points = vec![]; for k in 0..q.len() { let (t, l1, l2) = double_and_add_step(&new_points[k], &q_select[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1); new_lines.push(l2); new_new_points.push(t); } new_lines.push(c_or_c_inv.clone()); let new_f = extf_mul(new_lines, None, Some(qis), Some(ris)); (new_f, new_new_points) } #[allow(clippy::too_many_arguments)] fn bit_10_case( f: &Polynomial, q: &[G2Point], q_select: &[G2Point], y_inv: &[FieldElement], x_neg_over_y: &[FieldElement], c_or_c_inv: &Polynomial, qis: &mut Vec>, ris: &mut Vec>, ) -> (Polynomial, Vec>) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]>, { let mut new_lines = vec![f.clone(), f.clone(), f.clone(), f.clone()]; new_lines.push(c_or_c_inv.clone()); new_lines.push(c_or_c_inv.clone()); let mut new_points = vec![]; for k in 0..q.len() { let (t, l1, l2) = double_and_add_step(&q[k], &q_select[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1.clone()); new_lines.push(l1); new_lines.push(l2.clone()); new_lines.push(l2); new_points.push(t); } let mut new_new_points = vec![]; for k in 0..q.len() { let (t, l1) = double_step(&new_points[k], &y_inv[k], &x_neg_over_y[k]); new_lines.push(l1); new_new_points.push(t); } let new_f = extf_mul(new_lines, None, Some(qis), Some(ris)); (new_f, new_new_points) } #[allow(clippy::type_complexity)] pub fn multi_pairing_check( p: &[G1Point], q: &[G2Point], m: &Option>, ) -> ( Polynomial, Option>, Polynomial, Vec>, Vec>, Vec>, ) where F: IsPrimeField + CurveParamsProvider + IsSubFieldOf, E2: IsField; 2]> + IsSubFieldOf, E6: IsField; 3]> + IsSubFieldOf, E12: IsField; 2]>, FieldElement: ByteConversion, { assert_eq!(p.len(), q.len()); // let n_pairs: usize = p.len(); let (y_inv, x_neg_over_y) = precompute_consts(p); let loop_counter = &F::get_curve_params().loop_counter; let (mut qis, mut ris) = (vec![], vec![]); let (c_or_c_inv, scaling_factor, scaling_factor_sparsity) = get_root_and_scaling_factor(p, q, m); let w = Polynomial::new(scaling_factor.clone()); let compact_scaling_factor = remove_and_compact_elements_given_sparsity(&scaling_factor, &scaling_factor_sparsity); let lambda_root; let lambda_root_inverse; let c; let c_inv; let curve_id = F::get_curve_params().curve_id; match curve_id { CurveID::BLS12_381 => { lambda_root = None; lambda_root_inverse = c_or_c_inv.clone(); c = None; c_inv = conjugate_e12d(lambda_root_inverse.clone()); } CurveID::BN254 => { lambda_root = Some(c_or_c_inv.clone()); lambda_root_inverse = extf_inv(&c_or_c_inv, Some(&mut qis), Some(&mut ris)); c = Some(c_or_c_inv.clone()); c_inv = lambda_root_inverse.clone(); } _ => unimplemented!(), } let mut f = c_inv.clone(); let mut qs; let mut q_neg = vec![]; if loop_counter.contains(&-1) { for point in q { q_neg.push(point.neg()); } } let start_index = loop_counter.len() - 2; if loop_counter[start_index] == 1 { (f, qs) = bit_1_init_case(&f, q, &y_inv, &x_neg_over_y, &c_inv, &mut qis, &mut ris); } else if loop_counter[start_index] == 0 { (f, qs) = bit_0_case(&f, q, &y_inv, &x_neg_over_y, &mut qis, &mut ris); } else { unimplemented!(); } let mut i: i32 = (start_index - 1) as i32; while i >= 0 { let idx = i as usize; if loop_counter[idx] == 0 { if idx > 0 { let next_bit = loop_counter[idx - 1]; if next_bit == 0 { // 00 case let (new_f, new_points) = bit_00_case(&f, &qs, &y_inv, &x_neg_over_y, &mut qis, &mut ris); f = new_f; qs = new_points; i -= 1; // Skip next bit } else if (next_bit == 1 || next_bit == -1) && F::get_curve_params().curve_id == CurveID::BN254 { // 01 or 0(-1) case let q_select: Vec> = qs .iter() .enumerate() .map(|(k, _)| { if next_bit == 1 { q[k].clone() } else { q_neg[k].clone() } }) .collect(); let c_or_c_inv = if next_bit == 1 { &c_inv } else { c.as_ref().unwrap() }; let (new_f, new_points) = bit_01_case( &f, &qs, &q_select, &y_inv, &x_neg_over_y, c_or_c_inv, &mut qis, &mut ris, ); f = new_f; qs = new_points; i -= 1; // Skip next bit } else { // Single 0 (BLS only) let (new_f, new_points) = bit_0_case(&f, &qs, &y_inv, &x_neg_over_y, &mut qis, &mut ris); f = new_f; qs = new_points; } } else { // Single 0 at the end let (new_f, new_points) = bit_0_case(&f, &qs, &y_inv, &x_neg_over_y, &mut qis, &mut ris); f = new_f; qs = new_points; } } else if loop_counter[idx] == 1 || loop_counter[idx] == -1 { let q_select: Vec> = qs .iter() .enumerate() .map(|(k, _)| { if loop_counter[idx] == 1 { q[k].clone() } else { q_neg[k].clone() } }) .collect(); let c_or_c_inv = if loop_counter[idx] == 1 { &c_inv } else { &c.clone().unwrap() }; if idx > 0 && loop_counter[idx - 1] == 0 && F::get_curve_params().curve_id == CurveID::BN254 { // 10 or (-1)0 case let (new_f, new_points) = bit_10_case( &f, &qs, &q_select, &y_inv, &x_neg_over_y, c_or_c_inv, &mut qis, &mut ris, ); f = new_f; qs = new_points; i -= 1; // Skip next bit } else if idx == 0 || F::get_curve_params().curve_id == CurveID::BLS12_381 { // Single ±1 at the end let (new_f, new_points) = bit_1_case( &f, &qs, &q_select, &y_inv, &x_neg_over_y, c_or_c_inv, &mut qis, &mut ris, ); f = new_f; qs = new_points; } else { panic!("Bit {} not implemented", loop_counter[idx]); } } else { panic!("Bit {} not implemented", loop_counter[idx]); } i -= 1; } let final_r_sparsity = Some(vec![ true, false, false, false, false, false, false, false, false, false, false, false, ]); let frobenius_maps = get_frobenius_maps_ext_degree_12(curve_id); match curve_id { CurveID::BN254 => { let mut lines = bn254_finalize_step(&qs, q, &y_inv, &x_neg_over_y); lines.insert(0, f); f = extf_mul(lines, None, Some(&mut qis), Some(&mut ris)); let c_inv_frob_1 = frobenius(&frobenius_maps, &c_inv, 1, 12); let c_frob_2 = frobenius(&frobenius_maps, c.as_ref().unwrap(), 2, 12); let c_inv_frob_3 = frobenius(&frobenius_maps, &c_inv, 3, 12); let mut ps = vec![f, w, c_inv_frob_1, c_frob_2, c_inv_frob_3]; if m.is_some() { ps.push(m.clone().unwrap()); } f = extf_mul(ps, final_r_sparsity, Some(&mut qis), Some(&mut ris)); } CurveID::BLS12_381 => { let c_inv_frob_1 = frobenius(&frobenius_maps, &c_inv, 1, 12); f = conjugate_e12d(f); let w = conjugate_e12d(w); let c_inv_frob_1 = conjugate_e12d(c_inv_frob_1); let mut ps = vec![f, w, c_inv_frob_1]; if m.is_some() { ps.push(m.clone().unwrap()); } f = extf_mul(ps, final_r_sparsity, Some(&mut qis), Some(&mut ris)); } _ => unimplemented!(), } ( f, lambda_root, lambda_root_inverse, compact_scaling_factor, qis, ris, ) } #[cfg(test)] mod tests { use super::*; use crate::algebra::extf_mul::from_e2; use crate::definitions::{BLS12381PrimeField, BN254PrimeField}; #[test] fn test_get_root_and_scaling_factor_1() { let p = [ ( "0x1d0634f3f21e7890d1df87eab84852372b905c9ccdb6d03cb7b9a5409b7efcd8", "0x24c53532773dce26eb3f1d6ba3b10e2b53dc193baa1d4f4d3021032564460978", ), ( "0x2585e4f8a31664cbfc531bccffafcf1e59d91fb9536c985db33c69f7c242e07a", "0x1d2d2799db056ed14f48d341183118d68ea4131357fa42444057cf0c1d62ae3c", ), ]; let q = [ ( "0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed", "0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2", "0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", "0x90689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b", ), ( "0x1314aaf1c372e6d7635e573808d9d5c7178bdce7335eb0538f718d8e6651eeb1", "0x14c25d3aec745e5a2d4aba9e1448a8cc1048d01a5289f29ccc5acf5e81526673", "0x397391b7b25e2fba7d1de6d86501d49b6a8dab10d1d0efd5869ecd23aab8e9", "0x1863ac65eca09e89b058c1ff7e4c5c7ec7e5859b385a553ea12434f4eda6db36", ), ]; let c = [ "0x14156ca1853095df27f3cb7c50eca75e794d2f14195c16df4a0f8f9dcb48bee9", "0xdc2a20a6107d4c49fed6b2018946bcc2a8dad06f01d099a6df0a4a55ed21b59", "0x14260c5afb0b1148ed80f8339cf9e06ff04257cb6c1817c4efa721fc98f69503", "0xafe8a09df07bf3dffefe512eb9448ef436dd090f98323135baab8ae3c766c60", "0x114692950f53d4f707bb02cc2b5dc98aff5936811707d6579371dae20368253c", "0x2dd3fca72591963149646f1e106dc0ee917551f5a9da397fe12d4a3939ce650c", "0x1750bd450b85cbd62ea3f1b228beff5fd364a127d6054be99a9248497b82062a", "0x1248cfad33a2147726169d3ce55db12ecafd74bc4b83377c168d89b919386546", "0x28d156bac04e64938816b055888399c99a954b82724e5f5589d549a709b2b5ef", "0x39e1ab153bd709556afece475580f453f9126f256fbb49c235bc75082f5f26e", "0x14853f940bf5c557c7f558d3e74e6617d7f08b54fd83597fed1d7e7b9d09e04", "0xaa480d613601947fee14a3ce2b7af4e1872fe49ae3473546aa01a618b78b125", ]; let f = [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ]; let xs = [ true, false, true, false, true, false, true, false, true, false, true, false, ]; let p = p .into_iter() .map(|(x, y)| { G1Point::new( FieldElement::::from_hex(x).unwrap(), FieldElement::::from_hex(y).unwrap(), false, ) .unwrap() }) .collect::>(); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let xc = Polynomial::new( c.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xf = f .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree12ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree6ExtensionField; let (c, f, s) = get_root_and_scaling_factor::< BN254PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(&p, &q, &None); assert_eq!(c, xc); assert_eq!(f.to_vec(), xf); assert_eq!(s.to_vec(), xs); } #[test] fn test_get_root_and_scaling_factor_2() { let p = [ ( "0x72f26b55fb56be102cd3bc838c66439a3d6160b5c724369afbc772d02aed58e", "0x2884b1dc4e84e30fce2f55e418ca01b3d6d1014b772ca79c580e121ca148fe75", ), ( "0x72f26b55fb56be102cd3bc838c66439a3d6160b5c724369afbc772d02aed58e", "0x2884b1dc4e84e30fce2f55e418ca01b3d6d1014b772ca79c580e121ca148fe75", ), ( "0x72f26b55fb56be102cd3bc838c66439a3d6160b5c724369afbc772d02aed58e", "0x2884b1dc4e84e30fce2f55e418ca01b3d6d1014b772ca79c580e121ca148fe75", ), ]; let q = [ ( "0xf0e8184945e8d3483069b5050fd7194c7e35d0c0a30b422f34656d6c94e40be", "0x1752c7b6b35af45db602cf367841e5047ffab14de9079ee8fa5e15901dfef27", "0xa822a5ba029a28335c8bbffe201ffd56deb5dea4dafbd7f615fd2aa9f5a0acc", "0x1228147f83e3ea517fe961ad4b8ee3bf2ade626ec6d9e4fafec17b8404c0341", ), ( "0xf0e8184945e8d3483069b5050fd7194c7e35d0c0a30b422f34656d6c94e40be", "0x1752c7b6b35af45db602cf367841e5047ffab14de9079ee8fa5e15901dfef27", "0xa822a5ba029a28335c8bbffe201ffd56deb5dea4dafbd7f615fd2aa9f5a0acc", "0x1228147f83e3ea517fe961ad4b8ee3bf2ade626ec6d9e4fafec17b8404c0341", ), ( "0xf0e8184945e8d3483069b5050fd7194c7e35d0c0a30b422f34656d6c94e40be", "0x1752c7b6b35af45db602cf367841e5047ffab14de9079ee8fa5e15901dfef27", "0xa822a5ba029a28335c8bbffe201ffd56deb5dea4dafbd7f615fd2aa9f5a0acc", "0x1228147f83e3ea517fe961ad4b8ee3bf2ade626ec6d9e4fafec17b8404c0341", ), ]; let m = [ "0x590ff61397d0dd212bfc53caae870d85457c4bcfaccb300f066ee143625434e", "0xf706ef44c1d0af1cc055f39a02506234d00e8eb3d74a2131fff08abcc77f5ff", "0x22a5875254921ffd7da5ae6eba3609b9a258aeb54605464626791e8c2d23914a", "0xae461e60176f9fc701510a38855b7b7bbcf7e5ba36080e7d54da24b20b89bf4", "0xaae21f01619c3fa4ec0223c3dc06216c285cccb310a2f82381041f00ab0a97b", "0xe203da0f9a03b1aac945c0f61fb2673fb43b2aaa206b95ba090599b7a5e8c2e", "0x1e2de9ed7968cac14ad4e2c546956c34ec381b30280fda652c0775ee0202237c", "0xf3b13b4d08af03303a0db8cbb989aa911eec40dff110a40e2837285a53cdc9", "0x242bd1109f659686c79a5ba5d705c69b59a88b64622927b875c780e6f64e6abe", "0x1f626f25b03417e492d2dc829a2f34f4ee684f0447a207ed1fe3501ee8a66a12", "0x234cc399b032b927dca506524d7f4aeb8f0939709cf6ea1c727f2d3d16f4095b", "0x8dd178fb6d5acd8339c2266bcf3504782285acc0c04208d92713b2b39e39f93", ]; let c = [ "0x25202875a18b48d6e87a29af47945c59bebde6e323ca9e30f07b55b24f193b0f", "0xe200b0579a47bb3bc4e8cdff399f10e04552e9e73c45803819fb7aff4be48d4", "0x2743277dfb400b1209b242eecb685264d1d38f92b7e202dd946f1c1e893294f5", "0x7ce37c37c9a9830297d2b276e1e10592a67e028713dcf49af707a72abcdd23f", "0x2209ca34e9632ffe10ec67e9ba10af63294f90671a1e7136ddb0226444e3dd93", "0x56824745ec0be7ecd30a7361a37968571854966282b36f9275c1d75a96b4bba", "0x21c2ff8564f4b3599e173cc60a49b16b0ae54cb6fd161b3f69becd983863c1f8", "0x21dfaf1ab1424f7a1d49d1548ca28958a1477f7783b2b95b17f74a4135c8f0ec", "0x2cedae6373f81ff31d527af4bf9944d9cacfc9b69f42e8c899eb37b1c750776a", "0x1b4e8f8bab34df2763de3d3ed13db73b40636e335826957af02c5ff75ecf2f7f", "0x1da51303ee50de4521c9659455fa7db99219fcb1e47acbb5fc054b575c4de206", "0x291ee2a6f851083adcca144de9ddd923bbb33c4bfba59dce6d63b61b27c81f88", ]; let f = [ "0x1", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", ]; let xs = [ true, false, true, false, true, false, true, false, true, false, true, false, ]; let p = p .into_iter() .map(|(x, y)| { G1Point::new( FieldElement::::from_hex(x).unwrap(), FieldElement::::from_hex(y).unwrap(), false, ) .unwrap() }) .collect::>(); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let m = Polynomial::new( m.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xc = Polynomial::new( c.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xf = f .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree12ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree6ExtensionField; let (c, f, s) = get_root_and_scaling_factor::< BN254PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(&p, &q, &Some(m)); assert_eq!(c, xc); assert_eq!(f.to_vec(), xf); assert_eq!(s.to_vec(), xs); } #[test] fn test_get_root_and_scaling_factor_3() { let p = [("0x59d2a79bda5f8a941d4db9e360a80121d5ef96fd687003db24ddec0e0c3b63d82efa81fe174bb39be8658ef83c8c2d", "0x2df47e8cdf189985d5085bdcebb5ee96e40a033f5d3b7986f6992be16bc35f88c471acf7f68344f543e52fe891285a9"), ("0x105dcc4dce3960447d21d3c1dc39e973aaf31de52219df089bb5f797ac6d3395b71420b50de4f62a6588c9401ffefbd3", "0x17cb6c41f0c4e1a7394ab62a9db0be660d847ccc58358f3f9b63c98d9a7845c52e1e2b0faefd0d854043fd325dd3c34f")]; let q = [("0x24aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8", "0x13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e", "0xce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801", "0x606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be"), ("0x82dc9154807866eb0f36ccb665a5fc010510bd690ddd7b540e5bf3ff02d81e98b75703a3b3d3c305a70960906e6cb09", "0xdd18d077ad5bd58dabb18d84a6ceebe6375a83dd242851bb4dcf956002c4efb974ffceee6709deb0dcf81d4285e5e60", "0x4a468eb9e206b9833d8e8e2197d3446652372ce5ef50e93c91aa58105d3a281b2e84ddb61535fe1a90bae7e6692f9b0", "0x198fd0ab6249082bf7007d7e8be8992de81f47ae3341c590194fa3bf769a2e5a5253527727115c334e82ed4be8da6c10")]; let c = ["0x521ad898cee9071ebcbf44d874b1a6540a5a24a4fd9c68f45778308171f9267fab695191d4eab620cf33a8eded7fd2c", "0x5966d7f6d173ea01e1a586966651ab83510fb89f6b2afe45cecf0013c8d5695a1e6a597a9f581d9c26c7bc732af4135", "0x110012a0987f151e6eacf408ccd24b9c3e637b240a4100a3ccdc16d44e3cbdf8393eb3557a64d089a1a115a3eab1a695", "0xfc350acc198fbd5b4d95cfcae897c7118bbf9c0479cff61cdaab0fcd1147d96b5521ac4d7d9acb3a8622465c6b1c0fe", "0x6d44964cce393f36664dfb78c36a4b56c817816904d06056f68e9017165ef8db1a4f97532d5c3bbed4da9a68948c926", "0x86f3ebd100f5f5157bc57f79a49542de5fc03a989fe46f82b0c186b4950da2943f4ad019715bc72d9969488889a609f", "0x18776284b17c0858f647e075e04c49ded673151413b8ce9b65bf572081d748820d57d62d54e14ea09aad1c01c5c5faac", "0x647bb2047c521d397fd0f7ae5bd1a1ce889e14808c4ee8f5bd8e019057fb48dad4ea34d4ff280a7232eada165a4400", "0xa97b4be53ee479681acc5ebfc4fae663d5040baacca25a862aae0152d3543705d87df48c8266658d2a03e597cfec8fc", "0x1338aeb075e78cc7505a5d70f24bb9b22ece2fe9e392d6ff22bbd02e82d79e84d590ca9645b2fc96a09f2ffc8b84a4dc", "0xe608702099837e04fc2e999cbb4b845ab04d0a51ea25ee04675bf96847cb9d629da62d1e4354c04ab5208100a0129af", "0x12c968f3ea7364e3ee21b8b2e8162fd74d36e0786ea6a88c7a10d38aa97360f22cd213ab003cca5a2ae19eefaf128521"]; let f = ["0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x18bc5b99f39cbf0fd8d087688e9a0930581e2c940247cd0991e7a80fe41d8f58d83f1513f1ca42a0e74df934924892fb", "0x0", "0x0", "0x0"]; let xs = [ true, false, true, false, true, false, true, false, true, false, true, false, ]; let p = p .into_iter() .map(|(x, y)| { G1Point::new( FieldElement::::from_hex(x).unwrap(), FieldElement::::from_hex(y).unwrap(), false, ) .unwrap() }) .collect::>(); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let xc = Polynomial::new( c.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xf = f .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree6ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree12ExtensionField; let (c, f, s) = get_root_and_scaling_factor::< BLS12381PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(&p, &q, &None); assert_eq!(c, xc); assert_eq!(f.to_vec(), xf); assert_eq!(s.to_vec(), xs); } #[test] fn test_get_root_and_scaling_factor_4() { let p = [("0x18154782ce0913b21588066dbed78d3d341e911d49f154540dff1f15010392a6da1f95a6e4f817e54aede0613c17035c", "0x11a612bdd0bc09562856a70df9ef4088763fe611fb85858d3070afd4f0e121de7fcee603d77d61326ef5a9a5a681757"), ("0x18154782ce0913b21588066dbed78d3d341e911d49f154540dff1f15010392a6da1f95a6e4f817e54aede0613c17035c", "0x11a612bdd0bc09562856a70df9ef4088763fe611fb85858d3070afd4f0e121de7fcee603d77d61326ef5a9a5a681757"), ("0x18154782ce0913b21588066dbed78d3d341e911d49f154540dff1f15010392a6da1f95a6e4f817e54aede0613c17035c", "0x11a612bdd0bc09562856a70df9ef4088763fe611fb85858d3070afd4f0e121de7fcee603d77d61326ef5a9a5a681757")]; let q = [("0x120a838699abaae7ed9481944d92a8c02d22b8cea4ff21ab92fab4f255a20d09700542e530d2fddc2fa171cdd4d31a55", "0x158186f6f2dd04cfa4e785476143a906b63b7f3476ad681992e1b13e2c93fc9957b1784151cd5fdc71cf4557ef606935", "0x2bd32fdfe26d866771e21806a44c4a6d642c3dd98128703cde395f3ee4e353cf25a2e219f1c7dcdbe4574f05d0c093b", "0x7ff9623d918ca12e0ff6ccefc83cf9d283b7231df1db3f9eb8540654b533da9b594fc277060005397ea11f7e9a26050"), ("0x120a838699abaae7ed9481944d92a8c02d22b8cea4ff21ab92fab4f255a20d09700542e530d2fddc2fa171cdd4d31a55", "0x158186f6f2dd04cfa4e785476143a906b63b7f3476ad681992e1b13e2c93fc9957b1784151cd5fdc71cf4557ef606935", "0x2bd32fdfe26d866771e21806a44c4a6d642c3dd98128703cde395f3ee4e353cf25a2e219f1c7dcdbe4574f05d0c093b", "0x7ff9623d918ca12e0ff6ccefc83cf9d283b7231df1db3f9eb8540654b533da9b594fc277060005397ea11f7e9a26050"), ("0x120a838699abaae7ed9481944d92a8c02d22b8cea4ff21ab92fab4f255a20d09700542e530d2fddc2fa171cdd4d31a55", "0x158186f6f2dd04cfa4e785476143a906b63b7f3476ad681992e1b13e2c93fc9957b1784151cd5fdc71cf4557ef606935", "0x2bd32fdfe26d866771e21806a44c4a6d642c3dd98128703cde395f3ee4e353cf25a2e219f1c7dcdbe4574f05d0c093b", "0x7ff9623d918ca12e0ff6ccefc83cf9d283b7231df1db3f9eb8540654b533da9b594fc277060005397ea11f7e9a26050")]; let m = ["0x276d8a09b1ef471d61e1fe932f3136b6412048dad82afcf371bde647281b4f0753c7b540b911c83d732e7d278eca2b2", "0x84dc8eb534426c70fdeb97ad357bcaa08f3bcf837b69302f78975823557a6eaed4035682d08819331e98c628ad7e6a4", "0xad1ecf602d65fe881eaa6e0db2e7f9897c5d9aac15601e7eac85ffce2bc7b2518fb953cd8ab7356837a3539e775e8a4", "0xc44713fa939be012d57473ac1ba1386389c858a2803bf5114d8b2b539c52b38e862bb30b4bbd298bab0e4881a5ebb34", "0x17d27924032bad1b96b038a774356664cf5f284c5d9047dd1f6ed0fc4768c4d33ae5bde98c8a60ac405578242750266c", "0x252d46d43966352b46ef871529d5c8a74ead9d4395930565d5411099e394511d4bf5f21dca890b5c14238be57f05981", "0xdb2280eeda7144c402dfe7f6198bb2924ef03ae600f7222606ac452167328657347b2031e65e90c6094915aaef973cd", "0x190ab4a19e1f1b981b892baedf1e1ed1387d8c002c5f3a2031f94b4bb159c235c039f75271c5034bc18b6d1c45a03c30", "0x16e03a19b04611cdff78c5fd9170f7ea386763607860320a369f48c0083f000e7eeec362f00e883b8262021a004b9fc8", "0x128d8d88c3c8616ff326a554bed73f63ea723c5eca33d4914ba7b263cc869557904c59cff3b76b5dfdcf84760b96fa0c", "0x36d2ef1d9b923357234e298303031f5c1bf5e2f73d4750a712262fd5e7ddfa653a4708e4380616825a3a723a4dc2b5c", "0x329f18e7852fa05613e92046afab08a2bc52479f09c105f34b2a5b11f48e46a872245a2be53e886831d35b55f343069"]; let c = ["0x105016815aeab4c1b10cba422f6a4e683585d4ccc465352ad2f1409607d64c54b73d78aa8bdaa3278720844c37567039", "0xe11367a38a9da9df34240738a7a3dca8c8fe5ccf68c0b23ece7f8c4810788c9023c2ad2f14f1369d17825c133efc2d6", "0x13e42c3e0801ac2144a06fbf1712c06213e43c0272585dc031325aee1b1dbae62f7c153bf3c140b105713ed07834b4a", "0xc759210484ca64b6a064096c61d5ab0a8dc2dffbaa7e2dc7336f37c2c0d759c4ff697bf713b362105bba1e8fcbb94a0", "0xd6a3922a006a5ac269f11053acef2763be703fa77d9050683f2d1513c7ce01407cbcbebdb2b0eb950e9144b7f2f02fa", "0xde779332fd6d9f465b20e6a6a17068bd9eb8099e645e126c5ec4b01df1cb55da421916cd7a563e564895cf2511754e1", "0x92dc96c5c90e4a4e20a4cc830355b613eab563b9cb9b14af48de62916116cc249eda46862b4676a303984e5006cae4a", "0xe6467206b01d8ecaea8fdd90675022b9d62cbd8685978d49df16aef14c96dda37955922adef7cf0ce5e70667934f1c", "0x33f8a5722e1821e1f8c5f4aeb067bfcab205abe6c371677f1cea39accc8cc574af258075a0918f6778263817954d908", "0x130fe108a81a7753e3f765d559da93e49907f3bcb160ed13cf4fd2a6884e312f05ffe06b5bec5a38ecbb7806f62dcc79", "0xcd24160fefddfaa66c9468a5c5e051f326dbaef7f17399b2f2f405981e6aca41db75f4d675bac7aed2b433f922616d3", "0x17f2b41158bbf2cb53644eae30ce07f0ccb46385c2b2b40a6e0c09afc5dbcf4dffd7fc0582d362ba811d62d7264e9909"]; let f = ["0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x66ba50e8c99edbeedf33b876935c3e1b9cf1af588eafb63c6a64d7c9213ad89ad6e2940079b43033d2c6148ace378dd", "0x0", "0x0", "0x0"]; let xs = [ true, false, true, false, true, false, true, false, true, false, true, false, ]; let p = p .into_iter() .map(|(x, y)| { G1Point::new( FieldElement::::from_hex(x).unwrap(), FieldElement::::from_hex(y).unwrap(), false, ) .unwrap() }) .collect::>(); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let m = Polynomial::new( m.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xc = Polynomial::new( c.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xf = f .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree6ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree12ExtensionField; let (c, f, s) = get_root_and_scaling_factor::< BLS12381PrimeField, Degree2ExtensionField, Degree6ExtensionField, Degree12ExtensionField, >(&p, &q, &Some(m)); assert_eq!(c, xc); assert_eq!(f.to_vec(), xf); assert_eq!(s.to_vec(), xs); } #[test] fn test_bit_0_case_1() { let f = [ "0x1d7a9ffbbe137d697794dbccbd7925ea98507cf8d4445d3e89123811ede12825", "0x1f45aa2ee73f15e275e5c1fc0ff08be0981a61d8e7642301653a6307c7467811", "0x2446d99f276e4c8bc63d81e8d0c1e37c901a5a569865533968e39b5083fc576e", "0x223bd50b771fcaa905131a5f04c3c634c9df344731b5aada49be919aaa447cc7", "0x24cfef2958a7c9c4d7ddfacdd59750105dcc37f6aefbf4a9ce706bc36252c47", "0x3a974db52b274684955cb370b0ac66e3e295ea6e9789fb7259c294210f7720e", "0x160b7346ec9fdd9841feb355a44845dc30c2a9ae3fb8266ad697b531de5e2fb6", "0xe46af84e1cbba805f204fa5ce1c9a99c79799110a56b5d534495a358f9c739f", "0x1f2b5709d0d7c9499b9524e9708ac412d3fa05fea9b51192113e131bd5572a21", "0x8a75eef583ffc3b0f690cd9eab121b1f329194c1052a86d50224b92838c5d76", "0xef3a64570d17038de7ec74175c125ac7e8780509764f07572ce9593878da9fb", "0x2a6290607745b58a7b87bc78053320664e06d12b35825f15893ad52a39f54331", ]; let q = [ ( "0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed", "0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2", "0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", "0x90689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b", ), ( "0x1314aaf1c372e6d7635e573808d9d5c7178bdce7335eb0538f718d8e6651eeb1", "0x14c25d3aec745e5a2d4aba9e1448a8cc1048d01a5289f29ccc5acf5e81526673", "0x397391b7b25e2fba7d1de6d86501d49b6a8dab10d1d0efd5869ecd23aab8e9", "0x1863ac65eca09e89b058c1ff7e4c5c7ec7e5859b385a553ea12434f4eda6db36", ), ]; let y = [ "0x1ab9de59fc825e8b5326694c7d82556785cb9cbfd0d0a11721d1972c21c411f8", "0x16a475582082ae3616c808acd62684170d9fa7bf234110353e9cbceca19d2c69", ]; let x = [ "0x27783160c70b7ac760cff888c621846a7ed80e50c7ea8a7a718a4ad8a50886fb", "0x10a6d46618419682152a25b5f819b22c2e572d1f670d12026a18c384248dad2f", ]; let xf = [ "0x6e2d5c667e253ffe1d604e9b0c0efb376aaa3e1f2fa8194a9fdd627525394de", "0x2dc3c5e55face7c5e2c971b204e63954fbc8ad239d2d152e532c421b7834a99d", "0x2ff47505930441520ea2801041714bcb5d41a0ffa81940aec94ea9901fcac97d", "0xdab9fd3d1ef5226f76a2af1d6b410d8639501aa55867c1f0779e0422d545f0c", "0x2fea029bdb6a10f53ffd60992916c6410e0f53520845bfd3e55f70e8272c8fb3", "0x2f329aa1c588e3e4b7d8f5bedbe3c09728563ff0c46ce45b66636cb6ba1ee436", "0x2290e74d07afff26a405ca3722d951cb9a512f1c100fa50e29907ad3283e7b83", "0x6bd6eba6eb034c98be6fdabbb6f2986a20934fe7f4ccb1aa1cff1983d7d2ae4", "0x1ca0c85d7f94b5c6b3543992e315765cb35d0f7d49149a6939c1e7afec80ee3c", "0x1f70622e79ccbeb35ecce1f7718bba441de2df4f3e916ca84262a68f9eea11f9", "0x2492333e1554b6d2c1ad39913d06e14c6ad3a1569e62952be0e54c3427ea8aab", "0x2a9baf66b1ec17ae1f6f435746d944886953830b40efced523794fd2aa17d4a", ]; let xp = [ ( "0x27dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9", "0x203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad79", "0x4bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e", "0x195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de152", ), ( "0x19092b3d714b3bb6599b735386dd05eab401e72057bab79773a6de8f5693387b", "0x1acb3fbdde3ce471791558747f0e52b1b7a708834dc533393bcfc2af317703ee", "0x258d7966e4b36382460549a44d5cbe96fbe1c412e36f25218438f72d7d387077", "0x2a58bf6a639ae104439ba4e8db873938a26fcd5bd0b68beb20c44705d9820860", ), ]; let xi = [[ "0x11a253cbe22e3132c161d5e3e3343657bbd9cf3475b824786b01f9b6b2954451", "0x15c7110a9b8d99717d5b36a5ace0ec208511247742b718857d387d03646e962a", "0xce691f6829cbf96477c2680a0b89f055de1342852e78bf44a00a771618a2fb9", "0x1dbb1eac7562ccccd643bd095a91457d40cdc83000932991e9eb0d518a123ac8", "0x334cb5ce87c27266ceb11f14868d44bc2b0d0642fe2d03cccf424afcde8fb8f", "0x2fad54548575eabff6e9ff91ccec2fd782accb81b070e6920fff020ab182dcab", "0x205830d2f4414548e1226815b77fa991c4ad82698e2714e9fe8186d3eb02a938", "0x20e43c4e7765ce864bc67ee78d7ee54a77de4888351a6f55e1014a7ba6b7db7d", "0xf5529f07c581dfe555a1997f4037a95be74e5a845fbe8ef3bfee3bfa46bafee", "0x2fdbcae39c35e9916e344eca4617e328542adda118c9c7647a66752f0f9312be", "0x22cece7898caa51dc9b45b37d3bcab7bee6bf46a8bb62a59772f9bfba17143c7", "0x237133eb50789ad88140f3acabdd1e0eb4f1a5ba81f2dbcf40379242cfcbcebc", "0xd6bc07c1405393e2a04f16c95d908468731b135ec8df7280a411bbf74bc2a97", "0x1c8f529ca5c5f3db100755ee2b62b30fbac4ee36be96a2991bb5c5df10409f30", "0x29692f0b8e65ae15c851e5558aba62671dbbad538149b59ada944f8913daab87", "0x2091081625469e0549f3ad0902bb68b780db24524a08fcab699a012dead87cb5", "0x15420ca5e286164b842ccdd5ede9c9d488836ae7e4250735d913bc865c686ffd", "0x2910950b8c5e2f956ea34c9f80bedc007437f5be8a2d391182d57cc107d44ceb", "0xcddf598527c71f4c6fe7f3a63f2a6088c35d97703d6a457935d29e9e80f32eb", "0x26ffdefe8388fcb1b412d6d5da117ad677c3d01634e46a148db9582257e95966", "0xd6ab9f93f6f075e4d50a47dfd2b76c7891b8a7d309beb55e52ff2573ee2f439", "0x488ebca58142b146b8891ec91c9eb2f7dd13a31d648eb3b58337aa3f473f7c", "0x4a5388ce5bbca66cb7b57f8d1ef6d825f32ba5dee832d7120c24de5db34b0d1", "0x6d4d58288e64b3cc7248a086e64f07c9edd468fe1339b6475c6cabe949e4492", "0x27a0872bf114a6aff047a0c387c16408308894a8586b2ceca263af44b9e5e2ad", "0x212c049231594608761ee58f620b6744e388ff939835e413e987b16a53ac10ee", "0xd6fb3a414a6bf136a738e599e89ac51c2bc026a344b709e78b931803d9eb471", "0x2d5fd74719cbc5e3b6e5d5acbe6d908e436163e27df30a584573e7beecee6a8c", "0x2b238a056fc7b2b14b73eaef6efba5a7fb9ac70d230379d1c72d70fa80ec5f83", ]]; let xj = [[ "0x6e2d5c667e253ffe1d604e9b0c0efb376aaa3e1f2fa8194a9fdd627525394de", "0x2dc3c5e55face7c5e2c971b204e63954fbc8ad239d2d152e532c421b7834a99d", "0x2ff47505930441520ea2801041714bcb5d41a0ffa81940aec94ea9901fcac97d", "0xdab9fd3d1ef5226f76a2af1d6b410d8639501aa55867c1f0779e0422d545f0c", "0x2fea029bdb6a10f53ffd60992916c6410e0f53520845bfd3e55f70e8272c8fb3", "0x2f329aa1c588e3e4b7d8f5bedbe3c09728563ff0c46ce45b66636cb6ba1ee436", "0x2290e74d07afff26a405ca3722d951cb9a512f1c100fa50e29907ad3283e7b83", "0x6bd6eba6eb034c98be6fdabbb6f2986a20934fe7f4ccb1aa1cff1983d7d2ae4", "0x1ca0c85d7f94b5c6b3543992e315765cb35d0f7d49149a6939c1e7afec80ee3c", "0x1f70622e79ccbeb35ecce1f7718bba441de2df4f3e916ca84262a68f9eea11f9", "0x2492333e1554b6d2c1ad39913d06e14c6ad3a1569e62952be0e54c3427ea8aab", "0x2a9baf66b1ec17ae1f6f435746d944886953830b40efced523794fd2aa17d4a", ]]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); let xi = xi .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xj = xj .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let mut i = vec![]; let mut j = vec![]; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; let (f, p) = bit_0_case::(&f, &q, &y, &x, &mut i, &mut j); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); assert_eq!(i, xi); assert_eq!(j, xj); } #[test] fn test_bit_0_case_2() { let f = ["0x6dcf1ec2bee9d55fd7c7dd01f0d89e52ce00053fb4cd271af8ac67e915aa56c1f18943cf63d7acf09f9e238c86f7575", "0x7f05f480f32402899fc238d5e397600577a07eddd78a63793400f32912e689ef50ff7298c542fcbddc8a2f30326ff28", "0x71d870e4553f214175e57f71397705b5336a8c404e29abab7505079976315ae30aea8c7fc8e47f2ce78aed551c79270", "0x37df42454ed3974bb2b32f97123a17956e452893cabef6a29a0888f8ce8b899253e37ae32f0ae88611fa10260d597c0", "0xba703f387adf415b877fd75815f8322190dde62bdc8a55e54b5dec1284a8c9177b3c945a72f0e1e9c109d242988e116", "0x14068f72159c932c910dd5126f8907d9616c496a0f51dbcc5585ddebaf32dc4e03ae577f1f07d02f85fc8a875e197521", "0x17dfc12834ee7334831b24af1174df6680c4991d4d20cc807c5e8df6083d142e2fd17ccfce6bb359366acbb7781372b9", "0x17d3b0da632dabdf4ba0f6c890308dd36ed98b5e1d50a8160a2349e79dd3de20eea74d8b95daa3bc8b9ac34a59ff12f0", "0x17ddaa28e29c2317b96c21b7fd31f8f2bab3cabf17b82c770ed0c77db94e0738119993eb4c5d01ef3358bf5ad26286cc", "0x22b2500baf6ce28a86979f31387bb67348f155192cf97f99aeb257fdcdc23c15eb5315ea817f28532b8d5198e199dd", "0x6524f53a10bd1ed1f7de6acc2d4414912600bfec37d116a4d096e4e54120fe17325dec0b0e382b90ef6654c3bd2e20c", "0xebb85352772f284d12c95bf531a0f1fc69bf6acd1695e9af23d641db780ebb70c7fbfbe8a680e766390ddaa62af47cd"]; let q = [("0x122915c824a0857e2ee414a3dccb23ae691ae54329781315a0c75df1c04d6d7a50a030fc866f09d516020ef82324afae", "0x9380275bbc8e5dcea7dc4dd7e0550ff2ac480905396eda55062650f8d251c96eb480673937cc6d9d6a44aaa56ca66dc", "0xb21da7955969e61010c7a1abc1a6f0136961d1e3b20b1a7326ac738fef5c721479dfd948b52fdf2455e44813ecfd892", "0x8f239ba329b3967fe48d718a36cfe5f62a7e42e0bf1c1ed714150a166bfbd6bcf6b3b58b975b9edea56d53f23a0e849"), ("0x893227b499dab30e15b606ec3c375f9fabf7fbb574b9b11c9eefbe33fae82066297e23c518f59e74d5cf646cec6464f", "0x10578234a81819d1ebb3d77b03a128f3165642386fff1b0a74ad73c139425703a991ce459cdc1995351adff98061f0ea", "0x16efa85752a02d4358a92eb3b577c1e27a02ec36000c44403159baf7022541a02104b633549e05b774e1b76343a8e661", "0xaf65df48a519d9209257e3df9fb0a1bd3491799091df954380242592db0bead0ddd62dbe33aeeaf1d4a63bdbc4c6008")]; let y = ["0x6ce420ceafa50ff15baa710e1633d7893404a18b69ef5316a81b182dadbe66bb0ef4fe49ffa578c7698795e6d4a12cb", "0xf45ba6de68a0f1ab26ba5fac564f3f21a75239243fae800e2a8665fd9699e2795c674834c6ce016370aee9e4a1d38d1"]; let x = ["0x7f2db8fbcf121365e92ce3d77bf5d9a3537b5422e894c09e00053ace96a5403a8db66fbe03950e93033c5874bbe8046", "0xb190c99770f69f3e912d3ef69f63e082a05a1e63b50eb9a5de3e07b14aed7eded07b2f2b3c42c7e365d2a47945fc285"]; let xf = ["0x1727a4684524eb2175d31f506b07370100418d3fcd5ad5c5586b3c2927dbffdd38a1a44b46f601ab362202e8276c007d", "0x57d77a9e8e6cd838edc1e63052a64d020d10ab12ab460dd755dec64232750ca866647b373738bbe4943b6aee387caa1", "0x42e0115d1c759474549023340d4f01ea67f2f082b59dec03aa7e22e27bccb5d4840ac815f2c12da594e423a2108737d", "0x54735182a914667a25226c91d61ee1f8c5c6c2e40b633da27379618cb58b0b55c0acff39fe7471a196e8bd9a0db6863", "0x14276d83ecbbeddabdf9bf5d9449deaf0a40d6de94e8347d983e97ed4491a3cda57fabebeb6d788023db42ceefa73d8b", "0xda9195159528161fa4960f25523d4d906c194a134c2695ba34577b4dcbbb76911a90cbb411db147cc5627ef50c9210d", "0x9552828c7dcc07d56efc554f98880b746c6ce0f7f41377d934699dcb5cf7eab408dbe027df4506c40e2424b24c6b69b", "0x122dcaa1ba9a8a8613064735071ae0aeab8e0333d7ff3018c9d51a652303decdf4907f6e7f232224b4fe0b20245f2fd4", "0x112f00e12354b1ad57581a4dde94de861275afae359c3016f8a13e81943a4a18f4896097697c449335ca5f9d21b7f654", "0x13bbf456483cd4566ed59718bd067589e294b4d7084073073fc77a685f0e4ae94092405afc2ecc6d437c20102b74f4ae", "0xeef615cd28929e56a59bf2e2e93db68f2ed629f9872a3b1aefdccb098674950b928bb5c920a2dc4d6405a69dafd98b8", "0xebec00852daa59ee4861f6c55f01d098689453651a335e711a11c3e6606acd9cd851f8132fb24bfa3edf65997e82785"]; let xp = [("0x19e384121b7d70927c49e6d044fd8517c36bc6ed2813a8956dd64f049869e8a77f7e46930240e6984abe26fa6a89658f", "0x3f4b4e761936d90fd5f55f99087138a07a69755ad4a46e4dd1c2cfe6d11371e1cc033111a0595e3bba98d0f538db451", "0x17a31a4fccfb5f768a2157517c77a4f8aaf0dee8f260d96e02e1175a8754d09600923beae02a019afc327b65a2fdbbfc", "0x88bb5832f4a4a452edda646ebaa2853a54205d56329960b44b2450070734724a74daaa401879bad142132316e9b3401"), ("0x1604bd06ba18d6d65bdd88e22c26eaef8a620a1a9fefe016d00eac356f9ceda8bc8eee5e46f9f4736ab22cff0e8cb9e8", "0x3e5755e9bfc250ff0a03efea22428a36a247504e613980918dc5319efb7f66b10d5fe2e7e86af7e014e1456aeaeac5f", "0x5655a99f7ff904c1e41382c25ff0360d9c51d0e331bfb1e38f5dd41c6909caaf6e313f47f727922109bf8c3204fe274", "0x62ec2ed9b207f63e0d9899ed11f9a125b472586b65bb77b8a04d5d446d15a8701ba5c361a07cd85e0743f5ae2e95a9f")]; let xi = [["0x4058ae506a6ea2d9acf5767ef521a39416357fba20e7c319ff4bc05fead6c03a9f34ff39427dd30ca948256f8f5e776", "0x15124e81cc29571ada5ab8d3c9d55f5f083502a4b884a87ea770d7087dce6fc1a4143063e431ab1965a326d6cc5cf28e", "0x190d1a256dc8cad275af59ea8f7d203c3bb8c8a34b2078662bbfd23e7e7294f4afd91a8877df524ca96a0a34ec4fc2d4", "0x18881b4d655fddc0574a3f3cbcbfb2ff8dc94eed30e46b6ae7144979716438563e9ba0cf2a2973a17db83db2e5314407", "0xc65c65aa02e44da35031c6b340fc9709367a561d0bf13a144f325beeba0e0f837e91b5218aac9eb1f28c196c093af1d", "0x10fcc3d0cbcae26707dc37c424fa4c3a37744fbaad96c6df4b766075ccfb1f59f458be55d30259657664f11127121f3c", "0x110c58ec3d55cc3593e958640c42d93f05c964469be251ad45a2e7af7646ff0daba3ef5e5618ece1e61f64fdab4dd60a", "0x173e8e07ef932c01bcc0be6e316728d8acdaebb34d0630aabc5960f155c3dc7c94efff23d3a81c5545aed40de3353b24", "0x167b41861a4cf1f89dd265419cffa76667283a684802d8543352088a297ffac030708ca3205c22ff262b4c32af064100", "0x3b4fa4dc3a053fbc445810c88a8198298b1dad990acb6b4ebb7058fa77a680751dd9ac9bb42ae39582ad6ad7647e2d9", "0xa14179662d3280fa96471af03be7fc5feaca5fbbdd79f0eef4b1e354fc4ae6e4fddf497eeb8f3ad8613273537c80c08", "0xf8242af4b8ae30e76ded4ea3db45d278d4782604e03214436fd0ea18d6f45914fd8d25937ae6c7af57f6c1fa36a075a", "0x1859b038205c8a50cb4f91f15b8828a0c649fd9bd316b0d42bef6398bcb47ec124b1c884dd3c52f08396e95ffa0d2048", "0x15ce69cc39bf81686ea6b3e18bd550a9d570a14a9e397c6c1fefad6e5efd209e994f31f93bdad0f5a85cdf7eb8f71f1e", "0x46f25b1914231273bef92307b4a85cf4f558882c65c35cc36e685ba343e66314e03f1a97b91cb45be155085e29255a8", "0x85450ffae0bf84261ee380b516b33ea88e49cca061f6ccc4818232d9a845081eadd269b1d6c86ac42b4a6c88ba177b8", "0x49d9c4120a63a738795739519c8463107763e61e1aadf534ab6477567e6d327c56c45cb93e9be10a894cab32d9186a9", "0x48aba2f406cc53ac0c9d572d6fd9e99ca649a8d2ce390771d4264c0766a974bf4fc6b3222d6596a946a8187ae404004", "0xb3d9d9f100e451e2ff5d3ff32d211a539a0d90f190e3cc0ccf0d2d44ba805072589b66c7f53c916463cdda53fb33bd0", "0x115caccb0b82e44cf7079fd95d8b6cb506de5e6a67f28c6a5ae713497742697960f5e9dc08d75cacc6f0ea6e4f29e76c", "0x1674a25b64d278d9c8747d1d1a532686bce60ab496ba0ba83a26e3d30942f1ef3c7aa05187a258032ee573659693d6e2", "0x14d18d8c6242d9c3b2cfcf95da5628e94694fec1d40f64e432f1a4e79f9b96ed40b3d9cd602855fde8e8f6527570af27", "0x161fb4586486c4828d6de3f6b1da13867f8db7916355427d8573b8891ec2f2e533e4988d374bf52f0868f45e89b47410", "0x1075865248624b63a4b59a293747451724956b8517187e9554770f9c5551534815ff969dcb1857ce1ab2093cf9c9a8b8", "0x9f685cfe49c968d8c596d9f647ec9a2c5b8b45ae16fef8d7cc9ccd858f5b66fc526c01589a93fadef83efc0b865661c", "0x366861d36b3781daea9909bcde600135486e55965744c33f0f88e1a74f270b402fe2a1eb34bd412007a7501bcc0a1e", "0xe53938fd56c7fdf34c21c1b011fb083c02fb12b440c859f910ff0671a8348d38bac8380d170b07f8dd6e50ac18a8dc8"]]; let xj = [["0x1727a4684524eb2175d31f506b07370100418d3fcd5ad5c5586b3c2927dbffdd38a1a44b46f601ab362202e8276c007d", "0x57d77a9e8e6cd838edc1e63052a64d020d10ab12ab460dd755dec64232750ca866647b373738bbe4943b6aee387caa1", "0x42e0115d1c759474549023340d4f01ea67f2f082b59dec03aa7e22e27bccb5d4840ac815f2c12da594e423a2108737d", "0x54735182a914667a25226c91d61ee1f8c5c6c2e40b633da27379618cb58b0b55c0acff39fe7471a196e8bd9a0db6863", "0x14276d83ecbbeddabdf9bf5d9449deaf0a40d6de94e8347d983e97ed4491a3cda57fabebeb6d788023db42ceefa73d8b", "0xda9195159528161fa4960f25523d4d906c194a134c2695ba34577b4dcbbb76911a90cbb411db147cc5627ef50c9210d", "0x9552828c7dcc07d56efc554f98880b746c6ce0f7f41377d934699dcb5cf7eab408dbe027df4506c40e2424b24c6b69b", "0x122dcaa1ba9a8a8613064735071ae0aeab8e0333d7ff3018c9d51a652303decdf4907f6e7f232224b4fe0b20245f2fd4", "0x112f00e12354b1ad57581a4dde94de861275afae359c3016f8a13e81943a4a18f4896097697c449335ca5f9d21b7f654", "0x13bbf456483cd4566ed59718bd067589e294b4d7084073073fc77a685f0e4ae94092405afc2ecc6d437c20102b74f4ae", "0xeef615cd28929e56a59bf2e2e93db68f2ed629f9872a3b1aefdccb098674950b928bb5c920a2dc4d6405a69dafd98b8", "0xebec00852daa59ee4861f6c55f01d098689453651a335e711a11c3e6606acd9cd851f8132fb24bfa3edf65997e82785"]]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); let xi = xi .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xj = xj .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let mut i = vec![]; let mut j = vec![]; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; let (f, p) = bit_0_case::(&f, &q, &y, &x, &mut i, &mut j); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); assert_eq!(i, xi); assert_eq!(j, xj); } #[test] fn test_bit_00_case_1() { let f = [ "0x9f8f3a5142813065834851b0abdb02873b62058c141808bf3d908c4616492b3", "0x2e48eb414b93a0b30e2c3f393d3ed30b098663d73b820a07ba724a9917378495", "0xbdf45af1f5b4215f808a4d7ad54cfeb6d8eba26084098a37010e1038db40961", "0xf6c4c18f9d9acdf9b467c9e83e6ad6cb145da60900ccb524892622686c3b558", "0x8c23916cee1cbeefa7be656ef56e78fce55e743b2a38810a29073d9d799fbd6", "0x1d16044d319830664057b4957d214455b93b6279e9b5f5ac08dc3072186dc4f3", "0x17f1f10e76b4e9fdb704ceb895c3924cf4727927b0ad3ee897b0f656eabd71b5", "0x1095b03dcb74d1b11d583e19e6bc9ac57db13a0c4f04625b02e3e1bf6d387c36", "0x2d67c398ad69288c687f6f86108390a0cf2dd20821c4399cc18b975d04242497", "0x2955c5cde10bd61dadcf00e62f844d042fa55c88603e3fe991e6720bd794401c", "0x2ecbad3d0674a417f39baea2524cc0790b3ba9673433d6d3c30f1ede92e895d6", "0x11b947c4a0acbee9a2eb50c665bf7a12292ea3bc4cb8e0bfc2f34d527970ee48", ]; let q = [ ( "0x23ad66f3a7cca9dc75049635faebd124316244b91de5fb2764cd151572a905f7", "0x9edaf0698a8c56f51139588acc094cee3c37d427bb6d2eab830aae529097d1", "0x1ad4f87d3b4375a39988ac099b042b1e7c0c715678e4c2bea8905f607cf950f8", "0x2700e8a29b7bb45f3022a18a07bdc66d0254559e17cce64e3b4ad21578fcf410", ), ( "0x2c261e6771e418f02c5225132405065a249033d6f8799261934c3c9f9b3d33f7", "0x270394a3fc58d9e321fcdfb8fffd764208a6caea73d65f24bba0cc1ae0d3750f", "0x2cb21d611ecd44169370fcad2b3dcb1d757f0e468ed4cc0d6c680d0d89c3214e", "0x1a737173a08f49638e4b84b0fbe900d1831d55c6097a45af5af1ec1eaedb5726", ), ]; let y = [ "0x1ab9de59fc825e8b5326694c7d82556785cb9cbfd0d0a11721d1972c21c411f8", "0x16a475582082ae3616c808acd62684170d9fa7bf234110353e9cbceca19d2c69", ]; let x = [ "0x27783160c70b7ac760cff888c621846a7ed80e50c7ea8a7a718a4ad8a50886fb", "0x10a6d46618419682152a25b5f819b22c2e572d1f670d12026a18c384248dad2f", ]; let xf = [ "0x17774e3e8a23ff734ca1598a87bc0412dd8d117f26c62ee7e94dcb29e0357bb1", "0x1982b56c3e0bcdc9c994b0437e4dc0b9527821ca7809068c62de431b5489c670", "0x2872b0c088da975ca497c1a9c18ef0ef3993ddfd09077dade5d72d1ad3abd8fd", "0x2969378a0cfddacbdbcbcc93eb8642d2dc8167a467acef3ecbb15eee40139640", "0x193581cebff836c6d2319b0bfd91255bddcef3eba4383bb93d17ceefd6953d3c", "0x26457780a6d80fcc0f23a463b42645f7fec8e6f0a0008e4410656947089801c1", "0x24e212fee032cb7c7409ae15eaa0aa0311a810586db2f6f180a6b0cab54e0502", "0x260d3e40114b8d2ecb09e3f0e4fcd13eece95b0a7d7b5ce96bac14f5cb32d71b", "0x1b1a5d98ae47d8520d89e8c8fa73dbf28988f9670c62aa77588361bf2193aa0c", "0x19139c8f3a190fa873462ce2dd5f25690f00ec110f4b62996e365f3421a3259b", "0x2143f989b60bcfb4a9887cd610decf67818b14bd709d865aa40c7a52986a5e5a", "0x2d87bf0c00e24b175e5363e0de0a1c9ed68f160c43ca0093e2dca54f07586b65", ]; let xp = [ ( "0x126a285e45fa024002aa806848f10e5b2c64a25c6af0163612ef34379fd72584", "0x1303baa20971befe5aa7458c1164eac4a10108c8abbcd37a1e09d83ee94bdbd5", "0x37dedb5d778240b5f237eaa4160f20981e0ed5d24f832e9eb07004e1a722d0c", "0x1305fcc05ab211db0fd12d1f8f1f894726dc7bdbfedeab57b33af11d81279c2b", ), ( "0xdded79e4d972e50343575387abeef8a0e3c874b791e2c9491e583ed9d1dfd82", "0x2e89537cdf57a51d5d306241c3360b78ab60e5fdbca2bebaae6544d0a9fb6d9a", "0x1f661619c64b414dfbf50599d40cee296e40fee522ff41a1039e9b21d41a37e6", "0x15de46c6b8e5286908252cdc6a905536304a49b95b386e8139797409df7a1527", ), ]; let xi = [[ "0x1b0a3a3d5e555ec6d6bda084d0fad0138fd60d139e23540b5d4a49b45ac56587", "0xc191bad21244bcb105c57c9b4967e036b3b7e3ea1ec8778a8a9371f58d430b1", "0x1f4207ade61d68bb73fe79838db33e1b17e3857b7fe958ab082c04ac63561f87", "0x3ce267d6ec699ef2f104643b6bb6ab6ddfddc83763b2647a99f23941c324142", "0x1b3e7e2fbe90dcaf67c060a52268ee3bf1384274580bfab77a2f986369216fa7", "0x1f4204f30004aaa5ec1e9e3b9e81d05ba8672bb8db19e9a79df837073a2d493b", "0x1c6b68ae31ec29d4014068f482fbe495e277fd1016cf0ca4883e1fe6da155abb", "0x2e2e0e7f32035eddd17a6b3e42c6e311081ee61f8a7372f76c9920109d008214", "0x243ce082e4280ebbfb5b3c1f2175052d62978b43133d9f61b38790b33222f17e", "0x15bc2bb4c2356e76895c57bf67b8d4a2964bb0dbe972a7b446800dfdfe24e6ee", "0xea059ff364db12717381403450f58d590818fff46c46fc0aebdabbb0624ace7", "0xe292bee9383249aeaef594757561443d0fea89fdca0b2e9bb1cb2b9979c6466", "0x14b41af439343d54bd5aa01e3ac5dbf852fe6ae591dbd86765e376787ee3cc0d", "0x1dd42fe7d2d0f14e414514edb81e5f7578d0ad524267c77457f5dc16dc8dfa2e", "0x1099b52fd7afa1cb074293cca265168ad673ef7ae209f473fd17bea6e168a5bb", "0x17fcc96a8db4a93d6470aab33710e1c9b38fb564679c8849635a53b896ddaa01", "0x278f744a391cfa66ca77f51e8aac097db3f4589a7a7438207fcbe7734ee67a89", "0x9c274d0e18f401ed95a636f9b7e688ea30c8fd32edb8a2b498ed95e6f0d3678", "0x298bf2d5da37d9694cd289309a1a3cfb5977aef139b51f6b5586e6e7969c6676", "0x23b4dbd772dad9320234a772dad888faf4054fac8cbc73f2078dff2825e9f7dc", "0x7e4100c82537ac9286ff99c1eff62318a12c18c63c9f10e59b02531e40b9d4e", "0x194fb153c621bb05efe4a0b8ab9ecbd016865ece06cd81862bf80faba6fbb041", "0x1df7ec45772db3f999295ff6bdd8333535b1b4b96b19ca3fae0237ba3d883a8e", "0x2b0249411af1423381825db72aa8373b35a5687f4d553fff50bad5dee900a989", "0x208bb01a1c668e48ac1c862f3daef64529f2bd36ee2ae50aede8a66d7c8be06d", "0x2a920d7def469f8e332dc14d6554d260fb8bf21775a45e9550c9cffbf1583f4f", "0x9711d36060019a300a8c5ae3d121b0c5350c00adda85e86ce4bf0ce175cb30a", "0x5f9cfb1ea6bf7c0053f7f71df63c007829252cad120c40181eed11520f8ef3a", "0x8d951ab724ffc54a8b9c5cb73e77a4ef38a0aaebad1b66e954b54d50e61026b", "0x2e2c1f50d0f642d878adf4e06190b5d9f44daf16706f494a71168aacc05d0590", "0x2513136cc9d436edca83a981b22b66862cf71e478b09f93d38a2898f80938ae8", "0xb811f4b5506117dce1adff60d3b331d796cc4b2900897db300d641be0ba59bd", "0x2058f15a7df528cc1d8460287e3a0c5cd66116f98bf8d36fae19f595ba683131", "0x2fd9e7a48c6d265a6d76368ae6762f2a3cbac6594ca02481cf295198e65ad723", "0x25e61d1cdb9d0efa3dfb7a705f9a2f1d649e113b072bc835776080dc692da4ff", "0x688733a105f7f2bbf8f1e99f24a881e4f9e1e1a79551cc40d3038e796b23aee", "0x14a5bcaf7f082ae94ba1c357ed865c5e73864a7e2a1a5ad55a6e6f20f1b4f88e", "0x1afa85300fbc30626fec5727e2b13b4522eea1731747644bc408319746646fbd", "0x2b51d05dd1a610997be175ce8d95064e1bdc83b535da2d8ebfcc58f36e8999c", "0x1211e87fd861a4ff60aca71a116f379e6d014ebd50cc4b9de88bd476a28a6cd7", "0x16a28d23e4e16eb5f46935a6a6c078810254eaca76f3adb24788543bffb6dce1", "0x1a9cb5868564b268952c4cff2c1588cbc95f867cfb112d2634b78f6939b1089c", "0x167e0bf6a4329f36deb8c0f66377e8706c2c62686b635ec8e7b965a465d765c7", "0x1d48e9c952fdd47498442beb72ed468cd0bd1aaa797482777fa0b45df9391e29", "0x2be24efdb917338d46cc5776eaa4fd1eec584b3e55c612c754279f2350072ef7", "0x12e7dd26b099490c1682623afbfab964afc23f7b18c77df371b233564c1c75d5", "0xf872fd57889ff7b68b0206ca3080fde59c7d2c71b043b8fef8ea9d4e7fdfaf1", "0x1a305a6ee976d6d5bb781eb230f24fc1e944ab44caead8b97939ead5b206d56e", "0x110248593cb658c9dad10ab6ff442f60c708d63144366926c74ece34926b667d", "0x2911a9443b7c8e59996bbbfeec60928da492646304d750b48e054150f21ae7c7", "0xae050eee5defe765dd9f066e7714f97441b6c7a1da9a169b9ed7cdb0124da8a", "0x1b43e5c7e755e6e22a0bcb8ff95e247bb6ba30d845e27c3c6a65088b7d9f8651", "0xf68c7b436f14e3dead7e8c7de3c0b4af4dc7d36f922766893a2e9559c8610d2", "0xb085935a1ae2fb12dd4aeff87d34da6ea8f1f03cff8cc20ee66e036613a6b08", "0x2b39ad399267003696ecd758fb89cc0a1c49551ff69da652404564d56a3d3481", "0x144b43003888f26443fa2dc2c7354749117b746a05f8e3ef4a4abaf0afb60600", "0xa90bbac85af36a606d100f71b9b1c9f2c705906a83e659ef457c7e952ed0b28", "0xfacd123f0294b69dd2508b485842d1cda5cba41270ad7dfbb9fc97f5bb0547f", "0x4e6285a710a4dd253ba29e1b0f6ccfc1209b236b01367c612e546bc683c293b", "0x1b6948fd0b32c3feb50d66c5ae5685587ac7ffcf1aff3e3601a31201a424db7f", "0x4f662e8e1fc8523907b3e887990ab29087bf2f1e7ba12e4ccbf06b474894d81", "0x2bf8a1279f19a68c96de2f2115fcf8d0828cca0491c10cb1b97ab200a8499fe", "0x65e1427c6c0a7f1c4e20cddea99611b66a4668966b788dd590f6469679c47b3", "0x91660f9429fc5f9985030ea064d3d7aaf2234eee7320c1c730c08a8413869a8", "0x87e9d609a0f6c29d4e57bf4a3e1743f6b698486d689569033a5f987a24347fd", "0x2c5528aca016c80f5aea6e50df4ba106b830de16871528264bcf3bfeb5bffceb", "0x1a94deec61949e75978d9c94826b8bfa8e6f4a20751f5a17374694d5aa93e715", "0x60845a0f779048ec9a712ce5da33a370b785401d838b6d92e1177ff7113265d", "0x1fd4046339acb4631e26777abde4a0de9d2bb27cc226dcf6c03ca1520366c8eb", "0x1943e7070264148ca273df06a7bcd984ba03497dc86cd5480e0c072a1c2bfda9", "0x2cf34e981d2335162e7a8c523110a9ac4042df6181038ebd4080ffb5100e1751", "0x13230369b80fe2e6c83adae77dbb3d8d7b6ac03073afb55b45dc2e9360de216f", "0xe4e4fff31c6a7b4dbe201ce9b4271bf28e1f52ea3e5ceef05dbf29db763e65", "0x1a630eb03a920cf31ed396a0b1f900fb699350244c6b8790c12e0dd9241470fe", "0x1644c6bd2f50746f3d469743b173655b5665ea0eb77070785efce560b681463a", "0x2935c80cbd7a4336883fb448ee6750c75ff4037f996f2040e2bc0bb2066f17ba", "0x2ee3eb795e73b84f1d042b472b98b5f884ce32b5bc36b05787d33831a504fd80", "0x22ca9da95fc7621796cff16d5a7538d711eb230aca1667afb948910b2aa767a8", "0x2d529009c37ddf423d9264df6743990d63604bb168cbdef2bc6a99e886fe8452", "0x2407471f7d9339927a72aac4a02eb1f2b2999a6892f5869a54587f4842100434", "0x66103e919367b340c163e96eadbd09c01b616f075baa12d999c5af10af900e7", "0x28c276632422a69e7dc41ed859375de537917402930e3c3733df4fa8e30df41f", "0x2f088812877deb6674478c892a6277820b4836151bc7bca42f4af5cc1135d160", "0x1340222ea17d6c3ae591db414b6ba52c14881e2595e9be814df595cd038d6628", "0x18514fbb98af7b4ef58db81dd0d1e195a1e3e6d094856f2c457dd19b6c6fa9cc", "0x70d71dc0012610f06b23ffae222632103d468d952e2c274848c3d28f4f66d3f", "0x5358f254bd79cfcb37aea816e287d08f86b324fd9ea61beea1eff33ee3eb374", ]]; let xj = [[ "0x17774e3e8a23ff734ca1598a87bc0412dd8d117f26c62ee7e94dcb29e0357bb1", "0x1982b56c3e0bcdc9c994b0437e4dc0b9527821ca7809068c62de431b5489c670", "0x2872b0c088da975ca497c1a9c18ef0ef3993ddfd09077dade5d72d1ad3abd8fd", "0x2969378a0cfddacbdbcbcc93eb8642d2dc8167a467acef3ecbb15eee40139640", "0x193581cebff836c6d2319b0bfd91255bddcef3eba4383bb93d17ceefd6953d3c", "0x26457780a6d80fcc0f23a463b42645f7fec8e6f0a0008e4410656947089801c1", "0x24e212fee032cb7c7409ae15eaa0aa0311a810586db2f6f180a6b0cab54e0502", "0x260d3e40114b8d2ecb09e3f0e4fcd13eece95b0a7d7b5ce96bac14f5cb32d71b", "0x1b1a5d98ae47d8520d89e8c8fa73dbf28988f9670c62aa77588361bf2193aa0c", "0x19139c8f3a190fa873462ce2dd5f25690f00ec110f4b62996e365f3421a3259b", "0x2143f989b60bcfb4a9887cd610decf67818b14bd709d865aa40c7a52986a5e5a", "0x2d87bf0c00e24b175e5363e0de0a1c9ed68f160c43ca0093e2dca54f07586b65", ]]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); let xi = xi .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xj = xj .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let mut i = vec![]; let mut j = vec![]; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; let (f, p) = bit_00_case::(&f, &q, &y, &x, &mut i, &mut j); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); assert_eq!(i, xi); assert_eq!(j, xj); } #[test] fn test_bit_00_case_2() { let f = ["0x10bbd67a2e6b8bd12ca2a8fc9ebb9d7748bb4b630bb9e8ad6ff87ec4e2647706b3fde59249168a1f3a22e43aa9131c14", "0x10b832788eae08063407690bf13628a4c95b6fc55a9eef6a4e4e1893305748d5ffd9fef14dbbf2265569906a0d24b1bb", "0x19496c56f34ced68a7cd75ca45a97406d2a99dc971e2c9ebd6ec68233a19bba472836ae01acce936e2cf8c477b127acb", "0x925d1d1ef9c0beba6f0a34cac08da0adfb221ad320d929c4a12e88d4c855c6e93e88d2422cc017e588ebe02c9d8944d", "0x63551db5a468540a882a52a9fc100a34798496f25a17711a0f7fe84c2f3b0c22ea84f0e3de8b6df17b043f047eb3d95", "0x1452bf2c3fe715937d83b5c57df5b7b9df88e4cf55e829b75743d3be8818de60a9a1a5156acb9303682c1c8ca5fac965", "0x159fe260119fbb98baf253f4e0f865fe70bcd3a215ac2d2e10d9eea83bb012f8e01a28ebe1e1ab9e46108a3da2287de", "0x2cf0869f40402c8b16429547884c156e8281d85d5a0ee4e6fa097bc9669f5a4c6e33dbebe7a9434b3beb015897656bd", "0xd2c631a38ce47d9e8f0ee1fc2ccd8f589dd387f86500444d3dded1b3595c3ce4312a36a95cdf327419c78b6710a6c8c", "0xcaa4d999eec4b8f23cb8406c8fb3405378036f4c5867363b504394fbc5fc5b04e7a846507e6f24ade84350245ac9e72", "0xdca015d5a2e52becd816f7a434f9cece5b000d281057b64de60f93bdf429d379caaf598e7e990c95a109a8caa63a02b", "0x6995ffd83bb53d7b9787c81663ec0365e65c06194887eb1591ab99d664c7bb9537bd1bd1b9bf5b1707249c394b385b4"]; let q = [("0x152110e866f1a6e8c5348f6e005dbd93de671b7d0fbfa04d6614bcdd27a3cb2a70f0deacb3608ba95226268481a0be7c", "0xbf78a97086750eb166986ed8e428ca1d23ae3bbf8b2ee67451d7dd84445311e8bc8ab558b0bc008199f577195fc39b7", "0x845be51ad0d708657bfb0da8eec64cd7779c50d90b59a3ac6a2045cad0561d654af9a84dd105cea5409d2adf286b561", "0xa298f69fd652551e12219252baacab101768fc6651309450e49c7d3bb52b7547f218d12de64961aa7f059025b8e0cb5"), ("0xbfa363ea499e05a429d9af2a73ba635e0ff3825edddacfab8afc6b9188700c835282a2c4c7effe70dc61c557b8d90e1", "0x5c3fefe5849b36814f32ce71dee6eba467b220e1b53f01421b9ec6d23209f6206e864539ddaa327b085ad8d78a8589b", "0x17b304f1c4f58afee1ecd75f1570b13da2ee02dfc5731f82ac55d5b6d011ce70ae42061b3d205cbe49efdfcd8d2c04b4", "0x101d88f38de6be9d7eb2c074905585f487715b3e6d8179a066ba56988207caa28f7a5f1ba2f7abd01e200ac71d198282")]; let y = ["0x6ce420ceafa50ff15baa710e1633d7893404a18b69ef5316a81b182dadbe66bb0ef4fe49ffa578c7698795e6d4a12cb", "0xf45ba6de68a0f1ab26ba5fac564f3f21a75239243fae800e2a8665fd9699e2795c674834c6ce016370aee9e4a1d38d1"]; let x = ["0x7f2db8fbcf121365e92ce3d77bf5d9a3537b5422e894c09e00053ace96a5403a8db66fbe03950e93033c5874bbe8046", "0xb190c99770f69f3e912d3ef69f63e082a05a1e63b50eb9a5de3e07b14aed7eded07b2f2b3c42c7e365d2a47945fc285"]; let xf = ["0x7f7956e7258b204e6bb76fb6530b54704b338c9e41d551b4c65d12afeff17a68cd917da4aa7f5d7f85dd4c4af5e97a3", "0x61f63de6863a0737ea4c564fb2649c3298b59c310e023469e9f6a61c9d21a413a15b875c3b5ae69e8bc70cc1642be88", "0xd54ccfbe6ce28ca435fb866b16f94ad9149d23b673b8b033c7415a182a906c0c440ec19e65eff130e3bf3e78e64a8d5", "0x5b0b2403b504c7c3c04fa2649405e14816e285681f6d10877632f67dd17dd934dcdc3b3d59039e2f71aab9d24fe1f50", "0x120e02660f9058203246fbf0112482fcc1899b14e6ac805c02a2d7664553675a1cd30ab8eef17c2cd5a8e39666056b16", "0x848bb58f7c097a46b3a03ed0f1e29a3fe03f4e210140c9f40bce68d096dad390d28e98224a2242169998bd45bcfecd", "0xdc72aced2c6f4a5c4819c14494f27de393ef818bbd4517d07dd58a061d1a3e0141a6e2e95f2d0acc60f04b266569319", "0x4a715b7a58dc6543add0fc9ea5a83207f896f6abf8ab0e2333622e9b8f46b0713f2f072d77df88de226de432ab03d2b", "0xc04235cb1fe7822f16be8bc01f84be86960bad82590ceca82fde4beda8b9e6a5885c858c2816abbab513ff9a9c7b5d1", "0xe44406c2cb2d23cae0a6ab38bf6b02312251b650e69f258a269f5787fd2b0bd9ed885f0edb79bdcbaa9dc247ec2effa", "0x86501a5cf1b338e3103b59e485f10c54276bce940584dc74efb1890226e01d82c5dd98529dfd9eaed5f6ee84dbefdc7", "0x10a91f5f4e43b2f252c415e2034cc18aa5ab46c409e63ff37f5499c66dc28fbd4c3207007302b90bf0cd9d620156bc89"]; let xp = [("0x76147fc1a30a666d36b43fa11419b6fa517b642c143cc2ad863426f2c7832c9c9fb62fd3c6f9dc94801523782f9b37b", "0x12f4b28115b81c38e3bbf17cf69059247c386ecccbaed914cbf1417f24431096f49191365acd1aafeffe8c4489a89415", "0x164aaf1243752293eb1376a3448bc1941c8b25df7cfd0bcb708514d7f477439817f367d8ffbf02b95629d336e7da1574", "0xe46ddd6615bd3583b69fe7156087f35ed4b8896375ccd7f52459f56836fa38e0b596d289800df74c3a361e813b24550"), ("0x86fe5ccf8266e2300ca10c33b1c74cfa6cb698664f6c984cc2545f9c89af0520d755ca7ffdbc37d75f20fff15e4518", "0x18c767f073bb43219f813ed472efb42787e62706503974e6c49c10fd5a41e617f592da748faf3e3d7139b54f8accc080", "0x558b3b314565e03cfdec488e39e9c099eebea93016d9e1e3a93bec47068d4dad9910792eb85c8382bc646aede853bff", "0xcd8cc6ed38c417768827084f4d1e22c516dbaf1a90f29c2249210c3476f70251f1923bca1422ba5f9f4f6db107339ec")]; let xi = [["0x11ba967b8fcf46c439d636b9e14c3edd68e62dc6cc493f4e1a7c214779913dd40e5ebc6bfbae882c56c11ff73e7bed8f", "0xcc9f9862097d6f31f2781f916f394a4d9a06009f54f616d9d5c5a517a880391ed02b8f871d1004a5a305453e0c4075b", "0x1a66a98e21ca07db0b1b7d6b7bf65921c7dfce0cc9b25efcdd5e7c1b8e492ffff9dfedb9b32b3affb827c5478907357", "0xc82b7ea20f3578f7eb67a4d7e966e54e595b2ecf91e2a4210f76656817e35952cac71e75199e7fb161f85d569406353", "0x189640b74e901e4042df77f784cc7381c43e27d3da200ce86f47f308a6ea37932bd16fbab80fa131c37d8b429d7598b6", "0x6f14945ff075b3221a66ee8ad672b31c0f85429ab90d7a9c8bf557813fa0efbfe25e5f49f87ffcd4956e178a119492a", "0xf5628335e48c424da2650414f0baf02b9e296d9efebc881f597af374dbe634ddb199eda9ac5ac7c4d76150b6243e95e", "0x1443dc581cbc60dd4197b6f74799d7cebe9cb6bc1932d2f117a6687849f319f20c6c51637f416117f896c0826f70c6a3", "0x5ecc867bb9640bab6c57f5446f435a473568f31dcd5ed8e20f1097f4e3a5c98b9d2fd9170309e54f0d23595241e9ab4", "0xb35142bf853116f48afac573549d09794c7b8d4ca101d4a64fd850cd7a72385486e7c965e9b58910c237a0b61dfb0d1", "0x495f2d46c6fe317c3557f02ad66976d933fcf31aed50fd27207d34b5546dc367a479be3a9dc0d748ee958dbdf4c3dc6", "0x4b87f6f948320dd3accbcc1653d67f9ee8a8495695c52c0463544a7775a58518a607e074453f8663e7b0ad8ea07e21c", "0x65810cc51bcd92db40f079a885a7657d113367ef6b2321380496cb4e94e4c6189b9c80b51107ba437417a83bec3670d", "0x13dddbb670491725aec1646c87db2e3fea286661dd0dc9f62ceba6b063eda63672d8ecc5180785f602438e64bbcd1f17", "0x108542e68466c8e6c016bba69375a0ae187a4e357d15853dfe777e2cad3467f288b83356dd39d2af46db6ad97d56c658", "0xb39e319c9be2be6e28c6d4fa1e3a62a586467af5fa17e602acfa253883982c30bef0ae4bd9af5afa14c357da2dee047", "0x83070c328cf2393b9c0e28a6863343a05d51d75e8a1a489998663833a08663e952bab23b09696d397cbd542f7af429a", "0x78d9252259df0ecdad5e05685c241525043ce26007d819f5c211e8384f6fa9929e8a7f6a7fbe43f15a46544fc8b46ec", "0x9534112d11f8c6657e1eb94a03d1694c7ecfc2d833e8b9b32555d40b8cce7ed08b6cde4c0a8a1a481d509a142dada65", "0x17fb2d3043728a3c9f4f7eb7147eefa2ae79f8ecec711064d1a396f10625c33e2e67085d1f974f1c283e084505347b11", "0x1527d49f0223c4632d2978541c5e7d8d51a7283bd1985381512c5dd8b2103e51c61667251be7e073a48da118fd27232b", "0x181fc8ed425ead408c6162e73014b441098305a952c7b215beb11798b894b948772a699f7560657e0791f7353df0fd5d", "0xd2a54509e10e5665e61510098a424a76631a524e26b5d033d53575a81d77565c865023853d8778c869559a08cadb589", "0x6a3a81c3d7ec179f1becd1274efb578b65b64466ff53b9b9f7f990ce828624ba8fecf97cfd459b2b24c0b02eb315b01", "0x2ccba8aa6af85b297f41cf199aaf4a3f0650cdc229e926e25ff6133b52e12964907bf7c1ab807fa1c1a27077f82fcf4", "0x13f701cb63206a749cc4547b34fc3542d8be923cd0e05a141f5238f8b32ba5f381d59fd53cc11dc73a6988109694725b", "0x104a7d09036552a18da7875dab655b8e25de43d2f2fb359d2c1000ccaeeef04fad656589265f4c04113e798a73c20330", "0x930275466d564f686f7319a6a4727f3d02c510a942f72381b77c9ab13b2adffadee2bcceb4aa896dcebb7b064442c07", "0x23a127089f836b5408e8988a0b92a096caf8d05ee8447312f063af45c922bd8723c158b1562c936e4fb1b53aa43d1e1", "0x8287b7ae5eed694cc39d607c7b7d971612d1bbf700af830baa9494e633b6fb89c2413f8a8ad726c8e283eb3c1be71d2", "0xd3abe3cb1df8ab5cb11d076cd758cb1432c326ddd72aa2a71227a94ed7229680b089254776d3b94a3dce697af042639", "0x160189e110bda3353ae5682c644795d63233a1fa07a574d48ba2836408c15cceb02f98d62856a3d1cf7a6642db52fca8", "0x8ea0f4b667ddae4e4a277bae882943a2111525e96173e9285514b6fdf91ca60123fe4de5f1d49ed1385231a5e71b28b", "0xa791a01fb8b16a02152ebc641bd7a3a6509f18b2581db4aefb73a72fddd79466a905fa8d0e5e7f5ad2c593d095627e", "0x870ad87f645720a0ba982b6466f9a581ed89af7cc0080c7f1d114536877e26b953f26804458cf3fd67cc53be9bae575", "0x3811a0a51b11eeaa5e4de1b43984feb40668a0c62c5530b738dafbdba6c9e815cc4cf952c6207ebfc6b46b2a788c065", "0x4abffc61e058a798cb893b106afd6642a9a5b9c9d190ec6b7e7b7736ae7f55a249a0b111e77724efa62ffa005d60c1b", "0x15001106717bc45a513b6146a10459901cff726c93d0d1e631079bee82eefa9155dbd411db488636973beb7098c9c4b4", "0xab0519a411e6eff310339690c65e26a5fe9b219c8c6945c187f8770c76c54868e294fa116e256a599fad06fe2083152", "0x520c7b90cf5c98118a54b28000fa41595bd4268ae83a9bdb5577168577387d851618625ecc43910bbab4c61a021591", "0xc65eacc9be6245d73eed5b34f8ac954da859308e4b75dbf9c2d3112091ab90f36538189e6273259d778197bb7ce6818", "0x71c5b1b76aba5f951b840c414510b8a36729740fbb935ee17a89d02a9118d4b299f7f704c2814db96c58b5c3e8e4d32", "0xbd28e1ac6c5e1fc4c3c997bfdc3b364690a7fe355062b0cfeb9891f24d1e1098dd536b4174c486ab9acd77c6aff88a4", "0x19adf3b54e4ede32e8529051b0da99c4ab475a13ae3aec8ce601154c65a333d3db61523e885303ec600017b7628ea4cb", "0x1414c8b51b998f78adf2545657e79e04c5e6713c798ba7fbea1b3100eec83d020178ee760d4aa7cfe33d5c9a82591444", "0x5251cc2093d6ace28beccc75ba85b076a4f82043696c3596f25482780c5d16de2d89576fd654eed140266533553b456", "0x44adc21c8b70388f0d70a25d9da68a9b1c99e5db0339827f45d676d966ecd70d51c17e99be1eaebe4256435ec7b2cb3", "0xd2764ffdd4aafbec5111e3502e485297b41c4eb78cd1aca40b15b39ff5f15d0164e59d271a9765179d78100e190c08a", "0xf495343ff43c6582b39c72d7c8451702f9f60ec9e718c09d10a9e93bb138cc69c9674cae87e3dc51c9782830fe3a1c3", "0x813353910401dd8201039268d018a7dcfd8666549fe5f94c51374ef5a37e15c8477d0a60e906c0fb761eae9eb6a3ca1", "0x18a61359e28c306f78bc965891d78d017ddd72a45062b72cf8dce528b0f32dae65e85266779e83ffe2250308e69dd641", "0x14d41d8887c59da2b7cddc906b83183a8d3c745d247eaf6bfc04e806c4696d177ba228233cea1f2adf60e9a125821564", "0x27b4eb6686078e08e0b2c5cea6c4e60bfbbc7839ac73c47ab312a1959c261cf2c2949031a36cfe5624595eb1105eb9f", "0x157440aa6437f627e6177f5e1f009a2cd4f844beedd80029b7b2caf076b31974a103ec4f7bc04326b50da3d2abbd1093", "0xdbfeadd899ed34a01cfd537096e630c70209c4bcfd61188dbe39b7dd19dbe13774820c247de3fec5143e4d23a89d0dd", "0x10431edbc907726e8f1471a35aad7df33f528ed82b927926cca56c54d70c84c511feb40d5f76da3ccc22e3b9a4fc7003", "0x742a7bab4d10cf49e492e363988c6faeb8320a3d46913f3b89907afdb9ce12df2e0674a5e4661193657916509398d3f", "0x49def4922bc54ec02e8412e5265310b6e778071fa1083980ecc1034ccd3dc724ef66584834e9dddc689900aaa044ef3", "0x138f41302d6034a1952188cab929eb75a81d1c8a1adea5099537ed125d6fbf33a330b83096d3145b90919d5e3c992255", "0x6ebb5f7da78c6138fa6834af37751887cdc9cee7518dd38ccc4ee0b5611195a70a401db0e755ba00b56b76f6c9f94a6", "0x126c7803e4974596968a4f04cb60c0ce1b2e259bc760a8e439eb3279905d908a6dd94746750996f969b08d93a2e524d1", "0xa6d898382d6eda6ac3e11fec169f84e17f16397e41b2df42707046ef7fe2ebd592c79977881f70b7bfe829d66d5765b", "0x137218011633b381bd89a97e55763aa251d63568f442799981da6f8735a7dfa1ee0402830ab83afdc84348871ac16e37", "0x2760e0d91fe71d8b4b54e9c65b91e89f5a4ea2a3e3bae93c0bb37ac9b28c8a3390e2a572a56ed9859d027d5500e54ca", "0x14addd1e3595e48b0d69ff071fad7e8decea0154410b54843d8bbece5c0fb194c9ff11e548e3d85022533f0124485c6e", "0xc922489ee0d82dd82e9c9fa32fafb8653984c6847bb45d09429a64bcf8b483c5925582f20b95b4f3386708fb12e1972", "0x124198bd68cdd64d11b74a28e390a36b2b76eefed0a9692cb7f68cfccfd03a91cf4770e6b584334aade210bb1addc2af", "0x12c5e08cba713e18995f1fe5c2941ce6812ba3af7597767d5f9846f4f4484302ca7aeff43ccceff055fbb5045467a5a0", "0x48529961f0804ff9d586c6fce3865111121f620920b5f5c8fe5260d8abad708978027fff404c819fb03d0b1a57fb212", "0x9900bc240091764a11f90800c16626daa8ea09d84ee80ef30eae8f0c2b73a2b0e502a90225fd77e61fe5514c02661bb", "0x21cb6d48e3869a917ea7f7c2c8348bca2f28ee8858ef05dc213b7b3866858eb1d2ff273bd9a7e9094f7395f08cd2494", "0xf310752dd0682895f38102bd06e233884d4c1f9a90fbbd0ebd2ed6970b4009373bc13eeae85e57e4ff71e10d363aebd", "0xb521644578cf2ac7c7427e6bb83a50d771124be587383ca5243a7aa37061cadd7de09dbfdc0e4b3e0733fb33927f485", "0x378f671119170c553acd6df72c0aec702f32dd9c90fd959bada99fc7650e9e121d1a933c2089e03112b40be116ebe3d", "0x1054ee4ca3b1d8523e0e4d82bc512f8e057e843968d57185220906c270ff8dc90a9e903f928967422ff4775a65934653", "0x3c7dacef5d95a76e46ce2f737eea2116d95ac0afa8cedca27dbe830464e9fe9cdc82be6709bafe101a4cfea5286dba5", "0x1534470261aa9852854998dfa667ff1d2fcccb490e54d4b41be562e7a9bc3f5f5772a676d94523b83ce39b61d635a25c", "0x8dec854c0b36dbd59a59a4b391e5bbf8d7dd6a66c21362acf590035182f517da887406fe26bf7bea657269ea5e33c1d", "0xad646d6e77d25c4825dd9bf177d4d4b5b2efd71c31e5977ce2156daafde511c63b6830d944b87697dc19bb9cc0b4bfc", "0x20c0214d819311198ddf2f073f3ec68bc3762fe0299707152bd06a9daadddb87f4c0b5edbc90da730abf7bb2407cef8", "0x1569c15b058a27e1957b7302e1ee92036f14d15f5389f63a875e5e2b5d53f7c48defe9eb7dedd9939e905f7f3dc950a4"]]; let xj = [["0x7f7956e7258b204e6bb76fb6530b54704b338c9e41d551b4c65d12afeff17a68cd917da4aa7f5d7f85dd4c4af5e97a3", "0x61f63de6863a0737ea4c564fb2649c3298b59c310e023469e9f6a61c9d21a413a15b875c3b5ae69e8bc70cc1642be88", "0xd54ccfbe6ce28ca435fb866b16f94ad9149d23b673b8b033c7415a182a906c0c440ec19e65eff130e3bf3e78e64a8d5", "0x5b0b2403b504c7c3c04fa2649405e14816e285681f6d10877632f67dd17dd934dcdc3b3d59039e2f71aab9d24fe1f50", "0x120e02660f9058203246fbf0112482fcc1899b14e6ac805c02a2d7664553675a1cd30ab8eef17c2cd5a8e39666056b16", "0x848bb58f7c097a46b3a03ed0f1e29a3fe03f4e210140c9f40bce68d096dad390d28e98224a2242169998bd45bcfecd", "0xdc72aced2c6f4a5c4819c14494f27de393ef818bbd4517d07dd58a061d1a3e0141a6e2e95f2d0acc60f04b266569319", "0x4a715b7a58dc6543add0fc9ea5a83207f896f6abf8ab0e2333622e9b8f46b0713f2f072d77df88de226de432ab03d2b", "0xc04235cb1fe7822f16be8bc01f84be86960bad82590ceca82fde4beda8b9e6a5885c858c2816abbab513ff9a9c7b5d1", "0xe44406c2cb2d23cae0a6ab38bf6b02312251b650e69f258a269f5787fd2b0bd9ed885f0edb79bdcbaa9dc247ec2effa", "0x86501a5cf1b338e3103b59e485f10c54276bce940584dc74efb1890226e01d82c5dd98529dfd9eaed5f6ee84dbefdc7", "0x10a91f5f4e43b2f252c415e2034cc18aa5ab46c409e63ff37f5499c66dc28fbd4c3207007302b90bf0cd9d620156bc89"]]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); let xi = xi .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xj = xj .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let mut i = vec![]; let mut j = vec![]; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; let (f, p) = bit_00_case::( &f, &q, &y, &x, &mut i, &mut j, ); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); assert_eq!(i, xi); assert_eq!(j, xj); } #[test] fn test_bit_1_init_case_1() { let f = ["0x521ad898cee9071ebcbf44d874b1a6540a5a24a4fd9c68f45778308171f9267fab695191d4eab620cf33a8eded7fd2c", "0x146aa46acc68a7fa2d014f4cdce6921f2f664ffafcd262db0a43e29fba239f8e7cc55a67075e7e25f7928438cd506976", "0x110012a0987f151e6eacf408ccd24b9c3e637b240a4100a3ccdc16d44e3cbdf8393eb3557a64d089a1a115a3eab1a695", "0xa3dc13d77e6eac496424ab994c230664bbb51c4abe8135d998621a4259c788d6959e539d97a534c119cdb9a394de9ad", "0x6d44964cce393f36664dfb78c36a4b56c817816904d06056f68e9017165ef8db1a4f97532d5c3bbed4da9a68948c926", "0x1191d32d29708748f35f4fbea90258a97e7b47db6986cbc73c24ba35ad601bfadab752fd1a3e438ce0686b7777654a0c", "0x18776284b17c0858f647e075e04c49ded673151413b8ce9b65bf572081d748820d57d62d54e14ea09aad1c01c5c5faac", "0x199c96383503947d119bd6be94efdb3595eead7072f8c3d67173449f6658fadb43d715c9dc54d7f547cc1525e9a566ab", "0xa97b4be53ee479681acc5ebfc4fae663d5040baacca25a862aae0152d3543705d87df48c8266658d2a03e597cfec8fc", "0x6c86339c39859d2fac14a4550fff32535a91b9b0ff23bc04475027273d9579f491b35686ba10369195fd003747b05cf", "0xe608702099837e04fc2e999cbb4b845ab04d0a51ea25ee04675bf96847cb9d629da62d1e4354c04ab5208100a0129af", "0x737a8f64f0c81b65cf9ef035b357d0017406b0c84de6a32ed1fff164d3d9531f1d9ec53b11735a58f1d611050ed258a"]; let q = [("0x24aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8", "0x13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e", "0xce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801", "0x606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be"), ("0x82dc9154807866eb0f36ccb665a5fc010510bd690ddd7b540e5bf3ff02d81e98b75703a3b3d3c305a70960906e6cb09", "0xdd18d077ad5bd58dabb18d84a6ceebe6375a83dd242851bb4dcf956002c4efb974ffceee6709deb0dcf81d4285e5e60", "0x4a468eb9e206b9833d8e8e2197d3446652372ce5ef50e93c91aa58105d3a281b2e84ddb61535fe1a90bae7e6692f9b0", "0x198fd0ab6249082bf7007d7e8be8992de81f47ae3341c590194fa3bf769a2e5a5253527727115c334e82ed4be8da6c10")]; let y = ["0x6ce420ceafa50ff15baa710e1633d7893404a18b69ef5316a81b182dadbe66bb0ef4fe49ffa578c7698795e6d4a12cb", "0xf45ba6de68a0f1ab26ba5fac564f3f21a75239243fae800e2a8665fd9699e2795c674834c6ce016370aee9e4a1d38d1"]; let x = ["0x7f2db8fbcf121365e92ce3d77bf5d9a3537b5422e894c09e00053ace96a5403a8db66fbe03950e93033c5874bbe8046", "0xb190c99770f69f3e912d3ef69f63e082a05a1e63b50eb9a5de3e07b14aed7eded07b2f2b3c42c7e365d2a47945fc285"]; let c = ["0x521ad898cee9071ebcbf44d874b1a6540a5a24a4fd9c68f45778308171f9267fab695191d4eab620cf33a8eded7fd2c", "0x146aa46acc68a7fa2d014f4cdce6921f2f664ffafcd262db0a43e29fba239f8e7cc55a67075e7e25f7928438cd506976", "0x110012a0987f151e6eacf408ccd24b9c3e637b240a4100a3ccdc16d44e3cbdf8393eb3557a64d089a1a115a3eab1a695", "0xa3dc13d77e6eac496424ab994c230664bbb51c4abe8135d998621a4259c788d6959e539d97a534c119cdb9a394de9ad", "0x6d44964cce393f36664dfb78c36a4b56c817816904d06056f68e9017165ef8db1a4f97532d5c3bbed4da9a68948c926", "0x1191d32d29708748f35f4fbea90258a97e7b47db6986cbc73c24ba35ad601bfadab752fd1a3e438ce0686b7777654a0c", "0x18776284b17c0858f647e075e04c49ded673151413b8ce9b65bf572081d748820d57d62d54e14ea09aad1c01c5c5faac", "0x199c96383503947d119bd6be94efdb3595eead7072f8c3d67173449f6658fadb43d715c9dc54d7f547cc1525e9a566ab", "0xa97b4be53ee479681acc5ebfc4fae663d5040baacca25a862aae0152d3543705d87df48c8266658d2a03e597cfec8fc", "0x6c86339c39859d2fac14a4550fff32535a91b9b0ff23bc04475027273d9579f491b35686ba10369195fd003747b05cf", "0xe608702099837e04fc2e999cbb4b845ab04d0a51ea25ee04675bf96847cb9d629da62d1e4354c04ab5208100a0129af", "0x737a8f64f0c81b65cf9ef035b357d0017406b0c84de6a32ed1fff164d3d9531f1d9ec53b11735a58f1d611050ed258a"]; let xf = ["0x6dcf1ec2bee9d55fd7c7dd01f0d89e52ce00053fb4cd271af8ac67e915aa56c1f18943cf63d7acf09f9e238c86f7575", "0x7f05f480f32402899fc238d5e397600577a07eddd78a63793400f32912e689ef50ff7298c542fcbddc8a2f30326ff28", "0x71d870e4553f214175e57f71397705b5336a8c404e29abab7505079976315ae30aea8c7fc8e47f2ce78aed551c79270", "0x37df42454ed3974bb2b32f97123a17956e452893cabef6a29a0888f8ce8b899253e37ae32f0ae88611fa10260d597c0", "0xba703f387adf415b877fd75815f8322190dde62bdc8a55e54b5dec1284a8c9177b3c945a72f0e1e9c109d242988e116", "0x14068f72159c932c910dd5126f8907d9616c496a0f51dbcc5585ddebaf32dc4e03ae577f1f07d02f85fc8a875e197521", "0x17dfc12834ee7334831b24af1174df6680c4991d4d20cc807c5e8df6083d142e2fd17ccfce6bb359366acbb7781372b9", "0x17d3b0da632dabdf4ba0f6c890308dd36ed98b5e1d50a8160a2349e79dd3de20eea74d8b95daa3bc8b9ac34a59ff12f0", "0x17ddaa28e29c2317b96c21b7fd31f8f2bab3cabf17b82c770ed0c77db94e0738119993eb4c5d01ef3358bf5ad26286cc", "0x22b2500baf6ce28a86979f31387bb67348f155192cf97f99aeb257fdcdc23c15eb5315ea817f28532b8d5198e199dd", "0x6524f53a10bd1ed1f7de6acc2d4414912600bfec37d116a4d096e4e54120fe17325dec0b0e382b90ef6654c3bd2e20c", "0xebb85352772f284d12c95bf531a0f1fc69bf6acd1695e9af23d641db780ebb70c7fbfbe8a680e766390ddaa62af47cd"]; let xp = [("0x122915c824a0857e2ee414a3dccb23ae691ae54329781315a0c75df1c04d6d7a50a030fc866f09d516020ef82324afae", "0x9380275bbc8e5dcea7dc4dd7e0550ff2ac480905396eda55062650f8d251c96eb480673937cc6d9d6a44aaa56ca66dc", "0xb21da7955969e61010c7a1abc1a6f0136961d1e3b20b1a7326ac738fef5c721479dfd948b52fdf2455e44813ecfd892", "0x8f239ba329b3967fe48d718a36cfe5f62a7e42e0bf1c1ed714150a166bfbd6bcf6b3b58b975b9edea56d53f23a0e849"), ("0x893227b499dab30e15b606ec3c375f9fabf7fbb574b9b11c9eefbe33fae82066297e23c518f59e74d5cf646cec6464f", "0x10578234a81819d1ebb3d77b03a128f3165642386fff1b0a74ad73c139425703a991ce459cdc1995351adff98061f0ea", "0x16efa85752a02d4358a92eb3b577c1e27a02ec36000c44403159baf7022541a02104b633549e05b774e1b76343a8e661", "0xaf65df48a519d9209257e3df9fb0a1bd3491799091df954380242592db0bead0ddd62dbe33aeeaf1d4a63bdbc4c6008")]; let xi = [["0xe8899bf2d1f2f54c552427835589cd2828d33eb1fef81e5382af6e33a32d19e7436939b3a0aca3000826ee5f29f7a41", "0x163cc7d50f58e7fd58c4467784a7f6848c725dbed14ffa37ceb2664733594beecc9e8e74e15b88e3df1df249b1ee10e7", "0x5456b23a25e181f03ecaf790566ee2ae3f9a7c9aace97c5f51b1822a9d2e8b0ceb672afdc6811f64c2a47bf3b14a670", "0x148cc9dcaebdde0fa4b641ce52ac847504136c550836467c59fdc151741f4e8e8bb6dac0275c34709e7f843f60afe9dc", "0xef2dcf1a1af1d85290833bdc8d333eae4a2416662a7f8d1f171df42ba46755601670b356942900157a4a691278e838a", "0x76ec0b906fec3e2548ddafd05cbe92834d9f67602526598cf63790c56effc25547b035723461181b30bb7f402c48ad5", "0x1893ea72d489bb198282ce86062a8f7d79862b680b0dc9a96d0e0c06024a12ae4269cff7afad6d3c5475405e2884021", "0x380676d535bcc75c2ff6b216b5bc81b5725b2aff21e124d93fd6315a2248700c21be8f775d2bf696c927decf4af8b7f", "0x1ee362659422cdf7cb061e82acac95cc7cb4cf73f02e0c49bc166bbc125ee67ee92e8111ee26b7a8624e906fdba11be", "0x16cc42e3d79053697cf26dfaa74a55c8546d3a08ecefd2b6c0c7ffc2eaf861068d95bba66b1eb9b4daca7ac05c61305d", "0xa9cf5030f0c62f73281fad2c97854ff91e3e22ad09abdb334743ed5de591bba3496cdf30a3357f360fad1f2d109b7ff", "0x1343b69e1140100f3dc3aedcdbfcc4363709747a511a3d8b576f2a210c59a8378ee1acf6ad57126d9da7e4f2099902dc", "0x463f6de4e5ef5d7b704ab2fb2eaf6ba225d334c2080f688657bf8eba8cfdd7d090b35bd45a8d09f1fd5e3ef3a8ce079", "0x114fb86f02da46f189d2db73a0c8a258472caa22d95d35ff3ea1f72cc98d310000e5e3451cef06cbc702937b1ef2fa9c", "0x123daf0320a5fe89b20346dc0f6f518d5ae7cad91197b2d9838bbc04ed0c6681dfb816e4cb8f5f763e05be29aabfa3b4", "0x4ebdb59fa847ba75e7fba78eca31af430c4ce13b8b845d6f1cb144eb550379e57b248c2cf134622a17a72daec5a175d", "0x12bc3e0a8465166f229da4dea0b0698e143efd397b0421810c07ba2caa14590a92641f141e42823cd0d4be8161d8a0cf", "0xc841c20248b8989103512b3c9b44da503c1aa5e941109fd849821197ba666bca1daddba36e8f615fdf46b8f74148576", "0xef637fc86371e1f3f24608bc1ab79884f9ead6afb9102b802ab14471b2298f46c5ce6718c8fb1861e7f0ca584df38e8", "0x8a18906704d81bbe407f0003945c43f7f0827f9dfb606caa563c62390ced3f07a091ee47c69d5c38505445ab5404686", "0xb41a7c5f385e5e11370c7febebccc6c906f7dd9351bc99f3c47b45f89c740383b21ccda4e78a74e1f02df5685fec579", "0x18152c8ebc343acf58014d9f9b8f3f44379b2ef18c288b1a2413e416d3e4e97f18c9eea2a988bafe4b405e9b1e6a1068", "0xd9bec30500bf612262f752ac2c2981be010f17e60f210b21978f498af139b2601f81df384f7891155dc524028a9c85a", "0x3677bf0ef760a7e32576dd0376c00d6c2619cc2a4ed7246a57d7c2f5bdab6ea17d8cc25736f9435d795542853f87851", "0x1a8e6daeeec4175a6a74f5e40f57ca05149fcbdbbc9d4dcba25bff52377e27bdeaa64591b6b4d05b6ec5a6aaad93bb5", "0xb1d85cbda8e37689d68ac73b63a2c4c62582bead16d0572003865fe6a85e8e49f37374ae25acf5584962cc0e85f502d", "0xc85c01b9b42b297feb1a34cc0aefb3739f44df44f6409865738862a7b741741e29841860c40e51d4f154ec443783197", "0xbb3b12dc3cfc717a4612174b132d1c2e06b1ff648cd27d00e2e15247de13695aa784234aa6ad5f62976e220f2802f7c", "0x4a4c14b30188c9e4b26e5362872eb13784c6c7effa2a3de7bb05c6c2c3277d2426a62a490d49d2930e8c6787507b4fe", "0xfd9b096dc81d49c0f30145d2d462c986462656d2fea44782020eae45c9ecfed514d15a91907c933f2cff180d01230f7", "0x1050d223a7ae09664142e67d8bcf631d8e8270c7cf379f55da84fb35756ec93aac7062850e88a2d80a9f8c6eabcde61a", "0x10d6c35de0dbf0832bfac6901fc2f4cebfe769d251c1d018f15709279f7378f5611951d66f04935523f8d3e6bbcfc40a", "0x17502e841d1c751f97992599ab672fd7b4406353102a50e13849da6a584f2defc35cb436546b6ad48a39fdad2448a82e", "0xaaf33baa4db7f6edb87dd9cd7311bd39069a840fa8d8dd49e58df12f3714d71eb7c83e43fa5423d80d01c7fb35712d9", "0x5d0f763804e8e4e17c6e29ff93ceb128a5c6e46c3a6688ed3285727b387018fa11003d39c8d5356b83f5a050f2ba23f", "0x210f7ce0277ee88f4bdfb77a38d8333eaf3ee9aa8d846351042248be09dcbea0fe06622a82d2a52e2f15942cecf7868", "0x7009a78d046a4223d6918822cbc00c0523696f78e85d7883cacccc3eb781350c85fcf0f278738b86441a6806e2556d4", "0x6c2041bd2df5687640ef195e8677a03c150050f4bbe304da55ea4c4a1036aeafb73cff23a63f3fe06d9480947e55a52", "0x4d9c72a03be12a88b76831d01a353ee068c09f96fdaec74eb60a38c08bd5ad8c393119a1b3227b4ac72455594358da1", "0x13f228eb5b3f295c64e9ddf2250879b623441c0db2f2617b3b85df938f2427a7190d721d87254067019582785dd6964f", "0x23d5b1edc9d5bf13fd5dde686530cae59ad34f32962a43efc58eb582cf3f69d9360706533a5a3043913f97b1f01bc4d", "0x15fba452e8ffcd78d21f4ded67b9c9eac394df22928fd62ea7d3375de41fa486f272a3e7c9dbfe15d4344718257ee00d", "0x119e8db942cd3373ead2539dc6c19d97c28ace94de92e80a71e49ca831646f45cce63f39ab8dbc4063e136195ba9df9e", "0x54872800533a260494090d1f316a5b6aae9fa22843ba6b76ce5f7db72189c29195731167868ce96342dcb9a1d676c67", "0x190ec7594c543f6a6279c47fb997f36649b16583c9493ec0e80fbe17d6b32b6f6a025a31625357d868db93889fa9bc83", "0x1076cb0dfadbeeba2605e596436f69349532cd836fc10b9997fb9a5f1f5b73eee3b055b5cebaa2435c9ff0f8146d07b4", "0x74d333f32f240ba7aafdb1572a94d228ade7d6bb45b67654606f8d98c05b2b091cfc71957338186d26c9bdbfb03d775", "0x10d9f3c7dacc7ef8b7b60f7474d5329b95c597c4083e626a618690793228b1f358623c4c5772ecd80b3c9ac273608279", "0x8dbb8728b6da5f245cd61eb18a4a34d1382b0a44c1ed8c88c3f620b14fe9211f61d69c5cc9529da708a50e3a97aa176", "0xc12777fe64bffb84d4d0c6c409519da77a081bfb05bce0c326aad71c243b134577ef7921fd3927bf956ac0d7704f7ea", "0xcb09aa163755c68a0e912444b03f8c2c26284f784b191ceecc23922c1c6b67a2e0b86d26c8d31f2bca44df1a40628e5", "0x32281704643a5a864ec2140874d8a97299d4a552d31df0f92c3e07c745b074f42c3ffe54e7d95c0b0ce5552e684a43a", "0x15f0a4d8bae8b018138c36b4021e8b66465477f4bbbad73cd44ce790b461f3cb3b3030a39599a4db7f147ba2c75a4ec3", "0xa505444671788b4d171af1972edb140da8569c5beab9becbb9ede13407cb096491558679fc1746bd66e36b53e7c5340"]]; let xj = [["0x6dcf1ec2bee9d55fd7c7dd01f0d89e52ce00053fb4cd271af8ac67e915aa56c1f18943cf63d7acf09f9e238c86f7575", "0x7f05f480f32402899fc238d5e397600577a07eddd78a63793400f32912e689ef50ff7298c542fcbddc8a2f30326ff28", "0x71d870e4553f214175e57f71397705b5336a8c404e29abab7505079976315ae30aea8c7fc8e47f2ce78aed551c79270", "0x37df42454ed3974bb2b32f97123a17956e452893cabef6a29a0888f8ce8b899253e37ae32f0ae88611fa10260d597c0", "0xba703f387adf415b877fd75815f8322190dde62bdc8a55e54b5dec1284a8c9177b3c945a72f0e1e9c109d242988e116", "0x14068f72159c932c910dd5126f8907d9616c496a0f51dbcc5585ddebaf32dc4e03ae577f1f07d02f85fc8a875e197521", "0x17dfc12834ee7334831b24af1174df6680c4991d4d20cc807c5e8df6083d142e2fd17ccfce6bb359366acbb7781372b9", "0x17d3b0da632dabdf4ba0f6c890308dd36ed98b5e1d50a8160a2349e79dd3de20eea74d8b95daa3bc8b9ac34a59ff12f0", "0x17ddaa28e29c2317b96c21b7fd31f8f2bab3cabf17b82c770ed0c77db94e0738119993eb4c5d01ef3358bf5ad26286cc", "0x22b2500baf6ce28a86979f31387bb67348f155192cf97f99aeb257fdcdc23c15eb5315ea817f28532b8d5198e199dd", "0x6524f53a10bd1ed1f7de6acc2d4414912600bfec37d116a4d096e4e54120fe17325dec0b0e382b90ef6654c3bd2e20c", "0xebb85352772f284d12c95bf531a0f1fc69bf6acd1695e9af23d641db780ebb70c7fbfbe8a680e766390ddaa62af47cd"]]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let c = Polynomial::new( c.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); let xi = xi .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xj = xj .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let mut i = vec![]; let mut j = vec![]; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; let (f, p) = bit_1_init_case::( &f, &q, &y, &x, &c, &mut i, &mut j, ); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); assert_eq!(i, xi); assert_eq!(j, xj); } #[test] fn test_bit_1_case_1() { let f = [ "0x6e2d5c667e253ffe1d604e9b0c0efb376aaa3e1f2fa8194a9fdd627525394de", "0x2dc3c5e55face7c5e2c971b204e63954fbc8ad239d2d152e532c421b7834a99d", "0x2ff47505930441520ea2801041714bcb5d41a0ffa81940aec94ea9901fcac97d", "0xdab9fd3d1ef5226f76a2af1d6b410d8639501aa55867c1f0779e0422d545f0c", "0x2fea029bdb6a10f53ffd60992916c6410e0f53520845bfd3e55f70e8272c8fb3", "0x2f329aa1c588e3e4b7d8f5bedbe3c09728563ff0c46ce45b66636cb6ba1ee436", "0x2290e74d07afff26a405ca3722d951cb9a512f1c100fa50e29907ad3283e7b83", "0x6bd6eba6eb034c98be6fdabbb6f2986a20934fe7f4ccb1aa1cff1983d7d2ae4", "0x1ca0c85d7f94b5c6b3543992e315765cb35d0f7d49149a6939c1e7afec80ee3c", "0x1f70622e79ccbeb35ecce1f7718bba441de2df4f3e916ca84262a68f9eea11f9", "0x2492333e1554b6d2c1ad39913d06e14c6ad3a1569e62952be0e54c3427ea8aab", "0x2a9baf66b1ec17ae1f6f435746d944886953830b40efced523794fd2aa17d4a", ]; let q = [ ( "0x27dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9", "0x203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad79", "0x4bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e", "0x195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de152", ), ( "0x19092b3d714b3bb6599b735386dd05eab401e72057bab79773a6de8f5693387b", "0x1acb3fbdde3ce471791558747f0e52b1b7a708834dc533393bcfc2af317703ee", "0x258d7966e4b36382460549a44d5cbe96fbe1c412e36f25218438f72d7d387077", "0x2a58bf6a639ae104439ba4e8db873938a26fcd5bd0b68beb20c44705d9820860", ), ]; let s = [ ( "0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed", "0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2", "0x1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d", "0x275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec", ), ( "0x1314aaf1c372e6d7635e573808d9d5c7178bdce7335eb0538f718d8e6651eeb1", "0x14c25d3aec745e5a2d4aba9e1448a8cc1048d01a5289f29ccc5acf5e81526673", "0x302adae1297f41f9fdd327cfa91c5688fc16dce6579ff99d6699ed49b4d2445e", "0x1800a20cf49101a007f783b70334fbdecf9be4f63017754e9afc5721ead62211", ), ]; let y = [ "0x1ab9de59fc825e8b5326694c7d82556785cb9cbfd0d0a11721d1972c21c411f8", "0x16a475582082ae3616c808acd62684170d9fa7bf234110353e9cbceca19d2c69", ]; let x = [ "0x27783160c70b7ac760cff888c621846a7ed80e50c7ea8a7a718a4ad8a50886fb", "0x10a6d46618419682152a25b5f819b22c2e572d1f670d12026a18c384248dad2f", ]; let c = [ "0x14156ca1853095df27f3cb7c50eca75e794d2f14195c16df4a0f8f9dcb48bee9", "0xdc2a20a6107d4c49fed6b2018946bcc2a8dad06f01d099a6df0a4a55ed21b59", "0x14260c5afb0b1148ed80f8339cf9e06ff04257cb6c1817c4efa721fc98f69503", "0xafe8a09df07bf3dffefe512eb9448ef436dd090f98323135baab8ae3c766c60", "0x114692950f53d4f707bb02cc2b5dc98aff5936811707d6579371dae20368253c", "0x2dd3fca72591963149646f1e106dc0ee917551f5a9da397fe12d4a3939ce650c", "0x1750bd450b85cbd62ea3f1b228beff5fd364a127d6054be99a9248497b82062a", "0x1248cfad33a2147726169d3ce55db12ecafd74bc4b83377c168d89b919386546", "0x28d156bac04e64938816b055888399c99a954b82724e5f5589d549a709b2b5ef", "0x39e1ab153bd709556afece475580f453f9126f256fbb49c235bc75082f5f26e", "0x14853f940bf5c557c7f558d3e74e6617d7f08b54fd83597fed1d7e7b9d09e04", "0xaa480d613601947fee14a3ce2b7af4e1872fe49ae3473546aa01a618b78b125", ]; let xf = [ "0x9cc2ac2feb91b788f180b7f837ff5880af2d8a7b2cbc2078ddbfaa7de025ab5", "0x2b4691bfa6539beb28208698d947d559a85b25c7a591428b92ebd2a21abec753", "0x27b1bda2ff2bbe089cd77810447ab3747db696a3f6ef1e002aa95b3c440d8421", "0xfc2973e1356ebf52ddb6a5f96f0380df66dfe01de4cd7d7910730b235b46414", "0x96dc0c72aa87605c1be1f3b6812a70f1d4dbdefd725e7a84302d8aa32e80fcf", "0xea15f5754762638499ad8458f796af631ece5e5aa4b56d786db49e831390ace", "0x103abf47dccc2f4d223ede9edcf039bf49c1ec61174d95d075fd3727469afe66", "0x26e4a5a33276fc3166bb1e1310597230fbd36c03a6cf05749310487c359ed5e3", "0x65373ec7b46d26577bdfb0a69f8df530bdd64ae3b63b728ddcc7c24ba04ea22", "0x51b781e90fe55d3767d00d134cad0d2879f07054f31198ee15d57679a07cceb", "0x880237565c157f17a67f4f4d74fd3acd28c325e1d25747ef4e9d6c1a688457c", "0x1c718116af5b9bfe4b9a0f502db2b1916a717feb5c1a016cca2b0b70d3882c4", ]; let xp = [ ( "0x6064e784db10e9051e52826e192715e8d7e478cb09a5e0012defa0694fbc7f5", "0x1014772f57bb9742735191cd5dcfe4ebbc04156b6878a0a7c9824f32ffb66e85", "0x58e1d5681b5b9e0074b0f9c8d2c68a069b920d74521e79765036d57666c5597", "0x21e2335f3354bb7922ffcc2f38d3323dd9453ac49b55441452aeaca147711b2", ), ( "0xbddb1ea5c182ba12d0762b9c85ebd180541e0b153ca85ff24489f09cb0d44a7", "0x2170b47e91296dad38a19f370fa3368b1f333b8f05e5018b7a38af0a045be237", "0x760488b80e6b5dd63b4b7422f5609df112bf8a63604449ae3020c63ad8e2489", "0x1c937b1f996ef4397c744c8b2503cf644feb5b6d8b7f77237a7b8a2bcb98583a", ), ]; let xi = [[ "0xa79ee9efbaa87e84974d0064a9b0a54517dd0e329163c9af0ca337787769c76", "0x2e6655c0294cbfc67c5eafdd31ccb9a5bfd1bd6f6d00d86b27ee6f0f45132db9", "0x223aa77e00ac43da1cb9698a9bcd76dd0d4dc9e9f3361c19fbdfc575f825dfcd", "0xba550ec81fdab48e83ae063002c0a4363f06d42bc9fb8cd9c54bb9a738583fd", "0xc46766575f8ded7a90993cd70cc42210d77233b92ac51af1b37d71fdc9f03a5", "0x1d93b6b19feee096b780bf18a2084117c9fc934df72b39b9856368f6d621b7e0", "0xf790c1fea05178b7f9de1aabfb394cfafdc45716ffdb752bedf419215896403", "0x2e7f87004e656e2f0a90f87cc58103f6dbc75f156feb6e940594809f32468890", "0x1b7de56671644ff780c45f087d0b1b8f2c9603c7748e99bf81ac39475092049e", "0x1d4f78206e251a9dcef0c173c33a2860153e783ab6fdfca8734f90b9695e7825", "0x271eefd32b948443ea242ffa8d1f3c281c64272c21580c03d60b46b9cefd3903", "0x26d01c1ee109d33051f2f49f318c80672f843c74b859e1bb3249b20dc11f559d", "0x45f8774c96e9d51f4d665cffa0f9ac1b8cb75fa4ef193ed5e67609288bb62c8", "0x191b686c256a3b826b6f99ff6dfb1f7cb22f02515655b308d60bc4563459264c", "0x170eba3d98078d3d7cdadabf7e2eb4e24aed94351ef9de5ca685e544cc958cc9", "0x99c99ebce93adddeba403ffecc8c37691bf52cddce48fb2092b99baa9c37fc1", "0xa794d503fc1a9aaa6ed5c70d1452971e44ce9e14c4e33d728ca3aa71a139bac", "0xda34cb75f019e7077721004cef3c0ed836d7a62ac54f203f01a7ea5caeba2c9", "0x15284512bc0074e4ae175a7a86cca36b516e4ee6230ebcd426435f215cd7e1ba", "0xa4370b540cdf6a3ba34992e9b9c4c715119fe0f3307eff2a746493af08ff459", "0x14536aa2d190a0ceae4599fce6f4e99835d08b23d98e5217c654d41d8035cdca", "0x383c83dc474b9cb3d2f2b2bf0cbfc2713bd31e45cf8d30e4989451d3c929897", "0x23d8e6b10a662363f1b4711ed89c7f057c63679d41f3aa7e215cce1c65afeb3e", "0xcaaaa24187a70d233875111d0cdb09351153eada98914d9de99eee6a5ab5193", "0x182fcae609a86cdc19e81d291fae341048bedef4988ce4b3290e7997f9f71a80", "0x1f9a679a7a9aa2f6bbc8b2b7ca097db3784e7014d77a6e4b495ed3a6f2a4f727", "0x297aab9149267a69d02e8a75a50eae577160b740b19c2eae326fe2e8411a2818", "0x1b7b271c51f6252ad920dd621b69da3c60606c5ce9d8029ccbc807548c882cea", "0xb55add16f95fca8c970b0ae91796ce3fca1f40869b7ce250b5893f118080586", "0x29b43ab30d36fb285b38dd37771d6d998397e2f6a89ae62246af45d79e14becc", "0x23d92b8079583f2a528fcabe2d23eaaaad7e52a42d5e8b6eee647dc1d4d6e274", "0x138492ccab0224206a5c568fb3e7e73859e9f8f5e72da7654418a584284f5960", "0x2af93e8c93e9bd75f1cd46b9906b58634677b179a97288f27ef07b1b5fc9d8dd", "0x20fc268e39b33c7617497bdc3e7bd939a45e832ed413bb408b7d79230ce4f60b", "0xb9dc0788d376ac77f442031ac7bde522955a9eef3395343a6d3edce03b4a829", "0x15e9ec57703b3c37f621b98b75e94b0885b27936d94b8ae29f78c9f1adc0ed1e", "0xce8e0c66aeabaf7877a971e4043ac96f34f540c7b5aa6e074fe17407c48b071", "0x24567171e46bb99f25f932f8924da00f057613de43e23523768a838f3e06a3f1", "0xf4465460c7ff15d8a5adb5af8645cba61d4b9fcbe36a81476207fcc031e40a5", "0x1b8eea0e13a9845eadf38c4778cdb5a43d81cb0747a31d1b8d940ea59b149951", "0x13577c9318b6a3919ab6701bab529507e4b5300312ef2d6f1f958a42be9c2eb", "0x2d03f66a7b412e0bd1630dd126a66b046e6bbd16ea1ae05fb3ac8c34c176cc95", "0x2b8d2b6aad77b369fd5d502a8b00b8b6247fcacf16b1ae354c57901d6b3eb934", "0x8b452b0ab3e4d897e1fec5b90f0450ef9036e4966049120832a980ea5a83d29", "0x6af107effff47a9e2609ca233e81e6bde4bcaaca497a816c0645d039241c7d0", "0x26ac80e013f793ef90929288be4f84d3be8f3ba373e8fdc2897ec1d500fa86f0", "0x29c9bcac9752160d466ece56a3066fd4ddfde6dac1d7dd2ffc43e264bbe46fdf", "0x22181cddd7f75ec3e11f54f23e4a4488d762d3e0d06911a076cc0ffa57a57094", "0x1dbb2fde8644a40b897c3b8c87426d37c2ac98507eb2c2321d53c07c1120eae", "0x2be613f72c50ce45878c294c553e1d9b3929f33466f99cfca6b61dd0b38714f7", "0x2673bef40c708e61da5540d99a69ea7a04777ca491b53359bc19d7131cb0a73", "0x185efbfcab081123f13ac188e539580aa7ba31fcb1fd1464ecc52c4c597534bd", "0xa98fb59b21fd4a2619712941a0a1ef57964e02ec3892e46422442c6cdc0766f", "0x965417e5cc262886ba34dfc81b0dbce0ad7ec0f1703ae45608792577b69793f", "0x9fffdbf32bec4ef94ba958e1b1ec8b5da5701ffe9c9e039794fda3d60b97296", "0x1788f44b56ed3ededf77708e0a2e1e5523368c5731c1366fab9d6dba253525d0", "0x2d62c0f8a2c995ccce46c16747f8c800ce5d8f00cfb013448883f0f2c37d076c", "0x2487fc89973ad2a53dc502d6826c03bd8a129d37efbd987c0c8c2d224dbb0fe0", ]]; let xj = [[ "0x9cc2ac2feb91b788f180b7f837ff5880af2d8a7b2cbc2078ddbfaa7de025ab5", "0x2b4691bfa6539beb28208698d947d559a85b25c7a591428b92ebd2a21abec753", "0x27b1bda2ff2bbe089cd77810447ab3747db696a3f6ef1e002aa95b3c440d8421", "0xfc2973e1356ebf52ddb6a5f96f0380df66dfe01de4cd7d7910730b235b46414", "0x96dc0c72aa87605c1be1f3b6812a70f1d4dbdefd725e7a84302d8aa32e80fcf", "0xea15f5754762638499ad8458f796af631ece5e5aa4b56d786db49e831390ace", "0x103abf47dccc2f4d223ede9edcf039bf49c1ec61174d95d075fd3727469afe66", "0x26e4a5a33276fc3166bb1e1310597230fbd36c03a6cf05749310487c359ed5e3", "0x65373ec7b46d26577bdfb0a69f8df530bdd64ae3b63b728ddcc7c24ba04ea22", "0x51b781e90fe55d3767d00d134cad0d2879f07054f31198ee15d57679a07cceb", "0x880237565c157f17a67f4f4d74fd3acd28c325e1d25747ef4e9d6c1a688457c", "0x1c718116af5b9bfe4b9a0f502db2b1916a717feb5c1a016cca2b0b70d3882c4", ]]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let s = s .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let c = Polynomial::new( c.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); let xi = xi .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xj = xj .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let mut i = vec![]; let mut j = vec![]; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree2ExtensionField; let (f, p) = bit_1_case::( &f, &q, &s, &y, &x, &c, &mut i, &mut j, ); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); assert_eq!(i, xi); assert_eq!(j, xj); } #[test] fn test_bit_1_case_2() { let f = ["0x1727a4684524eb2175d31f506b07370100418d3fcd5ad5c5586b3c2927dbffdd38a1a44b46f601ab362202e8276c007d", "0x57d77a9e8e6cd838edc1e63052a64d020d10ab12ab460dd755dec64232750ca866647b373738bbe4943b6aee387caa1", "0x42e0115d1c759474549023340d4f01ea67f2f082b59dec03aa7e22e27bccb5d4840ac815f2c12da594e423a2108737d", "0x54735182a914667a25226c91d61ee1f8c5c6c2e40b633da27379618cb58b0b55c0acff39fe7471a196e8bd9a0db6863", "0x14276d83ecbbeddabdf9bf5d9449deaf0a40d6de94e8347d983e97ed4491a3cda57fabebeb6d788023db42ceefa73d8b", "0xda9195159528161fa4960f25523d4d906c194a134c2695ba34577b4dcbbb76911a90cbb411db147cc5627ef50c9210d", "0x9552828c7dcc07d56efc554f98880b746c6ce0f7f41377d934699dcb5cf7eab408dbe027df4506c40e2424b24c6b69b", "0x122dcaa1ba9a8a8613064735071ae0aeab8e0333d7ff3018c9d51a652303decdf4907f6e7f232224b4fe0b20245f2fd4", "0x112f00e12354b1ad57581a4dde94de861275afae359c3016f8a13e81943a4a18f4896097697c449335ca5f9d21b7f654", "0x13bbf456483cd4566ed59718bd067589e294b4d7084073073fc77a685f0e4ae94092405afc2ecc6d437c20102b74f4ae", "0xeef615cd28929e56a59bf2e2e93db68f2ed629f9872a3b1aefdccb098674950b928bb5c920a2dc4d6405a69dafd98b8", "0xebec00852daa59ee4861f6c55f01d098689453651a335e711a11c3e6606acd9cd851f8132fb24bfa3edf65997e82785"]; let q = [("0x19e384121b7d70927c49e6d044fd8517c36bc6ed2813a8956dd64f049869e8a77f7e46930240e6984abe26fa6a89658f", "0x3f4b4e761936d90fd5f55f99087138a07a69755ad4a46e4dd1c2cfe6d11371e1cc033111a0595e3bba98d0f538db451", "0x17a31a4fccfb5f768a2157517c77a4f8aaf0dee8f260d96e02e1175a8754d09600923beae02a019afc327b65a2fdbbfc", "0x88bb5832f4a4a452edda646ebaa2853a54205d56329960b44b2450070734724a74daaa401879bad142132316e9b3401"), ("0x1604bd06ba18d6d65bdd88e22c26eaef8a620a1a9fefe016d00eac356f9ceda8bc8eee5e46f9f4736ab22cff0e8cb9e8", "0x3e5755e9bfc250ff0a03efea22428a36a247504e613980918dc5319efb7f66b10d5fe2e7e86af7e014e1456aeaeac5f", "0x5655a99f7ff904c1e41382c25ff0360d9c51d0e331bfb1e38f5dd41c6909caaf6e313f47f727922109bf8c3204fe274", "0x62ec2ed9b207f63e0d9899ed11f9a125b472586b65bb77b8a04d5d446d15a8701ba5c361a07cd85e0743f5ae2e95a9f")]; let s = [("0x24aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8", "0x13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e", "0xce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801", "0x606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be"), ("0x82dc9154807866eb0f36ccb665a5fc010510bd690ddd7b540e5bf3ff02d81e98b75703a3b3d3c305a70960906e6cb09", "0xdd18d077ad5bd58dabb18d84a6ceebe6375a83dd242851bb4dcf956002c4efb974ffceee6709deb0dcf81d4285e5e60", "0x4a468eb9e206b9833d8e8e2197d3446652372ce5ef50e93c91aa58105d3a281b2e84ddb61535fe1a90bae7e6692f9b0", "0x198fd0ab6249082bf7007d7e8be8992de81f47ae3341c590194fa3bf769a2e5a5253527727115c334e82ed4be8da6c10")]; let y = ["0x6ce420ceafa50ff15baa710e1633d7893404a18b69ef5316a81b182dadbe66bb0ef4fe49ffa578c7698795e6d4a12cb", "0xf45ba6de68a0f1ab26ba5fac564f3f21a75239243fae800e2a8665fd9699e2795c674834c6ce016370aee9e4a1d38d1"]; let x = ["0x7f2db8fbcf121365e92ce3d77bf5d9a3537b5422e894c09e00053ace96a5403a8db66fbe03950e93033c5874bbe8046", "0xb190c99770f69f3e912d3ef69f63e082a05a1e63b50eb9a5de3e07b14aed7eded07b2f2b3c42c7e365d2a47945fc285"]; let c = ["0x521ad898cee9071ebcbf44d874b1a6540a5a24a4fd9c68f45778308171f9267fab695191d4eab620cf33a8eded7fd2c", "0x146aa46acc68a7fa2d014f4cdce6921f2f664ffafcd262db0a43e29fba239f8e7cc55a67075e7e25f7928438cd506976", "0x110012a0987f151e6eacf408ccd24b9c3e637b240a4100a3ccdc16d44e3cbdf8393eb3557a64d089a1a115a3eab1a695", "0xa3dc13d77e6eac496424ab994c230664bbb51c4abe8135d998621a4259c788d6959e539d97a534c119cdb9a394de9ad", "0x6d44964cce393f36664dfb78c36a4b56c817816904d06056f68e9017165ef8db1a4f97532d5c3bbed4da9a68948c926", "0x1191d32d29708748f35f4fbea90258a97e7b47db6986cbc73c24ba35ad601bfadab752fd1a3e438ce0686b7777654a0c", "0x18776284b17c0858f647e075e04c49ded673151413b8ce9b65bf572081d748820d57d62d54e14ea09aad1c01c5c5faac", "0x199c96383503947d119bd6be94efdb3595eead7072f8c3d67173449f6658fadb43d715c9dc54d7f547cc1525e9a566ab", "0xa97b4be53ee479681acc5ebfc4fae663d5040baacca25a862aae0152d3543705d87df48c8266658d2a03e597cfec8fc", "0x6c86339c39859d2fac14a4550fff32535a91b9b0ff23bc04475027273d9579f491b35686ba10369195fd003747b05cf", "0xe608702099837e04fc2e999cbb4b845ab04d0a51ea25ee04675bf96847cb9d629da62d1e4354c04ab5208100a0129af", "0x737a8f64f0c81b65cf9ef035b357d0017406b0c84de6a32ed1fff164d3d9531f1d9ec53b11735a58f1d611050ed258a"]; let xf = ["0x10bbd67a2e6b8bd12ca2a8fc9ebb9d7748bb4b630bb9e8ad6ff87ec4e2647706b3fde59249168a1f3a22e43aa9131c14", "0x10b832788eae08063407690bf13628a4c95b6fc55a9eef6a4e4e1893305748d5ffd9fef14dbbf2265569906a0d24b1bb", "0x19496c56f34ced68a7cd75ca45a97406d2a99dc971e2c9ebd6ec68233a19bba472836ae01acce936e2cf8c477b127acb", "0x925d1d1ef9c0beba6f0a34cac08da0adfb221ad320d929c4a12e88d4c855c6e93e88d2422cc017e588ebe02c9d8944d", "0x63551db5a468540a882a52a9fc100a34798496f25a17711a0f7fe84c2f3b0c22ea84f0e3de8b6df17b043f047eb3d95", "0x1452bf2c3fe715937d83b5c57df5b7b9df88e4cf55e829b75743d3be8818de60a9a1a5156acb9303682c1c8ca5fac965", "0x159fe260119fbb98baf253f4e0f865fe70bcd3a215ac2d2e10d9eea83bb012f8e01a28ebe1e1ab9e46108a3da2287de", "0x2cf0869f40402c8b16429547884c156e8281d85d5a0ee4e6fa097bc9669f5a4c6e33dbebe7a9434b3beb015897656bd", "0xd2c631a38ce47d9e8f0ee1fc2ccd8f589dd387f86500444d3dded1b3595c3ce4312a36a95cdf327419c78b6710a6c8c", "0xcaa4d999eec4b8f23cb8406c8fb3405378036f4c5867363b504394fbc5fc5b04e7a846507e6f24ade84350245ac9e72", "0xdca015d5a2e52becd816f7a434f9cece5b000d281057b64de60f93bdf429d379caaf598e7e990c95a109a8caa63a02b", "0x6995ffd83bb53d7b9787c81663ec0365e65c06194887eb1591ab99d664c7bb9537bd1bd1b9bf5b1707249c394b385b4"]; let xp = [("0x152110e866f1a6e8c5348f6e005dbd93de671b7d0fbfa04d6614bcdd27a3cb2a70f0deacb3608ba95226268481a0be7c", "0xbf78a97086750eb166986ed8e428ca1d23ae3bbf8b2ee67451d7dd84445311e8bc8ab558b0bc008199f577195fc39b7", "0x845be51ad0d708657bfb0da8eec64cd7779c50d90b59a3ac6a2045cad0561d654af9a84dd105cea5409d2adf286b561", "0xa298f69fd652551e12219252baacab101768fc6651309450e49c7d3bb52b7547f218d12de64961aa7f059025b8e0cb5"), ("0xbfa363ea499e05a429d9af2a73ba635e0ff3825edddacfab8afc6b9188700c835282a2c4c7effe70dc61c557b8d90e1", "0x5c3fefe5849b36814f32ce71dee6eba467b220e1b53f01421b9ec6d23209f6206e864539ddaa327b085ad8d78a8589b", "0x17b304f1c4f58afee1ecd75f1570b13da2ee02dfc5731f82ac55d5b6d011ce70ae42061b3d205cbe49efdfcd8d2c04b4", "0x101d88f38de6be9d7eb2c074905585f487715b3e6d8179a066ba56988207caa28f7a5f1ba2f7abd01e200ac71d198282")]; let xi = [["0xfa0a76861031f74c3397565d1db68d2963758855de5ff1cffb69bf13a0ea4371279ac1efa65710c7f4a97919a78ff59", "0x510accb9026da5f06a82195a8b978613fda96cf96aed978cca28a204a199cedc7d167de9ed320732d244e33e99e023", "0x15c6dd3afd26f1e0be2ddbb1b37dbc396c0d3cf212cf9f913d234eff2e573adf0c3801e3e2b0000295bed5df8256241d", "0xe4b5650a1764134020a30d8b7db861be3d99eabc16f3be0c3ccd04aedd3396d12f676011cc534280d11de2c32174054", "0x92b6ac1f5ee0d203bb67f480484b3bc8e1ae220dd231a7e8551aa0f1870337992bbe9468d227d075a169fac1df2c8cd", "0xa2f8871f36609c163c8f4fdc40e2a9e929064409ecf1f5f97663ddab6050fe1d57588d8b03f2a4fbec819cecb39deb3", "0x174392a02f5845ab761133e81929786093fd6dde47f00acabcabaa7df89d108873e342125536e31efb1bdddd7093573f", "0x19b7370d6e64482d5a63c2e296b9d58c27367b340d071f0b83753b977eec6d95847ab64f51e8b2b2b86a21700fc1036a", "0x16aafd26dece43d80d70cdcb43e12f92b10667ba3c079f4714bb254dc4a87dea3329e95692ebb10341473208df09ace0", "0x100e7e1d58af9be477931364d058b55599df02466821b9b708aa273e764a0a70bc05a73457f377972563f1bcb81f11d5", "0x170d56bd6ad6c4de225b80b20ccedbdb8e8df8a04779caa0e1556af352cc3ecd056532fae73625550ca6b183fcf0a096", "0xece7f85c875c8e55edec040d13de2bdaa6d2857da5d6a015778afa6331abd58894791f3c3518c9f45ba74c620b46d41", "0x1607bb82f6dd503070001a627a4af4c14804ba89eebaf68263f9bd809f9e0c8a864dc9830ae4cdf08fcc98ca8b40946b", "0xc5768744b07f71ca9929c2eb4d1c6e7ef588be129d03e364b9a6de5363e625c35120c6457e55c9869ac77c4e68ec86", "0xaf6c9e178fb5b59b567c04cdd4aa040aab8de72fe49c1446bf5199cd13161196a9b6d91fc8ae08fe1bf7d3298713131", "0x124afd78e247a139b8cb3bb39508823c22f7e82b5c7efebe5dbb5362fd9518cc0f978862a5a6b9fa8b69845e104c6d02", "0x5d6e665e77ca1f94e0e0d1167ab09c74e1968c6c237e04da4e30581076651295154a4a5e87f457561b6d5018e45ce0", "0x10f8bc2e981e2fb9c2d3523c3133480686050d777200627b7b4618d52460a7c5e77052ebe7840f526ec51d5936e353e4", "0x10fd3968a035eb5802605b0a1a74fad870dc523e869a8a387f0c54254a837be577e145bb93f66ea2c68eda44071f2cfe", "0xf5f7384635978f87c75314add179a7da2ac4f123d1ddb75c53595c04078a212534b0a21504085f4df62156608d80212", "0x8341b253d9c0094bf3d43fdb03c965eda9e5aa299cf380e3dcf9029d38e858d3a7295bff01cb5715e8e33baa9b6977f", "0x165960db1dfc8f1762170585bd7070d53f454c1f6a9ca49e3d45d8496a5ead89adbebd3c0aa9ea01394b672c4aa894ea", "0x131c0b3cd87830c0b91ea8df14129a2cddff268498079d99e38d2be315ac4fdbcff0f825e13ba9e4a9432d4b60167f2b", "0x2f9b19cd56d9d4ca715391183b5f6e03d281b33be0c460dfabb5e0dd022bc55693304f1cc256b54eb812efd68a36d37", "0x14c0070279d9be555722b667e01e5f500d8eadbba9f5e7cdb91d46924827f5268656e8866e285c2fb4c1e51bb61a0177", "0xcb3a116c5f6723d33a71594caa68ec1c8b6c5f5dfe1b9f0a41d9a60242cdb2df01904a42c125d77f7bdb03b900abe5b", "0x18d59a51db9f1248df991f56a7d48b8e6ea57f000d4c84b0d72a74ee646c2d8925e6196f2a77660e4a77608bddc25f9", "0x19af59a0c7b6682c578e96b27ca0f1b9e253245d818e0c1edecddd98bc6f97d027b28f31dd23c32125316145dca9de58", "0x153c39704769fc40669f0a815152cb1551adbd773c24127acfeda50a2c9c12771b77af68528b524ef497a42076d31c87", "0xe2d3b3118f05cb799343c422605fb005e2e739eceaf0cfd73b770bc5d5deb4edfcac88256e8acfa2647a337312e6e65", "0x1a0100e060db5cdfcd5066fe802535e18f96907085a2952bf7a6e0dc14be04f669df6608c60262347bfa0f198a5ce318", "0xce0cebc0ca92c4c756a3d5b1d1ec42da974ff6e0e2d0c7171c3aaea7ffa0757c0fedb1761d9c4d8d9b289069dd41250", "0x160d326dedc18b7005ca481307404f7f274d900494d7e3fe5b15bec1cb78f3e4a79b19745e6323506dd9f231ae866779", "0x1af4ed07df74414ca87f776e4dd643c8bd7349cbc1e6c2de84a20743369bbb016a5993f0e66568235d44f58d9cbc38b", "0x8d0a11ab066bfc13b257f2b9b860457a3b944f78951b2f7cf3887e22bf75516749ccc5d4f91c14ffefb1cbd92409b1d", "0x23d98a00873b026887cf7eb45508774de78d2412c09f564e43093f04699ad31d05bc73d28126b35f23596da726b644", "0x14207774abb793f1d52aa7c8ac936076506a86a651134cb8ba65d95740b2f8a3ae1afe5ebe0e886326111ce837d6effc", "0xb33f8a80d98e787229da96e781febf5660519e6b448c2239665b43ca641e9c68bee7f63a1807b15d7d271945312c3c1", "0x1428ec16f781182ad72b3bf06f6218cd798f16b662c2393581b47b697b8af05a28c5da63394c737343ecb50c9d27438b", "0x17532398aac71a6c4741eee86041daa073963428b809a020bb2b83b43242f0ed2c169504a1f3007389361a1d5d78774e", "0x44224d63e381d69226405fdbafedfdd5da9456f6c4e155f82570869b69aba03a38400086f0eb8432f2d1d216b69bdd1", "0x21e0297c72148c86aa36a059f19b04c75c95e8c7344026cea29241eff3bece2d7e44645183d2b081bc846ba0cf97e16", "0x503b980fe1358a7f87af5c7eb65b389a0188da60c45be6a540bacb5b66075c991276fa6383d987e5f94ee897417a0f5", "0xc9035d2db00a9ae5f26b4adc44f00d813bb51f8726987918aa26d0eafab97c243e43cf15ab4fcb3ec97b8fca39ddb07", "0x1688460ce66c019b531545c1dab18ade5626fe61eac71df48814c0f5921d48deaab89097cb728efb319b71d29cfc8cbe", "0xb74bc33f01fbf84ebb3d80025cc8b60a2c00cb34b70ffa2903f38c7648c3c5173cae4df4d36646947688488dc6423fd", "0xb0fdff8ae056ea274693d443ed2b2abec5cbd272f090cba71b45adeda28670bb64b26968c1dea90077a422656379b4c", "0x1da52b1ef7183381d3f1557bf9cb515b38124b3f3247400248735e18ebae90b0dfe82b3ab03e48b9f61d5bdfa0885ee", "0x1062e0ee97214d084babe14f0717c2e37f30332e837499400ac3afe77017dff007f0b72ed14a05c96e435a3ef2764d11", "0x16d97325a47795dd4153640facfdf98323eebd53fe8cb69190d6fea3a2790f8ad0e608966bfeb4baf4c415a5f62d654", "0x70e8df7511e1f3476b3fe23002d2c68e9a436310c1e0d4cc099aa5909358e6bb1bbf8e1e10c2917053795568c5c3f67", "0x2e7db1c975008709135824f015babb80e570cdadd85ef1314f376d102036ce3774efc376c0cfdc73201659d99037ba9", "0x1341d5d6806f9bb5bb82898a095128304b1715d59315e7733d82f7fe91c7906d87b76d4fd03825e24eea1ea2e60ce145", "0xdcec9030cb633c339a6db2ed9639197e426e4768c74ece2ac97d78a778ebd7955f47161e041812a516257489e1a357f"]]; let xj = [["0x10bbd67a2e6b8bd12ca2a8fc9ebb9d7748bb4b630bb9e8ad6ff87ec4e2647706b3fde59249168a1f3a22e43aa9131c14", "0x10b832788eae08063407690bf13628a4c95b6fc55a9eef6a4e4e1893305748d5ffd9fef14dbbf2265569906a0d24b1bb", "0x19496c56f34ced68a7cd75ca45a97406d2a99dc971e2c9ebd6ec68233a19bba472836ae01acce936e2cf8c477b127acb", "0x925d1d1ef9c0beba6f0a34cac08da0adfb221ad320d929c4a12e88d4c855c6e93e88d2422cc017e588ebe02c9d8944d", "0x63551db5a468540a882a52a9fc100a34798496f25a17711a0f7fe84c2f3b0c22ea84f0e3de8b6df17b043f047eb3d95", "0x1452bf2c3fe715937d83b5c57df5b7b9df88e4cf55e829b75743d3be8818de60a9a1a5156acb9303682c1c8ca5fac965", "0x159fe260119fbb98baf253f4e0f865fe70bcd3a215ac2d2e10d9eea83bb012f8e01a28ebe1e1ab9e46108a3da2287de", "0x2cf0869f40402c8b16429547884c156e8281d85d5a0ee4e6fa097bc9669f5a4c6e33dbebe7a9434b3beb015897656bd", "0xd2c631a38ce47d9e8f0ee1fc2ccd8f589dd387f86500444d3dded1b3595c3ce4312a36a95cdf327419c78b6710a6c8c", "0xcaa4d999eec4b8f23cb8406c8fb3405378036f4c5867363b504394fbc5fc5b04e7a846507e6f24ade84350245ac9e72", "0xdca015d5a2e52becd816f7a434f9cece5b000d281057b64de60f93bdf429d379caaf598e7e990c95a109a8caa63a02b", "0x6995ffd83bb53d7b9787c81663ec0365e65c06194887eb1591ab99d664c7bb9537bd1bd1b9bf5b1707249c394b385b4"]]; let f = Polynomial::new( f.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let q = q .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let s = s .into_iter() .map(|(x1, y1, x2, y2)| { G2Point::new( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) .unwrap() }) .collect::>(); let y = y .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let x = x .into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(); let c = Polynomial::new( c.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xf = Polynomial::new( xf.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ); let xp = xp .into_iter() .map(|(x1, y1, x2, y2)| { ( [ FieldElement::::from_hex(x1).unwrap(), FieldElement::::from_hex(y1).unwrap(), ], [ FieldElement::::from_hex(x2).unwrap(), FieldElement::::from_hex(y2).unwrap(), ], ) }) .collect::>(); let xi = xi .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let xj = xj .into_iter() .map(|v| { Polynomial::new( v.into_iter() .map(|v| FieldElement::::from_hex(v).unwrap()) .collect::>(), ) }) .collect::>(); let mut i = vec![]; let mut j = vec![]; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree2ExtensionField; let (f, p) = bit_1_case::( &f, &q, &s, &y, &x, &c, &mut i, &mut j, ); let p = p .into_iter() .map(|g| (from_e2(g.x), from_e2(g.y))) .collect::>(); assert_eq!(f, xf); assert_eq!(p, xp); assert_eq!(i, xi); assert_eq!(j, xj); } } ================================================ FILE: tools/garaga_rs/src/poseidon_transcript.rs ================================================ use crate::definitions::{FieldElement, Stark252PrimeField}; use crate::io::{biguint_split, element_from_u128, field_element_to_u384_limbs}; use lambdaworks_crypto::hash::poseidon::{starknet::PoseidonCairoStark252, Poseidon}; use lambdaworks_math::{field::traits::IsPrimeField, traits::ByteConversion}; use num_bigint::BigUint; const BASE_96_FELT252: FieldElement = FieldElement::from_hex_unchecked("0x1000000000000000000000000"); pub struct CairoPoseidonTranscript { pub init_hash: FieldElement, pub state: [FieldElement; 3], } fn biguint_split_1_128(x: &BigUint) -> [FieldElement; 1] { let limbs = biguint_split::<1, 128>(x); [element_from_u128(limbs[0])] } fn biguint_split_2_128(x: &BigUint) -> [FieldElement; 2] { let limbs = biguint_split::<2, 128>(x); [element_from_u128(limbs[0]), element_from_u128(limbs[1])] } impl CairoPoseidonTranscript { pub fn new(init_hash: FieldElement) -> Self { let mut state = [FieldElement::zero(), FieldElement::zero(), init_hash]; PoseidonCairoStark252::hades_permutation(&mut state); Self { init_hash, state } } pub fn continuable_hash(&self) -> FieldElement { self.state[0] } pub fn rlc_coeff(&mut self) -> FieldElement { self.state[1] } pub fn update_sponge_state( &mut self, x: FieldElement, y: FieldElement, ) { self.state[0] += x; self.state[1] += y; PoseidonCairoStark252::hades_permutation(&mut self.state); } fn hash_u384_limbs(&mut self, limbs: [u128; 4]) { // Private function. // Should be called from hash_emulated_field_element to guarantee the limbs fits in u96 let elems: [FieldElement; 4] = [ element_from_u128(limbs[0]), element_from_u128(limbs[1]), element_from_u128(limbs[2]), element_from_u128(limbs[3]), ]; self.state[0] += elems[0] + BASE_96_FELT252 * elems[1]; self.state[1] += elems[2] + BASE_96_FELT252 * elems[3]; PoseidonCairoStark252::hades_permutation(&mut self.state) } pub fn hash_emulated_field_element(&mut self, element: &FieldElement) where F: IsPrimeField, FieldElement: ByteConversion, { let limbs = field_element_to_u384_limbs(element); self.hash_u384_limbs(limbs); } pub fn hash_emulated_field_elements( &mut self, xs: &[FieldElement], sparsity: Option<&[bool]>, three_limbs_only: bool, ) where F: IsPrimeField, FieldElement: ByteConversion, { let mut xs_filtered: Vec> = vec![]; if let Some(sparsity) = sparsity { assert_eq!(xs.len(), sparsity.len()); for i in 0..xs.len() { if sparsity[i] { xs_filtered.push(xs[i].clone()); } } } else { xs_filtered = xs.to_vec(); } if three_limbs_only { let (n_quadruples, rest) = (xs_filtered.len() / 4, xs_filtered.len() % 4); for i in 0..n_quadruples { self.hash_quadruple_u288(&xs_filtered[i * 4..(i + 1) * 4]); } for i in 0..rest { self.hash_emulated_field_element(&xs_filtered[n_quadruples * 4 + i]); } } else { for x in xs_filtered { self.hash_emulated_field_element(&x); } } } pub fn hash_quadruple_u288(&mut self, xs: &[FieldElement]) where F: IsPrimeField, FieldElement: ByteConversion, { assert_eq!( xs.len(), 4, "hash_quadruple_u288 requires exactly 4 elements" ); // Split each element into 3 limbs of 96 bits and convert to FieldElements let mut elems: Vec<[FieldElement; 3]> = Vec::with_capacity(4); for x in xs { let x_bytes = x.to_bytes_be(); let x_biguint = BigUint::from_bytes_be(&x_bytes); let x_limbs = biguint_split::<3, 96>(&x_biguint); elems.push([ element_from_u128::(x_limbs[0]), element_from_u128::(x_limbs[1]), element_from_u128::(x_limbs[2]), ]); } // First permutation: s0 + x[0][0] + BASE*x[0][1], s1 + x[0][2] + BASE*x[1][0], s2 self.state[0] += elems[0][0] + BASE_96_FELT252 * elems[0][1]; self.state[1] += elems[0][2] + BASE_96_FELT252 * elems[1][0]; PoseidonCairoStark252::hades_permutation(&mut self.state); // Second permutation: s0 + x[1][1] + BASE*x[1][2], s1 + x[2][0] + BASE*x[2][1], s2 self.state[0] += elems[1][1] + BASE_96_FELT252 * elems[1][2]; self.state[1] += elems[2][0] + BASE_96_FELT252 * elems[2][1]; PoseidonCairoStark252::hades_permutation(&mut self.state); // Third permutation: s0 + x[2][2] + BASE*x[3][0], s1 + x[3][1] + BASE*x[3][2], s2 self.state[0] += elems[2][2] + BASE_96_FELT252 * elems[3][0]; self.state[1] += elems[3][1] + BASE_96_FELT252 * elems[3][2]; PoseidonCairoStark252::hades_permutation(&mut self.state); } pub fn hash_u128(&mut self, x: &BigUint) -> FieldElement { let elems = biguint_split_1_128(x); self.state[0] += elems[0]; PoseidonCairoStark252::hades_permutation(&mut self.state); self.state[0] } pub fn hash_u256(&mut self, x: &BigUint) -> FieldElement { let elems = biguint_split_2_128(x); self.state[0] += elems[0]; self.state[1] += elems[1]; PoseidonCairoStark252::hades_permutation(&mut self.state); self.state[0] } pub fn hash_u128_multi(&mut self, xs: &[BigUint]) -> FieldElement { for x in xs { self.hash_u128(x); } self.state[0] } pub fn hash_u256_multi(&mut self, xs: &[BigUint]) -> FieldElement { for x in xs { self.hash_u256(x); } self.state[0] } // fn hash_biguint( // &mut self, // x: &BigUint, // ) -> ( // FieldElement, // FieldElement, // ) { // let elems = biguint_split_4_96(x); // self.state[0] += elems[0] + BASE_96_FELT252 * elems[1]; // self.state[1] += elems[2] + BASE_96_FELT252 * elems[3]; // PoseidonCairoStark252::hades_permutation(&mut self.state); // (self.state[0], self.state[1]) // } // // TODO unused, should remove? // pub fn hash_biguint_limbs_multi(&mut self, xs: &[BigUint], sparsity: Option<&[bool]>) { // if let Some(sparsity) = sparsity { // assert_eq!(xs.len(), sparsity.len()); // for i in 0..xs.len() { // if sparsity[i] { // self.hash_biguint(&xs[i]); // } // } // } else { // for x in xs { // self.hash_biguint(x); // } // } // } } #[cfg(test)] mod tests { use super::CairoPoseidonTranscript; use crate::definitions::FieldElement; use num_bigint::BigUint; #[test] fn test_hash_u256() { let values = vec![ "11104976625974322414992515260237855724255768622271447502939221706321239646163926750529079402619769361141474851372384", "3967829709048026487667605767879663147330695847448860299062651717898165991149219471605164102628080243401554871141161", "20542379293379792421624641272746453190479316725484729966518436208854994615297484525229284199372356175508316843532962", "17650899844399818850216658397857397433150932740144581357248968616099085471799047373874018729030516138169880851496140", "23153291335322918391032655582853912472568833796263669034103198103796686482485894027826714525281391374850320336394313", "32367456268301553665798368340615053510284603246272143427825701218738172825017097170094900631328955480180538273877253", ]; let values = values .iter() .map(|s| BigUint::parse_bytes(s.as_bytes(), 10).unwrap()) .collect::>(); let mut transcript = CairoPoseidonTranscript::new(FieldElement::one()); for value in values { transcript.hash_u256(&(value % (BigUint::from(1usize) << 256))); } let expected_res: lambdaworks_math::field::element::FieldElement> = transcript.continuable_hash(); assert_eq!( expected_res, FieldElement::from_hex( "2a4b9382c92e77909659d0406c152da22c176cc4d7109e3fc32aff80da50bf9" ) .unwrap() ); } } ================================================ FILE: tools/garaga_rs/src/python_bindings/drand_calldata.rs ================================================ use super::*; #[pyfunction] pub fn drand_calldata_builder(py: Python, py_list1: &Bound<'_, PyList>) -> PyResult> { let values1 = py_list1 .into_iter() .map(|x| x.extract()) .collect::, _>>()?; let result = crate::calldata::drand_calldata::drand_calldata_builder(&values1) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } #[pyfunction] pub fn drand_tlock_encrypt_calldata_builder( py: Python, py_list1: &Bound<'_, PyList>, ) -> PyResult> { let values1 = py_list1 .into_iter() .map(|x| x.extract()) .collect::, _>>()?; let result = crate::calldata::drand_tlock_calldata::drand_tlock_encrypt_calldata_builder(&values1) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } ================================================ FILE: tools/garaga_rs/src/python_bindings/ecip.rs ================================================ use super::*; use crate::ecip; #[pyfunction] pub fn zk_ecip_hint( py: Python, flattened_g1_points_list: &Bound<'_, PyList>, scalars_list: &Bound<'_, PyList>, curve_id: usize, ) -> PyResult> { let list_values = flattened_g1_points_list .into_iter() .map(|x| x.extract()) .collect::, _>>()?; let list_scalars = scalars_list .into_iter() .map(|x| x.extract()) .collect::, _>>()?; let v = ecip::core::zk_ecip_hint(list_values, list_scalars, curve_id) .map_err(PyErr::new::)?; let inner_lists: Vec<_> = v .into_iter() .map(|x| PyList::new(py, x)) .collect::>()?; let py_list = PyList::new(py, inner_lists)?; Ok(py_list.into()) } ================================================ FILE: tools/garaga_rs/src/python_bindings/extf_mul.rs ================================================ use crate::algebra::extf_mul; use crate::algebra::polynomial::Polynomial; use crate::definitions::{CurveID, CurveParamsProvider}; use crate::io::field_elements_from_big_uints; use super::*; #[pyfunction] pub fn nondeterministic_extension_field_mul_divmod( py: Python, curve_id: usize, ext_degree: usize, py_list: &Bound<'_, PyList>, ) -> PyResult> { let list_coeffs = py_list .into_iter() .map(|x| x.extract()) .collect::>, _>>()?; let curve_id = CurveID::try_from(curve_id).unwrap(); match curve_id { CurveID::BN254 => { handle_extension_field_mul_divmod::(py, ext_degree, list_coeffs) } CurveID::BLS12_381 => { handle_extension_field_mul_divmod::(py, ext_degree, list_coeffs) } _ => panic!("Curve ID {} not supported", curve_id as usize), } } fn handle_extension_field_mul_divmod( py: Python, ext_degree: usize, list_coeffs: Vec>, ) -> PyResult> where F: IsPrimeField + CurveParamsProvider, FieldElement: ByteConversion, { let mut ps = Vec::new(); for coeffs in list_coeffs { let coeffs = field_elements_from_big_uints::(&coeffs); ps.push(Polynomial::new(coeffs)); } let (z_polyq, z_polyr) = extf_mul::nondeterministic_extension_field_mul_divmod(ext_degree, ps); let q = z_polyq .coefficients .into_iter() .map(|x| BigUint::from_bytes_be(&x.to_bytes_be())) .collect::>(); let r = z_polyr .coefficients .into_iter() .map(|x| BigUint::from_bytes_be(&x.to_bytes_be())) .collect::>(); let q_list = PyList::new(py, q)?; let r_list = PyList::new(py, r)?; let py_tuple = PyTuple::new(py, [q_list, r_list])?; Ok(py_tuple.into()) } ================================================ FILE: tools/garaga_rs/src/python_bindings/final_exp_witness.rs ================================================ use super::*; #[pyfunction] pub fn get_final_exp_witness( py: Python, curve_id: usize, py_list: &Bound<'_, PyList>, ) -> PyResult> { let f_0: BigUint = py_list.get_item(0)?.extract()?; let f_1: BigUint = py_list.get_item(1)?.extract()?; let f_2: BigUint = py_list.get_item(2)?.extract()?; let f_3: BigUint = py_list.get_item(3)?.extract()?; let f_4: BigUint = py_list.get_item(4)?.extract()?; let f_5: BigUint = py_list.get_item(5)?.extract()?; let f_6: BigUint = py_list.get_item(6)?.extract()?; let f_7: BigUint = py_list.get_item(7)?.extract()?; let f_8: BigUint = py_list.get_item(8)?.extract()?; let f_9: BigUint = py_list.get_item(9)?.extract()?; let f_10: BigUint = py_list.get_item(10)?.extract()?; let f_11: BigUint = py_list.get_item(11)?.extract()?; let f = [f_0, f_1, f_2, f_3, f_4, f_5, f_6, f_7, f_8, f_9, f_10, f_11]; let (c, wi) = crate::pairing::final_exp_witness::get_final_exp_witness(curve_id, f); let c_list = PyList::new(py, c)?; let wi_list = PyList::new(py, wi)?; let py_tuple = PyTuple::new(py, [c_list, wi_list])?; Ok(Py::from(py_tuple)) } ================================================ FILE: tools/garaga_rs/src/python_bindings/g2.rs ================================================ use super::*; use crate::io::{biguint_to_u256, element_from_biguint}; use lambdaworks_math::cyclic_group::IsGroup; use lambdaworks_math::elliptic_curve::short_weierstrass::point::ShortWeierstrassProjectivePoint; use lambdaworks_math::elliptic_curve::traits::FromAffine; #[pyfunction] pub fn g2_add( py: Python, curve_id: usize, py_tuple_1: &Bound<'_, PyTuple>, py_tuple_2: &Bound<'_, PyTuple>, ) -> PyResult> { let a_0: BigUint = py_tuple_1.get_item(0)?.extract()?; let a_1: BigUint = py_tuple_1.get_item(1)?.extract()?; let a_2: BigUint = py_tuple_1.get_item(2)?.extract()?; let a_3: BigUint = py_tuple_1.get_item(3)?.extract()?; let b_0: BigUint = py_tuple_2.get_item(0)?.extract()?; let b_1: BigUint = py_tuple_2.get_item(1)?.extract()?; let b_2: BigUint = py_tuple_2.get_item(2)?.extract()?; let b_3: BigUint = py_tuple_2.get_item(3)?.extract()?; if curve_id == CURVE_BN254 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::BN254PrimeField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::twist::BN254TwistCurve; let a = ShortWeierstrassProjectivePoint::::from_affine( FieldElement::new([ element_from_biguint::(&a_0), element_from_biguint::(&a_1), ]), FieldElement::new([ element_from_biguint::(&a_2), element_from_biguint::(&a_3), ]), ) .unwrap(); let b = ShortWeierstrassProjectivePoint::::from_affine( FieldElement::new([ element_from_biguint::(&b_0), element_from_biguint::(&b_1), ]), FieldElement::new([ element_from_biguint::(&b_2), element_from_biguint::(&b_3), ]), ) .unwrap(); let c = a.operate_with(&b); let c_affine = c.to_affine(); let [[x0, x1], [y0, y1]] = match c_affine.z() == &FieldElement::zero() { true => [ &[FieldElement::zero(), FieldElement::zero()], &[FieldElement::zero(), FieldElement::zero()], ], false => [c_affine.x().value(), c_affine.y().value()], }; let py_tuple = PyTuple::new( py, [ element_to_biguint::(x0), element_to_biguint::(x1), element_to_biguint::(y0), element_to_biguint::(y1), ], ); return Ok(py_tuple?.into()); } if curve_id == CURVE_BLS12_381 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::twist::BLS12381TwistCurve; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::BLS12381PrimeField; let a = ShortWeierstrassProjectivePoint::::from_affine( FieldElement::new([ element_from_biguint::(&a_0), element_from_biguint::(&a_1), ]), FieldElement::new([ element_from_biguint::(&a_2), element_from_biguint::(&a_3), ]), ) .unwrap(); let b = ShortWeierstrassProjectivePoint::::from_affine( FieldElement::new([ element_from_biguint::(&b_0), element_from_biguint::(&b_1), ]), FieldElement::new([ element_from_biguint::(&b_2), element_from_biguint::(&b_3), ]), ) .unwrap(); let c = a.operate_with(&b); let c_affine = c.to_affine(); let [[x0, x1], [y0, y1]] = match c_affine.z() == &FieldElement::zero() { true => [ &[FieldElement::zero(), FieldElement::zero()], &[FieldElement::zero(), FieldElement::zero()], ], false => [c_affine.x().value(), c_affine.y().value()], }; let py_tuple = PyTuple::new( py, [ element_to_biguint::(x0), element_to_biguint::(x1), element_to_biguint::(y0), element_to_biguint::(y1), ], ); return Ok(py_tuple?.into()); } panic!("Curve ID {} not supported", curve_id); } #[pyfunction] pub fn g2_scalar_mul( py: Python, curve_id: usize, py_tuple_1: &Bound<'_, PyTuple>, py_int_2: &Bound<'_, PyInt>, ) -> PyResult> { let a_0: BigUint = py_tuple_1.get_item(0)?.extract()?; let a_1: BigUint = py_tuple_1.get_item(1)?.extract()?; let a_2: BigUint = py_tuple_1.get_item(2)?.extract()?; let a_3: BigUint = py_tuple_1.get_item(3)?.extract()?; let k: BigUint = py_int_2.extract()?; if curve_id == CURVE_BN254 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::BN254PrimeField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::twist::BN254TwistCurve; let a = ShortWeierstrassProjectivePoint::::from_affine( FieldElement::new([ element_from_biguint::(&a_0), element_from_biguint::(&a_1), ]), FieldElement::new([ element_from_biguint::(&a_2), element_from_biguint::(&a_3), ]), ) .unwrap(); let c = a.operate_with_self(biguint_to_u256(&k)); let c_affine = c.to_affine(); let [[x0, x1], [y0, y1]] = match c_affine.z() == &FieldElement::zero() { true => [ &[FieldElement::zero(), FieldElement::zero()], &[FieldElement::zero(), FieldElement::zero()], ], false => [c_affine.x().value(), c_affine.y().value()], }; let py_tuple = PyTuple::new( py, [ element_to_biguint::(x0), element_to_biguint::(x1), element_to_biguint::(y0), element_to_biguint::(y1), ], ); return Ok(py_tuple?.into()); } if curve_id == CURVE_BLS12_381 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::BLS12381PrimeField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::twist::BLS12381TwistCurve; let a = ShortWeierstrassProjectivePoint::::from_affine( FieldElement::new([ element_from_biguint::(&a_0), element_from_biguint::(&a_1), ]), FieldElement::new([ element_from_biguint::(&a_2), element_from_biguint::(&a_3), ]), ) .unwrap(); let c = a.operate_with_self(biguint_to_u256(&k)); let c_affine = c.to_affine(); let [[x0, x1], [y0, y1]] = match c_affine.z() == &FieldElement::zero() { true => [ &[FieldElement::zero(), FieldElement::zero()], &[FieldElement::zero(), FieldElement::zero()], ], false => [c_affine.x().value(), c_affine.y().value()], }; let py_tuple = PyTuple::new( py, [ element_to_biguint::(x0), element_to_biguint::(x1), element_to_biguint::(y0), element_to_biguint::(y1), ], ); return Ok(py_tuple?.into()); } panic!("Curve ID {} not supported", curve_id); } ================================================ FILE: tools/garaga_rs/src/python_bindings/groth16_calldata.rs ================================================ use super::*; use crate::calldata::full_proof_with_hints::groth16; use crate::calldata::full_proof_with_hints::groth16::{Groth16Proof, Groth16VerificationKey}; use crate::definitions::CurveID; use pyo3::prelude::*; use pyo3::types::PyList; #[pyfunction(signature = (proof, vk, curve_id, image_id=None, journal=None, public_inputs_sp1=None, vkey=None))] pub fn get_groth16_calldata( py: Python, proof: &Bound<'_, PyList>, vk: &Bound<'_, PyList>, curve_id: usize, image_id: Option<&[u8]>, journal: Option<&[u8]>, public_inputs_sp1: Option<&[u8]>, vkey: Option<&[u8]>, ) -> PyResult> { let proof_values = proof .into_iter() .map(|x| x.extract()) .collect::, _>>()?; let vk_values = vk .into_iter() .map(|x| x.extract()) .collect::, _>>()?; // Handle RISC0 optional parameters let image_id_journal_risc0 = if let (Some(image_id), Some(journal)) = (image_id, journal) { Some((image_id.to_vec(), journal.to_vec())) } else { None }; let verifying_key = Groth16VerificationKey::from(vk_values); // Handle SP1 optional parameters let vkey_public_values_sp1 = if let (Some(vkey), Some(public_inputs_sp1)) = (vkey, public_inputs_sp1) { assert!(verifying_key == groth16::get_sp1_vk()); Some((vkey.to_vec(), public_inputs_sp1.to_vec())) } else { None }; let result = groth16::get_groth16_calldata( &Groth16Proof::from(proof_values, image_id_journal_risc0, vkey_public_values_sp1), &verifying_key, CurveID::try_from(curve_id).map_err(PyErr::new::)?, ) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } ================================================ FILE: tools/garaga_rs/src/python_bindings/hades_permutation.rs ================================================ use super::*; #[pyfunction] pub fn hades_permutation( py: Python, py_value_1: &Bound<'_, PyBytes>, py_value_2: &Bound<'_, PyBytes>, py_value_3: &Bound<'_, PyBytes>, ) -> PyResult> { let byte_slice_1: &[u8] = py_value_1.as_bytes(); let byte_slice_2: &[u8] = py_value_2.as_bytes(); let byte_slice_3: &[u8] = py_value_3.as_bytes(); let mut state: Vec> = vec![ FieldElement::::from_bytes_be(byte_slice_1) .expect("Unable to convert first param from bytes to FieldElement"), FieldElement::::from_bytes_be(byte_slice_2) .expect("Unable to convert second param from bytes to FieldElement"), FieldElement::::from_bytes_be(byte_slice_3) .expect("Unable to convert third param from bytes to FieldElement"), ]; PoseidonCairoStark252::hades_permutation(&mut state); let py_tuple = PyTuple::new( py, state.iter().map(|fe| { let fe_bytes = fe.to_bytes_be(); PyBytes::new(py, &fe_bytes) }), ); Ok(py_tuple?.into()) } ================================================ FILE: tools/garaga_rs/src/python_bindings/mod.rs ================================================ pub mod drand_calldata; pub mod ecip; pub mod extf_mul; pub mod final_exp_witness; pub mod g2; pub mod groth16_calldata; pub mod hades_permutation; pub mod mpc_calldata; pub mod msm; pub mod pairing; pub mod signatures; pub mod zk_honk_calldata; use lambdaworks_crypto::hash::poseidon::{starknet::PoseidonCairoStark252, Poseidon}; use lambdaworks_math::{field::traits::IsPrimeField, traits::ByteConversion}; use crate::crypto::poseidon_bn254::poseidon_hash_bn254 as core_poseidon_hash_bn254; use crate::definitions::{ BLS12381PrimeField, BN254PrimeField, FieldElement, GrumpkinPrimeField, Stark252PrimeField, }; use crate::io::{element_from_biguint, element_to_biguint}; use num_bigint::BigUint; use pyo3::{ conversion::IntoPyObject, prelude::*, types::{PyBytes, PyInt, PyList, PyTuple}, }; const CURVE_BN254: usize = 0; const CURVE_BLS12_381: usize = 1; #[pyfunction] pub fn poseidon_hash_bn254( py: Python, x: &Bound<'_, PyInt>, y: &Bound<'_, PyInt>, ) -> PyResult> { let x_biguint: BigUint = x.extract()?; let y_biguint: BigUint = y.extract()?; let x_fe = element_from_biguint::(&x_biguint); let y_fe = element_from_biguint::(&y_biguint); let result = core_poseidon_hash_bn254(&x_fe, &y_fe); let result_biguint = element_to_biguint(&result); Ok(result_biguint.into_pyobject(py)?.into()) } #[pymodule] fn garaga_rs(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(g2::g2_add, m)?)?; m.add_function(wrap_pyfunction!(g2::g2_scalar_mul, m)?)?; m.add_function(wrap_pyfunction!(pairing::multi_pairing, m)?)?; m.add_function(wrap_pyfunction!(pairing::multi_miller_loop, m)?)?; m.add_function(wrap_pyfunction!( final_exp_witness::get_final_exp_witness, m )?)?; m.add_function(wrap_pyfunction!(hades_permutation::hades_permutation, m)?)?; m.add_function(wrap_pyfunction!( extf_mul::nondeterministic_extension_field_mul_divmod, m )?)?; m.add_function(wrap_pyfunction!(ecip::zk_ecip_hint, m)?)?; m.add_function(wrap_pyfunction!(msm::msm_calldata_builder, m)?)?; m.add_function(wrap_pyfunction!(mpc_calldata::mpc_calldata_builder, m)?)?; m.add_function(wrap_pyfunction!(groth16_calldata::get_groth16_calldata, m)?)?; m.add_function(wrap_pyfunction!(zk_honk_calldata::get_zk_honk_calldata, m)?)?; m.add_function(wrap_pyfunction!(signatures::schnorr_calldata_builder, m)?)?; m.add_function(wrap_pyfunction!(signatures::ecdsa_calldata_builder, m)?)?; m.add_function(wrap_pyfunction!(signatures::eddsa_calldata_builder, m)?)?; m.add_function(wrap_pyfunction!(signatures::rsa_2048_calldata_builder, m)?)?; m.add_function(wrap_pyfunction!( signatures::rsa_2048_sha256_calldata_builder, m )?)?; m.add_function(wrap_pyfunction!(poseidon_hash_bn254, m)?)?; m.add_function(wrap_pyfunction!(pairing::final_exp, m)?)?; m.add_function(wrap_pyfunction!(drand_calldata::drand_calldata_builder, m)?)?; m.add_function(wrap_pyfunction!( drand_calldata::drand_tlock_encrypt_calldata_builder, m )?)?; Ok(()) } ================================================ FILE: tools/garaga_rs/src/python_bindings/mpc_calldata.rs ================================================ use super::*; #[pyfunction] pub fn mpc_calldata_builder( py: Python, curve_id: usize, py_list1: &Bound<'_, PyList>, n_fixed_g2: usize, py_list2: &Bound<'_, PyList>, ) -> PyResult> { let values1 = py_list1 .into_iter() .map(|x| x.extract()) .collect::, _>>()?; let values2 = py_list2 .into_iter() .map(|x| x.extract()) .collect::, _>>()?; let result = crate::calldata::mpc_calldata::mpc_calldata_builder( curve_id, &values1, n_fixed_g2, &values2, ) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } ================================================ FILE: tools/garaga_rs/src/python_bindings/msm.rs ================================================ use super::*; #[pyfunction] #[allow(clippy::too_many_arguments)] pub fn msm_calldata_builder( py: Python, py_list1: &Bound<'_, PyList>, py_list2: &Bound<'_, PyList>, curve_id: usize, include_points_and_scalars: bool, serialize_as_pure_felt252_array: bool, ) -> PyResult> { let values = py_list1 .into_iter() .map(|x| x.extract()) .collect::, _>>()?; let scalars = py_list2 .into_iter() .map(|x| x.extract()) .collect::, _>>()?; let result = crate::calldata::msm_calldata::msm_calldata_builder( &values, &scalars, curve_id, include_points_and_scalars, serialize_as_pure_felt252_array, ) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } ================================================ FILE: tools/garaga_rs/src/python_bindings/pairing.rs ================================================ use super::*; use crate::definitions::{BLS12381PrimeField, BN254PrimeField}; use crate::io::element_from_biguint; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::curve::BN254Curve; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::twist::BN254TwistCurve; use lambdaworks_math::elliptic_curve::short_weierstrass::point::ShortWeierstrassProjectivePoint; use lambdaworks_math::elliptic_curve::traits::FromAffine; use lambdaworks_math::elliptic_curve::{ short_weierstrass::curves::bn_254::pairing::BN254AtePairing, traits::IsPairing, }; use itertools::Itertools; use lambdaworks_math::cyclic_group::IsGroup; use lambdaworks_math::field::element::FieldElement; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254; use lambdaworks_math::unsigned_integer::element::U256; use crate::pairing::final_exp_witness::{to_bls, to_bn}; #[pyfunction] pub fn multi_pairing( py: Python, curve_id: usize, py_list_1: &Bound<'_, PyList>, ) -> PyResult> { assert!(py_list_1.len() % 6 == 0, "invalid length"); if curve_id == CURVE_BN254 { let pairs = py_list_1 .iter() .chunks(6) .into_iter() .map(|chunk| { let [a_0, a_1, b_0, b_1, b_2, b_3] = chunk .map(|item| item.extract::().unwrap()) .collect::>() .try_into() .unwrap(); let ap = ShortWeierstrassProjectivePoint::::from_affine( element_from_biguint::(&a_0), element_from_biguint::(&a_1), ) .unwrap(); let bp = ShortWeierstrassProjectivePoint::::from_affine( FieldElement::new([ element_from_biguint::(&b_0), element_from_biguint::(&b_1), ]), FieldElement::new([ element_from_biguint::(&b_2), element_from_biguint::(&b_3), ]), ) .unwrap(); (ap, bp) }) .collect::>(); let cx = BN254AtePairing::compute_batch(&pairs.iter().map(|(a, b)| (a, b)).collect::>()) .unwrap(); let cx = match cx == FieldElement::one() { true => cx, false => { let final_exp_cofactor = U256::from_hex_unchecked("3bec47df15e307c81ea96b02d9d9e38d2e5d4e223ddedaf4"); cx.pow(final_exp_cofactor) } }; let py_list = PyList::new(py, to_bn(cx)); return Ok(py_list?.into()); } if curve_id == CURVE_BLS12_381 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::{ curve::BLS12381Curve, pairing::BLS12381AtePairing, twist::BLS12381TwistCurve, }; let pairs = py_list_1 .iter() .chunks(6) .into_iter() .map(|chunk| { let [a_0, a_1, b_0, b_1, b_2, b_3] = chunk .map(|item| item.extract::().unwrap()) .collect::>() .try_into() .unwrap(); let ap = ShortWeierstrassProjectivePoint::::from_affine( element_from_biguint::(&a_0), element_from_biguint::(&a_1), ) .unwrap(); let bp = ShortWeierstrassProjectivePoint::::from_affine( FieldElement::new([ element_from_biguint::(&b_0), element_from_biguint::(&b_1), ]), FieldElement::new([ element_from_biguint::(&b_2), element_from_biguint::(&b_3), ]), ) .unwrap(); (ap, bp) }) .collect::>(); let cx = BLS12381AtePairing::compute_batch( &pairs.iter().map(|(a, b)| (a, b)).collect::>(), ) .unwrap(); let py_list = PyList::new(py, to_bls(cx)); return Ok(py_list?.into()); } panic!("Curve ID {} not supported", curve_id); } #[pyfunction] pub fn multi_miller_loop( py: Python, curve_id: usize, py_list_1: &Bound<'_, PyList>, ) -> PyResult> { assert!(py_list_1.len() % 6 == 0, "invalid length"); if curve_id == CURVE_BN254 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::Degree12ExtensionField; let pairs = py_list_1 .iter() .chunks(6) .into_iter() .map(|chunk| { let [a_0, a_1, b_0, b_1, b_2, b_3] = chunk .map(|item| item.extract::().unwrap()) .collect::>() .try_into() .unwrap(); let ap = ShortWeierstrassProjectivePoint::::from_affine( element_from_biguint::(&a_0), element_from_biguint::(&a_1), ) .unwrap(); let bp = ShortWeierstrassProjectivePoint::::from_affine( FieldElement::new([ element_from_biguint::(&b_0), element_from_biguint::(&b_1), ]), FieldElement::new([ element_from_biguint::(&b_2), element_from_biguint::(&b_3), ]), ) .unwrap(); (ap, bp) }) .collect::>(); let mut result = FieldElement::::one(); for (p, q) in pairs { // We don't need to check if p is in the subgroup because the subgroup oF G1 is G1. // See https://hackmd.io/@jpw/bn254#Subgroup-checks. if !q.is_in_subgroup() { return Err(PyErr::new::( "Point not in subgroup", )); } if !p.is_neutral_element() && !q.is_neutral_element() { let p = p.to_affine(); let q = q.to_affine(); result *= bn_254::pairing::miller_optimized(&p, &q); } } let py_list = PyList::new(py, to_bn(result)); return Ok(py_list?.into()); } if curve_id == CURVE_BLS12_381 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::Degree12ExtensionField; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::{ curve::BLS12381Curve, twist::BLS12381TwistCurve, }; let pairs = py_list_1 .iter() .chunks(6) .into_iter() .map(|chunk| { let [a_0, a_1, b_0, b_1, b_2, b_3] = chunk .map(|item| item.extract::().unwrap()) .collect::>() .try_into() .unwrap(); let ap = ShortWeierstrassProjectivePoint::::from_affine( element_from_biguint::(&a_0), element_from_biguint::(&a_1), ) .unwrap(); let bp = ShortWeierstrassProjectivePoint::::from_affine( FieldElement::new([ element_from_biguint::(&b_0), element_from_biguint::(&b_1), ]), FieldElement::new([ element_from_biguint::(&b_2), element_from_biguint::(&b_3), ]), ) .unwrap(); (ap, bp) }) .collect::>(); let mut result = FieldElement::::one(); for (p, q) in pairs { // We don't need to check if p is in the subgroup because the subgroup oF G1 is G1. // See https://hackmd.io/@jpw/bn254#Subgroup-checks. if !q.is_in_subgroup() { return Err(PyErr::new::( "Point not in subgroup", )); } if !p.is_neutral_element() && !q.is_neutral_element() { let p = p.to_affine(); let q = q.to_affine(); result *= bls12_381::pairing::miller(&q, &p); } } let py_list = PyList::new(py, to_bls(result)); return Ok(py_list?.into()); } panic!("Curve ID {} not supported", curve_id); } #[pyfunction] pub fn final_exp( py: Python, curve_id: usize, py_list_1: &Bound<'_, PyList>, ) -> PyResult> { assert!(py_list_1.len() == 12, "invalid length"); let [f_0, f_1, f_2, f_3, f_4, f_5, f_6, f_7, f_8, f_9, f_10, f_11] = py_list_1.extract::<[BigUint; 12]>().unwrap(); if curve_id == 0 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::{Degree12ExtensionField, Degree6ExtensionField, Degree2ExtensionField}; let f = FieldElement::::new([ FieldElement::::new([ FieldElement::::new([ element_from_biguint::(&f_0), element_from_biguint::(&f_1), ]), FieldElement::::new([ element_from_biguint::(&f_2), element_from_biguint::(&f_3), ]), FieldElement::::new([ element_from_biguint::(&f_4), element_from_biguint::(&f_5), ]), ]), FieldElement::::new([ FieldElement::::new([ element_from_biguint::(&f_6), element_from_biguint::(&f_7), ]), FieldElement::::new([ element_from_biguint::(&f_8), element_from_biguint::(&f_9), ]), FieldElement::::new([ element_from_biguint::(&f_10), element_from_biguint::(&f_11), ]), ]), ]); let final_exp = bn_254::pairing::final_exponentiation_optimized(&f); let fx = match final_exp == FieldElement::one() { true => final_exp, false => { let final_exp_cofactor = U256::from_hex_unchecked("3bec47df15e307c81ea96b02d9d9e38d2e5d4e223ddedaf4"); final_exp.pow(final_exp_cofactor) } }; let py_list = PyList::new(py, to_bn(fx)); return Ok(py_list?.into()); } if curve_id == 1 { use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::{Degree12ExtensionField, Degree6ExtensionField, Degree2ExtensionField}; let f = FieldElement::::new([ FieldElement::::new([ FieldElement::::new([ element_from_biguint::(&f_0), element_from_biguint::(&f_1), ]), FieldElement::::new([ element_from_biguint::(&f_2), element_from_biguint::(&f_3), ]), FieldElement::::new([ element_from_biguint::(&f_4), element_from_biguint::(&f_5), ]), ]), FieldElement::::new([ FieldElement::::new([ element_from_biguint::(&f_6), element_from_biguint::(&f_7), ]), FieldElement::::new([ element_from_biguint::(&f_8), element_from_biguint::(&f_9), ]), FieldElement::::new([ element_from_biguint::(&f_10), element_from_biguint::(&f_11), ]), ]), ]); let fx = bls12_381::pairing::final_exponentiation(&f); let py_list = PyList::new(py, to_bls(fx)); return Ok(py_list?.into()); } panic!("Curve ID {} not supported", curve_id); } ================================================ FILE: tools/garaga_rs/src/python_bindings/signatures.rs ================================================ use super::*; #[pyfunction] pub fn schnorr_calldata_builder( py: Python, rx: &Bound<'_, PyInt>, s: &Bound<'_, PyInt>, e: &Bound<'_, PyInt>, px: &Bound<'_, PyInt>, py_coord: &Bound<'_, PyInt>, prepend_public_key: bool, curve_id: usize, ) -> PyResult> { let rx: BigUint = rx.extract()?; let s: BigUint = s.extract()?; let e: BigUint = e.extract()?; let px: BigUint = px.extract()?; let py_coord: BigUint = py_coord.extract()?; let result = crate::calldata::signatures::schnorr_calldata_builder( rx, s, e, px, py_coord, prepend_public_key, curve_id, ) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } #[pyfunction] pub fn ecdsa_calldata_builder( py: Python, r: &Bound<'_, PyInt>, s: &Bound<'_, PyInt>, v: u8, px: &Bound<'_, PyInt>, py_coord: &Bound<'_, PyInt>, z: &Bound<'_, PyInt>, prepend_public_key: bool, curve_id: usize, ) -> PyResult> { let r: BigUint = r.extract()?; let s: BigUint = s.extract()?; let px: BigUint = px.extract()?; let py_coord: BigUint = py_coord.extract()?; let z: BigUint = z.extract()?; let result = crate::calldata::signatures::ecdsa_calldata_builder( r, s, v, px, py_coord, z, prepend_public_key, curve_id, ) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } #[pyfunction] pub fn eddsa_calldata_builder( py: Python, rx: &Bound<'_, PyInt>, s: &Bound<'_, PyInt>, py_coord: &Bound<'_, PyInt>, msg: &Bound<'_, PyBytes>, prepend_public_key: bool, ) -> PyResult> { let rx: BigUint = rx.extract()?; let s: BigUint = s.extract()?; let py_coord: BigUint = py_coord.extract()?; let msg: Vec = msg.extract()?; let result = crate::calldata::signatures::eddsa_calldata_builder( rx, s, py_coord, msg, prepend_public_key, ) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } #[pyfunction] pub fn rsa_2048_calldata_builder( py: Python, signature: &Bound<'_, PyInt>, expected_message: &Bound<'_, PyInt>, modulus: &Bound<'_, PyInt>, prepend_public_key: bool, ) -> PyResult> { let signature: BigUint = signature.extract()?; let expected_message: BigUint = expected_message.extract()?; let modulus: BigUint = modulus.extract()?; let result = crate::calldata::signatures::rsa_2048_calldata_builder( signature, expected_message, modulus, prepend_public_key, ) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } #[pyfunction] pub fn rsa_2048_sha256_calldata_builder( py: Python, signature: &Bound<'_, PyInt>, message: &Bound<'_, PyBytes>, modulus: &Bound<'_, PyInt>, prepend_public_key: bool, ) -> PyResult> { let signature: BigUint = signature.extract()?; let message: Vec = message.extract()?; let modulus: BigUint = modulus.extract()?; let result = crate::calldata::signatures::rsa_2048_sha256_calldata_builder( signature, &message, modulus, prepend_public_key, ) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } ================================================ FILE: tools/garaga_rs/src/python_bindings/zk_honk_calldata.rs ================================================ use super::*; use crate::calldata::full_proof_with_hints::zk_honk; use crate::calldata::full_proof_with_hints::zk_honk::{HonkVerificationKey, ZKHonkProof}; use pyo3::prelude::*; use pyo3::types::PyList; #[pyfunction] pub fn get_zk_honk_calldata( py: Python, proof: &Bound<'_, PyBytes>, public_inputs: &Bound<'_, PyBytes>, vk: &Bound<'_, PyBytes>, ) -> PyResult> { let proof_bytes = proof.as_bytes(); let public_inputs_bytes = public_inputs.as_bytes(); let vk_bytes = vk.as_bytes(); let vk = HonkVerificationKey::from_bytes(vk_bytes) .map_err(PyErr::new::)?; let proof = ZKHonkProof::from_bytes(proof_bytes, public_inputs_bytes, vk.log_circuit_size) .map_err(PyErr::new::)?; let result = zk_honk::get_zk_honk_calldata(&proof, &vk) .map_err(PyErr::new::)?; let py_list = PyList::new(py, result); Ok(py_list?.into()) } ================================================ FILE: tools/garaga_rs/src/wasm_bindings.rs ================================================ use crate::calldata::full_proof_with_hints::groth16; use crate::calldata::full_proof_with_hints::groth16::{Groth16Proof, Groth16VerificationKey}; use crate::calldata::full_proof_with_hints::zk_honk; use crate::calldata::full_proof_with_hints::zk_honk::{HonkVerificationKey, ZKHonkProof}; use crate::calldata::{G1PointBigUint, G2PointBigUint}; use crate::crypto::poseidon_bn254::poseidon_hash_bn254; use crate::definitions::CurveID; use crate::definitions::{ GrumpkinPrimeField, ToTwistedEdwardsCurve, ToWeierstrassCurve, X25519PrimeField, }; use crate::io::{element_from_biguint, element_to_biguint}; use js_sys::{Array, Uint8Array}; use num_bigint::BigUint; use num_traits::Num; use wasm_bindgen::prelude::*; // Import the Num trait #[wasm_bindgen] pub fn drand_calldata_builder(values: Vec) -> Result, JsValue> { let values: Vec = values .into_iter() .map(jsvalue_to_biguint) .collect::, _>>()?; let result = crate::calldata::drand_calldata::drand_calldata_builder(&values) .map_err(|e| JsValue::from_str(&e.to_string()))?; // Handle error here let result: Vec = result; // Ensure result is of type Vec Ok(result.into_iter().map(biguint_to_jsvalue).collect()) } #[wasm_bindgen] pub fn drand_tlock_encrypt_calldata_builder(values: Vec) -> Result, JsValue> { let values: Vec = values .into_iter() .map(jsvalue_to_biguint) .collect::, _>>()?; let result = crate::calldata::drand_tlock_calldata::drand_tlock_encrypt_calldata_builder(&values) .map_err(|e| JsValue::from_str(&e.to_string()))?; let result: Vec = result; Ok(result.into_iter().map(biguint_to_jsvalue).collect()) } #[wasm_bindgen] pub fn msm_calldata_builder( values: Vec, scalars: Vec, curve_id: usize, include_points_and_scalars: bool, serialize_as_pure_felt252_array: bool, ) -> Result, JsValue> { let values: Vec = values .into_iter() .map(jsvalue_to_biguint) .collect::, _>>()?; let scalars: Vec = scalars .into_iter() .map(jsvalue_to_biguint) .collect::, _>>()?; // Ensure msm_calldata_builder returns a Result type let result = crate::calldata::msm_calldata::msm_calldata_builder( &values, &scalars, curve_id, include_points_and_scalars, serialize_as_pure_felt252_array, ) .map_err(|e| JsValue::from_str(&e.to_string()))?; // Handle error here let result: Vec = result; // Ensure result is of type Vec Ok(result.into_iter().map(biguint_to_jsvalue).collect()) } #[wasm_bindgen] pub fn mpc_calldata_builder( curve_id: usize, values1: Vec, n_fixed_g2: usize, values2: Vec, ) -> Result, JsValue> { let values1: Vec = values1 .into_iter() .map(jsvalue_to_biguint) .collect::, _>>()?; let values2: Vec = values2 .into_iter() .map(jsvalue_to_biguint) .collect::, _>>()?; // Ensure msm_calldata_builder returns a Result type let result = crate::calldata::mpc_calldata::mpc_calldata_builder( curve_id, &values1, n_fixed_g2, &values2, ) .map_err(|e| JsValue::from_str(&e.to_string()))?; // Handle error here let result: Vec = result; // Ensure result is of type Vec Ok(result.into_iter().map(biguint_to_jsvalue).collect()) } #[wasm_bindgen] pub fn schnorr_calldata_builder( rx: JsValue, s: JsValue, e: JsValue, px: JsValue, py: JsValue, prepend_public_key: bool, curve_id: usize, ) -> Result, JsValue> { let rx: BigUint = jsvalue_to_biguint(rx)?; let s: BigUint = jsvalue_to_biguint(s)?; let e: BigUint = jsvalue_to_biguint(e)?; let px: BigUint = jsvalue_to_biguint(px)?; let py: BigUint = jsvalue_to_biguint(py)?; let result = crate::calldata::signatures::schnorr_calldata_builder( rx, s, e, px, py, prepend_public_key, curve_id, ) .map_err(|e| JsValue::from_str(&e.to_string()))?; // Handle error here let result: Vec = result; // Ensure result is of type Vec Ok(result.into_iter().map(biguint_to_jsvalue).collect()) } #[wasm_bindgen] pub fn ecdsa_calldata_builder( r: JsValue, s: JsValue, v: usize, px: JsValue, py: JsValue, z: JsValue, prepend_public_key: bool, curve_id: usize, ) -> Result, JsValue> { let r: BigUint = jsvalue_to_biguint(r)?; let s: BigUint = jsvalue_to_biguint(s)?; let v: u8 = v .try_into() .map_err(|_| JsValue::from_str("Failed to convert value to u8"))?; let px: BigUint = jsvalue_to_biguint(px)?; let py: BigUint = jsvalue_to_biguint(py)?; let z: BigUint = jsvalue_to_biguint(z)?; let result = crate::calldata::signatures::ecdsa_calldata_builder( r, s, v, px, py, z, prepend_public_key, curve_id, ) .map_err(|e| JsValue::from_str(&e.to_string()))?; // Handle error here let result: Vec = result; // Ensure result is of type Vec Ok(result.into_iter().map(biguint_to_jsvalue).collect()) } #[wasm_bindgen] pub fn eddsa_calldata_builder( ry_twisted: JsValue, s: JsValue, py_twisted: JsValue, msg: JsValue, prepend_public_key: bool, ) -> Result, JsValue> { let r: BigUint = jsvalue_to_biguint(ry_twisted)?; let s: BigUint = jsvalue_to_biguint(s)?; let py: BigUint = jsvalue_to_biguint(py_twisted)?; let msg: Vec = msg.dyn_into::().map(|arr| arr.to_vec())?; let result = crate::calldata::signatures::eddsa_calldata_builder(r, s, py, msg, prepend_public_key) .map_err(|e| JsValue::from_str(&e.to_string()))?; // Handle error here let result: Vec = result; // Ensure result is of type Vec Ok(result.into_iter().map(biguint_to_jsvalue).collect()) } #[wasm_bindgen] pub fn rsa_2048_calldata_builder( signature: JsValue, expected_message: JsValue, modulus: JsValue, prepend_public_key: bool, ) -> Result, JsValue> { let signature: BigUint = jsvalue_to_biguint(signature)?; let expected_message: BigUint = jsvalue_to_biguint(expected_message)?; let modulus: BigUint = jsvalue_to_biguint(modulus)?; let result = crate::calldata::signatures::rsa_2048_calldata_builder( signature, expected_message, modulus, prepend_public_key, ) .map_err(|e| JsValue::from_str(&e.to_string()))?; Ok(result.into_iter().map(biguint_to_jsvalue).collect()) } #[wasm_bindgen] pub fn rsa_2048_sha256_calldata_builder( signature: JsValue, message: JsValue, modulus: JsValue, prepend_public_key: bool, ) -> Result, JsValue> { let signature: BigUint = jsvalue_to_biguint(signature)?; let message: Vec = message .dyn_into::() .map(|arr| arr.to_vec()) .map_err(|_| JsValue::from_str("message must be a Uint8Array"))?; let modulus: BigUint = jsvalue_to_biguint(modulus)?; let result = crate::calldata::signatures::rsa_2048_sha256_calldata_builder( signature, &message, modulus, prepend_public_key, ) .map_err(|e| JsValue::from_str(&e.to_string()))?; Ok(result.into_iter().map(biguint_to_jsvalue).collect()) } fn jsvalue_to_biguint(v: JsValue) -> Result { let s = (JsValue::from_str("") + v) .as_string() .ok_or_else(|| JsValue::from_str("Failed to convert JsValue to string"))?; let (number_str, radix) = if s.starts_with("0x") || s.starts_with("0X") { // It's a hexadecimal string; remove the '0x' prefix (&s[2..], 16) } else { // Assume it's a decimal string (s.as_str(), 10) }; BigUint::from_str_radix(number_str, radix) .map_err(|_| JsValue::from_str("Failed to convert string to BigUint")) } fn biguint_to_jsvalue(v: BigUint) -> JsValue { JsValue::bigint_from_str(&v.to_string()) } // Helper function to get a property from an object fn get_property(obj: &js_sys::Object, key: &str) -> Result { js_sys::Reflect::get(obj, &JsValue::from_str(key)) } #[allow(dead_code)] fn set_property(obj: &js_sys::Object, key: &str, value: &JsValue) -> Result<(), JsValue> { let success = js_sys::Reflect::set(obj, &JsValue::from_str(key), value)?; if !success { return Err(JsValue::from_str(&format!( "Failed to set property: {}", key ))); } Ok(()) } // Parsing helper for G1PointBigUint fn parse_g1_point(value: JsValue) -> Result { let obj = value .dyn_into::() .map_err(|_| JsValue::from_str("Failed to parse G1PointBigUint"))?; let x = jsvalue_to_biguint(get_property(&obj, "x")?)?; let y = jsvalue_to_biguint(get_property(&obj, "y")?)?; Ok(G1PointBigUint { x, y }) } #[allow(dead_code)] fn jsvalue_from_g1_point(point: &G1PointBigUint, curve_id: usize) -> Result { let point_obj = js_sys::Object::new(); set_property(&point_obj, "x", &biguint_to_jsvalue(point.x.clone()))?; set_property(&point_obj, "y", &biguint_to_jsvalue(point.y.clone()))?; set_property(&point_obj, "curveId", &curve_id.into())?; Ok(point_obj.into()) } // Parsing helper for G2PointBigUint fn parse_g2_point(value: JsValue) -> Result { let obj = value .dyn_into::() .map_err(|_| JsValue::from_str("Failed to parse G2PointBigUint"))?; let x_tuple = get_property(&obj, "x")? .dyn_into::() .map_err(|_| JsValue::from_str("x is not an array"))?; let y_tuple = get_property(&obj, "y")? .dyn_into::() .map_err(|_| JsValue::from_str("y is not an array"))?; let x0 = jsvalue_to_biguint(x_tuple.get(0))?; let x1 = jsvalue_to_biguint(x_tuple.get(1))?; let y0 = jsvalue_to_biguint(y_tuple.get(0))?; let y1 = jsvalue_to_biguint(y_tuple.get(1))?; Ok(G2PointBigUint { x0, x1, y0, y1 }) } // Parsing helper for an array of BigUint fn parse_biguint_array(value: JsValue) -> Result, JsValue> { let array = value .dyn_into::() .map_err(|_| JsValue::from_str("public_inputs is not an array"))?; array .iter() .map(|v| { // let s = v // .as_string() // .ok_or_else(|| JsValue::from_str("public_inputs element is not a string"))?; // Parse the string into BigUint using the helper function jsvalue_to_biguint(v) }) .collect() } #[allow(dead_code)] fn jsvalue_from_biguint_array(values: &[BigUint]) -> Result { let values = values .iter() .cloned() .map(biguint_to_jsvalue) .collect::>(); Ok(values.into()) } // Parses an array of G1 points from JsValue fn parse_g1_point_array(value: JsValue) -> Result, JsValue> { let array = value .dyn_into::() .map_err(|_| JsValue::from_str("ic is not an array"))?; let mut points = Vec::new(); for i in 0..array.length() { let point = parse_g1_point(array.get(i))?; points.push(point); } Ok(points) } #[allow(dead_code)] fn jsvalue_from_g1_point_array( points: &[G1PointBigUint], curve_id: usize, ) -> Result { let points = points .iter() .map(|point| jsvalue_from_g1_point(point, curve_id)) .collect::, _>>()?; Ok(points.into()) } // Optional parsing helper for Uint8Array #[allow(dead_code)] fn _parse_optional_uint8_array(value: JsValue) -> Option> { value.dyn_into::().ok().map(|arr| arr.to_vec()) } #[wasm_bindgen] pub fn to_weirstrass(x_twisted: JsValue, y_twisted: JsValue) -> Result, JsValue> { let x_twisted_biguint = jsvalue_to_biguint(x_twisted).unwrap(); let x_twisted = element_from_biguint::(&x_twisted_biguint); let y_twisted_biguint = jsvalue_to_biguint(y_twisted).unwrap(); let y_twisted = element_from_biguint::(&y_twisted_biguint); let result = crate::definitions::X25519PrimeField::to_weirstrass(x_twisted, y_twisted); let x_weirstrass = element_to_biguint::(&result.0); let y_weirstrass = element_to_biguint::(&result.1); let result = vec![ biguint_to_jsvalue(x_weirstrass), biguint_to_jsvalue(y_weirstrass), ]; Ok(result) } #[wasm_bindgen] pub fn to_twistededwards( x_weirstrass: JsValue, y_weirstrass: JsValue, ) -> Result, JsValue> { let x_weirstrass_biguint = jsvalue_to_biguint(x_weirstrass).unwrap(); let x_weirstrass = element_from_biguint::(&x_weirstrass_biguint); let y_weirstrass_biguint = jsvalue_to_biguint(y_weirstrass).unwrap(); let y_weirstrass = element_from_biguint::(&y_weirstrass_biguint); let result = crate::definitions::X25519PrimeField::to_twistededwards(x_weirstrass, y_weirstrass); let x_twisted = element_to_biguint::(&result.0); let y_twisted = element_to_biguint::(&result.1); let result = vec![biguint_to_jsvalue(x_twisted), biguint_to_jsvalue(y_twisted)]; Ok(result) } #[wasm_bindgen] pub fn get_groth16_calldata( proof_js: JsValue, vk_js: JsValue, curve_id_js: JsValue, ) -> Result, JsValue> { let proof_obj = proof_js .dyn_into::() .map_err(|_| JsValue::from_str("proof_js is not an object"))?; let property = get_property(&proof_obj, "a")?; let a = parse_g1_point(property)?; let b = parse_g2_point(get_property(&proof_obj, "b")?)?; let c = parse_g1_point(get_property(&proof_obj, "c")?)?; let public_inputs = parse_biguint_array(get_property(&proof_obj, "publicInputs")?)?; // Parse RISC0 data if present let image_id_journal_risc0 = match get_property(&proof_obj, "imageIdJournalRisc0") { Ok(value) if !value.is_undefined() && !value.is_null() => { let risc0_obj = value .dyn_into::() .map_err(|_| JsValue::from_str("imageIdJournalRisc0 is not an object"))?; let image_id = get_property(&risc0_obj, "imageId")? .dyn_into::() .map(|arr| arr.to_vec()) .map_err(|_| JsValue::from_str("imageId is not a Uint8Array"))?; let journal = get_property(&risc0_obj, "journal")? .dyn_into::() .map(|arr| arr.to_vec()) .map_err(|_| JsValue::from_str("journal is not a Uint8Array"))?; Some((image_id, journal)) } _ => None, }; // Parse SP1 data if present let vkey_public_values_sp1 = match get_property(&proof_obj, "vkeyPublicValuesSp1") { Ok(value) if !value.is_undefined() && !value.is_null() => { let sp1_obj = value .dyn_into::() .map_err(|_| JsValue::from_str("vkeyPublicValuesSp1 is not an object"))?; let vkey = get_property(&sp1_obj, "vkey")? .dyn_into::() .map(|arr| arr.to_vec()) .map_err(|_| JsValue::from_str("vkey is not a Uint8Array"))?; let public_values = get_property(&sp1_obj, "publicValues")? .dyn_into::() .map(|arr| arr.to_vec()) .map_err(|_| JsValue::from_str("publicValues is not a Uint8Array"))?; Some((vkey, public_values)) } _ => None, }; let proof = Groth16Proof { a, b, c, public_inputs, image_id_journal_risc0, vkey_public_values_sp1, }; let vk_obj = vk_js .dyn_into::() .map_err(|_| JsValue::from_str("vk_js is not an object"))?; let alpha = parse_g1_point(get_property(&vk_obj, "alpha")?)?; let beta = parse_g2_point(get_property(&vk_obj, "beta")?)?; let gamma = parse_g2_point(get_property(&vk_obj, "gamma")?)?; let delta = parse_g2_point(get_property(&vk_obj, "delta")?)?; let ic = parse_g1_point_array(get_property(&vk_obj, "ic")?)?; let vk = Groth16VerificationKey { alpha, beta, gamma, delta, ic, }; //Parse curve_id_js into usize let curve_id_num = curve_id_js .as_f64() .ok_or_else(|| JsValue::from_str("curve_id_js is not a number"))? as usize; // Convert usize to CurveID using TryFrom let curve_id = CurveID::try_from(curve_id_num).map_err(|e| JsValue::from_str(&e))?; let groth16_calldata_biguint = groth16::get_groth16_calldata(&proof, &vk, curve_id); let groth16_calldata_js = groth16_calldata_biguint? .into_iter() .map(biguint_to_jsvalue) .collect::>(); Ok(groth16_calldata_js) } #[wasm_bindgen] pub fn get_zk_honk_calldata( proof_js: JsValue, public_inputs_js: JsValue, vk_js: JsValue, ) -> Result, JsValue> { let proof_bytes = proof_js.dyn_into::().map(|arr| arr.to_vec())?; let public_inputs_bytes = public_inputs_js .dyn_into::() .map(|arr| arr.to_vec())?; let vk_bytes = vk_js.dyn_into::().map(|arr| arr.to_vec())?; let vk = HonkVerificationKey::from_bytes(&vk_bytes).map_err(|s| JsValue::from_str(&s))?; let proof = ZKHonkProof::from_bytes(&proof_bytes, &public_inputs_bytes, vk.log_circuit_size) .map_err(|s| JsValue::from_str(&s))?; let honk_calldata_biguint = zk_honk::get_zk_honk_calldata(&proof, &vk); let honk_calldata_js = honk_calldata_biguint? .into_iter() .map(biguint_to_jsvalue) .collect::>(); Ok(honk_calldata_js) } #[wasm_bindgen] pub fn poseidon_hash(x: JsValue, y: JsValue) -> Result { // Convert hex strings to field elements, handling potential errors let x_biguint = jsvalue_to_biguint(x).map_err(|_| JsValue::from_str("Failed to parse x input as hex"))?; let x_fe = element_from_biguint::(&x_biguint); let y_biguint = jsvalue_to_biguint(y).map_err(|_| JsValue::from_str("Failed to parse y input as hex"))?; let y_fe = element_from_biguint::(&y_biguint); // Compute hash let result = poseidon_hash_bn254(&x_fe, &y_fe); let res_biguint = element_to_biguint::(&result); // Convert result to hex string Ok(biguint_to_jsvalue(res_biguint)) } #[allow(dead_code)] #[cfg(test)] mod tests { use super::*; use crate::definitions::CurveParamsProvider; use js_sys::Object; use num_bigint::BigUint; use wasm_bindgen_test::wasm_bindgen_test; // This test runs only in wasm32-unknown-unknown targets // wasm-pack test --node --release --no-default-features #[wasm_bindgen_test] pub fn test_biguint_marshalling() { let v = 31415usize; assert_eq!( jsvalue_to_biguint(biguint_to_jsvalue(BigUint::from(v))).unwrap(), BigUint::from(v) ); } #[wasm_bindgen_test] pub fn test_to_weierstrass_and_back() { let curve = X25519PrimeField::get_curve_params(); let x_weirstrass = curve.g_x; let y_weirstrass = curve.g_y; let (x_twisted, y_twisted) = X25519PrimeField::to_twistededwards(x_weirstrass.clone(), y_weirstrass.clone()); let (x_weirstrass_back, y_weirstrass_back) = X25519PrimeField::to_weirstrass(x_twisted, y_twisted); assert_eq!(x_weirstrass, x_weirstrass_back); assert_eq!(y_weirstrass, y_weirstrass_back); } #[wasm_bindgen_test] pub fn test_to_twistededwards_and_back_from_js() { let curve = X25519PrimeField::get_curve_params(); let x_weirstrass = curve.g_x; let y_weirstrass = curve.g_y; let x_weirstrass_js = biguint_to_jsvalue(element_to_biguint::(&x_weirstrass)); let y_weirstrass_js = biguint_to_jsvalue(element_to_biguint::(&y_weirstrass)); let result_js = to_twistededwards(x_weirstrass_js, y_weirstrass_js).unwrap(); assert_eq!(result_js.len(), 2); let x_twisted_js = result_js.get(0).unwrap(); let y_twisted_js = result_js.get(1).unwrap(); let x_twisted_biguint = jsvalue_to_biguint(x_twisted_js.clone()).unwrap(); let y_twisted_biguint = jsvalue_to_biguint(y_twisted_js.clone()).unwrap(); let x_twisted = element_from_biguint::(&x_twisted_biguint); let y_twisted = element_from_biguint::(&y_twisted_biguint); let (x_weirstrass_back, y_weirstrass_back) = X25519PrimeField::to_weirstrass(x_twisted, y_twisted); assert_eq!(x_weirstrass, x_weirstrass_back); assert_eq!(y_weirstrass, y_weirstrass_back); } #[wasm_bindgen_test] pub fn test_get_groth16_calldata() { let proof_js = mock_proof_js(); assert!(proof_js.is_object(), "Failed to parse proof"); let vk_js = mock_vk_js(); assert!(vk_js.is_object(), "Failed to parse Verifying Key"); let curve_id_js = JsValue::from_f64(0.0); let result = get_groth16_calldata(proof_js, vk_js, curve_id_js); assert!( result.is_ok(), "Expected successful result, got {:?}", result ); let result_values = result.unwrap(); // Add specific assertions here to validate expected output structure or content assert!( !result_values.is_empty(), "Expected non-empty result values" ); } // Mock helper to create G1 and G2 points as JsValues fn mock_g1_point(x: &str, y: &str) -> JsValue { let obj = Object::new(); js_sys::Reflect::set(&obj, &JsValue::from_str("x"), &JsValue::from_str(x)).unwrap(); js_sys::Reflect::set(&obj, &JsValue::from_str("y"), &JsValue::from_str(y)).unwrap(); obj.into() } fn mock_g2_point(x0: &str, x1: &str, y0: &str, y1: &str) -> JsValue { let obj = Object::new(); let x_tuple = Array::of2(&JsValue::from_str(x0), &JsValue::from_str(x1)); let y_tuple = Array::of2(&JsValue::from_str(y0), &JsValue::from_str(y1)); js_sys::Reflect::set(&obj, &JsValue::from_str("x"), &x_tuple).unwrap(); js_sys::Reflect::set(&obj, &JsValue::from_str("y"), &y_tuple).unwrap(); obj.into() } fn mock_proof_js() -> JsValue { let obj = Object::new(); js_sys::Reflect::set( &obj, &JsValue::from_str("a"), &mock_g1_point( "0x2abaae3dd6e4c662f5e071bca525a26d21e2400d01d02c87bce2e8363285990a", "0x24211ff0aa742a6dd1651aadce6f72757beb89de2cff83a6162de7c15674c2", ), ) .unwrap(); js_sys::Reflect::set( &obj, &JsValue::from_str("b"), &mock_g2_point( "0x2335f1564c154d7a2ec5d11faf6d991a205bef2858f1687976d0a46502f5224a", "0x223af0bb0912d8ebc535ed489d06cd01fcf4a8ab4596cc28164edf9041d97080", "0x182e8fd86a44983de1d1d9dc4f12f134535b75d39f7aeb21adbf57e1a32ee603", "0xecb11668a0dd5d5031b0837e62ba14222b45718dc101c1278f44a9ed823c16b", ), ) .unwrap(); js_sys::Reflect::set( &obj, &JsValue::from_str("c"), &mock_g1_point( "0x290243624a4c11868e7cb0c0f7cfd690dac08e4205d19795b0a8f686dddcdfd6", "0x15de00cc8af159fbdbdc802592e83e1ac61a8026b97e8889b8c5def59ec50b16", ), ) .unwrap(); let public_inputs = Array::new(); public_inputs.push(&JsValue::from_str( "0x1e17db88c1d2e83e49f692cce4bb8169309de90afb2b141156243106aa34b474", )); js_sys::Reflect::set(&obj, &JsValue::from_str("publicInputs"), &public_inputs).unwrap(); obj.into() } fn mock_vk_js() -> JsValue { let obj = Object::new(); js_sys::Reflect::set( &obj, &JsValue::from_str("alpha"), &mock_g1_point( "0xef3cb41414ad20b4fc5891f6b41a263d9f0c0509ee5ab16f866ff6a33fb9e73", "0x1b30646c7d96cf7830a42b1f2f7c0527c38601f1030674b0f14cf7c67de5027b", ), ) .unwrap(); js_sys::Reflect::set( &obj, &JsValue::from_str("beta"), &mock_g2_point( "0x21f7077b68f4faa9dcbfdc868e9a0b5c76eb0d62b919772a83b34a8bc1108489", "0x8693a2418c12721dddb0d4f9f3811645c372de7400061b6c6cebc4b3b799bb2", "0x3062e0c71d392fb15f33a8d7f87bf689709cb28f87d554e29dc92d92d1b0ce46", "0x4976fda5a1cd2a69e5b4fd77116cf638be2063a3359e40d8f3e8ec0c90ffd90", ), ) .unwrap(); js_sys::Reflect::set( &obj, &JsValue::from_str("gamma"), &mock_g2_point( "0x3541dacedd860ef884359c76cc9c6b81d289d3389e732f5f87195d15a4ce637", "0x2eb7d1fa8416da97272d9cc4aa2e71146c83c13be313e222b376d9a9da02f080", "0x8dce093ad7f7fe20efcb8bbb160b0f2ecb7cd98a7d48b949e86c8b00eef73f9", "0x29a4b793edc639746eb4af5910b954a713c49174d917839a146ea15cd7493f1d", ), ) .unwrap(); js_sys::Reflect::set( &obj, &JsValue::from_str("delta"), &mock_g2_point( "0x34fc9ba8eba1e49185580c9ee198f6cac8bc78463d786683ef471af4434acdc", "0x17f115a16975c6f261912be284ecae3a3f0899bb161153d19ebc7f594246b9b0", "0x17fd1ad43bbc8ef931c92abab72ef0ed83a3c195b4dbc7294e1eacf59b3e2054", "0x1bd7d75bf918b6766ff9481052ddb780a4cc43da055b6e98c187b34ca3e7cd1b", ), ) .unwrap(); let ic_array = Array::new(); ic_array.push(&mock_g1_point( "0x124e30bf4dff3ae9c9da665a8bebfd01ce6489a462587fa0f6c879156e7390bc", "0x1fdc3a96cea49b085e101dd2383fdc600dcb4a3450c0471724e1b022791c7532", )); ic_array.push(&mock_g1_point( "0x164668f89d9d6c6126a8465790ba44ddb5716750edaa0ed100691cceb974c6a1", "0x1d9c7309625ec7cf153290e7b5c8497412386c61f3d9d0426a702f368be936da", )); js_sys::Reflect::set(&obj, &JsValue::from_str("ic"), &ic_array).unwrap(); obj.into() } #[wasm_bindgen_test] fn test_poseidon_hash() { // Test with valid inputs let x_js = JsValue::from_str("1"); let y_js = JsValue::from_str("2"); let result = poseidon_hash(x_js, y_js); let expected_js = biguint_to_jsvalue( BigUint::from_str_radix( "115CC0F5E7D690413DF64C6B9662E9CF2A3617F2743245519E19607A4417189A", 16, ) .unwrap(), ); assert_eq!(result.unwrap(), expected_js); } } ================================================ FILE: tools/make/bytecode_check.sh ================================================ #!/bin/bash # Store the original working directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" cd "$PROJECT_ROOT/src/contracts" echo "----------------------------------------" get_target_dir() { local contract_folder_path=$1 local metadata local target_dir # Get absolute path of the contract folder local abs_contract_path="$PROJECT_ROOT/src/contracts/$contract_folder_path" # Change to the contract directory and run scarb metadata metadata=$(cd "$abs_contract_path" && scarb metadata --format-version 1 2>/dev/null) if [[ $? -ne 0 ]] || [[ -z "$metadata" ]]; then return 1 fi # Extract the target_dir from the JSON output target_dir=$(echo "$metadata" | jq -r '.target_dir' 2>/dev/null) if [[ -z "$target_dir" ]] || [[ "$target_dir" == "null" ]]; then return 1 fi # The target_dir from metadata is usually an absolute path to the workspace target # We need to append "/dev" to get the dev build directory if [[ "$target_dir" == */ ]]; then echo "${target_dir}dev" else echo "${target_dir}/dev" fi } # Function to build and check bytecode length check_bytecode_length() { local contract_dir=$1 local target_dir local abs_contract_path="$PROJECT_ROOT/src/contracts/$contract_dir" target_dir=$(get_target_dir "$contract_dir") if [[ $? -ne 0 ]] || [[ -z "$target_dir" ]]; then echo "Error: Could not determine target directory for $contract_dir" echo "----------------------------------------" return 1 fi # echo "target_dir: $target_dir" cd "$abs_contract_path" scarb build # Find the compiled contract class JSON file # Find the files that start with the base name of the contract directory and end with "compiled_contract_class.json", with anything in between # ex : target/dev/groth16_example_bls12_381_Groth16VerifierBLS12_381.compiled_contract_class.json compiled_file=$(find "$target_dir" -type f -name "$(basename "$contract_dir")*.compiled_contract_class.json" -print -quit 2>/dev/null) if [[ -f "$compiled_file" ]]; then bytecode_length=$(jq '.bytecode | length' "$compiled_file" 2>/dev/null) if [[ -n "$bytecode_length" ]] && [[ "$bytecode_length" != "null" ]]; then # Color the output: use green for the bytecode length line echo -e "\e[32mBytecode length [$contract_dir] = $bytecode_length\e[0m" else echo "Error: Could not read bytecode length from $compiled_file" fi echo "----------------------------------------" else echo "Compiled contract class JSON not found in $contract_dir" echo "Searched in: $target_dir" echo "Pattern: $(basename "$contract_dir")*.compiled_contract_class.json" echo "----------------------------------------" fi } # List of contract directories contracts=( "autogenerated/groth16_example_bn254" "autogenerated/groth16_example_bls12_381" "autogenerated/noir_ultra_keccak_zk_honk_example" "universal_ecip" "drand_quicknet" "autogenerated/risc0_verifier_bn254" ) # Run sequentially - this is reliable and fast enough for contract in "${contracts[@]}"; do check_bytecode_length "$contract" done ================================================ FILE: tools/make/bytecode_check_max_log_n.sh ================================================ #!/bin/bash echo "Cleaning up max log n contracts" rm -rf src/contracts/autogenerated/ultra_keccak_zk_honk_max_log_n echo "Generating max log n contracts" python hydra/garaga/starknet/honk_contract_generator/generator_honk.py --max-log-n cd src/contracts echo "----------------------------------------" echo "Checking bytecode length" # Maximum allowed bytecode length MAX_BYTECODE_LENGTH=81290 # Adjust this value as needed # Function to get bytecode length get_bytecode_length() { local contract_dir=$1 local bytecode_length=0 cd "$contract_dir" || return 1 # Redirect scarb build output to /dev/null to avoid mixing with our output scarb build > /dev/null 2>&1 # Find the compiled contract class JSON file compiled_file=$(find ./target/dev -name '*.compiled_contract_class.json' -print -quit) if [[ -f "$compiled_file" ]]; then bytecode_length=$(jq '.bytecode | length' "$compiled_file") else echo "Error: Compiled contract class JSON not found in $contract_dir" >&2 cd ../ return 1 fi cd ../ echo "$bytecode_length" return 0 } # Function to print bytecode length print_bytecode_length() { local contract_dir=$1 local length=$2 echo -e "\e[32mBytecode length [$contract_dir] = $length (max: $MAX_BYTECODE_LENGTH)\e[0m" echo "----------------------------------------" } # List of contract directories contracts=( "autogenerated/ultra_keccak_zk_honk_max_log_n" ) # Check each contract results=() for contract in "${contracts[@]}"; do length=$(get_bytecode_length "$contract") if [ $? -eq 0 ]; then print_bytecode_length "$contract" "$length" results+=("$length") else echo "Error checking bytecode length for $contract" >&2 exit 1 fi done # Check if all bytecode lengths are below the limit all_below_limit=true for length in "${results[@]}"; do if [ "$length" -gt "$MAX_BYTECODE_LENGTH" ]; then all_below_limit=false break fi done rm -rf autogenerated/ultra_keccak_zk_honk_max_log_n # Return true/false based on the check if [ "$all_below_limit" = true ]; then echo "true" exit 0 else echo "false" exit 1 fi ================================================ FILE: tools/make/check_sierra_size.py ================================================ import json data = json.load( open("src/cairo/target/dev/garaga_contracts_Garaga.contract_class.json") ) print(len(data["sierra_program"])) ================================================ FILE: tools/make/ci_cairo.sh ================================================ #!/bin/bash source $(dirname "$0")/common.sh run_ci_workflow ".github/workflows/cairo.yml" ================================================ FILE: tools/make/ci_e2e.sh ================================================ #!/bin/bash source $(dirname "$0")/common.sh run_ci_workflow ".github/workflows/e2e.yml" ================================================ FILE: tools/make/ci_hydra.sh ================================================ #!/bin/bash source $(dirname "$0")/common.sh run_ci_workflow ".github/workflows/hydra.yml" ================================================ FILE: tools/make/ci_wasm.sh ================================================ #!/bin/bash source $(dirname "$0")/common.sh run_ci_workflow ".github/workflows/wasm.yml" ================================================ FILE: tools/make/common.sh ================================================ #!/bin/bash # Function to check for 'act' or 'gh act' and execute the appropriate command run_ci_workflow() { local workflow_file=$1 if command -v act &> /dev/null then act -W $workflow_file --secret-file .secrets elif command -v gh &> /dev/null && gh act --version &> /dev/null then gh act -W $workflow_file --secret-file .secrets else echo "Error: Neither 'act' nor 'gh act' command found. Please install one of them to proceed." exit 1 fi } ================================================ FILE: tools/make/constants.json ================================================ { "risc0": { "control_root": "0xCE52BF56033842021AF3CF6DB8A50D1B7535C125A34F1A22C6FDCF002C5A1529", "bn254_control_id": "0x04446E66D300EB7FB45C9726BB53C793DDA407A62E9601618BB43C5C14657AC0", "system_state_zero_digest": "0xA3ACC27117418996340B84E5A90F3EF4C49D22C79E44AAD822EC9C313E1EB8E2", "tag_digest": "0xcb1fefcd1f2d9a64975cbbbf6e161e2914434b0cbb9960b84df5d717e86b48af", "output_tag": "0x77eafeb366a78b47747de0d7bb176284085ff5564887009a5be63da32d3559d4" }, "sp1": { "verifier_version": "v5.0.0", "verifier_hash": "0xa4594c59bbc142f3b81c3ecb7f50a7c34bc9af7c4c444b5d48b795427e285913" }, "release_info": { "garaga_version": "1.1.0", "risc0_release": "v2.2.2", "cairo_version": "2.16.1", "starknet_foundry_version": "0.57.0" }, "noir": { "bb_version": "3.0.0-nightly.20251104", "bbup_version": "3.0.0-nightly.20251104", "nargo_version": "1.0.0-beta.16" } } ================================================ FILE: tools/make/generate_constants.py ================================================ #!/usr/bin/env python3 """ Generate language-specific constants from constants.json and sync version numbers across files. """ import json import logging import os import re import subprocess import sys from dataclasses import dataclass from pathlib import Path from typing import Any, Dict, Optional, Protocol from garaga.starknet.groth16_contract_generator.parsing_utils import Groth16VerifyingKey class FormatterProtocol(Protocol): """Protocol for code formatters.""" def format_file(self, file_path: str, cwd: Optional[str] = None) -> bool: """Format a file. Returns True if successful, False otherwise.""" ... class SubprocessFormatter: """Formatter that uses external subprocess commands.""" def __init__(self, cmd: list[str], name: str): self.cmd = cmd self.name = name def format_file(self, file_path: str, cwd: Optional[str] = None) -> bool: """Format a file using subprocess command.""" print(f"Formatting {file_path} with {self.name}") try: cmd = self.cmd + [file_path] subprocess.run(cmd, check=True, capture_output=True, text=True, cwd=cwd) logger.info(f"Successfully formatted with {self.name}") return True except subprocess.CalledProcessError as e: logger.warning(f"{self.name} formatting failed: {e.stderr}") return False except FileNotFoundError: logger.warning(f"{self.name} not found - skipping formatting") return False except Exception as e: logger.warning(f"Unexpected error running {self.name}: {e}") return False from rich.logging import RichHandler # Configure logging with rich for color-based level printing logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", handlers=[ RichHandler(), ], ) logger = logging.getLogger(__name__) class ConstantsError(Exception): """Base exception for constants generation errors.""" class VKError(ConstantsError): """Raised when verification key processing fails.""" @dataclass(frozen=True) class UpdateConfig: """Configuration for version update operations.""" name: str pattern: str replacement: str description: str = "" version_key: str = ( "garaga_version" # Default to garaga_version for backward compatibility ) def apply_update(self, content: str, version: str) -> tuple[str, bool]: """Apply the update to content and return (new_content, changed).""" replacement = self.replacement.replace("{version}", version) new_content = re.sub(self.pattern, replacement, content) return new_content, content != new_content @dataclass(frozen=True) class VKConfig: """Configuration for verification key updates.""" name: str json_filename: str function_name: str def get_json_path(self, project_root: Path) -> Path: return ( project_root / "hydra" / "garaga" / "starknet" / "groth16_contract_generator" / "examples" / self.json_filename ) def get_function_pattern(self) -> str: """Generate the regex pattern for this VK function.""" return ( f"(pub fn {self.function_name}\\(\\) -> Groth16VerificationKey \\{{\\s*let vk_hex = \\[)" "([\\s\\S]*?)" "(\\];\\s*Groth16VerificationKey::from\\([\\s\\S]*?\\}\\s*\\})" ) # VK Configurations - simplified with pattern generation SP1_VK_CONFIG = VKConfig( name="SP1", json_filename="vk_sp1.json", function_name="get_sp1_vk", ) RISC0_VK_CONFIG = VKConfig( name="RISC0", json_filename="vk_risc0.json", function_name="get_risc0_vk", ) @dataclass(frozen=True) class PathConfig: """Configuration for all file paths used in the script.""" project_root: Path @property def python_output(self) -> Path: return self.project_root / "hydra" / "garaga" / "starknet" / "constants.py" @property def rust_output(self) -> Path: return self.project_root / "tools" / "garaga_rs" / "src" / "constants.rs" @property def typescript_output(self) -> Path: return ( self.project_root / "tools" / "npm" / "garaga_ts" / "src" / "constants.ts" ) @property def readme_path(self) -> Path: return self.project_root / "docs" / "PYPI_README.md" @property def pyproject_path(self) -> Path: return self.project_root / "pyproject.toml" @property def garaga_rs_cargo_path(self) -> Path: return self.project_root / "tools" / "garaga_rs" / "Cargo.toml" @property def package_json_path(self) -> Path: return self.project_root / "tools" / "npm" / "garaga_ts" / "package.json" @property def npm_readme_path(self) -> Path: return self.project_root / "tools" / "npm" / "garaga_ts" / "README.md" @property def noir_smart_contract_docs_path(self) -> Path: return ( self.project_root / "docs" / "gitbook" / "smart-contract-generators" / "noir.md" ) @property def groth16_rust_file(self) -> Path: return ( self.project_root / "tools" / "garaga_rs" / "src" / "calldata" / "full_proof_with_hints" / "groth16.rs" ) # File path to update config mappings VERSION_UPDATES = [ ( "PYPI README", "readme_path", UpdateConfig( name="PYPI README", pattern=r"(pip\s+install\s+garaga==)[\d]+\.[\d]+\.[\d]+(?:[\w\-\.]*)?", replacement=r"\g<1>{version}", description="pip install commands", ), ), ( "pyproject.toml", "pyproject_path", UpdateConfig( name="pyproject.toml", pattern=r'(version\s*=\s*["\'])[\d]+\.[\d]+\.[\d]+(?:[\w\-\.]*)?(["\'])', replacement=r"\g<1>{version}\g<2>", description="Python package version", ), ), ( "Cargo.toml", "garaga_rs_cargo_path", UpdateConfig( name="Cargo.toml", pattern=r'(\[package\].*?^version\s*=\s*["\'])[\d]+\.[\d]+\.[\d]+(?:[\w\-\.]*)?(["\'])', replacement=r"\g<1>{version}\g<2>", description="Rust package version", ), ), ( "package.json", "package_json_path", UpdateConfig( name="package.json", pattern=r'("version"\s*:\s*["\'])[\d]+\.[\d]+\.[\d]+(?:[\w\-\.]*)?(["\'])', replacement=r"\g<1>{version}\g<2>", description="NPM package version", ), ), ( "npm README", "npm_readme_path", UpdateConfig( name="npm README", pattern=r"(📋 \*\*For complete API documentation.*?)v[\d]+\.[\d]+\.[\d]+(?:[\w\-\.]*)?(/tools/npm/garaga_ts/src/node/api\.ts)", replacement=r"\g<1>v{version}\g<2>", description="API documentation links", ), ), ( "Noir version in smart contract docs", "noir_smart_contract_docs_path", UpdateConfig( name="Noir version in smart contract docs", pattern=r"(\* Noir\s+)[\d]+\.[\d]+\.[\d]+[-\w\.]*(\s+\(install with `noirup --version\s+)[\d]+\.[\d]+\.[\d]+[-\w\.]*(`\s+or `npm i @noir-lang/noir_js@)[\d]+\.[\d]+\.[\d]+[-\w\.]*(`\s*\))", replacement=r"\g<1>{version}\g<2>{version}\g<3>{version}\g<4>", description="Noir version in smart contract generator documentation", version_key="nargo_version", ), ), ( "BB version in smart contract docs", "noir_smart_contract_docs_path", UpdateConfig( name="BB version in smart contract docs", pattern=r"(\* Barretenberg\s+)[\d]+\.[\d]+\.[\d]+[-\w\.]*(\s+\(install with `bbup --version\s+)[\d]+\.[\d]+\.[\d]+[-\w\.]*(`\s+or `npm i @aztec/bb\.js@)[\d]+\.[\d]+\.[\d]+[-\w\.]*(`\s+\))", replacement=r"\g<1>{version}\g<2>{version}\g<3>{version}\g<4>", description="Barretenberg version in smart contract generator documentation", version_key="bb_version", ), ), ] VK_UPDATES = [ ("SP1 VK in Rust", SP1_VK_CONFIG), ("RISC0 VK in Rust", RISC0_VK_CONFIG), ] def load_constants() -> Dict[str, Any]: """Load constants from the centralized JSON file.""" constants_file = Path(__file__).parent / "constants.json" try: if not constants_file.exists(): raise ConstantsError(f"Constants file not found: {constants_file}") with open(constants_file, "r") as f: constants = json.load(f) # Basic validation required_keys = ["risc0", "sp1", "release_info", "noir"] missing_keys = [key for key in required_keys if key not in constants] if missing_keys: raise ConstantsError( f"Missing required keys in constants.json: {missing_keys}" ) logger.info(f"Successfully loaded constants from {constants_file}") return constants except (json.JSONDecodeError, IOError) as e: raise ConstantsError(f"Failed to load constants from {constants_file}: {e}") except Exception as e: raise ConstantsError(f"Unexpected error loading constants: {e}") @dataclass(frozen=True) class LanguageConfig: """Configuration for language-specific code generation.""" name: str comment_prefix: str constant_template: str formatter: FormatterProtocol # Language-specific configurations COMMON_FILE_HEADER = ( "Auto-generated constants file from constants.json. Do not edit manually." ) LANGUAGE_CONFIGS = [ LanguageConfig( name="Python", comment_prefix="#", constant_template="{name} = {value}", formatter=SubprocessFormatter(["black"], "black"), ), LanguageConfig( name="Rust", comment_prefix="//", constant_template="pub const {name}: &str = {value};", formatter=SubprocessFormatter(["cargo", "fmt", "--"], "cargo fmt"), ), LanguageConfig( name="TypeScript", comment_prefix="//", constant_template="export const {name}: string = {value};", formatter=SubprocessFormatter( ["npx", "prettier", "--write"], "prettier (ensure it's installed)" ), ), ] def hex_to_uint8array_literal(hex_str: str) -> str: """Convert a hex string like '0xABCD...' to 'new Uint8Array([0xAB, 0xCD, ...])'.""" raw = hex_str.removeprefix("0x").removeprefix("0X") byte_values = [f"0x{raw[i:i+2].upper()}" for i in range(0, len(raw), 2)] # Format in rows of 16 for readability rows = [] for i in range(0, len(byte_values), 16): rows.append(" " + ", ".join(byte_values[i : i + 16])) return "new Uint8Array([\n" + ",\n".join(rows) + "\n])" def safe_read_file(file_path: str) -> str: """Safely read a file with proper error handling.""" try: with open(file_path, "r", encoding="utf-8") as f: return f.read() except IOError as e: raise ConstantsError(f"Failed to read {file_path}: {e}") def safe_write_file(file_path: str, content: str) -> None: """Safely write to a file with proper error handling.""" try: os.makedirs(os.path.dirname(file_path), exist_ok=True) with open(file_path, "w", encoding="utf-8") as f: f.write(content) except IOError as e: raise ConstantsError(f"Failed to write {file_path}: {e}") def generate_unified_constants( constants: Dict[str, Any], config: LanguageConfig ) -> str: """Generate constants file content using unified template.""" # Build content sections lines = [] # File header if config.name == "Python": lines.extend(['"""', COMMON_FILE_HEADER, '"""', ""]) elif config.name == "TypeScript": lines.extend( ["/**", " * " + COMMON_FILE_HEADER.replace("\n", "\n * "), " */", ""] ) else: # Rust lines.extend([f"//! {line}" for line in COMMON_FILE_HEADER.split("\n")] + [""]) # Add Rust-specific imports if config.name == "Rust": lines.extend(["use num_bigint::BigUint;", "use num_traits::Num;", ""]) # RISC0 section risc0_info = constants["risc0"] release_version = constants["release_info"]["risc0_release"] lines.extend( [ f"{config.comment_prefix} RISC0 Constants", f"{config.comment_prefix} https://github.com/risc0/risc0-ethereum/blob/{release_version}/contracts/src/groth16/ControlID.sol", f"{config.comment_prefix} release {release_version}", ] ) if config.name == "Rust": lines.extend( [ "pub fn get_risc0_constants() -> (BigUint, BigUint) {", f' let risc0_control_root = BigUint::from_str_radix("{risc0_info["control_root"][2:]}", 16).unwrap();', f' let risc0_bn254_control_id = BigUint::from_str_radix("{risc0_info["bn254_control_id"][2:]}", 16).unwrap();', " (risc0_control_root, risc0_bn254_control_id)", "}", ] ) elif config.name == "TypeScript": lines.extend( [ f'export const RISC0_CONTROL_ROOT = BigInt("{risc0_info["control_root"]}");', f'export const RISC0_BN254_CONTROL_ID = BigInt("{risc0_info["bn254_control_id"]}");', ] ) else: # Python lines.extend( [ f'RISC0_CONTROL_ROOT = {risc0_info["control_root"]}', f'RISC0_BN254_CONTROL_ID = {risc0_info["bn254_control_id"]}', ] ) lines.append("") # SP1 section sp1_info = constants["sp1"] lines.extend( [ f"{config.comment_prefix} SP1 Constants", f"{config.comment_prefix} https://github.com/succinctlabs/sp1-contracts/blob/main/contracts/src/{sp1_info['verifier_version']}/SP1VerifierGroth16.sol", ] ) if config.name == "Python": lines.extend( [ f'SP1_VERIFIER_VERSION = "{sp1_info["verifier_version"]}"', f'SP1_VERIFIER_HASH = bytes.fromhex("{sp1_info["verifier_hash"][2:]}")', ] ) elif config.name == "TypeScript": lines.extend( [ f'export const SP1_VERIFIER_VERSION = "{sp1_info["verifier_version"]}";', f'export const SP1_VERIFIER_HASH = "{sp1_info["verifier_hash"]}";', ] ) else: # Rust lines.extend( [ f'pub const SP1_VERIFIER_VERSION: &str = "{sp1_info["verifier_version"]}";', f'pub const SP1_VERIFIER_HASH: &str = "{sp1_info["verifier_hash"]}";', ] ) lines.append("") # Additional constants lines.extend( [ f"{config.comment_prefix} Additional RISC0 constants for internal use", ] ) if config.name == "Python": lines.extend( [ f'RISC0_SYSTEM_STATE_ZERO_DIGEST = "{risc0_info["system_state_zero_digest"]}"', f'RISC0_TAG_DIGEST = "{risc0_info["tag_digest"]}"', f'RISC0_OUTPUT_TAG = "{risc0_info["output_tag"]}"', f'RISC0_RELEASE_VERSION = "{constants["release_info"]["risc0_release"]}"', ] ) elif config.name == "TypeScript": lines.extend( [ f'export const RISC0_SYSTEM_STATE_ZERO_DIGEST = {hex_to_uint8array_literal(risc0_info["system_state_zero_digest"])};', f'export const RISC0_TAG_DIGEST = "{risc0_info["tag_digest"]}";', f'export const RISC0_OUTPUT_TAG = "{risc0_info["output_tag"]}";', ] ) else: # Rust lines.extend( [ f'pub const RISC0_SYSTEM_STATE_ZERO_DIGEST: &str = "{risc0_info["system_state_zero_digest"]}";', f'pub const RISC0_TAG_DIGEST: &str = "{risc0_info["tag_digest"]}";', f'pub const RISC0_OUTPUT_TAG: &str = "{risc0_info["output_tag"]}";', ] ) if config.name == "Python": release_info = constants["release_info"] noir_info = constants["noir"] lines.extend( [ "", f"{config.comment_prefix} Version info", f'CAIRO_VERSION = "{release_info["cairo_version"]}"', f'STARKNET_FOUNDRY_VERSION = "{release_info["starknet_foundry_version"]}"', f'BB_VERSION = "{noir_info["bb_version"]}"', f'BBUP_VERSION = "{noir_info["bbup_version"]}"', f'NARGO_VERSION = "{noir_info["nargo_version"]}"', ] ) return "\n".join(lines) + "\n" def generate_language_constants( constants: Dict[str, Any], config: LanguageConfig, output_path: str ) -> None: """Generate constants file for a specific language.""" try: content = generate_unified_constants(constants, config) safe_write_file(output_path, content) # Format if formatter available if config.formatter: cwd = os.path.dirname(output_path) if config.name == "Rust" else None config.formatter.format_file(output_path, cwd) logger.info(f"Generated {config.name} constants: {output_path}") except Exception as e: raise ConstantsError(f"Failed to generate {config.name} constants: {e}") def generate_constants_by_language( constants: Dict[str, Any], language: str, output_path: str ): """Generate constants file for a specific language by name.""" # Find language config config = next((cfg for cfg in LANGUAGE_CONFIGS if cfg.name == language), None) if not config: raise ConstantsError(f"Unknown language: {language}") generate_language_constants(constants, config, output_path) def update_file_version(file_path: str, config: UpdateConfig, version: str) -> bool: """Generic file version update function.""" try: if not Path(file_path).exists(): logger.warning(f"{config.name} file not found: {file_path}") return False content = safe_read_file(file_path) new_content, changed = config.apply_update(content, version) if not changed: logger.info(f"No {config.name} update needed (already {version})") return True safe_write_file(file_path, new_content) logger.info(f"Updated {config.name} to version {version}") return True except Exception as e: raise ConstantsError(f"Failed to update {config.name}: {e}") def update_vk_in_rust( project_root: Path, groth16_rust_file: str, config: VKConfig ) -> bool: """Update verification key function in Rust with values from JSON.""" try: # Load and parse VK vk_path = config.get_json_path(project_root) if not vk_path.exists(): raise ConstantsError(f"{config.name} VK file not found at {vk_path}") try: vk = Groth16VerifyingKey.from_json(vk_path) logger.info(f"Successfully loaded {config.name} VK from {vk_path}") except Exception as e: raise VKError(f"Failed to parse {config.name} VK: {e}") # Process VK data hex_values = [hex(value)[2:] for value in vk.flatten()] # Format hex array hex_lines = [] for i in range(0, len(hex_values), 4): line_values = hex_values[i : i + 4] formatted_line = " " + ", ".join(f'"{val}"' for val in line_values) hex_lines.append(formatted_line) new_hex_array = ",\n".join(hex_lines) + "," # Update file content = safe_read_file(groth16_rust_file) match = re.search(config.get_function_pattern(), content) if not match: raise VKError(f"Could not find {config.name} VK function pattern") new_content = re.sub( config.get_function_pattern(), f"\\g<1>\n{new_hex_array}\n \\g<3>", content, ) if content == new_content: logger.info(f"No {config.name} VK update needed - already current") return True safe_write_file(groth16_rust_file, new_content) logger.info( f"Updated {config.name} verification key ({len(hex_values)} values)" ) # Format with cargo rust_config = next( (cfg for cfg in LANGUAGE_CONFIGS if cfg.name == "Rust"), None ) if rust_config: rust_config.formatter.format_file( groth16_rust_file, os.path.dirname(groth16_rust_file) ) return True except (VKError, ConstantsError): raise except Exception as e: raise VKError(f"Unexpected error updating {config.name} VK: {e}") finally: if str(project_root / "hydra") in sys.path: sys.path.remove(str(project_root / "hydra")) def report_results(all_results: list[tuple[str, bool]]) -> int: """Report operation results and return exit code.""" failed = [result for result in all_results if not result[1]] successful = [result for result in all_results if result[1]] logger.info( f"Operations completed: {len(successful)}/{len(all_results)} successful" ) if successful: logger.info("Successful operations:") for result in successful: logger.info(f" ✓ {result[0]}") if failed: logger.warning("Failed operations:") for result in failed: logger.warning(f" ✗ {result[0]}") logger.warning(f"{len(failed)} operations failed") return 1 else: logger.info("All constants files and version references updated successfully!") return 0 def generate_all_constants(constants: Dict[str, Any], paths: PathConfig) -> None: """Generate constants files for all languages.""" generate_constants_by_language(constants, "Python", str(paths.python_output)) generate_constants_by_language(constants, "Rust", str(paths.rust_output)) generate_constants_by_language( constants, "TypeScript", str(paths.typescript_output) ) logger.info("Successfully generated all constants files") def update_all_versions( constants: Dict[str, Any], paths: PathConfig ) -> list[tuple[str, bool]]: """Update version references across all files.""" results = [] for mapping in VERSION_UPDATES: try: file_path = str(getattr(paths, mapping[1])) config = mapping[2] # Get the appropriate version based on the version_key if config.version_key == "nargo_version": version = constants["noir"]["nargo_version"] elif config.version_key == "bb_version": version = constants["noir"]["bb_version"] else: version = constants["release_info"]["garaga_version"] success = update_file_version(file_path, config, version) results.append((mapping[0], success)) if success: logger.info(f"Successfully updated {mapping[0]}") else: logger.warning(f"No updates needed for {mapping[0]}") except Exception as e: logger.error(f"Failed to update {mapping[0]}: {e}") results.append((mapping[0], False)) return results def update_verification_keys(paths: PathConfig) -> list[tuple[str, bool]]: """Update verification keys in Rust code.""" results = [] for mapping in VK_UPDATES: try: success = update_vk_in_rust( paths.project_root, str(paths.groth16_rust_file), mapping[1], ) results.append((mapping[0], success)) if success: logger.info(f"Successfully updated {mapping[0]}") except (VKError, ConstantsError) as e: logger.error(f"Failed to update {mapping[0]}: {e}") results.append((mapping[0], False)) except Exception as e: logger.error(f"Unexpected error updating {mapping[0]}: {e}") results.append((mapping[0], False)) return results def main(): """Main function to generate all constants files and update version references.""" try: logger.info("Starting constants generation and version updates...") # Load and validate constants constants = load_constants() # Define output paths project_root = Path(__file__).parent.parent.parent paths = PathConfig(project_root) # Generate constants files generate_all_constants(constants, paths) # Update version references and verification keys logger.info("Updating version references...") version_results = update_all_versions(constants, paths) logger.info("Updating verification keys...") vk_results = update_verification_keys(paths) # Report results and return appropriate exit code all_results = version_results + vk_results return report_results(all_results) except ConstantsError as e: logger.error(f"Constants error: {e}") return 1 except Exception as e: logger.error(f"Unexpected error in main: {e}") return 1 if __name__ == "__main__": exit_code = main() sys.exit(exit_code) ================================================ FILE: tools/make/rewrite.sh ================================================ #!/bin/bash set -e clean_dirs() { rm -rf src/src/circuits/*.cairo rm -rf src/contracts/autogenerated/* } run_generators() { python hydra/garaga/starknet/honk_contract_generator/generator_honk.py python hydra/garaga/precompiled_circuits/all_circuits.py python hydra/garaga/starknet/groth16_contract_generator/generator.py python hydra/garaga/starknet/groth16_contract_generator/generator_risc0.py python hydra/garaga/starknet/groth16_contract_generator/generator_sp1.py } clean_dirs start_time=$(date +%s) if [ "$1" = "no-tests" ]; then run_generators else rm -rf src/src/tests/autogenerated/* run_generators python hydra/garaga/starknet/tests_and_calldata_generators/test_writer.py fi elapsed=$(($(date +%s) - start_time)) echo "Total time taken: ${elapsed} seconds" ================================================ FILE: tools/make/setup.sh ================================================ #!/bin/bash set -euo pipefail PYTHON_VERSION_TARGET="3.14" # Function to install GNU parallel install_parallel() { case "$OSTYPE" in linux-gnu*) # Linux if command -v apt-get >/dev/null; then # Debian/Ubuntu sudo apt-get install -y parallel elif command -v dnf >/dev/null; then # Fedora sudo dnf install -y parallel else echo "Unsupported Linux distribution for automatic parallel installation." exit 1 fi ;; darwin*) # macOS if command -v brew >/dev/null; then brew install parallel else echo "Homebrew is not installed. Please install Homebrew and try again." exit 1 fi ;; *) echo "Unsupported operating system for automatic parallel installation." exit 1 ;; esac } # Function to install GMP (required by fastecdsa) install_gmp() { case "$OSTYPE" in linux-gnu*) if command -v apt-get >/dev/null; then sudo apt-get install -y libgmp-dev elif command -v dnf >/dev/null; then sudo dnf install -y gmp-devel else echo "Unsupported Linux distribution for automatic GMP installation." echo "Please install GMP manually: https://pypi.org/project/fastecdsa/#installing" exit 1 fi ;; darwin*) if command -v brew >/dev/null; then brew install gmp else echo "Homebrew is not installed. Please install Homebrew and try again." exit 1 fi ;; *) echo "Unsupported operating system for automatic GMP installation." echo "Please install GMP manually: https://gmplib.org/" exit 1 ;; esac } # Function to install cmake (required by crypto-cpp-py) install_cmake() { case "$OSTYPE" in linux-gnu*) if command -v apt-get >/dev/null; then sudo apt-get install -y cmake elif command -v dnf >/dev/null; then sudo dnf install -y cmake else echo "Unsupported Linux distribution for automatic cmake installation." exit 1 fi ;; darwin*) if command -v brew >/dev/null; then brew install cmake else echo "Homebrew is not installed. Please install Homebrew and try again." exit 1 fi ;; *) echo "Unsupported operating system for automatic cmake installation." exit 1 ;; esac } # Ensure uv is available (installs if missing) ensure_uv() { if command -v uv >/dev/null 2>&1; then return 0 fi echo "Installing uv..." curl -LsSf https://astral.sh/uv/install.sh | sh export PATH="$HOME/.local/bin:$PATH" } # Find or install a suitable Python version (3.10-3.14) find_python() { # If PYTHON_VERSION env var is set, use that specific version if [ -n "${PYTHON_VERSION:-}" ]; then PYTHON_VERSION_TARGET="$PYTHON_VERSION" fi # Try to find it on PATH first for version in $PYTHON_VERSION_TARGET 3.14 3.13 3.12 3.11 3.10; do if command -v "python${version}" >/dev/null 2>&1; then echo "python${version}" return 0 fi done # Fall back to python3 if it's in the right version range if command -v python3 >/dev/null 2>&1; then local py_version py_version=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')") case "$py_version" in 3.10|3.11|3.12|3.13|3.14) echo "python3" return 0 ;; esac fi # Not found — use uv to install it echo "Python ${PYTHON_VERSION_TARGET} not found. Installing via uv..." >&2 ensure_uv uv python install "$PYTHON_VERSION_TARGET" >&2 local uv_python uv_python=$(uv python find "$PYTHON_VERSION_TARGET" 2>/dev/null || true) if [ -n "$uv_python" ]; then echo "$uv_python" return 0 fi return 1 } # Check if existing venv is valid and matches expected Python version range venv_is_valid() { [ -f "venv/bin/python" ] || return 1 local py_version py_version=$(venv/bin/python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" 2>/dev/null) || return 1 case "$py_version" in 3.10|3.11|3.12|3.13|3.14) return 0 ;; *) return 1 ;; esac } # Check if parallel is installed, if not, attempt to install it if ! command -v parallel >/dev/null; then echo "GNU parallel not found. Attempting to install..." install_parallel else echo "GNU parallel is already installed." fi # Check if GMP is installed (required by fastecdsa) gmp_found=false case "$OSTYPE" in linux-gnu*) # Check for the development headers (gmp.h), not just the runtime library if [ -f /usr/include/gmp.h ] \ || pkg-config --exists gmp 2>/dev/null; then gmp_found=true fi ;; darwin*) # Use formula-specific prefix (works even if formula is unlinked) if command -v brew >/dev/null 2>&1; then GMP_PREFIX=$(brew --prefix gmp 2>/dev/null || true) if [ -n "$GMP_PREFIX" ] && [ -f "${GMP_PREFIX}/include/gmp.h" ]; then gmp_found=true fi fi ;; esac if [ "$gmp_found" = false ]; then echo "GMP not found. Attempting to install (required by fastecdsa)..." install_gmp else echo "GMP is already installed." fi # Check if cmake is installed (required by crypto-cpp-py) if ! command -v cmake >/dev/null; then echo "cmake not found. Attempting to install (required by crypto-cpp-py)..." install_cmake else echo "cmake is already installed." fi ensure_uv if venv_is_valid; then echo "Existing venv is valid ($(venv/bin/python --version)). Updating dependencies..." else # Clean up broken/outdated venv if [ -d "venv" ]; then echo "Removing invalid venv..." rm -rf venv fi # Find a suitable Python version (installs via uv if needed) PYTHON_CMD=$(find_python || true) if [ -z "$PYTHON_CMD" ]; then echo "No suitable Python version found and uv install failed." echo "Please install Python 3.10 through 3.14 manually." exit 1 fi echo "Using Python: $PYTHON_CMD ($($PYTHON_CMD --version))" # Create virtual environment using uv (no venv module needed) if ! uv venv --python "$PYTHON_CMD" venv; then echo "Failed to create virtual environment" exit 1 fi echo 'export PYTHONPATH="$PWD/hydra:$PWD:${PYTHONPATH:-}"' >> venv/bin/activate echo 'export PYTHONPYCACHEPREFIX="$PWD/venv/build/__pycache__"' >> venv/bin/activate fi echo "PROJECT_ROOT=$PWD" > .env echo "PYTHONPATH=$PWD/hydra" >> .env # For vscode python path when running in integrated terminal. source venv/bin/activate # On macOS, ensure compiler can find Homebrew-installed GMP if [[ "$OSTYPE" == darwin* ]] && command -v brew >/dev/null; then GMP_PREFIX=$(brew --prefix gmp 2>/dev/null || true) if [ -n "$GMP_PREFIX" ] && [ -d "${GMP_PREFIX}/include" ]; then export CFLAGS="-I${GMP_PREFIX}/include ${CFLAGS:-}" export LDFLAGS="-L${GMP_PREFIX}/lib ${LDFLAGS:-}" fi fi # Allow crypto-cpp-py's bundled googletest to build with newer cmake (>= 4.x) export CMAKE_POLICY_VERSION_MINIMUM=3.5 # crypto-cpp-py hardcodes a -target flag that conflicts with cmake's auto-detected # -mmacosx-version-min on macOS; suppress the resulting -Werror to let it build. if [[ "$OSTYPE" == darwin* ]]; then export CXXFLAGS="-Wno-overriding-option ${CXXFLAGS:-}" fi uv pip compile pyproject.toml --extra dev --output-file tools/make/requirements.txt -q uv pip install -r tools/make/requirements.txt # Install the commit hooks (black, isort) pre-commit install echo "Compiling garaga_rs Rust extension..." # Create target directory with proper permissions in the correct location mkdir -p .cargo/garaga_rs/target chmod 755 .cargo/garaga_rs/target # Build the Rust extension with Python feature enabled maturin develop --release --features python echo "All done!" # Check Scarb version and print warning if it's not cd src/ # To use the .tool-versions file with asdf. scarb_version=$(scarb --version 2>/dev/null || true) if ! echo "$scarb_version" | grep -q "2.16.1"; then echo "Warning: Scarb is not installed or its version is not 2.16.1." echo "Got: ${scarb_version:-}" echo "Please install Scarb 2.16.1 before continuing. https://docs.swmansion.com/scarb/download.html" fi ================================================ FILE: tools/make/steps.sh ================================================ cd src/cairo scarb test -f test_BN254_mpcheck_3P_2F --print-resource-usage ================================================ FILE: tools/make/test_contracts.sh ================================================ #!/usr/bin/env bash # Script to run snforge test in all autogenerated contract folders # Usage: ./tools/make/test_contracts.sh set -e # Get the directory where this script is located SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Get the repository root (two levels up from script location) REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" # Path to autogenerated contracts AUTOGEN_DIR="$REPO_ROOT/src/contracts/autogenerated" # Check if the autogenerated directory exists if [ ! -d "$AUTOGEN_DIR" ]; then echo "Error: Autogenerated directory not found at $AUTOGEN_DIR" exit 1 fi echo "Running snforge test in all autogenerated contract folders..." echo "========================================================" echo "" # Track success/failure FAILED_TESTS=() PASSED_TESTS=() # Iterate through each subdirectory in autogenerated for dir in "$AUTOGEN_DIR"/*/ ; do if [ -d "$dir" ]; then folder_name=$(basename "$dir") echo "Testing: $folder_name" echo "----------------------------------------" # Change to the directory and run snforge test if (cd "$dir" && snforge test); then PASSED_TESTS+=("$folder_name") echo "✓ $folder_name: PASSED" else FAILED_TESTS+=("$folder_name") echo "✗ $folder_name: FAILED" fi echo "" fi done # Print summary echo "========================================================" echo "Test Summary" echo "========================================================" echo "Passed: ${#PASSED_TESTS[@]}" for test in "${PASSED_TESTS[@]}"; do echo " ✓ $test" done if [ ${#FAILED_TESTS[@]} -gt 0 ]; then echo "" echo "Failed: ${#FAILED_TESTS[@]}" for test in "${FAILED_TESTS[@]}"; do echo " ✗ $test" done exit 1 else echo "" echo "All tests passed!" exit 0 fi ================================================ FILE: tools/make/update_bench_in_readme.py ================================================ import re import subprocess def run_benchmarks(): try: # Run benchmarks.py and capture its output result = subprocess.run( ["python", "tests/benchmarks.py"], capture_output=True, text=True, check=True, ) return result.stdout except subprocess.CalledProcessError as e: print(f"Error running benchmarks: {e.stderr}") return None def update_readme(benchmarks_markdown): if benchmarks_markdown is None: print("Skipping README update due to benchmark error.") return # Read the current README.md content with open("README.md", "r", encoding="utf-8") as file: readme_contents = file.read() # Define a pattern to find the Benchmarks section # Adjust the pattern as necessary to match your README's structure pattern = r"(## Benchmarks\n)(.*?)(\n## )" replacement = r"\1" + benchmarks_markdown + r"\3" # Replace the Benchmarks section with the new benchmarks updated_readme = re.sub(pattern, replacement, readme_contents, flags=re.DOTALL) # Write the updated README back to disk with open("README.md", "w", encoding="utf-8") as file: file.write(updated_readme) if __name__ == "__main__": benchmarks_markdown = run_benchmarks() update_readme(benchmarks_markdown) print(f"README updated with benchmarks: {benchmarks_markdown}") ================================================ FILE: tools/make/update_risc0_class_hash.sh ================================================ #!/bin/bash set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" RISC0_VERIFIER_DIR="$PROJECT_ROOT/src/contracts/autogenerated/risc0_verifier_bn254" FIBONACCI_SEQUENCER_FILE="$PROJECT_ROOT/src/contracts/risc0_sample_app/fibonacci_sequencer/src/lib.cairo" echo "Computing class hash for Risc0Groth16VerifierBN254..." OUTPUT=$(cd "$RISC0_VERIFIER_DIR" && sncast utils class-hash --contract-name Risc0Groth16VerifierBN254) CLASS_HASH=$(echo "$OUTPUT" | grep "Class Hash:" | awk '{print $3}') if [ -z "$CLASS_HASH" ]; then echo "Error: Could not parse class hash from sncast output: $OUTPUT" exit 1 fi # Strip leading zeros for Cairo format (0x0708... -> 0x708...) CAIRO_CLASS_HASH=$(echo "$CLASS_HASH" | sed 's/^0x0*/0x/') echo "Class hash: $CAIRO_CLASS_HASH" # Portable sed -i (macOS requires '' suffix, Linux does not) sed -i.bak "s|^\([[:space:]]*\)0x[0-9a-fA-F]\{1,64\};|\1$CAIRO_CLASS_HASH;|" "$FIBONACCI_SEQUENCER_FILE" rm -f "${FIBONACCI_SEQUENCER_FILE}.bak" scarb fmt "$FIBONACCI_SEQUENCER_FILE" echo "Updated RISC_ZERO_VERIFIER_CLASS_HASH in fibonacci_sequencer." ================================================ FILE: tools/make/wasm-test-gen.sh ================================================ cd tools/npm/integration-test-suite rm -rf node_modules package-lock.json && npm cache clean --force && npm install garaga.tgz # Uses turbo to build all packages first, then run test-generate sequentially # (--concurrency 1 because web packages share port 8080) npm run test-generate ================================================ FILE: tools/make/wasm.sh ================================================ #!/bin/bash start_docker() { local os_type=$1 echo "Attempting to start Docker daemon..." case "$os_type" in "macos") echo "Please start Docker Desktop manually for macOS" echo "Cannot automatically start Docker Desktop due to security restrictions" exit 1 ;; "fedora") read -p "Docker daemon is not running. Would you like to start it? (y/N) " response if [[ "$response" =~ ^[Yy]$ ]]; then if command -v sudo >/dev/null 2>&1; then echo "Starting Docker daemon..." sudo systemctl start docker # Wait for Docker to be ready echo "Waiting for Docker to be ready..." sleep 3 else echo "Error: sudo is not available. Please start Docker manually:" echo "sudo systemctl start docker" exit 1 fi else echo "Please start Docker manually when ready" exit 1 fi ;; "debian") read -p "Docker daemon is not running. Would you like to start it? (y/N) " response if [[ "$response" =~ ^[Yy]$ ]]; then if command -v sudo >/dev/null 2>&1; then echo "Starting Docker daemon..." sudo systemctl start docker # Wait for Docker to be ready echo "Waiting for Docker to be ready..." sleep 3 else echo "Error: sudo is not available. Please start Docker manually:" echo "sudo systemctl start docker" exit 1 fi else echo "Please start Docker manually when ready" exit 1 fi ;; *) echo "Unsupported operating system. Please start Docker daemon manually" exit 1 ;; esac } check_docker() { if ! docker info >/dev/null 2>&1; then echo "Docker daemon is not running." # Detect OS and try to start Docker if [[ "$OSTYPE" == "darwin"* ]]; then start_docker "macos" elif [ -f /etc/fedora-release ]; then start_docker "fedora" elif [ -f /etc/debian_version ] || [ -f /etc/lsb-release ]; then start_docker "debian" else echo "Unsupported operating system. Please start Docker daemon manually" exit 1 fi # Double check if Docker started successfully if ! docker info >/dev/null 2>&1; then echo "Failed to start Docker daemon" exit 1 fi fi echo "Docker daemon is running" } # Check if Docker is running and start if needed check_docker cd tools/npm/garaga_ts docker compose up --build cd ../integration-test-suite GARAGA_VERSION=$(jq -r '.release_info.garaga_version' ../../make/constants.json) cp ../garaga_ts/garaga-$GARAGA_VERSION.tgz garaga.tgz npm install garaga.tgz ================================================ FILE: tools/noir/Makefile ================================================ # ============================================================================== # Solidity Verifier Debugging # ============================================================================== # Run the Solidity ZK Honk verifier with the test proof and log variables. # This is useful for comparing intermediate values with the Python implementation. # # Prerequisites: # 1. Install Foundry: curl -L https://foundry.paradigm.xyz | bash && foundryup # 2. Install forge-std: forge install foundry-rs/forge-std --no-commit # # Usage: # make sol-verify-debug # Run with full logging # make sol-verify-debug-detailed # Run with detailed proof parsing # # To add custom logging, edit tools/noir/hello/target/contract_ultra_keccak_zk.sol: # 1. Add: import "forge-std/console.sol"; # 2. Add: console.log("varName:", value); or console.log("Fr:", Fr.unwrap(frValue)); # 3. Run: make sol-verify-debug # # See tools/noir/hello/README.md for more details. # ============================================================================== sol-verify-debug: @echo "=== Running Solidity ZK Honk Verifier Test ===" @echo "See tools/noir/hello/README.md for how to add custom logging" @echo "" cd hello && forge test -vv --match-test testVerifyProof sol-verify-debug-verbose: @echo "=== Running Solidity ZK Honk Verifier Test (verbose) ===" cd hello && forge test -vvvv --match-test testVerifyProof sol-verify-debug-detailed: @echo "=== Running Detailed Proof Parsing Test ===" cd hello && forge test -vv --match-test testVerifyProofWithDetailedLogging sol-verify-setup: @echo "=== Setting up Foundry for Solidity testing ===" @if [ -d "hello/lib/forge-std" ]; then \ echo "forge-std already installed"; \ else \ cd hello && forge install foundry-rs/forge-std --no-git; \ fi @echo "Setup complete! Now run: make sol-verify-debug" ================================================ FILE: tools/noir/hello/Nargo.toml ================================================ [package] name = "hello" type = "bin" authors = [""] [dependencies] ================================================ FILE: tools/noir/hello/Prover.toml ================================================ x = "1" y = "2" ================================================ FILE: tools/noir/hello/src/main.nr ================================================ fn main(x: u64, y: pub u64) { assert(x != y); } #[test] fn test_main() { main(1, 2); // Uncomment to make test fail // main(1, 1); } ================================================ FILE: tools/noir/run.sh ================================================ reset() { rm -rf hello/ nargo new hello cd hello nargo check cat << EOF > Prover.toml x = "1" y = "2" EOF nargo execute witness cd ../ } # Setup Foundry for testing the generated Solidity verifier setup_foundry() { cd hello # Create foundry.toml configuration cat << 'EOF' > foundry.toml # Foundry configuration for testing the Honk verifier [profile.default] src = "target" out = "out" libs = ["lib"] test = "test" # Enable optimizer for faster execution optimizer = true optimizer_runs = 200 # Increase memory limit for large proof verification memory_limit = 134217728 # 128MB # Show more output verbosity = 3 # EVM version evm_version = "cancun" # Allow reading binary files for proof verification tests fs_permissions = [{ access = "read", path = "./target" }] [fuzz] runs = 256 EOF # Create test directory mkdir -p test # Create the Foundry test file cat << 'EOF' > test/VerifierTest.t.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; import "forge-std/Test.sol"; import "forge-std/console.sol"; // Import the verifier contract import "../target/contract_ultra_keccak_zk.sol"; /** * @title VerifierTest * @notice Test contract for debugging the ZK Honk verifier * @dev This test loads the proof from binary files and verifies it, * logging intermediate values for comparison with Python implementation. * * HOW TO RUN: * From the project root: * make sol-verify-debug * * Or manually from tools/noir/hello/: * forge test -vvvv --match-test testVerifyProof * * HOW TO ADD MORE LOGGING: * 1. Import console.sol in the contract you want to debug * 2. Add console.log() calls, e.g.: * console.log("variableName:", value); * console.log("Fr value:", Fr.unwrap(someField)); * 3. Run with -vvvv for maximum verbosity */ contract VerifierTest is Test { HonkVerifier verifier; function setUp() public { verifier = new HonkVerifier(); console.log("=== Verifier deployed ==="); console.log("VK_HASH:", VK_HASH); console.log("N:", N); console.log("LOG_N:", LOG_N); console.log("NUMBER_OF_PUBLIC_INPUTS:", NUMBER_OF_PUBLIC_INPUTS); } function testVerifyProof() public { console.log("\n=== Loading proof and public inputs ==="); // Load proof bytes from file bytes memory proofBytes = vm.readFileBinary("target/proof_ultra_keccak_zk.bin"); console.log("Proof length (bytes):", proofBytes.length); console.log("Proof length (field elements):", proofBytes.length / 32); // Load public inputs from file bytes memory pubInputsBytes = vm.readFileBinary("target/public_inputs_ultra_keccak_zk.bin"); console.log("Public inputs length (bytes):", pubInputsBytes.length); // Parse public inputs into bytes32 array uint256 numPubInputs = pubInputsBytes.length / 32; console.log("Number of public inputs:", numPubInputs); bytes32[] memory publicInputs = new bytes32[](numPubInputs); for (uint256 i = 0; i < numPubInputs; i++) { bytes32 val; uint256 offset = i * 32; assembly { val := mload(add(add(pubInputsBytes, 32), offset)) } publicInputs[i] = val; console.log("publicInput[%d]:", i); console.logBytes32(val); } console.log("\n=== Calling verify() ==="); // Call verify and check result bool result = verifier.verify(proofBytes, publicInputs); console.log("\n=== Result ==="); console.log("Verification result:", result); assertTrue(result, "Proof verification failed!"); } /** * @notice Test with manual proof parsing to log intermediate values * @dev Uncomment and modify this to debug specific parts of the proof */ function testVerifyProofWithDetailedLogging() public { console.log("\n=== Detailed Proof Parsing ==="); bytes memory proofBytes = vm.readFileBinary("target/proof_ultra_keccak_zk.bin"); bytes memory pubInputsBytes = vm.readFileBinary("target/public_inputs_ultra_keccak_zk.bin"); // Parse first few elements of proof (pairing point object) console.log("\n--- Pairing Point Object (first 16 field elements) ---"); for (uint256 i = 0; i < 16; i++) { uint256 val; uint256 offset = i * 32; assembly { val := mload(add(add(proofBytes, 32), offset)) } console.log("pairingPointObject[%d]:", i); console.log(" hex:", val); } // Parse commitment points (after pairing point object) console.log("\n--- Wire Commitments ---"); uint256 baseOffset = 16 * 32; // After pairing point object // W1 uint256 w1x; uint256 w1y; assembly { w1x := mload(add(add(proofBytes, 32), baseOffset)) w1y := mload(add(add(proofBytes, 64), baseOffset)) } console.log("W1.x:", w1x); console.log("W1.y:", w1y); // W2 uint256 w2x; uint256 w2y; assembly { w2x := mload(add(add(proofBytes, 32), add(baseOffset, 64))) w2y := mload(add(add(proofBytes, 64), add(baseOffset, 64))) } console.log("W2.x:", w2x); console.log("W2.y:", w2y); // W3 uint256 w3x; uint256 w3y; assembly { w3x := mload(add(add(proofBytes, 32), add(baseOffset, 128))) w3y := mload(add(add(proofBytes, 64), add(baseOffset, 128))) } console.log("W3.x:", w3x); console.log("W3.y:", w3y); // Now verify uint256 numPubInputs = pubInputsBytes.length / 32; bytes32[] memory publicInputs = new bytes32[](numPubInputs); for (uint256 i = 0; i < numPubInputs; i++) { bytes32 val; uint256 offset = i * 32; assembly { val := mload(add(add(pubInputsBytes, 32), offset)) } publicInputs[i] = val; } bool result = verifier.verify(proofBytes, publicInputs); console.log("\nVerification result:", result); assertTrue(result, "Proof verification failed!"); } } EOF # Install forge-std if not already present if [ ! -d "lib/forge-std" ]; then echo "Installing forge-std..." forge install foundry-rs/forge-std --no-git fi cd ../ echo "Foundry setup complete!" } reset BB_PATH="bb" echo "nargo version : $(nargo --version)" # See constants.json for recommended nargo version echo "bb version : $($BB_PATH --version)" # See constants.json for recommended bb version SCRIPT_PATH=$(dirname $(realpath $0)) HONK_FIXTURES_PATH="$SCRIPT_PATH/../../hydra/garaga/starknet/honk_contract_generator/examples" run_noir_proof_ultra_keccak_zk() { cd hello local suffix="_ultra_keccak_zk" mkdir -p target/proof${suffix}/ $BB_PATH prove -s ultra_honk --oracle_hash keccak --write_vk -b target/hello.json -w target/witness.gz -o target/proof${suffix}/ mv -f target/proof${suffix}/public_inputs target/public_inputs${suffix}.bin mv -f target/proof${suffix}/proof target/proof${suffix}.bin mv -f target/proof${suffix}/vk target/vk${suffix}.bin mv -f target/proof${suffix}/vk_hash target/vk_hash${suffix}.bin # Copy and replace proof.bin to HONK_FIXTURES_PATH/ (no renaming) cp target/proof${suffix}.bin $HONK_FIXTURES_PATH/ rmdir target/proof${suffix}/ if $BB_PATH verify -s ultra_honk --oracle_hash keccak -i target/public_inputs${suffix}.bin -p target/proof${suffix}.bin -k target/vk${suffix}.bin; then echo "ok $suffix" else echo "Verification failed $suffix" fi $BB_PATH write_solidity_verifier -s ultra_honk -k target/vk${suffix}.bin -o target/contract${suffix}.sol cd ../ } echo $'\n ultra keccak zk honk' # reset run_noir_proof_ultra_keccak_zk echo $'\n' # Print sha256 hash of of .sol files : for file in hello/target/*.sol; do echo $(md5sum $file) done # Print sha256 hash of of .bin files : for file in hello/target/*.bin; do echo $(md5sum $file) done # Setup Foundry for testing the Solidity verifier echo $'\n Setting up Foundry...' setup_foundry ================================================ FILE: tools/noir/transcript.py ================================================ x = """received: circuit_size: 32 received: public_input_size: 1 received: pub_inputs_offset: 1 received: public_input_0: 0x0000000000000000000000000000000000000000000000000000000000000002 received: W_L: { 0x2465e9ff1629df572d7ae9fd1b9bd98946560392b669c03f9a4a496ae7e4cace, 0x17bce8fc74ab3b9430b6485da928ea6951ebee411689e29dc324843ee1708142 } received: W_R: { 0x0eb93267e664634c1ae1a608b81785cfec11669ee95a1dbc6386717066310cb1, 0x23169272f91d323ced584549d31020c12f7cbf314c309c0ee105c3bbfef28399 } received: W_O: { 0x0d394ffb5eb2d33c6a2540db125d27fb60665db10ae3f80d91eb189b318d7d58, 0x0a325d606966d0ecbf514d787c3440de179ff8427f66be54fcabe05420fc14d0 } received: LOOKUP_READ_COUNTS: { 0x0ddfdbbdefc4ac1580ed38e12cfa490d9d719a8b9f020ad3642d60fe704e696f, 0x0ff3e0896bdea021253b3d360fa6788289fe9754ce48cd01b7be96a861b5e157 } received: LOOKUP_READ_TAGS: { 0x0ddfdbbdefc4ac1580ed38e12cfa490d9d719a8b9f020ad3642d60fe704e696f, 0x0ff3e0896bdea021253b3d360fa6788289fe9754ce48cd01b7be96a861b5e157 } received: W_4: { 0x0ca7365a8a7d92bd713e8625cde47db105835a557cf68ce01414ede87a1ce97b, 0x26bf12dceab316d64651db4ea03663d3d9478d6ea9a1f20bbe215561e139c7f7 } received: LOOKUP_INVERSES: { 0x1fad315eb3f489658734a3aff63bfb846255a077783e50444d60ac2b104b1ad4, 0x1067a4d8157c660c69e7022dd32ab0e30dd9987dae02f54e15edab896b9469a2 } received: Z_PERM: { 0x069b493db1ad1bcb140505bc5a806d425af4e78b20794bc813a7669eba382a02, 0x2d6c35a33c91dd52432099ee20f87ed823919ed60347a56b4678b3a485e58197 } challenge: Sumcheck:gate_challenge_0: 0x00000000000000000000000000000000c172dd2450a5c43df9f45a102035f4aa challenge: Sumcheck:gate_challenge_1: 0x00000000000000000000000000000000d9e8e31dd1bf34b1fd2c8dc378718bad challenge: Sumcheck:gate_challenge_2: 0x000000000000000000000000000000003b18273b302fc3f7e291bde9e8f657af challenge: Sumcheck:gate_challenge_3: 0x0000000000000000000000000000000063851884d3d82ee17736f752da9bac35 challenge: Sumcheck:gate_challenge_4: 0x00000000000000000000000000000000f209bde7aca3c49f2cadbe4dca83dde9 challenge: Sumcheck:gate_challenge_5: 0x0000000000000000000000000000000069f14a768158343825c27a938fbf36b5 challenge: Sumcheck:gate_challenge_6: 0x00000000000000000000000000000000ec589c20c082a8bbc2a5358dffcbb029 challenge: Sumcheck:gate_challenge_7: 0x00000000000000000000000000000000cbc709637c971ff0235b30e22631d7c4 challenge: Sumcheck:gate_challenge_8: 0x00000000000000000000000000000000b21375f2d73fe9a9b9a0bc6ec2572958 challenge: Sumcheck:gate_challenge_9: 0x00000000000000000000000000000000245b66aebdb626945436091e17da60ac challenge: Sumcheck:gate_challenge_10: 0x0000000000000000000000000000000062d7e222920e40d2706978b2e032cef5 challenge: Sumcheck:gate_challenge_11: 0x00000000000000000000000000000000d7f22806ba3855643a24874eacad3416 challenge: Sumcheck:gate_challenge_12: 0x00000000000000000000000000000000471214514009909e9ab6cb05b004dcd2 challenge: Sumcheck:gate_challenge_13: 0x00000000000000000000000000000000c5ea117fcb3a2986a4a0a3b2524e8cda challenge: Sumcheck:gate_challenge_14: 0x00000000000000000000000000000000c83493ac2556971a3705619eb92a536f challenge: Sumcheck:gate_challenge_15: 0x00000000000000000000000000000000c5830917428e1bac8ddffd2455fd95a4 challenge: Sumcheck:gate_challenge_16: 0x00000000000000000000000000000000c285c631c4c8da6a4878d427ab0ee02e challenge: Sumcheck:gate_challenge_17: 0x00000000000000000000000000000000bf75c5b1da0b6a57af698f776b4739ab challenge: Sumcheck:gate_challenge_18: 0x00000000000000000000000000000000276eccfb8e82d126f2c292d9708dd761 challenge: Sumcheck:gate_challenge_19: 0x000000000000000000000000000000009476a0a387149c8d1b78a58476b9efff challenge: Sumcheck:gate_challenge_20: 0x000000000000000000000000000000007ffa377781a42d05905df51f7fe83dff challenge: Sumcheck:gate_challenge_21: 0x00000000000000000000000000000000be0897e28f22aaf3c50014d76d49f4a0 challenge: Sumcheck:gate_challenge_22: 0x0000000000000000000000000000000062bcad183fec3655f642f8bd33895c5f challenge: Sumcheck:gate_challenge_23: 0x000000000000000000000000000000002cd23571aaa192e5525b3f440c21946d challenge: Sumcheck:gate_challenge_24: 0x00000000000000000000000000000000abc55392a196f776e4e6c843c9076946 challenge: Sumcheck:gate_challenge_25: 0x00000000000000000000000000000000609cc20bb22f811a3c24e0c1f20deb03 challenge: Sumcheck:gate_challenge_26: 0x0000000000000000000000000000000015356ea3058bd02736fc6ee7fae12b0d challenge: Sumcheck:gate_challenge_27: 0x00000000000000000000000000000000dee13f4571cd5267161d943456bc803b challenge: Sumcheck:u_0: 0x00000000000000000000000000000000e61948888da551fcbd6481a7af8cf0c0 challenge: Sumcheck:u_1: 0x000000000000000000000000000000001bc9a638f9f0e48211e06f74fdc4ee30 challenge: Sumcheck:u_2: 0x00000000000000000000000000000000b0494ceda348dd1ad61845b2820bb7a4 challenge: Sumcheck:u_3: 0x00000000000000000000000000000000e1a0fcc92b7bfa7d75edec03b2500e70 challenge: Sumcheck:u_4: 0x0000000000000000000000000000000049f16b7a01ed1d92bea9852b447cbbfa challenge: Sumcheck:u_5: 0x00000000000000000000000000000000b05ec1b687b95e039f37a9c102b6faa1 challenge: Sumcheck:u_6: 0x0000000000000000000000000000000093f8c2d82054794f1d9bc5016a00093f challenge: Sumcheck:u_7: 0x0000000000000000000000000000000059690cf79013abb0d194ec0d621435cb challenge: Sumcheck:u_8: 0x00000000000000000000000000000000b092f424ff1f2dc7e55a9aec2bcd1b6a challenge: Sumcheck:u_9: 0x00000000000000000000000000000000b41ba16fc7d5b8771894145a6a4a3653 challenge: Sumcheck:u_10: 0x00000000000000000000000000000000b7b0adaf7d801bae84bb10e77898104f challenge: Sumcheck:u_11: 0x00000000000000000000000000000000dcc650724f78f5544d9e4104c0c66049 challenge: Sumcheck:u_12: 0x000000000000000000000000000000009372338e1b74cefc0a9297fb6c9cdf2f challenge: Sumcheck:u_13: 0x00000000000000000000000000000000e7caf286270a5faab65e811c41b651ec challenge: Sumcheck:u_14: 0x00000000000000000000000000000000c3ecafac87e8f09ca2d644596fdf1843 challenge: Sumcheck:u_15: 0x00000000000000000000000000000000680091c031e3e54068f30b1abbba4032 challenge: Sumcheck:u_16: 0x00000000000000000000000000000000e923e5d1a9f802c0de0263b0847a98a7 challenge: Sumcheck:u_17: 0x0000000000000000000000000000000001e082dbe7f823be4a12dc7fc18ff4ba challenge: Sumcheck:u_18: 0x00000000000000000000000000000000f97bd808c15fcecef5eafa333438370b challenge: Sumcheck:u_19: 0x00000000000000000000000000000000dfdcaff7ed6c257079dce44b5d1ad9d1 challenge: Sumcheck:u_20: 0x000000000000000000000000000000004cc20354eac16fac6ebafb10cd388f45 challenge: Sumcheck:u_21: 0x00000000000000000000000000000000d0c31e08a9ca0944d44537b854c011da challenge: Sumcheck:u_22: 0x0000000000000000000000000000000065969933912dedee841ad8a92c062c7b challenge: Sumcheck:u_23: 0x000000000000000000000000000000009ee2e4b83c5e0156a4902309cc087a9a challenge: Sumcheck:u_24: 0x0000000000000000000000000000000011e8bfbd21b91ca1bee77a21bbc35be8 challenge: Sumcheck:u_25: 0x0000000000000000000000000000000010a6c496ccd27e38f0b8649a9470389f challenge: Sumcheck:u_26: 0x0000000000000000000000000000000048effcc28eda12ce3859196ddc398c76 challenge: Sumcheck:u_27: 0x00000000000000000000000000000000c44b6fe342b5502bf9b7416f1f257b2e challenge: rho: 0x00000000000000000000000000000000a4bb7935b0320a044f9a06e7ce23f501 received: Gemini:FOLD_1: { 0x0030f6ead299b812a9d0e34913e4897baa11cec4f4364333bd02c3ddb15b2796, 0x0e2c88de5ecff9e5e57f587f11a581f95e8311abc9cbc8b79f71f5043aa54178 } received: Gemini:FOLD_2: { 0x24c191be28e3c61bc03e45da0e82ef589a4e35476322229e437e049dbdf633a9, 0x190ea556eee073ab057011ff249806fce345419ce1c38dc47e6eac312132d8c0 } received: Gemini:FOLD_3: { 0x0dca2271951c15f10fe1bd6b142ae96d710cbe11e7f67b885ba8cf553f9b7a89, 0x222d3b8adfc808eccc9b6be870295d686f2f78a47a20070faa67ac921a0d62ec } received: Gemini:FOLD_4: { 0x03518fba7088a6f8103d8bc2f72a67a68cff759c9e8e70071a0c0d67a89bd684, 0x2796e48e3909df2b389f68123329adb1994e35d6faad76671de81ead27b3bef0 } received: Gemini:FOLD_5: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_6: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_7: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_8: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_9: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_10: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_11: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_12: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_13: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_14: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_15: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_16: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_17: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_18: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_19: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_20: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_21: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_22: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_23: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_24: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_25: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_26: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } received: Gemini:FOLD_27: { 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002 } challenge: Gemini:r: 0x000000000000000000000000000000007f80d41613ee8455f306ecb97366f6fb received: Gemini:a_1: 0x06d88005bac7d50eaf47b0321f0075d0892f453254935ef79c503047f177ac3c received: Gemini:a_2: 0x1f22b729740dcd28043721670fa5c3f6ec7c6e8f7150848eb590a57bb2c774a1 received: Gemini:a_3: 0x27af7bd3cb339be63a51d2305fc2ddf2c887b0a59511ec160aacec44308c9ffd received: Gemini:a_4: 0x16368d4a8fc2dee62530847567ad8d75ecd96aaa541c487628f56c47c5bb1771 received: Gemini:a_5: 0x0e405cd6caac953006162d7c72468986e014792ee1e09e041c69bea39def7c6d received: Gemini:a_6: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_7: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_8: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_9: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_10: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_11: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_12: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_13: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_14: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_15: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_16: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_17: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_18: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_19: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_20: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_21: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_22: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_23: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_24: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_25: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_26: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_27: 0x0000000000000000000000000000000000000000000000000000000000000000 received: Gemini:a_28: 0x0000000000000000000000000000000000000000000000000000000000000000 challenge: Shplonk:nu: 0x000000000000000000000000000000009f8c2321fe0106bf29aaadc94f24dea6 received: Shplonk:Q: { 0x1e3ce2491c516e0e06eaa5dcad936bce2677c1867be2aeb5720375ffc79b6e21, 0x0d1133764157bc108c1e4e201a02968887c77e16afdbb635b2729af6424c9e9e } challenge: Shplonk:z: 0x00000000000000000000000000000000d704d217bac677a48ad056c8aa8f9e44 received: KZG:W: { 0x1068dd1d211c8b30fdbfa561f69a4d062daa8998dd609fd7de22ed5babb86c4b, 0x216af708e0184bcac66514720a6bffaa7fee53f2f7ae34dc374df8ede0c3c09b } """ # print(x) # Initialize an empty list to store the processed data processed_data = [] lines = x.strip().split("\n") # Iterate over each line # Iterate over each line # ... existing code ... # Initialize an empty dictionary to store the processed data processed_data = {} lines = x.strip().split("\n") # Iterate over each line for line in lines: # Split the line into key and value based on the first occurrence of ': ' print(f"Processing line: {line}") parts = line.split(": ", 2) print(f"Parts: {parts}") op, key, value = parts print(f"Op: {op}, Key: {key}, Value: {value}") # Print the processed data to verify print(processed_data) import os cwd = os.path.dirname(os.path.abspath(__file__)) proof_bytes: bytes = open(f"{cwd}/hello/target/proof_ultra_keccak.bin", "rb").read() vk_bytes: bytes = open(f"{cwd}/hello/target/vk_ultra_keccak.bin", "rb").read() # print(proof_bytes.hex()) proof = [ 0x0000000000000000000000000000000000000000000000000000000000000020, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000008946560392B669C03F9A4A496AE7E4CACE, 0x00000000000000000000000000000000002465E9FF1629DF572D7AE9FD1B9BD9, 0x0000000000000000000000000000006951EBEE411689E29DC324843EE1708142, 0x000000000000000000000000000000000017BCE8FC74AB3B9430B6485DA928EA, 0x000000000000000000000000000000CFEC11669EE95A1DBC6386717066310CB1, 0x00000000000000000000000000000000000EB93267E664634C1AE1A608B81785, 0x000000000000000000000000000000C12F7CBF314C309C0EE105C3BBFEF28399, 0x000000000000000000000000000000000023169272F91D323CED584549D31020, 0x000000000000000000000000000000FB60665DB10AE3F80D91EB189B318D7D58, 0x00000000000000000000000000000000000D394FFB5EB2D33C6A2540DB125D27, 0x000000000000000000000000000000DE179FF8427F66BE54FCABE05420FC14D0, 0x00000000000000000000000000000000000A325D606966D0ECBF514D787C3440, 0x0000000000000000000000000000000D9D719A8B9F020AD3642D60FE704E696F, 0x00000000000000000000000000000000000DDFDBBDEFC4AC1580ED38E12CFA49, 0x0000000000000000000000000000008289FE9754CE48CD01B7BE96A861B5E157, 0x00000000000000000000000000000000000FF3E0896BDEA021253B3D360FA678, 0x0000000000000000000000000000000D9D719A8B9F020AD3642D60FE704E696F, 0x00000000000000000000000000000000000DDFDBBDEFC4AC1580ED38E12CFA49, 0x0000000000000000000000000000008289FE9754CE48CD01B7BE96A861B5E157, 0x00000000000000000000000000000000000FF3E0896BDEA021253B3D360FA678, 0x000000000000000000000000000000B105835A557CF68CE01414EDE87A1CE97B, 0x00000000000000000000000000000000000CA7365A8A7D92BD713E8625CDE47D, 0x000000000000000000000000000000D3D9478D6EA9A1F20BBE215561E139C7F7, 0x000000000000000000000000000000000026BF12DCEAB316D64651DB4EA03663, 0x000000000000000000000000000000846255A077783E50444D60AC2B104B1AD4, 0x00000000000000000000000000000000001FAD315EB3F489658734A3AFF63BFB, 0x000000000000000000000000000000E30DD9987DAE02F54E15EDAB896B9469A2, 0x00000000000000000000000000000000001067A4D8157C660C69E7022DD32AB0, 0x000000000000000000000000000000425AF4E78B20794BC813A7669EBA382A02, 0x0000000000000000000000000000000000069B493DB1AD1BCB140505BC5A806D, 0x000000000000000000000000000000D823919ED60347A56B4678B3A485E58197, 0x00000000000000000000000000000000002D6C35A33C91DD52432099EE20F87E, 0x0285E5FF7D3C0D15F59C2761A965696BF749065FE4CAC90B7C5310AFB3DF3B3B, 0x2DDE687363F59313C2B41E54D81BEEF130EAE1E894EEA785C78EE4E43C20C4C6, 0x013C19D3E42C8B355492F1D756884DEA3957B5BF6E2E8193FFB4E7FC3F158EFC, 0x1E4D71CFFDC20A5A19DD68D4CFE2CDF067A2AA1F44B89CECAB6CAAF55DAE3417, 0x1907EC4E632967F4F16250F16FA97EC7C9E8D7B72FEC50A60ADF7F77E14FB1B5, 0x125582C3C04F25EF9B7C841EDC3A461F112E792FED4296F2BCC67372E41BFAA3, 0x23F1075C04D207789C601197BE8D38A22A11E5D035BCE960F9DC69BAA6AF03C2, 0x12895DCC211378D9EB6614866AA0BB1A8CF720EE34451EFCD92DC82C43504C13, 0x2280F8067080C8F83123F8D052B5A181C0A5F3BAA905F42D4549057585E69821, 0x078DC17E403E81E7ABB5353B62A897955E9596F56744CD931E7063F7937418D9, 0x1E2C998E66E78DBFB4BB9658D8637F618BAF885995FBD76D7922CC4E26DBA669, 0x262CD1B8FDC741C2073C3C669B12E6DEAC6705F6214410306A8ECC6BDBEC8D71, 0x2228B8DCA9925FEE72E5587E58BAFBD45947C386446F3BDB63C4E010D72A0E56, 0x2BDA190568FDECABB525A7745C2D7D5242F264DAEEF67F932268E72B5ADCF6D1, 0x04266918448A9EC8CAC8F881C0BC1BA9C42959111B9F2991C93B169F38DCA51A, 0x1150A038BBADB896D080E0158F85E7B0DF710C1910A6503774BDCF08EF39A393, 0x092A9FD6FE59243760042DDCAF85DCF2C9268E52C5208D75CB9125B2DAA42700, 0x123D711E98A50C8EEF600161BC486D62069E13AD4D12064603D30E8F2D6E5265, 0x25B58D132934AFDCCC480A8C964E477B88CBAFDF91370EE9B4B4A1CC2E4E1A8E, 0x1537803983A0459D1E3ED61AA59CBF0856A2A510DF7901046B79A4257A9FCB30, 0x13C08CF9426D1E2F7E132E9C6E13E8B93B6905CCC539CB357E69E0F5D66DDFD7, 0x1F1CC54B85B64DB929DAF476A572212D852AD2E7666921E603BB50A1097C870F, 0x17CFEB6AB26A28116FE3D4B5156C1512223D86E3528CD667536F1C170A4CB755, 0x1610C336FC031BE68C629C990E755AFCBB43E7630726AF1DFB32FF7DE2A1F903, 0x078C2E9FCB11A9FF1DABDC022F77C29A52FF10E9BFC25A8E1C2F38EEB9A7B314, 0x24DF74453B540FC68C0A5BD1C618D3CCF49E7513983CD8FD4CF0899AD5CEF4E2, 0x252ED9CD7EF0D0E60AA1B3FED302A1314450EDF6EBCE5036CC81B5F21F166A35, 0x27B4EF390BAA1C9773A170AC64B0DEA0DFD02FBE3A43D8061E77C487EF097245, 0x25B39250035EBE1756EC1085919D0A90A973AAFCDC1B4CC77844DC81C81F017E, 0x28B32EE8F4DD8C62DE8140DD3730FC52DE4ABC0CAB9289BCEEFFB1469484B318, 0x053B798117B11AEE0C5BCCFB2A8D926DD45C7B3F560F8D3133D42F4DEAB22D45, 0x09EACAB815D72783FDF291121BE7AF695260916F8F9BD74B980317F9C6FF4CEA, 0x22FD30A934D68C2B3D1763E038F5F41EAAEFA2311ABBE8E38F00A4EDC500B322, 0x062E1857E2ED5546CE6EC7B4E2210329EB169F5695E3A04D48ACF52F5359E55D, 0x0BA09B18683D296CF830D2DA7515D381E431FE1AC792C3117007DD2E7AD8DE35, 0x16BF0A5F2ABCE1FDC44461687D611EF8B4A2B538249FEC1D8D32F25C3325AE4F, 0x090D1AABADA01C6D1EF8E122169F88BC36D80462934AC786ED7F63568A815F72, 0x263A15EB7A5D4DA20CD74BDA64ACD6BFD515FD57E001F571EE7F25DBBC819935, 0x1A6DA135C8B1C95F0EBAC3186421C4BF62C71F27FE9B2E34279AFE65270E21A0, 0x2D928D40BC62836DA72EADCED3C96F846CF0440B939D746DB2A987E41F8B7356, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x1A06A87012710FD1C416EE0A81DE014DC12DA6BD44C812868D4D8D91705294F3, 0x2012AFA46741D05CB85C40093907ABDB7574BF246DE6693C0BCB500C024BED49, 0x016D2DCCA0C4C5DD38A1CBDF00F94CC0F41954AE8A21B2EF2BAFB8007F380EF1, 0x1D767C5DBAC46EBF8A7013691EA0891882B5007674B35BBFDE9CD4BC2E527A32, 0x2072966D339011498D1331276EEE58F2716229236F13D7AC10775B81A2C70271, 0x29615ADFDC896C3C4BC11A471FDDEA935DE1DBCC34695ACB83BC52C1535A1FC7, 0x1CBD3ABDDB824AAB725A3E87F5202AECF7A87932DD8CD8AA01E86841F2025A5B, 0x2197C5A29E67EBCE890221A058378114009B563C25A66C334DE5A6F8DCC53094, 0x109D8838A44B820B35B284797BAA972B32ECAC1E785C28BF6FD46F538EF657CB, 0x0C5CE9A7DBA32F117596969C584075BA0BE089B3179250B54B4DE0F8B82306C9, 0x136B79129F5CBBEE2AC685099E0182BBF1B19D1A71CE8E1C988B096F63E63C9B, 0x09EBDA9FBB822762ED663D8F2900916556FD179EAAA9EA934B7E8A7D20E3E63B, 0x219F37DEDD2FEB7E2FC8732FF3A4F9744A0ADE748CC5DED5871788B08161F1BA, 0x1CBE60346ABB4BB1E5A18F5A3AE1BEBB0131281BC771E514646801BCAAAA7B19, 0x25C6182D057785E9974B649D809BA61F02F1B57F0285524F7FCFD846DAE74449, 0x0EC9D62836ACB4405A03D4B6DE597612AB38A7D4D7DB95C84B63AC9FED6E8E64, 0x0B7C8F939F6FA71843EFCEA2C04A8039A8F7B8FDD6626709C4AA17AB385349D9, 0x1654259AFE3AFFE4832121F56A178087DBCCABB19B86C25505A81BEFE75C45FE, 0x172C26EC9DC7BA6A44A801982A38DF0D66E7F0FBA528D13F8044E081BC42B50F, 0x28119325D0559D33E0EBD0D8A0DA55FF95092C22605A33B36CF68B61D065F7B0, 0x0000000000000000000000000000000F8AF0669A895C3C83D38E2A2D8D91DF30, 0x0A30795CCB3A688C8FA73E641B6B9378C6B16EE60E343B7956D76425403AC5E7, 0x2B0BB083AB6D90DDD5E5A21825F3A617262BC47AA93F52A20D3264284B311BB4, 0x1EB2D76140D9256752BA21EF4ED4EE8EF021591A723B15889A1E188E2333F3A9, 0x0370704ED29ED5BA64B5690F3BAC66B1FD991F58B9DF2D5485C44A2880717AB2, 0x26F2FF7FC2B01CEF7D34571CF0E6C1EFABB0F52FA3ABC4E240AC5B74EC777AEB, 0x2D545B9152DB90404ECFAA00E4AFE0D028F91370F587E97944335CF752030EEA, 0x182530062026DCA5E7F8FAE24AC91EEFBAA64CADD9FD5CE77EDB9A993AAD6024, 0x2334E657023EBE2D46FD71AF9CA0D42089AE8B1B3025926E1E090E6425232ED4, 0x04880BBFA8D664F43A1987A81D17C5346EB08BF4E2471146E1F501B38A6EF8A8, 0x23426D30A8D4E7874C7835E9D8B5365BFC06A64AEEA18FCEDB89271B35A1B490, 0x177AB630E0A4FB877DB50B2A8A06E7DBC4B5EE690ED3276E50CDEB10C53FA882, 0x1D288D5D4BB236954164D2DB3BB053A79A18BDF2E29D1A0D148FEBA5E6807A9E, 0x06BA070D3082E755A2F0477735BCD07D421B38DB6BABB576CAC465D1524CCCAF, 0x06BA070D3082E755A2F0477735BCD07D421B38DB6BABB576CAC465D1524CCCAF, 0x27C81BC615A22ABF1FAC518DD5E5989568A6C1A9E01C232DCE80FCAAE6D2483D, 0x161FFED97D6DE369AD85A1F0ECE8A2B78C2AD4C18E3CE0AA68970A210FC8CDAC, 0x0F4AB79878C744DC417E449D77D865F631040751C61751F26A5C47CC6103394C, 0x104A5D1F1FCDDCE2DAA6E7F1AB0C26493E2A01E32DEDF0FB4FE5E1330EB8298F, 0x0185AA4D67DFC4877AEA3C4019CDC087B504D06BDB54709C5A9E535E0A1001F6, 0x13F4DBCB20E54A15649D2A911E55E4148FDFCEB790222F87F2870EA0F2FAEA7A, 0x182C615F4962DD5E9E2BCAA2148668C2967B30CBDE78CDD953D5EFA1EE7305E7, 0x10E60EADF16DA6AE5691B91F92BEF89BA9C5A60574F6B23F8AC6FC39B0D73141, 0x12CEBF3DA6A166ED7F43F707C64CB377F4CF76063F8C5AFE9FB5A52C612E4CAE, 0x0000000000000000000000000000007BAA11CEC4F4364333BD02C3DDB15B2796, 0x00000000000000000000000000000000000030F6EAD299B812A9D0E34913E489, 0x000000000000000000000000000000F95E8311ABC9CBC8B79F71F5043AA54178, 0x00000000000000000000000000000000000E2C88DE5ECFF9E5E57F587F11A581, 0x000000000000000000000000000000589A4E35476322229E437E049DBDF633A9, 0x000000000000000000000000000000000024C191BE28E3C61BC03E45DA0E82EF, 0x000000000000000000000000000000FCE345419CE1C38DC47E6EAC312132D8C0, 0x0000000000000000000000000000000000190EA556EEE073AB057011FF249806, 0x0000000000000000000000000000006D710CBE11E7F67B885BA8CF553F9B7A89, 0x00000000000000000000000000000000000DCA2271951C15F10FE1BD6B142AE9, 0x000000000000000000000000000000686F2F78A47A20070FAA67AC921A0D62EC, 0x0000000000000000000000000000000000222D3B8ADFC808ECCC9B6BE870295D, 0x000000000000000000000000000000A68CFF759C9E8E70071A0C0D67A89BD684, 0x000000000000000000000000000000000003518FBA7088A6F8103D8BC2F72A67, 0x000000000000000000000000000000B1994E35D6FAAD76671DE81EAD27B3BEF0, 0x00000000000000000000000000000000002796E48E3909DF2B389F68123329AD, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x06D88005BAC7D50EAF47B0321F0075D0892F453254935EF79C503047F177AC3C, 0x1F22B729740DCD28043721670FA5C3F6EC7C6E8F7150848EB590A57BB2C774A1, 0x27AF7BD3CB339BE63A51D2305FC2DDF2C887B0A59511EC160AACEC44308C9FFD, 0x16368D4A8FC2DEE62530847567AD8D75ECD96AAA541C487628F56C47C5BB1771, 0x0E405CD6CAAC953006162D7C72468986E014792EE1E09E041C69BEA39DEF7C6D, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x000000000000000000000000000000CE2677C1867BE2AEB5720375FFC79B6E21, 0x00000000000000000000000000000000001E3CE2491C516E0E06EAA5DCAD936B, 0x0000000000000000000000000000008887C77E16AFDBB635B2729AF6424C9E9E, 0x00000000000000000000000000000000000D1133764157BC108C1E4E201A0296, 0x000000000000000000000000000000062DAA8998DD609FD7DE22ED5BABB86C4B, 0x00000000000000000000000000000000001068DD1D211C8B30FDBFA561F69A4D, 0x000000000000000000000000000000AA7FEE53F2F7AE34DC374DF8EDE0C3C09B, 0x0000000000000000000000000000000000216AF708E0184BCAC66514720A6BFF, ] print(len(proof)) # Assert it's a multiple of 32 bytes # assert len(proof) % 32 == 0, f"Proof is not a multiple of 32 bytes: {len(proof)}" def deserialize_ultraproof(proof: bytes) -> list[int]: # Extract # of field elements from the first 4 bytes : num_field_elements = int.from_bytes(proof[:4], "big") assert len(proof[4:]) % 32 == 0 # Deserialize the rest of the proof return [int.from_bytes(proof[i : i + 32], "big") for i in range(4, len(proof), 32)] assert deserialize_ultraproof(proof_bytes) == proof from garaga.precompiled_circuits.zk_honk import HonkProof, HonkTranscript, HonkVk for i, elmt in enumerate(proof): print(f"element {i}: {hex(elmt)}") pproof = HonkProof.from_bytes(proof_bytes) # print(pproof) transcript = HonkTranscript.from_proof(pproof) # print(transcript) print(vk_bytes) print(vk_bytes.hex()) vk = HonkVk.from_bytes(vk_bytes) print(f"vk: {vk}") # print(pproof) print(vk.serialize_to_cairo()) ================================================ FILE: tools/npm/garaga_ts/.gitignore ================================================ /node_modules /dist /*.tgz /coverage ================================================ FILE: tools/npm/garaga_ts/Dockerfile ================================================ # This file (along with docker-compose.yml) helps creating reproducible builds # - It must be manually triggered whenever the Rust code is changed # - It will update the code generated under src/wasm/pkg # Usage: docker compose up --build && docker compose down FROM rust:1.87.0 RUN cargo install --locked wasm-pack@0.13.1 RUN curl -L https://bit.ly/n-install | bash -s -- -y 20.17.0 ENV HOME="/root/" ENV N_PREFIX="$HOME/n" ENV PATH="$HOME/n/bin/:$PATH" WORKDIR /garaga/tools/npm/garaga_ts CMD npm ci --ignore-scripts && npm run build && npm pack && ./fix-chown.sh ../.. ================================================ FILE: tools/npm/garaga_ts/README.md ================================================ # Garaga 🐺 State-of-the-art Elliptic Curve operations and SNARKS verification for Cairo & Starknet in TypeScript/JavaScript. ## Quick Start ```bash npm install garaga ``` ```bash yarn add garaga ``` **Requirements:** Node.js >= 18.0.0 ## What is Garaga? Garaga provides optimized cryptographic primitives for TypeScript/JavaScript: - **Elliptic Curve Operations** - High-performance curve arithmetic - **SNARK Verification** - Groth16, Noir Honk proof systems - **Pairing-Based Cryptography** - BN254, BLS12-381 curves - **Starknet Integration** - Generate calldata for Cairo contracts ## Basic Usage ```typescript import { init, msmCalldataBuilder, getGroth16CallData, CurveId } from 'garaga'; // Initialize WASM module await init(); // Multi-scalar multiplication const calldata = msmCalldataBuilder(points, scalars, CurveId.BN254); // Groth16 proof verification calldata const groth16Calldata = getGroth16CallData(proof, verifyingKey, CurveId.BN254); ``` ## Key Features ✅ **TypeScript Support** - Full type definitions included ✅ **WASM Performance** - Rust-powered cryptographic operations ✅ **Multiple Curves** - BN254, BLS12-381 support ✅ **Proof Systems** - Groth16, Noir Honk verification ✅ **Starknet Ready** - Generate calldata for Cairo contracts ✅ **Drand Integration** - Verifiable randomness support ## Available Functions 📋 **For complete API documentation with examples, see:** [API Reference](https://github.com/keep-starknet-strange/garaga/blob/v1.1.0/tools/npm/garaga_ts/src/node/api.ts) - `msmCalldataBuilder()` - Multi-scalar multiplication calldata generation - `mpcCalldataBuilder()` - Multi-pairing check calldata generation - `schnorrCalldataBuilder()` - Schnorr signature verification calldata - `ecdsaCalldataBuilder()` - ECDSA signature verification calldata - `eddsaCalldataBuilder()` - EdDSA signature verification calldata - `toWeirstrass()` - Convert from Twisted Edwards to Weierstrass coordinates - `toTwistedEdwards()` - Convert from Weierstrass to Twisted Edwards coordinates - `getGroth16CallData()` - Generate Groth16 proof verification calldata - `getZKHonkCallData()` - Generate Noir ZK Honk proof verification calldata - `fetchAndGetDrandCallData()` - Fetch Drand randomness and generate calldata - `poseidonHashBN254()` - Compute Poseidon hash on BN254 curve - and more... See the api reference (link above) for more details. ## Building from Source For development or custom builds: ```bash git clone https://github.com/keep-starknet-strange/garaga.git cd tools/npm/garaga_ts npm ci && npm run build ``` **Docker build (recommended):** ```bash docker compose up --build npm install ./garaga-.tgz ``` ## Documentation & Links - 📖 **Documentation**: [garaga.gitbook.io](https://garaga.gitbook.io/) - 🔧 **GitHub**: [github.com/keep-starknet-strange/garaga](https://github.com/keep-starknet-strange/garaga) - 📦 **NPM**: [npmjs.com/package/garaga](https://www.npmjs.com/package/garaga) - 🐛 **Issues**: [Report bugs](https://github.com/keep-starknet-strange/garaga/issues) ## Requirements - Node.js >= 18.0.0 - For building: Rust + wasm-pack ## License MIT License - see [LICENSE](https://github.com/keep-starknet-strange/garaga/blob/main/LICENSE) ================================================ FILE: tools/npm/garaga_ts/babel.config.cjs ================================================ module.exports = { presets: [ '@babel/preset-env', '@babel/preset-typescript', ], }; ================================================ FILE: tools/npm/garaga_ts/docker-compose.yml ================================================ # This file (along with Dockerfile) helps creating reproducible builds # - It must be manually triggered whenever the Rust code is changed # - It will update the code generated under src/wasm/pkg # Usage: docker compose up --build && docker compose down services: app: platform: linux/amd64 build: . volumes: - "../../..:/garaga" ================================================ FILE: tools/npm/garaga_ts/fix-chown.sh ================================================ #!/bin/sh # This script will apply the current folder ownership to its contents recursively # It is useful to fix up the ownership of files handled by a docker container FOLDER="${1:-$(dirname "$0")}" UID=$(stat -c "%u" "$FOLDER") GID=$(stat -c "%g" "$FOLDER") chown -R "$UID:$GID" "$FOLDER" ================================================ FILE: tools/npm/garaga_ts/jest.config.ts ================================================ module.exports= { preset: 'ts-jest', testEnvironment: 'node', testMatch: ['**/tests/**/*.test.ts'], moduleFileExtensions: ['ts', 'js'], // transform: { // '^.+\\.ts$': 'ts-jest' // }, collectCoverage: true, collectCoverageFrom: ['src/**/*.ts'], transform: { '^.+\\.(ts|tsx|js|jsx)$': 'babel-jest', }, }; ================================================ FILE: tools/npm/garaga_ts/patch.wasm.cjs ================================================ // This script will patch a 'wasm-pack --target web' output folder // towards a platform agnostic build const fs = require('fs'); const path = require('path'); function patch() { // package folder const pkgFolder = path.join(__dirname, 'src/wasm/pkg'); // package file name/path const jsonName = 'package.json'; const jsonFile = path.join(pkgFolder, jsonName); // package name const pkgName = JSON.parse(fs.readFileSync(jsonFile, 'utf8'))['name']; // other files const gitignoreName = '.gitignore'; const gitignoreFile = path.join(pkgFolder, gitignoreName); const jsName = pkgName + '.js'; const jsFile = path.join(pkgFolder, jsName); const wasmName = pkgName + '_bg.wasm'; const wasmFile = path.join(pkgFolder, wasmName); const wasmjsName = pkgName + '_bg.wasm.js'; const wasmjsFile = path.join(pkgFolder, wasmjsName); const wasmtsName = pkgName + '_bg.wasm.d.ts'; const wasmtsFile = path.join(pkgFolder, wasmtsName); // patches .js file: // - replaces the default WASM load behavior via URL by error (cjs compatibility) { const input = fs.readFileSync(jsFile, 'utf8'); const output = input .replaceAll('module_or_path = new URL(\'' + wasmName + '\', import.meta.url)', 'throw new Error()'); fs.writeFileSync(jsFile, output, 'utf8'); } // encodes .wasm file as .wasm.js: // - creates .wasm.js exporting the binary contents of the .wasm file { const input = fs.readFileSync(wasmFile).toString('base64'); const output = 'export default \'data:application/wasm;base64,' + input + '\';'; fs.writeFileSync(wasmjsFile, output, 'utf8'); } // overwrites .wasm.d.ts file: // - updates .wasm.d.ts with the type signature of the .wasm.js file { const output = 'declare const wasm_module_base64: string;' + '\n' + 'export default wasm_module_base64;'; fs.writeFileSync(wasmtsFile, output, 'utf8'); } // cleans up now obsolete files: // - removes .gitignore and .wasm files { fs.rmSync(gitignoreFile); fs.rmSync(wasmFile); } } patch(); ================================================ FILE: tools/npm/garaga_ts/rollup.config.js ================================================ import typescript from '@rollup/plugin-typescript'; import dts from 'rollup-plugin-dts'; export default [ { input: './src/node/index.ts', output: [ { file: 'dist/index.cjs', format: 'cjs', sourcemap: true, }, { file: 'dist/index.mjs', format: 'esm', sourcemap: true, }, ], external: ['fs', 'crypto', 'path', 'util', 'os', 'stream', 'buffer'], plugins: [typescript()], }, { input: './src/node/index.ts', output: { file: 'dist/index.d.ts', format: 'esm', sourcemap: false, }, external: ['fs', 'crypto', 'path', 'util', 'os', 'stream', 'buffer'], plugins: [typescript(), dts()], }, ]; ================================================ FILE: tools/npm/garaga_ts/src/constants.ts ================================================ /** * Auto-generated constants file from constants.json. Do not edit manually. */ // RISC0 Constants // https://github.com/risc0/risc0-ethereum/blob/v2.2.2/contracts/src/groth16/ControlID.sol // release v2.2.2 export const RISC0_CONTROL_ROOT = BigInt( "0xCE52BF56033842021AF3CF6DB8A50D1B7535C125A34F1A22C6FDCF002C5A1529", ); export const RISC0_BN254_CONTROL_ID = BigInt( "0x04446E66D300EB7FB45C9726BB53C793DDA407A62E9601618BB43C5C14657AC0", ); // SP1 Constants // https://github.com/succinctlabs/sp1-contracts/blob/main/contracts/src/v5.0.0/SP1VerifierGroth16.sol export const SP1_VERIFIER_VERSION = "v5.0.0"; export const SP1_VERIFIER_HASH = "0xa4594c59bbc142f3b81c3ecb7f50a7c34bc9af7c4c444b5d48b795427e285913"; // Additional RISC0 constants for internal use export const RISC0_SYSTEM_STATE_ZERO_DIGEST = new Uint8Array([ 0xa3, 0xac, 0xc2, 0x71, 0x17, 0x41, 0x89, 0x96, 0x34, 0x0b, 0x84, 0xe5, 0xa9, 0x0f, 0x3e, 0xf4, 0xc4, 0x9d, 0x22, 0xc7, 0x9e, 0x44, 0xaa, 0xd8, 0x22, 0xec, 0x9c, 0x31, 0x3e, 0x1e, 0xb8, 0xe2, ]); export const RISC0_TAG_DIGEST = "0xcb1fefcd1f2d9a64975cbbbf6e161e2914434b0cbb9960b84df5d717e86b48af"; export const RISC0_OUTPUT_TAG = "0x77eafeb366a78b47747de0d7bb176284085ff5564887009a5be63da32d3559d4"; ================================================ FILE: tools/npm/garaga_ts/src/node/api.ts ================================================ // This files provides a ts-like interface for garaga_rs import { drand_calldata_builder, drand_tlock_encrypt_calldata_builder, msm_calldata_builder, mpc_calldata_builder, schnorr_calldata_builder, ecdsa_calldata_builder, eddsa_calldata_builder, rsa_2048_calldata_builder, rsa_2048_sha256_calldata_builder, to_twistededwards, to_weirstrass, get_groth16_calldata, get_zk_honk_calldata, poseidon_hash, } from '../wasm/pkg/garaga_rs'; import { CurveId } from './definitions'; import { Groth16Proof, Groth16VerifyingKey } from './starknet/groth16ContractGenerator/parsingUtils'; export { parseGroth16ProofFromJson, parseGroth16ProofFromObject, parseGroth16VerifyingKeyFromJson, parseGroth16VerifyingKeyFromObject, } from './starknet/groth16ContractGenerator/parsingUtils'; export type { Groth16Proof, Groth16VerifyingKey, } from './starknet/groth16ContractGenerator/parsingUtils'; /** * Represents a point on an elliptic curve in affine coordinates (x, y) */ export type G1Point = [bigint, bigint]; /** * Represents a point on a twisted elliptic curve over an extension field * Format: [[x0, x1], [y0, y1]] where x = x0 + x1*i and y = y0 + y1*i */ export type G2Point = [[bigint, bigint], [bigint, bigint]]; /** * Represents a pairing of G1 and G2 points for pairing-based cryptography */ export type G1G2Pair = [G1Point, G2Point]; function flatten(data: bigint[][]): bigint[] { return data.reduce((values, item) => values.concat(item), []); } function pairToList(pair: G1G2Pair): bigint[] { const [[x1, y1], [[x2a, x2b], [y2a, y2b]]] = pair; return [x1, y1, x2a, x2b, y2a, y2b]; } /** * Configuration options for MSM (Multi-Scalar Multiplication) calldata builder */ export type MsmCalldataBuilderOptons = Partial<{ /** Whether to include the original points and scalars in the output */ includePointsAndScalars: boolean; /** Whether to serialize the output as a pure felt252 array for Cairo compatibility */ serializeAsPureFelt252Array: boolean; }>; /** * Builds calldata for Multi-Scalar Multiplication (MSM) operations. * MSM computes the sum of scalar multiplications: Σ(scalar_i * point_i) * * @param points - Array of G1 points to be multiplied * @param scalars - Array of scalar values for multiplication * @param curveId - Identifier for the elliptic curve (e.g., BN254, BLS12_381) * @param options - Configuration options for the MSM operation * @returns Array of bigint values representing the MSM calldata * * @example * ```typescript * const points: G1Point[] = [[1n, 2n], [3n, 4n]]; * const scalars = [5n, 6n]; * const calldata = msmCalldataBuilder(points, scalars, CurveId.BN254); * ``` */ export function msmCalldataBuilder(points: G1Point[], scalars: bigint[], curveId: CurveId, options: MsmCalldataBuilderOptons = {}): bigint[] { const values = flatten(points); const includePointsAndScalars = options.includePointsAndScalars ?? true; const serializeAsPureFelt252Array = options.serializeAsPureFelt252Array ?? false; return msm_calldata_builder(values, scalars, curveId, includePointsAndScalars, serializeAsPureFelt252Array); } /** * Builds calldata for Multi-Pairing Check (MPC) operations. * MPC verifies that a set of pairing equations hold: e(G1_i, G2_i) = 1 * * @param curveId - Identifier for the elliptic curve * @param pairs - Array of G1-G2 point pairs for pairing * @param nFixedG2 - Number of fixed G2 points in the pairing * @param publicPair - Optional additional public pairing for verification * @returns Array of bigint values representing the MPC calldata * * @example * ```typescript * const pairs: G1G2Pair[] = [[[1n, 2n], [[3n, 4n], [5n, 6n]]]]; * const calldata = mpcCalldataBuilder(CurveId.BN254, pairs, 1); * ``` */ export function mpcCalldataBuilder(curveId: CurveId, pairs: G1G2Pair[], nFixedG2: number, publicPair?: G1G2Pair): bigint[] { const values1 = flatten(pairs.map(pairToList)); const values2 = publicPair === undefined ? [] : pairToList(publicPair); return mpc_calldata_builder(curveId, values1, nFixedG2, values2); } /** * Builds calldata for Schnorr signature verification. * Schnorr signatures provide a simple and efficient digital signature scheme. * * @param rx - X-coordinate of the signature point R * @param s - Signature scalar value * @param e - Challenge hash value * @param px - X-coordinate of the public key point * @param py - Y-coordinate of the public key point * @param prependPublickey - Whether to include the public key in the calldata. * When true, prepends (px, py) coordinates to the output. * When false, only includes signature data (rx, s, e). * Set to false when the public key is provided separately to the Cairo contract, * useful for verifying multiple signatures with the same public key. * @param curveId - Identifier for the elliptic curve * @returns Array of bigint values representing the Schnorr verification calldata * * @example * ```typescript * // With public key included (default behavior for single verification) * const calldata = schnorrCalldataBuilder( * 0x123n, // rx * 0x456n, // s * 0x789n, // e * 0xabcn, // px * 0xdefn, // py * true, // prependPublickey * CurveId.BN254 * ); * * // Without public key (when provided separately to contract) * const calldataNoKey = schnorrCalldataBuilder( * 0x123n, // rx * 0x456n, // s * 0x789n, // e * 0xabcn, // px * 0xdefn, // py * false, // prependPublickey * CurveId.BN254 * ); * ``` */ export function schnorrCalldataBuilder(rx: bigint, s: bigint, e: bigint, px: bigint, py: bigint, prependPublickey: boolean, curveId: CurveId): bigint[] { return schnorr_calldata_builder(rx, s, e, px, py, prependPublickey, curveId); } /** * Builds calldata for ECDSA signature verification. * ECDSA is the standard elliptic curve digital signature algorithm. * * @param r - R component of the ECDSA signature * @param s - S component of the ECDSA signature * @param v - Recovery ID (0 or 1) for public key recovery * @param px - X-coordinate of the public key point * @param py - Y-coordinate of the public key point * @param z - Hash of the signed message * @param prependPublickey - Whether to include the public key in the calldata. * When true, prepends (px, py) coordinates to the output. * When false, only includes signature data (r, s, v, z). * Set to false when the public key is provided separately to the Cairo contract, * useful for verifying multiple signatures with the same public key. * @param curveId - Identifier for the elliptic curve * @returns Array of bigint values representing the ECDSA verification calldata * * @example * ```typescript * // With public key included (default behavior for single verification) * const calldata = ecdsaCalldataBuilder( * 0x123n, // r * 0x456n, // s * 0, // v * 0x789n, // px * 0xabcn, // py * 0xdefn, // z (message hash) * true, // prependPublickey * CurveId.SECP256K1 * ); * * // Without public key (when provided separately to contract) * const calldataNoKey = ecdsaCalldataBuilder( * 0x123n, // r * 0x456n, // s * 0, // v * 0x789n, // px * 0xabcn, // py * 0xdefn, // z (message hash) * false, // prependPublickey * CurveId.SECP256K1 * ); * ``` */ export function ecdsaCalldataBuilder(r: bigint, s: bigint, v: number, px: bigint, py: bigint, z: bigint, prependPublickey: boolean, curveId: CurveId): bigint[] { return ecdsa_calldata_builder(r, s, v, px, py, z, prependPublickey, curveId); } /** * Builds calldata for EdDSA signature verification for Ed25519. * EdDSA provides deterministic signatures with strong security properties. * * @param ry_twisted_le - Y-coordinate of signature point R in twisted Edwards form (little-endian) * @param s - Signature scalar value * @param py_twisted_le - Y-coordinate of public key in twisted Edwards form (little-endian) * @param msg - Raw message bytes that were signed * @param prependPublickey - Whether to include the public key in the calldata. * When true, prepends py_twisted_le to the output. * When false, only includes signature data (ry_twisted_le, s, msg). * Set to false when the public key is provided separately to the Cairo contract, * useful for verifying multiple signatures with the same public key. * @returns Array of bigint values representing the EdDSA verification calldata * * @example * ```typescript * const message = new Uint8Array([1, 2, 3, 4]); * * // With public key included (default behavior for single verification) * const calldata = eddsaCalldataBuilder( * 0x123n, // ry_twisted_le * 0x456n, // s * 0x789n, // py_twisted_le * message, * true // prependPublickey * ); * * // Without public key (when provided separately to contract) * const calldataNoKey = eddsaCalldataBuilder( * 0x123n, // ry_twisted_le * 0x456n, // s * 0x789n, // py_twisted_le * message, * false // prependPublickey * ); * ``` */ export function eddsaCalldataBuilder(ry_twisted_le: bigint, s: bigint, py_twisted_le: bigint, msg: Uint8Array, prependPublickey: boolean): bigint[] { return eddsa_calldata_builder(ry_twisted_le, s, py_twisted_le, msg, prependPublickey); } /** * Builds calldata for RSA-2048 signature verification. * Computes s^{65537} mod n via square-and-multiply with 17 certified reductions. * * @param signature - RSA signature value s * @param expectedMessage - Expected result m = s^{65537} mod n * @param modulus - RSA-2048 modulus n * @param prependPublicKey - Whether to include the modulus in the calldata. * When true, prepends n to the output (24 elements). * When false, only includes signature, message, and reduction witnesses. * @returns Array of bigint values representing the RSA verification calldata * * @example * ```typescript * const calldata = rsa2048CalldataBuilder( * signature, // RSA signature * expectedMessage, // s^65537 mod n * modulus, // RSA-2048 modulus * true // include modulus in calldata * ); * ``` */ export function rsa2048CalldataBuilder(signature: bigint, expectedMessage: bigint, modulus: bigint, prependPublicKey: boolean): bigint[] { return rsa_2048_calldata_builder(signature, expectedMessage, modulus, prependPublicKey); } /** * Builds calldata for RSA-2048 SHA-256 full on-chain signature verification. * Computes SHA-256(message), constructs the PKCS#1 v1.5 encoding, generates * RSA reduction witnesses, and appends the ByteArray-serialized message. * * @param signature - RSA signature value s * @param message - Raw message bytes to verify * @param modulus - RSA-2048 modulus n * @param prependPublicKey - Whether to include the modulus in the calldata. * When true, prepends n to the output (24 elements). * When false, only includes signature, message, and reduction witnesses. * @returns Array of bigint values representing the RSA SHA-256 verification calldata * * @example * ```typescript * const message = new TextEncoder().encode("hello garaga"); * const calldata = rsa2048Sha256CalldataBuilder( * signature, // RSA signature * message, // raw message bytes * modulus, // RSA-2048 modulus * true // include modulus in calldata * ); * ``` */ export function rsa2048Sha256CalldataBuilder(signature: bigint, message: Uint8Array, modulus: bigint, prependPublicKey: boolean): bigint[] { return rsa_2048_sha256_calldata_builder(signature, message, modulus, prependPublicKey); } /** * Converts a point from twisted Edwards form to Weierstrass form for Ed25519. * This is useful for interoperability between different curve representations. * * @param x_twisted - X-coordinate in twisted Edwards form * @param y_twisted - Y-coordinate in twisted Edwards form * @returns Tuple of [x_weierstrass, y_weierstrass] coordinates * @throws Error if the conversion fails or produces invalid results * * @example * ```typescript * const [x_w, y_w] = toWeirstrass(0x123n, 0x456n); * console.log(`Weierstrass form: (${x_w}, ${y_w})`); * ``` */ export function toWeirstrass(x_twisted: bigint, y_twisted: bigint): [bigint, bigint] { const result = to_weirstrass(x_twisted, y_twisted); if (result.length !== 2) { throw new Error('Invalid result length'); } return [result[0], result[1]]; } /** * Converts a point from Weierstrass form to twisted Edwards form for Ed25519. * This is useful for interoperability between different curve representations. * * @param x_weierstrass - X-coordinate in Weierstrass form * @param y_weierstrass - Y-coordinate in Weierstrass form * @returns Tuple of [x_twisted, y_twisted] coordinates * @throws Error if the conversion fails or produces invalid results * * @example * ```typescript * const [x_t, y_t] = toTwistedEdwards(0x789n, 0xabcn); * console.log(`Twisted Edwards form: (${x_t}, ${y_t})`); * ``` */ export function toTwistedEdwards(x_weierstrass: bigint, y_weierstrass: bigint): [bigint, bigint] { const result = to_twistededwards(x_weierstrass, y_weierstrass); if (result.length !== 2) { throw new Error('Invalid result length'); } return [result[0], result[1]]; } /** * Generates calldata for Groth16 zero-knowledge proof verification. * Groth16 is a succinct non-interactive zero-knowledge proof system. * * @param proof - The Groth16 proof containing points A, B, C and public inputs * @param verifyingKey - The verification key containing curve points for verification * @param curveId - Identifier for the elliptic curve used in the proof * @returns Array of bigint values representing the complete verification calldata * * @example * ```typescript * const proof: Groth16Proof = { * a: [0x123n, 0x456n], * b: [[0x789n, 0xabcn], [0xdefn, 0x111n]], * c: [0x222n, 0x333n], * publicInputs: [0x444n, 0x555n] * }; * const calldata = getGroth16CallData(proof, verifyingKey, CurveId.BN254); * ``` */ export function getGroth16CallData(proof: Groth16Proof, verifyingKey: Groth16VerifyingKey, curveId: CurveId): bigint[] { return get_groth16_calldata(proof, verifyingKey, curveId); } /** * Generates calldata for ZK-Honk zero-knowledge proof verification. * ZK-Honk provides zero-knowledge properties on top of the Honk system. * * @param proof - Raw ZK proof bytes from the ZK-Honk prover * @param publicInputs - Public input bytes for the circuit * @param verifyingKey - Verification key bytes for the specific circuit * @returns Array of bigint values representing the complete verification calldata * * @example * ```typescript * const zkProofBytes = new Uint8Array([...]); * const publicInputsBytes = new Uint8Array([...]); * const vkBytes = new Uint8Array([...]); * const calldata = getZKHonkCallData(zkProofBytes, publicInputsBytes, vkBytes); * ``` */ export function getZKHonkCallData(proof: Uint8Array, publicInputs: Uint8Array, verifyingKey: Uint8Array): bigint[] { return get_zk_honk_calldata(proof, publicInputs, verifyingKey); } /** * Default base URLs for accessing drand randomness beacons */ const DRAND_BASE_URLS = [ 'https://drand.cloudflare.com', 'https://api.drand.sh', 'https://api2.drand.sh', 'https://api3.drand.sh', ]; /** * Hash identifier for the drand quicknet chain */ const DRAND_QUICKNET_HASH = '52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971'; /** * Represents a randomness beacon from the drand network */ type DrandRandomnessBeacon = { /** The round number of this randomness beacon */ round: number; /** The random value generated for this round */ randomness: bigint; /** The BLS signature proving the randomness */ signature: bigint; }; /** * Fetches drand randomness and generates verification calldata in one step. * This is a convenience function that combines fetching and calldata generation. * * @param roundNumber - The specific round to fetch, or 'latest' for the most recent * @param chainHash - Hash identifier of the drand chain (defaults to quicknet) * @param baseUrls - Array of drand API endpoints to try * @returns Promise resolving to calldata array for verifying the drand randomness * * @example * ```typescript * // Fetch latest randomness and generate calldata * const calldata = await fetchAndGetDrandCallData(); * * // Fetch specific round * const roundCalldata = await fetchAndGetDrandCallData(12345); * ``` */ export async function fetchAndGetDrandCallData(roundNumber: number | 'latest' = 'latest', chainHash = DRAND_QUICKNET_HASH, baseUrls = DRAND_BASE_URLS): Promise { return getDrandCallData(await fetchDrandRandomness(roundNumber, chainHash, baseUrls)); } /** * Generates calldata for drand randomness beacon verification. * This prepares the data needed to verify a drand signature on-chain. * * @param beacon - The drand randomness beacon containing round, randomness, and signature * @returns Array of bigint values representing the verification calldata * * @example * ```typescript * const beacon = { * round: 12345, * randomness: 0x123456789n, * signature: 0xabcdef123n * }; * const calldata = getDrandCallData(beacon); * ``` */ export function getDrandCallData({ round, randomness, signature }: DrandRandomnessBeacon): bigint[] { return drand_calldata_builder([round, randomness, signature]); } /** * Encrypts a message using drand tlock encryption for a specific round and returns calldata. * The message can only be decrypted once the drand beacon for that round is published. * * @param roundNumber - The drand round number to encrypt for * @param message - 16-byte message to encrypt * @param randomness - 16-byte randomness for encryption * @returns Array of bigint values representing the tlock encryption calldata */ export function encryptToDrandRoundAndGetCallData(roundNumber: number, message: Uint8Array, randomness: Uint8Array): bigint[] { if (message.length != 16) throw new Error('Message size should be 16'); if (randomness.length != 16) throw new Error('Randomness size should be 16'); const messageValue = message.reduce((acc: bigint, b: number) => (acc << 8n) | BigInt(b), 0n); const randomnessValue = randomness.reduce((acc: bigint, b: number) => (acc << 8n) | BigInt(b), 0n); return drand_tlock_encrypt_calldata_builder([roundNumber, messageValue, randomnessValue]); } /** * Fetches randomness data from the drand distributed randomness beacon network. * Tries multiple endpoints for reliability and returns the first successful response. * * @param roundNumber - The specific round to fetch, or 'latest' for the most recent * @param chainHash - Hash identifier of the drand chain to query * @param baseUrls - Array of drand API endpoints to attempt * @returns Promise resolving to the randomness beacon data * @throws Error if all endpoints fail or return invalid data * * @example * ```typescript * // Fetch latest round * const latest = await fetchDrandRandomness(); * * // Fetch specific round * const round12345 = await fetchDrandRandomness(12345); * * // Use custom endpoints * const custom = await fetchDrandRandomness('latest', 'custom-hash', ['https://custom-drand.com']); * ``` */ export async function fetchDrandRandomness(roundNumber: number | 'latest' = 'latest', chainHash = DRAND_QUICKNET_HASH, baseUrls = DRAND_BASE_URLS): Promise { if (baseUrls.length == 0) { throw new Error('No base url provided'); } const endpoint = '/' + chainHash + '/public/' + roundNumber; const promises = baseUrls.map((baseUrl) => fetch(baseUrl + endpoint)); let response; try { response = await Promise.any(promises); } catch (e) { throw new Error('All urls failed: ' + e); } const data = await response?.json(); if (!data || !data.round || !data.randomness || !data.signature) { throw new Error('Unexpected response: ' + JSON.stringify(data)); } const round = Number(data.round); const randomness = BigInt('0x' + data.randomness.replace(/^0x/i, '')); const signature = BigInt('0x' + data.signature.replace(/^0x/i, '')); return { round, randomness, signature }; } /** * Computes the Poseidon hash function over the BN254 curve. * Poseidon is a cryptographic hash function optimized for zero-knowledge circuits. * * @param x - First input field element * @param y - Second input field element * @returns The Poseidon hash result as a bigint * @throws Error if the hash computation fails or inputs are invalid * * @example * ```typescript * const hash = poseidonHashBN254(1n, 2n); * console.log(`Poseidon(1, 2) = ${hash.toString(16)}`); * * // Expected output for (1, 2): * // 115CC0F5E7D690413DF64C6B9662E9CF2A3617F2743245519E19607A4417189A * ``` */ export function poseidonHashBN254(x: bigint, y: bigint): bigint { try { const result = poseidon_hash(x, y); if (typeof result === 'bigint') { return result; } throw new Error('Invalid result from poseidon_hash'); } catch (error) { throw new Error(`Failed to compute Poseidon hash: ${error}`); } } ================================================ FILE: tools/npm/garaga_ts/src/node/definitions.ts ================================================ // const N_LIMBS: number = 4 // const BASE: number = 2**96 // const STARK: bigint = BigInt("0x800000000000011000000000000000000000000000000000000000000000001"); // const BN254_ID: number = 0 // const BLS12_381_ID: number = 1 // const SECP256K1_ID: number = 2 // const SECP256R1_ID: number = 3 // const ED25519_ID: number = 4 export enum CurveId { BN254 = 0, BLS12_381 = 1, SECP256K1 = 2, SECP256R1 = 3, ED25519 = 4, } export interface G1Point { x: bigint; y: bigint; curveId: CurveId } export interface G2Point { x: [bigint, bigint]; y: [bigint, bigint]; curveId: CurveId } export interface G1G2Pair { p: G1Point; q: G2Point; curveId: CurveId } interface WeiertrassCurve { cairoZeroNamespaceName: string, curveId: CurveId, p: bigint, n: bigint, h: bigint, a?: bigint, b?: bigint, fpGenerator: bigint, Gx: bigint, Gy: bigint, } interface PairingCurve extends WeiertrassCurve { x: bigint, irreduciblePolys: Record, nrA0: bigint, nrA1: bigint, b20: bigint, b21: bigint, loopCounter: number[], lineFunctionSparcity: number[], finalExpCofactor: bigint, G2x: [bigint, bigint], G2y: [bigint, bigint], } interface TwistedEdwardsCurve extends WeiertrassCurve { aTwisted: bigint, dTwisted: bigint } export const findValueInStringToCurveId = (s: string): CurveId | null =>{ // Find the value of the Curve ID in the string if(s.toLowerCase() === "bn128"){ return CurveId.BN254; } if(s.toLowerCase() === "bls12381"){ return CurveId.BLS12_381; } let curveId: CurveId | null = null; Object.entries(CurveId).forEach(([key, value]) => { if(s.toLowerCase().includes(key.toLowerCase()) || key.toLowerCase().includes(s.toLowerCase())){ curveId = CurveId[key as keyof typeof CurveId]; return; } }); return curveId; } export const jy00 = (value: bigint): number[] => { /** * This is a minimum-Hamming-Weight left-to-right recoding. * It outputs signed {-1, 0, 1} bits from MSB to LSB * with minimal Hamming Weight to minimize operations * in Miller Loops and vartime scalar multiplications * * - Optimal Left-to-Right Binary Signed-Digit Recoding * Joye, Yen, 2000 * https://marcjoye.github.io/papers/JY00sd2r.pdf */ const bit = (value: bigint, index: number): bigint => { return (value >> BigInt(index)) & 1n; }; let bi = 0n, bi1 = 0n, ri = 0n, ri1 = 0n, ri2 = 0n; const bits = value.toString(2).length; const recoded: number[] = []; for (let i = bits; i >= 0; i--) { if (i === bits) { ri1 = bit(value, bits - 1); ri2 = bit(value, bits - 2); } else { bi = bi1; ri = ri1; ri1 = ri2; ri2 = i >= 2 ? bit(value, i - 2) : 0n; } bi1 = (bi + ri1 + ri2) >> 1n; recoded.push(Number(-2n * bi + ri + bi1)); // Cast bigint result to number } return recoded; } export const CURVES: Record = { [CurveId.BN254]: { cairoZeroNamespaceName: "bn254", curveId: CurveId.BN254, p: BigInt("0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47"), n: BigInt("0x44E992B44A6909F1"), h: BigInt(1), irreduciblePolys: { 6: [82, 0, 0, -18, 0, 0, 1], 12: [82, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0, 0, 1], }, nrA0: BigInt(9), nrA1: BigInt(1), a: BigInt(0), b: BigInt(3), b20: BigInt("0x2B149D40CEB8AAAE81BE18991BE06AC3B5B4C5E559DBEFA33267E6DC24A138E5"), b21: BigInt("0x9713B03AF0FED4CD2CAFADEED8FDF4A74FA084E52D1852E4A2BD0685C315D2"), loopCounter: jy00(BigInt(6) * BigInt("0x44E992B44A6909F1") + BigInt(2)).reverse(), lineFunctionSparcity: [2, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0 ,0], finalExpCofactor: BigInt("1469306990098747947464455738335385361638823152381947992820"), fpGenerator: BigInt(3), Gx: BigInt("0x1"), Gy: BigInt("0x2"), G2x: [BigInt("0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED"), BigInt("0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2")], G2y: [BigInt("0x12C85EA5DB8C6DEB4AAB71808DCB408FE3D1E7690C43D37B4CE6CC0166FA7DAA"), BigInt("0x90689D0585FF075EC9E99AD690C3395BC4B313370B38EF355ACDADCD122975B")] }, [CurveId.BLS12_381]: { cairoZeroNamespaceName: "bls", curveId: CurveId.BLS12_381, p: BigInt("0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAB"), n: BigInt("0x73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF00000001"), x: -BigInt("0xD201000000010000"), h: BigInt("0x396C8C005555E1568C00AAAB0000AAAB"), irreduciblePolys: { 6: [2, 0, 0, -2, 0, 0, 1], 12: [2, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 1], }, nrA0: BigInt(1), nrA1: BigInt(1), a: BigInt(0), b: BigInt(4), b20: BigInt(4), b21: BigInt(4), loopCounter: BigInt("0xD201000000010000").toString(2).slice(0).split("").reverse().map(x => parseInt(x, 10)), lineFunctionSparcity: [1, 0, 1, 2, 0, 0, 1, 0, 1, 0, 0, 0], finalExpCofactor: BigInt(3), fpGenerator: BigInt(3), Gx: BigInt("0x17F1D3A73197D7942695638C4FA9AC0FC3688C4F9774B905A14E3A3F171BAC586C55E83FF97A1AEFFB3AF00ADB22C6BB"), Gy: BigInt("0x08B3F481E3AAA0F1A09E30ED741D8AE4FCF5E095D5D00AF600DB18CB2C04B3EDD03CC744A2888AE40CAA232946C5E7E1"), G2x: [ BigInt("0x24AA2B2F08F0A91260805272DC51051C6E47AD4FA403B02B4510B647AE3D1770BAC0326A805BBEFD48056C8C121BDB8"), BigInt("0x13E02B6052719F607DACD3A088274F65596BD0D09920B61AB5DA61BBDC7F5049334CF11213945D57E5AC7D055D042B7E") ], G2y: [ BigInt("0xCE5D527727D6E118CC9CDC6DA2E351AADFD9BAA8CBDD3A76D429A695160D12C923AC9CC3BACA289E193548608B82801"), BigInt("0x606C4A02EA734CC32ACD2B02BC28B99CB3E287E85A763AF267492AB572E99AB3F370D275CEC1DA1AAA9075FF05F79BE") ] }, [CurveId.SECP256K1]: { cairoZeroNamespaceName: "secp256r1", curveId: CurveId.SECP256K1, p: BigInt("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"), n: BigInt("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141"), h: BigInt(1), a: BigInt(0), b: BigInt(7), fpGenerator: BigInt(2), Gx: BigInt("0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"), Gy: BigInt("0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8") }, [CurveId.SECP256R1]: { cairoZeroNamespaceName: "secp256r1", curveId: CurveId.SECP256R1, p: BigInt("0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"), n: BigInt("0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"), h: BigInt(1), a: BigInt("0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC"), b: BigInt("0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"), fpGenerator: BigInt(6), Gx: BigInt("0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"), Gy: BigInt("0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5") }, [CurveId.ED25519]: { cairoZeroNamespaceName: "ED25519", curveId: CurveId.ED25519, p: BigInt("0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED"), n: BigInt("0x1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED"), h: BigInt(8), dTwisted: BigInt("0x52036CEE2B6FFE738CC740797779E89800700A4D4141D8AB75EB4DCA135978A3"), aTwisted: BigInt("0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC"), fpGenerator: BigInt(6), Gx: BigInt("0x216936D3CD6E53FEC0A4E231FDD6DC5C692CC7609525A7B2C9562D608F25D51A"), Gy: BigInt("0x6666666666666666666666666666666666666666666666666666666666666658") } } ================================================ FILE: tools/npm/garaga_ts/src/node/hints/io.ts ================================================ export const toBigInt = (value: string | bigint | number | Uint8Array): bigint => { //Convert a string or integer to an integer. Supports hexadecimal and decimal strings. if (typeof value === 'string') { value = value.trim(); try { return BigInt(value); } catch (e) { if (value.toLowerCase().startsWith('0x')) { throw new Error(`Invalid hexadecimal value: ${value}`); } else { throw new Error(`Invalid decimal value: ${value}`); } } } else if (typeof value === 'bigint') { return value; } else if (typeof value === 'number') { if (Number.isInteger(value)) { return BigInt(value); } else { throw new TypeError(`Expected integer number, got non-integer number: ${value}`); } } else if (value instanceof Uint8Array) { let result = BigInt(0); for (const byte of value) { result = (result << 8n) + BigInt(byte); } return result; } else { throw new TypeError( `Expected string, number, or Uint8Array, got ${typeof value}` ); } } export const toHexStr = (value: string | number | bigint): string => { if (typeof value === 'string') { value = value.trim(); const intValue = BigInt(value); return ('0x' + intValue.toString(16)).toLowerCase(); } else if (typeof value === 'number' || typeof value === 'bigint') { const intValue = BigInt(value); return ('0x' + intValue.toString(16)).toLowerCase(); } else { throw new TypeError(`Expected string, number integer, or bigint, got ${typeof value}`); } } export const hexStringToBytes = (hexString: string): Uint8Array => { if (hexString.toLowerCase().startsWith('0x')) { hexString = hexString.slice(2); } if (hexString.length % 2 !== 0) { hexString = '0' + hexString; } const bytes = new Uint8Array(hexString.length / 2); for (let i = 0; i < bytes.length; i++) { const byte = hexString.slice(i * 2, i * 2 + 2); bytes[i] = parseInt(byte, 16); } return bytes; } export const bitLength = (x: bigint): number => { if (x === 0n || x === -0n) { return 0; } let bits = 0; let n = x < 0n ? -x : x; // Handle negative numbers while (n > 0n) { n >>= 1n; bits++; } return bits; } export const split128 = (a: bigint): [bigint, bigint] => { try { console.log("a bigint", a); const MAX_UINT256 = 115792089237316195423570985008687907853269984665640564039457584007913129639936n; const MASK_128 = BigInt((1n << 128n) - 1n); if (a < 0n || a >= MAX_UINT256) { throw new Error(`Value ${a} is too large to fit in a u256`); } const low = a & MASK_128; const high = a >> BigInt(128); return [low, high]; } catch (err) { console.log("ERR split 128: ", err); throw new Error("ERROR split 128") } } export const modInverse = (a: bigint, p: bigint): bigint => { let m0 = p; let y = BigInt(0), x = BigInt(1); if (p === BigInt(1)) { return BigInt(0); } while (a > BigInt(1)) { // q is quotient let q = a / p; let t = p; // p is remainder now, process same as Euclid's algorithm p = a % p; a = t; t = y; // Update x and y y = x - q * y; x = t; } // Make x positive if (x < BigInt(0)) { x = x + m0; } return x; } ================================================ FILE: tools/npm/garaga_ts/src/node/index.ts ================================================ export * from './api'; // exports "ts" interface export * from '../wasm/pkg/garaga_rs'; // export "raw" interface export { CurveId } from './definitions'; import pkg_init from '../wasm/pkg/garaga_rs'; import module_or_path from '../wasm/pkg/garaga_rs_bg.wasm'; export function init(): ReturnType { return pkg_init({ module_or_path }); } ================================================ FILE: tools/npm/garaga_ts/src/node/starknet/groth16ContractGenerator/parsingUtils.ts ================================================ import { CURVES, CurveId, G1Point, G2Point, findValueInStringToCurveId } from "../../definitions"; import * as fs from 'fs'; import { bitLength, hexStringToBytes, modInverse, split128, toBigInt, toHexStr } from "../../hints/io"; import { createHash } from 'crypto'; import { RISC0_CONTROL_ROOT, RISC0_BN254_CONTROL_ID, RISC0_SYSTEM_STATE_ZERO_DIGEST, SP1_VERIFIER_HASH, SP1_VERIFIER_VERSION } from "../../../constants"; //https://github.com/risc0/risc0-ethereum/blob/main/contracts/src/groth16/ControlID.sol export interface Groth16Proof { a: G1Point, b: G2Point, c: G1Point, publicInputs: bigint[], curveId?: CurveId, imageIdJournalRisc0?: { imageId: Uint8Array, journal: Uint8Array }, vkeyPublicValuesSp1?: { vkey: Uint8Array, publicValues: Uint8Array } } export interface Groth16VerifyingKey { alpha: G1Point, beta: G2Point, gamma: G2Point, delta: G2Point, ic: G1Point[] } interface Output { journalDigest: Uint8Array; assumptionsDigest: Uint8Array; } interface ExitCode { system: number; user: number; } interface ReceiptClaim { preStateDigest: Uint8Array; postStateDigest: Uint8Array; exitCode: ExitCode; input: Uint8Array; output: Uint8Array; tagDigest?: Uint8Array; } export class KeyPatternNotFoundError extends Error { constructor(message: string) { super(message); this.name = "KeyPatternNotFoundError"; } } export const parseGroth16VerifyingKeyFromJson = (filePath: string): Groth16VerifyingKey => { try { const data: any = JSON.parse(fs.readFileSync(filePath, 'utf8')); return parseGroth16VerifyingKeyFromObject(data); } catch (err) { throw new Error(`Failed to parse Groth16 verifying key from ${filePath}: ${err}`); } } export const parseGroth16VerifyingKeyFromObject = (data: any): Groth16VerifyingKey => { try { const curveId = tryGuessingCurveIdFromJson(data); let verifyingKey: any; try { verifyingKey = findItemFromKeyPatterns(data, ["verifying_key"]) } catch (err) { verifyingKey = data; } try { const alpha = tryParseG1PointFromKey(verifyingKey, ['alpha'], curveId); const beta = tryParseG2PointFromKey(verifyingKey, ['beta'], curveId); const gamma = tryParseG2PointFromKey(verifyingKey, ['gamma'], curveId); const delta = tryParseG2PointFromKey(verifyingKey, ['delta'], curveId); if (curveId !== null && curveId !== undefined) { const ic: G1Point[] = findItemFromKeyPatterns(verifyingKey, ['ic']).map((point: any) => { const g1Point = tryParseG1Point(point, curveId) return g1Point; }); const vk: Groth16VerifyingKey = { alpha, beta, gamma, delta, ic } if (checkGroth16VerifyingKey(vk)) { return vk; } throw new Error(`Invalid Groth16 verifying key: ${vk}`); } throw new Error("Curve ID not provided"); } catch (err) { // Gnark case const g1Points = findItemFromKeyPatterns(verifyingKey, ['g1']); const g2Points = findItemFromKeyPatterns(verifyingKey, ['g2']); const alpha = tryParseG1PointFromKey(g1Points, ['alpha'], curveId); const beta = tryParseG2PointFromKey(g2Points, ['beta'], curveId); const gamma = tryParseG2PointFromKey(g2Points, ['gamma'], curveId); const delta = tryParseG2PointFromKey(g2Points, ['delta'], curveId); if (curveId !== null && curveId !== undefined) { const ic: G1Point[] = findItemFromKeyPatterns(g1Points, ['K']).map((point: any) => tryParseG1Point(point, curveId)); const vk = { alpha, beta, gamma, delta, ic } if (checkGroth16VerifyingKey(vk)) { return vk; } } throw new Error("Curve ID not provided"); } } catch (err) { throw new Error(`Failed to parse Groth16 verifying key from object: ${err}`); } } export const parseGroth16ProofFromJson = (proofPath: string, publicInputsPath?: string | null): Groth16Proof => { try { const data: any = JSON.parse(fs.readFileSync(proofPath, 'utf8')); let publicInputs: any = null; if (publicInputsPath && publicInputsPath !== null && publicInputsPath !== undefined) { try { publicInputs = JSON.parse(fs.readFileSync(publicInputsPath, 'utf8')); } catch (err) { throw new Error(`Invalid public inputs format: ${publicInputsPath}`); } } return parseGroth16ProofFromObject(data, publicInputs); } catch (err) { throw new Error(`Failed to parse Groth16 proof from ${proofPath}: ${err}`); } } export const parseGroth16ProofFromObject = (data: any, publicInputsData?: bigint[] | object): Groth16Proof => { try { let curveId = tryGuessingCurveIdFromJson(data); let proof: any = null; try { proof = findItemFromKeyPatterns(data, ['proof']); } catch (err) { proof = data } // Try RISC0 parsing first try { const sealHex = toHexStr(findItemFromKeyPatterns(data, ['seal'])); const imageIdHex = toHexStr(findItemFromKeyPatterns(data, ['image_id'])); const journalHex = toHexStr(findItemFromKeyPatterns(data, ['journal'])); const sealBytes = hexStringToBytes(sealHex); const imageIdBytes = hexStringToBytes(imageIdHex); const journalBytes = hexStringToBytes(journalHex); return createGroth16ProofFromRisc0(sealBytes, imageIdBytes, journalBytes) } catch (err) { // Continue to SP1 parsing } // Try SP1 parsing second try { const sp1VkeyHex = findItemFromKeyPatterns(data, ['vkey']); const sp1PublicValuesHex = findItemFromKeyPatterns(data, ['publicValues']); const sp1ProofHex = findItemFromKeyPatterns(data, ['proof']); let vkeyBytes: Uint8Array; let publicValuesBytes: Uint8Array; let proofBytes: Uint8Array; // Handle hex strings directly to preserve leading zeros if (typeof sp1VkeyHex === 'string') { vkeyBytes = hexStringToBytes(sp1VkeyHex); } else { vkeyBytes = hexStringToBytes(toHexStr(sp1VkeyHex)); } if (typeof sp1PublicValuesHex === 'string') { publicValuesBytes = hexStringToBytes(sp1PublicValuesHex); } else { publicValuesBytes = hexStringToBytes(toHexStr(sp1PublicValuesHex)); } if (typeof sp1ProofHex === 'string') { proofBytes = hexStringToBytes(sp1ProofHex); } else { proofBytes = hexStringToBytes(toHexStr(sp1ProofHex)); } return createGroth16ProofFromSp1(vkeyBytes, publicValuesBytes, proofBytes); } catch (err) { // Continue to regular proof parsing } let publicInputs: bigint[] = []; if (publicInputsData && publicInputsData !== null && publicInputsData !== undefined) { if (typeof publicInputsData === 'object' && !Array.isArray(publicInputsData)) { // If it's an object, convert it to a list (array) of its values publicInputs = Object.values(publicInputsData).map( (value: any) => toBigInt(value) ); } else if (Array.isArray(publicInputsData)) { publicInputs = publicInputsData.map((value: any) => toBigInt(value)); } else { throw new Error(`Invalid public inputs format: ${publicInputsData}`); } } else { try { publicInputs = findItemFromKeyPatterns(data, ['public']); } catch (err) { } } const a = tryParseG1PointFromKey(proof, ['a', 'Ar'], curveId); const b = tryParseG2PointFromKey(proof, ['b', 'Bs'], curveId); const c = tryParseG1PointFromKey(proof, ['c', 'Krs'], curveId); const returnProof = { a, b, c, publicInputs: publicInputs } if (checkGroth16Proof(returnProof)) { return returnProof; } throw new Error(`Invalid Groth16 proof: ${returnProof}`); } catch (err) { throw new Error(`Failed to parse Groth16 proof from object: ${err}`); } } export const createGroth16ProofFromRisc0 = (seal: Uint8Array, imageId: Uint8Array, journalBytes: Uint8Array, controlRoot: bigint = RISC0_CONTROL_ROOT, bn254ControlId: bigint = RISC0_BN254_CONTROL_ID): Groth16Proof => { if (imageId.length > 32) { throw new Error("imageId must be 32 bytes") } const [controlRoot0, controlRoot1] = splitDigest(controlRoot); const proof = seal.slice(4); const journal_digest = createHash("sha256").update(journalBytes).digest(); const claimDigest = digestReceiptClaim(ok(imageId, journal_digest)); const [claim0, claim1] = splitDigest(claimDigest); const groth16Proof: Groth16Proof = { a: { x: toBigInt(proof.slice(0, 32)), y: toBigInt(proof.slice(32, 64)), curveId: CurveId.BN254 }, b: { x: [ toBigInt(proof.slice(96, 128)), toBigInt(proof.slice(64, 96)) ], y: [ toBigInt(proof.slice(160, 192)), toBigInt(proof.slice(128, 160)) ], curveId: CurveId.BN254 }, c: { x: toBigInt(proof.slice(192, 224)), y: toBigInt(proof.slice(224, 256)), curveId: CurveId.BN254 }, publicInputs: [ controlRoot0, controlRoot1, claim0, claim1, bn254ControlId ], imageIdJournalRisc0: { imageId, journal: journalBytes } } if (checkGroth16Proof(groth16Proof)) { return groth16Proof; } throw new Error(`Invalid Groth16 proof: ${groth16Proof}`); } export const checkGroth16Proof = (proof: Groth16Proof): boolean => { return proof.a.curveId === proof.b.curveId && proof.b.curveId === proof.c.curveId; } export const checkGroth16VerifyingKey = (vk: Groth16VerifyingKey): boolean => { if (vk.ic.length <= 1) { return false; } //check if ic points are different for (let i = 0; i < vk.ic.length; i++) { for (let j = i + 1; j < vk.ic.length; j++) { if (vk.ic[i]?.x === vk.ic[j]?.x && vk.ic[i]?.y === vk.ic[j]?.y && vk.ic[i]?.curveId === vk.ic[j]?.curveId) { return false; } } if (vk.ic[i]?.curveId !== vk.alpha.curveId) { return false; } } return vk.alpha.curveId === vk.beta.curveId && vk.beta.curveId === vk.gamma.curveId && vk.gamma.curveId === vk.delta.curveId; } // Helper: concatenate multiple Uint8Arrays const concatBytes = (...arrays: Uint8Array[]): Uint8Array => { const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0); const result = new Uint8Array(totalLength); let offset = 0; for (const arr of arrays) { result.set(arr, offset); offset += arr.length; } return result; }; // Helper: write uint32 as big-endian bytes const uint32ToBE = (value: number): Uint8Array => { const arr = new Uint8Array(4); new DataView(arr.buffer).setUint32(0, value, false); return arr; }; // Helper: write uint16 as big-endian bytes const uint16ToBE = (value: number): Uint8Array => { const arr = new Uint8Array(2); new DataView(arr.buffer).setUint16(0, value, false); return arr; }; // Helper: encode string to bytes const stringToBytes = (str: string): Uint8Array => new TextEncoder().encode(str); // Helper: bytes to hex string const bytesToHex = (bytes: Uint8Array): string => Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join(''); const digestReceiptClaim = (receipt: ReceiptClaim): Uint8Array => { const { tagDigest, input, preStateDigest, postStateDigest, output, exitCode } = receipt; const systemExitCodeBytes = uint32ToBE(exitCode.system << 24); const userExitCodeBytes = uint32ToBE(exitCode.user << 24); const twoBytes = uint16ToBE(4 << 8); const data = concatBytes( tagDigest!, input, preStateDigest, postStateDigest, output, systemExitCodeBytes, userExitCodeBytes, twoBytes ); return createHash('sha256').update(data).digest(); } function ok(imageId: Uint8Array, journalDigest: Uint8Array): ReceiptClaim { const exitCode: ExitCode = { system: 0, user: 0 }; const output: Output = { journalDigest, assumptionsDigest: new Uint8Array(32) }; return { tagDigest: createHash('sha256').update(stringToBytes("risc0.ReceiptClaim")).digest(), preStateDigest: imageId, postStateDigest: RISC0_SYSTEM_STATE_ZERO_DIGEST, exitCode, input: new Uint8Array(32), output: digestOutput(output), }; } const digestOutput = (output: Output): Uint8Array => { const { journalDigest, assumptionsDigest } = output; const tagDigest = createHash('sha256').update(stringToBytes("risc0.Output")).digest(); const twoBytes = uint16ToBE(512); const combined = concatBytes( tagDigest, journalDigest, assumptionsDigest, twoBytes ); return createHash('sha256').update(combined).digest(); } const reverseByteOrderUint256 = (value: bigint | Uint8Array): bigint => { let valueBytes: Uint8Array; if (typeof value === 'bigint') { const hexString = value.toString(16).padStart(64, '0'); valueBytes = hexStringToBytes(hexString); } else { valueBytes = new Uint8Array(32); valueBytes.set(value.slice(0, 32), 0); } const reversedBytes = valueBytes.slice().reverse(); return BigInt('0x' + bytesToHex(reversedBytes)); } const splitDigest = (digest: bigint | Uint8Array): [bigint, bigint] => { const reversedDigest = reverseByteOrderUint256(digest); return split128(reversedDigest); } export const tryGuessingCurveIdFromJson = (data: Object): CurveId | null => { try { const curveId = findValueInStringToCurveId(findItemFromKeyPatterns(data, ['curve'])); return curveId; } catch (err) { let x: bigint | null = null; for (let value in iterateNestedDictToArray(data)) { try { x = toBigInt(value); break; } catch (err) { continue; } } if (x == null || x == undefined) { throw new Error("No integer found in the JSON data."); } if (bitLength(x) > 256) { return CurveId.BLS12_381; } else { return CurveId.BN254; } } } const iterateNestedDictToArray = (d: any): any[] => { const result: any[] = []; for (const key in d) { if (Object.prototype.hasOwnProperty.call(d, key)) { const value = d[key]; if (value && typeof value === 'object' && !Array.isArray(value)) { // Recursively collect values from nested objects result.push(...iterateNestedDictToArray(value)); } else { // Add the value to the result array result.push(value); } } } return result; } const findItemFromKeyPatterns = (data: { [key: string]: any }, keyPatterns: string[]): any => { let bestMatch = null; let bestScore = -1; let bestMatchFound: boolean = false; Object.keys(data).forEach(key => { keyPatterns.forEach(pattern => { if (key.toLowerCase() == pattern.toLowerCase()) { bestMatch = data[key]; bestMatchFound = true; } else if (!bestMatchFound && key.trim().toLowerCase().includes(pattern.trim().toLowerCase())) { //count number of matching character const re = new RegExp(pattern.toLowerCase(), 'g'); const occurences = key.toLowerCase().match(re); const score = occurences ? occurences.length : 0; if (score > bestScore) { bestScore = score; bestMatch = data[key]; } } }); }); if (bestMatch !== null) { return bestMatch; } throw new KeyPatternNotFoundError(`No key found with patterns ${keyPatterns}`); } export const getPFromCurveId = (curveId: CurveId): bigint => { return CURVES[curveId].p; } const projToAffine = (x: string | number | bigint | Uint8Array, y: string | number | bigint | Uint8Array, z: string | number | bigint | Uint8Array, curveId: CurveId): G1Point => { let xBigInt = toBigInt(x); let yBigInt = toBigInt(y); let zBigInt = toBigInt(z); const p = getPFromCurveId(curveId); zBigInt = modInverse(zBigInt, p); xBigInt = xBigInt * zBigInt % p; yBigInt = yBigInt * zBigInt % p; return { x: xBigInt, y: yBigInt, curveId } } const tryParseG1PointFromKey = (data: any, keyPatterns: string[], curveId: CurveId | null): G1Point => { const point = findItemFromKeyPatterns(data, keyPatterns); if (curveId === null || curveId === undefined) { throw new Error("Curve ID not provided"); } return tryParseG1Point(point, curveId); } const tryParseG1Point = (point: any, curveId: CurveId): G1Point => { if (typeof point === "object" && !Array.isArray(point)) { const x = toBigInt(findItemFromKeyPatterns(point, ["x"])) const y = toBigInt(findItemFromKeyPatterns(point, ["y"])) return { x, y, curveId } } else if (Array.isArray(point)) { if (point.length == 2) { return { x: toBigInt(point[0]), y: toBigInt(point[1]), curveId } } else if (point.length == 3) { return projToAffine(point[0], point[1], point[2], curveId); } throw new Error(`Invalid point: ${point}`); } else { throw new Error(`Invalid point: ${point}`); } } const tryParseG2PointFromKey = (data: any, keyPatterns: string[], curveId: CurveId | null): G2Point => { const point = findItemFromKeyPatterns(data, keyPatterns); if (curveId === null || curveId === undefined) { throw new Error("Curve ID not provided"); } return tryParseG2Point(point, curveId); } const tryParseG2Point = (point: any, curveId: CurveId): G2Point => { if (typeof point === "object" && !Array.isArray(point)) { const xG2 = findItemFromKeyPatterns(point, ["x"]); const yG2 = findItemFromKeyPatterns(point, ["y"]); if (typeof xG2 === "object" && typeof yG2 === "object" && !Array.isArray(xG2) && !Array.isArray(yG2)) { return { x: [ toBigInt(findItemFromKeyPatterns(xG2, ["a0"])), toBigInt(findItemFromKeyPatterns(xG2, ["a1"])) ], y: [ toBigInt(findItemFromKeyPatterns(yG2, ["a0"])), toBigInt(findItemFromKeyPatterns(yG2, ["a1"])) ], curveId: curveId }; } else if (Array.isArray(xG2) && Array.isArray(yG2)) { return { x: [toBigInt(xG2[0]), toBigInt(xG2[1])], y: [toBigInt(yG2[0]), toBigInt(yG2[1])], curveId: curveId }; } else { throw new Error(`Invalid point: ${point}`); } } else if (Array.isArray(point)) { let supposedX, supposedY; if (point.length === 2) { supposedX = point[0]; supposedY = point[1]; } else if (point.length === 3) { const check = [ toBigInt(point[2][0]), toBigInt(point[2][1]) ]; if (check[0] !== 1n || check[1] !== 0n) { throw new Error("Non standard projective coordinates"); } supposedX = point[0]; supposedY = point[1]; } if (Array.isArray(supposedX)) { if (supposedX.length !== 2) { throw new Error(`Invalid fp2 coordinates: ${supposedX}`); } supposedX = [toBigInt(supposedX[0]), toBigInt(supposedX[1])]; } if (Array.isArray(supposedY)) { if (supposedY.length !== 2) { throw new Error(`Invalid fp2 coordinates: ${supposedY}`); } supposedY = [toBigInt(supposedY[0]), toBigInt(supposedY[1])]; } return { x: supposedX, y: supposedY, curveId: curveId }; } else { throw new Error(`Invalid point: ${point}`); } } export const createGroth16ProofFromSp1 = (vkey: Uint8Array, publicValues: Uint8Array, proof: Uint8Array): Groth16Proof => { // SP1 version checking - first 4 bytes should match expected hash const sp1VerifierHashBytes = hexStringToBytes(SP1_VERIFIER_HASH); const selector = proof.slice(0, 4); const expectedSelector = sp1VerifierHashBytes.slice(0, 4); if (!selector.every((byte, index) => byte === expectedSelector[index])) { throw new Error(`Invalid SP1 proof version. Expected ${Array.from(expectedSelector).map(b => b.toString(16).padStart(2, '0')).join('')} for version ${SP1_VERIFIER_VERSION}, got ${Array.from(selector).map(b => b.toString(16).padStart(2, '0')).join('')}`); } if (publicValues.length % 32 !== 0) { throw new Error("SP1 public values must be a multiple of 32 bytes"); } // Hash public values and take mod 2^253 const pubInputHash = createHash("sha256").update(publicValues).digest(); const power253 = 1n << 253n; // 2^253 using bit shift const pubInputHashBigInt = toBigInt(pubInputHash) % power253; const actualProof = proof.slice(4); const groth16Proof: Groth16Proof = { a: { x: toBigInt(actualProof.slice(0, 32)), y: toBigInt(actualProof.slice(32, 64)), curveId: CurveId.BN254 }, b: { x: [ toBigInt(actualProof.slice(96, 128)), toBigInt(actualProof.slice(64, 96)) ], y: [ toBigInt(actualProof.slice(160, 192)), toBigInt(actualProof.slice(128, 160)) ], curveId: CurveId.BN254 }, c: { x: toBigInt(actualProof.slice(192, 224)), y: toBigInt(actualProof.slice(224, 256)), curveId: CurveId.BN254 }, publicInputs: [ toBigInt(vkey), pubInputHashBigInt ], vkeyPublicValuesSp1: { vkey, publicValues } }; if (checkGroth16Proof(groth16Proof)) { return groth16Proof; } throw new Error(`Invalid SP1 Groth16 proof: ${groth16Proof}`); }; ================================================ FILE: tools/npm/garaga_ts/src/node/starknet/honkContractGenerator/parsingUtils.ts ================================================ export enum HonkFlavor { KECCAK = 0, STARKNET = 1, } ================================================ FILE: tools/npm/garaga_ts/src/wasm/pkg/garaga_rs.d.ts ================================================ /* tslint:disable */ /* eslint-disable */ export function drand_calldata_builder(values: any[]): any[]; export function drand_tlock_encrypt_calldata_builder(values: any[]): any[]; export function msm_calldata_builder(values: any[], scalars: any[], curve_id: number, include_points_and_scalars: boolean, serialize_as_pure_felt252_array: boolean): any[]; export function mpc_calldata_builder(curve_id: number, values1: any[], n_fixed_g2: number, values2: any[]): any[]; export function schnorr_calldata_builder(rx: any, s: any, e: any, px: any, py: any, prepend_public_key: boolean, curve_id: number): any[]; export function ecdsa_calldata_builder(r: any, s: any, v: number, px: any, py: any, z: any, prepend_public_key: boolean, curve_id: number): any[]; export function eddsa_calldata_builder(ry_twisted: any, s: any, py_twisted: any, msg: any, prepend_public_key: boolean): any[]; export function rsa_2048_calldata_builder(signature: any, expected_message: any, modulus: any, prepend_public_key: boolean): any[]; export function rsa_2048_sha256_calldata_builder(signature: any, message: any, modulus: any, prepend_public_key: boolean): any[]; export function to_weirstrass(x_twisted: any, y_twisted: any): any[]; export function to_twistededwards(x_weirstrass: any, y_weirstrass: any): any[]; export function get_groth16_calldata(proof_js: any, vk_js: any, curve_id_js: any): any[]; export function get_zk_honk_calldata(proof_js: any, public_inputs_js: any, vk_js: any): any[]; export function poseidon_hash(x: any, y: any): any; export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; export interface InitOutput { readonly memory: WebAssembly.Memory; readonly drand_calldata_builder: (a: number, b: number) => [number, number, number, number]; readonly drand_tlock_encrypt_calldata_builder: (a: number, b: number) => [number, number, number, number]; readonly msm_calldata_builder: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number]; readonly mpc_calldata_builder: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number]; readonly schnorr_calldata_builder: (a: any, b: any, c: any, d: any, e: any, f: number, g: number) => [number, number, number, number]; readonly ecdsa_calldata_builder: (a: any, b: any, c: number, d: any, e: any, f: any, g: number, h: number) => [number, number, number, number]; readonly eddsa_calldata_builder: (a: any, b: any, c: any, d: any, e: number) => [number, number, number, number]; readonly rsa_2048_calldata_builder: (a: any, b: any, c: any, d: number) => [number, number, number, number]; readonly rsa_2048_sha256_calldata_builder: (a: any, b: any, c: any, d: number) => [number, number, number, number]; readonly to_weirstrass: (a: any, b: any) => [number, number, number, number]; readonly to_twistededwards: (a: any, b: any) => [number, number, number, number]; readonly get_groth16_calldata: (a: any, b: any, c: any) => [number, number, number, number]; readonly get_zk_honk_calldata: (a: any, b: any, c: any) => [number, number, number, number]; readonly poseidon_hash: (a: any, b: any) => [number, number, number]; readonly __wbindgen_exn_store: (a: number) => void; readonly __externref_table_alloc: () => number; readonly __wbindgen_export_2: WebAssembly.Table; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; readonly __externref_table_dealloc: (a: number) => void; readonly __externref_drop_slice: (a: number, b: number) => void; readonly __wbindgen_free: (a: number, b: number, c: number) => void; readonly __wbindgen_start: () => void; } export type SyncInitInput = BufferSource | WebAssembly.Module; /** * Instantiates the given `module`, which can either be bytes or * a precompiled `WebAssembly.Module`. * * @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. * * @returns {InitOutput} */ export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; /** * If `module_or_path` is {RequestInfo} or {URL}, makes a request and * for everything else, calls `WebAssembly.instantiate` directly. * * @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. * * @returns {Promise} */ export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; ================================================ FILE: tools/npm/garaga_ts/src/wasm/pkg/garaga_rs.js ================================================ let wasm; function addToExternrefTable0(obj) { const idx = wasm.__externref_table_alloc(); wasm.__wbindgen_export_2.set(idx, obj); return idx; } function handleError(f, args) { try { return f.apply(this, args); } catch (e) { const idx = addToExternrefTable0(e); wasm.__wbindgen_exn_store(idx); } } const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; let cachedUint8ArrayMemory0 = null; function getUint8ArrayMemory0() { if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); } return cachedUint8ArrayMemory0; } function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } function debugString(val) { // primitive types const type = typeof val; if (type == 'number' || type == 'boolean' || val == null) { return `${val}`; } if (type == 'string') { return `"${val}"`; } if (type == 'symbol') { const description = val.description; if (description == null) { return 'Symbol'; } else { return `Symbol(${description})`; } } if (type == 'function') { const name = val.name; if (typeof name == 'string' && name.length > 0) { return `Function(${name})`; } else { return 'Function'; } } // objects if (Array.isArray(val)) { const length = val.length; let debug = '['; if (length > 0) { debug += debugString(val[0]); } for(let i = 1; i < length; i++) { debug += ', ' + debugString(val[i]); } debug += ']'; return debug; } // Test for built-in const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); let className; if (builtInMatches && builtInMatches.length > 1) { className = builtInMatches[1]; } else { // Failed to match the standard '[object ClassName]' return toString.call(val); } if (className == 'Object') { // we're a user defined class or Object // JSON.stringify avoids problems with cycles, and is generally much // easier than looping through ownProperties of `val`. try { return 'Object(' + JSON.stringify(val) + ')'; } catch (_) { return 'Object'; } } // errors if (val instanceof Error) { return `${val.name}: ${val.message}\n${val.stack}`; } // TODO we could test for more things here, like `Set`s and `Map`s. return className; } let WASM_VECTOR_LEN = 0; const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' ? function (arg, view) { return cachedTextEncoder.encodeInto(arg, view); } : function (arg, view) { const buf = cachedTextEncoder.encode(arg); view.set(buf); return { read: arg.length, written: buf.length }; }); function passStringToWasm0(arg, malloc, realloc) { if (realloc === undefined) { const buf = cachedTextEncoder.encode(arg); const ptr = malloc(buf.length, 1) >>> 0; getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); WASM_VECTOR_LEN = buf.length; return ptr; } let len = arg.length; let ptr = malloc(len, 1) >>> 0; const mem = getUint8ArrayMemory0(); let offset = 0; for (; offset < len; offset++) { const code = arg.charCodeAt(offset); if (code > 0x7F) break; mem[ptr + offset] = code; } if (offset !== len) { if (offset !== 0) { arg = arg.slice(offset); } ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); const ret = encodeString(arg, view); offset += ret.written; ptr = realloc(ptr, len, offset, 1) >>> 0; } WASM_VECTOR_LEN = offset; return ptr; } let cachedDataViewMemory0 = null; function getDataViewMemory0() { if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { cachedDataViewMemory0 = new DataView(wasm.memory.buffer); } return cachedDataViewMemory0; } function isLikeNone(x) { return x === undefined || x === null; } function passArrayJsValueToWasm0(array, malloc) { const ptr = malloc(array.length * 4, 4) >>> 0; for (let i = 0; i < array.length; i++) { const add = addToExternrefTable0(array[i]); getDataViewMemory0().setUint32(ptr + 4 * i, add, true); } WASM_VECTOR_LEN = array.length; return ptr; } function takeFromExternrefTable0(idx) { const value = wasm.__wbindgen_export_2.get(idx); wasm.__externref_table_dealloc(idx); return value; } function getArrayJsValueFromWasm0(ptr, len) { ptr = ptr >>> 0; const mem = getDataViewMemory0(); const result = []; for (let i = ptr; i < ptr + 4 * len; i += 4) { result.push(wasm.__wbindgen_export_2.get(mem.getUint32(i, true))); } wasm.__externref_drop_slice(ptr, len); return result; } /** * @param {any[]} values * @returns {any[]} */ export function drand_calldata_builder(values) { const ptr0 = passArrayJsValueToWasm0(values, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; const ret = wasm.drand_calldata_builder(ptr0, len0); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v2 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v2; } /** * @param {any[]} values * @returns {any[]} */ export function drand_tlock_encrypt_calldata_builder(values) { const ptr0 = passArrayJsValueToWasm0(values, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; const ret = wasm.drand_tlock_encrypt_calldata_builder(ptr0, len0); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v2 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v2; } /** * @param {any[]} values * @param {any[]} scalars * @param {number} curve_id * @param {boolean} include_points_and_scalars * @param {boolean} serialize_as_pure_felt252_array * @returns {any[]} */ export function msm_calldata_builder(values, scalars, curve_id, include_points_and_scalars, serialize_as_pure_felt252_array) { const ptr0 = passArrayJsValueToWasm0(values, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; const ptr1 = passArrayJsValueToWasm0(scalars, wasm.__wbindgen_malloc); const len1 = WASM_VECTOR_LEN; const ret = wasm.msm_calldata_builder(ptr0, len0, ptr1, len1, curve_id, include_points_and_scalars, serialize_as_pure_felt252_array); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v3 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v3; } /** * @param {number} curve_id * @param {any[]} values1 * @param {number} n_fixed_g2 * @param {any[]} values2 * @returns {any[]} */ export function mpc_calldata_builder(curve_id, values1, n_fixed_g2, values2) { const ptr0 = passArrayJsValueToWasm0(values1, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; const ptr1 = passArrayJsValueToWasm0(values2, wasm.__wbindgen_malloc); const len1 = WASM_VECTOR_LEN; const ret = wasm.mpc_calldata_builder(curve_id, ptr0, len0, n_fixed_g2, ptr1, len1); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v3 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v3; } /** * @param {any} rx * @param {any} s * @param {any} e * @param {any} px * @param {any} py * @param {boolean} prepend_public_key * @param {number} curve_id * @returns {any[]} */ export function schnorr_calldata_builder(rx, s, e, px, py, prepend_public_key, curve_id) { const ret = wasm.schnorr_calldata_builder(rx, s, e, px, py, prepend_public_key, curve_id); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v1; } /** * @param {any} r * @param {any} s * @param {number} v * @param {any} px * @param {any} py * @param {any} z * @param {boolean} prepend_public_key * @param {number} curve_id * @returns {any[]} */ export function ecdsa_calldata_builder(r, s, v, px, py, z, prepend_public_key, curve_id) { const ret = wasm.ecdsa_calldata_builder(r, s, v, px, py, z, prepend_public_key, curve_id); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v1; } /** * @param {any} ry_twisted * @param {any} s * @param {any} py_twisted * @param {any} msg * @param {boolean} prepend_public_key * @returns {any[]} */ export function eddsa_calldata_builder(ry_twisted, s, py_twisted, msg, prepend_public_key) { const ret = wasm.eddsa_calldata_builder(ry_twisted, s, py_twisted, msg, prepend_public_key); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v1; } /** * @param {any} signature * @param {any} expected_message * @param {any} modulus * @param {boolean} prepend_public_key * @returns {any[]} */ export function rsa_2048_calldata_builder(signature, expected_message, modulus, prepend_public_key) { const ret = wasm.rsa_2048_calldata_builder(signature, expected_message, modulus, prepend_public_key); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v1; } /** * @param {any} signature * @param {any} message * @param {any} modulus * @param {boolean} prepend_public_key * @returns {any[]} */ export function rsa_2048_sha256_calldata_builder(signature, message, modulus, prepend_public_key) { const ret = wasm.rsa_2048_sha256_calldata_builder(signature, message, modulus, prepend_public_key); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v1; } /** * @param {any} x_twisted * @param {any} y_twisted * @returns {any[]} */ export function to_weirstrass(x_twisted, y_twisted) { const ret = wasm.to_weirstrass(x_twisted, y_twisted); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v1; } /** * @param {any} x_weirstrass * @param {any} y_weirstrass * @returns {any[]} */ export function to_twistededwards(x_weirstrass, y_weirstrass) { const ret = wasm.to_twistededwards(x_weirstrass, y_weirstrass); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v1; } /** * @param {any} proof_js * @param {any} vk_js * @param {any} curve_id_js * @returns {any[]} */ export function get_groth16_calldata(proof_js, vk_js, curve_id_js) { const ret = wasm.get_groth16_calldata(proof_js, vk_js, curve_id_js); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v1; } /** * @param {any} proof_js * @param {any} public_inputs_js * @param {any} vk_js * @returns {any[]} */ export function get_zk_honk_calldata(proof_js, public_inputs_js, vk_js) { const ret = wasm.get_zk_honk_calldata(proof_js, public_inputs_js, vk_js); if (ret[3]) { throw takeFromExternrefTable0(ret[2]); } var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); return v1; } /** * @param {any} x * @param {any} y * @returns {any} */ export function poseidon_hash(x, y) { const ret = wasm.poseidon_hash(x, y); if (ret[2]) { throw takeFromExternrefTable0(ret[1]); } return takeFromExternrefTable0(ret[0]); } async function __wbg_load(module, imports) { if (typeof Response === 'function' && module instanceof Response) { if (typeof WebAssembly.instantiateStreaming === 'function') { try { return await WebAssembly.instantiateStreaming(module, imports); } catch (e) { if (module.headers.get('Content-Type') != 'application/wasm') { console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); } else { throw e; } } } const bytes = await module.arrayBuffer(); return await WebAssembly.instantiate(bytes, imports); } else { const instance = await WebAssembly.instantiate(module, imports); if (instance instanceof WebAssembly.Instance) { return { instance, module }; } else { return instance; } } } function __wbg_get_imports() { const imports = {}; imports.wbg = {}; imports.wbg.__wbg_buffer_609cc3eee51ed158 = function(arg0) { const ret = arg0.buffer; return ret; }; imports.wbg.__wbg_get_67b2ba62fc30de12 = function() { return handleError(function (arg0, arg1) { const ret = Reflect.get(arg0, arg1); return ret; }, arguments) }; imports.wbg.__wbg_get_b9b93047fe3cf45b = function(arg0, arg1) { const ret = arg0[arg1 >>> 0]; return ret; }; imports.wbg.__wbg_instanceof_Object_7f2dcef8f78644a4 = function(arg0) { let result; try { result = arg0 instanceof Object; } catch (_) { result = false; } const ret = result; return ret; }; imports.wbg.__wbg_instanceof_Uint8Array_17156bcf118086a9 = function(arg0) { let result; try { result = arg0 instanceof Uint8Array; } catch (_) { result = false; } const ret = result; return ret; }; imports.wbg.__wbg_isArray_a1eab7e0d067391b = function(arg0) { const ret = Array.isArray(arg0); return ret; }; imports.wbg.__wbg_length_a446193dc22c12f8 = function(arg0) { const ret = arg0.length; return ret; }; imports.wbg.__wbg_length_e2d2a49132c1b256 = function(arg0) { const ret = arg0.length; return ret; }; imports.wbg.__wbg_new_a12002a7f91c75be = function(arg0) { const ret = new Uint8Array(arg0); return ret; }; imports.wbg.__wbg_set_65595bdd868b3009 = function(arg0, arg1, arg2) { arg0.set(arg1, arg2 >>> 0); }; imports.wbg.__wbindgen_add = function(arg0, arg1) { const ret = arg0 + arg1; return ret; }; imports.wbg.__wbindgen_bigint_from_str = function(arg0, arg1) { const ret = BigInt(getStringFromWasm0(arg0, arg1)); return ret; }; imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { const ret = debugString(arg1); const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }; imports.wbg.__wbindgen_init_externref_table = function() { const table = wasm.__wbindgen_export_2; const offset = table.grow(4); table.set(0, undefined); table.set(offset + 0, undefined); table.set(offset + 1, null); table.set(offset + 2, true); table.set(offset + 3, false); ; }; imports.wbg.__wbindgen_is_null = function(arg0) { const ret = arg0 === null; return ret; }; imports.wbg.__wbindgen_is_undefined = function(arg0) { const ret = arg0 === undefined; return ret; }; imports.wbg.__wbindgen_memory = function() { const ret = wasm.memory; return ret; }; imports.wbg.__wbindgen_number_get = function(arg0, arg1) { const obj = arg1; const ret = typeof(obj) === 'number' ? obj : undefined; getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); }; imports.wbg.__wbindgen_string_get = function(arg0, arg1) { const obj = arg1; const ret = typeof(obj) === 'string' ? obj : undefined; var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); var len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }; imports.wbg.__wbindgen_string_new = function(arg0, arg1) { const ret = getStringFromWasm0(arg0, arg1); return ret; }; imports.wbg.__wbindgen_throw = function(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); }; return imports; } function __wbg_init_memory(imports, memory) { } function __wbg_finalize_init(instance, module) { wasm = instance.exports; __wbg_init.__wbindgen_wasm_module = module; cachedDataViewMemory0 = null; cachedUint8ArrayMemory0 = null; wasm.__wbindgen_start(); return wasm; } function initSync(module) { if (wasm !== undefined) return wasm; if (typeof module !== 'undefined') { if (Object.getPrototypeOf(module) === Object.prototype) { ({module} = module) } else { console.warn('using deprecated parameters for `initSync()`; pass a single object instead') } } const imports = __wbg_get_imports(); __wbg_init_memory(imports); if (!(module instanceof WebAssembly.Module)) { module = new WebAssembly.Module(module); } const instance = new WebAssembly.Instance(module, imports); return __wbg_finalize_init(instance, module); } async function __wbg_init(module_or_path) { if (wasm !== undefined) return wasm; if (typeof module_or_path !== 'undefined') { if (Object.getPrototypeOf(module_or_path) === Object.prototype) { ({module_or_path} = module_or_path) } else { console.warn('using deprecated parameters for the initialization function; pass a single object instead') } } if (typeof module_or_path === 'undefined') { throw new Error(); } const imports = __wbg_get_imports(); if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { module_or_path = fetch(module_or_path); } __wbg_init_memory(imports); const { instance, module } = await __wbg_load(await module_or_path, imports); return __wbg_finalize_init(instance, module); } export { initSync }; export default __wbg_init; ================================================ FILE: tools/npm/garaga_ts/src/wasm/pkg/garaga_rs_bg.wasm.d.ts ================================================ declare const wasm_module_base64: string; export default wasm_module_base64; ================================================ FILE: tools/npm/garaga_ts/src/wasm/pkg/garaga_rs_bg.wasm.js ================================================ export default 'data:application/wasm;base64,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ZGF0YV9idWlsZGVyAKIEJGRyYW5kX3Rsb2NrX2VuY3J5cHRfY2FsbGRhdGFfYnVpbGRlcgCjBBRtc21fY2FsbGRhdGFfYnVpbGRlcgCIBBRtcGNfY2FsbGRhdGFfYnVpbGRlcgCPBBhzY2hub3JyX2NhbGxkYXRhX2J1aWxkZXIAiQQWZWNkc2FfY2FsbGRhdGFfYnVpbGRlcgCBBBZlZGRzYV9jYWxsZGF0YV9idWlsZGVyAJgEGXJzYV8yMDQ4X2NhbGxkYXRhX2J1aWxkZXIAnAQgcnNhXzIwNDhfc2hhMjU2X2NhbGxkYXRhX2J1aWxkZXIAnQQNdG9fd2VpcnN0cmFzcwCkBBF0b190d2lzdGVkZWR3YXJkcwClBBRnZXRfZ3JvdGgxNl9jYWxsZGF0YQCfBBRnZXRfemtfaG9ua19jYWxsZGF0YQCgBA1wb3NlaWRvbl9oYXNoAKkEFF9fd2JpbmRnZW5fZXhuX3N0b3JlANgEF19fZXh0ZXJucmVmX3RhYmxlX2FsbG9jAK0DE19fd2JpbmRnZW5fZXhwb3J0XzIBARFfX3diaW5kZ2VuX21hbGxvYwCZBBJfX3diaW5kZ2VuX3JlYWxsb2MAqwQZX19leHRlcm5yZWZfdGFibGVfZGVhbGxvYwCrAxZfX2V4dGVybnJlZl9kcm9wX3NsaWNlAJIDD19fd2JpbmRnZW5fZnJlZQDPBBBfX3diaW5kZ2VuX3N0YXJ0ABQJvQIBAEEBC5sBlAPzBIMEvwTLA8AE0APcA9oD0QPBBKIC9gTnBNYB7QOxBNQExgTsA+EC7ATpBMIErwSLBMAE0wTdA5AEkQSSBO4EywS3A9ME6wTEBPAExgTsA+IC6gTfA9UDsgSEBPsD+gOMBI0E6wP/AvkDrQSzBOkC6ALvBNMEuQOTA8YE7APfAu0E4AOWBOEDxgTsA+MC8QS/A88D2gOuBM4DvwTNA9cDzAPyBOIDtATjA4UEvwTABJoC1QT0BKwEtgTGBOwD5AL1BLUE5AOKBMYE0wS3BLgEsgO6BLgEsATFBMMEugS6BLkEvAS7BNUEzASfAocE+gTmA4ME5wOeBNsDxgTvA/MC+wTaBNkE3AT9A9sE/AS9BMgDigOpA4MFxgT2A+4C/QT+BNEE3QTeBKUCvAOGA6wC+AOABQwBNgrqj27zBLeHAgIIfyZ+IwBB8CdrIgMkAAJAAkACQAJAAkACQAJAIAJB4ABqIgVBwI3FAEEwEPEDBEAgAUHgAGoiBkHAjcUAQTAQ8QNFDQIgAikDMCEZIAIpAzghFiACKQNAIRcgAikDSCEVIAIpA1AhEyACKQNYIRFBiAEhBANAIANB4BtqIAEgBGopAwAiDkIAIBFCABDJAyADQfAbaiAOQgAgE0IAEMkDIANBgBxqIA5CACAVQgAQyQMgA0GQHGogDkIAIBdCABDJAyADQaAcaiAOQgAgFkIAEMkDIANBsBxqIA5CACAZQgAQyQMgA0HQG2ogAykD4BsiEiAUfCIcQv3/8//P///5iX9+Ig5CAEKr1f7///+//7l/QgAQyQMgA0HAG2ogDkIAQv//z4rr///VHkIAEMkDIANBsBtqIA5CAEKk7MO1j9S0mOcAQgAQyQMgA0GgG2ogDkIAQr+llJzP8NK75ABCABDJAyADQZAbaiAOQgBC19mumuT26Y3LAEIAEMkDIANBgBtqIA5CAEKazf/Lo73EgBpCABDJAyADKQOIGyADKQOwHCIOIA18IhogAykDqBwgAykDoBwiDSAQfCIYIA1UrXwgGCADKQOYHCALIAMpA5AcIgt8IhAgC1StfCAQIAMpA4gcIAMpA4AcIgsgDHwiDCALVK18IAwgAykD+BsgAykD8BsiCyAPfCINIAtUrXwgDSADKQPoGyASIBxWrXx8IgsgDVStfHwiDyAMVK18fCIMIBBUrXx8Ig0gGFStfHwiGyADKQOAG3wiGCAbVK18IBggAykDmBsgDSADKQOQG3wiECANVK18IBAgAykDqBsgDCADKQOgG3wiEiAMVK18IBIgAykDuBsgDyADKQOwG3wiDCAPVK18IAwgAykDyBsgCyADKQPAGyILfCINIAtUrXwgDSADKQPYGyADKQPQGyILIBx8IAtUrXx8IhQgDVStfHwiDyAMVK18fCIMIBJUrXx8IgsgEFStfHwiECAYVK18IBogG1atIAMpA7gcIA4gGlatfHx8IQ0gBEEIayIEQdgARw0ACyANQprN/8ujvcSAGlgNAQwECyADQbgfaiABQShqKQMANwMAIANBsB9qIAFBIGopAwA3AwAgA0GoH2ogAUEYaikDADcDACADQaAfaiABQRBqKQMANwMAIANBmB9qIAFBCGopAwA3AwAgA0HIH2ogAUE4aikDADcDACADQdAfaiABQUBrKQMANwMAIANB2B9qIAFByABqKQMANwMAIANB4B9qIAFB0ABqKQMANwMAIANB6B9qIAFB2ABqKQMANwMAIAMgASkDADcDkB8gAyABKQMwNwPAHyADQZggaiABQYgBaikDADcDACADQZAgaiABQYABaikDADcDACADQYggaiABQfgAaikDADcDACADQYAgaiABQfAAaikDADcDACADQfgfaiABQegAaikDADcDACADIAEpA2A3A/AfIAAgA0GQH2pBkAH8CgAADAULIA1Cms3/y6O9xIAaUQ0BIA8hDiAMIRIgCyERIBAhEwwDCyADQcggaiACQShqKQMANwMAIANBwCBqIAJBIGopAwA3AwAgA0G4IGogAkEYaikDADcDACADQbAgaiACQRBqKQMANwMAIANBqCBqIAJBCGopAwA3AwAgA0HYIGogAkEwaiIBQQhqKQMANwMAIANB4CBqIAFBEGopAwA3AwAgA0HoIGogAUEYaikDADcDACADQfAgaiABQSBqKQMANwMAIANB+CBqIAFBKGopAwA3AwAgAyACKQMANwOgICADIAEpAwA3A9AgIANBqCFqIAVBKGopAwA3AwAgA0GgIWogBUEgaikDADcDACADQZghaiAFQRhqKQMANwMAIANBkCFqIAVBEGopAwA3AwAgA0GIIWogBUEIaikDADcDACADIAUpAwA3A4AhIAAgA0GgIGpBkAH8CgAADAMLIBBC19mumuT26Y3LAFYNAAJAIBBC19mumuT26Y3LAFIEQCAPIQ4gDCESIAshESAQIRMMAQsgC0K/pZScz/DSu+QAVg0BQtfZrprk9umNywAhEyALQr+llJzP8NK75ABSBEAgDyEOIAwhEiALIREMAQsgDEKk7MO1j9S0mOcAVg0BQr+llJzP8NK75AAhESAMQqTsw7WP1LSY5wBSBEAgDyEOIAwhEgwBCyAPQv//z4rr///VHlYNAUKk7MO1j9S0mOcAIRIgD0L//8+K6///1R5SBEAgDyEODAELQv//z4rr///VHiEOIBRCqtX+////v/+5f1YNAQtCms3/y6O9xIAaIQ0MAQsgD0L//8+K6///1R59IhMgFEKr1f7///+//7l/VK0iEn0hDiAMQqTsw7WP1LSY5wB9IhEgD0L//8+K6///1R5UIBIgE1ZyrSIPfSES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yQMgA0GgGGogDkIAQr+llJzP8NK75ABCABDJAyADQZAYaiAOQgBC19mumuT26Y3LAEIAEMkDIANBgBhqIA5CAEKazf/Lo73EgBpCABDJAyADKQOIGCADKQOwGSIOIA18IhogAykDqBkgAykDoBkiDSAQfCIYIA1UrXwgGCADKQOYGSALIAMpA5AZIgt8IhAgC1StfCAQIAMpA4gZIAMpA4AZIgsgDHwiDCALVK18IAwgAykD+BggAykD8BgiCyAPfCINIAtUrXwgDSADKQPoGCASIBxWrXx8IgsgDVStfHwiDyAMVK18fCIMIBBUrXx8Ig0gGFStfHwiGyADKQOAGHwiGCAbVK18IBggAykDmBggDSADKQOQGHwiECANVK18IBAgAykDqBggDCADKQOgGHwiEiAMVK18IBIgAykDuBggDyADKQOwGHwiDCAPVK18IAwgAykDyBggCyADKQPAGCILfCINIAtUrXwgDSADKQPYGCADKQPQGCILIBx8IAtUrXx8IhQgDVStfHwiDyAMVK18fCIMIBJUrXx8IgsgEFStfHwiECAYVK18IBogG1atIAMpA7gZIA4gGlatfHx8IQ0gBEEIayIEQdgARw0ACwJAAkAgDUKazf/Lo73EgBpWDQAgDUKazf/Lo73EgBpSBEAgDyEOIAwhEiALIREgECETDAILIBBC19mumuT26Y3LAFYNAAJAIBBC19mumuT26Y3LAFIEQCAPIQ4gDCESIAshESAQIRMMAQsgC0K/pZScz/DSu+QAVg0BQtfZrprk9umNywAhEyALQr+llJzP8NK75ABSBEAgDyEOIAwhEiALIREMAQsgDEKk7MO1j9S0mOcAVg0BQr+llJzP8NK75AAhESAMQqTsw7WP1LSY5wBSBEAgDyEOIAwhEgwBCyAPQv//z4rr///VHlYNAUKk7MO1j9S0mOcAIRIgD0L//8+K6///1R5SBEAgDyEODAELQv//z4rr///VHiEOIBRCqtX+////v/+5f1YNAQtCms3/y6O9xIAaIQ0MAQsgD0L//8+K6///1R59IhMgFEKr1f7///+//7l/VK0iEn0hDiAMQqTsw7WP1LSY5wB9IhEgD0L//8+K6///1R5UIBIgE1ZyrSIPfSESIAtCv6WUnM/w0rvkAH0iEyAMQqTsw7WP1LSY5wBUIA8gEVZyrSIPfSERIBBC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AwsgA0HoJWogAUEoaikDADcDACADQeAlaiABQSBqKQMANwMAIANB2CVqIAFBGGopAwA3AwAgA0HQJWogAUEQaikDADcDACADQcglaiABQQhqKQMANwMAIANB+CVqIAdBCGopAwA3AwAgA0GAJmogB0EQaikDADcDACADQYgmaiAHQRhqKQMANwMAIANBkCZqIAdBIGopAwA3AwAgA0GYJmogB0EoaikDADcDACADIAEpAwA3A8AlIAMgBykDADcD8CUgA0HIJmogBkEoaikDADcDACADQcAmaiAGQSBqKQMANwMAIANBuCZqIAZBGGopAwA3AwAgA0GwJmogBkEQaikDADcDACADQagmaiAGQQhqKQMANwMAIAMgBikDADcDoCYgACADQcAlakGQAfwKAAAMCwtBkI3FAEErIANB7ydqQYCNxQBBsJLFABDKAwALIBBC19mumuT26Y3LAFYNBCAQQtfZrprk9umNywBSBEBCms3/y6O9xIAaIQ0MAQsgC0K/pZScz/DSu+QAVg0EQtfZrprk9umNywAhEyALQr+llJzP8NK75ABSBEBCms3/y6O9xIAaIQ0MAgsgDEKk7MO1j9S0mOcAVg0EQr+llJzP8NK75AAhESAMQqTsw7WP1LSY5wBSBEBCms3/y6O9xIAaIQ0MAwsgD0L//8+K6///1R5WDQRCpOzDtY/UtJjnACESIA9C///Piuv//9UeUQ0DQprN/8ujvcSAGiENIA8hDgwFCyAQIRMLIAshEQsgDCESIA8hDgwCC0L//8+K6///1R4hDiAUQqrV/v///7//uX9WDQBCms3/y6O9xIAaIQ0MAQsgD0L//8+K6///1R59IhMgFEKr1f7///+//7l/VK0iEn0hDiAMQqTsw7WP1LSY5wB9IhEgD0L//8+K6///1R5UIBIgE1ZyrSIPfSESIAtCv6WUnM/w0rvkAH0iEyAMQqTsw7WP1LSY5wBUIA8gEVZyrSIPfSERIBBC19mumuT26Y3LAH0iDCALQr+llJzP8NK75ABUIA8gE1ZyrSILfSETIA0gEELX2a6a5PbpjcsAVCALIAxWcq19QprN/8ujvcSAGn0hDSAUQtWqgYCAgMCAxgB8IRQLIAMgDjcD0CEgAyAUNwPYISADIBI3A8ghIAMgETcDwCEgAyATNwO4ISADIA03A7AhQprN/8ujvcSAGiEPIA1CAYYgEyATIBN8IhNWIBMgESARfCIQIBFUIBAgEiASfCIMIBJUIAwgDCAOIA58IgsgDlQgCyAUIBR8Ig0gFFStfCIRIAtUcq18IgxWcq18IhIgEFRyrXwiDiATVHKthCITIQsCQAJAAkAgE0Kazf/Lo73EgBpSDQBC19mumuT26Y3LACEPIA4iC0LX2a6a5PbpjcsAUg0AQr+llJzP8NK75AAhDyASIgtCv6WUnM/w0rvkAFINAEKk7MO1j9S0mOcAIQ8gDCILQqTsw7WP1LSY5wBSDQBC///Piuv//9UeIQ8gESILQv//z4rr///VHlINAEKr1f7///+//7l/IQ8gDSILQqvV/v///7//uX9RDQELIAsgD1oNACARIQsgDCERIBIhDCAOIRAMAQsgEUL//8+K6///1R59IhAgDUKr1f7///+//7l/VK0iD30hCyAMQqTsw7WP1LSY5wB9IhUgEUL//8+K6///1R5UIA8gEFZyrSIPfSERIBJCv6WUnM/w0rvkAH0iECAMQqTsw7WP1LSY5wBUIA8gFVZyrSIPfSEMIA5C19mumuT26Y3LAH0iFSASQr+llJzP8NK75ABUIA8gEFZyrSIPfSEQIBMgDkLX2a6a5PbpjcsAVCAPIBVWcq19QprN/8ujvcSAGn0hEyANQtWqgYCAgMCAxgB8IQ0LIAMgDTcD6CUgAyALNwPgJSADIBE3A9glIAMgDDcD0CUgAyAQNwPIJSADIBM3A8AlIANB4CFqIgUgA0HAJWoiAiADQbAhahC9AkEoIQQgA0HoJWpCADcDACADQeAlakIANwMAIANB2CVqQgA3AwAgA0HQJWpCADcDACADQcglakIANwMAIANCADcDwCUgA0HYJmoiByACIAYQuwEgAiAHIAYQuwEgA0GQImogAiAFEL0CIAMpA5AiIRkgAykDmCIhFiADKQOgIiEXIAMpA6giIRUgAykDsCIhEyADKQO4IiERQgAhFEIAIQ9CACEMQgAhC0IAIRBCACENA0AgA0HgCWogA0GQImogBGopAwAiDkIAIBFCABDJAyADQfAJaiAOQgAgE0IAEMkDIANBgApqIA5CACAVQgAQyQMgA0GQCmogDkIAIBdCABDJAyADQaAKaiAOQgAgFkIAEMkDIANBsApqIA5CACAZQgAQyQMgA0HQCWogAykD4AkiEiAUfCIcQv3/8//P///5iX9+Ig5CAEKr1f7///+//7l/QgAQyQMgA0HACWogDkIAQv//z4rr///VHkIAEMkDIANBsAlqIA5CAEKk7MO1j9S0mOcAQgAQyQMgA0GgCWogDkIAQr+llJzP8NK75ABCABDJAyADQZAJaiAOQgBC19mumuT26Y3LAEIAEMkDIANBgAlqIA5CAEKazf/Lo73EgBpCABDJAyADKQOICSADKQOwCiIOIA18IhogAykDqAogAykDoAoiDSAQfCIYIA1UrXwgGCADKQOYCiALIAMpA5AKIgt8IhAgC1StfCAQIAMpA4gKIAMpA4AKIgsgDHwiDCALVK18IAwgAykD+AkgAykD8AkiCyAPfCINIAtUrXwgDSADKQPoCSASIBxWrXx8IgsgDVStfHwiDyAMVK18fCIMIBBUrXx8Ig0gGFStfHwiGyADKQOACXwiGCAbVK18IBggAykDmAkgDSADKQOQCXwiECANVK18IBAgAykDqAkgDCADKQOgCXwiEiAMVK18IBIgAykDuAkgDyADKQOwCXwiDCAPVK18IAwgAykDyAkgCyADKQPACSILfCINIAtUrXwgDSADKQPYCSADKQPQCSILIBx8IAtUrXx8IhQgDVStfHwiDyAMVK18fCIMIBJUrXx8IgsgEFStfHwiECAYVK18IBogG1atIAMpA7gKIA4gGlatfHx8IQ0gBEEIayIEQXhHDQALAkACQCANQprN/8ujvcSAGlYNAAJAAkACQAJAIA1Cms3/y6O9xIAaUg0AIBBC19mumuT26Y3LAFYNBCAQQtfZrprk9umNywBSBEBCms3/y6O9xIAaIQ0MAQsgC0K/pZScz/DSu+QAVg0EQtfZrprk9umNywAhEyALQr+llJzP8NK75ABSBEBCms3/y6O9xIAaIQ0MAgsgDEKk7MO1j9S0mOcAVg0EQr+llJzP8NK75AAhESAMQqTsw7WP1LSY5wBSBEBCms3/y6O9xIAaIQ0MAwsgD0L//8+K6///1R5WDQRCpOzDtY/UtJjnACESIA9C///Piuv//9UeUQ0DQprN/8ujvcSAGiENIA8hDgwFCyAQIRMLIAshEQsgDCESIA8hDgwCC0L//8+K6///1R4hDiAUQqrV/v///7//uX9WDQBCms3/y6O9xIAaIQ0MAQsgD0L//8+K6///1R59IhMgFEKr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HiEOIBIiDUL//8+K6///1R5SDQBCq9X+////v/+5fyEOICUiDUKr1f7///+//7l/UQ0BCyANIA5aDQAgEiEnIA8hKCAMISQgCyEdDAELIBJC///Piuv//9UefSIRICVCq9X+////v/+5f1StIg19IScgD0Kk7MO1j9S0mOcAfSIOIBJC///Piuv//9UeVCANIBFWcq0iDX0hKCAMQr+llJzP8NK75AB9IhIgD0Kk7MO1j9S0mOcAVCANIA5Wcq0iDX0hJCALQtfZrprk9umNywB9Ig4gDEK/pZScz/DSu+QAVCANIBJWcq0iDX0hHSApIAtC19mumuT26Y3LAFQgDSAOVnKtfUKazf/Lo73EgBp9ISkgJULVqoGAgIDAgMYAfCElC0HYACEEQgAhFEIAIQ9CACEMQgAhC0IAIRBCACENA0AgA0HgA2ogASAEaikDACIOQgAgIUIAEMkDIANB8ANqIA5CACAgQgAQyQMgA0GABGogDkIAICNCABDJAyADQZAEaiAOQgAgIkIAEMkDIANBoARqIA5CACAmQgAQyQMgA0GwBGogDkIAIDBCABDJAyADQdADaiADKQPgAyISIBR8IhdC/f/z/8////mJf34iDkIAQqvV/v///7//uX9CABDJAyADQcADaiAOQgBC///Piuv//9UeQgAQyQMgA0GwA2ogDkIAQqTsw7WP1LSY5wBCABDJAyADQaADaiAOQgBCv6WUnM/w0rvkAEIAEMkDIANBkANqIA5CAELX2a6a5PbpjcsAQgAQyQMgA0GAA2ogDkIAQprN/8ujvcSAGkIAEMkDIAMpA4gDIAMpA7AEIg4gDXwiFSADKQOoBCADKQOgBCINIBB8IhAgDVStfCAQIAMpA5gEIAsgAykDkAQiC3wiESALVK18IBEgAykDiAQgAykDgAQiCyAMfCIMIAtUrXwgDCADKQP4AyADKQPwAyILIA98Ig0gC1StfCANIAMpA+gDIBIgF1atfHwiCyANVK18fCIPIAxUrXx8IgwgEVStfHwiDSAQVK18fCITIAMpA4ADfCIQIBNUrXwgECAQIAMpA5gDIA0gAykDkAN8IhEgDVStfCARIAMpA6gDIAwgAykDoAN8IhIgDFStfCASIAMpA7gDIA8gAykDsAN8IgwgD1StfCAMIAMpA8gDIAsgAykDwAMiC3wiDSALVK18IA0g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IA1CAEK/pZScz/DSu+QAQgAQyQMgA0HQAWogDUIAQtfZrprk9umNywBCABDJAyADQcABaiANQgBCms3/y6O9xIAaQgAQyQMgAykDyAEgAykD8AIiDiASfCIgIAMpA+gCIAMpA+ACIg0gEHwiECANVK18IBAgAykD2AIgCyADKQPQAiILfCISIAtUrXwgEiADKQPIAiADKQPAAiILIAx8IgwgC1StfCAMIAMpA7gCIAMpA7ACIgsgFXwiDSALVK18IA0gAykDqAIgDyAiVq18fCILIA1UrXx8Ig8gDFStfHwiDCASVK18fCINIBBUrXx8IhQgAykDwAF8IhwgFFStfCAcIAMpA9gBIA0gAykD0AF8IhAgDVStfCAQIAMpA+gBIAwgAykD4AF8IhIgDFStfCASIAMpA/gBIA8gAykD8AF8IgwgD1StfCAMIAMpA4gCIAsgAykDgAIiC3wiDSALVK18IA0gAykDmAIgAykDkAIiCyAifCALVK18fCIPIA1UrXx8IhUgDFStfHwiDCASVK18fCILIBBUrXx8IhAgHFStfCAUICBUrSADKQP4AiAOICBWrXx8fCESIARBCGsiBEF4Rw0ACwJAAkAgEkKazf/Lo73EgBpWDQACQAJAAkACQCASQprN/8ujvcSAGlINACAQQtfZrprk9umNywBWDQQgEELX2a6a5PbpjcsAUgRAQprN/8ujvcSAGiESDAELIAtCv6WUnM/w0rvkAFYNBELX2a6a5PbpjcsAIRkgC0K/pZScz/DSu+QAUgRAQprN/8ujvcSAGiESDAILIAxCpOzDtY/UtJjnAFYNBEK/pZScz/DSu+QAISAgDEKk7MO1j9S0mOcAUgRAQprN/8ujvcSAGiESDAMLIBVC///Piuv//9UeVg0EQqTsw7WP1LSY5wAhGiAVQv//z4rr///VHlENA0Kazf/Lo73EgBohEiAVIRwMBQsgECEZCyALISALIAwhGiAVIRwMAgtC///Piuv//9UeIRwgD0Kq1f7///+//7l/Vg0AQprN/8ujvcSAGiESDAELIBVC///Piuv//9UefSIOIA9Cq9X+////v/+5f1StIg19IRwgDEKk7MO1j9S0mOcAfSIRIBVC///Piuv//9UeVCANIA5Wcq0iDX0hGiALQr+llJzP8NK75AB9Ig4gDEKk7MO1j9S0mOcAVCANIBFWcq0iDH0hICAQQtfZrprk9umNywB9Ig0gC0K/pZScz/DSu+QAVCAMIA5Wcq0iC30hGSASIBBC19mumuT26Y3LAFQgCyANVnKtfUKazf/Lo73EgBp9IRIgD0LVqoGAgIDAgMYAfCEPC0HYACEEQgAhFEIAIRVCACEMQgAhC0IAIRBCACENA0AgA0HgAGogASAEaikDACIOQgAgL0IAEMkDIANB8ABqIA5CACAuQgAQyQMgA0GAAWogDkIAIC1CABDJAyADQZABaiAOQgAgLEIAEMkDIANBoAFqIA5CACArQgAQyQMgA0GwAWogDkIAICpCABDJAyADQdAAaiADKQNgIhEgFHwiFEL9//P/z///+Yl/fiIOQgBCq9X+////v/+5f0IAEMkDIANBQGsgDkIAQv//z4rr///VHkIAEMkDIANBMGogDkIAQqTsw7WP1LSY5wBCABDJAyADQSBqIA5CAEK/pZScz/DSu+QAQgAQyQMgA0EQaiAOQgBC19mumuT26Y3LAEIAEMkDIAMgDkIAQprN/8ujvcSAGkIAEMkDIAMpAwggAykDsAEiDiANfCIWIAMpA6gBIAMpA6ABIg0gEHwiEyANVK18IBMgAykDmAEgCyADKQOQASILfCIQIAtUrXwgECADKQOIASADKQOAASILIAx8IgwgC1StfCAMIAMpA3ggAykDcCILIBV8Ig0gC1StfCANIAMpA2ggESAUVq18fCILIA1UrXx8IhUgDFStfHwiDCAQVK18fCINIBNUrXx8IhcgAykDAHwiEyAXVK18IBMgAykDGCANIAMpAxB8IhAgDVStfCAQIAMpAyggDCADKQMgfCIRIAxUrXwgESADKQM4IBUgAykDMHwiDCAVVK18IAwgAykDSCALIAMpA0AiC3wiDSALVK18IA0gAykDWCADKQNQIgsgFHwgC1StfHwiFCANVK18fCIVIAxUrXx8IgwgEVStfHwiCyAQVK18fCIQIBNUrXwgFiAXVq0gAykDuAEgDiAWVq18fHwhDSAEQQhrIgRBKEcNAAsCQAJAIA1Cms3/y6O9xIAaVg0AAkACQAJAAkAgDUKazf/Lo73EgBpSDQAgEELX2a6a5PbpjcsAVg0EIBBC19mumuT26Y3LAFIEQEKazf/Lo73EgBohDQwBCyALQr+llJzP8NK75ABWDQRC19mumuT26Y3LACET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IRsMAQtC///Piuv//9UeIRsgC0Kq1f7///+//7l/Vg0BC0Kazf/Lo73EgBohEAwBCyAVQv//z4rr///VHn0iESALQqvV/v///7//uX9UrSINfSEbIBJCpOzDtY/UtJjnAH0iDiAVQv//z4rr///VHlQgDSARVnKtIg19ISEgD0K/pZScz/DSu+QAfSIRIBJCpOzDtY/UtJjnAFQgDSAOVnKtIg19IR4gDELX2a6a5PbpjcsAfSIOIA9Cv6WUnM/w0rvkAFQgDSARVnKtIg19IR8gECAMQtfZrprk9umNywBUIA0gDlZyrX1Cms3/y6O9xIAafSEQIAtC1aqBgICAwIDGAHwhCwtBKCEBIAMpA6AjISYgAykDqCMhIiADKQOwIyElIAMpA7gjISMgAykDwCMhICADKQPIIyEnQgAhDUIAIRFCACEMQgAhFUIAIRZCACEUA0AgA0HgEmogA0GgI2ogAWopAwAiDkIAICdCABDJAyADQfASaiAOQgAgIEIAEMkDIANBgBNqIA5CACAjQgAQyQMgA0GQE2ogDkIAICVCABDJAyADQaATaiAOQgAgIkIAEMkDIANBsBNqIA5CACAmQgAQyQMgA0HQEmogAykD4BIiDyANfCIaQv3/8//P///5iX9+Ig1CAEKr1f7///+//7l/QgAQyQMgA0HAEmogDUIAQv//z4rr///VHkIAEMkDIANBsBJqIA1CAEKk7MO1j9S0mOcAQgAQyQMgA0GgEmogDUIAQr+llJzP8NK75ABCABDJAyADQZASaiANQgBC19mumuT26Y3LAEIAEMkDIANBgBJqIA1CAEKazf/Lo73EgBpCABDJAyADKQOIEiADKQOwEyIOIBR8IhggAykDqBMgAykDoBMiDSAWfCIXIA1UrXwgFyADKQOYEyADKQOQEyINIBV8IhMgDVStfCATIAMpA4gTIAMpA4ATIg0gDHwiEiANVK18IBIgAykD+BIgAykD8BIiDSARfCIMIA1UrXwgDCADKQPoEiAPIBpWrXx8Ig0gDFStfHwiESASVK18fCIPIBNUrXx8IgwgF1StfHwiGSADKQOAEnwiFyAZVK18IBcgAykDmBIgDCADKQOQEnwiEyAMVK18IBMgAykDqBIgDyADKQOgEnwiEiAPVK18IBIgAykDuBIgESADKQOwEnwiDyARVK18IA8gAykDyBIg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DCAQQtfZrprk9umNywB9Ig8gC0K/pZScz/DSu+QAVCASIBNWcq0iC30hEyANIBBC19mumuT26Y3LAFQgCyAPVnKtfUKazf/Lo73EgBp9IQ0gFELVqoGAgIDAgMYAfCEUCyADIBQ3A4AnIAMgETcD+CYgAyAONwPwJiADIAw3A+gmIAMgEzcD4CYgAyANNwPYJiADQcAlaiICIANBsCRqIANB4B5qEIMCIANB4CRqIgQgA0GAHmogAhC7ASADQeglaiADQZgdaikDADcDACADQeAlaiADQZAdaikDADcDACADQdglaiADQYgdaikDADcDACADQdAlaiADQYAdaikDADcDACADQcglaiIBIANB+BxqKQMANwMAIAMgAykD8Bw3A8AlIANBkCVqIgYgA0GAJGoiBSACELsBIANBiCdqIAQgBhCDAiADQbgnaiAFIANBsB5qELsBIAIgA0HYJmoQ8gIgAygCwCUNASAAIAFBkAH8CgAACyADQfAnaiQADwtBkI3FAEErIANB7ydqQYCNxQBBwJLFABDKAwALr9oBAgl/KX4jAEHQKGsiAiQAIAJBoB1qECYCQAJAAkACQAJAAkACQCACKALAIEEBcQRAIAIpA6AhIS4gAikDmCEhLyACKQOQISEwIAIpA4ghITEgAikDgCEhMiACKQP4ICEzIAIpA/AgISIgAikD6CAhIyACKQPgICEkIAIpA9ggISUgAikD0CAhJiACKQPIICEnQSghAyACQegjaiACQdAhaikDADcDACACQeAjaiACQcghaikDADcDACACQdgjaiACQcAhaikDADcDACACQdAjaiACQbghaikDADcDACACQcgjaiACQbAhaikDADcDACACIAIpA6ghNwPAIyABKQMAIRMgASkDCCEVIAEpAxAhFiABKQMYIRcgASkDICEYIAEpAyghGQNAIAJBwBxqIAEgA2opAwAiDUIAIBlCABDJAyACQdAcaiANQgAgGEIAEMkDIAJB4BxqIA1CACAXQgAQyQMgAkHwHGogDUIAIBZCABDJAyACQYAdaiANQgAgFUIAEMkDIAJBkB1qIA1CACATQgAQyQMgAkGwHGogFCACKQPAHCIUfCISQgBCAEL9//P/z///+Yl/EMkDIAJBoBxqIAIpA7gcIg1CAEKr1f7///+//7l/QgAQyQMgAkGQHGogDUIAQv//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BEIANwMAIAJBgCdqIghCADcDACACQfgmaiIGQgA3AwAgAkIANwPwJgJAAkACQAJAAkACQCACQaAkaiACQfAmaiIJQTAQ8QMEQCAHIAJByCRqKQMANwMAIAUgAkHAJGopAwA3AwAgBCACQbgkaikDADcDACAIIAJBsCRqKQMANwMAIAYgAkGoJGopAwA3AwAgAiACKQOgJDcD8CYgAiAJQfiewABBMBDxAwR+Qv//z4rr///VHiACKQOQJyILfSIMIAIpA5gnIg1Cq9X+////v/+5f1atIhJ9IRlCpOzDtY/UtJjnACACKQOIJyIQfSIRIAwgElQgC0L//8+K6///1R5Wcq0iC30hGEK/pZScz/DSu+QAIAIpA4AnIgx9IhIgCyARViAQQqTsw7WP1LSY5wBWcq0iC30hG0LX2a6a5PbpjcsAIAIpA/gmIhB9IhEgCyASViAMQr+llJzP8NK75ABWcq0iC30hFkKazf/Lo73EgBogAikD8CYgCyARViAQQtfZrprk9umNywBWcq18fSEcQqvV/v///7//uX8gDX0FIBcLNwOwKCACIBk3A6goIAIgGDcDoCggAiAbNwOYKCACIBY3A5AoIAIgHDcDiChCACEUQgAhDEIAIRBCACENQgAhE0IAIREDQCACQYAWaiACQYgoaiADaikDACILQgAgIkIAEMkDIAJBkBZqIAtCACAjQgAQyQMgAkGgFmogC0IAICRCABDJAyACQbAWaiALQgAgJUIAEMkDIAJBwBZqIAtCACAmQgAQyQMgAkHQFmogC0IAICdCABDJAyACQfAVaiACKQOAFiIVIBF8IhJCAEIAQv3/8//P///5iX8QyQMgAkHgFWogAikD+BUiC0IAQqvV/v///7//uX9CABDJAyACQdAVaiALQgBC///Piuv//9UeQgAQyQMgAkHAFWogC0IAQqTsw7WP1LSY5wBCABDJAyACQbAVaiALQgBCv6WUnM/w0rvkAEIAEMkDIAJBoBVqIAtCAELX2a6a5PbpjcsAQgAQyQMgAkGQFWogC0IAQprN/8ujvcSAGkIAEMkDIAIpA5gVIAIpA9AWIhcgFHwiCyACKQPIFiACKQPAFiIRIAx8IgwgEVStfCAMIAwgAikDuBYgAikDsBYiESAQfCIQIBFUrXwgECAQIAIpA6gWIAIpA6AWIhEgDXwiDSARVK18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CyACKQOQEnwiC1atfCALIAIpA6gSIBIgEiACKQOgEnwiElatfCASIAIpA7gSIAIpA7ASIiEgFnwiFiAhVK18IBYgAikDyBIgECACKQPAEiIQfCAQVK18fCIcIBZUrXx8IhYgElStfHwiEiALVK18fCILIA1UrXx8Ig0gF1StfCAMIBNWrSACKQO4EyAMICBUrXx8fCETIANBCGsiA0F4Rw0ACwJAAkAgE0Kazf/Lo73EgBpWDQACQAJAAkACQCATQprN/8ujvcSAGlINACANQtfZrprk9umNywBWDQQgDULX2a6a5PbpjcsAUgRAQprN/8ujvcSAGiETDAELIAtCv6WUnM/w0rvkAFYNBELX2a6a5PbpjcsAIR4gC0K/pZScz/DSu+QAUgRAQprN/8ujvcSAGiETDAILIBJCpOzDtY/UtJjnAFYNBEK/pZScz/DSu+QAIR8gEkKk7MO1j9S0mOcAUgRAQprN/8ujvcSAGiETDAMLIBZC///Piuv//9UeVg0EQqTsw7WP1LSY5wAhISAWQv//z4rr///VHlENA0Kazf/Lo73EgBohEyAWISAMBQsgDSEeCyALIR8LIBIhISAWISAMAgtC///Piuv//9UeISAgHEKq1f7///+//7l/Vg0AQprN/8ujvcSAGiETDAELIBZC///Piuv//9UefSIMIBxCq9X+////v/+5f1StIg59ISAgEkKk7MO1j9S0mOcAfSIQIBZC///Piuv//9UeVCAMIA5Ucq0iDH0hISALQr+llJzP8NK75AB9Ig4gEkKk7MO1j9S0mOcAVCAMIBBWcq0iDH0hHyANQtfZrprk9umNywB9IhIgC0K/pZScz/DSu+QAVCAMIA5Wcq0iC30hHiATIA1C19mumuT26Y3LAFQgCyASVnKtfUKazf/Lo73EgBp9IRMgHELVqoGAgIDAgMYAfCEcC0EoIQNCACEPQgAhDEIAIRBCACENQgAhF0IAIQ4DQCACQZARaiACQYAlaiADaikDACILQgAgEUIAEMkDIAJBoBFqIAtCACAVQgAQyQMgAkGwEWogC0IAIBtCABDJAyACQcARaiALQgAgGUIAEMkDIAJB0BFqIAtCACAYQgAQyQMgAkHgEWogC0IAIBRCABDJAyACQYARaiACKQOQESIWIA58Ig5CAEIAQv3/8//P///5iX8QyQMgAkHwEGog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IBBUrXx8IhAgDFStfHwiDCAVVK18IAsgEVatIAIpA5gQIAsgG1StfHx8IREgA0EIayIDQXhHDQALAkACQCARQprN/8ujvcSAGlYNAAJAAkACQAJAIBFCms3/y6O9xIAaUg0AIAxC19mumuT26Y3LAFYNBCAMQtfZrprk9umNywBSBEBCms3/y6O9xIAaIREMAQsgEEK/pZScz/DSu+QAVg0EQtfZrprk9umNywAhFSAQQr+llJzP8NK75ABSBEBCms3/y6O9xIAaIREMAgsgDUKk7MO1j9S0mOcAVg0EQr+llJzP8NK75AAhDyANQqTsw7WP1LSY5wBSBEBCms3/y6O9xIAaIREMAwsgF0L//8+K6///1R5WDQRCpOzDtY/UtJjnACELIBdC///Piuv//9UeUQ0DQprN/8ujvcSAGiERIBchDgwFCyAMIRULIBAhDwsgDSELIBchDgwCC0L//8+K6///1R4hDiAUQqrV/v///7//uX9WDQBCms3/y6O9xIAaIREMAQsgF0L//8+K6///1R59IgsgFEKr1f7///+//7l/VK0iEn0hDiANQqTsw7WP1LSY5wB9Ig8gF0L//8+K6///1R5UIAsgElRyrSISfSELIBBCv6WUnM/w0rvkAH0iFSANQqTsw7WP1LSY5wBUIA8gElRyrSINfSEPIAxC19mumuT26Y3LAH0iEiAQQr+llJzP8NK75ABUIA0gFVZyrSINfSEVIBEgDELX2a6a5PbpjcsAVCANIBJWcq19QprN/8ujvcSAGn0hESAUQtWqgYCAgMCAxgB8IRQLIAIgFDcDiCYgAiAONwOAJiACIAs3A/glIAIgDzcD8CUgAiAVNwPoJSACIBE3A+AlQSghAyACQZgnakIANwMAIAJBkCdqQgA3AwAgAkGIJ2pCADcDACACQYAnakIANwMAIAJB+CZqQgA3AwAgAkIANwPwJgJAAkACQAJAAkACQAJAIAJB4CVqIAJB8CZqQTAQ8QMEQEIAIQ9CACERQgAhDkIAIQxCACELQgAhFANAIAJB8A1qIAJBsCVqIANqKQMAIg1CACAiQgAQyQMgAkGADmogDUIAICNCABDJAyACQZAOaiANQgAgJEIAEMkDIAJBoA5qIA1CACAlQgAQyQMgAkGwDmogDUIAICZCABDJAyACQcAOaiANQgAgJ0IAEMkDIAJB4A1q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AUK/pZScz/DSu+QAIRcgDEKk7MO1j9S0mOcAUgRAIAshEiAMIRUMAQsgC0L//8+K6///1R5WDQFCpOzDtY/UtJjnACEVIAtC///Piuv//9UeUgRAIAshEgwBC0L//8+K6///1R4hEiAPQqrV/v///7//uX9WDQELQprN/8ujvcSAGiEUDAELIAtC///Piuv//9UefSINIA9Cq9X+////v/+5f1StIhB9IRIgDEKk7MO1j9S0mOcAfSITIAtC///Piuv//9UeVCANIBBUcq0iC30hFSAOQr+llJzP8NK75AB9Ig0gDEKk7MO1j9S0mOcAVCALIBNWcq0iC30hFyARQtfZrprk9umNywB9IgwgDkK/pZScz/DSu+QAVCALIA1Wcq0iC30hFiAUIBFC19mumuT26Y3LAFQgCyAMVnKtfUKazf/Lo73EgBp9IRQgD0LVqoGAgIDAgMYAfCEPC0EoIQNCACEOQgAhDEIAIRBCACENQgAhE0IAIREDQCACQfAAaiACQagnaiADaikDACILQgAgD0IAEMkDIAJBgAFqIAtCACASQgAQyQMgAkGQAWogC0IAIBVCABDJAyACQaABaiALQgAgF0IAEMkDIAJBsAFqIAtCACAWQgAQyQMgAkHAAWogC0IAIBRCABDJAyACQeAAaiACKQNwIhggEXwiEUIAQgBC/f/z/8////mJfxDJAyACQdAAaiACKQNoIgtCAEKr1f7///+//7l/QgAQyQMgAkFAayALQgBC///Piuv//9UeQgAQyQMgAkEwaiALQgBCpOzDtY/UtJjnAEIAEMkDIAJBIGogC0IAQr+llJzP8NK75ABCABDJAyACQRBqIAtCAELX2a6a5PbpjcsAQgAQyQMgAiALQgBCms3/y6O9xIAaQgAQyQMgAikDCCACKQPAASIaIA58IgsgAikDuAEgAikDsAEiDiAMfCIMIA5UrXwgDCAMIAIpA6gBIBAgAikDoAEiEHwiDiAQVK18IA4gDiACKQOYASACKQOQASIQIA18Ig0gEFStfCANIA0gAikDiAEgEyACKQOAASITfCIQIBNUrXwgECAQIAIpA3ggESAYVK18fCIQVq18fCINVq18fCIOVq18fCIMVq18fCIYIAIpAwB8IhkgGFStfCAZIAIpAxggDCAMIAIpAxB8IgxWrXwgDCACKQMoIA4gDiACKQMg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A9gZIBEgElatIAMpA8gaIBAgEVatfHwiFCADKQOYGiAQIBhUrXx8IhAgAykDoBl8IhEgDSAOVq0gAykDuBkgDSASVK18fHwiEiADKQPQGXwiDSASVK18IA0gEyAWVq0gFSAOIBNWrXx8fCIOIA1UrXwiEyARIBJWrSADKQOoGSAQIBFWrXx8IhEgECAUVK18IhR8IhIgAykDsBh8Ig0gAykDyBggDiAOIAMpA8AYfCIOVq18IA4gDiAGIA9UrSADKQPYGCAPIBdUrXx8fCIOVq18fCIPIAMpA+AYfCIQIA9UrXwgECADKQP4GCIVIA4gDiAZfCIOVq18IA4gByAIVK0gFSAGIAhWrXx8fCIVIA5UrXx8IgYgEFStfCIQIA0gD1atIAMpA7gYIA0gElStfHwiDyASIBNUrSARIBRWrXx8IhF8IgggAykDwBd8Ig4gAykD2BcgBiAGIAMpA9AXfCIGVq18IAYgBiADKQPoFyADKQOoGCAHIAxWrXwiEiADKQPgF3wiByASVK18IAcgByAVfCIHVq18fCIGVq18fCISIAMpA/AXfCINIBJUrXwgDSADKQOIGCITIAYgBiADKQOAGCIUfCIGVq18IAYgEyAHIAcgFHwiB1atfCAHIAMpA5gYIAwgAykDkBgiDHwgDFStfHwiISAHVK18fCIaIAZUrXx8IiIgDVStfCIGIA4gElatIAMpA8gXIAggDlatfHwiByAIIBBUrSAPIBFWrXx8Igh8IiYgBlQgByAIVnIgJkIAU3IiBEUEQCAmIQwgGiIOICIiB4NCf1IgISISQm1UciAMQv///////////wBScg0BCyAaQgF8IgYgIUJtVK0iCH0hDiAiQgF8IgwgGkJ/UiAGIAhUcq0iBn0hByAmICJCf1IgBiAMVnKtfUL///////////8AfSEMICFCE3whEgsgCyAMfCINIAUgB3wiBiAFVCAGIAYgCSAOfCIFIAlUIAUgBSAKIBJ8IgwgClStfCIFVnKtfCIGVnKtfCEIAkACQCAIIA1UIAsgDVZyDQBC////////////ACELIAgiB0L///////////8AUQRAQn8hCUL///////////8AIQ4gBkJ/UgRAIAUhEiAGIQkMAwsgBUJ/UgRAIAUhEgwDC0JtIQsgDCIHQm1RDQELIAcgC1oNACAFIRIgBiEJIAghDgwBCyAFQgF8IgkgDEJtVK0iB30hEiAGQgF8IgogBUJ/UiAHIAlWcq0iBX0hCSAIIAZCf1IgBSAKVnKtfUL///////////8AfSEOIAxCE3whDAsgA0GAF2ogAykDuB0iF0IAQr4BQgAQyQMgA0HwFmogAykDgBciCEKblK/D8rWo3oZ/fiIFQgBCbUIAEMkDIANB4BZqIAVCAEJ/QgAQyQMgA0HwFWogBUIAQv///////////wBCABDJAyADQZAXaiADKQOwHSIYQgBCvgFCABDJAyADQdAWaiADKQPgFiIFIAMpA4gXfCIGIAMpA/gWIAMpA/AWIgcgCEJ+g3wgB1StfHwiCCADKQOQF3wiB0KblK/D8rWo3oZ/fiIKQgBCbUIAEMkDIANBwBZqIApCAEJ/QgAQyQMgA0GAFmogCkIAQv///////////wBCABDJAyADQaAXaiADKQOoHSIZQgBCvgFCABDJAyADQbAWaiADKQPAFiIKIAMpA5gXIAcgCFStfCILIAUgBiAIVq0gAykD6BYiDSAFIAZWrXx8Ig98IhB8IhF8IgUgAykD2BYgAykD0BYiBiAHfCAGVK18fCIGIAMpA6AXfCIIQpuUr8Pytajehn9+IgdCAEJtQgAQyQMgA0GgFmogB0IAQn9CABDJAyADQZAWaiAHQgBC////////////AEIAEMkDIANBsBdqIAMpA6AdIhxCAEK+AUIAEMkDIANB4BVqIAMpA6AWIgcgCiALIBFWrSIRIA0gDyAQVq18IhAgAykD8BV8IhN8Igt8Ig0gBSAGVq0gAykDyBYiFCAFIApUrXx8fCIFIAMpA6gXIAYgCFatfHwiFXwiBiADKQO4FiAIIAMpA7AWIgh8IAhUrXx8IgggAykDsBd8IgpCm5Svw/K1qN6Gf34iD0IAQm1CABDJAyADQdAVaiAPQgBCf0IAEMkDIANBwBVqIA9CAEL///////////8AQgAQyQMCQAJAIAMpA8gVIAMpA5gWIAMpA4gWIAMpA4AWIhYgAykD+BUgECATVq18fCIPIBZUrXwgDyAPIAsgEVStfCIPVq18IA8gBSANVK0gFCALIA1WrXx8fCILIA9UrXwiDyADKQOQFnwiDSAPVK18IA0gCyAFIBVWrXwiBSALVK18IgsgDVStfCALIAMpA6gWIg0gBSAFIAd8IgVWrXwgBSAFIAYgCFatIA0gBiAHVK18fHwiBVatfHwiBiALVK18IgsgAykDwBV8IgcgC1StfCAHIAYgBSADKQO4FyAIIApWrXx8IgsgBVStfCIFIAZUrXwiCCAHVK18IAggCCADKQPYFSIHIAUgBSADKQPQFSIGfCIFVq18IAUgByAGIAYgC3wiBlatfCAGIAMpA+gVIAMpA+AVIgcgCnwgB1StfHwiCiAGVK18fCIGIAVUrXx8IghWrXwiC0IAWQRAIAtC////////////AFIgCkJtVHIgBiAIg0J/UnINAQsgBkIBfCIHIApCbVStIg19IQUgCEIBfCIPIAZCf1IgByANVHKtIgZ9IQcgCyAIQn9SIAYgD1ZyrX1C////////////AH0hCyAKQhN8IQoMAQsgCCEHIAYhBQsgA0GwFWogCkIAIB1CABDJAyADQcAUaiAFQgAgHUIAEMkDIANB0BNqIAdCACAdQgAQyQMgA0HgEmogC0IAIB1CABDJAyADQaAVaiADKQOwFSINQpuUr8Pytajehn9+IgZCAEJtQgAQyQMgA0GQFWogBkIAQn9CABDJAyADQYAVaiAGQgBC////////////AEIAEMkDIANB8BRqIApCACAeQgAQyQMgA0GAFGogBUIAIB5CABDJAyADQZATaiAHQgAgHkIAEMkDIANBoBJqIAtCACAeQgAQyQMgA0GwFGogAykDkBUiBiADKQO4FSIRIAMpA8AUfCITfCIIIAMpA6gVIA0gAykDoBUiD3wgD1StfHwiDSADKQPwFHwiD0KblK/D8rWo3oZ/fiIQQgBCbUIAEMkDIANBoBRqIBBCAEJ/QgAQyQMgA0GQFGogEEIAQv///////////wBCABDJAyADQeAUaiAKQgAgH0IAEMkDIANB8BNqIAVCACAfQgAQyQMgA0GAE2ogB0IAIB9CABDJAyADQZASaiALQgAgH0IAEMkDIANBwBNqIAMpA/gUIA0gD1atfCIVIAMpA4AUfCIQIAYgAykDyBQgESATVq18IhYgAykD0BN8IhF8IhMgCCANVq0gAykDmBUiGyAGIAhWrXx8fCIlfCIGIAMpA6AUIiN8IgggAykDuBQgAykDsBQiDSAPfCANVK18fCINIAMpA+AUfCIPQpuUr8Pytajehn9+IhRCAEJtQgAQyQMgA0GwE2ogFEIAQn9CABDJAyADQaATaiAUQgBC////////////AEIAEMkDIANB0BRqIApCACAgQgAQyQMgA0HgE2ogBUIAICBCABDJAyADQfASaiAHQgAgIEIAEMkDIANBgBJqIAtCACAgQgAQyQMgA0HQEmogAykD6BQgDSAPVq18IiQgAykD8BN8IgUgIyADKQPYEyARIBZUrXwiFiADKQPgEnwiByADKQOAFXwiCiATICVWrSAbIBEgE1atfHx8IgsgAykDkBN8IhEgBiAQVK0gAykDiBQgECAVVK18fHwiEHwiEyAIIA1WrSADKQOoFCIVIAYgCFatfHx8Iht8IgYgAykDsBMiJXwiCCADKQPIEyADKQPAEyINIA98IA1UrXx8Ig0gAykD0BR8Ig9Cm5Svw/K1qN6Gf34iFEIAQm1CABDJAyADQcASaiAUQgBCf0IAEMkDIANBsBJqIBRCAEL///////////8AQgAQyQMCQAJAIAMpA7gSIAMpA6gTIAMpA5gUIAogC1atIAMpA4gVIAcgClatfHwiFCADKQPoEiAHIBZUrXx8IgcgAykDoBJ8IgogECARVK0gAykDmBMgCyARVq18fHwiCyADKQOQFHwiESALVK18IBEgEyAbVq0gFSAQIBNWrXx8fCIQIBFUrXwiESAKIAtWrSADKQOoEiAHIApWrXx8IhMgByAUVK18IhR8IgcgAykDkBJ8IgogAykDiBMgECADKQOAE3wiCyAQVK18IAsgBSAGVq0gAykD+BMgBSAkVK18fHwiBSALVK18fCILIAMpA6ATfCIQIAtUrXwgECADKQO4EyIVIAUgBSAlfCIFVq18IAUgCCANVq0gFSAGIAhWrXx8fCIIIAVUrXx8IgUgEFStfCIQIAogC1atIAMpA5gSIAcgClatfHwiFSAHIBFUrSATIBRWrXx8IhF8IgcgAykDgBJ8IgogAykD+BIgBSAFIAMpA/ASfCIFVq18IAUgBSADKQPoEyADKQPYFCANIA9WrXwiCyADKQPgE3wiBiALVK18IAYgBiAIfCIGVq18fCIFVq18fCINIAMpA7ASfCIIIA1UrXwgCCAIIAMpA8gSIgsgBSAFIAMpA8ASIhN8IgVWrXwgBSALIAYgBiATfCIGVq18IAYgAykD2BIgAykD0BIiCyAPfCALVK18fCILIAZUrXx8IgYgBVStfHwiCFatfCIFIAogDVatIAMpA4gSIAcgClatfHwiDSAHIBBUrSARIBVUrXx8Igd8IgogBVQgByANVHIgCkIAU3JFBEAgBiAIg0J/UiALQm1UciAKQv///////////wBScg0BCyAGQgF8IgcgC0JtVK0iDX0hBSAIQgF8Ig8gBkJ/UiAHIA1Ucq0iBn0hByAKIAhCf1IgBiAPVnKtfUL///////////8AfSEKIAtCE3whCwwBCyAIIQcgBiEFCwJ+AkACQCAKIgYgDiIIUg0AIAciBiAJIghSDQAgBSEGIBIiCCAFUg0AIAwiCCALIgZRDQELIAYgCFgNACAFIBJUIAUgEn0iBSALIAxUrSIGVHKtIgggByAJfSISQn+FfCINIAYgBUJ/hXwiBiALIAx9IgxCbVatIgtUrSIPfSEFIA0gD1QhAiAGIAt9IQYgByAJVCAIIBJWcq0gDiAKfXxC////////////AHwhB0JtIAx9DAELIBIgBX0iCCALIAxWrSINfSEGIAkgB30iDyAIIA1UIAUgElZyrSIIfSEFIAggD1YgByAJVnIhAiAOIAp9IQcgDCALfQshCiAHIAKtfSIJIQcCfwJAAkAgCSAcIgxSDQAgBSIHIBkiDFINACAGIgcgGCIMUg0AIAoiByAXIgxRDQELIAcgDFoNACAYIAZ9IgggCiAXVq0iB1QgBiAYVnKtIgYgGSAFfSIMQn+FfCIOIAhCf4UgB3wiCCAXIAp9IgdCbVatIgpUrSILfSEjIAggCn0hJCAFIBlWIAYgDFZyrSAJIBx9fEL///////////8AfCETQm0gB30hJSALIA5WDAELIAYgGH0iCCAKIBdUrSIHfSEkIAUgGX0iDCAGIBhUIAcgCFZyrSIGfSEjIAkgHH0hEyAKIBd9ISUgBSAZVCAGIAxWcgshAiADQcARaiAdQgBCyANCABDJAyADQbARaiADKQPAESIJQpuUr8Pytajehn9+IgVCAEJtQgAQyQMgA0GgEWogBUIAQn9CABDJAyADQbAQaiAFQgBC////////////AEIAEMkDIANB0BFqIB5CAELIA0IAEMkDIANBkBFqIAMpA6ARIgUgAykDyBF8IgYgAykDuBEgAykDsBEiCCAJQniDfCAIVK18fCIJIAMpA9ARfCIIQpuUr8Pytajehn9+IgdCAEJtQgAQyQMgA0GAEWogB0IAQn9CABDJAyADQcAQaiAHQgBC////////////AEIAEMkDIANB4BFqIB9CAELIA0IAEMkDIANB8BBqIAMpA4ARIgcgAykD2BEgCCAJVK18IgwgBSAGIAlWrSADKQOoESIKIAUgBlatfHwiDnwiC3wiEnwiBSADKQOYESADKQOQESIGIAh8IAZUrXx8IgYgAykD4BF8IglCm5Svw/K1qN6Gf34iCEIAQm1CABDJAyADQeAQaiAIQgBCf0IAEMkDIANB0BBqIAhCAEL///////////8AQgAQyQMgA0HwEWogIEIAQsgDQgAQyQMgA0GgEGogAykD4BAiCCAHIAwgElatIhIgCiALIA5UrXwiCyADKQOwEHwiDXwiDHwiCiAFIAZWrSADKQOIESIPIAUgB1StfHx8IgUgAykD6BEgBiAJVq18fCIQfCIGIAMpA/gQIAkgAykD8BAiCXwgCVStfHwiCSADKQPwEXwiB0KblK/D8rWo3oZ/fiIOQgBCbUIAEMkDIANBkBBqIA5CAEJ/QgAQyQMgA0GAEGogDkIAQv///////////wBCABDJAwJAAkAgAykDiBAgAykD2BAgAykDyBAgAykDwBAiESADKQO4ECALIA1WrXx8Ig4gEVStfCAOIA4gDCASVK18Ig5WrXwgDiAFIApUrSAPIAogDFStfHx8IgwgDlStfCIOIAMpA9AQfCIKIA5UrXwgCiAMIAUgEFatfCIFIAxUrXwiDCAKVK18IAwgAykD6BAiCiAFIAUgCHwiBVatfCAFIAUgBiAJVq0gCiAGIAhUrXx8fCIFVq18fCIGIAxUrXwiDCADKQOAEHwiCCAMVK18IAggBiAFIAMpA/gRIAcgCVStfHwiDCAFVK18IgUgBlStfCIJIAhUrXwgCSADKQOYECIIIAUgBSADKQOQECIGfCIFVq18IAUgCCAGIAYgDHwiBlatfCAGIAMpA6gQIAMpA6AQIgggB3wgCFStfHwiCiAGVK18fCIGIAVUrXx8IgggCVStfCILQgBZBEAgC0L///////////8AUiAKQm1UciAGIAiDQn9Scg0BCyAGQgF8IgkgCkJtVK0iB30hBSAIQgF8IgwgBkJ/UiAHIAlWcq0iBn0hCSALIAhCf1IgBiAMVnKtfUL///////////8AfSELIApCE3whCgwBCyAIIQkgBiEFC0LIAyEMIAMCfiAFIAuEQgBSIApCyANWckUEQEIAIQdCACEOQgAgCVANARoLIAUgCkLIA1StIgZUrSIIIAlCf4V8IgcgBiAFQn+FfCIFIApCtgN9QhJUrSIGVK0iDH0hDiAIIAlWrSALfSAHIAxUrX1C////////////AHwhB0K1AyEMIAUgBn0LNwPQHSADIA43A8gdIAMgBzcDwB0gAyAMIAp9NwPYHQJAAkAgA0HAHWpB6NHBAEEgEPEDBEAgEyACrX0hLCADQfAdakIANwMAIANB6B1qQgA3AwAgA0IANwPgHSADQgE3A/gdIANBmB5qIANB2B1qKQMANwMAIANBkB5qIANB0B1qKQMANwMAIANBiB5qIANByB1qKQMANwMAIAMgAykDwB03A4AeIANBuB5qQeDRwQApAwA3AwAgA0GwHmpB2NHBACkDADcDACADQageakHQ0cEAKQMANwMAIANByNHBACkDADcDoB4CQCADQYAeaiADQeAdakEgEPEDRQRAQqQLIQxCACEKQgAhEEIAIREMAQtCpAshDCADKQOYHiEFIAMpA4AeIQ4gAykDkB4hFSADKQOIHiEGQgAhB0IAIRRCACETQgAhC0IAIRFCACEQQgAhCkJtIQlC////////////ACESQn8hCEJ/IRYDQCADQaAeaiADQeAdakEgEPEDRQRAIAshCiATIRAgFCERIAchDAwCCyAFp0EBcUUEQANAIBVCP4YgBUIBiIQhBQJ+IAynQQFxRQRAIBFCP4YgDEIBiIQhDCAQQj+GIBFCAYiEIREgCkI/hiAQQgGIhAwBCyAQQgF9Ig8gEUIAUiARQgF9Ig0gDEITfSIbIAxUrXwiDCANVHKtfCINQj+GIAxCAYiEIREgDEI/hiAbQgGIhCEMIAogEEIAUiANIA9Ucq18Qv///////////wB8IgpCP4YgDUIBiIQLIRAgDkI/hiAGQj+GIBVCAYiEIRUgDkIBiCEOIApCAYghCiAGQgGIhCEGIAVCAYNQDQALIAMgBjcDiB4gAyAVNwOQHgsgAyAONwOAHiADIAU3A5geIAmnQQFxRQRAA0AgFkI/hiAJQgGIhCEJAn4gB0IBg1BFBEAgE0IBfSIPIBRCAFIgFEIBfSINIAdCE30iGyAHVK18IgcgDVRyrXwiDUI/hiAHQgGIhCEUIAdCP4YgG0IBiIQhByALIBNCAFIgDSAPVHKtfEL///////////8AfCILQj+GIA1CAYiEDAELIBRCP4YgB0IBiIQhByATQj+GIBRCAYiEIRQgC0I/hiATQgGIhAshEyASQj+GIAhCP4YgFkIBiIQhFiASQgGIIRIgC0IBiCELIAhCAYiEIQggCUIBg1ANAAsgAyAINwOoHiADIBY3A7AeCyADIAk3A7geIAMgEjcDoB4gDiEPAkACQAJAAkACQCASIg0gDlINACAIIQ0gBiEPIAYgCFINACAVIg8gFiINUg0AIAkhDSAFIQ8gBSAJUQ0BCyANIA9YDQAgAyAJIAV9Ig03A7geIAMgFiAVfSIbIAUgCVatIgl9Ig83A7AeIAMgCCAGfSInIAkgG1YgFSAWVnKtIgl9Ihs3A6geIAMgEiAOfSAJICdWIAYgCFZyrX0iEjcDoB4CQAJAIAoiCCALIglSDQAgECIIIBMiCVINACARIgggFCIJUg0AIAchCSAHIAwiCFENAQsgCCAJVg0CCyALIAp9IBMgEH0iJyAUIBF9Ii0gByAMVK0iLlQgESAUVnKtIhRUIBAgE1ZyrX0hCyAHIAx9IQcgDyEWIBshCCANIQkgJyAUfSETIC0gLn0hFAwDCyADIAUgCX0iDTcDmB4gAyAVIBZ9IhsgBSAJVK0iBX0iDzcDkB4gAyAGIAh9IicgFSAWVCAFIBtWcq0iBX0iFTcDiB4gAyAOIBJ9IAYgCFQgBSAnVnKtfSIONwOAHgJAAkAgCiIFIAsiBlINACAQIgUgEyIGUg0AIBEiBSAUIgZSDQAgDCIFIAciBlENAQsgBSAGVA0CCyAKIAt9IBAgE1QgECATfSIQIBEgFFQgESAUfSIRIAcgDFatIhtUcq0iJ1RyrX0hCiAMIAd9IQwgFSEGIA8hFSANIQUgECAnfSEQIBEgG30hEQwCCyALQn9CACAQQn+FIgkgEUJ/hSIIIAxCbVatIgtUrSIWVBsgCn18IBMgCSAWfSITfCIJIBNUIAkgCCALfSILIBR8IgggC1QgCEJtIAx9IgsgB3wiByALVK18IhQgCFRyrXwiEyAJVHKtfEL///////////8AfCELIA8hFiAbIQggDSEJDAELIAogC30gE0J/hSIFIBRCf4UiBiAHQm1WrSIKVK0iG1StfSAQIAUgG30iEHwiBSAQVCAFIAYgCn0iCiARfCIGIApUIAZCbSAHfSIKIAx8IgwgClStfCIRIAZUcq18IhAgBVRyrXxC////////////AHwhCiAVIQYgDyEVIA0hBQsgA0GAHmogA0HgHWpBIBDxAw0ACwsgA0HwD2ogDEIAICVCABDJAyADQbAPaiAMQgAgJEIAEMkDIANBoA9qIAxCACAjQgAQyQMgA0GQD2ogDEIAICxCABDJAyADQeAPaiADKQPwDyIJQpuUr8Pytajehn9+IgVCAEJtQgAQyQMgA0HQD2ogBUIAQn9CABDJAyADQcAPaiAFQgBC////////////AEIAEMkDIANBgA9qIBFCACAlQgAQyQMgA0HADmogEUIAICRCABDJAyADQbAOaiARQgAgI0IAEMkDIANBoA5qIBFCACAsQgAQyQMgA0HwDmogAykD0A8iBSADKQP4DyIMIAMpA7APfCIOfCIGIAMpA+gPIAkgAykD4A8iCHwgCFStfHwiCSADKQOAD3wiCEKblK/D8rWo3oZ/fiIHQgBCbUIAEMkDIANB4A5qIAdCAEJ/QgAQyQMgA0HQDmogB0IAQv///////////wBCABDJAyADQZAOaiAQQgAgJUIAEMkDIANB0A1qIBBCACAkQgAQyQMgA0HADWogEEIAICNCABDJAyADQbANaiAQQgAgLEIAEMkDIANBgA5qIAMpA4gPIAggCVStfCINIAMpA8AOfCIHIAUgAykDuA8gDCAOVq18IhIgAykDoA98Igx8Ig4gBiAJVq0gAykD2A8iDyAFIAZWrXx8fCIQfCIFIAMpA+AOIhF8IgYgAykD+A4gAykD8A4iCSAIfCAJVK18fCIJIAMpA5AOfCIIQpuUr8Pytajehn9+IgtCAEJtQgAQyQMgA0HwDWogC0IAQn9CABDJAyADQeANaiALQgBC////////////AEIAEMkDIANBoA1qIApCACAlQgAQyQMgA0HgDGogCkIAICRCABDJAyADQdAMaiAKQgAgI0IAEMkDIANBwAxqIApCACAsQgAQyQMgA0GQDWogAykDmA4gCCAJVK18IhMgAykD0A18IgogESADKQOoDyAMIBJUrXwiFCADKQOQD3wiCyADKQPAD3wiEiAOIBBWrSAPIAwgDlatfHx8IgwgAykDsA58Ig4gBSAHVK0gAykDyA4gByANVK18fHwiB3wiDSAGIAlWrSADKQPoDiIQIAUgBlatfHx8IhF8IgUgAykD8A0iFXwiBiADKQOIDiADKQOADiIJIAh8IAlUrXx8IgkgAykDoA18IghCm5Svw/K1qN6Gf34iD0IAQm1CABDJAyADQYANaiAPQgBCf0IAEMkDIANB8AxqIA9CAEL///////////8AQgAQyQMgAykD+AwgAykD6A0gAykD2A4gDCASVK0gAykDyA8gCyASVq18fCIPIAMpA5gPIAsgFFStfHwiCyADKQOgDnwiEiAHIA5UrSADKQO4DiAMIA5WrXx8fCIMIAMpA9AOfCIOIAxUrXwgDiANIBFWrSAQIAcgDVatfHx8IgcgDlStfCINIAwgElStIAMpA6gOIAsgElatfHwiEiALIA9UrXwiD3wiDCADKQOwDXwiDiADKQPIDSAHIAcgAykDwA18IgdWrXwgByAHIAUgClStIAMpA9gNIAogE1StfHx8IgdWrXx8IgogAykD4A18IgsgClStfCALIAMpA/gNIhAgByAHIBV8IgdWrXwgByAGIAlWrSAQIAUgBlatfHx8IhAgB1StfHwiBSALVK18IgsgCiAOVK0gAykDuA0gDCAOVq18fCIOIAwgDVStIA8gElStfHwiEnwiByADKQPADHwiDCADKQPYDCAFIAUgAykD0Ax8IgVWrXwgBSAFIAMpA+gMIAMpA6gNIAggCVStfCIJIAMpA+AMfCIGIAlUrXwgBiAGIBB8IgZWrXx8IgVWrXx8IgkgAykD8Ax8IgogCVStfCAKIAMpA4gNIg0gBSAFIAMpA4ANIg98IgVWrXwgBSAFIA0gBiAGIA98IgZWrXwgBiADKQOYDSAIIAMpA5ANIgh8IAhUrXx8IiMgBlStfHwiBVatfHwiBiAKVK18IgggCSAMVK0gAykDyAwgByAMVq18fCIJIAcgC1StIA4gElatfHwiB3wiJCAIVCAHIAlUciAkQgBTckUEQCAFIAaDQn9SICNCbVRyICRC////////////AFJyDQILIAVCAXwiCSAjQm1UrSIIfSEbIAZCAXwiByAFQn9SIAggCVZyrSIFfSElICQgBkJ/UiAFIAdWcq19Qv///////////wB9ISQgI0ITfCEjDAILIANCAjcDoB5BjPfBAEErIANBoB5qQfz2wQBB+JDCABDKAwALIAYhJSAFIRsLAkACQCAERQRAIBogIoNCf1IgIUJtVHIgJkL///////////8AUnINAQsgGkIBfCIFICFCbVStIgZ9IQsgIkIBfCIJIBpCf1IgBSAGVHKtIgV9IQogJiAiQn9SIAUgCVZyrX1C////////////AH0hJiAhQhN8ISEMAQsgIiEKIBohCwsgJiArfCIFIAogKnwiCSAqVCAJIAkgCyApfCIGIClUIAYgBiAhICh8IgwgKFStfCIGVnKtfCIJVnKtfCEIAkACQCAFICtUIAUgCFZyDQBC////////////ACEHIAgiBUL///////////8AUQRAQn8hB0L///////////8AIQUgCUJ/UgRAIAYhDiAJIQcMAwsgBkJ/UgRAIAYhDgwDC0JtIQcgDCIFQm1RDQELIAUgB1oNACAGIQ4gCSEHIAghBQwBCyAGQgF8IgUgDEJtVK0iB30hDiAJQgF8IgogBkJ/UiAFIAdUcq0iBX0hByAIIAlCf1IgBSAKVnKtfUL///////////8AfSEFIAxCE3whDAsgA0HwCmogF0IAIB1CABDJAyADQbAKaiAYQgAgHUIAEMkDIANB8AlqIBlCACAdQgAQyQMgA0GwCWogHEIAIB1CABDJAyADQeAKaiADKQPwCiIIQpuUr8Pytajehn9+IgZCAEJtQgAQyQMgA0HQCmogBkIAQn9CABDJAyADQcAKaiAGQgBC////////////AEIAEMkDIANBsAtqIBdCACAeQgAQyQMgA0GgC2ogGEIAIB5CABDJAyADQZALaiAZQgAgHkIAEMkDIANBgAtqIBxCACAeQgAQyQMgA0GgCmogAykD0AoiBiADKQP4CiISIAMpA7AKfCINfCIJIAMpA+gKIAggAykD4AoiCnwgClStfHwiCCADKQOwC3wiCkKblK/D8rWo3oZ/fiILQgBCbUIAEMkDIANBkApqIAtCAEJ/QgAQyQMgA0GACmogC0IAQv///////////wBCABDJAyADQfALaiAXQgAgH0IAEMkDIANB4AtqIBhCACAfQgAQyQMgA0HQC2ogGUIAIB9CABDJAyADQcALaiAcQgAgH0IAEMkDIANB4AlqIAMpA7gLIAggClatfCITIAMpA6ALfCILIAYgAykDuAogDSASVK18IhAgAykD8Al8IhJ8Ig0gCCAJVK0gAykD2AoiFCAGIAlWrXx8fCIVfCIGIAMpA5AKIhZ8IgkgAykDqAogAykDoAoiCCAKfCAIVK18fCIIIAMpA/ALfCIKQpuUr8Pytajehn9+Ig9CAEJtQgAQyQMgA0HQCWogD0IAQn9CABDJAyADQcAJaiAPQgBC////////////AEIAEMkDIANBsAxqIBdCACAgQgAQyQMgA0GgDGogGEIAICBCABDJAyADQZAMaiAZQgAgIEIAEMkDIANBgAxqIBxCACAgQgAQyQMgA0GgCWogAykD+AsgCCAKVq18IhogAykD4At8Ig8gFiADKQP4CSAQIBJWrXwiIiADKQOwCXwiECADKQPACnwiESANIBVWrSAUIA0gElStfHx8IhIgAykDkAt8Ig0gBiALVK0gAykDqAsgCyATVK18fHwiC3wiEyAIIAlUrSADKQOYCiIVIAYgCVatfHx8IhZ8IgYgAykD0AkiIXwiCSADKQPoCSADKQPgCSIIIAp8IAhUrXx8IgggAykDsAx8IgpCm5Svw/K1qN6Gf34iFEIAQm1CABDJAyADQZAJaiAUQgBCf0IAEMkDIANBgAlqIBRCAEL///////////8AQgAQyQMCQAJAIAMpA4gJIAMpA8gJIAMpA4gKIBEgElatIAMpA8gKIBAgEVatfHwiFCADKQO4CSAQICJUrXx8IhAgAykDgAt8IhEgCyANVK0gAykDmAsgDSASVK18fHwiEiADKQOACnwiDSASVK18IA0gEyAWVq0gFSALIBNWrXx8fCILIA1UrXwiEyARIBJWrSADKQOICyAQIBFWrXx8IhEgECAUVK18IhR8IhIgAykDwAt8Ig0gAykD2AsgCyALIAMpA9ALfCILVq18IAsgCyAGIA9UrSADKQPoCyAPIBpUrXx8fCILVq18fCIPIAMpA8AJfCIQIA9UrXwgECADKQPYCSIVIAsgCyAhfCILVq18IAsgCyAIIAlUrSAVIAYgCVatfHx8IgtWrXx8IgYgEFStfCIQIA0gD1atIAMpA8gLIA0gElStfHwiFSASIBNUrSARIBRWrXx8IhF8IgkgAykDgAx8IhIgAykDmAwgBiAGIAMpA5AMfCIGVq18IAYgBiADKQOoDCADKQO4DCAIIApWrXwiDSADKQOgDHwiCCANVK18IAggCCALfCIIVq18fCIGVq18fCINIAMpA4AJfCIPIA1UrXwgDyADKQOYCSILIAYgBiADKQOQCSITfCIGVq18IAYgBiALIAggCCATfCIIVq18IAggAykDqAkgCiADKQOgCSIKfCAKVK18fCILIAhUrXx8IgZWrXx8IgggD1StfCIPIA0gElStIAMpA4gMIAkgElatfHwiEiAJIBBUrSARIBVUrXx8Igl8IgogD1QgCSASVHIgCkIAU3JFBEAgBiAIg0J/UiALQm1UciAKQv///////////wBScg0BCyAGQgF8IgkgC0JtVK0iDX0hEiAIQgF8Ig8gBkJ/UiAJIA1Ucq0iBn0hCSAKIAhCf1IgBiAPVnKtfUL///////////8AfSEKIAtCE3whCwwBCyAIIQkgBiESCyAFIQgCfgJAAkAgBSAKIgZSDQAgByEIIAkiBiAHUg0AIA4iCCASIgZSDQAgDCIIIAsiBlENAQsgBiAIWA0AIBIgDn0iBiALIAxUrSIIVCAOIBJWcq0iEiAJIAd9Ig1Cf4V8Ig8gCCAGQn+FfCIGIAsgDH0iCEJtVq0iDFStIgt9IQ4gCyAPViECIAYgDH0hBiANIBJUIAcgCVZyrSAFIAp9fEL///////////8AfCEHQm0gCH0MAQsgDiASfSIIIAsgDFatIg19IQYgByAJfSIPIA4gElQgCCANVHKtIgh9IQ4gByAJVCAIIA9WciECIAUgCn0hByAMIAt9CyEKIAcgAq19IgUhBwJ+AkACQCAFIBwiDFINACAOIgcgGSIMUg0AIAYiByAYIgxSDQAgCiIHIBciDFENAQsgByAMWg0AIBggBn0iCSAKIBdWrSIIVCAGIBhWcq0iBiAZIA59IgdCf4V8IgwgCUJ/hSAIfCIJIBcgCn0iCEJtVq0iClStIgt9IRggCyAMViEEIAkgCn0hISAOIBlWIAYgB1ZyrSAFIBx9fEL///////////8AfCENQm0gCH0MAQsgBiAYfSIJIAogF1StIgh9ISEgDiAZfSIHIAYgGFQgCCAJVnKtIgZ9IRggDiAZVCAGIAdWciEEIAUgHH0hDSAKIBd9CyEZIANB8AhqIAEpAxhCAEKYAUIAEMkDIANB4AhqIAMpA/AIIglCm5Svw/K1qN6Gf34iBUIAQm1CABDJAyADQdAIaiAFQgBCf0IAEMkDIANBwAhqIAVCAEL///////////8AQgAQyQMgA0GwCGogASkDEEIAQpgBQgAQyQMgA0GgCGogAykD0AgiBSADKQP4CHwiBiADKQPoCCADKQPgCCIIIAlCeIN8IAhUrXx8IgkgAykDsAh8IghCm5Svw/K1qN6Gf34iB0IAQm1CABDJAyADQZAIaiAHQgBCf0IAEMkDIANBgAhqIAdCAEL///////////8AQgAQyQMgA0HwB2ogASkDCEIAQpgBQgAQyQMgA0HgB2ogAykDkAgiByADKQO4CCAIIAlUrXwiDCAFIAYgCVatIAMpA9gIIgogBSAGVq18fCIOfCILfCISfCIFIAMpA6gIIAMpA6AIIgYgCHwgBlStfHwiBiADKQPwB3wiCUKblK/D8rWo3oZ/fiIIQgBCbUIAEMkDIANB0AdqIAhCAEJ/QgAQyQMgA0HAB2ogCEIAQv///////////wBCABDJAyADQbAHaiABKQMAQgBCmAFCABDJAyADQaAHaiADKQPQByIIIAcgDCASVq0iEiAKIAsgDlStfCILIAMpA8AIfCIPfCIMfCIKIAUgBlatIAMpA5gIIhAgBSAHVK18fHwiBSADKQP4ByAGIAlWrXx8IhF8IgYgAykD6AcgCSADKQPgByIJfCAJVK18fCIJIAMpA7AHfCIHQpuUr8Pytajehn9+Ig5CAEJtQgAQyQMgA0GQB2ogDkIAQn9CABDJAyADQYAHaiAOQgBC////////////AEIAEMkDAkACQAJ+AkACQCADKQOIByADKQPIByADKQOICCADKQOACCITIAMpA8gIIAsgD1atfHwiDiATVK18IA4gDiAMIBJUrXwiDlatfCAOIAUgClStIBAgCiAMVK18fHwiDCAOVK18Ig4gAykDwAd8IgogDlStfCAKIAwgBSARVq18IgUgDFStfCIMIApUrXwgDCADKQPYByIKIAUgBSAIfCIFVq18IAUgBSAGIAlWrSAKIAYgCFStfHx8IgVWrXx8IgYgDFStfCIMIAMpA4AHfCIIIAxUrXwgCCAGIAUgAykDuAcgByAJVK18fCIMIAVUrXwiBSAGVK18IgYgCFStfCAGIAMpA5gHIgggBSAFIAMpA5AHIgl8IgVWrXwgBSAIIAkgCSAMfCIJVq18IAkgAykDqAcgAykDoAciCCAHfCAIVK18fCIHIAlUrXx8IgogBVStfHwiDCAGVK18IgtCAFMiAUUEQCAKIAyDIQUgC0L///////////8AUiAHQm1Ucg0BIAchBiAKIQggDCEOIAshEiAFQn9SDQILIApCAXwiECAHQm1UrSIFfSEIIAxCAXwiFSAKQn9SIAUgEFZyrSIFfSEOIAtC////////////AH0iFiAMQn9SIAUgFVZyrX0hEiAHQhN8IQYgBiABDQIaIAogDIMhBQwBCyAHIQYgCiEIIAwhDiALIRILIAtC////////////AFIgB0JtVHIgBUJ/UnINASAMQgF8IRUgCkIBfCEQQgAhFiAHQhN8CyEFIBUgCkJ/UiAQIAdCbVStIgdUcq0iCn0hCSAWIAxCf1IgCiAVVnKtfSELIBAgB30hCgwBCyAMIQkgByEFCyADQfAGaiAFQgAgHUIAEMkDIANBgAZqIApCACAdQgAQyQMgA0GQBWogCUIAIB1CABDJAyADQaAEaiALQgAgHUIAEMkDIANB4AZqIAMpA/AGIg9Cm5Svw/K1qN6Gf34iB0IAQm1CABDJAyADQdAGaiAHQgBCf0IAEMkDIANBwAZqIAdCAEL///////////8AQgAQyQMgA0GwBmogBUIAIB5CABDJAyADQcAFaiAKQgAgHkIAEMkDIANB0ARqIAlCACAeQgAQyQMgA0HgA2ogC0IAIB5CABDJAyADQfAFaiADKQPQBiIHIAMpA/gGIhMgAykDgAZ8IhR8IgwgAykD6AYgDyADKQPgBiIQfCAQVK18fCIPIAMpA7AGfCIQQpuUr8Pytajehn9+IhFCAEJtQgAQyQMgA0HgBWogEUIAQn9CABDJAyADQdAFaiARQgBC////////////AEIAEMkDIANBoAZqIAVCACAfQgAQyQMgA0GwBWogCkIAIB9CABDJAyADQcAEaiAJQgAgH0IAEMkDIANB0ANqIAtCACAfQgAQyQMgA0GABWogAykDuAYgDyAQVq18IhYgAykDwAV8IhEgByADKQOIBiATIBRWrXwiFyADKQOQBXwiE3wiFCAMIA9WrSADKQPYBiIcIAcgDFatfHx8Ihp8IgcgAykD4AUiInwiDCADKQP4BSADKQPwBSIPIBB8IA9UrXx8Ig8gAykDoAZ8IhBCm5Svw/K1qN6Gf34iFUIAQm1CABDJAyADQfAEaiAVQgBCf0IAEMkDIANB4ARqIBVCAEL///////////8AQgAQyQMgA0GQBmogBUIAICBCABDJAyADQaAFaiAKQgAgIEIAEMkDIANBsARqIAlCACAgQgAQyQMgA0HAA2ogC0IAICBCABDJAyADQZAEaiADKQOoBiAPIBBWrXwiJiADKQOwBXwiBSAiIAMpA5gFIBMgF1StfCIXIAMpA6AEfCIJIAMpA8AGfCIKIBQgGlatIBwgEyAUVq18fHwiCyADKQPQBHwiEyAHIBFUrSADKQPIBSARIBZUrXx8fCIRfCIUIAwgD1atIAMpA+gFIhYgByAMVq18fHwiHHwiByADKQPwBCIafCIMIAMpA4gFIAMpA4AFIg8gEHwgD1StfHwiDyADKQOQBnwiEEKblK/D8rWo3oZ/fiIVQgBCbUIAEMkDIANBgARqIBVCAEJ/QgAQyQMgA0HwA2ogFUIAQv///////////wBCABDJAwJAAkAgAykD+AMgAykD6AQgAykD2AUgCiALVq0gAykDyAYgCSAKVq18fCIVIAMpA6gEIAkgF1StfHwiCSADKQPgA3wiCiARIBNUrSADKQPYBCALIBNWrXx8fCILIAMpA9AFfCITIAtUrXwgEyAUIBxWrSAWIBEgFFatfHx8IhEgE1StfCITIAogC1atIAMpA+gDIAkgClatfHwiFCAJIBVUrXwiFXwiCSADKQPQA3wiCiADKQPIBCARIAMpA8AEfCILIBFUrXwgCyAFIAdWrSADKQO4BSAFICZUrXx8fCIFIAtUrXx8IgsgAykD4AR8IhEgC1StfCARIAMpA/gEIhYgBSAFIBp8IgVWrXwgBSAMIA9WrSAWIAcgDFatfHx8IhYgBVStfHwiBSARVK18IhEgCiALVq0gAykD2AMgCSAKVq18fCIXIAkgE1StIBQgFVatfHwiE3wiByADKQPAA3wiDCADKQO4BCAFIAUgAykDsAR8IgVWrXwgBSAFIAMpA6gFIAMpA5gGIA8gEFatfCIKIAMpA6AFfCIJIApUrXwgCSAJIBZ8IglWrXx8IgVWrXx8IgogAykD8AN8Ig8gClStfCAPIAMpA4gEIgsgBSAFIAMpA4AEIhR8IgVWrXwgBSAFIAsgCSAJIBR8IglWrXwgCSADKQOYBCADKQOQBCILIBB8IAtUrXx8IgsgCVStfHwiBVatfHwiCSAPVK18Ig8gCiAMVK0gAykDyAMgByAMVq18fCIMIAcgEVStIBMgF1StfHwiB3wiCiAPVCAHIAxUciAKQgBTckUEQCAFIAmDQn9SIAtCbVRyIApC////////////AFJyDQELIAVCAXwiDCALQm1UrSIPfSEHIAlCAXwiECAFQn9SIAwgD1RyrSIFfSEMIAogCUJ/UiAFIBBWcq19Qv///////////wB9IQogC0ITfCELDAELIAkhDCAFIQcLAn4CQAJAIAoiBSASIglSDQAgDCIFIA4iCVINACAHIgUgCCIJUg0AIAsiBSAGIglRDQELIAUgCVgNACAHIAhUIAcgCH0iBSAGIAtWrSIJVHKtIgggDCAOfSIPQn+FfCIQIAkgBUJ/hXwiBSALIAZ9IgZCbVatIglUrSILfSEHIAsgEFYhAiAFIAl9IQVCbSAGfSELIAwgDlQgCCAPVnKtIBIgCn18Qv///////////wB8DAELIAggB30iCSAGIAtUrSIPfSEFIA4gDH0iECAJIA9UIAcgCFZyrSIJfSEHIAkgEFYgDCAOVnIhAiAGIAt9IQsgEiAKfQshCiADIAs3A9gdIAMgBTcD0B0gAyAHNwPIHSADIAogAq19NwPAHQJAAkAgA0HAHWpB6NHBAEEgEPEDBEAgDSAErX0hHCADQfAdakIANwMAIANB6B1qQgA3AwAgA0IANwPgHSADQgE3A/gdIANBmB5qIANB2B1qKQMANwMAIANBkB5qIANB0B1qKQMANwMAIANBiB5qIANByB1qKQMANwMAIAMgAykDwB03A4AeIANBuB5qQeDRwQApAwA3AwAgA0GwHmpB2NHBACkDADcDACADQageakHQ0cEAKQMANwMAIANByNHBACkDADcDoB4CQCADQYAeaiADQeAdakEgEPEDRQRAQqQLIQxCACEKQgAhEEIAIREMAQtCpAshDCADKQOYHiEFIAMpA4AeIQ4gAykDkB4hFSADKQOIHiEGQgAhB0IAIRRCACETQgAhC0IAIRFCACEQQgAhCkJtIQlC////////////ACESQn8hCEJ/IRYDQCADQaAeaiADQeAdakEgEPEDRQRAIAshCiATIRAgFCERIAchDAwCCyAFp0EBcUUEQANAIBVCP4YgBUIBiIQhBQJ+IAynQQFxRQRAIBFCP4YgDEIBiIQhDCAQQj+GIBFCAYiEIREgCkI/hiAQQgGIhAwBCyAQQgF9Ig8gEUIAUiARQgF9Ig0gDEITfSIXIAxUrXwiDCANVHKtfCINQj+GIAxCAYiEIREgDEI/hiAXQgGIhCEMIAogEEIAUiANIA9Ucq18Qv///////////wB8IgpCP4YgDUIBiIQLIRAgDkI/hiAGQj+GIBVCAYiEIRUgDkIBiCEOIApCAYghCiAGQgGIhCEGIAVCAYNQDQALIAMgBjcDiB4gAyAVNwOQHgsgAyAONwOAHiADIAU3A5geIAmnQQFxRQRAA0AgFkI/hiAJQgGIhCEJAn4gB0IBg1BFBEAgE0IBfSIPIBRCAFIgFEIBfSINIAdCE30iFyAHVK18IgcgDVRyrXwiDUI/hiAHQgGIhCEUIAdCP4YgF0IBiIQhByALIBNCAFIgDSAPVHKtfEL///////////8AfCILQj+GIA1CAYiEDAELIBRCP4YgB0IBiIQhByATQj+GIBRCAYiEIRQgC0I/hiATQgGIhAshEyASQj+GIAhCP4YgFkIBiIQhFiASQgGIIRIgC0IBiCELIAhCAYiEIQggCUIBg1ANAAsgAyAINwOoHiADIBY3A7AeCyADIAk3A7geIAMgEjcDoB4gDiEPAkACQAJAAkACQCASIg0gDlINACAIIQ0gBiEPIAYgCFINACAVIg8gFiINUg0AIAkhDSAFIQ8gBSAJUQ0BCyANIA9YDQAgAyAJIAV9Ig03A7geIAMgFiAVfSIXIAUgCVatIgl9Ig83A7AeIAMgCCAGfSIaIAkgF1YgFSAWVnKtIgl9Ihc3A6geIAMgEiAOfSAJIBpWIAYgCFZyrX0iEjcDoB4CQAJAIAoiCCALIglSDQAgECIIIBMiCVINACARIgggFCIJUg0AIAchCSAHIAwiCFENAQsgCCAJVg0CCyALIAp9IBMgEH0iGiAUIBF9IiIgByAMVK0iJlQgESAUVnKtIhRUIBAgE1ZyrX0hCyAHIAx9IQcgDyEWIBchCCANIQkgGiAUfSETICIgJn0hFAwDCyADIAUgCX0iDTcDmB4gAyAVIBZ9IhcgBSAJVK0iBX0iDzcDkB4gAyAGIAh9IhogFSAWVCAFIBdWcq0iBX0iFTcDiB4gAyAOIBJ9IAYgCFQgBSAaVnKtfSIONwOAHgJAAkAgCiIFIAsiBlINACAQIgUgEyIGUg0AIBEiBSAUIgZSDQAgDCIFIAciBlENAQsgBSAGVA0CCyAKIAt9IBAgE1QgECATfSIQIBEgFFQgESAUfSIRIAcgDFatIhdUcq0iGlRyrX0hCiAMIAd9IQwgFSEGIA8hFSANIQUgECAafSEQIBEgF30hEQwCCyALQn9CACAQQn+FIgkgEUJ/hSIIIAxCbVatIgtUrSIWVBsgCn18IBMgCSAWfSITfCIJIBNUIAkgCCALfSILIBR8IgggC1QgCEJtIAx9IgsgB3wiByALVK18IhQgCFRyrXwiEyAJVHKtfEL///////////8AfCELIA8hFiAXIQggDSEJDAELIAogC30gE0J/hSIFIBRCf4UiBiAHQm1WrSIKVK0iF1StfSAQIAUgF30iEHwiBSAQVCAFIAYgCn0iCiARfCIGIApUIAZCbSAHfSIKIAx8IgwgClStfCIRIAZUcq18IhAgBVRyrXxC////////////AHwhCiAVIQYgDyEVIA0hBQsgA0GAHmogA0HgHWpBIBDxAw0ACwsgA0GwA2ogDEIAIBlCABDJAyADQfACaiAMQgAgIUIAEMkDIANB4AJqIAxCACAYQgAQyQMgA0HQAmogDEIAIBxCABDJAyADQaADaiADKQOwAyIJQpuUr8Pytajehn9+IgVCAEJtQgAQyQMgA0GQA2ogBUIAQn9CABDJAyADQYADaiAFQgBC////////////AEIAEMkDIANBwAJqIBFCACAZQgAQyQMgA0GAAmogEUIAICFCABDJAyADQfABaiARQgAgGEIAEMkDIANB4AFqIBFCACAcQgAQyQMgA0GwAmogAykDkAMiBSADKQO4AyIMIAMpA/ACfCIOfCIGIAMpA6gDIAkgAykDoAMiCHwgCFStfHwiCSADKQPAAnwiCEKblK/D8rWo3oZ/fiIHQgBCbUIAEMkDIANBoAJqIAdCAEJ/QgAQyQMgA0GQAmogB0IAQv///////////wBCABDJAyADQdABaiAQQgAgGUIAEMkDIANBkAFqIBBCACAhQgAQyQMgA0GAAWogEEIAIBhCABDJAyADQfAAaiAQQgAgHEIAEMkDIANBwAFqIAMpA8gCIAggCVStfCINIAMpA4ACfCIHIAUgAykD+AIgDCAOVq18IhIgAykD4AJ8Igx8Ig4gBiAJVq0gAykDmAMiDyAFIAZWrXx8fCIQfCIFIAMpA6ACIhF8IgYgAykDuAIgAykDsAIiCSAIfCAJVK18fCIJIAMpA9ABfCIIQpuUr8Pytajehn9+IgtCAEJtQgAQyQMgA0GwAWogC0IAQn9CABDJAyADQaABaiALQgBC////////////AEIAEMkDIANB4ABqIApCACAZQgAQyQMgA0EgaiAKQgAgIUIAEMkDIANBEGogCkIAIBhCABDJAyADIApCACAcQgAQyQMgA0HQAGogAykD2AEgCCAJVK18IhMgAykDkAF8IgogESADKQPoAiAMIBJUrXwiFCADKQPQAnwiCyADKQOAA3wiEiAOIBBWrSAPIAwgDlatfHx8IgwgAykD8AF8Ig4gBSAHVK0gAykDiAIgByANVK18fHwiB3wiDSAGIAlWrSADKQOoAiIQIAUgBlatfHx8IhF8IgUgAykDsAEiFXwiBiADKQPIASADKQPAASIJIAh8IAlUrXx8IgkgAykDYHwiCEKblK/D8rWo3oZ/fiIPQgBCbUIAEMkDIANBQGsgD0IAQn9CABDJAyADQTBqIA9CAEL///////////8AQgAQyQMgAykDOCADKQOoASADKQOYAiAMIBJUrSADKQOIAyALIBJWrXx8Ig8gAykD2AIgCyAUVK18fCILIAMpA+ABfCISIAcgDlStIAMpA/gBIAwgDlatfHx8IgwgAykDkAJ8Ig4gDFStfCAOIA0gEVatIBAgByANVq18fHwiByAOVK18Ig0gDCASVK0gAykD6AEgCyASVq18fCISIAsgD1StfCIPfCIMIAMpA3B8Ig4gAykDiAEgByAHIAMpA4ABfCIHVq18IAcgByAFIApUrSADKQOYASAKIBNUrXx8fCIHVq18fCIKIAMpA6ABfCILIApUrXwgCyADKQO4ASIQIAcgByAVfCIHVq18IAcgBiAJVq0gECAFIAZWrXx8fCIQIAdUrXx8IgUgC1StfCILIAogDlStIAMpA3ggDCAOVq18fCIRIAwgDVStIA8gElStfHwiEnwiByADKQMAfCIMIAMpAxggBSAFIAMpAxB8IgVWrXwgBSAFIAMpAyggAykDaCAIIAlUrXwiCSADKQMgfCIGIAlUrXwgBiAGIBB8IgZWrXx8IgVWrXx8IgkgAykDMHwiDiAJVK18IA4gAykDSCIKIAUgBSADKQNAIg18IgVWrXwgBSAKIAYgBiANfCIGVq18IAYgAykDWCAIIAMpA1AiCHwgCFStfHwiCiAGVK18fCIGIAVUrXx8IgggDlStfCIFIAkgDFStIAMpAwggByAMVq18fCIJIAcgC1StIBEgElatfHwiB3wiCyAFVCAHIAlUciALQgBTckUEQCAGIAiDQn9SIApCbVRyIAtC////////////AFJyDQILIAZCAXwiBSAKQm1UrSIHfSEJIAhCAXwiDCAGQn9SIAUgB1RyrSIGfSEFIAsgCEJ/UiAGIAxWcq19Qv///////////wB9IQsgCkITfCEKDAILIANCAjcDoB5BjPfBAEErIANBoB5qQfz2wQBB6JDCABDKAwALIAghBSAGIQkLIAAgCjcDOCAAIAk3AzAgACAFNwMoIAAgCzcDICAAICM3AxggACAbNwMQIAAgJTcDCCAAICQ3AwAgA0HAHmokAAv/wwECB38kfiMAQZAwayIDJAAgAyACNgLMKyADQQw2AsgrAkACQAJAAkACQAJAIAJBDEYEQCADQdArahAhIANBgCtqIAMpA/AtIgpCAEKJ9auctYu/lnNCABDJAyADQfAqaiADKQOAKyIMQgBCAEKJx5mkrvCB6Yd/EMkDIANB4CpqIAMpA/gqIgtCAELH+vPD7YKjkDxCABDJAyADQdAqaiALQgBCjZXHw5bS2sCXf0IAEMkDIANB8ClqIAtCAELdsIWM6LaRqLh/QgAQyQMgA0GQKWogC0IAQqnAxomuzpOyMEIAEMkDIANBkCtqIApCAEL7g5SinaLG87V/QgAQyQMgA0HAKmogAykD0CoiECADKQOIK3wiDyADKQPoKiAMIAMpA+AqIgt8IAtUrXx8IgwgAykDkCt8Ig1CAEIAQonHmaSu8IHph38QyQMgA0GwKmogAykDyCoiC0IAQsf688PtgqOQPEIAEMkDIANBoCpqIAtCAEKNlcfDltLawJd/QgAQyQMgA0GQKmogC0IAQt2whYzotpGouH9CABDJAyADQYAqaiALQgBCqcDGia7Ok7IwQgAQyQMgA0GgK2ogCkIAQvb/hdLw38fVxwBCABDJAyADQeApaiADKQOgKiIUIAMpA5grIAwgDVatfCIOIAwgD1StIAMpA9gqIA8gEFStfHwiECADKQPwKXwiEnwiEXwiDyADKQO4KiADKQOwKiILIA18IAtUrXx8IgwgAykDoCt8Ig1CAEIAQonHmaSu8IHph38QyQMgA0HQKWogAykD6CkiC0IAQsf688PtgqOQPEIAEMkDIANBwClqIAtCAEKNlcfDltLawJd/QgAQyQMgA0GwKWogC0IAQt2whYzotpGouH9CABDJAyADQaApaiALQgBCqcDGia7Ok7IwQgAQyQMgA0GwK2ogCkIAQp/q4NWc7qfsBkIAEMkDIANBgClqIAMpA8ApIhcgDiARVq0iDiADKQP4KSAQIBJWrXwiEiADKQOQKXwiEXwiCyADKQOQKnwiECAMIA9UrSADKQOoKiAPIBRUrXx8fCIPIAMpA6grIAwgDVatfHwiE3wiDCADKQPYKSADKQPQKSIKIA18IApUrXx8Ig0gAykDsCt8IhRCAEIAQonHmaSu8IHph38QyQMgA0HwKGogAykDiCkiCkIAQsf688PtgqOQPEIAEMkDIANB4ChqIApCAEKNlcfDltLawJd/QgAQyQMgA0HQKGogCkIAQt2whYzotpGouH9CABDJAyADQcAoaiAKQgBCqcDGia7Ok7IwQgAQyQMCQCADKQPIKCADKQOoKSADKQOIKiADKQOAKiIWIAMpA5gpIBEgElStfHwiCiAWVK18IAogCiALIA5UrXwiDlatfCAOIA4gDyAQVK0gAykDmCogCyAQVq18fHwiClatfCIQIAMpA6ApfCILIBBUrXwgCyALIAogCiAPIBNWrXwiD1atfCIKVq18IAogCiADKQO4KSAPIA8gAykDsCl8IgtWrXwgCyALIAwgDVatIAMpA8gpIAwgF1StfHx8Ig9WrXx8IgtWrXwiDCADKQPAKHwiCiAMVK18IAogCyALIA8gAykDuCsgDSAUVq18fCINIA9UrXwiC1atfCIPIApUrXwgDyADKQPYKCALIAsgAykD0Ch8IgxWrXwgDCAMIAMpA+goIA0gAykD4CgiC3wiCiALVK18IAogAykD+CggAykD8CgiCyAUfCALVK18fCITIApUrXx8IgpWrXx8IhkgD1StfCIaQqnAxomuzpOyMFQEQCAKIRQMAQsCQCAZQt2whYzotpGouH9WDQAgGULdsIWM6LaRqLh/UgRAIAohFEKpwMaJrs6TsjAhGgwCCyAKQo2Vx8OW0trAl39WDQACQCAKQo2Vx8OW0trAl39SBEAgCiEUDAELQo2Vx8OW0trAl38hFCATQsf688PtgqOQPFoNAQtC3bCFjOi2kai4fyEZQqnAxomuzpOyMCEaDAELIApC8+q4vOmtpb/oAHwiCyATQsf688PtgqOQPFStIg99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rXwiJCADKQOwAXwiFCADKQPoAyAWIB5UrXwiKCADKQPwA3wiEyADKQPwAnwiHiAVICdWrSADKQOIAyAVIBZUrXx8fCIWIAMpA9ACfCIVIA8gF1StIAMpA8gCIBcgIlStfHx8IhcgAykD8AF8IiIgDiASVq0gAykDiAIgDiAPVK18fHwiJ3wiDyADKQNwfCIOIAMpA4gBIAMpA4ABIgogIHwgClStfHwiEiADKQOABHwiIEIAQgBCiceZpK7wgemHfxDJAyADQdAAaiADKQNoIgpCAELH+vPD7YKjkDxCABDJAyADQUBrIApCAEKNlcfDltLawJd/QgAQyQMgA0EwaiAKQgBC3bCFjOi2kai4f0IAEMkDIANBIGogCkIAQqnAxomuzpOyMEIAEMkDAkACQCADKQMoIAMpAwggAykD6AEgFiAeVK0gAykD+AIgEyAeVq18fCADKQP4AyATIChUrXx8Ih4gAykD4AJ8IgogFSAXVq0gAykD2AIgFSAWVK18fHwiEyADKQPgAXwiFiATVK18IBYgIiAnVq0gAykD+AEgFyAiVq18fHwiFyAWVK18IAogE1atIAMpA+gCIAogHlStfHx8IhUgAykD0AF8IgogAykDyAEgFyAXIAMpA8ABfCITVq18IBMgDyAUVK0gAykDuAEgFCAkVK18fHwiFCATVK18fCIXIAMpAwB8IhMgF1StfCATIAMpAxggFCAUIAMpAxB8IhZWrXwgFiAOIBJWrSADKQN4IA4gD1StfHx8Ig4gFlStfHwiDyATVK18IAogF1atIAMpA9gBIAogFVStfHx8IhYgAykDsAR8IhQgAykDqAQgDyADKQOgBHwiCiAPVK18IAogCiADKQOYBCADKQOIBCASICBWrXwiEiADKQOQBHwiDyASVK18IA8gDiAPfCIOVq18fCIPVq18fCISIAMpAyB8IhcgElStfCAXIBcgAykDOCAPIA8gAykDMHwiE1atfCATIBMgAykDSCAOIA4gAykDQHwiClatfCAKIAMpA1ggAykDUCIPICB8IA9UrXx8IhkgClStfHwiClatfHwiDlatfCASIBRUrSADKQO4BCAUIBZUrXx8fCITQqnAxomuzpOyMFYNAAJAIBNCqcDGia7Ok7IwUQRAIA5C3bCFjOi2kai4f1YNAiAOQt2whYzotpGouH9RDQFCqcDGia7O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kai4f1YNAiAVQt2whYzotpGouH9RDQFCqcDGia7Ok7IwIRYLIBUhGSAUIQ0MAgsgFEKNlcfDltLawJd/Vg0AQt2whYzotpGouH8hGSAUQo2Vx8OW0trAl39SBEBCqcDGia7Ok7IwIRYgFCENDAILQo2Vx8OW0trAl38hDSAoQsf688PtgqOQPFoNAEKpwMaJrs6TsjAhFgwBCyAUQvPquLzpraW/6AB8IhkgKELH+vPD7YKjkDxUrSIYfSENIBVCo8/685fJ7tfHAHwiJyAUQo2Vx8OW0trAl39UIBggGVZyrSIUfSEZIBYgFULdsIWM6LaRqLh/VCAUICdWcq19QqnAxomuzpOyMH0hFiAoQsf688PtgqOQPH0hKAsgAUIANwPgAiABQgA3AyAgASAONwMYIAEgETcDECABIBc3AwggASAkNwMAIAFCnZu8rNzx0K5TNwN4IAFCvZacro/lurwKNwNwIAFCrIzlw/ftqLfmADcDaCABQq++n9CZ+J2FDjcDYCABIBM3A1ggASASNwNQIAEgEDcDSCABIAs3A0AgAUH4AmpCADcDACABQfACakIANwMAIAFB6AJqQgA3AwAgAUEoakIANwMAIAFBMGpCADcDACABQThqQgA3AwAgAUG4AWpCADcDACABQbABakIANwMAIAFBqAFqQgA3AwAgAUGgAWpCADcDACABQZgBakIANwMAIAFBkAFqQgA3AwAgAUGIAWpCADcDACABQgA3A4ABIAEgGjcD2AEgASAbNwPQASABIAw3A8gBIAEgDzcDwAEgAUIANwPgASABQegBakIANwMAIAFB8AFqQgA3AwAgAUH4AWpCADcDACABICg3A5gCIAEgDTcDkAIgASAZNwOIAiABIBY3A4ACIAFB2AJqQgA3AwAgAUHQAmpCADcDACABQcgCakIANwMAIAFBwAJqQgA3AwAgAUG4AmpCADcDACABQbACakIANwMAIAFBqAJqQgA3AwAgAUIANwOgAgwDCyAFIAc2AswyIAUgATYCyDIgBSAGNgLEMgwECyAFIAY2AswyIAUgATYCyDIgBSACNgLEMgwDC0EIQYADEP8EAAtBDCECAkACfyABQeACakHYw8IAQSAQ8QMEQEELIQRBDAwBCyABQcACakHYw8IAQSAQ8QMEQEEKIQRBCwwBCyABQaACakHYw8IAQSAQ8QMEQEEJIQRBCgwBCyABQYACakHYw8IAQSAQ8QMEQEEIIQRBCQwBCyABQeABakHYw8IAQSAQ8QMEQEEHIQRBCAwBCyABQcABakHYw8IAQSAQ8QMEQEEGIQRBBwwBCyABQaABakHYw8IAQSAQ8QMEQEEFIQRBBgwBCyABQYABakHYw8IAQSAQ8QMEQEEEIQRBBQwBCyABQeAAakHYw8IAQSAQ8QMEQEEDIQRBBAwBCyABQUBrQdjDwgBBIBDxAwRAQQIhBEEDDAELIAFBIGpB2MPCAEEgEPEDBEBBASEEQQIMAQsgAUHYw8IAQSAQ8QMEQEEAIQRBAQwBC0HRzsUALQAAGkEgQQgQ1gQiAkUNASACQgA3AwAgAkEYakIANwMAIAJBEGpCADcDACACQQhqQgA3AwAgAUGAAxDfBEF/IQQgAiEBQQEhAkEBCyEDIAAgBDYCDCAAIAM2AgggACABNgIEIAAgAjYCACAFQdAyaiQADwtBCEEgEP8EAAtBCEGAAxD/BAALQYCLwABBKyAFQcQyakHwisAAQaSNwAAQygMAC4ezAQIHfxN+IwBBsDFrIgMkACADIAI2AswrIANBDDYCyCsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAJBDEYEQCADQdArahAhIANBgCtqIAMpA/AtIgpCAEKJ9auctYu/lnNCABDJAyADQfAqaiADKQOAKyINQgBCAEKJx5mkrvCB6Yd/EMkDIANB4CpqIAMpA/gqIgtCAELH+vPD7YKjkDxCABDJAyADQdAqaiALQgBCjZXHw5bS2sCXf0IAEMkDIANB8ClqIAtCAELdsIWM6LaRqLh/QgAQyQMgA0GQKWogC0IAQqnAxomuzpOyMEIAEMkDIANBkCtqIApCAEL7g5SinaLG87V/QgAQyQMgA0HAKmogAykD0CoiDyADKQOIK3wiEiADKQPoKiANIAMpA+AqIgt8IAtUrXx8Ig0gAykDkCt8Ig5CAEIAQonHmaSu8IHph38QyQMgA0GwKmogAykDyCoiC0IAQsf688PtgqOQPEIAEMkDIANBoCpqIAtCAEKNlcfDltLawJd/QgAQyQMgA0GQKmogC0IAQt2whYzotpGouH9CABDJAyADQYAqaiALQgBCqcDGia7Ok7IwQgAQyQMgA0GgK2ogCkIAQvb/hdLw38fVxwBCABDJAyADQeApaiADKQOgKiIRIAMpA5grIA0gDlatfCIMIA0gElStIAMpA9gqIA8gElatfHwiDyADKQPwKXwiFHwiF3wiEiADKQO4KiADKQOwKiILIA58IAtUrXx8Ig0gAykDoCt8Ig5CAEIAQonHmaSu8IHph38QyQMgA0HQKWogAykD6CkiC0IAQsf688PtgqOQPEIAEMkDIANBwClqIAtCAEKNlcfDltLawJd/QgAQyQMgA0GwKWogC0IAQt2whYzotpGouH9CABDJAyADQaApaiALQgBCqcDGia7Ok7IwQgAQyQMgA0GwK2ogCkIAQp/q4NWc7qfsBkIAEMkDIANBgClqIAMpA8ApIhAgDCAXVq0iDCADKQP4KSAPIBRWrXwiFCADKQOQKXwiF3wiCyADKQOQKnwiDyANIBJUrSADKQOoKiARIBJWrXx8fCISIAMpA6grIA0gDlatfHwiE3wiDSADKQPYKSADKQPQKSIKIA58IApUrXx8Ig4gAykDsCt8IhFCAEIAQonHmaSu8IHph38QyQMgA0HwKGogAykDiCkiCkIAQsf688PtgqOQPEIAEMkDIANB4ChqIApCAEKNlcfDltLawJd/QgAQyQMgA0HQKGogCkIAQt2whYzotpGouH9CABDJAyADQcAoaiAKQgBCqcDGia7Ok7IwQgAQyQMCQCADKQPIKCADKQOoKSADKQOIKiADKQOAKiIWIAMpA5gpIBQgF1atfHwiCiAWVK18IAogCiALIAxUrXwiDFatfCAMIAwgDyASVq0gAykDmCogCyAPVq18fHwiClatfCIPIAMpA6ApfCILIA9UrXwgCyALIAogCiASIBNWrXwiElatfCIKVq18IAogCiADKQO4KSASIBIgAykDsCl8IgtWrXwgCyALIA0gDlatIAMpA8gpIA0gEFStfHx8IhJWrXx8IgtWrXwiDSADKQPAKHwiCiANVK18IAogCyALIBIgAykDuCsgDiARVq18fCIOIBJUrXwiC1atfCISIApUrXwgEiADKQPYKCALIAsgAykD0Ch8Ig1WrXwgDSANIAMpA+goIA4gAykD4CgiC3wiCiALVK18IAogAykD+CggAykD8CgiCyARfCALVK18fCIRIApUrXx8IgpWrXx8IhQgElStfCIXQqnAxomuzpOyMFQEQCAKIRIMAQsCQCAU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4AgiD3wgD1StfHwiFCANVK18fCINIAlUrXx8IgkgC1StfHwiCyAOVK18fCIMVq18IAogElatIAIpA9gJIAogGVStfHx8IQ4gA0EIayIDQXhHDQALAkACQCAOQprN/8ujvcSAGlYNACAOQprN/8ujvcSAGlIEQCANIRUgCSEXIAshGCAMIRkMAgsgDELX2a6a5PbpjcsAVg0AAkAgDELX2a6a5PbpjcsAUgRAIA0hFSAJIRcgCyEYIAwhGQwBCyALQr+llJzP8NK75ABWDQFC19mumuT26Y3LACEZIAtCv6WUnM/w0rvkAFIEQCANIRUgCSEXIAshGAwBCyAJQqTsw7WP1LSY5wBWDQFCv6WUnM/w0rvkACEYIAlCpOzDtY/UtJjnAFIEQCANIRUgCSEXDAELIA1C///Piuv//9UeVg0BQqTsw7WP1LSY5wAhFyANQv//z4rr///VHlIEQCANIRUMAQtC///Piuv//9UeIRUgFEKq1f7///+//7l/Vg0BC0Kazf/Lo73EgBohDgwBCyANQv//z4rr///VHn0iCiAUQqvV/v///7//uX9UrSIPfSEVIAlCpOzDtY/UtJjnAH0iEiANQv//z4rr///VHlQgCiAPVHKtIgp9IRcgC0K/pZScz/DSu+QAfSIPIAlCpOzDtY/UtJjnAFQgCiASVnKtIgp9IRggDELX2a6a5PbpjcsAfSIJIAtCv6WUnM/w0rvkAFQgCiAPVnKtIgp9IRkgDiAMQtfZrprk9umNywBUIAkgClRyrX1Cms3/y6O9xIAafSEOIBRC1aqBgICAwIDGAHwhFAsgAkH4I2oiBiACQZAhaiACQeAgahBMAn8CQAJAAkACQAJAAkAgAigC+CNBAUcEQCACQeghaiACQagkaikDADcDACACQeAhaiACQaAkaiIBKQMANwMAIAJB2CFqIAJBmCRqIgMpAwA3AwAgAkHQIWogAkGQJGoiBykDADcDACACQcghaiACQYgkaiIEKQMANwMAIAIgAikDgCQ3A8AhIAFCADcDACADQgA3AwAgB0IANwMAIARCADcDACACQYAkakIANwMAIAJCADcD+CMCQCACQcAhaiIBIAZBMBDxA0UNACABEPECQf8BcUECRg0AQSghAyACKQPgHSEWIAIpA+gdIRogAikD8B0hGyACKQP4HSEcIAIpA4AeIR0gAikDiB4hHkIAIRFCACEMQgAhC0IAIQlCACENQgAhEANAIAJBsAdqIAJBwCFqIANqKQMAIgpCACAeQgAQyQMgAkHAB2ogCkIAIB1CABDJAyACQdAHaiAKQgAgHEIAEMkDIAJB4AdqIApCACAbQgAQyQMgAkHwB2ogCkIAIBpCABDJAyACQYAIaiAKQgAgFkIAEMkDIAJBoAdqIAIpA7AHIhIgEHwiD0IAQgBC/f/z/8////mJfxDJAyACQZAHaiACKQOoByIKQgBCq9X+////v/+5f0IAEMkDIAJBgAdqIApCAEL//8+K6///1R5CABDJAyACQfAGaiAKQgBCpOzDtY/UtJjnAEIAEMkDIAJB4AZqIApCAEK/pZScz/DSu+QAQgAQyQMgAkHQBmogCkIAQtfZrprk9umNywBCABDJAyACQcAGaiAKQgBCms3/y6O9xIAaQgAQyQMgAikDyAYgESACKQOACCIRfCIKIAIpA/gHIAIpA/AHIhMgDHwiDCATVK18IAwgAikD6AcgAikD4AciEyALfCILIBNUrXwgCyALIAIpA9gHIAIpA9AHIhMgCXwiCSATVK18IAkgCSACKQPIByACKQPAByITIA18Ig0gE1StfCANIAIpA7gHIA8gElStfHwiECANVK18fCIJVq18fCILVq18fCINIAxUrXx8IhIgAikDwAZ8IgwgElStfCAMIAwgAikD2AYgDSACKQPQBnwiEyANVK18IBMgAikD6AYgCyALIAIpA+AGfCILVq18IAsgAikD+AYgCSAJIAIpA/AGfCIJVq18IAkgAikDiAcgECACKQOAByIQfCINIBBUrXwgDSACKQOYByAPIAIpA5AHIg98IA9UrXx8IhAgDVStfHwiDSAJVK18fCIJIAtUrXx8IgsgE1StfHwiDFatfCAKIBJWrSACKQOICCAKIBFUrXx8fCERIANBCGsiA0F4Rw0ACyARQprN/8ujvcSAGlYNBiARQprN/8ujvcSAGlENBSANIQogCSETIAshDyAMIRIMBwsgAkHgJGogAkHAIWoQoQJBKCEDIAIpA+AkIRYgAikD6CQhGiACKQPwJCEbIAIpA/gkIRwgAikDgCUhHSACKQOIJSEeQgAhEUIAIQxCACELQgAhCUIAIQ1CACEQA0AgAkHAAmogAkHgJGogA2opAwAiCkIAIB5CABDJAyACQdACaiAKQgAgHUIAEMkDIAJB4AJqIApCACAcQgAQyQMgAkHwAmogCkIAIBtCABDJAyACQYADaiAKQgAgGkIAEMkDIAJBkANqIApCACAWQgAQyQMgAkGwAmogAikDwAIiEiAQfCIPQgBCAEL9//P/z///+Yl/EMkDIAJBoAJqIAIpA7gCIgpCAEKr1f7///+//7l/QgAQyQMgAkGQAmogCkIAQv//z4rr///VHkIAEMkDIAJBgAJqIApCAEKk7MO1j9S0mOcAQgAQyQMgAkHwAWogCkIAQr+llJzP8NK75ABCABDJAyACQeABaiAKQgBC19mumuT26Y3LAEIAEMkDIAJB0AFqIApCAEKazf/Lo73EgBpCABDJAyACKQPYASARIAIpA5ADIhF8IgogAikDiAMgAikDgAMiEyAMfCIMIBNUrXwgDCACKQP4AiACKQPwAiITIAt8IgsgE1StfCALIAsgAikD6AIgAikD4AIiEyAJfCIJIBNUrXwgCSAJIAIpA9gCIAIpA9ACIhMgDXwiDSATVK18IA0gAikDyAIgDyASVK18fCIQIA1UrXx8IglWrXx8IgtWrXx8Ig0gDFStfHwiEiACKQPQAXwiDCASVK18IAwgDCACKQPoASANIAIpA+ABfCITIA1UrXwgEyACKQP4ASALIAsgAikD8AF8IgtWrXwgCyACKQOIAiAJIAkgAikDgAJ8IglWrXwgCSACKQOYAiAQIAIpA5ACIhB8Ig0gEFStfCANIAIpA6gCIA8gAikDoAIiD3wgD1StfHwiECANVK18fCINIAlUrXx8IgkgC1StfHwiCyATVK18fCIMVq18IAogElatIAIpA5gDIAogEVStfHx8IREgA0EIayIDQXhHDQALIBFCms3/y6O9xIAaWA0BDAILIAIgAikDiCQ3A+gkIAIgAikDgCQ3A+AkQYSdwABBKyACQeAkakH4q8AAQZiswAAQygMACyARQprN/8ujvcSAGlIEQCANIQogCSETIAshDyAMIRIMAgsgDELX2a6a5PbpjcsAVg0AIAxC19mumuT26Y3LAFIEQCANIQogCSETIAshDyAMIRJCms3/y6O9xIAaIREMAgsgC0K/pZScz/DSu+QAVg0AQtfZrprk9umNywAhEiALQr+llJzP8NK75ABSBEAgDSEKIAkhEyALIQ9Cms3/y6O9xIAaIREMAgsg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mOcAfSIWIA1C///Piuv//9UeVCAPIBJUcq0iD30hEyALQr+llJzP8NK75AB9Ig0gCUKk7MO1j9S0mOcAVCAPIBZWcq0iCX0hDyAMQtfZrprk9umNywB9IhYgC0K/pZScz/DSu+QAVCAJIA1Wcq0iCX0hEiARIAxC19mumuT26Y3LAFQgCSAWVnKtfUKazf/Lo73EgBp9IREgEELVqoGAgIDAgMYAfCEQCyACIBA3A6AkIAIgCjcDmCQgAiATNwOQJCACIA83A4gkIAIgEjcDgCQgAiARNwP4IyACQeAkaiACQfgjakEwEPEDBEBB7KrAAEEoQZSrwAAQ/gMACyACQZgiaiACQagjaikDADcDACACQZAiaiACQaAjaikDADcDACACQYgiaiACQZgjaikDADcDACACQYAiaiACQZAjaikDADcDACACQfghaiACQYgjaikDADcDACACIAIpA4AjNwPwIUEACyEBQSghAyACKQPAHiEWIAIpA8geIRogAikD0B4hGyACKQPYHiEcIAIpA+AeIR0gAikD6B4hHkIAIRFCACEMQgAhC0IAIQlCACENQgAhEANAIAJB8ABqIAJBkB5qIANqKQMAIgpCACAeQgAQyQMgAkGAAWogCkIAIB1CABDJAyACQZABaiAKQgAgHEIAEMkDIAJBoAFqIApCACAbQgAQyQMgAkGwAWogCkIAIBpCABDJAyACQcABaiAKQgAgFkIAEMkDIAJB4ABqIAIpA3AiEiAQfCIPQgBCAEL9//P/z///+Yl/EMkDIAJB0ABqIAIpA2giCkIAQqvV/v///7//uX9CABDJAyACQUBrIApCAEL//8+K6///1R5CABDJAyACQTBqIApCAEKk7MO1j9S0mOcAQgAQyQMgAkEgaiAKQgBCv6WUnM/w0rvkAEIAEMkDIAJBEGogCkIAQtfZrprk9umNywBCABDJAyACIApCAEKazf/Lo73EgBpCABDJAyACKQMIIBEgAikDwAEiEXwiCiACKQO4ASACKQOwASITIAx8IgwgE1StfCAMIAIpA6gBIAIpA6ABIhMgC3wiCyATVK18IAsgCyACKQOYASACKQOQASITIAl8IgkgE1StfCAJIAkgAikDiAEgAikDgAEiEyANfCINIBNUrXwgDSACKQN4IA8gElStfHwiECANVK18fCIJVq18fCILVq18fCINIAxUrXx8IhIgAikDAHwiDCASVK18IAwgDCACKQMYIA0gAikDEHwiEyANVK18IBMgAikDKCALIAsgAikDIHwiC1atfCALIAIpAzggCSAJIAIpAzB8IglWrXwgCSACKQNIIBAgAikDQCIQfCINIBBUrXwgDSACKQNYIA8gAikDUCIPfCAPVK18fCIQIA1UrXx8Ig0gCVStfHwiCSALVK18fCILIBNUrXx8IgxWrXwgCiASVq0gAikDyAEgCiARVK18fHwhESADQQhrIgNBeEcNAAsCQAJAIBFCms3/y6O9xIAaVg0AIBFCms3/y6O9xIAaUgRAIA0hCiAJIRMgCyEPIAwhEgwCCyAMQtfZrprk9umNywBWDQACQCAMQtfZrprk9umNywBSBEAgDSEKIAkhEyALIQ8gDCESDAELIAtCv6WUnM/w0rvkAFYNAULX2a6a5PbpjcsAIRIgC0K/pZScz/DSu+QAUgRAIA0hCiAJIRMgCyEPDAELIAlCpOzDtY/UtJjnAFYNAUK/pZScz/DSu+QAIQ8gCUKk7MO1j9S0mOcAUgRAIA0hCiAJIRMMAQsgDUL//8+K6///1R5WDQFCpOzDtY/UtJjnACETIA1C///Piuv//9UeUgRAIA0hCgwBC0L//8+K6///1R4hCiAQQqrV/v///7//uX9WDQELQprN/8ujvcSAGiERDAELIA1C///Piuv//9UefSIPIBBCq9X+////v/+5f1StIhJ9IQogCUKk7MO1j9S0mOcAfSIWIA1C///Piuv//9UeVCAPIBJUcq0iD30hEyALQr+llJzP8NK75AB9Ig0gCUKk7MO1j9S0mOcAVCAPIBZWcq0iCX0hDyAMQtfZrprk9umNywB9IhYgC0K/pZScz/DSu+QAVCAJIA1Wcq0iCX0hEiARIAxC19mumuT26Y3LAFQgCSAWVnKtfUKazf/Lo73EgBp9IREgEELVqoGAgIDAgMYAfCEQCyACIBA3A6AkIAIgCjcDmCQgAiATNwOQJCACIA83A4gkIAIgEjcDgCQgAiARNwP4IyACQaAiaiIDIAJB+CNqIAJB8CFqELIBIAJBqCNqAn8gAUUEQCACIBQ3A/giIAIgFTcD8CIgAiAXNwPoIiACIBg3A+AiIAIgGTcD2CIgAiAONwPQIiADDAELIAJB+CJqIAJByB9qKQMANwMAIAJB8CJqIAJBwB9qKQMANwMAIAJB6CJqIAJBuB9qKQMANwMAIAJB4CJqIAJBsB9qKQMANwMAIAJB2CJqIAJBqB9qKQMANwMAIAIgAikDoB83A9AiIAJB8CFqCyIDQShqKQMANwMAIAJBoCNqIANBIGopAwA3AwAgAkGYI2ogA0EYaikDADcDACACQZAjaiADQRBqKQMANwMAIAJBiCNqIANBCGopAwA3AwAgAiADKQMANwOAIyACQfgjaiACQdAiaiACQdAfahBMIAIoAvgjQQFGBEAgAiACKQOIJDcD6CQgAiACKQOAJDcD4CRBhJ3AAEErIAJB4CRqQfirwABBiKzAABDKAwALIAJB2CNqIAJBqCRqKQMANwMAIAJB0CNqIAJBoCRqKQMANwMAIAJByCNqIAJBmCRqKQMANwMAIAJBwCNqIAJBkCRqKQMANwMAIAJBuCNqIAJBiCRqKQMANwMAIAIgAikDgCQ3A7AjIAJB7CNqIgggAkGAI2oQ2AJBACEDIAJBgCRqIgFB3JrAACgCACIHNgIAIAJB1JrAACkCACIKNwP4IyACQfgjaiIFQcibwAAQpQMgAigC/CNBAjYCACACQegkaiIEQQE2AgAgAiACKQP4IzcD4CQgAkHgI2ogCCACQeAkaiIGEO0BIAggAkGQHmoQ2AIgASAHNgIAIAIgCjcD+CMgBUHIm8AAEKUDIAIoAvwjQQI2AgAgBEEBNgIAIAIgAikD+CM3A+AkIAUgCCAGEO0BIAIoAvwjIQEgAigC5CMhByACKALoIyIEIAIoAoAkRgRAIAcgASAEQQJ0EPEDRSEDCyACKAL4IyIEBEAgASAEQQJ0EN8ECyACKALgIyIBBEAgByABQQJ0EN8ECyACKQOoIyESIAIpA6AjIQkgAikDmCMhCyACKQOQIyENIAIpA4gjIQwgAikDgCMhEAJAAkAgAw0AIAJBgCNqQfiewABBMBDxA0UNAEL//8+K6///1R4gCX0iCiASQqvV/v///7//uX9WrSIOfSEPQqTsw7WP1LSY5wAgC30iFCAKIA5UIAlC///Piuv//9UeVnKtIgl9IQpCv6WUnM/w0rvkACANfSITIAkgFFYgC0Kk7MO1j9S0mOcAVnKtIgl9IQ5C19mumuT26Y3LACAMfSILIAkgE1YgDUK/pZScz/DSu+QAVnKtIgl9IRRCms3/y6O9xIAaIAkgC1YgDELX2a6a5PbpjcsAVnKtIBB8fSEQQqvV/v///7//uX8gEn0hEgwBCyAMIRQgDSEOIAshCiAJIQ8LIAIgEjcDiCUgAiAPNwOAJSACIAo3A/gkIAIgDjcD8CQgAiAUNwPoJCACIBA3A+AkIAJB+CNqIgEgAkGwI2ogAkHgJGpBARAxIAItANgkQQJHBEAgACABQegA/AoAACACKALsHCIABEAgAigC8BwgAEECdBDfBAsCQCACKALkFiIARQ0AIAAgAEEMbEETakF4cSIBakEJaiIARQ0AIAIoAuAWIAFrIAAQ3wQLIAIoAuAZIgBBgICAgHhGIABFckUEQCACKALkGSAAQQJ0EN8ECyACQZAlaiQADwsgAkHoJGogAkGAJGooAgA2AgAgAiACKQP4IzcD4CRBhJ3AAEErIAJB4CRqQdirwABB6KvAABDKAwALraoCAiJ/CH4jAEGwCWsiCCQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIARBAXQgAkYEQCAIIAU2AqAJAkACQAJAAkACQAJAIAUOBgcAAQIDBAULQQEhCQwGC0ECIQkMBQtBAyEJDAQLQQQhCQwDC0EFIQkgCEEFOgCUBwwCCyAIQQE2AgQgCEHImsEANgIAIAhCATcCDCAIIAhBoAlqrUKAgICA4AGENwOoBiAIIAhBqAZqNgIIIAhBkAdqIAgQ0gIgCC0AlAchCSAIKAKQByIFQYCAgIB4Rg0BIAAgCCgAlQc2AAkgAEEMaiAIQZgHaigAADYAACAAIAk6AAggACAFNgIEIABBATYCAAwCC0HRzsUALQAAGkEuQQEQ1gQiAQRAIABBLjYCDCAAIAE2AgggAEKBgICA4AU3AgAgAUEmakHqksEAKQAANwAAIAFBIGpB5JLBACkAADcAACABQRhqQdySwQApAAA3AAAgAUEQakHUksEAKQAANwAAIAFBCGpBzJLBACkAADcAACABQcSSwQApAAA3AAAMAgsMAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCUH/AXFBAWsOBQECAwQFAAtBACEJIAJB////P0sgAkEFdCIFQfj///8HS3INFgJ/IAVFBEBBCCEQQQAMAQtB0c7FAC0AABpBCCEJIAVBCBDWBCIQRQ0XIAILIQogAgRAIBAhBSACIQkDQCAIIAEQ9wIgBUEYaiAIQRhqKQMANwMAIAVBEGogCEEQaikDADcDACAFQQhqIAhBCGopAwA3AwAgBSAIKQMANwMAIAVBIGohBSABQQxqIQEgCUEBayIJDQALCyAIQYCAgIB4NgKoBiAIQQI2AgggCCACNgIEIAggEDYCACAIIAhBqAZqNgIMIAhBkAdqIAgQjwECQCAIKAKoBiIBQYCAgIB4RwRAIAgoArAGIQIgCCgCrAYhAyAIKAKQByIEBEAgCCgClAcgBEHIAGwQ3wQLIAAgAjYCDCAAIAM2AgggACABNgIEIABBATYCAAwBCyAIKAKYByENIAgoApQHIRIgCCgCkAchBSAIECECQCAEBEAgAyAEQQxsaiEPIAgoArAEIgxBBGshESAIKAK0BCILQQJ0IQIgAyEJA0ACQCALIAkoAggiAUcEQCABIAtPDQQMAQsgCSgCBEEEayEOIAIhAQJAA0AgAUUNASABIBFqIRMgASAOaiABQQRrIQEoAgAiFCATKAIAIhNGDQALIBMgFEsNAQwECyABRQ0DCyAJQQxqIgkgD0cNAAsLIABBBGogEiANIAMgBCAGIAcQYCAAQQA2AgAgCCgCrAQiAARAIAgoArAEIABBAnQQ3wQLIAhB4AFqEP8DIAgoApACIgBBgICAgHhGIABFckUEQCAIKAKUAiAAQQJ0EN8ECyAFRQ0BIBIgBUHIAGwQ3wQMAQtB0c7FAC0AABpBLkEBENYEIgFFDRYgAEEuNgIMIAAgATYCCCAAQoGAgIDgBTcCACABQSZqQZiTwQApAAA3AAAgAUEgakGSk8EAKQAANwAAIAFBGGpBipPBACkAADcAACABQRBqQYKTwQApAAA3AAAgAUEIakH6ksEAKQAANwAAIAFB8pLBACkAADcAACAIKAKsBCIABEAgDCAAQQJ0EN8ECyAIQeABahD/AyAIKAKQAiIAQYCAgIB4RiAARXJFBEAgCCgClAIgAEECdBDfBAsgBUUNACASIAVByABsEN8ECyAKRQ0UIBAgCkEFdBDfBAwUCyACrUIwfiIqpyEFQQAhCSAqQiCIpyAFQfj///8HS3INFQJ/IAVFBEBBCCESQQAMAQtB0c7FAC0AABpBCCEJIAVBCBDWBCISRQ0WIAILIREgAgRAIBIhBSACIQkDQCAIIAEQ9gIgBUEoaiAIQShqKQMANwMAIAVBIGogCEEgaikDADcDACAFQRhqIAhBGGopAwA3AwAgBUEQaiAIQRBqKQMANwMAIAVBCGogCEEIaikDADcDACAFIAgpAwA3AwAgBUEwaiEFIAFBDGohASAJQQFrIgkNAAsLIAhBgICAgHg2AqgGIAhBAjYCCCAIIAI2AgQgCCASNgIAIAggCEGoBmo2AgwgCEGQB2ogCBCPAiAIKAKoBiIBQYCAgIB4RwRAIAgoArAGIQIgCCgCrAYhAyAIKAKQByIEBEAgCCgClAcgBEHoAGwQ3wQLIAAgAjYCDCAAIAM2AgggACABNgIEIABBATYCAAwTCyADIARBDGxqIQ8gCCgCmAchCyAIKAKUByEKIAgoApAHIQ0gCBAmAkAgBARAIAgoApAGIhBBBGshDCAIKAKUBiIFQQJ0IQIgAyEJA0ACQCAFIAkoAggiAUcEQCABIAVPDQQMAQsgCSgCBEEEayEOIAIhAQJAA0AgAUUNASABIAxqIRMgASAOaiABQQRrIQEoAgAiFCATKAIAIhNGDQALIBMgFEsNAQwECyABRQ0DCyAJQQxqIgkgD0cNAAsLQQAhECAIQQA2ArAIIAhCgICAgMAANwKoCCAIQQA2ArwIIAhCgICAgMAANwK0CCAEBEAgA0EMaiEBIAhBmAdqIQlBrPzAACgCACEMQaT8wAApAgAhLiADIQUDQCABIQIgCEGQB2ogBRDiASAIKQOoByEqIAgpA6AHISwgCCkDmAchKyAIKQOQByEtIAkgDDYCACAIIC43A5AHICsgLYRQRQRAQQEhAUEAIQUDQCAIKAKQByABQQFrRgRAIAhBkAdqQaj9wAAQpQMLIAgoApQHIAVqIC0+AgAgK0IghiAtQoCAgIAQVCEOICtQIRMgBUEEaiEFICtCIIghKyAIIAE2ApgHIAFBAWohASAtQiCIhCEtIA4gE3FFDQALCyAIQcgIaiIFIAkoAgA2AgAgCCAIKQOQBzcDwAggCCgCsAgiASAIKAKoCEYEQCAIQagIakGclMEAEJ8DCyAIKAKsCCABQQxsaiIOIAgpA8AINwIAIA5BCGogBSgCADYCACAIIAFBAWo2ArAIIAkgDDYCACAIIC43A5AHICogLIRQRQRAQQEhAUEAIQUDQCAIKAKQByABQQFrRgRAIAhBkAdqQaj9wAAQpQMLIAgoApQHIAVqICw+AgAgKkIghiAsQoCAgIAQVCEOICpQIRMgBUEEaiEFICpCIIghKiAIIAE2ApgHIAFBAWohASAsQiCIhCEsIA4gE3FFDQALCyAIQdgIaiIFIAkoAgA2AgAgCCAIKQOQBzcD0AggCCgCvAgiASAIKAK0CEYEQCAIQbQIakGslMEAEJ8DCyAIKAK4CCABQQxsaiIOIAgpA9AINwIAIA5BCGogBSgCADYCACAIIAFBAWo2ArwIIAJBAEEMIAIgD0YiDhtqIQEgAiEFIA5FDQALCyAIQQA2AugIIAhCgICAgMAANwLgCCAHDQUMEgtB0c7FAC0AABpBLkEBENYEIgFFDRQgAEEuNgIMIAAgATYCCCAAQoGAgIDgBTcCACABQSZqQZiTwQApAAA3AAAgAUEgakGSk8EAKQAANwAAIAFBGGpBipPBACkAADcAACABQRBqQYKTwQApAAA3AAAgAUEIakH6ksEAKQAANwAAIAFB8pLBACkAADcAACAIKAKMBiIABEAgECAAQQJ0EN8ECyAIEP8DIAgoAoADIgBBgICAgHhGIABFckUEQCAIKAKEAyAAQQJ0EN8ECyANRQ0SIAogDUHoAGwQ3wQMEgtBACEJIAJB////P0sgAkEFdCIFQfj///8HS3INFAJ/IAVFBEBBCCESQQAMAQtB0c7FAC0AABpBCCEJIAVBCBDWBCISRQ0VIAILIRQgAgRAIBIhBSACIQkDQCMAQRBrIg0kAAJAAkACQAJAIAEoAghFBEBB0c7FAC0AABpBASEQQQFBARDWBCIKRQ0DIApBADoAACAIIApBARCBAQwBCyANQQRqIAFBCBCwAiANKAIIIQoCQCANKAIMIg9BAkkNACAKIA9qIQxBACEQIA9BAXYiEUEBRwRAIA9BAWshCyARQf7///8HcSEOA0AgCiALaiIRLQAAIRMgESAKIBBqIhEtAAA6AAAgESATOgAAIAwgEEF+c2oiEy0AACEYIBMgEUEBaiIRLQAAOgAAIBEgGDoAACALQQJrIQsgDiAQQQJqIhBHDQALCyAPQQJxRQ0AIAogEGoiCy0AACERIAsgDCAQQX9zaiIQLQAAOgAAIBAgEToAAAsgDSgCBCEQIAggCiAPEIEBIBBFDQELIAogEBDfBAsgDUEQaiQADAELQQFBARD/BAALIAVBGGogCEEYaikDADcDACAFQRBqIAhBEGopAwA3AwAgBUEIaiAIQQhqKQMANwMAIAUgCCkDADcDACAFQSBqIQUgAUEMaiEBIAlBAWsiCQ0ACwsgCEGAgICAeDYCqAYgCEECNgIIIAggAjYCBCAIIBI2AgAgCCAIQagGajYCDCAIQZAHaiEJIwBB0AJrIgEkACABQYACaiAIIAgoAgwQgAICQAJAIAEtAMACIgVBA0YNACABQfgBaiICIAFBuAJqKQMANwMAIAFB8AFqIhAgAUGwAmopAwA3AwAgAUHoAWoiCiABQagCaikDADcDACABQeABaiILIAFBoAJqKQMANwMAIAFB2AFqIg0gAUGYAmopAwA3AwAgAUHQAWoiDyABQZACaikDADcDACABQcgBaiIMIAFBiAJqKQMANwMAIAEgASkDgAI3A8ABIAEgASgAwQI2AnggASABQcQCaigAADYAeyAFQQJGDQAgAUHYAGogAikDADcDACABQdAAaiAQKQMANwMAIAFByABqIAopAwA3AwAgAUFAayALKQMANwMAIAFBOGogDSkDADcDACABQTBqIA8pAwA3AwAgAUEoaiAMKQMANwMAIAEgASkDwAE3AyAgASABKAJ4NgIYIAEgASgAezYAGwJAIAgoAgwoAgBBgICAgHhHDQAgCCgCBEUNACAIKAIIRQ0gC0HRzsUALQAAGkGgAkEIENYEIgJFDSAgAiABKQMgNwMAIAIgBToAQCACIAEoAhg2AEEgAkHEAGogASgAGzYAACACQThqIAFB2ABqKQMANwMAIAJBMGogAUHQAGopAwA3AwAgAkEoaiABQcgAaikDADcDACACQSBqIAFBQGspAwA3AwAgAkEYaiABQThqKQMANwMAIAJBEGogAUEwaikDADcDACACQQhqIAFBKGopAwA3AwAgAUEBNgIUIAEgAjYCECABQQQ2AgwgAUHoAGogCEEIaikCADcDACABIAgpAgA3A2AgAUGAAmogAUHgAGogASgCbBCAAgJAIAEtAMACIgVBA0YNAEGJASEKIAFBwQJqIg1BA2ohD0EBIRADQCABQfgBaiILIAFBuAJqKQMANwMAIAFB8AFqIgwgAUGwAmopAwA3AwAgAUHoAWoiESABQagCaikDADcDACABQeABaiIOIAFBoAJqKQMANwMAIAFB2AFqIhMgAUGYAmopAwA3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P0sgAkEFdCIFQfj///8HS3INEwJ/IAVFBEBBCCEQQQAMAQtB0c7FAC0AABpBCCEJIAVBCBDWBCIQRQ0UIAILIRggAgRAIBAhBSACIQkDQCMAQRBrIg0kAAJAAkACQAJAIAEoAghFBEBB0c7FAC0AABpBASESQQFBARDWBCIKRQ0DIApBADoAACAIIApBARCJAQwBCyANQQRqIAFBCBCwAiANKAIIIQoCQCANKAIMIg9BAkkNACAKIA9qIQxBACESIA9BAXYiEUEBRwRAIA9BAWshCyARQf7///8HcSEOA0AgCiALaiIRLQAAIRMgESAKIBJqIhEtAAA6AAAgESATOgAAIAwgEkF+c2oiEy0AACEUIBMgEUEBaiIRLQAAOgAAIBEgFDoAACALQQJrIQsgDiASQQJqIhJHDQALCyAPQQJxRQ0AIAogEmoiCy0AACERIAsgDCASQX9zaiISLQAAOgAAIBIgEToAAAsgDSgCBCESIAggCiAPEIkBIBJFDQELIAogEhDfBAsgDUEQaiQADAELQQFBARD/BAALIAVBGGogCEEYaikDADcDACAFQRBqIAhBEGopAwA3AwAgBUEIaiAIQQhqKQMANwMAIAUgCCkDADcDACAFQSBqIQUgAUEMaiEBIAlBAWsiCQ0ACwsgCEGAgICAeDYCqAYgCEECNgIIIAggAjYCBCAIIBA2AgAgCCAIQagGajYCDCAIQZAHaiEJIwBB0AJrIgEkACABQYACaiAIIAgoAgwQ/gECQAJAIAEtAMACIgVBA0YNACABQfgBaiICIAFBuAJqKQMANwMAIAFB8AFqIhIgAUGwAmopAwA3AwAgAUHoAWoiCiABQagCaikDADcDACABQeABaiILIAFBoAJqKQMANwMAIAFB2AFqIg0gAUGYAmopAwA3AwAgAUHQAWoiDyABQZACaikDADcDACABQcgBaiIMIAFBiAJqKQMANwMAIAEgASkDgAI3A8ABIAEgASgAwQI2AnggASABQcQCaigAADYAeyAFQQJGDQAgAUHYAGogAikDADcDACABQdAAaiASKQMANwMAIAFByABqIAopAwA3AwAgAUFAayALKQMANwMAIAFBOGogDSkDADcDACABQTBqIA8pAwA3AwAgAUEoaiAMKQMANwMAIAEgASkDwAE3AyAgASABKAJ4NgIYIAEgASgAezYAGwJAIAgoAgwoAgBBgICAgHhHDQAgCCgCBEUNACAIKAIIRQ0fC0HRzsUALQAAGkGgAkEIENYEIgJFDR8gAiABKQMgNwMAIAIgBToAQCACIAEoAhg2AEEgAkHEAGogASgAGzYAACACQThqIAFB2ABqKQMANwMAIAJBMGogAUHQAGopAwA3AwAgAkEoaiABQcgAaikDADcDACACQSBqIAFBQGspAwA3AwAgAkEYaiABQThqKQMANwMAIAJBEGogAUEwaikDADcDACACQQhqIAFBKGopAwA3AwAgAUEBNgIUIAEgAjYCECABQQQ2AgwgAUHoAGogCEEIaikCADcDACABIAgpAgA3A2AgAUGAAmogAUHgAGogASgCbBD+AQJAIAEtAMACIgVBA0YNAEGJASEKIAFBwQJqIg1BA2ohD0EBIRIDQCABQfgBaiILIAFBuAJqKQMANwMAIAFB8AFqIgwgAUGwAmopAwA3AwAgAUHoAWoiESABQagCaikDADcDACABQeABaiIOIAFBoAJqKQMANwMAIAFB2AFqIhMgAUGYAmopAwA3AwAgAUHQAWoiFCABQZACaikDADcDACABQcgBaiIWIAFBiAJqKQMANwMAIAEgASkDgAI3A8ABIAEgDSgAADYCuAEgASAPKAAANgC7ASAFQQJGDQEgAUGwAWoiFyALKQMANwMAIAFBqAFqIgsgDCkDADcDACABQaABaiIMIBEpAwA3AwAgAUGYAWoiESAOKQMANwMAIAFBkAFqIg4gEykDADcDACABQYgBaiITIBQpAwA3AwAgAUGAAWoiFCAWKQMANwMAIAEgASkDwAE3A3ggASABKAK4ATYCcCABIAEoALsBNgBzIAEoAgwgEkYEQAJAIAEoAmwoAgBBgICAgHhHDQAgASgCZEUNACABKAJoRQ0iCyABQQxqIBJBAUEIQcgAEIgDIAEoAhAhAgsgFCkDACEqIBMpAwAhLCAOKQMAISsgESkDACEtIAwpAwAhLiALKQMAIS8gFykDACEwIAEpA3ghMSACIApqIgtBAWsgBToAACALQcEAayIFIDE3AwAgCyABKAJwNgAAIAtBA2ogASgAczYAACAFQThqIDA3AwAgBUEwaiAvNwMAIAVBKGogLjcDACAFQSBqIC03AwAgBUEYaiArNwMAIAVBEGogLDcDACAFQQhqICo3AwAgASASQQFq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CikDADcDACABQUBrIAspAwA3AwAgAUE4aiANKQMANwMAIAFBMGogDykDADcDACABQShqIAwpAwA3AwAgASABKQPAATcDICABIAEoAng2AhggASABKAB7NgAbAkAgCCgCDCgCAEGAgICAeEcNACAIKAIERQ0AIAgoAghFDR4LQdHOxQAtAAAaQaACQQgQ1gQiAkUNHiACIAEpAyA3AwAgAiAFOgBAIAIgASgCGDYAQSACQcQAaiABKAAbNgAAIAJBOGogAUHYAGopAwA3AwAgAkEwaiABQdAAaikDADcDACACQShqIAFByABqKQMANwMAIAJBIGogAUFAaykDADcDACACQRhqIAFBOGopAwA3AwAgAkEQaiABQTBqKQMANwMAIAJBCGogAUEoaikDADcDACABQQE2AhQgASACNgIQIAFBBDYCDCABQegAaiAIQQhqKQIANwMAIAEgCCkCADcDYCABQYACaiABQeAAaiABKAJsEP0BAkAgAS0AwAIiBUEDRg0AQYkBIQogAUHBAmoiDUEDaiEPQQEhEgNAIAFB+AFqIgsgAUG4AmopAwA3AwAgAUHwAWoiDCABQbACaikDADcDACABQegBaiIRIAFBqAJqKQMANwMAIAFB4AFqIg4gAUGgAmopAwA3AwAgAUHYAWoiEyABQZgCaikDADcDACABQdABaiIUIAFBkAJqKQMANwMAIAFByAFqIhYgAUGIAmopAwA3AwAgASABKQOAAjcDwAEgASANKAAANgK4ASABIA8oAAA2ALsBIAVBAkYNASABQbABaiIXIAspAwA3AwAgAUGoAWoiCyAMKQMANwMAIAFBoAFqIgwgESkDADcDACABQZgBaiIRIA4pAwA3AwAgAUGQAWoiDiATKQMANwMAIAFBiAFqIhMgFCkDADcDACABQYABaiIUIBYpAwA3AwAgASABKQPAATcDeCABIAEoArgBNgJwIAEgASgAuwE2AHMgASgCDCASRgRAAkAgASgCbCgCAEGAgICAeEcNACABKAJkRQ0AIAEoAmhFDSELIAFBDGogEkEBQQhByAAQiAMgASgCECECCyAUKQMAISogEykDACEsIA4pAwAhKyARKQMAIS0gDCkDACEuIAspAwAhLyAXKQMAITAgASkDeCExIAIgCmoiC0EBayAFOgAAIAtBwQBrIgUgMTcDACALIAEoAnA2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DCABQYgCaikDADcDACABIAEpA4ACNwPAASABIAEoAMECNgJ4IAEgAUHEAmooAAA2AHsgBUECRg0AIAFB2ABqIAIpAwA3AwAgAUHQAGogEikDADcDACABQcgAaiAKKQMANwMAIAFBQGsgCykDADcDACABQThqIA0pAwA3AwAgAUEwaiAPKQMANwMAIAFBKGogDCkDADcDACABIAEpA8ABNwMgIAEgASgCeDYCGCABIAEoAHs2ABsCQCAIKAIMKAIAQYCAgIB4Rw0AIAgoAgRFDQAgCCgCCEUNHQtB0c7FAC0AABpBoAJBCBDWBCICRQ0dIAIgASkDIDcDACACIAU6AEAgAiABKAIYNgBBIAJBxABqIAEoABs2AAAgAkE4aiABQdgAaikDADcDACACQTBqIAFB0ABqKQMANwMAIAJBKGogAUHIAGopAwA3AwAgAkEgaiABQUBrKQMANwMAIAJBGGogAUE4aikDADcDACACQRBqIAFBMGopAwA3AwAgAkEIaiABQShqKQMANwMAIAFBATYCFCABIAI2AhAgAUEENgIMIAFB6ABqIAhBCGopAgA3AwAgASAIKQIANwNgIAFBgAJqIAFB4ABqIAEoAmwQ/wECQCABLQDAAiIFQQNGDQBBiQEhCiABQcECaiINQQNqIQ9BASESA0AgAUH4AWoiCyABQbgCaikDADcDACABQfABaiIMIAFBsAJqKQMANwMAIAFB6AFqIhEgAUGoAmopAwA3AwAgAUHgAWoiDiABQaACaikDADcDACABQdgBaiITIAFBmAJqKQMANwMAIAFB0AFqIhQgAUGQAmopAwA3AwAgAUHIAWoiFiABQYgCaikDADcDACABIAEpA4ACNwPAASABIA0oAAA2ArgBIAEgDygAADYAuwEgBUECRg0BIAFBsAFqIhcgCykDADcDACABQagBaiILIAwpAwA3AwAgAUGgAWoiDCARKQMANwMAIAFBmAFqIhEgDikDADcDACABQZABaiIOIBMpAwA3AwAgAUGIAWoiEyAUKQMANwMAIAFBgAFqIhQgFikDADcDACABIAEpA8ABNwN4IAEgASgCuAE2AnAgASABKAC7ATYAcyABKAIMIBJGBEACQCABKAJsKAIAQYCAgIB4Rw0AIAEoAmRFDQAgASgCaEUNIAsgAUEMaiASQQFBCEHIABCIAyABKAIQIQIL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ASABKQPIBjcC7AQgAyANIBkQlwIgAUHIBmoiCiABQegEaiADEPQBIAMgCiALEIEDIAEtAOQFIQMgASgC2AUiCgRAIAEoAtwFIApBAnQQ3wQLIAEoAsgGIgoEQCABKALMBiAKQQJ0EN8ECwJAIANBAUcEQEHRzsUALQAAGkEzIQZBM0EBENYEIgNFDR8gA0EvakGH4sIAKAAANgAAIANBKGpBgOLCACkAADcAACADQSBqQfjhwgApAAA3AAAgA0EYakHw4cIAKQAANwAAIANBEGpB6OHCACkAADcAACADQQhqQeDhwgApAAA3AAAgA0HY4cIAKQAANwAADAELAkAgAS0A9ARBAkYEQCABLQCEBUEBRw0BC0HRzsUALQAAGkEnIQZBJ0EBENYEIgNFDSAgA0EfakGq4sIAKQAANwAAIANBGGpBo+LCACkAADcAACADQRBqQZviwgApAAA3AAAgA0EIakGT4sIAKQAANwAAIANBi+LCACkAADcAAAwBCyAMQQJ0IQsCQCAMRQRAQQQhCgwBC0HRzsUALQAAGiALQQQQ1gQiCkUNIQsgCwRAIAogCSAL/AoAAAsgASAGOgDkBSABIAw2AuAFIAEgCjYC3AUgASAMNgLYBSABQdgGaiEGIAFB2AVqIQ1BACEKQQAhESMAQfABayIDJAACQAJAAkACQAJAIAJB6NHBAEEgEPEDRQRAIAJBIGoiDkHo0cEAQSAQ8QNFDQELAkACQCANLQAMIhpBAUcEQCADQRBqQgA3AwAgA0EYakIANwMAIANBIGpCADcDACADQShqQgA3AwAgA0EwakIANwMAIANBOGpCADcDACADQUBrQgA3AwAgA0IANwMIIAMgAi0AQCIOOgBIIANBiAFqIAJBOGopAwA3AwAgA0GAAWogAkEwaikDADcDACADQfgAaiACQShqKQMANwMAIANB2ABqIAJBCGopAwA3AwAgA0HgAGogAkEQaikDADcDACADQegAaiACQRhqKQMANwMAIAMgDjoAkAEgAyACKQMgNwNwIAMgAikDADcDUCANKAIEIRsgDSgCACEcQQQhDiAaDgMBAgECCyAGQgA3AwAgBkEIakIANwMAIAZBEGpCADcDACAGQRhqQgA3AwAgBkEgakIANwMAIAZBKGpCADcDACAGQTBqQgA3AwAgBkE4akIANwMADAMLIA0oAggi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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIARBAkYEQCABKAIEIQQgASgCACEFIANBoAtqIAFBCGpB2AD8CgAAIAIEQCABIAJBMGwQ3wQLIANBsAJqIgEgA0GgC2pB2AD8CgAAIANBEGogA0G4AmopAwA3AwAgA0EYaiADQcACaikDADcDACADQSBqIANByAJqKQMANwMAIANBKGogA0HQAmopAwA3AwAgA0E4aiADQeACaikDADcDACADQUBrIANB6AJqKQMANwMAIANByABqIANB8AJqKQMANwMAIANB0ABqIANB+AJqKQMANwMAIANB2ABqIANBgANqKQMANwMAIAMgBDYCBCADIAU2AgAgAyADKQOwAjcDCCADIAMpA9gCNwMwIANB4ABqIAMQGyADQcgBaiADQTBqEBsgAy0AwAFFDQEgAy0AqAJFDQIgARAmAkACQAJAIAMtAMgIIhtBAUYEQCADKQPwBCEiAkAgAykD+AQiI0IAUwRAIANBqAtqQdyawAAoAgA2AgAgA0HUmsAAKQIANwOgC0IAICJ9ISRCACAjICJCAFKtfH0hIkEAIQJBASEEA0AgAygCoAsgBEEBa0YEQCADQaALakHYm8AAEKUDCyADKAKkCyACaiAkPgIAICJCIIYgJEKAgICAEFQhASAiUCEFIAJBBGohAiAiQiCIISIgAyAENgKoCyAEQQFqIQQgJEIgiIQhJCABIAVxRQ0ACyADQdAJaiADQagLaigCADYCACADIAMpA6ALNwPICSADQQA6ANQJDAELICIgI4RQBEAgA0HQCWpBzJrAACkCADcDACADQcSawAApAgA3A8gJDAELIANBqAtqQdyawAAoAgA2AgAgA0HUmsAAKQIANwOgC0EAIQJBASEEA0AgAygCoAsgBEEBa0YEQCADQaALakHYm8AAEKUDCyADKAKkCyACaiAiPgIAICNCIIYgIkKAgICAEFQhASAjUCEFIAJBBGohAiAjQiCIISMgAyAENgKoCyAEQQFqIQQgIkIgiIQhIiABIAVxRQ0ACyADQdAJaiADQagLaigCADYCACADIAMpA6ALNwPICSADQQI6ANQJCyADKALECA0BIAMoAsAIIAMoArwIIQEgA0HIEWpBzJrAACkCADcDACADQcSawAApAgA3A8ARIAFFDQIgAUECdBDfBAwCCyADKAK4CCIBRQRAIANB2AhqQcyawAApAgA3AwAgA0HEmsAAKQIANwPQCAwDCyADQagLakHcmsAAKAIANgIAIANB1JrAACkCADcDoAsgA0GgC2pByJvAABClAyADKAKkCyABNgIAIANB2AhqQQE2AgAgAyADKQOgCzcD0AggA0ECOgDcCAwCCyADQcgRaiADQbwIaiIBQQhqKAIANgIAIANBAjoAzBEgAyABKQIANwPAEQsgA0GoC2oiBEHcmsAAKAIANgIAIANB1JrAACkCADcDoAsgA0GgC2oiBUHIm8AAEKUDIAMoAqQLQQE2AgAgAygCpAshAiADKAKgCyEBIAUgA0HICWogA0HAEWoQwgECQAJAAkACQAJAAkACQCADLQCsCw4CAgABCyADQQI6AIwTIANBATYCiBMgAyACNgKEEyADIAE2AoATIAMoAqALIgFFDQUgAygCpAsgAUECdBDfBAwFCwJ/IAMoAqgLIgRBAUYEQCACKAIAIgQgAygCpAsoAgAiBUYNAyAEIAVLIAQgBUlrDAELIARFIARBAUtrC0H/AXEOAgECAwsgA0EBNgKoFiADIAI2AqQWIAMgATYCoBYgA0HoCGogBCgCADYCACADIAMpAqALIiI3A+AIAn8gIqcgAUsEQCADQYgTaiADQagLaigCADYCACADIAMpAqALNwOAEyADQfAVaiADQYATaiADQaAWaiIBEMoBIAEMAQsgA0EBNgKIEyADIAI2AoQTIAMgATYCgBMgA0HwFWogA0GAE2ogA0HgCGoiARDKASABCyIBKAIAIgIEQCABKAIEIAJBAnQQ3wQLIAMoAvgVRQRAIANBiBNqIANB+BVqKAIANgIAIANBAToAjBMgAyADKQLwFTcDgBMMBAsgA0GIE2ogA0H4FWooAgA2AgAgA0ECOgCMEyADIAMpAvAVNwOAEwwDCyADQYgTakHMmsAAKQIANwMAIANBxJrAACkCADcDgBMgAygCoAsiBARAIAMoAqQLIARBAnQQ3wQLIAFFDQIgAiABQQJ0EN8EDAILIANBATYCqBYgAyACNgKkFiADIAE2AqAWIANB6AhqIANBqAtqKAIANgIAIAMgAykCoAs3A+AIIANB8BVqIANBoBZqIANB4AhqEIcCIAMoAuAIIgEEQCADKALkCCABQQJ0EN8ECyADQYgTaiADQfgVaigCACIBNgIAIAMgAykC8BU3A4ATIANBAkEBIAEbOgCMEwwBCyADQagWaiADQagLaigCADYCACADIAMpAqALNwOgFiADQQE2AugIIAMgAjYC5AggAyABNgLgCCADQfAVaiADQaAWaiADQeAIahCHAiADKALgCCIBBEAgAygC5AggAUECdBDfBAsgA0GIE2ogA0H4FWooAgAiATYCACADIAMpAvAVNwOAEyADIAFFOgCMEwsgA0HQCGogA0GAE2ogA0HAEWoQwgEgAygCgBMiAQRAIAMoAoQTIAFBAnQQ3wQLIAMoAsARIgEEQCADKALEESABQQJ0EN8ECyADKALICSIBRQ0AIAMoAswJIAFBAnQQ3wQLIANB4AhqIgEgA0HgAGogA0HIAWoQJyADLQDACUUNAyADQcgJaiABQegA/AoAACADLQCoCkUNBCADQaALahAmIAMtALgRIgFBAUcNBSADQYATaiIFQcCwwABB4ABBEBDxASADKAKAE0GAgICAeEYNBiADQZgVaiIGIANBiBNqIgEoAgA2AgAgAyADKQKAEzcDkBUgBUGgscAAQeAAQRAQ8QEgAygCgBNBgICAgHhGDQcgA0GoFWoiByABKAIANgIAIAMgAykCgBM3A6AVIAVBgLLAAEHfAEEQEPEBIAMoAoATQYCAgIB4Rg0IIANBuBVqIgggASgCADYCACADIAMpAoATNwOwFSAFQd+ywABB4ABBEBDxASADKAKAE0GAgICAeEYNCSADQcgVaiIJIAEoAgA2AgAgAyADKQKAEzcDwBUgBUG/s8AAQd8AQRAQ8QEgAygCgBNBgICAgHhGDQogA0HYFWoiCiABKAIANgIAIAMgAykCgBM3A9AVIAVBnrTAAEHgAEEQEPEBIAMoAoATQYCAgIB4Rg0LIANB6BVqIgsgASgCADYCACADIAMpAoATNwPgFSAFQf60wABB3wBBEBDxASADKAKAE0GAgICAeEYNDCADQbgKaiIMIAEoAgA2AgAgAyADKQKAEzcDsAogBUHdtcAAQeAAQRAQ8QEgAygCgBNBgICAgHhGDQ0gA0HYCmoiDSABKAIANgIAIAMgAykCgBM3A9AKIAVBvbbAAEHfAEEQEPEBIAMoAoATQYCAgIB4Rg0OIANB+ApqIg8gASgCADYCACADIAMpAoATNwPwCiAFQZy3wABB4ABBEBDxASADKAKAE0GAgICAeEYNDyADQfgVaiIOIAEoAgA2AgAgAyADKQKAEzcD8BUgBUH8t8AAQeAAQRAQ8QEgAygCgBNBgICAgHhGDRAgA0GoFmoiESABKAIANgIAIAMgAykCgBM3A6AWIANBwBFqIgJB3LjAAEHfAEEQEPEBIAMoAsARQYCAgIB4Rg0RIANBjBRqIANByBFqIgQoAgA2AgAgASAGKAIANgIAIANBlBNqIAcoAgA2AgAgA0GgE2ogCCgCADYCACADIAMpAsARNwKEFCADIAMpA5AVNwOAEyADIAMpA6AVNwKMEyADIAMpA7AVNwOYEyADQawTaiAJKAIANgIAIAMgAykDwBU3AqQTIANBuBNqIAooAgA2AgAgAyADKQPQFTcDsBMgA0HEE2ogCygCADYCACADIAMpA+AVNwK8EyADQdATaiAMKAIANgIAIAMgAykDsAo3A8gTIANB3BNqIA0oAgA2AgAgAyADKQPQCjcC1BMgA0HoE2ogDygCADYCACADIAMpA/AKNwPgEyADQfQTaiAOKAIANgIAIAMgAykD8BU3AuwTIANBgBRqIBEoAgA2AgAgAyADKQOgFjcD+BNB0c7FAC0AABoCfwJAQcAEQQgQ1gQiAQRAQQwhESACIAUQ9gIgAUEoaiADQegRaiIFKQMANwMAIAFBIGogA0HgEWoiBikDADcDACABQRhqIANB2BFqIgcpAwA3AwAgAUEQaiADQdARaiIIKQMANwMAIAFBCGogBCkDADcDACABIAMpA8ARNwMAIAIgA0GME2oQ9gIgAUHYAGogBSkDADcDACABQdAAaiAGKQMANwMAIAFByABqIAcpAwA3AwAgAUFAayAIKQMANwMAIAFBOGogBCkDADcDACABIAMpA8ARNwMwIAIgA0GYE2oQ9gIgAUGIAWogBSkDADcDACABQYABaiAGKQMANwMAIAFB+ABqIAcpAwA3AwAgAUHwAGogCCkDADcDACABQegAaiAEKQMANwMAIAEgAykDwBE3A2AgAiADQaQTahD2AiABQbgBaiAFKQMANwMAIAFBsAFqIAYpAwA3AwAgAUGoAWogBykDADcDACABQaABaiAIKQMANwMAIAFBmAFqIAQpAwA3AwAgASADKQPAETcDkAEgAiADQbATahD2AiABQegBaiAFKQMANwMAIAFB4AFqIAYpAwA3AwAgAUHYAWogBykDADcDACABQdABaiAIKQMANwMAIAFByAFqIAQpAwA3AwAgASADKQPAETcDwAEgAiADQbwTahD2AiABQZgCaiAFKQMANwMAIAFBkAJqIAYpAwA3AwAgAUGIAmogBykDADcDACABQYACaiAIKQMANwMAIAFB+AFqIAQpAwA3AwAgASADKQPAETcD8AEgAiADQcgTahD2AiABQcgCaiAFKQMANwMAIAFBwAJqIAYpAwA3AwAgAUG4AmogBykDADcDACABQbACaiAIKQMANwMAIAFBqAJqIAQpAwA3AwAgASADKQPAETcDoAIgAiADQdQTahD2AiABQfgCaiAFKQMANwMAIAFB8AJqIAYpAwA3AwAgAUHoAmogBykDADcDACABQeACaiAIKQMANwMAIAFB2AJqIAQpAwA3AwAgASADKQPAETcD0AIgAiADQeATahD2AiABQagDaiAFKQMANwMAIAFBoANqIAYpAwA3AwAgAUGYA2ogBykDADcDACABQZADaiAIKQMANwMAIAFBiANqIAQpAwA3AwAgASADKQPAETcDgAMgAiADQewTahD2AiABQdgDaiAFKQMANwMAIAFB0ANqIAYpAwA3AwAgAUHIA2ogBykDADcDACABQcADaiAIKQMANwMAIAFBuANqIAQpAwA3AwAgASADKQPAETcDsAMgAiADQfgTahD2AiABQYgEaiAFKQMANwMAIAFBgARqIAYpAwA3AwAgAUH4A2ogBykDADcDACABQfADaiAIKQMANwMAIAFB6ANqIAQpAwA3AwAgASADKQPAETcD4AMgAiADQYQUahD2AiABQbgEaiAFKQMANwMAIAFBsARqIAYpAwA3AwAgAUGoBGogBykDADcDACABQaAEaiAIKQMANwMAIAFBmARqIAQpAwA3AwAgASADKQPAETcDkAQgAUGQBGpB+MPCAEEwEPEDRQ0BQQshD0EMDAILQQhBwARBpK3AABDIBAALIAFB4ANqQfjDwgBBMBDxAwRAQQohD0ELDAELIAFBsANqQfjDwgBBMBDxAwRAQQkhD0EKDAELIAFBgANqQfjDwgBBMBDxAwRAQQghD0EJDAELIAFB0AJqQfjDwgBBMBDxAwRAQQchD0EIDAELIAFBoAJqQfjDwgBBMBDxAwRAQQYh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A0HkEmogGCgCADYCACADIAMpA/AVNwLcEiADQfASaiAEKAIANgIAIAMgAykDoBY3A+gSQdHOxQAtAAAaAn8CQEGABkEIENYEIgQEQCACIANBwBFqEPYCIARBKGogA0GoE2oiBykDADcDACAEQSBqIANBoBNqIggpAwA3AwAgBEEYaiADQZgTaiIJKQMANwMAIARBEGogA0GQE2oiCikDADcDACAEQQhqIAYpAwA3AwAgBCADKQOAEzcDACACIANBzBFqEPYCIARB2ABqIAcpAwA3AwAgBEHQAGogCCkDADcDACAEQcgAaiAJKQMANwMAIARBQGsgCikDADcDACAEQThqIAYpAwA3AwAgBCADKQOAEzcDMCACIANB2BFqEPYCIARBiAFqIAcpAwA3AwAgBEGAAWogCCkDADcDACAEQfgAaiAJKQMANwMAIARB8ABqIAopAwA3AwAgBEHoAGogBikDADcDACAEIAMpA4ATNwNgIAIgA0HkEWoQ9gIgBEG4AWogBykDADcDACAEQbABaiAIKQMANwMAIARBqAFqIAkpAwA3AwAgBEGgAWogCikDADcDACAEQZgBaiAGKQMANwMAIAQgAykDgBM3A5ABIAIgA0HwEWoQ9gIgBEHoAWogBykDADcDACAEQeABaiAIKQMANwMAIARB2AFqIAkpAwA3AwAgBEHQAWogCikDADcDACAEQcgBaiAGKQMANwMAIAQgAykDgBM3A8ABIAIgA0H8EWoQ9gIgBEGYAmogBykDADcDACAEQZACaiAIKQMANwMAIARBiAJqIAkpAwA3AwAgBEGAAmogCikDADcDACAEQfgBaiAGKQMANwMAIAQgAykDgBM3A/ABIAIgA0GIEmoQ9gIgBEHIAmogBykDADcDACAEQcACaiAIKQMANwMAIARBuAJqIAkpAwA3AwAgBEGwAmogCikDADcDACAEQagCaiAGKQMANwMAIAQgAykDgBM3A6ACIAIgA0GUEmoQ9gIgBEH4AmogBykDADcDACAEQfACaiAIKQMANwMAIARB6AJqIAkpAwA3AwAgBEHgAmogCikDADcDACAEQdgCaiAGKQMANwMAIAQgAykDgBM3A9ACIAIgA0GgEmoQ9gIgBEGoA2ogBykDADcDACAEQaADaiAIKQMANwMAIARBmANqIAkpAwA3AwAgBEGQA2ogCikDADcD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QbgWaiIMKQMANwMAQRAhECACQRBqIANBsBZqIg0pAwA3AwAgAkEIaiAJKQMANwMAIAIgAykDoBY3AwAgBiADQYwTahD2AiACQdgAaiAKKQMANwMAIAJB0ABqIAspAwA3AwAgAkHIAGogDCkDADcDACACQUBrIA0pAwA3AwAgAkE4aiAJKQMANwMAIAIgAykDoBY3AzAgBiADQZgTahD2AiACQYgBaiAKKQMANwMAIAJBgAFqIAspAwA3AwAgAkH4AGogDCkDADcDACACQfAAaiANKQMANwMAIAJB6ABqIAkpAwA3AwAgAiADKQOgFjcDYCAGIANBpBNqEPYCIAJBuAFqIAopAwA3AwAgAkGwAWogCykDADcDACACQagBaiAMKQMANwMAIAJBoAFqIA0pAwA3AwAgAkGYAWogCSkDADcDACACIAMpA6AWNwOQASAGIANBsBNqEPYCIAJB6AFqIAopAwA3AwAgAkHgAWogCykDADcDACACQdgBaiAMKQMANwMAIAJB0AFqIA0pAwA3AwAgAkHIAWogCSkDADcDACACIAMpA6AWNwPAASAGIANBvBNqEPYCIAJBmAJqIAopAwA3AwAgAkGQAmogCykDADcDACACQYgCaiAMKQMANwMAIAJBgAJqIA0pAwA3AwAgAkH4AWogCSkDADcDACACIAMpA6AWNwPwASAGIANByBNqEPYCIAJByAJqIAopAwA3AwAgAkHAAmogCykDADcDACACQbgCaiAMKQMANwMAIAJBsAJqIA0pAwA3AwAgAkGoAmogCSkDADcDACACIAMpA6AWNwOgAiAGIANB1BNqEPYCIAJB+AJqIAopAwA3AwAgAkHwAmogCykDADcDACACQegCaiAMKQMANwMAIAJB4AJqIA0pAwA3AwAgAkHYAmogCSkDADcDACACIAMpA6AWNwPQAiAGIANB4BNqEPYCIAJBqANqIAopAwA3AwAgAkGgA2ogCykDADcDACACQZgDaiAMKQMANwMAIAJBkANqIA0pAwA3AwAgAkGIA2ogCSkDADcDACACIAMpA6AWNwOAAyAGIANB7BNqEPYCIAJB2ANqIAopAwA3AwAgAkHQA2ogCykDADcDACACQcgDaiAMKQMANwMAIAJBwANqIA0pAwA3AwAgAkG4A2ogCSkDADcDACACIAMpA6AWNwOwAyAGIANB+BNq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AwAgAyADKQPICTcDgBMgEyAEKQMANwMAIBQgBSkDADcDACAVIAYpAwA3AwAgFiAHKQMANwMAIBcgCCkDADcDACADIAMpA8gJNwOgFiAJIANB0ApqIAoQlgEgASADQeAKaiALEJYBIAIgCSABEEwgAygCoAtBAUYNQSADQegRaiAYKQMANwMAIANB4BFqIAwpAwA3AwAgA0HYEWogDSkDADcDACADQdARaiAPKQMANwMAIANByBFqIA4pAwA3AwAgAyADKQOoCzcDwBEgDCADQaAKaikDADcDACANIANBmApqKQMANwMAIA8gA0GQCmopAwA3AwAgDiADQYgKaikDADcDACADQagLaiIEIANBgApqKQMANwMAIAMgAykD+Ak3A6ALIAogASACELIBIAIgA0HwCmogCkEAEDEgAy0AgAxBAkYNPSALIAJB6AD8CgAAIAMoAtAKIgEEQCADKALUCiABQTBsEN8ECyADKALgCiIBBEAgAygC5AogAUEwbBDfBAsgAygCsAoiAQRAIAMoArQKIAFBMGwQ3wQLIAMoAsAKIgEEQCADKALECiABQTBsEN8ECyADQagLaiADQdgIaikDADcDACADIAMpA9AINwOgCyAAIANBgBNqIANBoAtqEKcBIBtBAUYNPiADKAK8CCIARQ0+IAMoAsAIIABBAnQQ3wQMPgsgAyAENgKIEyADIAE2AoQTIAMgAjYCgBNBhJ3AAEErIANBgBNqQfypwABBjKrAABDKAwALIANBAjYCpAsgA0G8qcAANgKgCyADQgE3AqwLIAMgA0HgAGqtQoCAgICAAoQ3A7ACIAMgA0GwAmo2AqgLIANBoAtqQcypwAAQqAQACyADQQI2AqQLIANBvKnAADYCoAsgA0IBNwKsCyADIANByAFqrUKAgICAgAKENwOwAiADIANBsAJqNgKoCyADQaALakHcqcAAEKgEAAsgA0ECNgKkCyADQbypwAA2AqALIANCATcCrAsgAyADQeAIaq1CgICAgIAChDcDgBMgAyADQYATajYCqAsgA0GgC2pB7KnAABCoBAALIANBAjYCpAsgA0G8qcAANgKgCyADQgE3AqwLIAMgA0HICWqtQoCAgICAAoQ3A4ATIAMgA0GAE2o2AqgLIANBoAtqQaCwwAAQqAQACyADIAE6AKAWIANBAjYChBMgA0G838AANgKA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KQMANwMAIB4gBCkDADcDACAfIAMpAwA3AwAgAiACKQOAlAU3A4CdBSACQbikBWogGSkDADcDACACQbCkBWogGikDADcDACACQaikBWogGykDADcDACACQaCkBWogHCkDADcDACACQZikBWogHSkDADcDACACQZCkBWogHikDADcDACACQYikBWogHykDADcDACACIAIpA4CdBTcDgKQFQQBFBEAgAkGAoAVqIAJBgKMFakHAAfwKAAALIAIgAUGAA2o2AoSOBSACIBU2AoCOBSACQYCXBWoiJiACQYCOBWoiBxC9AyAOICApAwAiRzcDACAUICEpAwAiSDcDACALICIpAwAiSTcDACATICMpAwAiSjcDACANIBgpAwAiSzcDACACQYiRBWoiASACQYiXBWoiJykDADcDACACQZCRBWoiAyACQZCXBWoiKCkDADcDACACQZiRBWoiBCBLNwMAIAJBoJEFaiIVIEo3AwAgAkGokQVqIhYgSTcDACACQbCRBWoiFyBINwMAIAJBuJEFaiIkIEc3AwAgAiACKQOAlwUiRzcDgJQFIAIgRzcDgJEFIAUgJCkDADcDACAJIBcpAwA3AwAgCiAWKQMANwMAIA8gFSkDADcDACAQIAQpAwA3AwAgEiADKQMANwMAIBEgASkDADcDACACIAIpA4CRBTcDgJoFIBkgBSkDADcDACAaIAkpAwA3AwAgGyAKKQMANwMAIBwgDykDADcDACAdIBApAwA3AwAgHiASKQMANwMAIB8gESkDADcDACACIAIpA4CaBTcDgJ0FICYgBxC9AyAOICApAwAiRzcDACAUICEpAwAiSDcDACALICIpAwAiSTcDACATICMpAwAiSjcDACANIBgpAwAiSzcDACABICcpAwA3AwAgAyAoKQMANwMAIAQgSzcDACAVIEo3AwAgFiBJNwMAIBcgSDcDACAkIEc3AwAgAiACKQOAlwUiRzcDgJQFIAIgRzcDgJEFIAUgJCkDADcDACAJIBcpAwA3AwAgCiAWKQMANwMAIA8gFSkDADcDACAQIAQpAwA3AwAgEiADKQMANwMAIBEgASkDADcDACACIAIpA4CRBTcDgJoFIAJB+J0FaiAFKQMANwMAIAJB8J0FaiAJKQMANwMAIAJB6J0FaiAKKQMANwMAIAJB4J0FaiAPKQMANwMAIAJB2J0FaiAQ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IA0pAwA3AwAgHCAOKQMANwMAIB0gECkDADcDACAeIA8pAwA3AwAgAiACKQOAlwU3A4CaBSAmIAgQvQMgFSAfKQMAIkg3AwAgFCAgKQMAIkk3AwAgEyAhKQMAIko3AwAgEiAiKQMAIks3AwAgESAjKQMAIkw3AwAgASAnKQMANwMAIAQgKCkDADcDACADIEw3AwAgCSBLNwMAIBYgSjcDACAXIEk3AwAgJCBINwMAIAIgAikDgJQFIkg3A4CRBSACIEg3A4COBSAFICQpAwA3AwAgByAXKQMANwMAIAwgFikDADcDACANIAkpAwA3AwAgDiADKQMANwMAIBAgBCkDADcDACAPIAEpAwA3AwAgAiACKQOAjgU3A4CXBSACQfiaBWogBSkDADcDACACQfCaBWogBykDADcDACACQeiaBWogDCkDADcDACACQeCaBWogDSkDADcDACACQdiaBWogDikDADcDACACQdCaBWogECkDADcDACACQciaBWogDykDADcDACACIAIpA4CXBTcDwJoFICYgCBC9AyAVIB8pAwAiSDcDACAUICApAwAiSTcDACATICEpAwAiSjcDACASICIpAwAiSzcDACARICMpAwAiTDcDACABICcpAwA3AwAgBCAoKQMANwMAIAMgTDcDACAJIEs3AwAgFiBKNwMAIBcgSTcDACAkIEg3AwAgAiACKQOAlAUiSDcDgJEFIAIgSDcDgI4FIAUgJCkDADcDACAHIBcpAwA3AwAgDCAWKQMANwMAIA0gCSkDADcDACAOIAMpAwA3AwAgECAEKQMANwMAIA8gASkDADcDACACIAIpA4COBTcDgJcFIAJBuJsFaiAFKQMANwMAIAJBsJsFaiAHKQMANwMAIAJBqJsFaiAMKQMANwMAIAJBoJsFaiANKQMANwMAIAJBmJsFaiAOKQMANwMAIAJBkJsFaiAQKQMANwMAIAJBiJsFaiAPKQMANwMAIAIgAikDgJcFNwOAmwUgJUUEQCACQYCgBWogAkGAmgVqQcAB/AoAAAsgJUUEQCACQcCeBWogAkGAoAVqQcAB/AoAAAsgAiACQYCdBWpBgAP8CgAAIAJBgANqIgEgAkEBEHQgAkGABmoiFSACIAEQ9gEgAkGACWoiCSABIBUQ9gEgAkGADGoiHCABIAkQ9gEgAkGAD2oiGCABIBwQ9gEgAkGA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IAEpA7AdfCISIBggIFStIAEpA8gdIA8gIFatfHx8Iip8Ig8gASkD8Bx8IiAgASkDiB0gASkDgB0iCiAQfCAKVK18fCIYIAEpA7AefCIQQonHmaSu8IHph39+IgpCAELH+vPD7YKjkDxCABDJAyABQaAcaiAKQgBCjZXHw5bS2sCXf0IAEMkDIAFBkBxqIApCAELdsIWM6LaRqLh/QgAQyQMgAUGAHGogCkIAQqnAxomuzpOyMEIAEMkDAkACQAJAIAEpA4gcIAEpA+gfIAEpA+AfIAwgDlStIAEpA8gcIA0gDlatfHwiDiABKQPIHyANICFUrXx8IgogDlSthCIOIAEpA9gfIAogCiABKQPQH3wiClatfCAKIAogEyAVVq0gASkDmB8gDCATVq18fHwiClatfHwiDSAOVK18IA0gDSABKQOoHSAKIAogASkDoB18IgpWrXwgCiAKIBIgKlatIAEpA7gdIBIgFVStfHx8IgpWrXx8Ig1WrXwgDSABKQOoHyAKIAogASkDoB98IgpWrXwgCiAKIAsgD1atIAEpA+geIAsgGVStfHx8IgpWrXx8IgsgDVStfCIVIAEpA/AffCINIAEpA9gcIAsgCyABKQPQHHwiC1atfCALIAEpA+gcIAogCiABKQPgHHwiClatfCAKIBggIFStIAEpA/gcIA8gIFatfHx8IgwgClStfHwiCiALVK18fCIOIAEpA7gfIAogCiABKQOwH3wiClatfCAKIAogASkD+B4gASkDuB4gECAYVK18Ig8gASkD8B58IgsgD1StfCALIAsgDHwiC1atfHwiClatfHwiDCABKQOAHHwiDyAMVK18IA8gASkDmBwgCiAKIAEpA5AcfCIKVq18IAogCiABKQOoHCALIAsgASkDoBx8IgtWrXwgCyABKQO4HCABKQOwHCIgIBB8ICBUrXx8Ii4gC1StfHwiClatfHwiCyAPVK18IAwgDlStIA0gDlatIAEpA/gfIA0gFVStfHx8fCIrQqnAxomuzpOyMFYNAAJAICtCqcDGia7Ok7IwUQRAIAtC3bCFjOi2kai4f1YNAiALQt2whYzotpGouH9RDQFCqcDGia7Ok7IwISsLIAshKiAKISAMAwsgCkKNlcfDltLawJd/Vg0AQt2whYzotpGouH8hKiAKQo2Vx8OW0trAl39SIC5Cx/rzw+2Co5A8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BCABKQMANwMAIAQgASkDMDcDMCAEQShqIAFBKGopAwA3AwAgBEEgaiABQSBqKQMANwMAIARBGGogAUEYaikDADcDACAEQRBqIAFBEGopAwA3AwAgBEEIaiABQQhqKQMANwMAIARBOGogAUE4aikDADcDACAEQUBrIAFBQGspAwA3AwAgBEHIAGogAUHIAGopAwA3AwAgBEHQAGogAUHQAGopAwA3AwAgBEHYAGogAUHYAGopAwA3AwAMCwtB0c7FAC0AABpBoAJBCBDWBCIERQ0JIAFBkAFqIQdBuAEhBUIAIRJCACERQgAhEEIAIQ5CACENQgAhFgNAIANBkARqIAEgBWopAwAiD0IAIBxCABDJAyADQaAEaiAPQgAgF0IAEMkDIANBsARqIA9CACAYQgAQyQMgA0HABGogD0IAIBlCABDJAyADQdAEaiAPQgAgG0IAEMkDIANB4ARqIA9CACAdQgAQyQMgA0GABGogAykDkAQiFSAWfCIUQgBCAEL9//P/z///+Yl/EMkDIANB8ANqIAMpA4gEIg9CAEKr1f7///+//7l/QgAQyQMgA0HgA2ogD0IAQv//z4rr///VHkIAEMkDIANB0ANqIA9CAEKk7MO1j9S0mOcAQgAQyQMgA0HAA2ogD0IAQr+llJzP8NK75ABCABDJAyADQbADaiAPQgBC19mumuT26Y3LAEIAEMkDIANBoANqIA9CAEKazf/Lo73EgBpCABDJAyADKQOoAyASIAMpA+AEIhp8Ig8gAykD2AQgESADKQPQBCISfCITIBJUrXwgEyADKQPIBCADKQPABCIRIBB8IhAgEVStfCAQIAMpA7gEIAMpA7AEIhEgDnwiDiARVK18IA4gAykDqAQgAykDoAQiESANfCINIBFUrXwgDSADKQOYBCAUIBVUrXx8IhIgDVStfHwiDSAOVK18fCIOIBBUrXx8IhAgE1StfHwiEyADKQOgA3wiFSATVK18IBUgFSADKQO4AyAQIBAgAykDsAN8IhFWrXwgESARIAMpA8gDIA4gDiADKQPAA3wiEFatfCAQIBAgAykD2AMgDSANIAMpA9ADfCIOVq18IA4gDiADKQPoAyASIAMpA+ADIhJ8Ig0gElStfCANIAMpA/gDIBQgAykD8AMiEnwgElStfHwiFiANVK18fCINVq18fCIOVq18fCIQVq18fCIR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IAMgGTcD8BQgAyAbNwPoFCADIBI3A+AUIARB4ANqIAEgA0HgFGoQvQIgBCADKQOAGzcDACAEQQhqIANBiBtqKQMANwMAIARBEGogA0GQG2opAwA3AwAgBEEYaiADQZgbaikDADcDACAEQSBqIANBoBtqKQMANwMAIARBKGogA0GoG2opAwA3AwAgBEG4BGogC0EoaikDADcDACAEQbAEaiALQSBqKQMANwMAIARBqARqIAtBGGopAwA3AwAgBEGgBGogC0EQaikDADcDACAEQZgEaiALQQhqKQMANwMAIAQgCykDADcDkAQgBEHYAGogB0EoaikDADcDACAEQdAAaiAHQSBqKQMANwMAIARByABqIAdBGGopAwA3AwAgBEFAayAHQRBqKQMANwMAIARBOGogB0EIaikDADcDACAEIAcpAwA3AzAgBEGIAWogA0HYG2opAwA3AwAgBEGAAWogA0HQG2opAwA3AwAgBEH4AGogA0HIG2opAwA3AwAgBEHwAGogA0HAG2opAwA3AwAgBEHoAGogA0G4G2opAwA3AwAgBCADKQOwGzcDYCAEQbgBaiAIQShqKQMANwMAIARBsAFqIAhBIGopAwA3AwAgBEGoAWogCEEYaikDADcDACAEQaABaiAIQRBqKQMANwMAIARBmAFqIAhBCGopAwA3AwAgBCAIKQMANwOQASAEQegBaiADQYgcaikDADcDACAEQeABaiADQYAcaikDADcDACAEQdgBaiADQfgbaikDADcDACAEQdABaiADQfAbaikDADcDACAEQcgBaiADQegbaikDADcDACAEIAMpA+AbNwPAASAEQZgCaiAGQShqKQMANwMAIARBkAJqIAZBIGopAwA3AwAgBEGIAmogBkEYaikDADcDACAEQYACaiAGQRBqKQMANwMAIARB+AFqIAZBCGopAwA3AwAgBCAGKQMANwPwASAEQcgCaiADQbgcaikDADcDACAEQcACaiADQbAcaikDADcDACAEQbgCaiADQagcaikDADcDACAEQbACaiADQaAcaikDADcDACAEQagCaiADQZgcaikDADcDACAEIAMpA5AcNwOgAiAEQfgCaiAJQShqKQMANwMAIARB8AJqIAlBIGopAwA3AwAgBEHoAmogCUEYaikDADcDACAEQeACaiAJQRBqKQMANwMAIARB2AJqIAlBCGopAwA3AwAgBCAJKQMANwPQAiAEQagDaiADQegcaikDADcDACAEQaADaiADQeAcaikDADcDACAEQZgDaiADQdgcaikDADcDACAEQZADaiADQdAcaikDADcDACAEQYgDaiADQcgcaikDADcDACAEIAMpA8AcNwOAAyAEQdgDaiAKQShqKQMANwMAIARB0ANqIApBIGopAwA3AwAgBEHIA2ogCkEYaikDADcDACAEQcADaiAKQRBqKQMANwMAIARBuANqIApBCGopAwA3AwAgBCAKKQMANwOwAwwFC0EIQcAEEP8EAAsgEULX2a6a5PbpjcsAVg0AAkAgEULX2a6a5PbpjcsAUgRAIA0hDyAOIRQgECETIBEhFQwBCyAQQr+llJzP8NK75ABWDQFC19mumuT26Y3LACEVIBBCv6WUnM/w0rvkAFIEQCANIQ8gDiEUIBAhEwwBCyAOQqTsw7WP1LSY5wBWDQFCv6WUnM/w0rvkACETIA5CpOzDtY/UtJjnAFIEQCANIQ8gDiEUDAELIA1C///Piuv//9UeVg0BQqTsw7WP1LSY5wAhFCANQv//z4rr///VHlIEQCANIQ8MAQtC///Piuv//9UeIQ8gFkKq1f7///+//7l/Vg0BC0Kazf/Lo73EgBohEgwBCyANQv//z4rr///VHn0iFCAWQqvV/v///7//uX9UrSITfSEPIA5CpOzDtY/UtJjnAH0iFSANQv//z4rr///VHlQgEyAUVnKtIg19IRQgEEK/pZScz/DSu+QAfSIaIA5CpOzDtY/UtJjnAFQgDSAVVnKtIg19IRMgEULX2a6a5PbpjcsAfSIOIBBCv6WUnM/w0rvkAFQgDSAaVnKtIg19IRUgEiARQtfZrprk9umNywBUIA0gDlZyrX1Cms3/y6O9xIAafSESIBZC1aqBgICAwIDGAHwhFgsgAyAWNwOIFSADIA83A4AVIAMgFDcD+BQgAyATNwPwFCADIBU3A+gUIAMgEjcD4BQgA0GQHGogASADQeAUahC9AiABQegBaiEGIAFBwAFqIQhBACEFQgAhEkIAIRFCACEQQgAhDkIAIQ1CACEWA0AgA0HAAmogBSAGaikDACIPQgAgHEIAEMkDIANB0AJqIA9CACAXQgAQyQMgA0HgAmogD0IAIBhCABDJAyADQfACaiAPQgAgGUIAEMkDIANBgANqIA9CACAbQgAQyQMgA0GQA2ogD0IAIB1CABDJAyADQbACaiADKQPAAiIVIBZ8IhRCAEIAQv3/8//P///5iX8QyQMgA0GgAmogAykDuAIiD0IAQqvV/v///7//uX9CABDJAyADQZACaiAPQgBC///Piuv//9UeQgAQyQMgA0GAAmogD0IAQqTsw7WP1LSY5wBCABDJAyADQfABaiAPQgBCv6WUnM/w0rvkAEIAEMkDIANB4AFqIA9CAELX2a6a5PbpjcsAQgAQyQMgA0HQAWogD0IAQprN/8ujvcSAGkIAEMkDIAMpA9gBIBIgAykDkAMiGnwiDyADKQOIAyARIAMpA4ADIhJ8IhMgElStfCATIAMpA/gCIAMpA/ACIhEgEHwiECARVK18IBAgAykD6AIgAykD4AIiESAOfCIOIBFUrXwgDiADKQPYAiADKQPQAiIRIA18Ig0gEVStfCANIAMpA8gCIBQgFVStfHwiEiANVK18fCINIA5UrXx8Ig4gEFStfHwiECATVK18fCITIAMpA9ABfCIVIBNUrXwgFSAVIAMpA+gBIBAgECADKQPgAXwiEVatfCARIBEgAykD+AEgDiAOIAMpA/ABfCIQVq18IBAgECADKQOIAiANIA0gAykDgAJ8Ig5WrXwgDiAOIAMpA5gCIBIgAykDkAIiEnwiDSASVK18IA0gAykDqAIgFCADKQOgAiISfCASVK18fCIWIA1UrXx8Ig1WrXx8Ig5WrXx8IhBWrXx8IhFWrXwgDyATVq0gAykDmAMgDyAaVK18fHwhEiAFQQhrIgVBUEcNAAsgAUEwaiEFAkACQCASQprN/8ujvcSAGlYNACASQprN/8ujvcSAGlIEQCANIQ8gDiEUIBAhEyARIRUMAgsgEULX2a6a5PbpjcsAVg0AAkAgEULX2a6a5PbpjcsAUgRAIA0hDyAOIRQgECETIBEhFQwBCyAQQr+llJzP8NK75ABWDQFC19mumuT26Y3LACEVIBBCv6WUnM/w0rvkAFIEQCANIQ8gDiEUIBAhEwwBCyAOQqTsw7WP1LSY5wBWDQFCv6WUnM/w0rvkACETIA5CpOzDtY/UtJjnAFIEQCANIQ8gDiEUDAELIA1C///Piuv//9UeVg0BQqTsw7WP1LSY5wAhFCANQv//z4rr///VHlIEQCANIQ8MAQtC///Piuv//9UeIQ8gFkKq1f7///+//7l/Vg0BC0Kazf/Lo73EgBohEgwBCyANQv//z4rr///VHn0iFCAWQqvV/v///7//uX9UrSITfSEPIA5CpOzDtY/UtJjnAH0iFSANQv//z4rr///VHlQgEyAUVnKtIg19IRQgEEK/pZScz/DSu+QAfSIaIA5CpOzDtY/UtJjnAFQgDSAVVnKtIg19IRMgEULX2a6a5PbpjcsAfSIOIBBCv6WUnM/w0rvkAFQgDSAaVnKtIg19IRUgEiARQtfZrprk9umNywBUIA0gDlZyrX1Cms3/y6O9xIAafSESIBZC1aqBgICAwIDGAHwhFgsgAyAWNwOIFSADIA83A4AVIAMgFDcD+BQgAyATNwPwFCADIBU3A+gUIAMgEjcD4BQgA0HAHGogBSADQeAUahC9AiABQZgCaiEJIAFB8AFqIQZBACEFQgAhEkIAIRFCACEQQgAhDkIAIQ1CACEWA0AgA0HwAGogBSAJaikDACIPQgAgHEIAEMkDIANBgAFqIA9CACAXQgAQyQMgA0GQAWogD0IAIBhCABDJAyADQaABaiAPQgAgGUIAEMkDIANBsAFqIA9CACAbQgAQyQMgA0HAAWogD0IAIB1CABDJAyADQeAAaiADKQNwIhUgFnwiFEIAQgBC/f/z/8////mJfxDJAyADQdAAaiADKQNoIg9CAEKr1f7///+//7l/QgAQyQMgA0FAayAPQgBC///Piuv//9UeQgAQyQMgA0EwaiAPQgBCpOzDtY/UtJjnAEIAEMkDIANBIGogD0IAQr+llJzP8NK75ABCABDJAyADQRBqIA9CAELX2a6a5PbpjcsAQgAQyQMgAyAPQgBCms3/y6O9xIAaQgAQyQMgAykDCCASIAMpA8ABIhp8Ig8gAykDuAEgESADKQOwASISfCITIBJUrXwgEyADKQOoASADKQOgASIRIBB8IhAgEVStfCAQIAMpA5gBIAMpA5ABIhEgDnwiDiARVK18IA4gAykDiAEgAykDgAEiESANfCINIBFUrXwgDSADKQN4IBQgFVStfHwiEiANVK18fCINIA5UrXx8Ig4gEFStfHwiECATVK18fCITIAMpAwB8IhUgE1StfCAVIBUgAykDGCAQIBAgAykDEHwiEVatfCARIBEgAykDKCAOIA4gAykDIHwiEFatfCAQIBAgAykDOCANIA0gAykDMHwiDlatfCAOIA4gAykDSCASIAMpA0AiEnwiDSASVK18IA0gAykDWCAUIAMpA1AiEnwgElStfHwiFiANVK18fCINVq18fCIOVq18fCIQVq18fCIRVq18IA8gE1atIAMpA8gBIA8gGlStfHx8IRIgBUEIayIFQVBHDQALIAFB4ABqIQECQAJAIBJCms3/y6O9xIAaVg0AIBJCms3/y6O9xIAaUgRAIA0hFyAOIRggECEZIBEhGwwCCyARQtfZrprk9umNywBWDQACQCARQtfZrprk9umNywBSBEAgDSEXIA4hGCAQIRkgESEbDAELIBBCv6WUnM/w0rvkAFYNAULX2a6a5PbpjcsAIRsgEEK/pZScz/DSu+QAUgRAIA0hFyAOIRggECEZDAELIA5CpOzDtY/UtJjnAFYNAUK/pZScz/DSu+QAIRkgDkKk7MO1j9S0mOcAUgRAIA0hFyAOIRgMAQsgDUL//8+K6///1R5WDQFCpOzDtY/UtJjnACEYIA1C///Piuv//9UeUgRAIA0hFwwBC0L//8+K6///1R4hFyAWQqrV/v///7//uX9WDQELQprN/8ujvcSAGiESDAELIA1C///Piuv//9UefSIPIBZCq9X+////v/+5f1StIhR9IRcgDkKk7MO1j9S0mOcAfSITIA1C///Piuv//9UeVCAPIBRUcq0iDX0hGCAQQr+llJzP8NK75AB9Ig8gDkKk7MO1j9S0mOcAVCANIBNWcq0iDX0hGSARQtfZrprk9umNywB9Ig4gEEK/pZScz/DSu+QAVCANIA9Wcq0iDX0hGyASIBFC19mumuT26Y3LAFQgDSAOVnKtfUKazf/Lo73EgBp9IRIgFkLVqoGAgIDAgMYAfCEWCyADIBY3A4gVIAMgFzcDgBUgAyAYNwP4FCADIBk3A/AUIAMgGzcD6BQgAyASNwPgFCAEQcABaiABIANB4BRqEL0CIAQgAykDkBw3AwAgBEEIaiADQZgcaikDADcDACAEQRBqIANBoBxqKQMANwMAIARBGGogA0GoHGopAwA3AwAgBEEgaiADQbAcaikDADcDACAEQShqIANBuBxqKQMANwMAIARBmAJqIAZBKGopAwA3AwAgBEGQAmogBkEgaikDADcDACAEQYgCaiAGQRhqKQMANwMAIARBgAJqIAZBEGopAwA3AwAgBEH4AWogBkEIaikDADcDACAEIAYpAwA3A/ABIARB2ABqIAdBKGopAwA3AwAgBEHQAGogB0EgaikDADcDACAEQcgAaiAHQRhqKQMANwMAIARBQGsgB0EQaikDADcDACAEQThqIAdBCGopAwA3AwAgBCAHKQMANwMwIARBiAFqIANB6BxqKQMANwMAIARBgAFqIANB4BxqKQMANwMAIARB+ABqIANB2BxqKQMANwMAIARB8ABqIANB0BxqKQMANwMAIARB6ABqIANByBxqKQMANwMAIAQgAykDwBw3A2AgBEG4AWogCEEoaikDADcDACAEQbABaiAIQSBqKQMANwMAIARBqAFqIAhBGGopAwA3AwAgBEGgAWogCEEQaikDADcDACAEQZgBaiAIQQhqKQMANwMAIAQgCCkDADcDkAEMAQtBCEGgAhD/BAALIAAgAjYCCCAAIAQ2AgQgACACNgIAIANB8BxqJAALpocBAgp/G34jAEHwHGsiAyQAIAMgAjYC3BQgA0EMNgLYFAJAAkAgAkEMRgRAIANB4BRqECYgA0HwE2ogAykD8BciDUIAQsau0OHB5sfvdEIAEMkDIANB4BNqIAMpA/ATQn6DIhRCAEIAQv3/8//P///5iX8QyQMgA0HQE2ogAykD6BMiDkIAQqvV/v///7//uX9CABDJAyADQcATaiAOQgBC///Piuv//9UeQgAQyQMgA0HAEmogDkIAQqTsw7WP1LSY5wBCABDJAyADQcARaiAOQgBCv6WUnM/w0rvkAEIAEMkDIANBwBBqIA5CAELX2a6a5PbpjcsAQgAQyQMgA0HAD2ogDkIAQprN/8ujvcSAGkIAEMkDIANBgBRqIA1CAELxicTO4NS5uwpCABDJAyADQbATaiADKQOAFCIQIAMpA8ATIhMgAykD+BN8Ig8gAykD2BMgAykD0BMiDiAUfCAOVK18fCIRfCIUQgBCAEL9//P/z///+Yl/EMkDIANBoBNqIAMpA7gTIg5CAEKr1f7///+//7l/QgAQyQMgA0GQE2ogDkIAQv//z4rr///VHkIAEMkDIANBgBNqIA5CAEKk7MO1j9S0mOcAQgAQyQMgA0HwEmogDkIAQr+llJzP8NK75ABCABDJAyADQeASaiAOQgBC19mumuT26Y3LAEIAEMkDIANB0BJqIA5CAEKazf/Lo73EgBpCABDJAyADQZAUaiAN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A0HwCGogAykDgAkiFSAWfCIUQgBCAEL9//P/z///+Yl/EMkDIANB4AhqIAMpA/gIIg9CAEKr1f7///+//7l/QgAQyQMgA0HQCGogD0IAQv//z4rr///VHkIAEMkDIANBwAhqIA9CAEKk7MO1j9S0mOcAQgAQyQMgA0GwCGogD0IAQr+llJzP8NK75ABCABDJAyADQaAIaiAPQgBC19mumuT26Y3LAEIAEMkDIANBkAhqIA9CAEKazf/Lo73EgBpCABDJAyADKQOYCCASIAMpA9AJIhp8Ig8gAykDyAkgESADKQPACSISfCITIBJUrXwgEyADKQO4CSADKQOwCSIRIBB8IhAgEVStfCAQIAMpA6gJIAMpA6AJIhEgDnwiDiARVK18IA4gAykDmAkgAykDkAkiESANfCINIBFUrXwgDSADKQOICSAUIBVUrXx8IhIgDVStfHwiDSAOVK18fCIOIBBUrXx8IhAgE1StfHwiEyADKQOQCHwiFSATVK18IBUgFSADKQOoCCAQIBAgAykDoAh8IhFWrXwgESARIAMpA7gIIA4gDiADKQOwCHwiEFatfCAQIBAgAykDyAggDSANIAMpA8AIfCIOVq18IA4gDiADKQPYCCASIAMpA9AIIhJ8Ig0gElStfCANIAMpA+gIIBQgAykD4AgiEnwgElStfHwiFiANVK18fCINVq18fCIOVq18fCIQVq18fCIRVq18IA8gE1atIAMpA9gJIA8gGlStfHx8IRIgBUEIayIFQVBHDQALIAFBgANqIQUCQAJAIBJCms3/y6O9xIAaVg0AIBJCms3/y6O9xIAaUgRAIA0hDyAOIRQgECETIBEhFQwCCyARQtfZrprk9umNywBWDQACQCARQtfZrprk9umNywBSBEAgDSEPIA4hFCAQIRMgESEVDAELIBBCv6WUnM/w0rvkAFYNAULX2a6a5PbpjcsAIRUgEEK/pZScz/DSu+QAUgRAIA0hDyAOIRQgECETDAELIA5CpOzDtY/UtJjnAFYNAUK/pZScz/DSu+QAIRMgDkKk7MO1j9S0mOcAUgRAIA0hDyAOIRQMAQsgDUL//8+K6///1R5WDQFCpOzDtY/UtJjnACEUIA1C///Piuv//9UeUgRAIA0hDwwBC0L//8+K6///1R4hDyAWQqrV/v///7//uX9WDQELQprN/8ujvcSAGiES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1f7///+//7l/VK0iFH0hFyAOQqTsw7WP1LSY5wB9IhMgDUL//8+K6///1R5UIA8gFFRyrSINfSEYIBBCv6WUnM/w0rvkAH0iDyAOQqTsw7WP1LSY5wBUIA0gE1ZyrSINfSEZIBFC19mumuT26Y3LAH0iDiAQQr+llJzP8NK75ABUIA0gD1ZyrSINfSEbIBIgEULX2a6a5PbpjcsAVCANIA5Wcq19QprN/8ujvcSAGn0hEiAWQtWqgYCAgMCAxgB8IRYLIAMgFjcDiBUgAyAXNwOAFSADIBg3A/gUIAMgGTcD8BQgAyAbNwPoFCADIBI3A+AUIARB8AFqIAEgA0HgFGoQgwIgBEHIAmogB0EoaikDADcDACAEQcACaiAHQSBqKQMANwMAIARBuAJqIAdBGGopAwA3AwAgBEGwAmogB0EQaikDADcDACAEQagCaiAHQQhqKQMANwMAIAQgBykDADcDoAIgBCAIKQMANwPQAiAEQdgCaiAIQQhqKQMANwMAIARB4AJqIAhBEGopAwA3AwAgBEHoAmogCEEYaikDADcDACAEQfACaiAIQSBqKQMANwMAIARB+AJqIAhBKGopAwA3AwAgBEGoA2ogBkEoaikDADcDACAEQaADaiAGQSBqKQMANwMAIARBmANqIAZBGGopAwA3AwAgBEGQA2ogBkEQaikDADcDACAEQYgDaiAGQQhqKQMANwMAIAQgBikDADcDgAMgBEHYA2ogCUEoaikDADcDACAEQdADaiAJQSBqKQMANwMAIARByANqIAlBGGopAwA3AwAgBEHAA2ogCUEQaikDADcDACAEQbgDaiAJQQhqKQMANwMAIAQgCSkDADcDsAMgBEGIBGogCkEoaikDADcDACAEQYAEaiAKQSBqKQMANwMAIARB+ANqIApBGGopAwA3AwAgBEHwA2ogCkEQaikDADcDACAEQegDaiAKQQhqKQMANwMAIAQgCikDADcD4AMgBEG4BGogC0EoaikDADcDACAEQbAEaiALQSBqKQMANwMAIARBqARqIAtBGGopAwA3AwAgBEGgBGogC0EQaikDADcDACAEQZgEaiALQQhqKQMANwMAIAQgCykDADcDkAQgBEEoaiADQagbaikDADcDACAEQSBqIANBoBtqKQMANwMAIARBGGogA0GYG2opAwA3AwAgBEEQaiADQZAbaikDADcDACAEQQhqIANBiBtqKQMANwMAIAQgAykDgBs3AwAgBEHYAGogA0HYG2opAwA3AwAgBEHQAGogA0HQG2opAwA3AwAgBEHIAGogA0HIG2opAwA3AwAgBEFAayADQcAbaikDADcDACAEQThqIANBuBtqKQMANwMAIAQgAykDsBs3AzAgBEGIAWogA0GIHGopAwA3AwAgBEGAAWogA0GAHGopAwA3AwAgBEH4AGogA0H4G2opAwA3AwAgBEHwAGogA0HwG2opAwA3AwAgBEHoAGogA0HoG2opAwA3AwAgBCADKQPgGzcDYCAEQbgBaiADQbgcaikDADcDACAEQbABaiADQbAcaikDADcDACAEQagBaiADQagcaikDADcDACAEQaABaiADQaAcaikDADcDACAEQZgBaiADQZgcaikDADcDACAEIAMpA5AcNwOQASAEQegBaiADQegcaikDADcDACAEQeABaiADQeAcaikDADcDACAEQdgBaiADQdgcaikDADcDACAEQdABaiADQdAcaikDADcDACAEQcgBaiADQcgcaikDADcDACAEIAMpA8AcNwPAAQwFC0EIQcAEEP8EAAsgEULX2a6a5PbpjcsAVg0AAkAgEULX2a6a5PbpjcsAUgRAIA0hDyAOIRQgECETIBEhFQwBCyAQQr+llJzP8NK75ABWDQFC19mumuT26Y3LACEVIBBCv6WUnM/w0rvkAFIEQCANIQ8gDiEUIBAhEwwBCyAOQqTsw7WP1LSY5wBWDQFCv6WUnM/w0rvkACETIA5CpOzDtY/UtJjnAFIEQCANIQ8gDiEUDAELIA1C///Piuv//9UeVg0BQqTsw7WP1LSY5wAhFCANQv//z4rr///VHlIEQCANIQ8MAQtC///Piuv//9UeIQ8gFkKq1f7///+//7l/Vg0BC0Kazf/Lo73EgBohEgwBCyANQv//z4rr///VHn0iFCAWQqvV/v///7//uX9UrSITfSEPIA5CpOzDtY/UtJjnAH0iFSANQv//z4rr///VHlQgEyAUVnKtIg19IRQgEEK/pZScz/DSu+QAfSIaIA5CpOzDtY/UtJjnAFQgDSAVVnKtIg19IRMgEULX2a6a5PbpjcsAfSIOIBBCv6WUnM/w0rvkAFQgDSAaVnKtIg19IRUgEiARQtfZrprk9umNywBUIA0gDlZyrX1Cms3/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GDcD+BQgAyAZNwPwFCADIBs3A+gUIAMgEjcD4BQgBEHgAGogASADQeAUahCDAiAEQbgBaiAHQShqKQMANwMAIARBsAFqIAdBIGopAwA3AwAgBEGoAWogB0EYaikDADcDACAEQaABaiAHQRBqKQMANwMAIARBmAFqIAdBCGopAwA3AwAgBCAHKQMANwOQASAEIAgpAwA3A8ABIARByAFqIAhBCGopAwA3AwAgBEHQAWogCEEQaikDADcDACAEQdgBaiAIQRhqKQMANwMAIARB4AFqIAhBIGopAwA3AwAgBEHoAWogCEEoaikDADcDACAEQZgCaiAGQShqKQMANwMAIARBkAJqIAZBIGopAwA3AwAgBEGIAmogBkEYaikDADcDACAEQYACaiAGQRBqKQMANwMAIARB+AFqIAZBCGopAwA3AwAgBCAGKQMANwPwASAEQShqIANBuBxqKQMANwMAIARBIGogA0GwHGopAwA3AwAgBEEYaiADQagcaikDADcDACAEQRBqIANBoBxqKQMANwMAIARBCGogA0GYHGopAwA3AwAgBCADKQOQHDcDACAEQdgAaiADQegcaikDADcDACAEQdAAaiADQeAcaikDADcDACAEQcgAaiADQdgcaikDADcDACAEQUBrIANB0BxqKQMANwMAIARBOGogA0HIHGopAwA3AwAgBCADKQPAHDcDMAwBC0EIQaACEP8EAAsgACACNgIIIAAgBDYCBCAAIAI2AgAgA0HwHGokAAvnagIRfxV+IwBBgBFrIgQkACAEQQA2AowPIARCgICAgIABNwKEDyACrUIwfiIVpyEJAkACQAJAAkAgFUIgiKcgCUH4////B0tyDQACQCAJRQRAQQghBwwBC0HRzsUALQAAGkEIIQUgCUEIENYEIgdFDQEgAkUNAEEAIQUgAiEGA0AgBSAJRg0BIAUgB2oiDSABIAVqIgspAwA3AwAgDUEoaiALQShqKQMANwMAIA1BIGogC0EgaikDADcDACANQRhqIAtBGGopAwA3AwAgDUEQaiALQRBqKQMANwMAIA1BCGogC0EIaikDADcDACAFQTBqIQUgBkEBayIGDQALCyAEIAI2AowPIAQgBzYCiA8gBCACNgKEDyADRQRAIAQoAoQPIQMgAgRAIAJBMGwhBiAHIQEDQCAEQcAPaiABQShqKQMAIhU3AwAg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A/AOIiRCP4iEfCIgICFUrXwgICAgIAMpA+gPIiEgJEIBhnwiJCAhVK18IiBWrXwiISAOQgGGIBBCP4iEfCIfICFUrXwiHlatfCIQIBFCAYYgE0I/iIR8IiEgEFStfCIRIB1UrXwiECAVQgGGIA1CP4iEfCINIBBUrXwiDiAWVK18IhAgD0IBhiASQj+IhHwiEiAQVK18IhAgFFStfHwhEyADKQOIDyADKQOYDyADKQOoDyADKQO4DyADKQPIDyADKQPYDyADKQPQDyIPICNCfYN8IA9UrXwiFSADKQPAD3wiDyAVVK18IA8gJHwiFSAPVK18IhQgAykDsA98Ig8gFFStfCAPICB8IhQgD1StfCIWIAMpA6APfCIPIBZUrXwgDyAffCIWIA9UrXwiHSADKQOQD3wiDyAdVK18IA8gHnwiHSAPVK18Ih4gAykDgA98Ig8gHlStfCAPICF8Ih4gD1StfCIPUA0FIA8gEXwiESAPVCIERQ0FIAStIg8gDXwiDSAPWg0FIA0gD1StIg8gDnwiDiAPWg0FIA4gD1StIg8gEnwiEiAPWg0FIA8gElatIg8gEHwiECAPWg0FIA8gEFatIg8gE3wiEyAPVAwGC0Hs9sEAEOgEAAtBgPbBAEEzQdz2wQAQ/gMACyAAIAIpAzA3AzAgACACKQMANwMAIABB2ABqIAJB2ABqKQMANwMAIABB0ABqIAJB0ABqKQMANwMAIABByABqIAJByABqKQMANwMAIABBQGsgAkFAaykDADcDACAAQThqIAJBOGopAwA3AwAgAEEIaiACQQhqKQMANwMAIABBEGogAkEQaikDADcDACAAQRhqIAJBGGopAwA3AwAgAEEgaiACQSBqKQMANwMAIABBKGogAkEoaikDADcDAAwGCyAAIAEpAzA3AzAgACABKQMANwMAIABB2ABqIAFB2ABqKQMANwMAIABB0ABqIAFB0ABqKQMANwMAIABByABqIAFByABqKQMANwMAIABBQGsgAUFAaykDADcDACAAQThqIAFBOGopAwA3AwAgAEEIaiABQQhqKQMANwMAIABBEGogAUEQaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBKGogAUEoaikDADcDAAwFC0Kk7MO1j9S0mOcAIAEpA0giECACKQNIIhN9Ig4gASkD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IAIpAwghDSABKQMQIRggASkDGCEZIAIpAxghDiABKQMgIRogAikDICESIAEpAyghFyACKQMoIREgAikDEAshECASIBp9IhUgESAXVK0iFH0hEyAOIBl9IhYgEiAaVCAUIBVWcq0iFX0hEiAQIBh9IhQgDiAZVCAVIBZWcq0iFX0hDiANIBt9IhYgFCAVVCAQIBhUcq0iFX0hECANIBtUIBUgFlZyIQQgDyAcfSEUIBEgF30MAQtCpOzDtY/UtJjnACABKQMYIhkgAikDGCIQfSITIAEpAyAiGiACKQMgIg5UIBogDn0iDiABKQMoIhcgAikDKCISVK0iDVRyrSIRfSIVfSIUIA4gDX0iDkL//8+K6///1R5WQv//z4rr///VHiAOfSINIBcgEn0iFkKr1f7///+//7l/Vq0iHVRyrSIOfSESQr+llJzP8NK75AAgASkDECIYIAIpAxAiHn0iICAQIBlWIBEgE1ZyrSIQfSITfSIRIA4gFFYgFUKk7MO1j9S0mOcAVnKtIhV9IQ5C19mumuT26Y3LACABKQMIIhsgAikDCCIUfSIjIBggHlQgECAgVnKtIh59IiB9IiEgESAVVCATQr+llJzP8NK75ABWcq0iE30hECATICFWICBC19mumuT26Y3LAFZyIQQgDSAdfSETIBQgG1YgHiAjVnKtIA8gHH18QprN/8ujvcSAGnwhFEKr1f7///+//7l/IBZ9CzcD2BAgAyATNwPQECADIBI3A8gQIAMgDjcDwBAgAyAQNwO4ECADIBQgBK19NwOwECADQfgPaiADQcAYaiADQbAQahBMCyADKAL4DwRAIAMgAykDiBA3A7gQIAMgAykDgBA3A7AQQYz3wQBBKyADQbAQakH89sEAQbj3wQAQygMACyADQeAGaiADKQOgECIdQgAgAykDqBAiHkIAEMkDIANB0AZqIAMpA5gQIiBCACAeQgAQyQMgA0HABmogAykDkBAiI0IAIB5CABDJAyADQbAGaiADKQOIECIhQgAgHkIAEMkDIANBoAZqIAMpA4AQIiRCACAeQgAQyQMgA0GwB2ogIEIAIB1CABDJAyADQaAHaiAjQgAgHUIAEMkDIANBkAdqICFCACAdQgAQyQMgA0GAB2ogJEIAIB1CABDJAyADQfAHaiAjQgAgIEIAEMkDIANB4AdqICFCACAgQgAQyQMgA0HQB2ogJEIAICBCABDJAyADQaAIaiAhQgAgI0IAEMkDIANBkAhqICRCACAjQgAQyQMgA0HACGogJEIAICFCABDJAyADQZAGaiAeQgAgHkIAEMkDIANB8AZqIB1CACAdQgAQyQMgA0HAB2ogIEIAICBCABDJAyADQYAIaiAjQgAgI0IAEMkDIANBsAhqICFCACAhQgAQyQMgA0HQCGogJEIAICRCABDJAyADQYAGaiADKQOQBiIoQv3/8//P///5iX9+IhBCAEKr1f7///+//7l/QgAQyQMgA0HwBWogEEIAQv//z4rr///VHkIAEMkDIANB4AVqIBBCAEKk7MO1j9S0mOcAQgAQyQMgA0HQBWogEEIAQr+llJzP8NK75ABCABDJAyADQcAFaiAQQgBC19mumuT26Y3LAEIAEMkDIANBsAVqIBBCAEKazf/Lo73EgBpCABDJAyADKQPICCADKQOYCCADKQOoCCADKQPoByADKQP4ByADKQOoByADKQO4ByADKQPYBiADKQPoBiITIAMpA9AGfCIQIBNUrXwiEiADKQPABnwiEyADKQOwB3wiDiATVK18Ig0gAykDyAYgEiATVq18IhIgAykDsAZ8IhF8IhMgDVStfCATIBMgAykDoAd8IhNWrXwiDyADKQO4BiARIBJUrXwiFSADKQOgBnwiFHwiEiADKQOQB3wiDSADKQPwB3wiESANVK18IhYgDSASVK0gAykDmAcgDyASVq18fCIPIAMpA6gGIBQgFVStfHwiEiADKQOAB3wiFXwiDSAWVK18IA0gDSADKQPgB3wiDVatfCIUIBIgFVatIAMpA4gHIA8gElatfHx8IhIgAykD0Ad8Ig8gAykDoAh8IhUgD1StfCIWIA8gElStIAMpA9gHIBIgFFStfHx8IhIgFlStfCASIBIgAykDkAh8IhJWrXwiDyADKQPACHwiFCAPVK18Ig9CP4ggAykD2AggAykD0AgiHyAPQgGGIBRCP4iEfCIWIB9UrXwgFiADKQO4CCADKQOwCCIPIBJCAYYgFUI/iIR8Ih8gD1StfCAfIAMpA4gIIAMpA4AIIiIgDUIBhiARQj+IhHwiDyAiVK18IA8gDyADKQPIByADKQPAByImIBNCAYYgDkI/iIR8IiIgJlStfCAiICIgAykD+AYgAykD8AYiJSAQQgGGIAMpA+AGIidCP4iEfCImICVUrXwgJiAmIAMpA5gGIiUgJ0IBhnwiJyAlVK18IiZWrXwiJSAOQgGGIBBCP4iEfCIpICVUrXwiIlatfCIQIBFCAYYgE0I/iIR8IiUgEFStfCIPVq18IhAgFUIBhiANQj+IhHwiESAQVK18Ig4gH1StfCIQIBRCAYYgEkI/iIR8IhMgEFStfCIQIBZUrXx8IRJBACEIAn8CQCADKQO4BSADKQPIBSADKQPYBSADKQPoBSADKQP4BSADKQOIBiAoIAMpA4AGIg18IA1UrXwiFSADKQPwBXwiDSAVVK18IA0gJ3wiFSANVK18IhQgAykD4AV8Ig0gFFStfCANICZ8IhQgDVStfCIWIAMpA9AFfCINIBZUrXwgDSApfCIWIA1UrXwiHyADKQPABXwiDSAfVK18IA0gInwiHyANVK18IiIgAykDsAV8Ig0gIlStfCANICV8IiIgDVStfCINUA0AIA0gD3wiDyANVCIERQ0AIAStIg0gEXwiESANWg0AIA0gEVatIg0gDnwiDiANWg0AIA0gDlatIg0gE3wiEyANWg0AIA0gE1atIg0gEHwiECANWg0AIA0gEFatIg0gEnwiEiANVAwBC0EACyEHIANBoAVqIBVC/f/z/8////mJf34iDUIAQqvV/v///7//uX9CABDJAyADQZAFaiANQgBC///Piuv//9UeQgAQyQMgA0GABWogDUIAQqTsw7WP1LSY5wBCABDJAyADQfAEaiANQgBCv6WUnM/w0rvkAEIAEMkDIANB4ARqIA1CAELX2a6a5PbpjcsAQgAQyQMgA0HQBGogDUIAQprN/8ujvcSAGkIAEMkDAkAgAykD2AQgAykD6AQgAykD+AQgAykDiAUgAykDmAUgAykDqAUgAykDoAUiDSAVfCANVK18IhUgAykDkAV8Ig0gFVStfCANIBR8IhUgDVStfCIUIAMpA4AFfCINIBRUrXwgDSAWfCIUIA1UrXwiFiADKQPwBHwiDSAWVK18IA0gH3wiFiANVK18Ih8gAykD4AR8Ig0gH1StfCANICJ8Ih8gDVStfCIiIAMpA9AEfCINICJUrXwgDSAPfCIiIA1UrXwiDVANACANIBF8IhEgDVoNACANIBFWrSINIA58Ig4gDVoNACANIA5WrSINIBN8IhMgDVoNACANIBNWrSINIBB8IhAgDVoNACANIBBWrSINIBJ8IhIgDVQhCAsgA0HABGogFUL9//P/z///+Yl/fiINQgBCq9X+////v/+5f0IAEMkDIANBsARqIA1CAEL//8+K6///1R5CABDJAyADQaAEaiANQgBCpOzDtY/UtJjnAEIAEMkDIANBkARqIA1CAEK/pZScz/DSu+QAQgAQyQMgA0GABGogDUIAQtfZrprk9umNywBCABDJAyADQfADaiANQgBCms3/y6O9xIAaQgAQyQNBACEGAn9BACADKQP4AyADKQOIBCADKQOYBCADKQOoBCADKQO4BCADKQPIBCADKQPABCINIBV8IA1UrXwiDyADKQOwBHwiDSAPVK18IA0gFHwiDyANVK18IhUgAykDoAR8Ig0gFVStfCANIBZ8IhUgDVStfCIUIAMpA5AEfCINIBRUrXwgDSAffCIUIA1UrXwiFiADKQOABHwiDSAWVK18IA0gInwiFiANVK18Ih8gAykD8AN8Ig0gH1StfCANIBF8Ih8gDVStfCINUA0AGkEAIA0gDSAOfCIOWA0AGkEAIA0gDlatIg0gE3wiEyANWg0AGkEAIA0gE1atIg0gEHwiECANWg0AGiANIBBWrSINIBJ8IhIgDVQLIQQgA0HgA2ogD0L9//P/z///+Yl/fiINQgBCq9X+////v/+5f0IAEMkDIANB0ANqIA1CAEL//8+K6///1R5CABDJAyADQcADaiANQgBCpOzDtY/UtJjnAEIAEMkDIANBsANqIA1CAEK/pZScz/DSu+QAQgAQyQMgA0GgA2ogDUIAQtfZrprk9umNywBCABDJAyADQZADaiANQgBCms3/y6O9xIAaQgAQyQMCQCADKQOYAyADKQOoAyADKQO4AyADKQPIAyADKQPYAyADKQPoAyADKQPgAyINIA98IA1UrXwiESADKQPQA3wiDSARVK18IA0gDSAVfCINVq18Ig8gAykDwAN8IhEgD1StfCARIBR8Ig8gEVStfCIVIAMpA7ADfCIRIBVUrXwgESAWfCIVIBFUrXwiFCADKQOgA3wiESAUVK18IBEgH3wiFCARVK18IhYgAykDkAN8IhEgFlStfCARIA4gEXwiEVatfCIOUA0AIA4gE3wiEyAOWg0AIA4gE1atIg4gEHwiECAOWg0AIA4gEFatIg4gEnwiEiAOVCEGCyADQYADaiANQv3/8//P///5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IAVBqAlqKQMANwMAIAFBOGogBUG4CWopAwA3AwAgAUFAayAFQcAJaikDADcDACABQcgAaiAFQcgJaikDADcDACABQdAAaiAFQdAJaikDADcDACABQdgAaiAFQdgJaikDADcDACAAQQI2AgggACABNgIEIABBAjYCAAwICyACIAEpAwA3AwAgAiABKQMwNwMwIAJBKGogAUEoaikDADcDACACQSBqIAFBIGopAwA3AwAgAkEYaiABQRhqKQMANwMAIAJBEGogAUEQaikDADcDACACQQhqIgQgAUEIaikDADcDACACQThqIAFBOGopAwA3AwAgAkFAayABQUBrKQMANwMAIAJByABqIAFByABqKQMANwMAIAJB0ABqIAFB0ABqKQMANwMAIAJB2ABqIAFB2ABqKQMANwMAIAJBiAFqIAFBiAFqKQMANwMAIAJBgAFqIAFBgAFqKQMANwMAIAJB+ABqIAFB+ABqKQMANwMAIAJB8ABqIAFB8ABqKQMANwMAIAJB6ABqIAFB6ABqKQMANwMAIAIgASkDYDcDYCACIAEpA5ABNwOQASACQZgBaiABQZgBaikDADcDACACQaABaiABQaABaikDADcDACACQagBaiABQagBaikDADcDACACQbABaiABQbABaikDADcDACACQbgBaiABQbgBaikDADcDACACQegBaiABQegBaikDADcDACACQeABaiABQeABaikDADcDACACQdgBaiABQdgBaikDADcDACACQdABaiABQdABaikDADcDACACQcgBaiABQcgBaikDADcDACACIAEpA8ABNwPAASACQZgCaiABQZgCaikDADcDACACQZACaiABQZACaikDADcDACACQYgCaiABQYgCaikDADcDACACQYACaiABQYACaikDADcDACACQfgBaiABQfgBaikDADcDACACIAEpA/ABNwPwASACKQMAISogBUGoIGoiCSAEQZgC/AoAACACQaACEN8EIAVBmApqIAVB2CBqKQMANwMAIAVBoApqIAVB4CBqKQMANwMAIAVBqApqIAVB6CBqKQMANwMAIAVBsApqIAVB8CBqKQMANwMAIAVBuApqIAVB+CBqKQMANwMAIAVBkB5qIgsgBUGIIWopAwA3AwAgBUGYHmoiBiAFQZAhaikDADcDACAFQaAeaiIMIAVBmCFqKQMANwMA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IAVB4AlqIAoQuQIgBSkD6BshKiAFKQPwGyErIAVBuAJqIAhBkAL8CgAAIAUgKzcDsAIgBSAqNwOoAiABIAVBqAJqEKQBQdHOxQAtAAAaQaACQQgQ1gQiAUUNCSABIAUpA6ggNwMAIAEgBSkD2CA3AzAgAUEoaiAFQdAgaikDADcDACABQSBqIAVByCBqKQMANwMAIAFBGGogAikDADcDACABQRBqIAVBuCBqKQMANwMAIAFBCGogBUGwIGopAwA3AwAgAUE4aiAFQeAgaikDADcDACABQUBrIAVB6CBqKQMANwMAIAFByABqIAVB8CBqKQMANwMAIAFB0ABqIAVB+CBqKQMANwMAIAFB2ABqIAVBgCFqKQMANwMAIAFBiAFqIAVBsCFqKQMANwMAIAFBgAFqIAVBqCFqKQMANwMAIAFB+ABqIAVBoCFqKQMANwMAIAFB8ABqIAVBmCFqKQMANwMAIAFB6ABqIAVBkCFqKQMANwMAIAEgBSkDiCE3A2AgAUG4AWogBUHgIWopAwA3AwAgAUGwAWogBUHYIWopAwA3AwAgAUGoAWogBUHQIWopAwA3AwAgAUGgAWogBUHIIWopAwA3AwAgAUGYAWogBUHAIWopAwA3AwAgASAFKQO4ITcDkAEgAUHoAWogBUGQImopAwA3AwAgAUHgAWogBUGIImopAwA3AwAgAUHYAWogBUGAImopAwA3AwAgAUHQAWogBUH4IWopAwA3AwAgAUHIAWogBUHwIWopAwA3AwAgASAFKQPoITcDwAEgAUGYAmogBUHAImopAwA3AwAgAUGQAmogBUG4ImopAwA3AwAgAUGIAmogBUGwImopAwA3AwAgAUGAAmogBUGoImopAwA3AwAgAUH4AWogBUGgImopAwA3AwAgASAFKQOYIjcD8AEgAEEGNgIIIAAgATYCBCAAQQY2AgAMBwsgAiABKQMANwMAIAIgASkDMDcDMCACQShqIAFBKGopAwA3AwAgAkEgaiABQSBqKQMANwMAIAJBGGogAUEYaikDADcDACACQRBqIAFBEGopAwA3AwAgAkEIaiIEIAFBCGopAwA3AwAgAkE4aiABQThqKQMANwMAIAJBQGsgAUFAaykDADcDACACQcgAaiABQcgAaikDADcDACACQdAAaiABQdAAaikDADcDACACQdgAaiABQdgAaikDADcDACACQYgBaiABQYgBaikDADcDACACQYABaiABQYABaikDADcDACACQfgAaiABQfgAaikDADcDACACQfAAaiABQfAAaikDADcDACACQegAaiABQegAaikDADcDACACIAEpA2A3A2AgAiABKQOQATcDkAEgAkGYAWogAUGYAWopAwA3AwAgAkGgAWogAUGgAWopAwA3AwAgAkGoAWogAUGoAWopAwA3AwAgAkGwAWogAUGwAWopAwA3AwAgAkG4AWogAUG4AWopAwA3AwAgAkHoAWogAUHoAWopAwA3AwAgAkHgAWogAUHgAWopAwA3AwAgAkHYAWogAUHYAWopAwA3AwAgAkHQAWogAUHQAWopAwA3AwAgAkHIAWogAUHIAWopAwA3AwAgAiABKQPAATcDwAEgAkGYAmogAUGYAmopAwA3AwAgAkGQAmogAUGQAmopAwA3AwAgAkGIAmogAUGIAmopAwA3AwAgAkGAAmogAUGAAmopAwA3AwAgAkH4AWogAUH4AWopAwA3AwAgAiABKQPwATcD8AEgAkHIAmogAUHIAmopAwA3AwAgAkHAAmogAUHAAmopAwA3AwAgAkG4AmogAUG4AmopAwA3AwAgAkGwAmogAUGwAmopAwA3AwAgAkGoAmogAUGoAmopAwA3AwAgAiABKQOgAjcDoAIgAkH4AmogAUH4AmopAwA3AwAgAkHwAmogAUHwAmopAwA3AwAgAkHoAmogAUHoAmopAwA3AwAgAkHgAmogAUHgAmopAwA3AwAgAkHYAmogAUHYAmopAwA3AwAgAiABKQPQAjcD0AIgAkGoA2ogAUGoA2opAwA3AwAgAkGgA2ogAUGgA2opAwA3AwAgAkGYA2ogAUGYA2opAwA3AwAgAkGQA2ogAUGQA2opAwA3AwAgAkGIA2ogAUGIA2opAwA3AwAgAiABKQOAAzcDgAMgAkHYA2ogAUHYA2opAwA3AwAgAkHQA2ogAUHQA2opAwA3AwAgAkHIA2ogAUHIA2opAwA3AwAgAkHAA2ogAUHAA2opAwA3AwAgAkG4A2ogAUG4A2opAwA3AwAgAiABKQOwAzcDsAMgAkGIBGogAUGIBGopAwA3AwAgAkGABGogAUGABGopAwA3AwAgAkH4A2ogAUH4A2opAwA3AwAgAkHwA2ogAUHwA2opAwA3AwAgAkHoA2ogAUHoA2opAwA3AwAgAiABKQPgAzcD4AMgAkG4BGogAUG4BGopAwA3AwAgAkGwBGogAUGwBGopAwA3AwAgAkGoBGogAUGoBGopAwA3AwAgAkGgBGogAUGgBGopAwA3AwAgAkGYBGogAUGYBGopAwA3AwAgAiABKQOQBDcDkAQgAikDACEqIAVBqCBqIgkgBEG4BPwKAAAgAkHABBDfBCAFQdgOaiAFQdggaikDADcDACAFQeAOaiAFQeAgaikDADcDACAFQegOaiAFQeggaikDADcDACAFQfAOaiAFQfAgaikDADcDACAFQfgOaiAFQfggaikDADcDACAFQegSaiAFQYghaikDADcDACAFQfASaiAFQZAhaikDADcDACAFQfgSaiAFQZghaikDADcDACAFQYATaiAFQaAhaikDADcDACAFQYgTaiAFQaghaikDADcDACAFIAUpA9AgNwPQDiAFIAUpA4AhNwPgEiAFQbgTaiAFQdghaikDADcDACAFQbATaiAFQdAhaikDADcDACAFQagTaiAFQcghaikDADcDACAFQaATaiAFQcAhaikDADcDACAFQZgTaiAFQbghaikDADcDACAFQcgTaiAFQeghaikDADcDACAFQdATaiAFQfAhaikDADcDACAFQdgTaiAFQfghaikDADcDACAFQeATaiAFQYAiaikDADcDACAFQegTaiAFQYgiaikDADcDACAFIAUpA7AhNwOQEyAFIAUpA+AhNwPAEyAFQZgUaiAFQbgiaikDADcDACAFQZAUaiAFQbAiaikDADcDACAFQYgUaiAFQagiaikDADcDACAFQYAUaiAFQaAiaikDADcDACAFQfgTaiAFQZgiaikDADcDACAFQcgOaiAFQcggaikDADcDACAFQcAOaiAFQcAgaikDADcDACAFQbgOaiAFQbggaikDADcDACAFQbAOaiAFQbAgaikDADcDACAFIAUpA5AiNwPwEyAFIAUpA6ggNwOoDiAFQfgaaiIGIAVBmCNqKQMANwMAIAVB8BpqIgcgBUGQI2opAwA3AwAgBUHoGmoiCCAFQYgjaikDADcDACAFQeAaaiIKIAVBgCNqKQMANwMAIAVB2BpqIgsgBUH4ImopAwA3AwAgBSAFKQPwIjcD0BogBUGIG2oiDCAFQagjaikDADcDACAFQZAbaiINIAVBsCNqKQMANwMAIAVBmBtqIg4gBUG4I2opAwA3AwAgBUGgG2oiDyAFQcAjaikDADcDACAFQagbaiIQIAVByCNqKQMANwMAIAUgBSkDoCM3A4AbIAVB2BtqIhEgBUH4I2opAwA3AwAgBUHQG2oiEiAFQfAjaikDADcDACAFQcgbaiITIAVB6CNqKQMANwMAIAVBwBtqIhQgBUHgI2opAwA3AwAgBUG4G2oiFSAFQdgjaikDADcDACAFIAUpA9AjNwOwGyAFQbAeaiIWIAVBqCRqKQMANwMAIAVBqB5qIhcgBUGgJGopAwA3AwAgBUGgHmoiGCAFQZgkaikDADcDACAFQZgeaiIZIAVBkCRqKQMANwMAIAVBkB5qIhogBUGIJGopAwA3AwAgBSAFKQOAJDcDiB4gBUHgHmoiGyAFQdgkaikDADcDACAFQdgeaiIcIAVB0CRqKQMANwMAIAVB0B5qIh0gBUHIJGopAwA3AwAgBUHIHmoiHiAFQcAkaikDADcDACAFQcAeaiIfIAVBuCRqKQMANwMAIAUgBSkDsCQ3A7geIAVByBpqIiAgBUHoImopAwA3AwAgBUHAGmoiISAFQeAiaikDADcDACAFQbgaaiIiIAVB2CJqKQMANwMAIAVBsBpqIiMgBUHQImopAwA3AwAgBUGoGmoiJCAFQcgiaikDADcDACAFIAUpA8AiNwOgGiAFQeAbaiICIAVBoBpqIiVB4AD8CgAAIAVBwBxqIiYgBUGAG2oiJ0HgAPwKAAAgBUGgHWoiKCAFQYgeaiIpQeAA/AoAACAFICo3A6AOIAVBgA9qIAVB4BJqQeAA/AoAACAFQeAPaiAFQcATakHgAPwKAAAgBUHAEGogAkGgAvwKAABB0c7FAC0AABpBwARBCBDWBCIBRQ0JIAEgAykDADcDACABIAMpAzA3AzAgAUEoaiADQShqKQMANwMAIAFBIGogA0EgaikDADcDACABQRhqIANBGGopAwA3AwAgAUEQaiADQRBqKQMANwMAIAFBCGoiBCADQQhqKQMANwMAIAFBOGogA0E4aikDADcDACABQUBrIANBQGspAwA3AwAgAUHIAGogA0HIAGopAwA3AwAgAUHQAGogA0HQAGopAwA3AwAgAUHYAGogA0HYAGopAwA3AwAgAUGIAWogA0GIAWopAwA3AwAgAUGAAWogA0GAAWopAwA3AwAgAUH4AGogA0H4AGopAwA3AwAgAUHwAGogA0HwAGopAwA3AwAgAUHoAGogA0HoAGopAwA3AwAgASADKQNgNwNgIAEgAykDkAE3A5ABIAFBmAFqIANBmAFqKQMANwMAIAFBoAFqIANBoAFqKQMANwMAIAFBqAFqIANBqAFqKQMANwMAIAFBsAFqIANBsAFqKQMANwMAIAFBuAFqIANBuAFqKQMANwMAIAFB6AFqIANB6AFqKQMANwMAIAFB4AFqIANB4AFqKQMANwMAIAFB2AFqIANB2AFqKQMANwMAIAFB0AFqIANB0AFqKQMANwMAIAFByAFqIANByAFqKQMANwMAIAEgAykDwAE3A8ABIAFBmAJqIANBmAJqKQMANwMAIAFBkAJqIANBkAJqKQMANwMAIAFBiAJqIANBiAJqKQMANwMAIAFBgAJqIANBgAJqKQMANwMAIAFB+AFqIANB+AFqKQMANwMAIAEgAykD8AE3A/ABIAFByAJqIANByAJqKQMANwMAIAFBwAJqIANBwAJqKQMANwMAIAFBuAJqIANBuAJqKQMANwMAIAFBsAJqIANBsAJqKQMANwMAIAFBqAJqIANBqAJqKQMANwMAIAEgAykDoAI3A6ACIAFB+AJqIANB+AJqKQMANwMAIAFB8AJqIANB8AJqKQMANwMAIAFB6AJqIANB6AJqKQMANwMAIAFB4AJqIANB4AJqKQMANwMAIAFB2AJqIANB2AJqKQMANwMAIAEgAykD0AI3A9ACIAFBqANqIANBqANqKQMANwMAIAFBoANqIANBoANqKQMANwMAIAFBmANqIANBmANqKQMANwMAIAFBkANqIANBkANqKQMANwMAIAFBiANqIANBiANqKQMANwMAIAEgAykDgAM3A4ADIAFB2ANqIANB2ANqKQMANwMAIAFB0ANqIANB0ANqKQMANwMAIAFByANqIANByANqKQMANwMAIAFBwANqIANBwANqKQMANwMAIAFBuANqIANBuANqKQMANwMAIAEgAykDsAM3A7ADIAFBiARqIANBiARqKQMANwMAIAFBgARqIANBgARqKQMANwMAIAFB+ANqIANB+ANqKQMANwMAIAFB8ANqIANB8ANqKQMANwMAIAFB6ANqIANB6ANqKQMANwMAIAEgAykD4AM3A+ADIAFBuARqIANBuARqKQMANwMAIAFBsARqIANBsARqKQMANwMAIAFBqARqIANBqARqKQMANwMAIAFBoARqIANBoARqKQMANwMAIAFBmARqIANBmARqKQMANwMAIAEgAykDkAQ3A5AEIAEpAwAhKiAJIARBuAT8CgAAIAFBwAQQ3wQgBUHYFGogBUHYIGopAwA3AwAgBUHgFGogBUHgIGopAwA3AwAgBUHoFGogBUHoIGopAwA3AwAgBUHwFGogBUHwIGopAwA3AwAgBUH4FGogBUH4IGopAwA3AwAgBUHoGGogBUGIIWopAwA3AwAgBUHwGGogBUGQIWopAwA3AwAgBUH4GGogBUGYIWopAwA3AwAgBUGAGWogBUGgIWopAwA3AwAgBUGIGWogBUGoIWopAwA3AwAgBSAFKQPQIDcD0BQgBSAFKQOAITcD4BggBUG4GWogBUHYIWopAwA3AwAgBUGwGWogBUHQIWopAwA3AwAgBUGoGWogBUHIIWopAwA3AwAgBUGgGWogBUHAIWopAwA3AwAgBUGYGWogBUG4IWopAwA3AwAgBUHIGWogBUHoIWopAwA3AwAgBUHQGWogBUHwIWopAwA3AwAgBUHYGWogBUH4IWopAwA3AwAgBUHgGWogBUGAImopAwA3AwAgBUHoGWogBUGIImopAwA3AwAgBSAFKQOwITcDkBkgBSAFKQPgITcDwBkgBUGYGmogBUG4ImopAwA3AwAgBUGQGmogBUGwImopAwA3AwAgBUGIGmogBUGoImopAwA3AwAgBUGAGmogBUGgImopAwA3AwAgBUH4GWogBUGYImopAwA3AwAgBUHIFGogBUHIIGopAwA3AwAgBUHAFGogBUHAIGopAwA3AwAgBUG4FGogBUG4IGopAwA3AwAgBUGwFGogBUGwIGopAwA3AwAgBSAFKQOQIjcD8BkgBSAFKQOoIDcDqBQgBiAFQZgjaikDADcDACAHIAVBkCNqKQMANwMAIAggBUGII2opAwA3AwAgCiAFQYAjaikDADcDACALIAVB+CJqKQMANwMAIAUgBSkD8CI3A9AaIAwgBUGoI2opAwA3AwAgDSAFQbAjaikDADcDACAOIAVBuCNqKQMANwMAIA8gBUHAI2opAwA3AwAgECAFQcgjaikDADcDACAFIAUpA6AjNwOAGyARIAVB+CNqKQMANwMAIBIgBUHwI2opAwA3AwAgEyAFQegjaikDADcDACAUIAVB4CNqKQMANwMAIBUgBUHYI2opAwA3AwAgBSAFKQPQIzcDsBsgFiAFQagkaikDADcDACAXIAVBoCRqKQMANwMAIBggBUGYJGopAwA3AwAgGSAFQZAkaikDADcDACAaIAVBiCRqKQMANwMAIAUgBSkDgCQ3A4geIBsgBUHYJGopAwA3AwAgHCAFQdAkaikDADcDACAdIAVByCRqKQMANwMAIB4gBUHAJGopAwA3AwAgHyAFQbgkaikDADcDACAFIAUpA7AkNwO4HiAgIAVB6CJqKQMANwMAICEgBUHgImopAwA3AwAgIiAFQdgiaikDADcDACAjIAVB0CJqKQMANwMAICQgBUHIImopAwA3AwAgBSAFKQPAIjcDoBogAiAlQeAA/AoAACAmICdB4AD8CgAAICggKUHgAPwKAAAgBSAqNwOgFCAFQYAVaiAFQeAYakHgAPwKAAAgBUHgFWogBUHAGWpB4AD8CgAAIAVBwBZqIAJBoAL8CgAAIAVBoA5qIQcjAEGAEmsiASQAIAFBwA1qIgMgBUGgFGoiAhBxIAFBqAlqQfCDwAApAwA3AwAgAUGgCWpB6IPAACkDADcDACABQZgJakHgg8AAKQMANwMAIAFBkAlqQdiDwAApAwA3AwAgAUGICWpB0IPAACkDADcDACABQbgJakIANwMAIAFBwAlqQgA3AwAgAUHICWpCADcDACABQdAJakIANwMAIAFB2AlqQgA3AwAgAUHIg8AAKQMANwOACSABQgA3A7AJIAFB4A9qIgZBAEHgAPwLACABQcAQaiABQYAJaiIEQeAA/AoAACABQaARakEAQeAA/AsAIAQgAkGgAmoiCBBxIAEgBiAEELkCIAFB4AZqIgYgAyABEI0BIAFBwAdqIAFBoA5qIAFB4ABqEI0BIAFBoAhqIAFBgA9qIAFBwAFqEI0BIAQgBhBmIAkiAwJ+IAEoAoAJQQFGBEAgA0IANwMIQgEMAQsgASkDiAkhKiABKQOQCSErIAFB0ARqIAFBmAlqQZAC/AoAACABICs3A8gEIAEgKjcDwAQgAUGACWogAiABQcAEaiIEELkCIAFBwA1qIgYgCBC0AiABQaAOaiACQYADahC0AiABQYAPaiACQeADahC0AiABIARBoAL8CgAAIAFBoAtqIAYgARC5AiABKQOACSEqIAEpA4gJISsgAUEQaiABQZAJakGwBPwKAAAgASArNwMIIAEgKjcDACADQQhqIAcgARCbAkIACzcDACABQYASaiQAIAUpA7ggISogBSkDsCAhKyAFKAKoIEEBRg0FIAVB2ARqIAVBwCBqIgJBsAT8CgAAIAUgKjcD0AQgBSArNwPIBCADIAVByARqEKABQdHOxQAtAAAaQcAEQQgQ1gQiAUUNCSABIAUpA6ggNwMAIAEgBSkD2CA3AzAgAUEoaiAFQdAgaikDADcDACABQSBqIAVByCBqKQMANwMAIAFBGGogAikDADcDACABQRBqIAVBuCBqKQMANwMAIAFBCGogBUGwIGopAwA3AwAgAUE4aiAFQeAgaikDADcDACABQUBrIAVB6CBqKQMANwMAIAFByABqIAVB8CBqKQMANwMAIAFB0ABqIAVB+CBqKQMANwMAIAFB2ABqIAVBgCFqKQMANwMAIAFBiAFqIAVBsCFqKQMANwMAIAFBgAFqIAVBqCFqKQMANwMAIAFB+ABqIAVBoCFqKQMANwMAIAFB8ABqIAVBmCFqKQMANwMAIAFB6ABqIAVBkCFqKQMANwMAIAEgBSkDiCE3A2AgAUG4AWogBUHgIWopAwA3AwAgAUGwAWogBUHYIWopAwA3AwAgAUGoAWogBUHQIWopAwA3AwAgAUGgAWogBUHIIWopAwA3AwAgAUGYAWogBUHAIWopAwA3AwAgASAFKQO4ITcDkAEgAUHoAWogBUGQImopAwA3AwAgAUHgAWogBUGIImopAwA3AwAgAUHYAWogBUGAImopAwA3AwAgAUHQAWogBUH4IWopAwA3AwAgAUHIAWogBUHwIWopAwA3AwAgASAFKQPoITcDwAEgAUGYAmogBUHAImopAwA3AwAgAUGQAmogBUG4ImopAwA3AwAgAUGIAmogBUGwImopAwA3AwAgAUGAAmogBUGoImopAwA3AwAgAUH4AWogBUGgImopAwA3AwAgASAFKQOYIjcD8AEgAUHIAmogBUHwImopAwA3AwAgAUHAAmogBUHoImopAwA3AwAgAUG4AmogBUHgImopAwA3AwAgAUGwAmogBUHYImopAwA3AwAgAUGoAmogBUHQImopAwA3AwAgASAFKQPIIjcDoAIgAUH4AmogBUGgI2opAwA3AwAgAUHwAmogBUGYI2opAwA3AwAgAUHoAmogBUGQI2op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GVStfHwhEkEAIQECfwJAIAIpA5gLIAIpA6gLIAIpA7gLIAIpA8gLIAIpA9gLIAIpA+gLIAIpA+ALIhEgHUJ9g3wgEVStfCIWIAIpA9ALfCIRIBZUrXwgESAffCIWIBFUrXwiGCACKQPAC3wiESAYVK18IBEgHHwiGCARVK18IhkgAikDsAt8IhEgGVStfCARICN8IhkgEVStfCIaIAIpA6ALfCIRIBpUrXwgESAbfCIaIBFUrXwiFyACKQOQC3wiESAXVK18IBEgHnwiFyARVK18IhFQDQAgESAmfCImIBFUIgRFDQAgBK0iESAQfCIQIBFaDQAgECARVK0iESATfCITIBFaDQAgESATVq0iESAVfCIVIBFaDQAgESAVVq0iESAUfCIUIBFaDQAgESAUVq0iESASfCISIBFUDAELQQALIQsgAkHACGogFkL9//P/z///+Yl/fiIRQgBCq9X+////v/+5f0IAEMkDIAJBsAhqIBFCAEL//8+K6///1R5CABDJAyACQaAIaiARQgBCpOzDtY/UtJjnAEIAEMkDIAJBkAhqIBFCAEK/pZScz/DSu+QAQgAQyQMgAkGACGogEUIAQtfZrprk9umNywBCABDJAyACQfAHaiARQgBCms3/y6O9xIAaQgAQyQMCQCACKQP4ByACKQOICCACKQOYCCACKQOoCCACKQO4CCACKQPICCACKQPACCIRIBZ8IBFUrXwiFiACKQOwCHwiESAWVK18IBEgGHwiFiARVK18IhggAikDoAh8IhEgGFStfCARIBl8IhggEVStfCIZIAIpA5AIfCIRIBlUrXwgESAafCIZIBFUrXwiGiACKQOACHwiESAaVK18IBEgF3wiGiARVK18IhcgAikD8Ad8IhEgF1StfCARICZ8IhcgEVStfCIRUA0AIBAgEXwiECARWg0AIBAgEVStIhEgE3wiEyARWg0AIBEgE1atIhEgFXwiFSARWg0AIBEgFVatIhEgFHwiFCARWg0AIBEgFFatIhEgEnwiEiARVCEBCyACQeAHaiAWQv3/8//P///5iX9+IhFCAEKr1f7///+//7l/QgAQyQMgAkHQB2ogEUIAQv//z4rr///VHkIAEMkDIAJBwAdqIBFCAEKk7MO1j9S0mOcAQgAQyQMgAkGwB2ogEUIAQr+llJzP8NK75ABCABDJAyACQaAHaiAR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QgAQyQMgAkHQAmogF0IAICJCABDJAyACQeACaiAXQgAgIEIAEMkDIAJB8AJqIBdCACAkQgAQyQMgAkGAA2ogF0IAICVCABDJAyACQZADaiAXQgAgJ0IAEMkDIAJBsAJqIAIpA8ACIhsgEnwiF0IAQgBC/f/z/8////mJfxDJAyACQaACaiACKQO4AiISQgBCq9X+////v/+5f0IAEMkDIAJBkAJqIBJCAEL//8+K6///1R5CABDJAyACQYACaiASQgBCpOzDtY/UtJjnAEIAEMkDIAJB8AFqIBJCAEK/pZScz/DSu+QAQgAQyQMgAkHgAWogEkIAQtfZrprk9umNywBCABDJAyACQdABaiASQgBCms3/y6O9xIAaQgAQyQMgAikD2AEgAikDkAMiHiAVfCIVIAIpA4gDIBMgAikDgAMiE3wiEiATVK18IBIgEiACKQP4AiAUIAIpA/ACIhR8IhMgFFStfCATIAIpA+gCIAIpA+ACIhQgEHwiECAUVK18IBAgECACKQPYAiACKQPQAiIUIBF8IhEgFFStfCARIAIpA8gCIBcgG1StfHwiIyARVK18fCIQVq18fCIRIBNUrXx8IhJWrXx8IhsgAikD0AF8IhMgG1StfCATIBMgAikD6AEgEiACKQPgAXwiFCASVK18IBQgFCACKQP4ASARIAIpA/ABfCIdIBFUrXwgHSACKQOIAiAQIBAgAikDgAJ8IhBWrXwgECACKQOYAiACKQOQAiIRICN8IhIgEVStfCASIBIgAikDqAIgAikDoAIiESAXfCARVK18fCISVq18fCIRIBBUrXx8IhAgHVStfHwiFFatfHwiE1atfCAVIBtWrSACKQOYAyAVIB5UrXx8fCEVIANBCGsiA0F4Rw0ACwJ+AkAgFUKazf/Lo73EgBpWDQAgFUKazf/Lo73EgBpSBEAgESEiIBAhICAUISQgEyElIBUhJyASDAILIBNC19mumuT26Y3LAFYNAEKazf/Lo73EgBohJyATQtfZrprk9umNywBSBEAgESEiIBAhICAUISQgEyElIBIMAgsgFEK/pZScz/DSu+QAVg0AQtfZrprk9umNywAhJSAUQr+llJzP8NK75ABSBEAgESEiIBAhICAUISQgEgwCCyAQQqTsw7WP1LSY5wBWDQBCv6WUnM/w0rvkACEkIBBCpOzDtY/UtJjnAFIEQCARISIgECEgIBIMAgsgEUL//8+K6///1R5WDQBCpOzDtY/UtJjnACEgIBFC///Piuv//9UeUSASQqrV/v///7//uX9WcQ0AIBEhIiASDAELIBFC///Piuv//9UefSIXIBJCq9X+////v/+5f1StIht9ISIgEEKk7MO1j9S0mOcAfSIhIBFC///Piuv//9UeVCAXIBtUcq0iEX0hICAUQr+llJzP8NK75AB9IhcgEEKk7MO1j9S0mOcAVCARICFWcq0iEH0hJCATQtfZrprk9umNywB9IhEgFEK/pZScz/DSu+QAVCAQIBdWcq0iEH0hJSAVIBNC19mumuT26Y3LAFQgECARVnKtfUKazf/Lo73EgBp9IScgEkLVqoGAgIDAgMYAfAshIUIAIRFBKCEDQgAhEkIAIRBCACEUQgAhE0IAIRUDQCACQfAAaiACQbAOaiADaikDACIXQgAgL0IAEMkDIAJBgAFqIBdCACAtQgAQyQMgAkGQAWogF0IAIChCABDJAyACQaABaiAXQgAgKkIAEMkDIAJBsAFqIBdCACArQgAQyQMgAkHAAWogF0IAICxCABDJAyACQeAAaiACKQNwIhsgEnwiF0IAQgBC/f/z/8////mJfxDJAyACQdAAaiACKQNoIhJCAEKr1f7///+//7l/QgAQyQMgAkFAayASQgBC///Piuv//9UeQgAQyQMgAkEwaiASQgBCpOzDtY/UtJjnAEIAEMkDIAJBIGogEkIAQr+llJzP8NK75ABCABDJAyACQRBqIBJCAELX2a6a5PbpjcsAQgAQyQMgAiASQgBCms3/y6O9xIAaQgAQyQMgAikDCCACKQPAASIeIBV8IhUgAikDuAEgEyACKQOwASITfCISIBNUrXwgEiASIAIpA6gBIBQgAikDoAEiFHwiEyAUVK18IBMgAikDmAEgAikDkAEiFCAQfCIQIBRUrXwgECAQIAIpA4gBIAIpA4ABIhQgEXwiESAUVK18IBEgAikDeCAXIBtUrXx8IiMgEVStfHwiEFatfHwiESATVK18fCISVq18fCIbIAIpAwB8IhMgG1StfCATIBMgAikDGCASIAIpAxB8IhQgElStfCAUIBQgAikDKCARIAIpAyB8Ih0gEVStfCAdIAIpAzggECAQIAIpAzB8IhBWrXwgECACKQNIIAIpA0AiESAjfCISIBFUrXwgEiASIAIpA1ggAikDUCIRIBd8IBFUrXx8IhJWrXx8IhEgEFStfHwiECAdVK18fCIUVq18fCITVq18IBUgG1atIAIpA8gBIBUgHlStfHx8IRUgA0EIayIDQXhHDQALIAICfgJAIBVCms3/y6O9xIAaVg0AAkAgFUKazf/Lo73EgBpSBEAgFSEsIBMhKyAUISogECEoDAELIBNC19mumuT26Y3LAFYNAUKazf/Lo73EgBohLCATQtfZrprk9umNywBSBEAgEyErIBQhKiAQISgMAQsgFEK/pZScz/DSu+QAVg0BQtfZrprk9umNywAhKyAUQr+llJzP8NK75ABSBEAgFCEqIBAhKAwBCyAQQqTsw7WP1LSY5wBWDQFCv6WUnM/w0rvkACEqIBBCpOzDtY/UtJjnAFIEQCAQISgMAQsgEUL//8+K6///1R5WDQFCpOzDtY/UtJjnACEoIBFC///Piuv//9UeUg0AIBJCqtX+////v/+5f1YNAQsgESEtIBIMAQsgEUL//8+K6///1R59IhcgEkKr1f7///+//7l/VK0iG30hLSAQQqTsw7WP1LSY5wB9Ih0gEUL//8+K6///1R5UIBcgG1RyrSIRfSEoIBRCv6WUnM/w0rvkAH0iFyAQQqTsw7WP1LSY5wBUIBEgHVZyrSIQfSEqIBNC19mumuT26Y3LAH0iESAUQr+llJzP8NK75ABUIBAgF1ZyrSIQfSErIBUgE0LX2a6a5PbpjcsAVCAQIBFWcq19QprN/8ujvcSAGn0hLCASQtWqgYCAgMCAxgB8CyIvNwO4DyACIC03A7APIAIgKDcDqA8gAiAqNwOgDyACICs3A5gPIAIgLDcDkA8gAkGQD2pB+NPBAEEwEPEDDQALCyACICI3A4APIAIgITcDiA8gAiAgNwP4DiACICQ3A/AOIAIgJTcD6A4gAiAnNwPgDgJAIAJB4A5qQYjSwQBBMBDxA0UEQCAlIREgJCESICAhFSAiIRMMAQtC///Piuv//9UeICJ9IhIgIUKr1f7///+//7l/Vq0iEH0hE0Kk7MO1j9S0mOcAICB9IhEgECASViAiQv//z4rr///VHlZyrSISfSEVQr+llJzP8NK75AAgJH0iECARIBJUICBCpOzDtY/UtJjnAFZyrSIRfSESQtfZrprk9umNywAgJX0iFCAQIBFUICRCv6WUnM/w0rvkAFZyrSIQfSERQprN/8ujvcSAGiAQIBRWICVC19mumuT26Y3LAFZyrSAnfH0hJ0Kr1f7///+//7l/ICF9ISELIAAgAikD4A43AwggACAhNwNgIAAgEzcDWCAAIBU3A1AgACASNwNIIAAgETcDQCAAICc3AzggAEEwaiACQYgPaikDADcDACAAQShqIAJBgA9qKQMANwMAIABBIGogAkH4DmopAwA3AwAgAEEYaiACQfAOaikDADcDACAAQRBqIAJB6A5qKQMANwMAIABCATcDAAsgAkGgEGokAAvTSQI3fwd+IwBB0BtrIgUkACAFQQw2AgQgBSACNgLAEgJAAkACQAJAAkACQAJAAkACQCACQQxGBEAgBSAENgLAEiACIARHDQECQAJAAkACQAJAAkACQCACQQJrDgsBAAAAAgAAAAAAAwALIAVBADYC2BggBUEBNgLMGCAFQYiJwAA2AsgYIAVCBDcC0BggBUHIGGpBnIzAABCoBAALQdHOxQAtAAAaQcAAQQgQ1gQiAg0CDAwLQdHOxQAtAAAaQcABQQgQ1gQiAg0CDAwLQdHOxQAtAAAaQYADQQgQ1gQiAg0CDAwLIAIgASkDACI8NwMAIAIgASkDICI9NwMgIAVBKGogPTcDACACQRhqIAFBGGopAwAiPTcDACACQRBqIAFBEGopAwAiPjcDACACQQhqIAFBCGopAwAiPzcDACACQShqIAFBKGopAwAiQDcDACACQTBqIAFBMGopAwAiQTcDACACQThqIAFBOGopAwAiQjcDACAFQRhqID43AwAgBUEgaiA9NwMAIAVBMGogQDcDACAFQThqIEE3AwAgBUFAayBCNwMAIAUgPzcDECACQcAAEN8EQdHOxQAtAAAaIAUgPDcDCEHAAEEIENYEIgFFDQkgASADKQMAIjw3AwAgASADKQMgIj03AyAgBUHoAGogPTcDACABQRhqIANBGGopAwAiPTcDACABQRBqIANBEGopAwAiPjcDACABQQhqIANBCGopAwAiPzcDACABQShqIANBKGopAwAiQDcDACABQTBqIANBMGopAwAiQTcDACABQThqIANBOGopAwAiQjcDACAFQdgAaiA+NwMAIAVB4ABqID03AwAgBUHwAGogQDcDACAFQfgAaiBBNwMAIAVBgAFqIEI3AwAgBSA/NwNQIAFBwAAQ3wQgBSA8NwNIIAVByBhqIgEgBUEIaiAFQcgAahCRAyAFKQPYGCE8IAUpA9AYIT0gBSgCyBhBAUYNBCAFQcABaiAFQYgZaikDADcDACAFQbgBaiAFQYAZaikDADcDACAFQbABaiAFQfgYaikDADcDACAFQagBaiAFQfAYaikDADcDACAFQaABaiAFQegYaikDADcDACAFIAUpA+AYNwOYASAFIDw3A5ABIAUgPTcDiAEgASAFQYgBahCvAyAFKALMGCEBIAUoAsgYIQIgBSgC0BgiA0ECRw0FIAVBkAZqIAFBEGopAwA3AwAgBUGYBmogAUEYaikDADcDACAFQaAGaiABQSBqKQMANwMAIAVBqAZqIAFBKGopAwA3AwAgBUGwBmogAUEwaikDADcDACAFQbgGaiABQThqKQMANwMAIAUgASkDCDcDiAYgASgCBCEDIAEoAgAhBCACBEAgASACQQV0EN8EC0HRzsUALQAAGkHAAEEIENYEIgFFDQkgASADNgIEIAEgBDYCACABIAUpA4gGNwMIIAEgBSkDoAY3AyAgAEECNgIIIAAgATYCBCAAQQI2AgAgAUEQaiAFQZAGaikDADcDACABQRhqIAVBmAZqKQMANwMAIAFBKGogBUGoBmopAwA3AwAgAUEwaiAFQbAGaikDADcDACABQThqIAVBuAZqKQMANwMADAgLIAIgASkDADcDACACIAEpAyA3AyAgAiABKQNANwNAIAJBGGogAUEYaikDADcDACACQRBqIAFBEGopAwA3AwAgAkEIaiIEIAFBCGopAwA3AwAgAkEoaiABQShqKQMANwMAIAJBMGogAUEwaikDADcDACACQThqIAFBOGopAwA3AwAgAkHIAGogAUHIAGopAwA3AwAgAkHQAGogAUHQAGopAwA3AwAgAkHYAGogAUHYAGopAwA3AwAgAkH4AGogAUH4AGopAwA3AwAgAkHwAGogAUHwAGopAwA3AwAgAkHoAGogAUHoAGopAwA3AwAgAiABKQNgNwNgIAIgASkDgAE3A4ABIAJBiAFqIAFBiAFqKQMANwMAIAJBkAFqIAFBkAFqKQMANwMAIAJBmAFqIAFBmAFqKQMANwMAIAIgASkDoAE3A6ABIAJBqAFqIAFBqAFqKQMANwMAIAJBsAFqIAFBsAFqKQMANwMAIAJBuAFqIAFBuAFqKQMA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BUHIGGogBUHIAWoQhQFB0c7FAC0AABpBwAFBCBDWBCIBRQ0JIAEgBSkDyBg3AwAgASAFKQPoGDcDICABIAUpA4gZNwNAIAFBGGogBUHgGGopAwA3AwAgAUEQaiAFQdgYaikDADcDACABQQhqIAVB0BhqKQMANwMAIAFBKGogBUHwGGopAwA3AwAgAUEwaiAFQfgYaikDADcDACABQThqIAVBgBlqKQMANwMAIAFByABqIAVBkBlqKQMANwMAIAFB0ABqIAVBmBlqKQMANwMAIAFB2ABqIAVBoBlqKQMANwMAIAFB+ABqIAVBwBlqKQMANwMAIAFB8ABqIAVBuBlqKQMANwMAIAFB6ABqIAVBsBlqKQMANwMAIAEgBSkDqBk3A2AgAUGYAWogBUHgGWopAwA3AwAgAUGQAWogBUHYGWopAwA3AwAgAUGIAWogBUHQGWopAwA3AwAgASAFKQPIGTcDgAEgAUG4AWogBUGAGmopAwA3AwAgAUGwAWogBUH4GWopAwA3AwAgAUGoAWogBUHwGWopAwA3AwAgASAFKQPoGTcDoAEgAEEGNgIIIAAgATYCBCAAQQY2AgAMBwsgAiABKQMANwMAIAIgASkDIDcDICACIAEpA0A3A0AgAkEYaiABQRhqKQMANwMAIAJBEGogAUEQaikDADcDACACQQhqIgQgAUEIaikDADcDACACQShqIAFBKGopAwA3AwAgAkEwaiABQTBqKQMANwMAIAJBOGogAUE4aikDADcDACACQcgAaiABQcgAaikDADcDACACQdAAaiABQdAAaikDADcDACACQdgAaiABQdgAaikDADcDACACQfgAaiABQfgAaikDADcDACACQfAAaiABQfAAaikDADcDACACQegAaiABQegAaikDADcDACACIAEpA2A3A2AgAiABKQOAATcDgAEgAkGIAWogAUGIAWopAwA3AwAgAkGQAWogAUGQAWopAwA3AwAgAkGYAWogAUGYAWopAwA3AwAgAiABKQOgATcDoAEgAkGoAWogAUGoAWopAwA3AwAgAkGwAWogAUGwAWopAwA3AwAgAkG4AWogAUG4AWopAwA3AwAgAkHYAWogAUHYAWopAwA3AwAgAkHQAWogAUHQAWopAwA3AwAgAkHIAWogAUHIAWopAwA3AwAgAiABKQPAATcDwAEgAkH4AWogAUH4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KQPIBSADKQPYBSADKQOoBiADKQO4BiADKQP4BiADKQOIByADKQO4ByADKQPIByADKQPoByIPIAMpA8AHfCIQIA9UrXwiESADKQOQB3wiDyADKQOwB3wiFCAPVK18IhMgAykDmAcgDyARVK18IhEgAykD0AZ8IhZ8Ig8gE1StfCAPIA8gAykDgAd8Ig9WrXwiGCADKQPYBiARIBZWrXwiGyADKQOABnwiGnwiESADKQPABnwiEyADKQPwBnwiFiATVK18IhwgESATVq0gAykDyAYgESAYVK18fCIYIAMpA4gGIBogG1StfHwiESADKQPwBXwiG3wiEyAcVK18IBMgEyADKQOwBnwiE1atfCIaIBEgG1atIAMpA/gFIBEgGFStfHx8IhEgAykD4AV8IhggAykDoAZ8IhsgGFStfCIcIBEgGFatIAMpA+gFIBEgGlStfHx8IhEgHFStfCARIAMpA9AFfCIYIBFUrXwiESADKQPABXwiGiARVK18IhFCP4ggAykDuAUgAykDsAUiICARQgGGIBpCP4iEfCIcICBUrXwgHCADKQOYBiADKQOQBiIRIBhCAYYgG0I/iIR8IiAgEVStfCAgIAMpA+gGIAMpA+AGIiEgE0IBhiAWQj+IhHwiESAhVK18IBEgAykDqAcgAykDoAciHyAPQgGGIBRCP4iEfCIhIB9UrXwgISADKQPYByADKQPQByIiIBBCAYYgAykD4AciJ0I/iIR8Ih8gIlStfCAfIB8gAykD2AgiIiAnQgGGfCInICJUrXwiH1atfCIiIBRCAYYgEEI/iIR8IiogIlStfCIiICFUrXwiECAWQgGGIA9CP4iEfCIrIBBUrXwiISARVK18IhAgG0IBhiATQj+IhHwiESAQVK18IhAgIFStfCIPIBpCAYYgGEI/iIR8IhQgD1StfCITIBxUrXx8IRZBACEFAn8CQCADKQP4ByADKQOICCADKQOYCCADKQOoCCADKQO4CCADKQPICCADKQPACCIPICVCfYN8IA9UrXwiGCADKQOwCHwiDyAYVK18IA8gJ3wiGCAPVK18IhsgAykDoAh8Ig8gG1StfCAPIB98IhsgD1StfCIaIAMpA5AIfCIPIBpUrXwgDyAqfCIaIA9UrXwiHCADKQOACHwiDyAcVK18IA8gInwiHCAPVK18IiAgAykD8Ad8Ig8gIFStfCAP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gYCAgMCAxgB8IR8MAQsgECEcIBQhGiARIRsLIAMgHzcD+BAgAyAcNwPwECADIBo3A+gQIAMgGzcD4BAgAyAPNwPYECADICE3A9AQIAhCADcDACAJQgA3AwAgCkIANwMAIAtCADcDACADQgA3A4ARIAMgJEIBgzcDqBECQCADQYARaiADQaAQakEwEPEDDQBCACEUQSghAUIAIRBCACETQgAhEUIAIRhCACEWA0AgA0HwAGogA0HQEGogAWopAwAiEkIAIB1CABDJAyADQYABaiASQgAgFUIAEMkDIANBkAFqIBJCACAOQgAQyQMgA0GgAWogEkIAIBdCABDJAyADQbABaiASQgAgGUIAEMkDIANBwAFqIBJCACAeQgAQyQMgA0HgAGogAykDcCIlIBZ8IhZCAEIAQv3/8//P///5iX8QyQMgA0HQAGogAykDaCISQgBCq9X+////v/+5f0IAEMkDIANBQGsgEkIAQv//z4rr///VHkIAEMkDIANBMGogEkIAQqTsw7WP1LSY5wBCABDJAyADQSBqIBJCAEK/pZScz/DSu+QAQgAQyQMgA0EQaiASQgBC19mumuT26Y3LAEIAEMkDIAMgEkIAQprN/8ujvcSAGkIAEMkDIAMpAwggAykDwAEiJyAUfCISIAMpA7gBIAMpA7ABIhQgEHwiECAUVK18IBAgECADKQOoASATIAMpA6ABIhN8IhQgE1StfCAUIBQgAykDmAEgAykDkAEiEyARfCIRIBNUrXwgESARIAMpA4gBIBggAykDgAEiGHwiEyAYVK18IBMgEyADKQN4IBYgJVStfHwiE1atfHwiEVatfHwiFFatfHwiEFatfHwiJSADKQMAfCIiICVUrXwgIiADKQMYIBAgECADKQMQfCIQVq18IBAgAykDKCAUIBQgAykDIHwiFFatfCAUIAMpAzggESARIAMpAzB8IhFWrXwgESADKQNIIAMpA0AiGCATfCITIBhUrXwgEyADKQNYIBYgAykDUCIWfCAWVK18fCIWIBNUrXx8IhggEVStfHwiESAUVK18fCITIBBUrXx8IhAgIlStfCASICVWrSADKQPIASASICdUrXx8fCEUIAFBCGsiAUF4Rw0ACwJAIBRCms3/y6O9xIAaVg0AAkAgFEKazf/Lo73EgBpSBEAgFCEeIBAhGSATIRcgESEODAELIBBC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AEL///////////8AQgAQyQMgAkHgCGogD0IAICRCABDJAyACQaAIaiAPQgAgIUIAEMkDIAJBkAhqIA9CACAfQgAQyQMgAkGACGogD0IAIB1CABDJAyACQdAIaiACKQOwCSIaIAIpA9gJIhEgAikDkAl8Ig98IhggAikDyAkgECACKQPACSIOfCAOVK18fCIVIAIpA+AIfCITQpuUr8Pytajehn9+Ig5CAEJtQgAQyQMgAkHACGogDkIAQn9CABDJAyACQbAIaiAOQgBC////////////AEIAEMkDIAJB8AdqIBJCACAkQgAQyQMgAkGwB2ogEkIAICFCABDJAyACQaAHaiASQgAgH0IAEMkDIAJBkAdqIBJCACAdQgAQyQMgAkHgB2ogAikD6AggEyAVVK18IhYgAikDoAh8IhwgGiACKQOYCSAPIBFUrXwiECACKQOACXwiHnwiFyAVIBhUrSACKQO4CSISIBggGlStfHx8IhF8IhkgAikDwAgiD3wiGiACKQPYCCACKQPQCCIOIBN8IA5UrXx8IhggAikD8Ad8IhtCm5Svw/K1qN6Gf34iDkIAQm1CABDJAyACQdAHaiAOQgBCf0IAEMkDIAJBwAdqIA5CAEL///////////8AQgAQyQMgAkGAB2ogFEIAICRCABDJAyACQcAGaiAUQgAgIUIAEMkDIAJBsAZqIBRCACAfQgAQyQMgAkGgBmogFEIAIB1CABDJAyACQfAGaiACKQP4ByAYIBtWrXwiEyACKQOwB3wiHyAPIAIpA4gJIBAgHlatfCIQIAIpA/AIfCIVIAIpA6AJfCIUIBEgF1StIBIgFyAeVK18fHwiHSACKQOQCHwiFyAZIBxUrSACKQOoCCAWIBxWrXx8fCIefCIWIBggGlStIAIpA8gIIhIgGSAaVq18fHwiEXwiGiACKQPQByIPfCIYIAIpA+gHIAIpA+AHIg4gG3wgDlStfHwiGSACKQOAB3wiG0KblK/D8rWo3oZ/fiIOQgBCbUIAEMkDIAJB4AZqIA5CAEJ/QgAQyQMgAkHQBmogDkIAQv///////////wBCABDJAwJAAkAgAikD2AYgAikDyAcgAikDuAggFCAdVq0gAikDqAkgFCAVVK18fCIOIAIpA/gIIBAgFVatfHwiFSACKQOACHwiFCAXIB5WrSACKQOYCCAXIB1UrXx8fCIXIAIpA7AIfCIQIBdUrXwgECARIBZUrSASIBYgHlStfHx8IhYgEFStfCIQIBQgF1atIAIpA4gIIBQgFVStfHwiEiAOIBVWrXwiEXwiFSACKQOQB3wiFCACKQOoByAWIBYgAikDoAd8Ig5WrXwgDiAOIBogH1StIAIpA7gHIBMgH1atfHx8IhdWrXx8IhYgAikDwAd8IhMgFlStfCATIAIpA9gHIg4gFyAPIBd8Ig9WrXwgDyAPIBggGVatIA4gGCAaVK18fHwiD1atfHwiDiATVK18IhcgFCAWVq0gAikDmAcgFCAVVK18fCIWIBAgFVatIBEgElStfHwiE3wiGiACKQOgBnwiGCACKQO4BiAOIA4gAikDsAZ8IhJWrXwgEiASIAIpA8gGIAIpA4gHIBkgG1atfCIOIAIpA8AGfCIRIA5UrXwgESAPIBF8IhVWrXx8IhFWrXx8IhQgAikD0AZ8IhAgFFStfCAQIBAgAikD6AYiDyARIBEgAikD4AYiDnwiElatfCASIA8gFSAOIBV8IhFWrXwgESACKQP4BiAbIAIpA/AGIg58IA5UrXx8IhwgEVStfHwiESASVK18fCISVq18IhAgFCAYVK0gAikDqAYgGCAaVK18fCIPIBcgGlatIBMgFlStfHwiDnwiFCAQVCAOIA9UciAUQgBTcg0AAkAgFEL///////////8AUQRAQn8hDyASQn9RDQFC////////////ACEUCyASIQ8gESEODAILIBFCf1IEQEL///////////8AIRQgESEODAILIBxCbVoNAEL///////////8AIRRCfyEODAELIBFCAXwiEyAcQm1UrSIPfSEOIBJCAXwiECARQn9SIA8gE1ZyrSIRfSEPIBQgEkJ/UiAQIBFUcq19Qv///////////wB9IRQgHEITfCEcCwJAAkACQCAUIA8gDiAcQiZ8IhIgHFStfCIQIA5UrXwiEyAPVK18Ig8gFFQNAEL///////////8AIRQgDyIOQv///////////wBRBEBCfyEUQv///////////wAhDiATQn9SDQIgEEJ/UgRAIBAhEQwEC0JtIRQgEiIOQm1RDQELIA4gFFoNACAPIQ4MAQsgEEIBfCIXIBJCbVStIg59IREgE0IBfCIWIBBCf1IgDiAXVnKtIg59IRQgDyATQn9SIA4gFlZyrX1C////////////AH0hDiASQhN8IRIMAQsgEyEUIBAhEQsgAiASNwPQDSACIBE3A8gNIAIgFDcDwA0gAiAONwO4DSACQegNaiIFIAJBmA1qIgEgAkG4DWoQXAJ/AkACQCACKALoDUEBRwRAIAJBkA1qIAJBiA5qIgkpAwA3AwAgAkGIDWogAkGADmoiBikDADcDACACQYANaiACQfgNaiIEKQMANwMAIAIgAikD8A03A/gMIAVB767EAEE/ELECIAItAOgNQQFGDQEgAkGwDWogCSkDADcDACACQagNaiAGKQMANwMAIAJBoA1qIAQpAwA3AwAgAiACKQPwDTcDmA0gAkH4DGohBiMAQeAJayIDJAAgA0GYCWpCADcDACADQZAJakIANwMAIANBiAlqQgA3AwAgA0IANwOACSADQbAJakIANwMAIANBqAlqQgA3AwAgA0IANwOgCSADQgE3A7gJAkACQCABIANBgAlqIgRBIBDxAwRAIAEgA0GgCWpBIBDxA0UNASABKQMIIRYgASkDECEQIAEpAwAhDiAGKQMYIRsgBikDECERIAYpAwghEiAGKQMAIRQgASkDGCEXIANB0AlqIglCADcDACADQcgJaiIGQgA3AwAgA0IANwPACSADIBdCAYM3A9gJIANBwAlqIARBIBDxA0UEQANAIBAhFSADQbAIaiARQgAgG0IAEMkDIANBkAhqIBJCACAbQgAQyQMgA0HgB2ogFEIAIBtCABDJAyADQYAIaiASQgAgEUIAEMkDIANB0AdqIBRCACARQgAQyQMgA0HAB2ogFEIAIBJCABDJAyADQfAIaiAbQgAgG0IAEMkDIANBoAhqIBFCACARQgAQyQMgA0HwB2ogEkIAIBJCABDJAyADQbAHaiAUQgAgFEIAEMkDIANB4AhqIAMpA/AIIh5Cm5Svw/K1qN6Gf34iD0IAQm1CABDJAyADQdAIaiAPQgBCf0IAEMkDIANBwAhqIA9CAEL///////////8AQgAQyQMgAykDyAcgAykD2AcgAykD6AcgAykDmAggAykDuAgiDyADKQOQCHwiGCAPVK18Ig8gAykD4Ad8IhIgD1StfCIPIAMpA9AHfCIRIA9UrXwgESADKQOICCASIAMpA4AIfCIbIBJUrXx8IhQgEVStfCIPIAMpA8AHfCITIA9UrXwiEUI/iCADKQO4ByAD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fCIbIBlUrXwgGyADKQO4ASIPIBUgESAVfCIVVq18IBUgFSAgICJWrSAPICAgJlStfHx8IhFWrXx8Ig8gG1StfCIeIBkgHVStIAMpA3ggHSAfVK18fCIZIBQgH1atIBIgE1StfHwiFHwiICADKQMAfCIfIAMpAxggDyADKQMQfCITIA9UrXwgEyADKQMoIAMpA2ggIiAjVq18Ig8gAykDIHwiEiAPVK18IBEgEnwiGyASVK18fCISIBNUrXx8Ih0gAykDMHwiFSAdVK18IBUgAykDSCIRIBIgAykDQCIPfCITIBJUrXwgEyARIA8gG3wiEiAbVK18IBIgAykDWCADKQNQIg8gI3wgD1StfHwiGyASVK18fCISIBNUrXx8Ig8gFVStfCIVIB0gH1StIAMpAwggHyAgVK18fCITIB4gIFatIBQgGVStfHwiEXwiFCAVVCARIBNUciAUQgBTckUEQCAPIBKDQn9SIBtCbVRyIBRC////////////AFJyDQELIBJCAXwiGSAbQm1UrSITfSERIA9CAXwiFSASQn9SIBMgGVZyrSITfSESIBQgD0J/UiATIBVWcq19Qv///////////wB9IRQgG0ITfCEbDAELIBIhESAPIRILIAEgGEIBiCITNwMAIAEgK0I/hiAaQgGIhCIPNwMQIAEgGkI/hiAsQgGIhCIsNwMYIAEgGEI/hiArQgGIhCIrNwMIIAEgA0GACWpBIBDxAw0ACwsgBSAbNwMYIAUgETcDECAFIBI3AwggBSAUNwMADAILIAVBGGpBsNPBACkDADcDACAFQRBqQajTwQApAwA3AwAgBUEIakGg08EAKQMANwMAIAVBmNPBACkDADcDAAwBCyAFIAYpAwA3AwAgBUEYaiAGQRhqKQMANwMAIAVBEGogBkEQaikDADcDACAFQQhqIAZBCGopAwA3AwALIANB4AlqJAAgAkGwBWogAikDgA4iHEIAIAIpA/gNIg9CABDJAyACQaAFaiAcQgAgAikD8A0iEkIAEMkDIAJBkAVqIBxCACACKQPoDSIUQgAQyQMgAkHgBWogD0IAIBJCABDJAyACQdAFaiAPQgAgFEIAEMkDIAJBgAZqIBJCACAUQgAQyQMgAkGABWogHEIAIBxCABDJAyACQcAFaiAPQgAgD0IAEMkDIAJB8AVqIBJCACASQgAQyQMgAkGQ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AEL///////////8AQgAQyQMgAkHAAmogHEIAIChCABDJAyACQYACaiAPQgAgKEIAEMkDIAJB8AFqIBJCACAoQgAQyQMgAkHgAWogFEIAIChCABDJAyACQbACaiACKQOQAyIaIAIpA7gDIhAgAikD8AJ8IhF8IhggAikDqAMgEyACKQOgAyIOfCAOVK18fCIWIAIpA8ACfCITQpuUr8Pytajehn9+Ig5CAEJtQgAQyQMgAkGgAmogDkIAQn9CABDJAyACQZACaiAOQgBC////////////AEIAEMkDIAJB0AFqIBxCACApQgAQyQMgAkGQAWogD0IAIClCABDJAyACQYABaiASQgAgKUIAEMkDIAJB8ABqIBRCACApQgAQyQMgAkHAAWogAikDyAIgEyAWVK18IhUgAikDgAJ8IiEgGiACKQP4AiAQIBFWrXwiECACKQPgAnwiHXwiHiAWIBhUrSACKQOYAyIXIBggGlStfHx8IhZ8IhkgAikDoAIiEXwiGiACKQO4AiACKQOwAiIOIBN8IA5UrXx8IhggAikD0AF8IhtCm5Svw/K1qN6Gf34iDkIAQm1CABDJAyACQbABaiAOQgBCf0IAEMkDIAJBoAFqIA5CAEL///////////8AQgAQyQMgAkHgAGogHEIAICpCABDJAyACQSBqIA9CACAqQgAQyQMgAkEQaiASQgAgKkIAEMkDIAIgFEIAICpCABDJAyACQdAAaiACKQPYASAYIBtWrXwiEyACKQOQAXwiHCARIAIpA+gCIBAgHVatfCIQIAIpA9ACfCIfIAIpA4ADfCIUIBYgHlStIBcgHSAeVq18fHwiHSACKQPwAXwiFyAZICFUrSACKQOIAiAVICFWrXx8fCIefCIWIBggGlStIAIpA6gCIhIgGSAaVq18fHwiEXwiGiACKQOwASIPfCIYIAIpA8gBIAIpA8ABIg4gG3wgDlStfHwiGSACKQNgfCIbQpuUr8Pytajehn9+Ig5CAEJtQgAQyQMgAkFAayAOQgBCf0IAEMkDIAJBMGogDkIAQv///////////wBCABDJAwJAAkAgAikDOCACKQOoASACKQOYAiAUIB1WrSACKQOIAyAUIB9UrXx8Ig4gAikD2AIgECAfVq18fCIVIAIpA+ABfCIUIBcgHlatIAIpA/gBIBcgHVStfHx8IhcgAikDkAJ8IhAgF1StfCAQIBEgFlStIBIgFiAeVK18fHwiFiAQVK18IhAgFCAXVq0gAikD6AEgFCAVVK18fCISIA4gFVatfCIRfCIVIAIpA3B8IhQgAikDiAEgFiAWIAIpA4ABfCIOVq18IA4gGiAcVK0gAikDmAEgEyAcVq18fHwiFyAOVK18fCIWIAIpA6ABfCITIBZUrXwgEyACKQO4ASIOIBcgDyAXfCIPVq18IA8gDyAYIBlWrSAOIBggGlStfHx8Ig9WrXx8Ig4gE1StfCIXIBQgFlatIAIpA3ggFCAVVK18fCIWIBAgFVatIBEgElStfHwiE3wiGiACKQMAfCIYIAIpAxggDiAOIAIpAxB8IhJWrXwgEiASIAIpAyggAikDaCAZIBtWrXwiDiACKQMgfCIRIA5UrXwgESAPIBF8IhVWrXx8IhFWrXx8IhQgAikDMHwiECAUVK18IBAgAikDSCIPIBEgESACKQNAIg58IhJWrXwgEiASIA8gFSAOIBV8IhFWrXwgESACKQNYIBsgAikDUCIOfCAOVK18fCIcIBFUrXx8Ig5WrXx8IhEgEFStfCIQIBQgGFStIAIpAwggGCAaVK18fCISIBcgGlatIBMgFlStfHwiD3wiFCAQVCAPIBJUciAUQgBTcg0AIBRC////////////AFINAUJ/IRIgEUJ/UgRAQv///////////wAhFAwCCyAOQn9SBEBC////////////ACEUIA4hDwwDCyAcQm1aDQBC////////////ACEUQn8hDwwCCyAOQgF8IhMgHEJtVK0iEn0hDyARQgF8IhAgDkJ/UiASIBNWcq0iDn0hEiAUIBFCf1IgDiAQVnKtfUL///////////8AfSEUIBxCE3whHAwBCyARIRIgDiEPCyACIBw3A9ANIAIgDzcDyA0gAiASNwPADSACIBQ3A7gNIAJB3A1qIAJBuA1qENkCAn8gAigC5A0EQCACKALgDSgCACEBQQAhByACQfANakGMocQAKAIANgIAIAJBhKHEACkCADcD6A1BBCEIQQEgAUEBcUUNARogAkHoDWpB6KLEABClAyACKALsDUEBNgIAIAIoAuwNIQggAigC6A0hB0EADAELQQAhB0EEIQhBAQshBSACKALcDSIBBEAgAigC4A0gAUECdBDfBAsgBwRAIAggB0ECdBDfBAsCfiAFRQRA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aikDADcDACAGQdAUaiAGQagbaiIXKQMANwMAIAZB2BRqIAZBsBtqIj8pAwA3AwAgBkHgFGogBkG4G2oiHikDADcDACAGQegUaiAGQcAbaiJFKQMANwMAIAZBmAtqIgogBkHQG2oiRykDADcDACAGQaALaiIIIAZB2BtqKQMANwMAIAZBqAtqIgsgBkHgG2opAwA3AwAgBkGwC2oiESAGQegbaikDADcDACAGQbgLaiINIAZB8BtqKQMANwMAIAYgBikDmBs3A8AUIAYgBikDyBs3A5ALIAZB6AtqIioiByAGQaAcaikDADcDACAGQeALaiIrIhsgBkGYHGopAwA3AwAgBkHYC2oiKCAGQZAcaikDADcDACAGQdALaiI1IAZBiBxqKQMANwMAIAZByAtqIjYgBkGAHGopAwA3AwAgBkHYD2oiOCAGQbAcaiIfKQMANwMAIAZB4A9qIhogBkG4HGopAwA3AwAgBkHoD2oiGSAGQcAcaikDADcDACAGQfAPaiIwIAZByBxqKQMANwMAIAZB+A9qIi0gBkHQHGopAwA3AwAgBiAGKQP4GzcDwAsgBiAGKQOoHDcD0A8gBkGoEGoiMSAGQYAdaikDADcDACAGQaAQaiIyIAZB+BxqKQMANwMAIAZBmBBqIjMgBkHwHGopAwA3AwAgBkGQEGoiISAGQegcaikDADcDACAGQYgQaiIiIAZB4BxqKQMANwMAIAZBuBRqIAZBkBtqIiMpAwA3AwAgBkGwFGogBkGIG2oiJCkDADcDACAGQagUaiAGQYAbaiIlKQMANwMAIAZBoBRqIAZB+BpqKQMANwMAIAYgBikD2Bw3A4AQIAYgBikD8Bo3A5gUIAZB8BRqIAZBkAtqIgRB4AD8CgAAIAZB0BVqIAZB0A9qIglB4AD8CgAAIAZBmBpqIhAgBkHwHWopAwA3AwAgBkGgGmoiLyAGQfgdaikDADcDACAGQagaaiIPIAZBgB5qKQMANwMAIAZBsBpqIg4gBkGIHmopAwA3AwAgBkG4GmoiEyAGQZAeaikDADcDACAGQYgaaiImIAZB4B1qKQMANwMAIAZBgBpqIicgBkHYHWopAwA3AwAgBkH4GWoiKSAGQdAdaikDADcDACAGQfAZaiIsIAZByB1qKQMANwMAIAZB6BlqIi4gBkHAHWopAwA3AwAgBiAGKQPoHTcDkBogBiAGKQO4HTcD4BkgBkHoGmoiEiAGQcAeaikDADcDACAGQeAaaiIUIAZBuB5qKQMANwMAIAZB2BpqIhYgBkGwHmopAwA3AwAgBkHQGmoiHCAGQageaikDADcDACAGQcgaaiIdIAZBoB5qKQMANwMAIAogBkHQHmopAwA3AwAgCCAGQdgeaikDADcDACALIAZB4B5qKQMANwMAIBEgBkHoHmopAwA3AwAgDSAGQfAeaikDADcDACAGIAYpA5geNwPAGiAGIAYpA8geNwOQCyAHIAZBoB9qKQMANwMAIBsgBkGYH2opAwA3AwAgKCAGQZAfaikDADcDACA1IAZBiB9qKQMANwMAIDYgBkGAH2opAwA3AwAgBkHYGWoiOSAGQbAdaikDADcDACAGQdAZaiJAIAZBqB1qKQMANwMAIAZByBlqIkEgBkGgHWopAwA3AwAgBkHAGWoiRCAGQZgdaikDADcDACAGQbgZaiJGIAZBkB1qIkgpAwA3AwAgBiAGKQP4HjcDwAsgBiAGKQOIHTcDsBkgCSAGQbAZaiJNQeAA/AoAACAGQbAQaiJOIAZBkBpqIhtB4AD8CgAAIAZBkBFqIk8gBEHgAPwKAAAgBiBXNwOQFCAGQbAWaiAJQaAC/AoAAEHRzsUALQAAGkHABEEIENYEIgdFDQkgByAFKQMANwMAIAdBKGogBUEoaikDADcDACAHQSBqIAVBIGopAwA3AwAgB0EYaiAFQRhqKQMANwMAIAdBEGogBUEQaikDADcDACAHQQhqIlAgBUEIaikDADcDACAHIAUpAzA3AzAgB0E4aiAFQThqKQMANwMAIAdBQGsgBUFAaykDADcDACAHQcgAaiAFQcgAaikDADcDACAHQdAAaiAFQdAAaikDADcDACAHQdgAaiAFQdgAaikDADcDACAHQYgBaiAFQYgBaikDADcDACAHQYABaiAFQYABaikDADcDACAHQfgAaiAFQfgAaikDADcDACAHQfAAaiAFQfAAaikDADcDACAHQegAaiAFQegAaikDADcDACAHIAUpA2A3A2AgByAFKQOQATcDkAEgB0GYAWogBUGYAWopAwA3AwAgB0GgAWogBUGgAWopAwA3AwAgB0GoAWogBUGoAWopAwA3AwAgB0GwAWogBUGwAWopAwA3AwAgB0G4AWogBUG4AWopAwA3AwAgByAFKQPAATcDwAEgB0HIAWogBUHIAWopAwA3AwAgB0HQAWogBUHQAWopAwA3AwAgB0HYAWogBUHYAWopAwA3AwAgB0HoAWogBUHoAWopAwA3AwAgB0HgAWogBUHgAWopAwA3AwAgByAFKQPwATcD8AEgB0H4AWogBUH4AWopAwA3AwAgB0GAAmogBUGAAmopAwA3AwAgB0GIAmogBUGIAmopAwA3AwAgB0GQAmogBUGQAmopAwA3AwAgB0GYAmogBUGYAmopAwA3AwAgByAFKQOgAjcDoAIgB0GoAmogBUGoAmopAwA3AwAgB0GwAmogBUGwAmopAwA3AwAgB0G4AmogBUG4AmopAwA3AwAgB0HAAmogBUHAAmopAwA3AwAgB0HIAmogBUHIAmopAwA3AwAgB0H4AmogBUH4AmopAwA3AwAgB0HwAmogBUHwAmopAwA3AwAgB0HoAmogBUHoAmopAwA3AwAgB0HgAmogBUHgAmopAwA3AwAgB0HYAmogBUHYAmopAwA3AwAgByAFKQPQAjcD0AIgByAFKQOAAzcDgAMgB0GIA2ogBUGIA2opAwA3AwAgB0GQA2ogBUGQA2opAwA3AwAgB0GYA2ogBUGYA2opAwA3AwAgB0GgA2ogBUGgA2opAwA3AwAgB0GoA2ogBUGoA2opAwA3AwAgB0HYA2ogBUHYA2opAwA3AwAgB0HQA2ogBUHQA2opAwA3AwAgB0HIA2ogBUHIA2opAwA3AwAgB0HAA2ogBUHAA2opAwA3AwAgB0G4A2ogBUG4A2opAwA3AwAgByAFKQOwAzcDsAMgByAFKQPgAzcD4AMgB0HoA2ogBUHoA2opAwA3AwAgB0HwA2ogBUHwA2opAwA3AwAgB0H4A2ogBUH4A2opAwA3AwAgB0GABGogBUGABGopAwA3AwAgB0GIBGogBUGIBGopAwA3AwAgB0G4BGogBUG4BGopAwA3AwAgB0GwBGogBUGwBGopAwA3AwAgB0GoBGogBUGoBGopAwA3AwAgB0GgBGogBUGgBGopAwA3AwAgByAFKQOQBDcDkAQgB0GYBGogBUGYBGopAwA3AwAgBykDACFXIAkgUEG4BPwKAAAgB0HABBDfBCAXIAZBgBBqKQMANwMAID8gIikDADcDACAeICEpAwA3AwAgRSAzKQMANwMAIAZByBtqIDIpAwA3AwAgECBOKQMANwMAIC8gBkG4EGopAwA3AwAgDyAGQcAQaikDADcDACAOIAZByBBqKQMANwMAIBMgBkHQEGopAwA3AwAgBiAGKQP4DzcDoBsgBiAGKQOoEDcDkBogEiAGQYARaikDADcDACAUIAZB+BBqKQMANwMAIBYgBkHwEGopAwA3AwAgHCAGQegQaikDADcDACAdIAZB4BBqKQMANwMAIAogTykDADcDACAIIAZBmBFqKQMANwMAIAsgBkGgEWopAwA3AwAgESAGQagRaikDADcDACANIAZBsBFqKQMANwMAIAYgBikD2BA3A8AaIAYgBikDiBE3A5ALICogBkHgEWopAwA3AwAgKyAGQdgRaikDADcDACAoIAZB0BFqKQMANwMAIDUgBkHIEWopAwA3AwAgNiAGQcARaikDADcDACAGQZgbaiAwKQMANwMAICMgGSkDADcDACAkIBopAwA3AwAgJSA4KQMANwMAIAYgBikDuBE3A8ALIAYgBikD0A83A/gaIEcgG0HgAPwKAAAgHyAEQeAA/AoAACBGIAZB0BJqKQMANwMAIEQgBkHYEmopAwA3AwAgQSAGQeASaikDADcDACBAIAZB6BJqKQMANwMAIDkgBkHwEmopAwA3AwAgBkGoGWogBkHAEmopAwA3AwAgBkGgGWogBkG4EmopAwA3AwAgBkGYGWogBkGwEmopAwA3AwAgBkGQGWogBkGoEmopAwA3AwAgBkGIGWogBkGgEmopAwA3AwAgBiAGKQPIEjcDsBkgBiAGKQOYEjcDgBkgJiAGQaATaikDADcDACAnIAZBmBNqKQMANwMAICkgBkGQE2opAwA3AwAgLCAGQYgTaikDADcDACAuIAZBgBNqKQMANwMAIBAgBkGwE2opAwA3AwAgLyAGQbgTaikDADcDACAPIAZBwBNqKQMANwMAIA4gBkHIE2opAwA3AwAgEyAGQdATaikDADcDACAGIAYpA/gSNwPgGSAGIAYpA6gTNwOQGiASIAZBgBRqKQMANwMAIBQgBkH4E2opAwA3AwAgFiAGQfATaikDADcDACAcIAZB6BNqKQMANwMAIB0gBkHgE2opAwA3AwAgBkH4GGogBkGQEmopAwA3AwAgBkHwGGogBkGIEmopAwA3AwAgBkHoGGogBkGAEmopAwA3AwAgBkHgGGogBkH4EWopAwA3AwAgBkHYGGogBkHwEWopAwA3AwAgBiAGKQPYEzcDwBogBiAGKQPoETcD0BggBCAGQdAYakHgAPwKAAAgBkHwC2ogTUHgAPwKAAAgBkHQDGogG0HgAPwKAAAgBiBXNwPwGiBIIARBoAL8CgAAIAQgBkGQFGogFRCbAiAJIAQQoAFB0c7FAC0AABpBwARBCBDWBCIERQ0JIAQgBikD0A83AwAgBCAGKQOAEDcDMCAEQShqIC0pAwA3AwAgBEEgaiAwKQMANwMAIARBGGogGSkDADcDACAEQRBqIBopAwA3AwAgBEEIaiA4KQMANwMAIARBOGogIikDADcDACAEQUBrICEpAwA3AwAgBEHIAGogMykDADcDACAEQdAAaiAyKQMANwMAIARB2ABqIDEpAwA3AwAgBEGIAWogBkHYEGopAwA3AwAgBEGAAWogBkHQEGopAwA3AwAgBEH4AGogBkHIEGopAwA3AwAgBEHwAGogBkHAEGopAwA3AwAgBEHoAGogBkG4EGopAwA3AwAgBCAGKQOwEDcDYCAEIAYpA+AQNwOQASAEQZgBaiAGQegQaikDADcDACAEQaABaiAGQfAQaikDADcDACAEQagBaiAGQfgQaikDADcDACAEQbABaiAGQYARaikDADcDACAEQbgBaiAGQYgRaikDADcDACAEQegBaiAGQbgRaikDADcDACAEQeABaiAGQbARaikDADcDACAEQdgBaiAGQagRaikDADcDACAEQdABaiAGQaARaikDADcDACAEQcgBaiAGQZgRaikDADcDACAEIAYpA5ARNwPAASAEQZgCaiAGQegRaikDADcDACAEQZACaiAGQeARaikDADcDACAEQYgCaiAGQdgRaikDADcDACAEQYACaiAGQdARaikDADcDACAEQfgBaiAGQcgRaikDADcDACAEIAYpA8ARNwPwASAEQcgCaiAGQZgSaikDADcDACAEQcACaiAGQZASaikDADcDACAEQbgCaiAGQYgSaikDADcDACAEQbACaiAGQYASaikDADcDACAEQagCaiAGQfgRaikDADcDACAEIAYpA/ARNwOgAiAEQfgCaiAGQcgSaikDADcDACAEQfACaiAGQcASaikDADcDACAEQegCaiAGQbgSaikDADcDACAEQeACaiAGQbASaikDADcDACAEQdgCaiAGQagSaikDADcDACAEIAYpA6ASNwPQAiAEQagDaiAGQfgSaikDADcDACAEQaADaiAGQfASaikDADcDACAEQZgDaiAGQegSaikDADcDACAEQZADaiAGQeASaikDADcDACAEQYgDaiAGQdgSaikDADcDACAEIAYpA9ASNwOAAyAEQdgDaiAGQagTaikDADcDACAEQdADaiAGQaATaikDADcDACAEQcgDaiAGQZgTaikDADcDACAEQcADaiAGQZATaikDADcDACAEQbgDaiAGQYgTaikDADcDACAEIAYpA4ATNwOwAyAEQYgEaiAGQdgTaikDADcDACAEQYAEaiAGQdATaikDADcDACAEQfgDaiAGQcgTaikDADcDACAEQfADaiAGQcATaikDADcDACAEQegDaiAGQbgTaikDADcDACAEIAYpA7ATNwPgAyAEQbgEaiAGQYgUaikDADcDACAEQbAEaiAGQYAUaikDADcDACAEQagEaiAGQfgTaikDADcDACAEQaAEaiAGQfATaikDADcDACAEQZgEaiAGQegTaikDADcDACAEIAYpA+ATNwOQBCAGKALAISIHBEAgBigCxCEgB0EwbBDfBAtBDCEJIAZBDDYCyCEgBiAENgLEISAGQQw2AsAhIAYoAtAGIgcEQCAGKALUBiAHQTBsEN8EC0GQAQwBCyAGKALEISEEIAYoAsghIglFDQUgCUEMbAshB0HRzsUALQAAGiAHQQQQ1gQiBUUNBSAEIQcgBSEKIAkhCANAIAZB8BpqIAcQ2AIgCkEIaiAGQfgaaigCADYCACAKIAYpAvAaNwIAIApBDGohCiAHQTBqIQcgCEEBayIIDQALDAYLIAZBADYC8BogBkEQaiAGQQxqIAZB8BpqQbCXwAAQlwQAC0GAkMAAQR5BoJDAABD+AwALIAZBADYC8BogBkGQFGogBkG0IWogBkHwGmpB0IrAABCXBAALIAZBADYC8BogBkGQFGogBkG0IWogBkHwGmpB4IrAABCXBAALQQAhCUEEIQUMAQtBBCAHQZSNwAAQyAQACyAGQfAaahAmIAYtAIghIQ0gBigC/CAiBwRAIAYoAoAhIAdBAnQQ3wQLAkAgBigC9BoiB0UNACAHIAdBDGxBE2pBeHEiCmpBCWoiB0UNACAGKALwGiAKayAHEN8ECyAGKALwHSIHQYCAgIB4RiAHRXJFBEAgBigC9B0gB0EC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QAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgECAfSQRAIBAgGWoiBC0AACIHDgIBAwILIBAgH0HQmMAAENkDAAsgEEUEQCAGQfAaaiAGQYAHaiARIDYgNCA7IDcgOiAGQbgGaiAGQcQGahDQASAGQeAJaiIHIAZB+BpqKQIANwMAIAYgBikC8Bo3A9gJIAYoAoAbIQogBigChBsgBigCiBshNiAGKAKAByIFBEAgBigChAcgBUEwbBDfBAsgBkGIB2ogBykDADcDACAGIAYpA9gJNwOAByATBEAgESATQcABbBDfBAshEQwfCyAQQQFrIhIgH08NAyAGIBIgGWotAAAiFToApwkgFUUEQEHRzsUALQAAGkHAAEEEENYEIgdFDSogBigCiAciBK1CMH4iUachCUEAIQogUUIgiKcgCUH4////B0tyDSggBigChAchEAJAIAlFBEAgByAENgIIQQghFSAHQQg2AgQgByAENgIAIAcgBDYCKCAHQQg2AiQgByAENgIgIAcgBDYCGCAHQQg2AhQgByAENgIQIAYoAowHIRgMAQtB0c7FAC0AABpBCCEKIAlBCBDWBCILRQ0pAkAgBEUNAEEAIQggBCENA0AgCCAJRg0BIAggC2oiBSAIIBBqIgopAwA3AwAgBUEoaiAKQShqKQMANwMAIAVBIGogCkEgaikDADcDACAFQRhqIApBGGopAwA3AwAgBUEQaiAKQRBqKQMANwMAIAVBCGogCkEIaikDADcDACAIQTBqIQggDUEBayINDQALCyAHIAQ2AgggByALNgIEIAcgBDYCACAGKAKMByEYQdHOxQAtAAAaIAlBCBDWBCILRQ0nAkAgBEUNAEEAIQggBCENA0AgCCAJRg0BIAggC2oiBSAIIBBqIgopAwA3AwAgBUEoaiAKQShqKQMANwMAIAVBIGogCkEgaikDADcDACAFQRhqIApBGGopAwA3AwAgBUEQaiAKQRBqKQMANwMAIAVBCGogCkEIaikDADcDACAIQTBqIQggDUEBayINDQALCyAHIAQ2AhggByALNgIUIAcgBDYCEEHRzsUALQAAGiAJQQgQ1gQiC0UNJwJAIARFDQBBACEIIAQhDQNAIAggCUYNASAIIAtqIgUgCCAQaiIKKQMANwMAIAVBKGogCkEoaikD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QRhqKQMANwMAIA9BEGogC0EQaikDADcDACAPQQhqIAtBCGopAwA3AwAgByALQTBqKQMANwMAIAdBCGogC0E4aikDADcDACAHQRBqIAtBQGspAwA3AwAgB0EYaiALQcgAaikDADcDACAHQSBqIAtB0ABqKQMANwMAIAdBKGogC0HYAGopAwA3AwAgEEEoaiALQYgBaikDADcDACAQQSBqIAtBgAFqKQMANwMAIBBBGGogC0H4AGopAwA3AwAgEEEQaiALQfAAaikDADcDACAQQQhqIAtB6ABqKQMANwMAIBAgC0HgAGopAwA3AwAgCiALQZABaikDADcDACAKQQhqIAtBmAFqKQMANwMAIApBEGogC0GgAWopAwA3AwAgCkEYaiALQagBaikDADcDACAKQSBqIAtBsAFqKQMANwMAIApBKGogC0G4AWopAwA3AwAgDSAPQeAA/AoAACApIBBB4AD8CgAAIBcgDUHAAfwKAAAgFkHAAWohFiAXQcABaiEXIA5BAWohDiAUQQFqIRQgGkEBayIaDQALCyAtIBQ2AgAgDUHABGokAAwBCyAOIAdB5PvAABDZAwALIAYoAtAPIRYgBigC1A8hDyAGKALYDyEtIBshDiAdIRQgHCEQIBVBAUcEQCAoIQ4gKyEUICohECAGKAKAC0GAgICAeEYNBwtB0c7FAC0AABpBwABBBBDWBCINRQ0pIAYoAogHIgStQjB+IlGnIQVBACEKIFFCIIinIAVB+P///wdLcg0kIAYoAoQHIR4CQCAFRQRAQQghGCAGKAKMByEXQQghC0EIIRVBCCEaDAELQdHOxQAtAAAaQQghCiAFQQgQ1gQiC0UNJQJAIAQEQCALIQogBSEIIB4hByAEIQkDQCAIBEAgCiAHKQMANwMAIApBKGogB0EoaikDADcDACAKQSBqIAdBIGopAwA3AwAgCkEYaiAHQRhqKQMANwMAIApBEGogB0EQaikDADcDACAKQQhqIAdBCGopAwA3AwAgCkEwaiEKIAhBMGshCCAHQTBqIQcgCUEBayIJDQELC0HRzsUALQAAGiAGKAKMByEXIAVBCBDWBCIVRQ0rQQAhCCAEIQkDQCAFIAhGDQIgCCAVaiIHIAggHmoiCikDADcDACAHQShqIApBKGopAwA3AwAgB0EgaiAKQSBqKQMANwMAIAdBGGogCkEYaikD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A3AgICANKQMANwIAIB4gEykDADcCACAqIBApAwA3AgAgKyAPKQMANwIAICggDikDADcCACAFIAUpA3A3AqwBIClBBDYCACApQQo2AjggKSAFKQIENwIEIClBDGogBUEMaikCADcCACApQRRqIAVBFGopAgA3AgAgKUEcaiAFQRxqKQIANwIAIClBJGogBUEkaikCADcCACApQSxqIAVBLGopAgA3AgAgKUE0aiAFQTRqKAIANgIAICkgBSkCqAE3AjwgKUHEAGogEikCADcCACApQcwAaiAHKQIANwIAIClB1ABqIAkpAgA3AgAgKUHcAGogCCkCADcCACApQeQAaiAEKQIANwIAIClB7ABqIAsoAgA2AgBB0c7FAC0AABpB8ABBCBDWBCIsRQ1RIBRBlanBAEHAABCDASAFLQCoAUEBRg0WIBYgCykDACJRNwEAIBwgBCkDACJSNwEAIB0gBykDACJVNwEAIBsgCSkDACJTNwEAIBUgCCkDACJWNwEAIBcgUjcBACAYIFE3AQAgBSAFKQOwASJUNwFAIAQgUTcDACAIIFI3AwAgCSBWNwMAIAcgUzcDACASIFU3AwAgBSBUNwOoASAwIAQpAwA3AgAgLSAIKQMANwIAIDEgCSkDADcCACAyIAcpAwA3AgAgMyASKQMANwIAIAUgBSkDqAE3AgggFEHVqcEAQcAAEIMBIAUtAKgBQQFGDRcgFiALKQMAIlE3AQAgHCAEKQMAIlI3AQAgHSAHKQMAIlU3AQAgGyAJKQMAIlM3AQAgFSAIKQMAIlY3AQAgFyBSNwEAIBggUTcBACAFIAUpA7ABIlQ3AUAgDSBRNwMAIBMgUjcDACAQIFY3AwAgDyBTNwMAIA4gVTcDACAFIFQ3A3AgICANKQMANwIAIB4gEykDADcCACAqIBApAwA3AgAgKyAPKQMANwIAICggDikDADcCACAFIAUpA3A3AqwBICxBBTYCACAsQQs2AjggLCAFKQIENwIEICxBDGogBUEMaikCADcCACAsQRRqIAVBFGopAgA3AgAgLEEcaiAFQRxqKQIANwIAICxBJGogBUEkaikCADcCACAsQSxqIAVBLGopAgA3AgAgLEE0aiAFQTRqKAIANgIAICwgBSkCqAE3AjwgLEHEAGogEikCADcCACAsQcwAaiAHKQIANwIAICxB1ABqIAkpAgA3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A0AjAEGQA2siCCQAIAhBADYCDCAIQoCAgICAATcCBCAIQQRqIglBjMbCABCcAyAIKAIEIAgoAggiByABKQPAATcDACAHQQhqIAFByAFqKQMANwMAIAdBEGogAUHQAWopAwA3AwAgB0EYaiABQdgBaikDADcDACAHQSBqIAFB4AFqKQMANwMAIAdBKGogAUHoAWopAwA3AwAgCEEBNgIMQQFGBEAgCUGcxsIAEJwDIAgoAgghBwsgByABQfABaiIJKQMANwMwIAdB2ABqIAlBKGopAwA3AwAgB0HQAGogCUEgaikDADcDACAHQcgAaiAJQRhqKQMANwMAIAdBQGsgCUEQaikDADcDACAHQThqIAlBCGopAwA3AwAgCEECNgIMIAhB0AFqIQkjAEHwAmsiByQAIAdB4ABqIAFBCGopAwA3AwAgB0HoAGogAUEQaikDADcDACAHQfAAaiABQRhqKQMANwMAIAdB+ABqIAFBIGopAwA3AwAgB0GAAWogAUEoaikDADcDACAHQZABaiABQThqKQMANwMAIAdBmAFqIAFBQGspAwA3AwAgB0GgAWogAUHIAGopAwA3AwAgB0GoAWogAUHQAGopAwA3AwAgB0GwAWogAUHYAGopAwA3AwAgByABKQMANwNYIAcgASkDMDcDiAEgB0GYAmoiNCAHQdgAahD3AyAHKAKcAiELIAcoApgCIRECQAJAAkAgBygCoAIiD0ECRgRAIAsoAgQhDyALKAIAIRIgNCALQQhqQdgA/AoAACARBEAgCyARQTBsEN8ECyAHQdAAaiAHQbgCaikDADcDACAHQcgAaiAHQbACaikDADcDACAHQUBrIAdBqAJqKQMANwMAIAdBOGogB0GgAmopAwA3AwAgB0EIaiAHQcgCaikDADcDACAHQRBqIAdB0AJqKQMANwMAIAdBGGogB0HYAmopAwA3AwAgB0EgaiAHQeACaikDADcDACAHQShqIAdB6AJqKQMANwMAIAcgBykDmAI3AzAgByAHKQPAAjcDACAHQcABaiABQeAAaiILQQhqKQMANwMAIAdByAFqIAtBEGopAwA3AwAgB0HQAWogC0EYaikDADcDACAHQdgBaiALQSBqKQMANwMAIAdB4AFqIAtBKGopAwA3AwAgB0HwAWogAUGYAWopAwA3AwAgB0H4AWogAUGgAWopAwA3AwAg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CyABKQMwIhMgAikDMCILUgRAIBMhCgwBCyARIQ0gASkDOCIKIRIgEyAKIAIpAzgiC1ENARoLIAogC1YNBSABKQMoIREgAikDKCENIAEpAzAhEyABKQM4IQogAikDOCESIAIpAzALIgwgE30iECAKIBJWrSIPfSELIA0gEX0iFSAMIBNUIA8gEFZyrSIMfSETIA0gEVQgDCAVVnIhBCAUIA59IQ8gEiAKfSEKDAcLIANBsAlqEEkgB0UEQCADQcgJaiEEIAMpA7gJIRUgAykDsAkhGCADKQPACQwGCyADKALgC0EBcQ0EQez2wQAQ6AQAC0GA9sEAQTNB3PbBABD+AwALIAAgBzoAQCAAIAIpAyA3AyAgACACKQMANwMAIABBOGogAkE4aikDADcDACAAQTBqIAJBMGopAwA3AwAgAEEoaiACQShqKQMANwMAIABBCGogAkEIaikDADcDACAAQRBqIAJBEGopAwA3AwAgAEEYaiACQRhqKQMANwMADAYLIAAgBzoAQCAAIAEpAyA3AyAgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBCGogAUEIaikDADcDACAAQRBqIAFBEGopAwA3AwAgAEEYaiABQRhqKQMANwMADAULIAEpAzAiCiACKQMwIhFUIAogEX0iCiABKQM4IhEgAikDOCIMVK0iC1RyrSINIAEpAygiEiACKQMoIhB9Ig9Cf4V8IhUgCkJ/hSALfCIKIBEgDH0iEUJtVq0iDFStIgt9IRMgCyAVViEEIAogDH0hCyAQIBJWIA0gD1ZyrSAUIA59fEL///////////8AfCEPQm0gEX0hCgwCCyADQYAMaiEEIAMpA/ALIRUgAykD6AshGCADKQP4CwshEiAEKQMAIRkgA0HADmpCADcDACADQbgOakIANwMAIANCADcDsA4gA0LyADcDyA4gA0GwCGogASkDECIUQgAgASkDGCIRQgAQyQMgA0GQCGogASkDCCITQgAgEUIAEMkDIANBsAdqIAEpAwAiCkIAIBFCABDJAyADQYAIaiATQgAgFEIAEMkDIANBwAdqIApCACAUQgAQyQMgA0HQB2ogCkIAIBNCABDJAyADQfAIaiARQgAgEUIAEMkDIANBoAhqIBRCACAUQgAQyQMgA0HwB2ogE0IAIBNCABDJAyADQeAHaiAKQgAgCkIAEMkDIANB4AhqIAMpA/AIIhdCm5Svw/K1qN6Gf34iCkIAQm1CABDJAyADQdAIaiAKQgBCf0IAEMkDIANBwAhqIApCAEL///////////8AQgAQyQMgAykD2AcgAykDyAcgAykDuAcgAykDmAggAykDuAgiDCADKQOQCHwiCiAMVK18IgsgAykDsAd8IgwgC1StfCINIAMpA8AHfCILIA1UrXwgCyADKQOICCAMIAwgAykDgAh8IgxWrXx8Ig0gC1StfCILIAMpA9AHfCIOIAtUrXwiC0I/iCADKQPoByADKQPgByIPIAtCAYYgDkI/iIR8IhAgD1StfCAQIAMpA/gHIAMpA6gIIAMpA6AIIg8gCkIBhiADKQOwCCIWQj+IhHwiCyAPVK18IAsgAykD+AgiDyAWQgGGfCIWIA9UrXwiGiALVK18IgsgDEIBhiAKQj+IhHwiGyALVK0iCyADKQPwB3wiCiALVK18IAogDUIBhiAMQj+IhHwiCyAKVK18IgogDkIBhiANQj+IhHwiDyAKVK18Ig4gEFStfHwhCgJ/AkAgAykDyAggAykD2AgiDSANIAMpA+gIIAMpA+AIIgwgF0J9g3wgDFStfCIQIAMpA9AIIhd8IgwgEFStfCAMIAwgFnwiDFatfCIQIBd8Ig0gEFStfCANIBp8IhAgDVStfCIXIAMpA8AIfCINIBdUrXwgDSAbfCIXIA1UrXwiDVANACALIA18IgsgDVQiBEUNACAErSINIA98Ig8gDVoNACANIA9WrSINIA58Ig4gDVoNACANIA5WrSINIAp8IgogDVQMAQtBAAshBCADQaAHaiAMQpuUr8Pytajehn9+Ig1CAEJtQgAQyQMgA0GQB2ogDUIAQn9CABDJAyADQYAHaiANQgBC////////////AEIAEMkDAkAgAykDiAcgAykDmAciDSANIAMpA6gHIAwgAykDoAciDHwgDFStfCIWIAMpA5AHIhp8IgwgFlStfCAMIBB8Ig0gDFStfCIQIBp8IgwgEFStfCAMIBd8IhAgDFStfCIXIAMpA4AHfCIMIBdUrXwgCyAMfCIXIAxUrXwiDFANACAMIA98Ig8gDFoNACAMIA9WrSIMIA58Ig4gDFoNACAMIA5WrSIMIAp8IgogDFQhBgsgA0HwBmogDUKblK/D8rWo3oZ/fiIMQgBCbUIAEMkDIANB4AZqIAxCAEJ/QgAQyQMgA0HQBmogDEIAQv///////////wBCABDJAyADKQPYBiADKQPoBiILIAsgAykD+AYgAykD8AYiDCANfCAMVK18Ig0gAykD4AYiFnwiDCANVK18IAwgDCAQfCIMVq18Ig0gFnwiCyANVK18IAsgF3wiDSALVK18IhAgAykD0AZ8IgsgEFStfCALIA98IhAgC1StfCILUEUEQCALIA58Ig4gC1QiBa0iCyAKfCIPIAogBRshCiAFIAsgD1ZxIQULIANBwAZqIAxCm5Svw/K1qN6Gf34iC0IAQm1CABDJAyADQbAGaiALQgBCf0IAEMkDIANBoAZqIAtCAEL///////////8AQgAQyQMgAykDqAYgAykDuAYiCyALIAMpA8gGIAwgAykDwAYiDHwgDFStfCIPIAMpA7AGIhd8IgwgD1StfCAMIA18Ig8gDFStfCILIBd8IgwgC1StfCAMIBB8Ig0gDFStfCILIAMpA6AGfCIMIAtUrXwgDCAOfCILIAxUrXwiDCAKfCIOIAogDEIAUiIIGyEKAkACQCAEIAZyIAVyIAwgDlYiBK0gDCAIG0IAUnIgBCAIcSAKQgBTcnJFBEBC////////////ACEQIApC////////////AFIgC0J/UnIgDUJ/UnINAkJ/IQ5CfyEMIA9CbVQNAgwBCyAKIRAgCyEOIA0hDAsgDEIBfCIKIA9CbVStIgt9IQ0gDkIBfCIXIAxCf1IgCiALVHKtIgp9IQsgECAOQn9SIAogF1ZyrX1C////////////AH0hCiAPQhN8IQ8LIAMgDzcDiA8gAyANNwOADyADIAs3A/gOIAMgCjcD8A4gA0GQDmogA0GwDmogA0HwDmoQfCADKQOQDiIPIBh8IgwgAykDmA4iCiAVfCILIApUIAsgAykDoA4iCiASfCINIApUIA0gDSADKQOoDiIOIBl8IgogDlStfCINVnKtfCIQIAtUcq18IQ4CQAJAAkAgDCAPVCAMIA5Wcg0AQv///////////wAhCyAOIgxC////////////AFEEQEJ/IQtC////////////ACEMIBBCf1INAiANQn9SBEAgDSESDAQLQm0hCyAKIQwgCkJtUQ0BCyALIAxYDQAgDiEMDAELIA1CAXwiDCAKQm1UrSILfSESIBBCAXwiDyANQn9SIAsgDFZyrSIMfSELIA4gEEJ/UiAMIA9Wcq19Qv///////////wB9IQwgCkITfCEKDAELIBAhCyANIRILIAMgCjcDiA4gAyASNwOADiADIAs3A/gNIAMgDDcD8A0gA0GAD2pCADcDACADQfgOakIANwMAIANCADcD8A4gA0LMADcDiA8gA0HQDmoiBCADQfAOaiAJEHwgA0GICWogA0HwDWogBBBcIAMoAtwNIgQEQCADKALgDSAEQQJ0EN8ECwJAIAMoApQLIgRFDQAgBCAEQQxsQRNqQXhxIgZqQQlqIgRFDQAgAygCkAsgBmsgBBDfBAsgAygCwAsiBEGAgICAeEYgBEVyDQEgAygCxAsgBEECdBDfBAwBCyADIAo3A4gPIAMgCzcDgA8gAyATNwP4DiADIA8gBK19NwPwDiABKQMAIgohESACKQMAIhIhDiADAn4CQAJ+AkAgCiASUg0AIAEpAwgiEyACKQMIIg5SBEAgEyERDAELIAEpAxAiFCACKQMQIg5SBEAgFCERDAELIBMhDSABKQMYIhEhDCAUIBEgAikDGCIOUQ0BGgsgDiARVA0BIAEpAwghEyACKQMIIQ0gASkDECEUIAEpAxghESACKQMYIQwgAikDEAsiCyAUfSIQIAwgEVStIg99IQ4gDSATfSIVIAsgFFQgDyAQVnKtIhB9IQsgDSATVCAQIBVWciEEIBIgCn0hCiAMIBF9DAELIAEpAxAiFCACKQMQIhFUIBQgEX0iDCABKQMYIhEgAikDGCILVK0iDVRyrSIQIAEpAwgiEyACKQMIIg99IhVCf4V8Ig4gDEJ/hSANfCIMIBEgC30iDUJtVq0iGFStIhl9IQsgDiAZVCEEIAwgGH0hDiAPIBNWIBAgFVZyrSASIAp9fEL///////////8AfCEKQm0gDX0LNwPICSADIA43A8AJIAMgCzcDuAkgAyAKIAStfTcDsAkgA0GICWogA0HwDmogA0GwCWoQXAsgAygCiAkEQCADIAMpA5gJNwO4CSADIAMpA5AJNwOwCUGM98EAQSsgA0GwCWpB/PbBAEG498EAEMoDAAsgA0GwBWogAykDqAkiFUIAIAMpA6AJIhhCABDJAyADQaAFaiAVQgAgAykDmAkiGUIAEMkDIANBkAVqIBVCACADKQOQCSIXQgAQyQMgA0HgBWogGEIAIBlCABDJAyADQdAFaiAYQgAgF0IAEMkDIANBgAZqIBlCACAXQgAQyQMgA0GABWogFUIAIBVCABDJAyADQcAFaiAYQgAgGEIAEMkDIANB8AVqIBlCACAZQgAQyQMgA0GQBmogF0IAIBdCABDJAyADQfAEaiADKQOABSIPQpuUr8Pytajehn9+IgpCAEJtQgAQyQMgA0HgBGogCkIAQn9CABDJAyADQdAEaiAKQgBC////////////AEIAEMkDIAMpA4gGIAMpA9gFIAMpA5gFIAMpA6gFIAMpA7gFIgwgAykDoAV8IgogDFStfCILIAMpA5AFfCIMIAtUrXwiDSADKQPQBXwiCyANVK18IAsgCyADKQPoBSAMIAwgAykD4AV8IgxWrXx8IgtWrXwiDiADKQOABnwiDSAOVK18Ig5CP4ggAykDmAYgAykDkAYiEiAOQgGGIA1CP4iEfCIOIBJUrXwgDiADKQP4BSADKQPIBSADKQPABSIQIApCAYYgAykDsAUiFkI/iIR8IhIgEFStfCASIAMpA4gFIhAgFkIBhnwiFiAQVK18IhogElStfCISIAxCAYYgCkI/iIR8IhsgElStIhIgAykD8AV8IgogElStfCAKIAtCAYYgDEI/iIR8IhAgClStfCIKIA1CAYYgC0I/iIR8IhIgClStfCIMIA5UrXx8IQ1BACEFAn8CQCADKQPYBCADKQPoBCILIAsgAykD+AQgDyADKQPwBCIKfCAKVK18Ig4gAykD4AQiD3wiCiAOVK18IAogCiAWfCIKVq18Ig4gD3wiCyAOVK18IAsgGnwiDiALVK18Ig8gAykD0AR8IgsgD1StfCALIBt8Ig8gC1StfCILUA0AIAsgEHwiECALVCIERQ0AIAStIgsgEnwiEiALWg0AIAsgElatIgsgDHwiDCALWg0AIAsgDFatIgsgDXwiDSALVAwBC0EACyEGIANBwARqIApCm5Svw/K1qN6Gf34iC0IAQm1CABDJAyADQbAEaiALQgBCf0IAEMkDIANBoARqIAtCAEL///////////8AQgAQyQMCQCADKQOoBCADKQO4BCILIAsgAykDyAQgCiADKQPABCIKfCAKVK18IhYgAykDsAQiGnwiCiAWVK18IAogDnwiCyAKVK18Ig4gGnwiCiAOVK18IAogD3wiDiAKVK18Ig8gAykDoAR8IgogD1StfCAKIBB8IhAgClStfCIKUA0AIAogEnwiEiAKWg0AIAogElatIgogDHwiDCAKWg0AIAogDFatIgogDXwiDSAKVCEFCyADQZAEaiALQpuUr8Pytajehn9+IgpCAEJtQgAQyQMgA0GABGogCkIAQn9CABDJAyADQfADaiAKQgBC////////////AEIAEMkDQQAhBCADKQP4AyADKQOIBCIPIA8gAykDmAQgAykDkAQiCiALfCAKVK18IgsgAykDgAQiFnwiCiALVK18IAogCiAOfCIKVq18Ig4gFnwiCyAOVK18IAsgEHwiDiALVK18IhAgAykD8AN8IgsgEFStfCALIBJ8IhAgC1StfCILUEUEQCALIAx8IgwgC1QiBK0iCyANfCISIA0gBBshDSAEIAsgElZxIQQLIANB4ANqIApCm5Svw/K1qN6Gf34iC0IAQm1CABDJAyADQdADaiALQgBCf0IAEMkDIANBwANqIAtCAEL///////////8AQgAQyQMgAykDyAMgAykD2AMiCyALIAMpA+gDIAogAykD4AMiCnwgClStfCISIAMpA9ADIg98IgogElStfCAKIA58IhIgClStfCILIA98IgogC1StfCAKIAogEHwiClatfCIOIAMpA8ADfCILIA5UrXwgCyAMfCIQIAtUrXwiDCANfCILIA0gDEIAUiIIGyENAkACQCAFIAZyIARyIAsgDFQiBK0gDCAIG0IAUnIgBCAIcSANQgBTcnJFBEBC////////////ACELIA1C////////////AFIgEEJ/UnIgCkJ/UnINAkJ/IQxCfyEOIBJCbVQNAgwBCyANIQsgECEMIAohDgsgDkIBfCINIBJCbVStIhB9IQogDEIBfCIPIA5Cf1IgDSAQVHKtIg19IRAgCyAMQn9SIA0gD1ZyrX1C////////////AH0hDSASQhN8IRILIAEpAwAiDyEOIAMCfgJAAkAgDyANIgtSDQAgEyIOIBAiC1INACAKIQsgCiAUIg5SDQAgESIOIBIiC1ENAQsgCyAOWg0AIAogFFYgFCAKfSIKIBEgElStIgxUcq0iCyATIBB9IhZCf4V8Ig4gCkJ/hSAMfCIKIBEgEn0iEUJtVq0iDFStIhJ9IRQgDiASVCEEIAogDH0hDiAQIBNWIAsgFlZyrSANIA99fEL///////////8AfCETQm0gEX0MAQsgCiAUfSIMIBEgElatIgt9IQ4gECATfSIWIAogFFQgCyAMVnKtIgp9IRQgECATVCAKIBZWciEEIA0gD30hEyASIBF9CzcDyAkgAyAONwPACSADIBQ3A7gJIAMgEyAErX03A7AJIANBiAlqIANBsAlqIAIQyAIgASkDGCENIAEpAxAhEyABKQMIIQwgAykDiAkiEiERIANB8AJqAn4CQAJ+AkAgEiAPIgpSDQAgDCIKIAMpA5AJIhFSDQAgEyIKIAMpA5gJIhFSDQAgCiELIAwgDSIKIhQgAykDoAkiEVENARoLIAMpA6AJIRQgCiARVA0BIAMpA5gJIQsgAykDkAkLIQ4gEyALfSIKIA0gFFStIhB9IREgDCAOfSIWIAogEFQgCyATVnKtIgp9IRMgDCAOVCAKIBZWciECIA8gEn0hDiANIBR9DAELIAMpA5gJIgogE1QgCiATfSIKIA0gFFatIhFUcq0iCyADKQOQCSIOIAx9IhBCf4V8IhYgCkJ/hSARfCIKIBQgDX0iDUJtVq0iEVStIhR9IRMgFCAWViECIAogEX0hESAMIA5WIAsgEFZyrSAPIBJ9fEL///////////8AfCEOQm0gDX0LIg1CACAVQgAQyQMgA0GwAmogDUIAIBhCABDJAyADQaACaiANQgAgGUIAEMkDIANBkAJqIA1CACAXQgAQyQMgA0HgAmogAykD8AIiDEKblK/D8rWo3oZ/fiIKQgBCbUIAEMkDIANB0AJqIApCAEJ/QgAQyQMgA0HAAmogCkIAQv///////////wBCABDJAyADQYACaiARQgAgFUIAEMkDIANBwAFqIBFCACAYQgAQyQMgA0GwAWogEUIAIBlCABDJAyADQaABaiARQgAgF0IAEMkDIANB8AFqIAMpA9ACIgogAykD+AIiFCADKQOwAnwiEnwiESADKQPoAiAMIAMpA+ACIgt8IAtUrXx8IgwgAykDgAJ8IgtCm5Svw/K1qN6Gf34iDUIAQm1CABDJAyADQeABaiANQgBCf0IAEMkDIANB0AFqIA1CAEL///////////8AQgAQyQMgA0GQAWogE0IAIBVCABDJAyADQdAAaiATQgAgGEIAEMkDIANBEGogE0IAIBlCABDJAyADIBNCACAXQgAQyQMgA0GAAWogAykDiAIgCyAMVK18Ig8gAykDwAF8Ig0gCiADKQO4AiASIBRUrXwiECADKQOgAnwiE3wiFCAMIBFUrSADKQPYAiIWIAogEVatfHx8Ihp8IhEgAykD4AEiG3wiDCADKQP4ASADKQPwASIKIAt8IApUrXx8IgsgAykDkAF8IhJCm5Svw/K1qN6Gf34iCkIAQm1CABDJAyADQfAAaiAKQgBCf0IAEMkDIANB4ABqIApCAEL///////////8AQgAQyQMgA0GwA2ogDiACrX0iCkIAIBVCABDJAyADQaADaiAKQgAgGEIAEMkDIANBkANqIApCACAZQgAQyQMgA0GAA2ogCkIAIBdCABDJAyADQUBrIAMpA5gBIAsgElatfCIYIAMpA1B8IgogGyADKQOoAiAQIBNWrXwiGSADKQOQAnwiDiADKQPAAnwiECAUIBpWrSAWIBMgFFatfHx8IhMgAykDsAF8IhQgDSARVq0gAykDyAEgDSAPVK18fHwiDXwiDyALIAxUrSADKQPoASIXIAwgEVStfHx8IhZ8IhEgAykDcCIafCIMIAMpA4gBIAMpA4ABIgsgEnwgC1StfHwiCyADKQOwA3wiEkKblK/D8rWo3oZ/fiIVQgBCbUIAEMkDIANBMGogFUIAQn9CABDJAyADQSBqIBVCAEL///////////8AQgAQyQMCQAJAIAMpAyggAykDaCADKQPYASAQIBNWrSADKQPIAiAOIBBWrXx8IhUgAykDmAIgDiAZVK18fCIOIAMpA6ABfCIQIA0gFFStIAMpA7gBIBMgFFatfHx8IhMgAykD0AF8IhQgE1StfCAUIA8gFlatIBcgDSAPVq18fHwiDSAUVK18Ig8gECATVq0gAykDqAEgDiAQVq18fCIQIA4gFVStfCIVfCITIAMpAwB8Ig4gAykDGCANIA0gAykDEHwiDVatfCANIAogEVatIAMpA1ggCiAYVK18fHwiCiANVK18fCINIAMpA2B8IhQgDVStfCAUIAMpA3giGCAKIAogGnwiClatfCAKIAsgDFStIBggDCARVK18fHwiGCAKVK18fCIKIBRUrXwiFCANIA5UrSADKQMIIA4gE1StfHwiGSAPIBNWrSAQIBVWrXx8IhB8IhEgAykDgAN8Ig0gAykDmAMgCiAKIAMpA5ADfCIKVq18IAogCiADKQOoAyADKQO4AyALIBJWrXwiCyADKQOgA3wiDCALVK18IAwgDCAYfCIMVq18fCIKVq18fCITIAMpAyB8IgsgE1StfCALIAsgAykDOCIPIAogAykDMCIVfCIOIApUrXwgDiAPIAwgFXwiCiAMVK18IAogCiADKQNIIAMpA0AiDCASfCAMVK18fCIKVq18fCIMIA5UrXx8IgtWrXwiDiANIBNWrSADKQOIAyANIBFUrXx8Ig0gESAUVK0gECAZVK18fCIRfCIPIA5UIA0gEVZyIA9CAFNyRQRAIAsgDINCf1IgCkJtVHIgD0L///////////8AUnINAQsgDEIBfCINIApCbVStIhN9IREgC0IBfCIUIAxCf1IgDSATVHKtIgx9IQ4gDyALQn9SIAwgFFZyrX1C////////////AH0hDyAKQhN8IQoMAQsgDCERIAshDgsgAyAKNwPICSADIBE3A8AJIAMgDjcDuAkgAyAPNwOwCSAAQSBqIANBsAlqIAFBIGoQyAIgAEEYaiADQaAJaikDADcDACAAQRBqIANBmAlqKQMANwMAIABBCGogA0GQCWopAwA3AwAgACADKQOICTcDACAAIAc6AEALIANBkA9qJAAL30sCBX8XfiMAQZARayICJAAgAkHID2oiBEHc4MAAEK4CAkACQAJAAkAgASAEQSAQ8QMEQCAEQZzhwAAQrgIgASACQcgPakEgEPEDRQ0BIAJBATYCzA8gAkH048AANgLIDyACQgE3AtQPIAIgAa1CgICAgPABhDcDiA4gAiACQYgOajYC0A8gAEEIaiAEENICIABCAjcDAAwECyACQcgPakHg58AAQd8AEKYCQSghAyACKQPIDyEQIAIpA9APIRIgAikD2A8hFCACKQPgDyEVIAIpA+gPIRYgAikD8A8hFwNAIAJBwAJqIANBqJ/AAGopAwAiB0IAIBdCABDJAyACQdACaiAHQgAgFkIAEMkDIAJB4AJqIAdCACAVQgAQyQMgAkHwAmogB0IAIBRCABDJAyACQYADaiAHQgAgEkIAEMkDIAJBkANqIAdCACAQQgAQyQMgAkGwAmogAikDwAIiEyAPfCIJQgBCAEL9//P/z///+Yl/EMkDIAJBoAJqIAIpA7gCIgdCAEKr1f7///+//7l/QgAQyQMgAkGQAmogB0IAQv//z4rr///VHkIAEMkD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QCANIQcgCCERIAohDCALIRJCms3/y6O9xIAaIQ4MBAsgCkK/pZScz/DSu+QAVg0CQtfZrprk9umNywAhEiAKQr+llJzP8NK75ABSBEAgDSEHIAghESAKIQxCms3/y6O9xIAaIQ4MBAsgCEKk7MO1j9S0mOcAVg0CQr+llJzP8NK75AAhDCAIQqTsw7WP1LSY5wBSBEAgDSEHIAghEUKazf/Lo73EgBohDgwECyANQv//z4rr///VHlYNAkKk7MO1j9S0mOcAIREgDUL//8+K6///1R5RDQEgDSEHQprN/8ujvcSAGiEODAMLIA0hByAIIREgCiEMIAshEgwCC0L//8+K6///1R4hByAPQqvV/v///7//uX9aDQBCms3/y6O9xIAaIQ4MAQsgDUL//8+K6///1R59IgkgD0Kr1f7///+//7l/VK0iDH0hByAIQqTsw7WP1LSY5wB9IhMgDUL//8+K6///1R5UIAkgDFRyrSIJfSERIApCv6WUnM/w0rvkAH0iDSAIQqTsw7WP1LSY5wBUIAkgE1ZyrSIIfSEMIAtC19mumuT26Y3LAH0iCSAKQr+llJzP8NK75ABUIAggDVZyrSIIfSESIA4gC0LX2a6a5PbpjcsAVCAIIAlWcq19QprN/8ujvcSAGn0hDiAPQtWqgYCAgMCAxgB8IQ8LIAIgDzcDwAwgAiAHNwO4DCACIBE3A7AMIAIgDDcDqAwgAiASNwOgDCACIA43A5gMIAJByA9qIAJB6AtqIAJBmAxqQQAQMSACLQCoEEECRgRAIAJBkA5qIAJB0A9qKAIANgIAIAIgAikDyA83A4gOQYSdwABBKyACQYgOakHYq8AAQfTpwAAQygMACyACQYgOaiIFIAJByA9qIgRB6AD8CgAAIARBnunAABCuAkEAIQRB0c7FAC0AABpBFEEBENYEIgMEQCADQRBqQe7pwAAoAAA2AAAgA0EIakHm6cAAKQAANwAAIANB3unAACkAADcAACACQYALaiAFQegA/AoAACACQaAKaiABQRhqKQAANwMAIAJBmApqIAFBEGopAAA3AwAgAkGQCmogAUEIaikAADcDACACQfAJaiACQdAPaikAADcDACACQfgJaiACQdgPaikAADcDACACQYAKaiACQeAPaikAADcDACACIAEpAAA3A4gKIAIgAikAyA83A+gJQR4hAUGKseH4BSEFQgAhEkEUIQYMAQtBAUEUQYSkwAAQyAQACyAAIBI3AwAgAEEIaiACQYALakHoAPwKAAAgAEHwAGogAkGoCmpB2AD8CgAAIAAgBDoAnAIgACAFNgKYAiAAIAE2ApQCIAAgBjYCkAIgACADNgKMAiAAIAY2AogCIABB4AFqIAJBoApqKQMANwMAIABB2AFqIAJBmApqKQMANwMAIABB0AFqIAJBkApqKQMANwMAIAAgAikDiAo3A8gBIAAgAikD6Ak3A+gBIABB8AFqIAJB8AlqKQMANwMAIABB+AFqIAJB+AlqKQMANwMAIABBgAJqIAJBgApqKQMANwMACyACQZARaiQAC5RGAgd/EX4jAEHQEGsiAyQAAkACQAJAAn8CQAJAAkACQCABLQBAIgcgAi0AQEYEQCABQejRwQBBIBDxA0UEQCABQSBqQejRwQBBIBDxA0UNAgsgAkHo0cEAQSAQ8QNFBEAgAkEgakHo0cEAQSAQ8QNFDQMLAkAgASACQSAQ8QNFBEAgAUEgaiIJIAJBIGpBIBDxA0UNASAAQgA3AwAgACAHOgBAIABBOGpCADcDACAAQTBqQgA3AwAgAEEoakIANwMAIABBIGpCADcDACAAQRhqQgA3AwAgAEEQakIANwMAIABBCGpCADcDAAwKCyABKQMgIg8hDSACKQMgIg4hDAJ+AkAgDiAPUg0AIAEpAygiECACKQMoIgxSBEAgECENDAELIAEpAzAiCiACKQMwIgxSBEAgCiENDAELIBAhEiABKQM4Ig0hCyAKIA0gAikDOCIMUQ0BGgsgDCANVA0FIAEpAyghECACKQMoIRIgASkDMCEKIAEpAzghDSACKQM4IQsgAikDMAsiESAKfSIVIAsgDVStIhZ9IQwgEiAQfSIXIBUgFlQgCiARVnKtIhF9IQogESAXViAQIBJWciEEIA4gD30hDiALIA19IQ0MBwsgA0HwCmoQOiAHRQRAIAMpA4ALIRUgAykD+AohFiADKQPwCiEXIANBiAtqDAYLIAMoAqANQQFxDQRB7PbBABDoBAALQYD2wQBBM0Hc9sEAEP4DAAsgACAHOgBAIAAgAikDIDcDICAAIAIpAwA3AwAgAEE4aiACQThqKQMANwMAIABBMGogAkEwaikDADcDACAAQShqIAJBKGopAwA3AwAgAEEIaiACQQhqKQMANwMAIABBEGogAkEQaikDADcDACAAQRhqIAJBGGopAwA3AwAMBgsgACAHOgBAIAAgASkDIDcDICAAIAEpAwA3AwAgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEIaiABQQhqKQMANwMAIABBEGogAUEQaikDADcDACAAQRhqIAFBGGopAwA3AwAMBQtC3bCFjOi2kai4fyABKQMoIhAgAikDKCILfSIRIAEpAzAiCiACKQMwIgxUIAogDH0iCiABKQM4IgwgAikDOCISVK0iDVRyrSIVfSIWfSIXIAogDX0iCkKR4eXNh4n6mShWQpHh5c2HifqZKCAKfSINIAwgEn0iEkKBgICAv7L98MMAVq0iDFRyrSIYfSEKIBcgGFQgFkLdsIWM6LaRqLh/VnIhBCANIAx9IQwgESAVVCALIBBWcq0gDiAPfXxCqcDGia7Ok7IwfCEOQoGAgIC/sv3wwwAgEn0hDQwCCyADKQO4DSEVIAMpA7ANIRYgAykDqA0hFyADQcANagspAwAhGCADQvH////OiqfhBTcDiBAgA0L9zonxjfjY+qR/NwOAECADQoqlr8vmyfqlMzcD+A8gA0KOu97wzOjZjyo3A/APIANB4AlqIAEpAxAiEUIAIAEpAxgiEEIAEMkDIANBwAlqIAEpAwgiEkIAIBBCABDJAyADQeAIaiABKQMAIgpCACAQQgAQyQMgA0GwCWogEkIAIBFCABDJAyADQfAIaiAKQgAgEUIAEMkDIANBgAlqIApCACASQgAQyQMgA0GwCmogEEIAIBBCABDJAyADQdAJaiARQgAgEUIAEMkDIANBoAlqIBJCACASQgAQyQMgA0GQCWogCkIAIApCABDJAyADQaAKaiADKQOwCiITQv////++sv3wQn4iCkIAQoGAgIC/sv3wwwBCABDJAyADQZAKaiAKQgBCkeHlzYeJ+pkoQgAQyQMgA0GACmogCkIAQt2whYzotpGouH9CABDJAyADQfAJaiAKQgBCqcDGia7Ok7IwQgAQyQMgAykDiAkgAykD+AggAykD6AggAykDyAkgAykD6AkiCyADKQPACXwiCiALVK18IgwgAykD4Ah8IgsgDFStfCINIAMpA/AIfCIMIA1UrXwgDCAMIAMpA7gJIAsgCyADKQOwCXwiC1atfHwiDFatfCIPIAMpA4AJfCINIA9UrXwiD0I/iCADKQOYCSADKQOQCSIOIA9CAYYgDUI/iIR8Ig8gDlStfCAPIA8gAykDqAkgAykD2AkgAykD0AkiFCAKQgGGIAMpA+AJIhlCP4iEfCIOIBRUrXwgDiADKQO4CiIUIBlCAYZ8IhkgFFStfCIUIA5UrXwiDiALQgGGIApCP4iEfCIaIA5UrSIOIAMpA6AJfCIKIA5UrXwgCiAMQgGGIAtCP4iEfCILIApUrXwiCiANQgGGIAxCP4iEfCIMIApUrXwiD1atfHwhDQJ/AkAgAykD+AkgAykDiAogAykDmAogAykDqAogAykDoAoiCiATQn2DfCAKVK18Ig4gAykDkAp8IgogDlStfCAKIBl8Ig4gClStfCITIAMpA4AKfCIKIBNUrXwgCiAUfCITIApUrXwiFCADKQPwCXwiCiAUVK18IAogGnwiFCAKVK18IgpQDQAgCiALfCILIApUIgRFDQAgBK0iCiAMfCIMIApaDQAgCiAMVq0iCiAPfCIPIApaDQAgCiAPVq0iCiANfCINIApUDAELQQALIQQgA0HQCGogDkL/////vrL98EJ+IgpCAEKBgICAv7L98MMAQgAQyQMgA0HACGogCkIAQpHh5c2HifqZKEIAEMkDIANBsAhqIApCAELdsIWM6LaRqLh/QgAQyQMgA0GgCGogCkIAQqnAxomuzpOyMEIAEMkDAkAgAykDqAggAykDuAggAykDyAggAykD2AggAykD0AgiCiAOfCAKVK18Ig4gAykDwAh8IgogDlStfCAKIBN8Ig4gClStfCITIAMpA7AIfCIKIBNUrXwgCiAUfCITIApUrXwiFCADKQOgCHwiCiAUVK18IAogC3wiFCAKVK18IgpQDQAgCiAMfCIMIApaDQAgCiAMVq0iCiAPfCIPIApaDQAgCiAPVq0iCiANfCINIApUIQYLIANBkAhqIA5C/////76y/fBCfiIKQgBCgYCAgL+y/fDDAEIAEMkDIANBgAhqIApCAEKR4eXNh4n6mShCABDJAyADQfAHaiAKQgBC3bCFjOi2kai4f0IAEMkDIANB4AdqIApCAEKpwMaJrs6TsjBCABDJAyADKQPoByADKQP4ByADKQOICCADKQOYCCADKQOQCCIKIA58IApUrXwiCyADKQOACHwiCiALVK18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fCIUIAtUrXwiC1ANACALIA58Ig4gC1QiBEUNACAErSILIAx8IgwgC1oNACALIAxWrSILIA98Ig8gC1oNACALIA9WrSILIAp8IgogC1QMAQtBAAshBiADQbAFaiANQonHmaSu8IHph39+IgtCAELH+vPD7YKjkDxCABDJAyADQaAFaiALQgBCjZXHw5bS2sCXf0IAEMkDIANBkAVqIAtCAELdsIWM6LaRqLh/QgAQyQMgA0GABWogC0IAQqnAxomuzpOyMEIAEMkDAkAgAykDiAUgAykDmAUgAykDqAUgAykDuAUgAykDsAUiCyANfCALVK18Ig0gAykDoAV8IgsgDVStfCALIBN8Ig0gC1StfCITIAMpA5AFfCILIBNUrXwgCyAUfCITIAtUrXwiFCADKQOABXwiCyAUVK18IAsgDnwiDiALVK18IgtQDQAgCyAMfCIMIAtaDQAgCyAMVq0iCyAPfCIPIAtaDQAgCyAPVq0iCyAKfCIKIAtUIQULIANB8ARqIA1CiceZpK7wgemHf34iC0IAQsf688PtgqOQPEIAEMkDIANB4ARqIAtCAEKNlcfDltLawJd/QgAQyQMgA0HQBGogC0IAQt2whYzotpGouH9CABDJAyADQcAEaiALQgBCqcDGia7Ok7IwQgAQyQNBACEEIAMpA8gEIAMpA9gEIAMpA+gEIAMpA/gEIAMpA/AEIgsgDXwgC1StfCINIAMpA+AEfCILIA1UrXwgCyATfCINIAtUrXwiEyADKQPQBHwiCyATVK18IAsgDnwiDiALVK18IhMgAykDwAR8IgsgE1StfCALIAx8IhMgC1StfCILUEUEQCALIA98Ig8gC1QiBK0iCyAKfCIMIAogBBshCiAEIAsgDFZxIQQLIANBsARqIA1CiceZpK7wgemHf34iC0IAQsf688PtgqOQPEIAEMkDIANBoARqIAtCAEKNlcfDltLawJd/QgAQyQMgA0GQBGogC0IAQt2whYzotpGouH9CABDJAyADQYAEaiALQgBCqcDGia7Ok7IwQgAQyQMgAykDiAQgAykDmAQgAykDqAQgAykDuAQgAykDsAQiCyANfCALVK18IgwgAykDoAR8IgsgDFStfCALIAsgDnwiC1atfCINIAMpA5AEfCIMIA1UrXwgDCATfCINIAxUrXwiDiADKQOABHwiDCAOVK18IAwgD3wiDiAMVK18IgwgCnwiDyAKIAxCAFIiCBshCgJAAkACQAJAIAUgBnIgBHIgDCAPViIErSAMIAgbQgBSciAEIAhxIApCqcDGia7Ok7IwVnJyDQAgCkKpwMaJrs6TsjBSDQEgDkLdsIWM6LaRqLh/Vg0AIA5C3bCFjOi2kai4f1IEQCANIQwgDiEPQqnAxomuzpOyMCEKDAQLQt2whYzotpGouH8hDiANQo2Vx8OW0trAl39WDQAgDUKNlcfDltLawJd/UiALQsb688PtgqOQPFhyDQILIA1C8+q4vOmtpb/oAHwiDyALQsf688PtgqOQPFStIhN9IQwgDkKjz/rzl8nu18cAfCIUIA1CjZXHw5bS2sCXf1QgDyATVHKtIg19IQ8gCiAOQt2whYzotpGouH9UIA0gFFZyrX1CqcDGia7Ok7IwfSEKIAtCx/rzw+2Co5A8fSELDAILIA0hDCAOIQ8MAQsgDSEMQt2whYzotpGouH8hD0KpwMaJrs6TsjAhCgsgASkDACITIQ4gCiENAn4CQAJAIAogE1INACASIg4gDyINUg0AIAwhDSAMIBEiDlINACALIQ0gCyAQIg5RDQELIA0gDloNAELdsIWM6LaRqLh/IBIgD30iDSAMIBFWIBEgDH0iDCALIBBWrSIRVHKtIhR9Ig59IhkgDCARfSIMQo2Vx8OW0trAl39WQo2Vx8OW0trAl38gDH0iDCAQIAt9IhBCx/rzw+2Co5A8Vq0iC1RyrSIafSERIBkgGlQgDkLdsIWM6LaRqLh/VnIhBCAMIAt9IQ5Cx/rzw+2Co5A8IBB9IRAgDSAUVCAPIBJWcq0gCiATfXxCqcDGia7Ok7IwfAwBCyAMIBF9Ig0gCyAQVK0iFH0hDiAPIBJ9IhkgDSAUVCAMIBFUcq0iDH0hESAPIBJUIAwgGVZyIQQgCyAQfSEQIAogE30LIQogAyAQNwOICyADIA43A4ALIAMgETcD+AogAyAKIAStfTcD8AogA0GwEGoiBCADQfAKaiIFIAIQwgIgA0GIC2ogAUEYaikDADcDACADQYALaiABQRBqKQMANwMAIANB+ApqIAFBCGopAwA3AwAgAyABKQMANwPwCiADQcgKaiAFIAQQwgIgA0GwAmogAykD4AoiCkIAIBVCABDJAyADQaACaiAKQgAgFkIAEMkDIANBkAJqIApCACAXQgAQyQMgA0GAAmogCkIAIBhCABDJAyADQfABaiADKQOwAiILQonHmaSu8IHph39+IgpCAELH+vPD7YKjkDxCABDJAyADQeABaiAKQgBCjZXHw5bS2sCXf0IAEMkDIANB0AFqIApCAELdsIWM6LaRqLh/QgAQyQMgA0HAAWogCkIAQqnAxomuzpOyMEIAEMkDIANB8AJqIAMpA9gKIgpCACAVQgAQyQMgA0HgAmogCkIAIBZCABDJAyADQdACaiAKQgAgF0IAEMkDIANBwAJqIApCACAYQgAQyQMgA0GwAWogAykD4AEiDyADKQO4AiISIAMpA6ACfCINfCIQIAMpA/gBIAsgAykD8AEiCnwgClStfHwiCyADKQPwAnwiDEKJx5mkrvCB6Yd/fiIKQgBCx/rzw+2Co5A8QgAQyQMgA0GgAWogCkIAQo2Vx8OW0trAl39CABDJAyADQZABaiAKQgBC3bCFjOi2kai4f0IAEMkDIANBgAFqIApCAEKpwMaJrs6TsjBCABDJAyADQbADaiADKQPQCiIKQgAgFUIAEMkDIANBoANqIApCACAWQgAQyQMgA0GQA2ogCkIAIBdCABDJAyADQYADaiAKQgAgGEIAEMkDIANB8ABqIAMpA/gCIAsgDFatfCITIAMpA+ACfCIRIAMpA6gCIA0gElStfCIUIAMpA5ACfCISIAMpA9ABfCINIAsgEFStIAMpA+gBIA8gEFatfHx8Ihl8IhAgAykDoAF8IgsgAykDuAEgAykDsAEiCiAMfCAKVK18fCIMIAMpA7ADfCIPQonHmaSu8IHph39+IgpCAELH+vPD7YKjkDxCABDJAyADQeAAaiAKQgBCjZXHw5bS2sCXf0IAEMkDIANB0ABqIApCAELdsIWM6LaRqLh/QgAQyQMgA0FAayAKQgBCqcDGia7Ok7IwQgAQyQMgA0HwA2ogAykDyAoiCkIAIBVCABDJAyADQeADaiAKQgAgFkIAEMkDIANB0ANqIApCACAXQgAQyQMgA0HAA2ogCkIAIBhCABDJAyADQTBqIAMpA7gDIAwgD1atfCIYIAMpA6ADfCIOIAMpA5gCIBIgFFStfCIUIAMpA4ACfCIVIAMpA8ABfCIWIA0gGVatIAMpA9gBIA0gElStfHx8IhIgAykD0AJ8Ig0gECARVK0gAykD6AIgESATVK18fHwiESADKQOQAXwiFyALIAxWrSADKQOoASALIBBUrXx8fCITfCIQIAMpA2B8IgsgAykDeCADKQNwIgogD3wgClStfHwiDCADKQPwA3wiD0KJx5mkrvCB6Yd/fiIKQgBCx/rzw+2Co5A8QgAQyQMgA0EgaiAKQgBCjZXHw5bS2sCXf0IAEMkDIANBEGogCkIAQt2whYzotpGouH9CABDJAyADIApCAEKpwMaJrs6TsjBCABDJAwJAAkACQAJAIAMpAwggAykDSCADKQOIASASIBZUrSADKQPIASAVIBZWrXx8IAMpA4gCIBQgFVatfHwiFSADKQPAAnwiCiANIBFWrSADKQPYAiANIBJUrXx8fCISIAMpA4ABfCINIBJUrXwgDSATIBdUrSADKQOYASARIBdWrXx8fCIRIA1UrXwgCiASVq0gAykDyAIgCiAVVK18fHwiFSADKQOAA3wiCiADKQOYAyARIBEgAykDkAN8IhFWrXwgESARIA4gEFatIAMpA6gDIA4gGFStfHx8IhFWrXx8IhIgAykDQHwiDSASVK18IA0gAykDWCARIBEgAykDUHwiEVatfCARIAsgDFatIAMpA2ggCyAQVK18fHwiCyARVK18fCIQIA1UrXwgCiASVq0gAykDiAMgCiAVVK18fHwiEiADKQPAA3wiESADKQPYAyAQIAMpA9ADfCIKIBBUrXwgCiAKIAMpA+gDIAMpA/gDIAwgD1atfCIMIAMpA+ADfCIQIAxUrXwgECALIBB8IhBWrXx8IgpWrXx8IgwgAykDAHwiCyAMVK18IAsgCyADKQMYIAogCiADKQMQfCIKVq18IAogCiADKQMoIBAgECADKQMgfCIQVq18IBAgAykDOCADKQMwIg0gD3wgDVStfHwiDSAQVK18fCIKVq18fCILVq18IAwgEVStIAMpA8gDIBEgElStfHx8Ig5CqcDGia7Ok7IwVg0AIA5CqcDGia7Ok7IwUg0BIAtC3bCFjOi2kai4f1YNACALQt2whYzotpGouH9SBEAgCiEQIAshDEKpwMaJrs6TsjAhDgwECyAKQo2Vx8OW0trAl39WDQBC3bCFjOi2kai4fyEMIApCjZXHw5bS2sCXf1IgDULH+vPD7YKjkDxUcg0CCyAKQvPquLzpraW/6AB8IgwgDULH+vPD7YKjkDxUrSIRfSEQIAtCo8/685fJ7tfHAHwiEiAKQo2Vx8OW0trAl39UIAwgEVRyrSIKfSEMIA4gC0LdsIWM6LaRqLh/VCAKIBJWcq19QqnAxomuzpOyMH0hDiANQsf688PtgqOQPH0hDQwCCyAKIRAgCyEMDAELIAohEEKpwMaJrs6TsjAhDgsgAyANNwOICyADIBA3A4ALIAMgDDcD+AogAyAONwPwCiAAQSBqIANB8ApqIAFBIGoQwgIgAEEYaiADQcgQaikDADcDACAAQRBqIANBwBBqKQMANwMAIABBCGogA0G4EGopAwA3AwAgACADKQOwEDcDACAAIAc6AEALIANB0BBqJAALgPYDAkx/EH4jAEGgB2siCSQAAkACQAJAAkACQAJAAkAgAkEBSwRAIAIgA0kNASAJQeACahAhIAktAJgHIUogCSgCjAciCARAIAkoApAHIAhBAnQQ3wQLAkAgCSgCxAQiCEUNACAIIAhBDGxBE2pBeHEiB2pBCWoiCEUNACAJKALABCAHayAIEN8ECyAJKALwBCIIQYCAgIB4RiAIRXJFBEAgCSgC9AQgCEECdBDfBAsCQCAELQDAAUECRwRAIAlB4AJqIARBgAFqQQEgBEEBEEIgCUEQaiAJQegCaikCADcDACAJIAkpAuACNwMIDAELIAlBgICAgHg2AggLIAlBADYCQCAJQoCAgICAATcCOCAJQQA2AjAgCUKAgICAgAE3AiggAkHIAWwhFSAJQfgBaiE5IAlBgANqIScgCUHoAGohDgNAIAlB4ABqIgogASAMaiIiQZgBaikDADcDACAJQdgAaiIHICJBkAFqKQMANwMAIAlB0ABqIgggIkGIAWopAwA3AwAgDiAiQaABaikDADcDACAOQQhqICJBqAFqKQMANwMAIA5BEGogIkGwAWopAwA3AwAgDkEYaiAiQbgBaikDADcDACAJICJBgAFqKQMANwNIICJBwAFqLQAAIQQgCSgCQCILIAkoAjhGBEAgCUE4akGIjsEAEJoDCyAJKAI8IAtByABsaiINIAkpA0g3AwAgDSAEOgBAIA1BCGogCCkDADcDACANQRBqIAcpAwA3AwAgDUEYaiAKKQMANwMAIA1BIGogDikDADcDACANQShqIAlB8ABqKQMANwMAIA1BMGogCUH4AGopAwA3AwAgDUE4aiAJQYABaikDADcDACAJIAtBAWo2AkAgJyAiQSBq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ACARQdACaiALKQMANwMAIBFByAJqIAopAwA3AwAgESAFKQOwEzcDwAIgByAFQfQMahD3AiARQfgCaiANKQMANwMAIBFB8AJqIAspAwA3AwAgEUHoAmogCikDADcDACARIAUpA7ATNwPgAkHRzsUALQAAGkGAA0EIENYEIhBFDQEgByAIEPcCIBBBGGogDSkDADcDACAQQRBqIAspAwA3AwAgEEEIaiAKKQMANwMAIBAgBSkDsBM3AwAgByAFQfwOahD3AiAQQThqIA0pAwA3AwAgEEEwaiALKQMANwMAIBBBKGogCikDADcDACAQIAUpA7ATNwMgIAcgBUGID2oQ9wIgEEHYAGogDSkDADcDACAQQdAAaiALKQMANwMAIBBByABqIAopAwA3AwAgECAFKQOwEzcDQCAHIAVBlA9qEPcCIBBB+ABqIA0pAwA3AwAgEEHwAGogCykDADcDACAQQegAaiAKKQMANwMAIBAgBSkDsBM3A2AgByAFQaAPahD3AiAQQZgBaiANKQMANwMAIBBBkAFqIAspAwA3AwAgEEGIAWogCikDADcDACAQIAUpA7ATNwOAASAHIAVBrA9qEPcCIBBBuAFqIA0pAwA3AwAgEEGwAWogCykDADcDACAQQagBaiAKKQMANwMAIBAgBSkDsBM3A6ABIAcgBUG4D2oQ9wIgEEHYAWogDSkDADcDACAQQdABaiALKQMANwMAIBBByAFqIAopAwA3AwAgECAFKQOwEzcDwAEgByAFQcQPahD3AiAQQfgBaiANKQMANwMAIBBB8AFqIAspAwA3AwAgEEHoAWogCikDADcDACAQIAUpA7ATNwPgASAHIAVB0A9qEPcCIBBBmAJqIA0pAwA3AwAgEEGQAmogCykDADcDACAQQYgCaiAKKQMANwMAIBAgBSkDsBM3A4ACIAcgBUHcD2oQ9wIgEEG4AmogDSkDADcDACAQQbACaiALKQMANwMAIBBBqAJqIAopAwA3AwAgECAFKQOwEzcDoAIgByAFQegPahD3AiAQQdgCaiANKQMANwMAIBBB0AJqIAspAwA3AwAgEEHIAmogCikDADcDACAQIAUpA7ATNwPAAiAHIAVB9A9qEPcCIBBB+AJqIA0pAwA3AwAgEEHwAmogCykDADcDACAQQegCaiAKKQMANwMAIBAgBSkDsBM3A+ACIAgQ/AIg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ACAoQThqIBhBGGopAwA3AwAgGEHwAWokAAwCCwsgGCAHNgLAASAYICc2ArwBIBggDzYCuAFBgIvAAEErIBhBuAFqQfCKwABBpI3AABDKAwALIBJByABqIBJByAFqKQMANwMAIBJBQGsgEkHAAWopAwA3AwAgEkE4aiASQbgBaikDADcDACASQTBqIgsgEkGwAWopAwA3AwAgEkEoaiASQagBaikDADcDACASQSBqIBJBoAFqKQMANwMAIBJBGGogEkGYAWopAwA3AwAgEiASKQOQATcDECASQYgBaiASQYgCaikDADcDACASQYABaiASQYACaikDADcDACASQfgAaiASQfgBaikDADcDACASQfAAaiASQfABaikDADcDACASQegAaiASQegBaikDADcDACASQeAAaiASQeABaikDADcDACASQdgAaiASQdgBaikDADcDACASIBIpA9ABNwNQIBIoAgwiFSASKAIEIgxGBEAgEkEEakGsxsIAEKIDIBIoAgQhDAsgEigCCCINIBVBBXRqIgcgEikDEDcDACAHQQhqIBJBGGopAwA3AwAgB0EQaiASQSBqKQMANwMAIAdBGGogEkEoaikDADcDACASIBVBAWoiBzYCDCAHIAxGBEAgEkEEakG8xsIAEKIDIBIoAgghDSASKAIEIQwLIA0gB0EFdGoiByALKQMANwMAIAdBGGogC0EYaikDADcDACAHQRBqIAtBEGopAwA3AwAgB0EIaiALQQhqKQMANwMAIBIgFUECaiIHNgIMIAcgDEYEQCASQQRqQczGwgAQogMgEigCCCENIBIoAgQhDAsgEkHYAGopAwAhUyASQeAAaikDACFSIBJB6ABqKQMAIVEgDSAHQQV0aiIHIBIpA1A3AwAgB0EYaiBRNwMAIAdBEGogUjcDACAHQQhqIFM3AwAgEiAVQQNqIgc2AgwgByAMRgRAIBJBBGpB3MbCABCiAyASKAIIIQ0LIBJBgAFqKQMAIVMgEkGIAWopAwAhUiASQfgAaikDACFRIA0gB0EFdGoiByASKQNwNwMAIAdBCGogUTcDACAHQRhqIFI3AwAgB0EQaiBTNwMAIAlB4AJqIgcgEikCBDcCACAHQQhqIBVBBGo2AgAgEkGQAmokACAJQbgBaiAJKALkAiILIAkoAugCQQAQJSAJKALgAiIHBEAgCyAHQQV0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KQMwIhEgAikDMCIMUgRAIBEhCwwBCyARIQ0gASkDOCILIRIgDyALIAIpAzgiDFENARoLIAsgDFYNBSABKQMoIQ8gASkDMCERIAIpAzAhDSABKQM4IQsgAikDOCESIAIpAygLIQogDSARfSIQIAsgElatIhh9IQwgCiAPfSIZIBAgGFQgDSARVHKtIg19IREgCiAPVCANIBlWciEEIA4gE30hECASIAt9IQsMBwsgA0HwB2oQVSAHRQRAIANBiAhqIQQgAykD+AchGCADKQPwByEZIAMpA4AIDAYLIAMoAqAKQQFxDQRB7PbBABDoBAALQYD2wQBBM0Hc9sEAEP4DAAsgACAHOgBAIAAgAikDIDcDICAAIAIpAwA3AwAgAEE4aiACQThqKQMANwMAIABBMGogAkEwaikDADcDACAAQShqIAJBKGopAwA3AwAgAEEIaiACQQhqKQMANwMAIABBEGogAkEQaikDADcDACAAQRhqIAJBGGopAwA3AwAMBgsgACAHOgBAIAAgASkDIDcDICAAIAEpAwA3AwAgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEIaiABQQhqKQMANwMAIABBEGogAUEQaikDADcDACAAQRhqIAFBGGopAwA3AwAMBQsgASkDMCIKIAIpAzAiD1QgCiAPfSIKIAEpAzgiDyACKQM4IhFUrSILVHKtIg0gASkDKCISIAIpAygiEH0iGEJ/hXwiDCAKQn+FIAt8IgogDyARfSIPQq/4//9vVq0iC1StIhl9IREgDCAZVCEEIAogC30hDCAQIBJWIA0gGFZyrSAOIBNCf4V8fCEQQq/4//9vIA99IQsMAgsgA0HACmohBCADKQOwCiEYIAMpA6gKIRkgAykDuAoLIRIgBCkDACEWIANBgA1qQgA3AwAgA0H4DGpCADcDACADQgA3A/AMIANC85aAgDA3A4gNIANBgAdqIAEpAxAiE0IAIAEpAxgiD0IAEMkDIANB4AZqIAEpAwgiEUIAIA9CABDJAyADQYAGaiABKQMAIgpCACAPQgAQyQMgA0HQBmogEUIAIBNCABDJAyADQZAGaiAKQgAgE0IAEMkDIANBoAZqIApCACARQgAQyQMgA0GwB2ogD0IAIA9CABDJAyADQfAGaiATQgAgE0IAEMkD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lrSLAkIAEMkDIAFBsA9qIAVCAEKlibn6l5a0iwJCABDJAyABQfAPaiAGQgBCpYm5+peWtIsCQgAQyQMgAUGwDGogASkDqA4gECAWVK18IhMgASkD4A58IgQgASkDiA8gCCAKVq18IgggASkDwA98IgUgASkDwAx8IgYgEiAaVq0gASkDmA0gCiASVq18fHwiDSABKQOQD3wiCiAJIA9UrSABKQPYDiAMIA9WrXx8fCIPIAEpA7ANfCISIAcgFlatIAEpA8gNIAcgCVStfHx8Igx8IgkgASkD8Ax8IgcgASkDiA0gASkDgA0iAyAQfCADVK18fCIWIAEpA7AOfCIQQv////++sv3wQn4iA0IAQoGAgIC/sv3wwwBCABDJAyABQaAMaiADQgBCkeHlzYeJ+pkoQgAQyQMgAUGQDGogA0IAQt2whYzotpGouH9CABDJAyABQYAMaiADQgBCqcDGia7Ok7IwQgAQyQMCQAJAAkAgASkDiAwgASkD6A8gASkD2A8gASkDyA8gBSAIVK18IgggASkD0A98IgMgCFStfCADIAMgBiANVq0gASkDyAwgBSAGVq18fHwiA1atfCADIAMgCiAPVq0gASkDmA8gCiANVK18fHwiA1atfCIGIAEpA+APfCIFIAZUrXwgBSAFIAEpA6gNIAMgAyABKQOgDXwiA1atfCADIAMgDCASVK0gASkDuA0gDyASVq18fHwiA1atfHwiBVatfCAFIAEpA6gPIAMgAyABKQOgD3wiA1atfCADIAMgBCAJVq0gASkD6A4gBCATVK18fHwiA1atfHwiBCAFVK18Ig8gASkD8A98IgUgASkD2AwgBCAEIAEpA9AMfCIEVq18IAQgASkD6AwgAyADIAEpA+AMfCIDVq18IAMgByAWVq0gASkD+AwgByAJVK18fHwiDSADVK18fCIDIARUrXx8IgYgASkDuA8gAyADIAEpA7APfCIDVq18IAMgAyABKQP4DiABKQO4DiAQIBZUrXwiCSABKQPwDnwiBCAJVK18IAQgBCANfCIEVq18fCIDVq18fCINIAEpA4AMfCIJIA1UrXwgCSABKQOYDCADIAMgASkDkAx8IgNWrXwgAyADIAEpA6gMIAQgBCABKQOgDHwiBFatfCAEIAEpA7gMIAEpA7AMIgcgEHwgB1StfHwiGiAEVK18fCIDVq18fCIEIAlUrXwgBiANVq0gBSAGVq0gASkD+A8gBSAPVK18fHx8IhJCqcDGia7Ok7IwVg0AAkAgEkKpwMaJrs6TsjBRBEAgBELdsIWM6LaRqLh/Vg0CIARC3bCFjOi2kai4f1ENAUKpwMaJrs6TsjAhEgsgBCEWIAMhDQwDCyADQpHh5c2HifqZKFYNAELdsIWM6LaRqLh/IRYgA0KR4eXNh4n6mShSIBpCgYCAgL+y/fDDAFRyDQELIANCkeHlzYeJ+pkofSIFIBpCgYCAgL+y/fDDAFStIgZ9IQ0gBEKjz/rzl8nu18cAfCIJIANCkeHlzYeJ+pkoVCAFIAZUcq0iA30hFiASIARC3bCFjOi2kai4f1QgAyAJVnKtfUKpwMaJrs6TsjB9IRIgGkKBgICAv7L98MMAfSEaDAELQqnAxomuzpOyMCESIAMhDQsgAUGIEGpB3YHCAEHCABC3AiABQYAKaiABKQOgECIDQgBCp9uF8drIudwbQgAQyQMgAUHACmogASkDmBAiBEIAQqfbhfHayLncG0IAEMkDIAFBgAtqIAEpA5AQIgVCAEKn24Xx2si53BtCABDJAyABQcALaiABKQOIECIGQgBCp9uF8drIudwbQgAQyQMgAUHwCWogASkDgAoiD0L/////vrL98EJ+IglCAEKBgICAv7L98MMAQgAQyQMgAUHgCWogCUIAQpHh5c2HifqZKEIAEMkDIAFBkAlqIAlCAELdsIWM6LaRqLh/QgAQyQMgAUHACGogCUIAQqnAxomuzpOyMEIAEMkDIAFBkApqIANCAELjs/GantaO/9MAQgAQyQMgAUHQCmogBEIAQuOz8Zqe1o7/0wBCABDJAyABQZALaiAFQgBC47Pxmp7Wjv/TAEIAEMkDIAFB0AtqIAZCAELjs/GantaO/9MAQgAQyQMgAUHQCWogASkD4AkiEyABKQOICiIMIAEpA8AKfCIIfCIHIAEpA/gJIA8gASkD8AkiCXwgCVStfHwiDyABKQOQCnwiCkL/////vrL98EJ+IglCAEKBgICAv7L98MMAQgAQyQMgAUHACWogCUIAQpHh5c2HifqZKEIAEMkDIAFBsAlqIAlCAELdsIWM6LaRqLh/QgAQyQMgAUGgCWogCUIAQqnAxomuzpOyMEIAEMkDIAFBoApqIANCAEKFge6d1efgpIx/QgAQyQMgAUHgCmogBEIAQoWB7p3V5+CkjH9CABDJAyABQaALaiAFQgBChYHundXn4KSMf0IAEMkDIAFB4AtqIAZCAEKFge6d1efgpIx/QgAQyQMgAUGACWogASkDmAogCiAPVK18IhQgASkD0Ap8IhAgASkDyAogCCAMVK18IgsgASkDgAt8IgwgASkDkAl8IgggByAPVq0gASkD6AkgByATVK18fHwiDnwiByABKQPACXwiDyABKQPYCSABKQPQCSIJIAp8IAlUrXx8IgogASkDoAp8IhNC/////76y/fBCfiIJQgBCgYCAgL+y/fDDAEIAEMkDIAFB8AhqIAlCAEKR4eXNh4n6mShCABDJAyABQeAIaiAJQgBC3bCFjOi2kai4f0IAEMkDIAFB0AhqIAlCAEKpwMaJrs6TsjBCABDJAyABQbAKaiADQgBCpYm5+peWtIsCQgAQyQMgAUHwCmogBEIAQqWJufqXlrSLAkIAEMkDIAFBsAtqIAVCAEKlibn6l5a0iwJCABDJAyABQfALaiAGQgBCpYm5+peWtIsCQgAQyQMgAUGwCGogASkDqAogCiATVq18IhEgASkD4Ap8IgQgASkDiAsgCyAMVq18IgsgASkDwAt8IgUgASkDwAh8IgYgCCAOVq0gASkDmAkgCCAMVK18fHwiCSABKQOQC3wiDCAHIBBUrSABKQPYCiAQIBRUrXx8fCIQIAEpA7AJfCIIIAogD1StIAEpA8gJIAcgD1atfHx8IhR8IgcgASkD8Ah8Ig8gASkDiAkgASkDgAkiAyATfCADVK18fCIKIAEpA7AKfCITQv////++sv3wQn4iA0IAQoGAgIC/sv3wwwBCABDJAyABQaAIaiADQgBCkeHlzYeJ+pkoQgAQyQMgAUGQCGogA0IAQt2whYzotpGouH9CABDJAyABQYAIaiADQgBCqcDGia7Ok7IwQgAQyQMCQAJAAkAgASkDiAggASkD6AsgASkD2AsgASkDyAsgBSALVK18IgsgASkD0At8IgMgC1StfCADIAMgBiAJVq0gASkDyAggBSAGVq18fHwiA1atfCADIAMgDCAQVq0gASkDmAsgCSAMVq18fHwiA1atfCIGIAEpA+ALfCIFIAZUrXwgBSAFIAEpA6gJIAMgAyABKQOgCXwiA1atfCADIAMgCCAUVq0gASkDuAkgCCAQVK18fHwiA1at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Wg0AIAsgDlatIgsgD3wiDyALWg0AIAsgD1atIgsgDXwiDSALVAwBC0EACyEKIANBwARqIBZCAEKBgICAcEIAEMkDAkAgAykDyAQgFkIghiILIBJ8IhQgC1StIBZCIIh8IgsgEXwiESALVK0iCyADKQPABHwiEiALVK18IAwgEnwiDCASVK18IgtQDQAgCyAOfCIOIAtaDQAgCyAOVq0iCyAPfCIPIAtaDQAgCyAPVq0iCyANfCINIAtUIQgLIANBsARqIBRCAEKBgICAcEIAEMkDIAMpA7gEIBRCIIYiCyARfCISIAtUrSAUQiCIfCILIAx8IhEgC1StIgsgAykDsAR8IgwgC1StfCAMIA58Ig4gDFStfCILUEUEQCALIA98Ig8gC1QiBK0iDCANfCILIA0gBBshDSAEIAsgDFRxIQYLIANBoARqIBJCAEKBgICAcEIAEMkDIAMpA6gEIBJCIIYiCyARfCIXIAtUrSASQiCIfCIMIA58IgsgDFStIgwgAykDoAR8Ig4gDFStfCAOIA4gD3wiDlatfCIPIA18IgwgDSAPQgBSIgkbIQ0CQAJAAkAgCCAKciAGciAMIA9UIgStIA8gCRtCAFJyIAQgCXEgDUKBgICAcFZycg0AIA1CgYCAgHBSDQJCACEPIA5CAFINAEL/////DyEMIAtC/////w9WBEAgCyEMDAILIAtC/////w9SIBdCf1JyDQIMAQsgDiEPIAshDAsgDEL/////D30iESAXQn9SrSIOfSELIA8gDEL/////D1QgDiARVnKtIgx9IQ4gDSAMIA9WrX1C/////w98IQ0gF0IBfCEXCyADIBc3A4gMIAMgCzcDgAwgAyAONwP4CyADIA03A/ALIANBkAtqIANBsAtqIANB8AtqEJEBAkACQCADKQOQCyIMIBx8IhEgAykDmAsiCyAbfCIPIAtUIA8gDyADKQOgCyILIB18Ig0gC1QgDSADKQOoCyILIBl8IhcgC1StfCIOIA1Ucq18Ig9Wcq18Ig0gEVQgDCARVnINAEKBgICAcCELAkAgDSIMQoGAgIBwUg0AIA9CAFINAUL/////DyELIA4iDEL/////D1INACAXQn9RDQFCACEMQoGAgIBwIQ0MAgsgCyAMWA0AIA8hDCAOIQsMAQsgDkL/////D30iESAXQn9SrSIMfSELIA8gDkL/////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IgAEQCADKAKUAiAAQQJ0EN8ECyANDQEMBAsgACADKQPgAjcCZCAAQewAaiAGKAIANgIAIAMoAoADIgYEQCADKAKEAyAGQQJ0EN8ECyADQZgDaiADQcgBaikCADcDACADQZADaiADQcABaikCADcDACADQYgDaiADQbgBaikCADcDACADQagDaiADQbgCaikDADcDACADQbADaiADQcACaikDADcDACADQbgDaiADQcgCaikDADcDACADIAMpArABNwOAAyADIAMpA7ACNwOgAyADQcgDaiADQdgCaikCADcDACADIAMpAtACNwPAAyAAIANBgANqQdAA/AoAACAAIAs2AmAgACAlNwJYIAAgATYCVCAAIAU2AlAgAygCoAIiAARAIAMoAqQCIABBAnQQ3wQLIAMoApACIgAEQCADKAKUAiAAQQJ0EN8ECyANRQ0CIAMoAvABIgAEQCADKAL0ASAAQQJ0EN8ECyADKAKAAiIARQ0CIAMoAoQCIABBAnQQ3wQMAgsgAygC8AEiAARAIAMoAvQBIABBAnQQ3wQLIAMoAoACIgBFDQIgAygChAIgAEECdBDfBAwCC0EBQcIAQdTYwgAQyAQACwJAIARFDQAgAygC0AEiAARAIAMoAtQBIABBAnQQ3wQLIAMoAuABIgBFDQAgAygC5AEgAEECdBDfBAsgAygCkAEiAARAIAggAEECdBDfBAsgAygCgAEiAARAIAMoAoQBIABBAnQQ3wQLIAIEQCAOIAJBAnQQ3wQLIAMoAmAiAARAIAMoAmQgAEECdBDfBAsgEQRAIAkgEUECdBDfBAsgAygCQCIARQ0CIAMoAkQgAEECdBDfBAwCCwJAIARFDQAgAygC0AEiAARAIAMoAtQBIABBAnQQ3wQLIAMoAuABIgBFDQAgAygC5AEgAEECdBDfBAsgAygCsAEiAARAIAMoArQBIABBAnQQ3wQLIAMoAsABIgAEQCADKALEASAAQQJ0EN8ECyADKAKQASIABEAgCCAAQQJ0EN8ECyADKAKAASIABEAgAygChAEgAEECdBDfBAsgAgRAIA4gAkECdBDfBAsgAygCYCIARQ0AIAMoAmQgAEECdBDfBAsgEQRAIAkgEUECdBDfBAsgAygCQCIARQ0AIAMoAkQgAEECdBDfBAsgAygCACIABEAgAygCBCAAQQJ0EN8ECyAVBEAgFCAVQQJ0EN8ECyAXBEAgFiAXQQJ0EN8ECyAeBEAgHSAeQQJ0EN8ECyAYBEAgEiAYQQJ0EN8ECyAcBEAgGyAcQQJ0EN8ECyAaBEAgGSAaQQJ0EN8ECyADQeADaiQADwsgByABQfiBwAAQyAQAC7M4AgZ/F34jAEGQBmsiAiQAIAJBsAVqIAEQLyACQeAFaiABQTBqIgcQL0Kazf/Lo73EgBohCyACKQO4BSIIIAIpA+gFfCIKIAhUIAogAikDwAUiCCACKQPwBXwiDiAIVCAOIAIpA8gFIgggAikD+AV8Ig0gCFQgDSANIAIpA9AFIgkgAikDgAZ8IgggCVQgCCAIIAIpA9gFIg8gAikDiAZ8IgkgD1StfCIIVnKtfCINVnKtfCIMIA5Ucq18IhAgClRyrSACKQPgBSACKQOwBXx8Ig4hCgJAAkACQCAOQprN/8ujvcSAGlINAELX2a6a5PbpjcsAIQsgECIKQtfZrprk9umNywBSDQBCv6WUnM/w0rvkACELIAwiCkK/pZScz/DSu+QAUg0AQqTsw7WP1LSY5wAhCyANIgpCpOzDtY/UtJjnAFINAEL//8+K6///1R4hCyAIIgpC///Piuv//9UeUg0AQqvV/v///7//uX8hCyAJIgpCq9X+////v/+5f1ENAQsgCiALWg0AIBAhCiAMIQsgDSEPIAghEgwBCyAIQv//z4rr///VHn0iCiAJQqvV/v///7//uX9UrSILfSESIA1CpOzDtY/UtJjnAH0iEyAIQv//z4rr///VHlQgCiALVHKtIgh9IQ8gDEK/pZScz/DSu+QAfSIKIA1CpOzDtY/UtJjnAFQgCCATVnKtIgh9IQsgEELX2a6a5PbpjcsAfSINIAxCv6WUnM/w0rvkAFQgCCAKVnKtIgh9IQogDiAQQtfZrprk9umNywBUIAggDVZyrX1Cms3/y6O9xIAafSEOIAlC1aqBgICAwIDGAHwhCQsgAiAJNwP4AyACIBI3A/ADIAIgDzcD6AMgAiALNwPgAyACIAo3A9gDIAIgDjcD0AMCQAJAIAJB0ANqQYCgxQBBMBDxAwRAIAJBwARqQgA3AwAgAkG4BGpCADcDACACQbAEakIANwMAIAJBqARqQgA3AwAgAkIANwOgBCACQgE3A8gEQSghAyACQfgEaiACQfgDaikDADcDACACQfAEaiACQfADaikDADcDACACQegEaiACQegDaikDADcDACACQeAEaiACQeADaikDADcDACACQdgEaiACQdgDaikDADcDACACIAIpA9ADNwPQBCACQagFakHYoMUAKQMANwMAIAJBoAVqQdCgxQApAwA3AwAgAkGYBWpByKDFACkDADcDACACQZAFakHAoMUAKQMANwMAIAJBiAVqQbigxQApAwA3AwAgAkGwoMUAKQMANwOABSACQdgFakGIocUAKQMANwMAIAJB0AVqQYChxQApAwA3AwAgAkHIBWpB+KDFACkDADcDACACQcAFaiIFQfCgxQApAwA3AwAgAkG4BWpB6KDFACkDADcDACACQeCgxQApAwA3A7AFIAJBiAZqQgA3AwAgAkGABmpCADcDACACQfgFakIANwMAIAJB8AVqIgZCADcDACACQegFakIANwMAIAJCADcD4AUgAkHQBGogAkGgBGpBMBDxA0UEQEKqx6uW2fyjzBEhFUKtquao29DPvJp/IRAMAgsgAkGABWogAkGgBGpBMBDxA0UEQCAGIQVCACEQDAILQqvV/v///7//uX8hDgNAIAItAPgEQQFxRQRAA0AgAkHQBGoQvwIgAikD2AUiCEIBg1BFBEAgAikD0AUhCSACIAhC1aqBgICAwIDGAH0iDTcD2AUgAiAJQv//z4rr///VHnwiCiAIIA1WrXwiDTcD0AUgAiACKQPIBSILQqTsw7WP1LSY5wB8IgggCSAKViAKIA1Wcq18Igo3A8gFIAIgAikDwAUiDUK/pZScz/DSu+QAfCIJIAggC1QgCCAKVnKtfCIKNwPABSACIAIpA7gFIgtC19mumuT26Y3LAHwiCCAJIA1UIAkgClZyrXwiCTcDuAUgAiACKQOwBSAIIAtUIAggCVZyrXxCms3/y6O9xIAafDcDsAULIAJBsAVqEL8CIAItAPgEQQFxRQ0ACyACKQOoBSEOCyAOp0EBcUUEQANAIAJBgAVqEL8CIAIpA4gGIghCAYNQRQRAIAIpA4AGIQkgAiAIQtWqgYCAgMCAxgB9Ig03A4gGIAIgCUL//8+K6///1R58IgogCCANVq18Ig03A4AGIAIgAikD+AUiC0Kk7MO1j9S0mOcAfCIIIAkgClYgCiANVnKtfCIKNwP4BSACIAIpA/AFIg1Cv6WUnM/w0rvkAHwiCSAIIAtUIAggClZy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ms3/y6O9xIAafSETIAlC1aqBgICAwIDGAHwhCQsgACAJNwNgIAAgETcDWCAAIBA3A1AgACANNwNIIAAgDjcDQCAAIBM3AzggACASNwMwIAAgFDcDKCAAIBg3AyAgACAXNwMYIAAgFjcDECAAIA83AwggAEIANwMACyACQZAGaiQAC9cuAgJ/G34jAEGwCmsiASQAIAFBiApqQbj8wQBBwAAQtwIgAUGACGogASkDoAoiBkIAQgNCABDJAyABQcAIaiABKQOYCiIPQgBCA0IAEMkDIAFBgAlqIAEpA5AKIgpCAEIDQgAQyQMgAUHACWogASkDiAoiBUIAQgNCABDJAyABQdAHaiABKQOACCIEQgBCgYCAgHBCABDJAyABQZAIaiAGQgBC/////79/QgAQyQMgAUHQCGogD0IAQv////+/f0IAEMkDIAFBkAlqIApCAEL/////v39CABDJAyABQdAJaiAFQgBC/////79/QgAQyQMgAUHgB2ogBEIghiIOIAEpA4gIIgkgASkDwAh8Igd8IhIgASkDkAh8IgNCAEKBgICAcEIAEMkDIAFBoAhqIAZCAEJ+QgAQyQMgAUHgCGogD0IAQn5CABDJAyABQaAJaiAKQgBCfkIAEMkDIAFB4AlqIAVCAEJ+QgAQyQMgAUHwB2ogA0IghiITIA4gElatIARCIIh8IhEgASkDyAggByAJVK18IgcgASkDgAl8Igt8Ig4gASkD0Ah8IgkgASkDmAggAyASVK18fCIIfCISIAEpA6AIfCIEQgBCgYCAgHBCABDJAyABQbAIaiAGQgBC/f///88AQgAQyQMgAUHwCGogD0IAQv3////PAEIAEMkDIAFBsAlqIApCAEL9////zwBCABDJAyABQfAJaiAFQgBC/f///88AQgAQyQMgAUHAB2ogBEIghiIZIBIgE1StIANCIIh8IhMgASkDiAkgByALVq18IgsgASkDwAl8Ig8gASkD0Ad8IgogDiARVK18IgUgASkDkAl8IgMgCCAJVK0gASkD2AggCSAOVK18fHwiEXwiDiABKQPgCHwiCSABKQOoCCAEIBJUrXx8Igh8IhIgASkDsAh8IgZCAEKBgICAcEIAEMkDAkACQAJAAkAgASkD+AkgASkD6AkgASkD6AcgDiATVK0iEyABKQPgB3wiByATVK18IAcgASkDyAkgCyAPVq18IgsgASkD0Al8IhMgBSAKVK0gASkD2AcgCiAPVK18fHwiDyADIBFWrSABKQOYCSADIAVUrXx8fCIKfCIDIAdUrXwiByAKIA9UrSAPIBNUrSABKQPYCSALIBNWrXx8fHwiDyABKQPgCXwiCiAPVK18IAogASkDqAkgCCAJVK0gASkD6AggCSAOVK18fCIOIAEpA6AJfCIFIA5UrXwgBSADIAV8IgVWrXx8IgMgClStfCIOIAcgD1atfCIPIAEpA/gHIAUgEiAZVK0gBEIgiHx8IgQgBVStIgUgASkD8Ad8IgogBVStfCADIAp8IgkgClStfHwiCiABKQPwCXwiBSAKVK18IAUgBSABKQO4CSABKQP4CCABKQO4CCAGIBJUrXwiEiABKQPwCHwiAyASVK18IAMgBHwiBCADVK18IhIgASkDsAl8IgMgElStfCADIAMgCXwiA1atfHwiBVatfCISIA4gD1atIAogD1StfHwiDyASVK0gDyABKQPIByADIAZCIIYiCiAEfCIZIApUrSAGQiCIfHwiBiADVK0iAyABKQPAB3wiCiADVK18IAogBSAKfCIKVq18fCITIA9UrXxCAFIgE0KBgICAcFZyDQAgE0KBgICAcFINASAGQv////8PVg0AQgAhEiAKQgBSDQAgGUJ/UiAGQv////8PUnINAgsgBkL/////D30iBSAZQn9SrSIDfSEPIAogBkL/////D1QgAyAFVnKtIgZ9IRIgEyAGIApWrX1C/////w98IRMgGUIBfCEZDAILIAohEiAGIQ8MAQtCgYCAgHAhEyAGIQ8LIAFBiApqQfj8wQBBwAAQtwIgAUHABWogASkDoAoiBkIAQgNCABDJAyABQYAGaiABKQOYCiIKQgBCA0IAEMkDIAFBwAZqIAEpA5AKIgVCAEIDQgAQyQMgAUGAB2ogASkDiAoiA0IAQgNCABDJAyABQZAFaiABKQPABSIOQgBCgYCAgHBCABDJAyABQdAFaiAGQgBC/////79/QgAQyQMgAUGQBmogCkIAQv////+/f0IAEMkDIAFB0AZqIAVCAEL/////v39CABDJAyABQZAHaiADQgBC/////79/QgAQyQMgAUGgBWogDkIghiIHIAEpA8gFIhEgASkDgAZ8Igt8IgkgASkD0AV8IgRCAEKBgICAcEIAEMkDIAFB4AVqIAZCAEJ+QgAQyQMgAUGgBmogCkIAQn5CABDJAyABQeAGaiAFQgBCfkIAEMkDIAFBoAdqIANCAEJ+QgAQyQMgAUGwBWogBEIghiIIIAcgCVatIA5CIIh8IhggASkDiAYgCyARVK18IgsgASkDwAZ8IhB8IgcgASkDkAZ8IhEgASkD2AUgBCAJVK18fCIMfCIJIAEpA+AFfCIOQgBCgYCAgHBCABDJAyABQfAFaiAGQgBC/f///88AQgAQyQMgAUGwBmogCkIAQv3////PAEIAEMkDIAFB8AZqIAVCAEL9////zwBCABDJAyABQbAHaiADQgBC/f///88AQgAQyQMgAUGABWogDkIghiINIAggCVatIARCIIh8IgggASkDyAYgCyAQVq18IhAgASkDgAd8IgogASkDkAV8IgUgByAYVK18IgMgASkD0AZ8IgQgDCARVK0gASkDmAYgByARVq18fHwiGHwiByABKQOgBnwiESABKQPoBSAJIA5WrXx8Igx8IgkgASkD8AV8IgZCAEKBgICAcEIAEMkDAkACQAJAAkAgASkDuAcgASkDqAcgASkDqAUgByAIVK0iCCABKQOgBXwiCyAIVK18IAsgASkDiAcgCiAQVK18IhAgASkDkAd8IgggAyAFVK0gASkDmAUgBSAKVK18fHwiCiAEIBhWrSABKQPYBiADIARWrXx8fCIFfCIEIAtUrXwiCyAFIApUrSAIIApWrSABKQOYByAIIBBUrXx8fHwiCiABKQOgB3wiBSAKVK18IAUgASkD6AYgDCARVK0gASkDqAYgByARVq18fCIHIAEpA+AGfCIDIAdUrXwgAyADIAR8IgNWrXx8IgQgBVStfCIHIAogC1StfCIKIAEpA7gFIAMgCSANVK0gDkIgiHx8Ig4gA1StIgMgASkDsAV8IgUgA1StfCAEIAV8IhEgBVStfHwiBSABKQOwB3wiAyAFVK18IAMgAyABKQP4BiABKQO4BiABKQP4BSAGIAlUrXwiCSABKQOwBnwiBCAJVK18IAQgDnwiDiAEVK18IgkgASkD8AZ8IgQgCVStfCAEIAQgEXwiBFatfHwiA1atfCIJIAcgClatIAUgClStfHwiCiAJVK0gCiABKQOIBSAEIAZCIIYiBSAOfCIYIAVUrSAGQiCIfHwiBiAEVK0iBCABKQOABXwiBSAEVK18IAUgAyAFfCIFVq18fCIRIApUrXxCAFIgEUKBgICAcFZyDQAgEUKBgICAcFINASAGQv////8PVg0AQgAhDiAFQgBSDQAgGEJ/UiAGQv////8PUnINAgsgBkL/////D30iAyAYQn9SrSIEfSEKIAUgBkL/////D1QgAyAEVHKtIgZ9IQ4gESAFIAZUrX1C/////w98IREgGEIBfCEYDAILIAUhDiAGIQoMAQtCgYCAgHAhESAGIQoLIAFBiApqQbj9wQBBwAAQtwIgAUGAA2ogASkDoAoiBkIAQgNCABDJAyABQcADaiABKQOYCiIFQgBCA0IAEMkDIAFBgARqIAEpA5AKIgNCAEIDQgAQyQMgAUHABGogASkDiAoiBEIAQgNCABDJAyABQdACaiABKQOAAyIHQgBCgYCAgHBCABDJAyABQZADaiAGQgBC/////79/QgAQyQMgAUHQA2ogBUIAQv////+/f0IAEMkDIAFBkARqIANCAEL/////v39CABDJAyABQdAEaiAEQgBC/////79/QgAQyQMgAUHgAmogB0IghiIIIAEpA4gDIhAgASkDwAN8Igx8IgsgASkDkAN8IglCAEKBgICAcEIAEMkDIAFBoANqIAZCAEJ+QgAQyQMgAUHgA2ogBUIAQn5CABDJAyABQaAEaiADQgBCfkIAEMkDIAFB4ARqIARCAEJ+QgAQyQMgAUHwAmogCUIghiINIAggC1atIAdCIIh8IhQgASkDyAMgDCAQVK18IgwgASkDgAR8IhV8IgggASkD0AN8IhAgASkDmAMgCSALVK18fCIWfCILIAEpA6ADfCIHQgBCgYCAgHBCABDJAyABQbADaiAGQgBC/f///88AQgAQyQMgAUHwA2ogBUIAQv3////PAEIAEMkDIAFBsARqIANCAEL9////zwBCABDJAyABQfAEaiAEQgBC/f///88AQgAQyQMgAUHAAmogB0IghiIXIAsgDVStIAlCIIh8Ig0gASkDiAQgDCAVVq18IhUgASkDwAR8IgUgASkD0AJ8IgMgCCAUVK18IgQgASkDkAR8IgkgECAWVq0gASkD2AMgCCAQVq18fHwiFHwiCCABKQPgA3wiECABKQOoAyAHIAtUrXx8IhZ8IgsgASkDsAN8IgZCAEKBgICAcEIAEMkDAkACQAJAAkAgASkD+AQgASkD6AQgASkD6AIgCCAN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IAQgBCAHfCIEVq18fCIIIANUrXxCAFIgCEKBgICAcFZyDQAgCEKBgICAcFINASAGQv////8PVg0AQgAhByAEQgBSDQAgDEJ/UiAGQv////8PUnINAgsgBkL/////D30iByAMQn9SrSINfSEDIAQgBkL/////D1QgByANVHKtIgZ9IQcgCCAEIAZUrX1C/////w98IQggDEIBfCEMDAILIAYhAyAEIQcMAQsgBiEDQoGAgIBwIQgLIAFBiApqQbj+wQBBwABBEBDxAQJAIAEoAogKQYCAgIB4RwRAIAAgASkCiAo3AqwEIABBtARqIAFBkApqKAIANgIAEMcEIgJFDQEgAEEDOgC4BCAAIBg3AzggACAKNwMwIAAgDjcDKCAAIBE3AyAgACAZNwMYIAAgDzcDECAAIBI3AwggACATNwMAIABBgLHCACkDADcD4AEgAEHoAWpBiLHCACkDADcDACAAIAIpAwg3A/gBIAAgAikDACIGNwPwASACIAZCAXw3AwAgAEH4AGpCADcDACAAQfAAakIANwMAIABB6ABqQgA3AwAgAEHgAGpCADcDACAAQdgAakIANwMAIABB0ABqQgA3AwAgAEHIAGpCADcDACAAQgA3A0AgACALNwOAASAAIAk3A4gBIAAgBTcDkAEgACAQNwOYASAAIAg3A6ABIAAgBzcDqAEgACADNwOwASAAIAw3A7gBIABCADcDmAMgAEIANwPgAyAAQQE2AqgEIABCADcDiAIgAEIANwOAAiAAQvn////fADcDwAEgAEJ/NwPIASAAQoCAgICgfzcD0AEgAEIGNwPYASAAQgE3A6gCIABCADcDsAIgAEIANwOgAiAAQYCAgIB4NgKQAiABQbAKaiQADwsgASABLQCMCjoArwpBjPfBAEErIAFBrwpqQeT7wQBB+P7BABDKAwALEPADAAuMNAIefgJ/IwBBoAVrIiEkACABKQMAIRogASkDCCEIIAEpAxAhCyABKQMYIQwgASkDICEOIAEpAyghD0EoISIDQCAhQZAEaiACICJqKQMAIgVCACAPQgAQyQMgIUGgBGogBUIAIA5CABDJAyAhQbAEaiAFQgAgDEIAEMkDICFBwARqIAVCACALQgAQyQMgIUHQBGogBUIAIAhCABDJAyAhQeAEaiAFQgAgGkIAEMkDICFBgARqICEpA5AEIg0gFHwi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Qu7/////////d0Lv/////////3cgAiADVhsgCnwhCgtCkYCAgICAgIAIIQQgFCAUIBR8IgVWIAUgDSANfCIDIA1UIAMgAyAIIAh8IgIgCFStfCIIVnKtfCIGIAVUcq0gB0IBhoQiByEDAkACQCAHQpGAgICAgICACFEEQCACQgFRDQEgAiEDQgEhBCAGIAiEQgBSDQELIAMgBFoNACAGIQMgCCEEIAIhBQwBCyACQgF9IQUgCCACUK0iAn0hBCAGIAIgCFatIgJ9IQNC7v////////93Qu//////////dyACIAZWGyAHfCEHC0KRgICAgICAgAghBiADIAt8Ig0gC1QgDSANIAQgDHwiAyAMVCADIAUgCXwiAiAJVK18IgggA1RyrXwiA1ZyrSAHIAp8fCIHIQQCQAJAIAdCkYCAgICAgIAIUQRAIAMgCIRCAFINAUIBIQYgAiIEQgFRDQELIAQgBloNACADIQYgCCEEIAIhBQwBCyACQgF9IQUgCCACUK0iAn0hBCADIAIgCFatIgJ9IQZC7v////////93Qu//////////dyACIANWGyAHfCEHCyAAIAU3AxggACAENwMQIAAgBjcDCCAAIAc3AwBCkYCAgICAgIAIIQYgEiASfCIEIBJUIAQgEyATfCIDIBNUIAMgDyAPfCICIA9UrXwiCCADVHKtfCIDIARUcq0gDkIBhoQiByEEAkACQCAHQpGAgICAgICACFEEQCACQgFRDQEgAiEEQgEhBiADIAiEQgBSDQELIAQgBloNACADIQQgCCEGIAIhBQwBCyACQgF9IQUgCCACUK0iAn0hBiADIAIgCFatIgJ9IQRC7v////////93Qu//////////dyACIANWGyAHfCEHCyAAAn4CQAJAIAoiAiAHIgNSDQAgCyICIAQiA1INACAGIgMgDCICUg0AIAkiAiAFIgNRDQELIAIgA1oNACAGIAxUIAUgCVStIgMgBiAMfSICVnKtIg8gBCALfSINfSIOIAIgA1IgAyACfSIIIAUgCX0iBUIBVq0iA1RyrSICfSEGIA0gD1IgAiAOVnIhASAIIAN9IQMgBCALVCANIA9Ucq0gCiAHfXxCkYCAgICAgIAIfCEHQgEgBX0MAQsgDCAGfSIOIAUgCVatIgJ9IQMgCyAEfSIIIAIgDlYgBiAMVnKtIgJ9IQYgAiAIViAEIAtWciEBIAogB30hByAJIAV9CzcDOCAAIAM3AzAgACAGNwMoIAAgByABrX03AyBCkYCAgICAgIAIIQUgFSAVfCIDIBVUIAMgFiAWfCICIBZUIAIgAiARIBF8IgQgEVStfCIIVnKtfCIGIANUcq0gEEIBhoQiByECAkACQCAHQpGAgICAgICACFEEQCAEQgFRDQEgBCECQgEhBSAGIAiEQgBSDQELIAIgBVoNACAGIQUgCCECIAQhAwwBCyAEQgF9IQMgCCAEUK0iBH0hAiAGIAQgCFatIgR9IQVC7v////////93Qu//////////dyAEIAZWGyAHfCEHC0KRgICAgICAgAghBiAFIAUgFXwiBVYgBSACIBZ8IgQgAlQgBCADIBF8IgIgA1StfCIIIARUcq18IgMgBVRyrSAHIBB8fCIHIQQCQAJAIAdCkYCAgICAgIAIUQRAQgEhBiACQgFRIANCAFJyDQEgAiEEIAhCAFINAQsgBCAGWg0AIAMhBCAIIQYgAiEFDAELIAJCAX0hBSAIIAJQrSICfSEGIAMgAiAIVq0iAn0hBELu/////////3dC7/////////93IAIgA1YbIAd8IQcLAkACQCAKIgIgByIDUg0AIAsiAiAEIgNSDQAgBiIDIAwiAlINACAJIgIgBSIDUQ0BCyACIANaDQAgBiAMVCAFIAlUrSIDIAYgDH0iAlZyrSINIAQgC30iDn0iCCACIANSIAMgAn0iBiAFIAl9IgVCAVatIgNUcq0iAn0hDCANIA5SIAIgCFZyIQEgBiADfSEDIAQgC1QgDSAOVnKtIAogB318QpGAgICAgICACHwhCkIBIAV9DAELIAwgBn0iDiAFIAlWrSICfSEDIAsgBH0iCCACIA5WIAYgDFZyrSICfSEMIAIgCFYgBCALVnIhASAKIAd9IQogCSAFfQs3A1ggACADNwNQIAAgDDcDSCAAIAogAa19NwNAIBdBoARqJAAL0ycCCX8PfiMAQaAMayIDJAAgA0HgBWogAUEYaikDADcDACADQdgFaiABQRBqKQMANwMAIANB0AVqIAFBCGopAwA3AwAgA0HwBWogAkEIaikDADcDACADQfgFaiACQRBqKQMANwMAIANBgAZqIAJBGGopAwA3AwAgA0EAOgCIBiADIAEpAwA3A8gFIAMgAikDADcD6AUgA0HoBWohBwJAAkACQAJAIANByAVqQejRwQBBIBDxA0UEQCAHQejRwQBBIBDxA0UNAQsgA0GwBmoiAhBJIANB0AZqIQQgA0GQDGogAkEYaikDADcDACADQYgMaiACQRBqKQMANwMAIANBgAxqIAJBCGopAwA3AwAgAyACKQMANwP4CyADQdAEaiADKQP4BSINQgAgAykDgAYiDEIAEMkDIANBwARqIAMpA/AFIg5CACAMQgAQyQMgA0GwBGogAykD6AUiD0IAIAxCABDJAyADQYAFaiAOQgAgDUIAEMkDIANB8ARqIA9CACANQgAQyQMgA0GgBWogD0IAIA5CABDJAyADQaAEaiAMQgAgDEIAEMkDIANB4ARqIA1CACANQgAQyQMgA0GQBWogDkIAIA5CABDJAyADQbAFaiAPQgAgD0IAEMkDIANBkARqIAMpA6AEIhNCm5Svw/K1qN6Gf34iDUIAQm1CABDJAyADQYAEaiANQgBCf0IAEMkDIANB8ANqIA1CAEL///////////8AQgAQyQMgAykDqAUgAykD+AQgAykDuAQgAykDyAQgAykD2AQiDCADKQPABHwiDSAMVK18Ig4gAykDsAR8IgwgDlStfCIPIAMpA/AEfCIOIA9UrXwgDiAOIAMpA4gFIAwgDCADKQOABXwiD1atfHwiDFatfCIRIAMpA6AFfCIOIBFUrXwiEUI/iCADKQO4BSADKQOwBSIQIBFCAYYgDkI/iIR8IhEgEFStfCARIAMpA5gFIAMpA+gEIAMpA+AEIhIgDUIBhiADKQPQBCIVQj+IhHwiECASVK18IBAgAykDqAQiEiAVQgGGfCIVIBJUrXwiFyAQVK18IhAgD0IBhiANQj+IhHwiGCAQVK0iDSADKQOQBXwiECANVK18IBAgECAMQgGGIA9CP4iEfCINVq18Ig8gDkIBhiAMQj+IhHwiEiAPVK18IhAgEVStfHwhEQJ/AkAgAykD+AMgAykDiAQiDiAOIAMpA5gEIAMpA5AEIgwgE0J9g3wgDFStfCIPIAMpA4AEIhN8IgwgD1StfCAMIAwgFXwiDlatfCIPIBN8IgwgD1StfCAMIBd8Ig8gDFStfCITIAMpA/ADfCIMIBNUrXwgDCAYfCITIAxUrXwiDFANACAMIA18Ig0gDFQiAkUNACACrSIMIBJ8IhIgDFoNACAMIBJWrSIMIBB8IhAgDFoNACAMIBBWrSIMIBF8IhEgDFQMAQtBAAshBiAEKQMAIRUgBCkDCCEXIAQpAxAhGCAEKQMYIRkgA0HgA2ogDkKblK/D8rWo3oZ/fiIMQgBCbUIAEMkDIANB0ANqIAxCAEJ/QgAQyQMgA0HAA2ogDEIAQv///////////wBCABDJAwJAIAMpA8gDIAMpA9gDIhQgFCADKQPoAyAOIAMpA+ADIgx8IAxUrXwiDiADKQPQAyIWfCIMIA5UrXwgDCAMIA98Ig5WrXwiDyAWfCIMIA9UrXwgDCATfCIPIAxUrXwiEyADKQPAA3wiDCATVK18IAwgDCANfCITVq18Ig1QDQAgDSASfCISIA1aDQAgDSASVq0iDSAQfCIQIA1aDQAgDSAQVq0iDSARfCIRIA1UIQULIANBsANqIA5Cm5Svw/K1qN6Gf34iDUIAQm1CABDJAyADQaADaiANQgBCf0IAEMkDIANBkANqIA1CAEL///////////8AQgAQyQNBACECIAMpA5gDIAMpA6gDIgwgDCADKQO4AyADKQOwAyINIA58IA1UrXwiDiADKQOgAyIUfCINIA5UrXwgDSANIA98IgxWrXwiDiAUfCINIA5UrXwgDSATfCIOIA1UrXwiDyADKQOQA3wiDSAPVK18IA0gEnwiDyANVK18Ig1QRQRAIA0gEHwiECANVCICrSINIBF8IhIgESACGyERIAIgDSASVnEhAgsgA0GAA2ogDEKblK/D8rWo3oZ/fiINQgBCbUIAEMkDIANB8AJqIA1CAEJ/QgAQyQMgA0HgAmogDUIAQv///////////wBCABDJAyADKQPoAiADKQP4AiISIBIgAykDiAMgDCADKQOAAyINfCANVK18IgwgAykD8AIiE3wiDSAMVK18IA0gDnwiEiANVK18IgwgE3wiDSAMVK18IA0gD3wiDiANVK18Ig0gAykD4AJ8IgwgDVStfCAMIAwgEHwiDVatfCIMIBF8Ig8gESAMQgBSIgQbIRECQAJAIAUgBnIgAnIgDCAPViICrSAMIAQbQgBSciACIARxIBFCAFNyckUEQEL///////////8AIQ8gEUL///////////8AUiANQn9SciAOQn9Scg0CQn8hEEJ/IQwgEkJtVA0CDAELIBEhDyANIRAgDiEMCyAMQgF8Ig0gEkJtVK0iEX0hDiAQQgF8IhMgDEJ/UiANIBFUcq0iDH0hDSAPIBBCf1IgDCATVnKtfUL///////////8AfSERIBJCE3whEgsgAyASNwOQCyADIA43A4gLIAMgDTcDgAsgAyARNwP4CiADQfABaiADKQPYBSINQgAgAykD4AUiDEIAEMkDIANB4AFqIAMpA9AFIg5CACAMQgAQyQMgA0HQAWogAykDyAUiD0IAIAxCABDJAyADQaACaiAOQgAgDUIAEMkDIANBkAJqIA9CACANQgAQyQMgA0HAAmogD0IAIA5CABDJAyADQcABaiAMQgAgDEIAEMkDIANBgAJqIA1CACANQgAQyQMgA0GwAmogDkIAIA5CABDJAyADQdACaiAPQgAgD0IAEMkDIANBsAFqIAMpA8ABIhNCm5Svw/K1qN6Gf34iDUIAQm1CABDJAyADQaABaiANQgBCf0IAEMkDIANBkAFqIA1CAEL///////////8AQgAQyQMgAykDyAIgAykDmAIgAykD2AEgAykD6AEgAykD+AEiDCADKQPgAXwiDSAMVK18Ig4gAykD0AF8IgwgDlStfCIPIAMpA5ACfCIOIA9UrXwgDiAOIAMpA6gCIAwgDCADKQOgAnwiD1atfHwiDFatfCIRIAMpA8ACfCIOIBFUrXwiEUI/iCADKQPYAiADKQPQAiIQIBFCAYYgDkI/iIR8IhEgEFStfCARIAMpA7gCIAMpA4gCIAMpA4ACIhIgDUIBhiADKQPwASIUQj+IhHwiECASVK18IBAgAykDyAEiEiAUQgGGfCIUIBJUrXwiFiAQVK18IhAgD0IBhiANQj+IhHwiGiAQVK0iDSADKQOwAnwiECANVK18IBAgECAMQgGGIA9CP4iEfCINVq18Ig8gDkIBhiAMQj+IhHwiEiAPVK18IhAgEVStfHwhEUEAIQUCfwJAIAMpA5gBIAMpA6gBIg4gDiADKQO4ASADKQOwASIMIBNCfYN8IAxUrXwiDyADKQOgASITfCIMIA9UrXwgDCAMIBR8Ig5WrXwiDyATfCIMIA9UrXwgDCAWfCIPIAxUrXwiEyADKQOQAXwiDCATVK18IAwgGnwiEyAMVK18IgxQDQAgDCANfCINIAxUIgJFDQAgAq0iDCASfCISIAxaDQAgDCASVq0iDCAQfCIQIAxaDQAgDCAQVq0iDCARfCIRIAxUDAELQQALIQYgA0GAAWogDkKblK/D8rWo3oZ/fiIMQgBCbUIAEMkDIANB8ABqIAxCAEJ/QgAQyQMgA0HgAGogDEIAQv///////////wBCABDJAwJAIAMpA2ggAykDeCIUIBQgAykDiAEgDiADKQOAASIMfCAMVK18Ig4gAykDcCIWfCIMIA5UrXwgDCAMIA98Ig5WrXwiDyAWfCIMIA9UrXwgDCATfCIPIAxUrXwiEyADKQNgfCIMIBNUrXwgDCAMIA18IhNWrXwiDVANACANIBJ8IhIgDVoNACANIBJWrSINIBB8IhAgDVoNACANIBBWrSINIBF8IhEgDVQhBQsgA0HQAGogDkKblK/D8rWo3oZ/fiINQgBCbUIAEMkDIANBQGsgDUIAQn9CABDJAyADQTBqIA1CAEL///////////8AQgAQyQNBACECIAMpAzggAykDSCIMIAwgAykDWCADKQNQIg0gDnwgDVStfCIOIAMpA0AiFHwiDSAOVK18IA0gDSAPfCIMVq18Ig4gFHwiDSAOVK18IA0gE3wiDiANVK18Ig8gAykDMHwiDSAPVK18IA0gEnwiDyANVK18Ig1QRQRAIA0gEHwiECANVCICrSINIBF8IhIgESACGyERIAIgDSASVnEhAgsgA0EgaiAMQpuUr8Pytajehn9+Ig1CAEJtQgAQyQMgA0EQaiANQgBCf0IAEMkDIAMgDUIAQv///////////wBCABDJAyADKQMIIAMpAxgiEiASIAMpAyggDCADKQMgIg18IA1UrXwiDCADKQMQIhN8Ig0gDFStfCANIA58IhIgDVStfCIMIBN8Ig0gDFStfCANIA98Ig4gDVStfCINIAMpAwB8IgwgDVStfCAMIAwgEHwiDVatfCIMIBF8Ig8gESAMQgBSIgQbIRECQAJAIAUgBnIgAnIgDCAPViICrSAMIAQbQgBSciACIARxIBFCAFNyckUEQEL///////////8AIQ8gEUL///////////8AUiANQn9SciAOQn9Scg0CQn8hEEJ/IQwgEkJtVA0CDAELIBEhDyANIRAgDiEMCyAMQgF8Ig0gEkJtVK0iEX0hDiAQQgF8IhMgDEJ/UiANIBFUcq0iDH0hDSAPIBBCf1IgDCATVnKtfUL///////////8AfSERIBJCE3whEgsgAyASNwPQCyADIA43A8gLIAMgDTcDwAsgAyARNwO4CyADQfALaiICIAFBGGoiBCkDADcDACADQegLaiIFIAFBEGoiBikDADcDACADQeALaiIIIAFBCGoiCSkDADcDACADIAEpAwA3A9gLIANBmAtqIANBuAtqIgogA0HYC2oiCxB8IAIgBCkDADcDACAFIAYpAwA3AwAgCCAJKQMANwMAIAMgASkDADcD2AsgCiADQfgLaiALEHwgAykDmAsiECADKQO4C3wiDSADKQOgCyIMIAMpA8ALfCIOIAxUIA4gAykDqAsiDCADKQPIC3wiDyAMVCAPIA8gAykDsAsiDCADKQPQC3wiESAMVK18IgxWcq18IhIgDlRyrXwhDwJAAkACQCANIBBUIA0gD1ZyDQBC////////////ACEQIA8iDUL///////////8AUQRAQn8hEEL///////////8AIQ0gEkJ/Ug0CIAxCf1IEQCAMIQ4MBAtCbSEQIBEiDUJtUQ0BCyANIBBaDQAgDyENDAELIAxCAXwiDSARQm1UrSIQfSEOIBJCAXwiEyAMQn9SIA0gEFRyrSINfSEQIA8gEkJ/UiANIBNWcq19Qv///////////wB9IQ0gEUITfCERDAELIBIhECAMIQ4LIA0gFXwiDCAQIBd8Ig8gEFQgDyAOIA4gGHwiEFYgECAQIBEgGXwiEiARVK18Ig5Wcq18IhAgD1RyrXwhEQJAAkACQCAMIA1UIAwgEVZyDQBC////////////ACENIBEiDEL///////////8AUQRAQn8hDUL///////////8AIQwgEEJ/Ug0CIA5Cf1IEQCAOIQ8MBAtCbSENIBIiDEJtUQ0BCyAMIA1aDQAgESEMDAELIA5CAXwiDSASQm1UrSIMfSEPIBBCAXwiEyAOQn9SIAwgDVZyrSIMfSENIBEgEEJ/UiAMIBNWcq19Qv///////////wB9IQwgEkITfCESDAELIBAhDSAOIQ8LIAMgEjcD8AsgAyAPNwPoCyADIA03A+ALIAMgDDcD2AsgA0H4CmogA0HYC2pBIBDxAyADKALcCiIBBEAgAygC4AogAUECdBDfBAsCQCADKAKUCCIBRQ0AIAEgAUEMbEETakF4cSIEakEJaiIBRQ0AIAMoApAIIARrIAEQ3wQLIAMoAsAIIgFBgICAgHhGIAFFckUEQCADKALECCABQQJ0EN8ECw0BCyAAIANByAVqQcgA/AoAAAwBCyADQfgLaiIBIANByAVqENgBIANBADYC4AsgA0KAgICAEDcC2AsgA0Gw18EANgK0BiADQqCAgIAONwK4BiADIANB2AtqIgI2ArAGIAEgA0GwBmoiARDTAg0BIANBmAZqIANB4AtqKAIANgIAIAMgAykC2As3A5AGIAEgBxDYASADQQA2AoALIANCgICAgBA3AvgKIANBsNfBADYCvAsgA0KggICADjcCwAsgAyADQfgKajYCuAsgASADQbgLahDTAg0BIANBqAZqIANBgAtqKAIANgIAIAMgAykC+Ao3A6AGIANBAzYC3AsgA0Ho9cEANgLYCyADQgI3AuQLIAMgA0GgBmqtQoCAgIDAB4Q3A6ALIAMgA0GQBmqtQoCAgIDAB4Q3A5gLIAMgA0GYC2o2AuALIAAgAhDSAiADKAKgBiIBBEAgAygCpAYgARDfBAsgAygCkAYiAQRAIAMoApQGIAEQ3wQLIABBAjoAQAsgA0GgDGokAA8LQdjXwQBBNyADQZ8MakHI18EAQdzYwQAQygMAC4UmAhR+Bn8jAEGgBGsiFSQAIABBABBEIABBAxBEIABBBhBEIABBCRBEIAApA0AhCSAAKQNIIQsgACkDUCEHIAApA1ghDUGgayEXA0AgCyAXQZDxwQBqKQMAfCIKIAtUIAogByAHIBdBmPHBAGopAwB8IgJWIAIgDSAXQaDxwQBqKQMAfCIBIA1UrXwiAyACVHKtfCICIApUcq0gF0GI8cEAaikDACAJfHwiDSEKQpGAgICAgICACCEJAkACQCANQpGAgICAgICACFEEQEIBIQkgAUIBUQ0BIAEhCiACIAOEQgBSDQELIAkgClgNACABIQkgAyELIAIhCgwBCyABQgF9IQkgAyABUK0iAX0hCyACIAEgA1atIgF9IQogDULu/////////3dC7/////////93IAEgAlYbfCENCyAVQfADaiALQgAgCUIAEMkDIBVB0ANqIApCACAJQgAQyQMgFUGgA2ogDUIAIAlCABDJAyAVQcADaiAKQgAgC0IAEMkDIBVBkANqIA1CACALQgAQyQMgFUGAA2ogDUIAIApCABDJAyAVQZAEaiAJQgAgCUIAEMkDIBVB4ANqIAtCACALQgAQyQMgFUGwA2ogCkIAIApCABDJAyAVQfACaiANQgAgDUIAEMkDIBVBgARqQgAgFSkDkAQiD31CAEKRgICAgICAgAhCABDJAyAVKQOIAyAVKQOYAyAVKQOoAyAVKQPYAyAVKQP4AyIBIBUpA9ADfCIGIAFUrXwiASAVKQOgA3wiAyABVK18IgEgFSkDkAN8IgIgAVStfCACIBUpA8gDIAMgFSkDwAN8IgcgA1StfHwiBSACVK18IgEgFSkDgAN8IgwgAVStfCICQj+IIBUpA/gCIBUpA/ACIgEgAkIBhiAMQj+IhHwiCCABVK18IAggCCAVKQO4AyAVKQPoAyAVKQPgAyIBIAZCAYYgFSkD8AMiAkI/iIR8IgMgAVStfCADIAMgFSkDmAQiASACQgGGfCIEIAFUrXwiA1atfCIBIAdCAYYgBkI/iIR8IgIgAVStIgEgFSkDsAN8IgYgAVStfCAGIAYgBUIBhiAHQj+IhHwiB1atfCIBIAxCAYYgBUI/iIR8IgwgAVStfCIGVq18fCEFQQAhGgJ/QQAgFSkDiAQgD0J9gyIBIA99IAFUrSIBIAR8IgggAVStIgEgA3wiAyABVK0iASAVKQOABHwiBCABVK18IAIgBHwiAiAEVK18IgFQDQAaQQAgASABIAd8IgdYDQAaQQAgASAHVq0iASAMfCIMIAFaDQAaQQAgASAMVq0iASAGfCIGIAFaDQAaIAEgBlatIgEgBXwiBSABVAshGSAVQeACakIAIAh9QgBCkYCAgICAgIAIQgAQyQMCQCAVKQPoAiAIQgBSrSIBIAN8IgQgAVStIgEgAnwiAyABVK0iASAVKQPgAnwiAiABVK18IAIgAiAHfCICVq18IgFQDQAgASAMfCIMIAFaDQAgASAMVq0iASAGfCIGIAFaDQAgASAGVq0iASAFfCIFIAFUIRoLIBVB0AJqQgAgBH1CAEKRgICAgICAgAhCABDJA0EAIRYgFSkD2AIgBEIAUq0iASADfCIEIAFUrSIBIAJ8IgcgAVStIgEgFSkD0AJ8IgIgAVStfCACIAx8IgMgAlStfCIBUEUEQCABIAZ8IgYgAVQiGK0iAiAFfCIBIAUgGBshBSAYIAEgAlRxIRYLIBVBwAJqQgAgBH1CAEKRgICAgICAgAhCABDJAyAVKQPIAiADIARCAFKtIgEgB3wiAyABVK0iAXwiAiABVK0iASAVKQPAAnwiByABVK18IAYgB3wiASAHVK18IgYgBXwiByAFIAZCAFIiGBshBAJ+AkAgGSAaciAWciAGIAdWIhmtIAYgGBtCAFJyIBggGXEgBEKRgICAgICAgAhWcnINACAEQpGAgICAgICACFIEQCADIQUgAiEGIAEhDCAEDAILQgAhBSABIAKEQgBSDQBCACEGQgAhDEKRgICAgICAgAggA1ANARoLIANCAX0hBSACIANQrSIDfSEGIAEgAiADVK0iAn0hDCAEIAEgAlStfUKRgICAgICAgAh9CyEPIBVBsAJqIAVCACAJQgAQyQMgFUHgAWogBkIAIAlCABDJAyAVQZABaiAMQgAgCUIAEMkDIBVBQGsgD0IAIAlCABDJAyAVQaACakIAIBUpA7ACIgF9QgBCkYCAgICAgIAIQgAQyQMgFUGQAmogBUIAIAtCABDJAyAVQcABaiAGQgAgC0IAEMkDIBVB8ABqIAxCACALQgAQyQMgFUEgaiAPQgAgC0IAEMkDIBVB0AFqQgAgAUIAUq0iAyAVKQO4AiICIBUpA+ABfCIBfCIEIBUpA5ACfCIHfUIAQpGAgICAgICACEIAEMkDIBVBgAJqIAVCACAKQgAQyQMgFUGwAWogBkIAIApCABDJAyAVQeAAaiAMQgAgCkIAEMkDIBVBEGogD0IAIApCABDJAyAVQYABakIAIAdCAFKtIgkgAyAEVq0iCiAVKQPoASABIAJUrXwiAyAVKQOQAXwiAnwiDiAVKQPAAXwiCyAVKQOYAiAEIAdWrXx8IgF8IgggFSkDgAJ8IgR9QgBCkYCAgICAgIAIQgAQyQMgFUHwAWogBUIAIA1CABDJAyAVQaABaiAGQgAgDUIAEMkDIBVB0ABqIAxCACANQgAQyQMgFSAPQgAgDUIAEMkDIBVBMGpCACAVKQOIAiAEIAhUrXwiByAVKQOwAXwiDCAVKQOYASACIANUrXwiAyAVKQNAfCIQIBUpA6ACfCIGIAogDlatfCINIBUpA3B8Ig8gASALVK0gFSkDyAEgCyAOVK18fHwiCyAIIAlUrXwiAnwiBSAEQgBSrXwiBCAVKQPwAXwiEX1CAEKRgICAgICAgAhCABDJAwJAAkAgFSkDOCAVKQOoASAVKQP4ASAEIBFWrXwiASAVKQOgAXwiCSABVK18IAkgBSAMVK0gFSkDuAEgByAMVq18fCIMIBUpA2B8Ig4gAiALVK0iCiAVKQPQAXwiCCAGIA1WrSAVKQOoAiAGIBBUrXx8IBUpA0ggAyAQVq18fCIHIBUpAyB8IgYgCyAPVK0gFSkDeCANIA9WrXx8fCIDfCICfCILIAQgBVStfCIBfCINIAlUrXwiBCAVKQNQfCIPIAEgC1StIgkgFSkDgAF8IgUgAiAIVK0gFSkD2AEgCCAKVK18fCADIAZUrSAVKQMoIAYgB1StfHx8IgYgFSkDEHwiCCALIA5UrSAVKQNoIAwgDlatfHx8Igp8Igd8IgsgDSARQgBSrXwiAyANVK18IgIgC1StIgEgFSkDMHwiDCABVK18IAwgBSAHVq0gFSkDiAEgBSAJVK18fCAIIApWrSAVKQMYIAYgCFatfHx8IgogFSkDAHwiBiALIA9UrSAVKQNYIAQgD1atfHx8Igd8IgEgDFStfCAGIAdWrSAVKQMIIAYgClStfHx8Ig9CkYCAgICAgIAIVg0AIA9CkYCAgICAgIAIUgRAIAMhBiACIQwgASEHDAILIAIgA4QgAYRQRQ0AQpGAgICAgICACCEPQgAhBkIAIQxCACEHDAELIANCAX0hBiACIANQrSIDfSEMIAEgAiADVK0iAn0hByAPIAEgAlStfUKRgICAgICAgAh9IQ8LQpGAgICAgICACCEDIAApAwgiECAAKQMoIhN8IgIgEFQgAiAAKQMQIg4gACkDMCIUfCIBIA5UIAEgACkDGCIIIAApAzgiEnwiCiAIVK18IgQgAVRyrXwiCSACVHKtIAApAyAiESAAKQMAIgV8fCINIQICQAJAIA1CkYCAgICAgIAIUQRAQgEhAyAKQgFRDQEgCiECIAQgCYRCAFINAQsgAiADWg0AIAkhAyAEIQIgCiEBDAELIApCAX0hASAEIApQrSIDfSECIAkgAyAEVq0iCn0hAyANQu7/////////d0Lv/////////3cgCSAKVBt8IQ0LQpGAgICAgICACCELIAMgB3wiCiADVCAKIAIgAiAMfCIDViADIAMgASABIAZ8IgJWrXwiA1ZyrXwiASAKVHKtIA0gD3x8Ig0hCQJAAkAgDUKRgICAgICAgAhRBEBCASELIAJCAVEgAUIAUnINASACIQkgA0IAUg0BCyAJIAtaDQAgASEJIAMhCyACIQoMAQsgAkIBfSEKIAMgAlCtIgJ9IQsgASACIANWrSICfSEJIA1C7v////////93Qu//////////dyABIAJUG3whDQtCkYCAgICAgIAIIQEgECAQfCIEIBBUIAQgDiAOfCIDIA5UIAMgCCAIfCICIAhUrXwiDiADVHKtfCIIIARUcq0gBUIBhoQiBSEDAkACQCAFQpGAgICAgICACFEEQEIBIQEgAkIBUQ0BIAIhAyAIIA6EQgBSDQELIAEgA1gNACAIIQMgDiEBIAIhBAwBCyACQgF9IQQgDiACUK0iAn0hASAIIAIgDlatIgJ9IQMgBULu/////////3dC7/////////93IAIgCFYbfCEFC0KRgICAgICAgAghAiADIAl8IhAgCVQgECAQIAEgC3wiASALVCABIAQgCnwiAyAKVK18Ig4gAVRyrXwiCFZyrSAFIA18fCIFIQECQAJAIAVCkYCAgICAgIAIUQRAIAggDoRCAFINAUIBIQIgAyIBQgFRDQELIAEgAloNACAIIQIgDiEBIAMhBAwBCyADQgF9IQQgDiADUK0iAn0hASAIIAIgDlatIgN9IQIgBULu/////////3dC7/////////93IAMgCFYbfCEFCyAAIAQ3AxggACABNwMQIAAgAjcDCCAAIAU3AwBCkYCAgICAgIAIIQIgEyATfCIDIBNUIAMgAyAUIBR8IgEgFFQgASASIBJ8Ig4gElStfCIEIAFUcq18IgNWcq0gEUIBhoQiBSEBAn4CQCAFQpGAgICAgICACFEEQEIBIQIgDkIBUQ0BIA4hASADIASEQgBSDQELIAEgAloNACADIQEgBCEIIA4MAQsgBCAOUK0iAX0hCCADIAEgBFatIgJ9IQEgBULu/////////3dC7/////////93IAIgA1YbfCEFIA5CAX0LIQQgAAJ+AkACQCANIgIgBSIDUg0AIAEhAyABIAkiAlINACALIgIgCCIDUg0AIAoiAiAEIgNRDQELIAIgA1oNACAIIAtUIAQgClStIgMgCCALfSICVnKtIhIgASAJfSIQfSIRIAIgA1IgAyACfSIOIAQgCn0iCEIBVq0iBFRyrSICfSEDIBAgElIgAiARVnIhFiAOIAR9IQIgASAJVCAQIBJUcq0gDSAFfXxCkYCAgICAgIAIfCEFQgEgCH0MAQsgCyAIfSIRIAQgClatIgN9IQIgCSABfSIOIAMgEVYgCCALVnKtIgh9IQMgCCAOViABIAlWciEWIA0gBX0hBSAKIAR9CzcDOCAAIAI3AzAgACADNwMoIAAgBSAWrX03AyBCkYCAgICAgIAIIQggByAHfCIEIAdUIAQgBCAMIAx8IgIgDFQgAiAGIAZ8IgEgBlStfCIOIAJUcq18IgNWcq0gD0IBhoQiBSEEAkACQCAFQpGAgICAgICACFEEQEIBIQggAUIBUSADQgBScg0BIAEhBCAOQgBSDQELIAQgCFoNACADIQggDiEEIAEhAgwBCyABQgF9IQIgDiABUK0iAX0hBCADIAEgDlatIgF9IQggBULu/////////3dC7/////////93IAEgA1YbfCEFC0KRgICAgICAgAghAyAIIAcgCHwiDlYgDiAEIAx8IgcgBFQgByAHIAIgBnwiASACVK18IgdWcq18IgIgDlRyrSAFIA98fCIFIQYCQAJAIAVCkYCAgICAgIAIUQRAIAIgB4RCAFINAUIBIQMgASIGQgFRDQELIAMgBlgNACACIQYgByEMIAEhDwwBCyABQgF9IQ8gByABUK0iAX0hDCACIAEgB1atIgF9IQYgBULu/////////3dC7/////////93IAEgAlYbfCEFCwJ+AkACQCANIgEgBSIHUg0AIAkiASAGIgdSDQAgCyIBIAwiB1INACAKIgEgDyIHUQ0BCyABIAdaDQAgCyAMViAKIA9WrSICIAwgC30iAVZyrSIIIAYgCX0iDH0iBCABIAJSIAIgAX0iByAPIAp9IgNCAVatIgJUcq0iAX0hCyAIIAxSIAEgBFZyIRYgByACfSEHIAYgCVQgCCAMVnKtIA0gBX18QpGAgICAgICACHwhCUIBIAN9DAELIAsgDH0iAyAKIA9UrSIBfSEHIAkgBn0iAiALIAxUIAEgA1ZyrSIBfSELIAYgCVYgASACVnIhFiANIAV9IQkgCiAPfQshDSAJIBatfSEJIBdBIGoiFw0ACyAAIAc3A1AgACANNwNYIAAgCzcDSCAAIAk3A0AgAEHfABBEIABB4gAQRCAAQeUAEEQgAEHoABBEIBVBoARqJAAL/SwCAX8UfiMAQcAKayICJAAgAkGwCmogASkDGCILQgAgC0IAEMkDIAJB4AlqIAEpAxAiDUIAIAtCABDJAyACQYAJaiABKQMIIhFCACALQgAQyQMgAkGQCGogASkDACISQgAgC0IAEMkDIAJBoApqIAIpA7AKIgRC/////76y/fBCfiIDQgBCgYCAgL+y/fDDAEIAEMkDIAJBkApqIANCAEKR4eXNh4n6mShCABDJAyACQYAKaiADQgBC3bCFjOi2kai4f0IAEMkDIAJB8AlqIANCAEKpwMaJrs6TsjBCABDJAyACQZAJaiANQgAgDUIAEMkDIAJBsAhqIBFCACANQgAQyQMgAkHAB2ogEkIAIA1CABDJAyACQdAJaiACKQOQCiIKIAIpA7gKIgggAikD4AkiA3wiCXwiBSACKQOoCiACKQOgCiIHIARCfYN8IAdUrXx8IgQgA3wiB0L/////vrL98EJ+IgNCAEKBgICAv7L98MMAQgAQyQMgAkHACWogA0IAQpHh5c2HifqZKEIAEMkDIAJBsAlqIANCAELdsIWM6LaRqLh/QgAQyQMgAkGgCWogA0IAQqnAxomuzpOyMEIAEMkDIAJBoAhqIBFCACARQgAQyQMgAkGwB2ogEkIAIBFCABDJAyACQfAIaiACKQPoCSIDIAQgB1atfCIQIAIpA5AJfCIGIAMgCCAJVq18IgwgAikDgAkiA3wiCCACKQOACnwiCSAEIAVUrSACKQOYCiAFIApUrXx8fCITfCIFIAIpA8AJfCIEIAIpA9gJIAcgAikD0AkiB3wgB1StfHwiByADfCIKQv////++sv3wQn4iA0IAQoGAgIC/sv3wwwBCABDJAyACQeAIaiADQgBCkeHlzYeJ+pkoQgAQyQMgAkHQCGogA0IAQt2whYzotpGouH9CABDJAyACQcAIaiADQgBCqcDGia7Ok7IwQgAQyQMgAkGgB2ogEkIAIBJCABDJAyACQYAIaiACKQOICSIDIAcgClatfCIVIAIpA7AIIg58Ig8gDiADIAggDFStfCIUIAIpA5AIIgN8IgwgAikD8Al8Ig4gCSATVq0gAikDiAogCCAJVq18fHwiCHwiCSAFIAZUrSACKQOYCSAGIBBUrXx8fCIGIAIpA7AJfCIQIAQgB1atIAIpA8gJIAQgBVStfHx8IhN8IgUgAikD4Ah8IgQgAikD+AggAikD8AgiByAKfCAHVK18fCIHIAN8IgpC/////76y/fBCfiIDQgBCgYCAgL+y/fDDAEIAEMkDIAJB8AdqIANCAEKR4eXNh4n6mShCABDJAyACQeAHaiADQgBC3bCFjOi2kai4f0IAEMkDIAJB0AdqIANCAEKpwMaJrs6TsjBCABDJAwJAAkAgAikD2AcgAikDyAggAikDqAkgCCAOVK0gAikD+AkgDCAOVq18fCACKQOYCCIOIAwgFFStfHwiDCACKQPAByIUfCIDIAYgCVStIAIpA7gIIhYgCCAJVq18fHwiCCACKQOgCXwiCSAIVK18IAkgECATVq0gAikDuAkgBiAQVq18fHwiBiAJVK18IAMgCFatIAIpA8gHIhAgAyAMVK18fHwiDCACKQOwByITfCIDIAIpA6gIIAYgBiACKQOgCHwiBlatfCAGIAYgBSAPVK0gFiAPIBVUrXx8fCIGVq18fCIIIAIpA8AIfCIJIAhUrXwgCSACKQPYCCAGIAYgAikD0Ah8IgZWrXwgBiAGIAQgB1atIAIpA+gIIAQgBVStfHx8IgZWrXx8IgUgCVStfCADIAhWrSACKQO4ByIEIAMgDFStfHx8IgkgAikDoAd8IgMgBCAFIAUgE3wiBVatfCAFIAUgECAOIAcgClatfCIHIBR8IgQgB1StfCAEIAQgBnwiBFatfHwiBVatfHwiCCACKQPQB3wiBiAIVK18IAYgBiACKQPoByAFIAUgAikD4Ad8IgVWrXwgBSACKQP4ByAEIAQgAikD8Ad8IgRWrXwgBCACKQOICCACKQOACCIHIAp8IAdUrXx8IgcgBFStfHwiBCAFVK18fCIGVq18IAMgCFatIAIpA6gHIAMgCVStfHx8IghCqcDGia7Ok7IwVg0AAkAgCEKpwMaJrs6TsjBRBEAgBkLdsIWM6LaRqLh/Vg0CIAZC3bCFjOi2kai4f1IEQCAEIQMgBiEFQqnAxomuzpOyMCEIDAQLIARCkeHlzYeJ+pkoVg0CQt2whYzotpGouH8hBSAEQpHh5c2HifqZKFENASAEIQNCqcDGia7Ok7IwIQgMAwsgBCEDIAYhBQwCC0KR4eXNh4n6mSghAyAHQoGAgIC/sv3wwwBaDQBCqcDGia7Ok7IwIQgMAQsgBEKR4eXNh4n6mSh9IgUgB0KBgICAv7L98MMAVK0iCX0hAyAGQqPP+vOXye7XxwB8IgogBEKR4eXNh4n6mShUIAUgCVRyrSIEfSEFIAggBkLdsIWM6LaRqLh/VCAEIApWcq19QqnAxomuzpOyMH0hCCAHQoGAgIC/sv3wwwB9IQcLIAJBkAdqIAdCACAHQgAQyQMgAkHABmogA0IAIAdCABDJAyACQeAFaiAFQgAgB0IAEMkDIAJB8ARqIAhCACAHQgAQyQMgAkGAB2ogAikDkAciB0L/////vrL98EJ+IgRCAEKBgICAv7L98MMAQgAQyQMgAkHwBmogBEIAQpHh5c2HifqZKEIAEMkDIAJB4AZqIARCAELdsIWM6LaRqLh/QgAQyQMgAkHQBmogBEIAQqnAxomuzpOyMEIAEMkDIAJB8AVqIANCACADQgAQyQMgAkGQBWogBUIAIANCABDJAyACQaAEaiAIQgAgA0IAEMkDIAJBsAZqIAIpA/AGIg8gAikDmAciCSACKQPABiIDfCIKfCIEIAIpA4gHIAIpA4AHIgYgB0J9g3wgBlStfHwiByADfCIGQv////++sv3wQn4iA0IAQoGAgIC/sv3wwwBCABDJAyACQaAGaiADQgBCkeHlzYeJ+pkoQgAQyQMgAkGQBmogA0IAQt2whYzotpGouH9CABDJAyACQYAGaiADQgBCqcDGia7Ok7IwQgAQyQMgAkGABWogBUIAIAVCABDJAyACQZAEaiAIQgAgBUIAEMkDIAJB0AVqIAIpA8gGIgMgBiAHVK18IhAgAikD8AV8IgUgAyAJIApWrXwiDCACKQPgBSIDfCIJIAIpA+AGfCIKIAQgB1atIAIpA/gGIAQgD1StfHx8IhN8IgQgAikDoAZ8IgcgAikDuAYgBiACKQOwBiIGfCAGVK18fCIGIAN8Ig9C/////76y/fBCfiIDQgBCgYCAgL+y/fDDAEIAEMkDIAJBwAVqIANCAEKR4eXNh4n6mShCABDJAyACQbAFaiADQgBC3bCFjOi2kai4f0IAEMkDIAJBoAVqIANCAEKpwMaJrs6TsjBCABDJAyACQYAEaiAIQgAgCEIAEMkDIAJB4ARqIAIpA+gFIgMgBiAPVq18IhUgAikDkAUiDnwiCCAOIAMgCSAMVK18IhQgAikD8AQiA3wiDCACKQPQBnwiDiAKIBNWrSACKQPoBiAJIApWrXx8fCIJfCIKIAQgBVStIAIpA/gFIAUgEFStfHx8IgUgAikDkAZ8IhAgBiAHVK0gAikDqAYgBCAHVq18fHwiE3wiBCACKQPABXwiByACKQPYBSACKQPQBSIGIA98IAZUrXx8IgYgA3wiD0L/////vrL98EJ+IgNCAEKBgICAv7L98MMAQgAQyQMgAkHQBGogA0IAQpHh5c2HifqZKEIAEMkDIAJBwARqIANCAELdsIWM6LaRqLh/QgAQyQMgAkGwBGogA0IAQqnAxomuzpOyMEIAEMkDAkACQCACKQO4BCACKQOoBSACKQOIBiAJIA5UrSACKQPYBiAMIA5WrXx8IAIpA/gEIg4gDCAUVK18fCIMIAIpA6AEIhR8IgMgBSAKVK0gAikDmAUiFiAJIApWrXx8fCIJIAIpA4AGfCIKIAlUrXwgCiAQIBNWrSACKQOYBiAFIBBWrXx8fCIFIApUrXwgAyAJVq0gAikDqAQiCiADIAxUrXx8fCIMIAIpA5AEIhB8IgMgAikDiAUgBSAFIAIpA4AFfCIFVq18IAUgBSAEIAhUrSAWIAggFVStfHx8IgVWrXx8IgggAikDoAV8IgkgCFStfCAJIAIpA7gFIAUgBSACKQOwBXwiBVatfCAFIAYgB1StIAIpA8gFIAQgB1atfHx8IgcgBVStfHwiBSAJVK18IAMgCFatIAIpA5gEIgQgAyAMVK18fHwiCSACKQOABHwiAyAEIAUgBSAQfCIFVq18IAUgBSAKIA4gBiAPVq18IgYgFHwiBCAGVK18IAQgBCAHfCIEVq18fCIFVq18fCIIIAIpA7AEfCIGIAhUrXwgBiAGIAIpA8gEIAUgBSACKQPABHwiBVatfCAFIAIpA9gEIAQgBCACKQPQBHwiBFatfCAEIAIpA+gEIAIpA+AEIgcgD3wgB1StfHwiByAEVK18fCIEIAVUrXx8IgZWrXwgAyAIVq0gAikDiAQgAyAJVK18fHwiCEKpwMaJrs6TsjBWDQACQCAIQqnAxomuzpOyMFEEQCAGQt2whYzotpGouH9WDQIgBkLdsIWM6LaRqLh/UgRAIAQhAyAGIQVCqcDGia7Ok7IwIQgMBAsgBEKR4eXNh4n6mShWDQJC3bCFjOi2kai4fyEFIARCkeHlzYeJ+pkoUQ0BIAQhA0KpwMaJrs6TsjAhCAwDCyAEIQMgBiEFDAILQpHh5c2HifqZKCEDIAdCgYCAgL+y/fDDAFoNAEKpwMaJrs6TsjAhCAwBCyAEQpHh5c2HifqZKH0iBSAHQoGAgIC/sv3wwwBUrSIJfSEDIAZCo8/685fJ7tfHAHwiCiAEQpHh5c2HifqZKFQgBSAJVHKtIgR9IQUgCCAGQt2whYzotpGouH9UIAQgClZyrX1CqcDGia7Ok7IwfSEIIAdCgYCAgL+y/fDDAH0hBwsgAkHwA2ogB0IAIAtCABDJAyACQfACaiADQgAgC0IAEMkDIAJB8AFqIAVCACALQgAQyQMgAkHwAGogCEIAIAtCABDJAyACQeADaiACKQPwAyILQv////++sv3wQn4iBEIAQoGAgIC/sv3wwwBCABDJAyACQdADaiAEQgBCkeHlzYeJ+pkoQgAQyQMgAkHAA2ogBEIAQt2whYzotpGouH9CABDJAyACQbADaiAEQgBCqcDGia7Ok7IwQgAQyQMgAkGgA2ogB0IAIA1CABDJAyACQaACaiADQgAgDUIAEMkDIAJBoAFqIAVCACANQgAQyQMgAkEgaiAIQgAgDUIAEMkDIAJB4AJqIAIpA9ADIg8gAikD+AMiCSACKQPwAnwiCnwiBiACKQPoAyALIAIpA+ADIgR8IARUrXx8IgsgAikDoAN8Ig1C/////76y/fBCfiIEQgBCgYCAgL+y/fDDAEIAEMkDIAJB0AJqIARCAEKR4eXNh4n6mShCABDJAyACQcACaiAEQgBC3bCFjOi2kai4f0IAEMkDIAJBsAJqIARCAEKpwMaJrs6TsjBCABDJAyACQZADaiAHQgAgEUIAEMkDIAJBkAJqIANCACARQgAQyQMgAkGQAWogBUIAIBFCABDJAyACQRBqIAhCACARQgAQyQMgAkHgAWogAikDqAMgCyANVq18IgwgAikDoAJ8IhEgAikD+AIgCSAKVq18Ig4gAikD8AF8IgkgAikDwAN8IgogBiALVq0gAikD2AMgBiAPVK18fHwiEHwiBiACKQPQAnwiCyACKQPoAiACKQPgAiIEIA18IARUrXx8Ig0gAikDkAN8Ig9C/////76y/fBCfiIEQgBCgYCAgL+y/fDDAEIAEMkDIAJB0AFqIARCAEKR4eXNh4n6mShCABDJAyACQcABaiAEQgBC3bCFjOi2kai4f0IAEMkDIAJBsAFqIARCAEKpwMaJrs6TsjBCABDJAyACQYADaiAHQgAgEkIAEMkDIAJBgAJqIANCACASQgAQyQMgAkGAAWogBUIAIBJCABDJAyACIAhCACASQgAQyQMgAkHgAGogAikDmAMgDSAPVq18IhMgAikDkAJ8IgUgAikD+AEgCSAOVK18Ig4gAikDcHwiBCACKQOwA3wiByAKIBBWrSACKQPIAyAJIApWrXx8fCIIIAIpA6ABfCISIAYgEVStIAIpA6gCIAwgEVatfHx8IhEgAikDwAJ8IgkgCyANVq0gAikD2AIgBiALVq18fHwiDHwiBiACKQPQAXwiCyACKQPoASACKQPgASIDIA98IANUrXx8Ig0gAikDgAN8IgpC/////76y/fBCfiIDQgBCgYCAgL+y/fDDAEIAEMkDIAJB0ABqIANCAEKR4eXNh4n6mShCABDJAyACQUBrIANCAELdsIWM6LaRqLh/QgAQyQMgAkEwaiADQgBCqcDGia7Ok7IwQgAQyQMCQAJAIAIpAzggAikDuAEgAikDuAIgByAIVq0gAikDuAMgBCAHVq18fCACKQN4IAQgDlStfHwiDyACKQMgfCIDIBEgElStIAIpA6gBIAggElatfHx8IgQgAikDsAJ8IgcgBFStfCAHIAcgCSAMVq0gAikDyAIgCSARVK18fHwiB1atfCADIARWrSACKQMoIAMgD1StfHx8IgggAikDEHwiAyACKQOYASAHIAIpA5ABfCIEIAdUrXwgBCAFIAZWrSACKQOYAiAFIBNUrXx8fCIFIARUrXx8IgQgAikDsAF8IgcgBFStfCAHIAIpA8gBIAUgBSACKQPAAXwiBVatfCAFIAsgDVatIAIpA9gBIAYgC1atfHx8IgYgBVStfHwiBSAHVK18IAMgBFatIAIpAxggAyAIVK18fHwiCyACKQMAfCIHIAIpA4gBIAUgAikDgAF8IgMgBVStfCADIAMgAikDiAIgAikDiAMgCiANVK18IgQgAikDgAJ8IgUgBFStfCAFIAUgBnwiBVatfHwiA1atfHwiBiACKQMwfCIEIAZUrXwgBCAEIAIpA0ggAyADIAIpA0B8IgNWrXwgAyADIAIpA1ggBSAFIAIpA1B8IgVWrXwgBSACKQNoIAIpA2AiCCAKfCAIVK18fCIIIAVUrXx8IgNWrXx8IgRWrXwgBiAHVK0gAikDCCAHIAtUrXx8fCIGQqnAxomuzpOyMFYNAAJAIAZCqcDGia7Ok7IwUQRAIARC3bCFjOi2kai4f1YNAiAEQt2whYzotpGouH9SBEAgAyEFIAQhB0KpwMaJrs6TsjAhBgwECyADQpHh5c2HifqZKFYNAkLdsIWM6LaRqLh/IQcgA0KR4eXNh4n6mShRDQEgAyEFQqnAxomuzpOyMCEGDAMLIAMhBSAEIQcMAgtCkeHlzYeJ+pkoIQUgCEKBgICAv7L98MMAWg0AQqnAxomuzpOyMCEGDAELIANCkeHlzYeJ+pkofSIHIAhCgYCAgL+y/fDDAFStIgt9IQUgBEKjz/rzl8nu18cAfCINIANCkeHlzYeJ+pkoVCAHIAtUcq0iA30hByAGIARC3bCFjOi2kai4f1QgAyANVnKtfUKpwMaJrs6TsjB9IQYgCEKBgICAv7L98MMAfSEICyAAIAg3AxggACAFNwMQIAAgBzcDCCAAIAY3AwAgAkHACmokAAuDJQI1fwl+IwBBwA5rIgkkACAJQZgFaiINQYS9wgBBwAAQgwECQAJAAkACQAJAAkACQAJAAkACQCAJLQCYBUEBRwRAIAlBxglqIhEgCUHIBWoiFikDACJBNwEAIAlBvglqIhcgCUHABWoiGSkDACI/NwEAIAlB9gZqIhggCUGoBWoiCiISKQMAIkI3AQAgCUH+BmoiECITIAlBsAVqIhUpAwAiQzcBACAJQYYHaiILIAlBuAVqIhopAwAiQDcBACAJQY4HaiIbID83AQAgCUGWB2oiHCBBNwEAIAkgCSkDoAUiPjcB7gYgCUGgDWoiISBBNwMAIAlBmA1qIgwgPzcDACAJQZANaiIUIEA3AwAgCUGIDWoiDyBDNwMAIAlBgA1qIg4gQjcDACAJID43A/gMIA1BxL3CAEHAABCDASAJLQCYBUEBRg0BIBEgFikDACJBNwEAIBcgGSkDACI/NwEAIBggEikDACJCNwEAIBMgFSkDACJDNwEAIAsgGikDACJANwEAIBsgPzcBACAcIEE3AQAgCSAJKQOgBSI+NwHuBiAJQTBqIEE3AwAgCUEoaiA/NwMAIAlBIGogQDcDACAJQRhqIEM3AwAgCUEQaiBCNwMAIAkgPjcDCCAJQeAAaiAhKQMANwMAIAlB2ABqIAwpAwA3AwAgCUHQAGogFCkDADcDACAJQcgAaiAPKQMANwMAIAlBQGsgDikDADcDACAJIAkpA/gMNwM4IA1BhL7CAEE/EIMBIAktAJgFQQFGDQIgESAWKQMAIkE3AQAgFyAZKQMAIj83AQAgGCAKKQMAIkI3AQAgECAVKQMAIkM3AQAgCyAaKQMAIkA3AQAgGyA/NwEAIBwgQTcBACAJIAkpA6AFIj43Ae4GICEgQTcDACAMID83AwAgFCBANwMAIA8gQzcDACAOIEI3AwAgCSA+NwP4DCANQcO+wgBBPxCDASAJLQCYBUEBRg0DIBEgFikDACJBNwEAIBcgGSkDACI/NwEAIBggEikDACJCNwEAIBMgFSkDACJDNwEAIAsgGikDACJANwEAIBsgPzcBACAcIEE3AQAgCSAJKQOgBSI+NwHuBiAJQZABaiBBNwMAIAlBiAFqID83AwAgCUGAAWogQDcDACAJQfgAaiBDNwMAIAlB8ABqIEI3AwAgCSA+NwNoIAlBwAFqICEpAwA3AwAgCUG4AWogDCkDADcDACAJQbABaiAUKQMANwMAIAlBqAFqIA8pAwA3AwAgCUGgAWogDikDADcDACAJIAkpA/gMNwOYASANQYK/wgBBwAAQgwEgCS0AmAVBAUYNBCARIBYpAwAiQTcBACAXIBkiEikDACI/NwEAIBggCiITKQMAIkI3AQAgECIMIBUpAwAiQzcBACALIhQgGiILKQMAIkA3AQAgGyIPID83AQAgHCIOIEE3AQAgCSAJKQOgBSI+NwHuBiAJQfABaiBBNwMAIAlB6AFqID83AwAgCUHgAWogQDcDACAJQdgBaiBDNwMAIAlB0AFqIEI3AwAgCSA+NwPIASANQcK/wgBBwAAQgwEgCS0AmAVBAUYNBSARIBYpAwAiQTcBACAXIBIpAwAiPzcBACAYIBMpAwAiQjcBACAMIBUpAwAiQzcBACAUIAspAwAiQDcBACAPID83AQAgDiBBNwEAIAkgCSkDoAUiPjcB7gYgEiBBNwMAIAsgPzcDACAVIEA3AwAgEyBDNwMAIAlBoAVqIEI3AwAgCSA+NwOYBQJ+IA1B2LPCAEEwEPEDBEBC///Piuv//9UeIAkpA7gFIj99IkIgCSkDwAUiQUKr1f7///+//7l/Vq0iPn0hREKk7MO1j9S0mOcAIAkpA7AFIkN9IkAgPiBCViA/Qv//z4rr///VHlZyrSI+fSFFQr+llJzP8NK75AAgCSkDqAUiP30iQiA+IEBWIENCpOzDtY/UtJjnAFZyrSI+fSFGQtfZrprk9umNywAgCSkDoAUiQ30iQCA+IEJWID9Cv6WUnM/w0rvkAFZyrSI+fSE/QprN/8ujvcSAGiAJKQOYBSA+IEBWIENC19mumuT26Y3LAFZyrXx9IUJCq9X+////v/+5fyBBfQwBCyAJKQO4BSFEIAkpA7AFIUUgCSkDqAUhRiAJKQOgBSE/IAkpA5gFIUIgCSkDwAULIUMgCUEANgKEAiAJQoCAgIDAADcC/AEgBARAIAlByAxqIR0gCUGoDGohMCAJQYAHaiExIAlB6AhqIR4gCUHICGohMiAJQZANaiE2IAlB+AlqIS4gCUHoC2ohHyAJQfgFaiEzIAlB2AZqIS8gCUGIC2ohICAJQcgHaiE0IAlByAVqIRADQCAQIAkpAwg3AwAgCUHABWoiIyAJQeAAaikDADcDACAJQbgFaiIkIAlB2ABqKQMANwMAIAlBsAVqIiUgCUHQAGopAwA3AwAgCUGoBWoiJiAJQcgAaikDADcDACAJQaAFaiInIAlBQGspAwA3AwAgEEEIaiIoIAlBEGopAwA3AwAgEEEQaiIpIAlBGGopAwA3AwAgEEEYaiIqIAlBIGopAwA3AwAgEEEgaiIrIAlBKGopAwA3AwAgEEEoaiIsIAlBMGopAwA3AwAgCSAJKQM4NwOYBUEAIg1FBEAgCUHoBmogCUGYBWpB4AD8CgAACyAjIAMgLWoiCkEoaiI3KQMANwMAICQgCkEgaiI4KQMANwMAICUgCkEYaiI5KQMANwMAICYgCkEQaiI6KQMANwMAICcgCkEIaiI7KQMANwMAIBAgCkEwaiI8KQMANwMAICggCkE4aiIRKQMANwMAICkgCkFAayIWKQMANwMAICogCkHIAGoiFykDADcDACArIApB0ABqIhkpAwA3AwAgLCAKQdgAaiIYKQMANwMAIAkgCikDADcDmAUgDUUEQCAJQZgJaiAJQZgFakHgAPwKAAALIAlBmAVqIgsgCUGYCWoQuAIgCUGIAmogCUHoBmoiDCALED8gIyAJQcABaikDADcDACAkIAlBuAFqKQMANwMAICUgCUGwAWopAwA3AwAgJiAJQagBaikDADcDACAnIAlBoAFqKQMANwMAIBAgCSkDaDcDACAoIAlB8ABqKQMANwMAICkgCUH4AGopAwA3AwAgKiAJQYABaikDADcDACArIAlBiAFqKQMANwMAICwgCUGQAWopAwA3AwAgCSAJKQOYATcDmAUgDUUEQCAMIAtB4AD8CgAACyAjIApBiAFqIhIpAwA3AwAgJCAKQYABaiITKQMANwMAICUgCkH4AGoiFSkDADcDACAmIApB8ABqIgspAwA3AwAgJyAKQegAaiIaKQMANwMAIBAgCkGQAWoiGykDADcDACAoIApBmAFqIhwpAwA3AwAgKSAKQaABaiIhKQMANwMAICogCkGoAWoiDCkDADcDACArIApBsAFqIhQpAwA3AwAgLCAKQbgBaiIPKQMANwMAIAkgCkHgAGoiDikDADcDmAUgDUUEQCAJQZgJaiAJQZgFakHgAPwKAAALIAlBmAVqIjUgCUGYCWoiPRC4AiAJQegCaiAJQegGaiA1ED8gCUGQB2ogCUHwAWopAwA3AwAgCUGIB2ogCUHoAWopAwA3AwAgMSAJQeABaikDADcDACAJQfgGaiAJQdgBaikDADcDACAJQfAGaiAJQdABaikDADcDACAJIAkpA8gBNwPoBiAjIDcpAwA3AwAgJCA4KQMANwMAICUgOSkDADcDACAmIDopAwA3AwAgJyA7KQMANwMAIBAgPCkDADcDACAoIBEpAwA3AwAgKSAWKQMANwMAICogFykDADcDACArIBkpAwA3AwAgLCAYKQMANwMAIAkgCikDADcDmAUgDUUEQCA9IDVB4AD8CgAACyAJQcgDaiAJQegGaiAJQZgJaiIREHcgCSBDNwOQByAJIEQ3A4gHIAkgRTcDgAcgCSBGNwP4BiAJID83A/AGIAkgQjcD6AYgIyASKQMANwMAICQgEykDADcDACAlIBUpAwA3AwAgJiALKQMANwMAICcgGikDADcDACAQIBspAwA3AwAgKCAcKQMANwMAICkgISkDADcDACAqIAwpAwA3AwAgKyAUKQMANwMAICwgDykDADcDACAJIA4pAwA3A5gFIA1FBEAgESAJQZgFakHgAPwKAAALIAlBqARqIAlB6AZqIgsgCUGYCWoQdyACICJGDQggDUUEQCALIAlBiAJqQeAA/AoAAAsgDUUEQCA0IAlB6AJqQeAA/AoAAAsgBiAiRg0JIAggIkYNCyAJQZgMaiILIAEgLWoiDEHgAGoiDyA0EI0BIAlB4A1qIg4gDCAJQegGahCNASAJQfgMaiALIA4QwQMgCSkDiA0hQCAJKQOADSE+IAkoAvgMQQFGDQpBACIURQRAIDIgNkHQAPwKAAALIAlBwAhqIg4gQDcDACAJID43A7gIIAlB4A1qIgsgCUG4CGoiEyATED8gCUH4DGoiEiAMIAlB6AZqENUBIAlBmAxqIhEgCyASEI0BIBIgDCAREI0BIAsgEyASED8gLiALIA8QjQEgDUUEQCAJQZgJaiARQeAA/AoAAAsgCUGAC2ogCUHgCGopAwA3AwAgCUH4CmogCUHYCGopAwA3AwAgCUHwCmogCUHQCGopAwA3AwAgCUHoCmogMikDADcDACAJQeAKaiAOKQMANwMAICAgHikDADcDACAgQQhqIB5BCGopAwA3AwAgIEEQaiAeQRBqKQMANwMAICBBGGogHkEYaikDADcDACAgQSBqIB5BIGopAwA3AwAgIEEoaiAeQShqKQMANwMAIAkgCSkDuAg3A9gKIAlB+AxqIgsgCUG4CGogDBA/IAlB4A1qIgwgCyAPEI0BIC8gCUHYCmogDCAFIAcQIEEAIg5FBEAgCUGYBWogCUGYCWpBwAH8CgAACyAORQRAIAlBmAlqIAlBmAVqQcAB/AoAAAsgCUGQBWoiDyAvQQhqKQIANwMAIAkgLykCADcDiAUgCSgChAIiDCAJKAL8AUYEQCAJQfwBakG0wMIAEKMDCyAJKAKAAiAMQQR0aiIOIAkpA4gFNwIAIA5BCGogDykDADcCACAJIAxBAWo2AoQCIA1FBEAgCUGYBWogCUHIA2pB4AD8CgAACyANRQRAIDMgCUGoBGpB4AD8CgAACyAJQeANaiILIC4gMxCNASAJQfgMaiIMIAlBmAlqIAlBmAVqEI0BIAlB6AZqIAsgDBDBAyAJKQP4BiFAIAkpA/AGIT4gCSgC6AZBAUYNDCAURQRAIDAgMUHQAPwKAAALIAlBoAxqIEA3AwAgCUHAC2ogQDcDACAJQcgLaiAwKQMANwMAIAlB0AtqIAlBsAxqKQMANwMAIAlB2AtqIAlBuAxqKQMANwMAIAlB4AtqIAlBwAxqKQMANwMAIB8gHSkDADcDACAfQQhqIB1BCGopAwA3AwAgH0EQaiAdQRBqKQMANwMAIB9BGGogHUEYaikDADcDACAfQSBqIB1BIGopAwA3AwAgH0EoaiAdQShqKQMANwMAIAkgPjcDmAwgCSA+NwO4CyAJQegGaiILIAlBmAxqIAlBmAlqED8gCUH4DGoiDCALIC4QjQEgCUGoCGogCUG4C2ogDCAFIAcQICAJKAKEAiIPIAkoAvwBRgRAIAlB/AFqQcTAwgAQowMLIAkoAoACIA9BBHRqIg4gCSkCqAg3AgAgDkEIaiAJQbAIaikCADcCACAJIA9BAWo2AoQCIC1BwAFqIS0gBUEwaiEFIAdBMGohByAEICJBAWoiIkcNAAsLIAAgCSkC/AE3AgAgAEEIaiAJQYQCaigCADYCACAJQcAOaiQADwsgCSAJLQCZBToAmAVBoLHCAEErIAlBmAVqQdTAwgBBtMHCABDKAwALIAkgCS0AmQU6AJgFQaCxwgBBKyAJQZgFakHUwMIAQaTBwgAQygMACyAJIAktAJkFOgCYBUGgscIAQSsgCUGYBWpB1MDCAEGUwcIAEMoDAAsgCSAJLQCZBToAmAVBoLHCAEErIAlBmAVqQdTAwgBBhMHCABDKAwALIAkgCS0AmQU6AJgFQaCxwgBBKyAJQZgFakHUwMIAQfTAwgAQygMACyAJIAktAJkFOgCYBUGgscIAQSsgCUGYBWpB1MDCAEHkwMIAEMoDAAsgAiACQYTAwgAQ2QMACyAGIAZBlMDCABDZAwALIAkgQDcDgA0gCSA+NwP4DEHU/sAAQSsgCUH4DGpBsIXBAEHQhcEAEMoDAAsgCCAIQaTAwgAQ2QMACyAJIEA3A/AGIAkgPjcD6AZB1P7AAEErIAlB6AZqQbCFwQBB0IXBABDKAwAL5CUCAn8YfiMAQbAIayIBJAAgAUGICGpBiP/BAEHCABC3AiABQcAHaiABKQOgCEIAQqQLQgAQyQMgAUHQB2ogASkDmAhCAEKkC0IAEMkDIAFB4AdqIAEpA5AIQgBCpAtCABDJAyABQfAHaiABKQOICEIAQqQLQgAQyQMgAUGwB2ogASkDwAciB0KblK/D8rWo3oZ/fiIDQgBCbUIAEMkDIAFBoAdqIANCAEJ/QgAQyQMgAUGwBmogA0IAQv///////////wBCABDJAyABQZAHaiABKQOgByIGIAEpA8gHIgUgASkD0Ad8IgR8IgkgASkDuAcgASkDsAciAyAHQnyDfCADVK18fCIMQpuUr8Pytajehn9+IgNCAEJtQgAQyQMgAUGAB2ogA0IAQn9CABDJAyABQcAGaiADQgBC////////////AEIAEMkDIAFB8AZqIAEpA4AHIgsgBiABKQPYByAEIAVUrXwiByABKQPgB3wiD3wiECAJIAxWrSABKQOoByIFIAYgCVatfHx8IgR8IgkgASkDmAcgASkDkAciAyAMfCADVK18fCIMQpuUr8Pytajehn9+IgNCAEJtQgAQyQMgAUHgBmogA0IAQn9CABDJAyABQdAGaiADQgBC////////////AEIAEMkDIAFBoAZqIAEpA+AGIgogCyABKQPoByAHIA9WrXwiByABKQPwB3wiCCABKQOwBnwiBiAEIBBUrSAFIA8gEFatfHx8Ig98IhAgCSAMVq0gASkDiAciBSAJIAtUrXx8fCIEfCIJIAEpA/gGIAEpA/AGIgMgDHwgA1StfHwiDEKblK/D8rWo3oZ/fiIDQgBCbUIAEMkDIAFBkAZqIANCAEJ/QgAQyQMgAUGABmogA0IAQv///////////wBCABDJAwJAAkAgASkDiAYgASkD2AYgASkDyAYgASkDwAYiAyABKQP4ByAHIAhWrXx8IgcgA1StfCAHIAYgD1atIAEpA7gGIAYgCFStfHx8IgMgB1StfCADIAQgEFStIAUgDyAQVq18fHwiBCADVK18IgMgASkD0AZ8IgUgA1StfCAFIAUgASkD6AYiAyAEIAQgCnwiBFatfCAEIAQgCSAMVq0gAyAJIApUrXx8fCIEVq18fCIFVq18IgMgASkDgAZ8IgkgA1StfCAJIAEpA5gGIgMgBSAFIAEpA5AGIgd8IgVWrXwgBSADIAQgB3wiBCAHVK18IAQgASkDqAYgASkDoAYiAyAMfCADVK18fCISIARUrXx8IgQgBVStfHwiAyAJVK18IhZCAFkEQCAWQv///////////wBSIBJCbVRyIAMgBINCf1JyDQELIARCAXwiCSASQm1UrSIHfSEPIANCAXwiBSAEQn9SIAcgCVZyrSIEfSEQIBYgA0J/UiAEIAVWcq19Qv///////////wB9IRYgEkITfCESDAELIAMhECAEIQ8LIAFBiAhqQcr/wQBBwgAQtwIgAUHABWogASkDoAhCAEKkC0IAEMkDIAFB0AVqIAEpA5gIQgBCpAtCABDJAyABQeAFaiABKQOQCEIAQqQLQgAQyQMgAUHwBWogASkDiAhCAEKkC0IAEMkDIAFBsAVqIAEpA8AFIgdCm5Svw/K1qN6Gf34iA0IAQm1CABDJAyABQaAFaiADQgBCf0IAEMkDIAFBsARqIANCAEL///////////8AQgAQyQMgAUGQBWogASkDoAUiCiABKQPIBSIFIAEpA9AFfCIEfCIJIAEpA7gFIAEpA7AFIgMgB0J8g3wgA1StfHwiDEKblK/D8rWo3oZ/fiIDQgBCbUIAEMkDIAFBgAVqIANCAEJ/QgAQyQMgAUHABGogA0IAQv///////////wBCABDJAyABQfAEaiABKQOABSIOIAogASkD2AUgBCAFVK18IgcgASkD4AV8Igh8IgYgCSAMVq0gASkDqAUiBSAJIApUrXx8fCIEfCIJIAEpA5gFIAEpA5AFIgMgDHwgA1StfHwiDEKblK/D8rWo3oZ/fiIDQgBCbUIAEMkDIAFB4ARqIANCAEJ/QgAQyQMgAUHQBGogA0IAQv///////////wBCABDJAyABQaAEaiABKQPgBCINIA4gASkD6AUgByAIVq18IgcgASkD8AV8IgsgASkDsAR8IgogBCAGVK0gBSAGIAhUrXx8fCIIfCIGIAkgDFatIAEpA4gFIgUgCSAOVK18fHwiBHwiCSABKQP4BCABKQPwBCIDIAx8IANUrXx8IgxCm5Svw/K1qN6Gf34iA0IAQm1CABDJAyABQZAEaiADQgBCf0IAEMkDIAFBgARqIANCAEL///////////8AQgAQyQMCQAJAIAEpA4gEIAEpA9gEIAEpA8gEIAEpA8AEIgMgASkD+AUgByALVq18fCIHIANUrXwgByAIIApUrSABKQO4BCAKIAtUrXx8fCIDIAdUrXwgAyAEIAZUrSAFIAYgCFStfHx8IgQgA1StfCIDIAEpA9AEfCIFIANUrXwgBSAFIAEpA+gEIgMgBCAEIA18IgRWrXwgBCAEIAkgDFatIAMgCSANVK18fHwiBFatfHwiBVatfCIDIAEpA4AEfCIJIANUrXwgCSABKQOYBCIDIAUgBSABKQOQBCIHfCIFVq18IAUgAyAEIAd8IgQgB1StfCAEIAEpA6gEIAEpA6AEIgMgDHwgA1StfHwiEyAEVK18fCIEIAVUrXx8IgMgCVStfCIXQgBZBEAgF0L///////////8AUiATQm1UciADIASDQn9Scg0BCyAEQgF8IgkgE0JtVK0iB30hDCADQgF8IgUgBEJ/UiAHIAlWcq0iBH0hCSAXIANCf1IgBCAFVnKtfUL///////////8AfSEXIBNCE3whEwwBCyADIQkgBCEMCyABQYgIakGMgMIAQcAAELcCIAFBwANqIAEpA6AIQgBCpAtCABDJAyABQdADaiABKQOYCEIAQqQLQgAQyQMgAUHgA2ogASkDkAhCAEKkC0IAEMkDIAFB8ANqIAEpA4gIQgBCpAtCABDJAyABQbADaiABKQPAAyIHQpuUr8Pytajehn9+IgNCAEJtQgAQyQMgAUGgA2ogA0IAQn9CABDJAyABQbACaiADQgBC////////////AEIAEMkDIAFBkANqIAEpA6ADIg0gASkDyAMiBSABKQPQA3wiBHwiBiABKQO4AyABKQOwAyIDIAdCfIN8IANUrXx8IghCm5Svw/K1qN6Gf34iA0IAQm1CABDJAyABQYADaiADQgBCf0IAEMkDIAFBwAJqIANCAEL///////////8AQgAQyQMgAUHwAmogASkDgAMiFCANIAEpA9gDIAQgBVStfCIHIAEpA+ADfCILfCIKIAYgCFatIAEpA6gDIgUgBiANVK18fHwiBHwiBiABKQOYAyABKQOQAyIDIAh8IANUrXx8IghCm5Svw/K1qN6Gf34iA0IAQm1CABDJAyABQeACaiADQgBCf0IAEMkDIAFB0AJqIANCAEL///////////8AQgAQyQMgAUGgAmogASkD4AIiESAUIAEpA+gDIAcgC1atfCIHIAEpA/ADfCIOIAEpA7ACfCINIAQgClStIAUgCiALVK18fHwiC3wiCiAGIAhWrSABKQOIAyIFIAYgFFStfHx8IgR8IgYgASkD+AIgASkD8AIiAyAIfCADVK18fCIIQpuUr8Pytajehn9+IgNCAEJtQgAQyQMgAUGQAmogA0IAQn9CABDJAyABQYACaiADQgBC////////////AEIAEMkDAkACQCABKQOIAiABKQPYAiABKQPIAiABKQPAAiIDIAEpA/gDIAcgDlatfHwiByADVK18IAcgCyANVK0gASkDuAIgDSAOVK18fHwiAyAHVK18IAMgBCAKVK0gBSAKIAtUrXx8fCIEIANUrXwiAyABKQPQAnwiBSADVK18IAUgBSABKQPoAiIDIAQgBCARfCIEVq18IAQgBCAGIAhWrSADIAYgEVStfHx8IgRWrXx8IgVWrXwiAyABKQOAAnwiBiADVK18IAYgASkDmAIiAyAFIAUgASkDkAIiB3wiBVatfCAFIAMgBCAHfCIEIAdUrXwgBCABKQOoAiABKQOgAiIDIAh8IANUrXx8IhUgBFStfHwiBCAFVK18fCIDIAZUrXwiGEIAWQRAIBhC////////////AFIgFUJtVHIgAyAEg0J/UnINAQsgBEIBfCIIIBVCbVStIgV9IQcgA0IBfCIGIARCf1IgBSAIVnKtIgR9IQUgGCADQn9SIAQgBlZyrX1C////////////AH0hGCAVQhN8IRUMAQsgAyEFIAQhBwsgAUGICGpBzIDCAEHAABC3AiABQcABaiABKQOgCEIAQqQLQgAQyQMgAUHQAWogASkDmAhCAEKkC0IAEMkDIAFB4AFqIAEpA5AIQgBCpAtCABDJAyABQfABaiABKQOICEIAQqQLQgAQyQMgAUGwAWogASkDwAEiCEKblK/D8rWo3oZ/fiIDQgBCbUIAEMkDIAFBoAFqIANCAEJ/QgAQyQMgAUEwaiADQgBC////////////AEIAEMkDIAFBkAFqIAEpA6ABIhEgASkDyAEiBiABKQPQAXwiBHwiCiABKQO4ASABKQOwASIDIAhCfIN8IANUrXx8IgtCm5Svw/K1qN6Gf34iA0IAQm1CABDJAyABQYABaiADQgBCf0IAEMkDIAFBQGsgA0IAQv///////////wBCABDJAyABQfAAaiABKQOAASIZIBEgASkD2AEgBCAGVK18IgggASkD4AF8Ig58Ig0gCiALVq0gASkDqAEiBiAKIBFUrXx8fCIEfCIKIAEpA5gBIAEpA5ABIgMgC3wgA1StfHwiC0KblK/D8rWo3oZ/fiIDQgBCbUIAEMkDIAFB4ABqIANCAEJ/QgAQyQMgAUHQAGogA0IAQv///////////wBCABDJAyABQSBqIAEpA2AiGiAZIAEpA+gBIAggDlatfCIIIAEpA/ABfCIUIAEpAzB8IhEgBCANVK0gBiANIA5UrXx8fCIOfCINIAogC1atIAEpA4gBIgYgCiAZVK18fHwiBHwiCiABKQN4IAEpA3AiAyALfCADVK18fCILQpuUr8Pytajehn9+IgNCAEJtQgAQyQMgAUEQaiADQgBCf0IAEMkDIAEgA0IAQv///////////wBCABDJAwJAAkAgASkDCCABKQNYIAEpA0ggASkDQCIDIAEpA/gBIAggFFatfHwiCCADVK18IAggDiARVK0gASkDOCARIBRUrXx8fCIDIAhUrXwgAyAEIA1UrSAGIA0gDlStfHx8IgQgA1StfCIDIAEpA1B8IgYgA1StfCAGIAYgASkDaCIDIAQgBCAafCIEVq18IAQgBCAKIAtWrSADIAogGlStfHx8IgRWrXx8IgZWrXwiAyABKQMAfCIKIANUrXwgCiABKQMYIgMgBiAGIAEpAxAiCHwiBlatfCAGIAMgBCAIfCIEIAhUrXwgBCABKQMoIAEpAyAiAyALfCADVK18fCIOIARUrXx8IgMgBlStfHwiBiAKVK18Ig1CAFkEQCANQv///////////wBSIA5CbVRyIAMgBoNCf1JyDQELIANCAXwiCyAOQm1UrSIIfSEEIAZCAXwiCiADQn9SIAggC1ZyrSIIfSEDIA0gBkJ/UiAIIApWcq19Qv///////////wB9IQ0gDkITfCEODAELIAMhBCAGIQMLIAFBiAhqQYyBwgBBwABBEBDxAQJAIAEoAogIQYCAgIB4RwRAIAAgASkCiAg3AqwEIABBtARqIAFBkAhqKAIANgIAEMcEIgJFDQEgAEEEOgC4BCAAIBM3AzggACAMNwMwIAAgCTcDKCAAIBc3AyAgACASNwMYIAAgDzcDECAAIBA3AwggACAWNwMAIABBgLHCACkDADcD4AEgAEHoAWpBiLHCACkDADcDACAAIAIpAwg3A/gBIAAgAikDACIJNwPwASACIAlCAXw3AwAgAEH4AGpCADcDACAAQfAAakIANwMAIABB6ABqQgA3AwAgAEHgAGpCADcDACAAQdgAakIANwMAIABB0ABqQgA3AwAgAEHIAGpCADcDACAAQgA3A0AgACAYNwOAASAAIAU3A4gBIAAgBzcDkAEgACAVNwOYASAAIA03A6ABIAAgAzcDqAEgACAENwOwASAAIA43A7gBIABCADcDmAMgAEIANwPgAyAAQQg2AqgEIABCADcDiAIgAEIANwOAAiAAQgA3A8ABIABByAFqQgA3AwAgAEHQAWpCADcDACAAQgE3A6gCIABC5AE3A9gBIABCADcDsAIgAEIANwOgAiAAQYCAgIB4NgKQAiABQbAIaiQADwsgASABLQCMCDoArwhBjPfBAEErIAFBrwhqQeT7wQBBzIHCABDKAwALEPADAAuBIgEEfyAAKAIEIQIgACgCCCIDBEAgAiEBA0AgASgCACIEBEAgAUEEaigCACAEQQJ0EN8ECyABQQxqIQEgA0EBayID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AkHAA2oiISkDACI3NwMAIAJBOGoiBCACQbgDaiIiKQMAIjg3AwAgAkEwaiIWIAJBsANqIiMpAwAiOTcDACACQShqIhcgAkGoA2oiJCkDACI6NwMAIAJBIGoiGSACQaADaiIlKQMAIjs3AwAgAkHYDWoiEyACQZADaiImKQMANwMAIAJB4A1qIhQgAkGYA2oiJykDADcDACACQegNaiIFIDs3AwAgAkHwDWoiBiA6NwMAIAJB+A1qIgcgOTcDACACQYAOaiIIIDg3AwAgAkGIDmoiCSA3NwMAIAIgAikDiAMiNzcDCCACIDc3A9ANIAJBwAZqIgogCSkDADcDACACQbgGaiILIAgpAwA3AwAgAkGwBmoiDCAHKQMANwMAIAJBqAZqIg0gBikDADcDACACQaAGaiIOIAUpAwA3AwAgAkGYBmoiDyAUKQMANwMAIAJBkAZqIhAgEykDADcDACACIAIpA9ANNwOIBiACQcAJaiAKKQMANwMAIAJBuAlqIAspAwA3AwAgAkGwCWogDCkDADcDACACQagJaiANKQMANwMAIAJBoAlqIA4pAwA3AwAgAkGYCWogDykDADcDACACQZAJaiAQKQMANwMAIAIgAikDiAY3A4gJIBEgEhC9AyADICEpAwAiNzcDACAEICIpAwAiODcDACAWICMpAwAiOTcDACAXICQpAwAiOjcDACAZICUpAwAiOzcDACATICYpAwA3AwAgFCAnKQMANwMAIAUgOzcDACAGIDo3AwAgByA5NwMAIAggODcDACAJIDc3AwAgAiACKQOIAyI3NwMIIAIgNzcD0A0gCiAJKQMANwMAIAsgCCkDADcDACAMIAcpAwA3AwAgDSAGKQMANwMAIA4gBSkDADcDACAPIBQpAwA3AwAgECATKQMANwMAIAIgAikD0A03A4gGIAJBgApqIAopAwA3AwAgAkH4CWogCykDADcDACACQfAJaiAMKQMANwMAIAJB6AlqIA0pAwA3AwAgAkHgCWogDikDADcDACACQdgJaiAPKQMANwMAIAJB0AlqIBApAwA3AwAgAiACKQOIBjcDyAkgESASEL0DIAMgISkDACI3NwMAIAQgIikDACI4NwMAIBYgIykDACI5NwMAIBcgJCkDACI6NwMAIBkgJSkDACI7NwMAIBMgJikDADcDACAUICcpAwA3AwAgBSA7NwMAIAYgOjcDACAHIDk3AwAgCCA4NwMAIAkgNzcDACACIAIpA4gDIjc3AwggAiA3NwPQDSAKIAkpAwA3AwAgCyAIKQMANwMAIAwgBykDADcDACANIAYpAwA3AwAgDiAFKQMANwMAIA8gFCkDADcDACAQIBMpAwA3AwAgAiACKQPQDTcDiAYgAkHACmogCikDADcDACACQbgKaiALKQMANwMAIAJBsApqIAwpAwA3AwAgAkGoCmogDSkDADcDACACQaAKaiAOKQMANwMAIAJBmApqIA8pAwA3AwAgAkGQCmogECkDADcDACACIAIpA4gGNwOICkEARQRAIAJBiAZqIAJBiAlqQcAB/AoAAAsgAiABQYADajYClAwgAiAVNgKQDCACQdANaiIbIAJBkAxqIigQvQMgAkHIDWoiASAJKQMAIjc3AwAgAkHADWoiFSAIKQMAIjg3AwAgAkG4DWoiESAHKQMAIjk3AwAgAkGwDWoiEiAGKQMAIjo3AwAgAkGoDWoiGCAFKQMAIjs3AwAgAkHYDGoiKSATKQMANwMAIAJB4AxqIiogFCkDADcDACACQegMaiIcIDs3AwAgAkHwDGoiHSA6NwMAIAJB+AxqIh4gOTcDACACQYANaiIfIDg3AwAgAkGIDWoiICA3NwMAIAIgAikD0A0iNzcDkA0gAiA3NwPQDCADICApAwA3AwAgBCAfKQMANwMAIBYgHikDADcDACAXIB0pAwA3AwAgGSAcKQMANwMAIAJBGGoiKyAqKQMANwMAIAJBEGoiGiApKQMANwMAIAIgAikD0Aw3AwggISADKQMANwMAICIgBCkDADcDACAjIBYpAwA3AwAgJCAXKQMANwMAICUgGSkDADcDACAnICspAwA3AwAgJiAaKQMANwMAIAIgAikDCDcDiAMgGyAoEL0DIAEgCSkDACI3NwMAIBUgCCkDACI4NwMAIBEgBykDACI5NwMAIBIgBikDACI6NwMAIBggBSkDACI7NwMAICkgEykDADcDACAqIBQpAwA3AwAgHCA7NwMAIB0gOjcDACAeIDk3AwAgHyA4NwMAICAgNzcDACACIAIpA9ANIjc3A5ANIAIgNzcD0AwgAyAgKQMANwMAIAQgHykDADcDACAWIB4pAwA3AwAgFyAdKQMANwMAIBkgHCkDADcDACArICopAwA3AwAgGiApKQMANwMAIAIgAikD0Aw3AwggAkGABGoiLSADKQMANwMAIAJB+ANqIi4gBCkDADcDACACQfADaiIvIBYpAwA3AwAgAkHoA2oiMCAXKQMANwMAIAJB4ANqIjEgGSkDADcDACACQdgDaiIyICspAwA3AwAgAkHQA2oiMyAaKQMANwMAIAIgAikDCDcDyAMgGyAoEL0DIAEgCSkDACI3NwMAIBUgCCkDACI4NwMAIBEgBykDACI5NwMAIBIgBikDACI6NwMAIBggBSkDACI7NwMAICkgEykDADcDACAqIBQpAwA3AwAgHCA7NwMAIB0gOjcDACAeIDk3AwAgHyA4NwMAICAgNzcDACACIAIpA9ANIjc3A5ANIAIgNzcD0AwgAyAgKQMANwMAIAQgHykDADcDACAWIB4pAwA3AwAgFyAdKQMANwMAIBkgHCkDADcDACArICopAwA3AwAgGiApKQMANwMAIAIgAikD0Aw3AwggAkHABGoiKSADKQMANwMAIAJBuARqIiogBCkDADcDACACQbAEaiI0IBYpAwA3AwAgAkGoBGoiNSAXKQMANwMAIAJBoARqIjYgGSkDADcDACACQZgEaiIZICspAwA3AwAgAkGQBGoiKyAaKQMANwMAIAIgAikDCDcDiAQgLEUEQCACQYgJaiACQYgDakHAAfwKAAALIAJByAdqIRcgLEUEQCAXIAJBiAlqQcAB/AoAAAtBACIWRQRAIAJBCGogAkGIBmpBgAP8CgAACyACIAJByAFqIho2AtQMIAIgAkEIajYC0AwgAkGIA2oiGyACQdAMaiIoEL0DIAkgISkDACI3NwMAIAggIikDACI4NwMAIAcgIykDACI5NwMAIAYgJCkDACI6NwMAIAUgJSkDACI7NwMAIAJBmA1qIgMgJikDADcDACACQaANaiIEICcpAwA3AwAgGCA7NwMAIBIgOjcDACARIDk3AwAgFSA4NwMAIAEgNzcDACACIAIpA4gDIjc3A9ANIAIgNzcDkA0gCiABKQMANwMAIAsgFSkDADcDACAMIBEpAwA3AwAgDSASKQMANwMAIA4gGCkDADcDACAPIAQpAwA3AwAgECADKQMANwMAIAIgAikDkA03A4gGIAJBgAtqIAopAwA3AwAgAkH4CmogCykDADcDACACQfAKaiAMKQMANwMAIAJB6ApqIA0pAwA3AwAgAkHgCmogDikDADcDACACQdgKaiAPKQMANwMAIAJB0ApqIBApAwA3AwAgAiACKQOIBjcDyAogGyAoEL0DIAkgISkDACI3NwMAIAggIikDACI4NwMAIAcgIykDACI5NwMAIAYgJCkDACI6NwMAIAUgJSkDACI7NwMAIAMgJikDADcDACAEICcpAwA3AwAgGCA7NwMAIBIgOjcDACARIDk3AwAgFSA4NwMAIAEgNzcDACACIAIpA4gDIjc3A9ANIAIgNzcDkA0gCiABKQMANwMAIAsgFSkDADcDACAMIBEpAwA3AwAgDSASKQMANwMAIA4gGCkDADcDACAPIAQpAwA3AwAgECADKQMANwMAIAIgAikDkA03A4gGIAJBwAtqIAopAwA3AwAgAkG4C2ogCykDADcDACACQbALaiAMKQMANwMAIAJBqAtqIA0pAwA3AwAgAkGgC2ogDikDADcDACACQZgLaiAPKQMANwMAIAJBkAtqIBApAwA3AwAgAiACKQOIBjcDiAsgGyAoEL0DIAkgISkDACI3NwMAIAggIikDACI4NwMAIAcgIykDACI5NwMAIAYgJCkDACI6NwMAIAUgJSkDACI7NwMAIAMgJikDADcDACAEICcpAwA3AwAgGCA7NwMAIBIgOjcDACARIDk3AwAgFSA4NwMAIAEgNzcDACACIAIpA4gDIjc3A9ANIAIgNzcDkA0gCiABKQMANwMAIAsgFSkDADcDACAMIBEpAwA3AwAgDSASKQMANwMAIA4gGCkDADcDACAPIAQpAwA3AwAgECADKQMANwMAIAIgAikDkA03A4gGIAJBgAxqIAopAwA3AwAgAkH4C2ogCykDADcDACACQfALaiAMKQMANwMAIAJB6AtqIA0pAwA3AwAgAkHgC2ogDikDADcDACACQdgLaiAPKQMANwMAIAJB0AtqIBApAwA3AwAgAiACKQOIBjcDyAsgLEUEQCACQYgGaiACQcgKakHAAfwKAAALIAIgAkGIA2oiKDYCjAwgAiAaNgKIDCACQZANaiIaIAJBiAxqIhsQvQMgICABKQMAIjc3AwAgHyAVKQMAIjg3AwAgHiARKQMAIjk3AwAgHSASKQMAIjo3AwAgHCAYKQMAIjs3AwAgAkGYDGoiCiADKQMANwMAIAJBoAxqIgsgBCkDADcDACACQagMaiIMIDs3AwAgAkGwDGoiDSA6NwMAIAJBuAxqIg4gOTcDACACQcAMaiIPIDg3AwAgAkHIDGoiECA3NwMAIAIgAikDkA0iNzcD0AwgAiA3NwOQDCAJIBApAwA3AwAgCCAPKQMANwMAIAcgDikDADcDACAGIA0pAwA3AwAgBSAMKQMANwMAIBQgCykDADcDACATIAopAwA3AwAgAiACKQOQDDcD0A0gISAJKQMANwMAICIgCCkDADcDACAjIAcpAwA3AwAgJCAGKQMANwMAICUgBSkDADcDACAnIBQpAwA3AwAgJiATKQMANwMAIAIgAikD0A03A4gDIBogGxC9AyAgIAEpAwAiNzcDACAfIBUpAwAiODcDACAeIBEpAwAiOTcDACAdIBIpAwAiOjcDACAcIBgpAwAiOzcDACAKIAMpAwA3AwAgCyAEKQMANwMAIAwgOzcDACANIDo3AwAgDiA5NwMAIA8gODcDACAQIDc3AwAgAiACKQOQDSI3NwPQDCACIDc3A5AMIAkgECkDADcDACAIIA8pAwA3AwAgByAOKQMANwMAIAYgDSkDADcDACAFIAwpAwA3AwAgFCALKQMANwMAIBMgCikDADcDACACIAIpA5AMNwPQDSAtIAkpAwA3AwAgLiAIKQMANwMAIC8gBykDADcDACAwIAYpAwA3AwAgMSAFKQMANwMAIDIgFCkDADcDACAzIBMpAwA3AwAgAiACKQPQDTcDyAMgGiAbEL0DICAgASkDACI3NwMAIB8gFSkDACI4NwMAIB4gESkDACI5NwMAIB0gEikDACI6NwMAIBwgGCkDACI7NwMAIAogAykDADcDACALIAQpAwA3AwAgDCA7NwMAIA0gOjcDACAOIDk3AwAgDyA4NwMAIBAgNzcDACACIAIpA5ANIjc3A9AMIAIgNzcDkAwgCSAQKQMANwMAIAggDykDADcDACAHIA4pAwA3AwAgBiANKQMANwMAIAUgDCkDADcDACAUIAspAwA3AwAgEyAKKQMANwMAIAIgAikDkAw3A9ANICkgCSkDADcDACAqIAgpAwA3AwAgNCAHKQMANwMAIDUgBikDADcDACA2IAUpAwA3AwAgGSAUKQMANwMAICsgEykDADcDACACIAIpA9ANNwOIBCAsRQRAIAJByApqIChBwAH8CgAACyAsRQRAIBcgAkHICmpBwAH8CgAACyAWRQRAIAJBiANqIAJB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0ABqIjwpAwA3AwAgJCAKQdgAaiI9KQMANwMAICUgCykDADcDACAmIAwpAwA3AwAgJyAZKQMANwMAICggGikDADcDACAJIApBQGsiPikDADcDqAYgKSAqEL4CIAlB+AFqIB4gKRA4IA4gCUGgAWopAwA3AwAgFiAJQZgBaikDADcDACAVIAlBkAFqKQMANwMAIAkgCSkDiAE3A9gEIAsgMCkDADcDACANIDEpAwA3AwAgECAyKQMANwMAIBQgMykDADcDACAbIDQpAwA3AwAgIyA1KQMANwMAICQgNikDADcDACAlIAspAwA3AwAgJiAMKQMANwMAICcgGSkDADcDACAoIBopAwA3AwAgCSAKKQMANwOoBiAJQbgCaiAeICoQWSAJIEE3A/AEIAkgRDcD6AQgCSBCNwPgBCAJIEM3A9gEIAsgNykDADcDACANIDgpAwA3AwAgECA5KQMANwMAIBQgOikDADcDACAbIDspAwA3AwAgIyA8KQMANwMAICQgPSkDADcDACAlIAspAwA3AwAgJiAMKQMANwMAICcgGSkDADcDACAoIBopAwA3AwAgCSA+KQMANwOoBiAJQfgCaiAeICoQWSACIB1GDQggESAJKQP4ATcDACAvIAlB8AFqKQMANwMAIC4gCUHoAWopAwA3AwAgLSAJQeABaikDADcDACAYIAlB2AFqKQMANwMAIA4gCUHQAWopAwA3AwAgFiAJQcgBaikDADcDACAVIAlBwAFqKQMANwMAIBFBCGogCUGAAmopAwA3AwAgEUEQaiAJQYgCaikDADcDACARQRhqIAlBkAJqKQMANwMAIBFBIGogCUGYAmopAwA3AwAgEUEoaiAJQaACaikDADcDACARQTBqIAlBqAJqKQMANwMAIBFBOGogCUGwAmopAwA3AwAgCSAJKQO4ATcD2AQgBiAdRg0JIAggHUYNCyAJQagIaiIUIAEgH2oiCkFAayINIBEQ3AEgCUGwCWoiFSAKIB4Q3AEgCUHoCGoiFiAUIBUQkQMgCSkD+AghPyAJKQPwCCFAIAkoAugIQQFGDQogEyAXKQMANwMAIBNBKGogF0EoaikDADcDACATQSBqIBdBIGopAwA3AwAgE0EYaiAXQRhqKQMANwMAIBNBEGogF0EQaikDADcDACATQQhqIBdBCGopAwA3AwAgCUHwBWoiECA/NwMAIAkgQDcD6AUgFSAJQegFaiIYIBgQOCAWIAogHhCgAiAUIBUgFhDcASAWIAogFBDcASAVIBggFhA4ICsgFSANENwBIBsgCUGwCGoiFCkDADcDACAjIBIpAwA3AwAgJCAJQcAIaiIbKQMANwMAICUgHCkDADcDACAmIAlB0AhqKQMANwMAICcgCUHYCGopAwA3AwAgKCAJQeAIaikDADcDACAJQbAHaiAQKQMANwMAIAlBuAdqIBMpAwA3AwAgCUHAB2ogCUGABmopAwA3AwAgCSAJKQOoCDcDqAYgCSAJKQPoBTcDqAcgIkEYaiAgQRhqKQMANwMAICJBEGogIEEQaikDADcDACAiQQhqICBBCGopAwA3AwAgIiAgKQMANwMAIBYgGCAKEDggFSAWIA0Q3AEgLCAJQagHaiAVIAUgBxAZQQAiCkUEQCApICpBgAH8CgAACyAKRQRAIAlBqAZqIAlByANqQYAB/AoAAAsgCUHAA2oiDSAsQQhqKQIANwMAIAkgLCkCADcDuAMgCSgCtAEiCiAJKAKsAUYEQCAJQawBakG0wMIAEKMDCyAJKAKwASAKQQR0aiIQIAkpA7gDNwIAIBBBCGogDSkDADcCACAJIApBAWo2ArQBIBogCUHwAmopAwA3AwAgGSAJQegCaikDADcDACAMIAlB4AJqKQMANwMAIAsgCUHYAmopAwA3AwAgCUHgA2ogCUHQAmopAwA3AwAgCUHYA2ogCUHIAmopAwA3AwAgCUHQA2ogCUHAAmopAwA3AwAgCSAJKQO4AjcDyAMgDyAJKQP4AjcDACAPQQhqIAlBgANqKQMANwMAIA9BEGogCUGIA2opAwA3AwAgD0EYaiAJQZADaikDADcDACAPQSBqIAlBmANqKQMANwMAIA9BKGogCUGgA2opAwA3AwAgD0EwaiAJQagDaikDADcDACAPQThqIAlBsANqKQMANwMAIAlBsAlqIhAgKyAPENwBIAlB6AhqIgogCUGoBmoiDCAJQcgDahDcASAJQdgEaiINIBAgChCRAyAJKQPoBCE/IAkpA+AEIUAgCSgC2ARBAUYNDCASIA4pAwA3AwAgEkEIaiAOQQhqKQMANwMAIBJBKGogDkEoaikDADcDACASQSBqIA5BIGopAwA3AwAgEkEYaiAOQRhqKQMANwMAIBJBEGogDkEQaikDADcDACAUID83AwAgCUHwB2ogPzcDACAJQfgHaiASKQMANwMAIAlBgAhqIBspAwA3AwAgISAcKQMANwMAICFBCGogHEEIaikDADcDACAhQRBqIBxBEGopAwA3AwAgIUEYaiAcQRhqKQMANwMAIAkgQDcDqAggCSBANwPoByANIAlBqAhqIAwQOCAKIA0gKxDcASAJQdgFaiAJQegHaiAKIAUgBxAZIAkoArQBIgogCSgCrAFGBEAgCUGsAWpBxMDCABCjAwsgCSgCsAEgCkEEdGoiDCAJKQLYBTcCACAMQQhqIAlB4AVqKQIANwIAIAkgCkEBajYCtAEgH0GAAWohHyAFQSBqIQUgB0EgaiEHIAQgHUEBaiIdRw0ACwsgACAJKQKsATcCACAAQQhqIAlBtAFqKAIANgIAIAlB8AlqJAAPCyAJIAktAMkDOgDIA0GgscIAQSsgCUHIA2pB1MDCAEG0wcIAEMoDAAsgCSAJLQDJAzoAyANBoLHCAEErIAlByANqQdTAwgBBpMHCABDKAwALIAkgCS0AyQM6AMgDQaCxwgBBKyAJQcgDakHUwMIAQZTBwgAQygMACyAJIAktAMkDOgDIA0GgscIAQSsgCUHIA2pB1MDCAEGEwcIAEMoDAAsgCSAJLQDJAzoAyANBoLHCAEErIAlByANqQdTAwgBB9MDCABDKAwALIAkgCS0AyQM6AMgDQaCxwgBBKyAJQcgDakHUwMIAQeTAwgAQygMACyACIAJBhMDCABDZAwALIAYgBkGUwMIAENkDAAsgCSA/NwPwCCAJIEA3A+gIQdT+wABBKyAJQegIakGwhcEAQdCFwQAQygMACyAIIAhBpMDCABDZAwALIAkgPzcD4AQgCSBANwPYBEHU/sAAQSsgCUHYBGpBsIXBAEHQhcEAEMoDAAvbYAI0fwd+IwBB8AJrIgYkACAGQfAAaiABIAMQPCAGQZgCaiIDIAZB/ABqKAIANgIAIAYgBikCdDcDkAICQAJAAkACQAJAAkACQAJAIAYoAnAiCUGAgICAeEYEQCAAIAYpA5ACNwIEIABBgICAgHg2AgAgAEEMaiADKAIANgIADAELIAZBEGoiByAGQYABakHgAPwKAAAgBkEMaiAGQZgCaigCACILNgIAIAYgBikDkAIiODcCBCAGIAk2AgAgBigCCCIKQQJ0IQlBACEDAkACQAJAAkACQAJAAkAgCkH/////A0sgCUH8////B0tyDQACfyAJRQRAQQQhCEEADAELQdHOxQAtAAAaQQQhAyAJQQQQ1gQiCEUNASAKCyEDIAkEQCAIIDinIAn8CgAACyAGIAo2AugBIAYgCDYC5AEgBiADNgLgASAGKAIYIgpBAnQhA0EAIQkgCkH/////A0sgA0H8////B0tyDQEgBigCFCEMIAYtABwhEwJ/IANFBEBBBCEIQQAMAQtB0c7FAC0AABpBBCEJIANBBBDWBCIIRQ0CIAoLIQkgAwRAIAggDCAD/AoAAAsgBiAKNgL4ASAGIAg2AvQBIAYgCTYC8AEgBiATOgD8ASAGIAs6AOwBAkACfwJAAkACQAJAAkACQAJAAkAgAS0ADCINQQFrDgIFAAELIAEoAggiC0UNBCABKAIEIQkgC0EBayIDQf7///8DcQ0FIANB/////wNxIhNBAWoiDEEDcSEKQgAhOCAJIQMgE0EDTwRAIAxB/P///wdxIQgDQCA4QoABfCE4IANBEGohAyAIQQRrIggNAAsLIAoEQCAKIQgDQCADNQIAIDiGIDl8ITkgOEIgfCE4IANBBGohAyAIQQFrIggNAAsLIDlCgICAgBBUDQRCACE4IAkhAyATQQNPBEAgDEH8////B3EhCANAIDhCgAF8ITggA0EQaiEDIAhBBGsiCA0ACwsgDEEDcQ0BDAILIAEoAgQhCSABKAIIIgsEQCALQQFrIgNB/v///wNxDQUgA0H/////A3EiCkEBaiIMQQNxIQhCACE4IAkhAyAKQQNPBEAgDEH8////B3EhCgNAIDhCgAF8ITggA0EQaiEDIApBBGsiCg0ACwsgCARAA0AgAzUCACA4hiA5fCE5IDhCIHwhOCADQQRqIQMgCEEBayIIDQALCyA5QgBTDQULQgAgOX0hOQwCC0IAITkDQCADNQIAIDiGIDl8ITkgOEIgfCE4IANBBGohAyAKQQFrIgoNAAsLIDlCAFMNAgsgOUKAgICACHxCgICAgBBaDQEgAigCCCIIQQJ0IQFBACEKIAhB/////wNLIAFB/P///wdLcg0IIAIoAgQhDCACLQAMIQMgAQ0CQQQhEkEADAMLIAIoAggiC0ECdCEIQQAhCSALQf////8DSyAIQfz///8HS3INBiACKAIEIQwgAi0ADCEDAn8gCEUEQEEEIQpBAAwBC0HRzsUALQAAGkEEIQkgCEEEENYEIgpFDQcgCwshCSAIBEAgCiAMIAj8CgAACyAGIAM6AHwgBiALNgJ4IAYgCjYCdCAGIAk2AnAgBkHgAmogBkHwAGogOacQnQIgASgCCCELIAEoAgQhCQwDCyAGQfAAaiACIAEQoQEgBigCdCETIAYoAnAhASAGKQJ8IjhCIIinIQogOKchCAJAIAItAAwiA0EBRwRAIANBASAGKAKEASISGyEMDAELIAFBBE8EQCATIAFBAnQQ3wRBBCETQQAhAQtBASEMIAhBBEkNACAKIAhBAnQQ3wRBACEIQQQhCgsgBiAMOgDsAiAGIBI2AugCIAYgCjYC5AIgBiAINgLgAiABRQ0CIBMgAUECdBDfBAwCC0HRzsUALQAAGkEEIQogAUEEENYEIhJFDQUgCAshCiABBEAgEiAMIAH8CgAACyAGIAM6AHwgBiAINgJ4IAYgEjYCdCAGIAo2AnAgBkHgAmogBkHwAGpBACA5pyIBayABIDlCAFMbEJ0CC0EAIQogC0H/////A0sgC0ECdCIBQfz///8HS3INBAJ/IAFFBEBBBCEIQQAMAQtB0c7FAC0AABpBBCEKIAFBBBDWBCIIRQ0FIAsLIQogAQRAIAggCSAB/AoAAAsgBiANOgB8IAYgCzYCeCAGIAg2AnQgBiAKNgJwIAZBkAJqIAZB8ABqQQEQ0wEgBi0A7AIiASAGLQCcAkcNBSABQQFHBEAgBigC6AIiASAGKAKYAkcNBiAGKALkAiAGKAKUAiABQQJ0EPEDDQYLIAYoApACIgEEQCAGKAKUAiABQQJ0EN8ECyAGKALgAiIBBEAgBigC5AIgAUECdBDfBAsgBkH4AGpBuMzCACgCADYCACAGQbDMwgApAgA3A3AgBkHwAGpBpM3CABClAyAGKAJ0QQE2AgAgBkGIAmpBATYCACAGIAYpA3A3A4ACQQIhAwwGCyADIAlB+IHAABDIBAALIAkgA0H4gcAAEMgEAAsgCSAIQfiBwAAQyAQACyAKIAFB+IHAABDIBAALIAogAUH4gcAAEMgEAAsgBigCkAIiAQRAIAYoApQCIAFBAnQQ3wQLIAYoAuACIgEEQCAGKALkAiABQQJ0EN8ECyACKAIIIglBAnQhAUEAIQggCUH/////A0sgAUH8////B0tyDQIgAigCBCEKAn8gAUUEQEEEIQJBAAwBC0HRzsUALQAAGkEEIQggAUEEENYEIgJFDQMgCQshCCABBEAgAiAKIAH8CgAACyAGIAk2AogCIAYgAjYChAIgBiAINgKAAgsgBiADOgCMAiAGQbACaiAGQYACaiIBIAZB0ABqEJcCIAZB8ABqIgIgASAGQeAAahCXAiAGQQIgBi0AfGs6AHwgBkHIAmogBkH4AGoiASkCADcDACAGIAYpAnA3A8ACQQAhCyABQbjMwgAoAgA2AgAgBkGwzMIAKQIANwNwIAJBpM3CABClAyAGKAJ0QQE2AgAgBiAGKAJ0Igo2ApACIAYoAkgiCUECdCEBIAlB/////wNLIAFB/P///wdLcg0CIAYoAnAhAiAGKAJEIQwgBi0ATCETAn8gAUUEQEEEIQhBAAwBC0HRzsUALQAAGkEEIQsgAUEEENYEIghFDQMgCQshAyABBEAgCCAMIAH8CgAACyAGIAg2AnBBASEBIAZB8ABqIRIgAyELAkAgE0ECRw0AAkACQCAJDgICAAELIAgoAgAgCigCAE8NAAwBCyAGQZACaiESIAIhCyAIIQogAyECIAkhAQsgCwRAIBIoAgAgC0ECdBDfBAsgAQR+IAGtQgaGIAogAUECdGpBBGsoAgBnQQF0rX1CQH1CgP////8BgwVCAAshOCACBEAgCiACQQJ0EN8ECyAGQbACaiIDIDgQvAIgBkHAAmoiCSA4ELwCIAZBkAJqIgIgAyAGEJcCIAZB8ABqIgEgCSAGQSBqEJcCIAZB0AJqIgggAiABEK4BIAIgAyAHEJcCIAEgCSAGQTBqEJcCIAZB4AJqIAIgARCuASABIAZBgAJqIAgQkgEgBi0AfCEIIAYoAnghAyAGKAJ0ISsgBigCcCEnIAYoAugCIQkgBigC5AIhLCAGKALgAiEoIAYtAOwCIQwgBigC0AIiAQRAIAYoAtQCIAFBAnQQ3wQLIAYoAsACIgEEQCAGKALEAiABQQJ0EN8ECyAGKAKwAiIBBEAgBigCtAIgAUECdBDfBAtBACELIANB/////wNLIANBAnQiAUH8////B0tyDQMCfyABRQRAQQQhCkEADAELQdHOxQAtAAAaQQQhCyABQQQQ1gQiCkUNBCADCyESIAEEQCAKICsgAfwKAAALQQAhASAJQf////8DSyAJQQJ0IgJB/P///wdLcg0EAn8gAkUEQEEEIQtBAAwBC0HRzsUALQAAGkEEIQEgAkEEENYEIgtFDQUgCQshASACBEAgCyAsIAL8CgAACyAGIAk2AqgCIAYgCzYCpAIgBiABNgKgAiAGIAw6AKwCIAZBAiAIazoAnAIgBiADNgKYAiAGIAo2ApQCIAYgEjYCkAIgBkHwAGohHiMAQZAEayIEJAAgBCAGQZACaiICNgIMIAQgBkHgAWoiATYCCCABKAIIIgNBAnQhEQJAAkAgA0H/////A0sgEUH8////B0tyDQAgASgCBCEJIAEtAAwhCAJ/IBFFBEBBBCEVQQAMAQtB0c7FAC0AABpBBCEUIBFBBBDWBCIVRQ0BIAMLIQogEQRAIBUgCSAR/AoAAAsgBCADNgIYIAQgFTYCFCAEIAo2AhAgASgCGCIDQQJ0IRFBACEUIANB/////wNLIBFB/P///wdLcg0AIAEoAhQhCSABLQAcIQoCfyARRQRAQQQhFUEADAELQdHOxQAtAAAaQQQhFCARQQQQ1gQiFUUNASADCyELIBEEQCAVIAkgEfwKAAALIAQgAzYCKCAEIBU2AiQgBCALNgIgIAQgCjoALCAEIAg6ABwgAigCCCIDQQJ0IRFBACEUIANB/////wNLIBFB/P///wdLcg0AIAIoAgQhCSACLQAMIQgCfyARRQRAQQQhFUEADAELQdHOxQAtAAAaQQQhFCARQQQQ1gQiFUUNASADCyEKIBEEQCAVIAkgEfwKAAALIAQgAzYCOCAEIBU2AjQgBCAKNgIwIAIoAhgiCUECdCEDQQAhFAJAAkACQAJAAkACQAJAAkAgCUH/////A0sgA0H8////B0tyDQAgAigCFCEKIAItABwhAgJ/IANFBEBBBCELQQAMAQtB0c7FAC0AABpBBCEUIANBBBDWBCILRQ0BIAkLIQwgAwRAIAsgCiAD/AoAAAsgBCAJNgJIIAQgCzYCRCAEIAw2AkAgBCACOgBMIAQgCDoAPEHRzsUALQAAGkEEQQQQ1gQiIEUNASAgQQE2AgBB0c7FAC0AABogBEHgAGpBqMzCACkCACI4NwMAIARB8ABqIDg3AwAgBEGgzMIAKQIAIjg3A1ggBCA4NwNoQQRBBBDWBCICRQ0CIAJBATYCACAEQZABakGozMIAKQIANwIAIARBAjoAhAEgBEEBNgKAASAEIAI2AnwgBEEBNgJ4IARBoMzCACkCADcCiAEgBEHAAWoiAiABEOUCIARBwAJqIgMgAUEQaiIJEOUCIARBgARqIgggAiADEJoBIARBgANqIgIgASAJEJcCIARBnAFqIAggAhCUASAEKALAAiIBBEAgBCgCxAIgAUECdBDfBAsgBCgCwAEiAQRAIAQoAsQBIAFBAnQQ3wQLIAQtAKgBRQ0EIARBQGshMSAEQegAaiEtIARBiAFqIS4gBEGsAWogBEGcAWoQqAMgBEGgnAE2ArwBIARB5QBqITIgBEHNAmohMyAEQaADaiEpIARBsAJqITQgBEHQAmohNSAEQZADaiEhIARBkAJqITYgBEHQAWohG0KAgICAECE8QQQhIkEAIRRCgICAgBAhOUEEISNCgICAgBAhOEEEISRBACERQQIhCEEBIQpBASEcQQAhFQNAIARBwAFqIgEgBEEwaiICEOUCIARBwAJqIgMgMRDlAiAEQYAEaiIJIAEgAxCaASAEQYADaiIBIAIgMRCXAiAEQfADaiAJIAEQlAEgBCgCwAIiAQRAIAQoAsQCIAFBAnQQ3wQLIAQoAsABIgEEQCAEKALEASABQQJ0EN8ECwJAAn8CQAJAIAQtAPwDIgEgBC0AuAEiAkYEQCABQQFrDgIEAgELIAEgAkogASACSGsMAgsgBCgCtAEiASAEKAL4AyICRgRAIAQoArABQQRrIQMgBCgC9ANBBGshCSABQQJ0IQwCQANAIAxFDQEgCSAMaiECIAMgDGogDEEEayEMKAIAIgEgAigCACICRg0ACyABIAJLIAEgAklrDAMLQX9BACAMGwwCCyABIAJLIAEgAklrDAELIAQoAvgDIgEgBCgCtAEiAkYEQCAEKAL0A0EEayEDIAQoArABQQRrIQkgAUECdCEMAkADQCAMRQ0BIAkgDGohAiADIAxqIAxBBGshDCgCACIBIAIoAgAiAkYNAAsgASACSyABIAJJawwCC0F/QQAgDBsMAQsgASACSyABIAJJawtBAE4NACAEKALwAyIBRQ0FIAQoAvQDIAFBAnQQ3wQMBQsgBCgC8AMiAQRAIAQoAvQDIAFBAnQQ3wQLAkAgFUGhnAFHBEAgBC0APEEBRgRAIAQtAExBAUYNBwsgBEGAA2ohFyAEQRBqISVBACEZQQAhA0IAITpCACE7QQAhCUEAIQtBACEMQQAhEkEAIRNCACE9QgAhPiMAQbADayIFJAACQAJAAkACQCAEQTBqIhgtAAxBAUYgGC0AHCINQQFGcUUEQCAFQcABaiIBIBgQ5QIgBUHgAWoiAiAYQRBqIhoQ5QIgBUGQAWoiByABIAIQmgEgBUGAAmoiASAYIBoQlwIgBSAHIAEQlAEgBSgC4AEiAQRAIAUoAuQBIAFBAnQQ3wQLIAUoAsABIgEEQCAFKALEASABQQJ0EN8ECyAFQeABaiAYIBoQkgEgGCgCGCICQQJ0IQFBACEHAn8gAkH/////A0sgAUH8////B0tyDQQgGCgCFCEPAn8gAUUEQEEEIQ5BAAwBC0HRzsUALQAAGkEEIQcgAUEEENYEIg5FDQUgAgshByABBEAgDiAPIAH8CgAACyAFQYgCaiAFQegBaikCADcDACAFIAI2ApgCIAUgDjYClAIgBSAHNgKQAiAFQQIgDWs6AJwCIAUgBSkC4AE3A4ACIAVBwAFqIgIgJSAFQYACaiIPEJcCIAVB4AFqIgEgJUEQaiIqIAVBkAJqIg0QlwIgBUEQaiACIAEQlAEgAiAlIA0QlwIgASAqIA8QlwIgBUGQAWoiDyACIAEQrgEgASAqIA0QlwIgBUEgaiICIA8gARCUASAFKAKAAiIBBEAgBSgChAIgAUECdBDfBAsgBwRAIA4gB0ECdBDfBAsgBUEwaiAFQRBqIAUQhAEgBUFAayACIAUQhAEgBSgCOCIQQQJ0IQECQAJAIBBB/////wNLIAFB/P///wdLcg0AIAUoAjQhDyAFLQA8IR0CfyABRQRAQQQhB0EADAELQdHOxQAtAAAaQQQhGSABQQQQ1gQiB0UNASAQCyEZIAEEQCAHIA8gAfwKAAALIAUoAkgiFkECdCEBQQAhAgJAIBZB/////wNLIAFB/P///wdLcg0AIAUoAkQhDSAFLQBMIR8CfyABRQRAQQQhDkEADAELQdHOxQAtAAAaQQQhAiABQQQQ1gQiDkUNASAWCyECIAEEQCAOIA0gAfwKAAALIAUgHzoAbCAFIBY2AmggBSAONgJkIAUgAjYCYCAFIB06AFwgBSAQNgJYIAUgBzYCVCAFIBk2AlAgBUHgAWoiAiAFQdAAaiIOIBgQlwIgBUGAAmoiASAFQeAAaiIHIBoQlwIgBUHwAGoiECACIAEQlAEgAiAOIBoQlwIgASAHIBgQlwIgBUHAAWoiDiACIAEQrgEgASAHIBoQlwIgBUGAAWoiAiAOIAEQlAEgBUGQAWogJSAQEJIBIAVBoAFqIh8gKiACEJIBIAVBkAJqIS8gBUHwAWohNyAFQdABaiEdAkACQANAIAVBwAFqIgEgBUGQAWoiAhDlAiAFQeABaiIHIB8Q5QIgBUGgA2oiDiABIAcQmgEgBUGAAmoiASACIB8QlwIgBUGQA2ogDiABEJQBIAUoAuABIgEEQCAFKALkASABQQJ0EN8ECyAFKALAASIBBEAgBSgCxAEgAUECdBDfBAsCQAJ/AkACQCAFLQCcAyIBIAUtAAwiAkYEQCABQQFrDgIEAgELIAEgAkogASACSGsMAgsgBSgCCCIBIAUoApgDIgJGBEAgBSgCBEEEayEOIAUoApQDQQRrIRAgAUECdCEHAkADQCAHRQ0BIAcgEGohAiAHIA5qIAdBBGshBygCACIBIAIoAgAiAkYNAAsgASACSyABIAJJawwDC0F/QQAgBxsMAgsgASACSyABIAJJawwBCyAFKAKYAyIBIAUoAggiAkYEQCAFKAKUA0EEayEOIAUoAgRBBGshECABQQJ0IQcCQANAIAdFDQEgByAQaiECIAcgDmogB0EEayEHKAIAIgEgAigCACICRg0ACyABIAJLIAEgAklrDAILQX9BACAHGwwBCyABIAJLIAEgAklrC0EATg0AIAUoApADIgEEQCAFKAKUAyABQQJ0EN8ECyAXIAUpAlA3AgAgF0EgaiAFKQKQATcCACAXQQhqIAVB2ABqKQIANwIAIBdBEGogBUHgAGopAgA3AgAgF0EYaiAFQegAaikCADcCACAXQShqIAVBmAFqKQIANwIAIBdBMGogBUGgAWopAgA3AgAgF0E4aiAFQagBaikCADcCACAFKAJwIgEEQCAFKAJ0IAFBAnQQ3wQLIAUoAoABIgEEQCAFKAKEASABQQJ0EN8ECyAFKAJAIgEEQCANIAFBAnQQ3wQLIAUoAjAiAQRAIA8gAUECdBDfBAsgBSgCECIBBEAgBSgCFCABQQJ0EN8ECyAFKAIgIgEEQCAFKAIkIAFBAnQQ3wQLIAUoAgAiAUUNCSAFKAIEIAFBAnQQ3wQMCQsgBSgCkAMiAQRAIAUoApQDIAFBAnQQ3wQLIAVBwAFqIgEgBUGQAWoiAhDlAiAFQeABaiIHIB8Q5QIgBUGgA2oiDSABIAcQmgEgBUGAAmoiASACIB8QlwIgBUGwAWogDSABEJQBIAUoAuABIgEEQCAFKALkASABQQJ0EN8ECyAFKALAASIBBEAgBSgCxAEgAUECdBDfBAtBgICAgHghAkGAgICAeCEBQQAhGQNAIAUoAjgiDkECdCEHIA5B/////wNLIAdB/P///wdLcg0GIBlBxNvCAGooAgAhDyAFKAI0IRAgBS0APCEWAn8gB0UEQEEEIQ1BAAwBC0HRzsUALQAAGkEEIAdBBBDWBCINRQ0IGiAOCyEwIAcEQCANIBAgB/wKAAALIAUgFjoAjAIgBSAONgKIAiAFIA02AoQCIAUgMDYCgAICQCAPQQBIBEAgBUGgA2ogBUGAAmpBACAPaxDTAQwBCyAFQaADaiAFQYACaiAPEL0BCyAFKAJIIg9BAnQhDkEAIQcCQAJAAkAgD0H/////A0sgDkH8////B0tyDQAgGUHI28IAaigCACEQIAUoAkQhFiAFLQBMITACfyAORQRAQQQhDUEADAELQdHOxQAtAAAaQQQhByAOQQQQ1gQiDUUNASAPCyEHIA4EQCANIBYgDvwKAAALIAUgMDoAjAIgBSAPNgKIAiAFIA02AoQCIAUgBzYCgAICQCAQQQBIBEAgBUHgAWogBUGAAmpBACAQaxDTAQwBCyAFQeABaiAFQYACaiAQEL0BCyAdIAUpAuABNwIAIAVByAFqIAVBqANqKQIANwMAIB1BCGogBUHoAWopAgA3AgAgBSAFKQKgAzcDwAEgBUGgA2oiDSAFQcABaiIOIBgQlwIgBUGAAmoiByAdIBoQlwIgBUHgAWoiDyANIAcQlAEgDSAOIBoQlwIgByAdIBgQlwIgBUGQA2oiDiANIAcQrgEgByAdIBoQlwIgNyAOIAcQlAEgByAlIA8QkgEgLyAqIDcQkgEgBUGAA2oiDyAHEOUCIA4gLxDlAiAFQfACaiIQIA8gDhCaASANIAcgLxCXAiAFQaACaiAQIA0QlAEgBSgCkAMiBwRAIAUoApQDIAdBAnQQ3wQLIAUoAoADIgcEQCAFKAKEAyAHQQJ0EN8ECwJAIAUtAKwCIgcgBS0AvAEiDUYEQAJAAkACQCAHQQFrDgIGAQALIAUoArgBIgcgBSgCqAIiDUYEQCAFKAK0AUEEayENIAUoAqQCQQRrIQ4gB0ECdCEHA0AgB0UNAyAHIA5qIQ8gByANaiAHQQRrIQcoAgAiECAPKAIAIg9GDQALIA8gEE0NBgwECyAHIA1PDQUMAwsgBSgCqAIiByAFKAK4ASINRgRAIAUoAqQCQQRrIQ0gBSgCtAFBBGshDiAHQQJ0IQcCQANAIAdFDQEgByAOaiEPIAcgDWogB0EEayEHKAIAIhAgDygCACIPRg0ACyAPIBBNDQYMBAsgB0UNBQwDCyAHIA1PDQQMAgsgBw0BDAMLIAcgDU8NAgsgBSkD2AEhOiAFKALUASAFKALQASENIAUpA8gBITsgBSgCxAEhDiAFKALAASEPAkAgAUGAgICAeEYNACABBEAgAyABQQJ0EN8ECyAJRQ0AIAsgCUECdBDfBAsgBSkCmAIhPSAFKAKUAiEQIAUoApACIRYgBSkCiAIhPiAFKAKEAiAFKAKAAiEDAkAgAkGAgICAeEYNACACBEAgEiACQQJ0EN8ECyAMRQ0AIBMgDEECdBDfBAsgBSgCsAEiAgRAIAUoArQBIAJBAnQQ3wQLIAVBuAFqIAVBqAJqKQIANwMAIAUgBSkCoAI3A7ABIAUoAuABIgIEQCAFKALkASACQQJ0EN8ECyAFKALwASICBEAgBSgC9AEgAkECdBDfBAshEiADIQIhCyANIQkgDiEDIA8hASAWIQwgECETDAILIAcgDkH4gcAAEMgEAAsgBSgCoAIiBwRAIAUoAqQCIAdBAnQQ3wQLIAUoAoACIgcEQCAFKAKEAiAHQQJ0EN8ECyAFKAKQAiIHBEAgBSgClAIgB0ECdBDfBAsgBSgC4AEiBwRAIAUoAuQBIAdBAnQQ3wQLIAUoAvABIgcEQCAFKAL0ASAHQQJ0EN8ECyAFKALAASIHBEAgBSgCxAEgB0ECdBDfBAsgBSgC0AEiB0UNACAFKALUASAHQQJ0EN8ECyAZQQhqIhlBMEcNAAsgAUGAgICAeEYNASAFKAJQIgcEQCAFKAJUIAdBAnQQ3wQLIAUoAmAiBwRAIAUoAmQgB0ECdBDfBAsgBSALNgJkIAUgCTYCYCAFIAM2AlQgBSABNgJQIAUgOjcCaCAFIDs3AlggAkGAgICAeEcEQCAFKAKQASIBBEAgBSgClAEgAUECdBDfBAsgBSgCoAEiAQRAIAUoAqQBIAFBAnQQ3wQLIAUgPTcCqAEgBSATNgKkASAFIAw2AqABIAUgPjcCmAEgBSASNgKUASAFIAI2ApABIDunIgJBAnQhAUEAIQcgAkH/////A0sgAUH8////B0tyDQsCfyABRQRAQQQhD0EADAELQdHOxQAtAAAaQQQhByABQQQQ1gQiD0UNDCACCyEHIAEEQCAPIAMgAfwKAAALIAUoAjAiAQRAIAUoAjQgAUECdBDfBAsgBSA7QiCIPAA8IAUgAjYCOCAFIA82AjQgBSAHNgIwIDqnIgJBAnQhAUEAIQcgAkH/////A0sgAUH8////B0tyDQMCfyABRQRAQQQhDUEADAELQdHOxQAtAAAaQQQhByABQQQQ1gQiDUUNBCACCyEHIAEEQCANIAsgAfwKAAALIAUoAkAiAQRAIAUoAkQgAUECdBDfBAsgBSA6QiCIPABMIAUgAjYCSCAFIA02AkQgBSAHNgJAIAUoArABIgFFDQEgBSgCtAEgAUECdBDfBAwBCwtByNzCABDoBAALQfTbwgBBG0G43MIAEOgDAAsMBwsMHAsgGSABQfiBwAAQyAQAC0EACyAHQfiBwAAQyAQAC0HRzsUALQAAGkEiQQEQ1gQiAUUNASAXQSI2AgwgFyABNgIIIBdCgICAgKgENwIAIAFBIGpB+NzCAC8AADsAACABQRhqQfDcwgApAAA3AAAgAUEQakHo3MIAKQAANwAAIAFBCGpB4NzCACkAADcAACABQdjcwgApAAA3AAALIAVBsANqJAAMAgtBAUEiQdTYwgAQyAQACyAHIAFB+IHAABDIBAALIAQoAoADQYCAgIB4Rw0BIAQoAoQDIgFFDQYgBCgCiAMgARDfBAwGCyAEQQM2AsQCIARB5N3CADYCwAIgBEIDNwLMAiAEIARBDGqtQoCAgIDAC4Q3A5ADIAQgBEEIaq1CgICAgMALhDcDiAMgBCAEQbwBaq1CgICAgNALhDcDgAMgBCAEQYADajYCyAIgHkEEaiAEQcACahDSAiAeQYCAgIB4NgIAIAQoAqwBIgFFDQcgBCgCsAEgAUECdBDfBAwHCyAEQdgBaiAEQZgDaikCADcDACAbICEpAgA3AwAgBEHIAWogBEGIA2opAgA3AwAgBEHoAWoiAyApQQhqKQIANwMAIARB8AFqIgkgKUEQaikCADcDACAEQfgBaiILIClBGGopAgA3AwAgBCAEKQKAAzcDwAEgBCApKQIANwPgASAEIAg6AMwCIAQgCjYCyAIgBCAgNgLEAiAEIBw2AsACIDMgBC8AVDsAACAzQQJqIARB1gBqIgwtAAA6AAAgBCA4NwLYAiAEICQ2AtQCIAQgETYC0AIgBEHwA2oiAiAEQcABaiIIIARB2ABqIgoQlwIgBEGABGoiASAbIC0QlwIgBEGAA2oiEiACIAEQlAEgAiAIIC0QlwIgASAbIAoQlwIgBEHgA2oiCCACIAEQrgEgASAbIC0QlwIgISAIIAEQlAEgBEGAAmogBEHAAmogEhCSASA2IDUgIRCSASAEKAKAAyIBBEAgBCgChAMgAUECdBDfBAsgBCgCkAMiAQRAIAQoApQDIAFBAnQQ3wQLIAQoAsACIgEEQCAEKALEAiABQQJ0EN8ECyAEKALQAiIBBEAgBCgC1AIgAUECdBDfBAsgBCA8NwLYAiAEICI2AtQCIAQgFDYC0AIgBCA5NwLIAiAEICM2AsQCIAQgJjYCwAIgBEHwA2oiAiAEQcABaiIIIARB+ABqIgoQlwIgBEGABGoiASAbIC4QlwIgBEGAA2oiEiACIAEQlAEgAiAIIC4QlwIgASAbIAoQlwIgBEHgA2oiCCACIAEQrgEgASAbIC4QlwIgISAIIAEQlAEgBEGgAmogBEHAAmogEhCSASA0IDUgIRCSASAEKAKAAyIBBEAgBCgChAMgAUECdBDfBAsgBCgCkAMiAQRAIAQoApQDIAFBAnQQ3wQLIAQoAsACIgEEQCAEKALEAiABQQJ0EN8ECyAEKALQAiIBBEAgBCgC1AIgAUECdBDfBAsgBEHoAmoiASAEQThqIgIpAgA3AwAgBEHwAmoiCCAEQUBrIgopAgA3AwAgBEH4AmoiEiAEQcgAaiITKQIANwMAIAQgBCkCMDcD4AIgBCgCECIHBEAgBCgCFCAHQQJ0EN8ECyAEKAIgIgcEQCAEKAIkIAdBAnQQ3wQLIARBKGogEikDADcDACAEQSBqIAgpAwA3AwAgBEEYaiABKQMANwMAIAIgAykDADcDACAKIAkpAwA3AwAgEyALKQMANwMAIAQgBCkD4AI3AxAgBCAEKQPgATcDMCAEQeAAaiIBKAIAIQogBCgCWCEcIAQoAlwhICAELQBkIQggDCAyQQJqLQAAOgAAIARB6ABqIgIoAgAhESAyLwAAIQMgBCgCbCEkIAIgNikCADcDACAEQfAAaiICKQMAITggAiAEQZgCaikCADcDACABIARBiAJqKQIANwMAIAQgAzsBVCAEIAQpAoACNwNYIARBgAFqIgEpAwAhOSAEQYgBaiICKAIAIRQgBEGQAWoiAykDACE8IAQoAnwhIyAEKAJ4ISYgBCgCjAEhIiADIARBuAJqKQIANwMAIAIgNCkCADcDACABIARBqAJqKQIANwMAIAQgBCkCoAI3A3ggBCgCwAEiAQRAIAQoAsQBIAFBAnQQ3wQLIAQoAtABIgEEQCAEKALUASABQQJ0EN8ECyAVQQFqIRUMAAsACyAUIANB+IHAABDIBAALQQRBBBD/BAALQQRBBBD/BAALIARBmANqIARByABqKQMANwMAIARBkANqIARBQGspAwA3AwAgBEGIA2ogBEE4aikDADcDACAEQagDaiAEQYABaikDADcDACAEQbADaiAEQYgBaikDADcDACAEQbgDaiAEQZABaikDADcDACAEQcgDaiAEQeAAaikDADcDACAEQdADaiAEQegAaikDADcDACAEQdgDaiAEQfAAaikDADcDACAEIAQpAzA3A4ADIAQgBCkDeDcDoAMgBCAEKQNYNwPAAyAeIARBgANqQeAA/AoAACAEKAKsASIBBEAgBCgCsAEgAUECdBDfBAsgBCgCnAEiAQRAIAQoAqABIAFBAnQQ3wQLICYEQCAjICZBAnQQ3wQLIBQEQCAiIBRBAnQQ3wQLIBwEQCAgIBxBAnQQ3wQLIBFFDQIgJCARQQJ0EN8EDAILQQAhFEHRzsUALQAAGkEBIRxBJEEBENYEIgFFDQIgHkEkNgIMIB4gATYCCCAeQoCAgIDIBDcCACABQSBqQZzewgAoAAA2AAAgAUEYakGU3sIAKQAANwAAIAFBEGpBjN7CACkAADcAACABQQhqQYTewgApAAA3AAAgAUH83cIAKQAANwAAQQQhIkEEISNBBCEkQQAhEQsgBCgCnAEiAQRAIAQoAqABIAFBAnQQ3wQLIAQoAngiAQRAIAQoAnwgAUECdBDfBAsgBCgCiAEiAQRAIAQoAowBIAFBAnQQ3wQLIAQoAlgiAQRAIAQoAlwgAUECdBDfBAsgBCgCaCIBBEAgBCgCbCABQQJ0EN8ECyAmBEAgIyAmQQJ0EN8ECyAUBEAgIiAUQQJ0EN8ECyAcBEAgICAcQQJ0EN8ECyARBEAgJCARQQJ0EN8ECyAEKAIwIgEEQCAEKAI0IAFBAnQQ3wQLIAQoAkAiAUUNACAEKAJEIAFBAnQQ3wQLIAQoAhAiAQRAIAQoAhQgAUECdBDfBAsgBCgCICIBBEAgBCgCJCABQQJ0EN8ECyAEQZAEaiQADAILQQFBJEHU2MIAEMgEAAsgFCARQfiBwAAQyAQACyAGLQB8IRIgBigCeCECIAYoAnQhDAJAIAYoAnAiE0GAgICAeEYEQCAGQeICaiAGQf8Aai0AACIBOgAAIAYgBi8AfSIDOwHgAiAAIBI6AAwgACACNgIIIAAgDDYCBCAAIAM7AA0gAEEPaiABOgAAIABBgICAgHg2AgAgBigCkAIiAARAIAYoApQCIABBAnQQ3wQLIAYoAqACIgAEQCAGKAKkAiAAQQJ0EN8ECyAnBEAgKyAnQQJ0EN8ECyAoBEAgLCAoQQJ0EN8ECyAGKAKAAiIABEAgBigChAIgAEECdBDfBAsgBigC4AEiAARAIAYoAuQBIABBAnQQ3wQLIAYoAvABIgBFDQEgBigC9AEgAEECdBDfBAwBCyAGKALEASEDIAYoAsABIQEgBi0ArAEhBCAGKAKoASEIIAYoAqQBIQcgBigCoAEhDSAGLQCcASEFIAYoApgBIQogBigClAEhDiAGKAKQASEPIAYtAIwBIREgBigCiAEhCyAGKAKEASEQIAYoAoABIRYgBigCsAEiCQRAIAYoArQBIAlBAnQQ3wQLIAEEQCADIAFBAnQQ3wQLQQAhAyACQf////8DSyACQQJ0IglB/P///wdLcg0GAn8gCUUEQEEEIQFBAAwBC0HRzsUALQAAGkEEIQMgCUEEENYEIgFFDQcgAgshAyAJBEAgASAMIAn8CgAACyAAIAI2AgggACABNgIEIAAgAzYCAEEAIQEgC0H/////A0sgC0ECdCICQfz///8HS3INBwJ/IAJFBEBBBCEDQQAMAQtB0c7FAC0AABpBBCEBIAJBBBDWBCIDRQ0IIAsLIQEgAgRAIAMgECAC/AoAAAsgACALNgIYIAAgAzYCFCAAIAE2AhBBACECIApB/////wNLIApBAnQiAUH8////B0tyDQgCfyABRQRAQQQhA0EADAELQdHOxQAtAAAaQQQhAiABQQQQ1gQiA0UNCSAKCyECIAEEQCADIA4gAfwKAAALIAAgCjYCKCAAIAM2AiQgACACNgIgQQAhAiAIQf////8DSyAIQQJ0IgFB/P///wdLcg0IAn8gAUUEQEEEIQNBAAwBC0HRzsUALQAAGkEEIQIgAUEEENYEIgNFDQkgCAshAiABBEAgAyAHIAH8CgAACyAAIAg2AjggACADNgI0IAAgAjYCMCAAIAQ6ADwgACAFOgAsIAAgEToAHCAAIBI6AAwgDwRAIA4gD0ECdBDfBAsgDQRAIAcgDUECdBDfBAsgEwRAIAwgE0ECdBDfBAsgFgRAIBAgFkECdBDfBAsgBigCkAIiAARAIAYoApQCIABBAnQQ3wQLIAYoAqACIgAEQCAGKAKkAiAAQQJ0EN8ECyAnBEAgKyAnQQJ0EN8ECyAoBEAgLCAoQQJ0EN8ECyAGKAKAAiIABEAgBigChAIgAEECdBDfBAsgBigC4AEiAARAIAYoAuQBIABBAnQQ3wQLIAYoAvABIgBFDQAgBigC9AEgAEECdBDfBAsgBhCmAwsgBkHwAmokAA8LIAggAUH4gcAAEMgEAAsgCyABQfiBwAAQyAQACyALIAFB+IHAABDIBAALIAEgAkH4gcAAEMgEAAsgAyAJQfiBwAAQyAQACyABIAJB+IHAABDIBAALIAIgAUH4gcAAEMgEAAuUJAIOfwN+IwBBkARrIgUkAAJAAkACQAJAIAMoAggiBkUEQEHRzsUALQAAGgwBCyAGrUIFhiADKAIEIAZBAnRqQQRrKAIAZ619QoAQVg0AQdHOxQAtAAAaAkACQCADKAIIDgICAAELIAMoAgQoAgBBAkkNAQsCQAJAAkAgASgCCCIGIAMoAggiB0YEQCAGQQJ0IQYgASgCBEEEayEKIAMoAgRBBGshCANAIAZFDQIgBiAIaiEMIAYgCmogBkEEayEGKAIAIgkgDCgCACIMRg0ACyAJIAxJDQMMAgsgBiAHTw0BDAILIAYNAQtB0c7FAC0AABpBI0EBENYEIgQEQCAAQSM2AgwgACAENgIIIABCgYCAgLAENwIAIARBH2pBwLPEACgAADYAACAEQRhqQbmzxAApAAA3AAAgBEEQakGxs8QAKQAANwAAIARBCGpBqbPEACkAADcAACAEQaGzxAApAAA3AAAMAwtBAUEjQayqxAAQyAQACwJAAkACQCAHIAIoAggiBkYEQCAHQQJ0IQYgAigCBEEEayEHIAMoAgRBBGshCgNAIAZFDQIgBiAKaiEIIAYgB2ogBkEEayEGKAIAIgwgCCgCACIIRg0ACyAIIAxNDQMMAgsgBiAHSQ0BDAILIAZFDQELQQAhBiAFQfgAakGMocQAKAIANgIAIAVBhKHEACkCADcDcCAFQfAAaiIHQeiixAAQpQMgBSgCdEGBgAQ2AgAgBUEIakEBNgIAIAUgBSkDcDcDACAHIAEgBSADEOMEIAUoAnQhByAFKAJ4IgogAigCCEYEQCAHIAIoAgQgCkECdBDxA0UhBgsgBSgCcCIKBEAgByAKQQJ0EN8ECyAGRQRAQdHOxQAtAAAaQTtBARDWBCIEBEAgAEE7NgIMIAAgBDYCCCAAQTs2AgQgBEE3akHzssQAKAAANgAAIARBMGpB7LLEACkAADcAACAEQShqQeSyxAApAAA3AAAgBEEgakHcssQAKQAANwAAIARBGGpB1LLEACkAADcAACAEQRBqQcyyxAApAAA3AAAgBEEIakHEssQAKQAANwAAIARBvLLEACkAADcAACAAQQE2AgAgBSgCACIARQ0EIAUoAgQgAEECdBDfBAwEC0EBQTtBrKrEABDIBAALIAEoAggiBkECdCEHQQAhCAJAAkACQAJAAkACQCAGQf////8DSyAHQfz///8HS3INACABKAIEIQkCfyAHRQRAQQQhCkEADAELQdHOxQAtAAAaQQQhCCAHQQQQ1gQiCkUNASAGCyEMIAcEQCAKIAkgB/wKAAALQdHOxQAtAAAaQZgDQQQQ1gQiB0UNASAFQQA2AhggBSAHNgIUIAVBETYCEEEQIQsDQAJAAkACQAJAIAYOAgABAgsgBUGIBGpBjKHEACgCADYCACAFQYShxAApAgA3A4AEDAILIAooAgAhB0HRzsUALQAAGkEEQQQQ1gQiBkUNBSAFQfgAaiIIQQE2AgAgBiAKKAIANgIAIAUgBjYCdCAFQQE2AnAgBUHwAGogBxCzAiAFQYgEaiAIKAIANgIAIAUgBSkCcDcDgAQMAQsgBUGABGogCiAGIAogBhDtAgsgBUHwAGogBUGABGogAxChASAFQTBqIg4gBUH4AGooAgA2AgAgBSAFKQJwNwMoIAUoAnwiBgRAIAUoAoABIAZBAnQQ3wQLIAVBHGogBUGABGogAxCKAiAFKAIkIgdBAnQhBkEAIQggB0H/////A0sgBkH8////B0tyDQQgBSgCICENAn8gBkUEQEEEIQlBAAwBC0HRzsUALQAAGkEEIQggBkEEENYEIglFDQUgBwshDyAGBEAgCSANIAb8CgAACyAFKAIYIgggBSgCEEYEQCAFQRBqQayyxAAQmQMLIAUoAhQgCEEYbGoiBiAFKQMoNwIAIAYgBzYCFCAGIAk2AhAgBiAPNgIMIAZBCGogDigCADYCACAFIAhBAWo2AhggDARAIAogDEECdBDfBAsgBSgCJCEGIAUoAiAhCiAFKAIcIQwgBSgCgAQiBwRAIAUoAoQEIAdBAnQQ3wQLIAtBAWsiCw0ACwJAAkAgBgRAIAEoAggiBw0BCyAFQUBrQYyhxAAoAgA2AgAgBUGEocQAKQIANwM4DAELIAEoAgQhCCAHQQFGBEAgCCgCACEGIAVB8ABqIgcgBUEcahC+AyAHIAYQswIgBUFAayAFQfgAaigCADYCACAFIAUpAnA3AzgMAQsgBkEBRgRAIAooAgAhBiAFQfAAaiIHIAEQvgMgByAGELMCIAVBQGsgBUH4AGooAgA2AgAgBSAFKQJwNwM4DAELIAVBOGogCiAGIAggBxDtAgsgBUHwAGogBUE4aiADEKEBIAVB0ABqIAVB+ABqKAIANgIAIAUgBSkCcDcDSCAFKAJ8IgYEQCAFKAKAASAGQQJ0EN8ECyAFQdQAaiAFQThqIAMQigIgBSgCGCIGIAUoAhBGBEAgBUEQakGMssQAEJkDCyAFKAIUIAZBGGxqIgcgBSkDSDcCACAHQQhqIAVB0ABqKQMANwIAIAdBEGogBUHYAGopAwA3AgAgBSAGQQFqNgIYIAVBADYCbCAFQoCAgIDAADcCZCAEDQQMBQsgCCAHQfiBwAAQyAQAC0EEQZgDQfyxxAAQyAQAC0EEQQRB+IHAABDIBAALIAggBkH4gcAAEMgEAAsgBUGABGohCEEAIQYjAEGgA2siBCQAIAQgAxCOAkHRzsUALQAAGgJAQaACQQQQ1gQiCwRAQeD2wAAoAgAhDSAEQZgDaiEOQdj2wAApAgAhFQNAIAQgBkEEdGoiBykDCCETIAcpAwAhFCAOIA02AgAgBCAVNwOQAyATIBSEUEUEQEEBIQdBACEJA0AgBCgCkAMgB0EBa0YEQCAEQZADakHc98AAEKUDCyAEKAKUAyAJaiAUPgIAIBRC/////w9WIBNCAFIgE1AgE0IghiAUQiCIhCEUIAlBBGohCSATQiCIIRMgBCAHNgKYAyAHQQFqIQcbDQALCyAEQYgDaiAOKAIAIgc2AgAgBCAEKQOQAyITNwOAAyALIAZBDGxqIglBCGogBzYCACAJIBM3AgAgBkEBaiIGQRhHDQALIAhBGDYCCCAIIAs2AgQgCEEYNgIAIARBoANqJAAMAQtBBEGgAkHsscQAEMgEAAsgBSAFKAKABDYCeCAFIAUoAoQEIgQ2AnAgBSAENgJ0IAUgBCAFKAKIBEEMbGo2AnwgBUHkAGogBUHwAGoQxwMLIAVB8ABqIAEQjgJB0c7FAC0AABoCQEGgAkEEENYEIggEQEEAIQRB4PbAACgCACELIAVBiARqIQlB2PbAACkCACEVA0AgBUHwAGogBEEEdGoiBikDCCETIAYpAwAhFCAJIAs2AgAgBSAVNwOABCATIBSEUEUEQEEBIQZBACEHA0AgBSgCgAQgBkEBa0YEQCAFQYAEakHc98AAEKUDCyAFKAKEBCAHaiAUPgIAIBRC/////w9WIBNCAFIgE1AgE0IghiAUQiCIhCEUIAdBBGohByATQiCIIRMgBSAGNgKIBCAGQQFqIQYbDQALCyAFQfgDaiAJKAIAIgY2AgAgBSAFKQOABCITNwPwAyAIIARBDGxqIgdBCGogBjYCACAHIBM3AgAgBEEBaiIEQRhHDQALIAUoAmQgBSgCbCIGa0EXTQRAIAVB5ABqIAZBGEEEQQwQiAMgBSgCbCEGCyAFKAJoIAZBDGxqIAhBoAL8CgAAIAUgBkEYajYCbCAIQaACEN8EIAVB8ABqIAIQjgJBACEEQdHOxQAtAAAaQaACQQQQ1gQiCEUNBkHg9sAAKAIAIQsgBUGIBGohCUHY9sAAKQIAIRUDQCAFQfAAaiAEQQR0aiIGKQMIIRMgBikDACEUIAkgCzYCACAFIBU3A4AEIBMgFIRQRQRAQQEhBkEAIQcDQCAFKAKABCAGQQFrRgRAIAVBgARqQdz3wAAQpQMLIAUoAoQEIAdqIBQ+AgAgFEL/////D1YgE0IAUiATUCATQiCGIBRCIIiEIRQgB0EEaiEHIBNCIIghEyAFIAY2AogEIAZBAWohBhsNAAsLIAVB+ANqIAkoAgAiBjYCACAFIAUpA4AEIhM3A/ADIAggBEEMbGoiB0EIaiAGNgIAIAcgEzcCACAEQQFqIgRBGEcNAAsgBSgCZCAFKAJsIgZrQRdNBEAgBUHkAGogBkEYQQRBDBCIAyAFKAJsIQYLIAUoAmggBkEMbGogCEGgAvwKAAAgBSAGQRhqNgJsIAhBoAIQ3wQgBSgCGCIEBEAgBSgCFCIIIARBGGxqIQ4gBUGIBGohCQNAIAVB8ABqIAgQjgJB0c7FAC0AABpBoAJBBBDWBCILRQ0IIAhBDGohDSAIQRhqIQhBACEEA0AgBUHwAGogBEEEdGoiBikDCCETIAYpAwAhFCAJQeD2wAAoAgAiDzYCACAFQdj2wAApAgAiFTcDgAQgEyAUhFBFBEBBASEGQQAhBwNAIAUoAoAEIAZBAWtGBEAgBUGABGpB3PfAABClAwsgBSgChAQgB2ogFD4CACAUQv////8PViATQgBSIBNQIBNCIIYgFEIgiIQhFCAHQQRqIQcgE0IgiCETIAUgBjYCiAQgBkEBaiEGGw0ACwsgBUH4A2oiECAJKAIAIgY2AgAgBSAFKQOABCITNwPwAyALIARBDGxqIgdBCGogBjYCACAHIBM3AgAgBEEBaiIEQRhHDQALIAUoAmQgBSgCbCIGa0EXTQRAIAVB5ABqIAZBGEEEQQwQiAMgBSgCbCEGCyAFKAJoIAZBDGxqIAtBoAL8CgAAIAUgBkEYajYCbCALQaACEN8EIAVB8ABqIA0QjgJB0c7FAC0AABpBoAJBBBDWBCILRQ0DQQAhBANAIAVB8ABqIARBBHRqIgYpAwghEyAGKQMAIRQgCSAPNgIAIAUgFTcDgAQgEyAUhFBFBEBBASEGQQAhBwNAIAUoAoAEIAZBAWtGBEAgBUGABGpB3PfAABClAwsgBSgChAQgB2ogFD4CACAUQv////8PViATQgBSIBNQIBNCIIYgFEIgiIQhFCAHQQRqIQcgE0IgiCETIAUgBjYCiAQgBkEBaiEGGw0ACwsgECAJKAIAIgY2AgAgBSAFKQOABCITNwPwAyALIARBDGxqIgdBCGogBjYCACAHIBM3AgAgBEEBaiIEQRhHDQALIAUoAmQgBSgCbCIGa0EXTQRAIAVB5ABqIAZBGEEEQQwQiAMgBSgCbCEGCyAFKAJoIAZBDGxqIAtBoAL8CgAAIAUgBkEYajYCbCALQaACEN8EIAggDkcNAAsLIAAgBSkCZDcCBCAAQQA2AgAgAEEMaiAFQewAaigCADYCACAFKAI4IgAEQCAFKAI8IABBAnQQ3wQLIAUoAhgiBwRAIAUoAhQhBgNAIAYoAgAiAARAIAZBBGooAgAgAEECdBDfBAsgBkEMaigCACIABEAgBkEQaigCACAAQQJ0EN8ECyAGQRhqIQYgB0EBayIHDQALCyAFKAIQIgAEQCAFKAIUIABBGGwQ3wQLIAwEQCAKIAxBAnQQ3wQLIAUoAgAiAEUNBCAFKAIEIABBAnQQ3wQMBAsMBQsMBAtB0c7FAC0AABpBKkEBENYEIgQEQCAAQSo2AgwgACAENgIIIABCgYCAgKAFNwIAIARBKGpBn7PEAC8AADsAACAEQSBqQZezxAApAAA3AAAgBEEYakGPs8QAKQAANwAAIARBEGpBh7PEACkAADcAACAEQQhqQf+yxAApAAA3AAAgBEH3ssQAKQAANwAADAILQQFBKkGsqsQAEMgEAAtB0c7FAC0AABpBN0EBENYEIgRFDQEgAEE3NgIMIAAgBDYCCCAAQoGAgIDwBjcCACAEQS9qQfOzxAApAAA3AAAgBEEoakHss8QAKQAANwAAIARBIGpB5LPEACkAADcAACAEQRhqQdyzxAApAAA3AAAgBEEQakHUs8QAKQAANwAAIARBCGpBzLPEACkAADcAACAEQcSzxAApAAA3AAALIAMoAgAiAARAIAMoAgQgAEECdBDfBAsgAigCACIABEAgAigCBCAAQQJ0EN8ECyABKAIAIgAEQCABKAIEIABBAnQQ3wQLIAVBkARqJAAPC0EBQTdBrKrEABDIBAALQQRBoAJB7LHEABDIBAAL0R4BDn8jAEHwHmsiAyQAIANBgBhqIgRBAEHgAPwLAAJAAkACQAJAAkACQAJAIAJBwAFqIgUgBEEwEPEDRQRAIAJB8AFqIANBsBhqQTAQ8QNFDQELIANBgBhqIgZBAEHgAPwLACABQcABaiIEIAZBMBDxA0UEQCABQfABaiADQbAYakEwEPEDRQ0CCyADIAJB4ABqIAQQPyADQeAAaiABQeAAaiIGIAUQPyADQcABaiIHIAIgBBA/IANBoAJqIgIgASAFED8gByACQTAQ8QNFBEAgA0HwAWogA0HQAmpBMBDxA0UNAwtBACIBRQRAIANBgBhqIANB4AD8CgAACyADQeAPaiADQYAYaiICIANB4ABqEI0BIAFFBEAgAiADQcABakHgAPwKAAALIANBwBBqIgIgA0GAGGoiBiADQaACaiIJEI0BIANBoBFqIgggBCAFED8gA0GAEmoiCiADQeAPaiIEIAQQPyADQeASaiIFIAIgAhA/IANBwBNqIgsgAiAFED8gA0GgFGoiByAFIAkQPyAGIAogCBA/IANBqBpqIgUgBiALEI0BIAYgByAHENUBIANBgBVqIgcgBSAGEI0BIAUgAiAHED8gAUUEQCADQcAWaiAEQeAA/AoAAAsgAUUEQCADQYAYaiADQYAVakHgAPwKAAALIANBoBdqIgIgA0GgFGogA0GAGGoiBBCNASADQeAVaiADQcAWaiACED8gAUUEQCAEIANB4ABqQeAA/AoAAAsgA0GgF2oiAiADQcATaiADQYAYaiIEED8gA0GIG2ogA0HgFWogAhCNASABRQRAIAQgA0GgEWpB4AD8CgAACyADQegbaiADQcATaiADQYAYaiIBED8gASADQagaahCvAiADKAKAGEUNA0GQjcUAQSsgA0HvHmpBgI3FAEHAksUAEMoDAAsgA0HwHGogAUEoaikDADcDACADQegcaiABQSBqKQMANwMAIANB4BxqIAFBGGopAwA3AwAgA0HYHGogAUEQaikDADcDACADQdAcaiABQQhqKQMANwMAIANBgB1qIAFBOGopAwA3AwAgA0GIHWogAUFAaykDADcDACADQZAdaiABQcgAaikDADcDACADQZgdaiABQdAAaikDADcDACADQaAdaiABQdgAaikDADcDACADIAEpAwA3A8gcIAMgASkDMDcD+BxBACICRQRAIANBgANqIANByBxqQeAA/AoAAAsgA0GoGGoiBCABQYgBaikDADcDACADQaAYaiIGIAFBgAFqKQMANwMAIANBmBhqIgUgAUH4AGopAwA3AwAgA0GQGGoiByABQfAAaikDADcDACADQYgYaiIJIAFB6ABqKQMANwMAIANBuBhqIgggAUGYAWopAwA3AwAgA0HAGGoiCiABQaABaikDADcDACADQcgYaiILIAFBqAFqKQMANwMAIANB0BhqIgwgAUGwAWopAwA3AwAgA0HYGGoiDSABQbgBaikDADcDACADIAEpA2A3A4AYIAMgASkDkAE3A7AYIAJFBEAgA0HIHGogA0GAGGpB4AD8CgAACyACRQRAIANB4ANqIANByBxqQeAA/AoAAAsgBCABQegBaikDADcDACAGIAFB4AFqKQMANwMAIAUgAUHYAWopAwA3AwAgByABQdABaikDADcDACAJIAFByAFqKQMANwMAIAggAUH4AWopAwA3AwAgCiABQYACaikDADcDACALIAFBiAJqKQMANwMAIAwgAUGQAmopAwA3AwAgDSABQZgCaikDADcDACADIAEpA8ABNwOAGCADIAEpA/ABNwOwGCACRQRAIANByBxqIANBgBhqQeAA/AoAAAsgAkUEQCADQcAEaiADQcgcakHgAPwKAAALIAAgA0GAA2pBoAL8CgAADAQLIANB0B1qIAJBKGopAwA3AwAgA0HIHWogAkEgaikDADcDACADQcAdaiACQRhqKQMANwMAIANBuB1qIAJBEGopAwA3AwAgA0GwHWogAkEIaikDADcDACADQeAdaiACQThqKQMANwMAIANB6B1qIAJBQGspAwA3AwAgA0HwHWogAkHIAGopAwA3AwAgA0H4HWogAkHQAGopAwA3AwAgA0GAHmogAkHYAGopAwA3AwAgAyACKQMANwOoHSADIAIpAzA3A9gdQQAiAUUEQCADQaAFaiADQagdakHgAPwKAAALIANBqBhqIgQgAkGIAWopAwA3AwAgA0GgGGoiBiACQYABaikDADcDACADQZgYaiIHIAJB+ABqKQMANwMAIANBkBhqIgkgAkHwAGopAwA3AwAgA0GIGGoiCCACQegAaikDADcDACADQbgYaiIKIAJBmAFqKQMANwMAIANBwBhqIgsgAkGgAWopAwA3AwAgA0HIGGoiDCACQagBaikDADcDACADQdAYaiINIAJBsAFqKQMANwMAIANB2BhqIg4gAkG4AWopAwA3AwAgAyACKQNgNwOAGCADIAIpA5ABNwOwGCABRQRAIANBqB1qIANBgBhqQeAA/AoAAAsgAUUEQCADQYAGaiADQagdakHgAPwKAAALIAQgBUEoaikDADcDACAGIAVBIGopAwA3AwAgByAFQRhqKQMANwMAIAkgBUEQaikDADcDACAIIAVBCGopAwA3AwAgCiACQfgBaikDADcDACALIAJBgAJqKQMANwMAIAwgAkGIAmopAwA3AwAgDSACQZACaikDADcDACAOIAJBmAJqKQMANwMAIAMgBSkDADcDgBggAyACKQPwATcDsBggAUUEQCADQagdaiADQYAYakHgAPwKAAALIAFFBEAgA0HgBmogA0GoHWpB4AD8CgAACyAAIANBoAVqQaAC/AoAAAwDCwJAIAMgA0HgAGpBMBDxAw0AIANBMGogA0GQAWpBMBDxAw0AIANBgBhqIgJBAEHgAPwLACAGIAJBMBDxAw0CIAFBkAFqIANBsBhqQTAQ8QMNAgtBACIBRQRAIANBqBpqQQBB4AD8CwALIANB2BdqQgA3AwAgA0HgF2pCADcDACADQegXakIANwMAIANB8BdqQgA3AwAgA0H4F2pCADcDACADQcgXakGgkcUAKQMANwMAIANBwBdqQZiRxQApAwA3AwAgA0G4F2pBkJHFACkDADcDACADQbAXakGIkcUAKQMANwMAIANBqBdqQYCRxQApAwA3AwAgA0IANwPQFyADQfiQxQApAwA3A6AXIAFFBEAgA0HoG2pBAEHgAPwLAAsgAUUEQCADQYgbaiADQaAXakHgAPwKAAALIANBgBhqIANBqBpqEK8CIAMoAoAYQQFGDQMgACADQYgYakGgAvwKAAAMAgsgACADQYgYakGgAvwKAAAMAQsgA0GAGGoiAkEAQeAA/AsAAkACQCAEIAJBMBDxA0UEQCABQfABaiICIANBsBhqQTAQ8QNFDQELIANBwAdqIgIgASABED8gA0GAGGoiBSACIAIQ1QEgA0GgCGogBSACENUBQQAiAkUEQCAFQQBB4AD8CwALIANBqBpqIgkgA0GAGGoiBSAEED8gBSAJIAQQPyADQYAJaiIHIAUgA0GgCGoQ1QEgA0HgCWoiCyAHIAcQPyADQcAKaiIHIAYgBBA/IANBoAtqIgQgByAHED8gA0GADGoiCCAHIAQQPyADQeAMaiIKIAggCBDVASADQcANaiIIIAogChDVASADQaAOaiAIIAgQ1QEgBSABIAYQPyADQYAPaiIBIAUgBxA/IANB4A9qIgggASABENUBIANBwBBqIgEgCCAIENUBIANBoBFqIgggASABENUBIANBgBJqIgEgCyAIEI0BIANB4BJqIAEgBxA/IAkgBiAGED8gAkUEQCAFIARB4AD8CgAACyADQcATaiIBIANBqBpqIgUgA0GAGGoQPyADQaAUaiIEIAEgARDVASADQYAVaiIBIAQgBBDVASADQeAVaiABIAEQ1QEgBSADQeASaiIBIAEQ1QEgAkUEQCADQcAWaiADQYAJakHgAPwKAAALIAJFBEAgA0GAGGogA0HAEGpB4AD8CgAACyADQaAXaiIEIANBgBhqIgEgA0GAEmoQjQEgASADQcAWaiAEED8gA0GIG2ogASADQeAVahCNASACRQRAIANB6BtqIANBoA5qQeAA/AoAAAsgA0GAGGogA0GoGmoQrwIgAygCgBhFDQFBkI3FAEErIANB7x5qQYCNxQBBoJLFABDKAwALIANBsB5qIAFBKGopAwA3AwAgA0GoHmogAUEgaikDADcDACADQaAeaiABQRhqKQMANwMAIANBmB5qIAFBEGopAwA3AwAgA0GQHmogAUEIaikDADcDACADQcAeaiABQThqKQMANwMAIANByB5qIAFBQGspAwA3AwAgA0HQHmogAUHIAGopAwA3AwAgA0HYHmogAUHQAGopAwA3AwAgA0HgHmogAUHYAGopAwA3AwAgAyABKQMANwOIHiADIAEpAzA3A7geQQAiBUUEQCADQYAYaiADQYgeakHgAPwKAAALIANB0BpqIgcgBkEoaikDADcDACADQcgaaiIJIAZBIGopAwA3AwAgA0HAGmoiCCAGQRhqKQMANwMAIANBuBpqIgogBkEQaikDADcDACADQbAaaiILIAZBCGopAwA3AwAgA0HgGmoiDCABQZgBaikDADcDACADQegaaiINIAFBoAFqKQMANwMAIANB8BpqIg4gAUGoAWopAwA3AwAgA0H4GmoiDyABQbABaikDADcDACADQYAbaiIQIAFBuAFqKQMANwMAIAMgBikDADcDqBogAyABKQOQATcD2BogBUUEQCADQYgeaiADQagaakHgAPwKAAALIAVFBEAgA0HgGGogA0GIHmpB4AD8CgAACyAHIARBKGopAwA3AwAgCSAEQSBqKQMANwMAIAggBEEYaikDADcDACAKIARBEGopAwA3AwAgCyAEQQhqKQMANwMAIAwgAkEIaikDADcDACANIAJBEGopAwA3AwAgDiACQRhqKQMANwMAIA8gAkEgaikDADcDACAQIAJBKGopAwA3AwAgAyAEKQMANwOoGiADIAIpAwA3A9gaIAVFBEAgA0GIHmogA0GoGmpB4AD8CgAACyAFRQRAIANBwBlqIANBiB5qQeAA/AoAAAsgACADQYAYakGgAvwKAAAMAQsgACADQYgYakGgAvwKAAALIANB8B5qJAAPC0GQjcUAQSsgA0HvHmpBgI3FAEGwksUAEMoDAAvqIQIPfxx+IwBBsAJrIgMkACADQQA2AgggA0KAgICAgAE3AgAgA0EANgIUIANCgICAgIABNwIMAkACQAJAIAJFDQAgAUEwaiIEQdizwgBBMBDxA0UNAiABIAJB6ABsaiEIIANBQGshBSADQZACaiEJIANByABqIQZBkLPCACkDACEiQYizwgApAwAhI0GAs8IAKQMAISRB+LLCACkDACElQfCywgApAwAhJkHossIAKQMAISdBsLTCACkDACEoQai0wgApAwAhKUGgtMIAKQMAISpBmLTCACkDACErQZC0wgApAwAhLEGItMIAKQMAIS0DQCADQZABakIANwMAIANBiAFqQgA3AwAgA0GAAWpCADcDACADQfgAakIANwMAIANCADcDcCADQgE3A5gBIANByAFqIARBKGopAwA3AwAgA0HAAWogBEEgaikDADcDACADQbgBaiAEQRhqKQMANwMAIANBsAFqIARBEGopAwA3AwAgA0GoAWogBEEIaikDADcDACADIAQpAwA3A6ABIANB+AFqICI3AwAgA0HwAWogIzcDACADQegBaiAkNwMAIANB4AFqICU3AwAgA0HYAWogJjcDACADICc3A9ABIANBqAJqIgogKDcDACADQaACaiILICk3AwAgA0GYAmoiDCAqNwMAIANBkAJqIg0gKzcDACADQYgCaiIOICw3AwAgAyAtNwOAAiADQeAAakIANwMAIANB2ABqQgA3AwAgA0HQAGpCADcDACADQcgAakIANwMAIAVCADcDACADQgA3AzggA0EwaiIPAn8CQCADQaABaiADQfAAakEwEPEDRQRAQq2q5qjb0M+8mn8hEkKqx6uW2fyjzBEhHwwBCyADQdABaiADQfAAakEwEPEDRQRAQgAhH0IAIRIgBgwCC0Kr1f7///+//7l/IRcDQCADLQDIAUEBcUUEQANAIANBoAFqEL8CIAMpA6gCIhJCAYNQRQRAIAMpA6ACIRMgAyASQtWqgYCAgMCAxgB9IhQ3A6gCIAMgE0L//8+K6///1R58IhUgEiAUVq18IhQ3A6ACIAMgAykDmAIiFkKk7MO1j9S0mOcAfCISIBQgFVQgEyAVVnKtfCIVNwOYAiADIAMpA5ACIhRCv6WUnM/w0rvkAHwiEyASIBZUIBIgFVZyrXwiFTcD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AwA3AwAgA0GIGGoiCSABQegAaikDADcDACADQbgYaiIIIAFBmAFqKQMANwMAIANBwBhqIgogAUGgAWopAwA3AwAgA0HIGGoiCyABQagBaikDADcDACADQdAYaiIMIAFBsAFqKQMANwMAIANB2BhqIg0gAUG4AWopAwA3AwAgAyABKQNgNwOAGCADIAEpA5ABNwOwGCACRQRAIANByBxqIANBgBhqQeAA/AoAAAsgAkUEQCADQeADaiADQcgcakHgAPwKAAALIAQgAUHoAWopAwA3AwAgByABQeABaikDADcDACAFIAFB2AFqKQMANwMAIAYgAUHQAWopAwA3AwAgCSABQcgBaikDADcDACAIIAFB+AFqKQMANwMAIAogAUGAAmopAwA3AwAgCyABQYgCaikDADcDACAMIAFBkAJqKQMANwMAIA0gAUGYAmopAwA3AwAgAyABKQPAATcDgBggAyABKQPwATcDsBggAkUEQCADQcgcaiADQYAYakHgAPwKAAALIAJFBEAgA0HABGogA0HIHGpB4AD8CgAACyAAIANBgANqQaAC/AoAAAwDCyADQdAdaiACQShqKQMANwMAIANByB1qIAJBIGopAwA3AwAgA0HAHWogAkEYaikDADcDACADQbgdaiACQRBqKQMANwMAIANBsB1qIAJBCGopAwA3AwAgA0HgHWogAkE4aikDADcDACADQegdaiACQUBrKQMANwMAIANB8B1qIAJByABqKQMANwMAIANB+B1qIAJB0ABqKQMANwMAIANBgB5qIAJB2ABqKQMANwMAIAMgAikDADcDqB0gAyACKQMwNwPYHUEAIgFFBEAgA0GgBWogA0GoHWpB4AD8CgAACyADQagYaiIEIAJBiAFqKQMANwMAIANBoBhqIgcgAkGAAWopAwA3AwAgA0GYGGoiBiACQfgAaikDADcDACADQZAYaiIJIAJB8ABqKQMANwMAIANBiBhqIgggAkHoAGopAwA3AwAgA0G4GGoiCiACQZgBaikDADcDACADQcAYaiILIAJBoAFqKQMANwMAIANByBhqIgwgAkGoAWopAwA3AwAgA0HQGGoiDSACQbABaikDADcDACADQdgYaiIOIAJBuAFqKQMANwMAIAMgAikDYDcDgBggAyACKQOQATcDsBggAUUEQCADQagdaiADQYAYakHgAPwKAAALIAFFBEAgA0GABmogA0GoHWpB4AD8CgAACyAEIAVBKGopAwA3AwAgByAFQSBqKQMANwMAIAYgBUEYaikDADcDACAJIAVBEGopAwA3AwAgCCAFQQhqKQMANwMAIAogAkH4AWopAwA3AwAgCyACQYACaikDADcDACAMIAJBiAJqKQMANwMAIA0gAkGQAmopAwA3AwAgDiACQZgCaikDADcDACADIAUpAwA3A4AYIAMgAikD8AE3A7AYIAFFBEAgA0GoHWogA0GAGGpB4AD8CgAACyABRQRAIANB4AZqIANBqB1qQeAA/AoAAAsgACADQaAFakGgAvwKAAAMAgsgACADQYgYakGgAvwKAAAMAQsCQCADIANB4ABqEKYEBEAgA0GAGGoiAkEAQeAA/AsAIAcgAhCmBEUNAQtBACIBRQRAIANBqBpqQQBB4AD8CwALIANB2BdqQgA3AwAgA0HgF2pCADcDACADQegXakIANwMAIANB8BdqQgA3AwAgA0H4F2pCADcDACADQcgXakHgtMIAKQMANwMAIANBwBdqQdi0wgApAwA3AwAgA0G4F2pB0LTCACkDADcDACADQbAXakHItMIAKQMANwMAIANBqBdqQcC0wgApAwA3AwAgA0IANwPQFyADQbi0wgApAwA3A6AXIAFFBEAgA0HoG2pBAEHgAPwLAAsgAUUEQCADQYgbaiADQaAXakHgAPwKAAALIANBgBhqIANBqBpqEJkCIAMoAoAYQQFGDQIgACADQYgYakGgAvwKAAAMAQsgA0GAGGoiBUEAQeAA/AsAAkAgBCAFEKYERQRAIANBwAdqIgIgASABED8gBSACIAIQ1QEgA0GgCGogBSACENUBQQAiAkUEQCAFQQBB4AD8CwALIANBqBpqIgkgA0GAGGoiBSAEED8gBSAJIAQQPyADQYAJaiIGIAUgA0GgCGoQ1QEgA0HgCWoiCyAGIAYQPyADQcAKaiIGIAcgBBA/IANBoAtqIgQgBiAGED8gA0GADGoiCCAGIAQQPyADQeAMaiIKIAggCBDVASADQcANaiIIIAogChDVASADQaAOaiAIIAgQ1QEgBSABIAcQPyADQYAPaiIBIAUgBhA/IANB4A9qIgggASABENUBIANBwBBqIgEgCCAIENUBIANBoBFqIgggASABENUBIANBgBJqIgEgCyAIEI0BIANB4BJqIAEgBhA/IAkgByAHED8gAkUEQCAFIARB4AD8CgAACyADQcATaiIBIANBqBpqIgcgA0GAGGoQPyADQaAUaiIEIAEgARDVASADQYAVaiIBIAQgBBDVASADQeAVaiABIAEQ1QEgByADQeASaiIBIAEQ1QEgAkUEQCADQcAWaiADQYAJakHgAPwKAAALIAJFBEAgA0GAGGogA0HAEGpB4AD8CgAACyADQaAXaiIEIANBgBhqIgEgA0GAEmoQjQEgASADQcAWaiAEED8gA0GIG2ogASADQeAVahCNASACRQRAIANB6BtqIANBoA5qQeAA/AoAAAsgA0GAGGogA0GoGmoQmQIgAygCgBhFDQFBoLHCAEErIANB7x5qQZCxwgBBiLXCABDKAwALIANBsB5qIAFBKGopAwA3AwAgA0GoHmogAUEgaikDADcDACADQaAeaiABQRhqKQMANwMAIANBmB5qIAFBEGopAwA3AwAgA0GQHmogAUEIaikDADcDACADQcAeaiABQThqKQMANwMAIANByB5qIAFBQGspAwA3AwAgA0HQHmogAUHIAGopAwA3AwAgA0HYHmogAUHQAGopAwA3AwAgA0HgHmogAUHYAGopAwA3AwAgAyABKQMANwOIHiADIAEpAzA3A7geQQAiAkUEQCADQYAYaiADQYgeakHgAPwKAAALIANB0BpqIgUgB0EoaikDADcDACADQcgaaiIGIAdBIGopAwA3AwAgA0HAGmoiCSAHQRhqKQMANwMAIANBuBpqIgggB0EQaikDADcDACADQbAaaiIKIAdBCGopAwA3AwAgA0HgGmoiCyABQZgBaikDADcDACADQegaaiIMIAFBoAFqKQMANwMAIANB8BpqIg0gAUGoAWopAwA3AwAgA0H4GmoiDiABQbABaikDADcDACADQYAbaiIPIAFBuAFqKQMANwMAIAMgBykDADcDqBogAyABKQOQATcD2BogAkUEQCADQYgeaiADQagaakHgAPwKAAALIAJFBEAgA0HgGGogA0GIHmpB4AD8CgAACyAFIARBKGopAwA3AwAgBiAEQSBqKQMANwMAIAkgBEEYaikDADcDACAIIARBEGopAwA3AwAgCiAEQQhqKQMANwMAIAsgAUH4AWopAwA3AwAgDCABQYACaikDADcDACANIAFBiAJqKQMANwMAIA4gAUGQAmop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QCAAIBQ3AzggACANNwMwIAAgDzcDKCAAIBY3AyAgAEHIAGpCADcDACAAQdAAakIANwMAIABB2ABqQgA3AwAgAEHgAGpCADcDACAAQegAakIANwMAIABB8ABqQgA3AwAgAEH4AGpCADcDACAAQgA3A+ADIABCADcDmAMgACAKNwO4ASAAIAg3A7ABIAAgBjcDqAEgACAONwOgASAAIBM3A5gBIAAgCTcDkAEgACALNwOIASAAIBA3A4ABIABBATYCqAQgAEIANwOAAiAAQgA3A4gCIABCADcDwAEgAEHIAWpCADcDACAAQdABakIANwMAIABC85aAgDA3A9gBIAAgBzcD8AEgACAMNwP4ASAAQgE3A6gCIABBtARqIAUoAgA2AgAgACABKQPABDcCrAQgAEGAscIAKQMANwPgASAAQegBakGIscIAKQMANwMAIABBAkEBIAQbOgCcAiAAQgA3A6ACIAAgAzoAlAIgAEIANwOwAiAAIAQ2ApgCIAAgAjYCkAIgAUHwBGokAA8LIAEgAS0A1AQ6AMAEQYz3wQBBKyABQcAEakHk+8EAQaj8wQAQygMACxDwAwALIAEgAzoA0ARBjPfBAEErIAFB0ARqQeT7wQBBmPzBABDKAwAL5SECE38BfiMAQZABayIDJAAgAyACNgIAIANBBjYCBBDjASEEAkACQCACQfylwABBBhDxAwRAQQEhAiADQQE2AmggA0HErMAANgJkIANCATcCcCADIAOtQoCAgICgAoQ3AwggAyADQQhqNgJsIABBBGogA0HkAGoQ0gIMAQsCQAJAAkACQAJAAkACQAJAAkACQCAEQYABakEDdiAEQQdxQQBHaiIGQYCAAkkEQEHRzsUALQAAGkErQQEQ1gQiAkUNASACQSdqIgVBl67AACgAADYAACACQSBqIghBkK7AACkAADcAACACQRhqIgdBiK7AACkAADcAACACQRBqIglBgK7AACkAADcAACACQQhqIgpB+K3AACkAADcAACACQfCtwAApAAA3AAAgA0ErNgIcIAMgAjYCGCADQoCAgICwBTcCECADQoCAgIAQNwIIIAMgBjYCICADQQA2AjAgA0KAgICAEDcCKCAGQQR2IAZBD3FBAEdqIg5BgAJPDQJB0c7FAC0AABpBASENQStBARDWBCIERQ0DIAQgAikAADcAACAEQSdqIAUoAAA2AAAgBEEgaiAIKQAANwAAIARBGGogBykAADcAACAEQRBqIAkpAAA3AAAgBEEIaiAKKQAANwAAIANBKzYCbCADIAQ2AmggA0ErNgJkIANB5ABqQfiuwAAQtgMgAygCaCIIQSs6ACsgAygCZCEPIAYEQEHRzsUALQAAGiAGQQEQ1wQiDUUNBQsCfyAGRQRAQQEhBEEAIQJBAAwBCyADQQhqQQAgBkEBQQEQiAMgAygCDCEEIAMoAhAhAiADKAIICyAGRSIQRQRAIAIgBGogDSAG/AoAAAsgAyACIAZqIgI2AhAgAmtBH00EQCADQQhqIAJBIEEBQQEQiAMgAygCDCEEIAMoAhAhAgsgAiAEaiIFIAEpAAA3AAAgBUEYaiABQRhqKQAANwAAIAVBEGogAUEQaikAADcAACAFQQhqIAFBCGopAAA3AAAgAyACQSBqIgI2AhBB0c7FAC0AABpBAkEBENYEIgFFDQUgASAGQQF0IglBCHQgCUGA/gNxQQh2cjsAACADQQI2AjwgAyABNgI4IANBAjYCNCADQTRqIgVBgLDAABC2AyADKAI4QQA6AAJBAyEBIANBAzYCPCADKAI0QS9rQVRPBEAgBUEDQSxBAUEBEIgDIAMoAjwhAQsgAygCOCIHIAFqIgUgCCkAADcAACAFQQhqIAhBCGopAAA3AAAgBUEQaiAIQRBqKQAANwAAIAVBGGogCEEYaikAADcAACAFQSBqIAhBIGopAAA3AAAgBUEoaiAIQShqKAAANgAAIAMgAUEsaiIBNgI8IAMoAgggAmsgAUkEQCADQQhqIAIgAUEBQQEQiAMgAygCDCEEIAMoAhAhAgsgAQRAIAIgBGogByAB/AoAAAsgAyABIAJqIgI2AhAgA0HkAGogBCACEOEBQQAhAUHRzsUALQAAGkEgQQEQ1gQiBUUNDCAFIAMpAGQ3AAAgBUEYaiADQfwAaikAADcAACAFQRBqIANB9ABqKQAANwAAIAVBCGogA0HsAGopAAA3AAAgAkEASA0GIAIEQEHRzsUALQAAGkEBIQEgAkEBENYEIgRFDQcgAyACNgJIIAMgBDYCRCAEIAIQ3wQLIANBADYCSCADQoCAgIAQNwJAIANBQGsiBEEAQSBBAUEBEIgDIAMoAkgiAiADKAJEaiIBIAUpAAA3AAAgAUEYaiAFQRhqKQAANwAAIAFBEGogBUEQaikAADcAACABQQhqIAVBCGopAAA3AAAgAyACQSBqIgE2AkhB0c7FAC0AABpBAUEBENYEIgJFDQcgAkEBOgAAIANBATYCVCADIAI2AlAgA0EBNgJMIANBzABqQQFBLEEBQQEQiAMgAygCUCIHIAMoAlQiCmoiAiAIKQAANwAAIAJBCGogCEEIaikAADcAACACQRBqIAhBEGopAAA3AAAgAkEYaiAIQRhqKQAANwAAIAJBIGogCEEgaikAADcAACACQShqIAhBKGooAAA2AAAgAyAKQSxqIgI2AlQgAygCQCABayACSQRAIAQgASACQQFBARCIAyADKAJIIQELIAMoAkQhBCACBEAgASAEaiAHIAL8CgAACyADIAEgAmoiATYCSCADQeQAaiAEIAEQ4QFB0c7FAC0AABpBIEEBENYEIgJFDQwgAiADKQBkNwAAIAJBGGoiByADQfwAaikAADcAACACQRBqIgogA0H0AGopAAA3AAAgAkEIaiILIANB7ABqKQAANwAAIAMoAiggAygCMCIEa0EfTQRAIANBKGogBEEgQQFBARCIAyADKAIwIQQLIAMoAiwiDCAEaiIBIAIpAAA3AAAgAUEIaiALKQAANwAAIAFBEGogCikAADcAACABQRhqIAcpAAA3AAAgAyAEQSBqIgc2AjAgDkECSQRAIAIhBAwLCyADKAIQIhFBAEgNCEECIQsDQEHRzsUALQAAGkEgQQEQ1gQiAUUNCiABIAItAAAgBS0AAHM6AAAgASACLQABIAUtAAFzOgABIAEgAi0AAiAFLQACczoAAiABIAItAAMgBS0AA3M6AAMgASACLQAEIAUtAARzOgAEIAEgAi0ABSAFLQAFczoABSABIAItAAYgBS0ABnM6AAYgASACLQAHIAUtAAdzOgAHIAEgAi0ACCAFLQAIczoACCABIAItAAkgBS0ACXM6AAkgASACLQAKIAUtAApzOgAKIAEgAi0ACyAFLQALczoACyABIAItAAwgBS0ADHM6AAwgASACLQANIAUtAA1zOgANIAEgAi0ADiAFLQAOczoADiABIAItAA8gBS0AD3M6AA8gASACLQAQIAUtABBzOgAQIAEgAi0AESAFLQARczoAESABIAItABIgBS0AEnM6ABIgASACLQATIAUtABNzOgATIAEgAi0AFCAFLQAUczoAFCABIAItABUgBS0AFXM6ABUgASACLQAWIAUtABZzOgAWIAEgAi0AFyAFLQAXczoAFyABIAItABggBS0AGHM6ABggASACLQAZIAUtABlzOgAZIAEgAi0AGiAFLQAaczoAGiABIAItABsgBS0AG3M6ABsgASACLQAcIAUtABxzOgAcIAEgAi0AHSAFLQAdczoAHSABIAItAB4gBS0AHnM6AB4gASACLQAfIAUtAB9zOgAfIBEEQEHRzsUALQAAGgsgA0EANgJgIANCgICAgBA3AlggA0HYAGpBAEEgQQFBARCIAyADKAJcIgogAygCYCIHaiIEIAEpAAA3AAAgBEEYaiABQRhqKQAANwAAIARBEGogAUEQaikAADcAACAEQQhqIAFBCGopAAA3AAAgAyAHQSBqIgc2AmBB0c7FAC0AABpBAUEBENYEIgRFBEBBAUEBEP8EAAsgBCALOgAAIANBATYCjAEgAyAENgKIASADQQE2AoQBIANBhAFqQQFBLEEBQQEQiAMgAygCiAEiEiADKAKMASIMaiIEIAgpAAA3AAAgBEEIaiAIQQhqKQAANwAAIARBEGogCEEQaikAADcAACAEQRhqIAhBGGopAAA3AAAgBEEgaiAIQSBqKQAANwAAIARBKGogCEEoaigAADYAACADIAxBLGoiBDYCjAEgAygCWCAHayAESQRAIANB2ABqIAcgBEEBQQEQiAMgAygCXCEKIAMoAmAhBwsgBARAIAcgCmogEiAE/AoAAAsgAyAEIAdqIgQ2AmAgA0HkAGogCiAEEOEBQdHOxQAtAAAaQSBBARDWBCIERQ0NIAQgAykAZDcAACAEQRhqIhMgA0H8AGopAAA3AAAgBEEQaiIUIANB9ABqKQAANwAAIARBCGoiFSADQewAaikAADcAACACQSAQ3wQgAygCKCADKAIwIgdrQR9NBEAgA0EoaiAHQSBBAUEBEIgDIAMoAjAhBwsgAygCLCIMIAdqIgIgBCkAADcAACACQQhqIBUpAAA3AAAgAkEQaiAUKQAANwAAIAJBGGogEykAADcAACADIAdBIGoiBzYCMCADKAKEASICBEAgEiACEN8ECyADKAJYIgIEQCAKIAIQ3wQLIAFBIBDfBCAEIQIgDiALQQFqIgtPDQALDAoLIANBADYCdCADQQE2AmggA0HYrcAANgJkIANCBDcCbCADQeQAakHgrcAAEKgEAAtBAUErQYSkwAAQyAQACyADQQA2AnQgA0EBNgJoIANB2K/AADYCZCADQgQ3AmwgA0HkAGpB4K/AABCoBAALQQFBK0H4gcAAEMgEAAtBASAGQfCvwAAQyAQAC0EBQQJBhKTAABDIBAALIAEgAkH4gcAAEMgEAAtBAUEBEP8EAAtB0c7FAC0AABpBACARQfiBwAAQyAQAC0EBQSBBpK3AABDIBAALAkAgByAJTwRAIAZFBEBBASEBDAILQdHOxQAtAAAaIAlBARDWBCIBDQFBASAJQYSkwAAQyAQACyAJIAdBkLDAABDlBAALIAkEQCABIAwgCfwKAAALIARBIBDfBCADKAJMIgIEQCADKAJQIAIQ3wQLIAMoAkAiAgRAIAMoAkQgAhDfBAsgBUEgEN8EIAMoAjQiAgRAIAMoAjggAhDfBAsgBgRAIA0gBhDfBAsgDwRAIAggDxDfBAsgAygCKCICBEAgDCACEN8ECyADQQA2AmwgA0KAgICAwAA3AmQCQAJAIAYEQEHRzsUALQAAGiAGQQEQ1gQiAkUNASAQRQRAIAIgASAG/AoAAAsgA0HkAGpByK7AABCfAyADKAJoIgQgBjYCACAEIAY2AgggBCACNgIEQdHOxQAtAAAaIANBATYCbCAGQQEQ1gQiAkUNASAQRQRAIAIgASAGaiAG/AoAAAsgAygCbCIEIAMoAmRGBEAgA0HkAGpByK7AABCfAwsgAygCaCAEQQxsaiIFIAY2AgggBSACNgIEIAUgBjYCACADKAJoIQYgAygCZCEHIAEgCRDfBCADKAIIIgEEQCADKAIMIAEQ3wQLIAMoAhQiAQRAIAMoAhggARDfBAsgBEEBaiIBrUIwfiIWpyEFQQAhBCAWQiCIpyAFQfj///8HS3INAkEAIQJBCCEIIAUEQEHRzsUALQAAGkEIIQQgBUEIENYEIghFDQMgASEECyADQYwBaiIKQQA2AgAgAyAINgKIASADIAQ2AoQBIAMgBiABQQxsajYCcCADIAc2AmwgAyAGNgJoIAMgBjYCZCADIAg2AhAgA0EANgIMIAMgCjYCCCADQQhqIQgjAEEwayIFJAACQCADQeQAaiIHKAIEIgEgBygCDCIMRgRAIAgoAgQhCQwBCyAIKAIIIAgoAgQiCUEwbGohBgNAIAcgAUEMaiIENgIEIAEoAgAhDSAFIAFBBGooAgAiCyABQQhqKAIAEI4BIA0EQCALIA0Q3wQLIAYgBSkDADcDACAIIAlBAWoiCTYCBCAGQShqIAVBKGopAwA3AwAgBkEgaiAFQSBqKQMANwMAIAZBGGogBUEYaikDADcDACAGQRBqIAVBEGopAwA3AwAgBkEIaiAFQQhqKQMANwMAIAZBMGohBiAEIgEgDEcNAAsLIAgoAgAgCTYCACAHKAIIIgEEQCAHKAIAIAFBDGwQ3wQLIAVBMGokACAAQQRqIgFBCGogCigCADYCACABIAMpAoQBNwIADAMLQZuuwABBG0G4rsAAEP4DAAtBASAGQYSkwAAQyAQACyAEIAVB4IDAABDIBAALIAAgAjYCACADQZABaiQADwtBAUEgQYSkwAAQyAQAC/AiAgd/GX4jAEHgIWsiAiQAIAJByBlqIAFBCGopAwA3AwAgAkHQGWogAUEQaikDADcDACACQdgZaiABQRhqKQMANwMAIAJB4BlqIAFBIGopAwA3AwAgAkHoGWogAUEoaikDADcDACACQfgZaiABQThqKQMANwMAIAJBgBpqIAFBQGspAwA3AwAgAkGIGmogAUHIAGopAwA3AwAgAkGQGmogAUHQAGopAwA3AwAgAkGYGmogAUHYAGopAwA3AwAgAiABKQMANwPAGSACIAEpAzA3A/AZIAJByBpqIAFBqANqKQMANwMAIAJBwBpqIAFBoANqKQMANwMAIAJBuBpqIAFBmANqKQMANwMAIAJBsBpqIAFBkANqKQMANwMAIAJBqBpqIAFBiANqKQMANwMAIAJB+BpqIAFB2ANqKQMANwMAIAJB8BpqIAFB0ANqKQMANwMAIAJB6BpqIAFByANqKQMANwMAIAJB4BpqIAFBwANqKQMANwMAIAJB2BpqIAFBuANqKQMANwMAIAIgASkDgAM3A6AaIAIgASkDsAM3A9AaIAJBwAFqIgQgAkHAGWpB4AD8CgAAIAJBoAJqIAJBoBpqQeAA/AoAACACQcAHaiIFIARBwAH8CgAAIAIgBRCsAyACQYgbaiABQagCaikDADcDACACQZAbaiABQbACaikDADcDACACQZgbaiABQbgCaikDADcDACACQaAbaiABQcACaikDADcDACACQagbaiABQcgCaikDADcDACACQbgbaiABQdgCaikDADcDACACQcAbaiABQeACaikDADcDACACQcgbaiABQegCaikDADcDACACQdAbaiABQfACaikDADcDACACQdgbaiABQfgCaikDADcDACACIAEpA6ACNwOAGyACIAEpA9ACNwOwGyACQYgcaiABQegBaikDADcDACACQYAcaiABQeABaikDADcDACACQfgbaiABQdgBaikDADcDACACQfAbaiABQdABaikDADcDACACQegbaiABQcgBaikDADcDACACQbgcaiABQZgCaikDADcDACACQbAcaiABQZACaikDADcDACACQagcaiABQYgCaikDADcDACACQaAcaiABQYACaikDADcDACACQZgcaiABQfgBaikDADcDACACIAEpA8ABNwPgGyACIAEpA/ABNwOQHCACQcAEaiIEIAJBgBtqQeAA/AoAACACQaAFaiACQeAbakHgAPwKAAAgBSAEQcAB/AoAACACQYADaiIIIAUQrAMgAkHIHGogAUHoAGopAwA3AwAgAkHQHGogAUHwAGopAwA3AwAgAkHYHGogAUH4AGopAwA3AwAgAkHgHGogAUGAAWopAwA3AwAgAkHoHGogAUGIAWopAwA3AwAgAkH4HGogAUGYAWopAwA3AwAgAkGAHWogAUGgAWopAwA3AwAgAkGIHWogAUGoAWopAwA3AwAgAkGQHWogAUGwAWopAwA3AwAgAkGYHWogAUG4AWopAwA3AwAgAiABKQNgNwPAHCACIAEpA5ABNwPwHCACQcgdaiABQYgEaikDADcDACACQcAdaiABQYAEaikDADcDACACQbgdaiABQfgDaikDADcDACACQbAdaiABQfADaikDADcDACACQagdaiABQegDaikDADcDACACQfgdaiABQbgEaikDADcDACACQfAdaiABQbAEaikDADcDACACQegdaiABQagEaikDADcDACACQeAdaiABQaAEaikDADcDACACQdgdaiABQZgEaikDADcDACACIAEpA+ADNwOgHSACIAEpA5AENwPQHSACQYAJaiIEIAJBwBxqQeAA/AoAACACQeAJaiACQaAdakHgAPwKAAAgBSAEQcAB/AoAACACQYAGaiAFIgQQrAMgAkHACmoiBiIDIAIgARCNASAEIAMgAxDVASADIARB4AD8CgAAIAJBiB5qIAJBCGopAwA3AwAgAkGQHmogAkEQaikDADcDACACQZgeaiACQRhqKQMANwMAIAJBoB5qIAJBIGopAwA3AwAgAkGoHmogAkEoaikDADcDACACQbgeaiACQThqKQMANwMAIAJBwB5qIAJBQGspAwA3AwAgAkHIHmogAkHIAGopAwA3AwAgAkHQHmogAkHQAGopAwA3AwAgAkHYHmogAkHYAGopAwA3AwAgAiACKQMANwOAHiACIAIpAzA3A7AeIAJB4A9qIgcgAkGAHmpB4AD8CgAAIAQiAyAHIAYiBBDVASAEIANB4AD8CgAAIAJBoAtqIgYiAyAIIAFB4ABqEI0BIAUiBCADIAMQ1QEgAyAEQeAA/AoAACACQegeaiACQYgDaikDADcDACACQfAeaiACQZADaikDADcDACACQfgeaiACQZgDaikDADcDACACQYAfaiACQaADaikDADcDACACQYgfaiACQagDaikDADcDACACQZgfaiACQbgDaikDADcDACACQaAfaiACQcADaikDADcDACACQagfaiACQcgDaikDADcDACACQbAfaiACQdADaikDADcDACACQbgfaiACQdgDaikDADcDACACIAIpA4ADNwPgHiACIAIpA7ADNwOQHyAHIAJB4B5qQeAA/AoAACAEIgMgByAGIgQQ1QEgBCADQeAA/AoAACACQYAMaiIGIgMgAkHgAGogAUGAA2oQ1QEgBSIEIAMgAxDVASADIARB4AD8CgAAIAJByB9qIAJB6ABqKQMANwMAIAJB0B9qIAJB8ABqKQMANwMAIAJB2B9qIAJB+ABqKQMANwMAIAJB4B9qIAJBgAFqKQMANwMAIAJB6B9qIAJBiAFqKQMANwMAIAJB+B9qIAJBmAFqKQMANwMAIAJBgCBqIAJBoAFqKQMANwMAIAJBiCBqIAJBqAFqKQMANwMAIAJBkCBqIAJBsAFqKQMANwMAIAJBmCBqIAJBuAFqKQMANwMAIAIgAikDYDcDwB8gAiACKQOQATcD8B8gByACQcAfakHgAPwKAAAgBCIDIAcgBiIEENUBIAQgA0HgAPwKAAAgAkHgDGoiBiIDIAJB4ANqIAFB4ANqENUBIAUiBCADIAMQ1QEgAyAEQeAA/AoAACACQaggaiACQegDaikDADcDACACQbAgaiACQfADaikDADcDACACQbggaiACQfgDaikDADcDACACQcAgaiACQYAEaikDADcDACACQcggaiACQYgEaikDADcDACACQdggaiACQZgEaikDADcDACACQeAgaiACQaAEaikDADcDACACQeggaiACQagEaikDADcDACACQfAgaiACQbAEaikDADcDACACQfggaiACQbgEaikDADcDACACIAIpA+ADNwOgICACIAIpA5AENwPQICAHIAJBoCBqQeAA/AoAACAEIgMgByAGIgQQ1QEgBCADQeAA/AoAACACQcANaiEEIAJB4AZqIgMpAzAiGCEMIAMpAwAiGSEJAn4CQAJ+AkAgGCAZUg0AIAMpAzgiDSADKQMIIglSBEAgDSEMDAELIAMpA0AiDiADKQMQIglSBEAgDiEMDAELIAMpA0giCyADKQMYIglSBEAgCyEMDAELIAMpA1AiECADKQMgIglSBEAgECEMDAELIA0hDyAOIREgCyESIAMpA1giDCETIBAgDCADKQMoIglRDQEaCyAJIAxUDQEgAykDOCENIAMpAwghDyADKQNAIQ4gAykDECERIAMpA0ghCyADKQMYIRIgAykDUCEQIAMpA1ghDCADKQMoIRMgAykDIAsiCiAQfSIJIAwgE1atIhp9IRQgEiALfSIVIAogEFQgCSAaVHKtIgl9IRogESAOfSIWIAkgFVYgCyASVnKtIgl9IRUgDyANfSIXIAkgFlYgDiARVnKtIgl9IRYgCSAXViANIA9WciEDIBkgGH0hFyATIAx9DAELQqTsw7WP1LSY5wAgAykDSCILIAMpAxgiEn0iDSADKQNQIhAgAykDICIKVCAQIAp9Ig4gAykDWCIMIAMpAygiE1StIg9Ucq0iCX0iFH0iFSAOIA99Ig5C///Piuv//9UeVkL//8+K6///1R4gDn0iFyAMIBN9IhtCq9X+////v/+5f1atIhxUcq0iD30hGkK/pZScz/DSu+QAIAMpA0AiDiADKQMQIhF9IhYgCyASVCAJIA1Wcq0iCX0iHX0iHiAPIBVWIBRCpOzDtY/UtJjnAFZyrSIUfSEVQtfZrprk9umNywAgAykDOCINIAMpAwgiD30iHyAOIBFUIAkgFlZyrSIJfSIgfSIhIBQgHlYgHUK/pZScz/DSu+QAVnKtIhR9IRYgFCAhViAgQtfZrprk9umNywBWciEDIBcgHH0hFCANIA9UIAkgH1ZyrSAZIBh9fEKazf/Lo73EgBp8IRdCq9X+////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A0giByAFIAMpA0AiBHwiCCAFVK18IAggByAEIA98IgUgD1StfCAFIAMpA1ggAykDUCIEIBN8IARUrXx8IhEgBVStfHwiBCAIVK18fCIHIAZUrXwiCCAMIBBUrSADKQMIIAsgEFatfHwiBSALIA1UrSAJIA5UrXx8Igl8IgogCFQgBSAJVnIgCkIAU3INAAJAIApC////////////AFEEQEJ/IQYgB0J/UgRAIAQhCCAHIQZC////////////ACEKDAQLIARCf1ENASAEIQhC////////////ACEKDAMLIAQhCCAHIQYMAgtCfyEIIBFCbVoNAEL///////////8AIQoMAQsgBEIBfCIOIBFCbVStIgV9IQggB0IBfCIJIARCf1IgBSAOVnKtIgR9IQYgCiAHQn9SIAQgCVZyrX1C////////////AH0hCiARQhN8IRELIAAgETcDICAAIAg3AxggACAKNwMIQgAhCkEQCyAAaiAGNwMAIAAgCjcDACADQaAEaiQAC/scAgF/FH4jAEGABmsiAiQAIAJB4AVqIAEpAwAgASkDCBDNAiACQYAFaiABKQMQIAEpAxgQzQIgAkGgBWogASkDICABKQMoEM0CIAJBwAVqIAEpAzAgASkDOBDNAiACQYADaiACKQOYBSIDQgBCgICAgICAEUIAEMkDIAJBkANqIANCAEKAgICAgHxCABDJAyACQaADaiADQgBCf0IAEMkDIAJBsANqIANCAEL///////+gAkIAEMkDIAJB0AJqQgAgAikDgAMiBH1CAEKRgICAgICAgAhCABDJAyACQcADaiACKQOQBSIDQgBCgICAgICAEUIAEMkDIAJB0ANqIANCAEKAgICAgHxCABDJAyACQeADaiADQgBCf0IAEMkDIAJB8ANqIANCAEL///////+gAkIAEMkDIAJB4AJqQgAgBEKAgICAgIB/gyIDIAR9IANUrSIFIAIpA4gDIgggAikDkAN8Igd8IgQgAikDwAN8Igl9QgBCkYCAgICAgIAIQgAQyQMgAkGABGogAikDiAUiA0IAQoCAgICAgBFCABDJAyACQZAEaiADQgBCgICAgIB8QgAQyQMgAkGgBGogA0IAQn9CABDJAyACQbAEaiADQgBC////////oAJCABDJAyACQfACakIAIAlCAFKtIg0gBCAFVK0iCiACKQOYAyAHIAhUrXwiByACKQOgA3wiBnwiBSACKQPQA3wiCCACKQPIAyAEIAlWrXx8Igx8IgQgAikDgAR8Igl9QgBCkYCAgICAgIAIQgAQyQMgAkHABGogAikDgAUiA0IAQoCAgICAgBFCABDJAyACQdAEaiADQgBCgICAgIB8QgAQyQMgAkHgBGogA0IAQn9CABDJAyACQfAEaiADQgBC////////oAJCABDJAyACQcACakIAIAIpA4gEIAQgCVatfCIQIAIpA5AEfCIDIAIpA6gDIAYgB1StfCIOIAIpA7ADfCIHIAIpA9ACfCIGIAUgClStfCIKIAIpA+ADfCILIAggDFatIAIpA9gDIAUgCFatfHx8IgUgBCANVK18Igx8IgQgCUIAUq18IgkgAikDwAR8Igh9QgBCkYCAgICAgIAIQgAQyQMCQAJAIAIpA8gCIAIpA9gEIAIpA8gEIAggCVStfCIPIAIpA9AEfCINIA9UrXwgDSADIARWrSACKQOYBCADIBBUrXx8Ig8gAikDoAR8IgMgBSAMVq0iESACKQPgAnwiDCACKQO4AyAHIA5UrXwiDiACKQPwA3wiECAGIApWrSACKQPYAiAGIAdUrXx8fCIHIAUgC1StIAIpA+gDIAogC1atfHx8Igp8Igt8IgUgBCAJVq18IgZ8IgQgDVStfCINIAIpA+AEfCIJIAUgBlatIhIgAikD8AJ8IgYgByAKVq0gByAQVK0gAikD+AMgDiAQVq18fHwiECACKQOwBHwiByALIAxUrSACKQPoAiAMIBFUrXx8fCIKIAMgBVatIAIpA6gEIAMgD1StfHx8Igt8Igx8IgMgBCAEIAhCAFKtfCIEVq18IgggA1StIg4gAikDwAJ8IgUgDlStfCAFIAogC1atIAcgClatIAIpA7gEIAcgEFStfHx8IgsgAikD8AR8IgogBiAMVq0gAikD+AIgBiASVK18fHwiBiADIAlUrSACKQPoBCAJIA1UrXx8fCIDfCIHIAVUrXwgAyAGVK0gBiAKVK0gAikD+AQgCiALVK18fHx8IgZCkYCAgICAgIAIVg0AIAZCkYCAgICAgIAIUQRAIAQgCIQgB4RQRQ0BQgAhCUKRgICAgICAgAghBkIAIQVCACEDDAILIAchCSAIIQUgBCEDDAELIARCAX0hAyAIIARQrSIEfSEFIAcgBCAIVq0iBH0hCSAGIAQgB1atfUKRgICAgICAgAh9IQYLQpGAgICAgICACCEEIAIpA+gFIgggCXwiCSAIVCAJIAUgAikD8AUiBXwiCCAFVCAIIAggAyACKQP4BSIDfCIFIANUrXwiCFZyrXwiByAJVHKtIAIpA+AFIAZ8fCIGIQMCQAJAIAZCkYCAgICAgIAIUQRAIAcgCIRCAFINAUIBIQQgBSIDQgFRDQELIAMgBFoNACAHIQQgCCEDIAUhCQwBCyAFQgF9IQkgCCAFUK0iBH0hAyAHIAQgCFatIgV9IQRC7v////////93Qu//////////dyAFIAdWGyAGfCEGC0KRgICAgICAgAghCiAEIAQgACkDKHwiBFYgBCADIAMgACkDMHwiA1YgAyAJIAApAzh8IgUgCVStfCIIIANUcq18IgcgBFRyrSAAKQMgIAZ8fCIGIQQCQAJAIAZCkYCAgICAgIAIUQRAIAcgCIRCAFINAUIBIQogBSIEQgFRDQELIAQgCloNACAHIQQgCCEDIAUhCQwBCyAFQgF9IQkgCCAFUK0iBH0hAyAHIAQgCFatIgV9IQRC7v////////93Qu//////////dyAFIAdWGyAGfCEGCyAAIAk3AzggACADNwMwIAAgBDcDKCAAIAY3AyAgAkHwAGogAikD2AUiA0IAQoCAgICAgBFCABDJAyACQeAAaiADQgBCgICAgIB8QgAQyQMgAkHQAGogA0IAQn9CABDJAyACQUBrIANCAEL///////+gAkIAEMkDIAJBMGpCACACKQNwIgR9QgBCkYCAgICAgIAIQgAQyQMgAkGwAWogAikD0AUiA0IAQoCAgICAgBFCABDJAyACQaABaiADQgBCgICAgIB8QgAQyQMgAkGQAWogA0IAQn9CABDJAyACQYABaiADQgBC////////oAJCABDJAyACQSBqQgAgBEKAgICAgIB/gyIDIAR9IANUrSIFIAIpA3giCCACKQNgfCIHfCIEIAIpA7ABfCIJfUIAQpGAgICAgICACEIAEMkDIAJB8AFqIAIpA8gFIgNCAEKAgICAgIARQgAQyQMgAkHgAWogA0IAQoCAgICAfEIAEMkDIAJB0AFqIANCAEJ/QgAQyQMgAkHAAWogA0IAQv///////6ACQgAQyQMgAkEQakIAIAlCAFKtIg0gBCAFVK0iCiACKQNo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IgogEkLH+vPD7YKjkDxUrSIIfSEGIAlCo8/685fJ7tfHAHwiCyAHQo2Vx8OW0trAl39UIAggClZyrSIHfSEIIAwgCULdsIWM6LaRqLh/VCAHIAtWcq19QqnAxomuzpOyMH0hDCASQsf688PtgqOQPH0hEgsgAiASNwPgBSACIAY3A9gFIAIgCDcD0AUgAiAMNwPIBSACQueo9ca8p8KHuH83A+AGIAJC5fHh0cWMhqqnfzcD2AYgAkKqmdmK5dzjo65/NwPQBiACQvK19tfrgqDtIzcDyAYgAkHoBGogAkHIBWoiAyACQcgGaiIEEH4gAkHQBGogAkGQBWopAwA3AwAgAkHYBGogAkGYBWopAwA3AwAgAkHgBGogAkGgBWopAwA3AwAgAiACKQOIBTcDyAQgAyABIAEQoAIgBCACQcgEaiADEJEDIAIpA9gGIQcgAikD0AYhBiACKALIBkEBRg0BIAAgAikD4AY3AxAgAEE4aiACQYgHaikDADcDACAAQTBqIAJBgAdqKQMANwMAIABBKGogAkH4BmopAwA3AwAgAEEgaiACQfAGaikDADcDACAAQRhqIAJB6AZqKQMANwMAIAAgBzcDCCAAIAY3AwAgAkGQB2okAA8LIAIgBDYC0AYgAiADNgLMBiACIAU2AsgGQYCLwABBKyACQcgGakHwisAAQaSNwAAQygMACyACIAc3A9AGIAIgBjcDyAZB1P7AAEErIAJByAZqQbCFwQBBwIXBABDKAwALjhgCDn8BfiMAQeAKayIDJAAgA0E4aiABQThqKQMANwMAIANBMGogAUEwaikDADcDACADQShqIAFBKGopAwA3AwAgA0EgaiABQSBqKQMANwMAIANBGGogAUEYaikDADcDACADQRBqIAFBEGopAwA3AwAgA0EIaiABQQhqKQMANwMAIANByABqIAJBCGopAwA3AwAgA0HQAGogAkEQaikDADcDACADQdgAaiACQRhqKQMANwMAIANB4ABqIAJBIGopAwA3AwAgA0HoAGogAkEoaikDADcDACADQfAAaiACQTBqKQMANwMAIANB+ABqIAJBOGopAwA3AwAgAyABKQMANwMAIAMgAikDADcDQCADQegBakIANwMAIANB4AFqQgA3AwAgA0HYAWpCADcDACADQdABakIANwMAIANByAFqQgA3AwAgA0HAAWpCADcDACADQbgBakIANwMAIANCADcDsAEgA0FAayEBAkACQAJAAkACQAJAIAMgA0GwAWoiAhCnBARAIAEgAhCnBA0BCyADQegBakIANwMAIANB4AFqQgA3AwAgA0HYAWpCADcDACADQdABakIANwMAIANByAFqQgA3AwAgA0HAAWpCADcDACADQbgBakIANwMAIANCADcDsAEgAyADQbABaiICEKcEBEAgASACEKcEDQELIANBsAFqECEgA0GQBmogA0HIAWopAwA3AwAgA0GIBmogA0HAAWopAwA3AwAgA0GABmogAykDuAE3AwAgA0GgBmogA0H4AWopAwA3AwAgA0GoBmogA0GAAmopAwA3AwAgA0GwBmogA0GIAmopAwA3AwAgA0HABmogA0GYAmopAwA3AwAgA0HIBmogA0GgAmopAwA3AwAgA0HQBmogA0GoAmopAwA3AwAgAyADKQOwATcD+AUgAyADKQPwATcDmAYgAyADKQOQAjcDuAYgA0HYBmoiCyABEEsgA0GgCWoiBiADQQhqIgIpAwA3AwAgA0GoCWoiCCADQRBqIgQpAwA3AwAgA0GwCWoiDCADQRhqIgUpAwA3AwAgA0G4CWoiDSADKQMgNwMAIANBwAlqIg4gA0EoaiIHKQMANwMAIANByAlqIg8gA0EwaiIJKQMANwMAIANB0AlqIhAgA0E4aiIKKQMANwMAIAMgAykDADcDmAkgA0GgCGogBikDADcDACADQagIaiAIKQMANwMAIANBsAhqIAwpAwA3AwAgA0G4CGogDSkDADcDACADQcAIaiAOKQMANwMAIANByAhqIA8pAwA3AwAgA0HQCGogECkDADcDACADIAMpA5gJNwOYCCADQdgIaiIGIANBmAhqEEsgA0HwCWogBSkDADcDACADQegJaiAEKQMANwMAIANB4AlqIAIpAwA3AwAgA0GACmogBykDADcDACADQYgKaiAJKQMANwMAIANBkApqIAopAwA3AwAgAyADKQMANwPYCSADIAMpAyA3A/gJIANB2AdqIgggBiADQdgJahA4IANBoApqIAIpAwA3AwAgA0GoCmogBCkDADcDACADQbAKaiAFKQMANwMAIANBwApqIAcpAwA3AwAgA0HICmogCSkDADcDACADQdAKaiAKKQMANwMAIAMgAykDADcDmAogAyADKQMgNwO4CiAGIANB+AVqIANBmApqEFkgA0GYB2oiAiAIIAYQoAIgBiACIANBmAZqEKACIAsgBhCnBCADKALcBSICBEAgAygC4AUgAkECdBDfBAsCQCADKAKUAyICRQ0AIAIgAkEMbEETakF4cSIFakEJaiICRQ0AIAMoApADIAVrIAIQ3wQLIAMoAsADIgJBgICAgHhGIAJFckUEQCADKALEAyACQQJ0EN8ECw0AIANB6AFqIANBOGopAwA3AwAgA0HgAWogA0EwaikDADcDACADQdgBaiADQShqKQMANwMAIANB0AFqIANBIGopAwA3AwAgA0HIAWogA0EYaikDADcDACADQcABaiADQRBqKQMANwMAIANBuAFqIANBCGopAwA3AwAgAyADKQMANwOwASADQZgKaiADQbABahCvAyADKAKcCiECIAMoApgKIQQgAygCoAoiBUECRw0BIANBoApqIAJBEGopAwA3AwAgA0GoCmogAkEYaikDADcDACADQbAKaiACQSBqKQMANwMAIANBuApqIAJBKGopAwA3AwAgA0HACmogAkEwaikDADcDACADQcgKaiACQThqKQMANwMAIAMgAikDCDcDmAogAigCBCEFIAIoAgAhByAEBEAgAiAEQQV0EN8ECyADQegJaiADQaAKaikDADcDACADQfAJaiADQagKaikDADcDACADQYAKaiADQbgKaikDADcDACADQYgKaiADQcAKaikDADcDACADQZAKaiADQcgKaikDADcDACADIAU2AtwJIAMgBzYC2AkgAyADKQOYCjcD4AkgAyADKQOwCjcD+AkgA0HoAWogAUE4aikDADcDACADQeABaiABQTBqKQMANwMAIANB2AFqIAFBKGopAwA3AwAgA0HQAWogAUEgaikDADcDACADQcgBaiABQRhqKQMANwMAIANBwAFqIAFBEGopAwA3AwAgA0G4AWogAUEIaikDADcDACADIAEpAwA3A7ABIANBmApqIANBsAFqEK8DIAMoApwKIQEgAygCmAohAiADKAKgCiIEQQJHDQIgA0GgCWogAUEQaikDADcDACADQagJaiABQRhqKQMANwMAIANBsAlqIAFBIGopAwA3AwAgA0G4CWogAUEoaikDADcDACADQcAJaiABQTBqKQMANwMAIANByAlqIAFBOGopAwA3AwAgAyABKQMINwOYCSABKAIEIQQgASgCACEFIAIEQCABIAJBBXQQ3wQLIANBqApqIANBoAlqIgEpAwA3AwAgA0GwCmogA0GoCWopAwA3AwAgA0HACmogA0G4CWopAwA3AwAgA0HICmogA0HACWopAwA3AwAgA0HQCmogA0HICWopAwA3AwAgAyAENgKcCiADIAU2ApgKIAMgAykDmAk3A6AKIAMgAykDsAk3A7gKIANBmAhqIgIgA0HYCWoQzQEgA0EANgKgCSADQoCAgIAQNwKYCSADQdD/wAA2ArQBIANCoICAgA43ArgBIAMgA0GYCWoiBDYCsAEgAiADQbABaiICENMCDQUgA0GIAWogASgCADYCACADIAMpApgJNwOAASADQdgIaiIFIANB+AlqEM0BIANBADYCoAkgA0KAgICAEDcCmAkgA0HQ/8AANgK0ASADQqCAgIAONwK4ASADIAQ2ArABIAUgAhDTAg0FIANBmAFqIAEoAgA2AgAgAyADKQKYCTcDkAEgBCADQZgKahDNASADQQA2AuAHIANCgICAgBA3AtgHIANB0P/AADYCtAEgA0KggICADjcCuAEgAyADQdgHaiIBNgKwASAEIAIQ0wINBSADQagBaiADQeAHaigCADYCACADIAMpAtgHNwOgASACIANBuApqEM0BIANBADYCoAYgA0KAgICAEDcCmAYgA0HQ/8AANgLcBiADQqCAgIAONwLgBiADIANBmAZqNgLYBiACIANB2AZqENMCDQUgA0GABmogA0GgBmooAgA2AgAgAyADKQKYBjcD+AUgA0EFNgKcByADQeyDwQA2ApgHIANCBDcCpAcgA0KAgICAwAQiESADQfgFaq2ENwPwByADIBEgA0GgAWqthDcD6AcgAyARIANBkAFqrYQ3A+AHIAMgESADQYABaq2ENwPYByADIAE2AqAHIABBBGogA0GYB2oQ0gIgAygC+AUiAQRAIAMoAvwFIAEQ3wQLIAMoAqABIgEEQCADKAKkASABEN8ECyADKAKQASIBBEAgAygClAEgARDfBAsgAygCgAEiAQRAIAMoAoQBIAEQ3wQLIABBATYCAAwDCyAAQQhqIANBgAH8CgAAIABBADYCAAwCCyADIAU2AqAKIAMgAjYCnAogAyAENgKYCgwCCyADIAQ2AqAKIAMgATYCnAogAyACNgKYCgwBCyADQeAKaiQA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yAFqIgwgGykDACIvNwMAIAJBiAhqIhkgLzcDACACQZAIaiIaIDA3AwAgAkGYCGoiFCAxNwMAIAIgAikDwAciLzcDwAEgAkGgCGoiDSAGKQMANwMAIAJBqAhqIg4gBykDADcDACACQbAIaiIPIAgpAwA3AwAgAkG4CGoiECAJKQMANwMAIAIgLzcDgAggAkHAAWoiBCACQYAIaiIREEsgECACQfgBaiIVKQMANwMAIA8gAkHwAWoiFikDADcDACAOIAJB6AFqIhcpAwA3AwAgDSACQeABaiIYKQMANwMAIBQgCikDADcDACAaIAspAwA3AwAgGSAMKQMANwMAIAIgAikDwAE3A4AIIAQgAkHAB2oiISAREDggCSAVKQMAIjM3AwAgCCAWKQMAIjI3AwAgByAXKQMAIjE3AwAgBiAYKQMAIjA3AwAgBSAKKQMAIi83AwAgAkHIA2oiEiAMKQMANwMAIAJB0ANqIhMgCykDADcDACACQdgDaiIdIC83AwAgAkHgA2oiHiAwNwMAIAJB6ANqIiAgMTcDACACQfADaiIiIDI3AwAgAkH4A2oiIyAzNwMAIAIgAikDwAEiLzcDwAcgAiAvNwPAAyAbIAFByABqKQMANwMAIBwgAUHQAGopAwA3AwAgBSABQdgAaikDADcDACAGIAEpA2A3AwAgByABQegAaikDADcDACAIIAFB8ABqKQMANwMAIAkgAUH4AGopAwA3AwAgAiABKQNANwPAByAKIAUpAwAiMTcDACALIBwpAwAiMDcDACAMIBspAwAiLzcDACAZIC83AwAgGiAwNwMAIBQgMTcDACACIAIpA8AHIi83A8ABIA0gBikDADcDACAOIAcpAwA3AwAgDyAIKQMANwMAIBAgCSkDADcDACACIC83A4AIIAQgERBLIBAgFSkDADcDACAPIBYpAwA3AwAgDiAXKQMANwMAIA0gGCkDADcDACAUIAopAwA3AwAgGiALKQMANwMAIBkgDCkDADcDACACIAIpA8ABNwOACCAEICEgERA4IAkgFSkDACIzNwMAIAggFikDACIyNwMAIAcgFykDACIxNwMAIAYgGCkDACIwNwMAIAUgCikDACIvNwMAIAJBiARqIiQgDCkDADcDACACQZAEaiIlIAspAwA3AwAgAkGYBGoiJiAvNwMAIAJBoARqIisgMDcDACACQagEaiInIDE3AwAgAkGwBGoiKCAyNwMAIAJBuARqIikgMzcDACACIAIpA8ABIi83A8AHIAIgLzcDgAQgBBD0AyARIAJBgARqIh8gBBA4IAJBgANqIgMgAkHAA2oiKiAREKACIBsgAUGIAWopAwA3AwAgHCABQZABaikDADcDACAFIAFBmAFqKQMANwMAIAYgASkDoAE3AwAgByABQagBaikDADcDACAIIAFBsAFqKQMANwMAIAkgAUG4AWopAwA3AwAgAiABKQOAATcDwAcgCiAFKQMAIjE3AwAgCyAcKQMAIjA3AwAgDCAbKQMAIi83AwAgGSAvNwMAIBogMDcDACAUIDE3AwAgAiACKQPAByIvNwPAASANIAYpAwA3AwAgDiAHKQMANwMAIA8gCCkDADcDACAQIAkpAwA3AwAgAiAvNwOACCAEIBEQSyAQIBUpAwA3AwAgDyAWKQMANwMAIA4gFykDADcDACANIBgpAwA3AwAgFCAKKQMANwMAIBogCykDADcDACAZIAwpAwA3AwAgAiACKQPAATcDgAggBCAhIBEQOCAJIBUpAwAiMzcDACAIIBYpAwAiMjcDACAHIBcpAwAiMTcDACAGIBgpAwAiMDcDACAFIAopAwAiLzcDACASIAwpAwA3AwAgEyALKQMANwMAIB0gLzcDACAeIDA3AwAgICAxNwMAICIgMjcDACAjIDM3AwAgAiACKQPAASIvNwPAByACIC83A8ADIB8Q9AMgGSAkKQMANwMAIBogJSkDADcDACAUICYpAwA3AwAgDSACKQOgBDcDACAOICcpAwA3AwAgDyAoKQMANwMAIBAgKSkDADcDACACIAIpA4AENwOACCAEIBEQSyAQIBUpAwAiMjcDACAPIBYpAwAiMTcDACAOIBcpAwAiMDcDACANIBgpAwAiLzcDACAbIAwpAwA3AwAgHCALKQMANwMAIAUgCikDADcDACAGIC83AwAgByAwNwMAIAggMTcDACAJIDI3AwAgAiACKQPAASIvNwOACCACIC83A8AHIAQgKiAhEDggKiADIAQQoAIgBCACIAEQOCARIAQgAUFAayIdEDggISARIAFBgAFqIh4QOCAEEPQDIBEgISAEEDggAkFAayIDICogERDcASAEIAMQLiACKQPQASEwIAIpA8gBIS8gAAJ+IAIoAsABQQFGBEAgACAwNwMQIAAgLzcDCEIBDAELIAJBuAFqIAJBgAJqIgMpAwA3AwAgAkGwAWogFSkDADcDACACQagBaiAWKQMANwMAIAJBoAFqIBcpAwA3AwAgAkGYAWogGCkDADcDACACIAIpA9gBNwOQASACIDA3A4gBIAIgLzcDgAEgGSAsKQMANwMAIBogLSkDADcDACAUIC4pAwA3AwAgDSABQSBqIh8pAwA3AwAgDiAfQQhqKQMANwMAIA8gH0EQaikDADcDACAQIB9BGGopAwA3AwAgAiABKQMANwOACCACQcABaiISIAJBgAhqIhMQSyAQIBUpAwAiMzcDACAPIBYpAwAiMjcDACAOIBcpAwAiMTcDACANIBgpAwAiMDcDACAUIAopAwAiLzcDACAkIAwpAwA3AwAgJSALKQMANwMAICYgLzcDACArIDA3AwAgJyAxNwMAICggMjcDACApIDM3AwAgAiACKQPAASIvNwOACCACIC83A4AEIBMgHSAeEDggEhD0AyACQcAHaiIgIBMgEhA4IBIgAkGABGoiIiAgENwBIAJBgANqIBIgAkGAAWoiHxA4IBIgARDwAiAiIBIgHRA4IBkgHkEIaikDADcDACAaIB5BEGopAwA3AwAgFCAeQRhqKQMANwMAIA0gAUGgAWoiIykDADcDACAOICNBCGopAwA3AwAgDyAjQRBqKQMANwMAIBAgI0EYaikDADcDACACIB4pAwA3A4AIIBIgExBLIBAgFSkDACIzNwMAIA8gFikDACIyNwMAIA4gFykDACIxNwMAIA0gGCkDACIwNwMAIBQgCikDACIvNwMAIBsgDCkDADcDACAcIAspAwA3AwAgBSAvNwMAIAYgMDcDACAHIDE3AwAgCCAyNwMAIAkgMzcDACACIAIpA8ABIi83A4AIIAIgLzcDwAcgEhD0AyATICAgEhA4ICAgIiATEKACIAMgICAfEDggEyABEPACIAJBwANqIgMgEyAeEDggGyAdQQhqKQMANwMAIBwgHUEQaikDADcDACAFIB1BGGopAwA3AwAgBiABQeAAaiIBKQMANwMAIAcgAUEIaikDADcDACAIIAFBEGopAwA3AwAgCSABQRhqKQMANwMAIAIgHSkDADcDwAcgEyAgEEsgCSAQKQMAIjM3AwAgCCAPKQMAIjI3AwAgByAOKQMAIjE3AwAgBiANKQMAIjA3AwAg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IAggFCkDADcDACAMIBUpAwA3AwAgDSAWKQMANwMAIA4gFykDADcDACAPIBgpAwA3AwAgECAZKQMANwMAIAIgAikDgAY3A6ACIAIgAikDsAY3A9ACIANFBEAgAkHgBmogAkGgAmpB4AD8CgAACyACQaACaiIKIAJB4AZqIgsQXiADRQRAIAsgCkHgAPwKAAALIAJBoAJqIgogAkGABmoiCyACQeAGahA/IANFBEAgCyAKQeAA/AoAAAsgA0UEQCACQaAFaiACQYAGakHgAPwKAAALIAJBoAJqIgoQdSACQeAGaiILIAJBoAVqIAoQPyACQcABaiACQcAEaiALENUBIAUgAUHoAWopAwA3AwAgBiABQeABaikDADcDACAEIAFB2AFqKQMANwMAIAcgAUHQAWopAwA3AwAgCCABQcgBaikDADcDACAMIAFB+AFqKQMANwMAIA0gAUGAAmopAwA3AwAgDiABQYgCaikDADcDACAPIAFBkAJqKQMANwMAIBAgAUGYAmopAwA3AwAgAiABKQPAATcDoAIgAiABKQPwATcD0AIgA0UEQCACQYAGaiAKQeAA/AoAAAsgBSARKQMANwMAIAYgEykDADcDACAEIAkpAwA3AwAgByASKQMANwMAIAggFCkDADcDACAMIBUpAwA3AwAgDSAWKQMANwMAIA4gFykDADcDACAPIBgpAwA3AwAgECAZKQMANwMAIAIgAikDgAY3A6ACIAIgAikDsAY3A9ACIANFBEAgAkHgBmogAkGgAmpB4AD8CgAACyACQaACaiIJIAJB4AZqIhEQXiADRQRAIBEgCUHgAPwKAAALIAJBoAJqIgkgAkGABmoiESACQeAGahA/IANFBEAgESAJQeAA/AoAAAsgA0UEQCACQcAEaiACQYAGakHgAPwKAAALIAJBoAVqEHUgBSACQcgFaikDADcDACAGIAJBwAVqKQMANwMAIAQgAkG4BWopAwA3AwAgByACQbAFaikDADcDACAIIAJBqAVqKQMANwMAIAwgAkHYBWopAwA3AwAgDSACQeAFaikDADcDACAOIAJB6AVqKQMANwMAIA8gAkHwBWopAwA3AwAgECACQfgFaikDADcDACACIAIpA6AFNwOgAiACIAIpA9AFNwPQAiADRQRAIAJB4AZqIAJBoAJqQeAA/AoAAAsgAkGgAmoiBSACQeAGaiIGEF4gA0UEQCAGIAVB4AD8CgAACyADRQRAIAJBoAJqIAJB4AZqQeAA/AoAAAsgAkHgBmoiAyACQcAEaiIHIAJBoAJqIgQQPyAHIAJBwAFqIAMQ1QEgBCACIAEQPyADIAQgAUHgAGoiBRA/IAJBgAZqIgggAyABQcABaiIGED8gBBB1IAMgCCAEED8gAkHgAGoiCCAHIAMQjQEgBCAIED0gAikDsAIhGiACKQOoAiEbIAACfiACKAKgAkEBRgRAIAAgGjcDECAAIBs3AwhCAQwBCyACQdABaiACQbgCaiIEQdAA/AoAACACIBo3A8gBIAIgGzcDwAEgAkHIAmoiByABQShqKQMANwMAIAJBwAJqIgggAUEgaikDADcDACAEIAFBGGopAwA3AwAgAkGwAmoiDCABQRBqKQMANwMAIAJBqAJqIg0gAUEIaikDADcDACACQdgCaiIOIAFBMGoiA0EIaikDADcDACACQeACaiIPIANBEGopAwA3AwAgAkHoAmoiECADQRhqKQMANwMAIAJB8AJqIhEgA0EgaikDADcDACACQfgCaiITIANBKGopAwA3AwAgAiABKQMANwOgAiACIAMpAwA3A9ACQQAiA0UEQCACQeAGaiACQaACakHgAPwKAAALIAJBoAJqIgkgAkHgBmoiEhBeIANFBEAgEiAJQeAA/AoAAAsgA0UEQCACQaAFaiACQeAGakHgAPwKAAALIAJB4AZqIhIgBSAGED8gAkGgAmoiCRB1IAJBgAZqIhQgEiAJED8gCSACQaAFaiIVIBQQjQEgAkHABGogCSACQcABahA/IAkgARC0AiAVIAkgBRA/IAcgBkEoaikDADcDACAIIAZBIGopAwA3AwAgBCAGQRhqKQMANwMAIAwgBkEQaikDADcDACANIAZBCGopAwA3AwAgDiABQfABaiIEQQhqKQMANwMAIA8gBEEQaikDADcDACAQIARBGGopAwA3AwAgESAEQSBqKQMANwMAIBMgBEEoaikDADcDACACIAYpAwA3A6ACIAIgBCkDADcD0AIgA0UEQCASIAlB4AD8CgAACyACQaACaiIEIAJB4AZqIgcQXiADRQRAIAcgBEHgAPwKAAALIANFBEAgAkGABmogAkHgBmpB4AD8CgAACyACQaACaiIIEHUgAkHgBmoiBCACQYAGaiIHIAgQPyAHIAJBoAVqIgggBBDVASACQYADaiAHIAJBwAFqED8gBCABELQCIAggBCAGED8gAkGIB2ogBUEoaikDADcDACACQYAHaiAFQSBqKQMANwMAIAJB+AZqIAVBGGopAwA3AwAgAkHwBmogBUEQaikDADcDACACQegGaiAFQQhqKQMANwMAIAJBmAdqIAFBkAFqIgFBCGopAwA3AwAgAkGgB2ogAUEQaikDADcDACACQagHaiABQRhqKQMANwMAIAJBsAdqIAFBIGopAwA3AwAgAkG4B2ogAUEoaikDADcDACACIAUpAwA3A+AGIAIgASkDADcDkAcgA0UEQCAHIARB4AD8CgAACyACQeAGaiIBIAJBgAZqIgUQXiADRQRAIAUgAUHgAPwKAAALIANFBEAgAkHgBmogAkGABmpB4AD8CgAACyACQYAGaiIBIAJBoAVqIAJB4AZqENUBIAJB4ANqIAEgAkHAAWoQPyADRQRAIAJBoAJqIAJBwARqQeAA/AoAAAsgAEEIaiACQaACakGgAvwKAABCAAs3AwAgAkHAB2okAAveGgIVfxB+IwBBgARrIgMkAAJAAkACQCABKAIMIgRBf0cEQCACKAIMIgVBf0cNAQtB0c7FAC0AABpBIEEIENYEIgVFDQEgBUIANwMAIAVBGGpCADcDACAFQRBqQgA3AwAgBUEIakIANwMAQX8hCkEBIQ1BASEIDAILIAQgBWoiCkEBaiIIQQV0IQQCQCAIQf///z9LIARB+P///wdLcg0AAn8gBEUEQEEIIQVBAAwBC0HRzsUALQAAGkEIIQYgBEEIENYEIgVFDQEgCAshDQJAAkACQAJAIAhBAk8EQCAKQQdxIQYgCkEBa0EHTw0BIAUhBAwCCyAFIQQgCA0CDAMLIApBeHEhByAFIQQDQCAEQgA3AwAgBEEYakIANwMAIARBEGpCADcDACAEQQhqQgA3AwAgBEEgakIANwMAIARBKGpCADcDACAEQTBqQgA3AwAgBEE4akIANwMAIARBQGtCADcDACAEQcgAakIANwMAIARB0ABqQgA3AwAgBEHYAGpCADcDACAEQeAAakIANwMAIARB6ABqQgA3AwAgBEHwAGpCADcDACAEQfgAakIANwMAIARBmAFqQgA3AwAgBEGQAWpCADcDACAEQYgBakIANwMAIARBgAFqQgA3AwAgBEG4AWpCADcD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AyAMNwMAIAIgEjcDwAQgAkG4BGogCCkDADcDACACQbAEaiAHKQMANwMAIAJBqARqIAYpAwA3AwAgAkGgBGogBSkDADcDACACQZgEaiAJKQMANwMAIAJBkARqIAQpAwA3AwAgAkGIBGogAykDADcDACACIAIpA8AENwOABCACIAJBgANqQcAB/AoAAANAIAJBgANqIgkiASACIAIQ6wEgAiABQcAB/AoAACAQQgKDIBBCAYghEFANAAsgAkHgBmoiASACKQMgIgo3AwAgAkGgA2ogCjcDACACQcgGaiIDIAJBCGopAwAiCjcDACACQdAGaiIEIAJBEGopAwAiCzcDACACQegGaiIFIAJBKGopAwAiDDcDACACQfAGaiIGIAJBMGopAwAiDTcDACACQfgGaiIHIAJBOGopAwAiDjcDACACQdgGaiIIIAJBGGopAwAiDzcDACACQYgDaiAKNwMAIAJBkANqIAs3AwAgAkGYA2ogDzcDACACQagDaiAMNwMAIAJBsANqIA03AwAgAkG4A2ogDjcDACACIAIpAwAiCjcDwAYgAiAKNwOAAyADIAJByABqKQMANwMAIAQgAkHQAGopAwA3AwAgCCACQdgAaikDADcDACABIAIpA2A3AwAgBSACQegAaikDADcDACAGIAJB8ABqKQMANwMAIAcgAkH4AGopAwA3AwAgAiACKQNANwPABiACQfgDaiAHKQMANwMAIAJB8ANqIAYpAwA3AwAgAkHoA2ogBSkDADcDACACQeADaiABKQMANwMAIAJB2ANqIAgpAwA3AwAgAkHQA2ogBCkDADcDACACQcgDaiADKQMANwMAIAIgAikDwAY3A8ADIAJB2AFqIAJBmAFqKQMAIgo3AwAgAkHQAWogAkGQAWopAwAiCzcDACACQcgBaiACQYgBaikDACIMNwMAIAIgAikDgAEiDTcDwAEgAkHgAWogAikDoAEiDjcDACACQegBaiACQagBaikDACIPNwMAIAJB8AFqIAJBsAFqKQMAIhE3AwAgAkH4AWogAkG4AWopAwAiEjcDACAHIBI3AwAgBiARNwMAIAUgDzcDACABIA43AwAgCCAKNwMAIAQgCzcDACADIAw3AwAgAiANNwPABiACQbgEaiAHKQMANwMAIAJBsARqIAYpAwA3AwAgAkGoBGogBSkDADcDACACQaAEaiAB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EyAPKQMANwMAIBAgDikDADcDACAUIA0pAwA3AwAgFSAEKQMANwMAIBcgDCkDADcDACAYIAMpAwA3AwAgGSACKQMANwMAIAEgASkDkA43A4gGIAFBgA1qIBMpAwA3AwAgAUH4DGogECkDADcDACABQfAMaiAUKQMANwMAIAFB6AxqIBUpAwA3AwAgAUHgDGogFykDADcDACABQdgMaiAYKQMANwMAIAFB0AxqIBkpAwA3AwAgASABKQOIBjcDyAwgESASEL0DIBogBSkDACIlNwMAIBsgBikDACImNwMAIBwgBykDACInNwMAIB0gCCkDACIoNwMAIB4gCSkDACIpNwMAIAIgCikDADcDACADIAspAwA3AwAgDCApNwMAIAQgKDcDACANICc3AwAgDiAmNwMAIA8gJTcDACABIAEpA4gDIiU3AwggASAlNwOQDiATIA8pAwA3AwAgECAOKQMANwMAIBQgDSkDADcDACAVIAQpAwA3AwAgFyAMKQMANwMAIBggAykDADcDACAZIAIpAwA3AwAgASABKQOQDjcDiAYgAUHADWogEykDADcDACABQbgNaiAQKQMANwMAIAFBsA1qIBQpAwA3AwAgAUGoDWogFSkDADcDACABQaANaiAXKQMANwMAIAFBmA1qIBgpAwA3AwAgAUGQDWogGSkDADcDACABIAEpA4gGNwOIDUEARQRAIAFBiAlqIAFBiAxqQcAB/AoAAAsgASAAQYADajYCzA0gASAWNgLIDSABQQhqIiEgAUHIDWoiIhC9AyAPIBopAwAiJTcDACAOIBspAwAiJjcDACANIBwpAwAiJzcDACAEIB0pAwAiKDcDACAMIB4pAwAiKTcDACABQdgNaiIAIAFBEGoiIykDADcDACABQeANaiICIAFBGGoiJCkDADcDACABQegNaiIDICk3AwAgAUHwDWoiFiAoNwMAIAFB+A1qIhEgJzcDACABQYAOaiISICY3AwAgAUGIDmoiHyAlNwMAIAEgASkDCCIlNwOQDiABICU3A9ANIAUgHykDADcDACAGIBIpAwA3AwAgByARKQMANwMAIAggFikDADcDACAJIAMpAwA3AwAgCyACKQMANwMAIAogACkDADcDACABIAEpA9ANNwOIAyATIAUpAwA3AwAgECAGKQMANwMAIBQgBykDADcDACAVIAgpAwA3AwAgFyAJKQMANwMAIBggCykDADcDACAZIAopAwA3AwAgASABKQOIAzcDiAYgISAiEL0DIA8gGikDACIlNwMAIA4gGykDACImNwMAIA0gHCkDACInNwMAIAQgHSkDACIoNwMAIAwgHikDACIpNwMAIAAgIykDADcDACACICQpAwA3AwAgAyApNwMAIBYgKDcDACARICc3AwAgEiAmNwMAIB8gJTcDACABIAEpAwgiJTcDkA4gASAlNwPQDSAFIB8pAwA3AwAgBiASKQMANwMAIAcgESkDADcDACAIIBYpAwA3AwAgCSADKQMANwMAIAsgAikDADcDACAKIAApAwA3AwAgASABKQPQDTcDiAMgAUGAB2ogBSkDADcDACABQfgGaiAGKQMANwMAIAFB8AZqIAcpAwA3AwAgAUHoBmogCCkDADcDACABQeAGaiAJKQMANwMAIAFB2AZqIAspAwA3AwAgAUHQBmogCikDADcDACABIAEpA4gDNwPIBiAhICIQvQMgDyAaKQMAIiU3AwAgDiAbKQMAIiY3AwAgDSAcKQMAIic3AwAgBCAdKQMAIig3AwAgDCAeKQMAIik3AwAgACAjKQMANwMAIAIgJCkDADcDACADICk3AwAgFiAoNwMAIBEgJzcDACASICY3AwAgHyAlNwMAIAEgASkDCCIlNwOQDiABICU3A9ANIAUgHykDADcDACAGIBIpAwA3AwAgByARKQMANwMAIAggFikDADcDACAJIAMpAwA3AwAgCyACKQMANwMAIAogACkDADcDACABIAEpA9ANNwOIAyABQcAHaiAFKQMANwMAIAFBuAdqIAYpAwA3AwAgAUGwB2ogBykDADcDACABQagHaiAIKQMANwMAIAFBoAdqIAkpAwA3AwAgAUGYB2ogCykDADcDACABQZAHaiAKKQMANwMAIAEgASkDiAM3A4gHICBFBEAgAUGIDGogAUGIBmpBwAH8CgAACyAgRQRAIAFByApqIAFBiAxqQcAB/AoAAAsgAUEIaiABQYgJakGAA/wKAAAgAUHIB2ohBSABQcgGaiEGIAFByAVqIQcgAUHIAmohCCABQYgFaiEJIAFBiAJqIQogAUGIBGohCyABQYgBaiEMIAFByANqIQ0gAUHIAGohDiABQcgEaiEPIAFByAFqIRNBgLXCACkDACElQfi0wgApAwAhJkHwtMIA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QTBsIQEgBSEGAkACQAJAA0AgAUUNASAGQQFrIQYgAUEwayIBIANqQfjDwgBBMBDxA0UNAAsgBkEBaiIBIAUgASAFSRshBQwBC0HRzsUALQAAGkEwQQgQ1gQiAUUNASABQgA3AwAgAUEoakIANwMAIAFBIGpCADcDACABQRhqQgA3AwAgAUEQakIANwMAIAFBCGpCADcDAEF/IQZBASEFIAcEQCADIAdBMGwQ3wQLIAEhA0EBIQcLIAAgBjYCDCAAIAU2AgggACADNgIEIAAgBzYCACAEQbADaiQADwtBCEEwEP8EAAtB9J7BAEE0QaifwQAQ/gMAC9AUAg1/AX4jAEGwD2siAyQAQQBFBEAgAyABQeAA/AoAAAsgA0HgAGohASAERQRAIAEgAkHgAPwKAAALIARFBEAgA0HwAWpBAEHgAPwLAAsCQAJAAkACQAJAAkAgAyADQfABaiICEKYEBEAgASACEKYEDQELIANB8AFqIgJBAEHgAPwLACADIAIQpgQEQCABIAIQpgQNAQsgA0HwAWoQJiADQcAIaiADQbgCaikDADcDACADQbgIaiADQbACaikDADcDACADQbAIaiADQagCaikDADcDACADQagIaiADQaACaikDADcDACADQaAIaiADQZgCaikDADcDACADQdAIaiADQfgCaikDADcDACADQdgIaiADQYADaikDADcDACADQeAIaiADQYgDaikDADcDACADQegIaiADQZADaikDADcDACADQfAIaiADQZgDaikDADcDACADIAMpA5ACNwOYCCADIAMpA/ACNwPICCADQaAJaiADQcgDaikDADcDACADQZgJaiADQcADaikDADcDACADQZAJaiADQbgDaikDADcDACADQYgJaiADQbADaikDADcDACADQYAJaiADQagDaikDADcDACADIAMpA6ADNwP4CCADQagJaiIPIAEQXiADQZANaiADQQhqIgIpAwA3AwAgA0GYDWogA0EQaiIEKQMANwMAIANBoA1qIANBGGoiBSkDADcDACADQagNaiADQSBqIgcpAwA3AwAgA0GwDWogA0EoaiIJKQMANwMAIANBwA1qIANBOGoiCikDADcDACADQcgNaiADQUBrIgspAwA3AwAgA0HQDWogA0HIAGoiDCkDADcDACADQdgNaiADQdAAaiINKQMANwMAIANB4A1qIANB2ABqIg4pAwA3AwAgAyADKQMANwOIDSADIAMpAzA3A7gNIANByAtqIgggA0GIDWpB4AD8CgAAIANBqAxqIgYgCBBeIANBkA5qIAkpAwA3AwAgA0GIDmogBykDADcDACADQYAOaiAFKQMANwMAIANB+A1qIAQpAwA3AwAgA0HwDWogAikDADcDACADQaAOaiAKKQMANwMAIANBqA5qIAspAwA3AwAgA0GwDmogDCkDADcDACADQbgOaiANKQMANwMAIANBwA5qIA4pAwA3AwAgAyADKQMANwPoDSADIAMpAzA3A5gOIANB6ApqIgggBiADQegNahA/IANB0A5qIAIpAwA3AwAgA0HYDmogBCkDADcDACADQeAOaiAFKQMANwMAIANB6A5qIAcpAwA3AwAgA0HwDmogCSkDADcDACADQYAPaiAKKQMANwMAIANBiA9qIAspAwA3AwAgA0GQD2ogDCkDADcDACADQZgPaiANKQMANwMAIANBoA9qIA4pAwA3AwAgAyADKQMANwPIDiADIAMpAzA3A/gOIAYgA0GYCGogA0HIDmoQdyADQYgKaiICIAggBhDVASAGIAIgA0HICGoQ1QEgDyAGEKYEIAMoAvwHIgIEQCADKAKACCACQQJ0EN8ECwJAIAMoAvQBIgJFDQAgAiACQQxsQRNqQXhxIgVqQQlqIgJFDQAgAygC8AEgBWsgAhDfBAsgAygC8AQiAkGAgICAeEYgAkVyRQRAIAMoAvQEIAJBAnQQ3wQLDQAgA0HwAWoiAiADQeAA/AoAACADQcgOaiIGIAIQ9wMgAygCzA4hAiADKALIDiEEIAMoAtAOIgVBAkcNASACKAIEIQUgAigCACEHIAYgAkEIakHYAPwKAAAgBARAIAIgBEEwbBDfBAsgA0H4DWogA0HQDmopAwA3AwAgA0GADmogA0HYDmopAwA3AwAgA0GIDmogA0HgDmopAwA3AwAgA0GQDmogA0HoDmopAwA3AwAgA0GgDmogA0H4DmopAwA3AwAgA0GoDmogA0GAD2opAwA3AwAgA0GwDmogA0GID2opAwA3AwAgA0G4DmogA0GQD2opAwA3AwAgA0HADmogA0GYD2opAwA3AwAgAyAFNgLsDSADIAc2AugNIAMgAykDyA43A/ANIAMgAykD8A43A5gOIANB8AFqIgIgAUHgAPwKAAAgA0HIDmogAhD3AyADKALMDiEBIAMoAsgOIQIgAygC0A4iBEECRw0CIAEoAgQhBCABKAIAIQUgA0GIDWogAUEIakHYAPwKAAAgAgRAIAEgAkEwbBDfBAsgA0HYDmogA0GQDWoiASkDADcDACADQeAOaiADQZgNaikDADcDACADQegOaiADQaANaikDADcDACADQfAOaiADQagNaikDADcDACADQYAPaiADQbgNaikDADcDACADQYgPaiADQcANaikDADcDACADQZAPaiADQcgNaikDADcDACADQZgPaiADQdANaikDADcDACADQaAPaiADQdgNaikDADcDACADIAQ2AswOIAMgBTYCyA4gAyADKQOIDTcD0A4gAyADKQOwDTcD+A4gA0HIC2oiAiADQegNahCmASADQQA2ApANIANCgICAgBA3AogNIANB0P/AADYC9AEgA0KggICADjcC+AEgAyADQYgNaiIENgLwASACIANB8AFqIgIQxQINBSADQcgBaiABKAIANgIAIAMgAykCiA03A8ABIANBqAxqIgUgA0GYDmoQpgEgA0EANgKQDSADQoCAgIAQNwKIDSADQdD/wAA2AvQBIANCoICAgA43AvgBIAMgBDYC8AEgBSACEMUCDQUgA0HYAWogASgCADYCACADIAMpAogNNwPQASAEIANByA5qEKYBIANBADYC8AogA0KAgICAEDcC6AogA0HQ/8AANgL0ASADQqCAgIAONwL4ASADIANB6ApqIgE2AvABIAQgAhDFAg0FIANB6AFqIANB8ApqKAIANgIAIAMgAykC6Ao3A+ABIAIgA0H4DmoQpgEgA0EANgLQCCADQoCAgIAQNwLICCADQdD/wAA2AqwJIANCoICAgA43ArAJIAMgA0HICGo2AqgJIAIgA0GoCWoQxQINBSADQaAIaiADQdAIaigCADYCACADIAMpAsgINwOYCCADQQU2AowKIANB7IPBADYCiAogA0IENwKUCiADQoCAgIDABCIQIANBmAhqrYQ3A4ALIAMgECADQeABaq2ENwP4CiADIBAgA0HQAWqthDcD8AogAyAQIANBwAFqrYQ3A+gKIAMgATYCkAogAEEEaiADQYgKahDSAiADKAKYCCIBBEAgAygCnAggARDfBAsgAygC4AEiAQRAIAMoAuQBIAEQ3wQLIAMoAtABIgEE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AkAgFUIgiKcgA0H4////B0tyDQACfyADRQRAQQghBUEADAELQdHOxQAtAAAaQQghBiADQQgQ1gQiBUUNASAJCyEMAkACQAJAAkAgCUECTwRAIApBB3EhBiAKQQFrQQdPDQEgBSEDDAILIAUhAyAJDQIMAwsgCkF4cSEIIAUhAwNAIANCADcDACADQShqQgA3AwAgA0EgakIANwMAIANBGGpCADcDACADQRBqQgA3AwAgA0EIakIANwMAIANBMGpCADcDACADQThqQgA3AwAgA0FAa0IANwMAIANByABqQgA3AwAgA0HQAGpCADcDACADQdgAakIANwMAIANB4ABqQgA3AwAgA0HoAGpCADcDACADQfAAakIANwMAIANB+ABqQgA3AwAgA0GAAWpCADcDACADQYgBakIANwMAIANBuAFqQgA3AwAgA0GwAWpCADcDACADQagBakIANwMAIANBoAFqQgA3AwAgA0GYAWpCADcDACADQZABakIANwMAIANBwAFqQgA3AwAgA0HIAWpCADcDACADQdABakIANwMAIANB2AFqQgA3AwAgA0HgAWpCADcDACADQegBakIANwMAIANB8AFqQgA3AwAgA0H4AWpCADcDACADQYACakIANwMAIANBiAJqQgA3AwAgA0GQAmpCADcDACADQZgCakIANwMAIANByAJqQgA3AwAgA0HAAmpCADcDACADQbgCakIANwMAIANBsAJqQgA3AwAgA0GoAmpCADcDACADQaACakIANwMAIANB+AJqQgA3AwAgA0HwAmpCADcDACADQegCakIANwMAIANB4AJqQgA3AwAgA0HYAmpCADcDACADQdACakIANwMAIANBgANqIQMgCEEIayIIDQALCyAGRQ0AA0AgA0IANwMAIANBKGpCADcDACADQSBqQgA3AwAgA0EYakIANwMAIANBEGpCADcDACADQQhqQgA3AwAgA0EwaiEDIAZBAWsiBg0ACwsgA0IANwMAIANBKGpCADcDACADQSBqQgA3AwAgA0EYakIANwMAIANBEGpCADcDACADQQhqQgA3AwALIAEoAggiB0UNAiACKAIIIgZFDQIgASgCBCIIIAdBMGxqIRAgAigCBCINQTBBACAGG2ohESANIAZBMGxqIRIgCEEwaiEDIAdBAWtB/////wBxIRMgBkEBa0H/////AHEhFANAIAghByADIQggDiIPQQFqIQ5BACEBIBEhAyANIQYDQCADIQICQAJAAkACQAJAAkACQCAJIAEgD2oiC0sEQCAHKQMAIR4gBykDCCEfIAcpAxAhICAHKQMYISEgBykDICEiIAcpAyghI0IAIRtBKCEDQgAhGEIAIRVCACEaQgAhFkIAIRkDQCAEQfAAaiADIAZqKQMAIhdCACAjQgAQyQMgBEGAAWogF0IAICJCABDJAyAEQZABaiAXQgAgIUIAEMkDIARBoAFqIBdCACAgQgAQyQMgBEGwAWogF0IAIB9CABDJAyAEQcABaiAXQgAgHkIAEMkDIARB4ABqIAQpA3AiHCAZfCIdQgBCAEL9//P/z///+Yl/EMkDIARB0ABqIAQpA2giF0IAQqvV/v///7//uX9CABDJAyAEQUBrIBdCAEL//8+K6///1R5CABDJAyAEQTBqIBdCAEKk7MO1j9S0mOcAQgAQyQMgBEEgaiAXQgBCv6WUnM/w0rvkAEIAEMkDIARBEGogF0IAQtfZrprk9umNywBCABDJAyAEIBdCAEKazf/Lo73EgBpCABDJAyAEKQMIIAQpA8ABIiQgG3wiFyAEKQO4ASAEKQOwASIZIBh8IhggGVStfCAYIBggBCkDqAEgBCkDoAEiGSAVfCIVIBlUrXwgFSAVIAQpA5gBIAQpA5ABIhkgGnwiGiAZVK18IBogBCkDiAEgBCkDgAEiGSAWfCIWIBlUrXwgFiAEKQN4IBwgHVatfHwiGSAWVK18fCIWIBpUrXx8IhVWrXx8IhhWrXx8IhwgBCkDAHwiGyAcVK18IBsgBCkDGCAYIBggBCkDEHwiGFatfCAYIAQpAyggFSAVIAQpAyB8IhVWrXwgFSAEKQM4IBYgFiAEKQMwfCIWVq18IBYgFiAEKQNIIBkgBCkDQCIZfCIaIBlUrXwgGiAEKQNYIB0gBCkDUCIdfCAdVK18fCIZIBpUrXx8IhZWrXx8IhogFVStfHwiFSAYVK18fCIYIBtUrXwgFyAcVq0gBCkDyAEgFyAkVK18fHwhGyADQQhrIgNBeEcNAAsgBSALQTBsaiEDIBtCms3/y6O9xIAaVg0GIBtCms3/y6O9xIAaUQ0BDAILIAsgCUGMyMIAENkDAAsgGELX2a6a5PbpjcsAVg0EIBhC19mumuT26Y3LAFIEQEKazf/Lo73EgBohGwwBCyAVQr+llJzP8NK75ABWDQRC19mumuT26Y3LACEeIBVCv6WUnM/w0rvkAFIEQEKazf/Lo73EgBohGwwCCyAaQqTsw7WP1LSY5wBWDQRCv6WUnM/w0rvkACEcIBpCpOzDtY/UtJjnAFIEQEKazf/Lo73EgBohGwwDCyAWQv//z4rr///VHlYNBEKk7MO1j9S0mOcAIR0gFkL//8+K6///1R5RDQNCms3/y6O9xIAaIRsgFiEXDAULIBghHgsgFSEcCyAaIR0gFiEXDAILQv//z4rr///VHiEXIBlCqtX+////v/+5f1YNAEKazf/Lo73EgBohGwwBCyAWQv//z4rr///VHn0iHSAZQqvV/v///7//uX9UrSIcfSEXIBpCpOzDtY/UtJjnAH0iHiAWQv//z4rr///VHlQgHCAdVnKtIhZ9IR0gFUK/pZScz/DSu+QAfSIfIBpCpOzDtY/UtJjnAFQgFiAeVnKtIhZ9IRwgGELX2a6a5PbpjcsAfSIaIBVCv6WUnM/w0rvkAFQgFiAfVnKtIhV9IR4gGyAYQtfZrprk9umNywBUIBUgGlZyrX1Cms3/y6O9xIAafSEbIBlC1aqBgICAwIDGAHwhGQtCms3/y6O9xIAaIRYgAykDACAbfCAeIAMpAwh8IhUgHlQgFSAcIBwgAykDEHwiHFYgHCAcIB0gHSADKQMYfCIdViAdIBcgFyADKQMgfCIXViAXIBkgAykDKHwiGyAZVK18IhggF1RyrXwiGiAdVHKtfCIcVnKtfCIZIBVUcq18Ih4hFQJAAkACQCAeQprN/8ujvcSAGlINAELX2a6a5PbpjcsAIRYgGSIVQtfZrprk9umNywBSDQBCv6WUnM/w0rvkACEWIBwiFUK/pZScz/DSu+QAUg0AQqTsw7WP1LSY5wAhFiAaIhVCpOzDtY/UtJjnAFINAEL//8+K6///1R4hFiAYIhVC///Piuv//9UeUg0AQqvV/v///7//uX8hFiAbIhVCq9X+////v/+5f1ENAQsgFSAWWg0AIBkhFSAcIRcgGiEWIBghHQwBCyAYQv//z4rr///VHn0iFSAbQqvV/v///7//uX9UrSIWfSEdIBpCpOzDtY/UtJjnAH0iFyAYQv//z4rr///VHlQgFSAWVHKtIhV9IRYgHEK/pZScz/DSu+QAfSIYIBpCpOzDtY/UtJjnAFQgFSAXVnKtIhV9IRcgGULX2a6a5PbpjcsAfSIaIBxCv6WUnM/w0rvkAFQgFSAYVnKtIhh9IRUgHiAZQtfZrprk9umNywBUIBggGlZyrX1Cms3/y6O9xIAafSEeIBtC1aqBgICAwIDGAHwhGwsgAyAbNwMoIAMgHTcDICADIBY3AxggAyAXNwMQIAMgFTcDCCADIB43AwAgAkEwQQAgAiASRxtqIQMgASAURiACIQYgAUEBaiEBRQ0ACyAIQTBBACAIIBBHG2ohAyAPIBNHDQALDAILIAYgA0H8x8IAEMgEAAtBCEEwEP8EAAsgACAKNgIMIAAgCTYCCCAAIAU2AgQgACAMNgIAIARB0AFqJAALmJ8DAokBfxR+IwBBkDlrIgckACAHIAE2AgwgB0EYaiACQQhqKAIANgIAIAcgAikCADcDECAHQShqIAJBFGooAgA2AgAgByACKQIMNwMgIAdBOGogAkEgaigCADYCACAHIAIpAhg3AzAgB0HIAGogAkEsaigCADYCACAHIAIpAiQ3A0AgB0HYAGogAkE4aigCADYCACAHIAIpAjA3A1AgB0HoAGogAkHEAGooAgA2AgAgByACKQI8NwNgIAdB+ABqIAJB0ABqKAIANgIAIAcgAikCSDcDcCAHQYgBaiACQdwAaigCADYCACAHIAIpAlQ3A4ABIAdBmAFqIAJB6ABqKAIANgIAIAcgAikCYDcDkAEgB0GoAWogAkH0AGooAgA2AgAgByACKQJsNwOgASAHQbgBaiACQYABaigCADYCACAHIAIpAng3A7ABIAdByAFqIAJBjAFqKAIANgIAIAcgAikChAE3A8ABAkACQAJAAkAgAQ4CAAECCyAHQZAGaiAHQRBqEPcCIAdBsAZqIgEgB0EgahD3AiAHQdAGaiAHQTBqEPcCIAdB8AZqIgIgB0FAaxD3AiAHQZAHaiAHQdAAahD3AiAHQbAHaiIDIAdB4ABqEPcCIAdBiAVqIAdByAZqKQMANwMAIAdBgAVqIAdBwAZqKQMANwMAIAdB+ARqIAdBuAZqKQMANwMAIAdB8ARqIAEpAwA3AwAgB0HoBGogB0GoBmopAwA3AwAgB0HgBGogB0GgBmopAwA3AwAgB0HYBGogB0GYBmopAwA3AwAgB0GYBWogB0HYBmopAwA3AwAgB0GgBWogB0HgBmopAwA3AwAgB0GoBWogB0HoBmopAwA3AwAgB0GwBWogAikDADcDACAHQbgFaiAHQfgGaikDADcDACAHQcAFaiAHQYAHaikDADcDACAHQcgFaiAHQYgHaikDADcDACAHIAcpA5AGNwPQBCAHIAcpA9AGNwOQBSAHQYgGaiAHQcgHaikDADcDACAHQYAGaiAHQcAHaikDADcDACAHQfgFaiAHQbgHaikDADcDACAHQfAFaiADKQMANwMAIAdB6AVqIAdBqAdqKQMANwMAIAdB4AVqIAdBoAdqKQMANwMAIAdB2AVqIAdBmAdqKQMANwMAIAcgBykDkAc3A9AFIAdBkAlqIAdB8ABqEPcCIAdBsAlqIgEgB0GAAWoQ9wIgB0HQCWogB0GQAWoQ9wIgB0HwCWoiAiAHQaABahD3AiAHQZAKaiAHQbABahD3AiAHQbAKaiIDIAdBwAFqEPcCIAdBiAhqIAdByAlqKQMANwMAIAdBgAhqIAdBwAlqKQMANwMAIAdB+AdqIAdBuAlqKQMANwMAIAdB8AdqIAEpAwA3AwAgB0HoB2ogB0GoCWopAwA3AwAgB0HgB2ogB0GgCWopAwA3AwAgB0HYB2ogB0GYCWopAwA3AwAgB0GYCGogB0HYCWopAwA3AwAgB0GgCGogB0HgCWopAwA3AwAgB0GoCGogB0HoCWopAwA3AwAgB0GwCGogAikDADcDACAHQbgIaiAHQfgJaikDADcDACAHQcAIaiAHQYAKaikDADcDACAHQcgIaiAHQYgKaikDADcDACAHIAcpA5AJNwPQByAHIAcpA9AJNwOQCCAHQYgJaiAHQcgKaikDADcDACAHQYAJaiAHQcAKaikDADcDACAHQfgIaiAHQbgKaikDADcDACAHQfAIaiADKQMANwMAIAdB6AhqIAdBqApqKQMANwMAIAdB4AhqIAdBoApqKQMANwMAIAdB2AhqIAdBmApqKQMANwMAIAcgBykDkAo3A9AIIAdB0AFqIhYgB0HQBGpBwAH8CgAAIAdBkANqIAdB0AdqQcAB/AoAACAHQZAnaiF6IwBB0C5rIgYkACAGQYgqakG0jcAAQcAAELcCIAZBgAdqIAYpA6AqIowBQgBCifWrnLWLv5ZzQgAQyQMgBkHAB2ogBikDmCoijgFCAEKJ9auctYu/lnNCABDJAyAGQYAIaiAGKQOQKiKNAUIA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NwOIKiAGQcgtaiAXKQMANwMAIAZBwC1qIBgpAwA3AwAgBkG4LWogGykDADcDACAGQbAtaiAcKQMANwMAIAZBqC1qIB0pAwA3AwAgBkGgLWogHykDADcDACAGQZgtaiAgKQMANwMAIAYgBikDiCo3A5AtIBkgHhC9AyAkIAEpAwAijAE3AwAgJyACKQMAIo4BNwMAICggAykDACKNATcDACApIAQpAwAikAE3AwAgIiAFKQMANwMAICMgESkDADcDACAlIAgpAwA3AwAgDyCQATcDACAUII0BNwMAIAsgjgE3AwAgCSCMATcDACAGIAYpA4gnIowBNwOIJCAGIIwBNwOIISAXIAkpAwA3AwAgGCALKQMANwMAIBsgFCkDADcDACAcIA8pAwA3AwAgHSAlKQMANwMAIB8gIykDADcDACAgICIpAwA3AwAgBiAGKQOIITcDiCogBkGILmogFykDADcDACAGQYAuaiAYKQMANwMAIAZB+C1qIBspAwA3AwAgBkHwLWogHCkDADcDACAGQegtaiAdKQMANwMAIAZB4C1qIB8pAwA3AwAgBkHYLWogICkDADcDACAGIAYpA4gqNwPQLSAZIB4QvQMgJCABKQMAIowBNwMAICcgAikDACKOATcDACAoIAMpAwAijQE3AwAgKSAEKQMAIpABNwMAICIgBSkDADcDACAjIBEpAwA3AwAgJSAIKQMANwMAIA8gkAE3AwAgFCCNATcDACALII4BNwMAIAkgjAE3AwAgBiAGKQOIJyKMATcDiCQgBiCMATcDiCEgFyAJKQMANwMAIBggCykDADcDACAbIBQpAwA3AwAgHCAPKQMANwMAIB0gJSkDADcDACAfICMpAwA3AwAgICAiKQMANwMAIAYgBikDiCE3A4gqIAZByC5qIBcpAwA3AwAgBkHALmogGCkDADcDACAGQbguaiAbKQMANwMAIAZBsC5qIBwpAwA3AwAgBkGoLmogHSkDADcDACAGQaAuaiAfKQMANwMAIAZBmC5qICApAwA3AwAgBiAGKQOIKjcDkC4gBkGIGGoiNCAGQZAtaiIvQcAB/AoAACAGIBZBgANqNgKMGyAGICE2AogbIAZBiCRqInsiLSAGQYgbaiIwEL0DIAkgJCkDACKMATcDACALICcpAwAijgE3AwAgFCAoKQMAIo0BNwMAIA8gKSkDACKQATcDACAGQZAeaiIWIAZBkCRqIjEpAwA3AwAgBkGYHmoiGSAGQZgkaiIyKQMANwMAIAZBoB5qIh4gBkGgJGoiMykDADcDACAGQageaiIhIJABNwMAIAZBsB5qIiYgjQE3AwAgBkG4HmoiKiCOATcDACAGQcAeaiIsIIwBNwMAIAYgBikDiCQijAE3A4ghIAYgjAE3A4geIAEgLCkDADcDACACICopAwA3AwAgAyAmKQMANwMAIAQgISkDADcDACAIIB4pAwA3AwAgESAZKQMANwMAIAUgFikDADcDACAGIAYpA4geNwOIJyAXIAEpAwA3AwAgGCACKQMANwMAIBsgAykDADcDACAcIAQpAwA3AwAgHSAIKQMANwMAIB8gESkDADcDACAgIAUpAwA3AwAgBiAGKQOIJzcDiCogLSAwEL0DIAkgJCkDACKMATcDACALICcpAwAijgE3AwAgFCAoKQMAIo0BNwMAIA8gKSkDACKQATcDACAWIDEpAwA3AwAgGSAyKQMANwMAIB4gMykDADcDACAhIJABNwMAICYgjQE3AwAgKiCOATcDACAsIIwBNwMAIAYgBikDiCQijAE3A4ghIAYgjAE3A4geIAEgLCkDADcDACACICopAwA3AwAgAyAmKQMANwMAIAQgISkDADcDACAIIB4pAwA3AwAgESAZKQMANwMAIAUgFikDADcDACAGIAYpA4geNwOIJyAGQYAraiABKQMANwMAIAZB+CpqIAIpAwA3AwAgBkHwKmogAykDADcDACAGQegqaiAEKQMANwMAIAZB4CpqIAgpAwA3AwAgBkHYKmogESkDADcDACAGQdAqaiAFKQMANwMAIAYgBikDiCc3A8gqIC0gMBC9AyAJICQpAwAijAE3AwAgCyAnKQMAIo4BNwMAIBQgKCkDACKNATcDACAPICkpAwAikAE3AwAgFiAxKQMANwMAIBkgMikDADcDACAeIDMpAwA3AwAgISCQATcDACAmII0BNwMAICogjgE3AwAgLCCMATcDACAGIAYpA4gkIowBNwOIISAGIIwBNwOIHiABICwpAwA3AwAgAiAqKQMANwMAIAMgJikDADcDACAEICEpAwA3AwAgCCAeKQMANwMAIBEgGSkDADcDACAFIBYpAwA3AwAgBiAGKQOIHjcDiCcgBkHAK2ogASkDADcDACAGQbgraiAC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IAJBoOsIaiIhIJABNwMAIAJBqOsIaiImII0BNwMAIAJBsOsIaiIqII4BNwMAIAJBuOsIaiIsIIwBNwMAIAIgAikDgPEIIowBNwOA7gggAiCMATcDgOsIIAEgLCkDADcDACADICopAwA3AwAgBCAmKQMANwMAIAUgISkDADcDACARIB4pAwA3AwAgDyAZKQMANwMAIAggFikDADcDACACIAIpA4DrCDcDgPQIIBsgASkDADcDACAcIAMpAwA3AwAgHSAEKQMANwMAIB8gBSkDADcDACAgIBEpAwA3AwAgIiAPKQMANwMAICMgCCkDADcDACACIAIpA4D0CDcDgPcIIC0gMBC9AyAYICUpAwAijAE3AwAgFyAkKQMAIo4BNwMAIAkgJykDACKNATcDACALICgpAwAikAE3AwAgFCApKQMAIo8BNwMAIBYgMSkDADcDACAZIDIpAwA3AwAgHiCPATcDACAhIJABNwMAICYgjQE3AwAgKiCOATcDACAsIIwBNwMAIAIgAikDgPEIIowBNwOA7gggAiCMATcDgOsIIAEgLCkDADcDACADICopAwA3AwAgBCAmKQMANwMAIAUgISkDADcDACARIB4pAwA3AwAgDyAZKQMANwMAIAggFikDADcDACACIAIpA4DrCDcDgPQIIAJB+PcIaiABKQMANwMAIAJB8PcIaiADKQMANwMAIAJB6PcIaiAEKQMANwMAIAJB4PcIaiAFKQMANwMAIAJB2PcIaiARKQMANwMAIAJB0PcIaiAPKQMANwMAIAJByPcIaiAIKQMANwMAIAIgAikDgPQINwPA9wggLSAwEL0DIBggJSkDACKMATcDACAXICQpAwAijgE3AwAgCSAnKQMAIo0BNwMAIAsgKCkDACKQATcDACAUICkpAwAijwE3AwAgFiAxKQMANwMAIBkgMikDADcDACAeII8BNwMAICEgkAE3AwAgJiCNATcDACAqII4BNwMAICwgjAE3AwAgAiACKQOA8QgijAE3A4DuCCACIIwBNwOA6wggASAsKQMANwMAIAMgKikDADcDACAEICYpAwA3AwAgBSAhKQMANwMAIBEgHikDADcDACAPIBkpAwA3AwAgCCAWKQMANwMAIAIgAikDgOsINwOA9AggAkG4+AhqIAEpAwA3AwAgAkGw+AhqIAMpAwA3AwAgAkGo+AhqIAQpAwA3AwAgAkGg+AhqIAUpAwA3AwAgAkGY+AhqIBEpAwA3AwAgAkGQ+AhqIA8pAwA3AwAgAkGI+AhqIAgpAwA3AwAgAiACKQOA9Ag3A4D4CCAvIAJBgPcIaiIFQcAB/AoAACACQcD7CGogL0HAAfwKAAAgAiAzQYAD/AoAACACQYAGaiIDIAJBARB0IAJBgANqIgEgA0GAA/wKAAAgAkGACWoiDyACIAEQ9gEgAkGADGoiAyACIA8Q9gEgAkGAD2oifiACIAMQ9gEgAkGAEmoiLSABIH4Q9gEgAkGAFWoiGyABIC0Q9gEgAkGAGGoiIyABIBsQ9gEgAkGAG2oifyABICMQ9gEgAkGAHmoiJSABIH8Q9gEgAkGAIWoiHCABICUQ9gEgAkGAJGoiQSABIBwQ9gEgAkGAJ2oiQiABIEEQ9gEgAkGAKmoiMCABIEIQ9gEgAkGALWoiUyABIDAQ9gEgAkGAMGoiJCABIFMQ9gEgAkGAM2oiJyABICQQ9gEgAkGANmoiVCABICcQ9gEgAkGAOWoiOCABIFQQ9gEgAkGAPGoiHSABIDgQ9gEgAkGAP2oiDCABIB0Q9gEgAkGAwgBqIkMgASAMEPYBIAJBgMUAaiJpIAEgQxD2ASACQYDIAGoiSyABIGkQ9gEgAkGAywBqIhQgASBLEPYBIAJBgM4AaiJVIAEgFBD2ASACQYDRAGoiRCABIFUQ9gEgAkGA1ABqIkUgASBEEPYBIAJBgNcAaiKAASABIEUQ9gEgAkGA2gBqIiggASCAARD2ASACQYDdAGoiViABICgQ9gEgAkGA4ABqIjEgASBWEPYBIAJBgOMAaiJqIAEgMRD2ASACQYDmAGoiayABIGoQ9gEgAkGA6QBqImwgASBrEPYBIAJBgOwAaiIrIAEgbBD2ASACQYDvAGoibSABICsQ9gEgAkGA8gBqIjIgASBtEPYBIAJBgPUAaiIfIAEgMhD2ASACQYD4AGoiiAEgASAfEPYBIAJBgPsAaiIpIAEgiAEQ9gEgAkGA/gBqIm4gASApEPYBIAJBgIEBaiJGIAEgbhD2ASACQYCEAWoiFiABIEYQ9gEgAkGAhwFqIjMgASAWEPYBIAJBgIoBaiJvIAEgMxD2ASACQYCNAWoigQEgASBvEPYBIAJBgJABaiIZIAEggQEQ9gEgAkGAkwFqIjQgASAZEPYBIAJBgJYBaiJwIAEgNBD2ASACQYCZAWoiESABIHAQ9gEgAkGAnAFqInEgASAREPYBIAJBgJ8BaiJyIAEgcRD2ASACQYCiAWoiGiABIHIQ9gEgAkGApQFqInMgASAaEPYBIAJBgKgBaiILIAEgcxD2ASACQYCrAWoiNSABIAsQ9gEgAkGArgFqIh4gASA1EPYBIAJBgLEBaiJ0IAEgHhD2ASACQYC0AWoiVyABIHQQ9gEgAkGAtwFqIlggASBXEPYBIAJBgLoBaiJZIAEgWBD2ASACQYC9AWoiRyABIFkQ9gEgAkGAwAFqIoIBIAEgRxD2ASACQYDDAWoiNiABIIIBEPYBIAJBgMYBaiJJIAEgNhD2ASACQYDJAWoidSABIEkQ9gEgAkGAzAFqIkogASB1EPYBIAJBgM8BaiKDASABIEoQ9gEgAkGA0gFqIlogASCDARD2ASACQYDVAWoiCSABIFoQ9gEgAkGA2AFqIg4gASAJEPYBIAJBgNsBaiJbIAEgDhD2ASACQYDeAWoiDSABIFsQ9gEgAkGA4QFqIlwgASANEPYBIAJBgOQBaiJdIAEgXBD2ASACQYDnAWoiTCABIF0Q9gEgAkGA6gFqIoQBIAEgTBD2ASACQYDtAWoiXiABIIQBEPYBIAJBgPABaiIXIAEgXhD2ASACQYDzAWoidiABIBcQ9gEgAkGA9gFqIncgASB2EPYBIAJBgPkBaiI3IAEgdxD2ASACQYD8AWoiOSABIDcQ9gEgAkGA/wFqIk0gASA5EPYBIAJBgIICaiJfIAEgTRD2ASACQYCFAmoiTiABIF8Q9gEgAkGAiAJqIhIgASBOEPYBIAJBgIsCaiIgIAEgEhD2ASACQYCOAmoieCABICAQ9gEgAkGAkQJqIoUBIAEgeBD2ASACQYCUAmoiISABIIUBEPYBIAJBgJcCaiKGASABICEQ9gEgAkGAmgJqInkgASCGARD2ASACQYCdAmoiYCABIHkQ9gEgAkGAoAJqIiIgASBgEPYBIAJBgKMCaiImIAEgIhD2ASACQYCmAmoiGCABICYQ9gEgAkGAqQJqIhAgASAYEPYBIAJBgKwCaiJPIAEgEBD2ASACQYCvAmoiigEgASBPEPYBIAJBgLICaiJhIAEgigEQ9gEgAkGAtQJqIlAgASBhEPYBIAJBgLgCaiIqIAEgUBD2ASACQYC7AmoiYiABICoQ9gEgAkGAvgJqImMgASBiEPYBIAJBgMECaiI6IAEgYxD2ASACQYDEAmoiZCABIDoQ9gEgAkGAxwJqIkggAyBkEPYBIAJBgMoCaiJlIAEgSBD2ASACQYDNAmoiZiABIGUQ9gEgAkGA0AJqIosBIAEgZhD2ASACQYDTAmoiOyABIIsBEPYBIAJBgNYCaiJnIAEgOxD2ASACQYDZAmoiLCABIGcQ9gEgAkGA3AJqIi8gASAsEPYBIAJBgN8CaiI8IAEgLxD2ASACQYDiAmoiLiABIDwQ9gEgAkGA5QJqIj0gASAuEPYBIAJBgOgCaiI+IAEgPRD2ASACQYDrAmoiaCABID4Q9gEgAkGA7gJqIlEgASBoEPYBIAJBgPECaiITIAEgURD2ASACQYD0AmoiPyABIBMQ9gEgAkGA9wJqIgggASA/EPYBIAJBgPoCaiJSIAEgCBD2ASACQYD9AmoiQCABIFIQ9gEgAkGAgANqIocBIAEgQBD2ASACQYCDA2oiFSABIIcBEPYBIAJBgO4IaiIBIA8gFRD2ASB8IgMgAUEHEHQgCiIEIAMgORD2ASAFIARBCBB0IAJBgIYDaiIKIAUgZBD2ASABIApBCRB0IAMgASBXEPYBIAQgA0EJEHQgBSAEIE4Q9gEgAkGAiQNqIgogBUEIEHQgASBLIAoQ9gEgAyABQQsQdCAEIAMgHRD2ASAFIARBCxB0IAJBgIwDaiIKIAUgLBD2ASABIApBCBB0IAMgASAXEPYBIAQgA0EIEHQgBSAEIBAQ9gEgAkGAjwNqIgogBUEMEHQgASAIIAoQ9gEgAyABQQkQdCAEIAMgWhD2ASAFIARBDhB0IAJBgJIDaiIKIAUgNxD2ASABIApBBRB0IAMgASAnEPYBIAQgA0EJEHQgBSAEIEIQ9gEgAkGAlQNqIgogBUEHEHQgASAjIAoQ9gEgAyABQQoQdCAEIAMgHRD2ASAFIARBBxB0IAJBgJgDaiIKIAUgVBD2ASABIApBDBB0IAMgASAYEPYBIAQgA0EIEHQgBSAEICsQ9gEgAkGAmwNqIgogBUEKEHQgASBwIAoQ9gEgAyABQQgQdCAEIAMgERD2ASAFIARBCxB0IAJBgJ4DaiIKIAUgFRD2ASABIApBChB0IAMgASBlEPYBIAQgA0EKEHQgBSAEIBwQ9gEgAkGAoQNqIgogBUENEHQgASAyIAoQ9gEgAyABQQYQdCAEIAMgMBD2ASAFIARBDxB0IAJBgKQDaiIKIAUgNRD2ASABIApBDBB0IAMgASAsEPYBIAQgA0EHEHQgBSAEIIIBEPYBIAJBgKcDaiIKIAVBCRB0IAEgQCAKEPYBIAMgAUEIEHQgBCADIEAQ9gEgBSAEQQkQdCACQYCqA2oiCiAFIBIQ9gEgASAKQQsQdCADIAEgGBD2ASAEIANBCRB0IAUgBCAXEPYBIAJBgK0DaiIKIAVBBxB0IAEgGiAKEPYBIAMgAUEIEHQgBCADIB4Q9gEgBSAEQQcQdCACQYCwA2oiCiAFIFUQ9gEgASAKQQoQdCADIAEgTxD2ASAEIANBBhB0IAUgBCAkEPYBIAJBgLMDaiIKIAVBCxB0IAEgGCAKEPYBIAMgAUEJEHQgBCADIEwQ9gEgBSAEQQsQdCACQYC2A2oiCiAFIE0Q9gEgASAKQQkQdCADIAEgKRD2ASAEIANBCRB0IAUgBCAREPYBIAJBgLkDaiIKIAVBBxB0IAEgKCAKEPYBIAMgAUEHEHQgBCADIDAQ9gEgBSAEQQwQdCACQYC8A2oiCiAFICcQ9gEgASAKQQsQdCADIAEgPBD2ASAEIANBBhB0IAUgBCBDEPYBIAJBgL8DaiIKIAVBChB0IAEgQyAKEPYBIAMgAUEMEHQgBCADICEQ9gEgBSAEQQcQdCACQYDCA2oiCiAFIDYQ9gEgASAKQQwQdCADIAEgTRD2ASAEIANBCBB0IAUgBCATEPYBIAJBgMUDaiIKIAVBBBB0IAEgGyAKEPYBIAMgAUENEHQgBCADIA4Q9gEgBSAEQQgQdCACQYDIA2oiCiAFICkQ9gEgASAKQQUQdCADIAEgGxD2ASAEIANBDBB0IAUgBCA5EPYBIAJBgMsDaiIKIAVBCBB0IAEgWyAKEPYBIAMgAUEHEHQgBCADIDMQ9gEgBSAEQQgQdCACQYDOA2oiCiAFIB8Q9gEgASAKQQUQdCADIAEgIxD2ASAEIANBDRB0IAUgBCAfEPYBIAJBgNEDaiIKIAVBDRB0IAEgISAKEPYBIAMgAUEIEHQgBCADIGIQ9gEgBSAEQQcQdCACQYDUA2oiCiAFIBYQ9gEgASAKQQsQdCADIAEgHhD2ASAEIANBChB0IAUgBCB1EPYBIAJBgNcDaiIKIAVBCRB0IAEgIiAKEPYBIAMgAUELEHQgBCADIDwQ9gEgBSAEQQgQdCACQYDaA2oiCiAFID0Q9gEgASAKQQIQdCADIAEgDxD2ASAEIANBDRB0IAUgBCAzEPYBIAJBgN0DaiIKIAVBBxB0IAEgFCAKEPYBIAMgAUEMEHQgBCADIBIQ9gEgBSAEQQ0QdCACQYDgA2oiCiAFIDEQ9gEgASAKQQcQdCADIAEgJxD2ASAEIANBBxB0IAUgBCAlEPYBIAJBgOMDaiIKIAVBCRB0IAEgQSAKEPYBIAMgAUEKEHQgBCADIDgQ9gEgBSAEQQwQdCACQYDmA2oiCiAFIEsQ9gEgASAKQQoQdCADIAEgLBD2ASAEIANBChB0IAUgBCAiEPYBIAJBgOkDaiIKIAVBCRB0IAEgYyAKEPYBIAMgAUEKEHQgBCADICAQ9gEgBSAEQQcQdCACQYDsA2oiCiAFIG4Q9gEgASAKQQoQdCADIAEgExD2ASAEIANBCBB0IAUgBCAJEPYBIAJBgO8DaiIKIAVBCBB0IAEgdiAKEPYBIAMgAUEIEHQgBCADIAkQ9gEgBSAEQQgQdCACQYDyA2oiCiAFIAsQ9gEgASAKQQcQdCADIAEgMRD2ASAEIANBDBB0IAUgBCBtEPYBIAJBgPUDaiIKIAVBCxB0IAEgFyAKEPYBIAMgAUEKEHQgBCADIFYQ9gEgBSAEQQsQdCACQYD4A2oiCiAFICIQ9gEgASAKQQsQdCADIAEgIhD2ASAEIANBChB0IAUgBCBmEPYBIAJBgPsDaiIKIAVBDBB0IAEgdyAKEPYBIAMgAUEMEHQgBCADIDwQ9gEgBSAEQQcQdCACQYD+A2oiCiAFIDIQ9gEgASAKQQkQdCADIAEgDRD2ASAEIANBChB0IAUgBCBREPYBIAJBgIEEaiIKIAVBChB0IAEgCSAKEPYBIAMgAUEIEHQgBCADIEoQ9gEgBSAEQQgQdCACQYCEBGoiCiAFIAkQ9gEgASAKQQYQdCADIAEgQxD2ASAEIANBCxB0IAUgBCAXEPYBIAJBgIcEaiIKIAVBCBB0IAEgLiAKEPYBIAMgAUENEHQgBCADIFkQ9gEgBSAEQQcQdCACQYCKBGoiCiAFIB0Q9gEgASAKQQsQdCADIAEgERD2ASAEIANBCRB0IAUgBCAIEPYBIAJBgI0EaiIKIAVBCRB0IAEgGSAKEPYBIAMgAUEKEHQgBCADIGcQ9gEgBSAEQQcQdCACQYCQBGoiCiAFIHEQ9gEgASAKQQkQdCADIAEgOhD2ASAEIANBCBB0IAUgBCBhEPYBIAJBgJMEaiIKIAVBCRB0IAEgTCAKEPYBIAMgAUEOEHQgBCADIDoQ9gEgBSAEQQkQdCACQYCWBGoiCiAFICkQ9gEgASAKQQgQdCADIAEgRhD2ASAEIANBDBB0IAUgBCAZEPYBIAJBgJkEaiIKIAVBCRB0IAEgHiAKEPYBIAMgAUEIEHQgBCADIGoQ9gEgBSAEQQoQdCACQYCcBGoiCiAFIBYQ9gEgASAKQQwQdCADIAEgIBD2ASAEIANBCBB0IAUgBCAXEPYBIAJBgJ8EaiIKIAVBCBB0IAEgNyAKEPYBIAMgAUEIEHQgBCADIA0Q9gEgBSAEQQ4QdCACQYCiBGoiCiAFIDYQ9gEgASAKQQcQdCADIAEgHRD2ASAEIANBCRB0IAUgBCAyEPYBIAJBgKUEaiIKIAVBCBB0IAEgESAKEPYBIAMgAUEJEHQgBCADIFcQ9gEgBSAEQQkQdCACQYCoBGoiCiAFIFEQ9gEgASAKQQcQdCADIAEgGhD2ASAEIANBChB0IAUgBCA+EPYBIAJBgKsEaiIKIAVBCBB0IAEgNSAKEPYBIAMgAUEIEHQgBCADIFMQ9gEgBSAEQQkQdCACQYCuBGoiCiAFIEQQ9gEgASAKQQkQdCADIAEgKxD2ASAEIANBChB0IAUgBCArEPYBIAJBgLEEaiIKIAVBDRB0IAEgYiAKEPYBIAMgAUEMEHQgBCADIHQQ9gEgBSAEQQwQdCACQYC0BGoiCiAFIBIQ9gEgASAKQQQQdCADIAEgIxD2ASAEIANBDBB0IAUgBCAiEPYBIAJBgLcEaiIKIAVBCBB0IAEgZiAKEPYBIAMgAUEHEHQgBCADIDMQ9gEgBSAEQQkQdCACQYC6BGoiCiAFID4Q9gEgASAKQQgQdCADIAEgKhD2ASAEIANBBxB0IAUgBCA2EPYBIAJBgL0EaiIKIAVBChB0IAEgLyAKEPYBIAMgAUEHEHQgBCADIAsQ9gEgBSAEQQoQdCACQYDABGoiCiAFICAQ9gEgASAKQQgQdCADIAEgbBD2ASAEIANBCRB0IAUgBCAqEPYBIAJBgMMEaiIKIAVBCBB0IAEgKiAKEPYBIAMgAUEDEHQgBCADIC0Q9gEgBSAEQQ0QdCACQYDGBGoiCiAFIDsQ9gEgASAKQQgQdCADIAEgHRD2ASAEIANBDBB0IAUgBCA8EPYBIAJBgMkEaiIKIAVBCRB0IAEgDSAKEPYBIAMgAUEGEHQgBCADIIABEPYBIAUgBEEJEHQgAkGAzARqIgogBSBJEPYBIAEgCkEKEHQgAyABICYQ9gEgBCADQQgQdCAFIAQgWxD2ASACQYDPBGoiCiAFQQcQdCABIAsgChD2ASADIAFBChB0IAQgAyA+EPYBIAUgBEEKEHQgAkGA0gRqIgogBSANEPYBIAEgCkEJEHQgAyABID8Q9gEgBCADQQgQdCAFIAQgYRD2ASACQYDVBGoiCiAFQQQQdCABICUgChD2ASADIAFBDBB0IAQgAyB5EPYBIAUgBEEHEHQgAkGA2ARqIgogBSAcEPYBIAEgCkEMEHQgAyABIC4Q9gEgBCADQQYQdCAFIAQgahD2ASACQYDbBGoiLiAFQQMQdCABIAIgLhD2ASADIAFBDhB0IAQgAyALEPYBIAUgBEEIEHQgAkGA3gRqIi4gBSAxEPYBIAEgLkELEHQgAyABIGUQ9gEgBCADQQcQdCAFIAQgERD2ASACQYDhBGoiLiAFQQcQdCABIEQgLhD2ASADIAFBChB0IAQgAyBhEPYBIAUgBEEIEHQgAkGA5ARqIi4gBSAIEPYBIAEgLkEGEHQgAyABICQQ9gEgBCADQQwQdCAFIAQgIRD2ASACQYDnBGoiLiAFQQYQdCABIFQgLhD2ASADIAFBCxB0IAQgAyA1EPYBIAUgBEEJEHQgAkGA6gRqIi4gBSAhEPYBIAEgLkEIEHQgAyABIDoQ9gEgBCADQQUQdCAFIAQgQRD2ASACQYDtBGoiLiAFQQsQdCABIAkgLhD2ASADIAFBBRB0IAQgAyBTEPYBIAUgBEELEHQgAkGA8ARqIi4gBSA7EPYBIAEgLkEIEHQgAyABIFAQ9gEgBCADQQgQdCAFIAQgUhD2ASACQYDzBGoiLiAFQQgQdCABIHggLhD2ASADIAFBCxB0IAQgAyBgEPYBIAUgBEEIEHQgAkGA9gRqIi4gBSAfEPYBIAEgLkEKEHQgAyABIDwQ9gEgBCADQQkQdCAFIAQgJhD2ASACQYD5BGoiLiAFQQgQdCABID0gLhD2ASADIAFBCBB0IAQgAyBHEPYBIAUgBEEKEHQgAkGA/ARqIi4gBSAREPYBIAEgLkEJEHQgAyABIEgQ9gEgBCADQQoQdCAFIAQgORD2ASACQYD/BGoiLiAFQQcQdCABIDYgLhD2ASADIAFBCRB0IAQgAyBPEPYBIAUgBEEIEHQgAkGAggVqIk8gBSAfEPYBIAEgT0EJEHQgAyABIGwQ9gEgBCADQQwQdCAFIAQgUBD2ASACQYCFBWoiTyAFQQMQdCABIC0gTxD2ASADIAFBEhB0IAQgAyBeEPYBIAUgBEEHEHQgAkGAiAVqIk8gBSBvEPYBIAEgT0EJEHQgAyABIGcQ9gEgBCADQQgQdCAFIAQgPxD2ASACQYCLBWoiTyAFQQkQdCABIBcgTxD2ASADIAFBCBB0IAQgAyBKEPYBIAUgBEEIEHQgAkGAjgVqIk8gBSApEPYBIAEgT0EIEHQgAyABIEMQ9gEgBCADQQkQdCAFIAQgERD2ASACQYCRBWoiTyAFQQkQdCABIDkgTxD2ASADIAFBCBB0IAQgAyArEPYBIAUgBEELEHQgAkGAlAVqIisgBSAcEPYBIAEgK0ESEHQgAyABIEcQ9gEgBCADQQkQdCAFIAQgVhD2ASACQYCXBWoiKyAFQQ0QdCABID0gKxD2ASADIAFBBxB0IAQgAyA0EPYBIAUgBEEIEHQgAkGAmgVqIisgBSApEPYBIAEgK0EKEHQgAyABIFoQ9gEgBCADQQgQdCAFIAQgUBD2ASACQYCdBWoiKyAFQQIQdCABIA8gKxD2ASADIAFBDRB0IAQgAyAZEPYBIAUgBEEIEHQgAkGAoAVqIisgBSAzEPYBIAEgK0EJEHQgAyABIB0Q9gEgBCADQQkQdCAFIAQgahD2ASACQYCjBWoiKyAFQQkQdCABIBwgKxD2ASADIAFBDhB0IAQgAyBdEPYBIAUgBEEHEHQgAkGApgVqIisgBSApEPYBIAEgK0EDEHQgAyABIAIQ9gEgBCADQRIQdCAFIAQgRRD2ASACQYCpBWoiKyAFQQgQdCABIEUgKxD2ASADIAFBChB0IAQgAyBfEPYBIAUgBEEGEHQgAkGArAVqIisgBSAkEPYBIAEgK0EIEHQgAyABICcQ9gEgBCADQQwQdCAFIAQgeBD2ASACQYCvBWoiKyAFQQgQdCABIBQgKxD2ASADIAFBChB0IAQgAyB4EPYBIAUgBEEKEHQgAkGAsgVqIisgBSAvEPYBIAEgK0EHEHQgAyABICgQ9gEgBCADQQoQdCAFIAQghQEQ9gEgAkGAtQVqIisgBUEGEHQgASAUICsQ9gEgAyABQQsQdCAEIAMgCRD2ASAFIARBBhB0IAJBgLgFaiIrIAUgGxD2ASABICtBCRB0IAMgASAnEPYBIAQgA0EMEHQgBSAEIEsQ9gEgAkGAuwVqIisgBUEKEHQgASA4ICsQ9gEgAyABQQsQdCAEIAMgDRD2ASAFIARBBhB0IAJBgL4FaiINIAUgaRD2ASABIA1BDBB0IAMgASAmEPYBIAQgA0EIEHQgBSAEICIQ9gEgAkGAwQVqIg0gBUEJEHQgASAUIA0Q9gEgAyABQQoQdCAEIAMgThD2ASAFIARBBxB0IAJBgMQFaiINIAUgVxD2ASABIA1BCRB0IAMgASB1EPYBIAQgA0EHEHQgBSAEIEsQ9gEgAkGAxwVqIg0gBUELEHQgASCGASANEPYBIAMgAUEIEHQgBCADIFgQ9gEgBSAEQQkQdCACQYDKBWoiDSAFIFsQ9gEgASANQQgQdCADIAEgUhD2ASAEIANBCBB0IAUgBCBYEPYBIAJBgM0FaiINIAVBCBB0IAEgJSANEPYBIAMgAUEGEHQgBCADIA8Q9gEgBSAEQQ4QdCACQYDQBWoiDSAFIHAQ9gEgASANQQUQdCADIAEgJRD2ASAEIANBCxB0IAUgBCByEPYBIAJBgNMFaiINIAVBAxB0IAEgDyANEPYBIAMgAUENEHQgBCADIBkQ9gEgBSAEQQ0QdCACQYDWBWoiDSAFIAkQ9gEgASANQQgQdCADIAEgWhD2ASAEIANBCBB0IAUgBCA3EPYBIAJBgNkFaiINIAVBCBB0IAEgYiANEPYBIAMgAUEIEHQgBCADIDIQ9gEgBSAEQQgQdCACQYDcBWoiDSAFIB4Q9gEgASANQQsQdCADIAEgXBD2ASAEIANBCBB0IAUgBCCBARD2ASACQYDfBWoiDSAFQQgQdCABIDggDRD2ASADIAFBCRB0IAQgAyBzEPYBIAUgBEEKEHQgAkGA4gVqIg0gBSBkEPYBIAEgDUEIEHQgAyABIBMQ9gEgBCADQQgQdCAFIAQgKBD2ASACQYDlBWoiDSAFQQoQdCABIFUgDRD2ASADIAFBCxB0IAQgAyBnEPYBIAUgBEEIEHQgAkGA6AVqIg0gBSBaEPYBIAEgDUEFEHQgAyABIDAQ9gEgBCADQQwQdCAFIAQgGBD2ASACQYDrBWoiDSAFQQcQdCABIFcgDRD2ASADIAFBChB0IAQgAyAIEPYBIAUgBEEMEHQgAkGA7gVqIg0gBSAhEPYBIAEgDUEIEHQgAyABIBgQ9gEgBCADQQcQdCAFIAQgFhD2ASACQYDxBWoiDSAFQQkQdCABIHIgDRD2ASADIAFBCRB0IAQgAyB1EPYBIAUgBEEJEHQgAkGA9AVqIg0gBSAgEPYBIAEgDUEGEHQgAyABICQQ9gEgBCADQQsQdCAFIAQgJhD2ASACQYD3BWoiDSAFQQgQdCABIGcgDRD2ASADIAFBBxB0IAQgAyBHEPYBIAUgBEEJEHQgAkGA+gVqIg0gBSBZEPYBIAEgDUEKEHQgAyABIFIQ9gEgBCADQQYQdCAFIAQgQRD2ASACQYD9BWoiDSAFQQsQdCABID8gDRD2ASADIAFBBxB0IAQgAyAMEPYBIAUgBEELEHQgAkGAgAZqIg0gBSBoEPYBIAEgDUELEHQgAyABIBoQ9gEgBCADQQoQdCAFIAQgdBD2ASACQYCDBmoiDSAFQQ0QdCABIHEgDRD2ASADIAFBDBB0IAQgAyAIEPYBIAUgBEEGEHQgAkGAhgZqIg0gBSAxEPYBIAEgDUEMEHQgAyABIFwQ9gEgBCADQQcQdCAFIAQgWBD2ASACQYCJBmoiDSAFQQ0QdCABIC8gDRD2ASADIAFBBxB0IAQgAyBvEPYBIAUgBEEJEHQgAkGAjAZqIg0gBSAaEPYBIAEgDUEJEHQgAyABID8Q9gEgBCADQQkQdCAFIAQgFhD2ASACQYCPBmoiDSAFQQYQdCABIBwgDRD2ASADIAFBCRB0IAQgAyAUEPYBIAUgBEEOEHQgAkGAkgZqIg0gBSBzEPYBIAEgDUEJEHQgAyABIE0Q9gEgBCADQQQQdCAFIAQgfhD2ASACQYCVBmoiDSAFQQwQdCABIEYgDRD2ASADIAFBAxB0IAQgAyACEPYBIAUgBEEMEHQgAkGAmAZqIg0gBSAkEPYBIAEgDUEOEHQgAyABIGUQ9gEgBCADQQwQdCAFIAQgCxD2ASACQYCbBmoiDSAFQQgQdCABIB4gDRD2ASADIAFBCRB0IAQgAyB5EPYBIAUgBEEHEHQgAkGAngZqIg0gBSBEEPYBIAEgDUEKEHQgAyABIAgQ9gEgBCADQQgQdCAFIAQgFRD2ASACQYChBmoiDSAFQQ4QdCABIE4gDRD2ASADIAFBCRB0IAQgAyA6EPYBIAUgBEEHEHQgAkGApAZqIg0gBSAZEPYBIAEgDUEJEHQgAyABIF8Q9gEgBCADQQQQdCAFIAQgJRD2ASACQYCnBmoiDSAFQQwQdCABIAwgDRD2ASADIAFBDxB0IAQgAyB3EPYBIAUgBEEIEHQgAkGAqgZqIg0gBSAqEPYBIAEgDUEJEHQgAyABIIoBEPYBIAQgA0EIEHQgBSAEIGgQ9gEgAkGArQZqIg0gBUELEHQgASA+IA0Q9gEgAyABQQYQdCAEIAMgDBD2ASAFIARBCxB0IAJBgLAGaiINIAUgDhD2ASABIA1BBxB0IAMgASBGEPYBIAQgA0EJEHQgBSAEIIEBEPYBIAJBgLMGaiINIAVBCRB0IAEgCSANEPYBIAMgAUEIEHQgBCADID0Q9gEgBSAEQQcQdCACQYC2BmoiDSAFIG0Q9gEgASANQQsQdCADIAEgFhD2ASAEIANBCBB0IAUgBCBuEPYBIAJBgLkGaiINIAVBDBB0IAEgHiANEPYBIAMgAUEKEHQgBCADIIcBEPYBIAUgBEEIEHQgAkGAvAZqIg0gBSAaEPYBIAEgDUEIEHQgAyABIGwQ9gEgBCADQQMQdCAFIAQgDxD2ASACQYC/BmoiGiAFQQ4QdCABICAgGhD2ASADIAFBCBB0IAQgAyBeEPYBIAUgBEEEEHQgAkGAwgZqIhogBSAjEPYBIAEgGkEOEHQgAyABIBMQ9gEgBCADQQgQdCAFIAQgThD2ASACQYDFBmoiGiAFQQQQdCABIH8gGhD2ASADIAFBCxB0IAQgAyAoEPYBIAUgBEEKEHQgAkGAyAZqIhogBSA7EPYBIAEgGkEJEHQgAyABIF0Q9gEgBCADQQYQdCAFIAQgQhD2ASACQYDLBmoiGiAFQQoQdCABIHMgGhD2ASADIAFBDBB0IAQgAyAXEPYBIAUgBEEGEHQgAkGAzgZqIhogBSAoEPYBIAEgGkEKEHQgAyABIGEQ9gEgBCADQQYQdCAFIAQgJBD2ASACQYDRBmoiGiAFQQ0QdCABIEggGhD2ASADIAFBBxB0IAQgAyAfEPYBIAUgBEEJEHQgAkGA1AZqIhogBSAsEPYBIAEgGkEIEHQgAyABICcQ9gEgBCADQQsQdCAFIAQgQBD2ASACQYDXBmoiGiAFQQkQdCABIBggGhD2ASADIAFBCBB0IAQgAyA5EPYBIAUgBEEFEHQgAkGA2gZqIhogBSB/EPYBIAEgGkELEHQgAyABIHQQ9gEgBCADQQkQdCAFIAQgJhD2ASACQYDdBmoiGiAFQQgQdCABICIgGhD2ASADIAFBCRB0IAQgAyBbEPYBIAUgBEEIEHQgAkGA4AZqIhogBSA3EPYBIAEgGkEJEHQgAyABIFIQ9gEgBCADQQsQdCAFIAQgGBD2ASACQYDjBmoiGiAFQQgQdCABIFIgGhD2ASADIAFBBRB0IAQgAyAtEPYBIAUgBEEREHQgAkGA5gZqIhogBSAJEPYBIAEgGkEEEHQgAyABIBsQ9gEgBCADQQwQdCAFIAQgRxD2ASACQYDpBmoiCSAFQQUQdCABIBsgCRD2ASADIAFBDhB0IAQgAyAmEPYBIAUgBEEJEHQgAkGA7AZqIgkgBSAVEPYBIAEgCUEIEHQgAyABIBIQ9gEgBCADQQgQdCAFIAQgIBD2ASACQYDvBmoiCSAFQQoQdCABIFUgCRD2ASADIAFBCxB0IAQgAyBFEPYBIAUgBEEIEHQgAkGA8gZqIgkgBSAUEPYBIAEgCUEJEHQgAyABIBEQ9gEgBCADQQkQdCAFIAQgYBD2ASACQYD1BmoiCSAFQQcQdCABIDggCRD2ASADIAFBDBB0IAQgAyBREPYBIAUgBEEIEHQgAkGA+AZqIgkgBSAgEPYBIAEgCUELEHQgAyABICIQ9gEgBCADQQcQdCAFIAQgggEQ9gEgAkGA+wZqIgkgBUEIEHQgASA1IAkQ9gEgAyABQQoQdCAEIAMgTRD2ASAFIARBCBB0IAJBgP4GaiIJIAUgWRD2ASABIAlBCxB0IAMgASAvEPYBIAQgA0EEEHQgBSAEIC0Q9gEgAkGAgQdqIgkgBUENEHQgASBxIAkQ9gEgAyABQQkQdCAEIAMgaxD2ASAFIARBChB0IAJBgIQHaiIJIAUgXRD2ASABIAlBCRB0IAMgASBAEPYBIAQgA0EIEHQgBSAEIEkQ9gEgAkGAhwdqIgkgBUEJEHQgASBMIAkQ9gEgAyABQQgQdCAEIAMgTBD2ASAFIARBBRB0IAJBgIoHaiIJIAUgQRD2ASABIAlBCxB0IAMgASA1EPYBIAQgA0EIEHQgBSAEIDIQ9gEgAkGAjQdqIgkgBUEMEHQgASAQIAkQ9gEgAyABQQgQdCAEIAMgHhD2ASAFIARBCBB0IAJBgJAHaiIJIAUgERD2ASABIAlBChB0IAMgASB2EPYBIAQgA0EIEHQgBSAEIBAQ9gEgAkGAkwdqIgkgBUEJEHQgASAWIAkQ9gEgAyABQQcQdCAEIAMgaxD2ASAFIARBCRB0IAJBgJYHaiIJIAUgaRD2ASABIAlBChB0IAMgASA6EPYBIAQgA0EJEHQgBSAEIAgQ9gEgAkGAmQdqIgkgBUEGEHQgASBWIAkQ9gEgAyABQQQQdCAEIAMgDxD2ASAFIARBDRB0IAJBgJwHaiIJIAUgHxD2ASABIAlBCBB0IAMgASBGEPYBIAQgA0EJEHQgBSAEID0Q9gEgAkGAnwdqIgkgBUEJEHQgASBNIAkQ9gEgAyABQQoQdCAEIAMgLxD2ASAFIARBCBB0IAJBgKIHaiIJIAUgHBD2ASABIAlBCxB0IAMgASAXEPYBIAQgA0EIEHQgBSAEIA4Q9gEgAkGApQdqIgkgBUEHEHQgASBJIAkQ9gEgAyABQQcQdCAEIAMgHRD2ASAFIARBChB0IAJBgKgHaiIJIAUgCxD2ASABIAlBCRB0IAMgASBcEPYBIAQgA0EFEHQgBSAEIEEQ9gEgAkGAqwdqIgkgBUEKEHQgASAcIAkQ9gEgAyABQREQdCAEIAMggwEQ9gEgBSAEQQgQdCACQYCuB2oiCSAFIGMQ9gEgASAJQQcQdCADIAEgMhD2ASAEIANBCRB0IAUgBCBmEPYBIAJBgLEHaiIJIAVBCRB0IAEgdiAJEPYBIAMgAUEGEHQgBCADIBQQ9gEgBSAEQQoQdCACQYC0B2oiCSAFIFYQ9gEgASAJQQoQdCADIAEgVBD2ASAEIANBCRB0IAUgBCBFEPYBIAJBgLcHaiIJIAVBBxB0IAEgQiAJEPYBIAMgAUELEHQgBCADICUQ9gEgBSAEQQ8QdCACQYC6B2oiCSAFIEAQ9gEgASAJQQcQdCADIAEgKRD2ASAEIANBBhB0IAUgBCBTEPYBIAJBgL0HaiIJIAVBCxB0IAEgCCAJEPYBIAMgAUENEHQgBCADIEkQ9gEgBSAEQQkQdCACQYDAB2oiCSAFIEoQ9gEgASAJQQoQdCADIAEgLBD2ASAEIANBChB0IAUgBCBkEPYBIAJBgMMHaiIJIAVBBhB0IAEgMSAJEPYBIAMgAUEKEHQgBCADIBUQ9gEgBSAEQQQQdCACQYDGB2oiCSAFIBsQ9gEgASAJQQwQdCADIAEgGBD2ASAEIANBCBB0IAUgBCBEEPYBIAJBgMkHaiIJIAVBChB0IAEgYyAJEPYBIAMgAUEGEHQgBCADIGsQ9gEgBSAEQQoQdCACQYDMB2oiCSAFICQQ9gEgASAJQQsQdCADIAEgURD2ASAEIANBBxB0IAUgBCBJEPYBIAJBgM8HaiIJIAVBAxB0IAEgDyAJEPYBIAMgAUENEHQgBCADIEYQ9gEgBSAEQQsQdCACQYDSB2oiCSAFIGgQ9gEgASAJQQYQdCADIAEgVRD2ASAEIANBCxB0IAUgBCBIEPYBIAJBgNUHaiIJIAVBCRB0IAEgICAJEPYBIAMgAUELEHQgBCADIGUQ9gEgBSAEQQcQdCACQYDYB2oiCSAFIDQQ9gEgASAJQQkQdCADIAEgEhD2ASAEIANBCBB0IAUgBCCEARD2ASACQYDbB2oiCSAFQQYQdCABIAwgCRD2ASADIAFBDBB0IAQgAyBiEPYBIAUgBEEMEHQgAkGA3gdqIgkgBSBKEPYBIAEgCUEHEHQgAyABIAsQ9gEgBCADQQoQdCAFIAQgIRD2ASACQYDhB2oiCSAFQQwQdCABIBEgCRD2ASADIAFBCRB0IAQgAyAfEPYBIAUgBEEFEHQgAkGA5AdqIgkgBSAjEPYBIAEgCUEMEHQgAyABIC8Q9gEgBCADQQgQdCAFIAQgKBD2ASACQYDnB2oiCSAFQQwQdCABIBUgCRD2ASADIAFBCRB0IAQgAyBREPYBIAUgBEEJEHQgAkGA6gdqIgkgBSA+EPYBIAEgCUEJEHQgAyABIDwQ9gEgBCADQQcQdCAFIAQgchD2ASACQYDtB2oiCSAFQQkQdCABIAsgCRD2ASADIAFBBBB0IAQgAyAPEPYBIAUgBEEQEHQgAkGA8AdqIgkgBSAqEPYBIAEgCUEHEHQgAyABIDMQ9gEgBCADQQoQdCAFIAQgXxD2ASACQYDzB2oiCSAFQQgQdCABIDcgCRD2ASADIAFBBBB0IAQgAyAlEPYBIAUgBEELEHQgAkGA9gdqIgkgBSA0EPYBIAEgCUEKEHQgAyABICYQ9gEgBCADQQoQdCAFIAQghwEQ9gEgAkGA+QdqIgkgBUEHEHQgASAZIAkQ9gEgAyABQQgQdCAEIAMgcBD2ASAFIARBBxB0IAJBgPwHaiIJIAUggAEQ9gEgASAJQQoQdCADIAEghQEQ9gEgBCADQQgQdCAFIAQgZBD2ASACQYD/B2oiCSAFQQkQdCABIGYgCRD2ASADIAFBChB0IAQgAyA+EPYBIAUgBEEJEHQgAkGAgghqIgkgBSAWEPYBIAEgCUEDEHQgAyABIA8Q9gEgBCADQQ0QdCAFIAQgbhD2ASACQYCFCGoiDyAFQQoQdCABIDMgDxD2ASADIAFBCRB0IAQgAyA5EPYBIAUgBEEJEHQgAkGAiAhqIg8gBSAIEPYBIAEgD0EIEHQgAyABIBMQ9gEgBCADQQcQdCAFIAQgGRD2ASACQYCLCGoiDyAFQQcQdCABIDEgDxD2ASADIAFBChB0IAQgAyBIEPYBIAUgBEEEEHQgAkGAjghqIg8gBSAjEPYBIAEgD0EMEHQgAyABIG0Q9gEgBCADQQsQdCAFIAQgCBD2ASACQYCRCGoiDyAFQQQQdCABIBsgDxD2ASADIAFBDRB0IAQgAyBjEPYBIAUgBEEIEHQgAkGAlAhqIg8gBSAqEPYBIAEgD0EJEHQgAyABIIQBEPYBIAQgA0EJEHQgBSAEIEIQ9gEgAkGAlwhqIg8gBUELEHQgASB3IA8Q9gEgAyABQQkQdCAEIAMgiwEQ9gEgBSAEQQcQdCACQYCaCGoiDyAFIAsQ9gEgASAPQQcQdCADIAEgHRD2ASAEIANBChB0IAUgBCBgEPYBIAJBgJ0IaiIPIAVBBxB0IAEgiAEgDxD2ASADIAFBCBB0IAQgAyBFEPYBIAUgBEEKEHQgAkGAoAhqIg8gBSAsEPYBIAEgD0EIEHQgAyABIFAQ9gEgBCADQQkQdCAFIAQgFxD2ASACQYCjCGoiDyAFQQkQdCABIF8gDxD2ASADIAFBCBB0IAQgAyAqEPYBIAUgBEEIEHQgAkGApghqIg8gBSBeEPYBIAEgD0EHEHQgAyABIFQQ9gEgBCADQQsQdCAFIAQgCBD2ASACQYCpCGoiCCAFQQkQdCABIC8gCBD2ASADIAFBCRB0IAQgAyBIEPYBIAUgBEEIEHQgAkGArAhqIgggBSBeEPYBIAEgCEEGEHQgAyABICcQ9gEgBCADQQwQdCAFIAQgPRD2ASACQYCvCGoiCCAFQQgQdCABIEcgCBD2ASADIAFBCRB0IAQgAyB5EPYBIAUgBEELEHQgAkGAsghqIgggBSA3EPYBIAEgCEEJEHQgAyABIGAQ9gEgBCADQQgQdCAFIAQgUBD2ASACQYC1CGoiCCAFQQQQdCABICMgCBD2ASADIAFBDRB0IAQgAyA/EPYBIAUgBEEHEHQgAkGAuAhqIgggBSAfEPYBIAEgCEEIEHQgAyABIDQQ9gEgBCADQQYQdCAFIAQgMBD2ASACQYC7CGoiCCAFQQsQdCABIEwgCBD2ASADIAFBCRB0IAQgAyA0EPYBIAUgBEEKEHQgAkGAvghqIgggBSA/EPYBIAEgCEEFEHQgAyABIBsQ9gEgBCADQQsQdCAFIAQgWRD2ASACQYDBCGoiCCAFQQwQdCABICEgCBD2ASADIAFBCBB0IAQgAyCGARD2ASAFIARBBRB0IAJBgMQIaiIIIAUgMBD2ASABIAhBDBB0IAMgASA7EPYBIAQgA0EKEHQgBSAEIEAQ9gEgAkGAxwhqIgggBUEIEHQgASASIAgQ9gEgAyABQQgQdCAEIAMgOhD2ASAFIARBCRB0IAJBgMoIaiIIIAUgShD2ASABIAhBCRB0IAMgASA7EPYBIAQgA0ELEHQgBSAEIG8Q9gEgAkGAzQhqIgggBUEHEHQgASBEIAgQ9gEgAyABQQUQdCAEIAMgLRD2ASAFIARBDhB0IAJBgNAIaiIIIAUgOxD2ASABIAhBBhB0IAMgASAUEPYBIAQgA0EJEHQgBSAEIDUQ9gEgAkGA0whqIgggBUEHEHQgASAoIAgQ9gEgAyABQQkQdCAEIAMgHBD2ASAFIARBDRB0IAJBgNYIaiIIIAUgLBD2ASABIAhBCBB0IAMgASBcEPYBIAQgA0EFEHQgBSAEIFMQ9gEgAkGA2QhqIgggBUEJEHQgASAUIAgQ9gEgAyABQQoQdCAEIAMgNBD2ASAFIARBCBB0IAJBgNwIaiIIIAUgWBD2ASABIAhBChB0IAMgASBOEPYBIAQgA0ELEHQgBSAEIIMBEPYBIAJBgN8IaiIIIAVBAxB0IAEgLSAIEPYBIAMgAUEKEHQgBCADIEIQ9gEgBSAEQQ4QdCACQYDiCGoiCCAFIGkQ9gEgASAIQQoQdCADIAEgERD2ASAEIANBCRB0IAUgBCBdEPYBIAJBgOUIaiIRIAVBBxB0IAEgQyAREPYBIAMgAUEKEHQgBCADIBgQ9gEgBSAEQQcQdCB9IhEgBSA2EPYBIAEgEUEMEHQgAyABIGgQ9gEgBCADQQkQdCAFIAQgNhD2ASB7IgEgBUEIEHQgBkGIKmoiBCIDIDAgARD2ASACQcD+CGokACCJASADQYAD/AoAACAGQYgSaiIBIIkBQYAD/AoAACAGQYgVaiIDIAZBiAlqQYAD/AoAACAEIgIgARD5ASAGKQOYKiGMASAGKQOQKiGOAQJAIAYoAogqQQFHBEAgBkGYG2ogBkGgKmpB8AL8CgAAIAYgjAE3A5AbIAYgjgE3A4gbIAZBiB5qIAMQHyAGQYghaiIDIAEQHyACIAMQTSAGQYgnaiIBIAIgBkGIG2oQ9gEgARBqBEADQCAGQYgqaiIBIAZBiCFqIgIgBkGIHmoQ9gEgAiABQYAD/AoAACABIAIQTSAGQYgnaiICIAFBgAP8CgAAIAEgAiAGQYgbahD2ASAGQYgkaiICIAFBgAP8CgAAIAIQag0ACwsgeiAGQYghakGAA/wKAAAgekGAA2ogBkGID2pBgAP8CgAAIAZB0C5qJAAMAQsgBiCMATcDkCogBiCOATcDiCpBgIvAAEErIAZBiCpqQdyLwABB/I7AABDKAwALIAdB0ApqIgEgekGAA/wKAAAgB0HQDWoiAiAHQZAqakGAA/wKAAAgACABELQDIABBkAFqIAIQtAMMAgsgB0GwF2oiASAHQRBqEPYCIAdB4BdqIAdBIGoQ9gIgB0GQGGoiAiAHQTBqEPYCIAdBwBhqIAdBQGsQ9gIgB0HwGGoiAyAHQdAAahD2AiAHQaAZaiAHQeAAahD2AiAHQZAVaiIGIAFB4AD8CgAAIAdB8BVqIAJB4AD8CgAAIAdB0BZqIANB4AD8CgAAIAdB8BtqIgEgB0HwAGoQ9gIgB0GgHGogB0GAAWoQ9gIgB0HQHGoiAiAHQZABahD2AiAHQYAdaiAHQaABahD2AiAHQbAdaiIDIAdBsAFqEPYCIAdB4B1qIAdBwAFqEPYCIAdB0BlqIgQgAUHgAPwKAAAgB0GwGmogAkHgAPwKAAAgB0GQG2ogA0HgAPwKAAAgB0HQEGoiUiAGQaAC/AoAACAHQfASaiAEQaAC/AoAACMAQeCvC2siBSQAIAUgUjYCwJILIAUgUkGgAmoiETYCxJILIAVBgKALaiIWIgEgBUHAkgtqIgoiBhCQAyAFQcCbC2oieyICIAFB4AD8CgAAIAVBgJcLaiJ8IgMgAkHgAPwKAAAgBUHApAtqIn0iBCADQeAA/AoAACAFQcCtC2oiCCAEQeAA/AoAACABIAYQkAMgAiABQeAA/AoAACADIAJB4AD8CgAAIAQgA0HgAPwKAAAgBUGgrgtqIARB4AD8CgAAIAEgBhCQAyACIAFB4AD8CgAAIAMgAkHgAPwKAAAgBCADQeAA/AoAACAFQYCvC2ogBEHgAPwKAAAgBUGAqQtqIgkgCEGgAvwKAAAgBSBSQcAEajYChI4LIAUgETYCgI4LIHsiASAFQYCOC2oiiAEiBhCQAyB8IgIgAUHgAPwKAAAgCiIDIAJB4AD8CgAAIBYiBCADQeAA/AoAACB9IhEgBEHgAPwKAAAgASAGEJADIAIgAUHgAPwKAAAgAyACQeAA/AoAACAEIANB4AD8CgAAIAVBoKULaiAEQeAA/AoAACABIAYQkAMgAiABQeAA/AoAACADIAJB4AD8CgAAIAQgA0HgAPwKAAAgBUGApgtqIARB4AD8CgAAIAgiASARQaAC/AoAACAFQaCrC2ogAUGgAvwKAAAgBSAJQcAE/AoAACAFQYAJaiICIAVBARDkASAFQcAEaiIBIAJBwAT8CgAAIAVBwA1qIjsgBSABEJsCIAVBgBJqIh8gASA7EJsCIAVBwBZqIhUgASAfEJsCIAVBgBtqImwgASAVEJsCIAVBwB9qIjwgASBsEJsCIAVBgCRqIlMgASA8EJsCIAVBwChqIj0gASBTEJsCIAVBgC1qIhEgASA9EJsCIAVBwDFqIj4gASAREJsCIAVBgDZqIg8gASA+EJsCIAVBwDpqIhAgASAPEJsCIAVBgD9qIiAgASAQEJsCIAVBwMMAaiIqIAEgIBCbAiAFQYDIAGoiPyABICoQmwIgBUHAzABqIn8gASA/EJsCIAVBgNEAaiJAIAEgfxCbAiAFQcDVAGoiLCABIEAQmwIgBUGA2gBqIiIgASAsEJsCIAVBwN4AaiICIAUgIhCbAiAFQYDjAGoiIyAFIAIQmwIgBUHA5wBqIi8gASAjEJsCIAVBgOwAaiJtIAEgLxCbAiAFQcDwAGoiVCABIG0QmwIgBUGA9QBqIi0gPCACEJsCIAVBwPkAaiIlIAEgLRCbAiAFQYD+AGoiOCABICUQmwIgBUHAggFqIm4gASA4EJsCIAVBgIcBaiJvIAEgbhCbAiAFQcCLAWoiDCABIG8QmwIgBUGAkAFqIoABIAEgDBCbAiAFQcCUAWoiMCABIIABEJsCIAVBgJkBaiIxIAEgMBCbAiAFQcCdAWoiQSABIDEQmwIgBUGAogFqIhQgASBBEJsCIAVBwKYBaiKBASABIBQQmwIgBUGAqwFqIksgASCBARCbAiAFQcCvAWoiJCABIEsQmwIgBUGAtAFqInAgASAkEJsCIAVBwLgBaiJVIAEgcBCbAiAFQYC9AWoiQiABIFUQmwIgBUHAwQFqIicgASBCEJsCIAVBgMYBaiJWIAEgJxCbAiAFQcDKAWoiMiABIFYQmwIgBUGAzwFqIkMgASAyEJsCIAVBwNMBaiJxIAEgQxCbAiAFQYDYAWoiRCABIHEQmwIgBUHA3AFqIkUgASBEEJsCIAVBgOEBaiJGIAEgRRCbAiAFQcDlAWoiMyABIEYQmwIgBUGA6gFqIoIBIAEgMxCbAiAFQcDuAWoiNCABIIIBEJsCIAVBgPMBaiIoIAEgNBCbAiAFQcD3AWoiKSABICgQmwIgBUGA/AFqIhogASApEJsCIAVBwIACaiJHIAEgGhCbAiAFQYCFAmoiciABIEcQmwIgBUHAiQJqInMgASByEJsCIAVBgI4CaiJ0IAEgcxCbAiAFQcCSAmoiSSABIHQQmwIgBUGAlwJqIkogASBJEJsCIAVBwJsCaiILIAEgShCbAiAFQYCgAmoiCSABIAsQmwIgBUHApAJqIisgASAJEJsCIAVBgKkCaiI1IAEgKxCbAiAFQcCtAmoiDSABIDUQmwIgBUGAsgJqIlcgASANEJsCIAVBwLYCaiJMIAEgVxCbAiAFQYC7AmoiNiABIEwQmwIgBUHAvwJqIlggASA2EJsCIAVBgMQCaiJZIAEgWBCbAiAFQcDIAmoiWiABIFkQmwIgBUGAzQJqIoMBIAEgWhCbAiAFQcDRAmoiWyABIIMBEJsCIAVBgNYCaiJcIAEgWxCbAiAFQcDaAmoiTSABIFwQmwIgBUGA3wJqIl0gASBNEJsCIAVBwOMCaiJ1IAEgXRCbAiAFQYDoAmoiXiABIHUQmwIgBUHA7AJqIhcgASBeEJsCIAVBgPECaiKEASABIBcQmwIgBUHA9QJqIhYgASCEARCbAiAFQYD6AmoihQEgASAWEJsCIAVBwP4CaiJfIAEghQEQmwIgBUGAgwNqIk4gASBfEJsCIAVBwIcDaiIOIAEgThCbAiAFQYCMA2oiGCABIA4QmwIgBUHAkANqIhsgASAYEJsCIAVBgJUDaiJgIAEgGxCbAiAFQcCZA2oiNyABIGAQmwIgBUGAngNqIlAgASA3EJsCIAVBwKIDaiJhIAEgUBCbAiAFQYCnA2oiYiABIGEQmwIgBUHAqwNqImMgASBiEJsCIAVBgLADaiJkIAEgYxCbAiAFQcC0A2oihgEgASBkEJsCIAVBgLkDaiJPIAEghgEQmwIgBUHAvQNqIhkgASBPEJsCIAVBgMIDaiJ2IAEgGRCbAiAFQcDGA2oidyABIHYQmwIgBUGAywNqIjkgASB3EJsCIAVBwM8DaiIeIAEgORCbAiAFQYDUA2oiZSABIB4QmwIgBUHA2ANqImYgASBlEJsCIAVBgN0DaiJIIAEgZhCbAiAFQcDhA2oiEiABIEgQmwIgBUGA5gNqInggASASEJsCIAVBwOoDaiJnIAEgeBCbAiAFQYDvA2oiBiABIGcQmwIgBUHA8wNqIi4gASAGEJsCIAVBgPgDaiJoIAEgLhCbAiAFQcD8A2oieSABIGgQmwIgBUGAgQRqIiEgASB5EJsCIAVBwIUEaiKHASABICEQmwIgBUGAigRqIlEgASCHARCbAiAFQcCOBGoiaSABIFEQmwIgBUGAkwRqIgggASBpEJsCIAVBwJcEaiI6IAEgCBCbAiAFQYCcBGoieiABIDoQmwIgBUHAoARqImogASB6EJsCIAVBgKUEaiIcIAIgZhCbAiAFQcCpBGoiHSABIBwQmwIgBUGArgRqIhMgASAdEJsCIAVBwLIEaiImIAIgZxCbAiAFQYC3BGoiayABICYQmwIgfCIBIC0gaxCbAiB7IgIgAUEHEOQBIAQiAyACIGUQmwIgfSIEIANBChDkASAFQcC7BGoifiAEIF8QmwIgASB+QQkQ5AEgAiABICQQmwIgAyACQQgQ5AEgBCADIEMQmwIgBUGAwARqIn4gBEEIEOQBIAEgQCB+EJsCIAIgAUEKEOQBIAMgAiAQEJsCIAQgA0EOEOQBIAVBwMQEaiIQIAQgCRCbAiABIBBBCxDkASACIAEggQEQmwIgAyACQQkQ5AEgBCADICYQmwIgBUGAyQRqIhAgBEEHEOQBIAEgKSAQEJsCIAIgAUEKEOQBIAMgAiAGEJsCIAQgA0EHEOQBIAVBwM0EaiIQIAQgRRCbAiABIBBBCBDkASACIAEgKRCbAiADIAJBCRDkASAEIAMgVRCbAiAFQYDSBGoiECAEQQcQ5AEgASAvIBAQmwIgAiABQQoQ5AEgAyACIBYQmwIgBCADQQgQ5AEgBUHA1gRqIhAgBCA6EJsCIAEgEEEJEOQBIAIgASAuEJsCIAMgAkEGEOQBIAQgAyAwEJsCIAVBgNsEaiIQIARBCRDkASABICMgEBCbAiACIAFBCRDkASADIAIgQxCbAiAEIANBCRDkASAFQcDfBGoiECAEIHYQmwIgASAQQQcQ5AEgAiABIEcQmwIgAyACQQkQ5AEgBCADIFsQmwIgBUGA5ARqIhAgBEEIEOQBIAEgNiAQEJsCIAIgAUEJEOQBIAMgAiAIEJsCIAQgA0EIEOQBIAVBwOgEaiIQIAQgJxCbAiABIBBBAxDkASACIAEgOxCbAiADIAJBDxDkASAEIAMgdBCbAiAFQYDtBGoiECAEQQkQ5AEgASBhIBAQmwIgAiABQQUQ5AEgAyACIBEQmwIgBCADQQwQ5AEgBUHA8QRqIhAgBCBNEJsCIAEgEEEJEOQBIAIgASBOEJsCIAMgAkEJEOQBIAQgAyBfEJsCIAVBgPYEaiIQIARBBhDkASABIA8gEBCbAiACIAFBCRDkASADIAIgDxCbAiAEIANBCxDkASAFQcD6BGoiECAEIA4QmwIgASAQQQQQ5AEgAiABIB8QmwIgAyACQQ0Q5AEgBCADIFkQmwIgBUGA/wRqIhAgBEEIEOQBIAEgFiAQEJsCIAIgAUEIEOQBIAMgAiBoEJsCIAQgA0EGEOQBIAVBwIMFaiIQIAQgPhCbAiABIBBBCxDkASACIAEgRxCbAiADIAJBCBDkASAEIAMgLxCbAiAFQYCIBWoiECAEQQkQ5AEgASBwIBAQmwIgAiABQQsQ5AEgAyACIGIQmwIgBCADQQgQ5AEgBUHAjAVqIhAgBCAZEJsCIAEgEEEJEOQBIAIgASBpEJsCIAMgAkEKEOQBIAQgAyASEJsCIAVBgJEFaiIQIARBAxDkASABIB8gEBCbAiACIAFBDRDkASADIAIgNxCbAiAEIANBCBDkASAFQcCVBWoiECAEIGgQmwIgASAQQQgQ5AEgAiABIEEQmwIgAyACQQwQ5AEgBCADIBsQmwIgBUGAmgVqIhAgBEEJEOQBIAEggwEgEBCbAiACIAFBCRDkASADIAIgNRCbAiAEIANBBhDkASAFQcCeBWoiECAEICIQmwIgASAQQQgQ5AEgAiABICIQmwIgAyACQQoQ5AEgBCADIDQQmwIgBUGAowVqIhAgBEEJEOQBIAEgRiAQEJsCIAIgAUEJEOQBIAMgAiBQEJsCIAQgA0EHEOQBIAVBwKcFaiIQIAQgJRCbAiABIBBBCBDkASACIAEgVBCbAiADIAJBChDkASAEIAMgGhCbAiAFQYCsBWoiECAEQQgQ5AEgASBJIBAQmwIgAiABQQkQ5AEgAyACICkQmwIgBCADQQkQ5AEgBUHAsAVqIhAgBCAeEJsCIAEgEEEEEOQBIAIgASBsEJsCIAMgAkEJEOQBIAQgAyA+EJsCIAVBgLUFaiIQIARBDxDkASABIBkgEBCbAiACIAFBChDkASADIAIgNhCbAiAEIANBBxDkASAFQcC5BWoiECAEIEQQmwIgASAQQQkQ5AEgAiABIBcQmwIgAyACQQgQ5AEgBCADIDQQmwIgBUGAvgVqIhAgBEEKEOQBIAEgUSAQEJsCIAIgAUEJEOQBIAMgAiAbEJsCIAQgA0EJEOQBIAVBwMIFaiIQIAQgWhCbAiABIBBBBxDkASACIAEgLRCbAiADIAJBCRDkASAEIAMgSRCbAiAFQYDHBWoiECAEQQoQ5AEgASAzIBAQmwIgAiABQQkQ5AEgAyACIFYQmwIgBCADQQkQ5AEgBUHAywVqIhAgBCAdEJsCIAEgEEEKEOQBIAIgASAWEJsCIAMgAkEKEOQBIAQgAyAcEJsCIAVBgNAFaiIQIARBCBDkASABIGogEBCbAiACIAFBDBDkASADIAIgIRCbAiAEIANBCBDkASAFQcDUBWoiECAEIDUQmwIgASAQQQUQ5AEgAiABIA8QmwIgAyACQQsQ5AEgBCADIAkQmwIgBUGA2QVqIhAgBEEOEOQBIAEgCCAQEJsCIAIgAUEHEOQBIAMgAiBzEJsCIAQgA0EJEOQBIAVBwN0FaiIQIAQgdhCbAiABIBBBCxDkASACIAEgJBCbAiADIAJBCRDkASAEIAMgDhCbAiAFQYDiBWoiDiAEQQYQ5AEgASAMIA4QmwIgAiABQQsQ5AEgAyACIIABEJsCIAQgA0EKEOQBIAVBwOYFaiIOIAQgXhCbAiABIA5BCBDkASACIAEgDRCbAiADIAJBCBDkASAEIAMgZxCbAiAFQYDrBWoiDiAEQQkQ5AEgASBIIA4QmwIgAiABQQgQ5AEgAyACIAYQmwIgBCADQQoQ5AEgBUHA7wVqIg4gBCBOEJsCIAEgDkEFEOQBIAIgASA+EJsCIAMgAkEMEOQBIAQgAyASEJsCIAVBgPQFaiIOIARBCRDkASABIBggDhCbAiACIAFBCBDkASADIAIgHBCbAiAEIANBCBDkASAFQcD4BWoiDiAEIFcQmwIgASAOQQcQ5AEgAiABIAsQmwIgAyACQQgQ5AEgBCADIHIQmwIgBUGA/QVqIg4gBEEIEOQBIAEgCyAOEJsCIAIgAUEJEOQBIAMgAiBIEJsCIAQgA0EJEOQBIAVBwIEGaiIOIAQgJhCbAiABIA5BBxDkASACIAEgGhCbAiADIAJBCBDkASAEIAMgCxCbAiAFQYCGBmoiDiAEQQsQ5AEgASBqIA4QmwIgAiABQQgQ5AEgAyACIHoQmwIgBCADQQkQ5AEgBUHAigZqIg4gBCATEJsCIAEgDkEKEOQBIAIgASANEJsCIAMgAkEIEOQBIAQgAyAdEJsCIAVBgI8GaiIOIARBCRDkASABIFQgDhCbAiACIAFBCBDkASADIAIgIhCbAiAEIANBDBDkASAFQcCTBmoiDiAEIAkQmwIgASAOQQoQ5AEgAiABICQQmwIgAyACQQsQ5AEgBCADIAYQmwIgBUGAmAZqIg4gBEEJEOQBIAEgIiAOEJsCIAIgAUEKEOQBIAMgAiBYEJsCIAQgA0EJEOQBIAVBwJwGaiIOIAQgahCbAiABIA5BCBDkASACIAEgMhCbAiADIAJBCBDkASAEIAMgMhCbAiAFQYChBmoiDiAEQQUQ5AEgASAVIA4QmwIgAiABQQwQ5AEgAyACIEsQmwIgBCADQQkQ5AEgBUHApQZqIg4gBCBMEJsCIAEgDkEHEOQBIAIgASArEJsCIAMgAkEHEOQBIAQgAyAqEJsCIAVBgKoGaiIOIARBChDkASABIAsgDhCbAiACIAFBChDkASADIAIgXhCbAiAEIANBCBDkASAFQcCuBmoiDiAEIAYQmwIgASAOQQYQ5AEgAiABICAQmwIgAyACQQsQ5AEgBCADIGQQmwIgBUGAswZqIg4gBEEKEOQBIAEgCSAOEJsCIAIgAUEMEOQBIAMgAiBIEJsCIAQgA0EIEOQBIAVBwLcGaiIOIAQgEhCbAiABIA5BCBDkASACIAEgGRCbAiADIAJBCBDkASAEIAMgWxCbAiAFQYC8BmoiDiAEQQgQ5AEgASBdIA4QmwIgAiABQQcQ5AEgAyACIEkQmwIgBCADQQUQ5AEgBUHAwAZqIg4gBCA8EJsCIAEgDkESEOQBIAIgASBZEJsCIAMgAkEJEOQBIAQgAyAYEJsCIAVBgMUGaiIOIARBBxDkASABIIIBIA4QmwIgAiABQQgQ5AEgAyACIEsQmwIgBCADQQgQ5AEgBUHAyQZqIg4gBCArEJsCIAEgDkEKEOQBIAIgASBcEJsCIAMgAkEKEOQBIAQgAyAsEJsCIAVBgM4GaiIOIARBCxDkASABIGkgDhCbAiACIAFBBxDkASADIAIgRxCbAiAEIANBCxDkASAFQcDSBmoiDiAEIDEQmwIgASAOQQkQ5AEgAiABIBYQmwIgAyACQQoQ5AEgBCADIE0QmwIgBUGA1wZqIg4gBEEIEOQBIAEgCCAOEJsCIAIgAUEJEOQBIAMgAiAJEJsCIAQgA0EHEOQBIAVBwNsGaiIOIAQgJRCbAiABIA5BCBDkASACIAEgOBCbAiADIAJBDBDkASAEIAMgJxCbAiAFQYDgBmoiDiAEQQoQ5AEgASAoIA4QmwIgAiABQQkQ5AEgAyACIDEQmwIgBCADQQsQ5AEgBUHA5AZqIg4gBCBmEJsCIAEgDkEGEOQBIAIgASAtEJsCIAMgAkEKEOQBIAQgAyASEJsCIAVBgOkGaiIOIARBCBDkASABIB4gDhCbAiACIAFBDRDkASADIAIgCBCbAiAEIANBCBDkASAFQcDtBmoiDiAEIE0QmwIgASAOQQcQ5AEgAiABIAsQmwIgAyACQQoQ5AEgBCADIDkQmwIgBUGA8gZqIg4gBEEIEOQBIAEgJiAOEJsCIAIgAUEHEOQBIAMgAiBxEJsCIAQgA0EMEOQBIAVBwPYGaiIOIAQgMhCbAiABIA5BCxDkASACIAEgPxCbAiADIAJBCRDkASAEIAMgLRCbAiAFQYD7BmoiDiAEQQoQ5AEgASBiIA4QmwIgAiABQQgQ5AEgAyACIF0QmwIgBCADQQgQ5AEgBUHA/wZqIg4gBCBQEJsCIAEgDkELEOQBIAIgASAWEJsCIAMgAkEHEOQBIAQgAyBWEJsCIAVBgIQHaiIOIARBCRDkASABIB4gDhCbAiACIAFBCRDkASADIAIgYRCbAiAEIANBBRDkASAFQcCIB2oiDiAEIBEQmwIgASAOQQsQ5AEgAiABICkQmwIgAyACQQkQ5AEgBCADICwQmwIgBUGAjQdqIg4gBEEKEOQBIAEgHSAOEJsCIAIgAUEKEOQBIAMgAiBEEJsCIAQgA0EHEOQBIAVBwJEHaiIOIAQgKhCbAiABIA5BChDkASACIAEgSxCbAiADIAJBBhDkASAEIAMgIBCbAiAFQYCWB2oiSyAEQQsQ5AEgASB1IEsQmwIgAiABQQgQ5AEgAyACIDQQmwIgBCADQQ0Q5AEgBUHAmgdqIksgBCA5EJsCIAEgS0EIEOQBIAIgASAdEJsCIAMgAkEIEOQBIAQgAyBREJsCIAVBgJ8HaiJLIARBCBDkASABIGMgSxCbAiACIAFBBxDkASADIAIgbxCbAiAEIANBDxDkASAFQcCjB2oiSyAEIDoQmwIgASBLQQkQ5AEgAiABIBIQmwIgAyACQQYQ5AEgBCADIBEQmwIgBUGAqAdqIhIgBEEJEOQBIAEgbiASEJsCIAIgAUEKEOQBIAMgAiAIEJsCIAQgA0EMEOQBIAVBwKwHaiISIAQghwEQmwIgASASQQcQ5AEgAiABICcQmwIgAyACQQkQ5AEgBCADIBsQmwIgBUGAsQdqIhIgBEEJEOQBIAEgESASEJsCIAIgAUEUEOQBIAMgAiBrEJsCIAQgA0EJEOQBIAVBwLUHaiISIAQgExCbAiABIBJBCBDkASACIAEgFxCbAiADIAJBCBDkASAEIAMgLxCbAiAFQYC6B2oiEiAEQQwQ5AEgASA3IBIQmwIgAiABQQcQ5AEgAyACIEQQmwIgBCADQQoQ5AEgBUHAvgdqIhIgBCCGARCbAiABIBJBCBDkASACIAEgJhCbAiADIAJBCBDkASAEIAMgBhCbAiAFQYDDB2oiEiAEQQcQ5AEgASBFIBIQmwIgAiABQQgQ5AEgAyACICwQmwIgBCADQQoQ5AEgBUHAxwdqIhIgBCBeEJsCIAEgEkEIEOQBIAIgASAIEJsCIAMgAkEKEOQBIAQgAyBOEJsCIAVBgMwHaiISIARBBBDkASABIBUgEhCbAiACIAFBDhDkASADIAIgXBCbAiAEIANBBxDkASAFQcDQB2oiEiAEIG0QmwIgASASQQkQ5AEgAiABICsQmwIgAyACQQUQ5AEgBCADIDwQmwIgBUGA1QdqIhIgBEEKEOQBIAEgVCASEJsCIAIgAUELEOQBIAMgAiAUEJsCIAQgA0EHEOQBIAVBwNkHaiISIAQgPxCbAiABIBJBCxDkASACIAEgGxCbAiADIAJBBBDkASAEIAMgOxCbAiAFQYDeB2oiEiAEQQ0Q5AEgASBuIBIQmwIgAiABQQoQ5AEgAyACIDcQmwIgBCADQQsQ5AEgBUHA4gdqIhIgBCA0EJsCIAEgEkEKEOQBIAIgASAoEJsCIAMgAkEJEOQBIAQgAyBtEJsCIAVBgOcHaiISIARBCxDkASABICggEhCbAiACIAFBCBDkASADIAIgMxCbAiAEIANBCxDkASAFQcDrB2oiEiAEIF0QmwIgASASQQQQ5AEgAiABIFMQmwIgAyACQQ8Q5AEgBCADIAsQmwIgBUGA8AdqIhIgBEEHEOQBIAEgKiASEJsCIAIgAUEIEOQBIAMgAiAPEJsCIAQgA0ELEOQBIAVBwPQHaiISIAQgZBCbAiABIBJBBhDkASACIAEgJRCbAiADIAJBBxDkASAEIAMgfxCbAiAFQYD5B2oiEiAEQQsQ5AEgASBRIBIQmwIgAiABQQgQ5AEgAyACIG8QmwIgBCADQQoQ5AEgBUHA/QdqIhIgBCAbEJsCIAEgEkEIEOQBIAIgASBMEJsCIAMgAkEHEOQBIAQgAyAlEJsCIAVBgIIIaiISIARBCxDkASABIFEgEhCbAiACIAFBChDkASADIAIgZxCbAiAEIANBCxDkASAFQcCGCGoiEiAEIDUQmwIgASASQQYQ5AEgAiABIC0QmwIgAyACQQwQ5AEgBCADICEQmwIgBUGAiwhqIi0gBEEKEOQBIAEgRSAtEJsCIAIgAUEJEOQBIAMgAiBlEJsCIAQgA0EKEOQBIAVBwI8IaiItIAQgCxCbAiABIC1BCBDkASACIAEgMxCbAiADIAJBCBDkASAEIAMgOBCbAiAFQYCUCGoiCyAEQQwQ5AEgASAbIAsQmwIgAiABQQgQ5AEgAyACIFsQmwIgBCADQQsQ5AEgBUHAmAhqIgsgBCAGEJsCIAEgC0EJEOQBIAIgASA0EJsCIAMgAkEKEOQBIAQgAyAYEJsCIAVBgJ0IaiILIARBBRDkASABICogCxCbAiACIAFBCxDkASADIAIgVBCbAiAEIANBChDkASAFQcChCGoiCyAEIFUQmwIgASALQQkQ5AEgAiABIBwQmwIgAyACQQcQ5AEgBCADIEoQmwIgBUGApghqIgsgBEEJEOQBIAEgYCALEJsCIAIgAUEDEOQBIAMgAiAfEJsCIAQgA0EQEOQBIAVBwKoIaiILIAQgFxCbAiABIAtBBxDkASACIAEgRBCbAiADIAJBBhDkASAEIAMgIBCbAiAFQYCvCGoiCyAEQQkQ5AEgASAsIAsQmwIgAiABQQoQ5AEgAyACIGQQmwIgBCADQQkQ5AEgBUHAswhqIgsgBCAkEJsCIAEgC0EGEOQBIAIgASA+EJsCIAMgAkEMEOQBIAQgAyATEJsCIAVBgLgIaiILIARBBhDkASABIC8gCxCbAiACIAFBDRDkASADIAIgWRCbAiAEIANBBhDkASAFQcC8CGoiCyAEIAwQmwIgASALQQsQ5AEgAiABIDYQmwIgAyACQQ8Q5AEgBCADIBMQmwIgBUGAwQhqIgsgBEEHEOQBIAEgDCALEJsCIAIgAUEJEOQBIAMgAiAPEJsCIAQgA0ENEOQBIAVBwMUIaiILIAQgYxCbAiABIAtBCRDkASACIAEgHhCbAiADIAJBBBDkASAEIAMgPRCbAiAFQYDKCGoiCyAEQQ4Q5AEgASA2IAsQmwIgAiABQQ0Q5AEgAyACIHUQmwIgBCADQQkQ5AEgBUHAzghqIgsgBCAjEJsCIAEgC0EKEOQBIAIgASAcEJsCIAMgAkEHEOQBIAQgAyBJEJsCIAVBgNMIaiILIARBCBDkASABIEYgCxCbAiACIAFBChDkASADIAIgaxCbAiAEIANBChDkASAFQcDXCGoiCyAEIEMQmwIgASALQQkQ5AEgAiABIGUQmwIgAyACQQcQ5AEgBCADIEEQmwIgBUGA3AhqIgsgBEEKEOQBIAEgdyALEJsCIAIgAUEIEOQBIAMgAiBgEJsCIAQgA0EIEOQBIAVBwOAIaiILIAQgHhCbAiABIAtBBRDkASACIAEgERCbAiADIAJBCBDkASAEIAMgIBCbAiAFQYDlCGoiCyAEQQ0Q5AEgASAaIAsQmwIgAiABQQkQ5AEgAyACIA0QmwIgBCADQQgQ5AEgBUHA6QhqIgsgBCAZEJsCIAEgC0EJEOQBIAIgASAIEJsCIAMgAkEJEOQBIAQgAyAXEJsCIAVBgO4IaiILIARBCBDkASABIDcgCxCbAiACIAFBAxDkASADIAIgOxCbAiAEIANBDRDkASAFQcDyCGoiCyAEIDEQmwIgASALQQoQ5AEgAiABICcQmwIgAyACQQgQ5AEgBCADIDIQmwIgBUGA9whqIgsgBEEJEOQBIAEgFCALEJsCIAIgAUELEOQBIAMgAiA5EJsCIAQgA0EJEOQBIAVBwPsIaiILIAQgFBCbAiABIAtBCBDkASACIAEgQhCbAiADIAJBAxDkASAEIAMgOxCbAiAFQYCACWoiCyAEQQ0Q5AEgASAkIAsQmwIgAiABQQkQ5AEgAyACIBQQmwIgBCADQQgQ5AEgBUHAhAlqIgsgBCBzEJsCIAEgC0EKEOQBIAIgASBQEJsCIAMgAkEJEOQBIAQgAyAYEJsCIAVBgIkJaiILIARBBxDkASABIEIgCxCbAiACIAFBDBDkASADIAIgWhCbAiAEIANBBBDkASAFQcCNCWoiCyAEIFMQmwIgASALQQwQ5AEgAiABIEwQmwIgAyACQQcQ5AEgBCADICMQmwIgBUGAkglqIgsgBEEJEOQBIAEgdCALEJsCIAIgAUEJEOQBIAMgAiAxEJsCIAQgA0EKEOQBIAVBwJYJaiILIAQgJhCbAiABIAtBCRDkASACIAEgTxCbAiADIAJBCBDkASAEIAMgcRCbAiAFQYCbCWoiCyAEQQoQ5AEgASAoIAsQmwIgAiABQQkQ5AEgAyACIDUQmwIgBCADQQgQ5AEgBUHAnwlqIgsgBCB3EJsCIAEgC0EIEOQBIAIgASANEJsCIAMgAkEIEOQBIAQgAyA3EJsCIAVBgKQJaiILIARBDBDkASABIBcgCxCbAiACIAFBCBDkASADIAIgFBCbAiAEIANBBRDkASAFQcCoCWoiCyAEIDwQmwIgASALQQsQ5AEgAiABIEoQmwIgAyACQQoQ5AEgBCADIBkQmwIgBUGArQlqIgsgBEEIEOQBIAEgFyALEJsCIAIgAUELEOQBIAMgAiAREJsCIAQgA0EIEOQBIAVBwLEJaiILIAQgHxCbAiABIAtBDRDkASACIAEgRhCbAiADIAJBBxDkASAEIAMgQBCbAiAFQYC2CWoiCyAEQQgQ5AEgASAsIAsQmwIgAiABQQoQ5AEgAyACIBcQmwIgBCADQQgQ5AEgBUHAuglqIgsgBCAoEJsCIAEgC0EHEOQBIAIgASAiEJsCIAMgAkEKEOQBIAQgAyAdEJsCIAVBgL8JaiILIARBCRDkASABIHIgCxCbAiACIAFBCRDkASADIAIgLxCbAiAEIANBCRDkASAFQcDDCWoiCyAEICAQmwIgASALQQ4Q5AEgAiABIAYQmwIgAyACQQoQ5AEgBCADIBgQmwIgBUGAyAlqIgsgBEEHEOQBIAEgIyALEJsCIAIgAUEJEOQBIAMgAiA/EJsCIAQgA0ELEOQBIAVBwMwJaiILIAQgahCbAiABIAtBCRDkASACIAEgIRCbAiADIAJBCBDkASAEIAMgSBCbAiAFQYDRCWoiCyAEQQYQ5AEgASAiIAsQmwIgAiABQQsQ5AEgAyACIAYQmwIgBCADQQoQ5AEgBUHA1QlqIgsgBCAIEJsCIAEgC0EIEOQBIAIgASBrEJsCIAMgAkEIEOQBIAQgAyAdEJsCIAVBgNoJaiIIIARBCBDkASABIBsgCBCbAiACIAFBBRDkASADIAIgDxCbAiAEIANBDBDkASAFQcDeCWoiCCAEIIQBEJsCIAEgCEEIEOQBIAIgASB4EJsCIAMgAkEJEOQBIAQgAyA1EJsCIAVBgOMJaiIIIARBBxDkASABIEIgCBCbAiACIAFBCRDkASADIAIgGhCbAiAEIANBChDkASAFQcDnCWoiCCAEIEEQmwIgASAIQQgQ5AEgAiABICcQmwIgAyACQQgQ5AEgBCADIHAQmwIgBUGA7AlqIgggBEEIEOQBIAEgMyAIEJsCIAIgAUELEOQBIAMgAiAmEJsCIAQgA0EIEOQBIAVBwPAJaiIIIAQgIRCbAiABIAhBDBDkASACIAEgZhCbAiADIAJBBRDkASAEIAMgUxCbAiAFQYD1CWoiCCAEQQ4Q5AEgASCFASAIEJsCIAIgAUEHEOQBIAMgAiBVEJsCIAQgA0EKEOQBIAVBwPkJaiIIIAQgYRCbAiABIAhBDBDkASACIAEgaRCbAiADIAJBCxDkASAEIAMgIRCbAiAFQYD+CWoiCCAEQQcQ5AEgASBWIAgQmwIgAiABQQgQ5AEgAyACICoQmwIgBCADQQsQ5AEgBUHAggpqIgggBCA6EJsCIAEgCEEIEOQBIAIgASBQEJsCIAMgAkEIEOQBIAQgAyAjEJsCIAVBgIcKaiIIIARBCxDkASABIB4gCBCbAiACIAFBCRDkASADIAIgYBCbAiAEIANBCBDkASAFQcCLCmoiCCAEIFgQmwIgASAIQQQQ5AEgAiABID0QmwIgAyACQQcQ5AEgBCADIB8QmwIgBUGAkApqIgggBEENEOQBIAEgYiAIEJsCIAIgAUEIEOQBIAMgAiAYEJsCIAQgA0EIEOQBIAVBwJQKaiIIIAQgXxCbAiABIAhBCBDkASACIAEgXBCbAiADIAJBCRDkASAEIAMgHBCbAiAFQYCZCmoiCCAEQQgQ5AEgASA5IAgQmwIgAiABQQgQ5AEgAyACIBgQmwIgBCADQQgQ5AEgBUHAnQpqIgggBCAoEJsCIAEgCEEREOQBIAIgASBGEJsCIAMgAkEIEOQBIAQgAyAkEJsCIAVBgKIKaiIIIARBCRDkASABIBEgCBCbAiACIAFBCxDkASADIAIgORCbAiAEIANBBxDkASAFQcCmCmoiCCAEIDAQmwIgASAIQQ4Q5AEgAiABIBMQmwIgAyACQQgQ5AEgBCADIDoQmwIgBUGAqwpqIgggBEEIEOQBIAEgKSAIEJsCIAIgAUEMEOQBIAMgAiBaEJsCIAQgA0ENEOQBIAVBwK8KaiIIIAQgQRCbAiABIAhBCBDkASACIAEgQxCbAiADIAJBChDkASAEIAMgKRCbAiAFQYC0CmoiCCAEQQsQ5AEgASAdIAgQmwIgAiABQQcQ5AEgAyACIEoQmwIgBCADQQQQ5AEgBUHAuApqIgggBCAfEJsCIAEgCEEMEOQBIAIgASBAEJsCIAMgAkEHEOQBIAQgAyAPEJsCIAVBgL0KaiIIIARBCxDkASABIDYgCBCbAiACIAFBCBDkASADIAIgYxCbAiAEIANBCBDkASAFQcDBCmoiCCAEIBQQmwIgASAIQQsQ5AEgAiABIDgQmwIgAyACQQwQ5AEgBCADICAQmwIgBUGAxgpqIgggBEEKEOQBIAEgRSAIEJsCIAIgAUEIEOQBIAMgAiAJEJsCIAQgA0EHEOQBIAVBwMoKaiIIIAQgQBCbAiABIAhBCxDkASACIAEgOhCbAiADIAJBBhDkASAEIAMgMBCbAiAFQYDPCmoiCCAEQQsQ5AEgASBNIAgQmwIgAiABQQoQ5AEgAyACIEIQmwIgBCADQQkQ5AEgBUHA0wpqIgggBCAcEJsCIAEgCEEGEOQBIAIgASAlEJsCIAMgAkEKEOQBIAQgAyBOEJsCIAVBgNgKaiIIIARBAhDkASABIAUgCBCbAiACIAFBEBDkASADIAIgFhCbAiAEIANBBhDkASAFQcDcCmoiCCAEIDAQmwIgASAIQQcQ5AEgAiABIBEQmwIgAyACQQoQ5AEgBCADIDMQmwIgBUGA4QpqIgggBEELEOQBIAEgRyAIEJsCIAIgAUEJEOQBIAMgAiBXEJsCIAQgA0EGEOQBIAVBwOUKaiIIIAQgIxCbAiABIAhBDRDkASACIAEgMBCbAiADIAJBChDkASAEIAMgaBCbAiAFQYDqCmoiCCAEQQIQ5AEgASAFIAgQmwIgAiABQQ4Q5AEgAyACIBQQmwIgBCADQQUQ5AEgBUHA7gpqIgggBCA9EJsCIAEgCEEOEOQBIAIgASBMEJsCIAMgAkEIEOQBIAQgAyAcEJsCIAVBgPMKaiIIIARBCBDkASABIAYgCBCbAiACIAFBCBDkASADIAIgeRCbAiAEIANBCxDkASAFQcD3CmoiCCAEIBkQmwIgASAIQQcQ5AEgAiABIAkQmwIgAyACQQkQ5AEgBCADIFgQmwIgBUGA/ApqIgggBEEIEOQBIAEgJyAIEJsCIAIgAUEJEOQBIAMgAiAxEJsCIAQgA0EIEOQBIAVBwIALaiIIIAQgJRCbAiABIAhBCxDkASACIAEgShCbAiADIAJBCRDkASAEIAMgIRCbAiAFQYCFC2oiCCAEQQUQ5AEgASA/IAgQmwIgAiABQQwQ5AEgAyACIFcQmwIgBCADQQcQ5AEgBUHAiQtqIgggBCAyEJsCIAEgCEEKEOQBIAIgASB4EJsCIAMgAkELEOQBIAQgAyAGEJsCIIgBIgYgBEEIEOQBIAEgeSAGEJsCIAIgAUEEEOQBIAMgAiAVEJsCIAQgA0EMEOQBIAoiBiAEIBEQmwIgASAGQQcQ5AEgAiABIGwQmwIgAyACQQgQ5AEgBCADID0QmwIgB0GQMGoiUyAEQQQQ5AEgBUHgrwtqJAAgB0HQNGoiBiBTIFIQmwIjAEGgiQprIgUkACAFIAY2AoDsCSAFIAZBoAJqIgg2AoTsCSAFQcD5CWoiASAFQYDsCWoiERCQAyAFQYD1CWoiAiABQeAA/AoAACAFQcDwCWoiAyACQeAA/AoAACAFQYD+CWoiBCADQeAA/AoAACAFQYCHCmoiDyAEQeAA/AoAACABIBEQkAMgAiABQeAA/AoAACADIAJB4AD8CgAAIAQgA0HgAPwKAAAgBUHghwpqIARB4AD8CgAAIAEgERCQAyACIAFB4AD8CgAAIAMgAkHgAPwKAAAgBCADQeAA/AoAACAFQcCICmogBEHgAPwKAAAgBUHAggpqIA9BoAL8CgAAIAUgBkHABGo2AsTnCSAFIAg2AsDnCSAFQYD1CWoiAyAFQcDnCWoiURCQAyAFQcDwCWoiBCADQeAA/AoAACAFQYDsCWoiQyAEQeAA/AoAACAFQcD5CWoiAiBDQeAA/AoAACAFQYD+CWoiASACQeAA/AoAACADIFEQkAMgBCADQeAA/AoAACBDIARB4AD8CgAAIAIgQ0HgAPwKAAAgBUHg/glqIAJB4AD8CgAAIAMgURCQAyAEIANB4AD8CgAAIEMgBEHgAPwKAAAgAiBDQeAA/AoAACAFQcD/CWogAkHgAPwKAAAgBUGAhwpqIgYgAUGgAvwKAAAgBUHghApqIAZBoAL8CgAAIAUgBUHAggpqQcAE/AoAACAFQcAEaiIGIAVBARDkASAFQYAJaiIpIAUgBhCbAiAFQcANaiIdIAYgKRCbAiAFQYASaiI5IAYgHRCbAiAFQcAWaiIqIAYgORCbAiAFQYAbaiIsIAYgKhCbAiAFQcAfaiIRIAYgLBCbAiAFQYAkaiJEIAYgERCbAiAFQcAoaiJMIAYgRBCbAiAFQYAtaiIWIAYgTBCbAiAFQcAxaiIJIAYgFhCbAiAFQYA2aiIZIAYgCRCbAiAFQcA6aiISIAYgGRCbAiAFQYA/aiIvIAYgEhCbAiAFQcDDAGoiOiAGIC8QmwIgBUGAyABqIjsgBiA6EJsCIAVBwMwAaiJFIAYgOxCbAiAFQYDRAGoiPCAGIEUQmwIgBUHA1QBqIh8gBiA8EJsCIAVBgNoAaiJGIAYgHxCbAiAFQcDeAGoiLSAGIEYQmwIgBUGA4wBqIhQgBiAtEJsCIAVBwOcAaiIXIAYgFBCbAiAFQYDsAGoiMCAGIBcQmwIgBUHA8ABqIh4gBiAwEJsCIAVBgPUAaiIhIAYgHhCbAiAFQcD5AGoiGCAGICEQmwIgBUGA/gBqIk0gBiAYEJsCIAVBwIIBaiIxIAYgTRCbAiAFQYCHAWoiICAGIDEQmwIgBUHAiwFqIhogBiAgEJsCIAVBgJABaiIVIAYgGhCbAiAFQcCUAWoiPSAGIBUQmwIgBUGAmQFqIiIgBiA9EJsCIAVBwJ0BaiJOIAYgIhCbAiAFQYCiAWoiGyAGIE4QmwIgBUHApgFqIjIgBiAbEJsCIAVBgKsBaiJJIAYgMhCbAiAFQcCvAWoiPiAGIEkQmwIgBUGAtAFqIhMgBiA+EJsCIAVBwLgBaiIjIAYgExCbAiAFQYC9AWoiMyAGICMQmwIgBUHAwQFqIj8gBiAzEJsCIAVBgMYBaiILIAYgPxCbAiAFQcDKAWoiRyAGIAsQmwIgBUGAzwFqIiUgBiBHEJsCIAVBwNMBaiIIIAYgJRCbAiAFQYDYAWoiSiAGIAgQmwIgBUHA3AFqIiQgBiBKEJsCIAVBgOEBaiInIAYgJBCbAiAFQcDlAWoiQCAGICcQmwIgBUGA6gFqIlAgBiBAEJsCIAVBwO4BaiI0IAYgUBCbAiAFQYDzAWoiNSAGIDQQmwIgBUHA9wFqIiggBiA1EJsCIAVBgPwBaiI2IAYgKBCbAiAFQcCAAmoiQSAGIDYQmwIgBUGAhQJqIiYgBiBBEJsCIAVBwIkCaiJCIAYgJhCbAiAFQYCOAmoiDyAGIEIQmwIgBUHAkgJqIjcgBiAPEJsCIAVBgJcCaiIcIAYgNxCbAiAFQcCbAmoiDSAGIBwQmwIgBUGAoAJqIlIgBiANEJsCIAVBwKQCaiJIIFJBARDkASAFQYCpAmoiBiAFIEgQmwIgASAGQQEQ5AEgBUHArQJqIkggASAFEJsCIAVBgLICaiI4IEEgSBCbAiABIEhBARDkASAFQcC2AmoiVCABIAUQmwIgBUGAuwJqIgwgOEEBEOQBIAEgVEEBEOQBIAVBwL8CaiI4IAEgBRCbAiAEIAxBAhDkASADIAQgLRCbAiACIANBCBDkASABIAIgPBCbAiAFQYDEAmoiDCABQQkQ5AEgBCBAIAwQmwIgAyAEQQcQ5AEgAiADIEAQmwIgASACQQ0Q5AEgBUHAyAJqIgwgASA1EJsCIAQgDEEHEOQBIAMgBCALEJsCIAIgA0EEEOQBIAEgAiAdEJsCIAVBgM0CaiIMIAFBCRDkASAEIB0gDBCbAiADIARBDRDkASACIAMgDxCbAiABIAJBBxDkASAFQcDRAmoiDCABIEwQmwIgBCAMQQkQ5AEgAyAEIEUQmwIgAiADQQcQ5AEgASACIEUQmwIgBUGA1gJqIgwgAUEHEOQBIAQgFCAMEJsCIAMgBEEHEOQBIAIgAyApEJsCIAEgAkEQEOQBIAVBwNoCaiIMIAEgMRCbAiAEIAxBCBDkASADIAQgLRCbAiACIANBCBDkASABIAIgIBCbAiAFQYDfAmoiDCABQQoQ5AEgBCAzIAwQmwIgAyAEQQcQ5AEgAiADIDIQmwIgASACQQYQ5AEgBUHA4wJqIgwgASAtEJsCIAQgDEEJEOQBIAMgBCALEJsCIAIgA0EHEOQBIAEgAiAREJsCIAVBgOgCaiIMIAFBChDkASAEICcgDBCbAiADIARBBxDkASACIAMgFBCbAiABIAJBChDkASAFQcDsAmoiDCABIA8QmwIgBCAMQQcQ5AEgAyAEIEEQmwIgAiADQQcQ5AEgASACIDoQmwIgBUGA8QJqIgwgAUEJEOQBIAQgGyAMEJsCIAMgBEEIEOQBIAIgAyAIEJsCIAEgAkEHEOQBIAVBwPUCaiIMIAEgERCbAiAEIAxBCRDkASADIAQgGBCbAiACIANBChDkASABIAIgNxCbAiAFQYD6AmoiDCABQQoQ5AEgBCAYIAwQmwIgAyAEQQoQ5AEgAiADIDYQmwIgASACQQcQ5AEgBUHA/gJqIgwgASAoEJsCIAQgDEEIEOQBIAMgBCBEEJsCIAIgA0ELEOQBIAEgAiAlEJsCIAVBgIMDaiIMIAFBBxDkASAEIA8gDBCbAiADIARBCBDkASACIAMgFBCbAiABIAJBChDkASAFQcCHA2oiDCABICIQmwIgBCAMQQcQ5AEgAyAEIAsQmwIgAiADQQYQ5AEgASACIB8QmwIgBUGAjANqIgwgAUEJEOQBIAQgIyAMEJsCIAMgBEEFEOQBIAIgAyAsEJsCIAEgAkEIEOQBIAVBwJADaiIMIAEgKhCbAiAEIAxBDBDkASADIAQgSRCbAiACIANBCBDkASABIAIgIxCbAiAFQYCVA2oiDCABQQcQ5AEgBCA2IAwQmwIgAyAEQQgQ5AEgAiADICMQmwIgASACQQgQ5AEgBUHAmQNqIgwgASAPEJsCIAQgDEEIEOQBIAMgBCAyEJsCIAIgA0EFEOQBIAEgAiA6EJsCIAVBgJ4DaiIMIAFBChDkASAEIDAgDBCbAiADIARBCBDkASACIAMgPhCbAiABIAJBBRDkASAFQcCiA2oiDCABIEwQmwIgBCAMQQkQ5AEgAyAEIAgQmwIgAiADQQ0Q5AEgASACICEQmwIgBUGApwNqIgwgAUEHEOQBIAQgHiAMEJsCIAMgBEEGEOQBIAIgAyAvEJsCIAEgAkEJEOQBIAVBwKsDaiIMIAEgUBCbAiAEIAxBBxDkASADIAQgERCbAiACIANBChDkASABIAIgGxCbAiAFQYCwA2oiDCABQQUQ5AEgBCBMIAwQmwIgAyAEQQoQ5AEgAiADID0QmwIgASACQQgQ5AEgBUHAtANqIgwgASAnEJsCIAQgDEEKEOQBIAMgBCAcEJsCIAIgA0EIEOQBIAEgAiA+EJsCIAVBgLkDaiIMIAFBBxDkASAEIEIgDBCbAiADIARBCRDkASACIAMgIhCbAiABIAJBBBDkASAFQcC9A2oiDCABIBEQmwIgBCAMQQ4Q5AEgAyAEID8QmwIgAiADQQYQ5AEgASACIBoQmwIgBUGAwgNqIgwgAUEFEOQBIAQgOSAMEJsCIAMgBEEKEOQBIAIgAyBNEJsCIAEgAkEJEOQBIAVBwMYDaiIMIAEgNBCbAiAEIAxBBxDkASADIAQgQBCbAiACIANBAxDkASABIAIgKRCbAiAFQYDLA2oiDCABQQ0Q5AEgBCAzIAwQmwIgAyAEQQQQ5AEgAiADICkQmwIgASACQQsQ5AEgBUHAzwNqIgwgASASEJsCIAQgDEEJEOQBIAMgBCBGEJsCIAIgA0EIEOQBIAEgAiAcEJsCIAVBgNQDaiIMIAFBBxDkASAEIFAgDBCbAiADIARBAhDkASACIAMgKRCbAiABIAJBERDkASAFQcDYA2oiDCABIDgQmwIgBCAMQQcQ5AEgAyAEIDAQmwIgAiADQQoQ5AEgASACIDUQmwIgBUGA3QNqIgwgAUEIEOQBIAQgEyAMEJsCIAMgBEEHEOQBIAIgAyAxEJsCIAEgAkEKEOQBIAVBwOEDaiIMIAEgBhCbAiAEIAxBCBDkASADIAQgRhCbAiACIANBCBDkASABIAIgIRCbAiAFQYDmA2oiDCABQQgQ5AEgBCAZIAwQmwIgAyAEQQYQ5AEgAiADIBEQmwIgASACQQkQ5AEgBUHA6gNqIgwgASAvEJsCIAQgDEEJEOQBIAMgBCAYEJsCIAIgA0EGEOQBIAEgAiA6EJsCIAVBgO8DaiIMIAFBCBDkASAEIDwgDBCbAiADIARBChDkASACIAMgHhCbAiABIAJBCBDkASAFQcDzA2oiDCABIAkQmwIgBCAMQQoQ5AEgAyAEICMQmwIgAiADQQcQ5AEgASACIBUQmwIgBUGA+ANqIgwgAUEHEOQBIAQgFyAMEJsCIAMgBEEJEOQBIAIgAyAvEJsCIAEgAkEJEOQBIAVBwPwDaiIMIAEgMBCbAiAEIAxBCBDkASADIAQgMhCbAiACIANBBhDkASABIAIgMRCbAiAFQYCBBGoiDCABQQgQ5AEgBCBNIAwQmwIgAyAEQQgQ5AEgAiADID8QmwIgASACQQcQ5AEgBUHAhQRqIgwgASA3EJsCIAQgDEEGEOQBIAMgBCAgEJsCIAIgA0EIEOQBIAEgAiAnEJsCIAVBgIoEaiIMIAFBBBDkASAEIBEgDBCbAiADIARBDRDkASACIAMgHBCbAiABIAJBBhDkASAFQcCOBGoiDCABIB4QmwIgBCAMQQgQ5AEgAyAEICgQmwIgAiADQQcQ5AEgASACID0QmwIgBUGAkwRqIgwgAUEHEOQBIAQgJCAMEJsCIAMgBEEGEOQBIAIgAyAgEJsCIAEgAkEHEOQBIAVBwJcEaiIMIAEgRhCbAiAEIAxBCBDkASADIAQgFhCbAiACIANBCxDkASABIAIgUhCbAiAFQYCcBGoiDCABQQkQ5AEgBCA+IAwQmwIgAyAEQQYQ5AEgAiADIBQQmwIgASACQQgQ5AEgBUHAoARqIgwgASAlEJsCIAQgDEEHEOQBIAMgBCAPEJsCIAIgA0EHEOQBIAEgAiBJEJsCIAVBgKUEaiIMIAFBBxDkASAEIBggDBCbAiADIARBCBDkASACIAMgShCbAiABIAJBChDkASAFQcCpBGoiDCABIDYQmwIgBCAMQQcQ5AEgAyAEIBcQmwIgAiADQQUQ5AEgASACIDkQmwIgBUGArgRqIgwgAUEPEOQBIAQgPSAMEJsCIAMgBEEIEOQBIAIgAyBBEJsCIAEgAkEDEOQBIAVBwLIEaiIMIAEgBRCbAiAEIAxBDxDkASADIAQgHhCbAiACIANBCBDkASABIAIgJBCbAiAFQYC3BGoiDCABQQkQ5AEgBCAcIAwQmwIgAyAEQQcQ5AEgAiADIBYQmwIgASACQQoQ5AEgBUHAuwRqIgwgASAIEJsCIAQgDEEIEOQBIAMgBCAPEJsCIAIgA0EFEOQBIAEgAiAZEJsCIAVBgMAEaiIMIAFBBhDkASAEICwgDBCbAiADIARBBhDkASACIAMgKRCbAiABIAJBDhDkASAFQcDEBGoiDCABIDgQmwIgBCAMQQEQ5AEgAyAEIAUQmwIgAiADQQgQ5AEgASACIEcQmwIgBUGAyQRqIjggAUEJEOQBIAQgQiA4EJsCIAMgBEEJEOQBIAIgAyAcEJsCIAEgAkEKEOQBIAVBwM0EaiI4IAEgNRCbAiAEIDhBCBDkASADIAQgHxCbAiACIANBAxDkASABIAIgBRCbAiAFQYDSBGoiOCABQQkQ5AEgBCAGIDgQmwIgAyAEQQsQ5AEgAiADIBQQmwIgASACQQcQ5AEgBUHA1gRqIjggASAhEJsCIAQgOEEHEOQBIAMgBCAVEJsCIAIgA0EHEOQBIAEgAiAUEJsCIAVBgNsEaiIVIAFBBxDkASAEIB8gFRCbAiADIARBDRDkASACIAMgPRCbAiABIAJBChDkASAFQcDfBGoiFSABID4QmwIgBCAVQQgQ5AEgAyAEIEAQmwIgAiADQQgQ5AEgASACID8QmwIgBUGA5ARqIhUgAUEGEOQBIAQgHyAVEJsCIAMgBEEJEOQBIAIgAyAjEJsCIAEgAkEIEOQBIAVBwOgEaiIVIAEgCBCbAiAEIBVBBhDkASADIAQgIBCbAiACIANBCBDkASABIAIgShCbAiAFQYDtBGoiFSABQQoQ5AEgBCAIIBUQmwIgAyAEQQcQ5AEgAiADIBMQmwIgASACQQgQ5AEgBUHA8QRqIhUgASA3EJsCIAQgFUEIEOQBIAMgBCAkEJsCIAIgA0EHEOQBIAEgAiALEJsCIAVBgPYEaiIVIAFBCBDkASAEIDIgFRCbAiADIARBBxDkASACIAMgGxCbAiABIAJBChDkASAFQcD6BGoiFSABIDIQmwIgBCAVQQwQ5AEgAyAEIAgQmwIgAiADQQkQ5AEgASACIEIQmwIgBUGA/wRqIhUgAUEKEOQBIAQgGiAVEJsCIAMgBEEIEOQBIAIgAyAgEJsCIAEgAkEHEOQBIAVBwIMFaiIVIAEgGhCbAiAEIBVBBhDkASADIAQgLxCbAiACIANBCRDkASABIAIgNRCbAiAFQYCIBWoiFSABQQUQ5AEgBCAvIBUQmwIgAyAEQQoQ5AEgAiADIEkQmwIgASACQQoQ5AEgBUHAjAVqIhUgASAyEJsCIAQgFUEEEOQBIAMgBCBEEJsCIAIgA0ELEOQBIAEgAiAiEJsCIAVBgJEFaiIVIAFBBxDkASAEIAkgFRCbAiADIARBCRDkASACIAMgMRCbAiABIAJBCRDkASAFQcCVBWoiFSABICIQmwIgBCAVQQUQ5AEgAyAEIBYQmwIgAiADQQoQ5AEgASACIEcQmwIgBUGAmgVqIhUgAUEJEOQBIAQgJiAVEJsCIAMgBEEIEOQBIAIgAyAkEJsCIAEgAkEGEOQBIAVBwJ4FaiIVIAEgIRCbAiAEIBVBCRDkASADIAQgHhCbAiACIANBBxDkASABIAIgFxCbAiAFQYCjBWoiFSABQQsQ5AEgBCBQIBUQmwIgAyAEQQgQ5AEgAiADICUQmwIgASACQQwQ5AEgBUHApwVqIhUgASAoEJsCIAQgFUELEOQBIAMgBCAiEJsCIAIgA0EHEOQBIAEgAiAPEJsCIAVBgKwFaiIVIAFBCRDkASAEIDQgFRCbAiADIARBBBDkASACIAMgLBCbAiABIAJBCxDkASAFQcCwBWoiFSABICcQmwIgBCAVQQQQ5AEgAyAEICoQmwIgAiADQQsQ5AEgASACIBMQmwIgBUGAtQVqIhMgAUEFEOQBIAQgGSATEJsCIAMgBEEGEOQBIAIgAyAqEJsCIAEgAkEKEOQBIAVBwLkFaiITIAEgSRCbAiAEIBNBCBDkASADIAQgJRCbAiACIANBBBDkASABIAIgKhCbAiAFQYC+BWoiEyABQQkQ5AEgBCAfIBMQmwIgAyAEQQoQ5AEgAiADIAYQmwIgASACQQcQ5AEgBUHAwgVqIhMgASAUEJsCIAQgE0EKEOQBIAMgBCBEEJsCIAIgA0EKEOQBIAEgAiAlEJsCIAVBgMcFaiITIAFBBhDkASAEIDEgExCbAiADIARBCRDkASACIAMgNBCbAiABIAJBBhDkASAFQcDLBWoiEyABIDAQmwIgBCATQQcQ5AEgAyAEIBYQmwIgAiADQQkQ5AEgASACICYQmwIgBUGA0AVqIhMgAUEHEOQBIAQgJiATEJsCIAMgBEEKEOQBIAIgAyAXEJsCIAEgAkEMEOQBIAVBwNQFaiITIAEgQRCbAiAEIBNBBhDkASADIAQgKRCbAiACIANBDBDkASABIAIgKBCbAiAFQYDZBWoiEyABQQgQ5AEgBCAhIBMQmwIgAyAEQQYQ5AEgAiADIBkQmwIgASACQQkQ5AEgBUHA3QVqIhMgASAlEJsCIAQgE0EKEOQBIAMgBCAbEJsCIAIgA0EHEOQBIAEgAiAcEJsCIAVBgOIFaiITIAFBCRDkASAEIFIgExCbAiADIARBCxDkASACIAMgQRCbAiABIAJBBxDkASAFQcDmBWoiEyABIDYQmwIgBCATQQkQ5AEgAyAEID4QmwIgAiADQQcQ5AEgASACIBsQmwIgBUGA6wVqIhMgAUEGEOQBIAQgLCATEJsCIAMgBEELEOQBIAIgAyAjEJsCIAEgAkEGEOQBIAVBwO8FaiITIAEgEhCbAiAEIBNBChDkASADIAQgNBCbAiACIANBCBDkASABIAIgCxCbAiAFQYD0BWoiEyABQQUQ5AEgBCAZIBMQmwIgAyAEQQYQ5AEgAiADIB0QmwIgASACQQsQ5AEgBUHA+AVqIhMgASAzEJsCIAQgE0EGEOQBIAMgBCAYEJsCIAIgA0EFEOQBIAEgAiAREJsCIAVBgP0FaiITIAFBCxDkASAEIBggExCbAiADIARBCBDkASACIAMgEhCbAiABIAJBChDkASAFQcCBBmoiEyABIBwQmwIgBCATQQgQ5AEgAyAEIA8QmwIgAiADQQYQ5AEgASACICwQmwIgBUGAhgZqIhMgAUEIEOQBIAQgEiATEJsCIAMgBEEJEOQBIAIgAyAGEJsCIAEgAkEIEOQBIAVBwIoGaiITIAEgShCbAiAEIBNBBhDkASADIAQgRBCbAiACIANBDRDkASABIAIgJBCbAiAFQYCPBmoiEyABQQgQ5AEgBCAkIBMQmwIgAyAEQQUQ5AEgAiADIBIQmwIgASACQQkQ5AEgBUHAkwZqIhMgASA0EJsCIAQgE0EJEOQBIAMgBCALEJsCIAIgA0EDEOQBIAEgAiA5EJsCIAVBgJgGaiITIAFBDBDkASAEICIgExCbAiADIARBBhDkASACIAMgPBCbAiABIAJBCBDkASAFQcCcBmoiEyABIEoQmwIgBCATQQoQ5AEgAyAEICAQmwIgAiADQQoQ5AEgASACIBQQmwIgBUGAoQZqIhMgAUEKEOQBIAQgBiATEJsCIAMgBEEJEOQBIAIgAyAaEJsCIAEgAkEHEOQBIAVBwKUGaiIGIAEgOxCbAiAEIAZBBxDkASADIAQgEhCbAiACIANBCRDkASABIAIgCRCbAiAFQYCqBmoiBiABQQoQ5AEgBCA3IAYQmwIgAyAEQQkQ5AEgAiADID8QmwIgASACQQgQ5AEgBUHArgZqIgYgASAJEJsCIAQgBkEJEOQBIAMgBCBBEJsCIAIgA0EFEOQBIAEgAiAqEJsCIAVBgLMGaiIGIAFBBxDkASAEICwgBhCbAiADIARBDBDkASACIAMgCBCbAiABIAJBBxDkASAFQcC3BmoiBiABICIQmwIgBCAGQQkQ5AEgAyAEIEcQmwIgAiADQQkQ5AEgASACIEAQmwIgBUGAvAZqIgYgAUEHEOQBIAQgCyAGEJsCIAMgBEEKEOQBIAIgAyA7EJsCIAEgAkEIEOQBIAVBwMAGaiIGIAEgOxCbAiAEIAZBBxDkASADIAQgGRCbAiACIANBChDkASABIAIgJhCbAiAFQYDFBmoiBiABQQUQ5AEgBCAZIAYQmwIgAyAEQQkQ5AEgAiADIB8QmwIgASACQQoQ5AEgBUHAyQZqIgYgASAIEJsCIAQgBkEEEOQBIAMgBCBEEJsCIAIgA0ELEOQBIAEgAiAzEJsCIAVBgM4GaiIGIAFBBxDkASAEID0gBhCbAiADIARBCRDkASACIAMgNxCbAiABIAJBChDkASAFQcDSBmoiBiABIEAQmwIgBCAGQQEQ5AEgAyAEIAUQmwIgAiADQREQ5AEgASACID0QmwIgBUGA1wZqIgYgAUEIEOQBIAQgCCAGEJsCIAMgBEEHEOQBIAIgAyA/EJsCIAEgAkEGEOQBIAVBwNsGaiIGIAEgIBCbAiAEIAZBCBDkASADIAQgJxCbAiACIANBBRDkASABIAIgLxCbAiAFQYDgBmoiBiABQQwQ5AEgBCA1IAYQmwIgAyAEQQgQ5AEgAiADIDYQmwIgASACQQgQ5AEgBUHA5AZqIgYgASAbEJsCIAQgBkECEOQBIAMgBCAFEJsCIAIgA0EKEOQBIAEgAiBIEJsCIAVBgOkGaiIGIAFBBxDkASAEIBcgBhCbAiADIARBAxDkASACIAMgKRCbAiABIAJBDBDkASAFQcDtBmoiBiABIA8QmwIgBCAGQQYQ5AEgAyAEIAUQmwIgAiADQQwQ5AEgASACIEYQmwIgBUGA8gZqIgYgAUEJEOQBIAQgIyAGEJsCIAMgBEEGEOQBIAIgAyAhEJsCIAEgAkELEOQBIAVBwPYGaiIGIAEgJxCbAiAEIAZBBhDkASADIAQgMBCbAiACIANBCxDkASABIAIgJhCbAiAFQYD7BmoiBiABQQMQ5AEgBCA5IAYQmwIgAyAEQQsQ5AEgAiADIAsQmwIgASACQQUQ5AEgBUHA/wZqIgYgASA6EJsCIAQgBkEJEOQBIAMgBCAmEJsCIAIgA0EFEOQBIAEgAiAREJsCIAVBgIQHaiIGIAFBCxDkASAEIEggBhCbAiADIARBBhDkASACIAMgFhCbAiABIAJBCxDkASAFQcCIB2oiBiABIDUQmwIgBCAGQQcQ5AEgAyAEIA8QmwIgAiADQQYQ5AEgASACIBYQmwIgBUGAjQdqIgYgAUEJEOQBIAQgNiAGEJsCIAMgBEEKEOQBIAIgAyAnEJsCIAEgAkEHEOQBIAVBwJEHaiIGIAEgGxCbAiAEIAZBAxDkASADIAQgORCbAiACIANBDBDkASABIAIgNxCbAiAFQYCWB2oiBiABQQEQ5AEgBCAFIAYQmwIgAyAEQQ8Q5AEgAiADIBoQmwIgASACQQgQ5AEgBUHAmgdqIgYgASA2EJsCIAQgBkEFEOQBIAMgBCAREJsCIAIgA0EKEOQBIAEgAiBHEJsCIAVBgJ8HaiIGIAFBChDkASAEIDUgBhCbAiADIARBBhDkASACIAMgTRCbAiABIAJBCxDkASAFQcCjB2oiBiABIBYQmwIgBCAGQQwQ5AEgAyAEIBwQmwIgAiADQQgQ5AEgASACICQQmwIgBUGAqAdqIgYgAUEGEOQBIAQgCSAGEJsCIAMgBEEJEOQBIAIgAyAlEJsCIAEgAkEIEOQBIAVBwKwHaiIGIAEgCxCbAiAEIAZBBRDkASADIAQgOhCbAiACIANBCBDkASABIAIgRRCbAiAFQYCxB2oiBiABQQgQ5AEgBCAoIAYQmwIgAyAEQQgQ5AEgAiADID4QmwIgASACQQgQ5AEgBUHAtQdqIgYgASAfEJsCIAQgBkEMEOQBIAMgBCANEJsCIAIgA0EJEOQBIAEgAiAiEJsCIAVBgLoHaiIGIAFBARDkASAEIAUgBhCbAiADIARBCxDkASACIAMgVBCbAiABIAJBCRDkASAFQcC+B2oiBiABIA8QmwIgBCAGQQcQ5AEgAyAEIBQQmwIgAiADQQgQ5AEgASACIEIQmwIgBUGAwwdqIgYgAUEEEOQBIAQgRCAGEJsCIAMgBEEKEOQBIAIgAyBOEJsCIAEgAkEHEOQBIAVBwMcHaiIGIAEgGhCbAiAEIAZBCRDkASADIAQgKBCbAiACIANBBhDkASABIAIgGBCbAiAFQYDMB2oiBiABQQYQ5AEgBCA6IAYQmwIgAyAEQQgQ5AEgAiADIB0QmwIgASACQQsQ5AEgBUHA0AdqIgYgASA+EJsCIAQgBkEJEOQBIAMgBCAbEJsCIAIgA0ECEOQBIAEgAiApEJsCIAVBgNUHaiIGIAFBDBDkASAEIA8gBhCbAiADIARBBhDkASACIAMgIBCbAiABIAJBBhDkASAFQcDZB2oiBiABIAkQmwIgBCAGQQkQ5AEgAyAEIEUQmwIgAiADQQcQ5AEgASACIBcQmwIgBUGA3gdqIgYgAUEJEOQBIAQgNCAGEJsCIAMgBEEHEOQBIAIgAyAtEJsCIAEgAkEIEOQBIAVBwOIHaiIGIAEgFxCbAiAEIAZBCBDkASADIAQgThCbAiACIANBBBDkASABIAIgKhCbAiAFQYDnB2oiBiABQQsQ5AEgBCA3IAYQmwIgAyAEQQcQ5AEgAiADIB4QmwIgASACQQcQ5AEgBUHA6wdqIgYgASA8EJsCIAQgBkEMEOQBIAMgBCBHEJsCIAIgA0EEEOQBIAEgAiAREJsCIAVBgPAHaiIGIAFBCxDkASAEICcgBhCbAiADIARBBRDkASACIAMgOxCbAiABIAJBCRDkASAFQcD0B2oiBiABIDEQmwIgBCAGQQgQ5AEgAyAEIDMQmwIgAiADQQcQ5AEgASACICcQmwIgBUGA+QdqIgYgAUEHEOQBIAQgFyAGEJsCIAMgBEEIEOQBIAIgAyA2EJsCIAEgAkEGEOQBIAVBwP0HaiIGIAEgRhCbAiAEIAZBCBDkASADIAQgThCbAiACIANBCRDkASABIAIgRRCbAiAFQYCCCGoiBiABQQkQ5AEgBCALIAYQmwIgAyAEQQcQ5AEgAiADICgQmwIgASACQQoQ5AEgBUHAhghqIgYgASAkEJsCIAQgBkEKEOQBIAMgBCAfEJsCIAIgA0EHEOQBIAEgAiAwEJsCIAVBgIsIaiIGIAFBBhDkASAEIDsgBhCbAiADIARBCRDkASACIAMgFxCbAiABIAJBChDkASAFQcCPCGoiBiABIDQQmwIgBCAGQQcQ5AEgAyAEIBcQmwIgAiADQQgQ5AEgASACIA8QmwIgBUGAlAhqIgYgAUEHEOQBIAQgPCAGEJsCIAMgBEEIEOQBIAIgAyAbEJsCIAEgAkEHEOQBIAVBwJgIaiIGIAEgGBCbAiAEIAZBCBDkASADIAQgQhCbAiACIANBBxDkASABIAIgIxCbAiAFQYCdCGoiBiABQQYQ5AEgBCAtIAYQmwIgAyAEQQYQ5AEgAiADIEwQmwIgASACQQcQ5AEgBUHAoQhqIgYgASAZEJsCIAQgBkEJEOQBIAMgBCAmEJsCIAIgA0EIEOQBIAEgAiAeEJsCIAVBgKYIaiIGIAFBBxDkASAEIB8gBhCbAiADIARBCBDkASACIAMgMxCbAiABIAJBCRDkASAFQcCqCGoiBiABIFAQmwIgBCAGQQcQ5AEgAyAEICIQmwIgAiADQQoQ5AEgASACIBwQmwIgBUGArwhqIgYgAUEHEOQBIAQgHSAGEJsCIAMgBEEMEOQBIAIgAyA3EJsCIAEgAkEHEOQBIAVBwLMIaiIGIAEgNRCbAiAEIAZBBhDkASADIAQgIRCbAiACIANBCRDkASABIAIgCRCbAiAFQYC4CGoiBiABQQYQ5AEgBCAdIAYQmwIgAyAEQQ0Q5AEgAiADIBkQmwIgASACQQoQ5AEgBUHAvAhqIgYgASAIEJsCIAQgBkEFEOQBIAMgBCAqEJsCIAIgA0EMEOQBIAEgAiBFEJsCIAVBgMEIaiIGIAFBBhDkASAEICogBhCbAiADIARBCRDkASACIAMgOxCbAiABIAJBDBDkASAFQcDFCGoiBiABIA0QmwIgBCAGQQoQ5AEgAyAEIAgQmwIgAiADQQwQ5AEgASACIA0QmwIgBUGAyghqIgYgAUEJEOQBIAQgMiAGEJsCIAMgBEEHEOQBIAIgAyAUEJsCIAEgAkEJEOQBIAVBwM4IaiIGIAEgRhCbAiAEIAZBCRDkASADIAQgLxCbAiACIANBCRDkASABIAIgJxCbAiAFQYDTCGoiBiABQQkQ5AEgBCA/IAYQmwIgAyAEQQYQ5AEgAiADIB4QmwIgASACQQgQ5AEgBUHA1whqIgYgASAoEJsCIAQgBkEHEOQBIAMgBCAYEJsCIAIgA0EIEOQBIAEgAiAbEJsCIAVBgNwIaiIGIAFBBhDkASAEIBQgBhCbAiADIARBChDkASACIAMgLxCbAiABIAJBCRDkASAFQcDgCGoiBiABIBQQmwIgBCAGQQUQ5AEgAyAEIB0QmwIgAiADQQgQ5AEgASACIDkQmwIgBUGA5QhqIgYgAUEKEOQBIAQgOiAGEJsCIAMgBEEKEOQBIAIgAyAmEJsCIAEgAkELEOQBIAVBwOkIaiIGIAEgLRCbAiAEIAZBBxDkASADIAQgIBCbAiACIANBDhDkASABIAIgMBCbAiAFQYDuCGoiBiABQQIQ5AEgBCAFIAYQmwIgAyAEQQ4Q5AEgAiADIEoQmwIgASACQQcQ5AEgBUHA8ghqIgYgASAoEJsCIAQgBkEHEOQBIAMgBCBCEJsCIAIgA0EEEOQBIAEgAiAdEJsCIAVBgPcIaiIGIAFBDBDkASAEIB4gBhCbAiADIARBBRDkASACIAMgERCbAiABIAJBCxDkASAFQcD7CGoiBiABIEcQmwIgBCAGQQcQ5AEgAyAEICUQmwIgAiADQQYQ5AEgASACICEQmwIgBUGAgAlqIgYgAUEJEOQBIAQgGCAGEJsCIAMgBEEPEOQBIAIgAyAkEJsCIAEgAkEHEOQBIAVBwIQJaiIGIAEgLRCbAiAEIAZBCRDkASADIAQgSRCbAiACIANBBxDkASABIAIgIRCbAiAFQYCJCWoiBiABQQcQ5AEgBCAJIAYQmwIgAyAEQQYQ5AEgAiADIBEQmwIgASACQQkQ5AEgBUHAjQlqIgYgASAtEJsCIAQgBkEJEOQBIAMgBCAzEJsCIAIgA0EJEOQBIAEgAiBSEJsCIAVBgJIJaiIGIAFBCBDkASAEID8gBhCbAiADIARBBRDkASACIAMgCRCbAiABIAJBChDkASAFQcCWCWoiBiABIBsQmwIgBCAGQQgQ5AEgAyAEIBgQmwIgAiADQQQQ5AEgASACIB0QmwIgBUGAmwlqIgYgAUEKEOQBIAQgMSAGEJsCIAMgBEEIEOQBIAIgAyASEJsCIAEgAkEJEOQBIAVBwJ8JaiIGIAEgCBCbAiAEIAZBBxDkASADIAQgKBCbAiACIANBCxDkASABIAIgQRCbAiAFQYCkCWoiBiABQQcQ5AEgBCAkIAYQmwIgAyAEQQIQ5AEgAiADICkQmwIgASACQQ8Q5AEgBUHAqAlqIgYgASAjEJsCIAQgBkEFEOQBIAMgBCAREJsCIAIgA0EIEOQBIAEgAiAWEJsCIAVBgK0JaiIGIAFBCRDkASAEIDMgBhCbAiADIARBBxDkASACIAMgQhCbAiABIAJBBxDkASAFQcCxCWoiBiABIAsQmwIgBCAGQQgQ5AEgAyAEICMQmwIgAiADQQgQ5AEgASACIBcQmwIgBUGAtglqIgYgAUELEOQBIAQgQCAGEJsCIAMgBEEHEOQBIAIgAyAwEJsCIAEgAkEJEOQBIAVBwLoJaiIGIAEgIBCbAiAEIAZBBhDkASADIAQgOxCbAiACIANBBhDkASABIAIgLBCbAiAFQYC/CWoiBiABQQsQ5AEgBCA9IAYQmwIgAyAEQQcQ5AEgAiADIDQQmwIgASACQQQQ5AEgBUHAwwlqIgYgASAsEJsCIAQgBkEKEOQBIAMgBCANEJsCIAIgA0EDEOQBIAEgAiAFEJsCIAVBgMgJaiIGIAFBDBDkASAEIDEgBhCbAiADIARBCRDkASACIAMgThCbAiABIAJBBxDkASAFQcDMCWoiBiABIBwQmwIgBCAGQQcQ5AEgAyAEICYQmwIgAiADQQYQ5AEgASACIDwQmwIgBUGA0QlqIgYgAUEIEOQBIAQgMiAGEJsCIAMgBEEIEOQBIAIgAyAIEJsCIAEgAkEFEOQBIAVBwNUJaiIGIAEgHRCbAiAEIAZBCxDkASADIAQgHBCbAiACIANBBRDkASABIAIgCRCbAiAFQYDaCWoiBiABQQkQ5AEgBCAiIAYQmwIgAyAEQQUQ5AEgAiADIAkQmwIgASACQQgQ5AEgBUHA3glqIgYgASAfEJsCIAQgBkEGEOQBIAMgBCAWEJsCIAIgA0EIEOQBIAEgAiBNEJsCIAVBgOMJaiIGIAFBDxDkASAEICUgBhCbAiADIARBBBDkASACIAMgORCbAiABIAJBDBDkASBRIAEgSBCbAiAEIFFBCBDkASADIAQgDRCbAiACIANBCBDkASABIAIgCxCbAiBDIAFBBxDkASACICUgQxCbAiABIAJBChDkASAHQZAnaiIDIAEgPBCbAiAFQaCJCmokACAHQdAraiIBIFNBwAT8CgAAIAdBkB5qIgIgA0HABPwKAAAgB0HQImoiAyABQcAE/AoAACAAIAIQtQMgAEGQAWogAxC1AwwBCyAHQQI2ApQnIAdB0MnBADYCkCcgB0IBNwKcJyAHIAdBDGqtQoCAgIDgAYQ3A9A0IAcgB0HQNGo2ApgnIAdBkCdqQZTKwQAQqAQACyAHKALAASIABEAgBygCxAEgAEECdBDfBAsgBygCsAEiAARAIAcoArQBIABBAnQQ3wQLIAcoAqABIgAEQCAHKAKkASAAQQJ0EN8ECyAHKAKQASIABEAgBygClAEgAEECdBDfBAsgBygCgAEiAARAIAcoAoQBIABBAnQQ3wQLIAcoAnAiAARAIAcoAnQgAEECdBDfBAsgBygCYCIABEAgBygCZCAAQQJ0EN8ECyAHKAJQIgAEQCAHKAJUIABBAnQQ3wQLIAcoAkAiAARAIAcoAkQgAEECdBDfBAsgBygCMCIABEAgBygCNCAAQQJ0EN8ECyAHKAIgIgAEQCAHKAIkIABBAnQQ3wQLIAcoAhAiAARAIAcoAhQgAEECdBDfBAsgB0GQOWokAAvFFQIIfxh+IwBB0AFrIgMkACADQQA2AgggA0KAgICAgAE3AgAgA0EANgIUIANCgICAgIABNwIMAkACQAJAIAJFDQAgAUEgaiIEQbizwgBBIBDxA0UNAiABIAJByABsaiEIIANBMGohBiADQcABaiEHIANBOGohCUGws8IAKQMAIR9BqLPCACkDACEgQaCzwgApAwAhIUGYs8IAKQMAISIDQEIAIRQgA0HgAGpCADcDACADQdgAakIANwMAIANCADcDUCADQgE3A2ggA0GIAWogBEEYaikDADcDACADQYABaiAEQRBqKQMANwMAIANB+ABqIARBCGopAwA3AwAgAyAEKQMANwNwIANBqAFqIB83AwAgA0GgAWogIDcDACADQZgBaiAhNwMAIAMgIjcDkAEgA0GwAWohBQJ/IANB8ABqIANB0ABqQSAQ8QNFBEBCifWrnLWLv5ZzIRVC+4OUop2ixvO1fyEXQvb/hdLw38fVxwAhDUKf6uDVnO6n7AYhFkIAIRhCACETIAcMAQtCifWrnLWLv5ZzIRVC+4OUop2ixvO1fyEXQvb/hdLw38fVxwAhEkKf6uDVnO6n7AYhFkKNlcfDltLawJd/IRlC3bCFjOi2kai4fyEOQqnAxomuzpOyMCEcQsf688PtgqOQPCELIAMpA4gBIQwgAykDcCEdIAMpA3ghDyADKQOAASEaQgAhDUIAIRhCACETA0AgA0GQAWogA0HQAGpBIBDxA0UEQCADQShqIQUgCQwCCyAMp0EBcUUEQANAIBpCP4YgDEIBiIQhDAJAIBVCAYNQBEAgEiEQIBchESAVIRsMAQsgFiASQqPP+vOXye7XxwB9IhAgElQgECAQIBdC8+q4vOmtpb/oAH0iESAXVCARIBEgFULH+vPD7YKjkDx8IhsgFVStfCIRVnKtfCIQVnKtfEKpwMaJrs6TsjB8IRYLIB1CP4YgD0I/hiAaQgGIhCEaIB1CAYghHSAWQj+GIBBCAYiEIRIgEEI/hiARQgGIhCEXIBFCP4YgG0IBiIQhFSAWQgGIIRYgD0IBiIQhDyAMQgGDUA0ACyADIBo3A4ABIAMgDDcDiAEgAyAPNwN4IAMgHTcDcAsgC6dBAXFFBEADQCAZQj+GIAtCAYiEIQsCQCATQgGDUARAIA0hECAYIREgEyEbDAELIBQgDUKjz/rzl8nu18cAfSIQIA1UIBAgECAYQvPquLzpraW/6AB9IhEgGFQgESARIBNCx/rzw+2Co5A8fCIbIBNUrXwiEVZyrXwiEFZyrXxCqcDGia7Ok7IwfCEUCyAcQj+GIA5CP4YgGUIBiIQhGSAcQgGIIRwgFEI/hiAQQgGIhCENIBBCP4YgEUIBiIQhGCARQj+GIBtCAYiEIRMgFEIBiCEUIA5CAYiEIQ4gC0IBg1ANAAsgAyAZNwOgASADIAs3A6gBIAMgDjcDmAEgAyAcNwOQAQsCQAJAAkACQAJAAkACQCAcIhAgHSIRUg0AIA4hECAPIREgDiAPUg0AIBkiECAaIhFSDQAgCyEQIAwhESALIAxRDQELIBAgEVgNACADIAsgDH0iEDcDqAEgAyAZIBp9IhsgCyAMVK0iC30iETcDoAEgAyAOIA99Ih4gGSAaVCALIBtWcq0iC30iGzcDmAEgAyAcIB19IA4gD1QgCyAeVnKtfSIcNwOQAQJAAkAgFCILIBYiDlINACANIQsgEiIOIA1SDQAgFyIOIBgiC1INACAVIg4gEyILUQ0BCyALIA5UDQILIBQgFn0gDSASVCANIBJ9Ig4gGCAXfSILIBMgFVStIg1UIBcgGFZyrSIZVHKtfSEUIBMgFX0hEyALIA19IRggDiAZfSENDAILIAMgDCALfSIQNwOIASADIBogGX0iGyALIAxWrSIMfSIRNwOAASADIA8gDn0iHiAMIBtWIBkgGlZyrSIMfSIbNwN4IAMgHSAcfSAMIB5WIA4gD1ZyrX0iHTcDcAJAAkAgFCIPIBYiDFINACANIQ8gEiIMIA1SDQAgFyIMIBgiD1INACAVIgwgEyIPUQ0BCyAMIA9UDQMLIBYgFH0gEiANfSIPIBcgGFQgFyAYfSIMIBMgFVatIhdUcq0iGlQgDSASVnKtfSEWIBUgE30hFSAMIBd9IRcgDyAafSESDAMLIBQgFn1C3bCFjOi2kai4fyASfSIOQo2Vx8OW0trAl38gF30iCyAVQsf688PtgqOQPFatIhRUIBdCjZXHw5bS2sCXf1ZyrSIZVCASQt2whYzotpGouH9Wcq19IA0gDiAZfSINfCIOIA1UIA4gCyAUfSINIBh8IgsgDVQgC0LH+vPD7YKjkDwgFX0iDSATfCITIA1UrXwiGCALVHKtfCINIA5Ucq18QqnAxomuzpOyMHwhFAsgESEZIBshDiAQIQsMAgsgFiAUfULdsIWM6LaRqLh/IA19Ig9CjZXHw5bS2sCXfyAYfSIMIBNCx/rzw+2Co5A8Vq0iFlQgGEKNlcfDltLawJd/VnKtIhpUIA1C3bCFjOi2kai4f1ZyrX0gEiAPIBp9IhJ8Ig8gElQgDyAMIBZ9IhIgF3wiDCASVCAMQsf688PtgqOQPCATfSISIBV8IhUgElStfCIXIAxUcq18IhIgD1RyrXxCqcDGia7Ok7IwfCEWCyARIRogGyEPIBAhDAsgA0HwAGogA0HQAGpBIBDxAw0ACyASIQ0gBwshAiADIBM3A0AgAyAYNwM4IAMgFzcDwAEgAyAVNwPIASADQSBqIgogAkEIaikDADcDACADIBY3A7ABIAMgFDcDKCADIAIpAwA3AxggBSkDACEOIAMoAggiBSADKAIARgRAIANBhLrCABCiAwsgAygCBCAFQQV0aiICIA03AwggAiAONwMAIAIgAykDGDcDECACQRhqIAopAwA3AwAgAyAFQQFqNgIIIANBKGogASAEEFsgAygCKEEBRg0CIANByAFqIAZBGGopAwA3AwAgA0HAAWogBkEQaikDADcDACADQbgBaiAGQQhqKQMANwMAIAMgBikDADcDsAECfiADQbABakG4s8IAQSAQ8QMEQEKNlcfDltLawJd/IAMpA8ABIg59Ig8gAykDyAEiC0LH+vPD7YKjkDxWrSIMfSEUQt2whYzotpGouH8gAykDuAEiEH0iESAMIA9WIA5CjZXHw5bS2sCXf1ZyrSIOfSEWQsf688PtgqOQPCALfSETQqnAxomuzpOyMCADKQOwASAOIBFWIBBC3bCFjOi2kai4f1ZyrXx9DAELIAMpA8gBIRMgAykDwAEhFCADKQO4ASEWIAMpA7ABCyEVIAMoAhQiBCADKAIMRgRAIANBDGpBlLrCABCiAwsgAygCECAEQQV0aiICIBM3AxggAiAUNwMQIAIgFjcDCCACIBU3AwAgAyAEQQFqNgIUIAFByABqIgIgCEYNASABQegAaiEEIAIhASAEQbizwgBBIBDxAw0ACwwCCyAAIAMpAgA3AgAgACADKQIMNwIMIABBCGogA0EIaigCADYCACAAQRRqIANBFGooAgA2AgAgA0HQAWokAA8LIAMgAykDODcDuAEgAyADKQMwNwOwAUGgscIAQSsgA0GwAWpBpLrCAEG0usIAEMoDAAsgAyANNwMwIANCAjcDKEGgscIAQSsgA0EoakGkusIAQcS6wgAQygMAC/sLAg5/An5CAiEQIwBBgAlrIgIkACACQegGaiABQQhqKQMANwMAIAJB8AZqIAFBEGopAwA3AwAgAkH4BmogAUEYaikDADcDACACQYAHaiABQSBqKQMANwMAIAJBiAdqIAFBKGopAwA3AwAgAkGYB2ogAUE4aikDADcDACACQaAHaiABQUBrKQMANwMAIAJBqAdqIAFByABqKQMANwMAIAJBsAdqIAFB0ABqKQMANwMAIAJBuAdqIAFB2ABqKQMANwMAIAIgASkDADcD4AYgAiABKQMwNwOQByACQcAEaiIFIAJB4AZqIgNB4AD8CgAAIAJByAJqIgQgAUGIAWopAwA3AwAgAkHAAmoiBiABQYABaikDADcDACACQbgCaiIHIAFB+ABqKQMANwMAIAJBsAJqIgggAUHwAGopAwA3AwAgAkGoAmoiCSABQegAaikDADcDACACQdgCaiIKIAFBmAFqKQMANwMAIAJB4AJqIgsgAUGgAWopAwA3AwAgAkHoAmoiDCABQagBaikDADcDACACQfACaiINIAFBsAFqKQMANwMAIAJB+AJqIg4gAUG4AWopAwA3AwAgAiABKQNgNwOgAiACIAEpA5ABNwPQAiADIAJBoAJqIg9B4AD8CgAAIAJBoAVqIANB4AD8CgAAIAQgAUHoAWopAwA3AwAgBiABQeABaikDADcDACAHIAFB2AFqKQMANwMAIAggAUHQAWopAwA3AwAgCSABQcgBaikDADcDACAKIAFB+AFqKQMANwMAIAsgAUGAAmopAwA3AwAgDCABQYgCaikDADcDACANIAFBkAJqKQMANwMAIA4gAUGYAmopAwA3AwAgAiABKQPAATcDoAIgAiABKQPwATcD0AIgAyAPQeAA/AoAACACQYAGaiADQeAA/AoAACACIAVBoAL8CgAAA0AgAkHABGoiASACIAIQuQIgAiABQaAC/AoAACAQQgKDIBBCAYghEFANAAsgAkGoCGogAkEIaikDADcDACACQbAIaiACQRBqKQMANwMAIAJBuAhqIAJBGGopAwA3AwAgAkHACGogAkEgaikDADcDACACQcgIaiACQShqKQMANwMAIAJB2AhqIAJBOGopAwA3AwAgAkHgCGogAkFAaykDADcDACACQegIaiACQcgAaikDADcDACACQfAIaiACQdAAaikDADcDACACQfgIaiACQdgAaikDADcDACACIAIpAwA3A6AIIAIgAikDMDcD0AggASACQaAIakHgAPwKAAAgAkHIAmoiASACQYgBaikDADcDACACQcACaiIEIAJBgAFqKQMANwMAIAJBuAJqIgYgAkH4AGopAwA3AwAgAkGwAmoiByACQfAAaikDADcDACACQagCaiIIIAJB6ABqKQMANwMAIAJB2AJqIgkgAkGYAWopAwA3AwAgAkHgAmoiCiACQaABaikDADcDACACQegCaiILIAJBqAFqKQMANwMAIAJB8AJqIgwgAkGwAWopAwA3AwAgAkH4AmoiDSACQbgBaikDADcDACACIAIpA2A3A6ACIAIgAikDkAE3A9ACIAJBoAhqIgMgAkGgAmoiBUHgAPwKAAAgAkGgBWogA0HgAPwKAAAgASACQegBaikDADcDACAEIAJB4AFqKQMANwMAIAYgAkHYAWopAwA3AwAgByACQdABaikDADcDACAIIAJByAFqKQMANwMAIAkgAkH4AWopAwA3AwAgCiACQYACaikDADcDACALIAJBiAJqKQMANwMAIAwgAkGQAmopAwA3AwAgDSACQZgCaikDADcDACACIAIpA8ABNwOgAiACIAIpA/ABNwPQAiADIAVB4AD8CgAAIAJBgAZqIANB4AD8CgAAIAUgAkHABGpBoAL8CgAAIBBCAVIEQANAIAJBwARqIgQgAkGgAmoiASABELkCIAEgBEGgAvwKAAAgEEICg1BFBEAgAkHABGoiASACIAJBoAJqELkCIAIgAUGgAvwKAAALIBBCBFQgEEIBiCEQRQ0ACwsgACACQaAC/AoAACACQYAJaiQAC+IZAwp/CX4CfCMAQfAAayICJAAgASgCBCEFQQQhCSABKAIIIgMhBAJAAkACQAJAAkACQAJAAkAgAw4CBQABCyAFKAIAQQFGDQMgBUEEaiEEDAELIAUgA0ECdCIJaiEEIANBAWtB/v///wNxDQELA0AgBTUCACANhiAPfCEPIA1CIHwhDSAFQQRqIgUgBEcNAAsCfgJAAkACQAJAAkAgD0IEWgRAIA+6n/wHIg5QDQEgDiAPIA6AIA58QgGIIhBUDQIgECEMDAMLIA9CAFKtIQ4MAwtBgIzFABCaBAALA0AgECAPIBCAIBB8QgGIIgxUIBAhDiAMIRANAAsLIAwgDloNAANAIAwiDlANAiAOIA8gDIAgDHxCAYgiDFYNAAsLIA4MAQtBgIzFABCaBAALIQ1BACEJIAJB4ABqIgNBtLzEACgCADYCACACQay8xAApAgA3A1ggDVBFBEBBASEFA0AgAigCWCAFQQFrRgRAIAJB2ABqQaC9xAAQpQMLIAIoAlwgCWogDT4CACAJQQRqIQkgAiAFNgJgIAVBAWohBSANQoCAgIAQVCANQiCIIQ1FDQALCyAAIAIpA1g3AgAgAEEIaiADKAIANgIADAMLIAOtQgWGIARBBGsoAgBnrSIMfSIUQgGIIRAgBUEEayEDQgAgDH0hEgNAIBJCAX1CH4MiDEIBfCITQsAAIA99Ig4gDiATVhshESADIAlqIQYgD0LAAFIEQCANIBGGIAY1AgAgEyARfYiEIQ0LIAwgDloEQCANIAY1AgAgESATfYZCAFKthCENCyASIBF9IRIgDyARfCEPIAlBBGsiCQ0AC0QAAAAAAAAAQCEVRAAAAAAAAABARAAAAAAAAPA/IBQgDXl8QkB8IgynIgZBH3UiAyAGcyADayIIQQFxGyEWIAhBAk8EQANAIBYgFSAVoiIVoiAWIAhBAnEbIRYgCEEDSyAIQQF2IQgNAAsLRAAAAAAAAPA/IBajIBYgBkEASBshFQJAAkACQAJAIAxCgAhYBEAgFSANuqIiFb1C////////////AINC//////////f/AFgNAQsgAiABNgJcIAJBgICAgHg2AlggAkHIAGoiBiACQdgAakF/IBRC/gd9IgxCBYinIAxCgICAgIAEWhsgDKciA0EecRDsASACQThqIAYQciACKAJAIQggAigCPCEKAkACQCACKAI4IgZBgICAgHhHBEAgCA0BIAJBADYCECACIAo2AgwgAiAGNgIIDAILIAooAggNACACQQhqIAoQwAMMAQsgDEKAgICAgAhaDQQgAiAINgJgIAIgCjYCXCACIAY2AlggAkEIaiACQdgAaiAMQgaIpyADQQF2QR9xEM8BCyACKAJIIgNFDQEgAigCTCADQQJ0EN8EDAELIAJB2ABqIQojAEEgayIEJAACQCAVnyIVvUL///////////8Ag0KAgICAgICA+P8AWgRAIApBgICAgHg2AgAMAQsCfwJAIBWdIhVEAAAAAAAAAABiBEAgFb0iDEIAUwRAIApBgICAgHg2AgAMBAsgDEI0iKdB/w9xIgZBswhrIQggBEEYakG0vMQAKAIANgIAIARBrLzEACkCADcDECAMQv////////8Hg0KAgICAgICACIQgDEIBhkL+////////D4MgBhsiDFAEQEEEIQNBAAwDCwNAIAQoAhAgC0YEQCAEQRBqQaC9xAAQpQMLIAQoAhQgB2ogDD4CACAEIAtBAWoiCzYCGCAHQQRqIQcgDEKAgICAEFQgDEIgiCEMRQ0ACwwBCyAKQQhqQbS8xAAoAgA2AgAgCkGsvMQAKQIANwIADAILIAQoAhQhAyAEKAIQCyEHAkACQAJAIAhBAEogCEEASGtB/wFxDgICAQALIAQgCzYCGCAEIAM2AhQgBCAHNgIQAkACQCAHQYCAgIB4RwRAIAsNASAEQQhqIARBGGooAgA2AgAgBCAEKQIQNwMADAILIAMoAggNACAEIAMQwAMMAQsgBCAEQRBqQbMIIAZrIgNBBXYgA0EfcRDsAQsgBCgCACEHIAQoAgQhAyAEKAIIIQsMAQsCQAJAIAdBgICAgHhHBEAgCw0BIARBADYCCCAEIAM2AgQgBCAHNgIADAILIAMoAggNACAEIAMQwAMMAQsgBCALNgIYIAQgAzYCFCAEIAc2AhAgBCAEQRBqIAhBBXYgCEEfcRDPAQsgBCgCCCELIAQoAgQhAyAEKAIAIQcLIAogCzYCCCAK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IhQgHCAiVq0gAikDmAMgGyAcVq18fHwiESACKQPgAnwiGyAWIB9UrSACKQPYAiAfICFUrXx8fCIfIAIpA5ACfCIcIBUgF1atIAIpA6gCIBUgFlStfHx8IiF8IhYgAikDoAF8IhUgAikDuAEgAikDsAEiECAafCAQVK18fCIXIAIpA0B8IhpC/////76y/fBCfiIQQgBCgYCAgL+y/fDDAEIAEMkDIAJBIGogEEIAQpHh5c2HifqZKEIAEMkDIAJBEGogEEIAQt2whYzotpGouH9CABDJAyACIBBCAEKpwMaJrs6TsjBCABDJAwJAAkAgAikDCCACKQOIASACKQOIAiARIBRUrSACKQOIAyATIBRWrXx8IAIpA/gDIBMgIFStfHwiICACKQPwAnwiECAbIB9WrSACKQPoAiARIBtWrXx8fCITIAIpA4ACfCIUIBNUrXwgFCAUIBwgIVatIAIpA5gCIBwgH1StfHx8IhRWrXwgECATVq0gAikD+AIgECAgVK18fHwiESACKQPwAXwiECACKQPoASAUIAIpA+ABfCITIBRUrXwgEyASIBZWrSACKQPYASASICNUrXx8fCISIBNUrXx8IhMgAikDgAF8IhQgE1StfCAUIAIpA5gBIBIgEiACKQOQAXwiElatfCASIBUgF1atIAIpA6gBIBUgFlStfHx8IhYgElStfHwiEiAUVK18IBAgE1atIAIpA/gBIBAgEVStfHx8IhUgAikDcHwiFCACKQNoIBIgAikDYHwiECASVK18IBAgECACKQNYIAIpA0ggFyAaVq18IhMgAikDUHwiEiATVK18IBIgEiAWfCISVq18fCIQVq18fCIRIAIpAwB8IhMgEVStfCATIBMgAikDGCAQIBAgAikDEHwiEFatfCAQIBAgAikDKCASIBIgAikDIHwiElatfCASIAIpAzggAikDMCIWIBp8IBZUrXx8IhYgElStfHwiEFatfHwiE1atfCARIBRUrSACKQN4IBQgFVStfHx8IhFCqcDGia7Ok7IwVg0AAkAgEUKpwMaJrs6TsjBRBEAgE0LdsIWM6LaRqLh/Vg0CIBNC3bCFjOi2kai4f1ENAUKpwMaJrs6TsjAhEQsgEyEUIBAhEgwCCyAQQpHh5c2HifqZKFYNAELdsIWM6LaRqLh/IRQgEEKR4eXNh4n6mShSBEBCqcDGia7Ok7IwIREgECESDAILQpHh5c2HifqZKCESIBZCgYCAgL+y/fDDAFoNAEKpwMaJrs6TsjAhEQwBCyAQQpHh5c2HifqZKH0iFCAWQoGAgIC/sv3wwwBUrSIVfSESIBNCo8/685fJ7tfHAHwiFyAQQpHh5c2HifqZKFQgFCAVVHKtIhB9IRQgESATQt2whYzotpGouH9UIBAgF1ZyrX1CqcDGia7Ok7IwfSERIBZCgYCAgL+y/fDDAH0hFgtCqcDGia7Ok7IwIRUgFCAZfCIQIBlUIBAgEiAefCITIB5UIBMgFiAYfCISIBhUrXwiGCATVHKtfCITIBBUcq0gESAdfHwiHSEQAkAgHUKpwMaJrs6TsjBSDQBC3bCFjOi2kai4fyEVIBMiEELdsIWM6LaRqLh/Ug0AQpHh5c2HifqZKCEVIBgiEEKR4eXNh4n6mShSDQBCgYCAgL+y/fDDACEVIBIiEEKBgICAv7L98MMAUQ0CCyAQIBVaDQEgEyEZIBghHiASDAILIAQgBUH0+cAAENkDAAsgGEKR4eXNh4n6mSh9IhAgEkKBgICAv7L98MMAVK0iGX0hHiATQqPP+vOXye7XxwB8IhQgGEKR4eXNh4n6mShUIBAgGVRyrSIQfSEZIB0gE0LdsIWM6LaRqLh/VCAQIBRWcq19QqnAxomuzpOyMH0hHSASQoGAgIC/sv3wwwB9CyEYIABBIGohACABQQxqIQEgCyAHQQFqIgdHDQALIAkgA0EFdGoiACAYNwMYIAAgHjcDECAAIBk3AwggACAdNwMAIANBAWohAyAOIgQgCEcNAQwDCwsgBiAGQeT5wAAQ2QMACyAIIARrIgBBBXQiAQRAIAkgA0EFdGpBACAB/AsACyAAIANqIQMLIAM2AgAgAkGABGokAAvCEgIjfwR+IwBBkAxrIgMkACADIAE2AtAKIAMgAUHAAWoiFDYC1AogA0EIaiIHIANB0ApqIggQvQMgA0GIDGoiHCADQUBrIgkpAwAiJjcDACADQYAMaiIdIANBOGoiCikDACInNwMAIANB+AtqIh4gA0EwaiILKQMAIig3AwAgA0HwC2oiHyADQShqIgwpAwAiKTcDACADQZgLaiIEIANBEGoiDSkDADcDACADQaALaiIFIANBGGoiDikDADcDACADQagLaiIGIANBIGoiDykDADcDACADQbALaiIQICk3AwAgA0G4C2oiESAoNwMAIANBwAtqIhIgJzcDACADQcgLaiITICY3AwAgAyADKQMIIiY3A9ALIAMgJjcDkAsgA0HAA2oiFSATKQMANwMAIANBuANqIhYgEikDADcDACADQbADaiIXIBEpAwA3AwAgA0GoA2oiGCAQKQMANwMAIANBoANqIhkgBikDADcDACADQZgDaiIaIAUpAwA3AwAgA0GQA2oiGyAEKQMANwMAIAMgAykDkAs3A4gDIANBwAlqIBUpAwA3AwAgA0G4CWogFikDADcDACADQbAJaiAXKQMANwMAIANBqAlqIBgpAwA3AwAgA0GgCWogGSkDADcDACADQZgJaiAaKQMANwMAIANBkAlqIBspAwA3AwAgAyADKQOIAzcDiAkgByAIEL0DIBwgCSkDACImNwMAIB0gCikDACInNwMAIB4gCykDACIoNwMAIB8gDCkDACIpNwMAIAQgDSkDADcDACAFIA4pAwA3AwAgBiAPKQMANwMAIBAgKTcDACARICg3AwAgEiAnNwMAIBMgJjcDACADIAMpAwgiJjcD0AsgAyAmNwOQCyAVIBMpAwA3AwAgFiASKQMANwMAIBcgESkDADcDACAYIBApAwA3AwAgGSAGKQMANwMAIBogBSkDADcDACAbIAQpAwA3AwAgAyADKQOQCzcDiAMgA0GACmogFSkDADcDACADQfgJaiAWKQMANwMAIANB8AlqIBcpAwA3AwAgA0HoCWogGCkDADcDACADQeAJaiAZKQMANwMAIANB2AlqIBopAwA3AwAgA0HQCWogGykDADcDACADIAMpA4gDNwPICSAHIAgQvQMgHCAJKQMAIiY3AwAgHSAKKQMAIic3AwAgHiALKQMAIig3AwAgHyAMKQMAIik3AwAgBCANKQMANwMAIAUgDikDADcDACAGIA8pAwA3AwAgECApNwMAIBEgKDcDACASICc3AwAgEyAmNwMAIAMgAykDCCImNwPQCyADICY3A5ALIBUgEykDADcDACAWIBIpAwA3AwAgFyARKQMANwMAIBggECkDADcDACAZIAYpAwA3AwAgGiAFKQMANwMAIBsgBCkDADcDACADIAMpA5ALNwOIAyADQcAKaiAVKQMANwMAIANBuApqIBYpAwA3AwAgA0GwCmogFykDADcDACADQagKaiAYKQMANwMAIANBoApqIBkpAwA3AwAgA0GYCmogGikDADcDACADQZAKaiAbKQMANwMAIAMgAykDiAM3A4gKQQBFBEAgA0GIBmogA0GICWpBwAH8CgAACyADIAFBgANqNgLMCiADIBQ2AsgKIANB0AtqIiEgA0HICmoiIhC9AyATIBwpAwAiJjcDACASIB0pAwAiJzcDACARIB4pAwAiKDcDACAQIB8pAwAiKTcDACADQdgKaiIBIANB2AtqIiMpAwA3AwAgA0HgCmoiBCADQeALaiIkKQMANwMAIANB6ApqIgUgA0HoC2oiJSkDADcDACADQfAKaiIGICk3AwAgA0H4CmoiFCAoNwMAIANBgAtqIgcgJzcDACADQYgLaiIIICY3AwAgAyADKQPQCyImNwOQCyADICY3A9AKIAkgCCkDADcDACAKIAcpAwA3AwAgCyAUKQMANwMAIAwgBikDADcDACAPIAUpAwA3AwAgDiAEKQMANwMAIA0gASkDADcDACADIAMpA9AKNwMIIBUgCSkDADcDACAWIAopAwA3AwAgFyALKQMANwMAIBggDCkDADcDACAZIA8pAwA3AwAgGiAOKQMANwMAIBsgDSkDADcDACADIAMpAwg3A4gDICEgIhC9AyATIBwpAwAiJjcDACASIB0pAwAiJzcDACARIB4pAwAiKDcDACAQIB8pAwAiKTcDACABICMpAwA3AwAgBCAkKQMANwMAIAUgJSkDADcDACAGICk3AwAgFCAoNwMAIAcgJzcDACAIICY3AwAgAyADKQPQCyImNwOQCyADICY3A9AKIAkgCCkDADcDACAKIAcpAwA3AwAgCyAUKQMANwMAIAwgBikDADcDACAPIAUpAwA3AwAgDiAEKQMANwMAIA0gASkDADcDACADIAMpA9AKNwMIIANBgARqIAkpAwA3AwAgA0H4A2ogCikDADcDACADQfADaiALKQMANwMAIANB6ANqIAwpAwA3AwAgA0HgA2ogDykDADcDACADQdgDaiAOKQMANwMAIANB0ANqIA0pAwA3AwAgAyADKQMINwPIAyAhICIQvQMgEyAcKQMAIiY3AwAgEiAdKQMAIic3AwAgESAeKQMAIig3AwAgECAfKQMAIik3AwAgASAjKQMANwMAIAQgJCkDADcDACAFICUpAwA3AwAgBiApNwMAIBQgKDcDACAHICc3AwAgCCAmNwMAIAMgAykD0AsiJjcDkAsgAyAmNwPQCiAJIAgpAwA3AwAgCiAHKQMANwMAIAsgFCkDADcDACAMIAYpAwA3AwAgDyAFKQMANwMAIA4gBCkDADcDACANIAEpAwA3AwAgAyADKQPQCjcDCCADQcAEaiAJKQMANwMAIANBuARqIAopAwA3AwAgA0GwBGogCykDADcDACADQagEaiAMKQMANwMAIANBoARqIA8pAwA3AwAgA0GYBGogDikDADcDACADQZAEaiANKQMANwMAIAMgAykDCDcDiAQgIEUEQCADQYgJaiADQYgDakHAAfwKAAALICBFBEAgA0HIB2ogA0GICWpBwAH8CgAACyADQQhqIANBiAZqQYAD/AoAACACBEADQCADQYgDaiIBIANBCGoiBBCqASAEIAFBgAP8CgAAIAJBAWsiAg0ACwsgACADQQhqQYAD/AoAACADQZAMaiQAC/sVAgJ/GH4jAEHQA2siASQAIAFBoANqQcChxQBBARCnAkEoIQIgASkDoAMhFyABKQOoAyEYIAEpA7ADIRAgASkDuAMhESABKQPAAyESIAEpA8gDIQ8DQCABQcACaiACQeCgxQBqKQMAIgNCACAPQgAQyQMgAUHQAmogA0IAIBJCABDJAyABQeACaiADQgAgEUIAEMkDIAFB8AJqIANCACAQQgAQyQMgAUGAA2ogA0IAIBhCABDJAyABQZADaiADQgAgF0IAEMkDIAFBsAJqIAEpA8ACIgkgDnwiE0IAQgBC/f/z/8////mJfxDJAyABQaACaiABKQO4AiIDQgBCq9X+////v/+5f0IAEMkDIAFBkAJqIANCAEL//8+K6///1R5CABDJAyABQYACaiADQgBCpOzDtY/UtJjnAEIAEMkDIAFB8AFqIANCAEK/pZScz/DSu+QAQgAQyQMgAUHgAWogA0IAQtfZrprk9umNywBCABDJAyABQdABaiADQgBCms3/y6O9xIAaQgAQyQMgASkD2AEgASkDkAMiDCALfCIUIAEpA4gDIAEpA4ADIgMgB3wiByADVK18IAcgASkD+AIgASkD8AIiAyAGfCIGIANUrXwgBiABKQPoAiABKQPgAiIDIAV8IgUgA1StfCAFIAEpA9gCIAQgASkD0AIiBHwiAyAEVK18IAMgASkDyAIgCSATVq18fCIEIANUrXx8IhUgBVSt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/f/z/8////mJf34iB0IAQqvV/v///7//uX9CABDJAyADQUBrIAdCAEL//8+K6///1R5CABDJAyADQTBqIAdCAEKk7MO1j9S0mOcAQgAQyQMgA0EgaiAHQgBCv6WUnM/w0rvkAEIAEMkDIANBEGogB0IAQtfZrprk9umNywBCABDJAyADIAdCAEKazf/Lo73EgBpCABDJAyADKQMIIAMpA7ABIhggC3wiByADKQOoASADKQOgASILIAh8IgggC1StfCAIIAMpA5gBIAMpA5ABIgsgBnwiBiALVK18IAYgAykDiAEgAykDgAEiCyAFfCIFIAtUrXwgBSADKQN4IAMpA3AiCyAEfCIEIAtUrXwgBCADKQNoIA0gFFStfHwiFCAEVK18fCIEIAVUrXx8IgUgBlStfHwiBiAIVK18fCILIAMpAwB8IgggC1StfCAIIAggAykDGCAGIAYgAykDEHwiBlatfCAGIAYgAykDKCAFIAUgAykDIHwiBVatfCAFIAUgAykDOCAEIAQgAykDMHwiBFatfCAEIAQgAykDSCADKQNAIhkgFHwiFCAZVK18IBQgAykDWCANIAMpA1AiDXwgDVStfHwiDSAUVK18fCIEVq18fCIFVq18fCIGVq18fCIIVq18IAcgC1atIAMpA7gBIAcgGFStfHx8IQsgAUEIayIBQShHDQALAkACQCALQprN/8ujvcSAGlYNACALQprN/8ujvcSAGlIEQCAEIQcgBSEOIAYhDyAIIREMAgsgCELX2a6a5PbpjcsAVg0AAkAgCELX2a6a5PbpjcsAUgRAIAQhByAFIQ4gBiEPIAghEQwBCyAGQr+llJzP8NK75ABWDQFC19mumuT26Y3LACERIAZCv6WUnM/w0rvkAFIEQCAEIQcgBSEOIAYhDwwBCyAFQqTsw7WP1LSY5wBWDQFCv6WUnM/w0rvkACEPIAVCpOzDtY/UtJjnAFIEQCAEIQcgBSEODAELIARC///Piuv//9UeVg0BQqTsw7WP1LSY5wAhDiAEQv//z4rr///VHlIEQCAEIQcMAQtC///Piuv//9UeIQcgDUKq1f7///+//7l/Vg0BC0Kazf/Lo73EgBohCwwBCyAEQv//z4rr///VHn0iDiANQqvV/v///7//uX9UrSIPfSEHIAVCpOzDtY/UtJjnAH0iESAEQv//z4rr///VHlQg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////////////AEIAEMkDIANBgAJqIAIpAxAiBEIAIAVCABDJAyADQbACaiAEQgAgCEIAEMkDIANB4AJqIARCACAHQgAQyQMgA0GQA2ogBEIAIAZCABDJAyADQZABaiADKQOgASIJIAMpA8gBIg0gAykD0AF8Igx8IgsgAykDuAEgCiADKQOwASIEfCAEVK18fCIKIAMpA4ACfCIPQpuUr8Pytajehn9+IgRCAEJtQgAQyQMgA0GAAWogBEIAQn9CABDJAyADQUBrIARCAEL///////////8AQgAQyQMgA0GQAmogAikDCCIEQgAgBUIAEMkDIANBwAJqIARCACAIQgAQyQMgA0HwAmogBEIAIAdCABDJAyADQaADaiAEQgAgBkIAEMkDIANB8ABqIAMpA4gCIAogD1atfCIQIAMpA7ACfCIOIAkgAykD2AEgDCANVK18IhEgAykD4AF8Ig18IgwgCiALVK0gAykDqAEiEiAJIAtWrXx8fCITfCIJIAMpA4ABIhR8IgsgAykDmAEgAykDkAEiBCAPfCAEVK18fCIKIAMpA5ACfCIPQpuUr8Pytajehn9+IgRCAEJtQgAQyQMgA0HgAGogBEIAQn9CABDJAyADQdAAaiAEQgBC////////////AEIAEMkDIANBoAJqIAIpAwAiBEIAIAVCABDJAyADQdACaiAEQgAgCEIAEMkDIANBgANqIARCACAHQgAQyQMgA0GwA2ogBEIAIAZCABDJAyADQSBqIAMpA5gCIAogD1atfCIVIAMpA8ACfCIFIBQgAykD6AEgDSARVK18IhEgAykD8AF8IgQgAykDMHwiCCAMIBNWrSASIAwgDVStfHx8IgcgAykD4AJ8IgYgCSAOVK0gAykDuAIgDiAQVK18fHwiDnwiDSAKIAtUrSADKQOIASIQIAkgC1atfHx8IhJ8IgkgAykDYCITfCILIAMpA3ggAykDcCIKIA98IApUrXx8IgogAykDoAJ8Ig9Cm5Svw/K1qN6Gf34iDEIAQm1CABDJAyADQRBqIAxCAEJ/QgAQyQMgAyAMQgBC////////////AEIAEMkDAkACQCADKQMIIAMpA1ggAykDSCAHIAhUrSADKQM4IAQgCFatfHwiDCADKQP4ASAEIBFUrXx8IgQgAykDkAN8IgggBiAOVq0gAykD6AIgBiAHVK18fHwiByADKQNAfCIGIAdUrXwgBiAGIA0gElatIBAgDSAOVK18fHwiBlatfCIOIAcgCFStIAMpA5gDIAQgCFatfHwiDSAEIAxUrXwiDHwiBCADKQOgA3wiCCADKQP4AiAGIAMpA/ACfCIHIAZUrXwgByAFIAlWrSADKQPIAiAFIBVUrXx8fCIFIAdUrXx8IgcgAykDUHwiBiAHVK18IAYgAykDaCIQIAUgBSATfCIFVq18IAUgCiALVK0gECAJIAtWrXx8fCIJIAVUrXx8IgUgBlStfCIQIAcgCFStIAMpA6gDIAQgCFatfHwiESAEIA5UrSAMIA1UrXx8Ig58IgQgAykDsAN8IgcgAykDiAMgBSAFIAMpA4ADfCIFVq18IAUgBSADKQPYAiADKQOoAiAKIA9WrXwiBiADKQPQAnwiCCAGVK18IAggCCAJfCIIVq18fCIFVq18fCIGIAMpAwB8IgsgBlStfCALIAMpAxgiCSAFIAUgAykDECIKfCIFVq18IAUgBSAJIAggCCAKfCIIVq18IAggAykDKCADKQMgIgkgD3wgCVStfHwiCSAIVK18fCIFVq18fCIIIAtUrXwiCyAGIAdUrSADKQO4AyAEIAdWrXx8IgcgBCAQVK0gDiARVK18fCIEfCIGIAtUIAQgB1RyIAZCAFNyDQACQCAGQv///////////wBRBEBCfyEHIAhCf1IEQCAFIQQgCCEHQv///////////wAhBgwECyAFQn9RDQEgBSEEQv///////////wAhBgwDCyAFIQQgCCEHDAILQn8hBCAJQm1aDQBC////////////ACEGDAELIAVCAXwiByAJQm1UrSILfSEEIAhCAXwiCiAFQn9SIAcgC1RyrSIFfSEHIAYgCEJ/UiAFIApWcq19Qv///////////wB9IQYgCUITfCEJCyAAIAk3AxggACAENwMQIAAgBzcDCCAAIAY3AwAgA0HAA2okAAuFEAIBfxB+IwBBgARrIgMkACADQYACaiABKQMYIgVCACACKQMYIgRCABDJAyADQZACaiABKQMQIgZCACAEQgAQyQMgA0GgAmogASkDCCIHQgAgBEIAEMkDIANBsAJqIAEpAwAiCEIAIARCABDJAyADQfABaiADKQOAAiIKQv////++sv3wQn4iBEIAQoGAgIC/sv3wwwBCABDJAyADQeABaiAE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AgA2AgBBASEFIANBAToAJCADIAMpAiw3AxgMAQsgA0EgaiADQTRqKAIANgIAQQIhBSADQQI6ACQgAyADKQIsNwMYCyADQThqIANBGGogAhChASADKQJEIgxCIIinIQcgAygCPCEGIAMoAjghAiAMpyEEAkAgBUEBRwRAIAVBASADKAJAIgEbIQUMAQsgAkEETwRAIAYgAkECdBDfBEEEIQZBACECC0EBIQVBACEBIARBBEkNACAHIARBAnQQ3wRBACEEQQQhBwsgBARAIAcgBEECdBDfBAsgAygCGCIEBEAgAygCHCAEQQJ0EN8ECyAAIAE2AgggACAGNgIEIAAgAjYCACAAQQIgBWsgBSAJGzoADAsgAygCCCIABEAgAygCDCAAQQJ0EN8ECyADQdAAaiQADwtBtM3CAEEcQbTOwgAQ6AMACyAFIARB+IHAABDIBAAL3QsCDX8BfiMAQaAEayICJABB0c7FAC0AABoCQAJAAkACQEHAAUEIENYEIgMEQCADIAFBwAH8CgAAIAMpAwAhDyACQcABaiIBIANBCGpBuAH8CgAAIANBwAEQ3wQgAkEQaiACQcgBaikDADcDACACQRhqIAJB0AFqKQMANwMAIAJBIGogAkHYAWopAwA3AwAgAkEoaiACQeABaikDADcDACACQTBqIAJB6AFqKQMANwMAIAJBOGogAkHwAWopAwA3AwAgAkHIAGogAkGAAmopAwA3AwAgAkHQAGogAkGIAmopAwA3AwAgAkHYAGogAkGQAmopAwA3AwAgAkHgAGogAkGYAmopAwA3AwAgAkHoAGogAkGgAmopAwA3AwAgAkHwAGogAkGoAmopAwA3AwAgAkH4AGogAkGwAmopAwA3AwAgAiAPNwMAIAIgAikDwAE3AwggAiACKQP4ATcDQCACQbgBaiACQfACaikDADcDACACQbABaiACQegCaikDADcDACACQagBaiACQeACaikDADcDACACQaABaiACQdgCaikDADcDACACQZgBaiACQdACaikDADcDACACQZABaiACQcgCaikDADcDACACQYgBaiACQcACaikDADcDACACIAIpA7gCNwOAASABIAIQrwMgAigCxAEhASACKALAASEDIAIoAsgBIgRBAkcNASACQYADaiABQRBqKQMANwMAIAJBiANqIAFBGGopAwA3AwAgAkGQA2ogAUEgaikDADcDACACQZgDaiABQShqKQMANwMAIAJBoANqIAFBMGopAwA3AwAgAkGoA2ogAUE4aikDADcDACACIAEpAwg3A/gCIAEoAgQhBCABKAIAIQcgAwRAIAEgA0EFdBDfBAsgAkHAAWogAkFAaxCvAyACKALEASEBIAIoAsABIQMgAigCyAEiBUECRw0CIAJBuANqIAFBEGopAwA3AwAgAkHAA2ogAUEYaikDADcDACACQcgDaiABQSBqKQMANwMAIAJB0ANqIAFBKGopAwA3AwAgAkHYA2ogAUEwaikDADcDACACQeADaiABQThqKQMANwMAIAIgASkDCDcDsAMgASgCBCEFIAEoAgAhCCADBEAgASADQQV0EN8ECyACQcABaiACQYABahCvAyACKALEASEBIAIoAsABIQMgAigCyAEiBkECRw0DIAJB8ANqIgYgAUEQaikDADcDACACQfgDaiIJIAFBGGopAwA3AwAgAkGABGogAUEgaikDADcDACACQYgEaiIKIAFBKGopAwA3AwAgAkGQBGoiCyABQTBqKQMANwMAIAJBmARqIgwgAUE4aikDADcDACACIAEpAwg3A+gDIAEoAgQhDSABKAIAIQ4gAwRAIAEgA0EFdBDfBAsgACACKQPoAzcDiAEgACACKQOABDcDoAEgACANNgKEASAAIA42AoABIAAgBDYCBCAAIAc2AgAgAEGYAWogCSkDADcDACAAQZABaiAGKQMANwMAIABBqAFqIAopAwA3AwAgAEGwAWogCykDADcDACAAQbgBaiAMKQMANwMAIAAgBTYCRCAAIAg2AkAgAEEYaiACQYgDaikDADcDACAAQRBqIAJBgANqKQMANwMAIAAgAikD+AI3AwggAEE4aiACQagDaikDADcDACAAQTBqIAJBoANqKQMANwMAIABBKGogAkGYA2opAwA3AwAgACACKQOQAzcDICAAIAIpA7ADNwNIIABB0ABqIAJBuANqKQMANwMAIABB2ABqIAJBwANqKQMANwMAIABB+ABqIAJB4ANqKQMANwMAIABB8ABqIAJB2ANqKQMANwMAIABB6ABqIAJB0ANqKQMANwMAIAAgAikDyAM3A2AgAkGgBGokAA8LQQhBwAFB8LXCABDIBAALIAIgBDYCyAEMAgsgAiAFNgLIAQwBCyACIAY2AsgBCyAC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QgBSrSITIAwgDVatIgwgDyARVq0iDSALfCIPfCIRfCILfUIAQpGAgICAgICACEIAEMkDIANBKGoiAgJ+IAEpAwggASkDGCABKQMoIA0gD1atQpCAgICAgICACEIAIAUbhCIPIAEpAyB8Ig0gD1StfCANIAwgEVatfCIMIA1UrXwiDyABKQMQfCINIA9UrXwgDSAMIAsgE1StIgx8Ig8gDFStfCIMIA1UrXwiESABKQMAfCINIBFUrXwgDSANIAwgC0IAUq0iCyAPfCIPIAtUrSIMfCILIAxUrXwiDVatfCIMQpGAgICAgICACFIEQCAMIRAgDSEOIAshDCAPDAELQgAhDEIAIAsgD4QgDYRQDQAaQn9CACANIAsgD1CtIg5UrSIRVBshECALIA59IQwgDSARfSEOIA9CAX0LNwMYIAIgDDcDECACIA43AwggAiAQNwMAIAFBMGokACADQQA2AnggA0KAgICAEDcCcCADQdzTwgA2ApQBIANCoICAgA43ApgBIAMgA0HwAGo2ApABIAIgA0GQAWoiARDTAg0EIAMoAnAhAiABIAMoAnQiByADKAJ4EJUDIAMoApgBIgVFBEAgAygCkAFFBEAgAUHI0MIAEKUDCyADKAKUAUEANgIAIANBATYCmAFBASEFCyADKAKUASIBIAEoAgBBAWoiBDYCAAJAIAQNACAFQQFHBEAgBUECdEEEayEFIAFBBGohBANAIAQgBCgCAEEBaiIBNgIAIAENAiAEQQRqIQQgBUEEayIFDQALCyADKAKYASIBIAMoApABRgRAIANBkAFqQdjQwgAQpQMLIAMoApQBIAFBAnRqQQE2AgAgAyABQQFqNgKYAQsgA0EgaiADQZgBaigCADYCACADIAMpApABNwMYIAIEQCAHIAIQ3wQLIANBKGogA0EMaiADQRhqEO8BAkACQCADKAIwRQRAQdHOxQAtAAAaQQEhBEEBQQEQ1gQiAUUNCCABQQA6AAAgACABQQEQhgEMAQsgA0GQAWogA0EoakEIELACIAMoApQBIQECQCADKAKYASICQQJJDQAgASACaiEHQQAhBCACQQF2IgZBAUcEQCACQQFrIQUgBkH+////B3EhCQNAIAEgBWoiBi0AACEIIAYgASAEaiIGLQAAOgAAIAYgCDoAACAHIARBfnNqIggtAAAhCiAIIAZBAWoiBi0AADoAACAGIAo6AAAgBUECayEFIAkgBEECaiIERw0ACwsgAkECcUUNACABIARqIgUtAAAhBiAFIAcgBEF/c2oiBS0AADoAACAFIAY6AAALIAMoApABIQQgACABIAIQhgEgBEUNAQsgASAEEN8ECyADKAIoIgBFDQEgAygCLCAAQQJ0EN8EDAELIAAgAykDMDcDACAAQRhqIANByABqKQMANwMAIABBEGogA0FAaykDADcDACAAQQhqIANBOGopAwA3AwAgAygCkAEiAEUNACAFIAAQ3wQLIANBsAFqJAAPC0EBIARBlNrCABDIBAALIAUgAkHU2MIAEMgEAAtBhNTCAEE3IANB0ABqQfTTwgBBiNXCABDKAwALQQFBARD/BAAL0BgCCH8MfiMAQbABayIDJAAgA0HgAGpCADcDACADQdgAakIANwMAIANCADcDUCADQgE3A2ggA0EwaiEHQYACIQUDQCAHQn83AwAgB0EIakJ/NwMAIANC////////////ADcDKCADQmw3A0AgA0GQAWogA0EoaiAFQQFrIgYQsgIgA0H4AGpCADcDACADQYABakIANwMAIANCADcDcCADIAMpA6gBQgGDNwOIASADQfAAaiADQdAAakEgEPEDBEAgBiEFDAELC0EAIQYCQAJAAkACQAJAAkAgAiAFQQN2IAVBB3FBAEdqIgVNBEACQCAFIAJrIgVFBEBBASEGDAELQdHOxQAtAAAaIAVBARDXBCIGRQ0ECyADIAU2ApgBIAMgBjYClAEgAyAFNgKQASACBEAgA0GQAWogBSACQQFBARCIAyADKAKYASEFIAMoApQBIQYLIAIEQCAFIAZqIAEgAvwKAAALIAYhASMAQYACayIEJAAgA0EoaiIHAn8gAiAFakEfTQRAIAdBADoAAUEBDAELIARB4AFqIAEpABgiC0I4hiALQoD+A4NCKIaEIAtCgID8B4NCGIYgC0KAgID4D4NCCIaEhCALQgiIQoCAgPgPgyALQhiIQoCA/AeDhCALQiiIQoD+A4MgC0I4iISEhEIAQqQLQgAQyQMgBEHwAWogASkAECILQjiGIAtCgP4Dg0IohoQgC0KAgPwHg0IYhiALQoCAgPgPg0IIhoSEIAtCCIhCgICA+A+DIAtCGIhCgID8B4OEIAtCKIhCgP4DgyALQjiIhISEQgBCpAtCABDJAyAEQfAAaiABKQAIIgtCOIYgC0KA/gODQiiGhCALQoCA/AeDQhiGIAtCgICA+A+DQgiGhIQgC0IIiEKAgID4D4MgC0IYiEKAgPwHg4QgC0IoiEKA/gODIAtCOIiEhIRCAEKkC0IAEMkDIARBMGogASkAACILQjiGIAtCgP4Dg0IohoQgC0KAgPwHg0IYhiALQoCAgPgPg0IIhoSEIAtCCIhCgICA+A+DIAtCGIhCgID8B4OEIAtCKIhCgP4DgyALQjiIhISEQgBCpAtCABDJAyAEQdABaiAEKQPgASINQpuUr8Pytajehn9+IgtCAEJtQgAQyQMgBEHAAWogC0IAQn9CABDJAyAEQYABaiALQgBC////////////AEIAEMkDIARBsAFqIAQpA8ABIhMgBCkD6AEiDiAEKQPwAXwiDHwiECAEKQPYASAEKQPQASILIA1CfIN8IAtUrXx8Ig9Cm5Svw/K1qN6Gf34iC0IAQm1CABDJAyAEQaABaiALQgBCf0IAEMkDIARBkAFqIAtCAEL///////////8AQgAQyQMgBEHgAGogBCkDoAEiFCATIAQpA/gBIAwgDlStfCINIAQpA3B8IhF8IhIgDyAQVK0gBCkDyAEiDiAQIBNUrXx8fCIMfCIQIAQpA7gBIAQpA7ABIgsgD3wgC1StfHwiD0KblK/D8rWo3oZ/fiILQgBCbUIAEMkDIARB0ABqIAtCAEJ/QgAQyQMgBEFAayALQgBC////////////AEIAEMkDIARBIGogBCkDUCIVIBQgBCkDeCANIBFWrXwiDSAEKQMwfCIWIAQpA4ABfCITIAwgElStIA4gESASVq18fHwiEXwiEiAPIBBUrSAEKQOoASIOIBAgFFStfHx8Igx8IhAgBCkDaCAPIAQpA2AiC3wgC1StfHwiD0KblK/D8rWo3oZ/fiILQgBCbUIAEMkDIARBEGogC0IAQn9CABDJAyAEIAtCAEL///////////8AQgAQyQMCQAJAIAQpAwggBCkDSCAEKQOYASAEKQOQASILIAQpAzggDSAWVq18fCINIAtUrXwgDSANIBEgE1StIAQpA4gBIBMgFlStfHx8IgtWrXwgCyALIAwgElStIA4gESASVq18fHwiDVatfCILIAQpA0B8Ig4gC1StfCAOIAQpA1giCyANIA0gFXwiDFatfCAMIAwgDyAQVK0gCyAQIBVUrXx8fCIMVq18fCISIA5UrXwiCyAEKQMAfCIQIAtUrXwgECAQIAQpAxgiCyASIBIgBCkDECINfCIOVq18IA4gDiALIA0gDCANfCIMVq18IAwgBCkDKCAPIAQpAyAiC3wgC1StfHwiDyAMVK18fCIMVq18fCINVq18IhFCAFMNAAJAAkAgEUL///////////8AVA0AQn8hDiANQn9SBEBC////////////ACERDAELIAxCf1ENAUL///////////8AIREgDCELDAMLIA0hDiAMIQsMAgsgD0JtWg0AQv///////////wAhEUJ/IQsMAQsgDEIBfCISIA9CbVStIg59IQsgDUIBfCIQIAxCf1IgDiASVnKtIgx9IQ4gESANQn9SIAwgEFZyrX1C////////////AH0hESAPQhN8IQ8LIAcgDzcDICAHIAs3AxggByAONwMQIAcgETcDCEEACzoAACAEQYACaiQAIAMtAChFDQEgAyADLQApOgBwQeTYwgBBKyADQfAAakGk2sIAQbTawgAQygMACyACQQBIDQNB0c7FAC0AABpBASEGIAJBARDWBCIIRQ0DIAIEQCAIIAEgAvwKAAALIANBDGogCAJ/QQEgAkEBRg0AGiACIAhqIQlBACEFIAJBAXYiAUEBRwRAIAJBAWshBiABQf7///8DcSEEA0AgBiAIaiIHLQAAIQEgByAFIAhqIgotAAA6AAAgCiABOgAAIAkgBUF+c2oiAS0AACEHIAEgCkEBaiIBLQAAOgAAIAEgBzoAACAGQQJrIQYgBCAFQQJqIgVHDQALCyACIAJBAnFFDQAaIAUgCGoiAS0AACEGIAEgCSAFQX9zaiIBLQAAOgAAIAEgBjoAACACC0EIEM8CIAggAhDfBAJAQZjTwQBB6NHBAEEgEPEDBEAgA0E4akJ/NwMAIANCfzcDMCADQv///////////wA3AyggA0JHNwNADAELIANBQGtBsNPBACkDADcDACADQThqQajTwQApAwA3AwAgA0EwakGg08EAKQMANwMAIANBmNPBACkDADcDKAsgA0GQAWoiASADQShqIgUQ2AEgA0EANgJ4IANCgICAgBA3AnAgA0Hc08IANgIsIANCoICAgA43AjAgAyADQfAAajYCKCABIAUQ0wINBCADKAJwIQcgBSADKAJ0IgIgAygC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ByAQNwMIQQALOgAAIARBwAJqJAAgAy0AKEUNASADIAMtACk6AHBB5NjCAEErIANB8ABqQaTawgBBtNrCABDKAwALIAJBAEgNA0HRzsUALQAAGkEBIQYgAkEBENYEIghFDQMgAgRAIAggASAC/AoAAAsgA0EMaiAIAn9BASACQQFGDQAaIAIgCGohCUEAIQUgAkEBdiIBQQFHBEAgAkEBayEGIAFB/v///wNxIQQDQCAGIAhqIgctAAAhASAHIAUgCGoiCi0AADoAACAKIAE6AAAgCSAFQX5zaiIBLQAAIQcgASAKQQFqIgEtAAA6AAAgASAHOgAAIAZBAmshBiAEIAVBAmoiBUcNAAsLIAIgAkECcUUNABogBSAIaiIBLQAAIQYgASAJIAVBf3NqIgEtAAA6AAAgASAGOgAAIAILQQgQzwIgCCACEN8EAkBBuNLBAEHo0cEAQSAQ8QMEQCADQn43A0AgA0L/////HzcDOCADQgA3AzAgA0KCgICAYDcDKAwBCyADQUBrQdDSwQApAwA3AwAgA0E4akHI0sEAKQMANwMAIANBMGpBwNLBACkDADcDACADQbjSwQApAwA3AygLIANBkAFqIgEgA0EoaiICEKMCIANBADYCeCADQoCAgIAQNwJwIANB3NPCADYCLCADQqCAgIAONwIwIAMgA0HwAGo2AiggASACENMCDQQgAygCcCEEIAIgAygCdCIHIAMoAngQlQMgAygCMCIGRQRAIAMoAihFBEAgAkHI0MIAEKUDCyADKAIsQQA2AgAgA0EBNgIwQQEhBgsgAygCLCICIAIoAgBBAWoiATYCAAJAIAENACAGQQFHBEAgBkECdEEEayEBIAJBBGohBQNAIAUgBSgCAEEBaiICNgIAIAINAiAFQQRqIQUgAUEEayIBDQALCyADKAIwIgEgAygCKEYEQCADQShqQdjQwgAQpQMLIAMoAiwgAUECdGpBATYCACADIAFBAWo2AjALIANBIGogA0EwaigCADYCACADIAMpAig3AxggBARAIAcgBBDfBAsgA0EoaiADQQxqIANBGGoQ7wECQAJAIAMoAjBFBEBB0c7FAC0AABpBASEFQQFBARDWBCIBRQ0IIAFBADoAACAAIAFBARCJAQwBCyADQZABaiADQShqQQgQsAIgAygClAEhAQJAIAMoApgBIghBAkkNACAB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IgVBA0YNACACQfgBaiIDIAJBuAJqKQMANwMAIAJB8AFqIgYgAkGwAmopAwA3AwAgAkHoAWoiBCACQagCaikDADcDACACQeABaiIJIAJBoAJqKQMANwMAIAJB2AFqIgogAkGYAmopAwA3AwAgAkHQAWoiByACQZACaikDADcDACACQcgBaiIIIAJBiAJqKQMANwMAIAIgAikDgAI3A8ABIAIgAigAwQI2AnggAiACQcQCaigAADYAeyAFQQJGDQAgAkHYAGogAykDADcDACACQdAAaiAGKQMANwMAIAJByABqIAQpAwA3AwAgAkFAayAJKQMANwMAIAJBOGogCikDADcDACACQTBqIAcpAwA3AwAgAkEoaiAIKQMANwMAIAIgAikDwAE3AyAgAiACKAJ4NgIYIAIgAigAezYAGwJAIAEoAgwoAgBBgICAgHhHDQAgASgCBEUNACABKAIIRQ0DC0HRzsUALQAAGkGgAkEIENYEIgNFDQMgAyACKQMgNwMAIAMgBToAQCADIAIoAhg2AEEgA0HEAGogAigAGzYAACADQThqIAJB2ABqKQMANwMAIANBMGogAkHQAGopAwA3AwAgA0EoaiACQcgAaikDADcDACADQSBqIAJBQGspAwA3AwAgA0EYaiACQThqKQMANwMAIANBEGogAkEwaikDADcDACADQQhqIAJBKGopAwA3AwAgAkEBNgIUIAIgAzYCECACQQQ2AgwgAkHoAGogAUEIaikCADcDACACIAEpAgA3A2AgAkGAAmogAkHgAGogAigCbBD8AQJAIAItAMACIgFBA0YNAEGJASEGIAJBwQJqIglBA2ohCkEBIQUDQCACQfgBaiIEIAJBuAJqKQMANwMAIAJB8AFqIgcgAkGwAmopAwA3AwAgAkHoAWoiCCACQagCaikDADcDACACQeABaiILIAJBoAJqKQMANwMAIAJB2AFqIgwgAkGYAmopAwA3AwAgAkHQAWoiDSACQZACaikDADcDACACQcgBaiIOIAJBiAJqKQMANwMAIAIgAikDgAI3A8ABIAIgCSgAADYCuAEgAiAKKAAANgC7ASABQf8BcUECRg0BIAJBsAFqIg8gBCkDADcDACACQagBaiIEIAcpAwA3AwAgAkGgAWoiByAIKQMANwMAIAJBmAFqIgggCykDADcDACACQZABaiILIAwpAwA3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AEEIaiADQSBqKAIANgIADAwLIABBCGpBgMTEACkCADcCACAAQfjDxAApAgA3AgAMCwtBACEFIARB/////wNLIARBAnQiBkH8////B0tyDQUgASgCBCEHAn8gBkUEQEEEIQFBAAwBC0HRzsUALQAAGkEEIQUgBkEEENYEIgFFDQYgBAshBSAGBEAgASAHIAb8CgAACyADIAQ2AiwgAyABNgIoIAMgBTYCJCADQRhqIANBJGogAhCHAkEBIQcgCEEBRg0BIAhBASADKAIgGyEHDAILQQAhBSAGQf////8DSyAGQQJ0IgRB/P///wdLcg0FIAIoAgQhBwJ/IARFBEBBBCECQQAMAQtB0c7FAC0AABpBBCEFIARBBBDWBCICRQ0GIAYLIQUgBARAIAIgByAE/AoAAAtBAiAIayEHIAMgBjYCLCADIAI2AiggAyAFNgIkIANBGGogA0EkaiABEIcCAkAgCEEBcUUEQCAHQQEgAygCIBshBwwBCyADQQA2AiAgAygCGEEESQ0AIANBCGogA0EYakEAENMDIAMoAggiAUGBgICAeEcNBwsgACADKQIYNwIAIAAgBzoADCAAQQhqIANBIGooAgA2AgAMCQsgA0EANgIgIAMoAhhBBEkNACADQRBqIANBGGpBABDTAyADKAIQIgFBgYCAgHhHDQYLIAAgAykCGDcCACAAIAc6AAwgAEEIaiADQSBqKAIANgIADAcLQQQgAkGkg8UAEMgEAAtBBCAEQaSDxQAQyAQACyAFIAZBpIPFABDIBAALIAUgBEGkg8UAEMgEAAsgASADKAIMQbTJxAAQyAQACyABIAMoAhRBtMnEABDIBAALIAIoAggiBUECdCEEQQAhAQJAIAVB/////wNLIARB/P///wdLcg0AIAIoAgQhBwJ/IARFBEBBBCECQQAMAQtB0c7FAC0AABpBBCEBIARBBBDWBCICRQ0BIAULIQEgBARAIAIgByAE/AoAAAsgAEECIAZrOgAMIAAgBTYCCCAAIAI2AgQgACABNgIADAELIAEgBEGkg8UAEMgEAAsgA0EwaiQAC+YKAgd/An4jAEHQAGsiAyQAAkAgAi0ADCIFQQFGBEAgACABKQIANwIAIABBCGogAUEIaikCADcCACACKAIAIgBFDQEgAigCBCAAQQJ0EN8EDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAS0ADCIGQQFrDgILAQALIAVFDQEMAgsgBUUNAQsCfyABKAIIIgQgAigCCCIFRgRAIARBAnQhBCABKAIEQQRrIQggAigCBEEEayEJAkADQCAERQ0BIAQgCWohByAEIAhqIARBBGshBCgCACIFIAcoAgAiB0YNAAsgBSAHSyAFIAdJawwCC0F/QQAgBBsMAQsgBCAFSyAEIAVJawtB/wFxDgIBAgMLIANBKGogAUEIaiIIKAIANgIAIAMgASkCACIKNwMgIANBOGogAkEIaiIJKAIANgIAIAMgAikCACILNwMwAn8gCqciBCALpyIFSQRAIANByABqIAkoAgA2AgAgAyACKQIANwNAIANBFGogA0FAayADQSBqEMoBIANBJGoMAQsgA0HIAGogCCgCADYCACADIAEpAgA3A0AgA0EUaiADQUBrIANBMGoQygEgBSEEIANBNGoLIQcgBARAIAcoAgAgBEECdBDfBAsCQCAGQQFHBEAgAygCHA0BIABBAToADCAAIAMpAhQ3AgAgAEEIaiADQRxqKAIANgIADAsLIANBADYCHCADKAIUIgFBBE8EQCADKAIYIAFBAnQQ3wQgA0KAgICAwAA3AhQLIABBAToADCAAIAMpAhQ3AgAgAEEIaiADQRxqKAIANgIADAoLIAAgBjoADCAAIAMpAhQ3AgAgAEEIaiADQRxqKAIANgIADAkLIABBCGpBqMzCACkCADcCACAAQaDMwgApAgA3AgAgAigCACIARQ0HIAIoAgQgAEECdBDfBAwHCyADQThqIAFBCGooAgA2AgAgAyABKQIANwMwIANByABqIAJBCGooAgA2AgAgAyACKQIANwNAIANBIGogA0EwaiADQUBrEIcCIAMoAkAiAQRAIAMoAkQgAUECdBDfBAtBASEEIAZBAUYNASAGQQEgAygCKBshBAwCCyADQThqIAJBCGooAgA2AgAgAyACKQIANwMwIANByABqIAFBCGooAgA2AgAgAyABKQIANwNAIANBIGogA0EwaiADQUBrEIcCIAMoAkAiAQRAIAMoAkQgAUECdBDfBAtBAiAGayEEAkAgBkEBcUUEQCAEQQEgAygCKBshBAwBCyADQQA2AiggAygCIEEESQ0AIAMgA0EgakEAENMDIAMoAgAiAUGBgICAeEcNAwsgACADKQIgNwIAIAAgBDoADCAAQQhqIANBKGooAgA2AgAMBgsgA0EANgIoIAMoAiBBBEkNACADQQhqIANBIGpBABDTAyADKAIIIgFBgYCAgHhHDQILIAAgAykCIDcCACAAIAQ6AAwgAEEIaiADQShqKAIANgIADAQLIAEgAygCBEHQz8IAEMgEAAsgASADKAIMQdDPwgAQyAQACyACQQ1qIQQCQAJAAkAgBUEBaw4CAAECCyAAQQE6AAwgACACKQIANwIAIAAgBC8AADsADSAAQQhqIAJBCGooAgA2AgAgAEEPaiAEQQJqLQAAOgAADAILIABBADoADCAAIAIpAgA3AgAgACAELwAAOwANIABBCGogAkEIaigCADYCACAAQQ9qIARBAmotAAA6AAAMAQsgAEECOgAMIAAgAikCADcCACAAIAQvAAA7AA0gAEEIaiACQQhqKAIANgIAIABBD2ogBEECai0AADoAAAsgASgCACIARQ0AIAEoAgQgAEECdBDfBAsgA0HQAGokAAuRCwIBfw9+IwBB8AJrIgMkACADQcgCaiABIAIQsQJBASECAkAgAy0AyAJBAUYEQCAAIAMtAMkCOgABDAELIANBQGsgAykD6AIiBUIAQoGIgPC3rn9CABDJAyADQYABaiADKQPgAiIIQgBCgYiA8Leuf0IAEMkDIANBwAFqIAMpA9gCIgRCAEKBiIDwt65/QgAQyQMgA0GAAmogAykD0AIiBkIAQoGIgPC3rn9CABDJAyADQRBqQgAgAykDQCIHfUIAQpGAgICAgICACEIAEMkDIANB0ABqIAVCAEL//7+YE0IAEMkDIANBkAFqIAhCAEL//7+YE0IAEMkDIANB0AFqIARCAEL//7+YE0IAEMkDIANBkAJqIAZCAEL//7+YE0IAEMkDIANBIGpCACAHQgBSrSIJIAMpA0giDCADKQOAAXwiC3wiByADKQNQfCIKfUIAQpGAgICAgICACEIAEMkDIANB4ABqIAVCAEKAgL57QgAQyQMgA0GgAWogCEIAQoCAvntCABDJAyADQeABaiAEQgBCgIC+e0IAEMkDIANBoAJqIAZCAEKAgL57QgAQyQMgA0EwakIAIApCAFKtIg0gByAJVK0iECADKQOIASALIAxUrXwiCyADKQPAAXwiDnwiCSADKQOQAXwiDCADKQNYIAcgClatfHwiEXwiByADKQNgfCIKfUIAQpGAgICAgICACEIAEMkDIANB8ABqIAVCAEKQkILwtZX1/wdCABDJAyADQbABaiAIQgBCkJCC8LWV9f8HQgAQyQMgA0HwAWogBEIAQpCQgvC1lfX/B0IAEMkDIANBsAJqIAZCAEKQkILwtZX1/wdCABDJAyADQgAgAykDaCAHIApWrXwiDyADKQOgAXwiBSADKQPIASALIA5WrXwiDiADKQOAAnwiCCADKQMQfCIEIAkgEFStfCIGIAMpA9ABfCILIAwgEVatIAMpA5gBIAkgDFatfHx8IgkgByANVK18Ig18IgcgCkIAUq18IgogAykDcHwiDH1CAEKRgICAgICAgAhCABDJAwJAAkAgAykDuAIgAykDOCAFIAdWrSADKQOoASAFIA9UrXx8IhAgAykD4AF8IgUgCSANVq0iESADKQMgfCINIAQgBlatIAMpAxggBCAIVK18fCIPIAMpA4gCIAggDlStfHwiCCADKQOQAnwiBCAJIAtUrSADKQPYASAGIAtWrXx8fCIJfCILfCIGIAcgClatfCIOIAZUrSISIAMpAzB8IgcgElStfCAHIAcgAykDoAIgCCAPVK2EIg8gBCAJVq0gAykDmAIgBCAIVK18fHwiCCALIA1UrSADKQMoIA0gEVStfHx8IgQgBSAGVq0gAykD6AEgBSAQVK18fHwiBXwiB1atfCIJIAQgBVatIAQgCFStIAMpA6gCIAggD1StfHx8fCIFIAMpA7ACfCIIIAVUrXwgCCADKQP4ASADKQO4ASADKQN4IAogDFatfCIGIAMpA7ABfCIEIAZUrXwgBCAEIA58IgRWrXwiCiADKQPwAXwiBiAKVK18IAYgBiAHfCIGVq18fCIHIAhUrXwgBSAJVK18IAMpAwggBiAEIAxCAFKtfCIFIARUrXwiCCAGVK0iBiADKQMAfCIEIAZUrXwgBCAEIAd8IgRWrXx8IglCkYCAgICAgIAIVg0AIAlCkYCAgICAgIAIUgRAIAQhBiAIIQcgBSEKDAILIAUgCIQgBIRQRQ0AQgAhBkKRgICAgICAgAghCUIAIQdCACEKDAELIAVCAX0hCiAIIAVQrSIFfSEHIAQgBSAIVq0iBX0hBiAJIAQgBVStfUKRgICAgICAgAh9IQkLIAAgCjcDICAAIAc3AxggACAGNwMQIAAgCTcDCEEAIQILIAAgAjoAACADQfACaiQAC7EMAgN/EH4jAEGwAmsiAyQAAkAgASgCDCIEQX9GBEAgAEIANwMAIABBKGpCADcDACAAQSBqQgA3AwAgAEEYakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAMAQsgASgCCCIFIARNBEAgBCAFQdzHwgAQ2QMACyABKAIEIgUgBEEwbGoiASkDKCEMIAEpAyAhDiABKQMYIQ8gASkDECERIAEpAwghEiABKQMAIRMgBARAA0BBKCEBQgAhCUIAIQtCACEKQgAhCEIAIQZCACENA0AgA0HwAGogASACaikDACIHQgAgDEIAEMkDIANBgAFqIAdCACAOQgAQyQMgA0GQAWogB0IAIA9CABDJAyADQaABaiAHQgAgEUIAEMkDIANBsAFqIAdCACASQgAQyQMgA0HAAWogB0IAIBNCABDJAyADQeAAaiADKQNwIhAgDXwiDUIAQgBC/f/z/8////mJfxDJAyADQdAAaiADKQNoIgdCAEKr1f7///+//7l/QgAQyQMgA0FAayAHQgBC///Piuv//9UeQgAQyQMgA0EwaiAHQgBCpOzDtY/UtJjnAEIAEMkDIANBIGogB0IAQr+llJzP8NK75ABCABDJAyADQRBqIAdCAELX2a6a5PbpjcsAQgAQyQMgAyAHQgBCms3/y6O9xIAaQgAQyQMgAykDCCADKQPAASIUIAl8IgcgAykDuAEgAykDsAEiCSALfCILIAlUrXwgCyADKQOoASADKQOgASIJIAp8IgogCVStfCAKIAMpA5gBIAMpA5ABIgkgCHwiCCAJVK18IAggAykDiAEgAykDgAEiCSAGfCIGIAlUrXwgBiADKQN4IA0gEFStfHwiECAGVK18fCIGIAhUrXx8IgggClStfHwiCiALVK18fCIJIAMpAwB8IgsgCVStfCALIAsgAykDGCAKIAogAykDEHwiClatfCAKIAogAykDKCAIIAggAykDIHwiCFatfCAIIAggAykDOCAGIAYgAykDMHwiBlatfCAGIAYgAykDSCADKQNAIhUgEHwiECAVVK18IBAgAykDWCANIAMpA1AiDXwgDVStfHwiDSAQVK18fCIGVq18fCIIVq18fCIKVq18fCILVq18IAcgCVatIAMpA8gBIAcgFFStfHx8IQkgAUEIayIBQXhHDQALAkACQCAJQprN/8ujvcSAGlYNACAJQprN/8ujvcSAGlIEQCAGIQcgCCEMIAohDiALIQ8MAgsgC0LX2a6a5PbpjcsAVg0AAkAgC0LX2a6a5PbpjcsAUgRAIAYhByAIIQwgCiEOIAshDwwBCyAKQr+llJzP8NK75ABWDQFC19mumuT26Y3LACEPIApCv6WUnM/w0rvkAFIEQCAGIQcgCCEMIAohDgwBCyAIQqTsw7WP1LSY5wBWDQFCv6WUnM/w0rvkACEOIAhCpOzDtY/UtJjnAFIEQCAGIQcgCCEMDAELIAZC///Piuv//9UeVg0BQqTsw7WP1LSY5wAhDCAGQv//z4rr///VHlIEQCAGIQcMAQtC///Piuv//9UeIQcgDUKq1f7///+//7l/Vg0BC0Kazf/Lo73EgBohCQwBCyAGQv//z4rr///VHn0iDCANQqvV/v///7//uX9UrSIOfSEHIAhCpOzDtY/UtJjnAH0iDyAGQv//z4rr///VHlQgDCAOVHKtIgZ9IQwgCkK/pZScz/DSu+QAfSIRIAhCpOzDtY/UtJjnAFQgBiAPVnKtIgZ9IQ4gC0LX2a6a5PbpjcsAfSIIIApCv6WUnM/w0rvkAFQgBiARVnKtIgZ9IQ8gCSALQtfZrprk9umNywBUIAYgCFZyrX1Cms3/y6O9xIAafSEJIA1C1aqBgICAwIDGAHwhDQsgAyANNwOoAiADIAc3A6ACIAMgDDcDmAIgAyAONwOQAiADIA83A4gCIAMgCTcDgAIgA0HQAWogA0GAAmogBSAEQQFrIgRBMGxqEL0CIAMpA9ABIRMgAykD2AEhEiADKQPgASERIAMpA+gBIQ8gAykD8AEhDiADKQP4ASEMIAQNAAsLIAAgDDcDKCAAIA43AyAgACAPNwMYIAAgETcDECAAIBI3AwggACATNwMACyADQbACaiQAC6wKAgd/An4jAEHQAGsiAyQAAkAgAi0ADCIFQQFGBEAgACABKQIANwIAIABBCGogAUEIaikCADcCACACKAIAIgBFDQEgAigCBCAAQQJ0EN8EDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAS0ADCIGQQFrDgILAQALIAVFDQEMAgsgBUUNAQsCfyABKAIIIgQgAigCCCIFRgRAIARBAnQhBCABKAIEQQRrIQggAigCBEEEayEJAkADQCAERQ0BIAQgCWohByAEIAhqIARBBGshBCgCACIFIAcoAgAiB0YNAAsgBSAHSyAFIAdJawwCC0F/QQAgBBsMAQsgBCAFSyAEIAVJawtB/wFxDgIBAgMLIANBKGogAUEIaiIIKAIANgIAIAMgASkCACIKNwMgIANBOGogAkEIaiIJKAIANgIAIAMgAikCACILNwMwAn8gCqciBCALpyIFSQRAIANByABqIAkoAgA2AgAgAyACKQIANwNAIANBFGogA0FAayADQSBqEMoBIANBJGoMAQsgA0HIAGogCCgCADYCACADIAEpAgA3A0AgA0EUaiADQUBrIANBMGoQygEgBSEEIANBNGoLIQcgBARAIAcoAgAgBEECdBDfBAsCQCAGQQFHBEAgAygCHA0BIABBAToADCAAIAMpAhQ3AgAgAEEIaiADQRxqKAIANgIADAsLIANBADYCHCADKAIUIgFBBE8EQCADKAIYIAFBAnQQ3wQgA0KAgICAwAA3AhQLIABBAToADCAAIAMpAhQ3AgAgAEEIaiADQRxqKAIANgIADAoLIAAgBjoADCAAIAMpAhQ3AgAgAEEIaiADQRxqKAIANgIADAkLIABBCGpBgMTEACkCADcCACAAQfjDxAApAgA3AgAgAigCACIARQ0HIAIoAgQgAEECdBDfBAwHCyADQcgAaiABQQhqKAIANgIAIAMgASkCADcDQCADQTBqIANBQGsgAhCHAiACKAIAIgEEQCACKAIEIAFBAnQQ3wQLQQEhBCAGQQFGDQEgBkEBIAMoAjgbIQQMAgsgA0HIAGogAkEIaigCADYCACADIAIpAgA3A0AgA0EwaiADQUBrIAEQhwIgASgCACICBEAgASgCBCACQQJ0EN8EC0ECIAZrIQQCQCAGQQFxRQRAIARBASADKAI4GyEEDAELIANBADYCOCADKAIwQQRJDQAgAyADQTBqQQAQ0wMgAygCACIBQYGAgIB4Rw0DCyAAIAMpAjA3AgAgACAEOgAMIABBCGogA0E4aigCADYCAAwGCyADQQA2AjggAygCMEEESQ0AIANBCGogA0EwakEAENMDIAMoAggiAUGBgICAeEcNAgsgACADKQIwNwIAIAAgBDoADCAAQQhqIANBOGooAgA2AgAMBAsgASADKAIEQbTJxAAQyAQACyABIAMoAgxBtMnEABDIBAALIAJBDWohBAJAAkACQCAFQQFrDgIAAQILIABBAToADCAAIAIpAgA3AgAgACAELwAAOwANIABBCGogAkEIaigCADYCACAAQQ9qIARBAmotAAA6AAAMAgsgAEEAOgAMIAAgAikCADcCACAAIAQvAAA7AA0gAEEIaiACQQhqKAIANgIAIABBD2ogBEECai0AADoAAAwBCyAAQQI6AAwgACACKQIANwIAIAAgBC8AADsADSAAQQhqIAJBCGooAgA2AgAgAEEPaiAEQQJqLQAAOgAACyABKAIAIgBFDQAgASgCBCAAQQJ0EN8ECyADQdAAaiQAC68KAQp/IwBBkAVrIgMkAAJAIAEoAgQiBARAIAEgBCABKAIIIgYgBCAEIAZLGyIFazYCBCABIAEoAgAiBCAFQQV0ajYCAAJAAkACQAJAAkAgBgRAIANBqANqIARBGGopAwA3AwAgA0GgA2ogBEEQaikDADcDACADQZgDaiAEQQhqKQMANwMAIAMgBCkDADcDkAMgBUEBRg0BIANB6ANqIARBOGopAwA3AwAgA0HgA2ogBEEwaikDADcDACADQdgDaiIGIARBKGopAwA3AwAgAyAEKQMgNwPQAyADIANBkANqIANB0ANqEEMCQAJAAkAgAy0AQCIBQQJGBEAgBiADQQhqKAIANgIAIAMgAykDADcD0AMMAQsgA0HAAmoiBiADQThqKQMANwMAIANBuAJqIgcgA0EwaikDADcDACADQbACaiIIIANBKGopAwA3AwAgA0GoAmoiCSADQSBqKQMANwMAIANBoAJqIgogA0EYaikDADcDACADQZgCaiILIANBEGopAwA3AwAgA0GQAmoiDCADQQhqKQMANwMAIAMgAykDADcDiAIgAyADKABBNgLAASADIANBxABqKAAANgDDASADQdABaiAMKQMANwMAIANB2AFqIAspAwA3AwAgA0HgAWogCikDADcDACADQegBaiAJKQMANwMAIANB8AFqIAgpAwA3AwAgA0H4AWogBykDADcDACADQYACaiAGKQMANwMAIAMgAykDiAI3A8gBIAVBA0kNBSAFQQNGDQYgA0HIA2ogBEH4AGopAwA3AwAgA0HAA2ogBEHwAGopAwA3AwAgA0G4A2ogBEHoAGopAwA3AwAgA0GYA2ogBEHIAGopAwA3AwAgA0GgA2ogBEHQAGopAwA3AwAgA0GoA2ogBEHYAGopAwA3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IABB5PTEACkCACILNwIAIAAgCzcCDCAAQRRqIAQ2AgAgAigCACIABEAgAigCBCAAQQJ0EN8ECyABKAIAIgBFDQIgASgCBCAAQQJ0EN8EDAILAkACQAJAAkACQCAFQQFGBEAgAigCBCIEKAAAQQFHDQEgACABKQIANwIAIABB5PTEACkCADcCDCAAQRRqQez0xAAoAgA2AgAgAEEIaiABQQhqKAIANgIAIAIoAgAiAEUNByAEIABBAnQQ3wQMBwsCfyAFIAlGBEAgBUECdCEEIAEoAgRBBGshCCACKAIEQQRrIQoDQCAERQ0FIAQgCmohByAEIAhqIARBBGshBCgCACIGIAcoAgAiB0YNAAsgBiAHSyAGIAdJawwBCyAFIAlJIAUgCUtrC0H/AXEOAgIEAQsgA0EoaiABIAQoAgAQggIgA0EQaiIFIANBMGooAgA2AgAgAyADKQIoNwMIIAMoAjQhASACQQA2AggCQCABRQ0AIAIoAgAEfyAEBSACQZjzxAAQpQMgAigCBAtBADYCACACQQE2AgggAigCBCIEIAEgBCgCACIBaiIENgIAIAEgBE0NACACKAIIIgEgAigCAEYEQCACQajzxAAQpQMLIAIoAgQgAUECdGpBATYCACACIAFBAWo2AggLIAAgAykDCDcCACAAIAIpAgA3AgwgAEEUaiACQQhqKAIANgIAIABBCGogBSgCADYCAAwFCyAAIAEpAgA3AgwgAEEUaiABQQhqKAIANgIADAELIAFBADYCCCABKAIARQRAIAFB0PXEABClAwsgASgCBEEBNgIAIABBCGpBATYCACABQQhqQQE2AgAgACABKQIANwIAIABBDGohAAsgAEEIakHs9MQAKAIANgIAIABB5PTEACkCADcCACACKAIAIgBFDQIgAigCBCAAQQJ0EN8EDAILIAIoAgQiBiAFQQJ0akEEaygCACIEZyIHRQRAIANBMGogAUEIaigCADYCACADIAEpAgA3AyggACADQShqIAYgBRB7IAIoAgAiAEUNAiAGIABBAnQQ3wQMAgsgASgCBCEIAkACQCABKAIAIgFBgICAgHhHDQAgCCgCCA0AIANB0ABqIAgQwAMMAQsgAyAJNgIwIAMgCDYCLCADIAE2AiggA0HQAGogA0EoaiAERSAHQQAgBBsQzwELAkACQCACKAIAIgFBgICAgHhHDQAgBigCCA0AIANBxABqIAYQwAMMAQsgAyAFNgIwIAMgBjYCLCADIAE2AiggA0HEAGogA0EoaiAERSAHQQAgBBsQzwELIANBKGogA0HQAGogAygCSCIBIAMoAkwQeyADQSBqIANBMGooAgA2AgAgAyADKQIoNwMYIANB2ABqIANBPGooAgA2AgAgAyADKQI0NwNQIAMoAkQiAgRAIAEgAkECdBDfBAsCQAJAIAMoAlBBgICAgHhHBEAgAygCWA0BIANBMGogA0HYAGooAgA2AgAgAyADKQNQNwMoDAILIAMoAlQiASgCCA0AIANBKGogARDAAwwBCyADQShqIANB0ABqIARFIAdBACAEGxDsAQsgACADKQMYNwIAIAAgAykDKDcCDCAAQQhqIANBIGooAgA2AgAgAEEUaiADQTBqKAIANgIADAELIANBADYCOCADQQE2AiwgA0HU88QANgIoIANCBDcCMCADQShqQdT0xAAQqAQACyADQeAAaiQAC7wKAQd/IwBBMGsiAyQAIAEtAAwhBQJAAkAgAi0ADCIEQQFGBEAgASgCCCIGQQJ0IQQCQCAGQf////8DSyAEQfz///8HS3INACABKAIEIQgCfyAERQRAQQQhAUEADAELQdHOxQAtAAAaQQQhByAEQQQQ1gQiAUUNASAGCyEHIAQEQCABIAggBPwKAAALIAAgBToADCAAIAY2AgggACABNgIEIAAgBzYCAAwCCyAHIARB+IHAABDIBAALAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBUEBaw4CDAEACyAERQ0BDAILIARFDQELAn8gASgCCCIEIAIoAggiBkYEQCAEQQJ0IQQgASgCBEEEayEIIAIoAgRBBGshCQJAA0AgBEUNASAEIAlqIQcgBCAIaiAEQQRrIQQoAgAiBiAHKAIAIgdGDQALIAYgB0sgBiAHSWsMAgtBf0EAIAQbDAELIAQgBksgBCAGSWsLQf8BcQ4CAgYBCyADQShqIAJBCGooAgA2AgAgAyACKQIANwMgIANBFGogA0EgaiABEMoBIAMoAhxFBEAgAEEBOgAMIAAgAykCFDcCACAAQQhqIANBHGooAgA2AgAMCwsgACAFOgAMIAAgAykCFDcCACAAQQhqIANBHGooAgA2AgAMCgtBAiEEIAVBAWsOAgMBAgsgAEEIakGozMIAKQIANwIAIABBoMzCACkCADcCAAwHC0EAIQQLIANBKGogAkEIaigCADYCACADIAIpAgA3AyAgA0EUaiADQSBqIAEQhwIgBEEBIAMoAhwbIQQMAwsgA0EoaiACQQhqKAIANgIAIAMgAikCADcDICADQRRqIgIgA0EgaiABEIcCQQAhASADQQA2AhwgAiACKAIAIAIoAggiBWtBAEkEfyACIAVBAEEEQQQQiAMgAigCCAUgBQs2AgggAygCHCIFRQ0BIAMoAhgiASAFQQJ0IgRqQQRrKAIABEAgBSEBDAILIAFBBGshASAFQf////8DcSECAkADQCAERQRAQQAhBAwCCyACQQFrIQIgASAEaiAEQQRrIQQoAgBFDQALIAUiASACQQFqIgRJDQILIAMgBDYCHCAEIQEMAQsgA0EoaiACQQhqKAIANgIAIAMgAikCADcDICADQRRqIAEgA0EgahCeAUEBIQQCQAJAIAVBAUcEQCAFQQEgAygCHBshBAwBCyADQQA2AhwgAygCFEEESQ0AIANBCGogA0EUakEAENMDIAMoAggiAUGBgICAeEcNAQsgACADKQIUNwIAIAAgBDoADCAAQQhqIANBHGooAgA2AgAMBQsgASADKAIMQdDPwgAQyAQAC0EBIQQgASADKAIUQQJ2Tw0AIAMgA0EUaiABENMDIAMoAgAiAUGBgICAeEYNACABIAMoAgRB0M/CABDIBAALIAAgAykCFDcCACAAIAQ6AAwgAEEIaiADQRxqKAIANgIADAILIAJBDWohAQJAAkACQCAEQQFrDgIBAgALIABBAjoADCAAIAIpAgA3AgAgACABLwAAOwANIABBCGogAkEIaigCADYCACAAQQ9qIAFBAmotAAA6AAAMAwsgAEEBOgAMIAAgAikCADcCACAAIAEvAAA7AA0gAEEIaiACQQhqKAIANgIAIABBD2ogAUECai0AADoAAAwCCyAAQQA6AAwgACACKQIANwIAIAAgAS8AADsADSAAQQhqIAJBCGooAgA2AgAgAEEPaiABQQJqLQAAOgAADAELIAIoAgAiAEUNACACKAIEIABBAnQQ3wQLIANBMGokAAukCQERfyMAQSBrIgkkACACKAIEIQcgASgCBCEGAkACQAJAAkAgASgCCCIIIAIoAggiBE0EQAJAIAgEQCAIQQFxAkAgCEEBRgRADAELIAhB/v///wFxIQ4gByEBIAYhAwNAIAEgAygCACIPIAEoAgAiEGsiESAFazYCACABQQRqIgsgA0EEaigCACIMIAsoAgAiC2siEiAPIBBJIAUgEUtyIgVrNgIAIAsgDEsgBSASS3IhBSABQQhqIQEgA0EIaiEDIA4gCkECaiIKRw0ACwsEfyAHIApBAnQiAWoiAyABIAZqKAIAIgEgAygCACIDayIGIAVrNgIAIAEgA0kgBSAGS3IFIAULQQFxDQELIAQgCE0NAiAIQQJ0IQEgBEECdCEDA0AgASAHaigCAA0BIAFBBGoiASADRw0ACwwCCyAJQQA2AhggCUEBNgIMIAlBxIrFADYCCCAJQgQ3AhAgCUEIakHcisUAEKgEAAsgBiAEQQJ0aiENAkACQCAEBEAgBEEBcSEOIARBAUcNAQwCC0EAIQEgAigCACAISQRAIAJBACAIEIkDIAIoAgQhByACKAIIIQELIAhBAnQiAwRAIAcgAUECdGogDSAD/AoAAAsgAiABIAhqIgQ2AgggAigCACEFDAMLIARB/v///wFxIQ8gByEBIAYhAwNAIAEgAygCACIQIAEoAgAiEWsiCyAFazYCACABQQRqIgwgA0EEaigCACISIAwoAgAiDGsiEyAQIBFJIAUgC0tyIgVrNgIAIAwgEksgBSATS3IhBSABQQhqIQEgA0EIaiEDIA8gCkECaiIKRw0ACwsgDgRAIAcgCkECdCIBaiIDIAEgBmooAgAiASADKAIAIgNrIgYgBWs2AgAgASADSSAFIAZLciEFCyAIIARrIgFBAnQhBiAEIQMgAigCACAEayABSQRAIAIgBCABEIkDIAIoAgQhByACKAIIIQMLIAYEQCAHIANBAnRqIA0gBvwKAAALIAIgASADaiIGNgIIAkAgBUEBcUUNACAEIAZNBEACQCAEIAZGDQAgByAEQQJ0aiIBIAEoAgAiBUEBazYCACAFDQIgASAEIAZHIgVBAnRqIQEgAyAIakECdCAFQQJ0ayAEQQN0ayEDA0AgA0UNASABIAEoAgAiBEEBazYCACADQQRrIQMgAUEEaiEBIARFDQALDAILIAlBADYCGCAJQQE2AgwgCUHEisUANgIIIAlCBDcCECAJQQhqQcyKxQAQqAQACyAEIAZBnL7EABDkBAALIAYhBAsgAigCACEFIARFDQELIAcgBEECdCIBakEEaygCAA0BIARB/////wNxIQMDQCABRQ0BIANBAWshAyABQQRrIgEgB2ooAgBFDQALIANBAWoiASAEIAEgBEkbIQQMAQtBACEECwJAAkAgBUECdiAETQRAIAchAyAFIQEMAQtBACEBIAVFBEAgByEDDAELIAVBAnQhAiAERQRAQQQhAyAHIAIQ3wQMAQsgByACQQQgBCIBQQJ0IgIQzgQiA0UNAQsgACAENgIIIAAgAzYCBCAAIAE2AgAgCUEgaiQADwtBBCACQYzBxAAQyAQAC+MLAgF/EX4jAEHgAmsiAiQAIAJBoAJqQgA3AwAgAkGYAmpCADcDACACQZACakIANwMAIAJBiAJqQgA3AwAgAkIANwOAAiACQgE3A6gCIAEpAwAhDSABKQMIIQ4gASkDECEPIAEpAxghECABKQMgIREgASkDKCESQSghAQNAIAJB8ABqIAJBgAJqIAFqKQMAIgVCACASQgAQyQMgAkGAAWogBUIAIBFCABDJAyACQZABaiAFQgAgEEIAEMkDIAJBoAFqIAVCACAPQgAQyQMgAkGwAWogBUIAIA5CABDJAyACQcABaiAFQgAgDUIAEMkDIAJB4ABqIAIpA3AiCyAMfCIKQgBCAEL9//P/z///+Yl/EMkDIAJB0ABqIAIpA2giBUIAQqvV/v///7//uX9CABDJAyACQUBrIAVCAEL//8+K6///1R5CABDJAyACQTBqIAVCAEKk7MO1j9S0mOcAQgAQyQMgAkEgaiAFQgBCv6WUnM/w0rvkAEIAEMkDIAJBEGogBUIAQtfZrprk9umNywBCABDJAyACIAVCAEKazf/Lo73EgBpCABDJAyACKQMIIAIpA8ABIhMgBHwiBSACKQO4ASACKQOwASIEIAh8IgggBFStfCAIIAIpA6gBIAIpA6ABIgQgB3wiByAEVK18IAcgAikDmAEgAikDkAEiBCAGfCIGIARUrXwgBiACKQOIASACKQOAASIEIAN8IgMgBFStfCADIAIpA3ggCiALVK18fCIEIANUrXx8IgMgBlStfHwiBiAHVK18fCIHIAhUrXx8IgsgAikDAHwiCCALVK18IAggCCACKQMYIAcgByACKQMQfCIHVq18IAcgByACKQMoIAYgBiACKQMgfCIGVq18IAYgBiACKQM4IAMgAyACKQMwfCIDVq18IAMgAyACKQNIIAIpA0AiDCAEfCIEIAxUrXwgBCACKQNYIAogAikDUCIKfCAKVK18fCIMIARUrXx8IgNWrXx8IgZWrXx8IgdWrXx8IghWrXwiCiAFIAtWrSACKQPIASAFIBNUrXx8IgUgCXwiCXwiBCAKVK0gBSAJVq18IQkgAUEIayIBQXhHDQALAkACQCAJQgBSIARCms3/y6O9xIAaVnINAAJAIARCms3/y6O9xIAaUQRAIAhC19mumuT26Y3LAFYNAiAIQtfZrprk9umNywBSBEAgAyEFIAYhCSAHIQogCCELQprN/8ujvcSAGiEEDAQLIAdCv6WUnM/w0rvkAFYNAkLX2a6a5PbpjcsAIQsgB0K/pZScz/DSu+QAUgRAIAMhBSAGIQkgByEKQprN/8ujvcSAGiEEDAQLIAZCpOzDtY/UtJjnAFYNAkK/pZScz/DSu+QAIQogBkKk7MO1j9S0mOcAUgRAIAMhBSAGIQlCms3/y6O9xIAaIQQMBAsgA0L//8+K6///1R5WDQJCpOzDtY/UtJjnACEJIANC///Piuv//9UeUQ0BIAMhBUKazf/Lo73EgBohBAwDCyADIQUgBiEJIAchCiAIIQsMAgtC///Piuv//9UeIQUgDEKr1f7///+//7l/Wg0AQprN/8ujvcSAGiEEDAELIANC///Piuv//9UefSIJIAxCq9X+////v/+5f1StIgp9IQUgBkKk7MO1j9S0mOcAfSILIANC///Piuv//9UeVCAJIApUcq0iA30hCSAHQr+llJzP8NK75AB9Ig0gBkKk7MO1j9S0mOcAVCADIAtWcq0iA30hCiAIQtfZrprk9umNywB9IgYgB0K/pZScz/DSu+QAVCADIA1Wcq0iA30hCyAEIAhC19mumuT26Y3LAFQgAyAGVnKtfUKazf/Lo73EgBp9IQQgDELVqoGAgIDAgMYAfCEMCyACIAw3A/gBIAIgBTcD8AEgAiAJNwPoASACIAo3A+ABIAIgCzcD2AEgAiAENwPQASACIAJBgAJqNgLcAiACQQA2AsQCIAJBADYCsAIgAiACQdABajYC2AIgACACQbACahCtAiACQeACaiQAC4kKAiB/AX4jAEHABGsiAiQAQdHOxQAtAAAaQcAEQQgQ1gQiAwRAIAMgAUHABPwKAAAgAykDACEiIANBwAQQ3wQgAiAiNwMAIAJBCGogAUEIakGYAvwKAAAgAkGgAmoiBCACEKQBIABBKGogAkHIAmoiAykDADcDACAAQSBqIAJBwAJqIgUpAwA3AwAgAEEYaiACQbgCaiIGKQMANwMAIABBEGogAkGwAmoiBykDADcDACAAQQhqIAJBqAJqIggpAwA3AwAgACACKQOgAjcDACAAIAIpA9ACNwMwIABBOGogAkHYAmoiCSkDADcDACAAQUBrIAJB4AJqIgopAwA3AwAgAEHIAGogAkHoAmoiCykDADcDACAAQdAAaiACQfACaiIMKQMANwMAIABB2ABqIAJB+AJqIg0pAwA3AwAgAEGIAWogAkGoA2oiDikDADcDACAAQYABaiACQaADaiIPKQMANwMAIABB+ABqIAJBmANqIhApAwA3AwAgAEHwAGogAkGQA2oiESkDADcDACAAQegAaiACQYgDaiISKQMANwMAIAAgAikDgAM3A2AgAEG4AWogAkHYA2oiEykDADcDACAAQbABaiACQdADaiIUKQMANwMAIABBqAFqIAJByANqIhUpAwA3AwAgAEGgAWogAkHAA2oiFikDADcDACAAQZgBaiACQbgDaiIXKQMANwMAIAAgAikDsAM3A5ABIABB6AFqIAJBiARqIhgpAwA3AwAgAEHgAWogAkGABGoiGSkDADcDACAAQdgBaiACQfgDaiIaKQMANwMAIABB0AFqIAJB8ANqIhspAwA3AwAgAEHIAWogAkHoA2oiHCkDADcDACAAIAIpA+ADNwPAASAAQZgCaiACQbgEaiIdKQMANwMAIABBkAJqIAJBsARqIh4pAwA3AwAgAEGIAmogAkGoBGoiHykDADcDACAAQYACaiACQaAEaiIgKQMANwMAIABB+AFqIAJBmARqIiEpAwA3AwAgACACKQOQBDcD8AEgBCABQaACahCkASAAQcgCaiADKQMANwMAIABBwAJqIAUpAwA3AwAgAEG4AmogBikDADcDACAAQbACaiAHKQMANwMAIABBqAJqIAgpAwA3AwAgACACKQOgAjcDoAIgACACKQPQAjcD0AIgAEHYAmogCSkDADcDACAAQeACaiAKKQMANwMAIABB6AJqIAspAwA3AwAgAEHwAmogDCkDADcDACAAQfgCaiANKQMANwMAIABBqANqIA4pAwA3AwAgAEGgA2ogDykDADcDACAAQZgDaiAQKQMANwMAIABBkANqIBEpAwA3AwAgAEGIA2ogEikDADcDACAAIAIpA4ADNwOAAyAAQdgDaiATKQMANwMAIABB0ANqIBQpAwA3AwAgAEHIA2ogFSkDADcDACAAQcADaiAWKQMANwMAIABBuANqIBcpAwA3AwAgACACKQOwAzcDsAMgAEGIBGogGCkDADcDACAAQYAEaiAZKQMANwMAIABB+ANqIBopAwA3AwAgAEHwA2ogGykDADcDACAAQegDaiAcKQMANwMAIAAgAikD4AM3A+ADIABBuARqIB0pAwA3AwAgAEGwBGogHikDADcDACAAQagEaiAfKQMANwMAIABBoARqICApAwA3AwAgAEGYBGogISkDADcDACAAIAIpA5AENwOQBCACQcAEaiQADwtBCEHABEHwtcIAEMgEAAuICgIJfwF+IwBB4ABrIgMkAAJAAkACQAJAAkAgAigCCCIGBEAgASgCCCIFRQRAIABBCGpB7PTEACgCACIBNgIAIABB5PTEACkCACIMNwIAIAAgDDcCDCAAQRRqIAE2AgAMBQsgAigCBCEHAkACQAJAIAZBAUcEQAJ/IAUgBkYEQCAGQQJ0IQQgB0EEayEKIAEoAgRBBGshCwNAIARFDQUgBCAKaiEJIAQgC2ogBEEEayEEKAIAIgggCSgCACIJRg0ACyAIIAlLIAggCUlrDAELIAUgBksgBSAGSWsLQf8BcQ4CAgMBCyAHKAAAQQFGDQZB0c7FAC0AABogASgCBCEEIAVBAnQiAUEEENYEIgJFDQggAQRAIAIgBCAB/AoAAAsgAyAFNgJYIAMgAjYCVCADIAU2AlAgA0EoaiIEIANB0ABqIAcoAgAQggIgA0EQaiIFIANBMGoiASgCADYCACADIAMpAig3AwggAygCNCECIAFB7PTEACgCADYCACADQeT0xAApAgA3AyggAgRAIARB6PbEABClAyADKAIsIAI2AgAgA0EBNgIwCyAAIAMpAyg3AgwgAEEUaiABKAIANgIAIABBCGogBSgCADYCACAAIAMpAwg3AgAMBwtB0c7FAC0AABogASgCBCEEIAVBAnQiAUEEENYEIgJFDQcgAQRAIAIgBCAB/AoAAAsgACAFNgIUIAAgAjYCECAAIAU2AgwgAEHk9MQAKQIANwIAIABBCGpB7PTEACgCADYCAAwGC0HRzsUALQAAGkEE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AikDkAY3A/ABIABB6AFqIAJBiAZqKQMANwMAIABB4AFqIAJBgAZqKQMANwMAIABB2AFqIAJB+AVqKQMANwMAIABB0AFqIAJB8AVqKQMANwMAIABB+AFqIAJBmAZqKQMANwMAIABBgAJqIAJBoAZqKQMANwMAIABBiAJqIAJBqAZqKQMANwMAIABBkAJqIAJBsAZqKQMANwMAIABBmAJqIAJBuAZqKQMANwMAIAAgBjYCxAEgACAJNgLAASAAIAc2AgAgACAENgIEIAAgAikDuAQ3AwggAEEQaiACQcAEaikDADcDACAAQRhqIAJByARqKQMANwMAIABBIGogAkHQBGopAwA3AwAgAEEoaiACQdgEaikDADcDACAAQdgAaiACQYgFaikDADcDACAAQdAAaiACQYAFaikDADcDACAAQcgAaiACQfgEaikDADcDACAAQUBrIAJB8ARqKQMANwMAIABBOGogAkHoBGopAwA3AwAgACACKQPgBDcDMCAAIAU2AmQgACAINgJgIABBiAFqIAJBsAVqKQMANwMAIABBgAFqIAJBqAVqKQMANwMAIABB+ABqIAJBoAVqKQMANwMAIABB8ABqIAJBmAVqKQMANwMAIAAgAikDkAU3A2ggAEG4AWogAkHgBWopAwA3AwAgAEGwAWogAkHYBWopAwA3AwAgAEGoAWogAkHQBWopAwA3AwAgAEGgAWogAkHIBWopAwA3AwAgAEGYAWogAkHABWopAwA3AwAgACACKQO4BTcDkAEgAkHABmokAA8LQQhBoAJB8LXCABDIBAALIAIgBDYCqAIMAgsgAiAFNgKoAgwBCyACIAY2AqgCCyACIAE2AqQCIAIgAzYCoAJBgIvAAEErIAJBoAJqQayLwABBpI3AABDKAwALmgkCB34PfyMAQTBrIgskACALIAM2AiggASgCDCEQIAsgC0EoajYCLAJAAkACQAJ/AkAgECACIBBqIgNNBEAgASgCBCIRIBFBAWpBA3ZBB2wgEUEISRsiAkEBdiADSQRAIAJBAWoiAiADIAIgA0sbIgJBCEkNAiACQf////8BTQRAQX8gAkEDdEEHbkEBa2d2IgJB/v///wBLDQUgAkEBagwECxD1AyALKAIkIQMgCygCICECDAYLIAEgC0EsakE5QRAQxAFBgYCAgHghAgwFCxD1AyALKAIMIQMgCygC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GlZyDQAgBUKazf/Lo73EgBpSDQEgCELX2a6a5PbpjcsAVg0AIAhC19mumuT26Y3LAFIEQCADIQogBiEEIAchCSAIIQtCms3/y6O9xIAaIQUMBAsgB0K/pZScz/DSu+QAVg0AQtfZrprk9umNywAhCyAHQr+llJzP8NK75ABSBEAgAyEKIAYhBCAHIQlCms3/y6O9xIAaIQUMBAsgBkKk7MO1j9S0mOcAVg0AQr+llJzP8NK75AAhCSAGQqTsw7WP1LSY5wBSBEAgAyEKIAYhBEKazf/Lo73EgBohBQwECyADQv//z4rr///VHlYNAEKk7MO1j9S0mOcAIQQgA0L//8+K6///1R5SIAxCqtX+////v/+5f1hyDQILIANC///Piuv//9UefSIEIAxCq9X+////v/+5f1StIgl9IQogBkKk7MO1j9S0mOcAfSILIANC///Piuv//9UeVCAEIAlUcq0iA30hBCAHQr+llJzP8NK75AB9Ig0gBkKk7MO1j9S0mOcAVCADIAtWcq0iA30hCSAIQtfZrprk9umNywB9IgYgB0K/pZScz/DSu+QAVCADIA1Wcq0iA30hCyAFIAhC19mumuT26Y3LAFQgAyAGVnKtfUKazf/Lo73EgBp9IQUgDELVqoGAgIDAgMYAfCEMDAILIAMhCiAGIQQgByEJIAghCwwBCyADIQpCms3/y6O9xIAaIQULIAAgDDcDKCAAIAo3AyAgACAENwMYIAAgCTcDECAAIAs3AwggACAFNwMAIAJBgAJqJAAL+w0CC38KfiMAQdACayIDJAACQAJAAkACQAJAAkACQCABQYjSwQBBMBDxA0UEQCABQTBqIgRBiNLBAEEwEPEDRQ0BCwJAAkAgAi0ADCIJQQFHBEAgAS0AYCEEIANBCGpBAEHgAPwLACADIAQ6AGggA0HIAWogAUHYAGopAwA3AwAgA0HAAWogAUHQAGopAwA3AwAgA0G4AWogAUHIAGopAwA3AwAgA0GwAWogAUFAaykDADcDACADQagBaiABQThqKQMANwMAIANB+ABqIAFBCGopAwA3AwAgA0GAAWogAUEQaikDADcDACADQYgBaiABQRhqKQMANwMAIANBkAFqIAFBIGopAwA3AwAgA0GYAWogAUEoaikDADcDACADIAEpAzA3A6ABIAMgASkDADcDcCADIAQ6ANABIAIoAgQhCiACKAIAIQtBBCEFIAkOAwECAQILIAEtAGAhASAAQQBB4AD8CwAgACABOgBgDAMLIAIoAggiB0ECdCEBIAdB/////wNLIAFB/P///wdLcg0DIAEEf0HRzsUALQAAGkEEIQYgAUEEENYEIgVFDQQgBwVBAAshBiABRQ0AIAUgCiAB/AoAAAsgB0UNBUHg98EAKAIAIQ0gA0HgAWohBEHY98EAKQIAIRMDQCAEIA02AgAgAyATNwPYASADQdgBakHM+MEAEKUDIAMoAtwBQQE2AgAgAygC3AEhCCADKALYASEMAn8gB0EBRwRAQdHOxQAtAAAaQQRBBBDWBCIBRQ0GIAEgCCgCACICNgIAIAIgBSgCAHEMAQtB0c7FAC0AABpBBEEEENYEIgFFDQYgASAFKAIAIgI2AgAgAiAIKAIAcQshAiABIAI2AgAgDARAIAggDEECdBDfBAsgAUEEEN8EIAIEQCADQdgBaiICIANBCGoiASADQfAAahAnIAEgAkHoAPwKAAALIANB2AFqIgEgA0HwAGoiAiACECcgAiABQegA/AoAACADIAc2AuABIAMgBTYC3AEgAyAGNgLYAQJAAkAgBkGAgICAeEcNACAFKAIIDQAgA0EANgLMAiADQoCAgIDAADcCxAIMAQsgA0HEAmogA0HYAWpBAEEBEOwBCyADKALEAiEGIAMoAsgCIQUgAygCzAIiBw0ACwwFCyAAIAQpAwA3AzAgACABKQMANwMAIABB2ABqIARBKGopAwA3AwAgAEHQAGogBEEgaikDADcDACAAQcgAaiAEQRhqKQMANwMAIABBQGsgBEEQaikDADcDACAAQThqIARBCGopAwA3AwAgAEEIaiABQQhqKQMANwMAIABBEGogAUEQaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBKGogAUEoaikDADcDACAAIAEtAGA6AGALIAIoAgAiAEUNBCACKAIEIABBAnQQ3wQMBAsgBiABQfiBwAAQyAQAC0EEQQRB+IHAABDIBAALQQRBBEH4gcAAEMgEAAsgCUUEQCADQdgBaiECAkACQCADQQhqIgFBiNLBAEEwEPEDRQRAIAFBMGoiBEGI0sEAQTAQ8QNFDQELIAEpA1ghFCABKQNQIRAgASkDSCERIAEpA0AhEiABKQM4IRYgASkDMCEXAkAgAUEwakGI0sEAQTAQ8QNFBEAgFiEOIBIhDyARIRUgECETDAELQv//z4rr///VHiAQfSIPIBRCq9X+////v/+5f1atIhV9IRNCpOzDtY/UtJjnACARfSIOIA8gFVQgEEL//8+K6///1R5Wcq0iD30hFUK/pZScz/DSu+QAIBJ9IhAgDiAPVCARQqTsw7WP1LSY5wBWcq0iDn0hD0LX2a6a5PbpjcsAIBZ9IhEgDiAQViASQr+llJzP8NK75ABWcq0iEn0hDkKazf/Lo73EgBogESASVCAWQtfZrprk9umNywBWcq0gF3x9IRdCq9X+////v/+5fyAUfSEUCyACIBQ3A1ggAiATNwNQIAIgFTcDSCACIA83A0AgAiAONwM4IAIgFzcDMCACIAEpAwA3AwAMAQsgAiAEKQMANwMwIAIgASkDADcDACACQdgAaiAEQShqKQMANwMAIAJB0ABqIARBIGopAwA3AwAgAkHIAGogBEEYaikDADcDACACQUBrIARBEGopAwA3AwAgAkE4aiAEQQhqKQMANwMACyACQQhqIAFBCGopAwA3AwAgAkEQaiABQRBqKQMANwMAIAJBGGogAUEYaikDADcDACACQSBqIAFBIGopAwA3AwAgAkEoaiABQShqKQMANwMAIAIgAS0AYDoAYCABIAJB6AD8CgAACyAAIANBCGpB6AD8CgAAIAYEQCAFIAZBAnQQ3wQLIAtFDQAgCiALQQJ0EN8ECyADQdACaiQAC6kJAgt/AX4jAEHwAWsiAyQAAkACQAJAAkACQAJAAkAgAUHo0cEAQSAQ8QNFBEAgAUEgaiIEQejRwQBBIBDxA0UNAQsCQAJAIAItAAwiCEEBRwRAIANBEGpCADcDACADQRhqQgA3AwAgA0EgakIANwMAIANBKGpCADcDACADQTBqQgA3AwAgA0E4akIANwMAIANBQGtCADcDACADQgA3AwggAyABLQBAIgQ6AEggA0GIAWogAUE4aikDADcDACADQYABaiABQTBqKQMANwMAIANB+ABqIAFBKGopAwA3AwAgA0HYAGogAUEIaikDADcDACADQeAAaiABQRBqKQMANwMAIANB6ABqIAFBGGopAwA3AwAgAyAEOgCQASADIAEpAyA3A3AgAyABKQMANwNQIAIoAgQhCSACKAIAIQpBBCEFQQAhBCAI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KyAFQYgJakGkusIAQfS6wgAQygMAC6AIAg9/BH4jAEGACWsiAiQAIAIgASABQcABaiIDEOsBIAJBwAFqIgUgASADEKACIAJBgAJqIAFBQGsiBiABQYACahCgAiACQcACaiABQYABaiIHIAFBwAJqEKACIAJBiAZqQgA3AwAgAkGQBmpCADcDACACQZgGakIANwMAIAJBoAZqQgA3AwAgAkGoBmpCADcDACACQbAGakIANwMAIAJBuAZqQgA3AwAgAkHYBGoiCEHAg8AAKQMAIhE3AwAgAkHQBGoiCUG4g8AAKQMAIhI3AwAgAkHIBGoiCkGwg8AAKQMAIhM3AwAgAkHgBGoiC0IANwMAIAJB6ARqIgxCADcDACACQfAEaiINQgA3AwAgAkH4BGoiDkIANwMAIAJCADcDgAYgAkGog8AAKQMAIhQ3A8AEIAJB+AZqIA4pAwA3AwAgAkHwBmogDSkDADcDACACQegGaiAMKQMANwMAIAJB4AZqIAspAwA3AwAgAkHYBmogCCkDADcDACACQdAGaiAJKQMANwMAIAJByAZqIAopAwA3AwAgAiACKQPABDcDwAYgAkG4B2pCADcDACACQbAHakIANwMAIAJBqAdqQgA3AwAgAkGgB2pCADcDACACQZgHakIANwMAIAJBkAdqQgA3AwAgAkGIB2pCADcDACACQgA3A4AHIAJBwARqIgQgAkGABmogAxDrASACQYADaiIPIAEgBBCgAiACQcADaiIBIAYgAkGABWoiAxCgAiACQYAEaiIGIAcgAkHABWoiBxCgAiAEIAUgDxDrASAPIAQgAhDcASABIAMgAkFAayIFENwBIAYgByACQYABaiIQENwBIAJByAdqQgA3AwAgAkHQB2pCADcDACACQdgHakIANwMAIAJB4AdqQgA3AwAgAkHoB2pCADcDACACQfAHakIANwMAIAJB+AdqQgA3AwAgCCARNwMAIAkgEjcDACAKIBM3AwAgC0IANwMAIAxCADcDACANQgA3AwAgDkIANwMAIAJCADcDwAcgAiAUNwPABCACQbgIaiAOKQMANwMAIAJBsAhqIA0pAwA3AwAgAkGoCGogDCkDADcDACACQaAIaiALKQMANwMAIAJBmAhqIAgpAwA3AwAgAkGQCGogCSkDADcDACACQYgIaiAKKQMANwMAIAIgAikDwAQ3A4AI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aiAEQbgBaikDADcDACADQaAFaiAEQbABaikDADcDACADQZgFaiAEQagBaikDADcDACADQZAFaiAEQaABaikDADcDACADQYgFaiAEQZgBaikDADcDACADQdgEaiAEQegAaikDADcDACADQeAEaiAEQfAAaikDADcDACADQegEaiAEQfgAaikDADcDACADQfAEaiAEQYABaikDADcDACADQfgEaiAEQYgBaikDADcDACADIAQpA5ABNwOABSADIAQpA2A3A9AEIAVBBE0NByAFQQVGDQggA0GIBmogBEGYAmopAwA3AwAgA0GABmogBEGQAmopAwA3AwAgA0H4BWogBEGIAmopAwA3AwAgA0HwBWogBEGAAmopAwA3AwAgA0HoBWogBEH4AWopAwA3AwAgA0G4BWoiBSAEQcgBaikDADcDACADQcAFaiAEQdABaikDADcDACADQcgFaiAEQdgBaikDADcDACADQdAFaiAEQeABaikDADcDACADQdgFaiAEQegBaikDADcDACADIAQpA/ABNwPgBSADIAQpA8ABNwOwBSADIANB0ARqIANBsAVqEGwgAygCAEUNASAFIANBDGooAgA2AgAgAyADKQIENwOwBQsgAigCACIBQYCAgIB4RiABRXJFBEAgAigCBCABEN8ECyACIAMpA7AFNwIAIAJBCGogA0G4BWooAgA2AgBBAiEBDAELIANBjANqIQIgAiADQQhqQcAB/AoAACADQbAFaiIEIAJBwAH8CgAAIANB8AZqIANBqAJqQeAA/AoAACADIAMoAKMCNgCLAyADIAMoAqACNgKIAyADIARBoAL8CgAACyAAIANBoAL8CgAAIAAgAToAoAIgACADKAKIAzYAoQIgAEGkAmogAygAiwM2AAAMBwtBAEEAQcD6wAAQ2QMAC0EBQQFB0PrAABDZAwALQQJBAkHg+sAAENkDAAtBA0EDQfD6wAAQ2QMAC0EEQQRBgPvAABDZAwALQQVBBUGQ+8AAENkDAAsgAEEDOgCgAgsgA0HQB2okAAvtBwIJfwh+IwBBEGsiByQAAkACQAJAIAEoAghFBEBB0c7FAC0AABpBASECQQFBARDWBCIGRQ0CIAZBADoAACAHQQE2AgQMAQsgB0EEaiABQQgQsAIgBygCCCEGIAcoAgwiAkECSQ0AIAIgBmohBEEAIQEgAkEBdiIF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IAMpAiA3AgAgACAEOgAMIABBCGogA0EoaigCADYCAAwECyADQQA2AhwgAygCFCIBQQRPBEAgAygCGCABQQJ0EN8EIANCgICAgMAANwIUCyAAQQE6AAwgACADKQIUNwIAIABBCGogA0EcaigCADYCAAwDCyAAIAg6AAwgACADKQIUNwIAIABBCGogA0EcaigCADYCAAwCCyABKAIAIgBFDQEgASgCBCAAQQJ0EN8EDAELIAEgAygCDEHQz8IAEMgEAAsgA0HQAGokAAvnCAEPfyMAQcACayICJAAgAkE4akIANwMAIAJBMGpCADcDACACQShqQgA3AwAgAkEgakIANwMAIAJBGGpCADcDACACQRBqQgA3AwAgAkEIakIANwMAIAJCADcDAAJAAkAgASACEKcEBEAgAUFAayIDIAIQpwQNAQsgAkHgAGoiAyABKQMgNwMAIAJB2ABqIgQgAUEYaikDADcDACACQdAAaiIFIAFBEGopAwA3AwAgAkHIAGoiBiABQQhqKQMANwMAIAJB6ABqIgcgAUEoaikDADcDACACQfAAaiIIIAFBMGopAwA3AwAgAkH4AGoiCSABQThqKQMANwMAIAIgASkDADcDQCACQZgBaiIKIAFB2ABqKQMANwMAIAJBkAFqIgsgAUHQAGopAwA3AwAgAkGIAWoiDCABQcgAaikDADcDACACIAEpA0A3A4ABIAJBuAFqIg0gAUH4AGopAwA3AwAgAkGwAWoiDiABQfAAaikDADcDACACQagBaiIPIAFB6ABqKQMANwMAIAJBoAFqIhAgASkDYDcDACACQQhqIAwpAwA3AwAgAkEQaiALKQMANwMAIAJBGGogCikDADcDACACQSBqIBApAwA3AwAgAkEoaiAPKQMANwMAIAJBMGogDikDADcDACACQThqIA0pAwA3AwAgAiACKQOAATcDACAAQUBrIAIQ8AIgAEE4aiAJKQMANwMAIABBMGogCCkDADcDACAAQShqIAcpAwA3AwAgAEEgaiADKQMANwMAIABBGGogBCkDADcDACAAQRBqIAUpAwA3AwAgAEEIaiAGKQMANwMAIAAgAikDQDcDAAwBCyACQeABaiIEIAEpAyA3AwAgAkHYAWoiBSABQRhqKQMANwMAIAJB0AFqIgYgAUEQaikDADcDACACQcgBaiIHIAFBCGopAwA3AwAgAkHoAWoiCCABQShqKQMANwMAIAJB8AFqIgkgAUEwaikDADcDACACQfgBaiIKIAFBOGopAwA3AwAgAkGIAmoiCyADQQhqKQMANwMAIAJBkAJqIgwgA0EQaikDADcDACACQZgCaiINIANBGGopAwA3AwAgAiABKQMANwPAASACIAMpAwA3A4ACIAJBuAJqIgMgAUH4AGopAwA3AwAgAkGwAmoiDiABQfAAaikDADcDACACQagCaiIPIAFB6ABqKQMANwMAIAJBoAJqIhAgASkDYDcDACAAQThqIAopAwA3AwAgAEEwaiAJKQMANwMAIABBKGogCCkDADcDACAAQSBqIAQpAwA3AwAgAEEYaiAFKQMANwMAIABBEGogBikDADcDACAAQQhqIAcpAwA3AwAgACACKQPAATcDACAAQfgAaiADKQMANwMAIABB8ABqIA4pAwA3AwAgAEHoAGogDykDADcDACAAQeAAaiAQKQMANwMAIABB2ABqIA0pAwA3AwAgAEHQAGogDCkDADcDACAAQcgAaiALKQMANwMAIAAgAikDgAI3A0ALIAJBwAJqJAAL/QgCAX8MfiMAQbACayICJAAgAkGIAmogAUHAABCxAkEBIQECQCACLQCIAkEBRgRAIAAgAi0AiQI6AAEMAQsgAkHAAWogAikDqAJCAEKkC0IAEMkDIAJB0AFqIAIpA6ACQgBCpAtCABDJAyACQeABaiACKQOYAkIAQqQLQgAQyQMgAkHwAWogAikDkAJCAEKkC0IAEMkDIAJBsAFqIAIpA8ABIgdCm5Svw/K1qN6Gf34iBEIAQm1CABDJAyACQaABaiAEQgBCf0IAEMkDIAJBMGogBEIAQv///////////wBCABDJAyACQZABaiACKQOgASIEIAIpA8gBIgYgAikD0AF8IgV8IgggAikDuAEgAikDsAEiAyAHQnyDfCADVK18fCIHQpuUr8Pytajehn9+IgNCAEJtQgAQyQMgAkGAAWogA0IAQn9CABDJAyACQUBrIANCAEL///////////8AQgAQyQMgAkHwAGogAikDgAEiAyAEIAIpA9gBIAUgBlStfCIJIAIpA+ABfCIGfCIFIAcgCFStIAIpA6gBIgsgBCAIVq18fHwiDHwiBCACKQOYASACKQOQASIIIAd8IAhUrXx8IghCm5Svw/K1qN6Gf34iB0IAQm1CABDJAyACQeAAaiAHQgBCf0IAEMkDIAJB0ABqIAdCAEL///////////8AQgAQyQMgAkEgaiACKQNgIgcgAyACKQPoASAGIAlUrXwiDSACKQPwAXwiCSACKQMwfCIKIAUgDFatIAsgBSAGVK18fHwiBnwiBSAEIAhWrSACKQOIASILIAMgBFatfHx8Igx8IgQgAikDeCAIIAIpA3AiA3wgA1StfHwiCEKblK/D8rWo3oZ/fiIDQgBCbUIAEMkDIAJBEGogA0IAQn9CABDJAyACIANCAEL///////////8AQgAQyQMCQAJAIAIpAwggAikDWCACKQNIIAIpA0AiDiACKQP4ASAJIA1UrXx8IgMgDlStfCADIAMgBiAKVK0gAikDOCAJIApWrXx8fCIJVq18IAkgCSAFIAxWrSALIAUgBlStfHx8IgNWrXwiBSACKQNQfCIGIAVUrXwgBiACKQNoIgkgAyADIAd8IgVWrXwgBSAEIAhWrSAJIAQgB1StfHx8IgkgBVStfHwiBCAGVK18IgMgAikDAHwiByADVK18IAcgAikDGCIGIAQgBCACKQMQIgN8IgVWrXwgBSAFIAYgAyADIAl8IgRWrXwgBCACKQMoIAggAikDICIDfCADVK18fCIGIARUrXx8IgRWrXx8IgggB1StfCIFQgBZBEAgBUL///////////8AUiAGQm1UciAEIAiDQn9Scg0BCyAEQgF8IgMgBkJtVK0iCX0hByAIQgF8IgogBEJ/UiADIAlUcq0iBH0hAyAFIAhCf1IgBCAKVnKtfUL///////////8AfSEFIAZCE3whBgwBCyAIIQMgBCEHCyAAIAY3AyAgACAHNwMYIAAgAzcDECAAIAU3AwhBACEBCyAAIAE6AAAgAkGwAmokAAvkCAEHfyMAQTBrIgMkAAJAIAItAAwiB0EBRgRAIAAgASkCADcCACAAQQhqIAFBCGopAgA3AgAMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQAMIgZBAWsOAgoBAAsgB0UNAQwCCyAHRQ0BCwJ/IAEoAggiBCACKAIIIgVGBEAgBEECdCEEIAEoAgRBBGshCCACKAIEQQRrIQkCQANAIARFDQEgBCAJaiEHIAQgCGogBEEEayEEKAIAIgUgBygCACIHRg0ACyAFIAdLIAUgB0lrDAILQX9BACAEGwwBCyAEIAVLIAQgBUlrC0H/AXEOAgMCAQsgA0EoaiABQQhqKAIANgIAIAMgASkCADcDICADQRRqIANBIGogAhDKASADKAIcRQRAIABBAToADCAAIAMpAhQ3AgAgAEEIaiADQRxqKAIANgIADAoLIAAgBjoADCAAIAMpAhQ3AgAgAEEIaiADQRxqKAIANgIADAkLQQIhBAJAAkACQCAGQQFrDgICAAELQQAhBAsgA0EoaiABQQhqKAIANgIAIAMgASkCADcDICADQRRqIAIgA0EgahCeASAEQQEgAygCHBshBAwFCyADQShqIAFBCGooAgA2AgAgAyABKQIANwMgIANBFGoiASACIANBIGoQngFBACECIANBADYCHCABEOUDIAMoAhwiBkUNAyADKAIYIgEgBkECdCIEakEEaygCAARAIAYhAgwECyABQQRrIQIgBkH/////A3EhAQJAA0AgBEUEQEEAIQQMAgsgAUEBayEBIAIgBGogBEEEayEEKAIARQ0ACyAGIgIgAUEBaiIESQ0ECyADIAQ2AhwgBCECDAMLIANBKGogAUEIaigCADYCACADIAEpAgA3AyAgA0EUaiADQSBqIAIQhwJBASEEAkAgBkEBRwRAIAZBASADKAIcGyEEDAELIANBADYCHCADKAIUQQRJDQAgA0EIaiADQRRqQQAQ0wMgAygCCCIBQYGAgIB4Rw0CCyAAIAMpAhQ3AgAgACAEOgAMIABBCGogA0EcaigCADYCAAwHCyAAQQhqQYDExAApAgA3AgAgAEH4w8QAKQIANwIADAQLIAEgAygCDEG0ycQAEMgEAAtBASEEIAIgAygCFEECdk8NACADIANBFGogAhDTAyADKAIAIgFBgYCAgHhGDQAgASADKAIEQbTJxAAQyAQACyAAIAMpAhQ3AgAgACAEOgAMIABBCGogA0EcaigCADYCAAwDCyACKAIIIgRBAnQhBUEAIQYgBEH/////A0sgBUH8////B0tyDQEgAigCBCEIAn8gBUUEQEEEIQJBAAwBC0HRzsUALQAAGkEEIQYgBUEEENYEIgJFDQIgBAshBiAFBEAgAiAIIAX8CgAACyAAQQIgB2s6AAwgACAENgIIIAAgAjYCBCAAIAY2AgALIAEoAgAiAEUNASABKAIEIABBAnQQ3wQMAQsgBiAFQaSDxQAQyAQACyADQTBqJAALnwoCAX8QfiMAQdABayIDJAAgASkDACEOIAEpAwghDyABKQMQIRAgASkDGCERIAEpAyAhEiABKQMoIRNBKCEBA0AgA0HwAGogASACaikDACIFQgAgE0IAEMkDIANBgAFqIAVCACASQgAQyQMgA0GQAWogBUIAIBFCABDJAyADQaABaiAFQgAgEEIAEMkDIANBsAFqIAVCACAPQgAQyQMgA0HAAWogBUIAIA5CABDJAyADQeAAaiADKQNwIgkgDXwiCkIAQgBC/f/z/8////mJfxDJAyADQdAAaiADKQNoIgVCAEKr1f7///+//7l/QgAQyQMgA0FAayAFQgBC///Piuv//9UeQgAQyQMgA0EwaiAFQgBCpOzDtY/UtJjnAEIAEMkDIANBIGogBUIAQr+llJzP8NK75ABCABDJAyADQRBqIAVCAELX2a6a5PbpjcsAQgAQyQMgAyAFQgBCms3/y6O9xIAaQgAQyQMgAykDCCAMIAMpA8ABIgx8IgUgAykDuAEgByADKQOwASIHfCILIAdUrXwgCyADKQOoASADKQOgASIHIAh8IgggB1StfCAIIAMpA5gBIAMpA5ABIgcgBnwiBiAHVK18IAYgAykDiAEgAykDgAEiByAEfCIEIAdUrXwgBCADKQN4IAkgClatfHwiCSAEVK18fCIEIAZUrXx8IgYgCFStfHwiCCALVK18fCILIAMpAwB8IgcgC1StfCAHIAcgAykDGCAIIAggAykDEHwiCFatfCAIIAggAykDKCAGIAYgAykDIHwiBlatfCAGIAYgAykDOCAEIAQgAykDMHwiBFatfCAEIAQgAykDSCADKQNAIg0gCXwiCSANVK18IAkgAykDWCAKIAMpA1AiCnwgClStfHwiDSAJVK18fCIEVq18fCIGVq18fCIIVq18fCIHVq18IAUgC1atIAMpA8gBIAUgDFStfHx8IQwgAUEIayIBQXhHDQALAkACQCAMQprN/8ujvcSAGlYNACAMQprN/8ujvcSAGlIEQCAEIQUgBiEKIAghCyAHIQkMAgsgB0LX2a6a5PbpjcsAVg0AAkAgB0LX2a6a5PbpjcsAUgRAIAQhBSAGIQogCCELIAchCQwBCyAIQr+llJzP8NK75ABWDQFC19mumuT26Y3LACEJIAhCv6WUnM/w0rvkAFIEQCAEIQUgBiEK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ADYCACAAIAFBAWo2AghBACEDIAJBGGoiBUGQksIAKAIANgIAIAJBiJLCACkCADcDECAJIAuEUEUEQEEBIQEDQCACKAIQIAFBAWtGBEAgAkEQakGck8IAEKUDCyACKAIUIANqIAk+AgAgCUL/////D1YgC0IAUiALUCALQiCGIAlCIIiEIQkgA0EEaiEDIAtCIIghCyACIAE2AhggAUEBaiEBGw0ACwsgBCAFKAIANgIAIAIgAikDEDcDACAAKAIIIgEgACgCAEYEQCAAQeirwgAQnwMLIAAoAgQgAUEMbGoiBCACKQMANwIAIARBCGogAkEIaigCADYCACAAIAFBAWo2AgggAkEgaiQADwtB1NrCAEEtQYTbwgAQ/gMAC4wKAgF/EH4jAEHAAWsiAyQAIAEpAwAhDiABKQMIIQ8gASkDECEQIAEpAxghESABKQMgIRIgASkDKCETQSghAQNAIANB4ABqIAEgAmopAwAiBUIAIBNCABDJAyADQfAAaiAFQgAgEkIAEMkDIANBgAFqIAVCACARQgAQyQMgA0GQAWogBUIAIBBCABDJAyADQaABaiAFQgAgD0IAEMkDIANBsAFqIAVCACAOQgAQyQMgA0HQAGogAykDYCIJIA18IgpC/f/z/8////mJf34iBUIAQqvV/v///7//uX9CABDJAyADQUBrIAVCAEL//8+K6///1R5CABDJAyADQTBqIAVCAEKk7MO1j9S0mOcAQgAQyQMgA0EgaiAFQgBCv6WUnM/w0rvkAEIAEMkDIANBEGogBUIAQtfZrprk9umNywBCABDJAyADIAVCAEKazf/Lo73EgBpCABDJAyADKQMIIAwgAykDsAEiDHwiBSADKQOoASAHIAMpA6ABIgd8IgsgB1StfCALIAMpA5gBIAMpA5ABIgcgCHwiCCAHVK18IAggAykDiAEgAykDgAEiByAGfCIGIAdUrXwgBiADKQN4IAMpA3AiByAEfCIEIAdUrXwgBCADKQNoIAkgClatfHwiCSAEVK18fCIEIAZUrXx8IgYgCFStfHwiCCALVK18fCILIAMpAwB8IgcgC1StfCAHIAcgAykDGCAIIAggAykDEHwiCFatfCAIIAggAykDKCAGIAYgAykDIHwiBlatfCAGIAYgAykDOCAEIAQgAykDMHwiBFatfCAEIAQgAykDSCADKQNAIg0gCXwiCSANVK18IAkgAykDWCAKIAMpA1AiCnwgClStfHwiDSAJVK18fCIEVq18fCIGVq18fCIIVq18fCIHVq18IAUgC1atIAMpA7gBIAUgDFStfHx8IQwgAUEIayIBQXhHDQALAkACQCAMQprN/8ujvcSAGlYNACAMQprN/8ujvcSAGlIEQCAEIQUgBiEKIAghCyAHIQkMAgsgB0LX2a6a5PbpjcsAVg0AAkAgB0LX2a6a5PbpjcsAUgRAIAQhBSAGIQogCCELIAchCQwBCyAIQr+llJzP8NK75ABWDQFC19mumuT26Y3LACEJIAhCv6WUnM/w0rvkAFIEQCAEIQUgBiEKIAghCwwBCyAGQqTsw7WP1LSY5wBWDQFCv6WUnM/w0rvkACELIAZCpOzDtY/UtJjnAFIEQCAEIQUgBiEKDAELIARC///Piuv//9UeVg0BQqTsw7WP1LSY5wAhCiAEQv//z4rr///VHlIEQCAEIQUMAQtC///Piuv//9UeIQUgDUKq1f7///+//7l/Vg0BC0Kazf/Lo73EgBohDAwBCyAEQv//z4rr///VHn0iCiANQqvV/v///7//uX9UrSILfSEFIAZCpOzDtY/UtJjnAH0iCSAEQv//z4rr///VHlQgCiALVHKtIgR9IQogCEK/pZScz/DSu+QAfSIOIAZCpOzDtY/UtJjnAFQgBCAJVnKtIgR9IQsgB0LX2a6a5PbpjcsAfSIGIAhCv6WUnM/w0rvkAFQgBCAOVnKtIgR9IQkgDCAHQtfZrprk9umNywBUIAQgBlZyrX1Cms3/y6O9xIAafSEMIA1C1aqBgICAwIDGAHwhDQsgACANNwMoIAAgBTcDICAAIAo3AxggACALNwMQIAAgCTcDCCAAIAw3AwAgA0HAAWokAAvoBgIKfwJ+IwBBkAZrIgQkACAEQQhqIgcgARBhIARB4ARqIARBIGopAwA3AwAgBEHYBGogBEEYaikDADcDACAEQdAEaiAEQRBqKQMANwMAIARB8ARqIARBMGopAwA3AwAgBEH4BGogBEE4aikDADcDACAEQYAFaiAEQUBrKQMANwMAIAQgBCkDCDcDyAQgBCAEKQMoNwPoBCAEQcgFaiIFIAcgARA4IARByABqIg0gBSABQUBrIggQ3AEgBEGIA2oiBiAHIAcQOCAFIAEgARCgAiAEQYgBaiILIAYgBRDcASAEQcgCaiIKIAggCBCgAiAGIAEgCxDcASAFIAogBhCRAyAEKQPYBSEOIAQpA9AFIQ8gBCgCyAVBAUcEQCAEQcACaiAEQYgGaikDADcDACAEQbgCaiAEQYAGaikDADcDACAEQbACaiAEQfgFaikDADcDACAEQagCaiAEQfAFaikDADcDACAEQaACaiAEQegFaikDADcDACAEIAQpA+AFNwOYAiAEIA43A5ACIAQgDzcDiAIgBEHIAWoiCSAEQYgCaiIMIAcQ3AEgBEGQBWogBEHQAWopAwA3AwAgBEGYBWogBEHYAWopAwA3AwAgBEGgBWogBEHgAWopAwA3AwAgBEGwBWogBEHwAWopAwA3AwAgBEG4BWogBEH4AWopAwA3AwAgBEHABWogBEGAAmopAwA3AwAgBCAEKQPIATcDiAUgBCAEKQPoATcDqAUgBSAJIAEQOCAMIAUgCBDcASAGIAkgCRA4IAUgASALEKACIAogBiAFENwBIAUgASAKENwBIAYgCSAFEDggBEGIBGogBiAIENwBIARB0ANqIARB0AJqKQMANwMAIARB2ANqIARB2AJqKQMANwMAIARB4ANqIARB4AJqKQMANwMAIARB6ANqIARB6AJqKQMANwMAIARB8ANqIARB8AJqKQMANwMAIARB+ANqIARB+AJqKQMANwMAIARBgARqIARBgANqKQMANwMAIAQgBCkDyAI3A8gDIAAgBEHIBGogDSACIAMQGSAAQZABaiAEQYgFaiAMIAIgAxAZIABBEGogBEHIA2pBgAH8CgAAIARBkAZqJAAPCyAEIA43A9AFIAQgDzcDyAVBoLHCAEErIARByAVqQaS6wgBBhLvCABDKAwAL7wgBCn8jAEEgayIDJAACQAJAAkACQAJ/AkACQAJAAkACfwJAAkACQAJ/AkACQAJAAkAgAS0ADEEBaw4CAQIACyADQRhqQbjMwgAoAgA2AgAgA0GwzMIAKQIANwMQIAINAkEEDAMLIAINAyAAQQhqQajMwgApAgA3AgAgAEGgzMIAKQIANwIADAwLIANBGGogAUEIaigCADYCACADIAEpAgA3AxACQCACRQ0AIAMoAhgiBEUEQCADKAIQRQRAIANBEGpByNDCABClAwsgAygCFEEANgIAIANBATYCGEEBIQQLIAMoAhQiASACIAEoAgAiAmoiBTYC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aiABQQhqKQIANwIAIAIoAgAiAEUNASACKAIEIABBAnQQ3wQMAQsCQAJAAkACQAJAAkACQAJAAkAgAS0ADCIIQQFrDgIAAgELIAAgAikCADcCACAAQQhqIAJBCGopAgA3AgAMBgsgB0UNAQwCCyAHRQ0BCyADQShqIAFBCGoiBigCADYCACADIAEpAgAiCzcDICADQThqIAJBCGoiCSgCADYCACADIAIpAgAiDDcDMAJ/IAunIgQgDKciB0kEQCADQcgAaiAJKAIANgIAIAMgAikCADcDQCADQRRqIANBQGsgA0EgahDKASADQSRqDAELIANByABqIAYoAgA2AgAgAyABKQIANwNAIANBFGogA0FAayADQTBqEMoBIAchBCADQTRqCyEFIAQEQCAFKAIAIARBAnQQ3wQLIAhBAUYNASADKAIcDQIgAEEBOgAMIAAgAykCFDcCACAAQQhqIANBHGooAgA2AgAMBQsCQAJAAkACfyABKAIIIgQgAigCCCIFRgRAIARBAnQhBCABKAIEQQRrIQkgAigCBEEEayEKAkADQCAERQ0BIAQgCmohBiAEIAlqIARBBGshBCgCACIFIAYoAgAiBkYNAAsgBSAGSyAFIAZJawwCC0F/QQAgBBsMAQsgBCAFSyAEIAVJawtB/wFxDgIBAgALIANByABqIAJBCGooAgA2AgAgAyACKQIANwNAIANBMGogA0FAayABEIcCIAEoAgAiAgRAIAEoAgQgAkECdBDfBAsgACADKQIwNwIAIABBCGogA0E4aigCACIBNgIAIAAgB0EBIAEbOgAMDAYLIABBCGpBgMTEACkCADcCACAAQfjDxAApAgA3AgAgAigCACIARQ0DIAIoAgQgAEECdBDfBAwDCyADQcgAaiABQQhqKAIANgIAIAMgASkCADcDQCADQTBqIANBQGsgAhCHAiACKAIAIgEEQCACKAIEIAFBAnQQ3wQLQQEhBAJAIAhBAUcEQCAIQQEgAygCOBshBAwBCyADQQA2AjggAygCMEEESQ0AIANBCGogA0EwakEAENMDIAMoAggiAUGBgICAeEcNBAsgACADKQIwNwIAIAAgBDoADCAAQQhqIANBOGooAgA2AgAMBAsgA0EANgIcIAMoAhQiAUEETwRAIAMoAhggAUECdBDfBCADQoCAgIDAADcCFAsgAEEBOgAMIAAg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CEEoaikDADcDACADQSBqIAhBIGopAwA3AwAgA0EYaiAIQRhqKQMANwMAIANBEGogCEEQaikDADcDACADQQhqIAhBCGopAwA3AwAgB0EwaiEHIAFBAWsiAQ0ACwsgBCACNgIMIAQgBTYCCCAEIAI2AgQgAkEMSQRAIARBBGogAkEMIAJrIgNBCEEwEIgDIAQoAgggBCgCDCIFQTBsaiEBIANBAk8EQCACQX9zQQxqIgJBB3EhBiADQQJrQQdPBEAgAkF4cSEHA0AgAUIANwMAIAFBKGpCADcDACABQSBqQgA3AwAgAUEYakIANwMAIAFBEGpCADcDACABQQhqQgA3AwAgAUEwakIANwMAIAFBOGpCADcDACABQUBrQgA3AwAgAUHIAGpCADcDACABQdAAakIANwMAIAFB2ABqQgA3AwAgAUHgAGpCADcDACABQegAakIANwMAIAFB8ABqQgA3AwAgAUH4AGpCADcDACABQYABakIANwMAIAFBiAFqQgA3AwAgAUG4AWpCADcDACABQbABakIANwMAIAFBqAFqQgA3AwAgAUGgAWpCADcDACABQZgBakIANwMAIAFBkAFqQgA3AwAgAUHAAWpCADcDACABQcgBakIANwMAIAFB0AFqQgA3AwAgAUHYAWpCADcDACABQeABakIANwMAIAFB6AFqQgA3AwAgAUHwAWpCADcDACABQfgBakIANwMAIAFBgAJqQgA3AwAgAUGIAmpCADcDACABQZACakIANwMAIAFBmAJqQgA3AwAgAUHIAmpCADcDACABQcACakIANwMAIAFBuAJqQgA3AwAgAUGwAmpCADcDACABQagCakIANwMAIAFBoAJqQgA3AwAgAUH4AmpCADcDACABQfACakIANwMAIAFB6AJqQgA3AwAgAUHgAmpCADcDACABQdgCakIANwMAIAFB0AJqQgA3AwAgAUGAA2ohASAHQQhrIgcNAAsLIAYEQANAIAFCADcDACABQShqQgA3AwAgAUEgakIANwMAIAFBGGpCADcDACABQRBqQgA3AwAgAUEIakIANwMAIAFBMGohASAGQQFrIgYNAAsLIAMgBWpBAWshBQsgAUIANwMAIAFBKGpCADcDACABQSBqQgA3AwAgAUEYakIANwMAIAFBEGpCADcDACABQQhqQgA3AwAgBUEBaiEGCyAAIAQpAgQ3AgAgAEEIaiAGNgIAIARBEGokAA8LQezGwgBBN0HMx8IAEP4DAAtBCCABQeiBwAAQyAQAC6kGAgp/An4jAEGQCWsiBCQAIARBCGoiByABEGUgBEGQB2ogBEEwaikDADcDACAEQYgHaiAEQShqKQMANwMAIARBgAdqIARBIGopAwA3AwAgBEH4BmogBEEYaikDADcDACAEQfAGaiAEQRBqKQMANwMAIARBoAdqIARBQGspAwA3AwAgBEGoB2ogBEHIAGopAwA3AwAgBEGwB2ogBEHQAGopAwA3AwAgBEG4B2ogBEHYAGopAwA3AwAgBEHAB2ogBEHgAGopAwA3AwAgBCAEKQMINwPoBiAEIAQpAzg3A5gHIARBqAhqIgUgByABED8gBEHoAGoiDSAFIAFB4ABqIggQjQEgBEHIBGoiBiAHIAcQPyAFIAEgARDVASAEQcgBaiILIAYgBRCNASAEQegDaiIJIAggCBDVASAGIAEgCxCNASAFIAkgBhDBAyAEKQO4CCEOIAQpA7AIIQ8gBCgCqAhBAUcEQCAEQZgDaiAEQcAIakHQAPwKAAAgBCAONwOQAyAEIA83A4gDIARBqAJqIgogBEGIA2oiDCAHEI0BIARB0AdqIARBsAJqKQMANwMAIARB2AdqIARBuAJqKQMANwMAIARB4AdqIARBwAJqKQMANwMAIARB6AdqIARByAJqKQMANwMAIARB8AdqIARB0AJqKQMANwMAIARBgAhqIARB4AJqKQMANwMAIARBiAhqIARB6AJqKQMANwMAIARBkAhqIARB8AJqKQMANwMAIARBmAhqIARB+AJqKQMANwMAIARBoAhqIARBgANqKQMANwMAIAQgBCkDqAI3A8gHIAQgBCkD2AI3A/gHIAUgCiABED8gDCAFIAgQjQEgBiAKIAoQPyAFIAEgCxDVASAJIAYgBRCNASAFIAEgCRCNASAGIAogBRA/IARBiAZqIAYgCBCNASAEQagFaiIBIAlB4AD8CgAAIAAgBEHoBmogDSACIAMQICAAQdABaiAEQcgHaiAMIAIgAxAgIABBEGogAUHAAfwKAAAgBEGQCWokAA8LIAQgDjcDsAggBCAPNwOoCEGgscIAQSsgBEGoCGpBpLrCAEGEu8IAEMoDAAu6BwECfyMAQeADayICJAAgAkEAQeAA/AsAAkACQCABIAIQpgQEQCABQeAAaiIDIAIQpgQNAQsgAkGIAWogAUEoaikDADcDACACQYABaiABQSBqKQMANwMAIAJB+ABqIAFBGGopAwA3AwAgAkHwAGogAUEQaikDADcDACACQegAaiABQQhqKQMANwMAIAJBmAFqIAFBOGopAwA3AwAgAkGgAWogAUFAaykDADcDACACQagBaiABQcgAaikDADcDACACQbABaiABQdAAaikDADcDACACQbgBaiABQdgAaikDADcDACACIAEpAwA3A2AgAiABKQMwNwOQASACQegBaiABQYgBaikDADcDACACQeABaiABQYABaikDADcDACACQdgBaiABQfgAaikDADcDACACQdABaiABQfAAaikDADcDACACQcgBaiABQegAaikDADcDACACQZgCaiABQbgBaikDADcDACACQZACaiABQbABaikDADcDACACQYgCaiABQagBaikDADcDACACQYACaiABQaABaikDADcDACACQfgBaiABQZgBaikDADcDACACIAEpA2A3A8ABIAIgASkDkAE3A/ABQQAiAUUEQCACIAJBwAFqQeAA/AoAAAsgAEHgAGogAhC0AiABDQEgACACQeAAakHgAPwKAAAMAQsgAkHIAmogAUEoaikDADcDACACQcACaiABQSBqKQMANwMAIAJBuAJqIAFBGGopAwA3AwAgAkGwAmogAUEQaikDADcDACACQagCaiABQQhqKQMANwMAIAJB2AJqIAFBOGopAwA3AwAgAkHgAmogAUFAaykDADcDACACQegCaiABQcgAaikDADcDACACQfACaiABQdAAaikDADcDACACQfgCaiABQdgAaikDADcDACACIAEpAwA3A6ACIAIgASkDMDcD0AIgAkGoA2ogA0EoaikDADcDACACQaADaiADQSBqKQMANwMAIAJBmANqIANBGGopAwA3AwAgAkGQA2ogA0EQaikDADcDACACQYgDaiADQQhqKQMANwMAIAJB2ANqIAFBuAFqKQMANwMAIAJB0ANqIAFBsAFqKQMANwMAIAJByANqIAFBqAFqKQMANwMAIAJBwANqIAFBoAFqKQMANwMAIAJBuANqIAFBmAFqKQMANwMAIAIgAykDADcDgAMgAiABKQOQATcDsANBACIBRQRAIAAgAkGgAmpB4AD8CgAACyABDQAgAEHgAGogAkGAA2pB4AD8CgAACyACQeADaiQAC6EIAgF/Cn4jAEGQAmsiAiQAIAJBsAFqIAEpAxgiBUKblK/D8rWo3oZ/fiIEQgBCbUIAEMkDIAJBoAFqIARCAEJ/QgAQyQMgAkGQAWogBEIAQv///////////wBCABDJAyACQYABaiACKQOgASIEIAEpAxB8IgcgAikDuAEgBSACKQOwASIDfCADVK18fCIFQpuUr8Pytajehn9+IgNCAEJtQgAQyQMgAkHwAGogA0IAQn9CABDJAyACIANCAEL///////////8AQgAQyQMgAkHgAGogAikDcCIDIAQgASkDCHwiBiAFIAdUrSACKQOoASIKIAQgB1atfHx8Igt8IgcgAikDiAEgBSACKQOAASIFfCAFVK18fCIFQpuUr8Pytajehn9+IghCAEJtQgAQyQMgAkHQAGogCEIAQn9CABDJAyACQRBqIAhCAEL///////////8AQgAQyQMgAkFAayACKQNQIgggAyACKQOQASIMIAEpAwB8IgkgBiALVq0gCiAEIAZWrXx8fCIEfCIGIAUgB1StIAIpA3giCiADIAdWrXx8fCILfCIHIAIpA2ggBSACKQNgIgV8IAVUrXx8IgVCm5Svw/K1qN6Gf34iA0IAQm1CABDJAyACQTBqIANCAEJ/QgAQyQMgAkEgaiADQgBC////////////AEIAEMkDAkACQCACKQMoIAIpAxggAikDCCAEIAlUrSACKQOYASAJIAxUrXx8IgkgAikDAHwiAyAJVK18IAMgBiALVq0gCiAEIAZWrXx8fCIEIANUrXwiBiACKQMQfCIDIAZUrXwgAyACKQNYIgYgBCAEIAh8IgRWrXwgBCAFIAdUrSAGIAcgCFStfHx8IgYgBFStfHwiBCADVK18IgMgAikDIHwiByADVK18IAcgAikDOCIIIAQgBCACKQMwIgN8IgRWrXwgBCAEIAggAyADIAZ8IgNWrXwgAyACKQNIIAUgAikDQCIFfCAFVK18fCIIIANUrXx8IgRWrXx8IgUgB1StfCIGQgBTDQACQCAGQv///////////wBaBEBCfyEDIAVCf1IEQCAEIQcgBSEDQv///////////wAhBgwECyAEQn9RDQEgBCEHQv///////////wAhBgwDCyAEIQcgBSEDDAILQn8hByAIQm1aDQBC////////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BEEBaw0EDAELIANBKGoiBSABQShqKQMANwMAIANBIGoiBiABQSBqKQMANwMAIANBGGoiByABQRhqKQMANwMAIANBEGoiCCABQRBqKQMANwMAIANBCGoiCSABQQhqKQMANwMAIANBOGoiCiABQThqKQMANwMAIANBQGsiCyABQUBrKQMANwMAIANByABqIgwgAUHIAGopAwA3AwAgA0HQAGoiDSABQdAAaikDADcDACADQdgAaiIOIAFB2ABqKQMANwMAIAMgASkDADcDACADIAEpAzA3AzAgBEEBcUUNAQwCCyADQYgBaiABQShqKQMANwMAIANBgAFqIAFBIGopAwA3AwAgA0H4AGogAUEYaikDADcDACADQfAAaiABQRBqKQMANwMAIANB6ABqIAFBCGopAwA3AwAgA0GYAWogAUE4aikDADcDACADQaABaiABQUBrKQMANwMAIANBqAFqIAFByABqKQMANwMAIANBsAFqIAFB0ABqKQMANwMAIANBuAFqIAFB2ABqKQMANwMAIAMgASkDADcDYCADIAEpAzA3A5ABIAAgA0HgAGpB4AD8CgAADAMLA0AgA0HgAGoiASADEF4gAyABQeAA/AoAACACQgKDIAJCAYghAlANAAsLIANB6AFqIAUpAwA3AwAgA0HgAWogBikDADcDACADQdgBaiAHKQMANwMAIANB0AFqIAgpAwA3AwAgA0HIAWogCSkDADcDACADQfgBaiAKKQMANwMAIANBgAJqIAspAwA3AwAgA0GIAmogDCkDADcDACADQZACaiANKQMANwMAIANBmAJqIA4pAwA3AwAgAyADKQMANwPAASADIAMpAzA3A/ABIAJCAVIEQANAIANB4ABqIgQgA0HAAWoiBRBeQQAiAUUEQCAFIARB4AD8CgAACwJAIAJCAoNQDQAgA0HgAGoiBCADIANBwAFqED8gAQ0AIAMgBEHgAPwKAAALIAJCBFQgAkIBiCECRQ0ACwsgACADQeAA/AoAAAwBCyAAQgA3AzAgAEEoakG4ocUAKQMANwMAIABBIGpBsKHFACkDADcDACAAQRhqQaihxQApAwA3AwAgAEEQakGgocUAKQMANwMAIABBCGpBmKHFACkDADcDACAAQZChxQApAwA3AwAgAEE4akIANwMAIABBQGtCADcDACAAQcgAakIANwMAIABB0ABq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QRBqEPkCIAMoAgxFDQEgBSADQQxqKAIANgIAIAMgAykCBDcDEEEAIQEMAgsgA0EYaiIFIAFBCGooAgA2AgAgAyABKQIANwMQIANBEGogAhDDAiADKAIUIQIgAygCECEGIAUoAgAiAQRAIABBAjoADCAAIAE2AgggACACNgIEIAAgBjYCAAwDCyAAQQhqQajMwgApAgA3AgAgAEGgzMIAKQIANwIAIAZFDQIgAiAGQQJ0EN8EDAILIAVBqMzCACgCADYCACADQaDMwgApAgA3AxBBASEBIAMoAgQiAkUNACADKAIIIAJBAnQQ3wQLIAAgAykDEDcCACAAQQA7AA0gACABOgAMIABBD2pBADoAACAAQQhqIANBGGooAgA2AgALIAhFDQEgByAIQQJ0EN8EDAELIAEoAgAiAEUNACABKAIEIABBAnQQ3wQLIANBIGokAAufBwIHfwh+IwBB0ABrIgIkACABKQM4IQwgASkDMCENIAEpAyghCSABKQMgIQ4gASkDGCEKIAEpAxAhDyABKQMIIQsgASkDACEQIAJByABqIgRB4PbAACgCADYCACACQdj2wAApAgA3A0AgCyAQhFBFBEBBASEBA0AgAigCQCABQQFrRgRAIAJBQGtB3PfAABClAwsgAigCRCADaiAQPgIAIBBC/////w9WIAtCAFIgC1AgC0IghiAQQiCIhCEQIANBBGohAyALQiCIIQsgAiABNgJIIAFBAWohARsNAAsLIAJBOGogBCgCACIBNgIAIAJBCGogATYCACACIAIpA0AiCzcDMCACIAs3AwBBACEDIARB4PbAACgCADYCACACQdj2wAApAgA3A0AgCiAPhFBFBEBBASEBA0AgAigCQCABQQFrRgRAIAJBQGtB3PfAABClAwsgAigCRCADaiAPPgIAIA9C/////w9WIApCAFIgClAgCkIghiAPQiCIhCEPIANBBGohAyAKQiCIIQogAiABNgJIIAFBAWohARsNAAsLIAJBOGoiBSACQcgAaiIEKAIAIgE2AgAgAkEUaiABNgIAIAIgAikDQCIKNwMwIAIgCjcCDEEAIQMgBEHg9sAAKAIANgIAIAJB2PbAACkCADcDQCAJIA6EUEUEQEEBIQEDQCACKAJAIAFBAWtGBEAgAkFAa0Hc98AAEKUDCyACKAJEIANqIA4+AgAgDkL/////D1YgCUIAUiAJUCAJQiCGIA5CIIiEIQ4gA0EEaiEDIAlCIIghCSACIAE2AkggAUEBaiEBGw0ACwsgBSAEKAIAIgE2AgAgAkEgaiIFIAE2AgAgAiACKQNAIgk3AzAgAiAJNwMYQQAhAyAEQeD2wAAoAgA2AgAgAkHY9sAAKQIANwNAIAwgDYRQRQRAQQEhAQNAIAIoAkAgAUEBa0YEQCACQUBrQdz3wAAQpQMLIAIoAkQgA2ogDT4CACANQv////8PViAMQgBSIAxQIAxCIIYgDUIgiIQhDSADQQRqIQMgDEIgiCEMIAIgATYCSCABQQFqIQEbDQALCyACQSxqIAJByABqKAIANgIAIAIgAikDQDcCJCAAQShqIAJBKGopAwA3AgAgAEEgaiAFKQMANwIAIABBGGogAkEYaikDADcCACAAQRBqIAJBEGopAwA3AgAgAEEIaiACQQhqKQMANwIAIAAgAikDADcCACACQdAAaiQAC9QJARB+QprN/8ujvcSAGiELIAEpAwgiAyACKQMIfCIIIANUIAggASkDECIDIAIpAxB8IgogA1QgCiABKQMYIgMgAikDGHwiBCADVCAEIAEpAyAiAyACKQMgfCIFIANUIAUgASkDKCIDIAIpAyh8IgwgA1StfCIGIAVUcq18IgcgBFRyrXwiBCAKVHKtfCIFIAhUcq0gAikDACABKQMAfHwiDiEDAkACQAJAIA5Cms3/y6O9xIAaUg0AQtfZrprk9umNywAhCyAFIgNC19mumuT26Y3LAFINAEK/pZScz/DSu+QAIQsgBCIDQr+llJzP8NK75ABSDQBCpOzDtY/UtJjnACELIAciA0Kk7MO1j9S0mOcAUg0AQv//z4rr///VHiELIAYiA0L//8+K6///1R5SDQBCq9X+////v/+5fyELIAwiA0Kr1f7///+//7l/UQ0BCyADIAtaDQAgBSEQIAQhESAHIRIgBiELDAELIAZC///Piuv//9UefSIIIAxCq9X+////v/+5f1StIgN9IQsgB0Kk7MO1j9S0mOcAfSIKIAZC///Piuv//9UeVCADIAhWcq0iA30hEiAEQr+llJzP8NK75AB9IgYgB0Kk7MO1j9S0mOcAVCADIApWcq0iA30hESAFQtfZrprk9umNywB9IgcgBEK/pZScz/DSu+QAVCADIAZWcq0iA30hECAOIAVC19mumuT26Y3LAFQgAyAHVnKtfUKazf/Lo73EgBp9IQ4gDELVqoGAgIDAgMYAfCEMC0Kazf/Lo73EgBohCSABKQM4IgMgAikDOHwiCCADVCAIIAEpA0AiAyACKQNAfCIKIANUIAogASkDSCIDIAIpA0h8IgQgA1QgBCABKQNQIgMgAikDUHwiBSADVCAFIAEpA1giAyACKQNYfCINIANUrXwiBiAFVHKtfCIHIARUcq18IgQgClRyrXwiBSAIVHKtIAIpAzAgASkDMHx8Ig8hAwJAAkACQCAPQprN/8ujvcSAGlINAELX2a6a5PbpjcsAIQkgBSIDQtfZrprk9umNywBSDQBCv6WUnM/w0rvkACEJIAQiA0K/pZScz/DSu+QAUg0AQqTsw7WP1LSY5wAhCSAHIgNCpOzDtY/UtJjnAFINAEL//8+K6///1R4hCSAGIgNC///Piuv//9UeUg0AQqvV/v///7//uX8hCSANIgNCq9X+////v/+5f1ENAQsgAyAJWg0AIAUhAyAEIQkgByEIIAYhCgwBCyAGQv//z4rr///VHn0iCCANQqvV/v///7//uX9UrSIDfSEKIAdCpOzDtY/UtJjnAH0iCSAGQv//z4rr///VHlQgAyAIVnKtIgN9IQggBEK/pZScz/DSu+QAfSIGIAdCpOzDtY/UtJjnAFQgAyAJVnKtIgN9IQkgBULX2a6a5PbpjcsAfSIHIARCv6WUnM/w0rvkAFQgAyAGVnKtIgR9IQMgDyAFQtfZrprk9umNywBUIAQgB1ZyrX1Cms3/y6O9xIAafSEPIA1C1aqBgICAwIDGAHwhDQsgACANNwNYIAAgCjcDUCAAIAg3A0ggACAJNwNAIAAgAzcDOCAAIA83AzAgACAMNwMoIAAgCzcDICAAIBI3AxggACARNwMQIAAgEDcDCCAAIA43AwALnwcBAn8jAEEQayICJAAgAkEEaiIDIAEQqgQgAiAANgIMIAMgAkEMakHYlcEAEI4DIAIgAEEBajYCDCACQQRqIAJBDGpB2JXBABCOAyACIABBAmo2AgwgAkEEaiACQQxqQdiVwQAQjgMgAiAAQQNqNgIMIAJBBGogAkEMakHYlcEAEI4DIAIgAEEEajYCDCACQQRqIAJBDGpB2JXBABCOAyACIABBBWo2AgwgAkEEaiACQQxqQdiVwQAQjgMgAiAAQQZqNgIMIAJBBGogAkEMakHYlcEAEI4DIAIgAEEHajYCDCACQQRqIAJBDGpB2JXBABCOAyACIABBCGo2AgwgAkEEaiACQQxqQdiVwQAQjgMgAiAAQQlqNgIMIAJBBGogAkEMakHYlcEAEI4DIAIgAEEKajYCDCACQQRqIAJBDGpB2JXBABCOAyACIABBC2o2AgwgAkEEaiACQQxqQdiVwQAQjgMgAiAAQQxqNgIMIAJBBGogAkEMakHYlcEAEI4DIAIgAEENajYCDCACQQRqIAJBDGpB2JXBABCOAyACIABBDmo2AgwgAkEEaiACQQxqQdiVwQAQjgMgAiAAQQ9qNgIMIAJBBGogAkEMakHYlcEAEI4DIAIgAEEQajYCDCACQQRqIAJBDGpB2JXBABCOAyACIABBEWo2AgwgAkEEaiACQQxqQdiVwQAQjgMgAiAAQRJqNgIMIAJBBGogAkEMakHYlcEAEI4DIAIgAEETajYCDCACQQRqIAJBDGpB2JXBABCOAyACIABBFGo2AgwgAkEEaiACQQxqQdiVwQAQjgMgAiAAQRVqNgIMIAJBBGogAkEMakHYlcEAEI4DIAIgAEEWajYCDCACQQRqIAJBDGpB2JXBABCOAyACIABBF2o2AgwgAkEEaiACQQxqQdiVwQAQjgMgAiAAQRhqNgIMIAJBBGogAkEMakHYlcEAEI4DIAIgAEEZajYCDCACQQRqIAJBDGpB2JXBABCOAyACIABBGmo2AgwgAkEEaiACQQxqQdiVwQAQjgMgAiAAQRtqNgIMIAJBBGogAkEMakHYlcEAEI4DIAIgAEEcajYCDCACQQRqIAJBDGpB2JXBABCOAyACIABBHWo2AgwgAkEEaiACQQxqQdiVwQAQjgMgAiAAQR5qNgIMIAJBBGogAkEMakHYlcEAEI4DIAIgAEEfajYCDCACQQRqIAJBDGpB2JXBABCOAyADEKEEIAJBEGokAAvPBgEIfwJAAkAgASAAQQNqQXxxIgMgAGsiCEkNACABIAhrIgZBBEkNACAGQQNxIQdBACEBAkAgACADRiIJDQACQCAAIANrIgVBfEsEQEEAIQMMAQtBACEDA0AgASAAIANqIgIsAABBv39KaiACQQFqLAAAQb9/SmogAkECaiwAAEG/f0pqIAJBA2osAABBv39KaiEBIANBBGoiAw0ACwsgCQ0AIAAgA2ohAgNAIAEgAiwAAEG/f0pqIQEgAkEBaiECIAVBAWoiBQ0ACwsgACAIaiEAAkAgB0UNACAAIAZBfHFqIgMsAABBv39KIQQgB0EBRg0AIAQgAywAAUG/f0pqIQQgB0ECRg0AIAQgAywAAkG/f0pqIQQLIAZBAnYhBSABIARqIQQDQCAAIQMgBUUNAkHAASAFIAVBwAFPGyIGQQNxIQcgBkECdCEIQQAhAiAFQQRPBEAgACAIQfAHcWohCSAAIQEDQCABKAIAIgBBf3NBB3YgAEEGdnJBgYKECHEgAmogAUEEaigCACIAQX9zQQd2IABBBnZyQYGChAhxaiABQQhqKAIAIgBBf3NBB3YgAEEGdnJBgYKECHFqIAFBDGooAgAiAEF/c0EHdiAAQQZ2ckGBgoQIcWohAiABQRBqIgEgCUcNAAsLIAUgBmshBSADIAhqIQAgAkEIdkH/gfwHcSACQf+B/AdxakGBgARsQRB2IARqIQQgB0UNAAsCfyADIAZB/AFxQQJ0aiIAKAIAIgFBf3NBB3YgAUEGdnJBgYKECHEiASAHQQFGDQAaIAEgACgCBCIBQX9zQQd2IAFBBnZyQYGChAhxaiIBIAdBAkYNABogACgCCCIAQX9zQQd2IABBBnZyQYGChAhxIAFqCyIBQQh2Qf+BHHEgAUH/gfwHcWpBgYAEbEEQdiAEag8LIAFFBEBBAA8LIAFBA3EhAwJAIAFBBEkEQAwBCyABQXxxIQUDQCAEIAAgAmoiASwAAEG/f0pqIAFBAWosAABBv39KaiABQQJqLAAAQb9/SmogAUEDaiwAAEG/f0pqIQQgBSACQQRqIgJHDQALCyADRQ0AIAAgAmohAQNAIAQgASwAAEG/f0pqIQQgAUEBaiEBIANBAWsiAw0ACwsgBAuhBwIBfwp+IwBBwAFrIgIkACACQbABaiABKQMYIgVCm5Svw/K1qN6Gf34iBEIAQm1CABDJAyACQaABaiAEQgBCf0IAEMkDIAJBkAFqIARCAEL///////////8AQgAQyQMgAkGAAWogAikDoAEiBCABKQMQfCIHIAIpA7gBIAUgAikDsAEiA3wgA1StfHwiBUKblK/D8rWo3oZ/fiIDQgBCbUIAEMkDIAJB8ABqIANCAEJ/QgAQyQMgAiADQgBC////////////AEIAEMkDIAJB4ABqIAIpA3AiAyAEIAEpAwh8IgYgBSAHVK0gAikDqAEiCiAEIAdWrXx8fCILfCIHIAIpA4gBIAUgAikDgAEiBXwgBVStfHwiBUKblK/D8rWo3oZ/fiIIQgBCbUIAEMkDIAJB0ABqIAhCAEJ/QgAQyQMgAkEQaiAIQgBC////////////AEIAEMkDIAJBQGsgAikDUCIIIAMgAikDkAEiDCABKQMAfCIJIAYgC1atIAogBCAGVq18fHwiBHwiBiAFIAdUrSACKQN4IgogAyAHVq18fHwiC3wiByACKQNoIAUgAikDYCIFfCAFVK18fCIFQpuUr8Pytajehn9+IgNCAEJtQgAQyQMgAkEwaiADQgBCf0IAEMkDIAJBIGogA0IAQv///////////wBCABDJAwJAAkAgAikDKCACKQMYIAIpAwggBCAJVK0gAikDmAEgCSAMVK18fCIJIAIpAwB8IgMgCVStfCADIAYgC1atIAogBCAGVq18fHwiBCADVK18IgYgAikDEHwiAyAGVK18IAMgAikDWCIGIAQgBCAIfCIEVq18IAQgBSAHVK0gBiAHIAhUrXx8fCIGIARUrXx8IgQgA1StfCIDIAIpAyB8IgcgA1StfCAHIAcgAikDOCIIIAQgBCACKQMwIgN8IgRWrXwgBCAEIAggAyADIAZ8IgNWrXwgAyACKQNIIAUgAikDQCIFfCAFVK18fCIGIANUrXx8IgRWrXx8IgdWrXwiCEIAWQRAIAhC////////////AFIgBkJtVHIgBCAHg0J/UnINAQsgBEIBfCIDIAZCbVStIgl9IQUgB0IBfCIKIARCf1IgAyAJVHKtIgR9IQMgCCAHQn9SIAQgClZyrX1C////////////AH0hCCAGQhN8IQYMAQsgByEDIAQhBQsgACAGNwMYIAAgBTcDECAAIAM3AwggACAINwMAIAJBwAFqJAAL4AsCCn4NfyMAQaABayINJAACQCABKAIMIhVBf0YEQCAAIAIpAgA3AgAgAEEIaiACQQhqKQIANwIAIAEoAgAiAEUNASABKAIEIABBMGwQ3wQMAQsgAigCDCIWQX9HBEAgASACIBUgFkgiDxsiEigCACEYIBIoAgQhFCACIAEgDxsiASgCACEXIAEoAgQhDyABKAIIIQ4CQAJAAkAgEigCCCIBBEAgAUEwbCEZIA1BBGohECANQfAAaiERQX8hEiAPIQIgFCEBA0AgESABKQIANwIAIBFBKGogAUEoaikCADcCACARQSBqIAFBIGopAgA3AgAgEUEYaiABQRhqKQIANwIAIBFBEGogAUEQaikCADcCACARQQhqIAFBCGopAgA3AgAgDUEIaiANQfQAaikCADcDACANQRBqIA1B/ABqKQIANwMAIA1BGGogDUGEAWopAgA3AwAgDUEgaiANQYwBaikCADcDACANQShqIA1BlAFqKQIANwMAIA1BMGogDUGcAWooAgA2AgAgDSANKQJsNwMAIA1BQGsgEEEIaikCADcDACANQcgAaiAQQRBqKQIANwMAIA1B0ABqIBBBGGopAgA3AwAgDUHYAGogEEEgaikCADcDACANQeAAaiAQQShqKQIANwMAIA0gECkCADcDOCAOIBJBAWoiEkYNAkKazf/Lo73EgBohBCANQThqIhMpAwgiAyACKQMIfCIGIANUIAYgEykDECIDIAIpAxB8IgogA1QgCiATKQMYIgMgAikDGHwiBSADVCAFIBMpAyAiAyACKQMgfCIHIANUIAcgEykDKCIDIAIpAyh8IgsgA1StfCIIIAdUcq18IgkgBVRyrXwiBSAKVHKtfCIHIAZUcq0gAikDACATKQMAfHwiDCEDAkACQAJAIAxCms3/y6O9xIAaUg0AQtfZrprk9umNywAhBCAHIgNC19mumuT26Y3LAFINAEK/pZScz/DSu+QAIQQgBSIDQr+llJzP8NK75ABSDQBCpOzDtY/UtJjnACEEIAkiA0Kk7MO1j9S0mOcAUg0AQv//z4rr///VHiEEIAgiA0L//8+K6///1R5SDQBCq9X+////v/+5fyEEIAsiA0Kr1f7///+//7l/UQ0BCyADIARaDQAgByEDIAUhBCAJIQYgCCEKDAELIAhC///Piuv//9UefSIGIAtCq9X+////v/+5f1StIgN9IQogCUKk7MO1j9S0mOcAfSIEIAhC///Piuv//9UeVCADIAZWcq0iA30hBiAFQr+llJzP8NK75AB9IgggCUKk7MO1j9S0mOcAVCADIARWcq0iA30hBCAHQtfZrprk9umNywB9IgkgBUK/pZScz/DSu+QAVCADIAhWcq0iBX0hAyAMIAdC19mumuT26Y3LAFQgBSAJVnKtfUKazf/Lo73EgBp9IQwgC0LVqoGAgIDAgMYAfCEL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EgshGQJAAkACQAJAIBJBAk8EQCAUQQdxIQQgDyAKa0F4TQ0BIAkhAQwCCyAJIQEgEg0CDAMLIBRBeHEhByAJIQEDQCABQgA3AwAgAUEoakIANwMAIAFBIGpCADcDACABQRhqQgA3AwAgAUEQakIANwMAIAFBCGpCADcDACABQTBqQgA3AwAgAUE4akIANwMAIAFBQGtCADcDACABQcgAakIANwMAIAFB0ABqQgA3AwAgAUHYAGpCADcDACABQeAAakIANwMAIAFB6ABqQgA3AwAgAUHwAGpCADcDACABQfgAakIANwMAIAFBgAFqQgA3AwAgAUGIAWpCADcDACABQbgBakIANwMAIAFBsAFqQgA3AwAgAUGoAWpCADcDACABQaABakIANwMAIAFBmAFqQgA3AwAgAUGQAWpCADcDACABQcABakIANwMAIAFByAFqQgA3AwAgAUHQAWpCADcDACABQdgBakIANwMAIAFB4AFqQgA3AwAgAUHoAWpCADcDACABQfABakIANwMAIAFB+AFqQgA3AwAgAUGAAmpCADcDACABQYgCakIANwMAIAFBkAJqQgA3AwAgAUGYAmpCADcDACABQcgCakIANwMAIAFBwAJqQgA3AwAgAUG4AmpCADcDACABQbACakIANwMAIAFBqAJqQgA3AwAgAUGgAmpCADcDACABQfgCakIANwMAIAFB8AJqQgA3AwAgAUHoAmpCADcDACABQeACakIANwMAIAFB2AJqQgA3AwAgAUHQAmpCADcDACABQYADaiEBIAdBCGsiBw0ACwsgBEUNAANAIAFCADcDACABQShqQgA3AwAgAUEgakIANwMAIAFBGGpCADcDACABQRBqQgA3AwAgAUEIakIANwMAIAFBMGohASAEQQFrIgQNAAsLIAFCADcDACABQShqQgA3AwAgAUEgakIANwMAIAFBGGpCADcDACABQRBqQgA3AwAgAUEIakIANwMACyAMKAIIIgEgD0sEQCADQZgCaiIEIAwoAgQgD0EwbGoiAUEIaikDADcDACADQaACaiIFIAFBEGopAwA3AwAgA0GoAmoiByABQRhqKQMANwMAIANBsAJqIgIgAUEgaikDADcDACADQbgCaiIGIAFBKGopAwA3AwAgAyABKQMANwOQAiABQfjDwgBBMBDxA0UNBCADQZADakIANwMAIANBiANqQgA3AwAgA0GAA2pCADcDACADQfgCakIANwMAIANCADcD8AIgA0IBNwOYAyADQcgDaiAGKQMANwMAIANBwANqIAIpAwA3AwAgA0G4A2ogBykDADcDACADQbADaiAFKQMANwMAIANBqANqIAQpAwA3AwAgAyADKQOQAjcDoAMgA0H4A2pBsMPCACkDADcDACADQfADakGow8IAKQMANwMAIANB6ANqQaDDwgApAwA3AwAgA0HgA2pBmMPCACkDADcDACADQdgDakGQw8IAKQMANwMAIANBiMPCACkDADcD0AMgA0GoBGpB0MTCACkDADcDACADQaAEakHIxMIAKQMANwMAIANBmARqQcDEwgApAwA3AwAgA0GQBGoiBEG4xMIAKQMANwMAIANBiARqQbDEwgApAwA3AwAgA0GoxMIAKQMANwOABCADQdgEakIANwMAIANB0ARqQgA3AwAgA0HIBGpCADcDACADQcAEaiIBQgA3AwAgA0G4BGpCADcDACADQgA3A7AEIANBoANqIANB8AJqQTAQ8QNFBEBCrarmqNvQz7yafyEfQqrHq5bZ/KPMESEqDAcLIANB0ANqIANB8AJqQTAQ8QNFBEAgASEEQgAhHwwHC0Kr1f7///+//7l/ISADQCADLQDIA0EBcUUEQANAIANBoANqEL8CIAMpA6gEIh9CAYNQRQRAIAMpA6AEIR4gAyAfQtWqgYCAgMCAxgB9IiI3A6gEIAMgHkL//8+K6///1R58IiAgHyAiVq18IiI3A6AEIAMgAykDmAQiIUKk7MO1j9S0mOcAfCIfIB4gIFYgICAiVnKtfCIgNwOYBCADIAMpA5AEIiJCv6WUnM/w0rvkAHwiHiAfICFUIB8gIFZyrXwiIDcDkAQgAyADKQOIBCIhQtfZrprk9umNywB8Ih8gHiAiVCAeICBWcq18Ih43A4gEIAMgAykDgAQgHiAfVCAfICFUcq18QprN/8ujvcSAGnw3A4AECyADQYAEahC/AiADLQDIA0EBcUUNAAsgAykD+AMhIAsgIKdBAXFFBEADQCADQdADahC/AiADKQPYBCIfQgGDUEUEQCADKQPQBCEeIAMgH0LVqoGAgIDAgMYAfSIiNwPYBCADIB5C///Piuv//9UefCIgIB8gIlatfCIiNwPQBCADIAMpA8gEIiFCpOzDtY/UtJjnAHwiHyAeICBWICAgIlZyrXwiIDcDyAQgAyADKQPABCIiQr+llJzP8NK75AB8Ih4gHyAhVCAfICBWcq18IiA3A8AEIAMgAykDuAQiIULX2a6a5PbpjcsAfCIfIB4gIlQgHiAgVnKtfCIeNwO4BCADIAMpA7AEIB4gH1QgHyAhVHKtfEKazf/Lo73EgBp8NwOwBAsgA0GwBGoQvwIgAykD+AMiIEIBg1ANAAsLIAMpA6gDIR4CQAJAIAMCfgJAAkACQAJ+IAMpA9ADIisgAykDoAMiLFIEQCADKQPgAyEiIAMpA9gDISQgKyEfICwhJyADKQOwAwwBCyADKQPgAyEiIAMpA7ADISUgHiADKQPYAyIkUgRAICQhHyAeIScgJQwBCyAiICVSBEAgHiEkICIhHyAlIScgJQwBCyADKQPoAyIfIAMpA7gDIidSBEAgHiEkICUiIgwBCyADKQPwAyIjIAMpA8ADIidSBEAgHiEkICMhHyAlIiIMAQsgICADKQPIAyInUQ0BIB4hJCAgIR8gJSIiCyEoIB8gJ1YgAykDsAQhJyADKQOABCEqIAMpA/ADISMgAykD6AMhHyADKQPIAyEhIAMpA8ADISYgAykDuAMhKUUEQCAiISUMAgsgAyAgICF9Ii03A/gDIAMgIyAmfSIlICAgIVStIiB9NwPwAyADIB8gKX0iISAjICZUICAgJVZyrSIgfTcD6AMgAyAiICh9IiMgHyApVCAgICFWcq0iH303A+ADIAMgJCAefSIgICIgKFQgHyAjVnKtIh99NwPYAyADICsgLH0gHiAkViAfICBWcq19NwPQAyADKQO4BCEkAkACQCAnICpSBEAgAykDkAQhHiADKQOIBCEfIAMpA8AEISEgJyEgICohIgwBCyADKQOQBCEeIAMpA8AEISEgAykDiAQiHyAkUgRAICQhICAfISIMAQsgHiAhUgRAICQhHyAhISAgHiEiDAELIAMpA8gEIiMgAykDmAQiIlIEQCAhIR4gJCEfICMhIAwBCyADKQPQBCIoIAMpA6AEIiJSBEAgISEeICQhHyAoISAMAQsgISEeICQhHyADKQPYBCIgISYgKCEpICMhJSAgIAMpA6gEIiJRDQELICAgIlQgAykDqAQhICADKQOgBCEoIAMpA5gEISMgAykD2AQhJiADKQPQBCEpIAMpA8gEISUNAwsgAyAmICB9NwPYBCADICkgKH0iIiAgICZWrSIgfTcD0AQgAyAlICN9IiYgKCApViAgICJWcq0iIH03A8gEIAMgISAefSIiICAgJlYgIyAlVnKtIiB9NwPABCADICQgH30iIyAgICJWIB4gIVZyrSIgfSIeNwO4BCAnICp9ICAgI1YgHyAkVnKtfQwDCyADKQOwBCEnIAMpA4AEISogHiEkICAhISAjISYgHyEpICUhKAsgAyAhICB9NwPIAyADICYgI30iIiAgICFWrSIhfTcDwAMgAyApIB99Ii0gISAiViAjICZWcq0iIn03A7gDIAMgKCAlfSIhICIgLVYgHyApVnKtIh99NwOwAyADIB4gJH0iIiAfICFWICUgKFZyrSIffTcDqAMgAyAsICt9IB4gJFQgHyAiVnKtfTcDoAMgAykDiAQhJAJAAkAgJyAqUgRAIAMpA8AEISMgAykDuAQhHiADKQOQBCEmICohHyAnISsMAQsgAykDwAQhIyADKQOQBCEmIAMpA7gEIh4gJFIEQCAkIR8gHiErDAELICMgJlIEQCAkIR4gJiEfICMhKwwBCyADKQOYBCIoIAMpA8gEIitSBEAgJiEjICQhHiAoIR8MAQsgAykDoAQiISADKQPQBCIrUgRAICYhIyAkIR4gISEfDAELICYhIyAkIR4gAykDqAQiHyEpICEhJSAoISIgHyADKQPYBCIrUQ0BCyAfICtUIAMpA9gEIR8gAykD0AQhISADKQPIBCEoIAMpA6gEISkgAykDoAQhJSADKQOYBCEiDQMLIAMgKSAffTcDqAQgAyAlICF9IisgHyApVq0iH303A6AEIAMgIiAofSIpIB8gK1YgISAlVnKtIh99NwOYBCADICYgI30iISAiIChUIB8gKVZyrSIffTcDkAQgAyAkIB59IiIgHyAhViAjICZWcq0iIX0iHzcDiAQgAyAqICd9ICEgIlYgHiAkVnKtfSIqNwOABAwDCyADQqvV/v///7//uX8gIH0iIiAmfCImNwPYBCADIClC///Piuv//9UeICh9IisgIEKr1f7///+//7l/Vq0iLH0iLnwiICAiICZWrXwiJjcD0AQgAyAlQqTsw7WP1LSY5wAgI30iKSArICxUIChC///Piuv//9UeVnKtIih9Iit8IiIgICAuVCAgICZWcq18IiU3A8gEIAMgIUK/pZScz/DSu+QAIB59IiYgKCApViAjQqTsw7WP1LSY5wBWcq0iI30iKHwiICAiICtUICIgJVZyrXwiITcDwAQgAyAkQtfZrprk9umNywAgH30iJSAjICZWIB5Cv6WUnM/w0rvkAFZyrSIjfSImfCIiICAgKFQgICAhVnKtfCIeNwO4BCAeICJUICIgJlRyrSAnICp9ICMgJVYgH0LX2a6a5PbpjcsAVnKtfXxCms3/y6O9xIAafAsiJzcDsAQgLSEgDAELIANCq9X+////v/+5fyAffSIrICl8Iik3A6gEIAMgJUL//8+K6///1R4gIX0iLCAfQqvV/v///7//uX9WrSItfSIufCIfICkgK1StfCIlNwOgBCADICJCpOzDtY/UtJjnACAofSIrICwgLVQgIUL//8+K6///1R5Wcq0iIX0iKXwiIiAfIC5UIB8gJVZyrXwiJTcDmAQgAyAmQr+llJzP8NK75AAgI30iLCAhICtWIChCpOzDtY/UtJjnAFZyrSIhfSIofCIfICIgKVQgIiAlVnKtfCIlNwOQBCADICRC19mumuT26Y3LACAefSImICEgLFYgI0K/pZScz/DSu+QAVnKtIiF9IiN8IiIgHyAoVCAfICVWcq18Ih83A4gEIAMgHyAiVCAiICNUcq0gKiAnfSAhICZWIB5C19mumuT26Y3LAFZyrX18QprN/8ujvcSAGnwiKjcDgAQLIANBoANqIANB8AJqIgVBMBDxA0UNByADQdADaiAFQTAQ8QMNAAsgASEEICchKiAeIR8MBgsgDyABQezHwgAQ2QMACyAEIAFB0MjCABDIBAALIAEgCUHogcAAEMgEAAsgA0EANgLABCADQQE2ArQEIANBuMjCADYCsAQgA0IENwK4BCADQbAEakHAyMIAEKgEAAsgA0ICNwOwBEGQycIAQSsgA0GwBGpBgMnCAEG8ycIAEMoDAAtB0c7FAC0AABpBMEEIENYEIgEEQCABQgA3AwAgDkKBgICAcDcCCCAOIAE2AgQgDkEBNgIAIAFBKGpCADcDACABQSBqQgA3AwAgAUEYakIANwMAIAFBEGpCADcDACABQQhqQgA3AwAgDiARKQIANwIQIA5BGGogEUEIaikCADcCACAERQ0CIAsgCRDfBAwCCwwFCyADQegCaiAEQRhqKQMAIh43AwAgA0HgAmogBEEQaikDACIgNwMAIANB2AJqIARBCGopAwAiIjcDACADQfgBaiAiNwMAIANBgAJqICA3AwAgA0GIAmogHjcDACADIAQpAwAiHjcD0AIgAyAfNwPoASADICo3A+ABIAMgHjcD8AEgD0F/cyEaAkADQAJAAkACQAJAAkACQAJAIAMoAtgBIgEgCksEQCAKIA9rIQIgAygC1AEgCkEwbGoiASkDACEoIAEpAwghKyABKQMQISkgASkDGCEsIAEpAyAhLSABKQMoIS5CACEfQSghAUIAISFCACEkQgAhHkIAISpCACEnA0AgA0HwAGogA0HgAWogAWopAwAiIEIAIC5CABDJAyADQYABaiAgQgAgLUIAEMkDIANBkAFqICBCACAsQgAQyQMgA0GgAWogIEIAIClCABDJAyADQbABaiAgQgAgK0IAEMkDIANBwAFqICBCACAoQgAQyQMgA0HgAGogAykDcCIlIB98IiBCAEIAQv3/8//P///5iX8QyQMgA0HQAGogAykDaCIfQgBCq9X+////v/+5f0IAEMkDIANBQGsgH0IAQv//z4rr///VHkIAEMkDIANBMGogH0IAQqTsw7WP1LSY5wBCABDJAyADQSBqIB9CAEK/pZScz/DSu+QAQgAQyQMgA0EQaiAfQgBC19mumuT26Y3LAEIAEMkDIAMgH0IAQprN/8ujvcSAGkIAEMkDIAMpAwggJyADKQPAASIvfCIiIAMpA7gBIAMpA7ABIiMgKnwiHyAjVK18IB8gHyADKQOoASADKQOgASIjIB58Ih4gI1StfCAeIB4gAykDmAEgJCADKQOQASIkfCIjICRUrXwgIyADKQOIASADKQOAASIkICF8IiEgJFStfCAhICEgAykDeCAgICVUrXx8IiRWrXx8IiEgI1StfHwiI1atfHwiHlatfHwiJSADKQMAfCImICVUrXwgJiADKQMYIB4gHiADKQMQfCInVq18ICcgJyADKQMoICMgIyADKQMgfCIeVq18IB4gHiADKQM4ICEgISADKQMwfCIjVq18ICMgIyADKQNIICQgAykDQCIffCIhIB9UrXwgISAhIAMpA1ggICADKQNQIh98IB9UrXx8Ih9WrXx8IiFWrXx8IiRWrXx8Ih5WrXx8IiogJlStfCAiICVWrSADKQPIASAiIC9UrXx8fCEnIAFBCGsiAUF4Rw0ACyAnQprN/8ujvcSAGlYNBiAnQprN/8ujvcSAGlENAQwCCyAKIAFB4MjCABDZAwALICpC19mumuT26Y3LAFYNBCAqQtfZrprk9umNywBSBEBCms3/y6O9xIAaIScMAQsgHkK/pZScz/DSu+QAVg0EQtfZrprk9umNywAhICAeQr+llJzP8NK75ABSBEBCms3/y6O9xIAaIScMAgsgJEKk7MO1j9S0mOcAVg0EQr+llJzP8NK75AAhIyAkQqTsw7WP1LSY5wBSBEBCms3/y6O9xIAaIScMAwsgIUL//8+K6///1R5WDQRCpOzDtY/UtJjnACEoICFC///Piuv//9UeUQ0DQprN/8ujvcSAGiEnICEhJgwFCyAqISALIB4hIwsgJCEoICEhJgwCC0L//8+K6///1R4hJiAfQqrV/v///7//uX9WDQBCms3/y6O9xIAaIScMAQsgIUL//8+K6///1R59IiAgH0Kr1f7///+//7l/VK0iIn0hJiAkQqTsw7WP1LSY5wB9IiMgIUL//8+K6///1R5UICAgIlRyrSIgfSEoIB5Cv6WUnM/w0rvkAH0iIiAkQqTsw7WP1LSY5wBUICAgI1ZyrSIgfSEjICpC19mumuT26Y3LAH0iISAeQr+llJzP8NK75ABUICAgIlZyrSIefSEgICcgKkLX2a6a5PbpjcsAVCAeICFWcq19QprN/8ujvcSAGn0hJyAfQtWqgYCAgMCAxgB8IR8LIAMgHzcD2AQgAyAmNwPQBCADICg3A8gEIAMgIzcDwAQgAyAgNwO4BCADICc3A7AEAkACQAJAAkACQAJAIAIgEkkEQCADQbgEaikDACEfIANBwARqKQMAIR4gA0HIBGopAwAhICADQdAEaikDACEiIANB2ARqKQMAISEgCSACQTBsaiIBIAMpA7AENwMAIAFBKGogITcDACABQSBqICI3AwAgAUEYaiAgNwMAIAFBEGogHjcDACABQQhqIB83AwAgA0GABGohByMAQTBrIgUkACAFIANBsARqIgE2AggCQAJAAkAgAUH4w8IAQTAQ8QMEQCAMKAIMIg1Bf0cEQCAMKAIIIgZBMGwhASAMKAIEIQtBCCEEIAYEQEHRzsUALQAAGiABQQgQ1gQiBEUNBAsgBUEUaiIQQQA2AgAgBSAENgIQIAUgBjYCDCAFIAEgC2o2AhwgBSALNgIYIAUgBUEIajYCICAFIAQ2AiwgBUEANgIoIAUgEDYCJCMAQdABayIBJAAgBUEkaiIEKAIEIQYgBCgCACAFQRhqIgsoAgAiEyALKAIEIhZHBEAgBCgCCCEbIAsoAgghHCAWIBNrQTBuIRZBACELA0AgEyALQTBsaiIEKQMAIScgBCkDCCEoIAQpAxAhKiAEKQMYISsgBCkDICEsIAQpAyghLSAcKAIAIR1BKCEEQgAhKUIAISRCACEhQgAhIEIAIR5CACEmA0AgAUHwAGogBCAdaikDACIfQgAgLUIAEMkDIAFBgAFqIB9CACAsQgAQyQMgAUGQAWogH0IAICtCABDJAyABQaABaiAfQgAgKkIAEMkDIAFBsAFqIB9CACAoQgAQyQMgAUHAAWogH0IAICdCABDJAyABQeAAaiABKQNwIiUgJnwiIkIAQgBC/f/z/8////mJfxDJAyABQdAAaiABKQNoIh9CAEKr1f7///+//7l/QgAQyQMgAUFAayAfQgBC///Piuv//9UeQgAQyQMgAUEwaiAfQgBCpOzDtY/UtJjnAEIAEMkDIAFBIGogH0IAQr+llJzP8NK75ABCABDJAyABQRBqIB9CAELX2a6a5PbpjcsAQgAQyQMgASAfQgBCms3/y6O9xIAaQgAQyQMgASkDCCApIAEpA8ABIi58Ih8gASkDuAEgJCABKQOwASImfCIjICZUrXwgIyABKQOoASABKQOgASIkICF8IiEgJFStfCAhIAEpA5gBIAEpA5ABIiQgIHwiICAkVK18ICAgASkDiAEgASkDgAEiJCAefCIeICRUrXwgHiABKQN4ICIgJVStfHwiJiAeVK18fCIeICBUrXx8IiAgIVStfHwiISAjVK18fCIjIAEpAwB8IiUgI1StfCAlICUgASkDGCAhICEgASkDEHwiJFatfCAkICQgASkDKCAgICAgASkDIHwiIVatfCAhICEgASkDOCAeIB4gASkDMHwiIFatfCAgICAgASkDSCAmIAEpA0AiKXwiHiApVK18IB4gASkDWCAiIAEpA1AiJnwgJlStfHwiJiAeVK18fCIeVq18fCIgVq18fCIhVq18fCIkVq18IB8gI1atIAEpA8gBIB8gLlStfHx8ISkgBEEIayIEQXhHDQALAkACQCApQprN/8ujvcSAGlYNACApQprN/8ujvcSAGlIEQCAeIR8gICEiICEhIyAkISUMAgsgJELX2a6a5PbpjcsAVg0AAkAgJELX2a6a5PbpjcsAUgRAIB4hHyAgISIgISEjICQhJQwBCyAhQr+llJzP8NK75ABWDQFC19mumuT26Y3LACElICFCv6WUnM/w0rvkAFIEQCAeIR8gICEiICEhIwwBCyAgQqTsw7WP1LSY5wBWDQFCv6WUnM/w0rvkACEjICBCpOzDtY/UtJjnAFIEQCAeIR8gICEiDAELIB5C///Piuv//9UeVg0BQqTsw7WP1LSY5wAhIiAeQv//z4rr///VHlIEQCAeIR8MAQtC///Piuv//9UeIR8gJkKq1f7///+//7l/Vg0BC0Kazf/Lo73EgBohKQwBCyAeQv//z4rr///VHn0iIiAmQqvV/v///7//uX9UrSIjfSEfICBCpOzDtY/UtJjnAH0iJSAeQv//z4rr///VHlQgIiAjVHKtIh59ISIgIUK/pZScz/DSu+QAfSInICBCpOzDtY/UtJjnAFQgHiAlVnKtIh59ISMgJELX2a6a5PbpjcsAfSIgICFCv6WUnM/w0rvkAFQgHiAnVnKtIh59ISUgKSAkQtfZrprk9umNywBUIB4gIFZyrX1Cms3/y6O9xIAafSEpICZC1aqBgICAwIDGAHwhJgsgGyAGQTBsaiIEICY3AyggBCAfNwMgIAQgIjcDGCAEICM3AxAgBCAlNwMIIAQgKTcDACAGQQFqIQYgC0EBaiILIBZHDQALCyAGNgIAIAFB0AFqJAAgB0EIaiAQKAIANgIAIAcgBSkCDDcCAAwCCwtB0c7FAC0AABpBMEEIENYEIgFFDRAgAUIANwMAIAdBATYCCCAHIAE2AgQgB0EBNgIAIAFBKGpCADcDACABQSBqQgA3AwAgAUEYakIANwMAIAFBEGpCADcDACABQQhqQgA3AwBBfyENCyAHIA02AgwgBUEwaiQADAELQQggAUG0ysIAEMgEAAsgAygCjAQiE0F/RgRAQdHOxQAtAAAaQTBBCBDWBCIBRQ0OIAFCADcDACABQShqQgA3AwAgAUEgakIANwMAIAFBGGpCADcDACABQRBqQgA3AwAgAUEIakIANwMAIANCgYCAgHA3A8gCIAMgATYCxAIgA0EBNgLAAgwGCyACrUIwfiIfpyEBQQAhBCAfQiCIpyABQfj///8HS3INAQJ/IAFFBEBBCCEFQQAMAQtB0c7FAC0AABpBCCEEIAFBCBDWBCIFRQ0CIAILIRAgAkECSQ0CIAogGmoiB0EHcSEEIAUhASAKIA9rQQJrQQdPBEAgB0F4cSEKA0AgAUIANwMAIAFBKGpCADcDACABQSBqQgA3AwAgAUEYakIANwMAIAFBEGpCADcDACABQQhqQgA3AwAgAUEwakIANwMAIAFBOGpCADcDACABQUBrQgA3AwAgAUHIAGpCADcDACABQdAAakIANwMAIAFB2ABqQgA3AwAgAUHgAGpCADcDACABQegAakIANwMAIAFB8ABqQgA3AwAgAUH4AGpCADcDACABQYABakIANwMAIAFBiAFqQgA3AwAgAUG4AWpCADcDACABQbABakIANwMAIAFBqAFqQgA3AwAgAUGgAWpCADcDACABQZgBakIANwMAIAFBkAFqQgA3AwAgAUHAAWpCADcDACABQcgBakIANwMAIAFB0AFqQgA3AwAgAUHYAWpCADcDACABQeABakIANwMAIAFB6AFqQgA3AwAgAUHwAWpCADcDACABQfgBakIANwMAIAFBgAJqQgA3AwAgAUGIAmpCADcDACABQZACakIANwMAIAFBmAJqQgA3AwAgAUHIAmpCADcDACABQcACakIANwMAIAFBuAJqQgA3AwAgAUGwAmpCADcDACABQagCakIANwMAIAFBoAJqQgA3AwAgAUH4AmpCADcDACABQfACakIANwMAIAFB6AJqQgA3AwAgAUHgAmpCADcDACABQdgCakIANwMAIAFB0AJqQgA3AwAgAUGAA2ohASAKQQhrIgoNAAsLIARFDQMDQCABQgA3AwAgAUEoakIANwMAIAFBIGpCADcDACABQRhqQgA3AwAgAUEQakIANwMAIAFBCGpCADcDACABQTBqIQEgBEEBayIEDQALDAMLIAIgEkHwyMIAENkDAAsgBCABQczJwgAQyAQACyAFIQEgAkUNAQsgAUIANwMAIAFBKGpCADcDACABQSBqQgA3AwAgAUEYakIANwMAIAFBEGpCADcDACABQQhqQgA3AwALIAMgAjYC2AMgAyAFNgLUAyADIBA2AtADIAMoAogEIgatQjB+Ih+nIQRBACEBIB9CIIinIARB+P///wdLcg0BAkAgBEUEQEEIIQsMAQsgAygChAQhFUHRzsUALQAAGkEIIQEgBEEIENYEIgtF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QgAhCkIAIQlCACELQgAhCEEAIRkjAEGABWsiGCQAAkACQAJAAkACQAJAIBwiICgCDCInQX9HBEAgKCgCCCIaQQV0IRwCQCAaQf///z9LIBxB+P///wdLcg0AICgoAgwhHiAoKAIEISwCQCAcRQRAQQghIQwBC0HRzsUALQAAGkEIIQEgHEEIENYEIiFFDQEgGkUNAEEAIQEgGiEbA0AgASAcRg0BIAEgIWoiHyABICxqIiYpAwA3AwAgH0EYaiAmQRhqKQMANwMAIB9BEGogJkEQaikDADcDACAfQQhqICZBCGopAwA3AwAgAUEgaiEBIBtBAWsiGw0ACwsgGCAaNgKIBCAYICE2AoQEIBggGjYCgAQgGCAeNgKMBCAeICdIDQUgHiAnayIrQQFqIiZBBXQhAQJAICZB////P0sgAUH4////B0tyDQACfyABRQRAQQghG0EADAELQdHOxQAtAAAaQQghGSABQQgQ1gQiG0UNASAmCyEwAkACQAJAAkAgJkECTwRAICtBB3EhGSAnIB5rQXhNDQEgGyEBDAILIBshASAmDQIMAwsgK0F4cSEcIBshAQNAIAFCADcDACABQRhqQgA3AwAgAUEQakIANwMAIAFBCGpCADcDACABQSBqQgA3AwAgAUEoakIANwMAIAFBMGpCADcDACABQThqQgA3AwAgAUFAa0IANwMAIAFByABqQgA3AwAgAUHQAGpCADcDACABQdgAakIANwMAIAFB4ABqQgA3AwAgAUHoAGpCADcDACABQfAAakIANwMAIAFB+ABqQgA3AwAgAUGYAWpCADcDACABQZABakIANwMAIAFBiAFqQgA3AwAgAUGAAWpCADcDACABQbgBakIANwMAIAFBsAFqQgA3AwAgAUGoAWpCADcDACABQaABakIANwMAIAFBwAFqQgA3AwAgAUHIAWpCADcDACABQdABakIANwMAIAFB2AFqQgA3AwAgAUHgAWpCADcDACABQegBakIANwMAIAFB8AFqQgA3AwAgAUH4AWpCADcDACABQYACaiEBIBxBCGsiHA0ACwsgGUUNAANAIAFCADcDACABQRhqQgA3AwAgAUEQakIANwMAIAFBCGpCADcDACABQSBqIQEgGUEBayIZDQALCyABQgA3AwAgAUEYakIANwMAIAFBEGpCADcDACABQQhqQgA3AwALICAo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o5A8QgAQyQMgAUGgA2ogAkIAQo2Vx8OW0trAl39CABDJAyABQZADaiACQgBC3bCFjOi2kai4f0IAEMkDIAFBgANqIAJCAEKpwMaJrs6TsjBCABDJAyABQcACaiApKQMQIgJCACADQgAQyQMgAUHQAmogAkIAIARCABDJAyABQeACaiACQgAgBUIAEMkDIAFB8AJqIAJCACAGQgAQyQMgAUGwAmogASkDoAMiDCABKQPIAyILIAEpA9ADfCIPfCIHIAEpA7gDIAggASkDsAMiAnwgAlStfHwiCCABKQPAAnwiCUKJx5mkrvCB6Yd/fiICQgBCx/rzw+2Co5A8QgAQyQMgAUGgAmogAkIAQo2Vx8OW0trAl39CABDJAyABQZACaiACQgBC3bCFjOi2kai4f0IAEMkDIAFBgAJqIAJCAEKpwMaJrs6TsjBCABDJAyABQcABaiApKQMIIgJCACADQgAQyQMgAUHQAWogAkIAIARCABDJAyABQeABaiACQgAgBUIAEMkDIAFB8AFqIAJCACAGQgAQyQMgAUGwAWogASkDyAIgCCAJVq18IhIgASkD0AJ8IgogASkD2AMgCyAPVq18IhEgASkD4AN8IgsgASkDkAN8Ig8gByAIVq0gASkDqAMgByAMVK18fHwiFXwiByABKQOgAnwiCCABKQO4AiAJIAEpA7ACIgJ8IAJUrXx8IgkgASkDwAF8IgxCiceZpK7wgemHf34iAkIAQsf688PtgqOQPEIAEMkDIAFBoAFqIAJCAEKNlcfDltLawJd/QgAQyQMgAUGQAWogAkIAQt2whYzotpGouH9CABDJAyABQYABaiACQgBCqcDGia7Ok7IwQgAQyQMgAUFAayApKQMAIgJCACADQgAQyQMgAUHQAGogAkIAIARCABDJAyABQeAAaiACQgAgBUIAEMkDIAFB8ABqIAJCACAGQgAQyQMgAUEwaiABKQPIASAJIAxWrXwiFCABKQPQAXwiAiABKQPoAyALIBFUrXwiESABKQPwA3wiBCABKQOAA3wiBSAPIBVWrSABKQOYAyALIA9WrXx8fCIGIAEpA+ACfCILIAcgClStIAEpA9gCIAogElStfHx8IgogASkDkAJ8Ig8gCCAJVq0gASkDqAIgByAIVq18fHwiEnwiByABKQOgAXwiCCABKQO4ASAMIAEpA7ABIgN8IANUrXx8IgkgASkDQHwiDEKJx5mkrvCB6Yd/fiIDQgBCx/rzw+2Co5A8QgAQyQMgAUEgaiADQgBCjZXHw5bS2sCXf0IAEMkDIAFBEGogA0IAQt2whYzotpGouH9CABDJAyABIANCAEKpwMaJrs6TsjBCABDJAwJAAkAgASkDCCABKQOIASABKQOIAiAFIAZWrSABKQOIAyAEIAVWrXx8IAEpA/gDIAQgEVStfHwiESABKQPwAnwiAyAKIAtUrSABKQPoAiAGIAtWrXx8fCIEIAEpA4ACfCIFIARUrXwgBSAFIA8gElatIAEpA5gCIAogD1atfHx8IgZWrXwgAyAEVq0gASkD+AIgAyARVK18fHwiCiABKQPwAXwiAyABKQPoASAGIAYgASkD4AF8IgRWrXwgBCACIAdWrSABKQPYASACIBRUrXx8fCICIARUrXx8IgQgASkDgAF8IgUgBFStfCAFIAEpA5gBIAIgAiABKQOQAXwiBlatfCAGIAYgCCAJVq0gASkDqAEgByAIVq18fHwiB1atfHwiAiAFVK18IAMgBFatIAEpA/gBIAMgClStfHx8IgggASkDcHwiAyABKQNoIAIgAiABKQNgfCICVq18IAIgAiABKQNYIAEpA0ggCSAMVq18IgUgASkDUHwiBCAFVK18IAQgBCAHfCIFVq18fCIEVq18fCICIAEpAwB8IgYgAlStfCAGIAYgASkDGCAEIAQgASkDEHwiB1atfCAHIAcgASkDKCAFIAUgASkDIHwiBFatfCAEIAEpAzggASkDMCIFIAx8IAVUrXx8IgogBFStfHwiBFatfHwiBVatfCACIANUrSABKQN4IAMgCFStfHx8IglCqcDGia7Ok7IwVg0AAkAgCUKpwMaJrs6TsjBRBEAgBULdsIWM6LaRqLh/Vg0CIAVC3bCFjOi2kai4f1IEQCAEIQMgBSECQqnAxomuzpOyMCEJDAQLIARCjZXHw5bS2sCXf1YNAkLdsIWM6LaRqLh/IQIgBEKNlcfDltLawJd/UQ0BIAQhA0KpwMaJrs6TsjAhCQwDCyAEIQMgBSECDAILQo2Vx8OW0trAl38hAyAKQsf688PtgqOQPFoNAEKpwMaJrs6TsjAhCQwBCyAEQvPquLzpraW/6AB8IgIgCkLH+vPD7YKjkDxUrSIGfSEDIAVCo8/685fJ7tfHAHwiByAEQo2Vx8OW0trAl39UIAIgBlRyrSIEfSECIAkgBULdsIWM6LaRqLh/VCAEIAdWcq19QqnAxomuzpOyMH0hCSAKQsf688PtgqOQPH0hCgsgGiA5aiIjIAk3AwAgI0EYaiAKNwMAICNBEGogAzcDACAjQQhqIAI3AwAgGkEgaiEaIBxBAWsiHA0ACwsgITYCACABQYAEaiQAICJBCGogLSgCADYCACAiIBkpAgw3AgAMAgsLQdHOxQAtAAAaQSBBCBDWBCIBRQ0WIAFCADcDACAiQQE2AgggIiABNgIEICJBATYCACABQRhqQgA3AwAgAUEQakIANwMAIAFBCGpCADcDAEF/ISoLICIgKjYCDCAZQTBqJAAMAQtBCCABQbTKwgAQyAQACyAYKALMBCIpQX9GBEBB0c7FAC0AABpBIEEIENYEIgFFDRQgAUIANwMAIAFBGGpCADcDACABQRBqQgA3AwAgAUEIakIANwMAIBhCgYCAgHA3A5gEIBggATYClAQgGEEBNgKQBAwFCyAlQfj///8HSwRAQQAhAQwMCwJ/ICVFBEBBCCEaQQAMAQtB0c7FAC0AABpBCCEBICVBCBDWBCIaRQ0MIB8LISMgH0ECSQ0BIB4gNmoiHEEHcSEZIBohASAeICdrQQJrQQdPBEAgHEF4cSEeA0AgAUIANwMAIAFBGGpCADcDACABQRBqQgA3AwAgAUEIakIANwMAIAFBIGpCADcDACABQShqQgA3AwAgAUEwakIANwMAIAFBOGpCADcDACABQUBrQgA3AwAgAUHIAGpCADcDACABQdAAakIANwMAIAFB2ABqQgA3AwAgAUHgAGpCADcDACABQegAakIANwMAIAFB8ABqQgA3AwAgAUH4AGpCADcDACABQZgBakIANwMAIAFBkAFqQgA3AwAgAUGIAWpCADcDACABQYABakIANwMAIAFBuAFqQgA3AwAgAUGwAWpCADcDACABQagBakIANwMAIAFBoAFqQgA3AwAgAUHAAWpCADcDACABQcgBakIANwMAIAFB0AFqQgA3AwAgAUHYAWpCADcDACABQeABakIANwMAIAFB6AFqQgA3AwAgAUHwAWpCADcDACABQfgBakIANwMAIAFBgAJqIQEgHkEIayIeDQALCyAZRQ0CA0AgAUIANwMAIAFBGGpCADcDACABQRBqQgA3AwAgAUEI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AnQQ3wQLIAJBMGokAAvxBgIUfwF+IwBBgANrIgIkAEHRzsUALQAAGkGAA0EIENYEIgMEQCADIAFBgAP8CgAAIAMpAwAhFiADQYADEN8EIAIgFjcDACACQQhqIAFBCGpBuAH8CgAAIAJBwAFqIgQgAhCFASAAQRhqIAJB2AFqIgMpAwA3AwAgAEEQaiACQdABaiIFKQMANwMAIABBCGogAkHIAWoiBikDADcDACAAIAIpA8ABNwMAIAAgAikD4AE3AyAgAEEoaiACQegBaiIHKQMANwMAIABBMGogAkHwAWoiCCkDADcDACAAQThqIAJB+AFqIgkpAwA3AwAgACACKQOAAjcDQCAAQcgAaiACQYgCaiIKKQMANwMAIABB0ABqIAJBkAJqIgspAwA3AwAgAEHYAGogAkGYAmoiDCkDADcDACAAQfgAaiACQbgCaiINKQMANwMAIABB8ABqIAJBsAJqIg4pAwA3AwAgAEHoAGogAkGoAmoiDykDADcDACAAIAIpA6ACNwNgIABBmAFqIAJB2AJqIhApAwA3AwAgAEGQAWogAkHQAmoiESkDADcDACAAQYgBaiACQcgCaiISKQMANwMAIAAgAikDwAI3A4ABIABBuAFqIAJB+AJqIhMpAwA3AwAgAEGwAWogAkHwAmoiFCkDADcDACAAQagBaiACQegCaiIVKQMANwMAIAAgAikD4AI3A6ABIAQgAUHAAWoQhQEgAEHYAWogAykDADcDACAAQdABaiAFKQMANwMAIABByAFqIAYpAwA3AwAgACACKQPAATcDwAEgACACKQPgATcD4AEgAEHoAWogBykDADcDACAAQfABaiAIKQMANwMAIABB+AFqIAkpAwA3AwAgACACKQOAAjcDgAIgAEGIAmogCikDADcDACAAQZACaiALKQMANwMAIABBmAJqIAwpAwA3AwAgAEG4AmogDSkDADcDACAAQbACaiAOKQMANwMAIABBqAJqIA8pAwA3AwAgACACKQOgAjcDoAIgAEHYAmogECkDADcDACAAQdACaiARKQMANwMAIABByAJqIBIpAwA3AwAgACACKQPAAjcDwAIgAEH4AmogEykDADcDACAAQfACaiAUKQMANwMAIABB6AJqIBUpAwA3AwAgACACKQPgAjcD4AIgAkGAA2okAA8LQQhBgANB8LXCABDIBAALuAYC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ASAIEKACIAQgAiAJEKACIAYgBSAEEDggBCAGIAMQ3AEgBiAEIAcQ3AEgBBD0AyAFIAQgDBA4IABBQGsgBiAFEKACIAUgASAKEKACIAQgAiALEKACIAYgBSAEEDggA0G4A2oiASADQThqKQMANwMAIANBsANqIgIgA0EwaikDADcDACADQagDaiIIIANBKGopAwA3AwAgA0GgA2oiCSADQSBqKQMANwMAIANBmANqIgogA0EYaikDADcDACADQZADaiILIANBEGopAwA3AwAgA0GIA2oiByADQQhqKQMANwMAIAMgAykDADcDgAMgBSAGIAQQ3AEgASADQfgAaikDADcDACACIANB8ABqKQMANwMAIAggA0HoAGopAwA3AwAgCSADQeAAaikDADcDACAKIANB2ABqKQMANwMAIAsgA0HQAGopAwA3AwAgByADQcgAaikDADcDACADIAMpA0A3A4ADIAYgBSAEEKACIAEgA0G4AWopAwA3AwAgAiADQbABaikDADcDACAIIANBqAFqKQMANwMAIAkgA0GgAWopAwA3AwAgCiADQZgBaikDADcDACALIANBkAFqKQMANwMAIAcgA0GIAWopAwA3AwAgAyADKQOAATcDgAMgAEGAAWogBiAEENwBIANBwANqJAALqAYBB38CQAJAAkACQAJAAkAgAAJ+AkACQCABKAIAIglBgICAgHhHBEAgASgCCCIEIAJNDQIgBCACayEFIAEoAgQhBiACRQ0BIAVBAnQiAUUNASAGIAYgAkECdGogAfwKAAAMAQsgAiABKAIEIgQoAggiAU8EQCABQQJ0IQIgBCgCBCEEAkAgAUUEQEEEIQMMAQtB0c7FAC0AABogAkEEENYEIgNFDQYLIAIEQCADIAQgAvwKAAALIAGtIAOtQiCGhAwDC0HRzsUALQAAGiAEKAIEIQQgASACayIFQQJ0IgFBBBDWBCIGRQ0FIAEEQCAGIAQgAkECdGogAfwKAAALIAUhCQsgA0H/AXFFDQYgBQ0CQQAhBAwHCyABKQIACzcCACAAQQA2AggPCyADQR9xIQJBACEEQQAgA2tBH3EhByAGIAVBAnRqIQEgBUEBa0H/////A3EiCkEBaiIIQQNxIQMgCkEDSQ0CIAhB/P///wdxIQoDQCABQQRrIgggBCAIKAIAIgQgAnZyNgIAIAFBCGsiCCAEIAd0IAgoAgAiBCACdnI2AgAgAUEMayIIIAQgB3QgCCgCACIEIAJ2cjYCACABQRBrIgEgBCAHdCABKAIAIgQgAnZyNgIAIAQgB3QhBCAKQQRrIgoNAAsMAgtBBCACQaSDxQAQyAQAC0EEIAFBpIPFABDIBAALIANFDQAgAUEEayEBA0AgASAEIAEoAgAiBCACdnI2AgAgAUEEayEBIAQgB3QhBCADQQFrIgMNAAsLQQAhBCAFRQ0AIAYgBUECdCIBakEEaygCAARAIAUhBAwBCyAGQQRrIQMgBUH/////A3EhAgNAIAFFDQEgAkEBayECIAEgA2ogAUEEayEBKAIARQ0ACyACQQFqIgEgBSABIAVJGyEECwJAAkAgCUECdiAETQRAIAYhAiAJIQEMAQtBACEBIAlFBEAgBiECDAELIAlBAnQhAyAERQRAQQQhAiAGIAMQ3wQMAQsgBiADQQQgBCIBQQJ0IgMQzgQiAkUNAQsgACACNgIEIAAgATYCACAAIAQ2AggPC0EEIANBiIbFABDIBAALsQYCB38DfiMAQUBqIgQkAAJAAkACQAJ/AkACQCACKAIIIgNFDQACQCADQQFrIgNB/v///wNxRQRAIANB/////wNxIgZBAWoiB0EDcSEFIAIoAgQiCCEDIAZBA08EQCAHQfz///8HcSEGA0AgCkKAAXwhCiADQRBqIQMgBkEEayIGDQALCyAFBEADQCADNQIAIAqGIAt8IQsgCkIgfCEKIANBBGohAyAFQQFrIgUNAAsLIAtCgICAgBBUDQELIARBEGogAUEIaigCADYCACAEIAEpAgA3AwggBEEgaiACQQhqKAIANgIAIAQgAikCADcDGCAEQShqIARBCGogBEEYahCcASAAQQhqIARBPGooAgA2AgAgACAEKQI0NwIAIAQoAigiAEUNBiAEKAIsIABBAnQQ3wQMBgsgC1ANACABKAIIIQMgASgCBCEGAkACQCALQoCABFoEQCADRQ0CIANB/////wNqIQcgA0ECdCEFIANB/////wNxQQFHDQEgBSAGagwFCyADRQ0BIAunIQcgBkEEayEJIANBAnQhA0EAIQUDQCAFQRB0IAMgCWooAgAiBUEQdnIgB3BBEHQgBUH//wNxciAHcCEFIANBBGsiAw0ACwwFCyAFIAZqQQhrIQMgB0H/////A3FBAWpB/v///wdxIQVCACEKA0AgAzUCACADQQRqNQIAIApCIIaEIAuCQiCGhCALgiEKIANBCGshAyAFQQJrIgUNAAsMAgsgBEEwakHcmsAAKAIANgIAIARB1JrAACkCADcDKAwECyAEQQA2AjggBEEBNgIsIARBhJzAADYCKCAEQgQ3AjAgBEEoakH0nMAAEKgEAAsgCkIghiEMIANBCGoLIQMgB0EBcQR+IAoFIAwgA0EEazUCAIQgC4ILpyEFCyAEQTBqQdyawAAoAgA2AgAgBEHUmsAAKQIANwMoIAVFDQAgBEEoakHIm8AAEKUDIAQoAiwgBTYCACAEQQE2AjALIAAgBCkDKDcCACAAQQhqIARBMGooAgA2AgAgAigCACIABEAgCCAAQQJ0EN8ECyABKAIAIgBFDQAgBiAAQQJ0EN8ECyAEQUBrJAALsQYCB38DfiMAQUBqIgQkAAJAAkACQAJ/AkACQCACKAIIIgNFDQACQCADQQFrIgNB/v///wNxRQRAIANB/////wNxIgZBAWoiB0EDcSEFIAIoAgQiCCEDIAZBA08EQCAHQfz///8HcSEGA0AgCkKAAXwhCiADQRBqIQMgBkEEayIGDQALCyAFBEADQCADNQIAIAqGIAt8IQsgCkIgfCEKIANBBGohAyAFQQFrIgUNAAsLIAtCgICAgBBUDQELIARBEGogAUEIaigCADYCACAEIAEpAgA3AwggBEEgaiACQQhqKAIANgIAIAQgAikCADcDGCAEQShqIARBCGogBEEYahCcASAAQQhqIARBPGooAgA2AgAgACAEKQI0NwIAIAQoAigiAEUNBiAEKAIsIABBAnQQ3wQMBgsgC1ANACABKAIIIQMgASgCBCEGAkACQCALQoCABFoEQCADRQ0CIANB/////wNqIQcgA0ECdCEFIANB/////wNxQQFHDQEgBSAGagwFCyADRQ0BIAunIQcgBkEEayEJIANBAnQhA0EAIQUDQCAFQRB0IAMgCWooAgAiBUEQdnIgB3BBEHQgBUH//wNxciAHcCEFIANBBGsiAw0ACwwFCyAFIAZqQQhrIQMgB0H/////A3FBAWpB/v///wdxIQVCACEKA0AgAzUCACADQQRqNQIAIApCIIaEIAuCQiCGhCALgiEKIANBCGshAyAFQQJrIgUNAAsMAgsgBEEwakGQksIAKAIANgIAIARB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ADcDACAAQRBqIAYpAwA3AwAgAEEIaiADKQMANwMAIAAgAikDEDcDACAEBEAgCCAEEN8ECyABKAIAIgAEQCAJIAAQ3wQLIAJB8AFqJAAPC0EBQQJBrIPBABDIBAALQdT+wABBKyACQegAakHo/8AAQYiSwQAQygMAC7oGAQh/IwBBMGsiAyQAIAEtAAwhCAJAAkAgAi0ADCIGQQFGBEAgASgCCCIGQQJ0IQUCQCAGQf////8DSyAFQfz///8HS3INACABKAIEIQcCfyAFRQRAQQQhAUEADAELQdHOxQAtAAAaQQQhBCAFQQQQ1gQiAUUNASAGCyEEIAUEQCABIAcgBfwKAAALIAAgCDoADCAAIAY2AgggACABNgIEIAAgBDYCAAwCCyAEIAVB+IHAABDIBAALAkACQAJAAkACQAJAIAhBAWsOAgECAAsgBg0CDAMLIAAgAikCADcCACAAQQhqIAJBCGopAgA3AgAMBQsgBg0BCwJAAkACQAJ/IAEoAggiBCACKAIIIgVGBEAgBEECdCEEIAEoAgRBBGshCSACKAIEQQRrIQoCQANAIARFDQEgBCAKaiEHIAQgCWogBEEEayEEKAIAIgUgBygCACIHRg0ACyAFIAdLIAUgB0lrDAILQX9BACAEGwwBCyAEIAVLIAQgBUlrC0H/AXEOAgACAQsgAEEIakGozMIAKQIANwIAIABBoMzCACkCADcCAAwECyADQShqIAJBCGooAgA2AgAgAyACKQIANwMgIANBCGogA0EgaiABEIcCIAAgAykCCDcCACAAQQhqIANBEGooAgAiATYCACAAIAZBASABGzoADAwECyADQShqIAJBCGooAgA2AgAgAyACKQIANwMgIANBFGogASADQSBqEJ4BQQEhBAJAIAhBAUcEQCAIQQEgAygCHBshBAwBCyADQQA2AhwgAygCFEEESQ0AIAMgA0EUakEAENMDIAMoAgAiAUGBgICAeEcNAgsgACADKQIUNwIAIAAgBDoADCAAQQhqIANBHGooAgA2AgAMAwsgA0EoaiACQQhqKAIANgIAIAMgAikCADcDICADQRRqIANBIGogARDKASADKAIcRQRAIABBAToADCAAIAMpAhQ3AgAgAEEIaiADQRxqKAIANgIADAMLIAAgCDoADCAAIAMpAhQ3AgAgAEEIaiADQRxqKAIANgIADAILIAEgAygCBEHQz8IAEMgEAAsgAigCACIARQ0AIAIoAgQgAEECdBDfBAsgA0EwaiQAC/4FAg1+AX8jAEGAAWsiDyQAIA9B8ABqIAEpAxgiA0Kx6pSR3aOCnFh+IgJCAEKv+P//b0IAEMkDIA9B4ABqIAJCAEJ/QgAQyQMgD0HQAGogDykDYCICIAEpAxB8IgQgDykDeCADIA8pA3AiBXwgBVStfHwiBUKx6pSR3aOCnFh+IgNCAEKv+P//b0IAEMkDIA9BQGsgA0IAQn9CABDJAyAPQTBqIA8pA0AiAyACIAEpAwh8IgYgBCAFVq0gDykDaCIHIAIgBFatfHx8Igl8IgggDykDWCAPKQNQIgQgBXwgBFStfHwiBUKx6pSR3aOCnFh+IgRCAEKv+P//b0IAEMkDIA9BIGogBEIAQn9CABDJAyAPQRBqIA8pAyAiBCADIAIgASkDAHwiCyAGIAlWrSAHIAIgBlatfHx8IgZ8IgkgBSAIVK0gDykDSCIMIAMgCFatfHx8Ig58IgggDykDOCAFIA8pAzAiBXwgBVStfHwiBUKx6pSR3aOCnFh+IgpCAEKv+P//b0IAEMkDIA8gCkIAQn9CABDJAyAPKQMIIgogDykDKCINIAQgDCADIAYgC1StIAcgAiALVq18fCIHfCICIAdUrXwgAiACIAkgDlatIAwgBiAJVq18fHwiAlatfCIGfCIDIAZUrXwgAyADIA0gAiACIAR8IgJWrXwgAiAFIAhUrSANIAQgCFatfHx8IgQgAlStfHwiA1atfCIHIA8pAwAiAnwiBiAHVK18IAYgCiADIAIgA3wiA1atfCADIAogAiACIAR8IgJWrXwgAiAPKQMYIA8pAxAiBCAFfCAEVK18fCIFIAJUrXx8IgQgA1StfHwiAiAGVK18IQYCQCAFQq/4//9vVARAIAIhAwwBCyACIASDIAaDQn9SBEAgAiEDDAELIAJCAXwiBiAEQn9SrSIHfSEDQgAgAkJ/UiAGIAdUcq19IQYgBEIBfCEEIAVC0YeAgBB8IQULIAAgBTcDGCAAIAQ3AxAgACADNwMIIAAgBjcDACAPQYABaiQAC4sGAQh/IwBBgAlrIgMkACADQZgGaiIFQcCDwAApAwA3AwAgA0GQBmoiBkG4g8AAKQMANwMAIANBiAZqIgdBsIPAACkDADcDACADQaAGakIANwMAIANBqAZqIghCADcDACADQbAGaiIEQgA3AwAgA0G4BmoiCUIANwMAIANByAdqQgA3AwAgA0HQB2pCADcDACADQdgHakIANwMAIANB4AdqQgA3AwAgA0HoB2pCADcDACADQfAHakIANwMAIANB+AdqQgA3AwAgA0IANwPAByADQaiDwAApAwA3A4AGIANBoAhqQgA3AwAgA0H4CGpCADcDACADQfAIakIANwMAIANB6AhqQgA3AwAgA0HgCGpCADcDACADQdgIakIANwMAIANB0AhqQgA3AwAgA0HICGpCADcDACADQbgIaiAJKQMANwMAIANBsAhqIAQpAwA3AwAgA0GoCGogCCkDADcDACADQZgIaiAFKQMANwMAIANBkAhqIAYpAwA3AwAgA0GICGogBykDADcDACADQgA3A8AIIAMgAykDgAY3A4AIIAMgASACEOsBIANBwAFqIgkgAUHAAWoiBSACQcABaiIIEOsBIANBwARqIgogASAFEKACIANBgAVqIgYgAUFAayABQYACahCgAiADQcAFaiIHIAFBgAFqIAFBwAJqEKACIANBgAZqIgQgAiAIEKACIANBwAZqIgEgAkFAayACQYACahCgAiADQYAHaiIFIAJBgAFqIAJBwAJqEKACIANBgANqIAogBBDrASAEIAkgA0HAB2oQ6wEgACADIAQQoAIgAEFAayADQUBrIAEQoAIgAEGAAWogA0GAAWogBRCgAkEAIgJFBEAgBCADQcAB/AoAAAsgA0HABGogA0GAA2ogA0GABmoiBBDcASAGIANBwANqIAEQ3AEgByADQYAEaiAFENwBIAJFBEAgBCADQcABakHAAfwKAAALIABBwAFqIANBwARqIANBgAZqENwBIABBgAJqIAYgARDcASAAQcACaiAHIAUQ3AEgA0GACWokAAuyBgEIf0EMIQYjAEEQayIEJAACQCABKAIIIgJBDE0EQAJAIAJFBEBBCCEFDAELIAEoAgQhCUEAIQFB0c7FAC0AABogAkEFdCIIIgNBCBDWBCIFRQ0CA0AgASAIRg0BIAEgBWoiAyABIAlqIgcpAwA3AwAgA0EYaiAHQRhqKQMANwMAIANBEGogB0EQaikDADcDACADQQhqIAdBCGopAwA3AwAgCCABQSBqIgFHDQALCyAEIAI2AgwgBCAFNgIIIAQgAjYCBCACQQxJBEAgBEEEaiACQQwgAmsiA0EIQSAQiAMgBCgCCCAEKAIMIgVBBXRqIQEgA0ECTwRAIAJBf3NBDGoiAkEHcSEGIANBAmtBB08EQCACQXhxIQIDQCABQgA3AwAgAUEYakIANwMAIAFBEGpCADcDACABQQhqQgA3AwAgAUEgakIANwMAIAFBKGpCADcDACABQTBqQgA3AwAgAUE4akIANwMAIAFBQGtCADcDACABQcgAakIANwMAIAFB0ABqQgA3AwAgAUHYAGpCADcDACABQeAAakIANwMAIAFB6ABqQgA3AwAgAUHwAGpCADcDACABQfgAakIANwMAIAFBmAFqQgA3AwAgAUGQAWpCADcDACABQYgBakIANwMAIAFBgAFqQgA3AwAgAUG4AWpCADcDACABQbABakIANwMAIAFBqAFqQgA3AwAgAUGgAWpCADcDACABQcABakIANwMAIAFByAFqQgA3AwAgAUHQAWpCADcDACABQdgBakIANwMAIAFB4AFqQgA3AwAgAUHoAWpCADcDACABQfABakIANwMAIAFB+AFqQgA3AwAgAUGAAmohASACQQhrIgINAAsLIAYEQANAIAFCADcDACABQRhqQgA3AwAgAUEQakIANwMAIAFBCGpCADcDACABQSBqIQEgBkEBayIGDQALCyADIAVqQQFrIQULIAFCADcDACABQRhqQgA3AwAgAUEQakIANwMAIAFBCGpCADcDACAFQQFqIQYLIAAgBCkCBDcCACAAQQhqIAY2AgAgBEEQaiQADwtB7MbCAEE3QczHwgAQ/gMAC0EIIANB6IHAABDIBAALvAYCCX8BfgJAAkACQAJAAkACQCABKAIAIgcEQAJAIAEoAgQiAyABKAIMIgRGBEAgAyECDAELIAEgA0EMaiICNgIEIAMoAgAiBUGAgICAeEcNAgsgBCACa0EMbiEDIAIgBEcEQANAIAIoAgAiBQRAIAJBBGooAgAgBUECdBDfBAsgAkEMaiECIANBAWsiAw0ACwsgASgCCCICBEAgByACQQxsEN8ECyABQQA2AgALIAEoAiAiAkUNAgJAIAEoAigiA0UEQCACIAEoAiRHDQEMBAsgAUEANgIoIAMgASgCJCIFIAJrQRhuTw0CIAIgA0EYbGohAgsgASACQRhqNgIgQQAhBUHRzsUALQAAGkEYQQQQ1gQiA0UNAyACKAIIIgdBAnQhBCAHQf////8DSyAEQfz///8HS3INBCACKAIEIQgCfyAERQRAQQQhCUEADAELQdHOxQAtAAAaQQQhBSAEQQQQ1gQiCUUNBSAHCyEFIAQEQCAJIAggBPwKAAALIAIoAhQiCEECdCEGQQAhBCAIQf////8DSyAGQfz///8HS3INBSACKAIQIQoCfyAGRQRAQQQhAkEADAELQdHOxQAtAAAaQQQhBCAGQQQQ1gQiAkUNBiAICyEEIAYEQCACIAogBvwKAAALIAMgCDYCFCADIAI2AhAgAyAENgIMIAMgBzYCCCADIAk2AgQgAyAFNgIAIAEgA0EYajYCDCABQQI2AgggASADNgIAIAEgA0EMajYCBAsgACAFNgIAIAAgAykCBDcCBA8LIAEgBTYCIAsCQAJAAkAgASgCECIEBEAgASgCFCIDIAEoAhwiBUcNASADIQIMAgsgAEGAgICAeDYCAA8LIAEgA0EMaiICNgIUIAMpAgQhCyADKAIAIgNBgICAgHhHDQELIAUgAmtBDG4hAyACIAVHBEADQCACKAIAIgUEQCACQQRqKAIAIAVBAnQQ3wQLIAJBDGohAiADQQFrIgMNAAsLIAEoAhgiAgRAIAQgAkEMbBDfBAsgAUEANgIQQYCAgIB4IQMLIAAgCzcCBCAAIAM2AgAPC0EEQRgQ/wQACyAFIARB+IHAABDIBAALIAQgBkH4gcAAEMgEAAvQBQIIfwJ+IwBBwAprIgIkACACQYAGaiIIIAEQaCACQYgJakIANwMAIAJBkAlqQgA3AwAgAkGYCWpCADcDACACQaAJakIANwMAIAJBqAlqQgA3AwAgAkGwCWpCADcDACACQbgJakIANwMAIAJBmANqIgRBwIPAACkDADcDACACQZADaiIFQbiDwAApAwA3AwAgAkGIA2oiA0Gwg8AAKQMANwMAIAJBoANqQgA3AwAgAkGoA2oiBkIANwMAIAJBsANqIgdCADcDACACQbgDaiIJQgA3AwAgAkIANwOACSACQaiDwAApAwA3A4ADIAJB4AlqQgA3AwAgAkGICmpCADcDACACQZAKakIANwMAIAJBmApqQgA3AwAgAkGgCmpCADcDACACQagKakIANwMAIAJBsApqQgA3AwAgAkG4CmpCADcDACACQfgJaiAJKQMANwMAIAJB8AlqIAcpAwA3AwAgAkHoCWogBikDADcDACACQdgJaiAEKQMANwMAIAJB0AlqIAUpAwA3AwAgAkHICWogAykDADcDACACQgA3A4AKIAIgAikDgAM3A8AJIAJBgANqIgMgAUHAAWoiBRBoIAJBwAdqIgYgAkGACWogAxDrASACQcABaiIHIAggBhDcASACQYACaiACQcAGaiACQYAIahDcASACQcACaiACQYAHaiACQcAIahDcASADIAcQYyACKQOQAyEKIAIpA4gDIQsgAAJ+IAIoAoADQQFGBEAgACAKNwMQIAAgCzcDCEIBDAELIAJBEGogBEGwAfwKAAAgAiAKNwMIIAIgCzcDACACQYADaiIEIAEgAhDrASACQYAGaiIDIAUQ8AIgAkHABmogAUGAAmoQ8AIgAkGAB2ogAUHAAmoQ8AIgAkHAB2oiASACQcAB/AoAACACQcAEaiADIAEQ6wEgAEEIaiAEQYAD/AoAAEIACzcDACACQcAKaiQAC4AGAgN/AX4jAEHAA2siAiQAIAJB2AJqQgA3AwAgAkHQAmpCADcDACACQcgCakIANwMAIAJBwAJqQgA3AwAgAkG4AmpCADcDACACQegCakGAkcUAKQMANwMAIAJB8AJqQYiRxQApAwA3AwAgAkH4AmpBkJHFACkDADcDACACQYADakGYkcUAKQMANwMAIAJBiANqQaCRxQApAwA3AwAgAkIANwOwAiACQfiQxQApAwA3A+ACIAJBuANqQgA3AwAgAkGwA2pCADcDACACQagDakIANwMAIAJBoANqQgA3AwAgAkGYA2pCADcDACACQgA3A5ADIAJBmAFqIAJBsAJqEPICIAIoApgBQQFHBEAgAkGgAWohA0EARQRAIAJBCGogA0GQAfwKAAALIAJBwAFqIAFBKGopAwA3AwAgAkG4AWogAUEgaikDADcDACACQbABaiABQRhqKQMANwMAIAJBqAFqIAFBEGopAwA3AwAgAyABQQhqKQMANwMAIAJB0AFqIAFBOGopAwA3AwAgAkHYAWogAUFAaykDADcDACACQeABaiABQcgAaikDADcDACACQegBaiABQdAAaikDADcDACACQfABaiABQdgAaikDADcDACACIAEpAwA3A5gBIAIgASkDMDcDyAEgAkGgAmogAUGIAWopAwA3AwAgAkGYAmogAUGAAWopAwA3AwAgAkGQAmogAUH4AGopAwA3AwAgAkGIAmogAUHwAGopAwA3AwAgAkGAAmogAUHoAGopAwA3AwAgAiABKQNgNwP4ASAERQRAIAJBsAJqIAJBmAFqQZAB/AoAAAtCgICEgICAwIBSIQUDQCAFQgGDUEUEQCACQZgBaiIBIAJBCGoiAyACQbACahAVIAMgAUGQAfwKAAALIAJBmAFqIgMgAkGwAmoiASABEBUgASADQZAB/AoAACAFQgJUIAVCAYghBUUNAAsgACACQQhqQZAB/AoAACACQcADaiQADwtBkI3FAEErIAJBsAJqQYCNxQBBsJLFABDKAwAL1gYBA38gAEHQAWohBQJAAkACQEGIASAALQDYAiIDayIEIAJNBEAgA0UNASAEBEAgAyAFaiABIAT8CgAACyAAIAApAwAgACkD0AGFNwMAIAAgACkDCCAAKQPYAYU3AwggACAAKQMQIAApA+ABhTcDECAAIAApAxggACkD6AGFNwMYIAAgACkDICAAKQPwAYU3AyAgACAAKQMoIAApA/gBhTcDKCAAIAApAzAgACkDgAKFNwMwIAAgACkDOCAAKQOIAoU3AzggACAAKQNAIAApA5AChTcDQCAAIAApA0ggACkDmAKFNwNIIAAgACkDUCAAKQOgAoU3A1AgACAAKQNYIAApA6gChTcDWCAAIAApA2AgACkDsAKFNwNgIAAgACkDaCAAKQO4AoU3A2ggACAAKQNwIAApA8AChTcDcCAAIAApA3ggACkDyAKFNwN4IAAgACkDgAEgACkD0AKFNwOAASAAIAAoAsgBEIIFIAIgBGshAiABIARqIQEMAQsgAgRAIAMgBWogASAC/AoAAAsgAiADaiEDDAELIAEgAkGIAW5BiAFsIgNqIQQgAiADayEDIAJBiAFPBEADQCAAIAApAwAgASkAAIU3AwAgACAAKQMIIAFBCGopAACFNwMIIAAgACkDECABQRBqKQAAhTcDECAAIAApAxggAUEYaikAAIU3AxggACAAKQMgIAFBIGopAACFNwMgIAAgACkDKCABQShqKQAAhTcDKCAAIAApAzAgAUEwaikAAIU3AzAgACAAKQM4IAFBOGopAACFNwM4IAAgACkDQCABQUBrKQAAhTcDQCAAIAApA0ggAUHIAGopAACFNwNIIAAgACkDUCABQdAAaikAAIU3A1AgACAAKQNYIAFB2ABqKQAAhTcDWCAAIAApA2AgAUHgAGopAACFNwNgIAAgACkDaCABQegAaikAAIU3A2ggACAAKQNwIAFB8ABqKQAAhTcDcCAAIAApA3ggAUH4AGopAACFNwN4IAAgACkDgAEgAUGAAWopAACFNwOAASAAIAAoAsgBEIIFIAFBiAFqIgEgBEcNAAsLIANBiQFPDQEgA0UNACAFIAQgA/wKAAAgACADOgDYAg8LIAAgAzoA2AIPCyADQYgBQaiVwgAQ5QQAC7MFAQd/IwBB0AFrIgMkAAJAAkACQCABKAIEIgUEQCABKAIIIgZFDQIgA0GJAWohByABKAIAIQQDQCABIAUgBiAFIAUgBksbIghrIgU2AgQgASAEIAhBBXRqIgk2AgAgA0GoAWogBEEYaikDADcDACADQaABaiAEQRBqKQMANwMAIANBmAFqIARBCGopAwA3AwAgAyAEKQMANwOQASAIQQFGDQQgA0HIAWogBEE4aikDADcDACADQcABaiAEQTBqKQMANwMAIANBuAFqIARBKGopAwA3AwAgAyAEKQMgNwOwASADQcgAaiADQZABaiADQbABahBDAkACQCADLQCIASIEQQJGBEAgAigCACIBQYCAgIB4RiABRXJFBEAgAigCBCABEN8ECyACIAMpA0g3AgAgAkEIaiADQdAAaigCADYCAAwBCyADQRBqIANB0ABqKQMANwMAIANBGGogA0HYAGopAwA3AwAgA0EgaiADQeAAaikDADcDACADQShqIANB6ABqKQMANwMAIANBMGogA0HwAGopAwA3AwAgA0E4aiADQfgAaikDADcDACADQUBrIANBgAFqKQMANwMAIAMgAykDSDcDCCADIAcoAAA2AgAgAyAHQQNqKAAANgADIARBA0YNAQsgACADKQMINwMAIAAgAygCADYAQSAAQcQAaiADKAADNgAAIABBOGogA0FAaykDADcDACAAQTBqIANBOGopAwA3AwAgAEEoaiADQTBqKQMANwMAIABBIGogA0EoaikDADcDACAAQRhqIANBIGopAwA3AwAgAEEQaiADQRhqKQMANwMAIABBCGogA0EQaikDADcDAAwDCyAJIQQgBQ0ACwtBAyEECyAAIAQ6AEAgA0HQAWokAA8LQQBBAEGg+sAAENkDAAtBAUEBQbD6wAAQ2QMAC7MFAQd/IwBB0AFrIgMkAAJAAkACQCABKAIEIgUEQCABKAIIIgZFDQIgA0GJAWohByABKAIAIQQDQCABIAUgBiAFIAUgBksbIghrIgU2AgQgASAEIAhBBXRqIgk2AgAgA0GoAWogBEEYaikDADcDACADQaABaiAEQRBqKQMANwMAIANBmAFqIARBCGopAwA3AwAgAyAEKQMANwOQASAIQQFGDQQgA0HIAWogBEE4aikDADcDACADQcABaiAEQTBqKQMANwMAIANBuAFqIARBKGopAwA3AwAgAyAEKQMgNwOwASADQcgAaiADQZABaiADQbABahBFAkACQCADLQCIASIEQQJGBEAgAigCACIBQYCAgIB4RiABRXJFBEAgAigCBCABEN8ECyACIAMpA0g3AgAgAkEIaiADQdAAaigCADYCAAwBCyADQRBqIANB0ABqKQMANwMAIANBGGogA0HYAGopAwA3AwAgA0EgaiADQeAAaikDADcDACADQShqIANB6ABqKQMANwMAIANBMGogA0HwAGopAwA3AwAgA0E4aiADQfgAaikDADcDACADQUBrIANBgAFqKQMANwMAIAMgAykDSDcDCCADIAcoAAA2AgAgAyAHQQNqKAAANgADIARBA0YNAQsgACADKQMINwMAIAAgAygCADYAQSAAQcQAaiADKAADNgAAIABBOGogA0FAaykDADcDACAAQTBqIANBOGopAwA3AwAgAEEoaiADQTBqKQMANwMAIABBIGogA0EoaikDADcDACAAQRhqIANBIGopAwA3AwAgAEEQaiADQRhqKQMANwMAIABBCGogA0EQaikDADcDAAwDCyAJIQQgBQ0ACwtBAyEECyAAIAQ6AEAgA0HQAWokAA8LQQBBAEGg+sAAENkDAAtBAUEBQbD6wAAQ2QMAC5QmAhF/D34jAEHQAWsiBCQAAkACQAJAIAEoAgQiCQRAIAEoAggiDEUNAiAEQYkBaiENIAEoAgAhAwNAIAEgCSAMIAkgCSAMSxsiBWsiCTYCBCABIAMgBUEFdGoiDzYCACAEQagBaiADQRhqKQMANwMAIARBoAFqIANBEGopAwA3AwAgBEGYAWogA0EIaikDADcDACAEIAMpAwA3A5ABIAVBAUYNBCAEQcgBaiADQThqKQMANwMAIARBwAFqIANBMGopAwA3AwAgBEG4AWogA0EoaikDADcDACAE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fCIWVq18IhQgGHwiGSAYIBRCAFIiCBshGAJAAkACQCAHIApyIAZyIBQgGVYiB60gFCAIG0IAUnIgByAIcSAYQoGAgIBwVnJyDQAgGEKBgICAcFINAkIAIRkgFkIAUg0AQv////8PIRQgFUL/////D1YEQCAVIRQMAgsgFUL/////D1IgF0J/UnINAgwBCyAWIRkgFSEUCyAUQv////8PfSIWIBdCf1KtIhp9IRUgGSAUQv////8PVCAWIBpUcq0iFH0hFiAYIBQgGVatfUL/////D3whGCAXQgF8IRcLIAMgFzcD0AkgAyAVNwPICSADIBY3A8AJIAMgGDcDuAkgA0HwCWoiByAFQRhqIgYpAwA3AwAgA0HoCWoiCCAFQRBqIgopAwA3AwAgA0HgCWoiECAFQQhqIhEpAwA3AwAgAyAFKQMANwPYCSADQZgJaiADQbgJaiISIANB2AlqIhMQkQEgByAGKQMANwMAIAggCikDADcDACAQIBEpAwA3AwAgAyAFKQMANwPYCSASIANB+AlqIBMQkQECQAJAIAMpA5gJIhogAykDuAl8IhUgAykDoAkiFCADKQPACXwiFiAUVCAWIBYgAykDqAkiFCADKQPICXwiGCAUVCAYIBggAykDsAkiFCADKQPQCXwiFyAUVK18IhRWcq18IhlWcq18IhggFVQgFSAaVHINAEKBgICAcCEWAkAgGCIVQoGAgIBwUg0AIBlCAFINAUL/////DyEWIBQiFUL/////D1INACAXQn9RDQFCACEVQoGAgIBwIRgMAgsgFSAWWg0AIBkhFSAUIRYMAQsgFEL/////D30iFSAXQn9SrSIafSEWIBkgFEL/////D1QgFSAaVHKtIhR9IRUgGEL+////D0L/////DyAUIBlWG3whGCAXQgF8IRcLAkACQCAYIBx8IhogFSAVIB58IhVWIBUgFiAffCIUIBZUIBQgFCAXICF8IhkgF1StfCIUVnKtfCIWIBVUcq18IhcgGlQgGCAaVnINAEKBgICAcCEYAkAgFyIVQoGAgIBwUg0AIBZCAFINAUL/////DyEYIBQiFUL/////D1INACAZQn9RDQFCACEVQoGAgIBwIRcMAgsgFSAYWg0AIBYhFSAUIRgMAQsgFEL/////D30iFSAZQn9SrSIafSEYIBYgFEL/////D1QgFSAaVHKtIhR9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CGogBUHQAGooAgA2AgAMAQsgBUEQaiAFQdAAaikDADcDACAFQRhqIAVB2ABqKQMANwMAIAVBIGogBUHgAGopAwA3AwAgBUEoaiAFQegAaikDADcDACAFQTBqIAVB8ABqKQMANwMAIAVBOGogBUH4AGopAwA3AwAgBUFAayAFQYABaikDADcDACAFIAUpA0g3AwggBSANKAAANgIAIAUgDUEDaigAADYAAyAEQQNGDQELIAAgBSkDCDcDACAAIAUoAgA2AEEgAEHEAGogBSgAAzYAACAAQThqIAVBQGspAwA3AwAgAEEwaiAFQThqKQMANwMAIABBKGogBUEwaikDADcDACAAQSBqIAVBKGopAwA3AwAgAEEYaiAFQSBqKQMANwMAIABBEGogBUEYaikDADcDACAAQQhqIAVBEGopAwA3AwAMAwsgDyEEIAoNAAsLQQMhBAsgACAEOgBAIAVB0AFqJAAPC0EAQQBBoPrAABDZAwALQQFBAUGw+sAAENkDAAv8KQIRfw9+IwBB0AFrIgQkAAJAAkACQCABKAIEIgkEQCABKAIIIgxFDQIgBEGJAWohDSABKAIAIQMDQCABIAkgDCAJIAkgDEsbIgVrIgk2AgQgASADIAVBBXRqIg82AgAgBEGoAWogA0EYaikDADcDACAEQaABaiADQRBqKQMANwMAIARBmAFqIANBCGopAwA3AwAgBCADKQMANwOQASAFQQFGDQQgBEHIAWogA0E4aikDADcDACAEQcABaiADQTBqKQMANwMAIARBuAFqIANBKGopAwA3AwAgBCADKQMgNwOwASAEQcgAaiELQQAhByMAQaALayIDJAAgA0HgBGogBEGQAWoiBUEYaikDADcDACADQdgEaiAFQRBqKQMANwMAIANB0ARqIAVBCGopAwA3AwAgA0HwBGogBEGwAWoiBkEIaikDADcDACADQfgEaiAGQRBqKQMANwMAIANBgAVqIAZBGGopAwA3AwAgA0EAOgCIBSADIAUpAwA3A8gEIAMgBikDADcD6AQgA0HoBGohDgJAAkACQAJAAkAgA0HIBGpB6NHBAEEgEPEDRQRAIA5B6NHBAEEgEPEDRQ0BCyADQbAFaiIGEFUgA0HQBWohCCADQZALaiAGQRhqKQMANwMAIANBiAtqIAZBEGopAwA3AwAgA0GAC2ogBkEIaikDADcD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AGopAwA3AwAgBEEYaiAEQdgAaikDADcDACAEQSBqIARB4ABqKQMANwMAIARBKGogBEHoAGopAwA3AwAgBEEwaiAEQfAAaikDADcDACAEQThqIARB+ABqKQMANwMAIARBQGsgBEGAAWopAwA3AwAgBCAEKQNINwMIIAQgDSgAADYCACAEIA1BA2ooAAA2AAMgA0EDRg0BCyAAIAQpAwg3AwAgACAEKAIANgBBIABBxABqIAQoAAM2AAAgAEE4aiAEQUBrKQMANwMAIABBMGogBEE4aikDADcDACAAQShqIARBMGopAwA3AwAgAEEgaiAEQShqKQMANwMAIABBGGogBEEgaikDADcDACAAQRBqIARBGGopAwA3AwAgAEEIaiAEQRBqKQMANwMADAMLIA8hAyAJDQALC0EDIQMLIAAgAzoAQCAEQdABaiQADwtBAEEAQaD6wAAQ2QMAC0EBQQFBsPrAABDZAwALjgYBAX8jAEGgBmsiAiQAAkACQAJAAkACQAJAAkAgAUH/AXFBAWsOBQECAwQFAAsgAhAhIABBCGogAkG0BGooAgA2AgAgACACKQKsBDcCAAJAIAIoAuQBIgBFDQAgACAAQQxsQRNqQXhxIgFqQQlqIgBFDQAgAigC4AEgAWsgABDfBAsgAigCkAIiAEGAgICAeEYgAEVyDQUgAigClAIgAEECdBDfBAwFCyACECYgAEEIaiACQZQGaigCADYCACAAIAIpAowGNwIAAkAgAigCBCIARQ0AIAAgAEEMbEETakF4cSIBakEJaiIARQ0AIAIoAgAgAWsgABDfBAsgAigCgAMiAEGAgICAeEYgAEVyDQQgAigChAMgAEECdBDfBAwECyACEFUgAEEIaiACQbQEaigCADYCACAAIAIpAqwENwIAAkAgAigC5AEiAEUNACAAIABBDGxBE2pBeHEiAWpBCWoiAEUNACACKALgASABayAAEN8ECyACKAKQAiIAQYCAgIB4RiAARXINAyACKAKUAiAAQQJ0EN8EDAMLIAIQPiAAQQhqIAJBtARqKAIANgIAIAAgAikCrAQ3AgACQCACKALkASIARQ0AIAAgAEEMbEETakF4cSIBakEJaiIARQ0AIAIoAuABIAFrIAAQ3wQLIAIoApACIgBBgICAgHhGIABFcg0CIAIoApQCIABBAnQQ3wQMAgsgAhBJIABB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ATYCCCAAQoGAgICwBTcCACABQSdqQa+MwQAoAAA2AAAgAUEgakGojMEAKQAANwAAIAFBGGpBoIzBACkAADcAACABQRBqQZiMwQApAAA3AAAgAUEIakGQjMEAKQAANwAAIAFBiIzBACkAADcAAAwFCwJAAkAgA0EMTwRAIAYOBwIBAQEBAQIBC0HRzsUALQAAGkEnQQEQ1gQiAUUNAyAAQSc2AgwgACABNgIIIABCgYCAgPAENwIAIAFBH2pBw43BACkAADcAACABQRhqQbyNwQApAAA3AAAgAUEQakG0jcEAKQAANwAAIAFBCGpBrI3BACkAADcAACABQaSNwQApAAA3AAAMBgtB0c7FAC0AABpBKEEBENYEIgFFDQMgAEEoNgIMIAAgATYCCCAAQoGAgICABTcCACABQSBqQZyNwQApAAA3AAAgAUEYakGUjcEAKQAANwAAIAFBEGpBjI3BACkAADcAACABQQhqQYSNwQApAAA3AAAgAUH8jMEAKQAANwAADAULAkAgBCAKTQRAIA4gATYCDCABQQVNDQEgDkEBNgIUIA5ByJrBADYCECAOQgE3AhwgDiAOQQxqrUKAgICA4AGENwMoIA4gDkEoajYCGCAOIA5BEGoQ0gIgDi0ABCEBIA4oAgAiCkGAgICAeEYNASAAIA4oAAU2AAkgAEEMaiAOQQhqKAAANgAAIAAgAToACCAAIAo2AgQgAEEBNgIADAYLQdHOxQAtAAAaQThBARDWBCIBRQ0EIABBODYCDCAAIAE2AgggAEKBgICAgAc3AgAgAUEwakH0jMEAKQAANwAAIAFBKGpB7IzBACkAADcAACABQSBqQeSMwQApAAA3AAAgAUEYakHcjMEAKQAANwAAIAFBEGpB1IzBACkAADcAACABQQhqQcyMwQApAAA3AAAgAUHEjMEAKQAANwAADAULAkACQAJAIAFB/wFxDgIBAgALIABBBGohAUHRzsUALQAAGkERQQEQ1gQiAkUEQEEBQRFBrIPBABDIBAALIAFBETYCCCABIAI2AgQgAUERNgIAIAJBEGpBw4zBAC0AADoAACACQQhqQbuMwQApAAA3AAAgAkGzjMEAKQAANwAAIABBATYCAAwGCyAAIQ1BACEKIwBB0AVrIgckAAJAAkACQCADQf///z9LIANBBXQiFEH4////B0tyDQBB0c7FAC0A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QYCAgP95cUGwgICAAnI2AghBASEGIAAoAgAiByAAKAIEIgogCyACIAMQjgQNA0EAIQEgCSAIa0H//wNxIQIDQCABQf//A3EgAk8NAiABQQFqIQEgB0EwIAooAhARAgBFDQALDAMLQQEhBiAAIAcgCyACIAMQjgQNAiAAIAQgBSAHKAIMEQMADQJBACEBIAkgCGtB//8DcSECA0AgAUH//wNxIgMgAkkhBiACIANNDQMgAUEBaiEBIAAgCiAHKAIQEQIARQ0ACwwCCyAHIAQgBSAKKAIMEQMADQEgACANNwIIQQAPC0EBIQYgACgCACIBIAAoAgQiACALIAIgAxCOBA0AIAEgBCAFIAAoAgwRAwAhBgsgBgvNBQIFfwN+IwBBIGsiBCQAAkACQAJAAn8CQAJAIAIoAggiA0UNAAJAIANBAWsiBUH+////A3FFBEAgAigCBCEDIAVB/////wNxIgZBAWoiB0EDcSEFIAZBA08EQCAHQfz///8HcSEGA0AgCEKAAXwhCCADQRBqIQMgBkEEayIGDQALCyAFBEADQCADNQIAIAiGIAl8IQkgCEIgfCEIIANBBGohAyAFQQFrIgUNAAsLIAlCgICAgBBUDQELIARBCGogASACEKEBIABBCGogBEEcaigCADYCACAAIAQpAhQ3AgAgBCgCCCIARQ0GIAQoAgwgAEECdBDfBAwGCyAJUA0AIAEoAgghAiABKAIEIQECQAJAIAlCgIAEWgRAIAJFDQIgAkH/////A2ohBiACQQJ0IQMgAkH/////A3FBAUcNASABIANqDAULIAJFDQEgCachBiABQQRrIQEgAkECdCEDQQAhBQNAIAVBEHQgASADaigCACICQRB2ciAGcEEQdCACQf//A3FyIAZwIQUgA0EEayIDDQALDAULIAEgA2pBCGshAyAGQf////8DcUEBakH+////B3EhBUIAIQgDQCADNQIAIANBBGo1AgAgCEIghoQgCYJCIIaEIAmCIQggA0EIayEDIAVBAmsiBQ0ACwwCCyAEQRBqQYyhxAAoAgA2AgAgBEGEocQAKQIANwMIDAQLIARBADYCGCAEQQE2AgwgBEGUo8QANgIIIARCBDcCECAEQQhqQYSkxAAQqAQACyAIQiCGIQogA0EIagshAyAGQQFxBH4gCAUgCiADQQRrNQIAhCAJggunIQULIARB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hCEMIAFBA2oxAAAgAUEBajEAACALIAExAABCCIaEhEIQhiABQQJqMQAAQgiGhIQhCyABQQRqIQEgAkEEayICDQALCyAHRQ0AA0AgDEIIhiALQjiIhCEMIAExAAAgC0IIhoQhCyABQQFqIQEgB0EBayIHDQALCyADQRBqIQEgAyAFQRBqIgNqIgIgCzcDACACIAw3AwggCEEBayIIDQALIAAgA0GAA/wKAAAgBSgCBCIABEAgBiAAEN8ECyAFQZADaiQADwtBAUEBEP8EAAtB1NrCAEEtQYTbwgAQ/gMAC9UFAQd/IwBB0ANrIgIkACACQeACaiIDIAEgASgCDBCpAgJAAkACQAJAAkAgAi0AwAMiBEEDRg0AIAJBgAJqIgUgA0HgAPwKAAAgAiACQcQDaigAADYAmwEgAiACKADBAzYCmAEgBEECRg0AIAJBIGogBUHgAPwKAAAgAiACKACbATYAGyACIAIoApgBNgIYAkAgASgCDCgCAEGAgICAeEcNACABKAIERQ0AIAEoAghFDQMLQdHOxQAtAAAaQaADQQgQ1gQiA0UNAyADIAJBIGpB4AD8CgAAIAMgBDoAYCADIAIoAhg2AGEgA0HkAGogAigAGzYAACACQQE2AhQgAiADNgIQIAJBBDYCDCACQYgBaiABQQhqKQIANwMAIAIgASkCADcDgAEgAkHgAmogAkGAAWogAigCjAEQqQICQCACLQDAAyIFQQNGDQBByQEhBiACQcEDaiIHQQNqIQhBASEBA0AgAkGAAmoiBCACQeACakHgAPwKAAAgAiAIKAAANgD7ASACIAcoAAA2AvgBIAVBAkYNASACQZgBaiAEQeAA/AoAACACIAIoAPsBNgCTASACIAIoAvgBNgKQASACKAIMIAFGBEACQCACKAKMASgCAEGAgICAeEcNACACKAKEAUUNACACKAKIAUUNCAsgAkEMaiABQQFBCEHoABCIAyACKAIQIQMLIAMgBmoiBEHhAGsgAkGYAWpB4AD8CgAAIARBAWsgBToAACAEIAIoApABNgAAIARBA2ogAigAkwE2AAAgAiABQQFqIgE2AhQgAkHgAmogAkGAAWogAigCjAEQqQIgBkHoAGohBiACLQDAAyIFQQNHDQALCyAAQQhqIAJBFGooAgA2AgAgACACKQIMNwIADAELIABBADYCCCAAQoCAgICAATcCAAsgAkHQA2okAA8LQbSbwgAQmgQAC0EIQaADQZCWwgAQyAQAC0G0m8IAEJoEAAvXBQEHfyMAQdAGayICJAAgAkGABWoiAyABIAEoAgwQmAECQAJAAkACQAJAIAItAMAGIgRBA0YNACACQcADaiIFIANBwAH8CgAAIAIgAkHEBmooAAA2APsBIAIgAigAwQY2AvgBIARBAkYNACACQSBqIAVBwAH8CgAAIAIgAigA+wE2ABsgAiACKAL4ATYCGAJAIAEoAgwoAgBBgICAgHhHDQAgASgCBEUNACABKAIIRQ0DC0HRzsUALQAAGkGgBkEIENYEIgNFDQMgAyACQSBqQcAB/AoAACADIAQ6AMABIAMgAigCGDYAwQEgA0HEAWogAigAGzYAACACQQE2AhQgAiADNgIQIAJBBDYCDCACQegBaiABQQhqKQIANwMAIAIgASkCADcD4AEgAkGABWogAkHgAWogAigC7AEQmAECQCACLQDABiIFQQNGDQBBiQMhBiACQcEGaiIHQQNqIQhBASEBA0AgAkHAA2oiBCACQYAFakHAAfwKAAAgAiAIKAAANgC7AyACIAcoAAA2ArgDIAVBAkYNASACQfgBaiAEQcAB/AoAACACIAIoALsDNgDzASACIAIoArgDNgLwASACKAIMIAFGBEACQCACKALsASgCAEGAgICAeEcNACACKALkAUUNACACKALoAUUNCAsgAkEMaiABQQFBCEHIARCIAyACKAIQIQMLIAMgBmoiBEHBAWsgAkH4AWpBwAH8CgAAIARBAWsgBToAACAEIAIoAvABNgAAIARBA2ogAigA8wE2AAAgAiABQQFqIgE2AhQgAkGABWogAkHgAWogAigC7AEQmAEgBkHIAWohBiACLQDABiIFQQNHDQALCyAAQQhqIAJBFGooAgA2AgAgACACKQIMNwIADAELIABBADYCCCAAQoCAgICAATcCAAsgAkHQBmokAA8LQbSbwgAQmgQAC0EIQaAGQZCWwgAQyAQAC0G0m8IAEJoEAAvXBQEHfyMAQdAJayICJAAgAkGgB2oiAyABIAEoAgwQrAECQAJAAkACQAJAIAItAMAJIgRBA0YNACACQYAFaiIFIANBoAL8CgAAIAIgAkHECWooAAA2ANsCIAIgAigAwQk2AtgCIARBAkYNACACQSBqIAVBoAL8CgAAIAIgAigA2wI2ABsgAiACKALYAjYCGAJAIAEoAgwoAgBBgICAgHhHDQAgASgCBEUNACABKAIIRQ0DC0HRzsUALQAAGkGgCUEIENYEIgNFDQMgAyACQSBqQaAC/AoAACADIAQ6AKACIAMgAigCGDYAoQIgA0GkAmogAigAGzYAACACQQE2AhQgAiADNgIQIAJBBDYCDCACQcgCaiABQQhqKQIANwMAIAIgASkCADcDwAIgAkGgB2ogAkHAAmogAigCzAIQrAECQCACLQDACSIFQQNGDQBByQQhBiACQcEJaiIHQQNqIQhBASEBA0AgAkGABWoiBCACQaAHakGgAvwKAAAgAiAIKAAANgD7BCACIAcoAAA2AvgEIAVBAkYNASACQdgCaiAEQaAC/AoAACACIAIoAPsENgDTAiACIAIoAvgENgLQAiACKAIMIAFGBEACQCACKALMAigCAEGAgICAeEcNACACKALEAkUNACACKALIAkUNCAsgAkEMaiABQQFBCEGoAhCIAyACKAIQIQMLIAMgBmoiBEGhAmsgAkHYAmpBoAL8CgAAIARBAWsgBToAACAEIAIoAtACNgAAIARBA2ogAigA0wI2AAAgAiABQQFqIgE2AhQgAkGgB2ogAkHAAmogAigCzAIQrAEgBkGoAmohBiACLQDACSIFQQNHDQALCyAAQQhqIAJBFGooAgA2AgAgACACKQIMNwIADAELIABBADYCCCAAQoCAgICAATcCAAsgAkHQCWokAA8LQbSbwgAQmgQAC0EIQaAJQZCWwgAQyAQAC0G0m8IAEJoEAAvQBQIGfwJ+AkAgAkUNACACQQdrIgNBACACIANPGyEHIAFBA2pBfHEgAWshCEEAIQMDQAJAAkACQCABIANqLQAAIgXAIgZBAE4EQCAIIANrQQNxDQEgAyAHTw0CA0AgASADaiIEQQRqKAIAIAQoAgByQYCBgoR4cQ0DIANBCGoiAyAHSQ0ACwwCC0KAgICAgCAhCkKAgICAECEJAkACQAJ+AkACQAJAAkACQAJAAkACQAJAIAVBp7rFAGotAABBAmsOAwABAgoLIANBAWoiBCACSQ0CQgAhCkIAIQkMCQtCACEKIANBAWoiBCACSQ0CQgAhCQwIC0IAIQogA0EBaiIEIAJJDQJCACEJDAcLIAEgBGosAABBv39KDQYMBwsgASAEaiwAACEEAkACQCAFQeABayIFBEAgBUENRgRADAIFDAMLAAsgBEFgcUGgf0YNBAwDCyAEQZ9/Sg0CDAMLIAZBH2pB/wFxQQxPBEAgBkF+cUFuRw0CIARBQEgNAwwCCyAEQUBIDQIMAQsgASAEaiwAACEEAkACQAJAAkAgBUHwAWsOBQEAAAACAAsgBkEPakH/AXFBAksgBEFATnINAwwCCyAEQfAAakH/AXFBME8NAgwBCyAEQY9/Sg0BCyACIANBAmoiBE0EQEIAIQkMBQsgASAEaiwAAEG/f0oNAkIAIQkgA0EDaiIEIAJPDQQgASAEaiwAAEFASA0FQoCAgICA4AAMAwtCgICAgIAgDAILQgAhCSADQQJqIgQgAk8NAiABIARqLAAAQb9/TA0DC0KAgICAgMAACyEKQoCAgIAQIQkLIAAgCiADrYQgCYQ3AgQgAEEBNgIADwsgBEEBaiEDDAILIANBAWohAwwBCyACIANNDQADQCABIANqLAAAQQBIDQEgAiADQQFqIgNHDQALDAILIAIgA0sNAAsLIAAgAjYCCCAAIAE2AgQgAEEANgIAC4EGAQV/IABBCGsiASAAQQRrKAIAIgNBeHEiAGohAgJAAkAgA0EBcQ0AIANBAnFFDQEgASgCACIDIABqIQAgASADayIBQZjSxQAoAgBGBEAgAigCBEEDcUEDRw0BQZDSxQAgADYCACACIAIoAgRBfnE2AgQgASAAQQFyNgIEIAIgADYCAA8LIAEgAxDgAgsCQAJAAkACQAJAIAIoAgQiA0ECcUUEQCACQZzSxQAoAgBGDQIgAkGY0sUAKAIARg0DIAIgA0F4cSICEOACIAEgACACaiIAQQFyNgIEIAAgAWogADYCACABQZjSxQAoAgBHDQFBkNLFACAANgIADwsgAiADQX5xNgIEIAEgAEEBcjYCBCAAIAFqIAA2AgALIABBgAJJDQIgASAAEPsCQQAhAUGw0sUAQbDSxQAoAgBBAWsiADYCACAADQRB+M/FACgCACIABEADQCABQQFqIQEgACgCCCIADQALC0Gw0sUAQf8fIAEgAUH/H00bNgIADwtBnNLFACABNgIAQZTSxQBBlNLFACgCACAAaiIANgIAIAEgAEEBcjYCBEGY0sUAKAIAIAFGBEBBkNLFAEEANgIAQZjSxQBBADYCAAsgAEGo0sUAKAIAIgNNDQNBnNLFACgCACICRQ0DQQAhAEGU0sUAKAIAIgRBKUkNAkHwz8UAIQEDQCACIAEoAgAiBU8EQCACIAUgASgCBGpJDQQLIAEoAgghAQwACwALQZjSxQAgATYCAEGQ0sUAQZDSxQAoAgAgAGoiADYCACABIABBAXI2AgQgACABaiAANgIADwsgAEH4AXFBgNDFAGohAgJ/QYjSxQAoAgAiA0EBIABBA3Z0IgBxRQRAQYjSxQAgACADcjYCACACDAELIAIoAggLIQAgAiABNgIIIAAgATYCDCABIAI2AgwgASAANgIIDwtB+M/FACgCACIBBEADQCAAQQFqIQAgASgCCCIBDQALC0Gw0sUAQf8fIAAgAEH/H00bNgIAIAMgBE8NAEGo0sUAQX82AgALC4gFAgF/CH4jAEGgAWsiAiQAIAJBMGogASkDGCIEQgBC/////w9CABDJAyACQUBrIARCAEKBgICAcEIAEMkDIAIgBCABKQMQIgN8IgUgAikDMHwiBEIAQoGAgIBwQgAQyQMgAkEQaiAEQiCGIgcgBCAFVK0gAikDOCADIAVWrXx8IgYgASkDCHwiCHwiBUIAQoGAgIBwQgAQyQMgAkEgaiAFQiCGIgkgBSAHVK0gBEIgiHwiByACKQNAIgogASkDAHwiAyAGIAhWrXwiBnwiCHwiBEIAQoGAgIBwQgAQyQMCQCACKQMoIAIpAxggAikDCCADIAZWrSACKQNIIAMgClStfHwiBiACKQMAfCIDIAZUrXwgAyAHIAhWrXwiByADVK18IgYgAikDEHwiAyAGVK18IAMgAyAEIAlUrSAFQiCIfCIFIAd8IgcgBVStfCIDVq18IgYgAikDIHwiBSAGVK18IAUgAyAEQiCGIgMgB3wiBiADVK0gBEIgiHwiA3wiBCADVK18IgMgBVStfCIIQoGAgIBwVARAIAQhBSADIQcMAQsCQCAEQv////8PVg0AQgAhByADQgBSDQBC/////w8hBSAEQv////8PVARAIAQhBUKBgICAcCEIDAILIAZCf1ENAEKBgICAcCEIDAELIARC/////w99IgcgBkJ/Uq0iCX0hBSADIARC/////w9UIAcgCVRyrSIEfSEHIAggAyAEVK19Qv////8PfCEIIAZCAXwhBgsgAiAGNwNoIAIgBTcDYCACIAc3A1ggAiAINwNQIAIgAkHwAGoiATYCnAEgAkEANgKEASACQQA2AnAgAiACQdAAajYCmAEgACABEK0CIAJBoAFqJAAL4gQBBn8CQAJAIAAoAggiB0GAgIDAAXFFDQACQAJAIAdBgICAgAFxRQRAIAJBEEkNASABIAIQ1wEhAwwCCwJAAkAgAC8BDiIDRQRAQQAhAgwBCyABIAJqIQhBACECIAMhBSABIQQDQCAEIgYgCEYNAgJ/IAZBAWogBiwAACIEQQBODQAaIAZBAmogBEFgSQ0AGiAGQQNqIARBcEkNABogBkEEagsiBCAGayACaiECIAVBAWsiBQ0ACwtBACEFCyADIAVrIQMMAQsgAkUEQEEAIQIMAQsgAkEDcSEGAkAgAkEESQRADAELIAJBDHEhCANAIAMgASAFaiIELAAAQb9/SmogBEEBaiwAAEG/f0pqIARBAmosAABBv39KaiAEQQNqLAAAQb9/SmohAyAIIAVBBGoiBUcNAAsLIAZFDQAgASAFaiEEA0AgAyAELAAAQb9/SmohAyAEQQFqIQQgBkEBayIGDQALCyADIAAvAQwiBE8NACAEIANrIQZBACEDQQAhBQJAAkACQCAHQR12QQNxQQFrDgIAAQILIAYhBQwBCyAGQf7/A3FBAXYhBQsgB0H///8AcSEIIAAoAgQhByAAKAIAIQADQCADQf//A3EgBUH//wNxSQRAQQEhBCADQQFqIQMgACAIIAcoAhARAgBFDQEMAwsLQQEhBCAAIAEgAiAHKAIMEQMADQFBACEDIAYgBWtB//8DcSEBA0AgA0H//wNxIgIgAUkhBCABIAJNDQIgA0EBaiEDIAAgCCAHKAIQEQIARQ0ACwwBCyAAKAIAIAEgAiAAKAIEKAIMEQMAIQQLIAQLkgUCCX8BfiMAQSBrIgQkACABKAIEIQIgASgCDCEGIAEoAhAhBQJAA0ACQCACIAZHBEAgASACQQRqIgM2AgQgBEEUaiACKAIAEOwCIAQpAhghCyAEKAIUIgdBgICAgHhHDQEgC6chBwJAIAUoAgBFDQAgBSgCBCIDQYQBSQ0AIAMQqwMLIAUgBzYCBCAFQQE2AgAgAkEEaiECCyAAQQA2AgggAEKAgICAwAA3AgAgAiAGRwRAIAYgAmtBAnYhAwNAIAIoAgAiAEGEAU8EQCAAEKsDCyACQQRqIQIgA0EBayIDDQALCyABKAIIIgBFDQIgASgCACAAQQJ0EN8EDAILIAMhAiAHQYGAgIB4Rg0AC0HRzsUALQAAGkEwQQQQ1gQiAgRAIAIgCzcCBCACIAc2AgAgBEEBNgIQIAQgAjYCDCAEQQQ2AgggASgCCCEIIAEoAgAhCkEBIQEDQAJAIAMgBkcEQCAEQRRqIAMoAgAQ7AIgBCkCGCELIAQoAhQiCUGAgICAeEcNASALpyECAkAgBSgCAEUNACAFKAIEIgFBhAFJDQAgARCrAwsgBSACNgIEIAVBATYCACADQQRqIQMLIAMgBkcEQCAGIANrQQJ2IQIDQCADKAIAIgFBhAFPBEAgARCrAwsgA0EEaiEDIAJBAWsiAg0ACwsgCARAIAogCEECdBDfBAsgACAEKQIINwIAIABBCGogBEEQaigCADYCAAwDCyADQQRqIQMgCUGBgICAeEYNACAEKAIIIAFGBEAgBEEIaiABQQFBBEEMEIgDIAQoAgwhAgsgAiABQQxsaiIHIAs3AgQgByAJNgIAIAQgAUEBaiIBNgIQDAALAAtBBEEwQfCAwAAQyAQACyAEQSBqJAALiwUBB38jAEEgayIDJABBASEJQQEhBgJAIAEtAAwiBUEBRg0AAkACQAJAAkAgAi0ADCIGQQFrDgIEAQALIAUNAQwCCyAFDQELQQAhCUEAIQYMAQtBAiEGQQAhCQsCQAJAAkACQCABKAIIIgUEQCACKAIIIgQNAQsgA0EQakG4zMIAKAIANgIAIANBsMzCACkCADcDCAwBCyACKAIEIQcgASgCBCEIIARBAUYEQEEAIQEgBUH/////A0sgBUECdCIEQfz///8HS3INAiAHKAIAIQcCfyAERQRAQQQhAkEADAELQdHOxQAtAAAaQQQhASAEQQQQ1gQiAkUNAyAFCyEBIAQEQCACIAggBPwKAAALIANBHGoiBCAFNgIAIAMgAjYCGCADIAE2AhQgA0EUaiAHELMCIANBEGogBCgCADYCACADIAMpAhQ3AwgMAQsgBUEBRgRAQQAhASAEQf////8DSyAEQQJ0IgJB/P///wdLcg0DIAgoAgAhCAJ/IAJFBEBBBCEFQQAMAQtB0c7FAC0AABpBBCEBIAJBBBDWBCIFRQ0EIAQLIQEgAgRAIAUgByAC/AoAAAsgA0EcaiICIAQ2AgAgAyAFNgIYIAMgATYCFCADQRRqIAgQswIgA0EQaiACKAIANgIAIAMgAykCFDcDCAwBCyADQQhqIAggBSAHIAQQ7QILAkAgCUUEQCAGQQEgAygCEBshBgwBCyADQQA2AhAgAygCCCIBQQRJDQAgAygCDCABQQJ0EN8EIANCgICAgMAANwMICyAAIAMpAwg3AgAgACAGOgAMIABBCGogA0EQaigCADYCACADQSBqJAAPCyABIARB+IHAABDIBAALIAEgAkH4gcAAEMgEAAv7BAEGfyMAQSBrIgUkAAJ/IAEoAgAiAwRAIAEoAgQhAiABKAIMIQZBAAwBC0EBCyEEA0ACQAJAAkAgBEUEQCACIAZHDQEgASgCCCIEBEAgAyAEQQV0EN8ECyABQQA2AgBBASEEDAQLAkAgASgCICIERQ0AIAEoAiQiAiABKAIoTw0AIAEgAkEBajYCJAJAAkAgBCgCCCIGIAJLBEBBACEGAkAgBCgCBCACQQxsaiIHKAIIIgRB////P0sNACAEQQV0IgJB+P///wdLDQBBCCEDIAJFDQMgBygCBCEHQdHOxQAtAAAaQQghBiACQQgQ1gQiAw0CIAIhAwsgBiADQfiBwAAQyAQACyACIAZByILAABDZAwALIAJFDQAgAyAHIAL8CgAACyABIAQ2AgggASADNgIEIAEgAzYCACABIAMgBEEFdGoiBjYCDCADIQIMAgsgAAJ+AkAgASgCECICBEAgASgCFCIDIAEoAhxGDQEgASADQSBqNgIUIAVBCGogA0EIaikDADcDACAFQRBqIANBEGopAwA3AwAgBUEYaiADQRhqKQMANwMAIAUgAykDADcDAEIBDAILIABCADcDAAwECyABKAIYIgMEQCACIANBBXQQ3wQLIAFBADYCEEIACzcDACAAIAUpAwA3AwggAEEQaiAFQQhqKQMANwMAIABBGGogBUEQaikDADcDACAAQSBqIAVBGGopAwA3AwAMAgsgASACQSBqNgIEIAAgAikDADcDCCAAQRBqIAJBCGopAwA3AwAgAEEYaiACQRBqKQMANwMAIABBIGogAkEYaikDADcDACAAQgE3AwAMAQtBACEEDAELCyAFQSBqJAALrAQCB38BfiMAQeAGayICJAAgAkGABmoiA0EAQeAA/AsAAkACQCABQcABaiIEIAMQpgRFBEAgAyABQeAAahBeIAJBgANqIAMgBBA/IAJB4ANqIAEQXkEARQRAIAJBoAVqQQBB4AD8CwALIAJBgAZqIgMgBBBeIAJBwARqIgUgAkGgBWoiBiADED8gAyACQeADaiIHIAUQ1QEgByADIAEQPyAGEO4DIAMgBBBeIAUgBiADED8gAyAFIAQQPyAGIAcgAxDVASAFIAJBgANqIAYQjQEgCEUEQCADQQBB4AD8CwALIAJBwARqIAJBgAZqEKYEDQELIAJBgAZqIgNBAEHgAPwLAEIBIQkgASADEKYERQ0BIANBAEHgAPwLACAEIAMQpgRFDQFBACIBRQRAIAJBAEHgAPwLAAsgAkHYAmpCADcDACACQeACakIANwMAIAJB6AJqQgA3AwAgAkHwAmpCADcDACACQfgCakIANwMAIAJByAJqQeC0wgApAwA3AwAgAkHAAmpB2LTCACkDADcDACACQbgCakHQtMIAKQMANwMAIAJBsAJqQci0wgApAwA3AwAgAkGoAmpBwLTCACkDADcDACACQgA3A9ACIAJBuLTCACkDADcDoAIgAUUEQCACQcABakEAQeAA/AsACyABRQRAIAJB4ABqIAJBoAJqQeAA/AoAAAsgAiEBCyAAQQhqIAFBoAL8CgAAQgAhCQsgACAJNwMAIAJB4AZqJAALxgQBC38jAEEQayIGJAAgAC0ADCEKAkACQAJAAkAgACgCCEUEQEHRzsUALQAAGkEBIQJBAUEBENYEIgMNAUEBQQEQ/wQACyAGQQRqIABBChBAIAYoAgghAyAGKAIMIgUEQCADIQAgBUEDcSICBEADQCAAIAAtAAAiB0EwciAHQdcAaiAHQQpJGzoAACAAQQFqIQAgAkEBayICDQALCyADIAVqIQcgBUEETwRAA0AgACAALQAAIgJBMHIgAkHXAGogAkEKSRs6AAAgAEEBaiICIAItAAAiAkEwciACQdcAaiACQQpJGzoAACAAQQJqIgIgAi0AACICQTByIAJB1wBqIAJBCkkbOgAAIABBA2oiAiACLQAAIgJBMHIgAkHXAGogAkEKSRs6AAAgAEEEaiIAIAdHDQALCyAGKAIEIQIgBUEBRg0CQQAhACAFQQF2IgRBAUcEQCAFQQFrIQggBEH+////B3EhCwNAIAMgCGoiBC0AACEJIAQgACADaiIELQAAOgAAIAQgCToAACAHIABBfnNqIgktAAAhDCAJIARBAWoiBC0AADoAACAEIAw6AAAgCEECayEIIAsgAEECaiIARw0ACwsgBUECcUUNAiAAIANqIggtAAAhBCAIIAcgAEF/c2oiAC0AADoAACAAIAQ6AAAMAgsgBigCBCECDAELIANBMDoAACABIApBAEdBAUEAIANBARCJAiEADAELIAEgCkEAR0EBQQAgAyAFEIkCIQAgAkUNAQsgAyACEN8ECyAGQRBqJAAgAAvkBAEIfyMAQcANayIDJAAgA0GoCWpB8IPAACkDADcDACADQaAJakHog8AAKQMANwMAIANBmAlqQeCDwAApAwA3AwAgA0GQCWpB2IPAACkDADcDACADQYgJakHQg8AAKQMANwMAIANBuAlqQgA3AwAgA0HACWpCADcDACADQcgJakIANwMAIANB0AlqQgA3AwAgA0HYCWpCADcDACADQgA3A7AJIANByIPAACkDADcDgAlBAEUEQCADQaALakEAQeAA/AsACyAERQRAIANBgAxqIANBgAlqQeAA/AoAAAsgBEUEQCADQeAMakEAQeAA/AsACyADIAEgAhC5AiADQaACaiIIIAFBoAJqIgQgAkGgAmoiCRC5AiADQeAGaiIKIAEgBBDVASADQcAHaiIGIAFB4ABqIAFBgANqENUBIANBoAhqIgcgAUHAAWogAUHgA2oQ1QEgA0GACWoiBSACIAkQ1QEgA0HgCWoiASACQeAAaiACQYADahDVASADQcAKaiIEIAJBwAFqIAJB4ANqENUBIANBwARqIAogBRC5AiAFIAggA0GgC2oQuQIgACADIAUQ1QEgAEHgAGogA0HgAGogARDVASAAQcABaiADQcABaiAEENUBQQAiAkUEQCAFIANBoAL8CgAACyADQeAGaiADQcAEaiADQYAJaiIFEI0BIAYgA0GgBWogARCNASAHIANBgAZqIAQQjQEgAkUEQCAFIANBoAJqQaAC/AoAAAsgAEGgAmogA0HgBmogA0GACWoQjQEgAEGAA2ogBiABEI0BIABB4ANqIAcgBBCNASADQcANaiQAC8MEAgd/A34jAEEgayIFJAACfwJAAn8CQAJ/AkAgAgRAIAEoAgghBCABKAIEIQggAS0ADCEJAkACQCACQYCABE8EQCAERQ0CIARB/////wNqIQcgBEECdCEGIAKtIQsgBEH/////A3FBAUcNASAGIAhqDAULIARFDQEgCEEEayEHIARBAnQhAwNAIAZBEHQgAyAHaigCACIEQRB2ciACcEEQdCAEQf//A3FyIAJwIQYgA0EEayIDDQALDAULIAYgCGpBCGshAyAHQf////8DcUEBakH+////B3EhAgNAIAM1AgAgA0EEajUCACAKQiCGhCALgkIghoQgC4IhCiADQQhrIQMgAkECayICDQALDAILQQQMBAsgBUEANgIYIAVBATYCDCAFQYScwAA2AgggBUIENwIQIAVBCGpB9JzAABCoBAALIApCIIYhDCADQQhqCyEDIAdBAXEEfiAKBSAMIANBBGs1AgCEIAuCC6chBgtBACEDIAVBEGpB3JrAACgCADYCACAFQdSawAApAgA3AwggBg0BQQQLIQRBASEHQQAMAQsgBUEIakHIm8AAEKUDIAUoAgwgBjYCAEEBIQMgBSgCDCEEIAkhByAFKAIICyECIAEoAgAiAQRAIAggAUECdBDfBAtBASEGAkAgCUEBRwRAIAQhASAHIQYMAQtBBCEBQQAhAyACQQRJBEAgBCEBDAELIAQgAkECdBDfBEEAIQILIAAgBjoADCAAIAM2AgggACABNgIEIAAgAjYCACAFQSBqJAALwwQCB38DfiMAQSBrIgUkAAJ/AkACfwJAAn8CQCACBEAgASgCCCEEIAEoAgQhCCABLQAMIQkCQAJAIAJBgIAETwRAIARFDQIgBEH/////A2ohByAEQQJ0IQYgAq0hCyAEQf////8DcUEBRw0BIAYgCGoMBQsgBEUNASAIQQRrIQcgBEECdCEDA0AgBkEQdCADIAdqKAIAIgRBEHZyIAJwQRB0IARB//8DcXIgAnAhBiADQQRrIgMNAAsMBQsgBiAIakEIayEDIAdB/////wNxQQFqQf7///8HcSECA0AgAzUCACADQQRqNQIAIApCIIaEIAuCQiCGhCALgiEKIANBCGshAyACQQJrIgINAAsMAgtBBAwECyAFQQA2AhggBUEBNgIMIAVBhNHCADYCCCAFQgQ3AhAgBUEIakH00cIAEKgEAAsgCkIghiEMIANBCGoLIQMgB0EBcQR+IAoFIAwgA0EEazUCAIQgC4ILpyEGC0EAIQMgBUEQakG4zMIAKAIANgIAIAVBsMzCACkCADcDCCAGDQFBBAshBEEBIQdBAAwBCyAFQQhqQaTNwgAQpQMgBSgCDCAGNgIAQQEhAyAFKAIMIQQgCSEHIAUoAggLIQIgASgCACIBBEAgCCABQQJ0EN8EC0EBIQYCQCAJQQFHBEAgBCEBIAchBgwBC0EEIQFBACEDIAJBBEkEQCAEIQEMAQsgBCACQQJ0EN8EQQAhAgsgACAGOgAMIAAgAzYCCCAAIAE2AgQgACACNgIAIAVBIGokAAvkBAEIfyMAQcANayIDJAAgA0GoCWpB0JzFACkDADcDACADQaAJakHInMUAKQMANwMAIANBmAlqQcCcxQApAwA3AwAgA0GQCWpBuJzFACkDADcDACADQYgJakGwnMUAKQMANwMAIANBuAlqQgA3AwAgA0HACWpCADcDACADQcgJakIANwMAIANB0AlqQgA3AwAgA0HYCWpCADcDACADQgA3A7AJIANBqJzFACkDADcDgAlBAEUEQCADQaALakEAQeAA/AsACyAERQRAIANBgAxqIANBgAlqQeAA/AoAAAsgBEUEQCADQeAMakEAQeAA/AsACyADIAEgAhC5AiADQaACaiIIIAFBoAJqIgQgAkGgAmoiCRC5AiADQeAGaiIKIAEgBBDVASADQcAHaiIGIAFB4ABqIAFBgANqENUBIANBoAhqIgcgAUHAAWogAUHgA2oQ1QEgA0GACWoiBSACIAkQ1QEgA0HgCWoiASACQeAAaiACQYADahDVASADQcAKaiIEIAJBwAFqIAJB4ANqENUBIANBwARqIAogBRC5AiAFIAggA0GgC2oQuQIgACADIAUQ1QEgAEHgAGogA0HgAGogARDVASAAQcABaiADQcABaiAEENUBQQAiAkUEQCAFIANBoAL8CgAACyADQeAGaiADQcAEaiADQYAJaiIFEI0BIAYgA0GgBWogARCNASAHIANBgAZqIAQQjQEgAkUEQCAFIANBoAJqQaAC/AoAAAsgAEGgAmogA0HgBmogA0GACWoQjQEgAEGAA2ogBiABEI0BIABB4ANqIAcgBBCNASADQcANaiQAC74EAQp/IwBBEGsiBiQAAkACQAJAAkAgACgCACIAKAIIRQRAQdHOxQAtAAAaQQEhAkEBQQEQ1gQiAw0BQQFBARD/BAALIAZBBGogAEEKEEAgBigCCCEDIAYoAgwiBQRAIAMhACAFQQNxIgIEQANAIAAgAC0AACIHQTByIAdB1wBqIAdBCkkbOgAAIABBAWohACACQQFrIgINAAsLIAMgBWohByAFQQRPBEADQCAAIAAtAAAiAkEwciACQdcAaiACQQpJGzoAACAAQQFqIgIgAi0AACICQTByIAJB1wBqIAJBCkkbOgAAIABBAmoiAiACLQAAIgJBMHIgAkHXAGogAkEKSRs6AAAgAEEDaiICIAItAAAiAkEwciACQdcAaiACQQpJGzoAACAAQQRqIgAgB0cNAAsLIAYoAgQhAiAFQQFGDQJBACEAIAVBAXYiBEEBRwRAIAVBAWshCCAEQf7///8HcSEKA0AgAyAIaiIELQAAIQkgBCAAIANqIgQtAAA6AAAgBCAJOgAAIAcgAEF+c2oiCS0AACELIAkgBEEBaiIELQAAOgAAIAQgCzoAACAIQQJrIQggCiAAQQJqIgBHDQALCyAFQQJxRQ0CIAAgA2oiCC0AACEEIAggByAAQX9zaiIALQAAOgAAIAAgBDoAAAwCCyAGKAIEIQIMAQsgA0EwOgAAIAFBAUEBQQAgA0EBEIkCIQAMAQsgAUEBQQFBACADIAUQiQIhACACRQ0BCyADIAIQ3wQLIAZBEGokACAAC5gGAQx+QqnAxomuzpOyMCEGIAEpAwgiAyACKQMIfCIJIANUIAkgASkDECIDIAIpAxB8IgQgA1QgBCABKQMYIgMgAikDGHwiCiADVK18IgUgBFRyrXwiBCAJVHKtIAIpAwAgASkDAHx8IgshAwJAAkACQCALQqnAxomuzpOyMFINAELdsIWM6LaRqLh/IQYgBCEDIARC3bCFjOi2kai4f1INAEKNlcfDltLawJd/IQYgBSIDQo2Vx8OW0trAl39SDQBCx/rzw+2Co5A8IQYgCiIDQsf688PtgqOQPFENAQsgAyAGWg0AIAQhBiAFIQkMAQsgBULz6ri86a2lv+gAfCIGIApCx/rzw+2Co5A8VK0iA30hCSAEQqPP+vOXye7XxwB8IgggBUKNlcfDltLawJd/VCADIAZWcq0iA30hBiALIARC3bCFjOi2kai4f1QgAyAIVnKtfUKpwMaJrs6TsjB9IQsgCkLH+vPD7YKjkDx9IQoLQqnAxomuzpOyMCEHIAEpAygiAyACKQMofCIMIANUIAwgASkDMCIDIAIpAzB8IgQgA1QgBCABKQM4IgMgAikDOHwiCCADVK18IgUgBFRyrXwiBCAMVHKtIAIpAyAgASkDIHx8Ig0hAwJAAkACQCANQqnAxomuzpOyMFINAELdsIWM6LaRqLh/IQcgBCEDIARC3bCFjOi2kai4f1INAEKNlcfDltLawJd/IQcgBSIDQo2Vx8OW0trAl39SDQBCx/rzw+2Co5A8IQcgCCIDQsf688PtgqOQPFENAQsgAyAHWg0AIAQhByAFIQMMAQsgBULz6ri86a2lv+gAfCIOIAhCx/rzw+2Co5A8VK0iB30hAyAEQqPP+vOXye7XxwB8IgwgBUKNlcfDltLawJd/VCAHIA5Wcq0iBX0hByANIARC3bCFjOi2kai4f1QgBSAMVnKtfUKpwMaJrs6TsjB9IQ0gCELH+vPD7YKjkDx9IQgLIAAgCDcDOCAAIAM3AzAgACAHNwMoIAAgDTcDICAAIAo3AxggACAJNwMQIAAgBjcDCCAAIAs3AwALnwQBBn8jAEHgAWsiAiQAIAJB+ABqIgMgARAqAkACQAJAIAIoAnhBAUYEQCACQTBqIAJBqAFqKQMANwMAIAJBKGogAkGgAWopAwA3AwAgAkEgaiACQZgBaikDADcDACACQRhqIAJBkAFqKQMANwMAIAJBEGogAkGIAWopAwA3AwAgAiACKQOAATcDCCACQeAAaiACQdgBaikDADcDACACQdgAaiACQdABaikDADcDACACQdAAaiACQcgBaikDADcDACACQcgAaiACQcABaikDADcDACACQUBrIAJBuAFqKQMANwMAIAIgAikDsAE3AzggAkHsAGogAkEIahDYAiADIAJBOGoQ2AIgAigCdCIBIAIoAoABIgRHDQEgAigCcEEEayEEIAFBAnQhASACKAJ8QQRrIQcDQCACQThqIQMgAUUNBCABIAdqIQUgASAEaiABQQRrIQEoAgAiBiAFKAIAIgVGDQALIAUgBkkNAgwDC0HorsAAEOgEAAsgAkE4aiEDIAEgBE0NAQsgAkEIaiEDCyACKAJ4IgEEQCACKAJ8IAFBAnQQ3wQLIAIoAmwiAQRAIAIoAnAgAUECdBDfBAsgACADKQMANwMAIABBKGogA0EoaikDADcDACAAQSBqIANBIGopAwA3AwAgAEEYaiADQRhqKQMANwMAIABBEGogA0EQaikDADcDACAAQQhqIANBCGopAwA3AwAgAkHgAWokAAu5BAEKfyMAQRBrIgYkAAJAAkACQAJAIAAoAghFBEBB0c7FAC0AABpBASECQQFBARDWBCIDDQFBAUEBEP8EAAsgBkEEaiAAQQoQQCAGKAIIIQMgBigCDCIFBEAgAyEAIAVBA3EiAgRAA0AgACAALQAAIgdBMHIgB0HXAGogB0EKSRs6AAAgAEEBaiEAIAJBAWsiAg0ACwsgAyAFaiEHIAVBBE8EQANAIAAgAC0AACICQTByIAJB1wBqIAJBCkkbOgAAIABBAWoiAiACLQAAIgJBMHIgAkHXAGogAkEKSRs6AAAgAEECaiICIAItAAAiAkEwciACQdcAaiACQQpJGzoAACAAQQNqIgIgAi0AACICQTByIAJB1wBqIAJBCkkbOgAAIABBBGoiACAHRw0ACwsgBigCBCECIAVBAUYNAkEAIQAgBUEBdiIEQQFHBEAgBUEBayEIIARB/v///wdxIQoDQCADIAhqIgQtAAAhCSAEIAAgA2oiBC0AADoAACAEIAk6AAAgByAAQX5zaiIJLQAAIQsgCSAEQQFqIgQtAAA6AAAgBCALOgAAIAhBAmshCCAKIABBAmoiAEcNAAsLIAVBAnFFDQIgACADaiIILQAAIQQgCCAHIABBf3NqIgAtAAA6AAAgACAEOgAADAILIAYoAgQhAgwBCyADQTA6AAAgAUEBQQFBACADQQEQiQIhAAwBCyABQQFBAUEAIAMgBRCJAiEAIAJFDQELIAMgAhDfBAsgBkEQaiQAIAALtAQCCH4BfyMAQdAAayIKJAAgCkEwaiABKQMYIgNCAEL/////D0IAEMkDIApBQGsgA0IAQoGAgIBwQgAQyQMgCiADIAEpAxAiAnwiBCAKKQMwfCIDQgBCgYCAgHBCABDJAyAKQRBqIANCIIYiBSADIARUrSAKKQM4IAIgBFatfHwiBiABKQMIfCIHfCIEQgBCgYCAgHBCABDJAyAKQSBqIARCIIYiCCAEIAVUrSADQiCIfCIFIAopA0AiCSABKQMAfCICIAYgB1atfCIGfCIHfCIDQgBCgYCAgHBCABDJAwJAIAopAyggCikDGCAKKQMIIAIgBlatIAopA0ggAiAJVK18fCIGIAopAwB8IgIgBlStfCACIAUgB1atfCIFIAJUrXwiBiAKKQMQfCICIAZUrXwgAiACIAMgCFStIARCIIh8IgQgBXwiBSAEVK18IgJWrXwiBiAKKQMgfCIEIAZUrXwgBCACIANCIIYiAiAFfCIFIAJUrSADQiCIfCIDfCICIANUrXwiAyAEVK18IgZCgYCAgHBSBEAgAyEEDAELAkAgAkL/////D1YNAEIAIQQgA0IAUg0AQoGAgIBwIQYgBUJ/UiACQv////8PUnINAQtCf0IAIAMgAkL/////D1QgAkL/////D30iBCAFQn9SrSICVHKtIgdUGyEGIAQgAn0hAiADIAd9IQQgBUIBfCEFCyAAIAU3AxggACACNwMQIAAgBDcDCCAAIAY3AwAgCkHQAGokAAuDBAEGfyMAQdABayIEJAACQCABKAIAIgIgASgCBCIGRwRAIARBiQFqIQUDQCABIAJBGGoiBzYCACAEQZABaiIIIAIQ9wIgBEGwAWoiCSACQQxqEPcCIARByABqIAggCRBDAkACQCAELQCIASICQQJGBEAgAygCACIBQYCAgIB4RiABRXJFBEAgAygCBCABEN8ECyADIAQpA0g3AgAgA0EIaiAEQdAAaigCADYCAAwBCyAEQRBqIARB0ABqKQMANwMAIARBGGogBEHYAGopAwA3AwAgBEEgaiAEQeAAaikDADcDACAEQShqIARB6ABqKQMANwMAIARBMGogBEHwAGopAwA3AwAgBEE4aiAEQfgAaikDADcDACAEQUBrIARBgAFqKQMANwMAIAQgBCkDSDcDCCAEIAUoAAA2AgAgBCAFQQNqKAAANgADIAJBA0YNAQsgACAEKQMINwMAIAAgBCgCADYAQSAAQcQAaiAEKAADNgAAIABBOGogBEFAaykDADcDACAAQTBqIARBOGopAwA3AwAgAEEoaiAEQTBqKQMANwMAIABBIGogBEEoaikDADcDACAAQRhqIARBIGopAwA3AwAgAEEQaiAEQRhqKQMANwMAIABBCGogBEEQaikDADcDAAwDCyAHIgIgBkcNAAsLQQMhAgsgACACOgBAIARB0AFqJAALqAQBBH8jAEGAAWsiBCQAAkACQAJAIAEoAggiAkGAgIAQcUUEQCACQYCAgCBxDQFBASECIAAoAgBBASABEN4CRQ0CDAMLIAAoAgAhAgNAIAMgBGpB/wBqIAJBD3EiBUEwciAFQdcAaiAFQQpJGzoAACADQQFrIQMgAkEQSSACQQR2IQJFDQALQQEhAiABQQFB+7fFAEECIAMgBGpBgAFqQQAgA2sQiQJFDQEMAgsgACgCACECA0AgAyAE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NgIgIAYgBTYCHCAGIAM2AhggASgCLCIDQQJ0IQRBACEFIANB/////wNLIARB/P///wdLcg0BIAEoAighAgJ/IARFBEBBBCEBQQAMAQtB0c7FAC0AABpBBCEFIARBBBDWBCIBRQ0CIAMLIQUgBARAIAEgAiAE/AoAAAsgBiADNgIsIAYgATYCKCAGIAU2AiQgAEEENgIIIAAgBjYCBCAAQQQ2AgAPC0EEQTAQ/wQACyAFIARB+IHAABDIBAALIAMgAkH4gcAAEMgEAAuhBAEHfyMAQbACayIDJAACQAJAAkAgASgCBCIFBEAgASgCCCIGRQ0CIANByQFqIQcgASgCACEEA0AgASAFIAYgBSAFIAZLGyIIayIFNgIEIAEgBCAIQTBsaiIJNgIAIANB+AFqIARBKGopAwA3AwAgA0HwAWogBEEgaikDADcDACADQegBaiAEQRhqKQMANwMAIANB4AFqIARBEGopAwA3AwAgA0HYAWogBEEIaikDADcDACADIAQpAwA3A9ABIAhBAUYNBCADQagCaiAEQdgAaikDADcDACADQaACaiAEQdAAaikDADcDACADQZgCaiAEQcgAaikDADcDACADQZACaiAEQUBrKQMANwMAIANBiAJqIARBOGopAwA3AwAgAyAEKQMwNwOAAiADQegAaiADQdABaiADQYACakEAEDECQAJAIAMtAMgBIgRBAkYEQCACKAIAIgFBgICAgHhGIAFFckUEQCACKAIEIAEQ3wQLIAIgAykDaDcCACACQQhqIANB8ABqKAIANgIADAELIAMgBygAADYCACADIAdBA2ooAAA2AAMgA0EIaiADQegAakHgAPwKAAAgBEEDRg0BCyAAIANBCGpB4AD8CgAAIABB5ABqIAMoAAM2AAAgACADKAIANgBhDAMLIAkhBCAFDQALC0EDIQQLIAAgBDoAYCADQbACaiQADwtBAEEAQaD6wAAQ2QMAC0EBQQFBsPrAABDZAwALxAQCBX8BfiMAQSBrIgIkACABLQAMIgVFBEACQCABKAIIIgQEQCABKAIEIQMgBEECdCEEA0AgAygCAA0CIAdCIHwhByADQQRqIQMgBEEEayIEDQALC0GUiMUAQRxBlInFABDoAwALIAcgAygCAGithFAhAwsCQAJAIAEoAgBBgICAgHhHBEAgASgCCA0BIAJBCGogAUEI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BDYCDCACIAY2AggMAgsgBCgCCA0AIAJBADYCECACQoCAgIDAADcCCAwBCyACIAM2AhwgAiAENgIYIAIgBjYCFCACQQhqIAJBFGpBACABaBDPAQsgACACKQIINwIAIABBCGogAkEQaigCADYCAAsgAkEgaiQAC7UFAQ9+An4gAUGAoMUAQTAQ8QMEQEL//8+K6///1R4gASkDICIKfSIFIAEpAygiC0Kr1f7///+//7l/Vq0iBn0hDkKk7MO1j9S0mOcAIAEpAxgiA30iByAFIAZUIApC///Piuv//9UeVnKtIgV9IQpCv6WUnM/w0rvkACABKQMQIgZ9IgggBSAHViADQqTsw7WP1LSY5wBWcq0iA30hBULX2a6a5PbpjcsAIAEpAwgiB30iAiADIAhWIAZCv6WUnM/w0rvkAFZyrSIDfSEGQqvV/v///7//uX8gC30hC0Kazf/Lo73EgBogASkDACACIANUIAdC19mumuT26Y3LAFZyrXx9DAELIAEpAyghCyABKQMgIQ4gASkDGCEKIAEpAxAhBSABKQMIIQYgASkDAAshAwJ+IAFBMGpBgKDFAEEwEPEDBEBC///Piuv//9UeIAEpA1AiCH0iAiABKQNYIgxCq9X+////v/+5f1atIgl9IQdCpOzDtY/UtJjnACABKQNIIgR9Ig0gAiAJVCAIQv//z4rr///VHlZyrSICfSEIQr+llJzP8NK75AAgASkDQCIJfSIPIAIgDVYgBEKk7MO1j9S0mOcAVnKtIgR9IQJC19mumuT26Y3LACABKQM4Ig19IhAgBCAPViAJQr+llJzP8NK75ABWcq0iBH0hCUKr1f7///+//7l/IAx9IQxCms3/y6O9xIAaIAEpAzAgBCAQViANQtfZrprk9umNywBWcq18fQwBCyABKQNYIQwgASkDUCEHIAEpA0ghCCABKQNAIQIgASkDOCEJIAEpAzALIQQgACAMNwNYIAAgBzcDUCAAIAg3A0ggACACNwNAIAAgCTcDOCAAIAQ3AzAgACALNwMoIAAgDjcDICAAIAo3AxggACAFNwMQIAAgBjcDCCAAIAM3AwALowMBBH8jAEHAA2siBCQAIAQgARBhIARBgAJqIgUgBCAEEDggBEHAAmoiBiABIAEQoAIgBEFAayIHIAUgBhDcASAGIAEgBxDcASAFIAQgBhA4IARBwAFqIAUgAUFAayIHENwBIARBiAFqIARByABqKQMANwMAIARBkAFqIARB0ABqKQMANwMAIARBmAFqIARB2ABqKQMANwMAIARBoAFqIARB4ABqKQMANwMAIARBqAFqIARB6ABqKQMANwMAIARBsAFqIARB8ABqKQMANwMAIARBuAFqIARB+ABqKQMANwMAIARBiANqIARBCGopAwA3AwAgBEGQA2ogBEEQaikDADcDACAEQZgDaiAEQRhqKQMANwMAIAQgBCkDQDcDgAEgBCAEKQMANwOAAyAEQbgDaiAEQThqKQMANwMAIARBsANqIARBMGopAwA3AwAgBEGoA2ogBEEoaikDADcDACAEIAQpAyA3A6ADIAYgBCABEDggBSAGIAcQ3AEgAEGAAWogBEGAA2ogBSACIAMQGSAAIARBgAFqQYAB/AoAACAEQcADaiQAC+0DAQl/IwBBEGsiAyQAAkACQAJAIAEoAghFBEBB0c7FAC0AABpBASEBQQFBARDWBCICRQ0DIAJBADoAACADQQE2AgwgAyACNgIIIANBATYCBAwBCyADQQRqIAFBCBCwAiADKAIMIgFBAkkNACADKAIIIgUgAWohCCABQQF2IgRBAUcEQCABQQFrIQYgBEH+////B3EhCQNAIAUgBmoiBC0AACEHIAQgAiAFaiIELQAAOgAAIAQgBzoAACAIIAJBfnNqIgctAAAhCiAHIARBAWoiBC0AADoAACAEIAo6AAAgBkECayEGIAkgAkECaiICRw0ACwsgAUECcQRAIAIgBWoiBi0AACEEIAYgCCACQX9zaiICLQAAOgAAIAIgBDoAAAsgAUEfSw0BCwNAIAMoAgQgAUYEQCADQQRqQbCewgAQtgMLIAMoAgghAiABBEAgAkEBaiACIAH8CgAACyACQQA6AAAgAyABQQFqIgI2AgwgAUEfSSACIQENAAsgAygCCCEFCyAAKAIAIAAoAggiAmsgAUkEQCAAIAIgAUEBQQEQiAMgACgCCCECCyABBEAgACgCBCACaiAFIAH8CgAACyAAIAEgAmo2AgggAygCBCIABEAgAygCCCAAEN8ECyADQRBqJAAPC0EBQQEQ/wQAC9MDAgZ/An4jAEFAaiIDJAAgA0EgakIANwMAIANBGGpCADcDACADQRBqQgA3AwAgA0IANwMIAkACQCACQQJLBEAgAS0AAEEwRw0BIAEtAAFB+ABGQQF0IQYLQQMhBCACIAZNDQELIAJBAWshBUEDIQQCQAJAA0ACfgJAIAIgBSIISwRAIAEgBWotAAAiBUEwa0H/AXFBCk8NAUJQDAILIAggAkGM1sEAENkDAAtCqX8gBUHhAGtB/wFxQQZJDQAaIAVBwQBrQf8BcUEGTw0CQkkLIAWtQv8Bg3wgB0E/ca2GIAmEIQkCQCAERSAHQQRqIgdBwABHckUEQCAEQQRPDQEgA0EIaiAEQQN0aiAJNwMAQgAhCUEAIQcgBEEBayEECyAIQQFrIQUgBiAITw0DDAELCyAEQQRB0NbBABDZAwALIANBADYCOCADQQE2AiwgA0G41sEANgIoIANCBDcCMCADQShqQcDWwQAQqAQACyAEQQRJDQAgBEEEQfzVwQAQ2QMACyADQQhqIARBA3RqIAk3AwAgACADKQMINwMAIABBCGogA0EQaikDADcDACAAQRBqIANBGGopAwA3AwAgAEEYaiADQSBqKQMANwMAIANBQGskAAvGBAIEfwp+IwBB8ABrIgIkACACQeQAaiABEPcDIAIoAmghAyACKAJkIQQgAigCbCIBQQJGBEAgAygCBCEFIAMoAgAhASACQQhqIANBCGpB2AD8CgAAIAQEQCADIARBMGwQ3wQLIAIpA1ghCyACKQNQIQggAikDSCEJIAIpA0AhCiACKQM4IQ0gAikDMCEOAkAgAkEwakHYgsAAQTAQ8QNFBEAgDSEGIAohByAJIQwgCCEPDAELQv//z4rr///VHiAIfSIHIAtCq9X+////v/+5f1atIgx9IQ9CpOzDtY/UtJjnACAJfSIGIAcgDFQgCEL//8+K6///1R5Wcq0iB30hDEK/pZScz/DSu+QAIAp9IgggBiAHVCAJQqTsw7WP1LSY5wBWcq0iBn0hB0LX2a6a5PbpjcsAIA19IgkgBiAIViAKQr+llJzP8NK75ABWcq0iCn0hBkKazf/Lo73EgBogCSAKVCANQtfZrprk9umNywBWcq0gDnx9IQ5Cq9X+////v/+5fyALfSELCyAAIAU2AgQgACABNgIAIAAgAikDCDcDCCAAIAs3A1ggACAPNwNQIAAgDDcDSCAAIAc3A0AgACAGNwM4IAAgDjcDMCAAQRBqIAJBEGopAwA3AwAgAEEYaiACQRhqKQMANwMAIABBIGogAkEgaikDADcDACAAQShqIAJBKGopAwA3AwAgAkHwAGokAA8LIAIgATYCbCACIAM2AmggAiAENgJkQYCLwABBKyACQeQAakGsi8AAQaSNwAAQygMAC4oDAQt/IwBBoAVrIgMkACADIAEgAhA/IANB4ABqIgcgAUHgAGoiCCACQeAAaiIJED8gA0HAAWoiCiABQcABaiILIAJBwAFqIgwQPyADQaACaiINEHUgA0HgA2oiBSAIIAsQ1QEgA0HABGoiBCAJIAwQ1QEgA0GAA2oiBiAFIAQQPyAEIAYgBxCNASAFIAQgChCNASAEIA0gBRA/IAAgAyAEENUBIAUgASAIENUBIAQgAiAJENUBIAYgBSAEED8gBCAGIAMQjQEgBiAEIAcQjQEgBBB1IAUgBCAKED8gAEHgAGogBiAFENUBIAUgASALENUBIAQgAiAMENUBIAYgBSAEED9BACIBRQRAIAQgA0HgAPwKAAALIANB4ANqIANBgANqIANBwARqIgIQjQEgAUUEQCACIANB4ABqQeAA/AoAAAsgA0GAA2ogA0HgA2ogA0HABGoiAhDVASABRQRAIAIgA0HAAWpB4AD8CgAACyAAQcABaiADQYADaiADQcAEahCNASADQaAFaiQAC8IDAQR/IAAoAgAiAQRAIAAoAgQgAUECdBDfBAsgACgCDCIBBEAgACgCECABQQJ0EN8ECyAAKAIYIgEEQCAAKAIcIAFBAnQQ3wQLIAAoAiQiAQRAIAAoAiggAUECdBDfBAsgACgCMCIBBEAgACgCNCABQQJ0EN8ECyAAKAI8IgEEQCAAKAJAIAFBAnQQ3wQLIAAoAkgiAQRAIAAoAkwgAUECdBDfBAsgACgCVCIBBEAgACgCWCABQQJ0EN8ECyAAKAJgIgEEQCAAKAJkIAFBAnQQ3wQLIAAoAmwiAQRAIAAoAnAgAUECdBDfBAsgACgCeCIBBEAgACgCfCABQQJ0EN8ECyAAKAKEASIBBEAgACgCiAEgAUECdBDfBAsgACgCkAEiAQRAIAAoApQBIAFBAnQQ3wQLIAAoApwBIgEEQCAAKAKgASABQQJ0EN8ECyAAKAKsASEBIAAoArABIgQEQCABIQIDQCACKAIAIgMEQCACQQRqKAIAIANBAnQQ3wQLIAJBDGooAgAiAwRAIAJBEGooAgAgA0ECdBDfBAsgAkEYaiECIARBAWsiBA0ACwsgACgCqAEiAARAIAEgAEEYbBDfBAsL0AQCCH4KfyABKAIEIQsgASgCACAAKAIAIg0gACgCBCIKRwRAIAAoAhQhESAAKAIQIQ4gACgCDCESIAAoAgghDCABKAIIIAtBBXRqIRMgCiANa0EFdiEPQQAhAANAAkACQCAOIAwgESgCAGoiCksEQEKpwMaJrs6TsjAhBCAAIA1qIgEpAwAgEiAKQQV0aiIKKQMAfCABQQhqKQMAIgIgCikDCHwiAyACVCADIAFBEGopAwAiBSAKKQMQfCICIAVUIAIgAiABQRhqKQMAIgUgCikDGHwiBiAFVK18IgJWcq18IgUgA1RyrXwiByEDAkAgB0KpwMaJrs6TsjBSDQBC3bCFjOi2kai4fyEEIAUhAyAFQt2whYzotpGouH9SDQBCkeHlzYeJ+pkoIQQgAiEDIAJCkeHlzYeJ+pkoUg0AQoGAgIC/sv3wwwAhBCAGIQMgBkKBgICAv7L98MMAUQ0CCyADIARaDQEgBSEEIAIhAwwCCyAKIA5B1PnAABDZAwALIAJCkeHlzYeJ+pkofSIEIAZCgYCAgL+y/fDDAFStIgh9IQMgBUKjz/rzl8nu18cAfCIJIAJCkeHlzYeJ+pkoVCAEIAhUcq0iAn0hBCAHIAVC3bCFjOi2kai4f1QgAiAJVnKtfUKpwMaJrs6TsjB9IQcgBkKBgICAv7L98MMAfSEGCyAAIBNqIgEgBzcDACABQRhqIAY3AwAgAUEQaiADNwMAIAFBCGogBDcDACAAQSBqIQAgDEEBaiEMIAtBAWohCyAPQQFrIg8NAAsLIAs2AgALigQCBH8BfiMAQSBrIgIkAAJAAn9BACAALQAMDQAaIAJBEGogABDYAyACKAIQQQFHDQFBACABUA0AGiACKQMYIAFUCyEEIAApAgAhBiAAQbDMwgApAgA3AgAgAkEYaiIFIABBCGoiAygCADYCACADQbjMwgAoAgA2AgAgAiAGNwMQAkACQCAGp0GAgICAeEcEQCACKAIYDQEgAkEIaiAFKAIANgIAIAIgAikDEDcDAAwCCyACKAIUKAIIDQAgAkEANgIIIAJCgICAgMAANwMADAELIAIgAkEQaiABQgWIpyABp0EfcRDsASAAKAIAIgNFDQAgACgCBCADQQJ0EN8ECyAAIAIpAwA3AgAgAEEIaiIDIAJBCGooAgA2AgAgAygCACEDAkAgBEUEQCADDQEgAEEBOgAMDAELIANFBEAgACgCAEUEQCAAQcjQwgAQpQMLIAAoAgRBADYCACAAQQE2AghBASEDCyAAKAIEIgQgBCgCAEEBaiIFNgIAIAUNACADQQFHBEAgA0ECdEEEayEDIARBBGohBANAIAQgBCgCAEEBaiIFNgIAIAUNAiAEQQRqIQQgA0EEayIDDQALCyAAKAIIIgQgACgCAEYEQCAAQdjQwgAQpQMLIAAoAgQgBEECdGpBATYCACAAIARBAWo2AggLIAJBIGokAA8LQbTNwgBBHEG0zsIAEOgDAAvsBAEKfkKazf/Lo73EgBohBCABKQMIIgMgAikDCHwiBiADVCAGIAEpAxAiAyACKQMQfCIKIANUIAogASkDGCIDIAIpAxh8IgUgA1QgBSABKQMgIgMgAikDIHwiByADVCAHIAEpAygiAyACKQMofCILIANUrXwiCCAHVHKtfCIJIAVUcq18IgUgClRyrXwiByAGVHKtIAIpAwAgASkDAHx8IgwhAwJAAkACQCAMQprN/8ujvcSAGlINAELX2a6a5PbpjcsAIQQgByIDQtfZrprk9umNywBSDQBCv6WUnM/w0rvkACEEIAUiA0K/pZScz/DSu+QAUg0AQqTsw7WP1LSY5wAhBCAJIgNCpOzDtY/UtJjnAFINAEL//8+K6///1R4hBCAIIgNC///Piuv//9UeUg0AQqvV/v///7//uX8hBCALIgNCq9X+////v/+5f1ENAQsgAyAEWg0AIAchAyAFIQQgCSEGIAghCgwBCyAIQv//z4rr///VHn0iBiALQqvV/v///7//uX9UrSIDfSEKIAlCpOzDtY/UtJjnAH0iBCAIQv//z4rr///VHlQgAyAGVnKtIgN9IQYgBUK/pZScz/DSu+QAfSIIIAlCpOzDtY/UtJjnAFQgAyAEVnKtIgN9IQQgB0LX2a6a5PbpjcsAfSIJIAVCv6WUnM/w0rvkAFQgAyAIVnKtIgV9IQMgDCAHQtfZrprk9umNywBUIAUgCVZyrX1Cms3/y6O9xIAafSEMIAtC1aqBgICAwIDGAHwhCwsgACALNwMoIAAgCjcDICAAIAY3AxggACAENwMQIAAgAzcDCCAAIAw3AwALhgQCBX8IfiMAQdAAayICJAAgAkHEAGogARCvAyACKAJIIQEgAigCRCEDIAIoAkwiBEECRgRAIAJBEGogAUEQaikDADcDACACQRhqIAFBGGopAwA3AwAgAkEgaiIEIAFBIGopAwA3AwAgAkEoaiABQShqKQMANwMAIAJBMGogAUEwaikDADcDACACQThqIAFBOGopAwA3AwAgAiABKQMINwMIIAEoAgQhBSABKAIAIQYgAwRAIAEgA0EFdBDfBAsgAikDOCEIIAIpAzAhByACKQMoIQogAikDICELAkAgBEGIg8AAQSAQ8QNFBEAgCiEJIAchDAwBC0KNlcfDltLawJd/IAd9IgkgCELH+vPD7YKjkDxWrSINfSEMQt2whYzotpGouH8gCn0iDiAJIA1UIAdCjZXHw5bS2sCXf1ZyrSIHfSEJQqnAxomuzpOyMCAHIA5WIApC3bCFjOi2kai4f1ZyrSALfH0hC0LH+vPD7YKjkDwgCH0hCAsgACAFNgIEIAAgBjYCACAAIAIpAwg3AwggACAINwM4IAAgDDcDMCAAIAk3AyggACALNwMgIABBEGogAkEQaikDADcDACAAQRhqIAJBGGopAwA3AwAgAkHQAGokAA8LIAIgBDYCTCACIAE2AkggAiADNgJEQYCLwABBKyACQcQAakHwisAAQaSNwAAQygMAC5cBAgF/AX4CQCAAIABBIGoiASkDAEI/hiAAQShqKQMAQgGIhDcDKCAAIABBGGopAwAiAkI/hiABKQMAQgGIhDcDICAAIABBEGoiASkDAEI/hiACQgGIhDcDGCAAIABBCGopAwAiAkI/hiABKQMAQgGIhDcDECAAIAApAwBCP4YgAkIBiIQ3AwggACAAKQMAQgGINwMADAALC5cDAQ9/IwBBIGsiByQAIAMgASABIANLGyIJQQJ0IQoCQAJAAkAgCUUNACAJQQFxAkAgCUEBRgRADAELIAlBfnEhDSACIQUgACEEA0AgBCAEKAIAIg4gBSgCACIPayIQIAZrNgIAIARBBGoiCyALKAIAIgsgBUEEaigCACIRayISIA4gD0kgBiAQS3IiBms2AgAgCyARSSAGIBJLciEGIAVBCGohBSAEQQhqIQQgDSAIQQJqIghHDQALCwR/IAAgCEECdCIEaiIFIAUoAgAiBSACIARqKAIAIgRrIgggBms2AgAgBCAFSyAGIAhLcgUgBgtFDQAgACAKaiEEIAFBAnQgCUECdGshBQNAIAVFDQIgBCAEKAIAIgBBAWs2AgAgBUEEayEFIARBBGohBCAARQ0ACwsgAiAKaiEFIANBAnQgCmshBANAIARFDQIgBEEEayEEIAUoAgAgBUEEaiEFRQ0ACwsgB0EANgIYIAdBATYCDCAHQcSKxQA2AgggB0IENwIQIAdBCGpBzIrFABCoBAALIAdBIGokAAvhAwENfiACKQMAIgohBiABKQMAIgshBCAAAn4CQAJ+AkAgCiALUg0AIAIpAwgiByABKQMIIgRSBEAgByEGDAELIAIpAxAiAyABKQMQIgRSBEAgAyEGDAELIAMhBSACKQMYIgYhCCAHIAYgASkDGCIEUQ0BGgsgBCAGVA0BIAIpAwghByACKQMQIQMgASkDECEFIAIpAxghBiABKQMYIQggASkDCAshCSAFIAN9IgwgBiAIVq0iDX0hBCAJIAd9Ig4gDCANVCADIAVWcq0iBX0hAyAFIA5WIAcgCVZyIQIgCyAKfSEHIAggBn0MAQtC3bCFjOi2kai4fyACKQMIIgYgASkDCCIHfSIJIAIpAxAiAyABKQMQIgVUIAMgBX0iAyACKQMYIgUgASkDGCIEVK0iCFRyrSIMfSINfSIOIAMgCH0iA0KR4eXNh4n6mShWQpHh5c2HifqZKCADfSIIIAUgBH0iBUKBgICAv7L98MMAVq0iBFRyrSIPfSEDIA4gD1QgDULdsIWM6LaRqLh/VnIhAiAIIAR9IQQgBiAHVCAJIAxUcq0gCyAKfXxCqcDGia7Ok7IwfCEHQoGAgIC/sv3wwwAgBX0LNwMYIAAgBDcDECAAIAM3AwggACAHIAKtfTcDAAvhAwENfiACKQMAIgohBiABKQMAIgshBCAAAn4CQAJ+AkAgCiALUg0AIAIpAwgiByABKQMIIgRSBEAgByEGDAELIAIpAxAiAyABKQMQIgRSBEAgAyEGDAELIAMhBSACKQMYIgYhCCAHIAYgASkDGCIEUQ0BGgsgBCAGVA0BIAIpAwghByACKQMQIQMgASkDECEFIAIpAxghBiABKQMYIQggASkDCAshCSAFIAN9IgwgBiAIVq0iDX0hBCAJIAd9Ig4gDCANVCADIAVWcq0iBX0hAyAFIA5WIAcgCVZyIQIgCyAKfSEHIAggBn0MAQtC3bCFjOi2kai4fyACKQMIIgYgASkDCCIHfSIJIAIpAxAiAyABKQMQIgVUIAMgBX0iAyACKQMYIgUgASkDGCIEVK0iCFRyrSIMfSINfSIOIAMgCH0iA0KNlcfDltLawJd/VkKNlcfDltLawJd/IAN9IgggBSAEfSIFQsf688PtgqOQPFatIgRUcq0iD30hAyAOIA9UIA1C3bCFjOi2kai4f1ZyIQIgCCAEfSEEIAYgB1QgCSAMVHKtIAsgCn18QqnAxomuzpOyMHwhB0LH+vPD7YKjkDwgBX0LNwMYIAAgBDcDECAAIAM3AwggACAHIAKtfTcDAAu+AwEGfyMAQSBrIgQkACAAKAIEIQUgACgCCCEDIAQgATYCBCADQQBHIgZBAnQhAgJAAkACQCADRQ0AIAUgBSgCACIHIAFrNgIAIAEgB00NACACIAVqIQEgA0ECdCAGQQJ0ayEGA0AgBkUNAiABIAEoAgAiB0EBazYCACAGQQRrIQYgAUEEaiEBIAdFDQALCwNAIAJBBEYNAiAEQQRqIAJqIAJBBGohAigCAEUNAAsLIARBADYCGCAEQQE2AgwgBEHEisUANgIIIARCBDcCECAEQQhqQcyKxQAQqAQACwJAIANFBEBBACEDDAELIAUgA0ECdCICakEEaygCAA0AIAVBBGshBiADQf////8DcSEBAkADQCACRQRAQQAhAgwCCyABQQFrIQEgAiAGaiACQQRrIQIoAgBFDQALIAFBAWoiAiADSw0BCyAAIAI2AgggAiEDCwJAIAMgACgCACIBQQJ2TyABRXJFBEAgAUECdCECAkAgA0UEQEEEIQEgBSACEN8EDAELIAUgAkEEIANBAnQiAhDOBCIBRQ0CCyAAIAM2AgAgACABNgIECyAEQSBqJAAPC0EEIAJBjMHEABDIBAAL/AMBAn8gACABaiECAkACQCAAKAIEIgNBAXENACADQQJxRQ0BIAAoAgAiAyABaiEBIAAgA2siAEGY0sUAKAIARgRAIAIoAgRBA3FBA0cNAUGQ0sUAIAE2AgAgAiACKAIEQX5xNgIEIAAgAUEBcjYCBCACIAE2AgAMAgsgACADEOACCwJAAkACQCACKAIEIgNBAnFFBEAgAkGc0sUAKAIARg0CIAJBmNLFACgCAEYNAyACIANBeHEiAhDgAiAAIAEgAmoiAUEBcjYCBCAAIAFqIAE2AgAgAEGY0sUAKAIARw0BQZDSxQAgATYCAA8LIAIgA0F+cTYCBCAAIAFBAXI2AgQgACABaiABNgIACyABQYACTwRAIAAgARD7Ag8LIAFB+AFxQYDQxQBqIQICf0GI0sUAKAIAIgNBASABQQN2dCIBcUUEQEGI0sUAIAEgA3I2AgAgAgwBCyACKAIICyEBIAIgADYCCCABIAA2AgwgACACNgIMIAAgATYCCA8LQZzSxQAgADYCAEGU0sUAQZTSxQAoAgAgAWoiATYCACAAIAFBAXI2AgQgAEGY0sUAKAIARw0BQZDSxQBBADYCAEGY0sUAQQA2AgAPC0GY0sUAIAA2AgBBkNLFAEGQ0sUAKAIAIAFqIgE2AgAgACABQQFyNgIEIAAgAWogATYCAAsLyQMCBX8BfiMAQUBqIgIkAAJAAkACQAJAAn8gACkDAFBFBEBBCCEDIAAMAQsgACkDCFBFBEBBECEDIABBCGoMAQsgACkDEFBFBEBBGCEDIABBEGoMAQsgACkDGFBFBEBBICEDIABBGGoMAQsgACkDIFBFBEBBKCEDIABBIGoMAQsgACkDKFANAUEwIQMgAEEoagshBiABKAIAIgRBqM/BAEECIAEoAgQiBSgCDBEDAEUNAUEBIQEMAwsgASgCAEG0z8EAQQMgASgCBCgCDBEDAEUNAUEBIQEMAgsgAiAGNgIgQQEhASACQQE2AiwgAkGsz8EANgIoIAJCATcCNCACQoCAgICwByIHIAJBIGqthDcDCCACIAJBCGo2AjAgBCAFIAJBKGoQqwINASAHIAJBBGqthCEHA0AgA0EwRg0BIAIgACADajYCBCACIAc3AyAgAkEBNgIcIAJBATYCDCACQazPwQA2AgggAkEBNgIUIAJCgICAgICEgIBpNwI4IAJCgIDAADcCMCACQQI7ASggA0EIaiEDIAIgAkEoajYCGCACIAJBIGo2AhAgBCAFIAJBCGoQqwJFDQALDAELQQAhAQsgAkFAayQAIAEL8AIBBn8jAEGgBWsiBCQAIAQgARBlIARBgANqIgUgBCAEED8gBEHgA2oiBiABIAEQ1QEgBEHgAGoiByAFIAYQjQEgBiABIAcQjQEgBSAEIAYQPyAEQaACaiAFIAFB4ABqIggQjQEgBEHAAWoiCSAHQeAA/AoAACAEQegEaiAEQShqKQMANwMAIARB4ARqIARBIGopAwA3AwAgBEHYBGogBEEYaikDADcDACAEQdAEaiAEQRBqKQMANwMAIARByARqIARBCGopAwA3AwAgBEH4BGogBEE4aikDADcDACAEQYAFaiAEQUBrKQMANwMAIARBiAVqIARByABqKQMANwMAIARBkAVqIARB0ABqKQMANwMAIARBmAVqIARB2ABqKQMANwMAIAQgBCkDADcDwAQgBCAEKQMwNwPwBCAGIAQgARA/IAUgBiAIEI0BIABBwAFqIARBwARqIAUgAiADECAgACAJQcAB/AoAACAEQaAFaiQAC/ADAQZ/IwBBMGsiAiQAIAIgATYCIAJAIAJBIGoQ4QRFBEBB5+/AAEEeEM0EIQMgAUGEAU8EQCABEKsDCyAAQYCAgIB4NgIAIAAgAzYCBAwBCyACIAE2AhwgAkGF8MAAQQEQzQQiATYCLCACQRBqIAJBHGogAkEsahCABCACKAIUIQMgAigCECEEIAFBhAFPBEAgARCrAwsCQAJAIARBAXEEQCAAQYCAgIB4NgIAIAAgAzYCBAwBCyACQSBqIAMQ7AIgAigCJCEBIAIoAiAiA0GAgICAeEYEQCAAQYCAgIB4NgIAIAAgATYCBAwBCyACKAIoIQYgAkGG8MAAQQEQzQQiBDYCLCACQQhqIAJBHGogAkEsahCABCACKAIMIQUgAigCCCEHIARBhAFPBEAgBBCrAwsCQCAHQQFxBEAgAEGAgICAeDYCACAAIAU2AgQMAQsgAkEgaiAFEOwCIAIoAiQhBCACKAIgIgVBgICAgHhHDQIgAEGAgICAeDYCACAAIAQ2AgQLIANFDQAgASADQQJ0EN8ECyACKAIcIgBBhAFJDQEgABCrAwwBCyAAIAIoAig2AhQgACAENgIQIAAgBTYCDCAAIAY2AgggACABNgIEIAAgAzYCACACKAIcIgBBhAFJDQAgABCrAwsgAkEwaiQAC54DAQx+IAIpAwAiCiEDIAEpAwAiCyEGIAACfgJAAn4CQCAKIAtSDQAgAikDCCIEIAEpAwgiBlIEQCAEIQMMAQsgAikDECIFIAEpAxAiBlIEQCAFIQMMAQsgBSEHIAIpAxgiAyEJIAQgAyABKQMYIgZRDQEaCyADIAZWDQEgAikDCCEEIAIpAxAhBSABKQMQIQcgAikDGCEDIAEpAxghCSABKQMICyEIIAcgBX0iDCADIAlWrSINfSEGIAggBH0iDiAMIA1UIAUgB1ZyrSIHfSEFIAcgDlYgBCAIVnIhAiALIAp9IQQgCSADfQwBCyACKQMQIgMgASkDECIFVCADIAV9IgMgAikDGCIFIAEpAxgiBFStIghUcq0iByACKQMIIgkgASkDCCIMfSINQn+FfCIGIANCf4UgCHwiAyAFIAR9IghCbVatIgRUrSIOfSEFIAYgDlQhAiADIAR9IQYgCSAMVCAHIA1Wcq0gCyAKfXxC////////////AHwhBEJtIAh9CzcDGCAAIAY3AxAgACAFNwMIIAAgBCACrX03AwALnQMBDH4gAikDACIKIQMgASkDACILIQYgAAJ+AkACfgJAIAogC1INACACKQMIIgQgASkDCCIGUgRAIAQhAwwBCyACKQMQIgUgASkDECIGUgRAIAUhAwwBCyAFIQcgAikDGCIDIQkgBCADIAEpAxgiBlENARoLIAMgBlYNASACKQMIIQQgAikDECEFIAEpAxAhByACKQMYIQMgASkDGCEJIAEpAwgLIQggByAFfSIMIAMgCVatIg19IQYgCCAEfSIOIAwgDVQgBSAHVnKtIgd9IQUgByAOViAEIAhWciECIAsgCn0hBCAJIAN9DAELIAIpAxAiAyABKQMQIgVUIAMgBX0iAyACKQMYIgUgASkDGCIEVK0iCFRyrSIHIAIpAwgiCSABKQMIIgx9Ig1Cf4V8IgYgA0J/hSAIfCIDIAUgBH0iCEKv+P//b1atIgRUrSIOfSEFIAYgDlQhAiADIAR9IQYgCSAMVCAHIA1Wcq0gCyAKQn+FfHwhBEKv+P//byAIfQs3AxggACAGNwMQIAAgBTcDCCAAIAQgAq19NwMAC5kDAQx+IAIpAwAiCiEDIAEpAwAiCyEFIAACfgJAAn4CQCAKIAtSDQAgAikDCCIGIAEpAwgiBVIEQCAGIQMMAQsgAikDECIEIAEpAxAiBVIEQCAEIQMMAQsgBCEHIAIpAxgiAyEIIAYgAyABKQMYIgVRDQEaCyADIAVWDQEgAikDCCEGIAIpAxAhBCABKQMQIQcgAikDGCEDIAEpAxghCCABKQMICyEJIAcgBH0iDCADIAhWrSINfSEFIAkgBn0iDiAMIA1UIAQgB1ZyrSIHfSEEIAcgDlYgBiAJVnIhAiALIAp9IQYgCCADfQwBCyACKQMQIgMgASkDECIEVCADIAR9IgQgAikDGCIJIAEpAxgiB1StIgVUcq0iAyACKQMIIgggASkDCCIMfSIGfSINIAQgBX0iBUL/////D1atIg59IQQgAyAGUiANIA5UciECQv////8PIAV9IQUgCCAMVCADIAZWcq0gCyAKfXxC/////w99IQYgByAJQn+FfAs3AxggACAFNwMQIAAgBDcDCCAAIAYgAq19NwMAC/4CAQF/IAAoAgAiAQRAIAAoAgQgAUECdBDfBAsgACgCDCIBBEAgACgCECABQQJ0EN8ECyAAKAIYIgEEQCAAKAIcIAFBAnQQ3wQLIAAoAiQiAQRAIAAoAiggAUECdBDfBAsgACgCMCIBBEAgACgCNCABQQJ0EN8ECyAAKAI8IgEEQCAAKAJAIAFBAnQQ3wQLIAAoAkgiAQRAIAAoAkwgAUECdBDfBAsgACgCVCIBBEAgACgCWCABQQJ0EN8ECyAAKAJgIgEEQCAAKAJkIAFBAnQQ3wQLIAAoAmwiAQRAIAAoAnAgAUECdBDfBAsgACgCeCIBBEAgACgCfCABQQJ0EN8ECyAAKAKEASIBBEAgACgCiAEgAUECdBDfBAsgACgCkAEiAQRAIAAoApQBIAFBAnQQ3wQLIAAoApwBIgEEQCAAKAKgASABQQJ0EN8ECyAAKAKoASIBBEAgACgCrAEgAUECdBDfBAsgACgCtAEiAQRAIAAoArgBIAFBAnQQ3wQLC+ADAgl+BH8gAigCBCEMIAIoAgAgACABRwRAIAIoAgggDEEwbGohDyAMIAEgAGtBMG4iDWohDEEAIQEDQAJ+IAAgAWoiAkHw98AAQTAQ8QMEQEL//8+K6///1R4gAkEgaikDACIGfSIEIAJBKGopAwAiB0Kr1f7///+//7l/Vq0iBX0hCUKk7MO1j9S0mOcAIAJBGGopAwAiA30iCCAEIAVUIAZC///Piuv//9UeVnKtIgR9IQZCv6WUnM/w0rvkACACQRBqKQMAIgV9IgogBCAIViADQqTsw7WP1LSY5wBWcq0iA30hBELX2a6a5PbpjcsAIAJBCGopAwAiCH0iCyADIApWIAVCv6WUnM/w0rvkAFZyrSIDfSEFQqvV/v///7//uX8gB30hB0Kazf/Lo73EgBogAikDACADIAtWIAhC19mumuT26Y3LAFZyrXx9DAELIAJBKGopAwAhByACQSBqKQMAIQkgAkEYaikDACEGIAJBEGopAwAhBCACQQhqKQMAIQUgAikDAAshAyABIA9qIgIgAzcDACACQShqIAc3AwAgAkEgaiAJNwMAIAJBGGogBjcDACACQRBqIAQ3AwAgAkEIaiAFNwMAIAFBMGohASANQQFrIg0NAAsLIAw2AgALgwMCCX8BfiMAQRBrIgUkACAFQQA2AgwgBUKAgICAEDcCBAJ/QQEgASAChFANABoDQCAFKAIEIARGBEAgBUEEakHE2sIAELYDCyAFKAIIIARqIAE8AAAgBSAEQQFqIgQ2AgwgAkI4hiABQoACVCEDIAJQIQYgAkIIiCECIAFCCIiEIQEgAyAGcUUNAAtBASEDIAUoAggiBiAEQQFGDQAaQQAhAyAEQQF2IgdBAUcEQCAEQQFrIQggB0H+////B3EhCgNAIAYgCGoiBy0AACEJIAcgAyAGaiIHLQAAOgAAIAcgCToAACAGIANBfnNqIARqIgktAAAhCyAJIAdBAWoiBy0AADoAACAHIAs6AAAgCEECayEIIAogA0ECaiIDRw0ACwsgBEECcQRAIAMgBmoiCC0AACEHIAggBiADayAEakEBayIDLQAAOgAAIAMgBzoAAAsgBSgCDCEDIAUoAggLIQYgBSgCBCEEIAAgBiADEIYBIAQEQCAGIAQQ3wQLIAVBEGokAAvjAgELfyMAQSBrIgckACABIANPBEACQCADRQ0AIANBAXECQCADQQFGBEAMAQsgA0F+cSELIAIhBSAAIQQDQCAEIAYgBCgCACIMIAUoAgBqIgZqIg02AgAgBEEEaiIIIAgoAgAiDiAFQQRqKAIAaiIIIAYgDEkgBiANS3JqIgY2AgAgCCAOSSAGIAhJciIIIQYgBUEIaiEFIARBCGohBCALIAlBAmoiCUcNAAsLBH8gACAJQQJ0IgVqIgQgBCgCACIEIAIgBWooAgBqIgIgBmoiBTYCACACIARJIAIgBUtyBSAIC0UgASADRnINACAAIANBAnQiAmohBCABQQJ0IAJrQQRrIQUDQCAEIAQoAgBBAWoiADYCACAADQEgBEEEaiEEIAUgBUEEayEFDQALCyAHQSBqJAAPCyAHQQA2AhggB0EBNgIMIAdBlIfFADYCCCAHQgQ3AhAgB0EIakGEiMUAEKgEAAuBBwEMfyMAQTBrIgQkACAEIAM6AAcCQAJAIANB/wFxIgMEQCADQSBLDQEgBCACNgIMIAQgATYCCCAEQSAgA242AhAgBCAEQQdqNgIUIARBGGohDEEAIQEjAEEQayIFJAAgBEEIaiICKAIIIQYCQAJAAkACQCACKAIEIgMEQCAGRQ0BIAMgBm4gAyAGcEEAR2ohAQsgAUH/////A0sgAUECdCIHQfz///8HS3INAQJAIAdFBEBBBCEKQQAhAQwBC0HRzsUALQAAGkEEIQggB0EEENYEIgpFDQILIAVBADYCDCAFIAo2AgggBSABNgIEIAMEQCAGRQ0DIAIoAgwhDyACKAIAIQ0gASADIAZuIgIgAyACIAZsR2oiAkkEQCAFQQRqQQAgAhCJAyAFKAIIIQogBSgCDCEJCwNAIA8tAABBH3EhByAGIAMgAyAGSxsiC0EDcSEIQQAhASALIA1qIg0hAiALQQRPBEAgC0F8cSEOA0AgAkEDay0AACACQQJrLQAAIAJBAWstAAAgASAHdHIgB3RyIAd0ciAHdCACQQRrIgItAAByIQEgDkEEayIODQALCyAIBEAgAkEBayECA0AgAi0AACABIAd0ciEBIAJBAWshAiAIQQFrIggNAAsLIAogCUECdGogATYCACAJQQFqIQkgAyALayIDDQALCyAMIAUpAgQ3AgAgDEEIaiAJNgIAIAVBEGokAAwDC0GEhMUAEJoEAAsgCCAHQfjMxAAQyAQAC0GEhMUAEJoEAAsgBCgCICIBRQRAQQAhAQwDCyAEKAIcIgIgAUECdCIDakEEaygCAA0CIAJBBGshBSABQf////8DcSECAkADQCADRQRAQQAhAwwCCyACQQFrIQIgAyAFaiADQQRrIQMoAgBFDQALIAJBAWoiAyABSw0DCyAEIAM2AiAgAyEBDAILQdzLxAAQmgQACyAEQQA2AiggBEEBNgIcIARBiMzEADYCGCAEQgQ3AiAgBEEYakGQzMQAEKgEAAsCQCABIAQoAhgiAkECdk8gAkVyRQRAIAQoAhwhAyACQQJ0IQUCQCABRQRAQQQhAiADIAUQ3wQMAQsgAyAFQQQgAUECdCIDEM4EIgJFDQILIAQgATYCGCAEIAI2AhwLIAAgBCkCGDcCACAAQQhqIARBIGooAgA2AgAgBEEwaiQADwtBBCADQfzxxAAQyAQAC4IDAQR/IAAoAgAiAQRAIAAoAgQgAUECdBDfBAsgACgCDCIBBEAgACgCECABQQJ0EN8ECyAAKAIYIgEEQCAAKAIcIAFBAnQQ3wQLIAAoAiQiAQRAIAAoAiggAUECdBDfBAsgACgCMCIBBEAgACgCNCABQQJ0EN8ECyAAKAI8IgEEQCAAKAJAIAFBAnQQ3wQLIAAoAkgiAQRAIAAoAkwgAUECdBDfBAsgACgCVCIBBEAgACgCWCABQQJ0EN8ECyAAKAJkIQEgACgCaCIDBEAgASECA0AgAigCACIEBEAgAkEEaigCACAEQQJ0EN8ECyACQQxqIQIgA0EBayIDDQALCyAAKAJgIgIEQCABIAJBDGwQ3wQLAkAgACgCbCIBQYCAgIB4Rg0AIAEEQCAAKAJwIAEQ3wQLIAAoAngiAUUNACAAKAJ8IAEQ3wQLAkAgACgChAEiAUGAgICAeEYNACABBEAgACgCiAEgARDfBAsgACgCkAEiAUUNACAAKAKUASABEN8ECwuWBwIJfgJ/IwBBIGsiDCQAIwBBQGoiCyQAQpGAgICAgICACCEJIAtBMGpCACABKQMYfSICQgBCkYCAgICAgIAIQgAQyQMgC0IAIAJCAFKtIgQgASkDEHwiAn1CAEKRgICAgICAgAhCABDJAyALQRBqQgAgAkIAUq0iAyACIARUrSIEIAEpAwh8IgV8IgJ9QgBCkYCAgICAgIAIQgAQyQMgC0EgakIAIAJCAFKtIgcgAiADVK0iAyALKQMwIgggASkDAHwiAiAEIAVWrXwiBXwiCnwiBH1CAEKRgICAgICAgAhCABDJAwJAIAspAyggCykDGCALKQMIIAIgBVatIAspAzggAiAIVK18fCIFIAspAwB8IgIgBVStfCACIAMgClatfCIDIAJUrXwiBSALKQMQfCICIAVUrXwgAiACIAMgBCAHVK0iA3wiByADVK18IgJWrXwiAyALKQMgfCIFIANUrXwgBSAFIAIgBEIAUq0iBCAHfCICIARUrSIDfCIEIANUrXwiA1atfCIIQpGAgICAgICACFQEQCACIQYgBCEFIAMhByAIIQkMAQtCACEFQgAhByACIASEIAOEUA0AIAJCAX0hBiAEIAJQrSICfSEFIAMgAiAEVq0iAn0hByAIIAIgA1atfUKRgICAgICAgAh9IQkLIAwgBjcDGCAMIAU3AxAgDCAHNwMIIAwgCTcDACALQUBrJAAgDCkDACECIAwpAwghBCAMKQMQIQMgACAMKQMYIgZCOIYgBkKA/gODQiiGhCAGQoCA/AeDQhiGIAZCgICA+A+DQgiGhIQgBkIIiEKAgID4D4MgBkIYiEKAgPwHg4QgBkIoiEKA/gODIAZCOIiEhIQ3ABggACADQjiGIANCgP4Dg0IohoQgA0KAgPwHg0IYhiADQoCAgPgPg0IIhoSEIANCCIhCgICA+A+DIANCGIhCgID8B4OEIANCKIhCgP4DgyADQjiIhISENwAQIAAgBEI4hiAEQoD+A4NCKIaEIARCgID8B4NCGIYgBEKAgID4D4NCCIaEhCAEQgiIQoCAgPgPgyAEQhiIQoCA/AeDhCAEQiiIQoD+A4MgBEI4iISEhDcACCAAIAJCOIYgAkKA/gODQiiGhCACQoCA/AeDQhiGIAJCgICA+A+DQgiGhIQgAkIIiEKAgID4D4MgAkIYiEKAgPwHg4QgAkIoiEKA/gODIAJCOIiEhIQ3AAAgDEEgaiQAC5EDAQd/IwBBEGsiBCQAAkACQAJAAkAgASgCBCICBEAgASgCACEHIAJBA3EhBQJAIAJBBEkEQEEAIQIMAQsgB0EcaiEDIAJBfHEhCEEAIQIDQCADKAIAIANBCGsoAgAgA0EQaygCACADQRhrKAIAIAJqampqIQIgA0EgaiEDIAggBkEEaiIGRw0ACwsgBQRAIAZBA3QgB2pBBGohAwNAIAMoAgAgAmohAiADQQhqIQMgBUEBayIFDQALCyABKAIMRQ0CIAJBD0sNASAHKAIEDQEMAwtBACECIAEoAgxFDQILIAJBACACQQBKG0EBdCECC0EAIQUgAkEATgRAIAJFDQFB0c7FAC0AABpBASEFIAJBARDWBCIDDQILIAUgAkH8rMUAEMgEAAtBASEDQQAhAgsgBEEANgIIIAQgAzYCBCAEIAI2AgAgBEH8q8UAIAEQqwJFBEAgACAEKQIANwIAIABBCGogBEEIaigCADYCACAEQRBqJAAPC0GcrcUAQdYAIARBD2pBjK3FAEGMrsUAEMoDAAufAwIFfwF+IwBBQGoiAiQAAkACQAJAAkACfyAAKQMAUEUEQEEIIQMgAAwBCyAAKQMIUEUEQEEQIQMgAEEIagwBCyAAKQMQUEUEQEEYIQMgAEEQagwBCyAAKQMYUA0BQSAhAyAAQRhqCyEGIAEoAgAiBEGoz8EAQQIgASgCBCIFKAIMEQMARQ0BQQEhAQwDCyABKAIAQbTPwQBBAyABKAIEKAIMEQMARQ0BQQEhAQwCCyACIAY2AiBBASEBIAJBATYCLCACQazPwQA2AiggAkIBNwI0IAJCgICAgLAHIgcgAkEgaq2ENwMIIAIgAkEIajYCMCAEIAUgAkEoahCrAg0BIAcgAkEEaq2EIQcDQCADQSBGDQEgAiAAIANqNgIEIAIgBzcDICACQQE2AhwgAkEBNgIMIAJBrM/BADYCCCACQQE2AhQgAkKAgICAgISAgGk3AjggAkKAgMAANwIwIAJBAjsBKCADQQhqIQMgAiACQShqNgIYIAIgAkEgajYCECAEIAUgAkEIahCrAkUNAAsMAQtBACEBCyACQUBrJAAgAQvpAgEFfwJAIAFBzf97QRAgACAAQRBNGyIAa08NACAAQRAgAUELakF4cSABQQtJGyIEakEMahBTIgJFDQAgAkEIayEBAkAgAEEBayIDIAJxRQRAIAEhAAwBCyACQQRrIgUoAgAiBkF4cSACIANqQQAgAGtxQQhrIgIgAEEAIAIgAWtBEE0baiIAIAFrIgJrIQMgBkEDcQRAIAAgAyAAKAIEQQFxckECcjYCBCAAIANqIgMgAygCBEEBcjYCBCAFIAIgBSgCAEEBcXJBAnI2AgAgASACaiIDIAMoAgRBAXI2AgQgASACEMQCDAELIAEoAgAhASAAIAM2AgQgACABIAJqNgIACwJAIAAoAgQiAUEDcUUNACABQXhxIgIgBEEQak0NACAAIAQgAUEBcXJBAnI2AgQgACAEaiIBIAIgBGsiBEEDcjYCBCAAIAJqIgIgAigCBEEBcjYCBCABIAQQxAILIABBCGohAwsgAwuFAwEEfyMAQbABayICJAAgAkEANgIQIAJCgICAgMAANwIIIAJBFGogAS0AMBDpAyACQQhqIgVB3N/AABCfAyACKAIMIgMgAikCFDcCACADQQhqIAJBHGooAgA2AgAgAkEBNgIQIAJBIGoiBCABEN8BIAJB+ABqIAQQ1AEgAigCCCACKAIQIgRrQQNNBEAgBSAEQQRBBEEMEIgDIAIoAhAhBAsgAigCDCAEQQxsaiIDIAIpAng3AgAgA0EIaiACQYABaikCADcCACADQRBqIAJBiAFqKQIANwIAIANBGGogAkGQAWopAgA3AgAgA0EgaiACQZgBaikCADcCACADQShqIAJBoAFqKQIANwIAIAIgBEEEajYCECACQewAaiABLQAxEOkDIAIoAhAiASACKAIIRgRAIAJBCGpB7N/AABCfAwsgAigCDCABQQxsaiIDIAIpAmw3AgAgA0EIaiACQfQAaigCADYCACAAQQhqIAFBAWo2AgAgACACKQIINwIAIAJBsAFqJAALhwMBBn8CQAJAIAJB/////wNLIAJBAnQiA0H8////B0tyDQACfyADRQRAQQQhBEEADAELQdHOxQAtAAAaQQQhBSADQQQQ1gQiBEUNASACCyEGIAMEQCAEIAEgA/wKAAALQQAhASACRQ0BIAQgAkECdGpBBGsoAgAEQCACIQEMAgsgBEEEayEHIAIhBQNAIANFDQIgBUEBayEFIAMgB2ogA0EEayEDKAIARQ0ACyAFQQFqIgEgAiABIAJJGyEBDAELIAUgA0H4wsQAEMgEAAsCQAJAAkAgBkECdiABTQRAIAENASAAQQhqQYDExAApAgA3AgAgAEH4w8QAKQIANwIAIAZFDQIgBCAGQQJ0EN8EDwsgBkECdCECIAFFBEAgBCACEN8EIABBCGpBgMTEACkCADcCACAAQfjDxAApAgA3AgAPCyABIQYgBCACQQQgAUECdCICEM4EIgRFDQILIABBAjoADCAAIAE2AgggACAENgIEIAAgBjYCAAsPC0EEIAJBtMnEABDIBAAL/QIBCX8jAEEQayIFJAAgBUEEaiABEOoBIAUoAgghBwJAAkAgBSgCDCICRQRAIABBCGpBuMzCACgCADYCACAAQbDMwgApAgA3AgAMAQtBACEBIAJBAEgNAUHRzsUALQAAGkEBIQEgAkEBENYEIgRFDQEgAgRAIAQgByAC/AoAAAsgACAEAn9BASACQQFGDQAaIAIgBGohCEEAIQEgAkEBdiIDQQFHBEAgAkEBayEAIANB/v///wNxIQoDQCAAIARqIgYtAAAhAyAGIAEgBGoiCS0AADoAACAJIAM6AAAgCCABQX5zaiIDLQAAIQYgAyAJQQFqIgMtAAA6AAAgAyAGOgAAIABBAmshACAKIAFBAmoiAUcNAAsLIAIgAkECcUUNABogASAEaiIDLQAAIQAgAyAIIAFBf3NqIgEtAAA6AAAgASAAOgAAIAILQQgQzwIgBCACEN8ECyAFKAIEIgAEQCAHIAAQ3wQLIAVBEGokAA8LIAEgAkHU2MIAEMgEAAv9AgEJfyMAQRBrIgUkACAFQQRqIAEQnwEgBSgCCCEHAkACQCAFKAIMIgJFBEAgAEEIakG4zMIAKAIANgIAIABBsMzCACkCADcCAAwBC0EAIQEgAkEASA0BQdHOxQAtAAAaQQEhASACQQEQ1gQiBEUNASACBEAgBCAHIAL8CgAACyAAIAQCf0EBIAJBAUYNABogAiAEaiEIQQAhASACQQF2IgNBAUcEQCACQQFrIQAgA0H+////A3EhCgNAIAAgBGoiBi0AACEDIAYgASAEaiIJLQAAOgAAIAkgAzoAACAIIAFBfnNqIgMtAAAhBiADIAlBAWoiAy0AADoAACADIAY6AAAgAEECayEAIAogAUECaiIBRw0ACwsgAiACQQJxRQ0AGiABIARqIgMtAAAhACADIAggAUF/c2oiAS0AADoAACABIAA6AAAgAgtBCBDPAiAEIAIQ3wQLIAUoAgQiAARAIAcgABDfBAsgBUEQaiQADwsgASACQdTYwgAQyAQAC/0CAQl/IwBBEGsiBSQAIAVBBGogARDJASAFKAIIIQcCQAJAIAUoAgwiAkUEQCAAQQhqQbjMwgAoAgA2AgAgAEGwzMIAKQIANwIADAELQQAhASACQQBIDQFB0c7FAC0AABpBASEBIAJBARDWBCIERQ0BIAIEQCAEIAcgAvwKAAALIAAgBAJ/QQEgAkEBRg0AGiACIARqIQhBACEBIAJBAXYiA0EBRwRAIAJBAWshACADQf7///8DcSEKA0AgACAEaiIGLQAAIQMgBiABIARqIgktAAA6AAAgCSADOgAAIAggAUF+c2oiAy0AACEGIAMgCUEBaiIDLQAAOgAAIAMgBjoAACAAQQJrIQAgCiABQQJqIgFHDQALCyACIAJBAnFFDQAaIAEgBGoiAy0AACEAIAMgCCABQX9zaiIBLQAAOgAAIAEgADoAACACC0EIEM8CIAQgAhDfBAsgBSgCBCIABEAgByAAEN8ECyAFQRBqJAAPCyABIAJB1NjCABDIBAAL/QIBCX8jAEEQayIFJAAgBUEEaiABEL4BIAUoAgghBwJAAkAgBSgCDCICRQRAIABBCGpBuMzCACgCADYCACAAQbDMwgApAgA3AgAMAQtBACEBIAJBAEgNAUHRzsUALQAAGkEBIQEgAkEBENYEIgRFDQEgAgRAIAQgByAC/AoAAAsgACAEAn9BASACQQFGDQAaIAIgBGohCEEAIQEgAkEBdiIDQQFHBEAgAkEBayEAIANB/v///wNxIQoDQCAAIARqIgYtAAAhAyAGIAEgBGoiCS0AADoAACAJIAM6AAAgCCABQX5zaiIDLQAAIQYgAyAJQQFqIgMtAAA6AAAgAyAGOgAAIABBAmshACAKIAFBAmoiAUcNAAsLIAIgAkECcUUNABogASAEaiIDLQAAIQAgAyAIIAFBf3NqIgEtAAA6AAAgASAAOgAAIAILQQgQzwIgBCACEN8ECyAFKAIEIgAEQCAHIAAQ3wQLIAVBEGokAA8LIAEgAkHU2MIAEMgEAAv9AgEJfyMAQRBrIgUkACAFQQRqIAEQlAIgBSgCCCEHAkACQCAFKAIMIgJFBEAgAEEIakG4zMIAKAIANgIAIABBsMzCACkCADcCAAwBC0EAIQEgAkEASA0BQdHOxQAtAAAaQQEhASACQQEQ1gQiBEUNASACBEAgBCAHIAL8CgAACyAAIAQCf0EBIAJBAUYNABogAiAEaiEIQQAhASACQQF2IgNBAUcEQCACQQFrIQAgA0H+////A3EhCgNAIAAgBGoiBi0AACEDIAYgASAEaiIJLQAAOgAAIAkgAzoAACAIIAFBfnNqIgMtAAAhBiADIAlBAWoiAy0AADoAACADIAY6AAAgAEECayEAIAogAUECaiIBRw0ACwsgAiACQQJxRQ0AGiABIARqIgMtAAAhACADIAggAUF/c2oiAS0AADoAACABIAA6AAAgAgtBCBDPAiAEIAIQ3wQLIAUoAgQiAARAIAcgABDfBAsgBUEQaiQADwsgASACQdTYwgAQyAQAC/0CAQl/IwBBEGsiBSQAIAVBBGogARC/ASAFKAIIIQcCQAJAIAUoAgwiAkUEQCAAQQhqQbjMwgAoAgA2AgAgAEGwzMIAKQIANwIADAELQQAhASACQQBIDQFB0c7FAC0AABpBASEBIAJBARDWBCIERQ0BIAIEQCAEIAcgAvwKAAALIAAgBAJ/QQEgAkEBRg0AGiACIARqIQhBACEBIAJBAXYiA0EBRwRAIAJBAWshACADQf7///8DcSEKA0AgACAEaiIGLQAAIQMgBiABIARqIgktAAA6AAAgCSADOgAAIAggAUF+c2oiAy0AACEGIAMgCUEBaiIDLQAAOgAAIAMgBjoAACAAQQJrIQAgCiABQQJqIgFHDQALCyACIAJBAnFFDQAaIAEgBGoiAy0AACEAIAMgCCABQX9zaiIBLQAAOgAAIAEgADoAACACC0EIEM8CIAQgAhDfBAsgBSgCBCIABEAgByAAEN8ECyAFQRBqJAAPCyABIAJB1NjCABDIBAALkwMCCH4BfwJAAkAgAUHo0cEAQSAQ8QNFBEAgAUEgaiIKQejRwQBBIBDxA0UNAQsgASkDOCEDIAEpAzAhAiABKQMoIQUgASkDICEGAkAgAUEgakHo0cEAQSAQ8QNFBEAgBSEEIAIhBwwBC0KNlcfDltLawJd/IAJ9IgQgA0LH+vPD7YKjkDxWrSIIfSEHQt2whYzotpGouH8gBX0iCSAEIAhUIAJCjZXHw5bS2sCXf1ZyrSICfSEEQqnAxomuzpOyMCACIAlWIAVC3bCFjOi2kai4f1ZyrSAGfH0hBkLH+vPD7YKjkDwgA30hAwsgACADNwM4IAAgBzcDMCAAIAQ3AyggACAGNwMgIAAgASkDADcDAAwBCyAAIAopAwA3AyAgACABKQMANwMAIABBOGogCkEYaikDADcDACAAQTBqIApBEGopAwA3AwAgAEEoaiAKQQhqKQMANwMACyAAQQhqIAFBCGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBGGogAUEYaikDADcDACAAIAEtAEA6AEAL5wIBCH8jAEEQayIGJABBCiEDIAAiBEHoB08EQCAEIQUDQCAGQQZqIANqIgdBA2sgBSAFQZDOAG4iBEGQzgBsayIIQf//A3FB5ABuIglBAXQiCkH+t8UAai0AADoAACAHQQRrIApB/bfFAGotAAA6AAAgB0EBayAIIAlB5ABsa0H//wNxQQF0IghB/rfFAGotAAA6AAAgB0ECayAIQf23xQBqLQAAOgAAIANBBGshAyAFQf+s4gRLIAQhBQ0ACwsCQCAEQQlNBEAgBCEFDAELIAMgBmpBBWogBCAEQf//A3FB5ABuIgVB5ABsa0H//wNxQQF0IgRB/rfFAGotAAA6AAAgA0ECayIDIAZBBmpqIARB/bfFAGotAAA6AAALQQAgACAFG0UEQCADQQFrIgMgBkEGamogBUEBdEEecUH+t8UAai0AADoAAAsgAiABQQFBACAGQQZqIANqQQogA2sQiQIgBkEQaiQAC+ECAQJ/IwBBEGsiAiQAAkAgAUGAAU8EQCACQQA2AgwCfyABQYAQTwRAIAFBgIAETwRAIAIgAUE/cUGAAXI6AA8gAiABQRJ2QfABcjoADCACIAFBBnZBP3FBgAFyOgAOIAIgAUEMdkE/cUGAAXI6AA0gAkEQagwCCyACIAFBP3FBgAFyOgAOIAIgAUEMdkHgAXI6AAwgAiABQQZ2QT9xQYABcjoADSACQQxqQQNyDAELIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADCACQQxqQQJyCyACQQxqayIBIAAoAgAgACgCCCIDa0sEQCAAIAMgAUEBQQEQiAMgACgCCCEDCyABBEAgACgCBCADaiACQQxqIAH8CgAACyAAIAEgA2o2AggMAQsgACgCCCIDIAAoAgBGBEAgAEH02MEAELYDCyAAKAIEIANqIAE6AAAgACADQQFqNgIICyACQRBqJABBAAuCAwEEfyAAKAIMIQICQAJAAkAgAUGAAk8EQCAAKAIYIQMCQAJAIAAgAkYEQCAAQRRBECAAKAIUIgIbaigCACIBDQFBACECDAILIAAoAggiASACNgIMIAIgATYCCAwBCyAAQRRqIABBEGogAhshBANAIAQhBSABIgJBFGogAkEQaiACKAIUIgEbIQQgAkEUQRAgARtqKAIAIgENAAsgBUEANgIACyADRQ0CAkAgACgCHEECdEHwzsUAaiIBKAIAIABHBEAgAygCECAARg0BIAMgAjYCFCACDQMMBAsgASACNgIAIAJFDQQMAgsgAyACNgIQIAINAQwCCyAAKAIIIgAgAkcEQCAAIAI2AgwgAiAANgIIDwtBiNLFAEGI0sUAKAIAQX4gAUEDdndxNgIADwsgAiADNgIYIAAoAhAiAQRAIAIgATYCECABIAI2AhgLIAAoAhQiAEUNACACIAA2AhQgACACNgIYDwsPC0GM0sUAQYzSxQAoAgBBfiAAKAIcd3E2AgAL4gIBBH8jAEEQayICJAACQCABQYABTwRAIAJBDGoiBEECciEDIAJBADYCDAJAIAFBgBBPBEAgBEEDciEFIAFBgIAETwRAIAJBEGohAyACIAFBEnZB8AFyOgAMIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADSAFIQQMAgsgAiABQQx2QeABcjoADCACIAFBBnZBP3FBgAFyOgANIAMhBCAFIQMMAQsgAkEMakEBciEEIAIgAUEGdkHAAXI6AAwLIAQgAUE/cUGAAXI6AAAgAyACQQxqayIBIAAoAgAgACgCCCIDa0sEQCAAIAMgAUEBQQEQiAMgACgCCCEDCyABBEAgACgCBCADaiACQQxqIAH8CgAACyAAIAEgA2o2AggMAQsgACgCCCIDIAAoAgBGBEAgAEGEosAAELYDCyAAKAIEIANqIAE6AAAgACADQQFqNgIICyACQRBqJABBAAviAgEEfyMAQRBrIgIkAAJAIAFBgAFPBEAgAkEMaiIEQQJyIQMgAkEANgIMAkAgAUGAEE8EQCAEQQNyIQUgAUGAgARPBEAgAkEQaiEDIAIgAUESdkHwAXI6AAwgAiABQQZ2QT9xQYABcjoADiACIAFBDHZBP3FBgAFyOgANIAUhBAwCCyACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA0gAyEEIAUhAwwBCyACQQxqQQFyIQQgAiABQQZ2QcABcjoADAsgBCABQT9xQYABcjoAACADIAJBDGprIgEgACgCACAAKAIIIgNrSwRAIAAgAyABQQFBARCIAyAAKAIIIQMLIAEEQCAAKAIEIANqIAJBDGogAfwKAAALIAAgASADajYCCAwBCyAAKAIIIgMgACgCAEYEQCAAQZSBwQAQtgMLIAAoAgQgA2ogAToAACAAIANBAWo2AggLIAJBEGokAEEAC+ICAQR/IwBBEGsiAiQAAkAgAUGAAU8EQCACQQxqIgRBAnIhAyACQQA2AgwCQCABQYAQTwRAIARBA3IhBSABQYCABE8EQCACQRBqIQMgAiABQRJ2QfABcjoADCACIAFBBnZBP3FBgAFyOgAOIAIgAUEMdkE/cUGAAXI6AA0gBSEEDAILIAIgAUEMdkHgAXI6AAwgAiABQQZ2QT9xQYABcjoADSADIQQgBSEDDAELIAJBDGpBAXIhBCACIAFBBnZBwAFyOgAMCyAEIAFBP3FBgAFyOgAAIAMgAkEMamsiASAAKAIAIAAoAggiA2tLBEAgACADIAFBAUEBEIgDIAAoAgghAwsgAQRAIAAoAgQgA2ogAkEMaiAB/AoAAAsgACABIANqNgIIDAELIAAoAggiAyAAKAIARgRAIABB/JnCABC2AwsgACgCBCADaiABOgAAIAAgA0EBajYCCAsgAkEQaiQAQQAL4gIBBH8jAEEQayICJAACQCABQYABTwRAIAJBDGoiBEECciEDIAJBADYCDAJAIAFBgBBPBEAgBEEDciEFIAFBgIAETwRAIAJBEGohAyACIAFBEnZB8AFyOgAMIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADSAFIQQMAgsgAiABQQx2QeABcjoADCACIAFBBnZBP3FBgAFyOgANIAMhBCAFIQMMAQsgAkEMakEBciEEIAIgAUEGdkHAAXI6AAwLIAQgAUE/cUGAAXI6AAAgAyACQQxqayIBIAAoAgAgACgCCCIDa0sEQCAAIAMgAUEBQQEQiAMgACgCCCEDCyABBEAgACgCBCADaiACQQxqIAH8CgAACyAAIAEgA2o2AggMAQsgACgCCCIDIAAoAgBGBEAgAEGg1cIAELYDCyAAKAIEIANqIAE6AAAgACADQQFqNgIICyACQRBqJABBAAv1CgEPfyMAQSBrIgckACABKAIIIgRBAnQhAgJAIARB/////wNLIAJB/P///wdLcg0AIAEtAAwhDiABKAIEIQMCfyACRQRAQQQhAUEADAELQdHOxQAtAAAaQQQhCCACQQQQ1gQiAUUNASAECyEIIAIEQCABIAMgAvwKAAALIAcgBDYCHCAHIAE2AhggByAINgIUIAdBCGohCkECIQgjAEEwayIBJAAgB0EUaiIDKAIIIQIgAygCBCEEIAMoAgAhCSABQSBqIQMCQAJAAkACQAJAA0ACQAJAAkACQCACDgIAAQILIANBtLzEACgCADYCACABQay8xAApAgA3AxgMAgsgBCgCACEGQdHOxQAtAAAaQQRBBBDWBCICRQ0DIAFBLGoiBUEBNgIAIAIgBCgCADYCACABIAI2AiggAUEBNgIkIAFBJGogBhCzAiADIAUoAgA2AgAgASABKQIkNwMYDAELIAFBGGogBCACIAQgAhDtAgsgCQRAIAQgCUECdBDfBAsgCEECcSABKAIgIQIgASgCHCEEIAEoAhghCSAIQQF2IQhFDQALIAhBAUYEQCAKIAI2AgggCiAENgIEIAogCTYCAAwFC0EAIQUgAkH/////A0sgAkECdCIDQfz///8HS3INAQJ/IANFBEBBBCEGQQAMAQtB0c7FAC0AABpBBCEFIANBBBDWBCIGRQ0CIAILIQUgAwRAIAYgBCAD/AoAAAsgASACNgIUIAEgBjYCECABIAU2AgwgCEUNAyABQSBqIQ8DQAJAAkACQAJAIAIOAgABAgsgD0G0vMQAKAIANgIAIAFBrLzEACkCADcDGAwCCyAEKAIAIQNB0c7FAC0AABpBBEEEENYEIgJFDQUgAUEsaiIGQQE2AgAgAiAEKAIANgIAIAEgAjYCKCABQQE2AiQgAUEkaiADELMCIA8gBigCADYCACABIAEpAiQ3AxgMAQsgAUEYaiAEIAIgBCACEO0CCyAJBEAgBCAJQQJ0EN8ECyABKAIgIQIgASgCHCEEIAEoAhghCSAIQQJxBEACQCMAQSBrIgMkAAJAAkAgAUEMaiIGKAIIIgVFDQACQAJAAkAgAg4CAAECCyAGQQA2AggMAgsgBiAEKAIAELMCDAELIAYoAgQhDCAFQQFGBEBBACENIAJB/////wNLIAJBAnQiBUH8////B0tyDQIgDCgCACEQAn8gBUUEQEEEIQtBAAwBC0HRzsUALQAAGkEEIQ0gBUEEENYEIgtFDQMgAgshDSAFBEAgCyAEIAX8CgAACyADQRxqIgUgAjYCACADIAs2AhggAyANNgIUIANBFGogEBCzAiADQRBqIgsgBSgCADYCACADIAMpAhQ3AwggBigCACIFBEAgDCAFQQJ0EN8ECyAGIAMpAwg3AgAgBkEIaiALKAIANgIADAELIANBFGogDCAFIAQgAhDtAiAGKAIAIgUEQCAMIAVBAnQQ3wQLIAYgAykCFDcCACAGQQhqIANBHGooAgA2AgALIANBIGokAAwBCyANIAVBpIPFABDIBAALCyAIQQNLIAhBAXYhCA0ACwwDC0EEQQRBpIPFABDIBAALIAUgA0Gkg8UAEMgEAAtBBEEEQaSDxQAQyAQACyAKIAEpAgw3AgAgCkEIaiABQRRqKAIANgIAIAlFDQAgBCAJQQJ0EN8ECyABQTBqJABBASEBAkAgDkECIA4bIgJBAUcEQCACQQEgBygCEBshAQwBCyAHQQA2AhAgBygCCCICQQRJDQAgBygCDCACQQJ0EN8EIAdCgICAgMAANwIICyAAIAcpAgg3AgAgACABOgAMIABBCGogB0EQaigCADYCACAHQSBqJAAPCyAIIAJBpIPFABDIBAALswIBAX8jAEHwAGsiBiQAIAYgATYCDCAGIAA2AgggBiADNgIUIAYgAjYCECAGQejNxQAoAgA2AhwgBkHczcUAKAIANgIYAkAgBCgCAARAIAZBMGogBEEQaikCADcDACAGQShqIARBCGopAgA3AwAgBiAEKQIANwMgIAZBBDYCXCAGQZi3xQA2AlggBkIENwJkIAYgBkEQaq1CgICAgLAShDcDUCAGIAZBCGqtQoCAgICwEoQ3A0ggBiAGQSBqrUKAgICA0BKENwNADAELIAZBAzYCXCAGQeS2xQA2AlggBkIDNwJkIAYgBkEQaq1CgICAgLAShDcDSCAGIAZBCGqtQoCAgICwEoQ3A0ALIAYgBkEYaq1CgICAgMAShDcDOCAGIAZBOGo2AmAgBkHYAGogBRCoBAALxwMDAn4FfAJ/AkACQAJ/IAC9IgFCgICAgICAgAhZBEAgAUL/////////9/8AVg0DQYF4IQkgAUIgiCICQoCAwP8DUgRAIAKnDAILQYCAwP8DIAGnDQEaRAAAAAAAAAAADwsgAEQAAAAAAAAAAGEEQEQAAAAAAADwvyAAIACiow8LIAFCAFMNAUHLdyEJIABEAAAAAAAAUEOivSIBQiCIpwshCCABQv////8PgyAIQeK+JWoiCEH//z9xQZ7Bmv8Daq1CIIaEv0QAAAAAAADwv6AiACAAIABEAAAAAAAA4D+ioiIDob1CgICAgHCDvyIERAAAIGVHFfc/oiIFIAhBFHYgCWq3IgagIgcgBSAGIAehoCAAIAShIAOhIAAgAEQAAAAAAAAAQKCjIgAgAyAAIACiIgMgA6IiACAAIABEn8Z40Amawz+iRK94jh3Fccw/oKJEBPqXmZmZ2T+goiADIAAgACAARERSPt8S8cI/okTeA8uWZEbHP6CiRFmTIpQkSdI/oKJEk1VVVVVV5T+goqCgoqAiAEQAACBlRxX3P6IgACAEoEQAou8u/AXnPaKgoKAPCyAAIAChRAAAAAAAAAAAoyEACyAAC80CAQZ+IAAoAgAoAgAiACkDCCIDIAEoAgAgAkF0bGpBDGs1AgBCgICAgICAgIAEhCIEhULzytHLp4zZsvQAhSIFQhCJIAUgACkDACIGQuHklfPW7Nm87ACFfCIFhSIHQhWJIAcgA0Lt3pHzlszct+QAhSIDIAZC9crNg9es27fzAIV8IgZCIIl8IgeFIghCEIkgCCAFIANCDYkgBoUiA3wiBUIgiUL/AYV8IgaFIghCFYkgCCAFIANCEYmFIgMgBCAHhXwiBEIgiXwiBYUiB0IQiSAHIAQgA0INiYUiAyAGfCIEQiCJfCIGhSIHQhWJIAcgBCADQhGJhSIDIAV8IgRCIIl8IgWFIgdCEIkgByADQg2JIASFIgMgBnwiBEIgiXwiBoVCFYkgA0IRiSAEhSIDQg2JIAMgBXyFIgNCEYmFIAMgBnwiA0IgiYUgA4ULzQIBBn4gACgCACgCACIAKQMIIgMgASgCACACQQR0a0EQazUCAEKAgICAgICAgASEIgSFQvPK0cunjNmy9ACFIgVCEIkgBSAAKQMAIgZC4eSV89bs2bzsAIV8IgWFIgdCFYkgByADQu3ekfOWzNy35ACFIgMgBkL1ys2D16zbt/MAhXwiBkIgiXwiB4UiCEIQiSAIIAUgA0INiSAGhSIDfCIFQiCJQv8BhXwiBoUiCEIViSAIIAUgA0IRiYUiAyAEIAeFfCIEQiCJfCIFhSIHQhCJIAcgBCADQg2JhSIDIAZ8IgRCIIl8IgaFIgdCFYkgByAEIANCEYmFIgMgBXwiBEIgiXwiBYUiB0IQiSAHIANCDYkgBIUiAyAGfCIEQiCJfCIGhUIViSADQhGJIASFIgNCDYkgAyAFfIUiA0IRiYUgAyAGfCIDQiCJhSADhQvKAgEGfyABIAJBAXRqIQkgAEGA/gNxQQh2IQogAEH/AXEhDAJAAkACQAJAA0AgAUECaiELIAcgAS0AASICaiEIIAogAS0AACIBRwRAIAEgCksNBCAIIQcgCyIBIAlHDQEMBAsgByAISw0BIAQgCEkNAiADIAdqIQEDQCACRQRAIAghByALIgEgCUcNAgwFCyACQQFrIQIgAS0AACABQQFqIQEgDEcNAAsLQQAhAgwDCyAHIAhB0L7FABDmBAALIAggBEHQvsUAEOUEAAsgAEH//wNxIQcgBSAGaiEDQQEhAgNAIAVBAWohAAJAIAUsAAAiAUEATgRAIAAhBQwBCyAAIANHBEAgBS0AASABQf8AcUEIdHIhASAFQQJqIQUMAQtBwL7FABDoBAALIAcgAWsiB0EASA0BIAJBAXMhAiADIAVHDQALCyACQQFxC7ECAQJ/IAAoAggiAgRAIAAoAgQhAANAIAAoAgAiAQRAIABBBGooAgAgAUECdBDfBAsgAEEMaigCACIBBEAgAEEQaigCACABQQJ0EN8ECyAAQRhqKAIAIgEEQCAAQRxqKAIAIAFBAnQQ3wQLIABBJGooAgAiAQRAIABBKGooAgAgAUECdBDfBAsgAEEwaigCACIBBEAgAEE0aigCACABQQJ0EN8ECyAAQTxqKAIAIgEEQCAAQUBrKAIAIAFBAnQQ3wQLIABByABqKAIAIgEEQCAAQcwAaigCACABQQJ0EN8ECyAAQdQAaigCACIBBEAgAEHYAGooAgAgAUECdBDfBAsgAEHgAGooAgAiAQRAIABB5ABqKAIAIAFBAnQQ3wQLIABB7ABqIQAgAkEBayICDQALCwv7AgIFfwFvIwBBIGsiBCQAQQFBABDNBCICJQEgASUBEAEhBxCtAyIDIAcmASABQYQBTwRAIAEQqwMLIAJBhAFPBEAgAhCrAwsgBEEIaiADJQEQAgJAAn8CQAJAIAQoAggiAQRAIAQoAgwhAiADQYQBTwRAIAMQqwMLQQohBSACQQJPDQEMAgtB7O7AAEEjEM0EIQEgAEGAgICAeDYCACAAIAE2AgQgA0GEAUkNAyADEKsDDAMLIAEvAABBsPABRwRAIAEvAABBsLABRw0BCyABQQJqIQNBECEFQQAgAkECRg0BGiACQQJrIAMsAABBQE4NARogASACQQIgAkG078AAENIEAAsgASEDIAILIQYgBEEUaiADIAYgBRDxAQJAIAQoAhRBgICAgHhGBEBBxO/AAEEjEM0EIQMgAEGAgICAeDYCACAAIAM2AgQMAQsgACAEKQIUNwIAIABBCGogBEEcaigCADYCAAsgAkUNACABIAIQ3wQLIARBIGokAAvIAgEGfyACIARqIgpBAWoiB0ECdCEJAkACQCAHQf////8DSyAJQfz///8HS3INAAJ/IAlFBEBBBCEGQQAMAQtB0c7FAC0AABpBBCEFIAlBBBDXBCIGRQ0BIAcLIQUgBiAHIAEgAiADIAQQKSAHRQ0BIAYgB0ECdGpBBGsoAgAEQCAHIQgMAgsgCkECaiEEIApBAnQhAgNAIAJBfEYNAiAEQQFrIQQgAiAGaiACQQRrIQIoAgBFDQALIAQgByAEIAdJGyEIDAELIAUgCUHYyMQAEMgEAAsCQAJAIAggBUECdk8NACAFRQRAQQAhBQwBCyAFQQJ0IQEgCEUEQCAGIAEQ3wRBBCEGQQAhBQwBCyAGIAFBBCAIIgVBAnQiARDOBCIGRQ0BCyAAIAg2AgggACAGNgIEIAAgBTYCAA8LQQQgAUG0ycQAEMgEAAvMAgEDfyMAQRBrIgIkAAJAIAFBgAFPBEAgAkEANgIMAn8gAUGAEE8EQCABQYCABE8EQCACQQxqQQNyIQQgAiABQRJ2QfABcjoADCACIAFBBnZBP3FBgAFyOgAOIAIgAUEMdkE/cUGAAXI6AA1BBAwCCyACQQxqQQJyIQQgAiABQQx2QeABcjoADCACIAFBBnZBP3FBgAFyOgANQQMMAQsgAkEMakEBciEEIAIgAUEGdkHAAXI6AAxBAgshAyAEIAFBP3FBgAFyOgAAIAAoAgAgACgCCCIBayADSQRAIAAgASADEKADIAAoAgghAQsgAwRAIAAoAgQgAWogAkEMaiAD/AoAAAsgACABIANqNgIIDAELIAAoAggiAyAAKAIARgRAIABByK7FABC2AwsgACADQQFqNgIIIAAoAgQgA2ogAToAAAsgAkEQaiQAQQALgAMBCH8jAEEgayIDJAAgA0EIaiABIAIQoQEgAygCHCEJIAMoAhghCiADKAIUIQcgAygCDCEFIAMoAgghBAJAIAMoAhAiBgRAQQIhCAwBC0EBIQggBEUEQEEEIQVBACEEDAELIAUgBEECdBDfBEEAIQRBBCEFCyACLQAMIQICQAJAAkACQAJAAkACQCABLQAMQQFrDgIBAgALIAJBAWsOAgMEAgsgAkEBaw4CAgEDCyACQQFrDgIBAAILIABBADsADSAAIAg6AAwgACAGNgIIIAAgBTYCBCAAIAQ2AgAgAEEPakEAOgAADAILQdvVwgBBKEHg1sIAEP4DAAsgCQRAIANBF2pBADoAACADQQA7ABUgAyAFNgIMIAMgBDYCCCADIAY2AhAgAyAGRToAFCAAIANBCGpBARDTAQwBCyAAQQA7AA0gACAGNgIIIAAgBTYCBCAAIAQ2AgAgACAGRToADCAAQQ9qQQA6AAALIAcEQCAKIAdBAnQQ3wQLIANBIGokAAvBAwELfgJ+IAFByKXFAEEgEPEDBEBCjZXHw5bS2sCXfyABKQMQIgV9IgQgASkDGCIGQsf688PtgqOQPFatIgd9IQlC3bCFjOi2kai4fyABKQMIIgN9IgIgBCAHVCAFQo2Vx8OW0trAl39Wcq0iBH0hBULH+vPD7YKjkDwgBn0hBkKpwMaJrs6TsjAgASkDACACIARUIANC3bCFjOi2kai4f1ZyrXx9DAELIAEpAxghBiABKQMQIQkgASkDCCEFIAEpAwALIQQCfiABQSBqQcilxQBBIBDxAwRAQo2Vx8OW0trAl38gASkDMCIDfSICIAEpAzgiCELH+vPD7YKjkDxWrSIKfSEHQt2whYzotpGouH8gASkDKCILfSIMIAIgClQgA0KNlcfDltLawJd/VnKtIgJ9IQNCx/rzw+2Co5A8IAh9IQhCqcDGia7Ok7IwIAEpAyAgAiAMViALQt2whYzotpGouH9Wcq18fQwBCyABKQM4IQggASkDMCEHIAEpAyghAyABKQMgCyECIAAgCDcDOCAAIAc3AzAgACADNwMoIAAgAjcDICAAIAY3AxggACAJNwMQIAAgBTcDCCAAIAQ3AwALogMCAn8DfiMAQZABayIBJAACQEH408EAQYjSwQBBMBDxAwRAIAFCrtXy//////rDADcDiAEgAUL9/5/qrv7/2zI3A4ABIAFC6bqml5rJjvQHNwN4IAFC+vbKmZjmvNRsNwNwIAFC6YDTh+qjo4pvNwNoIAFChoT89+PkrIUENwNgDAELIAFBiAFqQaDUwQApAwA3AwAgAUGAAWpBmNTBACkDADcDACABQfgAakGQ1MEAKQMANwMAIAFB8ABqQYjUwQApAwA3AwAgAUHoAGpBgNTBACkDADcDACABQfjTwQApAwA3A2ALIAFBMGogAUHgAGoiAhCmASABIAEpAzAiBUIBiDcDACABIAEpA1AiA0I/hiABKQNYQgGIhDcDKCABIAEpA0giBEI/hiADQgGIhDcDICABIAEpA0AiA0I/hiAEQgGIhDcDGCABIAEpAzgiBEI/hiADQgGIhDcDECABIAVCP4YgBEIBiIQ3AwggAiAAIAEQLCACQYjSwQBBMBDxAwR/IAFB4ABqQfjTwQBBMBDxA0VBAXQFQQELIAFBkAFqJAAL5oYBAgl/G34jAEHAAWsiBCQAAkACQCABQeAAaiIIQcCNxQBBMBDxAwRAIwBB0B1rIgIkACACQZAZaiABQTBqIgYpAyAiD0IAIAYpAygiC0IAEMkDIAJBoBlqIAYpAxgiDkIAIAtCABDJAyACQbAZaiAGKQMQIgxCACALQgAQyQMgAkHAGWogBikDCCINQgAgC0IAEMkDIAJB0BlqIAYpAwAiEUIAIAtCABDJAyACQfAZaiAOQgAgD0IAEMkDIAJBgBpqIAxCACAPQgAQyQMgAkGQGmogDUIAIA9CABDJAyACQaAaaiARQgAgD0IAEMkDIAJBwBpqIAxCACAOQgAQyQMgAkHQGmogDUIAIA5CABDJAyACQeAaaiARQgAgDkIAEMkDIAJBgBtqIA1CACAMQgAQyQMgAkGQG2ogEUIAIAxCABDJAyACQbAbaiARQgAgDUIAEMkDIAJB4BlqIAtCACALQgAQyQMgAkGwGmogD0IAIA9CABDJAyACQfAaaiAOQgAgDkIAEMkDIAJBoBtqIAxCACAMQgAQyQMgAkHAG2ogDUIAIA1CABDJAyACQdAbaiARQgAgEUIAEMkDIAJBgBlqIAIpA+AZIhRC/f/z/8////mJf34iD0IAQqvV/v///7//uX9CABDJAyACQfAYaiAPQgBC///Piuv//9UeQgAQyQMgAkHgGGogD0IAQqTsw7WP1LSY5wBCABDJAyACQdAYaiAPQgBCv6WUnM/w0rvkAEIAEMkDIAJBwBhqIA9CAELX2a6a5PbpjcsAQgAQyQMgAkGwGGogD0IAQprN/8ujvcSAGkIAEMkDIAIpA7gbIAIpA5gbIAIpA4gbIAIpA9gaIAIpA8gaIAIpA4gaIAIpA/gZIAIpA6gZIAIpA5gZIgsgAikDoBl8Ig8gC1StfCIMIAIpA7AZfCILIAIpA/AZfCIOIAtUrXwiDSACKQO4GSALIAxUrXwiESACKQPAGXwiEnwiCyANVK18IAsgCyACKQOAGnwiDFatfCIQIAIpA8gZIBEgElatfCISIAIpA9AZfCITfCILIAIpA5AafCINIAIpA8AafCIRIA1UrXwiFSALIA1WrSACKQOYGiALIBBUrXx8IhAgAikD2BkgEiATVq18fCILIAIpA6AafCITfCINIBVUrXwgDSANIAIpA9AafCISVq18IhUgCyATVq0gAikDqBogCyAQVK18fHwiCyACKQPgGnwiDSACKQOAG3wiECANVK18IhMgCyANVq0gAikD6BogCyAVVK18fHwiCyATVK18IAsgAikDkBt8Ig0gC1StfCILIAIpA7AbfCITIAtUrXwiFUI/iCACKQPYGyACKQPIGyACKQOoGyACKQP4GiACKQO4GiACKQPoGSILIAIpA5AZIhdCAYZ8IhsgC1StIhogD0IBhiAXQj+IhHwiCyAaVK18IAsgAikDsBp8IhcgC1StfCILIA5CAYYgD0I/iIR8IhogC1StIgsgDEIBhiAOQj+IhHwiDyALVK18IA8gAikD8Bp8Ih0gD1StfCIPIBFCAYYgDEI/iIR8IhYgD1StIgsgEkIBhiARQj+IhHwiDyALVK18IA8gAikDoBt8IgwgD1StfCIPIBBCAYYgEkI/iIR8Ig4gD1StIgsgDUIBhiAQQj+IhHwiDyALVK18IA8gAikDwBt8IgsgD1StfCIPIBNCAYYgDUI/iIR8IhIgD1StIg0gFUIBhiATQj+IhHwiDyANVK18IA8gAikD0Bt8IhEgD1StfHwhDwJ/AkAgAikDuBggAikDyBggAikD2BggAikD6BggAikD+BggAikDiBkgAikDgBkiDSAUQn2DfCANVK18IhAgAikD8Bh8Ig0gEFStfCANIBt8IhAgDVStfCITIAIpA+AYfCINIBNUrXwgDSAXfCITIA1UrXwiFCACKQPQGHwiDSAUVK18IA0gGnwiFCANVK18IhUgAikDwBh8Ig0gFVStfCANIB18IhUgDVStfCIXIAIpA7AYfCINIBdUrXwgDSAWfCIXIA1UrXwiDVANACAMIA18IgwgDVQiBkUNACAGrSINIA58Ig4gDVoNACANIA5WrSINIAt8IgsgDVoNACALIA1UrSINIBJ8IhIgDVoNACANIBJWrSINIBF8IhEgDVoNACANIBFWrSINIA98Ig8gDVQMAQtBAAshCSACQaAYaiAQQv3/8//P///5iX9+Ig1CAEKr1f7///+//7l/QgAQyQMgAkGQGGogDUIAQv//z4rr///VHkIAEMkDIAJBgBhqIA1CAEKk7MO1j9S0mOcAQgAQyQMgAkHwF2ogDUIAQr+llJzP8NK75ABCABDJAyACQeAXaiANQgBC19mumuT26Y3LAEIAEMkDIAJB0BdqIA1CAEKazf/Lo73EgBpCABDJAwJAIAIpA9gXIAIpA+gXIAIpA/gXIAIpA4gYIAIpA5gYIAIpA6gYIAIpA6AYIg0gEHwgDVStfCIQIAIpA5AYfCINIBBUrXwgDSANIBN8IhBWrXwiEyACKQOAGHwiDSATVK18IA0gFHwiEyANVK18IhQgAikD8Bd8Ig0gFFStfCANIBV8IhQgDVStfCIVIAIpA+AXfCINIBVUrXwgDSAXfCIVIA1UrXwiFyACKQPQF3wiDSAXVK18IA0gDCANfCIXVq18IgxQDQAgDCAOfCIOIAxaDQAgDCAOVq0iDCALfCILIAxaDQAgCyAMVK0iDCASfCISIAxaDQAgDCASVq0iDCARfCIRIAxaDQAgDCARVq0iDCAPfCIPIAxUIQULIAJBwBdqIBBC/f/z/8////mJf34iDEIAQqvV/v///7//uX9CABDJAyACQbAXaiAMQgBC///Piuv//9UeQgAQyQMgAkGgF2ogDEIAQqTsw7WP1LSY5wBCABDJAyACQZAXaiAMQgBCv6WUnM/w0rvkAEIAEMkDIAJBgBdqIAxCAELX2a6a5PbpjcsAQgAQyQMgAkHwFmogDEIAQprN/8ujvcSAGkIAEMkDAn9BACACKQP4FiACKQOIFyACKQOYFyACKQOoFyACKQO4FyACKQPIFyACKQPAFyIMIBB8IAxUrXwiDSACKQOwF3wiDCANVK18IAwgDCATfCINVq18IhAgAikDoBd8IgwgEFStfCAMIBR8IhAgDFStfCITIAIpA5AXfCIMIBNUrXwgDCAVfCITIAxUrXwiFCACKQOAF3wiDCAUVK18IAwgF3wiFCAMVK18IhUgAikD8BZ8IgwgFVStfCAMIAwgDnwiFVatfCIOUA0AGkEAIA4gCyAOfCILWA0AGkEAIAsgDlStIg4gEnwiEiAOWg0AGkEAIA4gElatIg4gEXwiESAOWg0AGiAOIBFWrSIOIA98Ig8gDlQLIQogAkHgFmogDUL9//P/z///+Yl/fiIOQgBCq9X+////v/+5f0IAEMkDIAJB0BZqIA5CAEL//8+K6///1R5CABDJAyACQcAWaiAOQgBCpOzDtY/UtJjnAEIAEMkDIAJBsBZqIA5CAEK/pZScz/DSu+QAQgAQyQMgAkGgFmogDkIAQtfZrprk9umNywBCABDJAyACQZAWaiAOQgBCms3/y6O9xIAaQgAQyQMCQCACKQOYFiACKQOoFiACKQO4FiACKQPIFiACKQPYFiACKQPoFiACKQPgFiIOIA18IA5UrXwiDCACKQPQFnwiDiAMVK18IA4gDiAQfCIMVq18Ig0gAikDwBZ8Ig4gDVStfCAOIBN8Ig0gDlStfCIQIAIpA7AWfCIOIBBUrXwgDiAUfCIQIA5UrXwiEyACKQOgFnwiDiATVK18IA4gFXwiEyAOVK18IhQgAikDkBZ8Ig4gFFStfCAOIAsgDnwiFFatfCILUA0AIAsgEnwiEiALWg0AIAsgElatIgsgEXwiESALWg0AIAsgEVatIgsgD3wiDyALVCEHCyACQYAWaiAMQv3/8//P///5iX9+IgtCAEKr1f7///+//7l/QgAQyQMgAkHwFWogC0IAQv//z4rr///VHkIAEMkDIAJB4BVqIAtCAEKk7MO1j9S0mOcAQgAQyQMgAkHQFWogC0IAQr+llJzP8NK75ABCABDJAyACQcAVaiALQgBC19mumuT26Y3LAEIAEMkDIAJBsBVqIAtCAEKazf/Lo73EgBpCABDJAyACKQO4FSACKQPIFSACKQPYFSACKQPoFSACKQP4FSACKQOIFiACKQOAFiILIAx8IAtUrXwiDiACKQPwFXwiCyAOVK18IAsgDXwiDiALVK18IgwgAikD4BV8IgsgDFStfCALIBB8IgwgC1StfCINIAIpA9AVfCILIA1UrXwgCyATfCINIAtUrXwiECACKQPAFXwiCyAQVK18IAsgFHwiECALVK18IhMgAikDsBV8IgsgE1StfCALIBJ8IhMgC1StfCILUEUEQCALIBF8IhEgC1QiA60iCyAPfCISIA8gAxshDyADIAsgElZxIQMLIAJBoBVqIA5C/f/z/8////mJf34iC0IAQqvV/v///7//uX9CABDJAyACQZAVaiALQgBC///Piuv//9UeQgAQyQMgAkGAFWogC0IAQqTsw7WP1LSY5wBCABDJAyACQfAUaiALQgBCv6WUnM/w0rvkAEIAEMkDIAJB4BRqIAtCAELX2a6a5PbpjcsAQgAQyQMgAkHQFGogC0IAQprN/8ujvcSAGkIAEMkDIAIpA9gUIAIpA+gUIAIpA/gUIAIpA4gVIAIpA5gVIAIpA6gVIAIpA6AVIgsgDnwgC1StfCIOIAIpA5AVfCILIA5UrXwgCyAMfCISIAtUrXwiCyACKQOAFXwiDiALVK18IA4gDSAOfCILVq18Ig4gAikD8BR8IgwgDlStfCAMIAwgEHwiDlatfCINIAIpA+AUfCIMIA1UrXwgDCATfCINIAxUrXwiECACKQPQFHwiDCAQVK18IAwgEXwiESAMVK18IgwgD3wiEyAPIAxCAFIiBhshEAJAAkAgBSAJciAKciAHciADciAMIBNWIgOt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DiACKQPwDiILIAx8IAtUrXwiDiACKQPgDnwiCyAOVK18IAsgDXwiDiALVK18IgwgAikD0A58IgsgDFStfCALIBB8IgwgC1StfCINIAIpA8AOfCILIA1UrXwgCyATfCINIAtUrXwiECACKQOwDnwiCyAQVK18IAsgFHwiECALVK18IhMgAikDoA58IgsgE1StfCALIBJ8IhMgC1StfCILUEUEQCALIBF8IhEgC1QiA60iCyAPfCISIA8gAxshDyADIAsgElZxIQMLIAJBkA5qIA5C/f/z/8////mJf34iC0IAQqvV/v///7//uX9CABDJAyACQYAOaiALQgBC///Piuv//9UeQgAQyQMgAkHwDWogC0IAQqTsw7WP1LSY5wBCABDJAyACQeANaiALQgBCv6WUnM/w0rvkAEIAEMkDIAJB0A1qIAtCAELX2a6a5PbpjcsAQgAQyQMgAkHADWogC0IAQprN/8ujvcSAGkIAEMkDIAIpA8gNIAIpA9gNIAIpA+gNIAIpA/gNIAIpA4gOIAIpA5gOIAIpA5AOIgsgDnwgC1StfCIOIAIpA4AOfCILIA5UrXwgCyAMfCISIAtUrXwiCyACKQPwDXwiDiALVK18IA4gDSAOfCILVq18Ig4gAikD4A18IgwgDlStfCAMIAwgEHwiDlatfCINIAIpA9ANfCIMIA1UrXwgDCATfCINIAxUrXwiECACKQPADXwiDCAQVK18IAwgEXwiESAMVK18IgwgD3wiEyAPIAxCAFIiBhshEAJAAkAgBSAJciAKciAHciADciAMIBNWIgOtIAwgBhtCAFJyIAMgBnEgEEKazf/Lo73EgBpWcnINAAJAIBBCms3/y6O9xIAaUg0AIBFC19mumuT26Y3LAFYNASARQtfZrprk9umNywBSDQAgDUK/pZScz/DSu+QAVg0BIA1Cv6WUnM/w0rvkAFINACAOQqTsw7WP1LSY5wBWDQEgDkKk7MO1j9S0mOcAUg0AIAtC///Piuv//9UeVg0BIAtC///Piuv//9UeUg0AIBJCqtX+////v/+5f1YNAQsgCyEPIA4hCyANIQwgESEODAELIAtC///Piuv//9UefSIMIBJCq9X+////v/+5f1StIhN9IQ8gDkKk7MO1j9S0mOcAfSIUIAtC///Piuv//9UeVCAMIBNUcq0iDH0hCyANQr+llJzP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rXwiECACKQPgAXwiDiAQVK18IA4gFHwiECAOVK18IhMgAikD0AF8Ig4gE1StfCAOIBV8IhMgDlStfCIUIAIpA8ABfCIOIBRUrXwgDiALIA58IhRWrXwiC1ANACALIBJ8IhIgC1oNACALIBJWrSILIBF8IhEgC1oNACALIBFWrSILIA98Ig8gC1QhAwsgAkGwAWogDEL9//P/z///+Yl/fiILQgBCq9X+////v/+5f0IAEMkDIAJBoAFqIAtCAEL//8+K6///1R5CABDJAyACQZABaiALQgBCpOzDtY/UtJjnAEIAEMkDIAJBgAFqIAtCAEK/pZScz/DSu+QAQgAQyQMgAkHwAGogC0IAQtfZrprk9umNywBCABDJAyACQeAAaiALQgBCms3/y6O9xIAaQgAQyQNBACEFIAIpA2ggAikDeCACKQOIASACKQOYASACKQOoASACKQO4ASACKQOwASILIAx8IAtUrXwiDiACKQOgAXwiCyAOVK18IAsgDXwiDiALVK18IgwgAikDkAF8IgsgDFStfCALIBB8IgwgC1StfCINIAIpA4ABfCILIA1UrXwgCyATfCINIAtUrXwiECACKQNwfCILIBBUrXwgCyAUfCIQIAtUrXwiEyACKQNgfCILIBNUrXwgCyASfCITIAtUrXwiC1BFBEAgCyARfCIRIAtUIgWtIgsgD3wiEiAPIAUbIQ8gBSALIBJWcSEFCyACQdAAaiAOQv3/8//P///5iX9+IgtCAEKr1f7///+//7l/QgAQyQMgAkFAayALQgBC///Piuv//9UeQgAQyQMgAkEwaiALQgBCpOzDtY/UtJjnAEIAEMkDIAJBIGogC0IAQr+llJzP8NK75ABCABDJAyACQRBqIAtCAELX2a6a5PbpjcsAQgAQyQMgAiALQgBCms3/y6O9xIAaQgAQyQMgAikDCCACKQMYIAIpAyggAikDOCACKQNIIAIpA1ggAikDUCILIA58IAtUrXwiDiACKQNAfCILIA5UrXwgCyAMfCISIAtUrXwiCyACKQMwfCIOIAtUrXwgDiANIA58IgtWrXwiDiACKQMgfCIMIA5UrXwgDCAMIBB8Ig5WrXwiDSACKQMQfCIMIA1UrXwgDCATfCINIAxUrXwiECACKQMAfCIMIBBUrXwgDCARfCIRIAxUrXwiDCAPfCITIA8gDEIAUiIG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DAELIAYhBANAIAVBCGogAkEIaigCADYCACAFIAIpAgA3AwAgBCAFELsDNgIAIARBBGohBCACQQxqIgIgA0cNAAsLIAFChICAgMAANwIAIAFCgICAgMAANwIIIAMgAmtBDG4hASACIANHBEADQCACKAIAIgMEQCACQQRqKAIAIANBAnQQ3wQLIAJBDGohAiABQQFrIgENAAsLIAAgBjYCBCAAIAdBA2w2AgAgACAEIAZrQQJ2NgIIIAVBEGokAAvfAQEBfyABIAEoAgAiAUHgAGo2AgAjAEHgAGsiAkEoaiABQShqKQMANwMAIAJBIGogAUEgaikDADcDACACQRhqIAFBGGopAwA3AwAgAkEQaiABQRBqKQMANwMAIAJBCGogAUEIaikDADcDACACQThqIAFBOGopAwA3AwAgAkFAayABQUBrKQMANwMAIAJByABqIAFByABqKQMANwMAIAJB0ABqIAFB0ABqKQMANwMAIAJB2ABqIAFB2ABqKQMANwMAIAIgASkDADcDACACIAEpAzA3AzAgACACQeAA/AoAAAvBAQEBfyMAQZABayIDJAAgA0HIAGogAhAuIAACfiADKAJIQQFGBEAgAEIANwMIQgEMAQsgA0EgaiADQegAaikDADcDACADQShqIANB8ABqKQMANwMAIANBMGogA0H4AGopAwA3AwAgA0E4aiADQYABaikDADcDACADQUBrIANBiAFqKQMANwMAIAMgAykDYDcDGCADIAMpA1g3AxAgAyADKQNQNwMIIABBCGogASADQQhqEDhCAAs3AwAgA0GQAWokAAvVAQEHfwJAIAEEQCABQQJ0IQQDQAJAIAAoAgAiAkGEAUkNACAC0G8mARCDAyIBKAIMIQcgASgCECEDIAFCADcCDCABKAIIIQUgASgCBCEGIAFCBDcCBCABKAIAIQggAUEANgIAIAIgA0kNAyACIANrIgIgBU8NAyAGIAJBAnRqIAc2AgAgASADNgIQIAEgAjYCDCABIAU2AgggASgCBCABIAY2AgQgASgCACECIAEgCDYCACACRQ0AIAJBAnQQ3wQLIABBBGohACAEQQRrIgQNAAsLDwsAC84BAQJ/IwBBEGsiAiQAIAAoAgAhACACQQRqIgMgARCqBCACIAA2AgwgAyACQQxqQeiVwQAQjgMgAiAAQQhqNgIMIAJBBGogAkEM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BAsL2wsCD38IfiMAQTBrIgMkACADQYCAgIB4NgIMIAMgAjYCKCADIAE2AiQgAyADQQxqNgIsIANBGGohDyMAQdACayIBJAAgAUGAAmoiCiADQSRqIgQgAUHPAmoiBSAEKAIIEKQCAkACQAJAAkAgAS0AwAIiBkEDRg0AIAFB+AFqIgIgAUG4AmopAwA3AwAgAUHwAWoiCyABQbACaikDADcDACABQegBaiIMIAFBqAJqKQMANwMAIAFB4AFqIgcgAUGgAmopAwA3AwAgAUHYAWoiCCABQZgCaikDADcDACABQdABaiIJIAFBkAJqKQMANwMAIAFByAFqIg0gAUGIAmopAwA3AwAgASABKQOAAjcDwAEgASABKADBAjYCeCABIAFBxAJqKAAANgB7IAZBAkYNACABQdgAaiIOIAIpAwA3AwAgAUHQAGoiECALKQMANwMAIAFByABqIgsgDCkDADcDACABQUBrIgwgBykDADcDACABQThqIgcgCCkDADcDACABQTBqIgggCSkDADcDACABQShqIgkgDSkDADcDACABIAEpA8ABNwMgIAEgASgCeDYCGCABIAEoAHs2ABtB0c7FAC0AABpBoAJBCBDWBCICRQ0CIAIgASkDIDcDACACIAY6AEAgAiABKAIYNgBBIAJBxABqIAEoABs2AAAgAkE4aiAOKQMANwMAIAJBMGogECkDADcDACACQShqIAspAwA3AwAgAkEgaiAMKQMANwMAIAJBGGogBykDADcDACACQRBqIAgpAwA3AwAgAkEIaiAJKQMANwMAIAFBATYCFCABIAI2AhAgAUEENgIMIAFB6ABqIARBCGooAgAiBjYCACABIAQpAgA3A2AgCiABQeAAaiAFIAYQpAICQCABLQDAAiIEQQNGDQBBiQEhCiABQcECaiILQQNqIQxBASEGA0AgAUH4AWoiBSABQbgCaikDADcDACABQfABaiIHIAFBsAJqKQMANwMAIAFB6AFqIgggAUGoAmopAwA3AwAgAUHgAWoiCSABQaACaikDADcDACABQdgBaiINIAFBmAJqKQMANwMAIAFB0AFqIg4gAUGQAmopAwA3AwAgAUHIAWoiECABQYgCaikDADcDACABIAEpA4ACNwPAASABIAsoAAA2ArgBIAEgDCgAADYAuwEgBEECRg0BIAFBsAFqIhEgBSkDADcDACABQagBaiIFIAcpAwA3AwAgAUGgAWoiByAIKQMANwMAIAFBmAFqIgggCSkDADcDACABQZABaiIJIA0pAwA3AwAgAUGIAWoiDSAOKQMANwMAIAFBgAFqIg4gECkDADcDACABIAEpA8ABNwN4IAEgASgCuAE2AnAgASABKAC7ATYAcyABKAIMIAZGBEAgAUEMaiAGQQFBCEHIABCIAyABKAIQIQILIA4pAwAhEiANKQMAIRMgCSkDACEUIAgpAwAhFSAHKQMAIRYgBSkDACEXIBEpAwAhGCABKQN4IRkgAiAKaiIFQQFrIAQ6AAAgBUHBAGsiBCAZNwMAIAUgASgCcDYAACAFQQNqIAEoAHM2AAAgBEE4aiAYNwMAIARBMGogFzcDACAEQShqIBY3AwAgBEEgaiAVNwMAIARBGGogFDcDACAEQRBqIBM3AwAgBEEIaiASNwMAIAEgBkEBaiIGNgIUIAFBgAJqIAFB4ABqIAFBzwJqIAEoAmgQpAIgCkHIAGohCiABLQDAAiIEQQNHDQALCyAPQQhqIAFBFGooAgA2AgAgDyABKQIMNwIADAELIA9BADYCCCAPQoCAgICAATcCAAsgAUHQAmokAAwBC0EIQaACQZCWwgAQyAQACyAAQQRqIQECQCADKAIMQYCAgIB4RwRAIAEgAykCDDcCACABQQhqIANBFGooAgA2AgBBASECIAMoAhgiAUUNASADKAIcIAFByABsEN8EDAELIAEgAykCGDcCACABQQhqIANBIGooAgA2AgBBACECCyAAIAI2AgAgA0EwaiQAC78BAQJ/IwBBIGsiAiQAIAEtAAwiAwRAIAJBCGogARByQQEhAQJAIANBAUcEQEECQQEgAigCEBshAQwBCyACQQA2AhAgAigCCCIDQQRJDQAgAigCDCADQQJ0EN8EIAJCgICAgMAANwIICyAAIAIpAgg3AgAgACABOgAMIABBCGogAkEQaigCADYCACACQSBqJAAPCyACQQA2AhggAkEBNgIMIAJBlMLEADYCCCACQgQ3AhAgAkEIakGcwsQAEKgEAAvCAQIDfwF+IwBBMGsiAiQAIAEoAgBBgICAgHhGBEAgASgCDCEDIAJBFGoiBEEANgIAIAJCgICAgBA3AgwgAkEgaiADKAIAIgNBCGopAgA3AwAgAkEoaiADQRBqKQIANwMAIAIgAykCADcDGCACQQxqQcSnxQAgAkEYahCrAhogAkEIaiAEKAIAIgM2AgAgAiACKQIMIgU3AwAgAUEIaiADNgIAIAEgBTcCAAsgAEG8qsUANgIEIAAgATYCACACQTBqJAALyAEBAX8jAEEQayILJAAgACgCACABIAIgACgCBCgCDBEDACEBIAtBADoADSALIAE6AAwgCyAANgIIIAtBCGogAyAEIAUgBhCCAyAHIAggCSAKEIIDIQEgCy0ADSICIAstAAwiA3IhAAJAIANBAXEgAkEBR3INACABKAIAIgAtAApBgAFxRQRAIAAoAgBB87fFAEECIAAoAgQoAgwRAwAhAAwBCyAAKAIAQfK3xQBBASAAKAIEKAIMEQMAIQALIAtBEGokACAAQQFxC7EBAQZ/AkACQCAAQYQBSQ0AIADQbyYBEIMDIgEoAgwhBSABKAIQIQIgAUIANwIMIAEoAgghAyABKAIEIQQgAUIENwIEIAEoAgAhBiABQQA2AgAgACACSQ0BIAAgAmsiACADTw0BIAQgAEECdGogBTYCACABIAI2AhAgASAANgIMIAEgAzYCCCABKAIEIAEgBDYCBCABKAIAIQAgASAGNgIAIABFDQAgAEECdBDfBAsPCwALhwEBBX8jAEGAA2siAiQAIAIgASABQeAAaiIGED8gAkHgAGoiBSABIAYQ1QEgAkGgAmoiAxB1IAJBwAFqIgQgAyAGED8gAyABIAQQ1QEgBCAFIAMQPyAFIAQgAhCNASADEHUgBCADIAIQPyAAIAUgBBCNASAAQeAAaiACIAIQ1QEgAkGAA2okAAvRAwIMfwF+IwBBIGsiBCQAIARBGGoiCRCDAyIFQRBqIgcoAgA2AgAgBEEQaiIKIAVBCGoiCCkCADcDACAHQQA2AgAgCEIANwIAIAUpAgAhDCAFQoCAgIDAADcCACAEIAw3AwgCfyMAQSBrIgMkAAJAAkAgBEEIaiIAKAIMIgEgACgCCCICRgRAAkAgACgCACICIAFGBEDQb0GAASABIAFBgAFNGyIG/A8BIgJBf0YNBAJAIAAoAhAiC0UEQCAAIAI2AhAMAQsgASALaiACRw0FCyABIAZqIgJB/////wFLDQQgAyABBH8gAyABQQJ0NgIcIAMgACgCBDYCFEEEBUEACzYCGCADQQhqQQQgAkECdCADQRRqELgDIAMoAghBAUYNBCADKAIMIQYgACACNgIAIAAgBjYCBAwBCyABIAJPDQMLIAAgAUEBaiICNgIIIAAoAgQgAUECdGogAjYCAAwBCyABIAJPDQELIAAgACgCBCABQQJ0aigCADYCDCAAKAIQIANBIGokACABagwBCwALIAggCikDADcCACAHIAkoAgA2AgAgBSgCBCEDIAUoAgAhASAFIAQpAwg3AgAgAQRAIAMgAUECdBDfBAsgBEEgaiQAC7kBAQN/IAEoAgwhAgJAAkACQAJAAkACQCABKAIEDgIAAQILIAINAUEBIQNBACEBQQEhAgwDCyACRQ0BCyAAIAEQ0gIPCyABKAIAIgIoAgQiAUEASA0BIAIoAgAhAyABRQRAQQEhAkEAIQEMAQtB0c7FAC0AABpBASEEIAFBARDWBCICRQ0BCyABBEAgAiADIAH8CgAACyAAIAE2AgggACACNgIEIAAgATYCAA8LIAQgAUGkm8IAEMgEAAu4AQEBf0HRzsUALQAAGkHAAEEIENYEIgJFBEBBCEHAAEGwncUAEMgEAAsgAEECNgIIIAAgAjYCBCAAQQI2AgAgAiABKQMANwMAIAJBOGogAUE4aikDADcDACACQTBqIAFBMGopAwA3AwAgAkEoaiABQShqKQMANwMAIAJBIGogAUEgaikDADcDACACQRhqIAFBGGopAwA3AwAgAkEQaiABQRBqKQMANwMAIAJBCGogAUEIaikDADcDAAu9AQEBfyMAQRBrIgckACAAKAIAIAEgAiAAKAIEKAIMEQMAIQEgB0EAOgANIAcgAToADCAHIAA2AgggB0EIaiADIAQgBSAGEIIDIQEgBy0ADSICIActAAwiA3IhAAJAIANBAXEgAkEBR3INACABKAIAIgAtAApBgAFxRQRAIAAoAgBB87fFAEECIAAoAgQoAgwRAwAhAAwBCyAAKAIAQfK3xQBBASAAKAIEKAIMEQMAIQALIAdBEGokACAAQQFxC7YBAQJ/IwBBIGsiAiQAIAJBGGoiA0GQksIAKAIANgIAIAJBiJLCACkCADcDECABBEAgAkEQakGMk8IAEKUDIAIoAhQgATYCACACQQE2AhgLIAJBCGogAygCADYCACACIAIpAxA3AwAgACgCCCIBIAAoAgBGBEAgAEHoq8IAEJ8DCyAAKAIEIAFBDGxqIgMgAikDADcCACADQQhqIAJBCGooAgA2AgAgACABQQFqNgIIIAJBIGokAAulAQEBfyMAQRBrIgYkAAJAIAEEQCAGQQRqIAEgAyAEIAUgAigCEBEHAAJAIAYoAgQiAiAGKAIMIgFNBEAgBigCCCEFDAELIAJBAnQhAiAGKAIIIQMgAUUEQEEEIQUgAyACEN8EDAELIAMgAkEEIAFBAnQiAhDOBCIFRQ0CCyAAIAE2AgQgACAFNgIAIAZBEGokAA8LEPgEAAtBBCACQfC1xAAQyAQAC5wBAQR/AkACQAJAAkACQCAAQQRPBEAgALif/AMiAUUNASABIAAgAW4gAWpBAXYiAkkNAiACIQMMAwsgAEEARyEBDAMLQZCMxQAQmgQACwNAIAIgACACbiACakEBdiIDSSACIQEgAyECDQALCyABIANNDQADQCADIgFFDQIgASAAIAFuIAFqQQF2IgNLDQALCyABDwtBkIzFABCaBAALpwEAIAAgARDaAiAAQQxqIAFBIGoQ2gIgAEEYaiABQUBrENoCIABBJGogAUHgAGoQ2gIgAEEwaiABQYABahDaAiAAQTxqIAFBoAFqENoCIABByABqIAFBwAFqENoCIABB1ABqIAFB4AFqENoCIABB4ABqIAFBgAJqENoCIABB7ABqIAFBoAJqENoCIABB+ABqIAFBwAJqENoCIABBhAFqIAFB4AJqENoCC6gBACAAIAEQ2AIgAEEMaiABQTBqENgCIABBGGogAUHgAGoQ2AIgAEEkaiABQZABahDYAiAAQTBqIAFBwAFqENgCIABBPGogAUHwAWoQ2AIgAEHIAGogAUGgAmoQ2AIgAEHUAGogAUHQAmoQ2AIgAEHgAGogAUGAA2oQ2AIgAEHsAGogAUGwA2oQ2AIgAEH4AGogAUHgA2oQ2AIgAEGEAWogAUGQBGoQ2AILmwEBBH8jAEEgayICJABBCCAAKAIAIgRBAXQiAyADQQhNGyIDQQBIBEBBAEEAIAEQyAQACyACIAQEfyACIAQ2AhwgAiAAKAIENgIUQQEFIAULNgIYIAJBCGpBASADIAJBFGoQuAMgAigCCEEBRgRAIAIoAgwgAigCECABEMgEAAsgAigCDCEBIAAgAzYCACAAIAE2AgQgAkEgaiQAC6UBAQF/IwBBQGoiAiQAIAAoAgAhACACQgA3AzggAkE4aiAAJQEQESACIAIoAjwiADYCNCACIAIoAjg2AjAgAiAANgIsIAIgAkEsaq1CgICAgNAOhDcDICACQQI2AgwgAkGEuMQANgIIIAJCATcCFCACIAJBIGo2AhAgASgCACABKAIEIAJBCGoQqwIgAigCLCIBBEAgAigCMCABEN8ECyACQUBrJAALjwEBAX8gAkEATgRAAn8gAygCBARAAkAgAygCCCIERQRADAELIAMoAgAgBCABIAIQzgQMAgsLIAEgAkUNABpB0c7FAC0AABogAiABENYECyIDRQRAIAAgAjYCCCAAIAE2AgQgAEEBNgIADwsgACACNgIIIAAgAzYCBCAAQQA2AgAPCyAAQQA2AgQgAEEBNgIAC5YBAQJ/IwBBEGsiAiQAIAAoAgAhACACQQRqIgMgARCqBCACIAA2AgwgAyACQQxqQeiVwQAQjgMgAiAAQQhqNgIMIAJBBGogAkEMakHolcEAEI4DIAIgAEEQajYCDCACQQRqIAJBDGpB6JXBABCOAyACIABBGGo2AgwgAkEEaiACQQxqQeiVwQAQjgMgAxChBCACQRBqJAALzwECBX8BbwJAIAEoAgAiBRCHBSIDQQBIDQACQCADRQRAQQEhBAwBC0HRzsUALQAAGkEBIQIgA0EBENYEIgRFDQELEBMhBxCtAyIBIAcmASABIgYlARAMIQcQrQMiASAHJgEgASUBEA0hBxCtAyICIAcmASABQYQBTwRAIAEQqwMLIAIlASAFJQEgBBAOIAJBhAFPBEAgAhCrAwsgBkGEAU8EQCAGEKsDCyAAIAUQhwU2AgggACAENgIEIAAgAzYCAA8LIAIgA0H0tMQAEMgEAAuyAQIEfwFvIwBBIGsiASQAIAFBADYCCCABQoCAgIAQNwIAIAFB2J/AADYCECABQqCAgIAONwIUIAEgATYCDCAAIAFBDGoQogJFBEAgASgCACECIAEoAgQiAyABKAIIEAMhBRCtAyIEIAUmASACBEAgAyACEN8ECyAAKAIAIgIEQCAAKAIEIAJBAnQQ3wQLIAFBIGokACAEDwtBgKDAAEE3IAFBH2pB8J/AAEGEocAAEMoDAAuVAQEDfyMAQRBrIgIkAAJ/QQEgASgCACIDQScgASgCBCIEKAIQIgERAgANABogAkEEaiAAKAIAQYECEIgCAkAgAi0ABEGAAUYEQCADIAIoAgggARECAEUNAUEBDAILIAMgAi0ADiIAIAJBBGpqIAItAA8gAGsgBCgCDBEDAEUNAEEBDAELIANBJyABEQIACyACQRBqJAALiAEAIAEgASgCACIBQUBrNgIAIAAgASkDADcDACAAQQhqIAFBCGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBGGogAUEYaikDADcDACAAQSBqIAEpAyA3AwAgAEEoaiABQShqKQMANwMAIABBMGogAUEwaikDADcDACAAQThqIAFBOGopAwA3AwALjwEBBH8gASgCCCIEQQJ0IQICQCAEQf////8DSyACQfz///8HS3INACABKAIEIQUCfyACRQRAQQQhAUEADAELQdHOxQAtAAAaQQQhAyACQQQQ1gQiAUUNASAECyEDIAIEQCABIAUgAvwKAAALIAAgBDYCCCAAIAE2AgQgACADNgIADwsgAyACQfiBwAAQyAQAC3cBBH8gACgCBCEDIAAoAggiBARAIAMhAQNAIAEoAgAiAgRAIAFBBGooAgAgAkECdBDfBAsgAUEMaigCACICBEAgAUEQaigCACACQQJ0EN8ECyABQRhqIQEgBEEBayIEDQALCyAAKAIAIgAEQCADIABBGGwQ3wQLC48BAQR/IAEoAggiBEECdCECAkAgBEH/////A0sgAkH8////B0tyDQAgASgCBCEFAn8gAkUEQEEEIQFBAAwBC0HRzsUALQAAGkEEIQMgAkEEENYEIgFFDQEgBAshAyACBEAgASAFIAL8CgAACyAAIAQ2AgggACABNgIEIAAgAzYCAA8LIAMgAkGkg8UAEMgEAAt+AgF/An4jAEHQAWsiAyQAIANB6ABqIAIQPSAAAn4gAygCaEEBRgRAIABCADcDCEIBDAELIAMpA3AhBCADKQN4IQUgA0EYaiADQYABakHQAPwKAAAgAyAFNwMQIAMgBDcDCCAAQQhqIAEgA0EIahA/QgALNwMAIANB0AFqJAALeAEDfyMAQYABayIDJAAgAC0AACEEQQAhAANAIAAgA2pB/wBqIARBD3EiAkEwciACQTdqIAJBCkkbOgAAIABBAWshACAEIgJBBHYhBCACQQ9LDQALIAFBAUH7t8UAQQIgACADakGAAWpBACAAaxCJAiADQYABaiQAC3oCAX4CfyMAQYABayIEJAAgACkDACECQQAhAANAIAAgBGpB/wBqIAKnQQ9xIgNBMHIgA0HX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CGoiEiALQfAFaikDADcDACALQbgIaiIOIAtB6AVqKQMANwMAIAsgCykD4AU3A7AIIAtBqAhqIhAgC0HYBWopAwA3AwAgC0GgCGoiESALQdAFaikDADcDACALIAspA8gFNwOYCCALQZAIaiITIAtBwAVqKQMANwMAIAtBiAhqIhQgC0G4BWopAwA3AwAgCyALKQOwBTcDgAggC0H4B2oiGSALQagFaikDADcDACALQfAHaiIXIAtBoAVqKQMANwMAIAsgCykDmAU3A+gHIAtB4AdqIhogC0GQBWopAwA3AwAgC0HYB2oiICALQYgFaikDADcDACALIAspA4AFNwPQByALQcgHaiIdIAtB+ARqKQMANwMAIAtBwAdqIicgC0HwBGopAwA3AwAgCyALKQPoBDcDuAcgC0GwB2oiHyALQeAEaikDADcDACALQagHaiIkIAtB2ARqKQMANwMAIAsgCykD0AQ3A6AHIAtBmAdqIiEgC0HIBGopAwA3AwAgC0GQB2oiKyALQcAEaikDADcDACALIAspA7gENwOIByALQYAHaiIiIAtBsARqKQMANwMAIAtB+AZqIiwgC0GoBGopAwA3AwAgCyALKQOgBDcD8AYgC0HoBmoiGyALQZgEaikDADcDACALQeAGaiItIAtBkARqKQMANwMAIAsgCykDiAQ3A9gGIAtB0AZqIiUgC0GABGopAwA3AwAgC0HIBmoiLiALQfgDaikDADcDACALIAspA/ADNwPABiAJIAspA9gDNwLoAiAJQfACaiALQeADaikDADcCACAJQfgCaiALQegDaikDADcCACAJIAspA8ADNwKAAyAJQYgDaiALQcgDaikDADcCACAJQZADaiALQdADaikDADcCACAJQagDaiALQbgDaikDADcCACAJQaADaiALQbADaikDADcCACAJIAspA6gDNwKYAyAJQcADaiALQaADaikDADcCACAJQbgDaiALQZgDaikDADcCACAJIAspA5ADNwKwAyAJQdgDaiALQYgDaikDADcCACAJQdADaiALQYADaikDADcCACAJIAspA/gCNwLIAyAJQfADaiALQfACaikDADcCACAJQegDaiALQegCaikDADcCACAJIAspA+ACNwLgAyAJQYgEaiALQdgCaikDADcCACAJQYAEaiALQdACaikDADcCACAJIAspA8gCNwL4AyAJQaAEaiALQcACaikDADcCACAJQZgEaiALQbgCaikDADcCACAJIAspA7ACNwKQBCAJQbgEaiALQagCaikDADcCACAJQbAEaiALQaACaikDADcCACAJIAspA5gCNwKoBCAJQdAEaiALQZACaikDADcCACAJQcgEaiALQYgCaikDADcCACAJIAspA4ACNwLABCAJQegEaiALQfgBaikDADcCACAJQeAEaiALQfABaikDADcCACAJIAspA+gBNwLYBCAJQYAFaiALQeABaikDADcCACAJQfgEaiALQdgBaikDADcCACAJIAspA9ABNwLwBCAJQZgFaiALQcgBaikDADcCACAJQZAFaiALQcABaikDADcCACAJIAspA7gBNwKIBSAJIMoBNwIQIAkgBzYCDCAJIAo2AgggCSAMNgIEIAkgDzYCACALKAJ8IQogCygCgAEhByALKAKEASEMIAkgCykCTDcCoAUgCUGoBWogC0HUAGooAgA2AgAgCSALKQPACzcCGCAJQSBqIAgpAwA3AgAgCUEoaiAFKQMANwIAIAlBQGsgDSkDADcCACAJQThqIAMpAwA3AgAgCSALKQPgCDcCMCAJQdgAaiAEKQMANwIAIAlB0ABqIAYpAwA3AgAgCSALKQPICDcCSCAJQfAAaiASKQMANwIAIAlB6ABqIA4pAwA3AgAgCSALKQOwCDcCYCAJQYgBaiAQKQMANwIAIAlBgAFqIBEpAwA3AgAgCSALKQOYCDcCeCAJQaABaiATKQMANwIAIAlBmAFqIBQpAwA3AgAgCSALKQOACDcCkAEgCUG4AWogGSkDADcCACAJQbABaiAXKQMANwIAIAkgCykD6Ac3AqgBIAlB0AFqIBopAwA3AgAgCUHIAWogICkDADcCACAJIAspA9AHNwLAASAJQegBaiAdKQMANwIAIAlB4AFqICcpAwA3AgAgCSALKQO4BzcC2AEgCUGAAmogHykDADcCACAJQfgBaiAkKQMANwIAIAkgCykDoAc3AvABIAlBmAJqICEpAwA3AgAgCUGQAmogKykDADcCACAJIAspA4gHNwKIAiAJQbACaiAiKQMANwIAIAlBqAJqICwpAwA3AgAgCSALKQPwBjcCoAIgCUHIAmogGykDADcCACAJQcACaiAtKQMANwIAIAkgCykD2AY3ArgCIAlB4AJqICUp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NwMAIA5BgARqIAdB8ABqKQIANwMAIA5B4ANqIAdBgAFqKQIANwMAIA5B6ANqIAdBiAFqKQIANwMAIA4gBykCSDcDiAQgDiAHKQJgNwPwAyAOIAcpAng3A9gDIA5B0ANqIAdBoAFqKQIANwMAIA5ByANqIAdBmAFqKQIANwMAIA5BuANqIAdBuAFqKQIANwMAIA5BsANqIAdBsAFqKQIANwMAIA5BoANqIAdB0AFqKQIANwMAIA5BmANqIAdByAFqKQIANwMAIA4gBykCkAE3A8ADIA4gBykCqAE3A6gDIA4gBykCwAE3A5ADIAwEQCAHIAxBGGwQ3wQLIClBgICAgHhHDQEgFiEMIBghBwsgDiAgNgLMQSAOIAc2AshBIA4gDDYCxEFBypnCAEErIA5BxMEAakHUnMIAQYCkwgAQygMACyAOQeABaiAOQcgdaikDADcDACAOQdgBaiAOQcAdaikDADcDACAOQfABaiAOQfg4aikDADcDACAOQfgBaiAOQYA5aikDADcDACAOQYgCaiAOQZAEaikDADcDACAOQZACaiAOQZgEaikDADcDACAOIA4pA7gdNwPQASAOIA4pA/A4NwPoASAOIA4pA4gENwOAAiAOQagCaiAOQYAEaikDADcDACAOQaACaiAOQfgDaikDADcDACAOQbgCaiAOQeADaikDADcDACAOQcACaiAOQegDaikDADcDACAOQdACaiAOQcgDaikDADcDACAOQdgCaiAOQdADaikDADcDACAOIA4pA/ADNwOYAiAOIA4pA9gDNwOwAiAOIA4pA8ADNwPIAiAOQfACaiAOQbgDaikDADcDACAOQegCaiAOQbADaikDADcDACAOQYgDaiAOQaADaikDADcDACAOQYADaiAOQZgDaikDADcDACAOIA4pA6gDNwPgAiAOIA4pA5ADNwP4AgJAAkACQAJAAkACQAJAIBRBI08EQCATKAKgAyIfQQJ0IQVBACEMAkAgH0H/////A0sgBUH8////B0tyDQAgEygCnAMhBwJ/IAVFBEBBBCEkQQAMAQtB0c7FAC0AABpBBCEMIAVBBBDWBCIkRQ0BIB8LIUIgBQRAICQgByAF/AoAAAtBIyEHIA5BIzYCECAOQQA2ArADIA5CgICAgMAANwKoAyAKRQ0HIAohBUEAIQwDQCAHIAxqIglBCWohByAJQXZL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IMoBNwIEIBJBATYCAAwICyAKIAYpAwA3AwAgByAQKQMANwMAIAggESkDADcDACAMIBMpAwA3AwAgCSAUKQMANwMAIA0gGSkDADcDACAFIAMpAwA3AwAgBCAEKQOwJzcD2EwgBCAEKADxJzYCsEUgBCAXKAAANgCzRSAEQcDFAGogBSkDADcDACAEQcjFAGogDSkDADcDACAEQdDFAGogCSkDADcDACAEQdjFAGogDCkDADcDACAEQeDFAGogCCkDADcDACAEQejFAGogBykDADcDACAEQfDFAGogCikDADcDACAEIAQpA9hMNwO4RSAEQbAnaiAVQYADahCGBCAELQDwJyJOQQJGBEAgBEHgzABqIARBuCdqKAIAIgU2AgAgBCAEKQOwJyLKATcD2EwgEkEMaiAFNgIAIBIgygE3AgQgEkEBNgIADAgLIARBkM0AaiIKIARB6CdqIgYpAwA3AwAgBEGIzQBqIgcgBEHgJ2oiECkDADcDACAEQYDNAGoiCCAEQdgnaiIRKQMANwMAIARB+MwAaiIMIARB0CdqIhMpAwA3AwAgBEHwzABqIgkgBEHIJ2oiFCkDADcDACAEQejMAGoiDSAEQcAnaiIZKQMANwMAIARB4MwAaiIFIARBuCdqIgMpAwA3AwAgBCAEKQOwJzcD2EwgBCAEKADxJzYC+EUgBCAEQfQnaiIXKAAANgD7RSAEQYjGAGogBSkDADcDACAEQZDGAGogDSkDADcDACAEQZjGAGogCSkDADcDACAEQaDGAGogDCkDADcDACAEQajGAGogCCkDADcDACAEQbDGAGogBykDADcDACAEQbjGAGogCikDADcDACAEIAQpA9hMNwOARiAEQbAnaiAVQZgDahCGBCAELQDwJyJPQQJGBEAgBSADKAIAIgU2AgAgBCAEKQOwJyLKATcD2EwgEkEMaiAFNgIAIBIgygE3AgQgEkEBNgIADAgLIAogBikDADcDACAHIBApAwA3AwAgCCARKQMANwMAIAwgEykDADcDACAJIBQpAwA3AwAgDSAZKQMANwMAIAUgAykDADcDACAEIAQpA7AnNwPYTCAEIAQoAPEnNgLARiAEIBcoAAA2AMNGIARB0MYAaiAFKQMANwMAIARB2MYAaiANKQMANwMAIARB4MYAaiAJKQMANwMAIARB6MYAaiAMKQMANwMAIARB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rXwi2wEgBikDsC98IssBIAYpA5gvINQBINoBVK18ItoBIAYpA4AufCLMASAGKQPgMHwizwEg1QEg2QFWrSAGKQP4MCDUASDVAVatfHx8Is0BIAYpA7AufCLOASDSASDTAVStIAYpA8gvINMBINgBVK18fHwi0wEgBikD4C98ItQBINABINEBVK0gBikD+C8g0QEg0gFUrXx8fCLYAXwi0gEgBikD4C58ItEBIAYpA/guIAYpA/AuIsoBINcBfCDKAVStfHwi0AEgBikDsDB8ItUBQgBCAEL/////vrL98EIQyQMgBkHgLWogBikD+C0iygFCAEKBgICAv7L98MMAQgAQyQMgBkHQLWogygFCAEKR4eXNh4n6mShCABDJAyAGQcAtaiDKAUIAQt2whYzotpGouH9CABDJAyAGQbAtaiDKAUIAQqnAxomuzpOyMEIAEMkDAkACQAJAIAYpA7gtIAYpA8guIAYpA9gvIM0BIM8BVK0gBikD6DAgzAEgzwFWrXx8IAYpA4guIMwBINoBVK18fCLXASAGKQOgLXwiygEgzgEg0wFWrSAGKQO4LiDNASDOAVatfHx8IswBIAYpA9AvfCLPASDMAVStfCDPASDPASDUASDYAVatIAYpA+gvINMBINQBVq18fHwizQFWrXwgygEgzAFWrSAGKQOoLSDKASDXAVStfHx8Is4BIAYpA5AtfCLKASAGKQOoLiDNASAGKQOgLnwizAEgzQFUrXwgzAEgywEg0gFWrSAGKQO4LyDLASDbAVStfHx8IssBIMwBVK18fCLMASAGKQPALnwizwEgzAFUrXwgzwEgBikD2C4gywEgywEgBikD0C58Is0BVq18IM0BIM0BINABINEBVK0gBikD6C4g0QEg0gFUrXx8fCLSAVatfHwiywEgzwFUrXwgygEgzAFWrSAGKQOYLSDKASDOAVStfHx8ItEBIAYpA4AtfCLPASAGKQOYLiDLASDLASAGKQOQLnwiygFWrXwgygEgygEgBikDqC8gBikDuDAg0AEg1QFWrXwizAEgBikDoC98IssBIMwBVK18IMsBIMsBINIBfCLMAVatfHwiywFWrXx8Is0BIAYpA7AtfCLOASDNAVStfCDOASAGKQPILSDLASDLASAGKQPALXwi0gFWrXwg0gEg0gEgBikD2C0gzAEgzAEgBikD0C18IsoB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rXwi2AEgBikD0Ct8ItABIAYpA7gsIM4BINMBVK18ItoBIAYpA/AsfCLTASAGKQPgKnwi1AEg0gEg1wFWrSAGKQP4KiDOASDSAVatfHx8Is4BIAYpA6AsfCLSASDLASDNAVStIAYpA+grIM0BINUBVK18fHwizQEgBikDkCp8ItUBIMwBIM8BVq0gBikDqCogywEgzAFWrXx8fCLXAXwiywEgBikDwCl8IswBIAYpA9gpIAYpA9ApIsoBINEBfCDKAVStfHwizwEgBikDkCl8ItEBQgBCAEL/////vrL98EIQyQMgBkHwKGogBikDiCkiygFCAEKBgICAv7L98MMAQgAQyQMgBkHgKGogygFCAEKR4eXNh4n6mShCABDJAyAGQdAoaiDKAUIAQt2whYzotpGouH9CABDJAyAGQcAoaiDKAUIAQqnAxomuzpOyMEIAEMkDAkAgBikDyCggBikDqCkgBikDiCogzgEg1AFUrSAGKQPoKiDTASDUAVatfHwgBikD+Cwg0wEg2gFUrXx8ItMBIAYpA+AsfCLKASDNASDSAVStIAYpA6gsIM4BINIBVq18fHwizgEgBikDgCp8ItIBIM4BVK18INIBINUBINcBVq0gBikDmCogzQEg1QFWrXx8fCLNASDSAVStfCDKASDOAVatIAYpA+gsIMoBINMBVK18fHwi0wEgBikD0Cx8IsoBIAYpA5gsIM0BIM0BIAYpA5AsfCLOAVatfCDOASDOASDLASDQAVStIAYpA9grINABINgBVK18fHwizQFWrXx8Is4BIAYpA6ApfCLSASDOAVStfCDSASAGKQO4KSDNASDNASAGKQOwKXwi0AFWrXwg0AEg0AEgzAEgzwFWrSAGKQPIKSDLASDMAVatfHx8Is0BVq18fCLLASDSAVStfCDKASDOAVatIAYpA9gsIMoBINMBVK18fHwi0AEgBikDwCx8IswBIAYpA4gsIMsBIAYpA4AsfCLKASDLAVStfCDKASDKASAGKQPIKyAGKQOYKSDPASDRAVatfCLPASAGKQPAK3wiywEgzwFUrXwgywEgywEgzQF8Is8BVq18fCLLAVatfHwizQEgBikDwCh8Is4BIM0BVK18IM4BIAYpA9goIMsBIMsBIAYpA9AofCLSAVatfCDSASDSASAGKQPoKCDPASDPASAGKQPgKHwiygFWrXwg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ACAGIMoBIMsBfSLSATcDiEAgBiDUASDTAX0i3AEgygEgywFUrSLKAX0i1wE3A4BAIAYgzQEgzAF9IuABIMoBINwBViDTASDUAVZyrSLKAX0i3AE3A/g/IAYg0QEg2QF9IMoBIOABViDMASDNAVZyrX0i0QE3A/A/AkACQCDaASLNASDYASLKAVINACDVASLNASDWASLKAVINACDQASLNASDbASLKAVINACDOASHNASDPASLKASDOAVENAQsgygEgzQFUDQILINgBINoBfSDWASDVAX0i4AEg2wEg0AF9IvABIM4BIM8BVq0i+AFUINABINsBVnKtIu0BVCDVASDWAVZyrX0h2AEgzwEgzgF9Ic8BINcBIdQBINwBIc0BINIBIcoBIPABIPgBfSHbASDgASDtAX0h1gEMAwsgBiDLASDKAX0i0gE3A+g/IAYg0wEg1AF9ItwBIMoBIMsBVq0iywF9ItcBNwPgPyAGIMwBIM0BfSLgASDTASDUAVQgywEg3AFWcq0iywF9ItwBNwPYPyAGINkBINEBfSDMASDNAVQgywEg4AFWcq19ItkBNwPQPwJAAkAg2gEiywEg2AEizAFSDQAg1QEiywEg1gEizAFSDQAg0AEiywEg2wEizAFSDQAgzgEiywEgzwEizAFRDQELIMsBIMwBVA0CCyDaASDYAX0g1QEg1gFUINUBINYBfSLVASDQASDbAVQg0AEg2wF9ItABIM4BIM8BVK0i4AFUcq0i8AFUcq19IdoBIM4BIM8BfSHOASDXASHTASDcASHMASDSASHLASDQASDgAX0h0AEg1QEg8AF9IdUBDAILINgBQt2whYzotpGouH8g1QF9IsoBQpHh5c2HifqZKCDQAX0izQEgzgFCgYCAgL+y/fDDAFatItQBVCDQAUKR4eXNh4n6mShWcq0i2AFUINUBQt2whYzotpGouH9Wcq0g2gF8fSDKASDYAX0i2AEg1gF8IsoBINgBVCDKASDNASDUAX0i1AEg2wF8Is0BINQBVCDNAUKBgICAv7L98MMAIM4BfSLUASDPAXwizwEg1AFUrXwi2wEgzQFUcq18ItYBIMoBVHKtfEKpwMaJrs6TsjB8IdgBINcBIdQBINwBIc0BINIBIcoBDAELINoBINgBfULdsIWM6LaRqLh/INYBfSLLAUKR4eXNh4n6mSgg2wF9IswB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ye7XxwB8ItQBIMoBQpHh5c2HifqZKFQg0AEg0wFUcq0iygF9IeMBIOQBIMwBQt2whYzotpGouH9UIMoBINQBVnKtfUKpwMaJrs6TsjB9IeQBINsBQoGAgIC/sv3wwwB9IdsBCwJ+AkACQCDoASLYASDvASLKAVINACDdASLYASDlASLKAVINACDeASLYASDnASLKAVINACDhASLYASDuASLKAVENAQsgygEg2AFaDQBC3bCFjOi2kai4fyDdASDlAX0iygEg3gEg5wFUIN4BIOcBfSLMASDhASDuAVStItABVHKtItcBfSLUAX0i2AEgzAEg0AF9IswBQpHh5c2HifqZKFZCkeHlzYeJ+pkoIMwBfSLMASDhASDuAX0i0AFCgYCAgL+y/fDDAFatItYBVHKtItoBfSHTASDYASDaAVQg1AFC3bCFjOi2kai4f1ZyIQogzAEg1gF9IdQBIN0BIOUBVCDKASDXAVRyrSDvASDoAX18QqnAxomuzpOyMHwh6AFCgYCAgL+y/fDDACDQAX0MAQsg5wEg3gF9IsoBIOEBIO4BVq0izAF9IdQBIOUBIN0BfSLQASDKASDMAVQg3gEg5wFWcq0iygF9IdMBIMoBINABViDdASDlAVZyIQog7wEg6AF9IegBIO4BIOEBfQsh5QEgECkDWCHaASAQKQNQId4BIBApA0gh2AEgECkDOCHMASAQKQMwIdABIBApAygh1wEgECkDICLWASHKAQJ+AkACQCDWASDgASLcAVINACDYASLcASDXASLKAVINACDeASLcASDQASLKAVINACDaASLcASDMASLKAVENAQsgygEg3AFaDQBC3bCFjOi2kai4fyDYASDXAX0i3QEg0AEg3gFWIN4BINABfSLKASDMASDaAVatItABVHKtIuEBfSLiAX0i5wEgygEg0AF9IsoBQpHh5c2HifqZKFZCkeHlzYeJ+pkoIMoBfSLKASDaASDMAX0izAFCgYCAgL+y/fDDAFatItABVHKtIu4BfSHcASDnASDuAVQg4gFC3bCFjOi2kai4f1ZyIQcgygEg0AF9IcoBIN0BIOEBVCDXASDYAVZyrSDWASDgAX18QqnAxomuzpOyMHwh4QFCgYCAgL+y/fDDACDMAX0MAQsg0AEg3gF9ItwBIMwBINoBVK0i3QF9IcoBINcBINgBfSLhASDcASDd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gL+y/fDDACDWAX0MAQsgygEgzQF9IswBINYBINkBVK0i4QF9IdABINwBINcBfSLoASDMASDhAVQgygEgzQFUcq0iygF9Ic0BIMoBIOgBViDXASDcAVZyIQog3QEgywF9IeIBINYBINkBfQsiygFCACDlAUIAEMkDIAZBwAxqIMoBQgAg1AFCABDJAyAGQaAMaiDKAUIAINMBQgAQyQMgBkGADGogygFCACDRAUIAEMkDIAZBoA1qIAYpA7ANIswBQgBCAEL/////vrL98EIQyQMgBkGQDWogBikDqA0iygFCAEKBgICAv7L98MMAQgAQyQMgBkGADWogygFCAEKR4eXNh4n6mShCABDJAyAGQfAMaiDKAUIAQt2whYzotpGouH9CABDJAyAGQeAMaiDKAUIAQqnAxomuzpOyMEIAEMkDIAZB4AtqINABQgAg5QFCABDJAyAGQYALaiDQAUIAINQBQgAQyQMgBkHwCmog0AFCACDTAUIAEMkDIAZB4ApqINABQgAg0QFCABDJAyAGQdALaiAGKQOADSLZASAGKQO4DSLXASAGKQPADHwi1gF8IssBIAYpA5gNIMwBIAYpA5ANIsoBfCDKAVStfHwizAEgBikD4At8ItABQgBCAEL/////vrL98EIQyQMgBkHAC2ogBikD2AsiygFCAEKBgICAv7L98MMAQgAQyQMgBkGwC2ogygFCAEKR4eXNh4n6mShCABDJAyAGQaALaiDKAUIAQt2whYzotpGouH9CABDJAyAGQZALaiDKAUIAQqnAxomuzpOyMEIAEMkDIAZB0ApqIM0BQgAg5QFCABDJAyAGQfAJaiDNAUIAINQBQgAQyQMgBkGQCWogzQFCACDTAUIAEMkDIAZBgAlqIM0BQgAg0QFCABDJAyAGQcAKaiAGKQPoCyDMASDQAVatfCLcASAGKQOAC3wizQEgBikDyAwg1gEg1wFUrXwi3QEgBikDoAx8ItcBIAYpA/AMfCLWASDLASDMAVatIAYpA4gNIMsBINkBVK18fHwi4QF8IssBIAYpA7ALfCLMASAGKQPICyAGKQPACyLKASDQAXwgygFUrXx8ItABIAYpA9AKfCLZAUIAQgBC/////76y/fBCEMkDIAZBsApqIAYpA8gKIsoBQgBCgYCAgL+y/fDDAEIAEMkDIAZBoApqIMoBQgBCkeHlzYeJ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KQPQAnwi0wF8Is0BIAYpA6gCIM4BIAYpA6ACIssBfCDLAVStfHwizgEgBikDgAN8ItIBQgBCAEL/////vrL98EIQyQMgBkHwAWogBikDiAIiywFCAEKBgICAv7L98MMAQgAQyQMgBkHgAWogywFCAEKR4eXNh4n6mShCABDJAyAGQdABaiDLAUIAQt2whYzotpGouH9CABDJAyAGQcABaiDLAUIAQqnAxomuzpOyMEIAEMkDIAZBwANqIBApA2giywFCACDfAUIAEMkDIAZB0ANqIMsBQgAg6wFCABDJAyAGQeADaiDLAUIAIOwBQgAQyQMgBkHwA2ogywFCACDqAUIAEMkDIAZBoAFqIAYpA4gDIM4BINIBVq18ItYBIAYpA5ADfCLRASAGKQPYAiDQASDTAVatfCLXASAGKQPgAnwi0AEgBikDsAF8ItMBIM0BIM4BVq0gBikDmAIgzQEg1AFUrXx8fCLZAXwizQEgBikD4AF8Is4BIAYpA/gBIAYpA/ABIssBINIBfCDLAVStfHwi0gEgBikDwAN8ItQBQgBCAEL/////vrL98EIQyQMgBkGQAWogBikDqAEiywFCAEKBgICAv7L98MMAQgAQyQMgBkGAAWogywFCAEKR4eXNh4n6mShCABDJAyAGQfAAaiDLAUIAQt2whYzotpGouH9CABDJAyAGQeAAaiDLAUIAQqnAxomuzpOyMEIAEMkDIAZBgARqIBApA2AiywFCACDfAUIAEMkDIAZBkARqIMsBQgAg6wFCABDJAyAGQaAEaiDLAUIAIOwBQgAQyQMgBkGwBGogywFCACDqAUIAEMkDIAZBQGsgBikDyAMg0gEg1AFWrXwi2wEgBikD0AN8ItUBIAYpA+gCINABINcBVK18ItwBIAYpA/ACfCLXASAGKQNQfCLYASDTASDZAVatIAYpA7gBINABINMBVq18fHwi0AEgBikDoAN8ItMBIM0BINEBVK0gBikDmAMg0QEg1gFUrXx8fCLRASAGKQPQAXwi1gEgzgEg0gFWrSAGKQPoASDNASDOAVatfHx8ItkBfCLNASAGKQOAAXwizgEgBikDmAEgBikDkAEiywEg1AF8IMsBVK18fCLSASAGKQOABHwi1AFCAEIAQv////++sv3wQhDJAyAGQTBqIAYpA0giywFCAEKBgICAv7L98MMAQgAQyQMg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IMsBQgAg0QFCABDJAyADQfCBAWogzgFCACDRAUIAEMkDIANBgIQBaiADKQOQhAFCfYMizQFCAEIAQv////++sv3wQhDJAyADQfCDAWogAykDiIQBIsoBQgBCgYCAgL+y/fDDAEIAEMkDIANB4IMBaiDKAUIAQpHh5c2HifqZKEIAEMkDIANB0IMBaiDKAUIAQt2whYzotpGouH9CABDJAyADQcCDAWogygFCAEKpwMaJrs6TsjBCABDJAyADQcCEAWogzwFCACDPAUIAEMkDIANBsIQBaiDLAUIAIM8BQgAQyQMgA0GghAFqIM4BQgAgzwFCABDJAyADQaCDAWogAykD4IMBItABIAMpA5iEASLSASADKQOwgwEiygF8ItEBfCLMASADKQP4gwEgzQEgAykD8IMBIs8BfCDPAVStfHwizwEgygF8Is0BQgBCAEL/////vrL98EIQyQMgA0GQgwFqIAMpA6iDASLKAUIAQoGAgIC/sv3wwwBCABDJAyADQYCDAWogygFCAEKR4eXNh4n6mShCABDJAyADQfCCAWogygFCAELdsIWM6LaRqLh/QgAQyQMgA0HgggFqIMoBQgBCqcDGia7Ok7IwQgAQyQMgA0HghAFqIMsBQgAgywFCABDJAyADQdCEAWogzgFCACDLAUIAEMkDIANBwIIBaiADKQO4gwEiygEgzQEgzwFUrXwi1QEgAykDwIQBfCLLASDKASDRASDSAVStfCLTASADKQPQggEiygF8ItIBIAMpA9CDAXwi0QEgzAEgzwFWrSADKQPogwEgzAEg0AFUrXx8fCLXAXwizAEgAykDgIMBfCLPASADKQOYgwEgzQEgAykDkIMBItABfCDQAVStfHwizQEgygF8ItABQgBCAEL/////vrL98EIQyQMgA0GwggFqIAMpA8iCASLKAUIAQoGAgIC/sv3wwwBCABDJAyADQaCCAWogygFCAEKR4eXNh4n6mShCABDJAyADQZCCAWogygFCAELdsIWM6LaRqLh/QgAQyQMgA0GAggFqIMoBQgBCqcDGia7Ok7IwQgAQyQMgA0HwhAFqIM4BQgAgzgFCABDJAyADQeCBAWogAykD2IIBIsoBIM0BINABVq18ItgBIAMpA7CEASLWAXwizgEg1gEgygEg0gEg0wFUrXwi2gEgAykD8IEBIsoBfCLTASADKQPAgwF8ItQBINEBINcBVq0gAykD2IMBINEBINIBVK18fHwi0gF8ItEBIMsBIMwBVq0gAykDyIQBIMsBINUBVK18fHwiywEgAykD8IIBfCLVASDNASDPAVStIAMpA4iDASDMASDPAVatfHx8ItcBfCLMASADKQOgggF8Is8BIAMpA7iCASADKQOwggEizQEg0AF8IM0BVK18fCLNASDKAXwi0AFCAEIAQv////++sv3wQhDJAyADQdCBAWogAykD6IEBIsoBQgBCgYCAgL+y/fDDAEIAEMkDIANBwIEBaiDKAUIAQpHh5c2HifqZKEIAEMkDIANBsIEBaiDKAUIAQt2whYzotpGouH9CABDJAyADQaCBAWogygFCAEKpwMaJrs6TsjBCABDJAwJAAkAgAykDqIEBIAMpA4iCASADKQPoggEg0gEg1AFUrSADKQPIgwEg0wEg1AFWrXx8IAMpA/iBASLUASDTASDaAVStfHwi0wEgAykDoIQBItYBfCLKASDLASDRAVStIAMpA7iEASLaASDRASDSAVStfHx8ItIBIAMpA+CCAXwi0QEg0gFUrXwg0QEg1QEg1wFWrSADKQP4ggEgywEg1QFWrXx8fCLLASDRAVStfCDKASDSAVatIAMpA6iEASLVASDKASDTAVStfHx8ItMBIAMpA9CEASLXAXwiygEgAykD6IQBIMsBIMsBIAMpA+CEAXwi0gFWrXwg0gEg0gEgzAEgzgFUrSDaASDOASDYAVStfHx8IssBVq18fCLOASADKQOAggF8ItIBIM4BVK18INIBINIBIAMpA5iCASDLASDLASADKQOQggF8ItEBVq18INEBIM0BIM8BVK0gAykDqIIBIMwBIM8BVq18fHwizAEg0QFUrXx8IssBVq18IMoBIM4BVq0gAykD2IQBIs4BIMoBINMBVK18fHwi0wEgAykD8IQBfCLPASDOASDLASDLASDXAXwiygFWrXwgygEgygEg1QEg1AEgzQEg0AFWrXwizQEg1gF8IssBIM0BVK18IMsBIMsBIMwBfCLMAVatfHwiywFWrXx8Is0BIAMpA6CBAXwizgEgzQFUrXwgzgEgzgEgAykDuIEBIMsBIMsBIAMpA7CBAXwi0gFWrXwg0gEg0gEgAykDyIEBIMwBIMwBIAMpA8CBAXwiygFWrXwgygEgAykD2IEBIAMpA9CB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ASADQYikAWoiW0IANwMAIANBgKQBaiJcQgA3AwAgA0H4owFqIl1CADcDACADQgA3A/CjASADQeijAWoiXkIANwMAIANB4KMBaiJfQgA3AwAgA0HYowFqImBCADcDACADQgA3A9CjASADQcijAWoiYUIANwMAIANBwKMBaiJiQgA3AwAgA0G4owFqImNCADcDACADQgA3A7CjASADQaijAWoiZEIANwMAIANBoKMBaiJlQgA3AwAgA0GYowFqImZCADcDACADQgA3A5CjASADQYijAWoiZ0IANwMAIANBgKMBaiJoQgA3AwAgA0H4ogFqImlCADcDACADQgA3A/CiASADQeiiAWoiakIANwMAIANB4KIBaiJrQgA3AwAgA0HYogFqImxCADcDACADQgA3A9CiASADQciiAWoibUIANwMAIANBwKIBaiJuQgA3AwAgA0G4ogFqIm9CADcDACADQgA3A7CiASADQaiiAWoicEIANwMAIANBoKIBaiJxQgA3AwAgA0GYogFqInJCADcDACADQgA3A5CiASADQYiiAWoic0IANwMAIANBgKIBaiJ0QgA3AwAgA0H4oQFqInVCADcDACADQgA3A/ChASADQeihAWoidkIANwMAIANB4KEBaiJ3QgA3AwAgA0HYoQFqInhCADcDACADQgA3A9ChASADQcihAWoieUIANwMAIANBwKEBaiJ6QgA3AwAgA0G4oQFqIntCADcDACADQgA3A7ChASADQaihAWoifEIANwMAIANBoKEBaiJ9QgA3AwAgA0GYoQFqIn5CADcDACADQgA3A5ChASADQYihAWoif0IANwMAIANBgKEBaiKAAUIANwMAIANB+KABaiKBAUIANwMAIANCADcD8KABIANB6KABaiKCAUIANwMAIANB4KABaiKDAUIANwMAIANB2KABaiKEAUIANwMAIANCADcD0KABIANByKABaiKFAUIANwMAIANBwKABaiKGAUIANwMAIANBuKABaiKHAUIANwMAIANCADcDsKABIANBqKABaiKIAUIANwMAIANBoKABaiKJAUIANwMAIANBmKABaiKKAUIANwMAIANCADcDkKABIANBiKABaiKLAUIANwMAIANBgKABaiKMAUIANwMAIANB+J8BaiKNAUIANwMAIANCADcD8J8BIANB6J8BaiKOAUIANwMAIANB4J8BaiKPAUIANwMAIANB2J8BaiKQAUIANwMAIANCADcD0J8BIANByJ8BaiKRAUIANwMAIANBwJ8BaiKSAUIANwMAIANBuJ8BaiKTAUIANwMAIANCADcDsJ8BIANBqJ8BaiKUAUIANwMAIANBoJ8BaiKVAUIANwMAIANBmJ8BaiKWAUIANwMAIANCADcDkJ8BIANBiJ8BaiKXAUIANwMAIANBgJ8BaiKYAUIANwMAIANB+J4BaiKZAUIANwMAIANCADcD8J4BIANB6J4BaiKaAUIANwMAIANB4J4BaiKbAUIANwMAIANB2J4BaiKcAUIANwMAIANCADcD0J4BIANByJ4BaiKdAUIANwMAIANBwJ4BaiKeAUIANwMAIANBuJ4BaiKfAUIANwMAIANCADcDsJ4BIANBqJ4BaiKgAUIANwMAIANBoJ4BaiKhAUIANwMAIANBmJ4BaiKiAUIANwMAIANCADcDkJ4BIANBiJ4BaiKjAUIANwMAIANBgJ4BaiKkAUIANwMAIANB+J0BaiKlAUIANwMAIANCADcD8J0BIANB6J0BaiKmAUIANwMAIANB4J0BaiKnAUIANwMAIANB2J0BaiKoAUIANwMAIANCADcD0J0BIANByJ0BaiKpAUIANwMAIANBwJ0BaiKqAUIANwMAIANBuJ0BaiKrAUIANwMAIANCADcDsJ0BIANBqJ0BaiKsAUIANwMAIANBoJ0BaiKtAUIANwMAIANBmJ0BaiKuAUIANwMAIANCADcDkJ0BIANBiJ0BaiKvAUIANwMAIANBgJ0BaiKwAUIANwMAIANB+JwBaiKxAUIANwMAIANCADcD8JwBIANB6JwBaiKyAUIANwMAIANB4JwBaiKzAUIANwMAIANB2JwBaiK0AUIANwMAIANCADcD0JwBIANByJwBaiK1AUIANwMAIANBwJwBaiK2AUIANwMAIANBuJwBaiK3AUIANwMAIANCADcDsJwBIANBqJwBaiK4AUIANwMAIANBoJwBaiK5AUIANwMAIANBmJwBaiK6AUIANwMAIANCADcDkJwBIANBiJwBaiK7AUIANwMAIANBgJwBaiK8AUIANwMAIANB+JsBaiK9AUIANwMAIANCADcD8JsBIANB6JsBaiK+AUIANwMAIANB4JsBaiK/AUIANwMAIANB2JsBaiLAAUIANwMAIANCADcD0JsBIANByJsBaiLBAUIANwMAIANBwJsBaiLCAUIANwMAIANBuJsBaiLDAUIANwMAIANCADcDsJsBIANBqJsBaiLEAUIANwMAIANBoJsBaiLFAUIANwMAIANBmJsBaiLGAUIANwMAIANCADcDkJsBIANBiJsBaiLHAUIANwMAIANBgJsBaiLIAUIANwMAIANB+JoBaiLJAUIANwMAIANCADcD8JoBIANCATcDgIUBIANBoIUBakIANwMAIEZCADcDACBHQgA3AwAgA0IANwOIhQEgA0IBNwOohQEgA0HIhQFqQgA3AwAgA0HAhQFqQgA3AwAgA0G4hQFqQgA3AwAgA0IANwOwhQEgA0IBNwPQhQEgA0HwhQFqQgA3AwAgA0HohQFqQgA3AwAgA0HghQFqQgA3AwAgA0IANwPYhQEgA0IBNwP4hQEgA0GYhgFqQgA3AwAgA0GQhgFqQgA3AwAgA0GIhgFqQgA3AwAgA0IANwOAhgEgA0IBNwOghgEgA0HAhgFqQgA3AwAgA0G4hgFqQgA3AwAgA0GwhgFqQgA3AwAgA0IANwOohgEgA0IBNwPIhgEgA0HohgFqQgA3AwAgA0HghgFqQgA3AwAgA0HYhgFqQgA3AwAgA0IANwPQhgEgA0IBNwPwhgEgA0GQhwFqQgA3AwAgA0GIhwFqQgA3AwAgA0GAhwFqQgA3AwAgA0IANwP4hgEgA0IBNwOYhwEgA0G4hwFqQgA3AwAgA0GwhwFqQgA3AwAgA0GohwFqQgA3AwAgA0IANwOghwEgA0IBNwPAhwEgA0HghwFqQgA3AwAgA0HYhwFqQgA3AwAgA0HQhwFqQgA3AwAgA0IANwPIhwEgA0IBNwPohwEgA0GIiAFqQgA3AwAgA0GAiAFqQgA3AwAgA0H4hwFqQgA3AwAgA0IANwPwhwEgA0IBNwOQiAEgA0GwiAFqQgA3AwAgA0GoiAFqQgA3AwAgA0GgiAFqQgA3AwAgA0IANwOYiAEgA0IBNwO4iAEgA0HYiAFqQgA3AwAgA0HQiAFqQgA3AwAgA0HIiAFqQgA3AwAgA0IANwPAiAEgA0IBNwPgiAEgA0GAiQFqQgA3AwAgA0H4iAFqQgA3AwAgA0HwiAFqQgA3AwAgA0IANwPoiAEgA0IBNwOIiQEgA0GoiQFqQgA3AwAgA0GgiQFqQgA3AwAgA0GYiQFqQgA3AwAgA0IANwOQiQEgA0IBNwOwiQEgA0HQiQFqQgA3AwAgA0HIiQFqQgA3AwAgA0HAiQFqQgA3AwAgA0IANwO4iQEgA0IBNwPYiQEgA0H4iQFqQgA3AwAgA0HwiQFqQgA3AwAgA0HoiQFqQgA3AwAgA0IANwPgiQEgA0IBNwOAigEgA0GgigFqQgA3AwAgA0GYigFqQgA3AwAgA0GQigFqQgA3AwAgA0IANwOIigEgA0IBNwOoigEgA0HIigFqQgA3AwAgA0HAigFqQgA3AwAgA0G4igFqQgA3AwAgA0IANwOwigEgA0IBNwPQigEgA0HwigFqQgA3AwAgA0HoigFqQgA3AwAgA0HgigFqQgA3AwAgA0IANwPYigEgA0IBNwP4igEgA0GYiwFqQgA3AwAgA0GQiwFqQgA3AwAgA0GIiwFqQgA3AwAgA0IANwOAiwEgA0IBNwOgiwEgA0HAiwFqQgA3AwAgA0G4iwFqQgA3AwAgA0GwiwFqQgA3AwAgA0IANwOoiwEgA0IBNwPIiwEgA0HoiwFqQgA3AwAgA0HgiwFqQgA3AwAgA0HYiwFqQgA3AwAgA0IANwPQiwEgA0IBNwPwiwEgA0GQjAFqQgA3AwAgA0GIjAFqQgA3AwAgA0GAjAFqQgA3AwAgA0IANwP4iwEgA0IBNwOYjAEgA0G4jAFqQgA3AwAgA0GwjAFqQgA3AwAgA0GojAFqQgA3AwAgA0IANwOgjAEgA0IBNwPAjAEgA0HgjAFqQgA3AwAgA0HYjAFqQgA3AwAgA0HQjAFqQgA3AwAgA0IANwPIjAEgA0IBNwPojAEgA0GIjQFqQgA3AwAgA0GAjQFqQgA3AwAgA0H4jAFqQgA3AwAgA0IANwPwjAEgA0IBNwOQjQEgA0GwjQFqQgA3AwAgA0GojQFqQgA3AwAgA0GgjQFqQgA3AwAgA0IANwOYjQEgA0IBNwO4jQEgA0HYjQFqQgA3AwAgA0HQjQFqQgA3AwAgA0HIjQFqQgA3AwAgA0IANwPAjQEgA0IBNwPgjQEgA0GAjgFqQgA3AwAgA0H4jQFqQgA3AwAgA0HwjQFqQgA3AwAgA0IANwPojQEgA0IBNwOIjgEgA0GojgFqQgA3AwAgA0GgjgFqQgA3AwAgA0GYjgFqQgA3AwAgA0IANwOQjgEgA0IBNwOwjgEgA0HQjgFqICMpAwA3AwAgA0HIjgFqIDMpAwA3AwAgA0HAjgFqIDUpAwA3AwAgAyADKQOwpQE3A7iOASADQgE3A9iOASADQfiOAWogSCkDADcDACADQfCOAWogBSkDADcDACADQeiOAWogHCkDADcDACADIAMpA7CkATcD4I4BIANCATcDgI8BIANBoI8BaiAwKQMANwMAIANBmI8BaiA0KQMANwMAIANBkI8BaiA2KQMANwMAIAMgAykD4MEBNwOIjwEgA0IBNwOojwEgA0HIjwFqIFspAwA3AwAgA0HAjwFqIFwpAwA3AwAgA0G4jwFqIF0pAwA3AwAgAyADKQPwowE3A7CPASADQgE3A9CPASADQfCPAWogXikDADcDACADQeiPAWogXykDADcDACADQeCPAWogYCkDADcDACADIAMpA9CjATcD2I8BIANCATcD+I8BIANBmJABaiBhKQMANwMAIANBkJABaiBiKQMANwMAIANBiJABaiBjKQMANwMAIAMgAykDsKMBNwOAkAEgA0IBNwOgkAEgA0HAkAFqIGQpAwA3AwAgA0G4kAFqIGUpAwA3AwAgA0GwkAFqIGYpAwA3AwAgAyADKQOQowE3A6iQASADQgE3A8iQASADQeiQAWogZykDADcDACADQeCQAWogaCkDADcDACADQdiQAWogaSkDADcDACADIAMpA/CiATcD0JABIANCATcD8JABIANBkJEBaiBqKQMANwMAIANBiJEBaiBrKQMANwMAIANBgJEBaiBsKQMANwMAIAMgAykD0KIBNwP4kAEgA0IBNwOYkQEgA0G4kQFqIG0pAwA3AwAgA0GwkQFqIG4pAwA3AwAgA0GokQFqIG8pAwA3AwAgAyADKQOwogE3A6CRASADQgE3A8CRASADQeCRAWogcCkDADcDACADQdiRAWogcSkDADcDACADQdCRAWogcikDADcDACADIAMpA5CiATcDyJEBIANCATcD6JEBIANBiJIBaiBzKQMANwMAIANBgJIBaiB0KQMANwMAIANB+JEBaiB1KQMANwMAIAMgAykD8KEBNwPwkQEgA0IBNwOQkgEgA0GwkgFqIHYpAwA3AwAgA0GokgFqIHcpAwA3AwAgA0GgkgFqIHgpAwA3AwAgAyADKQPQoQE3A5iSASADQgE3A7iSASADQdiSAWogeSkDADcDACADQdCSAWogeikDADcDACADQciSAWogeykDADcDACADIAMpA7ChATcDwJIBIANCATcD4JIBIANBgJMBaiB8KQMANwMAIANB+JIBaiB9KQMANwMAIANB8JIBaiB+KQMANwMAIAMgAykDkKEBNwPokgEgA0IBNwOIkwEgA0GokwFqIH8pAwA3AwAgA0GgkwFqIIABKQMANwMAIANBmJMBaiCBASkDADcDACADIAMpA/CgATcDkJMBIANCATcDsJMBIANB0JMBaiCCASkDADcDACADQciTAWoggwEpAwA3AwAgA0HAkwFqIIQBKQMANwMAIAMgAykD0KABNwO4kwEgA0IBNwPYkwEgA0H4kwFqIIUBKQMANwMAIANB8JMBaiCGASkDADcDACADQeiTAWoghwEpAwA3AwAgAyADKQOwoAE3A+CTASADQgE3A4CUASADQaCUAWogiAEpAwA3AwAgA0GYlAFqIIkBKQMANwMAIANBkJQBaiCKASkDADcDACADIAMpA5CgATcDiJQBIANCATcDqJQBIANByJQBaiCLASkDADcDACADQcCUAWogjAEpAwA3AwAgA0G4lAFqII0BKQMANwMAIAMgAykD8J8BNwOwlAEgA0IBNwPQlAEgA0HwlAFqII4BKQMANwMAIANB6JQBaiCPASkDADcDACADQeCUAWogkAEpAwA3AwAgAyADKQPQnwE3A9iUASADQgE3A/iUASADQZiVAWogkQEpAwA3AwAgA0GQlQFqIJIBKQMANwMAIANBiJUBaiCTASkDADcDACADIAMpA7CfATcDgJUBIANCATcDoJUBIANBwJUBaiCUASkDADcDACADQbiVAWoglQEpAwA3AwAgA0GwlQFqIJYBKQMANwMAIAMgAykDkJ8BNwOolQEgA0IBNwPIlQEgA0HolQFqIJcBKQMANwMAIANB4JUBaiCYASkDADcDACADQdiVAWogmQEpAwA3AwAgAyADKQPwngE3A9CVASADQgE3A/CVASADQZCWAWogmgEpAwA3AwAgA0GIlgFqIJsBKQMANwMAIANBgJYBaiCcASkDADcDACADIAMpA9CeATcD+JUBIANCATcDmJYBIANBuJYBaiCdASkDADcDACADQbCWAWogngEpAwA3AwAgA0GolgFqIJ8BKQMANwMAIAMgAykDsJ4BNwOglgEgA0IBNwPAlgEgA0HglgFqIKABKQMANwMAIANB2JYBaiChASkDADcDACADQdCWAWogogEpAwA3AwAgAyADKQOQngE3A8iWASADQgE3A+iWASADQYiXAWogowEpAwA3AwAgA0GAlwFqIKQBKQMANwMAIANB+JYBaiClASkDADcDACADIAMpA/CdATcD8JYBIANCATcDkJcBIANBsJcBaiCmASkDADcDACADQaiXAWogpwEpAwA3AwAgA0GglwFqIKgBKQMANwMAIAMgAykD0J0BNwOYlwEgA0IBNwO4lwEgA0HYlwFqIKkBKQMANwMAIANB0JcBaiCqASkDADcDACADQciXAWogqwEpAwA3AwAgAyADKQOwnQE3A8CXASADQgE3A+CXASADQYCYAWogrAEpAwA3AwAgA0H4lwFqIK0BKQMANwMAIANB8JcBaiCuASkDADcDACADIAMpA5CdATcD6JcBIANCATcDiJgBIANBqJgBaiCvASkDADcDACADQaCYAWogsAEpAwA3AwAgA0GYmAFqILEBKQMANwMAIAMgAykD8JwBNwOQmAEgA0IBNwOwmAEgA0HQmAFqILIBKQMANwMAIANByJgBaiCzASkDADcDACADQcCYAWogtAEpAwA3AwAgAyADKQPQnAE3A7iYASADQgE3A9iYASADQfiYAWogtQEpAwA3AwAgA0HwmAFqILYBKQMANwMAIANB6JgBaiC3ASkDADcDACADIAMpA7CcATcD4JgBIANCATcDgJkBIANBoJkBaiC4ASkDADcDACADQZiZAWoguQEpAwA3AwAgA0GQmQFqILoBKQMANwMAIAMgAykDkJwBNwOImQEgA0IBNwOomQEgA0HImQFqILsBKQMANwMAIANBwJkBaiC8ASkDADcDACADQbiZAWogvQEpAwA3AwAgAyADKQPwmwE3A7CZASADQgE3A9CZASADQfCZAWogvgEpAwA3AwAgA0HomQFqIL8BKQMANwMAIANB4JkBaiDAASkDADcDACADIAMpA9CbATcD2JkBIANCATcD+JkBIANBmJoBaiDBASkDADcDACADQZCaAWogwgEpAwA3AwAgA0GImgFqIMMBKQMANwMAIAMgAykDsJsBNwOAmgEgA0IBNwOgmgEgA0HAmgFqIMQBKQMANwMAIANBuJoBaiDFASkDADcDACADQbCaAWogxgEpAwA3AwAgAyADKQOQmwE3A6iaASADQgE3A8iaASADQeiaAWogxwEpAwA3AwAgA0HgmgFqIMgBKQMANwMAIANB2JoBaiDJASkDADcDACADIAMpA/CaATcD0JoBIANBkIEBaiAHKQMYIvQBQgAg6AFCABDJAyADQbCAAWogBykDECL1AUIAIOgBQgAQyQMgA0GggAFqIAcpAwgi9gFCACDoAUIAEMkDIANBkIABaiAHKQMAIvcBQgAg6AFCABDJAyADQYCBAWogAykDkIEBIswBQgBCAEL/////vrL98EIQyQMgA0HwgAFqIAMpA4iBASLKAUIAQoGAgIC/sv3wwwBCABDJAyADQeCAAWogygFCAEKR4eXNh4n6mShCABDJAyADQdCAAWogygFCAELdsIWM6LaRqLh/QgAQyQMgA0HAgAFqIMoBQgBCqcDGia7Ok7IwQgAQyQMgA0GAgAFqIPQBQgAg5gFCABDJAyADQaD/AGog9QFCACDmAUIAEMkDIANBkP8AaiD2AUIAIOYBQgAQyQMgA0GA/wBqIPcBQgAg5gFCABDJAyADQfD/AGogAykD4IABItEBIAMpA5iBASLOASADKQOwgAF8ItIBfCLLASADKQP4gAEgzAEgAykD8IABIsoBfCDKAVStfHwizAEgAykDgIABfCLPAUIAQgBC/////76y/fBCEMkDIANB4P8AaiADKQP4fyLKAUIAQoGAgIC/sv3wwwBCABDJAyADQdD/AGogygFCAEKR4eXNh4n6mShCABDJAyADQcD/AGogygFCAELdsIWM6LaRqLh/QgAQyQMgA0Gw/wBqIMoBQgBCqcDGia7Ok7IwQgAQyQMgA0Hw/gBqIPQBQgAg4QFCABDJAyADQZD+AGog9QFCACDhAUIAEMkDIANBgP4AaiD2AUIAIOEBQgAQyQMgA0Hw/QBqIPcBQgAg4QFCABDJAyADQeD+AGogAykDiIABIMwBIM8BVq18ItUBIAMpA6B/fCLNASADKQO4gAEgzgEg0gFWrXwi0wEgAykDoIABfCLOASADKQPQgAF8ItIBIMsBIMwBVq0gAykD6IABIMsBINEBVK18fHwi1wF8IssBIAMpA9B/fCLMASADKQPofyDPASADKQPgfyLKAXwgygFUrXx8Is8BIAMpA/B+fCLRAUIAQgBC/////76y/fBCEMkDIANB0P4AaiADKQPofiLKAUIAQoGAgIC/sv3wwwBCABDJAyADQcD+AGogygFCAEKR4eXNh4n6mShCABDJAyADQbD+AGogygFCAELdsIWM6LaRqLh/QgAQyQMgA0Gg/gBqIMoBQgBCqcDGia7Ok7IwQgAQyQMgA0Hg/QBqIPQBQgAg6gFCABDJAyADQYD9AGog9QFCACDqAUIAEMkDIANB8PwAaiD2AUIAIOoBQgAQyQMgA0Hg/ABqIPcBQgAg6gFCABDJAyADQdD9AGogAykD+H4gzwEg0QFWrXwi2AEgAykDkH58ItABIAMpA6iAASDOASDTAVStfCLWASADKQOQgAF8ItMBIAMpA8CAAXwi1AEg0gEg1wFWrSADKQPYgAEgzgEg0gFWrXx8fCLOASADKQOQf3wi0gEgywEgzQFUrSADKQOofyDNASDVAVStfHx8Is0BIAMpA8B/fCLVASDMASDPAVatIAMpA9h/IMsBIMwBVq18fHwi1wF8IssBIAMpA8B+fCLMASADKQPYfiDRASADKQPQfiLKAXwgygFUrXx8Is8BIAMpA+B9fCLRAUIAQgBC/////76y/fBCEMkDIANBwP0AaiADKQPYfSLKAUIAQoGAgIC/sv3wwwBCABDJAyADQbD9AGogygFCAEKR4eXNh4n6mShCABDJAyADQaD9AGogygFCAELdsIWM6LaRqLh/QgAQyQMgA0GQ/QBqIMoBQgBCqcDGia7Ok7IwQgAQyQMCQAJAIAMpA5h9IAMpA6h+IAMpA7h/IM4BINQBVK0gAykDyIABINMBINQBVq18fCADKQOYgAEg0wEg1gFUrXx8ItMBIAMpA4B/fCLKASDNASDSAVStIAMpA5h/IM4BINIBVq18fHwizgEgAykDsH98ItIBIM4BVK18INIBINUBINcBVq0gAykDyH8gzQEg1QFWrXx8fCLNASDSAVStfCDKASDOAVatIAMpA4h/IMoBINMBVK18fHwi0wEgAykD8H18IsoBIAMpA4h+IM0BIM0BIAMpA4B+fCLOAVatfCDOASDOASDLASDQAVStIAMpA5h+INABINgBVK18fHwizQFWrXx8Is4BIAMpA6B+fCLSASDOAVStfCDSASDSASADKQO4fiDNASDNASADKQOwfnwi0AFWrXwg0AEgzAEgzwFWrSADKQPIfiDLASDMAVatfHx8Is0BINABVK18fCLLAVatfCDKASDOAVatIAMpA/h9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AykDmHwg0AEg0gFUrXx8fCLSASADKQOQenwi0AEgzAEgzgFUrSADKQOoeiDOASDXAVStfHx8Is4BIAMpA8B6fCLVASDNASDPAVStIAMpA9h6IMwBIM8BVq18fHwi1wF8IswBIAMpA8B5fCLPASADKQPYeSDTASADKQPQeSLKAXwgygFUrXx8Is0BIAMpA/B7fCLTAUIAQgBC/////76y/fBCEMkDIANB8PgAaiADKQOIeSLKAUIAQoGAgIC/sv3wwwBCABDJAyADQeD4AGogygFCAEKR4eXNh4n6mShCABDJAyADQdD4AGogygFCAELdsIWM6LaRqLh/QgAQyQMgA0HA+ABqIMoBQgBCqcDGia7Ok7IwQgAQyQMCQAJAIAMpA8h4IAMpA6h5IAMpA7h6INIBINQBVK0gAykDiHwg0QEg1AFWrXx8IAMpA6h7INEBINoBVK18fCLUASADKQOAenwiygEgzgEg0AFUrSADKQOYeiDQASDSAVStfHx8ItIBIAMpA7B6fCLRASDSAVStfCDRASDVASDXAVatIAMpA8h6IM4BINUBVq18fHwizgEg0QFUrXwgygEg0gFWrSADKQOIeiDKASDUAVStfHx8ItABIAMpA6B4fCLKASADKQO4eCDOASDOASADKQOweHwi0gFWrXwg0gEg0gEgywEgzAFWrSADKQOYeSDLASDWAVStfHx8IssBVq18fCLOASADKQOgeXwi0gEgzgFUrXwg0gEgAykDuHkgywEgywEgAykDsHl8ItEBVq18INEBINEBIM0BIM8BVK0gAykDyHkgzAEgzwFWrXx8fCLPAVatfHwiywEg0gFUrXwgygEgzgFWrSADKQOoeCDKASDQAVStfHx8ItEBIAMpA5B7fCLMASADKQO4eyDLASADKQOwe3wiygEgywFUrXwgygEgygEgAykD2HsgAykD+HsgzQEg0wFWrXwizQEgAykD0Ht8IssBIM0BVK18IMsBIMsBIM8BfCLPAVatfHwiywFWrXx8Is0BIAMpA8B4fCLOASDNAVStfCDOASADKQPYeCDLASDLASADKQPQeHwi0gFWrXwg0gEg0gEgAykD6HggzwEgzwEgAykD4Hh8IsoBVq18IMoBIAMpA/h4IAMpA/B4IssBINMBfCDLAVStfHwi1QEgygFUrXx8IsoBVq18fCLLASDOAVStfCDM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AyADQdD0AGogAykD+HUg1gEg6QFWrXwi+wEgAykDkHV8IvEBIAMpA6h3INsBIPIBVK18IvwBIAMpA5B3fCLyASADKQPAd3wi8wEg3AEg+gFWrSADKQPYdyDbASDcAVatfHx8ItsBIAMpA5B2fCLcASDTASDZAVStIAMpA6h2INkBIPkBVK18fHwi2QEgAykDwHZ8IvkBINQBINYBVq0gAykD2HYg0wEg1AFWrXx8fCL6AXwi0wEgAykDwHV8ItQBIAMpA9h1IOkBIAMpA9B1ItABfCDQAVStfHwi1gEgAykD4HR8IukBQgBCAEL/////vrL98EIQyQMgA0HA9ABqIAMpA9h0ItABQgBCgYCAgL+y/fDDAEIAEMkDIANBsPQAaiDQAUIAQpHh5c2HifqZKEIAEMkDIANBoPQAaiDQAUIAQt2whYzotpGouH9CABDJAyADQZD0AGog0AFCAEKpwMaJrs6TsjBCABDJAwJAAkAgAykDmHQgAykDqHUgAykDuHYg2wEg8wFUrSADKQPIdyDyASDzAVatfHwgAykDmHcg8gEg/AFUrXx8IvIBIAMpA4B2fCLQASDZASDcAVStIAMpA5h2INsBINwBVq18fHwi2wEgAykDsHZ8ItwBINsBVK18INwBIPkBIPoBVq0gAykDyHYg2QEg+QFWrXx8fCLZASDcAVStfCDQASDbAVatIAMpA4h2INABIPIBVK18fHwi8gEgAykD8HR8ItABIAMpA4h1INkBINkBIAMpA4B1fCLbAVatfCDbASDbASDTASDxAVStIAMpA5h1IPEBIPsBVK18fHwi2QFWrXx8ItsBIAMpA6B1fCLcASDbAVStfCDcASDcASADKQO4dSDZASDZASADKQOwdXwi8QFWrXwg8QEg8QEg1AEg1gFWrSADKQPIdSDTASDUAVatfHx8ItQBVq18fCLTAVatfCDQASDbAVatIAMpA/h0INABIPIBVK18fHwi8QEgAykD4HN8ItkBIAMpA/hzINMBIAMpA/BzfCLQASDTAVStfCDQASDQASADKQOIdCADKQPodCDWASDpAVatfCLWASADKQOAdHwi0wEg1gFUrXwg0wEg0wEg1AF8ItQBVq18fCLTAVatfHwi1gEgAykDkHR8ItsBINYBVK18INsBIAMpA6h0INMBINMBIAMpA6B0fCLcAVatfCDcASDc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gL+y/fDDAEIAEMkDIANB8O8AaiDQAUIAQpHh5c2HifqZKEIAEMkDIANB4O8AaiDQAUIAQt2whYzotpGouH9CABDJAyADQdDvAGog0AFCAEKpwMaJrs6TsjBCABDJAwJAAkAgAykD2G8gAykDyHAgAykDqHEg1gEg2QFWrSADKQOIciDUASDWAVatfHwgAykDqHAg1AEg+wFUrXx8IvsBIAMpA8BvfCLQASDxASDyAVStIAMpA8hzINkBIPIBVq18fHwi1AEgAykDoHF8ItYBINQBVK18INYBINYBIPMBIPoBVq0gAykDuHEg8QEg8wFWrXx8fCLZAVatfCDQASDUAVatIAMpA8hvINABIPsBVK18fHwi8QEgAykDsG98ItABIAMpA7hzINkBINkBIAMpA7BzfCLUAVatfCDUASDUASDTASDbAVatIAMpA/hyINMBIP0BVK18fHwi0wFWrXx8ItQBIAMpA8BwfCLWASDUAVStfCDWASDWASADKQPYcCDTASDTASADKQPQcHwi2QFWrXwg2QEg2QEg3AEg6QFWrSADKQPocCDbASDcAVatfHx8ItsBVq18fCLTAVatfCDQASDUAVatIAMpA7hvINABIPEBVK18fHwi8QEgAykDoG98ItYBIAMpA6hzINMBIAMpA6BzfCLQASDTAVStfCDQASDQASADKQPociADKQO4cCDpASD5AVatfCLUASADKQPgcnwi0wEg1AFUrXwg0wEg0wEg2wF8ItQBVq18fCLTAVatfHwi2QEgAykD0G98ItsBINkBVK18INsBIAMpA+hvINMBINMBIAMpA+BvfCLcAVatfCDcASDcASADKQP4byDUASDUASADKQPwb3wi0AFWrXwg0AEg0AEgAykDiHAgAykDgHAi0wEg+QF8INMBVK18fCLUAVatfHwi0AFWrXx8ItMBINsBVK18INYBINkBVq0gAykDqG8g1gEg8QFUrXx8fCLWAUKpwMaJrs6TsjBWDQACQCDWAUKpwMaJrs6TsjBRBEAg0wFC3bCFjOi2kai4f1YNAiDTAULdsIWM6LaRqLh/UQ0BQqnAxomuzpOyMCHWAQsg0wEh2QEg0AEh3AEMAgsg0AFCkeHlzYeJ+pkoVg0AQt2whYzotpGouH8h2QEg0AFCkeHlzYeJ+pkoUgRAQqnAxomuzpOyMCHWASDQASHcAQwCC0KR4eXNh4n6mSgh3AEg1AFCgYCAgL+y/fDDAFoNAEKpwMaJrs6TsjAh1gEMAQsg0AFCkeHlzYeJ+pkofSLZASDUAUKBgICAv7L98MMAVK0i2wF9IdwBINMBQqPP+vOXye7XxwB8IukBINABQpHh5c2HifqZKFQg2QEg2wFUcq0i0AF9IdkBINYBINMBQt2whYzotpGouH9UINABIOkBVnKtfUKpwMaJrs6TsjB9IdYBINQBQoGAgIC/sv3wwwB9IdQBC0KpwMaJrs6TsjAh2wEg0gEg2QF8ItIBINkBVCDSASDMASDcAXwizAEg3AFUIMwBIMoBINQBfCLKASDUAVStfCLQASDMAVRyrXwi0wEg0gFUcq0gzQEg1gF8fCLNASHSAQJAAkACQCDNAUKpwMaJrs6TsjBSDQBC3bCFjOi2kai4fyHbASDTASLSAULdsIWM6LaRqLh/Ug0AQpHh5c2HifqZKCHbASDQASLSAUKR4eXNh4n6mShSDQBCgYCAgL+y/fDDACHbASDKASHSASDKAUKBgICAv7L98MMAUQ0BCyDSASDbAVoNACDTASHSASDQASHMAQwBCyDQAUKR4eXNh4n6mSh9ItIBIMoBQoGAgIC/sv3wwwBUrSLUAX0hzAEg0wFCo8/685fJ7tfHAHwi1gEg0AFCkeHlzYeJ+pkoVCDSASDUAVRyrSLQAX0h0gEgzQEg0wFC3bCFjOi2kai4f1Qg0AEg1gFWcq19QqnAxomuzpOyMH0hzQEgygFCgYCAgL+y/fDDAH0hygELIANB0O0AaiDRAUIAIO0BQgAQyQMgA0GQ7gBqINEBQgAg5wFCABDJAyADQdDuAGog0QFCACDYAUIAEMkDIANBkO8AaiDRAUIAINcBQgAQyQMgA0HA7QBqIAMpA9BtItABQgBCAEL/////vrL98EIQyQMgA0Gw7QBqIAMpA8htItEBQgBCgYCAgL+y/fDDAEIAEMkDIANBoO0AaiDRAUIAQpHh5c2HifqZKEIAEMkDIANBkO0AaiDRAUIAQt2whYzotpGouH9CABDJAyADQYDtAGog0QFCAEKpwMaJrs6TsjBCABDJAyADQfDsAGogywFCACDtAUIAEMkDIANBgO4AaiDLAUIAIOcBQgAQyQMgA0HA7gBqIMsBQgAg2AFCABDJAyADQYDvAGogywFCACDXAUIAEMkDIANB4OwAaiADKQOgbSLZASADKQPYbSLUASADKQOQbnwi1gF8ItEBIAMpA7htINABIAMpA7BtIssBfCDLAVStfHwi0AEgAykD8Gx8ItMBQgBCAEL/////vrL98EIQyQMgA0HQ7ABqIAMpA+hsIssBQgBCgYCAgL+y/fDDAEIAEMkDIANBwOwAaiDLAUIAQpHh5c2HifqZKEIAEMkDIANBsOwAaiDLAUIAQt2whYzotpGouH9CABDJAyADQaDsAGogywFCAEKpwMaJrs6TsjBCABDJAyADQZDsAGogzwFCACDtAUIAEMkDIANB8O0AaiDPAUIAIOcBQgAQyQMgA0Gw7gBqIM8BQgAg2AFCABDJAyADQfDuAGogzwFCACDXAUIAEMkDIANBgOwAaiADKQP4bCDQASDTAVatfCLpASADKQOAbnwizwEgAykDmG4g1AEg1gFWrXwi2wEgAykD0G58ItQBIAMpA5BtfCLWASDQASDRAVStIAMpA6htINEBINkBVK18fHwi8QF8ItEBIAMpA8BsfCLQASADKQPYbCDTASADKQPQbCLLAXwgywFUrXx8ItMBIAMpA5BsfCLZAUIAQgBC/////76y/fBCEMkDIANB8OsAaiADKQOIbCLLAUIAQoGAgIC/sv3wwwBCABDJAyADQeDrAGogywFCAEKR4eXNh4n6mShCABDJAyADQdDrAGogywFCAELdsIWM6LaRqLh/QgAQyQMgA0HA6wBqIMsBQgBCqcDGia7Ok7IwQgAQyQMgA0Gw6wBqIM4BQgAg7QFCABDJAyADQeDtAGogzgFCACDnAUIAEMkDIANBoO4AaiDOAUIAINgBQgAQyQMgA0Hg7gBqIM4BQgAg1wFCABDJAyADQaDrAGogAykDmGwg0wEg2QFWrXwi8gEgAykD8G18Is4BIAMpA9huINQBINsBVK18IvMBIAMpA5BvfCLbASADKQOAbXwi3AEg1gEg8QFWrSADKQOYbSDUASDWAVatfHx8ItQBIAMpA8BufCLWASDPASDRAVatIAMpA4huIM8BIOkBVK18fHwizwEgAykDsGx8IukBINABINMBVq0gAykDyGwg0AEg0QFUrXx8fCLxAXwi0QEgAykD4Gt8ItABIAMpA/hrINkBIAMpA/BrIssBfCDLAVStfHwi0wEgAykDsGt8ItkBQgBCAEL/////vrL98EIQyQMgA0GQ6wBqIAMpA6hrIssBQgBCgYCAgL+y/fDDAEIAEMkDIANBgOsAaiDLAUIAQpHh5c2HifqZKEIAEMkDIANB8OoAaiDLAUIAQt2whYzotpGouH9CABDJAyADQeDqAGogywFCAEKpwMaJrs6TsjBCABDJAwJAAkAgAykD6GogAykDyGsgAykDqGwg1AEg3AFUrSADKQOIbSDbASDcAVatfHwgAykDmG8g2wEg8wFUrXx8ItsBIAMpA4BvfCLLASDPASDWAVStIAMpA8huINQBINYBVq18fHwi1AEgAykDoGx8ItYBINQBVK18INYBIOkBIPEBVq0gAykDuGwgzwEg6QFWrXx8fCLPASDWAVStfCDLASDUAVatIAMpA4hvIMsBINsBVK18fHwi2wEgAykD8G58IssBIAMpA7huIM8BIM8BIAMpA7BufCLUAVatfCDUASDUASDOASDRAVatIAMpA/htIM4BIPIBVK18fHwizwFWrXx8Is4BIAMpA8BrfCLUASDOAVStfCDUASDUASADKQPYayDPASDPASADKQPQa3wi1gFWrXwg1gEg0AEg0wFWrSADKQPoayDQASDRAVStfHx8ItEBINYBVK18fCLPAVatfCDLASDOAVatIAMpA/huIMsBINsBVK18fHwi1gEgAykD4G58IssBIAMpA6huIM8BIM8BIAMpA6BufCLOAVatfCDOASDOASADKQPobSADKQO4ayDTASDZAVatfCLQASADKQPgbXwizwEg0AFUrXwgzwEgzwEg0QF8ItEBVq18fCLPAVatfHwizgEgAykD4Gp8ItQBIM4BVK18INQBINQBIAMpA/hqIM8BIM8BIAMpA/BqfCLTAVatfCDTASDTASADKQOIayDRASDRASADKQOAa3wizwFWrXwgzwEgzwEgAykDmGsgAykDkGsi0QEg2QF8INEBVK18fCLRAVatfHwi0AFWrXx8ItMBVq18IMsBIM4BVq0gAykD6G4gywEg1gFUrXx8fCLOAUKpwMaJrs6TsjBWDQACQCDOAUKpwMaJrs6TsjBRBEAg0wFC3bCFjOi2kai4f1YNAiDTAULdsIWM6LaRqLh/UgRAINABIcsBINMBIc8BQqnAxomuzpOyMCHOAQwECyDQAUKR4eXNh4n6mShWDQJC3bCFjOi2kai4fyHPASDQAUKR4eXNh4n6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AELdsIWM6LaRqLh/QgAQyQMgA0Gg3QBqIMsBQgBCqcDGia7Ok7IwQgAQyQMCQCADKQOoXSADKQOIXiADKQPoXiDUASDcAVStIAMpA8hfINsBINwBVq18fCADKQPYYSDbASDlAVStfHwi2wEgAykDwGF8IssBIM8BINYBVK0gAykDiGEg1AEg1gFWrXx8fCLUASADKQPgXnwi1gEg1AFUrXwg1gEg3QEg3wFWrSADKQP4XiDPASDdAVatfHx8Is8BINYBVK18IMsBINQBVq0gAykDyGEgywEg2wFUrXx8fCLbASADKQOwYXwiywEgAykD+GAgzwEgzwEgAykD8GB8ItQBVq18INQBINQBIM4BINEBVq0gAykDuGAgzgEg5AFUrXx8fCLPAVatfHwizgEgAykDgF58ItQBIM4BVK18INQBINQBIAMpA5heIM8BIM8BIAMpA5BefCLWAVatfCDWASDQASDTAVatIAMpA6heINABINEBVK18fHwi0QEg1gFUrXx8Is8BVq18IMsBIM4BVq0gAykDuGEgywEg2wFUrXx8fCLWASADKQOgYXwiywEgAykD6GAgzwEgzwEgAykD4GB8Is4BVq18IM4BIM4BIAMpA6hgIAMpA/hdINMBINkBVq18ItABIAMpA6BgfCLPASDQAVStfCDPASDPASDRAXwi0QFWrXx8Is8BVq18fCLOASADKQOgXXwi1AEgzgFUrXwg1AEg1AEgAykDuF0gzwEgzwEgAykDsF18ItMBVq18INMBINMBIAMpA8hdINEBINEBIAMpA8BdfCLPAVatfCDPASDPASADKQPYXSADKQPQXSLRASDZAXwg0QFUrXx8ItEBVq18fCLQAVatfHwi0wFWrXwgywEgzgFWrSADKQOoYSDLASDWAVStfHx8Is4BQqnAxomuzpOyMFYNACDOAUKpwMaJrs6TsjBSBEAg0AEhywEg0wEhzwEMAgsg0wFC3bCFjOi2kai4f1YNACDTAULdsIWM6LaRqLh/UgRAINABIcsBINMBIc8BQqnAxomuzpOyMCHOAQwCCyDQAUKR4eXNh4n6mShWDQBC3bCFjOi2kai4fyHPASDQAUKR4eXNh4n6mShSBEAg0AEhywFCqcDGia7Ok7IwIc4BDAILQpHh5c2HifqZKCHLASDRAUKBgICAv7L98MMAWg0AQqnAxomuzpOyMCHOAQwBCyDQAUKR4eXNh4n6mSh9Is8BINEBQoGAgIC/sv3wwwBUrSLUAX0hywEg0wFCo8/685fJ7tfHAHwi1gEg0AFCkeHlzYeJ+pkoVCDPASDUAVRyrSLQAX0hzwEgzgEg0wFC3bCFjOi2kai4f1Qg0AEg1gFWcq19QqnAxomuzpOyMH0hzgEg0QFCgYCAgL+y/fDDAH0h0QELIAxBAWohBSAKQSBqIQogB0EoaiEHIAxBBUkNAAsMAQsgBkGBgICAeDYCACAGQgI3AwgMAwtB0c7FAC0AABoCQAJAAkACQAJAQYAHQQgQ1gQiDARAIAxBAEGAB/wLACAIQQFrIRcgCCEHA0AgByIFQQFrIQcCfwJAAkACfgJAIBcgGUkEQCAFQR1PDQMgFCAHQQV0Ig1qIQpCr76f0Jn4nYUOIdEBIA0gRWoiBSkDACLWASHOASDWAUKvvp/QmfidhQ5SDQFCrozlw/ftqLfmACHRASAFKQMIIs4BQq6M5cP37ai35gBSDQFCqZqD+9nSnf42IdEBIAUpAxAizgFCqZqD+9nSnf42Ug0BQvv////Eg43LrH8h0QEgBSkDGCLOAUL7////xIONy6x/Ug0BQqmag/vZ0p3+NiHOAUKujOXD9+2ot+YADAILIAcgGUGor8IAENkDAAsgzgEg0QFWIAUpAxgh0QENAiAFKQMQIc4BIAUpAwgLIcsBQqmag/vZ0p3+NiDOAX0izwEg0QFC+////8SDjcusf1atItABfSHYAUKujOXD9+2ot+YAIMsBfSLUASDPASDQAVQgzgFCqZqD+9nSnf42VnKtIs8BfSHTAUKvvp/QmfidhQ4g1gF9IdwBQvv////Eg43LrH8g0QF9IdcBIM8BINQBViDLAUKujOXD9+2ot+YAVnIMAgsgB0EcQbivwgAQ2QMAC0LdsIWM6LaRqLh/IAUpAwgiywFCrozlw/ftqLfmAH0izwEgBSkDECLOAUKpmoP72dKd/jZUIM4BQqmag/vZ0p3+Nn0izgEg0QFC+////8SDjcusf1StItABVHKtItQBfSLVAX0i2QEgzgEg0AF9Is4BQpHh5c2HifqZKFZCkeHlzYeJ+pkoIM4BfSLOASDRAUKDgICA/Mn1ww98Qv7////AzYKPvH9UrSLQAVRyrSLbAX0h0wEgzgEg0AF9IdgBIMsBQq6M5cP37ai35gBUIM8BINQBVHKtINYBfULY/uXZx8axtz58IdwBQvz///+Dtoq8cCDRAX0h1wEg2QEg2wFUINUBQt2whYzotpGouH9WcgshHCADQZDdAGogCikDGCLOAUIAINcBQgAQyQMgA0Gg3ABqIAopAxAi0QFCACDXAUIAEMkDIANBgNwAaiAKKQMIItABQgAg1wFCABDJAyADQeDbAGogCikDACLVAUIAINcBQgAQyQMgA0GA3QBqIAMpA5BdItQBQgBCAEL/////vrL98EIQyQMgA0Hw3ABqIAMpA4hdIssBQgBCgYCAgL+y/fDDAEIAEMkDIANB4NwAaiDLAUIAQpHh5c2HifqZKEIAEMkDIANB0NwAaiDLAUIAQt2whYzotpGouH9CABDJAyADQcDcAGogywFCAEKpwMaJrs6TsjBCABDJAyADQcDbAGogzgFCACDYAUIAEMkDIANB4NoAaiDRAUIAINgBQgAQyQMgA0HQ2gBqINABQgAg2AFCABDJAyADQcDaAGog1QFCACDYAUIAEMkDIANBsNsAaiADKQPgXCLbASADKQOYXSLYASADKQOgXHwi2QF8Is8BIAMpA/hcINQBIAMpA/BcIssBfCDLAVStfHwi1AEgAykDwFt8ItcBQgBCAEL/////vrL98EIQyQMgA0Gg2wBqIAMpA7hbIssBQgBCgYCAgL+y/fDDAEIAEMkDIANBkNsAaiDLAUIAQpHh5c2HifqZKEIAEMkDIANBgNsAaiDLAUIAQt2whYzotpGouH9CABDJAyADQfDaAGogywFCAEKpwMaJrs6TsjBCABDJAyADQbDaAGogzgFCACDTAUIAEMkDIANB0NkAaiDRAUIAINMBQgAQyQMgA0Hw2ABqINABQgAg0wFCABDJAyADQeDYAGog1QFCACDTAUIAEMkDIANBoNoAaiADKQPIWyDUASDXAVatfCLkASADKQPgWnwi0wEgAykDqFwg2AEg2QFWrXwi3QEgAykDgFx8ItgBIAMpA9BcfCLZASDPASDUAVatIAMpA+hcIM8BINsBVK18fHwi5QF8Is8BIAMpA5BbfCLUASADKQOoWyDXASADKQOgWyLLAXwgywFUrXx8ItcBIAMpA7BafCLbAUIAQgBC/////76y/fBCEMkDIANBkNoAaiADKQOoWiLLAUIAQoGAgIC/sv3wwwBCABDJAyAD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AVatIAMpA9hWINkBINsBVq18fHwi2QEgAykDsFd8ItsBIM8BINABVK0gAykDyFcg0AEg5AFUrXx8fCLQASADKQPwVXwi5AEgzgEg0QFWrSADKQOIViDOASDPAVStfHx8IuUBfCLPASADKQOgVXwizgEgAykDuFUg3AEgAykDsFUiywF8IMsBVK18fCLRASADKQPQWHwi3AFCAEIAQv////++sv3wQhDJAyADQdDUAGogAykD6FQiywFCAEKBgICAv7L98MMAQgAQyQMgA0HA1ABqIMsBQgBCkeHlzYeJ+pkoQgAQyQMgA0Gw1ABqIMsBQgBC3bCFjOi2kai4f0IAEMkDIANBoNQAaiDLAUIAQqnAxomuzpOyMEIAEMkDAkACQCADKQOoVCADKQPoVyADKQOoVyADKQP4VCDdASDnAVStfCLnASADKQOgV3wiywEg5wFUrXwgywEgywEg2QEg3wFUrSADKQPIViDdASDfAVatfHx8It0BVq18IN0BIN0BINABINsBVK0gAykDuFcg2QEg2wFWrXx8fCLLAVatfCLbASADKQPgV3wi2QEg2wFUrXwg2QEg2QEgAykD6FUgywEgywEgAykD4FV8ItsBVq18INsBINsBIOQBIOUBVq0gAykD+FUg0AEg5AFWrXx8fCLLAVatfHwi0AFWrXwg0AEg0AEgAykD+FcgywEgywEgAykD8Fd8ItkBVq18INkBIM8BINUBVK0gAykDiFgg1QEg6wFUrXx8fCLLASDZAVStfHwi1QFWrXwi3QEgAykDoFh8ItkBIAMpA4hVINUBINUBIAMpA4BVfCLQAVatfCDQASDQASADKQOYVSDLASDLASADKQOQVXwi1QFWrXwg1QEg1QEgzgEg0QFWrSADKQOoVSDOASDPAVStfHx8ItsBVq18fCLLAVatfHwizwEgAykDuFggywEgywEgAykDsFh8Is4BVq18IM4BIM4BIAMpA8hYIAMpA9hYINEBINwBVq18ItEBIAMpA8BYfCLLASDRAVStfCDLASDLASDbAXwi0QFWrXx8IssBVq18fCLOASADKQOgVHwi2wEgzgFUrXwg2wEg2wEgAykDuFQgywEgywEgAykDsFR8ItUBVq18INUBINUBIAMpA8hUINEBINEBIAMpA8BUfCLLAVatfCDLASDLASADKQPYVCADKQPQVCLRASDc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ASADKQOoTyDZASADKQOgTyLNAXwgzQFUrXx8ItkBIAMpA4BOfCLcAUIAQgBC/////76y/fBCEMkDIANB4M0AaiADKQP4TSLNAUIAQoGAgIC/sv3wwwBCABDJAyADQdDNAGogzQFCAEKR4eXNh4n6mShCABDJAyADQcDNAGogzQFCAELdsIWM6LaRqLh/QgAQyQMgA0GwzQBqIM0BQgBCqcDGia7Ok7IwQgAQyQMgA0HwzABqIMwBQgAgzwFCABDJAyADQZDMAGog0gFCACDPAUIAEMkDIANBsMsAaiDQAUIAIM8BQgAQyQMgA0GgywBqINUBQgAgzwFCABDJAyADQeDMAGogAykDiE4g2QEg3AFWrXwi6wEgAykDoE18Is0BIAMpA9hOIN0BIN8BVq18IucBIAMpA7BOfCLdASADKQOAT3wi3wEgzgEg2QFWrSADKQOYTyDOASDlAVStfHx8IuwBfCLOASADKQPQTXwi2QEgAykD6E0g3AEgAykD4E0izwF8IM8BVK18fCLcASADKQPwTHwi5QFCAEIAQv////++sv3wQhDJAyADQdDMAGogAykD6EwizwFCAEKBgICAv7L98MMAQgAQyQMgA0HAzABqIM8BQgBCkeHlzYeJ+pkoQgAQyQMgA0GwzABqIM8BQgBC3bCFjOi2kai4f0IAEMkDIANBoMwAaiDPAUIAQqnAxomuzpOyMEIAEMkDIANB0M8AaiDMAUIAIOQBIBytfSLMAUIAEMkDIANB4M4AaiDSAUIAIMwBQgAQyQMgA0HAzgBqINABQgAgzAFCABDJAyADQaDOAGog1QFCACDMAUIAEMkDIANBgMwAaiADKQP4TCDcASDlAVatfCLtASADKQOQTHwizwEgAykDuE4g3QEg5wFUrXwi5wEgAykDkE58ItIBIAMpA/BOfCLQASDfASDsAVatIAMpA4hPIN0BIN8BVq18fHwi1QEgAykDkE18It0BIM0BIM4BVq0gAykDqE0gzQEg6wFUrXx8fCLNASADKQPATXwi3wEg2QEg3AFWrSADKQPYTSDOASDZAVatfHx8IusBfCLOASADKQPATHwi2QEgAykD2Ewg5QEgAykD0EwizAF8IMwBVK18fCLcASADKQPQT3wi5AFCAEIAQv////++sv3wQhDJAyADQfDLAGogAykDiEwizAFCAEKBgICAv7L98MMAQgAQyQMgA0HgywBqIMwBQgBCkeHlzYeJ+pkoQgAQyQMgA0HQywBqIMwBQgBC3bCFjOi2kai4f0IAEMkDIANBwMsAaiDMAUIAQqnAxomuzpOyMEIAEMkDAkACQCADKQPISyADKQOoTCADKQO4TSDQASDVAVatIAMpA/hOINABINIBVK18fCADKQOYTiDSASDnAVStfHwi5QEgAykDgE18IswBIM0BIN0BVK0gAykDmE0g1QEg3QFWrXx8fCLSASADKQOwTXwi0AEg0gFUrXwg0AEg3wEg6wFWrSADKQPITSDNASDfAVatfHx8Is0BINABVK18IMwBINIBVq0gAykDiE0gzAEg5QFUrXx8fCLVASADKQOgS3wizAEgAykDuEsgzQEgzQEgAykDsEt8ItIBVq18INIBINIBIM4BIM8BVK0gAykDmEwgzwEg7QFUrXx8fCLPAVatfHwizQEgAykDoEx8ItIBIM0BVK18INIBIAMpA7hMIM8BIM8BIAMpA7BMfCLQAVatfCDQASDQASDZASDcAVatIAMpA8hMIM4BINkBVq18fHwizgFWrXx8Is8BINIBVK18IMwBIM0BVq0gAykDqEsgzAEg1QFUrXx8fCLZASADKQOgTnwizQEgAykDyE4gzwEgAykDwE58IswBIM8BVK18IMwBIMwBIAMpA+hOIAMpA9hPINwBIOQBVq18ItIBIAMpA+BOfCLPASDSAVStfCDPASDOASDPAXwizgFWrXx8Is8BVq18fCLSASADKQPAS3wi1QEg0gFUrXwg1QEg1QEgAykD2EsgzwEgzwEgAykD0Et8ItABVq18INABINABIAMpA+hLIM4BIM4BIAMpA+BLfCLMAVatfCDMASDMASADKQP4SyADKQPwSyLPASDkAXwgzwFUrXx8Is8BVq18fCLMAVatfHwi0AFWrXwgzQEg0gFWrSADKQOoTiDNASDZAVStfHx8Is4BQqnAxomuzpOyMFYNAAJAIM4BQqnAxomuzpOyMFEEQCDQAULdsIWM6LaRqLh/Vg0CINABQt2whYzotpGouH9RDQFCqcDGia7Ok7IwIc4BCyDQASHNASDMASHSAQwCCyDMAUKR4eXNh4n6mShWDQBC3bCFjOi2kai4fyHNASDMAUKR4eXNh4n6mShSBEBCqcDGia7Ok7IwIc4BIMwBIdIBDAILQpHh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AykDqEkgzQEg1QFUrXx8fCLNASADKQPASXwi1QEgzAEgzwFWrSADKQPYSSDLASDMAVatfHx8ItcBfCLLASADKQPASHwizAEgAykD2Egg0AEgAykD0EgiygF8IMoBVK18fCLPASADKQPgR3wi0AFCAEIAQv////++sv3wQhDJAyADQcDHAGogAykD2EciygFCAEKBgICAv7L98MMAQgAQyQMgA0GwxwBqIMoBQgBCkeHlzYeJ+pkoQgAQyQMgA0GgxwBqIMoBQgBC3bCFjOi2kai4f0IAEMkDIANBkMcAaiDKAUIAQqnAxomuzpOyMEIAEMkDAkACQCADKQOYRyADKQOoSCADKQO4SSDOASDUAVStIAMpA8hKINMBINQBVq18fCADKQOYSiDTASDWAVStfHwi0wEgAykDgEl8IsoBIM0BINIBVK0gAykDmEkgzgEg0gFWrXx8fCLOASADKQOwSXwi0gEgzgFUrXwg0gEg1QEg1wFWrSADKQPISSDNASDVAVatfHx8Is0BINIBVK18IMoBIM4BVq0gAykDiEkgygEg0wFUrXx8fCLTASADKQPwR3wiygEgAykDiEggzQEgzQEgAykDgEh8Is4BVq18IM4BIM4BIMsBINEBVK0gAykDmEgg0QEg2AFUrXx8fCLNAVatfHwizgEgAykDoEh8ItIBIM4BVK18INIBINIBIAMpA7hIIM0BIM0BIAMpA7BIfCLRAVatfCDRASDMASDPAVatIAMpA8hIIMsBIMwBVq18fHwizQEg0QFUrXx8IssBVq18IMoBIM4BVq0gAykD+EcgygEg0wFUrXx8fCLRASADKQPgRnwizAEgAykD+EYgywEgAykD8EZ8IsoBIMsBVK18IMoBIMoBIAMpA4hHIAMpA+hHIM8BINABVq18Is8BIAMpA4BHfCLLASDPAVStfCDLASDLASDNAXwizwFWrXx8IssBVq18fCLNASADKQOQR3wizgEgzQFUrXwgzgEgzgEgAykDqEcgywEgywEgAykDoEd8ItIBVq18INIBINIBIAMpA7hHIM8BIM8BIAMpA7BHfCLLAVatfCDLASDLASADKQPIRyADKQPARyLKASDQAXwgygFUrXx8IsoBVq18fCLLAVatfHwizwFWrXwgzAEgzQFWrSADKQPoRiDMASDRAVStfHx8Is0BQqnAxomuzpOyMFYN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INgBVK18fCLYASADKQPARHwiygEg0AEg0wFUrSADKQPYRCDNASDTAVatfHx8IswBIAMpA/BEfCLPASDMAVStfCDPASDPASDUASDXAVatIAMpA4hFINABINQBVq18fHwizQFWrXwgygEgzAFWrSADKQPIRCDKASDYAVStfHx8ItABIAMpA7BDfCLKASADKQPIQyDNASDNASADKQPAQ3wizAFWrXwgzAEgzAEgywEgzgFWrSADKQPYQyDLASDaAVStfHx8IssBVq18fCLMASADKQPgQ3wizwEgzAFUrXwgzwEgAykD+EMgywEgywEgAykD8EN8Is0BVq18IM0BIM0BINEBINIBVK0gAykDiEQgzgEg0gFWrXx8fCLOAVatfHwiywEgzwFUrXwgygEgzAFWrSADKQO4QyDKASDQAVStfHx8ItABIAMpA6BCfCLMASADKQO4QiDLASADKQOwQnwiygEgywFUrXwgygEgygEgAykDyEIgAykDqEMg0QEg1QFWrXwizwEgAykDwEJ8IssBIM8BVK18IMsBIMsBIM4BfCLPAVatfHwiywFWrXx8Is4BIAMpA9BCfCLSASDOAVStfCDSASADKQPoQiDLASDLASADKQPgQnwi0QFWrXwg0QEg0QEgAykD+EIgzwEgzwEgAykD8EJ8IsoBVq18IMoBIMoBIAMpA4hDIAMpA4BDIssBINUBfCDLAVStfHwizQFWrXx8IsoBVq18fCLLASDSAVStfCDMASDOAVatIAMpA6hCIMwBINABVK18fHwi0gFCqcDGia7Ok7IwVg0DINIBQqnAxomuzpOyMFENAgwEC0EIQYAHQciswgAQyAQACyAGINoBNwMQIAZCAjcDCCAGQYGAgIB4NgIAIAxBgAcQ3wQMBgsgywFC3bCFjOi2kai4f1YNACDLAULdsIWM6LaRqLh/UgRAQqnAxomuzpOyMCHSAQwCCyDKAUKR4eXNh4n6mShWDQBC3bCFjOi2kai4fyHaASDKAUKR4eXNh4n6mShSBEBCqcDGia7Ok7IwIdIBIMoBIdYBDAMLQpHh5c2HifqZKCHWASDNAUKBgICAv7L98MMAWg0AQqnAxomuzpOyMCHSAQwCCyDKAUKR4eXNh4n6mSh9IswBIM0BQoGAgIC/sv3wwwBUrSLPAX0h1gEgywFCo8/685fJ7tfHAHwizgEgygFCkeHlzYeJ+pkoVCDMASDPAVRyrSLKAX0h2gEg0gEgywFC3bCFjOi2kai4f1QgygEgzgFWcq19QqnAxomuzpOyMH0h0gEgzQFCgYCAgL+y/fDDAH0hzQEMAQsgywEh2gEgygEh1gELIANB4MEAaiATKQMYIsoBQgAg9AFCABDJAyADQdDAAGogEykDECLLAUIAIPQBQgAQyQMgA0HAP2ogEykDCCLMAUIAIPQBQgAQyQMgA0GwPmogEykDACLPAUIAIPQBQgAQyQMgA0HQwQBqIAMpA+BBItABQgBCAEL/////vrL98EIQyQMgA0HAwQBqIAMpA9hBIs4BQgBCgYCAgL+y/fDDAEIAEMkDIANBsMEAaiDOAUIAQpHh5c2HifqZKEIAEMkDIANBoMEAaiDOAUIAQt2whYzotpGouH9CABDJAyADQZDBAGogzgFCAEKpwMaJrs6TsjBCABDJAyADQfDBAGogygFCACD1AUIAEMkDIANB4MAAaiDLAUIAIPUBQgAQyQMgA0HQP2ogzAFCACD1AUIAEMkDIANBwD5qIM8BQgAg9QFCABDJAyADQcDAAGogAykDsEEi2AEgAykD6EEi1QEgAykD0EB8ItcBfCLRASADKQPIQSDQASADKQPAQSLOAXwgzgFUrXx8ItABIAMpA/BBfCLTAUIAQgBC/////76y/fBCEMkDIANBsMAAaiADKQPIQCLOAUIAQoGAgIC/sv3wwwBCABDJAyADQaDAAGogzgFCAEKR4eXNh4n6mShCABDJAyADQZDAAGogzgFCAELdsIWM6LaRqLh/QgAQyQMgA0GAQGsgzgFCAEKpwMaJrs6TsjBCABDJAyADQYDCAGogygFCACD2AUIAEMkDIANB8MAAaiDLAUIAIPYBQgAQyQMgA0HgP2ogzAFCACD2AUIAEMkDIANB0D5qIM8BQgAg9gFCABDJAyADQbA/aiADKQP4QSDQASDTAVatfCLZASADKQPgQHwi1AEgAykD2EAg1QEg1wFWrXwi2wEgAykDwD98ItUBIAMpA6BBfCLXASDQASDRAVStIAMpA7hBINEBINgBVK18fHwi3AF8ItEBIAMpA6BAfCLQASADKQO4QCDTASADKQOwQCLOAXwgzgFUrXx8ItMBIAMpA4BCfCLYAUIAQgBC/////76y/fBCEMkDIANBoD9qIAMpA7g/Is4BQgBCgYCAgL+y/fDDAEIAEMkDIANBkD9qIM4BQgBCkeHlzYeJ+pkoQgAQyQMgA0GAP2ogzgFCAELdsIWM6LaRqLh/QgAQyQMgA0HwPmogzgFCAEKpwMaJrs6TsjBCABDJAyADQZDCAGogygFCACD3AUIAEMkDIANBgMEAaiDLAUIAIPcBQgAQyQMgA0HwP2ogzAFCACD3AUIAEMkDIANB4D5qIM8BQgAg9wFCABDJAyADQaA+aiADKQOIQiDTASDYAVatfCLeASADKQPwQHwiywEgAykDyD8g1QEg2wFUrXwi2wEgAykDsD58IswBIAMpA5BBfCLPASDXASDcAVatIAMpA6hBINUBINcBVq18fHwizgEgAykD0D98ItUBINEBINQBVK0gAykD6EAg1AEg2QFUrXx8fCLUASADKQOQQHwi1wEg0AEg0wFWrSADKQOoQCDQASDRAVStfHx8ItkBfCLRASADKQOQP3wi0AEgAykDqD8g2AEgAykDoD8iygF8IMoBVK18fCLTASADKQOQQnwi2AFCAEIAQv////++sv3wQhDJAyADQZA+aiADKQOoPiLKAUIAQoGAgIC/sv3wwwBCABDJAyADQYA+aiDKAUIAQpHh5c2HifqZKEIAEMkDIANB8D1qIMoBQgBC3bCFjOi2kai4f0IAEMkDIANB4D1qIMoBQgBCqcDGia7Ok7IwQgAQyQMCQAJAIAMpA+g9IAMpA/g+IAMpA4hAIM4BIM8BVK0gAykDmEEgzAEgzwFWrXx8IAMpA7g+IMwBINsBVK18fCLbASADKQPAPnwiygEg1AEg1QFUrSADKQPYPyDOASDVAVatfHx8IswBIAMpA4BAfCLPASDMAVStfCDPASDPASDXASDZAVatIAMpA5hAINQBINcBVq18fHwizgFWrXwgygEgzAFWrSADKQPIPiDKASDbAVStfHx8ItQBIAMpA9A+fCLKASADKQPoPyDOASDOASADKQPgP3wizAFWrXwgzAEgzAEgywEg0QFWrSADKQP4QCDLASDeAVStfHx8IssBVq18fCLMASADKQPwPnwizwEgzAFUrXwgzwEgAykDiD8gywEgywEgAykDgD98Is4BVq18IM4BIM4BINABINMBVq0gAykDmD8g0AEg0QFUrXx8fCLRAVatfHwiywEgzwFUrXwgygEgzAFWrSADKQPYPiDK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fCLTASADKQPQPHwi2AFCAEIAQv////++sv3wQhDJAyADQYA6aiADKQOYOiLKAUIAQoGAgIC/sv3wwwBCABDJAyADQfA5aiDKAUIAQpHh5c2HifqZKEIAEMkDIANB4DlqIMoBQgBC3bCFjOi2kai4f0IAEMkDIANB0DlqIMoBQgBCqcDGia7Ok7IwQgAQyQMCQAJAIAMpA9g5IAMpA+g6IAMpA/g7IM4BINEBVq0gAykDiD0gzgEgzwFUrXx8IAMpA6g6IM8BIOABVK18fCLZASADKQPAOXwiygEg1AEg1QFUrSADKQPYOiDRASDVAVatfHx8Is8BIAMpA/A7fCLOASDPAVStfCDOASDOASDXASDbAVatIAMpA4g8INQBINcBVq18fHwi0QFWrXwgygEgzwFWrSADKQPIOSDKASDZAVStfHx8ItQBIAMpA7A5fCLKASADKQPIOiDRASDRASADKQPAOnwizwFWrXwgzwEgzwEgywEgzAFWrSADKQPYOyDLASDeAVStfHx8IssBVq18fCLPASADKQPgOnwizgEgzwFUrXwgzgEgzgEgAykD+DogywEgywEgAykD8Dp8ItEBVq18INEBINEBINABINMBVq0gAykDiDsgzAEg0AFWrXx8fCLQAVatfHwiywFWrXwgygEgzwFWrSADKQO4OSDKASDUAVStfHx8ItQBIAMpA6A5fCLKASADKQO4OiDLASDLASADKQOwOnwizAFWrXwgzAEgzAEgAykDyDsgAykD2Dwg0wEg2AFWrXwizwEgAykDwDt8IssBIM8BVK18IMsBIMsBINABfCLPAVatfHwiywFWrXx8Is4BIAMpA9A5fCLQASDOAVStfCDQASDQASADKQPoOSDLASDLASADKQPgOXwizAFWrXwgzAEgzAEgAykD+DkgzwEgzwEgAykD8Dl8IssBVq18IMsBIMsBIAMpA4g6IAMpA4A6Is8BINgBfCDPAVStfHwi0QFWrXx8IssBVq18fCLMAVatfCDKASDOAVatIAMpA6g5IMoBINQBVK18fHwizgFCqcDGia7Ok7IwVg0AAkAgzgFCqcDGia7Ok7IwUQRAIMwBQt2whYzotpGouH9WDQIgzAFC3bCFjOi2kai4f1ENAUKpwMaJrs6TsjAhzgELIMwBIc8BIMsBIcoBDAILIMsBQpHh5c2HifqZKFYNAELd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wMaJrs6TsjB8Ic4BCyDYAUI/hiDQAUI/hiDXAUIBiIQh1wEg2AFCAYgh2AEgzgFCP4Yg1AFCAYiEIdoBINQBQj+GIMsBQgGIhCHWASDLAUI/hiDVAUIBiIQhywEgzgFCAYghzgEg0AFCAYiEIdABIMoBQgGDUA0ACyADINcBNwPApQEgAyDKATcDyKUBIAMg0AE3A7ilASADINgBNwOwpQELINIBIdUBAkACQAJAAkACQCDSASDYASLUAVINACDMASHVASDQASLUASDMAVINACDXASLUASDTASLVAVINACDKASHUASDNASHVASDKASDNAVENAQsg1AEg1QFYDQAgAyDKASDNAX0i1AE3A8ilASADINcBINMBfSLeASDKASDNAVStIsoBfSLVATcDwKUBIAMg0AEgzAF9It0BIMoBIN4BViDTASDXAVZyrSLKAX0i3gE3A7ilASADINgBINIBfSDKASDdAVYgzAEg0AFWcq19ItgBNwOwpQECQAJAIM4BIsoBINEBItABUg0AINoBIsoBINsBItABUg0AINYBIsoBINkBItABUg0AIM8BIdABIM8BIMsBIsoBUQ0BCyDKASDQAVQNAgsgzgEg0QF9INoBINsBVCDaASDbAX0i2gEg1gEg2QFUINYBINkBfSLWASDLASDPAVStIt0BVHKtIv4BVHKtfSHOASDLASDPAX0hywEg1QEh1wEg3gEh0AEg1AEhygEg1gEg3QF9IdYBINoBIP4BfSHaAQwDCyADIM0BIMoBfSLUATcDyKQBIAMg0wEg1wF9It4BIMoBIM0BVq0izQF9ItUBNwPApAEgAyDMASDQAX0i3QEg0wEg1wFUIM0BIN4BVnKtIs0BfSLeATcDuKQBIAMg0gEg2AF9IMwBINABVCDNASDdAVZyrX0i0gE3A7CkAQJAAkAgzgEizAEg0QEizQFSDQAg2gEizAEg2wEizQFSDQAg1gEizAEg2QEizQFSDQAgywEizAEgzwEizQFRDQELIMwBIM0BVg0CCyDRASDOAX0g2wEg2gF9It0BINkBINYBfSL+ASDLASDPAVatIoECVCDWASDZAVZyrSLZAVQg2gEg2wFWcq19IdEBIM8BIMsBfSHPASDVASHTASDeASHMASDUASHNASDdASDZAX0h2wEg/gEggQJ9IdkBDAILIM4BQt2whYzotpGouH8g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AVRyrXwi2gFWcq18QqnAxomuzpOyMHwhywELINcBQj+GINMBQj+GINUBQgGIhCHVASDXAUIBiCHXASDLAUI/hiDaAUIBiIQh3QEg2gFCP4YgygFCAYiEId4BIMoBQj+GINYBQgGIhCHKASDLAUIBiCHLASDTAUIBiIQh0wEgzAFCAYNQDQALIAMg1QE3A8ClASADIMwBNwPIpQEgAyDTATcDuKUBIAMg1wE3A7ClAQsCQAJAAkACQAJAINgBItYBINcBItoBUg0AINABItYBINMBItoBUg0AINQBIdYBINUBItoBINQBUg0AINIBIdYBINIBIMwBItoBUQ0BCyDWASDaAVoNACADIMwBINIBfSLWATcDyKUBIAMg1QEg1AF9IuMBIMwBINIBVK0izAF9ItoBNwPApQEgAyDTASDQAX0i6QEgzAEg4wFWINQBINUBVnKtIswBfSLjATcDuKUBIAMg1wEg2AF9IMwBIOkBViDQASDTAVZyrX0i1wE3A7ClASDOASHTAQJAAkAgywEizAEgzgFSDQAg3AEi0wEg3QEizAFSDQAg4AEi0wEg3gEizAFSDQAgygEhzAEgygEgzQEi0wFRDQELIMwBINMBVA0CCyDLASDOAX0g3QEg3AF9IukBIN4BIOABfSL6ASDKASDNAVStIvwBVCDeASDgAVRyrSL9AVQg3AEg3QFWcq19IcsBIMoBIM0BfSHKASDaASHVASDjASHTASDWASHMASD6ASD8AX0h3gEg6QEg/QF9Id0BDAMLIAMg0gEgzAF9ItYBNwPIpAEgAyDUASDVAX0i4wEgzAEg0gFWrSLSAX0i2gE3A8CkASADINABINMBfSLpASDUASDVAVQg0gEg4wFWcq0i0gF9IuMBNwO4pAEgAyDYASDXAX0g0AEg0wFUINIBIOkBVnKtfSLYATcDsKQBIM4BIdIBIMsBIdABAkACQCDLASDOAVINACDcASLSASDdASLQAVINACDgASLSASDeASLQAVINACDNASHSASDKASHQASDKASDNAVENAQsg0AEg0gFWDQILIM4BIMsBfSDcASDdAVQg3AEg3QF9ItwBIOABIN4BfSLpASDKASDNAVatIvoBVCDeASDgAVZyrSLgAVRyrX0hzgEgzQEgygF9Ic0BINoBIdQBIOMBIdABINYBIdIBINwBIOABfSHcASDpASD6AX0h4AEMAgsgywFC3bCFjOi2kai4fyDcAX0iywFCkeHlzYeJ+pkoIOABfSLMASDNAUKBgICAv7L98MMAVq0i0wFUIOABQpHh5c2HifqZKFZyrSLVAVQg3AFC3bCFjOi2kai4f1ZyrSDOAXx9IMsBINUBfSLVASDdAXwiywEg1QFUIMsBIMwBINMBfSLTASDeAXwizAEg0wFUIMwBQoGAgIC/sv3wwwAgzQF9ItMBIMoBfCLKASDTAVStfCLeASDMAVRyrXwi3QEgywFUcq18QqnAxomuzpOyMHwhywEg2gEh1QEg4wEh0wEg1gEhzAEMAQsgzgEgywF9Qt2whYzotpGouH8g3QF9Is4BQpHh5c2HifqZKCDeAX0i0gEgygFCgYCAgL+y/fDDAFatItABVCDeAUKR4eXNh4n6mShWcq0i1AFUIN0BQt2whYzotpGouH9Wcq19IM4BINQBfSLUASDcAXwizgEg1AFUIM4BINIBINABfSLQASDgAXwi0gEg0AFUINIBQoGAgIC/sv3wwwAgygF9ItABIM0BfCLNASDQAVStfCLgASDSAVRyrXwi3AEgzgFUcq18QqnAxomuzpOyMHwhzgEg2gEh1AEg4wEh0AEg1gEh0gELIANBsKQBaiADQeDBAWpBIBDxAw0ACwsgA0GwNWogzwFCACDoAUIAEMkDIANB0DRqIM8BQgAg3wFCABDJAyADQcA0aiDPAUIAIOUBQgAQyQMgA0GwNGogzwFCACDhAUIAEMkDIANBoDVqIAMpA7A1IswBQgBCAEL/////vrL98EIQyQMgA0GQNWogAykDqDUiygFCAEKBgICAv7L98MMAQgAQyQMgA0GANWogygFCAEKR4eXNh4n6mShCABDJAyADQfA0aiDKAUIAQt2whYzotpGouH9CABDJAyADQeA0aiDKAUIAQqnAxomuzpOyMEIAEMkDIANBoDRqINkBQgAg6AFCABDJAyADQcAzaiDZAUIAIN8BQgAQyQMgA0GwM2og2QFCACDlAUIAEMkDIANBoDNqINkBQgAg4QFCABDJAyADQZA0aiADKQOANSLUASADKQO4NSLQASADKQPQNHwi0wF8IssBIAMpA5g1IMwBIAMpA5A1IsoBfCDKAVStfHwizAEgAykDoDR8Is8BQgBCAEL/////vrL98EIQyQMgA0GANGogAykDmDQiygFCAEKBgICAv7L98MMAQgAQyQMgA0HwM2ogygFCAEKR4eXNh4n6mShCABDJAyADQeAzaiDKAUIAQt2whYzotpGouH9CABDJAyADQdAzaiDKAUIAQqnAxomuzpOyMEIAEMkDIANBkDNqINsBQgAg6AFCABDJAyADQbAyaiDbAUIAIN8BQgAQyQMgA0GgMmog2wFCACDlAUIAEMkDIANBkDJqINsBQgAg4QFCABDJAyADQYAzaiADKQOoNCDMASDPAVatfCLYASADKQPAM3wi0gEgAykD2DQg0AEg0wFWrXwi1QEgAykDwDR8ItABIAMpA/A0fCLTASDLASDMAVatIAMpA4g1IMsBINQBVK18fHwi1gF8IssBIAMpA/AzfCLMASADKQOINCDPASADKQOANCLKAXwgygFUrXx8Is8BIAMpA5AzfCLUAUIAQgBC/////76y/fBCEMkDIANB8DJqIAMpA4gzIsoBQgBCgYCAgL+y/fDDAEIAEMkDIANB4DJqIMoBQgBCkeHlzYeJ+pkoQgAQyQMgA0HQMmogygFCAELdsIWM6LaRqLh/QgAQyQMgA0HAMmogygFCAEKpwMaJrs6TsjBCABDJAyADQYAyaiDRAUIAIOgBQgAQyQMgA0GgMWog0QFCACDfAUIAEMkDIANBkDFqINEBQgAg5QFCABDJAyADQYAxaiDRAUIAIOEBQgAQyQMgA0HwMWogAykDmDMgzwEg1AFWrXwi2gEgAykDsDJ8ItEBIAMpA8g0INABINUBVK18ItkBIAMpA7A0fCLVASADKQPgNHwi1wEg0wEg1gFWrSADKQP4NCDQASDTAVatfHx8ItABIAMpA7AzfCLTASDLASDSAVStIAMpA8gzINIBINgBVK18fHwi0gEgAykD4DN8ItgBIMwBIM8BVq0gAykD+DMgywEgzAFWrXx8fCLWAXwiywEgAykD4DJ8IswBIAMpA/gyINQBIAMpA/AyIsoBfCDKAVStfHwizwEgAykDgDJ8ItQBQgBCAEL/////vrL98EIQyQMgA0HgMWogAykD+DEiygFCAEKBgICAv7L98MMAQgAQyQMgA0HQMWogygFCAEKR4eXNh4n6mShCABDJAyADQcAxaiDKAUIAQt2whYzotpGouH9CABDJAyADQbAxaiDKAUIAQqnAxomuzpOyMEIAEMkDAkACQCADKQO4MSADKQPIMiADKQPYMyDQASDXAVStIAMpA+g0INUBINcBVq18fCADKQO4NCDVASDZAVStfHwi1QEgAykDoDN8IsoBINIBINMBVK0gAykDuDMg0AEg0wFWrXx8fCLQASADKQPQM3wi0wEg0AFUrXwg0wEg1gEg2AFUrSADKQPoMyDSASDYAVatfHx8ItIBINMBVK18IMoBINABVq0gAykDqDMgygEg1QFUrXx8fCLVASADKQOQMnwiygEgAykDqDIg0gEg0gEgAykDoDJ8ItABVq18INABINABIMsBINEBVK0gAykDuDIg0QEg2gFUrXx8fCLSAVatfHwi0QEgAykDwDJ8ItABINEBVK18INABINABIAMpA9gyINIBINIBIAMpA9AyfCLTAVatfCDTASDTASDMASDPAVatIAMpA+gyIMsBIMwBVq18fHwizAFWrXx8IssBVq18IMoBINEBVq0gAykDmDIgygEg1QFUrXx8fCLTASADKQOAMXwi0gEgAykDmDEgywEgAykDkDF8IsoBIMsBVK18IMoBIMoBIAMpA6gxIAMpA4gyIM8BINQBVq18Is8BIAMpA6AxfCLLASDPAVStfCDLASDLASDMAXwizAFWrXx8IssBVq18fCLPASADKQOwMXwi0QEgzwFUrXwg0QEg0QEgAykDyDEgywEgywEgAykDwDF8ItABVq18INABINABIAMpA9gxIMwBIMwBIAMpA9AxfCLKAVatfCDKASADKQPoMSADKQPgMSLLASDUAXwgywFUrXx8IssBIMoBVK18fCLKAVatfHwizAFWrXwgzwEg0gFUrSADKQOIMSDSASDTAVStfHx8Is8BQqnAxomuzpOyMFYNAAJAIM8BQqnAxomuzpOyMFEEQCDMAULdsIWM6LaRqLh/Vg0CIMwBQt2whYzotpGouH9SBEAgygEh2AEgzAEh0AFCqcDGia7Ok7IwIc8BDAQLIMoBQpHh5c2HifqZKFYNAkLdsIWM6LaRqLh/IdABIMoBQpHh5c2HifqZKFENASDKASHYAUKpwMaJrs6TsjAhzwEMAwsgygEh2AEgzAEh0AEMAgtCkeHlzYeJ+pkoIdgBIMsBQoGAgIC/sv3wwwBaDQBCqcDGia7Ok7IwIc8BDAELIMoBQpHh5c2HifqZKH0i0gEgywFCgYCAgL+y/fDDAFStItEBfSHYASDMAUKjz/rzl8nu18cAfCLTASDKAUKR4eXNh4n6mShUINEBINIBVnKtIsoBfSHQASDPASDMAULdsIWM6LaRqLh/VCDKASDTAVZyrX1CqcDGia7Ok7IwfSHPASDLAUKBgICAv7L98MMAfSHLAQsgA0GwL2og6AFCACD0AUIAEMkDIANB0C5qIN8BQgAg9AFCABDJAyADQfAtaiDlAUIAIPQBQgAQyQMgA0GQLWog4QFCACD0AUIAEMkDIANBoC9qIAMpA7AvItIBQgBCAEL/////vrL98EIQyQMgA0GQL2ogAykDqC8iygFCAEKBgICAv7L98MMAQgAQyQMgA0GAL2ogygFCAEKR4eXNh4n6mShCABDJAyADQfAuaiDKAUIAQt2whYzotpGouH9CABDJAyADQeAuaiDKAUIAQqnAxomuzpOyMEIAEMkDIANB8C9qIOgBQgAg9QFCABDJAyADQeAvaiDfAUIAIPUBQgAQyQMgA0HQL2og5QFCACD1AUIAEMkDIANBwC9qIOEBQgAg9QFCABDJAyADQcAuaiADKQOALyLXASADKQO4LyLUASADKQPQLnwi1QF8IswBIAMpA5gvINIBIAMpA5AvIsoBfCDKAVStfHwi0gEgAykD8C98ItEBQgBCAEL/////vrL98EIQyQMgA0GwLmogAykDyC4iygFCAEKBgICAv7L98MMAQgAQyQMgA0GgLmogygFCAEKR4eXNh4n6mShCABDJAyADQZAuaiDKAUIAQt2whYzotpGouH9CABDJAyADQYAuaiDKAUIAQqnAxomuzpOyMEIAEMkDIANBsDBqIOgBQgAg9gFCABDJAyADQaAwaiDfAUIAIPYBQgAQyQMgA0GQMGog5QFCACD2AUIAEMkDIANBgDBqIOEBQgAg9gFCABDJAyADQeAtaiADKQP4LyDRASDSAVStfCLeASADKQPgL3wi0wEgAykD2C4g1AEg1QFWrXwi2gEgAykD8C18ItQBIAMpA/AufCLVASDMASDSAVatIAMpA4gvIMwBINcBVK18fHwi3QF8IswBIAMpA6AufCLSASADKQO4LiDRASADKQOwLiLKAXwgygFUrXx8ItEBIAMpA7AwfCLXAUIAQgBC/////76y/fBCEMkDIANB0C1qIAMpA+gtIsoBQgBCgYCAgL+y/fDDAEIAEMkDIANBwC1qIMoBQgBCkeHlzYeJ+pkoQgAQyQMgA0GwLWogygFCAELdsIWM6LaRqLh/QgAQyQMgA0GgLWogygFCAEKpwMaJrs6TsjBCABDJAyADQfAwaiDoAUIAIPcBQgAQyQMgA0HgMGog3wFCACD3AUIAEMkDIANB0DBqIOUBQgAg9wFCABDJAyADQcAwaiDhAUIAIPcBQgAQyQMgA0GALWogAykDuDAg0QEg1wFWrXwi4wEgAykDoDB8ItYBIAMpA/gtINQBINoBVK18IukBIAMpA5AtfCLaASADKQPgLnwi2QEg1QEg3QFWrSADKQP4LiDUASDVAVatfHx8ItQBIAMpA9AvfCLVASDMASDTAVStIAMpA+gvINMBIN4BVK18fHwi0wEgAykDkC58It4BINEBINIBVK0gAykDqC4gzAEg0gFWrXx8fCLdAXwizAEgAykDwC18ItIBIAMpA9gtINcBIAMpA9AtIsoBfCDKAVStfHwi0QEgAykD8DB8ItcBQgBCAEL/////vrL98EIQyQMgA0HwLGogAykDiC0iygFCAEKBgICAv7L98MMAQgAQyQMgA0HgLGogygFCAEKR4eXNh4n6mShCABDJAyADQdAsaiDKAUIAQt2whYzotpGouH9CABDJAyADQcAsaiDKAUIAQqnAxomuzpOyMEIAEMkDAkACQCADKQPILCADKQOoLSADKQOILiDUASDZAVStIAMpA+guINkBINoBVK18fCADKQOYLSDaASDpAVStfHwi2gEgAykDwC98IsoBINMBINUBVK0gAykD2C8g1AEg1QFWrXx8fCLUASADKQOALnwi1QEg1AFUrXwg1QEg3QEg3gFUrSADKQOYLiDTASDeAVatfHx8ItMBINUBVK18IMoBINQBVq0gAykDyC8gygEg2gFUrXx8fCLaASADKQOAMHwiygEgAykDmDAg0wEg0wEgAykDkDB8ItQBVq18INQBINQBIMwBINYBVK0gAykDqDAg1gEg4wFUrXx8fCLTAVatfHwi1AEgAykDoC18ItUBINQBVK18INUBINUBIAMpA7gtINMBINMBIAMpA7AtfCLWAVatfCDWASDRASDSAVStIAMpA8gtIMwBINIBVq18fHwi0wEg1gFUrXx8IswBVq18IMoBINQBVq0gAykDiDAgygEg2gFUrXx8fCLWASADKQPAMHwiygEgAykD2DAgzAEgzAEgAykD0DB8ItIBVq18INIBINIBIAMpA+gwIAMpA/gwINEBINcBVq18ItEBIAMpA+AwfCLMASDRAVStfCDMASDMASDTAXwi0QFWrXx8IswBVq18fCLSASADKQPALHwi1QEg0gFUrXwg1QEg1QEgAykD2CwgzAEgzAEgAykD0Cx8ItQBVq18INQBINQBIAMpA+gsINEBINEBIAMpA+AsfCLMAVatfCDMASDMASADKQP4LCADKQPwLCLRASDXAXwg0QFUrXx8ItEBVq18fCLTAVatfHwi1AFWrXwgygEg0gFWrSADKQPIMCDKASDWAVStfHx8IsoBQqnAxomuzpOyMFYNAAJAIMoBQqnAxomuzpOyMFEEQCDUAULdsIWM6LaRqLh/Vg0CINQBQt2whYzotpGouH9SBEAg0wEh0gEg1AEhzAFCqcDGia7Ok7IwIcoBDAQLINMBQpHh5c2HifqZKFYNAkLdsIWM6LaRqLh/IcwBINMBQpHh5c2HifqZKFENASDTASHSAUKpwMaJrs6TsjAhygEMAwsg0wEh0gEg1AEhzAEMAgtCkeHlzYeJ+pkoIdIBINEBQoGAgIC/sv3wwwBaDQBCqcDGia7Ok7IwIcoBDAELINMBQpHh5c2HifqZKH0izAEg0QFCgYCAgL+y/fDDAFStItUBfSHSASDUAUKjz/rzl8nu18cAfCLXASDTAUKR4eXNh4n6mShUIMwBINUBVHKtItMBfSHMASDKASDUAULdsIWM6LaRqLh/VCDTASDXAVZyrX1CqcDGia7Ok7IwfSHKASDRAUKBgICAv7L98MMAfSHRAQsgA0GwLGog0QFCACDNAUIAEMkDIANB0CtqINIBQgAgzQFCABDJAyADQcAraiDMAUIAIM0BQgAQyQMgA0GwK2ogygFCACDNAUIAEMkDIANBoCxqIAMpA7AsItQBQgBCAEL/////vrL98EIQyQMgA0GQLGogAykDqCwizQFCAEKBgICAv7L98MMAQgAQyQMgA0GALGogzQFCAEKR4eXNh4n6mShCABDJAyADQfAraiDNAUIAQt2whYzotpGouH9CABDJAyADQeAraiDNAUIAQqnAxomuzpOyMEIAEMkDIANBoCtqINEBQgAg4AFCABDJAyADQcAqaiDSAUIAIOABQgAQyQMgA0GwKmogzAFCACDgAUIAEMkDIANBoCpqIMoBQgAg4AFCABDJAyADQZAraiADKQOALCLZASADKQO4LCLWASADKQPQK3wi2gF8ItMBIAMpA5gsINQBIAMpA5AsIs0BfCDNAVStfHwi1AEgAykDoCt8ItUBQgBCAEL/////vrL98EIQyQMgA0GAK2ogAykDmCsizQFCAEKBgICAv7L98MMAQgAQyQMgA0HwKmogzQFCAEKR4eXNh4n6mShCABDJAyADQeAqaiDNAUIAQt2whYzotpGouH9CABDJAyADQdAqaiDNAUIAQqnAxomuzpOyMEIAEMkDIANBkCpqINEBQgAg3AFCABDJAyADQbApaiDSAUIAINwBQgAQyQMgA0GgKWogzAFCACDcAUIAEMkDIANBkClqIMoBQgAg3AFCABDJAyADQYAqaiADKQOoKyDUASDVAVatfCLeASADKQPAKnwi1wEgAykD2Csg1gEg2gFWrXwi4AEgAykDwCt8ItYBIAMpA/ArfCLaASDTASDUAVatIAMpA4gsINMBINkBVK18fHwi3QF8ItMBIAMpA/AqfCLUASADKQOIKyDVASADKQOAKyLNAXwgzQFUrXx8ItUBIAMpA5AqfCLZAUIAQgBC/////76y/fBCEMkDIANB8ClqIAMpA4gqIs0BQgBCgYCAgL+y/fDDAEIAEMkDIANB4ClqIM0BQgBCkeHlzYeJ+pkoQgAQyQMgA0HQKWogzQFCAELdsIWM6LaRqLh/QgAQyQMgA0HAKWogzQFCAEKpwMaJrs6TsjBCABDJAyADQYApaiDRAUIAIM4BQgAQyQMgA0GgKGog0gFCACDOAUIAEMkDIANBkChqIMwBQgAgzgFCABDJAyADQYAoaiDKAUIAIM4BQgAQyQMgA0HwKGogAykDmCog1QEg2QFWrXwi4wEgAykDsCl8IswBIAMpA8grINYBIOABVK18IuABIAMpA7ArfCLNASADKQPgK3wizgEg2gEg3QFWrSADKQP4KyDWASDaAVatfHx8ItIBIAMpA7AqfCLRASDTASDXAVStIAMpA8gqINcBIN4BVK18fHwi1wEgAykD4Cp8ItYBINQBINUBVq0gAykD+Cog0wEg1AFWrXx8fCLeAXwi0wEgAykD4Cl8ItQBIAMpA/gpIAMpA/ApIsoBINkBfCDKAVStfHwi1QEgAykDgCl8ItoBQgBCAEL/////vrL98EIQyQMgA0HgKGogAykD+CgiygFCAEKBgICAv7L98MMAQgAQyQMgA0HQKGogygFCAEKR4eXNh4n6mShCABDJAyADQcAoaiDKAUIAQt2whYzotpGouH9CABDJAyADQbAoaiDKAUIAQqnAxomuzpOyMEIAEMkDAkACQCADKQO4KCADKQPIKSADKQPYKiDOASDSAVatIAMpA+grIM0BIM4BVq18fCADKQO4KyDNASDgAVStfHwi2QEgAykDoCp8IsoBINEBINcBVq0gAykDuCog0QEg0gFUrXx8fCLNASADKQPQKnwizgEgzQFUrXwgzgEgzgEg1gEg3gFWrSADKQPoKiDWASDXAVStfHx8ItIBVq18IMoBIM0BVq0gAykDqCogygEg2QFUrXx8fCLRASADKQOQKXwiygEgAykDqCkg0gEg0gEgAykDoCl8Is0BVq18IM0BIM0BIMwBINMBVq0gAykDuCkgzAEg4wFUrXx8fCLMAVatfHwizQEgAykDwCl8Is4BIM0BVK18IM4BIAMpA9gpIMwBIMwBIAMpA9ApfCLSAVatfCDSASDSASDUASDVAVatIAMpA+gpINMBINQBVq18fHwi0wFWrXx8IswBIM4BVK18IMoBIM0BVq0gAykDmCkgygEg0QFUrXx8fCLUASADKQOAKHwiygEgAykDmCggzAEgzAEgAykDkCh8Is0BVq18IM0BIM0BIAMpA6goIAMpA4gpINUBINoBVq18Is4BIAMpA6AofCLMASDOAVStfCDMASDMASDTAXwizgFWrXx8IswBVq18fCLNASADKQOwKHwi0wEgzQFUrXwg0wEg0wEgAykDyCggzAEgzAEgAykDwCh8ItIBVq18INIBINIBIAMpA9goIM4BIM4BIAMpA9AofCLMAVatfCDMASADKQPoKCADKQPgKCLOASDaAXwgzgFUrXx8ItEBIMwBVK18fCLMAVatfHwi0gFWrXwgygEgzQFWrSADKQOIKCDKASDUAVStfHx8Is4BQqnAxomuzpOyMFYNAAJAIM4BQqnAxomuzpOyMFEEQCDSAULdsIWM6LaRqLh/Vg0CINIBQt2whYzotpGouH9SBEAgzAEhzQEg0gEhygFCqcDGia7Ok7IwIc4BDAQLIMwBQpHh5c2HifqZKFYNAkLdsIWM6LaRqLh/IcoBIMwBQpHh5c2HifqZKFENASDMASHN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BSkDACLMAUIAINEBQgAQyQMgA0HgJWogzAFCACDNAUIAEMkDIANB0CRqIMwBQgAgygFCABDJAyADQcAjaiDMAUIAIM4BQgAQyQMgA0GwJGogAykDiCcg1AEg2gFWrXwi3QEgAykD8CV8IswBIAMpA9glINcBIN4BVK18It4BIAMpA8AkfCLNASADKQOgJ3wizgEg1gEg4AFWrSADKQO4JyDWASDXAVStfHx8ItEBIAMpA/AkfCLXASDSASDVAVStIAMpA4gmINUBINkBVK18fHwi1QEgAykDoCZ8ItYBINMBINQBVq0gAykDuCYg0gEg0wFWrXx8fCLZAXwi0gEgAykDoCV8ItMBIAMpA7glIAMpA7AlIsoBINoBfCDKAVStfHwi1AEgAykD8CZ8ItoBQgBCAEL/////vrL98EIQyQMgA0GgJGogAykDuCQiygFCAEKBgICAv7L98MMAQgAQyQMgA0GQJGogygFCAEKR4eXNh4n6mShCABDJAyADQYAkaiDKAUIAQt2whYzotpGouH9CABDJAyADQfAjaiDKAUIAQqnAxomuzpOyMEIAEMkDIAMpA/gjIAMpA4glIAMpA5gmIM4BINEBVq0gAykDqCcgzQEgzgFWrXx8IAMpA8gkIM0BIN4BVK18fCLeASADKQPgI3wiygEg1QEg1wFUrSADKQP4JCDRASDXAVatfHx8Is0BIAMpA5AmfCLOASDNAVStfCDOASDOASDWASDZAVatIAMpA6gmINUBINYBVq18fHwi0QFWrXwgygEgzQFWrSADKQPoIyDKASDeAVStfHx8ItUBIAMpA9AjfCLKASADKQPoJCDRASDRASADKQPgJHwizQFWrXwgzQEgzQEgzAEg0gFWrSADKQP4JSDMASDdAVStfHx8IswBVq18fCLNASADKQOAJXwizgEgzQFUrXwgzgEgAykDmCUgzAEgzAEgAykDkCV8ItEBVq18INEBINEBINMBINQBVq0gAykDqCUg0gEg0wFWrXx8fCLSAVatfHwizAEgzgFUrXwgygEgzQFWrSADKQPYIyDKASDVAVStfHx8ItUBIAMpA8AjfCLNASADKQPYJCDMASADKQPQJHwiygEgzAFUrXwgygEgygEgAykD6CUgAykD+CYg1AEg2gFWrXwizgEgAykD4CV8IswBIM4BVK18IMwBIMwBINIBfCLO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h4n6mShCABDJAyADQcAfaiDKAUIAQt2whYzotpGouH9CABDJAyADQbAfaiDKAUIAQqnAxomuzpOyMEIAEMkDAkACQCADKQO4HyADKQPIICADKQPYISDQASDUAVatIAMpA+giIM8BINABVq18fCADKQOIICDPASDeAVStfHwi3gEgAykDoB98IsoBINMBINUBVK0gAykDuCAg1AEg1QFWrXx8fCLPASADKQPQIXwi0AEgzwFUrXwg0AEg0AEg2AEg2QFWrSADKQPoISDTASDYAVatfHx8ItMBVq18IMoBIM8BVq0gAykDqB8gygEg3gFUrXx8fCLUASADKQOQH3wiygEgAykDqCAg0wEg0wEgAykDoCB8Is8BVq18IM8BIM8BIMsBIMwBVq0gAykDuCEgywEg3QFUrXx8fCLLAVatfHwizwEgAykDwCB8ItABIM8BVK18INABIAMpA9ggIMsBIMsBIAMpA9AgfCLTAVatfCDTASDTASDRASDSAVStIAMpA+ggIMwBINIBVq18fHwi0gFWrXx8IssBINABVK18IMoBIM8BVq0gAykDmB8gygEg1AFUrXx8fCLUASADKQOAH3wiygEgAykDmCAgywEgywEgAykDkCB8IswBVq18IMwBIMwBIAMpA6ghIAMpA7giINEBINcBVq18Is8BIAMpA6AhfCLLASDPAVStfCDLASDLASDSAXwizwFWrXx8IssBVq18fCLSASADKQOwH3wi0AEg0gFUrXwg0AEg0AEgAykDyB8gywEgywEgAykDwB98ItMBVq18INMBINMBIAMpA9gfIM8BIM8BIAMpA9AffCLLAVatfCDLASDLASADKQPoHyADKQPgHyLMASDXAXwgzAFUrXx8ItEBVq18fCLMAVatfHwizwFWrXwgygEg0gFWrSADKQOIHyDKASDUAVStfHx8IssBQqnAxomuzpOyMFYNAAJAIMsBQqnAxomuzpOyMFEEQCDPAULdsIWM6LaRqLh/Vg0CIM8BQt2whYzotpGouH9RDQFCqcDGia7Ok7IwIcsBCyDPASHKASDMASHSAQwCCyDMAUKR4eXNh4n6mShWDQBC3bCFjOi2kai4fyHKASDMAUKR4eXNh4n6mShSBEBCqcDGia7Ok7IwIcsBIMwBIdIBDAILQpHh5c2HifqZKCHSASDRAUKBgICAv7L98MMAWg0A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QgBCpYm5+peWtIsCQgAQyQMgA0HwFmogAykD6Bgg0QEg1QFWrXwi2gEgAykDoBl8IssBIAMpA8gZINMBINgBVK18ItgBIAMpA4AafCLMASADKQOAF3wizwEg1AEg1gFWrSADKQPYFyDTASDUAVatfHx8Is0BIAMpA9AZfCLTASDOASDQAVStIAMpA5gZINABINcBVK18fHwi0AEgAykD8Bd8ItQBINEBINIBVK0gAykDiBggzgEg0gFWrXx8fCLXAXwizgEgAykDsBd8ItIBIAMpA8gXINUBIAMpA8AXIsoBfCDKAVStfHwi0QEgAykD8Bh8ItUBQv////++sv3wQn4iygFCAEKBgICAv7L98MMAQgAQyQMgA0HgFmogygFCAEKR4eXNh4n6mShCABDJAyADQdAWaiDKAUIAQt2whYzotpGouH9CABDJAyADQcAWaiDKAUIAQqnAxomuzpOyMEIAEMkDIAMpA8gWIAMpA6gaIAMpA5gaIAMpA4gaIMwBINgBVK18ItgBIAMpA5AafCLKASDYAVStfCDKASDKASDNASDPAVStIAMpA4gXIMwBIM8BVq18fHwizAFWrXwgzAEgzAEg0AEg0wFUrSADKQPYGSDNASDTAVatfHx8IsoBVq18Is8BIAMpA6AafCLMASDPAVStfCDMASDMASADKQPoFyDKASDKASADKQPgF3wizwFWrXwgzwEgzwEg1AEg1wFWrSADKQP4FyDQASDUAVatfHx8IsoBVq18fCLPAVatfCDPASDPASADKQPoGSDKASDKASADKQPgGXwizAFWrXwgzAEgywEgzgFWrSADKQOoGSDLASDaAVStfHx8IsoBIMwBVK18fCLLAVatfCLQASADKQOwGnwizAEgAykDmBcgywEgywEgAykDkBd8Is8BVq18IM8BIM8BIAMpA6gXIMoBIMoBIAMpA6AXfCLLAVatfCDLASDRASDSAVStIAMpA7gXIM4BINIBVq18fHwizgEgywFUrXx8IsoBVq18fCLNASADKQP4GSDKASDKASADKQPwGXwiywFWrXwgywEgywEgAykDuBkgAykD+Bgg0QEg1QFWrXwizwEgAykDsBl8IsoBIM8BVK18IMoBIMoBIM4BfCLPAVatfHwiygFWrXx8Is4BIAMpA8AWfCLSASDOAVStfCDSASDSASADKQPYFiDKASDKASADKQPQFnwiywFWrXwgywEgywEgAykD6BYgzwEgzwEgAykD4BZ8IsoBVq18IMoBIMoBIAMpA/gWIAMpA/AWIs8BINUBfCDPAVStfHwizwFWrXx8IsoBVq18fCLLAVatfCDNASDOAVatIMwBIM0BVq0gAykDuBogzAEg0AFUrXx8fHwizQFCqcDGia7Ok7IwVg0FIM0BQqnAxomuzpOyMFENBCDKASHSASDLASHMAQwGCyAGINsBNwMQDAELIAYg3AE3AxALIAZCAjcDCCAGQYGAgIB4NgIAIAxBgAcQ3wQMBgsgDSAZQYivwgAQ2QMACyDLAULdsIWM6LaRqLh/Vg0AIMsBQt2whYzotpGouH9SBEAgygEh0gEgywEhzAFCqcDGia7Ok7IwIc0BDAILIMoBQpHh5c2HifqZKFYNAELdsIWM6LaRqLh/IcwBIMoBQpHh5c2HifqZKFIEQCDKASHSAUKpwMaJrs6TsjAhzQEMAgtCkeHlzYeJ+pkoIdIBIM8BQoGAgIC/sv3wwwBaDQBCqcDGia7Ok7IwIc0BDAELIMoBQpHh5c2HifqZKH0izAEgzwFCgYCAgL+y/fDDAFStIs4BfSHSASDLAUKjz/rzl8nu18cAfCLRASDKAUKR4eXNh4n6mShUIMwBIM4BVHKtIsoBfSHMASDNASDLAULdsIWM6LaRqLh/VCDKASDRAVZyrX1CqcDGia7Ok7IwfSHNASDPAUKBgICAv7L98MMAfSHPAQsgA0L7////xIONy6x/NwP4wQEgA0KpmoP72dKd/jY3A/DBASADQq6M5cP37ai35gA3A+jBASADQq++n9CZ+J2FDjcD4MEBAn4CQAJAIBApAwAiygEg+AFSBEAgECkDCCHRASAQKQMQIc4BIMoBIdgBIPgBIdABDAELIBApAxAhzgEg7gEgECkDCCLRAVIEQCDRASHYASDuASHQAQwBCyDuASHRASDOASHYASDvASLQASDOAVINACDQASHOASDwASLQASLLASAQKQMYItgBUQ0BCyAQKQMYIcsBINABINgBWg0AQt2whYzotpGouH8g0QEg7gF9ItMBIM4BIO8BVCDOASDvAX0i0AEgywEg8AFUrSLUAVRyrSLVAX0i1wF9ItYBINABINQBfSLQAUKR4eXNh4n6mShWQpHh5c2HifqZKCDQAX0i0AEgywEg8AF9ItQBQoGAgIC/sv3wwwBWrSLaAVRyrSLZAX0h2AEg1gEg2QFUINcBQt2whYzotpGouH9WciEKINABINoBfSHQAUKBgICAv7L98MMAINQBfSHXASDRASDuAVQg0wEg1QFUcq0g+AEgygF9fEKpwMaJrs6TsjB8DAELIO8BIM4BfSLTASDLASDwAVatItQBfSHQASDuASDRAX0i1QEg0wEg1AFUIM4BIO8BVnKtItMBfSHYASDTASDVAVYg0QEg7gFWciEKIPABIMsBfSHXASD4ASDKAX0LIdMBIAMg1wE3A8ikASADINABNwPApAEgAyDYATcDuKQBIAMg0wEgCq19NwOwpAEgA0GwpQFqIANB4MEBaiADQbCkAWoQWgJAIAMoArClAUEBRwRAIANBqKQBaiADQdClAWopAwA3AwAgA0GgpAFqIANByKUBaikDADcDACADQZikAWogA0HApQFqKQMANwMAIAMgAykDuKUBNwOQpAEgA0L7////xIONy6x/NwP4wQEgA0KpmoP72dKd/jY3A/DBASADQq6M5cP37ai35gA3A+jBASADQq++n9CZ+J2FDjcD4MEBIANBsBZqIMsBQgAgzwFCABDJAyADQdAVaiDLAUIAINIBQgAQyQMgA0HAFWogywFCACDMAUIAEMkDIANBsBVqIMsBQgAgzQFCABDJAyADQaAWaiADKQOwFiLQAUIAQgBC/////76y/fBCEMkDIANBkBZqIAMpA6gWIssBQgBCgYCAgL+y/fDDAEIAEMkDIANBgBZqIMsBQgBCkeHlzYeJ+pkoQgAQyQMgA0HwFWogywFCAELdsIWM6LaRqLh/QgAQyQMgA0HgFWogywFCAEKpwMaJrs6TsjBCABDJAyADQaAVaiDOAUIAIM8BQgAQyQMgA0HAFGogzgFCACDSAUIAEMkDIANBsBRqIM4BQgAgzAFCABDJAyADQaAUaiDOAUIAIM0BQgAQyQMgA0GQFWogAykDgBYi1wEgAykDuBYi1AEgAykD0BV8ItUBfCLOASADKQOYFiDQASADKQOQFiLLAXwgywFUrXx8ItABIAMpA6AVfCLTAUIAQgBC/////76y/fBCEMkDIANBgBVqIAMpA5gVIssBQgBCgYCAgL+y/fDDAEIAEMkDIANB8BRqIMsBQgBCkeHlzYeJ+pkoQgAQyQMgA0HgFGogywFC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IAMpA4AQfCLNASADKQOYESDQASDSAVStfCLUASADKQOAEXwi0gEgAykDsBF8ItABIMsBIMwBVq0gAykDyBEgywEg0wFUrXx8fCLXAXwiywEgAykDsBB8IswBIAMpA8gQIM8BIAMpA8AQIsoBfCDKAVStfHwizwEgAykD0A98ItMBQgBCAEL/////vrL98EIQyQMgA0GwD2ogAykDyA8iygFCAEKBgICAv7L98MMAQgAQyQMgA0GgD2ogygFCAEKR4eXNh4n6mShCABDJAyADQZAPaiDKAUIAQt2whYzotpGouH9CABDJAyADQYAPaiDKAUIAQqnAxomuzpOyMEIAEMkDIANBwA5qIOcBQgAg4QFCABDJAyADQeANaiDRAUIAIOEBQgAQyQMgA0HQDWogzgFCACDhAUIAEMkDIANBwA1qIO0BQgAg4QFCABDJAyADQbAOaiADKQPYDyDPASDTAVatfCLYASADKQPwDnwizgEgAykDiBEg0gEg1AFUrXwi1gEgAykD8BB8ItEBIAMpA6ARfCLUASDQASDXAVatIAMpA7gRINABINIBVK18fHwi0gEgAykD8A98ItABIMsBIM0BVK0gAykDiBAgzQEg1QFUrXx8fCLNASADKQOgEHwi1QEgzAEgzwFWrSADKQO4ECDLASDMAVatfHx8ItcBfCLLASADKQOgD3wizAEgAykDuA8g0wEgAykDsA8iygF8IMoBVK18fCLPASADKQPADnwi0wFCAEIAQv////++sv3wQhDJAyADQaAOaiADKQO4DiLKAUIAQoGAgIC/sv3wwwBCABDJAyADQZAOaiDKAUIAQpHh5c2HifqZKEIAEMkDIANBgA5qIMoBQgBC3bCFjOi2kai4f0IAEMkDIANB8A1qIMoBQgBCqcDGia7Ok7IwQgAQyQMCQAJAIAMpA/gNIAMpA4gPIAMpA5gQINIBINQBVK0gAykDqBEg0QEg1AFWrXx8IAMpA/gQINEBINYBVK18fCLUASADKQPgD3wiygEgzQEg0AFUrSADKQP4DyDQASDSAVStfHx8ItIBIAMpA5AQfCLRASDSAVStfCDRASDVASDXAVatIAMpA6gQIM0BINUBVq18fHwizQEg0QFUrXwgygEg0gFWrSADKQPoDyDKASDUAVStfHx8ItABIAMpA9AOfCLKASADKQPoDiDNASDNASAD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CWog0QFCACDPAUIAEMkDIANB8AlqIAMpA5gLINUBINoBVq18It4BIAMpA7AKfCLNASADKQPIDCDYASDbAVStfCLbASADKQOwDHwizgEgAykD4Ax8ItEBINYBINwBVq0gAykD+Awg1gEg2AFUrXx8fCLQASADKQOwC3wi2AEg0wEg1wFUrSADKQPICyDXASDZAVStfHx8ItcBIAMpA+ALfCLWASDUASDVAVatIAMpA/gLINMBINQBVq18fHwi2QF8ItMBIAMpA+AKfCLUASADKQP4CiDaASADKQPwCiLKAXwgygFUrXx8ItUBIAMpA4AKfCLaAUIAQgBC/////76y/fBCEMkDIANB4AlqIAMpA/gJIsoBQgBCgYCAgL+y/fDDAEIAEMkDIANB0AlqIMoBQgBCkeHlzYeJ+pkoQgAQyQMgA0HACWogygFCAELdsIWM6LaRqLh/QgAQyQMgA0GwCWogygFCAEKpwMaJrs6TsjBCABDJAwJAAkAgAykDuAkgAykDyAogAykD2Asg0AEg0QFUrSADKQPoDCDOASDRAVatfHwgAykDuAwgzgEg2wFUrXx8ItsBIAMpA6ALfCLKASDXASDYAVStIAMpA7gLINABINgBVq18fHwizgEgAykD0At8ItEBIM4BVK18INEBINEBINYBINkBVq0gAykD6Asg1gEg1wFUrXx8fCLQAVatfCDKASDOAVatIAMpA6gLIMoBINsBVK18fHwi1wEgAykDkAp8IsoBIAMpA6gKINABINABIAMpA6AKfCLOAVatfCDOASDOASDNASDTAVatIAMpA7gKIM0BIN4BVK18fHwizQFWrXx8Is4BIAMpA8AKfCLRASDOAVStfCDRASDRASADKQPYCiDNASDNASADKQPQCnwi0AFWrXwg0AEg0AEg1AEg1QFWrSADKQPoCiDTASDUAVatfHx8ItMBVq18fCLNAVatfCDKASDOAVatIAMpA5gKIMoBINcBVK18fHwi1wEgAykDgAl8IsoBIAMpA5gJIM0BIM0BIAMpA5AJfCLOAVatfCDOASDOASADKQOoCSADKQOICiDVASDaAVatfCLRASADKQOgCXwizQEg0QFUrXwgzQEgzQEg0wF8ItEBVq18fCLNAVatfHwizgEgAykDsAl8ItQBIM4BVK18INQBINQBIAMpA8gJIM0BIM0BIAMpA8AJ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ASDYAVStfCLcASADKQPwCHwi2AEgAykD4AZ8ItYBINUBINkBVq0gAykD+AYg1AEg1QFWrXx8fCLUASADKQOgCHwi1QEgzAEg0gFWrSADKQPoByDMASDaAVStfHx8IswBIAMpA5AGfCLaASDQASDTAVatIAMpA6gGINABINIBVK18fHwi2QF8ItIBIAMpA8AFfCLQASADKQPYBSDXASADKQPQBSLLAXwgywFUrXx8ItMBIAMpA5AFfCLXAUIAQgBC/////76y/fBCEMkDIANB8ARqIAMpA4gFIssBQgBCgYCAgL+y/fDDAEIAEMkDIANB4ARqIMsBQgBCkeHlzYeJ+pkoQgAQyQMgA0HQBGogywFCAELdsIWM6LaRqLh/QgAQyQMgA0HABGogywFCAEKpwMaJrs6TsjBCABDJAwJAIAMpA8gEIAMpA6gFIAMpA4gGINQBINYBVK0gAykD6AYg1gEg2AFUrXx8IAMpA/gIINgBINwBVK18fCLYASADKQPgCHwiywEgzAEg1QFUrSADKQOoCCDUASDVAVatfHx8ItQBIAMpA4AGfCLVASDUAVStfCDVASDZASDaAVStIAMpA5gGIMwBINoBVq18fHwizAEg1QFUrXwgywEg1AFWrSADKQPoCCDLASDYAVStfHx8ItgBIAMpA9AIfCLLASADKQOYCCDMASDMASADKQOQCHwi1AFWrXwg1AEg1AEgzwEg0gFWrSADKQPYByDPASDbAVStfHx8IswBVq18fCLPASADKQOgBXwi1AEgzwFUrXwg1AEgAykDuAUgzAEgzAEgAykDsAV8ItUBVq18INUBINUBINABINMBVq0gAykDyAUg0AEg0gFUrXx8fCLSAVatfHwizAEg1AFUrXwgywEgzwFWrSADKQPYCCDLASDYAVStfHx8ItgBIAMpA8AIfCLPASADKQOICCDMASADKQOACHwiywEgzAFUrXwgywEgywEgAykDyAcgAykDmAUg0wEg1wFWrXwi0AEgAykDwAd8IswBINABVK18IMwBIMwBINIBfCLSAVatfHwizAFWrXx8ItQBIAMpA8AEfCLVASDUAVStfCDVASDVASADKQPYBCDMASDMASADKQPQBHwi0wFWrXwg0wEg0wEgAykD6AQg0gEg0gEgAykD4AR8IswBVq18IMwBIMwBIAMpA/gEIAMpA/AEIssBINcBfCDLAVStfHwiywFWrXx8ItABVq18fCLTAVatfCDPASDUAVatIAMpA8gIIM8BINgBVK18fHwizwFCqcDGia7Ok7IwVg0AIM8BQqnAxomuzpOyMFIEQCDQASHSASDTASHMAQwCCyDTAULdsIWM6LaRqLh/Vg0AINMBQt2whYzotpGouH9SBEAg0AEh0gEg0wEhzAFCqcDGia7Ok7IwIc8BDAILINABQpHh5c2HifqZKFYNAELdsIWM6LaRqLh/IcwBINABQpHh5c2HifqZKFIEQCDQASHSAUKpwMaJrs6TsjAhzwEMAgtCkeHlzYeJ+pkoIdIBIMsBQoGAgIC/sv3wwwBaDQBCqcDGia7Ok7IwIc8BDAELINABQpHh5c2HifqZKH0izAEgywFCgYCAgL+y/fDDAFStItQBfSHSASDTAUKjz/rzl8nu18cAfCLVASDQAUKR4eXNh4n6mShUIMwBINQBVHKtItABfSHMASDPASDTAULdsIWM6LaRqLh/VCDQASDVAVZyrX1CqcDGia7Ok7IwfSHPASDLAUKBgICAv7L98MMAfSHLAQsgA0GwBGogCiBaaiIFQfgAaikDACLQAUIAINEBQgAQyQMgA0GgA2og0AFCACDKAUIAEMkDIANBkAJqINABQgAgzQFCABDJAyADQYABaiDQAUIAIM4BQgAQyQMgA0GgBGogAykDsAQi1AFCAEIAQv////++sv3wQhDJAyADQZAEaiADKQOoBCLQAUIAQoGAgIC/sv3wwwBCABDJAyADQYAEaiDQAUIAQpHh5c2HifqZKEIAEMkDIANB8ANqINABQgBC3bCFjOi2kai4f0IAEMkDIANB4ANqINABQgBCqcDGia7Ok7IwQgAQyQMgA0HQA2ogBUHwAGopAwAi0AFCACDRAUIAEMkDIANBwAJqINABQgAgygFCABDJAyADQbABaiDQAUIAIM0BQgAQyQMgA0EgaiDQAUIAIM4BQgAQyQMgA0GQA2ogAykDgAQi2gEgAykDuAQi2AEgAykDoAN8ItYBfCLTASADKQOYBCDUASADKQOQBCLQAXwg0AFUrXx8ItQBIAMpA9ADfCLVAUIAQgBC/////76y/fBCEMkDIANBgANqIAMpA5gDItABQgBCgYCAgL+y/fDDAEIAEMkDIANB8AJqINABQgBCkeHlzYeJ+pkoQgAQyQMgA0HgAmog0AFCAELdsIWM6LaRqLh/QgAQyQMgA0HQAmog0AFCAEKpwMaJrs6TsjBCABDJAyADQcADaiAFQegAaikDACLQAUIAINEBQgAQyQMgA0GwAmog0AFCACDKAUIAEMkDIANBoAFqINABQgAgzQFCABDJAyADQRBqINABQgAgzgFCABDJAyADQYACaiADKQPYAyDUASDVAVatfCLZASADKQPAAnwi1wEgAykDqAMg1gEg2AFUrXwi2wEgAykDkAJ8ItgBIAMpA/ADfCLWASDTASDUAVatIAMpA4gEINMBINoBVK18fHwi3AF8ItMBIAMpA/ACfCLUASADKQOIAyDVASADKQOAAyLQAXwg0AFUrXx8ItUBIAMpA8ADfCLaAUIAQgBC/////76y/fBCEMkDIANB8AFqIAMpA4gCItABQgBCgYCAgL+y/fDDAEIAEMkDIANB4AFqINABQgBCkeHlzYeJ+pkoQgAQyQMgA0HQAWog0AFCAELdsIWM6LaRqLh/QgAQyQMgA0HAAWog0AFCAEKpwMaJrs6TsjBCABDJAyADQbADaiAFQeAAaikDACLQAUIAINEBQgAQyQMgA0GgAmog0AFCACDKAUIAEMkDIANBkAFqINABQgAgzQFCABDJAyADINABQgAgzgFCABDJAyADQfAAaiADKQPIAyDVASDaAVatfCLeASADKQOwAnwizQEgAykDmAIg2AEg2wFUrXwi2wEgAykDgAF8Is4BIAMpA+ADfCLRASDWASDcAVatIAMpA/gDINYBINgBVK18fHwi0AEgAykDsAF8ItgBINMBINcBVK0gAykDyAIg1wEg2QFUrXx8fCLXASADKQPgAnwi1gEg1AEg1QFWrSADKQP4AiDTASDUAVatfHx8ItkBfCLTASADKQPgAXwi1AEgAykD+AEgAykD8AEiygEg2gF8IMoBVK18fCLVASADKQOwA3wi2gFCAEIAQv////++sv3wQhDJAyADQeAAaiADKQN4IsoBQgBCgYCAgL+y/fDDAEIAEMkDIANB0ABqIMoBQgBCkeHlzYeJ+pkoQgAQyQMgA0FAayDKAUIAQt2whYzotpGouH9CABDJAyADQTBqIMoBQgBCqcDGia7Ok7IwQgAQyQMCQAJAAkAgAykDOCADKQPIASADKQPYAiDQASDRAVStIAMpA+gDIM4BINEBVq18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IAdByAJqIARByD9qKQMANwMAIAdBwAJqIARBwD9qKQMANwMAIAdBuAJqIARBuD9qKQMANwMAIAdBsAJqIARBsD9qKQMANwMAIAdBqAJqIARBqD9qKQMANwMAIAcgBCkDoD83A6ACIAcgPzoA4AIgB0HkAmogBCgAmz82AAAgByAEKAKYPzYA4QIgB0GgA2ogBEGgwABqKQMANwMAIAdBmANqIARBmMAAaikDADcDACAHQZADaiAEQZDAAGopAwA3AwAgB0GIA2ogBEGIwABqKQMANwMAIAdBgANqIARBgEBrKQMANwMAIAdB+AJqIARB+D9qKQMANwMAIAdB8AJqIARB8D9qKQMANwMAIAcgBCkD6D83A+gCIAcgQDoAqAMgB0GsA2ogBCgA4z82AAAgByAEKALgPzYAqQMgB0HoA2ogBEHowABqKQMANwMAIAdB4ANqIARB4MAAaikDADcDACAHQdgDaiAEQdjAAGopAwA3AwAgB0HQA2ogBEHQwABqKQMANwMAIAdByANqIARByMAAaikDADcDACAHQcADaiAEQcDAAGopAwA3AwAgB0G4A2ogBEG4wABqKQMANwMAIAcgBCkDsEA3A7ADIAcgQToA8AMgB0H0A2ogBCgAq0A2AAAgByAEKAKoQDYA8QMgB0GwBGogBEGwwQBqKQMANwMAIAdBqARqIARBqMEAaikDADcDACAHQaAEaiAEQaDBAGopAwA3AwAgB0GYBGogBEGYwQBqKQMANwMAIAdBkARqIARBkMEAaikDADcDACAHQYgEaiAEQYjBAGopAwA3AwAgB0GABGogBEGAwQBqKQMANwMAIAcgBCkD+EA3A/gDIAcgQjoAuAQgB0G8BGogBCgA80A2AAAgByAEKALwQDYAuQQgB0H4BGogBEH4wQBqKQMANwMAIAdB8ARqIARB8MEAaikDADcDACAHQegEaiAEQejBAGopAwA3AwAgB0HgBGogBEHgwQBqKQMANwMAIAdB2ARqIARB2MEAaikDADcDACAHQdAEaiAEQdDBAGopAwA3AwAgB0HIBGogBEHIwQBqKQMANwMAIAcgBCkDwEE3A8AEIAcgQzoAgAUgB0GEBWogBCgAu0E2AAAgByAEKAK4QTYAgQUgB0HABWogBEHAwgBqKQMANwMAIAdBuAVqIARBuMIAaikDADcDACAHQbAFaiAEQbDCAGopAwA3AwAgB0GoBWogBEGowgBqKQMANwMAIAdBoAVqIARBoMIAaikDADcDACAHQZgFaiAEQZjCAGopAwA3AwAgB0GQBWogBEGQwgBqKQMANwMAIAcgBCkDiEI3A4gFIAcgRDoAyAUgB0HMBWogBCgAg0I2AAAgByAEKAKAQjYAyQUgB0GIBmogBEGIwwBqKQMANwMAIAdBgAZqIARBgMMAaikDADcDACAHQfgFaiAEQfjCAGopAwA3AwAgB0HwBWogBEHwwgBqKQMANwMAIAdB6AVqIARB6MIAaikDADcDACAHQeAFaiAEQeDCAGopAwA3AwAgB0HYBWogBEHYwgBqKQMANwMAIAcgBCkD0EI3A9AFIAcgOjoAkAYgB0GUBmogBCgAy0I2AAAgByAEKALIQjYAkQYgB0HQBmogBEHQwwBqKQMANwMAIAdByAZqIARByMMAaikDADcDACAHQcAGaiAEQcDDAGopAwA3AwAgB0G4BmogBEG4wwBqKQMANwMAIAdBsAZqIARBsMMAaikDADcDACAHQagGaiAEQajDAGopAwA3AwAgB0GgBmogBEGgwwBqKQMANwMAIAcgBCkDmEM3A5gGIAcgSToA2AYgB0HcBmogBCgAk0M2AAAgByAEKAKQQzYA2QYgB0GYB2ogBEGYxABqKQMANwMAIAdBkAdqIARBkMQAaikDADcDACAHQYgHaiAEQYjEAGopAwA3AwAgB0GAB2ogBEGAxABqKQMANwMAIAdB+AZqIARB+MMAaikDADcDACAHQfAGaiAEQfDDAGopAwA3AwAgB0HoBmogBEHowwBqKQMANwMAIAcgBCkD4EM3A+AGIAcgSjoAoAcgB0GkB2ogBCgA20M2AAAgByAEKALYQzYAoQcgB0HgB2ogBEHgxABqKQMANwMAIAdB2AdqIARB2MQAaikDADcDACAHQdAHaiAEQdDEAGopAwA3AwAgB0HIB2ogBEHIxABqKQMANwMAIAdBwAdqIARBwMQAaikDADcDACAHQbgHaiAEQbjEAGopAwA3AwAgB0GwB2ogBEGwxABqKQMANwMAIAcgBCkDqEQ3A6gHIAcgSzoA6AcgB0HsB2ogBCgAo0Q2AAAgByAEKAKgRDYA6QcgB0GoCGogBEGoxQBqKQMANwMAIAdBoAhqIARBoMUAaikDADcDACAHQZgIaiAEQZjFAGopAwA3AwAgB0GQCGogBEGQxQBqKQMANwMAIAdBiAhqIARBiMUAaikDADcDACAHQYAIaiAEQYDFAGopAwA3AwAgB0H4B2ogBEH4xABqKQMANwMAIAcgBCkD8EQ3A/AHIAcgTDoAsAggB0G0CGogBCgA60Q2AAAgByAEKALoRDYAsQggB0HwCGogBEHwxQBqKQMANwMAIAdB6AhqIARB6MUAaikDADcDACAHQeAIaiAEQeDFAGopAwA3AwAgB0HYCGogBEHYxQBqKQMANwMAIAdB0AhqIARB0MUAaikDADcDACAHQcgIaiAEQcjFAGopAwA3AwAgB0HACGogBEHAxQBqKQMANwMAIAcgBCkDuEU3A7gIIAcgTToA+AggB0H8CGogBCgAs0U2AAAgByAEKAKwRTYA+QggB0G4CWogBEG4xgBqKQMANwMAIAdBsAlqIARBsMYAaikDADcDACAHQagJaiAEQajGAGopAwA3AwAgB0GgCWogBEGgxgBqKQMANwMAIAdBmAlqIARBmMYAaikDADcDACAHQZAJaiAEQZDGAGopAwA3AwAgB0GICWogBEGIxgBqKQMANwMAIAcgBCkDgEY3A4AJIAcgTjoAwAkgB0HECWogBCgA+0U2AAAgByAEKAL4RTYAwQkgB0GACmogBEGAxwBqKQMANwMAIAdB+AlqIARB+MYAaikDADcDACAHQfAJaiAEQfDGAGopAwA3AwAgB0HoCWogBEHoxgBqKQMANwMAIAdB4AlqIARB4MYAaikDADcDACAHQdgJaiAEQdjGAGopAwA3AwAgB0HQCWogBEHQxgBqKQMANwMAIAcgBCkDyEY3A8gJIAcgTzoAiAogB0GMCmogBCgAw0Y2AAAgByAEKALARjYAiQogB0HICmogBEHIxwBqKQMANwMAIAdBwApqIARBwMcAaikDADcDACAHQbgKaiAEQbjHAGopAwA3AwAgB0GwCmogBEGwxwBqKQMANwMAIAdBqApqIARBqMcAaikDADcDACAHQaAKaiAEQaDHAGopAwA3AwAgB0GYCmogBEGYxwBqKQMANwMAIAcgBCkDkEc3A5AKIAcgUDoA0AogB0HUCmogBCgAi0c2AAAgByAEKAKIRzYA0QogB0GQC2ogBEGQyABqKQMANwMAIAdBiAtqIARBiMgAaikDADcDACAHQYALaiAE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BS0AACIEQeABcSIHQSBGIAdB4ABGckUgB0HgAUdxRQRAQdHOxQAtAAAaQRBBARDWBCIERQ0BIBJBEDYCECASIAQ2AgwgEkEQNgIIIBJCAjcDACAEQQhqQfThwAApAAA3AAAgBEHs4cAAKQAANwAADAkLQdHOxQAtAAAaQTBBARDWBCIaRQ0CIBogBUEw/AoAACAaIBotAABBH3E6AAAgBMAiBEHAAHEEQEEAIQoCQANAIApBMEYNASAKIBpqIApBAWohCi0AAEUNAAtB0c7FAC0AABpBJkEBENYEIgRFDQMgEkEmNgIQIBIgBDYCDCASQSY2AgggEkICNwMAIARBHmpBmuLAACkAADcAACAEQRhqQZTiwAApAAA3AAAgBEEQakGM4sAAKQAANwAAIARBCGpBhOLAACkAADcAACAEQfzhwAApAAA3AAAMCQsgA0GgA2oiBEEAQeEA/AsAIBJCADcDACASQQhqIARBwAH8CgAADAgLIARBAE4NBiADQcAKaiAaQTAQjgFBKCEKIAMpA8AKISogAykDyAohLSADKQPQCiEpIAMpA9gKISMgAykD4AohJCADKQPoCiElA0AgA0HAAmogA0HACmogCmopAwAiIEIAICVCABDJAyADQdACaiAgQgAgJEIAEMkDIANB4AJqICBCACAjQgAQyQMgA0HwAmogIEIAIClCABDJAyADQYADaiAgQgAgLUIAEMkDIANBkANqICBCACAqQgAQyQMgA0GwAmogKCADKQPAAiImfCIrQgBCAEL9//P/z///+Yl/EMkDIANBoAJqIAMpA7gCIiBCAEKr1f7///+//7l/QgAQyQMgA0GQAmogIEIAQv//z4rr///VHkIAEMkDIANBgAJqICBCAEKk7MO1j9S0mOcAQgAQyQMgA0HwAWogIEIAQr+llJzP8NK75ABCABDJAyADQeABaiAgQgBC19mumuT26Y3LAEIAEMkDIANB0AFqICBCAEKazf/Lo73EgBpCABDJAyADKQPYASAiIAMpA5ADIid8IiwgAykDiAMgAykDgAMiICAhfCIhICBUrXwgISADKQP4AiAdIAMpA/ACIh18IiAgHVStfCAgICAgAykD6AIgAykD4AIiHSAefCIeIB1UrXwgHiAeIAMpA9gCIAMpA9ACIh0gH3wiHyAdVK18IB8gHyADKQPIAiAmICtWrXx8Ih9WrXx8IihWrXx8Ih5WrXx8Ih0gIVStfHwiIiADKQPQAXwiISAiVK18ICEgISADKQPoASAdIB0gAykD4AF8IiZWrXwgJiAmIAMpA/gBIB4gHiADKQPwAXwiIFatfCAgIAMpA4gCICggKCADKQOAAnwiHlatfCAeIAMpA5gCIB8gAykDkAIiHXwiHyAdVK18IB8gAykDqAIgKyADKQOgAiIdfCAdVK18fCIoIB9UrXx8Ih8gHlStfHwiHiAgVK18fCIdVq18fCIhVq18ICIgLFStIAMpA5gDICcgLFatfHx8ISIgCkEIayIKQXhHDQALICJCms3/y6O9xIAaWA0DDAQLQQFBEEGEpMAAEMgEAAtBAUEmQYSkwAAQyAQAC0EBQTBBhKTAABDIBAALICJCms3/y6O9xIAaUgRAIB8hICAeIScgHSEmICEhJQwCCyAhQtfZrprk9umNywBWDQAgIULX2a6a5PbpjcsAUgRAIB8hICAeIScgHSEmICEhJUKazf/Lo73EgBohIgwCCyAdQr+llJzP8NK75ABWDQBC19mumuT26Y3LACElIB1Cv6WUnM/w0rvkAFIEQCAfISAgHiEnIB0hJkKazf/Lo73EgBohIgwCCyAeQqTsw7WP1LSY5wBWDQBCv6WUnM/w0rvkACEmIB5CpOzDtY/UtJjnAFIEQCAfISAgHiEnQprN/8ujvcSAGiEiDAILIB9C///Piuv//9UeVg0AQqTsw7WP1LSY5wAhJyAfQv//z4rr///VHlIEQCAfISBCms3/y6O9xIAaISIMAgtC///Piuv//9UeISAgKEKq1f7///+//7l/Vg0AQprN/8ujvcSAGiEiDAELIB9C///Piuv//9UefSIlIChCq9X+////v/+5f1StIid9ISAgHkKk7MO1j9S0mOcAfSImIB9C///Piuv//9UeVCAlICdUcq0iH30hJyAdQr+llJzP8NK75AB9IiUgHkKk7MO1j9S0mOcAVCAfICZWcq0iHn0hJiAhQtfZrprk9umNywB9Ih8gHUK/pZScz/DSu+QAVCAeICVWcq0iHX0hJSAiICFC19mumuT26Y3LAFQgHSAfVnKtfUKazf/Lo73EgBp9ISIgKELVqoGAgIDAgMYAfCEoC0EoIQpCACEdQgAhHkIAISNCACEpQgAhJEIAISEDQCADQfAAaiADQcAKaiAKaikDACIfQgAgKEIAEMkDIANBgAFqIB9CACAgQgAQyQMgA0GQAWogH0IAICdCABDJAyADQaABaiAfQgAgJkIAEMkDIANBsAFqIB9CACAlQgAQyQMgA0HAAWogH0IAICJCABDJAyADQeAAaiADKQNwIh8gIXwiLkIAQgBC/f/z/8////mJfxDJAyADQdAAaiADKQNoIiFCAEKr1f7///+//7l/QgAQyQMgA0FAayAhQgBC///Piuv//9UeQgAQyQMgA0EwaiAhQgBCpOzDtY/UtJjnAEIAEMkDIANBIGogIUIAQr+llJzP8NK75ABCABDJAyADQRBqICFCAELX2a6a5PbpjcsAQgAQyQMgAyAhQgBCms3/y6O9xIAaQgAQyQMgAykDCCADKQPAASItIB18Ii8gAykDuAEgAykDsAEiHSAefCIqIB1UrXwgKiAqIAMpA6gBICMgAykDoAEiHXwiISAdVK18ICEgISADKQOYASApIAMpA5ABIh18IiMgHVStfCAjICMgAykDiAEgAykDgAEiHSAkfCIeIB1UrXwgHiAeIAMpA3ggHyAuVq18fCIfVq18fCIkVq18fCIeVq18fCIdVq18fCIrIAMpAwB8IiwgK1StfCAsICwgAykDGCAdIB0gAykDEHwiKlatfCAqIAMpAyggHiAeIAMpAyB8IiNWrXwgIyADKQM4ICQgJCADKQMwfCIeVq18IB4gAykDSCAfIAMpA0AiHXwiHyAdVK18IB8gAykDWCAuIAMpA1AiHXwgHVStfHwiISAfVK18fCIkIB5UrXx8IikgI1StfHwiIyAqVK18fCIeVq18ICsgL1StIAMpA8gBIC0gL1atfHx8IR0gCkEIayIKQXhHDQALAkACQCAdQprN/8ujvcSAGlYNAAJAAkACQAJAIB1Cms3/y6O9xIAaUg0AIB5C19mumuT26Y3LAFYNBCAeQtfZrprk9umNywBSBEBCms3/y6O9xIAaIR0MAQsgI0K/pZScz/DSu+QAVg0EQtfZrprk9umNywAhJSAjQr+llJzP8NK75ABSBEBCms3/y6O9xIAaIR0MAgsgKUKk7MO1j9S0mOcAVg0EQr+llJzP8NK75AAhIiApQqTsw7WP1LSY5wBSBEBCms3/y6O9xIAaIR0MAwsgJEL//8+K6///1R5WDQRCpOzDtY/UtJjnACEfICRC///Piuv//9UeUQ0DQprN/8ujvcSAGiEdICQhKAwFCyAeISULICMhIgsgKSEfICQhKAwCC0L//8+K6///1R4hKCAhQqrV/v///7//uX9WDQBCms3/y6O9xIAaIR0MAQsgJEL//8+K6///1R59IiAgIUKr1f7///+//7l/VK0iH30hKCApQqTsw7WP1LSY5wB9IicgJEL//8+K6///1R5UIB8gIFZyrSIgfSEfICNCv6WUnM/w0rvkAH0iJiApQqTsw7WP1LSY5wBUICAgJ1ZyrSIgfSEiIB5C19mumuT26Y3LAH0iJyAjQr+llJzP8NK75ABUICAgJlZyrSIgfSElIB0gHkLX2a6a5PbpjcsAVCAgICdWcq19QprN/8ujvcSAGn0hHSAhQtWqgYCAgMCAxgB8ISELQprN/8ujvcSAGiEkIB0gJULRqZ2ExJijm/EAfSIjICVUICMgIkKptpfKkaigls4AfSIlICJUICUgJSAfQv+Aqtimr/rHxwB8Ih4gH1QgHiAeIChCioDQ4a+GgObTAHwiHyAoVCAfIB8gIUKNgMz///+/7NUAfSIiICFUrXwiJlZyrXwiJ1ZyrXwiIFZyrXwiHyAjVHKtfEL+vI/sk6qR6wl8IiUhHQJAAkACQCAlQprN/8ujvcSAGlINAELX2a6a5PbpjcsAISQgHyIdQtfZrprk9umNywBSDQBCv6WUnM/w0rvkACEkICAiHUK/pZScz/DSu+QAUg0AQqTsw7WP1LSY5wAhJCAnIh1CpOzDtY/UtJjnAFINAEL//8+K6///1R4hJCAmIh1C///Piuv//9UeUg0AQqvV/v///7//uX8hJCAiIh1Cq9X+////v/+5f1ENAQsgHSAkWg0AIB8hHSAgIR4gJyEjICYhJAwBCyAmQv//z4rr///VHn0iIyAiQqvV/v///7//uX9UrSIdfSEkICdCpOzDtY/UtJjnAH0iHiAmQv//z4rr///VHlQgHSAjVnKtIh19ISMgIEK/pZScz/DSu+QAfSImICdCpOzDtY/UtJjnAFQgHSAeVnKtIh19IR4gH0LX2a6a5PbpjcsAfSInICBCv6WUnM/w0rvkAFQgHSAmVnKtIiB9IR0gJSAfQtfZrprk9umNywBUICAgJ1ZyrX1Cms3/y6O9xIAafSElICJC1aqBgICAwIDGAHwhIgsgAyAiNwOoCSADICQ3A6AJIAMgIzcDmAkgAyAeNwOQCSADIB03A4gJIAMgJTcDgAkCQCAEQSBxBEAgA0HwCmogA0GACWoQoQIMAQsgA0G4B2oiAiADQYAJahAqAn8CQCADKAK4B0EBRgRAIANBmAZqIhggA0HoB2opAwA3AwAgA0GQBmoiDSADQeAHaiIJKQMANwMAIANBiAZqIhEgA0HYB2oiEykDADcDACADQYAGaiIXIANB0AdqIgopAwA3AwAgA0H4BWoiDiADQcgHaiIPKQMANwMAIANBqAZqIhAgA0H4B2opAwA3AwAgA0GwBmoiDCADQYAIaikDADcDACADQbgGaiIHIANBiAhqKQMANwMAIANBwAZqIgUgA0GQCGopAwA3AwAgA0HIBmoiBCADQZgIaikDADcDACADIAMpA8AHNwPwBSADIAMpA/AHNwOgBiADQYgKaiAYKQMANwMAIANBgApqIA0pAwA3AwAgA0H4CWogESkDADcDACADQfAJaiAXKQMANwMAIANB6AlqIA4pAwA3AwAgAyADKQPwBTcD4AkgCSAEKQMANwMAIBMgBSkDADcDACAKIAcpAwA3AwAgDyAMKQMANwMAIANBwAdqIBApAwA3AwAgAyADKQOgBjcDuAcgA0GkC2ogA0HgCWoQ2AIgA0GwC2ogAhDYAiADKAKsCyIFIAMoArgLIgRGBEAgAygCqAtBBGshECADKAK0C0EEayEMIAVBAnQhCgJAA0AgCkUNASAKIAxqIQcgCiAQaiAKQQRrIQooAgAiBSAHKAIAIgRGDQALIAQgBUsNAyADQbgHagwECyAKDQIgA0G4B2oMAwsgBCAFSw0BIANBuAdqDAILQdiuwAAQ6AQACyADQeAJagshBSADKAKwCyIEBEAgAygCtAsgBEECdBDfBAsgAygCpAsiBARAIAMoAqgLIARBAnQQ3wQLIANB+ApqIAVBCGopAwA3AwAgA0GAC2ogBUEQaikDADcDACADQYgLaiAFQRhqKQMANwMAIANBkAtqIAVBIGopAwA3AwAgA0GYC2ogBUEoaikDADcDACADIAUpAwA3A/AKCyADQYgKaiADQegKaikDADcDACADQYAKaiADQeAKaikDADcDACADQfgJaiADQdgKaikDADcDACADQfAJaiADQdAKaikDADcDACADQegJaiADQcgKaikDADcDACADIAMpA8AK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AA0CIAJB2ANqIBFBMGopAwA3AwAgAkHQA2ogEUEoaikDADcDACACQcgDaiARQSBqKQMANwMAIAJBwANqIBFBGGopAwA3AwAgAkG4A2ogEUEQaikDADcDACACQegDaiARQUBrKQMANwMAIAJB8ANqIBFByABqKQMANwMAIAJB+ANqIBFB0ABqKQMANwMAIAJBgARqIBFB2ABqKQMANwMAIAJBiARqIBFB4ABqKQMANwMAIAIgESkDCDcDsAMgAiARKQM4NwPgAyACIBEtAGg6AJAEIAJBgA9qIAJBqAJqQfylwAAQViACKAKMDyENIAIoAogPIQUgAigChA8hCAJAIAIoAoAPQQFGDQAgDUECRw0CIAUoAgQhByAFKAIAIQQgDCAFQQhqQdgA/AoAACAIBEAgBSAIQTBsEN8ECyACQagOaiACQaAEaiIOQdgA/AoAACACQdgNaiACQbAOaikDADcDACACQeANaiACQbgOaikDADcDACACQegNaiACQcAOaikDADcDACACQfANaiACQcgOaikDADcDACACQYAOaiACQdgOaikDADcDACACQYgOaiACQeAOaikDADcDACACQZAOaiACQegOaikDADcDACACQZgOaiACQfAOaikDADcDACACQaAOaiACQfgOaikDADcDACACIAc2AswNIAIgBDYCyA0gAiACKQOoDjcD0A0gAiACKQPQDjcD+A0gDiACQcgNahAWIAJB2ARqIAJB+A1qEBYgAigCqAQhDSACKAKkBCEFIAIoAqAEIQggAkGYC2oiDyACQawEakHdAPwKAAAgAkGcBGoiDCACQY4Fai8BADsBACACIAIoAYoFNgKYBCACLQCJBSIHQQJGDQAgAkH8CGogD0HdAPwKAABBBCEEIAJB3glqIAwvAQA7AQAgAiACKAKYBDYB2gkgAiAHOgDZCSACIA02AvgIIAIgBTYC9AggAiAINgLwCEEAIQ0gAkEANgKgCyACQoCAgIDAADcCmAsgDiACQfAIahDVAiACKAKoBCIOQQxsIQUgAigCpAQhDCACKAKgBCEHIA4EQCAPQQAgDkEEQQwQiAMgAigCoAshDSACKAKcCyEECyAFBEAgBCANQQxsaiAMIAX8CgAACyACIA0gDmoiBTYCoAsgBwRAIAwgB0EMbBDfBAsgAkGgBGogAkGoCWoQ1QIgAigCqAQi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J0F/c2oiAC0AADoAACAAICY6AAALICRBEUkNACAsQQE2AqwCICxB3IjBADYCqAIgLEIBNwK0AiAsICQ2AogGICwgLEGIBmqtQoCAgIDgAYQ3A+gHICwgLEHoB2o2ArACIEFBBGogLEGoAmoQ0gIgQUEBNgIAICwoAigiAEUNASAuIAAQ3wQMAQsgLEEgakIANwMAICxCADcDGCAkBEAgLCAka0EoaiAuICT8CgAACyAsKAIoIgAEQCAuIAAQ3wQLICxB6AdqIgBBnOHAABCuAiAsQagCaiAAEDQgLEGQBmoiACAsQbgCaigCADYCACAsICwpA7ACNwOIBiAsKQOoAiICQgJRBEAgQSAsKQOIBjcCBCBBQQE2AgAgQUEMaiAAKAIANgIADAELICxBNGogLEG8AmpB9AH8CgAAICxBMGoiACAsQZAGaigCADYCACAsICwpA4gGNwMoIAKnQQFxRQ0BICwoArQEIWkgLCgCsAQhZyAsQZAKaiAsQdAAaikDADcDACAsQYgKaiAsQcgAaikDADcDACAsQYAKaiAsQUBrKQMANwMAICxB+AlqICxBOGopAwA3AwAgLEHwCWogACkDADcDACAsQaAKaiAsQeAAaikDADcDACAsQagKaiAsQegAaikDADcDACAsQbAKaiAsQfAAaikDADcDACAsQbgKaiAsQfgAaikDADcDACAsQcAKaiAsQYABaikDADcDACAsICwpAyg3A+gJICwgLCkDWDcDmAogLEHwCmogLEGwAWopAwA3AwAgLEHoCmogLEGoAWopAwA3AwAgLEHgCmogLEGgAWopAwA3AwAgLEHYCmogLEGYAWopAwA3AwAgLEHQCmogLEGQAWopAwA3AwAgLEGAC2ogLEHAAWopAwA3AwAgLEGIC2ogLEHIAWopAwA3AwAgLEGQC2ogLEHQAWopAwA3AwAgLEGYC2ogLEHYAWopAwA3AwAgLEGgC2ogLEHgAWopAwA3AwAgLCAsKQOIATcDyAogLCAsKQO4ATcD+AogLEHIBGoiACAsQegJakHgAPwKAAAgLEGoBWogLEHICmpB4AD8CgAAICxBqAJqIUUgLEEIaiFDICxBGGohaCMAQbAsayIhJAAgIUGAJGpCADcDACAhQfgjakIANwMAICFB8CNqQgA3AwAgIUHoI2pCADcDACAhQeAjakIANwMAICFB2CNqQgA3AwAgIUGwI2pBqKPAACkDADcDACAhQbgjakGwo8AAKQMANwMAICFBCDoAiCQgIUGoI2oiKEGgo8AAKQMANwMAICFCADcD0CMgIUIANwPAIyAhQZijwAApAwA3A6AjICEgZa0iAkI4hiACQoD+A4NCKIaEIAJCgID8B4NCGIYgAkKAgID4D4NCCIaEhDcDyCMgIUGgLGpCADcDACAhQZgsakIANwMAICFBkCxqQgA3AwAgIUIANwOILCAhQYgsaiEvIwBBQGoiMiQAICFByCNqIiQtAEAiJSAkaiIqQYABOgAAICWtIgRCO4YgIUGgI2oiJykDICIDQgmGIgIgBEIDhoQiBEKA/gODQiiGhCAEQoCA/AeDQhiGIARCgICA+A+DQgiGhIQgA0IBhkKAgID4D4MgA0IPiEKAgPwHg4QgA0IfiEKA/gODIAJCOIiEhIQhAgJAAkAgJUE/RwRAICVBP3MiJgRAICpBAWpBACAm/AsACyAlQThzQQdLDQELICcgJEEBEC0gMkEwakIANwMAIDJBKGpCADcDACAyQSBqQgA3AwAgMkEYakIANwMAIDJBEGpCADcDACAyQQhqQgA3AwAgMkIANwMAIDIgAjcDOCAnIDJBARAtDAELICQgAjcAOCAnICRBARAtCyAkQQA6AEAgLyAnKAIcIiZBGHQgJkGA/gNxQQh0ciAmQQh2QYD+A3EgJkEYdnJyNgAcIC8gJygCGCImQRh0ICZBgP4DcUEIdHIgJkEIdkGA/gNxICZBGHZycjYAGCAvICcoAhQiJkEYdCAmQYD+A3FBCHRyICZBCHZBgP4DcSAmQRh2cnI2ABQgLyAnKAIQIiZBGHQgJkGA/gNxQQh0ciAmQQh2QYD+A3EgJkEYdnJyNgAQIC8gJygCDCImQRh0ICZBgP4DcUEIdHIgJkEIdkGA/gNxICZBGHZycjYADCAvICcoAggiJkEYdCAmQYD+A3FBCHRyICZBCHZBgP4DcSAmQRh2cnI2AAggLyAnKAIEIiZBGHQgJkGA/gNxQQh0ciAmQQh2QYD+A3EgJkEYdnJyNgAEIC8gJygCACImQRh0ICZBgP4DcUEIdHIgJkEIdkGA/gNxICZBGHZycjYAACAyQUBrJAAgJyAvQdCJwQAQHQJAAkACQAJAAkACQAJAICEtAIAkQQJGBEAgIUHgG2ogKCgCACIANgIAICEgISkDoCMiAjcD2BsgRUEMaiAANgIAIEUgAjcCBCBFQQE2AgAMAQsgIUHYG2oiJiAhQaAjaiIlQeAA/AoAACAhQQhqICZB4AD8CgAAICFB+CBqICFB4ABqKQMANwMAICFB8CBqICFB2ABqKQMANwMAICFB6CBqICFB0ABqKQMANwMAICFB4CBqICFByABqKQMANwMAICFB2CBqICFBQGspAwA3AwAgISAhKQM4NwPQICAhQaggaiAhQRBqKQMANwMAICFBsCBqICFBGGopAwA3AwAgIUG4IGogIUEgaikDADcDACAhQcAgaiAhQShqKQMANwMAICFByCBqICFBMGopAwA3AwAgISAhKQMINwOgICAhQaghakHI/8AAKQMANwMAICFBoCFqQcD/wAApAwA3AwAgIUGYIWpBuP/AACkDADcDACAhQZAhakGw/8AAKQMANwMAICFBiCFqQaj/wAApAwA3AwAgIUGg/8AAKQMANwOAISMAQcABayIxJAACQAJAICFBoCBqIi9B4ABqIjJB2LPCAEEwEPEDBEBBACEwQQAhJCMAQdAdayIgJAAgIEGQGWogL0EwaiImKQMgIgdCACAmKQMoIgZCABDJAyAgQaAZaiAmKQMYIgVCACAGQgAQyQMgIEGwGWogJikDECIDQgAgBkIAEMkDICBBwBlqICYpAwgiBEIAIAZCABDJAyAgQdAZaiAmKQMAIgJCACAGQgAQyQMgIEHwGWogBUIAIAdCABDJAyAgQYAaaiADQgAgB0IAEMkDICBBkBpqIARCACAHQgAQyQMgIEGgGmogAkIAIAdCABDJAyAgQcAaaiADQgAgBUIAEMkDICBB0BpqIARCACAFQgAQyQMgIEHgGmogAkIAIAVCABDJAyAgQYAbaiAEQgAgA0IAEMkDICBBkBtqIAJCACADQgAQyQMgIEGwG2ogAkIAIARCABDJAyAgQeAZaiAGQgAgBkIAEMkDICBBsBpqIAdCACAHQgAQyQMgIEHwGmogBUIAIAVCABDJAyAgQaAbaiADQgAgA0IAEMkDICBBwBtqIARCACAEQgAQyQMgIEHQG2ogAkIAIAJCABDJAyAgQYAZaiAgKQPgGSIPQv3/8//P///5iX9+IgJCAEKr1f7///+//7l/QgAQyQMgIEHwGGogAkIAQv//z4rr///VHkIAEMkD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v/+5f0IAEMkDICBBwA9qIAVCAEL//8+K6///1R5CABDJAyAgQbAPaiAFQgBCpOzDtY/UtJjnAEIAEMkDICBBoA9qIAVCAEK/pZScz/DSu+QAQgAQyQMgIEGQD2ogBUIAQtfZrprk9umNywBCABDJAyAgQYAPaiAFQgBCms3/y6O9xIAaQgAQyQMCQCAgKQOIDyAgKQOYDyAgKQOoDyAgKQO4DyAgKQPIDyAgKQPYDyAgKQPQDyIFIA58IAVUrXwiBSAgKQPAD3wiDiAFVK18IA4gCiAOfCIMVq18IgUgICkDsA98IgogBVStfCAJIAp8IgkgClStfCIFICApA6APfCIKIAVUrXwgByAKfCIHIApUrXwiBSAgKQOQD3wiCiAFVK18IAYgCnwiBiAKVK18IgUgICkDgA98IgogBVStfCAKIAMgCnwiBVatfCIDUA0AIAMgC3wiCyADWg0AIAMgC1atIgMgAnwiAiADWg0AIAIgA1StIgMgBHwiBCADVCEwCyAgQfAOaiAMQv3/8//P///5iX9+IgNCAEKr1f7///+//7l/QgAQyQMgIEHgDmogA0IAQv//z4rr///VHkIAEMkDICBB0A5qIANCAEKk7MO1j9S0mOcAQgAQyQMgIEHADmogA0IAQr+llJzP8NK75ABCABDJAyAgQbAOaiADQgBC19mumuT26Y3LAEIAEMkDICBBoA5qIANCAEKazf/Lo73EgBpCABDJA0EAISsgICkDqA4gICkDuA4gICkDyA4gICkD2A4gICkD6A4gICkD+A4gICkD8A4iAyAMfCADVK18IgMgICkD4A58IgogA1StfCAJIAp8IgwgClStfCIDICApA9AOfCIJIANUrXwgByAJfCIKIAlUrXwiAyAgKQPADnwiByADVK18IAYgB3wiCSAHVK18IgMgICkDsA58IgYgA1StfCAGIAUgBnwiBlatfCIDICApA6AOfCIFIANUrXwgBSALfCIHIAVUrXwiA1BFBEAgAiADfCICIANUIiatIgUgBHwiAyAEICYbIQQgJiADIAVUcSErCyAgQZAOaiAMQv3/8//P///5iX9+IgNCAEKr1f7///+//7l/QgAQyQMgIEGADmogA0IAQv//z4rr///VHkIAEMkDICBB8A1qIANCAEKk7MO1j9S0mOcAQgAQyQMgIEHgDWogA0IAQr+llJzP8NK75ABCABDJAyAgQdANaiADQgBC19mumuT26Y3LAEIAEMkDICBBwA1qIANCAEKazf/Lo73EgBpCABDJAyAgKQPIDSAgKQPYDSAgKQPoDSAgKQP4DSAgKQOIDiAgKQOYDiAgKQOQDiIDIAx8IANUrXwiAyAgKQOADnwiBSADVK18IAUgCnwiCyAFVK18IgMgICkD8A18IgUgA1StfCAFIAUgCXwiBVatfCIDICApA+ANfCIJIANUrXwgBiAJfCIGIAlUrXwiAyAgKQPQDXwiCSADVK18IAcgCXwiByAJVK18IgMgICkDwA18IgkgA1StfCACIAl8IgIgCVStfCIKIAR8IgMgBCAKQgBSIigbIQkCQAJAAkAgAyAKVCImrSAKICgbUEUEQCACIQQMAQsgKyAkICpyICdyIDBycgRAIAIhBAwBCyAmIChxBEAgAiEEDAELIAlCms3/y6O9xIAaVgRAIAIhBAwBCyAJQprN/8ujvcSAGlINASACQtfZrprk9umNywBWBEAgAiEEDAELIAJC19mumuT26Y3LAFINAULX2a6a5PbpjcsAIQQgB0K/pZScz/DSu+QAVg0AIAdCv6WUnM/w0rvkAFINASAGQqTsw7WP1LSY5wBWDQAgBkKk7MO1j9S0mOcAUg0BIAVC///Piuv//9UeVg0AIAVC///Piuv//9UeUiALQqrV/v///7//uX9Ycg0BCyAFQv//z4rr///VHn0iDCALQqvV/v///7//uX9UrSICfSEDIAZCpOzDtY/UtJjnAH0iCiAFQv//z4rr///VHlQgAiAMVnKtIgJ9IQUgB0K/pZScz/DSu+QAfSIMIAZCpOzDtY/UtJjnAFQgAiAKVnKtIgJ9IQYgBELX2a6a5PbpjcsAfSIKIAdCv6WUnM/w0rvkAFQgAiAMVnKtIgd9IQIgCSAEQtfZrprk9umNywBUIAcgClZyrX1Cms3/y6O9xIAafSEJIAtC1aqBgICAwIDGAHwhCwwBCyAFIQMgBiEFIAchBgsgICALNwO4HCAgIAM3A7AcICAgBTcDqBwgICAGNwOgHCAgIAI3A5gcICAgCTcDkBwgIEHwHGoiJkIANwMAICZBKGpCADcDACAmQSBqQgA3AwAgJkEYakIANwMAICZBEGpCADcDACAmQQhqQgA3AwAgIEGwDGogMikDICIHQgAgMikDKCIGQgAQyQMgIEGADGogMikDGCIFQgAgBkIAEMkDICBBwAtqIDIpAxAiA0IAIAZCABDJAyAgQfAKaiAyKQMIIgRCACAGQgAQyQMgIEGQCmogMikDACICQgAgBkIAEMkDICBBkAxqIAVCACAHQgAQyQMgIEHQC2ogA0IAIAdCABDJAyAgQYALaiAEQgAgB0IAEMkDICBBoApqIAJCACAHQgAQyQMgIEHgC2ogA0IAIAVCABDJAyAgQZALaiAEQgAgBUIAEMkDICBBsApqIAJCACAFQgAQyQMgIEGgC2ogBEIAIANCABDJAyAgQcAKaiACQgAgA0IAEMkDICBB0ApqIAJCACAEQgAQyQMgIEGwDWogBkIAIAZCABDJAyAgQcAMaiAHQgAgB0IAEMkDICBBoAxqIAVCACAFQgAQyQMgIEHwC2ogA0IAIANCABDJAyAgQbALaiAEQgAgBEIAEMkDICBB4ApqIAJCACACQgAQyQMgIEGgDWogICkDsA0iH0L9//P/z///+Yl/fiICQgBCq9X+////v/+5f0IAEMkDICBBkA1qIAJCAEL//8+K6///1R5CABDJAyAgQYANaiACQgBCpOzDtY/UtJjnAEIAEMkDICBB8AxqIAJCAEK/pZScz/DSu+QAQgAQyQMgIEHgDGogAkIAQtfZrprk9umNywBCABDJAyAgQdAMaiACQgBCms3/y6O9xIAaQgAQyQMgICkD2AogICkDyAogICkDqAsgICkDmAsgICkD6AsgICkD2AsgICkDmAwgICkDiAwgICkDuAwiAiAgKQOADHwiDCACVK18IgIgICkDwAt8IgQgICkDkAx8IgogBFStfCIDICApA8gLIAIgBFatfCIEICApA/AKfCICfCIFIANUrXwgBSAFICApA9ALfCITVq18IgMgICkD+AogAiAEVK18IgUgICkDkAp8IgJ8IgcgICkDgAt8IgYgICkD4At8IgkgBlStfCIEIAYgB1StICApA4gLIAMgB1atfHwiAyAgKQOYCiACIAVUrXx8IgYgICkDoAp8IgJ8IgUgBFStfCAFIAUgICkDkAt8IhhWrXwiBCACIAZUrSAgKQOoCiADIAZWrXx8fCIFICApA7AKfCIDICApA6ALfCIZIANUrXwiAiADIAVUrSAgKQO4CiAEIAVWrXx8fCIEIAJUrXwgBCAEICApA8AKfCIXVq18IgIgICkD0Ap8IgsgAlStfCICQj+IICApA+gKIhYgICkD4AoiGiACQgGGIAtCP4iEfCIVIBpUrXwgFSAgKQO4CyIQICApA7ALIhsgF0IBhiAZQj+IhHwiByAbVK18IAcgICkD+AsiEiAgKQPwCyIcIBhCAYYgCUI/iIR8IgUgHFStfCAFIAUgICkDqAwiESAgKQOgDCIdIBNCAYYgCkI/iIR8IgMgHVStfCADIAMgICkDyAwiDyAgKQPADCIeIAxCAYYgICkDsAwiAkI/iIR8IgQgHlStfCAEIAQgICkDuA0iFCACQgGGfCINIBRUrXwiDlatfCICIApCAYYgDEI/iIR8IgwgAlStfCIKVq18IgIgCUIBhiATQj+IhHwiCSACVK18IgZWrXwiAiAZQgGGIBhCP4iEfCIFIAJUrXwiAyAHVK18IgIgC0IBhiAXQj+IhHwiCyACVK18IgIgFVStfHwhBEEAISQCfwJAICApA9gMICApA+gMICApA/gMICApA4gNICApA5gNICApA6gNICApA6ANIgcgH0J9g3wgB1StfCIHICApA5ANfCIVIAdUrXwgFSANIBV8IhVWrXwiByAgKQOADXwiDSAHVK18IA0gDnwiDiANVK18IgcgICkD8Ax8Ig0gB1StfCAMIA18IgwgDVStfCIHICApA+AMfCINIAdUrXwgCiANfCIKIA1UrXwiByAgKQPQDHwiDSAHVK18IAkgDXwiCSANVK18IgdQDQAgBiAHfCIGIAdUIiZFDQAgJq0iByAFfCIFIAdaDQAgBSAHVK0iByADfCIDIAdaDQAgAyAHVK0iByALfCILIAdaDQAgByALVq0iByACfCICIAdaDQAgAiAHVK0iByAEfCIEIAdUDAELQQALISogIEGACmogFUL9//P/z///+Yl/fiIHQgBCq9X+////v/+5f0IAEMkDICBB8AlqIAdCAEL//8+K6///1R5CABDJAyAgQeAJaiAHQgBCpOzDtY/UtJjnAEIAEMkDICBB0AlqIAdCAEK/pZScz/DSu+QAQgAQyQMgIEHACWogB0IAQtfZrprk9umNywBCABDJAyAgQbAJaiAHQgBCms3/y6O9xIAaQgAQyQMCQCAgKQO4CSAgKQPICSAgKQPYCSAgKQPoCSAgKQP4CSAgKQOICiAgKQOACiIHIBV8IAdUrXwiByAgKQPwCXwiFSAHVK18IBUgDiAVfCINVq18IgcgICkD4Al8Ig4gB1StfCAMIA58IgwgDlStfCIHICApA9AJfCIOIAdUrXwgCiAOfCIKIA5UrXwiByAgKQPACXwiDiAHVK18IAkgDnwiCSAOVK18IgcgICkDsAl8Ig4gB1StfCAOIAYgDnwiB1atfCIGUA0AIAUgBnwiBSAGWg0AIAUgBlStIgYgA3wiAyAGWg0AIAMgBlStIgYgC3wiCyAGWg0AIAYgC1atIgYgAnwiAiAGWg0AIAIgBlStIgYgBHwiBCAGVCEkCyAgQaAJaiANQv3/8//P///5iX9+IgZCAEKr1f7///+//7l/QgAQyQMgIEGQCWogBkIAQv//z4rr///VHkIAEMkDICBBgAlqIAZCAEKk7MO1j9S0mOcAQgAQyQMgIEHwCGogBkIAQr+llJzP8NK75ABCABDJAyAgQeAIaiAGQgBC19mumuT26Y3LAEIAEMkDICBB0AhqIAZCAEKazf/Lo73EgBpCABDJA0EAITACf0EAICApA9gIICApA+gIICApA/gIICApA4gJICApA5gJICApA6gJICApA6AJIgYgDXwgBlStfCIGICApA5AJfCINIAZUrXwgDSAMIA18Ig5WrXwiBiAgKQOACXwiDCAGVK18IAogDHwiCiAMVK18IgYgICkD8Ah8IgwgBlStfCAJIAx8IgkgDFStfCIGICApA+AIfCIMIAZUrXwgByAMfCIHIAxUrXwiBiAgKQPQCHwiDCAGVK18IAwgBSAMfCIGVq18IgVQDQAaQQAgBSADIAV8IgNYDQAaQQAgAyAFVK0iBSALfCILIAVaDQAaQQAgBSALVq0iBSACfCICIAVaDQAaIAIgBVStIgUgBHwiBCAFVAshJyAgQcAIaiAOQv3/8//P///5iX9+IgVCAEKr1f7///+//7l/QgAQyQMgIEGwCGogBUIAQv//z4rr///VHkIAEMkDICBBoAhqIAVCAEKk7MO1j9S0mOcAQgAQyQMgIEGQCGogBUIAQr+llJzP8NK75ABCABDJAyAgQYAIaiAFQgBC19mumuT26Y3LAEIAEMkDICBB8AdqIAVCAEKazf/Lo73EgBpCABDJAwJAICApA/gHICApA4gIICApA5gIICApA6gIICApA7gIICApA8gIICApA8AIIgUgDnwgBVStfCIFICApA7AIfCIOIAVUrXwgDiAKIA58IgxWrXwiBSAgKQOgCHwiCiAFVK18IAkgCnwiCSAKVK18IgUgICkDkAh8IgogBVStfCAHIAp8IgcgClStfCIFICApA4AIfCIKIAVUrXwgBiAKfCIGIApUrXwiBSAgKQPwB3wiCiAFVK18IAogAyAKfCIFVq18IgNQDQAgAyALfCILIANaDQAgAyALVq0iAyACfCICIANaDQAgAiADVK0iAyAEfCIEIANUITALICBB4AdqIAxC/f/z/8////mJf34iA0IAQqvV/v///7//uX9CABDJAyAgQdAHaiADQgBC///Piuv//9UeQgAQyQMgIEHAB2ogA0IAQqTsw7WP1LSY5wBCABDJAyAgQbAHaiADQgBCv6WUnM/w0rvkAEIAEMkDICBBoAdqIANCAELX2a6a5PbpjcsAQgAQyQMgIEGQB2ogA0IAQprN/8ujvcSAGkIAEMkDQQAhKyAgKQOYByAgKQOoByAgKQO4ByAgKQPIByAgKQPYByAgKQPoByAgKQPgByIDIAx8IANUrXwiAyAgKQPQB3wiCiADVK18IAkgCnwiDCAKVK18IgMgICkDwAd8IgkgA1StfCAHIAl8IgogCVStfCIDICApA7AHfCIHIANUrXwgBiAHfCIJIAdUrXwiAyAgKQOgB3wiBiADVK18IAYgBSAGfCIGVq18IgMgICkDkAd8IgUgA1StfCAFIAt8IgcgBVStfCIDUEUEQCACIAN8IgIgA1QiJq0iBSAEfCIDIAQgJhshBCAmIAMgBVRxISsLICBBgAdqIAxC/f/z/8////mJf34iA0IAQqvV/v///7//uX9CABDJAyAgQfAGaiADQgBC///Piuv//9UeQgAQyQMgIEHgBmogA0IAQqTsw7WP1LSY5wBCABDJAyAgQdAGaiADQgBCv6WUnM/w0rvkAEIAEMkDICBBwAZqIANCAELX2a6a5PbpjcsAQgAQyQMgIEGwBmogA0IAQprN/8ujvcSAGkIAEMkDICApA7gGICApA8gGICApA9gGICApA+gGICApA/gGICApA4gHICApA4AHIgMgDHwgA1StfCIDICApA/AGfCIFIANUrXwgBSAKfCILIAVUrXwiAyAgKQPgBnwiBSADVK18IAUgBSAJfCIFVq18IgMgICkD0AZ8IgkgA1StfCAGIAl8IgYgCVStfCIDICApA8AGfCIJIANUrXwgByAJfCIHIAlUrXwiAyAgKQOwBnwiCSADVK18IAIgCXwiAiAJVK18IgogBHwiAyAEIApCAFIiKBshCQJAAkACQCADIApUIiatIAogKBtQRQRAIAIhBAwBCyArICQgKnIgJ3IgMHJyBEAgAiEEDAELICYgKHEEQCACIQQMAQsgCUKazf/Lo73EgBpWBEAgAiEEDAELIAlCms3/y6O9xIAaUg0BIAJC19mumuT26Y3LAFYEQCACIQQMAQsgAkLX2a6a5PbpjcsAUg0BQtfZrprk9umNywAhBCAHQr+llJzP8NK75ABWDQAgB0K/pZScz/DSu+QAUg0BIAZCpOzDtY/UtJjnAFYNACAGQqTsw7WP1LSY5wBSDQEgBUL//8+K6///1R5WDQAgBUL//8+K6///1R5SIAtCqtX+////v/+5f1hyDQELIAVC///Piuv//9UefSIMIAtCq9X+////v/+5f1StIgJ9IQMgBkKk7MO1j9S0mOcAfSIKIAVC///Piuv//9UeVCACIAxWcq0iAn0hBSAHQr+llJzP8NK75AB9IgwgBkKk7MO1j9S0mOcAVCACIApWcq0iAn0hBiAEQtfZrprk9umNywB9IgogB0K/pZScz/DSu+QAVCACIAxWcq0iB30hAiAJIARC19mumuT26Y3LAFQgByAKVnKtfUKazf/Lo73EgBp9IQkgC0LVqoGAgIDAgMYAfCELDAELIAUhAyAGIQUgByEGCyAgIAs3A8gdICAgAzcDwB0gICAFNwO4HSAgIAY3A7AdICAgAjcDqB0gICAJNwOgHSAgQcAcaiInICBB8BxqIiggIEGgHWoiKhCyASAqICBBkBxqIiYgJxC9AiAmICogLxCyASAoQvP/s4CAgMCTqn83AyggKEKKgNDhr4aA5tMANwMgIChC/4Cq2Kav+sfHADcDGCAoQtfJ6LXu19/psX83AxAgKEKv1uL7u+fc5I5/NwMIIChC/ryP7JOqkesJNwMAICBBoAZqIDIpAyAiB0IAIDIpAygiBkIAEMkDICBBgAZqIDIpAxgiBUIAIAZCABDJAyAgQdAFaiAyKQMQIgNCACAGQgAQyQMgIEGQBWogMikDCCIEQgAgBkIAEMkDICBBwARqIDIpAwAiAkIAIAZCABDJAyAgQZAGaiAFQgAgB0IAEMkDICBB4AVqIANCACAHQgAQyQMgIEGgBWogBEIAIAdCABDJAyAgQdAEaiACQgAgB0IAEMkDICBB8AVqIANCACAFQgAQyQMgIEGwBWogBEIAIAVCABDJAyAgQeAEaiACQgAgBUIAEMkDICBBwAVqIARCACADQgAQyQMgIEHwBGogAkIAIANCABDJAyAgQYAFaiACQgAgBEIAEMkDICBBsARqIB9C/f/z/8////mJf34iAkIAQqvV/v///7//uX9CABDJAyAgQaAEaiACQgBC///Piuv//9UeQgAQyQMgIEGQBGogAkIAQqTsw7WP1LSY5wBCABDJAyAgQYAEaiACQgBCv6WUnM/w0rvkAEIAEMkDICBB8ANqIAJCAELX2a6a5PbpjcsAQgAQyQMgIEHgA2ogAkIAQprN/8ujvcSAGkIAEMkDICApA4gFICApA/gEICApA8gFICApA7gFICApA/gFICApA+gFICApA5gGICApA4gGICApA6gGIgIgICkDgAZ8IgwgAlStfCICICApA9AFfCIEICApA5AGfCIKIARUrXwiAyAgKQPYBSACIARWrXwiBCAgKQOQBXwiAnwiBSADVK18IAUgBSAgKQPgBXwiE1atfCIDICApA5gFIAIgBFStfCIFICApA8AEfCICfCIHICApA6AFfCIGICApA/AFfCIJIAZUrXwiBCAGIAdUrSAgKQOoBSADIAdWrXx8IgMgICkDyAQgAiAFVK18fCIGICApA9AEfCICfCIFIARUrXwgBSAFICApA7AFfCIYVq18IgQgAiAGVK0gICkD2AQgAyAGVq18fHwiBSAgKQPgBHwiAyAgKQPABXwiGSADVK18IgIgAyAFVK0gICkD6AQgBCAFVq18fHwiBCACVK18IAQgBCAgKQPwBHwiF1atfCICICApA4AFfCILIAJUrXwiAkI/iCAWIBogGiACQgGGIAtCP4iEfCIVVq18IBUgECAbIBsgF0IBhiAZQj+IhHwiB1atfCAHIBIgHCAYQgGGIAlCP4iEfCIFIBxUrXwgBSAFIBEgHSATQgGGIApCP4iEfCIDIB1UrXwgAyADIA8gHiAMQgGGICApA6AGIgJCP4iEfCIEIB5UrXwgBCAEIBQgAkIBhnwiDSAUVK18Ig5WrXwiAiAKQgGGIAxCP4iEfCIMIAJUrXwiClatfCICIAlCAYYgE0I/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IEGAAWogA0IAQr+llJzP8NK75ABCABDJAyAgQfAAaiADQgBC19mumuT26Y3LAEIAEMkDICBB4ABqIANCAEKazf/Lo73EgBpCABDJA0EAISQgICkDaCAgKQN4ICApA4gBICApA5gBICApA6gBICApA7gBICApA7ABIgMgDHwgA1StfCIDICApA6ABfCIKIANUrXwgCSAKfCIMIApUrXwiAyAgKQOQAXwiCSADVK18IAcgCXwiCiAJVK18IgMgICkDgAF8IgcgA1StfCAGIAd8IgkgB1StfCIDICApA3B8IgYgA1StfCAGIAUgBnwiBlatfCIDICApA2B8IgUgA1StfCAFIAt8IgcgBVStfCIDUEUEQCACIAN8IgIgA1QiJq0iBSAEfCIDIAQgJhshBCAmIAMgBVRxISQLICBB0ABqIAxC/f/z/8////mJf34iA0IAQqvV/v///7//uX9CABDJAyAgQUBrIANCAEL//8+K6///1R5CABDJAyAgQTBqIANCAEKk7MO1j9S0mOcAQgAQyQMgIEEgaiADQgBCv6WUnM/w0rvkAEIAEMkDICBBEGogA0IAQtfZrprk9umNywBCABDJAyAgIANCAEKazf/Lo73EgBpCABDJAyAgKQMIICApAxggICkDKCAgKQM4ICApA0ggICkDWCAgKQNQIgMgDHwgA1StfCIDICApA0B8IgUgA1StfCAFIAp8IgsgBVStfCIDICApAzB8IgUgA1StfCAFIAUgCXwiBVatfCIDICApAyB8IgkgA1StfCAGIAl8IgYgCVStfCIDICApAxB8IgkgA1StfCAHIAl8IgcgCVStfCIDICApAwB8IgkgA1StfCACIAl8IgIgCVStfCIKIAR8IgMgBCAKQgBSIigbIQkCQAJAAkAgAyAKVCImrSAKICgbUEUEQCACIQQMAQsgKiAwciAnciArciAkcgRAIAIhBAwBCyAmIChxBEAgAiEEDAELIAlCms3/y6O9xIAaVgRAIAIhBAwBCyAJQprN/8ujvcSAGlINASACQtfZrprk9umNywBWBEAgAiEEDAELIAJC19mumuT26Y3LAFINAULX2a6a5PbpjcsAIQQgB0K/pZScz/DSu+QAVg0AIAdCv6WUnM/w0rvkAFINASAGQqTsw7WP1LSY5wBWDQAgBkKk7MO1j9S0mOcAUg0BIAVC///Piuv/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ADcDACAtQcgLaiAtQcACaikDADcDACAtQdALaiAtQcgCaikDADcDACAtIC0pA6ACNwOoCyAtQeALaiAtQdgCaikDADcDACAtQegLaiAtQeACaikDADcDACAtQfALaiAtQegCaikDADcDACAtQfgLaiAtQfACaikDADcDACAtQYAMaiAtQfgCaikDADcDACAtIC0pA9ACNwPYCyAtQegJaiAtQYADahC0AiAtQegEaiAtQYgEaikDADcDACAtQeAEaiAtQYAEaikDADcDACAtQdgEaiAtQfgDaikDADcDACAtQdAEaiAtQfADaikDADcDACAtQcgEaiAtQegDaikDADcDACAtQfgEaiAtQZgEaikDADcDACAtQYAFaiAtQaAEaikDADcDACAtQYgFaiAtQagEaikDADcDACAtQZAFaiAtQbAEaikDADcDACAtQZgFaiAtQbgEaikDADcDACAtIC0pA+ADNwPABCAtIC0pA5AENwPwBCAlIC1BqAtqQeAA/AoAACAtQcgKaiAAQeAA/AoAACAmICUQrwIgLSgC4AZBAUYNAiAlIC1B6AZqQaAC/AoAACMAQcABayIkJAAgJCAtICVBwAFqIiYQPyAkQeAAaiIoIC1BwAFqIgAgJRA/An9BACAkIChBMBDxAw0AGkEAICRBMGogJEGQAWpBMBDxAw0AGiAkIC1B4ABqICYQPyAoICVB4ABqIAAQP0EAICQgKEEwEPEDDQAaICRBMGogJEGQAWpBMBDxA0ULICRBwAFqJAAgLUHwDGokAAwDC0GQjcUAQSsgLUHvDGpBgI3FAEHokMUAEMoDAAtBkI3FAEErIC1B7wxqQYCNxQBBsJLFABDKAwALQZCNxQBBKyAtQe8MakGAjcUAQdCSxQAQygMAC0UNAQJAIDVB4ABqQcCNxQBBMBDxA0UNACAqQbAMaiIAQQBB4AD8CwAgOUHAAWogAEEwEPEDRQRAIDlB8AFqIEdBMBDxA0UNAQsgKkHABGohVUIAIQJCACEOIwBB4ARrIiQkAAJAAkAgNUHgAGoiAEGoo8UAQTAQ8QMEQCAkQcADakIANwMAICRBuANqQgA3AwAgJEGwA2pCADcDACAkQagDakIANwMAICRCADcDoAMgJEIBNwPIA0EoISUgJEH4A2ogAEEoaikDADcDACAkQfADaiAAQSBqKQMANwMAICRB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C0L//8+K6///1R4hBiAUQqrV/v///7//uX9WDQELQprN/8ujvcSAGiENDAELIAJC///Piuv//9UefSILIBRCq9X+////v/+5f1StIgV9IQYgBEKk7MO1j9S0mOcAfSIHIAJC///Piuv//9UeVCAFIAtWcq0iAn0hCyADQr+llJzP8NK75AB9IgUgBEKk7MO1j9S0mOcAVCACIAdWcq0iAn0hCiAIQtfZrprk9umNywB9IgQgA0K/pZScz/DSu+QAVCACIAVWcq0iAn0hDiANIAhC19mumuT26Y3LAFQgAiAEVnKtfUKazf/Lo73EgBp9IQ0gFELVqoGAgIDAgMYAfCEUCwJ+IDlBkJTFAEEwEPEDBEBC///Piuv//9UeICMpA8AhIgd9IgggIykDyCEiD0Kr1f7///+//7l/Vq0iAn0hBUKk7MO1j9S0mOcAICMpA7ghIgN9IgQgAiAIViAHQv//z4rr///VHlZyrSICfSEHQr+llJzP8NK75AAgIykDsCEiDH0iCCACIARWIANCpOzDtY/UtJjnAFZyrSICfSEJQtfZrprk9umNywAgIykDqCEiA30iBCACIAhWIAxCv6WUnM/w0rvkAFZyrSICfSEMQqvV/v///7//uX8gD30hGEKazf/Lo73EgBogIykDoCEgAiAEViADQtfZrprk9umNywBWcq18fQwBCyAjKQOILCEYICMpA4AsIQUgIykD+CshByAjKQPwKyEJICMpA+grIQwgIykD4CsLIRJCACETQdgAIStCACECQgAhBEIAIQNCACEIQgAhDwNAICNBsAdqICsgVWopAwAiEUIAIBhCABDJAyAjQcAHaiARQgAgBUIAEMkDICNB0AdqIBFCACAHQgAQyQMgI0HgB2ogEUIAIAlCABDJAyAjQfAHaiARQgAgDEIAEMkDICNBgAhqIBFCACASQgAQyQMgI0GgB2ogIykDsAciESATfCIZQgBCAEL9//P/z///+Yl/EMkDICNBkAdqICMpA6gHIhBCAEKr1f7///+//7l/QgAQyQMgI0GAB2ogEEIAQv//z4rr///VHkIAEMkDICNB8AZqIBBCAEKk7MO1j9S0mOcAQgAQyQMgI0HgBmogEEIAQr+llJzP8NK75ABCABDJAyAjQdAGaiAQQgBC19mumuT26Y3LAEIAEMkDICNBwAZqIBBCAEKazf/L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IF4gAEHgAPwKAAAgI0G4K2ogI0GYHWopAwA3AwAgI0HAK2ogI0GgHWopAwA3AwAgI0HIK2ogI0GoHWopAwA3AwAgI0HQK2ogI0GwHWopAwA3AwAgI0HYK2ogI0G4HWopAwA3AwAgIiBkKQMANwMAICJBCGogZEEIaikDADcDACAiQRBqIGRBEGopAwA3AwAgIkEYaiBkQRhqKQMANwMAICJBIGogZEEgaikDADcDACAiQShqIGRBKGopAwA3AwAgIyAjKQOQHTcDsCsgLiAjQbArakHgAPwKAAAgKSAuELQCICAgKSA8ED8gI0G4GWogI0G4HGopAwA3AwAgI0HAGWogI0HAHGopAwA3AwAgI0HIGWogI0HIHGopAwA3AwAgI0HQGWogI0HQHGopAwA3AwAgI0HYGWogI0HYHGopAwA3AwAgPSBgKQMANwMAID1BCGogYEEIaikDADcDACA9QRBqIGBBEGopAwA3AwAgPUEYaiBgQRhqKQMANwMAID1BIGogYEEgaikDADcDACA9QShqIGBBKGopAwA3AwAgIyAjKQOwHDcDsBkgLiAvQeAA/AoAACApIC4gOBA/ICNBkCNqICAgKRDVAQJ+IDFBkJTFAEEwEPEDBEBC///Piuv//9UeICMpA9AcIgh9IgUgIykD2BwiCkKr1f7///+//7l/Vq0iAn0hBkKk7MO1j9S0mOcAICMpA8gcIgN9IgQgAiAFViAIQv//z4rr///VHlZyrSICfSEFQr+llJzP8NK75AAgIykDwBwiC30iCCACIARWIANCpOzDtY/UtJjnAFZyrSICfSEHQtfZrprk9umNywAgIykDuBwiA30iBCACIAhWIAtCv6WUnM/w0rvkAFZyrSICfSEJQqvV/v///7//uX8gCn0hC0Kazf/Lo73EgBogIykDsBwgAiAEViADQtfZrprk9umNywBWcq18fQwBCyAjKQP4KiELICMpA/AqIQYgIykD6CohBSAjKQPgKiEHICMpA9gqIQkgIykD0CoLIQ5CACEUQSghK0IAIQJCACEEQgAhA0IAIQhCACENA0AgI0HgBWogKyBVaikDACIKQgAgC0IAEMkDICNB8AVqIApCACAGQgAQyQMgI0GABmogCkIAIAVCABDJAyAjQZAGaiAKQgAgB0IAEMkDICNBoAZqIApCACAJQgAQyQMgI0GwBmog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AwA3AwAgI0GALWoiJiBYQRBqKQMANwMAICNB+CxqIgAgWEEIaikDADcDACAjICMpA7AQNwOgLSAjIFgpAwA3A/AsICsgI0HwLGoiKUHgAPwKAAAgI0HQFWogK0HgAPwKAAAgICAjQZgRaikDADcDACAwICNBoBFqKQMANwMAIDEgI0GoEWopAwA3AwAgMiAjQbARaikDADcDACAvICNBuBFqKQMANwMAICQgWUEoaikDADcDACAlIFlBIGopAwA3AwAgKCBZQRhqKQMANwMAICYgWUEQaikDADcDACAAIFlBCGopAwA3AwAgIyAjKQOQETcDoC0gIyBZKQMANwPwLCArIClB4AD8CgAAICNBsBZqICtB4AD8CgAAICNBkC9qIFMQtAIgI0HwL2ogTxC0AiAjQdAwaiBNELQCICkgLkGgAvwKAAAgQiApQcAE/AoAACAjQbAxaiQAIFYgQiAqEJ4CICogVkHABPwKAAALICdBCGoiJyBGRw0ACyBdQQhqIS0jAEGwO2siIiQAICJBkBJqICpBCGopAwA3AwAgIkGYEmogKkEQaikDADcDACAiQaASaiAqQRhqKQMANwMAICJBqBJqICpBIGopAwA3AwAgIkGwEmogKkEoaikDADcDACAiQcASaiAqQThqKQMANwMAICJByBJqICpBQGspAwA3AwAgIkHQEmogKkHIAGopAwA3AwAgIkHYEmogKkHQAGopAwA3AwAgIkHgEmogKkHYAGopAwA3AwAgIiAqKQMANwOIEiAiICopAzA3A7gSICJB0B9qIiAgIkGIEmoiLkHgAPwKAAAgIkGwG2oiMCAqQYgBaikDADcDACAiQagbaiIxICpBgAFqKQMANwMAICJBoBtqIjIgKkH4AGopAwA3AwAgIkGYG2oiLyAqQfAAaikDADcDACAiQZAbaiIkICpB6ABqKQMANwMAICJBwBtqIiUgKkGYAWopAwA3AwAgIkHIG2oiKCAqQaABaikDADcDACAiQdAbaiInICpBqAFqKQMANwMAICJB2BtqIiYgKkGwAWopAwA3AwAgIkHgG2oiACAqQbgBaikDADcDACAiICopA2A3A4gbICIgKikDkAE3A7gbIC4gIkGIG2oiKUHgAPwKAAAgIkGwIGogLkHgAPwKAAAgMCAqQegBaikDADcDACAxICpB4AFqKQMANwMAIDIgKkHYAWopAwA3AwAgLyAqQdABaikDADcDACAkICpByAFqKQMANwMAICUgKkH4AWopAwA3AwAgKCAqQYACaikDADcDACAnICpBiAJqKQMANwMAICYgKkGQAmopAwA3AwAgACAqQZgCaikDADcDACAiICopA8ABNwOIGyAiICopA/ABNwO4GyAuIClB4AD8CgAAICJBkCFqIC5B4AD8CgAAICJBqB1qICpBoAJqIiUQtAIgIkGIHmogKkGAA2oQtAIgIkHoHmogKkHgA2oQtAIgKSAgQaAC/AoAACAiQcgWaiIoIClBwAT8CgAAIwBB4A9rIjQkACA0QYAJaiInICoQcSA0QegEakHQnMUAKQMANwMAIDRB4ARqQcicxQApAwA3AwAgNEHYBGpBwJzFACkDADcDACA0QdAEakG4nMUAKQMANwMAIDRByARqQbCcxQApAwA3AwAgNEH4BGpCADcDACA0QYAFakIANwMAIDRBiAVqQgA3AwAgNEGQBWpCADcDACA0QZgFakIANwMAIDRBqJzFACkDADcDwAQgNEIANwPwBCA0QcANaiImQQBB4AD8CwAgNEGgDmogNEHABGoiMEHgAPwKAAAgNEGAD2pBAEHgAPwLACAwICUQcSA0QaALaiIAICYgMBC5AiA0QaACaiIuICcgABCNASA0QYADaiA0QeAJaiA0QYAMahCNASA0QeADaiA0QcAKaiA0QeAMahCNASMAQcAHayI2JAAgNhBtIDZBoAVqIiYgLkIDEM4BIDZB4AZqIjIgLkHgAGoiL0IDEM4BIDZBoAJqIjEQdSA2QYAGaiInIDIgMRA/IDZBwARqIgAgJiAnENUBIDIgLkHAAWoiJEIDEM4BICYQdSAxICZCAhDOASAnIDIgMRA/IDZBwAFqIiYgACAnENUBIDEgNiAuED8gMiAxIC8QPyAnIDIgJBA/IDEQdSAyICcgMRA/IDZB4ABqIgAgJiAyEI0BIDEgABA9IDYpA7ACIQQgNikDqAIhAiAwAn4gNigCoAJBAUYEQCAwIAQ3AxAgMCACNwMIQgEMAQsgNkHQAWogNkG4AmpB0AD8CgAAIDYgBDcDyAEgNiACNwPAASA2QaAFaiIxIC5CAhDOASA2QeAGaiIrIC8gJBA/IDZBoAJqIicQdSA2QYAGaiIyICsgJxA/ICsgMSAyEI0BICcgKyA2QcABaiImED8gKyAuELQCIDZBwARqIgAgKyAvED8gMiAkQgIQzgEgKxB1IDEgMiArED8gKyAAIDEQ1QEgNkGAA2ogKyAmED8gKyAuELQCIDIgKyAkED8gKyAvQgIQzgEgMSAyICsQ1QEgNkHgA2ogMSAmED8gMEEIaiAnQaAC/AoAAEIACzcDACA2QcAHaiQAIDQpA9AEIQQgNCkDyAQhAiApAn4gNCgCwARBAUYEQCApIAQ3AxAgKSACNwMIQgEMAQsgNEEQaiA0QdgEakGQAvwKAAAgNCAENwMIIDQgAjcDACA0QcAEaiInICogNBC5AiA0QYAJaiImICUQtAIgNEHgCWogKkGAA2oQtAIgNEHACmogKkHgA2oQtAIgNEGgC2oiACA0QaAC/AoAACA0QeAGaiAmIAAQuQIgKUEIaiAnQcAE/AoAAEIACzcDACA0QeAPaiQAICIpA5gbIQQgIikDkBshAgJAICIoAogbQQFHBEAgIkHgH2ogIkGgG2oiMUGwBPwKAAAgIiAENwPYHyAiIAI3A9AfICJBCGoiJyAoICAQngIgIkHQDWogIkEQaikDADcDACAiQdgNaiAiQRhqKQMANwMAICJB4A1qICJBIGopAwA3AwAgIkHoDWogIkEoaikDADcDACAiQfANaiAiQTBqKQMANwMAICIgIikDCDcDyA0gIkGADmogIkFAaykDADcDACAiQYgOaiAiQcgAaikDADcDACAiQZAOaiAiQdAAaikDADcDACAiQZgOaiAiQdgAaikDADcDACAiQaAOaiAiQeAAaikDADcDACAiICIpAzg3A/gNICJBsBtqIjJBoJrFACkDADcDACAiQagbaiIvQZiaxQApAwA3AwAgMUGQmsUAKQMANwMAICJBmBtqIiRBiJrFACkDADcDACAiQZAbaiIlQYCaxQApAwA3AwAgIkH4mcUAKQMANwOIGyAiQegSaiApICJB6ABqEHcgMkHQmsUAKQMANwMAIC9ByJrFACkDADcDACAxQcCaxQApAwA3AwAgJEG4msUAKQMANwMAICVBsJrFACkDADcDACAiQaiaxQApAwA3A4gbICJByBNqICkgIkHIAWoQdyAiQYgSaiImICJByA1qQeAA/AoAACAyQYCbxQApAwA3AwAgL0H4msUAKQMANwMAIDFB8JrFACkDADcDACAkQeiaxQApAwA3AwAgJUHgmsUAKQMANwMAICJB2JrFACkDADcDiBsgIkHIFmoiACAiQYgbaiIoICJBqAJqEHcgMkGwm8UAKQMANwMAIC9BqJvFACkDADcDACAxQaCbxQApAwA3AwAgJEGYm8UAKQMANwMAICVBkJvFACkDADcDACAiQYibxQApAwA3A4gbICJBqBdqICggIkGIA2oQdyAyQeCbxQApAwA3AwAgL0HYm8UAKQMANwMAIDFB0JvFACkDADcDACAkQcibxQApAwA3AwAgJUHAm8UAKQMANwMAICJBuJvFACkDADcDiBsgIkGIGGogKCAiQegDahB3ICggJkGgAvwKAAAgIkGoHWogAEGgAvwKAAAgIkHQH2oiJiAoQcAE/AoAACAiQcgEaiIAICYgJxCeAiAiQYgJaiAAEFcgMkHwocUAKQMANwMAIC9B6KHFACkDADcDACAxQeChxQApAwA3AwAgJEHYocUAKQMANwMAICVB0KHFACkDADcDACAiQcAbakIANwMAICJByBtqQgA3AwAgIkHQG2pCADcDACAiQdgbakIANwMAICJB4BtqQgA3AwAgIkHIocUAKQMANwOIGyAiQgA3A7gbICJBsCBqQQBBwAH8CwAgJiAoQeAA/AoAACAiQfAhakEAQaAC/AsAQUAhAANAICJBiBtqIicgIkHQH2oiJhBXICYgJ0HABPwKAAAgAEGsk8UAai0AAEEBRgRAICcgJiAiQcgEahCeAiAmICdBwAT8CgAACyAAQQFqIgANAAsgIkHIFmoiTCAiQdAfaiJIIgBBwAT8CgAAICJBkBJqICJB0BZqIispAwA3AwAgIkGYEmogIkHYFmoiKSkDADcDACAiQaASaiAiQeAWaiIuKQMANwMAICJBqBJqICJB6BZqIiApAwA3AwAgIkGwEmogIkHwFmoiMCkDADcDACAiQcASaiAiQYAXaiIxKQMANwMAICJByBJqICJBiBdqIjIpAwA3AwAgIkHQEmogIkGQF2oiLykDADcDACAiQdgSaiAiQZgXaiIkKQMANwMAICJB4BJqICJBoBdqIiUpAwA3AwAgIiAiKQPIFjcDiBIgIiAiKQP4FjcDuBIgACAiQYgSaiI8QeAA/AoAACAiQbAbaiJOICJB0BdqKQMANwMAICJBqBtqIlAgIkHIF2opAwA3AwAgIkGgG2oiPiAiQcAXaikDADcDACAiQZgbaiJAICJBuBdqKQMANwMAICJBkBtqIjcgIkGwF2opAwA3AwAgIkHAG2oiRiAiQeAXaikDADcDACAiQcgbaiJHICJB6BdqKQMANwMAICJB0BtqIjMgIkHwF2opAwA3AwAgIkHYG2oiNSAiQfgXaikDADcDACAiQeAbaiI5ICJBgBhqKQMANwMAICIgIikDqBc3A4gbICIgIikD2Bc3A7gbIDwgIkGIG2oiQkHgAPwKAAAgIkGwIGoiNCA8QeAA/AoAACBOICJBsBhqKQMANwMAIFAgIkGoGGopAwA3AwAgPiAiQaAYaikDADcDACBAICJBmBhqKQMANwMAIDcgIkGQGGopAwA3AwAgRiAiQcAYaikDADcDACBHICJByBhqKQMANwMAIDMgIkHQGGopAwA3AwAgNSAiQdgYaikDADcDACA5ICJB4BhqKQMANwMAICIgIikDiBg3A4gbICIgIikDuBg3A7gbIDwgQkHgAPwKAAAgIkGQIWoiKCA8QeAA/AoAACAiQagdaiInICJB6BhqELQCICJBiB5qIiYgIkHIGWoQtAIgIkHoHmoiACAiQagaahC0AiBCIEhBoAL8CgAAICJByA1qIjYgQkHABPwKAAAgKyAiQdAEaikDADcDACApICJB2ARqKQMANwMAIC4gIkHgBGopAwA3AwAgICAiQegEaikDADcDACAwICJB8ARqKQMANwMAICIgIikDyAQ3A8gWIDEgIkGABWopAwA3AwAgMiAiQYgFaikDADcDACAvICJBkAVqKQMANwMAICQgIkGYBWopAwA3AwAgJSAiQaAFaikDADcDACAiICIpA/gENwP4FiBIIExB4AD8CgAAIE4gIkHQBWopAwA3AwAgUCAiQcgFaikDADcDACA+ICJBwAVqKQMANwMAIEAgIkG4BWopAwA3AwAgNyAiQbAFaikDADcDACBGICJB4AVqKQMANwMAIEcgIkHoBWopAwA3AwAgMyAiQfAFaikDADcDACA1ICJB+AVqKQMANwMAIDkgIkGABmopAwA3AwAgIiAiKQOoBTcDiBsgIiAiKQPYBTcDuBsgTCBCQeAA/AoAACA0IExB4AD8CgAAIE4gIkGwBmopAwA3AwAgUCAiQagGaikDADcDACA+ICJBoAZqKQMANwMAIEAgIkGYBmopAwA3AwAgNyAiQZAGaikDADcDACBGICJBwAZqKQMANwMAIEcgIkHIBmopAwA3AwAgMyAiQdAGaikDADcDACA1ICJB2AZqKQMANwMAIDkgIkHgBmopAwA3AwAgIiAiKQOIBjcDiBsgIiAiKQO4BjcDuBsgTCBCQeAA/AoAACAoIExB4AD8CgAAICcgIkHoBmoQtAIgJiAiQcgHahC0AiAAICJBqAhqELQCIEIgSEGgAvwKAAAgPCBCQcAE/AoAACBIIDxBwAT8CgAAIEIgSCA2EJ4CIDYgQkHABPwKAAAgTkHwocUAKQMANwMAIFBB6KHFACkDADcDACA+QeChxQApAwA3AwAgQEHYocUAKQMANwMAIDdB0KHFACkDADcDACBGQgA3AwAgR0IANwMAIDNCADcDACA1QgA3AwAgOUIANwMAICJByKHFACkDADcDiBsgIkIANwO4GyA0QQBBwAH8CwAgSCBCQeAA/AoAACAiQfAhakEAQaAC/AsAQUAhAANAICJBiBtqIicgIkHQH2oiJhBXICYgJ0HABPwKAAAgAEGsk8UAai0AAEEBRgRAICcgJiAiQcgNahCeAiAmICdBwAT8CgAACyAAQQFqIgANAAsgIkHIFmoiPiAiQdAfaiJAIiBBwAT8CgAAICJB2DFqICJB0BZqIjApAwA3AwAgIkHgMWogIkHYFmoiMSkDADcDACAiQegxaiAiQeAWaiIyKQMANwMAICJB8DFqICJB6BZqIi8pAwA3AwAgIkH4MWogIkHwFmoiJCkDADcDACAiQYgyaiAiQYAXaiIlKQMANwMAICJBkDJqICJBiBdqIigpAwA3AwAgIkGYMmogIkGQF2oiJykDADcDACAiQaAyaiAiQZgXaiImKQMANwMAICJBqDJqICJBoBdqIgApAwA3AwAgIiAiKQPIFjcD0DEgIiAiKQP4FjcDgDIgICAiQdAxaiIgQeAA/AoAACAiQbAbaiI3ICJB0BdqKQMANwMAICJBqBtqIkYgIkHIF2opAwA3AwAgIkGgG2oiRyAiQcAXaikDADcDACAiQZgbaiIzICJBuBdqKQMANwMAICJBkBtqIjUgIkGwF2opAwA3AwAgIkHAG2oiOSAiQeAXaikDADcDACAiQcgbaiI0ICJB6BdqKQMANwMAICJB0BtqIjYgIkHwF2opAwA3AwAgIkHYG2oiKyAiQfgXaikDADcDACAiQeAbaiIpICJBgBhqKQMANwMAICIgIikDqBc3A4gbICIgIikD2Bc3A7gbICAgIkGIG2oiPEHgAPwKAAAgIkGwIGoiLiAgQeAA/AoAACA3ICJBsBhqKQMANwMAIEYgIkGoGGopAwA3AwAgRyAiQaAYaikDADcDACAzICJBmBhqKQMANwMAIDUgIkGQGGopAwA3AwAgOSAiQcAYaikDADcDACA0ICJByBhqKQMANwMAIDYgIkHQGGopAwA3AwAgKyAiQdgYaikDADcDACApICJB4BhqKQMANwMAICIgIikDiBg3A4gbICIgIikDuBg3A7gbICAgPEHgAPwKAAAgIkGQIWogIEHgAPwKAAAgIkGoHWogIkHoGGoQtAIgIkGIHmogIkHIGWoQtAIgIkHoHmogIkGoGmoQtAIgPCBAQaAC/AoAACAiQYgSaiIgIDxBwAT8CgAAIDAgIkHQDWopAwA3AwAgMSAiQdgNaikDADcDACAyICJB4A1qKQMANwMAIC8gIkHoDWopAwA3AwAgJCAiQfANaikDADcDACAlICJBgA5qKQMANwMAICggIkGIDmopAwA3AwAgJyAiQZAOaikDADcDACAmICJBmA5qKQMANwMAIAAgIkGgDmopAwA3AwAgIiAiKQPIDTcDyBYgIiAiKQP4DTcD+BYgPCA+QeAA/AoAACAiQfgfaiIwICJB0A5qKQMANwMAICJB8B9qIjEgIkHIDmopAwA3AwAgIkHoH2oiMiAiQcAOaikDADcDACAiQeAfaiIvICJBuA5qKQMANwMAICJB2B9qIiQgIkGwDmopAwA3AwAgIkGIIGoiJSAiQeAOaikDADcDACAiQZAgaiIoICJB6A5qKQMANwMAICJBmCBqIicgIkHwDmopAwA3AwAgIkGgIGoiJiAiQfgOaikDADcDACAiQaggaiIAICJBgA9qKQMANwMAICIgIikDqA43A9AfICIgIikD2A43A4AgID4gQEHgAPwKAAAgIkHoG2ogPkHgAPwKAAAgMCAiQbAPaikDADcDACAxICJBqA9qKQMANwMAIDIgIkGgD2opAwA3AwAgLyAiQZgPaikDADcDACAkICJBkA9qKQMANwMAICUgIkHAD2opAwA3AwAgKCAiQcgPaikDADcDACAnICJB0A9qKQMANwMAICYgIkHYD2opAwA3AwAgACAiQeAPaikDADcDACAiICIpA4gPNwPQHyAiICIpA7gPNwOAICA+IEBB4AD8CgAAICJByBxqID5B4AD8CgAAICJBsCZqICJB6A9qIkwQtAIgIkGQJ2ogIkHIEGoiThC0AiAiQfAnaiAiQagRaiJQELQCICJBkCRqIgAgPEGgAvwKAAAgIkHIDWoiJiAAQcAE/AoAACA8ICAgJhCeAiAmIDxBwAT8CgAAIDdB8KHFACkDADcDACBGQeihxQApAwA3AwAgR0HgocUAKQMANwMAIDNB2KHFACkDADcDACA1QdChxQApAwA3AwAgOUIANwMAIDRCADcDACA2QgA3AwAgK0IANwMAIClCADcDACAiQcihxQApAwA3A4gbICJCADcDuBsgLkEAQcAB/AsAIEAgPEHgAPwKAAAgIkHwIWpBAEGgAvwLAEFAIQADQCAiQYgbaiInICJB0B9qIiYQVyAmICdBwAT8CgAAIABBrJPFAGotAABBAUYEQCAnICYgIkHIDWoQngIgJiAnQcAE/AoAAAsgAEEBaiIADQALICJBiBtqIj4gIkHQH2oiQEHABPwKAAAgIkHYMWogIkGQG2oiNykDADcDACAiQeAxaiAiQZgbaiJGKQMANwMAICJB6DFqICJBoBtqIkcpAwA3AwAgIkHwMWogIkGoG2oiMykDADcDACAiQfgxaiAiQbAbaiI1KQMANwMAICJBiDJqICJBwBtqIjkpAwA3AwAgIkGQMmogIkHIG2oiNCkDADcDACAiQZgyaiAiQdAbaiI2KQMANwMAICJBoDJqICJB2BtqIispAwA3AwAgIkGoMmogIkHgG2oiKSkDADcDACAiICIpA4gbNwPQMSAiICIpA7gbNwOAMiBAICJB0DFqIjxB4AD8CgAAICJB8BZqIi4gIkGQHGopAwA3AwAgIkHoFmoiICAiQYgcaikDADcDACAiQeAWaiIwICJBgBxqKQMANwMAICJB2BZqIjEgIkH4G2opAwA3AwAgIkHQFmoiMiAiQfAbaikDADcDACAiQYAXaiIvICJBoBxqKQMANwMAICJBiBdqIiQgIkGoHGopAwA3AwAgIkGQF2oiJSAiQbAcaikDADcDACAiQZgXaiIoICJBuBxqKQMANwMAICJBoBdqIicgIkHAHGopAwA3AwAgIiAiKQPoGzcDyBYgIiAiKQOYHDcD+BYgPCAiQcgWaiIAQeAA/AoAACAiQbAgaiImIDxB4AD8CgAAIC4gIkHwHGopAwA3AwAgICAiQegcaikDADcDACAwICJB4BxqKQMANwMAIDEgIkHYHGopAwA3AwAgMiAiQdAcaikDADcDACAvICJBgB1qKQMANwMAICQgIkGIHWopAwA3AwAgJSAiQZAdaikDADcDACAoICJBmB1qKQMANwMAICcgIkGgHWopAwA3AwAgIiAiKQPIHDcDyBYgIiAiKQP4HDcD+BYgPCAAQeAA/AoAACAiQZAhaiA8QeAA/AoAACAiQfAqaiAiQagdahC0AiAiQdAraiAiQYgeahC0AiAiQbAsaiAiQegeahC0AiAiQdAoaiIAIEBBoAL8CgAAICJBiBJqIABBwAT8CgAAIwBBwAprIigkAAJ+ICJByA1qIiVBMGpBoIzFAEEwEPEDBEBC///Piuv//9UeICUpA1AiBn0iAyAlKQNYIglCq9X+////v/+5f1atIgR9IQJCpOzDtY/UtJjnACAlKQNIIgd9IgUgAyAEVCAGQv//z4rr///VHlZyrSIDfSEEQr+llJzP8NK75AAgJSkDQCIIfSIGIAMgBVYgB0Kk7MO1j9S0mOcAVnKtIgV9IQNC19mumuT26Y3LACAlKQM4Igt9IgcgBSAGViAIQr+llJzP8NK75ABWcq0iCH0hBUKr1f7///+//7l/IAl9IQZCms3/y6O9xIAaICUpAzAgByAIVCALQtfZrprk9umNywBWcq18fQwBCyAlKQNYIQYgJSkDUCECICUpA0ghBCAlKQNAIQMgJSkDOCEFICUpAzALIQggJUHgAGohACAoQShqICVBKGopAwA3AwAgKEEgaiAlQSBqKQMANwMAIChBGGogJUEYaikDADcDACAoQRBqICVBEGopAwA3AwAgKEEIaiAlQQhqKQMANwMAICggBjcDWCAoIAI3A1AgKCAENwNIICggAzcDQCAoIAU3AzggKCAINwMwICggJSkDADcDAAJ+ICVBkAFqQaCMxQBBMBDxAwRAQv//z4rr///VHiAlKQOwASIGfSIDICUpA7gBIglCq9X+////v/+5f1atIgR9IQJCpOzDtY/UtJjnACAlKQOoASIHfSIFIAMgBFQgBkL//8+K6///1R5Wcq0iA30hBEK/pZScz/DSu+QAICUpA6ABIgh9IgYgAyAFViAHQqTsw7WP1LSY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/AoAACAAQayTxQBqLQAAQQFGBEAgJyAmICJByA1qEJ4CICYgJ0HABPwKAAALIABBAWoiAA0ACyAiQcgWaiAiQdAfaiIuQcAE/AoAACAiQdgxaiAiQdAWaikDADcDACAiQeAxaiAiQdgWaikDADcDACAiQegxaiAiQeAWaikDADcDACAiQfAxaiAiQegWaikDADcDACAiQfgxaiAiQfAWaikDADcDACAiQYgyaiAiQYAXaikDADcDACAiQZAyaiAiQYgXaikDADcDACAiQZgyaiAiQZAXaikDADcDACAiQaAyaiAiQZgXaikDADcDACAiQagyaiAiQaAXaikDADcDACAiICIpA8gWNwPQMSAiICIpA/gWNwOAMiAuICJB0DFqIitB4AD8CgAAICJBsBtqIiAgIkHQF2opAwA3AwAgIkGoG2oiMCAiQcgXaikDADcDACAiQaAbaiIxICJBwBdqKQMANwMAICJBmBtqIjIgIkG4F2opAwA3AwAgIkGQG2oiLyAiQbAXaikDADcDACAiQcAbaiIkICJB4BdqKQMANwMAICJByBtqIiUgIkHoF2opAwA3AwAgIkHQG2oiKCAiQfAXaikDADcDACAiQdgbaiInICJB+BdqKQMANwMAICJB4BtqIiYgIkGAGGopAwA3AwAgIiAiKQOoFzcDiBsgIiAiKQPYFzcDuBsgKyAiQYgbaiIpQeAA/AoAACAiQbAgaiIAICtB4AD8CgAAICAgIkGwGGopAwA3AwAgMCAiQagYaikDADcDACAxICJBoBhqKQMANwMAIDIgIkGYGGopAwA3AwAgLyAiQZAYaikDADcDACAkICJBwBhqKQMANwMAICUgIkHIGGopAwA3AwAgKCAiQdAYaikDADcDACAnICJB2BhqKQMANwMAICYgIkHgGGopAwA3AwAgIiAiKQOIGDcDiBsgIiAiKQO4GDcDuBsgKyApQeAA/AoAACAiQZAhaiArQeAA/AoAACAiQagdaiAiQegYahC0AiAiQYgeaiAiQcgZahC0AiAiQegeaiAiQagaahC0AiApIC5BoAL8CgAAICJBiAlqIClBwAT8CgAAICBB8KHFACkDADcDACAwQeihxQApAwA3AwAgMUHgocUAKQMANwMAIDJB2KHFACkDADcDACAvQdChxQApAwA3AwAgJEIANwMAICVCADcDACAoQgA3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FyE2ICEtAJ8XISsgIS0AnhchKSAhLQCdFyEuICEtAJwXISAgIS0AmxchMCAhLQCaFyExICEtAJkXITIgIS0AmBchLyAhLQCXFyEkICEtAJYXISUgIS0AlRchKCAhLQCUFyEqICEtAJMXIScgIS0AkhchJiAhLQCRFyEAICEgIS0AkBdBAXY6APcbICEgADoA9hsgISAmOgD1GyAhICc6APQbICEgKjoA8xsgISAoOgDyGyAhICU6APEbICEgJDoA8BsgISAvOgDvGyAhIDI6AO4bICEgMToA7RsgISAwOgDsGyAhICA6AOsbICEgLjoA6hsgISApOgDpGyAhICs6AOgbICEgNjoA5xsgISA0OgDmGyAhIDk6AOUbICEgNToA5BsgISAzOgDjGyAhIEc6AOIbICEgRjoA4RsgISA3OgDgGyAhIC06AN8bICEgQDoA3hsgISA+OgDdGyAhIFA6ANwbICEgTjoA2xsgISBMOgDaGyAhIDw6ANkbICEgSDoA2BsgIUGgIGogIUHYG2pBIEEIEM8CAkACQAJ/AkACQCAhKAL4FCIARQ0AAkAgAEEBayIAQf7///8DcUUEQCAhKAL0FCEnIABB/////wNxIiZBAWoiAEEDcSErQgAhAiAmQQNPBEAgAEH8////B3EhAANAIAJCgAF8IQIgJ0EQaiEnIABBBGsiAA0ACwsgKwRAQgAhCANAICc1AgAgAoYgCHwhCCACQiB8IQIgJ0EEaiEnICtBAWsiKw0ACwsgCEKAgICAEFQNAQsgIUGoBWogIUGgIGogIUHwFGoQoQEgISgCvAUhACAhKAK4BSEqICEoArQFIScgISgCqAUiJkUNBSAhKAKsBSAmQQJ0EN8EDAULIAhQDQAgISgCqCAhKCAhKAKkICEnAkACQCAIQoCABFoEQCAoRQ0CIChB/////wNqISYgKEECdCEAIChB/////wNxQQFHDQFCACEEIAAgJ2oMBQsgKEUNASAIpyEqICdBBGshJiAoQQJ0ISdBACErA0AgK0EQdCAmICdqKAIAIgBBEHZyICpwQRB0IABB//8DcXIgKnAhKyAnQQRrIicNAAsMBQsgACAnakEIayEnICZB/////wNxQQFqQf7///8HcSErQgAhAgNAICc1AgAgJ0EEajUCACACQiCGhCAIgkIghoQgCIIhAiAnQQhrIScgK0EC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AwA3AwAgIUGwHGogIUHICmopAwA3AwAgISAhKQPwCTcD2BsgISAhKQOgCjcDiBwgIUHII2ogKEEoaikDADcDACAhQcAjaiAoQSBqKQMANwMAICFBuCNqIChBGGopAwA3AwAgIUGwI2ogKEEQaikDADcDACAhQagjaiAoQQhqKQMANwMAICFB+CNqICFBqAtqKQMANwMAICFB8CNqICFBoAtqKQMANwMAICFB6CNqICFBmAtqKQMANwMAICFB4CNqICFBkAtqKQMANwMAICFB2CNqICFBiAtqKQMANwMAICEgKCkDADcDoCMgISAhKQOACzcD0CMgIUHYKWogIUHYG2pB4AD8CgAAICFBuCpqICFBoCNqQeAA/AoAAAwDCyAhQdgbakEAQeAA/AsAICFByCNqQgA3AwAgIUHAI2pCADcDACAhQbgjakIANwMAICFBsCNqQgA3AwAgIUGoI2pCADcDACAhQdgjaiAhQZAcaikDADcDACAhQeAjaiAhQZgcaikDADcDACAhQegjaiAhQaAcaikDADcDACAhQfAjaiAhQagcaikDADcDACAhQfgjaiAhQbAcaikDADcDACAhQgA3A6AjICEgISkDiBw3A9AjICFBuCpqQQBB4AD8CwAgIUHYKWogIUGgI2pB4AD8CgAADAILICFBkBdqICFBqCNqQaAC/AoAACAhQaAjaiElIwBBIGsiJCQAAkACQCAhQcgpaiIAKAIIRQRAQdHOxQAtAAAaQQFBARDWBCIADQEMEwsgJEEIaiAAQRAQQAJAICQoAhAiKEUNACAkKAIMIiYhACAoQQNxIikEQANAIAAgAC0AACInQTByICdB1wBqICdBCkkbOgAAIABBAWohACApQQFrIikNAAsLIChBBEkNACAmIChqIScDQCAAIAAtAAAiJkEwciAmQdcAaiAmQQpJGzoAACAAQQFqIiYgJi0AACImQTByICZB1wBqICZBCkkbOgAAIABBAmoiJiAmLQAAIiZBMHIgJkHXAGogJkEKSRs6AAAgAEEDaiImICYtAAAiJkEwciAmQdcAaiAmQQpJGzoAACAAQQRqIgAgJ0cNAAsLICUgJCkCCDcCACAlQQhqICRBEGooAgA2AgAMAQsgJUEBNgIIICUgADYCBCAlQQE2AgAgAEEwOgAACyAkQSBqJAAgISgCpCMhMgJAICEoAqgj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hcEAQdSGwQAQygMACyAhQagFakEAQeAA/AsAICFByCNqQgA3AwAgIUHAI2pCADcDACAhQbgjakIANwMAICFBsCNqQgA3AwAgIUGoI2pCADcDACAhQdgjaiAhQeAFaikDADcDACAhQeAjaiAhQegFaikDADcDACAhQegjaiAhQfAFaikDADcDACAhQfAjaiAhQfgFaikDADcDACAhQfgjaiAhQYAGaikDADcDACAhQgA3A6AjICEgISkD2AU3A9AjICFBuCpqQQBB4AD8CwAgIUHYKWogIUGgI2pB4AD8CgAADAELICFB2ClqICFBqCNqQcAB/AoAAAsgISgCyCkiAARAICEoAswpIABBAnQQ3wQLICpFDQIgOSAqQQJ0EN8EDAILIAAgKkH4gcAAEMgEAAsgKkUNACA5ICpBAnQQ3wQLICFB0A5qITIgIUHoAGohJSMAQaAhayIgJAACQCAhQcAOaiInKAIIIiZFBEAgIEGADmpB4LTCACkDADcDACAgQfgNakHYtMIAKQMANwMAICBB8A1qQdC0wgApAwA3AwAgIEHoDWpByLTCACkDADcDACAgQeANakHAtMIAKQMANwMAICBBkA5qQgA3AwAgIEGYDmpCADcDACAgQaAOakIANwMAICBBqA5qQgA3AwAgIEGwDmpCADcDACAgQgA3A4gOICBBuLTCACkDADcD2A0gMkHgAGpBAEHAAfwLACAyICBB2A1qQeAA/AoAACAyQaACakEAQaAC/AsADAELICcoAgQhACAgQeANakGQksIAKAIANgIAICBBiJLCACkCADcD2A0gIEHYDWpBjJPCABClAyAgKALcDUEBNgIAICAoAtwNISogICgC2A0hKAJAICZBAUcNACAAKAAAICooAABHDQAgKARAICogKEECdBDfBAsgICAlNgLAICAgICVBoAJqIiY2AsQgICBBmAlqIiQiACAgQcAgaiIoEJADICBByARqIjEgAEHgAPwKAAAgIEEIaiIvIDFB4AD8CgAAICBB2A1qIiogL0HgAPwKAAAgIEGgHmoiJyAqQeAA/AoAACAkICgQkAMgMSAkQeAA/AoAACAvIDFB4AD8CgAAICogL0HgAPwKAAAgIEGAH2ogKkHgAPwKAAAgJCAoEJADIDEgJEHgAPwKAAAgLyAxQeAA/AoAACAqIC9B4AD8CgAAICBB4B9qICpB4AD8CgAAICBB2BZqIgAgJ0GgAvwKAAAgICAlQcAEajYCxB0gICAmNgLAHSAxICBBwB1qIiYQkAMgLyAxQeAA/AoAACAoIC9B4AD8CgAAICQgKEHgAPwKAAAgKiAkQeAA/AoAACAxICYQkAMgLyAxQeAA/AoAACAoIC9B4AD8CgAAICQgKEHgAPwKAAAgIEG4DmogJEHgAPwKAAAgMSAmEJADIC8gMUHgAPwKAAAgKCAvQeAA/AoAACAkIChB4AD8CgAAICBBmA9qICRB4AD8CgAAICcgKkGgAvwKAAAgIEH4GGogJ0GgAvwKAAAgMiAAQcAE/AoAAAwBCyAoBEAgKiAoQQJ0EN8ECyAgQYAOakHgtMIAKQMANwMAICBB+A1qQdi0wgApAwA3AwAgIEHwDWpB0LTCACkDADcDACAgQegNakHItMIAKQMANwMAICBB4A1qQcC0wgApAwA3AwAgIEGQDmpCADcDACAgQZgOakIANwMAICBBoA5qQgA3AwAgIEGoDmpCADcDACAgQbAOakIANwMAICBBuLTCACkDADcD2A0gIEIANwOIDiAgQegAakEAQcAB/AsAICBBCGogIEHYDWoiJEHgAPwKAAAgIEGoAmpBAEGgAvwLACAgICU2AsAdICAgJUGgAmoiJjYCxB0gIEGYCWoiMSAgQcAdaiIoEJADICBByARqIjAgMUHgAPwKAAAgIEHAIGoiLyAwQeAA/AoAACAkIC9B4AD8CgAAICBBmBtqIiogJEHgAPwKAAAgMSAoEJADIDAgMUHgAPwKAAAgLyAwQeAA/AoAACAkIC9B4AD8CgAAICBB+BtqICRB4AD8CgAAIDEgKBCQAyAwIDFB4AD8CgAAIC8gMEHgAPwKAAAgJCAvQeAA/AoAACAgQdgcaiAkQeAA/AoAACAgQZgSaiIAICpBoAL8CgAAICAgJUHABGo2ArwdICAgJjYCuB0gMCAgQbgdaiImEJADIC8gMEHgAPwKAAAgKCAvQeAA/AoAACAxIChB4AD8CgAAICQgMUHgAPwKAAAgMCAmEJADIC8gMEHgAPwKAAAgKCAvQeAA/AoAACAxIChB4AD8CgAAICBBuA5qIDFB4AD8CgAAIDAgJhCQAyAvIDBB4AD8CgAAICggL0HgAPwKAAAgMSAoQeAA/AoAACAgQZgPaiAxQeAA/AoAACAqICRBoAL8CgAAICBBuBRqICpBoAL8CgAAIDAgAEHABPwKAAAgIEGMCWogJ0EIELACICAoApAJISYCQCAgKAKUCSIrQQJJDQAgJiAraiEvQQAhACArQQF2IidBAUcEQCArQQFrISogJ0H+////B3EhJQNAICYgKmoiKC0AACEnICggACAmaiIkLQAAOgAAICQgJzoAACAvIABBfnNqIictAAAhKCAnICRBAWoiJy0AADoAACAnICg6AAAgKkECayEqICUgAEECaiIARw0ACwsgK0ECcUUNACAAICZqIiotAAAhJyAqIC8gAEF/c2oiAC0AADoAACAAICc6AAALICAoAowJIScgKwRAICYhAANAIAAsAAAhJCAgQdgNaiIlICBBCGoiKBCNAiAgQZgJaiIqICVBwAT8CgAAICggKkHABPwKAAAgJEEASARAICUgKCAgQcgEahCbAiAqICVBwAT8CgAAICggKkHABPwKAAALICBB2A1qIiUgIEEIaiIoEI0CICBBmAlqIiogJUHABPwKAAAgKCAqQcAE/AoAACAkQcAAcQRAICUgKCAgQcgEahCbAiAqICVBwAT8CgAAICggKkHABPwKAAALICBB2A1qIiUgIEEIaiIoEI0CICBBmAlqIiogJUHABPwKAAAgKCAqQcAE/AoAACAkQSBxBEAgJSAoICBByARqEJsCICogJUHABPwKAAAgKCAqQcAE/AoAAAsgIEHYDWoiJSAgQQhqIigQjQIgIEGYCWoiKiAlQcAE/AoAACAoICpBwAT8CgAAICRBEHEEQCAlICggIEHIBGoQmwIgKiAlQcAE/AoAACAoICpBwAT8CgAACyAgQdgNaiIlICBBCGoiKBCNAiAgQZgJaiIqICVBwAT8CgAAICggKkHABPwKAAAgJEEIcQRAICUgKCAgQcgEahCbAiAqICVBwAT8CgAAICggKkHABPwKAAALICBB2A1qIiUgIEEIaiIoEI0CICBBmAlqIiogJUHABPwKAAAgKCAqQcAE/AoAACAkQQRxBEAgJSAoICBByARqEJsCICogJUHABPwKAAAgKCAqQcAE/AoAAAsgIEHYDWoiJSAgQQhqIigQjQIgIEGYCWoiKiAlQcAE/AoAACAoICpBwAT8CgAAICRBAnEEQCAlICggIEHIBGoQmwIgKiAlQcAE/AoAACAoICpBwAT8CgAACyAgQdgNaiIlICBBCGoiKBCNAiAgQZgJaiIqICVBwAT8CgAAICggKkHABPwKAAAgJEEBcQRAICUgKCAgQcgEahCbAiAqICVBwAT8CgAAICggKkHABPwKAAALIABBAWohACArQQFrIisNAAsLICcEQCAmICcQ3wQLIDIgIEEIakHABPwKAAALICBBoCFqJABBACEnICFBADYCsAUgIUKAgICAEDcCqAUgIUHYG2oiJiAyELUDICEoAtwcIQAgISAhKALYGzYC3BwgISAANgLYGyAhKQLcGyECICEgISkC4Bw3AtwbICEgAjcC4BwgISkC5BshAiAhICEpAtAcNwLkGyAhIAI3AtAcICEoAtgcIQAgISAhKALsGzYC2BwgISAANgLsGyAhKALEHCEAICEgISgC8Bs2AsQcICEgADYC8BsgISgCyBwhACAhICEoAvQbNgLIHCAhIAA2AvQbICEoAswcIQAgISAhKAL4GzYCzBwgISAANgL4GyAhKAK4HCEAICEgISgC/Bs2ArgcICEgADYC/BsgISgCvBwhACAhICEoAoAcNgK8HCAhIAA2AoAcICEoAsAcIQAgISAhKAKEHDYCwBwgISAANgKEHCAhKAKsHCEAICEgISgCiBw2AqwcICEgADYCiBwgISgCsBwhACAhICEoAowcNgKwHCAhIAA2AowcICEoArQcIQAgISAhKAKQHDYCtBwgISAANgKQHCAhKAKgHCEAICEgISgClBw2AqAcICEgADYClBwgISgCpBwhACAhICEoApgcNgKkHCAhIAA2ApgcICEoAqgcIQAgISAhKAKcHDYCqBwgISAANgKcHCAhQaAjaiAmQZAB/AoAACAhQoCAgIDAATcCsCQgIUGwI2ohOUELISkgIUGYE2ohLiAhQagTaiEgICFBsBNqITAgIUG4E2ohMQNAAkAgJ0EBaiEAAkAgIUGgI2ogJ0EMbGoiJygCACImQYCAgIB4RwRAIC5CADcDACAhQaATaiIkQgA3AwAgIEIANwMAIDBCADcDACAxQgA3AwAgIUIANwOQEyAhICcpAgQiAjcC9AkgISAmNgLwCSACQv////8PWARAQdHOxQAtAAAaQQFBARDWBCI9RQ0SID1BADoAAEEBISogIUEBNgKQFwwCCyAhQZAXaiAhQfAJakEIELACICEoApQXIT0gISgCmBciKkECSQ0BICogPWohMkEAIScgKkEBdiImQQFHBEAgKkEBayErICZB/v///wdxISUDQCArID1qIigtAAAhJiAoICcgPWoiLy0AADoAACAvICY6AAAgMiAnQX5zaiImLQAAISggJiAvQQFqIiYtAAA6AAAgJiAoOgAAICtBAmshKyAlICdBAmoiJ0cNAAsLICpBAnEEQCAnID1qIiYtAAAhKCAmIDIgJ0F/c2oiJi0AADoAACAmICg6AAALICpBMUkNAUH0isEAQRtBkIvBABD+AwALICEgADYCsCQgAEEMRg0BA0AgOUEEaygCACIABEAgOSgCACAAQQJ0EN8ECyA5QQxqITkgKUEBayIpDQALDAELICoEQCAhICprQcATaiA9ICr8CgAACyAhKAKoBSAhKAKwBSIra0EvTQRAICFBqAVqICtBMEEBQQEQiAMgISgCsAUhKwsgISgCrAUgK2oiJiAhKQOQEzcAACAmQQhqIC4pAwA3AAAgJkEQaiAkKQMANwAAICZBGGogICkDADcAACAmQSBqIDApAwA3AAAgJkEoaiAxKQMANwAAICEgK0EwajYCsAUgISgCkBciJgRAID0gJhDfBAsgISgC8AkiJgRAICEoAvQJICZBAnQQ3wQLIDlBDGohOSApQQFrISkgACInQQxHDQELCyAhKAKoBSElICEoAqwFISggISgCsAUhJCAhQQA2AuAbICFCgICAgBA3AtgbICFB2BtqIipBAEEGQQFBARCIAyAhKALcGyIAICEoAuAbIidqIiZB3InBACgAADYAACAmQQRqQeCJwQAvAAA7AAAgISAnQQZqIis2AuAbICEoAtgbICtrICRJBEAgKiArICRBAUEBEIgDICEoAuAbISsgISgC3BshAAsgJARAIAAgK2ogKCAk/AoAAAsgJQRAICggJRDfBAsgIUGgI2ogACAkICtqEN0BQdHOxQAtAAAaQRBBARDWBCImRQ0BICYgISkAoCM3AAAgJkEIaiAhQagjaikAADcAACAhICEvAKAjOwHEEyAhICFBoiNqLQAAOgDGEyAmKAADIS8gJigAByEkICYoAAshJSAmLQAPISggJkEQEN8EICEoAtgbIiYEQCAAICYQ3wQLQRAgISgC3BMiJiAhKALYEyIxayIwIDBBEE8bIQBBASEqICYgMUcEQEHRzsUALQAAGiAAQQEQ1gQiKkUNAwsgIUG6I2ogIS0AxhM6AAAgIUGoI2ogIUHQE2opAwA3AwAgISAhKQPIEzcDoCMgISAhLwHEEzsBuCNBACEnICFBADYC2CMgIUIANwPQIyAhICg6AMcjICEgJTYAwyMgISAkNgC/IyAhIC82ALsjICFCgICAgIACNwPIIyAhIDE2ArAjICEgJjYCtCMgJiAxRg0FICFBoCNqIDFqIS8gMEEBRwRAIABBHnEhJANAICcgKmoiJSAhQaAjaiAnaiIoQRhqLQAAICcgL2oiJi0AAHM6AAAgJUEBaiAoQRlqLQAAICZBAWotAABzOgAAICQgJ0ECaiInRw0ACwsgAEEBcQRAICcgKmogIUG4I2ogJ2otAAAgJyAvai0AAHM6AAALIAAhJyAwQQ9NDQUgIUHCE2ogKkECai0AADoAACAhICovAAA7AcATICooAAMhMiAqKAAHIS8gKigACyEkICotAA8hJSAqQRAQ3wQgIUEANgLgGyAhQoCAgIAQNwLYGyAhQdgbaiIoQQBBBkEBQQEQiAMgISgC3BsiKiAhKALgGyImaiIAQcyKwQAoAAA2AAAgAEEEakHQisEALwAAOwAAICEgJkEGaiInNgLgGyAhKALYGyAnayAwSQRAICggJyAwQQFBARCIAyAhKALcGyEqICEoAuAbIScLIDAEQCAnICpqICFByBNqIDFqIDD8CgAACyAhQaAjaiAqICcgMGoQ3QFB0c7FAC0AABpBEEEBENYEIgBFDQMgACAhKQCgIyICNwAAIABBCGogIUGoI2opAAA3AAAgAC0AASEoIAAtAAIhJiAAKAADISAgACgAByEwIAAoAAshMSAALQAPIScgAEEQEN8EICEoAtgbIgAEQCAqIAAQ3wQLQdHOxQAtAAAaQRBBARDWBCIqRQ0EICogKCBdczoAASAqIAKnIEJzOgAAICogMCBWczoAByAqICAgXHM6AAMgKiBNIDBBGHZzOgAKICogTyAwQRB2czoACSAqIFMgMEEIdnM6AAggKiBXICBBGHZzOgAGICogWiAgQRB2czoABSAqIFsgIEEIdnM6AAQgKiAxIEtzOgALICogPyAxQRh2czoADiAqIEkgMUEQdnM6AA0gKiBKIDFBCHZzOgAMICpBAmogJiBocyIAOgAAIEVB2gFqIAA6AAAgRSAqLwAAOwDYASAqKQADIQIgKigACyEmICpBEBDfBCAhQaAjaiIAICFB2ClqQcAB/AoAACAhQeIkaiAhQcITai0AADoAACAhICEvAcATOwHgJCBFQQhqIABBwwH8CgAAIEUgIiAnczoA5wEgRSAmNgDjASBFIAI3ANsBIEUgJToA1wEgRSAkNgDTASBFIC82AM8BIEUgMjYAywEgRUEANgIAICEoAsAOIgBFDQAgISgCxA4gAEECdBDfBAsgIUGwLGokAAwFC0EBQRBBrIPBABDIBAALQQEgAEG8isEAEMgEAAtBAUEQQayDwQAQyAQAC0EBQRBBvIrBABDIBAALICEgJzYCqCMgISAqNgKkIyAhIAA2AqAjQdT+wABBKyAhQaAjakHUisEAQeSKwQAQygMACyAsKAKoAgRAICxB8AdqICxBtAJqKAIAIgA2AgAgLCAsKQKsAiICNwPoByBBQQxqIAA2AgAgQSACNwIEIEFBATYCACBnRQ0BIGkgZxDfBAwBCyAsQewHaiIAICxBsAJqQeAB/AoAACAsQYgGaiIgIABB4AH8CgAAICxBzAlqITIjAEHQBGsiKSQAIClBuAJqICBBCGopAwA3AwAgKUHAAmogIEEQaikDADcDACApQcgCaiAgQRhqKQMANwMAIClB0AJqICBBIGopAwA3AwAgKUHYAmogIEEoaikDADcDACApQegCaiAgQThqKQMANwMAIClB8AJqICBBQGspAwA3AwAgKUH4AmogIEHIAGopAwA3AwAgKUGAA2ogIEHQAGopAwA3AwAgKUGIA2ogIEHYAGopAwA3AwAgKSAgKQMANwOwAiApICApAzA3A+ACIClB6ABqIiogKUGwAmoQ9wMgKSgCbCEuICkoAmghJwJAICkoAnAiMEECRgRAAkAgLigCBCEmIC4oAgAhACAqIC5BCGpB2AD8CgAAICcEQCAuICdBMGwQ3wQLIClBGGogKUHwAGopAwA3AwAgKUEgaiApQfgAaikDADcDACApQShqIClBgAFqKQMANwMAIClBMGogKUGIAWopAwA3AwAgKUFAayApQZgBaikDADcDACApQcgAaiApQaABaikDADcDACApQdAAaiApQagBaikDADcDACApQdgAaiApQbABaikDADcDACApQeAAaiApQbgBaikDADcDACApICY2AgwgKSAANgIIICkgKSkDaDcDECApICkpA5ABNwM4IClBmANqICBB4ABqIgBBCGopAwA3AwAgKUGgA2ogAEEQaikDADcDACApQagDaiAAQRhqKQMANwMAIClBsANqIABBIGopAwA3AwAgKUG4A2ogAEEoaikDADcDACApQcgDaiAgQZgBaikDADcDACApQdADaiAgQaABaikDADcDACApQdgDaiAgQagBaikDADcDACApQeADaiAgQbABaikDADcDACApQegDaiAgQbgBaikDADcDACApIAApAwA3A5ADICkgICkDkAE3A8ADIClB6ABqIClBkANqEPcDICkoAmwhLiApKAJoIScgKSgCcCIwQQJHDQAgLigCBCEmIC4oAgAhACApQfADaiAuQQhqQdgA/AoAACAnBEAgLiAnQTBsEN8ECyApQfgAaiApQfgDaikDADcDACApQYABaiApQYAEaikDADcDACApQYgBaiApQYgEaikDADcDACApQZABaiApQZAEaikDADcDACApQaABaiApQaAEaikDADcDACApQagBaiApQagEaikDADcDACApQbABaiApQbAEaikDADcDACApQbgBaiApQbgEaikDADcDACApQcABaiApQcAEaikDADcDACApICY2AmwgKSAANgJoICkgKSkD8AM3A3AgKSApKQOYBDcDmAEgKUEANgLUASApQoCAgIDAADcCzAEgKUHwA2oiMSApQQhqEN8BIClB+AFqIi8gMRDUASApQcwBaiIkQQBBBEEEQQwQiAMgKSgCzAEhMCApKALQASIuICkoAtQBIidBDGxqIgAgKSkC+AE3AgAgAEEIaiApQYACaiIlKQIANwIAIABBEGogKUGIAmoiKCkCADcCACAAQRhqIClBkAJqIiopAgA3AgAgAEEgaiApQZgCaiImKQIANwIAIABBKGogKUGgAmoiACkCADcCACApICdBBGoiJzYC1AEgMSApQThqEN8BIC8gMRDUASAwICdrQQNNBEAgJCAnQQRBBEEMEIgDICkoAswBITAgKSgC0AEhLiApKALUASEnCyAuICdBDGxqIiQgKSkC+AE3AgAgJEEoaiAAKQIANwIAICRBIGogJikCADcCACAkQRhqICopAgA3AgAgJEEQaiAoKQIANwIAICRBCGogJSkCADcCACApICdBBGoiJzYC1AEgKUHwA2oiACApQegAahDfASApQfgBaiAAENQBIDAgJ2tBA00EQCApQcwBaiAnQQRBBEEMEIgDICkoAswBITAgKSgC0AEhLiApKALUASEnCyAuICdBDGxqIgAgKSkC+AE3AgAgAEEoaiApQaACaiIlKQIANwIAIABBIGogKUGYAmoiKCkCADcCACAAQRhqIClBkAJqIiopAgA3AgAgAEEQaiApQYgCaiImKQIANwIAIABBCGogKUGAAmoiJCkCADcCACApICdBBGoiJzYC1AEgKUHwA2oiACApQZgBahDfASApQfgBaiAAENQBIDAgJ2tBA00EQCApQcwBaiAnQQRBBEEMEIgDICkoAtABIS4gKSgC1AEhJwsgLiAnQQxsaiIAICkpAvgBNwIAIABBKGogJSkCADcCACAAQSBqICgpAgA3AgAgAEEYaiAqKQIANwIAIABBEGogJikCADcCACAAQQhqICQpAgA3AgAgKSAnQQRqIic2AtQBIClB+ANqICBBwAFqIgBBCGopAgA3AwAgKUKAgICAgAI3A4AEICkgACkCADcD8ANBACEuQaz8wAAoAgAhKkGk/MAAKQIAIQIDQCApQfADaiAuai0AACEAICQgKjYCACApIAI3A/gBIAAEQCApQfgBakGY/cAAEKUDICkoAvwBIAA2AgAgKUEBNgKAAiApKALUASEnCyApQeABaiImICQoAgA2AgAgKSApKQP4ATcD2AEgKSgCzAEgJ0YEQCApQcwBakHAicEAEJ8DCyApKALQASAnQQxsaiIAICkpA9gBNwIAIABBCGogJigCADYCACApICdBAWoiJzYC1AEgLkEBaiIuQRBHDQALIClB+ANqICBB2AFqKQIANwMAIClCgICAgIACNwOABCApICApAtABNwPwA0EAIS5BrPzAACgCACEqQaT8wAApAgAhAgNAIClB8ANqIC5qLQAAISYgKUGAAmoiACAqNgIAICkgAjcD+AEgJgRAIClB+AFqQZj9wAAQpQMgKSgC/AEgJjYCACApQQE2AoACICkoAtQBIScLIClB8AFqIiYgACgCADYCACApICkpA/gBNwPoASApKALMASAnRgRAIClBzAFqQbCJwQAQnwMLICkoAtABICdBDGxqIgAgKSkD6AE3AgAgAEEIaiAmKAIANgIAICkgJ0EBaiInNgLUASAuQQFqIi5BEEcNAAsgMiApKQLMATcCACAyQQhqIClB1AFqKAIA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IhJ8IhEgCyAPVq0gAikD2BsiFiALIA1UrXx8fCILIAIpA7gbIAwgD1StfHwiF3wiDyACKQOoGyAMIAIpA6AbIg18IA1UrXx8IgwgAikD8Bp8Ig1Cm5Svw/K1qN6Gf34iFEIAQm1CABDJAyACQdAaaiAUQgBCf0IAEMkDIAJBwBpqIBRCAEL///////////8AQgAQyQMCQAJAIAIpA8gaIAIpA4gbIAIpA8gbIAIpA8AbIhkgAikDiBwgECATVq18fCIUIBlUrXwgFCAUIBIgFVStfCIQVq18IBAgCyARVK0gFiARIBJUrXx8fCISIBBUrXwiFCACKQOAG3wiESAUVK18IBEgESASIAsgF1atfCILIBJUrXwiElatfCASIBIgAikDmBsiFCALIAsgDnwiEVatfCARIBEgDCAPVK0gFCAOIA9WrXx8fCILVq18fCIPVq18IhIgAikDwBp8Ig4gElStfCAOIA8gDyALIAsgAikD+BogDCANVq18fCISVq18IgtWrXwiDyAOVK18IA8gAikD2BoiESALIAsgAikD0BoiDHwiDlatfCAOIA4gESAMIBJ8IgsgDFStfCALIAIpA+gaIAIpA+AaIgwgDXwgDFStfHwiESALVK18fCILVq18fCIMIA9UrXwiEkIAWQRAIBJC////////////AFIgEUJtVHIgCyAMg0J/UnINAQsgC0IBfCIPIBFCbVStIg59IRYgDEIBfCINIAtCf1IgDiAPVnKtIgt9IQ8gEiAMQn9SIAsgDVZyrX1C////////////AH0hEiARQhN8IREMAQsgDCEPIAshFgsgAkGwGmogBSkDGCIUQgBCyANCABDJAyACQaAaaiACKQOwGiIOQpuUr8Pytajehn9+IgtCAEJtQgAQyQMgAkGQGmogC0IAQn9CABDJAyACQYAaaiALQgBC////////////AEIAEMkDIAJB8BlqIAUpAxAiGUIAQsgDQgAQyQMgAkHgGWogAikDkBoiCyACKQO4GnwiDCACKQOoGiACKQOgGiINIA5CeIN8IA1UrXx8Ig4gAikD8Bl8Ig1Cm5Svw/K1qN6Gf34iEEIAQm1CABDJAyACQdAZaiAQQgBCf0IAEMkDIAJBwBlqIBBCAEL///////////8AQgAQyQMgAkGwGWogBSkDCCIYQgBCyANCABDJAyACQaAZaiACKQPQGSIQIAIpA/gZIA0gDlStfCIVIAsgDCAOVq0gAikDmBoiEyALIAxWrXx8Ihd8Ihp8Ihx8IgsgAikD6BkgAikD4BkiDCANfCAMVK18fCIMIAIpA7AZfCIOQpuUr8Pytajehn9+Ig1CAEJtQgAQyQMgAkGQGWogDUIAQn9CABDJAyACQYAZaiANQgBC////////////AEIAEMkDIAJB8BhqIAUpAwAiG0IAQsgDQgAQyQMgAkHgGGogAikDkBkiDSAQIBUgHFatIhwgEyAXIBpWrXwiGiACKQOAGnwiHXwiFXwiEyALIAxWrSACKQPYGSIhIAsgEFStfHx8IgsgAikDuBkgDCAOVq18fCIffCIMIAIpA6gZIA4gAikDoBkiEHwgEFStfHwiDiACKQPwGHwiEEKblK/D8rWo3oZ/fiIXQgBCbUIAEMkDIAJB0BhqIBdCAEJ/QgAQyQMgAkHAGGogF0IAQv///////////wBCABDJAwJAAkAgAikDyBggAikDiBkgAikDyBkgAikDwBkiHiACKQOIGiAaIB1WrXx8IhcgHlStfCAXIBcgFSAcVK18IhpWrXwgGiALIBNUrSAhIBMgFVStfHx8IhUgGlStfCIXIAIpA4AZfCITIBdUrXwgEyATIBUgCyAfVq18IgsgFVStfCIVVq18IBUgFSACKQOYGSIXIAsgCyANfCITVq18IBMgEyAMIA5WrSAXIAwgDVStfHx8IgtWrXx8IgxWrXwiFSACKQPAGHwiDSAVVK18IA0gDCAMIAsgCyACKQP4GCAOIBBWrXx8IhVWrXwiC1atfCIMIA1UrXwgDCACKQPYGCITIAsgCyACKQPQGCIOfCINVq18IA0gEyAOIBV8IgsgDlStfCALIAIpA+gYIAIpA+AYIg4gEHwgDlStfHwiECALVK18fCILIA1UrXx8Ig4gDFStfCIMQgBZBEAgDEL///////////8AUiAQQm1UciALIA6DQn9Scg0BCyALQgF8Ig0gEEJtVK0iFX0hFyAOQgF8IhMgC0J/UiANIBVUcq0iC30hDSAMIA5Cf1IgCyATVnKtfUL///////////8AfSEMIBBCE3whEAwBCyAOIQ0gCyEXCyAMIRUgEiETAn4CQAJAIAwgElINACANIRUgDyETIA0gD1INACAWIhMgFyIVUg0AIBAhFSARIRMgECARUQ0BCyATIBVaDQAgFyAWfSILIBAgEVStIg5UIBYgF1ZyrSITIA0gD30iF0J/hXwiFSAOIAtCf4V8IgsgECARfSIOQm1WrSIRVK0iEH0hFiAQIBVWIQYgCyARfSEVQm0gDn0hESANIA9UIBMgF1ZyrSASIAx9fEL///////////8AfAwBCyAWIBd9IgsgECARVq0iDn0hFSAPIA19IhMgFiAXVCALIA5Ucq0iC30hFiALIBNWIA0gD1ZyIQYgESAQfSERIBIgDH0LIAIpA/gcIR0gAikD8BwhISACKQPoHCEfIAIpA+AcIichEiAGrX0iCyEMAn4CQAJAIAsgJ1INACAWIgwgHyISUg0AIBUiDCAhIhJSDQAgESIMIB0iElENAQsgDCASWg0AICEgFX0iDyARIB1WrSIMVCAVICFWcq0iDiAfIBZ9Ig1Cf4V8IhIgDCAPQn+FfCIPIB0gEX0iDEJtVq0iEVStIhB9ISIgECASViEFIA8gEX0hJSANIA5UIBYgH1ZyrSALICd9fEL///////////8AfCEVQm0gDH0MAQsgFSAhfSIPIBEgHVStIgx9ISUgFiAffSIOIBUgIVQgDCAPVnKtIg99ISIgFiAfVCAOIA9UciEFIAsgJ30hFSARIB19CyEjIAJB8B1qQgA3AwAgAkHoHWpCADcDACACQgA3A+AdIAJCyAM3A/gdIAJBsBhqQqV8QsgDIAJB4B1qQejRwQBBIBDxAyIGGyILQgAgFEIAEMkDIAJBgBdqQn9CACAGGyIPQgAgFEIAEMkDIAJB8BdqQv///////////wBCACAGGyIMQgAgFEIAEMkDIAJB8BZqIAIpA7AYIhJCm5Svw/K1qN6Gf34iDkIAQm1CABDJAyACQeAWaiAOQgBCf0IAEMkDIAJB0BZqIA5CAEL///////////8AQgAQyQMgAkGgGGogC0IAIBlCABDJAyACQZAXaiAPQgAgGUIAEMkDIAJB4BdqIAxCACAZQgAQyQMgAkHAFmogAikD4BYiDiACKQO4GCIQIAIpA4AXIhN8IhZ8Ig0gAikD+BYgEiACKQPwFiIRfCARVK18fCISIAIpA6AYfCIRQpuUr8Pytajehn9+IhRCAEJtQgAQyQMgAkGwFmogFEIAQn9CABDJAyACQaAWaiAUQgBC////////////AEIAEMkDIAJBkBhqIAtCACAYQgAQyQMgAkGgF2ogD0IAIBhCABDJAyACQdAXaiAMQgAgGEIAEMkDIAJBkBZqIAIpA6gYIBEgElStfCIXIAIpA5AXIhl8IhQgDiATIAIpA4gXIhggECAWVq18Ihp8IhB8IhMgDSASVq0gAikD6BYiHCANIA5UrXx8fCIefCIOIAIpA7AWIip8Ig0gAikDyBYgAikDwBYiEiARfCASVK18fCISIAIpA5AYfCIRQpuUr8Pytajehn9+IhZCAEJtQgAQyQMgAkGAFmogFkIAQn9CABDJAyACQfAVaiAWQgBC////////////AEIAEMkDIAJBgBhqIAtCACAbQgAQyQMgAkGwF2ogD0IAIBtCABDJAyACQcAXaiAMQgAgG0IAEMkDIAJB4BVqIAIpA5gYIBEgElStfCIbIAIpA6AXIil8IgsgKiAZIBggECAaVK18IhggAikD8Bd8Ig8gAikD0BZ8IgwgEyAeVq0gHCAQIBNWrXx8fCIQfCITIA4gFFStIAIpA5gXIhkgFCAXVK18fHwiFHwiFiANIBJWrSACKQO4FiIaIA0gDlStfHx8Ihx8Ig4gAikDgBYiHnwiDSACKQOYFiACKQOQFiISIBF8IBJUrXx8IhIgAikDgBh8IhFCm5Svw/K1qN6Gf34iF0IAQm1CABDJAyACQdAVaiAXQgBCf0IAEMkDIAJBwBVqIBdCAEL///////////8AQgAQyQMCQAJAIAIpA8gXIAIpA9gXIAIpA6gWIAIpA/gXIA8gGFStfCIYIAIpA+AXfCIXIAwgEFatIAIpA9gWIAwgD1StfHx8Ig8gEyAUVq0gGSAQIBNWrXx8fCIMIAIpA6AWfCIQIAxUrXwgECAWIBxWrSAaIBQgFlatfHx8IhQgEFStfCITIAwgD1StIA8gF1StIAIpA+gXIBcgGFStfHx8fCIPIAIpA9AXfCIMIA9UrXwgDCAMIAIpA6gXIhYgFCAUICl8IhBWrXwgECALIA5WrSAWIAsgG1StfHx8IgsgEFStfHwiFFatfCIQIA8gE1StfCIPIAIpA/gVIBQgFCACKQPwFXwiDFatfCAMIAwgAikDiBYiEyALIAsgHnwiFFatfCAUIBQgDSASVq0gEyANIA5UrXx8fCITVq18fCILVq18fCIMIAIpA8AXfCIOIAxUrXwgDiAOIAIpA7gXIhQgCyALIAIpA7AXIhZ8Ig1WrXwgDSANIBQgFiACKQOIGCARIBJUrXwiEnwiCyASVK18IAsgCyATfCISVq18fCILVq18fCINVq18IhQgDyAQVK0gDCAPVK18fCIMIAIpA8gVIA0gAikDwBV8Ig4gDVStfCAOIA4gAikD2BUiDSALIAsgAikD0BUiEHwiD1atfCAPIA0gECASfCILIBJUrXwgCyACKQPoFSACKQPgFSINIBF8IA1UrXx8IhAgC1StfHwiCyAPVK18fCIPVq18fCIRQgBTIAwgFFStIAwgEVatfCIMQgBSIAxQG0UEQCALIA+DQn9SIBBCbVRyIBFC////////////AFJyDQELIAtCAXwiDiAQQm1UrSINfSEMIA9CAXwiFCALQn9SIA0gDlZyrSILfSESIBEgD0J/UiALIBRWcq19Qv///////////wB9IREgEEITfCEQDAELIA8hEiALIQwLAn4CQAJAIBEiCyAoIg9SDQAgEiILICAiD1INACAMIgsgJiIPUg0AICQiDyAQIgtRDQELIAsgD1oNACAmIAx9IgsgECAkVq0iD1QgDCAmVnKtIgwgICASfSIOQn+FfCINIA8gC0J/hXwiCyAkIBB9IhRCbVatIhBUrSITfSEPIA0gE1QhBiALIBB9IQsgDCAOViASICBWcq0gESAofXxC////////////AHwhF0JtIBR9DAELIAwgJn0iDyAQICRUrSIOfSELIBIgIH0iDSAMICZUIA4gD1ZyrSIMfSEPIBIgIFQgDCANVnIhBiARICh9IRcgECAkfQshEiACQbAVaiAdQgBCvgFCABDJAyACQaAVaiACKQOwFSINQpuUr8Pytajehn9+IgxCAEJtQgAQyQMgAkGQFWogDEIAQn9CABDJAyACQYAVaiAMQgBC////////////AEIAEMkDIAJB8BRqICFCAEK+AUIAEMkDIAJB4BRqIAIpA5AVIgwgAikDuBV8Ig4gAikDqBUgAikDoBUiESANQn6DfCARVK18fCINIAIpA/AUfCIRQpuUr8Pytajehn9+IhRCAEJtQgAQyQMgAkHQFGogFEIAQn9CABDJAyACQcAUaiAUQgBC////////////AEIAEMkDIAJBsBRqIB9CAEK+AUIAEMkDIAJBoBRqIAIpA9AUIhQgAikD+BQgDSARVq18IhAgDCANIA5UrSACKQOYFSITIAwgDlatfHwiFnwiGXwiGHwiDCACKQPoFCACKQPgFCIOIBF8IA5UrXx8Ig4gAikDsBR8Ig1Cm5Svw/K1qN6Gf34iEUIAQm1CABDJAyACQZAUaiARQgBCf0IAEMkDIAJBgBRqIBFCAEL///////////8AQgAQyQMgAkHwE2ogJ0IAQr4BQgAQyQMgAkHgE2ogAikDkBQiESAUIBAgGFatIhggEyAWIBlWrXwiGSACKQOAFXwiG3wiEHwiEyAMIA5WrSACKQPYFCIaIAwgFFStfHx8IgwgAikDuBQgDSAOVK18fCIcfCIOIAIpA6gUIA0gAikDoBQiFHwgFFStfHwiDSACKQPwE3wiFEKblK/D8rWo3oZ/fiIWQgBCbUIAEMkDIAJB0BNqIBZCAEJ/QgAQyQMgAkHAE2ogFkIAQv///////////wBCABDJAyAXIAatfSEWAkACQCACKQPIEyACKQOIFCACKQPIFCACKQPAFCIeIAIpA4gVIBkgG1atfHwiFyAeVK18IBcgFyAQIBhUrXwiGVatfCAZIAwgE1StIBogECATVq18fHwiECAZVK18IhcgAikDgBR8IhMgF1StfCATIBMgECAMIBxWrXwiDCAQVK18IhBWrXwgECAQIAIpA5gUIhcgDCAMIBF8IhNWrXwgEyATIA0gDlStIBcgDiARVK18fHwiDFatfHwiDlatfCIQIAIpA8ATfCIRIBBUrXwgESAOIA4gDCAMIAIpA/gTIA0gFFatfHwiE1atfCIMVq18Ig4gEVStfCAOIAIpA9gTIhEgDCAMIAIpA9ATIg18IhBWrXwgECAQIBEgDSATfCIMIA1UrXwgDCACKQPoEyACKQPgEyINIBR8IA1UrXx8IhEgDFStfHwiDFatfHwiDSAOVK18IhBCAFkEQCAQQv///////////wBSIBFCbVRyIAwgDYNCf1JyDQELIAxCAXwiFCARQm1UrSITfSEOIA1CAXwiFyAMQn9SIBMgFFZyrSIMfSEZIBAgDUJ/UiAMIBdWcq19Qv///////////wB9IRAgEUITfCERDAELIA0hGSAMIQ4LIBAgFnwiDCAPIBl8Ig0gD1QgDSANIAsgCyAOfCIOViAOIA4gESASfCIRIBJUrXwiD1ZyrXwiDlZyrXwhDQJAAkAgDCAWVCAMIA1Wcg0AQv///////////wAhDCANIgtC////////////AFEEQEJ/IQxC////////////ACELIA5Cf1IEQCAPIRQgDiEMDAMLIA9Cf1IEQCAPIRQMAwtCbSEMIBEiC0JtUQ0BCyALIAxaDQAgDyEUIA4hDCANIQsMAQsgD0IBfCILIBFCbVStIgx9IRQgDkIBfCISIA9Cf1IgCyAMVHKtIgt9IQwgDSAOQn9SIAsgElZyrX1C////////////AH0hCyARQhN8IRELIAIgETcDmB0gAiAUNwOQHSACIAw3A4gdIAIgCzcDgB0CQAJAIAJBgB1qQejRwQBBIBDxAwRAIBUgBa19ISogAkGwHWpCADcDACACQagdakIANwMAIAJCADcDoB0gAkIBNwO4HSACQdgdaiACQZgdaikDADcDACACQdAdaiACQZAdaikDADcDACACQcgdaiACQYgdaikDADcDACACIAIpA4AdNwPAHSACQfgdakHg0cEAKQMANwMAIAJB8B1qQdjRwQApAwA3AwAgAkHoHWpB0NHBACkDADcDACACQcjRwQApAwA3A+AdAkAgAkHAHWogAkGgHWpBIBDxA0UEQEKkCyESQgAhFkIAIRFCACETDAELQqQLIRIgAikD2B0hDyACKQPAHSEUIAIpA9AdIRcgAikDyB0hDkIAIQxCACEaQgAhHEIAIRBCACETQgAhFkIAIRFCbSELQv///////////wAhGUJ/IQ1CfyEVA0AgAkHgHWogAkGgHWpBIBDxA0UEQCAcIRYgECERIBohEyAMIRIMAgsgD6dBAXFFBEADQCAXQj+GIA9CAYiEIQ8CfiASp0EBcUUEQCATQj+GIBJCAYiEIRIgFkI/hiATQgGIhCETIBFCP4YgFkIBiIQMAQsgFkIBfSIbIBNCAFIgE0IBfSITIBIgEkITfSIeVq18IhIgE1RyrXwiGEI/hiASQgGIhCETIBJCP4YgHkIBiIQhEiARIBZCAFIgGCAbVHKtfEL///////////8AfCIRQj+GIBhCAYiECyEWIBRCP4YgDkI/hiAXQgGIhCEXIBRCAYghFCARQgGIIREgDkIBiIQhDiAPQgGDUA0ACyACIA43A8gdIAIgFzcD0B0LIAIgFDcDwB0gAiAPNwPYHSALp0EBcUUEQANAIBVCP4YgC0IBiIQhCwJ+IAxCAYNQRQRAIBxCAX0iGyAaQgBSIBpCAX0iGCAMIAxCE30iHlatfCIMIBhUcq18IhhCP4YgDEIBiIQhGiAMQj+GIB5CAYiEIQwgECAcQgBSIBggG1RyrXxC////////////AHwiEEI/hiAYQgGIhAwBCyAaQj+GIAxCAYiEIQwgHEI/hiAaQgGIhCEaIBBCP4YgHEIBiIQLIRwgGUI/hiANQj+GIBVCAYiEIRUgGUIBiCEZIBBCAYghECANQgGIhCENIAtCAYNQDQALIAIgDTcD6B0gAiAVNwPwHQsgAiALNwP4HSACIBk3A+AdIBQhGAJAAkACQAJAAkAgGSIbIBRSDQAgDSEbIA4hGCANIA5SDQAgFSEbIBUgFyIYUg0AIAshGyAPIRggCyAPUQ0BCyAYIBtaDQAgAiALIA99Ihg3A/gdIAIgFSAXfSIeIAsgD1StIgt9Ihs3A/AdIAIgDSAOfSIpIBUgF1QgCyAeVnKtIgt9Ih43A+gdIAIgGSAUfSANIA5UIAsgKVZyrX0iGTcD4B0CQAJAIBEiDSAQIgtSDQAgFiINIBwiC1INACATIg0gGiILUg0AIBIiDSAMIgtRDQELIAsgDVQNAgsgECARfSAcIBZ9IikgGiATfSIrIAwgElStIixUIBMgGlZyrSIaVCAWIBxWcq19IRAgDCASfSEMIBshFSAeIQ0gGCELICkgGn0hHCArICx9IRoMAwsgAiAPIAt9Ihg3A9gdIAIgFyAVfSIeIAsgD1atIg99Ihs3A9AdIAIgDiANfSIpIA8gHlYgFSAXVnKtIg99Ihc3A8gdIAIgFCAZfSAPIClWIA0gDlZyrX0iFDcDwB0CQAJAIBEiDyAQIg5SDQAgFiIPIBwiDlINACATIg8gGiIOUg0AIBIiDyAMIg5RDQELIA4gD1YNAgsgESAQfSAWIBxUIBYgHH0iFiATIBpUIBMgGn0iEyAMIBJWrSIeVHKtIilUcq19IREgEiAMfSESIBchDiAbIRcgGCEPIBYgKX0hFiATIB59IRMMAgsgEEJ/QgAgFkJ/hSILIBNCf4UiDSASQm1WrSIVVK0iKVQbIBF9fCALICl9IhAgHHwiCyAQVCALIA0gFX0iECAafCINIBBUIA1CbSASfSIQIAx8IgwgEFStfCIaIA1Ucq18IhwgC1RyrXxC////////////AHwhECAbIRUgHiENIBghCwwBCyARIBB9IBxCf4UiDyAaQn+FIg4gDEJtVq0iEVStIh5UrX0gFiAPIB59Ih58Ig8gHlQgDyAPIA4gEX0iESATfCIOIBFUIA5CbSAMfSIRIBJ8IhIgEVStfCITIA5Ucq18IhZWcq18Qv///////////wB8IREgFyEOIBshFyAYIQ8LIAJBwB1qIAJBoB1qQSAQ8QMNAAsLIAJBsBNqIBJCACAjQgAQyQMgAkHwEmogEkIAICVCABDJAyACQeASaiASQgAgIkIAEMkDIAJB0BJqIBJCACAqQgAQyQMgAkGgE2ogAikDsBMiDEKblK/D8rWo3oZ/fiILQgBCbUIAEMkDIAJBkBNqIAtCAEJ/QgAQyQMgAkGAE2ogC0IAQv///////////wBCABDJAyACQcASaiATQgAgI0IAEMkDIAJBgBJqIBNCACAlQgAQyQMgAkHwEWogE0IAICJCABDJAyACQeARaiATQgAgKkIAEMkDIAJBsBJqIAIpA5ATIgsgAikDuBMiEiACKQPwEnwiFHwiDyACKQOoEyAMIAIpA6ATIg58IA5UrXx8IgwgAikDwBJ8Ig5Cm5Svw/K1qN6Gf34iDUIAQm1CABDJAyACQaASaiANQgBCf0IAEMkDIAJBkBJqIA1CAEL///////////8AQgAQyQMgAkHQEWogFkIAICNCABDJAyACQZARaiAWQgAgJUIAEMkDIAJBgBFqIBZCACAiQgAQyQMgAkHwEGogFkIAICpCABDJAyACQcARaiACKQPIEiAMIA5WrXwiEyACKQOAEnwiDSALIAIpA/gSIBIgFFatfCIVIAIpA+ASfCISfCIUIAwgD1StIAIpA5gTIhYgCyAPVq18fHwiF3wiCyACKQOgEiIZfCIPIAIpA7gSIAIpA7ASIgwgDnwgDFStfHwiDCACKQPQEXwiDkKblK/D8rWo3oZ/fiIQQgBCbUIAEMkDIAJBsBFqIBBCAEJ/QgAQyQMgAkGgEWogEEIAQv///////////wBCABDJAyACQeAQaiARQgAgI0IAEMkDIAJBoBBqIBFCACAlQgAQyQMgAkGQEGogEUIAICJCABDJAyACQYAQaiARQgAgKkIAEMkDIAJB0BBqIAIpA9gRIAwgDlatfCIYIAIpA5ARfCIRIBkgAikD6BIgEiAVVK18IhsgAikD0BJ8IhAgAikDgBN8IhUgFCAXVq0gFiASIBRWrXx8fCISIAIpA/ARfCIUIAsgDVStIAIpA4gSIA0gE1StfHx8Ig18IhMgDCAPVK0gAikDqBIiFyALIA9WrXx8fCIZfCILIAIpA7ARIhp8Ig8gAikDyBEgAikDwBEiDCAOfCAMVK18fCIMIAIpA+AQfCIOQpuUr8Pytajehn9+IhZCAEJtQgAQyQMgAkHAEGogFkIAQn9CABDJAyACQbAQaiAWQgBC////////////AEIAEMkDIAIpA7gQIAIpA6gRIAIpA5gSIBIgFVStIAIpA4gTIBAgFVatfHwiFiACKQPYEiAQIBtUrXx8IhAgAikD4BF8IhUgDSAUVK0gAikD+BEgEiAUVq18fHwiEiACKQOQEnwiFCASVK18IBQgEyAZVq0gFyANIBNWrXx8fCINIBRUrXwiEyASIBVUrSACKQPoESAQIBVWrXx8IhcgECAWVK18IhZ8IhIgAikD8BB8IhQgAikDiBEgDSANIAIpA4ARfCIQVq18IBAgECALIBFUrSACKQOYESARIBhUrXx8fCINVq18fCIRIAIpA6ARfCIQIBFUrXwgECACKQO4ESIZIA0gDSAafCIVVq18IBUgFSAMIA9UrSAZIAsgD1atfHx8IhlWrXx8IgsgEFStfCIQIBEgFFStIAIpA/gQIBIgFFatfHwiFSASIBNUrSAWIBdUrXx8IhN8Ig0gAikDgBB8IhIgAikDmBAgCyALIAIpA5AQfCIPVq18IA8gDyACKQOoECACKQPoECAMIA5WrXwiDCACKQOgEHwiCyAMVK18IAsgCyAZfCIMVq18fCILVq18fCIRIAIpA7AQfCIUIBFUrXwgFCAUIAIpA8gQIhYgCyALIAIpA8AQIhd8Ig9WrXwgDyAPIBYgDCAMIBd8IgtWrXwgCyACKQPYECAOIAIpA9AQIgx8IAxUrXx8IiMgC1StfHwiC1atfHwiD1atfCIMIBEgElStIAIpA4gQIA0gElatfHwiDiANIBBUrSATIBVUrXx8Ig18IiIgDFQgDSAOVHIgIkIAU3JFBEAgCyAPg0J/UiAjQm1UciAiQv///////////wBScg0CCyALQgF8IgwgI0JtVK0iDn0hHiAPQgF8Ig0gC0J/UiAMIA5Ucq0iC30hJSAiIA9Cf1IgCyANVnKtfUL///////////8AfSEiICNCE3whIwwCCyACQgI3A+AdQYz3wQBBKyACQeAdakH89sEAQZiRwgAQygMACyAPISUgCyEeCyACQfAPaiAjQgAgJEIAEMkDIAJBsA9qICNCACAmQgAQyQMgAkGgD2ogI0IAICBCABDJAyACQZAPaiAjQgAgKEIAEMkDIAJB4A9qIAIpA/APIgxCm5Svw/K1qN6Gf34iC0IAQm1CABDJAyACQdAPaiALQgBCf0IAEMkDIAJBwA9qIAtCAEL///////////8AQgAQyQMgAkGAD2ogHkIAICRCABDJAyACQcAOaiAeQgAgJkIAEMkDIAJBsA5qIB5CACAgQgAQyQMgAkGgDmogHkIAIChCABDJAyACQfAOaiACKQPQDyILIAIpA/gPIhIgAikDsA98IhF8Ig8gAikD6A8gDCACKQPgDyIOfCAOVK18fCIMIAIpA4APfCIOQpuUr8Pytajehn9+Ig1CAEJtQgAQyQMgAkHgDmogDUIAQn9CABDJAyACQdAOaiANQgBC////////////AEIAEMkDIAJBkA5qICVCACAkQgAQyQMgAkHQDWogJUIAICZCABDJAyACQcANaiAlQgAgIEIAEMkDIAJBsA1qICVCACAoQgAQyQMgAkGADmogAikDiA8gDCAOVq18IhMgAikDwA58Ig0gCyACKQO4DyARIBJUrXwiECACKQOgD3wiEnwiESAMIA9UrSACKQPYDyIWIAsgD1atfHx8Ihd8IgsgAikD4A4iGXwiDyACKQP4DiACKQPwDiIMIA58IAxUrXx8IgwgAikDkA58Ig5Cm5Svw/K1qN6Gf34iFEIAQm1CABDJAyACQfANaiAUQgBCf0IAEMkDIAJB4A1qIBRCAEL///////////8AQgAQyQMgAkGgDWogIkIAICRCABDJAyACQeAMaiAiQgAgJkIAEMkDIAJB0AxqICJCACAgQgAQyQMgAkHADGogIkIAIChCABDJAyACQZANaiACKQOYDiAMIA5WrXwiGCACKQPQDXwiFCAZIAIpA6gPIBAgElatfCIbIAIpA5APfCIQIAIpA8APfCIVIBEgF1atIBYgESASVK18fHwiEiACKQOwDnwiESALIA1UrSACKQPIDiANIBNUrXx8fCINfCITIAwgD1StIAIpA+gOIhcgCyAPVq18fHwiGXwiCyACKQPwDSIafCIPIAIpA4gOIAIpA4AOIgwgDnwgDFStfHwiDCACKQOgDXwiDkKblK/D8rWo3oZ/fiIWQgBCbUIAEMkDIAJBgA1qIBZCAEJ/QgAQyQMgAkHwDGogFkIAQv///////////wBCABDJAwJAAkAgAikD+AwgAikD6A0gAikD2A4gEiAVVK0gAikDyA8gECAVVq18fCIWIAIpA5gPIBAgG1StfHwiECACKQOgDnwiFSANIBFUrSACKQO4DiARIBJUrXx8fCISIAIpA9AOfCIRIBJUrXwgESATIBlWrSAXIA0gE1atfHx8Ig0gEVStfCITIBIgFVStIAIpA6gOIBAgFVatfHwiFyAQIBZUrXwiFnwiEiACKQOwDXwiESACKQPIDSANIA0gAikDwA18IhBWrXwgECAQIAsgFFStIAIpA9gNIBQgGFStfHx8Ig1WrXx8IhQgAikD4A18IhAgFFStfCAQIAIpA/gNIhkgDSANIBp8IhVWrXwgFSAVIAwgD1StIBkgCyAPVq18fHwiGVatfHwiCyAQVK18IhggESAUVq0gAikDuA0gESASVK18fCIbIBIgE1StIBYgF1StfHwiE3wiDSACKQPADHwiEiACKQPYDCALIAsgAikD0Ax8Ig9WrXwgDyAPIAIpA+gMIAIpA6gNIAwgDlatfCIMIAIpA+AMfCILIAxUrXwgCyALIBl8IgxWrXx8IgtWrXx8IhQgAikD8Ax8IhAgFFStfCAQIBAgAikDiA0iDyALIAsgAikDgA0iEXwiFVatfCAVIBUgDyAMIAwgEXwiC1atfCALIAIpA5gNIA4gAikDkA0iD3wgD1StfHwiESALVK18fCIPVq18fCIMVq18IgsgEiAUVq0gAikDyAwgDSASVq18fCIOIA0gGFStIBMgG1StfHwiDXwiECALVCANIA5UciAQQgBTckUEQCAMIA+DQn9SIBFCbVRyIBBC////////////AFJyDQELIA9CAXwiCyARQm1UrSIOfSEUIAxCAXwiDSAPQn9SIAsgDlRyrSIPfSELIBAgDEJ/UiANIA9Ucq19Qv///////////wB9IRAgEUITfCERDAELIAwhCyAPIRQLIBAgKHwiDyALICB8IgwgIFQgDCAUICZ8Ig4gJlQgDiAOIBEgJHwiEiAkVK18IgtWcq18Ig4gDFRyrXwhDQJAAkAgDyAoVCANIA9Ucg0AQv///////////wAhECANIgxC////////////AFEEQEJ/IQxC////////////ACEPIA5Cf1IEQCALIRQgDiEMDAMLIAtCf1IEQCALIRQMAwtCbSEQIBIiDEJtUQ0BCyAMIBBaDQAgCyEUIA4hDCANIQ8MAQsgC0IBfCIPIBJCbVStIgx9IRQgDkIBfCIRIAtCf1IgDCAPVnKtIgt9IQwgDSAOQn9SIAsgEVZyrX1C////////////AH0hDyASQhN8IRILIAJB8ApqICNCACAdQgAQyQMgAkGwC2ogI0IAICFCABDJAyACQfALaiAjQgAgH0IAEMkDIAJBsAxqICNCACAnQgAQyQMgAkHgCmogAikD8AoiDUKblK/D8rWo3oZ/fiILQgBCbUIAEMkDIAJB0ApqIAtCAEJ/QgAQyQMgAkHACmogC0IAQv///////////wBCABDJAyACQbAKaiAeQgAgHUIAEMkDIAJBoAtqIB5CACAhQgAQyQMgAkHgC2ogHkIAIB9CABDJAyACQaAMaiAeQgAgJ0IAEMkDIAJBoApqIAIpA9AKIgsgAikD+AoiFSACKQOwC3wiE3wiDiACKQPoCiANIAIpA+AKIhF8IBFUrXx8Ig0gAikDsAp8IhFCm5Svw/K1qN6Gf34iEEIAQm1CABDJAyACQZAKaiAQQgBCf0IAEMkDIAJBgApqIBBCAEL///////////8AQgAQyQMgAkHwCWogJUIAIB1CABDJAyACQZALaiAlQgAgIUIAEMkDIAJB0AtqICVCACAfQgAQyQMgAkGQDGogJUIAICdCABDJAyACQeAJaiACKQO4CiANIBFWrXwiGCACKQOgC3wiECALIAIpA7gLIBMgFVStfCIXIAIpA/ALfCIVfCITIA0gDlStIAIpA9gKIhsgCyAOVq18fHwiGnwiCyACKQOQCiIcfCIOIAIpA6gKIAIpA6AKIg0gEXwgDVStfHwiDSACKQPwCXwiEUKblK/D8rWo3oZ/fiIWQgBCbUIAEMkDIAJB0AlqIBZCAEJ/QgAQyQMgAkHACWogFkIAQv///////////wBCABDJAyACQbAJaiAiQgAgHUIAEMkDIAJBgAtqICJCACAhQgAQyQMgAkHAC2ogIkIAIB9CABDJAyACQYAMaiAiQgAgJ0IAEMkDIAJBoAlqIAIpA/gJIA0gEVatfCIkIAIpA5ALfCIWIBwgAikD+AsgFSAXVK18IiYgAikDsAx8IhcgAikDwAp8IhkgEyAaVq0gGyATIBVUrXx8fCIVIAIpA+ALfCITIAsgEFStIAIpA6gLIBAgGFStfHx8IhB8IhggDSAOVK0gAikDmAoiGiALIA5WrXx8fCIcfCILIAIpA9AJIiB8Ig4gAikD6AkgAikD4AkiDSARfCANVK18fCINIAIpA7AJfCIRQpuUr8Pytajehn9+IhtCAEJtQgAQyQMgAkGQCWogG0IAQn9CABDJAyACQYAJaiAbQgBC////////////AEIAEMkDAkACQCACKQOICSACKQPICSACKQOICiAVIBlUrSACKQPICiAXIBlWrXx8IhsgAikDuAwgFyAmVK18fCIXIAIpA6AMfCIZIBAgE1StIAIpA+gLIBMgFVStfHx8IhUgAikDgAp8IhMgFVStfCATIBggHFatIBogECAYVq18fHwiECATVK18IhggFSAZVK0gAikDqAwgFyAZVq18fCIaIBcgG1StfCIbfCIVIAIpA5AMfCITIAIpA9gLIBAgECACKQPQC3wiF1atfCAXIBcgCyAWVK0gAikDmAsgFiAkVK18fHwiEFatfHwiFiACKQPACXwiFyAWVK18IBcgAikD2AkiHCAQIBAgIHwiGVatfCAZIBkgDSAOVK0gHCALIA5WrXx8fCIQVq18fCILIBdUrXwiHCATIBZWrSACKQOYDCATIBVUrXx8IiQgFSAYVK0gGiAbVq18fCIYfCIVIAIpA4AMfCITIAIpA8gLIAsgCyACKQPAC3wiDlatfCAOIA4gAikDiAsgAikDuAkgDSARVq18Ig0gAikDgAt8IgsgDVStfCALIAsgEHwiDVatfHwiC1atfHwiFiACKQOACXwiFyAWVK18IBcgFyACKQOYCSIOIAsgCyACKQOQCSIQfCIZVq18IBkgGSAOIA0gDSAQfCILVq18IAsgAikDqAkgESACKQOgCSIOfCAOVK18fCIQIAtUrXx8Ig5WrXx8Ig1WrXwiCyATIBZWrSACKQOIDCATIBVUrXx8IhMgFSAcVK0gGCAkVK18fCIVfCIRIAtUIBMgFVZyIBFCAFNyRQRAIA0gDoNCf1IgEEJtVHIgEUL///////////8AUnINAQsgDkIBfCILIBBCbVStIhV9IRkgDUIBfCITIA5Cf1IgCyAVVHKtIg59IQsgESANQn9SIA4gE1ZyrX1C////////////AH0hESAQQhN8IRAMAQsgDSELIA4hGQsCfgJAAkAgESIOIA8iDVINACALIQ4gCyAMIg1SDQAgFCINIBkiDlINACASIg0gECIOUQ0BCyANIA5aDQAgGSAUfSIOIBAgElStIg1UIBQgGVZyrSIVIAsgDH0iE0J/hXwiFiANIA5Cf4V8Ig4gECASfSINQm1WrSISVK0iEH0hFCAQIBZWIQYgDiASfSEOIAsgDFQgEyAVVHKtIA8gEX18Qv///////////wB8IQxCbSANfQwBCyAUIBl9Ig0gECASVq0iFX0hDiAMIAt9IhMgFCAZVCANIBVUcq0iDX0hFCANIBNWIAsgDFZyIQYgDyARfSEMIBIgEH0LIQsgDCAGrX0iDyEMAn4CQAJAIA8gJyISUg0AIBQiDCAfIhJSDQAgDiIMICEiElINACALIgwgHSISUQ0BCyAMIBJaDQAgISAOfSIMIAsgHVatIg1UIA4gIVZyrSIOIB8gFH0iEkJ/hXwiESAMQn+FIA18IgwgHSALfSILQm1WrSINVK0iEH0hISAQIBFWIQUgDCANfSEkQm0gC30hJiAOIBJWIBQgH1ZyrSAPICd9fEL///////////8AfAwBCyAOICF9IgwgCyAdVK0iDX0hJCAUIB99IhIgDiAhVCAMIA1Ucq0iDH0hISAUIB9UIAwgElZyIQUgCyAdfSEmIA8gJ30LIRogAkHwCGogBykDGEIAQpgBQgAQyQMgAkHgCGogAikD8AgiDEKblK/D8rWo3oZ/fiILQgBCbUIAEMkDIAJB0AhqIAtCAEJ/QgAQyQMgAkHACGogC0IAQv///////////wBCABDJAyACQbAIaiAHKQMQQgBCmAFCABDJAyACQaAIaiACKQPQCCILIAIpA/gIfCIPIAIpA+gIIAIpA+AIIg4gDEJ4g3wgDlStfHwiDCACKQOwCHwiDkKblK/D8rWo3oZ/fiINQgBCbUIAEMkDIAJBkAhqIA1CAEJ/QgAQyQMgAkGACGogDUIAQv///////////wBCABDJAyACQfAHaiAHKQMIQgBCmAFCABDJAyACQeAHaiACKQOQCCINIAIpA7gIIAwgDlatfCISIAsgDCAPVK0gAikD2AgiESALIA9WrXx8IhR8IhB8IhV8IgsgAikDqAggAikDoAgiDyAOfCAPVK18fCIPIAIpA/AHfCIMQpuUr8Pytajehn9+Ig5CAEJtQgAQyQMgAkHQB2ogDkIAQn9CABDJAyACQcAHaiAOQgBC////////////AEIAEMkDIAJBsAdqIAcpAwBCAEKYAUIAEMkDIAJBoAdqIAIpA9AHIg4gDSASIBVWrSIVIBEgECAUVK18IhAgAikDwAh8IhN8IhJ8IhEgCyAPVq0gAikDmAgiFiALIA1UrXx8fCILIAIpA/gHIAwgD1StfHwiF3wiDyACKQPoByAMIAIpA+AHIg18IA1UrXx8IgwgAikDsAd8Ig1Cm5Svw/K1qN6Gf34iFEIAQm1CABDJAyACQZAHaiAUQgBCf0IAEMkDIAJBgAdqIBRCAEL///////////8AQgAQyQMCQAJAAn4CQAJAIAIpA4gHIAIpA8gHIAIpA4gIIAIpA4AIIhkgAikDyAggECATVq18fCIUIBlUrXwgFCAUIBIgFVStfCIQVq18IBAgCyARVK0gFiARIBJUrXx8fCISIBBUrXwiFCACKQPAB3wiESAUVK18IBEgESASIAsgF1atfCILIBJUrXwiElatfCASIBIgAikD2AciFCALIAsgDnwiEVatfCARIBEgDCAPVK0gFCAOIA9WrXx8fCILVq18fCIPVq18IhIgAikDgAd8Ig4gElStfCAOIA8gDyALIAsgAikDuAcgDCANVq18fCISVq18IgtWrXwiDyAOVK18IA8gDyACKQOYByIRIAsgCyACKQOQByIMfCIOVq18IA4gESAMIBJ8IgsgDFStfCALIAIpA6gHIAIpA6AHIgwgDXwgDFStfHwiDCALVK18fCIRIA5UrXx8IhJWrXwiEEIAUyIHRQRAIBEgEoMhDyAQQv///////////wBSIAxCbVRyDQEgDCEOIBEhDSASIRQgECEZIA9Cf1INAgsgEUIBfCIWIAxCbVStIgt9IQ0gEkIBfCIXIBFCf1IgCyAWVnKtIgt9IRQgEEL///////////8AfSIVIBJCf1IgCyAXVnKtfSEZIAxCE3wiDiAHDQIaIBEgEoMhDwwBCyAMIQ4gESENIBIhFCAQIRkLIBBC////////////AFIgDEJtVHIgD0J/UnINASASQgF8IRcgEUIBfCEWQgAhFSAMQhN8CyEPIBcgEUJ/UiAWIAxCbVStIgxUcq0iEX0hCyAVIBJCf1IgESAXVnKtfSEQIBYgDH0hEQwBCyASIQsgDCEPCyACQfAGaiAPQgAgI0IAEMkDIAJBgAZqIBFCACAjQgAQyQMgAkGQBWogC0IAICNCABDJAyACQaAEaiAQQgAgI0IAEMkDIAJB4AZqIAIpA/AGIhVCm5Svw/K1qN6Gf34iDEIAQm1CABDJAyACQdAGaiAMQgBCf0IAEMkDIAJBwAZqIAxCAEL///////////8AQgAQyQMgAkGwBmogD0IAIB5CABDJAyACQcAFaiARQgAgHkIAEMkDIAJB0ARqIAtCACAeQgAQyQMgAkHgA2ogEEIAIB5CABDJAyACQfAFaiACKQPQBiIMIAIpA/gGIhcgAikDgAZ8Ihh8IhIgAikD6AYgFSACKQPgBiITfCATVK18fCIVIAIpA7AGfCITQpuUr8Pytajehn9+IhZCAEJtQgAQyQMgAkHgBWogFkIAQn9CABDJAyACQdAFaiAWQgBC////////////AEIAEMkDIAJBoAZqIA9CACAlQgAQyQMgAkGwBWogEUIAICVCABDJAyACQcAEaiALQgAgJUIAEMkDIAJB0ANqIBBCACAlQgAQyQMgAkGABWogAikDuAYgEyAVVK18IhwgAikDwAV8IhYgDCACKQOIBiAXIBhWrXwiHSACKQOQBXwiF3wiGCASIBVWrSACKQPYBiIfIAwgElatfHx8IiB8IgwgAikD4AUiJ3wiEiACKQP4BSACKQPwBSIVIBN8IBVUrXx8IhUgAikDoAZ8IhNCm5Svw/K1qN6Gf34iG0IAQm1CABDJAyACQfAEaiAbQgBCf0IAEMkDIAJB4ARqIBtCAEL///////////8AQgAQyQMgAkGQBmogD0IAICJCABDJAyACQaAFaiARQgAgIkIAEMkDIAJBsARqIAtCACAiQgAQyQMgAkHAA2ogEEIAICJCABDJAyACQZAEaiACKQOoBiATIBVUrXwiKCACKQOwBXwiCyAnIAIpA5gFIBcgHVStfCIdIAIpA6AEfCIPIAIpA8AGfCIRIBggIFatIB8gFyAYVq18fHwiECACKQPQBHwiFyAMIBZUrSACKQPIBSAWIBxUrXx8fCIWfCIYIBIgFVatIAIpA+gFIhwgDCASVq18fHwiH3wiDCACKQPwBCIgfCISIAIpA4gFIAIpA4AFIhUgE3wgFVStfHwiFSACKQOQBnwiE0KblK/D8rWo3oZ/fiIbQgBCbUIAEMkDIAJBgARqIBtCAEJ/QgAQyQMgAkHwA2ogG0IAQv///////////wBCABDJAwJAAkAgAikD+AMgAikD6AQgAikD2AUgECARVK0gAikDyAYgDyARVq18fCIbIAIpA6gEIA8gHVStfHwiDyACKQPgA3wiESAWIBdUrSACKQPYBCAQIBdWrXx8fCIQIAIpA9AFfCIXIBBUrXwgFyAXIBggH1atIBwgFiAYVq18fHwiFlatfCIYIBAgEVStIAIpA+gDIA8gEVatfHwiHCAPIBtUrXwiG3wiDyACKQPQA3wiESACKQPIBCAWIAIpA8AEfCIQIBZUrXwgECALIAxWrSACKQO4BSALIChUrXx8fCILIBBUrXx8IhAgAikD4AR8IhYgEFStfCAWIAIpA/gEIh0gCyALICB8IhdWrXwgFyAXIBIgFVatIB0gDCASVq18fHwiHVatfHwiCyAWVK18IhcgECARVK0gAikD2AMgDyARVq18fCIfIA8gGFStIBsgHFStfHwiGHwiDCACKQPAA3wiEiACKQO4BCALIAsgAikDsAR8Ig9WrXwgDyAPIAIpA6gFIAIpA5gGIBMgFVStfCIRIAIpA6AFfCILIBFUrXwgCyALIB18IhFWrXx8IgtWrXx8IhUgAikD8AN8IhYgFVStfCAWIBYgAikDiAQiECALIAsgAikDgAQiG3wiD1atfCAPIA8gECARIBEgG3wiC1atfCALIAIpA5gEIAIpA5AEIhEgE3wgEVStfHwiECALVK18fCILVq18fCIPVq18IhMgEiAVVq0gAikDyAMgDCASVq18fCISIAwgF1StIBggH1StfHwiDHwiESATVCAMIBJUciARQgBTckUEQCALIA+DQn9SIBBCbVRyIBFC////////////AFJyDQELIAtCAXwiEiAQQm1UrSIVfSEMIA9CAXwiEyALQn9SIBIgFVRyrSILfSESIBEgD0J/UiALIBNWcq19Qv///////////wB9IREgEEITfCEQDAELIA8hEiALIQwLAn8CQAJAIBEiDyAZIgtSDQAgEiIPIBQiC1INACAMIQ8gDSILIAxSDQAgECIPIA4iC1ENAQsgCyAPWg0AIAwgDX0iCyAOIBBWrSIPVCAMIA1Ucq0iDSASIBR9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rSIdVK19IBYgDyAdfSIdfCIPIB1UIA8gDyAOIBF9IhEgE3wiDiARVCAOQm0gDH0iESASfCISIBFUrXwiEyAOVHKtfCIWVnKtfEL///////////8AfCERIBchDiAbIRcgGCEPCyACQcAdaiACQaAdakEgEPEDDQALCyACQbADaiASQgAgJkIAEMkDIAJB8AJqIBJCACAkQgAQyQMgAkHgAmogEkIAICFCABDJAyACQdACaiASQgAgH0IAEMkDIAJBoANqIAIpA7ADIgxCm5Svw/K1qN6Gf34iC0IAQm1CABDJAyACQZADaiALQgBCf0IAEMkDIAJBgANqIAtCAEL///////////8AQgAQyQMgAkHAAmogE0IAICZCABDJAyACQYACaiATQgAgJEIAEMkDIAJB8AFqIBNCACAhQgAQyQMgAkHgAWogE0IAIB9CABDJAyACQbACaiACKQOQAyILIAIpA7gDIhIgAikD8AJ8IhR8Ig8gAikDqAMgDCACKQOgAyIOfCAOVK18fCIMIAIpA8ACfCIOQpuUr8Pytajehn9+Ig1CAEJtQgAQyQMgAkGgAmogDUIAQn9CABDJAyACQZACaiANQgBC////////////AEIAEMkDIAJB0AFqIBZCACAmQgAQyQMgAkGQAWogFkIAICRCABDJAyACQYABaiAWQgAgIUIAEMkDIAJB8ABqIBZCACAfQgAQyQMgAkHAAWogAikDyAIgDCAOVq18IhMgAikDgAJ8Ig0gCyACKQP4AiASIBRWrXwiFSACKQPgAnwiEnwiFCAMIA9UrSACKQOYAyIWIAsgD1atfHx8Ihd8IgsgAikDoAIiGXwiDyACKQO4AiACKQOwAiIMIA58IAxUrXx8IgwgAikD0AF8Ig5Cm5Svw/K1qN6Gf34iEEIAQm1CABDJAyACQbABaiAQQgBCf0IAEMkDIAJBoAFqIBBCAEL///////////8AQgAQyQMgAkHgAGogEUIAICZCABDJAyACQSBqIBFCACAkQgAQyQMgAkEQaiARQgAgIUIAEMkDIAIgEUIAIB9CABDJAyACQdAAaiACKQPYASAMIA5WrXwiGCACKQOQAXwiESAZIAIpA+gCIBIgFVStfCIbIAIpA9ACfCIQIAIpA4ADfCIVIBQgF1atIBYgEiAUVq18fHwiEiACKQPwAXwiFCALIA1UrSACKQOIAiANIBNUrXx8fCINfCITIAwgD1StIAIpA6gCIhcgCyAPVq18fHwiGXwiCyACKQOwASIafCIPIAIpA8gBIAIpA8ABIgwgDnwgDFStfHwiDCACKQNgfCIOQpuUr8Pytajehn9+IhZCAEJtQgAQyQMgAkFAayAWQgBCf0IAEMkDIAJBMGogFkIAQv///////////wBCABDJAyACKQM4IAIpA6gBIAIpA5gCIBIgFVStIAIpA4gDIBAgFVatfHwiFiACKQPYAiAQIBtUrXx8IhAgAikD4AF8IhUgDSAUVK0gAikD+AEgEiAUVq18fHwiEiACKQOQAnwiFCASVK18IBQgEyAZVq0gFyANIBNWrXx8fCINIBRUrXwiEyASIBVUrSACKQPoASAQIBVWrXx8IhcgECAWVK18IhZ8IhIgAikDcHwiFCACKQOIASANIA0gAikDgAF8IhBWrXwgECAQIAsgEVStIAIpA5gBIBEgGFStfHx8Ig1WrXx8IhEgAikDoAF8IhAgEVStfCAQIAIpA7gBIhkgDSANIBp8IhVWrXwgFSAVIAwgD1StIBkgCyAPVq18fHwiGVatfHwiCyAQVK18IhUgESAUVK0gAikDeCASIBRWrXx8IhggEiATVK0gFiAXVK18fCITfCIPIAIpAwB8Ig0gAikDGCALIAsgAikDEHwiElatfCASIBIgAikDKCACKQNoIAwgDlatfCIMIAIpAyB8IgsgDFStfCALIAsgGXwiDFatfHwiC1atfHwiEiACKQMwfCIUIBJUrXwgFCACKQNIIhEgCyALIAIpA0AiFnwiEFatfCAQIBAgESAMIAwgFnwiC1atfCALIAIpA1ggDiACKQNQIgx8IAxUrXx8IhEgC1StfHwiDFatfHwiDiAUVK18IgsgDSASVq0gAikDCCANIA9UrXx8Ig0gDyAVVK0gEyAYVK18fCIPfCIQIAtUIA0gD1ZyIBBCAFNyRQRAIAwgDoNCf1IgEUJtVHIgEEL///////////8AUnINAgsgDEIBfCIPIBFCbVStIg19IQsgDkIBfCISIAxCf1IgDSAPVnKtIgx9IQ8gECAOQn9SIAwgElZyrX1C////////////AH0hECARQhN8IREMAgsgAkICNwPgHUGM98EAQSsgAkHgHWpB/PbBAEGIkcIAEMoDAAsgDiEPIAwhCwsgBCAj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MjM1OS9saWJyYXJ5L2NvcmUvc3JjL2l0ZXIvYWRhcHRlcnMvc3RlcF9ieS5ycwBBqJ/AAAtFquPKkuWPmBEtlRm1hT55msCDnZOpiOtn1baVTGxH5Y3xBNEJpuZ2CkYXNBw0H9/0EwAAAAwAAAAEAAAAFAAAABUAAAAWAEH4n8AAC6kGAQAAABcAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAAA3EBAASwAAANEKAAAOAAAARXJyb3IvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvaW5fcGxhY2VfY29sbGVjdC5ycwAAmRAQAFkAAAD7AAAAAQAAADcQEABLAAAAfQUAABsAAABjAAAAAAAAAAQAAAAEAAAAGAAAAFBhcnNlQmlnSW50RXJyb3JraW5kAAAAAAQAAAAEAAAAGQAAAFBhcnNlSW50RXJyb3JEaXZpc2lvbkJ5WmVybwAAAAAABAAAAAQAAAADAAAAUm9vdE9mVW5pdHlFcnJvckludlplcm9FcnJvcgAAAABn5glqha5nu3Lzbjw69U+lf1IOUYxoBZur2YMfGc3gWy9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3NsaWNlLnJzAAC4ERAASgAAAL4BAAAdAAAAAAAAAAQAAAAEAAAAGgAAAEZpZWxkRWxlbWVudHZhbHVldG9vbHMvZ2FyYWdhX3JzL3NyYy9jYWxsZGF0YS9kcmFuZF9jYWxsZGF0YS5yc0ludmFsaWQgcm91bmQgbnVtYmVyOiAAAABjEhAAFgAAAEludmFsaWQgc2lnbmF0dXJlIGFycmF5IGxlbmd0aDoghBIQACAAAABJbnZhbGlkIHJhbmRvbW5lc3MgYXJyYXkgbGVuZ3RoOiAAAACsEhAAIQAAAEludmFsaWQgZGF0YSBhcnJheSBsZW5ndGg6IADYEhAAGwAAAHNoYTI1NgAANRIQAC4AAABCAAAALQAAADUSEAAuAAAASAAAAD4AQciowAALoU8CAAAAAAAAADUSEAAuAAAAVgAAAA8AAABhc3NlcnRpb24gZmFpbGVkOiBjYWxsX2RhdGEubGVuKCkgPT0gMSArIHNpemUAAAA1EhAALgAAAFsAAAAFAAAAUG9pbnQgIGlzIG5vdCBhbiBpc28gcG9pbnQAAKAUEAAGAAAAphQQABQAAAA1EhAALgAAAHYAAAAFAAAANRIQAC4AAAB3AAAABQAAADUSEAAuAAAAhAAAAAUAAAAbAAAADAAAAAQAAAAHAAAANRIQAC4AAAByAAAACgAAADUSEAAuAAAAjwAAAC4AAABhc3NlcnRpb24gZmFpbGVkOiBkaXYzICE9IEZpZWxkRWxlbWVudDo6ZnJvbSgwKQA1EhAALgAAAKMAAAAFAAAAYXNzZXJ0aW9uIGZhaWxlZDogJnkxICogJnkxID09ICZ6ICogJmd4MTUSEAAuAAAAsAAAAAkAAABhc3NlcnRpb24gZmFpbGVkOiAmeTEgKiAmeTEgPT0gZ3gxAAA1EhAALgAAAKwAAAAJAAAAEwAAAAwAAAAEAAAAHAAAADUSEAAuAAAAvAAAACwAAAAAAAAAEAAAAAgAAAAdAAAANRIQAC4AAAC3AAAAJAAAADUSEAAuAAAAqAAAACIAAABVbnN1cHBvcnRlZCBoYXNoIGZ1bmN0aW9uOiAAKBYQABsAAAAvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2NvcmUvc3JjL2l0ZXIvdHJhaXRzL2l0ZXJhdG9yLnJzTBYQAFgAAADBBwAACQAAAExlbmd0aCBzaG91bGQgYmUgc21hbGxlciB0aGFuIDJeMTYAALQWEAAiAAAANRIQAC4AAADVAAAABQAAAEJMU19TSUdfQkxTMTIzODFHMV9YTUQ6U0hBLTI1Nl9TU1dVX1JPX05VTF9hc3NlcnRpb24gZmFpbGVkOiBzdGVwICE9IDAAABgPEABZAAAAIwAAAAkAAAA1EhAALgAAAN0AAAAQAAAANRIQAC4AAAABAQAAKQAAADUSEAAuAAAADgEAACkAAAA1EhAALgAAAFEBAAATAAAAVGhlIHJhdGlvIG9mIGRlc2lyZWQgb3V0cHV0IHRvIHRoZSBvdXRwdXQgc2l6ZSBvZiBoYXNoIGZ1bmN0aW9uIGlzIHRvbyBsYXJnZSEAAACIFxAATQAAADUSEAAuAAAAWQEAAAkAAAA1EhAALgAAAF8BAAAVAAAANRIQAC4AAABlAQAAGwAAADUSEAAuAAAAggEAABYAAAA1EhAALgAAAIsBAAAFAAAANRIQAC4AAACPAQAALQAAADExQTA1RjJCMUU4MzMzNDBCODA5MTAxREQ5OTgxNTg1NkIzMDNFODhBMkQ3MDA1RkYyNjI3QjU2Q0RCNEUyQzg1NjEwQzJENUYyRTYyRDZFQUVBQzE2NjI3MzQ2NDlCNzE3Mjk0RUQzRTk0M0FCMkYwNTg4QkFCMjIxNDdBODFDN0MxN0U3NUIyRjZBODQxN0Y1NjVFMzNDNzBEMUU4NkI0ODM4RjJBNkYzMThDMzU2RTgzNEVFRjFCM0NCODNCQkQ1NDAwNURCOTc2NzhFQzFEMTA0OEM1RDEwQTlBMUJDRTAzMjQ3MzI5NTk4M0U1Njg3OEU1MDFFQzY4RTI1Qzk1OEMzRTNEMkEwOTcyOUZFMDE3OUY5REFDOUVEQ0IwMTc3OEU3MTY2RkNDNkRCNzRFMDYwOUQzMDdFNTU0MTJEN0Y1RTQ2NTZBOERCRjI1RjFCMzMyODlGMUIzMzA4MzUzMzZFMjVDRTMxMDcxOTNDNUIzODg2NDFEOUI2ODYxRTk5NzI2QTMxOTlGNDQzNjY0MkI0QjNFNDExOEU1NDk5REI5OTVBMTI1N0ZCM0YwODZFRUI2NTk4MkZBQzE4OTg1QTI4NkYzMDFFNzdDNDUxMTU0Q0U5QUM4ODk1RDkxNjMwQzMyNTBENzMxM0ZGMDFEMTIwMUJGN0E3NEFCNURCM0NCMTdERDk1Mjc5OUI5RUQzQUI5MDk3RTY4RjkwQTA4NzBEMkRDQUU3M0QxOUNEMTNDMUM2NkY2NTI5ODNENkVENjU1M0ZFNDREMjk2QTM3MjZDMzhBRTY1MkJGQjExNTg2MjY0RjBGOENFMTkwMDhFMjE4RjlDODZCMkE4REEyNTEyOEMxMDUyRUNBREREN0YyMjVBMTM5RUQ4NDE3QjgxRTc3MDFBQkRCRTJFODc0Mzg4NEQxMTE3RTUzMzU2REU1QUIyNzVCNERCMUE2ODJDNjJFRjBGMjc1MzMzOUI3QzhGOEM4RjQ3NUFGOUNDQjU2MThFM0YwQzg4RTgwRDNDRjFGOUE3OEZDNDdCOTBCMzM1NjNCRTk5MERDNDNCNzU2Q0U3OUY1NTc0QTJDNTk2QzkyOEM1RDFERTRGQTI5NUYyOTZCNzRFOTU2RDcxOTg2QTg0OTdFMzE3MTY5QjFGOEUxQkNGQTdDNDJFMEMzNzUxNUQxMzhGMjJERDJFQ0I4MDNBMEM1Qzk5Njc2MzE0QkFGNEJCMUI3RkEzMTkwQjJFREMwMzI3Nzk3RjI0MTA2N0JFMzkwQzlFMTAzMjFEQTA3OUNFMDdFMjcyRDhFQzA5RDI1NjVCMERGQTdEQ0NEREU2Nzg3Rjk2RDUwQUYzNjAwM0IxNDg2NkY2OUI3NzFGOEMyODVERUNDQTY3REYzRjE2MDVGQjdCNkUwOEMyNDhFMjYwRTcwQkQxRTk2MjM4MUVERUUzRDMxRDc5RDdFMjJDODM3QkMyM0MwQkYxQkMyNEM2QjY4QzI0QjFCODBCNjREMzkxRkE5QzhCQTJFOEJBMkQyMjk4Q0E4RDU0OENGRjE5QUUxOEIyRTYyRjRCRDNGQTZGMDFENUVGNEJBMzVCNDhCQTlDOTU4ODYxN0ZDOEFDNjJCNTU4RDY4MUJFMzQzREY4OTkzQ0Y5RkE0MEQyMUIxQzEyNTYxQTVERUI1NTlDNDM0OEI0NzExMjk4RTUzNjM2NzA0MUU4Q0EwQ0YwODAwQzAxMjZDMjU4OEM0OEJGNTcxM0RBQTg4NDZDQjAyNkU5RTVDODI3NkVDODJCM0JGRkIyOTYyRkU1N0EzMjI1RTgxMzdFNjI5QkZGMjk5MUY2Rjg5NDE2RjVBNzE4Q0QxRkNBNjRFMDBCMTFBQ0VBQ0Q2QTNEMDk2N0M5NEZFRENGQ0MyMzlCQTVDQjgzRTE5MzQyNTU4MUE1OEFFMkZFQzgzQUFGRUY3QzQwRUI1NDVCMDgyNDNGMTZCMTY1NTE1NENDQThBQkMyOEQ2RkQwNDk3NkQ1MjQzRUVDRjVDNDEzMERFODkzOERDNjJDRDgxM0E4RTE2MjAyMjkxNEE4MEE2RjFENUY0M0U3QTA3REZGREZDNzU5QTEyMDYyQkI4RDZCNDRFODMzQjMwNkRBOUJEMjlCQTgxRjM1NzgxRDUzOUQzOTVCMzUzMkEyMUVFNzM1NUY4RTRFNjY3Qjk1NTM5MEY3RjA1MDZDNkU5Mzk1NzM1RTlDRTlDQUQ0RDBBNDNCQ0VGMjRCODk4MkY3NDAwRDI0QkM0MjI4RjExQzAyREY5QTI5RjYzMDRBNTc3MkNBQUNGMTY5MzYxOTBGM0UwQzYzRTA1OTY3MjE1NzBGNTc5OUFGNTNBMTg5NEUyRTA3MzA2MkFFREU5Q0VBNzNCMzUzOEYwREUwNkNFQzI1NzQ0OTZFRTg0QTNBMTRBN0FDMkE5RDY0QThCMjMwQjNGNUIwNzRDRjAxOTk2RTdGNjNDMjFCQ0E2OEE4MTk5NkUxQ0RGOTgyMkM1ODBGQTVCOTQ4OUQxMUUyRDMxMUY3RDk5QkJEQ0M1QTVFQTEwRUNGNkFEQTU0RjgyNUU5MjBCM0RBRkM3QTNDQ0UwN0Y4RDFENzE2MTM2NkI3NDEwMERBNjdGMzk4ODM1MDM4MjY2OTJBQkJBNDM3MDQ3NzZFQzNBNzlBMUQ2NDE5NUZDMTNBQjlFOTJBRDQ0NzZENkUzRUIzQTU2NjgwRjY4MkI0RUU5NkY3RDAzNzc2REY1MzM5NzhGMzFDMTU5MzE3NEU0QjRCNzg2NTAwMkQ2Mzg0RDE2OEVDREQwQTE5MGQ5N2M4MWJhMjRlZTAyNTlkMWYwOTQ5ODBkY2ZhMTFhZDEzOGU0OGE4Njk1MjJiNTJhZjZjOTU2NTQzZDNjZDBjN2FlZTliM2JhM2MyYmU5ODQ1NzE5NzA3YmIzMzEzNDk5NmExMDRlZTU4MTFkNTEwMzZkNzc2ZmI0NjgzMTIyM2U5NmMyNTRmMzgzZDBmOTA2MzQzZWI2N2FkMzRkNmM1NjcxMTk2MmZhOGJmZTA5N2U3NWEyZTQxYzY5NmNjNzg2YmFhOTY2ZTY2ZjRhMzg0Yzg2YTNiNDk5NDI1NTJlMmQ2NThhMzFjZTJjMzQ0YmU0YjkxNDAwZGE3ZDI2ZDUyMTYyOGIwMDUyM2I4ZGZlMjQwYzcyZGUxZjYxZjg2Mzc2ZTg5ODFjMjE3ODk4NzUxYWQ4NzQ2NzU3ZDQyYWE3YjkwZWViNzkxYzA5ZTRhM2VjMDMyNTFjZjlkZTQwNWFiYTllYzYxZGVjYTYzNTVjNzdiMGU1ZjRjYjhjYzAzZmRlZmUwZmYxMzVjYWY0ZmUyYTIxNTI5YzQxOTU1MzZmYmUzY2U1MGI4Nzk4MzNmZDIyMTM1MWFkYzJlZTdmOGRjMDk5MDQwYTg0MWI2ZGFlY2YyZThmZWRiMTY2MDNmY2E0MDYzNGI2YTIyMTFlMTFkYjhmMGE2YTA3NGE3ZDBkNGFmYWRiN2JkNzY1MDVjM2QzYWQ1NTQ0ZTIwM2Y2MzI2Yzk1YTgwNzI5OWIyM2FiMTM2MzNhNWYwNGFiMGI5YmNmYWMxYmJjYjJjOTc3ZDAyNzc5NmIzY2U3NWJiOGNhMmJlMTg0Y2I1MjMxNDEzYzRkNjM0ZjM3NDdhODdhYzI0NjBmNDE1ZWM5NjFmODg1NWZlOWQ2ZjI5ODdjOGQ1MzMzYWI4NmZkZTk5MjZiZDJjYTZjNjc0MTcwYTA1YmZlM2JkZDgxZmZkMDM4ZGE2YzI2Yzg0MjY0MmY2NDU1MGZlZGZlOTM1YTE1ZTRjYTMxODcwZmIyOTlmYzQwMThiZDk2Njg0YmU4OGM5ZTIyMWU0ZGExYmI4ZjNhYmQxNjY3OWRjMjZjMWU4YjZlNmExZjIwY2FiZTY5ZDY1MjAxYzc4NjA3YTM2MDM3MGU1NzdiZGJhNTg3ZTFiYmE3YTExODZiZGI1MjIzYWJkZTdhZGExNGEyM2M0MmEwY2E3OTE1YWY2ZmUwNjk4NWU3ZWQxZTRkNDNiOWIzZjcwNTVkZDRlYmE2ZjJiYWZhYWViY2E3MzFjMzAxOTcxM2U0NzkzN2NkMWJlMGRmZDBiOGYxZDQzZmI5M2NkMmZjYmNiNmNhZjQ5M2ZkMTE4M2U0MTYzODllNjEwMzFiZjNhNWNjZTNmYmFmY2U4MTM3MTFhZDAxMWMxMzIxOGI0NmE5MDhmMzZmNmRlYjkxOGMxNDNmZWQyZWRjYzUyMzU1OWI4YWFmMGMyNDYyZTZiZmU3ZjkxMWY2NDMyNDlkOWNkZjQxYjQ0ZDYwNmNlMDdjOGE0ZDAwNzRkOGViMTgyY2FjMTAxYjkzOTlkMTU1MDk2MDA0ZjUzZjQ0N2FhN2IxMmEzNDI2YjA4ZWMwMjcxMGU4MDdiNDYzM2YwNmM4NTFjMTkxOTIxMWYyMGQ0YzA0ZjAwYjk3MWVmODI0NWEzOTRhZDFlY2E5YjcyZmMwMGFlN2JlMzE1ZGM3NTdiM2IwODBkNGMxNTgwMTNlNjYzMmQzYzQwNjU5Y2M2Y2Y5MGFkMWMyMzJhNjQ0MmQ5ZDNmNWRiOTgwMTMzNWMxMjk2NDVlNDRjZjExMDJhMTU5Zjc0OGM0YTNmYzVlNjczZDgxZDdlODY1NjhkOWFiMGY1ZDM5NmE3Y2U0NmJhMTA0OWI2NTc5YWZiNzg2NmIxZTcxNTQ3NTIyNGIxNWU2YmU0ZTk5MGYwM2NlNGVhNTBiM2I0MmRmMmViNWNiMTgxZDhmODQ5NjVhMzk1N2FkZDRmYTk1YWYwMWIyYjY2NTAyN2VmZWMwMWM3NzA0YjQ1NmJlNjljOGI2MDQxNjExMmM0YzNhOWM5OGIyNTIxODExNDBmYWQwZWFlOTYwMWE2ZGU1Nzg5ODBiZTZlZWMzMjMyYjViZTcyZTdhMDdmMzY4OGVmNjBjMjA2ZDAxNDc5MjUzYjAzNjYzYzExOTYyZDc1YzIzODEyMDFlMWEwY2JkNmM0M2MzNDhiODg1Yzg0ZmY3MzFjNGQ1OWNhNGExMDM1NmY0NTNlMDFmNzhhNDI2MDc2MzUyOWUzNTMyZjYxMDJjMmU0OWEwM2Q1OGRmMzMwNjY0MGRhMjc2ZmFhYWU3ZDZlOGViMTU3NzhjNDg1NTU1MWFlN2YzMTBjMzVhNWRkMjc5Y2QyZWNhNjc1N2NkNjM2Zjk2Zjg5MWUyNTM4YjUzZGJmNjdmMjE2YjdkMjg4Nzk4ZTUzOTVmMjBkMjNiZjg5ZWRiNGQxZDExNWM1ZGJkZGJjZDMwZTEyM2RhNDg5ZTcyNmFmNDE3MjczNjRmMmMyODI5N2FkYThkMjZkOTg0NDVmNTQxNmJlMGUwNzk1NDVmNDNlNGIwMGNjOTEyZjgyMjhkZGNjNmQxOWM5ZjBmNjliYmIwNTQyZWRhMGZjOWRlYzkxNmEyMGIxNWRjMGZkMmVkZWRkYTM5MTQyMzExYTUwMDFkOGQ5ZTUyOTcxODZkYjJkOWZiMjY2ZWFhYzc4MzE4MmI3MDE1MmM2NTU1MGQ4ODFjNWVjZDg3YjZmMGY1YTY0NDlmMzhkYjlkZmE5Y2NlMjAyYzY0NzdmYWFmOWI3YWMxNjYwMDdjMDhhOTlkYjJmYzNiYTg3MzRhY2U5ODI0YjVlZWNmZGZhOGQwY2Y4ZWY1ZGQzNjViYzQwMGEwMDUxZDVmYTljMDFhNThiMWZiOTNkMWExMzk5MTI2YTc3NWMxNmEzZWYwOGJlM2VhN2VhMDNiY2RkZmFiYmE2ZmY2ZWU1YTQzNzVlZmExZjRmZDdmZWIzNGZkMjA2MzU3MTMyYjkyMGY1YjAwODAxZGVlNDYwZWU0MTVhMTU4MTJlZDkxODY2YzhlZDMzNmM2MTIzMWExYmU1NGZkMWQ3NGNjNGY5ZmIwY2U0YzZhZjU5MjBhYmM1NzUwYzRiZjM5YjQ4NTJjZmUyZjdiYjkyNDg4MzZiMjMzZDlkNTU1MzVkNGExNjdhNTVjZGE3MGE2ZTFjZWE4MjA1OTdkOTRhODQ5MDMyMTZmNzYzZTEzZDg3YmI1MzA4NTkyZTdlYTdkNGZiYzczODVlYTNkNTI5YjM1ZTM0NmVmNDhiYjg5MTNmNTU0ZDJmMjU5ZWVhNDA1YmQ0OGYwMTBhMDFhZDI5MTFkOWM2ZGQwMzliYjYxYTYyOTBlNTkxYjM2ZTYzNmE1Yzg3MWE1YzI5ZjRmODMwNjA0MDBmOGI0OWNiYThmNmFhOGFjY2JiNjc0ODFkMDMzZmY1ODUyYzFlNDhjNTBjNDc3Zjk0ZmY4YWVmY2U0MmQyOGMwZjlhODhjZWE3OTEzNTE2Zjk2ODk4NmY3ZWJiZWE5Njg0YjUyOWUyNTYxMDkyYWQ2Yjk1MTRjNzY3ZmUzYzM2MTMxNDRiNDVmMTQ5NjU0MzM0NmQ5OGFkZjAyMjY3ZDVjZWVmOWEwMGQ5Yjg2OTMwMDA3NjNlM2I5MGFjMTFlOTliMTM4NTczMzQ1Y2MyNjYwNDAwZWIyZTRmM2I2MjhiZGQwZDUzY2Q3NmYyYmY1NjViOTRlNzI5MjdjMWNiNzQ4ZGYyNzk0MjQ4MGU0MjA1MTdiZDg3MTRjYzgwZDFmYWRjMTMyNmVkMDZmN2UwZmExZDgxNmRkYzAzZTZiMjQyNTVlMGQ3ODE5YzE3MWM0MGY2NWUyNzNiODUzMzI0ZWZjZDYzNTZjYWEyMDVjYTJmNTcwZjEzNDk3ODA0NDE1NDczYTFkNjM0YjhmAAAAAAAAAAEAAAABAAAAHgAAADUSEAAuAAAA4QEAADoAAAA1EhAALgAAAOABAACYAAAANRIQAC4AAADfAQAAmAAAADUSEAAuAAAA3gEAAJgAAAA1EhAALgAAAN0BAACYAAAANRIQAC4AAADcAQAAmAAAADUSEAAuAAAA2wEAAJkAAAA1EhAALgAAANoBAACZAAAANRIQAC4AAADZAQAAmQAAADUSEAAuAAAA2AEAAJkAAAA1EhAALgAAANcBAACYAAAANRIQAC4AAADWAQAAmAAAADUSEAAuAAAA1QEAAJkAAAA1EhAALgAAANQBAACYAAAANRIQAC4AAADTAQAAmQAAADUSEAAuAAAA0gEAAJkAAAA1EhAALgAAAM0BAACZAAAANRIQAC4AAADMAQAAmAAAADUSEAAuAAAAywEAAJgAAAA1EhAALgAAAMoBAACYAAAANRIQAC4AAADJAQAAmQAAADUSEAAuAAAAyAEAAJkAAAA1EhAALgAAAMcBAACYAAAANRIQAC4AAADGAQAAmAAAADUSEAAuAAAAxQEAAJgAAAA1EhAALgAAAMQBAACYAAAANRIQAC4AAADDAQAAmQAAADUSEAAuAAAAwgEAAJgAAAA1EhAALgAAAMEBAACYAAAANRIQAC4AAADAAQAAlwAAADUSEAAuAAAAvwEAAJkAAAA1EhAALgAAAL4BAACYAAAANRIQAC4AAAC3AQAAOgAAADUSEAAuAAAAtgEAAJgAAAA1EhAALgAAALUBAACYAAAANRIQAC4AAAC0AQAAmQAAADUSEAAuAAAAswEAAJgAAAA1EhAALgAAALIBAACYAAAANRIQAC4AAACxAQAAmQAAADUSEAAuAAAAsAEAAJgAAAA1EhAALgAAAK8BAACYAAAANRIQAC4AAACuAQAAmQAAADUSEAAuAAAArQEAAJgAAAA1EhAALgAAAKgBAACYAAAANRIQAC4AAACnAQAAmQAAADUSEAAuAAAApgEAAJkAAAA1EhAALgAAAKUBAACYAAAANRIQAC4AAACkAQAAmQAAADUSEAAuAAAAowEAAJgAAAA1EhAALgAAAKIBAACZAAAANRIQAC4AAAChAQAAmAAAADUSEAAuAAAAoAEAAJkAAAA1EhAALgAAAJ8BAACYAAAANRIQAC4AAACeAQAAmQAAADUSEAAuAAAAnQEAAJkAAABub3QgaW1wbGVtZW50ZWQ6IElzb2dlbnkgZm9yIGN1cnZlICBpcyBub3QgaW1wbGVtZW50ZWQAAIQvEAAjAAAApy8QABMAAAA1EhAALgAAAOcBAAAVAAAANRIQAC4AAAD0AQAAEwAAADUSEAAuAAAA9gEAABMAAAA1EhAALgAAAAwCAAAKAAAANRIQAC4AAAAUAgAALgAAADUSEAAuAAAAJgIAAAUAAAA1EhAALgAAADICAAAJAAAANRIQAC4AAAAuAgAACQAAADUSEAAuAAAAKgIAACIAAAA4OTkwZTdhOWFhZWQyZmZlZDczZGJkNzA5MjEyM2Q2ZjI4OTkzMDU0MGQ3NjUxMzM2MjI1ZGMxNzJlNTFiMmNlNTJkYjliYTcwZTBjYzBmNmVhZjc4MDNkZDA3NDQ3YTFmNTQ3NzczNWZkM2Y2NjE3OTJiYTk0NjAwYzg0ZTk3MTUSEAAuAAAAcAIAABIAAABJbnZhbGlkIGVuY29kaW5nSW52YWxpZCBlbmNvZGluZyBmb3IgcG9pbnQgYXQgaW5maW5pdHlJbnZhbGlkIGxlbmd0aCBmb3IgdW5jb21wcmVzc2VkIHBvaW50OiAAAAAiMRAAJwAAAG5vdCBpbXBsZW1lbnRlZDogRGVjb2Rpbmcgb2YgY29tcHJlc3NlZCBHMiBwb2ludHMgbm90IHlldCBzdXBwb3J0ZWQAVDEQAEMAAAA1EhAALgAAAKoCAAANAAAASW52YWxpZCBsZW5ndGggZm9yIGNvbXByZXNzZWQgcG9pbnQ6IAAAALAxEAAlAAAAVW5rbm93biBjaGFpbiBoYXNoOiDgMRAAFAAAAGQxZmVjNzU4YzkyMWNjMjJiMGUxN2U2M2FhZjRiY2I1ZWQ2NjMwNGRlOWNmODA5YmQyNzRjYTczYmFiNGFmNWE2ZTljNzZhNGJjMDllNzZlYWU4OTkxZWY1ZWNlNDVhM2NmMGYyODk2YWRlZTdlYjhiNWYwMWZjYWQzOTEyMjEyYzQzN2UwMDczZTkxMWZiOTAwMjJkM2U3NjAxODNjOGM0YjQ1MGI2YTBhNmMzYWM2YTU3NzZhMmQxMDY0NTFlNWRiMmI2YmZiYjAxYzg2Nzc0OWNhZGZmY2E4OGIzNmMyNGYzMDEyYmEwOWZjNGQzMDIyYzVjMzdkY2UwZjk3N2QzYWRiNWQxODNjNzQ3N2M0NDJiMWYwNDUxNTI3MzFhNzE0ZjJlZGI3NDExOWEyZjJiMGQ1YTdjNzViYTkwMmQxNjM3MDBhNjFiYzIyNGVkZWRkOGU2M2FlZjdiZTFhYWY4ZTkzZDdhOTcxOGIwNDdjY2RkYjNlYjVkNjhiZjQ3N2Q1Yzg5ZjIxYTE3Yzg2M2E3ZjkzN2M2YTZkMTU4NTk0MTRkMmJlMDljZDQ0OGQ0Mjc5YWYzMzFjNWQzZWJscy11bmNoYWluZWQtZzEtcmZjOTM4MDUSEAAuAAAA3wIAAEQAAAA2OGYwMDVlYjhlNmU0Y2EwYTQ3YzhhNzdjZWFhNTMwOWE0Nzk3OGE3YzcxYmM1Y2NlOTYzNjZiNWQ3YTU2OTkzN2M1MjllZWRhNjZjNzI5Mzc4NGE5NDAyODAxYWYzMTI2ZmE1ZWVmMTQzYWFhMTdjNTNiM2MxNTBkOTZhMTgwNTFiNzE4NTMxYWY1NzY4MDNjZmI5YWNmMjliODc3NGE4MTg0ZTYzYzYyZGE4MWRkZjRkNzZmYjBhNjU4OTVjMTc2ZjkzNDk4ZWFjOWNhMzM3MTUwYjQ2ZDIxZGQ1ODY3M2VhNGUzNTgxMTg1Zjg2OTY3MmU1OWZhNGNiMzkwYXBlZGVyc2VuLWJscy1jaGFpbmVkAAA1EhAALgAAAMoCAABLAAAANRIQAC4AAAD5AgAAKwAAAAAAAAABAAAAAQAAAB8AAAA1EhAALgAAAPkCAABFAAAAdG9vbHMvZ2FyYWdhX3JzL3NyYy9jYWxsZGF0YS9mdWxsX3Byb29mX3dpdGhfaGludHMvZ3JvdGgxNi5ycwAAADQ1EAA9AAAAUgAAABAAAAA0NRAAPQAAAFUAAAAQAAAANDUQAD0AAABdAAAALwAAAAAAAABTUDEgcHVibGljIGlucHV0cyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzIgYnl0ZXOoNRAAMAAAADQ1EAA9AAAAZAAAAA0AAAA0NRAAPQAAAGwAAAAQAAAANDUQAD0AAABxAAAAIgAAADQ1EAA9AAAAcgAAACIAAAA0NRAAPQAAAHMAAAAiAAAANDUQAD0AAAB0AAAAIgAAADQ1EAA9AAAAdgAAABQAAAA0NRAAPQAAAHwAAAAQAAAAQ2Fubm90IGhhdmUgYm90aCBSSVNDMCBhbmQgU1AxIG1vZGVzIGVuYWJsZWRgNhAALAAAADQ1EAA9AAAAeQAAAA0AAAA0NRAAPQAAAFwBAAAWAAAANDUQAD0AAABeAQAAFgAAADQ1EAA9AAAAYgEAACQAAAA0NRAAPQAAAGMBAAAkAAAANDUQAD0AAABrAQAADgAAADQ1EAA9AAAAcQEAAA0AAABVbnN1cHBvcnRlZCBjdXJ2ZSBJRCBmb3IgdmtfeAAAAAQ3EAAdAAAANDUQAD0AAAB+AQAADgAAADQ1EAA9AAAAkQEAAB0AAAA0NRAAPQAAAJYBAAAiAAAANDUQAD0AAACOAQAAVgAAAEZhaWxlZCB0byBjb252ZXJ0IEpzVmFsdWUgdG8gc3RyaW5ndG9vbHMvZ2FyYWdhX3JzL3NyYy93YXNtX2JpbmRpbmdzLnJzAI83EAAkAAAA/AAAAAwAAABGYWlsZWQgdG8gY29udmVydCBzdHJpbmcgdG8gQmlnVWludEZhaWxlZCB0byBwYXJzZSBHMVBvaW50QmlnVWludHh5RmFpbGVkIHRvIHBhcnNlIEcyUG9pbnRCaWdVaW50eCBpcyBub3QgYW4gYXJyYXl5IGlzIG5vdCBhbiBhcnJheXB1YmxpY19pbnB1dHMgaXMgbm90IGFuIGFycmF5jzcQACQAAABpAQAAEAAAAGljIGlzIG5vdCBhbiBhcnJheQAAAAAAADAAAAAIAAAAIAAAAAAAAAAEAAAABAAAACEAAABHMVBvaW50aXNvX3BvaW50Qk4yNTRCTFMxMl8zODFTRUNQMjU2SzFTRUNQMjU2UjFYMjU1MTlHUlVNUEtJTgAArw4QAGkAAAAkAQAADgAAAEZhaWxlZCB0byBjb252ZXJ0IHZhbHVlIHRvIHU4bWVzc2FnZSBtdXN0IGJlIGEgVWludDhBcnJheQAAACIAAAAEAAAABAAAACMAAACPNxAAJAAAAIUBAAA7AAAAjzcQACQAAACCAQAAOwAAAI83EAAkAAAAnQEAAEEAAACPNxAAJAAAAJoBAABBAAAAcHJvb2ZfanMgaXMgbm90IGFuIG9iamVjdGFicHVibGljSW5wdXRzaW1hZ2VJZEpvdXJuYWxSaXNjMGltYWdlSWRKb3VybmFsUmlzYzAgaXMgbm90IGFuIG9iamVjdGltYWdlSWRpbWFnZUlkIGlzIG5vdCBhIFVpbnQ4QXJyYXlqb3VybmFsam91cm5hbCBpcyBub3QgYSBVaW50OEFycmF5dmtleVB1YmxpY1ZhbHVlc1NwMXZrZXlQdWJsaWNWYWx1ZXNTcDEgaXMgbm90IGFuIG9iamVjdHZrZXl2a2V5IGlzIG5vdCBhIFVpbnQ4QXJyYXlwdWJsaWNWYWx1ZXNwdWJsaWNWYWx1ZXMgaXMgbm90IGEgVWludDhBcnJheXZrX2pzIGlzIG5vdCBhbiBvYmplY3RhbHBoYWJldGFnYW1tYWRlbHRhaWNjdXJ2ZV9pZF9qcyBpcyBub3QgYSBudW1iZXJGYWlsZWQgdG8gcGFyc2UgeSBpbnB1dCBhcyBoZXhGYWlsZWQgdG8gcGFyc2UgeCBpbnB1dCBhcyBoZXgABQAAAAkAAAAJAAAACQAAAAYAAAAIAAAAuDgQAL04EADGOBAAzzgQANg4EADeOBAAAAAAAAQAAAAAAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9jb252ZXJ0LnJzAABkOxAAZgAAAPABAAAWAAAAZDsQAGYAAAD/AQAAFgBBwPjAAAulBy9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvY29yZS9zcmMvaXRlci90cmFpdHMvaXRlcmF0b3IucnNAPBAAWAAAAMEHAAAJAAAAdG9vbHMvZ2FyYWdhX3JzL3NyYy9jcnlwdG8vcG9zZWlkb25fYm4yNTQucnOoPBAALAAAAGYAAAAbAAAAqDwQACwAAABwAAAAQgAAAKg8EAAsAAAAcAAAAEsAAAB0b29scy9nYXJhZ2FfcnMvc3JjL2lvLnJzAAAABD0QABkAAAAZAAAAIwAAAAQ9EAAZAAAAGQAAADUAAAAEPRAAGQAAACcAAAAjAAAABD0QABkAAAAnAAAANQAAAAQ9EAAZAAAAKQAAABIAAAAEPRAAGQAAACkAAAAkAAAABD0QABkAAAAqAAAAEgAAAAQ9EAAZAAAAKgAAACQAAAB0b29scy9nYXJhZ2FfcnMvc3JjL3BhaXJpbmcvbXVsdGlfcGFpcmluZ19jaGVjay5ycwAAoD0QADIAAAB7AQAAIQAAAKA9EAAyAAAAfQEAACYAAACgPRAAMgAAAKYBAAAYAAAAoD0QADIAAACnAQAAGQAAAKA9EAAyAAAAqQEAAB4AAAAAAAAABAAAAAAAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2NvbnZlcnQucnMAADA+EABmAAAA8AEAABYAAAAwPhAAZgAAAP8BAAAWAAAAYXR0ZW1wdCB0byBkaXZpZGUgYnkgemVybwAAALg+EAAZAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9kaXZpc2lvbi5ycwDcPhAAZwAAAHAAAAAJAAAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQAv3weawXcKDixGeXhvo25mPQvH9SjreAqdDY/FjUNd05PkgPrDXvYVbexWopcaB1xFV1JwU1jOd7pYx1NXmEhfAgAMxAsA9Ov9/wIAAAAJdigAAAAMAAAABAAAACkAAAAqAAAAFgBB8P/AAAvxBgEAAAArAAAAYSBEaXNwbGF5IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHVuZXhwZWN0ZWRseS9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAAL0AQAEsAAADRCgAADgAAAEVycm9yAAAAL0AQAEsAAAB9BQAAGwAAAFBvaW50Tm90SW5TdWJncm91cERpdmlzaW9uQnlaZXJvSW52YWxpZEhleFN0cmluZ0ludmFsaWREZWNTdHJpbmdIZXhTdHJpbmdJc1Rvb0JpZ0VtcHR5U3RyaW5nAAAAAAQAAAAEAAAAAwAAAFJvb3RPZlVuaXR5RXJyb3JJbnZaZXJvRXJyb3IAAAAAZ+YJaoWuZ7ty8248OvVPpX9SDlGMaAWbq9mDHxnN4FsvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2FsbG9jL3NyYy9zbGljZS5ycwAAUEEQAEoAAACoAQAAHwAAAFBBEABKAAAAvgEAAB0AAABJbnZhbGlkUG9pbnRQb2ludCAoKCwgKSwgKCkpIGlzIG5vdCBvbiB0aGUgY3VydmXIQRAACAAAANBBEAACAAAA0kEQAAQAAADQQRAAAgAAANZBEAAWAAAARzIgZ2VuZXJhdG9yIGNvb3JkaW5hdGVzIG5vdCBkZWZpbmVkIGZvciB0aGlzIGN1cnZldG9vbHMvZ2FyYWdhX3JzL3NyYy9hbGdlYnJhL2cycG9pbnQucnMAAABHQhAAJgAAAFcAAAAOAAAAR0IQACYAAABaAAAADgAAACgAAAAMAAAABAAAACQAAABHQhAAJgAAAFsAAAAwAAAAAAAAABAAAAAIAAAALAAAAEdCEAAmAAAAZAAAAB8AAABHQhAAJgAAAGgAAAApAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC5ycwAA4EIQAF4AAAAsAAAAHQAAAAAAAABHQhAAJgAAALsAAAAcAEHshsEAC4UOAQAAACUAAABHQhAAJgAAALQAAABJAAAAdG9vbHMvZ2FyYWdhX3JzL3NyYy9jYWxsZGF0YS9kcmFuZF90bG9ja19jYWxsZGF0YS5yc0ludmFsaWQgcm91bmQgbnVtYmVyOiAAALhDEAAWAAAAhEMQADQAAAAvAAAAMgAAAIRDEAA0AAAANAAAAA8AAABhc3NlcnRpb24gZmFpbGVkOiBjYWxsX2RhdGEubGVuKCkgPT0gMSArIHNpemUAAACEQxAANAAAADYAAAAFAAAASW52YWxpZCByYW5kb21uZXNzIGFycmF5IGxlbmd0aDogAAAAOEQQACEAAABJbnZhbGlkIG1lc3NhZ2UgYXJyYXkgbGVuZ3RoOiAAAGREEAAeAAAASW52YWxpZCBkYXRhIGFycmF5IGxlbmd0aDogAIxEEAAbAAAAhEMQADQAAABNAAAAFwAAAIRDEAA0AAAASgAAABcAAABzaGEyNTZJQkUtSDNJQkUtSDIvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2NvcmUvc3JjL2l0ZXIvdHJhaXRzL2l0ZXJhdG9yLnJzAADiRBAAWAAAAMEHAAAJAAAASUJFLUg0AAAoAAAADAAAAAQAAAAtAAAAhEMQADQAAACPAAAAGgAAAGFzc2VydGlvbiBmYWlsZWQ6IGxlbiA8PSA0OACEQxAANAAAAHoAAAANAAAA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AAB5AAAAQwAAAJhMEAAsAAAAiQAAABUAAACYTBAALAAAAIkAAAAsAAAAmEwQACwAAACJAAAAEAAAAEludmFsaWQgY3VydmUgSUQ6IAAANE0QABIAAABubyBlbnRyeSBmb3VuZCBmb3Iga2V5dG9vbHMvZ2FyYWdhX3JzL3NyYy9kZWZpbml0aW9ucy5yc2ZNEAAiAAAAowAAADsAAAAweDMwNjQ0RTcyRTEzMUEwMjlCODUwNDVCNjgxODE1ODVEOTc4MTZBOTE2ODcxQ0E4RDNDMjA4QzE2RDg3Q0ZENDcweDFBMDExMUVBMzk3RkU2OUE0QjFCQTdCNjQzNEJBQ0Q3NjQ3NzRCODRGMzg1MTJCRjY3MzBEMkEwRjZCMEY2MjQxRUFCRkZGRUIxNTNGRkZGQjlGRUZGRkZGRkZGQUFBQjB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkMyRjB4RkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjB4N0ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRDB4MzA2NDRFNzJFMTMxQTAyOUI4NTA0NUI2ODE4MTU4NUQyODMzRTg0ODc5Qjk3MDkxNDNFMUY1OTNGMDAwMDAwMXRvb2xzL2dhcmFnYV9ycy9zcmMvZnJvYmVuaXVzLnJzRE8QACAAAAAPAAAAOQAAAGFzc2VydGlvbiBmYWlsZWQ6IHguY29lZmZpY2llbnRzLmxlbigpIDw9IGV4dF9kZWdyZWVETxAAIAAAABAAAAAFAAAARE8QACAAAAAXAAAADgAAAERPEAAgAAAAFQAAACwAAAAxMTIxZDhjOGRhZWYzZWVlMWU4MWIyNTIyZWM1ZWIyOGRlZDY4OTVlMWNkZmRlNmE0M2Y1ZGFhOTcxZjNmYTY1OTU1MjE3ZTQwMGRjOTM1MWU3NzRlMzRlMmFjMDZlYWQ0MDAwZDE0ZDFlMjQyYjI5YzU2N2U5YzM4NWNlNDgwYTcxYTI0MmI3MTkwNjJmNjczN2I4NDgxZDIyYzY5MzRjZTg0NGQ3MmYyNTBmZDI4ZDEwMmMwZDE0N2IyZjRkNTIxYTczNTk4MDkwOTRiZDVjOGUxYjljMjJkODEyNDZmZmMyZTc5NGUxNzY0M2FjMTk4NDg0YjhkOTA5NGFhODI1MzYyMTQzNmQ0OGZjYjUwY2M2MGRkNGVmMWU2OWEwYzFmMGRkMjk0OWZhNmRmN2I0NGNiYjI1OWVmN2NiNThkNWVkMTg4NTdhNThmM2I1YmIzMDM4YTQzMTFhODY5MTlkOWM3YzZjMTVmODhhNGY0ZjA4MzEzNjRjZjM1Zjc4Zjc3MTJjODRiYmFkMjdjMzY3MTU2MmI3YWRlZmQ0NDAzOGFiM2MwYmJhZDk2ZmMwMDhlN2Q2OTk4YzgyZjdmYzA0OGJjMzNiMWM3MGU0ZmQxMWI2ZDFlYWI2ZmNkMThiOTlhZDRhZmQwOTZhODY5N2UwYzljMzZkOGNhMzMzOWE3YjUxYjAwNzI5NGE1NWFjY2NlMTNmZTA4YmVhNzMzMDVmZjZiZGFjNzdjNTM3MWM1NDZkNDI4NzgwYTZlM2RjZmE4MjE1ZDQyZTdhYzdiZDE3Y2VmZTg4ZGQ4ZTY5NjViM2FkYWU5MmM5NzRmNTAxZmU4MTE0OTNkNzI1NDNhMzk3NzMwNjQ0ZTcyZTEzMWEwMjliODUwNDViNjgxODE1ODVkOTc4MTZhOTE2ODcxY2E4ZDNjMjA4YzE2ZDg3Y2ZkNDYyNDY5OTZmM2I0ZmFlN2U2YTYzMjdjZmUxMjE1MGI4ZTc0Nzk5Mjc3OGVlZWM3ZTVjYTVjZjA1ZjgwZjM2MmFjMTJkN2MwYzNlZDQyYmU0MTlkMmIyMmNhMjJjZWNhNzAyZWViODhjMzZhOGIyNjRkZGU3NWY0Zjc5OGQ2YTNmMjE2YzllNTUwNjFlYmFlMjA0YmE0Y2M4YmQ3NWEwNzk0MzJhZTJhMWQwYjdjOWRjZTE2NjVkNTFjNjQwZmNiYTJjMzhkY2UyN2UzYjJjYWUzM2NlNzM4YTE4NGM4OWQ5NGEwZTc4NDA2YjQ4Zjk4YTdiNGY0NDYzZTNhN2RiYTA3YzAzY2JjYWM0MTA0OWEwNzA0YjVhN2VjNzk2ZjJiMjE4MDdkYzk4ZmEyNWJkMjgyZDM3ZjYzMjYyM2IwZTNmMjBlMTI5ZTQ3YzkzNjNhYTdiNTY5ODE3ZTA5NjZjYmE1ODIwOTZmYTdhMTY0MDgwZmFlZDFmMGQyNDI3NWEyYzE0NWVkYmU3ZmQ4YWVlOWYzYTgwYjAzYjBiMWM5MjM2ODVkMmVhMWJkZWM3NjNjMTNiNDcxMWNkMmI4MTI2M2RmOTJjNWI5NmUzOTE0NTU5ODk3YzZhZDQxMWZiMjViNzVhZmI3ZjhiMWMxYTU2NTg2ZmY5M2UwODBmOGJjMTJhY2YyY2E3NmZkMDY3NWEyN2ZiMjQ2Yzc3MjlmN2RiMDgwY2I5OTY3OGUyYWMwMjRjNmI4ZWU2ZTBjMmM0YjE1NjNkYmRlM2JkNmQzNWJhNDUyM2NmN2RhNGU1MjVlMmJhNmEzMTUxNTAwMDU0NjY3ZjgxNDBjNmEzZjJkOWYzMDY0NGU3MmUxMzFhMDI5NWU2ZGQ5ZTdlMGFjY2NiMGMyOGYwNjlmYmI5NjZlM2RlNGJkNDRlNTYwN2NmZDQ5MzA2NDRlNzJlMTMxYTAyOTVlNmRkOWU3ZTBhY2NjYjBjMjhmMDY5ZmJiOTY2ZTNkZTRiZDQ0ZTU2MDdjZmQ0ODU5ZTI2YmNlYTBkNDhiYWNkNGYyNjNmMWFjZGI1YzRmNTc2MzQ3MzE3N2ZmZmZmZTU5ZTI2YmNlYTBkNDhiYWNkNGYyNjNmMWFjZGI1YzRmNTc2MzQ3MzE3N2ZmZmZmZjEzZDBjMzY5NjE1ZjdiYjBiMmJkZmE4ZmVmODVmYTA3MTIyYmRlOGQ2N2RmYzhmYWJkMzU4MWFkODQwZGRkNzYxOGEwZjQyMTlmNGZkZmY2ZmMyYmY1MzFlYjMzMWEwNTNhMzU3NDRjYWMyODVhZjU2ODVkM2Y5MGVhY2Y3YTY2YzNhNWU5YzQ2MmE2NTQ3NzljM2UwNTBjOWNhMmE0Mjg5MDhhODEyNjRlMmI1YTViZjIyZjY3NjU0ODgzYWU2MmNlMDJhYTVmOWJmOGNkNjViZGQyMDU1YzI1NWNmOWQ5ZTA4YzFkOTM0NTU4MmNjOTJmZDk3M2M3NGJkNzdmNDE3ZGVkNDE5ZWQ3YmU0Zjk3ZmFjMTQ5YmZhZWZiYWMxMWIxNTU0OThkZTIyN2I4NTBhZWEzZjIzNzkwNDA1ZDYxYmZlN2IyMTRjMDI5NDI0MmZiODFhOGRjY2Q4YTliNDQ0MWQ2NGYzNDE1MGE3OTc1M2ZiMGNkMzFjYzk5Y2MwNjk3YjljNTIzZTAzOTBlZDE1ZGEwZWM5N2E5YjgzNDY1MTMyOTdiOWVmYWYwZjBmMWEyMjhmMGQ1NjYyZmJkN2EwZTA1MmYyYjFjNDQzYjUxODZkNmFjNGM3MjNiODVkM2Y3OGEzMTgyZDJkYjBjNDEzOTAxYzMyYjBjNmZlMWI3NmEzN2ZiYTg1ZjNjZDVkYzc5ODI0YTM3OTI1OTczNTZjODkyYzM5YzBkMDZiMjIwNTAwOTMzOTQ1MjY3ZmFiZjhiNjBiZTc3ZDczMDZjYmVlZTMzNTc2MTM5ZDdmMDNhNWUzOTdkNDM5ZWM3Njk0YWEyYmY0YzBjMTAxMWM5MzhiMDk3ZmQyMjQ3OTA1OTI0YjI2OTFmYjVlNTY4NTU1OGMwNDAwOTIwMTkyN2VlYjBhNjk1NDZmMWZkMTRmMWRlNDFiM2QxNzY2ZmE5ZjMwZTZkZWMyNjA5NGYwZmRmMzFiZjk4ZmYyNjMxMzgwY2FiMmJhYWE1ODZkZTI0MjllZmQ2OWIwNzNhZTIzZThjNjU2NWI3YjcyZTFiMGU3OGMyN2YwMzhmMTRlNzdjZmQ5NWEwODNmNGMyNjEyOGE0MTFiNjM0ZjA5YjhmYjE0YjkwMGU5NTA3ZTkzMjc2MDBlY2M3ZDhjZjZlYmFiOTRkMGNiM2IyNTk0YzY0MjNkNWU5OTllMTkxMGExMmZlYjBmNmVmMGNkMjFkMDRhNDRhOWUwODczN2Y5NmU1NWZlM2VkOWQ3MzBjMjM5ZjE0NjVkMzUxOTUyZjBjMDU4ODk4MmIyOGI0YThhZWE5NTM2NDA1OWUyNzIxMjJmNWU4MjU3ZjQzYmJiMzYwODcxNmRiMzY2YTU5YjFkZDBiOWZiMWIyMjgyYTQ4NjMzZDNlMmRkYWVhMjAwMjgwMjExZjI1MDQxMzg0MjgyNDk5MjhjMzZlMWZlZTdmZGJlNjAzMzdkODRiYmNiYTM0YTUzYTQxZjFlZTUwNDQ5Y2RjNzgwY2ZiZmFhNWNjMzY0OQAAAAAAAQAAAAEAAAA4AAAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQBETxAAIAAAAKYAAAB1AAAARE8QACAAAAClAAAAdAAAAERPEAAgAAAAogAAAHUAAABETxAAIAAAAKEAAAB0AAAARE8QACAAAACeAAAAdAAAAERPEAAgAAAAnQAAAHQAAABETxAAIAAAAJoAAAB0AAAARE8QACAAAACZAAAAcwAAAERPEAAgAAAAlgAAAHQAAABETxAAIAAAAJUAAAByAAAARE8QACAAAACSAAAAdAAAAERPEAAgAAAAjwAAAHUAAABETxAAIAAAAI4AAABzAAAARE8QACAAAACLAAAAdAAAAERPEAAgAAAAigAAAHQAAABETxAAIAAAAIcAAAB0AAAARE8QACAAAACGAAAAcwAAAERPEAAgAAAAgwAAAHQAAABETxAAIAAAAIIAAABzAAAARE8QACAAAAB/AAAAdAAAAERPEAAgAAAAfgAAAHQAAABETxAAIAAAAHsAAAA2AAAARE8QACAAAAB6AAAANQAAAERPEAAgAAAAdQAAAGUAAABETxAAIAAAAHIAAABlAAAARE8QACAAAABvAAAAdAAAAERPEAAgAAAAbAAAAHQAAABETxAAIAAAAGkAAAB0AAAARE8QACAAAABmAAAANQAAAERPEAAgAAAAYwAAAGQAAABETxAAIAAAAGAAAABkAAAARE8QACAAAABdAAAAdAAAAERPEAAgAAAAWgAAAHQAAABETxAAIAAAAFcAAAB0AAAARE8QACAAAABUAAAANQAAAERPEAAgAAAATwAAAHUAAABETxAAIAAAAE4AAAB0AAAARE8QACAAAABLAAAAdAAAAERPEAAgAAAASgAAAHQAAABETxAAIAAAAEcAAABzAAAARE8QACAAAABGAAAAcwAAAERPEAAgAAAAQwAAAHMAAABETxAAIAAAAEIAAAB0AAAARE8QACAAAAA/AAAAdAAAAERPEAAgAAAAPgAAAHQAAABETxAAIAAAADsAAAB0AAAARE8QACAAAAA4AAAAdQAAAERPEAAgAAAANwAAAHQAAABETxAAIAAAADQAAAB0AAAARE8QACAAAAAzAAAAdAAAAERPEAAgAAAAMAAAAHQAAABETxAAIAAAAC8AAAB0AAAARE8QACAAAAAsAAAAcwAAAERPEAAgAAAAKwAAAHQAAABETxAAIAAAACgAAAB0AAAARE8QACAAAAAnAAAAdAAAAERPEAAgAAAAJAAAADYAAABETxAAIAAAACMAAAA1AAAAMjE4MDg5NTkzY2JmNjI2MzUzOTQ3ZDViMWZkMGM2ZDY2YmIzNGJjNzU4NWY1YWJkZjhmMTdiNTBlMTJjNDdkNjVjZTUxNGE3YzE2N2IwMjdiNjAwZmViZGIyNDQ3MTRjNTVmMTk2NzJmZGY3NmNlNTFiYTY5YzYwNzZhMGY3N2VhZGRiM2E5M2JlNmY4OTY4OGRlMTdkODEzNjIwYTAwMDIyZTAxZmZmZmZmZmVmZmZmZDVlMWMwODZmZmU4MDE2ZDA2M2M2ZGFkN2EyZmZmYzkwNzJiYjU3ODVhNjg2YmNlZmVlZGMyZTAxMjQ4MzhiZGNjZjMyNWVlNWQ4MGJlOTkwMjEwOWY3ZGJjNzk4MTIxYTAxMTFlYTM5N2ZlNjk5ZWMwMjQwODY2M2Q0ZGU4NWFhMGQ4NTdkODk3NTlhZDQ4OTdkMjk2NTBmYjg1ZjliNDA5NDI3ZWI0ZjQ5ZmZmZDhiZmQwMDAwMDAwMGFhYWQxYTAxMTFlYTM5N2ZlNjk5OGNlOGQ5NTY4NDVlMTAzM2VmYTNiZjc2MWY2NjIyZTlhYmM5ODAyOTI4YmZjOTEyNjI3YzRmZDdlZDNmZmZmYjVkZmIwMDAwMDAwMWFhYWZiNjU5ZmIyMDI3NGJmYjFiZThmZjRkNjkxNjNjMDhiZTczMDJjNDgxODE3MWZkZDE3ZDViZTliMWQzODBhY2Q4Yzc0N2NkYzRhZmYwZTY1MzYzMWY1ZDMwMDBmMDIyYzFhMDExMWVhMzk3ZmU2OWE0YjFiYTdiNjQzNGJhY2Q3NjQ3NzRiODRmMzg1MTJiZjY3MzBkMmEwZjZiMGY2MjQxZWFiZmZmZWIxNTNmZmZmYjlmZWZmZmZmZmZmYWFhYWZjM2UyYjM2YzRlMDMyODhlOWU5MDIyMzFmOWZiODU0YTE0Nzg3YjZjN2IzNmZlYzBjOGVjOTcxZjYzYzVmMjgyZDVhYzE0ZDZjN2VjMjJjZjc4YTEyNmRkYzRhZjMxZjg3YzU2NmQ4OWMwNjUxMWQzZDIwNDQ2M2YzZjcwYTk0MjhmMGY2ZDhmNjZkZmQ4MTkxZDkyZTNlYzc4YmU1MDVhYjU4MjlhZDhmZDg0NTllZjE0MjRkYmI4OTVlNjFhMDExMWVhMzk3ZmU2OTllYzAyNDA4NjYzZDRkZTg1YWEwZDg1N2Q4OTc1OWFkNDg5N2QyOTY1MGZiODVmOWI0MDk0MjdlYjRmNDlmZmZkOGJmZDAwMDAwMDAwYWFhYzZhZjBlMDQzN2ZmNDAwYjY4MzFlMzZkNmJkMTdmZmU0ODM5NWRhYmMyZDM0MzVlNzdmNzZlMTcwMDkyNDFjNWVlNjc5OTJmNzJlYzA1ZjRjODEwODRmYmVkZTNjYzA5NWYxOTY3MmZkZjc2Y2U1MWJhNjljNjA3NmEwZjc3ZWFkZGIzYTkzYmU2Zjg5Njg4ZGUxN2Q4MTM2MjBhMDAwMjJlMDFmZmZmZmZmZWZmZmUxNDRlNDIxMTM4NDU4NmMxNmJkM2FkNGFmYTk5Y2M5MTcwZGYzNTYwZTc3OTgyZDBkYjQ1ZjM1MzY4MTRmMGJkNTg3MWMxOTA4YmQ0NzhjZDFlZTYwNTE2N2ZmODI5OTVlOWI3MjM4MzcwYjI2ZTg4YzhiYjJkZmIxZTdlYzRiN2Q0NzFmM2NkYjZkZjJlMjRmNWIxNDA1ZDk3OGViNTY5MjM3ODMyMjY2NTRmMTlhODNjZDBhMmNmZmYwYTg3ZgAARE8QACAAAADWAAAAlAAAAERPEAAgAAAA1QAAAJQAAABETxAAIAAAANIAAACFAAAARE8QACAAAADPAAAAkwAAAERPEAAgAAAAzAAAAJQAAABETxAAIAAAAMsAAACUAAAARE8QACAAAADIAAAAkwAAAERPEAAgAAAAxwAAAJIAAABETxAAIAAAAMQAAACUAAAARE8QACAAAADBAAAAlAAAAERPEAAgAAAAwAAAAJMAAABETxAAIAAAAL0AAACVAAAARE8QACAAAAC8AAAAlAAAAERPEAAgAAAAuQAAAJMAAABETxAAIAAAALYAAACEAAAARE8QACAAAACzAAAAlAAAAERPEAAgAAAAsgAAAJQAAABETxAAIAAAAK8AAAA1AAAARE8QACAAAACuAAAANQAAAG5vdCBpbXBsZW1lbnRlZABETxAAIAAAANoAAAAKAAAAQ3VydmUgSUQgIG5vdCBzdXBwb3J0ZWQAuGQQAAkAAADBZBAADgAAAHRvb2xzL2dhcmFnYV9ycy9zcmMvcGFpcmluZy9maW5hbF9leHBfd2l0bmVzcy9tb2QucnPgZBAANAAAAJEAAAAFAAAAdG9vbHMvZ2FyYWdhX3JzL3NyYy9wb3NlaWRvbl90cmFuc2NyaXB0LnJzAAAkZRAAKgAAAFQAAAANAAAAJGUQACoAAABXAAAAIQAAACRlEAAqAAAAZAAAAD4AAAAkZRAAKgAAAGEAAAA2AAAAJGUQACoA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aXNvX3BvaW50ID09IG90aGVyLmlzb19wb2ludHRvb2xzL2dhcmFnYV9ycy9zcmMvYWxnZWJyYS9nMXBvaW50LnJzAAAAM3sQACYAAAAwAAAACQAAADN7EAAmAAAAQwAAADoAAAAAAAAAEAAAAAgAAABDAAAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQAzexAAJgAAAE4AAAAKAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAAEAAAAAAAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvY29udmVydC5ycwAA5HsQAGYAAADwAQAAFgAAADN7EAAmAAAAlgAAADYAAAA/AAAADAAAAAQAAAA8AAAAM3sQACYAAACqAAAANwAAAGFzc2VydGlvbiBmYWlsZWQ6ICFwb2ludHMuaXNfZW1wdHkoKTN7EAAmAAAArgAAAAkAAAAzexAAJgAAAK8AAAAJAAAAM3sQACYAAACyAAAANwAAADc3OUJFNjY3RUY5RENCQkFDNTVBMDYyOTVDRTg3MEIwNzAyOUJGQ0RCMkRDRTI4RDk1OUYyODE1QjE2RjgxNzk4NDgzQURBNzcyNkEzQzQ2NTVEQTRGQkZDMEUxMTA4QThGRDE3QjQ0OEE2ODU1NDE5OUM0N0QwOEZGQjEwRDRCOEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFQkFBRURDRTZBRjQ4QTAzQkJGRDI1RThDRDAzNjQxNDE1MzYzQUQ0Q0MwNUMzMEUwQTUyNjFDMDI4ODEyNjQ1QTEyMkUyMkVBMjA4MTY2NzhERjAyOTY3QzFCMjNCRDcyAAAAAAAAAAEAAAABAAAARAAAAHRvb2xzL2dhcmFnYV9ycy9zcmMvZGVmaW5pdGlvbnMucnMAAPR9EAAiAAAA2AAAABIAAAD0fRAAIgAAAMwAAAAOAAAAZmZmZmZmZmYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYzVhYzYzNWQ4YWEzYTkzZTdiM2ViYmQ1NTc2OTg4NmJjNjUxZDA2YjBjYzUzYjBmNjNiY2UzYzNlMjdkMjYwNGI2QjE3RDFGMkUxMkM0MjQ3RjhCQ0U2RTU2M0E0NDBGMjc3MDM3RDgxMkRFQjMzQTBGNEExMzk0NUQ4OThDMjk2NEZFMzQyRTJGRTFBN0Y5QjhFRTdFQjRBN0MwRjlFMTYyQkNFMzM1NzZCMzE1RUNFQ0JCNjQwNjgzN0JGNTFGNUZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGQkNFNkZBQURBNzE3OUU4NEYzQjlDQUMyRkM2MzI1NTH0fRAAIgAAAPcAAAAOAAAAMHg1ZDRlYWNkM2E1YjliZWU2MzE5N2UxMGQ2MTdiM2RkNjZiYjhiNjVkMGNhNTJhZjdhYzcxZTE4ZWY4YmMxNzJkMHgxZDExYjI5YmNmZDBiM2UwNTUwZGRiMDYxMDU3ODBkNWY1NDgzMTk3NmI5ZmJjMzI5MDA0ZWJjMWYzNjRiMmE0MmE3OGRkMGZkMDJjMDMzOWYwMGI4ZjAyZjFjMjA2MThhOWMxM2ZkZjBkNjE3YzlhY2E1NWM4OWIwMjVhZWYzNTI5YzY0NGE1YzcxZGEyMmViZTQ4M2JhNTYzNzk4MzIzY2Y2ZmQwNjE4MDcxMzE2NTliNzgzMGYzZjYyYzFkMTQxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE0REVGOURFQTJGNzlDRDY1ODEyNjMxQTVDRjVEM0VE9H0QACIAAAAcAQAADgAAADAweDMwNjQ0ZTcyZTEzMWEwMjliODUwNDViNjgxODE1ODVkMjgzM2U4NDg3OWI5NzA5MTQzZTFmNTkzZWZmZmZmZjAweDEweDJDRjEzNUU3NTA2QTQ1RDYzMkQyNzBENDVGMTE4MTI5NDgzM0ZDNDhEODIzRjI3MkMzMDY0NEU3MkUxMzFBMDI5Qjg1MDQ1QjY4MTgxNTg1RDk3ODE2QTkxNjg3MUNBOEQzQzIwOEMxNkQ4N0NGRDQ3AAAA9H0QACIAAAA9AQAADgAAADJCMTQ5RDQwQ0VCOEFBQUU4MUJFMTg5OTFCRTA2QUMzQjVCNEM1RTU1OURCRUZBMzMyNjdFNkRDMjRBMTM4RTUwMDk3MTNCMDNBRjBGRUQ0Q0QyQ0FGQURFRUQ4RkRGNEE3NEZBMDg0RTUyRDE4NTJFNEEyQkQwNjg1QzMxNUQyMTIxODAwREVFRjEyMUYxRTc2NDI2QTAwNjY1RTVDNDQ3OTY3NDMyMkQ0Rjc1RURBREQ0NkRFQkQ1Q0Q5OTJGNkVEMTk4RTkzOTM5MjBENDgzQTcyNjBCRkI3MzFGQjVEMjVGMUFBNDkzMzM1QTlFNzEyOTdFNDg1QjdBRUYzMTJDMjEyQzg1RUE1REI4QzZERUI0QUFCNzE4MDhEQ0I0MDhGRTNEMUU3NjkwQzQzRDM3QjRDRTZDQzAxNjZGQTdEQUEwOTA2ODlEMDU4NUZGMDc1RUM5RTk5QUQ2OTBDMzM5NUJDNEIzMTMzNzBCMzhFRjM1NUFDREFEQ0QxMjI5NzVCMzA2NDRFNzJFMTMxQTAyOUI4NTA0NUI2ODE4MTU4NUQyODMzRTg0ODc5Qjk3MDkxNDNFMUY1OTNGMDAwMDAwMVIAAO4AAAFSAAAAAADuAAAAAAABAAAA//8A/wAAAP8AAAABAAD/AP8AAAABAP8AAAAA/wAAAQD/AAABAAAAAAD/AAABAQAA/wAAAP8A/wAAAAEA/wABQjNDNEQ3OUQ0MUE5MTc1ODVCRkM0MTA4OEQ4REFBQTc4QjE3RUE2NkI5OUM5MERE9H0QACIAAAB8AQAAFgAAAPR9EAAiAAAAbAEAAA4AAAA0MTdGMUQzQTczMTk3RDc5NDI2OTU2MzhDNEZBOUFDMEZDMzY4OEM0Rjk3NzRCOTA1QTE0RTNBM0YxNzFCQUM1ODZDNTVFODNGRjk3QTFBRUZGQjNBRjAwQURCMjJDNkJCMDhCM0Y0ODFFM0FBQTBGMUEwOUUzMEVENzQxRDhBRTRGQ0Y1RTA5NUQ1RDAwQUY2MDBEQjE4Q0IyQzA0QjNFREQwM0NDNzQ0QTI4ODhBRTQwQ0FBMjMyOTQ2QzVFN0UxMjRBQTJCMkYwOEYwQTkxMjYwODA1MjcyREM1MTA1MUM2RTQ3QUQ0RkE0MDNCMDJCNDUxMEI2NDdBRTNEMTc3MEJBQzAzMjZBODA1QkJFRkQ0ODA1NkM4QzEyMUJEQjgxM0UwMkI2MDUyNzE5RjYwN0RBQ0QzQTA4ODI3NEY2NTU5NkJEMEQwOTkyMEI2MUFCNURBNjFCQkRDN0Y1MDQ5MzM0Q0YxMTIxMzk0NUQ1N0U1QUM3RDA1NUQwNDJCN0VDRTVENTI3NzI3RDZFMTE4Q0M5Q0RDNkRBMkUzNTFBQURGRDlCQUE4Q0JERDNBNzZENDI5QTY5NTE2MEQxMkM5MjNBQzlDQzNCQUNBMjg5RTE5MzU0ODYwOEI4MjgwMTYwNkM0QTAyRUE3MzRDQzMyQUNEMkIwMkJDMjhCOTlDQjNFMjg3RTg1QTc2M0FGMjY3NDkyQUI1NzJFOTlBQjNGMzcwRDI3NUNFQzFEQTFBQUE5MDc1RkYwNUY3OUJFNzNFREE3NTMyOTlEN0Q0ODMzMzlEODA4MDlBMUQ4MDU1M0JEQTQwMkZGRkU1QkZFRkZGRkZGRkYwMDAwMDAwMQIAAP4AAAECAAAAAAD+AAAAAAABAEGyjcIACwEBAEHSjcIAC+4IAQAAAAAAAAAAAQAAAQABAUFDNDVBNDAxMDAwMUE0MDIwMDAwMDAwMEZGRkZGRkZGMTQ0Njk4QTNCOEU5NDMzRDY5M0EwMkM5NkQ0OTgyQjBFQTk4NTM4M0VFNjZBOEQ4RTg5ODFBRUZEODgxQUM5ODkzNkY4REEwRTBGOTdGNUNGNDI4MDgyRDU4NEMxRDEyRTI5MDhEMTE2ODgwMzAwMThCMTJFODc1M0VFRTNCMjAxNkMxRjBGMjRGNDA3MEEwQjlDMTRGQ0VGMzVFRjU1QTIzMjE1QTMxNkNFQUE1RDFDQzQ4RTk4RTE3MkJFMEIAAAD0fRAAIgAAAKgBAABQAAAA9H0QACIAAACZAQAADgAAADB4N0ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFQzB4NTIwMzZDRUUyQjZGRkU3MzhDQzc0MDc5Nzc3OUU4OTgwMDcwMEE0RDQxNDFEOEFCNzVFQjREQ0ExMzU5NzhBM/R9EAAiAAAA4QEAABIAAAD0fRAAIgAAANwBAAASAAAA9H0QACIAAAABAgAAEgAAAPR9EAAiAAAA/AEAABIAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50LnJzAAAAAAAABAAAAAAAAACoiBAAXgAAAGMDAAAXAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9jb252ZXJ0LnJzAAAkiRAAZgAAAPABAAAWAAAAJIkQAGYAAAD/AQAAFgAAAGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8AAACsiRAAGQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvZGl2aXNpb24ucnMA0IkQAGcAAABwAAAACQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Jsb2NrLWJ1ZmZlci0wLjEwLjQvc3JjL2xpYi5ycwAAAEiKEABdAAAArgAAABQAAAAvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2NvcmUvc3JjL2l0ZXIvdHJhaXRzL2l0ZXJhdG9yLnJzuIoQAFgAAADBBwAACQAAACmgMeFyTmQwXViBgbZFULiRcLl5SOgzKAEAAPCT9eFDAEHglsIAC3UvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L3N0ZC9zcmMvdGhyZWFkL2xvY2FsLnJzAGCLEABPAAAAFQEAABkAAABGAAAADAAAAAQAAABHAAAASAAAABYAQeCXwgALwBEBAAAASQAAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAAB+MEABLAAAA0QoAAA4AAAAvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL2l0ZXIucnNjYWxsZWQgYFJlc3VsdDo6dW53cmFwKClg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5KIQACcAAAAgAAAAEgAAAOSiEAAnAAAAIQAAABIAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmNvZWZmaWNpZW50cy5sZW4oKSA8PSBleHRfZGVncmVldG9vbHMvZ2FyYWdhX3JzL3NyYy9hbGdlYnJhL3BvbHlub21pYWwucnOjoxAAKQAAAA0AAAAJAAAAo6MQACkAAABWAAAAKwAAAKOjEAApAAAAYQAAABoAAACjoxAAKQAAAHgAAAAhAAAAo6MQACkAAAB8AAAAHgAAAERpdmlzaW9uIGJ5IHplcm8gcG9seW5vbWlhbAAcpBAAGwAAAKOjEAApAAAAigAAAA0AAACjoxAAKQAAAJIAAAAjAAAAo6MQACkAAACYAAAANgAAAKOjEAApAAAAmQAAABwAAAAAAAAAEAAAAAgAAABWAAAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQCjoxAAKQAAAJMAAABGAAAAo6MQACkAAACuAAAAIgAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvY29yZS9zcmMvaXRlci90cmFpdHMvaXRlcmF0b3IucnPcpBAAWAAAAMEHAAAJAAAAo6MQACkAAABfAQAAKAAAAKOjEAApAAAAWgEAABMAAACjoxAAKQAAAKUBAAAhAAAAAAAAAAQAAAAEAAAAVwAAAFBvbHlub21pYWxjb2VmZmljaWVudHNkZWdyZWVYAAAADAAAAAQAAAAFAAAAWQAAAAwAAAAEAAAABwAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQucnMAAAAAAAAEAAAAAAAAAAEAAAAAAAAABAAAAAAAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2NvbnZlcnQucnMAADymEABmAAAA8AEAABYAAABuZWdhdGl2ZSB2YWx1ZXMgYXJlIG5vbi16ZXJvL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlnaW50L3NoaWZ0LnJzANCmEABjAAAAZgAAACgAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3N1YnRyYWN0aW9uLnJzAABEpxAAagAAAK4AAAAcAAAAwKUQAF4AAAA6AgAAFwAAAMClEABeAAAAYwMAABcAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2FkZGl0aW9uLnJzAOCnEABnAAAAiQAAABsAAADgpxAAZwAAAI4AAAAbAAAAYXR0ZW1wdCB0byBkaXZpZGUgYnkgemVybwAAAGioEAAZAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9kaXZpc2lvbi5ycwCMqBAAZwAAAHAAAAAJAAAAT25jZSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAAAEqRAAKgAAAG9uZS10aW1lIGluaXRpYWxpemF0aW9uIG1heSBub3QgYmUgcGVyZm9ybWVkIHJlY3Vyc2l2ZWx5OKkQADgAAAAvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L3N0ZC9zcmMvc3luYy9wb2lzb24vb25jZS5ycwB4qRAAUwAAAJsAAAAyAAAAXwAAAAwAAAAEAAAAYAAAAGEAAAAWAEH808IAC8kHAQAAAGIAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAAA7qhAASwAAANEKAAAOAAAARXJyb3IAAAA7qhAASwAAAH0FAAAbAAAARW1wdHlJbnZhbGlkRGlnaXRQb3NPdmVyZmxvd05lZ092ZXJmbG93WmVyb2ludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGUvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWdpbnQucnMDqxAAXQAAAHEBAAAcAAAAA6sQAF0AAACDAQAAHAAAAG91dCBvZiByYW5nZSBjb252ZXJzaW9uIHJlZ2FyZGluZyBiaWcgaW50ZWdlciBhdHRlbXB0ZWRGcm9tQkVCeXRlc0Vycm9yRnJvbUxFQnl0ZXNFcnJvckludmFsaWRWYWx1ZVBvaW50Tm90SW5TdWJncm91cFZhbHVlTm90Q29tcHJlc3NlZC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3NsaWNlLnJzAAAAB6wQAEoAAAC+AQAAHQAAAGNhbGxlZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWUvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2NvcmUvc3JjL2l0ZXIvdHJhaXRzL2l0ZXJhdG9yLnJzAI+sEABYAAAAwQcAAAkAAAB0b29scy9nYXJhZ2FfcnMvc3JjL2lvLnJzAAAA+KwQABkAAABNAAAAHAAAAAAAAAABAAAAAQAAAGMAAAD4rBAAGQAAAE8AAAAwAAAA+KwQABkAAACQAAAADwAAAGFzc2VydGlvbiBmYWlsZWQ6IGJ5dGVzLmxlbigpIDw9IE4gKiBTSVpFIC8gOAAAAPisEAAZAAAAwQAAAAUAAAAweGludmFsaWQgaGV4IHN0cmluZzogAACWrRAAFAAAAPisEAAZAAAA0gAAAD4AAAABAEHQ28IAC8DKAQEAAAD/////AQAAAP////8AAAAAAAAAAP////8BAAAA/////0V1Y2xpZGVhbiBwcm9wZXJ0eSB2aW9sYXRlZHRvb2xzL2dhcmFnYV9ycy9zcmMvaGludHMvZWlzZW5zdGVpbi5ycwAAD64QACcAAAB8AAAAGAAAAA+uEAAnAAAAfQAAABgAAABkaXZpc2lvbiBieSB6ZXJvIEVpc2Vuc3RlaW5JbnRlZ2VyAAABAAAAAAAAACrPiQABAAAAAAAAAISuEAADAAAALc+JIC0gICsgAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAASGFsZkdDRCBleGNlZWRlZCAgaXRlcmF0aW9ucyBmb3IgYT0sIGI9ALyuEAARAAAAza4QABIAAADfrhAABAAAAE5vcm0gb2YgaW5wdXQgJ2EnIGNhbm5vdCBiZSBuZWdhdGl2ZUxhdHRpY2UgZGV0ZXJtaW5hbnQgaXMgemVyby4gSW5wdXQgcGFyYW1ldGVycyBtaWdodCBiZSB1bnN1aXRhYmxlLkRpdmlzaW9uIGJ5IHplcm8gaW4gRXVjbGlkZWFuIGFsZ29yaXRobSBmaW5hbCBzdGVwLiBDaGVjayBpbnB1dHMgciBhbmQgbGFtLkRpdmlzaW9uIGJ5IHplcm8gaW4gRXVjbGlkZWFuIGFsZ29yaXRobS4gQ2hlY2sgaW5wdXRzIHIgYW5kIGxhbS5EaXZpc2lvbiBieSB6ZXJvIGluIHJvdW5kaW5nLnRvb2xzL2dhcmFnYV9ycy9zcmMvaGludHMvZmFrZV9nbHYucnNDdXJ2ZSAgZG9lcyBub3QgaGF2ZSBhIGtub3duIGVuZG9tb3JwaGlzbSBlaWdlbnZhbHVlIG9yIGlzIG5vdCBzdXBwb3J0ZWQgaGVyZS4AAAAvsBAABgAAADWwEABIAAAAIGhhcyBhbiBlbmRvbW9ycGhpc20sIHVzZSBnZXRfZ2x2X2Zha2VfZ2x2X2hpbnQgaW5zdGVhZAAvsBAABgAAAJCwEAA3AAAAQXNzZXJ0aW9uIGZhaWxlZDogKHMxICsgc2NhbGFyICogczIpICUgY3VydmUubiAhPSAwQXNzZXJ0aW9uIGZhaWxlZDogIShzMSA+IDAgYW5kIHMyICE9IDApAAAKsBAAJQAAAGwBAAAmAAAAMHhlZTlhNTkyYmE5YTk1MThkMDU5ODZkNjU2ZjQwYzIxMTRjNDk5M2MxMWJiMjk5MzhkMjFkNDczMDRjZDhlNmUweGYxNDQ1MjM1ZjIxNDhjNTk4NjU4NzE2OWZjMWJjZDg4N2IwOGQ0ZDAwODY4ZGY1Njk2ZmZmNDA5NTZlODY0MHg4ZGZmMzQ4N2U4YWM5OWUxZjI5YTA1OGQwZmE4MGI5MzBjNzI4NzMwYjdhYjM2Y2U4NzlmMzg5MGVjZjczZjUweDg0ZDUyMGU0ZTViYjQ2OWUxZjkwNzVjYjdjNDkwZWZhNTk1NjVlZWRhZTJkMDBjYThlZjg4Y2VlYTJiMDE5NzB4MmQxNWQ5ODJkOTk1NzdmYTMzZGE1NjcyMjQxNmZkNzM0YjNlNjY3YTJmOWYxNWQ4ZWIzZTc2N2FlMGZkODExZTB4ZWQyNTM4ODQ0YWJhMTYxY2YxNTc4YTQzY2YwMzY0ZTkxNjAxZjY1MzZhNTk5NmQwZWZiZTY1NjMyYzQxYjZkMHgyNjAwYzI3ZDg3OWZiY2ExODZlNzM5ZTYzNjNjNzFjZjgwNGM4NzdkODI5YjczNWRjYzNlM2FmMDI5NTVlNjBhMHgyOGY4YmQ0NGE1ODNjYmFhNDc1YmQxNTM5NjQzMGU3Y2NiOTlhNTUxNzQ0MGRmZDk3MDA1ODU1ODI4MmJmMmM1MHg5Y2Q3ZDRjMzgwZGM1NDg4NzgxYWFkMDEyZTdlYWVmMWVkMzE0ZDdmNjk3YTU1NzJkMDMwYzU1ZGYxNTMyMjEweDExYmI2ZWUxMjkxYWFiYjIwNjEyMGVjYWFjZTQ2MGQyNGI2NzEzZmViZTgyMjM0OTUxZTJiZWU3ZDBmODU1ZjUweDJkNzRlOGZhMDYzN2Q5ODUzMzEwZjNjMGUzZmFlMWQwNmYxNzE1ODBmNWI4ZmQwNTM0OWNhZGVlY2ZjZWIyMzAweDI3MzVlNGVjOWQzOWJkZmZhYzliZWYzMWJhY2JhMzM4YjFhMDk1NTlhNTExYTE4YmU0YjRkMzE2ZWQ4ODkwMzMweGYwM2MxZTllMDg5NWRiMWE1ZGE2MzEyZmFhNzhlOTcxMTA2YzMzZjgyNmUwOGRjZjYxN2UyNDIxMzEzMmRmZDB4MTcwOTRjZDI5N2JmODI3Y2FmOTI5MjAyMDViNzE5YzE4NzQxMDkwYjhmNzc3ODExODQ4YTdlOWVhZDY3NzhjNDB4ZGI4ZjQxOWMyMWY5MjQ2MWZjMmIzMjE5NDY1Nzk4MzQ4ZGY5MGQ0MTc4MDQyYzgxYmE3ZDRiNGQ1NTllMmI4MHgyNDM0NDM2MTNmNjRmZmE0MTc0MjdlZDU5MzNmY2ZiYzY2ODA5ZGI2MGI5Y2ExNzI0YTIyNzA5Y2VjZWVlY2UyMHgyMmFmNDlmYmZkNWQ3ZTlmY2QyNTZjMjVjMDdkM2RkOGVjYmJhZTZkZWVjZDAzYWEwNGJiMTkxZmFkYTc1NDExMHgxNGZiZDM3ZmE4YWQ2ZTRlMGM3OGEyMGQ5M2M3MjMwYzQ2NzdmNzk3YjQzMjczMjNmN2Y3YzA5N2MxOTQyMGUwMHgxNWE5Mjk4YmJiODgyNTM0ZDRiMmM5ZmJjNmU0ZWY0MTg5NDIwYzRlYjNmM2UxZWEyMmZhYTdlMThiNWFlNjI1MHgyZjdkZTc1ZjIzZGRhYWE1MjIxMzIzZWJjZWIyZjJhYzgzZWVmOTJlODU0ZTc1NDM0YzJmMWQ5MDU2MjIzMmJjMHgzNmE0NDMyYTg2ODI4M2I3OGEzMTVlODRjNGFlNWFlY2EyMTZmMmZmOWU5YjJlNjIzNTg0Zjc0NzljZDVjMjcweDIxODBkNzc4NmE4Y2Y4MTBlMjc3MjE4YWIxNGExMWU1ZTM5ZjNjOTYyZjExZTg2MGFlMWM1NjgyYzc5N2RlNWMweGEyNjhlZjg3MDczNmVlYmQwY2I1NWJlNjQwZDczZWUzNzc4OTkwNDg0Y2MwM2NlNTM1NzIzNzdlZWZmZjhlNDB4MWVlZmVmZTExYzBiZTQ2NjRmMjk5OTAzMWYxNTk5NDgyOWU5ODJlOGM5MGUwOTA2OWRmOWJhZTE2ODA5YTViMjB4MjdlODdmMDMzYmQxZTBhODljYTU5NmU4Y2I3N2ZlM2E0YjhmYjkzZDlhMTEyOTk0NjU3MWEzYzNjZjI0NGM1MjB4MTQ5OGEzZTY1OTlmZTI0MzMyMWY1N2Q2YzU0MzU4ODk5NzljNGY5ZDJhM2UxODRkMjE0NTE4MDkxNzhlZTM5MHgyN2MwYTQxZjRjYjlmZTY3ZTlkZDRkN2NlMzM3MDdmNzRkNWQ2YmNjMjM1YmVmMTA4ZGVhMWJiZWJkZTUwN2FhMHgxZjc1MjMwOTA4YjE0MWI0NjYzNzIzOGIxMjBmYzc3MGY0ZjRhZTgyNWQ1MDA0YzE2YTdjOTFmZTFkYWUyODBmMHgyNWY5OWE5MTk4ZTkyMzE2N2JiYTgzMWIxNWZmZmQyZDdiOTdiM2EwODk4MDhkNGViMWYwYTA4NWJlZTIxNjU2MHgxMDFiYzMxOGU5ZWE1OTIwZDBmNmFjZGMyYmI1MjY1OTNkM2Q1NmVjOGVkMTRjNjc2MjI5NzQyMjhiYTkwMGM2MHgxYTE3NTYwNzA2N2Q1MTczOTdjMTMzNGVjYjAxOTc1NGViYzBjODUyYTNjZjA5MWVjMWNjYzQzMjA3YTgzYzc2MHhmMDJmMGU2ZDI1ZjllYTNkZWIyNDVmM2U4YzM4MWVlNmIyZWIzODBiYTRhZjVjMWM0ZDg5NzcwMTU1ZGYzN2IweDE1MWQ3NTdhY2M4MjM3YWYwOGQ4YTY2NzcyMDNlYzk2OTI1NjVkZTQ1NmFlNzg5ZmYzNThiMzE2M2IzOTNiYzkweDI1NmNkOTU3N2NlYTE0MzA0OWUwYTFmZTAwNjhkZDIwMDg0OTgwZWU1Yjc1Nzg5MGE3OWQxM2EzYTYyNGZhZDQweDUxM2FiYWZmNjE5NWVhNDg4MzNiMTNkYTUwZTA4ODQ0NzY2ODJjM2ZiZGQxOTU0OTdiOGFlODZlMTkzN2M2MTB4MWQ5NTcwZGM3MGEyMDVmMzZmNjEwMjUxZWU2ZTJlODAzOTI0NmU4NGU0YWM0NDgzODZkMTlkYmFjNGU0YTY1NTB4MThmMWE1MTk0NzU1YjhjNWQ1ZDdmMWJmOGFhYTZmNTZlZmZiMDEyZGQ3ODRjZjVlMDQ0ZWVjNTBiMjlmYzlkNDB4MjY2YjUzYjYxNWVmNzNhYzg2NjUxMmMwOTFlNGE0ZjJmYTRiYjBhZjk2NmVmNDIwZDg4MTYzMjM4ZWViYmNhODB4MmQ2MzIzNGM5MjA3NDM4YWE0MmI4ZGUyNzY0NGMwMjI2ODMwNGRmZWI4Yzg5YTFhM2Y0ZmQ2ZTgzNDRhZTBmNzB4MmFiMzBmYmU1MWVlNDliYzdiM2FkZGUyMTlhNmYwYjVmYmI5NzYyMDVlZjhkZjdlMDAyMWRhZWU2ZjU1YzY5MzB4MWFlZTZkNGIzZWJlOTM2NmRjYjljY2U0ODk2OWQ0ZGYxZGM0MmFiY2Q1MjhiMjcwMDY4ZDkyMDdmYTZhNDVjOTB4MTg5MWFlYWI3MWUzNGI4OTVhNzk0NTJlNTg2NGFlMWQxMWY1NzY0NmM2MGJiMzRhYTIxMWQxMjNmNjA5NTIxOTB4MjQ0OTJiNWY5NWMwYjA4NzY0MzdlOTRiNDEwMWM2OTExOGUxNmIyNjU3NzcxYmQzYTdjYWFiMDFjODE4YWE0YjB4MTc1MjE2MWIzMzUwZjdlMWIzYjJjODY2M2EwZDY0Mjk2NDYyODIxM2Q2NmMxMGFiMmZkZGY3MWJjZmRlNjhmMHhhYjY3NjkzNTcyMmUyZjY3Y2ZiODQ5MzhlNjE0YzZjMmY0NDViOGQxNDhkZTU0MzY4Y2ZiOGY5MGEwMGYzYTcweGIwZjcyNDcyYjlhMmY1ZjQ1YmM3MzAxMTdlZDlhZTU2ODNmYzJlNmUyMjdlM2Q0ZmUwZGExZjdhYTM0ODE4OTB4MTZhYTZmOTI3M2FjZDU2MzFjMjAxZDFhNTJmYzRmOGFjYWYyYjIxNTJjM2FlNmRmMTNhNzhhNTEzZWRjZDM2OTB4MmY2MGI5ODdlNjM2MTRlYjEzYzMyNGMxZDg3MTZlYjBiZjYyZDliMTU1ZDIzMjgxYTQ1YzA4ZDUyNDM1Y2Q2MDB4MThkMjRhZTAxZGRlOTJmZDc2MDZiYjc4ODQ1NTRlOWRmMWNiODliMDQyZjUwOGZkOWRiNzZiN2NjMWIyMTIxMjB4NGZjM2JmNzZmZTMxZTJmOGQ3NzYzNzMxMzBkZjc5ZDE4YzMxODVmZGYxNTkzOTYwNzE1ZDQ3MjRjZmZhNTg2MHhkMThmNmI1M2ZjNjk1NDZjZmRkNjcwYjQxNzMyYmRmNmRlZTllMDZiMjEyNjBjNmI1ZDI2MjcwNDY4ZGJmODIweGJhNDIzMWE5MThmMTNhY2VjMTFmYmFmYTE3YzUyMjNmMWY3MGI0Y2RiMDQ1MDM2ZmE1ZDcwNDViZDEwZTI0MHg3YjQ1OGIyZTAwY2Q3YzYxMDA5ODUzMDE2NjNlN2VjMzNjODI2ZGEwNjM1ZmYxZWJlZGQwZGQ4NjEyMGI0YzgweDFjMzVjMmQ5NmRiOTBmNGY2MDU4ZTc2ZjE1YTBjODI4NmJiYTI0ZTJlZDQwYjE2Y2VjMzllOWZkN2JhYTU3OTkweDFkMTJiZWEzZDhjMzJhNWQ3NjY1NjhmMDNkZDFlY2RiMGE0ZjU4OWFiYmVmOTY5NDVlMGRkZTY4OGUyOTIwNTAweGQ5NTNlMjAwMjIwMDMyNzA1MjVmOWE3MzUyNmU5ODg5Yzk5NWJiNjJmZGVhOTQzMTNkYjQwNWE2MTMwMDI4NjB4MjlmMDUzZWMzODg3OTVkNzg2YTQwYmVjNGM4NzUwNDdmMDZmZjBiNjEwYjQwNDBhNzYwZTMzNTA2ZDI2NzFlMTB4NDE4OGUzMzczNWY0NmIxNGE0OTUyYTk4NDYzYmMxMmUyNjRkNWY0NDZlMGMzZjY0Yjk2NzljYWFhZTQ0ZmMyMHgxNDllYzI4ODQ2ZDRmNDM4YTg0ZjFkMDUyOTQzMWJiOWU5OTZhNDA4YjdlOTdlYjNiZjE3MzVjZGJlOTZmNjhmMHhkZTIwZmFlMGFmNTE4OGJjYTI0YjVmNjM2MzBiYWQ0N2FlYWZkOThlNjUxOTIyZDE0OGNjZTFjNWZkZGRlZTgweDEyZDY1MGU4Zjc5MGIxMjUzZWE5NDM1MGU3MjJhZDJmN2Q4MzZjMjM0Yjg2NjBlZGY0NDlmYmE2OTg0YzY3MDkweDIyYWI1M2FhMzlmMzRhZDMwZWE5NjcxN2JhNzQ0NmFhZmRhZGJjMWE4YWJlMjhkNzgzNDBkZmM0YmFiYjhmNmMweDI2NTAzZThkNDg0OWJkZjU0NTBkYWJlYTc5MDdiYzNkZTBkZTEwOTg3MWRkNzc2OTA0YTEyOWRiOTE0OTE2NmMweDFkNWU3YTBlMjk2NWRmZmEwMGY1NDU0ZjUwMDNjNWM4ZWMzNGIyM2Q4OTdlN2ZjNGM4MDY0MDM1YjBkMzM4NTAweGVlM2Q4ZGFhMDk4YmVlMDEyZDk2YjdlYzQ4NDQ4YzZiYzlhNmFlZmE1NDQ2MTViOWNiM2M3YmJkMDcxMDRjYjB4MWJmMjgyMDgyYTA0OTc5OTU1ZDMwNzU0Y2Q0ZDkwNTZmYTllZjdhNzE3NTcwM2Q5MWRjMjMyYjVmOThlYWQwMDB4N2FlMTM0NGFiZmM2YzJjZTNlOTUxYmMzMTZiZWU0OTk3MTY0NWYxNmI2OTM3MzNhMDI3MjE3M2VlOWFkNDYxMHgyMTdlM2EyNDc4MjdjMzc2ZWMyMWIxMzFkNTExZDdkYmRjOThhMzZiN2E0N2Q5N2E1YzhlODk3NjJlZTgwNDg4MHgyMTVmZmU1ODRiMGViMDY3YTAwM2Q0MzhlMmZiZTI4YmFiZTFlNTBlZmMyODk0MTE3NTA5YjYxNmFkZGMzMGVlMHgxZTc3MGZjOGVjYmZkYzg2OTJkY2VkYzU5N2M0Y2EwZmJlYzE5Yjg0ZTMzZGE1NzQxMmE5MmQxZDNjZTNlYzIwMHgyZjYyNDNjZGE5MTliZjRjOWYxZTNhOGE2ZDY2YTA1NzQyOTE0ZmMxOTMzOGIzYzBlNTBlODI4ZjY5ZmY2ZDFmMHgyNDZlZmRkYzMxMTdlY2QzOTU5NWQwMDQ2ZjQ0YWIzMDNhMTk1ZDBlOWNjODkzNDVkM2MwM2ZmODdhMTFiNjkzMHg1M2U4ZDliM2VhNWI4ZWQ0ZmUwMDZmMTM5Y2JjNGUwMTY4YjFjODlhOTE4ZGZiZTYwMmJjNjJjZWM2YWRmMTB4MWI4OTRhMmY0NWNiOTY2NDdkOTEwZjZhNzEwZDM4YjdlYjRmMjYxYmVlZmZmMTM1YWVjMDRjMWFiZTU5NDI3YjB4YWViMTU1NGUyNjY2OTNkODIxMjY1MjQ3OTEwN2Q1ZmRjMDc3YWJmODg2NTFmNWE0MjU1M2Q1NGVjMjQyY2MwMHgxNmE3MzVmNmY3MjA5ZDI0ZTY4ODg2ODBkMTc4MWM3ZjA0YmE3ZDcxYmQ0YjdkMGUxMWZhZjlkYThkOWNhMjhlMHg0ODdiOGI3ZmFiNWZjOGZkN2MxM2I0ZGYwNTQzY2QyNjBlNGJjYmI2MTViMTkzNzRmZjU0OWRjZjA3M2Q0MWIweDFlNzViOWQyYzIwMDYzMDcxMjRiZWEyNmIwNzcyNDkzY2ZiNWQ1MTIwNjhjM2FkNjc3ZmRmNTFjOTIzODg3OTMweDUxMjBlM2QwZTI4MDAzYzI1M2I0NmQ1ZmY3N2QyNzJhZTQ2ZmExZTIzOWQxYzZjOTYxZGNiMDJkYTNiMzg4ZjB4ZGE1ZmViNTM0NTc2NDkyYjgyMmU4NzYzMjQwMTE5YWMwOTAwYTA1M2IxNzE4MjNmODkwZjVmZDU1ZDc4MzcyMHgyZTIxMWIzOWEwMjMwMzFhMjJhY2MxYTFmNWYzYmI2ZDhjMjY2NmE2Mzc5ZDlkMmM0MGNjOGY3OGI3YmQ5YWJlAAAARLEQAEEAAACFsRAAQAAAAMWxEABBAAAABrIQAEEAAABHshAAQgAAAImyEABBAAAAyrIQAEIAAAAMsxAAQgAAAE6zEABBAAAAj7MQAEIAAADRsxAAQgAAABO0EABCAAAAVbQQAEEAAACWtBAAQgAAANi0EABBAAAAGbUQAEIAAABbtRAAQgAAAJ21EABCAAAA37UQAEIAAAAhthAAQgAAAGO2EABBAAAApLYQAEIAAADmthAAQQAAACe3EABCAAAAabcQAEIAAACrtxAAQQAAAOy3EABCAAAALrgQAEIAAABwuBAAQgAAALK4EABCAAAA9LgQAEIAAAA2uRAAQQAAAHe5EABCAAAAubkQAEIAAAD7uRAAQQAAADy6EABCAAAAfroQAEIAAADAuhAAQgAAAAK7EABCAAAARLsQAEIAAACGuxAAQgAAAMi7EABCAAAACrwQAEIAAABMvBAAQQAAAI28EABBAAAAzrwQAEEAAAAPvRAAQgAAAFG9EABCAAAAk70QAEIAAADVvRAAQQAAABa+EABBAAAAV74QAEAAAACXvhAAQQAAANi+EABCAAAAGr8QAEIAAABcvxAAQQAAAJ2/EABCAAAA378QAEEAAAAgwBAAQgAAAGLAEABBAAAAo8AQAEIAAADlwBAAQgAAACfBEABCAAAAacEQAEIAAACrwRAAQQAAAOzBEABCAAAALsIQAEEAAABvwhAAQgAAALHCEABCAAAA88IQAEIAAAA1wxAAQgAAAHfDEABCAAAAucMQAEAAAAD5wxAAQgAAADvEEABBAAAAfMQQAEIAAAC+xBAAQQAAAP/EEABCAAAAQcUQAEEAAACCxRAAQQAAAMPFEABCAAAAMHgxMDliN2Y0MTFiYTBlNGM5YjJiNzBjYWY1YzM2YTdiMTk0YmU3YzExYWQyNDM3OGJmZWRiNjg1OTJiYTgxMThiMHgyOTY5ZjI3ZWVkMzFhNDgwYjljMzZjNzY0Mzc5ZGJjYTJjYzhmZGQxNDE1YzNkZGVkNjI5NDBiY2RlMGJkNzcxMHgxNDMwMjFlYzY4NmEzZjMzMGQ1ZjllNjU0NjM4MDY1Y2U2Y2Q3OWUyOGM1YjM3NTMzMjYyNDRlZTY1YTFiMWE3MHgxNmVkNDFlMTNiYjljMGM2NmFlMTE5NDI0ZmRkYmNiYzkzMTRkYzlmZGJkZWVhNTVkNmM2NDU0M2RjNDkwM2UwMHgyZTI0MTlmOWVjMDJlYzM5NGM5ODcxYzgzMjk2M2RjMWI4OWQ3NDNjOGM3Yjk2NDAyOWIyMzExNjg3YjFmZTIzMHgxNzZjYzAyOTY5NWFkMDI1ODJhNzBlZmYwOGE2ZmQ5OWQwNTdlMTJlNThlN2Q3YjZiMTZjZGZhYmM4ZWUyOTExMHgyYjkwYmJhMDBmY2EwNTg5ZjYxN2U3ZGNiZmU4MmUwZGY3MDZhYjY0MGNlYjI0N2I3OTFhOTNiNzRlMzY3MzZkMHgxMDEwNzFmMDAzMjM3OWI2OTczMTU4NzY2OTBmMDUzZDE0OGQ0ZTEwOWY1ZmIwNjVjOGFhY2M1NWEwZjg5YmZhMHgxOWEzZmMwYTU2NzAyYmY0MTdiYTdmZWUzODAyNTkzZmE2NDQ0NzAzMDcwNDNmNzc3MzI3OWNkNzFkMjVkNWUwAACQyBAAQgAAANLIEABCAAAAFMkQAEIAAABWyRAAQgAAAJjJEABCAAAA2skQAEIAAAAcyhAAQgAAAF7KEABCAAAAoMoQAEIAAAAweDFlNmYyMGExMWQxZTMxZTQzZjgzZGNlZGRkYjlhMDIzNjIwM2Y1ZjI0YWU3MmM5MjVhOGE3OWE2NjgzMWY1MWQweDFiZDhjNTI4NDcyZTU3YmRjNzIyYTE0MWY4Nzg1Njk0NDg0ZjQyNjcyNTQwM2FlMjQwODRlMzAyN2U3ODI0NjcweDJkNTFiYTgyYzgwNzNjNmQ2YmFjZjFhZDVlNTY2NTViNzE0MzYyNWIwYTllOWMzMTkwNTI3YTFhNWYwNTA3OWEweDFiMDdkNmQ1MWU2ZjdlOTdlMGFiMTBmYzJlNTFlYTgzY2UwNjExZjk0MGZmMDczMWI1ZjkyN2ZlOGQ2YTc3YzkweDExZTEyYTQwZDI2MmFlODhlODM3NmY2MmQxOWVkZjQzMDkzY2RlZjFjY2YzNGQ5ODVhM2U1M2YwYmM1NzY1YTAweDIyMWMxNzBlNGQwMmEyNDc5YzZmM2U0N2I1ZmY1NTc4MTU3NGY5ODBkODkwMzgzMDhhM2VmMzdjY2U4NDYzYmSQyBAAQgAAACzLEABCAAAAbssQAEIAAABWyRAAQgAAALDLEABCAAAA8ssQAEIAAAAcyhAAQgAAADTMEABCAAAAdswQAEIAAAAweDNmMDgxNWFiNDYzZjFiNzZlZTI1YTliODc2OGIzMjMxYTg5NzUyZjQyN2Y0ZjA2M2FiNzE4ZTcwNzU3NmIzMTB4MTU2NDhiZjQ2ZjYwZDgyOTU0YzdlMzMwMjliMzYxNzM1NzAxMmEzZDNiMWQzNGM4ZTAwODg1OWYxZGJmYjMxNzB4MTI3ZTAwYzIyNTNkZTA3ODE4Y2E3ZjJlYWZkZDc1NjRkMDVlYTg1MGNmNjFmMWRhYTBjZmVmYmY3ZmJmYmE4NTB4NjYzNjVhZmQxOGE0MWVmOTM4MmZjMGIxZDI2NWNiNGQzY2U0NzBhOGNiYmI4NzhmN2Q0ODA1MTYzMDc0N2JkMHgyMTlkMTRmODIzNTEzMTQwZGM2OWE5NmY3ZmU3ZTA4NmY0ZmEyNGM4NGU1N2RjZjJiMDk5NzE1YzQ0MDRhYWU3MHgzYTMwYmZiYmYyY2I4NmQ0YTZhNjNhODA1MGQ5MWY5ZjE0ZjRkMzM2OTZkMzdlYmFlZmE5YWMyMzAyMTMyZDUweDIxMjFiYmNkZWFhMzNhMzViMDI3MGZiN2Q1YzlmOTRlZGFkNWE4NGQ3NGIwNmUzMzg1MTA0YjBiNDE5MzViY2MweDE5NmI1NDRmYmViMGE3OTJjZmJiODJjMjg5ZTU3OWI3Y2Q1NTgwYzJlMzM4YTM4OWQwNTNlZjhiM2QxMGU3MGUweDI4MDljM2ExNTQ3YzBjZWU4OWMxZGIyNzBlZjQ3OWMyNjk3M2VjNzNlZGI0YmQ0ZTdkOTA3ZWEwMjAyZjU2MGYweDExYzM0NDQ2YjA4M2VmOTJjYTE1NzU4NWEwMmI4YjM0MmE0YzY3MTc1YjMxZjRiNWQ0MGQ0ZTk2ZGZjNWM4ZjEweDI1M2VhMGIzM2E4YmYzYjIzNjdjMDMwZTMyODljYmUwZjYyNDJhZDc3MDlkOTBiODZkOWQ4MDI2ZTJlMzk5MjUweDMwNDY3ZGMxOTMwZjZhZmU5MGM4OWQ0MDA3YWQyOWZjNGY1YTE5YzAwNmQxMDMwNDM4YzE2ZGY4NTYzN2JkNWYweDJmOWQ0YjU1NDk1ZjdlMzc3ZTIwZTZmNWEzYTg4YWY3YWE2YTUzNjQ1OGIzOGJiZTEzYzhlYmZiYmJhNTRmNDQweDFkOWU5ZDVjNzM2ZTMxNTFmMTFkMzZkNDk5ZTdlMDkzZDhlZTIzNTNiZTE4YWFkNTRjZmQwM2ZmMGZlYWM0YjgweDEyNGI2MTdiNDNlNTk4ZjllYmY2MjJmNzgyM2EzZGU3ZDFiZmVkYjg3ZTA5N2MzMTVmMzQzZGUzMDFlNTQ4NDEweDE5OGU3Y2ZjNjZhZTQ1Nzc0MDU1Y2YwNzNiZWRjOTQ1YTVmOWM1YjE5Y2FlMDhkNzg5Y2M1NzQ4ZmZlMTk5YjIweDJlYWMyNWIzNDk4ZGZhZGZmZDEyNGFiM2FhZDU3Nzg5ZWI5NDViYTU3NDQzMDk5YzViYjZjMjdlZDk3N2ZlMjQweDFlZTAyYzE3NWNkZmUxODcxYjM3ODMwNWMxYmI5YzkwNGU4YWYxZDQ0NTRlZDM1NTBiM2M2YWI1ZjRmOTAxMjYweDYxNmY4YzM0YzYwNzI2NmIyOWVhOGY5ZDJkZmE0N2ZmNmZiYjFkOTc0NWM0ODYwOWZhOTgzMDFkMGY2NzlkNTB4MTgxZDY4YjBhMTg4NTA0OTU4YjlmMTljYmJkYjk3MmE4NTNlNTFlZDM4NWU0ODgzYTQzYTQyODMyODAzMzcwYjB4MmQ1Mzk3Y2U4NjM0NjRhMjVkNmI3ZjViMDE1ZDU3OTE4MWQxY2UyZjI0Y2JhYmY2MDU5ZTkzMjdmNWJhNzAwNDB4MTViZjgxNzQ5MWI5NGQ3MWU4OTEyOTQwY2MwYjgwMjc3NzEzZTdkMzJkYTJiNjU5MTcyNGQ4ZGJkNGJjMjYxODB4MmE3Y2JkMTE0NjBiMTc3YWI3NmZlYWIyOGI2OTQ4NWFjOGNjNjg3NzQwYmM5MTA5OTRhMzgyN2QyOWMwODcxNDB4ZjdjZDVmZmE0NjYxNzMwYWI1NmU0NDdmYWU1Y2MxNzYzY2I0NjJkYTgwYTg1NjE0YzIzN2IyOTBkZTlkNTAyMHhlMDc2NjAwNGI0YzQxNzZlYjEzMjczNTA4ZWI2NTc1Zjc2ODEzN2Q4NmQzMDViZTY0NGNlMDQ1MzEwMDgxMDAweDYyNWZhNzE0NTgxMzQ4MWY2ZDE0OGJlNmI5YzhiYjdiNTRlZTNjMWFmYWMwMDEwNGUxZjc2MzAwMGI5OTI0YzB4N2M1NDcyNTA4YjQ1OTkxNmVlMGY1NDYxYWFkMmUwYjE5Y2Q5YzdiMTg0ZjUxNWI2NTEzNjMxOGNlMmM2YTUweDU2NzM3NTQ3MGQxODliNjkzYWM3N2FiM2ZiNzU1NzIzMWQ1MzA3Mzk1MWQ0M2M1NDY4NTg3OWNiN2E4OWZjYjB4MWQwNDA2YmNiZWM4M2Y4ZDUxNjVmNTZjMDYzZTQyMTA4YWQyMWY1MWVhNGJmYzcxNjAxMTc0YmE1YzdiOGJjYzB4YzAyYjE4ZWVmMjIzMzJkMjgwYThhYTFmODY0MDVmMzM3NWYwNjM0MmY4Njk2ZWU3YzczYjQ2YzYzMjcyY2I3MHgxN2MxZmMxNzRjZDlhNmViZWFhN2FkZDJmODAxYTY2NDgyMzUwOWFkNGZkMWIxNWFhZDA1M2E1NWFkNmRhNGNmMHg1Zjg0M2MyMzAyNGViMWRhYjdlYmJjODY3MDlhMDIxYWFhNmNhZjQzM2Y3ZWQyNThhMDg2MzhlOTU4NGIzMmQweDIyZGYyNDIwNjk3Y2EyOGI1Y2M1MWM1MzE2NWUwMDI3MjdiNDVjY2Q5MGE1NWM4NzU4OWY3OTJmMGFkOGNiMzcweDJmMTQzODMwM2E3YjQ5ZDQ3MzQwMGFhZWRmMGY0ODAwOWZkM2FmODA0Yjc2YmU4NjQxNzU4OGVmYzRkNzMwMmEweDIzMjNkNWZjZjJkYTg5NjVjNmIyYjdiNGZiZjlhMjRiYmFhN2Y0ZGNjZDM1ZDVjYTYxNTVjNTQ2MzA5M2IyM2IweDI2Yzg1YjlkZmJiZTQ4ZmU4M2I3NTNhNWU3MzM2YjlmNDBmN2I5NjFlOWM1NGY5NGUzNzcwMDA3M2Q0ZDI2ZTB4MzE1MTEwMDAyNTFlYzg2ZmViMzhiNWFiNGUzMzVmMDcwYjI3MWRmNGMyMDk3OTUyOGU0MWQ2NTM4NGMzMThmMHgxOGU1ODgzMjRhOWJiYWFjYjQyZmE2OWU1ZDkwYTBjMGUyN2NkMTZiOTQxZTM0YTYwZmY1ZGY5YTI2YzAzYWYxMHgyNjQyYjVkOGUxNmI5NTNiMDcwNjM1Nzc1YzhkM2M5NDk4MzU3ZDZhZDliZWYyZTdkOTlmMDNjMTBlYTFmOTVmMHgyMWZjMzEzYmExMWM2MGU4ZTg0ZmY2MGRiOTA2YTBmMDMxMTg5YjBiNDgzMzVjNDIyMWY5MDlhZWY4MzZjMTMzMHgyZDM1NjJlM2Q0YjQyYmM2ODkwYjY5OGNjNmFiODlmNzMxMTI5OGJjYmFjNmU0ZTlmMmY0ZDkzZDA2ZGFlMTUxMHhhNzRlZjU0MWQzNjBlODQyZTNlMGI2ZmY3ZTVjN2M3NzkzNGE1ZjY3NjE2ZjAxYzE4OWQ4ODZkZmQyZTA4MDgweDE0MDU2NGI1M2UwYTgxMmFjMzk4M2Q2ZTNiNDMzYWZhNDNmNDM0MDg3ZDllNzU0OTY3YzJjOWIxYjAyY2FmOGEweDE0NzA5ZTMyZDk4YWU0Y2QxOGI0MDAxODFlNzFhYjk3NTljNDM2YzhlODNmYTY5OTNhZGI2ZjJkYjZiYmE5ZDAweDczNGIyMzY2YzU5ZTM5NDQyM2YxNzllMTI2NmRkMzkyMzcyZGI0ZjJkYmE2NTFmNGE2MTlhNGI1MmJkYzAxMDB4MTFmYjJkNzA1Yzk0YjA4ZDVhZDNlM2M1ZmI2NjI5YWJlOTYzZWQ5MjkxMzY0MmM3ZDAyZDdlNzEwODhmZDJkNDB4MjdkMDNhYmY1YzFmMjkwZTVkNzE1ZWJhMTkzNzEwNTBlZjZlYjdmNzhmZDg0YmU4MzRlNGNjMzYxODA1OTQ4NDB4MTNlZDllOWU2YjQ1MmRmMjdmYjMzNTNjZmMyY2Q2M2ViZTgxN2YyMTJhMzljNmE4YmI5YjQ0MWFjMTM5NTg2MTB4MTMxOWM1MWNmMzdhYWExMDI0NmNkYWFhMDRhMTJlODg3OTVkZTQ0NTI2MDQyNjNhN2M1Yjc5YWI5OWNiZDIzYzB4YmNhMjU1ODhkMTg3YjdmOWRhZDgzOWYyYzhjYjUyNmE0Y2Y0NDRlZWJiZDBlNzE1YjZjZWEwMTlhYzNmMjB4MWQ4MzdlYTAzNDFjNTk2NDE4MTIyNjg3NGI5MjNjZDAxYTA2OWI0OTNmMDJmN2EzYzAxYmUyM2NmNTFkNTkzZjB4MWI0MWNlOWVkMzYzNGNiZDQyYzQyN2NlNGM1YzgzNzc0MTQ5ZTJhNmRiZDI1ZjI0MDEyMDkwZGI3ZGU0ZTdmOTB4NjcxZjBlM2I2NzRhZTdjZGRjNzkwZWNjNGU5NDZmNGJjYTc0Yjk4Yjc4YTEyN2M3YjU2YmQ2NjczZjFjZTFmMHgxOWZjMDczNzk3YTM5YjI3MmU0MGNkMzA2MTVmNTVmZWZlYjY4MmMxYWMxNDE0MzA3MWQwNDQ5YTU0MjZlNGUweDE3YmVlNDdkMjYyYTQ5N2ZkMWY3YzVjNmQ1YTdjNzBmYTQyMDk0ODBiZjVkOTczMTFjNTA5NjYxOWU5ZmQxMzB4MjA3M2NmZjkyZDMxNDFiNDgwNzYzNTM5Y2ZmMjk3OGE0Yzc5NDQ3MjFjYzkzN2JhMDBjYzg1MjcyNzQ0NzFlMzB4M2JkN2IzZTJjMTg4NTg3N2Y0MzE4MmE1NWE5MWQ0OGY5YzU4ZDE1MmU3MzBmZTJjN2FhNDZiMWZhNjYzYmFhMHgyMjZlYmM5YTUzOGI1YmJhZmYxMjhlZGZiOWJiZjVmYTBjZWIxMDA3MTlhMTRjOGRmZWQ5ZmZiYmJhZDliNmI3MHhkMzk1ZjBiMDhiOWZlZGUwMzczYTA2ZTE1NTJjMGU2MzRhNDk1NzJhZjFkODMwZGM2ZTM5NGU4YTVkM2IyMWEweDI4MjQyNDM5YjUyNDU0MGEzMGQ0OWI2OGUxOWUzMWJhNTI4NGJkM2JjZjFlMGYyZjQxZjc3ZDUzMzFmOTlmZmEweDM3MGQ2ZmExOWVhYWMxNDJkMmRlMDM0ODAxYWI4NWUwYjQ1N2UxMjllOTFmOTI5NzU0YjQ4YzYxNTRkNGRmNjB4OWExNmY1NzNiMzI4MGYzOTA3NjJhYmYyNjk1NzllYWEzNzkzOWJjMGM3NTNmZWIwYTJiMmUwYmNiZGUxNjU5MHgyMjI4ZTM2MGZiNWIxNjJiNDk2YWM0NDNmOTgxMjdlZTNjMDAyMWE2OTBiNzFiMjY4ZDk5OTgxMzY4MjMxZDk3MHg3ZTQyYzJjYTYzM2QyYzQ5ZmFiZjgzOTkxNDc2ZDIwOTQzMWUzNGQ4MDMyYjZhMWI5NzY3NWYzYzU2N2Y5NDQweDJjZTEyZDcyNjk2NjM3NzBjM2NhYjg1YTYyMTVhMzJlZWQzNWZkYTFkOGU5ZDc1M2E1MGZlOTYwOTc3MjRhOWYweDNkNzQyNzcwNGM2MWUyMDA5ZWViOWIxYjQ1YTAxMjUwODRiYzRkYWY3MDk3M2E3YmEwYjIyMzE4MTViMTVkZTB4MTBmOGFiZjA3NjQxODU4NjFjMTI2N2ZjZjRiNGIzM2NhMDk2ZmI0ZGRjNDYyNjczMmQ4NjkyMWU1NTNlNjljNjB4MTdjY2FmNmYyNmY3MjY3YTAyNWQ3Y2I0NTZlM2FlYjI1MWExYTYyMGFhZjY1NjhhNWM5NTY0NGM3YzU5MTRjYzB4NjNiYjMwNmI5NjMxMDA1MTM4NWMzY2UwMGNhODIwYWQwZTM2NTFhNmU1NTc1NGQ1OWRlNmRmMjhjZWE0ZDUxMHgxZjc2MWVlNTU1M2M1ZTg2ZjJjMzA0YTE4MDk1YWI3NDAzMjQyZTBiNjVlNjA4YmM5MjBjZjk5M2E0MTY5OTc0MHhkYzVmMDBiYmZkN2MxZDlhMjNjMGU2NjY4NTliYTY1NjRiY2RlODc2MWI0NTcxN2NkNmJkZmMwOWRlNGU4ZjIweDZkZTUxMTUyMGUyNzdiN2RmMDdjMzUzNjM4MWMxM2ViNDRjZjc5MGEyMzBhYmMzOTEwODk3NjBiZmM0MGVmMjB4MmExMzQzNDhjODY2MGVmY2Y5ZWY1NDg2M2U3MDUyOGExZmQ0NDgxYjUwYTFmZTIxZjI0YThjMDZlMTBjY2EwMzB4YWViNTAyM2JiYjlhNjRjNGJkODAwODllOTllZGY4ZWQ1ZjZmMWZmYjYzYTdkYmJhMWIzMzUyMGJjZmNlMzdiMHgxNDFhNmQwODEwMzY2YWUyMjVlY2I1ZjBiZmRjOTk5NTQwNmM1OTYwYWIyNjE1NTgzNmZjNTFmYjdjYjkzM2QxMHg5ZDJlYTA1ZWY1NGRhZGJiZTc3NmY0MDRkY2E2NjI2Y2MwYjI1Mzk5OTBiYzBiOGJmZTg3NDk3ZjFlMmM1YjcweDFlNTZkMjQ0YThlNDFiZTVkMTA0ZDVmOGVmNzA4OTFkMjJkNGE1NDMyNDQxYmZlOGZmMWExNmU5MTcxOWNkZGUweDFkNGYwMjBjNTdjNGYxNGFlYzkwOGIyZjk5YjVjNGZkNWUwOTQ0N2ZhODVjMmZkNjhiYTRkNWM1ZjUwYzdiNDkweDc2MzkxMWEzYTkyYTRmMGUwOWY0ZTE0Y2QwMzM5OGQ4ZDgyYTFlMDlkYjgwZmIwZWUxZTgzMzc2NGMxOGZkMzB4MTI4NTcyNzViZTJmZTZiOWJhMmVjNjhmOTA2MTY0M2YxZmM1ZDlhMmM1ZTQ3ZTU1Njg0MzY2ZTU0YjMwMjk0NjB4MmVkMTFjY2QyZTJlMjM3NjY1NWZmZTlhOTZjNGI4MWFkYzBhNjAzNTNjNWQ4M2Q0ZDBlYmY1MGQxYmJmODdjMDB4M2UzMWRlODk1OGU4MjY0NWIzMjBkNWUzZTk2NmVmNDcyNmQ1YjFjMmNmYmI0YWNkMjg4YTIxNTQzYzZkNTk0MHgxMWU4ODBkZmVmZGJkMDg4NThhZTg5MDA0NjUzM2Q1OGRhMjhhNjA4ZDdlOTA1MzY2ZWMyY2E0YTM2ZTcxOTYzMHgxODM1YjI3NWRlYWVkMmQwMDcwNGE5YzNjYzIxYWI3YTQ0YTM0NjYyOTc4ZDUzYzE5MGRjMjVlOTY5YTUwN2IyMHg2OGI3NTMxNWUyNWVkNGFjZTVhNGE5NDgwZTFkODJjZTVkNDRmNzZmMTMyNDI0MDQxOWYzNzJmZjhkM2MzZjUweDFiN2VmN2QwNGFlYzczZDYyYjA1MmQyYWQxMmI5MmE0MjY4ZmNjZDc5NWM4MzlkNjk4YWQzYjIyODIzMjc0ZDEweDI4YzBjODQ4MDIyYTkwNjA2ZjYxOTNmZjU1MDFiNTcyMTZiNjcwNzI3ZjRiOGVmY2MyNDBkMzBiYmFhOWYwM2YweDEzYmRhNDkyOTZjYmNjNTE2ODZhN2JmYjFjMzlmM2YyNTQzNzA5ODVhMTY2NjBlZmQ2ZTVkODJkNGYwNjhlMWIweDJlNzk4N2VhODIwNDM4OWQxMWViMTBiMzQyNjVlMzc4YTk0NTcyOWY4NmMzZTBlMmZkMzg0OTBkM2E1OTQxNDEweDgyNmQ0YTIzMjRhZDNhYTRiMmI0NWMxMGExOTBmZWRlZjcwMmFlZmZkYTMyMjZjZTU0MTVmZmZkMDM5MzVjODB4MmRiZWVlODVlYWVhYTlmYTM2NzVlZjU0MWM5ZGY3YmI5NjRhODU0MzVjM2I1OTY4NWY5M2I0MzQwMzZkZWQweDIyN2VlN2E5NDVlZGFlZTY5MTk0MThlY2IzMjc5YjExZTZmYTQ0ZjVmNWM1YWJmYjk2NmE0YmU1OTljYjg2YzcweDFkMGE2ZDFhOTUxOTg3NzgwNWFjOTBkNjk2ZmFmMmE1ZmZhZGMyMzk4NmRlOGM2OThkNTQxNDcxYzcyNDQyMjAweDIyMDhhYWJhNTA4YWU4MTZkYTRmMzMzYjc4NTRmYmJjZDEwZWVhMWRiMjg0ZWMzZTlmNGRlMDJiMjVmNmU5ZDQweDI4YTU4OTAxMDM1YjJjOTllMzZhN2QyOWI1ODdhMjE1YzllNTkyNjhlMmY4ZTAxYTE3NTcyMDk3MWNjZjA0ZWMweDExMmY2ZDhkNDJiMGEwZDEyM2EwNzg2NWNhMTM3NmRmMzE3YTJhMTRmZmMwMTkxMjI2ZjM4YThhZGZkNjIzODB4OGM2ZWIxOWMwMTZkMTgzMzE3NGRkYTE4MmQyNjZkNWM3MjdmOTdmYjRkMDFmMWRhZjkwNmI2ZDNjNmUyMzA4MHgxMzU5ZDJkNmM4YjVhMTE2ZDBiMzhiOTVmOWM2NDJkZjc1YjFiZTlhNDhjODY5OGVjZmVhOTEwM2Y3M2YxODc5MHgxMGM1MDUyZWM2N2FiOWI2YTQ2N2MxY2MxODc4ZDkxYWFhMDdhYWNmNzcyNWY4YTVlZDQyYjY5OWM0YWYzY2E3MHg1ODNjNGQyOTJkNTRmM2NkYjcwODgwM2U2MzM4ZmM2YWZkYjE4OGQ1ZDRlOWYwNjAxOTM4MjM2ODRjOTZjNzUweDJkOTRhMWM1NWJlMzgyMTUxYTQwNTRjNWI5NjMyMmU3YmNkMWZlMmIzZTA3NmUxNmVlMmMxOGJmYzA2ZjU3YjQweDE1ZTM0MDJmZGRlODc3MGZiOTk3MzY5NTc5YzFiMTcwM2VmNzdjNjcxOTI3ZWFkODBkYmM2NGRkMjIxMWMzZWMweDE4NWJlOTg3ODQ4MTdmMjJmN2IyMWU2Yjg2N2Q1YTcxYjUwMDBiZWY4YmI5MDJlYjMwMjY3N2UyMGE3MjdiZTMweDE4ZGI0MzIxYzcyMWMwMzY2NmVkODkyN2M4OTg5MGFhOGFhZDFiMDBjMDU0NTQ3YjVjYTE0Y2Q5NGRlNDY3YjYweDJhODUyYjYyNDdmNWQ2MWYwYzM5MGIzZjNkNzk5MTg4NTI4ODQ5YmNkMmNkMGFmZjRlYjIxMzRhMDM5YjUxMjYweDI1MTBhZWVkNTFiN2Y1MDZlNjVmYjlhMThlZTAxMjRhYTUyNzZmNmRlMWNkNzcxYjE2NTkzMDIwNGRhNThmMjIweGYyMDc0YTMyZWI4MjYwZmI1YmQzYTIzNmYwM2E0N2I0N2I3ZmI1NGRjYWQxZDc5NzdkNjQ4NjUxM2JhYjVmMjB4MmY0YzY5Mjk3ODY2YmQ0NWE4MjcwZTE5OTQxOTI2Y2VjMzUzMWM5ZTEyYzRjMmM4NDk3MTQwNGJmYTA0NDA5MDB4MTU0NjY4NzI3ZDJkYmFkZjA1ZDA4M2E2NTA5M2MwZDBlOTJkZjVmZDVmM2ZkNzVlOWI3OTJjNTYyYTM3NDczZjB4MWU2ZmZjNWQ2YTFmZjVkYzRmZDc3ZmM1YWI1YzhjNGU4ZDNlMmUzNzViY2QxMTk0YTkxZTViMGY3YjEzY2FkZjB4MmNmMWExZDdjNDQzMDkxMDlkNzVhY2JjOTM5NWNiODM5OGM4YjJkNDI4NTM4NTcxZmFmYTM4OWRhMjk5OTBjNjB4MTQwZmIzOWE4OWYyNmY2ZDg3Y2Y3NmNkNWNlOGRhNDdhYTVkOGEwMjNlMjRjZjAxNmVjZjY0Y2Y3OTNjOTg4MDB4MTI4OWQxM2Q1OGExN2I1YmYwNzEyYjIwMWZiM2NkZGZjZTJjMTZkYWMxNTk5OTBiODI5OGE5M2E4NTg5ZjllODB4ZjQ1Y2Y5NzRkMmM5ZWRiNTc4MWU4ZDNkMjA3YWRjODM3MGNmNTZiYzUyMTg3NDk2MTA5MjBmZTk4YjJkYjJlMHgxMTkwOWM4MWExNjUxODA0NmI3OWVkZmQyNGY1YWJjYzU4NWE4MWQxYjMzMzU2OGI4Njg3YTFjOWVjZWI0NGQ0MHgyOTkwYjIzYzgxODgyZjc3MDlmM2I4OTFhMGUzZGE0ZDY5MTc2NzJmMmQ1YTEwNDFmZDdiYmQ2NzkyMzMwZDE2MHg2MDk1NTFiMTQ3MTZjYTNjZDU1NjBlMDgyMWU3Mjg1ZTBhMDgzZWE5YTE2ZGMxMDJlY2Y0NjFlNGFlZjcyNzcweGM4YzFhYmRmYWI5OWQwM2ZkOTNkY2VkMjQ2NzM1NGI2MTc1ZGUxNzU1ZjRmOTNkYzA4ODBlYWEwOGQwM2Y3NzB4MTM4YmQwOThjNDkyM2I5ZmJkMDJmMzNmOGJlYzZjNzMwZGIzZmVkMjk4ZWMwOWY3OGE3YTU1ZDA4ZjJlMGIxMDB4MmU2MWU0YmMwMjE2MzAxMTQ2NzNmMGY3NzE2MWFlNTVkY2QwYjQ1Y2UwN2Q5YWUzZjIxYmI1YTMxOTBmMTRjMDB4MTI0ODYwOTEzZTNkZjhmNjVhOWM0MDYwY2UzMjk3YzYyNmFiZDFjMjI0MDFjOTA1ZGRiNDA4MjYwZDhlOTEwMHgxMzgwN2Y4OWMzOTRhMTMzZWMxMDQ4MDRkOTU1Y2JlMTI1ZjI0YzU3MDFkOTgyODZjNmFjOGI3ZWQwNTJlYzgweDJlODhkMWE2OTM4ZjA3ODgxMzJhYTllZWFlYzA4ZDJmNTlhYTQ0NDA1MGM4ZjRjNGU4NTU3OGFiYjBmYzJmZTUweDFmM2QyNGYxN2NmYzYwNTBhMGNiZjY0ZTFmMTc4N2UyMjU3YmUzYzNiYTYwN2MyZThmY2MxZjI2YWJmMzEwNDB4MWZlMWNiMGUyYWUxNjlmODNiOWQ0ZjEzM2Q0MWZiNWIzZmU2Yzc2YTgyYTkxNmJmZDliNjJmODJmMGY4ZDBiZjB4ZWY3OTM1MTIyOTQwOWNkMzUzMzI5MjIxMjI5ODI3ZTE5OTQ2ZjNkOGQxYzQ4YmY1ZTMzNzdmOTE3NzA3MWYzMHgxOGZiMmU0NmZjMWI5MGZlMWM0ODkzZWY3N2E5ZDExMTUwNzU1MTg4MzEyNzg2MGU4OTA4ODYwODM3M2JlZGE5MHg3N2FmZTI1NzlmNDJlYzE0YzMyZWYwNzYxZTIzYTNjYzBhZDYyNjNhNjhjNWNiNjE5MTZiZDU3MTIwZDE4NjgweDc5NzY5MDkyZGFhNWE3NTI2NDJjMDRjY2Y4YTZlYTU0ZTJhYzk4MzZmZGQ2NWQyNDhiMTg2ZjE0OTBiN2I5OTB4MWQ4YmYyMjljMTk5NjhmMDI1NGViNmUwOWM1YzhiZmQ2N2ViOTczNDYwNmI2NzZiNjYzYzc2Y2Y3NmJhYjRhNTB4MmEzM2I3ZDg1NWU3ZmU1NWY5MzU1NmU0OWU0YjM3NzM3NjY0ZjE0MjM2ZjE3MjU2NDI4ZjI5ZjZlYzFiZGRhZDB4MjViMDMzMWQ3ZTJiMTVhZjRlYzE2MWM4NmU4NGJhNmFiMjA1NjA3N2U3YWE3NTM2MzQwZGMzMTg3Y2NjYThiMjB4NzYyMDk4ZjVmZTI2NTk4Y2NiZjQ1ZTQ4MTAyMTFiMGZmY2Y4Y2NiYjkyYzE2ZTJmNGYxM2YyMjM0MjQ3NGUyMHhlMjM0ZDcyMGQ3MGIyODg2ZDBkYTRjMDA3YjFiZGE0MjM2MmUxNDQxODVjNzA3MTZkZWNlMmI2MTcyYzI1MTQweDFkODJiZWRjY2QyYmM4YTA2ZTM3NDJlNzIwYjdmZWMyZWE3MjE4MmYxMWMwYzYwZDEzNWM4MTExNTJhYTRiNjAweDQ4MDA2NGQ0YjNlYjBhZGE1ZTlhM2U3ZDA1OTMwYjdjMzM5N2ZkNmI5NGQ0ODEzMTRiZDFjNjkwYTE3Yzk3OTB4MTBhODkyNzYzYjNjY2E5ZWY3NTkzZmJiMTE0MGVkYzhjOGU0NTgwNTY4NTYwY2Y0MTg2N2Y3NDY0ZmIwYzExYTB4YjVlYzY0NTQ4ZWE4NDFhYzkyMWY5YjI1NTM2ODA3ODU5NzhiMzE1NjY3YWU0NzE0ZGRlNGNkN2Y0ZGU4YjkxMHgxMDU1NGFjYTRlMzQ4ZTU5NDk3NjFiZDcxMzFkZmFlYmQ3ODAxMGVkZDAzMGUxYTljZTNjNjVjOWRiOTMxZDQ2MHgxNWJlNjZmMzhkODZiMDk5OGI5MzY1NTQ2MmIxZjQ3NWI5YmU5ZGUzMDZlMTUwZDRhYzY0OGZhYjNkYjBjZmY2MHgxNzZhZDM2MDBmZDM0OTExODJkMTgyOTU3ZmZhZDAxYmY2YzI2ZTlkNGFiMGMyM2NhYWYzMDhlNDI3ZDNkYmU4MHgyYjZmMzU1YjNkYmY2NWYwOTMzNTAwMWQ3MDVhYzEyNWUzYmViMjBmNGZjMTFiZDNjZTgyYjVjZjBhZjJlNmYyMHgxYzg1YzA2YTZkNWQ0MGQ4MWQ3Yzg5ZWRlZmIzMmQxYTg0NDhjNTEyODhmYTI5NmI2ZGU5ZmY3ODhjNzc0NTEweDIwZTFlODc2YzQ3NDZhMGNiZDlhNTFkNzZiMmUyNWY4MjM2MWMzODllNDNmN2QxZjUxYTcwYWFhYzI0NjBkNzkweDIwZTQ2MjE5ZjY4NDE4NmQyYTAyNGI2MzdiYzM1YTI5ZWUzYjA4Y2U3Mzc3MDEzOTJkOTg3ZGRhOTIxN2ZhMDgweDJlYTcyNzlkYjlmMmFhMGY2NTRlOTg3OTA3Mjc3YzI0NDgwNzY2MzY3YThiZDkwZTI4YmUwZjJlZDYwOTEzNjcweDEzNmJlMmE3ZjE4OTI0YzkzNjIwOTZkNDcyYmM3NWNhMDk2OWRjMDc3YzkxNzFiMTY0MWJlOTUwOTE3ODBmNzQweDFjYTIwMzM1MDFiYWEzZjczMDY3YzQzMDBmYjBmNTExMTllZDU3MzZmYmM4ZjFmNmM5MjRiYWYwZGY1YTBlOWUweGE4MmYxOTljMjUwNTI3N2VjYWE3NWU0OTVmMzRlMzUyNTgyNGY3YTRhOWQ5ZmExZGE4MTA4MzJiNDhhNTBjNzB4ZWNmMTA0ODUzMDdiNGJhZTkyZmVmYjBkN2Y3NzgyYTlmMzdhMjcyMmU3ZWQ5ZWI3OTI1YTJkZWE1ODBiN2Q1MHg3YjY0MjEzOGRmZDZhNmRkMTJhYTIyZjA4YTgyOTZkNjg2MTVjODQ3OGYxM2FmMTZhZWJiYmIzMzlhMzkzNmIweDFkOWRkYTQzYTI1NTkzZmZkMjI1NmQzNDkyMWZiODZlZDcwZTc2MGJhNzZkNjFlOWNiYzNiNmRkMGYxYTIxNTAweDJmMWFmMjI4NTIwYzhiNzUxZGM5MTEzNmM5MWM2YmNjZDUzNjdlYjA4MjEzZDM5Mjk1OGNlMmZkM2Q3ZDJmY2UweDFmZWNmZTgzM2FkNTQwNDU1YzZkNmMxYWIzZGU0YWJhZTYxYWRhNjI1YTFhMmI2YjE4NTUxYTQ1YTZjZGUxMjMweDE4ZmM4ZTYwOGM3MzViMmIzYjBkNzU4MzQ2MDIyNzU3NTY1N2ZmOGE3N2FiZTYzN2JkZDNhZDI4ZTRhMjNjODgweDI4Zjc0MGJjMTE4MmU5NzA2ZWJmMDNjYjNmNTNhYmE4YTQzY2UwYjYxODc4M2E1NTg2Mzg4YTc1NDdmYWE4MTUweDQ3OTk4Y2MwYWY1YTI2Yjk0YWQzMDFlNGI5OThkMjllOTYwYTQ4NTFjZmQxMzgyMmJlZDM1YjcxNDY5NjZhNDB4MWI1ZjE1MjViMzFkYjkxMWRkYTQzZTQxNWUxYjlhM2E5NzI1YzdiNTJlODgwZWUxMzBhMTRhNjkyYjc3N2I3MDB4Mjc1YTgzZmE1ZDE5YjQ1MzVmNjVlOTY1YTkwZWFjOWJmNzcwYWU5YmQxZDdiMWFmOTQ1ZmE1N2VkNWM4ZGU2ZTB4MmU4Nzg5MjU3ZWQyY2JjY2NiNDMwNTY4ZTQ5YmM5ZGMyYTU2MzM1OTgwOGM5ODk3Y2UzZTQwYTZmNmEyN2FhODB4OTI3ZjQ2Y2ZlODBmZWVmZWIyNzIxYTRjMDllOWQxN2Y2MGMzNDUwMGRjZDZlNDFlMjkyNWEzOWM4ZTJjN2MxMHgxZjg2OGFlMDQ4MzJhNWRiYzM3NjE5YmZlNmFiNmE5N2ZkOGZiMmNmYmMxZWNmOWUwZTQ4NGJiZmU3Njk4MTAxMHg5ZDdhMTFlMjdkMmY1MzEwOWI3M2Y3NDViMmRlZmVkNjVkOTRiYTgwZjMwOGZiMTljZTZkNTZjOWI0NWVmZjQweDI4MmQ4NTdjZmU4ZGEzYjUxMDRlMWMyODIzZmI3YzViOWE3YjI1OTI0ZmRhNTk5NWIwYzM1MWFhMmI4NzlkZmYweDIwYmE4YTlmY2VjODE1YjEzZjM0OWZmODMwYWU2NjNiMjc1NzZlMTM1YzA3NDRmNjk4N2ZiMGY2ZmY0OWMyMTcweDExYjZhZmM5MWUzMmYxY2E0NTg5ZmJhMTJlNjU3ZDIyNmQ1N2I0NzFkZGQyYWIxYjY2YThhZTRkY2JmYjEzNmUweDJlNjY2NDAyYWM5Y2M1ODgzMTZlMzM1YzdkOTNkYjM0NDc4OGVlYzJjNzJkZGYzZjkwODE0MTczNmNlYmMzYmUweDE3NTIyZTBlOWU2NGY3OTVhMjAyYTExMGUyODNmYWFkNzA1N2FlYzVjOWVkOWExYTc0OTIwZjI3OTRmMTg1OTUweDJkMmVkMTdmN2ExZjNlZTllMjBiNDcwY2FkNGNjNzMxOWU2YWRiNDBlMmZmMjRiNzg3OGNiOTg3OGVkYmQzYjkweDFhODFlZmIxOWQ3ZTFlZGFhOTZmYTI3NmU4OWU4NWQwOGY3NWU1NGE4MTM2ZjRkNzNjOTM3ZGExNmM3YmY5ZjQweDI3ZmY1N2MxY2E4NDdlNTcyMTBhN2I0NGU1MmU1NjMwZjI5OWM1ZjQ1MWM3YTBkNTE1YTE2YmIzYmQzM2UyMzcweDFjMWE4ZTIyMjMwYWJjZDEzYzViZTk2MDMxYmZhMTY3ODQwZDExN2IzYzZhNWEwYTExYmUyNmE3ZjVmYjFhOTQweDJhMWMzZjE1ZDQ5MjdjODQzNjI3YTljZDUzM2U0MjUwZDgxZTc3NzRkMmMzMmI1OWQ1ODM2ZjljMTlhNTY1NzB4MmRkYmI3MjM5ZWI5MDRkODFjNTI0OTliMzdjYjRiZTFhZjAzNzNhMTBhYzExMmUxODVhY2IyMTk4OTkzNTdlNDB4ZGZmMTk4MzkzMDg1YTc1NGUwZDZmYWVjNTRiZTgxZDhlZGY4YmMyNWVkYWRhYjQ4YTg2ZmFkNmRhMGFmYjYwMHgxMGQ1MGMyNDczMTQ2YmJjNzYyNzVmY2M1ODlkMDM4ZGVjOGRiMjg3Mjg3ODlmMjhiNmQ1ZjUwNGJkMTY0NWNhMHg2MWU4MzI4ZmI1NTkzZjkyYTUzZGZkNDBlMTAyMmU2MjMxYmE0NTk0ODUwNjI4MjUzNmIwOGI0NDc2YzE1MzgweDFiNTg5MjQzODQ3MTk4ZGVkOTBiNjQ0YmVlMzFhYzU4MDY3ZGViZjNmMDdkM2M1MWNmYTVhMGRkOWY2ZDk3ODQweDRiMDBjMGRhMWY4NTFlNTk4NjNiMDUzYmQ0YzYwODcxOTBmMGJkY2NlZDk5ZDVjZTZmNjdhNDIwYTNiZDFmNzB4MjM5OTQxYTQ2YzJiOTNkOTEyNmE3MDE2MzAwOWE3YWMyN2Y4YThkNDJlMzUwMThiM2JlYzhjZGNiNWRkZmQ2NzB4MjA0ZjI2Y2E3OTkzYjAzYWMyYzM1Mzc3Y2IwYTM3MTJiZmM5YmMzZWMwYmZlY2I0ZTg3ZWY2ODE0YWNmMmVhMjB4ODVhZmY5YzdmZGFkYmEwMzlkODMyZDhiZTE2NWExZTU3NDdjZjczMDhkNTE1ZTM0OGVmMTE3ZTkyNmQ3MjFjMHgyNDkwNDJhOGRjMTExZjI3YzRhZTlkYjA0NGMwYjBiM2YxMGU1N2QwNWUwOTMxNThlZmQzNzVkZjAwZWEyMDY4MHg2ZTc5OWJjZGYyYjRhNzQ1NDI4NTRmMzAyOTgwM2UyZjg0NTUwNjY1MjAzMzI3YjNlMDgyNTk3NzQxM2U5NmIweDFjYjNjYWVkNGJmZmI2YWNhOWY0ZDJjMDAyOTIxYmMzZmZmZWQzMzNjYWUxMjA4NWM2MTI0OTYxODNiODc5OTYweGI0N2U5NzU1ZmFlNDgwMTI4YTEyOGJmZDRmYWE2YTNkZDZlYTAzY2FiNTY2ODg5ZGNkOTllODRkMzEwZDUxYzB4YzdlNGNlYTM2NWMyMDYxOTIwYTBjOWZkMmMzNjBhNjUwNjI5M2JjMDI0ZmQxY2EzZjBiYjczMGRhODg2YTRmMHgyMWRhMWY3MDFiYWM3N2JjYmJhYTMwZDk2NGQ2ZjZmNjNkYmUxYjIwZDlkNjk4OGM4ZGNkN2JhNDE4NzIxNWRmMHg5YWU2MTJlOGJhMWNhMTM3MDkwNWZiNjc4OTlkMTBkYjg2YjQ3YmQxOTk2NWI2ZWRkMWE5NDg2ZTNjNmNjNTUweDI2MmUxZTBiNTZjYWM0N2ZjMTUwZjI4NDQ5MTE5MGU2YWFiNzU0NDViMGM5OTM3M2ZlMWY3YTBlM2I5NWNmM2QweDIzNGJmNGE3ZGNlNzU4N2MyYzg3YzI5M2UzYmI3YzllMmE3YmZhNWYyOWZkNGRkZWFhNWQzZjY3NDkxZDM0YmQweDJmNmNiYWM2OTRjODg2YjAyZDBhNTI3Y2FjNzQ0ZmI2NThkMjY5MGUyMTNkNzQzMmVlZTY3ZjZjYjY5ZjcwYzIweDIyYWNjYjE4YjdjNDliNGI3YmI4YzlmZGY3OGI3YWRlZDUyYWExODQyZmZmODE4ZDlhMzMwMDg3NmRlYzNhZDkweDgxZTJmMDY1MmY4OThjNmQ2NTlmMjJkMmM3N2JlMzAyZWFiZDkxODJhMGIzZDNjYmY2MjNhMWRmN2Y4ZjJmYzB4MTJjMGEyNWU3MGQwMDZlY2NlYTNhZGE3NWQ2NjliOGM1MzRiOTYyODkwZjNmZmMwMTZiMzE4NmFkNjc1YjkzNTB4MTBlZjljMjM4NDgxMjhjYzJmZDZmYzg2OWRmMjRkN2FiNTZlZmQzNDllZGQ1NmY0OWY4ZDRmMjM4MWRmMzI1OTB4MjE2MWNkMjgwNzcyODE5ZGQ0YTgxMjYyYjcxZGYxYmNjMmMxZDQxYjk0OTFlMDYyMGJkYTM0Nzk2MmIyNDBmMDB4MmNlYmIwYWU1MTA4MzE4ZWI0MDY1OTAwNDFiNTI0ODI5MjUzMzM2NGY3OTliYzQxYjdmNGZkZDEyY2I4ZDM4YTB4MmIyMDkyZjg2YjU5NzlhN2ZlNGY3YzIyZDk1NjFmM2JmMjg1MjI4M2E2NTY4ODBmYjc1OWUwODcwOWEwYTYyZjB4MTU2NmIzNDAyZDc3NGI4YzA4MTQ2MTg4NDI1YTQ0MjQ1MGNmYzkwMGNmNjQzZTczODJiMmQ4NTA3YTA2NWZlZDB4MTFhMzE2YWEzMTYwN2YyNjhmYjRjNTZkNmM1N2JhMDE2MjdjMzYzNWZjY2Y4ZDNkMWExNjNlNjAxZDFhMDE3MzB4ZGU3ZWUwNjljOTM0MjU2Yjc4MjY0OGI1NjBlNTk1NDA4YTVlODQzNDY0NDYwOTE1MmUzNTNkOWMyODc0ZTQ0MHgyZDM2ZjQwMjkyNDU3MDRjYzg0ZGYwMjk3NzA4YzVlNTg0NWMzNmFlNzA2YzcyZTY3MTI4Yjg5NDllYWIxYWYweDFiOGNjMzI2YjVlZTE2MGY1MzE5OGMyMTdmYjM0ZTg5OWJkZTQ2Y2Q4MmRhYmRjMjg0ZDc5NTFkNTQ2Zjg1ODB4Mjc2MjVkYTBmNzNlYTA3MTEwNjg5ZmIyMTg3YjcxNjk0Y2JmOTIwM2ZkNGRkZjhhOTZlY2U4NTQwNzU1MGViYjB4MWNkODMzOGEzZTViMWFkN2NkYzBkYTU4MWE2OTUwZjZkZWEzNDljM2VkZGEwNmNiOTliYTAyNWI5NGU0NzkwZDB4NWVhMDJkNjViMjA5ZjZkYTc2Mzg1NmM5NGI2NDM4Yzc4YThhZWQ4ZDNlNjdlODc3YTEwYTg0MDcyNzQxYTU2MHg5ZjdjYjY4ZDRlMzg4Zjg1MzY2Y2ZjZjI4NGE4OTVkOGI2MjUwY2VkNjI3ZTgxMDgxNzc0M2NlMDMzMzBhNTUweDE4YzYyMzBkZGMwZjg5NjgyN2IwNDNmNWU1OGRiZDFhZWMxMzk5NWEyMDJlNGViY2RmZWI5NjllOWQ1YzEyMTIweDczYTYxMTRiOTk3Mjg1ZTFhOTFjMGEwZmRjY2RhYTg0NTJlNGYwN2JmZDJlMWExMDU3ODIzMjA5NmRiNmRjZDB4MmU3ODc0NjM0MGIyYTZkMjIyYzZhMWZjMDgzOGFkZjVmZTAxM2YzOWIxNjYwY2U3YTNlNzc0MmIyZjM3YmU3ZjB4N2FhMjdlNzE1MGJhZGRkMDYzMDNhZDhlNWU0YmY0MjQ5YjdlYTg0NjU1M2RlZjI4ZTY3NTI1OWQzZTVjODUxMHhiNjZmZGVjMjEwZWE0ZWFiZjYyM2QyNzEyY2Y0ZDlmYTkwMjczY2NiNDY0M2Y2ODBjYmM5ODM0NTcxNWVhZDgweDJmYjZhMjlkOWYzOTRhNTg5YjYzM2I4YTRkNmJlNTFjOWMwNjAxY2UwYjE0MGJlNjQxYWNlYTQxYzQ5YWE1ZTMweDI5MDI1Y2M2NmZkMDQxYzRmYzg0NWU5YzFjMmNkMTI4ODU2OWZiMjQzZDA0OWJkNjc1YTY5ZGM4ODliMmNlMmEweDE1MDk2M2YwYWNhOWJjYmU0MTI2MjE0YWI5YzYyN2E2ZjdlZDczMWNmYTY5NTE2OGI4NWQ1MzRiMTdiZTNmNDgweGVkNTk3ODAzMDIyNTc2NjNmNzJjMWJmYzY2NTZlYjdiNWJjYTJlNDdiZWMwZDU3OThhMDhhMzJhNjFhOGE2NTB4N2UxOWNiOGE4OTMzNjliM2QzMGFlMTg4Yzc2N2YzOTFjMTE4ODhhMzAwMGRlYmZjOGQzMGMwNjE0M2NjMDg0MHg2MDBjN2QyYjY5NDYzNDVlNWYxZWVlYWZiNWViOGVjMmI2ZWNmZTUyOGQyYzA1MmNkODYwYWZiNGEzYWEyNzIweDU5NjA4M2I2Yzk3MmJjMTMwMjJhMWYzM2Q2NTIzYjQ3NzNmMmNkMGE0ODBlMTllYTAxMjUxMTlmMDM4NTcwNTB4MjEwYjVjMzZmMjdhMDdkOTdmOThiOWQ4NjYzZDg1ZGIyZTY0NTEzMDk5YThlMWVmNmRiMjEwNDM2MzFlMjRjNDB4MTNiYjI3NjRiZjE0NzVjZmM3YmI5ZjNk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AOOrEAD1qxAABQAAAAkAAAAJAAAACQAAAAYAAAAIAAAA1A8RANkPEQDiDxEA6w8RAPQPEQD6DxEAAAAAAAQAAAAAAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC5ycwAAkBARAF4AAAAsAAAAHQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvY29udmVydC5ycwAAABERAGYAAADwAQAAFgAAAGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8AAAB4EREAGQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvZGl2aXNpb24ucnMAnBERAGcAAABwAAAACQAAAGNhbGxlZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWUAmuZ/OeoRARrXrEtDtqcbS78ShfOES3dkJPaw9qDSMGf//1Ox/v+rHquq//////65/////////3//////////////////////7f////////8poDHhck5kMF1YgYG2RVC4jcpxaJFqgZdH/XzYFowgPCmgMeFyTmQwXViBgbZFULiRcLl5SOgzKAEAAPCT9eFD////////////////////////////////L/z///7///8BAAAA/////wAAAAAAAAAA/////wAAAAD//////////wBB4KbEAAuJK6rjypLlj5gRLZUZtYU+eZrAg52TqYjrZ9W2lUxsR+WN8QTRCabmdgpGFzQcNB/f9AAAAAAQAAAACAAAAGQAAAAvdXNyL2xvY2FsL2NhcmdvL2dpdC9jaGVja291dHMvbGFtYmRhd29ya3MtZWRlOTYzMzY3MWQxMWExNS9iZTRhMzI5L21hdGgvc3JjL2VsbGlwdGljX2N1cnZlL3BvaW50LnJzoBMRAGQAAAA0AAAAHQAAAAAAAACT5ID6w172FW3sVqKXGgdcRVdScFNYzne6WMdTV5hIXwIADMQLAPTr/f8CAAAACXZJbnZhbGlkSGV4U3RyaW5nSW52YWxpZERlY1N0cmluZ0hleFN0cmluZ0lzVG9vQmlnRW1wdHlTdHJpbmdEaXZpc2lvbkJ5WmVybwAAAAAAAAQAAAAEAAAAAwAAAFJvb3RPZlVuaXR5RXJyb3JJbnZaZXJvRXJyb3Jn5glqha5nu3Lzbjw69U+lf1IOUYxoBZur2YMfGc3gWy9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3NsaWNlLnJzAADgFBEASgAAAL4BAAAdAAAARmllbGRFbGVtZW50dmFsdWUAAAAAAAAABAAAAAQAAABlAAAAAAAAAAQAAAAEAAAAGgAAAHRvb2xzL2dhcmFnYV9ycy9zcmMvYWxnZWJyYS9yYXRpb25hbF9mdW5jdGlvbi5yc3AVEQAwAAAAHwAAAFcAAAB0b29scy9nYXJhZ2FfcnMvc3JjL2NhbGxkYXRhL3NpZ25hdHVyZXMucnMAALAVEQAqAAAAjwAAAAgAAACwFREAKgAAAOQAAAAIAAAAAAAAAAjJvPNn5glqO6fKhIWuZ7sr+JT+cvNuPPE2HV869U+l0YLmrX9SDlEfbD4rjGgFm2u9Qfur2YMfeSF+ExnN4FuwFREAKgAAAPAAAAAaAAAAsBURACoAAAD4AAAAGgAAAGYAAAAMAAAABAAAAGcAAABJbnZhbGlkIHBvaW50IFIAsBURACoAAABCAQAASwAAAEludmFsaWQgcG9pbnQgUACwFREAKgAAAEABAABLAAAAsBURACoAAADmAAAADAAAAEludmFsaWQgcyB2YWx1ZUludmFsaWQgUHkgdmFsdWVJbnZhbGlkIFJ5IHZhbHVlNTIwMzZDRUUyQjZGRkU3MzhDQzc0MDc5Nzc3OUU4OTgwMDcwMEE0RDQxNDFEOEFCNzVFQjREQ0ExMzU5NzhBMzJiODMyNDgwNGZjMWRmMGIyYjRkMDA5OTNkZmJkN2E3MmY0MzE4MDZhZDJmZTQ3OGM0ZWUxYjI3NGEwZWEwYjBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmUAAAAAAAABAAAAAQAAAGgAAACwFREAKgAAABYBAAAOAAAAsBURACoAAAATAQAACgAAALAVEQAqAAAADwEAAAoAAACwFREAKgAAAAsBAAAKAAAAsBURACoAAABpAQAADQAAADAxMA0GCWCGSAFlAwQCAQUABCAAsBURACoAAAB4AQAACAAAALAVEQAqAAAAhAEAAAwAAACwFREAKgAAAIIBAAAMAAAAsBURACoAAACGAQAACAAAALAVEQAqAAAAgQEAADMAAACwFREAKgAAAHwBAAAwAAAAsBURACoAAAB9AQAADAAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvY29yZS9zcmMvaXRlci90cmFpdHMvaXRlcmF0b3IucnOUGBEAWAAAAMEHAAAJAAAAsBURACoAAADYAQAAMgAAALAVEQAqAAAA5QEAAA8AAACwFREAKgAAAOoBAAAMAAAAsBURACoAAADeAQAAEwAAAHNpZ25hdHVyZV42NTUzNyBtb2QgbW9kdWx1cyBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZF9tZXNzYWdlZXhwZWN0ZWRfbWVzc2FnZSBtdXN0IGJlIGxlc3MgdGhhbiBtb2R1bHVzc2lnbmF0dXJlIG11c3QgYmUgbGVzcyB0aGFuIG1vZHVsdXNtb2R1bHVzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGZpdHRpbmcgaW4gMjA0OCBiaXRzABAAAAAQAAAAEQAAAAsAAABIFBEAWBQRAGgUEQB5FBEAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvanMtc3lzLTAuMy43Ny9zcmMvbGliLnJzABwaEQBXAAAA+xgAAAEAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tMC4yLjEwMC9zcmMvY29udmVydC9zbGljZXMucnMAAACEGhEAaQAAACQBAAAOAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWRMYXp5IGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQyGxEAKgAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5ycwAAZBsRAFoAAAAIAwAAGQAAAHJlZW50cmFudCBpbml0AADQGxEADgAAAGQbEQBaAAAAegIAAA0AAABKc1ZhbHVlKCkAAAD4GxEACAAAAAAcEQABAAAAAAAAAAEAAAAAAAAAgoAAAAAAAACKgAAAAAAAgACAAIAAAACAi4AAAAAAAAABAACAAAAAAIGAAIAAAACACYAAAAAAAICKAAAAAAAAAIgAAAAAAAAACYAAgAAAAAAKAACAAAAAAIuAAIAAAAAAiwAAAAAAAICJgAAAAAAAgAOAAAAAAACAAoAAAAAAAICAAAAAAAAAgAqAAAAAAAAACgAAgAAAAICBgACAAAAAgICAAAAAAACAAQAAgAAAAAAIgACAAAAAgC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2tlY2Nhay0wLjEuNi9zcmMvbGliLnJzQSByb3VuZF9jb3VudCBncmVhdGVyIHRoYW4gS0VDQ0FLX0ZfUk9VTkRfQ09VTlQgaXMgbm90IHN1cHBvcnRlZCEA2BwRAFYAAADuAAAACQAAAG1pZCA+IGxlbgAAAIAdEQAJAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9hZGRpdGlvbi5ycwCUHREAZwAAADsAAAAaAAAAlB0RAGcAAABvAAAAFwAAAJQdEQBnAAAAagAAACIAAAAAAAAABAAAAAAAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2NvbnZlcnQucnMAADgeEQBmAAAA8AEAABYAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3N1YnRyYWN0aW9uLnJzAACwHhEAagAAAIcAAAAlAAAAVGhlIHJhZGl4IG11c3QgYmUgd2l0aGluIDIuLi4zNgAsHxEAHwAAADgeEQBmAAAA3gAAAAkAAAA4HhEAZgAAAPAAAAAVAAAAOB4RAGYAAAD6AAAAEwAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQucnMAAIQfEQBeAAAALAAAAB0AAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3NoaWZ0LnJzY2FwYWNpdHkgb3ZlcmZsb3cAAAD0HxEAZAAAABQAAAAsAAAAhB8RAF4AAADEAQAALQAAAIQfEQBeAAAAYwMAABcAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWdpbnQucnNzcXVhcmUgcm9vdCBpcyBpbWFnaW5hcnkAAAD5IBEAGAAAAJwgEQBdAAAACQIAAAkAAAAvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2FsbG9jL3NyYy9zbGljZS5ycwAALCERAEoAAAC+AQAAHQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQucnMAAIghEQBeAAAALAAAAB0AAAAAAAAABAAAAAAAAAABAAAAbWlkID4gbGVuAAAACCIRAAkAAAAvdXNyL2xvY2Fs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L3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2NvbnZlcnQucnMAAAA7EQBmAAAA8AEAABYAAADcOREAZwAAAO4AAAAfAAAA3DkRAGcAAAAVAQAADgAAANw5EQBnAAAAFgEAAA4AAADcOREAZwAAABoBAAAPAAAA3DkRAGcAAABRAQAADAAAANw5EQBnAAAAIAEAACEAAADcOREAZwAAACEBAAAYAAAA3DkRAGcAAABCAQAAPAAAAHA6EQBeAAAAYwMAABcAAAAvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2FsbG9jL3NyYy9zbGljZS5ycwAACDwRAEoAAAC+AQAAHQAAAGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8AAABkPBEAGQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvZGl2aXNpb24ucnMAiDwRAGcAAABwAAAACQAAAAAAAAAEAAAAAAAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvY29udmVydC5ycwAADD0RAGYAAADwAQAAFgAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvbW9udHkucnMgAAAAAQAAAAAAAADoPREAAQAAAOg9EQABAAAA6D0RAAEAAACEPREAZAAAADMAAAAFAAAAhD0RAGQAAABPAAAAGAAAAG1pZCA+IGxlbgAAACw+EQAJAAAAhD0RAGQAAABSAAAAKgAAAIQ9EQBkAAAAQQAAACkAAACEPREAZAAAAEYAAAAPAAAAhD0RAGQAAACKAAAAEwAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQucnMAAIQ9EQBkAAAApgAAABYAAACEPREAZAAAAKcAAAAMAAAAhD0RAGQAAACoAAAADAAAAIQ9EQBkAAAArwAAABcAAACEPREAZAAAAMEAAAAYAAAAhD0RAGQAAACqAAAAIwAAAIQ9EQBkAAAAqwAAABAAAABhc3NlcnRpb24gZmFpbGVkOiBtLmRhdGFbMF0gJiAxID09IDGEPREAZAAAAIoAAAAFAAAAgD4RAF4AAABjAwAAFwAAAGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8AAACUPxEAGQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvZGl2aXNpb24ucnMAuD8RAGcAAABwAAAACQAAAAAAAAAEAAAAAAAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvY29udmVydC5ycwAAPEARAGYAAADwAQAAFgAAAGF0dGVtcHQgdG8gY2FsY3VsYXRlIHdpdGggemVybyBtb2R1bHVzIQC0QBEAJwAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvcG93ZXIucnPkQBEAZAAAAIcAAAAFAAAAL3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9hbGxvYy9zcmMvc2xpY2UucnMAAFhBEQBKAAAAvgEAAB0AAAAvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL2l0ZXIucnMAALRBEQBOAAAA9AUAABUAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50LnJzL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9zaGlmdC5ycwAAckIRAGQAAAAeAAAAHAAAAHJCEQBkAAAALgAAABIAAAByQhEAZAAAACgAAAAZAAAAFEIRAF4AAABjAwAAFwAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzGEMRAFAAAAAuAgAAEQAAAAAAAAAEAAAABAAAAHgAAABtaWQgPiBsZW4AAACIQxEACQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvYWRkaXRpb24ucnMAnEMRAGcAAAA7AAAAGgAAAG5lZ2F0aXZlIHZhbHVlcyBhcmUgbm9uLXplcm8vdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWdpbnQvc2hpZnQucnMAMEQRAGMAAABmAAAAKAAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvc3VidHJhY3Rpb24ucnNDYW5ub3Qgc3VidHJhY3QgYiBmcm9tIGEgYmVjYXVzZSBiIGlzIGxhcmdlciB0aGFuIGEuAAAORREANAAAAKREEQBqAAAARQAAAAUAAACkRBEAagAAAGUAAAAFAAAAYXNzZXJ0aW9uIGZhaWxlZDogYV9oaS5pc19lbXB0eSgpAAAApEQRAGoAAABiAAAA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aC9zcmMvZWxsaXB0aWNfY3VydmUvcG9pbnQucnMAM1ERAGQAAAA0AAAAHQBB2KPFAAvwAZPkgPrDXvYVbexWopcaB1xFV1JwU1jOd7pYx1NXmEhfAgAMxAsA9Ov9/wIAAAAJdprmfznqEQEa16xLQ7anG0u/EoXzhEt3ZCT2sPag0jBn//9Tsf7/qx6rqv/////+uarjypLlj5gRLZUZtYU+eZrAg52TqYjrZ9W2lUxsR+WN8QTRCabmdgpGFzQcNB/f9ERpdmlzaW9uQnlaZXJvAAAAAAAABAAAAAQAAAB7AAAAUm9vdE9mVW5pdHlFcnJvckludlplcm9FcnJvcgAAAAApoDHhck5kMF1YgYG2RVC4jcpxaJFqgZdH/XzYFowgPABB6KXFAAuhBy/fB5rBdwoOLEZ5eG+jbmY9C8f1KOt4Cp0Nj8WNQ13TL3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAAhTEQBLAAAAfQUAABsAAAAvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5yc2RTEQBQAAAALgIAABEAAAB/AAAADAAAAAQAAACAAAAAgQAAAIIAAAAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi43L3NyYy9kbG1hbGxvYy5yc2Fzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQA3FMRACkAAACoBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAANxTEQApAAAArgQAAA0AAABBY2Nlc3NFcnJvcmNhbm5vdCBhY2Nlc3MgYSBUaHJlYWQgTG9jYWwgU3RvcmFnZSB2YWx1ZSBkdXJpbmcgb3IgYWZ0ZXIgZGVzdHJ1Y3Rpb246IACPVBEASAAAAG1lbW9yeSBhbGxvY2F0aW9uIG9mICBieXRlcyBmYWlsZWQAAOBUEQAVAAAA9VQRAA0AAABsaWJyYXJ5L3N0ZC9zcmMvYWxsb2MucnMUVREAGAAAAGQBAAAJAAAAfwAAAAwAAAAEAAAAgwAAAAAAAAAIAAAABAAAAIQAAAAAAAAACAAAAAQAAACFAAAAhgAAAIcAAACIAAAAiQAAABAAAAAEAAAAigAAAIsAAACMAAAAjQAAAEhhc2ggdGFibGUgY2FwYWNpdHkgb3ZlcmZsb3eUVREAHAAAAC9ydXN0L2RlcHMvaGFzaGJyb3duLTAuMTUuMi9zcmMvcmF3L21vZC5ycwAAuFURACoAAAAjAAAAKAAAAEVycm9yAAAAjgAAAAwAAAAEAAAAjwAAAJAAAACRAAAAY2FwYWNpdHkgb3ZlcmZsb3cAAAAUVhEAEQAAAGxpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzMFYRACAAAAAuAgAAEQAAAGxpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwBgVhEAGwAAAOgBAAAXAEGUrcUAC5MOAQAAAJIAAABhIGZvcm1hdHRpbmcgdHJhaXQgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3Igd2hlbiB0aGUgdW5kZXJseWluZyBzdHJlYW0gZGlkIG5vdGxpYnJhcnkvYWxsb2Mvc3JjL2ZtdC5ycwAA8lYRABgAAACKAgAADgAAAGxpYnJhcnkvYWxsb2Mvc3JjL3NsaWNlLnJzAAAcVxEAGgAAAL4BAAAdAAAAYFYRABsAAAB9BQAAGwAAAClpbnNlcnRpb24gaW5kZXggKGlzICkgc2hvdWxkIGJlIDw9IGxlbiAoaXMgWVcRABQAAABtVxEAFwAAAFhXEQABAAAAAHAABwAtAQEBAgECAQFICzAVEAFlBwIGAgIBBCMBHhtbCzoJCQEYBAEJAQMBBSsDOwkqGAEgNwEBAQQIBAEDBwoCHQE6AQEBAgQIAQkBCgIaAQICOQEEAgQCAgMDAR4CAwELAjkBBAUBAgQBFAIWBgEBOgEBAgEECAEHAwoCHgE7AQEBDAEJASgBAwE3AQEDBQMBBAcCCwIdAToBAgIBAQMDAQQHAgsCHAI5AgEBAgQIAQkBCgIdAUgBBAECAwEBCAFRAQIHDAhiAQIJCwdJAhsBAQEBATcOAQUBAgULASQJAWYEAQYBAgICGQIEAxAEDQECAgYBDwEAAwAEHAMdAh4CQAIBBwgBAgsJAS0DAQF1AiIBdgMEAgkBBgPbAgIBOgEBBwEBAQECCAYKAgEwHzEEMAoEAyYJDAIgBAIGOAEBAgMBAQU4CAICmAMBDQEHBAEGAQMCxkAAAcMhAAONAWAgAAZpAgAEAQogAlACAAEDAQQBGQIFAZcCGhINASYIGQsBASwDMAECBAICAgEkAUMGAgICAgwBCAEvATMBAQMCAgUCAQEqAggB7gECAQQBAAEAEBAQAAIAAeIBlQUAAwECBQQoAwQBpQIABEEFAAJPBEYLMQR7ATYPKQECAgoDMQQCAgcBPQMkBQEIPgEMAjQJAQEIBAIBXwMCBAYBAgGdAQMIFQI5AgEBAQEMAQkBDgcDBUMBAgYBAQIBAQMEAwEBDgJVCAIDAQEXAVEBAgYBAQIBAQIBAusBAgQGAgECGwJVCAIBAQJqAQEBAghlAQEBAgQBBQAJAQL1AQoEBAGQBAICBAEgCigGAgQIAQkGAgMuDQECAAcBBgEBUhYCBwECAQJ6BgMBAQIBBwEBSAIDAQEBAAILAjQFBQMXAQABBg8ADAMDAAU7BwABPwRRAQsCAAIALgIXAAUDBggIAgceBJQDADcEMggBDgEWBQEPAAcBEQIHAQIBBWQBoAcAAT0EAAT+AgAHbQcAYIDwACkuLjAxMjM0NTY3ODlhYmNkZWYAAAEAAAAAAAAAW2NhbGxlZCBgT3B0aW9uOjp1bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWVpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAA1FoRACAAAAD0WhEAEgAAAAAAAAAEAAAABAAAAJgAAAA9PSE9bWF0Y2hlc2Fzc2VydGlvbiBgbGVmdCAgcmlnaHRgIGZhaWxlZAogIGxlZnQ6IAogcmlnaHQ6IAAzWxEAEAAAAENbEQAXAAAAWlsRAAkAAAAgcmlnaHRgIGZhaWxlZDogCiAgbGVmdDogAAAAM1sRABAAAAB8WxEAEAAAAIxbEQAJAAAAWlsRAAkAAAA6IAAAAQAAAAAAAAC4WxEAAgAAAAAAAAAMAAAABAAAAJkAAACaAAAAmwAAACAgICAgeyAsICB7CiwKfSB9KCgKLApdMHgwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OWxpYnJhcnkvY29yZS9zcmMvZm10L21vZC5yc2ZhbHNldHJ1ZQAAAMVcEQAbAAAA2AoAACYAAADFXBEAGwAAAOEKAAAaAAAAbGlicmFyeS9jb3JlL3NyYy9zdHIvbW9kLnJzAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQem7xQALMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAwMDAwMDAwMDAwMDAwMEBAQEBABBp7zFAAvKEVsuLi5dYmVnaW4gPD0gZW5kICggPD0gKSB3aGVuIHNsaWNpbmcgYGAALF4RAA4AAAA6XhEABAAAAD5eEQAQAAAATl4RAAEAAABieXRlIGluZGV4ICBpcyBub3QgYSBjaGFyIGJvdW5kYXJ5OyBpdCBpcyBpbnNpZGUgIChieXRlcyApIG9mIGAAcF4RAAsAAAB7XhEAJgAAAKFeEQAIAAAAqV4RAAYAAABOXhEAAQAAACBpcyBvdXQgb2YgYm91bmRzIG9mIGAAAHBeEQALAAAA2F4RABYAAABOXhEAAQAAAAxdEQAbAAAAnAEAACwAAABsaWJyYXJ5L2NvcmUvc3JjL3VuaWNvZGUvcHJpbnRhYmxlLnJzAAAAGF8RACUAAAAaAAAANgAAABhfEQAlAAAACgAAACsAAAAABgEBAwEEAgUHBwIICAkCCgULAg4EEAERAhIFExwUARUCFwIZDRwFHQgfASQBagRrAq8DsQK8As8C0QLUDNUJ1gLXAtoB4AXhAucE6ALuIPAE+AL6BPsBDCc7Pk5Pj56en3uLk5aisrqGsQYHCTY9Plbz0NEEFBg2N1ZXf6qur7014BKHiY6eBA0OERIpMTQ6RUZJSk5PZGWKjI2PtsHDxMbL1ly2txscBwgKCxQXNjk6qKnY2Qk3kJGoBwo7PmZpj5IRb1+/7u9aYvT8/1NUmpsuLycoVZ2goaOkp6iturzEBgsMFR06P0VRpqfMzaAHGRoiJT4/5+zv/8XGBCAjJSYoMzg6SEpMUFNVVlhaXF5gY2Vma3N4fX+KpKqvsMDQrq9ub93ek14iewUDBC0DZgMBLy6Agh0DMQ8cBCQJHgUrBUQEDiqAqgYkBCQEKAg0C04DNAyBNwkWCggYO0U5A2MICTAWBSEDGwUBQDgESwUvBAoHCQdAICcEDAk2AzoFGgcEDAdQSTczDTMHLggKBiYDHQgCgNBSEAM3LAgqFhomHBQXCU4EJAlEDRkHCgZICCcJdQtCPioGOwUKBlEGAQUQAwULWQgCHWIeSAgKgKZeIkULCgYNEzoGCgYUHCwEF4C5PGRTDEgJCkZFG0gIUw1JBwqAtiIOCgZGCh0DR0k3Aw4ICgY5BwqBNhkHOwMdVQEPMg2Dm2Z1C4DEikxjDYQwEBYKj5sFgkeauTqGxoI5ByoEXAYmCkYKKAUTgbA6gMZbZUsEOQcRQAULAg6X+AiE1ikKoueBMw8BHQYOBAiBjIkEawUNAwkHEI9ggPoGgbRMRwl0PID2CnMIcBVGehQMFAxXCRmAh4FHA4VCDxWEUB8GBoDVKwU+IQFwLQMaBAKBQB8ROgUBgdAqgNYrBAGB4ID3KUwECgQCgxFETD2AwjwGAQRVBRs0AoEOLARkDFYKgK44HQ0sBAkHAg4GgJqD2AQRAw0DdwRfBgwEAQ8MBDgICgYoCCwEAj6BVAwdAwoFOAccBgkHgPqEBgABAwUFBgYCBwYIBwkRChwLGQwaDRAODA8EEAMSEhMJFgEXBBgBGQMaBxsBHAIfFiADKwMtCy4BMAQxAjIBpwSpAqoEqwj6AvsF/QL+A/8JrXh5i42iMFdYi4yQHN0OD0tM+/wuLz9cXV/ihI2OkZKpsbq7xcbJyt7k5f8ABBESKTE0Nzo7PUlKXYSOkqmxtLq7xsrOz+TlAAQNDhESKTE0OjtFRklKXmRlhJGbncnOzw0RKTo7RUlXW1xeX2RljZGptLq7xcnf5OXwDRFFSWRlgISyvL6/1dfw8YOFi6Smvr/Fx8/a20iYvc3Gzs9JTk9XWV5fiY6Psba3v8HGx9cRFhdbXPb3/v+AbXHe3w4fbm8cHV99fq6vTbu8FhceH0ZHTk9YWlxefn+1xdTV3PDx9XJzj3R1liYuL6evt7/Hz9ffmgBAl5gwjx/Oz9LUzv9OT1pbBwgPECcv7u9ubzc9P0JFkJFTZ3XIydDR2Nnn/v8AIF8igt8EgkQIGwQGEYGsDoCrBR8IgRwDGQgBBC8ENAQHAwEHBgcRClAPEgdVBwMEHAoJAwgDBwMCAwMDDAQFAwsGAQ4VBU4HGwdXBwIGFwxQBEMDLQMBBBEGDww6BB0lXyBtBGolgMgFgrADGgaC/QNZBxYJGAkUDBQMagYKBhoGWQcrBUYKLAQMBAEDMQssBBoGCwOArAYKBi8xgPQIPAMPAz4FOAgrBYL/ERgILxEtAyEPIQ+AjASCmhYLFYiUBS8FOwcCDhgJgL4idAyA1hqBEAWA4QnyngM3CYFcFIC4CIDdFTsDCgY4CEYIDAZ0Cx4DWgRZCYCDGBwKFglMBICKBqukDBcEMaEEgdomBwwFBYCmEIH1BwEgKgZMBICNBIC+AxsDDw1saWJyYXJ5L2NvcmUvc3JjL3VuaWNvZGUvdW5pY29kZV9kYXRhLnJzAAAACWURACgAAABNAAAAKAAAAAllEQAoAAAAWQAAABYAAABhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvAAAAVGURABkAAABhdHRlbXB0IHRvIGNhbGN1bGF0ZSB0aGUgcmVtYWluZGVyIHdpdGggYSBkaXZpc29yIG9mIHplcm8AAAB4ZREAOQAAAHJhbmdlIHN0YXJ0IGluZGV4ICBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCC8ZREAEgAAAM5lEQAiAAAAcmFuZ2UgZW5kIGluZGV4IABmEQAQAAAAzmURACIAAABzbGljZSBpbmRleCBzdGFydHMgYXQgIGJ1dCBlbmRzIGF0IAAgZhEAFgAAADZmEQANAAAAAAMAAIMEIACRBWAAXROgABIXIB8MIGAf7ywgKyowoCtvpmAsAqjgLB774C0A/iA2nv9gNv0B4TYBCiE3JA3hN6sOYTkvGOE5MBzhSvMe4U5ANKFSHmHhU/BqYVRPb+FUnbxhVQDPYVZl0aFWANohVwDgoViu4iFa7OThW9DoYVwgAO5c8AF/XShbEQAqWxEALFsRAAIAAAACAAAABwBBjM7FAAsBdgB8CXByb2R1Y2VycwIIbGFuZ3VhZ2UBBFJ1c3QADHByb2Nlc3NlZC1ieQMFcnVzdGMdMS44Ny4wICgxNzA2N2U5YWMgMjAyNS0wNS0wOSkGd2FscnVzBjAuMjMuMwx3YXNtLWJpbmRnZW4TMC4yLjEwMCAoMjQwNWVjMmI0KQBrD3RhcmdldF9mZWF0dXJlcwYrD211dGFibGUtZ2xvYmFscysTbm9udHJhcHBpbmctZnB0b2ludCsLYnVsay1tZW1vcnkrCHNpZ24tZXh0Kw9yZWZlcmVuY2UtdHlwZXMrCm11bHRpdmFsdWU='; ================================================ FILE: tools/npm/garaga_ts/tests/starknet/drandCalldata.test.ts ================================================ import * as garaga from "../../src/node/index"; describe('Drand Getting calldata', () => { const roundNumbers = [1, 2, 3, 'latest']; test.each(roundNumbers)("should get Drand calldata for round %s", async (roundNumber) => { await garaga.init(); console.log("roundNumber", roundNumber); const drandCalldata = await garaga.fetchAndGetDrandCallData(roundNumber as number | 'latest'); console.log("drandCalldata", drandCalldata); }); }); ================================================ FILE: tools/npm/garaga_ts/tests/starknet/drandTlockCalldata.test.ts ================================================ import * as garaga from "../../src/node/index"; describe('Drand Tlock Encrypting and Getting calldata', () => { const roundNumbers = [1, 2, 3]; test.each(roundNumbers)("should encrypt message and get Drand tlock calldata for round %s", async (roundNumber) => { await garaga.init(); const text = 'Hello, world!'; const message = new Uint8Array(16); message.set(new TextEncoder().encode(text)); const randomness = new Uint8Array(16); randomness.set(new TextEncoder().encode('fixed_randomness')); console.log("roundNumber", roundNumber); console.log("message", message); const drandCalldata = garaga.encryptToDrandRoundAndGetCallData(roundNumber as number, message, randomness); console.log("drandCalldata", drandCalldata); expect(drandCalldata).toBeDefined(); expect(drandCalldata.length).toBeGreaterThan(0); }); }); ================================================ FILE: tools/npm/garaga_ts/tests/starknet/groth16Calldata.test.ts ================================================ import { Groth16Proof, parseGroth16ProofFromJson, parseGroth16VerifyingKeyFromJson } from "../../src/node/starknet/groth16ContractGenerator/parsingUtils"; import * as garaga from "../../src/node/index"; const PATH = '../../../hydra/garaga/starknet/groth16_contract_generator/examples'; describe('Groth16 Getting calldata', () => { const proofAndVkWithPublicInputs = [ [`${PATH}/proof_bn254.json`, `${PATH}/vk_bn254.json`, null], [`${PATH}/proof_bls.json`, `${PATH}/vk_bls.json`, null], [`${PATH}/gnark_proof_bn254.json`, `${PATH}/gnark_vk_bn254.json`, `${PATH}/gnark_public_bn254.json`], [`${PATH}/snarkjs_proof_bn254.json`, `${PATH}/snarkjs_vk_bn254.json`, `${PATH}/snarkjs_public_bn254.json`], [`${PATH}/proof_risc0.json`, `${PATH}/vk_risc0.json`, null], [`${PATH}/proof_sp1.json`, `${PATH}/vk_sp1.json`, null], ] test.each(proofAndVkWithPublicInputs)("should get groth16 calldata from proof %s, vk %s and pub inputs %s", async (proofPath, vkPath, pubInputsPath) => { await garaga.init(); const vk = parseGroth16VerifyingKeyFromJson(vkPath as string); let proof: Groth16Proof; if (pubInputsPath == null) { proof = parseGroth16ProofFromJson(proofPath as string); } else { proof = parseGroth16ProofFromJson(proofPath as string, pubInputsPath); } const curveId: garaga.CurveId = proof.a.curveId; console.log("proof", proof); console.log("vk", vk); console.log("curveId", curveId); const groth16Calldata = garaga.getGroth16CallData(proof, vk, curveId); console.log("groth16Calldata", groth16Calldata); }); }); ================================================ FILE: tools/npm/garaga_ts/tests/starknet/groth16VkProofParsing.test.ts ================================================ import { parseGroth16ProofFromJson, parseGroth16VerifyingKeyFromJson } from "../../src/node/starknet/groth16ContractGenerator/parsingUtils"; const PATH = '../../../hydra/garaga/starknet/groth16_contract_generator/examples'; describe('Groth16 Parsing Tests', () => { const vkPaths = [ `${PATH}/snarkjs_vk_bn254.json`, `${PATH}/snarkjs_vk_bls12381.json`, `${PATH}/vk_bn254.json`, `${PATH}/vk_bls.json`, `${PATH}/gnark_vk_bn254.json`, `${PATH}/vk_risc0.json`, `${PATH}/vk_sp1.json`, ]; test.each(vkPaths)('should parse vk from %s', (vkPath) => { const vk = parseGroth16VerifyingKeyFromJson(vkPath); console.log(vk); }); const proofPaths = [ `${PATH}/proof_bn254.json`, `${PATH}/proof_bls.json`, `${PATH}/proof_risc0.json`, `${PATH}/proof_sp1.json`, ]; test.each(proofPaths)('should parse proof from %s', (proofPath) => { const proof = parseGroth16ProofFromJson(proofPath); console.log(proof); }); const proofWithPublicInput = [ [`${PATH}/snarkjs_proof_bn254.json`, `${PATH}/snarkjs_public_bn254.json`], [`${PATH}/snarkjs_proof_bls12381.json`, `${PATH}/snarkjs_public_bls12381.json`], [`${PATH}/gnark_proof_bn254.json`, `${PATH}/gnark_public_bn254.json`], ]; test.each(proofWithPublicInput)( 'should parse proof with public inputs from %s and %s', (proofPath, pubInputsPath) => { const proof = parseGroth16ProofFromJson(proofPath, pubInputsPath); console.log(proof); } ); }); ================================================ FILE: tools/npm/garaga_ts/tests/starknet/poseidonHash.test.ts ================================================ import * as garaga from "../../src/node/index"; describe('Poseidon Hash Tests', () => { test("should compute Poseidon hash for BN254", async () => { await garaga.init(); // Test vectors from the Rust implementation const x = 1n; const y = 2n; const hash = garaga.poseidonHashBN254(x, y); // Expected hash value from Rust test const expectedHash = BigInt("0x115cc0f5e7d690413df64c6b9662e9cf2a3617f2743245519e19607a4417189a"); expect(hash).toBe(expectedHash); }); test("should compute different hashes for different inputs", async () => { await garaga.init(); const hash1 = garaga.poseidonHashBN254(1n, 2n); const hash2 = garaga.poseidonHashBN254(2n, 1n); expect(hash1).not.toBe(hash2); }); test("should handle large numbers", async () => { await garaga.init(); const x = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); const y = BigInt("0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); const hash = garaga.poseidonHashBN254(x, y); expect(typeof hash).toBe('bigint'); expect(hash.toString(16).length).toBeLessThanOrEqual(64); // Should be within field size }); test("should handle invalid inputs gracefully", async () => { await garaga.init(); expect(() => { // Try to hash an invalid number garaga.poseidonHashBN254(-1n, 1n); }).toThrow(); }); }); ================================================ FILE: tools/npm/garaga_ts/tests/starknet/signaturesCalldata.test.ts ================================================ import * as garaga from "../../src/node/index"; import { CurveId } from "../../src/node/definitions"; describe('Signatures Getting calldata', () => { test("should get calldata from Schnorr signature", async () => { await garaga.init(); const rx = 2035568083744286872562076170424183686789303771874924387134332885848716527973n; const s = 16951964772773949134099030503529813788531799557122970289125566478359203530341n; const e = 12379944220159143227935478555737246072763864785692867509458453554537054077909n; const px = 1460015317007179873453105936321786126342173668635633375793615328879270166120n; const py = 11788876621134198315085358602693659440838178818373737092676489706543309378340n; const curveId = CurveId.BN254; const schnorrCalldata = garaga.schnorrCalldataBuilder(rx, s, e, px, py, true, curveId); console.log("schnorrCalldata", schnorrCalldata); }); test("should get calldata from ECDSA signature", async () => { await garaga.init(); const r = 17830031845148496611971159596372798561444562703217806657239186935632770088766n; const s = 15775553683756501243755332794094542682114105716241054629352056498655356866971n; const v = 0; const px = 11329275913325725487970330398927775211322605183390088341941803765401909426169n; const py = 8682249405907851087539181920418463468320177419465741864050204044014651446009n; const z = 7590902656267229106356493910512635750747848737569325419577764035270226305644n; const curveId = CurveId.BN254; const ecdsaCalldata = garaga.ecdsaCalldataBuilder(r, s, v, px, py, z, true, curveId); console.log("ecdsaCalldata", ecdsaCalldata); }); }); ================================================ FILE: tools/npm/garaga_ts/tests/starknet/zkHonkCalldata.test.ts ================================================ import { HonkFlavor } from "../../src/node/starknet/honkContractGenerator/parsingUtils"; import * as fs from 'fs'; import * as garaga from "../../src/node/index"; const PATH = '../../../hydra/garaga/starknet/honk_contract_generator/examples'; describe('ZK Honk Getting calldata', () => { const proofAndVkWithFlavors = [ [`${PATH}/proof_ultra_keccak_zk.bin`, `${PATH}/public_inputs_ultra_keccak.bin`, `${PATH}/vk_ultra_keccak.bin`, HonkFlavor.KECCAK], // [`${PATH}/proof_ultra_starknet_zk.bin`, `${PATH}/public_inputs_ultra_keccak.bin`, `${PATH}/vk_ultra_keccak.bin`, HonkFlavor.STARKNET], ] test.each(proofAndVkWithFlavors)("should get zk honk calldata from proof %s, public inputs %s, vk %s and pub inputs %s", async (proofPath, publicInputsPath, vkPath, flavor) => { await garaga.init(); const vkBytes = new Uint8Array(fs.readFileSync(vkPath as string)); const publicInputsBytes = new Uint8Array(fs.readFileSync(publicInputsPath as string)); const proofBytes = new Uint8Array(fs.readFileSync(proofPath as string)); console.log("proof", proofBytes); console.log("publicInputs", publicInputsBytes); console.log("vk", vkBytes); console.log("flavor", flavor); const honkCalldata = garaga.getZKHonkCallData(proofBytes, publicInputsBytes, vkBytes); console.log("honkCalldata", honkCalldata); }); }); ================================================ FILE: tools/npm/integration-test-suite/.gitignore ================================================ /node_modules/ /*.tgz .turbo package-lock.json .output.txt ================================================ FILE: tools/npm/integration-test-suite/packages/nodejs-ts-cjs-tsc/.gitignore ================================================ /node_modules/ /dist/ ================================================ FILE: tools/npm/integration-test-suite/packages/nodejs-ts-cjs-tsc/output.txt ================================================ Output of msm_calldata_builder: [ "1n", "1n", "0n", "0n", "0n", "2n", "0n", "0n", "0n", "1n", "10n", "0n", "0n", "75759116906411131289250842036n", "1443316740970346987535705368n", "708088064087366360n", "0n", "31894839170900604627010243180n", "26562388390640533846098233871n", "1678682860455561629n", "0n", "340282366920938463463374607431768211466n", "0n", "1n", "0n" ] Output of get_groth16_calldata: [ "1935n", "561151868347580495583090954n", "76095163897123765080010407949n", "3078964875882710626n", "0n", "68760071548346057889257256130n", "33987009017980255890281589641n", "10169520226989098n", "0n", "27526525353537266686222475850n", "14475456397330869216192753448n", "2537199318039088506n", "0n", "21536768652854740401912377472n", "61033740543581523820282161323n", "2466548432040548587n", "0n", "49356715888972701601325049347n", "69887821523610458575318250963n", "1742488265497548861n", "0n", "68106177540828336088045306219n", "961134836681944563222599448n", "1065964868903753173n", "0n", "1800806384039658546158952406n", "44097612892395787951554989634n", "2954998394940821894n", "0n", "57407696252580182379957914390n", "68043785987214905719851221030n", "1575697798130653691n", "0n", "1n", "64622861075918021861446670503650833524n", "40000715384012656934033607729992139113n", "65343516826393976703500119419n", "64215924997604874724268545467n", "988361220710881918n", "30419768492628197858619568261n", "27248300164153194572764431995n", "2977039154666701832n", "65685384868591218376868464427n", "70847639348750339988496276918n", "477777041053646529n", "29991939756641252358878134746n", "39295947558852310211017126572n", "2815628384676858047n", "41723516601424502403187247204n", "17017221925427596342628818049n", "440483370607139100n", "10413180469465695361837522183n", "19423959337400646488247227266n", "1196856567711091031n", "14918739433528640782272739139n", "2386255189434407583576372032n", "2110030772171629820n", "66403863065153192042460667734n", "26490228722781507311620127895n", "1376925612093868452n", "16095686441528704658448370761n", "51022389018232154188872438326n", "1610491282614910455n", "37997039872158612927722452114n", "76461913933066610895201145075n", "951074374291802403n", "71303405408633411813876113602n", "65378028046199379258519780162n", "2796976393851271662n", "66043194162972766020432949924n", "72668519642029141849369643840n", "1767421250104456939n", "34724757470958269778491338738n", "67907574914053181941994051296n", "1074861315591297211n", "57811416502141401297494384261n", "66717953782642686044297384228n", "619071555217927229n", "11747815192199388258706152779n", "39655522309044272057593243434n", "2667518659266923661n", "74545987263802105943401974456n", "25100780504941704736052597181n", "1614091262172996678n", "61496830641585942728225636367n", "47520662928915336127912320093n", "1483128622047069223n", "60688370891239308805053347678n", "6154252422157238786881911133n", "1595810747040934713n", "4083087877564984515505707949n", "8098795933662806280871012387n", "392529588828430050n", "14388273410011291023320103380n", "59643003630595652724715495246n", "2978244255961784640n", "73005708620970672578538518429n", "64274822400727474231693975117n", "824761225328685267n", "58979395441344004425345087397n", "50034285490796369376342018474n", "1071577406066675668n", "37552244383550540565443579029n", "66651519402295869947385119697n", "1816081760201573675n", "48020280081371249748563352979n", "19387797072717949389382225132n", "1075380445499260082n", "0n", "0n", "0n", "0n", "0n", "0n", "35717919122505863182793101258n", "38321232967395819819318928199n", "33653293845735846n", "0n", "0n", "0n", "0n", "0n", "0n", "60126610212574038899502857656n", "7521540037295293717633716927n", "2853604986499631260n", "34n", "21051189327279847889561754607n", "15679397574132606210591767826n", "2165541175263187167n", "11461504713279098434997837844n", "29843864593792422920685859506n", "1460931496621397613n", "31444402670555100638844582863n", "41564870089383627374040254466n", "3317275169749288672n", "72559701040108110454251376272n", "22887416934578586124987839996n", "233686850646424299n", "51667851121405518271474152545n", "8297160697759020633045233343n", "2193876459774314419n", "50048470992987075597478354517n", "7622325433377464914372402739n", "2354852892440837544n", "51371930649223862037533589505n", "79037515700470610379424985426n", "3103776711054728122n", "62017664743365054011497714498n", "18400895627048394641412939651n", "1348549913115407530n", "68135824164391051249850625519n", "66467776056179325801077769907n", "21934170737946721n", "43733194692565917370190335652n", "20871497235942649279957719973n", "668366294714005293n", "69461224576101086641240237729n", "66163212446743341874016516713n", "2187872754580648643n", "17220145241406859216639481755n", "16637691490800642336304328427n", "699908274655976347n", "63497807423928467541336180608n", "5826616601935275548523889948n", "1995878641893268059n", "45351336804917798268705814434n", "32809386436253774870015191481n", "2479634507910679085n", "29902151727900563245652302915n", "70978449320724687288838934154n", "2324927884830925807n", "70956000718854853515484101425n", "18794223695576985859644098754n", "851712710373510834n", "10098225054790962506843798879n", "23663666343921865703011477995n", "2539135702270490911n", "13745949463631524266514217644n", "70097334773007528061348260208n", "1449740726324507950n", "77747255839650031066990598333n", "33186206179829484467075523327n", "3072781249488320507n", "73980383885811324159893986758n", "1765445723258696625718806089n", "2271055079390534326n", "65413433113844994807777190576n", "48033870016967321544035758027n", "486427727733872709n", "26974899297726311987406093631n", "5590641036960446176988521755n", "827510576486023036n", "29009837304935242599458620885n", "20410410399336048506493809410n", "1954580703151327584n", "64135814011222089868428198367n", "56261294792918650387740643327n", "1226348411176360117n", "71834179960057214052393522783n", "46252419010406289556729694820n", "1393685374555389118n", "71368042768790547323904986882n", "66161706759499128280107017373n", "2031846388120562115n", "21220965229609488481377288540n", "63634474338013450603335409627n", "821621475859559449n", "18432973800914453913616171088n", "8237366564750917100218776918n", "3448970319177548904n", "51266071561401723888120442902n", "33637427514172279767467204013n", "3304964589143840434n", "38819453582756888614388081676n", "38995523514738195349996597496n", "2323381859757397191n", "60884424754479179074928199128n", "3834764671648885586861880739n", "864611594127789300n", "9851774469429652901432809299n", "37101389540039872112071709899n", "2559626381308197564n", "406646090122284731360238690n", "44652954714826373590985929530n", "683398595921263332n", "20271182213679030346920227775n", "37600328594433178897257972399n", "432396126057182521n", "4187404064813213379278146332n", "44537571235199588707429377798n", "3148695479824963911n", "25801656964836714839982503508n", "51572074862943493111482365520n", "1230107506438930488n", "51625253538057090130489675612n", "11815326077763625426679125713n", "521507079758837629n", "9648925458348520397354094791n", "31712274845777377436963587786n", "1997027570431487029n", "67411860089204789431616372347n", "66528411456550554620624110152n", "186478859944874837n", "61267275259145597446660035124n", "8554664316600082912178209665n", "2375445434845419873n", "1589782365755830876261985911n", "14834270454057237025174127570n", "963005115183332390n", "23249702285165109375700438720n", "20760791667651963569657008881n", "2149068190029611973n", "74674158355316816901821060837n", "13278131002009659818927519878n", "992778641153509292n", "8743794935416188942200722720n", "51445266496970909016857135378n", "438732749332832318n", "64511635865187456937539832569n", "68455428209776466334096458368n", "1196547129512189429n", "16652864649326843859619189651n", "47031229552259361752165531n", "1977848333533964373n", "32230433718106499209616712783n", "50152042404552913889735459326n", "2647553318887157906n", "15558003702184603194095500825n", "75789384763919593972512743955n", "3199452366147221980n", "23639206276595496029173201731n", "49198122874004051169498469698n", "3017499313473475023n", "14633623354742611699704494011n", "13838793228838994907197164815n", "1865567661799564691n", "63554437295278917743885851002n", "43774994641723817700539915508n", "2096263880799998644n", "39241367224191359271532780985n", "11996031360599781980224407856n", "669587303349757211n", "70309465524306380398946854940n", "69691793870844727391235380992n", "1097884931999290463n", "4880550284873697839328338960n", "8683184578595981266384193421n", "1704353262400573542n", "43209925421984317108056960491n", "71838424302727061831479195619n", "1719485935656079288n", "20281500369447070817728689103n", "7827101470501627130702651299n", "1802787150264131673n", "46990609747636025825158033861n", "44506561326339289883265865893n", "168363193009253293n", "72644600526598920979602995563n", "23734595505295435652505772841n", "3066825941193215846n", "35922864395887621958431954121n", "36164080296393340386782836739n", "2806406594668460083n", "9559608083309233656821926408n", "21435397197883361901646100159n", "1173438743001539534n", "45502332725513884072895701183n", "21110593816020485943815437920n", "2156839344197406156n", "14935455230205682855615996549n", "3176509029633635649806564693n", "2744065159326778800n", "50144289937074876149408247339n", "73476828119785067069284584679n", "1137921320963525519n", "7764782370318985672713086089n", "35186333034809438599544173388n", "2599319187054853443n", "71090896326220687050059751719n", "7138127862158940765217036726n", "2525413991973636711n", "74465662641034900763924596241n", "64800563131735459820423413678n", "467645211882593334n", "35429207184442884958891366618n", "32026071525343635101462583825n", "732661589473603894n", "53979236240639306101606255299n", "42289323195165961060464784974n", "2572678142594168339n", "34781401150182625703506517963n", "27502296245160796607775189158n", "204754437845996963n", "60295830689532650505249825677n", "25033548320502415354132760311n", "26918649856759092n", "53883044729840223319972205798n", "71229970233113264180243241621n", "1096143763692361182n", "23670625124894730163037915585n", "66188859433247255337619139871n", "2789875774976133848n", "76287870172839315742103539908n", "76696206429019592649532825371n", "1140810575629679716n", "65695197715200264171919419792n", "64578697338608806055715988010n", "1315508308085028070n", "78097114957711978300958275236n", "73435222529435448525954708815n", "1357585460514972583n", "7357385422266450818170168488n", "41750638133784298446701227299n", "2309087687582896396n", "59893979186320257893680148671n", "70073254756682993544223051173n", "3379633857316028827n", "63037751789054738563399308545n", "22112638657428976200628648553n", "1119955028522904661n", "17789959924300679578888409433n", "32036177498553475203925266628n", "3282049411090141820n", "28853440708133119682221591754n", "53037088663773523321481680370n", "33889236786700338n", "47866115906431522995214087729n", "65896044771509521496549322945n", "1356170216477027582n", "72025359186703704066599325205n", "14290937382512145681745832413n", "235291859370816977n", "16739080450814900672563464076n", "27155915888194232201712953259n", "2201285100786606817n", "79046757705903490925593572396n", "41590525534061554138727710174n", "1563993153777110442n", "58644351226953768961970699175n", "71513413355714071072616721058n", "771468756865502494n", "56315873417343912546874324750n", "66995041844358703653717763298n", "1564628505321775490n", "68742094005504029111318961475n", "43257881480227388188853022203n", "2827885137176633354n", "60013377537965180515452389042n", "22615548017942376680894051034n", "2778940717048846996n", "30216926479141873412912870389n", "67097866317972012436735650659n", "1001082522948099952n", "31879429787569811794175043050n", "57916743777618192263856200515n", "1477201521425100888n", "63117110331861368443138300600n", "24455052765578778318741183737n", "3145320365602131181n", "27504400622945393457424964663n", "18149654277116955082138788671n", "709865641588578406n", "51203413602847718278618462447n", "32871208476003646471375256821n", "1972541565241208115n", "79118404692942875097520377767n", "48815069625306356145460113214n", "2800168047740476387n", "27090046108651136752525050251n", "17050737426763583806790779471n", "1273566324033923836n", "49543917066569282928794484300n", "10290628042158833070532221066n", "3469066870558011680n", "42005113796531220880503084548n", "60064195130891515794312310901n", "3245851193684195107n", "37533982385009798315342336648n", "10267823027838019609009260399n", "2025345482262498605n", "34864622598934340124988581388n", "48347073555555495737374318810n", "2673244105079290838n", "75957016907360510463610401727n", "23977086141109407077488719105n", "732491745580907274n", "64604276948999648627686221332n", "3868070793275280858296301394n", "1873653426250118454n", "15570553586934053483564418077n", "13639547122371116255200424101n", "3229806347752382046n", "69627176750917937037127756524n", "77527130421629244161614984692n", "2205592855904802747n", "42359401661274759693285654733n", "15319487818905735149374624862n", "3299209455827802664n", "913752139298990313523799637n", "70257873178701883303322833580n", "3363278906733915791n", "3719386124896722977369262005n", "53915264239484240561994801723n", "1014563467864375643n", "56643381820560944379080271087n", "5451127454093963182673395845n", "1647155594727927302n", "74031948470913728924354306654n", "67046184840603355661228918718n", "730434808359892479n", "58832815659134274668136294794n", "44220894708044864609266466973n", "428689828657455715n", "26619728344740812354339350673n", "55972705855091654840275771393n", "597472825198654088n", "1452568843776109298902292527n", "48082065429135088437634332196n", "1047157723497573338n", "28285154322504134404521941699n", "56070279326493931276099147353n", "1647252454052220783n", "65027676769817342180184568252n", "12685362344487350979600199772n", "1402500493179000567n", "12668630001282077875777731433n", "55553251572483079593258301341n", "2382205981458202111n", "50473524893888759380289559496n", "52220217290909756763540198313n", "2029638412495399688n", "7502774623130712545083224028n", "73425515727643581896824036686n", "2771702310825972693n", "4639820922586718498241340517n", "46582679696898380484679332702n", "2620580077787400940n", "51782105270520932573551959292n", "74517889523497564960562458357n", "79055126752843995n", "10925640711936519280913334701n", "11947058347966705959371810733n", "43716694970268491n", "35453676805113974113471109604n", "12015889727201641553493717139n", "3275286259969106630n", "70932279409438704808566723573n", "47041530965489511382629531879n", "1256401409005218192n", "46895749660336733332848035754n", "40261009687444665011442182710n", "1306436215925446460n", "3904962902077066763622365736n", "36103992387013546339910627073n", "1329335481346702678n", "57853677844329075763360620729n", "61001619991056325367390311148n", "1235032555631976826n", "58692146235938833274542664790n", "14589363842493324627243766856n", "578262325105051129n", "37980379958779218087580100271n", "57690546822788520479506631792n", "3164185857728705638n", "45598806448478931852264970697n", "29033375842093843451718686864n", "2812217528418815016n", "9663261157782365056384592697n", "44620211458433011608252253672n", "2505651240889113840n", "48502340833312690180905327065n", "9352266604910376416980234379n", "3341395763378874957n", "35507650777754495555508745994n", "64550352482963692428938364344n", "1749731610964724298n", "72801722493214401326730125326n", "55956888553336351398608259633n", "896001678647446033n", "30516385505393014949750902877n", "47315718952109319710441627150n", "1388483706936013349n", "32381991427814516368016795653n", "59696292811917044385937202833n", "618914335291991958n", "40375787626773409929606022175n", "64734613933900308276892757597n", "2556069305521992095n", "58654528682801174800851099376n", "11593522535604870003716248394n", "2125230714317219300n", "8061995955571015171488513388n", "47983447012081651413970228934n", "855542739847145422n", "59096469339608638609245068515n", "7673808125695463322887566290n", "1385253448294382073n", "25340909062918393540888464015n", "9795256553635962173776771050n", "3012016973098277348n", "33467611330524938973631050712n", "7543431037219165063475505539n", "448151223182465539n", "22750106248651778926545160954n", "25740569688692303261800730858n", "1075240126364963450n", "56338203997489686691769068850n", "62119360873725897456686490753n", "1222146081347045140n", "27338323756657113133884361560n", "21141429927442113006964516579n", "462132336382397961n", "4987343640321990641559943818n", "58829032105334349895296634715n", "3177465831253470688n", "69096263705896112247403554129n", "29492604434954899550510960365n", "304239915265350366n", "66375851691134826136210085333n", "44757375154942980538763091305n", "1112855489475878924n", "70069037784938962740775503666n", "12717652252841341839220495543n", "2918096944668928835n", "18321962109897171704378960368n", "61813672462196073792006627549n", "2734946711892636188n", "64219561440442257822526755189n", "8503031322535266331858567242n", "3223902208326320319n", "63116174136664698830215774786n", "2759322304337380924973025029n", "810068357014304774n", "15698684552711747426349376896n", "65762055793295617462571353752n", "518270689795187122n", "58150828468103287645001826637n", "77452960139151639571846482697n", "519559051146038460n", "72625801975239649642036163890n", "39078044248618521225250269350n", "2190524057325078928n", "27770888055874136986828633484n", "41773083279140557423975570256n", "2854828164966176931n", "627836434493841003902237785n", "77928664588771202997039373627n", "330865869276931200n", "52935592469577214913105764520n", "20197659873511917804524429378n", "2125370194946441846n", "3460074836406938711660958301n", "52820564261229479633548811299n", "2919129481241566745n", "6675772908450017734753351305n", "65258735248680451317985314824n", "2950671717077079181n", "6822322071311459654365919975n", "48497518547901827883287152419n", "3243229764836791767n", "72937532385990220357716354648n", "19074513737405788027838151006n", "1297437039234841476n", "75502921753638151385835217223n", "15306268504859852745422227938n", "3143438951510181753n", "3947335170074803838440311819n", "62699530989773040321915910090n", "3215975868729087991n", "45236352461588188769215285451n", "41706782526887442329166221445n", "3168773580470738009n", "75285535419605148224367004655n", "20481966054007305592119557920n", "1679995277184070400n", "45190873120635261257451746066n", "47696678647110719375889237738n", "2068610507691385147n", "9915927934978371252308896949n", "31159305954355174048281405375n", "1704598723840881213n", "67338469563962359211325034773n", "41738724864530875640824663606n", "2293929193371443079n", "34807312716413150046069343319n", "70801066094208025212394559646n", "2518515824100660756n", "76811947889156401932764711781n", "43817729339652461426643528955n", "2039489180470709457n", "38477432026452102589204844897n", "27527167249603525516926315406n", "1191468099071291308n", "38041851156661687253492123536n", "54288163040365572080441140556n", "911480122138689106n", "4974069079367885339264267782n", "28880616750574662115261710630n", "2834730446537796035n", "55466841778289154595312506036n", "47524577058256910308968549882n", "351449977223840700n", "62311990134227217524354071274n", "75586193885025429015569590193n", "545412183548073756n", "79201290258654825630711427638n", "77524373992410852423354047680n", "552010389188782621n", "13584773290145166716045719634n", "57089761411485171751249424952n", "1694608384682621747n", "29538886750825184946212760314n", "63894150012954354476012028271n", "381542434687157486n", "18078760560177937565267140464n", "74003801426748288272147648907n", "42337564080893923n", "76689566315090503029029632865n", "77474971819185712518886624915n", "372114354534855369n", "3011898200892081576513307862n", "13966070005688554503624007786n", "470413759528293312n", "39357561183949775040925825237n", "70682164693568724918268906963n", "1376182782398783885n", "41538213381429219620578361408n", "42254768852299863792709628627n", "3431309948863311296n", "29234390314689913487082552719n", "17916853178952663417328241903n", "669291203853282419n", "33249562629014821971547667642n", "26222791431277453980835687680n", "98534970627714358n", "25021648199838864664290068537n", "20665859250814395210947344246n", "662389299694120248n", "72307113898419621240789872204n", "46323053668872253004980165076n", "1041999687571616075n", "8985042666921921648283132643n", "74513886773734802806022422301n", "2603455779145809119n", "15411135359682619522278947280n", "27784420314858949438220006926n", "450671277926568052n", "2831173742809690598851605179n", "28386483802658122108161613621n", "1424370976519373932n", "31198231619878444700423211860n", "42295311569311653123964908500n", "2935759999014605210n", "32001363507887263736668102660n", "46912833713119636774180995741n", "2092237369418424823n", "78656477190391127646333527543n", "41056006364555863740114989146n", "2171263570612200061n", "21422129487009930658303224502n", "46206308103083011878154386775n", "1874554378158482533n", "36641496950703925635911572554n", "48432166499307362117455688176n", "362387825758837904n", "27092632894596570716463916204n", "20108561967338242154648349930n", "1880193076762165445n", "9593372273263129574197363679n", "48018078028931030587694756618n", "542974594247287387n", "14814551631877080383283532261n", "33496168748765220079451008919n", "2250598863496646490n", "44869586855816636221572912809n", "41783360501362407212785286614n", "2362538758680925884n", "47048981182078605465642165702n", "60518795030556750835816928982n", "505511636936241905n", "58024262056741504028876642662n", "50138980925793649225004896980n", "2579777888438614723n", "6523114729709277602770738046n", "28358393151053570058817793343n", "3081381986289034984n", "15900191280315068679181663660n", "48577168032374944428952731072n", "830974214184407623n", "10274561196236136318135959057n", "26148664358554534185218032007n", "201377610767670386n", "11368406426935765376362633788n", "4122436782704069458424072833n", "2934079973878820714n", "66892750247258968804173976659n", "76380379537218876441475920731n", "3380019238411335234n", "50717224916942478279258173891n", "44470393688322556765105136550n", "1813355330674964836n", "8515532742277261388949469229n", "33221912074775270762895168327n", "2646766706385940242n", "11140136119772415355412357379n", "44150773111766484868566388647n", "3191354614138223649n", "30708778779429297397760149496n", "67837687252340085721524474101n", "3301367800510383551n", "10954599956402707572521260184n", "21030000566064580489911242942n", "1828905939385555740n", "26254579696623038244113820321n", "76089322519690535032690356215n", "868757520992376209n", "77540171332511416804096348278n", "10474304059709005130776549459n", "1665346113039180866n", "77071906535707552468440337167n", "76416817616469856915552001970n", "2619908781683664602n", "40713576015254467501617369989n", "69174809057973808586596761660n", "364462143474967775n", "3388865641890523266901884229n", "46510386965164679950611269041n", "2868959718371388528n", "38291153048032659818161082470n", "57992998428591158266306092260n", "2140250223970187383n", "74674643030181299821451279762n", "61603307939095484817637012597n", "1805808601029218696n", "37221838450591689221386319329n", "68301391492878568825616976727n", "2237000809794684762n", "11407285364976644693945059208n", "25348058182926100240298110509n", "3114508241594272017n", "75356748694855659604450932050n", "73487079967561788811810515931n", "1490776583857675442n", "54218989991798315687885361450n", "20703329376060767478344708910n", "2199487792587152210n", "75111061944546058209924381826n", "59244444067541601191271416829n", "1581429188013860604n", "52660822561915117683975147831n", "47783082248718407900747485302n", "1369252091872015433n", "36417458042350421490821725117n", "31829247002542379610343848353n", "455784377300586483n", "16833465703461845689857266397n", "71194569481351283884295739145n", "3189866189053900612n", "65858387085894768841721032786n", "42191857983305827191840357582n", "666015291493419098n", "27916318777227697186981470587n", "32438460617546390776125662122n", "3438854808891043135n", "41197663088738641800559183911n", "55140791537758229983041465056n", "1162917064515090408n", "59276808448795540978821008029n", "55346073844723874343240998585n", "2138546228419844587n", "29861692804477614266603259375n", "46434932953097909216915612814n", "2786750119186865986n", "2914382294411148824195592597n", "47257202751523172671381039762n", "108099711483611500n", "42513194204119630092428609239n", "7009779828784113435151735800n", "1568976973765903017n", "74506942497632859791810397801n", "75159716442684547730197176733n", "214522106108977303n", "307807623661151452830127704n", "69355418870826927485148435899n", "1716229337114513433n", "57800790680731912804700220994n", "33865695886637783077735975519n", "1521543041885052952n", "61900084065708307372472439490n", "9670136848396954396035168772n", "705486756697563485n", "65695693080875904861430309269n", "42258749277647240519914054375n", "1610937183743514752n", "45949364456230722028956610312n", "71318597512050155765983898976n", "1419180020927833749n", "16722582418318977044812304850n", "64520646005354913944304541442n", "1349757657977694032n", "23453477023590312415905476662n", "20988708348761074914346191082n", "2734679321361253617n", "3531335181910221180679210683n", "77069908679139173478778593856n", "3209489805214655859n", "15423046625290420432194363954n", "66544315732344216335597482829n", "3417056483929987132n", "23412416307661786237706973063n", "52684903097691240819445939916n", "3087013127443362602n", "59516131369415164617233433764n", "22552284363447521404574779744n", "440598570727652332n", "10078101871820643773664346515n", "53180025648864462561753056892n", "1238481677425258091n", "66978851386839209947975732205n", "76469976691658858609518100317n", "2669015410315668427n", "10462115063986428235746660388n", "20612418707380044137824607138n", "913149152876393845n", "12896643578852573199148249630n", "65916513826164228515537693476n", "1689818392090951394n", "48812924094784749209418690439n", "21075229147504768099245857693n", "2023634641390620097n", "46841988916092209879920999223n", "16626325630569367486087793088n", "2520424161966279659n", "66590657955425334169984583445n", "43137455439307899619378709852n", "119691013666955759n", "59528138117541221723219264069n", "6039238025418276887251147184n", "1423016249189720303n", "74476981597135756778074726485n", "57871369440317946035711890073n", "1799738956519083373n", "61169922085945703273845146359n", "58536191609701145724674103544n", "678581665969651580n", "29756753901276156089801861773n", "37715386191992628222582900313n", "1839293100231634062n", "8545730587160341404066690935n", "73310320371102040457790413928n", "2943087579162219865n", "3592679410576312851945554995n", "63768122222562308688415150519n", "2852416365710961566n", "65734466853903663026216615808n", "75611388663630224651662180524n", "3082245111526479768n", "42542028447397082553823280434n", "15266201170439359558184400250n", "2959319188559780389n", "62084872176674708014188872797n", "49471685826369556510350964812n", "3044342635568692521n", "52766810402300947123818998320n", "57464266928926410524441305379n", "2678492530248725715n", "63759940946573266111589745544n", "1239422070074535035165804970n", "3011362073292317527n", "5312425357216197805891517417n", "8604490350019536611169668726n", "1278264119461231226n", "23413740732153092734953046582n", "2351234330786062681522357509n", "3063446156461791539n", "31192263866697541487222909336n", "53213425910476786883061415945n", "3388535254355309510n", "76222049202953784940228041093n", "8232814450668299001215927167n", "1010418058221874517n", "30375045069912390061370886372n", "76858962311200653420966476141n", "2531834595530804919n", "72838406196796824316965387556n", "16107338032535514271932130242n", "826038058455425888n", "74047817357615679402104886971n", "66250974048331219261305648117n", "515372630941459652n", "49140383045734318581810247391n", "38552127106329617678305826510n", "1791730195926210707n", "20447547859709794457924179129n", "52480964595913357482998508931n", "419726983098458687n", "20434453705733747059793719688n", "22732218969594988459804019164n", "721740589738128975n", "63178390467425871623450374916n", "58781628951232066578669558088n", "1366096141210552719n", "30310055907701667442250131224n", "77693499391068805405178198648n", "2419127900721456602n", "72238281634987295743046110639n", "2759706666093555363424148875n", "2871042634310332424n", "58186331935313172107712023092n", "73009408672165436946758189888n", "1138172672402058824n", "45794206921224716587506811973n", "50074044364882080121299615241n", "201200847748951804n", "41753381957343686084038148154n", "16651255916405576823960096368n", "744771251876887027n", "6397253273640502791149864078n", "67730045189242272443620838555n", "2723512022810421168n", "20403399159094844095476748628n", "46114852246774129546878110205n", "2163837250026966482n", "63507059223060953171650485733n", "27872394523028449929373211791n", "1266384674015277092n", "31341532803878701385180273244n", "56274201404580685976997533743n", "431470279371342601n", "27146401285505116697408502780n", "10909809704395711896795601995n", "823727347575104764n", "78157451508256479551851793287n", "7934224114897115965586132150n", "2561622534344592225n", "52031374290403822978799313483n", "75680335637831520600351100052n", "2240257882085839580n", "35818819658139744996071875447n", "62532608351434239965548606901n", "2997209098633992908n", "35801460645260708494826382933n", "6962199370752725968726753829n", "471191881884558376n", "51494347593311565178389849721n", "27959136057874496572927068138n", "2054885609386822401n", "1903400454085938493722464234n", "58252527737465224754126905441n", "871049256780466220n", "62266126172301828292957015888n", "29942402306346798464030870789n", "2439682690873113741n", "58828716449315637847726991566n", "33586884830050665361484057496n", "1850240284198082738n", "57256720773892932068692318575n", "43906884659388043006991040937n", "2567264210368699586n", "37303325532466691611774319975n", "1023775330119159065320215646n", "2970467943548704391n", "6719369853840095911284134964n", "52698184868933442534169228704n", "1590449702912303791n", "9163234315649800019839577781n", "5096786077915756093838027866n", "2604014912333559946n", "22626562141910724736547894073n", "1221514787490597839172086118n", "2021859363658276538n", "29343228808229785648243946635n", "17107161597392558070179986947n", "2142074198041769333n", "8295437982000203433981112803n", "32281278698888589789154221048n", "2261976931796110908n", "19003064635652370381400548000n", "5388386401569756312458644562n", "3154333183807592746n", "57635002029571841636737463711n", "56991897992879623406006006725n", "2842694143682003853n", "73379904593405458046663259580n", "839437272553377608023038726n", "3093165198442302924n", "33419448607193509624332386145n", "16740311080067952025303937955n", "666860562806181637n", "8797571923563716660075774195n", "75022438860744435659585766685n", "1558560135470851650n", "19713896344694960627284542368n", "78388507052884523368130573724n", "411547793569600371n", "52610184319591489722152436723n", "58886726417514761894083084350n", "779286101129650524n", "30697463792187334469128124748n", "76836636996796091386778801556n", "868461342532092659n", "69910862714025895807766899173n", "51405542117679167872600082463n", "349470313771420560n", "71284241241602654693194940143n", "7305568034139166589777830792n", "2498747200591008033n", "67960797371315801691053786599n", "25825479627169106615506743060n", "454178144016317938n", "35798135180239958015829265626n", "23385623537498663178814541991n", "1668508428339305051n", "15450665342638866022354076708n", "1590106122468359708599592949n", "209939085635224246n", "45146454297276439294547281947n", "71363197518122470395685282523n", "209021609080779353n", "37805135405124328919729060254n", "46916624974206570529290830921n", "848835529094356500n", "52127928532313726409293511873n", "74341195298303002847160668677n", "2836594795507658600n", "21372610848069974970714546381n", "47095482837411596424060733004n", "2644188767312235257n", "42696308717032907609441318200n", "71478263091865254540527492446n", "580612364877252066n", "24227503011457277739411398472n", "46210588161299166961443583909n", "2104513243231016467n", "38286987706753654842254500763n", "52819390378718994903041839288n", "2559971158277261662n", "10804049422689166087510960068n", "78494177681671393465658693075n", "14482037543685577n", "45316386224024264714051962520n", "8077236619578691823690243326n", "3134255926280338435n", "58234835865881258067775424985n", "32582539715376623121568222400n", "895535831771370236n", "70554522419104669983576590653n", "40229753450332894247180991320n", "3235640053820685715n", "20050852574591066448348962700n", "63154847355271958325521981335n", "467978477141038832n", "23115494614834363321936638302n", "54275477858894789534235120579n", "1729059077109549892n", "2643222253937861530223901503n", "4343013099917093534712467976n", "2093250350291324334n", "26606380640809280595919467519n", "24158225122809122341718478436n", "384623299034698779n", "74889164947469453919523854509n", "57684567535195905731154589750n", "1155881533367487150n", "40449699793338258794390721810n", "45563605053974069206983967932n", "1493349482130193926n", "53198779688378832727006250273n", "23250105681044235044335219173n", "1649629209531042678n", "31842301972458791163037611310n", "54103172956148923849538705604n", "1853082006782289707n", "73283134292642541157328722326n", "60011977393637178105550407258n", "2931499730502310317n", "30363774768400601902892824896n", "69784527858977659878014965306n", "2699700013359551525n", "30143876784681103984444940141n", "20508010382725323248422071352n", "1472036335205806581n", "72685268086241841913630448820n", "13484287640917155024759235656n", "421919482836501604n", "58336665028159633068676496150n", "37899530871095451514688032059n", "830925861824953119n", "25034909887778048695729760495n", "6186382813048747659882138994n", "928295656744287075n", "23742999482526473077193706109n", "38681524762823880972818454723n", "1037267958137901699n", "75848820697595803231237834330n", "4098133930661194465828731453n", "2484592940588499869n", "45229057029317220478111498771n", "55686910073377115986537207556n", "2974592459022975650n", "9058824958434584730691471305n", "3489502058924586487278999515n", "1985538445731248079n", "14034347138268021040571737620n", "22094509985004128313979725457n", "1321434542301391881n", "17216019289274156022312124782n", "65908201923726532456265422977n", "387610774042169114n", "29699496552150641100894659868n", "43552700176683532671663646633n", "305525895851406027n", "62068283835877161864738460092n", "66163022436031594737849199513n", "1671489056967612477n", "5806077789744302022830084009n", "22126371298319875265318066168n", "2973075530852635513n", "43508686549770752780288409207n", "39960107195405145189624452517n", "3021227579398645734n", "75958919635020929694389722957n", "14913897636015670404185010029n", "2882183092458315590n", "24239404766805006701421172975n", "69450551382041986033230454197n", "629979785699424851n", "47715312965767193925496266564n", "51328287208106789864582031889n", "1994694450268216917n", "12878968128402785600925987432n", "8892728961399753099629106451n", "2189564568474803348n", "17841277261874434955985363634n", "23255802008382153152915838079n", "1299631183736247307n", "70369295004394220674262548695n", "41703500013750845131767430551n", "2515279718642012557n", "29363803518729226252949864837n", "11941978972714945652777612780n", "1864444849178365249n", "19838910496936353855554382505n", "63526654617675483693289584781n", "1386561621225388054n", "37964054821976413036136417123n", "14531042297004730862055294756n", "1592174811323575228n", "17025415710900400219439375060n", "362574756192905655380951625n", "186982663000383695n", "75302946272320992428390907104n", "76356571252613340602107695667n", "1005406788214614232n", "58429545482092547095478867066n", "8783598735519438107774246954n", "3449009450489856852n", "52421244757199560525245430831n", "36745113142356116864221402917n", "2011028989323540641n", "52389389340233786555192956059n", "48540948198567585375080843793n", "2511738896308209966n", "62948973448903767233283645427n", "78581731009485419534613750974n", "2631249803991736511n", "15700178914629731044995270252n", "21825209006850516132399941848n", "469426094359884098n", "45109950384963150442992909517n", "34709270486045260410251674804n", "3227700636384978310n", "59508455528169337110518969046n", "7626842288771897454076798332n", "2837142952242233831n", "78154898100541067453790359715n", "28712940925290532622010374032n", "2005548120880216529n", "19676819626842762742496321363n", "21494888704510312646126358022n", "1917432403713999314n", "35348767509581898437000853095n", "54404372638473474714277538548n", "1418295384476104455n", "2087534038039694873601959364n", "55492416744530703076122435501n", "3415979290873032604n", "77874081666239317555289078970n", "64693269821438151662321973074n", "468500022203866114n", "52183552801284363909457374676n", "26386627404911694711966206173n", "849932193222808822n", "60880246718709527470179169635n", "73275749658065911543659109078n", "2835936826164075331n", "47034978948350796174151388655n", "71774550150782116132727222082n", "2957236831646338670n", "63121833886036603562738575495n", "23473953357667857038757232396n", "709268300106945760n", "67565011137450891785645904255n", "24476510070022540670394808047n", "2197500443692989620n", "59529365216756814354926446285n", "62380286296544401614193824725n", "1797665767653557658n", "65352576236492901270647039868n", "54007112892683927216806385747n", "1796075374294915397n", "17840563634584466359434584144n", "46203718678613515530978507404n", "702053810505193011n", "6133701316708198581434709723n", "61802938904865726983656435299n", "3001276128418418514n", "11649452974115692944272358953n", "18473964874994391830987882986n", "2086271034138195481n", "27934361651981769617523547350n", "75412934231387879572695859186n", "461672875728163553n", "2659961698397651286244898268n", "38244585026297070186059616261n", "3371488902807027695n", "16205200667874612181106188684n", "6520317333544879950114099734n", "2490923463723046056n", "66034343348095027053141749239n", "13522171761978136875076440765n", "211626548808403729n", "52060409492746050106971031742n", "3493375676170587510122635686n", "3394236868158496257n", "47140116537527183288446191137n", "26402419994251877186703235784n", "2932509761218506683n", "41718577718458247425998327137n", "72444125720253366875907105723n", "2370720516004120360n", "63763546849180341189837833587n", "56383249669741657007269755446n", "2772609748811855948n", "30673155381064993958540435457n", "58923421149810821122915571284n", "2826147464537959677n", "2437524155719427333248486827n", "13523745438577697843652059309n", "2255306498837633258n", "66617913651732723895666550762n", "800383901932656375981050324n", "2369057816442019000n", "53894023794388536556779913700n", "43633381247568199322500578225n", "1622058361920748072n", "31610597297695602711187104065n", "75047413064993937787913175675n", "2532518357458277794n", "66943196821272189971919216455n", "63057632269388325855862697967n", "252919094746701796n", "36093617934864267028615495215n", "2458297172936844284200172721n", "2861973034148611365n", "35639326827089764975324431609n", "42790455257345625520833632516n", "2416491183110698117n", "25453911219236829571892475695n", "7792114184406477060828720050n", "3256395018257219594n", "44446878573785568457717214835n", "31316823799089969829944488381n", "3348254446631709920n", "12075675278480009463346998871n", "33336621394122897171138216323n", "1761645290764169692n", "38936491179522097211601163974n", "40756936871275705147530952481n", "2239620312855528769n", "66166234417862875439766591001n", "45961753617942718644070346235n", "2545432639028408432n", "27071931775260190706961952445n", "16791652622063002274074642172n", "1351810600008793720n", "8734604468994364132650578395n", "2915643774972349972943503710n", "546123555763251031n", "40883390215425903758829895197n", "46075188532687982090196339471n", "2037883374560027081n", "1788529744899075811496881871n", "22977601030754581206369105722n", "2052641684479223112n", "52403270166627919005596848880n", "2330881363722503207702297453n", "1950506519094245230n", "26974012086112717010353138814n", "69257122863702421096680142186n", "731421312124744837n", "31069884618093040515903738825n", "64922032296511662760139295040n", "2654253976131730717n", "12166944124292618925625599356n", "59407826445782768214824917874n", "354147487414166550n", "74336686733791433900827528675n", "12704634481538804742936579229n", "2082676564717138885n", "190n", "58146038485323707171566360552n", "79083051845830931429793398812n", "1253760413372422709n", "75585805608841426332286895315n", "17454071065969374047751520578n", "1856801283221000835n", "56347371123082155623989904211n", "52625756897582785946932954415n", "1103484556810393055n", "27404185422829405492475499818n", "1419552461670775323662566720n", "3431535685290297040n", "10240761959601706862708901917n", "71665724585200281475617327049n", "3232798557396947874n", "32919536142170844080265894843n", "27634787910238436631971547080n", "689759514785002741n", "15431349741815244232301206308n", "53845586976664022319541168221n", "1583044030122302208n", "47825067986735618489429772434n", "36933954632637013701382915058n", "2061889715878943774n", "8977310916259261225384223331n", "4538091340276567216050541897n", "2974949937804520552n", "32068898197860866225864499204n", "11944297794698583544272156441n", "1942470514051769102n", "16232887649510996786606289763n", "15259493580801814760566477085n", "522617557584553779n", "24242596953798418019519661501n", "34675681500323328218631423377n", "2626688210475495912n", "78740174483351451096333088791n", "64943981386376195937910130384n", "3002553261633376435n", "71321212497283823630152857278n", "57107096638064759035770959417n", "1525415424337039994n", "33592124231316161392746859369n", "66360389043497290172485164153n", "169262401730913852n", "67472003684398719335655699957n", "16789521379035350190464748508n", "2131762421966585515n", "66631783199370161347508379926n", "48925352076915955304942304087n", "264237490291976243n", "24342296347779296789258245457n", "43293722801550027940585947288n", "2184523999681911728n", "9355802069694208050316076397n", "35552089219631962733889470030n", "3012875015446218241n", "19749370490527515528697426175n", "8078386931861545908004277048n", "484548262348581637n", "9197680845227051035593920301n", "76678845496561933550816162785n", "1006587369936993775n", "16264558547638181301681301031n", "77659436542602450682090346042n", "2549030864566782064n", "23992787444587661702047865121n", "15283574111017964877795482274n", "1010500590098381861n", "36081283464794391834173091918n", "74713339703559068643167768213n", "87864425149724657n", "15509755852767806607741504203n", "49741860533707809781906740346n", "2053665582944552662n", "21800540003051693165872352300n", "55295746887291089518396498874n", "2979094345114374943n", "11846584694067264521987247663n", "49031890130314527277927146925n", "3053072831928300240n", "49870471347364999860446391462n", "60351156120295649092916522340n", "57434309920295622n", "51905526990545292008889846168n", "35741421582248014414699395252n", "1021827240168947429n", "16350288651927207676427341432n", "48548588913627635520822500823n", "2556960523655499318n", "39061623507343320271115115845n", "38947970321306063422821592330n", "2525216560431056230n", "65177147304893778229440396619n", "70545257645069117487807391489n", "1600567512488781231n", "33331224951106722420313772928n", "38583179480229318101782748287n", "1817415503412264076n", "43931562095456763346512920739n", "45993143967557989986350621262n", "1013785943641285390n", "46300841465540867353476664678n", "67952189225824325494911009881n", "1883806626142505323n", "74763953209711116608083413573n", "73395076121267231351266442748n", "875683814313975814n", "23960570645093608799064342076n", "36737884069061207609010160029n", "2740282725978910539n", "2348460868169339519816282219n", "59294276502368234372728690209n", "2234404830781012457n", "29326696920519891523554164108n", "46303855242526653100651128095n", "1172546639486712237n", "7729537530476375227332351839n", "8564566731713324385055420531n", "1479853701561506444n", "22273291075577128615277532352n", "73656828782504352218789556241n", "2308987335794616316n", "14359470620000928077518163171n", "71961130737820208932903249274n", "950707570385670728n", "70317507071845790171587549310n", "45654920344570326674633769038n", "2650168593880186613n", "45738429799101288017972815601n", "43778890431815013310034329810n", "312650173805915283n", "59759032808483205201660512612n", "49166445941564648520976910103n", "575816160851551719n", "41099033744600704768583815842n", "67643677451426846496806534446n", "2744110069990264553n", "5427077521225540080527062818n", "27591683040195514365023584328n", "1814257385547611969n", "43890769480671665778349573612n", "25702107374475025393868297533n", "2665391419850264467n", "49173530067968024446609831742n", "69233652337477869916623889471n", "2973651385942905178n", "39451576607205851507235401000n", "65326357252788810888449550413n", "2328241568819620138n", "7187030532193362998811241838n", "11158043907775193412625503465n", "1887168135327759363n", "72093988836508782933530929396n", "59408618785876068844273516201n", "1998979553140732738n", "20436888483045692091969328934n", "37236965238760796085670708990n", "2982240668332065019n", "45766566944201297703965941735n", "33134417182815170607111134530n", "2256938019969749699n", "61095014957849456939456497149n", "5166234805292214141604288719n", "2223380807107784804n", "4407612794594263685713471991n", "27938927008707740784778705409n", "889822472376617854n", "10586000171735376465147370484n", "11688046614136879282493614768n", "1673899149118569188n", "48568524626716983467820586640n", "54066530547892129113282820943n", "1257544179877250249n", "70430239680893778037863498084n", "67050853132645903854946409019n", "2548118935751794404n", "41828468840963319821789084190n", "14275492751268414444663806553n", "1784444490366165065n", "61852018693496828660952117185n", "48406002847831614907905133809n", "49483591444929780n", "54427537761720246076956183538n", "41736602958902949490055768838n", "1954646608479060360n", "60934769075649772007484314209n", "4723248530441409773201893998n", "3259834508477438622n", "16778379388406768302608844589n", "14091941761246911672273283575n", "1362843677097285540n", "20990186444040307549583297890n", "39850655248017325132808795637n", "3159948251218994501n", "22841250904644903266547583091n", "35884470460139378173998471965n", "144997960402386643n", "73988342422211773824311060048n", "25430193174058044426248161017n", "1511499341976026028n", "41856665278828717622897473021n", "52430814625940772563313528979n", "1518969462082050494n", "42785280606159799076021378453n", "75641406683588400312731571380n", "354558010400584999n", "25777665187274443426345962355n", "52569759362487685340322204483n", "2660707269990640271n", "39456006642189286944561721406n", "64095592448568371575360918624n", "1623622008203944130n", "42823981658558488340963830755n", "70857240021552825619139550212n", "3338694247115466605n", "33528981497758066103123618956n", "52174717566293432033940167575n", "3285250213548536505n", "49559726527714678923168862226n", "35376383273863973001561075247n", "1762388272055172875n", "4963094059256542135804830802n", "15251461935798611072932258838n", "3043255521973128258n", "23415022784844915519999589288n", "59120161904093027011464662035n", "2353807276882257604n", "35355887041205290611693611623n", "31669150297307261835976265040n", "872891098273185795n", "69193046798683036289275806803n", "42818302823254546309613088130n", "3225904969635087159n", "22611614040816481524272701347n", "40802292074751246948780577207n", "351005661799852441n", "50079803252014276007292589026n", "37577116329374038939872244704n", "745466466224739689n", "57943789902740370489195854856n", "59877164372411435705733535421n", "1440407261307873910n", "74147961838302268113193936081n", "29475004529393168298384526566n", "780455262674149785n", "51306862863296749150663360555n", "68603117787295236727112632820n", "2702997921905430000n", "64092864258708121960742058121n", "27968741860257802705491575837n", "3395033579182877453n", "60896409955387219924723371046n", "72447564289478669262616529078n", "3397060291617780594n", "74466337456436624238136742413n", "67930138912822600973471222439n", "631712168137915134n", "34699941264140402915854806555n", "31625108777123266428395503959n", "662594291726250121n", "10374418997762067141299032182n", "74831531166323756923345310781n", "2614948808475244069n", "45617012767756761370444767987n", "44141298692376594039790971629n", "1159181502462992545n", "47704071339495071156056567054n", "46834594498992945383289148503n", "924797511068572088n", "23233351571238696045632767797n", "14376771187481317319928510593n", "3161389881302592208n", "68221328884209068946490350230n", "69520921081111912732122080295n", "540294970059028553n", "49382519270729084009739959234n", "54272649767268320797552878520n", "1762246401423958252n", "65695480183764337135892820912n", "15357314953562507969519535878n", "2415017092301124519n", "12568989548408666155318764896n", "10255298595269749256814759758n", "488040996573952383n", "61804111086379855885098583520n", "11271058357408383599116781502n", "1329740533130250248n", "8039933903881517002403963857n", "7118558163468937314455208936n", "536489202082349116n", "57213159007120933607123362054n", "38389263848304750695624289842n", "103890218507147410n", "44837586220950001446991442272n", "51003826059731215073098356499n", "1055564410899460745n", "36382905285088913012495727205n", "23789430840439822229827015138n", "2409250954595470494n", "77553161939176686247041732803n", "32075777538535189410338696221n", "308581509063990399n", "75123827789249657112621112140n", "63466606458376146979489895003n", "1559915864837385203n", "65374245818638483805981829412n", "59413598642796928072211645702n", "773792966334851501n", "10975404188605698335218119359n", "5937731821461360820250261750n", "2424406683527655198n", "58048034440511231692734658223n", "38541497666142538814655959889n", "97237747168756283n", "32114431512100683707696744321n", "43084884381938054868610618438n", "53036606161489394n", "49303822531142933183499847955n", "70757204501375068333736255366n", "1090664900942087596n", "68973060792876598659428050587n", "21709941437174734607102143168n", "54515769952578230n", "40278884731265681742344272236n", "34941403842240889411044059527n", "1414736029232632973n", "60344648712825684665541778621n", "10769790997010708809402622618n", "2270992661657155596n", "42362387786284445354439187653n", "58156800386628045782945926146n", "2818686942230697090n", "31419723024915919870538049034n", "18005463704599391839628874083n", "212688156617827815n", "35911328625822934725057123638n", "17761454535191485025880626131n", "1761977155017563514n", "49665582664754517847870128980n", "39319816430240621753318268462n", "1491136817343252047n", "22260823695114013941955374538n", "17055513051235397699203988336n", "1922191265581876891n", "14555432039935861975982534425n", "48152237244885228239450679938n", "621157026389301132n", "23051036183574002962556684690n", "15971796984547909136099208821n", "2205567601778656458n", "26382181900386119773631359523n", "77486525780604152291567730894n", "3344785235831598130n", "40994902602684141065596542528n", "58124151025072872977666932193n", "1866769646811958428n", "13188769330477055787925877048n", "72682189451050217677569494954n", "1454880931779552660n", "33634144479293043106522767128n", "63196693658172041397923530081n", "1719120090000942363n", "11106335219605429034116541445n", "59150880447111322507257453443n", "1982729467772378638n", "24990080775267144618286017329n", "4933890943319210884773036028n", "3238771988114708503n", "72949239866424524529472552202n", "28511064168198009294661488723n", "2962023653742267897n", "58656766073983020247853921869n", "47635718491612423608063190516n", "3000234376036375986n", "24238047790212470654844439662n", "23154937283069080880032452049n", "2013625456869347404n", "14825246893209210042587190789n", "52825936212514509264761514892n", "993721473581556871n", "8713904335226753185274037022n", "58909703948513917292703719505n", "3356613834808478835n", "47783414808532480730935012208n", "71833517958023857391706253943n", "2135080825574499771n", "884520208662549368825880483n", "66815068005909338250309574561n", "140309291176602342n", "5569450875351413209302619112n", "29224003387999671040246207661n", "1610924941533931901n", "51360380732923628237942915208n", "49075415090226283505119870909n", "824496444682252362n", "26136012194887577513976704588n", "25203540858598899941257080851n", "1411280372175925570n", "68280069972262928193338796048n", "26491256896653383849815404924n", "2469762357772618827n", "73734748267187905353062326737n", "68913774706780990255684794379n", "53485910764302128n", "77777156063573625138168997381n", "64557037666602761347172706735n", "1996255398685960466n", "28464530722569754157139260154n", "22979110781613272893921919353n", "1105566566131594780n", "28039439084355019144555806027n", "16299329550217317018880117262n", "2401400792301565600n", "62631950163514864539620020206n", "64031511810008173001111779669n", "135723323566704095n", "56130238209974371238192421387n", "71300385211683773671558874832n", "2820109121346955706n", "1266050722527037359608467989n", "23369565459382988863634254407n", "2609151292716742371n", "46069724971530567254818701644n", "50647992693491661816900039583n", "3003365004111477246n", "14833086786816707962865094508n", "37929390713358467376261350799n", "3113860565507891619n", "14007914765299785142256461365n", "75894388353326085571138234483n", "1683683923201420873n", "63454168155478046454844432701n", "13184396719317261321865011420n", "3455798177318665792n", "15242605704632094686138955952n", "19838168147461161870148387345n", "2010616752800746021n", "30692509923364661764582557691n", "62096107423559910046379351905n", "1346903255621101256n", "34464243166874822079393179146n", "63846438778551544175642767034n", "1138380012879476837n", "74737710169640323515477410562n", "6284356348145608854716748036n", "180980529294338977n", "38461808257846861933076217288n", "75020453906990644280477544720n", "307346157687553567n", "42941917981619284749284256464n", "29124361387770891246090195521n", "2258523094183111792n", "31043177647483836512207577733n", "76846872956655992019312504229n", "2737531135418987922n", "436136989124112448213257527n", "37270775937015261263489085940n", "1691548620283188254n", "34350139485051631072038425243n", "47842925193965716748069619330n", "3012190802049531932n", "8161319477063961893865419497n", "39887640444908598647019011892n", "326805514938122984n", "45251026371225474798165551670n", "78712165100775809310221458014n", "1747908356221952635n", "74097152003535814545675921337n", "48494072556502793463457269862n", "538895690676303310n", "54295451611850750079844956272n", "26534574033318342223582372449n", "3044215930961181551n", "75837108057982626126393125222n", "52432746192616266658163099498n", "3397076867009838686n", "54465116802539051194037403225n", "19480966575390018045669641671n", "1874912131754984363n", "62538117008905102096704754568n", "49778263788224308775212049920n", "635641138655366122n", "1000125186700770733728208856n", "72272342271481440271970417215n", "126669907718514487n", "32850606983744341262159941170n", "34502523802539415215826357899n", "335651800228572498n", "74891229697299665485048117886n", "7923057032410301273894282773n", "2078488636177744832n", "65834931437626611160851671144n", "47253521926346692275217471181n", "1450467026022714805n", "79218551078854046456367160410n", "70762120870550042138883949317n", "2886881633871743501n", "34749927009400659485527823456n", "74230186035227802214714540722n", "91514308691397285n", "23895248556901354081433241434n", "16615401776547671346915841714n", "3136707560354543978n", "21834987311199156124647763244n", "70345068331037455105782146634n", "3216348569578182800n", "14552026033494402774981149080n", "46810169065384954077118190274n", "1911480149318741295n", "30149592931357591699950156644n", "14166482924045038689605819053n", "2327000634007357378n", "38247650175016523126038806200n", "57691234003597921786155373117n", "859973345968241198n", "71714837789763600565992214961n", "73412375228179646879012079459n", "1974246974270865632n", "52446930245349056255719340345n", "970285520444299081223312008n", "1628797543941019300n", "50919498183802806944452291286n", "37490783833480294299979274400n", "2991807516764641990n", "32377691154331801475818794360n", "39750977600721907402675106371n", "2263832844069227231n", "17627606237803241511589218465n", "3828538907962341287451709925n", "1651077712155795619n", "65746494371320988039239195368n", "40429923959132850189737190904n", "1761591307449813117n", "62030904653045818611809336637n", "31416196507873606617755041492n", "1626933121429044990n", "56278396859095728868031718464n", "40673401721781629455927974763n", "816921835574909421n", "41466998290124345097221160853n", "77602619970761915549134486486n", "2270380655319303423n", "37278580144182814004827303266n", "22631466550317400025567159166n", "1256554869446519681n", "44512857141401466618198683938n", "75645231533450873900978589761n", "2839895442152180859n", "31711543132209616307103122831n", "78955556053482715721582593706n", "626995298916699271n", "50496746606014163961365206592n", "62746915431247250243776212132n", "2682171950447987392n", "8649064541355918845604157106n", "3642459701627177804195047993n", "304942239933523054n", "52349349447437650280979204973n", "38235331305898406894352347179n", "574973155769907953n", "35486247734767358887659775332n", "63676560163395574209410974039n", "1346859065344137509n", "42626666034641293807810059734n", "78692725054674081196434522843n", "2899402626497036759n", "4466386979191688634974299793n", "73590084746022202502283403859n", "859759454707498102n", "49530047850904057997975767021157383838285524079350821991880424926644689941n", "12n", "73833755054290735615493473493n", "59827914949558952876927624612n", "1842769298355464193n", "0n", "31709724516548461033720090826n", "30157355094312078251107514164n", "2598882554441689462n", "0n", "340282366920938463467229529119593204504n", "2783209552014905048n", "340282366920938463475639663367112901035n", "340282366920938463466510485605024151680n" ] Output of encryptToDrandRoundAndGetCallData: 50 elements ================================================ FILE: tools/npm/integration-test-suite/packages/nodejs-ts-cjs-tsc/src/examples.ts ================================================ import * as garaga from 'garaga'; export const proofBn254: { a: { x: bigint; y: bigint; curveId: number; }; b: { x: [bigint, bigint]; y: [bigint, bigint]; curveId: number; }; c: { x: bigint; y: bigint; curveId: number; }; publicInputs: bigint[]; } = { a: { x: 19326975765597999023026309242851464618295625967876195641207265702903971944714n, y: 63835113064883221423828958902442994957834669122245713027012799265225733314n, curveId: garaga.CurveId.BN254 }, b: { x: [ 15926258242285065430281020483827261910589109953358642697562602626998569607754n, 15482775443177023962384497625528997151098293635727021527127534892096530509952n ], y: [ 10937776115245591292644949547008094885240742374542777857501160790374675834371n, 6691169928456984700056024515478772626466687376966760922939239504103847739755n ], curveId: garaga.CurveId.BN254 }, c: { x: 18548825552947889373136407684636046437705490810597995577018381312170231914454n, y: 9890815383090898074006770716054740281870916546141552254207684185588486179606n, curveId: garaga.CurveId.BN254 }, publicInputs: [ BigInt('0x1e17db88c1d2e83e49f692cce4bb8169309de90afb2b141156243106aa34b474') ] } export const vkBn254: { alpha: { x: bigint; y: bigint; curveId: number; }; beta: { x: [bigint, bigint]; y: [bigint, bigint]; curveId: number; }; gamma: { x: [bigint, bigint]; y: [bigint, bigint]; curveId: number; }; delta: { x: [bigint, bigint]; y: [bigint, bigint]; curveId: number; }; ic: { x: bigint; y: bigint; curveId: number; }[]; } = { alpha: { x: 6763126530687886999315782887200758703366235230289874831627658839515656330867n, y: 12297948670392550312636836114470404429657568989657927437959695771502446445179n, curveId: garaga.CurveId.BN254 }, beta: { x: [ 15362786867599176251482538547160991918100063526460909721657878971551583339657n, 3804423004921008809819632629079723167970572551072432396497601916259815496626n ], y: [ 21885719103633717693283841528133243510750001708857084897139570082577218850374n, 2076817281717432063622727433912740683541778328445173073030513609350245776784n ], curveId: garaga.CurveId.BN254 }, gamma: { x: [ 1505558511994093266228972967760414664043255115544025409518939393775943607863n, 21131173266568468249589649137903719095480044620502529067534622738225157042304n ], y: [ 4008759115482693545406793535591568078300615151288108694080317738431649117177n, 18835856718271757625037377080288624550370480296914695806777038708085497610013n ], curveId: garaga.CurveId.BN254 }, delta: { x: [ 1497911744463986566314308077983046202449361313910668647770797503379177516252n, 10829154948357654897792444316512827659620136273388886760324770466776134105520n ], y: [ 10850392992008761830625471778404650447428083833210258292805429019728339148884n, 12593805385728178657844996215584371401133999503150901444097670307277076679963n ], curveId: garaga.CurveId.BN254 }, ic: [ { x: 8279781786940010385190155571855963988492685408361021424114669994156938727612n, y: 14410809027374663415870055712464930833085570569392210261413081131467855918386n, curveId: garaga.CurveId.BN254 }, { x: 10075286447651977124250383403562829564641026794366918560412684031493085120161n, y: 13393494704849149158598989372790154670517815409968589728896053397011959461594n, curveId: garaga.CurveId.BN254 } ] } ================================================ FILE: tools/npm/integration-test-suite/packages/nodejs-ts-cjs-tsc/src/index.ts ================================================ import * as garaga from 'garaga'; import { proofBn254, vkBn254 } from './examples'; async function main(): Promise { await garaga.init(); const result = garaga.msmCalldataBuilder([[1n, 2n]], [10n], garaga.CurveId.BN254); const json = JSON.stringify(result, (key, value) => typeof value === 'bigint' ? value + 'n' : value, 2); const message = 'Output of msm_calldata_builder: ' + json; console.log(message); const groth16Calldata = garaga.getGroth16CallData(proofBn254, vkBn254,garaga.CurveId.BN254); const jsonCalldata = JSON.stringify(groth16Calldata, (key, value) => typeof value === 'bigint' ? value + 'n' : value, 2); const messageCalldata = 'Output of get_groth16_calldata: ' + jsonCalldata; console.log(messageCalldata); // Tlock encrypt const message2 = new Uint8Array(16); message2.set(new TextEncoder().encode('Hello, world!')); const randomness = new Uint8Array(16); randomness.set(new TextEncoder().encode('fixed_random_val')); const tlockCalldata = garaga.encryptToDrandRoundAndGetCallData(1, message2, randomness); console.log('Output of encryptToDrandRoundAndGetCallData:', tlockCalldata.length, 'elements'); } main() .catch(console.error); ================================================ FILE: tools/npm/integration-test-suite/packages/nodejs-ts-esm-tsc/.gitignore ================================================ /node_modules/ /dist/ ================================================ FILE: tools/npm/integration-test-suite/packages/nodejs-ts-esm-tsc/output.txt ================================================ Output of msm_calldata_builder: [ "1n", "1n", "0n", "0n", "0n", "2n", "0n", "0n", "0n", "1n", "10n", "0n", "0n", "75759116906411131289250842036n", "1443316740970346987535705368n", "708088064087366360n", "0n", "31894839170900604627010243180n", "26562388390640533846098233871n", "1678682860455561629n", "0n", "340282366920938463463374607431768211466n", "0n", "1n", "0n" ] Output of get_groth16_calldata: [ "1935n", "561151868347580495583090954n", "76095163897123765080010407949n", "3078964875882710626n", "0n", "68760071548346057889257256130n", "33987009017980255890281589641n", "10169520226989098n", "0n", "27526525353537266686222475850n", "14475456397330869216192753448n", "2537199318039088506n", "0n", "21536768652854740401912377472n", "61033740543581523820282161323n", "2466548432040548587n", "0n", "49356715888972701601325049347n", "69887821523610458575318250963n", "1742488265497548861n", "0n", "68106177540828336088045306219n", "961134836681944563222599448n", "1065964868903753173n", "0n", "1800806384039658546158952406n", "44097612892395787951554989634n", "2954998394940821894n", "0n", "57407696252580182379957914390n", "68043785987214905719851221030n", "1575697798130653691n", "0n", "1n", "64622861075918021861446670503650833524n", "40000715384012656934033607729992139113n", "65343516826393976703500119419n", "64215924997604874724268545467n", "988361220710881918n", "30419768492628197858619568261n", "27248300164153194572764431995n", "2977039154666701832n", "65685384868591218376868464427n", "70847639348750339988496276918n", "477777041053646529n", "29991939756641252358878134746n", "39295947558852310211017126572n", "2815628384676858047n", "41723516601424502403187247204n", "17017221925427596342628818049n", "440483370607139100n", "10413180469465695361837522183n", "19423959337400646488247227266n", "1196856567711091031n", "14918739433528640782272739139n", "2386255189434407583576372032n", "2110030772171629820n", "66403863065153192042460667734n", "26490228722781507311620127895n", "1376925612093868452n", "16095686441528704658448370761n", "51022389018232154188872438326n", "1610491282614910455n", "37997039872158612927722452114n", "76461913933066610895201145075n", "951074374291802403n", "71303405408633411813876113602n", "65378028046199379258519780162n", "2796976393851271662n", "66043194162972766020432949924n", "72668519642029141849369643840n", "1767421250104456939n", "34724757470958269778491338738n", "67907574914053181941994051296n", "1074861315591297211n", "57811416502141401297494384261n", "66717953782642686044297384228n", "619071555217927229n", "11747815192199388258706152779n", "39655522309044272057593243434n", "2667518659266923661n", "74545987263802105943401974456n", "25100780504941704736052597181n", "1614091262172996678n", "61496830641585942728225636367n", "47520662928915336127912320093n", "1483128622047069223n", "60688370891239308805053347678n", "6154252422157238786881911133n", "1595810747040934713n", "4083087877564984515505707949n", "8098795933662806280871012387n", "392529588828430050n", "14388273410011291023320103380n", "59643003630595652724715495246n", "2978244255961784640n", "73005708620970672578538518429n", "64274822400727474231693975117n", "824761225328685267n", "58979395441344004425345087397n", "50034285490796369376342018474n", "1071577406066675668n", "37552244383550540565443579029n", "66651519402295869947385119697n", "1816081760201573675n", "48020280081371249748563352979n", "19387797072717949389382225132n", "1075380445499260082n", "0n", "0n", "0n", "0n", "0n", "0n", "35717919122505863182793101258n", "38321232967395819819318928199n", "33653293845735846n", "0n", "0n", "0n", "0n", "0n", "0n", "60126610212574038899502857656n", "7521540037295293717633716927n", "2853604986499631260n", "34n", "21051189327279847889561754607n", "15679397574132606210591767826n", "2165541175263187167n", "11461504713279098434997837844n", "29843864593792422920685859506n", "1460931496621397613n", "31444402670555100638844582863n", "41564870089383627374040254466n", "3317275169749288672n", "72559701040108110454251376272n", "22887416934578586124987839996n", "233686850646424299n", "51667851121405518271474152545n", "8297160697759020633045233343n", "2193876459774314419n", "50048470992987075597478354517n", "7622325433377464914372402739n", "2354852892440837544n", "51371930649223862037533589505n", "79037515700470610379424985426n", "3103776711054728122n", "62017664743365054011497714498n", "18400895627048394641412939651n", "1348549913115407530n", "68135824164391051249850625519n", "66467776056179325801077769907n", "21934170737946721n", "43733194692565917370190335652n", "20871497235942649279957719973n", "668366294714005293n", "69461224576101086641240237729n", "66163212446743341874016516713n", "2187872754580648643n", "17220145241406859216639481755n", "16637691490800642336304328427n", "699908274655976347n", "63497807423928467541336180608n", "5826616601935275548523889948n", "1995878641893268059n", "45351336804917798268705814434n", "32809386436253774870015191481n", "2479634507910679085n", "29902151727900563245652302915n", "70978449320724687288838934154n", "2324927884830925807n", "70956000718854853515484101425n", "18794223695576985859644098754n", "851712710373510834n", "10098225054790962506843798879n", "23663666343921865703011477995n", "2539135702270490911n", "13745949463631524266514217644n", "70097334773007528061348260208n", "1449740726324507950n", "77747255839650031066990598333n", "33186206179829484467075523327n", "3072781249488320507n", "73980383885811324159893986758n", "1765445723258696625718806089n", "2271055079390534326n", "65413433113844994807777190576n", "48033870016967321544035758027n", "486427727733872709n", "26974899297726311987406093631n", "5590641036960446176988521755n", "827510576486023036n", "29009837304935242599458620885n", "20410410399336048506493809410n", "1954580703151327584n", "64135814011222089868428198367n", "56261294792918650387740643327n", "1226348411176360117n", "71834179960057214052393522783n", "46252419010406289556729694820n", "1393685374555389118n", "71368042768790547323904986882n", "66161706759499128280107017373n", "2031846388120562115n", "21220965229609488481377288540n", "63634474338013450603335409627n", "821621475859559449n", "18432973800914453913616171088n", "8237366564750917100218776918n", "3448970319177548904n", "51266071561401723888120442902n", "33637427514172279767467204013n", "3304964589143840434n", "38819453582756888614388081676n", "38995523514738195349996597496n", "2323381859757397191n", "60884424754479179074928199128n", "3834764671648885586861880739n", "864611594127789300n", "9851774469429652901432809299n", "37101389540039872112071709899n", "2559626381308197564n", "406646090122284731360238690n", "44652954714826373590985929530n", "683398595921263332n", "20271182213679030346920227775n", "37600328594433178897257972399n", "432396126057182521n", "4187404064813213379278146332n", "44537571235199588707429377798n", "3148695479824963911n", "25801656964836714839982503508n", "51572074862943493111482365520n", "1230107506438930488n", "51625253538057090130489675612n", "11815326077763625426679125713n", "521507079758837629n", "9648925458348520397354094791n", "31712274845777377436963587786n", "1997027570431487029n", "67411860089204789431616372347n", "66528411456550554620624110152n", "186478859944874837n", "61267275259145597446660035124n", "8554664316600082912178209665n", "2375445434845419873n", "1589782365755830876261985911n", "14834270454057237025174127570n", "963005115183332390n", "23249702285165109375700438720n", "20760791667651963569657008881n", "2149068190029611973n", "74674158355316816901821060837n", "13278131002009659818927519878n", "992778641153509292n", "8743794935416188942200722720n", "51445266496970909016857135378n", "438732749332832318n", "64511635865187456937539832569n", "68455428209776466334096458368n", "1196547129512189429n", "16652864649326843859619189651n", "47031229552259361752165531n", "1977848333533964373n", "32230433718106499209616712783n", "50152042404552913889735459326n", "2647553318887157906n", "15558003702184603194095500825n", "75789384763919593972512743955n", "3199452366147221980n", "23639206276595496029173201731n", "49198122874004051169498469698n", "3017499313473475023n", "14633623354742611699704494011n", "13838793228838994907197164815n", "1865567661799564691n", "63554437295278917743885851002n", "43774994641723817700539915508n", "2096263880799998644n", "39241367224191359271532780985n", "11996031360599781980224407856n", "669587303349757211n", "70309465524306380398946854940n", "69691793870844727391235380992n", "1097884931999290463n", "4880550284873697839328338960n", "8683184578595981266384193421n", "1704353262400573542n", "43209925421984317108056960491n", "71838424302727061831479195619n", "1719485935656079288n", "20281500369447070817728689103n", "7827101470501627130702651299n", "1802787150264131673n", "46990609747636025825158033861n", "44506561326339289883265865893n", "168363193009253293n", "72644600526598920979602995563n", "23734595505295435652505772841n", "3066825941193215846n", "35922864395887621958431954121n", "36164080296393340386782836739n", "2806406594668460083n", "9559608083309233656821926408n", "21435397197883361901646100159n", "1173438743001539534n", "45502332725513884072895701183n", "21110593816020485943815437920n", "2156839344197406156n", "14935455230205682855615996549n", "3176509029633635649806564693n", "2744065159326778800n", "50144289937074876149408247339n", "73476828119785067069284584679n", "1137921320963525519n", "7764782370318985672713086089n", "35186333034809438599544173388n", "2599319187054853443n", "71090896326220687050059751719n", "7138127862158940765217036726n", "2525413991973636711n", "74465662641034900763924596241n", "64800563131735459820423413678n", "467645211882593334n", "35429207184442884958891366618n", "32026071525343635101462583825n", "732661589473603894n", "53979236240639306101606255299n", "42289323195165961060464784974n", "2572678142594168339n", "34781401150182625703506517963n", "27502296245160796607775189158n", "204754437845996963n", "60295830689532650505249825677n", "25033548320502415354132760311n", "26918649856759092n", "53883044729840223319972205798n", "71229970233113264180243241621n", "1096143763692361182n", "23670625124894730163037915585n", "66188859433247255337619139871n", "2789875774976133848n", "76287870172839315742103539908n", "76696206429019592649532825371n", "1140810575629679716n", "65695197715200264171919419792n", "64578697338608806055715988010n", "1315508308085028070n", "78097114957711978300958275236n", "73435222529435448525954708815n", "1357585460514972583n", "7357385422266450818170168488n", "41750638133784298446701227299n", "2309087687582896396n", "59893979186320257893680148671n", "70073254756682993544223051173n", "3379633857316028827n", "63037751789054738563399308545n", "22112638657428976200628648553n", "1119955028522904661n", "17789959924300679578888409433n", "32036177498553475203925266628n", "3282049411090141820n", "28853440708133119682221591754n", "53037088663773523321481680370n", "33889236786700338n", "47866115906431522995214087729n", "65896044771509521496549322945n", "1356170216477027582n", "72025359186703704066599325205n", "14290937382512145681745832413n", "235291859370816977n", "16739080450814900672563464076n", "27155915888194232201712953259n", "2201285100786606817n", "79046757705903490925593572396n", "41590525534061554138727710174n", "1563993153777110442n", "58644351226953768961970699175n", "71513413355714071072616721058n", "771468756865502494n", "56315873417343912546874324750n", "66995041844358703653717763298n", "1564628505321775490n", "68742094005504029111318961475n", "43257881480227388188853022203n", "2827885137176633354n", "60013377537965180515452389042n", "22615548017942376680894051034n", "2778940717048846996n", "30216926479141873412912870389n", "67097866317972012436735650659n", "1001082522948099952n", "31879429787569811794175043050n", "57916743777618192263856200515n", "1477201521425100888n", "63117110331861368443138300600n", "24455052765578778318741183737n", "3145320365602131181n", "27504400622945393457424964663n", "18149654277116955082138788671n", "709865641588578406n", "51203413602847718278618462447n", "32871208476003646471375256821n", "1972541565241208115n", "79118404692942875097520377767n", "48815069625306356145460113214n", "2800168047740476387n", "27090046108651136752525050251n", "17050737426763583806790779471n", "1273566324033923836n", "49543917066569282928794484300n", "10290628042158833070532221066n", "3469066870558011680n", "42005113796531220880503084548n", "60064195130891515794312310901n", "3245851193684195107n", "37533982385009798315342336648n", "10267823027838019609009260399n", "2025345482262498605n", "34864622598934340124988581388n", "48347073555555495737374318810n", "2673244105079290838n", "75957016907360510463610401727n", "23977086141109407077488719105n", "732491745580907274n", "64604276948999648627686221332n", "3868070793275280858296301394n", "1873653426250118454n", "15570553586934053483564418077n", "13639547122371116255200424101n", "3229806347752382046n", "69627176750917937037127756524n", "77527130421629244161614984692n", "2205592855904802747n", "42359401661274759693285654733n", "15319487818905735149374624862n", "3299209455827802664n", "913752139298990313523799637n", "70257873178701883303322833580n", "3363278906733915791n", "3719386124896722977369262005n", "53915264239484240561994801723n", "1014563467864375643n", "56643381820560944379080271087n", "5451127454093963182673395845n", "1647155594727927302n", "74031948470913728924354306654n", "67046184840603355661228918718n", "730434808359892479n", "58832815659134274668136294794n", "44220894708044864609266466973n", "428689828657455715n", "26619728344740812354339350673n", "55972705855091654840275771393n", "597472825198654088n", "1452568843776109298902292527n", "48082065429135088437634332196n", "1047157723497573338n", "28285154322504134404521941699n", "56070279326493931276099147353n", "1647252454052220783n", "65027676769817342180184568252n", "12685362344487350979600199772n", "1402500493179000567n", "12668630001282077875777731433n", "55553251572483079593258301341n", "2382205981458202111n", "50473524893888759380289559496n", "52220217290909756763540198313n", "2029638412495399688n", "7502774623130712545083224028n", "73425515727643581896824036686n", "2771702310825972693n", "4639820922586718498241340517n", "46582679696898380484679332702n", "2620580077787400940n", "51782105270520932573551959292n", "74517889523497564960562458357n", "79055126752843995n", "10925640711936519280913334701n", "11947058347966705959371810733n", "43716694970268491n", "35453676805113974113471109604n", "12015889727201641553493717139n", "3275286259969106630n", "70932279409438704808566723573n", "47041530965489511382629531879n", "1256401409005218192n", "46895749660336733332848035754n", "40261009687444665011442182710n", "1306436215925446460n", "3904962902077066763622365736n", "36103992387013546339910627073n", "1329335481346702678n", "57853677844329075763360620729n", "61001619991056325367390311148n", "1235032555631976826n", "58692146235938833274542664790n", "14589363842493324627243766856n", "578262325105051129n", "37980379958779218087580100271n", "57690546822788520479506631792n", "3164185857728705638n", "45598806448478931852264970697n", "29033375842093843451718686864n", "2812217528418815016n", "9663261157782365056384592697n", "44620211458433011608252253672n", "2505651240889113840n", "48502340833312690180905327065n", "9352266604910376416980234379n", "3341395763378874957n", "35507650777754495555508745994n", "64550352482963692428938364344n", "1749731610964724298n", "72801722493214401326730125326n", "55956888553336351398608259633n", "896001678647446033n", "30516385505393014949750902877n", "47315718952109319710441627150n", "1388483706936013349n", "32381991427814516368016795653n", "59696292811917044385937202833n", "618914335291991958n", "40375787626773409929606022175n", "64734613933900308276892757597n", "2556069305521992095n", "58654528682801174800851099376n", "11593522535604870003716248394n", "2125230714317219300n", "8061995955571015171488513388n", "47983447012081651413970228934n", "855542739847145422n", "59096469339608638609245068515n", "7673808125695463322887566290n", "1385253448294382073n", "25340909062918393540888464015n", "9795256553635962173776771050n", "3012016973098277348n", "33467611330524938973631050712n", "7543431037219165063475505539n", "448151223182465539n", "22750106248651778926545160954n", "25740569688692303261800730858n", "1075240126364963450n", "56338203997489686691769068850n", "62119360873725897456686490753n", "1222146081347045140n", "27338323756657113133884361560n", "21141429927442113006964516579n", "462132336382397961n", "4987343640321990641559943818n", "58829032105334349895296634715n", "3177465831253470688n", "69096263705896112247403554129n", "29492604434954899550510960365n", "304239915265350366n", "66375851691134826136210085333n", "44757375154942980538763091305n", "1112855489475878924n", "70069037784938962740775503666n", "12717652252841341839220495543n", "2918096944668928835n", "18321962109897171704378960368n", "61813672462196073792006627549n", "2734946711892636188n", "64219561440442257822526755189n", "8503031322535266331858567242n", "3223902208326320319n", "63116174136664698830215774786n", "2759322304337380924973025029n", "810068357014304774n", "15698684552711747426349376896n", "65762055793295617462571353752n", "518270689795187122n", "58150828468103287645001826637n", "77452960139151639571846482697n", "519559051146038460n", "72625801975239649642036163890n", "39078044248618521225250269350n", "2190524057325078928n", "27770888055874136986828633484n", "41773083279140557423975570256n", "2854828164966176931n", "627836434493841003902237785n", "77928664588771202997039373627n", "330865869276931200n", "52935592469577214913105764520n", "20197659873511917804524429378n", "2125370194946441846n", "3460074836406938711660958301n", "52820564261229479633548811299n", "2919129481241566745n", "6675772908450017734753351305n", "65258735248680451317985314824n", "2950671717077079181n", "6822322071311459654365919975n", "48497518547901827883287152419n", "3243229764836791767n", "72937532385990220357716354648n", "19074513737405788027838151006n", "1297437039234841476n", "75502921753638151385835217223n", "15306268504859852745422227938n", "3143438951510181753n", "3947335170074803838440311819n", "62699530989773040321915910090n", "3215975868729087991n", "45236352461588188769215285451n", "41706782526887442329166221445n", "3168773580470738009n", "75285535419605148224367004655n", "20481966054007305592119557920n", "1679995277184070400n", "45190873120635261257451746066n", "47696678647110719375889237738n", "2068610507691385147n", "9915927934978371252308896949n", "31159305954355174048281405375n", "1704598723840881213n", "67338469563962359211325034773n", "41738724864530875640824663606n", "2293929193371443079n", "34807312716413150046069343319n", "70801066094208025212394559646n", "2518515824100660756n", "76811947889156401932764711781n", "43817729339652461426643528955n", "2039489180470709457n", "38477432026452102589204844897n", "27527167249603525516926315406n", "1191468099071291308n", "38041851156661687253492123536n", "54288163040365572080441140556n", "911480122138689106n", "4974069079367885339264267782n", "28880616750574662115261710630n", "2834730446537796035n", "55466841778289154595312506036n", "47524577058256910308968549882n", "351449977223840700n", "62311990134227217524354071274n", "75586193885025429015569590193n", "545412183548073756n", "79201290258654825630711427638n", "77524373992410852423354047680n", "552010389188782621n", "13584773290145166716045719634n", "57089761411485171751249424952n", "1694608384682621747n", "29538886750825184946212760314n", "63894150012954354476012028271n", "381542434687157486n", "18078760560177937565267140464n", "74003801426748288272147648907n", "42337564080893923n", "76689566315090503029029632865n", "77474971819185712518886624915n", "372114354534855369n", "3011898200892081576513307862n", "13966070005688554503624007786n", "470413759528293312n", "39357561183949775040925825237n", "70682164693568724918268906963n", "1376182782398783885n", "41538213381429219620578361408n", "42254768852299863792709628627n", "3431309948863311296n", "29234390314689913487082552719n", "17916853178952663417328241903n", "669291203853282419n", "33249562629014821971547667642n", "26222791431277453980835687680n", "98534970627714358n", "25021648199838864664290068537n", "20665859250814395210947344246n", "662389299694120248n", "72307113898419621240789872204n", "46323053668872253004980165076n", "1041999687571616075n", "8985042666921921648283132643n", "74513886773734802806022422301n", "2603455779145809119n", "15411135359682619522278947280n", "27784420314858949438220006926n", "450671277926568052n", "2831173742809690598851605179n", "28386483802658122108161613621n", "1424370976519373932n", "31198231619878444700423211860n", "42295311569311653123964908500n", "2935759999014605210n", "32001363507887263736668102660n", "46912833713119636774180995741n", "2092237369418424823n", "78656477190391127646333527543n", "41056006364555863740114989146n", "2171263570612200061n", "21422129487009930658303224502n", "46206308103083011878154386775n", "1874554378158482533n", "36641496950703925635911572554n", "48432166499307362117455688176n", "362387825758837904n", "27092632894596570716463916204n", "20108561967338242154648349930n", "1880193076762165445n", "9593372273263129574197363679n", "48018078028931030587694756618n", "542974594247287387n", "14814551631877080383283532261n", "33496168748765220079451008919n", "2250598863496646490n", "44869586855816636221572912809n", "41783360501362407212785286614n", "2362538758680925884n", "47048981182078605465642165702n", "60518795030556750835816928982n", "505511636936241905n", "58024262056741504028876642662n", "50138980925793649225004896980n", "2579777888438614723n", "6523114729709277602770738046n", "28358393151053570058817793343n", "3081381986289034984n", "15900191280315068679181663660n", "48577168032374944428952731072n", "830974214184407623n", "10274561196236136318135959057n", "26148664358554534185218032007n", "201377610767670386n", "11368406426935765376362633788n", "4122436782704069458424072833n", "2934079973878820714n", "66892750247258968804173976659n", "76380379537218876441475920731n", "3380019238411335234n", "50717224916942478279258173891n", "44470393688322556765105136550n", "1813355330674964836n", "8515532742277261388949469229n", "33221912074775270762895168327n", "2646766706385940242n", "11140136119772415355412357379n", "44150773111766484868566388647n", "3191354614138223649n", "30708778779429297397760149496n", "67837687252340085721524474101n", "3301367800510383551n", "10954599956402707572521260184n", "21030000566064580489911242942n", "1828905939385555740n", "26254579696623038244113820321n", "76089322519690535032690356215n", "868757520992376209n", "77540171332511416804096348278n", "10474304059709005130776549459n", "1665346113039180866n", "77071906535707552468440337167n", "76416817616469856915552001970n", "2619908781683664602n", "40713576015254467501617369989n", "69174809057973808586596761660n", "364462143474967775n", "3388865641890523266901884229n", "46510386965164679950611269041n", "2868959718371388528n", "38291153048032659818161082470n", "57992998428591158266306092260n", "2140250223970187383n", "74674643030181299821451279762n", "61603307939095484817637012597n", "1805808601029218696n", "37221838450591689221386319329n", "68301391492878568825616976727n", "2237000809794684762n", "11407285364976644693945059208n", "25348058182926100240298110509n", "3114508241594272017n", "75356748694855659604450932050n", "73487079967561788811810515931n", "1490776583857675442n", "54218989991798315687885361450n", "20703329376060767478344708910n", "2199487792587152210n", "75111061944546058209924381826n", "59244444067541601191271416829n", "1581429188013860604n", "52660822561915117683975147831n", "47783082248718407900747485302n", "1369252091872015433n", "36417458042350421490821725117n", "31829247002542379610343848353n", "455784377300586483n", "16833465703461845689857266397n", "71194569481351283884295739145n", "3189866189053900612n", "65858387085894768841721032786n", "42191857983305827191840357582n", "666015291493419098n", "27916318777227697186981470587n", "32438460617546390776125662122n", "3438854808891043135n", "41197663088738641800559183911n", "55140791537758229983041465056n", "1162917064515090408n", "59276808448795540978821008029n", "55346073844723874343240998585n", "2138546228419844587n", "29861692804477614266603259375n", "46434932953097909216915612814n", "2786750119186865986n", "2914382294411148824195592597n", "47257202751523172671381039762n", "108099711483611500n", "42513194204119630092428609239n", "7009779828784113435151735800n", "1568976973765903017n", "74506942497632859791810397801n", "75159716442684547730197176733n", "214522106108977303n", "307807623661151452830127704n", "69355418870826927485148435899n", "1716229337114513433n", "57800790680731912804700220994n", "33865695886637783077735975519n", "1521543041885052952n", "61900084065708307372472439490n", "9670136848396954396035168772n", "705486756697563485n", "65695693080875904861430309269n", "42258749277647240519914054375n", "1610937183743514752n", "45949364456230722028956610312n", "71318597512050155765983898976n", "1419180020927833749n", "16722582418318977044812304850n", "64520646005354913944304541442n", "1349757657977694032n", "23453477023590312415905476662n", "20988708348761074914346191082n", "2734679321361253617n", "3531335181910221180679210683n", "77069908679139173478778593856n", "3209489805214655859n", "15423046625290420432194363954n", "66544315732344216335597482829n", "3417056483929987132n", "23412416307661786237706973063n", "52684903097691240819445939916n", "3087013127443362602n", "59516131369415164617233433764n", "22552284363447521404574779744n", "440598570727652332n", "10078101871820643773664346515n", "53180025648864462561753056892n", "1238481677425258091n", "66978851386839209947975732205n", "76469976691658858609518100317n", "2669015410315668427n", "10462115063986428235746660388n", "20612418707380044137824607138n", "913149152876393845n", "12896643578852573199148249630n", "65916513826164228515537693476n", "1689818392090951394n", "48812924094784749209418690439n", "21075229147504768099245857693n", "2023634641390620097n", "46841988916092209879920999223n", "16626325630569367486087793088n", "2520424161966279659n", "66590657955425334169984583445n", "43137455439307899619378709852n", "119691013666955759n", "59528138117541221723219264069n", "6039238025418276887251147184n", "1423016249189720303n", "74476981597135756778074726485n", "57871369440317946035711890073n", "1799738956519083373n", "61169922085945703273845146359n", "58536191609701145724674103544n", "678581665969651580n", "29756753901276156089801861773n", "37715386191992628222582900313n", "1839293100231634062n", "8545730587160341404066690935n", "73310320371102040457790413928n", "2943087579162219865n", "3592679410576312851945554995n", "63768122222562308688415150519n", "2852416365710961566n", "65734466853903663026216615808n", "75611388663630224651662180524n", "3082245111526479768n", "42542028447397082553823280434n", "15266201170439359558184400250n", "2959319188559780389n", "62084872176674708014188872797n", "49471685826369556510350964812n", "3044342635568692521n", "52766810402300947123818998320n", "57464266928926410524441305379n", "2678492530248725715n", "63759940946573266111589745544n", "1239422070074535035165804970n", "3011362073292317527n", "5312425357216197805891517417n", "8604490350019536611169668726n", "1278264119461231226n", "23413740732153092734953046582n", "2351234330786062681522357509n", "3063446156461791539n", "31192263866697541487222909336n", "53213425910476786883061415945n", "3388535254355309510n", "76222049202953784940228041093n", "8232814450668299001215927167n", "1010418058221874517n", "30375045069912390061370886372n", "76858962311200653420966476141n", "2531834595530804919n", "72838406196796824316965387556n", "16107338032535514271932130242n", "826038058455425888n", "74047817357615679402104886971n", "66250974048331219261305648117n", "515372630941459652n", "49140383045734318581810247391n", "38552127106329617678305826510n", "1791730195926210707n", "20447547859709794457924179129n", "52480964595913357482998508931n", "419726983098458687n", "20434453705733747059793719688n", "22732218969594988459804019164n", "721740589738128975n", "63178390467425871623450374916n", "58781628951232066578669558088n", "1366096141210552719n", "30310055907701667442250131224n", "77693499391068805405178198648n", "2419127900721456602n", "72238281634987295743046110639n", "2759706666093555363424148875n", "2871042634310332424n", "58186331935313172107712023092n", "73009408672165436946758189888n", "1138172672402058824n", "45794206921224716587506811973n", "50074044364882080121299615241n", "201200847748951804n", "41753381957343686084038148154n", "16651255916405576823960096368n", "744771251876887027n", "6397253273640502791149864078n", "67730045189242272443620838555n", "2723512022810421168n", "20403399159094844095476748628n", "46114852246774129546878110205n", "2163837250026966482n", "63507059223060953171650485733n", "27872394523028449929373211791n", "1266384674015277092n", "31341532803878701385180273244n", "56274201404580685976997533743n", "431470279371342601n", "27146401285505116697408502780n", "10909809704395711896795601995n", "823727347575104764n", "78157451508256479551851793287n", "7934224114897115965586132150n", "2561622534344592225n", "52031374290403822978799313483n", "75680335637831520600351100052n", "2240257882085839580n", "35818819658139744996071875447n", "62532608351434239965548606901n", "2997209098633992908n", "35801460645260708494826382933n", "6962199370752725968726753829n", "471191881884558376n", "51494347593311565178389849721n", "27959136057874496572927068138n", "2054885609386822401n", "1903400454085938493722464234n", "58252527737465224754126905441n", "871049256780466220n", "62266126172301828292957015888n", "29942402306346798464030870789n", "2439682690873113741n", "58828716449315637847726991566n", "33586884830050665361484057496n", "1850240284198082738n", "57256720773892932068692318575n", "43906884659388043006991040937n", "2567264210368699586n", "37303325532466691611774319975n", "1023775330119159065320215646n", "2970467943548704391n", "6719369853840095911284134964n", "52698184868933442534169228704n", "1590449702912303791n", "9163234315649800019839577781n", "5096786077915756093838027866n", "2604014912333559946n", "22626562141910724736547894073n", "1221514787490597839172086118n", "2021859363658276538n", "29343228808229785648243946635n", "17107161597392558070179986947n", "2142074198041769333n", "8295437982000203433981112803n", "32281278698888589789154221048n", "2261976931796110908n", "19003064635652370381400548000n", "5388386401569756312458644562n", "3154333183807592746n", "57635002029571841636737463711n", "56991897992879623406006006725n", "2842694143682003853n", "73379904593405458046663259580n", "839437272553377608023038726n", "3093165198442302924n", "33419448607193509624332386145n", "16740311080067952025303937955n", "666860562806181637n", "8797571923563716660075774195n", "75022438860744435659585766685n", "1558560135470851650n", "19713896344694960627284542368n", "78388507052884523368130573724n", "411547793569600371n", "52610184319591489722152436723n", "58886726417514761894083084350n", "779286101129650524n", "30697463792187334469128124748n", "76836636996796091386778801556n", "868461342532092659n", "69910862714025895807766899173n", "51405542117679167872600082463n", "349470313771420560n", "71284241241602654693194940143n", "7305568034139166589777830792n", "2498747200591008033n", "67960797371315801691053786599n", "25825479627169106615506743060n", "454178144016317938n", "35798135180239958015829265626n", "23385623537498663178814541991n", "1668508428339305051n", "15450665342638866022354076708n", "1590106122468359708599592949n", "209939085635224246n", "45146454297276439294547281947n", "71363197518122470395685282523n", "209021609080779353n", "37805135405124328919729060254n", "46916624974206570529290830921n", "848835529094356500n", "52127928532313726409293511873n", "74341195298303002847160668677n", "2836594795507658600n", "21372610848069974970714546381n", "47095482837411596424060733004n", "2644188767312235257n", "42696308717032907609441318200n", "71478263091865254540527492446n", "580612364877252066n", "24227503011457277739411398472n", "46210588161299166961443583909n", "2104513243231016467n", "38286987706753654842254500763n", "52819390378718994903041839288n", "2559971158277261662n", "10804049422689166087510960068n", "78494177681671393465658693075n", "14482037543685577n", "45316386224024264714051962520n", "8077236619578691823690243326n", "3134255926280338435n", "58234835865881258067775424985n", "32582539715376623121568222400n", "895535831771370236n", "70554522419104669983576590653n", "40229753450332894247180991320n", "3235640053820685715n", "20050852574591066448348962700n", "63154847355271958325521981335n", "467978477141038832n", "23115494614834363321936638302n", "54275477858894789534235120579n", "1729059077109549892n", "2643222253937861530223901503n", "4343013099917093534712467976n", "2093250350291324334n", "26606380640809280595919467519n", "24158225122809122341718478436n", "384623299034698779n", "74889164947469453919523854509n", "57684567535195905731154589750n", "1155881533367487150n", "40449699793338258794390721810n", "45563605053974069206983967932n", "1493349482130193926n", "53198779688378832727006250273n", "23250105681044235044335219173n", "1649629209531042678n", "31842301972458791163037611310n", "54103172956148923849538705604n", "1853082006782289707n", "73283134292642541157328722326n", "60011977393637178105550407258n", "2931499730502310317n", "30363774768400601902892824896n", "69784527858977659878014965306n", "2699700013359551525n", "30143876784681103984444940141n", "20508010382725323248422071352n", "1472036335205806581n", "72685268086241841913630448820n", "13484287640917155024759235656n", "421919482836501604n", "58336665028159633068676496150n", "37899530871095451514688032059n", "830925861824953119n", "25034909887778048695729760495n", "6186382813048747659882138994n", "928295656744287075n", "23742999482526473077193706109n", "38681524762823880972818454723n", "1037267958137901699n", "75848820697595803231237834330n", "4098133930661194465828731453n", "2484592940588499869n", "45229057029317220478111498771n", "55686910073377115986537207556n", "2974592459022975650n", "9058824958434584730691471305n", "3489502058924586487278999515n", "1985538445731248079n", "14034347138268021040571737620n", "22094509985004128313979725457n", "1321434542301391881n", "17216019289274156022312124782n", "65908201923726532456265422977n", "387610774042169114n", "29699496552150641100894659868n", "43552700176683532671663646633n", "305525895851406027n", "62068283835877161864738460092n", "66163022436031594737849199513n", "1671489056967612477n", "5806077789744302022830084009n", "22126371298319875265318066168n", "2973075530852635513n", "43508686549770752780288409207n", "39960107195405145189624452517n", "3021227579398645734n", "75958919635020929694389722957n", "14913897636015670404185010029n", "2882183092458315590n", "24239404766805006701421172975n", "69450551382041986033230454197n", "629979785699424851n", "47715312965767193925496266564n", "51328287208106789864582031889n", "1994694450268216917n", "12878968128402785600925987432n", "8892728961399753099629106451n", "2189564568474803348n", "17841277261874434955985363634n", "23255802008382153152915838079n", "1299631183736247307n", "70369295004394220674262548695n", "41703500013750845131767430551n", "2515279718642012557n", "29363803518729226252949864837n", "11941978972714945652777612780n", "1864444849178365249n", "19838910496936353855554382505n", "63526654617675483693289584781n", "1386561621225388054n", "37964054821976413036136417123n", "14531042297004730862055294756n", "1592174811323575228n", "17025415710900400219439375060n", "362574756192905655380951625n", "186982663000383695n", "75302946272320992428390907104n", "76356571252613340602107695667n", "1005406788214614232n", "58429545482092547095478867066n", "8783598735519438107774246954n", "3449009450489856852n", "52421244757199560525245430831n", "36745113142356116864221402917n", "2011028989323540641n", "52389389340233786555192956059n", "48540948198567585375080843793n", "2511738896308209966n", "62948973448903767233283645427n", "78581731009485419534613750974n", "2631249803991736511n", "15700178914629731044995270252n", "21825209006850516132399941848n", "469426094359884098n", "45109950384963150442992909517n", "34709270486045260410251674804n", "3227700636384978310n", "59508455528169337110518969046n", "7626842288771897454076798332n", "2837142952242233831n", "78154898100541067453790359715n", "28712940925290532622010374032n", "2005548120880216529n", "19676819626842762742496321363n", "21494888704510312646126358022n", "1917432403713999314n", "35348767509581898437000853095n", "54404372638473474714277538548n", "1418295384476104455n", "2087534038039694873601959364n", "55492416744530703076122435501n", "3415979290873032604n", "77874081666239317555289078970n", "64693269821438151662321973074n", "468500022203866114n", "52183552801284363909457374676n", "26386627404911694711966206173n", "849932193222808822n", "60880246718709527470179169635n", "73275749658065911543659109078n", "2835936826164075331n", "47034978948350796174151388655n", "71774550150782116132727222082n", "2957236831646338670n", "63121833886036603562738575495n", "23473953357667857038757232396n", "709268300106945760n", "67565011137450891785645904255n", "24476510070022540670394808047n", "2197500443692989620n", "59529365216756814354926446285n", "62380286296544401614193824725n", "1797665767653557658n", "65352576236492901270647039868n", "54007112892683927216806385747n", "1796075374294915397n", "17840563634584466359434584144n", "46203718678613515530978507404n", "702053810505193011n", "6133701316708198581434709723n", "61802938904865726983656435299n", "3001276128418418514n", "11649452974115692944272358953n", "18473964874994391830987882986n", "2086271034138195481n", "27934361651981769617523547350n", "75412934231387879572695859186n", "461672875728163553n", "2659961698397651286244898268n", "38244585026297070186059616261n", "3371488902807027695n", "16205200667874612181106188684n", "6520317333544879950114099734n", "2490923463723046056n", "66034343348095027053141749239n", "13522171761978136875076440765n", "211626548808403729n", "52060409492746050106971031742n", "3493375676170587510122635686n", "3394236868158496257n", "47140116537527183288446191137n", "26402419994251877186703235784n", "2932509761218506683n", "41718577718458247425998327137n", "72444125720253366875907105723n", "2370720516004120360n", "63763546849180341189837833587n", "56383249669741657007269755446n", "2772609748811855948n", "30673155381064993958540435457n", "58923421149810821122915571284n", "2826147464537959677n", "2437524155719427333248486827n", "13523745438577697843652059309n", "2255306498837633258n", "66617913651732723895666550762n", "800383901932656375981050324n", "2369057816442019000n", "53894023794388536556779913700n", "43633381247568199322500578225n", "1622058361920748072n", "31610597297695602711187104065n", "75047413064993937787913175675n", "2532518357458277794n", "66943196821272189971919216455n", "63057632269388325855862697967n", "252919094746701796n", "36093617934864267028615495215n", "2458297172936844284200172721n", "2861973034148611365n", "35639326827089764975324431609n", "42790455257345625520833632516n", "2416491183110698117n", "25453911219236829571892475695n", "7792114184406477060828720050n", "3256395018257219594n", "44446878573785568457717214835n", "31316823799089969829944488381n", "3348254446631709920n", "12075675278480009463346998871n", "33336621394122897171138216323n", "1761645290764169692n", "38936491179522097211601163974n", "40756936871275705147530952481n", "2239620312855528769n", "66166234417862875439766591001n", "45961753617942718644070346235n", "2545432639028408432n", "27071931775260190706961952445n", "16791652622063002274074642172n", "1351810600008793720n", "8734604468994364132650578395n", "2915643774972349972943503710n", "546123555763251031n", "40883390215425903758829895197n", "46075188532687982090196339471n", "2037883374560027081n", "1788529744899075811496881871n", "22977601030754581206369105722n", "2052641684479223112n", "52403270166627919005596848880n", "2330881363722503207702297453n", "1950506519094245230n", "26974012086112717010353138814n", "69257122863702421096680142186n", "731421312124744837n", "31069884618093040515903738825n", "64922032296511662760139295040n", "2654253976131730717n", "12166944124292618925625599356n", "59407826445782768214824917874n", "354147487414166550n", "74336686733791433900827528675n", "12704634481538804742936579229n", "2082676564717138885n", "190n", "58146038485323707171566360552n", "79083051845830931429793398812n", "1253760413372422709n", "75585805608841426332286895315n", "17454071065969374047751520578n", "1856801283221000835n", "56347371123082155623989904211n", "52625756897582785946932954415n", "1103484556810393055n", "27404185422829405492475499818n", "1419552461670775323662566720n", "3431535685290297040n", "10240761959601706862708901917n", "71665724585200281475617327049n", "3232798557396947874n", "32919536142170844080265894843n", "27634787910238436631971547080n", "689759514785002741n", "15431349741815244232301206308n", "53845586976664022319541168221n", "1583044030122302208n", "47825067986735618489429772434n", "36933954632637013701382915058n", "2061889715878943774n", "8977310916259261225384223331n", "4538091340276567216050541897n", "2974949937804520552n", "32068898197860866225864499204n", "11944297794698583544272156441n", "1942470514051769102n", "16232887649510996786606289763n", "15259493580801814760566477085n", "522617557584553779n", "24242596953798418019519661501n", "34675681500323328218631423377n", "2626688210475495912n", "78740174483351451096333088791n", "64943981386376195937910130384n", "3002553261633376435n", "71321212497283823630152857278n", "57107096638064759035770959417n", "1525415424337039994n", "33592124231316161392746859369n", "66360389043497290172485164153n", "169262401730913852n", "67472003684398719335655699957n", "16789521379035350190464748508n", "2131762421966585515n", "66631783199370161347508379926n", "48925352076915955304942304087n", "264237490291976243n", "24342296347779296789258245457n", "43293722801550027940585947288n", "2184523999681911728n", "9355802069694208050316076397n", "35552089219631962733889470030n", "3012875015446218241n", "19749370490527515528697426175n", "8078386931861545908004277048n", "484548262348581637n", "9197680845227051035593920301n", "76678845496561933550816162785n", "1006587369936993775n", "16264558547638181301681301031n", "77659436542602450682090346042n", "2549030864566782064n", "23992787444587661702047865121n", "15283574111017964877795482274n", "1010500590098381861n", "36081283464794391834173091918n", "74713339703559068643167768213n", "87864425149724657n", "15509755852767806607741504203n", "49741860533707809781906740346n", "2053665582944552662n", "21800540003051693165872352300n", "55295746887291089518396498874n", "2979094345114374943n", "11846584694067264521987247663n", "49031890130314527277927146925n", "3053072831928300240n", "49870471347364999860446391462n", "60351156120295649092916522340n", "57434309920295622n", "51905526990545292008889846168n", "35741421582248014414699395252n", "1021827240168947429n", "16350288651927207676427341432n", "48548588913627635520822500823n", "2556960523655499318n", "39061623507343320271115115845n", "38947970321306063422821592330n", "2525216560431056230n", "65177147304893778229440396619n", "70545257645069117487807391489n", "1600567512488781231n", "33331224951106722420313772928n", "38583179480229318101782748287n", "1817415503412264076n", "43931562095456763346512920739n", "45993143967557989986350621262n", "1013785943641285390n", "46300841465540867353476664678n", "67952189225824325494911009881n", "1883806626142505323n", "74763953209711116608083413573n", "73395076121267231351266442748n", "875683814313975814n", "23960570645093608799064342076n", "36737884069061207609010160029n", "2740282725978910539n", "2348460868169339519816282219n", "59294276502368234372728690209n", "2234404830781012457n", "29326696920519891523554164108n", "46303855242526653100651128095n", "1172546639486712237n", "7729537530476375227332351839n", "8564566731713324385055420531n", "1479853701561506444n", "22273291075577128615277532352n", "73656828782504352218789556241n", "2308987335794616316n", "14359470620000928077518163171n", "71961130737820208932903249274n", "950707570385670728n", "70317507071845790171587549310n", "45654920344570326674633769038n", "2650168593880186613n", "45738429799101288017972815601n", "43778890431815013310034329810n", "312650173805915283n", "59759032808483205201660512612n", "49166445941564648520976910103n", "575816160851551719n", "41099033744600704768583815842n", "67643677451426846496806534446n", "2744110069990264553n", "5427077521225540080527062818n", "27591683040195514365023584328n", "1814257385547611969n", "43890769480671665778349573612n", "25702107374475025393868297533n", "2665391419850264467n", "49173530067968024446609831742n", "69233652337477869916623889471n", "2973651385942905178n", "39451576607205851507235401000n", "65326357252788810888449550413n", "2328241568819620138n", "7187030532193362998811241838n", "11158043907775193412625503465n", "1887168135327759363n", "72093988836508782933530929396n", "59408618785876068844273516201n", "1998979553140732738n", "20436888483045692091969328934n", "37236965238760796085670708990n", "2982240668332065019n", "45766566944201297703965941735n", "33134417182815170607111134530n", "2256938019969749699n", "61095014957849456939456497149n", "5166234805292214141604288719n", "2223380807107784804n", "4407612794594263685713471991n", "27938927008707740784778705409n", "889822472376617854n", "10586000171735376465147370484n", "11688046614136879282493614768n", "1673899149118569188n", "48568524626716983467820586640n", "54066530547892129113282820943n", "1257544179877250249n", "70430239680893778037863498084n", "67050853132645903854946409019n", "2548118935751794404n", "41828468840963319821789084190n", "14275492751268414444663806553n", "1784444490366165065n", "61852018693496828660952117185n", "48406002847831614907905133809n", "49483591444929780n", "54427537761720246076956183538n", "41736602958902949490055768838n", "1954646608479060360n", "60934769075649772007484314209n", "4723248530441409773201893998n", "3259834508477438622n", "16778379388406768302608844589n", "14091941761246911672273283575n", "1362843677097285540n", "20990186444040307549583297890n", "39850655248017325132808795637n", "3159948251218994501n", "22841250904644903266547583091n", "35884470460139378173998471965n", "144997960402386643n", "73988342422211773824311060048n", "25430193174058044426248161017n", "1511499341976026028n", "41856665278828717622897473021n", "52430814625940772563313528979n", "1518969462082050494n", "42785280606159799076021378453n", "75641406683588400312731571380n", "354558010400584999n", "25777665187274443426345962355n", "52569759362487685340322204483n", "2660707269990640271n", "39456006642189286944561721406n", "64095592448568371575360918624n", "1623622008203944130n", "42823981658558488340963830755n", "70857240021552825619139550212n", "3338694247115466605n", "33528981497758066103123618956n", "52174717566293432033940167575n", "3285250213548536505n", "49559726527714678923168862226n", "35376383273863973001561075247n", "1762388272055172875n", "4963094059256542135804830802n", "15251461935798611072932258838n", "3043255521973128258n", "23415022784844915519999589288n", "59120161904093027011464662035n", "2353807276882257604n", "35355887041205290611693611623n", "31669150297307261835976265040n", "872891098273185795n", "69193046798683036289275806803n", "42818302823254546309613088130n", "3225904969635087159n", "22611614040816481524272701347n", "40802292074751246948780577207n", "351005661799852441n", "50079803252014276007292589026n", "37577116329374038939872244704n", "745466466224739689n", "57943789902740370489195854856n", "59877164372411435705733535421n", "1440407261307873910n", "74147961838302268113193936081n", "29475004529393168298384526566n", "780455262674149785n", "51306862863296749150663360555n", "68603117787295236727112632820n", "2702997921905430000n", "64092864258708121960742058121n", "27968741860257802705491575837n", "3395033579182877453n", "60896409955387219924723371046n", "72447564289478669262616529078n", "3397060291617780594n", "74466337456436624238136742413n", "67930138912822600973471222439n", "631712168137915134n", "34699941264140402915854806555n", "31625108777123266428395503959n", "662594291726250121n", "10374418997762067141299032182n", "74831531166323756923345310781n", "2614948808475244069n", "45617012767756761370444767987n", "44141298692376594039790971629n", "1159181502462992545n", "47704071339495071156056567054n", "46834594498992945383289148503n", "924797511068572088n", "23233351571238696045632767797n", "14376771187481317319928510593n", "3161389881302592208n", "68221328884209068946490350230n", "69520921081111912732122080295n", "540294970059028553n", "49382519270729084009739959234n", "54272649767268320797552878520n", "1762246401423958252n", "65695480183764337135892820912n", "15357314953562507969519535878n", "2415017092301124519n", "12568989548408666155318764896n", "10255298595269749256814759758n", "488040996573952383n", "61804111086379855885098583520n", "11271058357408383599116781502n", "1329740533130250248n", "8039933903881517002403963857n", "7118558163468937314455208936n", "536489202082349116n", "57213159007120933607123362054n", "38389263848304750695624289842n", "103890218507147410n", "44837586220950001446991442272n", "51003826059731215073098356499n", "1055564410899460745n", "36382905285088913012495727205n", "23789430840439822229827015138n", "2409250954595470494n", "77553161939176686247041732803n", "32075777538535189410338696221n", "308581509063990399n", "75123827789249657112621112140n", "63466606458376146979489895003n", "1559915864837385203n", "65374245818638483805981829412n", "59413598642796928072211645702n", "773792966334851501n", "10975404188605698335218119359n", "5937731821461360820250261750n", "2424406683527655198n", "58048034440511231692734658223n", "38541497666142538814655959889n", "97237747168756283n", "32114431512100683707696744321n", "43084884381938054868610618438n", "53036606161489394n", "49303822531142933183499847955n", "70757204501375068333736255366n", "1090664900942087596n", "68973060792876598659428050587n", "21709941437174734607102143168n", "54515769952578230n", "40278884731265681742344272236n", "34941403842240889411044059527n", "1414736029232632973n", "60344648712825684665541778621n", "10769790997010708809402622618n", "2270992661657155596n", "42362387786284445354439187653n", "58156800386628045782945926146n", "2818686942230697090n", "31419723024915919870538049034n", "18005463704599391839628874083n", "212688156617827815n", "35911328625822934725057123638n", "17761454535191485025880626131n", "1761977155017563514n", "49665582664754517847870128980n", "39319816430240621753318268462n", "1491136817343252047n", "22260823695114013941955374538n", "17055513051235397699203988336n", "1922191265581876891n", "14555432039935861975982534425n", "48152237244885228239450679938n", "621157026389301132n", "23051036183574002962556684690n", "15971796984547909136099208821n", "2205567601778656458n", "26382181900386119773631359523n", "77486525780604152291567730894n", "3344785235831598130n", "40994902602684141065596542528n", "58124151025072872977666932193n", "1866769646811958428n", "13188769330477055787925877048n", "72682189451050217677569494954n", "1454880931779552660n", "33634144479293043106522767128n", "63196693658172041397923530081n", "1719120090000942363n", "11106335219605429034116541445n", "59150880447111322507257453443n", "1982729467772378638n", "24990080775267144618286017329n", "4933890943319210884773036028n", "3238771988114708503n", "72949239866424524529472552202n", "28511064168198009294661488723n", "2962023653742267897n", "58656766073983020247853921869n", "47635718491612423608063190516n", "3000234376036375986n", "24238047790212470654844439662n", "23154937283069080880032452049n", "2013625456869347404n", "14825246893209210042587190789n", "52825936212514509264761514892n", "993721473581556871n", "8713904335226753185274037022n", "58909703948513917292703719505n", "3356613834808478835n", "47783414808532480730935012208n", "71833517958023857391706253943n", "2135080825574499771n", "884520208662549368825880483n", "66815068005909338250309574561n", "140309291176602342n", "5569450875351413209302619112n", "29224003387999671040246207661n", "1610924941533931901n", "51360380732923628237942915208n", "49075415090226283505119870909n", "824496444682252362n", "26136012194887577513976704588n", "25203540858598899941257080851n", "1411280372175925570n", "68280069972262928193338796048n", "26491256896653383849815404924n", "2469762357772618827n", "73734748267187905353062326737n", "68913774706780990255684794379n", "53485910764302128n", "77777156063573625138168997381n", "64557037666602761347172706735n", "1996255398685960466n", "28464530722569754157139260154n", "22979110781613272893921919353n", "1105566566131594780n", "28039439084355019144555806027n", "16299329550217317018880117262n", "2401400792301565600n", "62631950163514864539620020206n", "64031511810008173001111779669n", "135723323566704095n", "56130238209974371238192421387n", "71300385211683773671558874832n", "2820109121346955706n", "1266050722527037359608467989n", "23369565459382988863634254407n", "2609151292716742371n", "46069724971530567254818701644n", "50647992693491661816900039583n", "3003365004111477246n", "14833086786816707962865094508n", "37929390713358467376261350799n", "3113860565507891619n", "14007914765299785142256461365n", "75894388353326085571138234483n", "1683683923201420873n", "63454168155478046454844432701n", "13184396719317261321865011420n", "3455798177318665792n", "15242605704632094686138955952n", "19838168147461161870148387345n", "2010616752800746021n", "30692509923364661764582557691n", "62096107423559910046379351905n", "1346903255621101256n", "34464243166874822079393179146n", "63846438778551544175642767034n", "1138380012879476837n", "74737710169640323515477410562n", "6284356348145608854716748036n", "180980529294338977n", "38461808257846861933076217288n", "75020453906990644280477544720n", "307346157687553567n", "42941917981619284749284256464n", "29124361387770891246090195521n", "2258523094183111792n", "31043177647483836512207577733n", "76846872956655992019312504229n", "2737531135418987922n", "436136989124112448213257527n", "37270775937015261263489085940n", "1691548620283188254n", "34350139485051631072038425243n", "47842925193965716748069619330n", "3012190802049531932n", "8161319477063961893865419497n", "39887640444908598647019011892n", "326805514938122984n", "45251026371225474798165551670n", "78712165100775809310221458014n", "1747908356221952635n", "74097152003535814545675921337n", "48494072556502793463457269862n", "538895690676303310n", "54295451611850750079844956272n", "26534574033318342223582372449n", "3044215930961181551n", "75837108057982626126393125222n", "52432746192616266658163099498n", "3397076867009838686n", "54465116802539051194037403225n", "19480966575390018045669641671n", "1874912131754984363n", "62538117008905102096704754568n", "49778263788224308775212049920n", "635641138655366122n", "1000125186700770733728208856n", "72272342271481440271970417215n", "126669907718514487n", "32850606983744341262159941170n", "34502523802539415215826357899n", "335651800228572498n", "74891229697299665485048117886n", "7923057032410301273894282773n", "2078488636177744832n", "65834931437626611160851671144n", "47253521926346692275217471181n", "1450467026022714805n", "79218551078854046456367160410n", "70762120870550042138883949317n", "2886881633871743501n", "34749927009400659485527823456n", "74230186035227802214714540722n", "91514308691397285n", "23895248556901354081433241434n", "16615401776547671346915841714n", "3136707560354543978n", "21834987311199156124647763244n", "70345068331037455105782146634n", "3216348569578182800n", "14552026033494402774981149080n", "46810169065384954077118190274n", "1911480149318741295n", "30149592931357591699950156644n", "14166482924045038689605819053n", "2327000634007357378n", "38247650175016523126038806200n", "57691234003597921786155373117n", "859973345968241198n", "71714837789763600565992214961n", "73412375228179646879012079459n", "1974246974270865632n", "52446930245349056255719340345n", "970285520444299081223312008n", "1628797543941019300n", "50919498183802806944452291286n", "37490783833480294299979274400n", "2991807516764641990n", "32377691154331801475818794360n", "39750977600721907402675106371n", "2263832844069227231n", "17627606237803241511589218465n", "3828538907962341287451709925n", "1651077712155795619n", "65746494371320988039239195368n", "40429923959132850189737190904n", "1761591307449813117n", "62030904653045818611809336637n", "31416196507873606617755041492n", "1626933121429044990n", "56278396859095728868031718464n", "40673401721781629455927974763n", "816921835574909421n", "41466998290124345097221160853n", "77602619970761915549134486486n", "2270380655319303423n", "37278580144182814004827303266n", "22631466550317400025567159166n", "1256554869446519681n", "44512857141401466618198683938n", "75645231533450873900978589761n", "2839895442152180859n", "31711543132209616307103122831n", "78955556053482715721582593706n", "626995298916699271n", "50496746606014163961365206592n", "62746915431247250243776212132n", "2682171950447987392n", "8649064541355918845604157106n", "3642459701627177804195047993n", "304942239933523054n", "52349349447437650280979204973n", "38235331305898406894352347179n", "574973155769907953n", "35486247734767358887659775332n", "63676560163395574209410974039n", "1346859065344137509n", "42626666034641293807810059734n", "78692725054674081196434522843n", "2899402626497036759n", "4466386979191688634974299793n", "73590084746022202502283403859n", "859759454707498102n", "49530047850904057997975767021157383838285524079350821991880424926644689941n", "12n", "73833755054290735615493473493n", "59827914949558952876927624612n", "1842769298355464193n", "0n", "31709724516548461033720090826n", "30157355094312078251107514164n", "2598882554441689462n", "0n", "340282366920938463467229529119593204504n", "2783209552014905048n", "340282366920938463475639663367112901035n", "340282366920938463466510485605024151680n" ] Output of encryptToDrandRoundAndGetCallData: 50 elements ================================================ FILE: tools/npm/integration-test-suite/packages/nodejs-ts-esm-tsc/src/examples.ts ================================================ import * as garaga from 'garaga'; export const proofBn254: { a: { x: bigint; y: bigint; curveId: number; }; b: { x: [bigint, bigint]; y: [bigint, bigint]; curveId: number; }; c: { x: bigint; y: bigint; curveId: number; }; publicInputs: bigint[]; } = { a: { x: 19326975765597999023026309242851464618295625967876195641207265702903971944714n, y: 63835113064883221423828958902442994957834669122245713027012799265225733314n, curveId: garaga.CurveId.BN254 }, b: { x: [ 15926258242285065430281020483827261910589109953358642697562602626998569607754n, 15482775443177023962384497625528997151098293635727021527127534892096530509952n ], y: [ 10937776115245591292644949547008094885240742374542777857501160790374675834371n, 6691169928456984700056024515478772626466687376966760922939239504103847739755n ], curveId: garaga.CurveId.BN254 }, c: { x: 18548825552947889373136407684636046437705490810597995577018381312170231914454n, y: 9890815383090898074006770716054740281870916546141552254207684185588486179606n, curveId: garaga.CurveId.BN254 }, publicInputs: [ BigInt('0x1e17db88c1d2e83e49f692cce4bb8169309de90afb2b141156243106aa34b474') ] } export const vkBn254: { alpha: { x: bigint; y: bigint; curveId: number; }; beta: { x: [bigint, bigint]; y: [bigint, bigint]; curveId: number; }; gamma: { x: [bigint, bigint]; y: [bigint, bigint]; curveId: number; }; delta: { x: [bigint, bigint]; y: [bigint, bigint]; curveId: number; }; ic: { x: bigint; y: bigint; curveId: number; }[]; } = { alpha: { x: 6763126530687886999315782887200758703366235230289874831627658839515656330867n, y: 12297948670392550312636836114470404429657568989657927437959695771502446445179n, curveId: garaga.CurveId.BN254 }, beta: { x: [ 15362786867599176251482538547160991918100063526460909721657878971551583339657n, 3804423004921008809819632629079723167970572551072432396497601916259815496626n ], y: [ 21885719103633717693283841528133243510750001708857084897139570082577218850374n, 2076817281717432063622727433912740683541778328445173073030513609350245776784n ], curveId: garaga.CurveId.BN254 }, gamma: { x: [ 1505558511994093266228972967760414664043255115544025409518939393775943607863n, 21131173266568468249589649137903719095480044620502529067534622738225157042304n ], y: [ 4008759115482693545406793535591568078300615151288108694080317738431649117177n, 18835856718271757625037377080288624550370480296914695806777038708085497610013n ], curveId: garaga.CurveId.BN254 }, delta: { x: [ 1497911744463986566314308077983046202449361313910668647770797503379177516252n, 10829154948357654897792444316512827659620136273388886760324770466776134105520n ], y: [ 10850392992008761830625471778404650447428083833210258292805429019728339148884n, 12593805385728178657844996215584371401133999503150901444097670307277076679963n ], curveId: garaga.CurveId.BN254 }, ic: [ { x: 8279781786940010385190155571855963988492685408361021424114669994156938727612n, y: 14410809027374663415870055712464930833085570569392210261413081131467855918386n, curveId: garaga.CurveId.BN254 }, { x: 10075286447651977124250383403562829564641026794366918560412684031493085120161n, y: 13393494704849149158598989372790154670517815409968589728896053397011959461594n, curveId: garaga.CurveId.BN254 } ] } ================================================ FILE: tools/npm/integration-test-suite/packages/nodejs-ts-esm-tsc/src/index.ts ================================================ import * as garaga from 'garaga'; import { proofBn254, vkBn254 } from './examples.js'; async function main(): Promise { await garaga.init(); const result = garaga.msmCalldataBuilder([[1n, 2n]], [10n], garaga.CurveId.BN254); const json = JSON.stringify(result, (key, value) => typeof value === 'bigint' ? value + 'n' : value, 2); const message = 'Output of msm_calldata_builder: ' + json; console.log(message); const groth16Calldata = garaga.getGroth16CallData(proofBn254, vkBn254,garaga.CurveId.BN254); const jsonCalldata = JSON.stringify(groth16Calldata, (key, value) => typeof value === 'bigint' ? value + 'n' : value, 2); const messageCalldata = 'Output of get_groth16_calldata: ' + jsonCalldata; console.log(messageCalldata); // Tlock encrypt const message2 = new Uint8Array(16); message2.set(new TextEncoder().encode('Hello, world!')); const randomness = new Uint8Array(16); randomness.set(new TextEncoder().encode('fixed_random_val')); const tlockCalldata = garaga.encryptToDrandRoundAndGetCallData(1, message2, randomness); console.log('Output of encryptToDrandRoundAndGetCallData:', tlockCalldata.length, 'elements'); } main() .catch(console.error); ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-react/.gitignore ================================================ /node_modules/ /.next/ ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-react/next.config.mjs ================================================ /** @type {import('next').NextConfig} */ const nextConfig = {}; export default nextConfig; ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-react/output.txt ================================================ Output of msm_calldata_builder: [ "1n", "1n", "0n", "0n", "0n", "2n", "0n", "0n", "0n", "1n", "10n", "0n", "0n", "75759116906411131289250842036n", "1443316740970346987535705368n", "708088064087366360n", "0n", "31894839170900604627010243180n", "26562388390640533846098233871n", "1678682860455561629n", "0n", "340282366920938463463374607431768211466n", "0n", "1n", "0n" ] Output of get_groth16_calldata: [ "1935n", "561151868347580495583090954n", "76095163897123765080010407949n", "3078964875882710626n", "0n", "68760071548346057889257256130n", "33987009017980255890281589641n", "10169520226989098n", "0n", "27526525353537266686222475850n", "14475456397330869216192753448n", "2537199318039088506n", "0n", "21536768652854740401912377472n", "61033740543581523820282161323n", "2466548432040548587n", "0n", "49356715888972701601325049347n", "69887821523610458575318250963n", "1742488265497548861n", "0n", "68106177540828336088045306219n", "961134836681944563222599448n", "1065964868903753173n", "0n", "1800806384039658546158952406n", "44097612892395787951554989634n", "2954998394940821894n", "0n", "57407696252580182379957914390n", "68043785987214905719851221030n", "1575697798130653691n", "0n", "1n", "64622861075918021861446670503650833524n", "40000715384012656934033607729992139113n", "65343516826393976703500119419n", "64215924997604874724268545467n", "988361220710881918n", "30419768492628197858619568261n", "27248300164153194572764431995n", "2977039154666701832n", "65685384868591218376868464427n", "70847639348750339988496276918n", "477777041053646529n", "29991939756641252358878134746n", "39295947558852310211017126572n", "2815628384676858047n", "41723516601424502403187247204n", "17017221925427596342628818049n", "440483370607139100n", "10413180469465695361837522183n", "19423959337400646488247227266n", "1196856567711091031n", "14918739433528640782272739139n", "2386255189434407583576372032n", "2110030772171629820n", "66403863065153192042460667734n", "26490228722781507311620127895n", "1376925612093868452n", "16095686441528704658448370761n", "51022389018232154188872438326n", "1610491282614910455n", "37997039872158612927722452114n", "76461913933066610895201145075n", "951074374291802403n", "71303405408633411813876113602n", "65378028046199379258519780162n", "2796976393851271662n", "66043194162972766020432949924n", "72668519642029141849369643840n", "1767421250104456939n", "34724757470958269778491338738n", "67907574914053181941994051296n", "1074861315591297211n", "57811416502141401297494384261n", "66717953782642686044297384228n", "619071555217927229n", "11747815192199388258706152779n", "39655522309044272057593243434n", "2667518659266923661n", "74545987263802105943401974456n", "25100780504941704736052597181n", "1614091262172996678n", "61496830641585942728225636367n", "47520662928915336127912320093n", "1483128622047069223n", "60688370891239308805053347678n", "6154252422157238786881911133n", "1595810747040934713n", "4083087877564984515505707949n", "8098795933662806280871012387n", "392529588828430050n", "14388273410011291023320103380n", "59643003630595652724715495246n", "2978244255961784640n", "73005708620970672578538518429n", "64274822400727474231693975117n", "824761225328685267n", "58979395441344004425345087397n", "50034285490796369376342018474n", "1071577406066675668n", "37552244383550540565443579029n", "66651519402295869947385119697n", "1816081760201573675n", "48020280081371249748563352979n", "19387797072717949389382225132n", "1075380445499260082n", "0n", "0n", "0n", "0n", "0n", "0n", "35717919122505863182793101258n", "38321232967395819819318928199n", "33653293845735846n", "0n", "0n", "0n", "0n", "0n", "0n", "60126610212574038899502857656n", "7521540037295293717633716927n", "2853604986499631260n", "34n", "21051189327279847889561754607n", "15679397574132606210591767826n", "2165541175263187167n", "11461504713279098434997837844n", "29843864593792422920685859506n", "1460931496621397613n", "31444402670555100638844582863n", "41564870089383627374040254466n", "3317275169749288672n", "72559701040108110454251376272n", "22887416934578586124987839996n", "233686850646424299n", "51667851121405518271474152545n", "8297160697759020633045233343n", "2193876459774314419n", "50048470992987075597478354517n", "7622325433377464914372402739n", "2354852892440837544n", "51371930649223862037533589505n", "79037515700470610379424985426n", "3103776711054728122n", "62017664743365054011497714498n", "18400895627048394641412939651n", "1348549913115407530n", "68135824164391051249850625519n", "66467776056179325801077769907n", "21934170737946721n", "43733194692565917370190335652n", "20871497235942649279957719973n", "668366294714005293n", "69461224576101086641240237729n", "66163212446743341874016516713n", "2187872754580648643n", "17220145241406859216639481755n", "16637691490800642336304328427n", "699908274655976347n", "63497807423928467541336180608n", "5826616601935275548523889948n", "1995878641893268059n", "45351336804917798268705814434n", "32809386436253774870015191481n", "2479634507910679085n", "29902151727900563245652302915n", "70978449320724687288838934154n", "2324927884830925807n", "70956000718854853515484101425n", "18794223695576985859644098754n", "851712710373510834n", "10098225054790962506843798879n", "23663666343921865703011477995n", "2539135702270490911n", "13745949463631524266514217644n", "70097334773007528061348260208n", "1449740726324507950n", "77747255839650031066990598333n", "33186206179829484467075523327n", "3072781249488320507n", "73980383885811324159893986758n", "1765445723258696625718806089n", "2271055079390534326n", "65413433113844994807777190576n", "48033870016967321544035758027n", "486427727733872709n", "26974899297726311987406093631n", "5590641036960446176988521755n", "827510576486023036n", "29009837304935242599458620885n", "20410410399336048506493809410n", "1954580703151327584n", "64135814011222089868428198367n", "56261294792918650387740643327n", "1226348411176360117n", "71834179960057214052393522783n", "46252419010406289556729694820n", "1393685374555389118n", "71368042768790547323904986882n", "66161706759499128280107017373n", "2031846388120562115n", "21220965229609488481377288540n", "63634474338013450603335409627n", "821621475859559449n", "18432973800914453913616171088n", "8237366564750917100218776918n", "3448970319177548904n", "51266071561401723888120442902n", "33637427514172279767467204013n", "3304964589143840434n", "38819453582756888614388081676n", "38995523514738195349996597496n", "2323381859757397191n", "60884424754479179074928199128n", "3834764671648885586861880739n", "864611594127789300n", "9851774469429652901432809299n", "37101389540039872112071709899n", "2559626381308197564n", "406646090122284731360238690n", "44652954714826373590985929530n", "683398595921263332n", "20271182213679030346920227775n", "37600328594433178897257972399n", "432396126057182521n", "4187404064813213379278146332n", "44537571235199588707429377798n", "3148695479824963911n", "25801656964836714839982503508n", "51572074862943493111482365520n", "1230107506438930488n", "51625253538057090130489675612n", "11815326077763625426679125713n", "521507079758837629n", "9648925458348520397354094791n", "31712274845777377436963587786n", "1997027570431487029n", "67411860089204789431616372347n", "66528411456550554620624110152n", "186478859944874837n", "61267275259145597446660035124n", "8554664316600082912178209665n", "2375445434845419873n", "1589782365755830876261985911n", "14834270454057237025174127570n", "963005115183332390n", "23249702285165109375700438720n", "20760791667651963569657008881n", "2149068190029611973n", "74674158355316816901821060837n", "13278131002009659818927519878n", "992778641153509292n", "8743794935416188942200722720n", "51445266496970909016857135378n", "438732749332832318n", "64511635865187456937539832569n", "68455428209776466334096458368n", "1196547129512189429n", "16652864649326843859619189651n", "47031229552259361752165531n", "1977848333533964373n", "32230433718106499209616712783n", "50152042404552913889735459326n", "2647553318887157906n", "15558003702184603194095500825n", "75789384763919593972512743955n", "3199452366147221980n", "23639206276595496029173201731n", "49198122874004051169498469698n", "3017499313473475023n", "14633623354742611699704494011n", "13838793228838994907197164815n", "1865567661799564691n", "63554437295278917743885851002n", "43774994641723817700539915508n", "2096263880799998644n", "39241367224191359271532780985n", "11996031360599781980224407856n", "669587303349757211n", "70309465524306380398946854940n", "69691793870844727391235380992n", "1097884931999290463n", "4880550284873697839328338960n", "8683184578595981266384193421n", "1704353262400573542n", "43209925421984317108056960491n", "71838424302727061831479195619n", "1719485935656079288n", "20281500369447070817728689103n", "7827101470501627130702651299n", "1802787150264131673n", "46990609747636025825158033861n", "44506561326339289883265865893n", "168363193009253293n", "72644600526598920979602995563n", "23734595505295435652505772841n", "3066825941193215846n", "35922864395887621958431954121n", "36164080296393340386782836739n", "2806406594668460083n", "9559608083309233656821926408n", "21435397197883361901646100159n", "1173438743001539534n", "45502332725513884072895701183n", "21110593816020485943815437920n", "2156839344197406156n", "14935455230205682855615996549n", "3176509029633635649806564693n", "2744065159326778800n", "50144289937074876149408247339n", "73476828119785067069284584679n", "1137921320963525519n", "7764782370318985672713086089n", "35186333034809438599544173388n", "2599319187054853443n", "71090896326220687050059751719n", "7138127862158940765217036726n", "2525413991973636711n", "74465662641034900763924596241n", "64800563131735459820423413678n", "467645211882593334n", "35429207184442884958891366618n", "32026071525343635101462583825n", "732661589473603894n", "53979236240639306101606255299n", "42289323195165961060464784974n", "2572678142594168339n", "34781401150182625703506517963n", "27502296245160796607775189158n", "204754437845996963n", "60295830689532650505249825677n", "25033548320502415354132760311n", "26918649856759092n", "53883044729840223319972205798n", "71229970233113264180243241621n", "1096143763692361182n", "23670625124894730163037915585n", "66188859433247255337619139871n", "2789875774976133848n", "76287870172839315742103539908n", "76696206429019592649532825371n", "1140810575629679716n", "65695197715200264171919419792n", "64578697338608806055715988010n", "1315508308085028070n", "78097114957711978300958275236n", "73435222529435448525954708815n", "1357585460514972583n", "7357385422266450818170168488n", "41750638133784298446701227299n", "2309087687582896396n", "59893979186320257893680148671n", "70073254756682993544223051173n", "3379633857316028827n", "63037751789054738563399308545n", "22112638657428976200628648553n", "1119955028522904661n", "17789959924300679578888409433n", "32036177498553475203925266628n", "3282049411090141820n", "28853440708133119682221591754n", "53037088663773523321481680370n", "33889236786700338n", "47866115906431522995214087729n", "65896044771509521496549322945n", "1356170216477027582n", "72025359186703704066599325205n", "14290937382512145681745832413n", "235291859370816977n", "16739080450814900672563464076n", "27155915888194232201712953259n", "2201285100786606817n", "79046757705903490925593572396n", "41590525534061554138727710174n", "1563993153777110442n", "58644351226953768961970699175n", "71513413355714071072616721058n", "771468756865502494n", "56315873417343912546874324750n", "66995041844358703653717763298n", "1564628505321775490n", "68742094005504029111318961475n", "43257881480227388188853022203n", "2827885137176633354n", "60013377537965180515452389042n", "22615548017942376680894051034n", "2778940717048846996n", "30216926479141873412912870389n", "67097866317972012436735650659n", "1001082522948099952n", "31879429787569811794175043050n", "57916743777618192263856200515n", "1477201521425100888n", "63117110331861368443138300600n", "24455052765578778318741183737n", "3145320365602131181n", "27504400622945393457424964663n", "18149654277116955082138788671n", "709865641588578406n", "51203413602847718278618462447n", "32871208476003646471375256821n", "1972541565241208115n", "79118404692942875097520377767n", "48815069625306356145460113214n", "2800168047740476387n", "27090046108651136752525050251n", "17050737426763583806790779471n", "1273566324033923836n", "49543917066569282928794484300n", "10290628042158833070532221066n", "3469066870558011680n", "42005113796531220880503084548n", "60064195130891515794312310901n", "3245851193684195107n", "37533982385009798315342336648n", "10267823027838019609009260399n", "2025345482262498605n", "34864622598934340124988581388n", "48347073555555495737374318810n", "2673244105079290838n", "75957016907360510463610401727n", "23977086141109407077488719105n", "732491745580907274n", "64604276948999648627686221332n", "3868070793275280858296301394n", "1873653426250118454n", "15570553586934053483564418077n", "13639547122371116255200424101n", "3229806347752382046n", "69627176750917937037127756524n", "77527130421629244161614984692n", "2205592855904802747n", "42359401661274759693285654733n", "15319487818905735149374624862n", "3299209455827802664n", "913752139298990313523799637n", "70257873178701883303322833580n", "3363278906733915791n", "3719386124896722977369262005n", "53915264239484240561994801723n", "1014563467864375643n", "56643381820560944379080271087n", "5451127454093963182673395845n", "1647155594727927302n", "74031948470913728924354306654n", "67046184840603355661228918718n", "730434808359892479n", "58832815659134274668136294794n", "44220894708044864609266466973n", "428689828657455715n", "26619728344740812354339350673n", "55972705855091654840275771393n", "597472825198654088n", "1452568843776109298902292527n", "48082065429135088437634332196n", "1047157723497573338n", "28285154322504134404521941699n", "56070279326493931276099147353n", "1647252454052220783n", "65027676769817342180184568252n", "12685362344487350979600199772n", "1402500493179000567n", "12668630001282077875777731433n", "55553251572483079593258301341n", "2382205981458202111n", "50473524893888759380289559496n", "52220217290909756763540198313n", "2029638412495399688n", "7502774623130712545083224028n", "73425515727643581896824036686n", "2771702310825972693n", "4639820922586718498241340517n", "46582679696898380484679332702n", "2620580077787400940n", "51782105270520932573551959292n", "74517889523497564960562458357n", "79055126752843995n", "10925640711936519280913334701n", "11947058347966705959371810733n", "43716694970268491n", "35453676805113974113471109604n", "12015889727201641553493717139n", "3275286259969106630n", "70932279409438704808566723573n", "47041530965489511382629531879n", "1256401409005218192n", "46895749660336733332848035754n", "40261009687444665011442182710n", "1306436215925446460n", "3904962902077066763622365736n", "36103992387013546339910627073n", "1329335481346702678n", "57853677844329075763360620729n", "61001619991056325367390311148n", "1235032555631976826n", "58692146235938833274542664790n", "14589363842493324627243766856n", "578262325105051129n", "37980379958779218087580100271n", "57690546822788520479506631792n", "3164185857728705638n", "45598806448478931852264970697n", "29033375842093843451718686864n", "2812217528418815016n", "9663261157782365056384592697n", "44620211458433011608252253672n", "2505651240889113840n", "48502340833312690180905327065n", "9352266604910376416980234379n", "3341395763378874957n", "35507650777754495555508745994n", "64550352482963692428938364344n", "1749731610964724298n", "72801722493214401326730125326n", "55956888553336351398608259633n", "896001678647446033n", "30516385505393014949750902877n", "47315718952109319710441627150n", "1388483706936013349n", "32381991427814516368016795653n", "59696292811917044385937202833n", "618914335291991958n", "40375787626773409929606022175n", "64734613933900308276892757597n", "2556069305521992095n", "58654528682801174800851099376n", "11593522535604870003716248394n", "2125230714317219300n", "8061995955571015171488513388n", "47983447012081651413970228934n", "855542739847145422n", "59096469339608638609245068515n", "7673808125695463322887566290n", "1385253448294382073n", "25340909062918393540888464015n", "9795256553635962173776771050n", "3012016973098277348n", "33467611330524938973631050712n", "7543431037219165063475505539n", "448151223182465539n", "22750106248651778926545160954n", "25740569688692303261800730858n", "1075240126364963450n", "56338203997489686691769068850n", "62119360873725897456686490753n", "1222146081347045140n", "27338323756657113133884361560n", "21141429927442113006964516579n", "462132336382397961n", "4987343640321990641559943818n", "58829032105334349895296634715n", "3177465831253470688n", "69096263705896112247403554129n", "29492604434954899550510960365n", "304239915265350366n", "66375851691134826136210085333n", "44757375154942980538763091305n", "1112855489475878924n", "70069037784938962740775503666n", "12717652252841341839220495543n", "2918096944668928835n", "18321962109897171704378960368n", "61813672462196073792006627549n", "2734946711892636188n", "64219561440442257822526755189n", "8503031322535266331858567242n", "3223902208326320319n", "63116174136664698830215774786n", "2759322304337380924973025029n", "810068357014304774n", "15698684552711747426349376896n", "65762055793295617462571353752n", "518270689795187122n", "58150828468103287645001826637n", "77452960139151639571846482697n", "519559051146038460n", "72625801975239649642036163890n", "39078044248618521225250269350n", "2190524057325078928n", "27770888055874136986828633484n", "41773083279140557423975570256n", "2854828164966176931n", "627836434493841003902237785n", "77928664588771202997039373627n", "330865869276931200n", "52935592469577214913105764520n", "20197659873511917804524429378n", "2125370194946441846n", "3460074836406938711660958301n", "52820564261229479633548811299n", "2919129481241566745n", "6675772908450017734753351305n", "65258735248680451317985314824n", "2950671717077079181n", "6822322071311459654365919975n", "48497518547901827883287152419n", "3243229764836791767n", "72937532385990220357716354648n", "19074513737405788027838151006n", "1297437039234841476n", "75502921753638151385835217223n", "15306268504859852745422227938n", "3143438951510181753n", "3947335170074803838440311819n", "62699530989773040321915910090n", "3215975868729087991n", "45236352461588188769215285451n", "41706782526887442329166221445n", "3168773580470738009n", "75285535419605148224367004655n", "20481966054007305592119557920n", "1679995277184070400n", "45190873120635261257451746066n", "47696678647110719375889237738n", "2068610507691385147n", "9915927934978371252308896949n", "31159305954355174048281405375n", "1704598723840881213n", "67338469563962359211325034773n", "41738724864530875640824663606n", "2293929193371443079n", "34807312716413150046069343319n", "70801066094208025212394559646n", "2518515824100660756n", "76811947889156401932764711781n", "43817729339652461426643528955n", "2039489180470709457n", "38477432026452102589204844897n", "27527167249603525516926315406n", "1191468099071291308n", "38041851156661687253492123536n", "54288163040365572080441140556n", "911480122138689106n", "4974069079367885339264267782n", "28880616750574662115261710630n", "2834730446537796035n", "55466841778289154595312506036n", "47524577058256910308968549882n", "351449977223840700n", "62311990134227217524354071274n", "75586193885025429015569590193n", "545412183548073756n", "79201290258654825630711427638n", "77524373992410852423354047680n", "552010389188782621n", "13584773290145166716045719634n", "57089761411485171751249424952n", "1694608384682621747n", "29538886750825184946212760314n", "63894150012954354476012028271n", "381542434687157486n", "18078760560177937565267140464n", "74003801426748288272147648907n", "42337564080893923n", "76689566315090503029029632865n", "77474971819185712518886624915n", "372114354534855369n", "3011898200892081576513307862n", "13966070005688554503624007786n", "470413759528293312n", "39357561183949775040925825237n", "70682164693568724918268906963n", "1376182782398783885n", "41538213381429219620578361408n", "42254768852299863792709628627n", "3431309948863311296n", "29234390314689913487082552719n", "17916853178952663417328241903n", "669291203853282419n", "33249562629014821971547667642n", "26222791431277453980835687680n", "98534970627714358n", "25021648199838864664290068537n", "20665859250814395210947344246n", "662389299694120248n", "72307113898419621240789872204n", "46323053668872253004980165076n", "1041999687571616075n", "8985042666921921648283132643n", "74513886773734802806022422301n", "2603455779145809119n", "15411135359682619522278947280n", "27784420314858949438220006926n", "450671277926568052n", "2831173742809690598851605179n", "28386483802658122108161613621n", "1424370976519373932n", "31198231619878444700423211860n", "42295311569311653123964908500n", "2935759999014605210n", "32001363507887263736668102660n", "46912833713119636774180995741n", "2092237369418424823n", "78656477190391127646333527543n", "41056006364555863740114989146n", "2171263570612200061n", "21422129487009930658303224502n", "46206308103083011878154386775n", "1874554378158482533n", "36641496950703925635911572554n", "48432166499307362117455688176n", "362387825758837904n", "27092632894596570716463916204n", "20108561967338242154648349930n", "1880193076762165445n", "9593372273263129574197363679n", "48018078028931030587694756618n", "542974594247287387n", "14814551631877080383283532261n", "33496168748765220079451008919n", "2250598863496646490n", "44869586855816636221572912809n", "41783360501362407212785286614n", "2362538758680925884n", "47048981182078605465642165702n", "60518795030556750835816928982n", "505511636936241905n", "58024262056741504028876642662n", "50138980925793649225004896980n", "2579777888438614723n", "6523114729709277602770738046n", "28358393151053570058817793343n", "3081381986289034984n", "15900191280315068679181663660n", "48577168032374944428952731072n", "830974214184407623n", "10274561196236136318135959057n", "26148664358554534185218032007n", "201377610767670386n", "11368406426935765376362633788n", "4122436782704069458424072833n", "2934079973878820714n", "66892750247258968804173976659n", "76380379537218876441475920731n", "3380019238411335234n", "50717224916942478279258173891n", "44470393688322556765105136550n", "1813355330674964836n", "8515532742277261388949469229n", "33221912074775270762895168327n", "2646766706385940242n", "11140136119772415355412357379n", "44150773111766484868566388647n", "3191354614138223649n", "30708778779429297397760149496n", "67837687252340085721524474101n", "3301367800510383551n", "10954599956402707572521260184n", "21030000566064580489911242942n", "1828905939385555740n", "26254579696623038244113820321n", "76089322519690535032690356215n", "868757520992376209n", "77540171332511416804096348278n", "10474304059709005130776549459n", "1665346113039180866n", "77071906535707552468440337167n", "76416817616469856915552001970n", "2619908781683664602n", "40713576015254467501617369989n", "69174809057973808586596761660n", "364462143474967775n", "3388865641890523266901884229n", "46510386965164679950611269041n", "2868959718371388528n", "38291153048032659818161082470n", "57992998428591158266306092260n", "2140250223970187383n", "74674643030181299821451279762n", "61603307939095484817637012597n", "1805808601029218696n", "37221838450591689221386319329n", "68301391492878568825616976727n", "2237000809794684762n", "11407285364976644693945059208n", "25348058182926100240298110509n", "3114508241594272017n", "75356748694855659604450932050n", "73487079967561788811810515931n", "1490776583857675442n", "54218989991798315687885361450n", "20703329376060767478344708910n", "2199487792587152210n", "75111061944546058209924381826n", "59244444067541601191271416829n", "1581429188013860604n", "52660822561915117683975147831n", "47783082248718407900747485302n", "1369252091872015433n", "36417458042350421490821725117n", "31829247002542379610343848353n", "455784377300586483n", "16833465703461845689857266397n", "71194569481351283884295739145n", "3189866189053900612n", "65858387085894768841721032786n", "42191857983305827191840357582n", "666015291493419098n", "27916318777227697186981470587n", "32438460617546390776125662122n", "3438854808891043135n", "41197663088738641800559183911n", "55140791537758229983041465056n", "1162917064515090408n", "59276808448795540978821008029n", "55346073844723874343240998585n", "2138546228419844587n", "29861692804477614266603259375n", "46434932953097909216915612814n", "2786750119186865986n", "2914382294411148824195592597n", "47257202751523172671381039762n", "108099711483611500n", "42513194204119630092428609239n", "7009779828784113435151735800n", "1568976973765903017n", "74506942497632859791810397801n", "75159716442684547730197176733n", "214522106108977303n", "307807623661151452830127704n", "69355418870826927485148435899n", "1716229337114513433n", "57800790680731912804700220994n", "33865695886637783077735975519n", "1521543041885052952n", "61900084065708307372472439490n", "9670136848396954396035168772n", "705486756697563485n", "65695693080875904861430309269n", "42258749277647240519914054375n", "1610937183743514752n", "45949364456230722028956610312n", "71318597512050155765983898976n", "1419180020927833749n", "16722582418318977044812304850n", "64520646005354913944304541442n", "1349757657977694032n", "23453477023590312415905476662n", "20988708348761074914346191082n", "2734679321361253617n", "3531335181910221180679210683n", "77069908679139173478778593856n", "3209489805214655859n", "15423046625290420432194363954n", "66544315732344216335597482829n", "3417056483929987132n", "23412416307661786237706973063n", "52684903097691240819445939916n", "3087013127443362602n", "59516131369415164617233433764n", "22552284363447521404574779744n", "440598570727652332n", "10078101871820643773664346515n", "53180025648864462561753056892n", "1238481677425258091n", "66978851386839209947975732205n", "76469976691658858609518100317n", "2669015410315668427n", "10462115063986428235746660388n", "20612418707380044137824607138n", "913149152876393845n", "12896643578852573199148249630n", "65916513826164228515537693476n", "1689818392090951394n", "48812924094784749209418690439n", "21075229147504768099245857693n", "2023634641390620097n", "46841988916092209879920999223n", "16626325630569367486087793088n", "2520424161966279659n", "66590657955425334169984583445n", "43137455439307899619378709852n", "119691013666955759n", "59528138117541221723219264069n", "6039238025418276887251147184n", "1423016249189720303n", "74476981597135756778074726485n", "57871369440317946035711890073n", "1799738956519083373n", "61169922085945703273845146359n", "58536191609701145724674103544n", "678581665969651580n", "29756753901276156089801861773n", "37715386191992628222582900313n", "1839293100231634062n", "8545730587160341404066690935n", "73310320371102040457790413928n", "2943087579162219865n", "3592679410576312851945554995n", "63768122222562308688415150519n", "2852416365710961566n", "65734466853903663026216615808n", "75611388663630224651662180524n", "3082245111526479768n", "42542028447397082553823280434n", "15266201170439359558184400250n", "2959319188559780389n", "62084872176674708014188872797n", "49471685826369556510350964812n", "3044342635568692521n", "52766810402300947123818998320n", "57464266928926410524441305379n", "2678492530248725715n", "63759940946573266111589745544n", "1239422070074535035165804970n", "3011362073292317527n", "5312425357216197805891517417n", "8604490350019536611169668726n", "1278264119461231226n", "23413740732153092734953046582n", "2351234330786062681522357509n", "3063446156461791539n", "31192263866697541487222909336n", "53213425910476786883061415945n", "3388535254355309510n", "76222049202953784940228041093n", "8232814450668299001215927167n", "1010418058221874517n", "30375045069912390061370886372n", "76858962311200653420966476141n", "2531834595530804919n", "72838406196796824316965387556n", "16107338032535514271932130242n", "826038058455425888n", "74047817357615679402104886971n", "66250974048331219261305648117n", "515372630941459652n", "49140383045734318581810247391n", "38552127106329617678305826510n", "1791730195926210707n", "20447547859709794457924179129n", "52480964595913357482998508931n", "419726983098458687n", "20434453705733747059793719688n", "22732218969594988459804019164n", "721740589738128975n", "63178390467425871623450374916n", "58781628951232066578669558088n", "1366096141210552719n", "30310055907701667442250131224n", "77693499391068805405178198648n", "2419127900721456602n", "72238281634987295743046110639n", "2759706666093555363424148875n", "2871042634310332424n", "58186331935313172107712023092n", "73009408672165436946758189888n", "1138172672402058824n", "45794206921224716587506811973n", "50074044364882080121299615241n", "201200847748951804n", "41753381957343686084038148154n", "16651255916405576823960096368n", "744771251876887027n", "6397253273640502791149864078n", "67730045189242272443620838555n", "2723512022810421168n", "20403399159094844095476748628n", "46114852246774129546878110205n", "2163837250026966482n", "63507059223060953171650485733n", "27872394523028449929373211791n", "1266384674015277092n", "31341532803878701385180273244n", "56274201404580685976997533743n", "431470279371342601n", "27146401285505116697408502780n", "10909809704395711896795601995n", "823727347575104764n", "78157451508256479551851793287n", "7934224114897115965586132150n", "2561622534344592225n", "52031374290403822978799313483n", "75680335637831520600351100052n", "2240257882085839580n", "35818819658139744996071875447n", "62532608351434239965548606901n", "2997209098633992908n", "35801460645260708494826382933n", "6962199370752725968726753829n", "471191881884558376n", "51494347593311565178389849721n", "27959136057874496572927068138n", "2054885609386822401n", "1903400454085938493722464234n", "58252527737465224754126905441n", "871049256780466220n", "62266126172301828292957015888n", "29942402306346798464030870789n", "2439682690873113741n", "58828716449315637847726991566n", "33586884830050665361484057496n", "1850240284198082738n", "57256720773892932068692318575n", "43906884659388043006991040937n", "2567264210368699586n", "37303325532466691611774319975n", "1023775330119159065320215646n", "2970467943548704391n", "6719369853840095911284134964n", "52698184868933442534169228704n", "1590449702912303791n", "9163234315649800019839577781n", "5096786077915756093838027866n", "2604014912333559946n", "22626562141910724736547894073n", "1221514787490597839172086118n", "2021859363658276538n", "29343228808229785648243946635n", "17107161597392558070179986947n", "2142074198041769333n", "8295437982000203433981112803n", "32281278698888589789154221048n", "2261976931796110908n", "19003064635652370381400548000n", "5388386401569756312458644562n", "3154333183807592746n", "57635002029571841636737463711n", "56991897992879623406006006725n", "2842694143682003853n", "73379904593405458046663259580n", "839437272553377608023038726n", "3093165198442302924n", "33419448607193509624332386145n", "16740311080067952025303937955n", "666860562806181637n", "8797571923563716660075774195n", "75022438860744435659585766685n", "1558560135470851650n", "19713896344694960627284542368n", "78388507052884523368130573724n", "411547793569600371n", "52610184319591489722152436723n", "58886726417514761894083084350n", "779286101129650524n", "30697463792187334469128124748n", "76836636996796091386778801556n", "868461342532092659n", "69910862714025895807766899173n", "51405542117679167872600082463n", "349470313771420560n", "71284241241602654693194940143n", "7305568034139166589777830792n", "2498747200591008033n", "67960797371315801691053786599n", "25825479627169106615506743060n", "454178144016317938n", "35798135180239958015829265626n", "23385623537498663178814541991n", "1668508428339305051n", "15450665342638866022354076708n", "1590106122468359708599592949n", "209939085635224246n", "45146454297276439294547281947n", "71363197518122470395685282523n", "209021609080779353n", "37805135405124328919729060254n", "46916624974206570529290830921n", "848835529094356500n", "52127928532313726409293511873n", "74341195298303002847160668677n", "2836594795507658600n", "21372610848069974970714546381n", "47095482837411596424060733004n", "2644188767312235257n", "42696308717032907609441318200n", "71478263091865254540527492446n", "580612364877252066n", "24227503011457277739411398472n", "46210588161299166961443583909n", "2104513243231016467n", "38286987706753654842254500763n", "52819390378718994903041839288n", "2559971158277261662n", "10804049422689166087510960068n", "78494177681671393465658693075n", "14482037543685577n", "45316386224024264714051962520n", "8077236619578691823690243326n", "3134255926280338435n", "58234835865881258067775424985n", "32582539715376623121568222400n", "895535831771370236n", "70554522419104669983576590653n", "40229753450332894247180991320n", "3235640053820685715n", "20050852574591066448348962700n", "63154847355271958325521981335n", "467978477141038832n", "23115494614834363321936638302n", "54275477858894789534235120579n", "1729059077109549892n", "2643222253937861530223901503n", "4343013099917093534712467976n", "2093250350291324334n", "26606380640809280595919467519n", "24158225122809122341718478436n", "384623299034698779n", "74889164947469453919523854509n", "57684567535195905731154589750n", "1155881533367487150n", "40449699793338258794390721810n", "45563605053974069206983967932n", "1493349482130193926n", "53198779688378832727006250273n", "23250105681044235044335219173n", "1649629209531042678n", "31842301972458791163037611310n", "54103172956148923849538705604n", "1853082006782289707n", "73283134292642541157328722326n", "60011977393637178105550407258n", "2931499730502310317n", "30363774768400601902892824896n", "69784527858977659878014965306n", "2699700013359551525n", "30143876784681103984444940141n", "20508010382725323248422071352n", "1472036335205806581n", "72685268086241841913630448820n", "13484287640917155024759235656n", "421919482836501604n", "58336665028159633068676496150n", "37899530871095451514688032059n", "830925861824953119n", "25034909887778048695729760495n", "6186382813048747659882138994n", "928295656744287075n", "23742999482526473077193706109n", "38681524762823880972818454723n", "1037267958137901699n", "75848820697595803231237834330n", "4098133930661194465828731453n", "2484592940588499869n", "45229057029317220478111498771n", "55686910073377115986537207556n", "2974592459022975650n", "9058824958434584730691471305n", "3489502058924586487278999515n", "1985538445731248079n", "14034347138268021040571737620n", "22094509985004128313979725457n", "1321434542301391881n", "17216019289274156022312124782n", "65908201923726532456265422977n", "387610774042169114n", "29699496552150641100894659868n", "43552700176683532671663646633n", "305525895851406027n", "62068283835877161864738460092n", "66163022436031594737849199513n", "1671489056967612477n", "5806077789744302022830084009n", "22126371298319875265318066168n", "2973075530852635513n", "43508686549770752780288409207n", "39960107195405145189624452517n", "3021227579398645734n", "75958919635020929694389722957n", "14913897636015670404185010029n", "2882183092458315590n", "24239404766805006701421172975n", "69450551382041986033230454197n", "629979785699424851n", "47715312965767193925496266564n", "51328287208106789864582031889n", "1994694450268216917n", "12878968128402785600925987432n", "8892728961399753099629106451n", "2189564568474803348n", "17841277261874434955985363634n", "23255802008382153152915838079n", "1299631183736247307n", "70369295004394220674262548695n", "41703500013750845131767430551n", "2515279718642012557n", "29363803518729226252949864837n", "11941978972714945652777612780n", "1864444849178365249n", "19838910496936353855554382505n", "63526654617675483693289584781n", "1386561621225388054n", "37964054821976413036136417123n", "14531042297004730862055294756n", "1592174811323575228n", "17025415710900400219439375060n", "362574756192905655380951625n", "186982663000383695n", "75302946272320992428390907104n", "76356571252613340602107695667n", "1005406788214614232n", "58429545482092547095478867066n", "8783598735519438107774246954n", "3449009450489856852n", "52421244757199560525245430831n", "36745113142356116864221402917n", "2011028989323540641n", "52389389340233786555192956059n", "48540948198567585375080843793n", "2511738896308209966n", "62948973448903767233283645427n", "78581731009485419534613750974n", "2631249803991736511n", "15700178914629731044995270252n", "21825209006850516132399941848n", "469426094359884098n", "45109950384963150442992909517n", "34709270486045260410251674804n", "3227700636384978310n", "59508455528169337110518969046n", "7626842288771897454076798332n", "2837142952242233831n", "78154898100541067453790359715n", "28712940925290532622010374032n", "2005548120880216529n", "19676819626842762742496321363n", "21494888704510312646126358022n", "1917432403713999314n", "35348767509581898437000853095n", "54404372638473474714277538548n", "1418295384476104455n", "2087534038039694873601959364n", "55492416744530703076122435501n", "3415979290873032604n", "77874081666239317555289078970n", "64693269821438151662321973074n", "468500022203866114n", "52183552801284363909457374676n", "26386627404911694711966206173n", "849932193222808822n", "60880246718709527470179169635n", "73275749658065911543659109078n", "2835936826164075331n", "47034978948350796174151388655n", "71774550150782116132727222082n", "2957236831646338670n", "63121833886036603562738575495n", "23473953357667857038757232396n", "709268300106945760n", "67565011137450891785645904255n", "24476510070022540670394808047n", "2197500443692989620n", "59529365216756814354926446285n", "62380286296544401614193824725n", "1797665767653557658n", "65352576236492901270647039868n", "54007112892683927216806385747n", "1796075374294915397n", "17840563634584466359434584144n", "46203718678613515530978507404n", "702053810505193011n", "6133701316708198581434709723n", "61802938904865726983656435299n", "3001276128418418514n", "11649452974115692944272358953n", "18473964874994391830987882986n", "2086271034138195481n", "27934361651981769617523547350n", "75412934231387879572695859186n", "461672875728163553n", "2659961698397651286244898268n", "38244585026297070186059616261n", "3371488902807027695n", "16205200667874612181106188684n", "6520317333544879950114099734n", "2490923463723046056n", "66034343348095027053141749239n", "13522171761978136875076440765n", "211626548808403729n", "52060409492746050106971031742n", "3493375676170587510122635686n", "3394236868158496257n", "47140116537527183288446191137n", "26402419994251877186703235784n", "2932509761218506683n", "41718577718458247425998327137n", "72444125720253366875907105723n", "2370720516004120360n", "63763546849180341189837833587n", "56383249669741657007269755446n", "2772609748811855948n", "30673155381064993958540435457n", "58923421149810821122915571284n", "2826147464537959677n", "2437524155719427333248486827n", "13523745438577697843652059309n", "2255306498837633258n", "66617913651732723895666550762n", "800383901932656375981050324n", "2369057816442019000n", "53894023794388536556779913700n", "43633381247568199322500578225n", "1622058361920748072n", "31610597297695602711187104065n", "75047413064993937787913175675n", "2532518357458277794n", "66943196821272189971919216455n", "63057632269388325855862697967n", "252919094746701796n", "36093617934864267028615495215n", "2458297172936844284200172721n", "2861973034148611365n", "35639326827089764975324431609n", "42790455257345625520833632516n", "2416491183110698117n", "25453911219236829571892475695n", "7792114184406477060828720050n", "3256395018257219594n", "44446878573785568457717214835n", "31316823799089969829944488381n", "3348254446631709920n", "12075675278480009463346998871n", "33336621394122897171138216323n", "1761645290764169692n", "38936491179522097211601163974n", "40756936871275705147530952481n", "2239620312855528769n", "66166234417862875439766591001n", "45961753617942718644070346235n", "2545432639028408432n", "27071931775260190706961952445n", "16791652622063002274074642172n", "1351810600008793720n", "8734604468994364132650578395n", "2915643774972349972943503710n", "546123555763251031n", "40883390215425903758829895197n", "46075188532687982090196339471n", "2037883374560027081n", "1788529744899075811496881871n", "22977601030754581206369105722n", "2052641684479223112n", "52403270166627919005596848880n", "2330881363722503207702297453n", "1950506519094245230n", "26974012086112717010353138814n", "69257122863702421096680142186n", "731421312124744837n", "31069884618093040515903738825n", "64922032296511662760139295040n", "2654253976131730717n", "12166944124292618925625599356n", "59407826445782768214824917874n", "354147487414166550n", "74336686733791433900827528675n", "12704634481538804742936579229n", "2082676564717138885n", "190n", "58146038485323707171566360552n", "79083051845830931429793398812n", "1253760413372422709n", "75585805608841426332286895315n", "17454071065969374047751520578n", "1856801283221000835n", "56347371123082155623989904211n", "52625756897582785946932954415n", "1103484556810393055n", "27404185422829405492475499818n", "1419552461670775323662566720n", "3431535685290297040n", "10240761959601706862708901917n", "71665724585200281475617327049n", "3232798557396947874n", "32919536142170844080265894843n", "27634787910238436631971547080n", "689759514785002741n", "15431349741815244232301206308n", "53845586976664022319541168221n", "1583044030122302208n", "47825067986735618489429772434n", "36933954632637013701382915058n", "2061889715878943774n", "8977310916259261225384223331n", "4538091340276567216050541897n", "2974949937804520552n", "32068898197860866225864499204n", "11944297794698583544272156441n", "1942470514051769102n", "16232887649510996786606289763n", "15259493580801814760566477085n", "522617557584553779n", "24242596953798418019519661501n", "34675681500323328218631423377n", "2626688210475495912n", "78740174483351451096333088791n", "64943981386376195937910130384n", "3002553261633376435n", "71321212497283823630152857278n", "57107096638064759035770959417n", "1525415424337039994n", "33592124231316161392746859369n", "66360389043497290172485164153n", "169262401730913852n", "67472003684398719335655699957n", "16789521379035350190464748508n", "2131762421966585515n", "66631783199370161347508379926n", "48925352076915955304942304087n", "264237490291976243n", "24342296347779296789258245457n", "43293722801550027940585947288n", "2184523999681911728n", "9355802069694208050316076397n", "35552089219631962733889470030n", "3012875015446218241n", "19749370490527515528697426175n", "8078386931861545908004277048n", "484548262348581637n", "9197680845227051035593920301n", "76678845496561933550816162785n", "1006587369936993775n", "16264558547638181301681301031n", "77659436542602450682090346042n", "2549030864566782064n", "23992787444587661702047865121n", "15283574111017964877795482274n", "1010500590098381861n", "36081283464794391834173091918n", "74713339703559068643167768213n", "87864425149724657n", "15509755852767806607741504203n", "49741860533707809781906740346n", "2053665582944552662n", "21800540003051693165872352300n", "55295746887291089518396498874n", "2979094345114374943n", "11846584694067264521987247663n", "49031890130314527277927146925n", "3053072831928300240n", "49870471347364999860446391462n", "60351156120295649092916522340n", "57434309920295622n", "51905526990545292008889846168n", "35741421582248014414699395252n", "1021827240168947429n", "16350288651927207676427341432n", "48548588913627635520822500823n", "2556960523655499318n", "39061623507343320271115115845n", "38947970321306063422821592330n", "2525216560431056230n", "65177147304893778229440396619n", "70545257645069117487807391489n", "1600567512488781231n", "33331224951106722420313772928n", "38583179480229318101782748287n", "1817415503412264076n", "43931562095456763346512920739n", "45993143967557989986350621262n", "1013785943641285390n", "46300841465540867353476664678n", "67952189225824325494911009881n", "1883806626142505323n", "74763953209711116608083413573n", "73395076121267231351266442748n", "875683814313975814n", "23960570645093608799064342076n", "36737884069061207609010160029n", "2740282725978910539n", "2348460868169339519816282219n", "59294276502368234372728690209n", "2234404830781012457n", "29326696920519891523554164108n", "46303855242526653100651128095n", "1172546639486712237n", "7729537530476375227332351839n", "8564566731713324385055420531n", "1479853701561506444n", "22273291075577128615277532352n", "73656828782504352218789556241n", "2308987335794616316n", "14359470620000928077518163171n", "71961130737820208932903249274n", "950707570385670728n", "70317507071845790171587549310n", "45654920344570326674633769038n", "2650168593880186613n", "45738429799101288017972815601n", "43778890431815013310034329810n", "312650173805915283n", "59759032808483205201660512612n", "49166445941564648520976910103n", "575816160851551719n", "41099033744600704768583815842n", "67643677451426846496806534446n", "2744110069990264553n", "5427077521225540080527062818n", "27591683040195514365023584328n", "1814257385547611969n", "43890769480671665778349573612n", "25702107374475025393868297533n", "2665391419850264467n", "49173530067968024446609831742n", "69233652337477869916623889471n", "2973651385942905178n", "39451576607205851507235401000n", "65326357252788810888449550413n", "2328241568819620138n", "7187030532193362998811241838n", "11158043907775193412625503465n", "1887168135327759363n", "72093988836508782933530929396n", "59408618785876068844273516201n", "1998979553140732738n", "20436888483045692091969328934n", "37236965238760796085670708990n", "2982240668332065019n", "45766566944201297703965941735n", "33134417182815170607111134530n", "2256938019969749699n", "61095014957849456939456497149n", "5166234805292214141604288719n", "2223380807107784804n", "4407612794594263685713471991n", "27938927008707740784778705409n", "889822472376617854n", "10586000171735376465147370484n", "11688046614136879282493614768n", "1673899149118569188n", "48568524626716983467820586640n", "54066530547892129113282820943n", "1257544179877250249n", "70430239680893778037863498084n", "67050853132645903854946409019n", "2548118935751794404n", "41828468840963319821789084190n", "14275492751268414444663806553n", "1784444490366165065n", "61852018693496828660952117185n", "48406002847831614907905133809n", "49483591444929780n", "54427537761720246076956183538n", "41736602958902949490055768838n", "1954646608479060360n", "60934769075649772007484314209n", "4723248530441409773201893998n", "3259834508477438622n", "16778379388406768302608844589n", "14091941761246911672273283575n", "1362843677097285540n", "20990186444040307549583297890n", "39850655248017325132808795637n", "3159948251218994501n", "22841250904644903266547583091n", "35884470460139378173998471965n", "144997960402386643n", "73988342422211773824311060048n", "25430193174058044426248161017n", "1511499341976026028n", "41856665278828717622897473021n", "52430814625940772563313528979n", "1518969462082050494n", "42785280606159799076021378453n", "75641406683588400312731571380n", "354558010400584999n", "25777665187274443426345962355n", "52569759362487685340322204483n", "2660707269990640271n", "39456006642189286944561721406n", "64095592448568371575360918624n", "1623622008203944130n", "42823981658558488340963830755n", "70857240021552825619139550212n", "3338694247115466605n", "33528981497758066103123618956n", "52174717566293432033940167575n", "3285250213548536505n", "49559726527714678923168862226n", "35376383273863973001561075247n", "1762388272055172875n", "4963094059256542135804830802n", "15251461935798611072932258838n", "3043255521973128258n", "23415022784844915519999589288n", "59120161904093027011464662035n", "2353807276882257604n", "35355887041205290611693611623n", "31669150297307261835976265040n", "872891098273185795n", "69193046798683036289275806803n", "42818302823254546309613088130n", "3225904969635087159n", "22611614040816481524272701347n", "40802292074751246948780577207n", "351005661799852441n", "50079803252014276007292589026n", "37577116329374038939872244704n", "745466466224739689n", "57943789902740370489195854856n", "59877164372411435705733535421n", "1440407261307873910n", "74147961838302268113193936081n", "29475004529393168298384526566n", "780455262674149785n", "51306862863296749150663360555n", "68603117787295236727112632820n", "2702997921905430000n", "64092864258708121960742058121n", "27968741860257802705491575837n", "3395033579182877453n", "60896409955387219924723371046n", "72447564289478669262616529078n", "3397060291617780594n", "74466337456436624238136742413n", "67930138912822600973471222439n", "631712168137915134n", "34699941264140402915854806555n", "31625108777123266428395503959n", "662594291726250121n", "10374418997762067141299032182n", "74831531166323756923345310781n", "2614948808475244069n", "45617012767756761370444767987n", "44141298692376594039790971629n", "1159181502462992545n", "47704071339495071156056567054n", "46834594498992945383289148503n", "924797511068572088n", "23233351571238696045632767797n", "14376771187481317319928510593n", "3161389881302592208n", "68221328884209068946490350230n", "69520921081111912732122080295n", "540294970059028553n", "49382519270729084009739959234n", "54272649767268320797552878520n", "1762246401423958252n", "65695480183764337135892820912n", "15357314953562507969519535878n", "2415017092301124519n", "12568989548408666155318764896n", "10255298595269749256814759758n", "488040996573952383n", "61804111086379855885098583520n", "11271058357408383599116781502n", "1329740533130250248n", "8039933903881517002403963857n", "7118558163468937314455208936n", "536489202082349116n", "57213159007120933607123362054n", "38389263848304750695624289842n", "103890218507147410n", "44837586220950001446991442272n", "51003826059731215073098356499n", "1055564410899460745n", "36382905285088913012495727205n", "23789430840439822229827015138n", "2409250954595470494n", "77553161939176686247041732803n", "32075777538535189410338696221n", "308581509063990399n", "75123827789249657112621112140n", "63466606458376146979489895003n", "1559915864837385203n", "65374245818638483805981829412n", "59413598642796928072211645702n", "773792966334851501n", "10975404188605698335218119359n", "5937731821461360820250261750n", "2424406683527655198n", "58048034440511231692734658223n", "38541497666142538814655959889n", "97237747168756283n", "32114431512100683707696744321n", "43084884381938054868610618438n", "53036606161489394n", "49303822531142933183499847955n", "70757204501375068333736255366n", "1090664900942087596n", "68973060792876598659428050587n", "21709941437174734607102143168n", "54515769952578230n", "40278884731265681742344272236n", "34941403842240889411044059527n", "1414736029232632973n", "60344648712825684665541778621n", "10769790997010708809402622618n", "2270992661657155596n", "42362387786284445354439187653n", "58156800386628045782945926146n", "2818686942230697090n", "31419723024915919870538049034n", "18005463704599391839628874083n", "212688156617827815n", "35911328625822934725057123638n", "17761454535191485025880626131n", "1761977155017563514n", "49665582664754517847870128980n", "39319816430240621753318268462n", "1491136817343252047n", "22260823695114013941955374538n", "17055513051235397699203988336n", "1922191265581876891n", "14555432039935861975982534425n", "48152237244885228239450679938n", "621157026389301132n", "23051036183574002962556684690n", "15971796984547909136099208821n", "2205567601778656458n", "26382181900386119773631359523n", "77486525780604152291567730894n", "3344785235831598130n", "40994902602684141065596542528n", "58124151025072872977666932193n", "1866769646811958428n", "13188769330477055787925877048n", "72682189451050217677569494954n", "1454880931779552660n", "33634144479293043106522767128n", "63196693658172041397923530081n", "1719120090000942363n", "11106335219605429034116541445n", "59150880447111322507257453443n", "1982729467772378638n", "24990080775267144618286017329n", "4933890943319210884773036028n", "3238771988114708503n", "72949239866424524529472552202n", "28511064168198009294661488723n", "2962023653742267897n", "58656766073983020247853921869n", "47635718491612423608063190516n", "3000234376036375986n", "24238047790212470654844439662n", "23154937283069080880032452049n", "2013625456869347404n", "14825246893209210042587190789n", "52825936212514509264761514892n", "993721473581556871n", "8713904335226753185274037022n", "58909703948513917292703719505n", "3356613834808478835n", "47783414808532480730935012208n", "71833517958023857391706253943n", "2135080825574499771n", "884520208662549368825880483n", "66815068005909338250309574561n", "140309291176602342n", "5569450875351413209302619112n", "29224003387999671040246207661n", "1610924941533931901n", "51360380732923628237942915208n", "49075415090226283505119870909n", "824496444682252362n", "26136012194887577513976704588n", "25203540858598899941257080851n", "1411280372175925570n", "68280069972262928193338796048n", "26491256896653383849815404924n", "2469762357772618827n", "73734748267187905353062326737n", "68913774706780990255684794379n", "53485910764302128n", "77777156063573625138168997381n", "64557037666602761347172706735n", "1996255398685960466n", "28464530722569754157139260154n", "22979110781613272893921919353n", "1105566566131594780n", "28039439084355019144555806027n", "16299329550217317018880117262n", "2401400792301565600n", "62631950163514864539620020206n", "64031511810008173001111779669n", "135723323566704095n", "56130238209974371238192421387n", "71300385211683773671558874832n", "2820109121346955706n", "1266050722527037359608467989n", "23369565459382988863634254407n", "2609151292716742371n", "46069724971530567254818701644n", "50647992693491661816900039583n", "3003365004111477246n", "14833086786816707962865094508n", "37929390713358467376261350799n", "3113860565507891619n", "14007914765299785142256461365n", "75894388353326085571138234483n", "1683683923201420873n", "63454168155478046454844432701n", "13184396719317261321865011420n", "3455798177318665792n", "15242605704632094686138955952n", "19838168147461161870148387345n", "2010616752800746021n", "30692509923364661764582557691n", "62096107423559910046379351905n", "1346903255621101256n", "34464243166874822079393179146n", "63846438778551544175642767034n", "1138380012879476837n", "74737710169640323515477410562n", "6284356348145608854716748036n", "180980529294338977n", "38461808257846861933076217288n", "75020453906990644280477544720n", "307346157687553567n", "42941917981619284749284256464n", "29124361387770891246090195521n", "2258523094183111792n", "31043177647483836512207577733n", "76846872956655992019312504229n", "2737531135418987922n", "436136989124112448213257527n", "37270775937015261263489085940n", "1691548620283188254n", "34350139485051631072038425243n", "47842925193965716748069619330n", "3012190802049531932n", "8161319477063961893865419497n", "39887640444908598647019011892n", "326805514938122984n", "45251026371225474798165551670n", "78712165100775809310221458014n", "1747908356221952635n", "74097152003535814545675921337n", "48494072556502793463457269862n", "538895690676303310n", "54295451611850750079844956272n", "26534574033318342223582372449n", "3044215930961181551n", "75837108057982626126393125222n", "52432746192616266658163099498n", "3397076867009838686n", "54465116802539051194037403225n", "19480966575390018045669641671n", "1874912131754984363n", "62538117008905102096704754568n", "49778263788224308775212049920n", "635641138655366122n", "1000125186700770733728208856n", "72272342271481440271970417215n", "126669907718514487n", "32850606983744341262159941170n", "34502523802539415215826357899n", "335651800228572498n", "74891229697299665485048117886n", "7923057032410301273894282773n", "2078488636177744832n", "65834931437626611160851671144n", "47253521926346692275217471181n", "1450467026022714805n", "79218551078854046456367160410n", "70762120870550042138883949317n", "2886881633871743501n", "34749927009400659485527823456n", "74230186035227802214714540722n", "91514308691397285n", "23895248556901354081433241434n", "16615401776547671346915841714n", "3136707560354543978n", "21834987311199156124647763244n", "70345068331037455105782146634n", "3216348569578182800n", "14552026033494402774981149080n", "46810169065384954077118190274n", "1911480149318741295n", "30149592931357591699950156644n", "14166482924045038689605819053n", "2327000634007357378n", "38247650175016523126038806200n", "57691234003597921786155373117n", "859973345968241198n", "71714837789763600565992214961n", "73412375228179646879012079459n", "1974246974270865632n", "52446930245349056255719340345n", "970285520444299081223312008n", "1628797543941019300n", "50919498183802806944452291286n", "37490783833480294299979274400n", "2991807516764641990n", "32377691154331801475818794360n", "39750977600721907402675106371n", "2263832844069227231n", "17627606237803241511589218465n", "3828538907962341287451709925n", "1651077712155795619n", "65746494371320988039239195368n", "40429923959132850189737190904n", "1761591307449813117n", "62030904653045818611809336637n", "31416196507873606617755041492n", "1626933121429044990n", "56278396859095728868031718464n", "40673401721781629455927974763n", "816921835574909421n", "41466998290124345097221160853n", "77602619970761915549134486486n", "2270380655319303423n", "37278580144182814004827303266n", "22631466550317400025567159166n", "1256554869446519681n", "44512857141401466618198683938n", "75645231533450873900978589761n", "2839895442152180859n", "31711543132209616307103122831n", "78955556053482715721582593706n", "626995298916699271n", "50496746606014163961365206592n", "62746915431247250243776212132n", "2682171950447987392n", "8649064541355918845604157106n", "3642459701627177804195047993n", "304942239933523054n", "52349349447437650280979204973n", "38235331305898406894352347179n", "574973155769907953n", "35486247734767358887659775332n", "63676560163395574209410974039n", "1346859065344137509n", "42626666034641293807810059734n", "78692725054674081196434522843n", "2899402626497036759n", "4466386979191688634974299793n", "73590084746022202502283403859n", "859759454707498102n", "49530047850904057997975767021157383838285524079350821991880424926644689941n", "12n", "73833755054290735615493473493n", "59827914949558952876927624612n", "1842769298355464193n", "0n", "31709724516548461033720090826n", "30157355094312078251107514164n", "2598882554441689462n", "0n", "340282366920938463467229529119593204504n", "2783209552014905048n", "340282366920938463475639663367112901035n", "340282366920938463466510485605024151680n" ] Output of encryptToDrandRoundAndGetCallData: 50 elements ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-react/scrape.cjs ================================================ const puppeteer = require('puppeteer'); async function loadWebContent(url) { const browser = await puppeteer.launch({ args: ['--no-sandbox'] }); const page = await browser.newPage(); await page.goto(url); await page.waitForSelector('body pre', { visible: true, timeout: 90000 }); const content = await page.evaluate(() => document.querySelector('body pre').innerHTML); await browser.close(); return content; } async function scrape() { const content = await loadWebContent('http://localhost:8080'); console.log(content); } scrape() .then(() => process.exit(0)) .catch((e) => process.exit((console.error(e), 1))); ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-react/src/app/examples.js ================================================ import * as garaga from 'garaga'; export const proofBn254 = { a: { x: 19326975765597999023026309242851464618295625967876195641207265702903971944714n, y: 63835113064883221423828958902442994957834669122245713027012799265225733314n, curveId: garaga.CurveId.BN254 }, b: { x: [ 15926258242285065430281020483827261910589109953358642697562602626998569607754n, 15482775443177023962384497625528997151098293635727021527127534892096530509952n ], y: [ 10937776115245591292644949547008094885240742374542777857501160790374675834371n, 6691169928456984700056024515478772626466687376966760922939239504103847739755n ], curveId: garaga.CurveId.BN254 }, c: { x: 18548825552947889373136407684636046437705490810597995577018381312170231914454n, y: 9890815383090898074006770716054740281870916546141552254207684185588486179606n, curveId: garaga.CurveId.BN254 }, publicInputs: [ BigInt('0x1e17db88c1d2e83e49f692cce4bb8169309de90afb2b141156243106aa34b474') ] } export const vkBn254 = { alpha: { x: 6763126530687886999315782887200758703366235230289874831627658839515656330867n, y: 12297948670392550312636836114470404429657568989657927437959695771502446445179n, curveId: garaga.CurveId.BN254 }, beta: { x: [ 15362786867599176251482538547160991918100063526460909721657878971551583339657n, 3804423004921008809819632629079723167970572551072432396497601916259815496626n ], y: [ 21885719103633717693283841528133243510750001708857084897139570082577218850374n, 2076817281717432063622727433912740683541778328445173073030513609350245776784n ], curveId: garaga.CurveId.BN254 }, gamma: { x: [ 1505558511994093266228972967760414664043255115544025409518939393775943607863n, 21131173266568468249589649137903719095480044620502529067534622738225157042304n ], y: [ 4008759115482693545406793535591568078300615151288108694080317738431649117177n, 18835856718271757625037377080288624550370480296914695806777038708085497610013n ], curveId: garaga.CurveId.BN254 }, delta: { x: [ 1497911744463986566314308077983046202449361313910668647770797503379177516252n, 10829154948357654897792444316512827659620136273388886760324770466776134105520n ], y: [ 10850392992008761830625471778404650447428083833210258292805429019728339148884n, 12593805385728178657844996215584371401133999503150901444097670307277076679963n ], curveId: garaga.CurveId.BN254 }, ic: [ { x: 8279781786940010385190155571855963988492685408361021424114669994156938727612n, y: 14410809027374663415870055712464930833085570569392210261413081131467855918386n, curveId: garaga.CurveId.BN254 }, { x: 10075286447651977124250383403562829564641026794366918560412684031493085120161n, y: 13393494704849149158598989372790154670517815409968589728896053397011959461594n, curveId: garaga.CurveId.BN254 } ] } ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-react/src/app/layout.js ================================================ export const metadata = { title: "Create Next App", description: "Generated by create next app", }; export default function RootLayout({ children }) { return ( {children} ); } ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-react/src/app/page.js ================================================ 'use client'; import { useState, useEffect } from 'react'; import * as garaga from 'garaga'; import { proofBn254, vkBn254 } from './examples'; export default function Home() { const [loading, setLoading] = useState(true); const [data, setData] = useState(null); const [error, setError] = useState(null); useEffect(async () => { try { await garaga.init(); const result = garaga.msmCalldataBuilder([[1n, 2n]], [10n], garaga.CurveId.BN254); const json = JSON.stringify(result, (key, value) => typeof value === 'bigint' ? value + 'n' : value, 2); const message = 'Output of msm_calldata_builder: ' + json; let tmpData = message; const groth16Calldata = garaga.getGroth16CallData(proofBn254, vkBn254,garaga.CurveId.BN254); const jsonCalldata = JSON.stringify(groth16Calldata, (key, value) => typeof value === 'bigint' ? value + 'n' : value, 2); const messageCalldata = 'Output of get_groth16_calldata: ' + jsonCalldata; // Tlock encrypt const message2 = new Uint8Array(16); message2.set(new TextEncoder().encode('Hello, world!')); const randomness = new Uint8Array(16); randomness.set(new TextEncoder().encode('fixed_random_val')); const tlockCalldata = garaga.encryptToDrandRoundAndGetCallData(1, message2, randomness); const messageTlock = 'Output of encryptToDrandRoundAndGetCallData: ' + tlockCalldata.length + ' elements'; setData(tmpData + "\n" + messageCalldata + "\n" + messageTlock); } catch (e) { setError(String(e)); } finally { setLoading(false); } }, []); if (loading) { return
Loading...
; } if (error) { return
Error: {error}
; } return (
      {data}
    
); } ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-webpack/.gitignore ================================================ /node_modules/ /dist/ ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-webpack/output.txt ================================================ Output of msm_calldata_builder: [ "1n", "1n", "0n", "0n", "0n", "2n", "0n", "0n", "0n", "1n", "10n", "0n", "0n", "75759116906411131289250842036n", "1443316740970346987535705368n", "708088064087366360n", "0n", "31894839170900604627010243180n", "26562388390640533846098233871n", "1678682860455561629n", "0n", "340282366920938463463374607431768211466n", "0n", "1n", "0n" ] Output of get_groth16_calldata: [ "1935n", "561151868347580495583090954n", "76095163897123765080010407949n", "3078964875882710626n", "0n", "68760071548346057889257256130n", "33987009017980255890281589641n", "10169520226989098n", "0n", "27526525353537266686222475850n", "14475456397330869216192753448n", "2537199318039088506n", "0n", "21536768652854740401912377472n", "61033740543581523820282161323n", "2466548432040548587n", "0n", "49356715888972701601325049347n", "69887821523610458575318250963n", "1742488265497548861n", "0n", "68106177540828336088045306219n", "961134836681944563222599448n", "1065964868903753173n", "0n", "1800806384039658546158952406n", "44097612892395787951554989634n", "2954998394940821894n", "0n", "57407696252580182379957914390n", "68043785987214905719851221030n", "1575697798130653691n", "0n", "1n", "64622861075918021861446670503650833524n", "40000715384012656934033607729992139113n", "65343516826393976703500119419n", "64215924997604874724268545467n", "988361220710881918n", "30419768492628197858619568261n", "27248300164153194572764431995n", "2977039154666701832n", "65685384868591218376868464427n", "70847639348750339988496276918n", "477777041053646529n", "29991939756641252358878134746n", "39295947558852310211017126572n", "2815628384676858047n", "41723516601424502403187247204n", "17017221925427596342628818049n", "440483370607139100n", "10413180469465695361837522183n", "19423959337400646488247227266n", "1196856567711091031n", "14918739433528640782272739139n", "2386255189434407583576372032n", "2110030772171629820n", "66403863065153192042460667734n", "26490228722781507311620127895n", "1376925612093868452n", "16095686441528704658448370761n", "51022389018232154188872438326n", "1610491282614910455n", "37997039872158612927722452114n", "76461913933066610895201145075n", "951074374291802403n", "71303405408633411813876113602n", "65378028046199379258519780162n", "2796976393851271662n", "66043194162972766020432949924n", "72668519642029141849369643840n", "1767421250104456939n", "34724757470958269778491338738n", "67907574914053181941994051296n", "1074861315591297211n", "57811416502141401297494384261n", "66717953782642686044297384228n", "619071555217927229n", "11747815192199388258706152779n", "39655522309044272057593243434n", "2667518659266923661n", "74545987263802105943401974456n", "25100780504941704736052597181n", "1614091262172996678n", "61496830641585942728225636367n", "47520662928915336127912320093n", "1483128622047069223n", "60688370891239308805053347678n", "6154252422157238786881911133n", "1595810747040934713n", "4083087877564984515505707949n", "8098795933662806280871012387n", "392529588828430050n", "14388273410011291023320103380n", "59643003630595652724715495246n", "2978244255961784640n", "73005708620970672578538518429n", "64274822400727474231693975117n", "824761225328685267n", "58979395441344004425345087397n", "50034285490796369376342018474n", "1071577406066675668n", "37552244383550540565443579029n", "66651519402295869947385119697n", "1816081760201573675n", "48020280081371249748563352979n", "19387797072717949389382225132n", "1075380445499260082n", "0n", "0n", "0n", "0n", "0n", "0n", "35717919122505863182793101258n", "38321232967395819819318928199n", "33653293845735846n", "0n", "0n", "0n", "0n", "0n", "0n", "60126610212574038899502857656n", "7521540037295293717633716927n", "2853604986499631260n", "34n", "21051189327279847889561754607n", "15679397574132606210591767826n", "2165541175263187167n", "11461504713279098434997837844n", "29843864593792422920685859506n", "1460931496621397613n", "31444402670555100638844582863n", "41564870089383627374040254466n", "3317275169749288672n", "72559701040108110454251376272n", "22887416934578586124987839996n", "233686850646424299n", "51667851121405518271474152545n", "8297160697759020633045233343n", "2193876459774314419n", "50048470992987075597478354517n", "7622325433377464914372402739n", "2354852892440837544n", "51371930649223862037533589505n", "79037515700470610379424985426n", "3103776711054728122n", "62017664743365054011497714498n", "18400895627048394641412939651n", "1348549913115407530n", "68135824164391051249850625519n", "66467776056179325801077769907n", "21934170737946721n", "43733194692565917370190335652n", "20871497235942649279957719973n", "668366294714005293n", "69461224576101086641240237729n", "66163212446743341874016516713n", "2187872754580648643n", "17220145241406859216639481755n", "16637691490800642336304328427n", "699908274655976347n", "63497807423928467541336180608n", "5826616601935275548523889948n", "1995878641893268059n", "45351336804917798268705814434n", "32809386436253774870015191481n", "2479634507910679085n", "29902151727900563245652302915n", "70978449320724687288838934154n", "2324927884830925807n", "70956000718854853515484101425n", "18794223695576985859644098754n", "851712710373510834n", "10098225054790962506843798879n", "23663666343921865703011477995n", "2539135702270490911n", "13745949463631524266514217644n", "70097334773007528061348260208n", "1449740726324507950n", "77747255839650031066990598333n", "33186206179829484467075523327n", "3072781249488320507n", "73980383885811324159893986758n", "1765445723258696625718806089n", "2271055079390534326n", "65413433113844994807777190576n", "48033870016967321544035758027n", "486427727733872709n", "26974899297726311987406093631n", "5590641036960446176988521755n", "827510576486023036n", "29009837304935242599458620885n", "20410410399336048506493809410n", "1954580703151327584n", "64135814011222089868428198367n", "56261294792918650387740643327n", "1226348411176360117n", "71834179960057214052393522783n", "46252419010406289556729694820n", "1393685374555389118n", "71368042768790547323904986882n", "66161706759499128280107017373n", "2031846388120562115n", "21220965229609488481377288540n", "63634474338013450603335409627n", "821621475859559449n", "18432973800914453913616171088n", "8237366564750917100218776918n", "3448970319177548904n", "51266071561401723888120442902n", "33637427514172279767467204013n", "3304964589143840434n", "38819453582756888614388081676n", "38995523514738195349996597496n", "2323381859757397191n", "60884424754479179074928199128n", "3834764671648885586861880739n", "864611594127789300n", "9851774469429652901432809299n", "37101389540039872112071709899n", "2559626381308197564n", "406646090122284731360238690n", "44652954714826373590985929530n", "683398595921263332n", "20271182213679030346920227775n", "37600328594433178897257972399n", "432396126057182521n", "4187404064813213379278146332n", "44537571235199588707429377798n", "3148695479824963911n", "25801656964836714839982503508n", "51572074862943493111482365520n", "1230107506438930488n", "51625253538057090130489675612n", "11815326077763625426679125713n", "521507079758837629n", "9648925458348520397354094791n", "31712274845777377436963587786n", "1997027570431487029n", "67411860089204789431616372347n", "66528411456550554620624110152n", "186478859944874837n", "61267275259145597446660035124n", "8554664316600082912178209665n", "2375445434845419873n", "1589782365755830876261985911n", "14834270454057237025174127570n", "963005115183332390n", "23249702285165109375700438720n", "20760791667651963569657008881n", "2149068190029611973n", "74674158355316816901821060837n", "13278131002009659818927519878n", "992778641153509292n", "8743794935416188942200722720n", "51445266496970909016857135378n", "438732749332832318n", "64511635865187456937539832569n", "68455428209776466334096458368n", "1196547129512189429n", "16652864649326843859619189651n", "47031229552259361752165531n", "1977848333533964373n", "32230433718106499209616712783n", "50152042404552913889735459326n", "2647553318887157906n", "15558003702184603194095500825n", "75789384763919593972512743955n", "3199452366147221980n", "23639206276595496029173201731n", "49198122874004051169498469698n", "3017499313473475023n", "14633623354742611699704494011n", "13838793228838994907197164815n", "1865567661799564691n", "63554437295278917743885851002n", "43774994641723817700539915508n", "2096263880799998644n", "39241367224191359271532780985n", "11996031360599781980224407856n", "669587303349757211n", "70309465524306380398946854940n", "69691793870844727391235380992n", "1097884931999290463n", "4880550284873697839328338960n", "8683184578595981266384193421n", "1704353262400573542n", "43209925421984317108056960491n", "71838424302727061831479195619n", "1719485935656079288n", "20281500369447070817728689103n", "7827101470501627130702651299n", "1802787150264131673n", "46990609747636025825158033861n", "44506561326339289883265865893n", "168363193009253293n", "72644600526598920979602995563n", "23734595505295435652505772841n", "3066825941193215846n", "35922864395887621958431954121n", "36164080296393340386782836739n", "2806406594668460083n", "9559608083309233656821926408n", "21435397197883361901646100159n", "1173438743001539534n", "45502332725513884072895701183n", "21110593816020485943815437920n", "2156839344197406156n", "14935455230205682855615996549n", "3176509029633635649806564693n", "2744065159326778800n", "50144289937074876149408247339n", "73476828119785067069284584679n", "1137921320963525519n", "7764782370318985672713086089n", "35186333034809438599544173388n", "2599319187054853443n", "71090896326220687050059751719n", "7138127862158940765217036726n", "2525413991973636711n", "74465662641034900763924596241n", "64800563131735459820423413678n", "467645211882593334n", "35429207184442884958891366618n", "32026071525343635101462583825n", "732661589473603894n", "53979236240639306101606255299n", "42289323195165961060464784974n", "2572678142594168339n", "34781401150182625703506517963n", "27502296245160796607775189158n", "204754437845996963n", "60295830689532650505249825677n", "25033548320502415354132760311n", "26918649856759092n", "53883044729840223319972205798n", "71229970233113264180243241621n", "1096143763692361182n", "23670625124894730163037915585n", "66188859433247255337619139871n", "2789875774976133848n", "76287870172839315742103539908n", "76696206429019592649532825371n", "1140810575629679716n", "65695197715200264171919419792n", "64578697338608806055715988010n", "1315508308085028070n", "78097114957711978300958275236n", "73435222529435448525954708815n", "1357585460514972583n", "7357385422266450818170168488n", "41750638133784298446701227299n", "2309087687582896396n", "59893979186320257893680148671n", "70073254756682993544223051173n", "3379633857316028827n", "63037751789054738563399308545n", "22112638657428976200628648553n", "1119955028522904661n", "17789959924300679578888409433n", "32036177498553475203925266628n", "3282049411090141820n", "28853440708133119682221591754n", "53037088663773523321481680370n", "33889236786700338n", "47866115906431522995214087729n", "65896044771509521496549322945n", "1356170216477027582n", "72025359186703704066599325205n", "14290937382512145681745832413n", "235291859370816977n", "16739080450814900672563464076n", "27155915888194232201712953259n", "2201285100786606817n", "79046757705903490925593572396n", "41590525534061554138727710174n", "1563993153777110442n", "58644351226953768961970699175n", "71513413355714071072616721058n", "771468756865502494n", "56315873417343912546874324750n", "66995041844358703653717763298n", "1564628505321775490n", "68742094005504029111318961475n", "43257881480227388188853022203n", "2827885137176633354n", "60013377537965180515452389042n", "22615548017942376680894051034n", "2778940717048846996n", "30216926479141873412912870389n", "67097866317972012436735650659n", "1001082522948099952n", "31879429787569811794175043050n", "57916743777618192263856200515n", "1477201521425100888n", "63117110331861368443138300600n", "24455052765578778318741183737n", "3145320365602131181n", "27504400622945393457424964663n", "18149654277116955082138788671n", "709865641588578406n", "51203413602847718278618462447n", "32871208476003646471375256821n", "1972541565241208115n", "79118404692942875097520377767n", "48815069625306356145460113214n", "2800168047740476387n", "27090046108651136752525050251n", "17050737426763583806790779471n", "1273566324033923836n", "49543917066569282928794484300n", "10290628042158833070532221066n", "3469066870558011680n", "42005113796531220880503084548n", "60064195130891515794312310901n", "3245851193684195107n", "37533982385009798315342336648n", "10267823027838019609009260399n", "2025345482262498605n", "34864622598934340124988581388n", "48347073555555495737374318810n", "2673244105079290838n", "75957016907360510463610401727n", "23977086141109407077488719105n", "732491745580907274n", "64604276948999648627686221332n", "3868070793275280858296301394n", "1873653426250118454n", "15570553586934053483564418077n", "13639547122371116255200424101n", "3229806347752382046n", "69627176750917937037127756524n", "77527130421629244161614984692n", "2205592855904802747n", "42359401661274759693285654733n", "15319487818905735149374624862n", "3299209455827802664n", "913752139298990313523799637n", "70257873178701883303322833580n", "3363278906733915791n", "3719386124896722977369262005n", "53915264239484240561994801723n", "1014563467864375643n", "56643381820560944379080271087n", "5451127454093963182673395845n", "1647155594727927302n", "74031948470913728924354306654n", "67046184840603355661228918718n", "730434808359892479n", "58832815659134274668136294794n", "44220894708044864609266466973n", "428689828657455715n", "26619728344740812354339350673n", "55972705855091654840275771393n", "597472825198654088n", "1452568843776109298902292527n", "48082065429135088437634332196n", "1047157723497573338n", "28285154322504134404521941699n", "56070279326493931276099147353n", "1647252454052220783n", "65027676769817342180184568252n", "12685362344487350979600199772n", "1402500493179000567n", "12668630001282077875777731433n", "55553251572483079593258301341n", "2382205981458202111n", "50473524893888759380289559496n", "52220217290909756763540198313n", "2029638412495399688n", "7502774623130712545083224028n", "73425515727643581896824036686n", "2771702310825972693n", "4639820922586718498241340517n", "46582679696898380484679332702n", "2620580077787400940n", "51782105270520932573551959292n", "74517889523497564960562458357n", "79055126752843995n", "10925640711936519280913334701n", "11947058347966705959371810733n", "43716694970268491n", "35453676805113974113471109604n", "12015889727201641553493717139n", "3275286259969106630n", "70932279409438704808566723573n", "47041530965489511382629531879n", "1256401409005218192n", "46895749660336733332848035754n", "40261009687444665011442182710n", "1306436215925446460n", "3904962902077066763622365736n", "36103992387013546339910627073n", "1329335481346702678n", "57853677844329075763360620729n", "61001619991056325367390311148n", "1235032555631976826n", "58692146235938833274542664790n", "14589363842493324627243766856n", "578262325105051129n", "37980379958779218087580100271n", "57690546822788520479506631792n", "3164185857728705638n", "45598806448478931852264970697n", "29033375842093843451718686864n", "2812217528418815016n", "9663261157782365056384592697n", "44620211458433011608252253672n", "2505651240889113840n", "48502340833312690180905327065n", "9352266604910376416980234379n", "3341395763378874957n", "35507650777754495555508745994n", "64550352482963692428938364344n", "1749731610964724298n", "72801722493214401326730125326n", "55956888553336351398608259633n", "896001678647446033n", "30516385505393014949750902877n", "47315718952109319710441627150n", "1388483706936013349n", "32381991427814516368016795653n", "59696292811917044385937202833n", "618914335291991958n", "40375787626773409929606022175n", "64734613933900308276892757597n", "2556069305521992095n", "58654528682801174800851099376n", "11593522535604870003716248394n", "2125230714317219300n", "8061995955571015171488513388n", "47983447012081651413970228934n", "855542739847145422n", "59096469339608638609245068515n", "7673808125695463322887566290n", "1385253448294382073n", "25340909062918393540888464015n", "9795256553635962173776771050n", "3012016973098277348n", "33467611330524938973631050712n", "7543431037219165063475505539n", "448151223182465539n", "22750106248651778926545160954n", "25740569688692303261800730858n", "1075240126364963450n", "56338203997489686691769068850n", "62119360873725897456686490753n", "1222146081347045140n", "27338323756657113133884361560n", "21141429927442113006964516579n", "462132336382397961n", "4987343640321990641559943818n", "58829032105334349895296634715n", "3177465831253470688n", "69096263705896112247403554129n", "29492604434954899550510960365n", "304239915265350366n", "66375851691134826136210085333n", "44757375154942980538763091305n", "1112855489475878924n", "70069037784938962740775503666n", "12717652252841341839220495543n", "2918096944668928835n", "18321962109897171704378960368n", "61813672462196073792006627549n", "2734946711892636188n", "64219561440442257822526755189n", "8503031322535266331858567242n", "3223902208326320319n", "63116174136664698830215774786n", "2759322304337380924973025029n", "810068357014304774n", "15698684552711747426349376896n", "65762055793295617462571353752n", "518270689795187122n", "58150828468103287645001826637n", "77452960139151639571846482697n", "519559051146038460n", "72625801975239649642036163890n", "39078044248618521225250269350n", "2190524057325078928n", "27770888055874136986828633484n", "41773083279140557423975570256n", "2854828164966176931n", "627836434493841003902237785n", "77928664588771202997039373627n", "330865869276931200n", "52935592469577214913105764520n", "20197659873511917804524429378n", "2125370194946441846n", "3460074836406938711660958301n", "52820564261229479633548811299n", "2919129481241566745n", "6675772908450017734753351305n", "65258735248680451317985314824n", "2950671717077079181n", "6822322071311459654365919975n", "48497518547901827883287152419n", "3243229764836791767n", "72937532385990220357716354648n", "19074513737405788027838151006n", "1297437039234841476n", "75502921753638151385835217223n", "15306268504859852745422227938n", "3143438951510181753n", "3947335170074803838440311819n", "62699530989773040321915910090n", "3215975868729087991n", "45236352461588188769215285451n", "41706782526887442329166221445n", "3168773580470738009n", "75285535419605148224367004655n", "20481966054007305592119557920n", "1679995277184070400n", "45190873120635261257451746066n", "47696678647110719375889237738n", "2068610507691385147n", "9915927934978371252308896949n", "31159305954355174048281405375n", "1704598723840881213n", "67338469563962359211325034773n", "41738724864530875640824663606n", "2293929193371443079n", "34807312716413150046069343319n", "70801066094208025212394559646n", "2518515824100660756n", "76811947889156401932764711781n", "43817729339652461426643528955n", "2039489180470709457n", "38477432026452102589204844897n", "27527167249603525516926315406n", "1191468099071291308n", "38041851156661687253492123536n", "54288163040365572080441140556n", "911480122138689106n", "4974069079367885339264267782n", "28880616750574662115261710630n", "2834730446537796035n", "55466841778289154595312506036n", "47524577058256910308968549882n", "351449977223840700n", "62311990134227217524354071274n", "75586193885025429015569590193n", "545412183548073756n", "79201290258654825630711427638n", "77524373992410852423354047680n", "552010389188782621n", "13584773290145166716045719634n", "57089761411485171751249424952n", "1694608384682621747n", "29538886750825184946212760314n", "63894150012954354476012028271n", "381542434687157486n", "18078760560177937565267140464n", "74003801426748288272147648907n", "42337564080893923n", "76689566315090503029029632865n", "77474971819185712518886624915n", "372114354534855369n", "3011898200892081576513307862n", "13966070005688554503624007786n", "470413759528293312n", "39357561183949775040925825237n", "70682164693568724918268906963n", "1376182782398783885n", "41538213381429219620578361408n", "42254768852299863792709628627n", "3431309948863311296n", "29234390314689913487082552719n", "17916853178952663417328241903n", "669291203853282419n", "33249562629014821971547667642n", "26222791431277453980835687680n", "98534970627714358n", "25021648199838864664290068537n", "20665859250814395210947344246n", "662389299694120248n", "72307113898419621240789872204n", "46323053668872253004980165076n", "1041999687571616075n", "8985042666921921648283132643n", "74513886773734802806022422301n", "2603455779145809119n", "15411135359682619522278947280n", "27784420314858949438220006926n", "450671277926568052n", "2831173742809690598851605179n", "28386483802658122108161613621n", "1424370976519373932n", "31198231619878444700423211860n", "42295311569311653123964908500n", "2935759999014605210n", "32001363507887263736668102660n", "46912833713119636774180995741n", "2092237369418424823n", "78656477190391127646333527543n", "41056006364555863740114989146n", "2171263570612200061n", "21422129487009930658303224502n", "46206308103083011878154386775n", "1874554378158482533n", "36641496950703925635911572554n", "48432166499307362117455688176n", "362387825758837904n", "27092632894596570716463916204n", "20108561967338242154648349930n", "1880193076762165445n", "9593372273263129574197363679n", "48018078028931030587694756618n", "542974594247287387n", "14814551631877080383283532261n", "33496168748765220079451008919n", "2250598863496646490n", "44869586855816636221572912809n", "41783360501362407212785286614n", "2362538758680925884n", "47048981182078605465642165702n", "60518795030556750835816928982n", "505511636936241905n", "58024262056741504028876642662n", "50138980925793649225004896980n", "2579777888438614723n", "6523114729709277602770738046n", "28358393151053570058817793343n", "3081381986289034984n", "15900191280315068679181663660n", "48577168032374944428952731072n", "830974214184407623n", "10274561196236136318135959057n", "26148664358554534185218032007n", "201377610767670386n", "11368406426935765376362633788n", "4122436782704069458424072833n", "2934079973878820714n", "66892750247258968804173976659n", "76380379537218876441475920731n", "3380019238411335234n", "50717224916942478279258173891n", "44470393688322556765105136550n", "1813355330674964836n", "8515532742277261388949469229n", "33221912074775270762895168327n", "2646766706385940242n", "11140136119772415355412357379n", "44150773111766484868566388647n", "3191354614138223649n", "30708778779429297397760149496n", "67837687252340085721524474101n", "3301367800510383551n", "10954599956402707572521260184n", "21030000566064580489911242942n", "1828905939385555740n", "26254579696623038244113820321n", "76089322519690535032690356215n", "868757520992376209n", "77540171332511416804096348278n", "10474304059709005130776549459n", "1665346113039180866n", "77071906535707552468440337167n", "76416817616469856915552001970n", "2619908781683664602n", "40713576015254467501617369989n", "69174809057973808586596761660n", "364462143474967775n", "3388865641890523266901884229n", "46510386965164679950611269041n", "2868959718371388528n", "38291153048032659818161082470n", "57992998428591158266306092260n", "2140250223970187383n", "74674643030181299821451279762n", "61603307939095484817637012597n", "1805808601029218696n", "37221838450591689221386319329n", "68301391492878568825616976727n", "2237000809794684762n", "11407285364976644693945059208n", "25348058182926100240298110509n", "3114508241594272017n", "75356748694855659604450932050n", "73487079967561788811810515931n", "1490776583857675442n", "54218989991798315687885361450n", "20703329376060767478344708910n", "2199487792587152210n", "75111061944546058209924381826n", "59244444067541601191271416829n", "1581429188013860604n", "52660822561915117683975147831n", "47783082248718407900747485302n", "1369252091872015433n", "36417458042350421490821725117n", "31829247002542379610343848353n", "455784377300586483n", "16833465703461845689857266397n", "71194569481351283884295739145n", "3189866189053900612n", "65858387085894768841721032786n", "42191857983305827191840357582n", "666015291493419098n", "27916318777227697186981470587n", "32438460617546390776125662122n", "3438854808891043135n", "41197663088738641800559183911n", "55140791537758229983041465056n", "1162917064515090408n", "59276808448795540978821008029n", "55346073844723874343240998585n", "2138546228419844587n", "29861692804477614266603259375n", "46434932953097909216915612814n", "2786750119186865986n", "2914382294411148824195592597n", "47257202751523172671381039762n", "108099711483611500n", "42513194204119630092428609239n", "7009779828784113435151735800n", "1568976973765903017n", "74506942497632859791810397801n", "75159716442684547730197176733n", "214522106108977303n", "307807623661151452830127704n", "69355418870826927485148435899n", "1716229337114513433n", "57800790680731912804700220994n", "33865695886637783077735975519n", "1521543041885052952n", "61900084065708307372472439490n", "9670136848396954396035168772n", "705486756697563485n", "65695693080875904861430309269n", "42258749277647240519914054375n", "1610937183743514752n", "45949364456230722028956610312n", "71318597512050155765983898976n", "1419180020927833749n", "16722582418318977044812304850n", "64520646005354913944304541442n", "1349757657977694032n", "23453477023590312415905476662n", "20988708348761074914346191082n", "2734679321361253617n", "3531335181910221180679210683n", "77069908679139173478778593856n", "3209489805214655859n", "15423046625290420432194363954n", "66544315732344216335597482829n", "3417056483929987132n", "23412416307661786237706973063n", "52684903097691240819445939916n", "3087013127443362602n", "59516131369415164617233433764n", "22552284363447521404574779744n", "440598570727652332n", "10078101871820643773664346515n", "53180025648864462561753056892n", "1238481677425258091n", "66978851386839209947975732205n", "76469976691658858609518100317n", "2669015410315668427n", "10462115063986428235746660388n", "20612418707380044137824607138n", "913149152876393845n", "12896643578852573199148249630n", "65916513826164228515537693476n", "1689818392090951394n", "48812924094784749209418690439n", "21075229147504768099245857693n", "2023634641390620097n", "46841988916092209879920999223n", "16626325630569367486087793088n", "2520424161966279659n", "66590657955425334169984583445n", "43137455439307899619378709852n", "119691013666955759n", "59528138117541221723219264069n", "6039238025418276887251147184n", "1423016249189720303n", "74476981597135756778074726485n", "57871369440317946035711890073n", "1799738956519083373n", "61169922085945703273845146359n", "58536191609701145724674103544n", "678581665969651580n", "29756753901276156089801861773n", "37715386191992628222582900313n", "1839293100231634062n", "8545730587160341404066690935n", "73310320371102040457790413928n", "2943087579162219865n", "3592679410576312851945554995n", "63768122222562308688415150519n", "2852416365710961566n", "65734466853903663026216615808n", "75611388663630224651662180524n", "3082245111526479768n", "42542028447397082553823280434n", "15266201170439359558184400250n", "2959319188559780389n", "62084872176674708014188872797n", "49471685826369556510350964812n", "3044342635568692521n", "52766810402300947123818998320n", "57464266928926410524441305379n", "2678492530248725715n", "63759940946573266111589745544n", "1239422070074535035165804970n", "3011362073292317527n", "5312425357216197805891517417n", "8604490350019536611169668726n", "1278264119461231226n", "23413740732153092734953046582n", "2351234330786062681522357509n", "3063446156461791539n", "31192263866697541487222909336n", "53213425910476786883061415945n", "3388535254355309510n", "76222049202953784940228041093n", "8232814450668299001215927167n", "1010418058221874517n", "30375045069912390061370886372n", "76858962311200653420966476141n", "2531834595530804919n", "72838406196796824316965387556n", "16107338032535514271932130242n", "826038058455425888n", "74047817357615679402104886971n", "66250974048331219261305648117n", "515372630941459652n", "49140383045734318581810247391n", "38552127106329617678305826510n", "1791730195926210707n", "20447547859709794457924179129n", "52480964595913357482998508931n", "419726983098458687n", "20434453705733747059793719688n", "22732218969594988459804019164n", "721740589738128975n", "63178390467425871623450374916n", "58781628951232066578669558088n", "1366096141210552719n", "30310055907701667442250131224n", "77693499391068805405178198648n", "2419127900721456602n", "72238281634987295743046110639n", "2759706666093555363424148875n", "2871042634310332424n", "58186331935313172107712023092n", "73009408672165436946758189888n", "1138172672402058824n", "45794206921224716587506811973n", "50074044364882080121299615241n", "201200847748951804n", "41753381957343686084038148154n", "16651255916405576823960096368n", "744771251876887027n", "6397253273640502791149864078n", "67730045189242272443620838555n", "2723512022810421168n", "20403399159094844095476748628n", "46114852246774129546878110205n", "2163837250026966482n", "63507059223060953171650485733n", "27872394523028449929373211791n", "1266384674015277092n", "31341532803878701385180273244n", "56274201404580685976997533743n", "431470279371342601n", "27146401285505116697408502780n", "10909809704395711896795601995n", "823727347575104764n", "78157451508256479551851793287n", "7934224114897115965586132150n", "2561622534344592225n", "52031374290403822978799313483n", "75680335637831520600351100052n", "2240257882085839580n", "35818819658139744996071875447n", "62532608351434239965548606901n", "2997209098633992908n", "35801460645260708494826382933n", "6962199370752725968726753829n", "471191881884558376n", "51494347593311565178389849721n", "27959136057874496572927068138n", "2054885609386822401n", "1903400454085938493722464234n", "58252527737465224754126905441n", "871049256780466220n", "62266126172301828292957015888n", "29942402306346798464030870789n", "2439682690873113741n", "58828716449315637847726991566n", "33586884830050665361484057496n", "1850240284198082738n", "57256720773892932068692318575n", "43906884659388043006991040937n", "2567264210368699586n", "37303325532466691611774319975n", "1023775330119159065320215646n", "2970467943548704391n", "6719369853840095911284134964n", "52698184868933442534169228704n", "1590449702912303791n", "9163234315649800019839577781n", "5096786077915756093838027866n", "2604014912333559946n", "22626562141910724736547894073n", "1221514787490597839172086118n", "2021859363658276538n", "29343228808229785648243946635n", "17107161597392558070179986947n", "2142074198041769333n", "8295437982000203433981112803n", "32281278698888589789154221048n", "2261976931796110908n", "19003064635652370381400548000n", "5388386401569756312458644562n", "3154333183807592746n", "57635002029571841636737463711n", "56991897992879623406006006725n", "2842694143682003853n", "73379904593405458046663259580n", "839437272553377608023038726n", "3093165198442302924n", "33419448607193509624332386145n", "16740311080067952025303937955n", "666860562806181637n", "8797571923563716660075774195n", "75022438860744435659585766685n", "1558560135470851650n", "19713896344694960627284542368n", "78388507052884523368130573724n", "411547793569600371n", "52610184319591489722152436723n", "58886726417514761894083084350n", "779286101129650524n", "30697463792187334469128124748n", "76836636996796091386778801556n", "868461342532092659n", "69910862714025895807766899173n", "51405542117679167872600082463n", "349470313771420560n", "71284241241602654693194940143n", "7305568034139166589777830792n", "2498747200591008033n", "67960797371315801691053786599n", "25825479627169106615506743060n", "454178144016317938n", "35798135180239958015829265626n", "23385623537498663178814541991n", "1668508428339305051n", "15450665342638866022354076708n", "1590106122468359708599592949n", "209939085635224246n", "45146454297276439294547281947n", "71363197518122470395685282523n", "209021609080779353n", "37805135405124328919729060254n", "46916624974206570529290830921n", "848835529094356500n", "52127928532313726409293511873n", "74341195298303002847160668677n", "2836594795507658600n", "21372610848069974970714546381n", "47095482837411596424060733004n", "2644188767312235257n", "42696308717032907609441318200n", "71478263091865254540527492446n", "580612364877252066n", "24227503011457277739411398472n", "46210588161299166961443583909n", "2104513243231016467n", "38286987706753654842254500763n", "52819390378718994903041839288n", "2559971158277261662n", "10804049422689166087510960068n", "78494177681671393465658693075n", "14482037543685577n", "45316386224024264714051962520n", "8077236619578691823690243326n", "3134255926280338435n", "58234835865881258067775424985n", "32582539715376623121568222400n", "895535831771370236n", "70554522419104669983576590653n", "40229753450332894247180991320n", "3235640053820685715n", "20050852574591066448348962700n", "63154847355271958325521981335n", "467978477141038832n", "23115494614834363321936638302n", "54275477858894789534235120579n", "1729059077109549892n", "2643222253937861530223901503n", "4343013099917093534712467976n", "2093250350291324334n", "26606380640809280595919467519n", "24158225122809122341718478436n", "384623299034698779n", "74889164947469453919523854509n", "57684567535195905731154589750n", "1155881533367487150n", "40449699793338258794390721810n", "45563605053974069206983967932n", "1493349482130193926n", "53198779688378832727006250273n", "23250105681044235044335219173n", "1649629209531042678n", "31842301972458791163037611310n", "54103172956148923849538705604n", "1853082006782289707n", "73283134292642541157328722326n", "60011977393637178105550407258n", "2931499730502310317n", "30363774768400601902892824896n", "69784527858977659878014965306n", "2699700013359551525n", "30143876784681103984444940141n", "20508010382725323248422071352n", "1472036335205806581n", "72685268086241841913630448820n", "13484287640917155024759235656n", "421919482836501604n", "58336665028159633068676496150n", "37899530871095451514688032059n", "830925861824953119n", "25034909887778048695729760495n", "6186382813048747659882138994n", "928295656744287075n", "23742999482526473077193706109n", "38681524762823880972818454723n", "1037267958137901699n", "75848820697595803231237834330n", "4098133930661194465828731453n", "2484592940588499869n", "45229057029317220478111498771n", "55686910073377115986537207556n", "2974592459022975650n", "9058824958434584730691471305n", "3489502058924586487278999515n", "1985538445731248079n", "14034347138268021040571737620n", "22094509985004128313979725457n", "1321434542301391881n", "17216019289274156022312124782n", "65908201923726532456265422977n", "387610774042169114n", "29699496552150641100894659868n", "43552700176683532671663646633n", "305525895851406027n", "62068283835877161864738460092n", "66163022436031594737849199513n", "1671489056967612477n", "5806077789744302022830084009n", "22126371298319875265318066168n", "2973075530852635513n", "43508686549770752780288409207n", "39960107195405145189624452517n", "3021227579398645734n", "75958919635020929694389722957n", "14913897636015670404185010029n", "2882183092458315590n", "24239404766805006701421172975n", "69450551382041986033230454197n", "629979785699424851n", "47715312965767193925496266564n", "51328287208106789864582031889n", "1994694450268216917n", "12878968128402785600925987432n", "8892728961399753099629106451n", "2189564568474803348n", "17841277261874434955985363634n", "23255802008382153152915838079n", "1299631183736247307n", "70369295004394220674262548695n", "41703500013750845131767430551n", "2515279718642012557n", "29363803518729226252949864837n", "11941978972714945652777612780n", "1864444849178365249n", "19838910496936353855554382505n", "63526654617675483693289584781n", "1386561621225388054n", "37964054821976413036136417123n", "14531042297004730862055294756n", "1592174811323575228n", "17025415710900400219439375060n", "362574756192905655380951625n", "186982663000383695n", "75302946272320992428390907104n", "76356571252613340602107695667n", "1005406788214614232n", "58429545482092547095478867066n", "8783598735519438107774246954n", "3449009450489856852n", "52421244757199560525245430831n", "36745113142356116864221402917n", "2011028989323540641n", "52389389340233786555192956059n", "48540948198567585375080843793n", "2511738896308209966n", "62948973448903767233283645427n", "78581731009485419534613750974n", "2631249803991736511n", "15700178914629731044995270252n", "21825209006850516132399941848n", "469426094359884098n", "45109950384963150442992909517n", "34709270486045260410251674804n", "3227700636384978310n", "59508455528169337110518969046n", "7626842288771897454076798332n", "2837142952242233831n", "78154898100541067453790359715n", "28712940925290532622010374032n", "2005548120880216529n", "19676819626842762742496321363n", "21494888704510312646126358022n", "1917432403713999314n", "35348767509581898437000853095n", "54404372638473474714277538548n", "1418295384476104455n", "2087534038039694873601959364n", "55492416744530703076122435501n", "3415979290873032604n", "77874081666239317555289078970n", "64693269821438151662321973074n", "468500022203866114n", "52183552801284363909457374676n", "26386627404911694711966206173n", "849932193222808822n", "60880246718709527470179169635n", "73275749658065911543659109078n", "2835936826164075331n", "47034978948350796174151388655n", "71774550150782116132727222082n", "2957236831646338670n", "63121833886036603562738575495n", "23473953357667857038757232396n", "709268300106945760n", "67565011137450891785645904255n", "24476510070022540670394808047n", "2197500443692989620n", "59529365216756814354926446285n", "62380286296544401614193824725n", "1797665767653557658n", "65352576236492901270647039868n", "54007112892683927216806385747n", "1796075374294915397n", "17840563634584466359434584144n", "46203718678613515530978507404n", "702053810505193011n", "6133701316708198581434709723n", "61802938904865726983656435299n", "3001276128418418514n", "11649452974115692944272358953n", "18473964874994391830987882986n", "2086271034138195481n", "27934361651981769617523547350n", "75412934231387879572695859186n", "461672875728163553n", "2659961698397651286244898268n", "38244585026297070186059616261n", "3371488902807027695n", "16205200667874612181106188684n", "6520317333544879950114099734n", "2490923463723046056n", "66034343348095027053141749239n", "13522171761978136875076440765n", "211626548808403729n", "52060409492746050106971031742n", "3493375676170587510122635686n", "3394236868158496257n", "47140116537527183288446191137n", "26402419994251877186703235784n", "2932509761218506683n", "41718577718458247425998327137n", "72444125720253366875907105723n", "2370720516004120360n", "63763546849180341189837833587n", "56383249669741657007269755446n", "2772609748811855948n", "30673155381064993958540435457n", "58923421149810821122915571284n", "2826147464537959677n", "2437524155719427333248486827n", "13523745438577697843652059309n", "2255306498837633258n", "66617913651732723895666550762n", "800383901932656375981050324n", "2369057816442019000n", "53894023794388536556779913700n", "43633381247568199322500578225n", "1622058361920748072n", "31610597297695602711187104065n", "75047413064993937787913175675n", "2532518357458277794n", "66943196821272189971919216455n", "63057632269388325855862697967n", "252919094746701796n", "36093617934864267028615495215n", "2458297172936844284200172721n", "2861973034148611365n", "35639326827089764975324431609n", "42790455257345625520833632516n", "2416491183110698117n", "25453911219236829571892475695n", "7792114184406477060828720050n", "3256395018257219594n", "44446878573785568457717214835n", "31316823799089969829944488381n", "3348254446631709920n", "12075675278480009463346998871n", "33336621394122897171138216323n", "1761645290764169692n", "38936491179522097211601163974n", "40756936871275705147530952481n", "2239620312855528769n", "66166234417862875439766591001n", "45961753617942718644070346235n", "2545432639028408432n", "27071931775260190706961952445n", "16791652622063002274074642172n", "1351810600008793720n", "8734604468994364132650578395n", "2915643774972349972943503710n", "546123555763251031n", "40883390215425903758829895197n", "46075188532687982090196339471n", "2037883374560027081n", "1788529744899075811496881871n", "22977601030754581206369105722n", "2052641684479223112n", "52403270166627919005596848880n", "2330881363722503207702297453n", "1950506519094245230n", "26974012086112717010353138814n", "69257122863702421096680142186n", "731421312124744837n", "31069884618093040515903738825n", "64922032296511662760139295040n", "2654253976131730717n", "12166944124292618925625599356n", "59407826445782768214824917874n", "354147487414166550n", "74336686733791433900827528675n", "12704634481538804742936579229n", "2082676564717138885n", "190n", "58146038485323707171566360552n", "79083051845830931429793398812n", "1253760413372422709n", "75585805608841426332286895315n", "17454071065969374047751520578n", "1856801283221000835n", "56347371123082155623989904211n", "52625756897582785946932954415n", "1103484556810393055n", "27404185422829405492475499818n", "1419552461670775323662566720n", "3431535685290297040n", "10240761959601706862708901917n", "71665724585200281475617327049n", "3232798557396947874n", "32919536142170844080265894843n", "27634787910238436631971547080n", "689759514785002741n", "15431349741815244232301206308n", "53845586976664022319541168221n", "1583044030122302208n", "47825067986735618489429772434n", "36933954632637013701382915058n", "2061889715878943774n", "8977310916259261225384223331n", "4538091340276567216050541897n", "2974949937804520552n", "32068898197860866225864499204n", "11944297794698583544272156441n", "1942470514051769102n", "16232887649510996786606289763n", "15259493580801814760566477085n", "522617557584553779n", "24242596953798418019519661501n", "34675681500323328218631423377n", "2626688210475495912n", "78740174483351451096333088791n", "64943981386376195937910130384n", "3002553261633376435n", "71321212497283823630152857278n", "57107096638064759035770959417n", "1525415424337039994n", "33592124231316161392746859369n", "66360389043497290172485164153n", "169262401730913852n", "67472003684398719335655699957n", "16789521379035350190464748508n", "2131762421966585515n", "66631783199370161347508379926n", "48925352076915955304942304087n", "264237490291976243n", "24342296347779296789258245457n", "43293722801550027940585947288n", "2184523999681911728n", "9355802069694208050316076397n", "35552089219631962733889470030n", "3012875015446218241n", "19749370490527515528697426175n", "8078386931861545908004277048n", "484548262348581637n", "9197680845227051035593920301n", "76678845496561933550816162785n", "1006587369936993775n", "16264558547638181301681301031n", "77659436542602450682090346042n", "2549030864566782064n", "23992787444587661702047865121n", "15283574111017964877795482274n", "1010500590098381861n", "36081283464794391834173091918n", "74713339703559068643167768213n", "87864425149724657n", "15509755852767806607741504203n", "49741860533707809781906740346n", "2053665582944552662n", "21800540003051693165872352300n", "55295746887291089518396498874n", "2979094345114374943n", "11846584694067264521987247663n", "49031890130314527277927146925n", "3053072831928300240n", "49870471347364999860446391462n", "60351156120295649092916522340n", "57434309920295622n", "51905526990545292008889846168n", "35741421582248014414699395252n", "1021827240168947429n", "16350288651927207676427341432n", "48548588913627635520822500823n", "2556960523655499318n", "39061623507343320271115115845n", "38947970321306063422821592330n", "2525216560431056230n", "65177147304893778229440396619n", "70545257645069117487807391489n", "1600567512488781231n", "33331224951106722420313772928n", "38583179480229318101782748287n", "1817415503412264076n", "43931562095456763346512920739n", "45993143967557989986350621262n", "1013785943641285390n", "46300841465540867353476664678n", "67952189225824325494911009881n", "1883806626142505323n", "74763953209711116608083413573n", "73395076121267231351266442748n", "875683814313975814n", "23960570645093608799064342076n", "36737884069061207609010160029n", "2740282725978910539n", "2348460868169339519816282219n", "59294276502368234372728690209n", "2234404830781012457n", "29326696920519891523554164108n", "46303855242526653100651128095n", "1172546639486712237n", "7729537530476375227332351839n", "8564566731713324385055420531n", "1479853701561506444n", "22273291075577128615277532352n", "73656828782504352218789556241n", "2308987335794616316n", "14359470620000928077518163171n", "71961130737820208932903249274n", "950707570385670728n", "70317507071845790171587549310n", "45654920344570326674633769038n", "2650168593880186613n", "45738429799101288017972815601n", "43778890431815013310034329810n", "312650173805915283n", "59759032808483205201660512612n", "49166445941564648520976910103n", "575816160851551719n", "41099033744600704768583815842n", "67643677451426846496806534446n", "2744110069990264553n", "5427077521225540080527062818n", "27591683040195514365023584328n", "1814257385547611969n", "43890769480671665778349573612n", "25702107374475025393868297533n", "2665391419850264467n", "49173530067968024446609831742n", "69233652337477869916623889471n", "2973651385942905178n", "39451576607205851507235401000n", "65326357252788810888449550413n", "2328241568819620138n", "7187030532193362998811241838n", "11158043907775193412625503465n", "1887168135327759363n", "72093988836508782933530929396n", "59408618785876068844273516201n", "1998979553140732738n", "20436888483045692091969328934n", "37236965238760796085670708990n", "2982240668332065019n", "45766566944201297703965941735n", "33134417182815170607111134530n", "2256938019969749699n", "61095014957849456939456497149n", "5166234805292214141604288719n", "2223380807107784804n", "4407612794594263685713471991n", "27938927008707740784778705409n", "889822472376617854n", "10586000171735376465147370484n", "11688046614136879282493614768n", "1673899149118569188n", "48568524626716983467820586640n", "54066530547892129113282820943n", "1257544179877250249n", "70430239680893778037863498084n", "67050853132645903854946409019n", "2548118935751794404n", "41828468840963319821789084190n", "14275492751268414444663806553n", "1784444490366165065n", "61852018693496828660952117185n", "48406002847831614907905133809n", "49483591444929780n", "54427537761720246076956183538n", "41736602958902949490055768838n", "1954646608479060360n", "60934769075649772007484314209n", "4723248530441409773201893998n", "3259834508477438622n", "16778379388406768302608844589n", "14091941761246911672273283575n", "1362843677097285540n", "20990186444040307549583297890n", "39850655248017325132808795637n", "3159948251218994501n", "22841250904644903266547583091n", "35884470460139378173998471965n", "144997960402386643n", "73988342422211773824311060048n", "25430193174058044426248161017n", "1511499341976026028n", "41856665278828717622897473021n", "52430814625940772563313528979n", "1518969462082050494n", "42785280606159799076021378453n", "75641406683588400312731571380n", "354558010400584999n", "25777665187274443426345962355n", "52569759362487685340322204483n", "2660707269990640271n", "39456006642189286944561721406n", "64095592448568371575360918624n", "1623622008203944130n", "42823981658558488340963830755n", "70857240021552825619139550212n", "3338694247115466605n", "33528981497758066103123618956n", "52174717566293432033940167575n", "3285250213548536505n", "49559726527714678923168862226n", "35376383273863973001561075247n", "1762388272055172875n", "4963094059256542135804830802n", "15251461935798611072932258838n", "3043255521973128258n", "23415022784844915519999589288n", "59120161904093027011464662035n", "2353807276882257604n", "35355887041205290611693611623n", "31669150297307261835976265040n", "872891098273185795n", "69193046798683036289275806803n", "42818302823254546309613088130n", "3225904969635087159n", "22611614040816481524272701347n", "40802292074751246948780577207n", "351005661799852441n", "50079803252014276007292589026n", "37577116329374038939872244704n", "745466466224739689n", "57943789902740370489195854856n", "59877164372411435705733535421n", "1440407261307873910n", "74147961838302268113193936081n", "29475004529393168298384526566n", "780455262674149785n", "51306862863296749150663360555n", "68603117787295236727112632820n", "2702997921905430000n", "64092864258708121960742058121n", "27968741860257802705491575837n", "3395033579182877453n", "60896409955387219924723371046n", "72447564289478669262616529078n", "3397060291617780594n", "74466337456436624238136742413n", "67930138912822600973471222439n", "631712168137915134n", "34699941264140402915854806555n", "31625108777123266428395503959n", "662594291726250121n", "10374418997762067141299032182n", "74831531166323756923345310781n", "2614948808475244069n", "45617012767756761370444767987n", "44141298692376594039790971629n", "1159181502462992545n", "47704071339495071156056567054n", "46834594498992945383289148503n", "924797511068572088n", "23233351571238696045632767797n", "14376771187481317319928510593n", "3161389881302592208n", "68221328884209068946490350230n", "69520921081111912732122080295n", "540294970059028553n", "49382519270729084009739959234n", "54272649767268320797552878520n", "1762246401423958252n", "65695480183764337135892820912n", "15357314953562507969519535878n", "2415017092301124519n", "12568989548408666155318764896n", "10255298595269749256814759758n", "488040996573952383n", "61804111086379855885098583520n", "11271058357408383599116781502n", "1329740533130250248n", "8039933903881517002403963857n", "7118558163468937314455208936n", "536489202082349116n", "57213159007120933607123362054n", "38389263848304750695624289842n", "103890218507147410n", "44837586220950001446991442272n", "51003826059731215073098356499n", "1055564410899460745n", "36382905285088913012495727205n", "23789430840439822229827015138n", "2409250954595470494n", "77553161939176686247041732803n", "32075777538535189410338696221n", "308581509063990399n", "75123827789249657112621112140n", "63466606458376146979489895003n", "1559915864837385203n", "65374245818638483805981829412n", "59413598642796928072211645702n", "773792966334851501n", "10975404188605698335218119359n", "5937731821461360820250261750n", "2424406683527655198n", "58048034440511231692734658223n", "38541497666142538814655959889n", "97237747168756283n", "32114431512100683707696744321n", "43084884381938054868610618438n", "53036606161489394n", "49303822531142933183499847955n", "70757204501375068333736255366n", "1090664900942087596n", "68973060792876598659428050587n", "21709941437174734607102143168n", "54515769952578230n", "40278884731265681742344272236n", "34941403842240889411044059527n", "1414736029232632973n", "60344648712825684665541778621n", "10769790997010708809402622618n", "2270992661657155596n", "42362387786284445354439187653n", "58156800386628045782945926146n", "2818686942230697090n", "31419723024915919870538049034n", "18005463704599391839628874083n", "212688156617827815n", "35911328625822934725057123638n", "17761454535191485025880626131n", "1761977155017563514n", "49665582664754517847870128980n", "39319816430240621753318268462n", "1491136817343252047n", "22260823695114013941955374538n", "17055513051235397699203988336n", "1922191265581876891n", "14555432039935861975982534425n", "48152237244885228239450679938n", "621157026389301132n", "23051036183574002962556684690n", "15971796984547909136099208821n", "2205567601778656458n", "26382181900386119773631359523n", "77486525780604152291567730894n", "3344785235831598130n", "40994902602684141065596542528n", "58124151025072872977666932193n", "1866769646811958428n", "13188769330477055787925877048n", "72682189451050217677569494954n", "1454880931779552660n", "33634144479293043106522767128n", "63196693658172041397923530081n", "1719120090000942363n", "11106335219605429034116541445n", "59150880447111322507257453443n", "1982729467772378638n", "24990080775267144618286017329n", "4933890943319210884773036028n", "3238771988114708503n", "72949239866424524529472552202n", "28511064168198009294661488723n", "2962023653742267897n", "58656766073983020247853921869n", "47635718491612423608063190516n", "3000234376036375986n", "24238047790212470654844439662n", "23154937283069080880032452049n", "2013625456869347404n", "14825246893209210042587190789n", "52825936212514509264761514892n", "993721473581556871n", "8713904335226753185274037022n", "58909703948513917292703719505n", "3356613834808478835n", "47783414808532480730935012208n", "71833517958023857391706253943n", "2135080825574499771n", "884520208662549368825880483n", "66815068005909338250309574561n", "140309291176602342n", "5569450875351413209302619112n", "29224003387999671040246207661n", "1610924941533931901n", "51360380732923628237942915208n", "49075415090226283505119870909n", "824496444682252362n", "26136012194887577513976704588n", "25203540858598899941257080851n", "1411280372175925570n", "68280069972262928193338796048n", "26491256896653383849815404924n", "2469762357772618827n", "73734748267187905353062326737n", "68913774706780990255684794379n", "53485910764302128n", "77777156063573625138168997381n", "64557037666602761347172706735n", "1996255398685960466n", "28464530722569754157139260154n", "22979110781613272893921919353n", "1105566566131594780n", "28039439084355019144555806027n", "16299329550217317018880117262n", "2401400792301565600n", "62631950163514864539620020206n", "64031511810008173001111779669n", "135723323566704095n", "56130238209974371238192421387n", "71300385211683773671558874832n", "2820109121346955706n", "1266050722527037359608467989n", "23369565459382988863634254407n", "2609151292716742371n", "46069724971530567254818701644n", "50647992693491661816900039583n", "3003365004111477246n", "14833086786816707962865094508n", "37929390713358467376261350799n", "3113860565507891619n", "14007914765299785142256461365n", "75894388353326085571138234483n", "1683683923201420873n", "63454168155478046454844432701n", "13184396719317261321865011420n", "3455798177318665792n", "15242605704632094686138955952n", "19838168147461161870148387345n", "2010616752800746021n", "30692509923364661764582557691n", "62096107423559910046379351905n", "1346903255621101256n", "34464243166874822079393179146n", "63846438778551544175642767034n", "1138380012879476837n", "74737710169640323515477410562n", "6284356348145608854716748036n", "180980529294338977n", "38461808257846861933076217288n", "75020453906990644280477544720n", "307346157687553567n", "42941917981619284749284256464n", "29124361387770891246090195521n", "2258523094183111792n", "31043177647483836512207577733n", "76846872956655992019312504229n", "2737531135418987922n", "436136989124112448213257527n", "37270775937015261263489085940n", "1691548620283188254n", "34350139485051631072038425243n", "47842925193965716748069619330n", "3012190802049531932n", "8161319477063961893865419497n", "39887640444908598647019011892n", "326805514938122984n", "45251026371225474798165551670n", "78712165100775809310221458014n", "1747908356221952635n", "74097152003535814545675921337n", "48494072556502793463457269862n", "538895690676303310n", "54295451611850750079844956272n", "26534574033318342223582372449n", "3044215930961181551n", "75837108057982626126393125222n", "52432746192616266658163099498n", "3397076867009838686n", "54465116802539051194037403225n", "19480966575390018045669641671n", "1874912131754984363n", "62538117008905102096704754568n", "49778263788224308775212049920n", "635641138655366122n", "1000125186700770733728208856n", "72272342271481440271970417215n", "126669907718514487n", "32850606983744341262159941170n", "34502523802539415215826357899n", "335651800228572498n", "74891229697299665485048117886n", "7923057032410301273894282773n", "2078488636177744832n", "65834931437626611160851671144n", "47253521926346692275217471181n", "1450467026022714805n", "79218551078854046456367160410n", "70762120870550042138883949317n", "2886881633871743501n", "34749927009400659485527823456n", "74230186035227802214714540722n", "91514308691397285n", "23895248556901354081433241434n", "16615401776547671346915841714n", "3136707560354543978n", "21834987311199156124647763244n", "70345068331037455105782146634n", "3216348569578182800n", "14552026033494402774981149080n", "46810169065384954077118190274n", "1911480149318741295n", "30149592931357591699950156644n", "14166482924045038689605819053n", "2327000634007357378n", "38247650175016523126038806200n", "57691234003597921786155373117n", "859973345968241198n", "71714837789763600565992214961n", "73412375228179646879012079459n", "1974246974270865632n", "52446930245349056255719340345n", "970285520444299081223312008n", "1628797543941019300n", "50919498183802806944452291286n", "37490783833480294299979274400n", "2991807516764641990n", "32377691154331801475818794360n", "39750977600721907402675106371n", "2263832844069227231n", "17627606237803241511589218465n", "3828538907962341287451709925n", "1651077712155795619n", "65746494371320988039239195368n", "40429923959132850189737190904n", "1761591307449813117n", "62030904653045818611809336637n", "31416196507873606617755041492n", "1626933121429044990n", "56278396859095728868031718464n", "40673401721781629455927974763n", "816921835574909421n", "41466998290124345097221160853n", "77602619970761915549134486486n", "2270380655319303423n", "37278580144182814004827303266n", "22631466550317400025567159166n", "1256554869446519681n", "44512857141401466618198683938n", "75645231533450873900978589761n", "2839895442152180859n", "31711543132209616307103122831n", "78955556053482715721582593706n", "626995298916699271n", "50496746606014163961365206592n", "62746915431247250243776212132n", "2682171950447987392n", "8649064541355918845604157106n", "3642459701627177804195047993n", "304942239933523054n", "52349349447437650280979204973n", "38235331305898406894352347179n", "574973155769907953n", "35486247734767358887659775332n", "63676560163395574209410974039n", "1346859065344137509n", "42626666034641293807810059734n", "78692725054674081196434522843n", "2899402626497036759n", "4466386979191688634974299793n", "73590084746022202502283403859n", "859759454707498102n", "49530047850904057997975767021157383838285524079350821991880424926644689941n", "12n", "73833755054290735615493473493n", "59827914949558952876927624612n", "1842769298355464193n", "0n", "31709724516548461033720090826n", "30157355094312078251107514164n", "2598882554441689462n", "0n", "340282366920938463467229529119593204504n", "2783209552014905048n", "340282366920938463475639663367112901035n", "340282366920938463466510485605024151680n" ] Output of encryptToDrandRoundAndGetCallData: 50 elements ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-webpack/scrape.cjs ================================================ const puppeteer = require('puppeteer'); async function loadWebContent(url) { const browser = await puppeteer.launch({ args: ['--no-sandbox'] }); const page = await browser.newPage(); await page.goto(url); await page.waitForSelector('body pre', { visible: true, timeout: 90000 }); const content = await page.evaluate(() => document.querySelector('body pre').innerHTML); await browser.close(); return content; } async function scrape() { const content = await loadWebContent('http://localhost:8080'); console.log(content); } scrape() .then(() => process.exit(0)) .catch((e) => process.exit((console.error(e), 1))); ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-webpack/src/bootstrap.js ================================================ // A dependency graph that contains any wasm must all be imported // asynchronously. This `bootstrap.js` file does the single async import, so // that no one else needs to worry about it again. import('./index.js') .catch((e) => console.error('Error importing "index.js":', e)); ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-webpack/src/examples.js ================================================ import * as garaga from 'garaga'; export const proofBn254 = { a: { x: 19326975765597999023026309242851464618295625967876195641207265702903971944714n, y: 63835113064883221423828958902442994957834669122245713027012799265225733314n, curveId: garaga.CurveId.BN254 }, b: { x: [ 15926258242285065430281020483827261910589109953358642697562602626998569607754n, 15482775443177023962384497625528997151098293635727021527127534892096530509952n ], y: [ 10937776115245591292644949547008094885240742374542777857501160790374675834371n, 6691169928456984700056024515478772626466687376966760922939239504103847739755n ], curveId: garaga.CurveId.BN254 }, c: { x: 18548825552947889373136407684636046437705490810597995577018381312170231914454n, y: 9890815383090898074006770716054740281870916546141552254207684185588486179606n, curveId: garaga.CurveId.BN254 }, publicInputs: [ BigInt('0x1e17db88c1d2e83e49f692cce4bb8169309de90afb2b141156243106aa34b474') ] } export const vkBn254 = { alpha: { x: 6763126530687886999315782887200758703366235230289874831627658839515656330867n, y: 12297948670392550312636836114470404429657568989657927437959695771502446445179n, curveId: garaga.CurveId.BN254 }, beta: { x: [ 15362786867599176251482538547160991918100063526460909721657878971551583339657n, 3804423004921008809819632629079723167970572551072432396497601916259815496626n ], y: [ 21885719103633717693283841528133243510750001708857084897139570082577218850374n, 2076817281717432063622727433912740683541778328445173073030513609350245776784n ], curveId: garaga.CurveId.BN254 }, gamma: { x: [ 1505558511994093266228972967760414664043255115544025409518939393775943607863n, 21131173266568468249589649137903719095480044620502529067534622738225157042304n ], y: [ 4008759115482693545406793535591568078300615151288108694080317738431649117177n, 18835856718271757625037377080288624550370480296914695806777038708085497610013n ], curveId: garaga.CurveId.BN254 }, delta: { x: [ 1497911744463986566314308077983046202449361313910668647770797503379177516252n, 10829154948357654897792444316512827659620136273388886760324770466776134105520n ], y: [ 10850392992008761830625471778404650447428083833210258292805429019728339148884n, 12593805385728178657844996215584371401133999503150901444097670307277076679963n ], curveId: garaga.CurveId.BN254 }, ic: [ { x: 8279781786940010385190155571855963988492685408361021424114669994156938727612n, y: 14410809027374663415870055712464930833085570569392210261413081131467855918386n, curveId: garaga.CurveId.BN254 }, { x: 10075286447651977124250383403562829564641026794366918560412684031493085120161n, y: 13393494704849149158598989372790154670517815409968589728896053397011959461594n, curveId: garaga.CurveId.BN254 } ] } ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-webpack/src/index.js ================================================ import * as garaga from 'garaga'; import { proofBn254, vkBn254 } from './examples'; async function main() { await garaga.init(); const result = garaga.msmCalldataBuilder([[1n, 2n]], [10n], garaga.CurveId.BN254); const json = JSON.stringify(result, (key, value) => typeof value === 'bigint' ? value + 'n' : value, 2); const message = 'Output of msm_calldata_builder: ' + json; const element = document.createElement('pre'); element.textContent = message; const groth16Calldata = garaga.getGroth16CallData(proofBn254, vkBn254,garaga.CurveId.BN254); const jsonCalldata = JSON.stringify(groth16Calldata, (key, value) => typeof value === 'bigint' ? value + 'n' : value, 2); const messageCalldata = 'Output of get_groth16_calldata: ' + jsonCalldata; element.textContent += "\n" + messageCalldata; // Tlock encrypt const message2 = new Uint8Array(16); message2.set(new TextEncoder().encode('Hello, world!')); const randomness = new Uint8Array(16); randomness.set(new TextEncoder().encode('fixed_random_val')); const tlockCalldata = garaga.encryptToDrandRoundAndGetCallData(1, message2, randomness); element.textContent += "\n" + 'Output of encryptToDrandRoundAndGetCallData: ' + tlockCalldata.length + ' elements'; document.body.appendChild(element); } main() .catch(console.error); ================================================ FILE: tools/npm/integration-test-suite/packages/web-js-esm-webpack/webpack.config.js ================================================ const path = require('path'); const CopyPlugin = require('copy-webpack-plugin'); module.exports = { entry: './src/bootstrap.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bootstrap.js', }, mode: 'production', resolve: { fallback: { "crypto": require.resolve("crypto-browserify"), "stream": require.resolve("stream-browserify"), "vm": require.resolve("vm-browserify"), "fs": false } }, performance: { maxAssetSize: 4 * 1024 * 1024, // 4MB to avoid warning }, plugins: [ new CopyPlugin({ patterns: ['./public/index.html'] }), ], }; ================================================ FILE: tools/process_manager.py ================================================ import os import signal import subprocess import threading from contextlib import contextmanager from typing import List class ProcessManager: """Smart process manager with interrupt handling and cleanup.""" def __init__(self): self.processes: List[subprocess.Popen] = [] self.shutdown_event = threading.Event() self.original_signal_handler = None self.main_process_group = None self.is_main_thread = threading.current_thread() is threading.main_thread() def __enter__(self): # Store the main process group (don't change it) self.main_process_group = os.getpgrp() # Only install signal handler in main thread if self.is_main_thread: try: self.original_signal_handler = signal.signal( signal.SIGINT, self._signal_handler ) except ValueError: # Signal operations not supported in this context, continue without signal handling self.is_main_thread = False return self def __exit__(self, exc_type, exc_val, exc_tb): self.cleanup() def _signal_handler(self, signum, frame): """Enhanced signal handler that kills all processes.""" from rich.console import Console console = Console() console.print( "\n🛑 [bold red]Interrupt received - terminating all processes[/bold red]" ) self.shutdown_event.set() self.cleanup() # Re-raise KeyboardInterrupt to properly exit raise KeyboardInterrupt("Process terminated by user") def cleanup(self): """Kill all tracked processes (but not the main process group).""" # Kill individual tracked processes more aggressively for proc in self.processes: try: if proc.poll() is None: # Still running proc.terminate() try: proc.wait(timeout=0.5) # Reduced timeout except subprocess.TimeoutExpired: proc.kill() try: proc.wait(timeout=0.5) # Reduced timeout for kill except subprocess.TimeoutExpired: pass # Process is stuck, move on except Exception: try: proc.kill() except Exception: pass # Clear the process list self.processes.clear() # Restore original handler only if we set it up in main thread if self.is_main_thread and self.original_signal_handler: try: signal.signal(signal.SIGINT, self.original_signal_handler) except ValueError: # Signal operations not supported, ignore pass def run_subprocess( self, cmd: List[str], timeout: int = 900, check: bool = False, capture_output: bool = False, text: bool = False, **kwargs, ) -> subprocess.CompletedProcess: """Run subprocess with timeout and interrupt handling.""" if self.shutdown_event.is_set(): raise KeyboardInterrupt("Shutdown requested") # Handle capture_output parameter (convert to stdout/stderr settings) if capture_output: if "stdout" in kwargs or "stderr" in kwargs: raise ValueError( "capture_output cannot be used with stdout or stderr arguments" ) kwargs["stdout"] = subprocess.PIPE kwargs["stderr"] = subprocess.PIPE # Handle text parameter if text: kwargs["text"] = True # Only set up process groups on Unix-like systems and when not already specified import sys if sys.platform != "win32" and "preexec_fn" not in kwargs: try: kwargs["start_new_session"] = True except Exception: # If start_new_session fails, don't use it pass proc = subprocess.Popen(cmd, **kwargs) self.processes.append(proc) try: stdout, stderr = proc.communicate(timeout=timeout) completed_process = subprocess.CompletedProcess( cmd, proc.returncode, stdout, stderr ) # Handle 'check' parameter like subprocess.run if check and proc.returncode != 0: raise subprocess.CalledProcessError( proc.returncode, cmd, stdout, stderr ) return completed_process except subprocess.TimeoutExpired: proc.kill() proc.wait() # Clean up zombie raise except KeyboardInterrupt: proc.kill() proc.wait() # Clean up zombie raise finally: # Remove from tracking list when done if proc in self.processes: self.processes.remove(proc) @contextmanager def managed_subprocess(): """Context manager for subprocess calls with interrupt handling.""" with ProcessManager() as pm: def run_cmd(cmd, **kwargs): return pm.run_subprocess(cmd, **kwargs) yield run_cmd, pm ================================================ FILE: tools/profile_tests.py ================================================ #!/usr/bin/env python3 """ Garaga Test Profiling Tool This script automates the process of running snforge tests with trace data collection, generating individual profile data using cairo-profiler, creating performance visualizations using pprof, and organizing the results. Usage: python tools/profile_tests.py [test_name_filter] python tools/profile_tests.py --all Examples: python tools/profile_tests.py msm_BN254_1P # Run specific test python tools/profile_tests.py --all # Run all tests python tools/profile_tests.py # Run all tests (same as --all) """ import argparse import json import os import re import subprocess import sys from abc import ABC, abstractmethod from collections import defaultdict from concurrent.futures import ThreadPoolExecutor from dataclasses import dataclass, field from datetime import datetime from functools import wraps from pathlib import Path from typing import Dict, List, Optional, Tuple import pandas as pd from rich.align import Align from rich.console import Console from rich.panel import Panel from rich.progress import ( BarColumn, Progress, SpinnerColumn, TaskProgressColumn, TextColumn, TimeElapsedColumn, TimeRemainingColumn, ) from rich.text import Text from tabulate import tabulate from tools.process_manager import ProcessManager, managed_subprocess # Global state console = Console() # Configuration & Constants @dataclass class Config: """Consolidated configuration for the profiling tool.""" contracts: List[str] = field( default_factory=lambda: [ "autogenerated/groth16_example_bn254", "autogenerated/groth16_example_bls12_381", "autogenerated/risc0_verifier_bn254", "autogenerated/sp1_verifier_bn254", "autogenerated/noir_ultra_keccak_honk_example", "autogenerated/noir_ultra_keccak_zk_honk_example", "autogenerated/noir_ultra_starknet_honk_example", "autogenerated/noir_ultra_starknet_zk_honk_example", ] ) excluded_profile_samples: set = field( default_factory=lambda: {"memory holes", "casm size", "calls"} ) sierra_gas_weights: Dict[str, int] = field( default_factory=lambda: { "steps": 100, "range_check": 70, "range_check96": 56, "keccak": 136189, "pedersen": 4050, "bitwise": 583, "ecop": 4085, "poseidon": 491, "add_mod": 230, "mul_mod": 604, } ) @dataclass class Paths: """Path management with validation.""" workspace_root: Path def __post_init__(self): self.src_dir = self.workspace_root / "src" self.trace_dir = self.src_dir / "snfoundry_trace" self.docs_benchmarks = self.workspace_root / "docs" / "benchmarks" self.readme = self.workspace_root / "README.md" def ensure_dirs(self): """Ensure necessary directories exist.""" self.docs_benchmarks.mkdir(parents=True, exist_ok=True) # Logging & UI class Logger: """Centralized logging with decorators and context management.""" STYLES = { "info": ("ℹ️", "[dim]{message}[/dim]"), "success": ("✅", "[green]{message}[/green]"), "warning": ("⚠️", "[yellow]{message}[/yellow]"), "error": ("❌", "[bold red]{message}[/bold red]"), "debug": ("🔍", "[dim cyan]{message}[/dim cyan]"), } @staticmethod def log(message: str, level: str = "info", emoji: str = None): """Consolidated logging function.""" if level == "debug" and not console.is_terminal: return emoji_char, style_template = Logger.STYLES.get(level, Logger.STYLES["info"]) if emoji: emoji_char = emoji formatted_message = style_template.format(message=message) console.print(f"{emoji_char} {formatted_message}") @staticmethod def header(title: str): """Print formatted header.""" console.print( Panel( Align.center(Text(title, style="bold cyan")), border_style="cyan", padding=(0, 1), width=80, ) ) @staticmethod def exit_panel(message: str, status: str, border_style: str = "green"): """Show standardized exit panel.""" console.print( Panel( Align.center(message), border_style=border_style, title=f"[{border_style}]{status}[/{border_style}]", ) ) def handle_errors(func): """Decorator for centralized error handling - only for non-critical functions.""" @wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: Logger.log(f"Error in {func.__name__}: {e}", level="error") return False return wrapper def fail_on_error(func): """Decorator that prints errors and exits immediately.""" @wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: import traceback Logger.log(f"FATAL ERROR in {func.__name__}: {e}", level="error") Logger.log(f"Full traceback:\n{traceback.format_exc()}", level="error") Logger.exit_panel(f"💥 Fatal error in {func.__name__}: {e}", "Error", "red") sys.exit(1) return wrapper def log_step(description: str): """Decorator for logging method execution steps.""" def decorator(func): @wraps(func) def wrapper(*args, **kwargs): Logger.log(f"Starting: {description}", level="info") result = func(*args, **kwargs) Logger.log(f"Completed: {description}", level="success") return result return wrapper return decorator class UIBuilder: """Builder for console UI elements.""" @staticmethod def progress(advanced: bool = False) -> Progress: """Create progress bar.""" base_elements = [ SpinnerColumn(), TextColumn("[progress.description]{task.description}"), ] if advanced: return Progress( *base_elements, BarColumn(bar_width=40, style="cyan", complete_style="green"), "[progress.percentage]{task.percentage:>3.0f}%", "•", TextColumn("({task.completed}/{task.total} files)"), "•", TimeElapsedColumn(), "•", TimeRemainingColumn(), console=console, transient=False, ) return Progress( *base_elements, BarColumn(bar_width=30, style="cyan", complete_style="green"), TaskProgressColumn(), "•", TimeElapsedColumn(), "•", TimeRemainingColumn(), console=console, transient=False, ) # Enhanced TestResourceInfo @dataclass class TestResourceInfo: """Container for test resource information with enhanced methods.""" test_name_hierarchical: str test_name_simple: str steps: int builtins: dict = field(default_factory=dict) image_path: str = "" category: str = "garaga" sierra_gas: int = field(init=False) def __post_init__(self): self.sierra_gas = self._calculate_sierra_gas() if self.category == "garaga" and "::" in self.test_name_hierarchical: if not self.test_name_hierarchical.startswith("garaga::"): self.category = "contracts" @classmethod def from_trace_file( cls, test_name: str, trace_path: Path, profile_path: Path, resources: dict, image_path: str = "", ): """Create instance from trace file data.""" steps = resources.get("steps", 0) builtins = {k: v for k, v in resources.items() if k != "steps"} test_name_simple = test_name.split("::")[-1] return cls( test_name_hierarchical=test_name, test_name_simple=test_name_simple, steps=steps, builtins=builtins, image_path=image_path, category="contracts" if not test_name.startswith("garaga::") else "garaga", ) @staticmethod def predict_trace_path(test_name: str, base_dir: Path) -> Path: """Predict trace file path from hierarchical test name.""" return base_dir / f"{test_name.replace('::', '_')}.json" @staticmethod def extract_hierarchy_parts(test_name: str) -> List[str]: """Extract module hierarchy parts.""" parts = test_name.split("::") if parts and parts[-1].startswith("test_"): parts = parts[:-1] if parts and parts[0] == "garaga": parts = parts[1:] return parts if parts else ["tests"] def _calculate_sierra_gas(self) -> int: """Calculate Sierra gas using weight table.""" config = Config() total = self.steps * config.sierra_gas_weights["steps"] for builtin, count in self.builtins.items(): if builtin in config.sierra_gas_weights: total += count * config.sierra_gas_weights[builtin] return total def to_benchmark_row(self) -> dict: """Convert to benchmark row format.""" result = { "test_name_hierarchical": self.test_name_hierarchical, "test_name": self.test_name_simple, "steps": self.steps, "sierra_gas": self.sierra_gas, "image_path": self.image_path, "category": self.category, } # Add builtin columns config = Config() for builtin in config.sierra_gas_weights.keys(): if builtin != "steps": result[builtin] = self.builtins.get(builtin, 0) return result # Data Processing class JsonManager: """Utility class for JSON operations with context management.""" @staticmethod @handle_errors def read(file_path: Path, default=None): """Read JSON file with error handling.""" if not file_path.exists(): return default if default is not None else {} with open(file_path, "r") as f: return json.load(f) @staticmethod @handle_errors def write(file_path: Path, data, indent: int = 2) -> bool: """Write JSON file with error handling.""" with open(file_path, "w") as f: json.dump(data, f, indent=indent) return True class TraceProcessor: """Strategy for processing trace files.""" def __init__(self, config: Config): self.config = config self.sample_mapping = { "steps": "steps", "range check builtin": "range_check", "range check96 builtin": "range_check96", "keccak builtin": "keccak", "pedersen builtin": "pedersen", "bitwise builtin": "bitwise", "ecop builtin": "ecop", "poseidon builtin": "poseidon", "add mod builtin": "add_mod", "mul mod builtin": "mul_mod", } def process( self, test_name: str, trace_path: Path ) -> Tuple[bool, str, str, Optional[TestResourceInfo]]: """Process a single trace file.""" try: with managed_subprocess() as (run_cmd, pm): profile_file = self._generate_profile(trace_path, run_cmd) if not profile_file or not profile_file.exists(): Logger.log( f"Profile file not generated for {test_name}: {trace_path}", level="warning", ) return False, test_name, "", None resources = self._extract_resources(profile_file, run_cmd) test_name_simple = test_name.split("::")[-1] docs_image_path = ( Paths(Path.cwd()).docs_benchmarks / f"{test_name_simple}.png" ) image_success = self._generate_image( profile_file, docs_image_path, run_cmd ) test_info = TestResourceInfo.from_trace_file( test_name, trace_path, profile_file, resources, f"docs/benchmarks/{test_name_simple}.png", ) return image_success, test_name, test_info.image_path, test_info except Exception as e: import traceback # Re-raise with more context including full traceback full_tb = traceback.format_exc() raise Exception( f"Failed to process {test_name}:\nTrace path: {trace_path}\nError: {str(e)}\nTraceback:\n{full_tb}" ) from e def _generate_profile(self, trace_file: Path, run_cmd) -> Optional[Path]: """Generate profile from trace file.""" profile_file = trace_file.parent / f"{trace_file.stem}.pb.gz" cmd = [ "cairo-profiler", "build-profile", str(trace_file), "--output-path", str(profile_file), ] result = run_cmd( cmd, check=False, # Don't raise, we'll handle the error ourselves capture_output=True, text=True, ) if result.returncode != 0: error_msg = f"cairo-profiler build-profile failed:\nCommand: {' '.join(cmd)}\nReturn code: {result.returncode}" if result.stdout: error_msg += f"\nSTDOUT:\n{result.stdout}" if result.stderr: error_msg += f"\nSTDERR:\n{result.stderr}" raise Exception(error_msg) return profile_file def _extract_resources(self, profile_file: Path, run_cmd) -> dict: """Extract resources from profile file.""" cmd = ["cairo-profiler", "view", str(profile_file), "--list-samples"] result = run_cmd( cmd, check=False, # Don't raise, we'll handle the error ourselves capture_output=True, text=True, ) if result.returncode != 0: error_msg = f"cairo-profiler view --list-samples failed:\nCommand: {' '.join(cmd)}\nReturn code: {result.returncode}" if result.stdout: error_msg += f"\nSTDOUT:\n{result.stdout}" if result.stderr: error_msg += f"\nSTDERR:\n{result.stderr}" raise Exception(error_msg) samples = [ line.strip() for line in result.stdout.strip().split("\n") if line.strip() and line.strip() not in self.config.excluded_profile_samples ] resources = {} for sample in samples: try: sample_result = run_cmd( ["cairo-profiler", "view", str(profile_file), "--sample", sample], check=True, capture_output=True, text=True, ) # Updated regex to handle the new cairo-profiler output format # Example: "Showing nodes accounting for 11582 steps, 94.63% of 12239 steps total" pattern = rf"(\d+) {re.escape(sample)} total" match = re.search(pattern, sample_result.stdout, re.IGNORECASE) if match: count = int(match.group(1)) normalized = self.sample_mapping.get(sample.lower().strip()) if normalized: resources[normalized] = count except subprocess.CalledProcessError as e: # Log individual sample errors but continue Logger.log(f"Failed to extract sample '{sample}': {e}", level="warning") continue return resources def _generate_image(self, profile_file: Path, output_path: Path, run_cmd) -> bool: """Generate PNG image using pprof.""" cmd = [ "go", "tool", "pprof", "-png", "-sample_index=steps", "-output", str(output_path), str(profile_file), ] result = run_cmd( cmd, check=False, # Don't raise, we'll handle the error ourselves capture_output=True, text=True, ) if result.returncode != 0: error_msg = f"pprof failed:\nCommand: {' '.join(cmd)}\nReturn code: {result.returncode}" if result.stdout: error_msg += f"\nSTDOUT:\n{result.stdout}" if result.stderr: error_msg += f"\nSTDERR:\n{result.stderr}" raise Exception(error_msg) return True # Command Pattern Implementation class Command(ABC): """Abstract base class for commands.""" @abstractmethod def execute(self) -> bool: """Execute the command.""" @abstractmethod def can_execute(self) -> bool: """Check if command can be executed.""" class CheckDependenciesCommand(Command): """Command to check tool dependencies.""" def __init__(self, config: Config): self.config = config self.tools = [ ("snforge", "Starknet Foundry", ["snforge", "--version"]), ("cairo-profiler", "cairo-profiler", ["cairo-profiler", "--version"]), ("go", "Go to use pprof", ["go", "version"]), ] @log_step("Checking Dependencies") @handle_errors def execute(self) -> bool: Logger.header("🔍 Checking Dependencies") with managed_subprocess() as (run_cmd, pm): for tool, desc, cmd in self.tools: try: result = run_cmd(cmd, check=True, capture_output=True, text=True) Logger.log(f"{tool}: {result.stdout.strip()}", level="success") except subprocess.CalledProcessError: Logger.log( f"{tool} not found. Please install {desc}.", level="error" ) return False Logger.log("All dependencies satisfied!", level="success") return True def can_execute(self) -> bool: return True class RunTestsCommand(Command): """Command to run tests with trace collection.""" def __init__(self, paths: Paths, test_filter: Optional[str] = None): self.paths = paths self.test_filter = test_filter self.passed_tests = [] @log_step("Running Tests & Collecting Traces") @handle_errors def execute(self) -> bool: Logger.header("🧪 Running Tests & Collecting Traces") original_cwd = os.getcwd() cmd = ["snforge", "test"] if self.test_filter: cmd.append(self.test_filter) cmd.append("--save-trace-data") test_dirs = [self.paths.src_dir] + self._get_contract_paths() success_count = 0 with managed_subprocess() as (run_cmd, pm): with UIBuilder.progress() as progress: # Create a single task outside the loop base_desc = ( f"Running tests matching: {self.test_filter}" if self.test_filter else "Running all tests" ) task = progress.add_task(base_desc, total=len(test_dirs)) for i, test_dir in enumerate(test_dirs): # Update the description for the current directory current_desc = f"{base_desc} from {test_dir.relative_to(self.paths.workspace_root)}" progress.update(task, description=current_desc) if not test_dir.exists() or not (test_dir / "Scarb.toml").exists(): Logger.log( f"Skipping {test_dir}: directory or Scarb.toml not found", level="debug", ) continue os.chdir(test_dir) Logger.log( f"Running command: {' '.join(cmd)} in {test_dir}", level="debug" ) result = run_cmd(cmd, capture_output=True, text=True) if result.returncode == 0: success_count += 1 passed = re.findall( r"\[PASS\]\s+([^\s]+)\s+\(l1_gas:", result.stdout ) self.passed_tests.extend(passed) Logger.log( f"Found {len(passed)} passed tests in {test_dir.name}", level="debug", ) else: error_details = [] error_details.append(f"Directory: {test_dir}") error_details.append(f"Command: {' '.join(cmd)}") error_details.append(f"Return code: {result.returncode}") if result.stdout: error_details.append(f"STDOUT:\n{result.stdout}") if result.stderr: error_details.append(f"STDERR:\n{result.stderr}") full_error = "\n".join(error_details) raise Exception(f"Failed to run tests:\n{full_error}") # Advance the progress by 1 for each directory processed progress.advance(task, 1) os.chdir(original_cwd) if success_count > 0: Logger.log(f"Found {len(self.passed_tests)} passed tests", level="success") return True else: Logger.log("No tests executed successfully", level="error") return False def can_execute(self) -> bool: return self.paths.src_dir.exists() def _get_contract_paths(self) -> List[Path]: """Get contract paths from config.""" config = Config() return [ self.paths.workspace_root / "src" / "contracts" / contract for contract in config.contracts ] class ProcessTracesCommand(Command): """Command to process trace files and generate profiles.""" def __init__(self, paths: Paths, passed_tests: List[str], parallel_jobs: int = 4): self.paths = paths self.passed_tests = passed_tests self.parallel_jobs = parallel_jobs self.test_resources = [] @log_step("Processing Traces & Extracting Resources") def execute(self) -> bool: if not self.passed_tests: Logger.log("No passed tests to process", level="warning") return False Logger.header( f"🚀 Processing {len(self.passed_tests)} tests with {self.parallel_jobs} parallel jobs" ) trace_files = self._find_trace_files() if not trace_files: Logger.log("No trace files found", level="warning") return False processor = TraceProcessor(Config()) try: with ( ProcessManager() as pm, ThreadPoolExecutor(max_workers=self.parallel_jobs) as executor, ): futures = { executor.submit(processor.process, test_name, trace_path): test_name for test_name, trace_path, _ in trace_files } success_count = self._process_futures_interruptible(futures, pm) if self.test_resources: self._update_summary() Logger.log( f"Successfully processed {success_count}/{len(trace_files)} tests", level="success", ) return success_count > 0 except KeyboardInterrupt: Logger.log("Processing interrupted by user", level="warning") raise def can_execute(self) -> bool: return len(self.passed_tests) > 0 def _find_trace_files(self) -> List[Tuple[str, Path, Path]]: """Find trace files for passed tests.""" found = [] trace_dirs = self._get_trace_directories() for test_name in self.passed_tests: for trace_dir in trace_dirs: if not trace_dir.exists(): continue predicted_path = TestResourceInfo.predict_trace_path( test_name, trace_dir ) if predicted_path.exists(): found.append((test_name, predicted_path, trace_dir.parent)) break return found def _get_trace_directories(self) -> List[Path]: """Get all potential trace directories.""" dirs = [self.paths.trace_dir] config = Config() for contract in config.contracts: dirs.append( self.paths.workspace_root / "src" / "contracts" / contract / "snfoundry_trace" ) return dirs def _process_futures_interruptible(self, futures, pm) -> int: """Process completed futures with progress tracking and interruptibility.""" success_count = 0 with UIBuilder.progress(True) as progress: task = progress.add_task("Processing tests", total=len(futures)) try: for future in futures: if pm.shutdown_event.is_set(): future.cancel() continue try: success, test_name, _, test_info = future.result( timeout=60 * 20 ) # Increased timeout if success and test_info: self.test_resources.append(test_info) console.print(f"✨ [green]{test_name}[/green]") success_count += 1 else: console.print( f"💥 [red]{test_name}[/red]: Processing failed" ) except Exception as e: test_name = futures[future] error_msg = str(e) console.print(f"💥 [red]{test_name}[/red]: {error_msg}") # Print full error details and exit import traceback Logger.log( f"FATAL ERROR processing {test_name}: {error_msg}", level="error", ) Logger.log( f"Full traceback:\n{traceback.format_exc()}", level="error" ) Logger.exit_panel( f"💥 Fatal error processing {test_name}: {error_msg}", "Error", "red", ) sys.exit(1) progress.advance(task, 1) except KeyboardInterrupt: # Cancel all remaining futures immediately for future in futures: future.cancel() # Re-raise to propagate the interrupt raise return success_count def _update_summary(self): """Update global summary JSON.""" summary_file = self.paths.docs_benchmarks / "test_summary.json" summary_data = JsonManager.read(summary_file, {}) timestamp_iso = datetime.now().isoformat() for test_info in self.test_resources: summary_data[test_info.test_name_simple] = { "last_updated": timestamp_iso, "latest_metrics": test_info.to_benchmark_row(), } if JsonManager.write(summary_file, summary_data): Logger.log("Performance data saved", level="success") class GenerateBenchmarksCommand(Command): """Command to generate Cairo benchmarks.""" def __init__(self, paths: Paths): self.paths = paths @log_step("Generating Cairo Benchmarks") def execute(self) -> bool: Logger.log("Generating Cairo benchmarks...", level="info") summary_file = self.paths.docs_benchmarks / "test_summary.json" test_data = JsonManager.read(summary_file, {}) if not test_data: Logger.log("No test data available", level="warning") return False success = self._update_readme(test_data) if success: Logger.log( f"Generated benchmarks for {len(test_data)} tests", level="success" ) return success def can_execute(self) -> bool: return self.paths.readme.exists() @handle_errors def _update_readme(self, test_data: dict) -> bool: """Update README with benchmarks.""" with open(self.paths.readme, "r", encoding="utf-8") as f: content = f.read() start_idx, end_idx = self._find_benchmarks_section(content) lines = content.split("\n") new_content = self._generate_benchmarks_content(test_data) new_lines = new_content.rstrip().split("\n") if start_idx is not None: if end_idx < len(lines) and lines[end_idx - 1].strip() == "": updated_lines = lines[:start_idx] + new_lines + lines[end_idx:] else: updated_lines = lines[:start_idx] + new_lines + [""] + lines[end_idx:] else: support_idx = next( ( i for i, line in enumerate(lines) if "Support & How to Contribute" in line ), None, ) if support_idx: updated_lines = ( lines[:support_idx] + new_lines + [""] + lines[support_idx:] ) else: updated_lines = lines + [""] + new_lines with open(self.paths.readme, "w", encoding="utf-8") as f: f.write("\n".join(updated_lines)) Logger.log("Updated README.md with benchmarks", level="success") return True def _find_benchmarks_section( self, content: str ) -> Tuple[Optional[int], Optional[int]]: """Find Cairo Benchmarks section.""" lines = content.split("\n") start_idx = end_idx = None for i, line in enumerate(lines): if line.strip() == "## Cairo Benchmarks": start_idx = i elif ( start_idx is not None and line.startswith("## ") and line.strip() != "## Cairo Benchmarks" ): end_idx = i break if start_idx is not None and end_idx is None: end_idx = len(lines) return start_idx, end_idx def _generate_benchmarks_content(self, test_data: dict) -> str: """Generate complete benchmarks content.""" if not test_data: return "## Cairo Benchmarks\n\n*No benchmark data available.*\n\n" report_builder = ReportBuilder(test_data) content = report_builder.build() return f"""## Cairo Benchmarks 📊 **Click on any section below to expand and view detailed benchmark tables with test performance metrics.** **Note:** Click on the test name to view the profiling image. Resources shown in the table for contracts include extra costs due to the foundry logic. Check the profile file for more details. {content.rstrip()} --- 🔄 **To regenerate these benchmarks:** Run `make profile-test` from the project root. """ # Report Generation with Builder Pattern class ReportBuilder: """Builder for generating benchmark reports with fluent interface.""" def __init__(self, test_data: dict): self.test_data = test_data self.grouped_data = None def build(self) -> str: """Build the final report.""" if not self.grouped_data: self._group_by_module() return self._generate_nested_hierarchy(self.grouped_data) def _group_by_module(self): """Group tests by module hierarchy.""" main_grouped = { "garaga": defaultdict(lambda: defaultdict(list)), "contracts": defaultdict(lambda: defaultdict(list)), } for test_name, test_info in self.test_data.items(): latest_metrics = test_info.get("latest_metrics", {}) if not latest_metrics: continue hierarchical_name = latest_metrics.get("test_name_hierarchical", "") category = latest_metrics.get("category", "garaga") hierarchy_parts = TestResourceInfo.extract_hierarchy_parts( hierarchical_name ) current = main_grouped[category] for module in hierarchy_parts[:-1]: if module not in current: current[module] = defaultdict(list) current = current[module] final_module = hierarchy_parts[-1] if hierarchy_parts else "tests" if not isinstance(current[final_module], list): current[final_module] = [] current[final_module].append(latest_metrics) self.grouped_data = {k: dict(v) for k, v in main_grouped.items() if v} def _generate_nested_hierarchy( self, grouped_data: dict, current_path: List[str] = None ) -> str: """Generate nested collapsible hierarchy.""" if current_path is None: current_path = [] content = "" # Sort sections alphabetically by module name for module_name, module_data in sorted(grouped_data.items()): if isinstance(module_data, list): df = self._create_dataframe(module_data) table_content = self._generate_table(df) content += self._collapsible_section( module_name, table_content, False, len(current_path) ) elif isinstance(module_data, dict): merged_name, current_data = self._merge_single_children( module_name, module_data ) if isinstance(current_data, list): df = self._create_dataframe(current_data) table_content = self._generate_table(df) content += self._collapsible_section( merged_name, table_content, False, len(current_path) ) else: inner_content = self._generate_nested_hierarchy( current_data, current_path + [module_name] ) is_open = len(current_path) > 0 content += self._collapsible_section( merged_name, inner_content, is_open, len(current_path) ) return content def _merge_single_children(self, name: str, data: dict) -> Tuple[str, any]: """Merge chains of single children.""" merged_name = name current_data = data while len(current_data) == 1: child_name = list(current_data.keys())[0] child_data = list(current_data.values())[0] if isinstance(child_data, list): merged_name += "::" + child_name return merged_name, child_data elif isinstance(child_data, dict): merged_name += "::" + child_name current_data = child_data else: break return merged_name, current_data def _create_dataframe(self, tests: List[dict]) -> pd.DataFrame: """Create DataFrame from test data.""" if not tests: return pd.DataFrame() columns = [ "test_name", "steps", "range_check", "range_check96", "bitwise", "poseidon", "add_mod", "mul_mod", "keccak", "pedersen", "ecop", "syscalls_count", "sierra_gas", "image_path", ] df = pd.DataFrame(tests) available_columns = [col for col in columns if col in df.columns] df = df[available_columns] # Remove zero columns except essentials essential = ["test_name", "steps", "sierra_gas", "image_path"] for col in df.columns: if col not in essential and (df[col] == 0).all(): df = df.drop(columns=[col]) if "sierra_gas" in df.columns: df = df.sort_values("sierra_gas", ascending=False) return df def _generate_table(self, df: pd.DataFrame) -> str: """Generate markdown table.""" if df.empty: return "*No tests found.*\n" df = df.copy() if "test_name" in df.columns: df["test_name"] = df.apply( lambda row: f"[{row['test_name']}]({row.get('image_path', 'docs/benchmarks/' + row['test_name'] + '.png')})", axis=1, ) # Format numbers numeric_cols = [ "steps", "range_check", "range_check96", "bitwise", "poseidon", "add_mod", "mul_mod", "keccak", "pedersen", "ecop", "syscalls_count", "sierra_gas", ] for col in numeric_cols: if col in df.columns: df[col] = df[col].apply(lambda x: f"{x:,}" if pd.notna(x) else "0") # Rename columns column_mapping = { "test_name": "Test Name", "steps": "Steps", "range_check": "Range Check", "range_check96": "Range Check 96", "bitwise": "Bitwise", "poseidon": "Poseidon", "add_mod": "Add Mod", "mul_mod": "Mul Mod", "keccak": "Keccak", "pedersen": "Pedersen", "ecop": "ECOP", "syscalls_count": "Syscalls", "sierra_gas": "Sierra Gas", } display_df = df.drop(columns=["image_path"], errors="ignore") df_display = display_df.rename(columns=column_mapping) return ( tabulate(df_display, headers="keys", tablefmt="github", showindex=False) + "\n" ) def _collapsible_section( self, title: str, content: str, is_open: bool, indent_level: int ) -> str: """Generate collapsible section.""" open_attr = " open" if is_open else "" if indent_level > 0: base_indent = "│ " * (indent_level - 1) branch = "└── " title = f"{base_indent}{branch}{title}" return f""" {title} {content} """ # Workflow Executor class WorkflowExecutor: """Executes command chains with automatic rollback.""" def __init__(self, config: Config, paths: Paths): self.config = config self.paths = paths self.executed_commands = [] def execute_workflow( self, test_filter: Optional[str] = None, parallel_jobs: int = 2, generate_benchmarks: bool = False, ) -> bool: """Execute the complete workflow.""" try: self.paths.ensure_dirs() commands = [ CheckDependenciesCommand(self.config), RunTestsCommand(self.paths, test_filter), ] for cmd in commands: if not cmd.can_execute(): raise Exception(f"Cannot execute {cmd.__class__.__name__}") if not cmd.execute(): raise Exception(f"Command {cmd.__class__.__name__} failed") self.executed_commands.append(cmd) # Get passed tests from RunTestsCommand run_tests_cmd = next( cmd for cmd in self.executed_commands if isinstance(cmd, RunTestsCommand) ) # Process traces process_cmd = ProcessTracesCommand( self.paths, run_tests_cmd.passed_tests, parallel_jobs ) if not process_cmd.can_execute(): raise Exception("Cannot execute ProcessTracesCommand") if not process_cmd.execute(): raise Exception("ProcessTracesCommand failed") self.executed_commands.append(process_cmd) # Generate benchmarks if requested if generate_benchmarks: benchmark_cmd = GenerateBenchmarksCommand(self.paths) if benchmark_cmd.can_execute(): if not benchmark_cmd.execute(): raise Exception("GenerateBenchmarksCommand failed") Logger.header("🎯 Workflow Complete") Logger.log("Profiling workflow completed successfully!", level="success") return True except KeyboardInterrupt: # Re-raise KeyboardInterrupt to be handled by main() raise except Exception as e: import traceback Logger.log(f"FATAL ERROR in execute_workflow: {e}", level="error") Logger.log(f"Full traceback:\n{traceback.format_exc()}", level="error") Logger.exit_panel( f"💥 Fatal error in execute_workflow: {e}", "Error", "red" ) sys.exit(1) # Simplified Main Function & CLI @dataclass class CLIConfig: """CLI configuration.""" test_filter: Optional[str] = None workspace: Optional[str] = None parallel_jobs: int = 2 generate_benchmarks: bool = False benchmarks_only: bool = False def main(): """Simplified main entry point.""" Logger.header("🐺 Garaga Test Profiler") # Parse arguments parser = argparse.ArgumentParser(description="Run snforge tests with profiling") parser.add_argument("test_filter", nargs="?", help="Test name filter") parser.add_argument("--all", action="store_true", help="Run all tests") parser.add_argument("--workspace", help="Workspace root path") parser.add_argument("--parallel-jobs", type=int, default=2, help="Parallel jobs") parser.add_argument( "--generate-benchmarks", action="store_true", help="Generate benchmarks" ) parser.add_argument( "--benchmarks-only", action="store_true", help="Only generate benchmarks" ) args = parser.parse_args() # Create CLI config cli_config = CLIConfig( test_filter=None if args.all else args.test_filter, workspace=args.workspace, parallel_jobs=max(1, min(8, args.parallel_jobs)), generate_benchmarks=args.generate_benchmarks, benchmarks_only=args.benchmarks_only, ) # Setup paths and config workspace_root = Path(cli_config.workspace or os.getcwd()) paths = Paths(workspace_root) config = Config() # Handle benchmarks-only mode if cli_config.benchmarks_only: Logger.log("Running in benchmarks-only mode", level="info") cmd = GenerateBenchmarksCommand(paths) success = cmd.execute() if cmd.can_execute() else False if success: Logger.exit_panel( "📊 Cairo benchmarks generated successfully!", "Success", "green" ) sys.exit(0) else: Logger.exit_panel("💥 Failed to generate Cairo benchmarks!", "Error", "red") sys.exit(1) # Log configuration if cli_config.test_filter: Logger.log(f"Running tests matching: {cli_config.test_filter}", level="info") else: Logger.log("Running all tests", level="info") Logger.log(f"Using {cli_config.parallel_jobs} parallel jobs", level="info") # Execute workflow executor = WorkflowExecutor(config, paths) try: success = executor.execute_workflow( cli_config.test_filter, cli_config.parallel_jobs, cli_config.generate_benchmarks, ) except KeyboardInterrupt: Logger.exit_panel( "👋 Process interrupted by user\nPartial results may be available", "Interrupted", "yellow", ) sys.exit(130) # Handle results if success: Logger.exit_panel( "🎉 All operations completed successfully!", "Success", "green" ) sys.exit(0) else: Logger.exit_panel("💥 Workflow failed!", "Error", "red") sys.exit(1) if __name__ == "__main__": main()